summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2011-04-08 17:33:11 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2011-04-08 17:33:11 +0000
commit73f643f3f4a55310b2c8c1a9858906b2dd676e72 (patch)
treeb1df97f18dace4a5702b0bc7aafdfee8a2f25ada
parentee523abdace8337d05ec4a179fcdf5de3fe0f634 (diff)
2011-04-08 Joel Sherrill <joel.sherrill@oarcorp.com>
* AUTHORS, BUGS, COPYING, ChangeLog, INSTALL, Makefile.am, Makefile.in, NEWS, README, SUPPORT, THANKS, TODO, acconfig.h, aclocal.m4, autogen.sh, config.guess, config.h.in, config.sub, configure, configure.ac, gsl-config.in, gsl-histogram.c, gsl-randist.c, gsl.m4, gsl.pc.in, gsl.spec.in, gsl_machine.h, gsl_math.h, gsl_mode.h, gsl_nan.h, gsl_pow_int.h, gsl_precision.h, gsl_types.h, gsl_version.h.in, install-sh, ltmain.sh, mdate-sh, missing, mkinstalldirs, templates_off.h, templates_on.h, test_gsl_histogram.sh, version.c, blas/ChangeLog, blas/Makefile.am, blas/Makefile.in, blas/TODO, blas/blas.c, blas/gsl_blas.h, blas/gsl_blas_types.h, block/ChangeLog, block/Makefile.am, block/Makefile.in, block/block.c, block/block_source.c, block/file.c, block/fprintf_source.c, block/fwrite_source.c, block/gsl_block.h, block/gsl_block_char.h, block/gsl_block_complex_double.h, block/gsl_block_complex_float.h, block/gsl_block_complex_long_double.h, block/gsl_block_double.h, block/gsl_block_float.h, block/gsl_block_int.h, block/gsl_block_long.h, block/gsl_block_long_double.h, block/gsl_block_short.h, block/gsl_block_uchar.h, block/gsl_block_uint.h, block/gsl_block_ulong.h, block/gsl_block_ushort.h, block/gsl_check_range.h, block/init.c, block/init_source.c, block/test.c, block/test_complex_io.c, block/test_complex_source.c, block/test_io.c, block/test_source.c, bspline/ChangeLog, bspline/Makefile.am, bspline/Makefile.in, bspline/TODO, bspline/bspline.c, bspline/gsl_bspline.h, bspline/test.c, cblas/ChangeLog, cblas/Makefile.am, cblas/Makefile.in, cblas/TODO, cblas/caxpy.c, cblas/cblas.h, cblas/ccopy.c, cblas/cdotc_sub.c, cblas/cdotu_sub.c, cblas/cgbmv.c, cblas/cgemm.c, cblas/cgemv.c, cblas/cgerc.c, cblas/cgeru.c, cblas/chbmv.c, cblas/chemm.c, cblas/chemv.c, cblas/cher.c, cblas/cher2.c, cblas/cher2k.c, cblas/cherk.c, cblas/chpmv.c, cblas/chpr.c, cblas/chpr2.c, cblas/cscal.c, cblas/csscal.c, cblas/cswap.c, cblas/csymm.c, cblas/csyr2k.c, cblas/csyrk.c, cblas/ctbmv.c, cblas/ctbsv.c, cblas/ctpmv.c, cblas/ctpsv.c, cblas/ctrmm.c, cblas/ctrmv.c, cblas/ctrsm.c, cblas/ctrsv.c, cblas/dasum.c, cblas/daxpy.c, cblas/dcopy.c, cblas/ddot.c, cblas/dgbmv.c, cblas/dgemm.c, cblas/dgemv.c, cblas/dger.c, cblas/dnrm2.c, cblas/drot.c, cblas/drotg.c, cblas/drotm.c, cblas/drotmg.c, cblas/dsbmv.c, cblas/dscal.c, cblas/dsdot.c, cblas/dspmv.c, cblas/dspr.c, cblas/dspr2.c, cblas/dswap.c, cblas/dsymm.c, cblas/dsymv.c, cblas/dsyr.c, cblas/dsyr2.c, cblas/dsyr2k.c, cblas/dsyrk.c, cblas/dtbmv.c, cblas/dtbsv.c, cblas/dtpmv.c, cblas/dtpsv.c, cblas/dtrmm.c, cblas/dtrmv.c, cblas/dtrsm.c, cblas/dtrsv.c, cblas/dzasum.c, cblas/dznrm2.c, cblas/gsl_cblas.h, cblas/hypot.c, cblas/icamax.c, cblas/idamax.c, cblas/isamax.c, cblas/izamax.c, cblas/sasum.c, cblas/saxpy.c, cblas/scasum.c, cblas/scnrm2.c, cblas/scopy.c, cblas/sdot.c, cblas/sdsdot.c, cblas/sgbmv.c, cblas/sgemm.c, cblas/sgemv.c, cblas/sger.c, cblas/snrm2.c, cblas/source_asum_c.h, cblas/source_asum_r.h, cblas/source_axpy_c.h, cblas/source_axpy_r.h, cblas/source_copy_c.h, cblas/source_copy_r.h, cblas/source_dot_c.h, cblas/source_dot_r.h, cblas/source_gbmv_c.h, cblas/source_gbmv_r.h, cblas/source_gemm_c.h, cblas/source_gemm_r.h, cblas/source_gemv_c.h, cblas/source_gemv_r.h, cblas/source_ger.h, cblas/source_gerc.h, cblas/source_geru.h, cblas/source_hbmv.h, cblas/source_hemm.h, cblas/source_hemv.h, cblas/source_her.h, cblas/source_her2.h, cblas/source_her2k.h, cblas/source_herk.h, cblas/source_hpmv.h, cblas/source_hpr.h, cblas/source_hpr2.h, cblas/source_iamax_c.h, cblas/source_iamax_r.h, cblas/source_nrm2_c.h, cblas/source_nrm2_r.h, cblas/source_rot.h, cblas/source_rotg.h, cblas/source_rotm.h, cblas/source_rotmg.h, cblas/source_sbmv.h, cblas/source_scal_c.h, cblas/source_scal_c_s.h, cblas/source_scal_r.h, cblas/source_spmv.h, cblas/source_spr.h, cblas/source_spr2.h, cblas/source_swap_c.h, cblas/source_swap_r.h, cblas/source_symm_c.h, cblas/source_symm_r.h, cblas/source_symv.h, cblas/source_syr.h, cblas/source_syr2.h, cblas/source_syr2k_c.h, cblas/source_syr2k_r.h, cblas/source_syrk_c.h, cblas/source_syrk_r.h, cblas/source_tbmv_c.h, cblas/source_tbmv_r.h, cblas/source_tbsv_c.h, cblas/source_tbsv_r.h, cblas/source_tpmv_c.h, cblas/source_tpmv_r.h, cblas/source_tpsv_c.h, cblas/source_tpsv_r.h, cblas/source_trmm_c.h, cblas/source_trmm_r.h, cblas/source_trmv_c.h, cblas/source_trmv_r.h, cblas/source_trsm_c.h, cblas/source_trsm_r.h, cblas/source_trsv_c.h, cblas/source_trsv_r.h, cblas/srot.c, cblas/srotg.c, cblas/srotm.c, cblas/srotmg.c, cblas/ssbmv.c, cblas/sscal.c, cblas/sspmv.c, cblas/sspr.c, cblas/sspr2.c, cblas/sswap.c, cblas/ssymm.c, cblas/ssymv.c, cblas/ssyr.c, cblas/ssyr2.c, cblas/ssyr2k.c, cblas/ssyrk.c, cblas/stbmv.c, cblas/stbsv.c, cblas/stpmv.c, cblas/stpsv.c, cblas/strmm.c, cblas/strmv.c, cblas/strsm.c, cblas/strsv.c, cblas/test.c, cblas/test_amax.c, cblas/test_asum.c, cblas/test_axpy.c, cblas/test_copy.c, cblas/test_dot.c, cblas/test_gbmv.c, cblas/test_gemm.c, cblas/test_gemv.c, cblas/test_ger.c, cblas/test_hbmv.c, cblas/test_hemm.c, cblas/test_hemv.c, cblas/test_her.c, cblas/test_her2.c, cblas/test_her2k.c, cblas/test_herk.c, cblas/test_hpmv.c, cblas/test_hpr.c, cblas/test_hpr2.c, cblas/test_nrm2.c, cblas/test_rot.c, cblas/test_rotg.c, cblas/test_rotm.c, cblas/test_rotmg.c, cblas/test_sbmv.c, cblas/test_scal.c, cblas/test_spmv.c, cblas/test_spr.c, cblas/test_spr2.c, cblas/test_swap.c, cblas/test_symm.c, cblas/test_symv.c, cblas/test_syr.c, cblas/test_syr2.c, cblas/test_syr2k.c, cblas/test_syrk.c, cblas/test_tbmv.c, cblas/test_tbsv.c, cblas/test_tpmv.c, cblas/test_tpsv.c, cblas/test_trmm.c, cblas/test_trmv.c, cblas/test_trsm.c, cblas/test_trsv.c, cblas/tests.c, cblas/tests.h, cblas/xerbla.c, cblas/zaxpy.c, cblas/zcopy.c, cblas/zdotc_sub.c, cblas/zdotu_sub.c, cblas/zdscal.c, cblas/zgbmv.c, cblas/zgemm.c, cblas/zgemv.c, cblas/zgerc.c, cblas/zgeru.c, cblas/zhbmv.c, cblas/zhemm.c, cblas/zhemv.c, cblas/zher.c, cblas/zher2.c, cblas/zher2k.c, cblas/zherk.c, cblas/zhpmv.c, cblas/zhpr.c, cblas/zhpr2.c, cblas/zscal.c, cblas/zswap.c, cblas/zsymm.c, cblas/zsyr2k.c, cblas/zsyrk.c, cblas/ztbmv.c, cblas/ztbsv.c, cblas/ztpmv.c, cblas/ztpsv.c, cblas/ztrmm.c, cblas/ztrmv.c, cblas/ztrsm.c, cblas/ztrsv.c, cdf/ChangeLog, cdf/Makefile.am, cdf/Makefile.in, cdf/beta.c, cdf/beta_inc.c, cdf/betainv.c, cdf/binomial.c, cdf/cauchy.c, cdf/cauchyinv.c, cdf/chisq.c, cdf/chisqinv.c, cdf/error.h, cdf/exponential.c, cdf/exponentialinv.c, cdf/exppow.c, cdf/fdist.c, cdf/fdistinv.c, cdf/flat.c, cdf/flatinv.c, cdf/gamma.c, cdf/gammainv.c, cdf/gauss.c, cdf/gaussinv.c, cdf/geometric.c, cdf/gsl_cdf.h, cdf/gumbel1.c, cdf/gumbel1inv.c, cdf/gumbel2.c, cdf/gumbel2inv.c, cdf/hypergeometric.c, cdf/laplace.c, cdf/laplaceinv.c, cdf/logistic.c, cdf/logisticinv.c, cdf/lognormal.c, cdf/lognormalinv.c, cdf/nbinomial.c, cdf/pareto.c, cdf/paretoinv.c, cdf/pascal.c, cdf/poisson.c, cdf/rat_eval.h, cdf/rayleigh.c, cdf/rayleighinv.c, cdf/tdist.c, cdf/tdistinv.c, cdf/test.c, cdf/test_auto.c, cdf/weibull.c, cdf/weibullinv.c, cheb/ChangeLog, cheb/Makefile.am, cheb/Makefile.in, cheb/deriv.c, cheb/eval.c, cheb/gsl_chebyshev.h, cheb/init.c, cheb/integ.c, cheb/test.c, combination/ChangeLog, combination/Makefile.am, combination/Makefile.in, combination/combination.c, combination/file.c, combination/gsl_combination.h, combination/init.c, combination/test.c, complex/ChangeLog, complex/Makefile.am, complex/Makefile.in, complex/TODO, complex/gsl_complex.h, complex/gsl_complex_math.h, complex/math.c, complex/results.h, complex/results1.h, complex/results_real.h, complex/test.c, const/ChangeLog, const/Makefile.am, const/Makefile.in, const/TODO, const/gsl_const.h, const/gsl_const_cgs.h, const/gsl_const_cgsm.h, const/gsl_const_mks.h, const/gsl_const_mksa.h, const/gsl_const_num.h, const/test.c, deriv/ChangeLog, deriv/Makefile.am, deriv/Makefile.in, deriv/deriv.c, deriv/gsl_deriv.h, deriv/test.c, dht/ChangeLog, dht/Makefile.am, dht/Makefile.in, dht/dht.c, dht/gsl_dht.h, dht/test.c, diff/ChangeLog, diff/Makefile.am, diff/Makefile.in, diff/diff.c, diff/gsl_diff.h, diff/test.c, doc/12-cities.eps, doc/ChangeLog, doc/Makefile.am, doc/Makefile.in, doc/algorithm.sty, doc/algorithmic.sty, doc/autoconf.texi, doc/blas.texi, doc/bspline.eps, doc/bspline.texi, doc/calc.sty, doc/cblas.texi, doc/cheb.eps, doc/cheb.texi, doc/combination.texi, doc/complex.texi, doc/const.texi, doc/debug.texi, doc/dht.texi, doc/diff.texi, doc/dwt-orig.eps, doc/dwt-samp.eps, doc/dwt.texi, doc/eigen.texi, doc/err.texi, doc/fdl.texi, doc/fft-complex-radix2-f.eps, doc/fft-complex-radix2-t.eps, doc/fft-complex-radix2.eps, doc/fft-real-mixedradix.eps, doc/fft.texi, doc/fftalgorithms.bib, doc/fftalgorithms.tex, doc/final-route.eps, doc/fit-exp.eps, doc/fit-wlinear.eps, doc/fit-wlinear2.eps, doc/fitting.texi, doc/freemanuals.texi, doc/gpl.texi, doc/gsl-config.1, doc/gsl-design.texi, doc/gsl-histogram.1, doc/gsl-randist.1, doc/gsl-ref.info, doc/gsl-ref.info-1, doc/gsl-ref.info-2, doc/gsl-ref.info-3, doc/gsl-ref.info-4, doc/gsl-ref.info-5, doc/gsl-ref.info-6, doc/gsl-ref.texi, doc/gsl.3, doc/histogram.eps, doc/histogram.texi, doc/histogram2d.eps, doc/ieee754.texi, doc/initial-route.eps, doc/integration.texi, doc/interp.texi, doc/interp2.eps, doc/interpp2.eps, doc/intro.texi, doc/landau.dat, doc/linalg.texi, doc/math.texi, doc/mdate-sh, doc/min-interval.eps, doc/min.texi, doc/montecarlo.texi, doc/multifit.texi, doc/multimin.eps, doc/multimin.texi, doc/multiroots.texi, doc/ntuple.eps, doc/ntuple.texi, doc/ode-initval.texi, doc/permutation.texi, doc/poly.texi, doc/qrng.eps, doc/qrng.texi, doc/rand-bernoulli.tex, doc/rand-beta.tex, doc/rand-binomial.tex, doc/rand-bivariate-gaussian.tex, doc/rand-cauchy.tex, doc/rand-chisq.tex, doc/rand-erlang.tex, doc/rand-exponential.tex, doc/rand-exppow.tex, doc/rand-fdist.tex, doc/rand-flat.tex, doc/rand-gamma.tex, doc/rand-gaussian-tail.tex, doc/rand-gaussian.tex, doc/rand-geometric.tex, doc/rand-gumbel.tex, doc/rand-gumbel1.tex, doc/rand-gumbel2.tex, doc/rand-hypergeometric.tex, doc/rand-landau.tex, doc/rand-laplace.tex, doc/rand-levy.tex, doc/rand-levyskew.tex, doc/rand-logarithmic.tex, doc/rand-logistic.tex, doc/rand-lognormal.tex, doc/rand-nbinomial.tex, doc/rand-pareto.tex, doc/rand-pascal.tex, doc/rand-poisson.tex, doc/rand-rayleigh-tail.tex, doc/rand-rayleigh.tex, doc/rand-tdist.tex, doc/rand-weibull.tex, doc/randist.texi, doc/random-walk.tex, doc/randplots.gnp, doc/rng.texi, doc/roots-bisection.eps, doc/roots-false-position.eps, doc/roots-newtons-method.eps, doc/roots-secant-method.eps, doc/roots.texi, doc/siman-energy.eps, doc/siman-test.eps, doc/siman.texi, doc/sort.texi, doc/specfunc-airy.texi, doc/specfunc-bessel.texi, doc/specfunc-clausen.texi, doc/specfunc-coulomb.texi, doc/specfunc-coupling.texi, doc/specfunc-dawson.texi, doc/specfunc-debye.texi, doc/specfunc-dilog.texi, doc/specfunc-elementary.texi, doc/specfunc-ellint.texi, doc/specfunc-elljac.texi, doc/specfunc-erf.texi, doc/specfunc-exp.texi, doc/specfunc-expint.texi, doc/specfunc-fermi-dirac.texi, doc/specfunc-gamma.texi, doc/specfunc-gegenbauer.texi, doc/specfunc-hyperg.texi, doc/specfunc-laguerre.texi, doc/specfunc-lambert.texi, doc/specfunc-legendre.texi, doc/specfunc-log.texi, doc/specfunc-mathieu.texi, doc/specfunc-pow-int.texi, doc/specfunc-psi.texi, doc/specfunc-synchrotron.texi, doc/specfunc-transport.texi, doc/specfunc-trig.texi, doc/specfunc-zeta.texi, doc/specfunc.texi, doc/stamp-vti, doc/statistics.texi, doc/sum.texi, doc/texinfo.tex, doc/usage.texi, doc/vdp.eps, doc/vectors.texi, doc/version-ref.texi, doc/examples/blas.c, doc/examples/blas.out, doc/examples/block.c, doc/examples/block.out, doc/examples/bspline.c, doc/examples/cblas.c, doc/examples/cblas.out, doc/examples/cdf.c, doc/examples/cdf.out, doc/examples/cheb.c, doc/examples/combination.c, doc/examples/combination.out, doc/examples/const.c, doc/examples/const.out, doc/examples/demo_fn.c, doc/examples/demo_fn.h, doc/examples/diff.c, doc/examples/diff.out, doc/examples/dwt.c, doc/examples/dwt.dat, doc/examples/ecg.dat, doc/examples/eigen.c, doc/examples/eigen_nonsymm.c, doc/examples/expfit.c, doc/examples/fft.c, doc/examples/fftmr.c, doc/examples/fftreal.c, doc/examples/fitting.c, doc/examples/fitting2.c, doc/examples/fitting3.c, doc/examples/histogram.c, doc/examples/histogram2d.c, doc/examples/ieee.c, doc/examples/ieeeround.c, doc/examples/integration.c, doc/examples/integration.out, doc/examples/interp.c, doc/examples/interpp.c, doc/examples/intro.c, doc/examples/intro.out, doc/examples/linalglu.c, doc/examples/linalglu.out, doc/examples/matrix.c, doc/examples/matrixw.c, doc/examples/min.c, doc/examples/min.out, doc/examples/monte.c, doc/examples/nlfit.c, doc/examples/ntupler.c, doc/examples/ntuplew.c, doc/examples/ode-initval.c, doc/examples/odefixed.c, doc/examples/permseq.c, doc/examples/permshuffle.c, doc/examples/polyroots.c, doc/examples/polyroots.out, doc/examples/qrng.c, doc/examples/randpoisson.2.out, doc/examples/randpoisson.c, doc/examples/randpoisson.out, doc/examples/randwalk.c, doc/examples/rng.c, doc/examples/rng.out, doc/examples/rngunif.2.out, doc/examples/rngunif.c, doc/examples/rngunif.out, doc/examples/rootnewt.c, doc/examples/roots.c, doc/examples/siman.c, doc/examples/sortsmall.c, doc/examples/sortsmall.out, doc/examples/specfun.c, doc/examples/specfun.out, doc/examples/specfun_e.c, doc/examples/specfun_e.out, doc/examples/stat.c, doc/examples/stat.out, doc/examples/statsort.c, doc/examples/statsort.out, doc/examples/sum.c, doc/examples/sum.out, doc/examples/vector.c, doc/examples/vectorr.c, doc/examples/vectorview.c, doc/examples/vectorview.out, doc/examples/vectorw.c, eigen/ChangeLog, eigen/Makefile.am, eigen/Makefile.in, eigen/TODO, eigen/francis.c, eigen/gsl_eigen.h, eigen/herm.c, eigen/hermv.c, eigen/jacobi.c, eigen/nonsymm.c, eigen/nonsymmv.c, eigen/qrstep.c, eigen/schur.c, eigen/schur.h, eigen/sort.c, eigen/symm.c, eigen/symmv.c, eigen/test.c, err/ChangeLog, err/Makefile.am, err/Makefile.in, err/TODO, err/error.c, err/gsl_errno.h, err/gsl_message.h, err/message.c, err/stream.c, err/strerror.c, err/test.c, fft/ChangeLog, fft/Makefile.am, fft/Makefile.in, fft/TODO, fft/bitreverse.c, fft/bitreverse.h, fft/c_init.c, fft/c_main.c, fft/c_pass.h, fft/c_pass_2.c, fft/c_pass_3.c, fft/c_pass_4.c, fft/c_pass_5.c, fft/c_pass_6.c, fft/c_pass_7.c, fft/c_pass_n.c, fft/c_radix2.c, fft/compare.h, fft/compare_source.c, fft/complex_internal.h, fft/dft.c, fft/dft_source.c, fft/factorize.c, fft/factorize.h, fft/fft.c, fft/gsl_dft_complex.h, fft/gsl_dft_complex_float.h, fft/gsl_fft.h, fft/gsl_fft_complex.h, fft/gsl_fft_complex_float.h, fft/gsl_fft_halfcomplex.h, fft/gsl_fft_halfcomplex_float.h, fft/gsl_fft_real.h, fft/gsl_fft_real_float.h, fft/hc_init.c, fft/hc_main.c, fft/hc_pass.h, fft/hc_pass_2.c, fft/hc_pass_3.c, fft/hc_pass_4.c, fft/hc_pass_5.c, fft/hc_pass_n.c, fft/hc_radix2.c, fft/hc_unpack.c, fft/real_init.c, fft/real_main.c, fft/real_pass.h, fft/real_pass_2.c, fft/real_pass_3.c, fft/real_pass_4.c, fft/real_pass_5.c, fft/real_pass_n.c, fft/real_radix2.c, fft/real_unpack.c, fft/signals.c, fft/signals.h, fft/signals_source.c, fft/test.c, fft/test_complex_source.c, fft/test_real_source.c, fft/test_trap_source.c, fft/urand.c, fit/ChangeLog, fit/Makefile.am, fit/Makefile.in, fit/gsl_fit.h, fit/linear.c, fit/test.c, gsl/Makefile.am, gsl/Makefile.in, histogram/ChangeLog, histogram/Makefile.am, histogram/Makefile.in, histogram/TODO, histogram/add.c, histogram/add2d.c, histogram/calloc_range.c, histogram/calloc_range2d.c, histogram/copy.c, histogram/copy2d.c, histogram/file.c, histogram/file2d.c, histogram/find.c, histogram/find2d.c, histogram/get.c, histogram/get2d.c, histogram/gsl_histogram.h, histogram/gsl_histogram2d.h, histogram/init.c, histogram/init2d.c, histogram/maxval.c, histogram/maxval2d.c, histogram/oper.c, histogram/oper2d.c, histogram/params.c, histogram/params2d.c, histogram/pdf.c, histogram/pdf2d.c, histogram/reset.c, histogram/reset2d.c, histogram/stat.c, histogram/stat2d.c, histogram/test.c, histogram/test1d.c, histogram/test1d_resample.c, histogram/test1d_trap.c, histogram/test2d.c, histogram/test2d_resample.c, histogram/test2d_trap.c, histogram/urand.c, ieee-utils/ChangeLog, ieee-utils/Makefile.am, ieee-utils/Makefile.in, ieee-utils/TODO, ieee-utils/endian.c, ieee-utils/env.c, ieee-utils/fp-aix.c, ieee-utils/fp-darwin.c, ieee-utils/fp-darwin86.c, ieee-utils/fp-freebsd.c, ieee-utils/fp-gnuc99.c, ieee-utils/fp-gnum68k.c, ieee-utils/fp-gnuppc.c, ieee-utils/fp-gnusparc.c, ieee-utils/fp-gnux86.c, ieee-utils/fp-hpux.c, ieee-utils/fp-hpux11.c, ieee-utils/fp-irix.c, ieee-utils/fp-netbsd.c, ieee-utils/fp-openbsd.c, ieee-utils/fp-os2emx.c, ieee-utils/fp-solaris.c, ieee-utils/fp-sunos4.c, ieee-utils/fp-tru64.c, ieee-utils/fp-unknown.c, ieee-utils/fp.c, ieee-utils/gsl_ieee_utils.h, ieee-utils/make_rep.c, ieee-utils/print.c, ieee-utils/read.c, ieee-utils/standardize.c, ieee-utils/test.c, integration/ChangeLog, integration/Makefile.am, integration/Makefile.in, integration/TODO, integration/append.c, integration/err.c, integration/gsl_integration.h, integration/initialise.c, integration/positivity.c, integration/ptsort.c, integration/qag.c, integration/qagp.c, integration/qags.c, integration/qawc.c, integration/qawf.c, integration/qawo.c, integration/qaws.c, integration/qc25c.c, integration/qc25f.c, integration/qc25s.c, integration/qcheb.c, integration/qelg.c, integration/qk.c, integration/qk15.c, integration/qk21.c, integration/qk31.c, integration/qk41.c, integration/qk51.c, integration/qk61.c, integration/qmomo.c, integration/qmomof.c, integration/qng.c, integration/qng.h, integration/qpsrt.c, integration/qpsrt2.c, integration/reset.c, integration/set_initial.c, integration/test.c, integration/tests.c, integration/tests.h, integration/util.c, integration/workspace.c, interpolation/ChangeLog, interpolation/Makefile.am, interpolation/Makefile.in, interpolation/TODO, interpolation/accel.c, interpolation/akima.c, interpolation/bsearch.c, interpolation/bsearch.h, interpolation/cspline.c, interpolation/gsl_interp.h, interpolation/gsl_spline.h, interpolation/integ_eval.h, interpolation/interp.c, interpolation/linear.c, interpolation/poly.c, interpolation/spline.c, interpolation/test.c, linalg/ChangeLog, linalg/Makefile.am, linalg/Makefile.in, linalg/TODO, linalg/apply_givens.c, linalg/balance.c, linalg/balancemat.c, linalg/bidiag.c, linalg/cholesky.c, linalg/exponential.c, linalg/givens.c, linalg/gsl_linalg.h, linalg/hermtd.c, linalg/hessenberg.c, linalg/hh.c, linalg/householder.c, linalg/householdercomplex.c, linalg/lq.c, linalg/lu.c, linalg/luc.c, linalg/multiply.c, linalg/ptlq.c, linalg/qr.c, linalg/qrpt.c, linalg/svd.c, linalg/svdstep.c, linalg/symmtd.c, linalg/test.c, linalg/tridiag.c, linalg/tridiag.h, matrix/ChangeLog, matrix/Makefile.am, matrix/Makefile.in, matrix/TODO, matrix/copy.c, matrix/copy_source.c, matrix/file.c, matrix/file_source.c, matrix/getset.c, matrix/getset_source.c, matrix/gsl_matrix.h, matrix/gsl_matrix_char.h, matrix/gsl_matrix_complex_double.h, matrix/gsl_matrix_complex_float.h, matrix/gsl_matrix_complex_long_double.h, matrix/gsl_matrix_double.h, matrix/gsl_matrix_float.h, matrix/gsl_matrix_int.h, matrix/gsl_matrix_long.h, matrix/gsl_matrix_long_double.h, matrix/gsl_matrix_short.h, matrix/gsl_matrix_uchar.h, matrix/gsl_matrix_uint.h, matrix/gsl_matrix_ulong.h, matrix/gsl_matrix_ushort.h, matrix/init.c, matrix/init_source.c, matrix/matrix.c, matrix/matrix_source.c, matrix/minmax.c, matrix/minmax_source.c, matrix/oper.c, matrix/oper_complex_source.c, matrix/oper_source.c, matrix/prop.c, matrix/prop_source.c, matrix/rowcol.c, matrix/rowcol_source.c, matrix/submatrix.c, matrix/submatrix_source.c, matrix/swap.c, matrix/swap_source.c, matrix/test.c, matrix/test_complex_source.c, matrix/test_source.c, matrix/test_static.c, matrix/view.c, matrix/view.h, matrix/view_source.c, min/ChangeLog, min/Makefile.am, min/Makefile.in, min/bracketing.c, min/brent.c, min/convergence.c, min/fsolver.c, min/golden.c, min/gsl_min.h, min/min.h, min/test.c, min/test.h, min/test_funcs.c, monte/ChangeLog, monte/Makefile.am, monte/Makefile.in, monte/README, monte/TODO, monte/gsl_monte.h, monte/gsl_monte_miser.h, monte/gsl_monte_plain.h, monte/gsl_monte_vegas.h, monte/miser.c, monte/plain.c, monte/test.c, monte/test_main.c, monte/vegas.c, multifit/ChangeLog, multifit/Makefile.am, multifit/Makefile.in, multifit/TODO, multifit/convergence.c, multifit/covar.c, multifit/fdfsolver.c, multifit/fsolver.c, multifit/gradient.c, multifit/gsl_multifit.h, multifit/gsl_multifit_nlin.h, multifit/lmder.c, multifit/lmiterate.c, multifit/lmpar.c, multifit/lmset.c, multifit/lmutil.c, multifit/multilinear.c, multifit/qrsolv.c, multifit/test.c, multifit/test_brown.c, multifit/test_enso.c, multifit/test_estimator.c, multifit/test_filip.c, multifit/test_fn.c, multifit/test_hahn1.c, multifit/test_kirby2.c, multifit/test_longley.c, multifit/test_nelson.c, multifit/test_pontius.c, multifit/work.c, multimin/ChangeLog, multimin/Makefile.am, multimin/Makefile.in, multimin/TODO, multimin/conjugate_fr.c, multimin/conjugate_pr.c, multimin/convergence.c, multimin/diff.c, multimin/directional_minimize.c, multimin/fdfminimizer.c, multimin/fminimizer.c, multimin/gsl_multimin.h, multimin/linear_minimize.c, multimin/linear_wrapper.c, multimin/simplex.c, multimin/steepest_descent.c, multimin/test.c, multimin/test_funcs.c, multimin/test_funcs.h, multimin/vector_bfgs.c, multimin/vector_bfgs2.c, multiroots/ChangeLog, multiroots/Makefile.am, multiroots/Makefile.in, multiroots/broyden.c, multiroots/convergence.c, multiroots/dnewton.c, multiroots/dogleg.c, multiroots/enorm.c, multiroots/fdfsolver.c, multiroots/fdjac.c, multiroots/fsolver.c, multiroots/gnewton.c, multiroots/gsl_multiroots.h, multiroots/hybrid.c, multiroots/hybridj.c, multiroots/newton.c, multiroots/test.c, multiroots/test_funcs.c, multiroots/test_funcs.h, ntuple/ChangeLog, ntuple/Makefile.am, ntuple/Makefile.in, ntuple/gsl_ntuple.h, ntuple/ntuple.c, ntuple/test.c, ode-initval/ChangeLog, ode-initval/Makefile.am, ode-initval/Makefile.in, ode-initval/TODO, ode-initval/bsimp.c, ode-initval/control.c, ode-initval/cscal.c, ode-initval/cstd.c, ode-initval/evolve.c, ode-initval/gear1.c, ode-initval/gear2.c, ode-initval/gsl_odeiv.h, ode-initval/odeiv_util.h, ode-initval/rk2.c, ode-initval/rk2imp.c, ode-initval/rk2simp.c, ode-initval/rk4.c, ode-initval/rk4imp.c, ode-initval/rk8pd.c, ode-initval/rkck.c, ode-initval/rkf45.c, ode-initval/step.c, ode-initval/test.c, permutation/ChangeLog, permutation/Makefile.am, permutation/Makefile.in, permutation/canonical.c, permutation/file.c, permutation/gsl_permutation.h, permutation/gsl_permute.h, permutation/gsl_permute_char.h, permutation/gsl_permute_complex_double.h, permutation/gsl_permute_complex_float.h, permutation/gsl_permute_complex_long_double.h, permutation/gsl_permute_double.h, permutation/gsl_permute_float.h, permutation/gsl_permute_int.h, permutation/gsl_permute_long.h, permutation/gsl_permute_long_double.h, permutation/gsl_permute_short.h, permutation/gsl_permute_uchar.h, permutation/gsl_permute_uint.h, permutation/gsl_permute_ulong.h, permutation/gsl_permute_ushort.h, permutation/gsl_permute_vector.h, permutation/gsl_permute_vector_char.h, permutation/gsl_permute_vector_complex_double.h, permutation/gsl_permute_vector_complex_float.h, permutation/gsl_permute_vector_complex_long_double.h, permutation/gsl_permute_vector_double.h, permutation/gsl_permute_vector_float.h, permutation/gsl_permute_vector_int.h, permutation/gsl_permute_vector_long.h, permutation/gsl_permute_vector_long_double.h, permutation/gsl_permute_vector_short.h, permutation/gsl_permute_vector_uchar.h, permutation/gsl_permute_vector_uint.h, permutation/gsl_permute_vector_ulong.h, permutation/gsl_permute_vector_ushort.h, permutation/init.c, permutation/permutation.c, permutation/permute.c, permutation/permute_source.c, permutation/test.c, poly/ChangeLog, poly/Makefile.am, poly/Makefile.in, poly/TODO, poly/balance.c, poly/companion.c, poly/dd.c, poly/eval.c, poly/gsl_poly.h, poly/qr.c, poly/solve_cubic.c, poly/solve_quadratic.c, poly/test.c, poly/zsolve.c, poly/zsolve_cubic.c, poly/zsolve_init.c, poly/zsolve_quadratic.c, qrng/ChangeLog, qrng/Makefile.am, qrng/Makefile.in, qrng/TODO, qrng/gsl_qrng.h, qrng/niederreiter-2.c, qrng/qrng.c, qrng/sobol.c, qrng/test.c, randist/ChangeLog, randist/Makefile.am, randist/Makefile.in, randist/TODO, randist/bernoulli.c, randist/beta.c, randist/bigauss.c, randist/binomial.c, randist/binomial_tpe.c, randist/cauchy.c, randist/chisq.c, randist/dirichlet.c, randist/discrete.c, randist/erlang.c, randist/exponential.c, randist/exppow.c, randist/fdist.c, randist/flat.c, randist/gamma.c, randist/gauss.c, randist/gausstail.c, randist/gausszig.c, randist/geometric.c, randist/gsl_randist.h, randist/gumbel.c, randist/hyperg.c, randist/landau.c, randist/laplace.c, randist/levy.c, randist/logarithmic.c, randist/logistic.c, randist/lognormal.c, randist/multinomial.c, randist/nbinomial.c, randist/pareto.c, randist/pascal.c, randist/poisson.c, randist/rayleigh.c, randist/shuffle.c, randist/sphere.c, randist/tdist.c, randist/test.c, randist/weibull.c, rng/ChangeLog, rng/Makefile.am, rng/Makefile.in, rng/TODO, rng/borosh13.c, rng/cmrg.c, rng/coveyou.c, rng/default.c, rng/file.c, rng/fishman18.c, rng/fishman20.c, rng/fishman2x.c, rng/gfsr4.c, rng/gsl_rng.h, rng/knuthran.c, rng/knuthran2.c, rng/knuthran2002.c, rng/lecuyer21.c, rng/minstd.c, rng/mrg.c, rng/mt.c, rng/r250.c, rng/ran0.c, rng/ran1.c, rng/ran2.c, rng/ran3.c, rng/rand.c, rng/rand48.c, rng/random.c, rng/randu.c, rng/ranf.c, rng/ranlux.c, rng/ranlxd.c, rng/ranlxs.c, rng/ranmar.c, rng/rng.c, rng/schrage.c, rng/slatec.c, rng/taus.c, rng/taus113.c, rng/test.c, rng/transputer.c, rng/tt.c, rng/types.c, rng/uni.c, rng/uni32.c, rng/vax.c, rng/waterman14.c, rng/zuf.c, roots/ChangeLog, roots/Makefile.am, roots/Makefile.in, roots/TODO, roots/bisection.c, roots/brent.c, roots/convergence.c, roots/falsepos.c, roots/fdfsolver.c, roots/fsolver.c, roots/gsl_roots.h, roots/newton.c, roots/roots.h, roots/secant.c, roots/steffenson.c, roots/test.c, roots/test.h, roots/test_funcs.c, siman/ChangeLog, siman/Makefile.am, siman/Makefile.in, siman/TODO, siman/gsl_siman.h, siman/siman.c, siman/siman_test_driver.sh, siman/siman_tsp.c, siman/test.c, sort/ChangeLog, sort/Makefile.am, sort/Makefile.in, sort/TODO, sort/gsl_heapsort.h, sort/gsl_sort.h, sort/gsl_sort_char.h, sort/gsl_sort_double.h, sort/gsl_sort_float.h, sort/gsl_sort_int.h, sort/gsl_sort_long.h, sort/gsl_sort_long_double.h, sort/gsl_sort_short.h, sort/gsl_sort_uchar.h, sort/gsl_sort_uint.h, sort/gsl_sort_ulong.h, sort/gsl_sort_ushort.h, sort/gsl_sort_vector.h, sort/gsl_sort_vector_char.h, sort/gsl_sort_vector_double.h, sort/gsl_sort_vector_float.h, sort/gsl_sort_vector_int.h, sort/gsl_sort_vector_long.h, sort/gsl_sort_vector_long_double.h, sort/gsl_sort_vector_short.h, sort/gsl_sort_vector_uchar.h, sort/gsl_sort_vector_uint.h, sort/gsl_sort_vector_ulong.h, sort/gsl_sort_vector_ushort.h, sort/sort.c, sort/sortind.c, sort/sortvec.c, sort/sortvec_source.c, sort/sortvecind.c, sort/sortvecind_source.c, sort/subset.c, sort/subset_source.c, sort/subsetind.c, sort/subsetind_source.c, sort/test.c, sort/test_heapsort.c, sort/test_source.c, specfunc/ChangeLog, specfunc/Makefile.am, specfunc/Makefile.in, specfunc/TODO, specfunc/airy.c, specfunc/airy_der.c, specfunc/airy_zero.c, specfunc/atanint.c, specfunc/bessel.c, specfunc/bessel.h, specfunc/bessel_I0.c, specfunc/bessel_I1.c, specfunc/bessel_In.c, specfunc/bessel_Inu.c, specfunc/bessel_J0.c, specfunc/bessel_J1.c, specfunc/bessel_Jn.c, specfunc/bessel_Jnu.c, specfunc/bessel_K0.c, specfunc/bessel_K1.c, specfunc/bessel_Kn.c, specfunc/bessel_Knu.c, specfunc/bessel_Y0.c, specfunc/bessel_Y1.c, specfunc/bessel_Yn.c, specfunc/bessel_Ynu.c, specfunc/bessel_amp_phase.c, specfunc/bessel_amp_phase.h, specfunc/bessel_i.c, specfunc/bessel_j.c, specfunc/bessel_k.c, specfunc/bessel_olver.c, specfunc/bessel_olver.h, specfunc/bessel_sequence.c, specfunc/bessel_temme.c, specfunc/bessel_temme.h, specfunc/bessel_y.c, specfunc/bessel_zero.c, specfunc/beta.c, specfunc/beta_inc.c, specfunc/cheb_eval.c, specfunc/cheb_eval_mode.c, specfunc/chebyshev.h, specfunc/check.h, specfunc/clausen.c, specfunc/coulomb.c, specfunc/coulomb_bound.c, specfunc/coupling.c, specfunc/dawson.c, specfunc/debye.c, specfunc/dilog.c, specfunc/elementary.c, specfunc/ellint.c, specfunc/elljac.c, specfunc/erfc.c, specfunc/error.h, specfunc/eval.h, specfunc/exp.c, specfunc/expint.c, specfunc/expint3.c, specfunc/fermi_dirac.c, specfunc/gamma.c, specfunc/gamma_inc.c, specfunc/gegenbauer.c, specfunc/gsl_sf.h, specfunc/gsl_sf_airy.h, specfunc/gsl_sf_bessel.h, specfunc/gsl_sf_clausen.h, specfunc/gsl_sf_coulomb.h, specfunc/gsl_sf_coupling.h, specfunc/gsl_sf_dawson.h, specfunc/gsl_sf_debye.h, specfunc/gsl_sf_dilog.h, specfunc/gsl_sf_elementary.h, specfunc/gsl_sf_ellint.h, specfunc/gsl_sf_elljac.h, specfunc/gsl_sf_erf.h, specfunc/gsl_sf_exp.h, specfunc/gsl_sf_expint.h, specfunc/gsl_sf_fermi_dirac.h, specfunc/gsl_sf_gamma.h, specfunc/gsl_sf_gegenbauer.h, specfunc/gsl_sf_hyperg.h, specfunc/gsl_sf_laguerre.h, specfunc/gsl_sf_lambert.h, specfunc/gsl_sf_legendre.h, specfunc/gsl_sf_log.h, specfunc/gsl_sf_mathieu.h, specfunc/gsl_sf_pow_int.h, specfunc/gsl_sf_psi.h, specfunc/gsl_sf_result.h, specfunc/gsl_sf_synchrotron.h, specfunc/gsl_sf_transport.h, specfunc/gsl_sf_trig.h, specfunc/gsl_sf_zeta.h, specfunc/gsl_specfunc.h, specfunc/hyperg.c, specfunc/hyperg.h, specfunc/hyperg_0F1.c, specfunc/hyperg_1F1.c, specfunc/hyperg_2F0.c, specfunc/hyperg_2F1.c, specfunc/hyperg_U.c, specfunc/laguerre.c, specfunc/lambert.c, specfunc/legendre.h, specfunc/legendre_H3d.c, specfunc/legendre_Qn.c, specfunc/legendre_con.c, specfunc/legendre_poly.c, specfunc/log.c, specfunc/mathieu_angfunc.c, specfunc/mathieu_charv.c, specfunc/mathieu_coeff.c, specfunc/mathieu_radfunc.c, specfunc/mathieu_workspace.c, specfunc/poch.c, specfunc/pow_int.c, specfunc/psi.c, specfunc/recurse.h, specfunc/result.c, specfunc/shint.c, specfunc/sinint.c, specfunc/synchrotron.c, specfunc/test_airy.c, specfunc/test_bessel.c, specfunc/test_coulomb.c, specfunc/test_dilog.c, specfunc/test_gamma.c, specfunc/test_hyperg.c, specfunc/test_legendre.c, specfunc/test_mathieu.c, specfunc/test_sf.c, specfunc/test_sf.h, specfunc/transport.c, specfunc/trig.c, specfunc/zeta.c, statistics/ChangeLog, statistics/Makefile.am, statistics/Makefile.in, statistics/TODO, statistics/absdev.c, statistics/absdev_source.c, statistics/covariance.c, statistics/covariance_source.c, statistics/gsl_statistics.h, statistics/gsl_statistics_char.h, statistics/gsl_statistics_double.h, statistics/gsl_statistics_float.h, statistics/gsl_statistics_int.h, statistics/gsl_statistics_long.h, statistics/gsl_statistics_long_double.h, statistics/gsl_statistics_short.h, statistics/gsl_statistics_uchar.h, statistics/gsl_statistics_uint.h, statistics/gsl_statistics_ulong.h, statistics/gsl_statistics_ushort.h, statistics/kurtosis.c, statistics/kurtosis_source.c, statistics/lag1.c, statistics/lag1_source.c, statistics/mean.c, statistics/mean_source.c, statistics/median.c, statistics/median_source.c, statistics/minmax.c, statistics/minmax_source.c, statistics/p_variance.c, statistics/p_variance_source.c, statistics/quantiles.c, statistics/quantiles_source.c, statistics/skew.c, statistics/skew_source.c, statistics/test.c, statistics/test_float_source.c, statistics/test_int_source.c, statistics/test_nist.c, statistics/ttest.c, statistics/ttest_source.c, statistics/variance.c, statistics/variance_source.c, statistics/wabsdev.c, statistics/wabsdev_source.c, statistics/wkurtosis.c, statistics/wkurtosis_source.c, statistics/wmean.c, statistics/wmean_source.c, statistics/wskew.c, statistics/wskew_source.c, statistics/wvariance.c, statistics/wvariance_source.c, sum/ChangeLog, sum/Makefile.am, sum/Makefile.in, sum/gsl_sum.h, sum/levin_u.c, sum/levin_utrunc.c, sum/test.c, sum/work_u.c, sum/work_utrunc.c, sys/ChangeLog, sys/Makefile.am, sys/Makefile.in, sys/coerce.c, sys/expm1.c, sys/fcmp.c, sys/fdiv.c, sys/gsl_sys.h, sys/hypot.c, sys/infnan.c, sys/invhyp.c, sys/ldfrexp.c, sys/log1p.c, sys/minmax.c, sys/pow_int.c, sys/prec.c, sys/test.c, test/ChangeLog, test/Makefile.am, test/Makefile.in, test/gsl_test.h, test/results.c, utils/Makefile.am, utils/Makefile.in, utils/README, utils/memcpy.c, utils/memmove.c, utils/placeholder.c, utils/strdup.c, utils/strtol.c, utils/strtoul.c, utils/system.h, vector/ChangeLog, vector/Makefile.am, vector/Makefile.in, vector/TODO, vector/copy.c, vector/copy_source.c, vector/file.c, vector/file_source.c, vector/gsl_vector.h, vector/gsl_vector_char.h, vector/gsl_vector_complex.h, vector/gsl_vector_complex_double.h, vector/gsl_vector_complex_float.h, vector/gsl_vector_complex_long_double.h, vector/gsl_vector_double.h, vector/gsl_vector_float.h, vector/gsl_vector_int.h, vector/gsl_vector_long.h, vector/gsl_vector_long_double.h, vector/gsl_vector_short.h, vector/gsl_vector_uchar.h, vector/gsl_vector_uint.h, vector/gsl_vector_ulong.h, vector/gsl_vector_ushort.h, vector/init.c, vector/init_source.c, vector/minmax.c, vector/minmax_source.c, vector/oper.c, vector/oper_source.c, vector/prop.c, vector/prop_source.c, vector/reim.c, vector/reim_source.c, vector/subvector.c, vector/subvector_source.c, vector/swap.c, vector/swap_source.c, vector/test.c, vector/test_complex_source.c, vector/test_source.c, vector/test_static.c, vector/vector.c, vector/vector_source.c, vector/view.c, vector/view.h, vector/view_source.c, wavelet/ChangeLog, wavelet/Makefile.am, wavelet/Makefile.in, wavelet/TODO, wavelet/bspline.c, wavelet/daubechies.c, wavelet/dwt.c, wavelet/gsl_wavelet.h, wavelet/gsl_wavelet2d.h, wavelet/haar.c, wavelet/test.c, wavelet/wavelet.c: New files.
-rw-r--r--gsl-1.9/AUTHORS26
-rw-r--r--gsl-1.9/BUGS201
-rw-r--r--gsl-1.9/COPYING340
-rw-r--r--gsl-1.9/ChangeLog1355
-rw-r--r--gsl-1.9/INSTALL513
-rw-r--r--gsl-1.9/Makefile.am42
-rw-r--r--gsl-1.9/Makefile.in969
-rw-r--r--gsl-1.9/NEWS1093
-rw-r--r--gsl-1.9/README82
-rw-r--r--gsl-1.9/SUPPORT21
-rw-r--r--gsl-1.9/THANKS404
-rw-r--r--gsl-1.9/TODO161
-rw-r--r--gsl-1.9/acconfig.h132
-rw-r--r--gsl-1.9/aclocal.m46980
-rwxr-xr-xgsl-1.9/autogen.sh10
-rw-r--r--gsl-1.9/blas/ChangeLog73
-rw-r--r--gsl-1.9/blas/Makefile.am14
-rw-r--r--gsl-1.9/blas/Makefile.in453
-rw-r--r--gsl-1.9/blas/TODO9
-rw-r--r--gsl-1.9/blas/blas.c2190
-rw-r--r--gsl-1.9/blas/gsl_blas.h602
-rw-r--r--gsl-1.9/blas/gsl_blas_types.h54
-rw-r--r--gsl-1.9/block/ChangeLog34
-rw-r--r--gsl-1.9/block/Makefile.am19
-rw-r--r--gsl-1.9/block/Makefile.in546
-rw-r--r--gsl-1.9/block/block.c87
-rw-r--r--gsl-1.9/block/block_source.c30
-rw-r--r--gsl-1.9/block/file.c102
-rw-r--r--gsl-1.9/block/fprintf_source.c171
-rw-r--r--gsl-1.9/block/fwrite_source.c116
-rw-r--r--gsl-1.9/block/gsl_block.h24
-rw-r--r--gsl-1.9/block/gsl_block_char.h65
-rw-r--r--gsl-1.9/block/gsl_block_complex_double.h65
-rw-r--r--gsl-1.9/block/gsl_block_complex_float.h65
-rw-r--r--gsl-1.9/block/gsl_block_complex_long_double.h65
-rw-r--r--gsl-1.9/block/gsl_block_double.h65
-rw-r--r--gsl-1.9/block/gsl_block_float.h65
-rw-r--r--gsl-1.9/block/gsl_block_int.h65
-rw-r--r--gsl-1.9/block/gsl_block_long.h65
-rw-r--r--gsl-1.9/block/gsl_block_long_double.h65
-rw-r--r--gsl-1.9/block/gsl_block_short.h65
-rw-r--r--gsl-1.9/block/gsl_block_uchar.h65
-rw-r--r--gsl-1.9/block/gsl_block_uint.h65
-rw-r--r--gsl-1.9/block/gsl_block_ulong.h65
-rw-r--r--gsl-1.9/block/gsl_block_ushort.h65
-rw-r--r--gsl-1.9/block/gsl_check_range.h57
-rw-r--r--gsl-1.9/block/init.c87
-rw-r--r--gsl-1.9/block/init_source.c79
-rw-r--r--gsl-1.9/block/test.c223
-rw-r--r--gsl-1.9/block/test_complex_io.c64
-rw-r--r--gsl-1.9/block/test_complex_source.c124
-rw-r--r--gsl-1.9/block/test_io.c66
-rw-r--r--gsl-1.9/block/test_source.c121
-rw-r--r--gsl-1.9/bspline/ChangeLog7
-rw-r--r--gsl-1.9/bspline/Makefile.am15
-rw-r--r--gsl-1.9/bspline/Makefile.in547
-rw-r--r--gsl-1.9/bspline/TODO9
-rw-r--r--gsl-1.9/bspline/bspline.c497
-rw-r--r--gsl-1.9/bspline/gsl_bspline.h75
-rw-r--r--gsl-1.9/bspline/test.c112
-rw-r--r--gsl-1.9/cblas/ChangeLog30
-rw-r--r--gsl-1.9/cblas/Makefile.am19
-rw-r--r--gsl-1.9/cblas/Makefile.in640
-rw-r--r--gsl-1.9/cblas/TODO8
-rw-r--r--gsl-1.9/cblas/caxpy.c12
-rw-r--r--gsl-1.9/cblas/cblas.h34
-rw-r--r--gsl-1.9/cblas/ccopy.c12
-rw-r--r--gsl-1.9/cblas/cdotc_sub.c14
-rw-r--r--gsl-1.9/cblas/cdotu_sub.c14
-rw-r--r--gsl-1.9/cblas/cgbmv.c14
-rw-r--r--gsl-1.9/cblas/cgemm.c15
-rw-r--r--gsl-1.9/cblas/cgemv.c14
-rw-r--r--gsl-1.9/cblas/cgerc.c13
-rw-r--r--gsl-1.9/cblas/cgeru.c13
-rw-r--r--gsl-1.9/cblas/chbmv.c14
-rw-r--r--gsl-1.9/cblas/chemm.c14
-rw-r--r--gsl-1.9/cblas/chemv.c14
-rw-r--r--gsl-1.9/cblas/cher.c13
-rw-r--r--gsl-1.9/cblas/cher2.c13
-rw-r--r--gsl-1.9/cblas/cher2k.c14
-rw-r--r--gsl-1.9/cblas/cherk.c14
-rw-r--r--gsl-1.9/cblas/chpmv.c13
-rw-r--r--gsl-1.9/cblas/chpr.c13
-rw-r--r--gsl-1.9/cblas/chpr2.c13
-rw-r--r--gsl-1.9/cblas/cscal.c11
-rw-r--r--gsl-1.9/cblas/csscal.c11
-rw-r--r--gsl-1.9/cblas/cswap.c11
-rw-r--r--gsl-1.9/cblas/csymm.c14
-rw-r--r--gsl-1.9/cblas/csyr2k.c14
-rw-r--r--gsl-1.9/cblas/csyrk.c14
-rw-r--r--gsl-1.9/cblas/ctbmv.c14
-rw-r--r--gsl-1.9/cblas/ctbsv.c16
-rw-r--r--gsl-1.9/cblas/ctpmv.c13
-rw-r--r--gsl-1.9/cblas/ctpsv.c15
-rw-r--r--gsl-1.9/cblas/ctrmm.c15
-rw-r--r--gsl-1.9/cblas/ctrmv.c14
-rw-r--r--gsl-1.9/cblas/ctrsm.c17
-rw-r--r--gsl-1.9/cblas/ctrsv.c16
-rw-r--r--gsl-1.9/cblas/dasum.c11
-rw-r--r--gsl-1.9/cblas/daxpy.c12
-rw-r--r--gsl-1.9/cblas/dcopy.c12
-rw-r--r--gsl-1.9/cblas/ddot.c16
-rw-r--r--gsl-1.9/cblas/dgbmv.c15
-rw-r--r--gsl-1.9/cblas/dgemm.c15
-rw-r--r--gsl-1.9/cblas/dgemv.c14
-rw-r--r--gsl-1.9/cblas/dger.c13
-rw-r--r--gsl-1.9/cblas/dnrm2.c11
-rw-r--r--gsl-1.9/cblas/drot.c12
-rw-r--r--gsl-1.9/cblas/drotg.c11
-rw-r--r--gsl-1.9/cblas/drotm.c12
-rw-r--r--gsl-1.9/cblas/drotmg.c11
-rw-r--r--gsl-1.9/cblas/dsbmv.c14
-rw-r--r--gsl-1.9/cblas/dscal.c11
-rw-r--r--gsl-1.9/cblas/dsdot.c16
-rw-r--r--gsl-1.9/cblas/dspmv.c14
-rw-r--r--gsl-1.9/cblas/dspr.c13
-rw-r--r--gsl-1.9/cblas/dspr2.c13
-rw-r--r--gsl-1.9/cblas/dswap.c12
-rw-r--r--gsl-1.9/cblas/dsymm.c15
-rw-r--r--gsl-1.9/cblas/dsymv.c14
-rw-r--r--gsl-1.9/cblas/dsyr.c13
-rw-r--r--gsl-1.9/cblas/dsyr2.c13
-rw-r--r--gsl-1.9/cblas/dsyr2k.c15
-rw-r--r--gsl-1.9/cblas/dsyrk.c14
-rw-r--r--gsl-1.9/cblas/dtbmv.c14
-rw-r--r--gsl-1.9/cblas/dtbsv.c14
-rw-r--r--gsl-1.9/cblas/dtpmv.c13
-rw-r--r--gsl-1.9/cblas/dtpsv.c13
-rw-r--r--gsl-1.9/cblas/dtrmm.c15
-rw-r--r--gsl-1.9/cblas/dtrmv.c14
-rw-r--r--gsl-1.9/cblas/dtrsm.c15
-rw-r--r--gsl-1.9/cblas/dtrsv.c14
-rw-r--r--gsl-1.9/cblas/dzasum.c11
-rw-r--r--gsl-1.9/cblas/dznrm2.c11
-rw-r--r--gsl-1.9/cblas/gsl_cblas.h606
-rw-r--r--gsl-1.9/cblas/hypot.c28
-rw-r--r--gsl-1.9/cblas/icamax.c11
-rw-r--r--gsl-1.9/cblas/idamax.c11
-rw-r--r--gsl-1.9/cblas/isamax.c11
-rw-r--r--gsl-1.9/cblas/izamax.c11
-rw-r--r--gsl-1.9/cblas/sasum.c11
-rw-r--r--gsl-1.9/cblas/saxpy.c12
-rw-r--r--gsl-1.9/cblas/scasum.c11
-rw-r--r--gsl-1.9/cblas/scnrm2.c11
-rw-r--r--gsl-1.9/cblas/scopy.c12
-rw-r--r--gsl-1.9/cblas/sdot.c16
-rw-r--r--gsl-1.9/cblas/sdsdot.c16
-rw-r--r--gsl-1.9/cblas/sgbmv.c14
-rw-r--r--gsl-1.9/cblas/sgemm.c15
-rw-r--r--gsl-1.9/cblas/sgemv.c14
-rw-r--r--gsl-1.9/cblas/sger.c13
-rw-r--r--gsl-1.9/cblas/snrm2.c11
-rw-r--r--gsl-1.9/cblas/source_asum_c.h34
-rw-r--r--gsl-1.9/cblas/source_asum_r.h34
-rw-r--r--gsl-1.9/cblas/source_axpy_c.h40
-rw-r--r--gsl-1.9/cblas/source_axpy_r.h50
-rw-r--r--gsl-1.9/cblas/source_copy_c.h31
-rw-r--r--gsl-1.9/cblas/source_copy_r.h30
-rw-r--r--gsl-1.9/cblas/source_dot_c.h38
-rw-r--r--gsl-1.9/cblas/source_dot_r.h33
-rw-r--r--gsl-1.9/cblas/source_gbmv_c.h170
-rw-r--r--gsl-1.9/cblas/source_gbmv_r.h98
-rw-r--r--gsl-1.9/cblas/source_gemm_c.h167
-rw-r--r--gsl-1.9/cblas/source_gemm_r.h125
-rw-r--r--gsl-1.9/cblas/source_gemv_c.h158
-rw-r--r--gsl-1.9/cblas/source_gemv_r.h90
-rw-r--r--gsl-1.9/cblas/source_ger.h48
-rw-r--r--gsl-1.9/cblas/source_gerc.h63
-rw-r--r--gsl-1.9/cblas/source_geru.h62
-rw-r--r--gsl-1.9/cblas/source_hbmv.h145
-rw-r--r--gsl-1.9/cblas/source_hemm.h204
-rw-r--r--gsl-1.9/cblas/source_hemv.h136
-rw-r--r--gsl-1.9/cblas/source_her.h80
-rw-r--r--gsl-1.9/cblas/source_her2.h115
-rw-r--r--gsl-1.9/cblas/source_her2k.h269
-rw-r--r--gsl-1.9/cblas/source_herk.h161
-rw-r--r--gsl-1.9/cblas/source_hpmv.h138
-rw-r--r--gsl-1.9/cblas/source_hpr.h80
-rw-r--r--gsl-1.9/cblas/source_hpr2.h115
-rw-r--r--gsl-1.9/cblas/source_iamax_c.h41
-rw-r--r--gsl-1.9/cblas/source_iamax_r.h39
-rw-r--r--gsl-1.9/cblas/source_nrm2_c.h60
-rw-r--r--gsl-1.9/cblas/source_nrm2_r.h50
-rw-r--r--gsl-1.9/cblas/source_rot.h32
-rw-r--r--gsl-1.9/cblas/source_rotg.h46
-rw-r--r--gsl-1.9/cblas/source_rotm.h58
-rw-r--r--gsl-1.9/cblas/source_rotmg.h162
-rw-r--r--gsl-1.9/cblas/source_sbmv.h100
-rw-r--r--gsl-1.9/cblas/source_scal_c.h39
-rw-r--r--gsl-1.9/cblas/source_scal_c_s.h35
-rw-r--r--gsl-1.9/cblas/source_scal_r.h34
-rw-r--r--gsl-1.9/cblas/source_spmv.h101
-rw-r--r--gsl-1.9/cblas/source_spr.h56
-rw-r--r--gsl-1.9/cblas/source_spr2.h66
-rw-r--r--gsl-1.9/cblas/source_swap_c.h35
-rw-r--r--gsl-1.9/cblas/source_swap_r.h31
-rw-r--r--gsl-1.9/cblas/source_symm_c.h203
-rw-r--r--gsl-1.9/cblas/source_symm_r.h131
-rw-r--r--gsl-1.9/cblas/source_symv.h93
-rw-r--r--gsl-1.9/cblas/source_syr.h56
-rw-r--r--gsl-1.9/cblas/source_syr2.h66
-rw-r--r--gsl-1.9/cblas/source_syr2k_c.h190
-rw-r--r--gsl-1.9/cblas/source_syr2k_r.h129
-rw-r--r--gsl-1.9/cblas/source_syrk_c.h164
-rw-r--r--gsl-1.9/cblas/source_syrk_r.h125
-rw-r--r--gsl-1.9/cblas/source_tbmv_c.h171
-rw-r--r--gsl-1.9/cblas/source_tbmv_r.h106
-rw-r--r--gsl-1.9/cblas/source_tbsv_c.h179
-rw-r--r--gsl-1.9/cblas/source_tbsv_r.h123
-rw-r--r--gsl-1.9/cblas/source_tpmv_c.h173
-rw-r--r--gsl-1.9/cblas/source_tpmv_r.h97
-rw-r--r--gsl-1.9/cblas/source_tpsv_c.h227
-rw-r--r--gsl-1.9/cblas/source_tpsv_r.h131
-rw-r--r--gsl-1.9/cblas/source_trmm_c.h330
-rw-r--r--gsl-1.9/cblas/source_trmm_r.h223
-rw-r--r--gsl-1.9/cblas/source_trmv_c.h169
-rw-r--r--gsl-1.9/cblas/source_trmv_r.h107
-rw-r--r--gsl-1.9/cblas/source_trsm_c.h397
-rw-r--r--gsl-1.9/cblas/source_trsm_r.h275
-rw-r--r--gsl-1.9/cblas/source_trsv_c.h228
-rw-r--r--gsl-1.9/cblas/source_trsv_r.h132
-rw-r--r--gsl-1.9/cblas/srot.c12
-rw-r--r--gsl-1.9/cblas/srotg.c11
-rw-r--r--gsl-1.9/cblas/srotm.c12
-rw-r--r--gsl-1.9/cblas/srotmg.c11
-rw-r--r--gsl-1.9/cblas/ssbmv.c14
-rw-r--r--gsl-1.9/cblas/sscal.c11
-rw-r--r--gsl-1.9/cblas/sspmv.c13
-rw-r--r--gsl-1.9/cblas/sspr.c13
-rw-r--r--gsl-1.9/cblas/sspr2.c13
-rw-r--r--gsl-1.9/cblas/sswap.c11
-rw-r--r--gsl-1.9/cblas/ssymm.c14
-rw-r--r--gsl-1.9/cblas/ssymv.c14
-rw-r--r--gsl-1.9/cblas/ssyr.c13
-rw-r--r--gsl-1.9/cblas/ssyr2.c13
-rw-r--r--gsl-1.9/cblas/ssyr2k.c15
-rw-r--r--gsl-1.9/cblas/ssyrk.c14
-rw-r--r--gsl-1.9/cblas/stbmv.c14
-rw-r--r--gsl-1.9/cblas/stbsv.c14
-rw-r--r--gsl-1.9/cblas/stpmv.c13
-rw-r--r--gsl-1.9/cblas/stpsv.c13
-rw-r--r--gsl-1.9/cblas/strmm.c15
-rw-r--r--gsl-1.9/cblas/strmv.c14
-rw-r--r--gsl-1.9/cblas/strsm.c15
-rw-r--r--gsl-1.9/cblas/strsv.c14
-rw-r--r--gsl-1.9/cblas/test.c38
-rw-r--r--gsl-1.9/cblas/test_amax.c142
-rw-r--r--gsl-1.9/cblas/test_asum.c143
-rw-r--r--gsl-1.9/cblas/test_axpy.c233
-rw-r--r--gsl-1.9/cblas/test_copy.c221
-rw-r--r--gsl-1.9/cblas/test_dot.c383
-rw-r--r--gsl-1.9/cblas/test_gbmv.c543
-rw-r--r--gsl-1.9/cblas/test_gemm.c1399
-rw-r--r--gsl-1.9/cblas/test_gemv.c503
-rw-r--r--gsl-1.9/cblas/test_ger.c283
-rw-r--r--gsl-1.9/cblas/test_hbmv.c411
-rw-r--r--gsl-1.9/cblas/test_hemm.c427
-rw-r--r--gsl-1.9/cblas/test_hemv.c395
-rw-r--r--gsl-1.9/cblas/test_her.c179
-rw-r--r--gsl-1.9/cblas/test_her2.c195
-rw-r--r--gsl-1.9/cblas/test_her2k.c427
-rw-r--r--gsl-1.9/cblas/test_herk.c395
-rw-r--r--gsl-1.9/cblas/test_hpmv.c379
-rw-r--r--gsl-1.9/cblas/test_hpr.c171
-rw-r--r--gsl-1.9/cblas/test_hpr2.c187
-rw-r--r--gsl-1.9/cblas/test_nrm2.c143
-rw-r--r--gsl-1.9/cblas/test_rot.c635
-rw-r--r--gsl-1.9/cblas/test_rotg.c1677
-rw-r--r--gsl-1.9/cblas/test_rotm.c1511
-rw-r--r--gsl-1.9/cblas/test_rotmg.c167
-rw-r--r--gsl-1.9/cblas/test_sbmv.c395
-rw-r--r--gsl-1.9/cblas/test_scal.c911
-rw-r--r--gsl-1.9/cblas/test_spmv.c363
-rw-r--r--gsl-1.9/cblas/test_spr.c163
-rw-r--r--gsl-1.9/cblas/test_spr2.c179
-rw-r--r--gsl-1.9/cblas/test_swap.c311
-rw-r--r--gsl-1.9/cblas/test_symm.c827
-rw-r--r--gsl-1.9/cblas/test_symv.c379
-rw-r--r--gsl-1.9/cblas/test_syr.c171
-rw-r--r--gsl-1.9/cblas/test_syr2.c187
-rw-r--r--gsl-1.9/cblas/test_syr2k.c827
-rw-r--r--gsl-1.9/cblas/test_syrk.c763
-rw-r--r--gsl-1.9/cblas/test_tbmv.c1819
-rw-r--r--gsl-1.9/cblas/test_tbsv.c1819
-rw-r--r--gsl-1.9/cblas/test_tpmv.c1659
-rw-r--r--gsl-1.9/cblas/test_tpsv.c1659
-rw-r--r--gsl-1.9/cblas/test_trmm.c3947
-rw-r--r--gsl-1.9/cblas/test_trmv.c1739
-rw-r--r--gsl-1.9/cblas/test_trsm.c3947
-rw-r--r--gsl-1.9/cblas/test_trsv.c1739
-rw-r--r--gsl-1.9/cblas/tests.c44
-rw-r--r--gsl-1.9/cblas/tests.h44
-rw-r--r--gsl-1.9/cblas/xerbla.c44
-rw-r--r--gsl-1.9/cblas/zaxpy.c12
-rw-r--r--gsl-1.9/cblas/zcopy.c12
-rw-r--r--gsl-1.9/cblas/zdotc_sub.c14
-rw-r--r--gsl-1.9/cblas/zdotu_sub.c14
-rw-r--r--gsl-1.9/cblas/zdscal.c11
-rw-r--r--gsl-1.9/cblas/zgbmv.c14
-rw-r--r--gsl-1.9/cblas/zgemm.c15
-rw-r--r--gsl-1.9/cblas/zgemv.c14
-rw-r--r--gsl-1.9/cblas/zgerc.c13
-rw-r--r--gsl-1.9/cblas/zgeru.c13
-rw-r--r--gsl-1.9/cblas/zhbmv.c14
-rw-r--r--gsl-1.9/cblas/zhemm.c14
-rw-r--r--gsl-1.9/cblas/zhemv.c14
-rw-r--r--gsl-1.9/cblas/zher.c13
-rw-r--r--gsl-1.9/cblas/zher2.c13
-rw-r--r--gsl-1.9/cblas/zher2k.c14
-rw-r--r--gsl-1.9/cblas/zherk.c14
-rw-r--r--gsl-1.9/cblas/zhpmv.c13
-rw-r--r--gsl-1.9/cblas/zhpr.c13
-rw-r--r--gsl-1.9/cblas/zhpr2.c13
-rw-r--r--gsl-1.9/cblas/zscal.c11
-rw-r--r--gsl-1.9/cblas/zswap.c11
-rw-r--r--gsl-1.9/cblas/zsymm.c14
-rw-r--r--gsl-1.9/cblas/zsyr2k.c14
-rw-r--r--gsl-1.9/cblas/zsyrk.c14
-rw-r--r--gsl-1.9/cblas/ztbmv.c14
-rw-r--r--gsl-1.9/cblas/ztbsv.c16
-rw-r--r--gsl-1.9/cblas/ztpmv.c13
-rw-r--r--gsl-1.9/cblas/ztpsv.c15
-rw-r--r--gsl-1.9/cblas/ztrmm.c15
-rw-r--r--gsl-1.9/cblas/ztrmv.c14
-rw-r--r--gsl-1.9/cblas/ztrsm.c17
-rw-r--r--gsl-1.9/cblas/ztrsv.c16
-rw-r--r--gsl-1.9/cdf/ChangeLog87
-rw-r--r--gsl-1.9/cdf/Makefile.am17
-rw-r--r--gsl-1.9/cdf/Makefile.in554
-rw-r--r--gsl-1.9/cdf/beta.c66
-rw-r--r--gsl-1.9/cdf/beta_inc.c177
-rw-r--r--gsl-1.9/cdf/betainv.c195
-rw-r--r--gsl-1.9/cdf/binomial.c108
-rw-r--r--gsl-1.9/cdf/cauchy.c59
-rw-r--r--gsl-1.9/cdf/cauchyinv.c75
-rw-r--r--gsl-1.9/cdf/chisq.c34
-rw-r--r--gsl-1.9/cdf/chisqinv.c34
-rw-r--r--gsl-1.9/cdf/error.h4
-rw-r--r--gsl-1.9/cdf/exponential.c59
-rw-r--r--gsl-1.9/cdf/exponentialinv.c39
-rw-r--r--gsl-1.9/cdf/exppow.c70
-rw-r--r--gsl-1.9/cdf/fdist.c81
-rw-r--r--gsl-1.9/cdf/fdistinv.c104
-rw-r--r--gsl-1.9/cdf/flat.c65
-rw-r--r--gsl-1.9/cdf/flatinv.c59
-rw-r--r--gsl-1.9/cdf/gamma.c74
-rw-r--r--gsl-1.9/cdf/gammainv.c185
-rw-r--r--gsl-1.9/cdf/gauss.c351
-rw-r--r--gsl-1.9/cdf/gaussinv.c202
-rw-r--r--gsl-1.9/cdf/geometric.c89
-rw-r--r--gsl-1.9/cdf/gsl_cdf.h170
-rw-r--r--gsl-1.9/cdf/gumbel1.c49
-rw-r--r--gsl-1.9/cdf/gumbel1inv.c61
-rw-r--r--gsl-1.9/cdf/gumbel2.c59
-rw-r--r--gsl-1.9/cdf/gumbel2inv.c61
-rw-r--r--gsl-1.9/cdf/hypergeometric.c183
-rw-r--r--gsl-1.9/cdf/laplace.c59
-rw-r--r--gsl-1.9/cdf/laplaceinv.c75
-rw-r--r--gsl-1.9/cdf/logistic.c59
-rw-r--r--gsl-1.9/cdf/logisticinv.c61
-rw-r--r--gsl-1.9/cdf/lognormal.c39
-rw-r--r--gsl-1.9/cdf/lognormalinv.c65
-rw-r--r--gsl-1.9/cdf/nbinomial.c83
-rw-r--r--gsl-1.9/cdf/pareto.c57
-rw-r--r--gsl-1.9/cdf/paretoinv.c61
-rw-r--r--gsl-1.9/cdf/pascal.c40
-rw-r--r--gsl-1.9/cdf/poisson.c84
-rw-r--r--gsl-1.9/cdf/rat_eval.h25
-rw-r--r--gsl-1.9/cdf/rayleigh.c39
-rw-r--r--gsl-1.9/cdf/rayleighinv.c61
-rw-r--r--gsl-1.9/cdf/tdist.c271
-rw-r--r--gsl-1.9/cdf/tdistinv.c232
-rw-r--r--gsl-1.9/cdf/test.c1327
-rw-r--r--gsl-1.9/cdf/test_auto.c1464
-rw-r--r--gsl-1.9/cdf/weibull.c37
-rw-r--r--gsl-1.9/cdf/weibullinv.c61
-rw-r--r--gsl-1.9/cheb/ChangeLog54
-rw-r--r--gsl-1.9/cheb/Makefile.am17
-rw-r--r--gsl-1.9/cheb/Makefile.in543
-rw-r--r--gsl-1.9/cheb/deriv.c63
-rw-r--r--gsl-1.9/cheb/eval.c206
-rw-r--r--gsl-1.9/cheb/gsl_chebyshev.h129
-rw-r--r--gsl-1.9/cheb/init.c101
-rw-r--r--gsl-1.9/cheb/integ.c65
-rw-r--r--gsl-1.9/cheb/test.c208
-rw-r--r--gsl-1.9/combination/ChangeLog28
-rw-r--r--gsl-1.9/combination/Makefile.am25
-rw-r--r--gsl-1.9/combination/Makefile.in551
-rw-r--r--gsl-1.9/combination/combination.c189
-rw-r--r--gsl-1.9/combination/file.c114
-rw-r--r--gsl-1.9/combination/gsl_combination.h91
-rw-r--r--gsl-1.9/combination/init.c126
-rw-r--r--gsl-1.9/combination/test.c261
-rw-r--r--gsl-1.9/complex/ChangeLog48
-rw-r--r--gsl-1.9/complex/Makefile.am15
-rw-r--r--gsl-1.9/complex/Makefile.in545
-rw-r--r--gsl-1.9/complex/TODO16
-rw-r--r--gsl-1.9/complex/gsl_complex.h103
-rw-r--r--gsl-1.9/complex/gsl_complex_math.h140
-rw-r--r--gsl-1.9/complex/math.c1007
-rw-r--r--gsl-1.9/complex/results.h4573
-rw-r--r--gsl-1.9/complex/results1.h583
-rw-r--r--gsl-1.9/complex/results_real.h115
-rw-r--r--gsl-1.9/complex/test.c159
-rwxr-xr-xgsl-1.9/config.guess1471
-rw-r--r--gsl-1.9/config.h.in282
-rwxr-xr-xgsl-1.9/config.sub1599
-rwxr-xr-xgsl-1.9/configure13023
-rw-r--r--gsl-1.9/configure.ac368
-rw-r--r--gsl-1.9/const/ChangeLog72
-rw-r--r--gsl-1.9/const/Makefile.am15
-rw-r--r--gsl-1.9/const/Makefile.in524
-rw-r--r--gsl-1.9/const/TODO1
-rw-r--r--gsl-1.9/const/gsl_const.h31
-rw-r--r--gsl-1.9/const/gsl_const_cgs.h123
-rw-r--r--gsl-1.9/const/gsl_const_cgsm.h123
-rw-r--r--gsl-1.9/const/gsl_const_mks.h126
-rw-r--r--gsl-1.9/const/gsl_const_mksa.h126
-rw-r--r--gsl-1.9/const/gsl_const_num.h43
-rw-r--r--gsl-1.9/const/test.c97
-rw-r--r--gsl-1.9/deriv/ChangeLog4
-rw-r--r--gsl-1.9/deriv/Makefile.am16
-rw-r--r--gsl-1.9/deriv/Makefile.in546
-rw-r--r--gsl-1.9/deriv/deriv.c174
-rw-r--r--gsl-1.9/deriv/gsl_deriv.h50
-rw-r--r--gsl-1.9/deriv/test.c209
-rw-r--r--gsl-1.9/dht/ChangeLog6
-rw-r--r--gsl-1.9/dht/Makefile.am15
-rw-r--r--gsl-1.9/dht/Makefile.in544
-rw-r--r--gsl-1.9/dht/dht.c225
-rw-r--r--gsl-1.9/dht/gsl_dht.h87
-rw-r--r--gsl-1.9/dht/test.c193
-rw-r--r--gsl-1.9/diff/ChangeLog13
-rw-r--r--gsl-1.9/diff/Makefile.am16
-rw-r--r--gsl-1.9/diff/Makefile.in546
-rw-r--r--gsl-1.9/diff/diff.c180
-rw-r--r--gsl-1.9/diff/gsl_diff.h50
-rw-r--r--gsl-1.9/diff/test.c195
-rw-r--r--gsl-1.9/doc/12-cities.eps15622
-rw-r--r--gsl-1.9/doc/ChangeLog62
-rw-r--r--gsl-1.9/doc/Makefile.am21
-rw-r--r--gsl-1.9/doc/Makefile.in674
-rw-r--r--gsl-1.9/doc/algorithm.sty79
-rw-r--r--gsl-1.9/doc/algorithmic.sty158
-rw-r--r--gsl-1.9/doc/autoconf.texi132
-rw-r--r--gsl-1.9/doc/blas.texi686
-rw-r--r--gsl-1.9/doc/bspline.eps6930
-rw-r--r--gsl-1.9/doc/bspline.texi158
-rw-r--r--gsl-1.9/doc/calc.sty150
-rw-r--r--gsl-1.9/doc/cblas.texi514
-rw-r--r--gsl-1.9/doc/cheb.eps3348
-rw-r--r--gsl-1.9/doc/cheb.texi177
-rw-r--r--gsl-1.9/doc/combination.texi221
-rw-r--r--gsl-1.9/doc/complex.texi493
-rw-r--r--gsl-1.9/doc/const.texi575
-rw-r--r--gsl-1.9/doc/debug.texi389
-rw-r--r--gsl-1.9/doc/dht.texi152
-rw-r--r--gsl-1.9/doc/diff.texi105
-rw-r--r--gsl-1.9/doc/dwt-orig.eps2657
-rw-r--r--gsl-1.9/doc/dwt-samp.eps2657
-rw-r--r--gsl-1.9/doc/dwt.texi449
-rw-r--r--gsl-1.9/doc/eigen.texi462
-rw-r--r--gsl-1.9/doc/err.texi306
-rw-r--r--gsl-1.9/doc/examples/blas.c31
-rw-r--r--gsl-1.9/doc/examples/blas.out2
-rw-r--r--gsl-1.9/doc/examples/block.c14
-rw-r--r--gsl-1.9/doc/examples/block.out2
-rw-r--r--gsl-1.9/doc/examples/bspline.c116
-rw-r--r--gsl-1.9/doc/examples/cblas.c33
-rw-r--r--gsl-1.9/doc/examples/cblas.out2
-rw-r--r--gsl-1.9/doc/examples/cdf.c23
-rw-r--r--gsl-1.9/doc/examples/cdf.out4
-rw-r--r--gsl-1.9/doc/examples/cheb.c40
-rw-r--r--gsl-1.9/doc/examples/combination.c25
-rw-r--r--gsl-1.9/doc/examples/combination.out17
-rw-r--r--gsl-1.9/doc/examples/const.c25
-rw-r--r--gsl-1.9/doc/examples/const.out3
-rw-r--r--gsl-1.9/doc/examples/demo_fn.c40
-rw-r--r--gsl-1.9/doc/examples/demo_fn.h9
-rw-r--r--gsl-1.9/doc/examples/diff.c32
-rw-r--r--gsl-1.9/doc/examples/diff.out8
-rw-r--r--gsl-1.9/doc/examples/dwt.c54
-rw-r--r--gsl-1.9/doc/examples/dwt.dat256
-rw-r--r--gsl-1.9/doc/examples/ecg.dat256
-rw-r--r--gsl-1.9/doc/examples/eigen.c50
-rw-r--r--gsl-1.9/doc/examples/eigen_nonsymm.c54
-rw-r--r--gsl-1.9/doc/examples/expfit.c70
-rw-r--r--gsl-1.9/doc/examples/fft.c43
-rw-r--r--gsl-1.9/doc/examples/fftmr.c60
-rw-r--r--gsl-1.9/doc/examples/fftreal.c59
-rw-r--r--gsl-1.9/doc/examples/fitting.c45
-rw-r--r--gsl-1.9/doc/examples/fitting2.c80
-rw-r--r--gsl-1.9/doc/examples/fitting3.c29
-rw-r--r--gsl-1.9/doc/examples/histogram.c37
-rw-r--r--gsl-1.9/doc/examples/histogram2d.c50
-rw-r--r--gsl-1.9/doc/examples/ieee.c22
-rw-r--r--gsl-1.9/doc/examples/ieeeround.c30
-rw-r--r--gsl-1.9/doc/examples/integration.c37
-rw-r--r--gsl-1.9/doc/examples/integration.out5
-rw-r--r--gsl-1.9/doc/examples/interp.c41
-rw-r--r--gsl-1.9/doc/examples/interpp.c40
-rw-r--r--gsl-1.9/doc/examples/intro.c11
-rw-r--r--gsl-1.9/doc/examples/intro.out1
-rw-r--r--gsl-1.9/doc/examples/linalglu.c36
-rw-r--r--gsl-1.9/doc/examples/linalglu.out4
-rw-r--r--gsl-1.9/doc/examples/matrix.c22
-rw-r--r--gsl-1.9/doc/examples/matrixw.c40
-rw-r--r--gsl-1.9/doc/examples/min.c65
-rw-r--r--gsl-1.9/doc/examples/min.out13
-rw-r--r--gsl-1.9/doc/examples/monte.c106
-rw-r--r--gsl-1.9/doc/examples/nlfit.c115
-rw-r--r--gsl-1.9/doc/examples/ntupler.c72
-rw-r--r--gsl-1.9/doc/examples/ntuplew.c43
-rw-r--r--gsl-1.9/doc/examples/ode-initval.c70
-rw-r--r--gsl-1.9/doc/examples/odefixed.c42
-rw-r--r--gsl-1.9/doc/examples/permseq.c21
-rw-r--r--gsl-1.9/doc/examples/permshuffle.c40
-rw-r--r--gsl-1.9/doc/examples/polyroots.c26
-rw-r--r--gsl-1.9/doc/examples/polyroots.out5
-rw-r--r--gsl-1.9/doc/examples/qrng.c19
-rw-r--r--gsl-1.9/doc/examples/randpoisson.2.out2
-rw-r--r--gsl-1.9/doc/examples/randpoisson.c35
-rw-r--r--gsl-1.9/doc/examples/randpoisson.out1
-rw-r--r--gsl-1.9/doc/examples/randwalk.c29
-rw-r--r--gsl-1.9/doc/examples/rng.c22
-rw-r--r--gsl-1.9/doc/examples/rng.out3
-rw-r--r--gsl-1.9/doc/examples/rngunif.2.out12
-rw-r--r--gsl-1.9/doc/examples/rngunif.c26
-rw-r--r--gsl-1.9/doc/examples/rngunif.out10
-rw-r--r--gsl-1.9/doc/examples/rootnewt.c52
-rw-r--r--gsl-1.9/doc/examples/roots.c58
-rw-r--r--gsl-1.9/doc/examples/siman.c82
-rw-r--r--gsl-1.9/doc/examples/sortsmall.c38
-rw-r--r--gsl-1.9/doc/examples/sortsmall.out6
-rw-r--r--gsl-1.9/doc/examples/specfun.c15
-rw-r--r--gsl-1.9/doc/examples/specfun.out2
-rw-r--r--gsl-1.9/doc/examples/specfun_e.c21
-rw-r--r--gsl-1.9/doc/examples/specfun_e.out4
-rw-r--r--gsl-1.9/doc/examples/stat.c23
-rw-r--r--gsl-1.9/doc/examples/stat.out5
-rw-r--r--gsl-1.9/doc/examples/statsort.c36
-rw-r--r--gsl-1.9/doc/examples/statsort.out5
-rw-r--r--gsl-1.9/doc/examples/sum.c47
-rw-r--r--gsl-1.9/doc/examples/sum.out6
-rw-r--r--gsl-1.9/doc/examples/vector.c22
-rw-r--r--gsl-1.9/doc/examples/vectorr.c23
-rw-r--r--gsl-1.9/doc/examples/vectorview.c30
-rw-r--r--gsl-1.9/doc/examples/vectorview.out10
-rw-r--r--gsl-1.9/doc/examples/vectorw.c23
-rw-r--r--gsl-1.9/doc/fdl.texi455
-rw-r--r--gsl-1.9/doc/fft-complex-radix2-f.eps298
-rw-r--r--gsl-1.9/doc/fft-complex-radix2-t.eps426
-rw-r--r--gsl-1.9/doc/fft-complex-radix2.eps682
-rw-r--r--gsl-1.9/doc/fft-real-mixedradix.eps606
-rw-r--r--gsl-1.9/doc/fft.texi1001
-rw-r--r--gsl-1.9/doc/fftalgorithms.bib240
-rw-r--r--gsl-1.9/doc/fftalgorithms.tex3296
-rw-r--r--gsl-1.9/doc/final-route.eps11635
-rw-r--r--gsl-1.9/doc/fit-exp.eps767
-rw-r--r--gsl-1.9/doc/fit-wlinear.eps6958
-rw-r--r--gsl-1.9/doc/fit-wlinear2.eps5908
-rw-r--r--gsl-1.9/doc/fitting.texi501
-rw-r--r--gsl-1.9/doc/freemanuals.texi99
-rw-r--r--gsl-1.9/doc/gpl.texi407
-rw-r--r--gsl-1.9/doc/gsl-config.142
-rw-r--r--gsl-1.9/doc/gsl-design.texi1610
-rw-r--r--gsl-1.9/doc/gsl-histogram.142
-rw-r--r--gsl-1.9/doc/gsl-randist.138
-rw-r--r--gsl-1.9/doc/gsl-ref.info596
-rw-r--r--gsl-1.9/doc/gsl-ref.info-17392
-rw-r--r--gsl-1.9/doc/gsl-ref.info-27071
-rw-r--r--gsl-1.9/doc/gsl-ref.info-37520
-rw-r--r--gsl-1.9/doc/gsl-ref.info-44426
-rw-r--r--gsl-1.9/doc/gsl-ref.info-5bin0 -> 239614 bytes
-rw-r--r--gsl-1.9/doc/gsl-ref.info-6bin0 -> 98831 bytes
-rw-r--r--gsl-1.9/doc/gsl-ref.texi647
-rw-r--r--gsl-1.9/doc/gsl.358
-rw-r--r--gsl-1.9/doc/histogram.eps3088
-rw-r--r--gsl-1.9/doc/histogram.texi1173
-rw-r--r--gsl-1.9/doc/histogram2d.eps776
-rw-r--r--gsl-1.9/doc/ieee754.texi461
-rw-r--r--gsl-1.9/doc/initial-route.eps11867
-rw-r--r--gsl-1.9/doc/integration.texi854
-rw-r--r--gsl-1.9/doc/interp.texi318
-rw-r--r--gsl-1.9/doc/interp2.eps3252
-rw-r--r--gsl-1.9/doc/interpp2.eps2004
-rw-r--r--gsl-1.9/doc/intro.texi247
-rw-r--r--gsl-1.9/doc/landau.dat201
-rw-r--r--gsl-1.9/doc/linalg.texi1117
-rw-r--r--gsl-1.9/doc/math.texi339
-rwxr-xr-xgsl-1.9/doc/mdate-sh193
-rw-r--r--gsl-1.9/doc/min-interval.eps330
-rw-r--r--gsl-1.9/doc/min.texi400
-rw-r--r--gsl-1.9/doc/montecarlo.texi718
-rw-r--r--gsl-1.9/doc/multifit.texi645
-rw-r--r--gsl-1.9/doc/multimin.eps778
-rw-r--r--gsl-1.9/doc/multimin.texi752
-rw-r--r--gsl-1.9/doc/multiroots.texi1083
-rw-r--r--gsl-1.9/doc/ntuple.eps555
-rw-r--r--gsl-1.9/doc/ntuple.texi194
-rw-r--r--gsl-1.9/doc/ode-initval.texi556
-rw-r--r--gsl-1.9/doc/permutation.texi377
-rw-r--r--gsl-1.9/doc/poly.texi302
-rw-r--r--gsl-1.9/doc/qrng.eps1420
-rw-r--r--gsl-1.9/doc/qrng.texi163
-rw-r--r--gsl-1.9/doc/rand-bernoulli.tex695
-rw-r--r--gsl-1.9/doc/rand-beta.tex1335
-rw-r--r--gsl-1.9/doc/rand-binomial.tex774
-rw-r--r--gsl-1.9/doc/rand-bivariate-gaussian.tex1264
-rw-r--r--gsl-1.9/doc/rand-cauchy.tex1054
-rw-r--r--gsl-1.9/doc/rand-chisq.tex1307
-rw-r--r--gsl-1.9/doc/rand-erlang.tex1330
-rw-r--r--gsl-1.9/doc/rand-exponential.tex1009
-rw-r--r--gsl-1.9/doc/rand-exppow.tex1054
-rw-r--r--gsl-1.9/doc/rand-fdist.tex992
-rw-r--r--gsl-1.9/doc/rand-flat.tex1023
-rw-r--r--gsl-1.9/doc/rand-gamma.tex1330
-rw-r--r--gsl-1.9/doc/rand-gaussian-tail.tex718
-rw-r--r--gsl-1.9/doc/rand-gaussian.tex1059
-rw-r--r--gsl-1.9/doc/rand-geometric.tex753
-rw-r--r--gsl-1.9/doc/rand-gumbel.tex966
-rw-r--r--gsl-1.9/doc/rand-gumbel1.tex733
-rw-r--r--gsl-1.9/doc/rand-gumbel2.tex728
-rw-r--r--gsl-1.9/doc/rand-hypergeometric.tex592
-rw-r--r--gsl-1.9/doc/rand-landau.tex602
-rw-r--r--gsl-1.9/doc/rand-laplace.tex1059
-rw-r--r--gsl-1.9/doc/rand-levy.tex1054
-rw-r--r--gsl-1.9/doc/rand-levyskew.tex728
-rw-r--r--gsl-1.9/doc/rand-logarithmic.tex794
-rw-r--r--gsl-1.9/doc/rand-logistic.tex1049
-rw-r--r--gsl-1.9/doc/rand-lognormal.tex1002
-rw-r--r--gsl-1.9/doc/rand-nbinomial.tex774
-rw-r--r--gsl-1.9/doc/rand-pareto.tex1029
-rw-r--r--gsl-1.9/doc/rand-pascal.tex772
-rw-r--r--gsl-1.9/doc/rand-poisson.tex774
-rw-r--r--gsl-1.9/doc/rand-rayleigh-tail.tex1019
-rw-r--r--gsl-1.9/doc/rand-rayleigh.tex1044
-rw-r--r--gsl-1.9/doc/rand-tdist.tex1049
-rw-r--r--gsl-1.9/doc/rand-weibull.tex1330
-rw-r--r--gsl-1.9/doc/randist.texi2296
-rw-r--r--gsl-1.9/doc/random-walk.tex571
-rw-r--r--gsl-1.9/doc/randplots.gnp374
-rw-r--r--gsl-1.9/doc/rng.texi1456
-rw-r--r--gsl-1.9/doc/roots-bisection.eps1784
-rw-r--r--gsl-1.9/doc/roots-false-position.eps633
-rw-r--r--gsl-1.9/doc/roots-newtons-method.eps567
-rw-r--r--gsl-1.9/doc/roots-secant-method.eps510
-rw-r--r--gsl-1.9/doc/roots.texi928
-rw-r--r--gsl-1.9/doc/siman-energy.eps11782
-rw-r--r--gsl-1.9/doc/siman-test.eps11278
-rw-r--r--gsl-1.9/doc/siman.texi371
-rw-r--r--gsl-1.9/doc/sort.texi315
-rw-r--r--gsl-1.9/doc/specfunc-airy.texi130
-rw-r--r--gsl-1.9/doc/specfunc-bessel.texi585
-rw-r--r--gsl-1.9/doc/specfunc-clausen.texi28
-rw-r--r--gsl-1.9/doc/specfunc-coulomb.texi151
-rw-r--r--gsl-1.9/doc/specfunc-coupling.texi109
-rw-r--r--gsl-1.9/doc/specfunc-dawson.texi12
-rw-r--r--gsl-1.9/doc/specfunc-debye.texi63
-rw-r--r--gsl-1.9/doc/specfunc-dilog.texi33
-rw-r--r--gsl-1.9/doc/specfunc-elementary.texi23
-rw-r--r--gsl-1.9/doc/specfunc-ellint.texi198
-rw-r--r--gsl-1.9/doc/specfunc-elljac.texi13
-rw-r--r--gsl-1.9/doc/specfunc-erf.texi99
-rw-r--r--gsl-1.9/doc/specfunc-exp.texi135
-rw-r--r--gsl-1.9/doc/specfunc-expint.texi155
-rw-r--r--gsl-1.9/doc/specfunc-fermi-dirac.texi122
-rw-r--r--gsl-1.9/doc/specfunc-gamma.texi314
-rw-r--r--gsl-1.9/doc/specfunc-gegenbauer.texi42
-rw-r--r--gsl-1.9/doc/specfunc-hyperg.texi108
-rw-r--r--gsl-1.9/doc/specfunc-laguerre.texi40
-rw-r--r--gsl-1.9/doc/specfunc-lambert.texi28
-rw-r--r--gsl-1.9/doc/specfunc-legendre.texi272
-rw-r--r--gsl-1.9/doc/specfunc-log.texi47
-rw-r--r--gsl-1.9/doc/specfunc-mathieu.texi257
-rw-r--r--gsl-1.9/doc/specfunc-pow-int.texi22
-rw-r--r--gsl-1.9/doc/specfunc-psi.texi90
-rw-r--r--gsl-1.9/doc/specfunc-synchrotron.texi24
-rw-r--r--gsl-1.9/doc/specfunc-transport.texi34
-rw-r--r--gsl-1.9/doc/specfunc-trig.texi160
-rw-r--r--gsl-1.9/doc/specfunc-zeta.texi98
-rw-r--r--gsl-1.9/doc/specfunc.texi352
-rw-r--r--gsl-1.9/doc/stamp-vti4
-rw-r--r--gsl-1.9/doc/statistics.texi741
-rw-r--r--gsl-1.9/doc/sum.texi186
-rw-r--r--gsl-1.9/doc/texinfo.tex7086
-rw-r--r--gsl-1.9/doc/usage.texi489
-rw-r--r--gsl-1.9/doc/vdp.eps1082
-rw-r--r--gsl-1.9/doc/vectors.texi1616
-rw-r--r--gsl-1.9/doc/version-ref.texi4
-rw-r--r--gsl-1.9/eigen/ChangeLog93
-rw-r--r--gsl-1.9/eigen/Makefile.am17
-rw-r--r--gsl-1.9/eigen/Makefile.in549
-rw-r--r--gsl-1.9/eigen/TODO15
-rw-r--r--gsl-1.9/eigen/francis.c783
-rw-r--r--gsl-1.9/eigen/gsl_eigen.h210
-rw-r--r--gsl-1.9/eigen/herm.c181
-rw-r--r--gsl-1.9/eigen/hermv.c249
-rw-r--r--gsl-1.9/eigen/jacobi.c259
-rw-r--r--gsl-1.9/eigen/nonsymm.c285
-rw-r--r--gsl-1.9/eigen/nonsymmv.c1470
-rw-r--r--gsl-1.9/eigen/qrstep.c178
-rw-r--r--gsl-1.9/eigen/schur.c372
-rw-r--r--gsl-1.9/eigen/schur.h33
-rw-r--r--gsl-1.9/eigen/sort.c235
-rw-r--r--gsl-1.9/eigen/symm.c179
-rw-r--r--gsl-1.9/eigen/symmv.c215
-rw-r--r--gsl-1.9/eigen/test.c622
-rw-r--r--gsl-1.9/err/ChangeLog161
-rw-r--r--gsl-1.9/err/Makefile.am12
-rw-r--r--gsl-1.9/err/Makefile.in541
-rw-r--r--gsl-1.9/err/TODO3
-rw-r--r--gsl-1.9/err/error.c78
-rw-r--r--gsl-1.9/err/gsl_errno.h154
-rw-r--r--gsl-1.9/err/gsl_message.h80
-rw-r--r--gsl-1.9/err/message.c38
-rw-r--r--gsl-1.9/err/stream.c66
-rw-r--r--gsl-1.9/err/strerror.c101
-rw-r--r--gsl-1.9/err/test.c116
-rw-r--r--gsl-1.9/fft/ChangeLog128
-rw-r--r--gsl-1.9/fft/Makefile.am21
-rw-r--r--gsl-1.9/fft/Makefile.in547
-rw-r--r--gsl-1.9/fft/TODO14
-rw-r--r--gsl-1.9/fft/bitreverse.c101
-rw-r--r--gsl-1.9/fft/bitreverse.h33
-rw-r--r--gsl-1.9/fft/c_init.c194
-rw-r--r--gsl-1.9/fft/c_main.c223
-rw-r--r--gsl-1.9/fft/c_pass.h106
-rw-r--r--gsl-1.9/fft/c_pass_2.c98
-rw-r--r--gsl-1.9/fft/c_pass_3.c127
-rw-r--r--gsl-1.9/fft/c_pass_4.c147
-rw-r--r--gsl-1.9/fft/c_pass_5.c205
-rw-r--r--gsl-1.9/fft/c_pass_6.c220
-rw-r--r--gsl-1.9/fft/c_pass_7.c312
-rw-r--r--gsl-1.9/fft/c_pass_n.c204
-rw-r--r--gsl-1.9/fft/c_radix2.c316
-rw-r--r--gsl-1.9/fft/compare.h30
-rw-r--r--gsl-1.9/fft/compare_source.c125
-rw-r--r--gsl-1.9/fft/complex_internal.h14
-rw-r--r--gsl-1.9/fft/dft.c25
-rw-r--r--gsl-1.9/fft/dft_source.c104
-rw-r--r--gsl-1.9/fft/factorize.c176
-rw-r--r--gsl-1.9/fft/factorize.h29
-rw-r--r--gsl-1.9/fft/fft.c117
-rw-r--r--gsl-1.9/fft/gsl_dft_complex.h55
-rw-r--r--gsl-1.9/fft/gsl_dft_complex_float.h55
-rw-r--r--gsl-1.9/fft/gsl_fft.h60
-rw-r--r--gsl-1.9/fft/gsl_fft_complex.h136
-rw-r--r--gsl-1.9/fft/gsl_fft_complex_float.h139
-rw-r--r--gsl-1.9/fft/gsl_fft_halfcomplex.h86
-rw-r--r--gsl-1.9/fft/gsl_fft_halfcomplex_float.h86
-rw-r--r--gsl-1.9/fft/gsl_fft_real.h80
-rw-r--r--gsl-1.9/fft/gsl_fft_real_float.h79
-rw-r--r--gsl-1.9/fft/hc_init.c128
-rw-r--r--gsl-1.9/fft/hc_main.c188
-rw-r--r--gsl-1.9/fft/hc_pass.h76
-rw-r--r--gsl-1.9/fft/hc_pass_2.c106
-rw-r--r--gsl-1.9/fft/hc_pass_3.c162
-rw-r--r--gsl-1.9/fft/hc_pass_4.c189
-rw-r--r--gsl-1.9/fft/hc_pass_5.c264
-rw-r--r--gsl-1.9/fft/hc_pass_n.c257
-rw-r--r--gsl-1.9/fft/hc_radix2.c173
-rw-r--r--gsl-1.9/fft/hc_unpack.c90
-rw-r--r--gsl-1.9/fft/real_init.c183
-rw-r--r--gsl-1.9/fft/real_main.c145
-rw-r--r--gsl-1.9/fft/real_pass.h65
-rw-r--r--gsl-1.9/fft/real_pass_2.c116
-rw-r--r--gsl-1.9/fft/real_pass_3.c166
-rw-r--r--gsl-1.9/fft/real_pass_4.c203
-rw-r--r--gsl-1.9/fft/real_pass_5.c283
-rw-r--r--gsl-1.9/fft/real_pass_n.c264
-rw-r--r--gsl-1.9/fft/real_radix2.c134
-rw-r--r--gsl-1.9/fft/real_unpack.c42
-rw-r--r--gsl-1.9/fft/signals.c26
-rw-r--r--gsl-1.9/fft/signals.h64
-rw-r--r--gsl-1.9/fft/signals_source.c288
-rw-r--r--gsl-1.9/fft/test.c126
-rw-r--r--gsl-1.9/fft/test_complex_source.c448
-rw-r--r--gsl-1.9/fft/test_real_source.c235
-rw-r--r--gsl-1.9/fft/test_trap_source.c138
-rw-r--r--gsl-1.9/fft/urand.c26
-rw-r--r--gsl-1.9/fit/ChangeLog8
-rw-r--r--gsl-1.9/fit/Makefile.am18
-rw-r--r--gsl-1.9/fit/Makefile.in546
-rw-r--r--gsl-1.9/fit/gsl_fit.h85
-rw-r--r--gsl-1.9/fit/linear.c346
-rw-r--r--gsl-1.9/fit/test.c173
-rwxr-xr-xgsl-1.9/gsl-config.in80
-rw-r--r--gsl-1.9/gsl-histogram.c78
-rw-r--r--gsl-1.9/gsl-randist.c393
-rw-r--r--gsl-1.9/gsl.m4168
-rw-r--r--gsl-1.9/gsl.pc.in10
-rw-r--r--gsl-1.9/gsl.spec.in80
-rw-r--r--gsl-1.9/gsl/Makefile.am17
-rw-r--r--gsl-1.9/gsl/Makefile.in334
-rw-r--r--gsl-1.9/gsl_machine.h104
-rw-r--r--gsl-1.9/gsl_math.h226
-rw-r--r--gsl-1.9/gsl_mode.h87
-rw-r--r--gsl-1.9/gsl_nan.h45
-rw-r--r--gsl-1.9/gsl_pow_int.h68
-rw-r--r--gsl-1.9/gsl_precision.h66
-rw-r--r--gsl-1.9/gsl_types.h41
-rw-r--r--gsl-1.9/gsl_version.h.in24
-rw-r--r--gsl-1.9/histogram/ChangeLog156
-rw-r--r--gsl-1.9/histogram/Makefile.am20
-rw-r--r--gsl-1.9/histogram/Makefile.in553
-rw-r--r--gsl-1.9/histogram/TODO3
-rw-r--r--gsl-1.9/histogram/add.c55
-rw-r--r--gsl-1.9/histogram/add2d.c66
-rw-r--r--gsl-1.9/histogram/calloc_range.c108
-rw-r--r--gsl-1.9/histogram/calloc_range2d.c153
-rw-r--r--gsl-1.9/histogram/copy.c91
-rw-r--r--gsl-1.9/histogram/copy2d.c96
-rw-r--r--gsl-1.9/histogram/file.c127
-rw-r--r--gsl-1.9/histogram/file2d.c184
-rw-r--r--gsl-1.9/histogram/find.c86
-rw-r--r--gsl-1.9/histogram/find2d.c50
-rw-r--r--gsl-1.9/histogram/get.c69
-rw-r--r--gsl-1.9/histogram/get2d.c101
-rw-r--r--gsl-1.9/histogram/gsl_histogram.h134
-rw-r--r--gsl-1.9/histogram/gsl_histogram2d.h172
-rw-r--r--gsl-1.9/histogram/init.c198
-rw-r--r--gsl-1.9/histogram/init2d.c300
-rw-r--r--gsl-1.9/histogram/maxval.c101
-rw-r--r--gsl-1.9/histogram/maxval2d.c140
-rw-r--r--gsl-1.9/histogram/oper.c195
-rw-r--r--gsl-1.9/histogram/oper2d.c203
-rw-r--r--gsl-1.9/histogram/params.c42
-rw-r--r--gsl-1.9/histogram/params2d.c60
-rw-r--r--gsl-1.9/histogram/pdf.c153
-rw-r--r--gsl-1.9/histogram/pdf2d.c186
-rw-r--r--gsl-1.9/histogram/reset.c34
-rw-r--r--gsl-1.9/histogram/reset2d.c35
-rw-r--r--gsl-1.9/histogram/stat.c140
-rw-r--r--gsl-1.9/histogram/stat2d.c266
-rw-r--r--gsl-1.9/histogram/test.c45
-rw-r--r--gsl-1.9/histogram/test1d.c483
-rw-r--r--gsl-1.9/histogram/test1d_resample.c99
-rw-r--r--gsl-1.9/histogram/test1d_trap.c130
-rw-r--r--gsl-1.9/histogram/test2d.c753
-rw-r--r--gsl-1.9/histogram/test2d_resample.c115
-rw-r--r--gsl-1.9/histogram/test2d_trap.c203
-rw-r--r--gsl-1.9/histogram/urand.c26
-rw-r--r--gsl-1.9/ieee-utils/ChangeLog212
-rw-r--r--gsl-1.9/ieee-utils/Makefile.am14
-rw-r--r--gsl-1.9/ieee-utils/Makefile.in544
-rw-r--r--gsl-1.9/ieee-utils/TODO2
-rw-r--r--gsl-1.9/ieee-utils/endian.c37
-rw-r--r--gsl-1.9/ieee-utils/env.c114
-rw-r--r--gsl-1.9/ieee-utils/fp-aix.c120
-rw-r--r--gsl-1.9/ieee-utils/fp-darwin.c95
-rw-r--r--gsl-1.9/ieee-utils/fp-darwin86.c204
-rw-r--r--gsl-1.9/ieee-utils/fp-freebsd.c102
-rw-r--r--gsl-1.9/ieee-utils/fp-gnuc99.c182
-rw-r--r--gsl-1.9/ieee-utils/fp-gnum68k.c101
-rw-r--r--gsl-1.9/ieee-utils/fp-gnuppc.c98
-rw-r--r--gsl-1.9/ieee-utils/fp-gnusparc.c97
-rw-r--r--gsl-1.9/ieee-utils/fp-gnux86.c99
-rw-r--r--gsl-1.9/ieee-utils/fp-hpux.c110
-rw-r--r--gsl-1.9/ieee-utils/fp-hpux11.c105
-rw-r--r--gsl-1.9/ieee-utils/fp-irix.c110
-rw-r--r--gsl-1.9/ieee-utils/fp-netbsd.c118
-rw-r--r--gsl-1.9/ieee-utils/fp-openbsd.c121
-rw-r--r--gsl-1.9/ieee-utils/fp-os2emx.c91
-rw-r--r--gsl-1.9/ieee-utils/fp-solaris.c110
-rw-r--r--gsl-1.9/ieee-utils/fp-sunos4.c122
-rw-r--r--gsl-1.9/ieee-utils/fp-tru64.c176
-rw-r--r--gsl-1.9/ieee-utils/fp-unknown.c30
-rw-r--r--gsl-1.9/ieee-utils/fp.c41
-rw-r--r--gsl-1.9/ieee-utils/gsl_ieee_utils.h99
-rw-r--r--gsl-1.9/ieee-utils/make_rep.c197
-rw-r--r--gsl-1.9/ieee-utils/print.c99
-rw-r--r--gsl-1.9/ieee-utils/read.c194
-rw-r--r--gsl-1.9/ieee-utils/standardize.c61
-rw-r--r--gsl-1.9/ieee-utils/test.c482
-rwxr-xr-xgsl-1.9/install-sh238
-rw-r--r--gsl-1.9/integration/ChangeLog133
-rw-r--r--gsl-1.9/integration/Makefile.am14
-rw-r--r--gsl-1.9/integration/Makefile.in547
-rw-r--r--gsl-1.9/integration/TODO11
-rw-r--r--gsl-1.9/integration/append.c35
-rw-r--r--gsl-1.9/integration/err.c58
-rw-r--r--gsl-1.9/integration/gsl_integration.h252
-rw-r--r--gsl-1.9/integration/initialise.c37
-rw-r--r--gsl-1.9/integration/positivity.c13
-rw-r--r--gsl-1.9/integration/ptsort.c62
-rw-r--r--gsl-1.9/integration/qag.c265
-rw-r--r--gsl-1.9/integration/qagp.c510
-rw-r--r--gsl-1.9/integration/qags.c570
-rw-r--r--gsl-1.9/integration/qawc.c220
-rw-r--r--gsl-1.9/integration/qawf.c281
-rw-r--r--gsl-1.9/integration/qawo.c460
-rw-r--r--gsl-1.9/integration/qaws.c220
-rw-r--r--gsl-1.9/integration/qc25c.c132
-rw-r--r--gsl-1.9/integration/qc25f.c158
-rw-r--r--gsl-1.9/integration/qc25s.c238
-rw-r--r--gsl-1.9/integration/qcheb.c229
-rw-r--r--gsl-1.9/integration/qelg.c233
-rw-r--r--gsl-1.9/integration/qk.c102
-rw-r--r--gsl-1.9/integration/qk15.c70
-rw-r--r--gsl-1.9/integration/qk21.c77
-rw-r--r--gsl-1.9/integration/qk31.c89
-rw-r--r--gsl-1.9/integration/qk41.c102
-rw-r--r--gsl-1.9/integration/qk51.c117
-rw-r--r--gsl-1.9/integration/qk61.c126
-rw-r--r--gsl-1.9/integration/qmomo.c193
-rw-r--r--gsl-1.9/integration/qmomof.c389
-rw-r--r--gsl-1.9/integration/qng.c190
-rw-r--r--gsl-1.9/integration/qng.h193
-rw-r--r--gsl-1.9/integration/qpsrt.c113
-rw-r--r--gsl-1.9/integration/qpsrt2.c81
-rw-r--r--gsl-1.9/integration/reset.c9
-rw-r--r--gsl-1.9/integration/set_initial.c12
-rw-r--r--gsl-1.9/integration/test.c2105
-rw-r--r--gsl-1.9/integration/tests.c220
-rw-r--r--gsl-1.9/integration/tests.h49
-rw-r--r--gsl-1.9/integration/util.c137
-rw-r--r--gsl-1.9/integration/workspace.c153
-rw-r--r--gsl-1.9/interpolation/ChangeLog98
-rw-r--r--gsl-1.9/interpolation/Makefile.am18
-rw-r--r--gsl-1.9/interpolation/Makefile.in549
-rw-r--r--gsl-1.9/interpolation/TODO10
-rw-r--r--gsl-1.9/interpolation/accel.c82
-rw-r--r--gsl-1.9/interpolation/akima.c389
-rw-r--r--gsl-1.9/interpolation/bsearch.c47
-rw-r--r--gsl-1.9/interpolation/bsearch.h80
-rw-r--r--gsl-1.9/interpolation/cspline.c475
-rw-r--r--gsl-1.9/interpolation/gsl_interp.h202
-rw-r--r--gsl-1.9/interpolation/gsl_spline.h101
-rw-r--r--gsl-1.9/interpolation/integ_eval.h36
-rw-r--r--gsl-1.9/interpolation/interp.c244
-rw-r--r--gsl-1.9/interpolation/linear.c198
-rw-r--r--gsl-1.9/interpolation/poly.c173
-rw-r--r--gsl-1.9/interpolation/spline.c193
-rw-r--r--gsl-1.9/interpolation/test.c949
-rw-r--r--gsl-1.9/linalg/ChangeLog350
-rw-r--r--gsl-1.9/linalg/Makefile.am19
-rw-r--r--gsl-1.9/linalg/Makefile.in550
-rw-r--r--gsl-1.9/linalg/TODO6
-rw-r--r--gsl-1.9/linalg/apply_givens.c125
-rw-r--r--gsl-1.9/linalg/balance.c86
-rw-r--r--gsl-1.9/linalg/balancemat.c186
-rw-r--r--gsl-1.9/linalg/bidiag.c364
-rw-r--r--gsl-1.9/linalg/cholesky.c266
-rw-r--r--gsl-1.9/linalg/exponential.c187
-rw-r--r--gsl-1.9/linalg/givens.c46
-rw-r--r--gsl-1.9/linalg/gsl_linalg.h560
-rw-r--r--gsl-1.9/linalg/hermtd.c240
-rw-r--r--gsl-1.9/linalg/hessenberg.c430
-rw-r--r--gsl-1.9/linalg/hh.c179
-rw-r--r--gsl-1.9/linalg/householder.c326
-rw-r--r--gsl-1.9/linalg/householdercomplex.c207
-rw-r--r--gsl-1.9/linalg/lq.c567
-rw-r--r--gsl-1.9/linalg/lu.c312
-rw-r--r--gsl-1.9/linalg/luc.c334
-rw-r--r--gsl-1.9/linalg/multiply.c137
-rw-r--r--gsl-1.9/linalg/ptlq.c493
-rw-r--r--gsl-1.9/linalg/qr.c566
-rw-r--r--gsl-1.9/linalg/qrpt.c486
-rw-r--r--gsl-1.9/linalg/svd.c620
-rw-r--r--gsl-1.9/linalg/svdstep.c519
-rw-r--r--gsl-1.9/linalg/symmtd.c232
-rw-r--r--gsl-1.9/linalg/test.c3790
-rw-r--r--gsl-1.9/linalg/tridiag.c558
-rw-r--r--gsl-1.9/linalg/tridiag.h67
-rw-r--r--gsl-1.9/ltmain.sh6863
-rw-r--r--gsl-1.9/matrix/ChangeLog203
-rw-r--r--gsl-1.9/matrix/Makefile.am24
-rw-r--r--gsl-1.9/matrix/Makefile.in562
-rw-r--r--gsl-1.9/matrix/TODO9
-rw-r--r--gsl-1.9/matrix/copy.c87
-rw-r--r--gsl-1.9/matrix/copy_source.c88
-rw-r--r--gsl-1.9/matrix/file.c88
-rw-r--r--gsl-1.9/matrix/file_source.c157
-rw-r--r--gsl-1.9/matrix/getset.c88
-rw-r--r--gsl-1.9/matrix/getset_source.c228
-rw-r--r--gsl-1.9/matrix/gsl_matrix.h25
-rw-r--r--gsl-1.9/matrix/gsl_matrix_char.h318
-rw-r--r--gsl-1.9/matrix/gsl_matrix_complex_double.h313
-rw-r--r--gsl-1.9/matrix/gsl_matrix_complex_float.h313
-rw-r--r--gsl-1.9/matrix/gsl_matrix_complex_long_double.h313
-rw-r--r--gsl-1.9/matrix/gsl_matrix_double.h318
-rw-r--r--gsl-1.9/matrix/gsl_matrix_float.h318
-rw-r--r--gsl-1.9/matrix/gsl_matrix_int.h318
-rw-r--r--gsl-1.9/matrix/gsl_matrix_long.h318
-rw-r--r--gsl-1.9/matrix/gsl_matrix_long_double.h318
-rw-r--r--gsl-1.9/matrix/gsl_matrix_short.h318
-rw-r--r--gsl-1.9/matrix/gsl_matrix_uchar.h318
-rw-r--r--gsl-1.9/matrix/gsl_matrix_uint.h318
-rw-r--r--gsl-1.9/matrix/gsl_matrix_ulong.h318
-rw-r--r--gsl-1.9/matrix/gsl_matrix_ushort.h318
-rw-r--r--gsl-1.9/matrix/init.c87
-rw-r--r--gsl-1.9/matrix/init_source.c250
-rw-r--r--gsl-1.9/matrix/matrix.c87
-rw-r--r--gsl-1.9/matrix/matrix_source.c97
-rw-r--r--gsl-1.9/matrix/minmax.c72
-rw-r--r--gsl-1.9/matrix/minmax_source.c254
-rw-r--r--gsl-1.9/matrix/oper.c91
-rw-r--r--gsl-1.9/matrix/oper_complex_source.c236
-rw-r--r--gsl-1.9/matrix/oper_source.c191
-rw-r--r--gsl-1.9/matrix/prop.c87
-rw-r--r--gsl-1.9/matrix/prop_source.c99
-rw-r--r--gsl-1.9/matrix/rowcol.c178
-rw-r--r--gsl-1.9/matrix/rowcol_source.c134
-rw-r--r--gsl-1.9/matrix/submatrix.c178
-rw-r--r--gsl-1.9/matrix/submatrix_source.c66
-rw-r--r--gsl-1.9/matrix/swap.c88
-rw-r--r--gsl-1.9/matrix/swap_source.c210
-rw-r--r--gsl-1.9/matrix/test.c217
-rw-r--r--gsl-1.9/matrix/test_complex_source.c597
-rw-r--r--gsl-1.9/matrix/test_source.c670
-rw-r--r--gsl-1.9/matrix/test_static.c7
-rw-r--r--gsl-1.9/matrix/view.c176
-rw-r--r--gsl-1.9/matrix/view.h5
-rw-r--r--gsl-1.9/matrix/view_source.c273
-rw-r--r--gsl-1.9/mdate-sh91
-rw-r--r--gsl-1.9/min/ChangeLog77
-rw-r--r--gsl-1.9/min/Makefile.am16
-rw-r--r--gsl-1.9/min/Makefile.in545
-rw-r--r--gsl-1.9/min/bracketing.c125
-rw-r--r--gsl-1.9/min/brent.c223
-rw-r--r--gsl-1.9/min/convergence.c61
-rw-r--r--gsl-1.9/min/fsolver.c200
-rw-r--r--gsl-1.9/min/golden.c120
-rw-r--r--gsl-1.9/min/gsl_min.h110
-rw-r--r--gsl-1.9/min/min.h25
-rw-r--r--gsl-1.9/min/test.c215
-rw-r--r--gsl-1.9/min/test.h42
-rw-r--r--gsl-1.9/min/test_funcs.c85
-rwxr-xr-xgsl-1.9/missing336
-rwxr-xr-xgsl-1.9/mkinstalldirs36
-rw-r--r--gsl-1.9/monte/ChangeLog166
-rw-r--r--gsl-1.9/monte/Makefile.am21
-rw-r--r--gsl-1.9/monte/Makefile.in547
-rw-r--r--gsl-1.9/monte/README37
-rw-r--r--gsl-1.9/monte/TODO25
-rw-r--r--gsl-1.9/monte/gsl_monte.h55
-rw-r--r--gsl-1.9/monte/gsl_monte_miser.h83
-rw-r--r--gsl-1.9/monte/gsl_monte_plain.h65
-rw-r--r--gsl-1.9/monte/gsl_monte_vegas.h105
-rw-r--r--gsl-1.9/monte/miser.c681
-rw-r--r--gsl-1.9/monte/plain.c151
-rw-r--r--gsl-1.9/monte/test.c373
-rw-r--r--gsl-1.9/monte/test_main.c70
-rw-r--r--gsl-1.9/monte/vegas.c864
-rw-r--r--gsl-1.9/multifit/ChangeLog145
-rw-r--r--gsl-1.9/multifit/Makefile.am20
-rw-r--r--gsl-1.9/multifit/Makefile.in552
-rw-r--r--gsl-1.9/multifit/TODO7
-rw-r--r--gsl-1.9/multifit/convergence.c89
-rw-r--r--gsl-1.9/multifit/covar.c192
-rw-r--r--gsl-1.9/multifit/fdfsolver.c170
-rw-r--r--gsl-1.9/multifit/fsolver.c156
-rw-r--r--gsl-1.9/multifit/gradient.c33
-rw-r--r--gsl-1.9/multifit/gsl_multifit.h106
-rw-r--r--gsl-1.9/multifit/gsl_multifit_nlin.h172
-rw-r--r--gsl-1.9/multifit/lmder.c387
-rw-r--r--gsl-1.9/multifit/lmiterate.c222
-rw-r--r--gsl-1.9/multifit/lmpar.c473
-rw-r--r--gsl-1.9/multifit/lmset.c44
-rw-r--r--gsl-1.9/multifit/lmutil.c134
-rw-r--r--gsl-1.9/multifit/multilinear.c432
-rw-r--r--gsl-1.9/multifit/qrsolv.c218
-rw-r--r--gsl-1.9/multifit/test.c210
-rw-r--r--gsl-1.9/multifit/test_brown.c113
-rw-r--r--gsl-1.9/multifit/test_enso.c279
-rw-r--r--gsl-1.9/multifit/test_estimator.c37
-rw-r--r--gsl-1.9/multifit/test_filip.c202
-rw-r--r--gsl-1.9/multifit/test_fn.c25
-rw-r--r--gsl-1.9/multifit/test_hahn1.c568
-rw-r--r--gsl-1.9/multifit/test_kirby2.c392
-rw-r--r--gsl-1.9/multifit/test_longley.c166
-rw-r--r--gsl-1.9/multifit/test_nelson.c217
-rw-r--r--gsl-1.9/multifit/test_pontius.c131
-rw-r--r--gsl-1.9/multifit/work.c133
-rw-r--r--gsl-1.9/multimin/ChangeLog130
-rw-r--r--gsl-1.9/multimin/Makefile.am20
-rw-r--r--gsl-1.9/multimin/Makefile.in554
-rw-r--r--gsl-1.9/multimin/TODO3
-rw-r--r--gsl-1.9/multimin/conjugate_fr.c271
-rw-r--r--gsl-1.9/multimin/conjugate_pr.c276
-rw-r--r--gsl-1.9/multimin/convergence.c58
-rw-r--r--gsl-1.9/multimin/diff.c58
-rw-r--r--gsl-1.9/multimin/directional_minimize.c236
-rw-r--r--gsl-1.9/multimin/fdfminimizer.c173
-rw-r--r--gsl-1.9/multimin/fminimizer.c134
-rw-r--r--gsl-1.9/multimin/gsl_multimin.h225
-rw-r--r--gsl-1.9/multimin/linear_minimize.c247
-rw-r--r--gsl-1.9/multimin/linear_wrapper.c185
-rw-r--r--gsl-1.9/multimin/simplex.c415
-rw-r--r--gsl-1.9/multimin/steepest_descent.c171
-rw-r--r--gsl-1.9/multimin/test.c196
-rw-r--r--gsl-1.9/multimin/test_funcs.c244
-rw-r--r--gsl-1.9/multimin/test_funcs.h56
-rw-r--r--gsl-1.9/multimin/vector_bfgs.c350
-rw-r--r--gsl-1.9/multimin/vector_bfgs2.c330
-rw-r--r--gsl-1.9/multiroots/ChangeLog114
-rw-r--r--gsl-1.9/multiroots/Makefile.am19
-rw-r--r--gsl-1.9/multiroots/Makefile.in552
-rw-r--r--gsl-1.9/multiroots/broyden.c456
-rw-r--r--gsl-1.9/multiroots/convergence.c90
-rw-r--r--gsl-1.9/multiroots/dnewton.c186
-rw-r--r--gsl-1.9/multiroots/dogleg.c413
-rw-r--r--gsl-1.9/multiroots/enorm.c33
-rw-r--r--gsl-1.9/multiroots/fdfsolver.c176
-rw-r--r--gsl-1.9/multiroots/fdjac.c96
-rw-r--r--gsl-1.9/multiroots/fsolver.c163
-rw-r--r--gsl-1.9/multiroots/gnewton.c226
-rw-r--r--gsl-1.9/multiroots/gsl_multiroots.h177
-rw-r--r--gsl-1.9/multiroots/hybrid.c661
-rw-r--r--gsl-1.9/multiroots/hybridj.c608
-rw-r--r--gsl-1.9/multiroots/newton.c151
-rw-r--r--gsl-1.9/multiroots/test.c260
-rw-r--r--gsl-1.9/multiroots/test_funcs.c744
-rw-r--r--gsl-1.9/multiroots/test_funcs.h76
-rw-r--r--gsl-1.9/ntuple/ChangeLog5
-rw-r--r--gsl-1.9/ntuple/Makefile.am22
-rw-r--r--gsl-1.9/ntuple/Makefile.in552
-rw-r--r--gsl-1.9/ntuple/gsl_ntuple.h82
-rw-r--r--gsl-1.9/ntuple/ntuple.c202
-rw-r--r--gsl-1.9/ntuple/test.c162
-rw-r--r--gsl-1.9/ode-initval/ChangeLog146
-rw-r--r--gsl-1.9/ode-initval/Makefile.am18
-rw-r--r--gsl-1.9/ode-initval/Makefile.in550
-rw-r--r--gsl-1.9/ode-initval/TODO78
-rw-r--r--gsl-1.9/ode-initval/bsimp.c567
-rw-r--r--gsl-1.9/ode-initval/control.c80
-rw-r--r--gsl-1.9/ode-initval/cscal.c193
-rw-r--r--gsl-1.9/ode-initval/cstd.c184
-rw-r--r--gsl-1.9/ode-initval/evolve.c217
-rw-r--r--gsl-1.9/ode-initval/gear1.c272
-rw-r--r--gsl-1.9/ode-initval/gear2.c343
-rw-r--r--gsl-1.9/ode-initval/gsl_odeiv.h230
-rw-r--r--gsl-1.9/ode-initval/odeiv_util.h2
-rw-r--r--gsl-1.9/ode-initval/rk2.c250
-rw-r--r--gsl-1.9/ode-initval/rk2imp.c336
-rw-r--r--gsl-1.9/ode-initval/rk2simp.c382
-rw-r--r--gsl-1.9/ode-initval/rk4.c365
-rw-r--r--gsl-1.9/ode-initval/rk4imp.c390
-rw-r--r--gsl-1.9/ode-initval/rk8pd.c537
-rw-r--r--gsl-1.9/ode-initval/rkck.c371
-rw-r--r--gsl-1.9/ode-initval/rkf45.c372
-rw-r--r--gsl-1.9/ode-initval/step.c89
-rw-r--r--gsl-1.9/ode-initval/test.c1030
-rw-r--r--gsl-1.9/permutation/ChangeLog60
-rw-r--r--gsl-1.9/permutation/Makefile.am21
-rw-r--r--gsl-1.9/permutation/Makefile.in548
-rw-r--r--gsl-1.9/permutation/canonical.c194
-rw-r--r--gsl-1.9/permutation/file.c113
-rw-r--r--gsl-1.9/permutation/gsl_permutation.h98
-rw-r--r--gsl-1.9/permutation/gsl_permute.h24
-rw-r--r--gsl-1.9/permutation/gsl_permute_char.h44
-rw-r--r--gsl-1.9/permutation/gsl_permute_complex_double.h45
-rw-r--r--gsl-1.9/permutation/gsl_permute_complex_float.h45
-rw-r--r--gsl-1.9/permutation/gsl_permute_complex_long_double.h45
-rw-r--r--gsl-1.9/permutation/gsl_permute_double.h44
-rw-r--r--gsl-1.9/permutation/gsl_permute_float.h44
-rw-r--r--gsl-1.9/permutation/gsl_permute_int.h44
-rw-r--r--gsl-1.9/permutation/gsl_permute_long.h44
-rw-r--r--gsl-1.9/permutation/gsl_permute_long_double.h44
-rw-r--r--gsl-1.9/permutation/gsl_permute_short.h44
-rw-r--r--gsl-1.9/permutation/gsl_permute_uchar.h44
-rw-r--r--gsl-1.9/permutation/gsl_permute_uint.h44
-rw-r--r--gsl-1.9/permutation/gsl_permute_ulong.h44
-rw-r--r--gsl-1.9/permutation/gsl_permute_ushort.h44
-rw-r--r--gsl-1.9/permutation/gsl_permute_vector.h24
-rw-r--r--gsl-1.9/permutation/gsl_permute_vector_char.h45
-rw-r--r--gsl-1.9/permutation/gsl_permute_vector_complex_double.h45
-rw-r--r--gsl-1.9/permutation/gsl_permute_vector_complex_float.h45
-rw-r--r--gsl-1.9/permutation/gsl_permute_vector_complex_long_double.h45
-rw-r--r--gsl-1.9/permutation/gsl_permute_vector_double.h45
-rw-r--r--gsl-1.9/permutation/gsl_permute_vector_float.h45
-rw-r--r--gsl-1.9/permutation/gsl_permute_vector_int.h45
-rw-r--r--gsl-1.9/permutation/gsl_permute_vector_long.h45
-rw-r--r--gsl-1.9/permutation/gsl_permute_vector_long_double.h45
-rw-r--r--gsl-1.9/permutation/gsl_permute_vector_short.h45
-rw-r--r--gsl-1.9/permutation/gsl_permute_vector_uchar.h45
-rw-r--r--gsl-1.9/permutation/gsl_permute_vector_uint.h45
-rw-r--r--gsl-1.9/permutation/gsl_permute_vector_ulong.h45
-rw-r--r--gsl-1.9/permutation/gsl_permute_vector_ushort.h45
-rw-r--r--gsl-1.9/permutation/init.c98
-rw-r--r--gsl-1.9/permutation/permutation.c291
-rw-r--r--gsl-1.9/permutation/permute.c89
-rw-r--r--gsl-1.9/permutation/permute_source.c163
-rw-r--r--gsl-1.9/permutation/test.c300
-rw-r--r--gsl-1.9/poly/ChangeLog72
-rw-r--r--gsl-1.9/poly/Makefile.am17
-rw-r--r--gsl-1.9/poly/Makefile.in546
-rw-r--r--gsl-1.9/poly/TODO130
-rw-r--r--gsl-1.9/poly/balance.c127
-rw-r--r--gsl-1.9/poly/companion.c36
-rw-r--r--gsl-1.9/poly/dd.c101
-rw-r--r--gsl-1.9/poly/eval.c36
-rw-r--r--gsl-1.9/poly/gsl_poly.h132
-rw-r--r--gsl-1.9/poly/qr.c245
-rw-r--r--gsl-1.9/poly/solve_cubic.c110
-rw-r--r--gsl-1.9/poly/solve_quadratic.c85
-rw-r--r--gsl-1.9/poly/test.c508
-rw-r--r--gsl-1.9/poly/zsolve.c85
-rw-r--r--gsl-1.9/poly/zsolve_cubic.c153
-rw-r--r--gsl-1.9/poly/zsolve_init.c69
-rw-r--r--gsl-1.9/poly/zsolve_quadratic.c103
-rw-r--r--gsl-1.9/qrng/ChangeLog23
-rw-r--r--gsl-1.9/qrng/Makefile.am14
-rw-r--r--gsl-1.9/qrng/Makefile.in543
-rw-r--r--gsl-1.9/qrng/TODO10
-rw-r--r--gsl-1.9/qrng/gsl_qrng.h110
-rw-r--r--gsl-1.9/qrng/niederreiter-2.c353
-rw-r--r--gsl-1.9/qrng/qrng.c127
-rw-r--r--gsl-1.9/qrng/sobol.c231
-rw-r--r--gsl-1.9/qrng/test.c122
-rw-r--r--gsl-1.9/randist/ChangeLog437
-rw-r--r--gsl-1.9/randist/Makefile.am16
-rw-r--r--gsl-1.9/randist/Makefile.in551
-rw-r--r--gsl-1.9/randist/TODO58
-rw-r--r--gsl-1.9/randist/bernoulli.c61
-rw-r--r--gsl-1.9/randist/beta.c68
-rw-r--r--gsl-1.9/randist/bigauss.c70
-rw-r--r--gsl-1.9/randist/binomial.c100
-rw-r--r--gsl-1.9/randist/binomial_tpe.c381
-rw-r--r--gsl-1.9/randist/cauchy.c51
-rw-r--r--gsl-1.9/randist/chisq.c54
-rw-r--r--gsl-1.9/randist/dirichlet.c103
-rw-r--r--gsl-1.9/randist/discrete.c398
-rw-r--r--gsl-1.9/randist/erlang.c54
-rw-r--r--gsl-1.9/randist/exponential.c52
-rw-r--r--gsl-1.9/randist/exppow.c122
-rw-r--r--gsl-1.9/randist/fdist.c67
-rw-r--r--gsl-1.9/randist/flat.c53
-rw-r--r--gsl-1.9/randist/gamma.c220
-rw-r--r--gsl-1.9/randist/gauss.c143
-rw-r--r--gsl-1.9/randist/gausstail.c107
-rw-r--r--gsl-1.9/randist/gausszig.c207
-rw-r--r--gsl-1.9/randist/geometric.c67
-rw-r--r--gsl-1.9/randist/gsl_randist.h185
-rw-r--r--gsl-1.9/randist/gumbel.c78
-rw-r--r--gsl-1.9/randist/hyperg.c124
-rw-r--r--gsl-1.9/randist/landau.c565
-rw-r--r--gsl-1.9/randist/laplace.c57
-rw-r--r--gsl-1.9/randist/levy.c136
-rw-r--r--gsl-1.9/randist/logarithmic.c76
-rw-r--r--gsl-1.9/randist/logistic.c53
-rw-r--r--gsl-1.9/randist/lognormal.c70
-rw-r--r--gsl-1.9/randist/multinomial.c121
-rw-r--r--gsl-1.9/randist/nbinomial.c54
-rw-r--r--gsl-1.9/randist/pareto.c54
-rw-r--r--gsl-1.9/randist/pascal.c50
-rw-r--r--gsl-1.9/randist/poisson.c93
-rw-r--r--gsl-1.9/randist/rayleigh.c85
-rw-r--r--gsl-1.9/randist/shuffle.c124
-rw-r--r--gsl-1.9/randist/sphere.c119
-rw-r--r--gsl-1.9/randist/tdist.c80
-rw-r--r--gsl-1.9/randist/test.c1968
-rw-r--r--gsl-1.9/randist/weibull.c64
-rw-r--r--gsl-1.9/rng/ChangeLog377
-rw-r--r--gsl-1.9/rng/Makefile.am22
-rw-r--r--gsl-1.9/rng/Makefile.in558
-rw-r--r--gsl-1.9/rng/TODO97
-rw-r--r--gsl-1.9/rng/borosh13.c92
-rw-r--r--gsl-1.9/rng/cmrg.c197
-rw-r--r--gsl-1.9/rng/coveyou.c92
-rw-r--r--gsl-1.9/rng/default.c93
-rw-r--r--gsl-1.9/rng/file.c57
-rw-r--r--gsl-1.9/rng/fishman18.c95
-rw-r--r--gsl-1.9/rng/fishman20.c103
-rw-r--r--gsl-1.9/rng/fishman2x.c121
-rw-r--r--gsl-1.9/rng/gfsr4.c165
-rw-r--r--gsl-1.9/rng/gsl_rng.h218
-rw-r--r--gsl-1.9/rng/knuthran.c177
-rw-r--r--gsl-1.9/rng/knuthran2.c103
-rw-r--r--gsl-1.9/rng/knuthran2002.c189
-rw-r--r--gsl-1.9/rng/lecuyer21.c99
-rw-r--r--gsl-1.9/rng/minstd.c109
-rw-r--r--gsl-1.9/rng/mrg.c149
-rw-r--r--gsl-1.9/rng/mt.c241
-rw-r--r--gsl-1.9/rng/r250.c172
-rw-r--r--gsl-1.9/rng/ran0.c100
-rw-r--r--gsl-1.9/rng/ran1.c130
-rw-r--r--gsl-1.9/rng/ran2.c146
-rw-r--r--gsl-1.9/rng/ran3.c132
-rw-r--r--gsl-1.9/rng/rand.c85
-rw-r--r--gsl-1.9/rng/rand48.c143
-rw-r--r--gsl-1.9/rng/random.c656
-rw-r--r--gsl-1.9/rng/randu.c95
-rw-r--r--gsl-1.9/rng/ranf.c161
-rw-r--r--gsl-1.9/rng/ranlux.c222
-rw-r--r--gsl-1.9/rng/ranlxd.c249
-rw-r--r--gsl-1.9/rng/ranlxs.c302
-rw-r--r--gsl-1.9/rng/ranmar.c173
-rw-r--r--gsl-1.9/rng/rng.c211
-rw-r--r--gsl-1.9/rng/schrage.c51
-rw-r--r--gsl-1.9/rng/slatec.c205
-rw-r--r--gsl-1.9/rng/taus.c184
-rw-r--r--gsl-1.9/rng/taus113.c168
-rw-r--r--gsl-1.9/rng/test.c602
-rw-r--r--gsl-1.9/rng/transputer.c83
-rw-r--r--gsl-1.9/rng/tt.c143
-rw-r--r--gsl-1.9/rng/types.c101
-rw-r--r--gsl-1.9/rng/uni.c201
-rw-r--r--gsl-1.9/rng/uni32.c203
-rw-r--r--gsl-1.9/rng/vax.c83
-rw-r--r--gsl-1.9/rng/waterman14.c92
-rw-r--r--gsl-1.9/rng/zuf.c141
-rw-r--r--gsl-1.9/roots/ChangeLog159
-rw-r--r--gsl-1.9/roots/Makefile.am19
-rw-r--r--gsl-1.9/roots/Makefile.in548
-rw-r--r--gsl-1.9/roots/TODO9
-rw-r--r--gsl-1.9/roots/bisection.c134
-rw-r--r--gsl-1.9/roots/brent.c244
-rw-r--r--gsl-1.9/roots/convergence.c87
-rw-r--r--gsl-1.9/roots/falsepos.c178
-rw-r--r--gsl-1.9/roots/fdfsolver.c88
-rw-r--r--gsl-1.9/roots/fsolver.c107
-rw-r--r--gsl-1.9/roots/gsl_roots.h127
-rw-r--r--gsl-1.9/roots/newton.c106
-rw-r--r--gsl-1.9/roots/roots.h37
-rw-r--r--gsl-1.9/roots/secant.c117
-rw-r--r--gsl-1.9/roots/steffenson.c144
-rw-r--r--gsl-1.9/roots/test.c315
-rw-r--r--gsl-1.9/roots/test.h129
-rw-r--r--gsl-1.9/roots/test_funcs.c229
-rw-r--r--gsl-1.9/siman/ChangeLog120
-rw-r--r--gsl-1.9/siman/Makefile.am21
-rw-r--r--gsl-1.9/siman/Makefile.in568
-rw-r--r--gsl-1.9/siman/TODO6
-rw-r--r--gsl-1.9/siman/gsl_siman.h82
-rw-r--r--gsl-1.9/siman/siman.c266
-rwxr-xr-xgsl-1.9/siman/siman_test_driver.sh22
-rw-r--r--gsl-1.9/siman/siman_tsp.c329
-rw-r--r--gsl-1.9/siman/test.c162
-rw-r--r--gsl-1.9/sort/ChangeLog58
-rw-r--r--gsl-1.9/sort/Makefile.am16
-rw-r--r--gsl-1.9/sort/Makefile.in546
-rw-r--r--gsl-1.9/sort/TODO36
-rw-r--r--gsl-1.9/sort/gsl_heapsort.h44
-rw-r--r--gsl-1.9/sort/gsl_sort.h20
-rw-r--r--gsl-1.9/sort/gsl_sort_char.h50
-rw-r--r--gsl-1.9/sort/gsl_sort_double.h50
-rw-r--r--gsl-1.9/sort/gsl_sort_float.h50
-rw-r--r--gsl-1.9/sort/gsl_sort_int.h50
-rw-r--r--gsl-1.9/sort/gsl_sort_long.h50
-rw-r--r--gsl-1.9/sort/gsl_sort_long_double.h50
-rw-r--r--gsl-1.9/sort/gsl_sort_short.h50
-rw-r--r--gsl-1.9/sort/gsl_sort_uchar.h50
-rw-r--r--gsl-1.9/sort/gsl_sort_uint.h50
-rw-r--r--gsl-1.9/sort/gsl_sort_ulong.h50
-rw-r--r--gsl-1.9/sort/gsl_sort_ushort.h50
-rw-r--r--gsl-1.9/sort/gsl_sort_vector.h20
-rw-r--r--gsl-1.9/sort/gsl_sort_vector_char.h51
-rw-r--r--gsl-1.9/sort/gsl_sort_vector_double.h51
-rw-r--r--gsl-1.9/sort/gsl_sort_vector_float.h51
-rw-r--r--gsl-1.9/sort/gsl_sort_vector_int.h51
-rw-r--r--gsl-1.9/sort/gsl_sort_vector_long.h51
-rw-r--r--gsl-1.9/sort/gsl_sort_vector_long_double.h51
-rw-r--r--gsl-1.9/sort/gsl_sort_vector_short.h51
-rw-r--r--gsl-1.9/sort/gsl_sort_vector_uchar.h51
-rw-r--r--gsl-1.9/sort/gsl_sort_vector_uint.h51
-rw-r--r--gsl-1.9/sort/gsl_sort_vector_ulong.h51
-rw-r--r--gsl-1.9/sort/gsl_sort_vector_ushort.h51
-rw-r--r--gsl-1.9/sort/sort.c114
-rw-r--r--gsl-1.9/sort/sortind.c101
-rw-r--r--gsl-1.9/sort/sortvec.c90
-rw-r--r--gsl-1.9/sort/sortvec_source.c93
-rw-r--r--gsl-1.9/sort/sortvecind.c90
-rw-r--r--gsl-1.9/sort/sortvecind_source.c106
-rw-r--r--gsl-1.9/sort/subset.c86
-rw-r--r--gsl-1.9/sort/subset_source.c146
-rw-r--r--gsl-1.9/sort/subsetind.c86
-rw-r--r--gsl-1.9/sort/subsetind_source.c146
-rw-r--r--gsl-1.9/sort/test.c140
-rw-r--r--gsl-1.9/sort/test_heapsort.c183
-rw-r--r--gsl-1.9/sort/test_source.c292
-rw-r--r--gsl-1.9/specfunc/ChangeLog620
-rw-r--r--gsl-1.9/specfunc/Makefile.am19
-rw-r--r--gsl-1.9/specfunc/Makefile.in569
-rw-r--r--gsl-1.9/specfunc/TODO673
-rw-r--r--gsl-1.9/specfunc/airy.c869
-rw-r--r--gsl-1.9/specfunc/airy_der.c888
-rw-r--r--gsl-1.9/specfunc/airy_zero.c546
-rw-r--r--gsl-1.9/specfunc/atanint.c115
-rw-r--r--gsl-1.9/specfunc/bessel.c938
-rw-r--r--gsl-1.9/specfunc/bessel.h92
-rw-r--r--gsl-1.9/specfunc/bessel_I0.c232
-rw-r--r--gsl-1.9/specfunc/bessel_I1.c258
-rw-r--r--gsl-1.9/specfunc/bessel_In.c225
-rw-r--r--gsl-1.9/specfunc/bessel_Inu.c122
-rw-r--r--gsl-1.9/specfunc/bessel_J0.c111
-rw-r--r--gsl-1.9/specfunc/bessel_J1.c128
-rw-r--r--gsl-1.9/specfunc/bessel_Jn.c199
-rw-r--r--gsl-1.9/specfunc/bessel_Jnu.c185
-rw-r--r--gsl-1.9/specfunc/bessel_K0.c214
-rw-r--r--gsl-1.9/specfunc/bessel_K1.c220
-rw-r--r--gsl-1.9/specfunc/bessel_Kn.c240
-rw-r--r--gsl-1.9/specfunc/bessel_Knu.c164
-rw-r--r--gsl-1.9/specfunc/bessel_Y0.c122
-rw-r--r--gsl-1.9/specfunc/bessel_Y1.c137
-rw-r--r--gsl-1.9/specfunc/bessel_Yn.c217
-rw-r--r--gsl-1.9/specfunc/bessel_Ynu.c131
-rw-r--r--gsl-1.9/specfunc/bessel_amp_phase.c188
-rw-r--r--gsl-1.9/specfunc/bessel_amp_phase.h45
-rw-r--r--gsl-1.9/specfunc/bessel_i.c329
-rw-r--r--gsl-1.9/specfunc/bessel_j.c397
-rw-r--r--gsl-1.9/specfunc/bessel_k.c248
-rw-r--r--gsl-1.9/specfunc/bessel_olver.c982
-rw-r--r--gsl-1.9/specfunc/bessel_olver.h33
-rw-r--r--gsl-1.9/specfunc/bessel_sequence.c154
-rw-r--r--gsl-1.9/specfunc/bessel_temme.c219
-rw-r--r--gsl-1.9/specfunc/bessel_temme.h38
-rw-r--r--gsl-1.9/specfunc/bessel_y.c292
-rw-r--r--gsl-1.9/specfunc/bessel_zero.c1219
-rw-r--r--gsl-1.9/specfunc/beta.c169
-rw-r--r--gsl-1.9/specfunc/beta_inc.c180
-rw-r--r--gsl-1.9/specfunc/cheb_eval.c34
-rw-r--r--gsl-1.9/specfunc/cheb_eval_mode.c30
-rw-r--r--gsl-1.9/specfunc/chebyshev.h31
-rw-r--r--gsl-1.9/specfunc/check.h3
-rw-r--r--gsl-1.9/specfunc/clausen.c111
-rw-r--r--gsl-1.9/specfunc/coulomb.c1417
-rw-r--r--gsl-1.9/specfunc/coulomb_bound.c120
-rw-r--r--gsl-1.9/specfunc/coupling.c439
-rw-r--r--gsl-1.9/specfunc/dawson.c281
-rw-r--r--gsl-1.9/specfunc/debye.c566
-rw-r--r--gsl-1.9/specfunc/dilog.c662
-rw-r--r--gsl-1.9/specfunc/elementary.c86
-rw-r--r--gsl-1.9/specfunc/ellint.c625
-rw-r--r--gsl-1.9/specfunc/elljac.c128
-rw-r--r--gsl-1.9/specfunc/erfc.c465
-rw-r--r--gsl-1.9/specfunc/error.h27
-rw-r--r--gsl-1.9/specfunc/eval.h17
-rw-r--r--gsl-1.9/specfunc/exp.c608
-rw-r--r--gsl-1.9/specfunc/expint.c518
-rw-r--r--gsl-1.9/specfunc/expint3.c146
-rw-r--r--gsl-1.9/specfunc/fermi_dirac.c1633
-rw-r--r--gsl-1.9/specfunc/gamma.c1685
-rw-r--r--gsl-1.9/specfunc/gamma_inc.c671
-rw-r--r--gsl-1.9/specfunc/gegenbauer.c194
-rw-r--r--gsl-1.9/specfunc/gsl_sf.h39
-rw-r--r--gsl-1.9/specfunc/gsl_sf_airy.h139
-rw-r--r--gsl-1.9/specfunc/gsl_sf_bessel.h548
-rw-r--r--gsl-1.9/specfunc/gsl_sf_clausen.h52
-rw-r--r--gsl-1.9/specfunc/gsl_sf_coulomb.h128
-rw-r--r--gsl-1.9/specfunc/gsl_sf_coupling.h125
-rw-r--r--gsl-1.9/specfunc/gsl_sf_dawson.h52
-rw-r--r--gsl-1.9/specfunc/gsl_sf_debye.h91
-rw-r--r--gsl-1.9/specfunc/gsl_sf_dilog.h130
-rw-r--r--gsl-1.9/specfunc/gsl_sf_elementary.h57
-rw-r--r--gsl-1.9/specfunc/gsl_sf_ellint.h112
-rw-r--r--gsl-1.9/specfunc/gsl_sf_elljac.h48
-rw-r--r--gsl-1.9/specfunc/gsl_sf_erf.h91
-rw-r--r--gsl-1.9/specfunc/gsl_sf_exp.h132
-rw-r--r--gsl-1.9/specfunc/gsl_sf_expint.h149
-rw-r--r--gsl-1.9/specfunc/gsl_sf_fermi_dirac.h126
-rw-r--r--gsl-1.9/specfunc/gsl_sf_gamma.h293
-rw-r--r--gsl-1.9/specfunc/gsl_sf_gegenbauer.h73
-rw-r--r--gsl-1.9/specfunc/gsl_sf_hyperg.h154
-rw-r--r--gsl-1.9/specfunc/gsl_sf_laguerre.h68
-rw-r--r--gsl-1.9/specfunc/gsl_sf_lambert.h69
-rw-r--r--gsl-1.9/specfunc/gsl_sf_legendre.h326
-rw-r--r--gsl-1.9/specfunc/gsl_sf_log.h82
-rw-r--r--gsl-1.9/specfunc/gsl_sf_mathieu.h107
-rw-r--r--gsl-1.9/specfunc/gsl_sf_pow_int.h49
-rw-r--r--gsl-1.9/specfunc/gsl_sf_psi.h113
-rw-r--r--gsl-1.9/specfunc/gsl_sf_result.h59
-rw-r--r--gsl-1.9/specfunc/gsl_sf_synchrotron.h60
-rw-r--r--gsl-1.9/specfunc/gsl_sf_transport.h78
-rw-r--r--gsl-1.9/specfunc/gsl_sf_trig.h152
-rw-r--r--gsl-1.9/specfunc/gsl_sf_zeta.h112
-rw-r--r--gsl-1.9/specfunc/gsl_specfunc.h10
-rw-r--r--gsl-1.9/specfunc/hyperg.c291
-rw-r--r--gsl-1.9/specfunc/hyperg.h78
-rw-r--r--gsl-1.9/specfunc/hyperg_0F1.c178
-rw-r--r--gsl-1.9/specfunc/hyperg_1F1.c2064
-rw-r--r--gsl-1.9/specfunc/hyperg_2F0.c63
-rw-r--r--gsl-1.9/specfunc/hyperg_2F1.c915
-rw-r--r--gsl-1.9/specfunc/hyperg_U.c1406
-rw-r--r--gsl-1.9/specfunc/laguerre.c334
-rw-r--r--gsl-1.9/specfunc/lambert.c230
-rw-r--r--gsl-1.9/specfunc/legendre.h72
-rw-r--r--gsl-1.9/specfunc/legendre_H3d.c568
-rw-r--r--gsl-1.9/specfunc/legendre_Qn.c366
-rw-r--r--gsl-1.9/specfunc/legendre_con.c1373
-rw-r--r--gsl-1.9/specfunc/legendre_poly.c783
-rw-r--r--gsl-1.9/specfunc/log.c266
-rw-r--r--gsl-1.9/specfunc/mathieu_angfunc.c343
-rw-r--r--gsl-1.9/specfunc/mathieu_charv.c849
-rw-r--r--gsl-1.9/specfunc/mathieu_coeff.c348
-rw-r--r--gsl-1.9/specfunc/mathieu_radfunc.c459
-rw-r--r--gsl-1.9/specfunc/mathieu_workspace.c202
-rw-r--r--gsl-1.9/specfunc/poch.c435
-rw-r--r--gsl-1.9/specfunc/pow_int.c74
-rw-r--r--gsl-1.9/specfunc/psi.c857
-rw-r--r--gsl-1.9/specfunc/recurse.h125
-rw-r--r--gsl-1.9/specfunc/result.c89
-rw-r--r--gsl-1.9/specfunc/shint.c135
-rw-r--r--gsl-1.9/specfunc/sinint.c402
-rw-r--r--gsl-1.9/specfunc/synchrotron.c285
-rw-r--r--gsl-1.9/specfunc/test_airy.c134
-rw-r--r--gsl-1.9/specfunc/test_bessel.c600
-rw-r--r--gsl-1.9/specfunc/test_coulomb.c412
-rw-r--r--gsl-1.9/specfunc/test_dilog.c310
-rw-r--r--gsl-1.9/specfunc/test_gamma.c343
-rw-r--r--gsl-1.9/specfunc/test_hyperg.c506
-rw-r--r--gsl-1.9/specfunc/test_legendre.c549
-rw-r--r--gsl-1.9/specfunc/test_mathieu.c213
-rw-r--r--gsl-1.9/specfunc/test_sf.c2538
-rw-r--r--gsl-1.9/specfunc/test_sf.h101
-rw-r--r--gsl-1.9/specfunc/transport.c492
-rw-r--r--gsl-1.9/specfunc/trig.c771
-rw-r--r--gsl-1.9/specfunc/zeta.c1050
-rw-r--r--gsl-1.9/statistics/ChangeLog118
-rw-r--r--gsl-1.9/statistics/Makefile.am19
-rw-r--r--gsl-1.9/statistics/Makefile.in547
-rw-r--r--gsl-1.9/statistics/TODO102
-rw-r--r--gsl-1.9/statistics/absdev.c70
-rw-r--r--gsl-1.9/statistics/absdev_source.c49
-rw-r--r--gsl-1.9/statistics/covariance.c72
-rw-r--r--gsl-1.9/statistics/covariance_source.c77
-rw-r--r--gsl-1.9/statistics/gsl_statistics.h20
-rw-r--r--gsl-1.9/statistics/gsl_statistics_char.h75
-rw-r--r--gsl-1.9/statistics/gsl_statistics_double.h93
-rw-r--r--gsl-1.9/statistics/gsl_statistics_float.h93
-rw-r--r--gsl-1.9/statistics/gsl_statistics_int.h75
-rw-r--r--gsl-1.9/statistics/gsl_statistics_long.h75
-rw-r--r--gsl-1.9/statistics/gsl_statistics_long_double.h93
-rw-r--r--gsl-1.9/statistics/gsl_statistics_short.h75
-rw-r--r--gsl-1.9/statistics/gsl_statistics_uchar.h75
-rw-r--r--gsl-1.9/statistics/gsl_statistics_uint.h75
-rw-r--r--gsl-1.9/statistics/gsl_statistics_ulong.h75
-rw-r--r--gsl-1.9/statistics/gsl_statistics_ushort.h75
-rw-r--r--gsl-1.9/statistics/kurtosis.c71
-rw-r--r--gsl-1.9/statistics/kurtosis_source.c55
-rw-r--r--gsl-1.9/statistics/lag1.c70
-rw-r--r--gsl-1.9/statistics/lag1_source.c51
-rw-r--r--gsl-1.9/statistics/mean.c70
-rw-r--r--gsl-1.9/statistics/mean_source.c35
-rw-r--r--gsl-1.9/statistics/median.c71
-rw-r--r--gsl-1.9/statistics/median_source.c44
-rw-r--r--gsl-1.9/statistics/minmax.c72
-rw-r--r--gsl-1.9/statistics/minmax_source.c207
-rw-r--r--gsl-1.9/statistics/p_variance.c71
-rw-r--r--gsl-1.9/statistics/p_variance_source.c39
-rw-r--r--gsl-1.9/statistics/quantiles.c71
-rw-r--r--gsl-1.9/statistics/quantiles_source.c45
-rw-r--r--gsl-1.9/statistics/skew.c72
-rw-r--r--gsl-1.9/statistics/skew_source.c51
-rw-r--r--gsl-1.9/statistics/test.c132
-rw-r--r--gsl-1.9/statistics/test_float_source.c382
-rw-r--r--gsl-1.9/statistics/test_int_source.c253
-rw-r--r--gsl-1.9/statistics/test_nist.c503
-rw-r--r--gsl-1.9/statistics/ttest.c72
-rw-r--r--gsl-1.9/statistics/ttest_source.c42
-rw-r--r--gsl-1.9/statistics/variance.c72
-rw-r--r--gsl-1.9/statistics/variance_source.c90
-rw-r--r--gsl-1.9/statistics/wabsdev.c21
-rw-r--r--gsl-1.9/statistics/wabsdev_source.c51
-rw-r--r--gsl-1.9/statistics/wkurtosis.c21
-rw-r--r--gsl-1.9/statistics/wkurtosis_source.c62
-rw-r--r--gsl-1.9/statistics/wmean.c21
-rw-r--r--gsl-1.9/statistics/wmean_source.c48
-rw-r--r--gsl-1.9/statistics/wskew.c22
-rw-r--r--gsl-1.9/statistics/wskew_source.c59
-rw-r--r--gsl-1.9/statistics/wvariance.c21
-rw-r--r--gsl-1.9/statistics/wvariance_source.c127
-rw-r--r--gsl-1.9/sum/ChangeLog84
-rw-r--r--gsl-1.9/sum/Makefile.am17
-rw-r--r--gsl-1.9/sum/Makefile.in544
-rw-r--r--gsl-1.9/sum/gsl_sum.h162
-rw-r--r--gsl-1.9/sum/levin_u.c255
-rw-r--r--gsl-1.9/sum/levin_utrunc.c202
-rw-r--r--gsl-1.9/sum/test.c234
-rw-r--r--gsl-1.9/sum/work_u.c94
-rw-r--r--gsl-1.9/sum/work_utrunc.c67
-rw-r--r--gsl-1.9/sys/ChangeLog99
-rw-r--r--gsl-1.9/sys/Makefile.am12
-rw-r--r--gsl-1.9/sys/Makefile.in545
-rw-r--r--gsl-1.9/sys/coerce.c54
-rw-r--r--gsl-1.9/sys/expm1.c50
-rw-r--r--gsl-1.9/sys/fcmp.c62
-rw-r--r--gsl-1.9/sys/fdiv.c29
-rw-r--r--gsl-1.9/sys/gsl_sys.h62
-rw-r--r--gsl-1.9/sys/hypot.c48
-rw-r--r--gsl-1.9/sys/infnan.c147
-rw-r--r--gsl-1.9/sys/invhyp.c102
-rw-r--r--gsl-1.9/sys/ldfrexp.c60
-rw-r--r--gsl-1.9/sys/log1p.c30
-rw-r--r--gsl-1.9/sys/minmax.c84
-rw-r--r--gsl-1.9/sys/pow_int.c54
-rw-r--r--gsl-1.9/sys/prec.c75
-rw-r--r--gsl-1.9/sys/test.c473
-rw-r--r--gsl-1.9/templates_off.h92
-rw-r--r--gsl-1.9/templates_on.h251
-rw-r--r--gsl-1.9/test/ChangeLog32
-rw-r--r--gsl-1.9/test/Makefile.am10
-rw-r--r--gsl-1.9/test/Makefile.in452
-rw-r--r--gsl-1.9/test/gsl_test.h66
-rw-r--r--gsl-1.9/test/results.c461
-rwxr-xr-xgsl-1.9/test_gsl_histogram.sh16
-rw-r--r--gsl-1.9/utils/Makefile.am7
-rw-r--r--gsl-1.9/utils/Makefile.in419
-rw-r--r--gsl-1.9/utils/README5
-rw-r--r--gsl-1.9/utils/memcpy.c20
-rw-r--r--gsl-1.9/utils/memmove.c24
-rw-r--r--gsl-1.9/utils/placeholder.c9
-rw-r--r--gsl-1.9/utils/strdup.c43
-rw-r--r--gsl-1.9/utils/strtol.c162
-rw-r--r--gsl-1.9/utils/strtoul.c21
-rw-r--r--gsl-1.9/utils/system.h102
-rw-r--r--gsl-1.9/vector/ChangeLog204
-rw-r--r--gsl-1.9/vector/Makefile.am21
-rw-r--r--gsl-1.9/vector/Makefile.in559
-rw-r--r--gsl-1.9/vector/TODO3
-rw-r--r--gsl-1.9/vector/copy.c87
-rw-r--r--gsl-1.9/vector/copy_source.c51
-rw-r--r--gsl-1.9/vector/file.c89
-rw-r--r--gsl-1.9/vector/file_source.c63
-rw-r--r--gsl-1.9/vector/gsl_vector.h25
-rw-r--r--gsl-1.9/vector/gsl_vector_char.h228
-rw-r--r--gsl-1.9/vector/gsl_vector_complex.h17
-rw-r--r--gsl-1.9/vector/gsl_vector_complex_double.h247
-rw-r--r--gsl-1.9/vector/gsl_vector_complex_float.h247
-rw-r--r--gsl-1.9/vector/gsl_vector_complex_long_double.h247
-rw-r--r--gsl-1.9/vector/gsl_vector_double.h228
-rw-r--r--gsl-1.9/vector/gsl_vector_float.h228
-rw-r--r--gsl-1.9/vector/gsl_vector_int.h228
-rw-r--r--gsl-1.9/vector/gsl_vector_long.h228
-rw-r--r--gsl-1.9/vector/gsl_vector_long_double.h228
-rw-r--r--gsl-1.9/vector/gsl_vector_short.h228
-rw-r--r--gsl-1.9/vector/gsl_vector_uchar.h228
-rw-r--r--gsl-1.9/vector/gsl_vector_uint.h228
-rw-r--r--gsl-1.9/vector/gsl_vector_ulong.h228
-rw-r--r--gsl-1.9/vector/gsl_vector_ushort.h228
-rw-r--r--gsl-1.9/vector/init.c87
-rw-r--r--gsl-1.9/vector/init_source.c228
-rw-r--r--gsl-1.9/vector/minmax.c72
-rw-r--r--gsl-1.9/vector/minmax_source.c217
-rw-r--r--gsl-1.9/vector/oper.c71
-rw-r--r--gsl-1.9/vector/oper_source.c150
-rw-r--r--gsl-1.9/vector/prop.c87
-rw-r--r--gsl-1.9/vector/prop_source.c91
-rw-r--r--gsl-1.9/vector/reim.c44
-rw-r--r--gsl-1.9/vector/reim_source.c56
-rw-r--r--gsl-1.9/vector/subvector.c176
-rw-r--r--gsl-1.9/vector/subvector_source.c86
-rw-r--r--gsl-1.9/vector/swap.c87
-rw-r--r--gsl-1.9/vector/swap_source.c107
-rw-r--r--gsl-1.9/vector/test.c243
-rw-r--r--gsl-1.9/vector/test_complex_source.c579
-rw-r--r--gsl-1.9/vector/test_source.c808
-rw-r--r--gsl-1.9/vector/test_static.c6
-rw-r--r--gsl-1.9/vector/vector.c109
-rw-r--r--gsl-1.9/vector/vector_source.c83
-rw-r--r--gsl-1.9/vector/view.c176
-rw-r--r--gsl-1.9/vector/view.h2
-rw-r--r--gsl-1.9/vector/view_source.c76
-rw-r--r--gsl-1.9/version.c30
-rw-r--r--gsl-1.9/wavelet/ChangeLog14
-rw-r--r--gsl-1.9/wavelet/Makefile.am17
-rw-r--r--gsl-1.9/wavelet/Makefile.in546
-rw-r--r--gsl-1.9/wavelet/TODO11
-rw-r--r--gsl-1.9/wavelet/bspline.c591
-rw-r--r--gsl-1.9/wavelet/daubechies.c458
-rw-r--r--gsl-1.9/wavelet/dwt.c390
-rw-r--r--gsl-1.9/wavelet/gsl_wavelet.h108
-rw-r--r--gsl-1.9/wavelet/gsl_wavelet2d.h107
-rw-r--r--gsl-1.9/wavelet/haar.c81
-rw-r--r--gsl-1.9/wavelet/test.c270
-rw-r--r--gsl-1.9/wavelet/wavelet.c132
1667 files changed, 526559 insertions, 0 deletions
diff --git a/gsl-1.9/AUTHORS b/gsl-1.9/AUTHORS
new file mode 100644
index 0000000..de4aeb3
--- /dev/null
+++ b/gsl-1.9/AUTHORS
@@ -0,0 +1,26 @@
+Mark Galassi (rosalia@lanl.gov) - overall design, simulated annealing
+Jim Davies (jimmyd@nis.lanl.gov) - statistics library
+James Theiler (jt@lanl.gov) - random number generators
+Brian Gough (bjg@network-theory.co.uk) -
+ FFTs, numerical integration, random number generators and distributions,
+ root finding, minimization and fitting, polynomial solvers, complex
+ numbers, physical constants, permutations, vector and matrix functions,
+ histograms, statistics, ieee-utils, revised CBLAS Level 2 & 3, matrix
+ decompositions and eigensystems.
+Reid Priedhorsky (rp@lanl.gov) - root finding
+Gerard Jungman (jungman@lanl.gov) special functions, interpolation,
+ series acceleration, ODEs, BLAS, Linear Algebra, Eigensystems,
+ Hankel Transforms.
+Michael Booth (booth@debian.org (email address not working)) - Monte
+ Carlo integration
+Fabrice Rossi (rossi@ufrmd.dauphine.fr) - Multidimensional minimization
+Simone Piccardi (piccardi@fi.infn.it) - Ntuples
+Carlo Perassi (carlo@linux.it) - Additional random number generators
+Dan, Ho-Jin (hjdan@sys713.kaist.ac.kr) - divided differences interpolation
+Szymon Jaroszewicz (sj@cs.umb.edu) - combinations
+Nicolas Darnis (ndarnis@cvf.fr) - canonical permutation functions
+Tuomo Keskitalo (tuomo.keskitalo@iki.fi) - multidimensional minimization
+Ivo Alxneit (ivo.alxneit@psi.ch) - multidimensional minimization, wavelet
+ transforms
+Jason H. Stover (jason@sakla.net) - cumulative distribution functions
+Patrick Alken <patrick.alken@colorado.edu> - unsymmetric eigensystems, B-splines
diff --git a/gsl-1.9/BUGS b/gsl-1.9/BUGS
new file mode 100644
index 0000000..34d167f
--- /dev/null
+++ b/gsl-1.9/BUGS
@@ -0,0 +1,201 @@
+This file is the GSL bug tracking system. The CVS version of this
+file should be kept up-to-date.
+
+----------------------------------------------------------------------
+BUG#1 -- gsl_sf_hyperg_2F1_e fails for some arguments
+
+From: keith.briggs@bt.com
+Subject: gsl_sf_hyperg_2F1 bug report
+Date: Thu, 31 Jan 2002 12:30:04 -0000
+
+gsl_sf_hyperg_2F1_e fails with arguments (1,13,14,0.999227196008978,&r).
+It should return 53.4645... .
+
+#include <gsl/gsl_sf.h>
+#include <stdio.h>
+
+int main (void)
+{
+ gsl_sf_result r;
+ gsl_sf_hyperg_2F1_e (1,13,14,0.999227196008978,&r);
+ printf("r = %g %g\n", r.val, r.err);
+}
+
+NOTES: The program overflows the maximum number of iterations in
+gsl_sf_hyperg_2F1, due to the presence of a nearby singularity at
+(c=a+b,x=1) so the sum is slowly convergent.
+
+The exact result is 53.46451441879150950530608621 as calculated by
+gp-pari using sumpos(k=0,gamma(a+k)*gamma(b+k)*gamma(c)*gamma(1)/
+(gamma(c+k)*gamma(1+k)*gamma(a)*gamma(b))*x^k)
+
+The code needs to be extended to handle the case c=a+b. This is the
+main problem. The case c=a+b is special and needs to be computed
+differently. There is a special formula given for it in Abramowitz &
+Stegun 15.3.10
+
+As reported by Lee Warren <warren@atom.chem.utk.edu> another set of
+arguments which fail are:
+
+#include <gsl/gsl_sf.h>
+#include <stdio.h>
+
+int main (void)
+{
+ gsl_sf_result r;
+ gsl_sf_hyperg_2F1_e (-1, -1, -0.5, 1.5, &r);
+ printf("r = %g %g\n", r.val, r.err);
+}
+
+The correct value is -2.
+
+See also,
+
+From: Olaf Wucknitz <wucknitz@jive.nl>
+To: bug-gsl@gnu.org
+Subject: [Bug-gsl] gsl_sf_hyperg_2F1
+
+Hi,
+
+I am having a problem with gsl_sf_hyperg_2F1.
+With the parameters (-0.5, 0.5, 1, x) the returned values show a jump at
+x=0.5. For x<0.5 the results seem to be correct, while for x>0.5 they
+aren't.
+The function gsl_sf_hyperg_2F1_e calls hyperg_2F1_series for x<0.5, but
+hyperg_2F1_reflect for x>0.5. The latter function checks for c-a-b being
+an integer (which it is in my case). If I change one of the parameters
+a,b,c by a small amount, the other branch of the function is taken and the
+results are correct again.
+Unfortunately I know too little about the numerics of 2F1 to suggest a
+patch at the moment.
+
+Regards,
+Olaf Wucknitz
+--
+Joint Institute for VLBI in Europe wucknitz@jive.nl
+
+----------------------------------------------------------------------
+BUG#44 -- gamma_inc_P and gamma_inc_Q only satisfy P+Q=1 within errors
+
+The sum of gamma_inc_P and gamma_inc_Q doesn't always satisfy the
+identity P+Q=1 exactly (although it is correct within errors), due the
+slightly different branch conditions for the series and continued
+fraction expansions. These could be made identical so that P+Q=1 exactly.
+
+#include <stdio.h>
+#include <gsl/gsl_sf_gamma.h>
+
+int
+main (void)
+{
+ gsl_sf_result r1, r2;
+ double a = 0.3, x = 1.0;
+ gsl_sf_gamma_inc_P_e (a, x, &r1);
+ gsl_sf_gamma_inc_Q_e (a, x, &r2);
+ printf("%.18e\n", r1.val);
+ printf("%.18e\n", r2.val);
+ printf("%.18e\n", r1.val + r2.val);
+}
+
+$ ./a.out
+9.156741562411074842e-01
+8.432584375889111417e-02
+9.999999999999985567e-01
+
+
+----------------------------------------------------------------------
+BUG#49 - fdjacobian step size causes problems
+
+From: eknecronzontas <eknecronzontas@yahoo.com>
+To: help-gsl@gnu.org
+Subject: [Help-gsl] Bug (or not?) in multiroots/fdjacobian.c
+Date: Thu, 8 Jun 2006 13:38:49 -0700 (PDT)
+
+Since I can't quite decide if this is a bug, I'll post
+it here first...
+
+The stepsize for finite-differencing in
+gsl-1.8/multiroots/fdjacobian.c is specified by the
+lines
+
+> double xj = gsl_vector_get (x, j);
+> double dx = epsrel * fabs (xj);
+
+This is, of course mathematically correct.
+Nevertheless, the behavior is less than ideal if one
+of the elements of the vector 'x' is sufficiently
+small. This occurs often if one component of the root
+happens to be zero. If this occurs, then 'dx' can be
+so small that one of the columns of the Jacobian is
+identically zero. This immediately leads to NAN's
+which are not easy to trace.
+
+---------------------------------------------------------------------
+BUG#50 - gsl_linalg_solve_symm_tridiag requires positive definite matrix
+
+A zero on the diagonal will cause NaNs even though a reasonable
+solution could be computed in principle.
+
+#include <gsl/gsl_linalg.h>
+
+int main (void)
+{
+ double d[] = { 0.00, 1.21, 0.80, 1.55, 0.76 } ;
+ double e[] = { 0.82, 0.39, 0.09, 0.68 } ;
+ double b[] = { 0.07, 0.62, 0.81, 0.11, 0.65} ;
+ double x[] = { 0.00, 0.00, 0.00, 0.00, 0.00} ;
+
+ gsl_vector_view dv = gsl_vector_view_array(d, 5);
+ gsl_vector_view ev = gsl_vector_view_array(e, 4);
+ gsl_vector_view bv = gsl_vector_view_array(b, 5);
+ gsl_vector_view xv = gsl_vector_view_array(x, 5);
+
+ gsl_linalg_solve_symm_tridiag(&dv.vector, &ev.vector, &bv.vector, &xv.vector);
+ gsl_vector_fprintf(stdout, &xv.vector, "% .5f");
+
+ d[0] += 1e-5;
+ gsl_linalg_solve_symm_tridiag(&dv.vector, &ev.vector, &bv.vector, &xv.vector);
+ gsl_vector_fprintf(stdout, &xv.vector, "% .5f");
+}
+
+$ ./a.out
+ nan
+ nan
+ nan
+ nan
+ nan
+ 0.13626
+ 0.08536
+ 1.03840
+-0.60009
+ 1.39219
+
+
+----------------------------------------------------------------------
+BUG#52 - beta functions do not handle negative arguments
+
+The beta functions (complete and incomplete) are well defined for
+non-integer negative arguments in terms of the gamma function but
+return domain errors or nans. The relation of I_x(a,b,x) = (1/a) x^a
+2F1(a,1-b,a+1,x)/B(a,b) could be documented even if it is not
+implemented.
+
+DONE for beta function, still needed for incomplete beta function.
+
+----------------------------------------------------------------------
+BUG#57 - incorrect rounding error in deriv functions?
+
+Needs a factor of 1/h^2 ?
+
+From: Rene Girard <rg_linux1@yahoo.ca>
+To: help-gsl@gnu.org
+Subject: [Help-gsl] Origin of 2nd round-off term "dy" in function central_deriv.c
+
+double dy = GSL_MAX(fabs(r3),fabs(r5))* fabs(x)*GSL_DBL_EPSILON
+
+I understand the rest of the function very well and I am able to
+derive the equation for the optimal stepsize "h_opt" in function
+"gsl_deriv_central.c"; however, I am trying to look for a derivation
+for the expression of "dy".
+----------------------------------------------------------------------
+Last assigned bug number = 57
diff --git a/gsl-1.9/COPYING b/gsl-1.9/COPYING
new file mode 100644
index 0000000..3912109
--- /dev/null
+++ b/gsl-1.9/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/gsl-1.9/ChangeLog b/gsl-1.9/ChangeLog
new file mode 100644
index 0000000..495cfa2
--- /dev/null
+++ b/gsl-1.9/ChangeLog
@@ -0,0 +1,1355 @@
+2011-04-08 Joel Sherrill <joel.sherrill@oarcorp.com>
+
+ * AUTHORS, BUGS, COPYING, ChangeLog, INSTALL, Makefile.am, Makefile.in,
+ NEWS, README, SUPPORT, THANKS, TODO, acconfig.h, aclocal.m4,
+ autogen.sh, config.guess, config.h.in, config.sub, configure,
+ configure.ac, gsl-config.in, gsl-histogram.c, gsl-randist.c, gsl.m4,
+ gsl.pc.in, gsl.spec.in, gsl_machine.h, gsl_math.h, gsl_mode.h,
+ gsl_nan.h, gsl_pow_int.h, gsl_precision.h, gsl_types.h,
+ gsl_version.h.in, install-sh, ltmain.sh, mdate-sh, missing,
+ mkinstalldirs, templates_off.h, templates_on.h,
+ test_gsl_histogram.sh, version.c, blas/ChangeLog, blas/Makefile.am,
+ blas/Makefile.in, blas/TODO, blas/blas.c, blas/gsl_blas.h,
+ blas/gsl_blas_types.h, block/ChangeLog, block/Makefile.am,
+ block/Makefile.in, block/block.c, block/block_source.c, block/file.c,
+ block/fprintf_source.c, block/fwrite_source.c, block/gsl_block.h,
+ block/gsl_block_char.h, block/gsl_block_complex_double.h,
+ block/gsl_block_complex_float.h,
+ block/gsl_block_complex_long_double.h, block/gsl_block_double.h,
+ block/gsl_block_float.h, block/gsl_block_int.h,
+ block/gsl_block_long.h, block/gsl_block_long_double.h,
+ block/gsl_block_short.h, block/gsl_block_uchar.h,
+ block/gsl_block_uint.h, block/gsl_block_ulong.h,
+ block/gsl_block_ushort.h, block/gsl_check_range.h, block/init.c,
+ block/init_source.c, block/test.c, block/test_complex_io.c,
+ block/test_complex_source.c, block/test_io.c, block/test_source.c,
+ bspline/ChangeLog, bspline/Makefile.am, bspline/Makefile.in,
+ bspline/TODO, bspline/bspline.c, bspline/gsl_bspline.h,
+ bspline/test.c, cblas/ChangeLog, cblas/Makefile.am,
+ cblas/Makefile.in, cblas/TODO, cblas/caxpy.c, cblas/cblas.h,
+ cblas/ccopy.c, cblas/cdotc_sub.c, cblas/cdotu_sub.c, cblas/cgbmv.c,
+ cblas/cgemm.c, cblas/cgemv.c, cblas/cgerc.c, cblas/cgeru.c,
+ cblas/chbmv.c, cblas/chemm.c, cblas/chemv.c, cblas/cher.c,
+ cblas/cher2.c, cblas/cher2k.c, cblas/cherk.c, cblas/chpmv.c,
+ cblas/chpr.c, cblas/chpr2.c, cblas/cscal.c, cblas/csscal.c,
+ cblas/cswap.c, cblas/csymm.c, cblas/csyr2k.c, cblas/csyrk.c,
+ cblas/ctbmv.c, cblas/ctbsv.c, cblas/ctpmv.c, cblas/ctpsv.c,
+ cblas/ctrmm.c, cblas/ctrmv.c, cblas/ctrsm.c, cblas/ctrsv.c,
+ cblas/dasum.c, cblas/daxpy.c, cblas/dcopy.c, cblas/ddot.c,
+ cblas/dgbmv.c, cblas/dgemm.c, cblas/dgemv.c, cblas/dger.c,
+ cblas/dnrm2.c, cblas/drot.c, cblas/drotg.c, cblas/drotm.c,
+ cblas/drotmg.c, cblas/dsbmv.c, cblas/dscal.c, cblas/dsdot.c,
+ cblas/dspmv.c, cblas/dspr.c, cblas/dspr2.c, cblas/dswap.c,
+ cblas/dsymm.c, cblas/dsymv.c, cblas/dsyr.c, cblas/dsyr2.c,
+ cblas/dsyr2k.c, cblas/dsyrk.c, cblas/dtbmv.c, cblas/dtbsv.c,
+ cblas/dtpmv.c, cblas/dtpsv.c, cblas/dtrmm.c, cblas/dtrmv.c,
+ cblas/dtrsm.c, cblas/dtrsv.c, cblas/dzasum.c, cblas/dznrm2.c,
+ cblas/gsl_cblas.h, cblas/hypot.c, cblas/icamax.c, cblas/idamax.c,
+ cblas/isamax.c, cblas/izamax.c, cblas/sasum.c, cblas/saxpy.c,
+ cblas/scasum.c, cblas/scnrm2.c, cblas/scopy.c, cblas/sdot.c,
+ cblas/sdsdot.c, cblas/sgbmv.c, cblas/sgemm.c, cblas/sgemv.c,
+ cblas/sger.c, cblas/snrm2.c, cblas/source_asum_c.h,
+ cblas/source_asum_r.h, cblas/source_axpy_c.h, cblas/source_axpy_r.h,
+ cblas/source_copy_c.h, cblas/source_copy_r.h, cblas/source_dot_c.h,
+ cblas/source_dot_r.h, cblas/source_gbmv_c.h, cblas/source_gbmv_r.h,
+ cblas/source_gemm_c.h, cblas/source_gemm_r.h, cblas/source_gemv_c.h,
+ cblas/source_gemv_r.h, cblas/source_ger.h, cblas/source_gerc.h,
+ cblas/source_geru.h, cblas/source_hbmv.h, cblas/source_hemm.h,
+ cblas/source_hemv.h, cblas/source_her.h, cblas/source_her2.h,
+ cblas/source_her2k.h, cblas/source_herk.h, cblas/source_hpmv.h,
+ cblas/source_hpr.h, cblas/source_hpr2.h, cblas/source_iamax_c.h,
+ cblas/source_iamax_r.h, cblas/source_nrm2_c.h, cblas/source_nrm2_r.h,
+ cblas/source_rot.h, cblas/source_rotg.h, cblas/source_rotm.h,
+ cblas/source_rotmg.h, cblas/source_sbmv.h, cblas/source_scal_c.h,
+ cblas/source_scal_c_s.h, cblas/source_scal_r.h, cblas/source_spmv.h,
+ cblas/source_spr.h, cblas/source_spr2.h, cblas/source_swap_c.h,
+ cblas/source_swap_r.h, cblas/source_symm_c.h, cblas/source_symm_r.h,
+ cblas/source_symv.h, cblas/source_syr.h, cblas/source_syr2.h,
+ cblas/source_syr2k_c.h, cblas/source_syr2k_r.h,
+ cblas/source_syrk_c.h, cblas/source_syrk_r.h, cblas/source_tbmv_c.h,
+ cblas/source_tbmv_r.h, cblas/source_tbsv_c.h, cblas/source_tbsv_r.h,
+ cblas/source_tpmv_c.h, cblas/source_tpmv_r.h, cblas/source_tpsv_c.h,
+ cblas/source_tpsv_r.h, cblas/source_trmm_c.h, cblas/source_trmm_r.h,
+ cblas/source_trmv_c.h, cblas/source_trmv_r.h, cblas/source_trsm_c.h,
+ cblas/source_trsm_r.h, cblas/source_trsv_c.h, cblas/source_trsv_r.h,
+ cblas/srot.c, cblas/srotg.c, cblas/srotm.c, cblas/srotmg.c,
+ cblas/ssbmv.c, cblas/sscal.c, cblas/sspmv.c, cblas/sspr.c,
+ cblas/sspr2.c, cblas/sswap.c, cblas/ssymm.c, cblas/ssymv.c,
+ cblas/ssyr.c, cblas/ssyr2.c, cblas/ssyr2k.c, cblas/ssyrk.c,
+ cblas/stbmv.c, cblas/stbsv.c, cblas/stpmv.c, cblas/stpsv.c,
+ cblas/strmm.c, cblas/strmv.c, cblas/strsm.c, cblas/strsv.c,
+ cblas/test.c, cblas/test_amax.c, cblas/test_asum.c,
+ cblas/test_axpy.c, cblas/test_copy.c, cblas/test_dot.c,
+ cblas/test_gbmv.c, cblas/test_gemm.c, cblas/test_gemv.c,
+ cblas/test_ger.c, cblas/test_hbmv.c, cblas/test_hemm.c,
+ cblas/test_hemv.c, cblas/test_her.c, cblas/test_her2.c,
+ cblas/test_her2k.c, cblas/test_herk.c, cblas/test_hpmv.c,
+ cblas/test_hpr.c, cblas/test_hpr2.c, cblas/test_nrm2.c,
+ cblas/test_rot.c, cblas/test_rotg.c, cblas/test_rotm.c,
+ cblas/test_rotmg.c, cblas/test_sbmv.c, cblas/test_scal.c,
+ cblas/test_spmv.c, cblas/test_spr.c, cblas/test_spr2.c,
+ cblas/test_swap.c, cblas/test_symm.c, cblas/test_symv.c,
+ cblas/test_syr.c, cblas/test_syr2.c, cblas/test_syr2k.c,
+ cblas/test_syrk.c, cblas/test_tbmv.c, cblas/test_tbsv.c,
+ cblas/test_tpmv.c, cblas/test_tpsv.c, cblas/test_trmm.c,
+ cblas/test_trmv.c, cblas/test_trsm.c, cblas/test_trsv.c,
+ cblas/tests.c, cblas/tests.h, cblas/xerbla.c, cblas/zaxpy.c,
+ cblas/zcopy.c, cblas/zdotc_sub.c, cblas/zdotu_sub.c, cblas/zdscal.c,
+ cblas/zgbmv.c, cblas/zgemm.c, cblas/zgemv.c, cblas/zgerc.c,
+ cblas/zgeru.c, cblas/zhbmv.c, cblas/zhemm.c, cblas/zhemv.c,
+ cblas/zher.c, cblas/zher2.c, cblas/zher2k.c, cblas/zherk.c,
+ cblas/zhpmv.c, cblas/zhpr.c, cblas/zhpr2.c, cblas/zscal.c,
+ cblas/zswap.c, cblas/zsymm.c, cblas/zsyr2k.c, cblas/zsyrk.c,
+ cblas/ztbmv.c, cblas/ztbsv.c, cblas/ztpmv.c, cblas/ztpsv.c,
+ cblas/ztrmm.c, cblas/ztrmv.c, cblas/ztrsm.c, cblas/ztrsv.c,
+ cdf/ChangeLog, cdf/Makefile.am, cdf/Makefile.in, cdf/beta.c,
+ cdf/beta_inc.c, cdf/betainv.c, cdf/binomial.c, cdf/cauchy.c,
+ cdf/cauchyinv.c, cdf/chisq.c, cdf/chisqinv.c, cdf/error.h,
+ cdf/exponential.c, cdf/exponentialinv.c, cdf/exppow.c, cdf/fdist.c,
+ cdf/fdistinv.c, cdf/flat.c, cdf/flatinv.c, cdf/gamma.c,
+ cdf/gammainv.c, cdf/gauss.c, cdf/gaussinv.c, cdf/geometric.c,
+ cdf/gsl_cdf.h, cdf/gumbel1.c, cdf/gumbel1inv.c, cdf/gumbel2.c,
+ cdf/gumbel2inv.c, cdf/hypergeometric.c, cdf/laplace.c,
+ cdf/laplaceinv.c, cdf/logistic.c, cdf/logisticinv.c, cdf/lognormal.c,
+ cdf/lognormalinv.c, cdf/nbinomial.c, cdf/pareto.c, cdf/paretoinv.c,
+ cdf/pascal.c, cdf/poisson.c, cdf/rat_eval.h, cdf/rayleigh.c,
+ cdf/rayleighinv.c, cdf/tdist.c, cdf/tdistinv.c, cdf/test.c,
+ cdf/test_auto.c, cdf/weibull.c, cdf/weibullinv.c, cheb/ChangeLog,
+ cheb/Makefile.am, cheb/Makefile.in, cheb/deriv.c, cheb/eval.c,
+ cheb/gsl_chebyshev.h, cheb/init.c, cheb/integ.c, cheb/test.c,
+ combination/ChangeLog, combination/Makefile.am,
+ combination/Makefile.in, combination/combination.c,
+ combination/file.c, combination/gsl_combination.h,
+ combination/init.c, combination/test.c, complex/ChangeLog,
+ complex/Makefile.am, complex/Makefile.in, complex/TODO,
+ complex/gsl_complex.h, complex/gsl_complex_math.h, complex/math.c,
+ complex/results.h, complex/results1.h, complex/results_real.h,
+ complex/test.c, const/ChangeLog, const/Makefile.am,
+ const/Makefile.in, const/TODO, const/gsl_const.h,
+ const/gsl_const_cgs.h, const/gsl_const_cgsm.h, const/gsl_const_mks.h,
+ const/gsl_const_mksa.h, const/gsl_const_num.h, const/test.c,
+ deriv/ChangeLog, deriv/Makefile.am, deriv/Makefile.in, deriv/deriv.c,
+ deriv/gsl_deriv.h, deriv/test.c, dht/ChangeLog, dht/Makefile.am,
+ dht/Makefile.in, dht/dht.c, dht/gsl_dht.h, dht/test.c,
+ diff/ChangeLog, diff/Makefile.am, diff/Makefile.in, diff/diff.c,
+ diff/gsl_diff.h, diff/test.c, doc/12-cities.eps, doc/ChangeLog,
+ doc/Makefile.am, doc/Makefile.in, doc/algorithm.sty,
+ doc/algorithmic.sty, doc/autoconf.texi, doc/blas.texi,
+ doc/bspline.eps, doc/bspline.texi, doc/calc.sty, doc/cblas.texi,
+ doc/cheb.eps, doc/cheb.texi, doc/combination.texi, doc/complex.texi,
+ doc/const.texi, doc/debug.texi, doc/dht.texi, doc/diff.texi,
+ doc/dwt-orig.eps, doc/dwt-samp.eps, doc/dwt.texi, doc/eigen.texi,
+ doc/err.texi, doc/fdl.texi, doc/fft-complex-radix2-f.eps,
+ doc/fft-complex-radix2-t.eps, doc/fft-complex-radix2.eps,
+ doc/fft-real-mixedradix.eps, doc/fft.texi, doc/fftalgorithms.bib,
+ doc/fftalgorithms.tex, doc/final-route.eps, doc/fit-exp.eps,
+ doc/fit-wlinear.eps, doc/fit-wlinear2.eps, doc/fitting.texi,
+ doc/freemanuals.texi, doc/gpl.texi, doc/gsl-config.1,
+ doc/gsl-design.texi, doc/gsl-histogram.1, doc/gsl-randist.1,
+ doc/gsl-ref.info, doc/gsl-ref.info-1, doc/gsl-ref.info-2,
+ doc/gsl-ref.info-3, doc/gsl-ref.info-4, doc/gsl-ref.info-5,
+ doc/gsl-ref.info-6, doc/gsl-ref.texi, doc/gsl.3, doc/histogram.eps,
+ doc/histogram.texi, doc/histogram2d.eps, doc/ieee754.texi,
+ doc/initial-route.eps, doc/integration.texi, doc/interp.texi,
+ doc/interp2.eps, doc/interpp2.eps, doc/intro.texi, doc/landau.dat,
+ doc/linalg.texi, doc/math.texi, doc/mdate-sh, doc/min-interval.eps,
+ doc/min.texi, doc/montecarlo.texi, doc/multifit.texi,
+ doc/multimin.eps, doc/multimin.texi, doc/multiroots.texi,
+ doc/ntuple.eps, doc/ntuple.texi, doc/ode-initval.texi,
+ doc/permutation.texi, doc/poly.texi, doc/qrng.eps, doc/qrng.texi,
+ doc/rand-bernoulli.tex, doc/rand-beta.tex, doc/rand-binomial.tex,
+ doc/rand-bivariate-gaussian.tex, doc/rand-cauchy.tex,
+ doc/rand-chisq.tex, doc/rand-erlang.tex, doc/rand-exponential.tex,
+ doc/rand-exppow.tex, doc/rand-fdist.tex, doc/rand-flat.tex,
+ doc/rand-gamma.tex, doc/rand-gaussian-tail.tex,
+ doc/rand-gaussian.tex, doc/rand-geometric.tex, doc/rand-gumbel.tex,
+ doc/rand-gumbel1.tex, doc/rand-gumbel2.tex,
+ doc/rand-hypergeometric.tex, doc/rand-landau.tex,
+ doc/rand-laplace.tex, doc/rand-levy.tex, doc/rand-levyskew.tex,
+ doc/rand-logarithmic.tex, doc/rand-logistic.tex,
+ doc/rand-lognormal.tex, doc/rand-nbinomial.tex, doc/rand-pareto.tex,
+ doc/rand-pascal.tex, doc/rand-poisson.tex,
+ doc/rand-rayleigh-tail.tex, doc/rand-rayleigh.tex,
+ doc/rand-tdist.tex, doc/rand-weibull.tex, doc/randist.texi,
+ doc/random-walk.tex, doc/randplots.gnp, doc/rng.texi,
+ doc/roots-bisection.eps, doc/roots-false-position.eps,
+ doc/roots-newtons-method.eps, doc/roots-secant-method.eps,
+ doc/roots.texi, doc/siman-energy.eps, doc/siman-test.eps,
+ doc/siman.texi, doc/sort.texi, doc/specfunc-airy.texi,
+ doc/specfunc-bessel.texi, doc/specfunc-clausen.texi,
+ doc/specfunc-coulomb.texi, doc/specfunc-coupling.texi,
+ doc/specfunc-dawson.texi, doc/specfunc-debye.texi,
+ doc/specfunc-dilog.texi, doc/specfunc-elementary.texi,
+ doc/specfunc-ellint.texi, doc/specfunc-elljac.texi,
+ doc/specfunc-erf.texi, doc/specfunc-exp.texi,
+ doc/specfunc-expint.texi, doc/specfunc-fermi-dirac.texi,
+ doc/specfunc-gamma.texi, doc/specfunc-gegenbauer.texi,
+ doc/specfunc-hyperg.texi, doc/specfunc-laguerre.texi,
+ doc/specfunc-lambert.texi, doc/specfunc-legendre.texi,
+ doc/specfunc-log.texi, doc/specfunc-mathieu.texi,
+ doc/specfunc-pow-int.texi, doc/specfunc-psi.texi,
+ doc/specfunc-synchrotron.texi, doc/specfunc-transport.texi,
+ doc/specfunc-trig.texi, doc/specfunc-zeta.texi, doc/specfunc.texi,
+ doc/stamp-vti, doc/statistics.texi, doc/sum.texi, doc/texinfo.tex,
+ doc/usage.texi, doc/vdp.eps, doc/vectors.texi, doc/version-ref.texi,
+ doc/examples/blas.c, doc/examples/blas.out, doc/examples/block.c,
+ doc/examples/block.out, doc/examples/bspline.c, doc/examples/cblas.c,
+ doc/examples/cblas.out, doc/examples/cdf.c, doc/examples/cdf.out,
+ doc/examples/cheb.c, doc/examples/combination.c,
+ doc/examples/combination.out, doc/examples/const.c,
+ doc/examples/const.out, doc/examples/demo_fn.c,
+ doc/examples/demo_fn.h, doc/examples/diff.c, doc/examples/diff.out,
+ doc/examples/dwt.c, doc/examples/dwt.dat, doc/examples/ecg.dat,
+ doc/examples/eigen.c, doc/examples/eigen_nonsymm.c,
+ doc/examples/expfit.c, doc/examples/fft.c, doc/examples/fftmr.c,
+ doc/examples/fftreal.c, doc/examples/fitting.c,
+ doc/examples/fitting2.c, doc/examples/fitting3.c,
+ doc/examples/histogram.c, doc/examples/histogram2d.c,
+ doc/examples/ieee.c, doc/examples/ieeeround.c,
+ doc/examples/integration.c, doc/examples/integration.out,
+ doc/examples/interp.c, doc/examples/interpp.c, doc/examples/intro.c,
+ doc/examples/intro.out, doc/examples/linalglu.c,
+ doc/examples/linalglu.out, doc/examples/matrix.c,
+ doc/examples/matrixw.c, doc/examples/min.c, doc/examples/min.out,
+ doc/examples/monte.c, doc/examples/nlfit.c, doc/examples/ntupler.c,
+ doc/examples/ntuplew.c, doc/examples/ode-initval.c,
+ doc/examples/odefixed.c, doc/examples/permseq.c,
+ doc/examples/permshuffle.c, doc/examples/polyroots.c,
+ doc/examples/polyroots.out, doc/examples/qrng.c,
+ doc/examples/randpoisson.2.out, doc/examples/randpoisson.c,
+ doc/examples/randpoisson.out, doc/examples/randwalk.c,
+ doc/examples/rng.c, doc/examples/rng.out, doc/examples/rngunif.2.out,
+ doc/examples/rngunif.c, doc/examples/rngunif.out,
+ doc/examples/rootnewt.c, doc/examples/roots.c, doc/examples/siman.c,
+ doc/examples/sortsmall.c, doc/examples/sortsmall.out,
+ doc/examples/specfun.c, doc/examples/specfun.out,
+ doc/examples/specfun_e.c, doc/examples/specfun_e.out,
+ doc/examples/stat.c, doc/examples/stat.out, doc/examples/statsort.c,
+ doc/examples/statsort.out, doc/examples/sum.c, doc/examples/sum.out,
+ doc/examples/vector.c, doc/examples/vectorr.c,
+ doc/examples/vectorview.c, doc/examples/vectorview.out,
+ doc/examples/vectorw.c, eigen/ChangeLog, eigen/Makefile.am,
+ eigen/Makefile.in, eigen/TODO, eigen/francis.c, eigen/gsl_eigen.h,
+ eigen/herm.c, eigen/hermv.c, eigen/jacobi.c, eigen/nonsymm.c,
+ eigen/nonsymmv.c, eigen/qrstep.c, eigen/schur.c, eigen/schur.h,
+ eigen/sort.c, eigen/symm.c, eigen/symmv.c, eigen/test.c,
+ err/ChangeLog, err/Makefile.am, err/Makefile.in, err/TODO,
+ err/error.c, err/gsl_errno.h, err/gsl_message.h, err/message.c,
+ err/stream.c, err/strerror.c, err/test.c, fft/ChangeLog,
+ fft/Makefile.am, fft/Makefile.in, fft/TODO, fft/bitreverse.c,
+ fft/bitreverse.h, fft/c_init.c, fft/c_main.c, fft/c_pass.h,
+ fft/c_pass_2.c, fft/c_pass_3.c, fft/c_pass_4.c, fft/c_pass_5.c,
+ fft/c_pass_6.c, fft/c_pass_7.c, fft/c_pass_n.c, fft/c_radix2.c,
+ fft/compare.h, fft/compare_source.c, fft/complex_internal.h,
+ fft/dft.c, fft/dft_source.c, fft/factorize.c, fft/factorize.h,
+ fft/fft.c, fft/gsl_dft_complex.h, fft/gsl_dft_complex_float.h,
+ fft/gsl_fft.h, fft/gsl_fft_complex.h, fft/gsl_fft_complex_float.h,
+ fft/gsl_fft_halfcomplex.h, fft/gsl_fft_halfcomplex_float.h,
+ fft/gsl_fft_real.h, fft/gsl_fft_real_float.h, fft/hc_init.c,
+ fft/hc_main.c, fft/hc_pass.h, fft/hc_pass_2.c, fft/hc_pass_3.c,
+ fft/hc_pass_4.c, fft/hc_pass_5.c, fft/hc_pass_n.c, fft/hc_radix2.c,
+ fft/hc_unpack.c, fft/real_init.c, fft/real_main.c, fft/real_pass.h,
+ fft/real_pass_2.c, fft/real_pass_3.c, fft/real_pass_4.c,
+ fft/real_pass_5.c, fft/real_pass_n.c, fft/real_radix2.c,
+ fft/real_unpack.c, fft/signals.c, fft/signals.h,
+ fft/signals_source.c, fft/test.c, fft/test_complex_source.c,
+ fft/test_real_source.c, fft/test_trap_source.c, fft/urand.c,
+ fit/ChangeLog, fit/Makefile.am, fit/Makefile.in, fit/gsl_fit.h,
+ fit/linear.c, fit/test.c, gsl/Makefile.am, gsl/Makefile.in,
+ histogram/ChangeLog, histogram/Makefile.am, histogram/Makefile.in,
+ histogram/TODO, histogram/add.c, histogram/add2d.c,
+ histogram/calloc_range.c, histogram/calloc_range2d.c,
+ histogram/copy.c, histogram/copy2d.c, histogram/file.c,
+ histogram/file2d.c, histogram/find.c, histogram/find2d.c,
+ histogram/get.c, histogram/get2d.c, histogram/gsl_histogram.h,
+ histogram/gsl_histogram2d.h, histogram/init.c, histogram/init2d.c,
+ histogram/maxval.c, histogram/maxval2d.c, histogram/oper.c,
+ histogram/oper2d.c, histogram/params.c, histogram/params2d.c,
+ histogram/pdf.c, histogram/pdf2d.c, histogram/reset.c,
+ histogram/reset2d.c, histogram/stat.c, histogram/stat2d.c,
+ histogram/test.c, histogram/test1d.c, histogram/test1d_resample.c,
+ histogram/test1d_trap.c, histogram/test2d.c,
+ histogram/test2d_resample.c, histogram/test2d_trap.c,
+ histogram/urand.c, ieee-utils/ChangeLog, ieee-utils/Makefile.am,
+ ieee-utils/Makefile.in, ieee-utils/TODO, ieee-utils/endian.c,
+ ieee-utils/env.c, ieee-utils/fp-aix.c, ieee-utils/fp-darwin.c,
+ ieee-utils/fp-darwin86.c, ieee-utils/fp-freebsd.c,
+ ieee-utils/fp-gnuc99.c, ieee-utils/fp-gnum68k.c,
+ ieee-utils/fp-gnuppc.c, ieee-utils/fp-gnusparc.c,
+ ieee-utils/fp-gnux86.c, ieee-utils/fp-hpux.c, ieee-utils/fp-hpux11.c,
+ ieee-utils/fp-irix.c, ieee-utils/fp-netbsd.c,
+ ieee-utils/fp-openbsd.c, ieee-utils/fp-os2emx.c,
+ ieee-utils/fp-solaris.c, ieee-utils/fp-sunos4.c,
+ ieee-utils/fp-tru64.c, ieee-utils/fp-unknown.c, ieee-utils/fp.c,
+ ieee-utils/gsl_ieee_utils.h, ieee-utils/make_rep.c,
+ ieee-utils/print.c, ieee-utils/read.c, ieee-utils/standardize.c,
+ ieee-utils/test.c, integration/ChangeLog, integration/Makefile.am,
+ integration/Makefile.in, integration/TODO, integration/append.c,
+ integration/err.c, integration/gsl_integration.h,
+ integration/initialise.c, integration/positivity.c,
+ integration/ptsort.c, integration/qag.c, integration/qagp.c,
+ integration/qags.c, integration/qawc.c, integration/qawf.c,
+ integration/qawo.c, integration/qaws.c, integration/qc25c.c,
+ integration/qc25f.c, integration/qc25s.c, integration/qcheb.c,
+ integration/qelg.c, integration/qk.c, integration/qk15.c,
+ integration/qk21.c, integration/qk31.c, integration/qk41.c,
+ integration/qk51.c, integration/qk61.c, integration/qmomo.c,
+ integration/qmomof.c, integration/qng.c, integration/qng.h,
+ integration/qpsrt.c, integration/qpsrt2.c, integration/reset.c,
+ integration/set_initial.c, integration/test.c, integration/tests.c,
+ integration/tests.h, integration/util.c, integration/workspace.c,
+ interpolation/ChangeLog, interpolation/Makefile.am,
+ interpolation/Makefile.in, interpolation/TODO, interpolation/accel.c,
+ interpolation/akima.c, interpolation/bsearch.c,
+ interpolation/bsearch.h, interpolation/cspline.c,
+ interpolation/gsl_interp.h, interpolation/gsl_spline.h,
+ interpolation/integ_eval.h, interpolation/interp.c,
+ interpolation/linear.c, interpolation/poly.c, interpolation/spline.c,
+ interpolation/test.c, linalg/ChangeLog, linalg/Makefile.am,
+ linalg/Makefile.in, linalg/TODO, linalg/apply_givens.c,
+ linalg/balance.c, linalg/balancemat.c, linalg/bidiag.c,
+ linalg/cholesky.c, linalg/exponential.c, linalg/givens.c,
+ linalg/gsl_linalg.h, linalg/hermtd.c, linalg/hessenberg.c,
+ linalg/hh.c, linalg/householder.c, linalg/householdercomplex.c,
+ linalg/lq.c, linalg/lu.c, linalg/luc.c, linalg/multiply.c,
+ linalg/ptlq.c, linalg/qr.c, linalg/qrpt.c, linalg/svd.c,
+ linalg/svdstep.c, linalg/symmtd.c, linalg/test.c, linalg/tridiag.c,
+ linalg/tridiag.h, matrix/ChangeLog, matrix/Makefile.am,
+ matrix/Makefile.in, matrix/TODO, matrix/copy.c, matrix/copy_source.c,
+ matrix/file.c, matrix/file_source.c, matrix/getset.c,
+ matrix/getset_source.c, matrix/gsl_matrix.h,
+ matrix/gsl_matrix_char.h, matrix/gsl_matrix_complex_double.h,
+ matrix/gsl_matrix_complex_float.h,
+ matrix/gsl_matrix_complex_long_double.h, matrix/gsl_matrix_double.h,
+ matrix/gsl_matrix_float.h, matrix/gsl_matrix_int.h,
+ matrix/gsl_matrix_long.h, matrix/gsl_matrix_long_double.h,
+ matrix/gsl_matrix_short.h, matrix/gsl_matrix_uchar.h,
+ matrix/gsl_matrix_uint.h, matrix/gsl_matrix_ulong.h,
+ matrix/gsl_matrix_ushort.h, matrix/init.c, matrix/init_source.c,
+ matrix/matrix.c, matrix/matrix_source.c, matrix/minmax.c,
+ matrix/minmax_source.c, matrix/oper.c, matrix/oper_complex_source.c,
+ matrix/oper_source.c, matrix/prop.c, matrix/prop_source.c,
+ matrix/rowcol.c, matrix/rowcol_source.c, matrix/submatrix.c,
+ matrix/submatrix_source.c, matrix/swap.c, matrix/swap_source.c,
+ matrix/test.c, matrix/test_complex_source.c, matrix/test_source.c,
+ matrix/test_static.c, matrix/view.c, matrix/view.h,
+ matrix/view_source.c, min/ChangeLog, min/Makefile.am,
+ min/Makefile.in, min/bracketing.c, min/brent.c, min/convergence.c,
+ min/fsolver.c, min/golden.c, min/gsl_min.h, min/min.h, min/test.c,
+ min/test.h, min/test_funcs.c, monte/ChangeLog, monte/Makefile.am,
+ monte/Makefile.in, monte/README, monte/TODO, monte/gsl_monte.h,
+ monte/gsl_monte_miser.h, monte/gsl_monte_plain.h,
+ monte/gsl_monte_vegas.h, monte/miser.c, monte/plain.c, monte/test.c,
+ monte/test_main.c, monte/vegas.c, multifit/ChangeLog,
+ multifit/Makefile.am, multifit/Makefile.in, multifit/TODO,
+ multifit/convergence.c, multifit/covar.c, multifit/fdfsolver.c,
+ multifit/fsolver.c, multifit/gradient.c, multifit/gsl_multifit.h,
+ multifit/gsl_multifit_nlin.h, multifit/lmder.c, multifit/lmiterate.c,
+ multifit/lmpar.c, multifit/lmset.c, multifit/lmutil.c,
+ multifit/multilinear.c, multifit/qrsolv.c, multifit/test.c,
+ multifit/test_brown.c, multifit/test_enso.c,
+ multifit/test_estimator.c, multifit/test_filip.c, multifit/test_fn.c,
+ multifit/test_hahn1.c, multifit/test_kirby2.c,
+ multifit/test_longley.c, multifit/test_nelson.c,
+ multifit/test_pontius.c, multifit/work.c, multimin/ChangeLog,
+ multimin/Makefile.am, multimin/Makefile.in, multimin/TODO,
+ multimin/conjugate_fr.c, multimin/conjugate_pr.c,
+ multimin/convergence.c, multimin/diff.c,
+ multimin/directional_minimize.c, multimin/fdfminimizer.c,
+ multimin/fminimizer.c, multimin/gsl_multimin.h,
+ multimin/linear_minimize.c, multimin/linear_wrapper.c,
+ multimin/simplex.c, multimin/steepest_descent.c, multimin/test.c,
+ multimin/test_funcs.c, multimin/test_funcs.h, multimin/vector_bfgs.c,
+ multimin/vector_bfgs2.c, multiroots/ChangeLog,
+ multiroots/Makefile.am, multiroots/Makefile.in, multiroots/broyden.c,
+ multiroots/convergence.c, multiroots/dnewton.c, multiroots/dogleg.c,
+ multiroots/enorm.c, multiroots/fdfsolver.c, multiroots/fdjac.c,
+ multiroots/fsolver.c, multiroots/gnewton.c,
+ multiroots/gsl_multiroots.h, multiroots/hybrid.c,
+ multiroots/hybridj.c, multiroots/newton.c, multiroots/test.c,
+ multiroots/test_funcs.c, multiroots/test_funcs.h, ntuple/ChangeLog,
+ ntuple/Makefile.am, ntuple/Makefile.in, ntuple/gsl_ntuple.h,
+ ntuple/ntuple.c, ntuple/test.c, ode-initval/ChangeLog,
+ ode-initval/Makefile.am, ode-initval/Makefile.in, ode-initval/TODO,
+ ode-initval/bsimp.c, ode-initval/control.c, ode-initval/cscal.c,
+ ode-initval/cstd.c, ode-initval/evolve.c, ode-initval/gear1.c,
+ ode-initval/gear2.c, ode-initval/gsl_odeiv.h,
+ ode-initval/odeiv_util.h, ode-initval/rk2.c, ode-initval/rk2imp.c,
+ ode-initval/rk2simp.c, ode-initval/rk4.c, ode-initval/rk4imp.c,
+ ode-initval/rk8pd.c, ode-initval/rkck.c, ode-initval/rkf45.c,
+ ode-initval/step.c, ode-initval/test.c, permutation/ChangeLog,
+ permutation/Makefile.am, permutation/Makefile.in,
+ permutation/canonical.c, permutation/file.c,
+ permutation/gsl_permutation.h, permutation/gsl_permute.h,
+ permutation/gsl_permute_char.h,
+ permutation/gsl_permute_complex_double.h,
+ permutation/gsl_permute_complex_float.h,
+ permutation/gsl_permute_complex_long_double.h,
+ permutation/gsl_permute_double.h, permutation/gsl_permute_float.h,
+ permutation/gsl_permute_int.h, permutation/gsl_permute_long.h,
+ permutation/gsl_permute_long_double.h,
+ permutation/gsl_permute_short.h, permutation/gsl_permute_uchar.h,
+ permutation/gsl_permute_uint.h, permutation/gsl_permute_ulong.h,
+ permutation/gsl_permute_ushort.h, permutation/gsl_permute_vector.h,
+ permutation/gsl_permute_vector_char.h,
+ permutation/gsl_permute_vector_complex_double.h,
+ permutation/gsl_permute_vector_complex_float.h,
+ permutation/gsl_permute_vector_complex_long_double.h,
+ permutation/gsl_permute_vector_double.h,
+ permutation/gsl_permute_vector_float.h,
+ permutation/gsl_permute_vector_int.h,
+ permutation/gsl_permute_vector_long.h,
+ permutation/gsl_permute_vector_long_double.h,
+ permutation/gsl_permute_vector_short.h,
+ permutation/gsl_permute_vector_uchar.h,
+ permutation/gsl_permute_vector_uint.h,
+ permutation/gsl_permute_vector_ulong.h,
+ permutation/gsl_permute_vector_ushort.h, permutation/init.c,
+ permutation/permutation.c, permutation/permute.c,
+ permutation/permute_source.c, permutation/test.c, poly/ChangeLog,
+ poly/Makefile.am, poly/Makefile.in, poly/TODO, poly/balance.c,
+ poly/companion.c, poly/dd.c, poly/eval.c, poly/gsl_poly.h, poly/qr.c,
+ poly/solve_cubic.c, poly/solve_quadratic.c, poly/test.c,
+ poly/zsolve.c, poly/zsolve_cubic.c, poly/zsolve_init.c,
+ poly/zsolve_quadratic.c, qrng/ChangeLog, qrng/Makefile.am,
+ qrng/Makefile.in, qrng/TODO, qrng/gsl_qrng.h, qrng/niederreiter-2.c,
+ qrng/qrng.c, qrng/sobol.c, qrng/test.c, randist/ChangeLog,
+ randist/Makefile.am, randist/Makefile.in, randist/TODO,
+ randist/bernoulli.c, randist/beta.c, randist/bigauss.c,
+ randist/binomial.c, randist/binomial_tpe.c, randist/cauchy.c,
+ randist/chisq.c, randist/dirichlet.c, randist/discrete.c,
+ randist/erlang.c, randist/exponential.c, randist/exppow.c,
+ randist/fdist.c, randist/flat.c, randist/gamma.c, randist/gauss.c,
+ randist/gausstail.c, randist/gausszig.c, randist/geometric.c,
+ randist/gsl_randist.h, randist/gumbel.c, randist/hyperg.c,
+ randist/landau.c, randist/laplace.c, randist/levy.c,
+ randist/logarithmic.c, randist/logistic.c, randist/lognormal.c,
+ randist/multinomial.c, randist/nbinomial.c, randist/pareto.c,
+ randist/pascal.c, randist/poisson.c, randist/rayleigh.c,
+ randist/shuffle.c, randist/sphere.c, randist/tdist.c, randist/test.c,
+ randist/weibull.c, rng/ChangeLog, rng/Makefile.am, rng/Makefile.in,
+ rng/TODO, rng/borosh13.c, rng/cmrg.c, rng/coveyou.c, rng/default.c,
+ rng/file.c, rng/fishman18.c, rng/fishman20.c, rng/fishman2x.c,
+ rng/gfsr4.c, rng/gsl_rng.h, rng/knuthran.c, rng/knuthran2.c,
+ rng/knuthran2002.c, rng/lecuyer21.c, rng/minstd.c, rng/mrg.c,
+ rng/mt.c, rng/r250.c, rng/ran0.c, rng/ran1.c, rng/ran2.c, rng/ran3.c,
+ rng/rand.c, rng/rand48.c, rng/random.c, rng/randu.c, rng/ranf.c,
+ rng/ranlux.c, rng/ranlxd.c, rng/ranlxs.c, rng/ranmar.c, rng/rng.c,
+ rng/schrage.c, rng/slatec.c, rng/taus.c, rng/taus113.c, rng/test.c,
+ rng/transputer.c, rng/tt.c, rng/types.c, rng/uni.c, rng/uni32.c,
+ rng/vax.c, rng/waterman14.c, rng/zuf.c, roots/ChangeLog,
+ roots/Makefile.am, roots/Makefile.in, roots/TODO, roots/bisection.c,
+ roots/brent.c, roots/convergence.c, roots/falsepos.c,
+ roots/fdfsolver.c, roots/fsolver.c, roots/gsl_roots.h,
+ roots/newton.c, roots/roots.h, roots/secant.c, roots/steffenson.c,
+ roots/test.c, roots/test.h, roots/test_funcs.c, siman/ChangeLog,
+ siman/Makefile.am, siman/Makefile.in, siman/TODO, siman/gsl_siman.h,
+ siman/siman.c, siman/siman_test_driver.sh, siman/siman_tsp.c,
+ siman/test.c, sort/ChangeLog, sort/Makefile.am, sort/Makefile.in,
+ sort/TODO, sort/gsl_heapsort.h, sort/gsl_sort.h,
+ sort/gsl_sort_char.h, sort/gsl_sort_double.h, sort/gsl_sort_float.h,
+ sort/gsl_sort_int.h, sort/gsl_sort_long.h,
+ sort/gsl_sort_long_double.h, sort/gsl_sort_short.h,
+ sort/gsl_sort_uchar.h, sort/gsl_sort_uint.h, sort/gsl_sort_ulong.h,
+ sort/gsl_sort_ushort.h, sort/gsl_sort_vector.h,
+ sort/gsl_sort_vector_char.h, sort/gsl_sort_vector_double.h,
+ sort/gsl_sort_vector_float.h, sort/gsl_sort_vector_int.h,
+ sort/gsl_sort_vector_long.h, sort/gsl_sort_vector_long_double.h,
+ sort/gsl_sort_vector_short.h, sort/gsl_sort_vector_uchar.h,
+ sort/gsl_sort_vector_uint.h, sort/gsl_sort_vector_ulong.h,
+ sort/gsl_sort_vector_ushort.h, sort/sort.c, sort/sortind.c,
+ sort/sortvec.c, sort/sortvec_source.c, sort/sortvecind.c,
+ sort/sortvecind_source.c, sort/subset.c, sort/subset_source.c,
+ sort/subsetind.c, sort/subsetind_source.c, sort/test.c,
+ sort/test_heapsort.c, sort/test_source.c, specfunc/ChangeLog,
+ specfunc/Makefile.am, specfunc/Makefile.in, specfunc/TODO,
+ specfunc/airy.c, specfunc/airy_der.c, specfunc/airy_zero.c,
+ specfunc/atanint.c, specfunc/bessel.c, specfunc/bessel.h,
+ specfunc/bessel_I0.c, specfunc/bessel_I1.c, specfunc/bessel_In.c,
+ specfunc/bessel_Inu.c, specfunc/bessel_J0.c, specfunc/bessel_J1.c,
+ specfunc/bessel_Jn.c, specfunc/bessel_Jnu.c, specfunc/bessel_K0.c,
+ specfunc/bessel_K1.c, specfunc/bessel_Kn.c, specfunc/bessel_Knu.c,
+ specfunc/bessel_Y0.c, specfunc/bessel_Y1.c, specfunc/bessel_Yn.c,
+ specfunc/bessel_Ynu.c, specfunc/bessel_amp_phase.c,
+ specfunc/bessel_amp_phase.h, specfunc/bessel_i.c,
+ specfunc/bessel_j.c, specfunc/bessel_k.c, specfunc/bessel_olver.c,
+ specfunc/bessel_olver.h, specfunc/bessel_sequence.c,
+ specfunc/bessel_temme.c, specfunc/bessel_temme.h,
+ specfunc/bessel_y.c, specfunc/bessel_zero.c, specfunc/beta.c,
+ specfunc/beta_inc.c, specfunc/cheb_eval.c, specfunc/cheb_eval_mode.c,
+ specfunc/chebyshev.h, specfunc/check.h, specfunc/clausen.c,
+ specfunc/coulomb.c, specfunc/coulomb_bound.c, specfunc/coupling.c,
+ specfunc/dawson.c, specfunc/debye.c, specfunc/dilog.c,
+ specfunc/elementary.c, specfunc/ellint.c, specfunc/elljac.c,
+ specfunc/erfc.c, specfunc/error.h, specfunc/eval.h, specfunc/exp.c,
+ specfunc/expint.c, specfunc/expint3.c, specfunc/fermi_dirac.c,
+ specfunc/gamma.c, specfunc/gamma_inc.c, specfunc/gegenbauer.c,
+ specfunc/gsl_sf.h, specfunc/gsl_sf_airy.h, specfunc/gsl_sf_bessel.h,
+ specfunc/gsl_sf_clausen.h, specfunc/gsl_sf_coulomb.h,
+ specfunc/gsl_sf_coupling.h, specfunc/gsl_sf_dawson.h,
+ specfunc/gsl_sf_debye.h, specfunc/gsl_sf_dilog.h,
+ specfunc/gsl_sf_elementary.h, specfunc/gsl_sf_ellint.h,
+ specfunc/gsl_sf_elljac.h, specfunc/gsl_sf_erf.h,
+ specfunc/gsl_sf_exp.h, specfunc/gsl_sf_expint.h,
+ specfunc/gsl_sf_fermi_dirac.h, specfunc/gsl_sf_gamma.h,
+ specfunc/gsl_sf_gegenbauer.h, specfunc/gsl_sf_hyperg.h,
+ specfunc/gsl_sf_laguerre.h, specfunc/gsl_sf_lambert.h,
+ specfunc/gsl_sf_legendre.h, specfunc/gsl_sf_log.h,
+ specfunc/gsl_sf_mathieu.h, specfunc/gsl_sf_pow_int.h,
+ specfunc/gsl_sf_psi.h, specfunc/gsl_sf_result.h,
+ specfunc/gsl_sf_synchrotron.h, specfunc/gsl_sf_transport.h,
+ specfunc/gsl_sf_trig.h, specfunc/gsl_sf_zeta.h,
+ specfunc/gsl_specfunc.h, specfunc/hyperg.c, specfunc/hyperg.h,
+ specfunc/hyperg_0F1.c, specfunc/hyperg_1F1.c, specfunc/hyperg_2F0.c,
+ specfunc/hyperg_2F1.c, specfunc/hyperg_U.c, specfunc/laguerre.c,
+ specfunc/lambert.c, specfunc/legendre.h, specfunc/legendre_H3d.c,
+ specfunc/legendre_Qn.c, specfunc/legendre_con.c,
+ specfunc/legendre_poly.c, specfunc/log.c, specfunc/mathieu_angfunc.c,
+ specfunc/mathieu_charv.c, specfunc/mathieu_coeff.c,
+ specfunc/mathieu_radfunc.c, specfunc/mathieu_workspace.c,
+ specfunc/poch.c, specfunc/pow_int.c, specfunc/psi.c,
+ specfunc/recurse.h, specfunc/result.c, specfunc/shint.c,
+ specfunc/sinint.c, specfunc/synchrotron.c, specfunc/test_airy.c,
+ specfunc/test_bessel.c, specfunc/test_coulomb.c,
+ specfunc/test_dilog.c, specfunc/test_gamma.c, specfunc/test_hyperg.c,
+ specfunc/test_legendre.c, specfunc/test_mathieu.c,
+ specfunc/test_sf.c, specfunc/test_sf.h, specfunc/transport.c,
+ specfunc/trig.c, specfunc/zeta.c, statistics/ChangeLog,
+ statistics/Makefile.am, statistics/Makefile.in, statistics/TODO,
+ statistics/absdev.c, statistics/absdev_source.c,
+ statistics/covariance.c, statistics/covariance_source.c,
+ statistics/gsl_statistics.h, statistics/gsl_statistics_char.h,
+ statistics/gsl_statistics_double.h,
+ statistics/gsl_statistics_float.h, statistics/gsl_statistics_int.h,
+ statistics/gsl_statistics_long.h,
+ statistics/gsl_statistics_long_double.h,
+ statistics/gsl_statistics_short.h, statistics/gsl_statistics_uchar.h,
+ statistics/gsl_statistics_uint.h, statistics/gsl_statistics_ulong.h,
+ statistics/gsl_statistics_ushort.h, statistics/kurtosis.c,
+ statistics/kurtosis_source.c, statistics/lag1.c,
+ statistics/lag1_source.c, statistics/mean.c,
+ statistics/mean_source.c, statistics/median.c,
+ statistics/median_source.c, statistics/minmax.c,
+ statistics/minmax_source.c, statistics/p_variance.c,
+ statistics/p_variance_source.c, statistics/quantiles.c,
+ statistics/quantiles_source.c, statistics/skew.c,
+ statistics/skew_source.c, statistics/test.c,
+ statistics/test_float_source.c, statistics/test_int_source.c,
+ statistics/test_nist.c, statistics/ttest.c,
+ statistics/ttest_source.c, statistics/variance.c,
+ statistics/variance_source.c, statistics/wabsdev.c,
+ statistics/wabsdev_source.c, statistics/wkurtosis.c,
+ statistics/wkurtosis_source.c, statistics/wmean.c,
+ statistics/wmean_source.c, statistics/wskew.c,
+ statistics/wskew_source.c, statistics/wvariance.c,
+ statistics/wvariance_source.c, sum/ChangeLog, sum/Makefile.am,
+ sum/Makefile.in, sum/gsl_sum.h, sum/levin_u.c, sum/levin_utrunc.c,
+ sum/test.c, sum/work_u.c, sum/work_utrunc.c, sys/ChangeLog,
+ sys/Makefile.am, sys/Makefile.in, sys/coerce.c, sys/expm1.c,
+ sys/fcmp.c, sys/fdiv.c, sys/gsl_sys.h, sys/hypot.c, sys/infnan.c,
+ sys/invhyp.c, sys/ldfrexp.c, sys/log1p.c, sys/minmax.c,
+ sys/pow_int.c, sys/prec.c, sys/test.c, test/ChangeLog,
+ test/Makefile.am, test/Makefile.in, test/gsl_test.h, test/results.c,
+ utils/Makefile.am, utils/Makefile.in, utils/README, utils/memcpy.c,
+ utils/memmove.c, utils/placeholder.c, utils/strdup.c, utils/strtol.c,
+ utils/strtoul.c, utils/system.h, vector/ChangeLog,
+ vector/Makefile.am, vector/Makefile.in, vector/TODO, vector/copy.c,
+ vector/copy_source.c, vector/file.c, vector/file_source.c,
+ vector/gsl_vector.h, vector/gsl_vector_char.h,
+ vector/gsl_vector_complex.h, vector/gsl_vector_complex_double.h,
+ vector/gsl_vector_complex_float.h,
+ vector/gsl_vector_complex_long_double.h, vector/gsl_vector_double.h,
+ vector/gsl_vector_float.h, vector/gsl_vector_int.h,
+ vector/gsl_vector_long.h, vector/gsl_vector_long_double.h,
+ vector/gsl_vector_short.h, vector/gsl_vector_uchar.h,
+ vector/gsl_vector_uint.h, vector/gsl_vector_ulong.h,
+ vector/gsl_vector_ushort.h, vector/init.c, vector/init_source.c,
+ vector/minmax.c, vector/minmax_source.c, vector/oper.c,
+ vector/oper_source.c, vector/prop.c, vector/prop_source.c,
+ vector/reim.c, vector/reim_source.c, vector/subvector.c,
+ vector/subvector_source.c, vector/swap.c, vector/swap_source.c,
+ vector/test.c, vector/test_complex_source.c, vector/test_source.c,
+ vector/test_static.c, vector/vector.c, vector/vector_source.c,
+ vector/view.c, vector/view.h, vector/view_source.c,
+ wavelet/ChangeLog, wavelet/Makefile.am, wavelet/Makefile.in,
+ wavelet/TODO, wavelet/bspline.c, wavelet/daubechies.c, wavelet/dwt.c,
+ wavelet/gsl_wavelet.h, wavelet/gsl_wavelet2d.h, wavelet/haar.c,
+ wavelet/test.c, wavelet/wavelet.c: New files.
+
+2007-01-09 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_math.h (M_PI_4): corrected typo in higher digits of M_PI_4
+ (at ~1e-20)
+
+2006-11-02 Brian Gough <bjg@network-theory.co.uk>
+
+ * templates_on.h templates_off.h: added UNSIGNED definition for
+ detecting types without negative values
+
+2006-02-15 Brian Gough <bjg@network-theory.co.uk>
+
+ * configure.ac: restrict darwin IEEE detection to powerpc, because
+ new x86 macs are different.
+
+ * removed automatic addition of compilation flags on alpha,
+ these should be specified on the command-line through CFLAGS.
+
+2006-01-07 Brian Gough <bjg@network-theory.co.uk>
+
+ * templates_on.h: added an FP=1 definition for the floating point
+ types, FP is undefined for integer types.
+
+2005-08-05 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl/Makefile.am: need to remove makefile with later versions of
+ automake
+
+2005-04-05 Brian Gough <bjg@network-theory.co.uk>
+
+ * configure.ac: added ieeefp.h test for solaris
+
+2005-01-13 Brian Gough <bjg@network-theory.co.uk>
+
+ * configure.ac: added case for 86_64 in IEEE arithmetic interface
+ detection
+
+2004-10-26 Brian Gough <bjg@network-theory.co.uk>
+
+ * test_gsl_histogram.sh: trim \r from test output for
+ compatibility with Cygwin.
+
+2004-07-29 Brian Gough <bjg@network-theory.co.uk>
+
+ * modified all makefiles to use TESTS=$(check_programs)
+ to get correct EXEEXT behavior
+
+2004-07-23 Brian Gough <bjg@network-theory.co.uk>
+
+ * added wavelet/ directory
+
+2004-05-28 Brian Gough <bjg@network-theory.co.uk>
+
+ * configure.ac: ran configure script through Autoconf's autoupdate
+ to use latest macro names
+
+2004-05-17 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl.m4: fix m4 quoting of first argument to AC_DEFUN
+
+2004-03-17 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl/Makefile.am (header-links): use test -r instead of test -e
+ (to avoid problem on Solaris as described in autoconf
+ documentation)
+
+2003-12-20 Brian Gough <bjg@network-theory.co.uk>
+
+ * configure.ac: define _GNU_SOURCE when looking for fenv.h
+
+2003-06-17 Brian Gough <bjg@network-theory.co.uk>
+
+ * configure.ac: converted configure.in to autoconf 2.5x, involved
+ extensive renaming macros of HAVE_... to HAVE_DECL_.. and changing
+ usage from #ifdef HAVE to #if HAVE
+
+2003-06-16 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl/Makefile.am (header-links): added a test for the existing
+ file to avoid spurious error messages when making the symlinks
+
+2003-06-12 Brian Gough <bjg@network-theory.co.uk>
+
+ * configure.in: Tidying up, removed old test for bug in gcc 2.95
+ on PPC, removed OS/2 warning, removed references to clock function
+ since benchmark programs are not shipped
+
+2003-03-06 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_types.h: changed from internal macro _DLL to GSL_DLL
+
+2003-02-09 Brian Gough <bjg@network-theory.co.uk>
+
+ * configure.in: added [] quotes in AC_TRY_COMPILE to protect
+ nested macros
+
+2002-11-24 Brian Gough <bjg@network-theory.co.uk>
+
+ * configure.in: check for presence of non-ansi functions in header
+ files before running AC_CHECK_FUNCS to look in libraries, to
+ support compilation with -ansi.
+
+Fri Sep 6 15:00:40 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * acconfig.h (GSL_RANGE_CHECK_OFF): turned range checking off in
+ acconfig.h as it overwrites config.h.in
+
+Wed Aug 7 22:34:36 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * config.h.in: fixed RANGE_CHECK_ON to GSL_RANGE_CHECK_ON
+
+Sun Jul 14 12:48:50 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * INSTALL: merged the MACHINES file into the installation notes.
+
+Fri Jun 14 22:09:52 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_types.h: define GSL_VAR macro as ANSI C 'export' or
+ '__declspec(dllexport/dllimport)' depending on platform
+
+ * changed 'export' to GSL_VAR macro throughout to make it easier
+ to build nonstandard shared libraries such as DLLs
+
+Sun May 19 22:24:00 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * configure.in: changed AM_PROG_LIBTOOL to AC_PROG_LIBTOOL,
+ use AC_SEARCH_LIBS to find math library
+
+Sat May 11 22:27:52 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * configure.in (ac_cv_func_printf_longdouble): fixed ieee
+ comparisons test so it actually works
+ (ac_cv_c_ieee_comparisons): added a test for denormalized values
+
+Fri Apr 26 19:53:31 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * Makefile.am (EXTRA_DIST): removed KNOWN-PROBLEMS
+
+Sun Feb 10 21:28:29 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * BUGS: added a list of known but unfixed bugs.
+
+2002-02-07 Mark Galassi <rosalia@galassi.org>
+
+ * THANKS: added Karsten Howes <karsten@videotron.ca>.
+
+Wed Jan 16 16:55:25 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * configure.in acconfig.h: check whether IEEE comparisons work for
+ Inf, NaN and define HAVE_IEEE_COMPARISONS
+
+Tue Jan 8 21:38:23 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * config.h (GSL_RANGE_CHECK_OFF): turn off range checking when
+ building the library, still on by default when compiling user
+ applications
+
+Mon Nov 19 21:40:30 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * standardised all files to #include <gsl/...> for exported header
+ files rather than having some as #include "...", to simplify build
+ procedure
+
+Fri Oct 19 15:19:45 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl-histogram.c (main): use gsl_histogram_alloc instead of
+ calloc
+
+Wed Oct 3 11:06:51 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * removed auto-expanding RCS tokens from comments as they
+ interfere with making patches
+
+ * configure.in: check for isinf(), finite(), isnan() as
+ macros. Also check for isfinite() as an alternative to finite().
+
+Sat Sep 29 18:04:35 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl.m4: cleaned up arguments to GSL_CONFIG
+
+Wed Sep 19 17:41:13 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl-histogram.c (main): turn off the display of mean and
+ standard deviation it is too confusing because it is not the mean
+ of the data itself.
+
+Tue Sep 18 20:08:39 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * test_gsl_histogram.sh: modified the expected test output to
+ account for the mean,sigma lines now produced
+
+Wed Sep 12 13:39:55 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl-histogram.c (main): print out the mean and standard
+ deviation as comments
+
+Sun Sep 9 22:57:11 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * configure.in: print out a warning for OS/2 telling the user to
+ run an extra script
+
+Fri Sep 7 14:32:01 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl.pc.in: added pkg-config file
+
+ * configure.in: avoid clobbering any LIBS specified, by not
+ putting -lm in front of them. This allows the user to specify an
+ alternate math library for the configure script.
+ (ac_cv_func_printf_longdouble): added generation of gsl.pc for
+ pkg-config
+
+Thu Sep 6 21:08:10 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * configure.in: added an option to specify an alternative math
+ library
+
+Tue Sep 4 09:41:37 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl.spec.in: autogenerate gsl.spec from gsl.spec.in
+
+Sun Aug 26 17:19:24 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * acconfig.h: fixed incorrect #ifdef for HAVE_FINITE (Henry
+ Sobotka)
+
+Sat Aug 25 10:25:41 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_math.h: moved includes to beginning of file to avoid
+ redefinition errors on OS/2
+
+Tue Aug 21 23:54:45 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_nan.h (GSL_POSINF): removed incorrect use of _FPCLASS.. for
+ MSVC, these are flags not numerical values.
+
+Thu Aug 9 22:51:00 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * config.h.in: added a macro for discarding a pointer, used to
+ suppress warnings from gcc about unused parameters
+
+Sun Aug 5 20:35:09 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * configure.in: move PPC bug test to beginning of configure
+ script, to save waiting for it to appear at the end
+
+Sat Jul 14 21:13:55 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_nan.h: use C99X macro INFINITY where available
+
+Fri Jul 13 21:31:01 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * templates_on.h: added macros for unqualified views, needed for
+ initialization of views
+
+Mon Jul 9 11:22:16 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * configure.in: made check for extended precision registers
+ independent of test for os ieee interface type
+
+Sun Jul 1 22:44:00 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * templates_on.h templates_off.h: modified to support views
+
+Wed Jun 27 12:15:19 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * configure.in: work around case of broken log1p in OpenBSD
+
+Mon Jun 25 10:21:17 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * configure.in: catch case of openbsd, which is not supported yet
+ in ieee directory
+
+Mon Jun 18 22:31:26 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * configure.in (GSL_CFLAGS): now just uses includedir for
+ gsl-config.in
+
+Wed Jun 6 18:10:18 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * removed explicit dependencies from Makefile.am's since automake
+ now handles these automatically
+
+Tue May 29 12:40:08 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * configure.in: added missing wildcard to end of hpux11* to match
+ different versions of hpux11, e.g. hpux11.2.
+
+Tue May 22 10:38:59 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl.m4: try to make C-code compatible with C++, also changed
+ return() to exit() as mentioned in the autoconf documentation.
+
+2001-05-21 Mark Galassi <rosalia@galassi.org>
+
+ * config.guess, config.sub: removed these auto-generated files
+ from CVS since they are built for developers by autogen.sh.
+
+Tue May 15 10:59:43 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * autogen.sh: upgraded to latest libtool and automake
+
+Tue May 1 12:19:01 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_nan.h (GSL_NAN): added definitions for Microsoft Visual C++
+
+Mon Apr 30 13:46:39 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_math.h: split out gsl_pow_int.h and gsl_nan.h
+
+Wed Mar 21 14:16:29 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl-config.in (Usage): allow user to specify an external blas
+ library through an environment variable
+
+2000-12-14 Mark Galassi <rosalia@galassi.org>
+
+ * gsl.spec, configure.in: upped the version to 0.7+ since the
+ release has been made.
+
+2000-10-26 Mark Galassi <rosalia@galassi.org>
+
+ * ltconfig, ltmain.sh: removed these auto-generated files.
+
+2000-10-26 Mark Galassi <rosalia@lanl.gov>
+
+ * stamp-h.in: removed this file because it is auto-generated.
+
+ * scripts/mkknownproblems.sh: fixed it so it's slightly better,
+ but it still assumes that you run it out of $(srcdir)/scripts.
+
+ * scripts/knownproblems.pl: put in a more standard path for perl.
+
+ * AUTHORS: some changes and additions.
+
+ * KNOWN-PROBLEMS: updated the list of known problems.
+
+2000-10-04 Mark Galassi <rosalia@lanl.gov>
+
+ * NEWS, configure.in, gsl.spec: upped the version to 0.7 as we are
+ about to release.
+
+Thu Jul 20 20:20:04 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl.m4: changed \? to \{0,1\} in the sed commands to allow for
+ SGI sed (from Steve ROBBINS <stever@bic.mni.mcgill.ca>)
+
+Sun Jul 9 19:34:03 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl.m4: modified to accept x.y version numbers as the first
+ argument in addition to x.y.z version numbers
+
+Mon Jun 12 22:18:27 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * Makefile.am (SUBLIBS): added missing complex lib to top-level
+ SUBLIBS
+
+Sun Jun 11 17:39:18 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl.spec (BuildRoot): fixed directory for install, it is now
+ /usr/lib/ instead of /usr/lib/gsl/
+
+Tue Jun 6 20:02:02 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * acconfig.h, configure.in: use HAVE_X86LINUX_IEEE_INTEFACE for
+ x86 instead of generic HAVE_LINUX_IEEE_INTEFACE
+
+2000-06-02 Mark Galassi <rosalia@galassi.org>
+
+ * gsl.spec: added gsl.m4 to the list of files.
+
+ * NEWS: added a mention of gsl.m4.
+
+ * gsl.spec: small changes to fix the installation of doc files.
+
+ * Makefile.am: added some files (like MACHINES, KNOWN-PROBLEMS,
+ ...) to the distribution.
+
+ * gsl.spec, configure.in, KNOWN-PROBLEMS: upped the version number
+ to 0.6. Also: gsl.spec now installes files like MACHINES,
+ KNOWN-PROBLEMS, NEWS,... into the package's %doc file list.
+
+Sun May 28 12:03:36 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl/Makefile.am (header-links): use configurable macro variable
+ $(LN_S) instead of explicit "ln -s"
+
+Mon May 15 19:16:31 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * added ieee mode setting to all tests, so that they can be run in
+ double-precision even on extended precision architectures
+
+2000-05-14 Steve Robbins <steve@nyongwa.montreal.qc.ca>
+
+ * acconfig.h:
+ * configure.in: look in both <float.h> and /usr/include/float.h,
+ to find FP_RND_RN, as some versions of GCC don't copy these
+ symbols into the `fixed' header.
+
+Thu May 11 12:47:19 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_math.h (GSL_POSZERO): added macros for IEEE signed zeros, +0
+ and -0. They don't do anything useful yet, but use the macro so
+ that will be possible to work around compilers that don't
+ understand the difference between the constants -0 and +0.
+
+Wed May 10 11:30:15 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_math.h (GSL_POSINF): make use of HUGE_VAL which is actually
+ +Inf when IEEE is available, and can be detected by the NAN being
+ defined (it is only defined on IEEE machines)
+ (GSL_NEGINF): as for GSL_POSINF
+
+Fri May 5 11:20:50 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * split out gsl_test code from err/ directory into test/ directory
+
+Thu May 4 12:14:42 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * added GPL headers throughout
+
+Mon May 1 22:11:32 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * modified all the makefiles to compile test programs as "test",
+ for simpler automated builds
+
+Tue Apr 11 14:51:59 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * eigen/eigen_sort.c (gsl_eigen_sort_impl): updated occurrence of
+ gsl_matrix_swap_cols to gsl_matrix_swap_columns
+
+ * gsl.m4, Makefile.am: added gsl.m4 macros for autoconf
+ support
+
+2000-04-03 Mark Galassi <rosalia@lanl.gov>
+
+ * gsl-config.in, configure.in (GSL_CFLAGS): replaced my gsl-config
+ script with Christopher Gabriel's, which is simpler.
+
+ * autogen.sh: changed this into a no-brainer which does not invoke
+ configure.
+
+Mon Apr 3 15:43:25 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * applied patch from C M Murphy <C.M.Murphy@bath.ac.uk> to fix up
+ missing consts in header files.
+
+Sat Apr 1 20:12:34 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_math.h: added some missing extra constants from BSD
+ (e.g. M_PI_2)
+
+Wed Mar 15 11:16:14 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * added a directory for complex number support, complex/
+
+Tue Mar 14 10:28:43 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * added support for including headers in C++ programs using
+ __BEGIN_DECLS and __END_DECLS macros
+
+Sat Mar 11 11:18:33 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * templates_on.h: added a definition for ONE, to match ZERO
+
+ * Changed matrix struct element dim2 to tda throughout
+
+Mon Mar 6 19:48:27 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_version.h: added simple release-number based support for
+ accessing the version number at compile-time and run-time. This is
+ not a complete solution but it will do for now, as libtool
+ interface numbers are too complicated to worry about at the
+ moment due to other problems with libtool.
+
+Thu Mar 2 20:52:50 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * templates_on.h (ATOMIC_IO): added an internal type for IO, for
+ the cases where it isn't possible to read and write a type
+ directly as text (e.g. char)
+
+2000-02-23 Mark Galassi <rosalia@lanl.gov>
+
+ * Makefile.am, gsl.spec: added a gsl.spec. Seems to work.
+
+ * gsl-config.in: overhauled gsl-config.in; should work better now.
+
+Tue Feb 15 18:55:05 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * added directory for permutation objects, permutation/
+
+Sun Dec 5 14:20:43 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * added multidimensional minimisation directory, multimin/
+
+1999-12-03 Mark Galassi <rosalia@lanl.gov>
+
+ * configure.in: upped the version to 0.5+, so that snaphots built
+ out of CVS will not be confused with the 0.5 release.
+
+ * AUTHORS, README, HACKING: changed my email address.
+
+ * README: updated with some of Brian's suggestions.
+
+ * configure.in, NEWS: fixed the new version to 0.5.
+
+Tue Oct 19 11:15:16 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * added the eigen value directory, eigen/
+
+1999-08-30 Mark Galassi <rosalia@lanl.gov>
+
+ * gsl-config.in: started adding this script, for now cannibalized
+ from gnome-config.
+
+Fri Aug 20 11:10:54 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * support for IEEE on Tru64 from Tim Mooney
+
+Mon Aug 16 21:10:23 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * added the minimization directory, min/
+
+Fri Aug 6 11:15:58 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * configure.in: removed need to configure for rand() and RAND_MAX
+ by providing a simple random number generator in the directories
+ that used rand().
+
+1999-08-05 Mark Galassi <rosalia@lanl.gov>
+
+ * Makefile.am: put the THANKS file into the distribution.
+
+ * autogen.sh: added the --add-missing option to automake. I'm
+ surprised it was not already there.
+
+ * configure.in: added a + to the version, indicating that any
+ snapshots made from anonymous CVS in this state should be
+ interpreted as "after 0.4.1 and before the next version", and no
+ other promises.
+
+ * THANKS: added this THANKS file. We appreciate all patches from
+ people on the net, even those which are too small to warrant
+ adding the author to the AUTHORS file. The THANKS file should
+ include everyone who sent in patches. They should also be
+ mentioned in the ChangeLog entry.
+
+Sat May 8 21:06:31 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * configure.in: now check for "extern inline" using a modified
+ version of AC_C_INLINE, since we use "extern inline" but only
+ checked for "inline", and some compilers only support the latter.
+
+Sun Apr 11 20:40:35 1999 Brian Gough <bjg@netsci.freeserve.co.uk>
+
+ * libraries and include files are now installed in pkglibdir and
+ pkgincludedir (e.g. /usr/local/lib/gsl/ and
+ /usr/local/include/gsl/ by default)
+
+ * libraries are now built and installed separately
+
+Mon Mar 1 15:41:25 1999 Brian Gough <bjg@netsci.freeserve.co.uk>
+
+ * gsl_math.h: renamed gsl_fdf to gsl_function_fdf, so that it will
+ be more obvious what it is
+
+Sun Feb 28 20:37:31 1999 Brian Gough <bjg@netsci.freeserve.co.uk>
+
+ * gsl_mode.h: added prototype for GSL_MODE_PREC(mt)
+
+Tue Feb 23 14:18:39 1999 Brian Gough <bjg@netsci.freeserve.co.uk>
+
+ * gsl_math.h (GSL_FDF_EVAL_F): improved names of macros
+
+Sat Feb 20 12:14:07 1999 Brian Gough <bjg@netsci.freeserve.co.uk>
+
+ * split out polynomial root finding algorithms into a new poly/
+ directory
+
+1999-02-25 Mark Galassi <rosalia@cygnus.com>
+
+ * configure.in: upped the version to 0.4.1; this is ready for
+ tagging.
+
+1999-02-06 Mark Galassi <rosalia@cygnus.com>
+
+ * NEWS: udpated in occasion of the imminent 0.4.1 release.
+
+Sun Feb 14 20:47:07 1999 Brian Gough <bjg@netsci.freeserve.co.uk>
+
+ * Makefile.am: added gsl_mode.h to include_HEADERS
+
+Mon Feb 8 18:39:35 1999 Brian Gough <bjg@netsci.freeserve.co.uk>
+
+ * added new type gsl_function for arbitrary functions with
+ parameters, and gsl_fdf for functions and their derivatives
+
+Mon Feb 8 18:39:35 1999 Brian Gough <bjg@netsci.freeserve.co.uk>
+
+ * gsl_complex.h: added GSL_SET_REAL(&z,x) and GSL_SET_IMAG(&z,y),
+ changed GSL_COMPLEX_SET(z,x,y) to GSL_SET_COMPLEX(&z,x,y) to match.
+
+1999-01-03 Mark Galassi <rosalia@cygnus.com>
+
+ * Makefile.am, autogen.sh: improved autogen.sh, based on the gtk+
+ autogen.sh. Added it to Makefile.am's EXTRA_DIST list.
+
+1999-01-02 Mark Galassi <rosalia@cygnus.com>
+
+ * configure.in: introduced a test for hypot(), in case a system
+ does not have it.
+
+1999-01-03 Mark Galassi <rosalia@cygnus.com>
+
+ * autogen.sh: added this simple script which calls aclocal,
+ automake --add-missind and autoconf, followed by ./configure with
+ all the arguments.
+
+ * configure, Makefile.in, */Makefile.in: removed these
+ auto-generated files.
+
+Fri Dec 11 16:50:27 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * AUTHORS: corrected the spelling of Gerard Jungman's name (it's
+ either Gerard or Jerry, but not Gerry)
+
+1998-12-05 Mark Galassi <rosalia@cygnus.com>
+
+ * configure.in: made the version be 0.4after so it's clear that
+ snapshots will be post-0.4.
+
+ * HACKING: updated a bit to work with the new CVS repository.
+
+Mon Nov 23 16:09:21 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * gsl_config.h: removed, it was an unnecessary hack just for
+ defining macros. Autoconf's config.h should be used by the
+ programmer instead.
+
+Sat Nov 21 20:39:14 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * texinfo.tex: removed, this is a duplicate and shouldn't be
+ needed in the top-level directory (it is in docs)
+
+ * move any included headers in _source.c files into the master
+ file that includes the _source.c, since this saves time when
+ compiling
+
+ * config.h.in: standardized on HAVE_PRINTF_LONGDOUBLE
+
+Fri Nov 20 15:14:53 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * replaced DBL_EPSILON, DBL_MAX, ... by GSL_DBL_EPSILON,
+ GSL_DBL_MAX, ...
+
+ * added sys directory for miscellaneous gsl system functions like
+ max and min
+
+Thu Nov 19 22:46:43 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * config.h.in: removed MAX and MIN
+
+Wed Nov 18 10:40:18 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * gsl_math.h: added prototypes for inline functions GSL_MAX_INT
+ etc
+
+Tue Nov 10 20:05:27 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * gsl_math.h: moved the MAX(a,b) and MIN(a,b) to gsl_math.h and
+ renamed them GSL_MAX(a,b) and GSL_MIN(a,b) to avoid inevitable
+ conflicts with system macros.
+
+Mon Nov 9 21:08:10 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * config.h: added MAX(a,b) and MIN(a,b) macros since we use these
+ everywhere. We assume that if they are defined by the system then
+ they do actually work.
+
+1998-11-06 <bjg@ancho.lanl.gov>
+
+ * configure.in: add -mieee on alpha platforms, also check for both
+ scanf and printf working with long double
+
+1998-08-31 James Theiler <jt@lanl.gov>
+
+ * Makefile.am (SUBDIRS): added utils directory
+
+ * configure.in (AC_OUTPUT): added utils/Makefile
+
+ * configure.in (AC_REPLACE_FUNCS): added strtol, strtoul; removed
+ strerror since it's already hardcoded into the err/ directory
+
+1998-08-30 Mark Galassi <rosalia@cygnus.com>
+
+ * configure.in: upped release number to 0.4; about to tag and make
+ the release.
+
+1998-08-20 Mark Galassi <rosalia@cygnus.com>
+
+ * configure.in: upped version to 0.4-interim as we prepare for a
+ 0.4 snapshot.
+
+ * NEWS: now refers to 0.4 instead of 0.3g. Also "commented out"
+ (smile) the note that says "we need to do a better job with the
+ news file", since it looks quite good now!
+
+1998-08-19 Mark Galassi <rosalia@cygnus.com>
+
+ * doc/Makefile.am (EXTRA_DIST): added ran-exppow.tex,
+ rand-levy.tex, rand-gumbel.tex and rand-bernoulli.tex to
+ EXTRA_DIST. Now they are included in the distribution and a "make
+ distcheck" goes further.
+
+Thu Jul 30 16:12:05 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * Makefile.am: now using a script to write the AR commands
+ explicitly, this should be more portable
+
+Tue Jul 28 23:07:04 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * Makefile.am: new style single build of libgsl.a
+
+Fri Jul 10 19:57:49 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * configure.in: removed AC_FUNC_ALLOCA since we don't use alloca
+ (it is not ansi)
+
+Sun Jun 28 14:31:31 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * replaced the random/ directory by the rng/ directory and made
+ minor changes in randist/, siman/ to accommodate it
+
+Tue Jun 23 19:49:22 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * added a top-level file gsl_config.h for detecting features when
+ users include the library headers. Currently it just turns on
+ HAVE_INLINE if you are using GCC or C++.
+
+1998-05-16 Mark Galassi <rosalia@cygnus.com>
+
+ * configure.in: Brian fixed the error where libgslerr.a was not
+ being installed in the 0.3e release, so I just bumped it up to
+ 0.3f to make a new release.
+
+1998-05-14 Mark Galassi <rosalia@cygnus.com>
+
+ * configure.in: upped the version to 0.3e, and this time I might
+ actually make the public snapshot!
+
+Wed Apr 8 18:30:48 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * Now using the automake variable check_PROGRAMS everywhere for
+ the testing programs (no need to build them unless we do make
+ check)
+
+Mon Apr 6 15:09:08 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * added matrix and vector subdirectories
+
+Wed Mar 18 10:27:27 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * gsl_complex.h: the typedef for 'complex' has been renamed to
+ gsl_complex, to avoid conflicts with C++ bindings and libstdc++
+
+1998-02-09 Mark Galassi <rosalia@cygnus.com>
+
+ * configure.in: 0.3b is now released, so I upped the version
+ number to 0.3c-interim.
+
+1998-02-09 Mark Galassi <rosalia@cygnus.com>
+
+ * configure.in: upped version number to 0.3b
+
+1998-01-30 Mark Galassi <rosalia@cygnus.com>
+
+ * AUTHORS: added Gerry Jungman to the authors list.
+
diff --git a/gsl-1.9/INSTALL b/gsl-1.9/INSTALL
new file mode 100644
index 0000000..507e22a
--- /dev/null
+++ b/gsl-1.9/INSTALL
@@ -0,0 +1,513 @@
+GSL - GNU Scientific Library
+============================
+
+Installation Instructions
+=========================
+
+GSL follows the standard GNU installation procedure. To compile GSL
+you will need an ANSI C-compiler. After unpacking the distribution
+the Makefiles can be prepared using the configure command,
+
+ ./configure
+
+You can then build the library by typing,
+
+ make
+
+Both static and shared versions of the libraries will be compiled by
+default. Compilation of shared libraries can be turned off by
+specifying the `--disable-shared' option to `configure', e.g.
+
+ ./configure --disable-shared
+
+If you encounter problems building the library try using the above
+option, because some platforms do not support shared libraries. If
+you change any compilation options you will need to remove any
+existing compiled files with,
+
+ make clean
+
+before running "make" again, so the new settings take effect.
+
+For notes about problems with specific platforms and compilers see the
+next section of this file (below).
+
+An extensive test suite is available. After compiling the library
+with "make", it can be invoked with "make check" at the top level.
+The test output should be directed to a file rather than a terminal,
+with the command,
+
+ make check > log 2>&1
+
+to allow any errors to be examined in detail. By default, only test
+failures are shown. To see the complete output, set the environment
+variable GSL_TEST_VERBOSE=1.
+
+If you run the tests and get some failures, please see the notes on
+platform specific problems below. If you find failures that are not
+mentioned, please report them to bug-gsl@gnu.org.
+
+The library can be installed using the command,
+
+ make install
+
+The default installation directory prefix is /usr/local. Installing
+in this directory will require root privileges on most systems (use
+"su" or "sudo").
+
+The installation directory can be changed with the --prefix option to
+configure. Consult the "Further Information" section below for
+instructions on installing the library in another location or changing
+other default compilation options.
+
+ ------------------------------
+
+Platform Specific Compilation Notes
+===================================
+
+This section documents any known issues with installing GSL on
+specific platforms.
+
+ * General hints for all platforms
+ * AIX
+ * Compaq/DEC Alpha
+ * HP-UX
+ * IRIX
+ * MacOS X / PowerPC
+ * Microsoft Windows
+ * OpenBSD
+ * OS/2
+ * Solaris
+
+Hints for any platform
+======================
+
+1) If there are problems building the library try using
+
+ ./configure --disable-shared
+
+This will turn off the compilation of shared libraries and may allow
+the build process to complete successfully.
+
+If you get any problems try this first.
+
+2) With gcc-2.95/2.96 the tests fail in the eigen/ directory. This is
+due to a compiler optimization bug which causes errors in the
+manipulation of complex numbers.
+
+This is fixed in more recent versions of gcc. Do not use the library
+if you encounter this problem---install a newer version of gcc.
+
+3) Attempts to run 'strip' on the static library libgsl.a will probably
+produce a broken library (it is known to happen with GNU binutils
+strip, and probably affects others too). The libgsl.a ar archive made
+by libtool contains files with the same filenames from different
+directories, and this causes the strip program to overwrite these
+archive entries. If you need to produce a compact version of the
+library compile without -g instead of using strip.
+
+make install-strip does not work, due to a minor problem with autoconf
+which is fixed in the 2.5 development version of autoconf. In the
+meantime compile without -g instead if you need to reduce the file size.
+
+4) The configure script can fail with a segmentation fault on bash-2.01
+
+ $ ./configure
+ Segmentation fault
+
+This is due to a bug in bash, related to the MAIL environment
+variable. To work around it use
+
+ $ unset ENV MAIL MAILPATH
+ $ ./configure
+
+which should avoid the problem.
+
+Hints for AIX
+=============
+
+For compilation problems with the native compiler xlc, try disabling
+shared libraries,
+
+ setenv CC 'xlc'
+ setenv CFLAGS '-O -qmaxmem=8192'
+ ./configure --disable-shared
+ make
+
+If you get the error,
+
+ ld: 0711-781 ERROR: TOC overflow.
+
+you can try building the library with a larger linker
+table-of-contents by setting LDFLAGS before compilation,
+
+ LDFLAGS="-Wl,-bbigtoc" ./configure
+
+On older versions of AIX (e.g. 4.2) the size of the command-line is
+limited to 24kb, which causes linking to fail (due to the large number
+of files to be linked). Unfortunately this limit cannot be increased.
+To link the library you may need to use a manual approach of
+incrementally combining the object files in smaller groups.
+
+On more recent versions of AIX (e.g >= 5.1) use
+
+ chdev -l sys0 -a ncargs=NNN
+
+to increase the allowed number of arguments. NNN is the amount of
+space measured in 4k blocks (default 6, maximum 1024)
+
+If compiling with GCC the following error
+
+ fp-aix.c: In function `gsl_ieee_set_mode':
+ fp-aix.c:30: error: `fprnd_t' undeclared (first use in this function)
+
+can occur if /usr/includes/float.h is not used, and instead the
+float.h of the installed gcc is picked up instead -- it may be missing
+the necessary structs. To work around it copy the missing parts
+(between #ifdef _ALL_SOURCE and its #endif) from /usr/includes/float.h
+into a new header file and #include that in fp-aix.c
+
+Hints for Compaq/DEC Alpha
+==========================
+
+When comping with GCC use the -mieee and -mfp-rounding-mode options
+as appropriate, e.g.
+
+ ./configure CFLAGS="-mieee -mfp-rounding-mode=d -g -O2"
+
+The library should compile successfully with Compaq's C compiler on
+Tru64 Unix 'cc' using the -std, -ieee and -fprm options. Use
+
+ ./configure CC=cc
+ make CFLAGS="-std -ieee -fprm d"
+
+to build the library this way.
+
+Use GNU tar to unpack the tar file, as Tru64 tar gives an error
+halfway through.
+
+Hints for HP-UX
+===============
+
+The default mode of the HP-UX C compiler does not use ANSI C.
+
+To compile GSL you need to select ANSI C mode with the following
+configuration option:
+
+ CFLAGS="-Ae" ./configure
+
+To switch on optimization use CFLAGS="-Ae -O".
+
+Hints for IRIX (SGI)
+====================
+
+The library should be compiled with the CFLAGS option
+-OPT:IEEE_NaN_inf=ON to ensure correct IEEE arithmetic. The tests in
+sys/ will fail without this option. The older deprecated option
+-OPT:IEEE_comparisons=ON will also work.
+
+The 32 bit IRIX compiler gives warnings about "long double" not being
+supported. These can be ignored or turned off with,
+
+ CFLAGS="-woff 728" ./configure
+
+or
+
+ make CFLAGS="-woff 728"
+
+The compiler also gives warnings about certain libraries that are "not
+used for resolving any symbol". This is harmless and the warnings can
+be ignored.
+
+You may get warnings about " /usr/bin/ld: arg list too long" when
+building shared libraries. If so, try increasing the ncargs kernel
+parameter with the systune(1m) command.
+
+For 64-bit compilation use the following options,
+
+ CC=cc CFLAGS="-64" LDFLAGS="-64" ./configure
+
+or for gcc
+
+ CFLAGS="-mabi-64" LDFLAGS="-mabi=64 -mips4 -L/usr/local/lib/mabi=64"
+
+Hints for MacOS X and PowerPC
+=============================
+
+To install in /usr/local on MacOS systems, do "sudo make install" to
+gain root privileges.
+
+Note that GSL contains files with filenames of 32 characters or more.
+Therefore you need to be careful in unpacking the tar file, as some
+MacOS applications such as Stuffit Expander will truncate filenames to
+31 characters. Using GNU tar and gunzip directly is the safe way to
+unpack the distribution.
+
+There are problems with dynamic linker, so the library should be
+compiled with,
+
+ ./configure --disable-shared
+
+It has been reported that shared libraries can be built if MacOS X
+specific versions of libtool, automake and autoconf from
+http://fink.sourceforge.net/ are installed, and the GSL source is
+reconfigured from scratch (./autogen.sh; ./configure; make)
+
+To avoid warnings about long-double, use the flag
+
+ CFLAGS="-Wno-long-double ....(other options here)"
+
+in addition to the normal compilation options.
+
+The GCC 3.3 compiler shipped by Apple contains a bug which causes the
+wavelet tests to fail on "data untouched" tests at optimisation level
+-O2. You may be able work around this by compiling with CFLAGS="-O1
+..." instead.
+
+F J Frankin <MEP95JFF@sheffield.ac.uk> reported that some early
+versions of GCC-2.95 have a problem with long argument lists on PPC
+architecture, and this prevents GSL from compiling correctly (e.g. the
+test program in the blas directory gives a segmentation fault when
+run). This problem is fixed in more recent versions of GCC.
+
+
+Hints for Microsoft Windows
+===========================
+
+GSL should compile cleanly with GCC under Cygwin on Microsoft Windows.
+
+With Mingw/MSYS some floating point issues have been reported which
+cause failures in the monte/ test directory.
+
+Hints for OpenBSD
+=================
+
+As of July 2001 the OpenBSD log1p() function on i386 causes failures
+in the gsl complex tests. The configure script has been hardcoded to
+substitute gsl_log1p instead on OpenBSD. The log1p() bug has been
+reported and so may be fixed in future versions of OpenBSD.
+
+Hints for OS/2
+==============
+
+The configure script fails to detect the function 'isnan', leading to
+a slew of errors 'isnan redefined'.
+
+To work around this problem, run configure and edit the resulting
+config.h file to comment out the line which defines HAVE_ISINF.
+
+Hints for Solaris
+=================
+
+If you are using the Sun compilers then the library should be compiled
+with the Sun C compiler 'cc', not 'CC' which is the C++ compiler.
+
+The Sun compiler tools are stored in non-standard directories -- make
+sure that all the compiler and linker tools (cc, ar, ranlib, ld) are
+on the PATH. A typical PATH should include the directories
+/opt/SUNWspro/bin:/usr/ccs/bin:/usr/ucb in that order.
+
+For example,
+
+ $ PATH=/opt/SUNWspro/bin:/usr/ccs/bin:/usr/ucb:$PATH
+ $ ./configure CC=cc CFLAGS=-O
+
+If you see configure output
+
+ checking for ar... :
+
+it means that 'ar' has not been found, and the library will fail to
+build.
+
+If you use the Sun compiler you should use the Sun linker and
+assembler. If you use GCC, you can use the GNU linker and assembler
+or the Sun linker and assembler.
+
+There may be some warnings about "end of loop code not reached". These
+can be ignored -- they come from the do { ... ; return ; } while(0)
+statement in the GSL_ERROR macro.
+
+ ------------------------------
+
+Further information on the standard GNU installation procedure
+==============================================================
+
+The sections below describe the general features of the standard GNU
+installation procedure.
+
+Basic Installation
+==================
+
+ These are generic installation instructions.
+
+ The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation. It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions. Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, a file
+`config.cache' that saves the results of its tests to speed up
+reconfiguring, and a file `config.log' containing compiler output
+(useful mainly for debugging `configure').
+
+ If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release. If at some point `config.cache'
+contains results you don't want to keep, you may remove or edit it.
+
+ The file `configure.in' is used to create `configure' by a program
+called `autoconf'. You only need `configure.in' if you want to change
+it or regenerate `configure' using a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+ 1. `cd' to the directory containing the package's source code and type
+ `./configure' to configure the package for your system. If you're
+ using `csh' on an old version of System V, you might need to type
+ `sh ./configure' instead to prevent `csh' from trying to execute
+ `configure' itself.
+
+ Running `configure' takes a while. While running, it prints some
+ messages telling which features it is checking for.
+
+ 2. Type `make' to compile the package.
+
+ 3. Optionally, type `make check' to run any self-tests that come with
+ the package.
+
+ 4. Type `make install' to install the programs and any data files and
+ documentation.
+
+ 5. You can remove the program binaries and object files from the
+ source code directory by typing `make clean'. To also remove the
+ files that `configure' created (so you can compile the package for
+ a different kind of computer), type `make distclean'. There is
+ also a `make maintainer-clean' target, but that is intended mainly
+ for the package's developers. If you use it, you may have to get
+ all sorts of other programs in order to regenerate files that came
+ with the distribution.
+
+Compilers and Options
+=====================
+
+ Some systems require unusual options for compilation or linking that
+the `configure' script does not know about. You can give `configure'
+initial values for variables by setting them in the environment. Using
+a Bourne-compatible shell, you can do that on the command line like
+this:
+ CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
+
+Or on systems that have the `env' program, you can do it like this:
+ env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
+
+Compiling For Multiple Architectures
+====================================
+
+ You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory. To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'. `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script. `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+ If you have to use a `make' that does not supports the `VPATH'
+variable, you have to compile the package for one architecture at a time
+in the source code directory. After you have installed the package for
+one architecture, use `make distclean' before reconfiguring for another
+architecture.
+
+Installation Names
+==================
+
+ By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc. You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PATH'.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+give `configure' the option `--exec-prefix=PATH', the package will use
+PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+ If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+ Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System). The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+ For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+ There may be some features `configure' can not figure out
+automatically, but needs to determine by the type of host the package
+will run on. Usually `configure' can figure that out, but if it prints
+a message saying it can not guess the host type, give it the
+`--host=TYPE' option. TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name with three fields:
+ CPU-COMPANY-SYSTEM
+
+See the file `config.sub' for the possible values of each field. If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the host type.
+
+ If you are building compiler tools for cross-compiling, you can also
+use the `--target=TYPE' option to select the type of system they will
+produce code for and the `--build=TYPE' option to select the type of
+system on which you are compiling the package.
+
+Sharing Defaults
+================
+
+ If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists. Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Operation Controls
+==================
+
+ `configure' recognizes the following options to control how it
+operates.
+
+`--cache-file=FILE'
+ Use and save the results of the tests in FILE instead of
+ `./config.cache'. Set FILE to `/dev/null' to disable caching, for
+ debugging `configure'.
+
+`--help'
+ Print a summary of the options to `configure', and exit.
+
+`--quiet'
+`--silent'
+`-q'
+ Do not print messages saying which checks are being made.
+
+`--srcdir=DIR'
+ Look for the package's source code in directory DIR. Usually
+ `configure' can determine that directory automatically.
+
+`--version'
+ Print the version of Autoconf used to generate the `configure'
+ script, and exit.
+
+`configure' also accepts some other, not widely useful, options.
+
diff --git a/gsl-1.9/Makefile.am b/gsl-1.9/Makefile.am
new file mode 100644
index 0000000..5df8b8c
--- /dev/null
+++ b/gsl-1.9/Makefile.am
@@ -0,0 +1,42 @@
+## Process this file with automake to produce Makefile.in
+
+# AUTOMAKE_OPTIONS = readme-alpha
+
+SUBDIRS = gsl utils sys test err const complex cheb block vector matrix permutation combination sort ieee-utils cblas blas linalg eigen specfunc dht qrng rng randist fft poly fit multifit statistics siman sum integration interpolation histogram ode-initval roots multiroots min multimin monte ntuple diff deriv cdf wavelet bspline doc
+
+SUBLIBS = block/libgslblock.la blas/libgslblas.la bspline/libgslbspline.la complex/libgslcomplex.la cheb/libgslcheb.la dht/libgsldht.la diff/libgsldiff.la deriv/libgslderiv.la eigen/libgsleigen.la err/libgslerr.la fft/libgslfft.la fit/libgslfit.la histogram/libgslhistogram.la ieee-utils/libgslieeeutils.la integration/libgslintegration.la interpolation/libgslinterpolation.la linalg/libgsllinalg.la matrix/libgslmatrix.la min/libgslmin.la monte/libgslmonte.la multifit/libgslmultifit.la multimin/libgslmultimin.la multiroots/libgslmultiroots.la ntuple/libgslntuple.la ode-initval/libgslodeiv.la permutation/libgslpermutation.la combination/libgslcombination.la poly/libgslpoly.la qrng/libgslqrng.la randist/libgslrandist.la rng/libgslrng.la roots/libgslroots.la siman/libgslsiman.la sort/libgslsort.la specfunc/libgslspecfunc.la statistics/libgslstatistics.la sum/libgslsum.la sys/libgslsys.la test/libgsltest.la utils/libutils.la vector/libgslvector.la cdf/libgslcdf.la wavelet/libgslwavelet.la
+
+pkginclude_HEADERS = gsl_math.h gsl_pow_int.h gsl_nan.h gsl_machine.h gsl_mode.h gsl_precision.h gsl_types.h gsl_version.h
+
+bin_SCRIPTS = gsl-config
+
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA= gsl.pc
+
+EXTRA_DIST = autogen.sh gsl-config.in gsl.pc.in configure.ac THANKS BUGS SUPPORT gsl.spec.in gsl.m4 test_gsl_histogram.sh
+
+lib_LTLIBRARIES = libgsl.la
+libgsl_la_SOURCES = version.c
+libgsl_la_LIBADD = $(SUBLIBS)
+libgsl_la_LDFLAGS = -version-info $(GSL_LT_VERSION)
+noinst_HEADERS = templates_on.h templates_off.h
+
+m4datadir = $(datadir)/aclocal
+m4data_DATA = gsl.m4
+
+bin_PROGRAMS = gsl-randist gsl-histogram
+
+gsl_randist_SOURCES = gsl-randist.c
+gsl_randist_LDADD = libgsl.la cblas/libgslcblas.la
+
+gsl_histogram_SOURCES = gsl-histogram.c
+gsl_histogram_LDADD = libgsl.la cblas/libgslcblas.la
+
+check_SCRIPTS = test_gsl_histogram.sh
+TESTS = test_gsl_histogram.sh
+
+#bin_PROGRAMS = main dummy
+#dummy_SOURCES = version.c
+#dummy_LDADD = $(SUBLIBS)
+#main_SOURCES = version.c env.c
+#main_LDADD = libgsl.la
diff --git a/gsl-1.9/Makefile.in b/gsl-1.9/Makefile.in
new file mode 100644
index 0000000..0cd4b1b
--- /dev/null
+++ b/gsl-1.9/Makefile.in
@@ -0,0 +1,969 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# AUTOMAKE_OPTIONS = readme-alpha
+
+
+
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = .
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = gsl-randist$(EXEEXT) gsl-histogram$(EXEEXT)
+DIST_COMMON = README $(am__configure_deps) $(noinst_HEADERS) \
+ $(pkginclude_HEADERS) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in $(srcdir)/config.h.in \
+ $(srcdir)/gsl-config.in $(srcdir)/gsl.pc.in \
+ $(srcdir)/gsl.spec.in $(srcdir)/gsl_version.h.in \
+ $(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \
+ THANKS TODO acconfig.h config.guess config.sub install-sh \
+ ltmain.sh mdate-sh missing mkinstalldirs
+subdir = .
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno configure.status.lineno
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = config.h
+CONFIG_CLEAN_FILES = gsl-config gsl.pc gsl_version.h gsl.spec
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \
+ "$(DESTDIR)$(bindir)" "$(DESTDIR)$(m4datadir)" \
+ "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(pkgincludedir)"
+libLTLIBRARIES_INSTALL = $(INSTALL)
+LTLIBRARIES = $(lib_LTLIBRARIES)
+am__DEPENDENCIES_1 = block/libgslblock.la blas/libgslblas.la \
+ bspline/libgslbspline.la complex/libgslcomplex.la \
+ cheb/libgslcheb.la dht/libgsldht.la diff/libgsldiff.la \
+ deriv/libgslderiv.la eigen/libgsleigen.la err/libgslerr.la \
+ fft/libgslfft.la fit/libgslfit.la histogram/libgslhistogram.la \
+ ieee-utils/libgslieeeutils.la integration/libgslintegration.la \
+ interpolation/libgslinterpolation.la linalg/libgsllinalg.la \
+ matrix/libgslmatrix.la min/libgslmin.la monte/libgslmonte.la \
+ multifit/libgslmultifit.la multimin/libgslmultimin.la \
+ multiroots/libgslmultiroots.la ntuple/libgslntuple.la \
+ ode-initval/libgslodeiv.la permutation/libgslpermutation.la \
+ combination/libgslcombination.la poly/libgslpoly.la \
+ qrng/libgslqrng.la randist/libgslrandist.la rng/libgslrng.la \
+ roots/libgslroots.la siman/libgslsiman.la sort/libgslsort.la \
+ specfunc/libgslspecfunc.la statistics/libgslstatistics.la \
+ sum/libgslsum.la sys/libgslsys.la test/libgsltest.la \
+ utils/libutils.la vector/libgslvector.la cdf/libgslcdf.la \
+ wavelet/libgslwavelet.la
+libgsl_la_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_libgsl_la_OBJECTS = version.lo
+libgsl_la_OBJECTS = $(am_libgsl_la_OBJECTS)
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS)
+am_gsl_histogram_OBJECTS = gsl-histogram.$(OBJEXT)
+gsl_histogram_OBJECTS = $(am_gsl_histogram_OBJECTS)
+gsl_histogram_DEPENDENCIES = libgsl.la cblas/libgslcblas.la
+am_gsl_randist_OBJECTS = gsl-randist.$(OBJEXT)
+gsl_randist_OBJECTS = $(am_gsl_randist_OBJECTS)
+gsl_randist_DEPENDENCIES = libgsl.la cblas/libgslcblas.la
+binSCRIPT_INSTALL = $(INSTALL_SCRIPT)
+SCRIPTS = $(bin_SCRIPTS)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I.
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgsl_la_SOURCES) $(gsl_histogram_SOURCES) \
+ $(gsl_randist_SOURCES)
+DIST_SOURCES = $(libgsl_la_SOURCES) $(gsl_histogram_SOURCES) \
+ $(gsl_randist_SOURCES)
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+ html-recursive info-recursive install-data-recursive \
+ install-exec-recursive install-info-recursive \
+ install-recursive installcheck-recursive installdirs-recursive \
+ pdf-recursive ps-recursive uninstall-info-recursive \
+ uninstall-recursive
+m4dataDATA_INSTALL = $(INSTALL_DATA)
+pkgconfigDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(m4data_DATA) $(pkgconfig_DATA)
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+ { test ! -d $(distdir) \
+ || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
+ && rm -fr $(distdir); }; }
+DIST_ARCHIVES = $(distdir).tar.gz
+GZIP_ENV = --best
+distuninstallcheck_listfiles = find . -type f -print
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+SUBDIRS = gsl utils sys test err const complex cheb block vector matrix permutation combination sort ieee-utils cblas blas linalg eigen specfunc dht qrng rng randist fft poly fit multifit statistics siman sum integration interpolation histogram ode-initval roots multiroots min multimin monte ntuple diff deriv cdf wavelet bspline doc
+SUBLIBS = block/libgslblock.la blas/libgslblas.la bspline/libgslbspline.la complex/libgslcomplex.la cheb/libgslcheb.la dht/libgsldht.la diff/libgsldiff.la deriv/libgslderiv.la eigen/libgsleigen.la err/libgslerr.la fft/libgslfft.la fit/libgslfit.la histogram/libgslhistogram.la ieee-utils/libgslieeeutils.la integration/libgslintegration.la interpolation/libgslinterpolation.la linalg/libgsllinalg.la matrix/libgslmatrix.la min/libgslmin.la monte/libgslmonte.la multifit/libgslmultifit.la multimin/libgslmultimin.la multiroots/libgslmultiroots.la ntuple/libgslntuple.la ode-initval/libgslodeiv.la permutation/libgslpermutation.la combination/libgslcombination.la poly/libgslpoly.la qrng/libgslqrng.la randist/libgslrandist.la rng/libgslrng.la roots/libgslroots.la siman/libgslsiman.la sort/libgslsort.la specfunc/libgslspecfunc.la statistics/libgslstatistics.la sum/libgslsum.la sys/libgslsys.la test/libgsltest.la utils/libutils.la vector/libgslvector.la cdf/libgslcdf.la wavelet/libgslwavelet.la
+pkginclude_HEADERS = gsl_math.h gsl_pow_int.h gsl_nan.h gsl_machine.h gsl_mode.h gsl_precision.h gsl_types.h gsl_version.h
+bin_SCRIPTS = gsl-config
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = gsl.pc
+EXTRA_DIST = autogen.sh gsl-config.in gsl.pc.in configure.ac THANKS BUGS SUPPORT gsl.spec.in gsl.m4 test_gsl_histogram.sh
+lib_LTLIBRARIES = libgsl.la
+libgsl_la_SOURCES = version.c
+libgsl_la_LIBADD = $(SUBLIBS)
+libgsl_la_LDFLAGS = -version-info $(GSL_LT_VERSION)
+noinst_HEADERS = templates_on.h templates_off.h
+m4datadir = $(datadir)/aclocal
+m4data_DATA = gsl.m4
+gsl_randist_SOURCES = gsl-randist.c
+gsl_randist_LDADD = libgsl.la cblas/libgslcblas.la
+gsl_histogram_SOURCES = gsl-histogram.c
+gsl_histogram_LDADD = libgsl.la cblas/libgslcblas.la
+check_SCRIPTS = test_gsl_histogram.sh
+TESTS = test_gsl_histogram.sh
+all: config.h
+ $(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+am--refresh:
+ @:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu --ignore-deps'; \
+ cd $(srcdir) && $(AUTOMAKE) --gnu --ignore-deps \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ echo ' $(SHELL) ./config.status'; \
+ $(SHELL) ./config.status;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ $(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+
+config.h: stamp-h1
+ @if test ! -f $@; then \
+ rm -f stamp-h1; \
+ $(MAKE) stamp-h1; \
+ else :; fi
+
+stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
+ @rm -f stamp-h1
+ cd $(top_builddir) && $(SHELL) ./config.status config.h
+$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(top_srcdir)/acconfig.h
+ cd $(top_srcdir) && $(AUTOHEADER)
+ rm -f stamp-h1
+ touch $@
+
+distclean-hdr:
+ -rm -f config.h stamp-h1
+gsl-config: $(top_builddir)/config.status $(srcdir)/gsl-config.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+gsl.pc: $(top_builddir)/config.status $(srcdir)/gsl.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+gsl_version.h: $(top_builddir)/config.status $(srcdir)/gsl_version.h.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+gsl.spec: $(top_builddir)/config.status $(srcdir)/gsl.spec.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ test -z "$(libdir)" || $(mkdir_p) "$(DESTDIR)$(libdir)"
+ @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+ if test -f $$p; then \
+ f=$(am__strip_dir) \
+ echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \
+ $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \
+ else :; fi; \
+ done
+
+uninstall-libLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @set -x; list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+ p=$(am__strip_dir) \
+ echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \
+ $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \
+ done
+
+clean-libLTLIBRARIES:
+ -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+ @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgsl.la: $(libgsl_la_OBJECTS) $(libgsl_la_DEPENDENCIES)
+ $(LINK) -rpath $(libdir) $(libgsl_la_LDFLAGS) $(libgsl_la_OBJECTS) $(libgsl_la_LIBADD) $(LIBS)
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ if test -f $$p \
+ || test -f $$p1 \
+ ; then \
+ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+ else :; fi; \
+ done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+ rm -f "$(DESTDIR)$(bindir)/$$f"; \
+ done
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+gsl-histogram$(EXEEXT): $(gsl_histogram_OBJECTS) $(gsl_histogram_DEPENDENCIES)
+ @rm -f gsl-histogram$(EXEEXT)
+ $(LINK) $(gsl_histogram_LDFLAGS) $(gsl_histogram_OBJECTS) $(gsl_histogram_LDADD) $(LIBS)
+gsl-randist$(EXEEXT): $(gsl_randist_OBJECTS) $(gsl_randist_DEPENDENCIES)
+ @rm -f gsl-randist$(EXEEXT)
+ $(LINK) $(gsl_randist_LDFLAGS) $(gsl_randist_OBJECTS) $(gsl_randist_LDADD) $(LIBS)
+install-binSCRIPTS: $(bin_SCRIPTS)
+ @$(NORMAL_INSTALL)
+ test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+ @list='$(bin_SCRIPTS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ if test -f $$d$$p; then \
+ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
+ echo " $(binSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+ $(binSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(bindir)/$$f"; \
+ else :; fi; \
+ done
+
+uninstall-binSCRIPTS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_SCRIPTS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
+ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+ rm -f "$(DESTDIR)$(bindir)/$$f"; \
+ done
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-m4dataDATA: $(m4data_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(m4datadir)" || $(mkdir_p) "$(DESTDIR)$(m4datadir)"
+ @list='$(m4data_DATA)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(m4dataDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(m4datadir)/$$f'"; \
+ $(m4dataDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(m4datadir)/$$f"; \
+ done
+
+uninstall-m4dataDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(m4data_DATA)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(m4datadir)/$$f'"; \
+ rm -f "$(DESTDIR)$(m4datadir)/$$f"; \
+ done
+install-pkgconfigDATA: $(pkgconfig_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgconfigdir)" || $(mkdir_p) "$(DESTDIR)$(pkgconfigdir)"
+ @list='$(pkgconfig_DATA)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgconfigDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgconfigdir)/$$f'"; \
+ $(pkgconfigDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgconfigdir)/$$f"; \
+ done
+
+uninstall-pkgconfigDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkgconfig_DATA)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgconfigdir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgconfigdir)/$$f"; \
+ done
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+# (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+ @failcom='exit 1'; \
+ for f in x $$MAKEFLAGS; do \
+ case $$f in \
+ *=* | --[!k]*);; \
+ *k*) failcom='fail=yes';; \
+ esac; \
+ done; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+ @failcom='exit 1'; \
+ for f in x $$MAKEFLAGS; do \
+ case $$f in \
+ *=* | --[!k]*);; \
+ *k*) failcom='fail=yes';; \
+ esac; \
+ done; \
+ dot_seen=no; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ rev=''; for subdir in $$list; do \
+ if test "$$subdir" = "."; then :; else \
+ rev="$$subdir $$rev"; \
+ fi; \
+ done; \
+ rev="$$rev ."; \
+ target=`echo $@ | sed s/-recursive//`; \
+ for subdir in $$rev; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done && test -z "$$fail"
+tags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ done
+ctags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ empty_fix=.; \
+ else \
+ include_option=--include; \
+ empty_fix=; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test ! -f $$subdir/TAGS || \
+ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ $(am__remove_distdir)
+ mkdir $(distdir)
+ $(mkdir_p) $(distdir)/.
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+ list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test -d "$(distdir)/$$subdir" \
+ || $(mkdir_p) "$(distdir)/$$subdir" \
+ || exit 1; \
+ distdir=`$(am__cd) $(distdir) && pwd`; \
+ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+ (cd $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$top_distdir" \
+ distdir="$$distdir/$$subdir" \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+ -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
+ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \
+ || chmod -R a+r $(distdir)
+dist-gzip: distdir
+ tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+ $(am__remove_distdir)
+
+dist-bzip2: distdir
+ tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+ $(am__remove_distdir)
+
+dist-tarZ: distdir
+ tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+ $(am__remove_distdir)
+
+dist-shar: distdir
+ shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+ $(am__remove_distdir)
+
+dist-zip: distdir
+ -rm -f $(distdir).zip
+ zip -rq $(distdir).zip $(distdir)
+ $(am__remove_distdir)
+
+dist dist-all: distdir
+ tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+ $(am__remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration. Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+ case '$(DIST_ARCHIVES)' in \
+ *.tar.gz*) \
+ GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
+ *.tar.bz2*) \
+ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
+ *.tar.Z*) \
+ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+ *.shar.gz*) \
+ GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
+ *.zip*) \
+ unzip $(distdir).zip ;;\
+ esac
+ chmod -R a-w $(distdir); chmod a+w $(distdir)
+ mkdir $(distdir)/_build
+ mkdir $(distdir)/_inst
+ chmod a-w $(distdir)
+ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+ && cd $(distdir)/_build \
+ && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+ $(DISTCHECK_CONFIGURE_FLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) dvi \
+ && $(MAKE) $(AM_MAKEFLAGS) check \
+ && $(MAKE) $(AM_MAKEFLAGS) install \
+ && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+ && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+ distuninstallcheck \
+ && chmod -R a-w "$$dc_install_base" \
+ && ({ \
+ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+ } || { rm -rf "$$dc_destdir"; exit 1; }) \
+ && rm -rf "$$dc_destdir" \
+ && $(MAKE) $(AM_MAKEFLAGS) dist \
+ && rm -rf $(DIST_ARCHIVES) \
+ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck
+ $(am__remove_distdir)
+ @(echo "$(distdir) archives ready for distribution: "; \
+ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+ sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}'
+distuninstallcheck:
+ @cd $(distuninstallcheck_dir) \
+ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
+ || { echo "ERROR: files left after uninstall:" ; \
+ if test -n "$(DESTDIR)"; then \
+ echo " (check DESTDIR support)"; \
+ fi ; \
+ $(distuninstallcheck_listfiles) ; \
+ exit 1; } >&2
+distcleancheck: distclean
+ @if test '$(srcdir)' = . ; then \
+ echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+ exit 1 ; \
+ fi
+ @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+ || { echo "ERROR: files left in build directory after distclean:" ; \
+ $(distcleancheck_listfiles) ; \
+ exit 1; } >&2
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_SCRIPTS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-recursive
+all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(SCRIPTS) $(DATA) \
+ $(HEADERS) config.h
+install-binPROGRAMS: install-libLTLIBRARIES
+
+installdirs: installdirs-recursive
+installdirs-am:
+ for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(m4datadir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \
+ clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-hdr distclean-libtool distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-m4dataDATA install-pkgconfigDATA \
+ install-pkgincludeHEADERS
+
+install-exec-am: install-binPROGRAMS install-binSCRIPTS \
+ install-libLTLIBRARIES
+
+install-info: install-info-recursive
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -rf $(top_srcdir)/autom4te.cache
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS \
+ uninstall-info-am uninstall-libLTLIBRARIES \
+ uninstall-m4dataDATA uninstall-pkgconfigDATA \
+ uninstall-pkgincludeHEADERS
+
+uninstall-info: uninstall-info-recursive
+
+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \
+ check-TESTS check-am clean clean-binPROGRAMS clean-generic \
+ clean-libLTLIBRARIES clean-libtool clean-recursive ctags \
+ ctags-recursive dist dist-all dist-bzip2 dist-gzip dist-shar \
+ dist-tarZ dist-zip distcheck distclean distclean-compile \
+ distclean-generic distclean-hdr distclean-libtool \
+ distclean-recursive distclean-tags distcleancheck distdir \
+ distuninstallcheck dvi dvi-am html html-am info info-am \
+ install install-am install-binPROGRAMS install-binSCRIPTS \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-libLTLIBRARIES \
+ install-m4dataDATA install-man install-pkgconfigDATA \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs installdirs-am maintainer-clean \
+ maintainer-clean-generic maintainer-clean-recursive \
+ mostlyclean mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool mostlyclean-recursive pdf pdf-am ps ps-am \
+ tags tags-recursive uninstall uninstall-am \
+ uninstall-binPROGRAMS uninstall-binSCRIPTS uninstall-info-am \
+ uninstall-libLTLIBRARIES uninstall-m4dataDATA \
+ uninstall-pkgconfigDATA uninstall-pkgincludeHEADERS
+
+
+#bin_PROGRAMS = main dummy
+#dummy_SOURCES = version.c
+#dummy_LDADD = $(SUBLIBS)
+#main_SOURCES = version.c env.c
+#main_LDADD = libgsl.la
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/NEWS b/gsl-1.9/NEWS
new file mode 100644
index 0000000..bee9142
--- /dev/null
+++ b/gsl-1.9/NEWS
@@ -0,0 +1,1093 @@
+* What is new in gsl-1.9:
+
+** Fixed the elliptic integrals F,E,P,D so that they have the correct
+behavior for phi > pi/2 and phi < 0. The angular argument is now
+valid for all phi. Also added the complete elliptic integral
+gsl_sf_ellint_Pcomp.
+
+** Added a new BFGS minimisation method gsl_multimin_fdfminimizer_vector_bfgs2
+based on the algorithm given by R.Fletcher in "Practical Methods of
+Optimisation" (Second edition). This requires substantially fewer
+function and gradient evaluations, and supercedes the existing BFGS
+minimiser.
+
+** The beta functions gsl_sf_beta_e(a,b) and gsl_sf_lnbeta_e(a,b) now
+handle negative arguments a,b. Added new function gsl_sf_lnbeta_sgn_e
+for computing magnitude and sign of negative beta values, analagous to
+gsl_sf_lngamma_sgn_e.
+
+** gsl_cheb_eval_mode now uses the same error estimate as
+gsl_cheb_eval_err.
+
+** Improved gsl_sf_legendre_sphPlm_e to avoid underflow with large
+arguments.
+
+** Added updated Knuth generator, gsl_rng_knuthran2002, from 9th
+printing of "The Art of Computer Programming". Fixes various
+weaknesses in the earlier version gsl_rng_knuthran. See
+http://www-cs-faculty.stanford.edu/~knuth/news02.htm
+
+** The functions gsl_multifit_fsolver_set, gsl_multifit_fdfsolver_set
+and gsl_multiroot_fsolver_set, gsl_multiroot_fdfsolver_set now have a
+const qualifier for the input vector x, reflecting their actual usage.
+
+** gsl_sf_expint_E2(x) now returns the correct value 1 for x==0,
+instead of NaN.
+
+** The gsl_ran_gamma function now uses the Marsaglia-Tsang fast gamma
+method of gsl_ran_gamma_mt by default.
+
+** The matrix and vector min/max functions now always propagate any
+NaNs in their input.
+
+** Prevented NaN occuring for extreme parameters in
+gsl_cdf_fdist_{P,Q}inv and gsl_cdf_beta_{P,Q}inv
+
+** Corrected error estimates for the angular reduction functions
+gsl_sf_angle_restrict_symm_err and gsl_sf_angle_restrict_pos_err.
+Fixed gsl_sf_angle_restrict_pos to avoid possibility of returning
+small negative values. Errors are now reported for out of range
+negative arguments as well as positive. These functions now return
+NaN when there would be significant loss of precision.
+
+** Corrected an error in the higher digits of M_PI_4 (this was beyond
+the limit of double precision, so double precision results are not
+affected).
+
+** gsl_root_test_delta now always returns success if two iterates are
+the same, x1==x0.
+
+** A Japanese translation of the reference manual is now available
+from the GSL webpage at http://www.gnu.org/software/gsl/ thanks to
+Daisuke TOMINAGA.
+
+** Added new functions for basis splines, see the "Basis Splines"
+chapter in the GSL Reference Manual for details.
+
+** Added new functions for testing the sign of vectors and matrices,
+gsl_vector_ispos, gsl_vector_isneg, gsl_matrix_ispos and
+gsl_matrix_isneg.
+
+** Fixed a bug in gsl_sf_lnpoch_e and gsl_sf_lnpoch_sgn_e which caused
+the incorrect value 1.0 instead of 0.0 to be returned for x==0.
+
+** Fixed cancellation error in gsl_sf_laguerre_n for n > 1e7 so that
+larger arguments can be calculated without loss of precision.
+
+** Improved gsl_sf_zeta_e to return exactly zero for negative even
+integers, avoiding less accurate trigonometric reduction.
+
+** Fixed a bug in gsl_sf_zetam1_int_e where 0 was returned instead of
+-1 for negative even integer arguments.
+
+** When the differential equation solver gsl_odeiv_apply encounters a
+singularity it returns the step-size which caused the error code from
+the user-defined function, as opposed to leaving the step-size
+unchanged.
+
+** Added support for nonsymmetric eigensystems
+
+** Added Mathieu functions
+
+* What was new in gsl-1.8:
+
+** Added an error check to trap multifit calls with fewer observations
+than parameters. Previously calling the multifit routines with n<p
+would cause invalid memory access.
+
+** Added the Debye unit to physical constants.
+
+** Added cumulative distribution functions for the discrete
+distributions, including binomial, poisson, geometric, negative
+binomial, pascal and hypergeometric.
+
+** Added the functions gsl_cdf_beta_{Pinv,Qinv} and
+gsl_cdf_fdist_{Pinv,Qinv} for computing the inverse of the cumulative
+beta and F distributions.
+
+** Added the multilinear fit estimator function gsl_multifit_linear_est
+for computing model values and their errors.
+
+** Avoid division by zero in gsl_multimin_fdfminimizer_vector_bfgs
+if the step-size becomes too small.
+
+** Users on DEC Alpha systems will need to specify their desired IEEE
+arithmetic options via CFLAGS when building the library, as these are
+no longer added automatically.
+
+** Added new random variate generators gsl_ran_gaussian_ziggurat
+and gsl_ran_gamma_mt for the Gaussian and Gamma distributions based on
+the Marsaglia-Tsang ziggurat and fast gamma methods.
+
+** Improved the speed of the exponential power distribution
+gsl_ran_exppow.
+
+** Improved the speed of the Gaussian ratio method by adding quadratic
+bounds in gsl_ran_gaussian_ratio_method.
+
+** Added an extra term to the taylor series of the synchrotron
+functions gsl_sf_synchrotron_1 and gsl_sf_synchrotron_2 for small x to
+ensure smooth matching with the chebyshev expansion.
+
+** The binomial pdf gsl_ran_binomial_pdf now handles the cases p=0
+and p=1 and is more accurate for the case of small p with k=0.
+
+** Fixed the spherical bessel function gsl_sf_bessel_jl_e) to limit
+the use of gsl_sf_bessel_Jnu_asympx_e to the range x>100*l*l to
+satisfy he requirement x>>l*l in the asymptotic expansion.
+
+** The scaled bessel function gsl_sf_bessel_In_scaled now handles
+larger arguments x > 1e7 correctly for n < 150 using the uniform
+asymptotic expansion instead of the continued fraction expansion.
+
+** The functions gsl_stats_min/max now return NaN if the data contains
+NaN. Similarly, the functions gsl_stats_min/max_index return the index
+of the first occurring NaN in the data when it contains a NaN.
+
+** Fixed an invalid memory access that caused incorrect results for
+the special case in periodic cubic spline interpolation of 3 points.
+
+** Added Debye functions for n=5 and n=6
+
+** Added the missing functions gsl_spline_name() and
+gsl_spline_min_size()
+
+** The function gsl_rng_uniform_int(r,n) now returns an error for n=0,
+which can occur when passing an unsigned integer value of 2^32.
+
+* What was new in gsl-1.7:
+
+** Switched gsl_randist_binomial to use the faster binomial random
+variate TPE algorithm by default. The previous binomial variate
+algorithm is available as gsl_randist_binomial_knuth. This will
+result in a different sequence of binomial variates in programs using
+this function.
+
+** Improved the algorithm for gsl_sf_elljac_e to avoid cancellation
+errors near quarter periods.
+
+** Fixed the branch selection in gsl_sf_gamma_inc_Q_e to avoid
+inaccurate results for large a,x where x~=~a.
+
+** The multilinear fitting functions now have forms which accept a
+user-specified tolerance for the SVD cutoff and return the
+corresponding effective rank of the design matrix.
+
+** The quadratic solvers in poly/ now handle linear equations
+gracefully (i.e. quadratrics with a leading coefficient of zero).
+
+** The output of "make check" now only shows test failures by default,
+to reduce the amount of output. Set the environment variable
+GSL_TEST_VERBOSE=1 to display all the output. To assist debugging,
+the test number of each failure is shown in square brackets at the
+line-end [NNNN].
+
+** Fixed bugs in gsl_linalg_SV_decomp_jacobi which caused
+incorrect results for some input matrices.
+
+** Bessel, coulomb, dilogarithm and legendre_H3d functions now use
+hypot internally to avoid overflow when computing terms like
+sqrt(1+x*x).
+
+** The 'Usage' chapter of the reference manual now explains how to
+handle deprecated functions using the GSL_DISABLE_DEPRECATED macro.
+
+** The conflicting enum definitions for 'forward' and 'backward' in
+gsl_ftt.h and gsl_wavelet.h are deprecated. User code should switch
+to the new definitions gsl_fft_forward, gsl_fft_backward,
+gsl_wavelet_forward and gsl_wavelet_backward. Selectively define
+GSL_DISABLE_DEPRECATED before including the headers to use the new
+definitions on either or both modules.
+
+** Fixed an error in the the brent minimisation algorithm. Iterations
+should now follow Brent's original description correctly.
+
+** The bound coulomb function gsl_sf_hydrogenicR_e no longer reports
+an underflow for exact zeroes of the wavefunction.
+
+** gsl_linalg_SV_decomp_jacobi now reports an error for the
+unimplemented case M<N correctly.
+
+** Fixed conformance test for the SYRK and HERK blas functions
+gsl_blas_{s,d,c,z}syrk and gsl_blas_{c,z}herk for non-square matrices.
+
+** Configure now checks for presence of ieeefp.h if needed.
+
+** Differential equation solvers now propagate error codes returned
+from user-defined functions to the top-level in all cases.
+
+** Sort functions now avoid an infinite loop if Nans are present in
+the input vector. The order of nans in the output is undefined,
+although other elements will be sorted correctly.
+
+* What was new in gsl-1.6:
+
+** Added a new wavelet directory, with 1-dimensional and 2-dimensional
+discrete wavelet transforms.
+
+** Added support for LQ and P^T LQ decompositions. To find the QR
+decomposition of large systems (M>>N) use the LQ decomposition,
+solving the transpose of the original system. This allows more
+efficient memory access, and is useful for solving large least-squares
+problems.
+
+** Fixed a bug in the SYRK and HERK blas functions gsl_blas_{s,d,c,z}syrk
+and gsl_blas_{c,z}herk which caused invalid memory access for non-square
+matrices.
+
+** Fixed a bug in gsl_swap_vectors which caused it to return incorrect
+results when swapping vectors with different strides.
+
+** Corrected the error estimate for gsl_cheb_eval_n_err to use
+evaluation order instead of the approximation order.
+
+** Improved the reliability of the gsl_sf_gamma_inc family of
+functions.
+
+** Equal abscissae are now handled gracefully in the cspline and
+periodic cspline interpolations.
+
+** Removed potential cancellation error in calculation of uniform
+histogram ranges.
+
+** Improved numerical stability of integration for akima and cspline
+interpolation.
+
+** Differential equation solvers now handle error codes returned from
+user-defined functions.
+
+** Improved error estimates in ode-initval solvers, and provide exact
+derivatives on output. Added new semi-implicit ode-initval solver,
+gsl_odeiv_step_rk2simp.
+
+** Added missing function definition for gsl_sf_psi_1.
+
+** Fixed the function gsl_sf_expint_Ei_scaled to call
+gsl_sf_expint_Ei_scaled_e instead of gsl_sf_expint_Ei_e.
+
+** Added cumulative distribution function for exponential power
+distribution.
+
+** The functions gsl_cdf_beta_P and gsl_cdf_beta_Q now return
+consistent results of 0 or 1 for out of range values, x<0 and x>1,
+rather than 0 for left and right tails simultaneously.
+
+** The Jacobi eigensolvers gsl_eigen_jacobi and gsl_eigen_jacobi_invert
+have new implementations from Golub and Van Loan.
+
+** The standard output and standard error streams are now flushed by
+the default error handler before the program aborts, in order to
+ensure that error messages are properly displayed on some platforms.
+
+* What was new in gsl-1.5:
+
+** Multifit routines now handle iterations where |f| is already
+minimised to zero, without division by zero.
+
+** Fixed the singular value tolerance test in the multifit covariance
+calculation from < to <= to match the original MINPACK code.
+
+** The macro HAVE_INLINE is now tested with #ifdef instead of #if as
+in versions prior to 1.4, to match the documentation, and the macro
+GSL_RANGE_CHECK_OFF now works correctly. An alternative macro
+GSL_RANGE_CHECK={0,1} can be used to control range-checking.
+
+** Fixed a potential array overflow in gsl_ran_landau.
+
+** Fixed a small discrepancy in the tolerance calculation of the
+one-dimensional brent minimiser.
+
+** Numerical derivatives should now be calculated using the
+gsl_deriv_forward, gsl_deriv_central and gsl_deriv_backward functions,
+which accept a step-size argument in addition to the position x. The
+original gsl_diff functions (without the step-size) are deprecated.
+
+** Corrected documentation for gsl_ran_hypergeometric_pdf()
+
+** The tridiagonal matrix solvers gsl_linalg_solve_symm_tridiag,
+gsl_linalg_solve_tridiag, gsl_linalg_solve_symm_cyc_tridiag,
+gsl_linalg_solve_cyc_tridiag now use the GSL_ERROR macro to report
+errors, instead of simply returning an error code. The arguments to
+these functions must now use exact lengths with no additional
+elements. For cyclic systems all vectors must be of length N, for
+tridiagonal systems the offdiagonal elements must be of length N-1.
+
+** The singular value decomposition routines gsl_linalg_SV_decomp and
+gsl_linalg_SV_decomp_mod now handle the SVD of a column vector (N=1,
+arbitrary M), which can occur in linear fitting.
+
+** Restored missing header files gsl_const_mks.h and gsl_const_cgs.h.
+The incorrect values of the electrical units for gsl_const_cgs
+(VACUUM_PERMEABILITY and VACUUM_PERMITTIVITY) have been removed.
+
+** Fixed gsl_linalg_SV_decomp() to avoid an infinite loop when
+computing the SVD of matrices containing Inf and Nan.
+
+** Fixed gsl_linalg_balance_columns() to avoid an infinite loop when
+rescaling matrices containing Inf and NaN.
+
+** Fixed header file <gsl/gsl_sf_log.h> to include declarations for
+error codes in inline versions of gsl_sf_log functions
+
+** Fixed header file <gsl/gsl_const.h> to include new MKSA and CGSM
+header files.
+
+** Added Stefan-Boltzmann constant and Thomson cross section to
+physical constants
+
+* What was new in gsl-1.4:
+
+** Added cumulative distribution functions and their inverses for the
+continuous random distributions including: gaussian, lognormal, gamma,
+beta, cauchy, laplace, chisq, exponential, gumbel, weibull,
+F-distribution, t-distribution, logistic, pareto and rayleigh.
+
+** Added faster binomial random variates using the TPE rejection
+algorithm, in the function gsl_randist_binomial_tpe.
+
+** Added new functions gsl_rng_fwrite and gsl_rnd_fread for storing
+the state of random number generators in a file.
+
+** Added a new function gsl_combination_memcpy()
+
+** Corrected values of electrical constants in CGS units. To take
+account of different electrical systems of units the values are now
+prefixed by GSL_CONST_MKSA (for the SI Metre, Kilogram, Second, Ampere
+system) or GSL_CONST_CGSM (for the Centimetre, Gram, Second, Magnetic
+system with the Gauss as the fundamental unit of magnetic field
+strength). The previous GSL_CONST_MKS and GSL_CONST_CGS prefixes have
+been removed, as have the permeability and permittivity constants in
+the CGS system since this uses different defining equations.
+
+** Fixed bugs in the random number generators gsl_rng_fishman18,
+gsl_rng_fishman2x, and gsl_rng_knuthran2 which caused them to return
+incorrect results. Minor corrections were made to the parameters in
+the other Knuth generators borosh13, coveyou, fishman20, lecuyer21,
+and waterman14.
+
+** Fixed a missing transpose bug in the gsl_linalg_QR_QRsolve
+and gsl_linalg_QRPT_QRsolve routines which were computing the
+solution to Q^T R x = b instead of Q R x = b.
+
+** Fixed gsl_sf_gammainv to return zero instead of a domain
+error for arguments corresponding to singularities in gamma.
+
+** Fixed a bug in the simplex minimization algorithm which
+caused it to fail to find the second highest point correctly
+when searching the set of simplex points.
+
+** Fixed a bug in the conjugate gradient minimizers conjugate_pr,
+conjugate_fr and vector_bgfs which caused the search
+directions to be updated incorrectly.
+
+** Fixed a bug in gsl_sf_psi_1_int(1) which caused it to
+return the incorrect sign for psi(1,1).
+
+** Fixed the simulated annealing routine gsl_siman_solve to use the
+parameter iters_fixed_T for the number of iterations at fixed
+temperature instead of n_tries.
+
+** Fixed a bug in gsl_combination_valid which caused it to return the
+incorrect status.
+
+** Fixed a bug in gsl_permutation_canonical_to_linear which caused the
+output to always be zero, and the input permutation to be incorrectly
+replaced by the output.
+
+** Fixed a bug is gsl_ran_discrete which could cause uninitialised
+data to be returned for some distributions.
+
+** Fixed the dependencies for gsl_chebyshev.h to include gsl_math.h.
+
+** Fixed a bug in gsl_complex_arccsc_real which caused it to return
+the incorrect sign for the imaginary part when -1<x<0.
+
+** Fixed a bug in the QAWC Cauchy integration routine which could
+allow the singularity to fall on an interval boundary, leading to
+division by zero.
+
+** Improved gsl_sf_gamma_inc_P(a,x) to avoid a domain error for x<<a
+when a>10.
+
+** Improved the accuracy of gsl_sf_coupling_3j for large arguments.
+
+** Improved the performance of gsl_sf_choose(m,n) by separating the
+calculations for small and large arguments.
+
+** On platforms without IEEE comparisons gsl_{isnan,isinf,finite} will
+fall back to the system versions of isnan, isinf and finite if
+available.
+
+** gsl_linalg_householder_hv now uses BLAS routines internally
+
+** The script configure.in is now compatible with autoconf-2.50 and
+later.
+
+** Reduced the memory usage of the multifit algorithms from MxM to MxN
+for large M by performing the QR decomposition of the Jacobian
+in-place.
+
+** IEEE modes now use the C99 fenv.h functions when platform spectific
+functions are not available.
+
+* What was new in gsl-1.3:
+
+** Changed interface for gsl_sf_coupling_6j...(...). The old functions
+actually calculated 6j for a permutation of the arguments (that
+related to Racah W). This was incorrect and not consistent with
+the documentation. The new versions calculate < {a,b,c}, {d,e,f} >,
+as stated in the documentation. The old versions are still available
+as gsl_sf_coupling_6j_INCORRECT...(...), though they are deprecated
+and will be removed at some point in the future.
+
+** Added new functions for computing Em(x)=exp(-x)*Ei(x), the modified
+(scaled) form of the exponential integral, gsl_sf_expint_E1_scaled,
+gsl_sf_expint_E2_scaled, gsl_sf_expint_Ei_scaled.
+
+** Fixed compilation problems with gcc -ansi and other ANSI compilers.
+
+** Fixed uninitialized memory access in the Niederreiter quasi-random
+number generator.
+
+** Fixed the eigenvalue routines to prevent an infinite loop for Inf
+or NaN entries in matrix.
+
+** Fixed a bug in the multifit and multiroots allocation routines
+which cause them to fail to report some out of memory conditions.
+
+** Fixed a bug in the seeding for the random number generator
+gsl_rng_taus2 which affected a small number of seeds.
+
+** Modified the complex householder transforms to avoid division by
+zero, which could cause NaNs to be returned by the gsl_eigen_hermv
+eigenvalue decomposition.
+
+** The Nelder-Mead simplex algorithm for multidimensional
+minimisation has been added.
+
+** The random number distributions now include the Dirichlet and
+Multinomial distributions.
+
+** Added a new function gsl_fcmp for approximate comparison of
+floating point numbers using Knuth's algorithm.
+
+** Added new functions gsl_ldexp and gsl_frexp as portable
+alternatives to ldexp() and frexp().
+
+** Fixed a bug in gsl_linalg_bidiag_unpack_B which was returning
+incorrect results for the superdiagonal.
+
+** Fixed a bug in the acceptance condition for simulated annealing
+
+** Ordinary differential equations can now be solved using a different
+absolute error for each component with gsl_odeiv_control_scaled_new().
+
+** Upgraded to libtool-1.4.3
+
+* What was new in gsl-1.2:
+
+** Added new functions for combining permutations, converting between
+cyclic and linear representations, and counting cycles and inversions.
+
+** New multiroot functions now allow access to the current values of f
+and dx.
+
+** The default error handler now outputs a explanatory message before
+aborting.
+
+** Extended gsl_linalg_SV_decomp to handle exact zeroes in the
+singular values, and added tests for 3x3 matrices.
+
+** Fixed a bug in gsl_linalg_SV_decomp which caused singular values to
+be sorted incorrectly.
+
+** Fixed a bug in gsl_linalg_solv_symm_cyc_tridiag which caused it to
+produce incorrect results.
+
+** Added nonsymmetric tridiagonal solvers gsl_linalg_solve_tridiag and
+gsl_linalg_solve_cyc_tridiag.
+
+** The declarations used to export static objects can now be
+controlled through a macro GSL_VAR and the header file
+<gsl/gsl_types.h>.
+
+** The simulated annealing routine gsl_siman_solve now keeps track of
+the best solution so far.
+
+** The values of the physical constants have been updated to the
+CODATA 1998 recommendations.
+
+** Added new physical constants, newton, dyne, joule, erg and
+power-of-ten prefixes, Mega, Giga, Tera, etc.
+
+** The error estimate for the elliptic function gsl_sf_ellint_Kcomp_e
+has been improved to take account of numerical cancellation for small
+arguments.
+
+** The domain of gsl_sf_psi_1piy has been extended to negative y.
+
+** Fixed memory leak in the Chebyshev module.
+
+** The seeding procedure of mt19937 has been updated to the latest
+version from Makoto Matsumoto and Takuji Nishimura (Jan 2002). The
+original seeding procedure is available through the generator
+gsl_rng_mt19937_1999.
+
+** A new random number generator gsl_rng_taus2 has been added to
+correct flaws in the seeding procedure of gsl_rng_taus, as described
+in an erratum to the original paper of P. L'Ecuyer.
+
+** Added missing declaration for the generator gsl_rng_mt_19937_1998.
+
+** Added missing quasi-random number generator function gsl_qrng_init.
+
+** Removed unnecessary endpoint subtraction in chebyshev-based
+QUADPACK routines to avoid possible loss of precision.
+
+** Fixed bug in gsl_interp_cspline_periodic which caused a
+discontinuity in the derivative near the boundary.
+
+** The function gsl_min_fminimizer_minimum has been renamed to
+gsl_min_fminimizer_x_minimum for consistency (the old function name is
+still available but is deprecated). Additional functions have been
+added for accessing the function values at the minimum and endpoints
+of the bounding interval.
+
+** The KNOWN-PROBLEMS file of "make check" failures has been replaced
+by a BUGS file, since we now require "make check" to work correctly
+for stable releases.
+
+* What was new in gsl-1.1.1:
+
+** Fixes to histogram2d stat functions
+
+** Added missing prototypes for complex LU determinant functions
+
+** Improved error handling in multifit routines
+
+** Added check to avoid division by zero for rank-deficient matrix in
+multifit iteration
+
+* What was new in gsl-1.1:
+
+** The permutation module now includes a copy function
+gsl_permutation_memcpy
+
+** The implementation of gsl_sf_gamma_inc has been improved and now
+avoids problems caused by internal singularities which occurred in the
+series expansion for some combinations of parameters.
+
+** IEEE comparisons of infinities and NaNs are tested during the
+configure stage and the functions gsl_isnan, gsl_isinf and gsl_finite
+are only compiled on platforms which support the necessary tests.
+
+** The histogram routines now include a sum function,
+gsl_histogram_sum for computing the total bin sum, and additional
+statistics functions for 2d histograms.
+
+** Internal error checking of user-defined functions has been improved
+in the multiroots functions.
+
+** Constants now include the Bohr Radius and Vacuum Permittivity.
+
+** Range checking is now turned off when building the library, but is
+still on by default when compiling user applications.
+
+** A combinations directory has been added for generating combinations (n,k).
+
+** The gamma function now returns exact values for integer arguments.
+
+** Fixed bugs in gsl_sf_hyperg_1F1_int and gsl_sf_hyperg_1F1.
+
+** Fixed internal error handling in gsl_sf_laguerre_n to allow
+recovery from overflow.
+
+** Several routines for handling divided difference polynomials have
+been added to the poly/ directory.
+
+** The interpolation routines now include polynomial interpolation,
+based on divided-differences.
+
+** Added new random number generators from Knuth's Seminumerical
+Algorithms, 3rd Edition: borosh13, coveyou, fishman18, fishman20,
+fishman2x, knuthran, knuthran2, lecuyer21, waterman14.
+
+** Changed divisor in random number generator gfsr4 from 2^32-1 to
+2^32 to prevent exact value of 1.0 from being returned, as specified
+in the documentation.
+
+* What was new in gsl-1.0:
+
+** First general release.
+
+** Increased the maximum number of iterations in gsl_poly_complex_solve()
+from 30 to 60.
+
+* What was new in gsl-0.9.4:
+
+** Reorganized the multmin functions to use the same interface as the
+other iterative solvers.
+
+** Added histogram _alloc functions for consistency, in addition to the
+existing _calloc functions.
+
+** Renamed all the gsl_multimin functions to be consistent with the
+rest of the library. An underscore has been removed from _minimizer
+in all the function names.
+
+** Renamed the function gsl_sf_coulomb_CL_list to gsl_sf_coulomb_CL_array
+
+** A bug in the multimin functions where the function parameters
+(params) were omitted has been fixed.
+
+** A bug in the nonlinear minimization routines has been fixed, which
+could prevent the algorithms from converging. Additional tests from
+the NIST reference datasets have been added and these now agree with
+MINPACK.
+
+** All the physical constants and conversion factors are now defined as
+real numbers to avoid potential problems with integer arithmetic.
+
+** The ODE evolution routines now allow for negative step sizes, and
+integrating backwards as well as forwards.
+
+** The implicit Burlisch-Stoer ODE algorithm 'bsimp' now detects
+singularities and forces a reduction in step size, preventing runaway
+instabilities.
+
+** Fixed a bug in the ODE evolution function gsl_odeiv_evolve_apply
+which could cause an erroneous value to be returned if the step size
+is reduced on the last step.
+
+* What was new in gsl-0.9.3:
+
+** Routines for complex LU decomposition are now available, allowing
+the solution of systems of equations with complex coefficients.
+
+** Matrix views of vectors now correctly require a unit stride for the
+original vector.
+
+** Permutations can now be applied to complex arrays and vectors.
+
+** gsl_sf_pow_int now handles the case x = 0, n < 0
+
+** The static versions of inline functions can now be hidden by
+defining the preprocessor macro HIDE_INLINE_STATIC. This is needed
+for some compilers.
+
+** The original seeding procedure of mt19937 is available through the
+generator gsl_rng_mt19937_1998. The seeding procedure was flawed, but
+is available for compatibility.
+
+** Added missing functions gsl_complex_div_real and
+gsl_complex_div_imag.
+
+** Missing functions for constant vector and matrix views have now been
+added.
+
+** Statistical calculations for histograms are now available, and the
+gsl-histogram command also displays the histogram mean and standard
+deviation.
+
+** The behavior of GSL_IEEE_MODE for denormalized exceptions has been
+fixed on Openbsd and Netbsd.
+
+** A pkg-config file gsl.pc is included in the distribution
+
+** The reference manual can now be printed in @smallbook format without
+overflow.
+
+* What was new in gsl-0.9.2:
+
+** Vector and matrix views are now compliant with the ANSI standard.
+
+** Added Lambert functions gsl_sf_lambert_W0, gsl_sf_lambert_Wm1.
+
+** The reference manual now uses the GNU Free Documentation License.
+
+** Fixed a couple of bugs in the SVD routines.
+
+** Macros for Infinity and Nan now work correctly with Microsoft Visual
+C++, and a bug in the config.h file for the finite() function has been
+fixed.
+
+** Redundant entries in the test suite for the complex math functions
+have been removed, making the distribution size smaller.
+
+** Installed programs gsl-randist and gsl-histogram now use shared
+libraries.
+
+* What was new in gsl-0.9.1:
+
+** The single precision ffts now uses float throughout, rather than
+mixing float and double.
+
+** The random number distributions now include the Landau distribution.
+
+** The fft function interface has been reorganized, with workspaces
+separate from wavetables to eliminate unnecessary recomputation of
+trigonometric factors.
+
+** The gsl_interval type has been eliminated and replaced by two double
+arguments for simplicity.
+
+** The order of the arguments to the minimization routines is no more
+logical, with function values assocatied with x-values.
+
+** Modified initialization of vector and matrix views to work with the
+SunPro compiler.
+
+** Renamed gsl_Efunc_t to gsl_siman_Efunc_t, in accordance with
+namespace conventions.
+
+** Improved accuracy and fixed bugs in gsl_sf_hyperg_1F1,
+gsl_sf_bessel_I0_scaled, gsl_sf_erfc, gsl_sf_log_erfc,
+gsl_sf_legendre_Q0 and gsl_sf_legendre_Q1, and gsl_sf_zeta.
+
+** Improved IEEE compliance of special functions, overflows now return
+Inf and domain errors return NaN.
+
+** Improved checking for underflows in special functions when using
+extended precision registers
+
+* What was new in gsl-0.9:
+
+** There is a new system of vector and matrix views. Any code using
+vector and matrix views will need to be updated.
+
+** The order of arguments of the view functions involving strides have
+been changed to be consistent with the rest of the library.
+
+** The ode solvers have been reorganized.
+
+** There are new eigensystem routines for real symmetric and complex
+hermitian matrices.
+
+** The linear algebra directory now includes functions for computing
+symmetric tridiagonal decompositions and bidiagonal decompositions.
+
+** The svd routines now include the Golub-Reinsch and Modified
+Golub-Reinsch algorithms in addition to the Jacobi algorithm.
+
+** The interpolation directory has been reorganized and a higher-level
+"spline" interface has been added which simplifies the handling of
+interpolation arguments.
+
+** IEEE support is now available on OpenBSD.
+
+* What was new in gsl-0.8:
+
+** The build process now uses the latest libtool and automake.
+
+** The library should now compile with Microsoft Visual C++.
+
+** Portable versions of the isinf, isnan and finite functions are
+available as gsl_isinf(x), gsl_isnan(x) and gsl_finite(x).
+
+** The definitions of GSL_POSINF, GSL_NEGINF and GSL_NAN no longer
+cause divisions by zero during compilation.
+
+** The gsl_interp_obj has been renamed to gsl_interp.
+
+** The poly_eval and pow_int functions have been moved from the
+specfunc directory to the poly and sys directories.
+
+** The Chebyshev functions are now available as an independent module
+in their own directory.
+
+** The error handling conventions have been unified across the
+library. This simplifies the use of the special functions.
+
+** A full CBLAS implementation is now included for systems where ATLAS
+has not been installed. The CBLAS library can also be used
+independently of GSL. The organisation of the BLAS directories has been
+simplified.
+
+** IEEE support for HPUX-11, NetBSD, Apple Darwin and OS/2 are now
+included.
+
+** The library now includes implementations of log1p, expm1, hypot,
+acosh, asinh, atanh for platforms which do not provide them.
+
+** The convention for alloc and set functions has changed so that they
+are orthogonal. After allocating an object it is now necessary to
+initialize it.
+
+** There is a new module for estimating numerical derivatives of functions
+
+** There is a new module for handling data with ntuples
+
+** The histogram lookup functions are now optimized for the case of
+uniform bins, and include an inline binary search for speed.
+
+** The Chebyschev coefficients for the QAWO algorithm are now
+precomputed in a table for efficiency, rather than being computed on
+the fly.
+
+** There are several new sorting functions for selecting the k-th
+smallest or largest elements of a dataset.
+
+** Iterator functions are now available for permutations,
+gsl_permutation_next and gsl_permutation_prev.
+
+** The function gsl_complex_xy has been renamed gsl_complex_rect
+
+** The API for simulated annealing has been changed to support search
+spaces in which the points cannot be represented as contiguous-memory
+data structures. gsl_siman_solve() now takes three extra arguments: a
+copy constructor, a copy function and a destructor, allowing
+gsl_siman_solve() to do its work with linked data structures. If all
+three of these function pointers are NULL, then the traditioanl
+approach of using malloc(), memcpy(), and free() with the element size
+is used.
+
+* What was new in gsl-0.7:
+
+** Linux/PowerPC should now be well supported.
+
+** Header files for common physical constants have been added.
+
+** Functions linear and nonlinear regression in one or more dimensions
+are now available.
+
+** Vector and matrix views now have access to the address of the
+underlying block for compatibility with VSIPL (www.vsipl.org).
+
+** There is a new library for generating low-discrepancy quasi-random
+sequences.
+
+** The seeding procedure of the default random number generator
+MT19937 has been updated to match the 10/99 release of the original
+code. This fixes a weakness which occurred for seeds which were
+powers of 2.
+
+** The blas library libgslblasnative has been renamed libgslblas to avoid
+confusion with system blas library
+
+* What was new in gsl-0.6:
+
+** The library is now installed as a single shared or static libgsl
+file using libtool.
+
+** The gsl-config script now works. There is also a gsl.m4 file which
+people can use in their configure scripts.
+
+** All header files are now in installed as pkginclude headers in a
+gsl/ subdirectory.
+
+** The header files now use extern "C" to allow them to be included in
+C++ programs
+
+** For consistency the following functions have been renamed,
+
+ gsl_vector_copy (dest, src) is now gsl_vector_memcpy (dest, src)
+ gsl_rng_cpy (dest, src) is now gsl_rng_memcpy (dest, src)
+ gsl_matrix_copy_row (v,m,i) is now gsl_matrix_get_row (v,m,i)
+ gsl_matrix_copy_col (v,m,j) is now gsl_matrix_get_col (v,m,j)
+ gsl_vector_swap is now gsl_vector_swap_elements
+ gsl_vector_swap_cols is now gsl_vector_swap_columns
+ gsl_vector_swap_row_col is now gsl_vector_swap_row_column
+
+and the vector/matrix view allocation functions have been simplified.
+
+** A new sort directory has been added for sorting objects and vectors.
+
+** A permutation directory has been added for manipulating permutations
+
+** Statistics functions now support a stride argument for generality, and
+also support weighted samples and a covariance function.
+
+** The names of the statistics functions have been reorganized for
+improved clarity. Consult manual for details.
+
+** The environment variable GSL_IEEE_MODE now uses "," as a separator
+instead of ";"
+
+** The autogen.sh script, mostly for use by developers who use the CVS
+repository, now does not run configure.
+
+** The histogram directory now has additional functions for copying
+and comparing histograms, performing arithmetic on histograms and
+finding maximum and minimum values. Corresponding functions have been
+added for vectors and matrices.
+
+** The linear algebra directory supports additional methods, including
+rectangular QR, rectangular QRPT and Cholesky decomposition.
+
+** Complex arithmetic (+,-,*,/) and complex elementary functions
+(sqrt, log, exp, sin, cos, tan, arcsin, arccos, arctan, sinh, cosh,
+tanh, arcsinh, arccosh, arctanh) are now supported.
+
+** Multidimensional minimization methods are now available.
+
+** The special functions directory now includes a routine for
+computing the value of the incomplete beta function.
+
+* Was new in gsl-0.5:
+
+** There is now a KNOWN-PROBLEMS file which lists compilation problems
+and test failures which are known to the developers.
+
+** Many improvements have been made to the special functions directory.
+
+** The extrapolations from the Levin u-transform are now more reliable.
+
+** Linear algebra and Eigensystem routines are now available.
+
+** ODE solvers are now available.
+
+** Multidimensional root finding algorithms are available.
+
+** Minimization now keeps track of function values.
+
+** Matrices and vectors now use a BLAS compatible format, and have a
+separate memory handling layer (gsl_block).
+
+** Roots of general polynomials can now be found using gsl_poly_complex_solve
+
+** IEEE modes support on Sparclinux, Tru64, AIX and IRIX
+
+** We have added the second generation RANLUX generators RANLXS and RANLXD
+
+** Minimization algorithms are available (one-dimensional)
+
+** Documentation now works out of the box with the standard Texinfo.
+
+** Full reimplementation of the QUADPACK integration library
+
+** Introduced THANKS file.
+We appreciate all patches from people on the net, even those which are
+too small to warrant adding the author to the AUTHORS file. The
+THANKS file should include everyone who sent in patches. They should
+also be mentioned in the ChangeLog entry.
+
+* What was new in gsl-0.4.1:
+
+** Two changes not making their way into the documentation
+A couple of things are not getting into the docs, so here are the
+errata:
+*** The FFT routines now take a stride parameter. Passing 1 for the
+stride will make them behave as documented.
+*** The complex numbers are now an opaque type, and no assumptions can
+be made about the format in which they are stored (they are not stored
+as a simple structure anymore, since that is not portable). The type
+is now gsl_complex (or gsl_complex_long_double or gsl_complex_float),
+and the macros to access them are
+ GSL_REAL(z)
+ GSL_IMAG(z)
+ GSL_COMPLEX_P_REAL(zp)
+ GSL_COMPLEX_P_IMAG(zp)
+ GSL_COMPLEX_EQ(z1,z2)
+ GSL_SET_COMPLEX(zp,x,y)
+ GSL_SET_REAL(zp,x)
+ GSL_SET_IMAG(zp,y)
+
+This change in the complex number API makes it important that you
+start working with 0.4.1 or later.
+
+** 0.4.1 is being released in occasion of the Red Hat 6.0 release.
+The specfunc module is still in an alpha state; if you run "make
+check" in the specfunc directory you will see that some tests still
+fail.
+
+** Most Alpha specific problems have been fixed. In particular the
+random number generators rand48 and ranf now work on the Alpha
+
+** Additional random number distributions:
+ Rayleigh distribution
+ n-dimensional spherical distribution
+ (ie, points at random on an n-dimensional sphere)
+ Gaussian tail distribution
+ (ie, choosing values from a gaussian distribution subject to a
+ constraint that they be larger than some fixed value, eg 5 sigmas)
+ Walker's algorithm for arbitrary discrete distributions
+
+* What was new in gsl-0.4:
+
+** A single libgsl.a file is built in the top level directory and
+installed, instead of separate .a files for each subdirectory.
+
+** The parts of the complex struct gsl_complex, .real and .imag, are
+not supported anymore. The macros GSL_REAL(z) and GSL_IMAG(z) do the
+same job. All complex numbers are considered as packed arrays of
+floating point numbers, for portability since the layout of structs or
+arrays of structs is not guaranteed.
+
+** The interface for matrices and vectors has changed. Vectors now
+support strides, and can be used to access rows and columns of a
+matrix. Many more types are available (float, double, long double,
+int, long, short, char, signed and unsigned, plus complex floats,
+doubles and long doubles) due to improvements in our preprocessor
+template system.
+
+** The random number generators have a completely new thread-safe
+interface and have moved from the random directory to the rng
+directory. Any program using random numbers will have to be
+updated. You can also choose generators and seeds using the
+environment variables GSL_RNG_TYPE and GSL_RNG_SEED.
+
+** Some additional random number distributions have been added in the
+randist directory. The available distributiosn are: bernoulli, beta,
+binomial, cauchy, chisq, erlang, exponential, fdist, flat, gamma,
+gauss, geometric, levy, logistic, lognormal, nbinomial, pareto,
+poisson, sphere, tdist, twosidedexp, weibull.
+
+** The FFT interface has be extended to support strides, but the
+implementation hasn't been finished for all the cases yet, The FFT
+allocation functions now return a pointer to a newly allocated
+wavetable struct, instead of taking the pointer to an existing struct
+as an argument.
+
+ e.g. status = gsl_fft_wavetable_alloc(n, w)
+ is now w = gsl_fft_wavetable_alloc(n) in accordance with usual practice
+
+** The statistics directory now works with all the builtin
+types. It has a new function for computing the lag1-autocorrelation and
+an extra set of numerical accuracy tests from NIST as part of 'make
+check'.
+
+** The simulated annealing routines no longer set the random number
+seed with the time of day. You'll need to reseed the generator
+yourself if you want subsequent runs to use different random numbers.
+
+** Work is in progress on a reimplementation of QUADPACK in the
+`integration' subdirectory, but it is not finished yet.
+
+** Work is in progress on reimplementations of the VEGAS and
+MISER Monte Carlo algorithms in the monte' subdirectory. They work
+just fine, but the code is still evolving.
+
+** Work has started on a portable blas system in the `blas'
+subdirectory.
+
+** You can now set the IEEE arithmetic mode for your programs from the
+environment variable GSL_IEEE_MODE by calling the function
+gsl_ieee_env_setup(). Currently this only works with the Linux kernel,
+HP-UX, SunOS4 and Solaris.
+
+** There are some simple spline interpolation functions in the `interp'
+subdir.
+
+** The NEWS file now uses outline mode, like the Emacs NEWS file
+
+
+* This covers changes made *after* the gsl-0.2 snapshot
+
+** Added several new modules: histogram, integration, matrix, specfunc
+and vectors.
+
+** Changed libgsl_statisctics.a to libgslstatistics.a and
+libgsl_siman.a to libgslsiman.a, since most of the packages don't have
+the underscore. Users will have to remove the old files, unless they
+do a "make uninstall" on the previous release before they install this
+new one.
+
+** Changes to the random number suite
+Incorporated the gauss, poisson and exponential distributions in
+the standard libgslrandom.a
+
+
+Local variables:
+mode: outline
+paragraph-separate: "[ ]*$"
+end:
diff --git a/gsl-1.9/README b/gsl-1.9/README
new file mode 100644
index 0000000..247cca3
--- /dev/null
+++ b/gsl-1.9/README
@@ -0,0 +1,82 @@
+GSL - GNU Scientific Library
+============================
+
+This is GSL, the GNU Scientific Library, a collection of numerical
+routines for scientific computing.
+
+GSL is free software, you can redistribute it and/or modify it under
+the terms of the GNU General Public License.
+
+The GNU General Public License does not permit this software to be
+redistributed in proprietary programs.
+
+This library is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+Availability
+============
+
+The current stable version of GSL is always available from ftp.gnu.org
+in the directory /pub/gnu/gsl.
+
+A list of mirror sites can be found at http://www.gnu.org/order/ftp.html
+
+Installation
+============
+
+GSL follows the standard GNU installation procedure. Please consult
+the INSTALL file in this distribution for more detailed instructions.
+
+For information about specific platforms and compilers see the
+"Compilation Notes" section in the INSTALL file.
+
+More information about GSL
+==========================
+
+The project homepage is http://www.gnu.org/software/gsl/
+
+See the NEWS file for recent changes to the library.
+
+The GSL Manual has been published and can be ordered from most
+bookstores. The publication details are,
+
+ GNU Scientific Library Reference Manual - Revised Second Edition,
+ M. Galassi et al, ISBN 0954161734 (620 pages, paperback).
+
+The money raised from sales of the manual helps support the
+development of GSL.
+
+A Japanese translation of the reference manual is available from the
+GSL website above (thanks to Daisuke TOMINAGA).
+
+Reporting Bugs
+==============
+
+A list of known bugs can be found in the BUGS file.
+Details of compilation problems can be found in the INSTALL file.
+
+If you find a bug which is not listed in these files please report it
+to bug-gsl@gnu.org.
+
+All bug reports should include:
+
+ The version number of GSL, and where you obtained it.
+ The hardware and operating system
+ The compiler used, including version number and compilation options
+ A description of the bug behaviour
+ A short program which reproducibly exercises the bug
+
+It is useful if you can check whether the same problem occurs when the
+library is compiled without optimization. Thank you.
+
+Any errors or omissions in the manual can also be reported to the
+same address.
+
+Contributing to GSL
+===================
+
+If you are interested in participating in GSL development, please see
+the developers' webpage at http://sources.redhat.com/gsl/devel.html
+
+
diff --git a/gsl-1.9/SUPPORT b/gsl-1.9/SUPPORT
new file mode 100644
index 0000000..709f59e
--- /dev/null
+++ b/gsl-1.9/SUPPORT
@@ -0,0 +1,21 @@
+Commercial support for GNU software is available from companies listed
+in the GNU Service Directory at http://www.gnu.org/prep/service.html
+
+The following companies specifically mention the GNU Scientific Library:
+
+----------------------------------------------------------------------
+Network Theory Ltd <sales@network-theory.com>
+15 Royal Park
+Bristol
+United Kingdom
+Tel: +44 117 317 9309
+Fax: +44 117 973 3323
+http://www.network-theory.com/gsl/
+
+We provide software maintenance contracts for commercial users of the
+GNU Scientific Library.
+
+We can also provide general numerical consulting for all types of
+scientific and quantitative applications.
+
+----------------------------------------------------------------------
diff --git a/gsl-1.9/THANKS b/gsl-1.9/THANKS
new file mode 100644
index 0000000..db4f0bc
--- /dev/null
+++ b/gsl-1.9/THANKS
@@ -0,0 +1,404 @@
+* Jim McElwaine for very useful comments and discussions
+ about the dilogarithm and related functions.
+
+* Simone Piccardi <piccardi@fi.infn.it> for extensions to the
+histogram routines, and providing the ntuple code
+
+* Nelson H. F. Beebe <beebe@math.utah.edu> for references and testing
+the software on many different platforms.
+
+* Tim Mooney <mooney@dogbert.cc.ndsu.nodak.edu> for IEEE support for
+Tru64, AIX, IRIX, fixes for odes, and testing
+
+* Thomas Walter <walter@pctc.chemie.uni-erlangen.de> for heapsort
+routines, cholesky decomposition, bug reports and useful suggestions
+
+* Jorma Olavi Tähtinen <jotahtin@cc.hut.fi> for complex arithmetic
+functions
+
+* Barak Pearlmutter <bap@cs.unm.edu>
+
+* Frederick W. Wheeler <wheeler@cipr.rpi.edu>
+
+* Bernd Petrovitsch <bernd@ict.tuwien.ac.at>
+
+* Jacek Pliszka <Jacek.Pliszka@fuw.edu.pl> for bug report
+
+* Michele Clark <clark@cs.unc.edu> for bug report
+
+* Jeffrey Russell Horner <jhorner@cs.utk.edu> for information on CBLAS
+
+* Rahul V. Herwadkar <RHERWADK@us.oracle.com> for testing
+
+* Trond Bo <datb@dnmi.no> for bug report
+
+* Jan Kasprzak <kas@informatics.muni.cz> for bug report
+
+* David Kaelbling <drk@sgi.com> for testing
+
+* Mark Levedahl <mlevedahl@fallschurch.esys.com> for bug report
+
+* David Billinghurst <David.Billinghurst@riotinto.com.au> for testing
+
+* Jean-Bernard ADDOR <jbaddor@sca.uqam.ca> for bug report
+
+* Fabrice Rossi <rossi@ufrmd.dauphine.fr> bug reports and suggestions
+
+* Paul Walmsley <pwalmsley@iee.org> for bug report and patch for
+ fixing matmult.
+
+* Dave Morrison <dave@bnl.gov> for advice on build procedure and
+ various patches, the diff/ numerical differentiation routines,
+ multmin documentation, and Landau distribution
+
+* Brett Viren <bviren@superk.physics.sunysb.edu> for debugging qpsrt.c.
+
+* Christopher Gabriel <cgabriel@firenze.linux.it> contributed the
+ gsl-config and gsl.m4 we use.
+
+* C M Murphy <C.M.Murphy@bath.ac.uk> patch to fix up consts in header files
+
+* Bracy H. Elton for correcting a reference in the FFT Algorithms document
+
+* Tadhg O'Meara <tadhg@net-cs.ucd.ie> for finding a bug in gsl-randist
+
+* Steve Robbins <stever@bic.mni.mcgill.ca> patch to work around FP_RND
+ problems on Tru64, testing and other patches., bug fix for nm_simplex
+ algorithm.
+
+* John Fisher <johnfish@uclink4.berkeley.edu> testing on powerpc linux
+ and support for fp-ppclinux.c
+
+* OKUJI Yoshinori <okuji@gnu.org> for a patch for fp-x86linux.c for libc5
+
+* Pablo Bianucci <pbian@pccp.com.ar> for patches to complex matrix/vectors
+
+* Toby White <tow@theor.ch.cam.ac.uk> for several patches and
+improvements to the design, OpenBSD support
+
+* Bill Brower <wbrower@ll.mit.edu> for bug report on gsl.m4
+
+* Vladimir Kushnir <vkushnir@Alfacom.net> for ieee support for FreeBSD
+
+* F J Franklin <MEP95JFF@sheffield.ac.uk> for test reports and debugging
+
+* Keith Briggs <briggsk@info.bt.co.uk> for bug reports and code for
+the skewed Levy alpha-stable variates gsl_ran_levy_skew
+
+* Vince <vattervi@msu.edu> for permutation iterator functions
+
+* Henry Sobotka <sobotka@axess.com> for ieee support for OS/2 and bug fixes
+
+* Remy Bruno <remy.bruno@libertysurf.fr> for bug fix
+
+* M. Lavasani <lavasani@connect.org.uk> for bug reports and testing on HPUX11
+
+* Jason Beegan <jasontd@indigo.ie> for NetBSD support
+
+* Zeger Knops <zeger@cs.uu.nl> for bug fix
+
+* Rodney Sparapani <rsparapa@mcw.edu> for Darwin support
+
+* Ramin Nakisa <raminnakisa@yahoo.com> for bug reports
+
+* Achim Gaedke <achim@zpr.uni-koeln.de> for bug reports and
+suggestions, additional histogram code, PyGSL python interface, 2d
+histogram statistics, bug fixes for simulated annealing
+
+* Eric Rose <erose@memot.unibe.ch> for bug report and useful tip on casting
+
+* M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> for bug reports
+
+* Albert Chin <china@thewrittenword.com> for bug reports, patches, and
+providing HP-UX platforms for testing
+
+* Asterio Gonzalez <agonzalez@udiberica.com> for a bug report for multmin
+
+* Carlo Perassi <carlo@linux.it> for implementing the random number
+generators in Knuth's Seminumerical Algorithms, 3rd Ed.
+
+* Dan, Ho-Jin <hjdan@sys713.kaist.ac.kr> for divided differences interpolation
+routines
+
+* Stefan Koch <s.koch@seh-zuelpich.de> for useful bug reports and
+fixes for the special functions
+
+* Szymon Jaroszewicz <sj@cs.umb.edu> for the combinations modules
+
+* Theis Peter Hansen <tph@com.dtu.dk> fixed unchecked status values in
+multiroots
+
+* Jungemann Markus <Markus.Jungemann@de.bosch.com> documentation fixes
+
+* Hans E. Plesser (hans dot plesser at itf dot nlh dot no) more
+reliable implementation of gamma_inc, multifit bug fixes
+
+* Arin Chaudhuri <achaudh@unity.ncsu.edu> documentation bug reports
+
+* Karsten Howes <karsten@videotron.ca> siman bug fix
+
+* Vladimir Savichev <vlad@ariel.phys.wesleyan.edu> bug reports
+
+* Jochen Küpper <jochen@jochen-kuepper.de> doc bug fixes, additional
+constants
+
+* John Ketchum <johnk@qualcomm.com> for bug reports for the blas library
+
+* Nicolas Darnis <ndarnis@cvf.fr> additional permutation functions
+
+* Jeff Spirko <spirko@lehigh.edu> patch for 1d minimization
+
+* David Necas (Yeti) <yeti@physics.muni.cz> bug reports and patches
+for linear algebra, interpolation, additional tridiagonal solvers
+
+* <zunda@24i.net> for bug report
+
+* Christian T. Steigies <cts@debian.org> for documentation bug report
+
+* Atakan Gurkan <ato@northwestern.edu> for bug reports and patches for the
+random number generators.
+
+* David Ronis <ronis@ronispc.chem.mcgill.ca> for bug reports and
+patches
+
+* Christian T. Steigies <cts@debian.org> for a documentation fix
+
+* Teun Burgers <a.rburgers@freeler.nl> improvements to configure script
+
+* Olivier Andrieu <andrieu@ijm.jussieu.fr> bug report for Chebyschev
+memory leak
+
+* Hiroshi Imamura <hima@cmt.is.tohoku.ac.jp> extension to psi(1+iy)
+
+* Taliver Heath <taliver@paul.rutgers.edu> keep track of best solution
+in siman_solve.
+
+* Trevor Blackwell <tlb@trevorblackwell.com> bug report test case for
+SVD d_n = 0, bug fix to mt19937 generator
+
+* Nicolas Bock <nbock@buffalo.edu> documentation bug report
+
+* Alan Aspuru-Guzik <aspuru@okra.cchem.Berkeley.edu> documentation bug report
+
+* Peter S. Christopher <peterc@midway.uchicago.edu> bug fix for
+simulated annealing
+
+* Gene Carter <ecarter@mindspring.com> build shared libraries on MacOS X
+
+* Fabian Jakobs <fabian.jakobs@web.de> fixed a bug in
+gsl_linalg_bidiag_unpack_B, and documentation bug-fix for blas
+
+* Gavin Crooks <gec@threeplusone.com> documentation bug fix,
+dirichlet distribution, multinomial distribution
+
+* Gert Van den Eynde <gvdeynde@sckcen.be> gsl_ldexp, gsl_frexp, gsl_fcmp
+
+* Reinhold Bader <Reinhold.Bader@lrz-muenchen.de>, fixes for Hitachi SR8000
+
+* Slaven Peles <peles@cns.physics.gatech.edu>, build options for
+Compaq cc, doc bug fix
+
+* David Favis-Mortlock <d.favis-mortlock@dial.pipex.com> bug report for
+gsl_rng_taus2 seeding
+
+* Alexander Babansky <babansky@mail.ru> documentation bug report for Ei(x)
+
+* Tiago de Paula Peixoto <count0@fissionauthority.com> bug report for multifit
+memory allocation
+
+* Adam Johansen <amj26@hermes.cam.ac.uk> bug report for eigenvalue routines
+
+* Wolfgang Hoermann <hormannw@boun.edu.tr> bug report for niederreiter qrng
+
+* Jerome Houdayer <houdayer@spht.saclay.cea.fr> bug report for taus seeding
+
+* Conrad Curry <cwcurry@orca.st.usm.edu> bug and documentation reports
+
+* Erik Schnetter <schnetter@uni-tuebingen.de> documentation bug reports
+
+* Maarten De Munck <indigo@kotnet.org> bug fix for vector/matrix get
+
+* Axel Hutt <hutt@wias-berlin.de> bug fix for QAWC integration,
+documentation bug fix
+
+* Martin Jansche <jansche@ling.ohio-state.edu> various bug reports
+
+* Gregory Soyez <g.soyez@ulg.ac.be> documentation bug report
+
+* Attilio Rivoldini <rivoldini@oma.be> bug report for CBLAS tests
+
+* W.M. Vissers <vissers@theochem.kun.nl> bug report for
+gsl_complex_arccsc_real
+
+* Paolo Redaelli <paolo.redaelli@libero.it> bug report for chebyshev
+functions
+
+* Andrew Howard <ahoward@pollux.usc.edu> bug report for gsl_ran_discrete
+
+* Heiko Bauke <Heiko.Bauke@Physik.Uni-Magdeburg.DE> bug reports and patches
+for random number generators
+
+* Vincent Sacksteder <vincent@sacksteder.com> bug reports for MSVC7
+
+* Peter Verveer <verveer@embl-heidelberg.de> improvement to memory
+usage of MINPACK routines
+
+* Mario Pernici <Mario.Pernici@mi.infn.it> bug fix for
+gsl_combination_valid and new function gsl_permutation_memcpy,
+doc fix for bessel functions, bug fix for gsl_sf_psi_1_int,
+bug report for gsl_permutation_canonical_to_linear, linalg
+QRPT bug reports and fixes, and many other corrections.
+
+* Fabio Brugnara <brugnara@itc.it> provided a much-needed bug
+fix for the conjugate gradient algorithm multidimensional
+minimisers.
+
+* Krzysztof Pachucki <krp@fuw.edu.pl> bug report for gsl_sf_hypergU_int
+
+* Carsten Svaneborg <svanebor@mpip-mainz.mpg.de> documentation bug report
+
+* Liguo Song <liguo.song@vanderbilt.edu> documentation bug report
+
+* Carlo Ferrigno <ferrigno@pa.iasf.cnr.it> bug report for CGS units
+
+* Giulio Bottazzi <bottazzi@sssup.it> many useful bug reports
+
+* Olaf Lenz <olenz@Physik.Uni-Bielefeld.DE> rng frwite/fread, bug reports
+
+* Jamie Lokier <jamie@shareable.org> for testing
+
+* Grant Lythe <grant@maths.leeds.ac.uk> documentation bug report
+
+* Jussi Piitulainen <jpiitula@ling.helsinki.fi> documentation bug report
+
+* Aaron Schweiger <aschweig@bu.edu> bug report for SVD/column balancing
+
+* Carlo Ferrigno <ferrigno@pa.iasf.cnr.it> bug report about const problems
+
+* Jussi Piitulainen <jpiitula@ling.helsinki.fi> documenation bug report for
+gsl_ran_hypergeometric_pdf
+
+* Bas Zoetekouw <bas@debian.org> documentation bug report
+
+* Paul Sydney <sydney@maui.net> bug report and patch for min/brent.c
+
+* Alexei Podtelezhnikov <apodtele@mccammon.ucsd.edu> patch for sphere.c
+
+* Neil Bushong <bushong@mh-4426b.ucsd.edu> documentation typo bug report
+
+* Brad Bell <brad@apl.washington.edu> documentation bug report
+
+* Andreas Schneider <1@c07.de> bug report for R250
+
+* Luigi Ballabio <luigi.ballabio@fastwebnet.it> fix m4 quoting in gsl.m4
+
+* Zbigniew Koza <zkoza@ift.uni.wroc.pl> documentation bug fix for odes
+
+* James Scott <j.scott@runbox.com> fix for linalg tests on MSVC
+
+* Rémi Butel <r.butel@epoc.u-bordeaux1.fr> fixes for multimin overflow
+conditions
+
+* Andris Pavenis <pavenis@latnet.lv> Makefile fix for EXEEXT
+
+* Daniel Webb <lists@danielwebb.us> bug report for potential cspline
+division by zero
+
+* Ewald Stamp <stamp@math.hu-berlin.de> bugfix for vector/swap_source.c
+
+* Joerg Wensch <wensch@informatik.uni-halle.de> LQ decompositions
+
+* Jason Stover <jstover@sdf.lonestar.org> patch for cdf/beta.c,
+inverse cumulative distributions, discrete cumulative distributions
+
+* Ralph Menikoff <rtm@lanl.gov> bug report for gsl_sf_expint_scaled
+
+* Yoshiki <ytsunesada@yahoo.co.jp> documentation bug report
+
+* Nigel Lowry <nigel-lowry@ultra.eclipse.co.uk> documentation proofreading
+
+* Giulio Bottazzi <bottazzi@sssup.it> cdf for exponential power
+distribution, bug reports
+
+* Tuomo Keskitalo <Tuomo.Keskitalo@HUT.Fi> many improvements to ode-initval
+
+* Britton Kerin <bkerin@asf.alaska.edu> documentation bug reports
+
+* Patricio Rojo <pato@astro.cornell.edu> patch for numerical
+instability in interpolation integrate function
+
+* Damir Herman <herman@ncbi.nlm.nih.gov> improved accuracy of
+histogram range calculations
+
+* John Salmon <jsalmon@thesalmons.org> bug report for gsl_cheb_eval_n_err
+
+* Dirk Eddelbuettel <edd@debian.org> for bug reports and testing, and
+maintaining the Debian package for GSL.
+
+* Jari Häkkinen <jari@chiralcomp.com> for svd bug reports, rng bug reports
+
+* Marco Canini <marco.canini@fastwebnet.it> patch for IXP2400 Xscale
+
+* Ben Klemens <klemens@hss.caltech.edu> bug report for sorting vectors
+with NANs
+
+* Peter Brommer <pbro@itap.physik.uni-stuttgart.de> bug report and patch
+for Brent minimisation algorithm.
+
+* Gabriel Withington <gabriel.withington@umassmed.edu> typo in docs
+
+* Stewart V. Wright <swright+gsl@physics.adelaide.edu.au> patch for missing
+spline functions
+
+* Richard Mathar <mathar@strw.leidenuniv.nl> additional Debye functions n=5,6
+
+* Stefan Jahn <stefan@gruft.de> bug fix for periodic cubic splines with n=3
+
+* Yoram Burak <yorambu@kitp.ucsb.edu> bug report for scaled bessel function In_scaled
+
+* Mario Santos <mgrsantos@ist.utl.pt> bug report for spherical bessel function
+
+* Vincent Plagnol <vincent.plagnol@normalesup.org> bug report for gsl_randist_binomial_pdf
+
+* John Houck <houck@space.mit.edu> bug report for gsl_sf_synchrotron_1
+
+* Jochen Voss <voss@seehuhn.de> ziggurat gaussian generator
+
+* John D Lamb <J.D.Lamb@btinternet.com> Marsaglia-Tsang gamma generator
+
+* Giulio Bottazzi <giulio.bottazzi@libero.it> improved exponential
+power distribution and gsl_multifit_linear_est
+
+* Charles Karney <ckarney@sarnoff.com> added Leva bounds to gaussian ratio method generator
+
+* Torquil Sorenson <torquil@gmail.com> documentation bug fixes for FFTs
+
+* Yajun Wang <yalding@cs.ust.hk> - bug report for multifit n<p
+
+* Erik Schnetter <schnetter@cct.lsu.edu> - patch for Macos X on Intel
+
+* Lowell Johnson <ldj00@sio.midco.net> - implementation of mathieu functions
+
+* Brian Gladman <brg@gladman.plus.com> - useful bug reports
+
+* B. Lazarov <bsl@mek.dtu.dk> - compilation bug report for randist
+
+* Harald Moseby <harald.moseby@fnh.no> - special functions bug reports
+
+* Neil Harvey <neilharvey@gmail.com> - bug report for beta pdf
+
+* Felipe G. Nievinski <f.nievinski@unb.ca> - documentation bug report
+
+* Daisuke TOMINAGA <tominaga@cbrc.jp> - Japanese translation of manual
+
+* Andoline Bucciolini <andoline_bucciolini@women-at-work.org> - documentation bug for BLAS
+
+* Daniel Falster <dfalster@bio.mq.edu.au> bug report for fdist_Pinv
+
+* Giancarlo Marra <giancarlo.marra@bancaditalia.it> bug report for M_PI_4
+
+* Alan Irwin <irwin@beluga.phys.uvic.ca> for sample implementation of
+improved BFGS algorithm.
+
+* Lionel Barnett <lionelb.nospam@googlemail.com> for pointing out an
+error in the elliptic integrals
diff --git a/gsl-1.9/TODO b/gsl-1.9/TODO
new file mode 100644
index 0000000..34a1fdb
--- /dev/null
+++ b/gsl-1.9/TODO
@@ -0,0 +1,161 @@
+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
diff --git a/gsl-1.9/acconfig.h b/gsl-1.9/acconfig.h
new file mode 100644
index 0000000..1f48977
--- /dev/null
+++ b/gsl-1.9/acconfig.h
@@ -0,0 +1,132 @@
+@BOTTOM@
+
+/* Defined if this is an official release */
+#undef RELEASED
+
+/* Define if you have inline */
+#undef HAVE_INLINE
+
+/* Define if you need to hide the static definitions of inline functions */
+#undef HIDE_INLINE_STATIC
+
+/* Defined if you have ansi EXIT_SUCCESS and EXIT_FAILURE in stdlib.h */
+#undef HAVE_EXIT_SUCCESS_AND_FAILURE
+
+/* Use 0 and 1 for EXIT_SUCCESS and EXIT_FAILURE if we don't have them */
+#if !HAVE_EXIT_SUCCESS_AND_FAILURE
+#define EXIT_SUCCESS 0
+#define EXIT_FAILURE 1
+#endif
+
+/* Define this if printf can handle %Lf for long double */
+#undef HAVE_PRINTF_LONGDOUBLE
+
+/* Define one of these if you have a known IEEE arithmetic interface */
+#undef HAVE_GNUSPARC_IEEE_INTERFACE
+#undef HAVE_GNUM68K_IEEE_INTERFACE
+#undef HAVE_GNUPPC_IEEE_INTERFACE
+#undef HAVE_GNUX86_IEEE_INTERFACE
+#undef HAVE_SUNOS4_IEEE_INTERFACE
+#undef HAVE_SOLARIS_IEEE_INTERFACE
+#undef HAVE_HPUX11_IEEE_INTERFACE
+#undef HAVE_HPUX_IEEE_INTERFACE
+#undef HAVE_TRU64_IEEE_INTERFACE
+#undef HAVE_IRIX_IEEE_INTERFACE
+#undef HAVE_AIX_IEEE_INTERFACE
+#undef HAVE_FREEBSD_IEEE_INTERFACE
+#undef HAVE_OS2EMX_IEEE_INTERFACE
+#undef HAVE_NETBSD_IEEE_INTERFACE
+#undef HAVE_OPENBSD_IEEE_INTERFACE
+#undef HAVE_DARWIN_IEEE_INTERFACE
+#undef HAVE_DARWIN86_IEEE_INTERFACE
+
+/* Define this if IEEE comparisons work correctly (e.g. NaN != NaN) */
+#undef HAVE_IEEE_COMPARISONS
+
+/* Define this if IEEE denormalized numbers are available */
+#undef HAVE_IEEE_DENORMALS
+
+/* Define a rounding function which moves extended precision values
+ out of registers and rounds them to double-precision. This should
+ be used *sparingly*, in places where it is necessary to keep
+ double-precision rounding for critical expressions while running in
+ extended precision. For example, the following code should ensure
+ exact equality, even when extended precision registers are in use,
+
+ double q = GSL_COERCE_DBL(3.0/7.0) ;
+ if (q == GSL_COERCE_DBL(3.0/7.0)) { ... } ;
+
+ It carries a penalty even when the program is running in double
+ precision mode unless you compile a separate version of the
+ library with HAVE_EXTENDED_PRECISION_REGISTERS turned off. */
+
+#undef HAVE_EXTENDED_PRECISION_REGISTERS
+
+#if HAVE_EXTENDED_PRECISION_REGISTERS
+#define GSL_COERCE_DBL(x) (gsl_coerce_double(x))
+#else
+#define GSL_COERCE_DBL(x) (x)
+#endif
+
+/* Substitute gsl functions for missing system functions */
+
+#if !HAVE_DECL_HYPOT
+#define hypot gsl_hypot
+#endif
+
+#if !HAVE_DECL_LOG1P
+#define log1p gsl_log1p
+#endif
+
+#if !HAVE_DECL_EXPM1
+#define expm1 gsl_expm1
+#endif
+
+#if !HAVE_DECL_ACOSH
+#define acosh gsl_acosh
+#endif
+
+#if !HAVE_DECL_ASINH
+#define asinh gsl_asinh
+#endif
+
+#if !HAVE_DECL_ATANH
+#define atanh gsl_atanh
+#endif
+
+#if !HAVE_DECL_LDEXP
+#define ldexp gsl_ldexp
+#endif
+
+#if !HAVE_DECL_FREXP
+#define frexp gsl_frexp
+#endif
+
+#if !HAVE_DECL_ISINF
+#define isinf gsl_isinf
+#endif
+
+#if !HAVE_DECL_FINITE
+#if HAVE_DECL_ISFINITE
+#define finite isfinite
+#else
+#define finite gsl_finite
+#endif
+#endif
+
+#if !HAVE_DECL_ISNAN
+#define isnan gsl_isnan
+#endif
+
+#ifdef __GNUC__
+#define DISCARD_POINTER(p) do { ; } while(p ? 0 : 0);
+#else
+#define DISCARD_POINTER(p) /* ignoring discarded pointer */
+#endif
+
+#if defined(GSL_RANGE_CHECK_OFF) || !defined(GSL_RANGE_CHECK)
+#define GSL_RANGE_CHECK 0 /* turn off range checking by default internally */
+#endif
+
+/* Disable deprecated functions and enums while building */
+#define GSL_DISABLE_DEPRECATED 1
diff --git a/gsl-1.9/aclocal.m4 b/gsl-1.9/aclocal.m4
new file mode 100644
index 0000000..5ca23d8
--- /dev/null
+++ b/gsl-1.9/aclocal.m4
@@ -0,0 +1,6980 @@
+# generated automatically by aclocal 1.9.6 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005 Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION so it can be traced.
+# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+ [AM_AUTOMAKE_VERSION([1.9.6])])
+
+# AM_AUX_DIR_EXPAND -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory. The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run. This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+# fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+# fails if $ac_aux_dir is absolute,
+# fails when called from a subdirectory in a VPATH build with
+# a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir. In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir. That would be:
+# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+# MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH. The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 7
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
+ [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])
+AC_SUBST([$1_FALSE])
+if $2; then
+ $1_TRUE=
+ $1_FALSE='#'
+else
+ $1_TRUE='#'
+ $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+ AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Do all the work for Automake. -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 12
+
+# This macro actually does too much. Some checks are only needed if
+# your package does certain things. But this isn't really a big deal.
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out. PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition. After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.58])dnl
+dnl Autoconf wants to disallow AM_ names. We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+ test -f $srcdir/config.status; then
+ AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AM_PROG_INSTALL_SH
+AM_PROG_INSTALL_STRIP
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target. The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+ [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+ [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+ [_AM_DEPENDENCIES(CC)],
+ [define([AC_PROG_CC],
+ defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+ [_AM_DEPENDENCIES(CXX)],
+ [define([AC_PROG_CXX],
+ defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+])
+])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated. The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $1 | $1:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+AC_SUBST(install_sh)])
+
+# Copyright (C) 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot. For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Add --enable-maintainer-mode option to configure. -*- Autoconf -*-
+# From Jim Meyering
+
+# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+AC_DEFUN([AM_MAINTAINER_MODE],
+[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
+ dnl maintainer-mode is disabled by default
+ AC_ARG_ENABLE(maintainer-mode,
+[ --enable-maintainer-mode enable make rules and dependencies not useful
+ (and sometimes confusing) to the casual installer],
+ USE_MAINTAINER_MODE=$enableval,
+ USE_MAINTAINER_MODE=no)
+ AC_MSG_RESULT([$USE_MAINTAINER_MODE])
+ AM_CONDITIONAL(MAINTAINER_MODE, [test $USE_MAINTAINER_MODE = yes])
+ MAINT=$MAINTAINER_MODE_TRUE
+ AC_SUBST(MAINT)dnl
+]
+)
+
+AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])
+
+# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+ am_missing_run="$MISSING --run "
+else
+ am_missing_run=
+ AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise.
+#
+# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories
+# created by `make install' are always world readable, even if the
+# installer happens to have an overly restrictive umask (e.g. 077).
+# This was a mistake. There are at least two reasons why we must not
+# use `-m 0755':
+# - it causes special bits like SGID to be ignored,
+# - it may be too restrictive (some setups expect 775 directories).
+#
+# Do not use -m 0755 and let people choose whatever they expect by
+# setting umask.
+#
+# We cannot accept any implementation of `mkdir' that recognizes `-p'.
+# Some implementations (such as Solaris 8's) are not thread-safe: if a
+# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c'
+# concurrently, both version can detect that a/ is missing, but only
+# one can create it and the other will error out. Consequently we
+# restrict ourselves to GNU make (using the --version option ensures
+# this.)
+AC_DEFUN([AM_PROG_MKDIR_P],
+[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+ # We used to keeping the `.' as first argument, in order to
+ # allow $(mkdir_p) to be used without argument. As in
+ # $(mkdir_p) $(somedir)
+ # where $(somedir) is conditionally defined. However this is wrong
+ # for two reasons:
+ # 1. if the package is installed by a user who cannot write `.'
+ # make install will fail,
+ # 2. the above comment should most certainly read
+ # $(mkdir_p) $(DESTDIR)$(somedir)
+ # so it does not work when $(somedir) is undefined and
+ # $(DESTDIR) is not.
+ # To support the latter case, we have to write
+ # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+ # so the `.' trick is pointless.
+ mkdir_p='mkdir -p --'
+else
+ # On NextStep and OpenStep, the `mkdir' command does not
+ # recognize any option. It will interpret all options as
+ # directories to create, and then abort because `.' already
+ # exists.
+ for d in ./-p ./--version;
+ do
+ test -d $d && rmdir $d
+ done
+ # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+ if test -f "$ac_aux_dir/mkinstalldirs"; then
+ mkdir_p='$(mkinstalldirs)'
+ else
+ mkdir_p='$(install_sh) -d'
+ fi
+fi
+AC_SUBST([mkdir_p])])
+
+# Helper functions for option handling. -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# ------------------------------
+# Set option NAME. Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ----------------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Check to make sure that the build environment is sane. -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+ if test "$[*]" = "X"; then
+ # -L didn't work.
+ set X `ls -t $srcdir/configure conftest.file`
+ fi
+ rm -f conftest.file
+ if test "$[*]" != "X $srcdir/configure conftest.file" \
+ && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
+alias in your environment])
+ fi
+
+ test "$[2]" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries. This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'. However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+ AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Check how to create a tarball. -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+# tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+# $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+ [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+ [m4_case([$1], [ustar],, [pax],,
+ [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+ case $_am_tool in
+ gnutar)
+ for _am_tar in tar gnutar gtar;
+ do
+ AM_RUN_LOG([$_am_tar --version]) && break
+ done
+ am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+ am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+ am__untar="$_am_tar -xf -"
+ ;;
+ plaintar)
+ # Must skip GNU tar: if it does not support --format= it doesn't create
+ # ustar tarball either.
+ (tar --version) >/dev/null 2>&1 && continue
+ am__tar='tar chf - "$$tardir"'
+ am__tar_='tar chf - "$tardir"'
+ am__untar='tar xf -'
+ ;;
+ pax)
+ am__tar='pax -L -x $1 -w "$$tardir"'
+ am__tar_='pax -L -x $1 -w "$tardir"'
+ am__untar='pax -r'
+ ;;
+ cpio)
+ am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+ am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+ am__untar='cpio -i -H $1 -d'
+ ;;
+ none)
+ am__tar=false
+ am__tar_=false
+ am__untar=false
+ ;;
+ esac
+
+ # If the value was cached, stop now. We just wanted to have am__tar
+ # and am__untar set.
+ test -n "${am_cv_prog_tar_$1}" && break
+
+ # tar/untar a dummy directory, and stop if the command works
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ echo GrepMe > conftest.dir/file
+ AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+ rm -rf conftest.dir
+ if test -s conftest.tar; then
+ AM_RUN_LOG([$am__untar <conftest.tar])
+ grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+ fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
+# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
+
+# serial 48 AC_PROG_LIBTOOL
+
+
+# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED)
+# -----------------------------------------------------------
+# If this macro is not defined by Autoconf, define it here.
+m4_ifdef([AC_PROVIDE_IFELSE],
+ [],
+ [m4_define([AC_PROVIDE_IFELSE],
+ [m4_ifdef([AC_PROVIDE_$1],
+ [$2], [$3])])])
+
+
+# AC_PROG_LIBTOOL
+# ---------------
+AC_DEFUN([AC_PROG_LIBTOOL],
+[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl
+dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX
+dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX.
+ AC_PROVIDE_IFELSE([AC_PROG_CXX],
+ [AC_LIBTOOL_CXX],
+ [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX
+ ])])
+dnl And a similar setup for Fortran 77 support
+ AC_PROVIDE_IFELSE([AC_PROG_F77],
+ [AC_LIBTOOL_F77],
+ [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77
+])])
+
+dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly.
+dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run
+dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both.
+ AC_PROVIDE_IFELSE([AC_PROG_GCJ],
+ [AC_LIBTOOL_GCJ],
+ [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
+ [AC_LIBTOOL_GCJ],
+ [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],
+ [AC_LIBTOOL_GCJ],
+ [ifdef([AC_PROG_GCJ],
+ [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])
+ ifdef([A][M_PROG_GCJ],
+ [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])])
+ ifdef([LT_AC_PROG_GCJ],
+ [define([LT_AC_PROG_GCJ],
+ defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])])
+])])# AC_PROG_LIBTOOL
+
+
+# _AC_PROG_LIBTOOL
+# ----------------
+AC_DEFUN([_AC_PROG_LIBTOOL],
+[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl
+AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl
+AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl
+AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+# Prevent multiple expansion
+define([AC_PROG_LIBTOOL], [])
+])# _AC_PROG_LIBTOOL
+
+
+# AC_LIBTOOL_SETUP
+# ----------------
+AC_DEFUN([AC_LIBTOOL_SETUP],
+[AC_PREREQ(2.50)dnl
+AC_REQUIRE([AC_ENABLE_SHARED])dnl
+AC_REQUIRE([AC_ENABLE_STATIC])dnl
+AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_PROG_LD])dnl
+AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl
+AC_REQUIRE([AC_PROG_NM])dnl
+
+AC_REQUIRE([AC_PROG_LN_S])dnl
+AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl
+# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers!
+AC_REQUIRE([AC_OBJEXT])dnl
+AC_REQUIRE([AC_EXEEXT])dnl
+dnl
+
+AC_LIBTOOL_SYS_MAX_CMD_LEN
+AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
+AC_LIBTOOL_OBJDIR
+
+AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
+_LT_AC_PROG_ECHO_BACKSLASH
+
+case $host_os in
+aix3*)
+ # AIX sometimes has problems with the GCC collect2 program. For some
+ # reason, if we set the COLLECT_NAMES environment variable, the problems
+ # vanish in a puff of smoke.
+ if test "X${COLLECT_NAMES+set}" != Xset; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+ fi
+ ;;
+esac
+
+# Sed substitution that helps us do robust quoting. It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='sed -e 1s/^X//'
+[sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g']
+
+# Same as above, but do not quote variable references.
+[double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g']
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+# Constants:
+rm="rm -f"
+
+# Global variables:
+default_ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+ltmain="$ac_aux_dir/ltmain.sh"
+ofile="$default_ofile"
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+AC_CHECK_TOOL(AR, ar, false)
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+AC_CHECK_TOOL(STRIP, strip, :)
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$AR" && AR=ar
+test -z "$AR_FLAGS" && AR_FLAGS=cru
+test -z "$AS" && AS=as
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+test -z "$LD" && LD=ld
+test -z "$LN_S" && LN_S="ln -s"
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+test -z "$NM" && NM=nm
+test -z "$SED" && SED=sed
+test -z "$OBJDUMP" && OBJDUMP=objdump
+test -z "$RANLIB" && RANLIB=:
+test -z "$STRIP" && STRIP=:
+test -z "$ac_objext" && ac_objext=o
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+ case $host_os in
+ openbsd*)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
+ ;;
+ *)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
+ ;;
+ esac
+ old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+fi
+
+_LT_CC_BASENAME([$compiler])
+
+# Only perform the check for file, if the check method requires it
+case $deplibs_check_method in
+file_magic*)
+ if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+ AC_PATH_MAGIC
+ fi
+ ;;
+esac
+
+AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no)
+AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL],
+enable_win32_dll=yes, enable_win32_dll=no)
+
+AC_ARG_ENABLE([libtool-lock],
+ [AC_HELP_STRING([--disable-libtool-lock],
+ [avoid locking (might break parallel builds)])])
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+AC_ARG_WITH([pic],
+ [AC_HELP_STRING([--with-pic],
+ [try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
+ [pic_mode="$withval"],
+ [pic_mode=default])
+test -z "$pic_mode" && pic_mode=default
+
+# Use C for the default configuration in the libtool script
+tagname=
+AC_LIBTOOL_LANG_C_CONFIG
+_LT_AC_TAGCONFIG
+])# AC_LIBTOOL_SETUP
+
+
+# _LT_AC_SYS_COMPILER
+# -------------------
+AC_DEFUN([_LT_AC_SYS_COMPILER],
+[AC_REQUIRE([AC_PROG_CC])dnl
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+])# _LT_AC_SYS_COMPILER
+
+
+# _LT_CC_BASENAME(CC)
+# -------------------
+# Calculate cc_basename. Skip known compiler wrappers and cross-prefix.
+AC_DEFUN([_LT_CC_BASENAME],
+[for cc_temp in $1""; do
+ case $cc_temp in
+ compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
+ distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+])
+
+
+# _LT_COMPILER_BOILERPLATE
+# ------------------------
+# Check for compiler boilerplate output or warnings with
+# the simple compiler test code.
+AC_DEFUN([_LT_COMPILER_BOILERPLATE],
+[ac_outfile=conftest.$ac_objext
+printf "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$rm conftest*
+])# _LT_COMPILER_BOILERPLATE
+
+
+# _LT_LINKER_BOILERPLATE
+# ----------------------
+# Check for linker boilerplate output or warnings with
+# the simple link test code.
+AC_DEFUN([_LT_LINKER_BOILERPLATE],
+[ac_outfile=conftest.$ac_objext
+printf "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$rm conftest*
+])# _LT_LINKER_BOILERPLATE
+
+
+# _LT_AC_SYS_LIBPATH_AIX
+# ----------------------
+# Links a minimal program and checks the executable
+# for the system default hardcoded library path. In most cases,
+# this is /usr/lib:/lib, but when the MPI compilers are used
+# the location of the communication and MPI libs are included too.
+# If we don't find anything, use the default library path according
+# to the aix ld manual.
+AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX],
+[AC_LINK_IFELSE(AC_LANG_PROGRAM,[
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`; fi],[])
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+])# _LT_AC_SYS_LIBPATH_AIX
+
+
+# _LT_AC_SHELL_INIT(ARG)
+# ----------------------
+AC_DEFUN([_LT_AC_SHELL_INIT],
+[ifdef([AC_DIVERSION_NOTICE],
+ [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)],
+ [AC_DIVERT_PUSH(NOTICE)])
+$1
+AC_DIVERT_POP
+])# _LT_AC_SHELL_INIT
+
+
+# _LT_AC_PROG_ECHO_BACKSLASH
+# --------------------------
+# Add some code to the start of the generated configure script which
+# will find an echo command which doesn't interpret backslashes.
+AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH],
+[_LT_AC_SHELL_INIT([
+# Check that we are running under the correct shell.
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+case X$ECHO in
+X*--fallback-echo)
+ # Remove one level of quotation (which was required for Make).
+ ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','`
+ ;;
+esac
+
+echo=${ECHO-echo}
+if test "X[$]1" = X--no-reexec; then
+ # Discard the --no-reexec flag, and continue.
+ shift
+elif test "X[$]1" = X--fallback-echo; then
+ # Avoid inline document here, it may be left over
+ :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then
+ # Yippee, $echo works!
+ :
+else
+ # Restart under the correct shell.
+ exec $SHELL "[$]0" --no-reexec ${1+"[$]@"}
+fi
+
+if test "X[$]1" = X--fallback-echo; then
+ # used as fallback echo
+ shift
+ cat <<EOF
+[$]*
+EOF
+ exit 0
+fi
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+if test -z "$ECHO"; then
+if test "X${echo_test_string+set}" != Xset; then
+# find a string as large as possible, as long as the shell can cope with it
+ for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do
+ # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
+ if (echo_test_string=`eval $cmd`) 2>/dev/null &&
+ echo_test_string=`eval $cmd` &&
+ (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null
+ then
+ break
+ fi
+ done
+fi
+
+if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ :
+else
+ # The Solaris, AIX, and Digital Unix default echo programs unquote
+ # backslashes. This makes it impossible to quote backslashes using
+ # echo "$something" | sed 's/\\/\\\\/g'
+ #
+ # So, first we look for a working echo in the user's PATH.
+
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for dir in $PATH /usr/ucb; do
+ IFS="$lt_save_ifs"
+ if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
+ test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ echo="$dir/echo"
+ break
+ fi
+ done
+ IFS="$lt_save_ifs"
+
+ if test "X$echo" = Xecho; then
+ # We didn't find a better echo, so look for alternatives.
+ if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ # This shell has a builtin print -r that does the trick.
+ echo='print -r'
+ elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&
+ test "X$CONFIG_SHELL" != X/bin/ksh; then
+ # If we have ksh, try running configure again with it.
+ ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+ export ORIGINAL_CONFIG_SHELL
+ CONFIG_SHELL=/bin/ksh
+ export CONFIG_SHELL
+ exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"}
+ else
+ # Try using printf.
+ echo='printf %s\n'
+ if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ # Cool, printf works
+ :
+ elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
+ test "X$echo_testing_string" = 'X\t' &&
+ echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
+ export CONFIG_SHELL
+ SHELL="$CONFIG_SHELL"
+ export SHELL
+ echo="$CONFIG_SHELL [$]0 --fallback-echo"
+ elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
+ test "X$echo_testing_string" = 'X\t' &&
+ echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ echo="$CONFIG_SHELL [$]0 --fallback-echo"
+ else
+ # maybe with a smaller string...
+ prev=:
+
+ for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do
+ if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null
+ then
+ break
+ fi
+ prev="$cmd"
+ done
+
+ if test "$prev" != 'sed 50q "[$]0"'; then
+ echo_test_string=`eval $prev`
+ export echo_test_string
+ exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"}
+ else
+ # Oops. We lost completely, so just stick with echo.
+ echo=echo
+ fi
+ fi
+ fi
+ fi
+fi
+fi
+
+# Copy echo and quote the copy suitably for passing to libtool from
+# the Makefile, instead of quoting the original, which is used later.
+ECHO=$echo
+if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then
+ ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo"
+fi
+
+AC_SUBST(ECHO)
+])])# _LT_AC_PROG_ECHO_BACKSLASH
+
+
+# _LT_AC_LOCK
+# -----------
+AC_DEFUN([_LT_AC_LOCK],
+[AC_ARG_ENABLE([libtool-lock],
+ [AC_HELP_STRING([--disable-libtool-lock],
+ [avoid locking (might break parallel builds)])])
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+ # Find out which ABI we are using.
+ echo 'int i;' > conftest.$ac_ext
+ if AC_TRY_EVAL(ac_compile); then
+ case `/usr/bin/file conftest.$ac_objext` in
+ *ELF-32*)
+ HPUX_IA64_MODE="32"
+ ;;
+ *ELF-64*)
+ HPUX_IA64_MODE="64"
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+*-*-irix6*)
+ # Find out which ABI we are using.
+ echo '[#]line __oline__ "configure"' > conftest.$ac_ext
+ if AC_TRY_EVAL(ac_compile); then
+ if test "$lt_cv_prog_gnu_ld" = yes; then
+ case `/usr/bin/file conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -melf32bsmip"
+ ;;
+ *N32*)
+ LD="${LD-ld} -melf32bmipn32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -melf64bmip"
+ ;;
+ esac
+ else
+ case `/usr/bin/file conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -32"
+ ;;
+ *N32*)
+ LD="${LD-ld} -n32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -64"
+ ;;
+ esac
+ fi
+ fi
+ rm -rf conftest*
+ ;;
+
+x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*)
+ # Find out which ABI we are using.
+ echo 'int i;' > conftest.$ac_ext
+ if AC_TRY_EVAL(ac_compile); then
+ case `/usr/bin/file conftest.o` in
+ *32-bit*)
+ case $host in
+ x86_64-*linux*)
+ LD="${LD-ld} -m elf_i386"
+ ;;
+ ppc64-*linux*|powerpc64-*linux*)
+ LD="${LD-ld} -m elf32ppclinux"
+ ;;
+ s390x-*linux*)
+ LD="${LD-ld} -m elf_s390"
+ ;;
+ sparc64-*linux*)
+ LD="${LD-ld} -m elf32_sparc"
+ ;;
+ esac
+ ;;
+ *64-bit*)
+ case $host in
+ x86_64-*linux*)
+ LD="${LD-ld} -m elf_x86_64"
+ ;;
+ ppc*-*linux*|powerpc*-*linux*)
+ LD="${LD-ld} -m elf64ppc"
+ ;;
+ s390*-*linux*)
+ LD="${LD-ld} -m elf64_s390"
+ ;;
+ sparc*-*linux*)
+ LD="${LD-ld} -m elf64_sparc"
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+*-*-sco3.2v5*)
+ # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+ SAVE_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -belf"
+ AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
+ [AC_LANG_PUSH(C)
+ AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
+ AC_LANG_POP])
+ if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+ # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+ CFLAGS="$SAVE_CFLAGS"
+ fi
+ ;;
+sparc*-*solaris*)
+ # Find out which ABI we are using.
+ echo 'int i;' > conftest.$ac_ext
+ if AC_TRY_EVAL(ac_compile); then
+ case `/usr/bin/file conftest.o` in
+ *64-bit*)
+ case $lt_cv_prog_gnu_ld in
+ yes*) LD="${LD-ld} -m elf64_sparc" ;;
+ *) LD="${LD-ld} -64" ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL],
+[*-*-cygwin* | *-*-mingw* | *-*-pw32*)
+ AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+ AC_CHECK_TOOL(AS, as, false)
+ AC_CHECK_TOOL(OBJDUMP, objdump, false)
+ ;;
+ ])
+esac
+
+need_locks="$enable_libtool_lock"
+
+])# _LT_AC_LOCK
+
+
+# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION],
+[AC_REQUIRE([LT_AC_PROG_SED])
+AC_CACHE_CHECK([$1], [$2],
+ [$2=no
+ ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$3"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&AS_MESSAGE_LOG_FD
+ echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ $2=yes
+ fi
+ fi
+ $rm conftest*
+])
+
+if test x"[$]$2" = xyes; then
+ ifelse([$5], , :, [$5])
+else
+ ifelse([$6], , :, [$6])
+fi
+])# AC_LIBTOOL_COMPILER_OPTION
+
+
+# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+# [ACTION-SUCCESS], [ACTION-FAILURE])
+# ------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([AC_LIBTOOL_LINKER_OPTION],
+[AC_CACHE_CHECK([$1], [$2],
+ [$2=no
+ save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS $3"
+ printf "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&AS_MESSAGE_LOG_FD
+ $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ $2=yes
+ fi
+ else
+ $2=yes
+ fi
+ fi
+ $rm conftest*
+ LDFLAGS="$save_LDFLAGS"
+])
+
+if test x"[$]$2" = xyes; then
+ ifelse([$4], , :, [$4])
+else
+ ifelse([$5], , :, [$5])
+fi
+])# AC_LIBTOOL_LINKER_OPTION
+
+
+# AC_LIBTOOL_SYS_MAX_CMD_LEN
+# --------------------------
+AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN],
+[# find the maximum length of command line arguments
+AC_MSG_CHECKING([the maximum length of command line arguments])
+AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
+ i=0
+ teststring="ABCD"
+
+ case $build_os in
+ msdosdjgpp*)
+ # On DJGPP, this test can blow up pretty badly due to problems in libc
+ # (any single argument exceeding 2000 bytes causes a buffer overrun
+ # during glob expansion). Even if it were fixed, the result of this
+ # check would be larger than it should be.
+ lt_cv_sys_max_cmd_len=12288; # 12K is about right
+ ;;
+
+ gnu*)
+ # Under GNU Hurd, this test is not required because there is
+ # no limit to the length of command line arguments.
+ # Libtool will interpret -1 as no limit whatsoever
+ lt_cv_sys_max_cmd_len=-1;
+ ;;
+
+ cygwin* | mingw*)
+ # On Win9x/ME, this test blows up -- it succeeds, but takes
+ # about 5 minutes as the teststring grows exponentially.
+ # Worse, since 9x/ME are not pre-emptively multitasking,
+ # you end up with a "frozen" computer, even though with patience
+ # the test eventually succeeds (with a max line length of 256k).
+ # Instead, let's just punt: use the minimum linelength reported by
+ # all of the supported platforms: 8192 (on NT/2K/XP).
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ amigaos*)
+ # On AmigaOS with pdksh, this test takes hours, literally.
+ # So we just punt and use a minimum line length of 8192.
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+ # This has been around since 386BSD, at least. Likely further.
+ if test -x /sbin/sysctl; then
+ lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+ elif test -x /usr/sbin/sysctl; then
+ lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+ else
+ lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs
+ fi
+ # And add a safety zone
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+ ;;
+
+ interix*)
+ # We know the value 262144 and hardcode it with a safety zone (like BSD)
+ lt_cv_sys_max_cmd_len=196608
+ ;;
+
+ osf*)
+ # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+ # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+ # nice to cause kernel panics so lets avoid the loop below.
+ # First set a reasonable default.
+ lt_cv_sys_max_cmd_len=16384
+ #
+ if test -x /sbin/sysconfig; then
+ case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+ *1*) lt_cv_sys_max_cmd_len=-1 ;;
+ esac
+ fi
+ ;;
+ sco3.2v5*)
+ lt_cv_sys_max_cmd_len=102400
+ ;;
+ sysv5* | sco5v6* | sysv4.2uw2*)
+ kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+ if test -n "$kargmax"; then
+ lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'`
+ else
+ lt_cv_sys_max_cmd_len=32768
+ fi
+ ;;
+ *)
+ # If test is not a shell built-in, we'll probably end up computing a
+ # maximum length that is only half of the actual maximum length, but
+ # we can't tell.
+ SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+ while (test "X"`$SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \
+ = "XX$teststring") >/dev/null 2>&1 &&
+ new_result=`expr "X$teststring" : ".*" 2>&1` &&
+ lt_cv_sys_max_cmd_len=$new_result &&
+ test $i != 17 # 1/2 MB should be enough
+ do
+ i=`expr $i + 1`
+ teststring=$teststring$teststring
+ done
+ teststring=
+ # Add a significant safety factor because C++ compilers can tack on massive
+ # amounts of additional arguments before passing them to the linker.
+ # It appears as though 1/2 is a usable value.
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+ ;;
+ esac
+])
+if test -n $lt_cv_sys_max_cmd_len ; then
+ AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
+else
+ AC_MSG_RESULT(none)
+fi
+])# AC_LIBTOOL_SYS_MAX_CMD_LEN
+
+
+# _LT_AC_CHECK_DLFCN
+# ------------------
+AC_DEFUN([_LT_AC_CHECK_DLFCN],
+[AC_CHECK_HEADERS(dlfcn.h)dnl
+])# _LT_AC_CHECK_DLFCN
+
+
+# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
+# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
+# ---------------------------------------------------------------------
+AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF],
+[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl
+if test "$cross_compiling" = yes; then :
+ [$4]
+else
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<EOF
+[#line __oline__ "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LT_DLGLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LT_DLGLOBAL DL_GLOBAL
+# else
+# define LT_DLGLOBAL 0
+# endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LT_DLLAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LT_DLLAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LT_DLLAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LT_DLLAZY_OR_NOW DL_NOW
+# else
+# define LT_DLLAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+#ifdef __cplusplus
+extern "C" void exit (int);
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+ int status = $lt_dlunknown;
+
+ if (self)
+ {
+ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
+ else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ /* dlclose (self); */
+ }
+ else
+ puts (dlerror ());
+
+ exit (status);
+}]
+EOF
+ if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
+ (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
+ lt_status=$?
+ case x$lt_status in
+ x$lt_dlno_uscore) $1 ;;
+ x$lt_dlneed_uscore) $2 ;;
+ x$lt_dlunknown|x*) $3 ;;
+ esac
+ else :
+ # compilation failed
+ $3
+ fi
+fi
+rm -fr conftest*
+])# _LT_AC_TRY_DLOPEN_SELF
+
+
+# AC_LIBTOOL_DLOPEN_SELF
+# ----------------------
+AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF],
+[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl
+if test "x$enable_dlopen" != xyes; then
+ enable_dlopen=unknown
+ enable_dlopen_self=unknown
+ enable_dlopen_self_static=unknown
+else
+ lt_cv_dlopen=no
+ lt_cv_dlopen_libs=
+
+ case $host_os in
+ beos*)
+ lt_cv_dlopen="load_add_on"
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+ ;;
+
+ mingw* | pw32*)
+ lt_cv_dlopen="LoadLibrary"
+ lt_cv_dlopen_libs=
+ ;;
+
+ cygwin*)
+ lt_cv_dlopen="dlopen"
+ lt_cv_dlopen_libs=
+ ;;
+
+ darwin*)
+ # if libdl is installed we need to link against it
+ AC_CHECK_LIB([dl], [dlopen],
+ [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
+ lt_cv_dlopen="dyld"
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+ ])
+ ;;
+
+ *)
+ AC_CHECK_FUNC([shl_load],
+ [lt_cv_dlopen="shl_load"],
+ [AC_CHECK_LIB([dld], [shl_load],
+ [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"],
+ [AC_CHECK_FUNC([dlopen],
+ [lt_cv_dlopen="dlopen"],
+ [AC_CHECK_LIB([dl], [dlopen],
+ [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
+ [AC_CHECK_LIB([svld], [dlopen],
+ [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
+ [AC_CHECK_LIB([dld], [dld_link],
+ [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"])
+ ])
+ ])
+ ])
+ ])
+ ])
+ ;;
+ esac
+
+ if test "x$lt_cv_dlopen" != xno; then
+ enable_dlopen=yes
+ else
+ enable_dlopen=no
+ fi
+
+ case $lt_cv_dlopen in
+ dlopen)
+ save_CPPFLAGS="$CPPFLAGS"
+ test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+ save_LDFLAGS="$LDFLAGS"
+ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+ save_LIBS="$LIBS"
+ LIBS="$lt_cv_dlopen_libs $LIBS"
+
+ AC_CACHE_CHECK([whether a program can dlopen itself],
+ lt_cv_dlopen_self, [dnl
+ _LT_AC_TRY_DLOPEN_SELF(
+ lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
+ lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
+ ])
+
+ if test "x$lt_cv_dlopen_self" = xyes; then
+ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+ AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
+ lt_cv_dlopen_self_static, [dnl
+ _LT_AC_TRY_DLOPEN_SELF(
+ lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
+ lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross)
+ ])
+ fi
+
+ CPPFLAGS="$save_CPPFLAGS"
+ LDFLAGS="$save_LDFLAGS"
+ LIBS="$save_LIBS"
+ ;;
+ esac
+
+ case $lt_cv_dlopen_self in
+ yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+ *) enable_dlopen_self=unknown ;;
+ esac
+
+ case $lt_cv_dlopen_self_static in
+ yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+ *) enable_dlopen_self_static=unknown ;;
+ esac
+fi
+])# AC_LIBTOOL_DLOPEN_SELF
+
+
+# AC_LIBTOOL_PROG_CC_C_O([TAGNAME])
+# ---------------------------------
+# Check to see if options -c and -o are simultaneously supported by compiler
+AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O],
+[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
+AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
+ [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
+ [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
+ $rm -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&AS_MESSAGE_LOG_FD
+ echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+ fi
+ fi
+ chmod u+w . 2>&AS_MESSAGE_LOG_FD
+ $rm conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
+ $rm out/* && rmdir out
+ cd ..
+ rmdir conftest
+ $rm conftest*
+])
+])# AC_LIBTOOL_PROG_CC_C_O
+
+
+# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME])
+# -----------------------------------------
+# Check to see if we can do hard links to lock some files if needed
+AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS],
+[AC_REQUIRE([_LT_AC_LOCK])dnl
+
+hard_links="nottested"
+if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
+ # do not overwrite the value of need_locks provided by the user
+ AC_MSG_CHECKING([if we can lock with hard links])
+ hard_links=yes
+ $rm conftest*
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ touch conftest.a
+ ln conftest.a conftest.b 2>&5 || hard_links=no
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ AC_MSG_RESULT([$hard_links])
+ if test "$hard_links" = no; then
+ AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
+ need_locks=warn
+ fi
+else
+ need_locks=no
+fi
+])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS
+
+
+# AC_LIBTOOL_OBJDIR
+# -----------------
+AC_DEFUN([AC_LIBTOOL_OBJDIR],
+[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
+[rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+ lt_cv_objdir=.libs
+else
+ # MS-DOS does not allow filenames that begin with a dot.
+ lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null])
+objdir=$lt_cv_objdir
+])# AC_LIBTOOL_OBJDIR
+
+
+# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME])
+# ----------------------------------------------
+# Check hardcoding attributes.
+AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH],
+[AC_MSG_CHECKING([how to hardcode library paths into programs])
+_LT_AC_TAGVAR(hardcode_action, $1)=
+if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \
+ test -n "$_LT_AC_TAGVAR(runpath_var, $1)" || \
+ test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
+
+ # We can hardcode non-existant directories.
+ if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no &&
+ # If the only mechanism to avoid hardcoding is shlibpath_var, we
+ # have to relink, otherwise we might link with an installed library
+ # when we should be linking with a yet-to-be-installed one
+ ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
+ test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then
+ # Linking always hardcodes the temporary library directory.
+ _LT_AC_TAGVAR(hardcode_action, $1)=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ _LT_AC_TAGVAR(hardcode_action, $1)=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ _LT_AC_TAGVAR(hardcode_action, $1)=unsupported
+fi
+AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)])
+
+if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+ test "$enable_shared" = no; then
+ # Fast installation is not necessary
+ enable_fast_install=needless
+fi
+])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH
+
+
+# AC_LIBTOOL_SYS_LIB_STRIP
+# ------------------------
+AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP],
+[striplib=
+old_striplib=
+AC_MSG_CHECKING([whether stripping libraries is possible])
+if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then
+ test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+ test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+ AC_MSG_RESULT([yes])
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+ case $host_os in
+ darwin*)
+ if test -n "$STRIP" ; then
+ striplib="$STRIP -x"
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+fi
+ ;;
+ *)
+ AC_MSG_RESULT([no])
+ ;;
+ esac
+fi
+])# AC_LIBTOOL_SYS_LIB_STRIP
+
+
+# AC_LIBTOOL_SYS_DYNAMIC_LINKER
+# -----------------------------
+# PORTME Fill in your ld.so characteristics
+AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER],
+[AC_MSG_CHECKING([dynamic linker characteristics])
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
+ # if the path contains ";" then we assume it to be the separator
+ # otherwise default to the standard path separator (i.e. ":") - it is
+ # assumed that no part of a normal pathname contains ";" but that should
+ # okay in the real world where ";" in dirpaths is itself problematic.
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+else
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+ shlibpath_var=LIBPATH
+
+ # AIX 3 has no versioning support, so we append a major version to the name.
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+
+aix4* | aix5*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ hardcode_into_libs=yes
+ if test "$host_cpu" = ia64; then
+ # AIX 5 supports IA64
+ library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ else
+ # With GCC up to 2.95.x, collect2 would create an import file
+ # for dependence libraries. The import file would start with
+ # the line `#! .'. This would cause the generated library to
+ # depend on `.', always an invalid library. This was fixed in
+ # development snapshots of GCC prior to 3.0.
+ case $host_os in
+ aix4 | aix4.[[01]] | aix4.[[01]].*)
+ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+ echo ' yes '
+ echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
+ :
+ else
+ can_build_shared=no
+ fi
+ ;;
+ esac
+ # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+ # soname into executable. Probably we can add versioning support to
+ # collect2, so additional links can be useful in future.
+ if test "$aix_use_runtimelinking" = yes; then
+ # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+ # instead of lib<name>.a to let people know that these are not
+ # typical AIX shared libraries.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ else
+ # We preserve .a as extension for shared libraries through AIX4.2
+ # and later when we are not doing run time linking.
+ library_names_spec='${libname}${release}.a $libname.a'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ fi
+ shlibpath_var=LIBPATH
+ fi
+ ;;
+
+amigaos*)
+ library_names_spec='$libname.ixlibrary $libname.a'
+ # Create ${libname}_ixlibrary.a entries in /sys/libs.
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+ ;;
+
+beos*)
+ library_names_spec='${libname}${shared_ext}'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi[[45]]*)
+ version_type=linux
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+ # the default ld.so.conf also contains /usr/contrib/lib and
+ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+ # libtool to hard-code these into programs
+ ;;
+
+cygwin* | mingw* | pw32*)
+ version_type=windows
+ shrext_cmds=".dll"
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$host_os in
+ yes,cygwin* | yes,mingw* | yes,pw32*)
+ library_names_spec='$libname.dll.a'
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \${file}`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $rm \$dlpath'
+ shlibpath_overrides_runpath=yes
+
+ case $host_os in
+ cygwin*)
+ # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+ soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+ ;;
+ mingw*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then
+ # It is most probably a Windows format PATH printed by
+ # mingw gcc, but we are running on Cygwin. Gcc prints its search
+ # path with ; separators, and with drive letters. We can handle the
+ # drive letters (cygwin fileutils understands them), so leave them,
+ # especially as we might pass files found there to a mingw objdump,
+ # which wouldn't understand a cygwinified path. Ahh.
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ ;;
+ pw32*)
+ # pw32 DLLs use 'pw' prefix rather than 'lib'
+ library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+ ;;
+ esac
+ ;;
+
+ *)
+ library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ # FIXME: first we should search . and the directory the executable is in
+ shlibpath_var=PATH
+ ;;
+
+darwin* | rhapsody*)
+ dynamic_linker="$host_os dyld"
+ version_type=darwin
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+ soname_spec='${libname}${release}${major}$shared_ext'
+ shlibpath_overrides_runpath=yes
+ shlibpath_var=DYLD_LIBRARY_PATH
+ shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+ # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
+ if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
+ else
+ sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
+ fi
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+freebsd1*)
+ dynamic_linker=no
+ ;;
+
+kfreebsd*-gnu)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='GNU ld.so'
+ ;;
+
+freebsd* | dragonfly*)
+ # DragonFly does not have aout. When/if they implement a new
+ # versioning mechanism, adjust this.
+ if test -x /usr/bin/objformat; then
+ objformat=`/usr/bin/objformat`
+ else
+ case $host_os in
+ freebsd[[123]]*) objformat=aout ;;
+ *) objformat=elf ;;
+ esac
+ fi
+ version_type=freebsd-$objformat
+ case $version_type in
+ freebsd-elf*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+ need_version=no
+ need_lib_prefix=no
+ ;;
+ freebsd-*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+ need_version=yes
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_os in
+ freebsd2*)
+ shlibpath_overrides_runpath=yes
+ ;;
+ freebsd3.[[01]]* | freebsdelf3.[[01]]*)
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
+ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+ freebsd*) # from 4.6 on
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+gnu*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ hardcode_into_libs=yes
+ ;;
+
+hpux9* | hpux10* | hpux11*)
+ # Give a soname corresponding to the major version so that dld.sl refuses to
+ # link against other versions.
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ case $host_cpu in
+ ia64*)
+ shrext_cmds='.so'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.so"
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ if test "X$HPUX_IA64_MODE" = X32; then
+ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+ else
+ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+ fi
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ hppa*64*)
+ shrext_cmds='.sl'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ *)
+ shrext_cmds='.sl'
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=SHLIB_PATH
+ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+ esac
+ # HP-UX runs *really* slowly unless shared libraries are mode 555.
+ postinstall_cmds='chmod 555 $lib'
+ ;;
+
+interix3*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $host_os in
+ nonstopux*) version_type=nonstopux ;;
+ *)
+ if test "$lt_cv_prog_gnu_ld" = yes; then
+ version_type=linux
+ else
+ version_type=irix
+ fi ;;
+ esac
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+ case $host_os in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in # libtool.m4 will add one of these switches to LD
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+ libsuff= shlibsuff= libmagic=32-bit;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+ libsuff=32 shlibsuff=N32 libmagic=N32;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+ libsuff=64 shlibsuff=64 libmagic=64-bit;;
+ *) libsuff= shlibsuff= libmagic=never-match;;
+ esac
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+ sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+ hardcode_into_libs=yes
+ ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+ dynamic_linker=no
+ ;;
+
+# This must be Linux ELF.
+linux*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ # Append ld.so.conf contents to the search path
+ if test -f /etc/ld.so.conf; then
+ lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
+ sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+ fi
+
+ # We used to test for /lib/ld.so.1 and disable shared libraries on
+ # powerpc, because MkLinux only supported shared libraries with the
+ # GNU dynamic linker. Since this was broken with cross compilers,
+ # most powerpc-linux boxes support dynamic linking these days and
+ # people can always --disable-shared, the test was removed, and we
+ # assume the GNU/Linux dynamic linker is in use.
+ dynamic_linker='GNU/Linux ld.so'
+ ;;
+
+knetbsd*-gnu)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='GNU ld.so'
+ ;;
+
+netbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ dynamic_linker='NetBSD (a.out) ld.so'
+ else
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ dynamic_linker='NetBSD ld.elf_so'
+ fi
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+
+newsos6)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+nto-qnx*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+openbsd*)
+ version_type=sunos
+ sys_lib_dlsearch_path_spec="/usr/lib"
+ need_lib_prefix=no
+ # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+ case $host_os in
+ openbsd3.3 | openbsd3.3.*) need_version=yes ;;
+ *) need_version=no ;;
+ esac
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ case $host_os in
+ openbsd2.[[89]] | openbsd2.[[89]].*)
+ shlibpath_overrides_runpath=no
+ ;;
+ *)
+ shlibpath_overrides_runpath=yes
+ ;;
+ esac
+ else
+ shlibpath_overrides_runpath=yes
+ fi
+ ;;
+
+os2*)
+ libname_spec='$name'
+ shrext_cmds=".dll"
+ need_lib_prefix=no
+ library_names_spec='$libname${shared_ext} $libname.a'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=LIBPATH
+ ;;
+
+osf3* | osf4* | osf5*)
+ version_type=osf
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+ sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+ ;;
+
+solaris*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ # ldd complains unless libraries are executable
+ postinstall_cmds='chmod +x $lib'
+ ;;
+
+sunos4*)
+ version_type=sunos
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ if test "$with_gnu_ld" = yes; then
+ need_lib_prefix=no
+ fi
+ need_version=yes
+ ;;
+
+sysv4 | sysv4.3*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_vendor in
+ sni)
+ shlibpath_overrides_runpath=no
+ need_lib_prefix=no
+ export_dynamic_flag_spec='${wl}-Blargedynsym'
+ runpath_var=LD_RUN_PATH
+ ;;
+ siemens)
+ need_lib_prefix=no
+ ;;
+ motorola)
+ need_lib_prefix=no
+ need_version=no
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+ ;;
+ esac
+ ;;
+
+sysv4*MP*)
+ if test -d /usr/nec ;then
+ version_type=linux
+ library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+ soname_spec='$libname${shared_ext}.$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ fi
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ version_type=freebsd-elf
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ hardcode_into_libs=yes
+ if test "$with_gnu_ld" = yes; then
+ sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+ shlibpath_overrides_runpath=no
+ else
+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+ shlibpath_overrides_runpath=yes
+ case $host_os in
+ sco3.2v5*)
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+ ;;
+ esac
+ fi
+ sys_lib_dlsearch_path_spec='/usr/lib'
+ ;;
+
+uts4*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+*)
+ dynamic_linker=no
+ ;;
+esac
+AC_MSG_RESULT([$dynamic_linker])
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+])# AC_LIBTOOL_SYS_DYNAMIC_LINKER
+
+
+# _LT_AC_TAGCONFIG
+# ----------------
+AC_DEFUN([_LT_AC_TAGCONFIG],
+[AC_ARG_WITH([tags],
+ [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@],
+ [include additional configurations @<:@automatic@:>@])],
+ [tagnames="$withval"])
+
+if test -f "$ltmain" && test -n "$tagnames"; then
+ if test ! -f "${ofile}"; then
+ AC_MSG_WARN([output file `$ofile' does not exist])
+ fi
+
+ if test -z "$LTCC"; then
+ eval "`$SHELL ${ofile} --config | grep '^LTCC='`"
+ if test -z "$LTCC"; then
+ AC_MSG_WARN([output file `$ofile' does not look like a libtool script])
+ else
+ AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile'])
+ fi
+ fi
+ if test -z "$LTCFLAGS"; then
+ eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`"
+ fi
+
+ # Extract list of available tagged configurations in $ofile.
+ # Note that this assumes the entire list is on one line.
+ available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'`
+
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for tagname in $tagnames; do
+ IFS="$lt_save_ifs"
+ # Check whether tagname contains only valid characters
+ case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in
+ "") ;;
+ *) AC_MSG_ERROR([invalid tag name: $tagname])
+ ;;
+ esac
+
+ if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null
+ then
+ AC_MSG_ERROR([tag name \"$tagname\" already exists])
+ fi
+
+ # Update the list of available tags.
+ if test -n "$tagname"; then
+ echo appending configuration tag \"$tagname\" to $ofile
+
+ case $tagname in
+ CXX)
+ if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+ ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+ (test "X$CXX" != "Xg++"))) ; then
+ AC_LIBTOOL_LANG_CXX_CONFIG
+ else
+ tagname=""
+ fi
+ ;;
+
+ F77)
+ if test -n "$F77" && test "X$F77" != "Xno"; then
+ AC_LIBTOOL_LANG_F77_CONFIG
+ else
+ tagname=""
+ fi
+ ;;
+
+ GCJ)
+ if test -n "$GCJ" && test "X$GCJ" != "Xno"; then
+ AC_LIBTOOL_LANG_GCJ_CONFIG
+ else
+ tagname=""
+ fi
+ ;;
+
+ RC)
+ AC_LIBTOOL_LANG_RC_CONFIG
+ ;;
+
+ *)
+ AC_MSG_ERROR([Unsupported tag name: $tagname])
+ ;;
+ esac
+
+ # Append the new tag name to the list of available tags.
+ if test -n "$tagname" ; then
+ available_tags="$available_tags $tagname"
+ fi
+ fi
+ done
+ IFS="$lt_save_ifs"
+
+ # Now substitute the updated list of available tags.
+ if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then
+ mv "${ofile}T" "$ofile"
+ chmod +x "$ofile"
+ else
+ rm -f "${ofile}T"
+ AC_MSG_ERROR([unable to update list of available tagged configurations.])
+ fi
+fi
+])# _LT_AC_TAGCONFIG
+
+
+# AC_LIBTOOL_DLOPEN
+# -----------------
+# enable checks for dlopen support
+AC_DEFUN([AC_LIBTOOL_DLOPEN],
+ [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])
+])# AC_LIBTOOL_DLOPEN
+
+
+# AC_LIBTOOL_WIN32_DLL
+# --------------------
+# declare package support for building win32 DLLs
+AC_DEFUN([AC_LIBTOOL_WIN32_DLL],
+[AC_BEFORE([$0], [AC_LIBTOOL_SETUP])
+])# AC_LIBTOOL_WIN32_DLL
+
+
+# AC_ENABLE_SHARED([DEFAULT])
+# ---------------------------
+# implement the --enable-shared flag
+# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
+AC_DEFUN([AC_ENABLE_SHARED],
+[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE([shared],
+ [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
+ [build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])],
+ [p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_shared=yes ;;
+ no) enable_shared=no ;;
+ *)
+ enable_shared=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for pkg in $enableval; do
+ IFS="$lt_save_ifs"
+ if test "X$pkg" = "X$p"; then
+ enable_shared=yes
+ fi
+ done
+ IFS="$lt_save_ifs"
+ ;;
+ esac],
+ [enable_shared=]AC_ENABLE_SHARED_DEFAULT)
+])# AC_ENABLE_SHARED
+
+
+# AC_DISABLE_SHARED
+# -----------------
+# set the default shared flag to --disable-shared
+AC_DEFUN([AC_DISABLE_SHARED],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_ENABLE_SHARED(no)
+])# AC_DISABLE_SHARED
+
+
+# AC_ENABLE_STATIC([DEFAULT])
+# ---------------------------
+# implement the --enable-static flag
+# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
+AC_DEFUN([AC_ENABLE_STATIC],
+[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE([static],
+ [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@],
+ [build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])],
+ [p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_static=yes ;;
+ no) enable_static=no ;;
+ *)
+ enable_static=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for pkg in $enableval; do
+ IFS="$lt_save_ifs"
+ if test "X$pkg" = "X$p"; then
+ enable_static=yes
+ fi
+ done
+ IFS="$lt_save_ifs"
+ ;;
+ esac],
+ [enable_static=]AC_ENABLE_STATIC_DEFAULT)
+])# AC_ENABLE_STATIC
+
+
+# AC_DISABLE_STATIC
+# -----------------
+# set the default static flag to --disable-static
+AC_DEFUN([AC_DISABLE_STATIC],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_ENABLE_STATIC(no)
+])# AC_DISABLE_STATIC
+
+
+# AC_ENABLE_FAST_INSTALL([DEFAULT])
+# ---------------------------------
+# implement the --enable-fast-install flag
+# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
+AC_DEFUN([AC_ENABLE_FAST_INSTALL],
+[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE([fast-install],
+ [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
+ [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
+ [p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_fast_install=yes ;;
+ no) enable_fast_install=no ;;
+ *)
+ enable_fast_install=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for pkg in $enableval; do
+ IFS="$lt_save_ifs"
+ if test "X$pkg" = "X$p"; then
+ enable_fast_install=yes
+ fi
+ done
+ IFS="$lt_save_ifs"
+ ;;
+ esac],
+ [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT)
+])# AC_ENABLE_FAST_INSTALL
+
+
+# AC_DISABLE_FAST_INSTALL
+# -----------------------
+# set the default to --disable-fast-install
+AC_DEFUN([AC_DISABLE_FAST_INSTALL],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_ENABLE_FAST_INSTALL(no)
+])# AC_DISABLE_FAST_INSTALL
+
+
+# AC_LIBTOOL_PICMODE([MODE])
+# --------------------------
+# implement the --with-pic flag
+# MODE is either `yes' or `no'. If omitted, it defaults to `both'.
+AC_DEFUN([AC_LIBTOOL_PICMODE],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+pic_mode=ifelse($#,1,$1,default)
+])# AC_LIBTOOL_PICMODE
+
+
+# AC_PROG_EGREP
+# -------------
+# This is predefined starting with Autoconf 2.54, so this conditional
+# definition can be removed once we require Autoconf 2.54 or later.
+m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP],
+[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep],
+ [if echo a | (grep -E '(a|b)') >/dev/null 2>&1
+ then ac_cv_prog_egrep='grep -E'
+ else ac_cv_prog_egrep='egrep'
+ fi])
+ EGREP=$ac_cv_prog_egrep
+ AC_SUBST([EGREP])
+])])
+
+
+# AC_PATH_TOOL_PREFIX
+# -------------------
+# find a file program which can recognise shared library
+AC_DEFUN([AC_PATH_TOOL_PREFIX],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+AC_MSG_CHECKING([for $1])
+AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
+[case $MAGIC_CMD in
+[[\\/*] | ?:[\\/]*])
+ lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+ ;;
+*)
+ lt_save_MAGIC_CMD="$MAGIC_CMD"
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+dnl $ac_dummy forces splitting on constant user-supplied paths.
+dnl POSIX.2 word splitting is done only on the output of word expansions,
+dnl not every word. This closes a longstanding sh security hole.
+ ac_dummy="ifelse([$2], , $PATH, [$2])"
+ for ac_dir in $ac_dummy; do
+ IFS="$lt_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$1; then
+ lt_cv_path_MAGIC_CMD="$ac_dir/$1"
+ if test -n "$file_magic_test_file"; then
+ case $deplibs_check_method in
+ "file_magic "*)
+ file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+ MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+ $EGREP "$file_magic_regex" > /dev/null; then
+ :
+ else
+ cat <<EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such. This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem. Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+EOF
+ fi ;;
+ esac
+ fi
+ break
+ fi
+ done
+ IFS="$lt_save_ifs"
+ MAGIC_CMD="$lt_save_MAGIC_CMD"
+ ;;
+esac])
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+ AC_MSG_RESULT($MAGIC_CMD)
+else
+ AC_MSG_RESULT(no)
+fi
+])# AC_PATH_TOOL_PREFIX
+
+
+# AC_PATH_MAGIC
+# -------------
+# find a file program which can recognise a shared library
+AC_DEFUN([AC_PATH_MAGIC],
+[AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+ if test -n "$ac_tool_prefix"; then
+ AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
+ else
+ MAGIC_CMD=:
+ fi
+fi
+])# AC_PATH_MAGIC
+
+
+# AC_PROG_LD
+# ----------
+# find the pathname to the GNU or non-GNU linker
+AC_DEFUN([AC_PROG_LD],
+[AC_ARG_WITH([gnu-ld],
+ [AC_HELP_STRING([--with-gnu-ld],
+ [assume the C compiler uses GNU ld @<:@default=no@:>@])],
+ [test "$withval" = no || with_gnu_ld=yes],
+ [with_gnu_ld=no])
+AC_REQUIRE([LT_AC_PROG_SED])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+ac_prog=ld
+if test "$GCC" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ AC_MSG_CHECKING([for ld used by $CC])
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [[\\/]]* | ?:[[\\/]]*)
+ re_direlt='/[[^/]][[^/]]*/\.\./'
+ # Canonicalize the pathname of ld
+ ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'`
+ while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD="$ac_prog"
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test "$with_gnu_ld" = yes; then
+ AC_MSG_CHECKING([for GNU ld])
+else
+ AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(lt_cv_path_LD,
+[if test -z "$LD"; then
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS="$lt_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ lt_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some variants of GNU ld only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+ *GNU* | *'with BFD'*)
+ test "$with_gnu_ld" != no && break
+ ;;
+ *)
+ test "$with_gnu_ld" != yes && break
+ ;;
+ esac
+ fi
+ done
+ IFS="$lt_save_ifs"
+else
+ lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+ AC_MSG_RESULT($LD)
+else
+ AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+AC_PROG_LD_GNU
+])# AC_PROG_LD
+
+
+# AC_PROG_LD_GNU
+# --------------
+AC_DEFUN([AC_PROG_LD_GNU],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ lt_cv_prog_gnu_ld=yes
+ ;;
+*)
+ lt_cv_prog_gnu_ld=no
+ ;;
+esac])
+with_gnu_ld=$lt_cv_prog_gnu_ld
+])# AC_PROG_LD_GNU
+
+
+# AC_PROG_LD_RELOAD_FLAG
+# ----------------------
+# find reload flag for linker
+# -- PORTME Some linkers may need a different reload flag.
+AC_DEFUN([AC_PROG_LD_RELOAD_FLAG],
+[AC_CACHE_CHECK([for $LD option to reload object files],
+ lt_cv_ld_reload_flag,
+ [lt_cv_ld_reload_flag='-r'])
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+ darwin*)
+ if test "$GCC" = yes; then
+ reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+ else
+ reload_cmds='$LD$reload_flag -o $output$reload_objs'
+ fi
+ ;;
+esac
+])# AC_PROG_LD_RELOAD_FLAG
+
+
+# AC_DEPLIBS_CHECK_METHOD
+# -----------------------
+# how to check for library dependencies
+# -- PORTME fill in with the dynamic library characteristics
+AC_DEFUN([AC_DEPLIBS_CHECK_METHOD],
+[AC_CACHE_CHECK([how to recognise dependent libraries],
+lt_cv_deplibs_check_method,
+[lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix4* | aix5*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+beos*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+bsdi[[45]]*)
+ lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
+ lt_cv_file_magic_cmd='/usr/bin/file -L'
+ lt_cv_file_magic_test_file=/shlib/libc.so
+ ;;
+
+cygwin*)
+ # func_win32_libid is a shell function defined in ltmain.sh
+ lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+ lt_cv_file_magic_cmd='func_win32_libid'
+ ;;
+
+mingw* | pw32*)
+ # Base MSYS/MinGW do not provide the 'file' command needed by
+ # func_win32_libid shell function, so use a weaker test based on 'objdump'.
+ lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+ lt_cv_file_magic_cmd='$OBJDUMP -f'
+ ;;
+
+darwin* | rhapsody*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+freebsd* | kfreebsd*-gnu | dragonfly*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+ case $host_cpu in
+ i*86 )
+ # Not sure whether the presence of OpenBSD here was a mistake.
+ # Let's accept both of them until this is cleared up.
+ lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
+ lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+ ;;
+ esac
+ else
+ lt_cv_deplibs_check_method=pass_all
+ fi
+ ;;
+
+gnu*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+hpux10.20* | hpux11*)
+ lt_cv_file_magic_cmd=/usr/bin/file
+ case $host_cpu in
+ ia64*)
+ lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
+ lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+ ;;
+ hppa*64*)
+ [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]']
+ lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+ ;;
+ *)
+ lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library'
+ lt_cv_file_magic_test_file=/usr/lib/libc.sl
+ ;;
+ esac
+ ;;
+
+interix3*)
+ # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+ lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $LD in
+ *-32|*"-32 ") libmagic=32-bit;;
+ *-n32|*"-n32 ") libmagic=N32;;
+ *-64|*"-64 ") libmagic=64-bit;;
+ *) libmagic=never-match;;
+ esac
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+# This must be Linux ELF.
+linux*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+ lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+ else
+ lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
+ fi
+ ;;
+
+newos6*)
+ lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
+ lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_test_file=/usr/lib/libnls.so
+ ;;
+
+nto-qnx*)
+ lt_cv_deplibs_check_method=unknown
+ ;;
+
+openbsd*)
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
+ else
+ lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+ fi
+ ;;
+
+osf3* | osf4* | osf5*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+solaris*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+sysv4 | sysv4.3*)
+ case $host_vendor in
+ motorola)
+ lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+ ;;
+ ncr)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ sequent)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
+ ;;
+ sni)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
+ lt_cv_file_magic_test_file=/lib/libc.so
+ ;;
+ siemens)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ pc)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ esac
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+esac
+])
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+])# AC_DEPLIBS_CHECK_METHOD
+
+
+# AC_PROG_NM
+# ----------
+# find the pathname to a BSD-compatible name lister
+AC_DEFUN([AC_PROG_NM],
+[AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM,
+[if test -n "$NM"; then
+ # Let the user override the test.
+ lt_cv_path_NM="$NM"
+else
+ lt_nm_to_check="${ac_tool_prefix}nm"
+ if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+ lt_nm_to_check="$lt_nm_to_check nm"
+ fi
+ for lt_tmp_nm in $lt_nm_to_check; do
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+ IFS="$lt_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ tmp_nm="$ac_dir/$lt_tmp_nm"
+ if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+ # Check to see if the nm accepts a BSD-compat flag.
+ # Adding the `sed 1q' prevents false positives on HP-UX, which says:
+ # nm: unknown option "B" ignored
+ # Tru64's nm complains that /dev/null is an invalid object file
+ case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+ */dev/null* | *'Invalid file or object type'*)
+ lt_cv_path_NM="$tmp_nm -B"
+ break
+ ;;
+ *)
+ case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+ */dev/null*)
+ lt_cv_path_NM="$tmp_nm -p"
+ break
+ ;;
+ *)
+ lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+ continue # so that we can try to find one that supports BSD flags
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ done
+ IFS="$lt_save_ifs"
+ done
+ test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm
+fi])
+NM="$lt_cv_path_NM"
+])# AC_PROG_NM
+
+
+# AC_CHECK_LIBM
+# -------------
+# check for math library
+AC_DEFUN([AC_CHECK_LIBM],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+LIBM=
+case $host in
+*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*)
+ # These system don't have libm, or don't need it
+ ;;
+*-ncr-sysv4.3*)
+ AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
+ AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
+ ;;
+*)
+ AC_CHECK_LIB(m, cos, LIBM="-lm")
+ ;;
+esac
+])# AC_CHECK_LIBM
+
+
+# AC_LIBLTDL_CONVENIENCE([DIRECTORY])
+# -----------------------------------
+# sets LIBLTDL to the link flags for the libltdl convenience library and
+# LTDLINCL to the include flags for the libltdl header and adds
+# --enable-ltdl-convenience to the configure arguments. Note that
+# AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided,
+# it is assumed to be `libltdl'. LIBLTDL will be prefixed with
+# '${top_builddir}/' and LTDLINCL will be prefixed with '${top_srcdir}/'
+# (note the single quotes!). If your package is not flat and you're not
+# using automake, define top_builddir and top_srcdir appropriately in
+# the Makefiles.
+AC_DEFUN([AC_LIBLTDL_CONVENIENCE],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+ case $enable_ltdl_convenience in
+ no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;;
+ "") enable_ltdl_convenience=yes
+ ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;;
+ esac
+ LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la
+ LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
+ # For backwards non-gettext consistent compatibility...
+ INCLTDL="$LTDLINCL"
+])# AC_LIBLTDL_CONVENIENCE
+
+
+# AC_LIBLTDL_INSTALLABLE([DIRECTORY])
+# -----------------------------------
+# sets LIBLTDL to the link flags for the libltdl installable library and
+# LTDLINCL to the include flags for the libltdl header and adds
+# --enable-ltdl-install to the configure arguments. Note that
+# AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided,
+# and an installed libltdl is not found, it is assumed to be `libltdl'.
+# LIBLTDL will be prefixed with '${top_builddir}/'# and LTDLINCL with
+# '${top_srcdir}/' (note the single quotes!). If your package is not
+# flat and you're not using automake, define top_builddir and top_srcdir
+# appropriately in the Makefiles.
+# In the future, this macro may have to be called after AC_PROG_LIBTOOL.
+AC_DEFUN([AC_LIBLTDL_INSTALLABLE],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+ AC_CHECK_LIB(ltdl, lt_dlinit,
+ [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no],
+ [if test x"$enable_ltdl_install" = xno; then
+ AC_MSG_WARN([libltdl not installed, but installation disabled])
+ else
+ enable_ltdl_install=yes
+ fi
+ ])
+ if test x"$enable_ltdl_install" = x"yes"; then
+ ac_configure_args="$ac_configure_args --enable-ltdl-install"
+ LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la
+ LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
+ else
+ ac_configure_args="$ac_configure_args --enable-ltdl-install=no"
+ LIBLTDL="-lltdl"
+ LTDLINCL=
+ fi
+ # For backwards non-gettext consistent compatibility...
+ INCLTDL="$LTDLINCL"
+])# AC_LIBLTDL_INSTALLABLE
+
+
+# AC_LIBTOOL_CXX
+# --------------
+# enable support for C++ libraries
+AC_DEFUN([AC_LIBTOOL_CXX],
+[AC_REQUIRE([_LT_AC_LANG_CXX])
+])# AC_LIBTOOL_CXX
+
+
+# _LT_AC_LANG_CXX
+# ---------------
+AC_DEFUN([_LT_AC_LANG_CXX],
+[AC_REQUIRE([AC_PROG_CXX])
+AC_REQUIRE([_LT_AC_PROG_CXXCPP])
+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX])
+])# _LT_AC_LANG_CXX
+
+# _LT_AC_PROG_CXXCPP
+# ------------------
+AC_DEFUN([_LT_AC_PROG_CXXCPP],
+[
+AC_REQUIRE([AC_PROG_CXX])
+if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+ ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+ (test "X$CXX" != "Xg++"))) ; then
+ AC_PROG_CXXCPP
+fi
+])# _LT_AC_PROG_CXXCPP
+
+# AC_LIBTOOL_F77
+# --------------
+# enable support for Fortran 77 libraries
+AC_DEFUN([AC_LIBTOOL_F77],
+[AC_REQUIRE([_LT_AC_LANG_F77])
+])# AC_LIBTOOL_F77
+
+
+# _LT_AC_LANG_F77
+# ---------------
+AC_DEFUN([_LT_AC_LANG_F77],
+[AC_REQUIRE([AC_PROG_F77])
+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77])
+])# _LT_AC_LANG_F77
+
+
+# AC_LIBTOOL_GCJ
+# --------------
+# enable support for GCJ libraries
+AC_DEFUN([AC_LIBTOOL_GCJ],
+[AC_REQUIRE([_LT_AC_LANG_GCJ])
+])# AC_LIBTOOL_GCJ
+
+
+# _LT_AC_LANG_GCJ
+# ---------------
+AC_DEFUN([_LT_AC_LANG_GCJ],
+[AC_PROVIDE_IFELSE([AC_PROG_GCJ],[],
+ [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[],
+ [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[],
+ [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])],
+ [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])],
+ [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])])
+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ])
+])# _LT_AC_LANG_GCJ
+
+
+# AC_LIBTOOL_RC
+# -------------
+# enable support for Windows resource files
+AC_DEFUN([AC_LIBTOOL_RC],
+[AC_REQUIRE([LT_AC_PROG_RC])
+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC])
+])# AC_LIBTOOL_RC
+
+
+# AC_LIBTOOL_LANG_C_CONFIG
+# ------------------------
+# Ensure that the configuration vars for the C compiler are
+# suitably defined. Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG])
+AC_DEFUN([_LT_AC_LANG_C_CONFIG],
+[lt_save_CC="$CC"
+AC_LANG_PUSH(C)
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}\n'
+
+_LT_AC_SYS_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1)
+AC_LIBTOOL_PROG_COMPILER_PIC($1)
+AC_LIBTOOL_PROG_CC_C_O($1)
+AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
+AC_LIBTOOL_PROG_LD_SHLIBS($1)
+AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
+AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
+AC_LIBTOOL_SYS_LIB_STRIP
+AC_LIBTOOL_DLOPEN_SELF
+
+# Report which library types will actually be built
+AC_MSG_CHECKING([if libtool supports shared libraries])
+AC_MSG_RESULT([$can_build_shared])
+
+AC_MSG_CHECKING([whether to build shared libraries])
+test "$can_build_shared" = "no" && enable_shared=no
+
+# On AIX, shared libraries and static libraries use the same namespace, and
+# are all built from PIC.
+case $host_os in
+aix3*)
+ test "$enable_shared" = yes && enable_static=no
+ if test -n "$RANLIB"; then
+ archive_cmds="$archive_cmds~\$RANLIB \$lib"
+ postinstall_cmds='$RANLIB $lib'
+ fi
+ ;;
+
+aix4* | aix5*)
+ if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+ test "$enable_shared" = yes && enable_static=no
+ fi
+ ;;
+esac
+AC_MSG_RESULT([$enable_shared])
+
+AC_MSG_CHECKING([whether to build static libraries])
+# Make sure either enable_shared or enable_static is yes.
+test "$enable_shared" = yes || enable_static=yes
+AC_MSG_RESULT([$enable_static])
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_POP
+CC="$lt_save_CC"
+])# AC_LIBTOOL_LANG_C_CONFIG
+
+
+# AC_LIBTOOL_LANG_CXX_CONFIG
+# --------------------------
+# Ensure that the configuration vars for the C compiler are
+# suitably defined. Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)])
+AC_DEFUN([_LT_AC_LANG_CXX_CONFIG],
+[AC_LANG_PUSH(C++)
+AC_REQUIRE([AC_PROG_CXX])
+AC_REQUIRE([_LT_AC_PROG_CXXCPP])
+
+_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_AC_TAGVAR(allow_undefined_flag, $1)=
+_LT_AC_TAGVAR(always_export_symbols, $1)=no
+_LT_AC_TAGVAR(archive_expsym_cmds, $1)=
+_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_AC_TAGVAR(hardcode_direct, $1)=no
+_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_AC_TAGVAR(hardcode_minus_L, $1)=no
+_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+_LT_AC_TAGVAR(hardcode_automatic, $1)=no
+_LT_AC_TAGVAR(module_cmds, $1)=
+_LT_AC_TAGVAR(module_expsym_cmds, $1)=
+_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_AC_TAGVAR(no_undefined_flag, $1)=
+_LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Dependencies to place before and after the object being linked:
+_LT_AC_TAGVAR(predep_objects, $1)=
+_LT_AC_TAGVAR(postdep_objects, $1)=
+_LT_AC_TAGVAR(predeps, $1)=
+_LT_AC_TAGVAR(postdeps, $1)=
+_LT_AC_TAGVAR(compiler_lib_search_path, $1)=
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }\n'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_AC_SYS_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_LD=$LD
+lt_save_GCC=$GCC
+GCC=$GXX
+lt_save_with_gnu_ld=$with_gnu_ld
+lt_save_path_LD=$lt_cv_path_LD
+if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+ lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+else
+ $as_unset lt_cv_prog_gnu_ld
+fi
+if test -n "${lt_cv_path_LDCXX+set}"; then
+ lt_cv_path_LD=$lt_cv_path_LDCXX
+else
+ $as_unset lt_cv_path_LD
+fi
+test -z "${LDCXX+set}" || LD=$LDCXX
+CC=${CXX-"c++"}
+compiler=$CC
+_LT_AC_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+
+# We don't want -fno-exception wen compiling C++ code, so set the
+# no_builtin_flag separately
+if test "$GXX" = yes; then
+ _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+else
+ _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+fi
+
+if test "$GXX" = yes; then
+ # Set up default GNU C++ configuration
+
+ AC_PROG_LD
+
+ # Check if GNU C++ uses GNU ld as the underlying linker, since the
+ # archiving commands below assume that GNU ld is being used.
+ if test "$with_gnu_ld" = yes; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+ # investigate it a little bit more. (MM)
+ wlarc='${wl}'
+
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if eval "`$CC -print-prog-name=ld` --help 2>&1" | \
+ grep 'no-whole-archive' > /dev/null; then
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ else
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+ fi
+ else
+ with_gnu_ld=no
+ wlarc=
+
+ # A generic and very simple default shared library creation
+ # command for GNU C++ for the case where it uses the native
+ # linker, instead of GNU ld. If possible, this setting should
+ # overridden to take advantage of the native linker features on
+ # the platform it is being used on.
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+ fi
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+
+else
+ GXX=no
+ with_gnu_ld=no
+ wlarc=
+fi
+
+# PORTME: fill in a description of your system's C++ link characteristics
+AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+_LT_AC_TAGVAR(ld_shlibs, $1)=yes
+case $host_os in
+ aix3*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ aix4* | aix5*)
+ if test "$host_cpu" = ia64; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=""
+ else
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # need to do runtime linking.
+ case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*)
+ for ld_flag in $LDFLAGS; do
+ case $ld_flag in
+ *-brtl*)
+ aix_use_runtimelinking=yes
+ break
+ ;;
+ esac
+ done
+ ;;
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ _LT_AC_TAGVAR(archive_cmds, $1)=''
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+
+ if test "$GXX" = yes; then
+ case $host_os in aix4.[[012]]|aix4.[[012]].*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`${CC} -print-prog-name=collect2`
+ if test -f "$collect2name" && \
+ strings "$collect2name" | grep resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ else
+ # We have old collect2
+ _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+ fi
+ ;;
+ esac
+ shared_flag='-shared'
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag="$shared_flag "'${wl}-G'
+ fi
+ else
+ # not using gcc
+ if test "$host_cpu" = ia64; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag='${wl}-G'
+ else
+ shared_flag='${wl}-bM:SRE'
+ fi
+ fi
+ fi
+
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to export.
+ _LT_AC_TAGVAR(always_export_symbols, $1)=yes
+ if test "$aix_use_runtimelinking" = yes; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok'
+ # Determine the default libpath from the value encoded in an empty executable.
+ _LT_AC_SYS_LIBPATH_AIX
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+ else
+ if test "$host_cpu" = ia64; then
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an empty executable.
+ _LT_AC_SYS_LIBPATH_AIX
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+ # Exported symbols can be pulled into shared objects from archives
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
+ # This is similar to how AIX traditionally builds its shared libraries.
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+ fi
+ fi
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+ # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ chorus*)
+ case $cc_basename in
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+ # as there is no search path for DLLs.
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+ _LT_AC_TAGVAR(always_export_symbols, $1)=no
+ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+
+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ # If the export-symbols file already is a .def file (1st line
+ # is EXPORTS), use it as is; otherwise, prepend...
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ darwin* | rhapsody*)
+ case $host_os in
+ rhapsody* | darwin1.[[012]])
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress'
+ ;;
+ *) # Darwin 1.3 on
+ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ else
+ case ${MACOSX_DEPLOYMENT_TARGET} in
+ 10.[[012]])
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ ;;
+ 10.*)
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_automatic, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=''
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+
+ if test "$GXX" = yes ; then
+ lt_int_apple_cc_single_mod=no
+ output_verbose_link_cmd='echo'
+ if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then
+ lt_int_apple_cc_single_mod=yes
+ fi
+ if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+ fi
+ _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ else
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ fi
+ _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ else
+ case $cc_basename in
+ xlc*)
+ output_verbose_link_cmd='echo'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
+ _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ ;;
+ *)
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ fi
+ ;;
+
+ dgux*)
+ case $cc_basename in
+ ec++*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ ghcx*)
+ # Green Hills C++ Compiler
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+ freebsd[[12]]*)
+ # C++ shared libraries reported to be fairly broken before switch to ELF
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ freebsd-elf*)
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ ;;
+ freebsd* | kfreebsd*-gnu | dragonfly*)
+ # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+ # conventions
+ _LT_AC_TAGVAR(ld_shlibs, $1)=yes
+ ;;
+ gnu*)
+ ;;
+ hpux9*)
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+ # but as the default
+ # location of the library.
+
+ case $cc_basename in
+ CC*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ aCC*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[[-]]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ else
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+ hpux10*|hpux11*)
+ if test $with_gnu_ld = no; then
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ case $host_cpu in
+ hppa*64*|ia64*)
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
+ ;;
+ *)
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ ;;
+ esac
+ fi
+ case $host_cpu in
+ hppa*64*|ia64*)
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+ *)
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+ # but as the default
+ # location of the library.
+ ;;
+ esac
+
+ case $cc_basename in
+ CC*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ aCC*)
+ case $host_cpu in
+ hppa*64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ ia64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ *)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ esac
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes; then
+ if test $with_gnu_ld = no; then
+ case $host_cpu in
+ hppa*64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ ia64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ *)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ esac
+ fi
+ else
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+ interix3*)
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+ # Instead, shared libraries are loaded at an image base (0x10000000 by
+ # default) and relocated if they conflict, which is a slow very memory
+ # consuming and fragmenting process. To avoid this, we pick a random,
+ # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+ # time. Moving up from 0x10000000 also allows more sbrk(2) space.
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ ;;
+ irix5* | irix6*)
+ case $cc_basename in
+ CC*)
+ # SGI C++
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+
+ # Archives containing C++ object files must be created using
+ # "CC -ar", where "CC" is the IRIX C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
+ ;;
+ *)
+ if test "$GXX" = yes; then
+ if test "$with_gnu_ld" = no; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib'
+ fi
+ fi
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+ ;;
+ esac
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ ;;
+ linux*)
+ case $cc_basename in
+ KCC*)
+ # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+ # KCC will only create a shared library if the output file
+ # ends with ".so" (or ".sl" for HP-UX), so rename the library
+ # to its proper name (with version) after linking.
+ _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+ # Archives containing C++ object files must be created using
+ # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+ ;;
+ icpc*)
+ # Intel C++
+ with_gnu_ld=yes
+ # version 8.0 and above of icpc choke on multiply defined symbols
+ # if we add $predep_objects and $postdep_objects, however 7.1 and
+ # earlier do not add the objects themselves.
+ case `$CC -V 2>&1` in
+ *"Version 7."*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+ *) # Version 8.0 or newer
+ tmp_idyn=
+ case $host_cpu in
+ ia64*) tmp_idyn=' -i_dynamic';;
+ esac
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+ esac
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+ ;;
+ pgCC*)
+ # Portland Group C++ compiler
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+ ;;
+ cxx*)
+ # Compaq C++
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+
+ runpath_var=LD_RUN_PATH
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ esac
+ ;;
+ lynxos*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ m88k*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ mvs*)
+ case $cc_basename in
+ cxx*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+ wlarc=
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ fi
+ # Workaround some broken pre-1.5 toolchains
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+ ;;
+ openbsd2*)
+ # C++ shared libraries are fairly broken
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ openbsd*)
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ fi
+ output_verbose_link_cmd='echo'
+ ;;
+ osf3*)
+ case $cc_basename in
+ KCC*)
+ # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+ # KCC will only create a shared library if the output file
+ # ends with ".so" (or ".sl" for HP-UX), so rename the library
+ # to its proper name (with version) after linking.
+ _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Archives containing C++ object files must be created using
+ # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ cxx*)
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+
+ else
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+ osf4* | osf5*)
+ case $cc_basename in
+ KCC*)
+ # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+ # KCC will only create a shared library if the output file
+ # ends with ".so" (or ".sl" for HP-UX), so rename the library
+ # to its proper name (with version) after linking.
+ _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Archives containing C++ object files must be created using
+ # the KAI C++ compiler.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs'
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ cxx*)
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+ echo "-hidden">> $lib.exp~
+ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~
+ $rm $lib.exp'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+
+ else
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+ psos*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ sunos4*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.x
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ lcc*)
+ # Lucid
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+ solaris*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.2, 5.x and Centerline C++
+ _LT_AC_TAGVAR(archive_cmds_need_lc,$1)=yes
+ _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ case $host_os in
+ solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+ *)
+ # The C++ compiler is used as linker so we must use $wl
+ # flag to pass the commands to the underlying system
+ # linker. We must also pass each convience library through
+ # to the system linker between allextract/defaultextract.
+ # The C++ compiler will combine linker options so we
+ # cannot just pass the convience library names through
+ # without $wl.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract'
+ ;;
+ esac
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+
+ output_verbose_link_cmd='echo'
+
+ # Archives containing C++ object files must be created using
+ # "CC -xar", where "CC" is the Sun C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+ ;;
+ gcx*)
+ # Green Hills C++ Compiler
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+
+ # The C++ compiler must be used to create the archive.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+ ;;
+ *)
+ # GNU C++ compiler with Solaris linker
+ if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+ _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
+ if $CC --version | grep -v '^2\.7' > /dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\""
+ else
+ # g++ 2.7 appears to require `-G' NOT `-shared' on this
+ # platform.
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\""
+ fi
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
+ fi
+ ;;
+ esac
+ ;;
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+ _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ runpath_var='LD_RUN_PATH'
+
+ case $cc_basename in
+ CC*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ ;;
+ sysv5* | sco3.2v5* | sco5v6*)
+ # Note: We can NOT use -z defs as we might desire, because we do not
+ # link with -lc, and that would cause any symbols used from libc to
+ # always be unresolved, which means just about no library would
+ # ever link correctly. If we're not using GNU ld we use -z text
+ # though, which does catch some bad symbols but isn't as heavy-handed
+ # as -z defs.
+ # For security reasons, it is highly recommended that you always
+ # use absolute paths for naming shared libraries, and exclude the
+ # DT_RUNPATH tag from executables and libraries. But doing so
+ # requires that you compile everything twice, which is a pain.
+ # So that behaviour is only enabled if SCOABSPATH is set to a
+ # non-empty value in the environment. Most likely only useful for
+ # creating official distributions of packages.
+ # This is a hack until libtool officially supports absolute path
+ # names for shared libraries.
+ _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ case $cc_basename in
+ CC*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ ;;
+ tandem*)
+ case $cc_basename in
+ NCC*)
+ # NonStop-UX NCC 3.20
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+ vxworks*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+esac
+AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)])
+test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+_LT_AC_TAGVAR(GCC, $1)="$GXX"
+_LT_AC_TAGVAR(LD, $1)="$LD"
+
+AC_LIBTOOL_POSTDEP_PREDEP($1)
+AC_LIBTOOL_PROG_COMPILER_PIC($1)
+AC_LIBTOOL_PROG_CC_C_O($1)
+AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
+AC_LIBTOOL_PROG_LD_SHLIBS($1)
+AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
+AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_POP
+CC=$lt_save_CC
+LDCXX=$LD
+LD=$lt_save_LD
+GCC=$lt_save_GCC
+with_gnu_ldcxx=$with_gnu_ld
+with_gnu_ld=$lt_save_with_gnu_ld
+lt_cv_path_LDCXX=$lt_cv_path_LD
+lt_cv_path_LD=$lt_save_path_LD
+lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+])# AC_LIBTOOL_LANG_CXX_CONFIG
+
+# AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME])
+# ------------------------------------
+# Figure out "hidden" library dependencies from verbose
+# compiler output when linking a shared library.
+# Parse the compiler output and extract the necessary
+# objects, libraries and library flags.
+AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],[
+dnl we can't use the lt_simple_compile_test_code here,
+dnl because it contains code intended for an executable,
+dnl not a library. It's possible we should let each
+dnl tag define a new lt_????_link_test_code variable,
+dnl but it's only used here...
+ifelse([$1],[],[cat > conftest.$ac_ext <<EOF
+int a;
+void foo (void) { a = 0; }
+EOF
+],[$1],[CXX],[cat > conftest.$ac_ext <<EOF
+class Foo
+{
+public:
+ Foo (void) { a = 0; }
+private:
+ int a;
+};
+EOF
+],[$1],[F77],[cat > conftest.$ac_ext <<EOF
+ subroutine foo
+ implicit none
+ integer*4 a
+ a=0
+ return
+ end
+EOF
+],[$1],[GCJ],[cat > conftest.$ac_ext <<EOF
+public class foo {
+ private int a;
+ public void bar (void) {
+ a = 0;
+ }
+};
+EOF
+])
+dnl Parse the compiler output and extract the necessary
+dnl objects, libraries and library flags.
+if AC_TRY_EVAL(ac_compile); then
+ # Parse the compiler output and extract the necessary
+ # objects, libraries and library flags.
+
+ # Sentinel used to keep track of whether or not we are before
+ # the conftest object file.
+ pre_test_object_deps_done=no
+
+ # The `*' in the case matches for architectures that use `case' in
+ # $output_verbose_cmd can trigger glob expansion during the loop
+ # eval without this substitution.
+ output_verbose_link_cmd=`$echo "X$output_verbose_link_cmd" | $Xsed -e "$no_glob_subst"`
+
+ for p in `eval $output_verbose_link_cmd`; do
+ case $p in
+
+ -L* | -R* | -l*)
+ # Some compilers place space between "-{L,R}" and the path.
+ # Remove the space.
+ if test $p = "-L" \
+ || test $p = "-R"; then
+ prev=$p
+ continue
+ else
+ prev=
+ fi
+
+ if test "$pre_test_object_deps_done" = no; then
+ case $p in
+ -L* | -R*)
+ # Internal compiler library paths should come after those
+ # provided the user. The postdeps already come after the
+ # user supplied libs so there is no need to process them.
+ if test -z "$_LT_AC_TAGVAR(compiler_lib_search_path, $1)"; then
+ _LT_AC_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
+ else
+ _LT_AC_TAGVAR(compiler_lib_search_path, $1)="${_LT_AC_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
+ fi
+ ;;
+ # The "-l" case would never come before the object being
+ # linked, so don't bother handling this case.
+ esac
+ else
+ if test -z "$_LT_AC_TAGVAR(postdeps, $1)"; then
+ _LT_AC_TAGVAR(postdeps, $1)="${prev}${p}"
+ else
+ _LT_AC_TAGVAR(postdeps, $1)="${_LT_AC_TAGVAR(postdeps, $1)} ${prev}${p}"
+ fi
+ fi
+ ;;
+
+ *.$objext)
+ # This assumes that the test object file only shows up
+ # once in the compiler output.
+ if test "$p" = "conftest.$objext"; then
+ pre_test_object_deps_done=yes
+ continue
+ fi
+
+ if test "$pre_test_object_deps_done" = no; then
+ if test -z "$_LT_AC_TAGVAR(predep_objects, $1)"; then
+ _LT_AC_TAGVAR(predep_objects, $1)="$p"
+ else
+ _LT_AC_TAGVAR(predep_objects, $1)="$_LT_AC_TAGVAR(predep_objects, $1) $p"
+ fi
+ else
+ if test -z "$_LT_AC_TAGVAR(postdep_objects, $1)"; then
+ _LT_AC_TAGVAR(postdep_objects, $1)="$p"
+ else
+ _LT_AC_TAGVAR(postdep_objects, $1)="$_LT_AC_TAGVAR(postdep_objects, $1) $p"
+ fi
+ fi
+ ;;
+
+ *) ;; # Ignore the rest.
+
+ esac
+ done
+
+ # Clean up.
+ rm -f a.out a.exe
+else
+ echo "libtool.m4: error: problem compiling $1 test program"
+fi
+
+$rm -f confest.$objext
+
+# PORTME: override above test on systems where it is broken
+ifelse([$1],[CXX],
+[case $host_os in
+interix3*)
+ # Interix 3.5 installs completely hosed .la files for C++, so rather than
+ # hack all around it, let's just trust "g++" to DTRT.
+ _LT_AC_TAGVAR(predep_objects,$1)=
+ _LT_AC_TAGVAR(postdep_objects,$1)=
+ _LT_AC_TAGVAR(postdeps,$1)=
+ ;;
+
+solaris*)
+ case $cc_basename in
+ CC*)
+ # Adding this requires a known-good setup of shared libraries for
+ # Sun compiler versions before 5.6, else PIC objects from an old
+ # archive will be linked into the output, leading to subtle bugs.
+ _LT_AC_TAGVAR(postdeps,$1)='-lCstd -lCrun'
+ ;;
+ esac
+ ;;
+esac
+])
+
+case " $_LT_AC_TAGVAR(postdeps, $1) " in
+*" -lc "*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;;
+esac
+])# AC_LIBTOOL_POSTDEP_PREDEP
+
+# AC_LIBTOOL_LANG_F77_CONFIG
+# --------------------------
+# Ensure that the configuration vars for the C compiler are
+# suitably defined. Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG], [_LT_AC_LANG_F77_CONFIG(F77)])
+AC_DEFUN([_LT_AC_LANG_F77_CONFIG],
+[AC_REQUIRE([AC_PROG_F77])
+AC_LANG_PUSH(Fortran 77)
+
+_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_AC_TAGVAR(allow_undefined_flag, $1)=
+_LT_AC_TAGVAR(always_export_symbols, $1)=no
+_LT_AC_TAGVAR(archive_expsym_cmds, $1)=
+_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_AC_TAGVAR(hardcode_direct, $1)=no
+_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_AC_TAGVAR(hardcode_minus_L, $1)=no
+_LT_AC_TAGVAR(hardcode_automatic, $1)=no
+_LT_AC_TAGVAR(module_cmds, $1)=
+_LT_AC_TAGVAR(module_expsym_cmds, $1)=
+_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_AC_TAGVAR(no_undefined_flag, $1)=
+_LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for f77 test sources.
+ac_ext=f
+
+# Object file extension for compiled f77 test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code=" subroutine t\n return\n end\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code=" program t\n end\n"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_AC_SYS_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${F77-"f77"}
+compiler=$CC
+_LT_AC_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+
+AC_MSG_CHECKING([if libtool supports shared libraries])
+AC_MSG_RESULT([$can_build_shared])
+
+AC_MSG_CHECKING([whether to build shared libraries])
+test "$can_build_shared" = "no" && enable_shared=no
+
+# On AIX, shared libraries and static libraries use the same namespace, and
+# are all built from PIC.
+case $host_os in
+aix3*)
+ test "$enable_shared" = yes && enable_static=no
+ if test -n "$RANLIB"; then
+ archive_cmds="$archive_cmds~\$RANLIB \$lib"
+ postinstall_cmds='$RANLIB $lib'
+ fi
+ ;;
+aix4* | aix5*)
+ if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+ test "$enable_shared" = yes && enable_static=no
+ fi
+ ;;
+esac
+AC_MSG_RESULT([$enable_shared])
+
+AC_MSG_CHECKING([whether to build static libraries])
+# Make sure either enable_shared or enable_static is yes.
+test "$enable_shared" = yes || enable_static=yes
+AC_MSG_RESULT([$enable_static])
+
+_LT_AC_TAGVAR(GCC, $1)="$G77"
+_LT_AC_TAGVAR(LD, $1)="$LD"
+
+AC_LIBTOOL_PROG_COMPILER_PIC($1)
+AC_LIBTOOL_PROG_CC_C_O($1)
+AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
+AC_LIBTOOL_PROG_LD_SHLIBS($1)
+AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
+AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_POP
+CC="$lt_save_CC"
+])# AC_LIBTOOL_LANG_F77_CONFIG
+
+
+# AC_LIBTOOL_LANG_GCJ_CONFIG
+# --------------------------
+# Ensure that the configuration vars for the C compiler are
+# suitably defined. Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG], [_LT_AC_LANG_GCJ_CONFIG(GCJ)])
+AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG],
+[AC_LANG_SAVE
+
+# Source file extension for Java test sources.
+ac_ext=java
+
+# Object file extension for compiled Java test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="class foo {}\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }\n'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_AC_SYS_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${GCJ-"gcj"}
+compiler=$CC
+_LT_AC_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+
+# GCJ did not exist at the time GCC didn't implicitly link libc in.
+_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+
+AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1)
+AC_LIBTOOL_PROG_COMPILER_PIC($1)
+AC_LIBTOOL_PROG_CC_C_O($1)
+AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
+AC_LIBTOOL_PROG_LD_SHLIBS($1)
+AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
+AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_RESTORE
+CC="$lt_save_CC"
+])# AC_LIBTOOL_LANG_GCJ_CONFIG
+
+
+# AC_LIBTOOL_LANG_RC_CONFIG
+# -------------------------
+# Ensure that the configuration vars for the Windows resource compiler are
+# suitably defined. Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG], [_LT_AC_LANG_RC_CONFIG(RC)])
+AC_DEFUN([_LT_AC_LANG_RC_CONFIG],
+[AC_LANG_SAVE
+
+# Source file extension for RC test sources.
+ac_ext=rc
+
+# Object file extension for compiled RC test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }\n'
+
+# Code to be used in simple link tests
+lt_simple_link_test_code="$lt_simple_compile_test_code"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_AC_SYS_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${RC-"windres"}
+compiler=$CC
+_LT_AC_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_RESTORE
+CC="$lt_save_CC"
+])# AC_LIBTOOL_LANG_RC_CONFIG
+
+
+# AC_LIBTOOL_CONFIG([TAGNAME])
+# ----------------------------
+# If TAGNAME is not passed, then create an initial libtool script
+# with a default configuration from the untagged config vars. Otherwise
+# add code to config.status for appending the configuration named by
+# TAGNAME from the matching tagged config vars.
+AC_DEFUN([AC_LIBTOOL_CONFIG],
+[# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+ # See if we are running on zsh, and set the options which allow our commands through
+ # without removal of \ escapes.
+ if test -n "${ZSH_VERSION+set}" ; then
+ setopt NO_GLOB_SUBST
+ fi
+ # Now quote all the things that may contain metacharacters while being
+ # careful not to overquote the AC_SUBSTed values. We take copies of the
+ # variables and quote the copies for generation of the libtool script.
+ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+ SED SHELL STRIP \
+ libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+ old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+ deplibs_check_method reload_flag reload_cmds need_locks \
+ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+ lt_cv_sys_global_symbol_to_c_name_address \
+ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+ old_postinstall_cmds old_postuninstall_cmds \
+ _LT_AC_TAGVAR(compiler, $1) \
+ _LT_AC_TAGVAR(CC, $1) \
+ _LT_AC_TAGVAR(LD, $1) \
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1) \
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1) \
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1) \
+ _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) \
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1) \
+ _LT_AC_TAGVAR(thread_safe_flag_spec, $1) \
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1) \
+ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) \
+ _LT_AC_TAGVAR(old_archive_cmds, $1) \
+ _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) \
+ _LT_AC_TAGVAR(predep_objects, $1) \
+ _LT_AC_TAGVAR(postdep_objects, $1) \
+ _LT_AC_TAGVAR(predeps, $1) \
+ _LT_AC_TAGVAR(postdeps, $1) \
+ _LT_AC_TAGVAR(compiler_lib_search_path, $1) \
+ _LT_AC_TAGVAR(archive_cmds, $1) \
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1) \
+ _LT_AC_TAGVAR(postinstall_cmds, $1) \
+ _LT_AC_TAGVAR(postuninstall_cmds, $1) \
+ _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) \
+ _LT_AC_TAGVAR(allow_undefined_flag, $1) \
+ _LT_AC_TAGVAR(no_undefined_flag, $1) \
+ _LT_AC_TAGVAR(export_symbols_cmds, $1) \
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) \
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) \
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1) \
+ _LT_AC_TAGVAR(hardcode_automatic, $1) \
+ _LT_AC_TAGVAR(module_cmds, $1) \
+ _LT_AC_TAGVAR(module_expsym_cmds, $1) \
+ _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) \
+ _LT_AC_TAGVAR(exclude_expsyms, $1) \
+ _LT_AC_TAGVAR(include_expsyms, $1); do
+
+ case $var in
+ _LT_AC_TAGVAR(old_archive_cmds, $1) | \
+ _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) | \
+ _LT_AC_TAGVAR(archive_cmds, $1) | \
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1) | \
+ _LT_AC_TAGVAR(module_cmds, $1) | \
+ _LT_AC_TAGVAR(module_expsym_cmds, $1) | \
+ _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) | \
+ _LT_AC_TAGVAR(export_symbols_cmds, $1) | \
+ extract_expsyms_cmds | reload_cmds | finish_cmds | \
+ postinstall_cmds | postuninstall_cmds | \
+ old_postinstall_cmds | old_postuninstall_cmds | \
+ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+ # Double-quote double-evaled strings.
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+ ;;
+ *)
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+ ;;
+ esac
+ done
+
+ case $lt_echo in
+ *'\[$]0 --fallback-echo"')
+ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\[$]0 --fallback-echo"[$]/[$]0 --fallback-echo"/'`
+ ;;
+ esac
+
+ifelse([$1], [],
+ [cfgfile="${ofile}T"
+ trap "$rm \"$cfgfile\"; exit 1" 1 2 15
+ $rm -f "$cfgfile"
+ AC_MSG_NOTICE([creating $ofile])],
+ [cfgfile="$ofile"])
+
+ cat <<__EOF__ >> "$cfgfile"
+ifelse([$1], [],
+[#! $SHELL
+
+# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
+# Free Software Foundation, Inc.
+#
+# This file is part of GNU Libtool:
+# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="$SED -e 1s/^X//"
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# The names of the tagged configurations supported by this script.
+available_tags=
+
+# ### BEGIN LIBTOOL CONFIG],
+[# ### BEGIN LIBTOOL TAG CONFIG: $tagname])
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_[]_LT_AC_TAGVAR(compiler, $1)
+
+# Is the compiler the GNU C compiler?
+with_gcc=$_LT_AC_TAGVAR(GCC, $1)
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_[]_LT_AC_TAGVAR(LD, $1)
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1)
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1)
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1)
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names. First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1)
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1)
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1)
+archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1)
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1)
+module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1)
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1)
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1)
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1)
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1)
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1)
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1)
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1)
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1)
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1)
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1)
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1)
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)
+
+# Set to yes if building a shared library automatically hardcodes DIR into the library
+# and all subsequent libraries and executables linked against it.
+hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1)
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1)
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$_LT_AC_TAGVAR(fix_srcfile_path, $1)"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1)
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1)
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1)
+
+# Symbols that must always be exported.
+include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1)
+
+ifelse([$1],[],
+[# ### END LIBTOOL CONFIG],
+[# ### END LIBTOOL TAG CONFIG: $tagname])
+
+__EOF__
+
+ifelse([$1],[], [
+ case $host_os in
+ aix3*)
+ cat <<\EOF >> "$cfgfile"
+
+# AIX sometimes has problems with the GCC collect2 program. For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+fi
+EOF
+ ;;
+ esac
+
+ # We use sed instead of cat because bash on DJGPP gets confused if
+ # if finds mixed CR/LF and LF-only lines. Since sed operates in
+ # text mode, it properly converts lines to CR/LF. This bash problem
+ # is reportedly fixed, but why not run on old versions too?
+ sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1)
+
+ mv -f "$cfgfile" "$ofile" || \
+ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+ chmod +x "$ofile"
+])
+else
+ # If there is no Makefile yet, we rely on a make rule to execute
+ # `config.status --recheck' to rerun these tests and create the
+ # libtool script then.
+ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+ if test -f "$ltmain_in"; then
+ test -f Makefile && make "$ltmain"
+ fi
+fi
+])# AC_LIBTOOL_CONFIG
+
+
+# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME])
+# -------------------------------------------
+AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI],
+[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
+
+_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+
+if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+
+ AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
+ lt_cv_prog_compiler_rtti_exceptions,
+ [-fno-rtti -fno-exceptions], [],
+ [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
+fi
+])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI
+
+
+# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
+# ---------------------------------
+AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE],
+[AC_REQUIRE([AC_CANONICAL_HOST])
+AC_REQUIRE([AC_PROG_NM])
+AC_REQUIRE([AC_OBJEXT])
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+AC_MSG_CHECKING([command to parse $NM output from $compiler object])
+AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
+[
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix. What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[[BCDEGRST]]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
+
+# Transform an extracted symbol line into a proper C declaration
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+ symcode='[[BCDT]]'
+ ;;
+cygwin* | mingw* | pw32*)
+ symcode='[[ABCDGISTW]]'
+ ;;
+hpux*) # Its linker distinguishes data from code symbols
+ if test "$host_cpu" = ia64; then
+ symcode='[[ABCDEGRST]]'
+ fi
+ lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+ lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
+ ;;
+linux*)
+ if test "$host_cpu" = ia64; then
+ symcode='[[ABCDGIRSTW]]'
+ lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+ lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
+ fi
+ ;;
+irix* | nonstopux*)
+ symcode='[[BCDEGRST]]'
+ ;;
+osf*)
+ symcode='[[BCDEGQRST]]'
+ ;;
+solaris*)
+ symcode='[[BDRT]]'
+ ;;
+sco3.2v5*)
+ symcode='[[DT]]'
+ ;;
+sysv4.2uw2*)
+ symcode='[[DT]]'
+ ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+ symcode='[[ABDT]]'
+ ;;
+sysv4)
+ symcode='[[DFNSTU]]'
+ ;;
+esac
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+ opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+ ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+ symcode='[[ABCDGIRSTW]]' ;;
+esac
+
+# Try without a prefix undercore, then with it.
+for ac_symprfx in "" "_"; do
+
+ # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+ symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+ # Write the raw and C identifiers.
+ lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+
+ # Check to see that the pipe works correctly.
+ pipe_works=no
+
+ rm -f conftest*
+ cat > conftest.$ac_ext <<EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+EOF
+
+ if AC_TRY_EVAL(ac_compile); then
+ # Now try to grab the symbols.
+ nlist=conftest.nm
+ if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) && test -s "$nlist"; then
+ # Try sorting and uniquifying the output.
+ if sort "$nlist" | uniq > "$nlist"T; then
+ mv -f "$nlist"T "$nlist"
+ else
+ rm -f "$nlist"T
+ fi
+
+ # Make sure that we snagged all the symbols we need.
+ if grep ' nm_test_var$' "$nlist" >/dev/null; then
+ if grep ' nm_test_func$' "$nlist" >/dev/null; then
+ cat <<EOF > conftest.$ac_ext
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EOF
+ # Now generate the symbol file.
+ eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext'
+
+ cat <<EOF >> conftest.$ac_ext
+#if defined (__STDC__) && __STDC__
+# define lt_ptr_t void *
+#else
+# define lt_ptr_t char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+const struct {
+ const char *name;
+ lt_ptr_t address;
+}
+lt_preloaded_symbols[[]] =
+{
+EOF
+ $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext
+ cat <<\EOF >> conftest.$ac_ext
+ {0, (lt_ptr_t) 0}
+};
+
+#ifdef __cplusplus
+}
+#endif
+EOF
+ # Now try linking the two files.
+ mv conftest.$ac_objext conftstm.$ac_objext
+ lt_save_LIBS="$LIBS"
+ lt_save_CFLAGS="$CFLAGS"
+ LIBS="conftstm.$ac_objext"
+ CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
+ if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
+ pipe_works=yes
+ fi
+ LIBS="$lt_save_LIBS"
+ CFLAGS="$lt_save_CFLAGS"
+ else
+ echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
+ fi
+ else
+ echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
+ fi
+ else
+ echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
+ fi
+ else
+ echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
+ cat conftest.$ac_ext >&5
+ fi
+ rm -f conftest* conftst*
+
+ # Do not use the global_symbol_pipe unless it works.
+ if test "$pipe_works" = yes; then
+ break
+ else
+ lt_cv_sys_global_symbol_pipe=
+ fi
+done
+])
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+ lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+ AC_MSG_RESULT(failed)
+else
+ AC_MSG_RESULT(ok)
+fi
+]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
+
+
+# AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME])
+# ---------------------------------------
+AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC],
+[_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)=
+_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=
+
+AC_MSG_CHECKING([for $compiler option to produce PIC])
+ ifelse([$1],[CXX],[
+ # C++ specific cases for pic, static, wl, etc.
+ if test "$GXX" = yes; then
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ fi
+ ;;
+ amigaos*)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the `-m68020' flag to GCC prevents building anything better,
+ # like `-m68040'.
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+ ;;
+ beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+ mingw* | os2* | pw32*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'
+ ;;
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+ ;;
+ *djgpp*)
+ # DJGPP does not support shared libraries at all
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+ ;;
+ interix3*)
+ # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+ # Instead, we relocate shared libraries at runtime.
+ ;;
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+ fi
+ ;;
+ hpux*)
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case $host_cpu in
+ hppa*64*|ia64*)
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ esac
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ esac
+ else
+ case $host_os in
+ aix4* | aix5*)
+ # All AIX code is PIC.
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ else
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+ chorus*)
+ case $cc_basename in
+ cxch68*)
+ # Green Hills C++ Compiler
+ # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+ ;;
+ esac
+ ;;
+ darwin*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ case $cc_basename in
+ xlc*)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon'
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ ;;
+ esac
+ ;;
+ dgux*)
+ case $cc_basename in
+ ec++*)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ ;;
+ ghcx*)
+ # Green Hills C++ Compiler
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ freebsd* | kfreebsd*-gnu | dragonfly*)
+ # FreeBSD uses GNU C++
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ case $cc_basename in
+ CC*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+ if test "$host_cpu" != ia64; then
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+ fi
+ ;;
+ aCC*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+ ;;
+ esac
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ interix*)
+ # This is c89, which is MS Visual C++ (no shared libs)
+ # Anyone wants to do a port?
+ ;;
+ irix5* | irix6* | nonstopux*)
+ case $cc_basename in
+ CC*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ # CC pic flag -KPIC is the default.
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ linux*)
+ case $cc_basename in
+ KCC*)
+ # KAI C++ Compiler
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ icpc* | ecpc*)
+ # Intel C++
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
+ ;;
+ pgCC*)
+ # Portland Group C++ compiler.
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+ cxx*)
+ # Compaq C++
+ # Make sure the PIC flag is empty. It appears that all Alpha
+ # Linux and Compaq Tru64 Unix objects are PIC.
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ lynxos*)
+ ;;
+ m88k*)
+ ;;
+ mvs*)
+ case $cc_basename in
+ cxx*)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ netbsd*)
+ ;;
+ osf3* | osf4* | osf5*)
+ case $cc_basename in
+ KCC*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ ;;
+ cxx*)
+ # Digital/Compaq C++
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ # Make sure the PIC flag is empty. It appears that all Alpha
+ # Linux and Compaq Tru64 Unix objects are PIC.
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ psos*)
+ ;;
+ solaris*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.2, 5.x and Centerline C++
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+ ;;
+ gcx*)
+ # Green Hills C++ Compiler
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ sunos4*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.x
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+ lcc*)
+ # Lucid
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ tandem*)
+ case $cc_basename in
+ NCC*)
+ # NonStop-UX NCC 3.20
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ case $cc_basename in
+ CC*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+ esac
+ ;;
+ vxworks*)
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+ ;;
+ esac
+ fi
+],
+[
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ fi
+ ;;
+
+ amigaos*)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the `-m68020' flag to GCC prevents building anything better,
+ # like `-m68040'.
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+ ;;
+
+ beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+
+ mingw* | pw32* | os2*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+ ;;
+
+ interix3*)
+ # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+ # Instead, we relocate shared libraries at runtime.
+ ;;
+
+ msdosdjgpp*)
+ # Just because we use GCC doesn't mean we suddenly get shared libraries
+ # on systems that don't support them.
+ _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+ enable_shared=no
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+ fi
+ ;;
+
+ hpux*)
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ esac
+ ;;
+
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ esac
+ else
+ # PORTME Check for flag to pass linker flags through the system compiler.
+ case $host_os in
+ aix*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ else
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+ darwin*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ case $cc_basename in
+ xlc*)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon'
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ ;;
+ esac
+ ;;
+
+ mingw* | pw32* | os2*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'
+ ;;
+
+ hpux9* | hpux10* | hpux11*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+ ;;
+ esac
+ # Is there a better lt_prog_compiler_static that works with the bundled CC?
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ # PIC (with -KPIC) is the default.
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+
+ newsos6)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ linux*)
+ case $cc_basename in
+ icc* | ecc*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
+ ;;
+ pgcc* | pgf77* | pgf90* | pgf95*)
+ # Portland Group compilers (*not* the Pentium gcc compiler,
+ # which looks to be a dead project)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+ ccc*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ # All Alpha code is PIC.
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+ esac
+ ;;
+
+ osf3* | osf4* | osf5*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ # All OSF/1 code is PIC.
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+
+ solaris*)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ case $cc_basename in
+ f77* | f90* | f95*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
+ esac
+ ;;
+
+ sunos4*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ sysv4 | sysv4.2uw2* | sysv4.3*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec ;then
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ fi
+ ;;
+
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ unicos*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+ ;;
+
+ uts4*)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+ ;;
+ esac
+ fi
+])
+AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)])
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then
+ AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works],
+ _LT_AC_TAGVAR(lt_prog_compiler_pic_works, $1),
+ [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [],
+ [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in
+ "" | " "*) ;;
+ *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;;
+ esac],
+ [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+ _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
+fi
+case $host_os in
+ # For platforms which do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])"
+ ;;
+esac
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_AC_TAGVAR(lt_prog_compiler_static, $1)\"
+AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
+ _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1),
+ $lt_tmp_static_flag,
+ [],
+ [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=])
+])
+
+
+# AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME])
+# ------------------------------------
+# See if the linker supports building shared libraries.
+AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS],
+[AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+ifelse([$1],[CXX],[
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ case $host_os in
+ aix4* | aix5*)
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to AIX nm, but means don't demangle with GNU nm
+ if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
+ else
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
+ fi
+ ;;
+ pw32*)
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
+ ;;
+ cygwin* | mingw*)
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]] /s/.* \([[^ ]]*\)/\1 DATA/;/^.* __nm__/s/^.* __nm__\([[^ ]]*\) [[^ ]]*/\1 DATA/;/^I /d;/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols'
+ ;;
+ *)
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ ;;
+ esac
+],[
+ runpath_var=
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=
+ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+ _LT_AC_TAGVAR(archive_cmds, $1)=
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)=
+ _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)=
+ _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)=
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+ _LT_AC_TAGVAR(thread_safe_flag_spec, $1)=
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown
+ _LT_AC_TAGVAR(hardcode_automatic, $1)=no
+ _LT_AC_TAGVAR(module_cmds, $1)=
+ _LT_AC_TAGVAR(module_expsym_cmds, $1)=
+ _LT_AC_TAGVAR(always_export_symbols, $1)=no
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ # include_expsyms should be a list of space-separated symbols to be *always*
+ # included in the symbol list
+ _LT_AC_TAGVAR(include_expsyms, $1)=
+ # exclude_expsyms can be an extended regexp of symbols to exclude
+ # it will be wrapped by ` (' and `)$', so one must not match beginning or
+ # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+ # as well as any symbol that contains `d'.
+ _LT_AC_TAGVAR(exclude_expsyms, $1)="_GLOBAL_OFFSET_TABLE_"
+ # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+ # platforms (ab)use it in PIC code, but their linkers get confused if
+ # the symbol is explicitly referenced. Since portable code cannot
+ # rely on this symbol name, it's probably fine to never include it in
+ # preloaded symbol tables.
+ extract_expsyms_cmds=
+ # Just being paranoid about ensuring that cc_basename is set.
+ _LT_CC_BASENAME([$compiler])
+ case $host_os in
+ cygwin* | mingw* | pw32*)
+ # FIXME: the MSVC++ port hasn't been tested in a loooong time
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ if test "$GCC" != yes; then
+ with_gnu_ld=no
+ fi
+ ;;
+ interix*)
+ # we just hope/assume this is gcc and not c89 (= MSVC++)
+ with_gnu_ld=yes
+ ;;
+ openbsd*)
+ with_gnu_ld=no
+ ;;
+ esac
+
+ _LT_AC_TAGVAR(ld_shlibs, $1)=yes
+ if test "$with_gnu_ld" = yes; then
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ wlarc='${wl}'
+
+ # Set some defaults for GNU ld with shared library support. These
+ # are reset later if shared libraries are not supported. Putting them
+ # here allows them to be overridden if necessary.
+ runpath_var=LD_RUN_PATH
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ else
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+ fi
+ supports_anon_versioning=no
+ case `$LD -v 2>/dev/null` in
+ *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
+ *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+ *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+ *\ 2.11.*) ;; # other 2.11 versions
+ *) supports_anon_versioning=yes ;;
+ esac
+
+ # See if GNU ld supports shared libraries.
+ case $host_os in
+ aix3* | aix4* | aix5*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test "$host_cpu" != ia64; then
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support. If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+ fi
+ ;;
+
+ amigaos*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+
+ # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
+ # that the semantics of dynamic libraries on AmigaOS, at least up
+ # to version 4, is to share data among multiple programs linked
+ # with the same dynamic library. Since this doesn't match the
+ # behavior of shared libraries on other platforms, we can't use
+ # them.
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+ # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+ # as there is no search path for DLLs.
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+ _LT_AC_TAGVAR(always_export_symbols, $1)=no
+ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols'
+
+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ # If the export-symbols file already is a .def file (1st line
+ # is EXPORTS), use it as is; otherwise, prepend...
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ interix3*)
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+ # Instead, shared libraries are loaded at an image base (0x10000000 by
+ # default) and relocated if they conflict, which is a slow very memory
+ # consuming and fragmenting process. To avoid this, we pick a random,
+ # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+ # time. Moving up from 0x10000000 also allows more sbrk(2) space.
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ ;;
+
+ linux*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ tmp_addflag=
+ case $cc_basename,$host_cpu in
+ pgcc*) # Portland Group C compiler
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+ tmp_addflag=' $pic_flag'
+ ;;
+ pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+ tmp_addflag=' $pic_flag -Mnomain' ;;
+ ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64
+ tmp_addflag=' -i_dynamic' ;;
+ efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64
+ tmp_addflag=' -i_dynamic -nofor_main' ;;
+ ifc* | ifort*) # Intel Fortran compiler
+ tmp_addflag=' -nofor_main' ;;
+ esac
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+ if test $supports_anon_versioning = yes; then
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ $echo "local: *; };" >> $output_objdir/$libname.ver~
+ $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+ fi
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+ wlarc=
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ fi
+ ;;
+
+ solaris*)
+ if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ cat <<EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+EOF
+ elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+ case `$LD -v 2>&1` in
+ *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*)
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+ ;;
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib'
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+
+ sunos4*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ wlarc=
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+
+ if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no; then
+ runpath_var=
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+ fi
+ else
+ # PORTME fill in a description of your system's linker (not GNU ld)
+ case $host_os in
+ aix3*)
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+ _LT_AC_TAGVAR(always_export_symbols, $1)=yes
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+ # Note: this linker hardcodes the directories in LIBPATH if there
+ # are no directories specified by -L.
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+ # Neither direct hardcoding nor static linking is supported with a
+ # broken collect2.
+ _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported
+ fi
+ ;;
+
+ aix4* | aix5*)
+ if test "$host_cpu" = ia64; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=""
+ else
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to AIX nm, but means don't demangle with GNU nm
+ if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
+ else
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
+ fi
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # need to do runtime linking.
+ case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*)
+ for ld_flag in $LDFLAGS; do
+ if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+ aix_use_runtimelinking=yes
+ break
+ fi
+ done
+ ;;
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ _LT_AC_TAGVAR(archive_cmds, $1)=''
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+
+ if test "$GCC" = yes; then
+ case $host_os in aix4.[[012]]|aix4.[[012]].*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`${CC} -print-prog-name=collect2`
+ if test -f "$collect2name" && \
+ strings "$collect2name" | grep resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ else
+ # We have old collect2
+ _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+ fi
+ ;;
+ esac
+ shared_flag='-shared'
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag="$shared_flag "'${wl}-G'
+ fi
+ else
+ # not using gcc
+ if test "$host_cpu" = ia64; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag='${wl}-G'
+ else
+ shared_flag='${wl}-bM:SRE'
+ fi
+ fi
+ fi
+
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to export.
+ _LT_AC_TAGVAR(always_export_symbols, $1)=yes
+ if test "$aix_use_runtimelinking" = yes; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok'
+ # Determine the default libpath from the value encoded in an empty executable.
+ _LT_AC_SYS_LIBPATH_AIX
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+ else
+ if test "$host_cpu" = ia64; then
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an empty executable.
+ _LT_AC_SYS_LIBPATH_AIX
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+ # Exported symbols can be pulled into shared objects from archives
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
+ # This is similar to how AIX traditionally builds its shared libraries.
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+ fi
+ fi
+ ;;
+
+ amigaos*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ # see comment about different semantics on the GNU ld section
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+
+ bsdi[[45]]*)
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=".dll"
+ # FIXME: Setting linknames here is a bad hack.
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
+ # The linker will automatically build a .lib file if we build a DLL.
+ _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true'
+ # FIXME: Should let the user specify the lib program.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs'
+ _LT_AC_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`'
+ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+ ;;
+
+ darwin* | rhapsody*)
+ case $host_os in
+ rhapsody* | darwin1.[[012]])
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress'
+ ;;
+ *) # Darwin 1.3 on
+ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ else
+ case ${MACOSX_DEPLOYMENT_TARGET} in
+ 10.[[012]])
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ ;;
+ 10.*)
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_automatic, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=''
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+ if test "$GCC" = yes ; then
+ output_verbose_link_cmd='echo'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+ _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ else
+ case $cc_basename in
+ xlc*)
+ output_verbose_link_cmd='echo'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
+ _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ ;;
+ *)
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ fi
+ ;;
+
+ dgux*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ freebsd1*)
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+
+ # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+ # support. Future versions do this automatically, but an explicit c++rt0.o
+ # does not break anything, and helps significantly (at the cost of a little
+ # extra space).
+ freebsd2.2*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+ freebsd2*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+ freebsd* | kfreebsd*-gnu | dragonfly*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ hpux9*)
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ ;;
+
+ hpux10*)
+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ if test "$with_gnu_ld" = no; then
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ fi
+ ;;
+
+ hpux11*)
+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+ case $host_cpu in
+ hppa*64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ else
+ case $host_cpu in
+ hppa*64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ fi
+ if test "$with_gnu_ld" = no; then
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ case $host_cpu in
+ hppa*64*|ia64*)
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+ *)
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ ;;
+ esac
+ fi
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir'
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ newsos6)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ openbsd*)
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ else
+ case $host_os in
+ openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ ;;
+ *)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ ;;
+ esac
+ fi
+ ;;
+
+ os2*)
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+ _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+ _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+ ;;
+
+ osf3*)
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ ;;
+
+ osf4* | osf5*) # as osf3* with the addition of -msym flag
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ else
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
+ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp'
+
+ # Both c and cxx compiler support -rpath directly
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ ;;
+
+ solaris*)
+ _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text'
+ if test "$GCC" = yes; then
+ wlarc='${wl}'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
+ else
+ wlarc=''
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ case $host_os in
+ solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+ *)
+ # The compiler driver will combine linker options so we
+ # cannot just pass the convience library names through
+ # without $wl, iff we do not link with $LD.
+ # Luckily, gcc supports the same syntax we need for Sun Studio.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ case $wlarc in
+ '')
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;;
+ *)
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;;
+ esac ;;
+ esac
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+ ;;
+
+ sunos4*)
+ if test "x$host_vendor" = xsequent; then
+ # Use $CC to link under sequent, because it throws in some extra .o
+ # files that make .init and .fini sections work.
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ sysv4)
+ case $host_vendor in
+ sni)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true???
+ ;;
+ siemens)
+ ## LD is ld it makes a PLAMLIB
+ ## CC just makes a GrossModule.
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ ;;
+ motorola)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
+ ;;
+ esac
+ runpath_var='LD_RUN_PATH'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ sysv4.3*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ _LT_AC_TAGVAR(ld_shlibs, $1)=yes
+ fi
+ ;;
+
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7*)
+ _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ runpath_var='LD_RUN_PATH'
+
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6*)
+ # Note: We can NOT use -z defs as we might desire, because we do not
+ # link with -lc, and that would cause any symbols used from libc to
+ # always be unresolved, which means just about no library would
+ # ever link correctly. If we're not using GNU ld we use -z text
+ # though, which does catch some bad symbols but isn't as heavy-handed
+ # as -z defs.
+ _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ uts4*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ *)
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ fi
+])
+AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)])
+test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in
+x|xyes)
+ # Assume -lc should be added
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
+
+ if test "$enable_shared" = yes && test "$GCC" = yes; then
+ case $_LT_AC_TAGVAR(archive_cmds, $1) in
+ *'~'*)
+ # FIXME: we may have to deal with multi-command sequences.
+ ;;
+ '$CC '*)
+ # Test whether the compiler implicitly links with -lc since on some
+ # systems, -lgcc has to come before -lc. If gcc already passes -lc
+ # to ld, don't add -lc before -lgcc.
+ AC_MSG_CHECKING([whether -lc should be explicitly linked in])
+ $rm conftest*
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)
+ pic_flag=$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1)
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=
+ if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1)
+ then
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ else
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
+ fi
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $rm conftest*
+ AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)])
+ ;;
+ esac
+ fi
+ ;;
+esac
+])# AC_LIBTOOL_PROG_LD_SHLIBS
+
+
+# _LT_AC_FILE_LTDLL_C
+# -------------------
+# Be careful that the start marker always follows a newline.
+AC_DEFUN([_LT_AC_FILE_LTDLL_C], [
+# /* ltdll.c starts here */
+# #define WIN32_LEAN_AND_MEAN
+# #include <windows.h>
+# #undef WIN32_LEAN_AND_MEAN
+# #include <stdio.h>
+#
+# #ifndef __CYGWIN__
+# # ifdef __CYGWIN32__
+# # define __CYGWIN__ __CYGWIN32__
+# # endif
+# #endif
+#
+# #ifdef __cplusplus
+# extern "C" {
+# #endif
+# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved);
+# #ifdef __cplusplus
+# }
+# #endif
+#
+# #ifdef __CYGWIN__
+# #include <cygwin/cygwin_dll.h>
+# DECLARE_CYGWIN_DLL( DllMain );
+# #endif
+# HINSTANCE __hDllInstance_base;
+#
+# BOOL APIENTRY
+# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
+# {
+# __hDllInstance_base = hInst;
+# return TRUE;
+# }
+# /* ltdll.c ends here */
+])# _LT_AC_FILE_LTDLL_C
+
+
+# _LT_AC_TAGVAR(VARNAME, [TAGNAME])
+# ---------------------------------
+AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])])
+
+
+# old names
+AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL])
+AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
+AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
+AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
+AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
+AC_DEFUN([AM_PROG_LD], [AC_PROG_LD])
+AC_DEFUN([AM_PROG_NM], [AC_PROG_NM])
+
+# This is just to silence aclocal about the macro not being used
+ifelse([AC_DISABLE_FAST_INSTALL])
+
+AC_DEFUN([LT_AC_PROG_GCJ],
+[AC_CHECK_TOOL(GCJ, gcj, no)
+ test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
+ AC_SUBST(GCJFLAGS)
+])
+
+AC_DEFUN([LT_AC_PROG_RC],
+[AC_CHECK_TOOL(RC, windres, no)
+])
+
+# NOTE: This macro has been submitted for inclusion into #
+# GNU Autoconf as AC_PROG_SED. When it is available in #
+# a released version of Autoconf we should remove this #
+# macro and use it instead. #
+# LT_AC_PROG_SED
+# --------------
+# Check for a fully-functional sed program, that truncates
+# as few characters as possible. Prefer GNU sed if found.
+AC_DEFUN([LT_AC_PROG_SED],
+[AC_MSG_CHECKING([for a sed that does not truncate output])
+AC_CACHE_VAL(lt_cv_path_SED,
+[# Loop through the user's path and test for sed and gsed.
+# Then use that list of sed's as ones to test for truncation.
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for lt_ac_prog in sed gsed; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
+ lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
+ fi
+ done
+ done
+done
+lt_ac_max=0
+lt_ac_count=0
+# Add /usr/xpg4/bin/sed as it is typically found on Solaris
+# along with /bin/sed that truncates output.
+for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
+ test ! -f $lt_ac_sed && continue
+ cat /dev/null > conftest.in
+ lt_ac_count=0
+ echo $ECHO_N "0123456789$ECHO_C" >conftest.in
+ # Check for GNU sed and select it if it is found.
+ if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
+ lt_cv_path_SED=$lt_ac_sed
+ break
+ fi
+ while true; do
+ cat conftest.in conftest.in >conftest.tmp
+ mv conftest.tmp conftest.in
+ cp conftest.in conftest.nl
+ echo >>conftest.nl
+ $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
+ cmp -s conftest.out conftest.nl || break
+ # 10000 chars as input seems more than enough
+ test $lt_ac_count -gt 10 && break
+ lt_ac_count=`expr $lt_ac_count + 1`
+ if test $lt_ac_count -gt $lt_ac_max; then
+ lt_ac_max=$lt_ac_count
+ lt_cv_path_SED=$lt_ac_sed
+ fi
+ done
+done
+])
+SED=$lt_cv_path_SED
+AC_MSG_RESULT([$SED])
+])
+
diff --git a/gsl-1.9/autogen.sh b/gsl-1.9/autogen.sh
new file mode 100755
index 0000000..2bd2597
--- /dev/null
+++ b/gsl-1.9/autogen.sh
@@ -0,0 +1,10 @@
+#! /bin/sh
+
+# Run this to generate all the auto-generated files needed by the GNU
+# configure program
+
+libtoolize --automake
+aclocal
+automake --add-missing --gnu
+autoconf
+echo "Now use ./configure --enable-maintainer-mode"
diff --git a/gsl-1.9/blas/ChangeLog b/gsl-1.9/blas/ChangeLog
new file mode 100644
index 0000000..4605079
--- /dev/null
+++ b/gsl-1.9/blas/ChangeLog
@@ -0,0 +1,73 @@
+2005-04-05 Brian Gough <bjg@network-theory.co.uk>
+
+ * blas.c (gsl_blas_ssyrk): test conformance against size correctly
+ allowing for transpose
+
+2004-12-21 Brian Gough <bjg@network-theory.co.uk>
+
+ * blas.c (gsl_blas_ssyrk): corrected K to be A->size2 instead of
+ A->size1
+ (gsl_blas_dsyrk): as above
+ (gsl_blas_csyrk): as above
+ (gsl_blas_zsyrk): as above
+ (gsl_blas_cherk): as above
+ (gsl_blas_zherk): as above
+
+Mon Mar 18 19:39:34 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * blas.c (gsl_blas_zgemv): added missing case of CblasConjTrans to
+ zgemv and cgemv
+
+Mon Feb 18 20:01:49 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_blas_types.h: removed unneeded header files
+
+Sat Apr 28 15:25:16 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * blas.c: cast size_t to int for calls to CBLAS
+
+Mon Mar 19 17:04:47 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * split cblas routines out into a separate directory and library
+ which can be used as a cblas outside gsl
+
+Tue Sep 19 19:07:44 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * test_blas_raw.c: added tests for dtbsv
+
+Sat Sep 16 20:27:18 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * blas.c: use GSL_ERROR macro to signal errors
+
+Fri Sep 15 20:04:28 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * source_iamax_r.h source_iamax_c.h: initialize max index to zero
+ before loop, so that the result is defined for a null vector
+
+Mon May 22 12:27:47 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * Makefile.am (lib_LTLIBRARIES): renamed libgslblasnative.la to
+ libgslblas.la since "native" is ambiguous (suggests
+ system-supplied blas).
+
+ * test_blas_raw.c (test_L1): added test to cover for initial
+ run-in of odd lengths on loop unrolling in saxpy.
+
+Tue Mar 21 14:22:30 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * test_blas_raw.c (test_L1): test norms for zero vectors
+
+ * source_nrm2_r.h, source_nrm2_r.h: skip zero elements of array,
+ as in original BLAS, fixes bug for vectors with leading zeros.
+
+Tue Mar 7 19:05:43 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * Makefile.am (noinst_LTLIBRARIES): with libtool blasnative and
+ blascblas layers need to be installed as additional libraries, not
+ in libgsl.a.
+
+Fri Oct 1 15:50:14 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * blas.c: make use of "trailing dimension" in matrix struct to
+ support LDA arguments for level 2 BLAS.
+
diff --git a/gsl-1.9/blas/Makefile.am b/gsl-1.9/blas/Makefile.am
new file mode 100644
index 0000000..33ee747
--- /dev/null
+++ b/gsl-1.9/blas/Makefile.am
@@ -0,0 +1,14 @@
+noinst_LTLIBRARIES = libgslblas.la
+
+pkginclude_HEADERS = gsl_blas.h gsl_blas_types.h
+
+INCLUDES= -I$(top_srcdir)
+
+libgslblas_la_SOURCES = blas.c
+
+#check_PROGRAMS = test
+#TESTS = test
+#test_LDADD = libgslblas.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la
+#test_SOURCES = test_blas_raw.c test_cases.c test_cases.h
+
+
diff --git a/gsl-1.9/blas/Makefile.in b/gsl-1.9/blas/Makefile.in
new file mode 100644
index 0000000..e813d3c
--- /dev/null
+++ b/gsl-1.9/blas/Makefile.in
@@ -0,0 +1,453 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = blas
+DIST_COMMON = $(pkginclude_HEADERS) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in ChangeLog TODO
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgslblas_la_LIBADD =
+am_libgslblas_la_OBJECTS = blas.lo
+libgslblas_la_OBJECTS = $(am_libgslblas_la_OBJECTS)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgslblas_la_SOURCES)
+DIST_SOURCES = $(libgslblas_la_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libgslblas.la
+pkginclude_HEADERS = gsl_blas.h gsl_blas_types.h
+INCLUDES = -I$(top_srcdir)
+libgslblas_la_SOURCES = blas.c
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps blas/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps blas/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgslblas.la: $(libgslblas_la_OBJECTS) $(libgslblas_la_DEPENDENCIES)
+ $(LINK) $(libgslblas_la_LDFLAGS) $(libgslblas_la_OBJECTS) $(libgslblas_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+ clean-libtool clean-noinstLTLIBRARIES ctags distclean \
+ distclean-compile distclean-generic distclean-libtool \
+ distclean-tags distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-exec \
+ install-exec-am install-info install-info-am install-man \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkgincludeHEADERS
+
+
+#check_PROGRAMS = test
+#TESTS = test
+#test_LDADD = libgslblas.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la
+#test_SOURCES = test_blas_raw.c test_cases.c test_cases.h
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/blas/TODO b/gsl-1.9/blas/TODO
new file mode 100644
index 0000000..ffc34e5
--- /dev/null
+++ b/gsl-1.9/blas/TODO
@@ -0,0 +1,9 @@
+
+* We need a test suite for this directory!
+
+* Verify that we support the full CBLAS interface and that the GSL
+CBLAS library can be used standalone
+
+* Check that substituting the Reference Blas, ATLAS, and Intel BLAS
+all work correctly
+
diff --git a/gsl-1.9/blas/blas.c b/gsl-1.9/blas/blas.c
new file mode 100644
index 0000000..56ca963
--- /dev/null
+++ b/gsl-1.9/blas/blas.c
@@ -0,0 +1,2190 @@
+/* blas/blas.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 Gerard Jungman & Brian
+ * Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* GSL implementation of BLAS operations for vectors and dense
+ * matrices. Note that GSL native storage is row-major. */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_cblas.h>
+#include <gsl/gsl_cblas.h>
+#include <gsl/gsl_blas_types.h>
+#include <gsl/gsl_blas.h>
+
+/* ========================================================================
+ * Level 1
+ * ========================================================================
+ */
+
+/* CBLAS defines vector sizes in terms of int. GSL defines sizes in
+ terms of size_t, so we need to convert these into integers. There
+ is the possibility of overflow here. FIXME: Maybe this could be
+ caught */
+
+#define INT(X) ((int)(X))
+
+int
+gsl_blas_sdsdot (float alpha, const gsl_vector_float * X,
+ const gsl_vector_float * Y, float *result)
+{
+ if (X->size == Y->size)
+ {
+ *result =
+ cblas_sdsdot (INT (X->size), alpha, X->data, INT (X->stride), Y->data,
+ INT (Y->stride));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+int
+gsl_blas_dsdot (const gsl_vector_float * X, const gsl_vector_float * Y,
+ double *result)
+{
+ if (X->size == Y->size)
+ {
+ *result =
+ cblas_dsdot (INT (X->size), X->data, INT (X->stride), Y->data,
+ INT (Y->stride));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+int
+gsl_blas_sdot (const gsl_vector_float * X, const gsl_vector_float * Y,
+ float *result)
+{
+ if (X->size == Y->size)
+ {
+ *result =
+ cblas_sdot (INT (X->size), X->data, INT (X->stride), Y->data,
+ INT (Y->stride));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+int
+gsl_blas_ddot (const gsl_vector * X, const gsl_vector * Y, double *result)
+{
+ if (X->size == Y->size)
+ {
+ *result =
+ cblas_ddot (INT (X->size), X->data, INT (X->stride), Y->data,
+ INT (Y->stride));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+
+int
+gsl_blas_cdotu (const gsl_vector_complex_float * X,
+ const gsl_vector_complex_float * Y, gsl_complex_float * dotu)
+{
+ if (X->size == Y->size)
+ {
+ cblas_cdotu_sub (INT (X->size), X->data, INT (X->stride), Y->data,
+ INT (Y->stride), GSL_COMPLEX_P (dotu));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+
+int
+gsl_blas_cdotc (const gsl_vector_complex_float * X,
+ const gsl_vector_complex_float * Y, gsl_complex_float * dotc)
+{
+ if (X->size == Y->size)
+ {
+ cblas_cdotc_sub (INT (X->size), X->data, INT (X->stride), Y->data,
+ INT (Y->stride), GSL_COMPLEX_P (dotc));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+
+int
+gsl_blas_zdotu (const gsl_vector_complex * X, const gsl_vector_complex * Y,
+ gsl_complex * dotu)
+{
+ if (X->size == Y->size)
+ {
+ cblas_zdotu_sub (INT (X->size), X->data, INT (X->stride), Y->data,
+ INT (Y->stride), GSL_COMPLEX_P (dotu));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+
+int
+gsl_blas_zdotc (const gsl_vector_complex * X, const gsl_vector_complex * Y,
+ gsl_complex * dotc)
+{
+ if (X->size == Y->size)
+ {
+ cblas_zdotc_sub (INT (X->size), X->data, INT (X->stride), Y->data,
+ INT (Y->stride), GSL_COMPLEX_P (dotc));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+/* Norms of vectors */
+
+float
+gsl_blas_snrm2 (const gsl_vector_float * X)
+{
+ return cblas_snrm2 (INT (X->size), X->data, INT (X->stride));
+}
+
+double
+gsl_blas_dnrm2 (const gsl_vector * X)
+{
+ return cblas_dnrm2 (INT (X->size), X->data, INT (X->stride));
+}
+
+float
+gsl_blas_scnrm2 (const gsl_vector_complex_float * X)
+{
+ return cblas_scnrm2 (INT (X->size), X->data, INT (X->stride));
+}
+
+double
+gsl_blas_dznrm2 (const gsl_vector_complex * X)
+{
+ return cblas_dznrm2 (INT (X->size), X->data, INT (X->stride));
+}
+
+/* Absolute sums of vectors */
+
+float
+gsl_blas_sasum (const gsl_vector_float * X)
+{
+ return cblas_sasum (INT (X->size), X->data, INT (X->stride));
+}
+
+double
+gsl_blas_dasum (const gsl_vector * X)
+{
+ return cblas_dasum (INT (X->size), X->data, INT (X->stride));
+}
+
+float
+gsl_blas_scasum (const gsl_vector_complex_float * X)
+{
+ return cblas_scasum (INT (X->size), X->data, INT (X->stride));
+}
+
+double
+gsl_blas_dzasum (const gsl_vector_complex * X)
+{
+ return cblas_dzasum (INT (X->size), X->data, INT (X->stride));
+}
+
+/* Maximum elements of vectors */
+
+CBLAS_INDEX_t
+gsl_blas_isamax (const gsl_vector_float * X)
+{
+ return cblas_isamax (INT (X->size), X->data, INT (X->stride));
+}
+
+CBLAS_INDEX_t
+gsl_blas_idamax (const gsl_vector * X)
+{
+ return cblas_idamax (INT (X->size), X->data, INT (X->stride));
+}
+
+CBLAS_INDEX_t
+gsl_blas_icamax (const gsl_vector_complex_float * X)
+{
+ return cblas_icamax (INT (X->size), X->data, INT (X->stride));
+}
+
+CBLAS_INDEX_t
+gsl_blas_izamax (const gsl_vector_complex * X)
+{
+ return cblas_izamax (INT (X->size), X->data, INT (X->stride));
+}
+
+
+/* Swap vectors */
+
+int
+gsl_blas_sswap (gsl_vector_float * X, gsl_vector_float * Y)
+{
+ if (X->size == Y->size)
+ {
+ cblas_sswap (INT (X->size), X->data, INT (X->stride), Y->data,
+ INT (Y->stride));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+int
+gsl_blas_dswap (gsl_vector * X, gsl_vector * Y)
+{
+ if (X->size == Y->size)
+ {
+ cblas_dswap (INT (X->size), X->data, INT (X->stride), Y->data,
+ INT (Y->stride));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ };
+}
+
+int
+gsl_blas_cswap (gsl_vector_complex_float * X, gsl_vector_complex_float * Y)
+{
+ if (X->size == Y->size)
+ {
+ cblas_cswap (INT (X->size), X->data, INT (X->stride), Y->data,
+ INT (Y->stride));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+int
+gsl_blas_zswap (gsl_vector_complex * X, gsl_vector_complex * Y)
+{
+ if (X->size == Y->size)
+ {
+ cblas_zswap (INT (X->size), X->data, INT (X->stride), Y->data,
+ INT (Y->stride));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+
+/* Copy vectors */
+
+int
+gsl_blas_scopy (const gsl_vector_float * X, gsl_vector_float * Y)
+{
+ if (X->size == Y->size)
+ {
+ cblas_scopy (INT (X->size), X->data, INT (X->stride), Y->data,
+ INT (Y->stride));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+int
+gsl_blas_dcopy (const gsl_vector * X, gsl_vector * Y)
+{
+ if (X->size == Y->size)
+ {
+ cblas_dcopy (INT (X->size), X->data, INT (X->stride), Y->data,
+ INT (Y->stride));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+int
+gsl_blas_ccopy (const gsl_vector_complex_float * X,
+ gsl_vector_complex_float * Y)
+{
+ if (X->size == Y->size)
+ {
+ cblas_ccopy (INT (X->size), X->data, INT (X->stride), Y->data,
+ INT (Y->stride));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+int
+gsl_blas_zcopy (const gsl_vector_complex * X, gsl_vector_complex * Y)
+{
+ if (X->size == Y->size)
+ {
+ cblas_zcopy (INT (X->size), X->data, INT (X->stride), Y->data,
+ INT (Y->stride));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+
+/* Compute Y = alpha X + Y */
+
+int
+gsl_blas_saxpy (float alpha, const gsl_vector_float * X, gsl_vector_float * Y)
+{
+ if (X->size == Y->size)
+ {
+ cblas_saxpy (INT (X->size), alpha, X->data, INT (X->stride), Y->data,
+ INT (Y->stride));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+int
+gsl_blas_daxpy (double alpha, const gsl_vector * X, gsl_vector * Y)
+{
+ if (X->size == Y->size)
+ {
+ cblas_daxpy (INT (X->size), alpha, X->data, INT (X->stride), Y->data,
+ INT (Y->stride));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+int
+gsl_blas_caxpy (const gsl_complex_float alpha,
+ const gsl_vector_complex_float * X,
+ gsl_vector_complex_float * Y)
+{
+ if (X->size == Y->size)
+ {
+ cblas_caxpy (INT (X->size), GSL_COMPLEX_P (&alpha), X->data,
+ INT (X->stride), Y->data, INT (Y->stride));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+int
+gsl_blas_zaxpy (const gsl_complex alpha, const gsl_vector_complex * X,
+ gsl_vector_complex * Y)
+{
+ if (X->size == Y->size)
+ {
+ cblas_zaxpy (INT (X->size), GSL_COMPLEX_P (&alpha), X->data,
+ INT (X->stride), Y->data, INT (Y->stride));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+/* Generate rotation */
+
+int
+gsl_blas_srotg (float a[], float b[], float c[], float s[])
+{
+ cblas_srotg (a, b, c, s);
+ return GSL_SUCCESS;
+}
+
+int
+gsl_blas_drotg (double a[], double b[], double c[], double s[])
+{
+ cblas_drotg (a, b, c, s);
+ return GSL_SUCCESS;
+}
+
+/* Apply rotation to vectors */
+
+int
+gsl_blas_srot (gsl_vector_float * X, gsl_vector_float * Y, float c, float s)
+{
+ if (X->size == Y->size)
+ {
+ cblas_srot (INT (X->size), X->data, INT (X->stride), Y->data,
+ INT (Y->stride), c, s);
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+int
+gsl_blas_drot (gsl_vector * X, gsl_vector * Y, const double c, const double s)
+{
+ if (X->size == Y->size)
+ {
+ cblas_drot (INT (X->size), X->data, INT (X->stride), Y->data,
+ INT (Y->stride), c, s);
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+
+/* Generate modified rotation */
+
+int
+gsl_blas_srotmg (float d1[], float d2[], float b1[], float b2, float P[])
+{
+ cblas_srotmg (d1, d2, b1, b2, P);
+ return GSL_SUCCESS;
+}
+
+int
+gsl_blas_drotmg (double d1[], double d2[], double b1[], double b2, double P[])
+{
+ cblas_drotmg (d1, d2, b1, b2, P);
+ return GSL_SUCCESS;
+}
+
+
+/* Apply modified rotation */
+
+int
+gsl_blas_srotm (gsl_vector_float * X, gsl_vector_float * Y, const float P[])
+{
+ if (X->size == Y->size)
+ {
+ cblas_srotm (INT (X->size), X->data, INT (X->stride), Y->data,
+ INT (Y->stride), P);
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+int
+gsl_blas_drotm (gsl_vector * X, gsl_vector * Y, const double P[])
+{
+ if (X->size != Y->size)
+ {
+ cblas_drotm (INT (X->size), X->data, INT (X->stride), Y->data,
+ INT (Y->stride), P);
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+
+/* Scale vector */
+
+void
+gsl_blas_sscal (float alpha, gsl_vector_float * X)
+{
+ cblas_sscal (INT (X->size), alpha, X->data, INT (X->stride));
+}
+
+void
+gsl_blas_dscal (double alpha, gsl_vector * X)
+{
+ cblas_dscal (INT (X->size), alpha, X->data, INT (X->stride));
+}
+
+void
+gsl_blas_cscal (const gsl_complex_float alpha, gsl_vector_complex_float * X)
+{
+ cblas_cscal (INT (X->size), GSL_COMPLEX_P (&alpha), X->data,
+ INT (X->stride));
+}
+
+void
+gsl_blas_zscal (const gsl_complex alpha, gsl_vector_complex * X)
+{
+ cblas_zscal (INT (X->size), GSL_COMPLEX_P (&alpha), X->data,
+ INT (X->stride));
+}
+
+void
+gsl_blas_csscal (float alpha, gsl_vector_complex_float * X)
+{
+ cblas_csscal (INT (X->size), alpha, X->data, INT (X->stride));
+}
+
+void
+gsl_blas_zdscal (double alpha, gsl_vector_complex * X)
+{
+ cblas_zdscal (INT (X->size), alpha, X->data, INT (X->stride));
+}
+
+/* ===========================================================================
+ * Level 2
+ * ===========================================================================
+ */
+
+/* GEMV */
+
+int
+gsl_blas_sgemv (CBLAS_TRANSPOSE_t TransA, float alpha,
+ const gsl_matrix_float * A, const gsl_vector_float * X,
+ float beta, gsl_vector_float * Y)
+{
+ const size_t M = A->size1;
+ const size_t N = A->size2;
+
+ if ((TransA == CblasNoTrans && N == X->size && M == Y->size)
+ || (TransA == CblasTrans && M == X->size && N == Y->size))
+ {
+ cblas_sgemv (CblasRowMajor, TransA, INT (M), INT (N), alpha, A->data,
+ INT (A->tda), X->data, INT (X->stride), beta, Y->data,
+ INT (Y->stride));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+
+int
+gsl_blas_dgemv (CBLAS_TRANSPOSE_t TransA, double alpha, const gsl_matrix * A,
+ const gsl_vector * X, double beta, gsl_vector * Y)
+{
+ const size_t M = A->size1;
+ const size_t N = A->size2;
+
+ if ((TransA == CblasNoTrans && N == X->size && M == Y->size)
+ || (TransA == CblasTrans && M == X->size && N == Y->size))
+ {
+ cblas_dgemv (CblasRowMajor, TransA, INT (M), INT (N), alpha, A->data,
+ INT (A->tda), X->data, INT (X->stride), beta, Y->data,
+ INT (Y->stride));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+
+int
+gsl_blas_cgemv (CBLAS_TRANSPOSE_t TransA, const gsl_complex_float alpha,
+ const gsl_matrix_complex_float * A,
+ const gsl_vector_complex_float * X,
+ const gsl_complex_float beta, gsl_vector_complex_float * Y)
+{
+ const size_t M = A->size1;
+ const size_t N = A->size2;
+
+ if ((TransA == CblasNoTrans && N == X->size && M == Y->size)
+ || (TransA == CblasTrans && M == X->size && N == Y->size)
+ || (TransA == CblasConjTrans && M == X->size && N == Y->size))
+ {
+ cblas_cgemv (CblasRowMajor, TransA, INT (M), INT (N),
+ GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), X->data,
+ INT (X->stride), GSL_COMPLEX_P (&beta), Y->data,
+ INT (Y->stride));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+
+int
+gsl_blas_zgemv (CBLAS_TRANSPOSE_t TransA, const gsl_complex alpha,
+ const gsl_matrix_complex * A, const gsl_vector_complex * X,
+ const gsl_complex beta, gsl_vector_complex * Y)
+{
+ const size_t M = A->size1;
+ const size_t N = A->size2;
+
+ if ((TransA == CblasNoTrans && N == X->size && M == Y->size)
+ || (TransA == CblasTrans && M == X->size && N == Y->size)
+ || (TransA == CblasConjTrans && M == X->size && N == Y->size))
+ {
+ cblas_zgemv (CblasRowMajor, TransA, INT (M), INT (N),
+ GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), X->data,
+ INT (X->stride), GSL_COMPLEX_P (&beta), Y->data,
+ INT (Y->stride));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+
+
+/* HEMV */
+
+int
+gsl_blas_chemv (CBLAS_UPLO_t Uplo, const gsl_complex_float alpha,
+ const gsl_matrix_complex_float * A,
+ const gsl_vector_complex_float * X,
+ const gsl_complex_float beta, gsl_vector_complex_float * Y)
+{
+ const size_t M = A->size1;
+ const size_t N = A->size2;
+
+ if (M != N)
+ {
+ GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
+ }
+ else if (N != X->size || N != Y->size)
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+
+ cblas_chemv (CblasRowMajor, Uplo, INT (N), GSL_COMPLEX_P (&alpha), A->data,
+ INT (A->tda), X->data, INT (X->stride), GSL_COMPLEX_P (&beta),
+ Y->data, INT (Y->stride));
+ return GSL_SUCCESS;
+}
+
+int
+gsl_blas_zhemv (CBLAS_UPLO_t Uplo, const gsl_complex alpha,
+ const gsl_matrix_complex * A, const gsl_vector_complex * X,
+ const gsl_complex beta, gsl_vector_complex * Y)
+{
+ const size_t M = A->size1;
+ const size_t N = A->size2;
+
+ if (M != N)
+ {
+ GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
+ }
+ else if (N != X->size || N != Y->size)
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+
+ cblas_zhemv (CblasRowMajor, Uplo, INT (N), GSL_COMPLEX_P (&alpha), A->data,
+ INT (A->tda), X->data, INT (X->stride), GSL_COMPLEX_P (&beta),
+ Y->data, INT (Y->stride));
+ return GSL_SUCCESS;
+}
+
+
+/* SYMV */
+
+int
+gsl_blas_ssymv (CBLAS_UPLO_t Uplo, float alpha, const gsl_matrix_float * A,
+ const gsl_vector_float * X, float beta, gsl_vector_float * Y)
+{
+ const size_t M = A->size1;
+ const size_t N = A->size2;
+
+ if (M != N)
+ {
+ GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
+ }
+ else if (N != X->size || N != Y->size)
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+
+ cblas_ssymv (CblasRowMajor, Uplo, INT (N), alpha, A->data, INT (A->tda),
+ X->data, INT (X->stride), beta, Y->data, INT (Y->stride));
+ return GSL_SUCCESS;
+}
+
+int
+gsl_blas_dsymv (CBLAS_UPLO_t Uplo, double alpha, const gsl_matrix * A,
+ const gsl_vector * X, double beta, gsl_vector * Y)
+{
+ const size_t M = A->size1;
+ const size_t N = A->size2;
+
+ if (M != N)
+ {
+ GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
+ }
+ else if (N != X->size || N != Y->size)
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+
+ cblas_dsymv (CblasRowMajor, Uplo, INT (N), alpha, A->data, INT (A->tda),
+ X->data, INT (X->stride), beta, Y->data, INT (Y->stride));
+ return GSL_SUCCESS;
+}
+
+
+/* TRMV */
+
+int
+gsl_blas_strmv (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t TransA,
+ CBLAS_DIAG_t Diag, const gsl_matrix_float * A,
+ gsl_vector_float * X)
+{
+ const size_t M = A->size1;
+ const size_t N = A->size2;
+
+ if (M != N)
+ {
+ GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
+ }
+ else if (N != X->size)
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+
+ cblas_strmv (CblasRowMajor, Uplo, TransA, Diag, INT (N), A->data,
+ INT (A->tda), X->data, INT (X->stride));
+ return GSL_SUCCESS;
+}
+
+
+int
+gsl_blas_dtrmv (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t TransA,
+ CBLAS_DIAG_t Diag, const gsl_matrix * A, gsl_vector * X)
+{
+ const size_t M = A->size1;
+ const size_t N = A->size2;
+
+ if (M != N)
+ {
+ GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
+ }
+ else if (N != X->size)
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+
+ cblas_dtrmv (CblasRowMajor, Uplo, TransA, Diag, INT (N), A->data,
+ INT (A->tda), X->data, INT (X->stride));
+ return GSL_SUCCESS;
+}
+
+
+int
+gsl_blas_ctrmv (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t TransA,
+ CBLAS_DIAG_t Diag, const gsl_matrix_complex_float * A,
+ gsl_vector_complex_float * X)
+{
+ const size_t M = A->size1;
+ const size_t N = A->size2;
+
+ if (M != N)
+ {
+ GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
+ }
+ else if (N != X->size)
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+
+ cblas_ctrmv (CblasRowMajor, Uplo, TransA, Diag, INT (N), A->data,
+ INT (A->tda), X->data, INT (X->stride));
+ return GSL_SUCCESS;
+}
+
+
+int
+gsl_blas_ztrmv (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t TransA,
+ CBLAS_DIAG_t Diag, const gsl_matrix_complex * A,
+ gsl_vector_complex * X)
+{
+ const size_t M = A->size1;
+ const size_t N = A->size2;
+
+ if (M != N)
+ {
+ GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
+ }
+ else if (N != X->size)
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+
+ cblas_ztrmv (CblasRowMajor, Uplo, TransA, Diag, INT (N), A->data,
+ INT (A->tda), X->data, INT (X->stride));
+ return GSL_SUCCESS;
+}
+
+
+/* TRSV */
+
+int
+gsl_blas_strsv (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t TransA,
+ CBLAS_DIAG_t Diag, const gsl_matrix_float * A,
+ gsl_vector_float * X)
+{
+ const size_t M = A->size1;
+ const size_t N = A->size2;
+
+ if (M != N)
+ {
+ GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
+ }
+ else if (N != X->size)
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+
+ cblas_strsv (CblasRowMajor, Uplo, TransA, Diag, INT (N), A->data,
+ INT (A->tda), X->data, INT (X->stride));
+ return GSL_SUCCESS;
+}
+
+
+int
+gsl_blas_dtrsv (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t TransA,
+ CBLAS_DIAG_t Diag, const gsl_matrix * A, gsl_vector * X)
+{
+ const size_t M = A->size1;
+ const size_t N = A->size2;
+
+ if (M != N)
+ {
+ GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
+ }
+ else if (N != X->size)
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+
+ cblas_dtrsv (CblasRowMajor, Uplo, TransA, Diag, INT (N), A->data,
+ INT (A->tda), X->data, INT (X->stride));
+ return GSL_SUCCESS;
+}
+
+
+int
+gsl_blas_ctrsv (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t TransA,
+ CBLAS_DIAG_t Diag, const gsl_matrix_complex_float * A,
+ gsl_vector_complex_float * X)
+{
+ const size_t M = A->size1;
+ const size_t N = A->size2;
+
+ if (M != N)
+ {
+ GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
+ }
+ else if (N != X->size)
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+
+ cblas_ctrsv (CblasRowMajor, Uplo, TransA, Diag, INT (N), A->data,
+ INT (A->tda), X->data, INT (X->stride));
+ return GSL_SUCCESS;
+}
+
+
+int
+gsl_blas_ztrsv (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t TransA,
+ CBLAS_DIAG_t Diag, const gsl_matrix_complex * A,
+ gsl_vector_complex * X)
+{
+ const size_t M = A->size1;
+ const size_t N = A->size2;
+
+ if (M != N)
+ {
+ GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
+ }
+ else if (N != X->size)
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+
+ cblas_ztrsv (CblasRowMajor, Uplo, TransA, Diag, INT (N), A->data,
+ INT (A->tda), X->data, INT (X->stride));
+ return GSL_SUCCESS;
+}
+
+
+/* GER */
+
+int
+gsl_blas_sger (float alpha, const gsl_vector_float * X,
+ const gsl_vector_float * Y, gsl_matrix_float * A)
+{
+ const size_t M = A->size1;
+ const size_t N = A->size2;
+
+ if (X->size == M && Y->size == N)
+ {
+ cblas_sger (CblasRowMajor, INT (M), INT (N), alpha, X->data,
+ INT (X->stride), Y->data, INT (Y->stride), A->data,
+ INT (A->tda));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+
+int
+gsl_blas_dger (double alpha, const gsl_vector * X, const gsl_vector * Y,
+ gsl_matrix * A)
+{
+ const size_t M = A->size1;
+ const size_t N = A->size2;
+
+ if (X->size == M && Y->size == N)
+ {
+ cblas_dger (CblasRowMajor, INT (M), INT (N), alpha, X->data,
+ INT (X->stride), Y->data, INT (Y->stride), A->data,
+ INT (A->tda));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+
+/* GERU */
+
+int
+gsl_blas_cgeru (const gsl_complex_float alpha,
+ const gsl_vector_complex_float * X,
+ const gsl_vector_complex_float * Y,
+ gsl_matrix_complex_float * A)
+{
+ const size_t M = A->size1;
+ const size_t N = A->size2;
+
+ if (X->size == M && Y->size == N)
+ {
+ cblas_cgeru (CblasRowMajor, INT (M), INT (N), GSL_COMPLEX_P (&alpha),
+ X->data, INT (X->stride), Y->data, INT (Y->stride),
+ A->data, INT (A->tda));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+int
+gsl_blas_zgeru (const gsl_complex alpha, const gsl_vector_complex * X,
+ const gsl_vector_complex * Y, gsl_matrix_complex * A)
+{
+ const size_t M = A->size1;
+ const size_t N = A->size2;
+
+ if (X->size == M && Y->size == N)
+ {
+ cblas_zgeru (CblasRowMajor, INT (M), INT (N), GSL_COMPLEX_P (&alpha),
+ X->data, INT (X->stride), Y->data, INT (Y->stride),
+ A->data, INT (A->tda));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+
+/* GERC */
+
+int
+gsl_blas_cgerc (const gsl_complex_float alpha,
+ const gsl_vector_complex_float * X,
+ const gsl_vector_complex_float * Y,
+ gsl_matrix_complex_float * A)
+{
+ const size_t M = A->size1;
+ const size_t N = A->size2;
+
+ if (X->size == M && Y->size == N)
+ {
+ cblas_cgerc (CblasRowMajor, INT (M), INT (N), GSL_COMPLEX_P (&alpha),
+ X->data, INT (X->stride), Y->data, INT (Y->stride),
+ A->data, INT (A->tda));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+
+int
+gsl_blas_zgerc (const gsl_complex alpha, const gsl_vector_complex * X,
+ const gsl_vector_complex * Y, gsl_matrix_complex * A)
+{
+ const size_t M = A->size1;
+ const size_t N = A->size2;
+
+ if (X->size == M && Y->size == N)
+ {
+ cblas_zgerc (CblasRowMajor, INT (M), INT (N), GSL_COMPLEX_P (&alpha),
+ X->data, INT (X->stride), Y->data, INT (Y->stride),
+ A->data, INT (A->tda));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+/* HER */
+
+int
+gsl_blas_cher (CBLAS_UPLO_t Uplo, float alpha,
+ const gsl_vector_complex_float * X,
+ gsl_matrix_complex_float * A)
+{
+ const size_t M = A->size1;
+ const size_t N = A->size2;
+
+ if (M != N)
+ {
+ GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
+ }
+ else if (X->size != N)
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+
+ cblas_cher (CblasRowMajor, Uplo, INT (M), alpha, X->data, INT (X->stride),
+ A->data, INT (A->tda));
+ return GSL_SUCCESS;
+}
+
+
+int
+gsl_blas_zher (CBLAS_UPLO_t Uplo, double alpha, const gsl_vector_complex * X,
+ gsl_matrix_complex * A)
+{
+ const size_t M = A->size1;
+ const size_t N = A->size2;
+
+ if (M != N)
+ {
+ GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
+ }
+ else if (X->size != N)
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+
+ cblas_zher (CblasRowMajor, Uplo, INT (N), alpha, X->data, INT (X->stride),
+ A->data, INT (A->tda));
+ return GSL_SUCCESS;
+}
+
+
+/* HER2 */
+
+int
+gsl_blas_cher2 (CBLAS_UPLO_t Uplo, const gsl_complex_float alpha,
+ const gsl_vector_complex_float * X,
+ const gsl_vector_complex_float * Y,
+ gsl_matrix_complex_float * A)
+{
+ const size_t M = A->size1;
+ const size_t N = A->size2;
+
+ if (M != N)
+ {
+ GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
+ }
+ else if (X->size != N || Y->size != N)
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+
+ cblas_cher2 (CblasRowMajor, Uplo, INT (N), GSL_COMPLEX_P (&alpha), X->data,
+ INT (X->stride), Y->data, INT (Y->stride), A->data,
+ INT (A->tda));
+ return GSL_SUCCESS;
+}
+
+
+int
+gsl_blas_zher2 (CBLAS_UPLO_t Uplo, const gsl_complex alpha,
+ const gsl_vector_complex * X, const gsl_vector_complex * Y,
+ gsl_matrix_complex * A)
+{
+ const size_t M = A->size1;
+ const size_t N = A->size2;
+
+ if (M != N)
+ {
+ GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
+ }
+ else if (X->size != N || Y->size != N)
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+
+ cblas_zher2 (CblasRowMajor, Uplo, INT (N), GSL_COMPLEX_P (&alpha), X->data,
+ INT (X->stride), Y->data, INT (Y->stride), A->data,
+ INT (A->tda));
+ return GSL_SUCCESS;
+}
+
+
+/* SYR */
+
+int
+gsl_blas_ssyr (CBLAS_UPLO_t Uplo, float alpha, const gsl_vector_float * X,
+ gsl_matrix_float * A)
+{
+ const size_t M = A->size1;
+ const size_t N = A->size2;
+
+ if (M != N)
+ {
+ GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
+ }
+ else if (X->size != N)
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+
+ cblas_ssyr (CblasRowMajor, Uplo, INT (N), alpha, X->data, INT (X->stride),
+ A->data, INT (A->tda));
+ return GSL_SUCCESS;
+}
+
+
+int
+gsl_blas_dsyr (CBLAS_UPLO_t Uplo, double alpha, const gsl_vector * X,
+ gsl_matrix * A)
+{
+ const size_t M = A->size1;
+ const size_t N = A->size2;
+
+ if (M != N)
+ {
+ GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
+ }
+ else if (X->size != N)
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+
+ cblas_dsyr (CblasRowMajor, Uplo, INT (N), alpha, X->data, INT (X->stride),
+ A->data, INT (A->tda));
+ return GSL_SUCCESS;
+}
+
+
+/* SYR2 */
+
+int
+gsl_blas_ssyr2 (CBLAS_UPLO_t Uplo, float alpha, const gsl_vector_float * X,
+ const gsl_vector_float * Y, gsl_matrix_float * A)
+{
+ const size_t M = A->size1;
+ const size_t N = A->size2;
+
+ if (M != N)
+ {
+ GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
+ }
+ else if (X->size != N || Y->size != N)
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+
+ cblas_ssyr2 (CblasRowMajor, Uplo, INT (N), alpha, X->data, INT (X->stride),
+ Y->data, INT (Y->stride), A->data, INT (A->tda));
+ return GSL_SUCCESS;
+}
+
+
+int
+gsl_blas_dsyr2 (CBLAS_UPLO_t Uplo, double alpha, const gsl_vector * X,
+ const gsl_vector * Y, gsl_matrix * A)
+{
+ const size_t M = A->size1;
+ const size_t N = A->size2;
+
+ if (M != N)
+ {
+ GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
+ }
+ else if (X->size != N || Y->size != N)
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+
+ cblas_dsyr2 (CblasRowMajor, Uplo, INT (N), alpha, X->data, INT (X->stride),
+ Y->data, INT (Y->stride), A->data, INT (A->tda));
+ return GSL_SUCCESS;
+}
+
+
+/*
+ * ===========================================================================
+ * Prototypes for level 3 BLAS
+ * ===========================================================================
+ */
+
+
+/* GEMM */
+
+int
+gsl_blas_sgemm (CBLAS_TRANSPOSE_t TransA, CBLAS_TRANSPOSE_t TransB,
+ float alpha, const gsl_matrix_float * A,
+ const gsl_matrix_float * B, float beta, gsl_matrix_float * C)
+{
+ const size_t M = C->size1;
+ const size_t N = C->size2;
+ const size_t MA = (TransA == CblasNoTrans) ? A->size1 : A->size2;
+ const size_t NA = (TransA == CblasNoTrans) ? A->size2 : A->size1;
+ const size_t MB = (TransB == CblasNoTrans) ? B->size1 : B->size2;
+ const size_t NB = (TransB == CblasNoTrans) ? B->size2 : B->size1;
+
+ if (M == MA && N == NB && NA == MB) /* [MxN] = [MAxNA][MBxNB] */
+ {
+ cblas_sgemm (CblasRowMajor, TransA, TransB, INT (M), INT (N), INT (NA),
+ alpha, A->data, INT (A->tda), B->data, INT (B->tda), beta,
+ C->data, INT (C->tda));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+
+int
+gsl_blas_dgemm (CBLAS_TRANSPOSE_t TransA, CBLAS_TRANSPOSE_t TransB,
+ double alpha, const gsl_matrix * A, const gsl_matrix * B,
+ double beta, gsl_matrix * C)
+{
+ const size_t M = C->size1;
+ const size_t N = C->size2;
+ const size_t MA = (TransA == CblasNoTrans) ? A->size1 : A->size2;
+ const size_t NA = (TransA == CblasNoTrans) ? A->size2 : A->size1;
+ const size_t MB = (TransB == CblasNoTrans) ? B->size1 : B->size2;
+ const size_t NB = (TransB == CblasNoTrans) ? B->size2 : B->size1;
+
+ if (M == MA && N == NB && NA == MB) /* [MxN] = [MAxNA][MBxNB] */
+ {
+ cblas_dgemm (CblasRowMajor, TransA, TransB, INT (M), INT (N), INT (NA),
+ alpha, A->data, INT (A->tda), B->data, INT (B->tda), beta,
+ C->data, INT (C->tda));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+
+int
+gsl_blas_cgemm (CBLAS_TRANSPOSE_t TransA, CBLAS_TRANSPOSE_t TransB,
+ const gsl_complex_float alpha,
+ const gsl_matrix_complex_float * A,
+ const gsl_matrix_complex_float * B,
+ const gsl_complex_float beta, gsl_matrix_complex_float * C)
+{
+ const size_t M = C->size1;
+ const size_t N = C->size2;
+ const size_t MA = (TransA == CblasNoTrans) ? A->size1 : A->size2;
+ const size_t NA = (TransA == CblasNoTrans) ? A->size2 : A->size1;
+ const size_t MB = (TransB == CblasNoTrans) ? B->size1 : B->size2;
+ const size_t NB = (TransB == CblasNoTrans) ? B->size2 : B->size1;
+
+ if (M == MA && N == NB && NA == MB) /* [MxN] = [MAxNA][MBxNB] */
+ {
+ cblas_cgemm (CblasRowMajor, TransA, TransB, INT (M), INT (N), INT (NA),
+ GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), B->data,
+ INT (B->tda), GSL_COMPLEX_P (&beta), C->data,
+ INT (C->tda));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+
+int
+gsl_blas_zgemm (CBLAS_TRANSPOSE_t TransA, CBLAS_TRANSPOSE_t TransB,
+ const gsl_complex alpha, const gsl_matrix_complex * A,
+ const gsl_matrix_complex * B, const gsl_complex beta,
+ gsl_matrix_complex * C)
+{
+ const size_t M = C->size1;
+ const size_t N = C->size2;
+ const size_t MA = (TransA == CblasNoTrans) ? A->size1 : A->size2;
+ const size_t NA = (TransA == CblasNoTrans) ? A->size2 : A->size1;
+ const size_t MB = (TransB == CblasNoTrans) ? B->size1 : B->size2;
+ const size_t NB = (TransB == CblasNoTrans) ? B->size2 : B->size1;
+
+ if (M == MA && N == NB && NA == MB) /* [MxN] = [MAxNA][MBxNB] */
+ {
+ cblas_zgemm (CblasRowMajor, TransA, TransB, INT (M), INT (N), INT (NA),
+ GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), B->data,
+ INT (B->tda), GSL_COMPLEX_P (&beta), C->data,
+ INT (C->tda));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+
+/* SYMM */
+
+int
+gsl_blas_ssymm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo, float alpha,
+ const gsl_matrix_float * A, const gsl_matrix_float * B,
+ float beta, gsl_matrix_float * C)
+{
+ const size_t M = C->size1;
+ const size_t N = C->size2;
+ const size_t MA = A->size1;
+ const size_t NA = A->size2;
+ const size_t MB = B->size1;
+ const size_t NB = B->size2;
+
+ if (MA != NA)
+ {
+ GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
+ }
+
+ if ((Side == CblasLeft && (M == MA && N == NB && NA == MB))
+ || (Side == CblasRight && (M == MB && N == NA && NB == MA)))
+ {
+ cblas_ssymm (CblasRowMajor, Side, Uplo, INT (M), INT (N), alpha,
+ A->data, INT (A->tda), B->data, INT (B->tda), beta,
+ C->data, INT (C->tda));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+
+}
+
+
+int
+gsl_blas_dsymm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo, double alpha,
+ const gsl_matrix * A, const gsl_matrix * B, double beta,
+ gsl_matrix * C)
+{
+ const size_t M = C->size1;
+ const size_t N = C->size2;
+ const size_t MA = A->size1;
+ const size_t NA = A->size2;
+ const size_t MB = B->size1;
+ const size_t NB = B->size2;
+
+ if (MA != NA)
+ {
+ GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
+ }
+
+ if ((Side == CblasLeft && (M == MA && N == NB && NA == MB))
+ || (Side == CblasRight && (M == MB && N == NA && NB == MA)))
+ {
+ cblas_dsymm (CblasRowMajor, Side, Uplo, INT (M), INT (N), alpha,
+ A->data, INT (A->tda), B->data, INT (B->tda), beta,
+ C->data, INT (C->tda));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+
+int
+gsl_blas_csymm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo,
+ const gsl_complex_float alpha,
+ const gsl_matrix_complex_float * A,
+ const gsl_matrix_complex_float * B,
+ const gsl_complex_float beta, gsl_matrix_complex_float * C)
+{
+ const size_t M = C->size1;
+ const size_t N = C->size2;
+ const size_t MA = A->size1;
+ const size_t NA = A->size2;
+ const size_t MB = B->size1;
+ const size_t NB = B->size2;
+
+ if (MA != NA)
+ {
+ GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
+ }
+
+ if ((Side == CblasLeft && (M == MA && N == NB && NA == MB))
+ || (Side == CblasRight && (M == MB && N == NA && NB == MA)))
+ {
+ cblas_csymm (CblasRowMajor, Side, Uplo, INT (M), INT (N),
+ GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), B->data,
+ INT (B->tda), GSL_COMPLEX_P (&beta), C->data,
+ INT (C->tda));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+int
+gsl_blas_zsymm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo,
+ const gsl_complex alpha, const gsl_matrix_complex * A,
+ const gsl_matrix_complex * B, const gsl_complex beta,
+ gsl_matrix_complex * C)
+{
+ const size_t M = C->size1;
+ const size_t N = C->size2;
+ const size_t MA = A->size1;
+ const size_t NA = A->size2;
+ const size_t MB = B->size1;
+ const size_t NB = B->size2;
+
+ if (MA != NA)
+ {
+ GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
+ }
+
+ if ((Side == CblasLeft && (M == MA && N == NB && NA == MB))
+ || (Side == CblasRight && (M == MB && N == NA && NB == MA)))
+ {
+ cblas_zsymm (CblasRowMajor, Side, Uplo, INT (M), INT (N),
+ GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), B->data,
+ INT (B->tda), GSL_COMPLEX_P (&beta), C->data,
+ INT (C->tda));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+
+/* HEMM */
+
+int
+gsl_blas_chemm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo,
+ const gsl_complex_float alpha,
+ const gsl_matrix_complex_float * A,
+ const gsl_matrix_complex_float * B,
+ const gsl_complex_float beta, gsl_matrix_complex_float * C)
+{
+ const size_t M = C->size1;
+ const size_t N = C->size2;
+ const size_t MA = A->size1;
+ const size_t NA = A->size2;
+ const size_t MB = B->size1;
+ const size_t NB = B->size2;
+
+ if (MA != NA)
+ {
+ GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
+ }
+
+ if ((Side == CblasLeft && (M == MA && N == NB && NA == MB))
+ || (Side == CblasRight && (M == MB && N == NA && NB == MA)))
+ {
+ cblas_chemm (CblasRowMajor, Side, Uplo, INT (M), INT (N),
+ GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), B->data,
+ INT (B->tda), GSL_COMPLEX_P (&beta), C->data,
+ INT (C->tda));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+
+}
+
+
+int
+gsl_blas_zhemm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo,
+ const gsl_complex alpha, const gsl_matrix_complex * A,
+ const gsl_matrix_complex * B, const gsl_complex beta,
+ gsl_matrix_complex * C)
+{
+ const size_t M = C->size1;
+ const size_t N = C->size2;
+ const size_t MA = A->size1;
+ const size_t NA = A->size2;
+ const size_t MB = B->size1;
+ const size_t NB = B->size2;
+
+ if (MA != NA)
+ {
+ GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
+ }
+
+ if ((Side == CblasLeft && (M == MA && N == NB && NA == MB))
+ || (Side == CblasRight && (M == MB && N == NA && NB == MA)))
+ {
+ cblas_zhemm (CblasRowMajor, Side, Uplo, INT (M), INT (N),
+ GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), B->data,
+ INT (B->tda), GSL_COMPLEX_P (&beta), C->data,
+ INT (C->tda));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+/* SYRK */
+
+int
+gsl_blas_ssyrk (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans, float alpha,
+ const gsl_matrix_float * A, float beta, gsl_matrix_float * C)
+{
+ const size_t M = C->size1;
+ const size_t N = C->size2;
+ const size_t J = (Trans == CblasNoTrans) ? A->size1 : A->size2;
+ const size_t K = (Trans == CblasNoTrans) ? A->size2 : A->size1;
+
+ if (M != N)
+ {
+ GSL_ERROR ("matrix C must be square", GSL_ENOTSQR);
+ }
+ else if (N != J)
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+
+ cblas_ssyrk (CblasRowMajor, Uplo, Trans, INT (N), INT (K), alpha, A->data,
+ INT (A->tda), beta, C->data, INT (C->tda));
+ return GSL_SUCCESS;
+}
+
+
+int
+gsl_blas_dsyrk (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans, double alpha,
+ const gsl_matrix * A, double beta, gsl_matrix * C)
+{
+ const size_t M = C->size1;
+ const size_t N = C->size2;
+ const size_t J = (Trans == CblasNoTrans) ? A->size1 : A->size2;
+ const size_t K = (Trans == CblasNoTrans) ? A->size2 : A->size1;
+
+ if (M != N)
+ {
+ GSL_ERROR ("matrix C must be square", GSL_ENOTSQR);
+ }
+ else if (N != J)
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+
+ cblas_dsyrk (CblasRowMajor, Uplo, Trans, INT (N), INT (K), alpha, A->data,
+ INT (A->tda), beta, C->data, INT (C->tda));
+ return GSL_SUCCESS;
+
+}
+
+
+int
+gsl_blas_csyrk (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans,
+ const gsl_complex_float alpha,
+ const gsl_matrix_complex_float * A,
+ const gsl_complex_float beta, gsl_matrix_complex_float * C)
+{
+ const size_t M = C->size1;
+ const size_t N = C->size2;
+ const size_t J = (Trans == CblasNoTrans) ? A->size1 : A->size2;
+ const size_t K = (Trans == CblasNoTrans) ? A->size2 : A->size1;
+
+ if (M != N)
+ {
+ GSL_ERROR ("matrix C must be square", GSL_ENOTSQR);
+ }
+ else if (N != J)
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+
+ cblas_csyrk (CblasRowMajor, Uplo, Trans, INT (N), INT (K),
+ GSL_COMPLEX_P (&alpha), A->data, INT (A->tda),
+ GSL_COMPLEX_P (&beta), C->data, INT (C->tda));
+ return GSL_SUCCESS;
+}
+
+
+int
+gsl_blas_zsyrk (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans,
+ const gsl_complex alpha, const gsl_matrix_complex * A,
+ const gsl_complex beta, gsl_matrix_complex * C)
+{
+ const size_t M = C->size1;
+ const size_t N = C->size2;
+ const size_t J = (Trans == CblasNoTrans) ? A->size1 : A->size2;
+ const size_t K = (Trans == CblasNoTrans) ? A->size2 : A->size1;
+
+ if (M != N)
+ {
+ GSL_ERROR ("matrix C must be square", GSL_ENOTSQR);
+ }
+ else if (N != J)
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+
+ cblas_zsyrk (CblasRowMajor, Uplo, Trans, INT (N), INT (K),
+ GSL_COMPLEX_P (&alpha), A->data, INT (A->tda),
+ GSL_COMPLEX_P (&beta), C->data, INT (C->tda));
+ return GSL_SUCCESS;
+}
+
+/* HERK */
+
+int
+gsl_blas_cherk (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans, float alpha,
+ const gsl_matrix_complex_float * A, float beta,
+ gsl_matrix_complex_float * C)
+{
+ const size_t M = C->size1;
+ const size_t N = C->size2;
+ const size_t J = (Trans == CblasNoTrans) ? A->size1 : A->size2;
+ const size_t K = (Trans == CblasNoTrans) ? A->size2 : A->size1;
+
+ if (M != N)
+ {
+ GSL_ERROR ("matrix C must be square", GSL_ENOTSQR);
+ }
+ else if (N != J)
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+
+ cblas_cherk (CblasRowMajor, Uplo, Trans, INT (N), INT (K), alpha, A->data,
+ INT (A->tda), beta, C->data, INT (C->tda));
+ return GSL_SUCCESS;
+}
+
+
+int
+gsl_blas_zherk (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans, double alpha,
+ const gsl_matrix_complex * A, double beta,
+ gsl_matrix_complex * C)
+{
+ const size_t M = C->size1;
+ const size_t N = C->size2;
+ const size_t J = (Trans == CblasNoTrans) ? A->size1 : A->size2;
+ const size_t K = (Trans == CblasNoTrans) ? A->size2 : A->size1;
+
+ if (M != N)
+ {
+ GSL_ERROR ("matrix C must be square", GSL_ENOTSQR);
+ }
+ else if (N != J)
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+
+ cblas_zherk (CblasRowMajor, Uplo, Trans, INT (N), INT (K), alpha, A->data,
+ INT (A->tda), beta, C->data, INT (C->tda));
+ return GSL_SUCCESS;
+}
+
+/* SYR2K */
+
+int
+gsl_blas_ssyr2k (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans, float alpha,
+ const gsl_matrix_float * A, const gsl_matrix_float * B,
+ float beta, gsl_matrix_float * C)
+{
+ const size_t M = C->size1;
+ const size_t N = C->size2;
+ const size_t MA = (Trans == CblasNoTrans) ? A->size1 : A->size2;
+ const size_t NA = (Trans == CblasNoTrans) ? A->size2 : A->size1;
+ const size_t MB = (Trans == CblasNoTrans) ? B->size1 : B->size2;
+ const size_t NB = (Trans == CblasNoTrans) ? B->size2 : B->size1;
+
+ if (M != N)
+ {
+ GSL_ERROR ("matrix C must be square", GSL_ENOTSQR);
+ }
+ else if (N != MA || N != MB || NA != NB)
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+
+ cblas_ssyr2k (CblasRowMajor, Uplo, Trans, INT (N), INT (NA), alpha, A->data,
+ INT (A->tda), B->data, INT (B->tda), beta, C->data,
+ INT (C->tda));
+ return GSL_SUCCESS;
+}
+
+
+int
+gsl_blas_dsyr2k (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans, double alpha,
+ const gsl_matrix * A, const gsl_matrix * B, double beta,
+ gsl_matrix * C)
+{
+ const size_t M = C->size1;
+ const size_t N = C->size2;
+ const size_t MA = (Trans == CblasNoTrans) ? A->size1 : A->size2;
+ const size_t NA = (Trans == CblasNoTrans) ? A->size2 : A->size1;
+ const size_t MB = (Trans == CblasNoTrans) ? B->size1 : B->size2;
+ const size_t NB = (Trans == CblasNoTrans) ? B->size2 : B->size1;
+
+ if (M != N)
+ {
+ GSL_ERROR ("matrix C must be square", GSL_ENOTSQR);
+ }
+ else if (N != MA || N != MB || NA != NB)
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+
+ cblas_dsyr2k (CblasRowMajor, Uplo, Trans, INT (N), INT (NA), alpha, A->data,
+ INT (A->tda), B->data, INT (B->tda), beta, C->data,
+ INT (C->tda));
+ return GSL_SUCCESS;
+}
+
+
+int
+gsl_blas_csyr2k (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans,
+ const gsl_complex_float alpha,
+ const gsl_matrix_complex_float * A,
+ const gsl_matrix_complex_float * B,
+ const gsl_complex_float beta, gsl_matrix_complex_float * C)
+{
+ const size_t M = C->size1;
+ const size_t N = C->size2;
+ const size_t MA = (Trans == CblasNoTrans) ? A->size1 : A->size2;
+ const size_t NA = (Trans == CblasNoTrans) ? A->size2 : A->size1;
+ const size_t MB = (Trans == CblasNoTrans) ? B->size1 : B->size2;
+ const size_t NB = (Trans == CblasNoTrans) ? B->size2 : B->size1;
+
+ if (M != N)
+ {
+ GSL_ERROR ("matrix C must be square", GSL_ENOTSQR);
+ }
+ else if (N != MA || N != MB || NA != NB)
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+
+ cblas_csyr2k (CblasRowMajor, Uplo, Trans, INT (N), INT (NA),
+ GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), B->data,
+ INT (B->tda), GSL_COMPLEX_P (&beta), C->data, INT (C->tda));
+ return GSL_SUCCESS;
+}
+
+
+
+int
+gsl_blas_zsyr2k (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans,
+ const gsl_complex alpha, const gsl_matrix_complex * A,
+ const gsl_matrix_complex * B, const gsl_complex beta,
+ gsl_matrix_complex * C)
+{
+ const size_t M = C->size1;
+ const size_t N = C->size2;
+ const size_t MA = (Trans == CblasNoTrans) ? A->size1 : A->size2;
+ const size_t NA = (Trans == CblasNoTrans) ? A->size2 : A->size1;
+ const size_t MB = (Trans == CblasNoTrans) ? B->size1 : B->size2;
+ const size_t NB = (Trans == CblasNoTrans) ? B->size2 : B->size1;
+
+ if (M != N)
+ {
+ GSL_ERROR ("matrix C must be square", GSL_ENOTSQR);
+ }
+ else if (N != MA || N != MB || NA != NB)
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+
+ cblas_zsyr2k (CblasRowMajor, Uplo, Trans, INT (N), INT (NA),
+ GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), B->data,
+ INT (B->tda), GSL_COMPLEX_P (&beta), C->data, INT (C->tda));
+ return GSL_SUCCESS;
+}
+
+/* HER2K */
+
+int
+gsl_blas_cher2k (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans,
+ const gsl_complex_float alpha,
+ const gsl_matrix_complex_float * A,
+ const gsl_matrix_complex_float * B, float beta,
+ gsl_matrix_complex_float * C)
+{
+ const size_t M = C->size1;
+ const size_t N = C->size2;
+ const size_t MA = (Trans == CblasNoTrans) ? A->size1 : A->size2;
+ const size_t NA = (Trans == CblasNoTrans) ? A->size2 : A->size1;
+ const size_t MB = (Trans == CblasNoTrans) ? B->size1 : B->size2;
+ const size_t NB = (Trans == CblasNoTrans) ? B->size2 : B->size1;
+
+ if (M != N)
+ {
+ GSL_ERROR ("matrix C must be square", GSL_ENOTSQR);
+ }
+ else if (N != MA || N != MB || NA != NB)
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+
+ cblas_cher2k (CblasRowMajor, Uplo, Trans, INT (N), INT (NA),
+ GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), B->data,
+ INT (B->tda), beta, C->data, INT (C->tda));
+ return GSL_SUCCESS;
+
+}
+
+
+int
+gsl_blas_zher2k (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans,
+ const gsl_complex alpha, const gsl_matrix_complex * A,
+ const gsl_matrix_complex * B, double beta,
+ gsl_matrix_complex * C)
+{
+ const size_t M = C->size1;
+ const size_t N = C->size2;
+ const size_t MA = (Trans == CblasNoTrans) ? A->size1 : A->size2;
+ const size_t NA = (Trans == CblasNoTrans) ? A->size2 : A->size1;
+ const size_t MB = (Trans == CblasNoTrans) ? B->size1 : B->size2;
+ const size_t NB = (Trans == CblasNoTrans) ? B->size2 : B->size1;
+
+ if (M != N)
+ {
+ GSL_ERROR ("matrix C must be square", GSL_ENOTSQR);
+ }
+ else if (N != MA || N != MB || NA != NB)
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+
+ cblas_zher2k (CblasRowMajor, Uplo, Trans, INT (N), INT (NA),
+ GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), B->data,
+ INT (B->tda), beta, C->data, INT (C->tda));
+ return GSL_SUCCESS;
+
+}
+
+/* TRMM */
+
+int
+gsl_blas_strmm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo,
+ CBLAS_TRANSPOSE_t TransA, CBLAS_DIAG_t Diag, float alpha,
+ const gsl_matrix_float * A, gsl_matrix_float * B)
+{
+ const size_t M = B->size1;
+ const size_t N = B->size2;
+ const size_t MA = A->size1;
+ const size_t NA = A->size2;
+
+ if (MA != NA)
+ {
+ GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
+ }
+
+ if ((Side == CblasLeft && M == MA) || (Side == CblasRight && N == MA))
+ {
+ cblas_strmm (CblasRowMajor, Side, Uplo, TransA, Diag, INT (M), INT (N),
+ alpha, A->data, INT (A->tda), B->data, INT (B->tda));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+
+int
+gsl_blas_dtrmm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo,
+ CBLAS_TRANSPOSE_t TransA, CBLAS_DIAG_t Diag, double alpha,
+ const gsl_matrix * A, gsl_matrix * B)
+{
+ const size_t M = B->size1;
+ const size_t N = B->size2;
+ const size_t MA = A->size1;
+ const size_t NA = A->size2;
+
+ if (MA != NA)
+ {
+ GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
+ }
+
+ if ((Side == CblasLeft && M == MA) || (Side == CblasRight && N == MA))
+ {
+ cblas_dtrmm (CblasRowMajor, Side, Uplo, TransA, Diag, INT (M), INT (N),
+ alpha, A->data, INT (A->tda), B->data, INT (B->tda));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+
+int
+gsl_blas_ctrmm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo,
+ CBLAS_TRANSPOSE_t TransA, CBLAS_DIAG_t Diag,
+ const gsl_complex_float alpha,
+ const gsl_matrix_complex_float * A,
+ gsl_matrix_complex_float * B)
+{
+ const size_t M = B->size1;
+ const size_t N = B->size2;
+ const size_t MA = A->size1;
+ const size_t NA = A->size2;
+
+ if (MA != NA)
+ {
+ GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
+ }
+
+ if ((Side == CblasLeft && M == MA) || (Side == CblasRight && N == MA))
+ {
+ cblas_ctrmm (CblasRowMajor, Side, Uplo, TransA, Diag, INT (M), INT (N),
+ GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), B->data,
+ INT (B->tda));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+
+int
+gsl_blas_ztrmm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo,
+ CBLAS_TRANSPOSE_t TransA, CBLAS_DIAG_t Diag,
+ const gsl_complex alpha, const gsl_matrix_complex * A,
+ gsl_matrix_complex * B)
+{
+ const size_t M = B->size1;
+ const size_t N = B->size2;
+ const size_t MA = A->size1;
+ const size_t NA = A->size2;
+
+ if (MA != NA)
+ {
+ GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
+ }
+
+ if ((Side == CblasLeft && M == MA) || (Side == CblasRight && N == MA))
+ {
+ cblas_ztrmm (CblasRowMajor, Side, Uplo, TransA, Diag, INT (M), INT (N),
+ GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), B->data,
+ INT (B->tda));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+
+/* TRSM */
+
+int
+gsl_blas_strsm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo,
+ CBLAS_TRANSPOSE_t TransA, CBLAS_DIAG_t Diag, float alpha,
+ const gsl_matrix_float * A, gsl_matrix_float * B)
+{
+ const size_t M = B->size1;
+ const size_t N = B->size2;
+ const size_t MA = A->size1;
+ const size_t NA = A->size2;
+
+ if (MA != NA)
+ {
+ GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
+ }
+
+ if ((Side == CblasLeft && M == MA) || (Side == CblasRight && N == MA))
+ {
+ cblas_strsm (CblasRowMajor, Side, Uplo, TransA, Diag, INT (M), INT (N),
+ alpha, A->data, INT (A->tda), B->data, INT (B->tda));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+
+int
+gsl_blas_dtrsm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo,
+ CBLAS_TRANSPOSE_t TransA, CBLAS_DIAG_t Diag, double alpha,
+ const gsl_matrix * A, gsl_matrix * B)
+{
+ const size_t M = B->size1;
+ const size_t N = B->size2;
+ const size_t MA = A->size1;
+ const size_t NA = A->size2;
+
+ if (MA != NA)
+ {
+ GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
+ }
+
+ if ((Side == CblasLeft && M == MA) || (Side == CblasRight && N == MA))
+ {
+ cblas_dtrsm (CblasRowMajor, Side, Uplo, TransA, Diag, INT (M), INT (N),
+ alpha, A->data, INT (A->tda), B->data, INT (B->tda));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+
+int
+gsl_blas_ctrsm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo,
+ CBLAS_TRANSPOSE_t TransA, CBLAS_DIAG_t Diag,
+ const gsl_complex_float alpha,
+ const gsl_matrix_complex_float * A,
+ gsl_matrix_complex_float * B)
+{
+ const size_t M = B->size1;
+ const size_t N = B->size2;
+ const size_t MA = A->size1;
+ const size_t NA = A->size2;
+
+ if (MA != NA)
+ {
+ GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
+ }
+
+ if ((Side == CblasLeft && M == MA) || (Side == CblasRight && N == MA))
+ {
+ cblas_ctrsm (CblasRowMajor, Side, Uplo, TransA, Diag, INT (M), INT (N),
+ GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), B->data,
+ INT (B->tda));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
+
+
+int
+gsl_blas_ztrsm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo,
+ CBLAS_TRANSPOSE_t TransA, CBLAS_DIAG_t Diag,
+ const gsl_complex alpha, const gsl_matrix_complex * A,
+ gsl_matrix_complex * B)
+{
+ const size_t M = B->size1;
+ const size_t N = B->size2;
+ const size_t MA = A->size1;
+ const size_t NA = A->size2;
+
+ if (MA != NA)
+ {
+ GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
+ }
+
+ if ((Side == CblasLeft && M == MA) || (Side == CblasRight && N == MA))
+ {
+ cblas_ztrsm (CblasRowMajor, Side, Uplo, TransA, Diag, INT (M), INT (N),
+ GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), B->data,
+ INT (B->tda));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ GSL_ERROR ("invalid length", GSL_EBADLEN);
+ }
+}
diff --git a/gsl-1.9/blas/gsl_blas.h b/gsl-1.9/blas/gsl_blas.h
new file mode 100644
index 0000000..3323f66
--- /dev/null
+++ b/gsl-1.9/blas/gsl_blas.h
@@ -0,0 +1,602 @@
+/* blas/gsl_blas.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/*
+ * Author: G. Jungman
+ */
+#ifndef __GSL_BLAS_H__
+#define __GSL_BLAS_H__
+
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_matrix.h>
+
+#include <gsl/gsl_blas_types.h>
+
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+
+/* ========================================================================
+ * Level 1
+ * ========================================================================
+ */
+
+int gsl_blas_sdsdot (float alpha,
+ const gsl_vector_float * X,
+ const gsl_vector_float * Y,
+ float * result
+ );
+
+int gsl_blas_dsdot (const gsl_vector_float * X,
+ const gsl_vector_float * Y,
+ double * result
+ );
+
+int gsl_blas_sdot (const gsl_vector_float * X,
+ const gsl_vector_float * Y,
+ float * result
+ );
+
+int gsl_blas_ddot (const gsl_vector * X,
+ const gsl_vector * Y,
+ double * result
+ );
+
+
+int gsl_blas_cdotu (const gsl_vector_complex_float * X,
+ const gsl_vector_complex_float * Y,
+ gsl_complex_float * dotu);
+
+int gsl_blas_cdotc (const gsl_vector_complex_float * X,
+ const gsl_vector_complex_float * Y,
+ gsl_complex_float * dotc);
+
+int gsl_blas_zdotu (const gsl_vector_complex * X,
+ const gsl_vector_complex * Y,
+ gsl_complex * dotu);
+
+int gsl_blas_zdotc (const gsl_vector_complex * X,
+ const gsl_vector_complex * Y,
+ gsl_complex * dotc);
+
+
+float gsl_blas_snrm2 (const gsl_vector_float * X);
+float gsl_blas_sasum (const gsl_vector_float * X);
+double gsl_blas_dnrm2 (const gsl_vector * X);
+double gsl_blas_dasum (const gsl_vector * X);
+float gsl_blas_scnrm2 (const gsl_vector_complex_float * X);
+float gsl_blas_scasum (const gsl_vector_complex_float * X);
+double gsl_blas_dznrm2 (const gsl_vector_complex * X);
+double gsl_blas_dzasum (const gsl_vector_complex * X);
+
+
+CBLAS_INDEX_t gsl_blas_isamax (const gsl_vector_float * X);
+CBLAS_INDEX_t gsl_blas_idamax (const gsl_vector * X);
+CBLAS_INDEX_t gsl_blas_icamax (const gsl_vector_complex_float * X);
+CBLAS_INDEX_t gsl_blas_izamax (const gsl_vector_complex * X);
+
+
+int gsl_blas_sswap (gsl_vector_float * X,
+ gsl_vector_float * Y);
+
+int gsl_blas_scopy (const gsl_vector_float * X,
+ gsl_vector_float * Y);
+
+int gsl_blas_saxpy (float alpha,
+ const gsl_vector_float * X,
+ gsl_vector_float * Y);
+
+int gsl_blas_dswap (gsl_vector * X,
+ gsl_vector * Y);
+
+int gsl_blas_dcopy (const gsl_vector * X,
+ gsl_vector * Y);
+
+int gsl_blas_daxpy (double alpha,
+ const gsl_vector * X,
+ gsl_vector * Y);
+
+int gsl_blas_cswap (gsl_vector_complex_float * X,
+ gsl_vector_complex_float * Y);
+
+int gsl_blas_ccopy (const gsl_vector_complex_float * X,
+ gsl_vector_complex_float * Y);
+
+int gsl_blas_caxpy (const gsl_complex_float alpha,
+ const gsl_vector_complex_float * X,
+ gsl_vector_complex_float * Y);
+
+int gsl_blas_zswap (gsl_vector_complex * X,
+ gsl_vector_complex * Y);
+
+int gsl_blas_zcopy (const gsl_vector_complex * X,
+ gsl_vector_complex * Y);
+
+int gsl_blas_zaxpy (const gsl_complex alpha,
+ const gsl_vector_complex * X,
+ gsl_vector_complex * Y);
+
+
+int gsl_blas_srotg (float a[], float b[], float c[], float s[]);
+
+int gsl_blas_srotmg (float d1[], float d2[], float b1[], float b2, float P[]);
+
+int gsl_blas_srot (gsl_vector_float * X,
+ gsl_vector_float * Y,
+ float c, float s);
+
+int gsl_blas_srotm (gsl_vector_float * X,
+ gsl_vector_float * Y,
+ const float P[]);
+
+int gsl_blas_drotg (double a[], double b[], double c[], double s[]);
+
+int gsl_blas_drotmg (double d1[], double d2[], double b1[],
+ double b2, double P[]);
+
+int gsl_blas_drot (gsl_vector * X,
+ gsl_vector * Y,
+ const double c, const double s);
+
+int gsl_blas_drotm (gsl_vector * X,
+ gsl_vector * Y,
+ const double P[]);
+
+
+void gsl_blas_sscal (float alpha, gsl_vector_float * X);
+void gsl_blas_dscal (double alpha, gsl_vector * X);
+void gsl_blas_cscal (const gsl_complex_float alpha, gsl_vector_complex_float * X);
+void gsl_blas_zscal (const gsl_complex alpha, gsl_vector_complex * X);
+void gsl_blas_csscal (float alpha, gsl_vector_complex_float * X);
+void gsl_blas_zdscal (double alpha, gsl_vector_complex * X);
+
+
+/* ===========================================================================
+ * Level 2
+ * ===========================================================================
+ */
+
+/*
+ * Routines with standard 4 prefixes (S, D, C, Z)
+ */
+int gsl_blas_sgemv (CBLAS_TRANSPOSE_t TransA,
+ float alpha,
+ const gsl_matrix_float * A,
+ const gsl_vector_float * X,
+ float beta,
+ gsl_vector_float * Y);
+
+int gsl_blas_strmv (CBLAS_UPLO_t Uplo,
+ CBLAS_TRANSPOSE_t TransA, CBLAS_DIAG_t Diag,
+ const gsl_matrix_float * A,
+ gsl_vector_float * X);
+
+int gsl_blas_strsv (CBLAS_UPLO_t Uplo,
+ CBLAS_TRANSPOSE_t TransA, CBLAS_DIAG_t Diag,
+ const gsl_matrix_float * A,
+ gsl_vector_float * X);
+
+int gsl_blas_dgemv (CBLAS_TRANSPOSE_t TransA,
+ double alpha,
+ const gsl_matrix * A,
+ const gsl_vector * X,
+ double beta,
+ gsl_vector * Y);
+
+int gsl_blas_dtrmv (CBLAS_UPLO_t Uplo,
+ CBLAS_TRANSPOSE_t TransA, CBLAS_DIAG_t Diag,
+ const gsl_matrix * A,
+ gsl_vector * X);
+
+int gsl_blas_dtrsv (CBLAS_UPLO_t Uplo,
+ CBLAS_TRANSPOSE_t TransA, CBLAS_DIAG_t Diag,
+ const gsl_matrix * A,
+ gsl_vector * X);
+
+int gsl_blas_cgemv (CBLAS_TRANSPOSE_t TransA,
+ const gsl_complex_float alpha,
+ const gsl_matrix_complex_float * A,
+ const gsl_vector_complex_float * X,
+ const gsl_complex_float beta,
+ gsl_vector_complex_float * Y);
+
+int gsl_blas_ctrmv (CBLAS_UPLO_t Uplo,
+ CBLAS_TRANSPOSE_t TransA, CBLAS_DIAG_t Diag,
+ const gsl_matrix_complex_float * A,
+ gsl_vector_complex_float * X);
+
+int gsl_blas_ctrsv (CBLAS_UPLO_t Uplo,
+ CBLAS_TRANSPOSE_t TransA, CBLAS_DIAG_t Diag,
+ const gsl_matrix_complex_float * A,
+ gsl_vector_complex_float * X);
+
+int gsl_blas_zgemv (CBLAS_TRANSPOSE_t TransA,
+ const gsl_complex alpha,
+ const gsl_matrix_complex * A,
+ const gsl_vector_complex * X,
+ const gsl_complex beta,
+ gsl_vector_complex * Y);
+
+int gsl_blas_ztrmv (CBLAS_UPLO_t Uplo,
+ CBLAS_TRANSPOSE_t TransA, CBLAS_DIAG_t Diag,
+ const gsl_matrix_complex * A,
+ gsl_vector_complex * X);
+
+int gsl_blas_ztrsv (CBLAS_UPLO_t Uplo,
+ CBLAS_TRANSPOSE_t TransA, CBLAS_DIAG_t Diag,
+ const gsl_matrix_complex * A,
+ gsl_vector_complex *X);
+
+/*
+ * Routines with S and D prefixes only
+ */
+int gsl_blas_ssymv (CBLAS_UPLO_t Uplo,
+ float alpha,
+ const gsl_matrix_float * A,
+ const gsl_vector_float * X,
+ float beta,
+ gsl_vector_float * Y);
+
+int gsl_blas_sger (float alpha,
+ const gsl_vector_float * X,
+ const gsl_vector_float * Y,
+ gsl_matrix_float * A);
+
+int gsl_blas_ssyr (CBLAS_UPLO_t Uplo,
+ float alpha,
+ const gsl_vector_float * X,
+ gsl_matrix_float * A);
+
+int gsl_blas_ssyr2 (CBLAS_UPLO_t Uplo,
+ float alpha,
+ const gsl_vector_float * X,
+ const gsl_vector_float * Y,
+ gsl_matrix_float * A);
+
+int gsl_blas_dsymv (CBLAS_UPLO_t Uplo,
+ double alpha,
+ const gsl_matrix * A,
+ const gsl_vector * X,
+ double beta,
+ gsl_vector * Y);
+int gsl_blas_dger (double alpha,
+ const gsl_vector * X,
+ const gsl_vector * Y,
+ gsl_matrix * A);
+
+int gsl_blas_dsyr (CBLAS_UPLO_t Uplo,
+ double alpha,
+ const gsl_vector * X,
+ gsl_matrix * A);
+
+int gsl_blas_dsyr2 (CBLAS_UPLO_t Uplo,
+ double alpha,
+ const gsl_vector * X,
+ const gsl_vector * Y,
+ gsl_matrix * A);
+
+/*
+ * Routines with C and Z prefixes only
+ */
+
+int gsl_blas_chemv (CBLAS_UPLO_t Uplo,
+ const gsl_complex_float alpha,
+ const gsl_matrix_complex_float * A,
+ const gsl_vector_complex_float * X,
+ const gsl_complex_float beta,
+ gsl_vector_complex_float * Y);
+
+int gsl_blas_cgeru (const gsl_complex_float alpha,
+ const gsl_vector_complex_float * X,
+ const gsl_vector_complex_float * Y,
+ gsl_matrix_complex_float * A);
+
+int gsl_blas_cgerc (const gsl_complex_float alpha,
+ const gsl_vector_complex_float * X,
+ const gsl_vector_complex_float * Y,
+ gsl_matrix_complex_float * A);
+
+int gsl_blas_cher (CBLAS_UPLO_t Uplo,
+ float alpha,
+ const gsl_vector_complex_float * X,
+ gsl_matrix_complex_float * A);
+
+int gsl_blas_cher2 (CBLAS_UPLO_t Uplo,
+ const gsl_complex_float alpha,
+ const gsl_vector_complex_float * X,
+ const gsl_vector_complex_float * Y,
+ gsl_matrix_complex_float * A);
+
+int gsl_blas_zhemv (CBLAS_UPLO_t Uplo,
+ const gsl_complex alpha,
+ const gsl_matrix_complex * A,
+ const gsl_vector_complex * X,
+ const gsl_complex beta,
+ gsl_vector_complex * Y);
+
+int gsl_blas_zgeru (const gsl_complex alpha,
+ const gsl_vector_complex * X,
+ const gsl_vector_complex * Y,
+ gsl_matrix_complex * A);
+
+int gsl_blas_zgerc (const gsl_complex alpha,
+ const gsl_vector_complex * X,
+ const gsl_vector_complex * Y,
+ gsl_matrix_complex * A);
+
+int gsl_blas_zher (CBLAS_UPLO_t Uplo,
+ double alpha,
+ const gsl_vector_complex * X,
+ gsl_matrix_complex * A);
+
+int gsl_blas_zher2 (CBLAS_UPLO_t Uplo,
+ const gsl_complex alpha,
+ const gsl_vector_complex * X,
+ const gsl_vector_complex * Y,
+ gsl_matrix_complex * A);
+
+/*
+ * ===========================================================================
+ * Prototypes for level 3 BLAS
+ * ===========================================================================
+ */
+
+/*
+ * Routines with standard 4 prefixes (S, D, C, Z)
+ */
+int gsl_blas_sgemm (CBLAS_TRANSPOSE_t TransA,
+ CBLAS_TRANSPOSE_t TransB,
+ float alpha,
+ const gsl_matrix_float * A,
+ const gsl_matrix_float * B,
+ float beta,
+ gsl_matrix_float * C);
+
+int gsl_blas_ssymm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo,
+ float alpha,
+ const gsl_matrix_float * A,
+ const gsl_matrix_float * B,
+ float beta,
+ gsl_matrix_float * C);
+
+int gsl_blas_ssyrk (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans,
+ float alpha,
+ const gsl_matrix_float * A,
+ float beta,
+ gsl_matrix_float * C);
+
+int gsl_blas_ssyr2k (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans,
+ float alpha,
+ const gsl_matrix_float * A,
+ const gsl_matrix_float * B,
+ float beta,
+ gsl_matrix_float * C);
+
+int gsl_blas_strmm (CBLAS_SIDE_t Side,
+ CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t TransA,
+ CBLAS_DIAG_t Diag,
+ float alpha,
+ const gsl_matrix_float * A,
+ gsl_matrix_float * B);
+
+int gsl_blas_strsm (CBLAS_SIDE_t Side,
+ CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t TransA,
+ CBLAS_DIAG_t Diag,
+ float alpha,
+ const gsl_matrix_float * A,
+ gsl_matrix_float * B);
+
+int gsl_blas_dgemm (CBLAS_TRANSPOSE_t TransA,
+ CBLAS_TRANSPOSE_t TransB,
+ double alpha,
+ const gsl_matrix * A,
+ const gsl_matrix * B,
+ double beta,
+ gsl_matrix * C);
+
+int gsl_blas_dsymm (CBLAS_SIDE_t Side,
+ CBLAS_UPLO_t Uplo,
+ double alpha,
+ const gsl_matrix * A,
+ const gsl_matrix * B,
+ double beta,
+ gsl_matrix * C);
+
+int gsl_blas_dsyrk (CBLAS_UPLO_t Uplo,
+ CBLAS_TRANSPOSE_t Trans,
+ double alpha,
+ const gsl_matrix * A,
+ double beta,
+ gsl_matrix * C);
+
+int gsl_blas_dsyr2k (CBLAS_UPLO_t Uplo,
+ CBLAS_TRANSPOSE_t Trans,
+ double alpha,
+ const gsl_matrix * A,
+ const gsl_matrix * B,
+ double beta,
+ gsl_matrix * C);
+
+int gsl_blas_dtrmm (CBLAS_SIDE_t Side,
+ CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t TransA,
+ CBLAS_DIAG_t Diag,
+ double alpha,
+ const gsl_matrix * A,
+ gsl_matrix * B);
+
+int gsl_blas_dtrsm (CBLAS_SIDE_t Side,
+ CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t TransA,
+ CBLAS_DIAG_t Diag,
+ double alpha,
+ const gsl_matrix * A,
+ gsl_matrix * B);
+
+int gsl_blas_cgemm (CBLAS_TRANSPOSE_t TransA,
+ CBLAS_TRANSPOSE_t TransB,
+ const gsl_complex_float alpha,
+ const gsl_matrix_complex_float * A,
+ const gsl_matrix_complex_float * B,
+ const gsl_complex_float beta,
+ gsl_matrix_complex_float * C);
+
+int gsl_blas_csymm (CBLAS_SIDE_t Side,
+ CBLAS_UPLO_t Uplo,
+ const gsl_complex_float alpha,
+ const gsl_matrix_complex_float * A,
+ const gsl_matrix_complex_float * B,
+ const gsl_complex_float beta,
+ gsl_matrix_complex_float * C);
+
+int gsl_blas_csyrk (CBLAS_UPLO_t Uplo,
+ CBLAS_TRANSPOSE_t Trans,
+ const gsl_complex_float alpha,
+ const gsl_matrix_complex_float * A,
+ const gsl_complex_float beta,
+ gsl_matrix_complex_float * C);
+
+int gsl_blas_csyr2k (CBLAS_UPLO_t Uplo,
+ CBLAS_TRANSPOSE_t Trans,
+ const gsl_complex_float alpha,
+ const gsl_matrix_complex_float * A,
+ const gsl_matrix_complex_float * B,
+ const gsl_complex_float beta,
+ gsl_matrix_complex_float * C);
+
+int gsl_blas_ctrmm (CBLAS_SIDE_t Side,
+ CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t TransA,
+ CBLAS_DIAG_t Diag,
+ const gsl_complex_float alpha,
+ const gsl_matrix_complex_float * A,
+ gsl_matrix_complex_float * B);
+
+int gsl_blas_ctrsm (CBLAS_SIDE_t Side,
+ CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t TransA,
+ CBLAS_DIAG_t Diag,
+ const gsl_complex_float alpha,
+ const gsl_matrix_complex_float * A,
+ gsl_matrix_complex_float * B);
+
+int gsl_blas_zgemm (CBLAS_TRANSPOSE_t TransA,
+ CBLAS_TRANSPOSE_t TransB,
+ const gsl_complex alpha,
+ const gsl_matrix_complex * A,
+ const gsl_matrix_complex * B,
+ const gsl_complex beta,
+ gsl_matrix_complex * C);
+
+int gsl_blas_zsymm (CBLAS_SIDE_t Side,
+ CBLAS_UPLO_t Uplo,
+ const gsl_complex alpha,
+ const gsl_matrix_complex * A,
+ const gsl_matrix_complex * B,
+ const gsl_complex beta,
+ gsl_matrix_complex * C);
+
+int gsl_blas_zsyrk (CBLAS_UPLO_t Uplo,
+ CBLAS_TRANSPOSE_t Trans,
+ const gsl_complex alpha,
+ const gsl_matrix_complex * A,
+ const gsl_complex beta,
+ gsl_matrix_complex * C);
+
+int gsl_blas_zsyr2k (CBLAS_UPLO_t Uplo,
+ CBLAS_TRANSPOSE_t Trans,
+ const gsl_complex alpha,
+ const gsl_matrix_complex * A,
+ const gsl_matrix_complex * B,
+ const gsl_complex beta,
+ gsl_matrix_complex *C);
+
+int gsl_blas_ztrmm (CBLAS_SIDE_t Side,
+ CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t TransA,
+ CBLAS_DIAG_t Diag,
+ const gsl_complex alpha,
+ const gsl_matrix_complex * A,
+ gsl_matrix_complex * B);
+
+int gsl_blas_ztrsm (CBLAS_SIDE_t Side,
+ CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t TransA,
+ CBLAS_DIAG_t Diag,
+ const gsl_complex alpha,
+ const gsl_matrix_complex * A,
+ gsl_matrix_complex * B);
+
+/*
+ * Routines with prefixes C and Z only
+ */
+int gsl_blas_chemm (CBLAS_SIDE_t Side,
+ CBLAS_UPLO_t Uplo,
+ const gsl_complex_float alpha,
+ const gsl_matrix_complex_float * A,
+ const gsl_matrix_complex_float * B,
+ const gsl_complex_float beta,
+ gsl_matrix_complex_float * C);
+
+int gsl_blas_cherk (CBLAS_UPLO_t Uplo,
+ CBLAS_TRANSPOSE_t Trans,
+ float alpha,
+ const gsl_matrix_complex_float * A,
+ float beta,
+ gsl_matrix_complex_float * C);
+
+int gsl_blas_cher2k (CBLAS_UPLO_t Uplo,
+ CBLAS_TRANSPOSE_t Trans,
+ const gsl_complex_float alpha,
+ const gsl_matrix_complex_float * A,
+ const gsl_matrix_complex_float * B,
+ float beta,
+ gsl_matrix_complex_float * C);
+
+int gsl_blas_zhemm (CBLAS_SIDE_t Side,
+ CBLAS_UPLO_t Uplo,
+ const gsl_complex alpha,
+ const gsl_matrix_complex * A,
+ const gsl_matrix_complex * B,
+ const gsl_complex beta,
+ gsl_matrix_complex * C);
+
+int gsl_blas_zherk (CBLAS_UPLO_t Uplo,
+ CBLAS_TRANSPOSE_t Trans,
+ double alpha,
+ const gsl_matrix_complex * A,
+ double beta,
+ gsl_matrix_complex * C);
+
+int gsl_blas_zher2k (CBLAS_UPLO_t Uplo,
+ CBLAS_TRANSPOSE_t Trans,
+ const gsl_complex alpha,
+ const gsl_matrix_complex * A,
+ const gsl_matrix_complex * B,
+ double beta,
+ gsl_matrix_complex * C);
+
+
+__END_DECLS
+
+#endif /* __GSL_BLAS_H__ */
diff --git a/gsl-1.9/blas/gsl_blas_types.h b/gsl-1.9/blas/gsl_blas_types.h
new file mode 100644
index 0000000..ff9dfa3
--- /dev/null
+++ b/gsl-1.9/blas/gsl_blas_types.h
@@ -0,0 +1,54 @@
+/* blas/gsl_blas_types.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/*
+ * Author: G. Jungman
+ */
+/* Based on draft BLAST C interface specification [Jul 7 1998]
+ */
+#ifndef __GSL_BLAS_TYPES_H__
+#define __GSL_BLAS_TYPES_H__
+
+#include <gsl/gsl_cblas.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+typedef CBLAS_INDEX CBLAS_INDEX_t;
+typedef enum CBLAS_ORDER CBLAS_ORDER_t;
+typedef enum CBLAS_TRANSPOSE CBLAS_TRANSPOSE_t;
+typedef enum CBLAS_UPLO CBLAS_UPLO_t;
+typedef enum CBLAS_DIAG CBLAS_DIAG_t;
+typedef enum CBLAS_SIDE CBLAS_SIDE_t;
+
+/* typedef gsl_complex COMPLEX; */
+
+__END_DECLS
+
+
+#endif /* __GSL_BLAS_TYPES_H__ */
diff --git a/gsl-1.9/block/ChangeLog b/gsl-1.9/block/ChangeLog
new file mode 100644
index 0000000..f2055a9
--- /dev/null
+++ b/gsl-1.9/block/ChangeLog
@@ -0,0 +1,34 @@
+2005-05-21 Brian Gough <bjg@network-theory.co.uk>
+
+ * Makefile.am (pkginclude_HEADERS): removed unused file
+ gsl_block_complex.h
+
+2004-06-03 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_check_range.h: provide backwards-compatible support for
+ GSL_RANGE_CHECK_OFF and GSL_RANGE_CHECK
+
+Sat Jul 15 21:45:10 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * init_source.c (FUNCTION): changed GSL_EDOM to GSL_EINVAL for
+ invalid size arguments
+
+Sun May 28 12:22:26 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * test_complex_source.c (FUNCTION): use binary mode "b" when
+ reading and writing binary files
+
+ * test_source.c (FUNCTION): use binary mode "b" when reading and
+ writing binary files
+
+Thu Mar 2 20:51:23 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * fprintf_source.c: all input is now done through an ATOMIC_IO
+ type, since char has to be written/read using a different type
+ (int).
+
+Fri Oct 1 15:48:31 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * this directory handles the memory management for vectors and
+ matrices
+
diff --git a/gsl-1.9/block/Makefile.am b/gsl-1.9/block/Makefile.am
new file mode 100644
index 0000000..712f0f0
--- /dev/null
+++ b/gsl-1.9/block/Makefile.am
@@ -0,0 +1,19 @@
+noinst_LTLIBRARIES = libgslblock.la
+
+check_PROGRAMS = test
+
+pkginclude_HEADERS = gsl_block.h gsl_block_char.h gsl_block_complex_double.h gsl_block_complex_float.h gsl_block_complex_long_double.h gsl_block_double.h gsl_block_float.h gsl_block_int.h gsl_block_long.h gsl_block_long_double.h gsl_block_short.h gsl_block_uchar.h gsl_block_uint.h gsl_block_ulong.h gsl_block_ushort.h gsl_check_range.h
+
+INCLUDES= -I$(top_builddir) -I$(top_srcdir)
+
+TESTS = $(check_PROGRAMS)
+
+test_LDADD = libgslblock.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+
+test_SOURCES = test.c
+
+CLEANFILES = test.txt test.dat
+
+noinst_HEADERS = block_source.c init_source.c fprintf_source.c fwrite_source.c test_complex_source.c test_source.c test_io.c test_complex_io.c
+
+libgslblock_la_SOURCES = init.c file.c block.c
diff --git a/gsl-1.9/block/Makefile.in b/gsl-1.9/block/Makefile.in
new file mode 100644
index 0000000..05a051b
--- /dev/null
+++ b/gsl-1.9/block/Makefile.in
@@ -0,0 +1,546 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = test$(EXEEXT)
+subdir = block
+DIST_COMMON = $(noinst_HEADERS) $(pkginclude_HEADERS) \
+ $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgslblock_la_LIBADD =
+am_libgslblock_la_OBJECTS = init.lo file.lo block.lo
+libgslblock_la_OBJECTS = $(am_libgslblock_la_OBJECTS)
+am_test_OBJECTS = test.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = libgslblock.la ../ieee-utils/libgslieeeutils.la \
+ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \
+ ../utils/libutils.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgslblock_la_SOURCES) $(test_SOURCES)
+DIST_SOURCES = $(libgslblock_la_SOURCES) $(test_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libgslblock.la
+pkginclude_HEADERS = gsl_block.h gsl_block_char.h gsl_block_complex_double.h gsl_block_complex_float.h gsl_block_complex_long_double.h gsl_block_double.h gsl_block_float.h gsl_block_int.h gsl_block_long.h gsl_block_long_double.h gsl_block_short.h gsl_block_uchar.h gsl_block_uint.h gsl_block_ulong.h gsl_block_ushort.h gsl_check_range.h
+INCLUDES = -I$(top_builddir) -I$(top_srcdir)
+TESTS = $(check_PROGRAMS)
+test_LDADD = libgslblock.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+test_SOURCES = test.c
+CLEANFILES = test.txt test.dat
+noinst_HEADERS = block_source.c init_source.c fprintf_source.c fwrite_source.c test_complex_source.c test_source.c test_io.c test_complex_io.c
+libgslblock_la_SOURCES = init.c file.c block.c
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps block/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps block/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgslblock.la: $(libgslblock_la_OBJECTS) $(libgslblock_la_DEPENDENCIES)
+ $(LINK) $(libgslblock_la_LDFLAGS) $(libgslblock_la_OBJECTS) $(libgslblock_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkgincludeHEADERS
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/block/block.c b/gsl-1.9/block/block.c
new file mode 100644
index 0000000..a60e0e0
--- /dev/null
+++ b/gsl-1.9/block/block.c
@@ -0,0 +1,87 @@
+#include <config.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_block.h>
+
+#define BASE_GSL_COMPLEX_LONG
+#include "templates_on.h"
+#include "block_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_LONG
+
+#define BASE_GSL_COMPLEX
+#include "templates_on.h"
+#include "block_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX
+
+#define BASE_GSL_COMPLEX_FLOAT
+#include "templates_on.h"
+#include "block_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_FLOAT
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "block_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "block_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "block_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "block_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "block_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "block_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "block_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "block_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "block_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "block_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "block_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
diff --git a/gsl-1.9/block/block_source.c b/gsl-1.9/block/block_source.c
new file mode 100644
index 0000000..0a8f690
--- /dev/null
+++ b/gsl-1.9/block/block_source.c
@@ -0,0 +1,30 @@
+/* block/block_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+size_t
+FUNCTION(gsl_block,size) (const TYPE(gsl_block) * b)
+{
+ return b->size ;
+}
+
+ATOMIC *
+FUNCTION(gsl_block,data) (const TYPE(gsl_block) * b)
+{
+ return b->data ;
+}
diff --git a/gsl-1.9/block/file.c b/gsl-1.9/block/file.c
new file mode 100644
index 0000000..f86b537
--- /dev/null
+++ b/gsl-1.9/block/file.c
@@ -0,0 +1,102 @@
+#include <config.h>
+#include <stdio.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_block.h>
+
+#define BASE_GSL_COMPLEX_LONG
+#include "templates_on.h"
+#include "fwrite_source.c"
+#include "fprintf_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_LONG
+
+#define BASE_GSL_COMPLEX
+#include "templates_on.h"
+#include "fwrite_source.c"
+#include "fprintf_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX
+
+#define BASE_GSL_COMPLEX_FLOAT
+#include "templates_on.h"
+#include "fwrite_source.c"
+#include "fprintf_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_FLOAT
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "fwrite_source.c"
+#include "fprintf_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "fwrite_source.c"
+#include "fprintf_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "fwrite_source.c"
+#include "fprintf_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "fwrite_source.c"
+#include "fprintf_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "fwrite_source.c"
+#include "fprintf_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "fwrite_source.c"
+#include "fprintf_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "fwrite_source.c"
+#include "fprintf_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "fwrite_source.c"
+#include "fprintf_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "fwrite_source.c"
+#include "fprintf_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "fwrite_source.c"
+#include "fprintf_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "fwrite_source.c"
+#include "fprintf_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
diff --git a/gsl-1.9/block/fprintf_source.c b/gsl-1.9/block/fprintf_source.c
new file mode 100644
index 0000000..9eb961c
--- /dev/null
+++ b/gsl-1.9/block/fprintf_source.c
@@ -0,0 +1,171 @@
+/* block/fprintf_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#if !(USES_LONGDOUBLE && !HAVE_PRINTF_LONGDOUBLE)
+
+int
+FUNCTION (gsl_block, fprintf) (FILE * stream, const TYPE(gsl_block) * b, const char *format)
+{
+ size_t n = b->size ;
+
+ ATOMIC * data = b->data ;
+
+ size_t i;
+
+ for (i = 0; i < n; i++)
+ {
+ int k;
+ int status;
+
+ for (k = 0; k < MULTIPLICITY; k++)
+ {
+ if (k > 0)
+ {
+ status = putc (' ', stream);
+
+ if (status == EOF)
+ {
+ GSL_ERROR ("putc failed", GSL_EFAILED);
+ }
+ }
+ status = fprintf (stream,
+ format,
+ data[MULTIPLICITY * i + k]);
+ if (status < 0)
+ {
+ GSL_ERROR ("fprintf failed", GSL_EFAILED);
+ }
+ }
+
+ status = putc ('\n', stream);
+
+ if (status == EOF)
+ {
+ GSL_ERROR ("putc failed", GSL_EFAILED);
+ }
+ }
+
+ return 0;
+}
+
+int
+FUNCTION (gsl_block, fscanf) (FILE * stream, TYPE(gsl_block) * b)
+{
+ size_t n = b->size ;
+
+ ATOMIC * data = b->data ;
+
+ size_t i;
+
+ for (i = 0; i < n; i++)
+ {
+ int k;
+ for (k = 0; k < MULTIPLICITY; k++)
+ {
+ ATOMIC_IO tmp ;
+
+ int status = fscanf (stream, IN_FORMAT, &tmp) ;
+
+ data [MULTIPLICITY * i + k] = tmp;
+
+
+ if (status != 1)
+ {
+ GSL_ERROR ("fscanf failed", GSL_EFAILED);
+ }
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+int
+FUNCTION (gsl_block, raw_fprintf) (FILE * stream,
+ const ATOMIC * data,
+ const size_t n,
+ const size_t stride,
+ const char *format)
+{
+ size_t i;
+
+ for (i = 0; i < n; i++)
+ {
+ int k;
+ int status;
+
+ for (k = 0; k < MULTIPLICITY; k++)
+ {
+ if (k > 0)
+ {
+ status = putc (' ', stream);
+
+ if (status == EOF)
+ {
+ GSL_ERROR ("putc failed", GSL_EFAILED);
+ }
+ }
+ status = fprintf (stream,
+ format,
+ data[MULTIPLICITY * i * stride + k]);
+ if (status < 0)
+ {
+ GSL_ERROR ("fprintf failed", GSL_EFAILED);
+ }
+ }
+
+ status = putc ('\n', stream);
+
+ if (status == EOF)
+ {
+ GSL_ERROR ("putc failed", GSL_EFAILED);
+ }
+ }
+
+ return 0;
+}
+
+int
+FUNCTION (gsl_block, raw_fscanf) (FILE * stream,
+ ATOMIC * data,
+ const size_t n,
+ const size_t stride)
+{
+ size_t i;
+
+ for (i = 0; i < n; i++)
+ {
+ int k;
+ for (k = 0; k < MULTIPLICITY; k++)
+ {
+ ATOMIC_IO tmp;
+
+ int status = fscanf (stream, IN_FORMAT, &tmp) ;
+
+ data [MULTIPLICITY * i * stride + k] = tmp;
+
+ if (status != 1)
+ GSL_ERROR ("fscanf failed", GSL_EFAILED);
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+#endif
diff --git a/gsl-1.9/block/fwrite_source.c b/gsl-1.9/block/fwrite_source.c
new file mode 100644
index 0000000..9de6102
--- /dev/null
+++ b/gsl-1.9/block/fwrite_source.c
@@ -0,0 +1,116 @@
+/* block/fwrite_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+int
+FUNCTION (gsl_block, fread) (FILE * stream, TYPE(gsl_block) * b)
+{
+ size_t n = b->size ;
+
+ ATOMIC * data = b->data ;
+
+ size_t items = fread (data, MULTIPLICITY * sizeof (ATOMIC), n, stream);
+
+ if (items != n)
+ {
+ GSL_ERROR ("fread failed", GSL_EFAILED);
+ }
+
+return 0;
+}
+
+int
+FUNCTION (gsl_block, fwrite) (FILE * stream, const TYPE(gsl_block) * b)
+{
+ size_t n = b->size ;
+
+ ATOMIC * data = b->data ;
+
+ size_t items = fwrite (data, MULTIPLICITY * sizeof (ATOMIC), n, stream);
+
+ if (items != n)
+ {
+ GSL_ERROR ("fwrite failed", GSL_EFAILED);
+ }
+
+ return 0;
+}
+
+int
+FUNCTION (gsl_block, raw_fread) (FILE * stream, ATOMIC * data,
+ const size_t n, const size_t stride)
+{
+ if (stride == 1)
+ {
+ size_t items = fread (data, MULTIPLICITY * sizeof (ATOMIC), n, stream);
+
+ if (items != n)
+ {
+ GSL_ERROR ("fread failed", GSL_EFAILED);
+ }
+ }
+ else
+ {
+ size_t i;
+
+ for (i = 0; i < n; i++)
+ {
+ size_t item = fread (data + MULTIPLICITY * i * stride,
+ MULTIPLICITY * sizeof (ATOMIC), 1, stream);
+ if (item != 1)
+ {
+ GSL_ERROR ("fread failed", GSL_EFAILED);
+ }
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+FUNCTION (gsl_block, raw_fwrite) (FILE * stream, const ATOMIC * data,
+ const size_t n, const size_t stride)
+{
+
+ if (stride == 1)
+ {
+ size_t items = fwrite (data, MULTIPLICITY * sizeof (ATOMIC), n, stream);
+
+ if (items != n)
+ {
+ GSL_ERROR ("fwrite failed", GSL_EFAILED);
+ }
+ }
+ else
+ {
+ size_t i;
+
+ for (i = 0; i < n; i++)
+ {
+ size_t item = fwrite (data + MULTIPLICITY * i * stride,
+ MULTIPLICITY * sizeof (ATOMIC),
+ 1, stream);
+ if (item != 1)
+ {
+ GSL_ERROR ("fwrite failed", GSL_EFAILED);
+ }
+ }
+ }
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/block/gsl_block.h b/gsl-1.9/block/gsl_block.h
new file mode 100644
index 0000000..f1f9ef8
--- /dev/null
+++ b/gsl-1.9/block/gsl_block.h
@@ -0,0 +1,24 @@
+#ifndef __GSL_BLOCK_H__
+#define __GSL_BLOCK_H__
+
+#include <gsl/gsl_block_complex_long_double.h>
+#include <gsl/gsl_block_complex_double.h>
+#include <gsl/gsl_block_complex_float.h>
+
+#include <gsl/gsl_block_long_double.h>
+#include <gsl/gsl_block_double.h>
+#include <gsl/gsl_block_float.h>
+
+#include <gsl/gsl_block_ulong.h>
+#include <gsl/gsl_block_long.h>
+
+#include <gsl/gsl_block_uint.h>
+#include <gsl/gsl_block_int.h>
+
+#include <gsl/gsl_block_ushort.h>
+#include <gsl/gsl_block_short.h>
+
+#include <gsl/gsl_block_uchar.h>
+#include <gsl/gsl_block_char.h>
+
+#endif /* __GSL_BLOCK_H__ */
diff --git a/gsl-1.9/block/gsl_block_char.h b/gsl-1.9/block/gsl_block_char.h
new file mode 100644
index 0000000..da79f2d
--- /dev/null
+++ b/gsl-1.9/block/gsl_block_char.h
@@ -0,0 +1,65 @@
+/* block/gsl_block_char.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_BLOCK_CHAR_H__
+#define __GSL_BLOCK_CHAR_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+struct gsl_block_char_struct
+{
+ size_t size;
+ char *data;
+};
+
+typedef struct gsl_block_char_struct gsl_block_char;
+
+gsl_block_char *gsl_block_char_alloc (const size_t n);
+gsl_block_char *gsl_block_char_calloc (const size_t n);
+void gsl_block_char_free (gsl_block_char * b);
+
+int gsl_block_char_fread (FILE * stream, gsl_block_char * b);
+int gsl_block_char_fwrite (FILE * stream, const gsl_block_char * b);
+int gsl_block_char_fscanf (FILE * stream, gsl_block_char * b);
+int gsl_block_char_fprintf (FILE * stream, const gsl_block_char * b, const char *format);
+
+int gsl_block_char_raw_fread (FILE * stream, char * b, const size_t n, const size_t stride);
+int gsl_block_char_raw_fwrite (FILE * stream, const char * b, const size_t n, const size_t stride);
+int gsl_block_char_raw_fscanf (FILE * stream, char * b, const size_t n, const size_t stride);
+int gsl_block_char_raw_fprintf (FILE * stream, const char * b, const size_t n, const size_t stride, const char *format);
+
+size_t gsl_block_char_size (const gsl_block_char * b);
+char * gsl_block_char_data (const gsl_block_char * b);
+
+__END_DECLS
+
+#endif /* __GSL_BLOCK_CHAR_H__ */
diff --git a/gsl-1.9/block/gsl_block_complex_double.h b/gsl-1.9/block/gsl_block_complex_double.h
new file mode 100644
index 0000000..fdff085
--- /dev/null
+++ b/gsl-1.9/block/gsl_block_complex_double.h
@@ -0,0 +1,65 @@
+/* block/gsl_block_complex_double.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_BLOCK_COMPLEX_DOUBLE_H__
+#define __GSL_BLOCK_COMPLEX_DOUBLE_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+struct gsl_block_complex_struct
+{
+ size_t size;
+ double *data;
+};
+
+typedef struct gsl_block_complex_struct gsl_block_complex;
+
+gsl_block_complex *gsl_block_complex_alloc (const size_t n);
+gsl_block_complex *gsl_block_complex_calloc (const size_t n);
+void gsl_block_complex_free (gsl_block_complex * b);
+
+int gsl_block_complex_fread (FILE * stream, gsl_block_complex * b);
+int gsl_block_complex_fwrite (FILE * stream, const gsl_block_complex * b);
+int gsl_block_complex_fscanf (FILE * stream, gsl_block_complex * b);
+int gsl_block_complex_fprintf (FILE * stream, const gsl_block_complex * b, const char *format);
+
+int gsl_block_complex_raw_fread (FILE * stream, double * b, const size_t n, const size_t stride);
+int gsl_block_complex_raw_fwrite (FILE * stream, const double * b, const size_t n, const size_t stride);
+int gsl_block_complex_raw_fscanf (FILE * stream, double * b, const size_t n, const size_t stride);
+int gsl_block_complex_raw_fprintf (FILE * stream, const double * b, const size_t n, const size_t stride, const char *format);
+
+size_t gsl_block_complex_size (const gsl_block_complex * b);
+double * gsl_block_complex_data (const gsl_block_complex * b);
+
+__END_DECLS
+
+#endif /* __GSL_BLOCK_COMPLEX_DOUBLE_H__ */
diff --git a/gsl-1.9/block/gsl_block_complex_float.h b/gsl-1.9/block/gsl_block_complex_float.h
new file mode 100644
index 0000000..3dd4603
--- /dev/null
+++ b/gsl-1.9/block/gsl_block_complex_float.h
@@ -0,0 +1,65 @@
+/* block/gsl_block_complex_float.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_BLOCK_COMPLEX_FLOAT_H__
+#define __GSL_BLOCK_COMPLEX_FLOAT_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+struct gsl_block_complex_float_struct
+{
+ size_t size;
+ float *data;
+};
+
+typedef struct gsl_block_complex_float_struct gsl_block_complex_float;
+
+gsl_block_complex_float *gsl_block_complex_float_alloc (const size_t n);
+gsl_block_complex_float *gsl_block_complex_float_calloc (const size_t n);
+void gsl_block_complex_float_free (gsl_block_complex_float * b);
+
+int gsl_block_complex_float_fread (FILE * stream, gsl_block_complex_float * b);
+int gsl_block_complex_float_fwrite (FILE * stream, const gsl_block_complex_float * b);
+int gsl_block_complex_float_fscanf (FILE * stream, gsl_block_complex_float * b);
+int gsl_block_complex_float_fprintf (FILE * stream, const gsl_block_complex_float * b, const char *format);
+
+int gsl_block_complex_float_raw_fread (FILE * stream, float * b, const size_t n, const size_t stride);
+int gsl_block_complex_float_raw_fwrite (FILE * stream, const float * b, const size_t n, const size_t stride);
+int gsl_block_complex_float_raw_fscanf (FILE * stream, float * b, const size_t n, const size_t stride);
+int gsl_block_complex_float_raw_fprintf (FILE * stream, const float * b, const size_t n, const size_t stride, const char *format);
+
+size_t gsl_block_complex_float_size (const gsl_block_complex_float * b);
+float * gsl_block_complex_float_data (const gsl_block_complex_float * b);
+
+__END_DECLS
+
+#endif /* __GSL_BLOCK_COMPLEX_FLOAT_H__ */
diff --git a/gsl-1.9/block/gsl_block_complex_long_double.h b/gsl-1.9/block/gsl_block_complex_long_double.h
new file mode 100644
index 0000000..a28840f
--- /dev/null
+++ b/gsl-1.9/block/gsl_block_complex_long_double.h
@@ -0,0 +1,65 @@
+/* block/gsl_block_complex_long_double.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_BLOCK_COMPLEX_LONG_DOUBLE_H__
+#define __GSL_BLOCK_COMPLEX_LONG_DOUBLE_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+struct gsl_block_complex_long_double_struct
+{
+ size_t size;
+ long double *data;
+};
+
+typedef struct gsl_block_complex_long_double_struct gsl_block_complex_long_double;
+
+gsl_block_complex_long_double *gsl_block_complex_long_double_alloc (const size_t n);
+gsl_block_complex_long_double *gsl_block_complex_long_double_calloc (const size_t n);
+void gsl_block_complex_long_double_free (gsl_block_complex_long_double * b);
+
+int gsl_block_complex_long_double_fread (FILE * stream, gsl_block_complex_long_double * b);
+int gsl_block_complex_long_double_fwrite (FILE * stream, const gsl_block_complex_long_double * b);
+int gsl_block_complex_long_double_fscanf (FILE * stream, gsl_block_complex_long_double * b);
+int gsl_block_complex_long_double_fprintf (FILE * stream, const gsl_block_complex_long_double * b, const char *format);
+
+int gsl_block_complex_long_double_raw_fread (FILE * stream, long double * b, const size_t n, const size_t stride);
+int gsl_block_complex_long_double_raw_fwrite (FILE * stream, const long double * b, const size_t n, const size_t stride);
+int gsl_block_complex_long_double_raw_fscanf (FILE * stream, long double * b, const size_t n, const size_t stride);
+int gsl_block_complex_long_double_raw_fprintf (FILE * stream, const long double * b, const size_t n, const size_t stride, const char *format);
+
+size_t gsl_block_complex_long_double_size (const gsl_block_complex_long_double * b);
+long double * gsl_block_complex_long_double_data (const gsl_block_complex_long_double * b);
+
+__END_DECLS
+
+#endif /* __GSL_BLOCK_COMPLEX_LONG_DOUBLE_H__ */
diff --git a/gsl-1.9/block/gsl_block_double.h b/gsl-1.9/block/gsl_block_double.h
new file mode 100644
index 0000000..08a21a5
--- /dev/null
+++ b/gsl-1.9/block/gsl_block_double.h
@@ -0,0 +1,65 @@
+/* block/gsl_block_double.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_BLOCK_DOUBLE_H__
+#define __GSL_BLOCK_DOUBLE_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+struct gsl_block_struct
+{
+ size_t size;
+ double *data;
+};
+
+typedef struct gsl_block_struct gsl_block;
+
+gsl_block *gsl_block_alloc (const size_t n);
+gsl_block *gsl_block_calloc (const size_t n);
+void gsl_block_free (gsl_block * b);
+
+int gsl_block_fread (FILE * stream, gsl_block * b);
+int gsl_block_fwrite (FILE * stream, const gsl_block * b);
+int gsl_block_fscanf (FILE * stream, gsl_block * b);
+int gsl_block_fprintf (FILE * stream, const gsl_block * b, const char *format);
+
+int gsl_block_raw_fread (FILE * stream, double * b, const size_t n, const size_t stride);
+int gsl_block_raw_fwrite (FILE * stream, const double * b, const size_t n, const size_t stride);
+int gsl_block_raw_fscanf (FILE * stream, double * b, const size_t n, const size_t stride);
+int gsl_block_raw_fprintf (FILE * stream, const double * b, const size_t n, const size_t stride, const char *format);
+
+size_t gsl_block_size (const gsl_block * b);
+double * gsl_block_data (const gsl_block * b);
+
+__END_DECLS
+
+#endif /* __GSL_BLOCK_DOUBLE_H__ */
diff --git a/gsl-1.9/block/gsl_block_float.h b/gsl-1.9/block/gsl_block_float.h
new file mode 100644
index 0000000..e79497f
--- /dev/null
+++ b/gsl-1.9/block/gsl_block_float.h
@@ -0,0 +1,65 @@
+/* block/gsl_block_float.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_BLOCK_FLOAT_H__
+#define __GSL_BLOCK_FLOAT_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+struct gsl_block_float_struct
+{
+ size_t size;
+ float *data;
+};
+
+typedef struct gsl_block_float_struct gsl_block_float;
+
+gsl_block_float *gsl_block_float_alloc (const size_t n);
+gsl_block_float *gsl_block_float_calloc (const size_t n);
+void gsl_block_float_free (gsl_block_float * b);
+
+int gsl_block_float_fread (FILE * stream, gsl_block_float * b);
+int gsl_block_float_fwrite (FILE * stream, const gsl_block_float * b);
+int gsl_block_float_fscanf (FILE * stream, gsl_block_float * b);
+int gsl_block_float_fprintf (FILE * stream, const gsl_block_float * b, const char *format);
+
+int gsl_block_float_raw_fread (FILE * stream, float * b, const size_t n, const size_t stride);
+int gsl_block_float_raw_fwrite (FILE * stream, const float * b, const size_t n, const size_t stride);
+int gsl_block_float_raw_fscanf (FILE * stream, float * b, const size_t n, const size_t stride);
+int gsl_block_float_raw_fprintf (FILE * stream, const float * b, const size_t n, const size_t stride, const char *format);
+
+size_t gsl_block_float_size (const gsl_block_float * b);
+float * gsl_block_float_data (const gsl_block_float * b);
+
+__END_DECLS
+
+#endif /* __GSL_BLOCK_FLOAT_H__ */
diff --git a/gsl-1.9/block/gsl_block_int.h b/gsl-1.9/block/gsl_block_int.h
new file mode 100644
index 0000000..93f0b30
--- /dev/null
+++ b/gsl-1.9/block/gsl_block_int.h
@@ -0,0 +1,65 @@
+/* block/gsl_block_int.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_BLOCK_INT_H__
+#define __GSL_BLOCK_INT_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+struct gsl_block_int_struct
+{
+ size_t size;
+ int *data;
+};
+
+typedef struct gsl_block_int_struct gsl_block_int;
+
+gsl_block_int *gsl_block_int_alloc (const size_t n);
+gsl_block_int *gsl_block_int_calloc (const size_t n);
+void gsl_block_int_free (gsl_block_int * b);
+
+int gsl_block_int_fread (FILE * stream, gsl_block_int * b);
+int gsl_block_int_fwrite (FILE * stream, const gsl_block_int * b);
+int gsl_block_int_fscanf (FILE * stream, gsl_block_int * b);
+int gsl_block_int_fprintf (FILE * stream, const gsl_block_int * b, const char *format);
+
+int gsl_block_int_raw_fread (FILE * stream, int * b, const size_t n, const size_t stride);
+int gsl_block_int_raw_fwrite (FILE * stream, const int * b, const size_t n, const size_t stride);
+int gsl_block_int_raw_fscanf (FILE * stream, int * b, const size_t n, const size_t stride);
+int gsl_block_int_raw_fprintf (FILE * stream, const int * b, const size_t n, const size_t stride, const char *format);
+
+size_t gsl_block_int_size (const gsl_block_int * b);
+int * gsl_block_int_data (const gsl_block_int * b);
+
+__END_DECLS
+
+#endif /* __GSL_BLOCK_INT_H__ */
diff --git a/gsl-1.9/block/gsl_block_long.h b/gsl-1.9/block/gsl_block_long.h
new file mode 100644
index 0000000..103199f
--- /dev/null
+++ b/gsl-1.9/block/gsl_block_long.h
@@ -0,0 +1,65 @@
+/* block/gsl_block_long.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_BLOCK_LONG_H__
+#define __GSL_BLOCK_LONG_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+struct gsl_block_long_struct
+{
+ size_t size;
+ long *data;
+};
+
+typedef struct gsl_block_long_struct gsl_block_long;
+
+gsl_block_long *gsl_block_long_alloc (const size_t n);
+gsl_block_long *gsl_block_long_calloc (const size_t n);
+void gsl_block_long_free (gsl_block_long * b);
+
+int gsl_block_long_fread (FILE * stream, gsl_block_long * b);
+int gsl_block_long_fwrite (FILE * stream, const gsl_block_long * b);
+int gsl_block_long_fscanf (FILE * stream, gsl_block_long * b);
+int gsl_block_long_fprintf (FILE * stream, const gsl_block_long * b, const char *format);
+
+int gsl_block_long_raw_fread (FILE * stream, long * b, const size_t n, const size_t stride);
+int gsl_block_long_raw_fwrite (FILE * stream, const long * b, const size_t n, const size_t stride);
+int gsl_block_long_raw_fscanf (FILE * stream, long * b, const size_t n, const size_t stride);
+int gsl_block_long_raw_fprintf (FILE * stream, const long * b, const size_t n, const size_t stride, const char *format);
+
+size_t gsl_block_long_size (const gsl_block_long * b);
+long * gsl_block_long_data (const gsl_block_long * b);
+
+__END_DECLS
+
+#endif /* __GSL_BLOCK_LONG_H__ */
diff --git a/gsl-1.9/block/gsl_block_long_double.h b/gsl-1.9/block/gsl_block_long_double.h
new file mode 100644
index 0000000..6eb6e7b
--- /dev/null
+++ b/gsl-1.9/block/gsl_block_long_double.h
@@ -0,0 +1,65 @@
+/* block/gsl_block_long_double.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_BLOCK_LONG_DOUBLE_H__
+#define __GSL_BLOCK_LONG_DOUBLE_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+struct gsl_block_long_double_struct
+{
+ size_t size;
+ long double *data;
+};
+
+typedef struct gsl_block_long_double_struct gsl_block_long_double;
+
+gsl_block_long_double *gsl_block_long_double_alloc (const size_t n);
+gsl_block_long_double *gsl_block_long_double_calloc (const size_t n);
+void gsl_block_long_double_free (gsl_block_long_double * b);
+
+int gsl_block_long_double_fread (FILE * stream, gsl_block_long_double * b);
+int gsl_block_long_double_fwrite (FILE * stream, const gsl_block_long_double * b);
+int gsl_block_long_double_fscanf (FILE * stream, gsl_block_long_double * b);
+int gsl_block_long_double_fprintf (FILE * stream, const gsl_block_long_double * b, const char *format);
+
+int gsl_block_long_double_raw_fread (FILE * stream, long double * b, const size_t n, const size_t stride);
+int gsl_block_long_double_raw_fwrite (FILE * stream, const long double * b, const size_t n, const size_t stride);
+int gsl_block_long_double_raw_fscanf (FILE * stream, long double * b, const size_t n, const size_t stride);
+int gsl_block_long_double_raw_fprintf (FILE * stream, const long double * b, const size_t n, const size_t stride, const char *format);
+
+size_t gsl_block_long_double_size (const gsl_block_long_double * b);
+long double * gsl_block_long_double_data (const gsl_block_long_double * b);
+
+__END_DECLS
+
+#endif /* __GSL_BLOCK_LONG_DOUBLE_H__ */
diff --git a/gsl-1.9/block/gsl_block_short.h b/gsl-1.9/block/gsl_block_short.h
new file mode 100644
index 0000000..401af07
--- /dev/null
+++ b/gsl-1.9/block/gsl_block_short.h
@@ -0,0 +1,65 @@
+/* block/gsl_block_short.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_BLOCK_SHORT_H__
+#define __GSL_BLOCK_SHORT_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+struct gsl_block_short_struct
+{
+ size_t size;
+ short *data;
+};
+
+typedef struct gsl_block_short_struct gsl_block_short;
+
+gsl_block_short *gsl_block_short_alloc (const size_t n);
+gsl_block_short *gsl_block_short_calloc (const size_t n);
+void gsl_block_short_free (gsl_block_short * b);
+
+int gsl_block_short_fread (FILE * stream, gsl_block_short * b);
+int gsl_block_short_fwrite (FILE * stream, const gsl_block_short * b);
+int gsl_block_short_fscanf (FILE * stream, gsl_block_short * b);
+int gsl_block_short_fprintf (FILE * stream, const gsl_block_short * b, const char *format);
+
+int gsl_block_short_raw_fread (FILE * stream, short * b, const size_t n, const size_t stride);
+int gsl_block_short_raw_fwrite (FILE * stream, const short * b, const size_t n, const size_t stride);
+int gsl_block_short_raw_fscanf (FILE * stream, short * b, const size_t n, const size_t stride);
+int gsl_block_short_raw_fprintf (FILE * stream, const short * b, const size_t n, const size_t stride, const char *format);
+
+size_t gsl_block_short_size (const gsl_block_short * b);
+short * gsl_block_short_data (const gsl_block_short * b);
+
+__END_DECLS
+
+#endif /* __GSL_BLOCK_SHORT_H__ */
diff --git a/gsl-1.9/block/gsl_block_uchar.h b/gsl-1.9/block/gsl_block_uchar.h
new file mode 100644
index 0000000..8a2b4b1
--- /dev/null
+++ b/gsl-1.9/block/gsl_block_uchar.h
@@ -0,0 +1,65 @@
+/* block/gsl_block_uchar.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_BLOCK_UCHAR_H__
+#define __GSL_BLOCK_UCHAR_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+struct gsl_block_uchar_struct
+{
+ size_t size;
+ unsigned char *data;
+};
+
+typedef struct gsl_block_uchar_struct gsl_block_uchar;
+
+gsl_block_uchar *gsl_block_uchar_alloc (const size_t n);
+gsl_block_uchar *gsl_block_uchar_calloc (const size_t n);
+void gsl_block_uchar_free (gsl_block_uchar * b);
+
+int gsl_block_uchar_fread (FILE * stream, gsl_block_uchar * b);
+int gsl_block_uchar_fwrite (FILE * stream, const gsl_block_uchar * b);
+int gsl_block_uchar_fscanf (FILE * stream, gsl_block_uchar * b);
+int gsl_block_uchar_fprintf (FILE * stream, const gsl_block_uchar * b, const char *format);
+
+int gsl_block_uchar_raw_fread (FILE * stream, unsigned char * b, const size_t n, const size_t stride);
+int gsl_block_uchar_raw_fwrite (FILE * stream, const unsigned char * b, const size_t n, const size_t stride);
+int gsl_block_uchar_raw_fscanf (FILE * stream, unsigned char * b, const size_t n, const size_t stride);
+int gsl_block_uchar_raw_fprintf (FILE * stream, const unsigned char * b, const size_t n, const size_t stride, const char *format);
+
+size_t gsl_block_uchar_size (const gsl_block_uchar * b);
+unsigned char * gsl_block_uchar_data (const gsl_block_uchar * b);
+
+__END_DECLS
+
+#endif /* __GSL_BLOCK_UCHAR_H__ */
diff --git a/gsl-1.9/block/gsl_block_uint.h b/gsl-1.9/block/gsl_block_uint.h
new file mode 100644
index 0000000..00b3976
--- /dev/null
+++ b/gsl-1.9/block/gsl_block_uint.h
@@ -0,0 +1,65 @@
+/* block/gsl_block_uint.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_BLOCK_UINT_H__
+#define __GSL_BLOCK_UINT_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+struct gsl_block_uint_struct
+{
+ size_t size;
+ unsigned int *data;
+};
+
+typedef struct gsl_block_uint_struct gsl_block_uint;
+
+gsl_block_uint *gsl_block_uint_alloc (const size_t n);
+gsl_block_uint *gsl_block_uint_calloc (const size_t n);
+void gsl_block_uint_free (gsl_block_uint * b);
+
+int gsl_block_uint_fread (FILE * stream, gsl_block_uint * b);
+int gsl_block_uint_fwrite (FILE * stream, const gsl_block_uint * b);
+int gsl_block_uint_fscanf (FILE * stream, gsl_block_uint * b);
+int gsl_block_uint_fprintf (FILE * stream, const gsl_block_uint * b, const char *format);
+
+int gsl_block_uint_raw_fread (FILE * stream, unsigned int * b, const size_t n, const size_t stride);
+int gsl_block_uint_raw_fwrite (FILE * stream, const unsigned int * b, const size_t n, const size_t stride);
+int gsl_block_uint_raw_fscanf (FILE * stream, unsigned int * b, const size_t n, const size_t stride);
+int gsl_block_uint_raw_fprintf (FILE * stream, const unsigned int * b, const size_t n, const size_t stride, const char *format);
+
+size_t gsl_block_uint_size (const gsl_block_uint * b);
+unsigned int * gsl_block_uint_data (const gsl_block_uint * b);
+
+__END_DECLS
+
+#endif /* __GSL_BLOCK_UINT_H__ */
diff --git a/gsl-1.9/block/gsl_block_ulong.h b/gsl-1.9/block/gsl_block_ulong.h
new file mode 100644
index 0000000..1968a85
--- /dev/null
+++ b/gsl-1.9/block/gsl_block_ulong.h
@@ -0,0 +1,65 @@
+/* block/gsl_block_ulong.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_BLOCK_ULONG_H__
+#define __GSL_BLOCK_ULONG_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+struct gsl_block_ulong_struct
+{
+ size_t size;
+ unsigned long *data;
+};
+
+typedef struct gsl_block_ulong_struct gsl_block_ulong;
+
+gsl_block_ulong *gsl_block_ulong_alloc (const size_t n);
+gsl_block_ulong *gsl_block_ulong_calloc (const size_t n);
+void gsl_block_ulong_free (gsl_block_ulong * b);
+
+int gsl_block_ulong_fread (FILE * stream, gsl_block_ulong * b);
+int gsl_block_ulong_fwrite (FILE * stream, const gsl_block_ulong * b);
+int gsl_block_ulong_fscanf (FILE * stream, gsl_block_ulong * b);
+int gsl_block_ulong_fprintf (FILE * stream, const gsl_block_ulong * b, const char *format);
+
+int gsl_block_ulong_raw_fread (FILE * stream, unsigned long * b, const size_t n, const size_t stride);
+int gsl_block_ulong_raw_fwrite (FILE * stream, const unsigned long * b, const size_t n, const size_t stride);
+int gsl_block_ulong_raw_fscanf (FILE * stream, unsigned long * b, const size_t n, const size_t stride);
+int gsl_block_ulong_raw_fprintf (FILE * stream, const unsigned long * b, const size_t n, const size_t stride, const char *format);
+
+size_t gsl_block_ulong_size (const gsl_block_ulong * b);
+unsigned long * gsl_block_ulong_data (const gsl_block_ulong * b);
+
+__END_DECLS
+
+#endif /* __GSL_BLOCK_ULONG_H__ */
diff --git a/gsl-1.9/block/gsl_block_ushort.h b/gsl-1.9/block/gsl_block_ushort.h
new file mode 100644
index 0000000..6d96cbd
--- /dev/null
+++ b/gsl-1.9/block/gsl_block_ushort.h
@@ -0,0 +1,65 @@
+/* block/gsl_block_ushort.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_BLOCK_USHORT_H__
+#define __GSL_BLOCK_USHORT_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+struct gsl_block_ushort_struct
+{
+ size_t size;
+ unsigned short *data;
+};
+
+typedef struct gsl_block_ushort_struct gsl_block_ushort;
+
+gsl_block_ushort *gsl_block_ushort_alloc (const size_t n);
+gsl_block_ushort *gsl_block_ushort_calloc (const size_t n);
+void gsl_block_ushort_free (gsl_block_ushort * b);
+
+int gsl_block_ushort_fread (FILE * stream, gsl_block_ushort * b);
+int gsl_block_ushort_fwrite (FILE * stream, const gsl_block_ushort * b);
+int gsl_block_ushort_fscanf (FILE * stream, gsl_block_ushort * b);
+int gsl_block_ushort_fprintf (FILE * stream, const gsl_block_ushort * b, const char *format);
+
+int gsl_block_ushort_raw_fread (FILE * stream, unsigned short * b, const size_t n, const size_t stride);
+int gsl_block_ushort_raw_fwrite (FILE * stream, const unsigned short * b, const size_t n, const size_t stride);
+int gsl_block_ushort_raw_fscanf (FILE * stream, unsigned short * b, const size_t n, const size_t stride);
+int gsl_block_ushort_raw_fprintf (FILE * stream, const unsigned short * b, const size_t n, const size_t stride, const char *format);
+
+size_t gsl_block_ushort_size (const gsl_block_ushort * b);
+unsigned short * gsl_block_ushort_data (const gsl_block_ushort * b);
+
+__END_DECLS
+
+#endif /* __GSL_BLOCK_USHORT_H__ */
diff --git a/gsl-1.9/block/gsl_check_range.h b/gsl-1.9/block/gsl_check_range.h
new file mode 100644
index 0000000..883ae38
--- /dev/null
+++ b/gsl-1.9/block/gsl_check_range.h
@@ -0,0 +1,57 @@
+/* vector/gsl_check_range.h
+ *
+ * Copyright (C) 2003, 2004 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_CHECK_RANGE_H__
+#define __GSL_CHECK_RANGE_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_types.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+GSL_VAR int gsl_check_range;
+
+/* Turn range checking on by default, unless the user defines
+ GSL_RANGE_CHECK_OFF, or defines GSL_RANGE_CHECK to 0 explicitly */
+
+#ifdef GSL_RANGE_CHECK_OFF
+# ifndef GSL_RANGE_CHECK
+# define GSL_RANGE_CHECK 0
+# else
+# error "cannot set both GSL_RANGE_CHECK and GSL_RANGE_CHECK_OFF"
+# endif
+#else
+# ifndef GSL_RANGE_CHECK
+# define GSL_RANGE_CHECK 1
+# endif
+#endif
+
+__END_DECLS
+
+#endif /* __GSL_CHECK_RANGE_H__ */
diff --git a/gsl-1.9/block/init.c b/gsl-1.9/block/init.c
new file mode 100644
index 0000000..0d3c3ad
--- /dev/null
+++ b/gsl-1.9/block/init.c
@@ -0,0 +1,87 @@
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_block.h>
+
+#define BASE_GSL_COMPLEX_LONG
+#include "templates_on.h"
+#include "init_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_LONG
+
+#define BASE_GSL_COMPLEX
+#include "templates_on.h"
+#include "init_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX
+
+#define BASE_GSL_COMPLEX_FLOAT
+#include "templates_on.h"
+#include "init_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_FLOAT
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "init_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "init_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "init_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "init_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "init_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "init_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "init_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "init_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "init_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "init_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "init_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
diff --git a/gsl-1.9/block/init_source.c b/gsl-1.9/block/init_source.c
new file mode 100644
index 0000000..531204a
--- /dev/null
+++ b/gsl-1.9/block/init_source.c
@@ -0,0 +1,79 @@
+/* block/init_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+TYPE (gsl_block) *
+FUNCTION (gsl_block, alloc) (const size_t n)
+{
+ TYPE (gsl_block) * b;
+
+ if (n == 0)
+ {
+ GSL_ERROR_VAL ("block length n must be positive integer",
+ GSL_EINVAL, 0);
+ }
+
+ b = (TYPE (gsl_block) *) malloc (sizeof (TYPE (gsl_block)));
+
+ if (b == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for block struct",
+ GSL_ENOMEM, 0);
+ }
+
+ b->data = (ATOMIC *) malloc (MULTIPLICITY * n * sizeof (ATOMIC));
+
+ if (b->data == 0)
+ {
+ free (b); /* exception in constructor, avoid memory leak */
+
+ GSL_ERROR_VAL ("failed to allocate space for block data",
+ GSL_ENOMEM, 0);
+ }
+
+ b->size = n;
+
+ return b;
+}
+
+TYPE (gsl_block) *
+FUNCTION (gsl_block, calloc) (const size_t n)
+{
+ size_t i;
+
+ TYPE (gsl_block) * b = FUNCTION (gsl_block, alloc) (n);
+
+ if (b == 0)
+ return 0;
+
+ /* initialize block to zero */
+
+ for (i = 0; i < MULTIPLICITY * n; i++)
+ {
+ b->data[i] = 0;
+ }
+
+ return b;
+}
+
+void
+FUNCTION (gsl_block, free) (TYPE (gsl_block) * b)
+{
+ free (b->data);
+ free (b);
+}
diff --git a/gsl-1.9/block/test.c b/gsl-1.9/block/test.c
new file mode 100644
index 0000000..6c885d2
--- /dev/null
+++ b/gsl-1.9/block/test.c
@@ -0,0 +1,223 @@
+/* block/test.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <gsl/gsl_block.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_test.h>
+
+int status = 0;
+
+#ifndef DESC
+#define DESC ""
+#endif
+
+#define N 1027
+
+
+#define BASE_GSL_COMPLEX_LONG
+#include "templates_on.h"
+#include "test_complex_source.c"
+#if HAVE_PRINTF_LONGDOUBLE
+#include "test_complex_io.c"
+#endif
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_LONG
+
+
+#define BASE_GSL_COMPLEX
+#include "templates_on.h"
+#include "test_complex_source.c"
+#include "test_complex_io.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX
+
+#define BASE_GSL_COMPLEX_FLOAT
+#include "templates_on.h"
+#include "test_complex_source.c"
+#include "test_complex_io.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_FLOAT
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "test_source.c"
+#if HAVE_PRINTF_LONGDOUBLE
+#include "test_io.c"
+#endif
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "test_source.c"
+#include "test_io.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "test_source.c"
+#include "test_io.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "test_source.c"
+#include "test_io.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "test_source.c"
+#include "test_io.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "test_source.c"
+#include "test_io.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "test_source.c"
+#include "test_io.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "test_source.c"
+#include "test_io.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "test_source.c"
+#include "test_io.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "test_source.c"
+#include "test_io.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "test_source.c"
+#include "test_io.c"
+#include "templates_off.h"
+#undef BASE_CHAR
+
+void my_error_handler (const char *reason, const char *file,
+ int line, int err);
+
+int
+main (void)
+{
+ gsl_ieee_env_setup ();
+
+ test_func ();
+ test_float_func ();
+ test_long_double_func ();
+ test_ulong_func ();
+ test_long_func ();
+ test_uint_func ();
+ test_int_func ();
+ test_ushort_func ();
+ test_short_func ();
+ test_uchar_func ();
+ test_char_func ();
+ test_complex_func ();
+ test_complex_float_func ();
+ test_complex_long_double_func ();
+
+ test_text ();
+ test_float_text ();
+#if HAVE_PRINTF_LONGDOUBLE
+ test_long_double_text ();
+#endif
+ test_ulong_text ();
+ test_long_text ();
+ test_uint_text ();
+ test_int_text ();
+ test_ushort_text ();
+ test_short_text ();
+ test_uchar_text ();
+ test_char_text ();
+ test_complex_text ();
+ test_complex_float_text ();
+#if HAVE_PRINTF_LONGDOUBLE
+ test_complex_long_double_text ();
+#endif
+
+ test_binary ();
+ test_float_binary ();
+ test_long_double_binary ();
+ test_ulong_binary ();
+ test_long_binary ();
+ test_uint_binary ();
+ test_int_binary ();
+ test_ushort_binary ();
+ test_short_binary ();
+ test_uchar_binary ();
+ test_char_binary ();
+ test_complex_binary ();
+ test_complex_float_binary ();
+ test_complex_long_double_binary ();
+
+ gsl_set_error_handler (&my_error_handler);
+
+ test_trap ();
+ test_float_trap ();
+ test_long_double_trap ();
+ test_ulong_trap ();
+ test_long_trap ();
+ test_uint_trap ();
+ test_int_trap ();
+ test_ushort_trap ();
+ test_short_trap ();
+ test_uchar_trap ();
+ test_char_trap ();
+ test_complex_trap ();
+ test_complex_float_trap ();
+ test_complex_long_double_trap ();
+
+ exit (gsl_test_summary ());
+}
+
+void
+my_error_handler (const char *reason, const char *file, int line, int err)
+{
+ if (0)
+ printf ("(caught [%s:%d: %s (%d)])\n", file, line, reason, err);
+ status = 1;
+}
diff --git a/gsl-1.9/block/test_complex_io.c b/gsl-1.9/block/test_complex_io.c
new file mode 100644
index 0000000..a475f88
--- /dev/null
+++ b/gsl-1.9/block/test_complex_io.c
@@ -0,0 +1,64 @@
+/* block/test_complex_io.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+void FUNCTION (test, text) (void);
+
+void
+FUNCTION (test, text) (void)
+{
+ size_t i;
+
+ {
+ TYPE (gsl_block) *v = FUNCTION (gsl_block, calloc) (N);
+
+ FILE *f = fopen ("test.txt", "w");
+
+ for (i = 0; i < N; i++)
+ {
+ v->data[2*i] = (ATOMIC)i ;
+ v->data[2*i + 1] = (ATOMIC)(10*i + 1) ;
+ };
+
+ FUNCTION (gsl_block, fprintf) (f, v, OUT_FORMAT);
+
+ fclose (f);
+
+ FUNCTION (gsl_block, free) (v);
+ }
+
+ {
+ TYPE (gsl_block) *w = FUNCTION (gsl_block, calloc) (N);
+
+ FILE *f = fopen ("test.txt", "r");
+
+ FUNCTION (gsl_block, fscanf) (f, w);
+
+ status = 0;
+ for (i = 0; i < N; i++)
+ {
+ if (w->data[2 * i] != (ATOMIC) i || w->data[2 * i + 1] != (ATOMIC) (10*i + 1))
+ status = 1;
+ };
+ fclose (f);
+
+ FUNCTION (gsl_block, free) (w);
+ }
+
+ gsl_test (status, NAME (gsl_block) "_fprintf and fscanf");
+}
diff --git a/gsl-1.9/block/test_complex_source.c b/gsl-1.9/block/test_complex_source.c
new file mode 100644
index 0000000..0cd81f0
--- /dev/null
+++ b/gsl-1.9/block/test_complex_source.c
@@ -0,0 +1,124 @@
+/* block/test_complex_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+void FUNCTION (test, func) (void);
+void FUNCTION (test, binary) (void);
+void FUNCTION (test, trap) (void);
+
+void
+FUNCTION (test, func) (void)
+{
+ TYPE (gsl_block) * b;
+ ATOMIC * data;
+ size_t i, size;
+
+ b = FUNCTION (gsl_block, alloc) (N);
+
+ gsl_test (b->data == 0, NAME (gsl_block) "_alloc returns valid pointer");
+ gsl_test (b->size != N, NAME (gsl_block) "_alloc returns valid size");
+
+ data = FUNCTION(gsl_block, data) (b);
+ size = FUNCTION(gsl_block, size) (b);
+
+ gsl_test (data == 0, NAME (gsl_block) "_data returns valid pointer");
+ gsl_test (size != N, NAME (gsl_block) "_size returns valid size");
+
+ FUNCTION (gsl_block, free) (b); /* free whatever is in v */
+
+ b = FUNCTION (gsl_block, calloc) (N);
+
+ gsl_test (b->data == 0, NAME (gsl_block) "_calloc returns valid pointer");
+ gsl_test (b->size != N, NAME (gsl_block) "_calloc returns valid size");
+
+ data = FUNCTION(gsl_block, data) (b);
+ size = FUNCTION(gsl_block, size) (b);
+
+ gsl_test (data == 0, NAME (gsl_block) "_data returns valid pointer from calloc");
+ gsl_test (size != N, NAME (gsl_block) "_size returns valid size from calloc");
+
+ status = 0;
+
+ for (i = 0; i < N; i++)
+ {
+ if (b->data[2 * i] != 0.0 || b->data[2 * i + 1] != 0.0)
+ status = 1;
+ };
+
+ gsl_test (status, NAME (gsl_block) "_calloc initializes array to zero");
+
+ FUNCTION (gsl_block, free) (b);
+}
+
+void
+FUNCTION (test, binary) (void)
+{
+ size_t i;
+
+ {
+ TYPE (gsl_block) * v = FUNCTION (gsl_block, calloc) (N);
+
+ FILE *f = fopen ("test.dat", "wb");
+
+ for (i = 0; i < N; i++)
+ {
+ v->data[2*i] = (ATOMIC)(N - i);
+ v->data[2*i + 1] = (ATOMIC)(10*(N-i) + 1);
+ };
+
+ FUNCTION (gsl_block, fwrite) (f, v);
+
+ fclose (f);
+
+ FUNCTION (gsl_block, free) (v);
+ }
+
+ {
+ TYPE (gsl_block) * w = FUNCTION (gsl_block, calloc) (N);
+
+ FILE *f = fopen ("test.dat", "rb");
+
+ FUNCTION (gsl_block, fread) (f, w);
+
+ status = 0;
+ for (i = 0; i < N; i++)
+ {
+ if (w->data[2 * i] != (ATOMIC) (N - i) || w->data[2 * i + 1] != (ATOMIC) (10*(N - i) + 1))
+ status = 1;
+ };
+ fclose (f);
+
+ FUNCTION (gsl_block, free) (w);
+ }
+
+ gsl_test (status, NAME (gsl_block) "_write and read");
+
+}
+
+
+void
+FUNCTION (test, trap) (void)
+{
+ TYPE (gsl_block) * b = FUNCTION (gsl_block, alloc) (0);
+
+ gsl_test (b != 0, NAME (gsl_block) "_alloc traps zero length");
+}
+
+
+
+
diff --git a/gsl-1.9/block/test_io.c b/gsl-1.9/block/test_io.c
new file mode 100644
index 0000000..c53b728
--- /dev/null
+++ b/gsl-1.9/block/test_io.c
@@ -0,0 +1,66 @@
+/* block/test_io.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+void FUNCTION (test, text) (void);
+
+void
+FUNCTION (test, text) (void)
+{
+ size_t i;
+
+ {
+ TYPE (gsl_block) * v = FUNCTION (gsl_block, calloc) (N);
+
+ FILE *f = fopen ("test.txt", "w");
+
+ for (i = 0; i < N; i++)
+ {
+ v->data[i] = (ATOMIC) i;
+ };
+
+ FUNCTION (gsl_block, fprintf) (f, v, OUT_FORMAT);
+
+ fclose (f);
+
+ FUNCTION (gsl_block, free) (v);
+ }
+
+ {
+ TYPE (gsl_block) * w = FUNCTION (gsl_block, calloc) (N);
+
+ FILE *f = fopen ("test.txt", "r");
+
+ FUNCTION (gsl_block, fscanf) (f, w);
+
+ status = 0;
+ for (i = 0; i < N; i++)
+ {
+ if (w->data[i] != (ATOMIC) i)
+ status = 1;
+ };
+
+ gsl_test (status, NAME (gsl_block) "_fprintf and fscanf");
+
+ fclose (f);
+
+ FUNCTION (gsl_block, free) (w);
+ }
+}
+
+
diff --git a/gsl-1.9/block/test_source.c b/gsl-1.9/block/test_source.c
new file mode 100644
index 0000000..8eab871
--- /dev/null
+++ b/gsl-1.9/block/test_source.c
@@ -0,0 +1,121 @@
+/* block/test_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+void FUNCTION (test, func) (void);
+void FUNCTION (test, binary) (void);
+void FUNCTION (test, trap) (void);
+
+void
+FUNCTION (test, func) (void)
+{
+ TYPE (gsl_block) * v;
+ ATOMIC * data;
+ size_t i, size;
+
+ v = FUNCTION (gsl_block, alloc) (N);
+
+ gsl_test (v->data == 0, NAME (gsl_block) "_alloc returns valid pointer");
+ gsl_test (v->size != N, NAME (gsl_block) "_alloc returns valid size");
+
+ data = FUNCTION(gsl_block, data) (v);
+ size = FUNCTION(gsl_block, size) (v);
+
+ gsl_test (data == 0, NAME (gsl_block) "_data returns valid pointer");
+ gsl_test (size != N, NAME (gsl_block) "_size returns valid size");
+
+
+ FUNCTION (gsl_block, free) (v); /* free whatever is in v */
+
+ v = FUNCTION (gsl_block, calloc) (N);
+
+ gsl_test (v->data == 0, NAME (gsl_block) "_calloc returns valid pointer");
+ gsl_test (v->size != N, NAME (gsl_block) "_calloc returns valid size");
+
+ data = FUNCTION(gsl_block, data) (v);
+ size = FUNCTION(gsl_block, size) (v);
+
+ gsl_test (data == 0, NAME (gsl_block) "_data returns valid pointer from calloc");
+ gsl_test (size != N, NAME (gsl_block) "_size returns valid size from calloc");
+
+ status = 0;
+
+ for (i = 0; i < N; i++)
+ {
+ if (v->data[i] != 0.0)
+ status = 1;
+ };
+
+ gsl_test (status, NAME (gsl_block) "_calloc initializes array to zero");
+
+ FUNCTION (gsl_block, free) (v); /* free whatever is in v */
+}
+
+
+void
+FUNCTION (test, binary) (void)
+{
+ size_t i;
+
+ {
+ TYPE (gsl_block) * v = FUNCTION (gsl_block, calloc) (N);
+
+ FILE *f = fopen ("test.dat", "wb");
+
+ for (i = 0; i < N; i++)
+ {
+ v->data[i] = (ATOMIC)(N - i);
+ };
+
+ FUNCTION (gsl_block, fwrite) (f, v);
+
+ fclose (f);
+
+ FUNCTION (gsl_block, free) (v);
+ }
+
+ {
+ TYPE (gsl_block) * w = FUNCTION (gsl_block, calloc) (N);
+
+ FILE *f = fopen ("test.dat", "rb");
+
+ FUNCTION (gsl_block, fread) (f, w);
+
+ status = 0;
+
+ for (i = 0; i < N; i++)
+ {
+ if (w->data[i] != (ATOMIC) (N - i))
+ status = 1;
+ };
+
+ fclose (f);
+
+ FUNCTION (gsl_block, free) (w);
+ }
+
+ gsl_test (status, NAME (gsl_block) "_write and read");
+}
+
+void
+FUNCTION (test, trap) (void)
+{
+ TYPE (gsl_block) * b = FUNCTION (gsl_block, alloc) (0);
+
+ gsl_test (b != 0, NAME (gsl_block) "_alloc traps zero length");
+}
diff --git a/gsl-1.9/bspline/ChangeLog b/gsl-1.9/bspline/ChangeLog
new file mode 100644
index 0000000..19ddc1c
--- /dev/null
+++ b/gsl-1.9/bspline/ChangeLog
@@ -0,0 +1,7 @@
+2006-11-02 Brian Gough <bjg@network-theory.co.uk>
+
+ * added test program
+
+ * initial checkin from P.Alken
+
+
diff --git a/gsl-1.9/bspline/Makefile.am b/gsl-1.9/bspline/Makefile.am
new file mode 100644
index 0000000..6dc3772
--- /dev/null
+++ b/gsl-1.9/bspline/Makefile.am
@@ -0,0 +1,15 @@
+noinst_LTLIBRARIES = libgslbspline.la
+
+pkginclude_HEADERS = gsl_bspline.h
+
+INCLUDES= -I$(top_builddir)
+
+libgslbspline_la_SOURCES = bspline.c
+
+check_PROGRAMS = test
+
+TESTS = $(check_PROGRAMS)
+
+test_LDADD = libgslbspline.la ../linalg/libgsllinalg.la ../permutation/libgslpermutation.la ../blas/libgslblas.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la ../complex/libgslcomplex.la ../cblas/libgslcblas.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+
+test_SOURCES = test.c
diff --git a/gsl-1.9/bspline/Makefile.in b/gsl-1.9/bspline/Makefile.in
new file mode 100644
index 0000000..ac743dc
--- /dev/null
+++ b/gsl-1.9/bspline/Makefile.in
@@ -0,0 +1,547 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = test$(EXEEXT)
+subdir = bspline
+DIST_COMMON = $(pkginclude_HEADERS) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in ChangeLog TODO
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgslbspline_la_LIBADD =
+am_libgslbspline_la_OBJECTS = bspline.lo
+libgslbspline_la_OBJECTS = $(am_libgslbspline_la_OBJECTS)
+am_test_OBJECTS = test.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = libgslbspline.la ../linalg/libgsllinalg.la \
+ ../permutation/libgslpermutation.la ../blas/libgslblas.la \
+ ../matrix/libgslmatrix.la ../vector/libgslvector.la \
+ ../block/libgslblock.la ../complex/libgslcomplex.la \
+ ../cblas/libgslcblas.la ../ieee-utils/libgslieeeutils.la \
+ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \
+ ../utils/libutils.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgslbspline_la_SOURCES) $(test_SOURCES)
+DIST_SOURCES = $(libgslbspline_la_SOURCES) $(test_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libgslbspline.la
+pkginclude_HEADERS = gsl_bspline.h
+INCLUDES = -I$(top_builddir)
+libgslbspline_la_SOURCES = bspline.c
+TESTS = $(check_PROGRAMS)
+test_LDADD = libgslbspline.la ../linalg/libgsllinalg.la ../permutation/libgslpermutation.la ../blas/libgslblas.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la ../complex/libgslcomplex.la ../cblas/libgslcblas.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+test_SOURCES = test.c
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps bspline/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps bspline/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgslbspline.la: $(libgslbspline_la_OBJECTS) $(libgslbspline_la_DEPENDENCIES)
+ $(LINK) $(libgslbspline_la_LDFLAGS) $(libgslbspline_la_OBJECTS) $(libgslbspline_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkgincludeHEADERS
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/bspline/TODO b/gsl-1.9/bspline/TODO
new file mode 100644
index 0000000..67f8aa8
--- /dev/null
+++ b/gsl-1.9/bspline/TODO
@@ -0,0 +1,9 @@
+Add functions:
+
+gsl_bspline_eval_deriv (see pppack bsplvd) to compute B-spline derivatives
+
+gsl_bspline_smooth to fit smoothing splines to data more efficiently
+than the standard least squares inversion (see pppack l2appr and
+smooth.spline() from GNU R)
+
++ any other useful functions from pppack
diff --git a/gsl-1.9/bspline/bspline.c b/gsl-1.9/bspline/bspline.c
new file mode 100644
index 0000000..847a498
--- /dev/null
+++ b/gsl-1.9/bspline/bspline.c
@@ -0,0 +1,497 @@
+/* bspline/bspline.c
+ *
+ * Copyright (C) 2006 Patrick Alken
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_bspline.h>
+
+/*
+ * This module contains routines related to calculating B-splines.
+ * The algorithms used are described in
+ *
+ * [1] Carl de Boor, "A Practical Guide to Splines", Springer
+ * Verlag, 1978.
+ */
+
+static int bspline_eval_all(const double x, gsl_vector *B, size_t *idx,
+ gsl_bspline_workspace *w);
+
+static inline size_t bspline_find_interval(const double x, int *flag,
+ gsl_bspline_workspace *w);
+
+/*
+gsl_bspline_alloc()
+ Allocate space for a bspline workspace. The size of the
+workspace is O(5k + nbreak)
+
+Inputs: k - spline order (cubic = 4)
+ nbreak - number of breakpoints
+
+Return: pointer to workspace
+*/
+
+gsl_bspline_workspace *
+gsl_bspline_alloc(const size_t k, const size_t nbreak)
+{
+ if (k == 0)
+ {
+ GSL_ERROR_NULL("k must be at least 1", GSL_EINVAL);
+ }
+ else if (nbreak < 2)
+ {
+ GSL_ERROR_NULL("nbreak must be at least 2", GSL_EINVAL);
+ }
+ else
+ {
+ gsl_bspline_workspace *w;
+
+ w = (gsl_bspline_workspace *)
+ calloc(1, sizeof(gsl_bspline_workspace));
+ if (w == 0)
+ {
+ GSL_ERROR_NULL("failed to allocate space for workspace", GSL_ENOMEM);
+ }
+
+ w->k = k;
+ w->km1 = k - 1;
+ w->nbreak = nbreak;
+ w->l = nbreak - 1;
+ w->n = w->l + k - 1;
+
+ w->knots = gsl_vector_alloc(w->n + k);
+ if (w->knots == 0)
+ {
+ gsl_bspline_free(w);
+ GSL_ERROR_NULL("failed to allocate space for knots vector", GSL_ENOMEM);
+ }
+
+ w->deltal = gsl_vector_alloc(k);
+ w->deltar = gsl_vector_alloc(k);
+ if (!w->deltal || !w->deltar)
+ {
+ gsl_bspline_free(w);
+ GSL_ERROR_NULL("failed to allocate space for delta vectors", GSL_ENOMEM);
+ }
+
+ w->B = gsl_vector_alloc(k);
+ if (w->B == 0)
+ {
+ gsl_bspline_free(w);
+ GSL_ERROR_NULL("failed to allocate space for temporary spline vector", GSL_ENOMEM);
+ }
+
+ return (w);
+ }
+} /* gsl_bspline_alloc() */
+
+/* Return number of coefficients */
+size_t
+gsl_bspline_ncoeffs (gsl_bspline_workspace * w)
+{
+ return w->n;
+}
+
+/* Return order */
+size_t
+gsl_bspline_order (gsl_bspline_workspace * w)
+{
+ return w->k;
+}
+
+/* Return number of breakpoints */
+size_t
+gsl_bspline_nbreak (gsl_bspline_workspace * w)
+{
+ return w->nbreak;
+}
+
+double
+gsl_bspline_breakpoint (size_t i, gsl_bspline_workspace * w)
+{
+ size_t j = i + w->k - 1;
+ return gsl_vector_get(w->knots, j);
+}
+
+/*
+gsl_bspline_free()
+ Free a bspline workspace
+
+Inputs: w - workspace to free
+
+Return: none
+*/
+
+void
+gsl_bspline_free(gsl_bspline_workspace *w)
+{
+ if (!w)
+ return;
+
+ if (w->knots)
+ gsl_vector_free(w->knots);
+
+ if (w->deltal)
+ gsl_vector_free(w->deltal);
+
+ if (w->deltar)
+ gsl_vector_free(w->deltar);
+
+ if (w->B)
+ gsl_vector_free(w->B);
+
+ free(w);
+} /* gsl_bspline_free() */
+
+/*
+gsl_bspline_knots()
+ Compute the knots from the given breakpoints:
+
+knots(1:k) = breakpts(1)
+knots(k+1:k+l-1) = breakpts(i), i = 2 .. l
+knots(n+1:n+k) = breakpts(l + 1)
+
+where l is the number of polynomial pieces (l = nbreak - 1) and
+n = k + l - 1
+(using matlab syntax for the arrays)
+
+The repeated knots at the beginning and end of the interval
+correspond to the continuity condition there. See pg. 119
+of [1].
+
+Inputs: breakpts - breakpoints
+ w - bspline workspace
+
+Return: success or error
+*/
+
+int
+gsl_bspline_knots(const gsl_vector *breakpts, gsl_bspline_workspace *w)
+{
+ if (breakpts->size != w->nbreak)
+ {
+ GSL_ERROR("breakpts vector has wrong size", GSL_EBADLEN);
+ }
+ else
+ {
+ size_t i; /* looping */
+
+ for (i = 0; i < w->k; ++i)
+ gsl_vector_set(w->knots, i, gsl_vector_get(breakpts, 0));
+
+ for (i = 1; i < w->l; ++i)
+ {
+ gsl_vector_set(w->knots, w->k - 1 + i,
+ gsl_vector_get(breakpts, i));
+ }
+
+ for (i = w->n; i < w->n + w->k; ++i)
+ gsl_vector_set(w->knots, i, gsl_vector_get(breakpts, w->l));
+
+ return GSL_SUCCESS;
+ }
+} /* gsl_bspline_knots() */
+
+/*
+gsl_bspline_knots_uniform()
+ Construct uniformly spaced knots on the interval [a,b] using
+the previously specified number of breakpoints. 'a' is the position
+of the first breakpoint and 'b' is the position of the last
+breakpoint.
+
+Inputs: a - left side of interval
+ b - right side of interval
+ w - bspline workspace
+
+Return: success or error
+
+Notes: 1) w->knots is modified to contain the uniformly spaced
+ knots
+
+ 2) The knots vector is set up as follows (using octave syntax):
+
+ knots(1:k) = a
+ knots(k+1:k+l-1) = a + i*delta, i = 1 .. l - 1
+ knots(n+1:n+k) = b
+*/
+
+int
+gsl_bspline_knots_uniform(const double a, const double b,
+ gsl_bspline_workspace *w)
+{
+ size_t i; /* looping */
+ double delta; /* interval spacing */
+ double x;
+
+ delta = (b - a) / (double) w->l;
+
+ for (i = 0; i < w->k; ++i)
+ gsl_vector_set(w->knots, i, a);
+
+ x = a + delta;
+ for (i = 0; i < w->l - 1; ++i)
+ {
+ gsl_vector_set(w->knots, w->k + i, x);
+ x += delta;
+ }
+
+ for (i = w->n; i < w->n + w->k; ++i)
+ gsl_vector_set(w->knots, i, b);
+
+ return GSL_SUCCESS;
+} /* gsl_bspline_knots_uniform() */
+
+/*
+gsl_bspline_eval()
+ Evaluate the basis functions B_i(x) for all i. This is
+basically a wrapper function for bspline_eval_all()
+which formats the output in a nice way.
+
+Inputs: x - point for evaluation
+ B - (output) where to store B_i(x) values
+ the length of this vector is
+ n = nbreak + k - 2 = l + k - 1 = w->n
+ w - bspline workspace
+
+Return: success or error
+
+Notes: The w->knots vector must be initialized prior to calling
+ this function (see gsl_bspline_knots())
+*/
+
+int
+gsl_bspline_eval(const double x, gsl_vector *B,
+ gsl_bspline_workspace *w)
+{
+ if (B->size != w->n)
+ {
+ GSL_ERROR("B vector length does not match n", GSL_EBADLEN);
+ }
+ else
+ {
+ size_t i; /* looping */
+ size_t idx = 0;
+ size_t start; /* first non-zero spline */
+
+ /* find all non-zero B_i(x) values */
+ bspline_eval_all(x, w->B, &idx, w);
+
+ /* store values in appropriate part of given vector */
+
+ start = idx - w->k + 1;
+ for (i = 0; i < start; ++i)
+ gsl_vector_set(B, i, 0.0);
+
+ for (i = start; i <= idx; ++i)
+ gsl_vector_set(B, i, gsl_vector_get(w->B, i - start));
+
+ for (i = idx + 1; i < w->n; ++i)
+ gsl_vector_set(B, i, 0.0);
+
+ return GSL_SUCCESS;
+ }
+} /* gsl_bspline_eval() */
+
+/****************************************
+ * INTERNAL ROUTINES *
+ ****************************************/
+
+/*
+bspline_eval_all()
+ Evaluate all non-zero B-splines B_i(x) using algorithm (8)
+of chapter X of [1]
+
+The idea is something like this. Given x \in [t_i, t_{i+1}]
+with t_i < t_{i+1} and the t_i are knots, the values of the
+B-splines not automatically zero fit into a triangular
+array as follows:
+ 0
+ 0
+0 B_{i-2,3}
+ B_{i-1,2}
+B_{i,1} B_{i-1,3} ...
+ B_{i,2}
+0 B_{i,3}
+ 0
+ 0
+
+where B_{i,k} is the ith B-spline of order k. The boundary 0s
+indicate that those B-splines not in the table vanish at x.
+
+To compute the non-zero B-splines of a given order k, we use
+Eqs. (4) and (5) of chapter X of [1]:
+
+(4) B_{i,1}(x) = { 1, t_i <= x < t_{i+1}
+ 0, else }
+
+(5) B_{i,k}(x) = (x - t_i)
+ ----------------- B_{i,k-1}(x)
+ (t_{i+k-1} - t_i)
+
+ t_{i+k} - x
+ + ----------------- B_{i+1,k-1}(x)
+ t_{i+k} - t_{i+1}
+
+So (4) gives us the first column of the table and we can use
+the recurrence relation (5) to get the rest of the columns.
+
+Inputs: x - point at which to evaluate splines
+ B - (output) where to store B-spline values (length k)
+ idx - (output) B-spline function index of last output
+ value (B_{idx}(x) is stored in the last slot of 'B')
+ w - bspline workspace
+
+Return: success or error
+
+Notes: 1) the w->knots vector must be initialized before calling
+ this function
+
+ 2) On output, B contains:
+
+ B = [B_{i-k+1,k}, B_{i-k+2,k}, ..., B_{i-1,k}, B_{i,k}]
+
+ where 'i' is stored in 'idx' on output
+
+ 3) based on PPPACK bsplvb
+*/
+
+static int
+bspline_eval_all(const double x, gsl_vector *B, size_t *idx,
+ gsl_bspline_workspace *w)
+{
+ if (B->size != w->k)
+ {
+ GSL_ERROR("B vector not of length k", GSL_EBADLEN);
+ }
+ else
+ {
+ size_t i; /* spline index */
+ size_t j; /* looping */
+ size_t ii; /* looping */
+ int flag = 0; /* error flag */
+ double saved;
+ double term;
+
+ i = bspline_find_interval(x, &flag, w);
+
+ if (flag == -1)
+ {
+ GSL_ERROR("x outside of knot interval", GSL_EINVAL);
+ }
+ else if (flag == 1)
+ {
+ if (x <= gsl_vector_get(w->knots, i) + GSL_DBL_EPSILON)
+ {
+ --i;
+ }
+ else
+ {
+ GSL_ERROR("x outside of knot interval", GSL_EINVAL);
+ }
+ }
+
+ *idx = i;
+
+ gsl_vector_set(B, 0, 1.0);
+
+ for (j = 0; j < w->k - 1; ++j)
+ {
+ gsl_vector_set(w->deltar, j,
+ gsl_vector_get(w->knots, i + j + 1) - x);
+ gsl_vector_set(w->deltal, j,
+ x - gsl_vector_get(w->knots, i - j));
+
+ saved = 0.0;
+
+ for (ii = 0; ii <= j; ++ii)
+ {
+ term = gsl_vector_get(B, ii) /
+ (gsl_vector_get(w->deltar, ii) +
+ gsl_vector_get(w->deltal, j - ii));
+
+ gsl_vector_set(B, ii,
+ saved +
+ gsl_vector_get(w->deltar, ii) * term);
+
+ saved = gsl_vector_get(w->deltal, j - ii) * term;
+ }
+
+ gsl_vector_set(B, j + 1, saved);
+ }
+
+ return GSL_SUCCESS;
+ }
+} /* bspline_eval_all() */
+
+/*
+bspline_find_interval()
+ Find knot interval such that
+
+ t_i <= x < t_{i + 1}
+
+where the t_i are knot values.
+
+Inputs: x - x value
+ flag - (output) error flag
+ w - bspline workspace
+
+Return: i (index in w->knots corresponding to left limit of interval)
+
+Notes: The error conditions are reported as follows:
+
+Condition Return value Flag
+--------- ------------ ----
+x < t_0 0 -1
+t_i <= x < t_{i+1} i 0
+t_{n+k-1} <= x l+k-1 +1
+*/
+
+static inline size_t
+bspline_find_interval(const double x, int *flag,
+ gsl_bspline_workspace *w)
+{
+ size_t i;
+
+ if (x < gsl_vector_get(w->knots, 0))
+ {
+ *flag = -1;
+ return 0;
+ }
+
+ /* find i such that t_i <= x < t_{i+1} */
+ for (i = w->k - 1; i < w->k + w->l - 1; ++i)
+ {
+ const double ti = gsl_vector_get(w->knots, i);
+ const double tip1 = gsl_vector_get(w->knots, i + 1);
+
+ if (tip1 < ti)
+ {
+ GSL_ERROR("knots vector is not increasing", GSL_EINVAL);
+ }
+
+ if (ti <= x && x < tip1)
+ break;
+ }
+
+ if (i == w->k + w->l - 1)
+ *flag = 1;
+ else
+ *flag = 0;
+
+ return i;
+} /* bspline_find_interval() */
diff --git a/gsl-1.9/bspline/gsl_bspline.h b/gsl-1.9/bspline/gsl_bspline.h
new file mode 100644
index 0000000..26794ec
--- /dev/null
+++ b/gsl-1.9/bspline/gsl_bspline.h
@@ -0,0 +1,75 @@
+/* bspline/gsl_bspline.h
+ *
+ * Copyright (C) 2006 Patrick Alken
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_BSPLINE_H__
+#define __GSL_BSPLINE_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_vector.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+typedef struct
+{
+ size_t k; /* spline order */
+ size_t km1; /* k - 1 (polynomial order) */
+ size_t l; /* number of polynomial pieces on interval */
+ size_t nbreak; /* number of breakpoints (l + 1) */
+ size_t n; /* number of bspline basis functions (l + k - 1) */
+
+ gsl_vector *knots; /* knots vector */
+ gsl_vector *deltal; /* left delta */
+ gsl_vector *deltar; /* right delta */
+ gsl_vector *B; /* temporary spline results */
+} gsl_bspline_workspace;
+
+gsl_bspline_workspace *
+gsl_bspline_alloc(const size_t k, const size_t nbreak);
+
+void gsl_bspline_free(gsl_bspline_workspace *w);
+
+size_t gsl_bspline_ncoeffs (gsl_bspline_workspace * w);
+size_t gsl_bspline_order (gsl_bspline_workspace * w);
+size_t gsl_bspline_nbreak (gsl_bspline_workspace * w);
+double gsl_bspline_breakpoint (size_t i, gsl_bspline_workspace * w);
+
+int
+gsl_bspline_knots(const gsl_vector *breakpts, gsl_bspline_workspace *w);
+
+int gsl_bspline_knots_uniform(const double a, const double b,
+ gsl_bspline_workspace *w);
+
+int
+gsl_bspline_eval(const double x, gsl_vector *B,
+ gsl_bspline_workspace *w);
+
+__END_DECLS
+
+#endif /* __GSL_BSPLINE_H__ */
diff --git a/gsl-1.9/bspline/test.c b/gsl-1.9/bspline/test.c
new file mode 100644
index 0000000..e05dde0
--- /dev/null
+++ b/gsl-1.9/bspline/test.c
@@ -0,0 +1,112 @@
+/* bspline/test.c
+ *
+ * Copyright (C) 2006 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_bspline.h>
+#include <gsl/gsl_ieee_utils.h>
+
+void
+test_bspline (gsl_bspline_workspace * bw)
+{
+ gsl_vector *B;
+ size_t i, j;
+ size_t n = 100;
+ size_t ncoeffs = gsl_bspline_ncoeffs (bw);
+ size_t order = gsl_bspline_order (bw);
+ size_t nbreak = gsl_bspline_nbreak (bw);
+ double a = gsl_bspline_breakpoint (0, bw);
+ double b = gsl_bspline_breakpoint (nbreak - 1, bw);
+
+ B = gsl_vector_alloc (ncoeffs);
+
+ for (i = 0; i < n; i++)
+ {
+ double xi = a + (b - a) * (i / (n - 1.0));
+ double sum = 0;
+ gsl_bspline_eval (xi, B, bw);
+
+ for (j = 0; j < ncoeffs; j++)
+ {
+ double Bj = gsl_vector_get (B, j);
+ int s = (Bj < 0 || Bj > 1);
+ gsl_test (s,
+ "basis-spline coefficient %u is in range [0,1] for x=%g",
+ j, xi);
+ sum += Bj;
+ }
+
+ gsl_test_rel (sum, 1.0, order * GSL_DBL_EPSILON,
+ "basis-spline order %u is normalized for x=%g", order,
+ xi);
+ }
+
+ gsl_vector_free (B);
+}
+
+
+
+int
+main (int argc, char **argv)
+{
+ int status = 0;
+ size_t order, breakpoints, i;
+
+ gsl_ieee_env_setup ();
+
+ argc = 0; /* prevent warnings about unused parameters */
+ argv = 0;
+
+ for (order = 1; order < 10; order++)
+ {
+ for (breakpoints = 2; breakpoints < 100; breakpoints++)
+ {
+ double a = -1.23 * order, b = 45.6 * order;
+ gsl_bspline_workspace *bw = gsl_bspline_alloc (order, breakpoints);
+ gsl_bspline_knots_uniform (a, b, bw);
+ test_bspline (bw);
+ gsl_bspline_free (bw);
+ }
+ }
+
+
+ for (order = 1; order < 10; order++)
+ {
+ for (breakpoints = 2; breakpoints < 100; breakpoints++)
+ {
+ double a = -1.23 * order, b = 45.6 * order;
+ gsl_bspline_workspace *bw = gsl_bspline_alloc (order, breakpoints);
+ gsl_vector *k = gsl_vector_alloc (breakpoints);
+ for (i = 0; i < breakpoints; i++)
+ {
+ double f, x;
+ f = sqrt (i / (breakpoints - 1.0));
+ x = (1 - f) * a + f * b;
+ gsl_vector_set (k, i, x);
+ };
+ gsl_bspline_knots (k, bw);
+ test_bspline (bw);
+ gsl_vector_free (k);
+ gsl_bspline_free (bw);
+ }
+ }
+
+ exit (gsl_test_summary ());
+}
diff --git a/gsl-1.9/cblas/ChangeLog b/gsl-1.9/cblas/ChangeLog
new file mode 100644
index 0000000..f6949d5
--- /dev/null
+++ b/gsl-1.9/cblas/ChangeLog
@@ -0,0 +1,30 @@
+2003-01-21 Brian Gough <brian.gough@network-theory.co.uk>
+
+ * test.m: skip trans=113 for complex matrix on SYRK tests.
+
+Tue Feb 19 20:50:27 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_cblas.h: added extern "C"
+
+Mon Jul 2 22:21:00 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c: added missing #include <config.h>
+
+Fri Apr 27 19:53:10 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * source_tpmv_r.h: moved index declarations to more restricted scope
+
+ * source_rotmg.h: changed declaration y1 to y in order to avoid
+ confusion with function y0(x) in C library. Also changed x1 to x.
+
+ * source_syr2k_r.h: error where lda was used instead of ldb in
+ syr2k_r was not picked up by any tests! Now fixed
+
+Thu Apr 12 16:46:16 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * all routines now included for Level 1, 2, 3-- passes blas test
+ suite for numerical results, but no error handling yet
+
+ * split out from blas directory to make an independent blas
+ library
+
diff --git a/gsl-1.9/cblas/Makefile.am b/gsl-1.9/cblas/Makefile.am
new file mode 100644
index 0000000..2d59fee
--- /dev/null
+++ b/gsl-1.9/cblas/Makefile.am
@@ -0,0 +1,19 @@
+lib_LTLIBRARIES = libgslcblas.la
+libgslcblas_la_LDFLAGS = -version-info $(GSL_LT_CBLAS_VERSION)
+
+pkginclude_HEADERS = gsl_cblas.h
+
+INCLUDES= -I$(top_srcdir)
+
+libgslcblas_la_SOURCES = sasum.c saxpy.c scasum.c scnrm2.c scopy.c sdot.c sdsdot.c sgbmv.c sgemm.c sgemv.c sger.c snrm2.c srot.c srotg.c srotm.c srotmg.c ssbmv.c sscal.c sspmv.c sspr.c sspr2.c sswap.c ssymm.c ssymv.c ssyr.c ssyr2.c ssyr2k.c ssyrk.c stbmv.c stbsv.c stpmv.c stpsv.c strmm.c strmv.c strsm.c strsv.c dasum.c daxpy.c dcopy.c ddot.c dgbmv.c dgemm.c dgemv.c dger.c dnrm2.c drot.c drotg.c drotm.c drotmg.c dsbmv.c dscal.c dsdot.c dspmv.c dspr.c dspr2.c dswap.c dsymm.c dsymv.c dsyr.c dsyr2.c dsyr2k.c dsyrk.c dtbmv.c dtbsv.c dtpmv.c dtpsv.c dtrmm.c dtrmv.c dtrsm.c dtrsv.c dzasum.c dznrm2.c caxpy.c ccopy.c cdotc_sub.c cdotu_sub.c cgbmv.c cgemm.c cgemv.c cgerc.c cgeru.c chbmv.c chemm.c chemv.c cher.c cher2.c cher2k.c cherk.c chpmv.c chpr.c chpr2.c cscal.c csscal.c cswap.c csymm.c csyr2k.c csyrk.c ctbmv.c ctbsv.c ctpmv.c ctpsv.c ctrmm.c ctrmv.c ctrsm.c ctrsv.c zaxpy.c zcopy.c zdotc_sub.c zdotu_sub.c zdscal.c zgbmv.c zgemm.c zgemv.c zgerc.c zgeru.c zhbmv.c zhemm.c zhemv.c zher.c zher2.c zher2k.c zherk.c zhpmv.c zhpr.c zhpr2.c zscal.c zswap.c zsymm.c zsyr2k.c zsyrk.c ztbmv.c ztbsv.c ztpmv.c ztpsv.c ztrmm.c ztrmv.c ztrsm.c ztrsv.c icamax.c idamax.c isamax.c izamax.c xerbla.c
+
+noinst_HEADERS = tests.c tests.h cblas.h source_asum_c.h source_asum_r.h source_axpy_c.h source_axpy_r.h source_copy_c.h source_copy_r.h source_dot_c.h source_dot_r.h source_gbmv_c.h source_gbmv_r.h source_gemm_c.h source_gemm_r.h source_gemv_c.h source_gemv_r.h source_ger.h source_gerc.h source_geru.h source_hbmv.h source_hemm.h source_hemv.h source_her.h source_her2.h source_her2k.h source_herk.h source_hpmv.h source_hpr.h source_hpr2.h source_iamax_c.h source_iamax_r.h source_nrm2_c.h source_nrm2_r.h source_rot.h source_rotg.h source_rotm.h source_rotmg.h source_sbmv.h source_scal_c.h source_scal_c_s.h source_scal_r.h source_spmv.h source_spr.h source_spr2.h source_swap_c.h source_swap_r.h source_symm_c.h source_symm_r.h source_symv.h source_syr.h source_syr2.h source_syr2k_c.h source_syr2k_r.h source_syrk_c.h source_syrk_r.h source_tbmv_c.h source_tbmv_r.h source_tbsv_c.h source_tbsv_r.h source_tpmv_c.h source_tpmv_r.h source_tpsv_c.h source_tpsv_r.h source_trmm_c.h source_trmm_r.h source_trmv_c.h source_trmv_r.h source_trsm_c.h source_trsm_r.h source_trsv_c.h source_trsv_r.h hypot.c
+
+check_PROGRAMS = test
+TESTS = $(check_PROGRAMS)
+
+test_LDADD = libgslcblas.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la
+test_SOURCES = test.c test_amax.c test_asum.c test_axpy.c test_copy.c test_dot.c test_gbmv.c test_gemm.c test_gemv.c test_ger.c test_hbmv.c test_hemm.c test_hemv.c test_her.c test_her2.c test_her2k.c test_herk.c test_hpmv.c test_hpr.c test_hpr2.c test_nrm2.c test_rot.c test_rotg.c test_rotm.c test_rotmg.c test_sbmv.c test_scal.c test_spmv.c test_spr.c test_spr2.c test_swap.c test_symm.c test_symv.c test_syr.c test_syr2.c test_syr2k.c test_syrk.c test_tbmv.c test_tbsv.c test_tpmv.c test_tpsv.c test_trmm.c test_trmv.c test_trsm.c test_trsv.c
+
+
+
diff --git a/gsl-1.9/cblas/Makefile.in b/gsl-1.9/cblas/Makefile.in
new file mode 100644
index 0000000..949eca6
--- /dev/null
+++ b/gsl-1.9/cblas/Makefile.in
@@ -0,0 +1,640 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = test$(EXEEXT)
+subdir = cblas
+DIST_COMMON = $(noinst_HEADERS) $(pkginclude_HEADERS) \
+ $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog TODO
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgincludedir)"
+libLTLIBRARIES_INSTALL = $(INSTALL)
+LTLIBRARIES = $(lib_LTLIBRARIES)
+libgslcblas_la_LIBADD =
+am_libgslcblas_la_OBJECTS = sasum.lo saxpy.lo scasum.lo scnrm2.lo \
+ scopy.lo sdot.lo sdsdot.lo sgbmv.lo sgemm.lo sgemv.lo sger.lo \
+ snrm2.lo srot.lo srotg.lo srotm.lo srotmg.lo ssbmv.lo sscal.lo \
+ sspmv.lo sspr.lo sspr2.lo sswap.lo ssymm.lo ssymv.lo ssyr.lo \
+ ssyr2.lo ssyr2k.lo ssyrk.lo stbmv.lo stbsv.lo stpmv.lo \
+ stpsv.lo strmm.lo strmv.lo strsm.lo strsv.lo dasum.lo daxpy.lo \
+ dcopy.lo ddot.lo dgbmv.lo dgemm.lo dgemv.lo dger.lo dnrm2.lo \
+ drot.lo drotg.lo drotm.lo drotmg.lo dsbmv.lo dscal.lo dsdot.lo \
+ dspmv.lo dspr.lo dspr2.lo dswap.lo dsymm.lo dsymv.lo dsyr.lo \
+ dsyr2.lo dsyr2k.lo dsyrk.lo dtbmv.lo dtbsv.lo dtpmv.lo \
+ dtpsv.lo dtrmm.lo dtrmv.lo dtrsm.lo dtrsv.lo dzasum.lo \
+ dznrm2.lo caxpy.lo ccopy.lo cdotc_sub.lo cdotu_sub.lo cgbmv.lo \
+ cgemm.lo cgemv.lo cgerc.lo cgeru.lo chbmv.lo chemm.lo chemv.lo \
+ cher.lo cher2.lo cher2k.lo cherk.lo chpmv.lo chpr.lo chpr2.lo \
+ cscal.lo csscal.lo cswap.lo csymm.lo csyr2k.lo csyrk.lo \
+ ctbmv.lo ctbsv.lo ctpmv.lo ctpsv.lo ctrmm.lo ctrmv.lo ctrsm.lo \
+ ctrsv.lo zaxpy.lo zcopy.lo zdotc_sub.lo zdotu_sub.lo zdscal.lo \
+ zgbmv.lo zgemm.lo zgemv.lo zgerc.lo zgeru.lo zhbmv.lo zhemm.lo \
+ zhemv.lo zher.lo zher2.lo zher2k.lo zherk.lo zhpmv.lo zhpr.lo \
+ zhpr2.lo zscal.lo zswap.lo zsymm.lo zsyr2k.lo zsyrk.lo \
+ ztbmv.lo ztbsv.lo ztpmv.lo ztpsv.lo ztrmm.lo ztrmv.lo ztrsm.lo \
+ ztrsv.lo icamax.lo idamax.lo isamax.lo izamax.lo xerbla.lo
+libgslcblas_la_OBJECTS = $(am_libgslcblas_la_OBJECTS)
+am_test_OBJECTS = test.$(OBJEXT) test_amax.$(OBJEXT) \
+ test_asum.$(OBJEXT) test_axpy.$(OBJEXT) test_copy.$(OBJEXT) \
+ test_dot.$(OBJEXT) test_gbmv.$(OBJEXT) test_gemm.$(OBJEXT) \
+ test_gemv.$(OBJEXT) test_ger.$(OBJEXT) test_hbmv.$(OBJEXT) \
+ test_hemm.$(OBJEXT) test_hemv.$(OBJEXT) test_her.$(OBJEXT) \
+ test_her2.$(OBJEXT) test_her2k.$(OBJEXT) test_herk.$(OBJEXT) \
+ test_hpmv.$(OBJEXT) test_hpr.$(OBJEXT) test_hpr2.$(OBJEXT) \
+ test_nrm2.$(OBJEXT) test_rot.$(OBJEXT) test_rotg.$(OBJEXT) \
+ test_rotm.$(OBJEXT) test_rotmg.$(OBJEXT) test_sbmv.$(OBJEXT) \
+ test_scal.$(OBJEXT) test_spmv.$(OBJEXT) test_spr.$(OBJEXT) \
+ test_spr2.$(OBJEXT) test_swap.$(OBJEXT) test_symm.$(OBJEXT) \
+ test_symv.$(OBJEXT) test_syr.$(OBJEXT) test_syr2.$(OBJEXT) \
+ test_syr2k.$(OBJEXT) test_syrk.$(OBJEXT) test_tbmv.$(OBJEXT) \
+ test_tbsv.$(OBJEXT) test_tpmv.$(OBJEXT) test_tpsv.$(OBJEXT) \
+ test_trmm.$(OBJEXT) test_trmv.$(OBJEXT) test_trsm.$(OBJEXT) \
+ test_trsv.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = libgslcblas.la ../ieee-utils/libgslieeeutils.la \
+ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgslcblas_la_SOURCES) $(test_SOURCES)
+DIST_SOURCES = $(libgslcblas_la_SOURCES) $(test_SOURCES)
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+lib_LTLIBRARIES = libgslcblas.la
+libgslcblas_la_LDFLAGS = -version-info $(GSL_LT_CBLAS_VERSION)
+pkginclude_HEADERS = gsl_cblas.h
+INCLUDES = -I$(top_srcdir)
+libgslcblas_la_SOURCES = sasum.c saxpy.c scasum.c scnrm2.c scopy.c \
+ sdot.c sdsdot.c sgbmv.c sgemm.c sgemv.c sger.c snrm2.c srot.c \
+ srotg.c srotm.c srotmg.c ssbmv.c sscal.c sspmv.c sspr.c \
+ sspr2.c sswap.c ssymm.c ssymv.c ssyr.c ssyr2.c ssyr2k.c \
+ ssyrk.c stbmv.c stbsv.c stpmv.c stpsv.c strmm.c strmv.c \
+ strsm.c strsv.c dasum.c daxpy.c dcopy.c ddot.c dgbmv.c dgemm.c \
+ dgemv.c dger.c dnrm2.c drot.c drotg.c drotm.c drotmg.c dsbmv.c \
+ dscal.c dsdot.c dspmv.c dspr.c dspr2.c dswap.c dsymm.c dsymv.c \
+ dsyr.c dsyr2.c dsyr2k.c dsyrk.c dtbmv.c dtbsv.c dtpmv.c \
+ dtpsv.c dtrmm.c dtrmv.c dtrsm.c dtrsv.c dzasum.c dznrm2.c \
+ caxpy.c ccopy.c cdotc_sub.c cdotu_sub.c cgbmv.c cgemm.c \
+ cgemv.c cgerc.c cgeru.c chbmv.c chemm.c chemv.c cher.c cher2.c \
+ cher2k.c cherk.c chpmv.c chpr.c chpr2.c cscal.c csscal.c \
+ cswap.c csymm.c csyr2k.c csyrk.c ctbmv.c ctbsv.c ctpmv.c \
+ ctpsv.c ctrmm.c ctrmv.c ctrsm.c ctrsv.c zaxpy.c zcopy.c \
+ zdotc_sub.c zdotu_sub.c zdscal.c zgbmv.c zgemm.c zgemv.c \
+ zgerc.c zgeru.c zhbmv.c zhemm.c zhemv.c zher.c zher2.c \
+ zher2k.c zherk.c zhpmv.c zhpr.c zhpr2.c zscal.c zswap.c \
+ zsymm.c zsyr2k.c zsyrk.c ztbmv.c ztbsv.c ztpmv.c ztpsv.c \
+ ztrmm.c ztrmv.c ztrsm.c ztrsv.c icamax.c idamax.c isamax.c \
+ izamax.c xerbla.c
+noinst_HEADERS = tests.c tests.h cblas.h source_asum_c.h \
+ source_asum_r.h source_axpy_c.h source_axpy_r.h \
+ source_copy_c.h source_copy_r.h source_dot_c.h source_dot_r.h \
+ source_gbmv_c.h source_gbmv_r.h source_gemm_c.h \
+ source_gemm_r.h source_gemv_c.h source_gemv_r.h source_ger.h \
+ source_gerc.h source_geru.h source_hbmv.h source_hemm.h \
+ source_hemv.h source_her.h source_her2.h source_her2k.h \
+ source_herk.h source_hpmv.h source_hpr.h source_hpr2.h \
+ source_iamax_c.h source_iamax_r.h source_nrm2_c.h \
+ source_nrm2_r.h source_rot.h source_rotg.h source_rotm.h \
+ source_rotmg.h source_sbmv.h source_scal_c.h source_scal_c_s.h \
+ source_scal_r.h source_spmv.h source_spr.h source_spr2.h \
+ source_swap_c.h source_swap_r.h source_symm_c.h \
+ source_symm_r.h source_symv.h source_syr.h source_syr2.h \
+ source_syr2k_c.h source_syr2k_r.h source_syrk_c.h \
+ source_syrk_r.h source_tbmv_c.h source_tbmv_r.h \
+ source_tbsv_c.h source_tbsv_r.h source_tpmv_c.h \
+ source_tpmv_r.h source_tpsv_c.h source_tpsv_r.h \
+ source_trmm_c.h source_trmm_r.h source_trmv_c.h \
+ source_trmv_r.h source_trsm_c.h source_trsm_r.h \
+ source_trsv_c.h source_trsv_r.h hypot.c
+TESTS = $(check_PROGRAMS)
+test_LDADD = libgslcblas.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la
+test_SOURCES = test.c test_amax.c test_asum.c test_axpy.c test_copy.c test_dot.c test_gbmv.c test_gemm.c test_gemv.c test_ger.c test_hbmv.c test_hemm.c test_hemv.c test_her.c test_her2.c test_her2k.c test_herk.c test_hpmv.c test_hpr.c test_hpr2.c test_nrm2.c test_rot.c test_rotg.c test_rotm.c test_rotmg.c test_sbmv.c test_scal.c test_spmv.c test_spr.c test_spr2.c test_swap.c test_symm.c test_symv.c test_syr.c test_syr2.c test_syr2k.c test_syrk.c test_tbmv.c test_tbsv.c test_tpmv.c test_tpsv.c test_trmm.c test_trmv.c test_trsm.c test_trsv.c
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps cblas/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps cblas/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ test -z "$(libdir)" || $(mkdir_p) "$(DESTDIR)$(libdir)"
+ @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+ if test -f $$p; then \
+ f=$(am__strip_dir) \
+ echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \
+ $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \
+ else :; fi; \
+ done
+
+uninstall-libLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @set -x; list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+ p=$(am__strip_dir) \
+ echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \
+ $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \
+ done
+
+clean-libLTLIBRARIES:
+ -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+ @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgslcblas.la: $(libgslcblas_la_OBJECTS) $(libgslcblas_la_DEPENDENCIES)
+ $(LINK) -rpath $(libdir) $(libgslcblas_la_LDFLAGS) $(libgslcblas_la_OBJECTS) $(libgslcblas_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \
+ clean-libtool mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am: install-libLTLIBRARIES
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-libLTLIBRARIES \
+ uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \
+ clean-libtool ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-libLTLIBRARIES \
+ install-man install-pkgincludeHEADERS install-strip \
+ installcheck installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-libLTLIBRARIES uninstall-pkgincludeHEADERS
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/cblas/TODO b/gsl-1.9/cblas/TODO
new file mode 100644
index 0000000..deb2a5f
--- /dev/null
+++ b/gsl-1.9/cblas/TODO
@@ -0,0 +1,8 @@
+use macros so that all complex arithmetic can use native complex types if compiler supports them
+
+make sure double/float are replaced by BASE everywhere
+well... not _everywhere_; internal accumulations should
+be done in double always; there's no reason not too,
+it's safer and maybe even faster [GJ]
+
+gbmv_c : use conj*imag instead of having branches form Trans & ConjTrans
diff --git a/gsl-1.9/cblas/caxpy.c b/gsl-1.9/cblas/caxpy.c
new file mode 100644
index 0000000..842153e
--- /dev/null
+++ b/gsl-1.9/cblas/caxpy.c
@@ -0,0 +1,12 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_caxpy (const int N, const void *alpha, const void *X, const int incX,
+ void *Y, const int incY)
+{
+#define BASE float
+#include "source_axpy_c.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/cblas.h b/gsl-1.9/cblas/cblas.h
new file mode 100644
index 0000000..b478671
--- /dev/null
+++ b/gsl-1.9/cblas/cblas.h
@@ -0,0 +1,34 @@
+#define INDEX int
+#define OFFSET(N, incX) ((incX) > 0 ? 0 : ((N) - 1) * (-(incX)))
+#define BLAS_ERROR(x) cblas_xerbla(0, __FILE__, x);
+
+#define CONJUGATE(x) ((x) == CblasConjTrans)
+#define TRANSPOSE(x) ((x) == CblasTrans || (x) == CblasConjTrans)
+#define UPPER(x) ((x) == CblasUpper)
+#define LOWER(x) ((x) == CblasLower)
+
+/* Handling of packed complex types... */
+
+#define REAL(a,i) (((BASE *) a)[2*(i)])
+#define IMAG(a,i) (((BASE *) a)[2*(i)+1])
+
+#define REAL0(a) (((BASE *)a)[0])
+#define IMAG0(a) (((BASE *)a)[1])
+
+#define CONST_REAL(a,i) (((const BASE *) a)[2*(i)])
+#define CONST_IMAG(a,i) (((const BASE *) a)[2*(i)+1])
+
+#define CONST_REAL0(a) (((const BASE *)a)[0])
+#define CONST_IMAG0(a) (((const BASE *)a)[1])
+
+
+#define GB(KU,KL,lda,i,j) ((KU+1+(i-j))*lda + j)
+
+#define TRCOUNT(N,i) ((((i)+1)*(2*(N)-(i)))/2)
+
+/* #define TBUP(N,i,j) */
+/* #define TBLO(N,i,j) */
+
+#define TPUP(N,i,j) (TRCOUNT(N,(i)-1)+(j)-(i))
+#define TPLO(N,i,j) (((i)*((i)+1))/2 + (j))
+
diff --git a/gsl-1.9/cblas/ccopy.c b/gsl-1.9/cblas/ccopy.c
new file mode 100644
index 0000000..c4716dd
--- /dev/null
+++ b/gsl-1.9/cblas/ccopy.c
@@ -0,0 +1,12 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_ccopy (const int N, const void *X, const int incX, void *Y,
+ const int incY)
+{
+#define BASE float
+#include "source_copy_c.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/cdotc_sub.c b/gsl-1.9/cblas/cdotc_sub.c
new file mode 100644
index 0000000..7bf646d
--- /dev/null
+++ b/gsl-1.9/cblas/cdotc_sub.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_cdotc_sub (const int N, const void *X, const int incX, const void *Y,
+ const int incY, void *result)
+{
+#define BASE float
+#define CONJ_SIGN (-1.0)
+#include "source_dot_c.h"
+#undef CONJ_SIGN
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/cdotu_sub.c b/gsl-1.9/cblas/cdotu_sub.c
new file mode 100644
index 0000000..4dff0be
--- /dev/null
+++ b/gsl-1.9/cblas/cdotu_sub.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_cdotu_sub (const int N, const void *X, const int incX, const void *Y,
+ const int incY, void *result)
+{
+#define BASE float
+#define CONJ_SIGN 1.0
+#include "source_dot_c.h"
+#undef CONJ_SIGN
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/cgbmv.c b/gsl-1.9/cblas/cgbmv.c
new file mode 100644
index 0000000..b263720
--- /dev/null
+++ b/gsl-1.9/cblas/cgbmv.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_cgbmv (const enum CBLAS_ORDER order, const enum CBLAS_TRANSPOSE TransA,
+ const int M, const int N, const int KL, const int KU,
+ const void *alpha, const void *A, const int lda, const void *X,
+ const int incX, const void *beta, void *Y, const int incY)
+{
+#define BASE float
+#include "source_gbmv_c.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/cgemm.c b/gsl-1.9/cblas/cgemm.c
new file mode 100644
index 0000000..006678c
--- /dev/null
+++ b/gsl-1.9/cblas/cgemm.c
@@ -0,0 +1,15 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_cgemm (const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA,
+ const enum CBLAS_TRANSPOSE TransB, const int M, const int N,
+ const int K, const void *alpha, const void *A, const int lda,
+ const void *B, const int ldb, const void *beta, void *C,
+ const int ldc)
+{
+#define BASE float
+#include "source_gemm_c.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/cgemv.c b/gsl-1.9/cblas/cgemv.c
new file mode 100644
index 0000000..4a276d8
--- /dev/null
+++ b/gsl-1.9/cblas/cgemv.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_cgemv (const enum CBLAS_ORDER order, const enum CBLAS_TRANSPOSE TransA,
+ const int M, const int N, const void *alpha, const void *A,
+ const int lda, const void *X, const int incX, const void *beta,
+ void *Y, const int incY)
+{
+#define BASE float
+#include "source_gemv_c.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/cgerc.c b/gsl-1.9/cblas/cgerc.c
new file mode 100644
index 0000000..d10d66d
--- /dev/null
+++ b/gsl-1.9/cblas/cgerc.c
@@ -0,0 +1,13 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_cgerc (const enum CBLAS_ORDER order, const int M, const int N,
+ const void *alpha, const void *X, const int incX, const void *Y,
+ const int incY, void *A, const int lda)
+{
+#define BASE float
+#include "source_gerc.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/cgeru.c b/gsl-1.9/cblas/cgeru.c
new file mode 100644
index 0000000..d1aa274
--- /dev/null
+++ b/gsl-1.9/cblas/cgeru.c
@@ -0,0 +1,13 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_cgeru (const enum CBLAS_ORDER order, const int M, const int N,
+ const void *alpha, const void *X, const int incX, const void *Y,
+ const int incY, void *A, const int lda)
+{
+#define BASE float
+#include "source_geru.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/chbmv.c b/gsl-1.9/cblas/chbmv.c
new file mode 100644
index 0000000..04ed3d0
--- /dev/null
+++ b/gsl-1.9/cblas/chbmv.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_chbmv (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const int K, const void *alpha, const void *A,
+ const int lda, const void *X, const int incX, const void *beta,
+ void *Y, const int incY)
+{
+#define BASE float
+#include "source_hbmv.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/chemm.c b/gsl-1.9/cblas/chemm.c
new file mode 100644
index 0000000..c67f118
--- /dev/null
+++ b/gsl-1.9/cblas/chemm.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_chemm (const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
+ const enum CBLAS_UPLO Uplo, const int M, const int N,
+ const void *alpha, const void *A, const int lda, const void *B,
+ const int ldb, const void *beta, void *C, const int ldc)
+{
+#define BASE float
+#include "source_hemm.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/chemv.c b/gsl-1.9/cblas/chemv.c
new file mode 100644
index 0000000..0f54973
--- /dev/null
+++ b/gsl-1.9/cblas/chemv.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_chemv (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const void *alpha, const void *A, const int lda,
+ const void *X, const int incX, const void *beta, void *Y,
+ const int incY)
+{
+#define BASE float
+#include "source_hemv.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/cher.c b/gsl-1.9/cblas/cher.c
new file mode 100644
index 0000000..348252e
--- /dev/null
+++ b/gsl-1.9/cblas/cher.c
@@ -0,0 +1,13 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_cher (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const float alpha, const void *X, const int incX,
+ void *A, const int lda)
+{
+#define BASE float
+#include "source_her.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/cher2.c b/gsl-1.9/cblas/cher2.c
new file mode 100644
index 0000000..7e5067b
--- /dev/null
+++ b/gsl-1.9/cblas/cher2.c
@@ -0,0 +1,13 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_cher2 (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const void *alpha, const void *X, const int incX,
+ const void *Y, const int incY, void *A, const int lda)
+{
+#define BASE float
+#include "source_her2.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/cher2k.c b/gsl-1.9/cblas/cher2k.c
new file mode 100644
index 0000000..d1fc694
--- /dev/null
+++ b/gsl-1.9/cblas/cher2k.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_cher2k (const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
+ const void *alpha, const void *A, const int lda, const void *B,
+ const int ldb, const float beta, void *C, const int ldc)
+{
+#define BASE float
+#include "source_her2k.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/cherk.c b/gsl-1.9/cblas/cherk.c
new file mode 100644
index 0000000..1cb3af7
--- /dev/null
+++ b/gsl-1.9/cblas/cherk.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_cherk (const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
+ const float alpha, const void *A, const int lda,
+ const float beta, void *C, const int ldc)
+{
+#define BASE float
+#include "source_herk.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/chpmv.c b/gsl-1.9/cblas/chpmv.c
new file mode 100644
index 0000000..5069459
--- /dev/null
+++ b/gsl-1.9/cblas/chpmv.c
@@ -0,0 +1,13 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_chpmv (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const void *alpha, const void *Ap, const void *X,
+ const int incX, const void *beta, void *Y, const int incY)
+{
+#define BASE float
+#include "source_hpmv.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/chpr.c b/gsl-1.9/cblas/chpr.c
new file mode 100644
index 0000000..1ac0d0d
--- /dev/null
+++ b/gsl-1.9/cblas/chpr.c
@@ -0,0 +1,13 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_chpr (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const float alpha, const void *X, const int incX,
+ void *Ap)
+{
+#define BASE float
+#include "source_hpr.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/chpr2.c b/gsl-1.9/cblas/chpr2.c
new file mode 100644
index 0000000..f5e4046
--- /dev/null
+++ b/gsl-1.9/cblas/chpr2.c
@@ -0,0 +1,13 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_chpr2 (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const void *alpha, const void *X, const int incX,
+ const void *Y, const int incY, void *Ap)
+{
+#define BASE float
+#include "source_hpr2.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/cscal.c b/gsl-1.9/cblas/cscal.c
new file mode 100644
index 0000000..5a881b9
--- /dev/null
+++ b/gsl-1.9/cblas/cscal.c
@@ -0,0 +1,11 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_cscal (const int N, const void *alpha, void *X, const int incX)
+{
+#define BASE float
+#include "source_scal_c.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/csscal.c b/gsl-1.9/cblas/csscal.c
new file mode 100644
index 0000000..ef59150
--- /dev/null
+++ b/gsl-1.9/cblas/csscal.c
@@ -0,0 +1,11 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_csscal (const int N, const float alpha, void *X, const int incX)
+{
+#define BASE float
+#include "source_scal_c_s.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/cswap.c b/gsl-1.9/cblas/cswap.c
new file mode 100644
index 0000000..8e940ec
--- /dev/null
+++ b/gsl-1.9/cblas/cswap.c
@@ -0,0 +1,11 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_cswap (const int N, void *X, const int incX, void *Y, const int incY)
+{
+#define BASE float
+#include "source_swap_c.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/csymm.c b/gsl-1.9/cblas/csymm.c
new file mode 100644
index 0000000..28bd1c9
--- /dev/null
+++ b/gsl-1.9/cblas/csymm.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_csymm (const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
+ const enum CBLAS_UPLO Uplo, const int M, const int N,
+ const void *alpha, const void *A, const int lda, const void *B,
+ const int ldb, const void *beta, void *C, const int ldc)
+{
+#define BASE float
+#include "source_symm_c.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/csyr2k.c b/gsl-1.9/cblas/csyr2k.c
new file mode 100644
index 0000000..92439a2
--- /dev/null
+++ b/gsl-1.9/cblas/csyr2k.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_csyr2k (const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
+ const void *alpha, const void *A, const int lda, const void *B,
+ const int ldb, const void *beta, void *C, const int ldc)
+{
+#define BASE float
+#include "source_syr2k_c.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/csyrk.c b/gsl-1.9/cblas/csyrk.c
new file mode 100644
index 0000000..9fec100
--- /dev/null
+++ b/gsl-1.9/cblas/csyrk.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_csyrk (const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
+ const void *alpha, const void *A, const int lda,
+ const void *beta, void *C, const int ldc)
+{
+#define BASE float
+#include "source_syrk_c.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/ctbmv.c b/gsl-1.9/cblas/ctbmv.c
new file mode 100644
index 0000000..f22ad92
--- /dev/null
+++ b/gsl-1.9/cblas/ctbmv.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_ctbmv (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const int K, const void *A, const int lda, void *X,
+ const int incX)
+{
+#define BASE float
+#include "source_tbmv_c.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/ctbsv.c b/gsl-1.9/cblas/ctbsv.c
new file mode 100644
index 0000000..b30b090
--- /dev/null
+++ b/gsl-1.9/cblas/ctbsv.c
@@ -0,0 +1,16 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+#include "hypot.c"
+
+void
+cblas_ctbsv (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const int K, const void *A, const int lda, void *X,
+ const int incX)
+{
+#define BASE float
+#include "source_tbsv_c.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/ctpmv.c b/gsl-1.9/cblas/ctpmv.c
new file mode 100644
index 0000000..dd5d741
--- /dev/null
+++ b/gsl-1.9/cblas/ctpmv.c
@@ -0,0 +1,13 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_ctpmv (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const void *Ap, void *X, const int incX)
+{
+#define BASE float
+#include "source_tpmv_c.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/ctpsv.c b/gsl-1.9/cblas/ctpsv.c
new file mode 100644
index 0000000..434bd8e
--- /dev/null
+++ b/gsl-1.9/cblas/ctpsv.c
@@ -0,0 +1,15 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+#include "hypot.c"
+
+void
+cblas_ctpsv (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const void *Ap, void *X, const int incX)
+{
+#define BASE float
+#include "source_tpsv_c.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/ctrmm.c b/gsl-1.9/cblas/ctrmm.c
new file mode 100644
index 0000000..37c5140
--- /dev/null
+++ b/gsl-1.9/cblas/ctrmm.c
@@ -0,0 +1,15 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_ctrmm (const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
+ const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA,
+ const enum CBLAS_DIAG Diag, const int M, const int N,
+ const void *alpha, const void *A, const int lda, void *B,
+ const int ldb)
+{
+#define BASE float
+#include "source_trmm_c.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/ctrmv.c b/gsl-1.9/cblas/ctrmv.c
new file mode 100644
index 0000000..260d3c2
--- /dev/null
+++ b/gsl-1.9/cblas/ctrmv.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_ctrmv (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const void *A, const int lda, void *X,
+ const int incX)
+{
+#define BASE float
+#include "source_trmv_c.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/ctrsm.c b/gsl-1.9/cblas/ctrsm.c
new file mode 100644
index 0000000..7d5c427
--- /dev/null
+++ b/gsl-1.9/cblas/ctrsm.c
@@ -0,0 +1,17 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+#include "hypot.c"
+
+void
+cblas_ctrsm (const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
+ const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA,
+ const enum CBLAS_DIAG Diag, const int M, const int N,
+ const void *alpha, const void *A, const int lda, void *B,
+ const int ldb)
+{
+#define BASE float
+#include "source_trsm_c.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/ctrsv.c b/gsl-1.9/cblas/ctrsv.c
new file mode 100644
index 0000000..2e5c462
--- /dev/null
+++ b/gsl-1.9/cblas/ctrsv.c
@@ -0,0 +1,16 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+#include "hypot.c"
+
+void
+cblas_ctrsv (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const void *A, const int lda, void *X,
+ const int incX)
+{
+#define BASE float
+#include "source_trsv_c.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/dasum.c b/gsl-1.9/cblas/dasum.c
new file mode 100644
index 0000000..db215c1
--- /dev/null
+++ b/gsl-1.9/cblas/dasum.c
@@ -0,0 +1,11 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+double
+cblas_dasum (const int N, const double *X, const int incX)
+{
+#define BASE double
+#include "source_asum_r.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/daxpy.c b/gsl-1.9/cblas/daxpy.c
new file mode 100644
index 0000000..d0fd567
--- /dev/null
+++ b/gsl-1.9/cblas/daxpy.c
@@ -0,0 +1,12 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_daxpy (const int N, const double alpha, const double *X, const int incX,
+ double *Y, const int incY)
+{
+#define BASE double
+#include "source_axpy_r.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/dcopy.c b/gsl-1.9/cblas/dcopy.c
new file mode 100644
index 0000000..5c6ed2e
--- /dev/null
+++ b/gsl-1.9/cblas/dcopy.c
@@ -0,0 +1,12 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_dcopy (const int N, const double *X, const int incX, double *Y,
+ const int incY)
+{
+#define BASE double
+#include "source_copy_r.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/ddot.c b/gsl-1.9/cblas/ddot.c
new file mode 100644
index 0000000..e5801f3
--- /dev/null
+++ b/gsl-1.9/cblas/ddot.c
@@ -0,0 +1,16 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+double
+cblas_ddot (const int N, const double *X, const int incX, const double *Y,
+ const int incY)
+{
+#define INIT_VAL 0.0
+#define ACC_TYPE double
+#define BASE double
+#include "source_dot_r.h"
+#undef ACC_TYPE
+#undef BASE
+#undef INIT_VAL
+}
diff --git a/gsl-1.9/cblas/dgbmv.c b/gsl-1.9/cblas/dgbmv.c
new file mode 100644
index 0000000..2da9fe4
--- /dev/null
+++ b/gsl-1.9/cblas/dgbmv.c
@@ -0,0 +1,15 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_dgbmv (const enum CBLAS_ORDER order, const enum CBLAS_TRANSPOSE TransA,
+ const int M, const int N, const int KL, const int KU,
+ const double alpha, const double *A, const int lda,
+ const double *X, const int incX, const double beta, double *Y,
+ const int incY)
+{
+#define BASE double
+#include "source_gbmv_r.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/dgemm.c b/gsl-1.9/cblas/dgemm.c
new file mode 100644
index 0000000..428ed13
--- /dev/null
+++ b/gsl-1.9/cblas/dgemm.c
@@ -0,0 +1,15 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_dgemm (const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA,
+ const enum CBLAS_TRANSPOSE TransB, const int M, const int N,
+ const int K, const double alpha, const double *A, const int lda,
+ const double *B, const int ldb, const double beta, double *C,
+ const int ldc)
+{
+#define BASE double
+#include "source_gemm_r.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/dgemv.c b/gsl-1.9/cblas/dgemv.c
new file mode 100644
index 0000000..cc5aea9
--- /dev/null
+++ b/gsl-1.9/cblas/dgemv.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_dgemv (const enum CBLAS_ORDER order, const enum CBLAS_TRANSPOSE TransA,
+ const int M, const int N, const double alpha, const double *A,
+ const int lda, const double *X, const int incX,
+ const double beta, double *Y, const int incY)
+{
+#define BASE double
+#include "source_gemv_r.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/dger.c b/gsl-1.9/cblas/dger.c
new file mode 100644
index 0000000..d9596ae
--- /dev/null
+++ b/gsl-1.9/cblas/dger.c
@@ -0,0 +1,13 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_dger (const enum CBLAS_ORDER order, const int M, const int N,
+ const double alpha, const double *X, const int incX,
+ const double *Y, const int incY, double *A, const int lda)
+{
+#define BASE double
+#include "source_ger.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/dnrm2.c b/gsl-1.9/cblas/dnrm2.c
new file mode 100644
index 0000000..f7d5d83
--- /dev/null
+++ b/gsl-1.9/cblas/dnrm2.c
@@ -0,0 +1,11 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+double
+cblas_dnrm2 (const int N, const double *X, const int incX)
+{
+#define BASE double
+#include "source_nrm2_r.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/drot.c b/gsl-1.9/cblas/drot.c
new file mode 100644
index 0000000..15c75db
--- /dev/null
+++ b/gsl-1.9/cblas/drot.c
@@ -0,0 +1,12 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_drot (const int N, double *X, const int incX, double *Y, const int incY,
+ const double c, const double s)
+{
+#define BASE double
+#include "source_rot.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/drotg.c b/gsl-1.9/cblas/drotg.c
new file mode 100644
index 0000000..bc95658
--- /dev/null
+++ b/gsl-1.9/cblas/drotg.c
@@ -0,0 +1,11 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_drotg (double *a, double *b, double *c, double *s)
+{
+#define BASE double
+#include "source_rotg.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/drotm.c b/gsl-1.9/cblas/drotm.c
new file mode 100644
index 0000000..69d5129
--- /dev/null
+++ b/gsl-1.9/cblas/drotm.c
@@ -0,0 +1,12 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_drotm (const int N, double *X, const int incX, double *Y,
+ const int incY, const double *P)
+{
+#define BASE double
+#include "source_rotm.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/drotmg.c b/gsl-1.9/cblas/drotmg.c
new file mode 100644
index 0000000..d9e68ba
--- /dev/null
+++ b/gsl-1.9/cblas/drotmg.c
@@ -0,0 +1,11 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_drotmg (double *d1, double *d2, double *b1, const double b2, double *P)
+{
+#define BASE double
+#include "source_rotmg.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/dsbmv.c b/gsl-1.9/cblas/dsbmv.c
new file mode 100644
index 0000000..2fcc6f7
--- /dev/null
+++ b/gsl-1.9/cblas/dsbmv.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_dsbmv (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const int K, const double alpha, const double *A,
+ const int lda, const double *X, const int incX,
+ const double beta, double *Y, const int incY)
+{
+#define BASE double
+#include "source_sbmv.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/dscal.c b/gsl-1.9/cblas/dscal.c
new file mode 100644
index 0000000..479b121
--- /dev/null
+++ b/gsl-1.9/cblas/dscal.c
@@ -0,0 +1,11 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_dscal (const int N, const double alpha, double *X, const int incX)
+{
+#define BASE double
+#include "source_scal_r.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/dsdot.c b/gsl-1.9/cblas/dsdot.c
new file mode 100644
index 0000000..2d3400b
--- /dev/null
+++ b/gsl-1.9/cblas/dsdot.c
@@ -0,0 +1,16 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+double
+cblas_dsdot (const int N, const float *X, const int incX, const float *Y,
+ const int incY)
+{
+#define INIT_VAL 0.0
+#define ACC_TYPE double
+#define BASE float
+#include "source_dot_r.h"
+#undef ACC_TYPE
+#undef BASE
+#undef INIT_VAL
+}
diff --git a/gsl-1.9/cblas/dspmv.c b/gsl-1.9/cblas/dspmv.c
new file mode 100644
index 0000000..870c7e3
--- /dev/null
+++ b/gsl-1.9/cblas/dspmv.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_dspmv (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const double alpha, const double *Ap,
+ const double *X, const int incX, const double beta, double *Y,
+ const int incY)
+{
+#define BASE double
+#include "source_spmv.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/dspr.c b/gsl-1.9/cblas/dspr.c
new file mode 100644
index 0000000..0d2d86e
--- /dev/null
+++ b/gsl-1.9/cblas/dspr.c
@@ -0,0 +1,13 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_dspr (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const double alpha, const double *X, const int incX,
+ double *Ap)
+{
+#define BASE double
+#include "source_spr.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/dspr2.c b/gsl-1.9/cblas/dspr2.c
new file mode 100644
index 0000000..78348e2
--- /dev/null
+++ b/gsl-1.9/cblas/dspr2.c
@@ -0,0 +1,13 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_dspr2 (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const double alpha, const double *X, const int incX,
+ const double *Y, const int incY, double *Ap)
+{
+#define BASE double
+#include "source_spr2.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/dswap.c b/gsl-1.9/cblas/dswap.c
new file mode 100644
index 0000000..e8401a5
--- /dev/null
+++ b/gsl-1.9/cblas/dswap.c
@@ -0,0 +1,12 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_dswap (const int N, double *X, const int incX, double *Y,
+ const int incY)
+{
+#define BASE double
+#include "source_swap_r.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/dsymm.c b/gsl-1.9/cblas/dsymm.c
new file mode 100644
index 0000000..0a4905a
--- /dev/null
+++ b/gsl-1.9/cblas/dsymm.c
@@ -0,0 +1,15 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_dsymm (const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
+ const enum CBLAS_UPLO Uplo, const int M, const int N,
+ const double alpha, const double *A, const int lda,
+ const double *B, const int ldb, const double beta, double *C,
+ const int ldc)
+{
+#define BASE double
+#include "source_symm_r.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/dsymv.c b/gsl-1.9/cblas/dsymv.c
new file mode 100644
index 0000000..2c3429d
--- /dev/null
+++ b/gsl-1.9/cblas/dsymv.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_dsymv (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const double alpha, const double *A, const int lda,
+ const double *X, const int incX, const double beta, double *Y,
+ const int incY)
+{
+#define BASE double
+#include "source_symv.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/dsyr.c b/gsl-1.9/cblas/dsyr.c
new file mode 100644
index 0000000..a83a795
--- /dev/null
+++ b/gsl-1.9/cblas/dsyr.c
@@ -0,0 +1,13 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_dsyr (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const double alpha, const double *X, const int incX,
+ double *A, const int lda)
+{
+#define BASE double
+#include "source_syr.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/dsyr2.c b/gsl-1.9/cblas/dsyr2.c
new file mode 100644
index 0000000..f2bfcc1
--- /dev/null
+++ b/gsl-1.9/cblas/dsyr2.c
@@ -0,0 +1,13 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_dsyr2 (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const double alpha, const double *X, const int incX,
+ const double *Y, const int incY, double *A, const int lda)
+{
+#define BASE double
+#include "source_syr2.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/dsyr2k.c b/gsl-1.9/cblas/dsyr2k.c
new file mode 100644
index 0000000..7c14830
--- /dev/null
+++ b/gsl-1.9/cblas/dsyr2k.c
@@ -0,0 +1,15 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_dsyr2k (const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
+ const double alpha, const double *A, const int lda,
+ const double *B, const int ldb, const double beta, double *C,
+ const int ldc)
+{
+#define BASE double
+#include "source_syr2k_r.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/dsyrk.c b/gsl-1.9/cblas/dsyrk.c
new file mode 100644
index 0000000..b529c1a
--- /dev/null
+++ b/gsl-1.9/cblas/dsyrk.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_dsyrk (const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
+ const double alpha, const double *A, const int lda,
+ const double beta, double *C, const int ldc)
+{
+#define BASE double
+#include "source_syrk_r.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/dtbmv.c b/gsl-1.9/cblas/dtbmv.c
new file mode 100644
index 0000000..5859218
--- /dev/null
+++ b/gsl-1.9/cblas/dtbmv.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_dtbmv (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const int K, const double *A, const int lda,
+ double *X, const int incX)
+{
+#define BASE double
+#include "source_tbmv_r.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/dtbsv.c b/gsl-1.9/cblas/dtbsv.c
new file mode 100644
index 0000000..a009f1e
--- /dev/null
+++ b/gsl-1.9/cblas/dtbsv.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_dtbsv (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const int K, const double *A, const int lda,
+ double *X, const int incX)
+{
+#define BASE double
+#include "source_tbsv_r.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/dtpmv.c b/gsl-1.9/cblas/dtpmv.c
new file mode 100644
index 0000000..35fa212
--- /dev/null
+++ b/gsl-1.9/cblas/dtpmv.c
@@ -0,0 +1,13 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_dtpmv (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const double *Ap, double *X, const int incX)
+{
+#define BASE double
+#include "source_tpmv_r.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/dtpsv.c b/gsl-1.9/cblas/dtpsv.c
new file mode 100644
index 0000000..8b0b981
--- /dev/null
+++ b/gsl-1.9/cblas/dtpsv.c
@@ -0,0 +1,13 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_dtpsv (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const double *Ap, double *X, const int incX)
+{
+#define BASE double
+#include "source_tpsv_r.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/dtrmm.c b/gsl-1.9/cblas/dtrmm.c
new file mode 100644
index 0000000..e48c656
--- /dev/null
+++ b/gsl-1.9/cblas/dtrmm.c
@@ -0,0 +1,15 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_dtrmm (const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
+ const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA,
+ const enum CBLAS_DIAG Diag, const int M, const int N,
+ const double alpha, const double *A, const int lda, double *B,
+ const int ldb)
+{
+#define BASE double
+#include "source_trmm_r.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/dtrmv.c b/gsl-1.9/cblas/dtrmv.c
new file mode 100644
index 0000000..68fc9d0
--- /dev/null
+++ b/gsl-1.9/cblas/dtrmv.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_dtrmv (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const double *A, const int lda, double *X,
+ const int incX)
+{
+#define BASE double
+#include "source_trmv_r.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/dtrsm.c b/gsl-1.9/cblas/dtrsm.c
new file mode 100644
index 0000000..d2a234b
--- /dev/null
+++ b/gsl-1.9/cblas/dtrsm.c
@@ -0,0 +1,15 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_dtrsm (const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
+ const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA,
+ const enum CBLAS_DIAG Diag, const int M, const int N,
+ const double alpha, const double *A, const int lda, double *B,
+ const int ldb)
+{
+#define BASE double
+#include "source_trsm_r.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/dtrsv.c b/gsl-1.9/cblas/dtrsv.c
new file mode 100644
index 0000000..3d9f971
--- /dev/null
+++ b/gsl-1.9/cblas/dtrsv.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_dtrsv (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const double *A, const int lda, double *X,
+ const int incX)
+{
+#define BASE double
+#include "source_trsv_r.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/dzasum.c b/gsl-1.9/cblas/dzasum.c
new file mode 100644
index 0000000..7484ede
--- /dev/null
+++ b/gsl-1.9/cblas/dzasum.c
@@ -0,0 +1,11 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+double
+cblas_dzasum (const int N, const void *X, const int incX)
+{
+#define BASE double
+#include "source_asum_c.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/dznrm2.c b/gsl-1.9/cblas/dznrm2.c
new file mode 100644
index 0000000..d58ec9f
--- /dev/null
+++ b/gsl-1.9/cblas/dznrm2.c
@@ -0,0 +1,11 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+double
+cblas_dznrm2 (const int N, const void *X, const int incX)
+{
+#define BASE double
+#include "source_nrm2_c.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/gsl_cblas.h b/gsl-1.9/cblas/gsl_cblas.h
new file mode 100644
index 0000000..38d0dd8
--- /dev/null
+++ b/gsl-1.9/cblas/gsl_cblas.h
@@ -0,0 +1,606 @@
+/* blas/gsl_cblas.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* This is a copy of the CBLAS standard header.
+ * We carry this around so we do not have to
+ * break our model for flexible BLAS functionality.
+ */
+
+#ifndef __GSL_CBLAS_H__
+#define __GSL_CBLAS_H__
+#include <stddef.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+#define __BEGIN_DECLS extern "C" {
+#define __END_DECLS }
+#else
+#define __BEGIN_DECLS /* empty */
+#define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+/*
+ * Enumerated and derived types
+ */
+#define CBLAS_INDEX size_t /* this may vary between platforms */
+
+enum CBLAS_ORDER {CblasRowMajor=101, CblasColMajor=102};
+enum CBLAS_TRANSPOSE {CblasNoTrans=111, CblasTrans=112, CblasConjTrans=113};
+enum CBLAS_UPLO {CblasUpper=121, CblasLower=122};
+enum CBLAS_DIAG {CblasNonUnit=131, CblasUnit=132};
+enum CBLAS_SIDE {CblasLeft=141, CblasRight=142};
+
+/*
+ * ===========================================================================
+ * Prototypes for level 1 BLAS functions (complex are recast as routines)
+ * ===========================================================================
+ */
+float cblas_sdsdot(const int N, const float alpha, const float *X,
+ const int incX, const float *Y, const int incY);
+double cblas_dsdot(const int N, const float *X, const int incX, const float *Y,
+ const int incY);
+float cblas_sdot(const int N, const float *X, const int incX,
+ const float *Y, const int incY);
+double cblas_ddot(const int N, const double *X, const int incX,
+ const double *Y, const int incY);
+
+/*
+ * Functions having prefixes Z and C only
+ */
+void cblas_cdotu_sub(const int N, const void *X, const int incX,
+ const void *Y, const int incY, void *dotu);
+void cblas_cdotc_sub(const int N, const void *X, const int incX,
+ const void *Y, const int incY, void *dotc);
+
+void cblas_zdotu_sub(const int N, const void *X, const int incX,
+ const void *Y, const int incY, void *dotu);
+void cblas_zdotc_sub(const int N, const void *X, const int incX,
+ const void *Y, const int incY, void *dotc);
+
+
+/*
+ * Functions having prefixes S D SC DZ
+ */
+float cblas_snrm2(const int N, const float *X, const int incX);
+float cblas_sasum(const int N, const float *X, const int incX);
+
+double cblas_dnrm2(const int N, const double *X, const int incX);
+double cblas_dasum(const int N, const double *X, const int incX);
+
+float cblas_scnrm2(const int N, const void *X, const int incX);
+float cblas_scasum(const int N, const void *X, const int incX);
+
+double cblas_dznrm2(const int N, const void *X, const int incX);
+double cblas_dzasum(const int N, const void *X, const int incX);
+
+
+/*
+ * Functions having standard 4 prefixes (S D C Z)
+ */
+CBLAS_INDEX cblas_isamax(const int N, const float *X, const int incX);
+CBLAS_INDEX cblas_idamax(const int N, const double *X, const int incX);
+CBLAS_INDEX cblas_icamax(const int N, const void *X, const int incX);
+CBLAS_INDEX cblas_izamax(const int N, const void *X, const int incX);
+
+/*
+ * ===========================================================================
+ * Prototypes for level 1 BLAS routines
+ * ===========================================================================
+ */
+
+/*
+ * Routines with standard 4 prefixes (s, d, c, z)
+ */
+void cblas_sswap(const int N, float *X, const int incX,
+ float *Y, const int incY);
+void cblas_scopy(const int N, const float *X, const int incX,
+ float *Y, const int incY);
+void cblas_saxpy(const int N, const float alpha, const float *X,
+ const int incX, float *Y, const int incY);
+
+void cblas_dswap(const int N, double *X, const int incX,
+ double *Y, const int incY);
+void cblas_dcopy(const int N, const double *X, const int incX,
+ double *Y, const int incY);
+void cblas_daxpy(const int N, const double alpha, const double *X,
+ const int incX, double *Y, const int incY);
+
+void cblas_cswap(const int N, void *X, const int incX,
+ void *Y, const int incY);
+void cblas_ccopy(const int N, const void *X, const int incX,
+ void *Y, const int incY);
+void cblas_caxpy(const int N, const void *alpha, const void *X,
+ const int incX, void *Y, const int incY);
+
+void cblas_zswap(const int N, void *X, const int incX,
+ void *Y, const int incY);
+void cblas_zcopy(const int N, const void *X, const int incX,
+ void *Y, const int incY);
+void cblas_zaxpy(const int N, const void *alpha, const void *X,
+ const int incX, void *Y, const int incY);
+
+
+/*
+ * Routines with S and D prefix only
+ */
+void cblas_srotg(float *a, float *b, float *c, float *s);
+void cblas_srotmg(float *d1, float *d2, float *b1, const float b2, float *P);
+void cblas_srot(const int N, float *X, const int incX,
+ float *Y, const int incY, const float c, const float s);
+void cblas_srotm(const int N, float *X, const int incX,
+ float *Y, const int incY, const float *P);
+
+void cblas_drotg(double *a, double *b, double *c, double *s);
+void cblas_drotmg(double *d1, double *d2, double *b1, const double b2, double *P);
+void cblas_drot(const int N, double *X, const int incX,
+ double *Y, const int incY, const double c, const double s);
+void cblas_drotm(const int N, double *X, const int incX,
+ double *Y, const int incY, const double *P);
+
+
+/*
+ * Routines with S D C Z CS and ZD prefixes
+ */
+void cblas_sscal(const int N, const float alpha, float *X, const int incX);
+void cblas_dscal(const int N, const double alpha, double *X, const int incX);
+void cblas_cscal(const int N, const void *alpha, void *X, const int incX);
+void cblas_zscal(const int N, const void *alpha, void *X, const int incX);
+void cblas_csscal(const int N, const float alpha, void *X, const int incX);
+void cblas_zdscal(const int N, const double alpha, void *X, const int incX);
+
+/*
+ * ===========================================================================
+ * Prototypes for level 2 BLAS
+ * ===========================================================================
+ */
+
+/*
+ * Routines with standard 4 prefixes (S, D, C, Z)
+ */
+void cblas_sgemv(const enum CBLAS_ORDER order,
+ const enum CBLAS_TRANSPOSE TransA, const int M, const int N,
+ const float alpha, const float *A, const int lda,
+ const float *X, const int incX, const float beta,
+ float *Y, const int incY);
+void cblas_sgbmv(const enum CBLAS_ORDER order,
+ const enum CBLAS_TRANSPOSE TransA, const int M, const int N,
+ const int KL, const int KU, const float alpha,
+ const float *A, const int lda, const float *X,
+ const int incX, const float beta, float *Y, const int incY);
+void cblas_strmv(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const float *A, const int lda,
+ float *X, const int incX);
+void cblas_stbmv(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const int K, const float *A, const int lda,
+ float *X, const int incX);
+void cblas_stpmv(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const float *Ap, float *X, const int incX);
+void cblas_strsv(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const float *A, const int lda, float *X,
+ const int incX);
+void cblas_stbsv(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const int K, const float *A, const int lda,
+ float *X, const int incX);
+void cblas_stpsv(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const float *Ap, float *X, const int incX);
+
+void cblas_dgemv(const enum CBLAS_ORDER order,
+ const enum CBLAS_TRANSPOSE TransA, const int M, const int N,
+ const double alpha, const double *A, const int lda,
+ const double *X, const int incX, const double beta,
+ double *Y, const int incY);
+void cblas_dgbmv(const enum CBLAS_ORDER order,
+ const enum CBLAS_TRANSPOSE TransA, const int M, const int N,
+ const int KL, const int KU, const double alpha,
+ const double *A, const int lda, const double *X,
+ const int incX, const double beta, double *Y, const int incY);
+void cblas_dtrmv(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const double *A, const int lda,
+ double *X, const int incX);
+void cblas_dtbmv(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const int K, const double *A, const int lda,
+ double *X, const int incX);
+void cblas_dtpmv(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const double *Ap, double *X, const int incX);
+void cblas_dtrsv(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const double *A, const int lda, double *X,
+ const int incX);
+void cblas_dtbsv(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const int K, const double *A, const int lda,
+ double *X, const int incX);
+void cblas_dtpsv(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const double *Ap, double *X, const int incX);
+
+void cblas_cgemv(const enum CBLAS_ORDER order,
+ const enum CBLAS_TRANSPOSE TransA, const int M, const int N,
+ const void *alpha, const void *A, const int lda,
+ const void *X, const int incX, const void *beta,
+ void *Y, const int incY);
+void cblas_cgbmv(const enum CBLAS_ORDER order,
+ const enum CBLAS_TRANSPOSE TransA, const int M, const int N,
+ const int KL, const int KU, const void *alpha,
+ const void *A, const int lda, const void *X,
+ const int incX, const void *beta, void *Y, const int incY);
+void cblas_ctrmv(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const void *A, const int lda,
+ void *X, const int incX);
+void cblas_ctbmv(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const int K, const void *A, const int lda,
+ void *X, const int incX);
+void cblas_ctpmv(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const void *Ap, void *X, const int incX);
+void cblas_ctrsv(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const void *A, const int lda, void *X,
+ const int incX);
+void cblas_ctbsv(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const int K, const void *A, const int lda,
+ void *X, const int incX);
+void cblas_ctpsv(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const void *Ap, void *X, const int incX);
+
+void cblas_zgemv(const enum CBLAS_ORDER order,
+ const enum CBLAS_TRANSPOSE TransA, const int M, const int N,
+ const void *alpha, const void *A, const int lda,
+ const void *X, const int incX, const void *beta,
+ void *Y, const int incY);
+void cblas_zgbmv(const enum CBLAS_ORDER order,
+ const enum CBLAS_TRANSPOSE TransA, const int M, const int N,
+ const int KL, const int KU, const void *alpha,
+ const void *A, const int lda, const void *X,
+ const int incX, const void *beta, void *Y, const int incY);
+void cblas_ztrmv(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const void *A, const int lda,
+ void *X, const int incX);
+void cblas_ztbmv(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const int K, const void *A, const int lda,
+ void *X, const int incX);
+void cblas_ztpmv(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const void *Ap, void *X, const int incX);
+void cblas_ztrsv(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const void *A, const int lda, void *X,
+ const int incX);
+void cblas_ztbsv(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const int K, const void *A, const int lda,
+ void *X, const int incX);
+void cblas_ztpsv(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const void *Ap, void *X, const int incX);
+
+
+/*
+ * Routines with S and D prefixes only
+ */
+void cblas_ssymv(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const float alpha, const float *A,
+ const int lda, const float *X, const int incX,
+ const float beta, float *Y, const int incY);
+void cblas_ssbmv(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const int K, const float alpha, const float *A,
+ const int lda, const float *X, const int incX,
+ const float beta, float *Y, const int incY);
+void cblas_sspmv(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const float alpha, const float *Ap,
+ const float *X, const int incX,
+ const float beta, float *Y, const int incY);
+void cblas_sger(const enum CBLAS_ORDER order, const int M, const int N,
+ const float alpha, const float *X, const int incX,
+ const float *Y, const int incY, float *A, const int lda);
+void cblas_ssyr(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const float alpha, const float *X,
+ const int incX, float *A, const int lda);
+void cblas_sspr(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const float alpha, const float *X,
+ const int incX, float *Ap);
+void cblas_ssyr2(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const float alpha, const float *X,
+ const int incX, const float *Y, const int incY, float *A,
+ const int lda);
+void cblas_sspr2(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const float alpha, const float *X,
+ const int incX, const float *Y, const int incY, float *A);
+
+void cblas_dsymv(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const double alpha, const double *A,
+ const int lda, const double *X, const int incX,
+ const double beta, double *Y, const int incY);
+void cblas_dsbmv(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const int K, const double alpha, const double *A,
+ const int lda, const double *X, const int incX,
+ const double beta, double *Y, const int incY);
+void cblas_dspmv(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const double alpha, const double *Ap,
+ const double *X, const int incX,
+ const double beta, double *Y, const int incY);
+void cblas_dger(const enum CBLAS_ORDER order, const int M, const int N,
+ const double alpha, const double *X, const int incX,
+ const double *Y, const int incY, double *A, const int lda);
+void cblas_dsyr(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const double alpha, const double *X,
+ const int incX, double *A, const int lda);
+void cblas_dspr(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const double alpha, const double *X,
+ const int incX, double *Ap);
+void cblas_dsyr2(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const double alpha, const double *X,
+ const int incX, const double *Y, const int incY, double *A,
+ const int lda);
+void cblas_dspr2(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const double alpha, const double *X,
+ const int incX, const double *Y, const int incY, double *A);
+
+
+/*
+ * Routines with C and Z prefixes only
+ */
+void cblas_chemv(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const void *alpha, const void *A,
+ const int lda, const void *X, const int incX,
+ const void *beta, void *Y, const int incY);
+void cblas_chbmv(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const int K, const void *alpha, const void *A,
+ const int lda, const void *X, const int incX,
+ const void *beta, void *Y, const int incY);
+void cblas_chpmv(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const void *alpha, const void *Ap,
+ const void *X, const int incX,
+ const void *beta, void *Y, const int incY);
+void cblas_cgeru(const enum CBLAS_ORDER order, const int M, const int N,
+ const void *alpha, const void *X, const int incX,
+ const void *Y, const int incY, void *A, const int lda);
+void cblas_cgerc(const enum CBLAS_ORDER order, const int M, const int N,
+ const void *alpha, const void *X, const int incX,
+ const void *Y, const int incY, void *A, const int lda);
+void cblas_cher(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const float alpha, const void *X, const int incX,
+ void *A, const int lda);
+void cblas_chpr(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const float alpha, const void *X,
+ const int incX, void *A);
+void cblas_cher2(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo, const int N,
+ const void *alpha, const void *X, const int incX,
+ const void *Y, const int incY, void *A, const int lda);
+void cblas_chpr2(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo, const int N,
+ const void *alpha, const void *X, const int incX,
+ const void *Y, const int incY, void *Ap);
+
+void cblas_zhemv(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const void *alpha, const void *A,
+ const int lda, const void *X, const int incX,
+ const void *beta, void *Y, const int incY);
+void cblas_zhbmv(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const int K, const void *alpha, const void *A,
+ const int lda, const void *X, const int incX,
+ const void *beta, void *Y, const int incY);
+void cblas_zhpmv(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const void *alpha, const void *Ap,
+ const void *X, const int incX,
+ const void *beta, void *Y, const int incY);
+void cblas_zgeru(const enum CBLAS_ORDER order, const int M, const int N,
+ const void *alpha, const void *X, const int incX,
+ const void *Y, const int incY, void *A, const int lda);
+void cblas_zgerc(const enum CBLAS_ORDER order, const int M, const int N,
+ const void *alpha, const void *X, const int incX,
+ const void *Y, const int incY, void *A, const int lda);
+void cblas_zher(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const double alpha, const void *X, const int incX,
+ void *A, const int lda);
+void cblas_zhpr(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const double alpha, const void *X,
+ const int incX, void *A);
+void cblas_zher2(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo, const int N,
+ const void *alpha, const void *X, const int incX,
+ const void *Y, const int incY, void *A, const int lda);
+void cblas_zhpr2(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo, const int N,
+ const void *alpha, const void *X, const int incX,
+ const void *Y, const int incY, void *Ap);
+
+/*
+ * ===========================================================================
+ * Prototypes for level 3 BLAS
+ * ===========================================================================
+ */
+
+/*
+ * Routines with standard 4 prefixes (S, D, C, Z)
+ */
+void cblas_sgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA,
+ const enum CBLAS_TRANSPOSE TransB, const int M, const int N,
+ const int K, const float alpha, const float *A,
+ const int lda, const float *B, const int ldb,
+ const float beta, float *C, const int ldc);
+void cblas_ssymm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
+ const enum CBLAS_UPLO Uplo, const int M, const int N,
+ const float alpha, const float *A, const int lda,
+ const float *B, const int ldb, const float beta,
+ float *C, const int ldc);
+void cblas_ssyrk(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
+ const float alpha, const float *A, const int lda,
+ const float beta, float *C, const int ldc);
+void cblas_ssyr2k(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
+ const float alpha, const float *A, const int lda,
+ const float *B, const int ldb, const float beta,
+ float *C, const int ldc);
+void cblas_strmm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
+ const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA,
+ const enum CBLAS_DIAG Diag, const int M, const int N,
+ const float alpha, const float *A, const int lda,
+ float *B, const int ldb);
+void cblas_strsm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
+ const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA,
+ const enum CBLAS_DIAG Diag, const int M, const int N,
+ const float alpha, const float *A, const int lda,
+ float *B, const int ldb);
+
+void cblas_dgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA,
+ const enum CBLAS_TRANSPOSE TransB, const int M, const int N,
+ const int K, const double alpha, const double *A,
+ const int lda, const double *B, const int ldb,
+ const double beta, double *C, const int ldc);
+void cblas_dsymm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
+ const enum CBLAS_UPLO Uplo, const int M, const int N,
+ const double alpha, const double *A, const int lda,
+ const double *B, const int ldb, const double beta,
+ double *C, const int ldc);
+void cblas_dsyrk(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
+ const double alpha, const double *A, const int lda,
+ const double beta, double *C, const int ldc);
+void cblas_dsyr2k(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
+ const double alpha, const double *A, const int lda,
+ const double *B, const int ldb, const double beta,
+ double *C, const int ldc);
+void cblas_dtrmm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
+ const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA,
+ const enum CBLAS_DIAG Diag, const int M, const int N,
+ const double alpha, const double *A, const int lda,
+ double *B, const int ldb);
+void cblas_dtrsm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
+ const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA,
+ const enum CBLAS_DIAG Diag, const int M, const int N,
+ const double alpha, const double *A, const int lda,
+ double *B, const int ldb);
+
+void cblas_cgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA,
+ const enum CBLAS_TRANSPOSE TransB, const int M, const int N,
+ const int K, const void *alpha, const void *A,
+ const int lda, const void *B, const int ldb,
+ const void *beta, void *C, const int ldc);
+void cblas_csymm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
+ const enum CBLAS_UPLO Uplo, const int M, const int N,
+ const void *alpha, const void *A, const int lda,
+ const void *B, const int ldb, const void *beta,
+ void *C, const int ldc);
+void cblas_csyrk(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
+ const void *alpha, const void *A, const int lda,
+ const void *beta, void *C, const int ldc);
+void cblas_csyr2k(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
+ const void *alpha, const void *A, const int lda,
+ const void *B, const int ldb, const void *beta,
+ void *C, const int ldc);
+void cblas_ctrmm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
+ const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA,
+ const enum CBLAS_DIAG Diag, const int M, const int N,
+ const void *alpha, const void *A, const int lda,
+ void *B, const int ldb);
+void cblas_ctrsm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
+ const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA,
+ const enum CBLAS_DIAG Diag, const int M, const int N,
+ const void *alpha, const void *A, const int lda,
+ void *B, const int ldb);
+
+void cblas_zgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA,
+ const enum CBLAS_TRANSPOSE TransB, const int M, const int N,
+ const int K, const void *alpha, const void *A,
+ const int lda, const void *B, const int ldb,
+ const void *beta, void *C, const int ldc);
+void cblas_zsymm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
+ const enum CBLAS_UPLO Uplo, const int M, const int N,
+ const void *alpha, const void *A, const int lda,
+ const void *B, const int ldb, const void *beta,
+ void *C, const int ldc);
+void cblas_zsyrk(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
+ const void *alpha, const void *A, const int lda,
+ const void *beta, void *C, const int ldc);
+void cblas_zsyr2k(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
+ const void *alpha, const void *A, const int lda,
+ const void *B, const int ldb, const void *beta,
+ void *C, const int ldc);
+void cblas_ztrmm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
+ const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA,
+ const enum CBLAS_DIAG Diag, const int M, const int N,
+ const void *alpha, const void *A, const int lda,
+ void *B, const int ldb);
+void cblas_ztrsm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
+ const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA,
+ const enum CBLAS_DIAG Diag, const int M, const int N,
+ const void *alpha, const void *A, const int lda,
+ void *B, const int ldb);
+
+
+/*
+ * Routines with prefixes C and Z only
+ */
+void cblas_chemm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
+ const enum CBLAS_UPLO Uplo, const int M, const int N,
+ const void *alpha, const void *A, const int lda,
+ const void *B, const int ldb, const void *beta,
+ void *C, const int ldc);
+void cblas_cherk(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
+ const float alpha, const void *A, const int lda,
+ const float beta, void *C, const int ldc);
+void cblas_cher2k(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
+ const void *alpha, const void *A, const int lda,
+ const void *B, const int ldb, const float beta,
+ void *C, const int ldc);
+
+void cblas_zhemm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
+ const enum CBLAS_UPLO Uplo, const int M, const int N,
+ const void *alpha, const void *A, const int lda,
+ const void *B, const int ldb, const void *beta,
+ void *C, const int ldc);
+void cblas_zherk(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
+ const double alpha, const void *A, const int lda,
+ const double beta, void *C, const int ldc);
+void cblas_zher2k(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
+ const void *alpha, const void *A, const int lda,
+ const void *B, const int ldb, const double beta,
+ void *C, const int ldc);
+
+void cblas_xerbla(int p, const char *rout, const char *form, ...);
+
+__END_DECLS
+
+#endif /* __GSL_CBLAS_H__ */
diff --git a/gsl-1.9/cblas/hypot.c b/gsl-1.9/cblas/hypot.c
new file mode 100644
index 0000000..8f6bb47
--- /dev/null
+++ b/gsl-1.9/cblas/hypot.c
@@ -0,0 +1,28 @@
+#include <math.h>
+
+static double xhypot (const double x, const double y);
+
+static double xhypot (const double x, const double y)
+{
+ double xabs = fabs(x) ;
+ double yabs = fabs(y) ;
+ double min, max;
+
+ if (xabs < yabs) {
+ min = xabs ;
+ max = yabs ;
+ } else {
+ min = yabs ;
+ max = xabs ;
+ }
+
+ if (min == 0)
+ {
+ return max ;
+ }
+
+ {
+ double u = min / max ;
+ return max * sqrt (1 + u * u) ;
+ }
+}
diff --git a/gsl-1.9/cblas/icamax.c b/gsl-1.9/cblas/icamax.c
new file mode 100644
index 0000000..cf0f344
--- /dev/null
+++ b/gsl-1.9/cblas/icamax.c
@@ -0,0 +1,11 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+CBLAS_INDEX
+cblas_icamax (const int N, const void *X, const int incX)
+{
+#define BASE float
+#include "source_iamax_c.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/idamax.c b/gsl-1.9/cblas/idamax.c
new file mode 100644
index 0000000..b6372e7
--- /dev/null
+++ b/gsl-1.9/cblas/idamax.c
@@ -0,0 +1,11 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+CBLAS_INDEX
+cblas_idamax (const int N, const double *X, const int incX)
+{
+#define BASE double
+#include "source_iamax_r.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/isamax.c b/gsl-1.9/cblas/isamax.c
new file mode 100644
index 0000000..6e7279a
--- /dev/null
+++ b/gsl-1.9/cblas/isamax.c
@@ -0,0 +1,11 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+CBLAS_INDEX
+cblas_isamax (const int N, const float *X, const int incX)
+{
+#define BASE float
+#include "source_iamax_r.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/izamax.c b/gsl-1.9/cblas/izamax.c
new file mode 100644
index 0000000..e3ae675
--- /dev/null
+++ b/gsl-1.9/cblas/izamax.c
@@ -0,0 +1,11 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+CBLAS_INDEX
+cblas_izamax (const int N, const void *X, const int incX)
+{
+#define BASE double
+#include "source_iamax_c.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/sasum.c b/gsl-1.9/cblas/sasum.c
new file mode 100644
index 0000000..019d925
--- /dev/null
+++ b/gsl-1.9/cblas/sasum.c
@@ -0,0 +1,11 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+float
+cblas_sasum (const int N, const float *X, const int incX)
+{
+#define BASE float
+#include "source_asum_r.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/saxpy.c b/gsl-1.9/cblas/saxpy.c
new file mode 100644
index 0000000..af08d4d
--- /dev/null
+++ b/gsl-1.9/cblas/saxpy.c
@@ -0,0 +1,12 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_saxpy (const int N, const float alpha, const float *X, const int incX,
+ float *Y, const int incY)
+{
+#define BASE float
+#include "source_axpy_r.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/scasum.c b/gsl-1.9/cblas/scasum.c
new file mode 100644
index 0000000..af87482
--- /dev/null
+++ b/gsl-1.9/cblas/scasum.c
@@ -0,0 +1,11 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+float
+cblas_scasum (const int N, const void *X, const int incX)
+{
+#define BASE float
+#include "source_asum_c.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/scnrm2.c b/gsl-1.9/cblas/scnrm2.c
new file mode 100644
index 0000000..4653c13
--- /dev/null
+++ b/gsl-1.9/cblas/scnrm2.c
@@ -0,0 +1,11 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+float
+cblas_scnrm2 (const int N, const void *X, const int incX)
+{
+#define BASE float
+#include "source_nrm2_c.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/scopy.c b/gsl-1.9/cblas/scopy.c
new file mode 100644
index 0000000..423a386
--- /dev/null
+++ b/gsl-1.9/cblas/scopy.c
@@ -0,0 +1,12 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_scopy (const int N, const float *X, const int incX, float *Y,
+ const int incY)
+{
+#define BASE float
+#include "source_copy_r.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/sdot.c b/gsl-1.9/cblas/sdot.c
new file mode 100644
index 0000000..c65904f
--- /dev/null
+++ b/gsl-1.9/cblas/sdot.c
@@ -0,0 +1,16 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+float
+cblas_sdot (const int N, const float *X, const int incX, const float *Y,
+ const int incY)
+{
+#define INIT_VAL 0.0
+#define ACC_TYPE float
+#define BASE float
+#include "source_dot_r.h"
+#undef ACC_TYPE
+#undef BASE
+#undef INIT_VAL
+}
diff --git a/gsl-1.9/cblas/sdsdot.c b/gsl-1.9/cblas/sdsdot.c
new file mode 100644
index 0000000..5672ac4
--- /dev/null
+++ b/gsl-1.9/cblas/sdsdot.c
@@ -0,0 +1,16 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+float
+cblas_sdsdot (const int N, const float alpha, const float *X, const int incX,
+ const float *Y, const int incY)
+{
+#define INIT_VAL alpha
+#define ACC_TYPE double
+#define BASE float
+#include "source_dot_r.h"
+#undef ACC_TYPE
+#undef BASE
+#undef INIT_VAL
+}
diff --git a/gsl-1.9/cblas/sgbmv.c b/gsl-1.9/cblas/sgbmv.c
new file mode 100644
index 0000000..9f2fc7d
--- /dev/null
+++ b/gsl-1.9/cblas/sgbmv.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_sgbmv (const enum CBLAS_ORDER order, const enum CBLAS_TRANSPOSE TransA,
+ const int M, const int N, const int KL, const int KU,
+ const float alpha, const float *A, const int lda, const float *X,
+ const int incX, const float beta, float *Y, const int incY)
+{
+#define BASE float
+#include "source_gbmv_r.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/sgemm.c b/gsl-1.9/cblas/sgemm.c
new file mode 100644
index 0000000..98ec087
--- /dev/null
+++ b/gsl-1.9/cblas/sgemm.c
@@ -0,0 +1,15 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_sgemm (const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA,
+ const enum CBLAS_TRANSPOSE TransB, const int M, const int N,
+ const int K, const float alpha, const float *A, const int lda,
+ const float *B, const int ldb, const float beta, float *C,
+ const int ldc)
+{
+#define BASE float
+#include "source_gemm_r.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/sgemv.c b/gsl-1.9/cblas/sgemv.c
new file mode 100644
index 0000000..b3e7aec
--- /dev/null
+++ b/gsl-1.9/cblas/sgemv.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_sgemv (const enum CBLAS_ORDER order, const enum CBLAS_TRANSPOSE TransA,
+ const int M, const int N, const float alpha, const float *A,
+ const int lda, const float *X, const int incX, const float beta,
+ float *Y, const int incY)
+{
+#define BASE float
+#include "source_gemv_r.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/sger.c b/gsl-1.9/cblas/sger.c
new file mode 100644
index 0000000..72c366d
--- /dev/null
+++ b/gsl-1.9/cblas/sger.c
@@ -0,0 +1,13 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_sger (const enum CBLAS_ORDER order, const int M, const int N,
+ const float alpha, const float *X, const int incX, const float *Y,
+ const int incY, float *A, const int lda)
+{
+#define BASE float
+#include "source_ger.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/snrm2.c b/gsl-1.9/cblas/snrm2.c
new file mode 100644
index 0000000..76b3d59
--- /dev/null
+++ b/gsl-1.9/cblas/snrm2.c
@@ -0,0 +1,11 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+float
+cblas_snrm2 (const int N, const float *X, const int incX)
+{
+#define BASE float
+#include "source_nrm2_r.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/source_asum_c.h b/gsl-1.9/cblas/source_asum_c.h
new file mode 100644
index 0000000..c0e85ab
--- /dev/null
+++ b/gsl-1.9/cblas/source_asum_c.h
@@ -0,0 +1,34 @@
+/* blas/source_asum_c.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ BASE r = 0.0;
+ INDEX i;
+ INDEX ix = 0;
+
+ if (incX <= 0) {
+ return 0;
+ }
+
+ for (i = 0; i < N; i++) {
+ r += fabs(CONST_REAL(X, ix)) + fabs(CONST_IMAG(X, ix));
+ ix += incX;
+ }
+ return r;
+}
diff --git a/gsl-1.9/cblas/source_asum_r.h b/gsl-1.9/cblas/source_asum_r.h
new file mode 100644
index 0000000..3d6f2e3
--- /dev/null
+++ b/gsl-1.9/cblas/source_asum_r.h
@@ -0,0 +1,34 @@
+/* blas/source_asum_r.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ BASE r = 0.0;
+ INDEX i;
+ INDEX ix = 0;
+
+ if (incX <= 0) {
+ return 0;
+ }
+
+ for (i = 0; i < N; i++) {
+ r += fabs(X[ix]);
+ ix += incX;
+ }
+ return r;
+}
diff --git a/gsl-1.9/cblas/source_axpy_c.h b/gsl-1.9/cblas/source_axpy_c.h
new file mode 100644
index 0000000..1884ccd
--- /dev/null
+++ b/gsl-1.9/cblas/source_axpy_c.h
@@ -0,0 +1,40 @@
+/* blas/source_axpy_c.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i;
+ INDEX ix = OFFSET(N, incX);
+ INDEX iy = OFFSET(N, incY);
+
+ const BASE alpha_real = CONST_REAL0(alpha);
+ const BASE alpha_imag = CONST_IMAG0(alpha);
+
+ if (fabs(alpha_real) == 0 && fabs(alpha_imag) == 0) {
+ return;
+ }
+
+ for (i = 0; i < N; i++) {
+ const BASE x_real = CONST_REAL(X, ix);
+ const BASE x_imag = CONST_IMAG(X, ix);
+ REAL(Y, iy) += (alpha_real * x_real - alpha_imag * x_imag);
+ IMAG(Y, iy) += (alpha_real * x_imag + alpha_imag * x_real);
+ ix += incX;
+ iy += incY;
+ }
+}
diff --git a/gsl-1.9/cblas/source_axpy_r.h b/gsl-1.9/cblas/source_axpy_r.h
new file mode 100644
index 0000000..8e38448
--- /dev/null
+++ b/gsl-1.9/cblas/source_axpy_r.h
@@ -0,0 +1,50 @@
+/* blas/source_axpy_r.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i;
+
+ if (alpha == 0.0) {
+ return;
+ }
+
+ if (incX == 1 && incY == 1) {
+ const INDEX m = N % 4;
+
+ for (i = 0; i < m; i++) {
+ Y[i] += alpha * X[i];
+ }
+
+ for (i = m; i + 3 < N; i += 4) {
+ Y[i] += alpha * X[i];
+ Y[i + 1] += alpha * X[i + 1];
+ Y[i + 2] += alpha * X[i + 2];
+ Y[i + 3] += alpha * X[i + 3];
+ }
+ } else {
+ INDEX ix = OFFSET(N, incX);
+ INDEX iy = OFFSET(N, incY);
+
+ for (i = 0; i < N; i++) {
+ Y[iy] += alpha * X[ix];
+ ix += incX;
+ iy += incY;
+ }
+ }
+}
diff --git a/gsl-1.9/cblas/source_copy_c.h b/gsl-1.9/cblas/source_copy_c.h
new file mode 100644
index 0000000..c7f7b58
--- /dev/null
+++ b/gsl-1.9/cblas/source_copy_c.h
@@ -0,0 +1,31 @@
+/* blas/source_copy_c.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i;
+ INDEX ix = OFFSET(N, incX);
+ INDEX iy = OFFSET(N, incY);
+
+ for (i = 0; i < N; i++) {
+ REAL(Y, iy) = CONST_REAL(X, ix);
+ IMAG(Y, iy) = CONST_IMAG(X, ix);
+ ix += incX;
+ iy += incY;
+ }
+}
diff --git a/gsl-1.9/cblas/source_copy_r.h b/gsl-1.9/cblas/source_copy_r.h
new file mode 100644
index 0000000..a8dc86b
--- /dev/null
+++ b/gsl-1.9/cblas/source_copy_r.h
@@ -0,0 +1,30 @@
+/* blas/source_copy_r.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i;
+ INDEX ix = OFFSET(N, incX);
+ INDEX iy = OFFSET(N, incY);
+
+ for (i = 0; i < N; i++) {
+ Y[iy] = X[ix];
+ ix += incX;
+ iy += incY;
+ }
+}
diff --git a/gsl-1.9/cblas/source_dot_c.h b/gsl-1.9/cblas/source_dot_c.h
new file mode 100644
index 0000000..062040f
--- /dev/null
+++ b/gsl-1.9/cblas/source_dot_c.h
@@ -0,0 +1,38 @@
+/* blas/source_dot_c.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ BASE r_real = 0.0;
+ BASE r_imag = 0.0;
+ INDEX i;
+ INDEX ix = OFFSET(N, incX);
+ INDEX iy = OFFSET(N, incY);
+ for (i = 0; i < N; i++) {
+ const BASE x_real = CONST_REAL(X, ix);
+ const BASE x_imag = CONST_IMAG(X, ix);
+ const BASE y_real = CONST_REAL(Y, iy);
+ const BASE y_imag = CONST_IMAG(Y, iy);
+ r_real += x_real * y_real - CONJ_SIGN * x_imag * y_imag;
+ r_imag += x_real * y_imag + CONJ_SIGN * x_imag * y_real;
+ ix += incX;
+ iy += incY;
+ }
+ REAL0(result) = r_real;
+ IMAG0(result) = r_imag;
+}
diff --git a/gsl-1.9/cblas/source_dot_r.h b/gsl-1.9/cblas/source_dot_r.h
new file mode 100644
index 0000000..dc356eb
--- /dev/null
+++ b/gsl-1.9/cblas/source_dot_r.h
@@ -0,0 +1,33 @@
+/* blas/source_dot_r.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ ACC_TYPE r = INIT_VAL;
+ INDEX i;
+ INDEX ix = OFFSET(N, incX);
+ INDEX iy = OFFSET(N, incY);
+
+ for (i = 0; i < N; i++) {
+ r += X[ix] * Y[iy];
+ ix += incX;
+ iy += incY;
+ }
+
+ return r;
+}
diff --git a/gsl-1.9/cblas/source_gbmv_c.h b/gsl-1.9/cblas/source_gbmv_c.h
new file mode 100644
index 0000000..c235366
--- /dev/null
+++ b/gsl-1.9/cblas/source_gbmv_c.h
@@ -0,0 +1,170 @@
+/* blas/source_gbmv_c.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i, j;
+ INDEX lenX, lenY, L, U;
+
+ const BASE alpha_real = CONST_REAL0(alpha);
+ const BASE alpha_imag = CONST_IMAG0(alpha);
+
+ const BASE beta_real = CONST_REAL0(beta);
+ const BASE beta_imag = CONST_IMAG0(beta);
+
+ if (M == 0 || N == 0)
+ return;
+
+ if ((alpha_real == 0.0 && alpha_imag == 0.0)
+ && (beta_real == 1.0 && beta_imag == 0.0))
+ return;
+
+ if (TransA == CblasNoTrans) {
+ lenX = N;
+ lenY = M;
+ L = KL;
+ U = KU;
+ } else {
+ lenX = M;
+ lenY = N;
+ L = KU;
+ U = KL;
+ }
+
+ /* form y := beta*y */
+ if (beta_real == 0.0 && beta_imag == 0.0) {
+ INDEX iy = OFFSET(lenY, incY);
+ for (i = 0; i < lenY; i++) {
+ REAL(Y, iy) = 0.0;
+ IMAG(Y, iy) = 0.0;
+ iy += incY;
+ }
+ } else if (!(beta_real == 1.0 && beta_imag == 0.0)) {
+ INDEX iy = OFFSET(lenY, incY);
+ for (i = 0; i < lenY; i++) {
+ const BASE y_real = REAL(Y, iy);
+ const BASE y_imag = IMAG(Y, iy);
+ const BASE tmpR = y_real * beta_real - y_imag * beta_imag;
+ const BASE tmpI = y_real * beta_imag + y_imag * beta_real;
+ REAL(Y, iy) = tmpR;
+ IMAG(Y, iy) = tmpI;
+ iy += incY;
+ }
+ }
+
+ if (alpha_real == 0.0 && alpha_imag == 0.0)
+ return;
+
+ if ((order == CblasRowMajor && TransA == CblasNoTrans)
+ || (order == CblasColMajor && TransA == CblasTrans)) {
+ /* form y := alpha*A*x + y */
+ INDEX iy = OFFSET(lenY, incY);
+ for (i = 0; i < lenY; i++) {
+ BASE dotR = 0.0;
+ BASE dotI = 0.0;
+ const INDEX j_min = (i > L ? i - L : 0);
+ const INDEX j_max = GSL_MIN(lenX, i + U + 1);
+ INDEX ix = OFFSET(lenX, incX) + j_min * incX;
+ for (j = j_min; j < j_max; j++) {
+ const BASE x_real = CONST_REAL(X, ix);
+ const BASE x_imag = CONST_IMAG(X, ix);
+ const BASE A_real = CONST_REAL(A, lda * i + (L + j - i));
+ const BASE A_imag = CONST_IMAG(A, lda * i + (L + j - i));
+
+ dotR += A_real * x_real - A_imag * x_imag;
+ dotI += A_real * x_imag + A_imag * x_real;
+ ix += incX;
+ }
+
+ REAL(Y, iy) += alpha_real * dotR - alpha_imag * dotI;
+ IMAG(Y, iy) += alpha_real * dotI + alpha_imag * dotR;
+ iy += incY;
+ }
+ } else if ((order == CblasRowMajor && TransA == CblasTrans)
+ || (order == CblasColMajor && TransA == CblasNoTrans)) {
+ /* form y := alpha*A'*x + y */
+ INDEX ix = OFFSET(lenX, incX);
+ for (j = 0; j < lenX; j++) {
+ const BASE x_real = CONST_REAL(X, ix);
+ const BASE x_imag = CONST_IMAG(X, ix);
+ BASE tmpR = alpha_real * x_real - alpha_imag * x_imag;
+ BASE tmpI = alpha_real * x_imag + alpha_imag * x_real;
+ if (!(tmpR == 0.0 && tmpI == 0.0)) {
+ const INDEX i_min = (j > U ? j - U : 0);
+ const INDEX i_max = GSL_MIN(lenY, j + L + 1);
+ INDEX iy = OFFSET(lenY, incY) + i_min * incY;
+ for (i = i_min; i < i_max; i++) {
+ const BASE A_real = CONST_REAL(A, lda * j + (U + i - j));
+ const BASE A_imag = CONST_IMAG(A, lda * j + (U + i - j));
+ REAL(Y, iy) += A_real * tmpR - A_imag * tmpI;
+ IMAG(Y, iy) += A_real * tmpI + A_imag * tmpR;
+ iy += incY;
+ }
+ }
+ ix += incX;
+ }
+ } else if (order == CblasRowMajor && TransA == CblasConjTrans) {
+ /* form y := alpha*A^H*x + y */
+ INDEX ix = OFFSET(lenX, incX);
+ for (j = 0; j < lenX; j++) {
+ const BASE x_real = CONST_REAL(X, ix);
+ const BASE x_imag = CONST_IMAG(X, ix);
+ BASE tmpR = alpha_real * x_real - alpha_imag * x_imag;
+ BASE tmpI = alpha_real * x_imag + alpha_imag * x_real;
+ if (!(tmpR == 0.0 && tmpI == 0.0)) {
+ const INDEX i_min = (j > U ? j - U : 0);
+ const INDEX i_max = GSL_MIN(lenY, j + L + 1);
+ INDEX iy = OFFSET(lenY, incY) + i_min * incY;
+ for (i = i_min; i < i_max; i++) {
+ const BASE A_real = CONST_REAL(A, lda * j + (U + i - j));
+ const BASE A_imag = CONST_IMAG(A, lda * j + (U + i - j));
+ REAL(Y, iy) += A_real * tmpR - (-A_imag) * tmpI;
+ IMAG(Y, iy) += A_real * tmpI + (-A_imag) * tmpR;
+ iy += incY;
+ }
+ }
+ ix += incX;
+ }
+ } else if (order == CblasColMajor && TransA == CblasConjTrans) {
+ /* form y := alpha*A^H*x + y */
+ INDEX iy = OFFSET(lenY, incY);
+ for (i = 0; i < lenY; i++) {
+ BASE dotR = 0.0;
+ BASE dotI = 0.0;
+ const INDEX j_min = (i > L ? i - L : 0);
+ const INDEX j_max = GSL_MIN(lenX, i + U + 1);
+ INDEX ix = OFFSET(lenX, incX) + j_min * incX;
+ for (j = j_min; j < j_max; j++) {
+ const BASE x_real = CONST_REAL(X, ix);
+ const BASE x_imag = CONST_IMAG(X, ix);
+ const BASE A_real = CONST_REAL(A, lda * i + (L + j - i));
+ const BASE A_imag = CONST_IMAG(A, lda * i + (L + j - i));
+
+ dotR += A_real * x_real - (-A_imag) * x_imag;
+ dotI += A_real * x_imag + (-A_imag) * x_real;
+ ix += incX;
+ }
+
+ REAL(Y, iy) += alpha_real * dotR - alpha_imag * dotI;
+ IMAG(Y, iy) += alpha_real * dotI + alpha_imag * dotR;
+ iy += incY;
+ }
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+}
diff --git a/gsl-1.9/cblas/source_gbmv_r.h b/gsl-1.9/cblas/source_gbmv_r.h
new file mode 100644
index 0000000..779512b
--- /dev/null
+++ b/gsl-1.9/cblas/source_gbmv_r.h
@@ -0,0 +1,98 @@
+/* blas/source_gbmv_r.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i, j;
+ INDEX lenX, lenY, L, U;
+
+ const int Trans = (TransA != CblasConjTrans) ? TransA : CblasTrans;
+
+ if (M == 0 || N == 0)
+ return;
+
+ if (alpha == 0.0 && beta == 1.0)
+ return;
+
+ if (Trans == CblasNoTrans) {
+ lenX = N;
+ lenY = M;
+ L = KL;
+ U = KU;
+ } else {
+ lenX = M;
+ lenY = N;
+ L = KU;
+ U = KL;
+ }
+
+ /* form y := beta*y */
+ if (beta == 0.0) {
+ INDEX iy = OFFSET(lenY, incY);
+ for (i = 0; i < lenY; i++) {
+ Y[iy] = 0;
+ iy += incY;
+ }
+ } else if (beta != 1.0) {
+ INDEX iy = OFFSET(lenY, incY);
+ for (i = 0; i < lenY; i++) {
+ Y[iy] *= beta;
+ iy += incY;
+ }
+ }
+
+ if (alpha == 0.0)
+ return;
+
+ if ((order == CblasRowMajor && Trans == CblasNoTrans)
+ || (order == CblasColMajor && Trans == CblasTrans)) {
+ /* form y := alpha*A*x + y */
+ INDEX iy = OFFSET(lenY, incY);
+ for (i = 0; i < lenY; i++) {
+ BASE temp = 0.0;
+ const INDEX j_min = (i > L ? i - L : 0);
+ const INDEX j_max = GSL_MIN(lenX, i + U + 1);
+ INDEX jx = OFFSET(lenX, incX) + j_min * incX;
+ for (j = j_min; j < j_max; j++) {
+ temp += X[jx] * A[(L - i + j) + i * lda];
+ jx += incX;
+ }
+ Y[iy] += alpha * temp;
+ iy += incY;
+ }
+ } else if ((order == CblasRowMajor && Trans == CblasTrans)
+ || (order == CblasColMajor && Trans == CblasNoTrans)) {
+ /* form y := alpha*A'*x + y */
+ INDEX jx = OFFSET(lenX, incX);
+ for (j = 0; j < lenX; j++) {
+ const BASE temp = alpha * X[jx];
+ if (temp != 0.0) {
+ const INDEX i_min = (j > U ? j - U : 0);
+ const INDEX i_max = GSL_MIN(lenY, j + L + 1);
+ INDEX iy = OFFSET(lenY, incY) + i_min * incY;
+ for (i = i_min; i < i_max; i++) {
+ Y[iy] += temp * A[lda * j + (U + i - j)];
+ iy += incY;
+ }
+ }
+ jx += incX;
+ }
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+}
diff --git a/gsl-1.9/cblas/source_gemm_c.h b/gsl-1.9/cblas/source_gemm_c.h
new file mode 100644
index 0000000..ca0a4fb
--- /dev/null
+++ b/gsl-1.9/cblas/source_gemm_c.h
@@ -0,0 +1,167 @@
+/* blas/source_gemm_c.h
+ *
+ * Copyright (C) 2001 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i, j, k;
+ INDEX n1, n2;
+ INDEX ldf, ldg;
+ int conjF, conjG, TransF, TransG;
+ const BASE *F, *G;
+
+ const BASE alpha_real = CONST_REAL0(alpha);
+ const BASE alpha_imag = CONST_IMAG0(alpha);
+
+ const BASE beta_real = CONST_REAL0(beta);
+ const BASE beta_imag = CONST_IMAG0(beta);
+
+ if ((alpha_real == 0.0 && alpha_imag == 0.0)
+ && (beta_real == 1.0 && beta_imag == 0.0))
+ return;
+
+ if (Order == CblasRowMajor) {
+ n1 = M;
+ n2 = N;
+ F = (const BASE *)A;
+ ldf = lda;
+ conjF = (TransA == CblasConjTrans) ? -1 : 1;
+ TransF = (TransA == CblasNoTrans) ? CblasNoTrans : CblasTrans;
+ G = (const BASE *)B;
+ ldg = ldb;
+ conjG = (TransB == CblasConjTrans) ? -1 : 1;
+ TransG = (TransB == CblasNoTrans) ? CblasNoTrans : CblasTrans;
+ } else {
+ n1 = N;
+ n2 = M;
+ F = (const BASE *)B;
+ ldf = ldb;
+ conjF = (TransB == CblasConjTrans) ? -1 : 1;
+ TransF = (TransB == CblasNoTrans) ? CblasNoTrans : CblasTrans;
+ G = (const BASE *)A;
+ ldg = lda;
+ conjG = (TransA == CblasConjTrans) ? -1 : 1;
+ TransG = (TransA == CblasNoTrans) ? CblasNoTrans : CblasTrans;
+ }
+
+ /* form y := beta*y */
+ if (beta_real == 0.0 && beta_imag == 0.0) {
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ REAL(C, ldc * i + j) = 0.0;
+ IMAG(C, ldc * i + j) = 0.0;
+ }
+ }
+ } else if (!(beta_real == 1.0 && beta_imag == 0.0)) {
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ const BASE Cij_real = REAL(C, ldc * i + j);
+ const BASE Cij_imag = IMAG(C, ldc * i + j);
+ REAL(C, ldc * i + j) = beta_real * Cij_real - beta_imag * Cij_imag;
+ IMAG(C, ldc * i + j) = beta_real * Cij_imag + beta_imag * Cij_real;
+ }
+ }
+ }
+
+ if (alpha_real == 0.0 && alpha_imag == 0.0)
+ return;
+
+ if (TransF == CblasNoTrans && TransG == CblasNoTrans) {
+
+ /* form C := alpha*A*B + C */
+
+ for (k = 0; k < K; k++) {
+ for (i = 0; i < n1; i++) {
+ const BASE Fik_real = CONST_REAL(F, ldf * i + k);
+ const BASE Fik_imag = conjF * CONST_IMAG(F, ldf * i + k);
+ const BASE temp_real = alpha_real * Fik_real - alpha_imag * Fik_imag;
+ const BASE temp_imag = alpha_real * Fik_imag + alpha_imag * Fik_real;
+ if (!(temp_real == 0.0 && temp_imag == 0.0)) {
+ for (j = 0; j < n2; j++) {
+ const BASE Gkj_real = CONST_REAL(G, ldg * k + j);
+ const BASE Gkj_imag = conjG * CONST_IMAG(G, ldg * k + j);
+ REAL(C, ldc * i + j) += temp_real * Gkj_real - temp_imag * Gkj_imag;
+ IMAG(C, ldc * i + j) += temp_real * Gkj_imag + temp_imag * Gkj_real;
+ }
+ }
+ }
+ }
+
+ } else if (TransF == CblasNoTrans && TransG == CblasTrans) {
+
+ /* form C := alpha*A*B' + C */
+
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ BASE temp_real = 0.0;
+ BASE temp_imag = 0.0;
+ for (k = 0; k < K; k++) {
+ const BASE Fik_real = CONST_REAL(F, ldf * i + k);
+ const BASE Fik_imag = conjF * CONST_IMAG(F, ldf * i + k);
+ const BASE Gjk_real = CONST_REAL(G, ldg * j + k);
+ const BASE Gjk_imag = conjG * CONST_IMAG(G, ldg * j + k);
+ temp_real += Fik_real * Gjk_real - Fik_imag * Gjk_imag;
+ temp_imag += Fik_real * Gjk_imag + Fik_imag * Gjk_real;
+ }
+ REAL(C, ldc * i + j) += alpha_real * temp_real - alpha_imag * temp_imag;
+ IMAG(C, ldc * i + j) += alpha_real * temp_imag + alpha_imag * temp_real;
+ }
+ }
+
+ } else if (TransF == CblasTrans && TransG == CblasNoTrans) {
+
+ for (k = 0; k < K; k++) {
+ for (i = 0; i < n1; i++) {
+ const BASE Fki_real = CONST_REAL(F, ldf * k + i);
+ const BASE Fki_imag = conjF * CONST_IMAG(F, ldf * k + i);
+ const BASE temp_real = alpha_real * Fki_real - alpha_imag * Fki_imag;
+ const BASE temp_imag = alpha_real * Fki_imag + alpha_imag * Fki_real;
+ if (!(temp_real == 0.0 && temp_imag == 0.0)) {
+ for (j = 0; j < n2; j++) {
+ const BASE Gkj_real = CONST_REAL(G, ldg * k + j);
+ const BASE Gkj_imag = conjG * CONST_IMAG(G, ldg * k + j);
+ REAL(C, ldc * i + j) += temp_real * Gkj_real - temp_imag * Gkj_imag;
+ IMAG(C, ldc * i + j) += temp_real * Gkj_imag + temp_imag * Gkj_real;
+ }
+ }
+ }
+ }
+
+ } else if (TransF == CblasTrans && TransG == CblasTrans) {
+
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ BASE temp_real = 0.0;
+ BASE temp_imag = 0.0;
+ for (k = 0; k < K; k++) {
+ const BASE Fki_real = CONST_REAL(F, ldf * k + i);
+ const BASE Fki_imag = conjF * CONST_IMAG(F, ldf * k + i);
+ const BASE Gjk_real = CONST_REAL(G, ldg * j + k);
+ const BASE Gjk_imag = conjG * CONST_IMAG(G, ldg * j + k);
+
+ temp_real += Fki_real * Gjk_real - Fki_imag * Gjk_imag;
+ temp_imag += Fki_real * Gjk_imag + Fki_imag * Gjk_real;
+ }
+ REAL(C, ldc * i + j) += alpha_real * temp_real - alpha_imag * temp_imag;
+ IMAG(C, ldc * i + j) += alpha_real * temp_imag + alpha_imag * temp_real;
+ }
+ }
+
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+}
diff --git a/gsl-1.9/cblas/source_gemm_r.h b/gsl-1.9/cblas/source_gemm_r.h
new file mode 100644
index 0000000..aa625dd
--- /dev/null
+++ b/gsl-1.9/cblas/source_gemm_r.h
@@ -0,0 +1,125 @@
+/* blas/source_gemm_r.h
+ *
+ * Copyright (C) 2001 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i, j, k;
+ INDEX n1, n2;
+ INDEX ldf, ldg;
+ int TransF, TransG;
+ const BASE *F, *G;
+
+ if (alpha == 0.0 && beta == 1.0)
+ return;
+
+ if (Order == CblasRowMajor) {
+ n1 = M;
+ n2 = N;
+ F = A;
+ ldf = lda;
+ TransF = (TransA == CblasConjTrans) ? CblasTrans : TransA;
+ G = B;
+ ldg = ldb;
+ TransG = (TransB == CblasConjTrans) ? CblasTrans : TransB;
+ } else {
+ n1 = N;
+ n2 = M;
+ F = B;
+ ldf = ldb;
+ TransF = (TransB == CblasConjTrans) ? CblasTrans : TransB;
+ G = A;
+ ldg = lda;
+ TransG = (TransA == CblasConjTrans) ? CblasTrans : TransA;
+ }
+
+ /* form y := beta*y */
+ if (beta == 0.0) {
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ C[ldc * i + j] = 0.0;
+ }
+ }
+ } else if (beta != 1.0) {
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ C[ldc * i + j] *= beta;
+ }
+ }
+ }
+
+ if (alpha == 0.0)
+ return;
+
+ if (TransF == CblasNoTrans && TransG == CblasNoTrans) {
+
+ /* form C := alpha*A*B + C */
+
+ for (k = 0; k < K; k++) {
+ for (i = 0; i < n1; i++) {
+ const BASE temp = alpha * F[ldf * i + k];
+ if (temp != 0.0) {
+ for (j = 0; j < n2; j++) {
+ C[ldc * i + j] += temp * G[ldg * k + j];
+ }
+ }
+ }
+ }
+
+ } else if (TransF == CblasNoTrans && TransG == CblasTrans) {
+
+ /* form C := alpha*A*B' + C */
+
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ BASE temp = 0.0;
+ for (k = 0; k < K; k++) {
+ temp += F[ldf * i + k] * G[ldg * j + k];
+ }
+ C[ldc * i + j] += alpha * temp;
+ }
+ }
+
+ } else if (TransF == CblasTrans && TransG == CblasNoTrans) {
+
+ for (k = 0; k < K; k++) {
+ for (i = 0; i < n1; i++) {
+ const BASE temp = alpha * F[ldf * k + i];
+ if (temp != 0.0) {
+ for (j = 0; j < n2; j++) {
+ C[ldc * i + j] += temp * G[ldg * k + j];
+ }
+ }
+ }
+ }
+
+ } else if (TransF == CblasTrans && TransG == CblasTrans) {
+
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ BASE temp = 0.0;
+ for (k = 0; k < K; k++) {
+ temp += F[ldf * k + i] * G[ldg * j + k];
+ }
+ C[ldc * i + j] += alpha * temp;
+ }
+ }
+
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+}
diff --git a/gsl-1.9/cblas/source_gemv_c.h b/gsl-1.9/cblas/source_gemv_c.h
new file mode 100644
index 0000000..9e998c9
--- /dev/null
+++ b/gsl-1.9/cblas/source_gemv_c.h
@@ -0,0 +1,158 @@
+/* blas/source_gemv_c.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i, j;
+ INDEX lenX, lenY;
+
+ const BASE alpha_real = CONST_REAL0(alpha);
+ const BASE alpha_imag = CONST_IMAG0(alpha);
+
+ const BASE beta_real = CONST_REAL0(beta);
+ const BASE beta_imag = CONST_IMAG0(beta);
+
+ if (M == 0 || N == 0)
+ return;
+
+ if ((alpha_real == 0.0 && alpha_imag == 0.0)
+ && (beta_real == 1.0 && beta_imag == 0.0))
+ return;
+
+ if (TransA == CblasNoTrans) {
+ lenX = N;
+ lenY = M;
+ } else {
+ lenX = M;
+ lenY = N;
+ }
+
+ /* form y := beta*y */
+
+ if (beta_real == 0.0 && beta_imag == 0.0) {
+ INDEX iy = OFFSET(lenY, incY);
+ for (i = 0; i < lenY; i++) {
+ REAL(Y, iy) = 0.0;
+ IMAG(Y, iy) = 0.0;
+ iy += incY;
+ }
+ } else if (!(beta_real == 1.0 && beta_imag == 0.0)) {
+ INDEX iy = OFFSET(lenY, incY);
+ for (i = 0; i < lenY; i++) {
+ const BASE y_real = REAL(Y, iy);
+ const BASE y_imag = IMAG(Y, iy);
+ const BASE tmpR = y_real * beta_real - y_imag * beta_imag;
+ const BASE tmpI = y_real * beta_imag + y_imag * beta_real;
+ REAL(Y, iy) = tmpR;
+ IMAG(Y, iy) = tmpI;
+ iy += incY;
+ }
+ }
+
+ if (alpha_real == 0.0 && alpha_imag == 0.0)
+ return;
+
+ if ((order == CblasRowMajor && TransA == CblasNoTrans)
+ || (order == CblasColMajor && TransA == CblasTrans)) {
+ /* form y := alpha*A*x + y */
+ INDEX iy = OFFSET(lenY, incY);
+ for (i = 0; i < lenY; i++) {
+ BASE dotR = 0.0;
+ BASE dotI = 0.0;
+ INDEX ix = OFFSET(lenX, incX);
+ for (j = 0; j < lenX; j++) {
+ const BASE x_real = CONST_REAL(X, ix);
+ const BASE x_imag = CONST_IMAG(X, ix);
+ const BASE A_real = CONST_REAL(A, lda * i + j);
+ const BASE A_imag = CONST_IMAG(A, lda * i + j);
+
+ dotR += A_real * x_real - A_imag * x_imag;
+ dotI += A_real * x_imag + A_imag * x_real;
+ ix += incX;
+ }
+
+ REAL(Y, iy) += alpha_real * dotR - alpha_imag * dotI;
+ IMAG(Y, iy) += alpha_real * dotI + alpha_imag * dotR;
+ iy += incY;
+ }
+ } else if ((order == CblasRowMajor && TransA == CblasTrans)
+ || (order == CblasColMajor && TransA == CblasNoTrans)) {
+ /* form y := alpha*A'*x + y */
+ INDEX ix = OFFSET(lenX, incX);
+ for (j = 0; j < lenX; j++) {
+ BASE x_real = CONST_REAL(X, ix);
+ BASE x_imag = CONST_IMAG(X, ix);
+ BASE tmpR = alpha_real * x_real - alpha_imag * x_imag;
+ BASE tmpI = alpha_real * x_imag + alpha_imag * x_real;
+
+ INDEX iy = OFFSET(lenY, incY);
+ for (i = 0; i < lenY; i++) {
+ const BASE A_real = CONST_REAL(A, lda * j + i);
+ const BASE A_imag = CONST_IMAG(A, lda * j + i);
+ REAL(Y, iy) += A_real * tmpR - A_imag * tmpI;
+ IMAG(Y, iy) += A_real * tmpI + A_imag * tmpR;
+ iy += incY;
+ }
+ ix += incX;
+ }
+ } else if (order == CblasRowMajor && TransA == CblasConjTrans) {
+ /* form y := alpha*A^H*x + y */
+ INDEX ix = OFFSET(lenX, incX);
+ for (j = 0; j < lenX; j++) {
+ BASE x_real = CONST_REAL(X, ix);
+ BASE x_imag = CONST_IMAG(X, ix);
+ BASE tmpR = alpha_real * x_real - alpha_imag * x_imag;
+ BASE tmpI = alpha_real * x_imag + alpha_imag * x_real;
+
+ INDEX iy = OFFSET(lenY, incY);
+ for (i = 0; i < lenY; i++) {
+ const BASE A_real = CONST_REAL(A, lda * j + i);
+ const BASE A_imag = CONST_IMAG(A, lda * j + i);
+ REAL(Y, iy) += A_real * tmpR - (-A_imag) * tmpI;
+ IMAG(Y, iy) += A_real * tmpI + (-A_imag) * tmpR;
+ iy += incY;
+ }
+ ix += incX;
+ }
+ } else if (order == CblasColMajor && TransA == CblasConjTrans) {
+ /* form y := alpha*A^H*x + y */
+ INDEX iy = OFFSET(lenY, incY);
+ for (i = 0; i < lenY; i++) {
+ BASE dotR = 0.0;
+ BASE dotI = 0.0;
+ INDEX ix = OFFSET(lenX, incX);
+ for (j = 0; j < lenX; j++) {
+ const BASE x_real = CONST_REAL(X, ix);
+ const BASE x_imag = CONST_IMAG(X, ix);
+ const BASE A_real = CONST_REAL(A, lda * i + j);
+ const BASE A_imag = CONST_IMAG(A, lda * i + j);
+
+ dotR += A_real * x_real - (-A_imag) * x_imag;
+ dotI += A_real * x_imag + (-A_imag) * x_real;
+ ix += incX;
+ }
+
+ REAL(Y, iy) += alpha_real * dotR - alpha_imag * dotI;
+ IMAG(Y, iy) += alpha_real * dotI + alpha_imag * dotR;
+ iy += incY;
+ }
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+
+}
diff --git a/gsl-1.9/cblas/source_gemv_r.h b/gsl-1.9/cblas/source_gemv_r.h
new file mode 100644
index 0000000..6f2bbd2
--- /dev/null
+++ b/gsl-1.9/cblas/source_gemv_r.h
@@ -0,0 +1,90 @@
+/* blas/source_gemv_r.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i, j;
+ INDEX lenX, lenY;
+
+ const int Trans = (TransA != CblasConjTrans) ? TransA : CblasTrans;
+
+ if (M == 0 || N == 0)
+ return;
+
+ if (alpha == 0.0 && beta == 1.0)
+ return;
+
+ if (Trans == CblasNoTrans) {
+ lenX = N;
+ lenY = M;
+ } else {
+ lenX = M;
+ lenY = N;
+ }
+
+ /* form y := beta*y */
+ if (beta == 0.0) {
+ INDEX iy = OFFSET(lenY, incY);
+ for (i = 0; i < lenY; i++) {
+ Y[iy] = 0.0;
+ iy += incY;
+ }
+ } else if (beta != 1.0) {
+ INDEX iy = OFFSET(lenY, incY);
+ for (i = 0; i < lenY; i++) {
+ Y[iy] *= beta;
+ iy += incY;
+ }
+ }
+
+ if (alpha == 0.0)
+ return;
+
+ if ((order == CblasRowMajor && Trans == CblasNoTrans)
+ || (order == CblasColMajor && Trans == CblasTrans)) {
+ /* form y := alpha*A*x + y */
+ INDEX iy = OFFSET(lenY, incY);
+ for (i = 0; i < lenY; i++) {
+ BASE temp = 0.0;
+ INDEX ix = OFFSET(lenX, incX);
+ for (j = 0; j < lenX; j++) {
+ temp += X[ix] * A[lda * i + j];
+ ix += incX;
+ }
+ Y[iy] += alpha * temp;
+ iy += incY;
+ }
+ } else if ((order == CblasRowMajor && Trans == CblasTrans)
+ || (order == CblasColMajor && Trans == CblasNoTrans)) {
+ /* form y := alpha*A'*x + y */
+ INDEX ix = OFFSET(lenX, incX);
+ for (j = 0; j < lenX; j++) {
+ const BASE temp = alpha * X[ix];
+ if (temp != 0.0) {
+ INDEX iy = OFFSET(lenY, incY);
+ for (i = 0; i < lenY; i++) {
+ Y[iy] += temp * A[lda * j + i];
+ iy += incY;
+ }
+ }
+ ix += incX;
+ }
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+}
diff --git a/gsl-1.9/cblas/source_ger.h b/gsl-1.9/cblas/source_ger.h
new file mode 100644
index 0000000..9e314f3
--- /dev/null
+++ b/gsl-1.9/cblas/source_ger.h
@@ -0,0 +1,48 @@
+/* blas/source_ger.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i, j;
+
+ if (order == CblasRowMajor) {
+ INDEX ix = OFFSET(M, incX);
+ for (i = 0; i < M; i++) {
+ const BASE tmp = alpha * X[ix];
+ INDEX jy = OFFSET(N, incY);
+ for (j = 0; j < N; j++) {
+ A[lda * i + j] += Y[jy] * tmp;
+ jy += incY;
+ }
+ ix += incX;
+ }
+ } else if (order == CblasColMajor) {
+ INDEX jy = OFFSET(N, incY);
+ for (j = 0; j < N; j++) {
+ const BASE tmp = alpha * Y[jy];
+ INDEX ix = OFFSET(M, incX);
+ for (i = 0; i < M; i++) {
+ A[i + lda * j] += X[ix] * tmp;
+ ix += incX;
+ }
+ jy += incY;
+ }
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+}
diff --git a/gsl-1.9/cblas/source_gerc.h b/gsl-1.9/cblas/source_gerc.h
new file mode 100644
index 0000000..3ee58bc
--- /dev/null
+++ b/gsl-1.9/cblas/source_gerc.h
@@ -0,0 +1,63 @@
+/* blas/source_gerc.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i, j;
+
+ const BASE alpha_real = CONST_REAL0(alpha);
+ const BASE alpha_imag = CONST_IMAG0(alpha);
+
+ if (order == CblasRowMajor) {
+ INDEX ix = OFFSET(M, incX);
+ for (i = 0; i < M; i++) {
+ const BASE X_real = CONST_REAL(X, ix);
+ const BASE X_imag = CONST_IMAG(X, ix);
+ const BASE tmp_real = alpha_real * X_real - alpha_imag * X_imag;
+ const BASE tmp_imag = alpha_imag * X_real + alpha_real * X_imag;
+ INDEX jy = OFFSET(N, incY);
+ for (j = 0; j < N; j++) {
+ const BASE Y_real = CONST_REAL(Y, jy);
+ const BASE Y_imag = -CONST_IMAG(Y, jy);
+ REAL(A, lda * i + j) += Y_real * tmp_real - Y_imag * tmp_imag;
+ IMAG(A, lda * i + j) += Y_imag * tmp_real + Y_real * tmp_imag;
+ jy += incY;
+ }
+ ix += incX;
+ }
+ } else if (order == CblasColMajor) {
+ INDEX jy = OFFSET(N, incY);
+ for (j = 0; j < N; j++) {
+ const BASE Y_real = CONST_REAL(Y, jy);
+ const BASE Y_imag = -CONST_IMAG(Y, jy);
+ const BASE tmp_real = alpha_real * Y_real - alpha_imag * Y_imag;
+ const BASE tmp_imag = alpha_imag * Y_real + alpha_real * Y_imag;
+ INDEX ix = OFFSET(M, incX);
+ for (i = 0; i < M; i++) {
+ const BASE X_real = CONST_REAL(X, ix);
+ const BASE X_imag = CONST_IMAG(X, ix);
+ REAL(A, i + lda * j) += X_real * tmp_real - X_imag * tmp_imag;
+ IMAG(A, i + lda * j) += X_imag * tmp_real + X_real * tmp_imag;
+ ix += incX;
+ }
+ jy += incY;
+ }
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+}
diff --git a/gsl-1.9/cblas/source_geru.h b/gsl-1.9/cblas/source_geru.h
new file mode 100644
index 0000000..73d4948
--- /dev/null
+++ b/gsl-1.9/cblas/source_geru.h
@@ -0,0 +1,62 @@
+/* blas/source_geru.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i, j;
+ const BASE alpha_real = CONST_REAL0(alpha);
+ const BASE alpha_imag = CONST_IMAG0(alpha);
+
+ if (order == CblasRowMajor) {
+ INDEX ix = OFFSET(M, incX);
+ for (i = 0; i < M; i++) {
+ const BASE X_real = CONST_REAL(X, ix);
+ const BASE X_imag = CONST_IMAG(X, ix);
+ const BASE tmp_real = alpha_real * X_real - alpha_imag * X_imag;
+ const BASE tmp_imag = alpha_imag * X_real + alpha_real * X_imag;
+ INDEX jy = OFFSET(N, incY);
+ for (j = 0; j < N; j++) {
+ const BASE Y_real = CONST_REAL(Y, jy);
+ const BASE Y_imag = CONST_IMAG(Y, jy);
+ REAL(A, lda * i + j) += Y_real * tmp_real - Y_imag * tmp_imag;
+ IMAG(A, lda * i + j) += Y_imag * tmp_real + Y_real * tmp_imag;
+ jy += incY;
+ }
+ ix += incX;
+ }
+ } else if (order == CblasColMajor) {
+ INDEX jy = OFFSET(N, incY);
+ for (j = 0; j < N; j++) {
+ const BASE Y_real = CONST_REAL(Y, jy);
+ const BASE Y_imag = CONST_IMAG(Y, jy);
+ const BASE tmp_real = alpha_real * Y_real - alpha_imag * Y_imag;
+ const BASE tmp_imag = alpha_imag * Y_real + alpha_real * Y_imag;
+ INDEX ix = OFFSET(M, incX);
+ for (i = 0; i < M; i++) {
+ const BASE X_real = CONST_REAL(X, ix);
+ const BASE X_imag = CONST_IMAG(X, ix);
+ REAL(A, i + lda * j) += X_real * tmp_real - X_imag * tmp_imag;
+ IMAG(A, i + lda * j) += X_imag * tmp_real + X_real * tmp_imag;
+ ix += incX;
+ }
+ jy += incY;
+ }
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+}
diff --git a/gsl-1.9/cblas/source_hbmv.h b/gsl-1.9/cblas/source_hbmv.h
new file mode 100644
index 0000000..28ee607
--- /dev/null
+++ b/gsl-1.9/cblas/source_hbmv.h
@@ -0,0 +1,145 @@
+/* blas/source_hbmv.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i, j;
+ const int conj = (order == CblasColMajor) ? -1 : 1;
+
+ const BASE alpha_real = CONST_REAL0(alpha);
+ const BASE alpha_imag = CONST_IMAG0(alpha);
+
+ const BASE beta_real = CONST_REAL0(beta);
+ const BASE beta_imag = CONST_IMAG0(beta);
+
+ if (N == 0)
+ return;
+
+ if ((alpha_real == 0.0 && alpha_imag == 0.0)
+ && (beta_real == 1.0 && beta_imag == 0.0))
+ return;
+
+ /* form y := beta*y */
+ if (beta_real == 0.0 && beta_imag == 0.0) {
+ INDEX iy = OFFSET(N, incY);
+ for (i = 0; i < N; i++) {
+ REAL(Y, iy) = 0.0;
+ IMAG(Y, iy) = 0.0;
+ iy += incY;
+ }
+ } else if (!(beta_real == 1.0 && beta_imag == 0.0)) {
+ INDEX iy = OFFSET(N, incY);
+ for (i = 0; i < N; i++) {
+ const BASE y_real = REAL(Y, iy);
+ const BASE y_imag = IMAG(Y, iy);
+ const BASE tmpR = y_real * beta_real - y_imag * beta_imag;
+ const BASE tmpI = y_real * beta_imag + y_imag * beta_real;
+ REAL(Y, iy) = tmpR;
+ IMAG(Y, iy) = tmpI;
+ iy += incY;
+ }
+ }
+
+ if (alpha_real == 0.0 && alpha_imag == 0.0)
+ return;
+
+ /* form y := alpha*A*x + y */
+
+ if ((order == CblasRowMajor && Uplo == CblasUpper)
+ || (order == CblasColMajor && Uplo == CblasLower)) {
+ INDEX ix = OFFSET(N, incX);
+ INDEX iy = OFFSET(N, incY);
+ for (i = 0; i < N; i++) {
+ BASE x_real = CONST_REAL(X, ix);
+ BASE x_imag = CONST_IMAG(X, ix);
+ BASE temp1_real = alpha_real * x_real - alpha_imag * x_imag;
+ BASE temp1_imag = alpha_real * x_imag + alpha_imag * x_real;
+ BASE temp2_real = 0.0;
+ BASE temp2_imag = 0.0;
+ const INDEX j_min = i + 1;
+ const INDEX j_max = GSL_MIN(N, i + K + 1);
+ INDEX jx = OFFSET(N, incX) + j_min * incX;
+ INDEX jy = OFFSET(N, incY) + j_min * incY;
+ BASE Aii_real = CONST_REAL(A, lda * i + 0);
+ /* Aii_imag is zero */
+ REAL(Y, iy) += temp1_real * Aii_real;
+ IMAG(Y, iy) += temp1_imag * Aii_real;
+ for (j = j_min; j < j_max; j++) {
+ BASE Aij_real = CONST_REAL(A, lda * i + (j - i));
+ BASE Aij_imag = conj * CONST_IMAG(A, lda * i + (j - i));
+ REAL(Y, jy) += temp1_real * Aij_real - temp1_imag * (-Aij_imag);
+ IMAG(Y, jy) += temp1_real * (-Aij_imag) + temp1_imag * Aij_real;
+ x_real = CONST_REAL(X, jx);
+ x_imag = CONST_IMAG(X, jx);
+ temp2_real += x_real * Aij_real - x_imag * Aij_imag;
+ temp2_imag += x_real * Aij_imag + x_imag * Aij_real;
+ jx += incX;
+ jy += incY;
+ }
+ REAL(Y, iy) += alpha_real * temp2_real - alpha_imag * temp2_imag;
+ IMAG(Y, iy) += alpha_real * temp2_imag + alpha_imag * temp2_real;
+ ix += incX;
+ iy += incY;
+ }
+ } else if ((order == CblasRowMajor && Uplo == CblasLower)
+ || (order == CblasColMajor && Uplo == CblasUpper)) {
+ INDEX ix = OFFSET(N, incX);
+ INDEX iy = OFFSET(N, incY);
+ for (i = 0; i < N; i++) {
+ BASE x_real = CONST_REAL(X, ix);
+ BASE x_imag = CONST_IMAG(X, ix);
+ BASE temp1_real = alpha_real * x_real - alpha_imag * x_imag;
+ BASE temp1_imag = alpha_real * x_imag + alpha_imag * x_real;
+ BASE temp2_real = 0.0;
+ BASE temp2_imag = 0.0;
+ const INDEX j_min = (K > i ? 0 : i - K);
+ const INDEX j_max = i;
+ INDEX jx = OFFSET(N, incX) + j_min * incX;
+ INDEX jy = OFFSET(N, incY) + j_min * incY;
+
+ for (j = j_min; j < j_max; j++) {
+ BASE Aij_real = CONST_REAL(A, i * lda + (K - i + j));
+ BASE Aij_imag = conj * CONST_IMAG(A, i * lda + (K - i + j));
+ REAL(Y, jy) += temp1_real * Aij_real - temp1_imag * (-Aij_imag);
+ IMAG(Y, jy) += temp1_real * (-Aij_imag) + temp1_imag * Aij_real;
+ x_real = CONST_REAL(X, jx);
+ x_imag = CONST_IMAG(X, jx);
+ temp2_real += x_real * Aij_real - x_imag * Aij_imag;
+ temp2_imag += x_real * Aij_imag + x_imag * Aij_real;
+ jx += incX;
+ jy += incY;
+ }
+
+ {
+ BASE Aii_real = CONST_REAL(A, lda * i + K);
+ /* Aii_imag is zero */
+ REAL(Y, iy) += temp1_real * Aii_real;
+ IMAG(Y, iy) += temp1_imag * Aii_real;
+ }
+
+ REAL(Y, iy) += alpha_real * temp2_real - alpha_imag * temp2_imag;
+ IMAG(Y, iy) += alpha_real * temp2_imag + alpha_imag * temp2_real;
+ ix += incX;
+ iy += incY;
+ }
+
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+
+}
diff --git a/gsl-1.9/cblas/source_hemm.h b/gsl-1.9/cblas/source_hemm.h
new file mode 100644
index 0000000..c1ea5a5
--- /dev/null
+++ b/gsl-1.9/cblas/source_hemm.h
@@ -0,0 +1,204 @@
+/* blas/source_hemm.h
+ *
+ * Copyright (C) 2001 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i, j, k;
+ INDEX n1, n2;
+ int uplo, side;
+
+ const BASE alpha_real = CONST_REAL0(alpha);
+ const BASE alpha_imag = CONST_IMAG0(alpha);
+
+ const BASE beta_real = CONST_REAL0(beta);
+ const BASE beta_imag = CONST_IMAG0(beta);
+
+ if ((alpha_real == 0.0 && alpha_imag == 0.0)
+ && (beta_real == 1.0 && beta_imag == 0.0))
+ return;
+
+ if (Order == CblasRowMajor) {
+ n1 = M;
+ n2 = N;
+ uplo = Uplo;
+ side = Side;
+ } else {
+ n1 = N;
+ n2 = M;
+ uplo = (Uplo == CblasUpper) ? CblasLower : CblasUpper;
+ side = (Side == CblasLeft) ? CblasRight : CblasLeft;
+ }
+
+ /* form y := beta*y */
+ if (beta_real == 0.0 && beta_imag == 0.0) {
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ REAL(C, ldc * i + j) = 0.0;
+ IMAG(C, ldc * i + j) = 0.0;
+ }
+ }
+ } else if (!(beta_real == 1.0 && beta_imag == 0.0)) {
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ const BASE Cij_real = REAL(C, ldc * i + j);
+ const BASE Cij_imag = IMAG(C, ldc * i + j);
+ REAL(C, ldc * i + j) = beta_real * Cij_real - beta_imag * Cij_imag;
+ IMAG(C, ldc * i + j) = beta_real * Cij_imag + beta_imag * Cij_real;
+ }
+ }
+ }
+
+ if (alpha_real == 0.0 && alpha_imag == 0.0)
+ return;
+
+ if (side == CblasLeft && uplo == CblasUpper) {
+
+ /* form C := alpha*A*B + C */
+
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ const BASE Bij_real = CONST_REAL(B, ldb * i + j);
+ const BASE Bij_imag = CONST_IMAG(B, ldb * i + j);
+ const BASE temp1_real = alpha_real * Bij_real - alpha_imag * Bij_imag;
+ const BASE temp1_imag = alpha_real * Bij_imag + alpha_imag * Bij_real;
+ BASE temp2_real = 0.0;
+ BASE temp2_imag = 0.0;
+ {
+ const BASE Aii_real = CONST_REAL(A, i * lda + i);
+ /* const BASE Aii_imag = 0.0; */
+ REAL(C, i * ldc + j) += temp1_real * Aii_real;
+ IMAG(C, i * ldc + j) += temp1_imag * Aii_real;
+ }
+ for (k = i + 1; k < n1; k++) {
+ const BASE Aik_real = CONST_REAL(A, i * lda + k);
+ const BASE Aik_imag = CONST_IMAG(A, i * lda + k);
+ const BASE Bkj_real = CONST_REAL(B, ldb * k + j);
+ const BASE Bkj_imag = CONST_IMAG(B, ldb * k + j);
+ REAL(C, k * ldc + j) += Aik_real * temp1_real - (-Aik_imag) * temp1_imag;
+ IMAG(C, k * ldc + j) += Aik_real * temp1_imag + (-Aik_imag) * temp1_real;
+ temp2_real += Aik_real * Bkj_real - Aik_imag * Bkj_imag;
+ temp2_imag += Aik_real * Bkj_imag + Aik_imag * Bkj_real;
+ }
+ REAL(C, i * ldc + j) += alpha_real * temp2_real - alpha_imag * temp2_imag;
+ IMAG(C, i * ldc + j) += alpha_real * temp2_imag + alpha_imag * temp2_real;
+ }
+ }
+
+ } else if (side == CblasLeft && uplo == CblasLower) {
+
+ /* form C := alpha*A*B + C */
+
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ const BASE Bij_real = CONST_REAL(B, ldb * i + j);
+ const BASE Bij_imag = CONST_IMAG(B, ldb * i + j);
+ const BASE temp1_real = alpha_real * Bij_real - alpha_imag * Bij_imag;
+ const BASE temp1_imag = alpha_real * Bij_imag + alpha_imag * Bij_real;
+ BASE temp2_real = 0.0;
+ BASE temp2_imag = 0.0;
+ for (k = 0; k < i; k++) {
+ const BASE Aik_real = CONST_REAL(A, i * lda + k);
+ const BASE Aik_imag = CONST_IMAG(A, i * lda + k);
+ const BASE Bkj_real = CONST_REAL(B, ldb * k + j);
+ const BASE Bkj_imag = CONST_IMAG(B, ldb * k + j);
+ REAL(C, k * ldc + j) += Aik_real * temp1_real - (-Aik_imag) * temp1_imag;
+ IMAG(C, k * ldc + j) += Aik_real * temp1_imag + (-Aik_imag) * temp1_real;
+ temp2_real += Aik_real * Bkj_real - Aik_imag * Bkj_imag;
+ temp2_imag += Aik_real * Bkj_imag + Aik_imag * Bkj_real;
+ }
+ {
+ const BASE Aii_real = CONST_REAL(A, i * lda + i);
+ /* const BASE Aii_imag = 0.0; */
+ REAL(C, i * ldc + j) += temp1_real * Aii_real;
+ IMAG(C, i * ldc + j) += temp1_imag * Aii_real;
+ }
+ REAL(C, i * ldc + j) += alpha_real * temp2_real - alpha_imag * temp2_imag;
+ IMAG(C, i * ldc + j) += alpha_real * temp2_imag + alpha_imag * temp2_real;
+ }
+ }
+
+ } else if (side == CblasRight && uplo == CblasUpper) {
+
+ /* form C := alpha*B*A + C */
+
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ const BASE Bij_real = CONST_REAL(B, ldb * i + j);
+ const BASE Bij_imag = CONST_IMAG(B, ldb * i + j);
+ const BASE temp1_real = alpha_real * Bij_real - alpha_imag * Bij_imag;
+ const BASE temp1_imag = alpha_real * Bij_imag + alpha_imag * Bij_real;
+ BASE temp2_real = 0.0;
+ BASE temp2_imag = 0.0;
+ {
+ const BASE Ajj_real = CONST_REAL(A, j * lda + j);
+ /* const BASE Ajj_imag = 0.0; */
+ REAL(C, i * ldc + j) += temp1_real * Ajj_real;
+ IMAG(C, i * ldc + j) += temp1_imag * Ajj_real;
+ }
+ for (k = j + 1; k < n2; k++) {
+ const BASE Ajk_real = CONST_REAL(A, j * lda + k);
+ const BASE Ajk_imag = CONST_IMAG(A, j * lda + k);
+ const BASE Bik_real = CONST_REAL(B, ldb * i + k);
+ const BASE Bik_imag = CONST_IMAG(B, ldb * i + k);
+ REAL(C, i * ldc + k) += temp1_real * Ajk_real - temp1_imag * Ajk_imag;
+ IMAG(C, i * ldc + k) += temp1_real * Ajk_imag + temp1_imag * Ajk_real;
+ temp2_real += Bik_real * Ajk_real - Bik_imag * (-Ajk_imag);
+ temp2_imag += Bik_real * (-Ajk_imag) + Bik_imag * Ajk_real;
+ }
+ REAL(C, i * ldc + j) += alpha_real * temp2_real - alpha_imag * temp2_imag;
+ IMAG(C, i * ldc + j) += alpha_real * temp2_imag + alpha_imag * temp2_real;
+ }
+ }
+
+ } else if (side == CblasRight && uplo == CblasLower) {
+
+ /* form C := alpha*B*A + C */
+
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ const BASE Bij_real = CONST_REAL(B, ldb * i + j);
+ const BASE Bij_imag = CONST_IMAG(B, ldb * i + j);
+ const BASE temp1_real = alpha_real * Bij_real - alpha_imag * Bij_imag;
+ const BASE temp1_imag = alpha_real * Bij_imag + alpha_imag * Bij_real;
+ BASE temp2_real = 0.0;
+ BASE temp2_imag = 0.0;
+ for (k = 0; k < j; k++) {
+ const BASE Ajk_real = CONST_REAL(A, j * lda + k);
+ const BASE Ajk_imag = CONST_IMAG(A, j * lda + k);
+ const BASE Bik_real = CONST_REAL(B, ldb * i + k);
+ const BASE Bik_imag = CONST_IMAG(B, ldb * i + k);
+ REAL(C, i * ldc + k) += temp1_real * Ajk_real - temp1_imag * Ajk_imag;
+ IMAG(C, i * ldc + k) += temp1_real * Ajk_imag + temp1_imag * Ajk_real;
+ temp2_real += Bik_real * Ajk_real - Bik_imag * (-Ajk_imag);
+ temp2_imag += Bik_real * (-Ajk_imag) + Bik_imag * Ajk_real;
+ }
+ {
+ const BASE Ajj_real = CONST_REAL(A, j * lda + j);
+ /* const BASE Ajj_imag = 0.0; */
+ REAL(C, i * ldc + j) += temp1_real * Ajj_real;
+ IMAG(C, i * ldc + j) += temp1_imag * Ajj_real;
+ }
+ REAL(C, i * ldc + j) += alpha_real * temp2_real - alpha_imag * temp2_imag;
+ IMAG(C, i * ldc + j) += alpha_real * temp2_imag + alpha_imag * temp2_real;
+ }
+ }
+
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+}
diff --git a/gsl-1.9/cblas/source_hemv.h b/gsl-1.9/cblas/source_hemv.h
new file mode 100644
index 0000000..5ba35e6
--- /dev/null
+++ b/gsl-1.9/cblas/source_hemv.h
@@ -0,0 +1,136 @@
+/* blas/source_hemv.h
+ *
+ * Copyright (C) 2001 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ const int conj = (order == CblasColMajor) ? -1 : 1;
+ INDEX i, j;
+
+ const BASE alpha_real = CONST_REAL0(alpha);
+ const BASE alpha_imag = CONST_IMAG0(alpha);
+
+ const BASE beta_real = CONST_REAL0(beta);
+ const BASE beta_imag = CONST_IMAG0(beta);
+
+ if ((alpha_real == 0.0 && alpha_imag == 0.0)
+ && (beta_real == 1.0 && beta_imag == 0.0))
+ return;
+
+ /* form y := beta*y */
+ if (beta_real == 0.0 && beta_imag == 0.0) {
+ INDEX iy = OFFSET(N, incY);
+ for (i = 0; i < N; i++) {
+ REAL(Y, iy) = 0.0;
+ IMAG(Y, iy) = 0.0;
+ iy += incY;
+ }
+ } else if (!(beta_real == 1.0 && beta_imag == 0.0)) {
+ INDEX iy = OFFSET(N, incY);
+ for (i = 0; i < N; i++) {
+ const BASE y_real = REAL(Y, iy);
+ const BASE y_imag = IMAG(Y, iy);
+ const BASE tmpR = y_real * beta_real - y_imag * beta_imag;
+ const BASE tmpI = y_real * beta_imag + y_imag * beta_real;
+ REAL(Y, iy) = tmpR;
+ IMAG(Y, iy) = tmpI;
+ iy += incY;
+ }
+ }
+
+ if (alpha_real == 0.0 && alpha_imag == 0.0)
+ return;
+
+ /* form y := alpha*A*x + y */
+
+ if ((order == CblasRowMajor && Uplo == CblasUpper)
+ || (order == CblasColMajor && Uplo == CblasLower)) {
+ INDEX ix = OFFSET(N, incX);
+ INDEX iy = OFFSET(N, incY);
+ for (i = 0; i < N; i++) {
+ BASE x_real = CONST_REAL(X, ix);
+ BASE x_imag = CONST_IMAG(X, ix);
+ BASE temp1_real = alpha_real * x_real - alpha_imag * x_imag;
+ BASE temp1_imag = alpha_real * x_imag + alpha_imag * x_real;
+ BASE temp2_real = 0.0;
+ BASE temp2_imag = 0.0;
+ const INDEX j_min = i + 1;
+ const INDEX j_max = N;
+ INDEX jx = OFFSET(N, incX) + j_min * incX;
+ INDEX jy = OFFSET(N, incY) + j_min * incY;
+ BASE Aii_real = CONST_REAL(A, lda * i + i);
+ /* Aii_imag is zero */
+ REAL(Y, iy) += temp1_real * Aii_real;
+ IMAG(Y, iy) += temp1_imag * Aii_real;
+ for (j = j_min; j < j_max; j++) {
+ BASE Aij_real = CONST_REAL(A, lda * i + j);
+ BASE Aij_imag = conj * CONST_IMAG(A, lda * i + j);
+ REAL(Y, jy) += temp1_real * Aij_real - temp1_imag * (-Aij_imag);
+ IMAG(Y, jy) += temp1_real * (-Aij_imag) + temp1_imag * Aij_real;
+ x_real = CONST_REAL(X, jx);
+ x_imag = CONST_IMAG(X, jx);
+ temp2_real += x_real * Aij_real - x_imag * Aij_imag;
+ temp2_imag += x_real * Aij_imag + x_imag * Aij_real;
+ jx += incX;
+ jy += incY;
+ }
+ REAL(Y, iy) += alpha_real * temp2_real - alpha_imag * temp2_imag;
+ IMAG(Y, iy) += alpha_real * temp2_imag + alpha_imag * temp2_real;
+ ix += incX;
+ iy += incY;
+ }
+ } else if ((order == CblasRowMajor && Uplo == CblasLower)
+ || (order == CblasColMajor && Uplo == CblasUpper)) {
+ INDEX ix = OFFSET(N, incX) + (N - 1) * incX;
+ INDEX iy = OFFSET(N, incY) + (N - 1) * incY;
+ for (i = N; i > 0 && i--;) {
+ BASE x_real = CONST_REAL(X, ix);
+ BASE x_imag = CONST_IMAG(X, ix);
+ BASE temp1_real = alpha_real * x_real - alpha_imag * x_imag;
+ BASE temp1_imag = alpha_real * x_imag + alpha_imag * x_real;
+ BASE temp2_real = 0.0;
+ BASE temp2_imag = 0.0;
+ const INDEX j_min = 0;
+ const INDEX j_max = i;
+ INDEX jx = OFFSET(N, incX) + j_min * incX;
+ INDEX jy = OFFSET(N, incY) + j_min * incY;
+ BASE Aii_real = CONST_REAL(A, lda * i + i);
+ /* Aii_imag is zero */
+ REAL(Y, iy) += temp1_real * Aii_real;
+ IMAG(Y, iy) += temp1_imag * Aii_real;
+
+ for (j = j_min; j < j_max; j++) {
+ BASE Aij_real = CONST_REAL(A, lda * i + j);
+ BASE Aij_imag = conj * CONST_IMAG(A, lda * i + j);
+ REAL(Y, jy) += temp1_real * Aij_real - temp1_imag * (-Aij_imag);
+ IMAG(Y, jy) += temp1_real * (-Aij_imag) + temp1_imag * Aij_real;
+ x_real = CONST_REAL(X, jx);
+ x_imag = CONST_IMAG(X, jx);
+ temp2_real += x_real * Aij_real - x_imag * Aij_imag;
+ temp2_imag += x_real * Aij_imag + x_imag * Aij_real;
+ jx += incX;
+ jy += incY;
+ }
+ REAL(Y, iy) += alpha_real * temp2_real - alpha_imag * temp2_imag;
+ IMAG(Y, iy) += alpha_real * temp2_imag + alpha_imag * temp2_real;
+ ix -= incX;
+ iy -= incY;
+ }
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+}
diff --git a/gsl-1.9/cblas/source_her.h b/gsl-1.9/cblas/source_her.h
new file mode 100644
index 0000000..6fa08d8
--- /dev/null
+++ b/gsl-1.9/cblas/source_her.h
@@ -0,0 +1,80 @@
+/* blas/source_her.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ const int conj = (order == CblasColMajor) ? -1 : 1;
+ INDEX i, j;
+
+ if (alpha == 0.0)
+ return;
+
+ if ((order == CblasRowMajor && Uplo == CblasUpper)
+ || (order == CblasColMajor && Uplo == CblasLower)) {
+ INDEX ix = OFFSET(N, incX);
+ for (i = 0; i < N; i++) {
+ const BASE tmp_real = alpha * CONST_REAL(X, ix);
+ const BASE tmp_imag = alpha * conj * CONST_IMAG(X, ix);
+ INDEX jx = ix;
+
+ {
+ const BASE X_real = CONST_REAL(X, jx);
+ const BASE X_imag = -conj * CONST_IMAG(X, jx);
+ REAL(A, lda * i + i) += X_real * tmp_real - X_imag * tmp_imag;
+ IMAG(A, lda * i + i) = 0;
+ jx += incX;
+ }
+
+ for (j = i + 1; j < N; j++) {
+ const BASE X_real = CONST_REAL(X, jx);
+ const BASE X_imag = -conj * CONST_IMAG(X, jx);
+ REAL(A, lda * i + j) += X_real * tmp_real - X_imag * tmp_imag;
+ IMAG(A, lda * i + j) += X_imag * tmp_real + X_real * tmp_imag;
+ jx += incX;
+ }
+ ix += incX;
+ }
+ } else if ((order == CblasRowMajor && Uplo == CblasLower)
+ || (order == CblasColMajor && Uplo == CblasUpper)) {
+ INDEX ix = OFFSET(N, incX);
+ for (i = 0; i < N; i++) {
+ const BASE tmp_real = alpha * CONST_REAL(X, ix);
+ const BASE tmp_imag = alpha * conj * CONST_IMAG(X, ix);
+ INDEX jx = OFFSET(N, incX);
+ for (j = 0; j < i; j++) {
+ const BASE X_real = CONST_REAL(X, jx);
+ const BASE X_imag = -conj * CONST_IMAG(X, jx);
+ REAL(A, lda * i + j) += X_real * tmp_real - X_imag * tmp_imag;
+ IMAG(A, lda * i + j) += X_imag * tmp_real + X_real * tmp_imag;
+ jx += incX;
+ }
+
+ {
+ const BASE X_real = CONST_REAL(X, jx);
+ const BASE X_imag = -conj * CONST_IMAG(X, jx);
+ REAL(A, lda * i + i) += X_real * tmp_real - X_imag * tmp_imag;
+ IMAG(A, lda * i + i) = 0;
+ jx += incX;
+ }
+
+ ix += incX;
+ }
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+}
diff --git a/gsl-1.9/cblas/source_her2.h b/gsl-1.9/cblas/source_her2.h
new file mode 100644
index 0000000..78793f3
--- /dev/null
+++ b/gsl-1.9/cblas/source_her2.h
@@ -0,0 +1,115 @@
+/* blas/source_her2.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ const int conj = (order == CblasColMajor) ? -1 : 1;
+ INDEX i, j;
+
+ const BASE alpha_real = CONST_REAL0(alpha);
+ const BASE alpha_imag = CONST_IMAG0(alpha);
+
+ if (alpha_real == 0.0 && alpha_imag == 0.0)
+ return;
+
+ if ((order == CblasRowMajor && Uplo == CblasUpper)
+ || (order == CblasColMajor && Uplo == CblasLower)) {
+ INDEX ix = OFFSET(N, incX);
+ INDEX iy = OFFSET(N, incY);
+ for (i = 0; i < N; i++) {
+ const BASE Xi_real = CONST_REAL(X, ix);
+ const BASE Xi_imag = CONST_IMAG(X, ix);
+ /* tmp1 = alpha Xi */
+ const BASE tmp1_real = alpha_real * Xi_real - alpha_imag * Xi_imag;
+ const BASE tmp1_imag = alpha_imag * Xi_real + alpha_real * Xi_imag;
+
+ const BASE Yi_real = CONST_REAL(Y, iy);
+ const BASE Yi_imag = CONST_IMAG(Y, iy);
+ /* tmp2 = conj(alpha) Yi */
+ const BASE tmp2_real = alpha_real * Yi_real + alpha_imag * Yi_imag;
+ const BASE tmp2_imag = -alpha_imag * Yi_real + alpha_real * Yi_imag;
+
+ INDEX jx = ix + incX;
+ INDEX jy = iy + incY;
+
+ /* Aij = alpha*Xi*conj(Yj) + conj(alpha)*Yi*conj(Xj) */
+
+ REAL(A, lda * i + i) += 2 * (tmp1_real * Yi_real + tmp1_imag * Yi_imag);
+ IMAG(A, lda * i + i) = 0;
+
+ for (j = i + 1; j < N; j++) {
+ const BASE Xj_real = CONST_REAL(X, jx);
+ const BASE Xj_imag = CONST_IMAG(X, jx);
+ const BASE Yj_real = CONST_REAL(Y, jy);
+ const BASE Yj_imag = CONST_IMAG(Y, jy);
+ REAL(A, lda * i + j) += ((tmp1_real * Yj_real + tmp1_imag * Yj_imag)
+ + (tmp2_real * Xj_real + tmp2_imag * Xj_imag));
+ IMAG(A, lda * i + j) +=
+ conj * ((tmp1_imag * Yj_real - tmp1_real * Yj_imag) +
+ (tmp2_imag * Xj_real - tmp2_real * Xj_imag));
+ jx += incX;
+ jy += incY;
+ }
+ ix += incX;
+ iy += incY;
+ }
+ } else if ((order == CblasRowMajor && Uplo == CblasLower)
+ || (order == CblasColMajor && Uplo == CblasUpper)) {
+
+ INDEX ix = OFFSET(N, incX);
+ INDEX iy = OFFSET(N, incY);
+ for (i = 0; i < N; i++) {
+ const BASE Xi_real = CONST_REAL(X, ix);
+ const BASE Xi_imag = CONST_IMAG(X, ix);
+ const BASE tmp1_real = alpha_real * Xi_real - alpha_imag * Xi_imag;
+ const BASE tmp1_imag = alpha_imag * Xi_real + alpha_real * Xi_imag;
+
+ const BASE Yi_real = CONST_REAL(Y, iy);
+ const BASE Yi_imag = CONST_IMAG(Y, iy);
+ const BASE tmp2_real = alpha_real * Yi_real + alpha_imag * Yi_imag;
+ const BASE tmp2_imag = -alpha_imag * Yi_real + alpha_real * Yi_imag;
+
+ INDEX jx = OFFSET(N, incX);
+ INDEX jy = OFFSET(N, incY);
+
+ /* Aij = alpha*Xi*conj(Yj) + conj(alpha)*Yi*conj(Xj) */
+
+ for (j = 0; j < i; j++) {
+ const BASE Xj_real = CONST_REAL(X, jx);
+ const BASE Xj_imag = CONST_IMAG(X, jx);
+ const BASE Yj_real = CONST_REAL(Y, jy);
+ const BASE Yj_imag = CONST_IMAG(Y, jy);
+ REAL(A, lda * i + j) += ((tmp1_real * Yj_real + tmp1_imag * Yj_imag)
+ + (tmp2_real * Xj_real + tmp2_imag * Xj_imag));
+ IMAG(A, lda * i + j) +=
+ conj * ((tmp1_imag * Yj_real - tmp1_real * Yj_imag) +
+ (tmp2_imag * Xj_real - tmp2_real * Xj_imag));
+ jx += incX;
+ jy += incY;
+ }
+
+ REAL(A, lda * i + i) += 2 * (tmp1_real * Yi_real + tmp1_imag * Yi_imag);
+ IMAG(A, lda * i + i) = 0;
+
+ ix += incX;
+ iy += incY;
+ }
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+}
diff --git a/gsl-1.9/cblas/source_her2k.h b/gsl-1.9/cblas/source_her2k.h
new file mode 100644
index 0000000..5ec7ef1
--- /dev/null
+++ b/gsl-1.9/cblas/source_her2k.h
@@ -0,0 +1,269 @@
+/* blas/source_her2k_c.h
+ *
+ * Copyright (C) 2001 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i, j, k;
+ int uplo, trans;
+
+ const BASE alpha_real = CONST_REAL0(alpha);
+ BASE alpha_imag = CONST_IMAG0(alpha);
+
+ if (beta == 1.0 && ((alpha_real == 0.0 && alpha_imag == 0.0) || K == 0))
+ return;
+
+ if (Order == CblasRowMajor) {
+ uplo = Uplo;
+ trans = Trans;
+ } else {
+ uplo = (Uplo == CblasUpper) ? CblasLower : CblasUpper;
+ trans = (Trans == CblasNoTrans) ? CblasConjTrans : CblasNoTrans;
+ alpha_imag *= -1; /* conjugate alpha */
+ }
+
+ /* form C := beta*C */
+
+ if (beta == 0.0) {
+ if (uplo == CblasUpper) {
+ for (i = 0; i < N; i++) {
+ for (j = i; j < N; j++) {
+ REAL(C, ldc * i + j) = 0.0;
+ IMAG(C, ldc * i + j) = 0.0;
+ }
+ }
+ } else {
+ for (i = 0; i < N; i++) {
+ for (j = 0; j <= i; j++) {
+ REAL(C, ldc * i + j) = 0.0;
+ IMAG(C, ldc * i + j) = 0.0;
+ }
+ }
+ }
+ } else if (beta != 1.0) {
+ if (uplo == CblasUpper) {
+ for (i = 0; i < N; i++) {
+ REAL(C, ldc * i + i) *= beta;
+ IMAG(C, ldc * i + i) = 0.0;
+ for (j = i + 1; j < N; j++) {
+ REAL(C, ldc * i + j) *= beta;
+ IMAG(C, ldc * i + j) *= beta;
+ }
+ }
+ } else {
+ for (i = 0; i < N; i++) {
+ for (j = 0; j < i; j++) {
+ REAL(C, ldc * i + j) *= beta;
+ IMAG(C, ldc * i + j) *= beta;
+ }
+ REAL(C, ldc * i + i) *= beta;
+ IMAG(C, ldc * i + i) = 0.0;
+ }
+ }
+ } else {
+ for (i = 0; i < N; i++) {
+ IMAG(C, ldc * i + i) = 0.0;
+ }
+ }
+
+ if (alpha_real == 0.0 && alpha_imag == 0.0)
+ return;
+
+ if (uplo == CblasUpper && trans == CblasNoTrans) {
+
+ for (i = 0; i < N; i++) {
+
+ /* Cii += alpha Aik conj(Bik) + conj(alpha) Bik conj(Aik) */
+ {
+ BASE temp_real = 0.0;
+ /* BASE temp_imag = 0.0; */
+ for (k = 0; k < K; k++) {
+ const BASE Aik_real = CONST_REAL(A, i * lda + k);
+ const BASE Aik_imag = CONST_IMAG(A, i * lda + k);
+ /* temp1 = alpha * Aik */
+ const BASE temp1_real = alpha_real * Aik_real - alpha_imag * Aik_imag;
+ const BASE temp1_imag = alpha_real * Aik_imag + alpha_imag * Aik_real;
+ const BASE Bik_real = CONST_REAL(B, i * ldb + k);
+ const BASE Bik_imag = CONST_IMAG(B, i * ldb + k);
+ temp_real += temp1_real * Bik_real + temp1_imag * Bik_imag;
+ }
+
+ REAL(C, i * ldc + i) += 2 * temp_real;
+ IMAG(C, i * ldc + i) = 0.0;
+ }
+
+ /* Cij += alpha Aik conj(Bjk) + conj(alpha) Bik conj(Ajk) */
+ for (j = i + 1; j < N; j++) {
+ BASE temp_real = 0.0;
+ BASE temp_imag = 0.0;
+ for (k = 0; k < K; k++) {
+ const BASE Aik_real = CONST_REAL(A, i * lda + k);
+ const BASE Aik_imag = CONST_IMAG(A, i * lda + k);
+ /* temp1 = alpha * Aik */
+ const BASE temp1_real = alpha_real * Aik_real - alpha_imag * Aik_imag;
+ const BASE temp1_imag = alpha_real * Aik_imag + alpha_imag * Aik_real;
+ const BASE Bik_real = CONST_REAL(B, i * ldb + k);
+ const BASE Bik_imag = CONST_IMAG(B, i * ldb + k);
+
+ const BASE Ajk_real = CONST_REAL(A, j * lda + k);
+ const BASE Ajk_imag = CONST_IMAG(A, j * lda + k);
+ /* temp2 = alpha * Ajk */
+ const BASE temp2_real = alpha_real * Ajk_real - alpha_imag * Ajk_imag;
+ const BASE temp2_imag = alpha_real * Ajk_imag + alpha_imag * Ajk_real;
+ const BASE Bjk_real = CONST_REAL(B, j * ldb + k);
+ const BASE Bjk_imag = CONST_IMAG(B, j * ldb + k);
+
+ /* Cij += alpha * Aik * conj(Bjk) + conj(alpha) * Bik * conj(Ajk) */
+ temp_real += ((temp1_real * Bjk_real + temp1_imag * Bjk_imag)
+ + (Bik_real * temp2_real + Bik_imag * temp2_imag));
+ temp_imag += ((temp1_real * (-Bjk_imag) + temp1_imag * Bjk_real)
+ + (Bik_real * (-temp2_imag) + Bik_imag * temp2_real));
+ }
+ REAL(C, i * ldc + j) += temp_real;
+ IMAG(C, i * ldc + j) += temp_imag;
+ }
+ }
+
+ } else if (uplo == CblasUpper && trans == CblasConjTrans) {
+
+ for (k = 0; k < K; k++) {
+ for (i = 0; i < N; i++) {
+ BASE Aki_real = CONST_REAL(A, k * lda + i);
+ BASE Aki_imag = CONST_IMAG(A, k * lda + i);
+ BASE Bki_real = CONST_REAL(B, k * ldb + i);
+ BASE Bki_imag = CONST_IMAG(B, k * ldb + i);
+ /* temp1 = alpha * conj(Aki) */
+ BASE temp1_real = alpha_real * Aki_real - alpha_imag * (-Aki_imag);
+ BASE temp1_imag = alpha_real * (-Aki_imag) + alpha_imag * Aki_real;
+ /* temp2 = conj(alpha) * conj(Bki) */
+ BASE temp2_real = alpha_real * Bki_real - alpha_imag * Bki_imag;
+ BASE temp2_imag = -(alpha_real * Bki_imag + alpha_imag * Bki_real);
+
+ /* Cii += alpha * conj(Aki) * Bki + conj(alpha) * conj(Bki) * Aki */
+ {
+ REAL(C, i * lda + i) += 2 * (temp1_real * Bki_real - temp1_imag * Bki_imag);
+ IMAG(C, i * lda + i) = 0.0;
+ }
+
+ for (j = i + 1; j < N; j++) {
+ BASE Akj_real = CONST_REAL(A, k * lda + j);
+ BASE Akj_imag = CONST_IMAG(A, k * lda + j);
+ BASE Bkj_real = CONST_REAL(B, k * ldb + j);
+ BASE Bkj_imag = CONST_IMAG(B, k * ldb + j);
+ /* Cij += alpha * conj(Aki) * Bkj + conj(alpha) * conj(Bki) * Akj */
+ REAL(C, i * lda + j) += (temp1_real * Bkj_real - temp1_imag * Bkj_imag)
+ + (temp2_real * Akj_real - temp2_imag * Akj_imag);
+ IMAG(C, i * lda + j) += (temp1_real * Bkj_imag + temp1_imag * Bkj_real)
+ + (temp2_real * Akj_imag + temp2_imag * Akj_real);
+ }
+ }
+ }
+
+ } else if (uplo == CblasLower && trans == CblasNoTrans) {
+
+ for (i = 0; i < N; i++) {
+
+ /* Cij += alpha Aik conj(Bjk) + conj(alpha) Bik conj(Ajk) */
+
+ for (j = 0; j < i; j++) {
+ BASE temp_real = 0.0;
+ BASE temp_imag = 0.0;
+ for (k = 0; k < K; k++) {
+ const BASE Aik_real = CONST_REAL(A, i * lda + k);
+ const BASE Aik_imag = CONST_IMAG(A, i * lda + k);
+ /* temp1 = alpha * Aik */
+ const BASE temp1_real = alpha_real * Aik_real - alpha_imag * Aik_imag;
+ const BASE temp1_imag = alpha_real * Aik_imag + alpha_imag * Aik_real;
+ const BASE Bik_real = CONST_REAL(B, i * ldb + k);
+ const BASE Bik_imag = CONST_IMAG(B, i * ldb + k);
+
+ const BASE Ajk_real = CONST_REAL(A, j * lda + k);
+ const BASE Ajk_imag = CONST_IMAG(A, j * lda + k);
+ /* temp2 = alpha * Ajk */
+ const BASE temp2_real = alpha_real * Ajk_real - alpha_imag * Ajk_imag;
+ const BASE temp2_imag = alpha_real * Ajk_imag + alpha_imag * Ajk_real;
+ const BASE Bjk_real = CONST_REAL(B, j * ldb + k);
+ const BASE Bjk_imag = CONST_IMAG(B, j * ldb + k);
+
+ /* Cij += alpha * Aik * conj(Bjk) + conj(alpha) * Bik * conj(Ajk) */
+ temp_real += ((temp1_real * Bjk_real + temp1_imag * Bjk_imag)
+ + (Bik_real * temp2_real + Bik_imag * temp2_imag));
+ temp_imag += ((temp1_real * (-Bjk_imag) + temp1_imag * Bjk_real)
+ + (Bik_real * (-temp2_imag) + Bik_imag * temp2_real));
+ }
+ REAL(C, i * ldc + j) += temp_real;
+ IMAG(C, i * ldc + j) += temp_imag;
+ }
+
+ /* Cii += alpha Aik conj(Bik) + conj(alpha) Bik conj(Aik) */
+ {
+ BASE temp_real = 0.0;
+ /* BASE temp_imag = 0.0; */
+ for (k = 0; k < K; k++) {
+ const BASE Aik_real = CONST_REAL(A, i * lda + k);
+ const BASE Aik_imag = CONST_IMAG(A, i * lda + k);
+ /* temp1 = alpha * Aik */
+ const BASE temp1_real = alpha_real * Aik_real - alpha_imag * Aik_imag;
+ const BASE temp1_imag = alpha_real * Aik_imag + alpha_imag * Aik_real;
+ const BASE Bik_real = CONST_REAL(B, i * ldb + k);
+ const BASE Bik_imag = CONST_IMAG(B, i * ldb + k);
+ temp_real += temp1_real * Bik_real + temp1_imag * Bik_imag;
+ }
+
+ REAL(C, i * ldc + i) += 2 * temp_real;
+ IMAG(C, i * ldc + i) = 0.0;
+ }
+ }
+
+ } else if (uplo == CblasLower && trans == CblasConjTrans) {
+
+ for (k = 0; k < K; k++) {
+ for (i = 0; i < N; i++) {
+ BASE Aki_real = CONST_REAL(A, k * lda + i);
+ BASE Aki_imag = CONST_IMAG(A, k * lda + i);
+ BASE Bki_real = CONST_REAL(B, k * ldb + i);
+ BASE Bki_imag = CONST_IMAG(B, k * ldb + i);
+ /* temp1 = alpha * conj(Aki) */
+ BASE temp1_real = alpha_real * Aki_real - alpha_imag * (-Aki_imag);
+ BASE temp1_imag = alpha_real * (-Aki_imag) + alpha_imag * Aki_real;
+ /* temp2 = conj(alpha) * conj(Bki) */
+ BASE temp2_real = alpha_real * Bki_real - alpha_imag * Bki_imag;
+ BASE temp2_imag = -(alpha_real * Bki_imag + alpha_imag * Bki_real);
+
+ for (j = 0; j < i; j++) {
+ BASE Akj_real = CONST_REAL(A, k * lda + j);
+ BASE Akj_imag = CONST_IMAG(A, k * lda + j);
+ BASE Bkj_real = CONST_REAL(B, k * ldb + j);
+ BASE Bkj_imag = CONST_IMAG(B, k * ldb + j);
+ /* Cij += alpha * conj(Aki) * Bkj + conj(alpha) * conj(Bki) * Akj */
+ REAL(C, i * lda + j) += (temp1_real * Bkj_real - temp1_imag * Bkj_imag)
+ + (temp2_real * Akj_real - temp2_imag * Akj_imag);
+ IMAG(C, i * lda + j) += (temp1_real * Bkj_imag + temp1_imag * Bkj_real)
+ + (temp2_real * Akj_imag + temp2_imag * Akj_real);
+ }
+
+ /* Cii += alpha * conj(Aki) * Bki + conj(alpha) * conj(Bki) * Aki */
+ {
+ REAL(C, i * lda + i) += 2 * (temp1_real * Bki_real - temp1_imag * Bki_imag);
+ IMAG(C, i * lda + i) = 0.0;
+ }
+ }
+ }
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+}
diff --git a/gsl-1.9/cblas/source_herk.h b/gsl-1.9/cblas/source_herk.h
new file mode 100644
index 0000000..cfa67e4
--- /dev/null
+++ b/gsl-1.9/cblas/source_herk.h
@@ -0,0 +1,161 @@
+/* blas/source_herk.h
+ *
+ * Copyright (C) 2001 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i, j, k;
+ int uplo, trans;
+
+ if (beta == 1.0 && (alpha == 0.0 || K == 0))
+ return;
+
+ if (Order == CblasRowMajor) {
+ uplo = Uplo;
+ trans = Trans;
+ } else {
+ uplo = (Uplo == CblasUpper) ? CblasLower : CblasUpper;
+ trans = (Trans == CblasNoTrans) ? CblasConjTrans : CblasNoTrans;
+ }
+
+ /* form y := beta*y */
+ if (beta == 0.0) {
+ if (uplo == CblasUpper) {
+ for (i = 0; i < N; i++) {
+ for (j = i; j < N; j++) {
+ REAL(C, ldc * i + j) = 0.0;
+ IMAG(C, ldc * i + j) = 0.0;
+ }
+ }
+ } else {
+ for (i = 0; i < N; i++) {
+ for (j = 0; j <= i; j++) {
+ REAL(C, ldc * i + j) = 0.0;
+ IMAG(C, ldc * i + j) = 0.0;
+ }
+ }
+ }
+ } else if (beta != 1.0) {
+ if (uplo == CblasUpper) {
+ for (i = 0; i < N; i++) {
+ REAL(C, ldc * i + i) *= beta;
+ IMAG(C, ldc * i + i) = 0;
+ for (j = i + 1; j < N; j++) {
+ REAL(C, ldc * i + j) *= beta;
+ IMAG(C, ldc * i + j) *= beta;
+ }
+ }
+ } else {
+ for (i = 0; i < N; i++) {
+ for (j = 0; j < i; j++) {
+ REAL(C, ldc * i + j) *= beta;
+ IMAG(C, ldc * i + j) *= beta;
+ }
+ REAL(C, ldc * i + i) *= beta;
+ IMAG(C, ldc * i + i) = 0;
+ }
+ }
+ } else {
+ /* set imaginary part of Aii to zero */
+ for (i = 0; i < N; i++) {
+ IMAG(C, ldc * i + i) = 0.0;
+ }
+ }
+
+ if (alpha == 0.0)
+ return;
+
+ if (uplo == CblasUpper && trans == CblasNoTrans) {
+
+ for (i = 0; i < N; i++) {
+ for (j = i; j < N; j++) {
+ BASE temp_real = 0.0;
+ BASE temp_imag = 0.0;
+ for (k = 0; k < K; k++) {
+ const BASE Aik_real = CONST_REAL(A, i * lda + k);
+ const BASE Aik_imag = CONST_IMAG(A, i * lda + k);
+ const BASE Ajk_real = CONST_REAL(A, j * lda + k);
+ const BASE Ajk_imag = -CONST_IMAG(A, j * lda + k);
+ temp_real += Aik_real * Ajk_real - Aik_imag * Ajk_imag;
+ temp_imag += Aik_real * Ajk_imag + Aik_imag * Ajk_real;
+ }
+ REAL(C, i * ldc + j) += alpha * temp_real;
+ IMAG(C, i * ldc + j) += alpha * temp_imag;
+ }
+ }
+
+ } else if (uplo == CblasUpper && trans == CblasConjTrans) {
+
+ for (i = 0; i < N; i++) {
+ for (j = i; j < N; j++) {
+ BASE temp_real = 0.0;
+ BASE temp_imag = 0.0;
+ for (k = 0; k < K; k++) {
+ const BASE Aki_real = CONST_REAL(A, k * lda + i);
+ const BASE Aki_imag = -CONST_IMAG(A, k * lda + i);
+ const BASE Akj_real = CONST_REAL(A, k * lda + j);
+ const BASE Akj_imag = CONST_IMAG(A, k * lda + j);
+ temp_real += Aki_real * Akj_real - Aki_imag * Akj_imag;
+ temp_imag += Aki_real * Akj_imag + Aki_imag * Akj_real;
+ }
+ REAL(C, i * ldc + j) += alpha * temp_real;
+ IMAG(C, i * ldc + j) += alpha * temp_imag;
+ }
+ }
+
+ } else if (uplo == CblasLower && trans == CblasNoTrans) {
+
+ for (i = 0; i < N; i++) {
+ for (j = 0; j <= i; j++) {
+ BASE temp_real = 0.0;
+ BASE temp_imag = 0.0;
+ for (k = 0; k < K; k++) {
+ const BASE Aik_real = CONST_REAL(A, i * lda + k);
+ const BASE Aik_imag = CONST_IMAG(A, i * lda + k);
+ const BASE Ajk_real = CONST_REAL(A, j * lda + k);
+ const BASE Ajk_imag = -CONST_IMAG(A, j * lda + k);
+ temp_real += Aik_real * Ajk_real - Aik_imag * Ajk_imag;
+ temp_imag += Aik_real * Ajk_imag + Aik_imag * Ajk_real;
+ }
+ REAL(C, i * ldc + j) += alpha * temp_real;
+ IMAG(C, i * ldc + j) += alpha * temp_imag;
+ }
+ }
+
+ } else if (uplo == CblasLower && trans == CblasConjTrans) {
+
+ for (i = 0; i < N; i++) {
+ for (j = 0; j <= i; j++) {
+ BASE temp_real = 0.0;
+ BASE temp_imag = 0.0;
+ for (k = 0; k < K; k++) {
+ const BASE Aki_real = CONST_REAL(A, k * lda + i);
+ const BASE Aki_imag = -CONST_IMAG(A, k * lda + i);
+ const BASE Akj_real = CONST_REAL(A, k * lda + j);
+ const BASE Akj_imag = CONST_IMAG(A, k * lda + j);
+ temp_real += Aki_real * Akj_real - Aki_imag * Akj_imag;
+ temp_imag += Aki_real * Akj_imag + Aki_imag * Akj_real;
+ }
+ REAL(C, i * ldc + j) += alpha * temp_real;
+ IMAG(C, i * ldc + j) += alpha * temp_imag;
+ }
+ }
+
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+}
diff --git a/gsl-1.9/cblas/source_hpmv.h b/gsl-1.9/cblas/source_hpmv.h
new file mode 100644
index 0000000..8878231
--- /dev/null
+++ b/gsl-1.9/cblas/source_hpmv.h
@@ -0,0 +1,138 @@
+/* blas/source_hpmv.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ const int conj = (order == CblasColMajor) ? -1 : 1;
+ INDEX i, j;
+
+ const BASE alpha_real = CONST_REAL0(alpha);
+ const BASE alpha_imag = CONST_IMAG0(alpha);
+
+ const BASE beta_real = CONST_REAL0(beta);
+ const BASE beta_imag = CONST_IMAG0(beta);
+
+ if ((alpha_real == 0.0 && alpha_imag == 0.0)
+ && (beta_real == 1.0 && beta_imag == 0.0))
+ return;
+
+ /* form y := beta*y */
+ if (beta_real == 0.0 && beta_imag == 0.0) {
+ INDEX iy = OFFSET(N, incY);
+ for (i = 0; i < N; i++) {
+ REAL(Y, iy) = 0.0;
+ IMAG(Y, iy) = 0.0;
+ iy += incY;
+ }
+ } else if (!(beta_real == 1.0 && beta_imag == 0.0)) {
+ INDEX iy = OFFSET(N, incY);
+ for (i = 0; i < N; i++) {
+ const BASE y_real = REAL(Y, iy);
+ const BASE y_imag = IMAG(Y, iy);
+ const BASE tmpR = y_real * beta_real - y_imag * beta_imag;
+ const BASE tmpI = y_real * beta_imag + y_imag * beta_real;
+ REAL(Y, iy) = tmpR;
+ IMAG(Y, iy) = tmpI;
+ iy += incY;
+ }
+ }
+
+ if (alpha_real == 0.0 && alpha_imag == 0.0)
+ return;
+
+ /* form y := alpha*A*x + y */
+
+ if ((order == CblasRowMajor && Uplo == CblasUpper)
+ || (order == CblasColMajor && Uplo == CblasLower)) {
+
+ INDEX ix = OFFSET(N, incX);
+ INDEX iy = OFFSET(N, incY);
+ for (i = 0; i < N; i++) {
+ BASE x_real = CONST_REAL(X, ix);
+ BASE x_imag = CONST_IMAG(X, ix);
+ BASE temp1_real = alpha_real * x_real - alpha_imag * x_imag;
+ BASE temp1_imag = alpha_real * x_imag + alpha_imag * x_real;
+ BASE temp2_real = 0.0;
+ BASE temp2_imag = 0.0;
+ const INDEX j_min = i + 1;
+ const INDEX j_max = N;
+ INDEX jx = OFFSET(N, incX) + j_min * incX;
+ INDEX jy = OFFSET(N, incY) + j_min * incY;
+ BASE Aii_real = CONST_REAL(Ap, TPUP(N, i, i));
+ /* Aii_imag is zero */
+ REAL(Y, iy) += temp1_real * Aii_real;
+ IMAG(Y, iy) += temp1_imag * Aii_real;
+ for (j = j_min; j < j_max; j++) {
+ BASE Aij_real = CONST_REAL(Ap, TPUP(N, i, j));
+ BASE Aij_imag = conj * CONST_IMAG(Ap, TPUP(N, i, j));
+ REAL(Y, jy) += temp1_real * Aij_real - temp1_imag * (-Aij_imag);
+ IMAG(Y, jy) += temp1_real * (-Aij_imag) + temp1_imag * Aij_real;
+ x_real = CONST_REAL(X, jx);
+ x_imag = CONST_IMAG(X, jx);
+ temp2_real += x_real * Aij_real - x_imag * Aij_imag;
+ temp2_imag += x_real * Aij_imag + x_imag * Aij_real;
+ jx += incX;
+ jy += incY;
+ }
+ REAL(Y, iy) += alpha_real * temp2_real - alpha_imag * temp2_imag;
+ IMAG(Y, iy) += alpha_real * temp2_imag + alpha_imag * temp2_real;
+ ix += incX;
+ iy += incY;
+ }
+ } else if ((order == CblasRowMajor && Uplo == CblasLower)
+ || (order == CblasColMajor && Uplo == CblasUpper)) {
+
+ INDEX ix = OFFSET(N, incX);
+ INDEX iy = OFFSET(N, incY);
+ for (i = 0; i < N; i++) {
+ BASE x_real = CONST_REAL(X, ix);
+ BASE x_imag = CONST_IMAG(X, ix);
+ BASE temp1_real = alpha_real * x_real - alpha_imag * x_imag;
+ BASE temp1_imag = alpha_real * x_imag + alpha_imag * x_real;
+ BASE temp2_real = 0.0;
+ BASE temp2_imag = 0.0;
+ const INDEX j_min = 0;
+ const INDEX j_max = i;
+ INDEX jx = OFFSET(N, incX) + j_min * incX;
+ INDEX jy = OFFSET(N, incY) + j_min * incY;
+ BASE Aii_real = CONST_REAL(Ap, TPLO(N, i, i));
+ /* Aii_imag is zero */
+ REAL(Y, iy) += temp1_real * Aii_real;
+ IMAG(Y, iy) += temp1_imag * Aii_real;
+ for (j = j_min; j < j_max; j++) {
+ BASE Aij_real = CONST_REAL(Ap, TPLO(N, i, j));
+ BASE Aij_imag = conj * CONST_IMAG(Ap, TPLO(N, i, j));
+ REAL(Y, jy) += temp1_real * Aij_real - temp1_imag * (-Aij_imag);
+ IMAG(Y, jy) += temp1_real * (-Aij_imag) + temp1_imag * Aij_real;
+ x_real = CONST_REAL(X, jx);
+ x_imag = CONST_IMAG(X, jx);
+ temp2_real += x_real * Aij_real - x_imag * Aij_imag;
+ temp2_imag += x_real * Aij_imag + x_imag * Aij_real;
+ jx += incX;
+ jy += incY;
+ }
+ REAL(Y, iy) += alpha_real * temp2_real - alpha_imag * temp2_imag;
+ IMAG(Y, iy) += alpha_real * temp2_imag + alpha_imag * temp2_real;
+ ix += incX;
+ iy += incY;
+ }
+
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+}
diff --git a/gsl-1.9/cblas/source_hpr.h b/gsl-1.9/cblas/source_hpr.h
new file mode 100644
index 0000000..5eb93aa
--- /dev/null
+++ b/gsl-1.9/cblas/source_hpr.h
@@ -0,0 +1,80 @@
+/* blas/source_hpr.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ const int conj = (order == CblasColMajor) ? -1 : 1;
+ INDEX i, j;
+
+ if (alpha == 0.0)
+ return;
+
+ if ((order == CblasRowMajor && Uplo == CblasUpper)
+ || (order == CblasColMajor && Uplo == CblasLower)) {
+ INDEX ix = OFFSET(N, incX);
+ for (i = 0; i < N; i++) {
+ const BASE tmp_real = alpha * CONST_REAL(X, ix);
+ const BASE tmp_imag = alpha * conj * CONST_IMAG(X, ix);
+ INDEX jx = ix;
+
+ {
+ const BASE X_real = CONST_REAL(X, jx);
+ const BASE X_imag = -conj * CONST_IMAG(X, jx);
+ REAL(Ap, TPUP(N, i, i)) += X_real * tmp_real - X_imag * tmp_imag;
+ IMAG(Ap, TPUP(N, i, i)) = 0;
+ jx += incX;
+ }
+
+ for (j = i + 1; j < N; j++) {
+ const BASE X_real = CONST_REAL(X, jx);
+ const BASE X_imag = -conj * CONST_IMAG(X, jx);
+ REAL(Ap, TPUP(N, i, j)) += X_real * tmp_real - X_imag * tmp_imag;
+ IMAG(Ap, TPUP(N, i, j)) += X_imag * tmp_real + X_real * tmp_imag;
+ jx += incX;
+ }
+ ix += incX;
+ }
+ } else if ((order == CblasRowMajor && Uplo == CblasLower)
+ || (order == CblasColMajor && Uplo == CblasUpper)) {
+ INDEX ix = OFFSET(N, incX);
+ for (i = 0; i < N; i++) {
+ const BASE tmp_real = alpha * CONST_REAL(X, ix);
+ const BASE tmp_imag = alpha * conj * CONST_IMAG(X, ix);
+ INDEX jx = OFFSET(N, incX);
+ for (j = 0; j < i; j++) {
+ const BASE X_real = CONST_REAL(X, jx);
+ const BASE X_imag = -conj * CONST_IMAG(X, jx);
+ REAL(Ap, TPLO(N, i, j)) += X_real * tmp_real - X_imag * tmp_imag;
+ IMAG(Ap, TPLO(N, i, j)) += X_imag * tmp_real + X_real * tmp_imag;
+ jx += incX;
+ }
+
+ {
+ const BASE X_real = CONST_REAL(X, jx);
+ const BASE X_imag = -conj * CONST_IMAG(X, jx);
+ REAL(Ap, TPLO(N, i, i)) += X_real * tmp_real - X_imag * tmp_imag;
+ IMAG(Ap, TPLO(N, i, i)) = 0;
+ jx += incX;
+ }
+
+ ix += incX;
+ }
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+}
diff --git a/gsl-1.9/cblas/source_hpr2.h b/gsl-1.9/cblas/source_hpr2.h
new file mode 100644
index 0000000..ecc9db1
--- /dev/null
+++ b/gsl-1.9/cblas/source_hpr2.h
@@ -0,0 +1,115 @@
+/* blas/source_hpr2.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ const int conj = (order == CblasColMajor) ? -1 : 1;
+ INDEX i, j;
+
+ const BASE alpha_real = CONST_REAL0(alpha);
+ const BASE alpha_imag = CONST_IMAG0(alpha);
+
+ if (alpha_real == 0.0 && alpha_imag == 0.0)
+ return;
+
+ if ((order == CblasRowMajor && Uplo == CblasUpper)
+ || (order == CblasColMajor && Uplo == CblasLower)) {
+ INDEX ix = OFFSET(N, incX);
+ INDEX iy = OFFSET(N, incY);
+ for (i = 0; i < N; i++) {
+ const BASE Xi_real = CONST_REAL(X, ix);
+ const BASE Xi_imag = CONST_IMAG(X, ix);
+ /* tmp1 = alpha Xi */
+ const BASE tmp1_real = alpha_real * Xi_real - alpha_imag * Xi_imag;
+ const BASE tmp1_imag = alpha_imag * Xi_real + alpha_real * Xi_imag;
+
+ const BASE Yi_real = CONST_REAL(Y, iy);
+ const BASE Yi_imag = CONST_IMAG(Y, iy);
+ /* tmp2 = conj(alpha) Yi */
+ const BASE tmp2_real = alpha_real * Yi_real + alpha_imag * Yi_imag;
+ const BASE tmp2_imag = -alpha_imag * Yi_real + alpha_real * Yi_imag;
+
+ INDEX jx = ix + incX;
+ INDEX jy = iy + incY;
+
+ /* Aij = alpha*Xi*conj(Yj) + conj(alpha)*Yi*conj(Xj) */
+
+ REAL(Ap, TPUP(N, i, i)) += 2 * (tmp1_real * Yi_real + tmp1_imag * Yi_imag);
+ IMAG(Ap, TPUP(N, i, i)) = 0;
+
+ for (j = i + 1; j < N; j++) {
+ const BASE Xj_real = CONST_REAL(X, jx);
+ const BASE Xj_imag = CONST_IMAG(X, jx);
+ const BASE Yj_real = CONST_REAL(Y, jy);
+ const BASE Yj_imag = CONST_IMAG(Y, jy);
+ REAL(Ap, TPUP(N, i, j)) += ((tmp1_real * Yj_real + tmp1_imag * Yj_imag)
+ + (tmp2_real * Xj_real + tmp2_imag * Xj_imag));
+ IMAG(Ap, TPUP(N, i, j)) +=
+ conj * ((tmp1_imag * Yj_real - tmp1_real * Yj_imag) +
+ (tmp2_imag * Xj_real - tmp2_real * Xj_imag));
+ jx += incX;
+ jy += incY;
+ }
+ ix += incX;
+ iy += incY;
+ }
+ } else if ((order == CblasRowMajor && Uplo == CblasLower)
+ || (order == CblasColMajor && Uplo == CblasUpper)) {
+
+ INDEX ix = OFFSET(N, incX);
+ INDEX iy = OFFSET(N, incY);
+ for (i = 0; i < N; i++) {
+ const BASE Xi_real = CONST_REAL(X, ix);
+ const BASE Xi_imag = CONST_IMAG(X, ix);
+ const BASE tmp1_real = alpha_real * Xi_real - alpha_imag * Xi_imag;
+ const BASE tmp1_imag = alpha_imag * Xi_real + alpha_real * Xi_imag;
+
+ const BASE Yi_real = CONST_REAL(Y, iy);
+ const BASE Yi_imag = CONST_IMAG(Y, iy);
+ const BASE tmp2_real = alpha_real * Yi_real + alpha_imag * Yi_imag;
+ const BASE tmp2_imag = -alpha_imag * Yi_real + alpha_real * Yi_imag;
+
+ INDEX jx = OFFSET(N, incX);
+ INDEX jy = OFFSET(N, incY);
+
+ /* Aij = alpha*Xi*conj(Yj) + conj(alpha)*Yi*conj(Xj) */
+
+ for (j = 0; j < i; j++) {
+ const BASE Xj_real = CONST_REAL(X, jx);
+ const BASE Xj_imag = CONST_IMAG(X, jx);
+ const BASE Yj_real = CONST_REAL(Y, jy);
+ const BASE Yj_imag = CONST_IMAG(Y, jy);
+ REAL(Ap, TPLO(N, i, j)) += ((tmp1_real * Yj_real + tmp1_imag * Yj_imag)
+ + (tmp2_real * Xj_real + tmp2_imag * Xj_imag));
+ IMAG(Ap, TPLO(N, i, j)) +=
+ conj * ((tmp1_imag * Yj_real - tmp1_real * Yj_imag) +
+ (tmp2_imag * Xj_real - tmp2_real * Xj_imag));
+ jx += incX;
+ jy += incY;
+ }
+
+ REAL(Ap, TPLO(N, i, i)) += 2 * (tmp1_real * Yi_real + tmp1_imag * Yi_imag);
+ IMAG(Ap, TPLO(N, i, i)) = 0;
+
+ ix += incX;
+ iy += incY;
+ }
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+}
diff --git a/gsl-1.9/cblas/source_iamax_c.h b/gsl-1.9/cblas/source_iamax_c.h
new file mode 100644
index 0000000..d6840a5
--- /dev/null
+++ b/gsl-1.9/cblas/source_iamax_c.h
@@ -0,0 +1,41 @@
+/* blas/source_iamax_c.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ BASE max = 0.0;
+ INDEX ix = 0;
+ INDEX i;
+ CBLAS_INDEX result = 0;
+
+ if (incX <= 0) {
+ return 0;
+ }
+
+ for (i = 0; i < N; i++) {
+ const BASE a = fabs(CONST_REAL(X, ix)) + fabs(CONST_IMAG(X, ix));
+
+ if (a > max) {
+ max = a;
+ result = i;
+ }
+ ix += incX;
+ }
+
+ return result;
+}
diff --git a/gsl-1.9/cblas/source_iamax_r.h b/gsl-1.9/cblas/source_iamax_r.h
new file mode 100644
index 0000000..a7e4133
--- /dev/null
+++ b/gsl-1.9/cblas/source_iamax_r.h
@@ -0,0 +1,39 @@
+/* blas/source_iamax_r.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ BASE max = 0.0;
+ INDEX ix = 0;
+ INDEX i;
+ CBLAS_INDEX result = 0;
+
+ if (incX <= 0) {
+ return 0;
+ }
+
+ for (i = 0; i < N; i++) {
+ if (fabs(X[ix]) > max) {
+ max = fabs(X[ix]);
+ result = i;
+ }
+ ix += incX;
+ }
+
+ return result;
+}
diff --git a/gsl-1.9/cblas/source_nrm2_c.h b/gsl-1.9/cblas/source_nrm2_c.h
new file mode 100644
index 0000000..7bd37ed
--- /dev/null
+++ b/gsl-1.9/cblas/source_nrm2_c.h
@@ -0,0 +1,60 @@
+/* blas/source_nrm2_c.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ BASE scale = 0.0;
+ BASE ssq = 1.0;
+ INDEX i;
+ INDEX ix = 0;
+
+ if (N == 0 || incX < 1) {
+ return 0;
+ }
+
+ for (i = 0; i < N; i++) {
+ const BASE x = CONST_REAL(X, ix);
+ const BASE y = CONST_IMAG(X, ix);
+
+ if (x != 0.0) {
+ const BASE ax = fabs(x);
+
+ if (scale < ax) {
+ ssq = 1.0 + ssq * (scale / ax) * (scale / ax);
+ scale = ax;
+ } else {
+ ssq += (ax / scale) * (ax / scale);
+ }
+ }
+
+ if (y != 0.0) {
+ const BASE ay = fabs(y);
+
+ if (scale < ay) {
+ ssq = 1.0 + ssq * (scale / ay) * (scale / ay);
+ scale = ay;
+ } else {
+ ssq += (ay / scale) * (ay / scale);
+ }
+ }
+
+ ix += incX;
+ }
+
+ return scale * sqrt(ssq);
+}
diff --git a/gsl-1.9/cblas/source_nrm2_r.h b/gsl-1.9/cblas/source_nrm2_r.h
new file mode 100644
index 0000000..d2beb3a
--- /dev/null
+++ b/gsl-1.9/cblas/source_nrm2_r.h
@@ -0,0 +1,50 @@
+/* blas/source_nrm2_r.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ BASE scale = 0.0;
+ BASE ssq = 1.0;
+ INDEX i;
+ INDEX ix = 0;
+
+ if (N <= 0 || incX <= 0) {
+ return 0;
+ } else if (N == 1) {
+ return fabs(X[0]);
+ }
+
+ for (i = 0; i < N; i++) {
+ const BASE x = X[ix];
+
+ if (x != 0.0) {
+ const BASE ax = fabs(x);
+
+ if (scale < ax) {
+ ssq = 1.0 + ssq * (scale / ax) * (scale / ax);
+ scale = ax;
+ } else {
+ ssq += (ax / scale) * (ax / scale);
+ }
+ }
+
+ ix += incX;
+ }
+
+ return scale * sqrt(ssq);
+}
diff --git a/gsl-1.9/cblas/source_rot.h b/gsl-1.9/cblas/source_rot.h
new file mode 100644
index 0000000..1015a4c
--- /dev/null
+++ b/gsl-1.9/cblas/source_rot.h
@@ -0,0 +1,32 @@
+/* blas/source_rot.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i;
+ INDEX ix = OFFSET(N, incX);
+ INDEX iy = OFFSET(N, incY);
+ for (i = 0; i < N; i++) {
+ const BASE x = X[ix];
+ const BASE y = Y[iy];
+ X[ix] = c * x + s * y;
+ Y[iy] = -s * x + c * y;
+ ix += incX;
+ iy += incY;
+ }
+}
diff --git a/gsl-1.9/cblas/source_rotg.h b/gsl-1.9/cblas/source_rotg.h
new file mode 100644
index 0000000..24589e2
--- /dev/null
+++ b/gsl-1.9/cblas/source_rotg.h
@@ -0,0 +1,46 @@
+/* blas/source_rotg.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ const BASE roe = (fabs(*a) > fabs(*b) ? *a : *b);
+ const BASE scale = fabs(*a) + fabs(*b);
+ BASE r, z;
+
+ if (scale != 0.0) {
+ const BASE aos = *a / scale;
+ const BASE bos = *b / scale;
+ r = scale * sqrt(aos * aos + bos * bos);
+ r = GSL_SIGN(roe) * r;
+ *c = *a / r;
+ *s = *b / r;
+ z = 1.0;
+ if (fabs(*a) > fabs(*b))
+ z = *s;
+ if (fabs(*b) >= fabs(*a) && *c != 0.0)
+ z = 1.0 / (*c);
+ } else {
+ *c = 1.0;
+ *s = 0.0;
+ r = 0.0;
+ z = 0.0;
+ }
+
+ *a = r;
+ *b = z;
+}
diff --git a/gsl-1.9/cblas/source_rotm.h b/gsl-1.9/cblas/source_rotm.h
new file mode 100644
index 0000000..942616a
--- /dev/null
+++ b/gsl-1.9/cblas/source_rotm.h
@@ -0,0 +1,58 @@
+/* blas/source_rotmg.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX n;
+ INDEX i = OFFSET(N, incX);
+ INDEX j = OFFSET(N, incY);
+
+ BASE h11, h21, h12, h22;
+
+ if (P[0] == -1.0) {
+ h11 = P[1];
+ h21 = P[2];
+ h12 = P[3];
+ h22 = P[4];
+ } else if (P[0] == 0.0) {
+ h11 = 1.0;
+ h21 = P[2];
+ h12 = P[3];
+ h22 = 1.0;
+ } else if (P[0] == 1.0) {
+ h11 = P[1];
+ h21 = -1.0;
+ h12 = 1.0;
+ h22 = P[4];
+ } else if (P[0] == -2.0) {
+ return;
+ } else {
+ BLAS_ERROR("unrecognized value of P[0]");
+ return;
+ }
+
+ for (n = 0; n < N; n++) {
+ const BASE w = X[i];
+ const BASE z = Y[j];
+ X[i] = h11 * w + h12 * z;
+ Y[j] = h21 * w + h22 * z;
+ i += incX;
+ j += incY;
+ }
+
+}
diff --git a/gsl-1.9/cblas/source_rotmg.h b/gsl-1.9/cblas/source_rotmg.h
new file mode 100644
index 0000000..7a41538
--- /dev/null
+++ b/gsl-1.9/cblas/source_rotmg.h
@@ -0,0 +1,162 @@
+/* blas/source_rotmg.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ const BASE G = 4096.0, G2 = G * G;
+ BASE D1 = *d1, D2 = *d2, x = *b1, y = b2;
+ BASE h11, h12, h21, h22, u;
+
+ BASE c, s;
+
+ /* case of d1 < 0, appendix A, second to last paragraph */
+
+ if (D1 < 0.0) {
+ P[0] = -1;
+ P[1] = 0;
+ P[2] = 0;
+ P[3] = 0;
+ P[4] = 0;
+ *d1 = 0;
+ *d2 = 0;
+ *b1 = 0;
+ return;
+ }
+
+ if (D2 * y == 0.0) {
+ P[0] = -2; /* case of H = I, page 315 */
+ return;
+ }
+
+ c = fabs(D1 * x * x);
+ s = fabs(D2 * y * y);
+
+ if (c > s) {
+ /* case of equation A6 */
+
+ P[0] = 0.0;
+
+ h11 = 1;
+ h12 = (D2 * y) / (D1 * x);
+ h21 = -y / x;
+ h22 = 1;
+
+ u = 1 - h21 * h12;
+
+ if (u <= 0.0) { /* the case u <= 0 is rejected */
+ P[0] = -1;
+ P[1] = 0;
+ P[2] = 0;
+ P[3] = 0;
+ P[4] = 0;
+ *d1 = 0;
+ *d2 = 0;
+ *b1 = 0;
+ return;
+ }
+
+ D1 /= u;
+ D2 /= u;
+ x *= u;
+ } else {
+ /* case of equation A7 */
+
+ if (D2 * y * y < 0.0) {
+ P[0] = -1;
+ P[1] = 0;
+ P[2] = 0;
+ P[3] = 0;
+ P[4] = 0;
+ *d1 = 0;
+ *d2 = 0;
+ *b1 = 0;
+ return;
+ }
+
+ P[0] = 1;
+
+ h11 = (D1 * x) / (D2 * y);
+ h12 = 1;
+ h21 = -1;
+ h22 = x / y;
+
+ u = 1 + h11 * h22;
+
+ D1 /= u;
+ D2 /= u;
+
+ {
+ BASE tmp = D2;
+ D2 = D1;
+ D1 = tmp;
+ }
+
+ x = y * u;
+ }
+
+ /* rescale D1 to range [1/G2,G2] */
+
+ while (D1 <= 1.0 / G2 && D1 != 0.0) {
+ P[0] = -1;
+ D1 *= G2;
+ x /= G;
+ h11 /= G;
+ h12 /= G;
+ }
+
+ while (D1 >= G2) {
+ P[0] = -1;
+ D1 /= G2;
+ x *= G;
+ h11 *= G;
+ h12 *= G;
+ }
+
+ /* rescale D2 to range [1/G2,G2] */
+
+ while (fabs(D2) <= 1.0 / G2 && D2 != 0.0) {
+ P[0] = -1;
+ D2 *= G2;
+ h21 /= G;
+ h22 /= G;
+ }
+
+ while (fabs(D2) >= G2) {
+ P[0] = -1;
+ D2 /= G2;
+ h21 *= G;
+ h22 *= G;
+ }
+
+ *d1 = D1;
+ *d2 = D2;
+ *b1 = x;
+
+ if (P[0] == -1.0) {
+ P[1] = h11;
+ P[2] = h21;
+ P[3] = h12;
+ P[4] = h22;
+ } else if (P[0] == 0.0) {
+ P[2] = h21;
+ P[3] = h12;
+ } else if (P[0] == 1.0) {
+ P[1] = h11;
+ P[4] = h22;
+ }
+}
diff --git a/gsl-1.9/cblas/source_sbmv.h b/gsl-1.9/cblas/source_sbmv.h
new file mode 100644
index 0000000..144fc1d
--- /dev/null
+++ b/gsl-1.9/cblas/source_sbmv.h
@@ -0,0 +1,100 @@
+/* blas/source_sbmv.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i, j;
+
+ if (N == 0)
+ return;
+
+ if (alpha == 0.0 && beta == 1.0)
+ return;
+
+ /* form y := beta*y */
+ if (beta == 0.0) {
+ INDEX iy = OFFSET(N, incY);
+ for (i = 0; i < N; i++) {
+ Y[iy] = 0.0;
+ iy += incY;
+ }
+ } else if (beta != 1.0) {
+ INDEX iy = OFFSET(N, incY);
+ for (i = 0; i < N; i++) {
+ Y[iy] *= beta;
+ iy += incY;
+ }
+ }
+
+ if (alpha == 0.0)
+ return;
+
+ /* form y := alpha*A*x + y */
+
+ if ((order == CblasRowMajor && Uplo == CblasUpper)
+ || (order == CblasColMajor && Uplo == CblasLower)) {
+ INDEX ix = OFFSET(N, incX);
+ INDEX iy = OFFSET(N, incY);
+
+ for (i = 0; i < N; i++) {
+ BASE tmp1 = alpha * X[ix];
+ BASE tmp2 = 0.0;
+ const INDEX j_min = i + 1;
+ const INDEX j_max = GSL_MIN(N, i + K + 1);
+ INDEX jx = OFFSET(N, incX) + j_min * incX;
+ INDEX jy = OFFSET(N, incY) + j_min * incY;
+ Y[iy] += tmp1 * A[0 + i * lda];
+ for (j = j_min; j < j_max; j++) {
+ BASE Aij = A[(j - i) + i * lda];
+ Y[jy] += tmp1 * Aij;
+ tmp2 += Aij * X[jx];
+ jx += incX;
+ jy += incY;
+ }
+ Y[iy] += alpha * tmp2;
+ ix += incX;
+ iy += incY;
+ }
+ } else if ((order == CblasRowMajor && Uplo == CblasLower)
+ || (order == CblasColMajor && Uplo == CblasUpper)) {
+ INDEX ix = OFFSET(N, incX);
+ INDEX iy = OFFSET(N, incY);
+
+ for (i = 0; i < N; i++) {
+ BASE tmp1 = alpha * X[ix];
+ BASE tmp2 = 0.0;
+ const INDEX j_min = (i > K) ? i - K : 0;
+ const INDEX j_max = i;
+ INDEX jx = OFFSET(N, incX) + j_min * incX;
+ INDEX jy = OFFSET(N, incY) + j_min * incY;
+ for (j = j_min; j < j_max; j++) {
+ BASE Aij = A[(K - i + j) + i * lda];
+ Y[jy] += tmp1 * Aij;
+ tmp2 += Aij * X[jx];
+ jx += incX;
+ jy += incY;
+ }
+ Y[iy] += tmp1 * A[K + i * lda] + alpha * tmp2;
+ ix += incX;
+ iy += incY;
+ }
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+
+}
diff --git a/gsl-1.9/cblas/source_scal_c.h b/gsl-1.9/cblas/source_scal_c.h
new file mode 100644
index 0000000..9a5826b
--- /dev/null
+++ b/gsl-1.9/cblas/source_scal_c.h
@@ -0,0 +1,39 @@
+/* blas/source_scal_c.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i;
+ INDEX ix;
+ const BASE alpha_real = CONST_REAL0(alpha);
+ const BASE alpha_imag = CONST_IMAG0(alpha);
+
+ if (incX <= 0) {
+ return;
+ }
+
+ ix = OFFSET(N, incX);
+
+ for (i = 0; i < N; i++) {
+ const BASE x_real = REAL(X, ix);
+ const BASE x_imag = IMAG(X, ix);
+ REAL(X, ix) = x_real * alpha_real - x_imag * alpha_imag;
+ IMAG(X, ix) = x_real * alpha_imag + x_imag * alpha_real;
+ ix += incX;
+ }
+}
diff --git a/gsl-1.9/cblas/source_scal_c_s.h b/gsl-1.9/cblas/source_scal_c_s.h
new file mode 100644
index 0000000..d8a07d4
--- /dev/null
+++ b/gsl-1.9/cblas/source_scal_c_s.h
@@ -0,0 +1,35 @@
+/* blas/source_scal_c_s.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i;
+ INDEX ix;
+
+ if (incX <= 0) {
+ return;
+ }
+
+ ix = OFFSET(N, incX);
+
+ for (i = 0; i < N; i++) {
+ REAL(X, ix) *= alpha;
+ IMAG(X, ix) *= alpha;
+ ix += incX;
+ }
+}
diff --git a/gsl-1.9/cblas/source_scal_r.h b/gsl-1.9/cblas/source_scal_r.h
new file mode 100644
index 0000000..60947f8
--- /dev/null
+++ b/gsl-1.9/cblas/source_scal_r.h
@@ -0,0 +1,34 @@
+/* blas/source_scal_r.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i;
+ INDEX ix;
+
+ if (incX <= 0) {
+ return;
+ }
+
+ ix = OFFSET(N, incX);
+
+ for (i = 0; i < N; i++) {
+ X[ix] *= alpha;
+ ix += incX;
+ }
+}
diff --git a/gsl-1.9/cblas/source_spmv.h b/gsl-1.9/cblas/source_spmv.h
new file mode 100644
index 0000000..8ee0c73
--- /dev/null
+++ b/gsl-1.9/cblas/source_spmv.h
@@ -0,0 +1,101 @@
+/* blas/source_spmv.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i, j;
+
+
+ if (alpha == 0.0 && beta == 1.0)
+ return;
+
+ /* form y := beta*y */
+ if (beta == 0.0) {
+ INDEX iy = OFFSET(N, incY);
+ for (i = 0; i < N; i++) {
+ Y[iy] = 0.0;
+ iy += incY;
+ }
+ } else if (beta != 1.0) {
+ INDEX iy = OFFSET(N, incY);
+ for (i = 0; i < N; i++) {
+ Y[iy] *= beta;
+ iy += incY;
+ }
+ }
+
+ if (alpha == 0.0)
+ return;
+
+ /* form y := alpha*A*x + y */
+
+ if ((order == CblasRowMajor && Uplo == CblasUpper)
+ || (order == CblasColMajor && Uplo == CblasLower)) {
+ INDEX ix = OFFSET(N, incX);
+ INDEX iy = OFFSET(N, incY);
+ for (i = 0; i < N; i++) {
+ BASE tmp1 = alpha * X[ix];
+ BASE tmp2 = 0.0;
+ const INDEX j_min = i + 1;
+ const INDEX j_max = N;
+ INDEX jx = OFFSET(N, incX) + j_min * incX;
+ INDEX jy = OFFSET(N, incY) + j_min * incY;
+
+ Y[iy] += tmp1 * Ap[TPUP(N, i, i)];
+
+ for (j = j_min; j < j_max; j++) {
+ const BASE apk = Ap[TPUP(N, i, j)];
+ Y[jy] += tmp1 * apk;
+ tmp2 += apk * X[jx];
+ jy += incY;
+ jx += incX;
+ }
+ Y[iy] += alpha * tmp2;
+ ix += incX;
+ iy += incY;
+ }
+ } else if ((order == CblasRowMajor && Uplo == CblasLower)
+ || (order == CblasColMajor && Uplo == CblasUpper)) {
+ INDEX ix = OFFSET(N, incX);
+ INDEX iy = OFFSET(N, incY);
+ for (i = 0; i < N; i++) {
+ BASE tmp1 = alpha * X[ix];
+ BASE tmp2 = 0.0;
+
+ const INDEX j_min = 0;
+ const INDEX j_max = i;
+ INDEX jx = OFFSET(N, incX) + j_min * incX;
+ INDEX jy = OFFSET(N, incY) + j_min * incY;
+
+ Y[iy] += tmp1 * Ap[TPLO(N, i, i)];
+
+ for (j = j_min; j < j_max; j++) {
+ const BASE apk = Ap[TPLO(N, i, j)];
+ Y[jy] += tmp1 * apk;
+ tmp2 += apk * X[jx];
+ jy += incY;
+ jx += incX;
+ }
+ Y[iy] += alpha * tmp2;
+ ix += incX;
+ iy += incY;
+ }
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+}
diff --git a/gsl-1.9/cblas/source_spr.h b/gsl-1.9/cblas/source_spr.h
new file mode 100644
index 0000000..025fdd8
--- /dev/null
+++ b/gsl-1.9/cblas/source_spr.h
@@ -0,0 +1,56 @@
+/* blas/source_spr.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i, j;
+
+ if (N == 0)
+ return;
+
+ if (alpha == 0.0)
+ return;
+
+ if ((order == CblasRowMajor && Uplo == CblasUpper)
+ || (order == CblasColMajor && Uplo == CblasLower)) {
+ INDEX ix = OFFSET(N, incX);
+ for (i = 0; i < N; i++) {
+ const BASE tmp = alpha * X[ix];
+ INDEX jx = ix;
+ for (j = i; j < N; j++) {
+ Ap[TPUP(N, i, j)] += X[jx] * tmp;
+ jx += incX;
+ }
+ ix += incX;
+ }
+ } else if ((order == CblasRowMajor && Uplo == CblasLower)
+ || (order == CblasColMajor && Uplo == CblasUpper)) {
+ INDEX ix = OFFSET(N, incX);
+ for (i = 0; i < N; i++) {
+ const BASE tmp = alpha * X[ix];
+ INDEX jx = OFFSET(N, incX);
+ for (j = 0; j <= i; j++) {
+ Ap[TPLO(N, i, j)] += X[jx] * tmp;
+ jx += incX;
+ }
+ ix += incX;
+ }
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+}
diff --git a/gsl-1.9/cblas/source_spr2.h b/gsl-1.9/cblas/source_spr2.h
new file mode 100644
index 0000000..2e48fba
--- /dev/null
+++ b/gsl-1.9/cblas/source_spr2.h
@@ -0,0 +1,66 @@
+/* blas/source_spr2.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i, j;
+
+ if (N == 0)
+ return;
+
+ if (alpha == 0.0)
+ return;
+
+ if ((order == CblasRowMajor && Uplo == CblasUpper)
+ || (order == CblasColMajor && Uplo == CblasLower)) {
+ INDEX ix = OFFSET(N, incX);
+ INDEX iy = OFFSET(N, incY);
+ for (i = 0; i < N; i++) {
+ const BASE tmp1 = alpha * X[ix];
+ const BASE tmp2 = alpha * Y[iy];
+ INDEX jx = ix;
+ INDEX jy = iy;
+ for (j = i; j < N; j++) {
+ Ap[TPUP(N, i, j)] += tmp1 * Y[jy] + tmp2 * X[jx];
+ jx += incX;
+ jy += incY;
+ }
+ ix += incX;
+ iy += incY;
+ }
+ } else if ((order == CblasRowMajor && Uplo == CblasLower)
+ || (order == CblasColMajor && Uplo == CblasUpper)) {
+ INDEX ix = OFFSET(N, incX);
+ INDEX iy = OFFSET(N, incY);
+ for (i = 0; i < N; i++) {
+ const BASE tmp1 = alpha * X[ix];
+ const BASE tmp2 = alpha * Y[iy];
+ INDEX jx = OFFSET(N, incX);
+ INDEX jy = OFFSET(N, incY);
+ for (j = 0; j <= i; j++) {
+ Ap[TPLO(N, i, j)] += tmp1 * Y[jy] + tmp2 * X[jx];
+ jx += incX;
+ jy += incY;
+ }
+ ix += incX;
+ iy += incY;
+ }
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+}
diff --git a/gsl-1.9/cblas/source_swap_c.h b/gsl-1.9/cblas/source_swap_c.h
new file mode 100644
index 0000000..81660a1
--- /dev/null
+++ b/gsl-1.9/cblas/source_swap_c.h
@@ -0,0 +1,35 @@
+/* blas/source_swap_c.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i;
+ INDEX ix = OFFSET(N, incX);
+ INDEX iy = OFFSET(N, incY);
+
+ for (i = 0; i < N; i++) {
+ const BASE tmp_real = REAL(X, ix);
+ const BASE tmp_imag = IMAG(X, ix);
+ REAL(X, ix) = REAL(Y, iy);
+ IMAG(X, ix) = IMAG(Y, iy);
+ REAL(Y, iy) = tmp_real;
+ IMAG(Y, iy) = tmp_imag;
+ ix += incX;
+ iy += incY;
+ }
+}
diff --git a/gsl-1.9/cblas/source_swap_r.h b/gsl-1.9/cblas/source_swap_r.h
new file mode 100644
index 0000000..77ffe33
--- /dev/null
+++ b/gsl-1.9/cblas/source_swap_r.h
@@ -0,0 +1,31 @@
+/* blas/source_swap_r.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i;
+ INDEX ix = OFFSET(N, incX);
+ INDEX iy = OFFSET(N, incY);
+ for (i = 0; i < N; i++) {
+ const BASE tmp = X[ix];
+ X[ix] = Y[iy];
+ Y[iy] = tmp;
+ ix += incX;
+ iy += incY;
+ }
+}
diff --git a/gsl-1.9/cblas/source_symm_c.h b/gsl-1.9/cblas/source_symm_c.h
new file mode 100644
index 0000000..8959dcc
--- /dev/null
+++ b/gsl-1.9/cblas/source_symm_c.h
@@ -0,0 +1,203 @@
+/* blas/source_symm_c.h
+ *
+ * Copyright (C) 2001 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i, j, k;
+ INDEX n1, n2;
+ int uplo, side;
+
+ const BASE alpha_real = CONST_REAL0(alpha);
+ const BASE alpha_imag = CONST_IMAG0(alpha);
+ const BASE beta_real = CONST_REAL0(beta);
+ const BASE beta_imag = CONST_IMAG0(beta);
+
+ if ((alpha_real == 0.0 && alpha_imag == 0.0)
+ && (beta_real == 1.0 && beta_imag == 0.0))
+ return;
+
+ if (Order == CblasRowMajor) {
+ n1 = M;
+ n2 = N;
+ uplo = Uplo;
+ side = Side;
+ } else {
+ n1 = N;
+ n2 = M;
+ uplo = (Uplo == CblasUpper) ? CblasLower : CblasUpper;
+ side = (Side == CblasLeft) ? CblasRight : CblasLeft;
+ }
+
+ /* form y := beta*y */
+ if (beta_real == 0.0 && beta_imag == 0.0) {
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ REAL(C, ldc * i + j) = 0.0;
+ IMAG(C, ldc * i + j) = 0.0;
+ }
+ }
+ } else if (!(beta_real == 1.0 && beta_imag == 0.0)) {
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ const BASE Cij_real = REAL(C, ldc * i + j);
+ const BASE Cij_imag = IMAG(C, ldc * i + j);
+ REAL(C, ldc * i + j) = beta_real * Cij_real - beta_imag * Cij_imag;
+ IMAG(C, ldc * i + j) = beta_real * Cij_imag + beta_imag * Cij_real;
+ }
+ }
+ }
+
+ if (alpha_real == 0.0 && alpha_imag == 0.0)
+ return;
+
+ if (side == CblasLeft && uplo == CblasUpper) {
+
+ /* form C := alpha*A*B + C */
+
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ const BASE Bij_real = CONST_REAL(B, ldb * i + j);
+ const BASE Bij_imag = CONST_IMAG(B, ldb * i + j);
+ const BASE temp1_real = alpha_real * Bij_real - alpha_imag * Bij_imag;
+ const BASE temp1_imag = alpha_real * Bij_imag + alpha_imag * Bij_real;
+ BASE temp2_real = 0.0;
+ BASE temp2_imag = 0.0;
+ {
+ const BASE Aii_real = CONST_REAL(A, i * lda + i);
+ const BASE Aii_imag = CONST_IMAG(A, i * lda + i);
+ REAL(C, i * ldc + j) += temp1_real * Aii_real - temp1_imag * Aii_imag;
+ IMAG(C, i * ldc + j) += temp1_real * Aii_imag + temp1_imag * Aii_real;
+ }
+ for (k = i + 1; k < n1; k++) {
+ const BASE Aik_real = CONST_REAL(A, i * lda + k);
+ const BASE Aik_imag = CONST_IMAG(A, i * lda + k);
+ const BASE Bkj_real = CONST_REAL(B, ldb * k + j);
+ const BASE Bkj_imag = CONST_IMAG(B, ldb * k + j);
+ REAL(C, k * ldc + j) += Aik_real * temp1_real - Aik_imag * temp1_imag;
+ IMAG(C, k * ldc + j) += Aik_real * temp1_imag + Aik_imag * temp1_real;
+ temp2_real += Aik_real * Bkj_real - Aik_imag * Bkj_imag;
+ temp2_imag += Aik_real * Bkj_imag + Aik_imag * Bkj_real;
+ }
+ REAL(C, i * ldc + j) += alpha_real * temp2_real - alpha_imag * temp2_imag;
+ IMAG(C, i * ldc + j) += alpha_real * temp2_imag + alpha_imag * temp2_real;
+ }
+ }
+
+ } else if (side == CblasLeft && uplo == CblasLower) {
+
+ /* form C := alpha*A*B + C */
+
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ const BASE Bij_real = CONST_REAL(B, ldb * i + j);
+ const BASE Bij_imag = CONST_IMAG(B, ldb * i + j);
+ const BASE temp1_real = alpha_real * Bij_real - alpha_imag * Bij_imag;
+ const BASE temp1_imag = alpha_real * Bij_imag + alpha_imag * Bij_real;
+ BASE temp2_real = 0.0;
+ BASE temp2_imag = 0.0;
+ for (k = 0; k < i; k++) {
+ const BASE Aik_real = CONST_REAL(A, i * lda + k);
+ const BASE Aik_imag = CONST_IMAG(A, i * lda + k);
+ const BASE Bkj_real = CONST_REAL(B, ldb * k + j);
+ const BASE Bkj_imag = CONST_IMAG(B, ldb * k + j);
+ REAL(C, k * ldc + j) += Aik_real * temp1_real - Aik_imag * temp1_imag;
+ IMAG(C, k * ldc + j) += Aik_real * temp1_imag + Aik_imag * temp1_real;
+ temp2_real += Aik_real * Bkj_real - Aik_imag * Bkj_imag;
+ temp2_imag += Aik_real * Bkj_imag + Aik_imag * Bkj_real;
+ }
+ {
+ const BASE Aii_real = CONST_REAL(A, i * lda + i);
+ const BASE Aii_imag = CONST_IMAG(A, i * lda + i);
+ REAL(C, i * ldc + j) += temp1_real * Aii_real - temp1_imag * Aii_imag;
+ IMAG(C, i * ldc + j) += temp1_real * Aii_imag + temp1_imag * Aii_real;
+ }
+ REAL(C, i * ldc + j) += alpha_real * temp2_real - alpha_imag * temp2_imag;
+ IMAG(C, i * ldc + j) += alpha_real * temp2_imag + alpha_imag * temp2_real;
+ }
+ }
+
+ } else if (side == CblasRight && uplo == CblasUpper) {
+
+ /* form C := alpha*B*A + C */
+
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ const BASE Bij_real = CONST_REAL(B, ldb * i + j);
+ const BASE Bij_imag = CONST_IMAG(B, ldb * i + j);
+ const BASE temp1_real = alpha_real * Bij_real - alpha_imag * Bij_imag;
+ const BASE temp1_imag = alpha_real * Bij_imag + alpha_imag * Bij_real;
+ BASE temp2_real = 0.0;
+ BASE temp2_imag = 0.0;
+ {
+ const BASE Ajj_real = CONST_REAL(A, j * lda + j);
+ const BASE Ajj_imag = CONST_IMAG(A, j * lda + j);
+ REAL(C, i * ldc + j) += temp1_real * Ajj_real - temp1_imag * Ajj_imag;
+ IMAG(C, i * ldc + j) += temp1_real * Ajj_imag + temp1_imag * Ajj_real;
+ }
+ for (k = j + 1; k < n2; k++) {
+ const BASE Ajk_real = CONST_REAL(A, j * lda + k);
+ const BASE Ajk_imag = CONST_IMAG(A, j * lda + k);
+ const BASE Bik_real = CONST_REAL(B, ldb * i + k);
+ const BASE Bik_imag = CONST_IMAG(B, ldb * i + k);
+ REAL(C, i * ldc + k) += temp1_real * Ajk_real - temp1_imag * Ajk_imag;
+ IMAG(C, i * ldc + k) += temp1_real * Ajk_imag + temp1_imag * Ajk_real;
+ temp2_real += Bik_real * Ajk_real - Bik_imag * Ajk_imag;
+ temp2_imag += Bik_real * Ajk_imag + Bik_imag * Ajk_real;
+ }
+ REAL(C, i * ldc + j) += alpha_real * temp2_real - alpha_imag * temp2_imag;
+ IMAG(C, i * ldc + j) += alpha_real * temp2_imag + alpha_imag * temp2_real;
+ }
+ }
+
+ } else if (side == CblasRight && uplo == CblasLower) {
+
+ /* form C := alpha*B*A + C */
+
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ const BASE Bij_real = CONST_REAL(B, ldb * i + j);
+ const BASE Bij_imag = CONST_IMAG(B, ldb * i + j);
+ const BASE temp1_real = alpha_real * Bij_real - alpha_imag * Bij_imag;
+ const BASE temp1_imag = alpha_real * Bij_imag + alpha_imag * Bij_real;
+ BASE temp2_real = 0.0;
+ BASE temp2_imag = 0.0;
+ for (k = 0; k < j; k++) {
+ const BASE Ajk_real = CONST_REAL(A, j * lda + k);
+ const BASE Ajk_imag = CONST_IMAG(A, j * lda + k);
+ const BASE Bik_real = CONST_REAL(B, ldb * i + k);
+ const BASE Bik_imag = CONST_IMAG(B, ldb * i + k);
+ REAL(C, i * ldc + k) += temp1_real * Ajk_real - temp1_imag * Ajk_imag;
+ IMAG(C, i * ldc + k) += temp1_real * Ajk_imag + temp1_imag * Ajk_real;
+ temp2_real += Bik_real * Ajk_real - Bik_imag * Ajk_imag;
+ temp2_imag += Bik_real * Ajk_imag + Bik_imag * Ajk_real;
+ }
+ {
+ const BASE Ajj_real = CONST_REAL(A, j * lda + j);
+ const BASE Ajj_imag = CONST_IMAG(A, j * lda + j);
+ REAL(C, i * ldc + j) += temp1_real * Ajj_real - temp1_imag * Ajj_imag;
+ IMAG(C, i * ldc + j) += temp1_real * Ajj_imag + temp1_imag * Ajj_real;
+ }
+ REAL(C, i * ldc + j) += alpha_real * temp2_real - alpha_imag * temp2_imag;
+ IMAG(C, i * ldc + j) += alpha_real * temp2_imag + alpha_imag * temp2_real;
+ }
+ }
+
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+}
diff --git a/gsl-1.9/cblas/source_symm_r.h b/gsl-1.9/cblas/source_symm_r.h
new file mode 100644
index 0000000..39b1958
--- /dev/null
+++ b/gsl-1.9/cblas/source_symm_r.h
@@ -0,0 +1,131 @@
+/* blas/source_symm_r.h
+ *
+ * Copyright (C) 2001 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i, j, k;
+ INDEX n1, n2;
+ int uplo, side;
+
+ if (alpha == 0.0 && beta == 1.0)
+ return;
+
+ if (Order == CblasRowMajor) {
+ n1 = M;
+ n2 = N;
+ uplo = Uplo;
+ side = Side;
+ } else {
+ n1 = N;
+ n2 = M;
+ uplo = (Uplo == CblasUpper) ? CblasLower : CblasUpper;
+ side = (Side == CblasLeft) ? CblasRight : CblasLeft;
+ }
+
+ /* form y := beta*y */
+ if (beta == 0.0) {
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ C[ldc * i + j] = 0.0;
+ }
+ }
+ } else if (beta != 1.0) {
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ C[ldc * i + j] *= beta;
+ }
+ }
+ }
+
+ if (alpha == 0.0)
+ return;
+
+ if (side == CblasLeft && uplo == CblasUpper) {
+
+ /* form C := alpha*A*B + C */
+
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ const BASE temp1 = alpha * B[ldb * i + j];
+ BASE temp2 = 0.0;
+ C[i * ldc + j] += temp1 * A[i * lda + i];
+ for (k = i + 1; k < n1; k++) {
+ const BASE Aik = A[i * lda + k];
+ C[k * ldc + j] += Aik * temp1;
+ temp2 += Aik * B[ldb * k + j];
+ }
+ C[i * ldc + j] += alpha * temp2;
+ }
+ }
+
+ } else if (side == CblasLeft && uplo == CblasLower) {
+
+ /* form C := alpha*A*B + C */
+
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ const BASE temp1 = alpha * B[ldb * i + j];
+ BASE temp2 = 0.0;
+ for (k = 0; k < i; k++) {
+ const BASE Aik = A[i * lda + k];
+ C[k * ldc + j] += Aik * temp1;
+ temp2 += Aik * B[ldb * k + j];
+ }
+ C[i * ldc + j] += temp1 * A[i * lda + i] + alpha * temp2;
+ }
+ }
+
+ } else if (side == CblasRight && uplo == CblasUpper) {
+
+ /* form C := alpha*B*A + C */
+
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ const BASE temp1 = alpha * B[ldb * i + j];
+ BASE temp2 = 0.0;
+ C[i * ldc + j] += temp1 * A[j * lda + j];
+ for (k = j + 1; k < n2; k++) {
+ const BASE Ajk = A[j * lda + k];
+ C[i * ldc + k] += temp1 * Ajk;
+ temp2 += B[ldb * i + k] * Ajk;
+ }
+ C[i * ldc + j] += alpha * temp2;
+ }
+ }
+
+ } else if (side == CblasRight && uplo == CblasLower) {
+
+ /* form C := alpha*B*A + C */
+
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ const BASE temp1 = alpha * B[ldb * i + j];
+ BASE temp2 = 0.0;
+ for (k = 0; k < j; k++) {
+ const BASE Ajk = A[j * lda + k];
+ C[i * ldc + k] += temp1 * Ajk;
+ temp2 += B[ldb * i + k] * Ajk;
+ }
+ C[i * ldc + j] += temp1 * A[j * lda + j] + alpha * temp2;
+ }
+ }
+
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+}
diff --git a/gsl-1.9/cblas/source_symv.h b/gsl-1.9/cblas/source_symv.h
new file mode 100644
index 0000000..57bf302
--- /dev/null
+++ b/gsl-1.9/cblas/source_symv.h
@@ -0,0 +1,93 @@
+/* blas/source_symv.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i, j;
+
+ if (alpha == 0.0 && beta == 1.0)
+ return;
+
+ /* form y := beta*y */
+ if (beta == 0.0) {
+ INDEX iy = OFFSET(N, incY);
+ for (i = 0; i < N; i++) {
+ Y[iy] = 0.0;
+ iy += incY;
+ }
+ } else if (beta != 1.0) {
+ INDEX iy = OFFSET(N, incY);
+ for (i = 0; i < N; i++) {
+ Y[iy] *= beta;
+ iy += incY;
+ }
+ }
+
+ if (alpha == 0.0)
+ return;
+
+ /* form y := alpha*A*x + y */
+
+ if ((order == CblasRowMajor && Uplo == CblasUpper)
+ || (order == CblasColMajor && Uplo == CblasLower)) {
+ INDEX ix = OFFSET(N, incX);
+ INDEX iy = OFFSET(N, incY);
+ for (i = 0; i < N; i++) {
+ BASE temp1 = alpha * X[ix];
+ BASE temp2 = 0.0;
+ const INDEX j_min = i + 1;
+ const INDEX j_max = N;
+ INDEX jx = OFFSET(N, incX) + j_min * incX;
+ INDEX jy = OFFSET(N, incY) + j_min * incY;
+ Y[iy] += temp1 * A[lda * i + i];
+ for (j = j_min; j < j_max; j++) {
+ Y[jy] += temp1 * A[lda * i + j];
+ temp2 += X[jx] * A[lda * i + j];
+ jx += incX;
+ jy += incY;
+ }
+ Y[iy] += alpha * temp2;
+ ix += incX;
+ iy += incY;
+ }
+ } else if ((order == CblasRowMajor && Uplo == CblasLower)
+ || (order == CblasColMajor && Uplo == CblasUpper)) {
+ INDEX ix = OFFSET(N, incX) + (N - 1) * incX;
+ INDEX iy = OFFSET(N, incY) + (N - 1) * incY;
+ for (i = N; i > 0 && i--;) {
+ BASE temp1 = alpha * X[ix];
+ BASE temp2 = 0.0;
+ const INDEX j_min = 0;
+ const INDEX j_max = i;
+ INDEX jx = OFFSET(N, incX) + j_min * incX;
+ INDEX jy = OFFSET(N, incY) + j_min * incY;
+ Y[iy] += temp1 * A[lda * i + i];
+ for (j = j_min; j < j_max; j++) {
+ Y[jy] += temp1 * A[lda * i + j];
+ temp2 += X[jx] * A[lda * i + j];
+ jx += incX;
+ jy += incY;
+ }
+ Y[iy] += alpha * temp2;
+ ix -= incX;
+ iy -= incY;
+ }
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+}
diff --git a/gsl-1.9/cblas/source_syr.h b/gsl-1.9/cblas/source_syr.h
new file mode 100644
index 0000000..9d5584b
--- /dev/null
+++ b/gsl-1.9/cblas/source_syr.h
@@ -0,0 +1,56 @@
+/* blas/source_syr.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i, j;
+
+ if (N == 0)
+ return;
+
+ if (alpha == 0.0)
+ return;
+
+ if ((order == CblasRowMajor && Uplo == CblasUpper)
+ || (order == CblasColMajor && Uplo == CblasLower)) {
+ INDEX ix = OFFSET(N, incX);
+ for (i = 0; i < N; i++) {
+ const BASE tmp = alpha * X[ix];
+ INDEX jx = ix;
+ for (j = i; j < N; j++) {
+ A[lda * i + j] += X[jx] * tmp;
+ jx += incX;
+ }
+ ix += incX;
+ }
+ } else if ((order == CblasRowMajor && Uplo == CblasLower)
+ || (order == CblasColMajor && Uplo == CblasUpper)) {
+ INDEX ix = OFFSET(N, incX);
+ for (i = 0; i < N; i++) {
+ const BASE tmp = alpha * X[ix];
+ INDEX jx = OFFSET(N, incX);
+ for (j = 0; j <= i; j++) {
+ A[lda * i + j] += X[jx] * tmp;
+ jx += incX;
+ }
+ ix += incX;
+ }
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+}
diff --git a/gsl-1.9/cblas/source_syr2.h b/gsl-1.9/cblas/source_syr2.h
new file mode 100644
index 0000000..5bf2cab
--- /dev/null
+++ b/gsl-1.9/cblas/source_syr2.h
@@ -0,0 +1,66 @@
+/* blas/source_syr2.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i, j;
+
+ if (N == 0)
+ return;
+
+ if (alpha == 0.0)
+ return;
+
+ if ((order == CblasRowMajor && Uplo == CblasUpper)
+ || (order == CblasColMajor && Uplo == CblasLower)) {
+ INDEX ix = OFFSET(N, incX);
+ INDEX iy = OFFSET(N, incY);
+ for (i = 0; i < N; i++) {
+ const BASE tmp1 = alpha * X[ix];
+ const BASE tmp2 = alpha * Y[iy];
+ INDEX jx = ix;
+ INDEX jy = iy;
+ for (j = i; j < N; j++) {
+ A[lda * i + j] += tmp1 * Y[jy] + tmp2 * X[jx];
+ jx += incX;
+ jy += incY;
+ }
+ ix += incX;
+ iy += incY;
+ }
+ } else if ((order == CblasRowMajor && Uplo == CblasLower)
+ || (order == CblasColMajor && Uplo == CblasUpper)) {
+ INDEX ix = OFFSET(N, incX);
+ INDEX iy = OFFSET(N, incY);
+ for (i = 0; i < N; i++) {
+ const BASE tmp1 = alpha * X[ix];
+ const BASE tmp2 = alpha * Y[iy];
+ INDEX jx = OFFSET(N, incX);
+ INDEX jy = OFFSET(N, incY);
+ for (j = 0; j <= i; j++) {
+ A[lda * i + j] += tmp1 * Y[jy] + tmp2 * X[jx];
+ jx += incX;
+ jy += incY;
+ }
+ ix += incX;
+ iy += incY;
+ }
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+}
diff --git a/gsl-1.9/cblas/source_syr2k_c.h b/gsl-1.9/cblas/source_syr2k_c.h
new file mode 100644
index 0000000..b49320e
--- /dev/null
+++ b/gsl-1.9/cblas/source_syr2k_c.h
@@ -0,0 +1,190 @@
+/* blas/source_syr2k_c.h
+ *
+ * Copyright (C) 2001 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i, j, k;
+ int uplo, trans;
+
+ const BASE alpha_real = CONST_REAL0(alpha);
+ const BASE alpha_imag = CONST_IMAG0(alpha);
+ const BASE beta_real = CONST_REAL0(beta);
+ const BASE beta_imag = CONST_IMAG0(beta);
+
+ if ((alpha_real == 0.0 && alpha_imag == 0.0)
+ && (beta_real == 1.0 && beta_imag == 0.0))
+ return;
+
+ if (Order == CblasRowMajor) {
+ uplo = Uplo;
+ trans = Trans;
+ } else {
+ uplo = (Uplo == CblasUpper) ? CblasLower : CblasUpper;
+ trans = (Trans == CblasNoTrans) ? CblasTrans : CblasNoTrans;
+ }
+
+ /* form C := beta*C */
+
+ if (beta_real == 0.0 && beta_imag == 0.0) {
+ if (uplo == CblasUpper) {
+ for (i = 0; i < N; i++) {
+ for (j = i; j < N; j++) {
+ REAL(C, ldc * i + j) = 0.0;
+ IMAG(C, ldc * i + j) = 0.0;
+ }
+ }
+ } else {
+ for (i = 0; i < N; i++) {
+ for (j = 0; j <= i; j++) {
+ REAL(C, ldc * i + j) = 0.0;
+ IMAG(C, ldc * i + j) = 0.0;
+ }
+ }
+ }
+ } else if (!(beta_real == 1.0 && beta_imag == 0.0)) {
+ if (uplo == CblasUpper) {
+ for (i = 0; i < N; i++) {
+ for (j = i; j < N; j++) {
+ const BASE Cij_real = REAL(C, ldc * i + j);
+ const BASE Cij_imag = IMAG(C, ldc * i + j);
+ REAL(C, ldc * i + j) = beta_real * Cij_real - beta_imag * Cij_imag;
+ IMAG(C, ldc * i + j) = beta_real * Cij_imag + beta_imag * Cij_real;
+ }
+ }
+ } else {
+ for (i = 0; i < N; i++) {
+ for (j = 0; j <= i; j++) {
+ const BASE Cij_real = REAL(C, ldc * i + j);
+ const BASE Cij_imag = IMAG(C, ldc * i + j);
+ REAL(C, ldc * i + j) = beta_real * Cij_real - beta_imag * Cij_imag;
+ IMAG(C, ldc * i + j) = beta_real * Cij_imag + beta_imag * Cij_real;
+ }
+ }
+ }
+ }
+
+
+ if (alpha_real == 0.0 && alpha_imag == 0.0)
+ return;
+
+ if (uplo == CblasUpper && trans == CblasNoTrans) {
+
+ for (i = 0; i < N; i++) {
+ for (j = i; j < N; j++) {
+ BASE temp_real = 0.0;
+ BASE temp_imag = 0.0;
+ for (k = 0; k < K; k++) {
+ const BASE Aik_real = CONST_REAL(A, i * lda + k);
+ const BASE Aik_imag = CONST_IMAG(A, i * lda + k);
+ const BASE Bik_real = CONST_REAL(B, i * ldb + k);
+ const BASE Bik_imag = CONST_IMAG(B, i * ldb + k);
+ const BASE Ajk_real = CONST_REAL(A, j * lda + k);
+ const BASE Ajk_imag = CONST_IMAG(A, j * lda + k);
+ const BASE Bjk_real = CONST_REAL(B, j * ldb + k);
+ const BASE Bjk_imag = CONST_IMAG(B, j * ldb + k);
+ temp_real += ((Aik_real * Bjk_real - Aik_imag * Bjk_imag)
+ + (Bik_real * Ajk_real - Bik_imag * Ajk_imag));
+ temp_imag += ((Aik_real * Bjk_imag + Aik_imag * Bjk_real)
+ + (Bik_real * Ajk_imag + Bik_imag * Ajk_real));
+ }
+ REAL(C, i * ldc + j) += alpha_real * temp_real - alpha_imag * temp_imag;
+ IMAG(C, i * ldc + j) += alpha_real * temp_imag + alpha_imag * temp_real;
+ }
+ }
+
+ } else if (uplo == CblasUpper && trans == CblasTrans) {
+
+ for (k = 0; k < K; k++) {
+ for (i = 0; i < N; i++) {
+ BASE Aki_real = CONST_REAL(A, k * lda + i);
+ BASE Aki_imag = CONST_IMAG(A, k * lda + i);
+ BASE Bki_real = CONST_REAL(B, k * ldb + i);
+ BASE Bki_imag = CONST_IMAG(B, k * ldb + i);
+ BASE temp1_real = alpha_real * Aki_real - alpha_imag * Aki_imag;
+ BASE temp1_imag = alpha_real * Aki_imag + alpha_imag * Aki_real;
+ BASE temp2_real = alpha_real * Bki_real - alpha_imag * Bki_imag;
+ BASE temp2_imag = alpha_real * Bki_imag + alpha_imag * Bki_real;
+ for (j = i; j < N; j++) {
+ BASE Akj_real = CONST_REAL(A, k * lda + j);
+ BASE Akj_imag = CONST_IMAG(A, k * lda + j);
+ BASE Bkj_real = CONST_REAL(B, k * ldb + j);
+ BASE Bkj_imag = CONST_IMAG(B, k * ldb + j);
+ REAL(C, i * lda + j) += (temp1_real * Bkj_real - temp1_imag * Bkj_imag)
+ + (temp2_real * Akj_real - temp2_imag * Akj_imag);
+ IMAG(C, i * lda + j) += (temp1_real * Bkj_imag + temp1_imag * Bkj_real)
+ + (temp2_real * Akj_imag + temp2_imag * Akj_real);
+ }
+ }
+ }
+
+ } else if (uplo == CblasLower && trans == CblasNoTrans) {
+
+
+ for (i = 0; i < N; i++) {
+ for (j = 0; j <= i; j++) {
+ BASE temp_real = 0.0;
+ BASE temp_imag = 0.0;
+ for (k = 0; k < K; k++) {
+ const BASE Aik_real = CONST_REAL(A, i * lda + k);
+ const BASE Aik_imag = CONST_IMAG(A, i * lda + k);
+ const BASE Bik_real = CONST_REAL(B, i * ldb + k);
+ const BASE Bik_imag = CONST_IMAG(B, i * ldb + k);
+ const BASE Ajk_real = CONST_REAL(A, j * lda + k);
+ const BASE Ajk_imag = CONST_IMAG(A, j * lda + k);
+ const BASE Bjk_real = CONST_REAL(B, j * ldb + k);
+ const BASE Bjk_imag = CONST_IMAG(B, j * ldb + k);
+ temp_real += ((Aik_real * Bjk_real - Aik_imag * Bjk_imag)
+ + (Bik_real * Ajk_real - Bik_imag * Ajk_imag));
+ temp_imag += ((Aik_real * Bjk_imag + Aik_imag * Bjk_real)
+ + (Bik_real * Ajk_imag + Bik_imag * Ajk_real));
+ }
+ REAL(C, i * ldc + j) += alpha_real * temp_real - alpha_imag * temp_imag;
+ IMAG(C, i * ldc + j) += alpha_real * temp_imag + alpha_imag * temp_real;
+ }
+ }
+
+ } else if (uplo == CblasLower && trans == CblasTrans) {
+
+ for (k = 0; k < K; k++) {
+ for (i = 0; i < N; i++) {
+ BASE Aki_real = CONST_REAL(A, k * lda + i);
+ BASE Aki_imag = CONST_IMAG(A, k * lda + i);
+ BASE Bki_real = CONST_REAL(B, k * ldb + i);
+ BASE Bki_imag = CONST_IMAG(B, k * ldb + i);
+ BASE temp1_real = alpha_real * Aki_real - alpha_imag * Aki_imag;
+ BASE temp1_imag = alpha_real * Aki_imag + alpha_imag * Aki_real;
+ BASE temp2_real = alpha_real * Bki_real - alpha_imag * Bki_imag;
+ BASE temp2_imag = alpha_real * Bki_imag + alpha_imag * Bki_real;
+ for (j = 0; j <= i; j++) {
+ BASE Akj_real = CONST_REAL(A, k * lda + j);
+ BASE Akj_imag = CONST_IMAG(A, k * lda + j);
+ BASE Bkj_real = CONST_REAL(B, k * ldb + j);
+ BASE Bkj_imag = CONST_IMAG(B, k * ldb + j);
+ REAL(C, i * lda + j) += (temp1_real * Bkj_real - temp1_imag * Bkj_imag)
+ + (temp2_real * Akj_real - temp2_imag * Akj_imag);
+ IMAG(C, i * lda + j) += (temp1_real * Bkj_imag + temp1_imag * Bkj_real)
+ + (temp2_real * Akj_imag + temp2_imag * Akj_real);
+ }
+ }
+ }
+
+
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+}
diff --git a/gsl-1.9/cblas/source_syr2k_r.h b/gsl-1.9/cblas/source_syr2k_r.h
new file mode 100644
index 0000000..866acc0
--- /dev/null
+++ b/gsl-1.9/cblas/source_syr2k_r.h
@@ -0,0 +1,129 @@
+/* blas/source_syr2k_r.h
+ *
+ * Copyright (C) 2001 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i, j, k;
+ int uplo, trans;
+
+ if (alpha == 0.0 && beta == 1.0)
+ return;
+
+ if (Order == CblasRowMajor) {
+ uplo = Uplo;
+ trans = (Trans == CblasConjTrans) ? CblasTrans : Trans;
+ } else {
+ uplo = (Uplo == CblasUpper) ? CblasLower : CblasUpper;
+
+ if (Trans == CblasTrans || Trans == CblasConjTrans) {
+ trans = CblasNoTrans;
+ } else {
+ trans = CblasTrans;
+ }
+ }
+
+ /* form C := beta*C */
+ if (beta == 0.0) {
+ if (uplo == CblasUpper) {
+ for (i = 0; i < N; i++) {
+ for (j = i; j < N; j++) {
+ C[ldc * i + j] = 0.0;
+ }
+ }
+ } else {
+ for (i = 0; i < N; i++) {
+ for (j = 0; j <= i; j++) {
+ C[ldc * i + j] = 0.0;
+ }
+ }
+ }
+ } else if (beta != 1.0) {
+ if (uplo == CblasUpper) {
+ for (i = 0; i < N; i++) {
+ for (j = i; j < N; j++) {
+ C[ldc * i + j] *= beta;
+ }
+ }
+ } else {
+ for (i = 0; i < N; i++) {
+ for (j = 0; j <= i; j++) {
+ C[ldc * i + j] *= beta;
+ }
+ }
+ }
+ }
+
+ if (alpha == 0.0)
+ return;
+
+ if (uplo == CblasUpper && trans == CblasNoTrans) {
+
+ for (i = 0; i < N; i++) {
+ for (j = i; j < N; j++) {
+ BASE temp = 0.0;
+ for (k = 0; k < K; k++) {
+ temp += (A[i * lda + k] * B[j * ldb + k]
+ + B[i * ldb + k] * A[j * lda + k]);
+ }
+ C[i * ldc + j] += alpha * temp;
+ }
+ }
+
+ } else if (uplo == CblasUpper && trans == CblasTrans) {
+
+ for (k = 0; k < K; k++) {
+ for (i = 0; i < N; i++) {
+ BASE temp1 = alpha * A[k * lda + i];
+ BASE temp2 = alpha * B[k * ldb + i];
+ for (j = i; j < N; j++) {
+ C[i * lda + j] += temp1 * B[k * ldb + j] + temp2 * A[k * lda + j];
+ }
+ }
+ }
+
+ } else if (uplo == CblasLower && trans == CblasNoTrans) {
+
+
+ for (i = 0; i < N; i++) {
+ for (j = 0; j <= i; j++) {
+ BASE temp = 0.0;
+ for (k = 0; k < K; k++) {
+ temp += (A[i * lda + k] * B[j * ldb + k]
+ + B[i * ldb + k] * A[j * lda + k]);
+ }
+ C[i * ldc + j] += alpha * temp;
+ }
+ }
+
+ } else if (uplo == CblasLower && trans == CblasTrans) {
+
+ for (k = 0; k < K; k++) {
+ for (i = 0; i < N; i++) {
+ BASE temp1 = alpha * A[k * lda + i];
+ BASE temp2 = alpha * B[k * ldb + i];
+ for (j = 0; j <= i; j++) {
+ C[i * lda + j] += temp1 * B[k * ldb + j] + temp2 * A[k * lda + j];
+ }
+ }
+ }
+
+
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+}
diff --git a/gsl-1.9/cblas/source_syrk_c.h b/gsl-1.9/cblas/source_syrk_c.h
new file mode 100644
index 0000000..97dcc20
--- /dev/null
+++ b/gsl-1.9/cblas/source_syrk_c.h
@@ -0,0 +1,164 @@
+/* blas/source_syrk_r.h
+ *
+ * Copyright (C) 2001 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i, j, k;
+ int uplo, trans;
+
+ const BASE alpha_real = CONST_REAL0(alpha);
+ const BASE alpha_imag = CONST_IMAG0(alpha);
+
+ const BASE beta_real = CONST_REAL0(beta);
+ const BASE beta_imag = CONST_IMAG0(beta);
+
+ if ((alpha_real == 0.0 && alpha_imag == 0.0)
+ && (beta_real == 1.0 && beta_imag == 0.0))
+ return;
+
+ if (Order == CblasRowMajor) {
+ uplo = Uplo;
+ /* FIXME: original blas does not make distinction between Trans and ConjTrans?? */
+ trans = (Trans == CblasNoTrans) ? CblasNoTrans : CblasTrans;
+ } else {
+ uplo = (Uplo == CblasUpper) ? CblasLower : CblasUpper;
+ trans = (Trans == CblasNoTrans) ? CblasTrans : CblasNoTrans;
+ }
+
+ /* form y := beta*y */
+ if (beta_real == 0.0 && beta_imag == 0.0) {
+ if (uplo == CblasUpper) {
+ for (i = 0; i < N; i++) {
+ for (j = i; j < N; j++) {
+ REAL(C, ldc * i + j) = 0.0;
+ IMAG(C, ldc * i + j) = 0.0;
+ }
+ }
+ } else {
+ for (i = 0; i < N; i++) {
+ for (j = 0; j <= i; j++) {
+ REAL(C, ldc * i + j) = 0.0;
+ IMAG(C, ldc * i + j) = 0.0;
+ }
+ }
+ }
+ } else if (!(beta_real == 1.0 && beta_imag == 0.0)) {
+ if (uplo == CblasUpper) {
+ for (i = 0; i < N; i++) {
+ for (j = i; j < N; j++) {
+ const BASE Cij_real = REAL(C, ldc * i + j);
+ const BASE Cij_imag = IMAG(C, ldc * i + j);
+ REAL(C, ldc * i + j) = beta_real * Cij_real - beta_imag * Cij_imag;
+ IMAG(C, ldc * i + j) = beta_real * Cij_imag + beta_imag * Cij_real;
+ }
+ }
+ } else {
+ for (i = 0; i < N; i++) {
+ for (j = 0; j <= i; j++) {
+ const BASE Cij_real = REAL(C, ldc * i + j);
+ const BASE Cij_imag = IMAG(C, ldc * i + j);
+ REAL(C, ldc * i + j) = beta_real * Cij_real - beta_imag * Cij_imag;
+ IMAG(C, ldc * i + j) = beta_real * Cij_imag + beta_imag * Cij_real;
+ }
+ }
+ }
+ }
+
+ if (alpha_real == 0.0 && alpha_imag == 0.0)
+ return;
+
+ if (uplo == CblasUpper && trans == CblasNoTrans) {
+
+ for (i = 0; i < N; i++) {
+ for (j = i; j < N; j++) {
+ BASE temp_real = 0.0;
+ BASE temp_imag = 0.0;
+ for (k = 0; k < K; k++) {
+ const BASE Aik_real = CONST_REAL(A, i * lda + k);
+ const BASE Aik_imag = CONST_IMAG(A, i * lda + k);
+ const BASE Ajk_real = CONST_REAL(A, j * lda + k);
+ const BASE Ajk_imag = CONST_IMAG(A, j * lda + k);
+ temp_real += Aik_real * Ajk_real - Aik_imag * Ajk_imag;
+ temp_imag += Aik_real * Ajk_imag + Aik_imag * Ajk_real;
+ }
+ REAL(C, i * ldc + j) += alpha_real * temp_real - alpha_imag * temp_imag;
+ IMAG(C, i * ldc + j) += alpha_real * temp_imag + alpha_imag * temp_real;
+ }
+ }
+
+ } else if (uplo == CblasUpper && trans == CblasTrans) {
+
+ for (i = 0; i < N; i++) {
+ for (j = i; j < N; j++) {
+ BASE temp_real = 0.0;
+ BASE temp_imag = 0.0;
+ for (k = 0; k < K; k++) {
+ const BASE Aki_real = CONST_REAL(A, k * lda + i);
+ const BASE Aki_imag = CONST_IMAG(A, k * lda + i);
+ const BASE Akj_real = CONST_REAL(A, k * lda + j);
+ const BASE Akj_imag = CONST_IMAG(A, k * lda + j);
+ temp_real += Aki_real * Akj_real - Aki_imag * Akj_imag;
+ temp_imag += Aki_real * Akj_imag + Aki_imag * Akj_real;
+ }
+ REAL(C, i * ldc + j) += alpha_real * temp_real - alpha_imag * temp_imag;
+ IMAG(C, i * ldc + j) += alpha_real * temp_imag + alpha_imag * temp_real;
+ }
+ }
+
+ } else if (uplo == CblasLower && trans == CblasNoTrans) {
+
+ for (i = 0; i < N; i++) {
+ for (j = 0; j <= i; j++) {
+ BASE temp_real = 0.0;
+ BASE temp_imag = 0.0;
+ for (k = 0; k < K; k++) {
+ const BASE Aik_real = CONST_REAL(A, i * lda + k);
+ const BASE Aik_imag = CONST_IMAG(A, i * lda + k);
+ const BASE Ajk_real = CONST_REAL(A, j * lda + k);
+ const BASE Ajk_imag = CONST_IMAG(A, j * lda + k);
+ temp_real += Aik_real * Ajk_real - Aik_imag * Ajk_imag;
+ temp_imag += Aik_real * Ajk_imag + Aik_imag * Ajk_real;
+ }
+ REAL(C, i * ldc + j) += alpha_real * temp_real - alpha_imag * temp_imag;
+ IMAG(C, i * ldc + j) += alpha_real * temp_imag + alpha_imag * temp_real;
+ }
+ }
+
+ } else if (uplo == CblasLower && trans == CblasTrans) {
+
+ for (i = 0; i < N; i++) {
+ for (j = 0; j <= i; j++) {
+ BASE temp_real = 0.0;
+ BASE temp_imag = 0.0;
+ for (k = 0; k < K; k++) {
+ const BASE Aki_real = CONST_REAL(A, k * lda + i);
+ const BASE Aki_imag = CONST_IMAG(A, k * lda + i);
+ const BASE Akj_real = CONST_REAL(A, k * lda + j);
+ const BASE Akj_imag = CONST_IMAG(A, k * lda + j);
+ temp_real += Aki_real * Akj_real - Aki_imag * Akj_imag;
+ temp_imag += Aki_real * Akj_imag + Aki_imag * Akj_real;
+ }
+ REAL(C, i * ldc + j) += alpha_real * temp_real - alpha_imag * temp_imag;
+ IMAG(C, i * ldc + j) += alpha_real * temp_imag + alpha_imag * temp_real;
+ }
+ }
+
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+}
diff --git a/gsl-1.9/cblas/source_syrk_r.h b/gsl-1.9/cblas/source_syrk_r.h
new file mode 100644
index 0000000..e245ea7
--- /dev/null
+++ b/gsl-1.9/cblas/source_syrk_r.h
@@ -0,0 +1,125 @@
+/* blas/source_syrk_r.h
+ *
+ * Copyright (C) 2001 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i, j, k;
+ int uplo, trans;
+
+ if (alpha == 0.0 && beta == 1.0)
+ return;
+
+ if (Order == CblasRowMajor) {
+ uplo = Uplo;
+ trans = (Trans == CblasConjTrans) ? CblasTrans : Trans;
+ } else {
+ uplo = (Uplo == CblasUpper) ? CblasLower : CblasUpper;
+
+ if (Trans == CblasTrans || Trans == CblasConjTrans) {
+ trans = CblasNoTrans;
+ } else {
+ trans = CblasTrans;
+ }
+ }
+
+ /* form y := beta*y */
+ if (beta == 0.0) {
+ if (uplo == CblasUpper) {
+ for (i = 0; i < N; i++) {
+ for (j = i; j < N; j++) {
+ C[ldc * i + j] = 0.0;
+ }
+ }
+ } else {
+ for (i = 0; i < N; i++) {
+ for (j = 0; j <= i; j++) {
+ C[ldc * i + j] = 0.0;
+ }
+ }
+ }
+ } else if (beta != 1.0) {
+ if (uplo == CblasUpper) {
+ for (i = 0; i < N; i++) {
+ for (j = i; j < N; j++) {
+ C[ldc * i + j] *= beta;
+ }
+ }
+ } else {
+ for (i = 0; i < N; i++) {
+ for (j = 0; j <= i; j++) {
+ C[ldc * i + j] *= beta;
+ }
+ }
+ }
+ }
+
+ if (alpha == 0.0)
+ return;
+
+ if (uplo == CblasUpper && trans == CblasNoTrans) {
+
+ for (i = 0; i < N; i++) {
+ for (j = i; j < N; j++) {
+ BASE temp = 0.0;
+ for (k = 0; k < K; k++) {
+ temp += A[i * lda + k] * A[j * lda + k];
+ }
+ C[i * ldc + j] += alpha * temp;
+ }
+ }
+
+ } else if (uplo == CblasUpper && trans == CblasTrans) {
+
+ for (i = 0; i < N; i++) {
+ for (j = i; j < N; j++) {
+ BASE temp = 0.0;
+ for (k = 0; k < K; k++) {
+ temp += A[k * lda + i] * A[k * lda + j];
+ }
+ C[i * ldc + j] += alpha * temp;
+ }
+ }
+
+ } else if (uplo == CblasLower && trans == CblasNoTrans) {
+
+ for (i = 0; i < N; i++) {
+ for (j = 0; j <= i; j++) {
+ BASE temp = 0.0;
+ for (k = 0; k < K; k++) {
+ temp += A[i * lda + k] * A[j * lda + k];
+ }
+ C[i * ldc + j] += alpha * temp;
+ }
+ }
+
+ } else if (uplo == CblasLower && trans == CblasTrans) {
+
+ for (i = 0; i < N; i++) {
+ for (j = 0; j <= i; j++) {
+ BASE temp = 0.0;
+ for (k = 0; k < K; k++) {
+ temp += A[k * lda + i] * A[k * lda + j];
+ }
+ C[i * ldc + j] += alpha * temp;
+ }
+ }
+
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+}
diff --git a/gsl-1.9/cblas/source_tbmv_c.h b/gsl-1.9/cblas/source_tbmv_c.h
new file mode 100644
index 0000000..b0a4fac
--- /dev/null
+++ b/gsl-1.9/cblas/source_tbmv_c.h
@@ -0,0 +1,171 @@
+/* blas/source_tbmv_c.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ const int conj = (TransA == CblasConjTrans) ? -1 : 1;
+ const int Trans = (TransA != CblasConjTrans) ? TransA : CblasTrans;
+ const int nonunit = (Diag == CblasNonUnit);
+ INDEX i, j;
+
+
+ if ((order == CblasRowMajor && Trans == CblasNoTrans && Uplo == CblasUpper)
+ || (order == CblasColMajor && Trans == CblasTrans && Uplo == CblasLower)) {
+ /* form x := A*x */
+
+ INDEX ix = OFFSET(N, incX);
+ for (i = 0; i < N; i++) {
+ BASE temp_r = 0.0;
+ BASE temp_i = 0.0;
+ const INDEX j_min = i + 1;
+ const INDEX j_max = GSL_MIN(N, i + K + 1);
+ INDEX jx = OFFSET(N, incX) + incX * j_min;
+ for (j = j_min; j < j_max; j++) {
+ const BASE x_real = REAL(X, jx);
+ const BASE x_imag = IMAG(X, jx);
+ const BASE A_real = CONST_REAL(A, lda * i + (j - i));
+ const BASE A_imag = conj * CONST_IMAG(A, lda * i + (j - i));
+
+ temp_r += A_real * x_real - A_imag * x_imag;
+ temp_i += A_real * x_imag + A_imag * x_real;
+
+ jx += incX;
+ }
+ if (nonunit) {
+ const BASE x_real = REAL(X, ix);
+ const BASE x_imag = IMAG(X, ix);
+ const BASE A_real = CONST_REAL(A, lda * i + 0);
+ const BASE A_imag = conj * CONST_IMAG(A, lda * i + 0);
+
+ REAL(X, ix) = temp_r + (A_real * x_real - A_imag * x_imag);
+ IMAG(X, ix) = temp_i + (A_real * x_imag + A_imag * x_real);
+ } else {
+ REAL(X, ix) += temp_r;
+ IMAG(X, ix) += temp_i;
+ }
+ ix += incX;
+ }
+ } else if ((order == CblasRowMajor && Trans == CblasNoTrans && Uplo == CblasLower)
+ || (order == CblasColMajor && Trans == CblasTrans && Uplo == CblasUpper)) {
+ INDEX ix = OFFSET(N, incX) + (N - 1) * incX;
+
+ for (i = N; i > 0 && i--;) { /* N-1 ... 0 */
+ BASE temp_r = 0.0;
+ BASE temp_i = 0.0;
+ const INDEX j_min = (K > i ? 0 : i - K);
+ const INDEX j_max = i;
+ INDEX jx = OFFSET(N, incX) + j_min * incX;
+ for (j = j_min; j < j_max; j++) {
+ const BASE x_real = REAL(X, jx);
+ const BASE x_imag = IMAG(X, jx);
+ const BASE A_real = CONST_REAL(A, lda * i + (K - i + j));
+ const BASE A_imag = conj * CONST_IMAG(A, lda * i + (K - i + j));
+
+ temp_r += A_real * x_real - A_imag * x_imag;
+ temp_i += A_real * x_imag + A_imag * x_real;
+
+ jx += incX;
+ }
+ if (nonunit) {
+ const BASE x_real = REAL(X, ix);
+ const BASE x_imag = IMAG(X, ix);
+ const BASE A_real = CONST_REAL(A, lda * i + K);
+ const BASE A_imag = conj * CONST_IMAG(A, lda * i + K);
+
+ REAL(X, ix) = temp_r + (A_real * x_real - A_imag * x_imag);
+ IMAG(X, ix) = temp_i + (A_real * x_imag + A_imag * x_real);
+ } else {
+ REAL(X, ix) += temp_r;
+ IMAG(X, ix) += temp_i;
+ }
+ ix -= incX;
+ }
+ } else if ((order == CblasRowMajor && Trans == CblasTrans && Uplo == CblasUpper)
+ || (order == CblasColMajor && Trans == CblasNoTrans && Uplo == CblasLower)) {
+ /* form x := A'*x */
+
+ INDEX ix = OFFSET(N, incX) + (N - 1) * incX;
+ for (i = N; i > 0 && i--;) { /* N-1 ... 0 */
+ BASE temp_r = 0.0;
+ BASE temp_i = 0.0;
+ const INDEX j_min = (K > i ? 0 : i - K);
+ const INDEX j_max = i;
+ INDEX jx = OFFSET(N, incX) + j_min * incX;
+ for (j = j_min; j < j_max; j++) {
+ const BASE x_real = REAL(X, jx);
+ const BASE x_imag = IMAG(X, jx);
+ const BASE A_real = CONST_REAL(A, lda * j + (i - j));
+ const BASE A_imag = conj * CONST_IMAG(A, lda * j + (i - j));
+
+ temp_r += A_real * x_real - A_imag * x_imag;
+ temp_i += A_real * x_imag + A_imag * x_real;
+
+ jx += incX;
+ }
+ if (nonunit) {
+ const BASE x_real = REAL(X, ix);
+ const BASE x_imag = IMAG(X, ix);
+ const BASE A_real = CONST_REAL(A, lda * i + 0);
+ const BASE A_imag = conj * CONST_IMAG(A, lda * i + 0);
+
+ REAL(X, ix) = temp_r + (A_real * x_real - A_imag * x_imag);
+ IMAG(X, ix) = temp_i + (A_real * x_imag + A_imag * x_real);
+ } else {
+ REAL(X, ix) += temp_r;
+ IMAG(X, ix) += temp_i;
+ }
+ ix -= incX;
+ }
+ } else if ((order == CblasRowMajor && Trans == CblasTrans && Uplo == CblasLower)
+ || (order == CblasColMajor && Trans == CblasNoTrans && Uplo == CblasUpper)) {
+ INDEX ix = OFFSET(N, incX);
+ for (i = 0; i < N; i++) {
+ BASE temp_r = 0.0;
+ BASE temp_i = 0.0;
+ const INDEX j_min = i + 1;
+ const INDEX j_max = GSL_MIN(N, i + K + 1);
+ INDEX jx = OFFSET(N, incX) + j_min * incX;
+ for (j = j_min; j < j_max; j++) {
+ const BASE x_real = REAL(X, jx);
+ const BASE x_imag = IMAG(X, jx);
+ const BASE A_real = CONST_REAL(A, lda * j + (K - j + i));
+ const BASE A_imag = conj * CONST_IMAG(A, lda * j + (K - j + i));
+
+ temp_r += A_real * x_real - A_imag * x_imag;
+ temp_i += A_real * x_imag + A_imag * x_real;
+
+ jx += incX;
+ }
+ if (nonunit) {
+ const BASE x_real = REAL(X, ix);
+ const BASE x_imag = IMAG(X, ix);
+ const BASE A_real = CONST_REAL(A, lda * i + K);
+ const BASE A_imag = conj * CONST_IMAG(A, lda * i + K);
+
+ REAL(X, ix) = temp_r + (A_real * x_real - A_imag * x_imag);
+ IMAG(X, ix) = temp_i + (A_real * x_imag + A_imag * x_real);
+ } else {
+ REAL(X, ix) += temp_r;
+ IMAG(X, ix) += temp_i;
+ }
+ ix += incX;
+ }
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+}
diff --git a/gsl-1.9/cblas/source_tbmv_r.h b/gsl-1.9/cblas/source_tbmv_r.h
new file mode 100644
index 0000000..1e57ccf
--- /dev/null
+++ b/gsl-1.9/cblas/source_tbmv_r.h
@@ -0,0 +1,106 @@
+/* blas/source_tbmv_r.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i, j;
+ const int nonunit = (Diag == CblasNonUnit);
+ const int Trans = (TransA != CblasConjTrans) ? TransA : CblasTrans;
+
+ if (N == 0)
+ return;
+
+ if ((order == CblasRowMajor && Trans == CblasNoTrans && Uplo == CblasUpper)
+ || (order == CblasColMajor && Trans == CblasTrans && Uplo == CblasLower)) {
+ /* form x := A*x */
+
+ INDEX ix = OFFSET(N, incX);
+ for (i = 0; i < N; i++) {
+ BASE temp = (nonunit ? A[lda * i + 0] : 1.0) * X[ix];
+ const INDEX j_min = i + 1;
+ const INDEX j_max = GSL_MIN(N, i + K + 1);
+ INDEX jx = OFFSET(N, incX) + j_min * incX;
+
+ for (j = j_min; j < j_max; j++) {
+ temp += X[jx] * A[lda * i + (j - i)];
+ jx += incX;
+ }
+
+ X[ix] = temp;
+ ix += incX;
+ }
+ } else if ((order == CblasRowMajor && Trans == CblasNoTrans && Uplo == CblasLower)
+ || (order == CblasColMajor && Trans == CblasTrans && Uplo == CblasUpper)) {
+
+ INDEX ix = OFFSET(N, incX) + (N - 1) * incX;
+ for (i = N; i > 0 && i--;) {
+ BASE temp = (nonunit ? A[lda * i + K] : 1.0) * X[ix];
+ const INDEX j_min = (i > K ? i - K : 0);
+ const INDEX j_max = i;
+ INDEX jx = OFFSET(N, incX) + j_min * incX;
+ for (j = j_min; j < j_max; j++) {
+ temp += X[jx] * A[lda * i + (K - i + j)];
+ jx += incX;
+ }
+ X[ix] = temp;
+ ix -= incX;
+ }
+
+ } else if ((order == CblasRowMajor && Trans == CblasTrans && Uplo == CblasUpper)
+ || (order == CblasColMajor && Trans == CblasNoTrans && Uplo == CblasLower)) {
+ /* form x := A'*x */
+ INDEX ix = OFFSET(N, incX) + (N - 1) * incX;
+
+ for (i = N; i > 0 && i--;) {
+ BASE temp = 0.0;
+ const INDEX j_min = (K > i ? 0 : i - K);
+ const INDEX j_max = i;
+ INDEX jx = OFFSET(N, incX) + j_min * incX;
+ for (j = j_min; j < j_max; j++) {
+ temp += X[jx] * A[lda * j + (i - j)];
+ jx += incX;
+ }
+ if (nonunit) {
+ X[ix] = temp + X[ix] * A[lda * i + 0];
+ } else {
+ X[ix] += temp;
+ }
+ ix -= incX;
+ }
+ } else if ((order == CblasRowMajor && Trans == CblasTrans && Uplo == CblasLower)
+ || (order == CblasColMajor && Trans == CblasNoTrans && Uplo == CblasUpper)) {
+
+ INDEX ix = OFFSET(N, incX);
+ for (i = 0; i < N; i++) {
+ BASE temp = 0.0;
+ const INDEX j_min = i + 1;
+ const INDEX j_max = GSL_MIN(N, i + K + 1);
+ INDEX jx = OFFSET(N, incX) + j_min * incX;
+ for (j = j_min; j < j_max; j++) {
+ temp += X[jx] * A[lda * j + (K - j + i)];
+ jx += incX;
+ }
+ if (nonunit) {
+ X[ix] = temp + X[ix] * A[lda * i + K];
+ } else {
+ X[ix] += temp;
+ }
+ ix += incX;
+ }
+ }
+}
diff --git a/gsl-1.9/cblas/source_tbsv_c.h b/gsl-1.9/cblas/source_tbsv_c.h
new file mode 100644
index 0000000..85f0652
--- /dev/null
+++ b/gsl-1.9/cblas/source_tbsv_c.h
@@ -0,0 +1,179 @@
+/* blas/source_tbsv_c.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ const int conj = (TransA == CblasConjTrans) ? -1 : 1;
+ const int Trans = (TransA != CblasConjTrans) ? TransA : CblasTrans;
+ const int nonunit = (Diag == CblasNonUnit);
+ INDEX i, j;
+
+ if (N == 0)
+ return;
+
+ /* form x := inv( A )*x */
+
+ if ((order == CblasRowMajor && Trans == CblasNoTrans && Uplo == CblasUpper)
+ || (order == CblasColMajor && Trans == CblasTrans && Uplo == CblasLower)) {
+
+ INDEX ix = OFFSET(N, incX) + incX * (N - 1);
+
+ for (i = N; i > 0 && i--;) {
+ BASE tmp_real = REAL(X, ix);
+ BASE tmp_imag = IMAG(X, ix);
+ const INDEX j_min = i + 1;
+ const INDEX j_max = GSL_MIN(N, i + K + 1);
+ INDEX jx = OFFSET(N, incX) + j_min * incX;
+ for (j = j_min; j < j_max; j++) {
+ const BASE Aij_real = CONST_REAL(A, lda * i + (j - i));
+ const BASE Aij_imag = conj * CONST_IMAG(A, lda * i + (j - i));
+ const BASE x_real = REAL(X, jx);
+ const BASE x_imag = IMAG(X, jx);
+ tmp_real -= Aij_real * x_real - Aij_imag * x_imag;
+ tmp_imag -= Aij_real * x_imag + Aij_imag * x_real;
+ jx += incX;
+ }
+
+ if (nonunit) {
+ const BASE a_real = CONST_REAL(A, lda * i + 0);
+ const BASE a_imag = conj * CONST_IMAG(A, lda * i + 0);
+ const BASE s = xhypot(a_real, a_imag);
+ const BASE b_real = a_real / s;
+ const BASE b_imag = a_imag / s;
+ REAL(X, ix) = (tmp_real * b_real + tmp_imag * b_imag) / s;
+ IMAG(X, ix) = (tmp_imag * b_real - tmp_real * b_imag) / s;
+ } else {
+ REAL(X, ix) = tmp_real;
+ IMAG(X, ix) = tmp_imag;
+ }
+ ix -= incX;
+ }
+
+ } else if ((order == CblasRowMajor && Trans == CblasNoTrans && Uplo == CblasLower)
+ || (order == CblasColMajor && Trans == CblasTrans && Uplo == CblasUpper)) {
+ /* forward substitution */
+
+ INDEX ix = OFFSET(N, incX);
+
+ for (i = 0; i < N; i++) {
+ BASE tmp_real = REAL(X, ix);
+ BASE tmp_imag = IMAG(X, ix);
+ const INDEX j_min = (K > i ? 0 : i - K);
+ const INDEX j_max = i;
+ INDEX jx = OFFSET(N, incX) + j_min * incX;
+ for (j = j_min; j < j_max; j++) {
+ const BASE Aij_real = CONST_REAL(A, lda * i + (K + j - i));
+ const BASE Aij_imag = conj * CONST_IMAG(A, lda * i + (K + j - i));
+ const BASE x_real = REAL(X, jx);
+ const BASE x_imag = IMAG(X, jx);
+ tmp_real -= Aij_real * x_real - Aij_imag * x_imag;
+ tmp_imag -= Aij_real * x_imag + Aij_imag * x_real;
+ jx += incX;
+ }
+ if (nonunit) {
+ const BASE a_real = CONST_REAL(A, lda * i + K);
+ const BASE a_imag = conj * CONST_IMAG(A, lda * i + K);
+ const BASE s = xhypot(a_real, a_imag);
+ const BASE b_real = a_real / s;
+ const BASE b_imag = a_imag / s;
+ REAL(X, ix) = (tmp_real * b_real + tmp_imag * b_imag) / s;
+ IMAG(X, ix) = (tmp_imag * b_real - tmp_real * b_imag) / s;
+ } else {
+ REAL(X, ix) = tmp_real;
+ IMAG(X, ix) = tmp_imag;
+ }
+ ix += incX;
+ }
+ } else if ((order == CblasRowMajor && Trans == CblasTrans && Uplo == CblasUpper)
+ || (order == CblasColMajor && Trans == CblasNoTrans && Uplo == CblasLower)) {
+ /* form x := inv( A' )*x */
+
+ /* forward substitution */
+
+ INDEX ix = OFFSET(N, incX);
+
+ for (i = 0; i < N; i++) {
+ BASE tmp_real = REAL(X, ix);
+ BASE tmp_imag = IMAG(X, ix);
+ const INDEX j_min = (K > i ? 0 : i - K);
+ const INDEX j_max = i;
+ INDEX jx = OFFSET(N, incX) + j_min * incX;
+ for (j = j_min; j < j_max; j++) {
+ const BASE Aij_real = CONST_REAL(A, (i - j) + lda * j);
+ const BASE Aij_imag = conj * CONST_IMAG(A, (i - j) + lda * j);
+ const BASE x_real = REAL(X, jx);
+ const BASE x_imag = IMAG(X, jx);
+ tmp_real -= Aij_real * x_real - Aij_imag * x_imag;
+ tmp_imag -= Aij_real * x_imag + Aij_imag * x_real;
+ jx += incX;
+ }
+ if (nonunit) {
+ const BASE a_real = CONST_REAL(A, 0 + lda * i);
+ const BASE a_imag = conj * CONST_IMAG(A, 0 + lda * i);
+ const BASE s = xhypot(a_real, a_imag);
+ const BASE b_real = a_real / s;
+ const BASE b_imag = a_imag / s;
+ REAL(X, ix) = (tmp_real * b_real + tmp_imag * b_imag) / s;
+ IMAG(X, ix) = (tmp_imag * b_real - tmp_real * b_imag) / s;
+ } else {
+ REAL(X, ix) = tmp_real;
+ IMAG(X, ix) = tmp_imag;
+ }
+ ix += incX;
+ }
+ } else if ((order == CblasRowMajor && Trans == CblasTrans && Uplo == CblasLower)
+ || (order == CblasColMajor && Trans == CblasNoTrans && Uplo == CblasUpper)) {
+
+ /* backsubstitution */
+
+ INDEX ix = OFFSET(N, incX) + incX * (N - 1);
+
+ for (i = N; i > 0 && i--;) {
+ BASE tmp_real = REAL(X, ix);
+ BASE tmp_imag = IMAG(X, ix);
+ const INDEX j_min = i + 1;
+ const INDEX j_max = GSL_MIN(N, i + K + 1);
+ INDEX jx = OFFSET(N, incX) + j_min * incX;
+ for (j = j_min; j < j_max; j++) {
+ const BASE Aij_real = CONST_REAL(A, (K + i - j) + lda * j);
+ const BASE Aij_imag = conj * CONST_IMAG(A, (K + i - j) + lda * j);
+ const BASE x_real = REAL(X, jx);
+ const BASE x_imag = IMAG(X, jx);
+ tmp_real -= Aij_real * x_real - Aij_imag * x_imag;
+ tmp_imag -= Aij_real * x_imag + Aij_imag * x_real;
+ jx += incX;
+ }
+
+ if (nonunit) {
+ const BASE a_real = CONST_REAL(A, K + lda * i);
+ const BASE a_imag = conj * CONST_IMAG(A, K + lda * i);
+ const BASE s = xhypot(a_real, a_imag);
+ const BASE b_real = a_real / s;
+ const BASE b_imag = a_imag / s;
+ REAL(X, ix) = (tmp_real * b_real + tmp_imag * b_imag) / s;
+ IMAG(X, ix) = (tmp_imag * b_real - tmp_real * b_imag) / s;
+ } else {
+ REAL(X, ix) = tmp_real;
+ IMAG(X, ix) = tmp_imag;
+ }
+ ix -= incX;
+ }
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+}
diff --git a/gsl-1.9/cblas/source_tbsv_r.h b/gsl-1.9/cblas/source_tbsv_r.h
new file mode 100644
index 0000000..30227e7
--- /dev/null
+++ b/gsl-1.9/cblas/source_tbsv_r.h
@@ -0,0 +1,123 @@
+/* blas/source_tbsv_r.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ const int nonunit = (Diag == CblasNonUnit);
+ INDEX i, j;
+ const int Trans = (TransA != CblasConjTrans) ? TransA : CblasTrans;
+
+ if (N == 0)
+ return;
+
+ /* form x := inv( A )*x */
+
+ if ((order == CblasRowMajor && Trans == CblasNoTrans && Uplo == CblasUpper)
+ || (order == CblasColMajor && Trans == CblasTrans && Uplo == CblasLower)) {
+ /* backsubstitution */
+ INDEX ix = OFFSET(N, incX) + incX * (N - 1);
+ for (i = N; i > 0 && i--;) {
+ BASE tmp = X[ix];
+ const INDEX j_min = i + 1;
+ const INDEX j_max = GSL_MIN(N, i + K + 1);
+ INDEX jx = OFFSET(N, incX) + j_min * incX;
+ for (j = j_min; j < j_max; j++) {
+ const BASE Aij = A[lda * i + (j - i)];
+ tmp -= Aij * X[jx];
+ jx += incX;
+ }
+ if (nonunit) {
+ X[ix] = tmp / A[lda * i + 0];
+ } else {
+ X[ix] = tmp;
+ }
+ ix -= incX;
+ }
+ } else if ((order == CblasRowMajor && Trans == CblasNoTrans && Uplo == CblasLower)
+ || (order == CblasColMajor && Trans == CblasTrans && Uplo == CblasUpper)) {
+
+ /* forward substitution */
+ INDEX ix = OFFSET(N, incX);
+
+ for (i = 0; i < N; i++) {
+ BASE tmp = X[ix];
+ const INDEX j_min = (i > K ? i - K : 0);
+ const INDEX j_max = i;
+ INDEX jx = OFFSET(N, incX) + j_min * incX;
+ for (j = j_min; j < j_max; j++) {
+ const BASE Aij = A[lda * i + (K + j - i)];
+ tmp -= Aij * X[jx];
+ jx += incX;
+ }
+ if (nonunit) {
+ X[ix] = tmp / A[lda * i + K];
+ } else {
+ X[ix] = tmp;
+ }
+ ix += incX;
+ }
+ } else if ((order == CblasRowMajor && Trans == CblasTrans && Uplo == CblasUpper)
+ || (order == CblasColMajor && Trans == CblasNoTrans && Uplo == CblasLower)) {
+
+ /* form x := inv( A' )*x */
+
+ /* forward substitution */
+ INDEX ix = OFFSET(N, incX);
+ for (i = 0; i < N; i++) {
+ BASE tmp = X[ix];
+ const INDEX j_min = (K > i ? 0 : i - K);
+ const INDEX j_max = i;
+ INDEX jx = OFFSET(N, incX) + j_min * incX;
+ for (j = j_min; j < j_max; j++) {
+ const BASE Aji = A[(i - j) + lda * j];
+ tmp -= Aji * X[jx];
+ jx += incX;
+ }
+ if (nonunit) {
+ X[ix] = tmp / A[0 + lda * i];
+ } else {
+ X[ix] = tmp;
+ }
+ ix += incX;
+ }
+ } else if ((order == CblasRowMajor && Trans == CblasTrans && Uplo == CblasLower)
+ || (order == CblasColMajor && Trans == CblasNoTrans && Uplo == CblasUpper)) {
+
+ /* backsubstitution */
+ INDEX ix = OFFSET(N, incX) + (N - 1) * incX;
+ for (i = N; i > 0 && i--;) {
+ BASE tmp = X[ix];
+ const INDEX j_min = i + 1;
+ const INDEX j_max = GSL_MIN(N, i + K + 1);
+ INDEX jx = OFFSET(N, incX) + j_min * incX;
+ for (j = j_min; j < j_max; j++) {
+ const BASE Aji = A[(K + i - j) + lda * j];
+ tmp -= Aji * X[jx];
+ jx += incX;
+ }
+ if (nonunit) {
+ X[ix] = tmp / A[K + lda * i];
+ } else {
+ X[ix] = tmp;
+ }
+ ix -= incX;
+ }
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+}
diff --git a/gsl-1.9/cblas/source_tpmv_c.h b/gsl-1.9/cblas/source_tpmv_c.h
new file mode 100644
index 0000000..30afa6a
--- /dev/null
+++ b/gsl-1.9/cblas/source_tpmv_c.h
@@ -0,0 +1,173 @@
+/* blas/source_tpmv_c.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i, j;
+
+ const int conj = (TransA == CblasConjTrans) ? -1 : 1;
+ const int Trans = (TransA != CblasConjTrans) ? TransA : CblasTrans;
+ const int nonunit = (Diag == CblasNonUnit);
+
+ if ((order == CblasRowMajor && Trans == CblasNoTrans && Uplo == CblasUpper)
+ || (order == CblasColMajor && Trans == CblasTrans && Uplo == CblasLower)) {
+ /* form x:= A*x */
+
+ INDEX ix = OFFSET(N, incX);
+ for (i = 0; i < N; i++) {
+ const BASE Aii_real = CONST_REAL(Ap, TPUP(N, i, i));
+ const BASE Aii_imag = conj * CONST_IMAG(Ap, TPUP(N, i, i));
+ BASE temp_r;
+ BASE temp_i;
+ if (nonunit) {
+ BASE x_real = REAL(X, ix);
+ BASE x_imag = IMAG(X, ix);
+ temp_r = Aii_real * x_real - Aii_imag * x_imag;
+ temp_i = Aii_real * x_imag + Aii_imag * x_real;
+ } else {
+ temp_r = REAL(X, ix);
+ temp_i = IMAG(X, ix);
+ }
+
+ {
+ INDEX jx = OFFSET(N, incX) + (i + 1) * incX;
+ for (j = i + 1; j < N; j++) {
+ const BASE Aij_real = CONST_REAL(Ap, TPUP(N, i, j));
+ const BASE Aij_imag = conj * CONST_IMAG(Ap, TPUP(N, i, j));
+ BASE x_real = REAL(X, jx);
+ BASE x_imag = IMAG(X, jx);
+ temp_r += Aij_real * x_real - Aij_imag * x_imag;
+ temp_i += Aij_real * x_imag + Aij_imag * x_real;
+ jx += incX;
+ }
+ }
+
+ REAL(X, ix) = temp_r;
+ IMAG(X, ix) = temp_i;
+ ix += incX;
+ }
+ } else if ((order == CblasRowMajor && Trans == CblasNoTrans && Uplo == CblasLower)
+ || (order == CblasColMajor && Trans == CblasTrans && Uplo == CblasUpper)) {
+
+ INDEX ix = OFFSET(N, incX) + incX * (N - 1);
+ for (i = N; i > 0 && i--;) {
+ const BASE Aii_real = CONST_REAL(Ap, TPLO(N, i, i));
+ const BASE Aii_imag = conj * CONST_IMAG(Ap, TPLO(N, i, i));
+ BASE temp_r;
+ BASE temp_i;
+ if (nonunit) {
+ BASE x_real = REAL(X, ix);
+ BASE x_imag = IMAG(X, ix);
+ temp_r = Aii_real * x_real - Aii_imag * x_imag;
+ temp_i = Aii_real * x_imag + Aii_imag * x_real;
+ } else {
+ temp_r = REAL(X, ix);
+ temp_i = IMAG(X, ix);
+ }
+
+ {
+ INDEX jx = OFFSET(N, incX);
+ for (j = 0; j < i; j++) {
+ const BASE Aij_real = CONST_REAL(Ap, TPLO(N, i, j));
+ const BASE Aij_imag = conj * CONST_IMAG(Ap, TPLO(N, i, j));
+ BASE x_real = REAL(X, jx);
+ BASE x_imag = IMAG(X, jx);
+ temp_r += Aij_real * x_real - Aij_imag * x_imag;
+ temp_i += Aij_real * x_imag + Aij_imag * x_real;
+ jx += incX;
+ }
+ }
+
+ REAL(X, ix) = temp_r;
+ IMAG(X, ix) = temp_i;
+ ix -= incX;
+ }
+ } else if ((order == CblasRowMajor && Trans == CblasTrans && Uplo == CblasUpper)
+ || (order == CblasColMajor && Trans == CblasNoTrans && Uplo == CblasLower)) {
+ /* form x := A'*x */
+
+ INDEX ix = OFFSET(N, incX) + incX * (N - 1);
+ for (i = N; i > 0 && i--;) {
+ const BASE Aii_real = CONST_REAL(Ap, TPUP(N, i, i));
+ const BASE Aii_imag = conj * CONST_IMAG(Ap, TPUP(N, i, i));
+ BASE temp_r;
+ BASE temp_i;
+ if (nonunit) {
+ BASE x_real = REAL(X, ix);
+ BASE x_imag = IMAG(X, ix);
+ temp_r = Aii_real * x_real - Aii_imag * x_imag;
+ temp_i = Aii_real * x_imag + Aii_imag * x_real;
+ } else {
+ temp_r = REAL(X, ix);
+ temp_i = IMAG(X, ix);
+ }
+ {
+ INDEX jx = OFFSET(N, incX);
+ for (j = 0; j < i; j++) {
+ BASE x_real = REAL(X, jx);
+ BASE x_imag = IMAG(X, jx);
+ const BASE Aji_real = CONST_REAL(Ap, TPUP(N, j, i));
+ const BASE Aji_imag = conj * CONST_IMAG(Ap, TPUP(N, j, i));
+ temp_r += Aji_real * x_real - Aji_imag * x_imag;
+ temp_i += Aji_real * x_imag + Aji_imag * x_real;
+ jx += incX;
+ }
+ }
+
+ REAL(X, ix) = temp_r;
+ IMAG(X, ix) = temp_i;
+ ix -= incX;
+ }
+ } else if ((order == CblasRowMajor && Trans == CblasTrans && Uplo == CblasLower)
+ || (order == CblasColMajor && Trans == CblasNoTrans && Uplo == CblasUpper)) {
+
+ INDEX ix = OFFSET(N, incX);
+ for (i = 0; i < N; i++) {
+ const BASE Aii_real = CONST_REAL(Ap, TPLO(N, i, i));
+ const BASE Aii_imag = conj * CONST_IMAG(Ap, TPLO(N, i, i));
+ BASE temp_r;
+ BASE temp_i;
+ if (nonunit) {
+ BASE x_real = REAL(X, ix);
+ BASE x_imag = IMAG(X, ix);
+ temp_r = Aii_real * x_real - Aii_imag * x_imag;
+ temp_i = Aii_real * x_imag + Aii_imag * x_real;
+ } else {
+ temp_r = REAL(X, ix);
+ temp_i = IMAG(X, ix);
+ }
+ {
+ INDEX jx = OFFSET(N, incX) + (i + 1) * incX;
+ for (j = i + 1; j < N; j++) {
+ BASE x_real = REAL(X, jx);
+ BASE x_imag = IMAG(X, jx);
+ const BASE Aji_real = CONST_REAL(Ap, TPLO(N, j, i));
+ const BASE Aji_imag = conj * CONST_IMAG(Ap, TPLO(N, j, i));
+ temp_r += Aji_real * x_real - Aji_imag * x_imag;
+ temp_i += Aji_real * x_imag + Aji_imag * x_real;
+ jx += incX;
+ }
+ }
+ REAL(X, ix) = temp_r;
+ IMAG(X, ix) = temp_i;
+ ix += incX;
+ }
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+}
diff --git a/gsl-1.9/cblas/source_tpmv_r.h b/gsl-1.9/cblas/source_tpmv_r.h
new file mode 100644
index 0000000..100891c
--- /dev/null
+++ b/gsl-1.9/cblas/source_tpmv_r.h
@@ -0,0 +1,97 @@
+/* blas/source_tpmv_r.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i, j;
+ const int nonunit = (Diag == CblasNonUnit);
+ const int Trans = (TransA != CblasConjTrans) ? TransA : CblasTrans;
+
+ if (N == 0)
+ return;
+
+ if ((order == CblasRowMajor && Trans == CblasNoTrans && Uplo == CblasUpper)
+ || (order == CblasColMajor && Trans == CblasTrans && Uplo == CblasLower)) {
+ /* form x:= A*x */
+
+ INDEX ix = OFFSET(N, incX);
+ for (i = 0; i < N; i++) {
+ BASE atmp = Ap[TPUP(N, i, i)];
+ BASE temp = (nonunit ? X[ix] * atmp : X[ix]);
+ INDEX jx = OFFSET(N, incX) + (i + 1) * incX;
+ for (j = i + 1; j < N; j++) {
+ atmp = Ap[TPUP(N, i, j)];
+ temp += atmp * X[jx];
+ jx += incX;
+ }
+ X[ix] = temp;
+ ix += incX;
+ }
+ } else if ((order == CblasRowMajor && Trans == CblasNoTrans && Uplo == CblasLower)
+ || (order == CblasColMajor && Trans == CblasTrans && Uplo == CblasUpper)) {
+
+ INDEX ix = OFFSET(N, incX) + (N - 1) * incX;
+ for (i = N; i > 0 && i--;) {
+ BASE atmp = Ap[TPLO(N, i, i)];
+ BASE temp = (nonunit ? X[ix] * atmp : X[ix]);
+ INDEX jx = OFFSET(N, incX);
+ for (j = 0; j < i; j++) {
+ atmp = Ap[TPLO(N, i, j)];
+ temp += atmp * X[jx];
+ jx += incX;
+ }
+ X[ix] = temp;
+ ix -= incX;
+ }
+ } else if ((order == CblasRowMajor && Trans == CblasTrans && Uplo == CblasUpper)
+ || (order == CblasColMajor && Trans == CblasNoTrans && Uplo == CblasLower)) {
+ /* form x := A'*x */
+
+ INDEX ix = OFFSET(N, incX) + (N - 1) * incX;
+ for (i = N; i > 0 && i--;) {
+ BASE atmp = Ap[TPUP(N, i, i)];
+ BASE temp = (nonunit ? X[ix] * atmp : X[ix]);
+ INDEX jx = OFFSET(N, incX);
+ for (j = 0; j < i; j++) {
+ atmp = Ap[TPUP(N, j, i)];
+ temp += atmp * X[jx];
+ jx += incX;
+ }
+ X[ix] = temp;
+ ix -= incX;
+ }
+ } else if ((order == CblasRowMajor && Trans == CblasTrans && Uplo == CblasLower)
+ || (order == CblasColMajor && Trans == CblasNoTrans && Uplo == CblasUpper)) {
+
+ INDEX ix = OFFSET(N, incX);
+ for (i = 0; i < N; i++) {
+ BASE atmp = Ap[TPLO(N, i, i)];
+ BASE temp = (nonunit ? X[ix] * atmp : X[ix]);
+ INDEX jx = OFFSET(N, incX) + (i + 1) * incX;
+ for (j = i + 1; j < N; j++) {
+ atmp = Ap[TPLO(N, j, i)];
+ temp += atmp * X[jx];
+ jx += incX;
+ }
+ X[ix] = temp;
+ ix += incX;
+ }
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+}
diff --git a/gsl-1.9/cblas/source_tpsv_c.h b/gsl-1.9/cblas/source_tpsv_c.h
new file mode 100644
index 0000000..bbd82e4
--- /dev/null
+++ b/gsl-1.9/cblas/source_tpsv_c.h
@@ -0,0 +1,227 @@
+/* blas/source_tpsv_c.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ const int conj = (TransA == CblasConjTrans) ? -1 : 1;
+ const int Trans = (TransA != CblasConjTrans) ? TransA : CblasTrans;
+ const int nonunit = (Diag == CblasNonUnit);
+ INDEX i, j;
+
+ if (N == 0)
+ return;
+
+ /* form x := inv( A )*x */
+
+ if ((order == CblasRowMajor && Trans == CblasNoTrans && Uplo == CblasUpper)
+ || (order == CblasColMajor && Trans == CblasTrans && Uplo == CblasLower)) {
+
+ INDEX ix = OFFSET(N, incX) + incX * (N - 1);
+
+ if (nonunit) {
+ const BASE a_real = CONST_REAL(Ap, TPUP(N, (N - 1), (N - 1)));
+ const BASE a_imag = conj * CONST_IMAG(Ap, TPUP(N, (N - 1), (N - 1)));
+ const BASE x_real = REAL(X, ix);
+ const BASE x_imag = IMAG(X, ix);
+ const BASE s = xhypot(a_real, a_imag);
+ const BASE b_real = a_real / s;
+ const BASE b_imag = a_imag / s;
+ REAL(X, ix) = (x_real * b_real + x_imag * b_imag) / s;
+ IMAG(X, ix) = (x_imag * b_real - b_imag * x_real) / s;
+ }
+
+ ix -= incX;
+
+ for (i = N - 1; i > 0 && i--;) {
+ BASE tmp_real = REAL(X, ix);
+ BASE tmp_imag = IMAG(X, ix);
+ INDEX jx = ix + incX;
+ for (j = i + 1; j < N; j++) {
+ const BASE Aij_real = CONST_REAL(Ap, TPUP(N, i, j));
+ const BASE Aij_imag = conj * CONST_IMAG(Ap, TPUP(N, i, j));
+ const BASE x_real = REAL(X, jx);
+ const BASE x_imag = IMAG(X, jx);
+ tmp_real -= Aij_real * x_real - Aij_imag * x_imag;
+ tmp_imag -= Aij_real * x_imag + Aij_imag * x_real;
+ jx += incX;
+ }
+
+ if (nonunit) {
+ const BASE a_real = CONST_REAL(Ap, TPUP(N, i, i));
+ const BASE a_imag = conj * CONST_IMAG(Ap, TPUP(N, i, i));
+ const BASE s = xhypot(a_real, a_imag);
+ const BASE b_real = a_real / s;
+ const BASE b_imag = a_imag / s;
+ REAL(X, ix) = (tmp_real * b_real + tmp_imag * b_imag) / s;
+ IMAG(X, ix) = (tmp_imag * b_real - tmp_real * b_imag) / s;
+ } else {
+ REAL(X, ix) = tmp_real;
+ IMAG(X, ix) = tmp_imag;
+ }
+ ix -= incX;
+ }
+
+ } else if ((order == CblasRowMajor && Trans == CblasNoTrans && Uplo == CblasLower)
+ || (order == CblasColMajor && Trans == CblasTrans && Uplo == CblasUpper)) {
+ /* forward substitution */
+
+ INDEX ix = OFFSET(N, incX);
+
+ if (nonunit) {
+ const BASE a_real = CONST_REAL(Ap, TPLO(N, 0, 0));
+ const BASE a_imag = conj * CONST_IMAG(Ap, TPLO(N, 0, 0));
+ const BASE x_real = REAL(X, ix);
+ const BASE x_imag = IMAG(X, ix);
+ const BASE s = xhypot(a_real, a_imag);
+ const BASE b_real = a_real / s;
+ const BASE b_imag = a_imag / s;
+ REAL(X, ix) = (x_real * b_real + x_imag * b_imag) / s;
+ IMAG(X, ix) = (x_imag * b_real - b_imag * x_real) / s;
+ }
+
+ ix += incX;
+
+ for (i = 1; i < N; i++) {
+ BASE tmp_real = REAL(X, ix);
+ BASE tmp_imag = IMAG(X, ix);
+ INDEX jx = OFFSET(N, incX);
+ for (j = 0; j < i; j++) {
+ const BASE Aij_real = CONST_REAL(Ap, TPLO(N, i, j));
+ const BASE Aij_imag = conj * CONST_IMAG(Ap, TPLO(N, i, j));
+ const BASE x_real = REAL(X, jx);
+ const BASE x_imag = IMAG(X, jx);
+ tmp_real -= Aij_real * x_real - Aij_imag * x_imag;
+ tmp_imag -= Aij_real * x_imag + Aij_imag * x_real;
+ jx += incX;
+ }
+ if (nonunit) {
+ const BASE a_real = CONST_REAL(Ap, TPLO(N, i, i));
+ const BASE a_imag = conj * CONST_IMAG(Ap, TPLO(N, i, i));
+ const BASE s = xhypot(a_real, a_imag);
+ const BASE b_real = a_real / s;
+ const BASE b_imag = a_imag / s;
+ REAL(X, ix) = (tmp_real * b_real + tmp_imag * b_imag) / s;
+ IMAG(X, ix) = (tmp_imag * b_real - tmp_real * b_imag) / s;
+ } else {
+ REAL(X, ix) = tmp_real;
+ IMAG(X, ix) = tmp_imag;
+ }
+ ix += incX;
+ }
+ } else if ((order == CblasRowMajor && Trans == CblasTrans && Uplo == CblasUpper)
+ || (order == CblasColMajor && Trans == CblasNoTrans && Uplo == CblasLower)) {
+ /* form x := inv( A' )*x */
+
+ /* forward substitution */
+
+ INDEX ix = OFFSET(N, incX);
+
+ if (nonunit) {
+ const BASE a_real = CONST_REAL(Ap, TPUP(N, 0, 0));
+ const BASE a_imag = conj * CONST_IMAG(Ap, TPUP(N, 0, 0));
+ const BASE x_real = REAL(X, ix);
+ const BASE x_imag = IMAG(X, ix);
+ const BASE s = xhypot(a_real, a_imag);
+ const BASE b_real = a_real / s;
+ const BASE b_imag = a_imag / s;
+ REAL(X, ix) = (x_real * b_real + x_imag * b_imag) / s;
+ IMAG(X, ix) = (x_imag * b_real - b_imag * x_real) / s;
+ }
+
+ ix += incX;
+
+ for (i = 1; i < N; i++) {
+ BASE tmp_real = REAL(X, ix);
+ BASE tmp_imag = IMAG(X, ix);
+ INDEX jx = OFFSET(N, incX);
+ for (j = 0; j < i; j++) {
+ const BASE Aij_real = CONST_REAL(Ap, TPUP(N, j, i));
+ const BASE Aij_imag = conj * CONST_IMAG(Ap, TPUP(N, j, i));
+ const BASE x_real = REAL(X, jx);
+ const BASE x_imag = IMAG(X, jx);
+ tmp_real -= Aij_real * x_real - Aij_imag * x_imag;
+ tmp_imag -= Aij_real * x_imag + Aij_imag * x_real;
+ jx += incX;
+ }
+ if (nonunit) {
+ const BASE a_real = CONST_REAL(Ap, TPUP(N, i, i));
+ const BASE a_imag = conj * CONST_IMAG(Ap, TPUP(N, i, i));
+ const BASE s = xhypot(a_real, a_imag);
+ const BASE b_real = a_real / s;
+ const BASE b_imag = a_imag / s;
+ REAL(X, ix) = (tmp_real * b_real + tmp_imag * b_imag) / s;
+ IMAG(X, ix) = (tmp_imag * b_real - tmp_real * b_imag) / s;
+ } else {
+ REAL(X, ix) = tmp_real;
+ IMAG(X, ix) = tmp_imag;
+ }
+ ix += incX;
+ }
+ } else if ((order == CblasRowMajor && Trans == CblasTrans && Uplo == CblasLower)
+ || (order == CblasColMajor && Trans == CblasNoTrans && Uplo == CblasUpper)) {
+
+ /* backsubstitution */
+
+ INDEX ix = OFFSET(N, incX) + incX * (N - 1);
+
+ if (nonunit) {
+ const BASE a_real = CONST_REAL(Ap, TPLO(N, (N - 1), (N - 1)));
+ const BASE a_imag = conj * CONST_IMAG(Ap, TPLO(N, (N - 1), (N - 1)));
+ const BASE x_real = REAL(X, ix);
+ const BASE x_imag = IMAG(X, ix);
+ const BASE s = xhypot(a_real, a_imag);
+ const BASE b_real = a_real / s;
+ const BASE b_imag = a_imag / s;
+ REAL(X, ix) = (x_real * b_real + x_imag * b_imag) / s;
+ IMAG(X, ix) = (x_imag * b_real - b_imag * x_real) / s;
+ }
+
+ ix -= incX;
+
+ for (i = N - 1; i > 0 && i--;) {
+ BASE tmp_real = REAL(X, ix);
+ BASE tmp_imag = IMAG(X, ix);
+ INDEX jx = ix + incX;
+ for (j = i + 1; j < N; j++) {
+ const BASE Aij_real = CONST_REAL(Ap, TPLO(N, j, i));
+ const BASE Aij_imag = conj * CONST_IMAG(Ap, TPLO(N, j, i));
+ const BASE x_real = REAL(X, jx);
+ const BASE x_imag = IMAG(X, jx);
+ tmp_real -= Aij_real * x_real - Aij_imag * x_imag;
+ tmp_imag -= Aij_real * x_imag + Aij_imag * x_real;
+ jx += incX;
+ }
+
+ if (nonunit) {
+ const BASE a_real = CONST_REAL(Ap, TPLO(N, i, i));
+ const BASE a_imag = conj * CONST_IMAG(Ap, TPLO(N, i, i));
+ const BASE s = xhypot(a_real, a_imag);
+ const BASE b_real = a_real / s;
+ const BASE b_imag = a_imag / s;
+ REAL(X, ix) = (tmp_real * b_real + tmp_imag * b_imag) / s;
+ IMAG(X, ix) = (tmp_imag * b_real - tmp_real * b_imag) / s;
+ } else {
+ REAL(X, ix) = tmp_real;
+ IMAG(X, ix) = tmp_imag;
+ }
+ ix -= incX;
+ }
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+}
diff --git a/gsl-1.9/cblas/source_tpsv_r.h b/gsl-1.9/cblas/source_tpsv_r.h
new file mode 100644
index 0000000..cc4c828
--- /dev/null
+++ b/gsl-1.9/cblas/source_tpsv_r.h
@@ -0,0 +1,131 @@
+/* blas/source_tpsv_r.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i, j;
+ const int nonunit = (Diag == CblasNonUnit);
+ const int Trans = (TransA != CblasConjTrans) ? TransA : CblasTrans;
+
+ if (N == 0)
+ return;
+
+ /* form x := inv( A )*x */
+
+ if ((order == CblasRowMajor && Trans == CblasNoTrans && Uplo == CblasUpper)
+ || (order == CblasColMajor && Trans == CblasTrans && Uplo == CblasLower)) {
+ /* backsubstitution */
+ INDEX ix = OFFSET(N, incX) + incX * (N - 1);
+ if (nonunit) {
+ X[ix] = X[ix] / Ap[TPUP(N, (N - 1), (N - 1))];
+ }
+ ix -= incX;
+ for (i = N - 1; i > 0 && i--;) {
+ BASE tmp = X[ix];
+ INDEX jx = ix + incX;
+ for (j = i + 1; j < N; j++) {
+ const BASE Aij = Ap[TPUP(N, i, j)];
+ tmp -= Aij * X[jx];
+ jx += incX;
+ }
+ if (nonunit) {
+ X[ix] = tmp / Ap[TPUP(N, i, i)];
+ } else {
+ X[ix] = tmp;
+ }
+ ix -= incX;
+ }
+ } else if ((order == CblasRowMajor && Trans == CblasNoTrans && Uplo == CblasLower)
+ || (order == CblasColMajor && Trans == CblasTrans && Uplo == CblasUpper)) {
+
+ /* forward substitution */
+ INDEX ix = OFFSET(N, incX);
+ if (nonunit) {
+ X[ix] = X[ix] / Ap[TPLO(N, 0, 0)];
+ }
+ ix += incX;
+ for (i = 1; i < N; i++) {
+ BASE tmp = X[ix];
+ INDEX jx = OFFSET(N, incX);
+ for (j = 0; j < i; j++) {
+ const BASE Aij = Ap[TPLO(N, i, j)];
+ tmp -= Aij * X[jx];
+ jx += incX;
+ }
+ if (nonunit) {
+ X[ix] = tmp / Ap[TPLO(N, i, j)];
+ } else {
+ X[ix] = tmp;
+ }
+ ix += incX;
+ }
+ } else if ((order == CblasRowMajor && Trans == CblasTrans && Uplo == CblasUpper)
+ || (order == CblasColMajor && Trans == CblasNoTrans && Uplo == CblasLower)) {
+
+ /* form x := inv( A' )*x */
+
+ /* forward substitution */
+ INDEX ix = OFFSET(N, incX);
+ if (nonunit) {
+ X[ix] = X[ix] / Ap[TPUP(N, 0, 0)];
+ }
+ ix += incX;
+ for (i = 1; i < N; i++) {
+ BASE tmp = X[ix];
+ INDEX jx = OFFSET(N, incX);
+ for (j = 0; j < i; j++) {
+ const BASE Aji = Ap[TPUP(N, j, i)];
+ tmp -= Aji * X[jx];
+ jx += incX;
+ }
+ if (nonunit) {
+ X[ix] = tmp / Ap[TPUP(N, i, i)];
+ } else {
+ X[ix] = tmp;
+ }
+ ix += incX;
+ }
+ } else if ((order == CblasRowMajor && Trans == CblasTrans && Uplo == CblasLower)
+ || (order == CblasColMajor && Trans == CblasNoTrans && Uplo == CblasUpper)) {
+
+ /* backsubstitution */
+ INDEX ix = OFFSET(N, incX) + (N - 1) * incX;
+ if (nonunit) {
+ X[ix] = X[ix] / Ap[TPLO(N, (N - 1), (N - 1))];
+ }
+ ix -= incX;
+ for (i = N - 1; i > 0 && i--;) {
+ BASE tmp = X[ix];
+ INDEX jx = ix + incX;
+ for (j = i + 1; j < N; j++) {
+ const BASE Aji = Ap[TPLO(N, j, i)];
+ tmp -= Aji * X[jx];
+ jx += incX;
+ }
+ if (nonunit) {
+ X[ix] = tmp / Ap[TPLO(N, i, i)];
+ } else {
+ X[ix] = tmp;
+ }
+ ix -= incX;
+ }
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+
+}
diff --git a/gsl-1.9/cblas/source_trmm_c.h b/gsl-1.9/cblas/source_trmm_c.h
new file mode 100644
index 0000000..aeadfc7
--- /dev/null
+++ b/gsl-1.9/cblas/source_trmm_c.h
@@ -0,0 +1,330 @@
+/* blas/source_trmm_c.h
+ *
+ * Copyright (C) 2001 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i, j, k;
+ INDEX n1, n2;
+ const int nonunit = (Diag == CblasNonUnit);
+ const int conj = (TransA == CblasConjTrans) ? -1 : 1;
+ int side, uplo, trans;
+
+ const BASE alpha_real = CONST_REAL0(alpha);
+ const BASE alpha_imag = CONST_IMAG0(alpha);
+
+ if (Order == CblasRowMajor) {
+ n1 = M;
+ n2 = N;
+ side = Side;
+ uplo = Uplo;
+ trans = (TransA == CblasNoTrans) ? CblasNoTrans : CblasTrans;
+ } else {
+ n1 = N;
+ n2 = M;
+ side = (Side == CblasLeft) ? CblasRight : CblasLeft; /* exchanged */
+ uplo = (Uplo == CblasUpper) ? CblasLower : CblasUpper; /* exchanged */
+ trans = (TransA == CblasNoTrans) ? CblasNoTrans : CblasTrans; /* same */
+ }
+
+ if (side == CblasLeft && uplo == CblasUpper && trans == CblasNoTrans) {
+
+ /* form B := alpha * TriU(A)*B */
+
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ BASE temp_real = 0.0;
+ BASE temp_imag = 0.0;
+
+ if (nonunit) {
+ const BASE Aii_real = CONST_REAL(A, i * lda + i);
+ const BASE Aii_imag = conj * CONST_IMAG(A, i * lda + i);
+ const BASE Bij_real = REAL(B, i * ldb + j);
+ const BASE Bij_imag = IMAG(B, i * ldb + j);
+ temp_real = Aii_real * Bij_real - Aii_imag * Bij_imag;
+ temp_imag = Aii_real * Bij_imag + Aii_imag * Bij_real;
+ } else {
+ temp_real = REAL(B, i * ldb + j);
+ temp_imag = IMAG(B, i * ldb + j);
+ }
+
+ for (k = i + 1; k < n1; k++) {
+ const BASE Aik_real = CONST_REAL(A, i * lda + k);
+ const BASE Aik_imag = conj * CONST_IMAG(A, i * lda + k);
+ const BASE Bkj_real = REAL(B, k * ldb + j);
+ const BASE Bkj_imag = IMAG(B, k * ldb + j);
+ temp_real += Aik_real * Bkj_real - Aik_imag * Bkj_imag;
+ temp_imag += Aik_real * Bkj_imag + Aik_imag * Bkj_real;
+ }
+
+ REAL(B, ldb * i + j) = alpha_real * temp_real - alpha_imag * temp_imag;
+ IMAG(B, ldb * i + j) = alpha_real * temp_imag + alpha_imag * temp_real;
+ }
+ }
+
+ } else if (side == CblasLeft && uplo == CblasUpper && trans == CblasTrans) {
+
+ /* form B := alpha * (TriU(A))' *B */
+
+ for (i = n1; i > 0 && i--;) {
+ for (j = 0; j < n2; j++) {
+ BASE temp_real = 0.0;
+ BASE temp_imag = 0.0;
+
+ for (k = 0; k < i; k++) {
+ const BASE Aki_real = CONST_REAL(A, k * lda + i);
+ const BASE Aki_imag = conj * CONST_IMAG(A, k * lda + i);
+ const BASE Bkj_real = REAL(B, k * ldb + j);
+ const BASE Bkj_imag = IMAG(B, k * ldb + j);
+ temp_real += Aki_real * Bkj_real - Aki_imag * Bkj_imag;
+ temp_imag += Aki_real * Bkj_imag + Aki_imag * Bkj_real;
+ }
+
+ if (nonunit) {
+ const BASE Aii_real = CONST_REAL(A, i * lda + i);
+ const BASE Aii_imag = conj * CONST_IMAG(A, i * lda + i);
+ const BASE Bij_real = REAL(B, i * ldb + j);
+ const BASE Bij_imag = IMAG(B, i * ldb + j);
+ temp_real += Aii_real * Bij_real - Aii_imag * Bij_imag;
+ temp_imag += Aii_real * Bij_imag + Aii_imag * Bij_real;
+ } else {
+ temp_real += REAL(B, i * ldb + j);
+ temp_imag += IMAG(B, i * ldb + j);
+ }
+
+ REAL(B, ldb * i + j) = alpha_real * temp_real - alpha_imag * temp_imag;
+ IMAG(B, ldb * i + j) = alpha_real * temp_imag + alpha_imag * temp_real;
+ }
+ }
+
+ } else if (side == CblasLeft && uplo == CblasLower && trans == CblasNoTrans) {
+
+ /* form B := alpha * TriL(A)*B */
+
+
+ for (i = n1; i > 0 && i--;) {
+ for (j = 0; j < n2; j++) {
+ BASE temp_real = 0.0;
+ BASE temp_imag = 0.0;
+
+ for (k = 0; k < i; k++) {
+ const BASE Aik_real = CONST_REAL(A, i * lda + k);
+ const BASE Aik_imag = conj * CONST_IMAG(A, i * lda + k);
+ const BASE Bkj_real = REAL(B, k * ldb + j);
+ const BASE Bkj_imag = IMAG(B, k * ldb + j);
+ temp_real += Aik_real * Bkj_real - Aik_imag * Bkj_imag;
+ temp_imag += Aik_real * Bkj_imag + Aik_imag * Bkj_real;
+ }
+
+ if (nonunit) {
+ const BASE Aii_real = CONST_REAL(A, i * lda + i);
+ const BASE Aii_imag = conj * CONST_IMAG(A, i * lda + i);
+ const BASE Bij_real = REAL(B, i * ldb + j);
+ const BASE Bij_imag = IMAG(B, i * ldb + j);
+ temp_real += Aii_real * Bij_real - Aii_imag * Bij_imag;
+ temp_imag += Aii_real * Bij_imag + Aii_imag * Bij_real;
+ } else {
+ temp_real += REAL(B, i * ldb + j);
+ temp_imag += IMAG(B, i * ldb + j);
+ }
+
+ REAL(B, ldb * i + j) = alpha_real * temp_real - alpha_imag * temp_imag;
+ IMAG(B, ldb * i + j) = alpha_real * temp_imag + alpha_imag * temp_real;
+ }
+ }
+
+
+
+ } else if (side == CblasLeft && uplo == CblasLower && trans == CblasTrans) {
+
+ /* form B := alpha * TriL(A)' *B */
+
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ BASE temp_real = 0.0;
+ BASE temp_imag = 0.0;
+
+ if (nonunit) {
+ const BASE Aii_real = CONST_REAL(A, i * lda + i);
+ const BASE Aii_imag = conj * CONST_IMAG(A, i * lda + i);
+ const BASE Bij_real = REAL(B, i * ldb + j);
+ const BASE Bij_imag = IMAG(B, i * ldb + j);
+ temp_real = Aii_real * Bij_real - Aii_imag * Bij_imag;
+ temp_imag = Aii_real * Bij_imag + Aii_imag * Bij_real;
+ } else {
+ temp_real = REAL(B, i * ldb + j);
+ temp_imag = IMAG(B, i * ldb + j);
+ }
+
+ for (k = i + 1; k < n1; k++) {
+ const BASE Aki_real = CONST_REAL(A, k * lda + i);
+ const BASE Aki_imag = conj * CONST_IMAG(A, k * lda + i);
+ const BASE Bkj_real = REAL(B, k * ldb + j);
+ const BASE Bkj_imag = IMAG(B, k * ldb + j);
+ temp_real += Aki_real * Bkj_real - Aki_imag * Bkj_imag;
+ temp_imag += Aki_real * Bkj_imag + Aki_imag * Bkj_real;
+ }
+
+ REAL(B, ldb * i + j) = alpha_real * temp_real - alpha_imag * temp_imag;
+ IMAG(B, ldb * i + j) = alpha_real * temp_imag + alpha_imag * temp_real;
+ }
+ }
+
+ } else if (side == CblasRight && uplo == CblasUpper && trans == CblasNoTrans) {
+
+ /* form B := alpha * B * TriU(A) */
+
+ for (i = 0; i < n1; i++) {
+ for (j = n2; j > 0 && j--;) {
+ BASE temp_real = 0.0;
+ BASE temp_imag = 0.0;
+
+ for (k = 0; k < j; k++) {
+ const BASE Akj_real = CONST_REAL(A, k * lda + j);
+ const BASE Akj_imag = conj * CONST_IMAG(A, k * lda + j);
+ const BASE Bik_real = REAL(B, i * ldb + k);
+ const BASE Bik_imag = IMAG(B, i * ldb + k);
+ temp_real += Akj_real * Bik_real - Akj_imag * Bik_imag;
+ temp_imag += Akj_real * Bik_imag + Akj_imag * Bik_real;
+ }
+
+ if (nonunit) {
+ const BASE Ajj_real = CONST_REAL(A, j * lda + j);
+ const BASE Ajj_imag = conj * CONST_IMAG(A, j * lda + j);
+ const BASE Bij_real = REAL(B, i * ldb + j);
+ const BASE Bij_imag = IMAG(B, i * ldb + j);
+ temp_real += Ajj_real * Bij_real - Ajj_imag * Bij_imag;
+ temp_imag += Ajj_real * Bij_imag + Ajj_imag * Bij_real;
+ } else {
+ temp_real += REAL(B, i * ldb + j);
+ temp_imag += IMAG(B, i * ldb + j);
+ }
+
+ REAL(B, ldb * i + j) = alpha_real * temp_real - alpha_imag * temp_imag;
+ IMAG(B, ldb * i + j) = alpha_real * temp_imag + alpha_imag * temp_real;
+ }
+ }
+
+ } else if (side == CblasRight && uplo == CblasUpper && trans == CblasTrans) {
+
+ /* form B := alpha * B * (TriU(A))' */
+
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ BASE temp_real = 0.0;
+ BASE temp_imag = 0.0;
+
+ if (nonunit) {
+ const BASE Ajj_real = CONST_REAL(A, j * lda + j);
+ const BASE Ajj_imag = conj * CONST_IMAG(A, j * lda + j);
+ const BASE Bij_real = REAL(B, i * ldb + j);
+ const BASE Bij_imag = IMAG(B, i * ldb + j);
+ temp_real = Ajj_real * Bij_real - Ajj_imag * Bij_imag;
+ temp_imag = Ajj_real * Bij_imag + Ajj_imag * Bij_real;
+ } else {
+ temp_real = REAL(B, i * ldb + j);
+ temp_imag = IMAG(B, i * ldb + j);
+ }
+
+ for (k = j + 1; k < n2; k++) {
+ const BASE Ajk_real = CONST_REAL(A, j * lda + k);
+ const BASE Ajk_imag = conj * CONST_IMAG(A, j * lda + k);
+ const BASE Bik_real = REAL(B, i * ldb + k);
+ const BASE Bik_imag = IMAG(B, i * ldb + k);
+ temp_real += Ajk_real * Bik_real - Ajk_imag * Bik_imag;
+ temp_imag += Ajk_real * Bik_imag + Ajk_imag * Bik_real;
+ }
+
+ REAL(B, ldb * i + j) = alpha_real * temp_real - alpha_imag * temp_imag;
+ IMAG(B, ldb * i + j) = alpha_real * temp_imag + alpha_imag * temp_real;
+ }
+ }
+
+ } else if (side == CblasRight && uplo == CblasLower && trans == CblasNoTrans) {
+
+ /* form B := alpha *B * TriL(A) */
+
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ BASE temp_real = 0.0;
+ BASE temp_imag = 0.0;
+
+ if (nonunit) {
+ const BASE Ajj_real = CONST_REAL(A, j * lda + j);
+ const BASE Ajj_imag = conj * CONST_IMAG(A, j * lda + j);
+ const BASE Bij_real = REAL(B, i * ldb + j);
+ const BASE Bij_imag = IMAG(B, i * ldb + j);
+ temp_real = Ajj_real * Bij_real - Ajj_imag * Bij_imag;
+ temp_imag = Ajj_real * Bij_imag + Ajj_imag * Bij_real;
+ } else {
+ temp_real = REAL(B, i * ldb + j);
+ temp_imag = IMAG(B, i * ldb + j);
+ }
+
+ for (k = j + 1; k < n2; k++) {
+ const BASE Akj_real = CONST_REAL(A, k * lda + j);
+ const BASE Akj_imag = conj * CONST_IMAG(A, k * lda + j);
+ const BASE Bik_real = REAL(B, i * ldb + k);
+ const BASE Bik_imag = IMAG(B, i * ldb + k);
+ temp_real += Akj_real * Bik_real - Akj_imag * Bik_imag;
+ temp_imag += Akj_real * Bik_imag + Akj_imag * Bik_real;
+ }
+
+ REAL(B, ldb * i + j) = alpha_real * temp_real - alpha_imag * temp_imag;
+ IMAG(B, ldb * i + j) = alpha_real * temp_imag + alpha_imag * temp_real;
+ }
+ }
+
+ } else if (side == CblasRight && uplo == CblasLower && trans == CblasTrans) {
+
+ /* form B := alpha * B * TriL(A)' */
+
+ for (i = 0; i < n1; i++) {
+ for (j = n2; j > 0 && j--;) {
+ BASE temp_real = 0.0;
+ BASE temp_imag = 0.0;
+
+ for (k = 0; k < j; k++) {
+ const BASE Ajk_real = CONST_REAL(A, j * lda + k);
+ const BASE Ajk_imag = conj * CONST_IMAG(A, j * lda + k);
+ const BASE Bik_real = REAL(B, i * ldb + k);
+ const BASE Bik_imag = IMAG(B, i * ldb + k);
+ temp_real += Ajk_real * Bik_real - Ajk_imag * Bik_imag;
+ temp_imag += Ajk_real * Bik_imag + Ajk_imag * Bik_real;
+ }
+
+ if (nonunit) {
+ const BASE Ajj_real = CONST_REAL(A, j * lda + j);
+ const BASE Ajj_imag = conj * CONST_IMAG(A, j * lda + j);
+ const BASE Bij_real = REAL(B, i * ldb + j);
+ const BASE Bij_imag = IMAG(B, i * ldb + j);
+ temp_real += Ajj_real * Bij_real - Ajj_imag * Bij_imag;
+ temp_imag += Ajj_real * Bij_imag + Ajj_imag * Bij_real;
+ } else {
+ temp_real += REAL(B, i * ldb + j);
+ temp_imag += IMAG(B, i * ldb + j);
+ }
+
+ REAL(B, ldb * i + j) = alpha_real * temp_real - alpha_imag * temp_imag;
+ IMAG(B, ldb * i + j) = alpha_real * temp_imag + alpha_imag * temp_real;
+ }
+ }
+
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+}
diff --git a/gsl-1.9/cblas/source_trmm_r.h b/gsl-1.9/cblas/source_trmm_r.h
new file mode 100644
index 0000000..150668a
--- /dev/null
+++ b/gsl-1.9/cblas/source_trmm_r.h
@@ -0,0 +1,223 @@
+/* blas/source_trmm_r.h
+ *
+ * Copyright (C) 2001 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i, j, k;
+ INDEX n1, n2;
+ const int nonunit = (Diag == CblasNonUnit);
+ int side, uplo, trans;
+
+ if (Order == CblasRowMajor) {
+ n1 = M;
+ n2 = N;
+ side = Side;
+ uplo = Uplo;
+ trans = (TransA == CblasConjTrans) ? CblasTrans : TransA;
+ } else {
+ n1 = N;
+ n2 = M;
+ side = (Side == CblasLeft) ? CblasRight : CblasLeft;
+ uplo = (Uplo == CblasUpper) ? CblasLower : CblasUpper;
+ trans = (TransA == CblasConjTrans) ? CblasTrans : TransA;
+ }
+
+ if (side == CblasLeft && uplo == CblasUpper && trans == CblasNoTrans) {
+
+ /* form B := alpha * TriU(A)*B */
+
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ BASE temp = 0.0;
+
+ if (nonunit) {
+ temp = A[i * lda + i] * B[i * ldb + j];
+ } else {
+ temp = B[i * ldb + j];
+ }
+
+ for (k = i + 1; k < n1; k++) {
+ temp += A[lda * i + k] * B[k * ldb + j];
+ }
+
+ B[ldb * i + j] = alpha * temp;
+ }
+ }
+
+ } else if (side == CblasLeft && uplo == CblasUpper && trans == CblasTrans) {
+
+ /* form B := alpha * (TriU(A))' *B */
+
+ for (i = n1; i > 0 && i--;) {
+ for (j = 0; j < n2; j++) {
+ BASE temp = 0.0;
+
+ for (k = 0; k < i; k++) {
+ temp += A[lda * k + i] * B[k * ldb + j];
+ }
+
+ if (nonunit) {
+ temp += A[i * lda + i] * B[i * ldb + j];
+ } else {
+ temp += B[i * ldb + j];
+ }
+
+ B[ldb * i + j] = alpha * temp;
+ }
+ }
+
+ } else if (side == CblasLeft && uplo == CblasLower && trans == CblasNoTrans) {
+
+ /* form B := alpha * TriL(A)*B */
+
+
+ for (i = n1; i > 0 && i--;) {
+ for (j = 0; j < n2; j++) {
+ BASE temp = 0.0;
+
+ for (k = 0; k < i; k++) {
+ temp += A[lda * i + k] * B[k * ldb + j];
+ }
+
+ if (nonunit) {
+ temp += A[i * lda + i] * B[i * ldb + j];
+ } else {
+ temp += B[i * ldb + j];
+ }
+
+ B[ldb * i + j] = alpha * temp;
+ }
+ }
+
+
+
+ } else if (side == CblasLeft && uplo == CblasLower && trans == CblasTrans) {
+
+ /* form B := alpha * TriL(A)' *B */
+
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ BASE temp = 0.0;
+
+ if (nonunit) {
+ temp = A[i * lda + i] * B[i * ldb + j];
+ } else {
+ temp = B[i * ldb + j];
+ }
+
+ for (k = i + 1; k < n1; k++) {
+ temp += A[lda * k + i] * B[k * ldb + j];
+ }
+
+ B[ldb * i + j] = alpha * temp;
+ }
+ }
+
+ } else if (side == CblasRight && uplo == CblasUpper && trans == CblasNoTrans) {
+
+ /* form B := alpha * B * TriU(A) */
+
+ for (i = 0; i < n1; i++) {
+ for (j = n2; j > 0 && j--;) {
+ BASE temp = 0.0;
+
+ for (k = 0; k < j; k++) {
+ temp += A[lda * k + j] * B[i * ldb + k];
+ }
+
+ if (nonunit) {
+ temp += A[j * lda + j] * B[i * ldb + j];
+ } else {
+ temp += B[i * ldb + j];
+ }
+
+ B[ldb * i + j] = alpha * temp;
+ }
+ }
+
+ } else if (side == CblasRight && uplo == CblasUpper && trans == CblasTrans) {
+
+ /* form B := alpha * B * (TriU(A))' */
+
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ BASE temp = 0.0;
+
+ if (nonunit) {
+ temp = A[j * lda + j] * B[i * ldb + j];
+ } else {
+ temp = B[i * ldb + j];
+ }
+
+ for (k = j + 1; k < n2; k++) {
+ temp += A[lda * j + k] * B[i * ldb + k];
+ }
+
+ B[ldb * i + j] = alpha * temp;
+ }
+ }
+
+ } else if (side == CblasRight && uplo == CblasLower && trans == CblasNoTrans) {
+
+ /* form B := alpha *B * TriL(A) */
+
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ BASE temp = 0.0;
+
+ if (nonunit) {
+ temp = A[j * lda + j] * B[i * ldb + j];
+ } else {
+ temp = B[i * ldb + j];
+ }
+
+ for (k = j + 1; k < n2; k++) {
+ temp += A[lda * k + j] * B[i * ldb + k];
+ }
+
+
+ B[ldb * i + j] = alpha * temp;
+ }
+ }
+
+ } else if (side == CblasRight && uplo == CblasLower && trans == CblasTrans) {
+
+ /* form B := alpha * B * TriL(A)' */
+
+ for (i = 0; i < n1; i++) {
+ for (j = n2; j > 0 && j--;) {
+ BASE temp = 0.0;
+
+ for (k = 0; k < j; k++) {
+ temp += A[lda * j + k] * B[i * ldb + k];
+ }
+
+ if (nonunit) {
+ temp += A[j * lda + j] * B[i * ldb + j];
+ } else {
+ temp += B[i * ldb + j];
+ }
+
+ B[ldb * i + j] = alpha * temp;
+ }
+ }
+
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+}
diff --git a/gsl-1.9/cblas/source_trmv_c.h b/gsl-1.9/cblas/source_trmv_c.h
new file mode 100644
index 0000000..dc57c73
--- /dev/null
+++ b/gsl-1.9/cblas/source_trmv_c.h
@@ -0,0 +1,169 @@
+/* blas/source_tbmv_c.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ const int conj = (TransA == CblasConjTrans) ? -1 : 1;
+ const int Trans = (TransA != CblasConjTrans) ? TransA : CblasTrans;
+ const int nonunit = (Diag == CblasNonUnit);
+
+ INDEX i, j;
+
+ if ((order == CblasRowMajor && Trans == CblasNoTrans && Uplo == CblasUpper)
+ || (order == CblasColMajor && Trans == CblasTrans && Uplo == CblasLower)) {
+
+ /* form x := A*x */
+ INDEX ix = OFFSET(N, incX);
+ for (i = 0; i < N; i++) {
+ BASE temp_r = 0.0;
+ BASE temp_i = 0.0;
+ const INDEX j_min = i + 1;
+ INDEX jx = OFFSET(N, incX) + incX * j_min;
+ for (j = j_min; j < N; j++) {
+ const BASE x_real = REAL(X, jx);
+ const BASE x_imag = IMAG(X, jx);
+ const BASE A_real = CONST_REAL(A, lda * i + j);
+ const BASE A_imag = conj * CONST_IMAG(A, lda * i + j);
+
+ temp_r += A_real * x_real - A_imag * x_imag;
+ temp_i += A_real * x_imag + A_imag * x_real;
+
+ jx += incX;
+ }
+ if (nonunit) {
+ const BASE x_real = REAL(X, ix);
+ const BASE x_imag = IMAG(X, ix);
+ const BASE A_real = CONST_REAL(A, lda * i + i);
+ const BASE A_imag = conj * CONST_IMAG(A, lda * i + i);
+
+ REAL(X, ix) = temp_r + (A_real * x_real - A_imag * x_imag);
+ IMAG(X, ix) = temp_i + (A_real * x_imag + A_imag * x_real);
+ } else {
+ REAL(X, ix) += temp_r;
+ IMAG(X, ix) += temp_i;
+ }
+ ix += incX;
+ }
+ } else if ((order == CblasRowMajor && Trans == CblasNoTrans && Uplo == CblasLower)
+ || (order == CblasColMajor && Trans == CblasTrans && Uplo == CblasUpper)) {
+
+ INDEX ix = OFFSET(N, incX) + (N - 1) * incX;
+
+ for (i = N; i > 0 && i--;) {
+ BASE temp_r = 0.0;
+ BASE temp_i = 0.0;
+ const INDEX j_max = i;
+ INDEX jx = OFFSET(N, incX);
+ for (j = 0; j < j_max; j++) {
+ const BASE x_real = REAL(X, jx);
+ const BASE x_imag = IMAG(X, jx);
+ const BASE A_real = CONST_REAL(A, lda * i + j);
+ const BASE A_imag = conj * CONST_IMAG(A, lda * i + j);
+
+ temp_r += A_real * x_real - A_imag * x_imag;
+ temp_i += A_real * x_imag + A_imag * x_real;
+
+ jx += incX;
+ }
+ if (nonunit) {
+ const BASE x_real = REAL(X, ix);
+ const BASE x_imag = IMAG(X, ix);
+ const BASE A_real = CONST_REAL(A, lda * i + i);
+ const BASE A_imag = conj * CONST_IMAG(A, lda * i + i);
+
+ REAL(X, ix) = temp_r + (A_real * x_real - A_imag * x_imag);
+ IMAG(X, ix) = temp_i + (A_real * x_imag + A_imag * x_real);
+ } else {
+ REAL(X, ix) += temp_r;
+ IMAG(X, ix) += temp_i;
+ }
+ ix -= incX;
+ }
+ } else if ((order == CblasRowMajor && Trans == CblasTrans && Uplo == CblasUpper)
+ || (order == CblasColMajor && Trans == CblasNoTrans && Uplo == CblasLower)) {
+ /* form x := A'*x */
+
+ INDEX ix = OFFSET(N, incX) + (N - 1) * incX;
+ for (i = N; i > 0 && i--;) {
+ BASE temp_r = 0.0;
+ BASE temp_i = 0.0;
+ const INDEX j_max = i;
+ INDEX jx = OFFSET(N, incX);
+ for (j = 0; j < j_max; j++) {
+ const BASE x_real = REAL(X, jx);
+ const BASE x_imag = IMAG(X, jx);
+ const BASE A_real = CONST_REAL(A, lda * j + i);
+ const BASE A_imag = conj * CONST_IMAG(A, lda * j + i);
+
+ temp_r += A_real * x_real - A_imag * x_imag;
+ temp_i += A_real * x_imag + A_imag * x_real;
+
+ jx += incX;
+ }
+ if (nonunit) {
+ const BASE x_real = REAL(X, ix);
+ const BASE x_imag = IMAG(X, ix);
+ const BASE A_real = CONST_REAL(A, lda * i + i);
+ const BASE A_imag = conj * CONST_IMAG(A, lda * i + i);
+
+ REAL(X, ix) = temp_r + (A_real * x_real - A_imag * x_imag);
+ IMAG(X, ix) = temp_i + (A_real * x_imag + A_imag * x_real);
+ } else {
+ REAL(X, ix) += temp_r;
+ IMAG(X, ix) += temp_i;
+ }
+ ix -= incX;
+ }
+
+ } else if ((order == CblasRowMajor && Trans == CblasTrans && Uplo == CblasLower)
+ || (order == CblasColMajor && Trans == CblasNoTrans && Uplo == CblasUpper)) {
+ INDEX ix = OFFSET(N, incX);
+ for (i = 0; i < N; i++) {
+ BASE temp_r = 0.0;
+ BASE temp_i = 0.0;
+ const INDEX j_min = i + 1;
+ INDEX jx = OFFSET(N, incX) + j_min * incX;
+ for (j = j_min; j < N; j++) {
+ const BASE x_real = REAL(X, jx);
+ const BASE x_imag = IMAG(X, jx);
+ const BASE A_real = CONST_REAL(A, lda * j + i);
+ const BASE A_imag = conj * CONST_IMAG(A, lda * j + i);
+
+ temp_r += A_real * x_real - A_imag * x_imag;
+ temp_i += A_real * x_imag + A_imag * x_real;
+
+ jx += incX;
+ }
+ if (nonunit) {
+ const BASE x_real = REAL(X, ix);
+ const BASE x_imag = IMAG(X, ix);
+ const BASE A_real = CONST_REAL(A, lda * i + i);
+ const BASE A_imag = conj * CONST_IMAG(A, lda * i + i);
+
+ REAL(X, ix) = temp_r + (A_real * x_real - A_imag * x_imag);
+ IMAG(X, ix) = temp_i + (A_real * x_imag + A_imag * x_real);
+ } else {
+ REAL(X, ix) += temp_r;
+ IMAG(X, ix) += temp_i;
+ }
+ ix += incX;
+ }
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+}
diff --git a/gsl-1.9/cblas/source_trmv_r.h b/gsl-1.9/cblas/source_trmv_r.h
new file mode 100644
index 0000000..9d4f3a5
--- /dev/null
+++ b/gsl-1.9/cblas/source_trmv_r.h
@@ -0,0 +1,107 @@
+/* blas/source_trmv_r.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i, j;
+ const int nonunit = (Diag == CblasNonUnit);
+ const int Trans = (TransA != CblasConjTrans) ? TransA : CblasTrans;
+
+ if ((order == CblasRowMajor && Trans == CblasNoTrans && Uplo == CblasUpper)
+ || (order == CblasColMajor && Trans == CblasTrans && Uplo == CblasLower)) {
+ /* form x := A*x */
+
+ INDEX ix = OFFSET(N, incX);
+ for (i = 0; i < N; i++) {
+ BASE temp = 0.0;
+ const INDEX j_min = i + 1;
+ const INDEX j_max = N;
+ INDEX jx = OFFSET(N, incX) + j_min * incX;
+ for (j = j_min; j < j_max; j++) {
+ temp += X[jx] * A[lda * i + j];
+ jx += incX;
+ }
+ if (nonunit) {
+ X[ix] = temp + X[ix] * A[lda * i + i];
+ } else {
+ X[ix] += temp;
+ }
+ ix += incX;
+ }
+ } else if ((order == CblasRowMajor && Trans == CblasNoTrans && Uplo == CblasLower)
+ || (order == CblasColMajor && Trans == CblasTrans && Uplo == CblasUpper)) {
+ INDEX ix = OFFSET(N, incX) + (N - 1) * incX;
+ for (i = N; i > 0 && i--;) {
+ BASE temp = 0.0;
+ const INDEX j_min = 0;
+ const INDEX j_max = i;
+ INDEX jx = OFFSET(N, incX) + j_min * incX;
+ for (j = j_min; j < j_max; j++) {
+ temp += X[jx] * A[lda * i + j];
+ jx += incX;
+ }
+ if (nonunit) {
+ X[ix] = temp + X[ix] * A[lda * i + i];
+ } else {
+ X[ix] += temp;
+ }
+ ix -= incX;
+ }
+ } else if ((order == CblasRowMajor && Trans == CblasTrans && Uplo == CblasUpper)
+ || (order == CblasColMajor && Trans == CblasNoTrans && Uplo == CblasLower)) {
+ /* form x := A'*x */
+ INDEX ix = OFFSET(N, incX) + (N - 1) * incX;
+ for (i = N; i > 0 && i--;) {
+ BASE temp = 0.0;
+ const INDEX j_min = 0;
+ const INDEX j_max = i;
+ INDEX jx = OFFSET(N, incX) + j_min * incX;
+ for (j = j_min; j < j_max; j++) {
+ temp += X[jx] * A[lda * j + i];
+ jx += incX;
+ }
+ if (nonunit) {
+ X[ix] = temp + X[ix] * A[lda * i + i];
+ } else {
+ X[ix] += temp;
+ }
+ ix -= incX;
+ }
+ } else if ((order == CblasRowMajor && Trans == CblasTrans && Uplo == CblasLower)
+ || (order == CblasColMajor && Trans == CblasNoTrans && Uplo == CblasUpper)) {
+ INDEX ix = OFFSET(N, incX);
+ for (i = 0; i < N; i++) {
+ BASE temp = 0.0;
+ const INDEX j_min = i + 1;
+ const INDEX j_max = N;
+ INDEX jx = OFFSET(N, incX) + (i + 1) * incX;
+ for (j = j_min; j < j_max; j++) {
+ temp += X[jx] * A[lda * j + i];
+ jx += incX;
+ }
+ if (nonunit) {
+ X[ix] = temp + X[ix] * A[lda * i + i];
+ } else {
+ X[ix] += temp;
+ }
+ ix += incX;
+ }
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+}
diff --git a/gsl-1.9/cblas/source_trsm_c.h b/gsl-1.9/cblas/source_trsm_c.h
new file mode 100644
index 0000000..d618752
--- /dev/null
+++ b/gsl-1.9/cblas/source_trsm_c.h
@@ -0,0 +1,397 @@
+/* blas/source_trsm_c.h
+ *
+ * Copyright (C) 2001 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i, j, k;
+ INDEX n1, n2;
+ const int nonunit = (Diag == CblasNonUnit);
+ const int conj = (TransA == CblasConjTrans) ? -1 : 1;
+ int side, uplo, trans;
+
+ const BASE alpha_real = CONST_REAL0(alpha);
+ const BASE alpha_imag = CONST_IMAG0(alpha);
+
+ if (Order == CblasRowMajor) {
+ n1 = M;
+ n2 = N;
+ side = Side;
+ uplo = Uplo;
+ trans = TransA;
+ trans = (TransA == CblasNoTrans) ? CblasNoTrans : CblasTrans;
+ } else {
+ n1 = N;
+ n2 = M;
+ side = (Side == CblasLeft) ? CblasRight : CblasLeft; /* exchanged */
+ uplo = (Uplo == CblasUpper) ? CblasLower : CblasUpper; /* exchanged */
+ trans = (TransA == CblasNoTrans) ? CblasNoTrans : CblasTrans; /* same */
+ }
+
+ if (side == CblasLeft && uplo == CblasUpper && trans == CblasNoTrans) {
+
+ /* form B := alpha * inv(TriU(A)) *B */
+
+ if (!(alpha_real == 1.0 && alpha_imag == 0.0)) {
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ const BASE Bij_real = REAL(B, ldb * i + j);
+ const BASE Bij_imag = IMAG(B, ldb * i + j);
+ REAL(B, ldb * i + j) = alpha_real * Bij_real - alpha_imag * Bij_imag;
+ IMAG(B, ldb * i + j) = alpha_real * Bij_imag + alpha_imag * Bij_real;
+ }
+ }
+ }
+
+ for (i = n1; i > 0 && i--;) {
+ if (nonunit) {
+ const BASE Aii_real = CONST_REAL(A, lda * i + i);
+ const BASE Aii_imag = conj * CONST_IMAG(A, lda * i + i);
+ const BASE s = xhypot(Aii_real, Aii_imag);
+ const BASE a_real = Aii_real / s;
+ const BASE a_imag = Aii_imag / s;
+
+ for (j = 0; j < n2; j++) {
+ const BASE Bij_real = REAL(B, ldb * i + j);
+ const BASE Bij_imag = IMAG(B, ldb * i + j);
+ REAL(B, ldb * i + j) = (Bij_real * a_real + Bij_imag * a_imag) / s;
+ IMAG(B, ldb * i + j) = (Bij_imag * a_real - Bij_real * a_imag) / s;
+ }
+ }
+
+ for (k = 0; k < i; k++) {
+ const BASE Aki_real = CONST_REAL(A, k * lda + i);
+ const BASE Aki_imag = conj * CONST_IMAG(A, k * lda + i);
+ for (j = 0; j < n2; j++) {
+ const BASE Bij_real = REAL(B, ldb * i + j);
+ const BASE Bij_imag = IMAG(B, ldb * i + j);
+ REAL(B, ldb * k + j) -= Aki_real * Bij_real - Aki_imag * Bij_imag;
+ IMAG(B, ldb * k + j) -= Aki_real * Bij_imag + Aki_imag * Bij_real;
+ }
+ }
+ }
+
+ } else if (side == CblasLeft && uplo == CblasUpper && trans == CblasTrans) {
+
+ /* form B := alpha * inv(TriU(A))' *B */
+
+ if (!(alpha_real == 1.0 && alpha_imag == 0.0)) {
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ const BASE Bij_real = REAL(B, ldb * i + j);
+ const BASE Bij_imag = IMAG(B, ldb * i + j);
+ REAL(B, ldb * i + j) = alpha_real * Bij_real - alpha_imag * Bij_imag;
+ IMAG(B, ldb * i + j) = alpha_real * Bij_imag + alpha_imag * Bij_real;
+ }
+ }
+ }
+
+ for (i = 0; i < n1; i++) {
+
+ if (nonunit) {
+ const BASE Aii_real = CONST_REAL(A, lda * i + i);
+ const BASE Aii_imag = conj * CONST_IMAG(A, lda * i + i);
+ const BASE s = xhypot(Aii_real, Aii_imag);
+ const BASE a_real = Aii_real / s;
+ const BASE a_imag = Aii_imag / s;
+
+ for (j = 0; j < n2; j++) {
+ const BASE Bij_real = REAL(B, ldb * i + j);
+ const BASE Bij_imag = IMAG(B, ldb * i + j);
+ REAL(B, ldb * i + j) = (Bij_real * a_real + Bij_imag * a_imag) / s;
+ IMAG(B, ldb * i + j) = (Bij_imag * a_real - Bij_real * a_imag) / s;
+ }
+ }
+
+ for (k = i + 1; k < n1; k++) {
+ const BASE Aik_real = CONST_REAL(A, i * lda + k);
+ const BASE Aik_imag = conj * CONST_IMAG(A, i * lda + k);
+ for (j = 0; j < n2; j++) {
+ const BASE Bij_real = REAL(B, ldb * i + j);
+ const BASE Bij_imag = IMAG(B, ldb * i + j);
+ REAL(B, ldb * k + j) -= Aik_real * Bij_real - Aik_imag * Bij_imag;
+ IMAG(B, ldb * k + j) -= Aik_real * Bij_imag + Aik_imag * Bij_real;
+ }
+ }
+ }
+
+ } else if (side == CblasLeft && uplo == CblasLower && trans == CblasNoTrans) {
+
+ /* form B := alpha * inv(TriL(A))*B */
+
+ if (!(alpha_real == 1.0 && alpha_imag == 0.0)) {
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ const BASE Bij_real = REAL(B, ldb * i + j);
+ const BASE Bij_imag = IMAG(B, ldb * i + j);
+ REAL(B, ldb * i + j) = alpha_real * Bij_real - alpha_imag * Bij_imag;
+ IMAG(B, ldb * i + j) = alpha_real * Bij_imag + alpha_imag * Bij_real;
+ }
+ }
+ }
+
+ for (i = 0; i < n1; i++) {
+
+ if (nonunit) {
+ const BASE Aii_real = CONST_REAL(A, lda * i + i);
+ const BASE Aii_imag = conj * CONST_IMAG(A, lda * i + i);
+ const BASE s = xhypot(Aii_real, Aii_imag);
+ const BASE a_real = Aii_real / s;
+ const BASE a_imag = Aii_imag / s;
+
+ for (j = 0; j < n2; j++) {
+ const BASE Bij_real = REAL(B, ldb * i + j);
+ const BASE Bij_imag = IMAG(B, ldb * i + j);
+ REAL(B, ldb * i + j) = (Bij_real * a_real + Bij_imag * a_imag) / s;
+ IMAG(B, ldb * i + j) = (Bij_imag * a_real - Bij_real * a_imag) / s;
+ }
+ }
+
+ for (k = i + 1; k < n1; k++) {
+ const BASE Aki_real = CONST_REAL(A, k * lda + i);
+ const BASE Aki_imag = conj * CONST_IMAG(A, k * lda + i);
+ for (j = 0; j < n2; j++) {
+ const BASE Bij_real = REAL(B, ldb * i + j);
+ const BASE Bij_imag = IMAG(B, ldb * i + j);
+ REAL(B, ldb * k + j) -= Aki_real * Bij_real - Aki_imag * Bij_imag;
+ IMAG(B, ldb * k + j) -= Aki_real * Bij_imag + Aki_imag * Bij_real;
+ }
+ }
+ }
+
+
+ } else if (side == CblasLeft && uplo == CblasLower && trans == CblasTrans) {
+
+ /* form B := alpha * TriL(A)' *B */
+
+ if (!(alpha_real == 1.0 && alpha_imag == 0.0)) {
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ const BASE Bij_real = REAL(B, ldb * i + j);
+ const BASE Bij_imag = IMAG(B, ldb * i + j);
+ REAL(B, ldb * i + j) = alpha_real * Bij_real - alpha_imag * Bij_imag;
+ IMAG(B, ldb * i + j) = alpha_real * Bij_imag + alpha_imag * Bij_real;
+ }
+ }
+ }
+
+ for (i = n1; i > 0 && i--;) {
+ if (nonunit) {
+ const BASE Aii_real = CONST_REAL(A, lda * i + i);
+ const BASE Aii_imag = conj * CONST_IMAG(A, lda * i + i);
+ const BASE s = xhypot(Aii_real, Aii_imag);
+ const BASE a_real = Aii_real / s;
+ const BASE a_imag = Aii_imag / s;
+
+ for (j = 0; j < n2; j++) {
+ const BASE Bij_real = REAL(B, ldb * i + j);
+ const BASE Bij_imag = IMAG(B, ldb * i + j);
+ REAL(B, ldb * i + j) = (Bij_real * a_real + Bij_imag * a_imag) / s;
+ IMAG(B, ldb * i + j) = (Bij_imag * a_real - Bij_real * a_imag) / s;
+ }
+ }
+
+ for (k = 0; k < i; k++) {
+ const BASE Aik_real = CONST_REAL(A, i * lda + k);
+ const BASE Aik_imag = conj * CONST_IMAG(A, i * lda + k);
+ for (j = 0; j < n2; j++) {
+ const BASE Bij_real = REAL(B, ldb * i + j);
+ const BASE Bij_imag = IMAG(B, ldb * i + j);
+ REAL(B, ldb * k + j) -= Aik_real * Bij_real - Aik_imag * Bij_imag;
+ IMAG(B, ldb * k + j) -= Aik_real * Bij_imag + Aik_imag * Bij_real;
+ }
+ }
+ }
+
+ } else if (side == CblasRight && uplo == CblasUpper && trans == CblasNoTrans) {
+
+ /* form B := alpha * B * inv(TriU(A)) */
+
+ if (!(alpha_real == 1.0 && alpha_imag == 0.0)) {
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ const BASE Bij_real = REAL(B, ldb * i + j);
+ const BASE Bij_imag = IMAG(B, ldb * i + j);
+ REAL(B, ldb * i + j) = alpha_real * Bij_real - alpha_imag * Bij_imag;
+ IMAG(B, ldb * i + j) = alpha_real * Bij_imag + alpha_imag * Bij_real;
+ }
+ }
+ }
+
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ if (nonunit) {
+ const BASE Ajj_real = CONST_REAL(A, lda * j + j);
+ const BASE Ajj_imag = conj * CONST_IMAG(A, lda * j + j);
+ const BASE s = xhypot(Ajj_real, Ajj_imag);
+ const BASE a_real = Ajj_real / s;
+ const BASE a_imag = Ajj_imag / s;
+ const BASE Bij_real = REAL(B, ldb * i + j);
+ const BASE Bij_imag = IMAG(B, ldb * i + j);
+ REAL(B, ldb * i + j) = (Bij_real * a_real + Bij_imag * a_imag) / s;
+ IMAG(B, ldb * i + j) = (Bij_imag * a_real - Bij_real * a_imag) / s;
+ }
+
+ {
+ const BASE Bij_real = REAL(B, ldb * i + j);
+ const BASE Bij_imag = IMAG(B, ldb * i + j);
+ for (k = j + 1; k < n2; k++) {
+ const BASE Ajk_real = CONST_REAL(A, j * lda + k);
+ const BASE Ajk_imag = conj * CONST_IMAG(A, j * lda + k);
+ REAL(B, ldb * i + k) -= Ajk_real * Bij_real - Ajk_imag * Bij_imag;
+ IMAG(B, ldb * i + k) -= Ajk_real * Bij_imag + Ajk_imag * Bij_real;
+ }
+ }
+ }
+ }
+
+ } else if (side == CblasRight && uplo == CblasUpper && trans == CblasTrans) {
+
+ /* form B := alpha * B * inv(TriU(A))' */
+
+ if (!(alpha_real == 1.0 && alpha_imag == 0.0)) {
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ const BASE Bij_real = REAL(B, ldb * i + j);
+ const BASE Bij_imag = IMAG(B, ldb * i + j);
+ REAL(B, ldb * i + j) = alpha_real * Bij_real - alpha_imag * Bij_imag;
+ IMAG(B, ldb * i + j) = alpha_real * Bij_imag + alpha_imag * Bij_real;
+ }
+ }
+ }
+
+ for (i = 0; i < n1; i++) {
+ for (j = n2; j > 0 && j--;) {
+
+ if (nonunit) {
+ const BASE Ajj_real = CONST_REAL(A, lda * j + j);
+ const BASE Ajj_imag = conj * CONST_IMAG(A, lda * j + j);
+ const BASE s = xhypot(Ajj_real, Ajj_imag);
+ const BASE a_real = Ajj_real / s;
+ const BASE a_imag = Ajj_imag / s;
+ const BASE Bij_real = REAL(B, ldb * i + j);
+ const BASE Bij_imag = IMAG(B, ldb * i + j);
+ REAL(B, ldb * i + j) = (Bij_real * a_real + Bij_imag * a_imag) / s;
+ IMAG(B, ldb * i + j) = (Bij_imag * a_real - Bij_real * a_imag) / s;
+ }
+
+ {
+ const BASE Bij_real = REAL(B, ldb * i + j);
+ const BASE Bij_imag = IMAG(B, ldb * i + j);
+ for (k = 0; k < j; k++) {
+ const BASE Akj_real = CONST_REAL(A, k * lda + j);
+ const BASE Akj_imag = conj * CONST_IMAG(A, k * lda + j);
+ REAL(B, ldb * i + k) -= Akj_real * Bij_real - Akj_imag * Bij_imag;
+ IMAG(B, ldb * i + k) -= Akj_real * Bij_imag + Akj_imag * Bij_real;
+ }
+ }
+ }
+ }
+
+
+ } else if (side == CblasRight && uplo == CblasLower && trans == CblasNoTrans) {
+
+ /* form B := alpha * B * inv(TriL(A)) */
+
+ if (!(alpha_real == 1.0 && alpha_imag == 0.0)) {
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ const BASE Bij_real = REAL(B, ldb * i + j);
+ const BASE Bij_imag = IMAG(B, ldb * i + j);
+ REAL(B, ldb * i + j) = alpha_real * Bij_real - alpha_imag * Bij_imag;
+ IMAG(B, ldb * i + j) = alpha_real * Bij_imag + alpha_imag * Bij_real;
+ }
+ }
+ }
+
+ for (i = 0; i < n1; i++) {
+ for (j = n2; j > 0 && j--;) {
+
+ if (nonunit) {
+ const BASE Ajj_real = CONST_REAL(A, lda * j + j);
+ const BASE Ajj_imag = conj * CONST_IMAG(A, lda * j + j);
+ const BASE s = xhypot(Ajj_real, Ajj_imag);
+ const BASE a_real = Ajj_real / s;
+ const BASE a_imag = Ajj_imag / s;
+ const BASE Bij_real = REAL(B, ldb * i + j);
+ const BASE Bij_imag = IMAG(B, ldb * i + j);
+ REAL(B, ldb * i + j) = (Bij_real * a_real + Bij_imag * a_imag) / s;
+ IMAG(B, ldb * i + j) = (Bij_imag * a_real - Bij_real * a_imag) / s;
+ }
+
+ {
+ const BASE Bij_real = REAL(B, ldb * i + j);
+ const BASE Bij_imag = IMAG(B, ldb * i + j);
+ for (k = 0; k < j; k++) {
+ const BASE Ajk_real = CONST_REAL(A, j * lda + k);
+ const BASE Ajk_imag = conj * CONST_IMAG(A, j * lda + k);
+ REAL(B, ldb * i + k) -= Ajk_real * Bij_real - Ajk_imag * Bij_imag;
+ IMAG(B, ldb * i + k) -= Ajk_real * Bij_imag + Ajk_imag * Bij_real;
+ }
+ }
+ }
+ }
+
+ } else if (side == CblasRight && uplo == CblasLower && trans == CblasTrans) {
+
+ /* form B := alpha * B * inv(TriL(A))' */
+
+
+ if (!(alpha_real == 1.0 && alpha_imag == 0.0)) {
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ const BASE Bij_real = REAL(B, ldb * i + j);
+ const BASE Bij_imag = IMAG(B, ldb * i + j);
+ REAL(B, ldb * i + j) = alpha_real * Bij_real - alpha_imag * Bij_imag;
+ IMAG(B, ldb * i + j) = alpha_real * Bij_imag + alpha_imag * Bij_real;
+ }
+ }
+ }
+
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ if (nonunit) {
+ const BASE Ajj_real = CONST_REAL(A, lda * j + j);
+ const BASE Ajj_imag = conj * CONST_IMAG(A, lda * j + j);
+ const BASE s = xhypot(Ajj_real, Ajj_imag);
+ const BASE a_real = Ajj_real / s;
+ const BASE a_imag = Ajj_imag / s;
+ const BASE Bij_real = REAL(B, ldb * i + j);
+ const BASE Bij_imag = IMAG(B, ldb * i + j);
+ REAL(B, ldb * i + j) = (Bij_real * a_real + Bij_imag * a_imag) / s;
+ IMAG(B, ldb * i + j) = (Bij_imag * a_real - Bij_real * a_imag) / s;
+ }
+
+ {
+ const BASE Bij_real = REAL(B, ldb * i + j);
+ const BASE Bij_imag = IMAG(B, ldb * i + j);
+
+ for (k = j + 1; k < n2; k++) {
+ const BASE Akj_real = CONST_REAL(A, k * lda + j);
+ const BASE Akj_imag = conj * CONST_IMAG(A, k * lda + j);
+ REAL(B, ldb * i + k) -= Akj_real * Bij_real - Akj_imag * Bij_imag;
+ IMAG(B, ldb * i + k) -= Akj_real * Bij_imag + Akj_imag * Bij_real;
+ }
+ }
+ }
+ }
+
+
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+}
diff --git a/gsl-1.9/cblas/source_trsm_r.h b/gsl-1.9/cblas/source_trsm_r.h
new file mode 100644
index 0000000..5cb8955
--- /dev/null
+++ b/gsl-1.9/cblas/source_trsm_r.h
@@ -0,0 +1,275 @@
+/* blas/source_trsm_r.h
+ *
+ * Copyright (C) 2001 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ INDEX i, j, k;
+ INDEX n1, n2;
+ const int nonunit = (Diag == CblasNonUnit);
+ int side, uplo, trans;
+
+ if (Order == CblasRowMajor) {
+ n1 = M;
+ n2 = N;
+ side = Side;
+ uplo = Uplo;
+ trans = (TransA == CblasConjTrans) ? CblasTrans : TransA;
+ } else {
+ n1 = N;
+ n2 = M;
+ side = (Side == CblasLeft) ? CblasRight : CblasLeft;
+ uplo = (Uplo == CblasUpper) ? CblasLower : CblasUpper;
+ trans = (TransA == CblasConjTrans) ? CblasTrans : TransA;
+ }
+
+ if (side == CblasLeft && uplo == CblasUpper && trans == CblasNoTrans) {
+
+ /* form B := alpha * inv(TriU(A)) *B */
+
+ if (alpha != 1.0) {
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ B[ldb * i + j] *= alpha;
+ }
+ }
+ }
+
+ for (i = n1; i > 0 && i--;) {
+ if (nonunit) {
+ BASE Aii = A[lda * i + i];
+ for (j = 0; j < n2; j++) {
+ B[ldb * i + j] /= Aii;
+ }
+ }
+
+ for (k = 0; k < i; k++) {
+ const BASE Aki = A[k * lda + i];
+ for (j = 0; j < n2; j++) {
+ B[ldb * k + j] -= Aki * B[ldb * i + j];
+ }
+ }
+ }
+
+ } else if (side == CblasLeft && uplo == CblasUpper && trans == CblasTrans) {
+
+ /* form B := alpha * inv(TriU(A))' *B */
+
+ if (alpha != 1.0) {
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ B[ldb * i + j] *= alpha;
+ }
+ }
+ }
+
+ for (i = 0; i < n1; i++) {
+ if (nonunit) {
+ BASE Aii = A[lda * i + i];
+ for (j = 0; j < n2; j++) {
+ B[ldb * i + j] /= Aii;
+ }
+ }
+
+ for (k = i + 1; k < n1; k++) {
+ const BASE Aik = A[i * lda + k];
+ for (j = 0; j < n2; j++) {
+ B[ldb * k + j] -= Aik * B[ldb * i + j];
+ }
+ }
+ }
+
+ } else if (side == CblasLeft && uplo == CblasLower && trans == CblasNoTrans) {
+
+ /* form B := alpha * inv(TriL(A))*B */
+
+
+ if (alpha != 1.0) {
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ B[ldb * i + j] *= alpha;
+ }
+ }
+ }
+
+ for (i = 0; i < n1; i++) {
+ if (nonunit) {
+ BASE Aii = A[lda * i + i];
+ for (j = 0; j < n2; j++) {
+ B[ldb * i + j] /= Aii;
+ }
+ }
+
+ for (k = i + 1; k < n1; k++) {
+ const BASE Aki = A[k * lda + i];
+ for (j = 0; j < n2; j++) {
+ B[ldb * k + j] -= Aki * B[ldb * i + j];
+ }
+ }
+ }
+
+
+ } else if (side == CblasLeft && uplo == CblasLower && trans == CblasTrans) {
+
+ /* form B := alpha * TriL(A)' *B */
+
+ if (alpha != 1.0) {
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ B[ldb * i + j] *= alpha;
+ }
+ }
+ }
+
+ for (i = n1; i > 0 && i--;) {
+ if (nonunit) {
+ BASE Aii = A[lda * i + i];
+ for (j = 0; j < n2; j++) {
+ B[ldb * i + j] /= Aii;
+ }
+ }
+
+ for (k = 0; k < i; k++) {
+ const BASE Aik = A[i * lda + k];
+ for (j = 0; j < n2; j++) {
+ B[ldb * k + j] -= Aik * B[ldb * i + j];
+ }
+ }
+ }
+
+ } else if (side == CblasRight && uplo == CblasUpper && trans == CblasNoTrans) {
+
+ /* form B := alpha * B * inv(TriU(A)) */
+
+ if (alpha != 1.0) {
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ B[ldb * i + j] *= alpha;
+ }
+ }
+ }
+
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ if (nonunit) {
+ BASE Ajj = A[lda * j + j];
+ B[ldb * i + j] /= Ajj;
+ }
+
+ {
+ BASE Bij = B[ldb * i + j];
+ for (k = j + 1; k < n2; k++) {
+ B[ldb * i + k] -= A[j * lda + k] * Bij;
+ }
+ }
+ }
+ }
+
+ } else if (side == CblasRight && uplo == CblasUpper && trans == CblasTrans) {
+
+ /* form B := alpha * B * inv(TriU(A))' */
+
+ if (alpha != 1.0) {
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ B[ldb * i + j] *= alpha;
+ }
+ }
+ }
+
+ for (i = 0; i < n1; i++) {
+ for (j = n2; j > 0 && j--;) {
+
+ if (nonunit) {
+ BASE Ajj = A[lda * j + j];
+ B[ldb * i + j] /= Ajj;
+ }
+
+ {
+ BASE Bij = B[ldb * i + j];
+ for (k = 0; k < j; k++) {
+ B[ldb * i + k] -= A[k * lda + j] * Bij;
+ }
+ }
+ }
+ }
+
+
+ } else if (side == CblasRight && uplo == CblasLower && trans == CblasNoTrans) {
+
+ /* form B := alpha * B * inv(TriL(A)) */
+
+ if (alpha != 1.0) {
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ B[ldb * i + j] *= alpha;
+ }
+ }
+ }
+
+ for (i = 0; i < n1; i++) {
+ for (j = n2; j > 0 && j--;) {
+
+ if (nonunit) {
+ BASE Ajj = A[lda * j + j];
+ B[ldb * i + j] /= Ajj;
+ }
+
+ {
+ BASE Bij = B[ldb * i + j];
+ for (k = 0; k < j; k++) {
+ B[ldb * i + k] -= A[j * lda + k] * Bij;
+ }
+ }
+ }
+ }
+
+ } else if (side == CblasRight && uplo == CblasLower && trans == CblasTrans) {
+
+ /* form B := alpha * B * inv(TriL(A))' */
+
+
+ if (alpha != 1.0) {
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ B[ldb * i + j] *= alpha;
+ }
+ }
+ }
+
+ for (i = 0; i < n1; i++) {
+ for (j = 0; j < n2; j++) {
+ if (nonunit) {
+ BASE Ajj = A[lda * j + j];
+ B[ldb * i + j] /= Ajj;
+ }
+
+ {
+ BASE Bij = B[ldb * i + j];
+ for (k = j + 1; k < n2; k++) {
+ B[ldb * i + k] -= A[k * lda + j] * Bij;
+ }
+ }
+ }
+ }
+
+
+
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+}
diff --git a/gsl-1.9/cblas/source_trsv_c.h b/gsl-1.9/cblas/source_trsv_c.h
new file mode 100644
index 0000000..4d1b075
--- /dev/null
+++ b/gsl-1.9/cblas/source_trsv_c.h
@@ -0,0 +1,228 @@
+/* blas/source_trsv_c.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ const int conj = (TransA == CblasConjTrans) ? -1 : 1;
+ const int Trans = (TransA != CblasConjTrans) ? TransA : CblasTrans;
+ const int nonunit = (Diag == CblasNonUnit);
+ INDEX i, j;
+ INDEX ix, jx;
+
+ if (N == 0)
+ return;
+
+ /* form x := inv( A )*x */
+
+ if ((order == CblasRowMajor && Trans == CblasNoTrans && Uplo == CblasUpper)
+ || (order == CblasColMajor && Trans == CblasTrans && Uplo == CblasLower)) {
+
+ ix = OFFSET(N, incX) + incX * (N - 1);
+
+ if (nonunit) {
+ const BASE a_real = CONST_REAL(A, lda * (N - 1) + (N - 1));
+ const BASE a_imag = conj * CONST_IMAG(A, lda * (N - 1) + (N - 1));
+ const BASE x_real = REAL(X, ix);
+ const BASE x_imag = IMAG(X, ix);
+ const BASE s = xhypot(a_real, a_imag);
+ const BASE b_real = a_real / s;
+ const BASE b_imag = a_imag / s;
+ REAL(X, ix) = (x_real * b_real + x_imag * b_imag) / s;
+ IMAG(X, ix) = (x_imag * b_real - b_imag * x_real) / s;
+ }
+
+ ix -= incX;
+
+ for (i = N - 1; i > 0 && i--;) {
+ BASE tmp_real = REAL(X, ix);
+ BASE tmp_imag = IMAG(X, ix);
+ jx = ix + incX;
+ for (j = i + 1; j < N; j++) {
+ const BASE Aij_real = CONST_REAL(A, lda * i + j);
+ const BASE Aij_imag = conj * CONST_IMAG(A, lda * i + j);
+ const BASE x_real = REAL(X, jx);
+ const BASE x_imag = IMAG(X, jx);
+ tmp_real -= Aij_real * x_real - Aij_imag * x_imag;
+ tmp_imag -= Aij_real * x_imag + Aij_imag * x_real;
+ jx += incX;
+ }
+
+ if (nonunit) {
+ const BASE a_real = CONST_REAL(A, lda * i + i);
+ const BASE a_imag = conj * CONST_IMAG(A, lda * i + i);
+ const BASE s = xhypot(a_real, a_imag);
+ const BASE b_real = a_real / s;
+ const BASE b_imag = a_imag / s;
+ REAL(X, ix) = (tmp_real * b_real + tmp_imag * b_imag) / s;
+ IMAG(X, ix) = (tmp_imag * b_real - tmp_real * b_imag) / s;
+ } else {
+ REAL(X, ix) = tmp_real;
+ IMAG(X, ix) = tmp_imag;
+ }
+ ix -= incX;
+ }
+
+ } else if ((order == CblasRowMajor && Trans == CblasNoTrans && Uplo == CblasLower)
+ || (order == CblasColMajor && Trans == CblasTrans && Uplo == CblasUpper)) {
+ /* forward substitution */
+
+ ix = OFFSET(N, incX);
+
+ if (nonunit) {
+ const BASE a_real = CONST_REAL(A, lda * 0 + 0);
+ const BASE a_imag = conj * CONST_IMAG(A, lda * 0 + 0);
+ const BASE x_real = REAL(X, ix);
+ const BASE x_imag = IMAG(X, ix);
+ const BASE s = xhypot(a_real, a_imag);
+ const BASE b_real = a_real / s;
+ const BASE b_imag = a_imag / s;
+ REAL(X, ix) = (x_real * b_real + x_imag * b_imag) / s;
+ IMAG(X, ix) = (x_imag * b_real - b_imag * x_real) / s;
+ }
+
+ ix += incX;
+
+ for (i = 1; i < N; i++) {
+ BASE tmp_real = REAL(X, ix);
+ BASE tmp_imag = IMAG(X, ix);
+ jx = OFFSET(N, incX);
+ for (j = 0; j < i; j++) {
+ const BASE Aij_real = CONST_REAL(A, lda * i + j);
+ const BASE Aij_imag = conj * CONST_IMAG(A, lda * i + j);
+ const BASE x_real = REAL(X, jx);
+ const BASE x_imag = IMAG(X, jx);
+ tmp_real -= Aij_real * x_real - Aij_imag * x_imag;
+ tmp_imag -= Aij_real * x_imag + Aij_imag * x_real;
+ jx += incX;
+ }
+ if (nonunit) {
+ const BASE a_real = CONST_REAL(A, lda * i + i);
+ const BASE a_imag = conj * CONST_IMAG(A, lda * i + i);
+ const BASE s = xhypot(a_real, a_imag);
+ const BASE b_real = a_real / s;
+ const BASE b_imag = a_imag / s;
+ REAL(X, ix) = (tmp_real * b_real + tmp_imag * b_imag) / s;
+ IMAG(X, ix) = (tmp_imag * b_real - tmp_real * b_imag) / s;
+ } else {
+ REAL(X, ix) = tmp_real;
+ IMAG(X, ix) = tmp_imag;
+ }
+ ix += incX;
+ }
+ } else if ((order == CblasRowMajor && Trans == CblasTrans && Uplo == CblasUpper)
+ || (order == CblasColMajor && Trans == CblasNoTrans && Uplo == CblasLower)) {
+ /* form x := inv( A' )*x */
+
+ /* forward substitution */
+
+ ix = OFFSET(N, incX);
+
+ if (nonunit) {
+ const BASE a_real = CONST_REAL(A, lda * 0 + 0);
+ const BASE a_imag = conj * CONST_IMAG(A, lda * 0 + 0);
+ const BASE x_real = REAL(X, ix);
+ const BASE x_imag = IMAG(X, ix);
+ const BASE s = xhypot(a_real, a_imag);
+ const BASE b_real = a_real / s;
+ const BASE b_imag = a_imag / s;
+ REAL(X, ix) = (x_real * b_real + x_imag * b_imag) / s;
+ IMAG(X, ix) = (x_imag * b_real - b_imag * x_real) / s;
+ }
+
+ ix += incX;
+
+ for (i = 1; i < N; i++) {
+ BASE tmp_real = REAL(X, ix);
+ BASE tmp_imag = IMAG(X, ix);
+ jx = OFFSET(N, incX);
+ for (j = 0; j < i; j++) {
+ const BASE Aij_real = CONST_REAL(A, lda * j + i);
+ const BASE Aij_imag = conj * CONST_IMAG(A, lda * j + i);
+ const BASE x_real = REAL(X, jx);
+ const BASE x_imag = IMAG(X, jx);
+ tmp_real -= Aij_real * x_real - Aij_imag * x_imag;
+ tmp_imag -= Aij_real * x_imag + Aij_imag * x_real;
+ jx += incX;
+ }
+ if (nonunit) {
+ const BASE a_real = CONST_REAL(A, lda * i + i);
+ const BASE a_imag = conj * CONST_IMAG(A, lda * i + i);
+ const BASE s = xhypot(a_real, a_imag);
+ const BASE b_real = a_real / s;
+ const BASE b_imag = a_imag / s;
+ REAL(X, ix) = (tmp_real * b_real + tmp_imag * b_imag) / s;
+ IMAG(X, ix) = (tmp_imag * b_real - tmp_real * b_imag) / s;
+ } else {
+ REAL(X, ix) = tmp_real;
+ IMAG(X, ix) = tmp_imag;
+ }
+ ix += incX;
+ }
+ } else if ((order == CblasRowMajor && Trans == CblasTrans && Uplo == CblasLower)
+ || (order == CblasColMajor && Trans == CblasNoTrans && Uplo == CblasUpper)) {
+
+ /* backsubstitution */
+
+ ix = OFFSET(N, incX) + incX * (N - 1);
+
+ if (nonunit) {
+ const BASE a_real = CONST_REAL(A, lda * (N - 1) + (N - 1));
+ const BASE a_imag = conj * CONST_IMAG(A, lda * (N - 1) + (N - 1));
+ const BASE x_real = REAL(X, ix);
+ const BASE x_imag = IMAG(X, ix);
+ const BASE s = xhypot(a_real, a_imag);
+ const BASE b_real = a_real / s;
+ const BASE b_imag = a_imag / s;
+ REAL(X, ix) = (x_real * b_real + x_imag * b_imag) / s;
+ IMAG(X, ix) = (x_imag * b_real - b_imag * x_real) / s;
+ }
+
+ ix -= incX;
+
+ for (i = N - 1; i > 0 && i--;) {
+ BASE tmp_real = REAL(X, ix);
+ BASE tmp_imag = IMAG(X, ix);
+ jx = ix + incX;
+ for (j = i + 1; j < N; j++) {
+ const BASE Aij_real = CONST_REAL(A, lda * j + i);
+ const BASE Aij_imag = conj * CONST_IMAG(A, lda * j + i);
+ const BASE x_real = REAL(X, jx);
+ const BASE x_imag = IMAG(X, jx);
+ tmp_real -= Aij_real * x_real - Aij_imag * x_imag;
+ tmp_imag -= Aij_real * x_imag + Aij_imag * x_real;
+ jx += incX;
+ }
+
+ if (nonunit) {
+ const BASE a_real = CONST_REAL(A, lda * i + i);
+ const BASE a_imag = conj * CONST_IMAG(A, lda * i + i);
+ const BASE s = xhypot(a_real, a_imag);
+ const BASE b_real = a_real / s;
+ const BASE b_imag = a_imag / s;
+ REAL(X, ix) = (tmp_real * b_real + tmp_imag * b_imag) / s;
+ IMAG(X, ix) = (tmp_imag * b_real - tmp_real * b_imag) / s;
+ } else {
+ REAL(X, ix) = tmp_real;
+ IMAG(X, ix) = tmp_imag;
+ }
+ ix -= incX;
+ }
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+}
diff --git a/gsl-1.9/cblas/source_trsv_r.h b/gsl-1.9/cblas/source_trsv_r.h
new file mode 100644
index 0000000..40246f3
--- /dev/null
+++ b/gsl-1.9/cblas/source_trsv_r.h
@@ -0,0 +1,132 @@
+/* blas/source_trsv_r.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+{
+ const int nonunit = (Diag == CblasNonUnit);
+ INDEX ix, jx;
+ INDEX i, j;
+ const int Trans = (TransA != CblasConjTrans) ? TransA : CblasTrans;
+
+ if (N == 0)
+ return;
+
+ /* form x := inv( A )*x */
+
+ if ((order == CblasRowMajor && Trans == CblasNoTrans && Uplo == CblasUpper)
+ || (order == CblasColMajor && Trans == CblasTrans && Uplo == CblasLower)) {
+ /* backsubstitution */
+ ix = OFFSET(N, incX) + incX * (N - 1);
+ if (nonunit) {
+ X[ix] = X[ix] / A[lda * (N - 1) + (N - 1)];
+ }
+ ix -= incX;
+ for (i = N - 1; i > 0 && i--;) {
+ BASE tmp = X[ix];
+ jx = ix + incX;
+ for (j = i + 1; j < N; j++) {
+ const BASE Aij = A[lda * i + j];
+ tmp -= Aij * X[jx];
+ jx += incX;
+ }
+ if (nonunit) {
+ X[ix] = tmp / A[lda * i + i];
+ } else {
+ X[ix] = tmp;
+ }
+ ix -= incX;
+ }
+ } else if ((order == CblasRowMajor && Trans == CblasNoTrans && Uplo == CblasLower)
+ || (order == CblasColMajor && Trans == CblasTrans && Uplo == CblasUpper)) {
+
+ /* forward substitution */
+ ix = OFFSET(N, incX);
+ if (nonunit) {
+ X[ix] = X[ix] / A[lda * 0 + 0];
+ }
+ ix += incX;
+ for (i = 1; i < N; i++) {
+ BASE tmp = X[ix];
+ jx = OFFSET(N, incX);
+ for (j = 0; j < i; j++) {
+ const BASE Aij = A[lda * i + j];
+ tmp -= Aij * X[jx];
+ jx += incX;
+ }
+ if (nonunit) {
+ X[ix] = tmp / A[lda * i + i];
+ } else {
+ X[ix] = tmp;
+ }
+ ix += incX;
+ }
+ } else if ((order == CblasRowMajor && Trans == CblasTrans && Uplo == CblasUpper)
+ || (order == CblasColMajor && Trans == CblasNoTrans && Uplo == CblasLower)) {
+
+ /* form x := inv( A' )*x */
+
+ /* forward substitution */
+ ix = OFFSET(N, incX);
+ if (nonunit) {
+ X[ix] = X[ix] / A[lda * 0 + 0];
+ }
+ ix += incX;
+ for (i = 1; i < N; i++) {
+ BASE tmp = X[ix];
+ jx = OFFSET(N, incX);
+ for (j = 0; j < i; j++) {
+ const BASE Aji = A[lda * j + i];
+ tmp -= Aji * X[jx];
+ jx += incX;
+ }
+ if (nonunit) {
+ X[ix] = tmp / A[lda * i + i];
+ } else {
+ X[ix] = tmp;
+ }
+ ix += incX;
+ }
+ } else if ((order == CblasRowMajor && Trans == CblasTrans && Uplo == CblasLower)
+ || (order == CblasColMajor && Trans == CblasNoTrans && Uplo == CblasUpper)) {
+
+ /* backsubstitution */
+ ix = OFFSET(N, incX) + (N - 1) * incX;
+ if (nonunit) {
+ X[ix] = X[ix] / A[lda * (N - 1) + (N - 1)];
+ }
+ ix -= incX;
+ for (i = N - 1; i > 0 && i--;) {
+ BASE tmp = X[ix];
+ jx = ix + incX;
+ for (j = i + 1; j < N; j++) {
+ const BASE Aji = A[lda * j + i];
+ tmp -= Aji * X[jx];
+ jx += incX;
+ }
+ if (nonunit) {
+ X[ix] = tmp / A[lda * i + i];
+ } else {
+ X[ix] = tmp;
+ }
+ ix -= incX;
+ }
+ } else {
+ BLAS_ERROR("unrecognized operation");
+ }
+
+}
diff --git a/gsl-1.9/cblas/srot.c b/gsl-1.9/cblas/srot.c
new file mode 100644
index 0000000..ee602d0
--- /dev/null
+++ b/gsl-1.9/cblas/srot.c
@@ -0,0 +1,12 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_srot (const int N, float *X, const int incX, float *Y, const int incY,
+ const float c, const float s)
+{
+#define BASE float
+#include "source_rot.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/srotg.c b/gsl-1.9/cblas/srotg.c
new file mode 100644
index 0000000..65b2796
--- /dev/null
+++ b/gsl-1.9/cblas/srotg.c
@@ -0,0 +1,11 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_srotg (float *a, float *b, float *c, float *s)
+{
+#define BASE float
+#include "source_rotg.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/srotm.c b/gsl-1.9/cblas/srotm.c
new file mode 100644
index 0000000..b4707e6
--- /dev/null
+++ b/gsl-1.9/cblas/srotm.c
@@ -0,0 +1,12 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_srotm (const int N, float *X, const int incX, float *Y, const int incY,
+ const float *P)
+{
+#define BASE float
+#include "source_rotm.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/srotmg.c b/gsl-1.9/cblas/srotmg.c
new file mode 100644
index 0000000..3366300
--- /dev/null
+++ b/gsl-1.9/cblas/srotmg.c
@@ -0,0 +1,11 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_srotmg (float *d1, float *d2, float *b1, const float b2, float *P)
+{
+#define BASE float
+#include "source_rotmg.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/ssbmv.c b/gsl-1.9/cblas/ssbmv.c
new file mode 100644
index 0000000..e01f80e
--- /dev/null
+++ b/gsl-1.9/cblas/ssbmv.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_ssbmv (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const int K, const float alpha, const float *A,
+ const int lda, const float *X, const int incX, const float beta,
+ float *Y, const int incY)
+{
+#define BASE float
+#include "source_sbmv.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/sscal.c b/gsl-1.9/cblas/sscal.c
new file mode 100644
index 0000000..e4a8334
--- /dev/null
+++ b/gsl-1.9/cblas/sscal.c
@@ -0,0 +1,11 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_sscal (const int N, const float alpha, float *X, const int incX)
+{
+#define BASE float
+#include "source_scal_r.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/sspmv.c b/gsl-1.9/cblas/sspmv.c
new file mode 100644
index 0000000..41884d8
--- /dev/null
+++ b/gsl-1.9/cblas/sspmv.c
@@ -0,0 +1,13 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_sspmv (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const float alpha, const float *Ap, const float *X,
+ const int incX, const float beta, float *Y, const int incY)
+{
+#define BASE float
+#include "source_spmv.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/sspr.c b/gsl-1.9/cblas/sspr.c
new file mode 100644
index 0000000..e0b60d2
--- /dev/null
+++ b/gsl-1.9/cblas/sspr.c
@@ -0,0 +1,13 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_sspr (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const float alpha, const float *X, const int incX,
+ float *Ap)
+{
+#define BASE float
+#include "source_spr.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/sspr2.c b/gsl-1.9/cblas/sspr2.c
new file mode 100644
index 0000000..c269b8e
--- /dev/null
+++ b/gsl-1.9/cblas/sspr2.c
@@ -0,0 +1,13 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_sspr2 (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const float alpha, const float *X, const int incX,
+ const float *Y, const int incY, float *Ap)
+{
+#define BASE double
+#include "source_spr2.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/sswap.c b/gsl-1.9/cblas/sswap.c
new file mode 100644
index 0000000..f9ca153
--- /dev/null
+++ b/gsl-1.9/cblas/sswap.c
@@ -0,0 +1,11 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_sswap (const int N, float *X, const int incX, float *Y, const int incY)
+{
+#define BASE float
+#include "source_swap_r.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/ssymm.c b/gsl-1.9/cblas/ssymm.c
new file mode 100644
index 0000000..2516b93
--- /dev/null
+++ b/gsl-1.9/cblas/ssymm.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_ssymm (const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
+ const enum CBLAS_UPLO Uplo, const int M, const int N,
+ const float alpha, const float *A, const int lda, const float *B,
+ const int ldb, const float beta, float *C, const int ldc)
+{
+#define BASE float
+#include "source_symm_r.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/ssymv.c b/gsl-1.9/cblas/ssymv.c
new file mode 100644
index 0000000..bf2708c
--- /dev/null
+++ b/gsl-1.9/cblas/ssymv.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_ssymv (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const float alpha, const float *A, const int lda,
+ const float *X, const int incX, const float beta, float *Y,
+ const int incY)
+{
+#define BASE float
+#include "source_symv.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/ssyr.c b/gsl-1.9/cblas/ssyr.c
new file mode 100644
index 0000000..4cd15ce
--- /dev/null
+++ b/gsl-1.9/cblas/ssyr.c
@@ -0,0 +1,13 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_ssyr (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const float alpha, const float *X, const int incX,
+ float *A, const int lda)
+{
+#define BASE float
+#include "source_syr.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/ssyr2.c b/gsl-1.9/cblas/ssyr2.c
new file mode 100644
index 0000000..996710b
--- /dev/null
+++ b/gsl-1.9/cblas/ssyr2.c
@@ -0,0 +1,13 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_ssyr2 (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const float alpha, const float *X, const int incX,
+ const float *Y, const int incY, float *A, const int lda)
+{
+#define BASE float
+#include "source_syr2.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/ssyr2k.c b/gsl-1.9/cblas/ssyr2k.c
new file mode 100644
index 0000000..2cbafb3
--- /dev/null
+++ b/gsl-1.9/cblas/ssyr2k.c
@@ -0,0 +1,15 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_ssyr2k (const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
+ const float alpha, const float *A, const int lda,
+ const float *B, const int ldb, const float beta, float *C,
+ const int ldc)
+{
+#define BASE float
+#include "source_syr2k_r.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/ssyrk.c b/gsl-1.9/cblas/ssyrk.c
new file mode 100644
index 0000000..ef5686e
--- /dev/null
+++ b/gsl-1.9/cblas/ssyrk.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_ssyrk (const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
+ const float alpha, const float *A, const int lda,
+ const float beta, float *C, const int ldc)
+{
+#define BASE float
+#include "source_syrk_r.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/stbmv.c b/gsl-1.9/cblas/stbmv.c
new file mode 100644
index 0000000..3ff335b
--- /dev/null
+++ b/gsl-1.9/cblas/stbmv.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_stbmv (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const int K, const float *A, const int lda,
+ float *X, const int incX)
+{
+#define BASE float
+#include "source_tbmv_r.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/stbsv.c b/gsl-1.9/cblas/stbsv.c
new file mode 100644
index 0000000..9aee84a
--- /dev/null
+++ b/gsl-1.9/cblas/stbsv.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_stbsv (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const int K, const float *A, const int lda,
+ float *X, const int incX)
+{
+#define BASE float
+#include "source_tbsv_r.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/stpmv.c b/gsl-1.9/cblas/stpmv.c
new file mode 100644
index 0000000..d5457da
--- /dev/null
+++ b/gsl-1.9/cblas/stpmv.c
@@ -0,0 +1,13 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_stpmv (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const float *Ap, float *X, const int incX)
+{
+#define BASE float
+#include "source_tpmv_r.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/stpsv.c b/gsl-1.9/cblas/stpsv.c
new file mode 100644
index 0000000..c983de0
--- /dev/null
+++ b/gsl-1.9/cblas/stpsv.c
@@ -0,0 +1,13 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_stpsv (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const float *Ap, float *X, const int incX)
+{
+#define BASE float
+#include "source_tpsv_r.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/strmm.c b/gsl-1.9/cblas/strmm.c
new file mode 100644
index 0000000..2d715fb
--- /dev/null
+++ b/gsl-1.9/cblas/strmm.c
@@ -0,0 +1,15 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_strmm (const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
+ const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA,
+ const enum CBLAS_DIAG Diag, const int M, const int N,
+ const float alpha, const float *A, const int lda, float *B,
+ const int ldb)
+{
+#define BASE float
+#include "source_trmm_r.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/strmv.c b/gsl-1.9/cblas/strmv.c
new file mode 100644
index 0000000..2288d96
--- /dev/null
+++ b/gsl-1.9/cblas/strmv.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_strmv (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const float *A, const int lda, float *X,
+ const int incX)
+{
+#define BASE float
+#include "source_trmv_r.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/strsm.c b/gsl-1.9/cblas/strsm.c
new file mode 100644
index 0000000..5c620ef
--- /dev/null
+++ b/gsl-1.9/cblas/strsm.c
@@ -0,0 +1,15 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_strsm (const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
+ const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA,
+ const enum CBLAS_DIAG Diag, const int M, const int N,
+ const float alpha, const float *A, const int lda, float *B,
+ const int ldb)
+{
+#define BASE float
+#include "source_trsm_r.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/strsv.c b/gsl-1.9/cblas/strsv.c
new file mode 100644
index 0000000..35add0e
--- /dev/null
+++ b/gsl-1.9/cblas/strsv.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_strsv (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const float *A, const int lda, float *X,
+ const int incX)
+{
+#define BASE float
+#include "source_trsv_r.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/test.c b/gsl-1.9/cblas/test.c
new file mode 100644
index 0000000..cccea54
--- /dev/null
+++ b/gsl-1.9/cblas/test.c
@@ -0,0 +1,38 @@
+/* blas/test.c
+ *
+ * Copyright (C) 2001 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+int
+main (void)
+{
+ gsl_ieee_env_setup ();
+
+#include "tests.c"
+
+ exit (gsl_test_summary());
+}
+
diff --git a/gsl-1.9/cblas/test_amax.c b/gsl-1.9/cblas/test_amax.c
new file mode 100644
index 0000000..c370224
--- /dev/null
+++ b/gsl-1.9/cblas/test_amax.c
@@ -0,0 +1,142 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_amax (void) {
+ {
+ int N = 1;
+ float X[] = { -0.388f };
+ int incX = -1;
+ int expected = 0;
+ int k;
+ k = cblas_isamax(N, X, incX);
+ gsl_test_int(k, expected, "samax(case 52)");
+ };
+
+
+ {
+ int N = 1;
+ double X[] = { 0.247 };
+ int incX = -1;
+ int expected = 0;
+ int k;
+ k = cblas_idamax(N, X, incX);
+ gsl_test_int(k, expected, "damax(case 53)");
+ };
+
+
+ {
+ int N = 1;
+ float X[] = { 0.704f, 0.665f };
+ int incX = -1;
+ int expected = 0;
+ int k;
+ k = cblas_icamax(N, X, incX);
+ gsl_test_int(k, expected, "camax(case 54)");
+ };
+
+
+ {
+ int N = 1;
+ double X[] = { -0.599, -0.758 };
+ int incX = -1;
+ int expected = 0;
+ int k;
+ k = cblas_izamax(N, X, incX);
+ gsl_test_int(k, expected, "zamax(case 55)");
+ };
+
+
+ {
+ int N = 2;
+ float X[] = { 0.909f, 0.037f };
+ int incX = 1;
+ int expected = 0;
+ int k;
+ k = cblas_isamax(N, X, incX);
+ gsl_test_int(k, expected, "samax(case 56)");
+ };
+
+
+ {
+ int N = 2;
+ double X[] = { 0.271, -0.426 };
+ int incX = 1;
+ int expected = 1;
+ int k;
+ k = cblas_idamax(N, X, incX);
+ gsl_test_int(k, expected, "damax(case 57)");
+ };
+
+
+ {
+ int N = 2;
+ float X[] = { -0.648f, 0.317f, 0.62f, 0.392f };
+ int incX = 1;
+ int expected = 1;
+ int k;
+ k = cblas_icamax(N, X, incX);
+ gsl_test_int(k, expected, "camax(case 58)");
+ };
+
+
+ {
+ int N = 2;
+ double X[] = { -0.789, 0.352, 0.562, 0.697 };
+ int incX = 1;
+ int expected = 1;
+ int k;
+ k = cblas_izamax(N, X, incX);
+ gsl_test_int(k, expected, "zamax(case 59)");
+ };
+
+
+ {
+ int N = 2;
+ float X[] = { 0.487f, 0.918f };
+ int incX = -1;
+ int expected = 0;
+ int k;
+ k = cblas_isamax(N, X, incX);
+ gsl_test_int(k, expected, "samax(case 60)");
+ };
+
+
+ {
+ int N = 2;
+ double X[] = { 0.537, 0.826 };
+ int incX = -1;
+ int expected = 0;
+ int k;
+ k = cblas_idamax(N, X, incX);
+ gsl_test_int(k, expected, "damax(case 61)");
+ };
+
+
+ {
+ int N = 2;
+ float X[] = { 0.993f, 0.172f, -0.825f, 0.873f };
+ int incX = -1;
+ int expected = 0;
+ int k;
+ k = cblas_icamax(N, X, incX);
+ gsl_test_int(k, expected, "camax(case 62)");
+ };
+
+
+ {
+ int N = 2;
+ double X[] = { 0.913, -0.436, -0.134, 0.129 };
+ int incX = -1;
+ int expected = 0;
+ int k;
+ k = cblas_izamax(N, X, incX);
+ gsl_test_int(k, expected, "zamax(case 63)");
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_asum.c b/gsl-1.9/cblas/test_asum.c
new file mode 100644
index 0000000..26353de
--- /dev/null
+++ b/gsl-1.9/cblas/test_asum.c
@@ -0,0 +1,143 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_asum (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ int N = 1;
+ float X[] = { 0.239f };
+ int incX = -1;
+ float expected = 0.0f;
+ float f;
+ f = cblas_sasum(N, X, incX);
+ gsl_test_rel(f, expected, flteps, "sasum(case 40)");
+ };
+
+
+ {
+ int N = 1;
+ double X[] = { -0.413 };
+ int incX = -1;
+ double expected = 0;
+ double f;
+ f = cblas_dasum(N, X, incX);
+ gsl_test_rel(f, expected, dbleps, "dasum(case 41)");
+ };
+
+
+ {
+ int N = 1;
+ float X[] = { 0.1f, 0.017f };
+ int incX = -1;
+ float expected = 0.0f;
+ float f;
+ f = cblas_scasum(N, X, incX);
+ gsl_test_rel(f, expected, flteps, "scasum(case 42)");
+ };
+
+
+ {
+ int N = 1;
+ double X[] = { -0.651, 0.079 };
+ int incX = -1;
+ double expected = 0;
+ double f;
+ f = cblas_dzasum(N, X, incX);
+ gsl_test_rel(f, expected, dbleps, "dzasum(case 43)");
+ };
+
+
+ {
+ int N = 2;
+ float X[] = { 0.899f, -0.72f };
+ int incX = 1;
+ float expected = 1.619f;
+ float f;
+ f = cblas_sasum(N, X, incX);
+ gsl_test_rel(f, expected, flteps, "sasum(case 44)");
+ };
+
+
+ {
+ int N = 2;
+ double X[] = { 0.271, -0.012 };
+ int incX = 1;
+ double expected = 0.283;
+ double f;
+ f = cblas_dasum(N, X, incX);
+ gsl_test_rel(f, expected, dbleps, "dasum(case 45)");
+ };
+
+
+ {
+ int N = 2;
+ float X[] = { -0.567f, -0.645f, 0.098f, 0.256f };
+ int incX = 1;
+ float expected = 1.566f;
+ float f;
+ f = cblas_scasum(N, X, incX);
+ gsl_test_rel(f, expected, flteps, "scasum(case 46)");
+ };
+
+
+ {
+ int N = 2;
+ double X[] = { -0.046, -0.671, -0.323, 0.785 };
+ int incX = 1;
+ double expected = 1.825;
+ double f;
+ f = cblas_dzasum(N, X, incX);
+ gsl_test_rel(f, expected, dbleps, "dzasum(case 47)");
+ };
+
+
+ {
+ int N = 2;
+ float X[] = { 0.169f, 0.833f };
+ int incX = -1;
+ float expected = 0.0f;
+ float f;
+ f = cblas_sasum(N, X, incX);
+ gsl_test_rel(f, expected, flteps, "sasum(case 48)");
+ };
+
+
+ {
+ int N = 2;
+ double X[] = { -0.586, -0.486 };
+ int incX = -1;
+ double expected = 0;
+ double f;
+ f = cblas_dasum(N, X, incX);
+ gsl_test_rel(f, expected, dbleps, "dasum(case 49)");
+ };
+
+
+ {
+ int N = 2;
+ float X[] = { -0.314f, -0.318f, -0.835f, -0.807f };
+ int incX = -1;
+ float expected = 0.0f;
+ float f;
+ f = cblas_scasum(N, X, incX);
+ gsl_test_rel(f, expected, flteps, "scasum(case 50)");
+ };
+
+
+ {
+ int N = 2;
+ double X[] = { -0.927, 0.152, -0.554, -0.844 };
+ int incX = -1;
+ double expected = 0;
+ double f;
+ f = cblas_dzasum(N, X, incX);
+ gsl_test_rel(f, expected, dbleps, "dzasum(case 51)");
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_axpy.c b/gsl-1.9/cblas/test_axpy.c
new file mode 100644
index 0000000..9f30cd4
--- /dev/null
+++ b/gsl-1.9/cblas/test_axpy.c
@@ -0,0 +1,233 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_axpy (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ int N = 1;
+ float alpha = 0.0f;
+ float X[] = { 0.018f };
+ int incX = 1;
+ float Y[] = { -0.417f };
+ int incY = -1;
+ float expected[] = { -0.417f };
+ cblas_saxpy(N, alpha, X, incX, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], expected[i], flteps, "saxpy(case 64)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double alpha = 0;
+ double X[] = { 0.071 };
+ int incX = 1;
+ double Y[] = { -0.888 };
+ int incY = -1;
+ double expected[] = { -0.888 };
+ cblas_daxpy(N, alpha, X, incX, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], expected[i], dbleps, "daxpy(case 65)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float alpha[2] = {1.0f, 0.0f};
+ float X[] = { -0.542f, -0.362f };
+ int incX = 1;
+ float Y[] = { -0.459f, -0.433f };
+ int incY = -1;
+ float expected[] = { -1.001f, -0.795f };
+ cblas_caxpy(N, alpha, X, incX, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], expected[2*i], flteps, "caxpy(case 66) real");
+ gsl_test_rel(Y[2*i+1], expected[2*i+1], flteps, "caxpy(case 66) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 1;
+ double alpha[2] = {-1, 0};
+ double X[] = { 0.003, -0.514 };
+ int incX = 1;
+ double Y[] = { -0.529, 0.743 };
+ int incY = -1;
+ double expected[] = { -0.532, 1.257 };
+ cblas_zaxpy(N, alpha, X, incX, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], expected[2*i], dbleps, "zaxpy(case 67) real");
+ gsl_test_rel(Y[2*i+1], expected[2*i+1], dbleps, "zaxpy(case 67) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 1;
+ float alpha = 0.1f;
+ float X[] = { 0.771f };
+ int incX = -1;
+ float Y[] = { 0.507f };
+ int incY = 1;
+ float expected[] = { 0.5841f };
+ cblas_saxpy(N, alpha, X, incX, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], expected[i], flteps, "saxpy(case 68)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double alpha = -0.3;
+ double X[] = { 0.029 };
+ int incX = -1;
+ double Y[] = { -0.992 };
+ int incY = 1;
+ double expected[] = { -1.0007 };
+ cblas_daxpy(N, alpha, X, incX, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], expected[i], dbleps, "daxpy(case 69)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float alpha[2] = {-0.3f, 0.1f};
+ float X[] = { 0.194f, -0.959f };
+ int incX = -1;
+ float Y[] = { 0.096f, 0.032f };
+ int incY = 1;
+ float expected[] = { 0.1337f, 0.3391f };
+ cblas_caxpy(N, alpha, X, incX, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], expected[2*i], flteps, "caxpy(case 70) real");
+ gsl_test_rel(Y[2*i+1], expected[2*i+1], flteps, "caxpy(case 70) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 1;
+ double alpha[2] = {0, 1};
+ double X[] = { 0.776, -0.671 };
+ int incX = -1;
+ double Y[] = { 0.39, 0.404 };
+ int incY = 1;
+ double expected[] = { 1.061, 1.18 };
+ cblas_zaxpy(N, alpha, X, incX, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], expected[2*i], dbleps, "zaxpy(case 71) real");
+ gsl_test_rel(Y[2*i+1], expected[2*i+1], dbleps, "zaxpy(case 71) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 1;
+ float alpha = 1.0f;
+ float X[] = { 0.647f };
+ int incX = -1;
+ float Y[] = { 0.016f };
+ int incY = -1;
+ float expected[] = { 0.663f };
+ cblas_saxpy(N, alpha, X, incX, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], expected[i], flteps, "saxpy(case 72)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double alpha = -1;
+ double X[] = { -0.558 };
+ int incX = -1;
+ double Y[] = { 0.308 };
+ int incY = -1;
+ double expected[] = { 0.866 };
+ cblas_daxpy(N, alpha, X, incX, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], expected[i], dbleps, "daxpy(case 73)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float alpha[2] = {-0.3f, 0.1f};
+ float X[] = { 0.899f, -0.624f };
+ int incX = -1;
+ float Y[] = { 0.155f, -0.33f };
+ int incY = -1;
+ float expected[] = { -0.0523f, -0.0529f };
+ cblas_caxpy(N, alpha, X, incX, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], expected[2*i], flteps, "caxpy(case 74) real");
+ gsl_test_rel(Y[2*i+1], expected[2*i+1], flteps, "caxpy(case 74) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 1;
+ double alpha[2] = {0, 1};
+ double X[] = { -0.451, 0.768 };
+ int incX = -1;
+ double Y[] = { 0.007, 0.732 };
+ int incY = -1;
+ double expected[] = { -0.761, 0.281 };
+ cblas_zaxpy(N, alpha, X, incX, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], expected[2*i], dbleps, "zaxpy(case 75) real");
+ gsl_test_rel(Y[2*i+1], expected[2*i+1], dbleps, "zaxpy(case 75) imag");
+ };
+ };
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_copy.c b/gsl-1.9/cblas/test_copy.c
new file mode 100644
index 0000000..2a65663
--- /dev/null
+++ b/gsl-1.9/cblas/test_copy.c
@@ -0,0 +1,221 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_copy (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ int N = 1;
+ float X[] = { 0.898f };
+ int incX = 1;
+ float Y[] = { 0.699f };
+ int incY = -1;
+ float expected[] = { 0.898f };
+ cblas_scopy(N, X, incX, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], expected[i], flteps, "scopy(case 76)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double X[] = { 0.002 };
+ int incX = 1;
+ double Y[] = { -0.921 };
+ int incY = -1;
+ double expected[] = { 0.002 };
+ cblas_dcopy(N, X, incX, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], expected[i], dbleps, "dcopy(case 77)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float X[] = { -0.166f, 0.639f };
+ int incX = 1;
+ float Y[] = { 0.863f, 0.613f };
+ int incY = -1;
+ float expected[] = { -0.166f, 0.639f };
+ cblas_ccopy(N, X, incX, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], expected[2*i], flteps, "ccopy(case 78) real");
+ gsl_test_rel(Y[2*i+1], expected[2*i+1], flteps, "ccopy(case 78) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 1;
+ double X[] = { 0.315, -0.324 };
+ int incX = 1;
+ double Y[] = { -0.312, -0.748 };
+ int incY = -1;
+ double expected[] = { 0.315, -0.324 };
+ cblas_zcopy(N, X, incX, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], expected[2*i], dbleps, "zcopy(case 79) real");
+ gsl_test_rel(Y[2*i+1], expected[2*i+1], dbleps, "zcopy(case 79) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 1;
+ float X[] = { 0.222f };
+ int incX = -1;
+ float Y[] = { 0.522f };
+ int incY = 1;
+ float expected[] = { 0.222f };
+ cblas_scopy(N, X, incX, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], expected[i], flteps, "scopy(case 80)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double X[] = { 0.021 };
+ int incX = -1;
+ double Y[] = { 0.898 };
+ int incY = 1;
+ double expected[] = { 0.021 };
+ cblas_dcopy(N, X, incX, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], expected[i], dbleps, "dcopy(case 81)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float X[] = { 0.376f, 0.229f };
+ int incX = -1;
+ float Y[] = { 0.143f, -0.955f };
+ int incY = 1;
+ float expected[] = { 0.376f, 0.229f };
+ cblas_ccopy(N, X, incX, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], expected[2*i], flteps, "ccopy(case 82) real");
+ gsl_test_rel(Y[2*i+1], expected[2*i+1], flteps, "ccopy(case 82) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 1;
+ double X[] = { -0.265, -0.84 };
+ int incX = -1;
+ double Y[] = { -0.156, 0.939 };
+ int incY = 1;
+ double expected[] = { -0.265, -0.84 };
+ cblas_zcopy(N, X, incX, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], expected[2*i], dbleps, "zcopy(case 83) real");
+ gsl_test_rel(Y[2*i+1], expected[2*i+1], dbleps, "zcopy(case 83) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 1;
+ float X[] = { 0.074f };
+ int incX = -1;
+ float Y[] = { -0.802f };
+ int incY = -1;
+ float expected[] = { 0.074f };
+ cblas_scopy(N, X, incX, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], expected[i], flteps, "scopy(case 84)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double X[] = { -0.374 };
+ int incX = -1;
+ double Y[] = { -0.161 };
+ int incY = -1;
+ double expected[] = { -0.374 };
+ cblas_dcopy(N, X, incX, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], expected[i], dbleps, "dcopy(case 85)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float X[] = { 0.084f, 0.778f };
+ int incX = -1;
+ float Y[] = { 0.31f, -0.797f };
+ int incY = -1;
+ float expected[] = { 0.084f, 0.778f };
+ cblas_ccopy(N, X, incX, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], expected[2*i], flteps, "ccopy(case 86) real");
+ gsl_test_rel(Y[2*i+1], expected[2*i+1], flteps, "ccopy(case 86) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 1;
+ double X[] = { 0.831, -0.282 };
+ int incX = -1;
+ double Y[] = { -0.62, 0.32 };
+ int incY = -1;
+ double expected[] = { 0.831, -0.282 };
+ cblas_zcopy(N, X, incX, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], expected[2*i], dbleps, "zcopy(case 87) real");
+ gsl_test_rel(Y[2*i+1], expected[2*i+1], dbleps, "zcopy(case 87) imag");
+ };
+ };
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_dot.c b/gsl-1.9/cblas/test_dot.c
new file mode 100644
index 0000000..8000fe7
--- /dev/null
+++ b/gsl-1.9/cblas/test_dot.c
@@ -0,0 +1,383 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_dot (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ int N = 1;
+ float alpha = 0.0f;
+ float X[] = { 0.733f };
+ float Y[] = { 0.825f };
+ int incX = 1;
+ int incY = -1;
+ float expected = 0.604725f;
+ float f;
+ f = cblas_sdsdot (N, alpha, X, incX, Y, incY);
+ gsl_test_rel(f, expected, flteps, "sdsdot(case 1)");
+ };
+
+
+ {
+ int N = 1;
+ float alpha = 0.1f;
+ float X[] = { 0.733f };
+ float Y[] = { 0.825f };
+ int incX = 1;
+ int incY = -1;
+ float expected = 0.704725f;
+ float f;
+ f = cblas_sdsdot (N, alpha, X, incX, Y, incY);
+ gsl_test_rel(f, expected, flteps, "sdsdot(case 2)");
+ };
+
+
+ {
+ int N = 1;
+ float alpha = 1.0f;
+ float X[] = { 0.733f };
+ float Y[] = { 0.825f };
+ int incX = 1;
+ int incY = -1;
+ float expected = 1.604725f;
+ float f;
+ f = cblas_sdsdot (N, alpha, X, incX, Y, incY);
+ gsl_test_rel(f, expected, flteps, "sdsdot(case 3)");
+ };
+
+
+ {
+ int N = 1;
+ float alpha = 0.0f;
+ float X[] = { -0.812f };
+ float Y[] = { -0.667f };
+ int incX = -1;
+ int incY = 1;
+ float expected = 0.541604f;
+ float f;
+ f = cblas_sdsdot (N, alpha, X, incX, Y, incY);
+ gsl_test_rel(f, expected, flteps, "sdsdot(case 4)");
+ };
+
+
+ {
+ int N = 1;
+ float alpha = 0.1f;
+ float X[] = { -0.812f };
+ float Y[] = { -0.667f };
+ int incX = -1;
+ int incY = 1;
+ float expected = 0.641604f;
+ float f;
+ f = cblas_sdsdot (N, alpha, X, incX, Y, incY);
+ gsl_test_rel(f, expected, flteps, "sdsdot(case 5)");
+ };
+
+
+ {
+ int N = 1;
+ float alpha = 1.0f;
+ float X[] = { -0.812f };
+ float Y[] = { -0.667f };
+ int incX = -1;
+ int incY = 1;
+ float expected = 1.541604f;
+ float f;
+ f = cblas_sdsdot (N, alpha, X, incX, Y, incY);
+ gsl_test_rel(f, expected, flteps, "sdsdot(case 6)");
+ };
+
+
+ {
+ int N = 1;
+ float alpha = 0.0f;
+ float X[] = { 0.481f };
+ float Y[] = { 0.523f };
+ int incX = -1;
+ int incY = -1;
+ float expected = 0.251563f;
+ float f;
+ f = cblas_sdsdot (N, alpha, X, incX, Y, incY);
+ gsl_test_rel(f, expected, flteps, "sdsdot(case 7)");
+ };
+
+
+ {
+ int N = 1;
+ float alpha = 0.1f;
+ float X[] = { 0.481f };
+ float Y[] = { 0.523f };
+ int incX = -1;
+ int incY = -1;
+ float expected = 0.351563f;
+ float f;
+ f = cblas_sdsdot (N, alpha, X, incX, Y, incY);
+ gsl_test_rel(f, expected, flteps, "sdsdot(case 8)");
+ };
+
+
+ {
+ int N = 1;
+ float alpha = 1.0f;
+ float X[] = { 0.481f };
+ float Y[] = { 0.523f };
+ int incX = -1;
+ int incY = -1;
+ float expected = 1.251563f;
+ float f;
+ f = cblas_sdsdot (N, alpha, X, incX, Y, incY);
+ gsl_test_rel(f, expected, flteps, "sdsdot(case 9)");
+ };
+
+
+ {
+ int N = 1;
+ float X[] = { 0.785f };
+ float Y[] = { -0.7f };
+ int incX = 1;
+ int incY = -1;
+ float expected = -0.5495f;
+ float f;
+ f = cblas_sdot(N, X, incX, Y, incY);
+ gsl_test_rel(f, expected, flteps, "sdot(case 10)");
+ };
+
+
+ {
+ int N = 1;
+ double X[] = { 0.79 };
+ double Y[] = { -0.679 };
+ int incX = 1;
+ int incY = -1;
+ double expected = -0.53641;
+ double f;
+ f = cblas_ddot(N, X, incX, Y, incY);
+ gsl_test_rel(f, expected, dbleps, "ddot(case 11)");
+ };
+
+
+ {
+ int N = 1;
+ float X[] = { 0.474f, -0.27f };
+ float Y[] = { -0.144f, -0.392f };
+ int incX = 1;
+ int incY = -1;
+ float expected[2] = {-0.174096f, -0.146928f};
+ float f[2];
+ cblas_cdotu_sub(N, X, incX, Y, incY, &f);
+ gsl_test_rel(f[0], expected[0], flteps, "cdotu(case 12) real");
+ gsl_test_rel(f[1], expected[1], flteps, "cdotu(case 12) imag");
+ };
+
+
+ {
+ int N = 1;
+ float X[] = { 0.474f, -0.27f };
+ float Y[] = { -0.144f, -0.392f };
+ int incX = 1;
+ int incY = -1;
+ float expected[2] = {0.037584f, -0.224688f};
+ float f[2];
+ cblas_cdotc_sub(N, X, incX, Y, incY, &f);
+ gsl_test_rel(f[0], expected[0], flteps, "cdotc(case 13) real");
+ gsl_test_rel(f[1], expected[1], flteps, "cdotc(case 13) imag");
+ };
+
+
+ {
+ int N = 1;
+ double X[] = { -0.87, -0.631 };
+ double Y[] = { -0.7, -0.224 };
+ int incX = 1;
+ int incY = -1;
+ double expected[2] = {0.467656, 0.63658};
+ double f[2];
+ cblas_zdotu_sub(N, X, incX, Y, incY, &f);
+ gsl_test_rel(f[0], expected[0], dbleps, "zdotu(case 14) real");
+ gsl_test_rel(f[1], expected[1], dbleps, "zdotu(case 14) imag");
+ };
+
+
+ {
+ int N = 1;
+ double X[] = { -0.87, -0.631 };
+ double Y[] = { -0.7, -0.224 };
+ int incX = 1;
+ int incY = -1;
+ double expected[2] = {0.750344, -0.24682};
+ double f[2];
+ cblas_zdotc_sub(N, X, incX, Y, incY, &f);
+ gsl_test_rel(f[0], expected[0], dbleps, "zdotc(case 15) real");
+ gsl_test_rel(f[1], expected[1], dbleps, "zdotc(case 15) imag");
+ };
+
+
+ {
+ int N = 1;
+ float X[] = { -0.457f };
+ float Y[] = { 0.839f };
+ int incX = -1;
+ int incY = 1;
+ float expected = -0.383423f;
+ float f;
+ f = cblas_sdot(N, X, incX, Y, incY);
+ gsl_test_rel(f, expected, flteps, "sdot(case 16)");
+ };
+
+
+ {
+ int N = 1;
+ double X[] = { 0.949 };
+ double Y[] = { -0.873 };
+ int incX = -1;
+ int incY = 1;
+ double expected = -0.828477;
+ double f;
+ f = cblas_ddot(N, X, incX, Y, incY);
+ gsl_test_rel(f, expected, dbleps, "ddot(case 17)");
+ };
+
+
+ {
+ int N = 1;
+ float X[] = { 0.852f, -0.045f };
+ float Y[] = { 0.626f, -0.164f };
+ int incX = -1;
+ int incY = 1;
+ float expected[2] = {0.525972f, -0.167898f};
+ float f[2];
+ cblas_cdotu_sub(N, X, incX, Y, incY, &f);
+ gsl_test_rel(f[0], expected[0], flteps, "cdotu(case 18) real");
+ gsl_test_rel(f[1], expected[1], flteps, "cdotu(case 18) imag");
+ };
+
+
+ {
+ int N = 1;
+ float X[] = { 0.852f, -0.045f };
+ float Y[] = { 0.626f, -0.164f };
+ int incX = -1;
+ int incY = 1;
+ float expected[2] = {0.540732f, -0.111558f};
+ float f[2];
+ cblas_cdotc_sub(N, X, incX, Y, incY, &f);
+ gsl_test_rel(f[0], expected[0], flteps, "cdotc(case 19) real");
+ gsl_test_rel(f[1], expected[1], flteps, "cdotc(case 19) imag");
+ };
+
+
+ {
+ int N = 1;
+ double X[] = { -0.786, -0.341 };
+ double Y[] = { -0.271, -0.896 };
+ int incX = -1;
+ int incY = 1;
+ double expected[2] = {-0.09253, 0.796667};
+ double f[2];
+ cblas_zdotu_sub(N, X, incX, Y, incY, &f);
+ gsl_test_rel(f[0], expected[0], dbleps, "zdotu(case 20) real");
+ gsl_test_rel(f[1], expected[1], dbleps, "zdotu(case 20) imag");
+ };
+
+
+ {
+ int N = 1;
+ double X[] = { -0.786, -0.341 };
+ double Y[] = { -0.271, -0.896 };
+ int incX = -1;
+ int incY = 1;
+ double expected[2] = {0.518542, 0.611845};
+ double f[2];
+ cblas_zdotc_sub(N, X, incX, Y, incY, &f);
+ gsl_test_rel(f[0], expected[0], dbleps, "zdotc(case 21) real");
+ gsl_test_rel(f[1], expected[1], dbleps, "zdotc(case 21) imag");
+ };
+
+
+ {
+ int N = 1;
+ float X[] = { -0.088f };
+ float Y[] = { -0.165f };
+ int incX = -1;
+ int incY = -1;
+ float expected = 0.01452f;
+ float f;
+ f = cblas_sdot(N, X, incX, Y, incY);
+ gsl_test_rel(f, expected, flteps, "sdot(case 22)");
+ };
+
+
+ {
+ int N = 1;
+ double X[] = { -0.434 };
+ double Y[] = { -0.402 };
+ int incX = -1;
+ int incY = -1;
+ double expected = 0.174468;
+ double f;
+ f = cblas_ddot(N, X, incX, Y, incY);
+ gsl_test_rel(f, expected, dbleps, "ddot(case 23)");
+ };
+
+
+ {
+ int N = 1;
+ float X[] = { -0.347f, 0.899f };
+ float Y[] = { -0.113f, -0.858f };
+ int incX = -1;
+ int incY = -1;
+ float expected[2] = {0.810553f, 0.196139f};
+ float f[2];
+ cblas_cdotu_sub(N, X, incX, Y, incY, &f);
+ gsl_test_rel(f[0], expected[0], flteps, "cdotu(case 24) real");
+ gsl_test_rel(f[1], expected[1], flteps, "cdotu(case 24) imag");
+ };
+
+
+ {
+ int N = 1;
+ float X[] = { -0.347f, 0.899f };
+ float Y[] = { -0.113f, -0.858f };
+ int incX = -1;
+ int incY = -1;
+ float expected[2] = {-0.732131f, 0.399313f};
+ float f[2];
+ cblas_cdotc_sub(N, X, incX, Y, incY, &f);
+ gsl_test_rel(f[0], expected[0], flteps, "cdotc(case 25) real");
+ gsl_test_rel(f[1], expected[1], flteps, "cdotc(case 25) imag");
+ };
+
+
+ {
+ int N = 1;
+ double X[] = { -0.897, -0.204 };
+ double Y[] = { -0.759, 0.557 };
+ int incX = -1;
+ int incY = -1;
+ double expected[2] = {0.794451, -0.344793};
+ double f[2];
+ cblas_zdotu_sub(N, X, incX, Y, incY, &f);
+ gsl_test_rel(f[0], expected[0], dbleps, "zdotu(case 26) real");
+ gsl_test_rel(f[1], expected[1], dbleps, "zdotu(case 26) imag");
+ };
+
+
+ {
+ int N = 1;
+ double X[] = { -0.897, -0.204 };
+ double Y[] = { -0.759, 0.557 };
+ int incX = -1;
+ int incY = -1;
+ double expected[2] = {0.567195, -0.654465};
+ double f[2];
+ cblas_zdotc_sub(N, X, incX, Y, incY, &f);
+ gsl_test_rel(f[0], expected[0], dbleps, "zdotc(case 27) real");
+ gsl_test_rel(f[1], expected[1], dbleps, "zdotc(case 27) imag");
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_gbmv.c b/gsl-1.9/cblas/test_gbmv.c
new file mode 100644
index 0000000..34eff26
--- /dev/null
+++ b/gsl-1.9/cblas/test_gbmv.c
@@ -0,0 +1,543 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_gbmv (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ int order = 101;
+ int trans = 111;
+ int M = 3;
+ int N = 4;
+ int KL = 1;
+ int KU = 1;
+ int lda = 4;
+ float alpha = -1.0f;
+ float beta = -1.0f;
+ float A[] = { 0.423f, -0.143f, -0.182f, -0.076f, -0.855f, 0.599f, 0.389f, -0.473f, 0.493f, -0.902f, -0.889f, -0.256f, 0.112f, 0.128f, -0.277f, -0.777f };
+ float X[] = { 0.488f, 0.029f, -0.633f, 0.84f };
+ int incX = -1;
+ float Y[] = { 0.874f, 0.322f, -0.477f };
+ int incY = -1;
+ float y_expected[] = { -0.101941f, 0.764086f, 0.481914f };
+ cblas_sgbmv(order, trans, M, N, KU, KL, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "sgbmv(case 794)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int M = 3;
+ int N = 4;
+ int KL = 1;
+ int KU = 1;
+ int lda = 4;
+ float alpha = -1.0f;
+ float beta = -1.0f;
+ float A[] = { 0.423f, -0.143f, -0.182f, -0.076f, -0.855f, 0.599f, 0.389f, -0.473f, 0.493f, -0.902f, -0.889f, -0.256f, 0.112f, 0.128f, -0.277f, -0.777f };
+ float X[] = { 0.488f, 0.029f, -0.633f, 0.84f };
+ int incX = -1;
+ float Y[] = { 0.874f, 0.322f, -0.477f };
+ int incY = -1;
+ float y_expected[] = { -0.656261f, 0.19575f, 0.055905f };
+ cblas_sgbmv(order, trans, M, N, KU, KL, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "sgbmv(case 795)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int M = 3;
+ int N = 4;
+ int KL = 1;
+ int KU = 1;
+ int lda = 4;
+ float alpha = 0.0f;
+ float beta = 0.1f;
+ float A[] = { -0.066f, -0.153f, -0.619f, 0.174f, 0.777f, 0.543f, 0.614f, -0.446f, -0.138f, -0.767f, 0.725f, 0.222f, 0.165f, -0.063f, -0.047f, 0.267f };
+ float X[] = { -0.096f, -0.007f, -0.657f };
+ int incX = -1;
+ float Y[] = { -0.88f, 0.102f, -0.278f, 0.403f };
+ int incY = -1;
+ float y_expected[] = { -0.088f, 0.0102f, -0.0278f, 0.0403f };
+ cblas_sgbmv(order, trans, M, N, KU, KL, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "sgbmv(case 796)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int M = 3;
+ int N = 4;
+ int KL = 1;
+ int KU = 1;
+ int lda = 4;
+ float alpha = 0.0f;
+ float beta = 0.1f;
+ float A[] = { -0.066f, -0.153f, -0.619f, 0.174f, 0.777f, 0.543f, 0.614f, -0.446f, -0.138f, -0.767f, 0.725f, 0.222f, 0.165f, -0.063f, -0.047f, 0.267f };
+ float X[] = { -0.096f, -0.007f, -0.657f };
+ int incX = -1;
+ float Y[] = { -0.88f, 0.102f, -0.278f, 0.403f };
+ int incY = -1;
+ float y_expected[] = { -0.088f, 0.0102f, -0.0278f, 0.0403f };
+ cblas_sgbmv(order, trans, M, N, KU, KL, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "sgbmv(case 797)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int M = 3;
+ int N = 4;
+ int KL = 1;
+ int KU = 1;
+ int lda = 4;
+ double alpha = 0.1;
+ double beta = 0;
+ double A[] = { -0.688, 0.29, 0.442, -0.001, 0.313, -0.073, 0.991, -0.654, -0.12, 0.416, 0.571, 0.932, -0.179, -0.724, 0.492, -0.965 };
+ double X[] = { 0.187, -0.338, -0.976, -0.052 };
+ int incX = -1;
+ double Y[] = { -0.101, 0.8, 0.026 };
+ int incY = -1;
+ double y_expected[] = { 0.0083289, -0.0279986, -0.0446472 };
+ cblas_dgbmv(order, trans, M, N, KU, KL, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "dgbmv(case 798)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int M = 3;
+ int N = 4;
+ int KL = 1;
+ int KU = 1;
+ int lda = 4;
+ double alpha = 0.1;
+ double beta = 0;
+ double A[] = { -0.688, 0.29, 0.442, -0.001, 0.313, -0.073, 0.991, -0.654, -0.12, 0.416, 0.571, 0.932, -0.179, -0.724, 0.492, -0.965 };
+ double X[] = { 0.187, -0.338, -0.976, -0.052 };
+ int incX = -1;
+ double Y[] = { -0.101, 0.8, 0.026 };
+ int incY = -1;
+ double y_expected[] = { -0.1141297, 0.0088824, -0.0320568 };
+ cblas_dgbmv(order, trans, M, N, KU, KL, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "dgbmv(case 799)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int M = 3;
+ int N = 4;
+ int KL = 1;
+ int KU = 1;
+ int lda = 4;
+ double alpha = -0.3;
+ double beta = -0.3;
+ double A[] = { 0.746, 0.262, -0.449, -0.954, -0.093, 0.108, -0.496, 0.927, 0.177, 0.729, -0.92, -0.469, 0.87, -0.877, -0.308, -0.806 };
+ double X[] = { 0.662, -0.887, 0.261 };
+ int incX = -1;
+ double Y[] = { 0.771, 0.637, -0.177, -0.018 };
+ int incY = -1;
+ double y_expected[] = { -0.048588, -0.467865, 0.0818433, -0.0398619 };
+ cblas_dgbmv(order, trans, M, N, KU, KL, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "dgbmv(case 800)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int M = 3;
+ int N = 4;
+ int KL = 1;
+ int KU = 1;
+ int lda = 4;
+ double alpha = -0.3;
+ double beta = -0.3;
+ double A[] = { 0.746, 0.262, -0.449, -0.954, -0.093, 0.108, -0.496, 0.927, 0.177, 0.729, -0.92, -0.469, 0.87, -0.877, -0.308, -0.806 };
+ double X[] = { 0.662, -0.887, 0.261 };
+ int incX = -1;
+ double Y[] = { 0.771, 0.637, -0.177, -0.018 };
+ int incY = -1;
+ double y_expected[] = { -0.404082, -0.2887797, 0.1876263, -0.1345935 };
+ cblas_dgbmv(order, trans, M, N, KU, KL, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "dgbmv(case 801)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int M = 3;
+ int N = 4;
+ int KL = 1;
+ int KU = 1;
+ int lda = 4;
+ float alpha[2] = {0.0f, 1.0f};
+ float beta[2] = {0.0f, 0.1f};
+ float A[] = { -0.107f, 0.926f, -0.246f, -0.555f, -0.301f, 0.276f, 0.471f, -0.084f, -0.754f, 0.082f, -0.952f, -0.394f, 0.659f, 0.054f, 0.795f, 0.923f, 0.232f, -0.788f, 0.478f, 0.775f, -0.118f, 0.691f, -0.933f, 0.809f, 0.164f, -0.263f, -0.923f, -0.88f, 0.819f, -0.521f, -0.045f, 0.034f };
+ float X[] = { 0.407f, 0.895f, 0.301f, 0.769f, -0.269f, -0.465f, 0.455f, -0.628f };
+ int incX = -1;
+ float Y[] = { -0.116f, -0.744f, -0.936f, -0.064f, -0.232f, -0.665f };
+ int incY = -1;
+ float y_expected[] = { -0.806176f, -1.559f, -1.57611f, -0.155463f, 0.098816f, -0.274361f };
+ cblas_cgbmv(order, trans, M, N, KU, KL, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], flteps, "cgbmv(case 802) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], flteps, "cgbmv(case 802) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int M = 3;
+ int N = 4;
+ int KL = 1;
+ int KU = 1;
+ int lda = 4;
+ float alpha[2] = {0.0f, 1.0f};
+ float beta[2] = {0.0f, 0.1f};
+ float A[] = { -0.107f, 0.926f, -0.246f, -0.555f, -0.301f, 0.276f, 0.471f, -0.084f, -0.754f, 0.082f, -0.952f, -0.394f, 0.659f, 0.054f, 0.795f, 0.923f, 0.232f, -0.788f, 0.478f, 0.775f, -0.118f, 0.691f, -0.933f, 0.809f, 0.164f, -0.263f, -0.923f, -0.88f, 0.819f, -0.521f, -0.045f, 0.034f };
+ float X[] = { 0.407f, 0.895f, 0.301f, 0.769f, -0.269f, -0.465f, 0.455f, -0.628f };
+ int incX = -1;
+ float Y[] = { -0.116f, -0.744f, -0.936f, -0.064f, -0.232f, -0.665f };
+ int incY = -1;
+ float y_expected[] = { -0.245235f, -0.313725f, -0.798094f, 0.691455f, -0.164015f, -0.242714f };
+ cblas_cgbmv(order, trans, M, N, KU, KL, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], flteps, "cgbmv(case 803) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], flteps, "cgbmv(case 803) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int M = 3;
+ int N = 4;
+ int KL = 1;
+ int KU = 1;
+ int lda = 4;
+ float alpha[2] = {-1.0f, 0.0f};
+ float beta[2] = {0.0f, 0.1f};
+ float A[] = { -0.258f, 0.838f, -0.106f, -0.066f, 0.395f, 0.982f, -0.546f, 0.565f, 0.14f, -0.18f, 0.165f, -0.186f, 0.499f, -0.038f, -0.305f, -0.653f, -0.811f, -0.466f, -0.674f, -0.013f, -0.552f, -0.807f, -0.536f, 0.864f, -0.027f, -0.606f, 0.459f, 0.564f, -0.968f, 0.717f, -0.312f, -0.485f };
+ float X[] = { -0.399f, 0.459f, 0.398f, 0.358f, -0.161f, -0.359f };
+ int incX = -1;
+ float Y[] = { 0.572f, 0.293f, -0.813f, -0.096f, -0.611f, -0.717f, 0.736f, 0.259f };
+ int incY = -1;
+ float y_expected[] = { -0.619961f, -0.011425f, -0.477499f, 0.059361f, -0.886984f, 0.44008f, -0.139432f, 0.04644f };
+ cblas_cgbmv(order, trans, M, N, KU, KL, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], flteps, "cgbmv(case 804) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], flteps, "cgbmv(case 804) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int M = 3;
+ int N = 4;
+ int KL = 1;
+ int KU = 1;
+ int lda = 4;
+ float alpha[2] = {-1.0f, 0.0f};
+ float beta[2] = {0.0f, 0.1f};
+ float A[] = { -0.258f, 0.838f, -0.106f, -0.066f, 0.395f, 0.982f, -0.546f, 0.565f, 0.14f, -0.18f, 0.165f, -0.186f, 0.499f, -0.038f, -0.305f, -0.653f, -0.811f, -0.466f, -0.674f, -0.013f, -0.552f, -0.807f, -0.536f, 0.864f, -0.027f, -0.606f, 0.459f, 0.564f, -0.968f, 0.717f, -0.312f, -0.485f };
+ float X[] = { -0.399f, 0.459f, 0.398f, 0.358f, -0.161f, -0.359f };
+ int incX = -1;
+ float Y[] = { 0.572f, 0.293f, -0.813f, -0.096f, -0.611f, -0.717f, 0.736f, 0.259f };
+ int incY = -1;
+ float y_expected[] = { -0.318227f, -0.172201f, -0.109343f, 0.698685f, 0.208261f, -0.269065f, 0.175074f, -0.507326f };
+ cblas_cgbmv(order, trans, M, N, KU, KL, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], flteps, "cgbmv(case 805) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], flteps, "cgbmv(case 805) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int M = 3;
+ int N = 4;
+ int KL = 1;
+ int KU = 1;
+ int lda = 4;
+ float alpha[2] = {-1.0f, 0.0f};
+ float beta[2] = {0.0f, 0.1f};
+ float A[] = { -0.804f, 0.232f, -0.448f, -0.558f, -0.078f, -0.056f, -0.345f, -0.379f, 0.369f, -0.662f, -0.169f, -0.391f, -0.215f, 0.467f, 0.374f, 0.889f, -0.698f, 0.734f, 0.377f, -0.955f, 0.498f, 0.151f, -0.725f, -0.728f, -0.655f, -0.581f, 0.389f, 0.949f, -0.553f, -0.434f, 0.237f, 0.641f };
+ float X[] = { -0.262f, -0.823f, -0.357f, -0.994f, -0.347f, -0.375f };
+ int incX = -1;
+ float Y[] = { -0.683f, -0.87f, -0.708f, 0.071f, 0.575f, -0.575f, 0.845f, 0.032f };
+ int incY = -1;
+ float y_expected[] = { 0.341749f, 0.301992f, -0.306848f, 0.109252f, -0.018347f, -0.747479f, -0.894201f, 0.713246f };
+ cblas_cgbmv(order, trans, M, N, KU, KL, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], flteps, "cgbmv(case 806) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], flteps, "cgbmv(case 806) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int M = 3;
+ int N = 4;
+ int KL = 1;
+ int KU = 1;
+ int lda = 4;
+ float alpha[2] = {-1.0f, 0.0f};
+ float beta[2] = {0.0f, 0.1f};
+ float A[] = { -0.804f, 0.232f, -0.448f, -0.558f, -0.078f, -0.056f, -0.345f, -0.379f, 0.369f, -0.662f, -0.169f, -0.391f, -0.215f, 0.467f, 0.374f, 0.889f, -0.698f, 0.734f, 0.377f, -0.955f, 0.498f, 0.151f, -0.725f, -0.728f, -0.655f, -0.581f, 0.389f, 0.949f, -0.553f, -0.434f, 0.237f, 0.641f };
+ float X[] = { -0.262f, -0.823f, -0.357f, -0.994f, -0.347f, -0.375f };
+ int incX = -1;
+ float Y[] = { -0.683f, -0.87f, -0.708f, 0.071f, 0.575f, -0.575f, 0.845f, 0.032f };
+ int incY = -1;
+ float y_expected[] = { -0.562773f, -0.455143f, -0.213881f, -0.466169f, -0.183683f, 0.097891f, -0.451416f, 0.052586f };
+ cblas_cgbmv(order, trans, M, N, KU, KL, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], flteps, "cgbmv(case 807) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], flteps, "cgbmv(case 807) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int M = 3;
+ int N = 4;
+ int KL = 1;
+ int KU = 1;
+ int lda = 4;
+ double alpha[2] = {0, 0.1};
+ double beta[2] = {1, 0};
+ double A[] = { -0.919, -0.002, 0.105, -0.338, -0.358, -0.715, -0.157, 0.307, 0.334, 0.121, 0.366, 0.029, -0.006, -0.662, -0.314, 0.061, -0.322, -0.865, -0.586, 0.556, 0.507, 0.581, 0.855, -0.09, 0.836, -0.788, -0.209, -0.694, -0.695, 0.11, -0.234, 0.17 };
+ double X[] = { 0.356, -0.76, -0.96, 0.437, -0.849, 0.397, -0.382, -0.826 };
+ int incX = -1;
+ double Y[] = { 0.288, -0.832, 0.889, 0.576, -0.809, 0.4 };
+ int incY = -1;
+ double y_expected[] = { 0.3241775, -0.6761577, 0.8458527, 0.5705165, -0.8597295, 0.4268499 };
+ cblas_zgbmv(order, trans, M, N, KU, KL, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], dbleps, "zgbmv(case 808) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], dbleps, "zgbmv(case 808) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int M = 3;
+ int N = 4;
+ int KL = 1;
+ int KU = 1;
+ int lda = 4;
+ double alpha[2] = {0, 0.1};
+ double beta[2] = {1, 0};
+ double A[] = { -0.919, -0.002, 0.105, -0.338, -0.358, -0.715, -0.157, 0.307, 0.334, 0.121, 0.366, 0.029, -0.006, -0.662, -0.314, 0.061, -0.322, -0.865, -0.586, 0.556, 0.507, 0.581, 0.855, -0.09, 0.836, -0.788, -0.209, -0.694, -0.695, 0.11, -0.234, 0.17 };
+ double X[] = { 0.356, -0.76, -0.96, 0.437, -0.849, 0.397, -0.382, -0.826 };
+ int incX = -1;
+ double Y[] = { 0.288, -0.832, 0.889, 0.576, -0.809, 0.4 };
+ int incY = -1;
+ double y_expected[] = { 0.4026074, -0.8033768, 0.7510795, 0.5671044, -0.8162255, 0.3349099 };
+ cblas_zgbmv(order, trans, M, N, KU, KL, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], dbleps, "zgbmv(case 809) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], dbleps, "zgbmv(case 809) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int M = 3;
+ int N = 4;
+ int KL = 1;
+ int KU = 1;
+ int lda = 4;
+ double alpha[2] = {1, 0};
+ double beta[2] = {1, 0};
+ double A[] = { 0.511, -0.707, -0.906, 0.345, -0.524, -0.933, 0.154, -0.529, -0.651, -0.851, 0.104, 0.532, -0.297, 0.477, 0.511, 0.469, -0.888, -0.789, 0.656, 0.288, -0.749, 0.961, 0.571, 0.539, 0.465, 0.647, 0.653, -0.994, -0.515, 0.297, 0.35, -0.707 };
+ double X[] = { -0.991, 0.658, -0.909, -0.99, -0.517, -0.071 };
+ int incX = -1;
+ double Y[] = { 0.451, 0.351, -0.113, -0.62, 0.983, 0.511, 0.142, -0.186 };
+ int incY = -1;
+ double y_expected[] = { 0.560921, -1.094193, -0.210397, -0.613323, 3.018979, 0.641612, 0.384166, 1.11801 };
+ cblas_zgbmv(order, trans, M, N, KU, KL, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], dbleps, "zgbmv(case 810) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], dbleps, "zgbmv(case 810) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int M = 3;
+ int N = 4;
+ int KL = 1;
+ int KU = 1;
+ int lda = 4;
+ double alpha[2] = {1, 0};
+ double beta[2] = {1, 0};
+ double A[] = { 0.511, -0.707, -0.906, 0.345, -0.524, -0.933, 0.154, -0.529, -0.651, -0.851, 0.104, 0.532, -0.297, 0.477, 0.511, 0.469, -0.888, -0.789, 0.656, 0.288, -0.749, 0.961, 0.571, 0.539, 0.465, 0.647, 0.653, -0.994, -0.515, 0.297, 0.35, -0.707 };
+ double X[] = { -0.991, 0.658, -0.909, -0.99, -0.517, -0.071 };
+ int incX = -1;
+ double Y[] = { 0.451, 0.351, -0.113, -0.62, 0.983, 0.511, 0.142, -0.186 };
+ int incY = -1;
+ double y_expected[] = { -0.435541, 0.015793, -0.926518, 1.122561, 1.671751, -0.257493, 0.187543, 1.066818 };
+ cblas_zgbmv(order, trans, M, N, KU, KL, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], dbleps, "zgbmv(case 811) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], dbleps, "zgbmv(case 811) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int M = 3;
+ int N = 4;
+ int KL = 1;
+ int KU = 1;
+ int lda = 4;
+ double alpha[2] = {0, 0.1};
+ double beta[2] = {-0.3, 0.1};
+ double A[] = { 0.534, 0.67, -0.621, 0.143, -0.794, 0.073, 0.414, -0.9, 0.155, -0.368, 0.122, -0.583, 0.03, 0.646, -0.768, -0.892, -0.741, -0.397, 0.626, 0.004, -0.515, 0.355, 0.196, -0.989, -0.982, 0.985, 0.445, 0.63, -0.849, -0.528, 0.146, -0.319 };
+ double X[] = { -0.199, -0.259, 0.386, -0.131, -0.867, 0.888 };
+ int incX = -1;
+ double Y[] = { 0.106, 0.874, 0.962, 0.636, -0.759, 0.415, -0.053, 0.315 };
+ int incY = -1;
+ double y_expected[] = { -0.139603, -0.250546, -0.3107376, -0.1144656, 0.2181809, -0.0877031, 0.0149724, -0.0224571 };
+ cblas_zgbmv(order, trans, M, N, KU, KL, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], dbleps, "zgbmv(case 812) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], dbleps, "zgbmv(case 812) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int M = 3;
+ int N = 4;
+ int KL = 1;
+ int KU = 1;
+ int lda = 4;
+ double alpha[2] = {0, 0.1};
+ double beta[2] = {-0.3, 0.1};
+ double A[] = { 0.534, 0.67, -0.621, 0.143, -0.794, 0.073, 0.414, -0.9, 0.155, -0.368, 0.122, -0.583, 0.03, 0.646, -0.768, -0.892, -0.741, -0.397, 0.626, 0.004, -0.515, 0.355, 0.196, -0.989, -0.982, 0.985, 0.445, 0.63, -0.849, -0.528, 0.146, -0.319 };
+ double X[] = { -0.199, -0.259, 0.386, -0.131, -0.867, 0.888 };
+ int incX = -1;
+ double Y[] = { 0.106, 0.874, 0.962, 0.636, -0.759, 0.415, -0.053, 0.315 };
+ int incY = -1;
+ double y_expected[] = { -0.1642353, -0.2575697, -0.3610975, -0.1305629, 0.1713576, -0.2514988, 0.0195631, -0.0648656 };
+ cblas_zgbmv(order, trans, M, N, KU, KL, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], dbleps, "zgbmv(case 813) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], dbleps, "zgbmv(case 813) imag");
+ };
+ };
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_gemm.c b/gsl-1.9/cblas/test_gemm.c
new file mode 100644
index 0000000..aafa4f3
--- /dev/null
+++ b/gsl-1.9/cblas/test_gemm.c
@@ -0,0 +1,1399 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_gemm (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ int order = 101;
+ int transA = 111;
+ int transB = 111;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ float alpha = 1.0f;
+ float beta = 0.0f;
+ float A[] = { 0.199f, 0.237f, 0.456f, 0.377f };
+ int lda = 4;
+ float B[] = { 0.842f, -0.734f, 0.323f, -0.957f, -0.303f, -0.873f, -0.871f, -0.819f };
+ int ldb = 2;
+ float C[] = { 0.498f, -0.925f };
+ int ldc = 2;
+ float C_expected[] = { -0.222426f, -1.07973f };
+ cblas_sgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[i], C_expected[i], flteps, "sgemm(case 1466)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int transA = 111;
+ int transB = 111;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ float alpha = 1.0f;
+ float beta = 0.0f;
+ float A[] = { -0.83f, 0.922f, -0.228f, -0.003f };
+ int lda = 1;
+ float B[] = { 0.072f, 0.345f, 0.944f, -0.39f, -0.577f, 0.656f, -0.693f, -0.453f };
+ int ldb = 4;
+ float C[] = { 0.583f, 0.522f };
+ int ldc = 1;
+ float C_expected[] = { 0.044268f, 1.24311f };
+ cblas_sgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[i], C_expected[i], flteps, "sgemm(case 1467)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int transA = 111;
+ int transB = 112;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ float alpha = 0.1f;
+ float beta = 0.1f;
+ float A[] = { -0.838f, 0.622f, -0.494f, 0.304f };
+ int lda = 4;
+ float B[] = { 0.147f, 0.134f, 0.169f, 0.734f, -0.7f, 0.541f, -0.794f, -0.256f };
+ int ldb = 4;
+ float C[] = { -0.632f, -0.559f };
+ int ldc = 2;
+ float C_expected[] = { -0.0532188f, 0.0678514f };
+ cblas_sgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[i], C_expected[i], flteps, "sgemm(case 1468)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int transA = 111;
+ int transB = 112;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ float alpha = 0.1f;
+ float beta = 0.1f;
+ float A[] = { -0.937f, 0.635f, 0.596f, -0.51f };
+ int lda = 1;
+ float B[] = { -0.688f, -0.265f, 0.049f, 0.133f, -0.918f, -0.147f, 0.977f, -0.21f };
+ int ldb = 2;
+ float C[] = { 0.844f, 0.999f };
+ int ldc = 1;
+ float C_expected[] = { 0.0474373f, 0.135125f };
+ cblas_sgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[i], C_expected[i], flteps, "sgemm(case 1469)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int transA = 112;
+ int transB = 111;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ float alpha = -0.3f;
+ float beta = 0.1f;
+ float A[] = { -0.165f, 0.638f, 0.346f, -0.697f };
+ int lda = 1;
+ float B[] = { 0.499f, -0.73f, 0.262f, 0.759f, 0.664f, 0.997f, -0.702f, -0.839f };
+ int ldb = 2;
+ float C[] = { 0.17f, 0.425f };
+ int ldc = 2;
+ float C_expected[] = { -0.224158f, -0.417831f };
+ cblas_sgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[i], C_expected[i], flteps, "sgemm(case 1470)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int transA = 112;
+ int transB = 111;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ float alpha = -0.3f;
+ float beta = 0.1f;
+ float A[] = { -0.603f, -0.714f, -0.893f, 0.046f };
+ int lda = 4;
+ float B[] = { 0.859f, -0.694f, -0.868f, -0.98f, -0.103f, 0.567f, -0.277f, -0.734f };
+ int ldb = 4;
+ float C[] = { 0.517f, -0.622f };
+ int ldc = 1;
+ float C_expected[] = { -0.160575f, -0.0234604f };
+ cblas_sgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[i], C_expected[i], flteps, "sgemm(case 1471)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int transA = 112;
+ int transB = 112;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ float alpha = 0.1f;
+ float beta = 1.0f;
+ float A[] = { -0.087f, -0.047f, -0.051f, -0.615f };
+ int lda = 1;
+ float B[] = { -0.722f, -0.077f, 0.563f, 0.501f, 0.855f, 0.605f, 0.556f, -0.627f };
+ int ldb = 4;
+ float C[] = { -0.181f, -0.89f };
+ int ldc = 2;
+ float C_expected[] = { -0.208039f, -0.864557f };
+ cblas_sgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[i], C_expected[i], flteps, "sgemm(case 1472)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int transA = 112;
+ int transB = 112;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ float alpha = 0.1f;
+ float beta = 1.0f;
+ float A[] = { -0.753f, -0.074f, -0.247f, -0.19f };
+ int lda = 4;
+ float B[] = { 0.061f, 0.743f, 0.22f, -0.682f, 0.733f, 0.417f, 0.772f, 0.665f };
+ int ldb = 2;
+ float C[] = { -0.253f, 0.972f };
+ int ldc = 1;
+ float C_expected[] = { -0.291994f, 0.898164f };
+ cblas_sgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[i], C_expected[i], flteps, "sgemm(case 1473)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int transA = 111;
+ int transB = 111;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ double alpha = 0;
+ double beta = 0;
+ double A[] = { 0.017, 0.191, 0.863, -0.97 };
+ int lda = 4;
+ double B[] = { -0.207, -0.916, -0.278, 0.403, 0.885, 0.409, -0.772, -0.27 };
+ int ldb = 2;
+ double C[] = { -0.274, -0.858 };
+ int ldc = 2;
+ double C_expected[] = { 0.0, 0.0 };
+ cblas_dgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[i], C_expected[i], dbleps, "dgemm(case 1474)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int transA = 111;
+ int transB = 111;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ double alpha = 0;
+ double beta = 0;
+ double A[] = { 0.571, 0.081, 0.109, 0.988 };
+ int lda = 1;
+ double B[] = { -0.048, -0.753, -0.8, -0.89, -0.535, -0.017, -0.018, -0.544 };
+ int ldb = 4;
+ double C[] = { -0.876, -0.792 };
+ int ldc = 1;
+ double C_expected[] = { 0.0, 0.0 };
+ cblas_dgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[i], C_expected[i], dbleps, "dgemm(case 1475)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int transA = 111;
+ int transB = 112;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ double alpha = -0.3;
+ double beta = 1;
+ double A[] = { 0.939, 0.705, 0.977, 0.4 };
+ int lda = 4;
+ double B[] = { -0.089, -0.822, 0.937, 0.159, 0.789, -0.413, -0.172, 0.88 };
+ int ldb = 4;
+ double C[] = { -0.619, 0.063 };
+ int ldc = 2;
+ double C_expected[] = { -0.7137904, -0.1270986 };
+ cblas_dgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[i], C_expected[i], dbleps, "dgemm(case 1476)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int transA = 111;
+ int transB = 112;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ double alpha = -0.3;
+ double beta = 1;
+ double A[] = { -0.795, 0.81, 0.388, 0.09 };
+ int lda = 1;
+ double B[] = { -0.847, 0.031, -0.938, 0.09, -0.286, -0.478, -0.981, 0.881 };
+ int ldb = 2;
+ double C[] = { -0.242, -0.02 };
+ int ldc = 1;
+ double C_expected[] = { -0.1562981, -0.0026243 };
+ cblas_dgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[i], C_expected[i], dbleps, "dgemm(case 1477)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int transA = 112;
+ int transB = 111;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ double alpha = -1;
+ double beta = 0;
+ double A[] = { -0.556, 0.532, 0.746, 0.673 };
+ int lda = 1;
+ double B[] = { -0.525, 0.967, 0.687, -0.024, 0.527, 0.485, 0.109, -0.46 };
+ int ldb = 2;
+ double C[] = { -0.495, 0.859 };
+ int ldc = 2;
+ double C_expected[] = { -1.123883, 0.49819 };
+ cblas_dgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[i], C_expected[i], dbleps, "dgemm(case 1478)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int transA = 112;
+ int transB = 111;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ double alpha = -1;
+ double beta = 0;
+ double A[] = { -0.358, 0.224, -0.941, 0.513 };
+ int lda = 4;
+ double B[] = { -0.201, -0.159, -0.586, -0.016, -0.324, 0.411, 0.115, -0.229 };
+ int ldb = 4;
+ double C[] = { 0.558, 0.596 };
+ int ldc = 1;
+ double C_expected[] = { -0.57956, 0.017636 };
+ cblas_dgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[i], C_expected[i], dbleps, "dgemm(case 1479)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int transA = 112;
+ int transB = 112;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ double alpha = -0.3;
+ double beta = 1;
+ double A[] = { -0.586, 0.809, 0.709, -0.524 };
+ int lda = 1;
+ double B[] = { 0.768, 0.7, 0.619, -0.478, -0.129, -0.778, -0.432, 0.454 };
+ int ldb = 4;
+ double C[] = { 0.042, 0.252 };
+ int ldc = 2;
+ double C_expected[] = { -0.1996785, 0.5813976 };
+ cblas_dgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[i], C_expected[i], dbleps, "dgemm(case 1480)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int transA = 112;
+ int transB = 112;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ double alpha = -0.3;
+ double beta = 1;
+ double A[] = { -0.164, 0.522, 0.948, -0.624 };
+ int lda = 4;
+ double B[] = { -0.142, 0.778, 0.359, 0.622, -0.637, -0.757, -0.282, -0.805 };
+ int ldb = 2;
+ double C[] = { -0.09, 0.183 };
+ int ldc = 1;
+ double C_expected[] = { -0.0248334, 0.1884672 };
+ cblas_dgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[i], C_expected[i], dbleps, "dgemm(case 1481)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int transA = 111;
+ int transB = 111;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ float alpha[2] = {0.0f, 1.0f};
+ float beta[2] = {0.0f, 0.0f};
+ float A[] = { -0.082f, -0.281f, -0.096f, 0.913f, 0.974f, -0.706f, -0.773f, 0.522f };
+ int lda = 4;
+ float B[] = { 0.745f, -0.664f, 0.352f, -0.733f, 0.304f, -0.555f, -0.493f, -0.089f, 0.188f, 0.631f, 0.235f, 0.152f, -0.299f, -0.731f, -0.686f, -0.332f };
+ int ldb = 2;
+ float C[] = { -0.179f, -0.284f, -0.996f, -0.414f };
+ int ldc = 2;
+ float C_expected[] = { -1.06679f, 1.47116f, 0.599689f, 0.933532f };
+ cblas_cgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "cgemm(case 1482) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "cgemm(case 1482) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int transA = 111;
+ int transB = 111;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ float alpha[2] = {0.0f, 1.0f};
+ float beta[2] = {0.0f, 0.0f};
+ float A[] = { 0.044f, -0.33f, 0.279f, 0.712f, -0.363f, -0.788f, -0.768f, -0.551f };
+ int lda = 1;
+ float B[] = { 0.138f, 0.927f, -0.178f, -0.864f, 0.888f, 0.844f, -0.199f, 0.706f, -0.034f, 0.483f, 0.499f, 0.664f, 0.648f, 0.324f, 0.97f, 0.609f };
+ int ldb = 4;
+ float C[] = { -0.129f, 0.842f, 0.214f, -0.626f };
+ int ldc = 1;
+ float C_expected[] = { 1.81122f, 1.76205f, 1.0574f, -0.564966f };
+ cblas_cgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "cgemm(case 1483) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "cgemm(case 1483) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int transA = 111;
+ int transB = 112;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ float alpha[2] = {0.0f, 0.0f};
+ float beta[2] = {-1.0f, 0.0f};
+ float A[] = { 0.812f, -0.471f, 0.241f, 0.795f, 0.439f, 0.131f, -0.636f, 0.531f };
+ int lda = 4;
+ float B[] = { 0.062f, 0.807f, 0.873f, 0.372f, 0.239f, 0.804f, 0.537f, -0.954f, -0.396f, 0.838f, 0.081f, 0.15f, 0.489f, -0.438f, 0.165f, 0.429f };
+ int ldb = 4;
+ float C[] = { 0.868f, 0.329f, -0.509f, 0.724f };
+ int ldc = 2;
+ float C_expected[] = { -0.868f, -0.329f, 0.509f, -0.724f };
+ cblas_cgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "cgemm(case 1484) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "cgemm(case 1484) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int transA = 111;
+ int transB = 112;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ float alpha[2] = {0.0f, 0.0f};
+ float beta[2] = {-1.0f, 0.0f};
+ float A[] = { 0.832f, 0.198f, 0.794f, -0.522f, -0.319f, 0.578f, 0.332f, 0.746f };
+ int lda = 1;
+ float B[] = { -0.361f, 0.187f, -0.163f, -0.781f, 0.536f, 0.888f, -0.969f, 0.899f, 0.961f, -0.583f, 0.753f, 0.29f, -0.997f, 0.729f, -0.352f, -0.2f };
+ int ldb = 2;
+ float C[] = { 0.864f, 0.735f, -0.074f, -0.228f };
+ int ldc = 1;
+ float C_expected[] = { -0.864f, -0.735f, 0.074f, 0.228f };
+ cblas_cgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "cgemm(case 1485) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "cgemm(case 1485) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int transA = 111;
+ int transB = 113;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ float alpha[2] = {0.0f, 1.0f};
+ float beta[2] = {0.0f, 0.1f};
+ float A[] = { 0.149f, 0.187f, 0.263f, -0.715f, -0.882f, -0.907f, 0.87f, -0.527f };
+ int lda = 4;
+ float B[] = { -0.915f, -0.249f, -0.986f, -0.799f, -0.136f, 0.712f, 0.964f, 0.799f, -0.569f, 0.686f, 0.603f, 0.758f, 0.161f, -0.698f, -0.263f, -0.256f };
+ int ldb = 4;
+ float C[] = { 0.622f, -0.824f, -0.482f, -0.161f };
+ int ldc = 2;
+ float C_expected[] = { -0.246901f, 0.083044f, 1.25556f, 0.009106f };
+ cblas_cgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "cgemm(case 1486) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "cgemm(case 1486) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int transA = 111;
+ int transB = 113;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ float alpha[2] = {0.0f, 1.0f};
+ float beta[2] = {0.0f, 0.1f};
+ float A[] = { 0.963f, -0.943f, -0.734f, -0.253f, 0.832f, 0.545f, -0.815f, -0.434f };
+ int lda = 1;
+ float B[] = { 0.23f, -0.211f, 0.906f, 0.232f, -0.339f, 0.597f, -0.919f, 0.793f, 0.535f, 0.526f, 0.119f, 0.053f, 0.751f, 0.044f, 0.752f, -0.469f };
+ int ldb = 2;
+ float C[] = { 0.483f, -0.266f, -0.224f, -0.692f };
+ int ldc = 1;
+ float C_expected[] = { -0.047537f, 0.667177f, 1.02025f, 0.823778f };
+ cblas_cgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "cgemm(case 1487) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "cgemm(case 1487) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int transA = 112;
+ int transB = 111;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ float alpha[2] = {-0.3f, 0.1f};
+ float beta[2] = {-1.0f, 0.0f};
+ float A[] = { -0.657f, -0.497f, -0.293f, -0.168f, -0.943f, -0.181f, 0.569f, 0.91f };
+ int lda = 1;
+ float B[] = { -0.047f, 0.796f, -0.913f, 0.998f, 0.365f, 0.467f, -0.627f, -0.523f, 0.885f, 0.234f, -0.494f, 0.071f, -0.361f, -0.154f, -0.055f, -0.32f };
+ int ldb = 2;
+ float C[] = { 0.956f, 0.268f, 0.152f, 0.717f };
+ int ldc = 2;
+ float C_expected[] = { -0.668685f, 0.134477f, -0.715786f, -0.478065f };
+ cblas_cgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "cgemm(case 1488) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "cgemm(case 1488) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int transA = 112;
+ int transB = 111;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ float alpha[2] = {-0.3f, 0.1f};
+ float beta[2] = {-1.0f, 0.0f};
+ float A[] = { 0.394f, -0.482f, 0.631f, -0.833f, 0.221f, 0.672f, 0.2f, 0.967f };
+ int lda = 4;
+ float B[] = { 0.708f, 0.695f, 0.111f, -0.912f, 0.376f, 0.606f, -0.997f, -0.741f, 0.349f, 0.543f, 0.372f, -0.563f, 0.129f, -0.295f, -0.672f, -0.95f };
+ int ldb = 4;
+ float C[] = { 0.436f, 0.752f, 0.074f, 0.209f };
+ int ldc = 1;
+ float C_expected[] = { -0.325083f, -0.301952f, -0.283022f, 0.339919f };
+ cblas_cgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "cgemm(case 1489) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "cgemm(case 1489) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int transA = 112;
+ int transB = 112;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ float alpha[2] = {1.0f, 0.0f};
+ float beta[2] = {-0.3f, 0.1f};
+ float A[] = { 0.827f, -0.862f, 0.373f, -0.265f, -0.9f, 0.892f, -0.319f, 0.151f };
+ int lda = 1;
+ float B[] = { 0.603f, 0.816f, -0.511f, 0.831f, -0.36f, -0.954f, -0.978f, 0.485f, 0.675f, 0.186f, 0.463f, 0.144f, 0.851f, -0.458f, 0.766f, -0.213f };
+ int ldb = 4;
+ float C[] = { -0.335f, 0.333f, -0.4f, 0.422f };
+ int ldc = 2;
+ float C_expected[] = { 2.7126f, 0.702111f, 0.437661f, 0.691294f };
+ cblas_cgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "cgemm(case 1490) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "cgemm(case 1490) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int transA = 112;
+ int transB = 112;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ float alpha[2] = {1.0f, 0.0f};
+ float beta[2] = {-0.3f, 0.1f};
+ float A[] = { 0.966f, 0.476f, -0.013f, -0.655f, 0.773f, -0.543f, -0.231f, -0.353f };
+ int lda = 4;
+ float B[] = { -0.684f, 0.144f, 0.018f, -0.77f, -0.688f, 0.909f, -0.094f, -0.938f, -0.757f, 0.574f, -0.479f, 0.473f, 0.0f, 0.064f, -0.168f, 0.858f };
+ int ldb = 2;
+ float C[] = { -0.912f, 0.54f, 0.756f, 0.024f };
+ int ldc = 1;
+ float C_expected[] = { -0.156236f, 0.839112f, -0.230206f, -0.106256f };
+ cblas_cgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "cgemm(case 1491) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "cgemm(case 1491) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int transA = 112;
+ int transB = 113;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ float alpha[2] = {0.0f, 0.0f};
+ float beta[2] = {1.0f, 0.0f};
+ float A[] = { 0.66f, -0.113f, -0.663f, -0.856f, 0.614f, -0.344f, -0.964f, -0.532f };
+ int lda = 1;
+ float B[] = { -0.606f, -0.965f, -0.279f, -0.312f, 0.63f, 0.967f, 0.041f, -0.557f, 0.663f, 0.619f, -0.134f, 0.261f, -0.388f, 0.525f, 0.222f, 0.538f };
+ int ldb = 4;
+ float C[] = { 0.114f, -0.376f, -0.851f, -0.682f };
+ int ldc = 2;
+ float C_expected[] = { 0.114f, -0.376f, -0.851f, -0.682f };
+ cblas_cgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "cgemm(case 1492) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "cgemm(case 1492) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int transA = 112;
+ int transB = 113;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ float alpha[2] = {0.0f, 0.0f};
+ float beta[2] = {1.0f, 0.0f};
+ float A[] = { 0.212f, -0.752f, 0.679f, 0.49f, -0.029f, -0.488f, 0.567f, 0.374f };
+ int lda = 4;
+ float B[] = { -0.914f, 0.734f, -0.845f, 0.059f, -0.297f, 0.152f, -0.417f, -0.669f, 0.831f, -0.544f, 0.022f, 0.102f, -0.379f, -0.357f, -0.394f, -0.588f };
+ int ldb = 2;
+ float C[] = { -0.584f, 0.373f, 0.235f, 0.521f };
+ int ldc = 1;
+ float C_expected[] = { -0.584f, 0.373f, 0.235f, 0.521f };
+ cblas_cgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "cgemm(case 1493) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "cgemm(case 1493) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int transA = 113;
+ int transB = 111;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ float alpha[2] = {0.0f, 0.1f};
+ float beta[2] = {-1.0f, 0.0f};
+ float A[] = { 0.135f, 0.128f, 0.909f, -0.963f, 0.299f, -0.944f, 0.944f, 0.942f };
+ int lda = 1;
+ float B[] = { 0.924f, -0.317f, -0.992f, -0.854f, -0.435f, 0.102f, 0.126f, 0.862f, 0.952f, 0.68f, 0.545f, 0.168f, 0.752f, 0.549f, 0.687f, -0.76f };
+ int ldb = 2;
+ float C[] = { -0.369f, -0.33f, 0.849f, -0.632f };
+ int ldc = 2;
+ float C_expected[] = { 0.326537f, 0.37603f, -0.86067f, 0.529817f };
+ cblas_cgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "cgemm(case 1494) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "cgemm(case 1494) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int transA = 113;
+ int transB = 111;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ float alpha[2] = {0.0f, 0.1f};
+ float beta[2] = {-1.0f, 0.0f};
+ float A[] = { 0.061f, -0.271f, -0.043f, -0.023f, 0.694f, 0.333f, 0.733f, -0.967f };
+ int lda = 4;
+ float B[] = { 0.088f, -0.607f, 0.589f, 0.375f, -0.897f, -0.954f, -0.216f, -0.195f, -0.865f, -0.511f, -0.219f, 0.535f, 0.976f, 0.582f, 0.464f, -0.041f };
+ int ldb = 4;
+ float C[] = { 0.533f, -0.63f, 0.405f, 0.667f };
+ int ldc = 1;
+ float C_expected[] = { -0.459906f, 0.552595f, -0.425391f, -0.533626f };
+ cblas_cgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "cgemm(case 1495) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "cgemm(case 1495) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int transA = 113;
+ int transB = 112;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ float alpha[2] = {0.0f, 0.0f};
+ float beta[2] = {1.0f, 0.0f};
+ float A[] = { -0.676f, -0.116f, 0.707f, -0.256f, -0.893f, -0.966f, 0.159f, -0.246f };
+ int lda = 1;
+ float B[] = { 0.059f, 0.281f, -0.93f, -0.263f, 0.583f, -0.11f, 0.639f, -0.96f, -0.878f, 0.984f, 0.058f, 0.977f, -0.567f, 0.561f, -0.048f, -0.798f };
+ int ldb = 4;
+ float C[] = { 0.362f, -0.808f, 0.428f, -0.112f };
+ int ldc = 2;
+ float C_expected[] = { 0.362f, -0.808f, 0.428f, -0.112f };
+ cblas_cgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "cgemm(case 1496) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "cgemm(case 1496) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int transA = 113;
+ int transB = 112;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ float alpha[2] = {0.0f, 0.0f};
+ float beta[2] = {1.0f, 0.0f};
+ float A[] = { -0.915f, 0.439f, 0.171f, -0.019f, 0.843f, 0.944f, -0.581f, 0.856f };
+ int lda = 4;
+ float B[] = { -0.284f, 0.207f, -0.27f, 0.832f, 0.894f, -0.626f, -0.305f, -0.006f, 0.562f, -0.744f, -0.533f, 0.126f, -0.375f, -0.333f, 0.275f, 0.748f };
+ int ldb = 2;
+ float C[] = { -0.763f, -0.829f, 0.708f, -0.613f };
+ int ldc = 1;
+ float C_expected[] = { -0.763f, -0.829f, 0.708f, -0.613f };
+ cblas_cgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "cgemm(case 1497) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "cgemm(case 1497) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int transA = 113;
+ int transB = 113;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ float alpha[2] = {0.0f, 0.1f};
+ float beta[2] = {0.0f, 1.0f};
+ float A[] = { 0.496f, -0.9f, 0.825f, -0.678f, 0.41f, -0.585f, -0.264f, 0.308f };
+ int lda = 1;
+ float B[] = { 0.907f, 0.972f, -0.724f, 0.745f, -0.601f, 0.589f, 0.759f, -0.521f, -0.161f, -0.321f, 0.341f, -0.981f, -0.378f, -0.671f, -0.314f, -0.878f };
+ int ldb = 4;
+ float C[] = { -0.293f, 0.07f, 0.087f, -0.542f };
+ int ldc = 2;
+ float C_expected[] = { 0.10357f, -0.163927f, 0.444626f, -0.0076744f };
+ cblas_cgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "cgemm(case 1498) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "cgemm(case 1498) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int transA = 113;
+ int transB = 113;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ float alpha[2] = {0.0f, 0.1f};
+ float beta[2] = {0.0f, 1.0f};
+ float A[] = { -0.225f, -0.629f, -0.939f, -0.836f, -0.841f, -0.794f, 0.836f, -0.65f };
+ int lda = 4;
+ float B[] = { 0.869f, -0.453f, 0.8f, -0.947f, 0.545f, 0.716f, -0.507f, -0.228f, 0.722f, 0.372f, 0.77f, 0.317f, -0.153f, -0.524f, -0.465f, -0.684f };
+ int ldb = 2;
+ float C[] = { -0.896f, 0.91f, -0.973f, -0.269f };
+ int ldc = 1;
+ float C_expected[] = { -1.18974f, -1.0134f, 0.189027f, -1.14494f };
+ cblas_cgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "cgemm(case 1499) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "cgemm(case 1499) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int transA = 111;
+ int transB = 111;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ double alpha[2] = {1, 0};
+ double beta[2] = {-1, 0};
+ double A[] = { -0.33, 0.457, 0.428, -0.19, 0.86, -0.53, 0.058, -0.942 };
+ int lda = 4;
+ double B[] = { 0.434, 0.653, -0.124, 0.191, -0.112, -0.84, -0.72, 0.075, -0.503, -0.109, 0.3, -0.898, 0.489, 0.384, 0.993, -0.804 };
+ int ldb = 2;
+ double C[] = { -0.792, -0.155, -0.608, -0.243 };
+ int ldc = 2;
+ double C_expected[] = { 0.042563, -0.465908, -0.649991, -1.621116 };
+ cblas_zgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zgemm(case 1500) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zgemm(case 1500) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int transA = 111;
+ int transB = 111;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ double alpha[2] = {1, 0};
+ double beta[2] = {-1, 0};
+ double A[] = { 0.726, -0.438, -0.23, -0.054, -0.019, 0.902, -0.883, -0.235 };
+ int lda = 1;
+ double B[] = { 0.159, -0.18, 0.386, -0.167, 0.971, -0.072, 0.87, -0.839, 0.474, 0.956, -0.235, 0.332, 0.826, -0.056, -0.941, 0.01 };
+ int ldb = 4;
+ double C[] = { -0.799, 0.973, -0.549, -0.177 };
+ int ldc = 1;
+ double C_expected[] = { -0.181084, 0.257841, 2.251901, 1.558195 };
+ cblas_zgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zgemm(case 1501) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zgemm(case 1501) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int transA = 111;
+ int transB = 112;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ double alpha[2] = {0, 0.1};
+ double beta[2] = {1, 0};
+ double A[] = { 0.109, 0.892, -0.723, 0.793, 0.109, -0.419, -0.534, 0.448 };
+ int lda = 4;
+ double B[] = { -0.875, -0.31, -0.027, 0.067, 0.274, -0.126, -0.548, 0.497, 0.681, 0.388, 0.909, 0.889, 0.982, -0.074, -0.788, 0.233 };
+ int ldb = 4;
+ double C[] = { 0.503, 0.067, 0.239, 0.876 };
+ int ldc = 2;
+ double C_expected[] = { 0.6553584, 0.0864583, 0.2559136, 0.7518389 };
+ cblas_zgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zgemm(case 1502) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zgemm(case 1502) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int transA = 111;
+ int transB = 112;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ double alpha[2] = {0, 0.1};
+ double beta[2] = {1, 0};
+ double A[] = { 0.334, 0.192, -0.992, -0.168, 0.154, -0.75, -0.797, -0.76 };
+ int lda = 1;
+ double B[] = { -0.82, 0.147, -0.237, 0.68, 0.317, 0.257, -0.406, -0.802, 0.058, 0.012, -0.832, 0.949, -0.263, -0.085, -0.064, 0.492 };
+ int ldb = 2;
+ double C[] = { 0.079, -0.602, -0.392, 0.316 };
+ int ldc = 1;
+ double C_expected[] = { 0.0980569, -0.6430449, -0.539207, 0.4226848 };
+ cblas_zgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zgemm(case 1503) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zgemm(case 1503) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int transA = 111;
+ int transB = 113;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ double alpha[2] = {0, 0};
+ double beta[2] = {-1, 0};
+ double A[] = { -0.305, -0.698, -0.072, -0.383, 0.364, -0.656, 0.819, 0.194 };
+ int lda = 4;
+ double B[] = { 0.682, 0.498, -0.389, 0.923, -0.853, -0.558, -0.722, -0.085, -0.27, 0.026, -0.107, -0.036, 0.644, -0.327, -0.894, 0.34 };
+ int ldb = 4;
+ double C[] = { 0.981, -0.336, -0.377, -0.41 };
+ int ldc = 2;
+ double C_expected[] = { -0.981, 0.336, 0.377, 0.41 };
+ cblas_zgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zgemm(case 1504) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zgemm(case 1504) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int transA = 111;
+ int transB = 113;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ double alpha[2] = {0, 0};
+ double beta[2] = {-1, 0};
+ double A[] = { -0.306, -0.709, -0.196, 0.285, 0.873, -0.802, 0.715, -0.179 };
+ int lda = 1;
+ double B[] = { 0.028, 0.109, 0.87, -0.446, 0.735, 0.731, 0.021, -0.186, 0.541, 0.97, -0.333, 0.002, -0.089, -0.01, 0.331, 0.851 };
+ int ldb = 2;
+ double C[] = { 0.902, -0.584, -0.695, -0.607 };
+ int ldc = 1;
+ double C_expected[] = { -0.902, 0.584, 0.695, 0.607 };
+ cblas_zgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zgemm(case 1505) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zgemm(case 1505) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int transA = 112;
+ int transB = 111;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ double alpha[2] = {-1, 0};
+ double beta[2] = {1, 0};
+ double A[] = { 0.517, -0.136, 0.72, -0.237, 0.121, -0.66, 0.005, 0.759 };
+ int lda = 1;
+ double B[] = { -0.606, 0.049, 0.807, -0.236, -0.258, -0.412, 0.75, -0.659, 0.993, -0.029, -0.968, 0.707, -0.362, -0.005, 0.096, -0.241 };
+ int ldb = 2;
+ double C[] = { 0.63, 0.922, 0.025, -0.535 };
+ int ldc = 2;
+ double C_expected[] = { 1.117044, 1.983417, -1.276831, -0.447092 };
+ cblas_zgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zgemm(case 1506) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zgemm(case 1506) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int transA = 112;
+ int transB = 111;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ double alpha[2] = {-1, 0};
+ double beta[2] = {1, 0};
+ double A[] = { 0.064, 0.371, -0.01, -0.262, 0.143, -0.081, 0.1, -0.062 };
+ int lda = 4;
+ double B[] = { -0.749, 0.289, -0.239, -0.226, 0.284, 0.668, 0.305, 0.075, -0.36, 0.166, -0.416, 0.234, -0.267, 0.525, 0.116, -0.561 };
+ int ldb = 4;
+ double C[] = { 0.671, 0.763, 0.444, -0.246 };
+ int ldc = 1;
+ double C_expected[] = { 0.753107, 0.896395, 0.481996, -0.263126 };
+ cblas_zgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zgemm(case 1507) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zgemm(case 1507) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int transA = 112;
+ int transB = 112;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ double alpha[2] = {1, 0};
+ double beta[2] = {-0.3, 0.1};
+ double A[] = { -0.956, -0.751, 0.671, -0.633, 0.648, -0.042, 0.948, 0.826 };
+ int lda = 1;
+ double B[] = { 0.921, 0.506, -0.609, 0.817, -0.686, 0.991, 0.616, -0.482, -0.02, -0.34, 0.559, 0.976, 0.431, 0.385, -0.164, -0.778 };
+ int ldb = 4;
+ double C[] = { 0.074, -0.01, 0.165, 0.166 };
+ int ldc = 2;
+ double C_expected[] = { 0.166046, 0.491557, 1.473191, -0.033821 };
+ cblas_zgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zgemm(case 1508) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zgemm(case 1508) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int transA = 112;
+ int transB = 112;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ double alpha[2] = {1, 0};
+ double beta[2] = {-0.3, 0.1};
+ double A[] = { -0.698, -0.062, 0.023, 0.704, 0.443, -0.46, 0.541, 0.296 };
+ int lda = 4;
+ double B[] = { 0.787, -0.199, 0.835, -0.276, -0.515, 0.467, -0.76, -0.483, 0.015, -0.394, -0.748, 0.02, 0.573, 0.3, -0.088, -0.238 };
+ int ldb = 2;
+ double C[] = { 0.935, -0.655, -0.797, 0.071 };
+ int ldc = 1;
+ double C_expected[] = { -1.070679, 0.178755, -0.344714, -0.308137 };
+ cblas_zgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zgemm(case 1509) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zgemm(case 1509) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int transA = 112;
+ int transB = 113;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ double alpha[2] = {0, 0.1};
+ double beta[2] = {-0.3, 0.1};
+ double A[] = { -0.202, -0.219, 0.741, 0.527, 0.054, 0.16, -0.359, 0.338 };
+ int lda = 1;
+ double B[] = { -0.872, 0.995, 0.722, 0.618, -0.27, 0.939, -0.743, 0.547, -0.864, 0.376, -0.997, -0.63, 0.887, -0.454, 0.436, -0.039 };
+ int ldb = 4;
+ double C[] = { -0.684, 0.463, -0.386, -0.524 };
+ int ldc = 2;
+ double C_expected[] = { 0.1423153, -0.066679, 0.1175618, 0.0012949 };
+ cblas_zgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zgemm(case 1510) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zgemm(case 1510) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int transA = 112;
+ int transB = 113;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ double alpha[2] = {0, 0.1};
+ double beta[2] = {-0.3, 0.1};
+ double A[] = { -0.855, -0.173, -0.679, 0.824, 0.469, 0.786, 0.757, -0.109 };
+ int lda = 4;
+ double B[] = { 0.483, -0.888, -0.757, 0.551, -0.81, 0.23, -0.078, 0.725, -0.592, 0.394, 0.884, 0.802, -0.813, -0.016, -0.853, 0.783 };
+ int ldb = 2;
+ double C[] = { 0.181, -0.368, -0.864, -0.784 };
+ int ldc = 1;
+ double C_expected[] = { 0.1728438, 0.1183508, 0.2526999, 0.3004174 };
+ cblas_zgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zgemm(case 1511) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zgemm(case 1511) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int transA = 113;
+ int transB = 111;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ double alpha[2] = {-1, 0};
+ double beta[2] = {-0.3, 0.1};
+ double A[] = { 0.446, -0.65, -0.724, 0.014, 0.792, -0.695, -0.81, -0.358 };
+ int lda = 1;
+ double B[] = { -0.08, 0.216, 0.689, 0.699, 0.073, -0.346, 0.821, -0.668, -0.798, 0.869, 0.451, -0.061, -0.41, 0.316, 0.104, -0.514 };
+ int ldb = 2;
+ double C[] = { -0.476, 0.211, -0.912, -0.243 };
+ int ldc = 2;
+ double C_expected[] = { 1.372475, -0.135616, 0.549353, -1.968747 };
+ cblas_zgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zgemm(case 1512) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zgemm(case 1512) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int transA = 113;
+ int transB = 111;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ double alpha[2] = {-1, 0};
+ double beta[2] = {-0.3, 0.1};
+ double A[] = { 0.669, 0.046, -0.094, 0.666, 0.23, 0.448, -0.795, -0.142 };
+ int lda = 4;
+ double B[] = { 0.037, -0.154, -0.739, 0.905, 0.793, -0.53, -0.34, 0.428, 0.072, -0.263, -0.603, -0.905, 0.681, -0.083, -0.511, -0.337 };
+ int ldb = 4;
+ double C[] = { 0.247, 0.575, -0.836, -0.883 };
+ int ldc = 1;
+ double C_expected[] = { -0.975939, 0.415528, 0.275533, 0.002716 };
+ cblas_zgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zgemm(case 1513) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zgemm(case 1513) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int transA = 113;
+ int transB = 112;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ double alpha[2] = {0, 0};
+ double beta[2] = {-1, 0};
+ double A[] = { 0.369, 0.506, 0.217, -0.739, -0.395, 0.16, -0.329, -0.954 };
+ int lda = 1;
+ double B[] = { -0.622, -0.945, 0.416, -0.884, 0.797, -0.74, 0.519, -0.789, -0.348, 0.563, -0.398, -0.956, 0.227, 0.84, -0.079, 0.847 };
+ int ldb = 4;
+ double C[] = { 0.833, 0.761, 0.074, -0.448 };
+ int ldc = 2;
+ double C_expected[] = { -0.833, -0.761, -0.074, 0.448 };
+ cblas_zgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zgemm(case 1514) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zgemm(case 1514) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int transA = 113;
+ int transB = 112;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ double alpha[2] = {0, 0};
+ double beta[2] = {-1, 0};
+ double A[] = { -0.141, 0.275, 0.717, 0.775, -0.701, -0.689, -0.883, -0.077 };
+ int lda = 4;
+ double B[] = { -0.526, -0.437, 0.133, -0.209, -0.83, 0.328, 0.916, -0.337, 0.762, -0.664, -0.566, 0.955, 0.168, 0.488, -0.172, -0.535 };
+ int ldb = 2;
+ double C[] = { -0.88, 0.945, 0.416, 0.99 };
+ int ldc = 1;
+ double C_expected[] = { 0.88, -0.945, -0.416, -0.99 };
+ cblas_zgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zgemm(case 1515) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zgemm(case 1515) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int transA = 113;
+ int transB = 113;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ double alpha[2] = {-0.3, 0.1};
+ double beta[2] = {0, 0.1};
+ double A[] = { -0.534, -0.013, -0.258, -0.31, -0.211, -0.883, -0.89, -0.499 };
+ int lda = 1;
+ double B[] = { -0.185, -0.798, -0.34, 0.716, 0.035, 0.968, -0.26, 0.784, -0.889, -0.344, -0.685, -0.647, -0.764, 0.03, 0.626, -0.989 };
+ int ldb = 4;
+ double C[] = { -0.793, -0.551, 0.182, 0.838 };
+ int ldc = 2;
+ double C_expected[] = { -0.5507177, -0.0286821, 0.2222276, 0.5197398 };
+ cblas_zgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zgemm(case 1516) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zgemm(case 1516) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int transA = 113;
+ int transB = 113;
+ int M = 1;
+ int N = 2;
+ int K = 4;
+ double alpha[2] = {-0.3, 0.1};
+ double beta[2] = {0, 0.1};
+ double A[] = { 0.575, -0.128, -0.702, 0.758, 0.383, -0.914, 0.157, 0.368 };
+ int lda = 4;
+ double B[] = { 0.572, -0.841, 0.223, -0.334, -0.823, -0.84, 0.671, -0.871, 0.241, 0.927, -0.344, 0.281, -0.034, -0.104, 0.587, -0.329 };
+ int ldb = 2;
+ double C[] = { -0.612, 0.167, 0.647, 0.447 };
+ int ldc = 1;
+ double C_expected[] = { -0.7876717, 0.0341179, -0.0800018, 0.5717566 };
+ cblas_zgemm(order, transA, transB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zgemm(case 1517) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zgemm(case 1517) imag");
+ };
+ };
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_gemv.c b/gsl-1.9/cblas/test_gemv.c
new file mode 100644
index 0000000..9145168
--- /dev/null
+++ b/gsl-1.9/cblas/test_gemv.c
@@ -0,0 +1,503 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_gemv (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ int order = 101;
+ int trans = 111;
+ int M = 1;
+ int N = 1;
+ int lda = 1;
+ float alpha = 1.0f;
+ float beta = -0.3f;
+ float A[] = { -0.805f };
+ float X[] = { -0.965f };
+ int incX = -1;
+ float Y[] = { 0.537f };
+ int incY = -1;
+ float y_expected[] = { 0.615725f };
+ cblas_sgemv(order, trans, M, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "sgemv(case 774)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int M = 1;
+ int N = 1;
+ int lda = 1;
+ float alpha = 1.0f;
+ float beta = -0.3f;
+ float A[] = { -0.805f };
+ float X[] = { -0.965f };
+ int incX = -1;
+ float Y[] = { 0.537f };
+ int incY = -1;
+ float y_expected[] = { 0.615725f };
+ cblas_sgemv(order, trans, M, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "sgemv(case 775)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int M = 1;
+ int N = 1;
+ int lda = 1;
+ float alpha = 1.0f;
+ float beta = 0.0f;
+ float A[] = { -0.805f };
+ float X[] = { -0.965f };
+ int incX = -1;
+ float Y[] = { 0.537f };
+ int incY = -1;
+ float y_expected[] = { 0.776825f };
+ cblas_sgemv(order, trans, M, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "sgemv(case 776)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int M = 1;
+ int N = 1;
+ int lda = 1;
+ float alpha = 1.0f;
+ float beta = 0.0f;
+ float A[] = { -0.805f };
+ float X[] = { -0.965f };
+ int incX = -1;
+ float Y[] = { 0.537f };
+ int incY = -1;
+ float y_expected[] = { 0.776825f };
+ cblas_sgemv(order, trans, M, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "sgemv(case 777)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int M = 1;
+ int N = 1;
+ int lda = 1;
+ double alpha = -0.3;
+ double beta = -1;
+ double A[] = { -0.047 };
+ double X[] = { 0.672 };
+ int incX = -1;
+ double Y[] = { 0.554 };
+ int incY = -1;
+ double y_expected[] = { -0.5445248 };
+ cblas_dgemv(order, trans, M, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "dgemv(case 778)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int M = 1;
+ int N = 1;
+ int lda = 1;
+ double alpha = -0.3;
+ double beta = -1;
+ double A[] = { -0.047 };
+ double X[] = { 0.672 };
+ int incX = -1;
+ double Y[] = { 0.554 };
+ int incY = -1;
+ double y_expected[] = { -0.5445248 };
+ cblas_dgemv(order, trans, M, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "dgemv(case 779)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int M = 1;
+ int N = 1;
+ int lda = 1;
+ double alpha = -1;
+ double beta = 1;
+ double A[] = { -0.047 };
+ double X[] = { 0.672 };
+ int incX = -1;
+ double Y[] = { 0.554 };
+ int incY = -1;
+ double y_expected[] = { 0.585584 };
+ cblas_dgemv(order, trans, M, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "dgemv(case 780)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int M = 1;
+ int N = 1;
+ int lda = 1;
+ double alpha = -1;
+ double beta = 1;
+ double A[] = { -0.047 };
+ double X[] = { 0.672 };
+ int incX = -1;
+ double Y[] = { 0.554 };
+ int incY = -1;
+ double y_expected[] = { 0.585584 };
+ cblas_dgemv(order, trans, M, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "dgemv(case 781)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int M = 1;
+ int N = 1;
+ int lda = 1;
+ float alpha[2] = {0.0f, 0.1f};
+ float beta[2] = {0.0f, 1.0f};
+ float A[] = { 0.629f, 0.801f };
+ float X[] = { 0.778f, -0.073f };
+ int incX = -1;
+ float Y[] = { -0.976f, -0.682f };
+ int incY = -1;
+ float y_expected[] = { 0.624274f, -0.921216f };
+ cblas_cgemv(order, trans, M, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], flteps, "cgemv(case 782) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], flteps, "cgemv(case 782) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int M = 1;
+ int N = 1;
+ int lda = 1;
+ float alpha[2] = {0.0f, 0.1f};
+ float beta[2] = {0.0f, 1.0f};
+ float A[] = { 0.629f, 0.801f };
+ float X[] = { 0.778f, -0.073f };
+ int incX = -1;
+ float Y[] = { -0.976f, -0.682f };
+ int incY = -1;
+ float y_expected[] = { 0.624274f, -0.921216f };
+ cblas_cgemv(order, trans, M, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], flteps, "cgemv(case 783) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], flteps, "cgemv(case 783) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int M = 1;
+ int N = 1;
+ int lda = 1;
+ float alpha[2] = {0.0f, 1.0f};
+ float beta[2] = {-0.3f, 0.1f};
+ float A[] = { 0.629f, 0.801f };
+ float X[] = { 0.778f, -0.073f };
+ int incX = -1;
+ float Y[] = { -0.976f, -0.682f };
+ int incY = -1;
+ float y_expected[] = { -0.216261f, 0.654835f };
+ cblas_cgemv(order, trans, M, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], flteps, "cgemv(case 784) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], flteps, "cgemv(case 784) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int M = 1;
+ int N = 1;
+ int lda = 1;
+ float alpha[2] = {0.0f, 1.0f};
+ float beta[2] = {-0.3f, 0.1f};
+ float A[] = { 0.629f, 0.801f };
+ float X[] = { 0.778f, -0.073f };
+ int incX = -1;
+ float Y[] = { -0.976f, -0.682f };
+ int incY = -1;
+ float y_expected[] = { -0.216261f, 0.654835f };
+ cblas_cgemv(order, trans, M, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], flteps, "cgemv(case 785) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], flteps, "cgemv(case 785) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int M = 1;
+ int N = 1;
+ int lda = 1;
+ float alpha[2] = {0.0f, 0.1f};
+ float beta[2] = {-0.3f, 0.1f};
+ float A[] = { 0.629f, 0.801f };
+ float X[] = { 0.778f, -0.073f };
+ int incX = -1;
+ float Y[] = { -0.976f, -0.682f };
+ int incY = -1;
+ float y_expected[] = { 0.427909f, 0.150089f };
+ cblas_cgemv(order, trans, M, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], flteps, "cgemv(case 786) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], flteps, "cgemv(case 786) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int M = 1;
+ int N = 1;
+ int lda = 1;
+ float alpha[2] = {0.0f, 0.1f};
+ float beta[2] = {-0.3f, 0.1f};
+ float A[] = { 0.629f, 0.801f };
+ float X[] = { 0.778f, -0.073f };
+ int incX = -1;
+ float Y[] = { -0.976f, -0.682f };
+ int incY = -1;
+ float y_expected[] = { 0.427909f, 0.150089f };
+ cblas_cgemv(order, trans, M, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], flteps, "cgemv(case 787) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], flteps, "cgemv(case 787) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int M = 1;
+ int N = 1;
+ int lda = 1;
+ double alpha[2] = {0, 0.1};
+ double beta[2] = {1, 0};
+ double A[] = { 0.932, -0.724 };
+ double X[] = { 0.334, -0.317 };
+ int incX = -1;
+ double Y[] = { 0.348, 0.07 };
+ int incY = -1;
+ double y_expected[] = { 0.401726, 0.078178 };
+ cblas_zgemv(order, trans, M, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], dbleps, "zgemv(case 788) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], dbleps, "zgemv(case 788) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int M = 1;
+ int N = 1;
+ int lda = 1;
+ double alpha[2] = {0, 0.1};
+ double beta[2] = {1, 0};
+ double A[] = { 0.932, -0.724 };
+ double X[] = { 0.334, -0.317 };
+ int incX = -1;
+ double Y[] = { 0.348, 0.07 };
+ int incY = -1;
+ double y_expected[] = { 0.401726, 0.078178 };
+ cblas_zgemv(order, trans, M, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], dbleps, "zgemv(case 789) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], dbleps, "zgemv(case 789) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int M = 1;
+ int N = 1;
+ int lda = 1;
+ double alpha[2] = {-0.3, 0.1};
+ double beta[2] = {0, 1};
+ double A[] = { 0.932, -0.724 };
+ double X[] = { 0.334, -0.317 };
+ int incX = -1;
+ double Y[] = { 0.348, 0.07 };
+ int incY = -1;
+ double y_expected[] = { -0.040808, 0.517356 };
+ cblas_zgemv(order, trans, M, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], dbleps, "zgemv(case 790) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], dbleps, "zgemv(case 790) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int M = 1;
+ int N = 1;
+ int lda = 1;
+ double alpha[2] = {-0.3, 0.1};
+ double beta[2] = {0, 1};
+ double A[] = { 0.932, -0.724 };
+ double X[] = { 0.334, -0.317 };
+ int incX = -1;
+ double Y[] = { 0.348, 0.07 };
+ int incY = -1;
+ double y_expected[] = { -0.040808, 0.517356 };
+ cblas_zgemv(order, trans, M, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], dbleps, "zgemv(case 791) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], dbleps, "zgemv(case 791) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int M = 1;
+ int N = 1;
+ int lda = 1;
+ double alpha[2] = {1, 0};
+ double beta[2] = {0, 0};
+ double A[] = { 0.932, -0.724 };
+ double X[] = { 0.334, -0.317 };
+ int incX = -1;
+ double Y[] = { 0.348, 0.07 };
+ int incY = -1;
+ double y_expected[] = { 0.540796, -0.053628 };
+ cblas_zgemv(order, trans, M, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], dbleps, "zgemv(case 792) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], dbleps, "zgemv(case 792) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int M = 1;
+ int N = 1;
+ int lda = 1;
+ double alpha[2] = {1, 0};
+ double beta[2] = {0, 0};
+ double A[] = { 0.932, -0.724 };
+ double X[] = { 0.334, -0.317 };
+ int incX = -1;
+ double Y[] = { 0.348, 0.07 };
+ int incY = -1;
+ double y_expected[] = { 0.540796, -0.053628 };
+ cblas_zgemv(order, trans, M, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], dbleps, "zgemv(case 793) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], dbleps, "zgemv(case 793) imag");
+ };
+ };
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_ger.c b/gsl-1.9/cblas/test_ger.c
new file mode 100644
index 0000000..d81fe75
--- /dev/null
+++ b/gsl-1.9/cblas/test_ger.c
@@ -0,0 +1,283 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_ger (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ int order = 101;
+ int M = 1;
+ int N = 1;
+ int lda = 1;
+ float alpha = 1.0f;
+ float A[] = { -0.515f };
+ float X[] = { 0.611f };
+ int incX = -1;
+ float Y[] = { -0.082f };
+ int incY = -1;
+ float A_expected[] = { -0.565102f };
+ cblas_sger(order, M, N, alpha, X, incX, Y, incY, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[i], A_expected[i], flteps, "sger(case 1390)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int M = 1;
+ int N = 1;
+ int lda = 1;
+ float alpha = 1.0f;
+ float A[] = { -0.515f };
+ float X[] = { 0.611f };
+ int incX = -1;
+ float Y[] = { -0.082f };
+ int incY = -1;
+ float A_expected[] = { -0.565102f };
+ cblas_sger(order, M, N, alpha, X, incX, Y, incY, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[i], A_expected[i], flteps, "sger(case 1391)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int M = 1;
+ int N = 1;
+ int lda = 1;
+ double alpha = 1;
+ double A[] = { -0.809 };
+ double X[] = { -0.652 };
+ int incX = -1;
+ double Y[] = { 0.712 };
+ int incY = -1;
+ double A_expected[] = { -1.273224 };
+ cblas_dger(order, M, N, alpha, X, incX, Y, incY, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[i], A_expected[i], dbleps, "dger(case 1392)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int M = 1;
+ int N = 1;
+ int lda = 1;
+ double alpha = 1;
+ double A[] = { -0.809 };
+ double X[] = { -0.652 };
+ int incX = -1;
+ double Y[] = { 0.712 };
+ int incY = -1;
+ double A_expected[] = { -1.273224 };
+ cblas_dger(order, M, N, alpha, X, incX, Y, incY, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[i], A_expected[i], dbleps, "dger(case 1393)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int M = 1;
+ int N = 1;
+ int lda = 1;
+ float alpha[2] = {0.0f, 0.0f};
+ float A[] = { -0.651f, 0.856f };
+ float X[] = { -0.38f, -0.235f };
+ int incX = -1;
+ float Y[] = { -0.627f, 0.757f };
+ int incY = -1;
+ float A_expected[] = { -0.651f, 0.856f };
+ cblas_cgeru(order, M, N, alpha, X, incX, Y, incY, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[2*i], A_expected[2*i], flteps, "cgeru(case 1394) real");
+ gsl_test_rel(A[2*i+1], A_expected[2*i+1], flteps, "cgeru(case 1394) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int M = 1;
+ int N = 1;
+ int lda = 1;
+ float alpha[2] = {0.0f, 0.0f};
+ float A[] = { -0.651f, 0.856f };
+ float X[] = { -0.38f, -0.235f };
+ int incX = -1;
+ float Y[] = { -0.627f, 0.757f };
+ int incY = -1;
+ float A_expected[] = { -0.651f, 0.856f };
+ cblas_cgerc(order, M, N, alpha, X, incX, Y, incY, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[2*i], A_expected[2*i], flteps, "cgerc(case 1395) real");
+ gsl_test_rel(A[2*i+1], A_expected[2*i+1], flteps, "cgerc(case 1395) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int M = 1;
+ int N = 1;
+ int lda = 1;
+ float alpha[2] = {0.0f, 0.0f};
+ float A[] = { -0.651f, 0.856f };
+ float X[] = { -0.38f, -0.235f };
+ int incX = -1;
+ float Y[] = { -0.627f, 0.757f };
+ int incY = -1;
+ float A_expected[] = { -0.651f, 0.856f };
+ cblas_cgeru(order, M, N, alpha, X, incX, Y, incY, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[2*i], A_expected[2*i], flteps, "cgeru(case 1396) real");
+ gsl_test_rel(A[2*i+1], A_expected[2*i+1], flteps, "cgeru(case 1396) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int M = 1;
+ int N = 1;
+ int lda = 1;
+ float alpha[2] = {0.0f, 0.0f};
+ float A[] = { -0.651f, 0.856f };
+ float X[] = { -0.38f, -0.235f };
+ int incX = -1;
+ float Y[] = { -0.627f, 0.757f };
+ int incY = -1;
+ float A_expected[] = { -0.651f, 0.856f };
+ cblas_cgerc(order, M, N, alpha, X, incX, Y, incY, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[2*i], A_expected[2*i], flteps, "cgerc(case 1397) real");
+ gsl_test_rel(A[2*i+1], A_expected[2*i+1], flteps, "cgerc(case 1397) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int M = 1;
+ int N = 1;
+ int lda = 1;
+ double alpha[2] = {-1, 0};
+ double A[] = { -0.426, 0.757 };
+ double X[] = { -0.579, -0.155 };
+ int incX = -1;
+ double Y[] = { 0.831, 0.035 };
+ int incY = -1;
+ double A_expected[] = { 0.049724, 0.90607 };
+ cblas_zgeru(order, M, N, alpha, X, incX, Y, incY, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[2*i], A_expected[2*i], dbleps, "zgeru(case 1398) real");
+ gsl_test_rel(A[2*i+1], A_expected[2*i+1], dbleps, "zgeru(case 1398) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int M = 1;
+ int N = 1;
+ int lda = 1;
+ double alpha[2] = {-1, 0};
+ double A[] = { -0.426, 0.757 };
+ double X[] = { -0.579, -0.155 };
+ int incX = -1;
+ double Y[] = { 0.831, 0.035 };
+ int incY = -1;
+ double A_expected[] = { 0.060574, 0.86554 };
+ cblas_zgerc(order, M, N, alpha, X, incX, Y, incY, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[2*i], A_expected[2*i], dbleps, "zgerc(case 1399) real");
+ gsl_test_rel(A[2*i+1], A_expected[2*i+1], dbleps, "zgerc(case 1399) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int M = 1;
+ int N = 1;
+ int lda = 1;
+ double alpha[2] = {-1, 0};
+ double A[] = { -0.426, 0.757 };
+ double X[] = { -0.579, -0.155 };
+ int incX = -1;
+ double Y[] = { 0.831, 0.035 };
+ int incY = -1;
+ double A_expected[] = { 0.049724, 0.90607 };
+ cblas_zgeru(order, M, N, alpha, X, incX, Y, incY, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[2*i], A_expected[2*i], dbleps, "zgeru(case 1400) real");
+ gsl_test_rel(A[2*i+1], A_expected[2*i+1], dbleps, "zgeru(case 1400) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int M = 1;
+ int N = 1;
+ int lda = 1;
+ double alpha[2] = {-1, 0};
+ double A[] = { -0.426, 0.757 };
+ double X[] = { -0.579, -0.155 };
+ int incX = -1;
+ double Y[] = { 0.831, 0.035 };
+ int incY = -1;
+ double A_expected[] = { 0.060574, 0.86554 };
+ cblas_zgerc(order, M, N, alpha, X, incX, Y, incY, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[2*i], A_expected[2*i], dbleps, "zgerc(case 1401) real");
+ gsl_test_rel(A[2*i+1], A_expected[2*i+1], dbleps, "zgerc(case 1401) imag");
+ };
+ };
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_hbmv.c b/gsl-1.9/cblas/test_hbmv.c
new file mode 100644
index 0000000..dbf4c55
--- /dev/null
+++ b/gsl-1.9/cblas/test_hbmv.c
@@ -0,0 +1,411 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_hbmv (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ int order = 101;
+ int uplo = 121;
+ float alpha[2] = {0.0f, 1.0f};
+ float beta[2] = {-0.3f, 0.1f};
+ int N = 3;
+ int k = 1;
+ int lda = 3;
+ float A[] = { 0.937f, -0.035f, 0.339f, 0.847f, 0.022f, 0.153f, -0.785f, 0.193f, -0.731f, -0.166f, -0.243f, -0.319f, 0.173f, -0.24f, 0.079f, -0.058f, 0.124f, 0.445f };
+ float X[] = { -0.093f, -0.103f, -0.537f, -0.151f, 0.094f, 0.954f };
+ int incX = -1;
+ float Y[] = { 0.029f, -0.391f, -0.256f, 0.031f, -0.478f, 0.098f };
+ int incY = -1;
+ float y_expected[] = { 0.02698f, 0.521724f, -0.379354f, 1.27743f, -0.25427f, -0.043268f };
+ cblas_chbmv(order, uplo, N, k, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], flteps, "chbmv(case 1086) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], flteps, "chbmv(case 1086) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ float alpha[2] = {0.0f, 1.0f};
+ float beta[2] = {-0.3f, 0.1f};
+ int N = 3;
+ int k = 1;
+ int lda = 3;
+ float A[] = { 0.937f, -0.035f, 0.339f, 0.847f, 0.022f, 0.153f, -0.785f, 0.193f, -0.731f, -0.166f, -0.243f, -0.319f, 0.173f, -0.24f, 0.079f, -0.058f, 0.124f, 0.445f };
+ float X[] = { -0.093f, -0.103f, -0.537f, -0.151f, 0.094f, 0.954f };
+ int incX = -1;
+ float Y[] = { 0.029f, -0.391f, -0.256f, 0.031f, -0.478f, 0.098f };
+ int incY = -1;
+ float y_expected[] = { 0.02698f, 0.521724f, -0.379354f, 1.27743f, -0.25427f, -0.043268f };
+ cblas_chbmv(order, uplo, N, k, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], flteps, "chbmv(case 1087) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], flteps, "chbmv(case 1087) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ float alpha[2] = {0.0f, 1.0f};
+ float beta[2] = {-0.3f, 0.1f};
+ int N = 3;
+ int k = 1;
+ int lda = 3;
+ float A[] = { 0.937f, -0.035f, 0.339f, 0.847f, 0.022f, 0.153f, -0.785f, 0.193f, -0.731f, -0.166f, -0.243f, -0.319f, 0.173f, -0.24f, 0.079f, -0.058f, 0.124f, 0.445f };
+ float X[] = { -0.093f, -0.103f, -0.537f, -0.151f, 0.094f, 0.954f };
+ int incX = -1;
+ float Y[] = { 0.029f, -0.391f, -0.256f, 0.031f, -0.478f, 0.098f };
+ int incY = -1;
+ float y_expected[] = { -0.06422f, -0.016288f, 0.734206f, 0.108366f, -0.411982f, 0.347068f };
+ cblas_chbmv(order, uplo, N, k, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], flteps, "chbmv(case 1088) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], flteps, "chbmv(case 1088) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ float alpha[2] = {0.0f, 1.0f};
+ float beta[2] = {-0.3f, 0.1f};
+ int N = 3;
+ int k = 1;
+ int lda = 3;
+ float A[] = { 0.937f, -0.035f, 0.339f, 0.847f, 0.022f, 0.153f, -0.785f, 0.193f, -0.731f, -0.166f, -0.243f, -0.319f, 0.173f, -0.24f, 0.079f, -0.058f, 0.124f, 0.445f };
+ float X[] = { -0.093f, -0.103f, -0.537f, -0.151f, 0.094f, 0.954f };
+ int incX = -1;
+ float Y[] = { 0.029f, -0.391f, -0.256f, 0.031f, -0.478f, 0.098f };
+ int incY = -1;
+ float y_expected[] = { -0.06422f, -0.016288f, 0.734206f, 0.108366f, -0.411982f, 0.347068f };
+ cblas_chbmv(order, uplo, N, k, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], flteps, "chbmv(case 1089) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], flteps, "chbmv(case 1089) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ float alpha[2] = {0.0f, 1.0f};
+ float beta[2] = {-0.3f, 0.1f};
+ int N = 3;
+ int k = 1;
+ int lda = 3;
+ float A[] = { 0.937f, -0.035f, 0.339f, 0.847f, 0.022f, 0.153f, -0.785f, 0.193f, -0.731f, -0.166f, -0.243f, -0.319f, 0.173f, -0.24f, 0.079f, -0.058f, 0.124f, 0.445f };
+ float X[] = { -0.093f, -0.103f, -0.537f, -0.151f, 0.094f, 0.954f };
+ int incX = -1;
+ float Y[] = { 0.029f, -0.391f, -0.256f, 0.031f, -0.478f, 0.098f };
+ int incY = -1;
+ float y_expected[] = { 0.19354f, 0.056192f, 0.72585f, 0.42717f, -0.2047f, 0.405354f };
+ cblas_chbmv(order, uplo, N, k, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], flteps, "chbmv(case 1090) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], flteps, "chbmv(case 1090) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ float alpha[2] = {0.0f, 1.0f};
+ float beta[2] = {-0.3f, 0.1f};
+ int N = 3;
+ int k = 1;
+ int lda = 3;
+ float A[] = { 0.937f, -0.035f, 0.339f, 0.847f, 0.022f, 0.153f, -0.785f, 0.193f, -0.731f, -0.166f, -0.243f, -0.319f, 0.173f, -0.24f, 0.079f, -0.058f, 0.124f, 0.445f };
+ float X[] = { -0.093f, -0.103f, -0.537f, -0.151f, 0.094f, 0.954f };
+ int incX = -1;
+ float Y[] = { 0.029f, -0.391f, -0.256f, 0.031f, -0.478f, 0.098f };
+ int incY = -1;
+ float y_expected[] = { 0.19354f, 0.056192f, 0.72585f, 0.42717f, -0.2047f, 0.405354f };
+ cblas_chbmv(order, uplo, N, k, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], flteps, "chbmv(case 1091) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], flteps, "chbmv(case 1091) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ float alpha[2] = {0.0f, 1.0f};
+ float beta[2] = {-0.3f, 0.1f};
+ int N = 3;
+ int k = 1;
+ int lda = 3;
+ float A[] = { 0.937f, -0.035f, 0.339f, 0.847f, 0.022f, 0.153f, -0.785f, 0.193f, -0.731f, -0.166f, -0.243f, -0.319f, 0.173f, -0.24f, 0.079f, -0.058f, 0.124f, 0.445f };
+ float X[] = { -0.093f, -0.103f, -0.537f, -0.151f, 0.094f, 0.954f };
+ int incX = -1;
+ float Y[] = { 0.029f, -0.391f, -0.256f, 0.031f, -0.478f, 0.098f };
+ int incY = -1;
+ float y_expected[] = { -0.151304f, 0.471592f, -0.507714f, -0.304446f, -1.16395f, -0.299062f };
+ cblas_chbmv(order, uplo, N, k, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], flteps, "chbmv(case 1092) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], flteps, "chbmv(case 1092) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ float alpha[2] = {0.0f, 1.0f};
+ float beta[2] = {-0.3f, 0.1f};
+ int N = 3;
+ int k = 1;
+ int lda = 3;
+ float A[] = { 0.937f, -0.035f, 0.339f, 0.847f, 0.022f, 0.153f, -0.785f, 0.193f, -0.731f, -0.166f, -0.243f, -0.319f, 0.173f, -0.24f, 0.079f, -0.058f, 0.124f, 0.445f };
+ float X[] = { -0.093f, -0.103f, -0.537f, -0.151f, 0.094f, 0.954f };
+ int incX = -1;
+ float Y[] = { 0.029f, -0.391f, -0.256f, 0.031f, -0.478f, 0.098f };
+ int incY = -1;
+ float y_expected[] = { -0.151304f, 0.471592f, -0.507714f, -0.304446f, -1.16395f, -0.299062f };
+ cblas_chbmv(order, uplo, N, k, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], flteps, "chbmv(case 1093) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], flteps, "chbmv(case 1093) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ double alpha[2] = {1, 0};
+ double beta[2] = {1, 0};
+ int N = 3;
+ int k = 1;
+ int lda = 3;
+ double A[] = { 0.662, 0.24, -0.311, -0.345, -0.782, 0.904, -0.842, 0.065, -0.168, -0.855, -0.692, 0.113, 0.009, -0.707, -0.981, 0.019, -0.687, 0.861 };
+ double X[] = { 0.873, -0.509, 0.398, 0.471, 0.214, 0.878 };
+ int incX = -1;
+ double Y[] = { -0.441, -0.781, 0.979, -0.911, 0.879, 0.807 };
+ int incY = -1;
+ double y_expected[] = { -0.902712, -0.524419, -0.307439, -2.167713, 1.059385, 1.104445 };
+ cblas_zhbmv(order, uplo, N, k, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], dbleps, "zhbmv(case 1094) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], dbleps, "zhbmv(case 1094) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ double alpha[2] = {1, 0};
+ double beta[2] = {1, 0};
+ int N = 3;
+ int k = 1;
+ int lda = 3;
+ double A[] = { 0.662, 0.24, -0.311, -0.345, -0.782, 0.904, -0.842, 0.065, -0.168, -0.855, -0.692, 0.113, 0.009, -0.707, -0.981, 0.019, -0.687, 0.861 };
+ double X[] = { 0.873, -0.509, 0.398, 0.471, 0.214, 0.878 };
+ int incX = -1;
+ double Y[] = { -0.441, -0.781, 0.979, -0.911, 0.879, 0.807 };
+ int incY = -1;
+ double y_expected[] = { -0.902712, -0.524419, -0.307439, -2.167713, 1.059385, 1.104445 };
+ cblas_zhbmv(order, uplo, N, k, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], dbleps, "zhbmv(case 1095) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], dbleps, "zhbmv(case 1095) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ double alpha[2] = {1, 0};
+ double beta[2] = {1, 0};
+ int N = 3;
+ int k = 1;
+ int lda = 3;
+ double A[] = { 0.662, 0.24, -0.311, -0.345, -0.782, 0.904, -0.842, 0.065, -0.168, -0.855, -0.692, 0.113, 0.009, -0.707, -0.981, 0.019, -0.687, 0.861 };
+ double X[] = { 0.873, -0.509, 0.398, 0.471, 0.214, 0.878 };
+ int incX = -1;
+ double Y[] = { -0.441, -0.781, 0.979, -0.911, 0.879, 0.807 };
+ int incY = -1;
+ double y_expected[] = { -0.960834, -0.558818, 1.042598, -1.102864, 0.507945, 0.11149 };
+ cblas_zhbmv(order, uplo, N, k, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], dbleps, "zhbmv(case 1096) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], dbleps, "zhbmv(case 1096) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ double alpha[2] = {1, 0};
+ double beta[2] = {1, 0};
+ int N = 3;
+ int k = 1;
+ int lda = 3;
+ double A[] = { 0.662, 0.24, -0.311, -0.345, -0.782, 0.904, -0.842, 0.065, -0.168, -0.855, -0.692, 0.113, 0.009, -0.707, -0.981, 0.019, -0.687, 0.861 };
+ double X[] = { 0.873, -0.509, 0.398, 0.471, 0.214, 0.878 };
+ int incX = -1;
+ double Y[] = { -0.441, -0.781, 0.979, -0.911, 0.879, 0.807 };
+ int incY = -1;
+ double y_expected[] = { -0.960834, -0.558818, 1.042598, -1.102864, 0.507945, 0.11149 };
+ cblas_zhbmv(order, uplo, N, k, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], dbleps, "zhbmv(case 1097) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], dbleps, "zhbmv(case 1097) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ double alpha[2] = {1, 0};
+ double beta[2] = {1, 0};
+ int N = 3;
+ int k = 1;
+ int lda = 3;
+ double A[] = { 0.662, 0.24, -0.311, -0.345, -0.782, 0.904, -0.842, 0.065, -0.168, -0.855, -0.692, 0.113, 0.009, -0.707, -0.981, 0.019, -0.687, 0.861 };
+ double X[] = { 0.873, -0.509, 0.398, 0.471, 0.214, 0.878 };
+ int incX = -1;
+ double Y[] = { -0.441, -0.781, 0.979, -0.911, 0.879, 0.807 };
+ int incY = -1;
+ double y_expected[] = { -1.626828, 0.003954, 0.437012, -2.365106, 0.446715, 0.16323 };
+ cblas_zhbmv(order, uplo, N, k, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], dbleps, "zhbmv(case 1098) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], dbleps, "zhbmv(case 1098) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ double alpha[2] = {1, 0};
+ double beta[2] = {1, 0};
+ int N = 3;
+ int k = 1;
+ int lda = 3;
+ double A[] = { 0.662, 0.24, -0.311, -0.345, -0.782, 0.904, -0.842, 0.065, -0.168, -0.855, -0.692, 0.113, 0.009, -0.707, -0.981, 0.019, -0.687, 0.861 };
+ double X[] = { 0.873, -0.509, 0.398, 0.471, 0.214, 0.878 };
+ int incX = -1;
+ double Y[] = { -0.441, -0.781, 0.979, -0.911, 0.879, 0.807 };
+ int incY = -1;
+ double y_expected[] = { -1.626828, 0.003954, 0.437012, -2.365106, 0.446715, 0.16323 };
+ cblas_zhbmv(order, uplo, N, k, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], dbleps, "zhbmv(case 1099) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], dbleps, "zhbmv(case 1099) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ double alpha[2] = {1, 0};
+ double beta[2] = {1, 0};
+ int N = 3;
+ int k = 1;
+ int lda = 3;
+ double A[] = { 0.662, 0.24, -0.311, -0.345, -0.782, 0.904, -0.842, 0.065, -0.168, -0.855, -0.692, 0.113, 0.009, -0.707, -0.981, 0.019, -0.687, 0.861 };
+ double X[] = { 0.873, -0.509, 0.398, 0.471, 0.214, 0.878 };
+ int incX = -1;
+ double Y[] = { -0.441, -0.781, 0.979, -0.911, 0.879, 0.807 };
+ int incY = -1;
+ double y_expected[] = { -0.097302, -1.204999, 1.168771, -0.822543, 0.734395, 1.379065 };
+ cblas_zhbmv(order, uplo, N, k, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], dbleps, "zhbmv(case 1100) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], dbleps, "zhbmv(case 1100) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ double alpha[2] = {1, 0};
+ double beta[2] = {1, 0};
+ int N = 3;
+ int k = 1;
+ int lda = 3;
+ double A[] = { 0.662, 0.24, -0.311, -0.345, -0.782, 0.904, -0.842, 0.065, -0.168, -0.855, -0.692, 0.113, 0.009, -0.707, -0.981, 0.019, -0.687, 0.861 };
+ double X[] = { 0.873, -0.509, 0.398, 0.471, 0.214, 0.878 };
+ int incX = -1;
+ double Y[] = { -0.441, -0.781, 0.979, -0.911, 0.879, 0.807 };
+ int incY = -1;
+ double y_expected[] = { -0.097302, -1.204999, 1.168771, -0.822543, 0.734395, 1.379065 };
+ cblas_zhbmv(order, uplo, N, k, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], dbleps, "zhbmv(case 1101) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], dbleps, "zhbmv(case 1101) imag");
+ };
+ };
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_hemm.c b/gsl-1.9/cblas/test_hemm.c
new file mode 100644
index 0000000..3bc7921
--- /dev/null
+++ b/gsl-1.9/cblas/test_hemm.c
@@ -0,0 +1,427 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_hemm (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int M = 1;
+ int N = 2;
+ float alpha[2] = {0.0f, 0.1f};
+ float beta[2] = {0.0f, 0.1f};
+ float A[] = { -0.126f, 0.079f };
+ int lda = 1;
+ float B[] = { -0.954f, -0.059f, 0.296f, -0.988f };
+ int ldb = 2;
+ float C[] = { -0.859f, -0.731f, 0.737f, 0.593f };
+ int ldc = 2;
+ float C_expected[] = { 0.0723566f, -0.0738796f, -0.0717488f, 0.0699704f };
+ cblas_chemm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "chemm(case 1550) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "chemm(case 1550) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int M = 1;
+ int N = 2;
+ float alpha[2] = {0.0f, 0.1f};
+ float beta[2] = {0.0f, 0.1f};
+ float A[] = { 0.652f, 0.584f };
+ int lda = 1;
+ float B[] = { -0.983f, -0.734f, -0.422f, -0.825f };
+ int ldb = 1;
+ float C[] = { 0.387f, 0.341f, -0.734f, 0.632f };
+ int ldc = 1;
+ float C_expected[] = { 0.0137568f, -0.0253916f, -0.00941f, -0.100914f };
+ cblas_chemm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "chemm(case 1551) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "chemm(case 1551) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int M = 1;
+ int N = 2;
+ float alpha[2] = {0.0f, 1.0f};
+ float beta[2] = {-1.0f, 0.0f};
+ float A[] = { 0.78f, 0.885f, 0.507f, 0.765f, 0.911f, -0.461f, 0.707f, 0.508f };
+ int lda = 2;
+ float B[] = { -0.905f, 0.633f, 0.85f, -0.943f };
+ int ldb = 2;
+ float C[] = { 0.045f, -0.237f, 0.078f, -0.252f };
+ int ldc = 2;
+ float C_expected[] = { 0.589611f, -0.759345f, 0.960095f, -0.09013f };
+ cblas_chemm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "chemm(case 1552) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "chemm(case 1552) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int M = 1;
+ int N = 2;
+ float alpha[2] = {0.0f, 1.0f};
+ float beta[2] = {-1.0f, 0.0f};
+ float A[] = { 0.947f, 0.939f, -0.267f, -0.819f, -0.827f, -0.937f, 0.991f, 0.838f };
+ int lda = 2;
+ float B[] = { 0.871f, -0.988f, -0.232f, -0.434f };
+ int ldb = 1;
+ float C[] = { -0.261f, 0.927f, -0.351f, -0.203f };
+ int ldc = 1;
+ float C_expected[] = { 1.0551f, 0.496359f, 0.780145f, -1.67298f };
+ cblas_chemm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "chemm(case 1553) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "chemm(case 1553) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int M = 1;
+ int N = 2;
+ float alpha[2] = {-1.0f, 0.0f};
+ float beta[2] = {0.0f, 0.0f};
+ float A[] = { -0.593f, -0.9f };
+ int lda = 1;
+ float B[] = { -0.861f, 0.747f, -0.984f, 0.595f };
+ int ldb = 2;
+ float C[] = { -0.589f, -0.671f, -0.011f, -0.417f };
+ int ldc = 2;
+ float C_expected[] = { -0.510573f, 0.442971f, -0.583512f, 0.352835f };
+ cblas_chemm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "chemm(case 1554) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "chemm(case 1554) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int M = 1;
+ int N = 2;
+ float alpha[2] = {-1.0f, 0.0f};
+ float beta[2] = {0.0f, 0.0f};
+ float A[] = { -0.79f, 0.132f };
+ int lda = 1;
+ float B[] = { -0.243f, -0.12f, 0.633f, -0.556f };
+ int ldb = 1;
+ float C[] = { -0.658f, -0.74f, -0.47f, 0.481f };
+ int ldc = 1;
+ float C_expected[] = { -0.19197f, -0.0948f, 0.50007f, -0.43924f };
+ cblas_chemm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "chemm(case 1555) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "chemm(case 1555) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int M = 1;
+ int N = 2;
+ float alpha[2] = {-0.3f, 0.1f};
+ float beta[2] = {0.0f, 1.0f};
+ float A[] = { -0.114f, -0.515f, -0.513f, -0.527f, -0.995f, 0.986f, 0.229f, -0.076f };
+ int lda = 2;
+ float B[] = { 0.084f, 0.522f, 0.61f, 0.694f };
+ int ldb = 2;
+ float C[] = { 0.802f, 0.136f, -0.161f, -0.364f };
+ int ldc = 2;
+ float C_expected[] = { 0.269101f, 0.716492f, 0.237088f, 0.0290666f };
+ cblas_chemm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "chemm(case 1556) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "chemm(case 1556) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int M = 1;
+ int N = 2;
+ float alpha[2] = {-0.3f, 0.1f};
+ float beta[2] = {0.0f, 1.0f};
+ float A[] = { 0.798f, -0.324f, -0.693f, -0.893f, -0.223f, 0.749f, 0.102f, -0.357f };
+ int lda = 2;
+ float B[] = { -0.572f, -0.569f, -0.391f, -0.938f };
+ int ldb = 1;
+ float C[] = { 0.152f, -0.834f, -0.633f, -0.473f };
+ int ldc = 1;
+ float C_expected[] = { 1.08642f, -0.113853f, 0.234826f, -0.48289f };
+ cblas_chemm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "chemm(case 1557) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "chemm(case 1557) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int M = 1;
+ int N = 2;
+ double alpha[2] = {0, 0.1};
+ double beta[2] = {0, 0.1};
+ double A[] = { -0.359, 0.089 };
+ int lda = 1;
+ double B[] = { -0.451, -0.337, -0.901, -0.871 };
+ int ldb = 2;
+ double C[] = { 0.729, 0.631, 0.364, 0.246 };
+ int ldc = 2;
+ double C_expected[] = { -0.0751983, 0.0890909, -0.0558689, 0.0687459 };
+ cblas_zhemm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zhemm(case 1558) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zhemm(case 1558) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int M = 1;
+ int N = 2;
+ double alpha[2] = {0, 0.1};
+ double beta[2] = {0, 0.1};
+ double A[] = { 0.044, -0.496 };
+ int lda = 1;
+ double B[] = { -0.674, 0.281, 0.366, 0.888 };
+ int ldb = 1;
+ double C[] = { -0.9, 0.919, 0.857, -0.049 };
+ int ldc = 1;
+ double C_expected[] = { -0.0931364, -0.0929656, 0.0009928, 0.0873104 };
+ cblas_zhemm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zhemm(case 1559) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zhemm(case 1559) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int M = 1;
+ int N = 2;
+ double alpha[2] = {0, 0};
+ double beta[2] = {0, 0.1};
+ double A[] = { -0.314, 0.115, 0.114, 0.878, 0.961, -0.224, 0.973, 0.771 };
+ int lda = 2;
+ double B[] = { 0.5, -0.016, -0.5, 0.149 };
+ int ldb = 2;
+ double C[] = { -0.054, 0.064, 0.02, 0.245 };
+ int ldc = 2;
+ double C_expected[] = { -0.0064, -0.0054, -0.0245, 0.002 };
+ cblas_zhemm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zhemm(case 1560) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zhemm(case 1560) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int M = 1;
+ int N = 2;
+ double alpha[2] = {0, 0};
+ double beta[2] = {0, 0.1};
+ double A[] = { 0.186, 0.578, 0.797, -0.957, -0.539, -0.969, -0.21, 0.354 };
+ int lda = 2;
+ double B[] = { 0.641, -0.968, 0.15, -0.569 };
+ int ldb = 1;
+ double C[] = { -0.556, -0.9, 0.197, 0.31 };
+ int ldc = 1;
+ double C_expected[] = { 0.09, -0.0556, -0.031, 0.0197 };
+ cblas_zhemm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zhemm(case 1561) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zhemm(case 1561) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int M = 1;
+ int N = 2;
+ double alpha[2] = {1, 0};
+ double beta[2] = {1, 0};
+ double A[] = { 0.323, 0.641 };
+ int lda = 1;
+ double B[] = { -0.188, 0.091, -0.235, 0.523 };
+ int ldb = 2;
+ double C[] = { 0.919, 0.806, 0.823, -0.94 };
+ int ldc = 2;
+ double C_expected[] = { 0.858276, 0.835393, 0.747095, -0.771071 };
+ cblas_zhemm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zhemm(case 1562) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zhemm(case 1562) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int M = 1;
+ int N = 2;
+ double alpha[2] = {1, 0};
+ double beta[2] = {1, 0};
+ double A[] = { -0.688, 0.915 };
+ int lda = 1;
+ double B[] = { 0.914, -0.204, 0.205, -0.476 };
+ int ldb = 1;
+ double C[] = { 0.27, -0.628, -0.079, 0.507 };
+ int ldc = 1;
+ double C_expected[] = { -0.358832, -0.487648, -0.22004, 0.834488 };
+ cblas_zhemm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zhemm(case 1563) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zhemm(case 1563) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int M = 1;
+ int N = 2;
+ double alpha[2] = {0, 1};
+ double beta[2] = {0, 0.1};
+ double A[] = { 0.681, 0.574, -0.425, -0.64, 0.792, 0.661, -0.009, 0.005 };
+ int lda = 2;
+ double B[] = { -0.221, 0.554, -0.465, -0.95 };
+ int ldb = 2;
+ double C[] = { 0.331, -0.958, -0.826, -0.972 };
+ int ldc = 2;
+ double C_expected[] = { 0.778291, 0.142269, -0.496199, 0.112747 };
+ cblas_zhemm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zhemm(case 1564) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zhemm(case 1564) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int M = 1;
+ int N = 2;
+ double alpha[2] = {0, 1};
+ double beta[2] = {0, 0.1};
+ double A[] = { 0.959, 0.34, -0.23, 0.064, 0.516, -0.275, 0.714, 0.899 };
+ int lda = 2;
+ double B[] = { -0.502, -0.987, -0.134, 0.215 };
+ int ldb = 1;
+ double C[] = { 0.929, 0.181, -0.16, -0.921 };
+ int ldc = 1;
+ double C_expected[] = { 0.986459, -0.371458, -0.320548, -0.059384 };
+ cblas_zhemm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zhemm(case 1565) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zhemm(case 1565) imag");
+ };
+ };
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_hemv.c b/gsl-1.9/cblas/test_hemv.c
new file mode 100644
index 0000000..153f1f2
--- /dev/null
+++ b/gsl-1.9/cblas/test_hemv.c
@@ -0,0 +1,395 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_hemv (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ int order = 101;
+ int uplo = 121;
+ float alpha[2] = {1.0f, 0.0f};
+ float beta[2] = {-0.3f, 0.1f};
+ int N = 1;
+ int lda = 1;
+ float A[] = { -0.434f, 0.837f };
+ float X[] = { 0.209f, -0.935f };
+ int incX = -1;
+ float Y[] = { 0.346f, -0.412f };
+ int incY = -1;
+ float y_expected[] = { -0.153306f, 0.56399f };
+ cblas_chemv(order, uplo, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], flteps, "chemv(case 1070) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], flteps, "chemv(case 1070) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ float alpha[2] = {1.0f, 0.0f};
+ float beta[2] = {-0.3f, 0.1f};
+ int N = 1;
+ int lda = 1;
+ float A[] = { -0.434f, 0.837f };
+ float X[] = { 0.209f, -0.935f };
+ int incX = -1;
+ float Y[] = { 0.346f, -0.412f };
+ int incY = -1;
+ float y_expected[] = { -0.153306f, 0.56399f };
+ cblas_chemv(order, uplo, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], flteps, "chemv(case 1071) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], flteps, "chemv(case 1071) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ float alpha[2] = {1.0f, 0.0f};
+ float beta[2] = {-0.3f, 0.1f};
+ int N = 1;
+ int lda = 1;
+ float A[] = { -0.434f, 0.837f };
+ float X[] = { 0.209f, -0.935f };
+ int incX = -1;
+ float Y[] = { 0.346f, -0.412f };
+ int incY = -1;
+ float y_expected[] = { -0.153306f, 0.56399f };
+ cblas_chemv(order, uplo, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], flteps, "chemv(case 1072) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], flteps, "chemv(case 1072) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ float alpha[2] = {1.0f, 0.0f};
+ float beta[2] = {-0.3f, 0.1f};
+ int N = 1;
+ int lda = 1;
+ float A[] = { -0.434f, 0.837f };
+ float X[] = { 0.209f, -0.935f };
+ int incX = -1;
+ float Y[] = { 0.346f, -0.412f };
+ int incY = -1;
+ float y_expected[] = { -0.153306f, 0.56399f };
+ cblas_chemv(order, uplo, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], flteps, "chemv(case 1073) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], flteps, "chemv(case 1073) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ float alpha[2] = {1.0f, 0.0f};
+ float beta[2] = {-0.3f, 0.1f};
+ int N = 1;
+ int lda = 1;
+ float A[] = { -0.434f, 0.837f };
+ float X[] = { 0.209f, -0.935f };
+ int incX = -1;
+ float Y[] = { 0.346f, -0.412f };
+ int incY = -1;
+ float y_expected[] = { -0.153306f, 0.56399f };
+ cblas_chemv(order, uplo, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], flteps, "chemv(case 1074) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], flteps, "chemv(case 1074) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ float alpha[2] = {1.0f, 0.0f};
+ float beta[2] = {-0.3f, 0.1f};
+ int N = 1;
+ int lda = 1;
+ float A[] = { -0.434f, 0.837f };
+ float X[] = { 0.209f, -0.935f };
+ int incX = -1;
+ float Y[] = { 0.346f, -0.412f };
+ int incY = -1;
+ float y_expected[] = { -0.153306f, 0.56399f };
+ cblas_chemv(order, uplo, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], flteps, "chemv(case 1075) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], flteps, "chemv(case 1075) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ float alpha[2] = {1.0f, 0.0f};
+ float beta[2] = {-0.3f, 0.1f};
+ int N = 1;
+ int lda = 1;
+ float A[] = { -0.434f, 0.837f };
+ float X[] = { 0.209f, -0.935f };
+ int incX = -1;
+ float Y[] = { 0.346f, -0.412f };
+ int incY = -1;
+ float y_expected[] = { -0.153306f, 0.56399f };
+ cblas_chemv(order, uplo, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], flteps, "chemv(case 1076) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], flteps, "chemv(case 1076) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ float alpha[2] = {1.0f, 0.0f};
+ float beta[2] = {-0.3f, 0.1f};
+ int N = 1;
+ int lda = 1;
+ float A[] = { -0.434f, 0.837f };
+ float X[] = { 0.209f, -0.935f };
+ int incX = -1;
+ float Y[] = { 0.346f, -0.412f };
+ int incY = -1;
+ float y_expected[] = { -0.153306f, 0.56399f };
+ cblas_chemv(order, uplo, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], flteps, "chemv(case 1077) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], flteps, "chemv(case 1077) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ double alpha[2] = {0, 0};
+ double beta[2] = {1, 0};
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.036, -0.966 };
+ double X[] = { -0.695, 0.886 };
+ int incX = -1;
+ double Y[] = { 0.486, 0.629 };
+ int incY = -1;
+ double y_expected[] = { 0.486, 0.629 };
+ cblas_zhemv(order, uplo, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], dbleps, "zhemv(case 1078) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], dbleps, "zhemv(case 1078) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ double alpha[2] = {0, 0};
+ double beta[2] = {1, 0};
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.036, -0.966 };
+ double X[] = { -0.695, 0.886 };
+ int incX = -1;
+ double Y[] = { 0.486, 0.629 };
+ int incY = -1;
+ double y_expected[] = { 0.486, 0.629 };
+ cblas_zhemv(order, uplo, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], dbleps, "zhemv(case 1079) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], dbleps, "zhemv(case 1079) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ double alpha[2] = {0, 0};
+ double beta[2] = {1, 0};
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.036, -0.966 };
+ double X[] = { -0.695, 0.886 };
+ int incX = -1;
+ double Y[] = { 0.486, 0.629 };
+ int incY = -1;
+ double y_expected[] = { 0.486, 0.629 };
+ cblas_zhemv(order, uplo, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], dbleps, "zhemv(case 1080) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], dbleps, "zhemv(case 1080) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ double alpha[2] = {0, 0};
+ double beta[2] = {1, 0};
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.036, -0.966 };
+ double X[] = { -0.695, 0.886 };
+ int incX = -1;
+ double Y[] = { 0.486, 0.629 };
+ int incY = -1;
+ double y_expected[] = { 0.486, 0.629 };
+ cblas_zhemv(order, uplo, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], dbleps, "zhemv(case 1081) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], dbleps, "zhemv(case 1081) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ double alpha[2] = {0, 0};
+ double beta[2] = {1, 0};
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.036, -0.966 };
+ double X[] = { -0.695, 0.886 };
+ int incX = -1;
+ double Y[] = { 0.486, 0.629 };
+ int incY = -1;
+ double y_expected[] = { 0.486, 0.629 };
+ cblas_zhemv(order, uplo, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], dbleps, "zhemv(case 1082) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], dbleps, "zhemv(case 1082) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ double alpha[2] = {0, 0};
+ double beta[2] = {1, 0};
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.036, -0.966 };
+ double X[] = { -0.695, 0.886 };
+ int incX = -1;
+ double Y[] = { 0.486, 0.629 };
+ int incY = -1;
+ double y_expected[] = { 0.486, 0.629 };
+ cblas_zhemv(order, uplo, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], dbleps, "zhemv(case 1083) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], dbleps, "zhemv(case 1083) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ double alpha[2] = {0, 0};
+ double beta[2] = {1, 0};
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.036, -0.966 };
+ double X[] = { -0.695, 0.886 };
+ int incX = -1;
+ double Y[] = { 0.486, 0.629 };
+ int incY = -1;
+ double y_expected[] = { 0.486, 0.629 };
+ cblas_zhemv(order, uplo, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], dbleps, "zhemv(case 1084) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], dbleps, "zhemv(case 1084) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ double alpha[2] = {0, 0};
+ double beta[2] = {1, 0};
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.036, -0.966 };
+ double X[] = { -0.695, 0.886 };
+ int incX = -1;
+ double Y[] = { 0.486, 0.629 };
+ int incY = -1;
+ double y_expected[] = { 0.486, 0.629 };
+ cblas_zhemv(order, uplo, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], dbleps, "zhemv(case 1085) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], dbleps, "zhemv(case 1085) imag");
+ };
+ };
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_her.c b/gsl-1.9/cblas/test_her.c
new file mode 100644
index 0000000..d1478f8
--- /dev/null
+++ b/gsl-1.9/cblas/test_her.c
@@ -0,0 +1,179 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_her (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ int order = 101;
+ int uplo = 121;
+ int N = 1;
+ int lda = 1;
+ float alpha = 1.0f;
+ float A[] = { 0.188f, 0.856f };
+ float X[] = { -0.832f, -0.151f };
+ int incX = -1;
+ float A_expected[] = { 0.903025f, 0.0f };
+ cblas_cher(order, uplo, N, alpha, X, incX, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[2*i], A_expected[2*i], flteps, "cher(case 1410) real");
+ gsl_test_rel(A[2*i+1], A_expected[2*i+1], flteps, "cher(case 1410) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ int N = 1;
+ int lda = 1;
+ float alpha = 1.0f;
+ float A[] = { 0.188f, 0.856f };
+ float X[] = { -0.832f, -0.151f };
+ int incX = -1;
+ float A_expected[] = { 0.903025f, 0.0f };
+ cblas_cher(order, uplo, N, alpha, X, incX, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[2*i], A_expected[2*i], flteps, "cher(case 1411) real");
+ gsl_test_rel(A[2*i+1], A_expected[2*i+1], flteps, "cher(case 1411) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ int N = 1;
+ int lda = 1;
+ float alpha = 1.0f;
+ float A[] = { 0.188f, 0.856f };
+ float X[] = { -0.832f, -0.151f };
+ int incX = -1;
+ float A_expected[] = { 0.903025f, 0.0f };
+ cblas_cher(order, uplo, N, alpha, X, incX, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[2*i], A_expected[2*i], flteps, "cher(case 1412) real");
+ gsl_test_rel(A[2*i+1], A_expected[2*i+1], flteps, "cher(case 1412) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ int N = 1;
+ int lda = 1;
+ float alpha = 1.0f;
+ float A[] = { 0.188f, 0.856f };
+ float X[] = { -0.832f, -0.151f };
+ int incX = -1;
+ float A_expected[] = { 0.903025f, 0.0f };
+ cblas_cher(order, uplo, N, alpha, X, incX, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[2*i], A_expected[2*i], flteps, "cher(case 1413) real");
+ gsl_test_rel(A[2*i+1], A_expected[2*i+1], flteps, "cher(case 1413) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ int N = 1;
+ int lda = 1;
+ double alpha = 0.1;
+ double A[] = { 0.257, 0.326 };
+ double X[] = { 0.319, -0.009 };
+ int incX = -1;
+ double A_expected[] = { 0.2671842, 0.0 };
+ cblas_zher(order, uplo, N, alpha, X, incX, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[2*i], A_expected[2*i], dbleps, "zher(case 1414) real");
+ gsl_test_rel(A[2*i+1], A_expected[2*i+1], dbleps, "zher(case 1414) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ int N = 1;
+ int lda = 1;
+ double alpha = 0.1;
+ double A[] = { 0.257, 0.326 };
+ double X[] = { 0.319, -0.009 };
+ int incX = -1;
+ double A_expected[] = { 0.2671842, 0.0 };
+ cblas_zher(order, uplo, N, alpha, X, incX, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[2*i], A_expected[2*i], dbleps, "zher(case 1415) real");
+ gsl_test_rel(A[2*i+1], A_expected[2*i+1], dbleps, "zher(case 1415) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ int N = 1;
+ int lda = 1;
+ double alpha = 0.1;
+ double A[] = { 0.257, 0.326 };
+ double X[] = { 0.319, -0.009 };
+ int incX = -1;
+ double A_expected[] = { 0.2671842, 0.0 };
+ cblas_zher(order, uplo, N, alpha, X, incX, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[2*i], A_expected[2*i], dbleps, "zher(case 1416) real");
+ gsl_test_rel(A[2*i+1], A_expected[2*i+1], dbleps, "zher(case 1416) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ int N = 1;
+ int lda = 1;
+ double alpha = 0.1;
+ double A[] = { 0.257, 0.326 };
+ double X[] = { 0.319, -0.009 };
+ int incX = -1;
+ double A_expected[] = { 0.2671842, 0.0 };
+ cblas_zher(order, uplo, N, alpha, X, incX, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[2*i], A_expected[2*i], dbleps, "zher(case 1417) real");
+ gsl_test_rel(A[2*i+1], A_expected[2*i+1], dbleps, "zher(case 1417) imag");
+ };
+ };
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_her2.c b/gsl-1.9/cblas/test_her2.c
new file mode 100644
index 0000000..b1a0fae
--- /dev/null
+++ b/gsl-1.9/cblas/test_her2.c
@@ -0,0 +1,195 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_her2 (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ int order = 101;
+ int uplo = 121;
+ int N = 1;
+ int lda = 1;
+ float alpha[2] = {-1.0f, 0.0f};
+ float A[] = { -0.821f, 0.954f };
+ float X[] = { 0.532f, 0.802f };
+ int incX = -1;
+ float Y[] = { 0.016f, -0.334f };
+ int incY = -1;
+ float A_expected[] = { -0.302288f, 0.0f };
+ cblas_cher2(order, uplo, N, alpha, X, incX, Y, incY, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[2*i], A_expected[2*i], flteps, "cher2(case 1450) real");
+ gsl_test_rel(A[2*i+1], A_expected[2*i+1], flteps, "cher2(case 1450) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ int N = 1;
+ int lda = 1;
+ float alpha[2] = {-1.0f, 0.0f};
+ float A[] = { -0.821f, 0.954f };
+ float X[] = { 0.532f, 0.802f };
+ int incX = -1;
+ float Y[] = { 0.016f, -0.334f };
+ int incY = -1;
+ float A_expected[] = { -0.302288f, 0.0f };
+ cblas_cher2(order, uplo, N, alpha, X, incX, Y, incY, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[2*i], A_expected[2*i], flteps, "cher2(case 1451) real");
+ gsl_test_rel(A[2*i+1], A_expected[2*i+1], flteps, "cher2(case 1451) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ int N = 1;
+ int lda = 1;
+ float alpha[2] = {-1.0f, 0.0f};
+ float A[] = { -0.821f, 0.954f };
+ float X[] = { 0.532f, 0.802f };
+ int incX = -1;
+ float Y[] = { 0.016f, -0.334f };
+ int incY = -1;
+ float A_expected[] = { -0.302288f, 0.0f };
+ cblas_cher2(order, uplo, N, alpha, X, incX, Y, incY, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[2*i], A_expected[2*i], flteps, "cher2(case 1452) real");
+ gsl_test_rel(A[2*i+1], A_expected[2*i+1], flteps, "cher2(case 1452) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ int N = 1;
+ int lda = 1;
+ float alpha[2] = {-1.0f, 0.0f};
+ float A[] = { -0.821f, 0.954f };
+ float X[] = { 0.532f, 0.802f };
+ int incX = -1;
+ float Y[] = { 0.016f, -0.334f };
+ int incY = -1;
+ float A_expected[] = { -0.302288f, 0.0f };
+ cblas_cher2(order, uplo, N, alpha, X, incX, Y, incY, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[2*i], A_expected[2*i], flteps, "cher2(case 1453) real");
+ gsl_test_rel(A[2*i+1], A_expected[2*i+1], flteps, "cher2(case 1453) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ int N = 1;
+ int lda = 1;
+ double alpha[2] = {-0.3, 0.1};
+ double A[] = { -0.334, 0.286 };
+ double X[] = { -0.14, -0.135 };
+ int incX = -1;
+ double Y[] = { 0.455, 0.358 };
+ int incY = -1;
+ double A_expected[] = { -0.264521, 0.0 };
+ cblas_zher2(order, uplo, N, alpha, X, incX, Y, incY, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[2*i], A_expected[2*i], dbleps, "zher2(case 1454) real");
+ gsl_test_rel(A[2*i+1], A_expected[2*i+1], dbleps, "zher2(case 1454) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ int N = 1;
+ int lda = 1;
+ double alpha[2] = {-0.3, 0.1};
+ double A[] = { -0.334, 0.286 };
+ double X[] = { -0.14, -0.135 };
+ int incX = -1;
+ double Y[] = { 0.455, 0.358 };
+ int incY = -1;
+ double A_expected[] = { -0.264521, 0.0 };
+ cblas_zher2(order, uplo, N, alpha, X, incX, Y, incY, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[2*i], A_expected[2*i], dbleps, "zher2(case 1455) real");
+ gsl_test_rel(A[2*i+1], A_expected[2*i+1], dbleps, "zher2(case 1455) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ int N = 1;
+ int lda = 1;
+ double alpha[2] = {-0.3, 0.1};
+ double A[] = { -0.334, 0.286 };
+ double X[] = { -0.14, -0.135 };
+ int incX = -1;
+ double Y[] = { 0.455, 0.358 };
+ int incY = -1;
+ double A_expected[] = { -0.264521, 0.0 };
+ cblas_zher2(order, uplo, N, alpha, X, incX, Y, incY, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[2*i], A_expected[2*i], dbleps, "zher2(case 1456) real");
+ gsl_test_rel(A[2*i+1], A_expected[2*i+1], dbleps, "zher2(case 1456) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ int N = 1;
+ int lda = 1;
+ double alpha[2] = {-0.3, 0.1};
+ double A[] = { -0.334, 0.286 };
+ double X[] = { -0.14, -0.135 };
+ int incX = -1;
+ double Y[] = { 0.455, 0.358 };
+ int incY = -1;
+ double A_expected[] = { -0.264521, 0.0 };
+ cblas_zher2(order, uplo, N, alpha, X, incX, Y, incY, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[2*i], A_expected[2*i], dbleps, "zher2(case 1457) real");
+ gsl_test_rel(A[2*i+1], A_expected[2*i+1], dbleps, "zher2(case 1457) imag");
+ };
+ };
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_her2k.c b/gsl-1.9/cblas/test_her2k.c
new file mode 100644
index 0000000..9c20962
--- /dev/null
+++ b/gsl-1.9/cblas/test_her2k.c
@@ -0,0 +1,427 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_her2k (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ int order = 101;
+ int uplo = 121;
+ int trans = 111;
+ int N = 1;
+ int K = 2;
+ float alpha[2] = {-1.0f, 0.0f};
+ float beta = -0.3f;
+ float A[] = { 0.178f, 0.545f, -0.491f, 0.979f };
+ int lda = 2;
+ float B[] = { -0.665f, -0.531f, -0.4f, 0.227f };
+ int ldb = 2;
+ float C[] = { 0.115f, -0.193f };
+ int ldc = 1;
+ float C_expected[] = { -0.056236f, 0.0f };
+ cblas_cher2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "cher2k(case 1646) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "cher2k(case 1646) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ int trans = 111;
+ int N = 1;
+ int K = 2;
+ float alpha[2] = {-1.0f, 0.0f};
+ float beta = -0.3f;
+ float A[] = { -0.808f, 0.447f, 0.145f, -0.226f };
+ int lda = 2;
+ float B[] = { -0.413f, 0.904f, -0.585f, 0.717f };
+ int ldb = 2;
+ float C[] = { -0.725f, -0.244f };
+ int ldc = 1;
+ float C_expected[] = { -0.76435f, 0.0f };
+ cblas_cher2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "cher2k(case 1647) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "cher2k(case 1647) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ int trans = 111;
+ int N = 1;
+ int K = 2;
+ float alpha[2] = {-1.0f, 0.0f};
+ float beta = -0.3f;
+ float A[] = { 0.337f, -0.737f, -0.993f, 0.69f };
+ int lda = 1;
+ float B[] = { -0.39f, -0.836f, -0.32f, 0.368f };
+ int ldb = 1;
+ float C[] = { 0.844f, -0.763f };
+ int ldc = 1;
+ float C_expected[] = { -2.36596f, 0.0f };
+ cblas_cher2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "cher2k(case 1648) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "cher2k(case 1648) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ int trans = 111;
+ int N = 1;
+ int K = 2;
+ float alpha[2] = {-1.0f, 0.0f};
+ float beta = -0.3f;
+ float A[] = { 0.386f, -0.465f, 0.719f, -0.378f };
+ int lda = 1;
+ float B[] = { 0.099f, -0.879f, 0.864f, 0.141f };
+ int ldb = 1;
+ float C[] = { -0.599f, -0.47f };
+ int ldc = 1;
+ float C_expected[] = { -1.85003f, 0.0f };
+ cblas_cher2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "cher2k(case 1649) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "cher2k(case 1649) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ int trans = 113;
+ int N = 1;
+ int K = 2;
+ float alpha[2] = {0.0f, 1.0f};
+ float beta = -1.0f;
+ float A[] = { 0.128f, 0.431f, -0.26f, 0.75f };
+ int lda = 1;
+ float B[] = { 0.276f, 0.058f, 0.904f, -0.116f };
+ int ldb = 1;
+ float C[] = { 0.914f, -0.262f };
+ int ldc = 1;
+ float C_expected[] = { 0.604744f, 0.0f };
+ cblas_cher2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "cher2k(case 1650) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "cher2k(case 1650) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ int trans = 113;
+ int N = 1;
+ int K = 2;
+ float alpha[2] = {0.0f, 1.0f};
+ float beta = -1.0f;
+ float A[] = { 0.72f, 0.783f, -0.737f, 0.375f };
+ int lda = 1;
+ float B[] = { 0.531f, 0.167f, 0.203f, -0.221f };
+ int ldb = 1;
+ float C[] = { 0.618f, 0.392f };
+ int ldc = 1;
+ float C_expected[] = { -0.200438f, 0.0f };
+ cblas_cher2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "cher2k(case 1651) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "cher2k(case 1651) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ int trans = 113;
+ int N = 1;
+ int K = 2;
+ float alpha[2] = {0.0f, 1.0f};
+ float beta = -1.0f;
+ float A[] = { -0.372f, -0.735f, -0.711f, 0.051f };
+ int lda = 2;
+ float B[] = { 0.257f, 0.097f, 0.338f, -0.484f };
+ int ldb = 2;
+ float C[] = { -0.142f, -0.197f };
+ int ldc = 1;
+ float C_expected[] = { -0.817394f, 0.0f };
+ cblas_cher2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "cher2k(case 1652) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "cher2k(case 1652) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ int trans = 113;
+ int N = 1;
+ int K = 2;
+ float alpha[2] = {0.0f, 1.0f};
+ float beta = -1.0f;
+ float A[] = { 0.1f, -0.878f, 0.28f, -0.381f };
+ int lda = 2;
+ float B[] = { -0.208f, 0.309f, -0.276f, 0.123f };
+ int ldb = 2;
+ float C[] = { 0.483f, -0.541f };
+ int ldc = 1;
+ float C_expected[] = { -0.03812f, 0.0f };
+ cblas_cher2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "cher2k(case 1653) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "cher2k(case 1653) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ int trans = 111;
+ int N = 1;
+ int K = 2;
+ double alpha[2] = {1, 0};
+ double beta = 1;
+ double A[] = { 0.515, -0.034, 0.067, 0.66 };
+ int lda = 2;
+ double B[] = { 0.408, -0.85, -0.945, -0.799 };
+ int ldb = 2;
+ double C[] = { -0.918, -0.985 };
+ int ldc = 1;
+ double C_expected[] = { -1.62127, 0.0 };
+ cblas_zher2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zher2k(case 1654) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zher2k(case 1654) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ int trans = 111;
+ int N = 1;
+ int K = 2;
+ double alpha[2] = {1, 0};
+ double beta = 1;
+ double A[] = { -0.009, 0.495, -0.008, -0.973 };
+ int lda = 2;
+ double B[] = { -0.239, -0.373, -0.032, -0.539 };
+ int ldb = 2;
+ double C[] = { 0.443, -0.245 };
+ int ldc = 1;
+ double C_expected[] = { 1.127438, 0.0 };
+ cblas_zher2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zher2k(case 1655) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zher2k(case 1655) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ int trans = 111;
+ int N = 1;
+ int K = 2;
+ double alpha[2] = {1, 0};
+ double beta = 1;
+ double A[] = { 0.531, 0.721, -0.848, 0.826 };
+ int lda = 1;
+ double B[] = { -0.711, -0.2, -0.92, -0.676 };
+ int ldb = 1;
+ double C[] = { -0.447, 0.701 };
+ int ldc = 1;
+ double C_expected[] = { -1.046914, 0.0 };
+ cblas_zher2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zher2k(case 1656) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zher2k(case 1656) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ int trans = 111;
+ int N = 1;
+ int K = 2;
+ double alpha[2] = {1, 0};
+ double beta = 1;
+ double A[] = { 0.68, 0.079, 0.837, -0.814 };
+ int lda = 1;
+ double B[] = { -0.986, 0.024, 0.584, -0.248 };
+ int ldb = 1;
+ double C[] = { 0.477, -0.551 };
+ int ldc = 1;
+ double C_expected[] = { 0.521192, 0.0 };
+ cblas_zher2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zher2k(case 1657) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zher2k(case 1657) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ int trans = 113;
+ int N = 1;
+ int K = 2;
+ double alpha[2] = {-1, 0};
+ double beta = 0.1;
+ double A[] = { -0.63, 0.787, 0.426, -0.568 };
+ int lda = 1;
+ double B[] = { -0.228, 0.302, 0.83, 0.023 };
+ int ldb = 1;
+ double C[] = { 0.354, -0.85 };
+ int ldc = 1;
+ double C_expected[] = { -1.40826, 0.0 };
+ cblas_zher2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zher2k(case 1658) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zher2k(case 1658) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ int trans = 113;
+ int N = 1;
+ int K = 2;
+ double alpha[2] = {-1, 0};
+ double beta = 0.1;
+ double A[] = { 0.224, -0.191, 0.46, 0.464 };
+ int lda = 1;
+ double B[] = { -0.815, 0.634, 0.066, -0.873 };
+ int ldb = 1;
+ double C[] = { -0.49, -0.606 };
+ int ldc = 1;
+ double C_expected[] = { 1.307732, 0.0 };
+ cblas_zher2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zher2k(case 1659) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zher2k(case 1659) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ int trans = 113;
+ int N = 1;
+ int K = 2;
+ double alpha[2] = {-1, 0};
+ double beta = 0.1;
+ double A[] = { 0.943, 0.075, 0.15, -0.141 };
+ int lda = 2;
+ double B[] = { -0.962, 0.422, -0.592, -0.789 };
+ int ldb = 2;
+ double C[] = { 0.728, 0.601 };
+ int ldc = 1;
+ double C_expected[] = { 1.778934, 0.0 };
+ cblas_zher2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zher2k(case 1660) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zher2k(case 1660) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ int trans = 113;
+ int N = 1;
+ int K = 2;
+ double alpha[2] = {-1, 0};
+ double beta = 0.1;
+ double A[] = { -0.93, -0.386, 0.565, 0.141 };
+ int lda = 2;
+ double B[] = { -0.801, 0.022, 0.558, -0.932 };
+ int ldb = 2;
+ double C[] = { 0.068, 0.501 };
+ int ldc = 1;
+ double C_expected[] = { -1.833792, 0.0 };
+ cblas_zher2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zher2k(case 1661) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zher2k(case 1661) imag");
+ };
+ };
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_herk.c b/gsl-1.9/cblas/test_herk.c
new file mode 100644
index 0000000..e245553
--- /dev/null
+++ b/gsl-1.9/cblas/test_herk.c
@@ -0,0 +1,395 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_herk (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ int order = 101;
+ int uplo = 121;
+ int trans = 111;
+ int N = 2;
+ int K = 1;
+ float alpha = 0.0f;
+ float beta = 0.1f;
+ float A[] = { -0.617f, 0.179f, -0.626f, 0.334f };
+ int lda = 1;
+ float C[] = { 0.346f, -0.903f, 0.022f, -0.839f, -0.715f, 0.049f, -0.338f, 0.149f };
+ int ldc = 2;
+ float C_expected[] = { 0.0346f, 0.0f, 0.0022f, -0.0839f, -0.715f, 0.049f, -0.0338f, 0.0f };
+ cblas_cherk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "cherk(case 1598) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "cherk(case 1598) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ int trans = 111;
+ int N = 2;
+ int K = 1;
+ float alpha = 0.0f;
+ float beta = 0.1f;
+ float A[] = { -0.356f, -0.308f, 0.493f, -0.351f };
+ int lda = 2;
+ float C[] = { -0.898f, -0.905f, 0.002f, -0.219f, 0.881f, 0.879f, 0.275f, -0.351f };
+ int ldc = 2;
+ float C_expected[] = { -0.0898f, 0.0f, 0.002f, -0.219f, 0.0881f, 0.0879f, 0.0275f, 0.0f };
+ cblas_cherk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "cherk(case 1599) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "cherk(case 1599) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ int trans = 113;
+ int N = 2;
+ int K = 1;
+ float alpha = 0.1f;
+ float beta = 1.0f;
+ float A[] = { -0.103f, -0.951f, -0.601f, -0.041f };
+ int lda = 2;
+ float C[] = { -0.918f, -0.018f, 0.991f, -0.789f, -0.698f, -0.067f, 0.956f, -0.599f };
+ int ldc = 2;
+ float C_expected[] = { -0.826499f, 0.0f, 1.00109f, -0.845733f, -0.698f, -0.067f, 0.992288f, 0.0f };
+ cblas_cherk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "cherk(case 1600) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "cherk(case 1600) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ int trans = 113;
+ int N = 2;
+ int K = 1;
+ float alpha = 0.1f;
+ float beta = 1.0f;
+ float A[] = { -0.237f, 0.925f, -0.904f, -0.091f };
+ int lda = 1;
+ float C[] = { -0.572f, 0.915f, 0.398f, 0.222f, 0.016f, 0.288f, -0.078f, -0.507f };
+ int ldc = 2;
+ float C_expected[] = { -0.480821f, 0.0f, 0.398f, 0.222f, 0.0290073f, 0.373777f, 0.0045497f, 0.0f };
+ cblas_cherk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "cherk(case 1601) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "cherk(case 1601) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ int trans = 111;
+ int N = 2;
+ int K = 1;
+ float alpha = -0.3f;
+ float beta = 0.0f;
+ float A[] = { 0.963f, -0.23f, -0.435f, 0.289f };
+ int lda = 1;
+ float C[] = { 0.282f, -0.272f, -0.516f, -0.594f, -0.001f, 0.155f, -0.39f, -0.354f };
+ int ldc = 2;
+ float C_expected[] = { -0.294081f, 0.0f, -0.516f, -0.594f, 0.145613f, -0.0534771f, -0.0818238f, 0.0f };
+ cblas_cherk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "cherk(case 1602) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "cherk(case 1602) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ int trans = 111;
+ int N = 2;
+ int K = 1;
+ float alpha = -0.3f;
+ float beta = 0.0f;
+ float A[] = { 0.674f, 0.1f, -0.098f, 0.552f };
+ int lda = 2;
+ float C[] = { 0.089f, -0.523f, -0.551f, 0.618f, 0.67f, 0.247f, 0.975f, -0.714f };
+ int ldc = 2;
+ float C_expected[] = { -0.139283f, 0.0f, 0.0032556f, -0.114554f, 0.67f, 0.247f, -0.0942924f, 0.0f };
+ cblas_cherk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "cherk(case 1603) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "cherk(case 1603) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ int trans = 113;
+ int N = 2;
+ int K = 1;
+ float alpha = 1.0f;
+ float beta = 0.1f;
+ float A[] = { 0.033f, -0.864f, 0.168f, 0.524f };
+ int lda = 2;
+ float C[] = { 0.788f, 0.016f, -0.436f, 0.749f, -0.89f, -0.87f, 0.421f, -0.203f };
+ int ldc = 2;
+ float C_expected[] = { 0.826385f, 0.0f, -0.436f, 0.749f, -0.536192f, -0.249444f, 0.3449f, 0.0f };
+ cblas_cherk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "cherk(case 1604) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "cherk(case 1604) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ int trans = 113;
+ int N = 2;
+ int K = 1;
+ float alpha = 1.0f;
+ float beta = 0.1f;
+ float A[] = { 0.957f, -0.079f, 0.935f, 0.232f };
+ int lda = 1;
+ float C[] = { -0.744f, -0.061f, 0.195f, -0.574f, 0.551f, 0.478f, -0.337f, 0.1f };
+ int ldc = 2;
+ float C_expected[] = { 0.84769f, 0.0f, 0.895967f, -0.353289f, 0.551f, 0.478f, 0.894349f, 0.0f };
+ cblas_cherk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "cherk(case 1605) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "cherk(case 1605) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ int trans = 111;
+ int N = 2;
+ int K = 1;
+ double alpha = 1;
+ double beta = 1;
+ double A[] = { 0.934, 0.664, 0.426, 0.263 };
+ int lda = 1;
+ double C[] = { 0.251, -0.97, 0.76, -0.349, 0.152, -0.899, -0.17, 0.707 };
+ int ldc = 2;
+ double C_expected[] = { 1.564252, 0.0, 1.332516, -0.311778, 0.152, -0.899, 0.080645, 0.0 };
+ cblas_zherk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zherk(case 1606) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zherk(case 1606) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ int trans = 111;
+ int N = 2;
+ int K = 1;
+ double alpha = 1;
+ double beta = 1;
+ double A[] = { 0.16, 0.464, -0.623, 0.776 };
+ int lda = 2;
+ double C[] = { 0.771, -0.449, 0.776, 0.112, -0.134, 0.317, 0.547, -0.551 };
+ int ldc = 2;
+ double C_expected[] = { 1.011896, 0.0, 0.776, 0.112, 0.126384, -0.096232, 1.537305, 0.0 };
+ cblas_zherk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zherk(case 1607) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zherk(case 1607) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ int trans = 113;
+ int N = 2;
+ int K = 1;
+ double alpha = 0.1;
+ double beta = 1;
+ double A[] = { 0.787, 0.057, -0.49, 0.47 };
+ int lda = 2;
+ double C[] = { -0.758, 0.912, 0.992, -0.356, 0.584, 0.806, 0.965, 0.674 };
+ int ldc = 2;
+ double C_expected[] = { -0.6957382, 0.0, 0.956116, -0.316218, 0.584, 0.806, 1.0111, 0.0 };
+ cblas_zherk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zherk(case 1608) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zherk(case 1608) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ int trans = 113;
+ int N = 2;
+ int K = 1;
+ double alpha = 0.1;
+ double beta = 1;
+ double A[] = { 0.961, -0.384, 0.165, 0.395 };
+ int lda = 1;
+ double C[] = { -0.186, 0.404, -0.873, 0.09, -0.451, -0.972, -0.203, -0.304 };
+ int ldc = 2;
+ double C_expected[] = { -0.0789023, 0.0, -0.873, 0.09, -0.4503115, -0.9277045, -0.184675, 0.0 };
+ cblas_zherk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zherk(case 1609) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zherk(case 1609) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ int trans = 111;
+ int N = 2;
+ int K = 1;
+ double alpha = 0;
+ double beta = -0.3;
+ double A[] = { 0.04, 0.608, 0.21, -0.44 };
+ int lda = 1;
+ double C[] = { 0.285, -0.943, 0.581, -0.56, 0.112, 0.529, 0.16, -0.913 };
+ int ldc = 2;
+ double C_expected[] = { -0.0855, 0.0, 0.581, -0.56, -0.0336, -0.1587, -0.048, 0.0 };
+ cblas_zherk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zherk(case 1610) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zherk(case 1610) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ int trans = 111;
+ int N = 2;
+ int K = 1;
+ double alpha = 0;
+ double beta = -0.3;
+ double A[] = { -0.984, -0.398, -0.379, 0.919 };
+ int lda = 2;
+ double C[] = { -0.44, -0.087, 0.156, -0.945, -0.943, -0.355, 0.577, 0.053 };
+ int ldc = 2;
+ double C_expected[] = { 0.132, 0.0, -0.0468, 0.2835, -0.943, -0.355, -0.1731, 0.0 };
+ cblas_zherk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zherk(case 1611) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zherk(case 1611) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ int trans = 113;
+ int N = 2;
+ int K = 1;
+ double alpha = 1;
+ double beta = -1;
+ double A[] = { 0.269, -0.428, -0.029, 0.964 };
+ int lda = 2;
+ double C[] = { 0.473, -0.932, -0.689, -0.072, -0.952, -0.862, 0.001, 0.282 };
+ int ldc = 2;
+ double C_expected[] = { -0.217455, 0.0, -0.689, -0.072, 0.531607, 0.615096, 0.929137, 0.0 };
+ cblas_zherk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zherk(case 1612) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zherk(case 1612) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ int trans = 113;
+ int N = 2;
+ int K = 1;
+ double alpha = 1;
+ double beta = -1;
+ double A[] = { -0.303, -0.037, -0.411, -0.243 };
+ int lda = 1;
+ double C[] = { 0.652, -0.227, -0.849, 0.87, -0.051, -0.535, 0.418, -0.681 };
+ int ldc = 2;
+ double C_expected[] = { -0.558822, 0.0, 0.982524, -0.928422, -0.051, -0.535, -0.19003, 0.0 };
+ cblas_zherk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zherk(case 1613) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zherk(case 1613) imag");
+ };
+ };
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_hpmv.c b/gsl-1.9/cblas/test_hpmv.c
new file mode 100644
index 0000000..a043aad
--- /dev/null
+++ b/gsl-1.9/cblas/test_hpmv.c
@@ -0,0 +1,379 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_hpmv (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ int order = 101;
+ int uplo = 121;
+ float alpha[2] = {-0.3f, 0.1f};
+ float beta[2] = {0.0f, 1.0f};
+ int N = 2;
+ float A[] = { 0.339f, -0.102f, 0.908f, 0.097f, -0.808f, 0.236f };
+ float X[] = { 0.993f, -0.502f, -0.653f, 0.796f };
+ int incX = -1;
+ float Y[] = { -0.35f, 0.339f, -0.269f, -0.122f };
+ int incY = -1;
+ float y_expected[] = { -0.0627557f, -0.839323f, -0.0877262f, -0.169208f };
+ cblas_chpmv(order, uplo, N, alpha, A, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], flteps, "chpmv(case 1118) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], flteps, "chpmv(case 1118) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ float alpha[2] = {-0.3f, 0.1f};
+ float beta[2] = {0.0f, 1.0f};
+ int N = 2;
+ float A[] = { 0.339f, -0.102f, 0.908f, 0.097f, -0.808f, 0.236f };
+ float X[] = { 0.993f, -0.502f, -0.653f, 0.796f };
+ int incX = -1;
+ float Y[] = { -0.35f, 0.339f, -0.269f, -0.122f };
+ int incY = -1;
+ float y_expected[] = { -0.0627557f, -0.839323f, -0.0877262f, -0.169208f };
+ cblas_chpmv(order, uplo, N, alpha, A, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], flteps, "chpmv(case 1119) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], flteps, "chpmv(case 1119) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ float alpha[2] = {-0.3f, 0.1f};
+ float beta[2] = {0.0f, 1.0f};
+ int N = 2;
+ float A[] = { 0.339f, -0.102f, 0.908f, 0.097f, -0.808f, 0.236f };
+ float X[] = { 0.993f, -0.502f, -0.653f, 0.796f };
+ int incX = -1;
+ float Y[] = { -0.35f, 0.339f, -0.269f, -0.122f };
+ int incY = -1;
+ float y_expected[] = { -0.0037603f, -0.816761f, -0.0392456f, -0.121154f };
+ cblas_chpmv(order, uplo, N, alpha, A, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], flteps, "chpmv(case 1120) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], flteps, "chpmv(case 1120) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ float alpha[2] = {-0.3f, 0.1f};
+ float beta[2] = {0.0f, 1.0f};
+ int N = 2;
+ float A[] = { 0.339f, -0.102f, 0.908f, 0.097f, -0.808f, 0.236f };
+ float X[] = { 0.993f, -0.502f, -0.653f, 0.796f };
+ int incX = -1;
+ float Y[] = { -0.35f, 0.339f, -0.269f, -0.122f };
+ int incY = -1;
+ float y_expected[] = { -0.0037603f, -0.816761f, -0.0392456f, -0.121154f };
+ cblas_chpmv(order, uplo, N, alpha, A, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], flteps, "chpmv(case 1121) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], flteps, "chpmv(case 1121) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ float alpha[2] = {-0.3f, 0.1f};
+ float beta[2] = {0.0f, 1.0f};
+ int N = 2;
+ float A[] = { 0.339f, -0.102f, 0.908f, 0.097f, -0.808f, 0.236f };
+ float X[] = { 0.993f, -0.502f, -0.653f, 0.796f };
+ int incX = -1;
+ float Y[] = { -0.35f, 0.339f, -0.269f, -0.122f };
+ int incY = -1;
+ float y_expected[] = { -0.0627557f, -0.839323f, -0.0877262f, -0.169208f };
+ cblas_chpmv(order, uplo, N, alpha, A, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], flteps, "chpmv(case 1122) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], flteps, "chpmv(case 1122) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ float alpha[2] = {-0.3f, 0.1f};
+ float beta[2] = {0.0f, 1.0f};
+ int N = 2;
+ float A[] = { 0.339f, -0.102f, 0.908f, 0.097f, -0.808f, 0.236f };
+ float X[] = { 0.993f, -0.502f, -0.653f, 0.796f };
+ int incX = -1;
+ float Y[] = { -0.35f, 0.339f, -0.269f, -0.122f };
+ int incY = -1;
+ float y_expected[] = { -0.0627557f, -0.839323f, -0.0877262f, -0.169208f };
+ cblas_chpmv(order, uplo, N, alpha, A, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], flteps, "chpmv(case 1123) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], flteps, "chpmv(case 1123) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ float alpha[2] = {-0.3f, 0.1f};
+ float beta[2] = {0.0f, 1.0f};
+ int N = 2;
+ float A[] = { 0.339f, -0.102f, 0.908f, 0.097f, -0.808f, 0.236f };
+ float X[] = { 0.993f, -0.502f, -0.653f, 0.796f };
+ int incX = -1;
+ float Y[] = { -0.35f, 0.339f, -0.269f, -0.122f };
+ int incY = -1;
+ float y_expected[] = { -0.0037603f, -0.816761f, -0.0392456f, -0.121154f };
+ cblas_chpmv(order, uplo, N, alpha, A, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], flteps, "chpmv(case 1124) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], flteps, "chpmv(case 1124) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ float alpha[2] = {-0.3f, 0.1f};
+ float beta[2] = {0.0f, 1.0f};
+ int N = 2;
+ float A[] = { 0.339f, -0.102f, 0.908f, 0.097f, -0.808f, 0.236f };
+ float X[] = { 0.993f, -0.502f, -0.653f, 0.796f };
+ int incX = -1;
+ float Y[] = { -0.35f, 0.339f, -0.269f, -0.122f };
+ int incY = -1;
+ float y_expected[] = { -0.0037603f, -0.816761f, -0.0392456f, -0.121154f };
+ cblas_chpmv(order, uplo, N, alpha, A, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], flteps, "chpmv(case 1125) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], flteps, "chpmv(case 1125) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ double alpha[2] = {1, 0};
+ double beta[2] = {0, 1};
+ int N = 2;
+ double A[] = { 0.543, -0.737, 0.281, -0.053, -0.098, -0.826 };
+ double X[] = { 0.67, -0.857, -0.613, -0.927 };
+ int incX = -1;
+ double Y[] = { -0.398, -0.934, -0.204, 0.183 };
+ int incY = -1;
+ double y_expected[] = { 0.745218, -0.60699, -0.37301, -0.983688 };
+ cblas_zhpmv(order, uplo, N, alpha, A, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], dbleps, "zhpmv(case 1126) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], dbleps, "zhpmv(case 1126) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ double alpha[2] = {1, 0};
+ double beta[2] = {0, 1};
+ int N = 2;
+ double A[] = { 0.543, -0.737, 0.281, -0.053, -0.098, -0.826 };
+ double X[] = { 0.67, -0.857, -0.613, -0.927 };
+ int incX = -1;
+ double Y[] = { -0.398, -0.934, -0.204, 0.183 };
+ int incY = -1;
+ double y_expected[] = { 0.745218, -0.60699, -0.37301, -0.983688 };
+ cblas_zhpmv(order, uplo, N, alpha, A, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], dbleps, "zhpmv(case 1127) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], dbleps, "zhpmv(case 1127) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ double alpha[2] = {1, 0};
+ double beta[2] = {0, 1};
+ int N = 2;
+ double A[] = { 0.543, -0.737, 0.281, -0.053, -0.098, -0.826 };
+ double X[] = { 0.67, -0.857, -0.613, -0.927 };
+ int incX = -1;
+ double Y[] = { -0.398, -0.934, -0.204, 0.183 };
+ int incY = -1;
+ double y_expected[] = { 0.646956, -0.542012, -0.282168, -0.912668 };
+ cblas_zhpmv(order, uplo, N, alpha, A, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], dbleps, "zhpmv(case 1128) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], dbleps, "zhpmv(case 1128) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ double alpha[2] = {1, 0};
+ double beta[2] = {0, 1};
+ int N = 2;
+ double A[] = { 0.543, -0.737, 0.281, -0.053, -0.098, -0.826 };
+ double X[] = { 0.67, -0.857, -0.613, -0.927 };
+ int incX = -1;
+ double Y[] = { -0.398, -0.934, -0.204, 0.183 };
+ int incY = -1;
+ double y_expected[] = { 0.646956, -0.542012, -0.282168, -0.912668 };
+ cblas_zhpmv(order, uplo, N, alpha, A, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], dbleps, "zhpmv(case 1129) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], dbleps, "zhpmv(case 1129) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ double alpha[2] = {1, 0};
+ double beta[2] = {0, 1};
+ int N = 2;
+ double A[] = { 0.543, -0.737, 0.281, -0.053, -0.098, -0.826 };
+ double X[] = { 0.67, -0.857, -0.613, -0.927 };
+ int incX = -1;
+ double Y[] = { -0.398, -0.934, -0.204, 0.183 };
+ int incY = -1;
+ double y_expected[] = { 0.745218, -0.60699, -0.37301, -0.983688 };
+ cblas_zhpmv(order, uplo, N, alpha, A, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], dbleps, "zhpmv(case 1130) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], dbleps, "zhpmv(case 1130) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ double alpha[2] = {1, 0};
+ double beta[2] = {0, 1};
+ int N = 2;
+ double A[] = { 0.543, -0.737, 0.281, -0.053, -0.098, -0.826 };
+ double X[] = { 0.67, -0.857, -0.613, -0.927 };
+ int incX = -1;
+ double Y[] = { -0.398, -0.934, -0.204, 0.183 };
+ int incY = -1;
+ double y_expected[] = { 0.745218, -0.60699, -0.37301, -0.983688 };
+ cblas_zhpmv(order, uplo, N, alpha, A, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], dbleps, "zhpmv(case 1131) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], dbleps, "zhpmv(case 1131) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ double alpha[2] = {1, 0};
+ double beta[2] = {0, 1};
+ int N = 2;
+ double A[] = { 0.543, -0.737, 0.281, -0.053, -0.098, -0.826 };
+ double X[] = { 0.67, -0.857, -0.613, -0.927 };
+ int incX = -1;
+ double Y[] = { -0.398, -0.934, -0.204, 0.183 };
+ int incY = -1;
+ double y_expected[] = { 0.646956, -0.542012, -0.282168, -0.912668 };
+ cblas_zhpmv(order, uplo, N, alpha, A, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], dbleps, "zhpmv(case 1132) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], dbleps, "zhpmv(case 1132) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ double alpha[2] = {1, 0};
+ double beta[2] = {0, 1};
+ int N = 2;
+ double A[] = { 0.543, -0.737, 0.281, -0.053, -0.098, -0.826 };
+ double X[] = { 0.67, -0.857, -0.613, -0.927 };
+ int incX = -1;
+ double Y[] = { -0.398, -0.934, -0.204, 0.183 };
+ int incY = -1;
+ double y_expected[] = { 0.646956, -0.542012, -0.282168, -0.912668 };
+ cblas_zhpmv(order, uplo, N, alpha, A, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(Y[2*i], y_expected[2*i], dbleps, "zhpmv(case 1133) real");
+ gsl_test_rel(Y[2*i+1], y_expected[2*i+1], dbleps, "zhpmv(case 1133) imag");
+ };
+ };
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_hpr.c b/gsl-1.9/cblas/test_hpr.c
new file mode 100644
index 0000000..4682b94
--- /dev/null
+++ b/gsl-1.9/cblas/test_hpr.c
@@ -0,0 +1,171 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_hpr (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ int order = 101;
+ int uplo = 121;
+ int N = 2;
+ float alpha = 0.1f;
+ float Ap[] = { -0.273f, -0.499f, -0.305f, -0.277f, 0.238f, -0.369f };
+ float X[] = { 0.638f, -0.905f, 0.224f, 0.182f };
+ int incX = -1;
+ float Ap_expected[] = { -0.26467f, 0.0f, -0.30718f, -0.245116f, 0.360607f, 0.0f };
+ cblas_chpr(order, uplo, N, alpha, X, incX, Ap);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Ap[2*i], Ap_expected[2*i], flteps, "chpr(case 1418) real");
+ gsl_test_rel(Ap[2*i+1], Ap_expected[2*i+1], flteps, "chpr(case 1418) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ int N = 2;
+ float alpha = 0.1f;
+ float Ap[] = { -0.273f, -0.499f, -0.305f, -0.277f, 0.238f, -0.369f };
+ float X[] = { 0.638f, -0.905f, 0.224f, 0.182f };
+ int incX = -1;
+ float Ap_expected[] = { -0.26467f, 0.0f, -0.30718f, -0.308884f, 0.360607f, 0.0f };
+ cblas_chpr(order, uplo, N, alpha, X, incX, Ap);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Ap[2*i], Ap_expected[2*i], flteps, "chpr(case 1419) real");
+ gsl_test_rel(Ap[2*i+1], Ap_expected[2*i+1], flteps, "chpr(case 1419) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ int N = 2;
+ float alpha = 0.1f;
+ float Ap[] = { -0.273f, -0.499f, -0.305f, -0.277f, 0.238f, -0.369f };
+ float X[] = { 0.638f, -0.905f, 0.224f, 0.182f };
+ int incX = -1;
+ float Ap_expected[] = { -0.26467f, 0.0f, -0.30718f, -0.245116f, 0.360607f, 0.0f };
+ cblas_chpr(order, uplo, N, alpha, X, incX, Ap);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Ap[2*i], Ap_expected[2*i], flteps, "chpr(case 1420) real");
+ gsl_test_rel(Ap[2*i+1], Ap_expected[2*i+1], flteps, "chpr(case 1420) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ int N = 2;
+ float alpha = 0.1f;
+ float Ap[] = { -0.273f, -0.499f, -0.305f, -0.277f, 0.238f, -0.369f };
+ float X[] = { 0.638f, -0.905f, 0.224f, 0.182f };
+ int incX = -1;
+ float Ap_expected[] = { -0.26467f, 0.0f, -0.30718f, -0.308884f, 0.360607f, 0.0f };
+ cblas_chpr(order, uplo, N, alpha, X, incX, Ap);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Ap[2*i], Ap_expected[2*i], flteps, "chpr(case 1421) real");
+ gsl_test_rel(Ap[2*i+1], Ap_expected[2*i+1], flteps, "chpr(case 1421) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ int N = 2;
+ double alpha = 1;
+ double Ap[] = { 0.265, 0.362, -0.855, 0.035, 0.136, 0.133 };
+ double X[] = { -0.278, -0.686, -0.736, -0.918 };
+ int incX = -1;
+ double Ap_expected[] = { 1.64942, 0.0, -0.020644, -0.214692, 0.68388, 0.0 };
+ cblas_zhpr(order, uplo, N, alpha, X, incX, Ap);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Ap[2*i], Ap_expected[2*i], dbleps, "zhpr(case 1422) real");
+ gsl_test_rel(Ap[2*i+1], Ap_expected[2*i+1], dbleps, "zhpr(case 1422) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ int N = 2;
+ double alpha = 1;
+ double Ap[] = { 0.265, 0.362, -0.855, 0.035, 0.136, 0.133 };
+ double X[] = { -0.278, -0.686, -0.736, -0.918 };
+ int incX = -1;
+ double Ap_expected[] = { 1.64942, 0.0, -0.020644, 0.284692, 0.68388, 0.0 };
+ cblas_zhpr(order, uplo, N, alpha, X, incX, Ap);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Ap[2*i], Ap_expected[2*i], dbleps, "zhpr(case 1423) real");
+ gsl_test_rel(Ap[2*i+1], Ap_expected[2*i+1], dbleps, "zhpr(case 1423) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ int N = 2;
+ double alpha = 1;
+ double Ap[] = { 0.265, 0.362, -0.855, 0.035, 0.136, 0.133 };
+ double X[] = { -0.278, -0.686, -0.736, -0.918 };
+ int incX = -1;
+ double Ap_expected[] = { 1.64942, 0.0, -0.020644, -0.214692, 0.68388, 0.0 };
+ cblas_zhpr(order, uplo, N, alpha, X, incX, Ap);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Ap[2*i], Ap_expected[2*i], dbleps, "zhpr(case 1424) real");
+ gsl_test_rel(Ap[2*i+1], Ap_expected[2*i+1], dbleps, "zhpr(case 1424) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ int N = 2;
+ double alpha = 1;
+ double Ap[] = { 0.265, 0.362, -0.855, 0.035, 0.136, 0.133 };
+ double X[] = { -0.278, -0.686, -0.736, -0.918 };
+ int incX = -1;
+ double Ap_expected[] = { 1.64942, 0.0, -0.020644, 0.284692, 0.68388, 0.0 };
+ cblas_zhpr(order, uplo, N, alpha, X, incX, Ap);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Ap[2*i], Ap_expected[2*i], dbleps, "zhpr(case 1425) real");
+ gsl_test_rel(Ap[2*i+1], Ap_expected[2*i+1], dbleps, "zhpr(case 1425) imag");
+ };
+ };
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_hpr2.c b/gsl-1.9/cblas/test_hpr2.c
new file mode 100644
index 0000000..7fb7dee
--- /dev/null
+++ b/gsl-1.9/cblas/test_hpr2.c
@@ -0,0 +1,187 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_hpr2 (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ int order = 101;
+ int uplo = 121;
+ int N = 1;
+ float alpha[2] = {-1.0f, 0.0f};
+ float Ap[] = { 0.159f, -0.13f };
+ float X[] = { 0.854f, 0.851f };
+ int incX = -1;
+ float Y[] = { 0.526f, -0.267f };
+ int incY = -1;
+ float Ap_expected[] = { -0.284974f, 0.0f };
+ cblas_chpr2(order, uplo, N, alpha, X, incX, Y, incY, Ap);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Ap[2*i], Ap_expected[2*i], flteps, "chpr2(case 1458) real");
+ gsl_test_rel(Ap[2*i+1], Ap_expected[2*i+1], flteps, "chpr2(case 1458) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ int N = 1;
+ float alpha[2] = {-1.0f, 0.0f};
+ float Ap[] = { 0.159f, -0.13f };
+ float X[] = { 0.854f, 0.851f };
+ int incX = -1;
+ float Y[] = { 0.526f, -0.267f };
+ int incY = -1;
+ float Ap_expected[] = { -0.284974f, 0.0f };
+ cblas_chpr2(order, uplo, N, alpha, X, incX, Y, incY, Ap);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Ap[2*i], Ap_expected[2*i], flteps, "chpr2(case 1459) real");
+ gsl_test_rel(Ap[2*i+1], Ap_expected[2*i+1], flteps, "chpr2(case 1459) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ int N = 1;
+ float alpha[2] = {-1.0f, 0.0f};
+ float Ap[] = { 0.159f, -0.13f };
+ float X[] = { 0.854f, 0.851f };
+ int incX = -1;
+ float Y[] = { 0.526f, -0.267f };
+ int incY = -1;
+ float Ap_expected[] = { -0.284974f, 0.0f };
+ cblas_chpr2(order, uplo, N, alpha, X, incX, Y, incY, Ap);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Ap[2*i], Ap_expected[2*i], flteps, "chpr2(case 1460) real");
+ gsl_test_rel(Ap[2*i+1], Ap_expected[2*i+1], flteps, "chpr2(case 1460) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ int N = 1;
+ float alpha[2] = {-1.0f, 0.0f};
+ float Ap[] = { 0.159f, -0.13f };
+ float X[] = { 0.854f, 0.851f };
+ int incX = -1;
+ float Y[] = { 0.526f, -0.267f };
+ int incY = -1;
+ float Ap_expected[] = { -0.284974f, 0.0f };
+ cblas_chpr2(order, uplo, N, alpha, X, incX, Y, incY, Ap);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Ap[2*i], Ap_expected[2*i], flteps, "chpr2(case 1461) real");
+ gsl_test_rel(Ap[2*i+1], Ap_expected[2*i+1], flteps, "chpr2(case 1461) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ int N = 1;
+ double alpha[2] = {-0.3, 0.1};
+ double Ap[] = { 0.772, 0.997 };
+ double X[] = { -0.173, -0.839 };
+ int incX = -1;
+ double Y[] = { 0.941, -0.422 };
+ int incY = -1;
+ double Ap_expected[] = { 0.829742, 0.0 };
+ cblas_zhpr2(order, uplo, N, alpha, X, incX, Y, incY, Ap);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Ap[2*i], Ap_expected[2*i], dbleps, "zhpr2(case 1462) real");
+ gsl_test_rel(Ap[2*i+1], Ap_expected[2*i+1], dbleps, "zhpr2(case 1462) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ int N = 1;
+ double alpha[2] = {-0.3, 0.1};
+ double Ap[] = { 0.772, 0.997 };
+ double X[] = { -0.173, -0.839 };
+ int incX = -1;
+ double Y[] = { 0.941, -0.422 };
+ int incY = -1;
+ double Ap_expected[] = { 0.829742, 0.0 };
+ cblas_zhpr2(order, uplo, N, alpha, X, incX, Y, incY, Ap);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Ap[2*i], Ap_expected[2*i], dbleps, "zhpr2(case 1463) real");
+ gsl_test_rel(Ap[2*i+1], Ap_expected[2*i+1], dbleps, "zhpr2(case 1463) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ int N = 1;
+ double alpha[2] = {-0.3, 0.1};
+ double Ap[] = { 0.772, 0.997 };
+ double X[] = { -0.173, -0.839 };
+ int incX = -1;
+ double Y[] = { 0.941, -0.422 };
+ int incY = -1;
+ double Ap_expected[] = { 0.829742, 0.0 };
+ cblas_zhpr2(order, uplo, N, alpha, X, incX, Y, incY, Ap);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Ap[2*i], Ap_expected[2*i], dbleps, "zhpr2(case 1464) real");
+ gsl_test_rel(Ap[2*i+1], Ap_expected[2*i+1], dbleps, "zhpr2(case 1464) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ int N = 1;
+ double alpha[2] = {-0.3, 0.1};
+ double Ap[] = { 0.772, 0.997 };
+ double X[] = { -0.173, -0.839 };
+ int incX = -1;
+ double Y[] = { 0.941, -0.422 };
+ int incY = -1;
+ double Ap_expected[] = { 0.829742, 0.0 };
+ cblas_zhpr2(order, uplo, N, alpha, X, incX, Y, incY, Ap);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Ap[2*i], Ap_expected[2*i], dbleps, "zhpr2(case 1465) real");
+ gsl_test_rel(Ap[2*i+1], Ap_expected[2*i+1], dbleps, "zhpr2(case 1465) imag");
+ };
+ };
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_nrm2.c b/gsl-1.9/cblas/test_nrm2.c
new file mode 100644
index 0000000..5c777f6
--- /dev/null
+++ b/gsl-1.9/cblas/test_nrm2.c
@@ -0,0 +1,143 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_nrm2 (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ int N = 1;
+ float X[] = { 0.317f };
+ int incX = -1;
+ float expected = 0.0f;
+ float f;
+ f = cblas_snrm2(N, X, incX);
+ gsl_test_rel(f, expected, flteps, "snrm2(case 28)");
+ };
+
+
+ {
+ int N = 1;
+ double X[] = { 0.071 };
+ int incX = -1;
+ double expected = 0;
+ double f;
+ f = cblas_dnrm2(N, X, incX);
+ gsl_test_rel(f, expected, dbleps, "dnrm2(case 29)");
+ };
+
+
+ {
+ int N = 1;
+ float X[] = { 0.776f, 0.983f };
+ int incX = -1;
+ float expected = 0.0f;
+ float f;
+ f = cblas_scnrm2(N, X, incX);
+ gsl_test_rel(f, expected, flteps, "scnrm2(case 30)");
+ };
+
+
+ {
+ int N = 1;
+ double X[] = { 0.549, -0.354 };
+ int incX = -1;
+ double expected = 0;
+ double f;
+ f = cblas_dznrm2(N, X, incX);
+ gsl_test_rel(f, expected, dbleps, "dznrm2(case 31)");
+ };
+
+
+ {
+ int N = 2;
+ float X[] = { 0.14f, -0.632f };
+ int incX = 1;
+ float expected = 0.647320631527f;
+ float f;
+ f = cblas_snrm2(N, X, incX);
+ gsl_test_rel(f, expected, flteps, "snrm2(case 32)");
+ };
+
+
+ {
+ int N = 2;
+ double X[] = { 0.696, -0.804 };
+ int incX = 1;
+ double expected = 1.06340584915;
+ double f;
+ f = cblas_dnrm2(N, X, incX);
+ gsl_test_rel(f, expected, dbleps, "dnrm2(case 33)");
+ };
+
+
+ {
+ int N = 2;
+ float X[] = { 0.281f, -0.063f, 0.367f, 0.232f };
+ int incX = 1;
+ float expected = 0.521001919382f;
+ float f;
+ f = cblas_scnrm2(N, X, incX);
+ gsl_test_rel(f, expected, flteps, "scnrm2(case 34)");
+ };
+
+
+ {
+ int N = 2;
+ double X[] = { -0.359, -0.76, -0.906, -0.108 };
+ int incX = 1;
+ double expected = 1.24055672986;
+ double f;
+ f = cblas_dznrm2(N, X, incX);
+ gsl_test_rel(f, expected, dbleps, "dznrm2(case 35)");
+ };
+
+
+ {
+ int N = 2;
+ float X[] = { 0.918f, -0.126f };
+ int incX = -1;
+ float expected = 0.0f;
+ float f;
+ f = cblas_snrm2(N, X, incX);
+ gsl_test_rel(f, expected, flteps, "snrm2(case 36)");
+ };
+
+
+ {
+ int N = 2;
+ double X[] = { 0.217, -0.588 };
+ int incX = -1;
+ double expected = 0;
+ double f;
+ f = cblas_dnrm2(N, X, incX);
+ gsl_test_rel(f, expected, dbleps, "dnrm2(case 37)");
+ };
+
+
+ {
+ int N = 2;
+ float X[] = { 0.31f, 0.059f, -0.442f, 0.987f };
+ int incX = -1;
+ float expected = 0.0f;
+ float f;
+ f = cblas_scnrm2(N, X, incX);
+ gsl_test_rel(f, expected, flteps, "scnrm2(case 38)");
+ };
+
+
+ {
+ int N = 2;
+ double X[] = { 0.609, 0.615, -0.143, -0.957 };
+ int incX = -1;
+ double expected = 0;
+ double f;
+ f = cblas_dznrm2(N, X, incX);
+ gsl_test_rel(f, expected, dbleps, "dznrm2(case 39)");
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_rot.c b/gsl-1.9/cblas/test_rot.c
new file mode 100644
index 0000000..d2d6ed3
--- /dev/null
+++ b/gsl-1.9/cblas/test_rot.c
@@ -0,0 +1,635 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_rot (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ int N = 1;
+ float c = 0.0f;
+ float s = 0.0f;
+ float X[] = { -0.314f };
+ int incX = 1;
+ float Y[] = { -0.406f };
+ int incY = -1;
+ float x_expected[] = { 0.0f };
+ float y_expected[] = { 0.0f };
+ cblas_srot(N, X, incX, Y, incY, c, s);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "srot(case 558)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "srot(case 559)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float c = 0.866025403784f;
+ float s = 0.5f;
+ float X[] = { -0.314f };
+ int incX = 1;
+ float Y[] = { -0.406f };
+ int incY = -1;
+ float x_expected[] = { -0.474932f };
+ float y_expected[] = { -0.194606f };
+ cblas_srot(N, X, incX, Y, incY, c, s);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "srot(case 560)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "srot(case 561)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float c = 0.0f;
+ float s = -1.0f;
+ float X[] = { -0.314f };
+ int incX = 1;
+ float Y[] = { -0.406f };
+ int incY = -1;
+ float x_expected[] = { 0.406f };
+ float y_expected[] = { -0.314f };
+ cblas_srot(N, X, incX, Y, incY, c, s);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "srot(case 562)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "srot(case 563)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float c = -1.0f;
+ float s = 0.0f;
+ float X[] = { -0.314f };
+ int incX = 1;
+ float Y[] = { -0.406f };
+ int incY = -1;
+ float x_expected[] = { 0.314f };
+ float y_expected[] = { 0.406f };
+ cblas_srot(N, X, incX, Y, incY, c, s);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "srot(case 564)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "srot(case 565)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double c = 0;
+ double s = 0;
+ double X[] = { -0.493 };
+ int incX = 1;
+ double Y[] = { -0.014 };
+ int incY = -1;
+ double x_expected[] = { 0.0 };
+ double y_expected[] = { 0.0 };
+ cblas_drot(N, X, incX, Y, incY, c, s);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "drot(case 566)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "drot(case 567)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double c = 0.866025403784;
+ double s = 0.5;
+ double X[] = { -0.493 };
+ int incX = 1;
+ double Y[] = { -0.014 };
+ int incY = -1;
+ double x_expected[] = { -0.433950524066 };
+ double y_expected[] = { 0.234375644347 };
+ cblas_drot(N, X, incX, Y, incY, c, s);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "drot(case 568)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "drot(case 569)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double c = 0;
+ double s = -1;
+ double X[] = { -0.493 };
+ int incX = 1;
+ double Y[] = { -0.014 };
+ int incY = -1;
+ double x_expected[] = { 0.014 };
+ double y_expected[] = { -0.493 };
+ cblas_drot(N, X, incX, Y, incY, c, s);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "drot(case 570)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "drot(case 571)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double c = -1;
+ double s = 0;
+ double X[] = { -0.493 };
+ int incX = 1;
+ double Y[] = { -0.014 };
+ int incY = -1;
+ double x_expected[] = { 0.493 };
+ double y_expected[] = { 0.014 };
+ cblas_drot(N, X, incX, Y, incY, c, s);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "drot(case 572)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "drot(case 573)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float c = 0.0f;
+ float s = 0.0f;
+ float X[] = { -0.808f };
+ int incX = -1;
+ float Y[] = { -0.511f };
+ int incY = 1;
+ float x_expected[] = { 0.0f };
+ float y_expected[] = { 0.0f };
+ cblas_srot(N, X, incX, Y, incY, c, s);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "srot(case 574)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "srot(case 575)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float c = 0.866025403784f;
+ float s = 0.5f;
+ float X[] = { -0.808f };
+ int incX = -1;
+ float Y[] = { -0.511f };
+ int incY = 1;
+ float x_expected[] = { -0.955249f };
+ float y_expected[] = { -0.038539f };
+ cblas_srot(N, X, incX, Y, incY, c, s);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "srot(case 576)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "srot(case 577)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float c = 0.0f;
+ float s = -1.0f;
+ float X[] = { -0.808f };
+ int incX = -1;
+ float Y[] = { -0.511f };
+ int incY = 1;
+ float x_expected[] = { 0.511f };
+ float y_expected[] = { -0.808f };
+ cblas_srot(N, X, incX, Y, incY, c, s);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "srot(case 578)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "srot(case 579)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float c = -1.0f;
+ float s = 0.0f;
+ float X[] = { -0.808f };
+ int incX = -1;
+ float Y[] = { -0.511f };
+ int incY = 1;
+ float x_expected[] = { 0.808f };
+ float y_expected[] = { 0.511f };
+ cblas_srot(N, X, incX, Y, incY, c, s);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "srot(case 580)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "srot(case 581)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double c = 0;
+ double s = 0;
+ double X[] = { -0.176 };
+ int incX = -1;
+ double Y[] = { -0.165 };
+ int incY = 1;
+ double x_expected[] = { 0.0 };
+ double y_expected[] = { 0.0 };
+ cblas_drot(N, X, incX, Y, incY, c, s);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "drot(case 582)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "drot(case 583)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double c = 0.866025403784;
+ double s = 0.5;
+ double X[] = { -0.176 };
+ int incX = -1;
+ double Y[] = { -0.165 };
+ int incY = 1;
+ double x_expected[] = { -0.234920471066 };
+ double y_expected[] = { -0.0548941916244 };
+ cblas_drot(N, X, incX, Y, incY, c, s);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "drot(case 584)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "drot(case 585)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double c = 0;
+ double s = -1;
+ double X[] = { -0.176 };
+ int incX = -1;
+ double Y[] = { -0.165 };
+ int incY = 1;
+ double x_expected[] = { 0.165 };
+ double y_expected[] = { -0.176 };
+ cblas_drot(N, X, incX, Y, incY, c, s);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "drot(case 586)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "drot(case 587)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double c = -1;
+ double s = 0;
+ double X[] = { -0.176 };
+ int incX = -1;
+ double Y[] = { -0.165 };
+ int incY = 1;
+ double x_expected[] = { 0.176 };
+ double y_expected[] = { 0.165 };
+ cblas_drot(N, X, incX, Y, incY, c, s);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "drot(case 588)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "drot(case 589)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float c = 0.0f;
+ float s = 0.0f;
+ float X[] = { -0.201f };
+ int incX = -1;
+ float Y[] = { 0.087f };
+ int incY = -1;
+ float x_expected[] = { 0.0f };
+ float y_expected[] = { 0.0f };
+ cblas_srot(N, X, incX, Y, incY, c, s);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "srot(case 590)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "srot(case 591)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float c = 0.866025403784f;
+ float s = 0.5f;
+ float X[] = { -0.201f };
+ int incX = -1;
+ float Y[] = { 0.087f };
+ int incY = -1;
+ float x_expected[] = { -0.130571f };
+ float y_expected[] = { 0.175844f };
+ cblas_srot(N, X, incX, Y, incY, c, s);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "srot(case 592)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "srot(case 593)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float c = 0.0f;
+ float s = -1.0f;
+ float X[] = { -0.201f };
+ int incX = -1;
+ float Y[] = { 0.087f };
+ int incY = -1;
+ float x_expected[] = { -0.087f };
+ float y_expected[] = { -0.201f };
+ cblas_srot(N, X, incX, Y, incY, c, s);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "srot(case 594)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "srot(case 595)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float c = -1.0f;
+ float s = 0.0f;
+ float X[] = { -0.201f };
+ int incX = -1;
+ float Y[] = { 0.087f };
+ int incY = -1;
+ float x_expected[] = { 0.201f };
+ float y_expected[] = { -0.087f };
+ cblas_srot(N, X, incX, Y, incY, c, s);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "srot(case 596)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "srot(case 597)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double c = 0;
+ double s = 0;
+ double X[] = { -0.464 };
+ int incX = -1;
+ double Y[] = { 0.7 };
+ int incY = -1;
+ double x_expected[] = { 0.0 };
+ double y_expected[] = { 0.0 };
+ cblas_drot(N, X, incX, Y, incY, c, s);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "drot(case 598)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "drot(case 599)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double c = 0.866025403784;
+ double s = 0.5;
+ double X[] = { -0.464 };
+ int incX = -1;
+ double Y[] = { 0.7 };
+ int incY = -1;
+ double x_expected[] = { -0.051835787356 };
+ double y_expected[] = { 0.838217782649 };
+ cblas_drot(N, X, incX, Y, incY, c, s);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "drot(case 600)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "drot(case 601)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double c = 0;
+ double s = -1;
+ double X[] = { -0.464 };
+ int incX = -1;
+ double Y[] = { 0.7 };
+ int incY = -1;
+ double x_expected[] = { -0.7 };
+ double y_expected[] = { -0.464 };
+ cblas_drot(N, X, incX, Y, incY, c, s);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "drot(case 602)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "drot(case 603)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double c = -1;
+ double s = 0;
+ double X[] = { -0.464 };
+ int incX = -1;
+ double Y[] = { 0.7 };
+ int incY = -1;
+ double x_expected[] = { 0.464 };
+ double y_expected[] = { -0.7 };
+ cblas_drot(N, X, incX, Y, incY, c, s);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "drot(case 604)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "drot(case 605)");
+ }
+ };
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_rotg.c b/gsl-1.9/cblas/test_rotg.c
new file mode 100644
index 0000000..a5a84d3
--- /dev/null
+++ b/gsl-1.9/cblas/test_rotg.c
@@ -0,0 +1,1677 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_rotg (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ float a = -1.5f;
+ float b = -1.5f;
+ float c;
+ float s;
+ float r_expected = -2.12132034356f;
+ float z_expected = 1.41421356237f;
+ float c_expected = 0.707106781187f;
+ float s_expected = 0.707106781187f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 166)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 167)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 168)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 169)");
+ };
+
+
+ {
+ float a = -1.5f;
+ float b = -1.0f;
+ float c;
+ float s;
+ float r_expected = -1.80277563773f;
+ float z_expected = 0.554700196225f;
+ float c_expected = 0.832050294338f;
+ float s_expected = 0.554700196225f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 170)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 171)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 172)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 173)");
+ };
+
+
+ {
+ float a = -1.5f;
+ float b = -0.1f;
+ float c;
+ float s;
+ float r_expected = -1.50332963784f;
+ float z_expected = 0.0665190105238f;
+ float c_expected = 0.997785157857f;
+ float s_expected = 0.0665190105238f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 174)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 175)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 176)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 177)");
+ };
+
+
+ {
+ float a = -1.5f;
+ float b = 0.0f;
+ float c;
+ float s;
+ float r_expected = -1.5f;
+ float z_expected = -0.0f;
+ float c_expected = 1.0f;
+ float s_expected = -0.0f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 178)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 179)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 180)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 181)");
+ };
+
+
+ {
+ float a = -1.5f;
+ float b = 0.1f;
+ float c;
+ float s;
+ float r_expected = -1.50332963784f;
+ float z_expected = -0.0665190105238f;
+ float c_expected = 0.997785157857f;
+ float s_expected = -0.0665190105238f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 182)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 183)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 184)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 185)");
+ };
+
+
+ {
+ float a = -1.5f;
+ float b = 1.0f;
+ float c;
+ float s;
+ float r_expected = -1.80277563773f;
+ float z_expected = -0.554700196225f;
+ float c_expected = 0.832050294338f;
+ float s_expected = -0.554700196225f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 186)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 187)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 188)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 189)");
+ };
+
+
+ {
+ float a = -1.5f;
+ float b = 1.5f;
+ float c;
+ float s;
+ float r_expected = 2.12132034356f;
+ float z_expected = -1.41421356237f;
+ float c_expected = -0.707106781187f;
+ float s_expected = 0.707106781187f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 190)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 191)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 192)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 193)");
+ };
+
+
+ {
+ float a = -1.0f;
+ float b = -1.5f;
+ float c;
+ float s;
+ float r_expected = -1.80277563773f;
+ float z_expected = 1.80277563773f;
+ float c_expected = 0.554700196225f;
+ float s_expected = 0.832050294338f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 194)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 195)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 196)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 197)");
+ };
+
+
+ {
+ float a = -1.0f;
+ float b = -1.0f;
+ float c;
+ float s;
+ float r_expected = -1.41421356237f;
+ float z_expected = 1.41421356237f;
+ float c_expected = 0.707106781187f;
+ float s_expected = 0.707106781187f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 198)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 199)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 200)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 201)");
+ };
+
+
+ {
+ float a = -1.0f;
+ float b = -0.1f;
+ float c;
+ float s;
+ float r_expected = -1.00498756211f;
+ float z_expected = 0.099503719021f;
+ float c_expected = 0.99503719021f;
+ float s_expected = 0.099503719021f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 202)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 203)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 204)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 205)");
+ };
+
+
+ {
+ float a = -1.0f;
+ float b = 0.0f;
+ float c;
+ float s;
+ float r_expected = -1.0f;
+ float z_expected = -0.0f;
+ float c_expected = 1.0f;
+ float s_expected = -0.0f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 206)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 207)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 208)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 209)");
+ };
+
+
+ {
+ float a = -1.0f;
+ float b = 0.1f;
+ float c;
+ float s;
+ float r_expected = -1.00498756211f;
+ float z_expected = -0.099503719021f;
+ float c_expected = 0.99503719021f;
+ float s_expected = -0.099503719021f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 210)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 211)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 212)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 213)");
+ };
+
+
+ {
+ float a = -1.0f;
+ float b = 1.0f;
+ float c;
+ float s;
+ float r_expected = 1.41421356237f;
+ float z_expected = -1.41421356237f;
+ float c_expected = -0.707106781187f;
+ float s_expected = 0.707106781187f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 214)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 215)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 216)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 217)");
+ };
+
+
+ {
+ float a = -1.0f;
+ float b = 1.5f;
+ float c;
+ float s;
+ float r_expected = 1.80277563773f;
+ float z_expected = -1.80277563773f;
+ float c_expected = -0.554700196225f;
+ float s_expected = 0.832050294338f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 218)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 219)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 220)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 221)");
+ };
+
+
+ {
+ float a = -0.1f;
+ float b = -1.5f;
+ float c;
+ float s;
+ float r_expected = -1.50332963784f;
+ float z_expected = 15.0332963784f;
+ float c_expected = 0.0665190105238f;
+ float s_expected = 0.997785157857f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 222)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 223)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 224)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 225)");
+ };
+
+
+ {
+ float a = -0.1f;
+ float b = -1.0f;
+ float c;
+ float s;
+ float r_expected = -1.00498756211f;
+ float z_expected = 10.0498756211f;
+ float c_expected = 0.099503719021f;
+ float s_expected = 0.99503719021f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 226)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 227)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 228)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 229)");
+ };
+
+
+ {
+ float a = -0.1f;
+ float b = -0.1f;
+ float c;
+ float s;
+ float r_expected = -0.141421356237f;
+ float z_expected = 1.41421356237f;
+ float c_expected = 0.707106781187f;
+ float s_expected = 0.707106781187f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 230)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 231)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 232)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 233)");
+ };
+
+
+ {
+ float a = -0.1f;
+ float b = 0.0f;
+ float c;
+ float s;
+ float r_expected = -0.1f;
+ float z_expected = -0.0f;
+ float c_expected = 1.0f;
+ float s_expected = -0.0f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 234)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 235)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 236)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 237)");
+ };
+
+
+ {
+ float a = -0.1f;
+ float b = 0.1f;
+ float c;
+ float s;
+ float r_expected = 0.141421356237f;
+ float z_expected = -1.41421356237f;
+ float c_expected = -0.707106781187f;
+ float s_expected = 0.707106781187f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 238)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 239)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 240)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 241)");
+ };
+
+
+ {
+ float a = -0.1f;
+ float b = 1.0f;
+ float c;
+ float s;
+ float r_expected = 1.00498756211f;
+ float z_expected = -10.0498756211f;
+ float c_expected = -0.099503719021f;
+ float s_expected = 0.99503719021f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 242)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 243)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 244)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 245)");
+ };
+
+
+ {
+ float a = -0.1f;
+ float b = 1.5f;
+ float c;
+ float s;
+ float r_expected = 1.50332963784f;
+ float z_expected = -15.0332963784f;
+ float c_expected = -0.0665190105238f;
+ float s_expected = 0.997785157857f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 246)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 247)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 248)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 249)");
+ };
+
+
+ {
+ float a = 0.0f;
+ float b = -1.5f;
+ float c;
+ float s;
+ float r_expected = -1.5f;
+ float z_expected = 1.0f;
+ float c_expected = -0.0f;
+ float s_expected = 1.0f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 250)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 251)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 252)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 253)");
+ };
+
+
+ {
+ float a = 0.0f;
+ float b = -1.0f;
+ float c;
+ float s;
+ float r_expected = -1.0f;
+ float z_expected = 1.0f;
+ float c_expected = -0.0f;
+ float s_expected = 1.0f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 254)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 255)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 256)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 257)");
+ };
+
+
+ {
+ float a = 0.0f;
+ float b = -0.1f;
+ float c;
+ float s;
+ float r_expected = -0.1f;
+ float z_expected = 1.0f;
+ float c_expected = -0.0f;
+ float s_expected = 1.0f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 258)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 259)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 260)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 261)");
+ };
+
+
+ {
+ float a = 0.0f;
+ float b = 0.0f;
+ float c;
+ float s;
+ float r_expected = 0.0f;
+ float z_expected = 0.0f;
+ float c_expected = 1.0f;
+ float s_expected = 0.0f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 262)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 263)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 264)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 265)");
+ };
+
+
+ {
+ float a = 0.0f;
+ float b = 0.1f;
+ float c;
+ float s;
+ float r_expected = 0.1f;
+ float z_expected = 1.0f;
+ float c_expected = 0.0f;
+ float s_expected = 1.0f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 266)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 267)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 268)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 269)");
+ };
+
+
+ {
+ float a = 0.0f;
+ float b = 1.0f;
+ float c;
+ float s;
+ float r_expected = 1.0f;
+ float z_expected = 1.0f;
+ float c_expected = 0.0f;
+ float s_expected = 1.0f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 270)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 271)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 272)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 273)");
+ };
+
+
+ {
+ float a = 0.0f;
+ float b = 1.5f;
+ float c;
+ float s;
+ float r_expected = 1.5f;
+ float z_expected = 1.0f;
+ float c_expected = 0.0f;
+ float s_expected = 1.0f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 274)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 275)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 276)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 277)");
+ };
+
+
+ {
+ float a = 0.1f;
+ float b = -1.5f;
+ float c;
+ float s;
+ float r_expected = -1.50332963784f;
+ float z_expected = -15.0332963784f;
+ float c_expected = -0.0665190105238f;
+ float s_expected = 0.997785157857f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 278)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 279)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 280)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 281)");
+ };
+
+
+ {
+ float a = 0.1f;
+ float b = -1.0f;
+ float c;
+ float s;
+ float r_expected = -1.00498756211f;
+ float z_expected = -10.0498756211f;
+ float c_expected = -0.099503719021f;
+ float s_expected = 0.99503719021f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 282)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 283)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 284)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 285)");
+ };
+
+
+ {
+ float a = 0.1f;
+ float b = -0.1f;
+ float c;
+ float s;
+ float r_expected = -0.141421356237f;
+ float z_expected = -1.41421356237f;
+ float c_expected = -0.707106781187f;
+ float s_expected = 0.707106781187f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 286)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 287)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 288)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 289)");
+ };
+
+
+ {
+ float a = 0.1f;
+ float b = 0.0f;
+ float c;
+ float s;
+ float r_expected = 0.1f;
+ float z_expected = 0.0f;
+ float c_expected = 1.0f;
+ float s_expected = 0.0f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 290)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 291)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 292)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 293)");
+ };
+
+
+ {
+ float a = 0.1f;
+ float b = 0.1f;
+ float c;
+ float s;
+ float r_expected = 0.141421356237f;
+ float z_expected = 1.41421356237f;
+ float c_expected = 0.707106781187f;
+ float s_expected = 0.707106781187f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 294)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 295)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 296)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 297)");
+ };
+
+
+ {
+ float a = 0.1f;
+ float b = 1.0f;
+ float c;
+ float s;
+ float r_expected = 1.00498756211f;
+ float z_expected = 10.0498756211f;
+ float c_expected = 0.099503719021f;
+ float s_expected = 0.99503719021f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 298)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 299)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 300)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 301)");
+ };
+
+
+ {
+ float a = 0.1f;
+ float b = 1.5f;
+ float c;
+ float s;
+ float r_expected = 1.50332963784f;
+ float z_expected = 15.0332963784f;
+ float c_expected = 0.0665190105238f;
+ float s_expected = 0.997785157857f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 302)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 303)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 304)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 305)");
+ };
+
+
+ {
+ float a = 1.0f;
+ float b = -1.5f;
+ float c;
+ float s;
+ float r_expected = -1.80277563773f;
+ float z_expected = -1.80277563773f;
+ float c_expected = -0.554700196225f;
+ float s_expected = 0.832050294338f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 306)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 307)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 308)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 309)");
+ };
+
+
+ {
+ float a = 1.0f;
+ float b = -1.0f;
+ float c;
+ float s;
+ float r_expected = -1.41421356237f;
+ float z_expected = -1.41421356237f;
+ float c_expected = -0.707106781187f;
+ float s_expected = 0.707106781187f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 310)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 311)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 312)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 313)");
+ };
+
+
+ {
+ float a = 1.0f;
+ float b = -0.1f;
+ float c;
+ float s;
+ float r_expected = 1.00498756211f;
+ float z_expected = -0.099503719021f;
+ float c_expected = 0.99503719021f;
+ float s_expected = -0.099503719021f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 314)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 315)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 316)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 317)");
+ };
+
+
+ {
+ float a = 1.0f;
+ float b = 0.0f;
+ float c;
+ float s;
+ float r_expected = 1.0f;
+ float z_expected = 0.0f;
+ float c_expected = 1.0f;
+ float s_expected = 0.0f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 318)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 319)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 320)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 321)");
+ };
+
+
+ {
+ float a = 1.0f;
+ float b = 0.1f;
+ float c;
+ float s;
+ float r_expected = 1.00498756211f;
+ float z_expected = 0.099503719021f;
+ float c_expected = 0.99503719021f;
+ float s_expected = 0.099503719021f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 322)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 323)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 324)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 325)");
+ };
+
+
+ {
+ float a = 1.0f;
+ float b = 1.0f;
+ float c;
+ float s;
+ float r_expected = 1.41421356237f;
+ float z_expected = 1.41421356237f;
+ float c_expected = 0.707106781187f;
+ float s_expected = 0.707106781187f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 326)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 327)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 328)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 329)");
+ };
+
+
+ {
+ float a = 1.0f;
+ float b = 1.5f;
+ float c;
+ float s;
+ float r_expected = 1.80277563773f;
+ float z_expected = 1.80277563773f;
+ float c_expected = 0.554700196225f;
+ float s_expected = 0.832050294338f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 330)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 331)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 332)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 333)");
+ };
+
+
+ {
+ float a = 1.5f;
+ float b = -1.5f;
+ float c;
+ float s;
+ float r_expected = -2.12132034356f;
+ float z_expected = -1.41421356237f;
+ float c_expected = -0.707106781187f;
+ float s_expected = 0.707106781187f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 334)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 335)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 336)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 337)");
+ };
+
+
+ {
+ float a = 1.5f;
+ float b = -1.0f;
+ float c;
+ float s;
+ float r_expected = 1.80277563773f;
+ float z_expected = -0.554700196225f;
+ float c_expected = 0.832050294338f;
+ float s_expected = -0.554700196225f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 338)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 339)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 340)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 341)");
+ };
+
+
+ {
+ float a = 1.5f;
+ float b = -0.1f;
+ float c;
+ float s;
+ float r_expected = 1.50332963784f;
+ float z_expected = -0.0665190105238f;
+ float c_expected = 0.997785157857f;
+ float s_expected = -0.0665190105238f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 342)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 343)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 344)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 345)");
+ };
+
+
+ {
+ float a = 1.5f;
+ float b = 0.0f;
+ float c;
+ float s;
+ float r_expected = 1.5f;
+ float z_expected = 0.0f;
+ float c_expected = 1.0f;
+ float s_expected = 0.0f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 346)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 347)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 348)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 349)");
+ };
+
+
+ {
+ float a = 1.5f;
+ float b = 0.1f;
+ float c;
+ float s;
+ float r_expected = 1.50332963784f;
+ float z_expected = 0.0665190105238f;
+ float c_expected = 0.997785157857f;
+ float s_expected = 0.0665190105238f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 350)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 351)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 352)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 353)");
+ };
+
+
+ {
+ float a = 1.5f;
+ float b = 1.0f;
+ float c;
+ float s;
+ float r_expected = 1.80277563773f;
+ float z_expected = 0.554700196225f;
+ float c_expected = 0.832050294338f;
+ float s_expected = 0.554700196225f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 354)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 355)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 356)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 357)");
+ };
+
+
+ {
+ float a = 1.5f;
+ float b = 1.5f;
+ float c;
+ float s;
+ float r_expected = 2.12132034356f;
+ float z_expected = 1.41421356237f;
+ float c_expected = 0.707106781187f;
+ float s_expected = 0.707106781187f;
+ cblas_srotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, flteps, "srotg(case 358)");
+ gsl_test_rel(b, z_expected, flteps, "srotg(case 359)");
+ gsl_test_rel(c, c_expected, flteps, "srotg(case 360)");
+ gsl_test_rel(s, s_expected, flteps, "srotg(case 361)");
+ };
+
+
+ {
+ double a = -1.5;
+ double b = -1.5;
+ double c;
+ double s;
+ double r_expected = -2.12132034356;
+ double z_expected = 1.41421356237;
+ double c_expected = 0.707106781187;
+ double s_expected = 0.707106781187;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 362)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 363)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 364)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 365)");
+ };
+
+
+ {
+ double a = -1.5;
+ double b = -1;
+ double c;
+ double s;
+ double r_expected = -1.80277563773;
+ double z_expected = 0.554700196225;
+ double c_expected = 0.832050294338;
+ double s_expected = 0.554700196225;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 366)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 367)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 368)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 369)");
+ };
+
+
+ {
+ double a = -1.5;
+ double b = -0.1;
+ double c;
+ double s;
+ double r_expected = -1.50332963784;
+ double z_expected = 0.0665190105238;
+ double c_expected = 0.997785157857;
+ double s_expected = 0.0665190105238;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 370)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 371)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 372)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 373)");
+ };
+
+
+ {
+ double a = -1.5;
+ double b = 0;
+ double c;
+ double s;
+ double r_expected = -1.5;
+ double z_expected = -0;
+ double c_expected = 1;
+ double s_expected = -0;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 374)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 375)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 376)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 377)");
+ };
+
+
+ {
+ double a = -1.5;
+ double b = 0.1;
+ double c;
+ double s;
+ double r_expected = -1.50332963784;
+ double z_expected = -0.0665190105238;
+ double c_expected = 0.997785157857;
+ double s_expected = -0.0665190105238;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 378)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 379)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 380)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 381)");
+ };
+
+
+ {
+ double a = -1.5;
+ double b = 1;
+ double c;
+ double s;
+ double r_expected = -1.80277563773;
+ double z_expected = -0.554700196225;
+ double c_expected = 0.832050294338;
+ double s_expected = -0.554700196225;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 382)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 383)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 384)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 385)");
+ };
+
+
+ {
+ double a = -1.5;
+ double b = 1.5;
+ double c;
+ double s;
+ double r_expected = 2.12132034356;
+ double z_expected = -1.41421356237;
+ double c_expected = -0.707106781187;
+ double s_expected = 0.707106781187;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 386)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 387)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 388)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 389)");
+ };
+
+
+ {
+ double a = -1;
+ double b = -1.5;
+ double c;
+ double s;
+ double r_expected = -1.80277563773;
+ double z_expected = 1.80277563773;
+ double c_expected = 0.554700196225;
+ double s_expected = 0.832050294338;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 390)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 391)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 392)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 393)");
+ };
+
+
+ {
+ double a = -1;
+ double b = -1;
+ double c;
+ double s;
+ double r_expected = -1.41421356237;
+ double z_expected = 1.41421356237;
+ double c_expected = 0.707106781187;
+ double s_expected = 0.707106781187;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 394)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 395)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 396)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 397)");
+ };
+
+
+ {
+ double a = -1;
+ double b = -0.1;
+ double c;
+ double s;
+ double r_expected = -1.00498756211;
+ double z_expected = 0.099503719021;
+ double c_expected = 0.99503719021;
+ double s_expected = 0.099503719021;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 398)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 399)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 400)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 401)");
+ };
+
+
+ {
+ double a = -1;
+ double b = 0;
+ double c;
+ double s;
+ double r_expected = -1;
+ double z_expected = -0;
+ double c_expected = 1;
+ double s_expected = -0;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 402)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 403)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 404)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 405)");
+ };
+
+
+ {
+ double a = -1;
+ double b = 0.1;
+ double c;
+ double s;
+ double r_expected = -1.00498756211;
+ double z_expected = -0.099503719021;
+ double c_expected = 0.99503719021;
+ double s_expected = -0.099503719021;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 406)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 407)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 408)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 409)");
+ };
+
+
+ {
+ double a = -1;
+ double b = 1;
+ double c;
+ double s;
+ double r_expected = 1.41421356237;
+ double z_expected = -1.41421356237;
+ double c_expected = -0.707106781187;
+ double s_expected = 0.707106781187;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 410)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 411)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 412)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 413)");
+ };
+
+
+ {
+ double a = -1;
+ double b = 1.5;
+ double c;
+ double s;
+ double r_expected = 1.80277563773;
+ double z_expected = -1.80277563773;
+ double c_expected = -0.554700196225;
+ double s_expected = 0.832050294338;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 414)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 415)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 416)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 417)");
+ };
+
+
+ {
+ double a = -0.1;
+ double b = -1.5;
+ double c;
+ double s;
+ double r_expected = -1.50332963784;
+ double z_expected = 15.0332963784;
+ double c_expected = 0.0665190105238;
+ double s_expected = 0.997785157857;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 418)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 419)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 420)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 421)");
+ };
+
+
+ {
+ double a = -0.1;
+ double b = -1;
+ double c;
+ double s;
+ double r_expected = -1.00498756211;
+ double z_expected = 10.0498756211;
+ double c_expected = 0.099503719021;
+ double s_expected = 0.99503719021;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 422)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 423)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 424)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 425)");
+ };
+
+
+ {
+ double a = -0.1;
+ double b = -0.1;
+ double c;
+ double s;
+ double r_expected = -0.141421356237;
+ double z_expected = 1.41421356237;
+ double c_expected = 0.707106781187;
+ double s_expected = 0.707106781187;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 426)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 427)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 428)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 429)");
+ };
+
+
+ {
+ double a = -0.1;
+ double b = 0;
+ double c;
+ double s;
+ double r_expected = -0.1;
+ double z_expected = -0;
+ double c_expected = 1;
+ double s_expected = -0;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 430)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 431)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 432)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 433)");
+ };
+
+
+ {
+ double a = -0.1;
+ double b = 0.1;
+ double c;
+ double s;
+ double r_expected = 0.141421356237;
+ double z_expected = -1.41421356237;
+ double c_expected = -0.707106781187;
+ double s_expected = 0.707106781187;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 434)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 435)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 436)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 437)");
+ };
+
+
+ {
+ double a = -0.1;
+ double b = 1;
+ double c;
+ double s;
+ double r_expected = 1.00498756211;
+ double z_expected = -10.0498756211;
+ double c_expected = -0.099503719021;
+ double s_expected = 0.99503719021;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 438)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 439)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 440)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 441)");
+ };
+
+
+ {
+ double a = -0.1;
+ double b = 1.5;
+ double c;
+ double s;
+ double r_expected = 1.50332963784;
+ double z_expected = -15.0332963784;
+ double c_expected = -0.0665190105238;
+ double s_expected = 0.997785157857;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 442)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 443)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 444)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 445)");
+ };
+
+
+ {
+ double a = 0;
+ double b = -1.5;
+ double c;
+ double s;
+ double r_expected = -1.5;
+ double z_expected = 1;
+ double c_expected = -0;
+ double s_expected = 1;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 446)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 447)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 448)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 449)");
+ };
+
+
+ {
+ double a = 0;
+ double b = -1;
+ double c;
+ double s;
+ double r_expected = -1;
+ double z_expected = 1;
+ double c_expected = -0;
+ double s_expected = 1;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 450)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 451)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 452)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 453)");
+ };
+
+
+ {
+ double a = 0;
+ double b = -0.1;
+ double c;
+ double s;
+ double r_expected = -0.1;
+ double z_expected = 1;
+ double c_expected = -0;
+ double s_expected = 1;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 454)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 455)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 456)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 457)");
+ };
+
+
+ {
+ double a = 0;
+ double b = 0;
+ double c;
+ double s;
+ double r_expected = 0;
+ double z_expected = 0;
+ double c_expected = 1;
+ double s_expected = 0;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 458)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 459)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 460)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 461)");
+ };
+
+
+ {
+ double a = 0;
+ double b = 0.1;
+ double c;
+ double s;
+ double r_expected = 0.1;
+ double z_expected = 1;
+ double c_expected = 0;
+ double s_expected = 1;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 462)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 463)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 464)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 465)");
+ };
+
+
+ {
+ double a = 0;
+ double b = 1;
+ double c;
+ double s;
+ double r_expected = 1;
+ double z_expected = 1;
+ double c_expected = 0;
+ double s_expected = 1;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 466)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 467)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 468)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 469)");
+ };
+
+
+ {
+ double a = 0;
+ double b = 1.5;
+ double c;
+ double s;
+ double r_expected = 1.5;
+ double z_expected = 1;
+ double c_expected = 0;
+ double s_expected = 1;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 470)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 471)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 472)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 473)");
+ };
+
+
+ {
+ double a = 0.1;
+ double b = -1.5;
+ double c;
+ double s;
+ double r_expected = -1.50332963784;
+ double z_expected = -15.0332963784;
+ double c_expected = -0.0665190105238;
+ double s_expected = 0.997785157857;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 474)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 475)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 476)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 477)");
+ };
+
+
+ {
+ double a = 0.1;
+ double b = -1;
+ double c;
+ double s;
+ double r_expected = -1.00498756211;
+ double z_expected = -10.0498756211;
+ double c_expected = -0.099503719021;
+ double s_expected = 0.99503719021;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 478)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 479)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 480)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 481)");
+ };
+
+
+ {
+ double a = 0.1;
+ double b = -0.1;
+ double c;
+ double s;
+ double r_expected = -0.141421356237;
+ double z_expected = -1.41421356237;
+ double c_expected = -0.707106781187;
+ double s_expected = 0.707106781187;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 482)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 483)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 484)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 485)");
+ };
+
+
+ {
+ double a = 0.1;
+ double b = 0;
+ double c;
+ double s;
+ double r_expected = 0.1;
+ double z_expected = 0;
+ double c_expected = 1;
+ double s_expected = 0;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 486)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 487)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 488)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 489)");
+ };
+
+
+ {
+ double a = 0.1;
+ double b = 0.1;
+ double c;
+ double s;
+ double r_expected = 0.141421356237;
+ double z_expected = 1.41421356237;
+ double c_expected = 0.707106781187;
+ double s_expected = 0.707106781187;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 490)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 491)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 492)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 493)");
+ };
+
+
+ {
+ double a = 0.1;
+ double b = 1;
+ double c;
+ double s;
+ double r_expected = 1.00498756211;
+ double z_expected = 10.0498756211;
+ double c_expected = 0.099503719021;
+ double s_expected = 0.99503719021;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 494)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 495)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 496)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 497)");
+ };
+
+
+ {
+ double a = 0.1;
+ double b = 1.5;
+ double c;
+ double s;
+ double r_expected = 1.50332963784;
+ double z_expected = 15.0332963784;
+ double c_expected = 0.0665190105238;
+ double s_expected = 0.997785157857;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 498)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 499)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 500)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 501)");
+ };
+
+
+ {
+ double a = 1;
+ double b = -1.5;
+ double c;
+ double s;
+ double r_expected = -1.80277563773;
+ double z_expected = -1.80277563773;
+ double c_expected = -0.554700196225;
+ double s_expected = 0.832050294338;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 502)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 503)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 504)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 505)");
+ };
+
+
+ {
+ double a = 1;
+ double b = -1;
+ double c;
+ double s;
+ double r_expected = -1.41421356237;
+ double z_expected = -1.41421356237;
+ double c_expected = -0.707106781187;
+ double s_expected = 0.707106781187;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 506)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 507)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 508)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 509)");
+ };
+
+
+ {
+ double a = 1;
+ double b = -0.1;
+ double c;
+ double s;
+ double r_expected = 1.00498756211;
+ double z_expected = -0.099503719021;
+ double c_expected = 0.99503719021;
+ double s_expected = -0.099503719021;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 510)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 511)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 512)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 513)");
+ };
+
+
+ {
+ double a = 1;
+ double b = 0;
+ double c;
+ double s;
+ double r_expected = 1;
+ double z_expected = 0;
+ double c_expected = 1;
+ double s_expected = 0;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 514)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 515)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 516)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 517)");
+ };
+
+
+ {
+ double a = 1;
+ double b = 0.1;
+ double c;
+ double s;
+ double r_expected = 1.00498756211;
+ double z_expected = 0.099503719021;
+ double c_expected = 0.99503719021;
+ double s_expected = 0.099503719021;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 518)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 519)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 520)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 521)");
+ };
+
+
+ {
+ double a = 1;
+ double b = 1;
+ double c;
+ double s;
+ double r_expected = 1.41421356237;
+ double z_expected = 1.41421356237;
+ double c_expected = 0.707106781187;
+ double s_expected = 0.707106781187;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 522)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 523)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 524)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 525)");
+ };
+
+
+ {
+ double a = 1;
+ double b = 1.5;
+ double c;
+ double s;
+ double r_expected = 1.80277563773;
+ double z_expected = 1.80277563773;
+ double c_expected = 0.554700196225;
+ double s_expected = 0.832050294338;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 526)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 527)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 528)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 529)");
+ };
+
+
+ {
+ double a = 1.5;
+ double b = -1.5;
+ double c;
+ double s;
+ double r_expected = -2.12132034356;
+ double z_expected = -1.41421356237;
+ double c_expected = -0.707106781187;
+ double s_expected = 0.707106781187;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 530)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 531)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 532)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 533)");
+ };
+
+
+ {
+ double a = 1.5;
+ double b = -1;
+ double c;
+ double s;
+ double r_expected = 1.80277563773;
+ double z_expected = -0.554700196225;
+ double c_expected = 0.832050294338;
+ double s_expected = -0.554700196225;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 534)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 535)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 536)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 537)");
+ };
+
+
+ {
+ double a = 1.5;
+ double b = -0.1;
+ double c;
+ double s;
+ double r_expected = 1.50332963784;
+ double z_expected = -0.0665190105238;
+ double c_expected = 0.997785157857;
+ double s_expected = -0.0665190105238;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 538)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 539)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 540)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 541)");
+ };
+
+
+ {
+ double a = 1.5;
+ double b = 0;
+ double c;
+ double s;
+ double r_expected = 1.5;
+ double z_expected = 0;
+ double c_expected = 1;
+ double s_expected = 0;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 542)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 543)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 544)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 545)");
+ };
+
+
+ {
+ double a = 1.5;
+ double b = 0.1;
+ double c;
+ double s;
+ double r_expected = 1.50332963784;
+ double z_expected = 0.0665190105238;
+ double c_expected = 0.997785157857;
+ double s_expected = 0.0665190105238;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 546)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 547)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 548)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 549)");
+ };
+
+
+ {
+ double a = 1.5;
+ double b = 1;
+ double c;
+ double s;
+ double r_expected = 1.80277563773;
+ double z_expected = 0.554700196225;
+ double c_expected = 0.832050294338;
+ double s_expected = 0.554700196225;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 550)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 551)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 552)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 553)");
+ };
+
+
+ {
+ double a = 1.5;
+ double b = 1.5;
+ double c;
+ double s;
+ double r_expected = 2.12132034356;
+ double z_expected = 1.41421356237;
+ double c_expected = 0.707106781187;
+ double s_expected = 0.707106781187;
+ cblas_drotg(&a, &b, &c, &s);
+ gsl_test_rel(a, r_expected, dbleps, "drotg(case 554)");
+ gsl_test_rel(b, z_expected, dbleps, "drotg(case 555)");
+ gsl_test_rel(c, c_expected, dbleps, "drotg(case 556)");
+ gsl_test_rel(s, s_expected, dbleps, "drotg(case 557)");
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_rotm.c b/gsl-1.9/cblas/test_rotm.c
new file mode 100644
index 0000000..98783c5
--- /dev/null
+++ b/gsl-1.9/cblas/test_rotm.c
@@ -0,0 +1,1511 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_rotm (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ int N = 1;
+ float h[] = { -1.0f, -4.44982e+03f, -15.5826f, 7.091334e+04f, 2.95912e+04f };
+ float X[] = { -0.034f };
+ int incX = 1;
+ float Y[] = { -0.56f };
+ int incY = -1;
+ float x_expected[] = { -3.956017e+04f };
+ float y_expected[] = { -1.657054e+04f };
+ cblas_srotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "srotm(case 654)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "srotm(case 655)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float h[] = { 0.0f, 15.9728f, 6.400638e+03f, 1.733082e-05f, 1.524511e-04f };
+ float X[] = { -0.034f };
+ int incX = 1;
+ float Y[] = { -0.56f };
+ int incY = -1;
+ float x_expected[] = { -0.0340097f };
+ float y_expected[] = { -218.182f };
+ cblas_srotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "srotm(case 656)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "srotm(case 657)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float h[] = { 1.0f, 5.688411e+04f, 5.914789e+03f, 0.00210473f, 0.0231019f };
+ float X[] = { -0.034f };
+ int incX = 1;
+ float Y[] = { -0.56f };
+ int incY = -1;
+ float x_expected[] = { -1.93462e+03f };
+ float y_expected[] = { 0.0210629f };
+ cblas_srotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "srotm(case 658)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "srotm(case 659)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float h[] = { -2.0f, -0.582083f, 0.00103161f, -3.429851e-05f, 7.411469e-05f };
+ float X[] = { -0.034f };
+ int incX = 1;
+ float Y[] = { -0.56f };
+ int incY = -1;
+ float x_expected[] = { -0.034f };
+ float y_expected[] = { -0.56f };
+ cblas_srotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "srotm(case 660)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "srotm(case 661)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float h[] = { -1.0f, 115.163f, -6.715448e+04f, -258.695f, -16.2552f };
+ float X[] = { -0.034f };
+ int incX = 1;
+ float Y[] = { -0.56f };
+ int incY = -1;
+ float x_expected[] = { 140.954f };
+ float y_expected[] = { 2.292355e+03f };
+ cblas_srotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "srotm(case 662)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "srotm(case 663)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float h[] = { 0.0f, -3.314862e+03f, -442.976f, -214.586f, -25.9716f };
+ float X[] = { -0.034f };
+ int incX = 1;
+ float Y[] = { -0.56f };
+ int incY = -1;
+ float x_expected[] = { 120.134f };
+ float y_expected[] = { 14.5012f };
+ cblas_srotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "srotm(case 664)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "srotm(case 665)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float h[] = { 1.0f, -1.177304e+03f, -1.236662e-04f, -0.186585f, 1.15841f };
+ float X[] = { -0.034f };
+ int incX = 1;
+ float Y[] = { -0.56f };
+ int incY = -1;
+ float x_expected[] = { 39.4683f };
+ float y_expected[] = { -0.614711f };
+ cblas_srotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "srotm(case 666)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "srotm(case 667)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float h[] = { -2.0f, -88.9796f, 0.808226f, 1.106582e-05f, -0.00862288f };
+ float X[] = { -0.034f };
+ int incX = 1;
+ float Y[] = { -0.56f };
+ int incY = -1;
+ float x_expected[] = { -0.034f };
+ float y_expected[] = { -0.56f };
+ cblas_srotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "srotm(case 668)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "srotm(case 669)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float h[] = { -1.0f, -0.00225865f, 8.338551e+04f, -1.98282f, -2.409905e-05f };
+ float X[] = { -0.034f };
+ int incX = 1;
+ float Y[] = { -0.56f };
+ int incY = -1;
+ float x_expected[] = { 1.11046f };
+ float y_expected[] = { -2.835107e+03f };
+ cblas_srotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "srotm(case 670)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "srotm(case 671)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float h[] = { 0.0f, 0.258779f, 74.2802f, 0.923299f, 4.847128e+03f };
+ float X[] = { -0.034f };
+ int incX = 1;
+ float Y[] = { -0.56f };
+ int incY = -1;
+ float x_expected[] = { -0.551048f };
+ float y_expected[] = { -3.08553f };
+ cblas_srotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "srotm(case 672)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "srotm(case 673)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double h[] = { -1.0, -8.00850735044, 0.0204647351647, 1.898461360078e-04, -4.32701487194 };
+ double X[] = { 0.84 };
+ int incX = 1;
+ double Y[] = { -0.711 };
+ int incY = -1;
+ double x_expected[] = { -6.72728115497 };
+ double y_expected[] = { 3.09369795149 };
+ cblas_drotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "drotm(case 674)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "drotm(case 675)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double h[] = { 0.0, 1.230610998905e+04, 210.056650134, 9.20757074452, 2.072879691524e+03 };
+ double X[] = { 0.84 };
+ int incX = 1;
+ double Y[] = { -0.711 };
+ int incY = -1;
+ double x_expected[] = { -5.70658279935 };
+ double y_expected[] = { 175.736586112 };
+ cblas_drotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "drotm(case 676)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "drotm(case 677)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double h[] = { 1.0, -1.244580625511e+03, 1.11154682624, 2.269384716089e-05, -0.0143785338883 };
+ double X[] = { 0.84 };
+ int incX = 1;
+ double Y[] = { -0.711 };
+ int incY = -1;
+ double x_expected[] = { -1.046158725429e+03 };
+ double y_expected[] = { -0.829776862405 };
+ cblas_drotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "drotm(case 678)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "drotm(case 679)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double h[] = { -2.0, 293.927527276, -2.614737743134e+03, 10.3164975867, -7.947030813329e+03 };
+ double X[] = { 0.84 };
+ int incX = 1;
+ double Y[] = { -0.711 };
+ int incY = -1;
+ double x_expected[] = { 0.84 };
+ double y_expected[] = { -0.711 };
+ cblas_drotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "drotm(case 680)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "drotm(case 681)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double h[] = { -1.0, -0.0178609251786, 0.00983044958941, 105.944529127, 1.687350579234e-05 };
+ double X[] = { 0.84 };
+ int incX = 1;
+ double Y[] = { -0.711 };
+ int incY = -1;
+ double x_expected[] = { -75.3415633866 };
+ double y_expected[] = { 0.00824558059248 };
+ cblas_drotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "drotm(case 682)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "drotm(case 683)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double h[] = { 0.0, 6.241999071283e-05, 2.495425882445e+03, 304.604891146, 1.604644714854e+04 };
+ double X[] = { 0.84 };
+ int incX = 1;
+ double Y[] = { -0.711 };
+ int incY = -1;
+ double x_expected[] = { -215.734077605 };
+ double y_expected[] = { 2.095446741254e+03 };
+ cblas_drotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "drotm(case 684)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "drotm(case 685)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double h[] = { 1.0, -0.058097639487, 8.386083625428e+03, -10.5233229994, 184.653245391 };
+ double X[] = { 0.84 };
+ int incX = 1;
+ double Y[] = { -0.711 };
+ int incY = -1;
+ double x_expected[] = { -0.759802017169 };
+ double y_expected[] = { -132.128457473 };
+ cblas_drotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "drotm(case 686)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "drotm(case 687)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double h[] = { -2.0, -92.8754629217, 1.467547244529e-04, -3.197881072301e-04, -1.89874629713 };
+ double X[] = { 0.84 };
+ int incX = 1;
+ double Y[] = { -0.711 };
+ int incY = -1;
+ double x_expected[] = { 0.84 };
+ double y_expected[] = { -0.711 };
+ cblas_drotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "drotm(case 688)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "drotm(case 689)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double h[] = { -1.0, -0.0961996230646, -2.248344186185e-05, -316.856396787, 1.663969157848e+03 };
+ double X[] = { 0.84 };
+ int incX = 1;
+ double Y[] = { -0.711 };
+ int incY = -1;
+ double x_expected[] = { 225.204090432 };
+ double y_expected[] = { -1.183082090116e+03 };
+ cblas_drotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "drotm(case 690)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "drotm(case 691)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double h[] = { 0.0, -201.862043128, 4.999906166451e-04, -0.0653365534487, 586.454083328 };
+ double X[] = { 0.84 };
+ int incX = 1;
+ double Y[] = { -0.711 };
+ int incY = -1;
+ double x_expected[] = { 0.886454289502 };
+ double y_expected[] = { -0.710580007882 };
+ cblas_drotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "drotm(case 692)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "drotm(case 693)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float h[] = { -1.0f, 162.86f, 1.379231e-04f, 9.67285f, 0.929218f };
+ float X[] = { 0.629f };
+ int incX = -1;
+ float Y[] = { 0.386f };
+ int incY = 1;
+ float x_expected[] = { 106.173f };
+ float y_expected[] = { 0.358765f };
+ cblas_srotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "srotm(case 694)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "srotm(case 695)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float h[] = { 0.0f, 537.387f, -21.6404f, -1.017074e+03f, -1.730546e-05f };
+ float X[] = { 0.629f };
+ int incX = -1;
+ float Y[] = { 0.386f };
+ int incY = 1;
+ float x_expected[] = { -391.961f };
+ float y_expected[] = { -13.2258f };
+ cblas_srotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "srotm(case 696)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "srotm(case 697)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float h[] = { 1.0f, -1.339977e-05f, 0.00522784f, 2.020352e-05f, -0.0654088f };
+ float X[] = { 0.629f };
+ int incX = -1;
+ float Y[] = { 0.386f };
+ int incY = 1;
+ float x_expected[] = { 0.385992f };
+ float y_expected[] = { -0.654248f };
+ cblas_srotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "srotm(case 698)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "srotm(case 699)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float h[] = { -2.0f, -50.922f, 31.5261f, -0.194913f, 0.206417f };
+ float X[] = { 0.629f };
+ int incX = -1;
+ float Y[] = { 0.386f };
+ int incY = 1;
+ float x_expected[] = { 0.629f };
+ float y_expected[] = { 0.386f };
+ cblas_srotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "srotm(case 700)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "srotm(case 701)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float h[] = { -1.0f, 1.15659f, 2.599832e+04f, 435.891f, 1.546671e+03f };
+ float X[] = { 0.629f };
+ int incX = -1;
+ float Y[] = { 0.386f };
+ int incY = 1;
+ float x_expected[] = { 168.981f };
+ float y_expected[] = { 1.694996e+04f };
+ cblas_srotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "srotm(case 702)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "srotm(case 703)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float h[] = { 0.0f, 3.359889e-04f, -0.00134822f, -12.9136f, -5.655622e+04f };
+ float X[] = { 0.629f };
+ int incX = -1;
+ float Y[] = { 0.386f };
+ int incY = 1;
+ float x_expected[] = { -4.35566f };
+ float y_expected[] = { 0.385152f };
+ cblas_srotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "srotm(case 704)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "srotm(case 705)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float h[] = { 1.0f, 2.75119e-05f, 1.70314f, 18.4063f, 185.731f };
+ float X[] = { 0.629f };
+ int incX = -1;
+ float Y[] = { 0.386f };
+ int incY = 1;
+ float x_expected[] = { 0.386017f };
+ float y_expected[] = { 71.063f };
+ cblas_srotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "srotm(case 706)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "srotm(case 707)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float h[] = { -2.0f, -1.031009e-04f, -3.378602e+04f, 7.869358e-05f, 157.303f };
+ float X[] = { 0.629f };
+ int incX = -1;
+ float Y[] = { 0.386f };
+ int incY = 1;
+ float x_expected[] = { 0.629f };
+ float y_expected[] = { 0.386f };
+ cblas_srotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "srotm(case 708)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "srotm(case 709)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float h[] = { -1.0f, 0.00207419f, -89.9374f, -1.40414f, -25.1433f };
+ float X[] = { 0.629f };
+ int incX = -1;
+ float Y[] = { 0.386f };
+ int incY = 1;
+ float x_expected[] = { -0.540694f };
+ float y_expected[] = { -66.276f };
+ cblas_srotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "srotm(case 710)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "srotm(case 711)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float h[] = { 0.0f, -4.972562e+04f, 3.65698e-05f, 632.116f, 0.195207f };
+ float X[] = { 0.629f };
+ int incX = -1;
+ float Y[] = { 0.386f };
+ int incY = 1;
+ float x_expected[] = { 244.626f };
+ float y_expected[] = { 0.386023f };
+ cblas_srotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "srotm(case 712)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "srotm(case 713)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double h[] = { -1.0, 8.64768339859, -105.906731008, -347.053994991, -1.28802789909 };
+ double X[] = { -0.674 };
+ int incX = -1;
+ double Y[] = { -0.645 };
+ int incY = 1;
+ double x_expected[] = { 218.021288159 };
+ double y_expected[] = { 72.2119146942 };
+ cblas_drotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "drotm(case 714)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "drotm(case 715)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double h[] = { 0.0, 0.926057152065, 3.315158944851e-04, -1.203638835886e+03, 0.00197484344868 };
+ double X[] = { -0.674 };
+ int incX = -1;
+ double Y[] = { -0.645 };
+ int incY = 1;
+ double x_expected[] = { 775.673049147 };
+ double y_expected[] = { -0.645223441713 };
+ cblas_drotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "drotm(case 716)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "drotm(case 717)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double h[] = { 1.0, -9.404298701289e-05, -0.00380843381223, -0.0767212569647, -3.66628238398 };
+ double X[] = { -0.674 };
+ int incX = -1;
+ double Y[] = { -0.645 };
+ int incY = 1;
+ double x_expected[] = { -0.644936615027 };
+ double y_expected[] = { 3.03875213767 };
+ cblas_drotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "drotm(case 718)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "drotm(case 719)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double h[] = { -2.0, 0.0900662226146, 0.00250500071094, 6.46624826995, -2.159443948633e-05 };
+ double X[] = { -0.674 };
+ int incX = -1;
+ double Y[] = { -0.645 };
+ int incY = 1;
+ double x_expected[] = { -0.674 };
+ double y_expected[] = { -0.645 };
+ cblas_drotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "drotm(case 720)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "drotm(case 721)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double h[] = { -1.0, 8.011686652935e+03, -23.8989526115, -1.104879849207e+04, 0.108740065261 };
+ double X[] = { -0.674 };
+ int incX = -1;
+ double Y[] = { -0.645 };
+ int incY = 1;
+ double x_expected[] = { 1.726598223305e+03 };
+ double y_expected[] = { 16.0377567181 };
+ cblas_drotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "drotm(case 722)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "drotm(case 723)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double h[] = { 0.0, 5.162681717012e-05, 48.059409562, -4.701209666609e+04, -6.80333644488e+04 };
+ double X[] = { -0.674 };
+ int incX = -1;
+ double Y[] = { -0.645 };
+ int incY = 1;
+ double x_expected[] = { 3.032212834963e+04 };
+ double y_expected[] = { -33.0370420448 };
+ cblas_drotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "drotm(case 724)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "drotm(case 725)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double h[] = { 1.0, -5.554806445579e-04, 5.101973060197e+04, -5.932040237374e+03, 3.91045757161 };
+ double X[] = { -0.674 };
+ int incX = -1;
+ double Y[] = { -0.645 };
+ int incY = 1;
+ double x_expected[] = { -0.644625606046 };
+ double y_expected[] = { -1.84824513369 };
+ cblas_drotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "drotm(case 726)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "drotm(case 727)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double h[] = { -2.0, -1.697234884626e-05, 101.466514367, 5.772202675851e+03, -6.884724590773e-04 };
+ double X[] = { -0.674 };
+ int incX = -1;
+ double Y[] = { -0.645 };
+ int incY = 1;
+ double x_expected[] = { -0.674 };
+ double y_expected[] = { -0.645 };
+ cblas_drotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "drotm(case 728)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "drotm(case 729)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double h[] = { -1.0, -0.0199779342753, 13.013123509, -17.8393347684, 0.129333249919 };
+ double X[] = { -0.674 };
+ int incX = -1;
+ double Y[] = { -0.645 };
+ int incY = 1;
+ double x_expected[] = { 11.5198360534 };
+ double y_expected[] = { -8.85426519126 };
+ cblas_drotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "drotm(case 730)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "drotm(case 731)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double h[] = { 0.0, -6.673799053773e+04, 587.759435538, 3.493966594965e+04, 2.098374142331e-05 };
+ double X[] = { -0.674 };
+ int incX = -1;
+ double Y[] = { -0.645 };
+ int incY = 1;
+ double x_expected[] = { -2.253675853752e+04 };
+ double y_expected[] = { -396.794859553 };
+ cblas_drotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "drotm(case 732)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "drotm(case 733)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float h[] = { -1.0f, 0.070033f, 0.034824f, -0.00740144f, -0.153474f };
+ float X[] = { -0.111f };
+ int incX = -1;
+ float Y[] = { -0.103f };
+ int incY = -1;
+ float x_expected[] = { -0.00701131f };
+ float y_expected[] = { 0.0119423f };
+ cblas_srotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "srotm(case 734)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "srotm(case 735)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float h[] = { 0.0f, 7.618016e-04f, -0.00396806f, -92.8408f, -0.0018571f };
+ float X[] = { -0.111f };
+ int incX = -1;
+ float Y[] = { -0.103f };
+ int incY = -1;
+ float x_expected[] = { 9.4516f };
+ float y_expected[] = { -0.10256f };
+ cblas_srotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "srotm(case 736)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "srotm(case 737)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float h[] = { 1.0f, -5.833806e+03f, 0.00265668f, -587.573f, 0.0972416f };
+ float X[] = { -0.111f };
+ int incX = -1;
+ float Y[] = { -0.103f };
+ int incY = -1;
+ float x_expected[] = { 647.449f };
+ float y_expected[] = { 0.100984f };
+ cblas_srotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "srotm(case 738)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "srotm(case 739)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float h[] = { -2.0f, -8.93339e+04f, -5.16022e-05f, 2.589784e-05f, -7.52586f };
+ float X[] = { -0.111f };
+ int incX = -1;
+ float Y[] = { -0.103f };
+ int incY = -1;
+ float x_expected[] = { -0.111f };
+ float y_expected[] = { -0.103f };
+ cblas_srotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "srotm(case 740)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "srotm(case 741)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float h[] = { -1.0f, 0.125135f, 0.00586453f, 1.100694e-05f, -0.0137436f };
+ float X[] = { -0.111f };
+ int incX = -1;
+ float Y[] = { -0.103f };
+ int incY = -1;
+ float x_expected[] = { -0.0138912f };
+ float y_expected[] = { 7.64631e-04f };
+ cblas_srotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "srotm(case 742)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "srotm(case 743)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float h[] = { 0.0f, -0.0996414f, 0.00505806f, 1.321441e-05f, 1.151406e-04f };
+ float X[] = { -0.111f };
+ int incX = -1;
+ float Y[] = { -0.103f };
+ int incY = -1;
+ float x_expected[] = { -0.111001f };
+ float y_expected[] = { -0.103561f };
+ cblas_srotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "srotm(case 744)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "srotm(case 745)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float h[] = { 1.0f, 8.18165f, 169.902f, -1.453316e-05f, 1.539957e+03f };
+ float X[] = { -0.111f };
+ int incX = -1;
+ float Y[] = { -0.103f };
+ int incY = -1;
+ float x_expected[] = { -1.01116f };
+ float y_expected[] = { -158.505f };
+ cblas_srotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "srotm(case 746)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "srotm(case 747)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float h[] = { -2.0f, 1.827623e-04f, -0.0528808f, 24.7305f, 328.39f };
+ float X[] = { -0.111f };
+ int incX = -1;
+ float Y[] = { -0.103f };
+ int incY = -1;
+ float x_expected[] = { -0.111f };
+ float y_expected[] = { -0.103f };
+ cblas_srotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "srotm(case 748)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "srotm(case 749)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float h[] = { -1.0f, -0.0876053f, 7.858704e+04f, -4.758389e+03f, -0.0114841f };
+ float X[] = { -0.111f };
+ int incX = -1;
+ float Y[] = { -0.103f };
+ int incY = -1;
+ float x_expected[] = { 490.124f };
+ float y_expected[] = { -8.72316e+03f };
+ cblas_srotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "srotm(case 750)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "srotm(case 751)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float h[] = { 0.0f, 0.00192188f, -1.031412e-05f, -0.00123957f, 0.312197f };
+ float X[] = { -0.111f };
+ int incX = -1;
+ float Y[] = { -0.103f };
+ int incY = -1;
+ float x_expected[] = { -0.110872f };
+ float y_expected[] = { -0.102999f };
+ cblas_srotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "srotm(case 752)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "srotm(case 753)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double h[] = { -1.0, -0.0253351881542, -0.105247702585, -7.18405641016, -5.409804811228e+04 };
+ double X[] = { 0.203 };
+ int incX = -1;
+ double Y[] = { -0.03 };
+ int incY = -1;
+ double x_expected[] = { 0.21037864911 };
+ double y_expected[] = { 1.622920078085e+03 };
+ cblas_drotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "drotm(case 754)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "drotm(case 755)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double h[] = { 0.0, 8.503080247483e+03, -6.186691885896e-05, -0.201279925805, -5.810746179529e-05 };
+ double X[] = { 0.203 };
+ int incX = -1;
+ double Y[] = { -0.03 };
+ int incY = -1;
+ double x_expected[] = { 0.209038397774 };
+ double y_expected[] = { -0.0300125589845 };
+ cblas_drotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "drotm(case 756)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "drotm(case 757)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double h[] = { 1.0, 0.351101212426, 64.9574703355, 3.015315809025e-05, -5.291308403203e-04 };
+ double X[] = { 0.203 };
+ int incX = -1;
+ double Y[] = { -0.03 };
+ int incY = -1;
+ double x_expected[] = { 0.0412735461225 };
+ double y_expected[] = { -0.202984126075 };
+ cblas_drotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "drotm(case 758)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "drotm(case 759)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double h[] = { -2.0, 0.0220262018719, -0.00311338149392, -70.6413298654, 31.8952671416 };
+ double X[] = { 0.203 };
+ int incX = -1;
+ double Y[] = { -0.03 };
+ int incY = -1;
+ double x_expected[] = { 0.203 };
+ double y_expected[] = { -0.03 };
+ cblas_drotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "drotm(case 760)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "drotm(case 761)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double h[] = { -1.0, 1.549812806922e+04, -4.868519165134e+04, -5.230242596804e+04, 1.58043443456e+04 };
+ double X[] = { 0.203 };
+ int incX = -1;
+ double Y[] = { -0.03 };
+ int incY = -1;
+ double x_expected[] = { 4.715192777093e+03 };
+ double y_expected[] = { -1.035722423559e+04 };
+ cblas_drotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "drotm(case 762)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "drotm(case 763)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double h[] = { 0.0, -3.30917942895, -0.0100316602276, -0.0222191220411, -0.0881815578726 };
+ double X[] = { 0.203 };
+ int incX = -1;
+ double Y[] = { -0.03 };
+ int incY = -1;
+ double x_expected[] = { 0.203666573661 };
+ double y_expected[] = { -0.0320364270262 };
+ cblas_drotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "drotm(case 764)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "drotm(case 765)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double h[] = { 1.0, 5.68327898035, 1.646867755046e-04, -0.106527931872, -28.2458905362 };
+ double X[] = { 0.203 };
+ int incX = -1;
+ double Y[] = { -0.03 };
+ int incY = -1;
+ double x_expected[] = { 1.12370563301 };
+ double y_expected[] = { 0.644376716086 };
+ cblas_drotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "drotm(case 766)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "drotm(case 767)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double h[] = { -2.0, 2.20585352008, 1.117638462348e+03, -0.116329468158, 0.00362096329059 };
+ double X[] = { 0.203 };
+ int incX = -1;
+ double Y[] = { -0.03 };
+ int incY = -1;
+ double x_expected[] = { 0.203 };
+ double y_expected[] = { -0.03 };
+ cblas_drotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "drotm(case 768)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "drotm(case 769)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double h[] = { -1.0, -0.00182683798892, -2.288460066516e-05, -37.55844708, -9.54075659826e-05 };
+ double X[] = { 0.203 };
+ int incX = -1;
+ double Y[] = { -0.03 };
+ int incY = -1;
+ double x_expected[] = { 1.12638256429 };
+ double y_expected[] = { -1.783346955549e-06 };
+ cblas_drotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "drotm(case 770)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "drotm(case 771)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double h[] = { 0.0, 1.02690456955e-04, -20.1292302013, -1.703870486677e-04, 5.17477399477 };
+ double X[] = { 0.203 };
+ int incX = -1;
+ double Y[] = { -0.03 };
+ int incY = -1;
+ double x_expected[] = { 0.203005111611 };
+ double y_expected[] = { -4.11623373087 };
+ cblas_drotm(N, X, incX, Y, incY, h);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "drotm(case 772)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "drotm(case 773)");
+ }
+ };
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_rotmg.c b/gsl-1.9/cblas/test_rotmg.c
new file mode 100644
index 0000000..0a31250
--- /dev/null
+++ b/gsl-1.9/cblas/test_rotmg.c
@@ -0,0 +1,167 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_rotmg (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ float d1 = -1630.28519312f;
+ float d2 = 44320.1964703f;
+ float b1 = 1274.7681352f;
+ float b2 = 0.983006912864f;
+ float h[] = { -999.0f, -999.1f, -999.2f, -999.3f, -999.4f };
+ float d1_expected = 0.0f;
+ float d2_expected = 0.0f;
+ float b1_expected = 0.0f;
+ float h0_expected = -1.0f;
+ float h11_expected = 0.0f;
+ float h21_expected = 0.0f;
+ float h12_expected = 0.0f;
+ float h22_expected = 0.0f;
+ cblas_srotmg(&d1, &d2, &b1, b2, h);
+ gsl_test_rel(d1, d1_expected, flteps, "srotmg(case 606)");
+ gsl_test_rel(d2, d2_expected, flteps, "srotmg(case 607)");
+ gsl_test_rel(b1, b1_expected, flteps, "srotmg(case 608)");
+ gsl_test_rel(h[0], h0_expected, flteps, "srotmg(case 609)");
+ gsl_test_rel(h[1], h11_expected, flteps, "srotmg(case 610)");
+ gsl_test_rel(h[2], h21_expected, flteps, "srotmg(case 611)");
+ gsl_test_rel(h[3], h12_expected, flteps, "srotmg(case 612)");
+ gsl_test_rel(h[4], h22_expected, flteps, "srotmg(case 613)");
+ };
+
+
+ {
+ double d1 = 0.0890831089656;
+ double d2 = 24998.3892082;
+ double b1 = 34657.8864443;
+ double b2 = 1.27708980357;
+ double h[] = { -999.0, -999.1, -999.2, -999.3, -999.4 };
+ double d1_expected = 0.0890491788526;
+ double d2_expected = 24988.8677829;
+ double b1_expected = 34671.0920237;
+ double h0_expected = 0;
+ double h11_expected = -999.1;
+ double h21_expected = -3.6848461767e-05;
+ double h12_expected = 10.34036867;
+ double h22_expected = -999.4;
+ cblas_drotmg(&d1, &d2, &b1, b2, h);
+ gsl_test_rel(d1, d1_expected, dbleps, "drotmg(case 614)");
+ gsl_test_rel(d2, d2_expected, dbleps, "drotmg(case 615)");
+ gsl_test_rel(b1, b1_expected, dbleps, "drotmg(case 616)");
+ gsl_test_rel(h[0], h0_expected, dbleps, "drotmg(case 617)");
+ gsl_test_rel(h[1], h11_expected, dbleps, "drotmg(case 618)");
+ gsl_test_rel(h[2], h21_expected, dbleps, "drotmg(case 619)");
+ gsl_test_rel(h[3], h12_expected, dbleps, "drotmg(case 620)");
+ gsl_test_rel(h[4], h22_expected, dbleps, "drotmg(case 621)");
+ };
+
+
+ {
+ float d1 = 0.00100326116366f;
+ float d2 = -1.20359225232f;
+ float b1 = -7.45489498808f;
+ float b2 = 0.159616854019f;
+ float h[] = { -999.0f, -999.1f, -999.2f, -999.3f, -999.4f };
+ float d1_expected = 0.00222932574734f;
+ float d2_expected = -2.67447728926f;
+ float b1_expected = -3.35491869218f;
+ float h0_expected = 0.0f;
+ float h11_expected = -999.1f;
+ float h21_expected = 0.0214110130692f;
+ float h12_expected = 25.6863620142f;
+ float h22_expected = -999.4f;
+ cblas_srotmg(&d1, &d2, &b1, b2, h);
+ gsl_test_rel(d1, d1_expected, flteps, "srotmg(case 622)");
+ gsl_test_rel(d2, d2_expected, flteps, "srotmg(case 623)");
+ gsl_test_rel(b1, b1_expected, flteps, "srotmg(case 624)");
+ gsl_test_rel(h[0], h0_expected, flteps, "srotmg(case 625)");
+ gsl_test_rel(h[1], h11_expected, flteps, "srotmg(case 626)");
+ gsl_test_rel(h[2], h21_expected, flteps, "srotmg(case 627)");
+ gsl_test_rel(h[3], h12_expected, flteps, "srotmg(case 628)");
+ gsl_test_rel(h[4], h22_expected, flteps, "srotmg(case 629)");
+ };
+
+
+ {
+ double d1 = -49.1978123005;
+ double d2 = 0.228703451277;
+ double b1 = 1.8901039144;
+ double b2 = 7081.47754386;
+ double h[] = { -999.0, -999.1, -999.2, -999.3, -999.4 };
+ double d1_expected = 0;
+ double d2_expected = 0;
+ double b1_expected = 0;
+ double h0_expected = -1;
+ double h11_expected = 0;
+ double h21_expected = 0;
+ double h12_expected = 0;
+ double h22_expected = 0;
+ cblas_drotmg(&d1, &d2, &b1, b2, h);
+ gsl_test_rel(d1, d1_expected, dbleps, "drotmg(case 630)");
+ gsl_test_rel(d2, d2_expected, dbleps, "drotmg(case 631)");
+ gsl_test_rel(b1, b1_expected, dbleps, "drotmg(case 632)");
+ gsl_test_rel(h[0], h0_expected, dbleps, "drotmg(case 633)");
+ gsl_test_rel(h[1], h11_expected, dbleps, "drotmg(case 634)");
+ gsl_test_rel(h[2], h21_expected, dbleps, "drotmg(case 635)");
+ gsl_test_rel(h[3], h12_expected, dbleps, "drotmg(case 636)");
+ gsl_test_rel(h[4], h22_expected, dbleps, "drotmg(case 637)");
+ };
+
+
+ {
+ float d1 = 0.00760694276009f;
+ float d2 = -1.07649167228f;
+ float b1 = -22584.0076391f;
+ float b2 = -0.00305597817159f;
+ float h[] = { -999.0f, -999.1f, -999.2f, -999.3f, -999.4f };
+ float d1_expected = 0.00760694276011f;
+ float d2_expected = -1.07649167228f;
+ float b1_expected = -22584.007639f;
+ float h0_expected = 0.0f;
+ float h11_expected = -999.1f;
+ float h21_expected = -1.35316026298e-07f;
+ float h12_expected = -1.91491615001e-05f;
+ float h22_expected = -999.4f;
+ cblas_srotmg(&d1, &d2, &b1, b2, h);
+ gsl_test_rel(d1, d1_expected, flteps, "srotmg(case 638)");
+ gsl_test_rel(d2, d2_expected, flteps, "srotmg(case 639)");
+ gsl_test_rel(b1, b1_expected, flteps, "srotmg(case 640)");
+ gsl_test_rel(h[0], h0_expected, flteps, "srotmg(case 641)");
+ gsl_test_rel(h[1], h11_expected, flteps, "srotmg(case 642)");
+ gsl_test_rel(h[2], h21_expected, flteps, "srotmg(case 643)");
+ gsl_test_rel(h[3], h12_expected, flteps, "srotmg(case 644)");
+ gsl_test_rel(h[4], h22_expected, flteps, "srotmg(case 645)");
+ };
+
+
+ {
+ double d1 = 0.000283076346391;
+ double d2 = 20.1907649901;
+ double b1 = -0.274927034914;
+ double b2 = 18.6645358259;
+ double h[] = { -999.0, -999.1, -999.2, -999.3, -999.4 };
+ double d1_expected = 20.1907649287;
+ double d2_expected = 0.00028307634553;
+ double b1_expected = 18.6645358827;
+ double h0_expected = 1;
+ double h11_expected = -2.06514743478e-07;
+ double h21_expected = -999.2;
+ double h12_expected = -999.3;
+ double h22_expected = -0.0147299154652;
+ cblas_drotmg(&d1, &d2, &b1, b2, h);
+ gsl_test_rel(d1, d1_expected, dbleps, "drotmg(case 646)");
+ gsl_test_rel(d2, d2_expected, dbleps, "drotmg(case 647)");
+ gsl_test_rel(b1, b1_expected, dbleps, "drotmg(case 648)");
+ gsl_test_rel(h[0], h0_expected, dbleps, "drotmg(case 649)");
+ gsl_test_rel(h[1], h11_expected, dbleps, "drotmg(case 650)");
+ gsl_test_rel(h[2], h21_expected, dbleps, "drotmg(case 651)");
+ gsl_test_rel(h[3], h12_expected, dbleps, "drotmg(case 652)");
+ gsl_test_rel(h[4], h22_expected, dbleps, "drotmg(case 653)");
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_sbmv.c b/gsl-1.9/cblas/test_sbmv.c
new file mode 100644
index 0000000..a79fe22
--- /dev/null
+++ b/gsl-1.9/cblas/test_sbmv.c
@@ -0,0 +1,395 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_sbmv (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ int order = 101;
+ int uplo = 121;
+ float alpha = 1.0f;
+ float beta = 0.0f;
+ int N = 3;
+ int k = 1;
+ int lda = 3;
+ float A[] = { 0.627f, -0.312f, 0.031f, 0.308f, 0.323f, -0.578f, 0.797f, 0.545f, -0.476f };
+ float X[] = { -0.542f, 0.606f, 0.727f };
+ int incX = -1;
+ float Y[] = { 0.755f, 0.268f, -0.99f };
+ int incY = -1;
+ float y_expected[] = { -0.236236f, -0.215242f, 0.266757f };
+ cblas_ssbmv(order, uplo, N, k, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "ssbmv(case 1102)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ float alpha = 1.0f;
+ float beta = 0.0f;
+ int N = 3;
+ int k = 1;
+ int lda = 3;
+ float A[] = { 0.627f, -0.312f, 0.031f, 0.308f, 0.323f, -0.578f, 0.797f, 0.545f, -0.476f };
+ float X[] = { -0.542f, 0.606f, 0.727f };
+ int incX = -1;
+ float Y[] = { 0.755f, 0.268f, -0.99f };
+ int incY = -1;
+ float y_expected[] = { -0.236236f, -0.215242f, 0.266757f };
+ cblas_ssbmv(order, uplo, N, k, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "ssbmv(case 1103)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ float alpha = 1.0f;
+ float beta = 0.0f;
+ int N = 3;
+ int k = 1;
+ int lda = 3;
+ float A[] = { 0.627f, -0.312f, 0.031f, 0.308f, 0.323f, -0.578f, 0.797f, 0.545f, -0.476f };
+ float X[] = { -0.542f, 0.606f, 0.727f };
+ int incX = -1;
+ float Y[] = { 0.755f, 0.268f, -0.99f };
+ int incY = -1;
+ float y_expected[] = { 0.187592f, -0.01232f, -0.040176f };
+ cblas_ssbmv(order, uplo, N, k, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "ssbmv(case 1104)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ float alpha = 1.0f;
+ float beta = 0.0f;
+ int N = 3;
+ int k = 1;
+ int lda = 3;
+ float A[] = { 0.627f, -0.312f, 0.031f, 0.308f, 0.323f, -0.578f, 0.797f, 0.545f, -0.476f };
+ float X[] = { -0.542f, 0.606f, 0.727f };
+ int incX = -1;
+ float Y[] = { 0.755f, 0.268f, -0.99f };
+ int incY = -1;
+ float y_expected[] = { 0.187592f, -0.01232f, -0.040176f };
+ cblas_ssbmv(order, uplo, N, k, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "ssbmv(case 1105)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ float alpha = 1.0f;
+ float beta = 0.0f;
+ int N = 3;
+ int k = 1;
+ int lda = 3;
+ float A[] = { 0.627f, -0.312f, 0.031f, 0.308f, 0.323f, -0.578f, 0.797f, 0.545f, -0.476f };
+ float X[] = { -0.542f, 0.606f, 0.727f };
+ int incX = -1;
+ float Y[] = { 0.755f, 0.268f, -0.99f };
+ int incY = -1;
+ float y_expected[] = { 0.187592f, -0.01232f, -0.040176f };
+ cblas_ssbmv(order, uplo, N, k, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "ssbmv(case 1106)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ float alpha = 1.0f;
+ float beta = 0.0f;
+ int N = 3;
+ int k = 1;
+ int lda = 3;
+ float A[] = { 0.627f, -0.312f, 0.031f, 0.308f, 0.323f, -0.578f, 0.797f, 0.545f, -0.476f };
+ float X[] = { -0.542f, 0.606f, 0.727f };
+ int incX = -1;
+ float Y[] = { 0.755f, 0.268f, -0.99f };
+ int incY = -1;
+ float y_expected[] = { 0.187592f, -0.01232f, -0.040176f };
+ cblas_ssbmv(order, uplo, N, k, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "ssbmv(case 1107)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ float alpha = 1.0f;
+ float beta = 0.0f;
+ int N = 3;
+ int k = 1;
+ int lda = 3;
+ float A[] = { 0.627f, -0.312f, 0.031f, 0.308f, 0.323f, -0.578f, 0.797f, 0.545f, -0.476f };
+ float X[] = { -0.542f, 0.606f, 0.727f };
+ int incX = -1;
+ float Y[] = { 0.755f, 0.268f, -0.99f };
+ int incY = -1;
+ float y_expected[] = { -0.236236f, -0.215242f, 0.266757f };
+ cblas_ssbmv(order, uplo, N, k, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "ssbmv(case 1108)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ float alpha = 1.0f;
+ float beta = 0.0f;
+ int N = 3;
+ int k = 1;
+ int lda = 3;
+ float A[] = { 0.627f, -0.312f, 0.031f, 0.308f, 0.323f, -0.578f, 0.797f, 0.545f, -0.476f };
+ float X[] = { -0.542f, 0.606f, 0.727f };
+ int incX = -1;
+ float Y[] = { 0.755f, 0.268f, -0.99f };
+ int incY = -1;
+ float y_expected[] = { -0.236236f, -0.215242f, 0.266757f };
+ cblas_ssbmv(order, uplo, N, k, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "ssbmv(case 1109)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ double alpha = 0;
+ double beta = 1;
+ int N = 3;
+ int k = 1;
+ int lda = 3;
+ double A[] = { 0.83, -0.568, -0.888, 0.281, -0.779, -0.148, 0.138, 0.053, -0.757 };
+ double X[] = { 0.166, 0.808, 0.723 };
+ int incX = -1;
+ double Y[] = { 0.9, 0.99, -0.578 };
+ int incY = -1;
+ double y_expected[] = { 0.9, 0.99, -0.578 };
+ cblas_dsbmv(order, uplo, N, k, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "dsbmv(case 1110)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ double alpha = 0;
+ double beta = 1;
+ int N = 3;
+ int k = 1;
+ int lda = 3;
+ double A[] = { 0.83, -0.568, -0.888, 0.281, -0.779, -0.148, 0.138, 0.053, -0.757 };
+ double X[] = { 0.166, 0.808, 0.723 };
+ int incX = -1;
+ double Y[] = { 0.9, 0.99, -0.578 };
+ int incY = -1;
+ double y_expected[] = { 0.9, 0.99, -0.578 };
+ cblas_dsbmv(order, uplo, N, k, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "dsbmv(case 1111)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ double alpha = 0;
+ double beta = 1;
+ int N = 3;
+ int k = 1;
+ int lda = 3;
+ double A[] = { 0.83, -0.568, -0.888, 0.281, -0.779, -0.148, 0.138, 0.053, -0.757 };
+ double X[] = { 0.166, 0.808, 0.723 };
+ int incX = -1;
+ double Y[] = { 0.9, 0.99, -0.578 };
+ int incY = -1;
+ double y_expected[] = { 0.9, 0.99, -0.578 };
+ cblas_dsbmv(order, uplo, N, k, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "dsbmv(case 1112)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ double alpha = 0;
+ double beta = 1;
+ int N = 3;
+ int k = 1;
+ int lda = 3;
+ double A[] = { 0.83, -0.568, -0.888, 0.281, -0.779, -0.148, 0.138, 0.053, -0.757 };
+ double X[] = { 0.166, 0.808, 0.723 };
+ int incX = -1;
+ double Y[] = { 0.9, 0.99, -0.578 };
+ int incY = -1;
+ double y_expected[] = { 0.9, 0.99, -0.578 };
+ cblas_dsbmv(order, uplo, N, k, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "dsbmv(case 1113)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ double alpha = 0;
+ double beta = 1;
+ int N = 3;
+ int k = 1;
+ int lda = 3;
+ double A[] = { 0.83, -0.568, -0.888, 0.281, -0.779, -0.148, 0.138, 0.053, -0.757 };
+ double X[] = { 0.166, 0.808, 0.723 };
+ int incX = -1;
+ double Y[] = { 0.9, 0.99, -0.578 };
+ int incY = -1;
+ double y_expected[] = { 0.9, 0.99, -0.578 };
+ cblas_dsbmv(order, uplo, N, k, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "dsbmv(case 1114)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ double alpha = 0;
+ double beta = 1;
+ int N = 3;
+ int k = 1;
+ int lda = 3;
+ double A[] = { 0.83, -0.568, -0.888, 0.281, -0.779, -0.148, 0.138, 0.053, -0.757 };
+ double X[] = { 0.166, 0.808, 0.723 };
+ int incX = -1;
+ double Y[] = { 0.9, 0.99, -0.578 };
+ int incY = -1;
+ double y_expected[] = { 0.9, 0.99, -0.578 };
+ cblas_dsbmv(order, uplo, N, k, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "dsbmv(case 1115)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ double alpha = 0;
+ double beta = 1;
+ int N = 3;
+ int k = 1;
+ int lda = 3;
+ double A[] = { 0.83, -0.568, -0.888, 0.281, -0.779, -0.148, 0.138, 0.053, -0.757 };
+ double X[] = { 0.166, 0.808, 0.723 };
+ int incX = -1;
+ double Y[] = { 0.9, 0.99, -0.578 };
+ int incY = -1;
+ double y_expected[] = { 0.9, 0.99, -0.578 };
+ cblas_dsbmv(order, uplo, N, k, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "dsbmv(case 1116)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ double alpha = 0;
+ double beta = 1;
+ int N = 3;
+ int k = 1;
+ int lda = 3;
+ double A[] = { 0.83, -0.568, -0.888, 0.281, -0.779, -0.148, 0.138, 0.053, -0.757 };
+ double X[] = { 0.166, 0.808, 0.723 };
+ int incX = -1;
+ double Y[] = { 0.9, 0.99, -0.578 };
+ int incY = -1;
+ double y_expected[] = { 0.9, 0.99, -0.578 };
+ cblas_dsbmv(order, uplo, N, k, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "dsbmv(case 1117)");
+ }
+ };
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_scal.c b/gsl-1.9/cblas/test_scal.c
new file mode 100644
index 0000000..a7cdd4b
--- /dev/null
+++ b/gsl-1.9/cblas/test_scal.c
@@ -0,0 +1,911 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_scal (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ int N = 1;
+ float alpha = 0.0f;
+ float X[] = { 0.651f };
+ int incX = -1;
+ float expected[] = { 0.651f };
+ cblas_sscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], expected[i], flteps, "sscal(case 112)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float alpha = 0.1f;
+ float X[] = { 0.651f };
+ int incX = -1;
+ float expected[] = { 0.651f };
+ cblas_sscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], expected[i], flteps, "sscal(case 113)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float alpha = 1.0f;
+ float X[] = { 0.651f };
+ int incX = -1;
+ float expected[] = { 0.651f };
+ cblas_sscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], expected[i], flteps, "sscal(case 114)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double alpha = 0;
+ double X[] = { 0.686 };
+ int incX = -1;
+ double expected[] = { 0.686 };
+ cblas_dscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], expected[i], dbleps, "dscal(case 115)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double alpha = 0.1;
+ double X[] = { 0.686 };
+ int incX = -1;
+ double expected[] = { 0.686 };
+ cblas_dscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], expected[i], dbleps, "dscal(case 116)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double alpha = 1;
+ double X[] = { 0.686 };
+ int incX = -1;
+ double expected[] = { 0.686 };
+ cblas_dscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], expected[i], dbleps, "dscal(case 117)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float alpha[2] = {0.0f, 0.0f};
+ float X[] = { 0.986f, -0.775f };
+ int incX = -1;
+ float expected[] = { 0.986f, -0.775f };
+ cblas_cscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], expected[2*i], flteps, "cscal(case 118) real");
+ gsl_test_rel(X[2*i+1], expected[2*i+1], flteps, "cscal(case 118) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 1;
+ float alpha[2] = {0.1f, 0.0f};
+ float X[] = { 0.986f, -0.775f };
+ int incX = -1;
+ float expected[] = { 0.986f, -0.775f };
+ cblas_cscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], expected[2*i], flteps, "cscal(case 119) real");
+ gsl_test_rel(X[2*i+1], expected[2*i+1], flteps, "cscal(case 119) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 1;
+ float alpha[2] = {1.0f, 0.0f};
+ float X[] = { 0.986f, -0.775f };
+ int incX = -1;
+ float expected[] = { 0.986f, -0.775f };
+ cblas_cscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], expected[2*i], flteps, "cscal(case 120) real");
+ gsl_test_rel(X[2*i+1], expected[2*i+1], flteps, "cscal(case 120) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 1;
+ float alpha[2] = {0.0f, 0.1f};
+ float X[] = { 0.986f, -0.775f };
+ int incX = -1;
+ float expected[] = { 0.986f, -0.775f };
+ cblas_cscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], expected[2*i], flteps, "cscal(case 121) real");
+ gsl_test_rel(X[2*i+1], expected[2*i+1], flteps, "cscal(case 121) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 1;
+ float alpha[2] = {0.1f, 0.2f};
+ float X[] = { 0.986f, -0.775f };
+ int incX = -1;
+ float expected[] = { 0.986f, -0.775f };
+ cblas_cscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], expected[2*i], flteps, "cscal(case 122) real");
+ gsl_test_rel(X[2*i+1], expected[2*i+1], flteps, "cscal(case 122) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 1;
+ float alpha[2] = {1.0f, 0.3f};
+ float X[] = { 0.986f, -0.775f };
+ int incX = -1;
+ float expected[] = { 0.986f, -0.775f };
+ cblas_cscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], expected[2*i], flteps, "cscal(case 123) real");
+ gsl_test_rel(X[2*i+1], expected[2*i+1], flteps, "cscal(case 123) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 1;
+ double alpha[2] = {0, 0};
+ double X[] = { 0.454, -0.478 };
+ int incX = -1;
+ double expected[] = { 0.454, -0.478 };
+ cblas_zscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], expected[2*i], dbleps, "zscal(case 124) real");
+ gsl_test_rel(X[2*i+1], expected[2*i+1], dbleps, "zscal(case 124) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 1;
+ double alpha[2] = {0.1, 0};
+ double X[] = { 0.454, -0.478 };
+ int incX = -1;
+ double expected[] = { 0.454, -0.478 };
+ cblas_zscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], expected[2*i], dbleps, "zscal(case 125) real");
+ gsl_test_rel(X[2*i+1], expected[2*i+1], dbleps, "zscal(case 125) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 1;
+ double alpha[2] = {1, 0};
+ double X[] = { 0.454, -0.478 };
+ int incX = -1;
+ double expected[] = { 0.454, -0.478 };
+ cblas_zscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], expected[2*i], dbleps, "zscal(case 126) real");
+ gsl_test_rel(X[2*i+1], expected[2*i+1], dbleps, "zscal(case 126) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 1;
+ double alpha[2] = {0, 0.1};
+ double X[] = { 0.454, -0.478 };
+ int incX = -1;
+ double expected[] = { 0.454, -0.478 };
+ cblas_zscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], expected[2*i], dbleps, "zscal(case 127) real");
+ gsl_test_rel(X[2*i+1], expected[2*i+1], dbleps, "zscal(case 127) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 1;
+ double alpha[2] = {0.1, 0.2};
+ double X[] = { 0.454, -0.478 };
+ int incX = -1;
+ double expected[] = { 0.454, -0.478 };
+ cblas_zscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], expected[2*i], dbleps, "zscal(case 128) real");
+ gsl_test_rel(X[2*i+1], expected[2*i+1], dbleps, "zscal(case 128) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 1;
+ double alpha[2] = {1, 0.3};
+ double X[] = { 0.454, -0.478 };
+ int incX = -1;
+ double expected[] = { 0.454, -0.478 };
+ cblas_zscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], expected[2*i], dbleps, "zscal(case 129) real");
+ gsl_test_rel(X[2*i+1], expected[2*i+1], dbleps, "zscal(case 129) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 2;
+ float alpha = 0.0f;
+ float X[] = { 0.389f, -0.236f };
+ int incX = 1;
+ float expected[] = { 0.0f, -0.0f };
+ cblas_sscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], expected[i], flteps, "sscal(case 130)");
+ }
+ };
+ };
+
+
+ {
+ int N = 2;
+ float alpha = 0.1f;
+ float X[] = { 0.389f, -0.236f };
+ int incX = 1;
+ float expected[] = { 0.0389f, -0.0236f };
+ cblas_sscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], expected[i], flteps, "sscal(case 131)");
+ }
+ };
+ };
+
+
+ {
+ int N = 2;
+ float alpha = 1.0f;
+ float X[] = { 0.389f, -0.236f };
+ int incX = 1;
+ float expected[] = { 0.389f, -0.236f };
+ cblas_sscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], expected[i], flteps, "sscal(case 132)");
+ }
+ };
+ };
+
+
+ {
+ int N = 2;
+ double alpha = 0;
+ double X[] = { -0.429, -0.183 };
+ int incX = 1;
+ double expected[] = { -0.0, -0.0 };
+ cblas_dscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], expected[i], dbleps, "dscal(case 133)");
+ }
+ };
+ };
+
+
+ {
+ int N = 2;
+ double alpha = 0.1;
+ double X[] = { -0.429, -0.183 };
+ int incX = 1;
+ double expected[] = { -0.0429, -0.0183 };
+ cblas_dscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], expected[i], dbleps, "dscal(case 134)");
+ }
+ };
+ };
+
+
+ {
+ int N = 2;
+ double alpha = 1;
+ double X[] = { -0.429, -0.183 };
+ int incX = 1;
+ double expected[] = { -0.429, -0.183 };
+ cblas_dscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], expected[i], dbleps, "dscal(case 135)");
+ }
+ };
+ };
+
+
+ {
+ int N = 2;
+ float alpha[2] = {0.0f, 0.0f};
+ float X[] = { -0.603f, 0.239f, 0.339f, -0.58f };
+ int incX = 1;
+ float expected[] = { -0.0f, 0.0f, 0.0f, 0.0f };
+ cblas_cscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], expected[2*i], flteps, "cscal(case 136) real");
+ gsl_test_rel(X[2*i+1], expected[2*i+1], flteps, "cscal(case 136) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 2;
+ float alpha[2] = {0.1f, 0.0f};
+ float X[] = { -0.603f, 0.239f, 0.339f, -0.58f };
+ int incX = 1;
+ float expected[] = { -0.0603f, 0.0239f, 0.0339f, -0.058f };
+ cblas_cscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], expected[2*i], flteps, "cscal(case 137) real");
+ gsl_test_rel(X[2*i+1], expected[2*i+1], flteps, "cscal(case 137) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 2;
+ float alpha[2] = {1.0f, 0.0f};
+ float X[] = { -0.603f, 0.239f, 0.339f, -0.58f };
+ int incX = 1;
+ float expected[] = { -0.603f, 0.239f, 0.339f, -0.58f };
+ cblas_cscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], expected[2*i], flteps, "cscal(case 138) real");
+ gsl_test_rel(X[2*i+1], expected[2*i+1], flteps, "cscal(case 138) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 2;
+ float alpha[2] = {0.0f, 0.1f};
+ float X[] = { -0.603f, 0.239f, 0.339f, -0.58f };
+ int incX = 1;
+ float expected[] = { -0.0239f, -0.0603f, 0.058f, 0.0339f };
+ cblas_cscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], expected[2*i], flteps, "cscal(case 139) real");
+ gsl_test_rel(X[2*i+1], expected[2*i+1], flteps, "cscal(case 139) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 2;
+ float alpha[2] = {0.1f, 0.2f};
+ float X[] = { -0.603f, 0.239f, 0.339f, -0.58f };
+ int incX = 1;
+ float expected[] = { -0.1081f, -0.0967f, 0.1499f, 0.0098f };
+ cblas_cscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], expected[2*i], flteps, "cscal(case 140) real");
+ gsl_test_rel(X[2*i+1], expected[2*i+1], flteps, "cscal(case 140) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 2;
+ float alpha[2] = {1.0f, 0.3f};
+ float X[] = { -0.603f, 0.239f, 0.339f, -0.58f };
+ int incX = 1;
+ float expected[] = { -0.6747f, 0.0581f, 0.513f, -0.4783f };
+ cblas_cscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], expected[2*i], flteps, "cscal(case 141) real");
+ gsl_test_rel(X[2*i+1], expected[2*i+1], flteps, "cscal(case 141) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 2;
+ double alpha[2] = {0, 0};
+ double X[] = { -0.956, 0.613, 0.443, 0.503 };
+ int incX = 1;
+ double expected[] = { -0.0, 0.0, 0.0, 0.0 };
+ cblas_zscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], expected[2*i], dbleps, "zscal(case 142) real");
+ gsl_test_rel(X[2*i+1], expected[2*i+1], dbleps, "zscal(case 142) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 2;
+ double alpha[2] = {0.1, 0};
+ double X[] = { -0.956, 0.613, 0.443, 0.503 };
+ int incX = 1;
+ double expected[] = { -0.0956, 0.0613, 0.0443, 0.0503 };
+ cblas_zscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], expected[2*i], dbleps, "zscal(case 143) real");
+ gsl_test_rel(X[2*i+1], expected[2*i+1], dbleps, "zscal(case 143) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 2;
+ double alpha[2] = {1, 0};
+ double X[] = { -0.956, 0.613, 0.443, 0.503 };
+ int incX = 1;
+ double expected[] = { -0.956, 0.613, 0.443, 0.503 };
+ cblas_zscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], expected[2*i], dbleps, "zscal(case 144) real");
+ gsl_test_rel(X[2*i+1], expected[2*i+1], dbleps, "zscal(case 144) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 2;
+ double alpha[2] = {0, 0.1};
+ double X[] = { -0.956, 0.613, 0.443, 0.503 };
+ int incX = 1;
+ double expected[] = { -0.0613, -0.0956, -0.0503, 0.0443 };
+ cblas_zscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], expected[2*i], dbleps, "zscal(case 145) real");
+ gsl_test_rel(X[2*i+1], expected[2*i+1], dbleps, "zscal(case 145) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 2;
+ double alpha[2] = {0.1, 0.2};
+ double X[] = { -0.956, 0.613, 0.443, 0.503 };
+ int incX = 1;
+ double expected[] = { -0.2182, -0.1299, -0.0563, 0.1389 };
+ cblas_zscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], expected[2*i], dbleps, "zscal(case 146) real");
+ gsl_test_rel(X[2*i+1], expected[2*i+1], dbleps, "zscal(case 146) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 2;
+ double alpha[2] = {1, 0.3};
+ double X[] = { -0.956, 0.613, 0.443, 0.503 };
+ int incX = 1;
+ double expected[] = { -1.1399, 0.3262, 0.2921, 0.6359 };
+ cblas_zscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], expected[2*i], dbleps, "zscal(case 147) real");
+ gsl_test_rel(X[2*i+1], expected[2*i+1], dbleps, "zscal(case 147) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 2;
+ float alpha = 0.0f;
+ float X[] = { 0.629f, -0.419f };
+ int incX = -1;
+ float expected[] = { 0.629f, -0.419f };
+ cblas_sscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], expected[i], flteps, "sscal(case 148)");
+ }
+ };
+ };
+
+
+ {
+ int N = 2;
+ float alpha = 0.1f;
+ float X[] = { 0.629f, -0.419f };
+ int incX = -1;
+ float expected[] = { 0.629f, -0.419f };
+ cblas_sscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], expected[i], flteps, "sscal(case 149)");
+ }
+ };
+ };
+
+
+ {
+ int N = 2;
+ float alpha = 1.0f;
+ float X[] = { 0.629f, -0.419f };
+ int incX = -1;
+ float expected[] = { 0.629f, -0.419f };
+ cblas_sscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], expected[i], flteps, "sscal(case 150)");
+ }
+ };
+ };
+
+
+ {
+ int N = 2;
+ double alpha = 0;
+ double X[] = { 0.398, -0.656 };
+ int incX = -1;
+ double expected[] = { 0.398, -0.656 };
+ cblas_dscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], expected[i], dbleps, "dscal(case 151)");
+ }
+ };
+ };
+
+
+ {
+ int N = 2;
+ double alpha = 0.1;
+ double X[] = { 0.398, -0.656 };
+ int incX = -1;
+ double expected[] = { 0.398, -0.656 };
+ cblas_dscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], expected[i], dbleps, "dscal(case 152)");
+ }
+ };
+ };
+
+
+ {
+ int N = 2;
+ double alpha = 1;
+ double X[] = { 0.398, -0.656 };
+ int incX = -1;
+ double expected[] = { 0.398, -0.656 };
+ cblas_dscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], expected[i], dbleps, "dscal(case 153)");
+ }
+ };
+ };
+
+
+ {
+ int N = 2;
+ float alpha[2] = {0.0f, 0.0f};
+ float X[] = { 0.736f, 0.331f, -0.318f, 0.622f };
+ int incX = -1;
+ float expected[] = { 0.736f, 0.331f, -0.318f, 0.622f };
+ cblas_cscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], expected[2*i], flteps, "cscal(case 154) real");
+ gsl_test_rel(X[2*i+1], expected[2*i+1], flteps, "cscal(case 154) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 2;
+ float alpha[2] = {0.1f, 0.0f};
+ float X[] = { 0.736f, 0.331f, -0.318f, 0.622f };
+ int incX = -1;
+ float expected[] = { 0.736f, 0.331f, -0.318f, 0.622f };
+ cblas_cscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], expected[2*i], flteps, "cscal(case 155) real");
+ gsl_test_rel(X[2*i+1], expected[2*i+1], flteps, "cscal(case 155) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 2;
+ float alpha[2] = {1.0f, 0.0f};
+ float X[] = { 0.736f, 0.331f, -0.318f, 0.622f };
+ int incX = -1;
+ float expected[] = { 0.736f, 0.331f, -0.318f, 0.622f };
+ cblas_cscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], expected[2*i], flteps, "cscal(case 156) real");
+ gsl_test_rel(X[2*i+1], expected[2*i+1], flteps, "cscal(case 156) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 2;
+ float alpha[2] = {0.0f, 0.1f};
+ float X[] = { 0.736f, 0.331f, -0.318f, 0.622f };
+ int incX = -1;
+ float expected[] = { 0.736f, 0.331f, -0.318f, 0.622f };
+ cblas_cscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], expected[2*i], flteps, "cscal(case 157) real");
+ gsl_test_rel(X[2*i+1], expected[2*i+1], flteps, "cscal(case 157) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 2;
+ float alpha[2] = {0.1f, 0.2f};
+ float X[] = { 0.736f, 0.331f, -0.318f, 0.622f };
+ int incX = -1;
+ float expected[] = { 0.736f, 0.331f, -0.318f, 0.622f };
+ cblas_cscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], expected[2*i], flteps, "cscal(case 158) real");
+ gsl_test_rel(X[2*i+1], expected[2*i+1], flteps, "cscal(case 158) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 2;
+ float alpha[2] = {1.0f, 0.3f};
+ float X[] = { 0.736f, 0.331f, -0.318f, 0.622f };
+ int incX = -1;
+ float expected[] = { 0.736f, 0.331f, -0.318f, 0.622f };
+ cblas_cscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], expected[2*i], flteps, "cscal(case 159) real");
+ gsl_test_rel(X[2*i+1], expected[2*i+1], flteps, "cscal(case 159) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 2;
+ double alpha[2] = {0, 0};
+ double X[] = { 0.521, -0.811, 0.556, -0.147 };
+ int incX = -1;
+ double expected[] = { 0.521, -0.811, 0.556, -0.147 };
+ cblas_zscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], expected[2*i], dbleps, "zscal(case 160) real");
+ gsl_test_rel(X[2*i+1], expected[2*i+1], dbleps, "zscal(case 160) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 2;
+ double alpha[2] = {0.1, 0};
+ double X[] = { 0.521, -0.811, 0.556, -0.147 };
+ int incX = -1;
+ double expected[] = { 0.521, -0.811, 0.556, -0.147 };
+ cblas_zscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], expected[2*i], dbleps, "zscal(case 161) real");
+ gsl_test_rel(X[2*i+1], expected[2*i+1], dbleps, "zscal(case 161) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 2;
+ double alpha[2] = {1, 0};
+ double X[] = { 0.521, -0.811, 0.556, -0.147 };
+ int incX = -1;
+ double expected[] = { 0.521, -0.811, 0.556, -0.147 };
+ cblas_zscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], expected[2*i], dbleps, "zscal(case 162) real");
+ gsl_test_rel(X[2*i+1], expected[2*i+1], dbleps, "zscal(case 162) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 2;
+ double alpha[2] = {0, 0.1};
+ double X[] = { 0.521, -0.811, 0.556, -0.147 };
+ int incX = -1;
+ double expected[] = { 0.521, -0.811, 0.556, -0.147 };
+ cblas_zscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], expected[2*i], dbleps, "zscal(case 163) real");
+ gsl_test_rel(X[2*i+1], expected[2*i+1], dbleps, "zscal(case 163) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 2;
+ double alpha[2] = {0.1, 0.2};
+ double X[] = { 0.521, -0.811, 0.556, -0.147 };
+ int incX = -1;
+ double expected[] = { 0.521, -0.811, 0.556, -0.147 };
+ cblas_zscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], expected[2*i], dbleps, "zscal(case 164) real");
+ gsl_test_rel(X[2*i+1], expected[2*i+1], dbleps, "zscal(case 164) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 2;
+ double alpha[2] = {1, 0.3};
+ double X[] = { 0.521, -0.811, 0.556, -0.147 };
+ int incX = -1;
+ double expected[] = { 0.521, -0.811, 0.556, -0.147 };
+ cblas_zscal(N, alpha, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], expected[2*i], dbleps, "zscal(case 165) real");
+ gsl_test_rel(X[2*i+1], expected[2*i+1], dbleps, "zscal(case 165) imag");
+ };
+ };
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_spmv.c b/gsl-1.9/cblas/test_spmv.c
new file mode 100644
index 0000000..d49b48b
--- /dev/null
+++ b/gsl-1.9/cblas/test_spmv.c
@@ -0,0 +1,363 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_spmv (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ int order = 101;
+ int uplo = 121;
+ float alpha = 0.1f;
+ float beta = -0.3f;
+ int N = 2;
+ float A[] = { -0.174f, 0.878f, 0.478f };
+ float X[] = { 0.503f, 0.313f };
+ int incX = -1;
+ float Y[] = { -0.565f, -0.109f };
+ int incY = -1;
+ float y_expected[] = { 0.221025f, 0.0714172f };
+ cblas_sspmv(order, uplo, N, alpha, A, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "sspmv(case 1134)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ float alpha = 0.1f;
+ float beta = -0.3f;
+ int N = 2;
+ float A[] = { -0.174f, 0.878f, 0.478f };
+ float X[] = { 0.503f, 0.313f };
+ int incX = -1;
+ float Y[] = { -0.565f, -0.109f };
+ int incY = -1;
+ float y_expected[] = { 0.221025f, 0.0714172f };
+ cblas_sspmv(order, uplo, N, alpha, A, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "sspmv(case 1135)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ float alpha = 0.1f;
+ float beta = -0.3f;
+ int N = 2;
+ float A[] = { -0.174f, 0.878f, 0.478f };
+ float X[] = { 0.503f, 0.313f };
+ int incX = -1;
+ float Y[] = { -0.565f, -0.109f };
+ int incY = -1;
+ float y_expected[] = { 0.221025f, 0.0714172f };
+ cblas_sspmv(order, uplo, N, alpha, A, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "sspmv(case 1136)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ float alpha = 0.1f;
+ float beta = -0.3f;
+ int N = 2;
+ float A[] = { -0.174f, 0.878f, 0.478f };
+ float X[] = { 0.503f, 0.313f };
+ int incX = -1;
+ float Y[] = { -0.565f, -0.109f };
+ int incY = -1;
+ float y_expected[] = { 0.221025f, 0.0714172f };
+ cblas_sspmv(order, uplo, N, alpha, A, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "sspmv(case 1137)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ float alpha = 0.1f;
+ float beta = -0.3f;
+ int N = 2;
+ float A[] = { -0.174f, 0.878f, 0.478f };
+ float X[] = { 0.503f, 0.313f };
+ int incX = -1;
+ float Y[] = { -0.565f, -0.109f };
+ int incY = -1;
+ float y_expected[] = { 0.221025f, 0.0714172f };
+ cblas_sspmv(order, uplo, N, alpha, A, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "sspmv(case 1138)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ float alpha = 0.1f;
+ float beta = -0.3f;
+ int N = 2;
+ float A[] = { -0.174f, 0.878f, 0.478f };
+ float X[] = { 0.503f, 0.313f };
+ int incX = -1;
+ float Y[] = { -0.565f, -0.109f };
+ int incY = -1;
+ float y_expected[] = { 0.221025f, 0.0714172f };
+ cblas_sspmv(order, uplo, N, alpha, A, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "sspmv(case 1139)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ float alpha = 0.1f;
+ float beta = -0.3f;
+ int N = 2;
+ float A[] = { -0.174f, 0.878f, 0.478f };
+ float X[] = { 0.503f, 0.313f };
+ int incX = -1;
+ float Y[] = { -0.565f, -0.109f };
+ int incY = -1;
+ float y_expected[] = { 0.221025f, 0.0714172f };
+ cblas_sspmv(order, uplo, N, alpha, A, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "sspmv(case 1140)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ float alpha = 0.1f;
+ float beta = -0.3f;
+ int N = 2;
+ float A[] = { -0.174f, 0.878f, 0.478f };
+ float X[] = { 0.503f, 0.313f };
+ int incX = -1;
+ float Y[] = { -0.565f, -0.109f };
+ int incY = -1;
+ float y_expected[] = { 0.221025f, 0.0714172f };
+ cblas_sspmv(order, uplo, N, alpha, A, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "sspmv(case 1141)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ double alpha = -1;
+ double beta = 0.1;
+ int N = 2;
+ double A[] = { -0.181, -0.071, -0.038 };
+ double X[] = { -0.015, 0.132 };
+ int incX = -1;
+ double Y[] = { -0.449, -0.219 };
+ int incY = -1;
+ double y_expected[] = { -0.036098, 9.27e-04 };
+ cblas_dspmv(order, uplo, N, alpha, A, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "dspmv(case 1142)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ double alpha = -1;
+ double beta = 0.1;
+ int N = 2;
+ double A[] = { -0.181, -0.071, -0.038 };
+ double X[] = { -0.015, 0.132 };
+ int incX = -1;
+ double Y[] = { -0.449, -0.219 };
+ int incY = -1;
+ double y_expected[] = { -0.036098, 9.27e-04 };
+ cblas_dspmv(order, uplo, N, alpha, A, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "dspmv(case 1143)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ double alpha = -1;
+ double beta = 0.1;
+ int N = 2;
+ double A[] = { -0.181, -0.071, -0.038 };
+ double X[] = { -0.015, 0.132 };
+ int incX = -1;
+ double Y[] = { -0.449, -0.219 };
+ int incY = -1;
+ double y_expected[] = { -0.036098, 9.27e-04 };
+ cblas_dspmv(order, uplo, N, alpha, A, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "dspmv(case 1144)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ double alpha = -1;
+ double beta = 0.1;
+ int N = 2;
+ double A[] = { -0.181, -0.071, -0.038 };
+ double X[] = { -0.015, 0.132 };
+ int incX = -1;
+ double Y[] = { -0.449, -0.219 };
+ int incY = -1;
+ double y_expected[] = { -0.036098, 9.27e-04 };
+ cblas_dspmv(order, uplo, N, alpha, A, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "dspmv(case 1145)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ double alpha = -1;
+ double beta = 0.1;
+ int N = 2;
+ double A[] = { -0.181, -0.071, -0.038 };
+ double X[] = { -0.015, 0.132 };
+ int incX = -1;
+ double Y[] = { -0.449, -0.219 };
+ int incY = -1;
+ double y_expected[] = { -0.036098, 9.27e-04 };
+ cblas_dspmv(order, uplo, N, alpha, A, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "dspmv(case 1146)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ double alpha = -1;
+ double beta = 0.1;
+ int N = 2;
+ double A[] = { -0.181, -0.071, -0.038 };
+ double X[] = { -0.015, 0.132 };
+ int incX = -1;
+ double Y[] = { -0.449, -0.219 };
+ int incY = -1;
+ double y_expected[] = { -0.036098, 9.27e-04 };
+ cblas_dspmv(order, uplo, N, alpha, A, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "dspmv(case 1147)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ double alpha = -1;
+ double beta = 0.1;
+ int N = 2;
+ double A[] = { -0.181, -0.071, -0.038 };
+ double X[] = { -0.015, 0.132 };
+ int incX = -1;
+ double Y[] = { -0.449, -0.219 };
+ int incY = -1;
+ double y_expected[] = { -0.036098, 9.27e-04 };
+ cblas_dspmv(order, uplo, N, alpha, A, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "dspmv(case 1148)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ double alpha = -1;
+ double beta = 0.1;
+ int N = 2;
+ double A[] = { -0.181, -0.071, -0.038 };
+ double X[] = { -0.015, 0.132 };
+ int incX = -1;
+ double Y[] = { -0.449, -0.219 };
+ int incY = -1;
+ double y_expected[] = { -0.036098, 9.27e-04 };
+ cblas_dspmv(order, uplo, N, alpha, A, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "dspmv(case 1149)");
+ }
+ };
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_spr.c b/gsl-1.9/cblas/test_spr.c
new file mode 100644
index 0000000..36891bd
--- /dev/null
+++ b/gsl-1.9/cblas/test_spr.c
@@ -0,0 +1,163 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_spr (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ int order = 101;
+ int uplo = 121;
+ int N = 2;
+ float alpha = -0.3f;
+ float Ap[] = { -0.764f, -0.257f, -0.064f };
+ float X[] = { 0.455f, -0.285f };
+ int incX = -1;
+ float Ap_expected[] = { -0.788367f, -0.218097f, -0.126108f };
+ cblas_sspr(order, uplo, N, alpha, X, incX, Ap);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Ap[i], Ap_expected[i], flteps, "sspr(case 1426)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ int N = 2;
+ float alpha = -0.3f;
+ float Ap[] = { -0.764f, -0.257f, -0.064f };
+ float X[] = { 0.455f, -0.285f };
+ int incX = -1;
+ float Ap_expected[] = { -0.788367f, -0.218097f, -0.126108f };
+ cblas_sspr(order, uplo, N, alpha, X, incX, Ap);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Ap[i], Ap_expected[i], flteps, "sspr(case 1427)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ int N = 2;
+ float alpha = -0.3f;
+ float Ap[] = { -0.764f, -0.257f, -0.064f };
+ float X[] = { 0.455f, -0.285f };
+ int incX = -1;
+ float Ap_expected[] = { -0.788367f, -0.218097f, -0.126108f };
+ cblas_sspr(order, uplo, N, alpha, X, incX, Ap);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Ap[i], Ap_expected[i], flteps, "sspr(case 1428)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ int N = 2;
+ float alpha = -0.3f;
+ float Ap[] = { -0.764f, -0.257f, -0.064f };
+ float X[] = { 0.455f, -0.285f };
+ int incX = -1;
+ float Ap_expected[] = { -0.788367f, -0.218097f, -0.126108f };
+ cblas_sspr(order, uplo, N, alpha, X, incX, Ap);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Ap[i], Ap_expected[i], flteps, "sspr(case 1429)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ int N = 2;
+ double alpha = -1;
+ double Ap[] = { 0.819, 0.175, -0.809 };
+ double X[] = { -0.645, -0.222 };
+ int incX = -1;
+ double Ap_expected[] = { 0.769716, 0.03181, -1.225025 };
+ cblas_dspr(order, uplo, N, alpha, X, incX, Ap);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Ap[i], Ap_expected[i], dbleps, "dspr(case 1430)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ int N = 2;
+ double alpha = -1;
+ double Ap[] = { 0.819, 0.175, -0.809 };
+ double X[] = { -0.645, -0.222 };
+ int incX = -1;
+ double Ap_expected[] = { 0.769716, 0.03181, -1.225025 };
+ cblas_dspr(order, uplo, N, alpha, X, incX, Ap);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Ap[i], Ap_expected[i], dbleps, "dspr(case 1431)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ int N = 2;
+ double alpha = -1;
+ double Ap[] = { 0.819, 0.175, -0.809 };
+ double X[] = { -0.645, -0.222 };
+ int incX = -1;
+ double Ap_expected[] = { 0.769716, 0.03181, -1.225025 };
+ cblas_dspr(order, uplo, N, alpha, X, incX, Ap);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Ap[i], Ap_expected[i], dbleps, "dspr(case 1432)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ int N = 2;
+ double alpha = -1;
+ double Ap[] = { 0.819, 0.175, -0.809 };
+ double X[] = { -0.645, -0.222 };
+ int incX = -1;
+ double Ap_expected[] = { 0.769716, 0.03181, -1.225025 };
+ cblas_dspr(order, uplo, N, alpha, X, incX, Ap);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Ap[i], Ap_expected[i], dbleps, "dspr(case 1433)");
+ }
+ };
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_spr2.c b/gsl-1.9/cblas/test_spr2.c
new file mode 100644
index 0000000..cf0c39b
--- /dev/null
+++ b/gsl-1.9/cblas/test_spr2.c
@@ -0,0 +1,179 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_spr2 (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ int order = 101;
+ int uplo = 121;
+ int N = 2;
+ float alpha = -1.0f;
+ float Ap[] = { 0.493f, -0.175f, -0.831f };
+ float X[] = { -0.163f, 0.489f };
+ int incX = -1;
+ float Y[] = { 0.154f, 0.769f };
+ int incY = -1;
+ float Ap_expected[] = { -0.259082f, -0.124959f, -0.780796f };
+ cblas_sspr2(order, uplo, N, alpha, X, incX, Y, incY, Ap);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Ap[i], Ap_expected[i], flteps, "sspr2(case 1442)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ int N = 2;
+ float alpha = -1.0f;
+ float Ap[] = { 0.493f, -0.175f, -0.831f };
+ float X[] = { -0.163f, 0.489f };
+ int incX = -1;
+ float Y[] = { 0.154f, 0.769f };
+ int incY = -1;
+ float Ap_expected[] = { -0.259082f, -0.124959f, -0.780796f };
+ cblas_sspr2(order, uplo, N, alpha, X, incX, Y, incY, Ap);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Ap[i], Ap_expected[i], flteps, "sspr2(case 1443)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ int N = 2;
+ float alpha = -1.0f;
+ float Ap[] = { 0.493f, -0.175f, -0.831f };
+ float X[] = { -0.163f, 0.489f };
+ int incX = -1;
+ float Y[] = { 0.154f, 0.769f };
+ int incY = -1;
+ float Ap_expected[] = { -0.259082f, -0.124959f, -0.780796f };
+ cblas_sspr2(order, uplo, N, alpha, X, incX, Y, incY, Ap);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Ap[i], Ap_expected[i], flteps, "sspr2(case 1444)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ int N = 2;
+ float alpha = -1.0f;
+ float Ap[] = { 0.493f, -0.175f, -0.831f };
+ float X[] = { -0.163f, 0.489f };
+ int incX = -1;
+ float Y[] = { 0.154f, 0.769f };
+ int incY = -1;
+ float Ap_expected[] = { -0.259082f, -0.124959f, -0.780796f };
+ cblas_sspr2(order, uplo, N, alpha, X, incX, Y, incY, Ap);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Ap[i], Ap_expected[i], flteps, "sspr2(case 1445)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ int N = 2;
+ double alpha = 0;
+ double Ap[] = { 0.938, 0.342, 0.74 };
+ double X[] = { 0.216, -0.566 };
+ int incX = -1;
+ double Y[] = { -0.845, 0.282 };
+ int incY = -1;
+ double Ap_expected[] = { 0.938, 0.342, 0.74 };
+ cblas_dspr2(order, uplo, N, alpha, X, incX, Y, incY, Ap);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Ap[i], Ap_expected[i], dbleps, "dspr2(case 1446)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ int N = 2;
+ double alpha = 0;
+ double Ap[] = { 0.938, 0.342, 0.74 };
+ double X[] = { 0.216, -0.566 };
+ int incX = -1;
+ double Y[] = { -0.845, 0.282 };
+ int incY = -1;
+ double Ap_expected[] = { 0.938, 0.342, 0.74 };
+ cblas_dspr2(order, uplo, N, alpha, X, incX, Y, incY, Ap);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Ap[i], Ap_expected[i], dbleps, "dspr2(case 1447)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ int N = 2;
+ double alpha = 0;
+ double Ap[] = { 0.938, 0.342, 0.74 };
+ double X[] = { 0.216, -0.566 };
+ int incX = -1;
+ double Y[] = { -0.845, 0.282 };
+ int incY = -1;
+ double Ap_expected[] = { 0.938, 0.342, 0.74 };
+ cblas_dspr2(order, uplo, N, alpha, X, incX, Y, incY, Ap);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Ap[i], Ap_expected[i], dbleps, "dspr2(case 1448)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ int N = 2;
+ double alpha = 0;
+ double Ap[] = { 0.938, 0.342, 0.74 };
+ double X[] = { 0.216, -0.566 };
+ int incX = -1;
+ double Y[] = { -0.845, 0.282 };
+ int incY = -1;
+ double Ap_expected[] = { 0.938, 0.342, 0.74 };
+ cblas_dspr2(order, uplo, N, alpha, X, incX, Y, incY, Ap);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(Ap[i], Ap_expected[i], dbleps, "dspr2(case 1449)");
+ }
+ };
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_swap.c b/gsl-1.9/cblas/test_swap.c
new file mode 100644
index 0000000..accf822
--- /dev/null
+++ b/gsl-1.9/cblas/test_swap.c
@@ -0,0 +1,311 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_swap (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ int N = 1;
+ float X[] = { 0.539f };
+ int incX = 1;
+ float Y[] = { -0.262f };
+ int incY = -1;
+ float expected1[] = { -0.262f };
+ float expected2[] = { 0.539f };
+ cblas_sswap(N, X, incX, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], expected1[i], flteps, "sswap(case 88)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], expected2[i], flteps, "sswap(case 89)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double X[] = { 0.906 };
+ int incX = 1;
+ double Y[] = { 0.373 };
+ int incY = -1;
+ double expected1[] = { 0.373 };
+ double expected2[] = { 0.906 };
+ cblas_dswap(N, X, incX, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], expected1[i], dbleps, "dswap(case 90)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], expected2[i], dbleps, "dswap(case 91)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float X[] = { -0.316f, -0.529f };
+ int incX = 1;
+ float Y[] = { -0.313f, 0.363f };
+ int incY = -1;
+ float expected1[] = { -0.313f, 0.363f };
+ float expected2[] = { -0.316f, -0.529f };
+ cblas_cswap(N, X, incX, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], expected1[2*i], flteps, "cswap(case 92) real");
+ gsl_test_rel(X[2*i+1], expected1[2*i+1], flteps, "cswap(case 92) imag");
+ };
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], expected2[2*i], flteps, "cswap(case 93) real");
+ gsl_test_rel(Y[2*i+1], expected2[2*i+1], flteps, "cswap(case 93) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 1;
+ double X[] = { 0.512, -0.89 };
+ int incX = 1;
+ double Y[] = { -0.225, -0.511 };
+ int incY = -1;
+ double expected1[] = { -0.225, -0.511 };
+ double expected2[] = { 0.512, -0.89 };
+ cblas_zswap(N, X, incX, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], expected1[2*i], dbleps, "zswap(case 94) real");
+ gsl_test_rel(X[2*i+1], expected1[2*i+1], dbleps, "zswap(case 94) imag");
+ };
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], expected2[2*i], dbleps, "zswap(case 95) real");
+ gsl_test_rel(Y[2*i+1], expected2[2*i+1], dbleps, "zswap(case 95) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 1;
+ float X[] = { 0.336f };
+ int incX = -1;
+ float Y[] = { -0.431f };
+ int incY = 1;
+ float expected1[] = { -0.431f };
+ float expected2[] = { 0.336f };
+ cblas_sswap(N, X, incX, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], expected1[i], flteps, "sswap(case 96)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], expected2[i], flteps, "sswap(case 97)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double X[] = { 0.764 };
+ int incX = -1;
+ double Y[] = { -0.293 };
+ int incY = 1;
+ double expected1[] = { -0.293 };
+ double expected2[] = { 0.764 };
+ cblas_dswap(N, X, incX, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], expected1[i], dbleps, "dswap(case 98)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], expected2[i], dbleps, "dswap(case 99)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float X[] = { -0.239f, 0.361f };
+ int incX = -1;
+ float Y[] = { 0.149f, 0.347f };
+ int incY = 1;
+ float expected1[] = { 0.149f, 0.347f };
+ float expected2[] = { -0.239f, 0.361f };
+ cblas_cswap(N, X, incX, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], expected1[2*i], flteps, "cswap(case 100) real");
+ gsl_test_rel(X[2*i+1], expected1[2*i+1], flteps, "cswap(case 100) imag");
+ };
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], expected2[2*i], flteps, "cswap(case 101) real");
+ gsl_test_rel(Y[2*i+1], expected2[2*i+1], flteps, "cswap(case 101) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 1;
+ double X[] = { -0.171, -0.936 };
+ int incX = -1;
+ double Y[] = { 0.495, -0.835 };
+ int incY = 1;
+ double expected1[] = { 0.495, -0.835 };
+ double expected2[] = { -0.171, -0.936 };
+ cblas_zswap(N, X, incX, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], expected1[2*i], dbleps, "zswap(case 102) real");
+ gsl_test_rel(X[2*i+1], expected1[2*i+1], dbleps, "zswap(case 102) imag");
+ };
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], expected2[2*i], dbleps, "zswap(case 103) real");
+ gsl_test_rel(Y[2*i+1], expected2[2*i+1], dbleps, "zswap(case 103) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 1;
+ float X[] = { -0.405f };
+ int incX = -1;
+ float Y[] = { -0.213f };
+ int incY = -1;
+ float expected1[] = { -0.213f };
+ float expected2[] = { -0.405f };
+ cblas_sswap(N, X, incX, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], expected1[i], flteps, "sswap(case 104)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], expected2[i], flteps, "sswap(case 105)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ double X[] = { -0.761 };
+ int incX = -1;
+ double Y[] = { -0.585 };
+ int incY = -1;
+ double expected1[] = { -0.585 };
+ double expected2[] = { -0.761 };
+ cblas_dswap(N, X, incX, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], expected1[i], dbleps, "dswap(case 106)");
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], expected2[i], dbleps, "dswap(case 107)");
+ }
+ };
+ };
+
+
+ {
+ int N = 1;
+ float X[] = { 0.853f, 0.146f };
+ int incX = -1;
+ float Y[] = { 0.009f, -0.178f };
+ int incY = -1;
+ float expected1[] = { 0.009f, -0.178f };
+ float expected2[] = { 0.853f, 0.146f };
+ cblas_cswap(N, X, incX, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], expected1[2*i], flteps, "cswap(case 108) real");
+ gsl_test_rel(X[2*i+1], expected1[2*i+1], flteps, "cswap(case 108) imag");
+ };
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], expected2[2*i], flteps, "cswap(case 109) real");
+ gsl_test_rel(Y[2*i+1], expected2[2*i+1], flteps, "cswap(case 109) imag");
+ };
+ };
+ };
+
+
+ {
+ int N = 1;
+ double X[] = { -0.228, 0.386 };
+ int incX = -1;
+ double Y[] = { 0.988, -0.084 };
+ int incY = -1;
+ double expected1[] = { 0.988, -0.084 };
+ double expected2[] = { -0.228, 0.386 };
+ cblas_zswap(N, X, incX, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], expected1[2*i], dbleps, "zswap(case 110) real");
+ gsl_test_rel(X[2*i+1], expected1[2*i+1], dbleps, "zswap(case 110) imag");
+ };
+ };
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[2*i], expected2[2*i], dbleps, "zswap(case 111) real");
+ gsl_test_rel(Y[2*i+1], expected2[2*i+1], dbleps, "zswap(case 111) imag");
+ };
+ };
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_symm.c b/gsl-1.9/cblas/test_symm.c
new file mode 100644
index 0000000..88a672a
--- /dev/null
+++ b/gsl-1.9/cblas/test_symm.c
@@ -0,0 +1,827 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_symm (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int M = 1;
+ int N = 2;
+ float alpha = -0.3f;
+ float beta = -1.0f;
+ float A[] = { -0.581f };
+ int lda = 1;
+ float B[] = { 0.157f, 0.451f };
+ int ldb = 2;
+ float C[] = { -0.869f, -0.871f };
+ int ldc = 2;
+ float C_expected[] = { 0.896365f, 0.949609f };
+ cblas_ssymm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[i], C_expected[i], flteps, "ssymm(case 1518)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int M = 1;
+ int N = 2;
+ float alpha = -0.3f;
+ float beta = -1.0f;
+ float A[] = { 0.874f };
+ int lda = 1;
+ float B[] = { 0.085f, 0.069f };
+ int ldb = 1;
+ float C[] = { -0.495f, -0.828f };
+ int ldc = 1;
+ float C_expected[] = { 0.472713f, 0.809908f };
+ cblas_ssymm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[i], C_expected[i], flteps, "ssymm(case 1519)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int M = 1;
+ int N = 2;
+ float alpha = -1.0f;
+ float beta = 0.0f;
+ float A[] = { -0.671f, -0.343f, 0.6f, 0.177f };
+ int lda = 2;
+ float B[] = { 0.043f, 0.01f };
+ int ldb = 2;
+ float C[] = { 0.988f, 0.478f };
+ int ldc = 2;
+ float C_expected[] = { 0.032283f, 0.012979f };
+ cblas_ssymm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[i], C_expected[i], flteps, "ssymm(case 1520)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int M = 1;
+ int N = 2;
+ float alpha = -1.0f;
+ float beta = 0.0f;
+ float A[] = { 0.069f, 0.096f, 0.139f, -0.044f };
+ int lda = 2;
+ float B[] = { -0.448f, 0.07f };
+ int ldb = 1;
+ float C[] = { 0.361f, 0.995f };
+ int ldc = 1;
+ float C_expected[] = { 0.021182f, 0.065352f };
+ cblas_ssymm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[i], C_expected[i], flteps, "ssymm(case 1521)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int M = 1;
+ int N = 2;
+ float alpha = 0.0f;
+ float beta = -0.3f;
+ float A[] = { 0.745f };
+ int lda = 1;
+ float B[] = { -0.269f, 0.448f };
+ int ldb = 2;
+ float C[] = { -0.986f, 0.2f };
+ int ldc = 2;
+ float C_expected[] = { 0.2958f, -0.06f };
+ cblas_ssymm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[i], C_expected[i], flteps, "ssymm(case 1522)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int M = 1;
+ int N = 2;
+ float alpha = 0.0f;
+ float beta = -0.3f;
+ float A[] = { 0.96f };
+ int lda = 1;
+ float B[] = { 0.392f, -0.07f };
+ int ldb = 1;
+ float C[] = { -0.235f, 0.554f };
+ int ldc = 1;
+ float C_expected[] = { 0.0705f, -0.1662f };
+ cblas_ssymm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[i], C_expected[i], flteps, "ssymm(case 1523)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int M = 1;
+ int N = 2;
+ float alpha = -0.3f;
+ float beta = 0.1f;
+ float A[] = { -0.839f, 0.498f, -0.215f, -0.314f };
+ int lda = 2;
+ float B[] = { -0.66f, 0.593f };
+ int ldb = 2;
+ float C[] = { -0.806f, 0.525f };
+ int ldc = 2;
+ float C_expected[] = { -0.208474f, 0.0657906f };
+ cblas_ssymm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[i], C_expected[i], flteps, "ssymm(case 1524)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int M = 1;
+ int N = 2;
+ float alpha = -0.3f;
+ float beta = 0.1f;
+ float A[] = { 0.994f, -0.117f, -0.639f, 0.925f };
+ int lda = 2;
+ float B[] = { -0.478f, 0.147f };
+ int ldb = 1;
+ float C[] = { -0.814f, 0.316f };
+ int ldc = 1;
+ float C_expected[] = { 0.0662993f, -0.0259703f };
+ cblas_ssymm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[i], C_expected[i], flteps, "ssymm(case 1525)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int M = 1;
+ int N = 2;
+ double alpha = -0.3;
+ double beta = 1;
+ double A[] = { -0.981 };
+ int lda = 1;
+ double B[] = { -0.823, 0.83 };
+ int ldb = 2;
+ double C[] = { 0.991, 0.382 };
+ int ldc = 2;
+ double C_expected[] = { 0.7487911, 0.626269 };
+ cblas_dsymm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[i], C_expected[i], dbleps, "dsymm(case 1526)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int M = 1;
+ int N = 2;
+ double alpha = -0.3;
+ double beta = 1;
+ double A[] = { -0.248 };
+ int lda = 1;
+ double B[] = { 0.74, 0.068 };
+ int ldb = 1;
+ double C[] = { -0.905, 0.742 };
+ int ldc = 1;
+ double C_expected[] = { -0.849944, 0.7470592 };
+ cblas_dsymm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[i], C_expected[i], dbleps, "dsymm(case 1527)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int M = 1;
+ int N = 2;
+ double alpha = -1;
+ double beta = 1;
+ double A[] = { 0.591, -0.01, -0.192, -0.376 };
+ int lda = 2;
+ double B[] = { 0.561, 0.946 };
+ int ldb = 2;
+ double C[] = { 0.763, 0.189 };
+ int ldc = 2;
+ double C_expected[] = { 0.440909, 0.550306 };
+ cblas_dsymm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[i], C_expected[i], dbleps, "dsymm(case 1528)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int M = 1;
+ int N = 2;
+ double alpha = -1;
+ double beta = 1;
+ double A[] = { -0.786, 0.87, 0.222, -0.043 };
+ int lda = 2;
+ double B[] = { -0.503, -0.526 };
+ int ldb = 1;
+ double C[] = { -0.027, -0.391 };
+ int ldc = 1;
+ double C_expected[] = { -0.305586, -0.301952 };
+ cblas_dsymm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[i], C_expected[i], dbleps, "dsymm(case 1529)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int M = 1;
+ int N = 2;
+ double alpha = 0.1;
+ double beta = 0.1;
+ double A[] = { -0.468 };
+ int lda = 1;
+ double B[] = { -0.881, 0.692 };
+ int ldb = 2;
+ double C[] = { -0.812, -0.395 };
+ int ldc = 2;
+ double C_expected[] = { -0.0399692, -0.0718856 };
+ cblas_dsymm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[i], C_expected[i], dbleps, "dsymm(case 1530)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int M = 1;
+ int N = 2;
+ double alpha = 0.1;
+ double beta = 0.1;
+ double A[] = { 0.849 };
+ int lda = 1;
+ double B[] = { -0.887, 0.518 };
+ int ldb = 1;
+ double C[] = { 0.414, -0.251 };
+ int ldc = 1;
+ double C_expected[] = { -0.0339063, 0.0188782 };
+ cblas_dsymm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[i], C_expected[i], dbleps, "dsymm(case 1531)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int M = 1;
+ int N = 2;
+ double alpha = -1;
+ double beta = 1;
+ double A[] = { 0.457, 0.624, 0.807, 0.349 };
+ int lda = 2;
+ double B[] = { -0.609, 0.03 };
+ int ldb = 2;
+ double C[] = { 0.719, -0.624 };
+ int ldc = 2;
+ double C_expected[] = { 0.973103, -0.143007 };
+ cblas_dsymm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[i], C_expected[i], dbleps, "dsymm(case 1532)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int M = 1;
+ int N = 2;
+ double alpha = -1;
+ double beta = 1;
+ double A[] = { -0.133, -0.117, -0.163, 0.795 };
+ int lda = 2;
+ double B[] = { -0.882, 0.549 };
+ int ldb = 1;
+ double C[] = { 0.715, -0.327 };
+ int ldc = 1;
+ double C_expected[] = { 0.661927, -0.866649 };
+ cblas_dsymm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[i], C_expected[i], dbleps, "dsymm(case 1533)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int M = 1;
+ int N = 2;
+ float alpha[2] = {-1.0f, 0.0f};
+ float beta[2] = {1.0f, 0.0f};
+ float A[] = { 0.476f, 0.816f };
+ int lda = 1;
+ float B[] = { 0.282f, 0.852f, -0.891f, -0.588f };
+ int ldb = 2;
+ float C[] = { 0.9f, 0.486f, -0.78f, -0.637f };
+ int ldc = 2;
+ float C_expected[] = { 1.461f, -0.149664f, -0.835692f, 0.369944f };
+ cblas_csymm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "csymm(case 1534) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "csymm(case 1534) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int M = 1;
+ int N = 2;
+ float alpha[2] = {-1.0f, 0.0f};
+ float beta[2] = {1.0f, 0.0f};
+ float A[] = { 0.048f, 0.172f };
+ int lda = 1;
+ float B[] = { 0.786f, 0.783f, 0.809f, -0.569f };
+ int ldb = 1;
+ float C[] = { -0.227f, -0.215f, 0.881f, 0.233f };
+ int ldc = 1;
+ float C_expected[] = { -0.130052f, -0.387776f, 0.7443f, 0.121164f };
+ cblas_csymm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "csymm(case 1535) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "csymm(case 1535) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int M = 1;
+ int N = 2;
+ float alpha[2] = {0.0f, 1.0f};
+ float beta[2] = {0.0f, 1.0f};
+ float A[] = { -0.495f, -0.012f, 0.843f, -0.986f, -0.243f, 0.833f, 0.921f, 0.004f };
+ int lda = 2;
+ float B[] = { 0.876f, 0.612f, 0.805f, -0.57f };
+ int ldb = 2;
+ float C[] = { 0.938f, -0.24f, -0.874f, -0.062f };
+ int ldc = 2;
+ float C_expected[] = { 1.82769f, 0.628319f, 0.93157f, 1.21158f };
+ cblas_csymm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "csymm(case 1536) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "csymm(case 1536) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int M = 1;
+ int N = 2;
+ float alpha[2] = {0.0f, 1.0f};
+ float beta[2] = {0.0f, 1.0f};
+ float A[] = { -0.812f, 0.83f, 0.705f, 0.15f, -0.463f, 0.901f, -0.547f, -0.483f };
+ int lda = 2;
+ float B[] = { -0.808f, -0.664f, 0.352f, -0.102f };
+ int ldb = 1;
+ float C[] = { -0.64f, 0.399f, 0.896f, -0.163f };
+ int ldc = 1;
+ float C_expected[] = { -0.631906f, 0.496142f, 0.697798f, 1.62656f };
+ cblas_csymm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "csymm(case 1537) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "csymm(case 1537) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int M = 1;
+ int N = 2;
+ float alpha[2] = {-1.0f, 0.0f};
+ float beta[2] = {0.0f, 1.0f};
+ float A[] = { 0.342f, -0.906f };
+ int lda = 1;
+ float B[] = { 0.676f, 0.863f, -0.517f, -0.138f };
+ int ldb = 2;
+ float C[] = { 0.274f, 0.388f, -0.271f, 0.205f };
+ int ldc = 2;
+ float C_expected[] = { -1.40107f, 0.59131f, 0.096842f, -0.692206f };
+ cblas_csymm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "csymm(case 1538) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "csymm(case 1538) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int M = 1;
+ int N = 2;
+ float alpha[2] = {-1.0f, 0.0f};
+ float beta[2] = {0.0f, 1.0f};
+ float A[] = { 0.418f, 0.354f };
+ int lda = 1;
+ float B[] = { -0.74f, 0.018f, 0.395f, 0.248f };
+ int ldb = 1;
+ float C[] = { -0.162f, 0.175f, -0.853f, 0.652f };
+ int ldc = 1;
+ float C_expected[] = { 0.140692f, 0.092436f, -0.729318f, -1.09649f };
+ cblas_csymm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "csymm(case 1539) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "csymm(case 1539) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int M = 1;
+ int N = 2;
+ float alpha[2] = {-0.3f, 0.1f};
+ float beta[2] = {0.0f, 0.1f};
+ float A[] = { 0.12f, 0.496f, 0.313f, -0.136f, 0.987f, 0.532f, 0.58f, -0.687f };
+ int lda = 2;
+ float B[] = { -0.587f, 0.278f, 0.857f, 0.136f };
+ int ldb = 2;
+ float C[] = { 0.162f, 0.249f, -0.665f, 0.456f };
+ int ldc = 2;
+ float C_expected[] = { -0.22769f, -0.0269913f, 0.0502096f, 0.0841558f };
+ cblas_csymm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "csymm(case 1540) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "csymm(case 1540) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int M = 1;
+ int N = 2;
+ float alpha[2] = {-0.3f, 0.1f};
+ float beta[2] = {0.0f, 0.1f};
+ float A[] = { 0.579f, -0.859f, 0.192f, -0.737f, 0.396f, -0.498f, 0.751f, -0.379f };
+ int lda = 2;
+ float B[] = { 0.84f, -0.755f, -0.019f, -0.063f };
+ int ldb = 1;
+ float C[] = { 0.04f, 0.639f, -0.876f, -0.778f };
+ int ldc = 1;
+ float C_expected[] = { 0.115459f, 0.329813f, 0.288206f, 0.110315f };
+ cblas_csymm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "csymm(case 1541) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "csymm(case 1541) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int M = 1;
+ int N = 2;
+ double alpha[2] = {0, 0};
+ double beta[2] = {0, 0};
+ double A[] = { 0.511, -0.486 };
+ int lda = 1;
+ double B[] = { 0.985, -0.923, -0.234, -0.756 };
+ int ldb = 2;
+ double C[] = { -0.16, 0.049, 0.618, -0.349 };
+ int ldc = 2;
+ double C_expected[] = { 0.0, 0.0, 0.0, 0.0 };
+ cblas_zsymm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zsymm(case 1542) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zsymm(case 1542) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int M = 1;
+ int N = 2;
+ double alpha[2] = {0, 0};
+ double beta[2] = {0, 0};
+ double A[] = { 0.46, -0.816 };
+ int lda = 1;
+ double B[] = { 0.404, 0.113, -0.904, -0.627 };
+ int ldb = 1;
+ double C[] = { 0.114, 0.318, 0.636, -0.839 };
+ int ldc = 1;
+ double C_expected[] = { 0.0, 0.0, 0.0, 0.0 };
+ cblas_zsymm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zsymm(case 1543) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zsymm(case 1543) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int M = 1;
+ int N = 2;
+ double alpha[2] = {-1, 0};
+ double beta[2] = {-0.3, 0.1};
+ double A[] = { -0.835, 0.344, 0.975, 0.634, 0.312, -0.659, -0.624, -0.175 };
+ int lda = 2;
+ double B[] = { -0.707, -0.846, 0.825, -0.661 };
+ int ldb = 2;
+ double C[] = { 0.352, -0.499, 0.267, 0.548 };
+ int ldc = 2;
+ double C_expected[] = { -2.160518, -0.156877, 0.648536, 0.867299 };
+ cblas_zsymm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zsymm(case 1544) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zsymm(case 1544) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int M = 1;
+ int N = 2;
+ double alpha[2] = {-1, 0};
+ double beta[2] = {-0.3, 0.1};
+ double A[] = { -0.409, 0.013, -0.308, -0.317, -0.535, -0.697, -0.385, 0.119 };
+ int lda = 2;
+ double B[] = { 0.299, -0.233, 0.093, 0.664 };
+ int ldb = 1;
+ double C[] = { 0.699, 0.47, -0.347, -0.182 };
+ int ldc = 1;
+ double C_expected[] = { -0.550491, 0.249777, 0.559487, 0.348221 };
+ cblas_zsymm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zsymm(case 1545) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zsymm(case 1545) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int M = 1;
+ int N = 2;
+ double alpha[2] = {1, 0};
+ double beta[2] = {0, 1};
+ double A[] = { -0.151, 0.635 };
+ int lda = 1;
+ double B[] = { 0.711, -0.869, 0.153, 0.647 };
+ int ldb = 2;
+ double C[] = { -0.299, 0.43, -0.307, 0.133 };
+ int ldc = 2;
+ double C_expected[] = { 0.014454, 0.283704, -0.566948, -0.307542 };
+ cblas_zsymm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zsymm(case 1546) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zsymm(case 1546) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int M = 1;
+ int N = 2;
+ double alpha[2] = {1, 0};
+ double beta[2] = {0, 1};
+ double A[] = { 0.793, -0.543 };
+ int lda = 1;
+ double B[] = { 0.054, -0.045, 0.989, 0.453 };
+ int ldb = 1;
+ double C[] = { 0.443, -0.641, -0.809, -0.83 };
+ int ldc = 1;
+ double C_expected[] = { 0.659387, 0.377993, 1.860256, -0.986798 };
+ cblas_zsymm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zsymm(case 1547) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zsymm(case 1547) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int M = 1;
+ int N = 2;
+ double alpha[2] = {1, 0};
+ double beta[2] = {-1, 0};
+ double A[] = { -0.432, -0.293, -0.819, 0.44, -0.818, -0.258, -0.836, 0.683 };
+ int lda = 2;
+ double B[] = { -0.259, -0.878, 0.161, 0.744 };
+ int ldb = 2;
+ double C[] = { 0.436, -0.655, -0.61, -0.875 };
+ int ldc = 2;
+ double C_expected[] = { -0.521112, 0.460053, -0.04741, 1.148005 };
+ cblas_zsymm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zsymm(case 1548) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zsymm(case 1548) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int M = 1;
+ int N = 2;
+ double alpha[2] = {1, 0};
+ double beta[2] = {-1, 0};
+ double A[] = { -0.656, 0.378, -0.688, 0.676, 0.967, -0.804, 0.455, -0.425 };
+ int lda = 2;
+ double B[] = { 0.791, -0.947, -0.945, -0.444 };
+ int ldb = 1;
+ double C[] = { 0.014, -0.814, -0.091, -0.417 };
+ int ldc = 1;
+ double C_expected[] = { 0.775374, 1.400882, -0.431711, 1.802857 };
+ cblas_zsymm(order, side, uplo, M, N, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zsymm(case 1549) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zsymm(case 1549) imag");
+ };
+ };
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_symv.c b/gsl-1.9/cblas/test_symv.c
new file mode 100644
index 0000000..923a0f5
--- /dev/null
+++ b/gsl-1.9/cblas/test_symv.c
@@ -0,0 +1,379 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_symv (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ int order = 101;
+ int uplo = 121;
+ float alpha = 1.0f;
+ float beta = -1.0f;
+ int N = 1;
+ int lda = 1;
+ float A[] = { -0.428f };
+ float X[] = { -0.34f };
+ int incX = -1;
+ float Y[] = { -0.888f };
+ int incY = -1;
+ float y_expected[] = { 1.03352f };
+ cblas_ssymv(order, uplo, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "ssymv(case 1054)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ float alpha = 1.0f;
+ float beta = -1.0f;
+ int N = 1;
+ int lda = 1;
+ float A[] = { -0.428f };
+ float X[] = { -0.34f };
+ int incX = -1;
+ float Y[] = { -0.888f };
+ int incY = -1;
+ float y_expected[] = { 1.03352f };
+ cblas_ssymv(order, uplo, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "ssymv(case 1055)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ float alpha = 1.0f;
+ float beta = -1.0f;
+ int N = 1;
+ int lda = 1;
+ float A[] = { -0.428f };
+ float X[] = { -0.34f };
+ int incX = -1;
+ float Y[] = { -0.888f };
+ int incY = -1;
+ float y_expected[] = { 1.03352f };
+ cblas_ssymv(order, uplo, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "ssymv(case 1056)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ float alpha = 1.0f;
+ float beta = -1.0f;
+ int N = 1;
+ int lda = 1;
+ float A[] = { -0.428f };
+ float X[] = { -0.34f };
+ int incX = -1;
+ float Y[] = { -0.888f };
+ int incY = -1;
+ float y_expected[] = { 1.03352f };
+ cblas_ssymv(order, uplo, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "ssymv(case 1057)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ float alpha = 1.0f;
+ float beta = -1.0f;
+ int N = 1;
+ int lda = 1;
+ float A[] = { -0.428f };
+ float X[] = { -0.34f };
+ int incX = -1;
+ float Y[] = { -0.888f };
+ int incY = -1;
+ float y_expected[] = { 1.03352f };
+ cblas_ssymv(order, uplo, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "ssymv(case 1058)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ float alpha = 1.0f;
+ float beta = -1.0f;
+ int N = 1;
+ int lda = 1;
+ float A[] = { -0.428f };
+ float X[] = { -0.34f };
+ int incX = -1;
+ float Y[] = { -0.888f };
+ int incY = -1;
+ float y_expected[] = { 1.03352f };
+ cblas_ssymv(order, uplo, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "ssymv(case 1059)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ float alpha = 1.0f;
+ float beta = -1.0f;
+ int N = 1;
+ int lda = 1;
+ float A[] = { -0.428f };
+ float X[] = { -0.34f };
+ int incX = -1;
+ float Y[] = { -0.888f };
+ int incY = -1;
+ float y_expected[] = { 1.03352f };
+ cblas_ssymv(order, uplo, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "ssymv(case 1060)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ float alpha = 1.0f;
+ float beta = -1.0f;
+ int N = 1;
+ int lda = 1;
+ float A[] = { -0.428f };
+ float X[] = { -0.34f };
+ int incX = -1;
+ float Y[] = { -0.888f };
+ int incY = -1;
+ float y_expected[] = { 1.03352f };
+ cblas_ssymv(order, uplo, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], flteps, "ssymv(case 1061)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ double alpha = 0;
+ double beta = -0.3;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.544 };
+ double X[] = { -0.601 };
+ int incX = -1;
+ double Y[] = { -0.852 };
+ int incY = -1;
+ double y_expected[] = { 0.2556 };
+ cblas_dsymv(order, uplo, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "dsymv(case 1062)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ double alpha = 0;
+ double beta = -0.3;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.544 };
+ double X[] = { -0.601 };
+ int incX = -1;
+ double Y[] = { -0.852 };
+ int incY = -1;
+ double y_expected[] = { 0.2556 };
+ cblas_dsymv(order, uplo, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "dsymv(case 1063)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ double alpha = 0;
+ double beta = -0.3;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.544 };
+ double X[] = { -0.601 };
+ int incX = -1;
+ double Y[] = { -0.852 };
+ int incY = -1;
+ double y_expected[] = { 0.2556 };
+ cblas_dsymv(order, uplo, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "dsymv(case 1064)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ double alpha = 0;
+ double beta = -0.3;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.544 };
+ double X[] = { -0.601 };
+ int incX = -1;
+ double Y[] = { -0.852 };
+ int incY = -1;
+ double y_expected[] = { 0.2556 };
+ cblas_dsymv(order, uplo, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "dsymv(case 1065)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ double alpha = 0;
+ double beta = -0.3;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.544 };
+ double X[] = { -0.601 };
+ int incX = -1;
+ double Y[] = { -0.852 };
+ int incY = -1;
+ double y_expected[] = { 0.2556 };
+ cblas_dsymv(order, uplo, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "dsymv(case 1066)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ double alpha = 0;
+ double beta = -0.3;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.544 };
+ double X[] = { -0.601 };
+ int incX = -1;
+ double Y[] = { -0.852 };
+ int incY = -1;
+ double y_expected[] = { 0.2556 };
+ cblas_dsymv(order, uplo, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "dsymv(case 1067)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ double alpha = 0;
+ double beta = -0.3;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.544 };
+ double X[] = { -0.601 };
+ int incX = -1;
+ double Y[] = { -0.852 };
+ int incY = -1;
+ double y_expected[] = { 0.2556 };
+ cblas_dsymv(order, uplo, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "dsymv(case 1068)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ double alpha = 0;
+ double beta = -0.3;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.544 };
+ double X[] = { -0.601 };
+ int incX = -1;
+ double Y[] = { -0.852 };
+ int incY = -1;
+ double y_expected[] = { 0.2556 };
+ cblas_dsymv(order, uplo, N, alpha, A, lda, X, incX, beta, Y, incY);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(Y[i], y_expected[i], dbleps, "dsymv(case 1069)");
+ }
+ };
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_syr.c b/gsl-1.9/cblas/test_syr.c
new file mode 100644
index 0000000..fc7b397
--- /dev/null
+++ b/gsl-1.9/cblas/test_syr.c
@@ -0,0 +1,171 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_syr (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ int order = 101;
+ int uplo = 121;
+ int N = 1;
+ int lda = 1;
+ float alpha = 0.1f;
+ float A[] = { -0.291f };
+ float X[] = { 0.845f };
+ int incX = -1;
+ float A_expected[] = { -0.219597f };
+ cblas_ssyr(order, uplo, N, alpha, X, incX, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[i], A_expected[i], flteps, "ssyr(case 1402)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ int N = 1;
+ int lda = 1;
+ float alpha = 0.1f;
+ float A[] = { -0.291f };
+ float X[] = { 0.845f };
+ int incX = -1;
+ float A_expected[] = { -0.219597f };
+ cblas_ssyr(order, uplo, N, alpha, X, incX, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[i], A_expected[i], flteps, "ssyr(case 1403)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ int N = 1;
+ int lda = 1;
+ float alpha = 0.1f;
+ float A[] = { -0.291f };
+ float X[] = { 0.845f };
+ int incX = -1;
+ float A_expected[] = { -0.219597f };
+ cblas_ssyr(order, uplo, N, alpha, X, incX, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[i], A_expected[i], flteps, "ssyr(case 1404)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ int N = 1;
+ int lda = 1;
+ float alpha = 0.1f;
+ float A[] = { -0.291f };
+ float X[] = { 0.845f };
+ int incX = -1;
+ float A_expected[] = { -0.219597f };
+ cblas_ssyr(order, uplo, N, alpha, X, incX, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[i], A_expected[i], flteps, "ssyr(case 1405)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ int N = 1;
+ int lda = 1;
+ double alpha = -0.3;
+ double A[] = { -0.65 };
+ double X[] = { -0.891 };
+ int incX = -1;
+ double A_expected[] = { -0.8881643 };
+ cblas_dsyr(order, uplo, N, alpha, X, incX, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[i], A_expected[i], dbleps, "dsyr(case 1406)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ int N = 1;
+ int lda = 1;
+ double alpha = -0.3;
+ double A[] = { -0.65 };
+ double X[] = { -0.891 };
+ int incX = -1;
+ double A_expected[] = { -0.8881643 };
+ cblas_dsyr(order, uplo, N, alpha, X, incX, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[i], A_expected[i], dbleps, "dsyr(case 1407)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ int N = 1;
+ int lda = 1;
+ double alpha = -0.3;
+ double A[] = { -0.65 };
+ double X[] = { -0.891 };
+ int incX = -1;
+ double A_expected[] = { -0.8881643 };
+ cblas_dsyr(order, uplo, N, alpha, X, incX, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[i], A_expected[i], dbleps, "dsyr(case 1408)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ int N = 1;
+ int lda = 1;
+ double alpha = -0.3;
+ double A[] = { -0.65 };
+ double X[] = { -0.891 };
+ int incX = -1;
+ double A_expected[] = { -0.8881643 };
+ cblas_dsyr(order, uplo, N, alpha, X, incX, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[i], A_expected[i], dbleps, "dsyr(case 1409)");
+ }
+ };
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_syr2.c b/gsl-1.9/cblas/test_syr2.c
new file mode 100644
index 0000000..5f214f1
--- /dev/null
+++ b/gsl-1.9/cblas/test_syr2.c
@@ -0,0 +1,187 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_syr2 (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ int order = 101;
+ int uplo = 121;
+ int N = 1;
+ int lda = 1;
+ float alpha = 0.0f;
+ float A[] = { 0.862f };
+ float X[] = { 0.823f };
+ int incX = -1;
+ float Y[] = { 0.699f };
+ int incY = -1;
+ float A_expected[] = { 0.862f };
+ cblas_ssyr2(order, uplo, N, alpha, X, incX, Y, incY, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[i], A_expected[i], flteps, "ssyr2(case 1434)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ int N = 1;
+ int lda = 1;
+ float alpha = 0.0f;
+ float A[] = { 0.862f };
+ float X[] = { 0.823f };
+ int incX = -1;
+ float Y[] = { 0.699f };
+ int incY = -1;
+ float A_expected[] = { 0.862f };
+ cblas_ssyr2(order, uplo, N, alpha, X, incX, Y, incY, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[i], A_expected[i], flteps, "ssyr2(case 1435)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ int N = 1;
+ int lda = 1;
+ float alpha = 0.0f;
+ float A[] = { 0.862f };
+ float X[] = { 0.823f };
+ int incX = -1;
+ float Y[] = { 0.699f };
+ int incY = -1;
+ float A_expected[] = { 0.862f };
+ cblas_ssyr2(order, uplo, N, alpha, X, incX, Y, incY, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[i], A_expected[i], flteps, "ssyr2(case 1436)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ int N = 1;
+ int lda = 1;
+ float alpha = 0.0f;
+ float A[] = { 0.862f };
+ float X[] = { 0.823f };
+ int incX = -1;
+ float Y[] = { 0.699f };
+ int incY = -1;
+ float A_expected[] = { 0.862f };
+ cblas_ssyr2(order, uplo, N, alpha, X, incX, Y, incY, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[i], A_expected[i], flteps, "ssyr2(case 1437)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ int N = 1;
+ int lda = 1;
+ double alpha = 0;
+ double A[] = { -0.824 };
+ double X[] = { 0.684 };
+ int incX = -1;
+ double Y[] = { 0.965 };
+ int incY = -1;
+ double A_expected[] = { -0.824 };
+ cblas_dsyr2(order, uplo, N, alpha, X, incX, Y, incY, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[i], A_expected[i], dbleps, "dsyr2(case 1438)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ int N = 1;
+ int lda = 1;
+ double alpha = 0;
+ double A[] = { -0.824 };
+ double X[] = { 0.684 };
+ int incX = -1;
+ double Y[] = { 0.965 };
+ int incY = -1;
+ double A_expected[] = { -0.824 };
+ cblas_dsyr2(order, uplo, N, alpha, X, incX, Y, incY, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[i], A_expected[i], dbleps, "dsyr2(case 1439)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ int N = 1;
+ int lda = 1;
+ double alpha = 0;
+ double A[] = { -0.824 };
+ double X[] = { 0.684 };
+ int incX = -1;
+ double Y[] = { 0.965 };
+ int incY = -1;
+ double A_expected[] = { -0.824 };
+ cblas_dsyr2(order, uplo, N, alpha, X, incX, Y, incY, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[i], A_expected[i], dbleps, "dsyr2(case 1440)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ int N = 1;
+ int lda = 1;
+ double alpha = 0;
+ double A[] = { -0.824 };
+ double X[] = { 0.684 };
+ int incX = -1;
+ double Y[] = { 0.965 };
+ int incY = -1;
+ double A_expected[] = { -0.824 };
+ cblas_dsyr2(order, uplo, N, alpha, X, incX, Y, incY, A, lda);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(A[i], A_expected[i], dbleps, "dsyr2(case 1441)");
+ }
+ };
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_syr2k.c b/gsl-1.9/cblas/test_syr2k.c
new file mode 100644
index 0000000..8955d0e
--- /dev/null
+++ b/gsl-1.9/cblas/test_syr2k.c
@@ -0,0 +1,827 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_syr2k (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ int order = 101;
+ int uplo = 121;
+ int trans = 111;
+ int N = 1;
+ int K = 2;
+ float alpha = 0.1f;
+ float beta = 1.0f;
+ float A[] = { -0.915f, 0.445f };
+ int lda = 2;
+ float B[] = { 0.213f, -0.194f };
+ int ldb = 2;
+ float C[] = { -0.117f };
+ int ldc = 1;
+ float C_expected[] = { -0.173245f };
+ cblas_ssyr2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[i], C_expected[i], flteps, "ssyr2k(case 1614)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ int trans = 111;
+ int N = 1;
+ int K = 2;
+ float alpha = 0.1f;
+ float beta = 1.0f;
+ float A[] = { 0.089f, -0.889f };
+ int lda = 2;
+ float B[] = { -0.384f, 0.518f };
+ int ldb = 2;
+ float C[] = { 0.069f };
+ int ldc = 1;
+ float C_expected[] = { -0.0299356f };
+ cblas_ssyr2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[i], C_expected[i], flteps, "ssyr2k(case 1615)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ int trans = 111;
+ int N = 1;
+ int K = 2;
+ float alpha = 0.1f;
+ float beta = 1.0f;
+ float A[] = { 0.492f, 0.021f };
+ int lda = 1;
+ float B[] = { -0.804f, -0.912f };
+ int ldb = 1;
+ float C[] = { -0.851f };
+ int ldc = 1;
+ float C_expected[] = { -0.933944f };
+ cblas_ssyr2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[i], C_expected[i], flteps, "ssyr2k(case 1616)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ int trans = 111;
+ int N = 1;
+ int K = 2;
+ float alpha = 0.1f;
+ float beta = 1.0f;
+ float A[] = { -0.376f, 0.689f };
+ int lda = 1;
+ float B[] = { 0.21f, 0.406f };
+ int ldb = 1;
+ float C[] = { -0.581f };
+ int ldc = 1;
+ float C_expected[] = { -0.540845f };
+ cblas_ssyr2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[i], C_expected[i], flteps, "ssyr2k(case 1617)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ int trans = 112;
+ int N = 1;
+ int K = 2;
+ float alpha = 1.0f;
+ float beta = -0.3f;
+ float A[] = { 0.629f, -0.883f };
+ int lda = 1;
+ float B[] = { -0.165f, 0.02f };
+ int ldb = 1;
+ float C[] = { 0.236f };
+ int ldc = 1;
+ float C_expected[] = { -0.31369f };
+ cblas_ssyr2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[i], C_expected[i], flteps, "ssyr2k(case 1618)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ int trans = 112;
+ int N = 1;
+ int K = 2;
+ float alpha = 1.0f;
+ float beta = -0.3f;
+ float A[] = { 0.412f, -0.411f };
+ int lda = 1;
+ float B[] = { 0.313f, 0.301f };
+ int ldb = 1;
+ float C[] = { 0.222f };
+ int ldc = 1;
+ float C_expected[] = { -0.05611f };
+ cblas_ssyr2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[i], C_expected[i], flteps, "ssyr2k(case 1619)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ int trans = 112;
+ int N = 1;
+ int K = 2;
+ float alpha = 1.0f;
+ float beta = -0.3f;
+ float A[] = { -0.02f, 0.593f };
+ int lda = 2;
+ float B[] = { -0.144f, 0.846f };
+ int ldb = 2;
+ float C[] = { -0.645f };
+ int ldc = 1;
+ float C_expected[] = { 1.20262f };
+ cblas_ssyr2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[i], C_expected[i], flteps, "ssyr2k(case 1620)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ int trans = 112;
+ int N = 1;
+ int K = 2;
+ float alpha = 1.0f;
+ float beta = -0.3f;
+ float A[] = { 0.253f, 0.937f };
+ int lda = 2;
+ float B[] = { 0.24f, -0.27f };
+ int ldb = 2;
+ float C[] = { 0.128f };
+ int ldc = 1;
+ float C_expected[] = { -0.42294f };
+ cblas_ssyr2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[i], C_expected[i], flteps, "ssyr2k(case 1621)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ int trans = 111;
+ int N = 1;
+ int K = 2;
+ double alpha = 0.1;
+ double beta = 0;
+ double A[] = { -0.225, 0.857 };
+ int lda = 2;
+ double B[] = { -0.933, 0.994 };
+ int ldb = 2;
+ double C[] = { 0.177 };
+ int ldc = 1;
+ double C_expected[] = { 0.2123566 };
+ cblas_dsyr2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[i], C_expected[i], dbleps, "dsyr2k(case 1622)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ int trans = 111;
+ int N = 1;
+ int K = 2;
+ double alpha = 0.1;
+ double beta = 0;
+ double A[] = { -0.955, 0.112 };
+ int lda = 2;
+ double B[] = { -0.695, 0.719 };
+ int ldb = 2;
+ double C[] = { 0.069 };
+ int ldc = 1;
+ double C_expected[] = { 0.1488506 };
+ cblas_dsyr2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[i], C_expected[i], dbleps, "dsyr2k(case 1623)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ int trans = 111;
+ int N = 1;
+ int K = 2;
+ double alpha = 0.1;
+ double beta = 0;
+ double A[] = { 0.216, 0.911 };
+ int lda = 1;
+ double B[] = { -0.074, -0.256 };
+ int ldb = 1;
+ double C[] = { -0.621 };
+ int ldc = 1;
+ double C_expected[] = { -0.04984 };
+ cblas_dsyr2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[i], C_expected[i], dbleps, "dsyr2k(case 1624)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ int trans = 111;
+ int N = 1;
+ int K = 2;
+ double alpha = 0.1;
+ double beta = 0;
+ double A[] = { -0.343, -0.381 };
+ int lda = 1;
+ double B[] = { -0.433, -0.087 };
+ int ldb = 1;
+ double C[] = { -0.889 };
+ int ldc = 1;
+ double C_expected[] = { 0.0363332 };
+ cblas_dsyr2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[i], C_expected[i], dbleps, "dsyr2k(case 1625)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ int trans = 112;
+ int N = 1;
+ int K = 2;
+ double alpha = 1;
+ double beta = -1;
+ double A[] = { -0.633, 0.219 };
+ int lda = 1;
+ double B[] = { 0.817, -0.683 };
+ int ldb = 1;
+ double C[] = { -0.294 };
+ int ldc = 1;
+ double C_expected[] = { -1.039476 };
+ cblas_dsyr2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[i], C_expected[i], dbleps, "dsyr2k(case 1626)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ int trans = 112;
+ int N = 1;
+ int K = 2;
+ double alpha = 1;
+ double beta = -1;
+ double A[] = { -0.887, -0.43 };
+ int lda = 1;
+ double B[] = { 0.557, 0.912 };
+ int ldb = 1;
+ double C[] = { 0.831 };
+ int ldc = 1;
+ double C_expected[] = { -2.603438 };
+ cblas_dsyr2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[i], C_expected[i], dbleps, "dsyr2k(case 1627)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ int trans = 112;
+ int N = 1;
+ int K = 2;
+ double alpha = 1;
+ double beta = -1;
+ double A[] = { 0.397, -0.173 };
+ int lda = 2;
+ double B[] = { 0.155, -0.99 };
+ int ldb = 2;
+ double C[] = { 0.621 };
+ int ldc = 1;
+ double C_expected[] = { -0.15539 };
+ cblas_dsyr2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[i], C_expected[i], dbleps, "dsyr2k(case 1628)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ int trans = 112;
+ int N = 1;
+ int K = 2;
+ double alpha = 1;
+ double beta = -1;
+ double A[] = { 0.833, -0.52 };
+ int lda = 2;
+ double B[] = { 0.28, 0.481 };
+ int ldb = 2;
+ double C[] = { 0.455 };
+ int ldc = 1;
+ double C_expected[] = { -0.48876 };
+ cblas_dsyr2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[i], C_expected[i], dbleps, "dsyr2k(case 1629)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ int trans = 111;
+ int N = 1;
+ int K = 2;
+ float alpha[2] = {0.0f, 0.1f};
+ float beta[2] = {0.0f, 0.0f};
+ float A[] = { -0.248f, -0.037f, -0.124f, 0.998f };
+ int lda = 2;
+ float B[] = { -0.608f, -0.115f, -0.718f, -0.551f };
+ int ldb = 2;
+ float C[] = { 0.187f, -0.329f };
+ int ldc = 1;
+ float C_expected[] = { 0.119445f, 0.157092f };
+ cblas_csyr2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "csyr2k(case 1630) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "csyr2k(case 1630) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ int trans = 111;
+ int N = 1;
+ int K = 2;
+ float alpha[2] = {0.0f, 0.1f};
+ float beta[2] = {0.0f, 0.0f};
+ float A[] = { 0.068f, 0.751f, -0.449f, -0.598f };
+ int lda = 2;
+ float B[] = { 0.616f, 0.805f, -0.635f, 0.773f };
+ int ldb = 2;
+ float C[] = { -0.287f, 0.917f };
+ int ldc = 1;
+ float C_expected[] = { -0.110002f, 0.0369404f };
+ cblas_csyr2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "csyr2k(case 1631) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "csyr2k(case 1631) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ int trans = 111;
+ int N = 1;
+ int K = 2;
+ float alpha[2] = {0.0f, 0.1f};
+ float beta[2] = {0.0f, 0.0f};
+ float A[] = { -0.396f, -0.603f, -0.131f, -0.288f };
+ int lda = 1;
+ float B[] = { -0.64f, -0.444f, -0.085f, 0.936f };
+ int ldb = 1;
+ float C[] = { 0.375f, -0.434f };
+ int ldc = 1;
+ float C_expected[] = { -0.0927216f, 0.0532822f };
+ cblas_csyr2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "csyr2k(case 1632) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "csyr2k(case 1632) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ int trans = 111;
+ int N = 1;
+ int K = 2;
+ float alpha[2] = {0.0f, 0.1f};
+ float beta[2] = {0.0f, 0.0f};
+ float A[] = { 0.655f, 0.16f, 0.45f, -0.747f };
+ int lda = 1;
+ float B[] = { 0.923f, 0.432f, -0.986f, 0.259f };
+ int ldb = 1;
+ float C[] = { 0.752f, 0.576f };
+ int ldc = 1;
+ float C_expected[] = { -0.256746f, 0.0570436f };
+ cblas_csyr2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "csyr2k(case 1633) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "csyr2k(case 1633) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ int trans = 112;
+ int N = 1;
+ int K = 2;
+ float alpha[2] = {0.0f, 0.1f};
+ float beta[2] = {0.0f, 0.0f};
+ float A[] = { -0.765f, 0.487f, 0.7f, 0.768f };
+ int lda = 1;
+ float B[] = { -0.529f, 0.056f, -0.584f, 0.928f };
+ int ldb = 1;
+ float C[] = { -0.426f, 0.836f };
+ int ldc = 1;
+ float C_expected[] = { 0.019875f, -0.148818f };
+ cblas_csyr2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "csyr2k(case 1634) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "csyr2k(case 1634) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ int trans = 112;
+ int N = 1;
+ int K = 2;
+ float alpha[2] = {0.0f, 0.1f};
+ float beta[2] = {0.0f, 0.0f};
+ float A[] = { 0.25f, 0.489f, 0.8f, -0.642f };
+ int lda = 1;
+ float B[] = { -0.732f, -0.856f, -0.654f, 0.591f };
+ int ldb = 1;
+ float C[] = { -0.101f, 0.322f };
+ int ldc = 1;
+ float C_expected[] = { -0.064144f, 0.0183612f };
+ cblas_csyr2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "csyr2k(case 1635) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "csyr2k(case 1635) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ int trans = 112;
+ int N = 1;
+ int K = 2;
+ float alpha[2] = {0.0f, 0.1f};
+ float beta[2] = {0.0f, 0.0f};
+ float A[] = { -0.579f, -0.971f, 0.521f, -0.824f };
+ int lda = 2;
+ float B[] = { -0.227f, 0.907f, 0.457f, -0.274f };
+ int ldb = 2;
+ float C[] = { 0.21f, -0.718f };
+ int ldc = 1;
+ float C_expected[] = { 0.164812f, 0.20489f };
+ cblas_csyr2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "csyr2k(case 1636) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "csyr2k(case 1636) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ int trans = 112;
+ int N = 1;
+ int K = 2;
+ float alpha[2] = {0.0f, 0.1f};
+ float beta[2] = {0.0f, 0.0f};
+ float A[] = { -0.83f, -0.512f, -0.667f, -0.436f };
+ int lda = 2;
+ float B[] = { -0.443f, 0.82f, -0.259f, -0.618f };
+ int ldb = 2;
+ float C[] = { 0.583f, 0.668f };
+ int ldc = 1;
+ float C_expected[] = { -0.0142692f, 0.138167f };
+ cblas_csyr2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "csyr2k(case 1637) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "csyr2k(case 1637) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ int trans = 111;
+ int N = 1;
+ int K = 2;
+ double alpha[2] = {0, 0};
+ double beta[2] = {-0.3, 0.1};
+ double A[] = { -0.315, 0.03, 0.281, 0.175 };
+ int lda = 2;
+ double B[] = { -0.832, -0.964, 0.291, 0.476 };
+ int ldb = 2;
+ double C[] = { -0.341, 0.743 };
+ int ldc = 1;
+ double C_expected[] = { 0.028, -0.257 };
+ cblas_zsyr2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zsyr2k(case 1638) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zsyr2k(case 1638) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ int trans = 111;
+ int N = 1;
+ int K = 2;
+ double alpha[2] = {0, 0};
+ double beta[2] = {-0.3, 0.1};
+ double A[] = { -0.159, -0.489, -0.11, 0.611 };
+ int lda = 2;
+ double B[] = { -0.285, -0.048, -0.673, -0.492 };
+ int ldb = 2;
+ double C[] = { 0.496, -0.626 };
+ int ldc = 1;
+ double C_expected[] = { -0.0862, 0.2374 };
+ cblas_zsyr2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zsyr2k(case 1639) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zsyr2k(case 1639) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ int trans = 111;
+ int N = 1;
+ int K = 2;
+ double alpha[2] = {0, 0};
+ double beta[2] = {-0.3, 0.1};
+ double A[] = { 0.796, 0.872, -0.919, 0.748 };
+ int lda = 1;
+ double B[] = { -0.945, 0.915, -0.252, -0.276 };
+ int ldb = 1;
+ double C[] = { 0.07, -0.957 };
+ int ldc = 1;
+ double C_expected[] = { 0.0747, 0.2941 };
+ cblas_zsyr2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zsyr2k(case 1640) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zsyr2k(case 1640) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ int trans = 111;
+ int N = 1;
+ int K = 2;
+ double alpha[2] = {0, 0};
+ double beta[2] = {-0.3, 0.1};
+ double A[] = { 0.984, 0.526, 0.284, 0.806 };
+ int lda = 1;
+ double B[] = { -0.509, -0.178, 0.188, -0.221 };
+ int ldb = 1;
+ double C[] = { -0.388, 0.795 };
+ int ldc = 1;
+ double C_expected[] = { 0.0369, -0.2773 };
+ cblas_zsyr2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zsyr2k(case 1641) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zsyr2k(case 1641) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ int trans = 112;
+ int N = 1;
+ int K = 2;
+ double alpha[2] = {1, 0};
+ double beta[2] = {0, 0.1};
+ double A[] = { 0.628, 0.846, -0.645, 0.032 };
+ int lda = 1;
+ double B[] = { 0.545, -0.54, 0.493, -0.035 };
+ int ldb = 1;
+ double C[] = { -0.16, -0.06 };
+ int ldc = 1;
+ double C_expected[] = { 0.97047, 0.304602 };
+ cblas_zsyr2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zsyr2k(case 1642) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zsyr2k(case 1642) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ int trans = 112;
+ int N = 1;
+ int K = 2;
+ double alpha[2] = {1, 0};
+ double beta[2] = {0, 0.1};
+ double A[] = { -0.556, -0.946, 0.177, -0.859 };
+ int lda = 1;
+ double B[] = { 0.423, -0.91, 0.736, -0.251 };
+ int ldb = 1;
+ double C[] = { -0.478, 0.519 };
+ int ldc = 1;
+ double C_expected[] = { -2.41467, -1.189498 };
+ cblas_zsyr2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zsyr2k(case 1643) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zsyr2k(case 1643) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ int trans = 112;
+ int N = 1;
+ int K = 2;
+ double alpha[2] = {1, 0};
+ double beta[2] = {0, 0.1};
+ double A[] = { -0.582, 0.09, -0.176, 0.784 };
+ int lda = 2;
+ double B[] = { 0.687, -0.859, 0.945, 0.756 };
+ int ldb = 2;
+ double C[] = { -0.663, -0.186 };
+ int ldc = 1;
+ double C_expected[] = { -2.144496, 2.272884 };
+ cblas_zsyr2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zsyr2k(case 1644) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zsyr2k(case 1644) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ int trans = 112;
+ int N = 1;
+ int K = 2;
+ double alpha[2] = {1, 0};
+ double beta[2] = {0, 0.1};
+ double A[] = { 0.231, -0.452, -0.112, -0.837 };
+ int lda = 2;
+ double B[] = { -0.258, 0.464, -0.224, 0.893 };
+ int ldb = 2;
+ double C[] = { -0.448, 0.046 };
+ int ldc = 1;
+ double C_expected[] = { 1.840718, 0.577744 };
+ cblas_zsyr2k(order, uplo, trans, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zsyr2k(case 1645) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zsyr2k(case 1645) imag");
+ };
+ };
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_syrk.c b/gsl-1.9/cblas/test_syrk.c
new file mode 100644
index 0000000..21531d5
--- /dev/null
+++ b/gsl-1.9/cblas/test_syrk.c
@@ -0,0 +1,763 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_syrk (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ int order = 101;
+ int uplo = 121;
+ int trans = 111;
+ int N = 2;
+ int K = 1;
+ float alpha = -1.0f;
+ float beta = 0.1f;
+ float A[] = { 0.412f, -0.229f };
+ int lda = 1;
+ float C[] = { 0.628f, -0.664f, -0.268f, 0.096f };
+ int ldc = 2;
+ float C_expected[] = { -0.106944f, 0.027948f, -0.268f, -0.042841f };
+ cblas_ssyrk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[i], C_expected[i], flteps, "ssyrk(case 1566)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ int trans = 111;
+ int N = 2;
+ int K = 1;
+ float alpha = -1.0f;
+ float beta = 0.1f;
+ float A[] = { 0.101f, -0.653f };
+ int lda = 2;
+ float C[] = { 0.432f, 0.107f, -0.952f, -0.532f };
+ int ldc = 2;
+ float C_expected[] = { 0.032999f, 0.107f, -0.029247f, -0.479609f };
+ cblas_ssyrk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[i], C_expected[i], flteps, "ssyrk(case 1567)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ int trans = 112;
+ int N = 2;
+ int K = 1;
+ float alpha = 1.0f;
+ float beta = 0.1f;
+ float A[] = { 0.79f, 0.595f };
+ int lda = 2;
+ float C[] = { 0.257f, 0.183f, -0.021f, -0.053f };
+ int ldc = 2;
+ float C_expected[] = { 0.6498f, 0.48835f, -0.021f, 0.348725f };
+ cblas_ssyrk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[i], C_expected[i], flteps, "ssyrk(case 1568)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ int trans = 112;
+ int N = 2;
+ int K = 1;
+ float alpha = 1.0f;
+ float beta = 0.1f;
+ float A[] = { -0.181f, -0.654f };
+ int lda = 1;
+ float C[] = { -0.4f, 0.615f, 0.147f, -0.163f };
+ int ldc = 2;
+ float C_expected[] = { -0.007239f, 0.615f, 0.133074f, 0.411416f };
+ cblas_ssyrk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[i], C_expected[i], flteps, "ssyrk(case 1569)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ int trans = 111;
+ int N = 2;
+ int K = 1;
+ float alpha = 0.0f;
+ float beta = -1.0f;
+ float A[] = { -0.191f, 0.584f };
+ int lda = 1;
+ float C[] = { -0.719f, -0.681f, -0.003f, 0.544f };
+ int ldc = 2;
+ float C_expected[] = { 0.719f, -0.681f, 0.003f, -0.544f };
+ cblas_ssyrk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[i], C_expected[i], flteps, "ssyrk(case 1570)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ int trans = 111;
+ int N = 2;
+ int K = 1;
+ float alpha = 0.0f;
+ float beta = -1.0f;
+ float A[] = { 0.788f, 0.041f };
+ int lda = 2;
+ float C[] = { 0.029f, 0.365f, 0.739f, -0.769f };
+ int ldc = 2;
+ float C_expected[] = { -0.029f, -0.365f, 0.739f, 0.769f };
+ cblas_ssyrk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[i], C_expected[i], flteps, "ssyrk(case 1571)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ int trans = 112;
+ int N = 2;
+ int K = 1;
+ float alpha = -0.3f;
+ float beta = -1.0f;
+ float A[] = { 0.733f, 0.678f };
+ int lda = 2;
+ float C[] = { -0.941f, 0.96f, 0.07f, -0.295f };
+ int ldc = 2;
+ float C_expected[] = { 0.779813f, 0.96f, -0.219092f, 0.157095f };
+ cblas_ssyrk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[i], C_expected[i], flteps, "ssyrk(case 1572)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ int trans = 112;
+ int N = 2;
+ int K = 1;
+ float alpha = -0.3f;
+ float beta = -1.0f;
+ float A[] = { -0.87f, 0.675f };
+ int lda = 1;
+ float C[] = { -0.602f, -0.432f, -0.984f, 0.384f };
+ int ldc = 2;
+ float C_expected[] = { 0.37493f, 0.608175f, -0.984f, -0.520687f };
+ cblas_ssyrk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[i], C_expected[i], flteps, "ssyrk(case 1573)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ int trans = 111;
+ int N = 2;
+ int K = 1;
+ double alpha = 0.1;
+ double beta = -0.3;
+ double A[] = { 0.169, -0.875 };
+ int lda = 1;
+ double C[] = { 0.159, 0.277, 0.865, 0.346 };
+ int ldc = 2;
+ double C_expected[] = { -0.0448439, -0.0978875, 0.865, -0.0272375 };
+ cblas_dsyrk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[i], C_expected[i], dbleps, "dsyrk(case 1574)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ int trans = 111;
+ int N = 2;
+ int K = 1;
+ double alpha = 0.1;
+ double beta = -0.3;
+ double A[] = { 0.536, -0.725 };
+ int lda = 2;
+ double C[] = { 0.154, -0.445, -0.841, -0.91 };
+ int ldc = 2;
+ double C_expected[] = { -0.0174704, -0.445, 0.21344, 0.3255625 };
+ cblas_dsyrk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[i], C_expected[i], dbleps, "dsyrk(case 1575)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ int trans = 112;
+ int N = 2;
+ int K = 1;
+ double alpha = 0;
+ double beta = -1;
+ double A[] = { -0.07, 0.8 };
+ int lda = 2;
+ double C[] = { 0.823, -0.88, -0.136, 0.793 };
+ int ldc = 2;
+ double C_expected[] = { -0.823, 0.88, -0.136, -0.793 };
+ cblas_dsyrk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[i], C_expected[i], dbleps, "dsyrk(case 1576)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ int trans = 112;
+ int N = 2;
+ int K = 1;
+ double alpha = 0;
+ double beta = -1;
+ double A[] = { -0.058, 0.649 };
+ int lda = 1;
+ double C[] = { -0.187, 0.294, -0.004, -0.933 };
+ int ldc = 2;
+ double C_expected[] = { 0.187, 0.294, 0.004, 0.933 };
+ cblas_dsyrk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[i], C_expected[i], dbleps, "dsyrk(case 1577)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ int trans = 111;
+ int N = 2;
+ int K = 1;
+ double alpha = 1;
+ double beta = -1;
+ double A[] = { 0.263, -0.289 };
+ int lda = 1;
+ double C[] = { 0.554, -0.679, 0.993, 0.758 };
+ int ldc = 2;
+ double C_expected[] = { -0.484831, -0.679, -1.069007, -0.674479 };
+ cblas_dsyrk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[i], C_expected[i], dbleps, "dsyrk(case 1578)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ int trans = 111;
+ int N = 2;
+ int K = 1;
+ double alpha = 1;
+ double beta = -1;
+ double A[] = { -0.265, -0.837 };
+ int lda = 2;
+ double C[] = { -0.994, 0.967, -0.34, -0.069 };
+ int ldc = 2;
+ double C_expected[] = { 1.064225, -0.745195, -0.34, 0.769569 };
+ cblas_dsyrk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[i], C_expected[i], dbleps, "dsyrk(case 1579)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ int trans = 112;
+ int N = 2;
+ int K = 1;
+ double alpha = -0.3;
+ double beta = 1;
+ double A[] = { -0.464, 0.394 };
+ int lda = 2;
+ double C[] = { -0.45, -0.447, 0.649, 0.055 };
+ int ldc = 2;
+ double C_expected[] = { -0.5145888, -0.447, 0.7038448, 0.0084292 };
+ cblas_dsyrk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[i], C_expected[i], dbleps, "dsyrk(case 1580)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ int trans = 112;
+ int N = 2;
+ int K = 1;
+ double alpha = -0.3;
+ double beta = 1;
+ double A[] = { 0.815, 0.168 };
+ int lda = 1;
+ double C[] = { 0.817, -0.957, -0.395, -0.382 };
+ int ldc = 2;
+ double C_expected[] = { 0.6177325, -0.998076, -0.395, -0.3904672 };
+ cblas_dsyrk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[i], C_expected[i], dbleps, "dsyrk(case 1581)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ int trans = 111;
+ int N = 2;
+ int K = 1;
+ float alpha[2] = {0.0f, 0.0f};
+ float beta[2] = {-0.3f, 0.1f};
+ float A[] = { 0.447f, -0.507f, -0.425f, 0.701f };
+ int lda = 1;
+ float C[] = { 0.16f, -0.245f, 0.922f, -0.437f, 0.24f, 0.008f, -0.095f, 0.749f };
+ int ldc = 2;
+ float C_expected[] = { -0.0235f, 0.0895f, -0.2329f, 0.2233f, 0.24f, 0.008f, -0.0464f, -0.2342f };
+ cblas_csyrk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "csyrk(case 1582) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "csyrk(case 1582) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ int trans = 111;
+ int N = 2;
+ int K = 1;
+ float alpha[2] = {0.0f, 0.0f};
+ float beta[2] = {-0.3f, 0.1f};
+ float A[] = { -0.421f, -0.435f, -0.914f, -0.493f };
+ int lda = 2;
+ float C[] = { -0.761f, -0.38f, 0.043f, -0.999f, 0.779f, 0.238f, 0.082f, 0.394f };
+ int ldc = 2;
+ float C_expected[] = { 0.2663f, 0.0379f, 0.043f, -0.999f, -0.2575f, 0.0065f, -0.064f, -0.11f };
+ cblas_csyrk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "csyrk(case 1583) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "csyrk(case 1583) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ int trans = 112;
+ int N = 2;
+ int K = 1;
+ float alpha[2] = {-1.0f, 0.0f};
+ float beta[2] = {-0.3f, 0.1f};
+ float A[] = { 0.827f, -0.896f, 0.417f, 0.865f };
+ int lda = 2;
+ float C[] = { -0.349f, -0.31f, 0.972f, 0.794f, -0.906f, -0.595f, -0.089f, -0.333f };
+ int ldc = 2;
+ float C_expected[] = { 0.254587f, 1.54008f, -1.4909f, -0.482723f, -0.906f, -0.595f, 0.634336f, -0.63041f };
+ cblas_csyrk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "csyrk(case 1584) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "csyrk(case 1584) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ int trans = 112;
+ int N = 2;
+ int K = 1;
+ float alpha[2] = {-1.0f, 0.0f};
+ float beta[2] = {-0.3f, 0.1f};
+ float A[] = { 0.607f, 0.747f, -0.889f, 0.333f };
+ int lda = 1;
+ float C[] = { 0.244f, 0.564f, 0.009f, 0.578f, -0.827f, 0.558f, -0.337f, 0.731f };
+ int ldc = 2;
+ float C_expected[] = { 0.05996f, -1.05166f, 0.009f, 0.578f, 0.980674f, 0.211852f, -0.651432f, 0.339074f };
+ cblas_csyrk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "csyrk(case 1585) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "csyrk(case 1585) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ int trans = 111;
+ int N = 2;
+ int K = 1;
+ float alpha[2] = {1.0f, 0.0f};
+ float beta[2] = {0.0f, 1.0f};
+ float A[] = { 0.784f, -0.281f, -0.88f, 0.479f };
+ int lda = 1;
+ float C[] = { 0.491f, 0.531f, 0.805f, -0.097f, 0.728f, 0.674f, -0.705f, -0.754f };
+ int ldc = 2;
+ float C_expected[] = { 0.004695f, 0.050392f, 0.805f, -0.097f, -1.22932f, 1.35082f, 1.29896f, -1.54804f };
+ cblas_csyrk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "csyrk(case 1586) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "csyrk(case 1586) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ int trans = 111;
+ int N = 2;
+ int K = 1;
+ float alpha[2] = {1.0f, 0.0f};
+ float beta[2] = {0.0f, 1.0f};
+ float A[] = { 0.272f, -0.146f, 0.155f, 0.038f };
+ int lda = 2;
+ float C[] = { 0.533f, -0.41f, -0.904f, 0.301f, -0.836f, 0.57f, -0.374f, -0.293f };
+ int ldc = 2;
+ float C_expected[] = { 0.462668f, 0.453576f, -0.253292f, -0.916294f, -0.836f, 0.57f, 0.315581f, -0.36222f };
+ cblas_csyrk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "csyrk(case 1587) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "csyrk(case 1587) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ int trans = 112;
+ int N = 2;
+ int K = 1;
+ float alpha[2] = {0.0f, 1.0f};
+ float beta[2] = {-1.0f, 0.0f};
+ float A[] = { -0.055f, -0.127f, -0.896f, -0.625f };
+ int lda = 2;
+ float C[] = { -0.619f, 0.511f, -0.877f, 0.557f, -0.801f, -0.437f, -0.922f, 0.332f };
+ int ldc = 2;
+ float C_expected[] = { 0.60503f, -0.524104f, -0.877f, 0.557f, 0.652833f, 0.406905f, -0.198f, 0.080191f };
+ cblas_csyrk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "csyrk(case 1588) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "csyrk(case 1588) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ int trans = 112;
+ int N = 2;
+ int K = 1;
+ float alpha[2] = {0.0f, 1.0f};
+ float beta[2] = {-1.0f, 0.0f};
+ float A[] = { -0.528f, 0.759f, -0.079f, 0.952f };
+ int lda = 1;
+ float C[] = { 0.775f, 0.855f, 0.786f, 0.525f, 0.85f, 0.044f, 0.658f, 0.947f };
+ int ldc = 2;
+ float C_expected[] = { 0.026504f, -1.1523f, -0.223383f, -1.20586f, 0.85f, 0.044f, -0.507584f, -1.84706f };
+ cblas_csyrk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], flteps, "csyrk(case 1589) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], flteps, "csyrk(case 1589) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ int trans = 111;
+ int N = 2;
+ int K = 1;
+ double alpha[2] = {1, 0};
+ double beta[2] = {1, 0};
+ double A[] = { -0.049, -0.687, -0.434, 0.294 };
+ int lda = 1;
+ double C[] = { 0.937, -0.113, 0.796, 0.293, 0.876, -0.199, -0.757, -0.103 };
+ int ldc = 2;
+ double C_expected[] = { 0.467432, -0.045674, 1.019244, 0.576752, 0.876, -0.199, -0.65508, -0.358192 };
+ cblas_zsyrk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zsyrk(case 1590) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zsyrk(case 1590) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ int trans = 111;
+ int N = 2;
+ int K = 1;
+ double alpha[2] = {1, 0};
+ double beta[2] = {1, 0};
+ double A[] = { 0.359, -0.364, 0.926, -0.69 };
+ int lda = 2;
+ double C[] = { 0.306, 0.249, 0.28, 0.229, 0.866, 0.092, 0.886, -0.283 };
+ int ldc = 2;
+ double C_expected[] = { 0.302385, -0.012352, 0.28, 0.229, 0.947274, -0.492774, 1.267376, -1.56088 };
+ cblas_zsyrk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zsyrk(case 1591) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zsyrk(case 1591) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 121;
+ int trans = 112;
+ int N = 2;
+ int K = 1;
+ double alpha[2] = {-0.3, 0.1};
+ double beta[2] = {0, 0};
+ double A[] = { 0.607, 0.555, -0.85, 0.831 };
+ int lda = 2;
+ double C[] = { 0.069, 0.368, 0.551, -0.912, -0.243, -0.063, -0.924, 0.192 };
+ int ldc = 2;
+ double C_expected[] = { -0.0855042, -0.1960886, 0.2898798, -0.1075156, -0.243, -0.063, 0.1316883, 0.4270039 };
+ cblas_zsyrk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zsyrk(case 1592) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zsyrk(case 1592) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 121;
+ int trans = 112;
+ int N = 2;
+ int K = 1;
+ double alpha[2] = {-0.3, 0.1};
+ double beta[2] = {0, 0};
+ double A[] = { 0.427, 0.86, -0.136, 0.002 };
+ int lda = 1;
+ double C[] = { 0.398, -0.47, 0.011, -0.547, -0.106, 0.016, 0.681, 0.246 };
+ int ldc = 2;
+ double C_expected[] = { 0.0937373, -0.2760591, 0.011, -0.547, 0.0295482, 0.0288526, -0.0054932, 0.0020124 };
+ cblas_zsyrk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zsyrk(case 1593) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zsyrk(case 1593) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ int trans = 111;
+ int N = 2;
+ int K = 1;
+ double alpha[2] = {-0.3, 0.1};
+ double beta[2] = {1, 0};
+ double A[] = { 0.718, 0.023, 0.355, -0.492 };
+ int lda = 1;
+ double C[] = { -0.637, -0.727, -0.475, -0.776, 0.802, -0.55, -0.837, 0.222 };
+ int ldc = 2;
+ double C_expected[] = { -0.7948013, -0.6854089, -0.475, -0.776, 0.7566473, -0.4198521, -0.7672563, 0.3151921 };
+ cblas_zsyrk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zsyrk(case 1594) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zsyrk(case 1594) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ int trans = 111;
+ int N = 2;
+ int K = 1;
+ double alpha[2] = {-0.3, 0.1};
+ double beta[2] = {1, 0};
+ double A[] = { 0.209, 0.139, -0.202, -0.223 };
+ int lda = 2;
+ double C[] = { -0.695, 0.524, 0.212, -0.88, -0.752, 0.291, 0.684, -0.124 };
+ int ldc = 2;
+ double C_expected[] = { -0.7081182, 0.5090054, 0.2228348, -0.8587166, -0.752, 0.291, 0.6776683, -0.1519201 };
+ cblas_zsyrk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zsyrk(case 1595) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zsyrk(case 1595) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int uplo = 122;
+ int trans = 112;
+ int N = 2;
+ int K = 1;
+ double alpha[2] = {-0.3, 0.1};
+ double beta[2] = {1, 0};
+ double A[] = { -0.365, -0.624, 0.632, 0.348 };
+ int lda = 2;
+ double C[] = { 0.877, 0.927, -0.377, 0.967, 0.008, 0.292, -0.779, 0.794 };
+ int ldc = 2;
+ double C_expected[] = { 0.9082933, 0.7647289, -0.377, 0.967, 0.0641972, 0.4470636, -0.9064832, 0.6898704 };
+ cblas_zsyrk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zsyrk(case 1596) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zsyrk(case 1596) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int uplo = 122;
+ int trans = 112;
+ int N = 2;
+ int K = 1;
+ double alpha[2] = {-0.3, 0.1};
+ double beta[2] = {1, 0};
+ double A[] = { -0.067, -0.586, 0.208, 0.331 };
+ int lda = 1;
+ double C[] = { 0.584, -0.454, 0.93, 0.782, 0.489, -0.278, 0.081, -0.919 };
+ int ldc = 2;
+ double C_expected[] = { 0.6778197, -0.5114479, 0.8903975, 0.8432225, 0.489, -0.278, 0.0871195, -0.9669385 };
+ cblas_zsyrk(order, uplo, trans, N, K, alpha, A, lda, beta, C, ldc);
+ {
+ int i;
+ for (i = 0; i < 4; i++) {
+ gsl_test_rel(C[2*i], C_expected[2*i], dbleps, "zsyrk(case 1597) real");
+ gsl_test_rel(C[2*i+1], C_expected[2*i+1], dbleps, "zsyrk(case 1597) imag");
+ };
+ };
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_tbmv.c b/gsl-1.9/cblas/test_tbmv.c
new file mode 100644
index 0000000..abd349f
--- /dev/null
+++ b/gsl-1.9/cblas/test_tbmv.c
@@ -0,0 +1,1819 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_tbmv (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.439f, -0.484f, -0.952f, -0.508f, 0.381f, -0.889f, -0.192f, -0.279f, -0.155f };
+ float X[] = { -0.089f, -0.688f, -0.203f };
+ int incX = -1;
+ float x_expected[] = { 0.017088f, 0.315595f, 0.243875f };
+ cblas_stbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stbmv(case 894)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.439f, -0.484f, -0.952f, -0.508f, 0.381f, -0.889f, -0.192f, -0.279f, -0.155f };
+ float X[] = { -0.089f, -0.688f, -0.203f };
+ int incX = -1;
+ float x_expected[] = { -0.089f, -0.721909f, 0.129992f };
+ cblas_stbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stbmv(case 895)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.439f, -0.484f, -0.952f, -0.508f, 0.381f, -0.889f, -0.192f, -0.279f, -0.155f };
+ float X[] = { -0.089f, -0.688f, -0.203f };
+ int incX = -1;
+ float x_expected[] = { 0.156927f, -0.159004f, 0.098252f };
+ cblas_stbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stbmv(case 896)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.439f, -0.484f, -0.952f, -0.508f, 0.381f, -0.889f, -0.192f, -0.279f, -0.155f };
+ float X[] = { -0.089f, -0.688f, -0.203f };
+ int incX = -1;
+ float x_expected[] = { 0.043096f, -0.584876f, -0.203f };
+ cblas_stbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stbmv(case 897)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.439f, -0.484f, -0.952f, -0.508f, 0.381f, -0.889f, -0.192f, -0.279f, -0.155f };
+ float X[] = { -0.089f, -0.688f, -0.203f };
+ int incX = -1;
+ float x_expected[] = { 0.024831f, -0.24504f, 0.447756f };
+ cblas_stbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stbmv(case 898)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.439f, -0.484f, -0.952f, -0.508f, 0.381f, -0.889f, -0.192f, -0.279f, -0.155f };
+ float X[] = { -0.089f, -0.688f, -0.203f };
+ int incX = -1;
+ float x_expected[] = { -0.089f, -0.670912f, 0.146504f };
+ cblas_stbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stbmv(case 899)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.439f, -0.484f, -0.952f, -0.508f, 0.381f, -0.889f, -0.192f, -0.279f, -0.155f };
+ float X[] = { -0.089f, -0.688f, -0.203f };
+ int incX = -1;
+ float x_expected[] = { -0.24504f, 0.447756f, -0.089117f };
+ cblas_stbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stbmv(case 900)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.439f, -0.484f, -0.952f, -0.508f, 0.381f, -0.889f, -0.192f, -0.279f, -0.155f };
+ float X[] = { -0.089f, -0.688f, -0.203f };
+ int incX = -1;
+ float x_expected[] = { -0.351128f, -0.589748f, -0.203f };
+ cblas_stbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stbmv(case 901)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.94f, -0.091f, 0.984f, -0.276f, -0.342f, -0.484f, -0.665f, -0.2f, 0.349f };
+ float X[] = { 0.023f, -0.501f, -0.562f };
+ int incX = -1;
+ float x_expected[] = { 0.156047f, 0.189418f, -0.52828f };
+ cblas_stbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stbmv(case 902)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.94f, -0.091f, 0.984f, -0.276f, -0.342f, -0.484f, -0.665f, -0.2f, 0.349f };
+ float X[] = { 0.023f, -0.501f, -0.562f };
+ int incX = -1;
+ float x_expected[] = { 0.194342f, -0.449858f, -0.562f };
+ cblas_stbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stbmv(case 903)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.94f, -0.091f, 0.984f, -0.276f, -0.342f, -0.484f, -0.665f, -0.2f, 0.349f };
+ float X[] = { 0.023f, -0.501f, -0.562f };
+ int incX = -1;
+ float x_expected[] = { -0.0046f, 0.156047f, 0.189418f };
+ cblas_stbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stbmv(case 904)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.94f, -0.091f, 0.984f, -0.276f, -0.342f, -0.484f, -0.665f, -0.2f, 0.349f };
+ float X[] = { 0.023f, -0.501f, -0.562f };
+ int incX = -1;
+ float x_expected[] = { 0.023f, -0.516295f, -0.423724f };
+ cblas_stbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stbmv(case 905)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.94f, -0.091f, 0.984f, -0.276f, -0.342f, -0.484f, -0.665f, -0.2f, 0.349f };
+ float X[] = { 0.023f, -0.501f, -0.562f };
+ int incX = -1;
+ float x_expected[] = { 0.328565f, 0.326454f, 0.051142f };
+ cblas_stbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stbmv(case 906)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.94f, -0.091f, 0.984f, -0.276f, -0.342f, -0.484f, -0.665f, -0.2f, 0.349f };
+ float X[] = { 0.023f, -0.501f, -0.562f };
+ int incX = -1;
+ float x_expected[] = { 0.356165f, -0.345888f, -0.562f };
+ cblas_stbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stbmv(case 907)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.94f, -0.091f, 0.984f, -0.276f, -0.342f, -0.484f, -0.665f, -0.2f, 0.349f };
+ float X[] = { 0.023f, -0.501f, -0.562f };
+ int incX = -1;
+ float x_expected[] = { -0.015295f, 0.13041f, -0.482689f };
+ cblas_stbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stbmv(case 908)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.94f, -0.091f, 0.984f, -0.276f, -0.342f, -0.484f, -0.665f, -0.2f, 0.349f };
+ float X[] = { 0.023f, -0.501f, -0.562f };
+ int incX = -1;
+ float x_expected[] = { 0.023f, -0.508866f, -0.516409f };
+ cblas_stbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stbmv(case 909)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.566, 0.955, -0.086, -0.856, 0.177, 0.974, -0.652, -0.884, 0.77 };
+ double X[] = { -0.77, -0.818, 0.337 };
+ int incX = -1;
+ double x_expected[] = { 0.50204, 0.563918, -0.590448 };
+ cblas_dtbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtbmv(case 910)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.566, 0.955, -0.086, -0.856, 0.177, 0.974, -0.652, -0.884, 0.77 };
+ double X[] = { -0.77, -0.818, 0.337 };
+ int incX = -1;
+ double x_expected[] = { -0.77, -0.95429, -0.44419 };
+ cblas_dtbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtbmv(case 911)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.566, 0.955, -0.086, -0.856, 0.177, 0.974, -0.652, -0.884, 0.77 };
+ double X[] = { -0.77, -0.818, 0.337 };
+ int incX = -1;
+ double x_expected[] = { 1.214016, -0.433258, 0.321835 };
+ cblas_dtbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtbmv(case 912)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.566, 0.955, -0.086, -0.856, 0.177, 0.974, -0.652, -0.884, 0.77 };
+ double X[] = { -0.77, -0.818, 0.337 };
+ int incX = -1;
+ double x_expected[] = { -0.236664, -1.106472, 0.337 };
+ cblas_dtbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtbmv(case 913)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.566, 0.955, -0.086, -0.856, 0.177, 0.974, -0.652, -0.884, 0.77 };
+ double X[] = { -0.77, -0.818, 0.337 };
+ int incX = -1;
+ double x_expected[] = { 0.68068, 0.357254, 1.022043 };
+ cblas_dtbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtbmv(case 914)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.566, 0.955, -0.086, -0.856, 0.177, 0.974, -0.652, -0.884, 0.77 };
+ double X[] = { -0.77, -0.818, 0.337 };
+ int incX = -1;
+ double x_expected[] = { -0.77, -0.31596, 1.037208 };
+ cblas_dtbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtbmv(case 915)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.566, 0.955, -0.086, -0.856, 0.177, 0.974, -0.652, -0.884, 0.77 };
+ double X[] = { -0.77, -0.818, 0.337 };
+ int incX = -1;
+ double x_expected[] = { 0.357254, 1.022043, 0.190742 };
+ cblas_dtbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtbmv(case 916)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.566, 0.955, -0.086, -0.856, 0.177, 0.974, -0.652, -0.884, 0.77 };
+ double X[] = { -0.77, -0.818, 0.337 };
+ int incX = -1;
+ double x_expected[] = { -0.914786, -0.496165, 0.337 };
+ cblas_dtbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtbmv(case 917)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.188, 0.6, -0.743, -0.803, 0.449, -0.681, -0.464, -0.029, 0.553 };
+ double X[] = { -0.851, 0.481, 0.155 };
+ int incX = -1;
+ double x_expected[] = { 0.610833, -0.293243, 0.02914 };
+ cblas_dtbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtbmv(case 918)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.188, 0.6, -0.743, -0.803, 0.449, -0.681, -0.464, -0.029, 0.553 };
+ double X[] = { -0.851, 0.481, 0.155 };
+ int incX = -1;
+ double x_expected[] = { -0.635031, 0.574, 0.155 };
+ cblas_dtbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtbmv(case 919)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.188, 0.6, -0.743, -0.803, 0.449, -0.681, -0.464, -0.029, 0.553 };
+ double X[] = { -0.851, 0.481, 0.155 };
+ int incX = -1;
+ double x_expected[] = { 0.024679, 0.610833, -0.293243 };
+ cblas_dtbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtbmv(case 920)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.188, 0.6, -0.743, -0.803, 0.449, -0.681, -0.464, -0.029, 0.553 };
+ double X[] = { -0.851, 0.481, 0.155 };
+ int incX = -1;
+ double x_expected[] = { -0.851, 0.875864, -0.231243 };
+ cblas_dtbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtbmv(case 921)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.188, 0.6, -0.743, -0.803, 0.449, -0.681, -0.464, -0.029, 0.553 };
+ double X[] = { -0.851, 0.481, 0.155 };
+ int incX = -1;
+ double x_expected[] = { -0.198505, 0.091504, 0.093 };
+ cblas_dtbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtbmv(case 922)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.188, 0.6, -0.743, -0.803, 0.449, -0.681, -0.464, -0.029, 0.553 };
+ double X[] = { -0.851, 0.481, 0.155 };
+ int incX = -1;
+ double x_expected[] = { -1.074184, 0.356535, 0.155 };
+ cblas_dtbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtbmv(case 923)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.188, 0.6, -0.743, -0.803, 0.449, -0.681, -0.464, -0.029, 0.553 };
+ double X[] = { -0.851, 0.481, 0.155 };
+ int incX = -1;
+ double x_expected[] = { 0.394864, -0.768342, 0.31774 };
+ cblas_dtbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtbmv(case 924)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.188, 0.6, -0.743, -0.803, 0.449, -0.681, -0.464, -0.029, 0.553 };
+ double X[] = { -0.851, 0.481, 0.155 };
+ int incX = -1;
+ double x_expected[] = { -0.851, 0.098901, 0.4436 };
+ cblas_dtbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtbmv(case 925)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.824f, -0.45f, -0.987f, 0.758f, 0.42f, -0.357f, 0.147f, -0.191f, 0.88f, 0.63f, 0.155f, -0.573f, 0.224f, 0.146f, 0.501f, -0.889f, 0.456f, 0.796f };
+ float X[] = { -0.46f, 0.069f, 0.308f, -0.003f, -0.236f, 0.605f };
+ int incX = -1;
+ float x_expected[] = { -0.113114f, -0.051704f, -0.403567f, -0.288349f, -0.223936f, 0.841145f };
+ cblas_ctbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbmv(case 926) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbmv(case 926) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.824f, -0.45f, -0.987f, 0.758f, 0.42f, -0.357f, 0.147f, -0.191f, 0.88f, 0.63f, 0.155f, -0.573f, 0.224f, 0.146f, 0.501f, -0.889f, 0.456f, 0.796f };
+ float X[] = { -0.46f, 0.069f, 0.308f, -0.003f, -0.236f, 0.605f };
+ int incX = -1;
+ float x_expected[] = { -0.46f, 0.069f, -0.14027f, -0.23208f, -0.537722f, 0.841425f };
+ cblas_ctbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbmv(case 927) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbmv(case 927) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.824f, -0.45f, -0.987f, 0.758f, 0.42f, -0.357f, 0.147f, -0.191f, 0.88f, 0.63f, 0.155f, -0.573f, 0.224f, 0.146f, 0.501f, -0.889f, 0.456f, 0.796f };
+ float X[] = { -0.46f, 0.069f, 0.308f, -0.003f, -0.236f, 0.605f };
+ int incX = -1;
+ float x_expected[] = { -0.099689f, 0.487805f, 0.353793f, 0.325411f, -0.225658f, -0.776023f };
+ cblas_ctbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbmv(case 928) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbmv(case 928) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.824f, -0.45f, -0.987f, 0.758f, 0.42f, -0.357f, 0.147f, -0.191f, 0.88f, 0.63f, 0.155f, -0.573f, 0.224f, 0.146f, 0.501f, -0.889f, 0.456f, 0.796f };
+ float X[] = { -0.46f, 0.069f, 0.308f, -0.003f, -0.236f, 0.605f };
+ int incX = -1;
+ float x_expected[] = { -0.39057f, 0.113296f, 0.388863f, 0.131011f, -0.236f, 0.605f };
+ cblas_ctbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbmv(case 929) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbmv(case 929) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.824f, -0.45f, -0.987f, 0.758f, 0.42f, -0.357f, 0.147f, -0.191f, 0.88f, 0.63f, 0.155f, -0.573f, 0.224f, 0.146f, 0.501f, -0.889f, 0.456f, 0.796f };
+ float X[] = { -0.46f, 0.069f, 0.308f, -0.003f, -0.236f, 0.605f };
+ int incX = -1;
+ float x_expected[] = { -0.169119f, 0.443509f, 0.159816f, 0.139696f, -0.180955f, -0.835292f };
+ cblas_ctbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbmv(case 930) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbmv(case 930) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.824f, -0.45f, -0.987f, 0.758f, 0.42f, -0.357f, 0.147f, -0.191f, 0.88f, 0.63f, 0.155f, -0.573f, 0.224f, 0.146f, 0.501f, -0.889f, 0.456f, 0.796f };
+ float X[] = { -0.46f, 0.069f, 0.308f, -0.003f, -0.236f, 0.605f };
+ int incX = -1;
+ float x_expected[] = { -0.46f, 0.069f, 0.194886f, -0.054704f, -0.191297f, 0.545731f };
+ cblas_ctbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbmv(case 931) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbmv(case 931) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.824f, -0.45f, -0.987f, 0.758f, 0.42f, -0.357f, 0.147f, -0.191f, 0.88f, 0.63f, 0.155f, -0.573f, 0.224f, 0.146f, 0.501f, -0.889f, 0.456f, 0.796f };
+ float X[] = { -0.46f, 0.069f, 0.308f, -0.003f, -0.236f, 0.605f };
+ int incX = -1;
+ float x_expected[] = { 0.159816f, 0.139696f, -0.180955f, -0.835292f, 0.077786f, 0.60472f };
+ cblas_ctbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbmv(case 932) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbmv(case 932) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.824f, -0.45f, -0.987f, 0.758f, 0.42f, -0.357f, 0.147f, -0.191f, 0.88f, 0.63f, 0.155f, -0.573f, 0.224f, 0.146f, 0.501f, -0.889f, 0.456f, 0.796f };
+ float X[] = { -0.46f, 0.069f, 0.308f, -0.003f, -0.236f, 0.605f };
+ int incX = -1;
+ float x_expected[] = { -0.18707f, 0.2604f, 0.082342f, -0.779023f, -0.236f, 0.605f };
+ cblas_ctbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbmv(case 933) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbmv(case 933) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { -0.814f, 0.043f, -0.755f, -0.094f, 0.876f, 0.257f, 0.406f, 0.491f, -0.27f, -0.787f, 0.545f, 0.732f, -0.512f, -0.085f, 0.234f, 0.001f, -0.225f, -0.002f };
+ float X[] = { 0.411f, -0.308f, -0.912f, 0.811f, -0.894f, -0.116f };
+ int incX = -1;
+ float x_expected[] = { 0.647885f, 0.621535f, -0.104407f, 0.05309f, 0.732704f, 0.055982f };
+ cblas_ctbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbmv(case 934) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbmv(case 934) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { -0.814f, 0.043f, -0.755f, -0.094f, 0.876f, 0.257f, 0.406f, 0.491f, -0.27f, -0.787f, 0.545f, 0.732f, -0.512f, -0.085f, 0.234f, 0.001f, -0.225f, -0.002f };
+ float X[] = { 0.411f, -0.308f, -0.912f, 0.811f, -0.894f, -0.116f };
+ int incX = -1;
+ float x_expected[] = { 1.2955f, 0.190774f, -0.247934f, 0.982616f, -0.894f, -0.116f };
+ cblas_ctbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbmv(case 935) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbmv(case 935) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { -0.814f, 0.043f, -0.755f, -0.094f, 0.876f, 0.257f, 0.406f, 0.491f, -0.27f, -0.787f, 0.545f, 0.732f, -0.512f, -0.085f, 0.234f, 0.001f, -0.225f, -0.002f };
+ float X[] = { 0.411f, -0.308f, -0.912f, 0.811f, -0.894f, -0.116f };
+ int incX = -1;
+ float x_expected[] = { 0.096482f, -0.071661f, 0.647885f, 0.621535f, -0.104407f, 0.05309f };
+ cblas_ctbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbmv(case 936) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbmv(case 936) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { -0.814f, 0.043f, -0.755f, -0.094f, 0.876f, 0.257f, 0.406f, 0.491f, -0.27f, -0.787f, 0.545f, 0.732f, -0.512f, -0.085f, 0.234f, 0.001f, -0.225f, -0.002f };
+ float X[] = { 0.411f, -0.308f, -0.912f, 0.811f, -0.894f, -0.116f };
+ int incX = -1;
+ float x_expected[] = { 0.411f, -0.308f, -1.14861f, 0.933761f, -1.66247f, -0.234526f };
+ cblas_ctbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbmv(case 937) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbmv(case 937) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { -0.814f, 0.043f, -0.755f, -0.094f, 0.876f, 0.257f, 0.406f, 0.491f, -0.27f, -0.787f, 0.545f, 0.732f, -0.512f, -0.085f, 0.234f, 0.001f, -0.225f, -0.002f };
+ float X[] = { 0.411f, -0.308f, -0.912f, 0.811f, -0.894f, -0.116f };
+ int incX = -1;
+ float x_expected[] = { 0.632361f, -0.409373f, 0.578489f, 0.012724f, 0.664066f, 0.171616f };
+ cblas_ctbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbmv(case 938) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbmv(case 938) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { -0.814f, 0.043f, -0.755f, -0.094f, 0.876f, 0.257f, 0.406f, 0.491f, -0.27f, -0.787f, 0.545f, 0.732f, -0.512f, -0.085f, 0.234f, 0.001f, -0.225f, -0.002f };
+ float X[] = { 0.411f, -0.308f, -0.912f, 0.811f, -0.894f, -0.116f };
+ int incX = -1;
+ float x_expected[] = { 0.946879f, -0.645712f, -1.21801f, 0.32495f, -0.894f, -0.116f };
+ cblas_ctbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbmv(case 939) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbmv(case 939) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { -0.814f, 0.043f, -0.755f, -0.094f, 0.876f, 0.257f, 0.406f, 0.491f, -0.27f, -0.787f, 0.545f, 0.732f, -0.512f, -0.085f, 0.234f, 0.001f, -0.225f, -0.002f };
+ float X[] = { 0.411f, -0.308f, -0.912f, 0.811f, -0.894f, -0.116f };
+ int incX = -1;
+ float x_expected[] = { -0.236612f, 0.122761f, -1.12184f, -0.358823f, 1.4975f, -0.470595f };
+ cblas_ctbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbmv(case 940) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbmv(case 940) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { -0.814f, 0.043f, -0.755f, -0.094f, 0.876f, 0.257f, 0.406f, 0.491f, -0.27f, -0.787f, 0.545f, 0.732f, -0.512f, -0.085f, 0.234f, 0.001f, -0.225f, -0.002f };
+ float X[] = { 0.411f, -0.308f, -0.912f, 0.811f, -0.894f, -0.116f };
+ int incX = -1;
+ float x_expected[] = { 0.411f, -0.308f, -1.26537f, 0.570703f, -0.129206f, -0.642577f };
+ cblas_ctbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbmv(case 941) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbmv(case 941) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { -0.675f, 0.047f, 0.695f, 0.724f, -0.438f, 0.991f, -0.188f, -0.06f, -0.093f, 0.302f, 0.842f, -0.753f, 0.465f, -0.972f, -0.058f, 0.988f, 0.093f, 0.164f };
+ float X[] = { 0.065f, -0.082f, -0.746f, 0.775f, 0.694f, -0.954f };
+ int incX = -1;
+ float x_expected[] = { 0.413357f, 0.178267f, -0.114618f, -1.35595f, -0.513288f, 0.611332f };
+ cblas_ctbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbmv(case 942) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbmv(case 942) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { -0.675f, 0.047f, 0.695f, 0.724f, -0.438f, 0.991f, -0.188f, -0.06f, -0.093f, 0.302f, 0.842f, -0.753f, 0.465f, -0.972f, -0.058f, 0.988f, 0.093f, 0.164f };
+ float X[] = { 0.065f, -0.082f, -0.746f, 0.775f, 0.694f, -0.954f };
+ int incX = -1;
+ float x_expected[] = { 0.368428f, 0.071217f, -0.954366f, -0.390486f, 0.694f, -0.954f };
+ cblas_ctbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbmv(case 943) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbmv(case 943) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { -0.675f, 0.047f, 0.695f, 0.724f, -0.438f, 0.991f, -0.188f, -0.06f, -0.093f, 0.302f, 0.842f, -0.753f, 0.465f, -0.972f, -0.058f, 0.988f, 0.093f, 0.164f };
+ float X[] = { 0.065f, -0.082f, -0.746f, 0.775f, 0.694f, -0.954f };
+ int incX = -1;
+ float x_expected[] = { -0.084786f, -0.059464f, 0.413357f, 0.178267f, -0.114618f, -1.35595f };
+ cblas_ctbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbmv(case 944) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbmv(case 944) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { -0.675f, 0.047f, 0.695f, 0.724f, -0.438f, 0.991f, -0.188f, -0.06f, -0.093f, 0.302f, 0.842f, -0.753f, 0.465f, -0.972f, -0.058f, 0.988f, 0.093f, 0.164f };
+ float X[] = { 0.065f, -0.082f, -0.746f, 0.775f, 0.694f, -0.954f };
+ int incX = -1;
+ float x_expected[] = { 0.065f, -0.082f, -0.636071f, 0.80005f, 0.787748f, -1.14446f };
+ cblas_ctbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbmv(case 945) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbmv(case 945) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { -0.675f, 0.047f, 0.695f, 0.724f, -0.438f, 0.991f, -0.188f, -0.06f, -0.093f, 0.302f, 0.842f, -0.753f, 0.465f, -0.972f, -0.058f, 0.988f, 0.093f, 0.164f };
+ float X[] = { 0.065f, -0.082f, -0.746f, 0.775f, 0.694f, -0.954f };
+ int incX = -1;
+ float x_expected[] = { -1.18498f, -0.424201f, 0.230196f, 0.374209f, -0.208366f, -1.16549f };
+ cblas_ctbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbmv(case 946) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbmv(case 946) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { -0.675f, 0.047f, 0.695f, 0.724f, -0.438f, 0.991f, -0.188f, -0.06f, -0.093f, 0.302f, 0.842f, -0.753f, 0.465f, -0.972f, -0.058f, 0.988f, 0.093f, 0.164f };
+ float X[] = { 0.065f, -0.082f, -0.746f, 0.775f, 0.694f, -0.954f };
+ int incX = -1;
+ float x_expected[] = { -1.03519f, -0.446737f, -0.819232f, 0.995992f, 0.694f, -0.954f };
+ cblas_ctbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbmv(case 947) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbmv(case 947) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { -0.675f, 0.047f, 0.695f, 0.724f, -0.438f, 0.991f, -0.188f, -0.06f, -0.093f, 0.302f, 0.842f, -0.753f, 0.465f, -0.972f, -0.058f, 0.988f, 0.093f, 0.164f };
+ float X[] = { 0.065f, -0.082f, -0.746f, 0.775f, 0.694f, -0.954f };
+ int incX = -1;
+ float x_expected[] = { 0.109929f, 0.02505f, 0.062939f, -0.202464f, -0.470658f, 1.69006f };
+ cblas_ctbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbmv(case 948) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbmv(case 948) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { -0.675f, 0.047f, 0.695f, 0.724f, -0.438f, 0.991f, -0.188f, -0.06f, -0.093f, 0.302f, 0.842f, -0.753f, 0.465f, -0.972f, -0.058f, 0.988f, 0.093f, 0.164f };
+ float X[] = { 0.065f, -0.082f, -0.746f, 0.775f, 0.694f, -0.954f };
+ int incX = -1;
+ float x_expected[] = { 0.065f, -0.082f, -0.776809f, 0.762996f, 0.73663f, 0.124729f };
+ cblas_ctbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbmv(case 949) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbmv(case 949) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { -0.212, 0.612, 0.189, -0.046, -0.124, 0.82, 0.753, 0.727, 0.331, 0.116, 0.504, -0.673, -0.888, -0.277, -0.361, -0.909, 0.982, -0.124 };
+ double X[] = { 0.064, 0.169, -0.81, -0.779, -0.641, -0.103 };
+ int incX = -1;
+ double x_expected[] = { -0.010019, -0.1678, -0.042017, -1.112094, 0.010004, -0.480427 };
+ cblas_ztbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbmv(case 950) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbmv(case 950) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { -0.212, 0.612, 0.189, -0.046, -0.124, 0.82, 0.753, 0.727, 0.331, 0.116, 0.504, -0.673, -0.888, -0.277, -0.361, -0.909, 0.982, -0.124 };
+ double X[] = { 0.064, 0.169, -0.81, -0.779, -0.641, -0.103 };
+ int incX = -1;
+ double x_expected[] = { 0.064, 0.169, -0.80842, -0.715637, -0.829924, -0.212971 };
+ cblas_ztbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbmv(case 951) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbmv(case 951) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { -0.212, 0.612, 0.189, -0.046, -0.124, 0.82, 0.753, 0.727, 0.331, 0.116, 0.504, -0.673, -0.888, -0.277, -0.361, -0.909, 0.982, -0.124 };
+ double X[] = { 0.064, 0.169, -0.81, -0.779, -0.641, -0.103 };
+ int incX = -1;
+ double x_expected[] = { 0.634014, 0.796937, -0.585538, -0.895375, -0.125887, 0.010019 };
+ cblas_ztbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbmv(case 952) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbmv(case 952) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { -0.212, 0.612, 0.189, -0.046, -0.124, 0.82, 0.753, 0.727, 0.331, 0.116, 0.504, -0.673, -0.888, -0.277, -0.361, -0.909, 0.982, -0.124 };
+ double X[] = { 0.064, 0.169, -0.81, -0.779, -0.641, -0.103 };
+ int incX = -1;
+ double x_expected[] = { 0.567497, 1.085122, -1.217792, -1.322566, -0.641, -0.103 };
+ cblas_ztbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbmv(case 953) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbmv(case 953) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { -0.212, 0.612, 0.189, -0.046, -0.124, 0.82, 0.753, 0.727, 0.331, 0.116, 0.504, -0.673, -0.888, -0.277, -0.361, -0.909, 0.982, -0.124 };
+ double X[] = { 0.064, 0.169, -0.81, -0.779, -0.641, -0.103 };
+ int incX = -1;
+ double x_expected[] = { 0.130517, -0.119185, -0.187765, -0.519609, -0.169484, -1.165438 };
+ cblas_ztbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbmv(case 954) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbmv(case 954) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { -0.212, 0.612, 0.189, -0.046, -0.124, 0.82, 0.753, 0.727, 0.331, 0.116, 0.504, -0.673, -0.888, -0.277, -0.361, -0.909, 0.982, -0.124 };
+ double X[] = { 0.064, 0.169, -0.81, -0.779, -0.641, -0.103 };
+ int incX = -1;
+ double x_expected[] = { 0.064, 0.169, -0.820019, -0.9468, -0.684597, -1.278457 };
+ cblas_ztbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbmv(case 955) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbmv(case 955) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { -0.212, 0.612, 0.189, -0.046, -0.124, 0.82, 0.753, 0.727, 0.331, 0.116, 0.504, -0.673, -0.888, -0.277, -0.361, -0.909, 0.982, -0.124 };
+ double X[] = { 0.064, 0.169, -0.81, -0.779, -0.641, -0.103 };
+ int incX = -1;
+ double x_expected[] = { -0.187765, -0.519609, -0.169484, -1.165438, 0.198928, -0.370456 };
+ cblas_ztbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbmv(case 956) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbmv(case 956) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { -0.212, 0.612, 0.189, -0.046, -0.124, 0.82, 0.753, 0.727, 0.331, 0.116, 0.504, -0.673, -0.888, -0.277, -0.361, -0.909, 0.982, -0.124 };
+ double X[] = { 0.064, 0.169, -0.81, -0.779, -0.641, -0.103 };
+ int incX = -1;
+ double x_expected[] = { -0.113746, -0.182809, -0.935887, -0.768981, -0.641, -0.103 };
+ cblas_ztbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbmv(case 957) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbmv(case 957) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { -0.374, -0.308, 0.792, 0.884, -0.794, -0.055, -0.281, 0.527, 0.246, 0.762, 0.853, 0.891, -0.231, 0.384, 0.373, -0.717, -0.957, -0.338 };
+ double X[] = { 0.884, 0.636, 0.921, 0.282, -0.649, 0.188 };
+ int incX = -1;
+ double x_expected[] = { -0.436746, 0.963714, -1.087615, -0.018695, 0.30063, 0.12958 };
+ cblas_ztbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbmv(case 958) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbmv(case 958) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { -0.374, -0.308, 0.792, 0.884, -0.794, -0.055, -0.281, 0.527, 0.246, 0.762, 0.853, 0.891, -0.231, 0.384, 0.373, -0.717, -0.957, -0.338 };
+ double X[] = { 0.884, 0.636, 0.921, 0.282, -0.649, 0.188 };
+ int incX = -1;
+ double x_expected[] = { 0.895682, 1.407174, 0.2408, -0.14282, -0.649, 0.188 };
+ cblas_ztbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbmv(case 959) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbmv(case 959) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { -0.374, -0.308, 0.792, 0.884, -0.794, -0.055, -0.281, 0.527, 0.246, 0.762, 0.853, 0.891, -0.231, 0.384, 0.373, -0.717, -0.957, -0.338 };
+ double X[] = { 0.884, 0.636, 0.921, 0.282, -0.649, 0.188 };
+ int incX = -1;
+ double x_expected[] = { 0.785744, -0.3966, -0.436746, 0.963714, -1.087615, -0.018695 };
+ cblas_ztbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbmv(case 960) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbmv(case 960) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { -0.374, -0.308, 0.792, 0.884, -0.794, -0.055, -0.281, 0.527, 0.246, 0.762, 0.853, 0.891, -0.231, 0.384, 0.373, -0.717, -0.957, -0.338 };
+ double X[] = { 0.884, 0.636, 0.921, 0.282, -0.649, 0.188 };
+ int incX = -1;
+ double x_expected[] = { 0.884, 0.636, 0.472572, 0.47454, -1.056415, 0.594125 };
+ cblas_ztbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbmv(case 961) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbmv(case 961) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { -0.374, -0.308, 0.792, 0.884, -0.794, -0.055, -0.281, 0.527, 0.246, 0.762, 0.853, 0.891, -0.231, 0.384, 0.373, -0.717, -0.957, -0.338 };
+ double X[] = { 0.884, 0.636, 0.921, 0.282, -0.649, 0.188 };
+ int incX = -1;
+ double x_expected[] = { 0.464705, -0.108078, 0.094975, 0.376323, -0.6802, -0.42482 };
+ cblas_ztbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbmv(case 962) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbmv(case 962) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { -0.374, -0.308, 0.792, 0.884, -0.794, -0.055, -0.281, 0.527, 0.246, 0.762, 0.853, 0.891, -0.231, 0.384, 0.373, -0.717, -0.957, -0.338 };
+ double X[] = { 0.884, 0.636, 0.921, 0.282, -0.649, 0.188 };
+ int incX = -1;
+ double x_expected[] = { 0.562961, 0.924522, 1.004293, -0.112851, -0.649, 0.188 };
+ cblas_ztbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbmv(case 963) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbmv(case 963) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { -0.374, -0.308, 0.792, 0.884, -0.794, -0.055, -0.281, 0.527, 0.246, 0.762, 0.853, 0.891, -0.231, 0.384, 0.373, -0.717, -0.957, -0.338 };
+ double X[] = { 0.884, 0.636, 0.921, 0.282, -0.649, 0.188 };
+ int incX = -1;
+ double x_expected[] = { -0.448428, 0.19254, -0.674583, 1.236189, 0.780774, 1.167088 };
+ cblas_ztbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbmv(case 964) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbmv(case 964) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { -0.374, -0.308, 0.792, 0.884, -0.794, -0.055, -0.281, 0.527, 0.246, 0.762, 0.853, 0.891, -0.231, 0.384, 0.373, -0.717, -0.957, -0.338 };
+ double X[] = { 0.884, 0.636, 0.921, 0.282, -0.649, 0.188 };
+ int incX = -1;
+ double x_expected[] = { 0.884, 0.636, 0.653832, 1.112064, -0.168856, 1.225508 };
+ cblas_ztbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbmv(case 965) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbmv(case 965) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.002, 0.95, -0.363, 0.084, -0.646, 0.816, -0.407, 0.099, -0.02, -0.906, -0.874, 0.191, -0.328, -0.968, 0.79, 0.826, -0.795, 0.277 };
+ double X[] = { -0.591, -0.084, 0.707, 0.945, 0.326, 0.428 };
+ int incX = -1;
+ double x_expected[] = { -0.59515, 0.077106, -0.27658, -0.637356, 0.407252, -0.308844 };
+ cblas_ztbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbmv(case 966) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbmv(case 966) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.002, 0.95, -0.363, 0.084, -0.646, 0.816, -0.407, 0.099, -0.02, -0.906, -0.874, 0.191, -0.328, -0.968, 0.79, 0.826, -0.795, 0.277 };
+ double X[] = { -0.591, -0.084, 0.707, 0.945, 0.326, 0.428 };
+ int incX = -1;
+ double x_expected[] = { -1.46131, 0.537642, 0.624614, 0.762252, 0.326, 0.428 };
+ cblas_ztbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbmv(case 967) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbmv(case 967) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.002, 0.95, -0.363, 0.084, -0.646, 0.816, -0.407, 0.099, -0.02, -0.906, -0.874, 0.191, -0.328, -0.968, 0.79, 0.826, -0.795, 0.277 };
+ double X[] = { -0.591, -0.084, 0.707, 0.945, 0.326, 0.428 };
+ int incX = -1;
+ double x_expected[] = { -0.536274, 0.421806, -0.59515, 0.077106, -0.27658, -0.637356 };
+ cblas_ztbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbmv(case 968) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbmv(case 968) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.002, 0.95, -0.363, 0.084, -0.646, 0.816, -0.407, 0.099, -0.02, -0.906, -0.874, 0.191, -0.328, -0.968, 0.79, 0.826, -0.795, 0.277 };
+ double X[] = { -0.591, -0.084, 0.707, 0.945, 0.326, 0.428 };
+ int incX = -1;
+ double x_expected[] = { -0.591, -0.084, 0.98216, 0.400464, 0.131806, -0.026608 };
+ cblas_ztbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbmv(case 969) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbmv(case 969) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.002, 0.95, -0.363, 0.084, -0.646, 0.816, -0.407, 0.099, -0.02, -0.906, -0.874, 0.191, -0.328, -0.968, 0.79, 0.826, -0.795, 0.277 };
+ double X[] = { -0.591, -0.084, 0.707, 0.945, 0.326, 0.428 };
+ int incX = -1;
+ double x_expected[] = { -1.68293, 0.796222, -0.96062, 0.415172, -0.082386, -0.182748 };
+ cblas_ztbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbmv(case 970) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbmv(case 970) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.002, 0.95, -0.363, 0.084, -0.646, 0.816, -0.407, 0.099, -0.02, -0.906, -0.874, 0.191, -0.328, -0.968, 0.79, 0.826, -0.795, 0.277 };
+ double X[] = { -0.591, -0.084, 0.707, 0.945, 0.326, 0.428 };
+ int incX = -1;
+ double x_expected[] = { -1.737656, 0.290416, 0.61669, 0.73853, 0.326, 0.428 };
+ cblas_ztbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbmv(case 971) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbmv(case 971) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.002, 0.95, -0.363, 0.084, -0.646, 0.816, -0.407, 0.099, -0.02, -0.906, -0.874, 0.191, -0.328, -0.968, 0.79, 0.826, -0.795, 0.277 };
+ double X[] = { -0.591, -0.084, 0.707, 0.945, 0.326, 0.428 };
+ int incX = -1;
+ double x_expected[] = { 0.27516, -0.544536, -0.10627, -0.988374, 0.229991, -0.711267 };
+ cblas_ztbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbmv(case 972) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbmv(case 972) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.002, 0.95, -0.363, 0.084, -0.646, 0.816, -0.407, 0.099, -0.02, -0.906, -0.874, 0.191, -0.328, -0.968, 0.79, 0.826, -0.795, 0.277 };
+ double X[] = { -0.591, -0.084, 0.707, 0.945, 0.326, 0.428 };
+ int incX = -1;
+ double x_expected[] = { -0.591, -0.084, 0.794924, 0.411234, 0.148739, 0.025577 };
+ cblas_ztbmv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbmv(case 973) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbmv(case 973) imag");
+ };
+ };
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_tbsv.c b/gsl-1.9/cblas/test_tbsv.c
new file mode 100644
index 0000000..2d9d290
--- /dev/null
+++ b/gsl-1.9/cblas/test_tbsv.c
@@ -0,0 +1,1819 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_tbsv (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { -0.681f, 0.209f, 0.436f, -0.369f, 0.786f, -0.84f, 0.86f, -0.233f, 0.734f };
+ float X[] = { -0.305f, 0.61f, -0.831f };
+ int incX = -1;
+ float x_expected[] = { -0.354651f, -2.40855f, 0.481076f };
+ cblas_stbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stbsv(case 1230)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { -0.681f, 0.209f, 0.436f, -0.369f, 0.786f, -0.84f, 0.86f, -0.233f, 0.734f };
+ float X[] = { -0.305f, 0.61f, -0.831f };
+ int incX = -1;
+ float x_expected[] = { -0.305f, 0.84973f, -1.00859f };
+ cblas_stbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stbsv(case 1231)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { -0.681f, 0.209f, 0.436f, -0.369f, 0.786f, -0.84f, 0.86f, -0.233f, 0.734f };
+ float X[] = { -0.305f, 0.61f, -0.831f };
+ int incX = -1;
+ float x_expected[] = { -2.71619f, -1.09055f, -3.97608f };
+ cblas_stbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stbsv(case 1232)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { -0.681f, 0.209f, 0.436f, -0.369f, 0.786f, -0.84f, 0.86f, -0.233f, 0.734f };
+ float X[] = { -0.305f, 0.61f, -0.831f };
+ int incX = -1;
+ float x_expected[] = { -0.56589f, 0.303361f, -0.831f };
+ cblas_stbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stbsv(case 1233)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { -0.681f, 0.209f, 0.436f, -0.369f, 0.786f, -0.84f, 0.86f, -0.233f, 0.734f };
+ float X[] = { -0.305f, 0.61f, -0.831f };
+ int incX = -1;
+ float x_expected[] = { 1.30901f, -0.656172f, -5.13458f };
+ cblas_stbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stbsv(case 1234)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { -0.681f, 0.209f, 0.436f, -0.369f, 0.786f, -0.84f, 0.86f, -0.233f, 0.734f };
+ float X[] = { -0.305f, 0.61f, -0.831f };
+ int incX = -1;
+ float x_expected[] = { -0.305f, 0.8723f, -0.509121f };
+ cblas_stbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stbsv(case 1235)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { -0.681f, 0.209f, 0.436f, -0.369f, 0.786f, -0.84f, 0.86f, -0.233f, 0.734f };
+ float X[] = { -0.305f, 0.61f, -0.831f };
+ int incX = -1;
+ float x_expected[] = { 0.524539f, -0.961964f, 1.22026f };
+ cblas_stbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stbsv(case 1236)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { -0.681f, 0.209f, 0.436f, -0.369f, 0.786f, -0.84f, 0.86f, -0.233f, 0.734f };
+ float X[] = { -0.305f, 0.61f, -0.831f };
+ int incX = -1;
+ float x_expected[] = { -0.920972f, 0.783679f, -0.831f };
+ cblas_stbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stbsv(case 1237)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.022f, 0.795f, -0.389f, -0.205f, -0.121f, 0.323f, 0.133f, 0.679f, 0.742f };
+ float X[] = { 0.144f, 0.635f, 0.116f };
+ int incX = -1;
+ float x_expected[] = { 16.8676f, 17.3503f, 5.27273f };
+ cblas_stbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stbsv(case 1238)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.022f, 0.795f, -0.389f, -0.205f, -0.121f, 0.323f, 0.133f, 0.679f, 0.742f };
+ float X[] = { 0.144f, 0.635f, 0.116f };
+ int incX = -1;
+ float x_expected[] = { 0.209676f, 0.54278f, 0.116f };
+ cblas_stbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stbsv(case 1239)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.022f, 0.795f, -0.389f, -0.205f, -0.121f, 0.323f, 0.133f, 0.679f, 0.742f };
+ float X[] = { 0.144f, 0.635f, 0.116f };
+ int incX = -1;
+ float x_expected[] = { 0.212077f, -5.01482f, -1.14722f };
+ cblas_stbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stbsv(case 1240)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.022f, 0.795f, -0.389f, -0.205f, -0.121f, 0.323f, 0.133f, 0.679f, 0.742f };
+ float X[] = { 0.144f, 0.635f, 0.116f };
+ int incX = -1;
+ float x_expected[] = { 0.144f, 0.615848f, 0.242249f };
+ cblas_stbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stbsv(case 1241)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.022f, 0.795f, -0.389f, -0.205f, -0.121f, 0.323f, 0.133f, 0.679f, 0.742f };
+ float X[] = { 0.144f, 0.635f, 0.116f };
+ int incX = -1;
+ float x_expected[] = { 1.28844f, -5.49514f, 0.145912f };
+ cblas_stbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stbsv(case 1242)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.022f, 0.795f, -0.389f, -0.205f, -0.121f, 0.323f, 0.133f, 0.679f, 0.742f };
+ float X[] = { 0.144f, 0.635f, 0.116f };
+ int incX = -1;
+ float x_expected[] = { 0.0563823f, 0.65878f, 0.116f };
+ cblas_stbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stbsv(case 1243)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.022f, 0.795f, -0.389f, -0.205f, -0.121f, 0.323f, 0.133f, 0.679f, 0.742f };
+ float X[] = { 0.144f, 0.635f, 0.116f };
+ int incX = -1;
+ float x_expected[] = { 1.08271f, -3.73662f, 140.301f };
+ cblas_stbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stbsv(case 1244)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.022f, 0.795f, -0.389f, -0.205f, -0.121f, 0.323f, 0.133f, 0.679f, 0.742f };
+ float X[] = { 0.144f, 0.635f, 0.116f };
+ int incX = -1;
+ float x_expected[] = { 0.144f, 0.652424f, -0.402677f };
+ cblas_stbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stbsv(case 1245)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.619, -0.443, 0.957, -0.633, -0.698, 0.783, -0.343, -0.603, 0.735 };
+ double X[] = { 0.332, 0.588, 0.252 };
+ int incX = -1;
+ double x_expected[] = { -0.967930029155, 0.138412575592, 0.506166027443 };
+ cblas_dtbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtbsv(case 1246)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.619, -0.443, 0.957, -0.633, -0.698, 0.783, -0.343, -0.603, 0.735 };
+ double X[] = { 0.332, 0.588, 0.252 };
+ int incX = -1;
+ double x_expected[] = { 0.332, 0.819736, 0.615143048 };
+ cblas_dtbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtbsv(case 1247)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.619, -0.443, 0.957, -0.633, -0.698, 0.783, -0.343, -0.603, 0.735 };
+ double X[] = { 0.332, 0.588, 0.252 };
+ int incX = -1;
+ double x_expected[] = { -0.364842154056, -0.326531140246, -0.568848758465 };
+ cblas_dtbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtbsv(case 1248)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.619, -0.443, 0.957, -0.633, -0.698, 0.783, -0.343, -0.603, 0.735 };
+ double X[] = { 0.332, 0.588, 0.252 };
+ int incX = -1;
+ double x_expected[] = { 0.588397988, 0.747516, 0.252 };
+ cblas_dtbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtbsv(case 1249)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.619, -0.443, 0.957, -0.633, -0.698, 0.783, -0.343, -0.603, 0.735 };
+ double X[] = { 0.332, 0.588, 0.252 };
+ int incX = -1;
+ double x_expected[] = { -0.550580431177, -0.571849444278, 0.248263427151 };
+ cblas_dtbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtbsv(case 1250)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.619, -0.443, 0.957, -0.633, -0.698, 0.783, -0.343, -0.603, 0.735 };
+ double X[] = { 0.332, 0.588, 0.252 };
+ int incX = -1;
+ double x_expected[] = { 0.332, 0.701876, 0.696287508 };
+ cblas_dtbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtbsv(case 1251)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.619, -0.443, 0.957, -0.633, -0.698, 0.783, -0.343, -0.603, 0.735 };
+ double X[] = { 0.332, 0.588, 0.252 };
+ int incX = -1;
+ double x_expected[] = { 1.50217883761, -1.21382140588, 0.407108239095 };
+ cblas_dtbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtbsv(case 1252)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.619, -0.443, 0.957, -0.633, -0.698, 0.783, -0.343, -0.603, 0.735 };
+ double X[] = { 0.332, 0.588, 0.252 };
+ int incX = -1;
+ double x_expected[] = { 0.820345928, 0.699636, 0.252 };
+ cblas_dtbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtbsv(case 1253)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { -0.199, 0.303, -0.705, -0.013, -0.678, 0.547, 0.756, -0.177, -0.079 };
+ double X[] = { 0.58, 0.558, -0.54 };
+ int incX = -1;
+ double x_expected[] = { 18.994209959, 20.323927329, 2.7135678392 };
+ cblas_dtbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtbsv(case 1254)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { -0.199, 0.303, -0.705, -0.013, -0.678, 0.547, 0.756, -0.177, -0.079 };
+ double X[] = { 0.58, 0.558, -0.54 };
+ int incX = -1;
+ double x_expected[] = { 1.06925836, 0.72162, -0.54 };
+ cblas_dtbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtbsv(case 1255)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { -0.199, 0.303, -0.705, -0.013, -0.678, 0.547, 0.756, -0.177, -0.079 };
+ double X[] = { 0.58, 0.558, -0.54 };
+ int incX = -1;
+ double x_expected[] = { -3.27683615819, -4.47682615869, -1.97425326753 };
+ cblas_dtbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtbsv(case 1256)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { -0.199, 0.303, -0.705, -0.013, -0.678, 0.547, 0.756, -0.177, -0.079 };
+ double X[] = { 0.58, 0.558, -0.54 };
+ int incX = -1;
+ double x_expected[] = { 0.58, 0.11952, -0.53844624 };
+ cblas_dtbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtbsv(case 1257)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { -0.199, 0.303, -0.705, -0.013, -0.678, 0.547, 0.756, -0.177, -0.079 };
+ double X[] = { 0.58, 0.558, -0.54 };
+ int incX = -1;
+ double x_expected[] = { -6.6461072986, -0.788837290809, -1.78217821782 };
+ cblas_dtbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtbsv(case 1258)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { -0.199, 0.303, -0.705, -0.013, -0.678, 0.547, 0.756, -0.177, -0.079 };
+ double X[] = { 0.58, 0.558, -0.54 };
+ int incX = -1;
+ double x_expected[] = { 0.16345912, 0.55098, -0.54 };
+ cblas_dtbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtbsv(case 1259)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { -0.199, 0.303, -0.705, -0.013, -0.678, 0.547, 0.756, -0.177, -0.079 };
+ double X[] = { 0.58, 0.558, -0.54 };
+ int incX = -1;
+ double x_expected[] = { 0.767195767196, -82.9352869353, -123.564783625 };
+ cblas_dtbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtbsv(case 1260)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { -0.199, 0.303, -0.705, -0.013, -0.678, 0.547, 0.756, -0.177, -0.079 };
+ double X[] = { 0.58, 0.558, -0.54 };
+ int incX = -1;
+ double x_expected[] = { 0.58, 0.95124, -0.82822572 };
+ cblas_dtbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtbsv(case 1261)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { -0.975f, -0.667f, 0.813f, -0.962f, -0.961f, 0.226f, -0.503f, 0.809f, 0.81f, -0.162f, -0.027f, -0.044f, 0.212f, 0.563f, 0.446f, -0.392f, 0.798f, -0.07f };
+ float X[] = { 0.11f, 0.787f, -0.826f, 0.809f, -0.437f, 0.592f };
+ int incX = -1;
+ float x_expected[] = { 1.28871f, 0.289887f, 1.76043f, 1.27481f, 1.56506f, -2.35181f };
+ cblas_ctbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbsv(case 1262) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbsv(case 1262) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { -0.975f, -0.667f, 0.813f, -0.962f, -0.961f, 0.226f, -0.503f, 0.809f, 0.81f, -0.162f, -0.027f, -0.044f, 0.212f, 0.563f, 0.446f, -0.392f, 0.798f, -0.07f };
+ float X[] = { 0.11f, 0.787f, -0.826f, 0.809f, -0.437f, 0.592f };
+ int incX = -1;
+ float x_expected[] = { 0.11f, 0.787f, -1.04259f, 0.18935f, 0.228474f, -0.564917f };
+ cblas_ctbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbsv(case 1263) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbsv(case 1263) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { -0.975f, -0.667f, 0.813f, -0.962f, -0.961f, 0.226f, -0.503f, 0.809f, 0.81f, -0.162f, -0.027f, -0.044f, 0.212f, 0.563f, 0.446f, -0.392f, 0.798f, -0.07f };
+ float X[] = { 0.11f, 0.787f, -0.826f, 0.809f, -0.437f, 0.592f };
+ int incX = -1;
+ float x_expected[] = { -0.0906249f, 3.09442f, -1.60036f, 1.28475f, -0.582941f, 0.0383898f };
+ cblas_ctbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbsv(case 1264) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbsv(case 1264) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { -0.975f, -0.667f, 0.813f, -0.962f, -0.961f, 0.226f, -0.503f, 0.809f, 0.81f, -0.162f, -0.027f, -0.044f, 0.212f, 0.563f, 0.446f, -0.392f, 0.798f, -0.07f };
+ float X[] = { 0.11f, 0.787f, -0.826f, 0.809f, -0.437f, 0.592f };
+ int incX = -1;
+ float x_expected[] = { 1.05233f, 0.79657f, -0.566883f, 1.46031f, -0.437f, 0.592f };
+ cblas_ctbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbsv(case 1265) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbsv(case 1265) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { -0.975f, -0.667f, 0.813f, -0.962f, -0.961f, 0.226f, -0.503f, 0.809f, 0.81f, -0.162f, -0.027f, -0.044f, 0.212f, 0.563f, 0.446f, -0.392f, 0.798f, -0.07f };
+ float X[] = { 0.11f, 0.787f, -0.826f, 0.809f, -0.437f, 0.592f };
+ int incX = -1;
+ float x_expected[] = { -0.735844f, 1.11782f, -0.28244f, 1.16117f, -0.66707f, 0.938302f };
+ cblas_ctbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbsv(case 1266) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbsv(case 1266) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { -0.975f, -0.667f, 0.813f, -0.962f, -0.961f, 0.226f, -0.503f, 0.809f, 0.81f, -0.162f, -0.027f, -0.044f, 0.212f, 0.563f, 0.446f, -0.392f, 0.798f, -0.07f };
+ float X[] = { 0.11f, 0.787f, -0.826f, 0.809f, -0.437f, 0.592f };
+ int incX = -1;
+ float x_expected[] = { 0.11f, 0.787f, -0.406239f, 0.580226f, -0.171935f, 1.2125f };
+ cblas_ctbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbsv(case 1267) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbsv(case 1267) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { -0.975f, -0.667f, 0.813f, -0.962f, -0.961f, 0.226f, -0.503f, 0.809f, 0.81f, -0.162f, -0.027f, -0.044f, 0.212f, 0.563f, 0.446f, -0.392f, 0.798f, -0.07f };
+ float X[] = { 0.11f, 0.787f, -0.826f, 0.809f, -0.437f, 0.592f };
+ int incX = -1;
+ float x_expected[] = { 1.70081f, 2.20477f, 1.32753f, -0.522112f, 0.0223652f, -0.62248f };
+ cblas_ctbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbsv(case 1268) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbsv(case 1268) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { -0.975f, -0.667f, 0.813f, -0.962f, -0.961f, 0.226f, -0.503f, 0.809f, 0.81f, -0.162f, -0.027f, -0.044f, 0.212f, 0.563f, 0.446f, -0.392f, 0.798f, -0.07f };
+ float X[] = { 0.11f, 0.787f, -0.826f, 0.809f, -0.437f, 0.592f };
+ int incX = -1;
+ float x_expected[] = { 0.967596f, 0.693563f, -1.04022f, -0.09269f, -0.437f, 0.592f };
+ cblas_ctbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbsv(case 1269) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbsv(case 1269) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.33f, -0.236f, 0.267f, -0.139f, 0.25f, 0.509f, 0.86f, -0.089f, -0.018f, -0.847f, 0.424f, -0.573f, 0.097f, -0.663f, 0.65f, -0.811f, 0.283f, 0.032f };
+ float X[] = { -0.509f, 0.608f, 0.021f, -0.848f, -0.134f, 0.179f };
+ int incX = -1;
+ float x_expected[] = { -1.11985f, 0.801655f, 0.273814f, -1.09438f, -0.52531f, 0.166748f };
+ cblas_ctbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbsv(case 1270) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbsv(case 1270) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.33f, -0.236f, 0.267f, -0.139f, 0.25f, 0.509f, 0.86f, -0.089f, -0.018f, -0.847f, 0.424f, -0.573f, 0.097f, -0.663f, 0.65f, -0.811f, 0.283f, 0.032f };
+ float X[] = { -0.509f, 0.608f, 0.021f, -0.848f, -0.134f, 0.179f };
+ int incX = -1;
+ float x_expected[] = { 0.266087f, 0.618557f, 0.031897f, -0.914419f, -0.134f, 0.179f };
+ cblas_ctbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbsv(case 1271) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbsv(case 1271) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.33f, -0.236f, 0.267f, -0.139f, 0.25f, 0.509f, 0.86f, -0.089f, -0.018f, -0.847f, 0.424f, -0.573f, 0.097f, -0.663f, 0.65f, -0.811f, 0.283f, 0.032f };
+ float X[] = { -0.509f, 0.608f, 0.021f, -0.848f, -0.134f, 0.179f };
+ int incX = -1;
+ float x_expected[] = { -0.762749f, -0.016292f, 1.59299f, 0.158751f, -4.75603f, -1.78591f };
+ cblas_ctbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbsv(case 1272) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbsv(case 1272) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.33f, -0.236f, 0.267f, -0.139f, 0.25f, 0.509f, 0.86f, -0.089f, -0.018f, -0.847f, 0.424f, -0.573f, 0.097f, -0.663f, 0.65f, -0.811f, 0.283f, 0.032f };
+ float X[] = { -0.509f, 0.608f, 0.021f, -0.848f, -0.134f, 0.179f };
+ int incX = -1;
+ float x_expected[] = { -0.509f, 0.608f, -0.332731f, -1.24444f, 0.262904f, 1.21961f };
+ cblas_ctbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbsv(case 1273) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbsv(case 1273) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.33f, -0.236f, 0.267f, -0.139f, 0.25f, 0.509f, 0.86f, -0.089f, -0.018f, -0.847f, 0.424f, -0.573f, 0.097f, -0.663f, 0.65f, -0.811f, 0.283f, 0.032f };
+ float X[] = { -0.509f, 0.608f, 0.021f, -0.848f, -0.134f, 0.179f };
+ int incX = -1;
+ float x_expected[] = { -1.76046f, 0.0455463f, 1.38348f, 0.700097f, -0.669451f, 0.321896f };
+ cblas_ctbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbsv(case 1274) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbsv(case 1274) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.33f, -0.236f, 0.267f, -0.139f, 0.25f, 0.509f, 0.86f, -0.089f, -0.018f, -0.847f, 0.424f, -0.573f, 0.097f, -0.663f, 0.65f, -0.811f, 0.283f, 0.032f };
+ float X[] = { -0.509f, 0.608f, 0.021f, -0.848f, -0.134f, 0.179f };
+ int incX = -1;
+ float x_expected[] = { 0.151523f, 0.78611f, 0.120309f, -1.01387f, -0.134f, 0.179f };
+ cblas_ctbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbsv(case 1275) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbsv(case 1275) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.33f, -0.236f, 0.267f, -0.139f, 0.25f, 0.509f, 0.86f, -0.089f, -0.018f, -0.847f, 0.424f, -0.573f, 0.097f, -0.663f, 0.65f, -0.811f, 0.283f, 0.032f };
+ float X[] = { -0.509f, 0.608f, 0.021f, -0.848f, -0.134f, 0.179f };
+ int incX = -1;
+ float x_expected[] = { -1.00779f, -0.620278f, 0.81164f, -1.90759f, -1.32022f, 1.48356f };
+ cblas_ctbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbsv(case 1276) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbsv(case 1276) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.33f, -0.236f, 0.267f, -0.139f, 0.25f, 0.509f, 0.86f, -0.089f, -0.018f, -0.847f, 0.424f, -0.573f, 0.097f, -0.663f, 0.65f, -0.811f, 0.283f, 0.032f };
+ float X[] = { -0.509f, 0.608f, 0.021f, -0.848f, -0.134f, 0.179f };
+ int incX = -1;
+ float x_expected[] = { -0.509f, 0.608f, -0.503138f, -1.26818f, 0.176615f, 0.447668f };
+ cblas_ctbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbsv(case 1277) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbsv(case 1277) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.041f, -0.61f, 0.099f, -0.393f, 0.357f, -0.984f, -0.576f, -0.342f, -0.903f, -0.083f, -0.157f, -0.694f, 0.768f, 0.688f, 0.203f, -0.079f, 0.298f, -0.424f };
+ float X[] = { -0.037f, -0.599f, 0.959f, -0.499f, 0.296f, 0.034f };
+ int incX = -1;
+ float x_expected[] = { -0.613838f, -1.13321f, -1.34847f, 0.0432903f, 0.0879552f, -0.479334f };
+ cblas_ctbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbsv(case 1278) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbsv(case 1278) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.041f, -0.61f, 0.099f, -0.393f, 0.357f, -0.984f, -0.576f, -0.342f, -0.903f, -0.083f, -0.157f, -0.694f, 0.768f, 0.688f, 0.203f, -0.079f, 0.298f, -0.424f };
+ float X[] = { -0.037f, -0.599f, 0.959f, -0.499f, 0.296f, 0.034f };
+ int incX = -1;
+ float x_expected[] = { 0.76323f, -1.23595f, 0.943058f, -0.618694f, 0.296f, 0.034f };
+ cblas_ctbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbsv(case 1279) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbsv(case 1279) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.041f, -0.61f, 0.099f, -0.393f, 0.357f, -0.984f, -0.576f, -0.342f, -0.903f, -0.083f, -0.157f, -0.694f, 0.768f, 0.688f, 0.203f, -0.079f, 0.298f, -0.424f };
+ float X[] = { -0.037f, -0.599f, 0.959f, -0.499f, 0.296f, 0.034f };
+ int incX = -1;
+ float x_expected[] = { -1.15557f, -2.50103f, -3.85402f, -1.04833f, 0.414582f, 5.91218f };
+ cblas_ctbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbsv(case 1280) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbsv(case 1280) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.041f, -0.61f, 0.099f, -0.393f, 0.357f, -0.984f, -0.576f, -0.342f, -0.903f, -0.083f, -0.157f, -0.694f, 0.768f, 0.688f, 0.203f, -0.079f, 0.298f, -0.424f };
+ float X[] = { -0.037f, -0.599f, 0.959f, -0.499f, 0.296f, 0.034f };
+ int incX = -1;
+ float x_expected[] = { -0.037f, -0.599f, 1.39953f, -0.064424f, 1.0801f, -0.481747f };
+ cblas_ctbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbsv(case 1281) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbsv(case 1281) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.041f, -0.61f, 0.099f, -0.393f, 0.357f, -0.984f, -0.576f, -0.342f, -0.903f, -0.083f, -0.157f, -0.694f, 0.768f, 0.688f, 0.203f, -0.079f, 0.298f, -0.424f };
+ float X[] = { -0.037f, -0.599f, 0.959f, -0.499f, 0.296f, 0.034f };
+ int incX = -1;
+ float x_expected[] = { -3.0802f, -9.09377f, -1.05845f, 0.99239f, 0.259763f, -0.687744f };
+ cblas_ctbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbsv(case 1282) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbsv(case 1282) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.041f, -0.61f, 0.099f, -0.393f, 0.357f, -0.984f, -0.576f, -0.342f, -0.903f, -0.083f, -0.157f, -0.694f, 0.768f, 0.688f, 0.203f, -0.079f, 0.298f, -0.424f };
+ float X[] = { -0.037f, -0.599f, 0.959f, -0.499f, 0.296f, 0.034f };
+ int incX = -1;
+ float x_expected[] = { -0.513897f, 0.632031f, 1.14112f, -0.580648f, 0.296f, 0.034f };
+ cblas_ctbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbsv(case 1283) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbsv(case 1283) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.041f, -0.61f, 0.099f, -0.393f, 0.357f, -0.984f, -0.576f, -0.342f, -0.903f, -0.083f, -0.157f, -0.694f, 0.768f, 0.688f, 0.203f, -0.079f, 0.298f, -0.424f };
+ float X[] = { -0.037f, -0.599f, 0.959f, -0.499f, 0.296f, 0.034f };
+ int incX = -1;
+ float x_expected[] = { 0.360899f, -0.456643f, -2.31803f, 0.257877f, 1.56928f, -0.922115f };
+ cblas_ctbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbsv(case 1284) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbsv(case 1284) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ float A[] = { 0.041f, -0.61f, 0.099f, -0.393f, 0.357f, -0.984f, -0.576f, -0.342f, -0.903f, -0.083f, -0.157f, -0.694f, 0.768f, 0.688f, 0.203f, -0.079f, 0.298f, -0.424f };
+ float X[] = { -0.037f, -0.599f, 0.959f, -0.499f, 0.296f, 0.034f };
+ int incX = -1;
+ float x_expected[] = { -0.037f, -0.599f, 0.875872f, -1.03683f, -0.198184f, -0.207572f };
+ cblas_ctbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctbsv(case 1285) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctbsv(case 1285) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.474, 0.715, 0.061, 0.532, 0.004, -0.318, 0.37, -0.692, -0.166, 0.039, -0.946, 0.857, -0.922, -0.491, 0.012, -0.217, -0.674, -0.429 };
+ double X[] = { -0.123, 0.122, 0.981, 0.321, 0.942, 0.98 };
+ int incX = -1;
+ double x_expected[] = { 0.0490338308139, -0.158433417494, 0.261604043488, 1.28058846321, 1.77633350191, -1.07039599422 };
+ cblas_ztbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbsv(case 1286) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbsv(case 1286) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.474, 0.715, 0.061, 0.532, 0.004, -0.318, 0.37, -0.692, -0.166, 0.039, -0.946, 0.857, -0.922, -0.491, 0.012, -0.217, -0.674, -0.429 };
+ double X[] = { -0.123, 0.122, 0.981, 0.321, 0.942, 0.98 };
+ int incX = -1;
+ double x_expected[] = { -0.123, 0.122, 0.96534, 0.346049, 1.067212328, 0.445330131 };
+ cblas_ztbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbsv(case 1287) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbsv(case 1287) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.474, 0.715, 0.061, 0.532, 0.004, -0.318, 0.37, -0.692, -0.166, 0.039, -0.946, 0.857, -0.922, -0.491, 0.012, -0.217, -0.674, -0.429 };
+ double X[] = { -0.123, 0.122, 0.981, 0.321, 0.942, 0.98 };
+ int incX = -1;
+ double x_expected[] = { 72.7437666278, 10.4206532927, -4.34946941374, -14.8012581742, 2.01859491883, -1.53922125931 };
+ cblas_ztbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbsv(case 1288) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbsv(case 1288) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.474, 0.715, 0.061, 0.532, 0.004, -0.318, 0.37, -0.692, -0.166, 0.039, -0.946, 0.857, -0.922, -0.491, 0.012, -0.217, -0.674, -0.429 };
+ double X[] = { -0.123, 0.122, 0.981, 0.321, 0.942, 0.98 };
+ int incX = -1;
+ double x_expected[] = { -0.464775024, 0.662224708, -0.0457, 0.610264, 0.942, 0.98 };
+ cblas_ztbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbsv(case 1289) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbsv(case 1289) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.474, 0.715, 0.061, 0.532, 0.004, -0.318, 0.37, -0.692, -0.166, 0.039, -0.946, 0.857, -0.922, -0.491, 0.012, -0.217, -0.674, -0.429 };
+ double X[] = { -0.123, 0.122, 0.981, 0.321, 0.942, 0.98 };
+ int incX = -1;
+ double x_expected[] = { -0.591747295323, -0.534096923761, -4.60251824353, 1.70172936273, -4.94687072873, -3.32536493524 };
+ cblas_ztbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbsv(case 1290) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbsv(case 1290) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.474, 0.715, 0.061, 0.532, 0.004, -0.318, 0.37, -0.692, -0.166, 0.039, -0.946, 0.857, -0.922, -0.491, 0.012, -0.217, -0.674, -0.429 };
+ double X[] = { -0.123, 0.122, 0.981, 0.321, 0.942, 0.98 };
+ int incX = -1;
+ double x_expected[] = { -0.123, 0.122, 0.807692, 0.373091, 0.384974988, 1.400879194 };
+ cblas_ztbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbsv(case 1291) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbsv(case 1291) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.474, 0.715, 0.061, 0.532, 0.004, -0.318, 0.37, -0.692, -0.166, 0.039, -0.946, 0.857, -0.922, -0.491, 0.012, -0.217, -0.674, -0.429 };
+ double X[] = { -0.123, 0.122, 0.981, 0.321, 0.942, 0.98 };
+ int incX = -1;
+ double x_expected[] = { -0.129998778267, -0.116630230861, 0.993340886904, 0.530739563688, 1.55891621291, -0.284019181928 };
+ cblas_ztbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbsv(case 1292) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbsv(case 1292) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.474, 0.715, 0.061, 0.532, 0.004, -0.318, 0.37, -0.692, -0.166, 0.039, -0.946, 0.857, -0.922, -0.491, 0.012, -0.217, -0.674, -0.429 };
+ double X[] = { -0.123, 0.122, 0.981, 0.321, 0.942, 0.98 };
+ int incX = -1;
+ double x_expected[] = { 0.107496032, 0.025821594, 1.444898, -0.239924, 0.942, 0.98 };
+ cblas_ztbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbsv(case 1293) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbsv(case 1293) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { -0.872, -0.841, 0.108, -0.744, 0.231, -0.513, -0.973, 0.087, 0.348, 0.196, 0.447, 0.307, 0.632, -0.949, 0.322, 0.277, 0.282, 0.831 };
+ double X[] = { -0.373, 0.566, 0.92, 0.627, 0.293, -0.434 };
+ int incX = -1;
+ double x_expected[] = { -0.825842176606, 0.212941473892, -0.548817434511, -0.703261551538, 0.0746069436827, 0.425751789407 };
+ cblas_ztbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbsv(case 1294) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbsv(case 1294) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { -0.872, -0.841, 0.108, -0.744, 0.231, -0.513, -0.973, 0.087, 0.348, 0.196, 0.447, 0.307, 0.632, -0.949, 0.322, 0.277, 0.282, 0.831 };
+ double X[] = { -0.373, 0.566, 0.92, 0.627, 0.293, -0.434 };
+ int incX = -1;
+ double x_expected[] = { -0.619710352, 0.018225936, 1.211252, 0.891864, 0.293, -0.434 };
+ cblas_ztbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbsv(case 1295) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbsv(case 1295) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { -0.872, -0.841, 0.108, -0.744, 0.231, -0.513, -0.973, 0.087, 0.348, 0.196, 0.447, 0.307, 0.632, -0.949, 0.322, 0.277, 0.282, 0.831 };
+ double X[] = { -0.373, 0.566, 0.92, 0.627, 0.293, -0.434 };
+ int incX = -1;
+ double x_expected[] = { 0.203289119964, 1.58288482537, -1.7720160159, 0.479463518178, -0.511241930019, -1.79333888299 };
+ cblas_ztbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbsv(case 1296) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbsv(case 1296) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { -0.872, -0.841, 0.108, -0.744, 0.231, -0.513, -0.973, 0.087, 0.348, 0.196, 0.447, 0.307, 0.632, -0.949, 0.322, 0.277, 0.282, 0.831 };
+ double X[] = { -0.373, 0.566, 0.92, 0.627, 0.293, -0.434 };
+ int incX = -1;
+ double x_expected[] = { -0.373, 0.566, 0.618602, -0.084689, 0.887531803, -0.570220771 };
+ cblas_ztbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbsv(case 1297) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbsv(case 1297) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { -0.872, -0.841, 0.108, -0.744, 0.231, -0.513, -0.973, 0.087, 0.348, 0.196, 0.447, 0.307, 0.632, -0.949, 0.322, 0.277, 0.282, 0.831 };
+ double X[] = { -0.373, 0.566, 0.92, 0.627, 0.293, -0.434 };
+ int incX = -1;
+ double x_expected[] = { 1.72799012007, 13.4612400765, 4.46126528205, -0.0212528722047, 0.627282377919, 0.302760084926 };
+ cblas_ztbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbsv(case 1298) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbsv(case 1298) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { -0.872, -0.841, 0.108, -0.744, 0.231, -0.513, -0.973, 0.087, 0.348, 0.196, 0.447, 0.307, 0.632, -0.949, 0.322, 0.277, 0.282, 0.831 };
+ double X[] = { -0.373, 0.566, 0.92, 0.627, 0.293, -0.434 };
+ int incX = -1;
+ double x_expected[] = { -1.280839615, 1.560525655, 1.167331, 0.179227, 0.293, -0.434 };
+ cblas_ztbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbsv(case 1299) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbsv(case 1299) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { -0.872, -0.841, 0.108, -0.744, 0.231, -0.513, -0.973, 0.087, 0.348, 0.196, 0.447, 0.307, 0.632, -0.949, 0.322, 0.277, 0.282, 0.831 };
+ double X[] = { -0.373, 0.566, 0.92, 0.627, 0.293, -0.434 };
+ int incX = -1;
+ double x_expected[] = { -0.594503951847, 0.00287302167266, -1.08185265666, -0.859860374254, 0.0331027077244, 1.28233265933 };
+ cblas_ztbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbsv(case 1300) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbsv(case 1300) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { -0.872, -0.841, 0.108, -0.744, 0.231, -0.513, -0.973, 0.087, 0.348, 0.196, 0.447, 0.307, 0.632, -0.949, 0.322, 0.277, 0.282, 0.831 };
+ double X[] = { -0.373, 0.566, 0.92, 0.627, 0.293, -0.434 };
+ int incX = -1;
+ double x_expected[] = { -0.373, 0.566, 1.16074, 0.50314, -0.20669608, 0.37525144 };
+ cblas_ztbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbsv(case 1301) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbsv(case 1301) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.404, 0.667, 0.861, 0.22, 0.298, -0.858, -0.682, -0.969, 0.327, -0.86, 0.125, 0.606, -0.143, -0.865, -0.036, 0.23, -0.776, 0.079 };
+ double X[] = { 0.028, -0.804, 0.582, -0.078, -0.126, 0.459 };
+ int incX = -1;
+ double x_expected[] = { 0.0654496252357, 0.224007771015, -0.752486084395, -0.554870892947, -0.587163401057, 0.166737652215 };
+ cblas_ztbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbsv(case 1302) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbsv(case 1302) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.404, 0.667, 0.861, 0.22, 0.298, -0.858, -0.682, -0.969, 0.327, -0.86, 0.125, 0.606, -0.143, -0.865, -0.036, 0.23, -0.776, 0.079 };
+ double X[] = { 0.028, -0.804, 0.582, -0.078, -0.126, 0.459 };
+ int incX = -1;
+ double x_expected[] = { -0.595558802, -1.147174647, 0.589506, -0.500919, -0.126, 0.459 };
+ cblas_ztbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbsv(case 1303) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbsv(case 1303) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.404, 0.667, 0.861, 0.22, 0.298, -0.858, -0.682, -0.969, 0.327, -0.86, 0.125, 0.606, -0.143, -0.865, -0.036, 0.23, -0.776, 0.079 };
+ double X[] = { 0.028, -0.804, 0.582, -0.078, -0.126, 0.459 };
+ int incX = -1;
+ double x_expected[] = { 3.39346077201, 0.652889512141, -2.33602680355, -2.7859245153, -5.04672104102, -0.334110541026 };
+ cblas_ztbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbsv(case 1304) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbsv(case 1304) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.404, 0.667, 0.861, 0.22, 0.298, -0.858, -0.682, -0.969, 0.327, -0.86, 0.125, 0.606, -0.143, -0.865, -0.036, 0.23, -0.776, 0.079 };
+ double X[] = { 0.028, -0.804, 0.582, -0.078, -0.126, 0.459 };
+ int incX = -1;
+ double x_expected[] = { 0.028, -0.804, -0.109456, -0.217192, -0.41110804, 0.41693792 };
+ cblas_ztbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbsv(case 1305) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbsv(case 1305) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.404, 0.667, 0.861, 0.22, 0.298, -0.858, -0.682, -0.969, 0.327, -0.86, 0.125, 0.606, -0.143, -0.865, -0.036, 0.23, -0.776, 0.079 };
+ double X[] = { 0.028, -0.804, 0.582, -0.078, -0.126, 0.459 };
+ int incX = -1;
+ double x_expected[] = { 7.16970224467, -0.772071373678, 0.833386981173, -0.673826630129, -0.26524050899, 0.465327628365 };
+ cblas_ztbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbsv(case 1306) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbsv(case 1306) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.404, 0.667, 0.861, 0.22, 0.298, -0.858, -0.682, -0.969, 0.327, -0.86, 0.125, 0.606, -0.143, -0.865, -0.036, 0.23, -0.776, 0.079 };
+ double X[] = { 0.028, -0.804, 0.582, -0.078, -0.126, 0.459 };
+ int incX = -1;
+ double x_expected[] = { 0.471459157, -1.566755859, 0.940839, 0.357132, -0.126, 0.459 };
+ cblas_ztbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbsv(case 1307) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbsv(case 1307) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 131;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.404, 0.667, 0.861, 0.22, 0.298, -0.858, -0.682, -0.969, 0.327, -0.86, 0.125, 0.606, -0.143, -0.865, -0.036, 0.23, -0.776, 0.079 };
+ double X[] = { 0.028, -0.804, 0.582, -0.078, -0.126, 0.459 };
+ int incX = -1;
+ double x_expected[] = { -0.909961830373, 0.118063054039, -0.0169425582229, -1.00055409731, -1.37205489923, 0.994032418785 };
+ cblas_ztbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbsv(case 1308) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbsv(case 1308) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 132;
+ int N = 3;
+ int K = 1;
+ int lda = 3;
+ double A[] = { 0.404, 0.667, 0.861, 0.22, 0.298, -0.858, -0.682, -0.969, 0.327, -0.86, 0.125, 0.606, -0.143, -0.865, -0.036, 0.23, -0.776, 0.079 };
+ double X[] = { 0.028, -0.804, 0.582, -0.078, -0.126, 0.459 };
+ int incX = -1;
+ double x_expected[] = { 0.028, -0.804, -0.118596, 0.160828, -0.059271004, 0.294435972 };
+ cblas_ztbsv(order, uplo, trans, diag, N, K, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 3; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztbsv(case 1309) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztbsv(case 1309) imag");
+ };
+ };
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_tpmv.c b/gsl-1.9/cblas/test_tpmv.c
new file mode 100644
index 0000000..9b3f1b7
--- /dev/null
+++ b/gsl-1.9/cblas/test_tpmv.c
@@ -0,0 +1,1659 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_tpmv (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 2;
+ float A[] = { -0.587f, 0.14f, 0.841f };
+ float X[] = { -0.213f, 0.885f };
+ int incX = -1;
+ float x_expected[] = { -0.179133f, -0.549315f };
+ cblas_stpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stpmv(case 974)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 2;
+ float A[] = { -0.587f, 0.14f, 0.841f };
+ float X[] = { -0.213f, 0.885f };
+ int incX = -1;
+ float x_expected[] = { -0.213f, 0.85518f };
+ cblas_stpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stpmv(case 975)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 2;
+ float A[] = { -0.587f, 0.14f, 0.841f };
+ float X[] = { -0.213f, 0.885f };
+ int incX = -1;
+ float x_expected[] = { -0.055233f, -0.519495f };
+ cblas_stpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stpmv(case 976)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 2;
+ float A[] = { -0.587f, 0.14f, 0.841f };
+ float X[] = { -0.213f, 0.885f };
+ int incX = -1;
+ float x_expected[] = { -0.0891f, 0.885f };
+ cblas_stpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stpmv(case 977)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 2;
+ float A[] = { -0.587f, 0.14f, 0.841f };
+ float X[] = { -0.213f, 0.885f };
+ int incX = -1;
+ float x_expected[] = { -0.179133f, -0.549315f };
+ cblas_stpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stpmv(case 978)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 2;
+ float A[] = { -0.587f, 0.14f, 0.841f };
+ float X[] = { -0.213f, 0.885f };
+ int incX = -1;
+ float x_expected[] = { -0.213f, 0.85518f };
+ cblas_stpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stpmv(case 979)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 2;
+ float A[] = { -0.587f, 0.14f, 0.841f };
+ float X[] = { -0.213f, 0.885f };
+ int incX = -1;
+ float x_expected[] = { -0.055233f, -0.519495f };
+ cblas_stpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stpmv(case 980)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 2;
+ float A[] = { -0.587f, 0.14f, 0.841f };
+ float X[] = { -0.213f, 0.885f };
+ int incX = -1;
+ float x_expected[] = { -0.0891f, 0.885f };
+ cblas_stpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stpmv(case 981)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 2;
+ float A[] = { -0.765f, 0.968f, -0.956f };
+ float X[] = { 0.243f, -0.274f };
+ int incX = -1;
+ float x_expected[] = { -0.49754f, 0.20961f };
+ cblas_stpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stpmv(case 982)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 2;
+ float A[] = { -0.765f, 0.968f, -0.956f };
+ float X[] = { 0.243f, -0.274f };
+ int incX = -1;
+ float x_expected[] = { -0.022232f, -0.274f };
+ cblas_stpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stpmv(case 983)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 2;
+ float A[] = { -0.765f, 0.968f, -0.956f };
+ float X[] = { 0.243f, -0.274f };
+ int incX = -1;
+ float x_expected[] = { -0.232308f, 0.444834f };
+ cblas_stpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stpmv(case 984)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 2;
+ float A[] = { -0.765f, 0.968f, -0.956f };
+ float X[] = { 0.243f, -0.274f };
+ int incX = -1;
+ float x_expected[] = { 0.243f, -0.038776f };
+ cblas_stpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stpmv(case 985)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 2;
+ float A[] = { -0.765f, 0.968f, -0.956f };
+ float X[] = { 0.243f, -0.274f };
+ int incX = -1;
+ float x_expected[] = { -0.49754f, 0.20961f };
+ cblas_stpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stpmv(case 986)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 2;
+ float A[] = { -0.765f, 0.968f, -0.956f };
+ float X[] = { 0.243f, -0.274f };
+ int incX = -1;
+ float x_expected[] = { -0.022232f, -0.274f };
+ cblas_stpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stpmv(case 987)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 2;
+ float A[] = { -0.765f, 0.968f, -0.956f };
+ float X[] = { 0.243f, -0.274f };
+ int incX = -1;
+ float x_expected[] = { -0.232308f, 0.444834f };
+ cblas_stpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stpmv(case 988)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 2;
+ float A[] = { -0.765f, 0.968f, -0.956f };
+ float X[] = { 0.243f, -0.274f };
+ int incX = -1;
+ float x_expected[] = { 0.243f, -0.038776f };
+ cblas_stpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stpmv(case 989)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 2;
+ double A[] = { 0.393, -0.221, 0.356 };
+ double X[] = { -0.062, -0.221 };
+ int incX = -1;
+ double x_expected[] = { -0.022072, -0.073151 };
+ cblas_dtpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtpmv(case 990)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 2;
+ double A[] = { 0.393, -0.221, 0.356 };
+ double X[] = { -0.062, -0.221 };
+ int incX = -1;
+ double x_expected[] = { -0.062, -0.207298 };
+ cblas_dtpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtpmv(case 991)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 2;
+ double A[] = { 0.393, -0.221, 0.356 };
+ double X[] = { -0.062, -0.221 };
+ int incX = -1;
+ double x_expected[] = { 0.026769, -0.086853 };
+ cblas_dtpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtpmv(case 992)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 2;
+ double A[] = { 0.393, -0.221, 0.356 };
+ double X[] = { -0.062, -0.221 };
+ int incX = -1;
+ double x_expected[] = { -0.013159, -0.221 };
+ cblas_dtpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtpmv(case 993)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 2;
+ double A[] = { 0.393, -0.221, 0.356 };
+ double X[] = { -0.062, -0.221 };
+ int incX = -1;
+ double x_expected[] = { -0.022072, -0.073151 };
+ cblas_dtpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtpmv(case 994)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 2;
+ double A[] = { 0.393, -0.221, 0.356 };
+ double X[] = { -0.062, -0.221 };
+ int incX = -1;
+ double x_expected[] = { -0.062, -0.207298 };
+ cblas_dtpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtpmv(case 995)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 2;
+ double A[] = { 0.393, -0.221, 0.356 };
+ double X[] = { -0.062, -0.221 };
+ int incX = -1;
+ double x_expected[] = { 0.026769, -0.086853 };
+ cblas_dtpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtpmv(case 996)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 2;
+ double A[] = { 0.393, -0.221, 0.356 };
+ double X[] = { -0.062, -0.221 };
+ int incX = -1;
+ double x_expected[] = { -0.013159, -0.221 };
+ cblas_dtpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtpmv(case 997)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 2;
+ double A[] = { 0.694, 0.501, 0.019 };
+ double X[] = { -0.928, 0.365 };
+ int incX = -1;
+ double x_expected[] = { 0.165233, 0.25331 };
+ cblas_dtpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtpmv(case 998)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 2;
+ double A[] = { 0.694, 0.501, 0.019 };
+ double X[] = { -0.928, 0.365 };
+ int incX = -1;
+ double x_expected[] = { -0.745135, 0.365 };
+ cblas_dtpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtpmv(case 999)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 2;
+ double A[] = { 0.694, 0.501, 0.019 };
+ double X[] = { -0.928, 0.365 };
+ int incX = -1;
+ double x_expected[] = { -0.017632, -0.211618 };
+ cblas_dtpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtpmv(case 1000)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 2;
+ double A[] = { 0.694, 0.501, 0.019 };
+ double X[] = { -0.928, 0.365 };
+ int incX = -1;
+ double x_expected[] = { -0.928, -0.099928 };
+ cblas_dtpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtpmv(case 1001)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 2;
+ double A[] = { 0.694, 0.501, 0.019 };
+ double X[] = { -0.928, 0.365 };
+ int incX = -1;
+ double x_expected[] = { 0.165233, 0.25331 };
+ cblas_dtpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtpmv(case 1002)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 2;
+ double A[] = { 0.694, 0.501, 0.019 };
+ double X[] = { -0.928, 0.365 };
+ int incX = -1;
+ double x_expected[] = { -0.745135, 0.365 };
+ cblas_dtpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtpmv(case 1003)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 2;
+ double A[] = { 0.694, 0.501, 0.019 };
+ double X[] = { -0.928, 0.365 };
+ int incX = -1;
+ double x_expected[] = { -0.017632, -0.211618 };
+ cblas_dtpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtpmv(case 1004)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 2;
+ double A[] = { 0.694, 0.501, 0.019 };
+ double X[] = { -0.928, 0.365 };
+ int incX = -1;
+ double x_expected[] = { -0.928, -0.099928 };
+ cblas_dtpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtpmv(case 1005)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 2;
+ float A[] = { 0.362f, -0.849f, -0.612f, -0.718f, 0.503f, -0.923f };
+ float X[] = { 0.904f, 0.461f, -0.367f, 0.153f };
+ int incX = -1;
+ float x_expected[] = { 0.880215f, -0.602509f, -0.225207f, -0.564235f };
+ cblas_ctpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpmv(case 1006) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpmv(case 1006) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 2;
+ float A[] = { 0.362f, -0.849f, -0.612f, -0.718f, 0.503f, -0.923f };
+ float X[] = { 0.904f, 0.461f, -0.367f, 0.153f };
+ int incX = -1;
+ float x_expected[] = { 0.904f, 0.461f, -0.58925f, -0.778204f };
+ cblas_ctpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpmv(case 1007) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpmv(case 1007) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 2;
+ float A[] = { 0.362f, -0.849f, -0.612f, -0.718f, 0.503f, -0.923f };
+ float X[] = { 0.904f, 0.461f, -0.367f, 0.153f };
+ int incX = -1;
+ float x_expected[] = { 1.21467f, -0.432639f, -0.002957f, 0.366969f };
+ cblas_ctpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpmv(case 1008) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpmv(case 1008) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 2;
+ float A[] = { 0.362f, -0.849f, -0.612f, -0.718f, 0.503f, -0.923f };
+ float X[] = { 0.904f, 0.461f, -0.367f, 0.153f };
+ int incX = -1;
+ float x_expected[] = { 1.23846f, 0.63087f, -0.367f, 0.153f };
+ cblas_ctpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpmv(case 1009) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpmv(case 1009) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 2;
+ float A[] = { 0.362f, -0.849f, -0.612f, -0.718f, 0.503f, -0.923f };
+ float X[] = { 0.904f, 0.461f, -0.367f, 0.153f };
+ int incX = -1;
+ float x_expected[] = { 0.880215f, -0.602509f, -0.225207f, -0.564235f };
+ cblas_ctpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpmv(case 1010) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpmv(case 1010) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 2;
+ float A[] = { 0.362f, -0.849f, -0.612f, -0.718f, 0.503f, -0.923f };
+ float X[] = { 0.904f, 0.461f, -0.367f, 0.153f };
+ int incX = -1;
+ float x_expected[] = { 0.904f, 0.461f, -0.58925f, -0.778204f };
+ cblas_ctpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpmv(case 1011) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpmv(case 1011) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 2;
+ float A[] = { 0.362f, -0.849f, -0.612f, -0.718f, 0.503f, -0.923f };
+ float X[] = { 0.904f, 0.461f, -0.367f, 0.153f };
+ int incX = -1;
+ float x_expected[] = { 1.21467f, -0.432639f, -0.002957f, 0.366969f };
+ cblas_ctpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpmv(case 1012) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpmv(case 1012) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 2;
+ float A[] = { 0.362f, -0.849f, -0.612f, -0.718f, 0.503f, -0.923f };
+ float X[] = { 0.904f, 0.461f, -0.367f, 0.153f };
+ int incX = -1;
+ float x_expected[] = { 1.23846f, 0.63087f, -0.367f, 0.153f };
+ cblas_ctpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpmv(case 1013) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpmv(case 1013) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 2;
+ float A[] = { -0.876f, -0.697f, -0.519f, -0.223f, 0.526f, -0.077f };
+ float X[] = { 0.338f, -0.807f, 0.444f, -0.748f };
+ int incX = -1;
+ float x_expected[] = { -0.281591f, -0.161308f, -0.9103f, 0.34578f };
+ cblas_ctpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpmv(case 1014) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpmv(case 1014) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 2;
+ float A[] = { -0.876f, -0.697f, -0.519f, -0.223f, 0.526f, -0.077f };
+ float X[] = { 0.338f, -0.807f, 0.444f, -0.748f };
+ int incX = -1;
+ float x_expected[] = { -0.05924f, -0.5178f, 0.444f, -0.748f };
+ cblas_ctpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpmv(case 1015) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpmv(case 1015) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 2;
+ float A[] = { -0.876f, -0.697f, -0.519f, -0.223f, 0.526f, -0.077f };
+ float X[] = { 0.338f, -0.807f, 0.444f, -0.748f };
+ int incX = -1;
+ float x_expected[] = { 0.115649f, -0.450508f, -1.26568f, 0.689239f };
+ cblas_ctpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpmv(case 1016) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpmv(case 1016) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 2;
+ float A[] = { -0.876f, -0.697f, -0.519f, -0.223f, 0.526f, -0.077f };
+ float X[] = { 0.338f, -0.807f, 0.444f, -0.748f };
+ int incX = -1;
+ float x_expected[] = { 0.338f, -0.807f, 0.088617f, -0.404541f };
+ cblas_ctpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpmv(case 1017) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpmv(case 1017) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 2;
+ float A[] = { -0.876f, -0.697f, -0.519f, -0.223f, 0.526f, -0.077f };
+ float X[] = { 0.338f, -0.807f, 0.444f, -0.748f };
+ int incX = -1;
+ float x_expected[] = { -0.281591f, -0.161308f, -0.9103f, 0.34578f };
+ cblas_ctpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpmv(case 1018) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpmv(case 1018) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 2;
+ float A[] = { -0.876f, -0.697f, -0.519f, -0.223f, 0.526f, -0.077f };
+ float X[] = { 0.338f, -0.807f, 0.444f, -0.748f };
+ int incX = -1;
+ float x_expected[] = { -0.05924f, -0.5178f, 0.444f, -0.748f };
+ cblas_ctpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpmv(case 1019) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpmv(case 1019) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 2;
+ float A[] = { -0.876f, -0.697f, -0.519f, -0.223f, 0.526f, -0.077f };
+ float X[] = { 0.338f, -0.807f, 0.444f, -0.748f };
+ int incX = -1;
+ float x_expected[] = { 0.115649f, -0.450508f, -1.26568f, 0.689239f };
+ cblas_ctpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpmv(case 1020) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpmv(case 1020) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 2;
+ float A[] = { -0.876f, -0.697f, -0.519f, -0.223f, 0.526f, -0.077f };
+ float X[] = { 0.338f, -0.807f, 0.444f, -0.748f };
+ int incX = -1;
+ float x_expected[] = { 0.338f, -0.807f, 0.088617f, -0.404541f };
+ cblas_ctpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpmv(case 1021) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpmv(case 1021) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 131;
+ int N = 2;
+ float A[] = { 0.869f, -0.091f, -0.859f, 0.008f, -0.921f, -0.321f };
+ float X[] = { -0.122f, -0.364f, 0.602f, -0.96f };
+ int incX = -1;
+ float x_expected[] = { -0.295592f, 1.11591f, 0.610498f, -0.779458f };
+ cblas_ctpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpmv(case 1022) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpmv(case 1022) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 132;
+ int N = 2;
+ float A[] = { 0.869f, -0.091f, -0.859f, 0.008f, -0.921f, -0.321f };
+ float X[] = { -0.122f, -0.364f, 0.602f, -0.96f };
+ int incX = -1;
+ float x_expected[] = { -0.646798f, 0.455824f, 0.602f, -0.96f };
+ cblas_ctpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpmv(case 1023) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpmv(case 1023) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 131;
+ int N = 2;
+ float A[] = { 0.869f, -0.091f, -0.859f, 0.008f, -0.921f, -0.321f };
+ float X[] = { -0.122f, -0.364f, 0.602f, -0.96f };
+ int incX = -1;
+ float x_expected[] = { 0.229206f, 0.296082f, 0.712384f, -0.465806f };
+ cblas_ctpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpmv(case 1024) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpmv(case 1024) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 132;
+ int N = 2;
+ float A[] = { 0.869f, -0.091f, -0.859f, 0.008f, -0.921f, -0.321f };
+ float X[] = { -0.122f, -0.364f, 0.602f, -0.96f };
+ int incX = -1;
+ float x_expected[] = { -0.122f, -0.364f, 0.703886f, -0.646348f };
+ cblas_ctpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpmv(case 1025) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpmv(case 1025) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 131;
+ int N = 2;
+ float A[] = { 0.869f, -0.091f, -0.859f, 0.008f, -0.921f, -0.321f };
+ float X[] = { -0.122f, -0.364f, 0.602f, -0.96f };
+ int incX = -1;
+ float x_expected[] = { -0.295592f, 1.11591f, 0.610498f, -0.779458f };
+ cblas_ctpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpmv(case 1026) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpmv(case 1026) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 132;
+ int N = 2;
+ float A[] = { 0.869f, -0.091f, -0.859f, 0.008f, -0.921f, -0.321f };
+ float X[] = { -0.122f, -0.364f, 0.602f, -0.96f };
+ int incX = -1;
+ float x_expected[] = { -0.646798f, 0.455824f, 0.602f, -0.96f };
+ cblas_ctpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpmv(case 1027) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpmv(case 1027) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 131;
+ int N = 2;
+ float A[] = { 0.869f, -0.091f, -0.859f, 0.008f, -0.921f, -0.321f };
+ float X[] = { -0.122f, -0.364f, 0.602f, -0.96f };
+ int incX = -1;
+ float x_expected[] = { 0.229206f, 0.296082f, 0.712384f, -0.465806f };
+ cblas_ctpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpmv(case 1028) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpmv(case 1028) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 132;
+ int N = 2;
+ float A[] = { 0.869f, -0.091f, -0.859f, 0.008f, -0.921f, -0.321f };
+ float X[] = { -0.122f, -0.364f, 0.602f, -0.96f };
+ int incX = -1;
+ float x_expected[] = { -0.122f, -0.364f, 0.703886f, -0.646348f };
+ cblas_ctpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpmv(case 1029) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpmv(case 1029) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 2;
+ double A[] = { 0.254, 0.263, -0.271, -0.595, -0.182, -0.672 };
+ double X[] = { -0.042, -0.705, -0.255, -0.854 };
+ int incX = -1;
+ double x_expected[] = { -0.466116, 0.156534, -0.248261, -0.067936 };
+ cblas_ztpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpmv(case 1030) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpmv(case 1030) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 2;
+ double A[] = { 0.254, 0.263, -0.271, -0.595, -0.182, -0.672 };
+ double X[] = { -0.042, -0.705, -0.255, -0.854 };
+ int incX = -1;
+ double x_expected[] = { -0.042, -0.705, -0.663093, -0.637955 };
+ cblas_ztpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpmv(case 1031) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpmv(case 1031) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 2;
+ double A[] = { 0.254, 0.263, -0.271, -0.595, -0.182, -0.672 };
+ double X[] = { -0.042, -0.705, -0.255, -0.854 };
+ int incX = -1;
+ double x_expected[] = { -0.905141, 0.539693, 0.159832, -0.283981 };
+ cblas_ztpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpmv(case 1032) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpmv(case 1032) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 2;
+ double A[] = { 0.254, 0.263, -0.271, -0.595, -0.182, -0.672 };
+ double X[] = { -0.042, -0.705, -0.255, -0.854 };
+ int incX = -1;
+ double x_expected[] = { -0.481025, -0.321841, -0.255, -0.854 };
+ cblas_ztpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpmv(case 1033) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpmv(case 1033) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 2;
+ double A[] = { 0.254, 0.263, -0.271, -0.595, -0.182, -0.672 };
+ double X[] = { -0.042, -0.705, -0.255, -0.854 };
+ int incX = -1;
+ double x_expected[] = { -0.466116, 0.156534, -0.248261, -0.067936 };
+ cblas_ztpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpmv(case 1034) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpmv(case 1034) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 2;
+ double A[] = { 0.254, 0.263, -0.271, -0.595, -0.182, -0.672 };
+ double X[] = { -0.042, -0.705, -0.255, -0.854 };
+ int incX = -1;
+ double x_expected[] = { -0.042, -0.705, -0.663093, -0.637955 };
+ cblas_ztpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpmv(case 1035) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpmv(case 1035) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 2;
+ double A[] = { 0.254, 0.263, -0.271, -0.595, -0.182, -0.672 };
+ double X[] = { -0.042, -0.705, -0.255, -0.854 };
+ int incX = -1;
+ double x_expected[] = { -0.905141, 0.539693, 0.159832, -0.283981 };
+ cblas_ztpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpmv(case 1036) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpmv(case 1036) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 2;
+ double A[] = { 0.254, 0.263, -0.271, -0.595, -0.182, -0.672 };
+ double X[] = { -0.042, -0.705, -0.255, -0.854 };
+ int incX = -1;
+ double x_expected[] = { -0.481025, -0.321841, -0.255, -0.854 };
+ cblas_ztpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpmv(case 1037) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpmv(case 1037) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 2;
+ double A[] = { 0.421, -0.407, -0.595, -0.387, 0.884, -0.498 };
+ double X[] = { -0.008, 0.904, -0.689, -0.679 };
+ int incX = -1;
+ double x_expected[] = { 0.590302, 1.473768, -0.566422, -0.005436 };
+ cblas_ztpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpmv(case 1038) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpmv(case 1038) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 2;
+ double A[] = { 0.421, -0.407, -0.595, -0.387, 0.884, -0.498 };
+ double X[] = { -0.008, 0.904, -0.689, -0.679 };
+ int incX = -1;
+ double x_expected[] = { 0.139182, 1.574648, -0.689, -0.679 };
+ cblas_ztpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpmv(case 1039) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpmv(case 1039) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 2;
+ double A[] = { 0.421, -0.407, -0.595, -0.387, 0.884, -0.498 };
+ double X[] = { -0.008, 0.904, -0.689, -0.679 };
+ int incX = -1;
+ double x_expected[] = { 0.44312, 0.80312, -0.211814, -0.54022 };
+ cblas_ztpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpmv(case 1040) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpmv(case 1040) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 2;
+ double A[] = { 0.421, -0.407, -0.595, -0.387, 0.884, -0.498 };
+ double X[] = { -0.008, 0.904, -0.689, -0.679 };
+ int incX = -1;
+ double x_expected[] = { -0.008, 0.904, -0.334392, -1.213784 };
+ cblas_ztpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpmv(case 1041) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpmv(case 1041) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 2;
+ double A[] = { 0.421, -0.407, -0.595, -0.387, 0.884, -0.498 };
+ double X[] = { -0.008, 0.904, -0.689, -0.679 };
+ int incX = -1;
+ double x_expected[] = { 0.590302, 1.473768, -0.566422, -0.005436 };
+ cblas_ztpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpmv(case 1042) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpmv(case 1042) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 2;
+ double A[] = { 0.421, -0.407, -0.595, -0.387, 0.884, -0.498 };
+ double X[] = { -0.008, 0.904, -0.689, -0.679 };
+ int incX = -1;
+ double x_expected[] = { 0.139182, 1.574648, -0.689, -0.679 };
+ cblas_ztpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpmv(case 1043) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpmv(case 1043) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 2;
+ double A[] = { 0.421, -0.407, -0.595, -0.387, 0.884, -0.498 };
+ double X[] = { -0.008, 0.904, -0.689, -0.679 };
+ int incX = -1;
+ double x_expected[] = { 0.44312, 0.80312, -0.211814, -0.54022 };
+ cblas_ztpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpmv(case 1044) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpmv(case 1044) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 2;
+ double A[] = { 0.421, -0.407, -0.595, -0.387, 0.884, -0.498 };
+ double X[] = { -0.008, 0.904, -0.689, -0.679 };
+ int incX = -1;
+ double x_expected[] = { -0.008, 0.904, -0.334392, -1.213784 };
+ cblas_ztpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpmv(case 1045) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpmv(case 1045) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 131;
+ int N = 2;
+ double A[] = { -0.743, -0.078, 0.77, 0.505, 0.157, -0.986 };
+ double X[] = { -0.641, 0.565, -0.406, -0.948 };
+ int incX = -1;
+ double x_expected[] = { -1.449087, -1.068251, 0.375602, 0.672696 };
+ cblas_ztpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpmv(case 1046) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpmv(case 1046) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 132;
+ int N = 2;
+ double A[] = { -0.743, -0.078, 0.77, 0.505, 0.157, -0.986 };
+ double X[] = { -0.641, 0.565, -0.406, -0.948 };
+ int incX = -1;
+ double x_expected[] = { -1.43236, 0.04007, -0.406, -0.948 };
+ cblas_ztpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpmv(case 1047) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpmv(case 1047) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 131;
+ int N = 2;
+ double A[] = { -0.743, -0.078, 0.77, 0.505, 0.157, -0.986 };
+ double X[] = { -0.641, 0.565, -0.406, -0.948 };
+ int incX = -1;
+ double x_expected[] = { -0.657727, -0.543321, 0.167357, 1.431451 };
+ cblas_ztpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpmv(case 1048) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpmv(case 1048) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 132;
+ int N = 2;
+ double A[] = { -0.743, -0.078, 0.77, 0.505, 0.157, -0.986 };
+ double X[] = { -0.641, 0.565, -0.406, -0.948 };
+ int incX = -1;
+ double x_expected[] = { -0.641, 0.565, -0.614245, -0.189245 };
+ cblas_ztpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpmv(case 1049) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpmv(case 1049) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 131;
+ int N = 2;
+ double A[] = { -0.743, -0.078, 0.77, 0.505, 0.157, -0.986 };
+ double X[] = { -0.641, 0.565, -0.406, -0.948 };
+ int incX = -1;
+ double x_expected[] = { -1.449087, -1.068251, 0.375602, 0.672696 };
+ cblas_ztpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpmv(case 1050) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpmv(case 1050) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 132;
+ int N = 2;
+ double A[] = { -0.743, -0.078, 0.77, 0.505, 0.157, -0.986 };
+ double X[] = { -0.641, 0.565, -0.406, -0.948 };
+ int incX = -1;
+ double x_expected[] = { -1.43236, 0.04007, -0.406, -0.948 };
+ cblas_ztpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpmv(case 1051) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpmv(case 1051) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 131;
+ int N = 2;
+ double A[] = { -0.743, -0.078, 0.77, 0.505, 0.157, -0.986 };
+ double X[] = { -0.641, 0.565, -0.406, -0.948 };
+ int incX = -1;
+ double x_expected[] = { -0.657727, -0.543321, 0.167357, 1.431451 };
+ cblas_ztpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpmv(case 1052) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpmv(case 1052) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 132;
+ int N = 2;
+ double A[] = { -0.743, -0.078, 0.77, 0.505, 0.157, -0.986 };
+ double X[] = { -0.641, 0.565, -0.406, -0.948 };
+ int incX = -1;
+ double x_expected[] = { -0.641, 0.565, -0.614245, -0.189245 };
+ cblas_ztpmv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpmv(case 1053) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpmv(case 1053) imag");
+ };
+ };
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_tpsv.c b/gsl-1.9/cblas/test_tpsv.c
new file mode 100644
index 0000000..1fbb895
--- /dev/null
+++ b/gsl-1.9/cblas/test_tpsv.c
@@ -0,0 +1,1659 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_tpsv (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 2;
+ float A[] = { -0.381f, 0.53f, 0.451f };
+ float X[] = { 0.144f, 0.032f };
+ int incX = -1;
+ float x_expected[] = { 0.31929f, 0.360168f };
+ cblas_stpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stpsv(case 1310)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 2;
+ float A[] = { -0.381f, 0.53f, 0.451f };
+ float X[] = { 0.144f, 0.032f };
+ int incX = -1;
+ float x_expected[] = { 0.144f, -0.04432f };
+ cblas_stpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stpsv(case 1311)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 2;
+ float A[] = { -0.381f, 0.53f, 0.451f };
+ float X[] = { 0.144f, 0.032f };
+ int incX = -1;
+ float x_expected[] = { 0.417992f, -0.0839895f };
+ cblas_stpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stpsv(case 1312)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 2;
+ float A[] = { -0.381f, 0.53f, 0.451f };
+ float X[] = { 0.144f, 0.032f };
+ int incX = -1;
+ float x_expected[] = { 0.12704f, 0.032f };
+ cblas_stpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stpsv(case 1313)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 2;
+ float A[] = { -0.381f, 0.53f, 0.451f };
+ float X[] = { 0.144f, 0.032f };
+ int incX = -1;
+ float x_expected[] = { 0.31929f, 0.360168f };
+ cblas_stpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stpsv(case 1314)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 2;
+ float A[] = { -0.381f, 0.53f, 0.451f };
+ float X[] = { 0.144f, 0.032f };
+ int incX = -1;
+ float x_expected[] = { 0.144f, -0.04432f };
+ cblas_stpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stpsv(case 1315)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 2;
+ float A[] = { -0.381f, 0.53f, 0.451f };
+ float X[] = { 0.144f, 0.032f };
+ int incX = -1;
+ float x_expected[] = { 0.417992f, -0.0839895f };
+ cblas_stpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stpsv(case 1316)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 2;
+ float A[] = { -0.381f, 0.53f, 0.451f };
+ float X[] = { 0.144f, 0.032f };
+ int incX = -1;
+ float x_expected[] = { 0.12704f, 0.032f };
+ cblas_stpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stpsv(case 1317)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 2;
+ float A[] = { -0.381f, 0.53f, 0.451f };
+ float X[] = { 0.144f, 0.032f };
+ int incX = -1;
+ float x_expected[] = { 0.417992f, -0.0839895f };
+ cblas_stpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stpsv(case 1318)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 2;
+ float A[] = { -0.381f, 0.53f, 0.451f };
+ float X[] = { 0.144f, 0.032f };
+ int incX = -1;
+ float x_expected[] = { 0.12704f, 0.032f };
+ cblas_stpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stpsv(case 1319)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 2;
+ float A[] = { -0.381f, 0.53f, 0.451f };
+ float X[] = { 0.144f, 0.032f };
+ int incX = -1;
+ float x_expected[] = { 0.31929f, 0.360168f };
+ cblas_stpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stpsv(case 1320)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 2;
+ float A[] = { -0.381f, 0.53f, 0.451f };
+ float X[] = { 0.144f, 0.032f };
+ int incX = -1;
+ float x_expected[] = { 0.144f, -0.04432f };
+ cblas_stpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stpsv(case 1321)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 2;
+ float A[] = { -0.381f, 0.53f, 0.451f };
+ float X[] = { 0.144f, 0.032f };
+ int incX = -1;
+ float x_expected[] = { 0.417992f, -0.0839895f };
+ cblas_stpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stpsv(case 1322)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 2;
+ float A[] = { -0.381f, 0.53f, 0.451f };
+ float X[] = { 0.144f, 0.032f };
+ int incX = -1;
+ float x_expected[] = { 0.12704f, 0.032f };
+ cblas_stpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stpsv(case 1323)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 2;
+ float A[] = { -0.381f, 0.53f, 0.451f };
+ float X[] = { 0.144f, 0.032f };
+ int incX = -1;
+ float x_expected[] = { 0.31929f, 0.360168f };
+ cblas_stpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stpsv(case 1324)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 2;
+ float A[] = { -0.381f, 0.53f, 0.451f };
+ float X[] = { 0.144f, 0.032f };
+ int incX = -1;
+ float x_expected[] = { 0.144f, -0.04432f };
+ cblas_stpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "stpsv(case 1325)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 2;
+ double A[] = { 0.355, -0.698, -0.42 };
+ double X[] = { -0.702, -0.661 };
+ int incX = -1;
+ double x_expected[] = { 1.67142857143, 1.42438631791 };
+ cblas_dtpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtpsv(case 1326)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 2;
+ double A[] = { 0.355, -0.698, -0.42 };
+ double X[] = { -0.702, -0.661 };
+ int incX = -1;
+ double x_expected[] = { -0.702, -1.150996 };
+ cblas_dtpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtpsv(case 1327)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 2;
+ double A[] = { 0.355, -0.698, -0.42 };
+ double X[] = { -0.702, -0.661 };
+ int incX = -1;
+ double x_expected[] = { 4.76584842388, -1.86197183099 };
+ cblas_dtpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtpsv(case 1328)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 2;
+ double A[] = { 0.355, -0.698, -0.42 };
+ double X[] = { -0.702, -0.661 };
+ int incX = -1;
+ double x_expected[] = { -1.163378, -0.661 };
+ cblas_dtpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtpsv(case 1329)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 2;
+ double A[] = { 0.355, -0.698, -0.42 };
+ double X[] = { -0.702, -0.661 };
+ int incX = -1;
+ double x_expected[] = { 1.67142857143, 1.42438631791 };
+ cblas_dtpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtpsv(case 1330)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 2;
+ double A[] = { 0.355, -0.698, -0.42 };
+ double X[] = { -0.702, -0.661 };
+ int incX = -1;
+ double x_expected[] = { -0.702, -1.150996 };
+ cblas_dtpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtpsv(case 1331)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 2;
+ double A[] = { 0.355, -0.698, -0.42 };
+ double X[] = { -0.702, -0.661 };
+ int incX = -1;
+ double x_expected[] = { 4.76584842388, -1.86197183099 };
+ cblas_dtpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtpsv(case 1332)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 2;
+ double A[] = { 0.355, -0.698, -0.42 };
+ double X[] = { -0.702, -0.661 };
+ int incX = -1;
+ double x_expected[] = { -1.163378, -0.661 };
+ cblas_dtpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtpsv(case 1333)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 2;
+ double A[] = { 0.355, -0.698, -0.42 };
+ double X[] = { -0.702, -0.661 };
+ int incX = -1;
+ double x_expected[] = { 4.76584842388, -1.86197183099 };
+ cblas_dtpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtpsv(case 1334)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 2;
+ double A[] = { 0.355, -0.698, -0.42 };
+ double X[] = { -0.702, -0.661 };
+ int incX = -1;
+ double x_expected[] = { -1.163378, -0.661 };
+ cblas_dtpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtpsv(case 1335)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 2;
+ double A[] = { 0.355, -0.698, -0.42 };
+ double X[] = { -0.702, -0.661 };
+ int incX = -1;
+ double x_expected[] = { 1.67142857143, 1.42438631791 };
+ cblas_dtpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtpsv(case 1336)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 2;
+ double A[] = { 0.355, -0.698, -0.42 };
+ double X[] = { -0.702, -0.661 };
+ int incX = -1;
+ double x_expected[] = { -0.702, -1.150996 };
+ cblas_dtpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtpsv(case 1337)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 2;
+ double A[] = { 0.355, -0.698, -0.42 };
+ double X[] = { -0.702, -0.661 };
+ int incX = -1;
+ double x_expected[] = { 4.76584842388, -1.86197183099 };
+ cblas_dtpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtpsv(case 1338)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 2;
+ double A[] = { 0.355, -0.698, -0.42 };
+ double X[] = { -0.702, -0.661 };
+ int incX = -1;
+ double x_expected[] = { -1.163378, -0.661 };
+ cblas_dtpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtpsv(case 1339)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 2;
+ double A[] = { 0.355, -0.698, -0.42 };
+ double X[] = { -0.702, -0.661 };
+ int incX = -1;
+ double x_expected[] = { 1.67142857143, 1.42438631791 };
+ cblas_dtpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtpsv(case 1340)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 2;
+ double A[] = { 0.355, -0.698, -0.42 };
+ double X[] = { -0.702, -0.661 };
+ int incX = -1;
+ double x_expected[] = { -0.702, -1.150996 };
+ cblas_dtpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtpsv(case 1341)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 2;
+ float A[] = { -0.019f, -0.38f, 0.588f, 0.814f, 0.173f, -0.937f };
+ float X[] = { -0.133f, 0.998f, -0.072f, 0.642f };
+ int incX = -1;
+ float x_expected[] = { -1.05533f, 0.0529057f, -3.93625f, 1.36003f };
+ cblas_ctpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpsv(case 1342) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpsv(case 1342) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 2;
+ float A[] = { -0.019f, -0.38f, 0.588f, 0.814f, 0.173f, -0.937f };
+ float X[] = { -0.133f, 0.998f, -0.072f, 0.642f };
+ int incX = -1;
+ float x_expected[] = { -0.133f, 0.998f, 0.818576f, 0.163438f };
+ cblas_ctpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpsv(case 1343) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpsv(case 1343) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 2;
+ float A[] = { -0.019f, -0.38f, 0.588f, 0.814f, 0.173f, -0.937f };
+ float X[] = { -0.133f, 0.998f, -0.072f, 0.642f };
+ int incX = -1;
+ float x_expected[] = { -2.48362f, 1.13085f, -1.67581f, -0.273264f };
+ cblas_ctpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpsv(case 1344) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpsv(case 1344) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 2;
+ float A[] = { -0.019f, -0.38f, 0.588f, 0.814f, 0.173f, -0.937f };
+ float X[] = { -0.133f, 0.998f, -0.072f, 0.642f };
+ int incX = -1;
+ float x_expected[] = { 0.431924f, 0.679112f, -0.072f, 0.642f };
+ cblas_ctpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpsv(case 1345) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpsv(case 1345) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 2;
+ float A[] = { -0.019f, -0.38f, 0.588f, 0.814f, 0.173f, -0.937f };
+ float X[] = { -0.133f, 0.998f, -0.072f, 0.642f };
+ int incX = -1;
+ float x_expected[] = { -1.05533f, 0.0529057f, -3.93625f, 1.36003f };
+ cblas_ctpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpsv(case 1346) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpsv(case 1346) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 2;
+ float A[] = { -0.019f, -0.38f, 0.588f, 0.814f, 0.173f, -0.937f };
+ float X[] = { -0.133f, 0.998f, -0.072f, 0.642f };
+ int incX = -1;
+ float x_expected[] = { -0.133f, 0.998f, 0.818576f, 0.163438f };
+ cblas_ctpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpsv(case 1347) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpsv(case 1347) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 2;
+ float A[] = { -0.019f, -0.38f, 0.588f, 0.814f, 0.173f, -0.937f };
+ float X[] = { -0.133f, 0.998f, -0.072f, 0.642f };
+ int incX = -1;
+ float x_expected[] = { -2.48362f, 1.13085f, -1.67581f, -0.273264f };
+ cblas_ctpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpsv(case 1348) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpsv(case 1348) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 2;
+ float A[] = { -0.019f, -0.38f, 0.588f, 0.814f, 0.173f, -0.937f };
+ float X[] = { -0.133f, 0.998f, -0.072f, 0.642f };
+ int incX = -1;
+ float x_expected[] = { 0.431924f, 0.679112f, -0.072f, 0.642f };
+ cblas_ctpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpsv(case 1349) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpsv(case 1349) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 2;
+ float A[] = { -0.019f, -0.38f, 0.588f, 0.814f, 0.173f, -0.937f };
+ float X[] = { -0.133f, 0.998f, -0.072f, 0.642f };
+ int incX = -1;
+ float x_expected[] = { -2.48362f, 1.13085f, -1.67581f, -0.273264f };
+ cblas_ctpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpsv(case 1350) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpsv(case 1350) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 2;
+ float A[] = { -0.019f, -0.38f, 0.588f, 0.814f, 0.173f, -0.937f };
+ float X[] = { -0.133f, 0.998f, -0.072f, 0.642f };
+ int incX = -1;
+ float x_expected[] = { 0.431924f, 0.679112f, -0.072f, 0.642f };
+ cblas_ctpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpsv(case 1351) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpsv(case 1351) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 2;
+ float A[] = { -0.019f, -0.38f, 0.588f, 0.814f, 0.173f, -0.937f };
+ float X[] = { -0.133f, 0.998f, -0.072f, 0.642f };
+ int incX = -1;
+ float x_expected[] = { -1.05533f, 0.0529057f, -3.93625f, 1.36003f };
+ cblas_ctpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpsv(case 1352) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpsv(case 1352) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 2;
+ float A[] = { -0.019f, -0.38f, 0.588f, 0.814f, 0.173f, -0.937f };
+ float X[] = { -0.133f, 0.998f, -0.072f, 0.642f };
+ int incX = -1;
+ float x_expected[] = { -0.133f, 0.998f, 0.818576f, 0.163438f };
+ cblas_ctpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpsv(case 1353) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpsv(case 1353) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 2;
+ float A[] = { -0.019f, -0.38f, 0.588f, 0.814f, 0.173f, -0.937f };
+ float X[] = { -0.133f, 0.998f, -0.072f, 0.642f };
+ int incX = -1;
+ float x_expected[] = { -2.48362f, 1.13085f, -1.67581f, -0.273264f };
+ cblas_ctpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpsv(case 1354) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpsv(case 1354) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 2;
+ float A[] = { -0.019f, -0.38f, 0.588f, 0.814f, 0.173f, -0.937f };
+ float X[] = { -0.133f, 0.998f, -0.072f, 0.642f };
+ int incX = -1;
+ float x_expected[] = { 0.431924f, 0.679112f, -0.072f, 0.642f };
+ cblas_ctpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpsv(case 1355) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpsv(case 1355) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 2;
+ float A[] = { -0.019f, -0.38f, 0.588f, 0.814f, 0.173f, -0.937f };
+ float X[] = { -0.133f, 0.998f, -0.072f, 0.642f };
+ int incX = -1;
+ float x_expected[] = { -1.05533f, 0.0529057f, -3.93625f, 1.36003f };
+ cblas_ctpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpsv(case 1356) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpsv(case 1356) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 2;
+ float A[] = { -0.019f, -0.38f, 0.588f, 0.814f, 0.173f, -0.937f };
+ float X[] = { -0.133f, 0.998f, -0.072f, 0.642f };
+ int incX = -1;
+ float x_expected[] = { -0.133f, 0.998f, 0.818576f, 0.163438f };
+ cblas_ctpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpsv(case 1357) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpsv(case 1357) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 131;
+ int N = 2;
+ float A[] = { -0.019f, -0.38f, 0.588f, 0.814f, 0.173f, -0.937f };
+ float X[] = { -0.133f, 0.998f, -0.072f, 0.642f };
+ int incX = -1;
+ float x_expected[] = { 2.15867f, 1.69498f, 1.69471f, 0.104738f };
+ cblas_ctpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpsv(case 1358) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpsv(case 1358) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 132;
+ int N = 2;
+ float A[] = { -0.019f, -0.38f, 0.588f, 0.814f, 0.173f, -0.937f };
+ float X[] = { -0.133f, 0.998f, -0.072f, 0.642f };
+ int incX = -1;
+ float x_expected[] = { -0.613252f, 0.561896f, -0.072f, 0.642f };
+ cblas_ctpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpsv(case 1359) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpsv(case 1359) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 131;
+ int N = 2;
+ float A[] = { -0.019f, -0.38f, 0.588f, 0.814f, 0.173f, -0.937f };
+ float X[] = { -0.133f, 0.998f, -0.072f, 0.642f };
+ int incX = -1;
+ float x_expected[] = { 1.00465f, 0.327432f, 3.44853f, 2.273f };
+ cblas_ctpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpsv(case 1360) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpsv(case 1360) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 132;
+ int N = 2;
+ float A[] = { -0.019f, -0.38f, 0.588f, 0.814f, 0.173f, -0.937f };
+ float X[] = { -0.133f, 0.998f, -0.072f, 0.642f };
+ int incX = -1;
+ float x_expected[] = { -0.133f, 0.998f, -0.806168f, -0.053086f };
+ cblas_ctpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpsv(case 1361) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpsv(case 1361) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 131;
+ int N = 2;
+ float A[] = { -0.019f, -0.38f, 0.588f, 0.814f, 0.173f, -0.937f };
+ float X[] = { -0.133f, 0.998f, -0.072f, 0.642f };
+ int incX = -1;
+ float x_expected[] = { 2.15867f, 1.69498f, 1.69471f, 0.104738f };
+ cblas_ctpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpsv(case 1362) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpsv(case 1362) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 132;
+ int N = 2;
+ float A[] = { -0.019f, -0.38f, 0.588f, 0.814f, 0.173f, -0.937f };
+ float X[] = { -0.133f, 0.998f, -0.072f, 0.642f };
+ int incX = -1;
+ float x_expected[] = { -0.613252f, 0.561896f, -0.072f, 0.642f };
+ cblas_ctpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpsv(case 1363) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpsv(case 1363) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 131;
+ int N = 2;
+ float A[] = { -0.019f, -0.38f, 0.588f, 0.814f, 0.173f, -0.937f };
+ float X[] = { -0.133f, 0.998f, -0.072f, 0.642f };
+ int incX = -1;
+ float x_expected[] = { 1.00465f, 0.327432f, 3.44853f, 2.273f };
+ cblas_ctpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpsv(case 1364) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpsv(case 1364) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 132;
+ int N = 2;
+ float A[] = { -0.019f, -0.38f, 0.588f, 0.814f, 0.173f, -0.937f };
+ float X[] = { -0.133f, 0.998f, -0.072f, 0.642f };
+ int incX = -1;
+ float x_expected[] = { -0.133f, 0.998f, -0.806168f, -0.053086f };
+ cblas_ctpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctpsv(case 1365) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctpsv(case 1365) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 2;
+ double A[] = { 0.052, 0.875, 0.751, -0.912, 0.832, -0.153 };
+ double X[] = { 0.344, -0.143, -0.668, -0.945 };
+ int incX = -1;
+ double x_expected[] = { 0.430509772467, -0.0927067365535, -0.611144484555, 0.999982608216 };
+ cblas_ztpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpsv(case 1366) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpsv(case 1366) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 2;
+ double A[] = { 0.052, 0.875, 0.751, -0.912, 0.832, -0.153 };
+ double X[] = { 0.344, -0.143, -0.668, -0.945 };
+ int incX = -1;
+ double x_expected[] = { 0.344, -0.143, -0.795928, -0.523879 };
+ cblas_ztpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpsv(case 1367) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpsv(case 1367) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 2;
+ double A[] = { 0.052, 0.875, 0.751, -0.912, 0.832, -0.153 };
+ double X[] = { 0.344, -0.143, -0.668, -0.945 };
+ int incX = -1;
+ double x_expected[] = { 1.00136463678, -1.84591534629, -1.12140892769, 0.696784840869 };
+ cblas_ztpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpsv(case 1368) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpsv(case 1368) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 2;
+ double A[] = { 0.052, 0.875, 0.751, -0.912, 0.832, -0.153 };
+ double X[] = { 0.344, -0.143, -0.668, -0.945 };
+ int incX = -1;
+ double x_expected[] = { 1.707508, -0.042521, -0.668, -0.945 };
+ cblas_ztpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpsv(case 1369) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpsv(case 1369) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 2;
+ double A[] = { 0.052, 0.875, 0.751, -0.912, 0.832, -0.153 };
+ double X[] = { 0.344, -0.143, -0.668, -0.945 };
+ int incX = -1;
+ double x_expected[] = { 0.430509772467, -0.0927067365535, -0.611144484555, 0.999982608216 };
+ cblas_ztpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpsv(case 1370) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpsv(case 1370) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 2;
+ double A[] = { 0.052, 0.875, 0.751, -0.912, 0.832, -0.153 };
+ double X[] = { 0.344, -0.143, -0.668, -0.945 };
+ int incX = -1;
+ double x_expected[] = { 0.344, -0.143, -0.795928, -0.523879 };
+ cblas_ztpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpsv(case 1371) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpsv(case 1371) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 2;
+ double A[] = { 0.052, 0.875, 0.751, -0.912, 0.832, -0.153 };
+ double X[] = { 0.344, -0.143, -0.668, -0.945 };
+ int incX = -1;
+ double x_expected[] = { 1.00136463678, -1.84591534629, -1.12140892769, 0.696784840869 };
+ cblas_ztpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpsv(case 1372) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpsv(case 1372) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 2;
+ double A[] = { 0.052, 0.875, 0.751, -0.912, 0.832, -0.153 };
+ double X[] = { 0.344, -0.143, -0.668, -0.945 };
+ int incX = -1;
+ double x_expected[] = { 1.707508, -0.042521, -0.668, -0.945 };
+ cblas_ztpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpsv(case 1373) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpsv(case 1373) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 2;
+ double A[] = { 0.052, 0.875, 0.751, -0.912, 0.832, -0.153 };
+ double X[] = { 0.344, -0.143, -0.668, -0.945 };
+ int incX = -1;
+ double x_expected[] = { 1.00136463678, -1.84591534629, -1.12140892769, 0.696784840869 };
+ cblas_ztpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpsv(case 1374) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpsv(case 1374) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 2;
+ double A[] = { 0.052, 0.875, 0.751, -0.912, 0.832, -0.153 };
+ double X[] = { 0.344, -0.143, -0.668, -0.945 };
+ int incX = -1;
+ double x_expected[] = { 1.707508, -0.042521, -0.668, -0.945 };
+ cblas_ztpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpsv(case 1375) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpsv(case 1375) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 2;
+ double A[] = { 0.052, 0.875, 0.751, -0.912, 0.832, -0.153 };
+ double X[] = { 0.344, -0.143, -0.668, -0.945 };
+ int incX = -1;
+ double x_expected[] = { 0.430509772467, -0.0927067365535, -0.611144484555, 0.999982608216 };
+ cblas_ztpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpsv(case 1376) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpsv(case 1376) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 2;
+ double A[] = { 0.052, 0.875, 0.751, -0.912, 0.832, -0.153 };
+ double X[] = { 0.344, -0.143, -0.668, -0.945 };
+ int incX = -1;
+ double x_expected[] = { 0.344, -0.143, -0.795928, -0.523879 };
+ cblas_ztpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpsv(case 1377) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpsv(case 1377) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 2;
+ double A[] = { 0.052, 0.875, 0.751, -0.912, 0.832, -0.153 };
+ double X[] = { 0.344, -0.143, -0.668, -0.945 };
+ int incX = -1;
+ double x_expected[] = { 1.00136463678, -1.84591534629, -1.12140892769, 0.696784840869 };
+ cblas_ztpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpsv(case 1378) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpsv(case 1378) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 2;
+ double A[] = { 0.052, 0.875, 0.751, -0.912, 0.832, -0.153 };
+ double X[] = { 0.344, -0.143, -0.668, -0.945 };
+ int incX = -1;
+ double x_expected[] = { 1.707508, -0.042521, -0.668, -0.945 };
+ cblas_ztpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpsv(case 1379) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpsv(case 1379) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 2;
+ double A[] = { 0.052, 0.875, 0.751, -0.912, 0.832, -0.153 };
+ double X[] = { 0.344, -0.143, -0.668, -0.945 };
+ int incX = -1;
+ double x_expected[] = { 0.430509772467, -0.0927067365535, -0.611144484555, 0.999982608216 };
+ cblas_ztpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpsv(case 1380) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpsv(case 1380) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 2;
+ double A[] = { 0.052, 0.875, 0.751, -0.912, 0.832, -0.153 };
+ double X[] = { 0.344, -0.143, -0.668, -0.945 };
+ int incX = -1;
+ double x_expected[] = { 0.344, -0.143, -0.795928, -0.523879 };
+ cblas_ztpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpsv(case 1381) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpsv(case 1381) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 131;
+ int N = 2;
+ double A[] = { 0.052, 0.875, 0.751, -0.912, 0.832, -0.153 };
+ double X[] = { 0.344, -0.143, -0.668, -0.945 };
+ int incX = -1;
+ double x_expected[] = { -1.47384781823, -0.286556198408, 1.03098932879, -0.824698794397 };
+ cblas_ztpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpsv(case 1382) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpsv(case 1382) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 132;
+ int N = 2;
+ double A[] = { 0.052, 0.875, 0.751, -0.912, 0.832, -0.153 };
+ double X[] = { 0.344, -0.143, -0.668, -0.945 };
+ int incX = -1;
+ double x_expected[] = { -0.016172, 1.175911, -0.668, -0.945 };
+ cblas_ztpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpsv(case 1383) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpsv(case 1383) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 131;
+ int N = 2;
+ double A[] = { 0.052, 0.875, 0.751, -0.912, 0.832, -0.153 };
+ double X[] = { 0.344, -0.143, -0.668, -0.945 };
+ int incX = -1;
+ double x_expected[] = { 0.369363905801, -0.239798891331, 1.1759505739, -1.40027235656 };
+ cblas_ztpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpsv(case 1384) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpsv(case 1384) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 132;
+ int N = 2;
+ double A[] = { 0.052, 0.875, 0.751, -0.912, 0.832, -0.153 };
+ double X[] = { 0.344, -0.143, -0.668, -0.945 };
+ int incX = -1;
+ double x_expected[] = { 0.344, -0.143, -1.05676, -1.151335 };
+ cblas_ztpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpsv(case 1385) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpsv(case 1385) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 131;
+ int N = 2;
+ double A[] = { 0.052, 0.875, 0.751, -0.912, 0.832, -0.153 };
+ double X[] = { 0.344, -0.143, -0.668, -0.945 };
+ int incX = -1;
+ double x_expected[] = { -1.47384781823, -0.286556198408, 1.03098932879, -0.824698794397 };
+ cblas_ztpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpsv(case 1386) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpsv(case 1386) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 132;
+ int N = 2;
+ double A[] = { 0.052, 0.875, 0.751, -0.912, 0.832, -0.153 };
+ double X[] = { 0.344, -0.143, -0.668, -0.945 };
+ int incX = -1;
+ double x_expected[] = { -0.016172, 1.175911, -0.668, -0.945 };
+ cblas_ztpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpsv(case 1387) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpsv(case 1387) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 131;
+ int N = 2;
+ double A[] = { 0.052, 0.875, 0.751, -0.912, 0.832, -0.153 };
+ double X[] = { 0.344, -0.143, -0.668, -0.945 };
+ int incX = -1;
+ double x_expected[] = { 0.369363905801, -0.239798891331, 1.1759505739, -1.40027235656 };
+ cblas_ztpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpsv(case 1388) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpsv(case 1388) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 132;
+ int N = 2;
+ double A[] = { 0.052, 0.875, 0.751, -0.912, 0.832, -0.153 };
+ double X[] = { 0.344, -0.143, -0.668, -0.945 };
+ int incX = -1;
+ double x_expected[] = { 0.344, -0.143, -1.05676, -1.151335 };
+ cblas_ztpsv(order, uplo, trans, diag, N, A, X, incX);
+ {
+ int i;
+ for (i = 0; i < 2; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztpsv(case 1389) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztpsv(case 1389) imag");
+ };
+ };
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_trmm.c b/gsl-1.9/cblas/test_trmm.c
new file mode 100644
index 0000000..26fab2b
--- /dev/null
+++ b/gsl-1.9/cblas/test_trmm.c
@@ -0,0 +1,3947 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_trmm (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha = -0.3f;
+ float A[] = { 0.18f, 0.199f, 0.122f, -0.547f };
+ int lda = 2;
+ float B[] = { -0.874f, -0.383f, 0.458f, 0.124f, -0.221f, -0.107f };
+ int ldb = 3;
+ float B_expected[] = { 0.0397932f, 0.0338757f, -0.0183441f, 0.0203484f, -0.0362661f, -0.0175587f };
+ cblas_strmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strmm(case 1662)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha = -0.3f;
+ float A[] = { 0.195f, -0.453f, -0.579f, 0.697f };
+ int lda = 2;
+ float B[] = { 0.736f, 0.131f, 0.533f, 0.692f, -0.672f, -0.435f };
+ int ldb = 3;
+ float B_expected[] = { -0.126757f, -0.130625f, -0.219017f, -0.2076f, 0.2016f, 0.1305f };
+ cblas_strmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strmm(case 1663)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha = -0.3f;
+ float A[] = { -0.53f, 0.787f, 0.889f, -0.379f };
+ int lda = 2;
+ float B[] = { -0.355f, 0.002f, 0.266f, 0.972f, 0.712f, -0.353f };
+ int ldb = 3;
+ float B_expected[] = { -0.056445f, 3.18e-04f, 0.042294f, 0.205195f, 0.080421f, -0.111078f };
+ cblas_strmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strmm(case 1664)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha = -0.3f;
+ float A[] = { 0.198f, -0.673f, 0.792f, 0.781f };
+ int lda = 2;
+ float B[] = { 0.901f, 0.719f, -0.339f, -0.36f, 0.539f, 0.192f };
+ int ldb = 3;
+ float B_expected[] = { -0.2703f, -0.2157f, 0.1017f, -0.106078f, -0.332534f, 0.0229464f };
+ cblas_strmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strmm(case 1665)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha = -0.3f;
+ float A[] = { -0.522f, 0.851f, 0.586f, 0.196f };
+ int lda = 2;
+ float B[] = { 0.335f, 0.617f, 0.118f, -0.143f, 0.677f, 0.456f };
+ int ldb = 2;
+ float B_expected[] = { -0.0560076f, -0.0362796f, 0.0436182f, 0.0084084f, 0.0258534f, -0.0268128f };
+ cblas_strmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strmm(case 1666)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha = -0.3f;
+ float A[] = { -0.006f, -0.613f, -0.966f, -0.758f };
+ int lda = 2;
+ float B[] = { 0.64f, -0.723f, -0.765f, 0.801f, 0.376f, 0.91f };
+ int ldb = 2;
+ float B_expected[] = { -0.401525f, 0.2169f, 0.46163f, -0.2403f, 0.150918f, -0.273f };
+ cblas_strmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strmm(case 1667)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha = -0.3f;
+ float A[] = { 0.738f, 0.913f, -0.227f, 0.787f };
+ int lda = 2;
+ float B[] = { 0.194f, 0.988f, -0.274f, -0.652f, -0.281f, -0.359f };
+ int ldb = 2;
+ float B_expected[] = { -0.0429516f, -0.286403f, 0.0606636f, 0.228986f, 0.0622134f, 0.161726f };
+ cblas_strmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strmm(case 1668)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha = -0.3f;
+ float A[] = { 0.952f, 0.598f, 0.25f, -0.508f };
+ int lda = 2;
+ float B[] = { 0.036f, 0.745f, -0.606f, 0.215f, 0.943f, -0.933f };
+ int ldb = 2;
+ float B_expected[] = { -0.0108f, -0.229958f, 0.1818f, 0.0442164f, -0.2829f, 0.110726f };
+ cblas_strmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strmm(case 1669)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha = -0.3f;
+ float A[] = { -0.251f, 0.372f, -0.168f, 0.217f, -0.179f, 0.863f, -0.057f, 0.256f, 0.093f };
+ int lda = 3;
+ float B[] = { -0.727f, -0.461f, 0.162f, 0.579f, -0.305f, -0.735f };
+ int ldb = 3;
+ float B_expected[] = { -0.0547431f, 0.0563775f, 0.0781923f, 0.0435987f, -0.0809949f, 0.128653f };
+ cblas_strmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strmm(case 1670)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha = -0.3f;
+ float A[] = { -0.014f, 0.204f, 0.163f, 0.842f, -0.918f, -0.748f, -0.859f, -0.463f, 0.292f };
+ int lda = 3;
+ float B[] = { -0.587f, -0.625f, -0.994f, 0.681f, -0.577f, -0.434f };
+ int ldb = 3;
+ float B_expected[] = { 0.1761f, 0.223424f, 0.186654f, -0.2043f, 0.131423f, -0.0325797f };
+ cblas_strmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strmm(case 1671)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha = -0.3f;
+ float A[] = { -0.682f, -0.71f, 0.475f, -0.59f, -0.748f, 0.548f, 0.245f, 0.761f, -0.4f };
+ int lda = 3;
+ float B[] = { 0.565f, 0.967f, -0.969f, 0.184f, 0.349f, -0.552f };
+ int ldb = 3;
+ float B_expected[] = { 0.357979f, 0.438217f, -0.11628f, 0.139991f, 0.204337f, -0.06624f };
+ cblas_strmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strmm(case 1672)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha = -0.3f;
+ float A[] = { 0.617f, -0.998f, -0.97f, 0.364f, 0.09f, 0.588f, -0.263f, 0.584f, 0.463f };
+ int lda = 3;
+ float B[] = { 0.773f, 0.074f, -0.388f, 0.825f, -0.608f, 0.788f };
+ int ldb = 3;
+ float B_expected[] = { -0.270594f, 0.0457776f, 0.1164f, -0.118933f, 0.0443424f, -0.2364f };
+ cblas_strmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strmm(case 1673)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha = -0.3f;
+ float A[] = { 0.217f, -0.672f, -0.378f, -0.005f, -0.586f, -0.426f, 0.765f, -0.239f, -0.145f };
+ int lda = 3;
+ float B[] = { 0.01f, 0.387f, -0.953f, -0.374f, -0.673f, -0.724f };
+ int ldb = 2;
+ float B_expected[] = { -6.51e-04f, -0.0251937f, -0.167522f, -0.0651687f, -0.0999006f, -0.147126f };
+ cblas_strmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strmm(case 1674)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha = -0.3f;
+ float A[] = { 0.962f, 0.515f, 0.292f, 0.354f, -0.366f, 0.455f, 0.134f, -0.564f, -0.303f };
+ int lda = 3;
+ float B[] = { -0.337f, 0.718f, -0.866f, -0.454f, -0.439f, -0.668f };
+ int ldb = 2;
+ float B_expected[] = { 0.1011f, -0.2154f, 0.295589f, 0.0599484f, -0.0012798f, 0.0947196f };
+ cblas_strmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strmm(case 1675)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha = -0.3f;
+ float A[] = { -0.228f, -0.097f, 0.205f, 0.875f, -0.162f, 0.542f, -0.839f, -0.935f, 0.2f };
+ int lda = 3;
+ float B[] = { -0.125f, -0.676f, 0.181f, 0.741f, 0.216f, 0.766f };
+ int ldb = 2;
+ float B_expected[] = { -0.0165669f, -0.0717843f, -0.026325f, -0.088539f, -0.01296f, -0.04596f };
+ cblas_strmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strmm(case 1676)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha = -0.3f;
+ float A[] = { -0.854f, -0.502f, 0.591f, -0.934f, -0.729f, 0.063f, 0.352f, 0.126f, -0.905f };
+ int lda = 3;
+ float B[] = { -0.626f, -0.694f, -0.889f, -0.251f, -0.42f, -0.353f };
+ int ldb = 2;
+ float B_expected[] = { 0.128383f, 0.232986f, 0.274638f, 0.0819717f, 0.126f, 0.1059f };
+ cblas_strmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strmm(case 1677)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha = 0.1f;
+ float A[] = { -0.755f, 0.12f, 0.525f, 0.917f };
+ int lda = 2;
+ float B[] = { -0.927f, -0.813f, 0.624f, -0.366f, -0.864f, -0.046f };
+ int ldb = 3;
+ float B_expected[] = { 0.0699885f, 0.0613815f, -0.047112f, -0.0446862f, -0.0889848f, 0.0032698f };
+ cblas_strmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strmm(case 1678)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha = 0.1f;
+ float A[] = { -0.444f, 0.515f, 0.081f, -0.69f };
+ int lda = 2;
+ float B[] = { 0.571f, -0.098f, -0.226f, -0.587f, 0.788f, -0.629f };
+ int ldb = 3;
+ float B_expected[] = { 0.0571f, -0.0098f, -0.0226f, -0.0292935f, 0.073753f, -0.074539f };
+ cblas_strmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strmm(case 1679)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha = 0.1f;
+ float A[] = { -0.954f, 0.651f, -0.982f, 0.388f };
+ int lda = 2;
+ float B[] = { -0.927f, -0.281f, -0.918f, -0.527f, -0.652f, -0.393f };
+ int ldb = 3;
+ float B_expected[] = { 0.140187f, 0.0908338f, 0.12617f, -0.0204476f, -0.0252976f, -0.0152484f };
+ cblas_strmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strmm(case 1680)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha = 0.1f;
+ float A[] = { 0.811f, 0.852f, 0.224f, 0.443f };
+ int lda = 2;
+ float B[] = { -0.493f, -0.497f, -0.605f, 0.433f, -0.082f, -0.077f };
+ int ldb = 3;
+ float B_expected[] = { -0.0396008f, -0.0515368f, -0.0622248f, 0.0433f, -0.0082f, -0.0077f };
+ cblas_strmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strmm(case 1681)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha = 0.1f;
+ float A[] = { -0.777f, 0.812f, 0.254f, 0.97f };
+ int lda = 2;
+ float B[] = { -0.509f, 0.171f, 0.986f, -0.644f, -0.97f, 0.814f };
+ int ldb = 2;
+ float B_expected[] = { 0.0395493f, 0.0036584f, -0.0766122f, -0.0374236f, 0.075369f, 0.05432f };
+ cblas_strmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strmm(case 1682)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha = 0.1f;
+ float A[] = { 0.962f, 0.912f, -0.238f, -0.336f };
+ int lda = 2;
+ float B[] = { -0.666f, 0.066f, -0.176f, 0.402f, 0.286f, -0.703f };
+ int ldb = 2;
+ float B_expected[] = { -0.0666f, 0.0224508f, -0.0176f, 0.0443888f, 0.0286f, -0.0771068f };
+ cblas_strmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strmm(case 1683)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha = 0.1f;
+ float A[] = { 0.859f, -0.547f, 0.076f, 0.542f };
+ int lda = 2;
+ float B[] = { 0.402f, 0.945f, -0.242f, -0.062f, 0.714f, 0.468f };
+ int ldb = 2;
+ float B_expected[] = { -0.0171597f, 0.051219f, -0.0173964f, -0.0033604f, 0.035733f, 0.0253656f };
+ cblas_strmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strmm(case 1684)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha = 0.1f;
+ float A[] = { -0.779f, 0.435f, 0.612f, -0.723f };
+ int lda = 2;
+ float B[] = { 0.512f, -0.987f, -0.167f, 0.047f, -0.701f, -0.25f };
+ int ldb = 2;
+ float B_expected[] = { 0.0082655f, -0.0987f, -0.0146555f, 0.0047f, -0.080975f, -0.025f };
+ cblas_strmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strmm(case 1685)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha = 0.1f;
+ float A[] = { -0.757f, 0.396f, -0.927f, -0.558f, -0.289f, -0.66f, 0.83f, 0.363f, -0.13f };
+ int lda = 3;
+ float B[] = { 0.041f, 0.333f, -0.682f, 0.193f, 0.581f, 0.963f };
+ int ldb = 3;
+ float B_expected[] = { 0.0733045f, 0.0353883f, 0.008866f, -0.0808726f, -0.0803489f, -0.012519f };
+ cblas_strmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strmm(case 1686)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha = 0.1f;
+ float A[] = { -0.75f, 0.674f, -0.576f, 0.376f, -0.46f, -0.813f, 0.419f, 0.792f, 0.226f };
+ int lda = 3;
+ float B[] = { 0.511f, -0.544f, 0.938f, -0.126f, -0.873f, 0.118f };
+ int ldb = 3;
+ float B_expected[] = { -0.0395944f, -0.130659f, 0.0938f, -0.078237f, -0.0968934f, 0.0118f };
+ cblas_strmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strmm(case 1687)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha = 0.1f;
+ float A[] = { -0.045f, -0.809f, 0.654f, 0.611f, -0.038f, -0.105f, -0.946f, 0.474f, -0.097f };
+ int lda = 3;
+ float B[] = { -0.625f, -0.123f, -0.48f, -0.088f, -0.757f, 0.974f };
+ int ldb = 3;
+ float B_expected[] = { 0.0028125f, -0.0377201f, 0.0579508f, 3.96e-04f, -0.0025002f, -0.0370048f };
+ cblas_strmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strmm(case 1688)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha = 0.1f;
+ float A[] = { 0.713f, 0.781f, 0.084f, -0.498f, 0.692f, 0.125f, 0.706f, -0.118f, -0.907f };
+ int lda = 3;
+ float B[] = { 0.442f, -0.563f, 0.065f, -0.18f, 0.63f, -0.328f };
+ int ldb = 3;
+ float B_expected[] = { 0.0442f, -0.0783116f, 0.0443486f, -0.018f, 0.071964f, -0.052942f };
+ cblas_strmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strmm(case 1689)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha = 0.1f;
+ float A[] = { -0.442f, 0.566f, 0.064f, 0.962f, -0.669f, 0.416f, 0.761f, -0.359f, 0.863f };
+ int lda = 3;
+ float B[] = { 0.261f, -0.659f, -0.536f, 0.694f, -0.305f, -0.675f };
+ int ldb = 2;
+ float B_expected[] = { -0.0863099f, 0.0445231f, 0.0468079f, -0.0221961f, -0.0263215f, -0.0582525f };
+ cblas_strmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strmm(case 1690)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha = 0.1f;
+ float A[] = { 0.386f, 0.643f, -0.028f, -0.758f, -0.63f, -0.043f, 0.666f, -0.088f, 0.382f };
+ int lda = 3;
+ float B[] = { -0.241f, 0.766f, 0.656f, -0.977f, 0.274f, 0.565f };
+ int ldb = 2;
+ float B_expected[] = { -0.0555764f, 0.188286f, 0.0631888f, -0.102672f, 0.0274f, 0.0565f };
+ cblas_strmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strmm(case 1691)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha = 0.1f;
+ float A[] = { -0.855f, -0.587f, 0.062f, 0.372f, 0.48f, -0.63f, -0.786f, -0.437f, -0.431f };
+ int lda = 3;
+ float B[] = { 0.116f, 0.534f, 0.043f, 0.73f, 0.945f, 0.528f };
+ int ldb = 2;
+ float B_expected[] = { -0.009918f, -0.045657f, -0.0047452f, 0.0036942f, -0.0427193f, -0.065436f };
+ cblas_strmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strmm(case 1692)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha = 0.1f;
+ float A[] = { -0.068f, 0.119f, -0.244f, -0.05f, 0.685f, 0.752f, -0.059f, -0.935f, -0.571f };
+ int lda = 3;
+ float B[] = { -0.753f, -0.319f, 0.164f, 0.979f, 0.885f, -0.822f };
+ int ldb = 2;
+ float B_expected[] = { -0.0753f, -0.0319f, 0.0074393f, 0.0941039f, 0.119206f, -7.956e-04f };
+ cblas_strmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strmm(case 1693)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha = -0.3;
+ double A[] = { 0.174, -0.308, 0.997, -0.484 };
+ int lda = 2;
+ double B[] = { -0.256, -0.178, 0.098, 0.004, 0.97, -0.408 };
+ int ldb = 3;
+ double B_expected[] = { 0.0137328, 0.0989196, -0.0428148, 5.808e-04, 0.140844, -0.0592416 };
+ cblas_dtrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrmm(case 1694)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha = -0.3;
+ double A[] = { 0.722, -0.372, 0.466, -0.831 };
+ int lda = 2;
+ double B[] = { 0.322, -0.183, 0.849, -0.051, -0.343, -0.98 };
+ int ldb = 3;
+ double B_expected[] = { -0.1022916, 0.0166212, -0.364068, 0.0153, 0.1029, 0.294 };
+ cblas_dtrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrmm(case 1695)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha = -0.3;
+ double A[] = { -0.656, -0.066, 0.582, 0.141 };
+ int lda = 2;
+ double B[] = { 0.73, 0.407, 0.721, 0.086, -0.294, 0.941 };
+ int ldb = 3;
+ double B_expected[] = { 0.143664, 0.0800976, 0.1418928, -0.1310958, -0.058626, -0.1656909 };
+ cblas_dtrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrmm(case 1696)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha = -0.3;
+ double A[] = { -0.341, 0.386, -0.578, 0.863 };
+ int lda = 2;
+ double B[] = { -0.306, -0.047, -0.162, -0.784, 0.472, 0.137 };
+ int ldb = 3;
+ double B_expected[] = { 0.0918, 0.0141, 0.0486, 0.1821396, -0.1497498, -0.0691908 };
+ cblas_dtrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrmm(case 1697)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha = -0.3;
+ double A[] = { 0.844, -0.832, 0.179, -0.775 };
+ int lda = 2;
+ double B[] = { -0.415, -0.547, -0.023, 0.42, 0.917, 0.485 };
+ int ldb = 2;
+ double B_expected[] = { 0.1344519, -0.1271775, -0.0167304, 0.09765, -0.2582289, 0.1127625 };
+ cblas_dtrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrmm(case 1698)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha = -0.3;
+ double A[] = { 0.239, 0.34, 0.964, -0.575 };
+ int lda = 2;
+ double B[] = { 0.762, -0.038, -0.8, 0.626, -0.701, 0.639 };
+ int ldb = 2;
+ double B_expected[] = { -0.2176104, 0.0114, 0.0589608, -0.1878, 0.0255012, -0.1917 };
+ cblas_dtrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrmm(case 1699)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha = -0.3;
+ double A[] = { 0.785, -0.0, -0.592, -0.661 };
+ int lda = 2;
+ double B[] = { -0.215, 0.953, 0.527, -0.418, -0.675, 0.283 };
+ int ldb = 2;
+ double B_expected[] = { 0.0506325, 0.1889799, -0.1241085, -0.0828894, 0.1589625, 0.0561189 };
+ cblas_dtrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrmm(case 1700)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha = -0.3;
+ double A[] = { -0.423, -0.807, -0.683, -0.225 };
+ int lda = 2;
+ double B[] = { 0.149, -0.129, 0.149, -0.234, 0.275, 0.658 };
+ int ldb = 2;
+ double B_expected[] = { -0.0447, 0.0747729, -0.0447, 0.1062729, -0.0825, -0.1308225 };
+ cblas_dtrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrmm(case 1701)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha = -0.3;
+ double A[] = { -0.276, 0.434, 0.917, 0.682, -0.32, 0.557, -0.302, 0.989, -0.043 };
+ int lda = 3;
+ double B[] = { -0.943, 0.839, 0.759, 0.752, 0.807, 0.288 };
+ int ldb = 3;
+ double B_expected[] = { -0.0780804, 0.2033226, 0.1290135, 0.0622656, -0.0204384, -0.3380097 };
+ cblas_dtrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrmm(case 1702)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha = -0.3;
+ double A[] = { -0.731, -0.953, -0.666, 0.684, 0.38, 0.419, -0.361, 0.378, -0.423 };
+ int lda = 3;
+ double B[] = { -0.983, 0.479, -0.136, 0.048, 0.745, -0.408 };
+ int ldb = 3;
+ double B_expected[] = { 0.2949, -0.4247397, -0.2158137, -0.0144, -0.2097768, 0.0383439 };
+ cblas_dtrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrmm(case 1703)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha = -0.3;
+ double A[] = { -0.953, -0.983, 0.237, 0.128, -0.378, 0.607, 0.41, 0.418, -0.221 };
+ int lda = 3;
+ double B[] = { -0.561, -0.114, -0.148, 0.488, 0.146, -0.688 };
+ int ldb = 3;
+ double B_expected[] = { -0.1378083, 0.0056316, -0.0098124, 0.2185368, 0.1028316, -0.0456144 };
+ cblas_dtrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrmm(case 1704)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha = -0.3;
+ double A[] = { 0.277, -0.587, 0.885, -0.933, -0.582, 0.528, 0.268, -0.804, 0.62 };
+ int lda = 3;
+ double B[] = { -0.831, -0.319, -0.547, -0.577, 0.295, -0.31 };
+ int ldb = 3;
+ double B_expected[] = { 0.2039907, -0.0362364, 0.1641, 0.2805945, -0.163272, 0.093 };
+ cblas_dtrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrmm(case 1705)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha = -0.3;
+ double A[] = { 0.256, 0.554, 0.342, 0.318, -0.824, -0.119, -0.399, -0.653, -0.83 };
+ int lda = 3;
+ double B[] = { -0.577, 0.861, -0.439, -0.916, 0.452, -0.168 };
+ int ldb = 2;
+ double B_expected[] = { 0.0443136, -0.0661248, -0.053475, -0.3085746, -0.042519, -0.1182147 };
+ cblas_dtrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrmm(case 1706)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha = -0.3;
+ double A[] = { 0.837, -0.03, 0.552, -0.43, 0.841, 0.035, 0.7, 0.637, 0.095 };
+ int lda = 3;
+ double B[] = { -0.82, -0.362, -0.252, -0.062, -0.942, -0.299 };
+ int ldb = 2;
+ double B_expected[] = { 0.246, 0.1086, -0.03018, -0.028098, 0.5029572, 0.1775682 };
+ cblas_dtrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrmm(case 1707)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha = -0.3;
+ double A[] = { -0.074, 0.49, 0.802, -0.454, 0.626, 0.123, -0.959, 0.971, 0.75 };
+ int lda = 3;
+ double B[] = { -0.545, -0.107, 0.096, 0.183, 0.185, -0.218 };
+ int ldb = 2;
+ double B_expected[] = { -0.070722, 0.0231744, -0.0248553, -0.0263232, -0.041625, 0.04905 };
+ cblas_dtrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrmm(case 1708)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha = -0.3;
+ double A[] = { 0.048, 0.148, 0.834, -0.98, -0.009, -0.727, 0.241, 0.276, 0.518 };
+ int lda = 3;
+ double B[] = { -0.664, -0.136, -0.793, -0.742, 0.126, -0.131 };
+ int ldb = 2;
+ double B_expected[] = { 0.202884, 0.106521, 0.2653806, 0.1940289, -0.0378, 0.0393 };
+ cblas_dtrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrmm(case 1709)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha = 0.1;
+ double A[] = { 0.427, 0.495, 0.282, 0.158 };
+ int lda = 2;
+ double B[] = { 0.899, -0.375, 0.376, -0.831, 0.431, -0.387 };
+ int ldb = 3;
+ double B_expected[] = { 0.0383873, -0.0160125, 0.0160552, 0.0313707, -0.0117527, 0.0124974 };
+ cblas_dtrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrmm(case 1710)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha = 0.1;
+ double A[] = { 0.632, -0.174, 0.608, -0.669 };
+ int lda = 2;
+ double B[] = { -0.335, 0.535, -0.978, 0.31, 0.023, -0.853 };
+ int ldb = 3;
+ double B_expected[] = { -0.0335, 0.0535, -0.0978, 0.036829, -0.007009, -0.0682828 };
+ cblas_dtrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrmm(case 1711)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha = 0.1;
+ double A[] = { -0.779, -0.73, 0.343, -0.665 };
+ int lda = 2;
+ double B[] = { -0.976, -0.2, 0.661, -0.975, -0.965, -0.861 };
+ int ldb = 3;
+ double B_expected[] = { 0.0425879, -0.0175195, -0.0810242, 0.0648375, 0.0641725, 0.0572565 };
+ cblas_dtrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrmm(case 1712)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha = 0.1;
+ double A[] = { -0.127, -0.634, -0.384, -0.815 };
+ int lda = 2;
+ double B[] = { -0.348, 0.748, 0.893, 0.91, 0.153, -0.408 };
+ int ldb = 3;
+ double B_expected[] = { -0.069744, 0.0689248, 0.1049672, 0.091, 0.0153, -0.0408 };
+ cblas_dtrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrmm(case 1713)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha = 0.1;
+ double A[] = { -0.603, -0.617, 0.402, -0.918 };
+ int lda = 2;
+ double B[] = { 0.051, -0.096, 0.476, 0.377, 0.931, 0.291 };
+ int ldb = 2;
+ double B_expected[] = { -0.0030753, 0.010863, -0.0287028, -0.0154734, -0.0561393, 0.0107124 };
+ cblas_dtrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrmm(case 1714)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha = 0.1;
+ double A[] = { 0.67, -0.475, 0.032, -0.036 };
+ int lda = 2;
+ double B[] = { -0.19, 0.829, 0.942, 0.885, 0.087, 0.321 };
+ int ldb = 2;
+ double B_expected[] = { -0.019, 0.082292, 0.0942, 0.0915144, 0.0087, 0.0323784 };
+ cblas_dtrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrmm(case 1715)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha = 0.1;
+ double A[] = { -0.64, 0.595, 0.642, -0.921 };
+ int lda = 2;
+ double B[] = { -0.278, -0.83, 0.922, -0.701, -0.598, -0.232 };
+ int ldb = 2;
+ double B_expected[] = { -0.031593, 0.076443, -0.1007175, 0.0645621, 0.024468, 0.0213672 };
+ cblas_dtrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrmm(case 1716)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha = 0.1;
+ double A[] = { 0.842, 0.625, 0.967, 0.341 };
+ int lda = 2;
+ double B[] = { -0.679, -0.846, -0.921, 0.672, 0.292, 0.752 };
+ int ldb = 2;
+ double B_expected[] = { -0.120775, -0.0846, -0.0501, 0.0672, 0.0762, 0.0752 };
+ cblas_dtrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrmm(case 1717)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha = 0.1;
+ double A[] = { -0.612, 0.593, 0.113, -0.658, 0.703, -0.023, -0.384, 0.439, 0.958 };
+ int lda = 3;
+ double B[] = { -0.858, -0.559, 0.499, -0.114, 0.57, 0.847 };
+ int ldb = 3;
+ double B_expected[] = { 0.0249996, -0.0404454, 0.0478042, 0.0503489, 0.0381229, 0.0811426 };
+ cblas_dtrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrmm(case 1718)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha = 0.1;
+ double A[] = { 0.844, 0.205, -0.692, -0.401, -0.823, 0.342, -0.384, 0.344, 0.18 };
+ int lda = 3;
+ double B[] = { 0.823, -0.181, 0.141, 0.932, 0.097, -0.636 };
+ int ldb = 3;
+ double B_expected[] = { 0.0688323, -0.0132778, 0.0141, 0.1391997, -0.0120512, -0.0636 };
+ cblas_dtrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrmm(case 1719)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha = 0.1;
+ double A[] = { 0.065, 0.678, 0.044, -0.472, 0.932, -0.388, 0.432, -0.167, -0.277 };
+ int lda = 3;
+ double B[] = { 0.675, -0.468, -0.564, 0.71, -0.624, 0.023 };
+ int ldb = 3;
+ double B_expected[] = { 0.0043875, -0.0754776, 0.0525984, 0.004615, -0.0916688, 0.0404557 };
+ cblas_dtrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrmm(case 1720)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha = 0.1;
+ double A[] = { 0.649, -0.171, -0.462, 0.593, 0.131, -0.317, -0.254, -0.948, 0.002 };
+ int lda = 3;
+ double B[] = { -0.519, -0.501, -0.024, -0.767, -0.591, -0.738 };
+ int ldb = 3;
+ double B_expected[] = { -0.0519, -0.0808767, 0.0582774, -0.0767, -0.1045831, 0.0017086 };
+ cblas_dtrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrmm(case 1721)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha = 0.1;
+ double A[] = { -0.023, -0.872, -0.313, -0.698, 0.06, -0.838, -0.455, -0.715, -0.257 };
+ int lda = 3;
+ double B[] = { -0.17, -0.184, -0.243, 0.907, -0.423, 0.665 };
+ int ldb = 2;
+ double B_expected[] = { 0.0365989, -0.0931429, 0.0287865, -0.0421055, 0.0108711, -0.0170905 };
+ cblas_dtrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrmm(case 1722)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha = 0.1;
+ double A[] = { 0.792, 0.338, -0.155, 0.009, 0.485, -0.633, -0.08, -0.579, 0.223 };
+ int lda = 3;
+ double B[] = { -0.19, 0.201, 0.685, 0.663, 0.302, -0.506 };
+ int ldb = 2;
+ double B_expected[] = { -0.0207995, 0.0247447, 0.0510142, 0.0955974, 0.0302, -0.0506 };
+ cblas_dtrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrmm(case 1723)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha = 0.1;
+ double A[] = { -0.076, 0.103, -0.021, -0.866, 0.777, 0.723, 0.378, 0.98, -0.32 };
+ int lda = 3;
+ double B[] = { 0.739, -0.996, 0.182, 0.626, 0.291, -0.267 };
+ int ldb = 2;
+ double B_expected[] = { -0.0056164, 0.0075696, 0.0217531, 0.0383814, 0.0022947, 0.0558954 };
+ cblas_dtrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrmm(case 1724)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha = 0.1;
+ double A[] = { 0.469, 0.822, -0.619, 0.953, -0.706, 0.318, 0.559, -0.68, -0.208 };
+ int lda = 3;
+ double B[] = { 0.362, 0.719, -0.661, -0.504, 0.595, -0.771 };
+ int ldb = 2;
+ double B_expected[] = { 0.0362, 0.0719, -0.0363436, 0.0087018, 0.0160724, -0.1376333 };
+ cblas_dtrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrmm(case 1725)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-1.0f, 0.0f};
+ float A[] = { -0.023f, 0.762f, -0.687f, -0.039f, -0.459f, 0.047f, 0.189f, 0.33f };
+ int lda = 2;
+ float B[] = { 0.827f, -0.561f, 0.641f, -0.229f, -0.884f, -0.533f, -0.624f, -0.138f, 0.073f, 0.924f, -0.501f, -0.164f };
+ int ldb = 3;
+ float B_expected[] = { -0.831767f, -0.762219f, -0.14564f, 0.143926f, -0.764269f, 0.529142f, 0.072396f, 0.232002f, 0.291123f, -0.198726f, 0.040569f, 0.196326f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1726) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1726) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-1.0f, 0.0f};
+ float A[] = { 0.24f, 0.581f, 0.06f, 0.064f, 0.981f, 0.792f, 0.242f, -0.529f };
+ int lda = 2;
+ float B[] = { -0.649f, -0.774f, -0.43f, -0.447f, -0.266f, 0.285f, 0.787f, 0.274f, 0.449f, -0.912f, 0.435f, 0.601f };
+ int ldb = 3;
+ float B_expected[] = { 0.619316f, 0.707192f, 0.344692f, 0.472984f, 0.278364f, -0.3489f, -0.787f, -0.274f, -0.449f, 0.912f, -0.435f, -0.601f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1727) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1727) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-1.0f, 0.0f};
+ float A[] = { 0.68f, -0.728f, -0.59f, -0.434f, -0.936f, 0.915f, 0.236f, -0.118f };
+ int lda = 2;
+ float B[] = { 0.461f, 0.48f, 0.224f, 0.215f, -0.419f, -0.525f, 0.113f, -0.582f, 0.468f, 0.269f, 0.943f, -0.587f };
+ int ldb = 3;
+ float B_expected[] = { -0.66292f, 0.009208f, -0.30884f, 0.016872f, 0.66712f, 0.051968f, 0.912704f, 0.178151f, 0.264199f, -0.01198f, -1.02584f, 0.141791f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1728) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1728) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-1.0f, 0.0f};
+ float A[] = { 0.699f, -0.709f, -0.775f, 0.779f, 0.5f, 0.774f, -0.399f, -0.843f };
+ int lda = 2;
+ float B[] = { 0.538f, 0.556f, -0.186f, -0.678f, -0.413f, -0.612f, -0.216f, -0.519f, -0.344f, -0.578f, -0.938f, -0.848f };
+ int ldb = 3;
+ float B_expected[] = { -0.538f, -0.556f, 0.186f, 0.678f, 0.413f, 0.612f, 0.377344f, -0.175412f, -0.087772f, 1.06096f, 0.670812f, 1.47366f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1729) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1729) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-1.0f, 0.0f};
+ float A[] = { 0.527f, 0.318f, -0.224f, 0.547f, -0.765f, -0.469f, 0.233f, 0.023f };
+ int lda = 2;
+ float B[] = { 0.54f, -0.418f, -0.892f, -0.118f, -0.296f, 0.019f, 0.786f, -0.145f, 0.136f, 0.472f, 0.731f, 0.333f };
+ int ldb = 2;
+ float B_expected[] = { -1.04454f, -0.460052f, 0.205122f, 0.04801f, 0.831329f, 0.341824f, -0.186473f, 0.015707f, 0.481462f, 0.305592f, -0.162664f, -0.094402f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1730) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1730) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-1.0f, 0.0f};
+ float A[] = { -0.109f, -0.852f, 0.395f, 0.871f, 0.378f, -0.493f, 0.51f, 0.973f };
+ int lda = 2;
+ float B[] = { -0.867f, -0.758f, 0.687f, -0.596f, -0.912f, -0.561f, -0.389f, 0.21f, -0.561f, 0.132f, 0.689f, 0.653f };
+ int ldb = 2;
+ float B_expected[] = { 0.901142f, 1.32198f, -0.687f, 0.596f, 0.955512f, 0.289843f, 0.389f, -0.21f, -0.021371f, -0.039157f, -0.689f, -0.653f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1731) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1731) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-1.0f, 0.0f};
+ float A[] = { 0.686f, 0.349f, 0.299f, -0.462f, 0.009f, -0.693f, -0.478f, -0.617f };
+ int lda = 2;
+ float B[] = { -0.409f, 0.986f, -0.854f, 0.346f, 0.444f, -0.659f, 0.027f, 0.007f, 0.842f, -0.473f, 0.825f, 0.866f };
+ int ldb = 2;
+ float B_expected[] = { 0.624688f, -0.533655f, -0.954935f, -0.845302f, -0.534575f, 0.297118f, 0.180289f, 0.422174f, -0.742689f, 0.03062f, -0.173204f, 1.4534f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1732) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1732) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-1.0f, 0.0f};
+ float A[] = { -0.286f, 0.661f, 0.372f, 0.28f, 0.482f, 0.267f, -0.436f, 0.844f };
+ int lda = 2;
+ float B[] = { 0.0f, -0.513f, 0.91f, 0.109f, 0.587f, -0.183f, 0.112f, 0.362f, -0.256f, -0.518f, -0.933f, 0.066f };
+ int ldb = 2;
+ float B_expected[] = { 0.0f, 0.513f, -1.05364f, 0.081836f, -0.587f, 0.183f, -0.381604f, -0.458284f, 0.256f, 0.518f, 0.883192f, 0.198376f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1733) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1733) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-1.0f, 0.0f};
+ float A[] = { 0.678f, 0.717f, 0.228f, 0.001f, -0.16f, -0.387f, -0.281f, -0.002f, 0.623f, 0.162f, -0.594f, 0.632f, 0.566f, 0.352f, -0.411f, 0.574f, 0.314f, -0.139f };
+ int lda = 3;
+ float B[] = { -0.823f, -0.042f, 0.171f, -0.928f, 0.66f, 0.965f, 0.472f, 0.006f, -0.083f, 0.937f, -0.814f, 0.9f };
+ int ldb = 3;
+ float B_expected[] = { 0.52788f, 0.618567f, -0.069267f, 0.560841f, -0.941723f, -1.19579f, -0.315714f, -0.342492f, 0.095893f, -0.572145f, 0.746576f, 0.396912f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1734) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1734) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-1.0f, 0.0f};
+ float A[] = { 0.346f, 0.915f, -0.227f, -0.066f, -0.166f, -0.921f, -0.373f, 0.312f, -0.824f, 0.699f, -0.114f, -0.152f, 0.862f, -0.077f, 0.221f, -0.757f, -0.413f, -0.494f };
+ int lda = 3;
+ float B[] = { -0.02f, -0.247f, -0.62f, 0.651f, -0.07f, -0.491f, 0.042f, 0.936f, 0.272f, -0.582f, 0.012f, -0.534f };
+ int ldb = 3;
+ float B_expected[] = { 0.02f, 0.247f, 0.631762f, -0.708389f, 0.124535f, 0.411552f, -0.042f, -0.936f, -0.324242f, 0.797244f, -0.747612f, 0.703054f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1735) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1735) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-1.0f, 0.0f};
+ float A[] = { -0.493f, -0.882f, -0.82f, 0.627f, 0.301f, -0.903f, -0.092f, 0.787f, -0.426f, -0.854f, -0.993f, 0.118f, 0.615f, 0.362f, -0.238f, -0.076f, 0.817f, -0.286f };
+ int lda = 3;
+ float B[] = { 0.395f, 0.074f, -0.191f, -0.548f, 0.858f, 0.323f, -0.734f, 0.612f, 0.895f, 0.849f, 0.811f, 0.402f };
+ int ldb = 3;
+ float B_expected[] = { -0.730125f, -0.024468f, 0.566282f, -0.25448f, -0.793364f, -0.018503f, -0.504384f, -1.51274f, -0.18131f, 1.28332f, -0.777559f, -0.096488f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1736) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1736) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-1.0f, 0.0f};
+ float A[] = { -0.033f, -0.383f, 0.116f, 0.797f, -0.99f, 0.765f, 0.915f, 0.002f, 0.228f, 0.077f, 0.597f, -0.454f, -0.629f, 0.424f, -0.89f, 0.339f, -0.484f, 0.169f };
+ int lda = 3;
+ float B[] = { -0.377f, -0.451f, -0.464f, -0.673f, 0.231f, -0.712f, -0.457f, -0.588f, 0.373f, -0.754f, -0.468f, 0.433f };
+ int ldb = 3;
+ float B_expected[] = { 0.643625f, 0.521931f, 0.428222f, -0.038989f, -0.231f, 0.712f, 0.003417f, 1.74795f, -0.642733f, 1.29802f, 0.468f, -0.433f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1737) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1737) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-1.0f, 0.0f};
+ float A[] = { 0.946f, -0.007f, 0.677f, -0.923f, 0.651f, -0.685f, 0.591f, 0.135f, 0.171f, 0.979f, -0.029f, -0.008f, -0.049f, 0.174f, 0.578f, 0.388f, 0.187f, -0.479f };
+ int lda = 3;
+ float B[] = { -0.607f, -0.907f, -0.156f, -0.141f, -0.254f, 0.364f, 0.209f, 0.955f, 0.93f, 0.962f, 0.494f, 0.079f };
+ int ldb = 2;
+ float B_expected[] = { 0.580571f, 0.853773f, 0.148563f, 0.132294f, 0.636082f, 0.804404f, 0.972367f, -0.263525f, -0.534225f, 0.214911f, 0.087341f, -0.390994f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1738) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1738) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-1.0f, 0.0f};
+ float A[] = { 0.203f, -0.791f, -0.415f, -0.56f, 0.782f, -0.691f, -0.441f, 0.545f, -0.09f, 0.595f, -0.438f, 0.952f, 0.88f, 0.944f, -0.55f, -0.762f, -0.035f, -0.949f };
+ int lda = 3;
+ float B[] = { -0.035f, 0.448f, 0.487f, -0.108f, -0.482f, -0.708f, -0.317f, 0.816f, -0.547f, 0.22f, -0.654f, 0.57f };
+ int ldb = 2;
+ float B_expected[] = { 0.035f, -0.448f, -0.487f, 0.108f, 0.710725f, 0.924643f, 0.472907f, -1.12904f, 1.27511f, -1.33788f, -0.672654f, -0.727442f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1739) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1739) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-1.0f, 0.0f};
+ float A[] = { -0.09f, 0.742f, 0.081f, 0.459f, -0.54f, 0.04f, 0.574f, -0.858f, 0.704f, 0.686f, -0.9f, -0.519f, 0.538f, -0.934f, 0.467f, 0.376f, 0.149f, 0.322f };
+ int lda = 3;
+ float B[] = { 0.307f, 0.294f, -0.428f, -0.7f, 0.496f, 0.167f, -0.611f, 0.904f, -0.846f, -0.411f, 0.29f, 0.004f };
+ int ldb = 2;
+ float B_expected[] = { -0.191025f, -0.630625f, 0.063267f, 0.452361f, -0.782713f, -1.2668f, 1.30921f, -0.06316f, -0.006288f, 0.333651f, -0.041922f, -0.093976f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1740) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1740) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-1.0f, 0.0f};
+ float A[] = { 0.434f, 0.691f, 0.983f, -0.481f, -0.156f, -0.117f, -0.231f, 0.526f, 0.935f, 0.417f, -0.142f, -0.541f, 0.529f, 0.014f, 0.266f, 0.086f, 0.666f, 0.033f };
+ int lda = 3;
+ float B[] = { 0.972f, -0.219f, -0.735f, -0.967f, 0.084f, -0.355f, -0.152f, -0.156f, 0.267f, 0.928f, 0.708f, -0.267f };
+ int ldb = 2;
+ float B_expected[] = { -0.950741f, 0.784376f, 1.10114f, 1.08842f, -0.548134f, 0.631223f, 0.396983f, 0.501114f, -0.267f, -0.928f, -0.708f, 0.267f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1741) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1741) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-0.3f, 0.1f};
+ float A[] = { -0.25f, -0.779f, -0.138f, -0.017f, -0.319f, -0.555f, 0.674f, -0.256f };
+ int lda = 2;
+ float B[] = { -0.651f, -0.525f, 0.409f, -0.932f, 0.359f, 0.321f, 0.419f, 0.027f, 0.67f, 0.328f, 0.446f, -0.615f };
+ int ldb = 3;
+ float B_expected[] = { 0.0100296f, -0.216136f, 0.257045f, -0.0571445f, -0.0121016f, 0.124004f, -0.110514f, 0.0386878f, -0.1561f, -0.0050383f, 0.028185f, 0.183634f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1742) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1742) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-0.3f, 0.1f};
+ float A[] = { 0.012f, 0.978f, 0.617f, -0.361f, -0.349f, 0.712f, 0.008f, 0.305f };
+ int lda = 2;
+ float B[] = { -0.771f, -0.335f, -0.565f, 0.866f, -0.516f, -0.869f, -0.097f, -0.711f, 0.308f, 0.207f, -0.459f, 0.766f };
+ int ldb = 3;
+ float B_expected[] = { 0.2648f, 0.0234f, 0.0829f, -0.3163f, 0.2417f, 0.2091f, 0.272029f, 0.122445f, -0.176135f, -0.256384f, 0.285714f, -0.233939f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1743) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1743) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-0.3f, 0.1f};
+ float A[] = { -0.063f, -0.605f, 0.473f, 0.763f, 0.548f, -0.167f, -0.825f, 0.011f };
+ int lda = 2;
+ float B[] = { -0.262f, 0.135f, -0.333f, -0.671f, 0.91f, 0.874f, 0.305f, -0.255f, 0.882f, 0.883f, 0.088f, -0.473f };
+ int ldb = 3;
+ float B_expected[] = { -0.0627538f, 0.0344746f, -0.131779f, -0.149516f, -0.0442507f, 0.307921f, 0.053273f, -0.089001f, 0.293086f, 0.141896f, -0.0189002f, -0.124098f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1744) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1744) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-0.3f, 0.1f};
+ float A[] = { -0.493f, -0.852f, -0.567f, 0.21f, 0.168f, 0.666f, -0.328f, 0.803f };
+ int lda = 2;
+ float B[] = { 0.24f, -0.578f, 0.293f, -0.233f, -0.348f, -0.853f, -0.145f, 0.192f, -0.785f, -0.72f, -0.508f, 0.023f };
+ int ldb = 3;
+ float B_expected[] = { 0.037901f, 0.201471f, -0.104515f, 0.327095f, 0.253345f, 0.311373f, 0.0243f, -0.0721f, 0.3075f, 0.1375f, 0.1501f, -0.0577f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1745) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1745) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-0.3f, 0.1f};
+ float A[] = { -0.089f, -0.135f, 0.987f, 0.936f, 0.353f, 0.638f, 0.845f, 0.343f };
+ int lda = 2;
+ float B[] = { 0.744f, 0.445f, 0.835f, 0.273f, 0.702f, 0.03f, -0.618f, 0.141f, -0.303f, -0.399f, 0.63f, -0.037f };
+ int ldb = 2;
+ float B_expected[] = { 0.0158468f, 0.0413994f, -0.292082f, -0.285588f, 0.0272724f, 0.0233892f, 0.0660084f, -0.143882f, 0.0004278f, -0.0256146f, -0.19286f, 0.114065f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1746) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1746) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-0.3f, 0.1f};
+ float A[] = { 0.187f, -0.741f, 0.287f, -0.599f, -0.293f, -0.297f, 0.778f, -0.056f };
+ int lda = 2;
+ float B[] = { -0.335f, -0.713f, 0.081f, -0.589f, -0.256f, -0.809f, -0.473f, 0.418f, 0.646f, -0.447f, -0.147f, 0.314f };
+ int ldb = 2;
+ float B_expected[] = { 0.1718f, 0.1804f, 0.0378414f, 0.0809182f, 0.1577f, 0.2171f, 0.118373f, -0.283147f, -0.1491f, 0.1987f, 0.1154f, -0.122836f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1747) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1747) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-0.3f, 0.1f};
+ float A[] = { -0.259f, -0.645f, -0.09f, 0.709f, 0.729f, -0.023f, -0.792f, 0.03f };
+ int lda = 2;
+ float B[] = { 0.904f, -0.402f, 0.753f, 0.104f, 0.38f, 0.944f, -0.715f, -0.378f, -0.16f, 0.254f, -0.68f, 0.183f };
+ int ldb = 2;
+ float B_expected[] = { 0.185924f, -0.0771597f, 0.185827f, -0.0420162f, -0.156592f, 0.373034f, -0.201079f, -0.0256158f, 0.0051007f, 0.152025f, -0.143387f, 0.102908f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1748) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1748) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-0.3f, 0.1f};
+ float A[] = { -0.938f, 0.25f, -0.509f, 0.377f, -0.063f, 0.166f, 0.227f, -0.24f };
+ int lda = 2;
+ float B[] = { 0.756f, -0.08f, -0.657f, -0.837f, -0.714f, 0.781f, 0.239f, -0.953f, 0.26f, 0.696f, -0.183f, 0.668f };
+ int ldb = 2;
+ float B_expected[] = { -0.431623f, 0.111093f, 0.2808f, 0.1854f, 0.007293f, -0.454491f, 0.0236f, 0.3098f, -0.059093f, -0.075968f, -0.0119f, -0.2187f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1749) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1749) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-0.3f, 0.1f};
+ float A[] = { 0.055f, -0.682f, 0.361f, 0.521f, -0.192f, -0.664f, -0.167f, 0.731f, -0.668f, 0.983f, 0.608f, 0.533f, -0.513f, -0.781f, 0.878f, 0.875f, 0.804f, -0.179f };
+ int lda = 3;
+ float B[] = { -0.038f, -0.787f, -0.209f, -0.686f, -0.073f, -0.662f, 0.938f, -0.301f, -0.871f, 0.699f, 0.561f, 0.823f };
+ int ldb = 3;
+ float B_expected[] = { 0.224558f, -0.0087435f, -0.317863f, 0.168822f, 0.105075f, 0.138035f, 0.256887f, 0.377119f, 0.113231f, 0.136832f, -0.235636f, -0.108546f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1750) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1750) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-0.3f, 0.1f};
+ float A[] = { -0.397f, -0.154f, -0.944f, -0.137f, 0.65f, -0.49f, -0.883f, 0.273f, -0.137f, 0.655f, 0.531f, 0.676f, 0.052f, 0.03f, -0.602f, 0.002f, 0.005f, 0.984f };
+ int lda = 3;
+ float B[] = { -0.446f, 0.091f, 0.793f, -0.221f, 0.386f, 0.354f, -0.063f, 0.105f, -0.128f, 0.189f, -0.079f, 0.749f };
+ int ldb = 3;
+ float B_expected[] = { 0.216958f, -0.149634f, -0.25039f, 0.0074932f, -0.1512f, -0.0676f, -0.166784f, -0.100965f, 0.14955f, -0.227622f, -0.0512f, -0.2326f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1751) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1751) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-0.3f, 0.1f};
+ float A[] = { -0.976f, -0.488f, -0.762f, -0.057f, 0.812f, 0.006f, 0.06f, -0.271f, 0.832f, -0.232f, 0.188f, -0.466f, -0.051f, -0.745f, 0.909f, -0.091f, -0.559f, 0.595f };
+ int lda = 3;
+ float B[] = { 0.644f, -0.584f, 0.456f, 0.443f, -0.909f, 0.43f, 0.771f, -0.075f, -0.408f, 0.303f, 0.03f, 0.529f };
+ int ldb = 3;
+ float B_expected[] = { 0.24849f, -0.168067f, -0.114085f, 0.0202884f, 0.0152508f, 0.284926f, 0.267034f, 0.0120048f, 0.0596364f, -0.0643158f, 0.284594f, 0.0837608f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1752) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1752) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-0.3f, 0.1f};
+ float A[] = { 0.924f, -0.247f, -0.131f, 0.932f, -0.415f, 0.454f, -0.539f, 0.693f, -0.725f, -0.601f, 0.565f, 0.002f, -0.118f, 0.626f, -0.968f, 0.874f, 0.156f, -0.227f };
+ int lda = 3;
+ float B[] = { 0.793f, -0.15f, -0.967f, 0.821f, 0.37f, -0.572f, -0.156f, 0.106f, -0.877f, -0.297f, 0.448f, -0.576f };
+ int ldb = 3;
+ float B_expected[] = { -0.2229f, 0.1243f, 0.242003f, -0.564467f, -0.0068716f, 0.568213f, 0.0362f, -0.0474f, 0.306136f, 0.0520352f, -0.336053f, 0.500406f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1753) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1753) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-0.3f, 0.1f};
+ float A[] = { 0.671f, 0.477f, 0.227f, 0.685f, -0.648f, 0.277f, -0.295f, -0.632f, 0.509f, -0.798f, 0.875f, 0.89f, -0.34f, -0.786f, -0.453f, 0.511f, -0.189f, 0.385f };
+ int lda = 3;
+ float B[] = { -0.895f, -0.148f, 0.934f, 0.229f, 0.958f, -0.55f, 0.49f, 0.586f, -0.871f, 0.618f, -0.0f, -0.543f };
+ int ldb = 2;
+ float B_expected[] = { 0.162976f, 0.110656f, -0.12507f, -0.0587256f, 0.138701f, 0.543589f, -0.313677f, 0.0534812f, 0.067207f, 0.12831f, -0.0729792f, -0.0098826f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1754) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1754) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-0.3f, 0.1f};
+ float A[] = { -0.438f, -0.618f, 0.524f, 0.525f, -0.268f, -0.502f, -0.685f, 0.28f, 0.508f, 0.664f, -0.492f, 0.772f, -0.997f, 0.693f, 0.63f, -0.328f, -0.521f, -0.869f };
+ int lda = 3;
+ float B[] = { 0.527f, 0.999f, -0.078f, 0.599f, 0.004f, -0.615f, -0.281f, -0.328f, 0.456f, -0.666f, 0.309f, -0.69f };
+ int ldb = 2;
+ float B_expected[] = { -0.45115f, -0.650085f, -0.277633f, -0.456478f, 0.0965652f, 0.362528f, 0.1802f, 0.227951f, -0.0702f, 0.2454f, -0.0237f, 0.2379f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1755) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1755) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-0.3f, 0.1f};
+ float A[] = { -0.454f, 0.517f, -0.794f, -0.181f, 0.292f, 0.954f, -0.93f, -0.128f, 0.123f, -0.997f, 0.325f, -0.317f, -0.988f, 0.732f, 0.637f, 0.457f, -0.665f, 0.529f };
+ int lda = 3;
+ float B[] = { -0.055f, 0.803f, -0.981f, -0.627f, 0.147f, -0.656f, -0.824f, -0.366f, -0.445f, -0.151f, 0.686f, -0.368f };
+ int ldb = 2;
+ float B_expected[] = { 0.156354f, 0.078881f, -0.208608f, 0.143709f, 0.219569f, 0.211768f, -0.204943f, -0.415655f, 0.191227f, 0.0071854f, 0.136999f, 0.0773624f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1756) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1756) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-0.3f, 0.1f};
+ float A[] = { 0.623f, -0.129f, -0.419f, -0.006f, 0.21f, -0.165f, 0.218f, 0.915f, 0.736f, 0.07f, 0.502f, -0.809f, 0.242f, -0.015f, 0.67f, -0.956f, 0.153f, 0.365f };
+ int lda = 3;
+ float B[] = { -0.927f, 0.383f, -0.471f, 0.443f, -0.731f, -0.949f, -0.142f, -0.65f, 0.159f, -0.624f, -0.822f, 0.107f };
+ int ldb = 2;
+ float B_expected[] = { 0.2398f, -0.2076f, 0.097f, -0.18f, 0.212478f, 0.297146f, 0.065877f, 0.255638f, 0.359717f, -0.0280276f, 0.426852f, -0.164392f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1757) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1757) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int trans = 113;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-0.3f, 0.1f};
+ float A[] = { -0.628f, -0.771f, 0.827f, -0.979f, 0.395f, -0.166f, 0.88f, 0.958f };
+ int lda = 2;
+ float B[] = { 0.297f, 0.49f, 0.425f, -0.386f, 0.672f, 0.992f, -0.077f, 0.761f, 0.393f, -0.605f, -0.273f, 0.725f };
+ int ldb = 3;
+ float B_expected[] = { 0.177165f, -0.0328107f, -0.0662201f, -0.167954f, 0.366541f, -0.0872256f, -0.2721f, -0.389113f, -0.0674816f, 0.293174f, -0.249446f, -0.709453f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1758) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1758) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int trans = 113;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-0.3f, 0.1f};
+ float A[] = { -0.876f, 0.752f, -0.148f, 0.972f, -0.508f, -0.752f, -0.861f, 0.074f };
+ int lda = 2;
+ float B[] = { 0.878f, -0.987f, -0.896f, 0.519f, -0.355f, -0.117f, 0.329f, 0.068f, -0.644f, 0.344f, -0.187f, -0.343f };
+ int ldb = 3;
+ float B_expected[] = { -0.1647f, 0.3839f, 0.2169f, -0.2453f, 0.1182f, -0.0004f, 0.292026f, 0.115771f, -0.111733f, -0.342122f, 0.0725176f, -0.0306312f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1759) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1759) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int trans = 113;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-0.3f, 0.1f};
+ float A[] = { 0.072f, -0.966f, 0.648f, 0.43f, -0.623f, -0.221f, -0.622f, 0.977f };
+ int lda = 2;
+ float B[] = { 0.0f, 0.028f, 0.857f, -0.171f, -0.933f, 0.159f, 0.315f, -0.297f, -0.864f, 0.519f, -0.601f, -0.119f };
+ int ldb = 3;
+ float B_expected[] = { 0.0216306f, -0.0927642f, -0.225266f, -0.0253344f, 0.0408658f, 0.302549f, 0.158132f, -0.0117036f, -0.365472f, -0.0519459f, -0.143387f, -0.172603f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1760) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1760) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int trans = 113;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-0.3f, 0.1f};
+ float A[] = { -0.903f, -0.972f, -0.812f, 0.605f, 0.085f, -0.025f, -0.443f, 0.518f };
+ int lda = 2;
+ float B[] = { -0.725f, -0.451f, 0.779f, 0.969f, 0.25f, 0.021f, 0.029f, -0.382f, 0.022f, 0.957f, 0.704f, 0.832f };
+ int ldb = 3;
+ float B_expected[] = { 0.26217f, 0.073525f, -0.332173f, -0.239574f, -0.097644f, -0.003892f, 0.0295f, 0.1175f, -0.1023f, -0.2849f, -0.2944f, -0.1792f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1761) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1761) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int trans = 113;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-0.3f, 0.1f};
+ float A[] = { -0.322f, -0.981f, 0.193f, -0.604f, 0.87f, -0.384f, 0.463f, -0.502f };
+ int lda = 2;
+ float B[] = { -0.447f, 0.21f, 0.928f, -0.496f, 0.889f, -0.354f, -0.258f, -0.149f, 0.98f, -0.958f, 0.106f, -0.579f };
+ int ldb = 2;
+ float B_expected[] = { 0.0692355f, 0.14563f, -0.0874638f, -0.0532654f, -0.116915f, -0.289728f, -0.242902f, 0.136003f, -0.314257f, -0.318533f, -0.400862f, 0.357622f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1762) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1762) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int trans = 113;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-0.3f, 0.1f};
+ float A[] = { -0.924f, -0.553f, 0.985f, -0.793f, 0.406f, 0.741f, -0.956f, 0.945f };
+ int lda = 2;
+ float B[] = { 0.736f, -0.81f, 0.028f, 0.474f, 0.14f, -0.03f, -0.756f, 0.923f, -0.515f, 0.532f, -0.321f, 0.326f };
+ int ldb = 2;
+ float B_expected[] = { -0.1398f, 0.3166f, 0.122042f, 0.0927314f, -0.039f, 0.023f, 0.135709f, -0.314263f, 0.1013f, -0.2111f, -0.0515973f, -0.29067f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1763) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1763) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int trans = 113;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-0.3f, 0.1f};
+ float A[] = { 0.04f, -0.41f, -0.643f, 0.988f, 0.86f, -0.281f, -0.017f, 0.389f };
+ int lda = 2;
+ float B[] = { 0.204f, 0.524f, -0.558f, -0.736f, 0.26f, -0.202f, -0.757f, 0.346f, 0.917f, 0.541f, -0.108f, -0.965f };
+ int ldb = 2;
+ float B_expected[] = { 0.059601f, -0.396251f, 0.060088f, -0.096554f, -0.338942f, -0.0950055f, -0.073098f, -0.071831f, 0.208251f, -0.444353f, 0.106223f, -0.05488f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1764) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1764) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int trans = 113;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-0.3f, 0.1f};
+ float A[] = { 0.375f, 0.153f, -0.343f, -0.742f, 0.563f, 0.473f, 0.451f, -0.433f };
+ int lda = 2;
+ float B[] = { -0.804f, -0.016f, -0.715f, -0.902f, -0.89f, 0.155f, -0.408f, 0.419f, 0.078f, -0.691f, -0.717f, -0.637f };
+ int ldb = 2;
+ float B_expected[] = { -0.0094443f, 0.0821961f, 0.3047f, 0.1991f, 0.347432f, -0.0186595f, 0.0805f, -0.1665f, -0.138523f, 0.381015f, 0.2788f, 0.1194f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1765) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1765) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int trans = 113;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-0.3f, 0.1f};
+ float A[] = { -0.867f, -0.597f, -0.577f, 0.735f, 0.827f, -0.104f, -0.861f, -0.802f, -0.288f, 0.293f, 0.593f, 0.228f, -0.469f, 0.942f, 0.193f, 0.591f, 0.241f, 0.382f };
+ int lda = 3;
+ float B[] = { -0.812f, -0.874f, -0.18f, -0.81f, 0.023f, 0.352f, 0.559f, 0.237f, -0.835f, 0.037f, -0.762f, 0.782f };
+ int ldb = 3;
+ float B_expected[] = { -0.331628f, -0.278177f, -0.0214727f, -0.156013f, -0.0496067f, -0.0088131f, 0.119788f, -0.469291f, -0.0804714f, -0.263663f, -0.0824792f, -0.132356f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1766) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1766) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int trans = 113;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-0.3f, 0.1f};
+ float A[] = { -0.258f, -0.812f, -0.858f, -0.107f, -0.151f, 0.785f, 0.717f, 0.992f, -0.649f, -0.242f, -0.454f, 0.916f, 0.86f, 0.834f, -0.244f, 0.391f, 0.818f, -0.714f };
+ int lda = 3;
+ float B[] = { 0.163f, 0.441f, 0.54f, 0.679f, 0.071f, -0.76f, 0.345f, -0.956f, 0.654f, -0.217f, -0.892f, 0.106f };
+ int ldb = 3;
+ float B_expected[] = { 0.296566f, -0.0905963f, -0.0393822f, -0.306541f, 0.0547f, 0.2351f, -0.0059345f, 0.0071855f, -0.402014f, -0.049978f, 0.257f, -0.121f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1767) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1767) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int trans = 113;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-0.3f, 0.1f};
+ float A[] = { 0.525f, 0.182f, 0.851f, -0.348f, -0.046f, 0.839f, -0.045f, -0.149f, -0.992f, 0.588f, -0.01f, -0.409f, 0.527f, 0.263f, -0.509f, -0.026f, 0.284f, 0.507f };
+ int lda = 3;
+ float B[] = { 0.909f, 0.216f, 0.38f, 0.198f, -0.412f, -0.102f, -0.456f, 0.079f, 0.504f, -0.782f, -0.88f, 0.079f };
+ int ldb = 3;
+ float B_expected[] = { -0.149757f, 0.0672651f, 0.129501f, 0.054878f, -0.0469462f, 0.0277224f, 0.0550599f, -0.0598423f, 0.244521f, -0.217471f, 0.0955519f, -0.37895f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1768) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1768) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int trans = 113;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-0.3f, 0.1f};
+ float A[] = { 0.893f, -0.758f, 0.145f, 0.623f, -0.018f, -0.733f, -0.144f, -0.192f, 0.53f, 0.773f, -0.771f, 0.36f, 0.932f, -0.771f, 0.997f, -0.671f, 0.574f, -0.771f };
+ int lda = 3;
+ float B[] = { 0.592f, 0.985f, -0.62f, -0.095f, -0.344f, -0.607f, 0.759f, 0.085f, -0.609f, 0.068f, -0.084f, -0.575f };
+ int ldb = 3;
+ float B_expected[] = { -0.2761f, -0.2363f, 0.280628f, -0.052484f, 0.306154f, -0.187624f, -0.2362f, 0.0504f, 0.200236f, -0.133908f, 0.0536278f, 0.0659354f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1769) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1769) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int trans = 113;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-0.3f, 0.1f};
+ float A[] = { 0.503f, -0.057f, -0.581f, -0.77f, -0.907f, -0.843f, 0.56f, -0.554f, 0.054f, 0.988f, 0.868f, -0.627f, 0.645f, -0.246f, -0.958f, 0.66f, 0.956f, 0.99f };
+ int lda = 3;
+ float B[] = { 0.282f, -0.442f, 0.564f, -0.691f, -0.743f, 0.113f, -0.395f, 0.312f, -0.167f, -0.568f, 0.508f, 0.912f };
+ int ldb = 2;
+ float B_expected[] = { 0.180092f, 0.260648f, -0.045069f, -0.102868f, -0.0964434f, -0.432702f, -0.0404678f, 0.280779f, 0.254359f, 0.0411062f, -0.453454f, 0.0281672f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1770) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1770) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int trans = 113;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-0.3f, 0.1f};
+ float A[] = { -0.851f, 0.296f, -0.683f, -0.53f, 0.38f, -0.837f, 0.977f, 0.189f, -0.624f, -0.664f, 0.73f, -0.882f, 0.105f, -0.868f, 0.362f, -0.006f, -0.435f, 0.757f };
+ int lda = 3;
+ float B[] = { -0.259f, -0.091f, 0.606f, -0.983f, -0.238f, 0.057f, 0.358f, 0.18f, -0.71f, 0.058f, 0.511f, 0.717f };
+ int ldb = 2;
+ float B_expected[] = { 0.241746f, 0.119591f, -0.0907286f, 0.148899f, 0.141237f, -0.0716576f, -0.205866f, -0.078918f, 0.2072f, -0.0884f, -0.225f, -0.164f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1771) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1771) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int trans = 113;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-0.3f, 0.1f};
+ float A[] = { 0.956f, 0.972f, 0.771f, 0.187f, 0.948f, 0.303f, -0.854f, 0.123f, 0.704f, 0.152f, 0.347f, 0.595f, -0.865f, 0.75f, -0.041f, -0.572f, 0.749f, 0.216f };
+ int lda = 3;
+ float B[] = { -0.821f, -0.098f, 0.347f, -0.639f, 0.314f, -0.009f, -0.725f, 0.45f, 0.536f, 0.801f, 0.431f, 0.936f };
+ int ldb = 2;
+ float B_expected[] = { 0.193607f, -0.29931f, 0.18163f, 0.255513f, 0.127098f, -0.0503344f, 0.101243f, 0.0097718f, -0.0060322f, -0.148016f, -0.251411f, -0.0777231f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1772) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1772) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int trans = 113;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {-0.3f, 0.1f};
+ float A[] = { 0.78f, -0.205f, 0.073f, -0.859f, 0.568f, -0.599f, -0.947f, -0.514f, 0.835f, 0.176f, 0.27f, -0.617f, 0.171f, -0.074f, 0.939f, -0.469f, -0.471f, 0.25f };
+ int lda = 3;
+ float B[] = { -0.279f, 0.16f, -0.495f, 0.658f, 0.071f, 0.557f, -0.116f, 0.095f, -0.104f, 0.503f, -0.775f, -0.03f };
+ int ldb = 2;
+ float B_expected[] = { 0.0677f, -0.0759f, 0.0827f, -0.2469f, -0.0068598f, -0.107386f, 0.243424f, 0.0129156f, 0.142748f, -0.254568f, 0.461939f, -0.154419f };
+ cblas_ctrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrmm(case 1773) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrmm(case 1773) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0};
+ double A[] = { 0.463, 0.033, -0.929, 0.949, 0.864, 0.986, 0.393, 0.885 };
+ int lda = 2;
+ double B[] = { -0.321, -0.852, -0.337, -0.175, 0.607, -0.613, 0.688, 0.973, -0.331, -0.35, 0.719, -0.553 };
+ int ldb = 3;
+ double B_expected[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1774) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1774) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0};
+ double A[] = { 0.608, -0.393, 0.921, 0.282, -0.857, -0.286, -0.31, -0.057 };
+ int lda = 2;
+ double B[] = { -0.548, 0.728, 0.391, -0.506, 0.186, 0.97, -0.435, 0.375, -0.995, -0.496, 0.99, 0.186 };
+ int ldb = 3;
+ double B_expected[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1775) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1775) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0};
+ double A[] = { 0.253, 0.969, 0.654, -0.016, -0.774, -0.11, -0.101, -0.287 };
+ int lda = 2;
+ double B[] = { -0.34, -0.268, -0.52, 0.021, -0.875, 0.98, 0.255, 0.564, -0.478, -0.818, -0.043, 0.224 };
+ int ldb = 3;
+ double B_expected[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1776) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1776) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0};
+ double A[] = { -0.64, -0.222, 0.922, 0.417, -0.724, 0.012, 0.418, 0.39 };
+ int lda = 2;
+ double B[] = { 0.619, -0.024, -0.068, 0.219, 0.374, -0.937, 0.79, 0.166, -0.92, 0.753, -0.017, 0.076 };
+ int ldb = 3;
+ double B_expected[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1777) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1777) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0};
+ double A[] = { 0.57, 0.987, 0.116, -0.691, -0.603, -0.778, 0.14, -0.073 };
+ int lda = 2;
+ double B[] = { 0.421, -0.055, 0.92, 0.664, 0.835, 0.861, -0.392, -0.897, -0.346, 0.516, -0.068, -0.156 };
+ int ldb = 2;
+ double B_expected[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1778) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1778) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0};
+ double A[] = { -0.754, 0.904, 0.089, 0.206, 0.974, -0.946, -0.55, -0.675 };
+ int lda = 2;
+ double B[] = { -0.42, -0.372, 0.628, 0.148, 0.344, -0.924, -0.802, -0.307, 0.427, 0.116, 0.916, -0.384 };
+ int ldb = 2;
+ double B_expected[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1779) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1779) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0};
+ double A[] = { 0.152, -0.898, -0.024, 0.719, 0.992, -0.841, 0.901, 0.202 };
+ int lda = 2;
+ double B[] = { 0.243, -0.811, 0.68, 0.118, 0.946, -0.632, 0.729, -0.942, 0.308, 0.507, -0.838, 0.594 };
+ int ldb = 2;
+ double B_expected[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1780) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1780) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0};
+ double A[] = { 0.119, -0.849, 0.425, -0.273, -0.918, 0.196, -0.871, -0.39 };
+ int lda = 2;
+ double B[] = { 0.709, 0.33, -0.207, 0.012, -0.017, 0.787, -0.385, 0.739, -0.874, 0.188, -0.039, 0.692 };
+ int ldb = 2;
+ double B_expected[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1781) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1781) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0};
+ double A[] = { 0.837, -0.603, 0.755, -0.92, 0.892, -0.009, -0.741, 0.271, -0.325, -0.861, 0.902, -0.088, 0.091, 0.256, 0.209, -0.724, 0.28, -0.604 };
+ int lda = 3;
+ double B[] = { 0.455, -0.215, -0.668, 0.917, -0.985, 0.477, 0.564, -0.524, -0.202, -0.53, -0.88, -0.688 };
+ int ldb = 3;
+ double B_expected[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1782) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1782) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0};
+ double A[] = { -0.991, 0.253, 0.813, 0.497, -0.268, 0.623, 0.82, -0.946, -0.883, 0.333, -0.265, -0.371, 0.131, -0.812, -0.365, 0.45, 0.929, -0.704 };
+ int lda = 3;
+ double B[] = { 0.783, -0.756, 0.635, 0.56, 0.434, -0.831, -0.34, -0.531, -0.277, 0.874, 0.986, 0.157 };
+ int ldb = 3;
+ double B_expected[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1783) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1783) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0};
+ double A[] = { 0.265, -0.592, -0.721, -0.838, -0.952, 0.115, -0.34, -0.789, -0.265, -0.779, -0.676, 0.048, 0.78, -0.272, -0.651, 0.272, 0.8, -0.693 };
+ int lda = 3;
+ double B[] = { -0.609, 0.028, -0.818, 0.289, -0.41, -0.25, -0.917, 0.463, 0.942, 0.692, -0.516, 0.378 };
+ int ldb = 3;
+ double B_expected[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1784) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1784) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0};
+ double A[] = { 0.962, 0.945, -0.58, -0.358, -0.769, 0.751, -0.068, -0.321, 0.938, 0.183, -0.17, 0.251, -0.248, -0.092, -0.818, 0.928, -0.059, -0.222 };
+ int lda = 3;
+ double B[] = { 0.015, -0.852, -0.565, 0.16, -0.095, 0.073, 0.405, 0.509, 0.082, -0.478, -0.365, 0.824 };
+ int ldb = 3;
+ double B_expected[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1785) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1785) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0};
+ double A[] = { 0.616, 0.669, 0.323, -0.238, 0.153, 0.891, -0.4, 0.996, 0.689, -0.736, -0.259, -0.707, 0.993, 0.13, -0.829, -0.564, -0.09, 0.118 };
+ int lda = 3;
+ double B[] = { 0.113, 0.724, 0.148, -0.309, -0.833, -0.791, 0.354, -0.528, 0.313, 0.421, 0.28, 0.371 };
+ int ldb = 2;
+ double B_expected[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1786) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1786) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0};
+ double A[] = { 0.957, -0.713, 0.976, 0.183, -0.145, -0.858, -0.497, -0.605, -0.742, 0.686, 0.272, 0.83, -0.606, -0.099, -0.807, 0.767, 0.254, 0.244 };
+ int lda = 3;
+ double B[] = { -0.124, -0.19, 0.665, -0.74, 0.505, -0.194, 0.588, -0.421, -0.727, 0.308, -0.802, -0.278 };
+ int ldb = 2;
+ double B_expected[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1787) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1787) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0};
+ double A[] = { -0.649, 0.856, 0.969, 0.382, 0.963, 0.567, 0.599, 0.018, -0.924, 0.578, -0.531, -0.091, -0.454, -0.834, 0.97, -0.126, -0.859, 0.879 };
+ int lda = 3;
+ double B[] = { 0.35, 0.824, -0.084, 0.662, -0.752, 0.872, 0.129, 0.969, -0.539, 0.907, 0.316, -0.675 };
+ int ldb = 2;
+ double B_expected[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1788) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1788) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0};
+ double A[] = { -0.315, -0.459, 0.327, -0.132, -0.283, 0.173, -0.356, -0.427, 0.508, 0.347, -0.804, -0.849, 0.779, 0.673, 0.019, -0.869, 0.999, -0.338 };
+ int lda = 3;
+ double B[] = { 0.678, -0.171, 0.136, -0.268, -0.578, -0.431, 0.978, -0.749, 0.333, -0.757, 0.658, 0.456 };
+ int ldb = 2;
+ double B_expected[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1789) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1789) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0.1};
+ double A[] = { -0.532, -0.877, 0.308, -0.807, 0.013, 0.891, 0.077, -0.004 };
+ int lda = 2;
+ double B[] = { 0.634, -0.969, 0.228, -0.097, 0.419, 0.903, 0.21, 0.313, -0.819, -0.028, 0.574, -0.762 };
+ int ldb = 3;
+ double B_expected[] = { 0.004051, -0.1187101, 0.0148352, -0.0206365, 0.0847859, 0.0569023, 0.0786829, -0.0569289, 0.0212752, -0.007123, 0.0120979, 0.0898923 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1790) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1790) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0.1};
+ double A[] = { -0.77, -0.037, -0.021, -0.831, -0.663, -0.241, -0.273, -0.023 };
+ int lda = 2;
+ double B[] = { 0.354, -0.95, -0.944, -0.497, 0.741, 0.084, -0.3, 0.023, -0.056, 0.063, -0.117, -0.498 };
+ int ldb = 3;
+ double B_expected[] = { 0.095, 0.0354, 0.0497, -0.0944, -0.0084, 0.0741, 0.0251224, -0.1096884, -0.0857901, -0.0449183, 0.1115535, -0.0062757 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1791) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1791) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0.1};
+ double A[] = { -0.623, 0.379, 0.903, -0.378, -0.088, 0.24, -0.964, 0.558 };
+ int lda = 2;
+ double B[] = { -0.137, 0.706, 0.457, 0.399, -0.69, -0.7, 0.34, 0.479, 0.539, -0.133, 0.876, -0.347 };
+ int ldb = 3;
+ double B_expected[] = { 0.0452313, -0.0327103, -0.006569, -0.0451444, -0.0415366, 0.0701362, 0.0272036, -0.0595042, -0.0428974, -0.0445382, -0.0823316, -0.0650838 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1792) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1792) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0.1};
+ double A[] = { 0.253, 0.657, 0.636, 0.827, -0.107, 0.353, 0.425, -0.365 };
+ int lda = 2;
+ double B[] = { -0.402, -0.409, 0.421, -0.333, -0.771, -0.099, 0.697, -0.812, -0.653, 0.823, 0.994, 0.998 };
+ int ldb = 3;
+ double B_expected[] = { 0.0076075, -0.0189943, 0.065157, 0.0200352, -0.0145096, -0.1229652, 0.0812, 0.0697, -0.0823, -0.0653, -0.0998, 0.0994 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1793) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1793) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0.1};
+ double A[] = { -0.57, -0.805, -0.66, -0.421, 0.643, -0.534, -0.988, -0.581 };
+ int lda = 2;
+ double B[] = { -0.279, -0.253, 0.976, -0.051, 0.294, 0.451, 0.187, -0.177, 0.31, -0.714, -0.104, -0.177 };
+ int ldb = 2;
+ double B_expected[] = { -0.0368805, -0.0044635, 0.0530361, -0.1308418, 0.049374, 0.0195475, -0.0199226, 0.0142283, -0.015743, -0.075147, 0.0389342, -0.0182031 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1794) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1794) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0.1};
+ double A[] = { -0.594, 0.273, 0.457, 0.295, 0.434, -0.227, -0.662, 0.623 };
+ int lda = 2;
+ double B[] = { -0.582, -0.581, 0.259, -0.833, -0.864, -0.284, 0.965, -0.459, -0.539, -0.551, -0.969, 0.09 };
+ int ldb = 2;
+ double B_expected[] = { 0.0581, -0.0582, 0.095304, -0.0125475, 0.0284, -0.0864, 0.0386128, 0.0525556, 0.0551, -0.0539, 0.0026781, -0.1328003 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1795) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1795) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0.1};
+ double A[] = { 0.398, 0.323, 0.31, 0.718, 0.181, 0.665, 0.402, 0.317 };
+ int lda = 2;
+ double B[] = { 0.812, -0.244, -0.415, 0.602, 0.901, -0.017, 0.786, -0.119, 0.448, -0.75, 0.851, 0.172 };
+ int ldb = 2;
+ double B_expected[] = { -0.0053814, -0.0158898, -0.0110449, -0.0357664, -0.0811715, 0.0693191, -0.0201324, 0.0353695, -0.0510542, 0.0560868, -0.0338911, 0.0287578 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1796) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1796) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0.1};
+ double A[] = { 0.265, -0.578, 0.218, -0.093, -0.172, 0.414, 0.448, 0.696 };
+ int lda = 2;
+ double B[] = { 0.02, -0.254, 0.152, 0.304, 0.289, 0.247, 0.705, 0.419, -0.735, 0.788, -0.942, -0.71 };
+ int ldb = 2;
+ double B_expected[] = { 0.0201864, 0.0081408, -0.0304, 0.0152, -0.0272777, 0.0481657, -0.0419, 0.0705, -0.0720826, -0.1006386, 0.071, -0.0942 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1797) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1797) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0.1};
+ double A[] = { 0.971, 0.532, 0.175, 0.455, 0.191, 0.493, 0.882, -0.944, 0.358, 0.142, -0.065, 0.632, -0.319, -0.101, 0.578, 0.476, -0.773, 0.912 };
+ int lda = 3;
+ double B[] = { 0.018, -0.131, 0.964, -0.467, -0.729, -0.794, 0.874, 0.361, 0.744, -0.958, 0.162, 0.555 };
+ int ldb = 3;
+ double B_expected[] = { 0.0271781, 0.0720558, 0.0439416, 0.0960619, 0.0051086, 0.1287645, -0.117224, 0.0980019, 0.0171007, 0.0041098, 0.0281271, -0.0631386 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1798) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1798) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0.1};
+ double A[] = { -0.506, -0.263, -0.994, 0.681, 0.889, -0.5, -0.912, 0.741, -0.329, -0.912, 0.332, -0.001, -0.484, 0.942, -0.728, -0.104, -0.216, 0.679 };
+ int lda = 3;
+ double B[] = { 0.562, -0.354, 0.742, -0.177, -0.627, -0.762, 0.476, 0.758, 0.675, -0.504, -0.33, 0.186 };
+ int ldb = 3;
+ double B_expected[] = { 0.0036678, -0.0993414, 0.0429357, 0.0533074, 0.0762, -0.0627, -0.2049005, -0.0052096, 0.0441918, 0.0565626, -0.0186, -0.033 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1799) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1799) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0.1};
+ double A[] = { -0.341, -0.27, 0.001, 0.939, 0.714, 0.803, -0.508, -0.331, -0.563, -0.725, -0.902, -0.793, 0.461, 0.127, -0.597, -0.498, 0.394, -0.019 };
+ int lda = 3;
+ double B[] = { 0.015, 0.803, 0.497, 0.667, 0.803, 0.775, 0.026, 0.908, 0.535, -0.111, 0.379, -0.036 };
+ int ldb = 3;
+ double B_expected[] = { 0.0277873, 0.0211695, 0.1148735, 0.0461937, -0.0016476, 0.0271498, 0.0316648, 0.0236294, 0.0795252, -0.009434, -0.0200342, -0.0329361 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1800) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1800) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0.1};
+ double A[] = { 0.132, 0.903, -0.235, -0.294, -0.09, 0.74, -0.707, -0.855, 0.632, 0.543, -0.558, -0.416, -0.99, -0.088, -0.189, -0.371, -0.844, -0.737 };
+ int lda = 3;
+ double B[] = { -0.257, 0.159, 0.689, 0.785, 0.398, -0.128, -0.098, -0.735, -0.307, 0.032, 0.517, 0.049 };
+ int ldb = 3;
+ double B_expected[] = { -0.0159, -0.0257, -0.0892322, 0.1006644, 0.0666778, 0.0827436, 0.0735, -0.0098, -0.0635435, -0.0866139, -0.0893123, 0.0619235 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1801) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1801) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0.1};
+ double A[] = { 0.993, 0.709, 0.225, -0.704, -0.396, 0.656, -0.588, -0.085, -0.024, 0.264, -0.988, -0.67, 0.665, -0.165, -0.778, -0.43, 0.71, -0.35 };
+ int lda = 3;
+ double B[] = { 0.321, 0.614, 0.058, 0.983, 0.153, -0.647, 0.342, -0.518, -0.071, -0.533, -0.424, 0.283 };
+ int ldb = 2;
+ double B_expected[] = { -0.0861992, -0.0396692, -0.155091, -0.1119744, -0.0501124, -0.0006816, -0.0064866, 0.0580106, 0.035358, -0.023696, -0.034933, -0.020199 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1802) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1802) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0.1};
+ double A[] = { 0.034, -0.02, -0.401, -0.892, 0.329, -0.799, -0.018, 0.564, 0.095, 0.965, -0.105, 0.756, -0.583, -0.706, -0.436, -0.145, 0.921, 0.416 };
+ int lda = 3;
+ double B[] = { 0.972, 0.157, -0.029, 0.674, 0.914, 0.434, 0.132, -0.116, -0.907, 0.316, -0.423, 0.321 };
+ int ldb = 2;
+ double B_expected[] = { -0.1120798, 0.1462649, -0.0862031, 0.0507283, -0.0427739, 0.1355272, 0.0194621, 0.0362973, -0.0316, -0.0907, -0.0321, -0.0423 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1803) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1803) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0.1};
+ double A[] = { -0.195, -0.36, 0.834, -0.505, -0.87, -0.787, 0.997, 0.965, -0.046, -0.591, 0.082, 0.552, 0.414, -0.013, -0.048, -0.766, 0.728, 0.088 };
+ int lda = 3;
+ double B[] = { -0.916, -0.162, -0.863, 0.67, -0.079, -0.27, -0.191, 0.995, 0.981, -0.25, -0.149, 0.248 };
+ int ldb = 2;
+ double B_expected[] = { -0.036135, 0.01203, -0.018003, 0.0409485, -0.0386581, -0.100169, -0.1061706, 0.0215439, -0.0700412, 0.1548156, -0.0239871, 0.0582902 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1804) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1804) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0.1};
+ double A[] = { 0.553, -0.63, -0.079, 0.351, 0.865, -0.062, 0.165, -0.634, -0.513, 0.216, -0.521, 0.349, 0.54, 0.545, -0.719, -0.306, 0.501, 0.757 };
+ int lda = 3;
+ double B[] = { -0.311, 0.088, -0.328, 0.977, 0.659, -0.06, -0.276, 0.872, -0.734, -0.01, -0.668, -0.327 };
+ int ldb = 2;
+ double B_expected[] = { -0.0088, -0.0311, -0.0977, -0.0328, 0.0176113, 0.0652681, -0.0679689, -0.0593015, -0.0346653, -0.1319958, 0.0012195, -0.1051678 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1805) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1805) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int trans = 113;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 1};
+ double A[] = { 0.993, -0.018, 0.162, -0.222, 0.188, 0.672, -0.675, -0.345 };
+ int lda = 2;
+ double B[] = { 0.476, -0.009, 0.725, -0.925, -0.245, 0.308, 0.515, 0.1, -0.072, -0.757, 0.212, 0.571 };
+ int ldb = 3;
+ double B_expected[] = { 0.000369, 0.47283, 0.905475, 0.736575, -0.301434, -0.248829, -0.214389, -0.303015, -0.497235, 0.632565, 0.316779, -0.448161 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1806) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1806) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int trans = 113;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 1};
+ double A[] = { -0.78, 0.346, -0.663, -0.86, -0.496, -0.154, 0.356, 0.228 };
+ int lda = 2;
+ double B[] = { 0.578, 0.492, 0.775, 0.353, 0.198, -0.519, -0.52, -0.677, -0.438, 0.313, 0.941, -0.56 };
+ int ldb = 3;
+ double B_expected[] = { -0.492, 0.578, -0.353, 0.775, 0.519, 0.198, 0.506116, -1.326334, -0.745461, -1.255405, 0.045623, 1.256066 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1807) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1807) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int trans = 113;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 1};
+ double A[] = { 0.455, 0.442, 0.062, 0.815, 0.03, 0.55, 0.592, -0.487 };
+ int lda = 2;
+ double B[] = { -0.451, 0.01, 0.174, -0.775, 0.22, -0.644, 0.858, -0.004, 0.59, -0.395, -0.943, 0.824 };
+ int ldb = 3;
+ double B_expected[] = { 0.268128, -0.177245, 0.765883, -0.46293, -0.15311, 0.240362, -0.415478, 0.509884, -0.05349, 0.541645, -0.028567, -0.959544 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1808) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1808) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int trans = 113;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 1};
+ double A[] = { -0.268, -0.886, -0.805, 0.875, 0.481, 0.095, -0.057, 0.605 };
+ int lda = 2;
+ double B[] = { 0.708, -0.638, 0.408, -0.512, 0.175, 0.181, -0.919, -0.126, 0.708, -0.51, 0.212, 0.114 };
+ int ldb = 3;
+ double B_expected[] = { 0.611301, 0.253991, 0.82457, 0.700098, -0.215694, 0.287802, 0.126, -0.919, 0.51, 0.708, -0.114, 0.212 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1809) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1809) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int trans = 113;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 1};
+ double A[] = { 0.881, 0.555, 0.774, 0.148, -0.915, 0.336, 0.103, 0.381 };
+ int lda = 2;
+ double B[] = { 0.163, 0.963, -0.017, 0.921, 0.809, 0.846, 0.905, -0.43, 0.894, -0.371, -0.988, -0.487 };
+ int ldb = 2;
+ double B_expected[] = { -0.757938, 0.678068, 0.834573, 0.523573, -0.296331, 1.182259, 1.435009, -0.526594, 0.823021, 0.581709, -0.365348, -1.229977 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1810) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1810) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int trans = 113;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 1};
+ double A[] = { 0.719, -0.513, 0.169, -0.524, 0.352, 0.823, -0.741, -0.355 };
+ int lda = 2;
+ double B[] = { 0.717, 0.052, -0.777, 0.277, -0.962, 0.894, 0.905, -0.216, -0.707, 0.016, 0.481, 0.935 };
+ int ldb = 2;
+ double B_expected[] = { -0.052, 0.717, 0.294787, -0.48182, -0.894, -0.962, -0.890414, 1.302138, -0.016, -0.707, -1.522493, 0.245304 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1811) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1811) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int trans = 113;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 1};
+ double A[] = { 0.501, -0.136, -0.502, 0.669, -0.498, -0.4, -0.518, 0.833 };
+ int lda = 2;
+ double B[] = { -0.385, 0.88, 0.726, 0.911, 0.839, 0.573, -0.881, -0.517, -0.861, -0.278, 0.941, 0.822 };
+ int ldb = 2;
+ double B_expected[] = { 0.554496, -0.067558, 1.076656, 0.382795, -1.2501, 0.4388, -1.001679, 0.025697, 1.298547, -0.316017, 1.209649, 0.197288 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1812) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1812) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int trans = 113;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 1};
+ double A[] = { 0.049, 0.641, -0.9, 0.246, -0.734, -0.686, 0.76, -0.869 };
+ int lda = 2;
+ double B[] = { -0.37, 0.206, -0.731, -0.573, 0.638, -0.417, -0.29, -0.719, 0.107, -0.333, 0.556, 0.124 };
+ int ldb = 2;
+ double B_expected[] = { -0.901526, 0.146942, 0.573, -0.731, -0.30144, 0.722126, 0.719, -0.29, 0.581376, -0.362896, -0.124, 0.556 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1813) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1813) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int trans = 113;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 1};
+ double A[] = { 0.553, 0.338, 0.229, -0.828, -0.594, -0.036, -0.335, -0.249, 0.083, -0.197, 0.995, 0.85, -0.988, 0.596, -0.254, 0.179, 0.441, -0.859 };
+ int lda = 3;
+ double B[] = { -0.058, -0.225, 0.884, 0.348, 0.123, -0.151, 0.891, 0.711, -0.792, 0.552, 0.033, -0.178 };
+ int ldb = 3;
+ double B_expected[] = { -0.800945, -0.261458, 0.051763, -0.001149, -0.039066, 0.183952, 0.330423, 0.081423, 0.315368, -0.292945, 0.050151, 0.167455 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1814) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1814) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int trans = 113;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 1};
+ double A[] = { -0.257, -0.565, -0.123, 0.129, 0.817, -0.516, -0.613, -0.42, -0.494, 0.122, -0.593, -0.972, -0.695, -0.968, 0.848, -0.2, -0.17, 0.436 };
+ int lda = 3;
+ double B[] = { -0.274, 0.105, -0.899, -0.33, -0.318, -0.096, -0.237, 0.327, 0.046, 0.584, -0.459, -0.182 };
+ int ldb = 3;
+ double B_expected[] = { -0.019041, -0.416263, 0.582168, -0.617114, 0.096, -0.318, 0.136304, -0.448413, -0.245778, 0.495091, 0.182, -0.459 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1815) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1815) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int trans = 113;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 1};
+ double A[] = { -0.127, 0.025, 0.036, 0.612, 0.773, 0.953, 0.074, -0.006, 0.373, 0.292, -0.052, -0.319, -0.878, -0.401, 0.486, -0.493, -0.316, 0.003 };
+ int lda = 3;
+ double B[] = { 0.794, -0.666, -0.406, 0.622, -0.512, -0.761, 0.161, -0.137, -0.626, 0.408, 0.536, 0.66 };
+ int ldb = 3;
+ double B_expected[] = { -0.064732, -0.117488, -0.306038, 0.092938, -1.247288, -0.774519, -0.013374, -0.023872, -0.325804, -0.101626, 0.135651, -0.759197 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1816) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1816) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int trans = 113;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 1};
+ double A[] = { -0.724, -0.423, 0.028, 0.043, 0.812, -0.568, 0.294, -0.375, -0.85, -0.119, -0.338, -0.415, 0.976, 0.507, 0.913, 0.697, 0.323, 0.206 };
+ int lda = 3;
+ double B[] = { 0.427, 0.621, -0.212, -0.942, -0.08, 0.416, 0.465, -0.972, -0.529, -0.252, -0.19, 0.073 };
+ int ldb = 3;
+ double B_expected[] = { -0.621, 0.427, 0.599301, -0.319337, -0.093325, -0.198531, 0.972, 0.465, 0.363393, -0.02779, 0.97279, -0.887585 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1817) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1817) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int trans = 113;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 1};
+ double A[] = { 0.501, -0.632, 0.663, 0.151, -0.523, -0.71, -0.811, 0.8, -0.06, 0.994, -0.962, 0.827, -0.543, 0.719, -0.264, -0.942, 0.365, 0.051 };
+ int lda = 3;
+ double B[] = { -0.974, 0.094, -0.533, 0.633, -0.982, -0.383, -0.297, 0.734, -0.092, -0.15, 0.215, -0.232 };
+ int ldb = 2;
+ double B_expected[] = { -0.675337, -0.115274, 0.406006, -0.122575, -0.952024, -0.156194, -0.514956, 0.9092, 0.050058, -0.04123, 0.095645, 0.066643 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1818) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1818) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int trans = 113;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 1};
+ double A[] = { 0.669, 0.332, -0.661, 0.611, 0.279, -0.133, -0.033, 0.06, 0.788, -0.407, -0.644, 0.958, 0.247, -0.161, 0.125, -0.184, 0.041, -0.045 };
+ int lda = 3;
+ double B[] = { -0.603, 0.88, 0.668, -0.152, 0.082, 0.033, 0.733, -0.557, 0.722, 0.024, -0.754, 0.458 };
+ int ldb = 2;
+ double B_expected[] = { -0.996161, -0.429256, 0.185867, 0.350415, -0.168848, 0.167834, 0.638486, 0.554478, -0.024, 0.722, -0.458, -0.754 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1819) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1819) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int trans = 113;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 1};
+ double A[] = { -0.91, 0.05, -0.944, 0.748, -0.712, 0.619, -0.28, -0.906, 0.314, 0.943, -0.719, -0.983, 0.474, -0.115, -0.859, 0.837, 0.364, -0.164 };
+ int lda = 3;
+ double B[] = { -0.278, -0.34, 0.584, 0.43, -0.794, -0.465, -0.65, 0.461, 0.24, 0.003, 0.948, -0.778 };
+ int ldb = 2;
+ double B_expected[] = { -0.3233, 0.23598, 0.4205, -0.50994, -1.131636, -0.679699, 0.085048, 0.000967, -0.008447, 1.102325, 1.765785, 0.337213 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1820) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1820) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int trans = 113;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 1};
+ double A[] = { -0.39, -0.916, 0.257, -0.082, -0.802, 0.215, -0.155, 0.911, -0.099, 0.41, 0.057, 0.105, 0.94, -0.17, -0.714, -0.861, 0.292, -0.231 };
+ int lda = 3;
+ double B[] = { -0.453, -0.542, 0.135, 0.518, -0.199, 0.776, 0.784, -0.28, -0.499, -0.377, -0.795, -0.965 };
+ int ldb = 2;
+ double B_expected[] = { 0.542, -0.453, -0.518, 0.135, -0.59956, -0.270977, 0.135804, 0.776219, -0.220206, -0.182087, 1.507741, -0.776612 };
+ cblas_ztrmm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrmm(case 1821) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrmm(case 1821) imag");
+ };
+ };
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_trmv.c b/gsl-1.9/cblas/test_trmv.c
new file mode 100644
index 0000000..312df89
--- /dev/null
+++ b/gsl-1.9/cblas/test_trmv.c
@@ -0,0 +1,1739 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_trmv (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.987f };
+ float X[] = { -0.138f };
+ int incX = -1;
+ float x_expected[] = { -0.136206f };
+ cblas_strmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "strmv(case 814)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.987f };
+ float X[] = { -0.138f };
+ int incX = -1;
+ float x_expected[] = { -0.138f };
+ cblas_strmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "strmv(case 815)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.987f };
+ float X[] = { -0.138f };
+ int incX = -1;
+ float x_expected[] = { -0.136206f };
+ cblas_strmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "strmv(case 816)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.987f };
+ float X[] = { -0.138f };
+ int incX = -1;
+ float x_expected[] = { -0.138f };
+ cblas_strmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "strmv(case 817)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.987f };
+ float X[] = { -0.138f };
+ int incX = -1;
+ float x_expected[] = { -0.136206f };
+ cblas_strmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "strmv(case 818)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.987f };
+ float X[] = { -0.138f };
+ int incX = -1;
+ float x_expected[] = { -0.138f };
+ cblas_strmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "strmv(case 819)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.987f };
+ float X[] = { -0.138f };
+ int incX = -1;
+ float x_expected[] = { -0.136206f };
+ cblas_strmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "strmv(case 820)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.987f };
+ float X[] = { -0.138f };
+ int incX = -1;
+ float x_expected[] = { -0.138f };
+ cblas_strmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "strmv(case 821)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ float A[] = { -0.329f };
+ float X[] = { 0.463f };
+ int incX = -1;
+ float x_expected[] = { -0.152327f };
+ cblas_strmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "strmv(case 822)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ float A[] = { -0.329f };
+ float X[] = { 0.463f };
+ int incX = -1;
+ float x_expected[] = { 0.463f };
+ cblas_strmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "strmv(case 823)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ float A[] = { -0.329f };
+ float X[] = { 0.463f };
+ int incX = -1;
+ float x_expected[] = { -0.152327f };
+ cblas_strmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "strmv(case 824)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ float A[] = { -0.329f };
+ float X[] = { 0.463f };
+ int incX = -1;
+ float x_expected[] = { 0.463f };
+ cblas_strmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "strmv(case 825)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ float A[] = { -0.329f };
+ float X[] = { 0.463f };
+ int incX = -1;
+ float x_expected[] = { -0.152327f };
+ cblas_strmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "strmv(case 826)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ float A[] = { -0.329f };
+ float X[] = { 0.463f };
+ int incX = -1;
+ float x_expected[] = { 0.463f };
+ cblas_strmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "strmv(case 827)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ float A[] = { -0.329f };
+ float X[] = { 0.463f };
+ int incX = -1;
+ float x_expected[] = { -0.152327f };
+ cblas_strmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "strmv(case 828)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ float A[] = { -0.329f };
+ float X[] = { 0.463f };
+ int incX = -1;
+ float x_expected[] = { 0.463f };
+ cblas_strmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "strmv(case 829)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ double A[] = { -0.429 };
+ double X[] = { -0.899 };
+ int incX = -1;
+ double x_expected[] = { 0.385671 };
+ cblas_dtrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtrmv(case 830)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ double A[] = { -0.429 };
+ double X[] = { -0.899 };
+ int incX = -1;
+ double x_expected[] = { -0.899 };
+ cblas_dtrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtrmv(case 831)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ double A[] = { -0.429 };
+ double X[] = { -0.899 };
+ int incX = -1;
+ double x_expected[] = { 0.385671 };
+ cblas_dtrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtrmv(case 832)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ double A[] = { -0.429 };
+ double X[] = { -0.899 };
+ int incX = -1;
+ double x_expected[] = { -0.899 };
+ cblas_dtrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtrmv(case 833)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ double A[] = { -0.429 };
+ double X[] = { -0.899 };
+ int incX = -1;
+ double x_expected[] = { 0.385671 };
+ cblas_dtrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtrmv(case 834)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ double A[] = { -0.429 };
+ double X[] = { -0.899 };
+ int incX = -1;
+ double x_expected[] = { -0.899 };
+ cblas_dtrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtrmv(case 835)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ double A[] = { -0.429 };
+ double X[] = { -0.899 };
+ int incX = -1;
+ double x_expected[] = { 0.385671 };
+ cblas_dtrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtrmv(case 836)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ double A[] = { -0.429 };
+ double X[] = { -0.899 };
+ int incX = -1;
+ double x_expected[] = { -0.899 };
+ cblas_dtrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtrmv(case 837)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.842 };
+ double X[] = { 0.192 };
+ int incX = -1;
+ double x_expected[] = { 0.161664 };
+ cblas_dtrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtrmv(case 838)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.842 };
+ double X[] = { 0.192 };
+ int incX = -1;
+ double x_expected[] = { 0.192 };
+ cblas_dtrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtrmv(case 839)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.842 };
+ double X[] = { 0.192 };
+ int incX = -1;
+ double x_expected[] = { 0.161664 };
+ cblas_dtrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtrmv(case 840)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.842 };
+ double X[] = { 0.192 };
+ int incX = -1;
+ double x_expected[] = { 0.192 };
+ cblas_dtrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtrmv(case 841)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.842 };
+ double X[] = { 0.192 };
+ int incX = -1;
+ double x_expected[] = { 0.161664 };
+ cblas_dtrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtrmv(case 842)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.842 };
+ double X[] = { 0.192 };
+ int incX = -1;
+ double x_expected[] = { 0.192 };
+ cblas_dtrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtrmv(case 843)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.842 };
+ double X[] = { 0.192 };
+ int incX = -1;
+ double x_expected[] = { 0.161664 };
+ cblas_dtrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtrmv(case 844)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.842 };
+ double X[] = { 0.192 };
+ int incX = -1;
+ double x_expected[] = { 0.192 };
+ cblas_dtrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtrmv(case 845)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ float A[] = { -0.162f, -0.108f };
+ float X[] = { 0.542f, 0.461f };
+ int incX = -1;
+ float x_expected[] = { -0.038016f, -0.133218f };
+ cblas_ctrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrmv(case 846) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrmv(case 846) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ float A[] = { -0.162f, -0.108f };
+ float X[] = { 0.542f, 0.461f };
+ int incX = -1;
+ float x_expected[] = { 0.542f, 0.461f };
+ cblas_ctrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrmv(case 847) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrmv(case 847) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ float A[] = { -0.162f, -0.108f };
+ float X[] = { 0.542f, 0.461f };
+ int incX = -1;
+ float x_expected[] = { -0.038016f, -0.133218f };
+ cblas_ctrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrmv(case 848) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrmv(case 848) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ float A[] = { -0.162f, -0.108f };
+ float X[] = { 0.542f, 0.461f };
+ int incX = -1;
+ float x_expected[] = { 0.542f, 0.461f };
+ cblas_ctrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrmv(case 849) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrmv(case 849) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ float A[] = { -0.162f, -0.108f };
+ float X[] = { 0.542f, 0.461f };
+ int incX = -1;
+ float x_expected[] = { -0.038016f, -0.133218f };
+ cblas_ctrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrmv(case 850) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrmv(case 850) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ float A[] = { -0.162f, -0.108f };
+ float X[] = { 0.542f, 0.461f };
+ int incX = -1;
+ float x_expected[] = { 0.542f, 0.461f };
+ cblas_ctrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrmv(case 851) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrmv(case 851) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ float A[] = { -0.162f, -0.108f };
+ float X[] = { 0.542f, 0.461f };
+ int incX = -1;
+ float x_expected[] = { -0.038016f, -0.133218f };
+ cblas_ctrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrmv(case 852) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrmv(case 852) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ float A[] = { -0.162f, -0.108f };
+ float X[] = { 0.542f, 0.461f };
+ int incX = -1;
+ float x_expected[] = { 0.542f, 0.461f };
+ cblas_ctrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrmv(case 853) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrmv(case 853) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.547f, 0.583f };
+ float X[] = { -0.302f, 0.434f };
+ int incX = -1;
+ float x_expected[] = { -0.418216f, 0.061332f };
+ cblas_ctrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrmv(case 854) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrmv(case 854) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.547f, 0.583f };
+ float X[] = { -0.302f, 0.434f };
+ int incX = -1;
+ float x_expected[] = { -0.302f, 0.434f };
+ cblas_ctrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrmv(case 855) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrmv(case 855) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.547f, 0.583f };
+ float X[] = { -0.302f, 0.434f };
+ int incX = -1;
+ float x_expected[] = { -0.418216f, 0.061332f };
+ cblas_ctrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrmv(case 856) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrmv(case 856) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.547f, 0.583f };
+ float X[] = { -0.302f, 0.434f };
+ int incX = -1;
+ float x_expected[] = { -0.302f, 0.434f };
+ cblas_ctrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrmv(case 857) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrmv(case 857) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.547f, 0.583f };
+ float X[] = { -0.302f, 0.434f };
+ int incX = -1;
+ float x_expected[] = { -0.418216f, 0.061332f };
+ cblas_ctrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrmv(case 858) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrmv(case 858) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.547f, 0.583f };
+ float X[] = { -0.302f, 0.434f };
+ int incX = -1;
+ float x_expected[] = { -0.302f, 0.434f };
+ cblas_ctrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrmv(case 859) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrmv(case 859) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.547f, 0.583f };
+ float X[] = { -0.302f, 0.434f };
+ int incX = -1;
+ float x_expected[] = { -0.418216f, 0.061332f };
+ cblas_ctrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrmv(case 860) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrmv(case 860) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.547f, 0.583f };
+ float X[] = { -0.302f, 0.434f };
+ int incX = -1;
+ float x_expected[] = { -0.302f, 0.434f };
+ cblas_ctrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrmv(case 861) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrmv(case 861) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.216f, 0.192f };
+ float X[] = { -0.564f, -0.297f };
+ int incX = -1;
+ float x_expected[] = { -0.178848f, 0.044136f };
+ cblas_ctrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrmv(case 862) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrmv(case 862) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.216f, 0.192f };
+ float X[] = { -0.564f, -0.297f };
+ int incX = -1;
+ float x_expected[] = { -0.564f, -0.297f };
+ cblas_ctrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrmv(case 863) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrmv(case 863) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.216f, 0.192f };
+ float X[] = { -0.564f, -0.297f };
+ int incX = -1;
+ float x_expected[] = { -0.178848f, 0.044136f };
+ cblas_ctrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrmv(case 864) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrmv(case 864) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.216f, 0.192f };
+ float X[] = { -0.564f, -0.297f };
+ int incX = -1;
+ float x_expected[] = { -0.564f, -0.297f };
+ cblas_ctrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrmv(case 865) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrmv(case 865) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.216f, 0.192f };
+ float X[] = { -0.564f, -0.297f };
+ int incX = -1;
+ float x_expected[] = { -0.178848f, 0.044136f };
+ cblas_ctrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrmv(case 866) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrmv(case 866) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.216f, 0.192f };
+ float X[] = { -0.564f, -0.297f };
+ int incX = -1;
+ float x_expected[] = { -0.564f, -0.297f };
+ cblas_ctrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrmv(case 867) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrmv(case 867) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.216f, 0.192f };
+ float X[] = { -0.564f, -0.297f };
+ int incX = -1;
+ float x_expected[] = { -0.178848f, 0.044136f };
+ cblas_ctrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrmv(case 868) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrmv(case 868) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.216f, 0.192f };
+ float X[] = { -0.564f, -0.297f };
+ int incX = -1;
+ float x_expected[] = { -0.564f, -0.297f };
+ cblas_ctrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrmv(case 869) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrmv(case 869) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.693, -0.22 };
+ double X[] = { -0.101, 0.889 };
+ int incX = -1;
+ double x_expected[] = { 0.125587, 0.638297 };
+ cblas_ztrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrmv(case 870) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrmv(case 870) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.693, -0.22 };
+ double X[] = { -0.101, 0.889 };
+ int incX = -1;
+ double x_expected[] = { -0.101, 0.889 };
+ cblas_ztrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrmv(case 871) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrmv(case 871) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.693, -0.22 };
+ double X[] = { -0.101, 0.889 };
+ int incX = -1;
+ double x_expected[] = { 0.125587, 0.638297 };
+ cblas_ztrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrmv(case 872) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrmv(case 872) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.693, -0.22 };
+ double X[] = { -0.101, 0.889 };
+ int incX = -1;
+ double x_expected[] = { -0.101, 0.889 };
+ cblas_ztrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrmv(case 873) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrmv(case 873) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.693, -0.22 };
+ double X[] = { -0.101, 0.889 };
+ int incX = -1;
+ double x_expected[] = { 0.125587, 0.638297 };
+ cblas_ztrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrmv(case 874) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrmv(case 874) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.693, -0.22 };
+ double X[] = { -0.101, 0.889 };
+ int incX = -1;
+ double x_expected[] = { -0.101, 0.889 };
+ cblas_ztrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrmv(case 875) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrmv(case 875) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.693, -0.22 };
+ double X[] = { -0.101, 0.889 };
+ int incX = -1;
+ double x_expected[] = { 0.125587, 0.638297 };
+ cblas_ztrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrmv(case 876) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrmv(case 876) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.693, -0.22 };
+ double X[] = { -0.101, 0.889 };
+ int incX = -1;
+ double x_expected[] = { -0.101, 0.889 };
+ cblas_ztrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrmv(case 877) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrmv(case 877) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ double A[] = { -0.216, -0.623 };
+ double X[] = { 0.048, 0.293 };
+ int incX = -1;
+ double x_expected[] = { 0.172171, -0.093192 };
+ cblas_ztrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrmv(case 878) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrmv(case 878) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ double A[] = { -0.216, -0.623 };
+ double X[] = { 0.048, 0.293 };
+ int incX = -1;
+ double x_expected[] = { 0.048, 0.293 };
+ cblas_ztrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrmv(case 879) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrmv(case 879) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ double A[] = { -0.216, -0.623 };
+ double X[] = { 0.048, 0.293 };
+ int incX = -1;
+ double x_expected[] = { 0.172171, -0.093192 };
+ cblas_ztrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrmv(case 880) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrmv(case 880) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ double A[] = { -0.216, -0.623 };
+ double X[] = { 0.048, 0.293 };
+ int incX = -1;
+ double x_expected[] = { 0.048, 0.293 };
+ cblas_ztrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrmv(case 881) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrmv(case 881) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ double A[] = { -0.216, -0.623 };
+ double X[] = { 0.048, 0.293 };
+ int incX = -1;
+ double x_expected[] = { 0.172171, -0.093192 };
+ cblas_ztrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrmv(case 882) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrmv(case 882) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ double A[] = { -0.216, -0.623 };
+ double X[] = { 0.048, 0.293 };
+ int incX = -1;
+ double x_expected[] = { 0.048, 0.293 };
+ cblas_ztrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrmv(case 883) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrmv(case 883) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ double A[] = { -0.216, -0.623 };
+ double X[] = { 0.048, 0.293 };
+ int incX = -1;
+ double x_expected[] = { 0.172171, -0.093192 };
+ cblas_ztrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrmv(case 884) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrmv(case 884) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ double A[] = { -0.216, -0.623 };
+ double X[] = { 0.048, 0.293 };
+ int incX = -1;
+ double x_expected[] = { 0.048, 0.293 };
+ cblas_ztrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrmv(case 885) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrmv(case 885) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ double A[] = { -0.345, -0.851 };
+ double X[] = { -0.708, 0.298 };
+ int incX = -1;
+ double x_expected[] = { -0.009338, -0.705318 };
+ cblas_ztrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrmv(case 886) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrmv(case 886) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ double A[] = { -0.345, -0.851 };
+ double X[] = { -0.708, 0.298 };
+ int incX = -1;
+ double x_expected[] = { -0.708, 0.298 };
+ cblas_ztrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrmv(case 887) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrmv(case 887) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ double A[] = { -0.345, -0.851 };
+ double X[] = { -0.708, 0.298 };
+ int incX = -1;
+ double x_expected[] = { -0.009338, -0.705318 };
+ cblas_ztrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrmv(case 888) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrmv(case 888) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ double A[] = { -0.345, -0.851 };
+ double X[] = { -0.708, 0.298 };
+ int incX = -1;
+ double x_expected[] = { -0.708, 0.298 };
+ cblas_ztrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrmv(case 889) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrmv(case 889) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ double A[] = { -0.345, -0.851 };
+ double X[] = { -0.708, 0.298 };
+ int incX = -1;
+ double x_expected[] = { -0.009338, -0.705318 };
+ cblas_ztrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrmv(case 890) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrmv(case 890) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ double A[] = { -0.345, -0.851 };
+ double X[] = { -0.708, 0.298 };
+ int incX = -1;
+ double x_expected[] = { -0.708, 0.298 };
+ cblas_ztrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrmv(case 891) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrmv(case 891) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ double A[] = { -0.345, -0.851 };
+ double X[] = { -0.708, 0.298 };
+ int incX = -1;
+ double x_expected[] = { -0.009338, -0.705318 };
+ cblas_ztrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrmv(case 892) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrmv(case 892) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ double A[] = { -0.345, -0.851 };
+ double X[] = { -0.708, 0.298 };
+ int incX = -1;
+ double x_expected[] = { -0.708, 0.298 };
+ cblas_ztrmv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrmv(case 893) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrmv(case 893) imag");
+ };
+ };
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_trsm.c b/gsl-1.9/cblas/test_trsm.c
new file mode 100644
index 0000000..eef55b3
--- /dev/null
+++ b/gsl-1.9/cblas/test_trsm.c
@@ -0,0 +1,3947 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_trsm (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha = -0.3f;
+ float A[] = { -0.279f, 0.058f, 0.437f, 0.462f };
+ int lda = 2;
+ float B[] = { 0.578f, 0.473f, -0.34f, -0.128f, 0.503f, 0.2f };
+ int ldb = 3;
+ float B_expected[] = { 0.638784f, 0.440702f, -0.392589f, 0.0831169f, -0.326623f, -0.12987f };
+ cblas_strsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strsm(case 1822)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha = -0.3f;
+ float A[] = { -0.735f, -0.861f, 0.772f, -0.242f };
+ int lda = 2;
+ float B[] = { -0.793f, -0.162f, -0.844f, 0.143f, -0.379f, -0.46f };
+ int ldb = 3;
+ float B_expected[] = { 0.200963f, 0.146496f, 0.372018f, -0.0429f, 0.1137f, 0.138f };
+ cblas_strsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strsm(case 1823)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha = -0.3f;
+ float A[] = { -0.498f, 0.777f, -0.913f, 0.779f };
+ int lda = 2;
+ float B[] = { -0.831f, -0.663f, -0.098f, -0.894f, -0.059f, 0.468f };
+ int ldb = 3;
+ float B_expected[] = { -0.500602f, -0.399398f, -0.0590361f, -0.242426f, -0.445379f, -0.249422f };
+ cblas_strsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strsm(case 1824)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha = -0.3f;
+ float A[] = { -0.543f, 0.095f, -0.933f, -0.669f };
+ int lda = 2;
+ float B[] = { 0.068f, 0.715f, 0.012f, -0.785f, 0.378f, 0.251f };
+ int ldb = 3;
+ float B_expected[] = { -0.0204f, -0.2145f, -0.0036f, 0.216467f, -0.313528f, -0.0786588f };
+ cblas_strsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strsm(case 1825)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha = -0.3f;
+ float A[] = { 0.75f, 0.777f, -0.025f, 0.572f };
+ int lda = 2;
+ float B[] = { 0.03f, 0.392f, -0.056f, 0.399f, -0.489f, -0.167f };
+ int ldb = 2;
+ float B_expected[] = { -0.0188531f, -0.205594f, 0.0154245f, -0.209266f, 0.19852f, 0.0875874f };
+ cblas_strsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strsm(case 1826)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha = -0.3f;
+ float A[] = { 0.899f, -0.447f, 0.338f, -0.74f };
+ int lda = 2;
+ float B[] = { 0.964f, -0.104f, -0.199f, 0.503f, -0.386f, -0.764f };
+ int ldb = 2;
+ float B_expected[] = { -0.299746f, 0.0312f, 0.110704f, -0.1509f, 0.0383304f, 0.2292f };
+ cblas_strsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strsm(case 1827)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha = -0.3f;
+ float A[] = { 0.279f, 0.73f, -0.366f, 0.583f };
+ int lda = 2;
+ float B[] = { -0.572f, 0.75f, 0.603f, 0.697f, 0.908f, 0.119f };
+ int ldb = 2;
+ float B_expected[] = { 0.615054f, -1.15607f, -0.648387f, 0.453212f, -0.976344f, 1.16129f };
+ cblas_strsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strsm(case 1828)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha = -0.3f;
+ float A[] = { 0.581f, -0.911f, 0.438f, 0.731f };
+ int lda = 2;
+ float B[] = { 0.519f, 0.831f, 0.822f, 0.182f, 0.571f, -0.357f };
+ int ldb = 2;
+ float B_expected[] = { -0.1557f, -0.391143f, -0.2466f, -0.279253f, -0.1713f, -0.0489543f };
+ cblas_strsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strsm(case 1829)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha = -0.3f;
+ float A[] = { 0.065f, 0.099f, 0.48f, 0.746f, -0.739f, 0.695f, 0.197f, 0.621f, 0.063f };
+ int lda = 3;
+ float B[] = { 0.01f, -0.612f, 0.756f, -0.225f, 0.546f, 0.432f };
+ int ldb = 3;
+ float B_expected[] = { -0.0461538f, -0.254627f, -0.439373f, 1.03846f, 0.360768f, -13.9491f };
+ cblas_strsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strsm(case 1830)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha = -0.3f;
+ float A[] = { -0.86f, -0.653f, 0.87f, -0.037f, 0.788f, 0.015f, 0.028f, -0.804f, -0.357f };
+ int lda = 3;
+ float B[] = { -0.546f, 0.892f, -0.085f, -0.541f, -0.207f, 0.765f };
+ int ldb = 3;
+ float B_expected[] = { 0.1638f, -0.160639f, -0.114596f, 0.1623f, 0.168082f, -0.373222f };
+ cblas_strsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strsm(case 1831)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha = -0.3f;
+ float A[] = { 0.872f, -0.35f, 0.518f, -0.8f, -0.13f, -0.832f, 0.426f, 0.195f, -0.735f };
+ int lda = 3;
+ float B[] = { 0.773f, 0.069f, 0.45f, 0.189f, 0.504f, 0.996f };
+ int ldb = 3;
+ float B_expected[] = { 0.0431742f, 0.434741f, 0.183673f, 1.36286f, 1.77287f, 0.406531f };
+ cblas_strsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strsm(case 1832)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha = -0.3f;
+ float A[] = { -0.053f, -0.132f, -0.515f, -0.411f, 0.134f, 0.657f, 0.072f, -0.007f, -0.34f };
+ int lda = 3;
+ float B[] = { 0.494f, 0.072f, -0.882f, -0.112f, 0.904f, 0.755f };
+ int ldb = 3;
+ float B_expected[] = { -0.175368f, -0.0197478f, 0.2646f, -0.0622068f, -0.272786f, -0.2265f };
+ cblas_strsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strsm(case 1833)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha = -0.3f;
+ float A[] = { -0.154f, -0.54f, 0.146f, -0.106f, -0.478f, 0.938f, -0.731f, 0.25f, -0.4f };
+ int lda = 3;
+ float B[] = { -0.88f, -0.555f, 0.642f, 0.751f, -0.859f, -0.409f };
+ int ldb = 2;
+ float B_expected[] = { -1.71429f, -1.08117f, 0.783084f, 0.711096f, 2.97803f, 2.11352f };
+ cblas_strsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strsm(case 1834)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha = -0.3f;
+ float A[] = { 0.249f, -0.451f, -0.781f, 0.157f, -0.02f, 0.57f, 0.309f, -0.159f, 0.266f };
+ int lda = 3;
+ float B[] = { -0.546f, 0.839f, 0.392f, -0.445f, -0.818f, 0.953f };
+ int ldb = 2;
+ float B_expected[] = { 0.1638f, -0.2517f, -0.143317f, 0.173017f, 0.171998f, -0.180615f };
+ cblas_strsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strsm(case 1835)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha = -0.3f;
+ float A[] = { 0.299f, 0.626f, -0.471f, 0.208f, -0.842f, 0.674f, 0.03f, 0.628f, 0.534f };
+ int lda = 3;
+ float B[] = { 0.831f, -0.997f, -0.366f, 0.307f, -0.426f, 0.806f };
+ int ldb = 2;
+ float B_expected[] = { -0.584851f, 0.816906f, 0.0611706f, -0.25308f, 0.239326f, -0.452809f };
+ cblas_strsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strsm(case 1836)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha = -0.3f;
+ float A[] = { 0.301f, 0.168f, 0.934f, 0.107f, 0.068f, 0.384f, -0.201f, 0.116f, -0.436f };
+ int lda = 3;
+ float B[] = { 0.773f, -0.304f, -0.402f, 0.642f, -0.102f, -0.095f };
+ int ldb = 2;
+ float B_expected[] = { -0.278767f, 0.0987764f, 0.10885f, -0.203544f, 0.0306f, 0.0285f };
+ cblas_strsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strsm(case 1837)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha = 1.0f;
+ float A[] = { -0.616f, 0.304f, 0.403f, 0.739f };
+ int lda = 2;
+ float B[] = { 0.273f, -0.609f, 0.858f, 0.993f, -0.738f, -0.353f };
+ int ldb = 3;
+ float B_expected[] = { -0.443182f, 0.988636f, -1.39286f, 1.52602f, -1.40534f, 0.0953025f };
+ cblas_strsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strsm(case 1838)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha = 1.0f;
+ float A[] = { 0.811f, 0.257f, 0.98f, -0.956f };
+ int lda = 2;
+ float B[] = { 0.996f, 0.329f, 0.273f, -0.744f, 0.662f, -0.31f };
+ int ldb = 3;
+ float B_expected[] = { 0.996f, 0.329f, 0.273f, -0.999972f, 0.577447f, -0.380161f };
+ cblas_strsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strsm(case 1839)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha = 1.0f;
+ float A[] = { 0.845f, 0.064f, 0.29f, -0.291f };
+ int lda = 2;
+ float B[] = { 0.878f, 0.156f, 0.217f, 0.082f, -0.869f, 0.595f };
+ int ldb = 3;
+ float B_expected[] = { 1.13576f, -0.840253f, 0.958527f, -0.281787f, 2.98625f, -2.04467f };
+ cblas_strsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strsm(case 1840)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha = 1.0f;
+ float A[] = { 0.836f, 0.359f, -0.415f, 0.154f };
+ int lda = 2;
+ float B[] = { 0.652f, 0.614f, 0.922f, -0.063f, 0.313f, -0.316f };
+ int ldb = 3;
+ float B_expected[] = { 0.625855f, 0.743895f, 0.79086f, -0.063f, 0.313f, -0.316f };
+ cblas_strsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strsm(case 1841)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha = 1.0f;
+ float A[] = { 0.94f, -0.656f, 0.645f, -0.634f };
+ int lda = 2;
+ float B[] = { -0.948f, -0.596f, -0.799f, 0.133f, -0.843f, -0.179f };
+ int ldb = 2;
+ float B_expected[] = { -1.00851f, -0.0859454f, -0.85f, -1.07453f, -0.896809f, -0.630034f };
+ cblas_strsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strsm(case 1842)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha = 1.0f;
+ float A[] = { -0.332f, 0.705f, -0.792f, -0.033f };
+ int lda = 2;
+ float B[] = { 0.561f, 0.883f, -0.136f, 0.203f, -0.531f, 0.733f };
+ int ldb = 2;
+ float B_expected[] = { 0.561f, 1.32731f, -0.136f, 0.095288f, -0.531f, 0.312448f };
+ cblas_strsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strsm(case 1843)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha = 1.0f;
+ float A[] = { 0.991f, 0.614f, 0.108f, -0.125f };
+ int lda = 2;
+ float B[] = { -0.723f, 0.885f, 0.336f, 0.584f, 0.742f, -0.438f };
+ int ldb = 2;
+ float B_expected[] = { 3.65703f, -7.08f, 3.23371f, -4.672f, -1.42226f, 3.504f };
+ cblas_strsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strsm(case 1844)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha = 1.0f;
+ float A[] = { -0.626f, 0.912f, -0.003f, 0.761f };
+ int lda = 2;
+ float B[] = { 0.736f, -0.383f, 0.0f, -0.238f, 0.013f, 0.473f };
+ int ldb = 2;
+ float B_expected[] = { 1.0853f, -0.383f, 0.217056f, -0.238f, -0.418376f, 0.473f };
+ cblas_strsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strsm(case 1845)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha = 1.0f;
+ float A[] = { -0.416f, 0.599f, -0.705f, 0.326f, 0.184f, 0.079f, -0.173f, 0.125f, 0.567f };
+ int lda = 3;
+ float B[] = { 0.466f, 0.907f, -0.85f, -0.342f, -0.058f, -0.379f };
+ int ldb = 3;
+ float B_expected[] = { 9.44495f, 5.57299f, -1.49912f, 1.91427f, -0.0282283f, -0.66843f };
+ cblas_strsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strsm(case 1846)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha = 1.0f;
+ float A[] = { -0.75f, 0.856f, 0.773f, -0.241f, -0.357f, -0.683f, -0.718f, 0.69f, -0.486f };
+ int lda = 3;
+ float B[] = { -0.532f, -0.817f, 0.85f, -0.135f, 0.797f, 0.981f };
+ int ldb = 3;
+ float B_expected[] = { -0.986649f, -0.23645f, 0.85f, -2.14908f, 1.46702f, 0.981f };
+ cblas_strsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strsm(case 1847)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha = 1.0f;
+ float A[] = { 0.765f, -0.408f, 0.404f, 0.764f, 0.157f, -0.741f, 0.844f, 0.206f, -0.215f };
+ int lda = 3;
+ float B[] = { -0.859f, 0.563f, -0.61f, 0.2f, 0.816f, -0.692f };
+ int ldb = 3;
+ float B_expected[] = { -1.12288f, 9.05017f, 7.1006f, 0.261438f, 3.92523f, 8.00582f };
+ cblas_strsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strsm(case 1848)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha = 1.0f;
+ float A[] = { 0.354f, -0.931f, 0.18f, 0.391f, 0.01f, 0.429f, 0.685f, 0.332f, -0.643f };
+ int lda = 3;
+ float B[] = { -0.645f, 0.847f, 0.014f, 0.83f, 0.761f, 0.187f };
+ int ldb = 3;
+ float B_expected[] = { -0.645f, 1.09919f, 0.0908923f, 0.83f, 0.43647f, -0.526458f };
+ cblas_strsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strsm(case 1849)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha = 1.0f;
+ float A[] = { 0.569f, 0.85f, 0.642f, -0.051f, 0.724f, 0.201f, 0.87f, -0.638f, 0.008f };
+ int lda = 3;
+ float B[] = { -0.923f, 0.27f, -0.319f, -0.856f, -0.533f, 0.183f };
+ int ldb = 2;
+ float B_expected[] = { 94.9456f, -32.8005f, -59.1516f, 18.9755f, -66.625f, 22.875f };
+ cblas_strsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strsm(case 1850)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha = 1.0f;
+ float A[] = { 0.244f, 0.931f, 0.857f, -0.295f, 0.551f, 0.832f, 0.744f, -0.326f, 0.111f };
+ int lda = 3;
+ float B[] = { -0.478f, -0.252f, -0.155f, 0.419f, -0.192f, 0.291f };
+ int ldb = 2;
+ float B_expected[] = { -0.399342f, -0.316914f, -0.217592f, 0.513866f, -0.192f, 0.291f };
+ cblas_strsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strsm(case 1851)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha = 1.0f;
+ float A[] = { 0.36f, 0.356f, -0.858f, 0.879f, 0.641f, 0.989f, 0.998f, -0.005f, 0.64f };
+ int lda = 3;
+ float B[] = { -0.634f, -0.529f, -0.344f, 0.375f, -0.168f, 0.465f };
+ int ldb = 2;
+ float B_expected[] = { -1.76111f, -1.46944f, 0.441428f, 1.40113f, -3.30563f, -3.40859f };
+ cblas_strsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strsm(case 1852)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha = 1.0f;
+ float A[] = { 0.389f, 0.997f, 0.909f, -0.598f, -0.43f, -0.345f, -0.897f, 0.119f, -0.285f };
+ int lda = 3;
+ float B[] = { 0.779f, -0.129f, 0.016f, 0.599f, -0.668f, -0.638f };
+ int ldb = 2;
+ float B_expected[] = { 0.779f, -0.129f, -0.760663f, 0.727613f, -1.63854f, -0.269713f };
+ cblas_strsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], flteps, "strsm(case 1853)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha = -1;
+ double A[] = { -0.876, -0.503, -0.062, -0.987 };
+ int lda = 2;
+ double B[] = { 0.219, -0.986, -0.0, -0.605, 0.289, 0.641 };
+ int ldb = 3;
+ double B_expected[] = { 0.601967125138, -1.29370052694, -0.372910623494, -0.612968591692, 0.292806484296, 0.649442755826 };
+ cblas_dtrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrsm(case 1854)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha = -1;
+ double A[] = { -0.266, -0.505, -0.55, 0.524 };
+ int lda = 2;
+ double B[] = { 0.1, -0.105, 0.757, 0.522, -0.269, -0.142 };
+ int ldb = 3;
+ double B_expected[] = { -0.36361, 0.240845, -0.68529, -0.522, 0.269, 0.142 };
+ cblas_dtrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrsm(case 1855)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha = -1;
+ double A[] = { 0.101, 0.871, 0.202, 0.169 };
+ int lda = 2;
+ double B[] = { 0.018, 0.292, -0.573, 0.866, 0.749, 0.99 };
+ int ldb = 3;
+ double B_expected[] = { -0.178217821782, -2.89108910891, 5.67326732673, -4.91124260355, -0.976331360947, -12.6390532544 };
+ cblas_dtrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrsm(case 1856)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha = -1;
+ double A[] = { -0.387, -0.739, -0.599, 0.114 };
+ int lda = 2;
+ double B[] = { 0.7, 0.473, 0.86, -0.557, 0.283, 0.62 };
+ int ldb = 3;
+ double B_expected[] = { -0.7, -0.473, -0.86, 0.1377, -0.566327, -1.13514 };
+ cblas_dtrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrsm(case 1857)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha = -1;
+ double A[] = { -0.683, -0.009, -0.451, -0.185 };
+ int lda = 2;
+ double B[] = { 0.552, 0.083, -0.976, 0.22, -0.895, -0.301 };
+ int ldb = 2;
+ double B_expected[] = { 0.511946499941, 0.448648648649, -2.21423766373, 1.18918918919, -0.236033397966, -1.62702702703 };
+ cblas_dtrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrsm(case 1858)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha = -1;
+ double A[] = { -0.141, 0.944, 0.529, 0.636 };
+ int lda = 2;
+ double B[] = { 0.178, -0.22, -0.645, -0.585, -0.342, -0.594 };
+ int ldb = 2;
+ double B_expected[] = { -0.29438, 0.22, 0.335535, 0.585, 0.027774, 0.594 };
+ cblas_dtrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrsm(case 1859)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha = -1;
+ double A[] = { 0.541, 0.584, -0.394, 0.371 };
+ int lda = 2;
+ double B[] = { 0.668, 0.848, -0.816, -0.925, -0.145, 0.746 };
+ int ldb = 2;
+ double B_expected[] = { -1.23475046211, -0.342063962613, 1.50831792976, 0.118982018923, 0.268022181146, -2.43268181614 };
+ cblas_dtrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrsm(case 1860)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha = -1;
+ double A[] = { 0.836, -0.024, 0.226, 0.416 };
+ int lda = 2;
+ double B[] = { -0.172, -0.601, 0.542, 0.25, 0.746, 0.55 };
+ int ldb = 2;
+ double B_expected[] = { 0.172, 0.605128, -0.542, -0.263008, -0.746, -0.567904 };
+ cblas_dtrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrsm(case 1861)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha = -1;
+ double A[] = { 0.544, 0.721, 0.623, 0.392, -0.808, -0.022, -0.665, -0.616, -0.735 };
+ int lda = 3;
+ double B[] = { -0.526, -0.486, -0.716, 0.361, 0.365, -0.492 };
+ int ldb = 3;
+ double B_expected[] = { 0.966911764706, 0.261316067268, -0.162398536147, -0.663602941176, -0.140417971025, -1.22766726121 };
+ cblas_dtrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrsm(case 1862)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha = -1;
+ double A[] = { 0.907, 0.558, -0.233, 0.073, -0.734, -0.058, -0.115, 0.513, 0.503 };
+ int lda = 3;
+ double B[] = { -0.606, -0.124, 0.641, -0.074, -0.053, -0.734 };
+ int ldb = 3;
+ double B_expected[] = { 0.606, -0.214148, -0.512222584, 0.074, 0.011708, 0.751921064 };
+ cblas_dtrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrsm(case 1863)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha = -1;
+ double A[] = { 0.9, 0.063, -0.652, -0.841, 0.251, -0.8, 0.365, 0.809, 0.336 };
+ int lda = 3;
+ double B[] = { -0.584, -0.058, -0.964, -0.214, -0.632, -0.611 };
+ int ldb = 3;
+ double B_expected[] = { -8.93978245747, -9.01617340163, 2.86904761905, -3.62368367799, -3.34313934737, 1.81845238095 };
+ cblas_dtrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrsm(case 1864)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha = -1;
+ double A[] = { 0.934, -0.608, 0.49, 0.351, -0.301, 0.602, 0.873, 0.031, -0.2 };
+ int lda = 3;
+ double B[] = { -0.541, -0.729, -0.382, 0.741, 0.546, -0.833 };
+ int ldb = 3;
+ double B_expected[] = { -0.044208458, 0.717158, 0.382, -1.267499127, -0.571823, 0.833 };
+ cblas_dtrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrsm(case 1865)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha = -1;
+ double A[] = { -0.339, 0.049, 0.734, -0.182, 0.427, 0.193, -0.959, -0.679, 0.269 };
+ int lda = 3;
+ double B[] = { 0.824, 0.907, 0.632, -0.348, -0.646, 0.741 };
+ int ldb = 2;
+ double B_expected[] = { 2.43067846608, 2.67551622419, -0.444066789635, 1.95537225481, 9.9460940476, 11.7193971004 };
+ cblas_dtrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrsm(case 1866)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha = -1;
+ double A[] = { 0.766, -0.422, -0.518, 0.517, 0.669, 0.337, -0.579, 0.885, -0.677 };
+ int lda = 3;
+ double B[] = { 0.211, -0.911, -0.685, -0.777, -0.919, 0.282 };
+ int ldb = 2;
+ double B_expected[] = { -0.211, 0.911, 0.794087, 0.306013, 0.094064005, -0.025352505 };
+ cblas_dtrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrsm(case 1867)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha = -1;
+ double A[] = { -0.686, -0.256, 0.028, 0.371, 0.469, 0.115, 0.284, 0.139, 0.677 };
+ int lda = 3;
+ double B[] = { -0.877, -0.818, 0.191, 0.468, 0.889, -0.002 };
+ int ldb = 2;
+ double B_expected[] = { -1.30020532939, -0.819646768394, -0.0852626506631, -0.998592183627, -1.31314623338, 0.00295420974889 };
+ cblas_dtrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrsm(case 1868)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha = -1;
+ double A[] = { -0.819, -0.523, 0.042, 0.545, -0.292, 0.283, 0.224, 0.247, -0.325 };
+ int lda = 3;
+ double B[] = { 0.153, -0.272, -0.226, 0.987, -0.216, -0.218 };
+ int ldb = 2;
+ double B_expected[] = { -0.075843944, -0.285622962, 0.164872, -1.048694, 0.216, 0.218 };
+ cblas_dtrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrsm(case 1869)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha = -1;
+ double A[] = { 0.164, 0.486, 0.891, -0.508 };
+ int lda = 2;
+ double B[] = { 0.368, 0.761, -0.349, 0.324, 0.241, 0.561 };
+ int ldb = 3;
+ double B_expected[] = { -2.24390243902, -4.64024390244, 2.12804878049, -1.50893028615, -3.96487900903, 3.14021989629 };
+ cblas_dtrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrsm(case 1870)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha = -1;
+ double A[] = { -0.019, -0.382, -0.579, 0.76 };
+ int lda = 2;
+ double B[] = { -0.596, -0.074, 0.576, 0.861, -0.44, 0.842 };
+ int ldb = 3;
+ double B_expected[] = { 0.596, 0.074, -0.576, -0.633328, 0.468268, -1.062032 };
+ cblas_dtrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrsm(case 1871)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha = -1;
+ double A[] = { 0.449, -0.367, -0.268, 0.1 };
+ int lda = 2;
+ double B[] = { 0.58, -0.203, 0.053, 0.792, 0.355, -0.685 };
+ int ldb = 3;
+ double B_expected[] = { -6.01906458797, -1.66681514477, 3.9706013363, -7.92, -3.55, 6.85 };
+ cblas_dtrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrsm(case 1872)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha = -1;
+ double A[] = { 0.159, 0.333, 0.515, 0.715 };
+ int lda = 2;
+ double B[] = { -0.631, 0.472, 0.796, 0.278, 0.802, 0.298 };
+ int ldb = 3;
+ double B_expected[] = { 0.77417, -0.05897, -0.64253, -0.278, -0.802, -0.298 };
+ cblas_dtrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrsm(case 1873)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha = -1;
+ double A[] = { 0.056, -0.493, 0.619, -0.028 };
+ int lda = 2;
+ double B[] = { -0.32, -0.217, 0.301, 0.729, -0.847, -0.577 };
+ int ldb = 2;
+ double B_expected[] = { 5.71428571429, 118.576530612, -5.375, -92.7901785714, 15.125, 313.763392857 };
+ cblas_dtrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrsm(case 1874)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha = -1;
+ double A[] = { -0.595, 0.64, 0.109, 0.969 };
+ int lda = 2;
+ double B[] = { 0.186, -0.435, -0.747, 0.212, 0.257, 0.804 };
+ int ldb = 2;
+ double B_expected[] = { -0.186, 0.455274, 0.747, -0.293423, -0.257, -0.775987 };
+ cblas_dtrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrsm(case 1875)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha = -1;
+ double A[] = { 0.484, 0.769, 0.91, 0.817 };
+ int lda = 2;
+ double B[] = { -0.668, 0.544, 0.753, 0.796, -0.74, -0.091 };
+ int ldb = 2;
+ double B_expected[] = { 2.4380974539, -0.665850673195, -0.0077814418807, -0.97429620563, 1.35195534965, 0.111383108935 };
+ cblas_dtrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrsm(case 1876)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha = -1;
+ double A[] = { -0.725, 0.73, -0.095, 0.123 };
+ int lda = 2;
+ double B[] = { -0.26, 0.579, 0.393, -0.18, 0.358, 0.839 };
+ int ldb = 2;
+ double B_expected[] = { 0.68267, -0.579, -0.5244, 0.18, 0.25447, -0.839 };
+ cblas_dtrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrsm(case 1877)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha = -1;
+ double A[] = { -0.009, 0.237, -0.563, 0.993, 0.508, 0.771, 0.745, 0.233, 0.255 };
+ int lda = 3;
+ double B[] = { -0.328, -0.482, 0.083, -0.125, -0.712, -0.757 };
+ int ldb = 3;
+ double B_expected[] = { 21.9110553583, 1.44282075035, -0.325490196078, -281.330646047, -3.10396016674, 2.96862745098 };
+ cblas_dtrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrsm(case 1878)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha = -1;
+ double A[] = { -0.484, -0.131, 0.563, -0.095, 0.012, -0.988, -0.722, 0.738, 0.05 };
+ int lda = 3;
+ double B[] = { -0.069, -0.137, -0.45, -0.24, 0.221, -0.509 };
+ int ldb = 3;
+ double B_expected[] = { -0.1081604, 0.5816, 0.45, -0.009639148, 0.281892, 0.509 };
+ cblas_dtrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrsm(case 1879)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha = -1;
+ double A[] = { 0.521, 0.487, -0.961, 0.903, -0.045, 0.059, -0.61, -0.328, 0.883 };
+ int lda = 3;
+ double B[] = { -0.772, 0.079, -0.227, 0.998, 0.302, -0.099 };
+ int ldb = 3;
+ double B_expected[] = { 1.48176583493, 31.4896566432, 12.9778986844, -1.91554702495, -31.7275325229, -12.9967319963 };
+ cblas_dtrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrsm(case 1880)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha = -1;
+ double A[] = { 0.642, 0.511, 0.762, 0.804, -0.28, -0.318, 0.382, -0.165, -0.007 };
+ int lda = 3;
+ double B[] = { 0.987, 0.436, -0.783, 0.175, -0.973, -0.319 };
+ int ldb = 3;
+ double B_expected[] = { -0.987, 0.357548, 1.21902942, -0.175, 1.1137, 0.5696105 };
+ cblas_dtrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrsm(case 1881)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha = -1;
+ double A[] = { -0.995, 0.625, 0.16, -0.127, -0.722, -0.355, -0.14, -0.146, -0.756 };
+ int lda = 3;
+ double B[] = { 0.676, 0.038, 0.543, 0.296, -0.44, 0.751 };
+ int ldb = 2;
+ double B_expected[] = { 0.650272121575, -0.128270318012, 0.869769452872, 0.209093640534, -0.582010582011, 0.993386243386 };
+ cblas_dtrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrsm(case 1882)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha = -1;
+ double A[] = { -0.619, 0.548, 0.064, -0.483, -0.508, -0.819, 0.237, 0.852, -0.512 };
+ int lda = 3;
+ double B[] = { -0.169, 0.429, -0.789, 0.79, 0.479, 0.817 };
+ int ldb = 2;
+ double B_expected[] = { 0.860726164, -0.280732428, 1.197108, -0.093916, -0.479, -0.817 };
+ cblas_dtrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrsm(case 1883)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha = -1;
+ double A[] = { 0.794, -0.098, 0.442, -0.991, 0.049, 0.079, -0.8, -0.762, 0.395 };
+ int lda = 3;
+ double B[] = { 0.496, -0.734, -0.679, -0.697, 0.426, 0.094 };
+ int ldb = 2;
+ double B_expected[] = { -0.624685138539, 0.92443324937, 12.6077725801, 16.0733562947, -2.90102076605, -4.48707504683 };
+ cblas_dtrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrsm(case 1884)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha = -1;
+ double A[] = { 0.848, -0.765, 0.528, -0.693, 0.252, -0.135, -0.507, 0.954, -0.056 };
+ int lda = 3;
+ double B[] = { 0.791, -0.787, 0.636, 0.271, -0.905, -0.974 };
+ int ldb = 2;
+ double B_expected[] = { -0.791, 0.787, -1.241115, 0.331055, 1.155097475, 0.603156425 };
+ cblas_dtrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[i], B_expected[i], dbleps, "dtrsm(case 1885)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 0.0f};
+ float A[] = { 0.491f, -0.317f, -0.14f, -0.739f, -0.969f, -0.518f, 0.702f, -0.287f };
+ int lda = 2;
+ float B[] = { -0.962f, -0.38f, 0.656f, 0.587f, -0.195f, -0.862f, -0.679f, 0.598f, 0.919f, 0.714f, -0.513f, 0.726f };
+ int ldb = 3;
+ float B_expected[] = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1886) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1886) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 0.0f};
+ float A[] = { -0.6f, 0.338f, -0.048f, -0.926f, 0.236f, 0.362f, 0.605f, 0.562f };
+ int lda = 2;
+ float B[] = { -0.009f, 0.371f, -0.989f, 0.728f, -0.062f, 0.113f, 0.714f, 0.604f, -0.293f, 0.859f, -0.875f, 0.216f };
+ int ldb = 3;
+ float B_expected[] = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1887) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1887) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 0.0f};
+ float A[] = { -0.889f, -0.479f, -0.526f, 0.077f, -0.704f, 0.242f, 0.458f, -0.553f };
+ int lda = 2;
+ float B[] = { -0.554f, 0.966f, 0.076f, 0.42f, 0.85f, 0.369f, 0.124f, -0.476f, -0.007f, 0.428f, 0.452f, -0.214f };
+ int ldb = 3;
+ float B_expected[] = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1888) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1888) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 0.0f};
+ float A[] = { 0.947f, 0.444f, 0.079f, -0.597f, 0.978f, -0.64f, 0.82f, 0.808f };
+ int lda = 2;
+ float B[] = { -0.899f, -0.964f, -0.714f, 0.422f, -0.084f, -0.78f, -0.609f, -0.595f, 0.748f, -0.926f, 0.242f, -0.474f };
+ int ldb = 3;
+ float B_expected[] = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1889) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1889) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 0.0f};
+ float A[] = { -0.547f, -0.763f, -0.805f, 0.498f, 0.786f, -0.082f, 0.922f, 0.538f };
+ int lda = 2;
+ float B[] = { -0.074f, -0.617f, 0.359f, -0.383f, -0.172f, 0.911f, -0.934f, 0.066f, -0.67f, 0.895f, 0.92f, 0.255f };
+ int ldb = 2;
+ float B_expected[] = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1890) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1890) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 0.0f};
+ float A[] = { -0.096f, -0.362f, -0.311f, -0.347f, 0.161f, -0.517f, -0.393f, 0.572f };
+ int lda = 2;
+ float B[] = { 0.742f, -0.419f, -0.391f, 0.846f, -0.255f, -0.364f, 0.006f, -0.496f, 0.118f, -0.593f, 0.773f, 0.053f };
+ int ldb = 2;
+ float B_expected[] = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1891) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1891) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 0.0f};
+ float A[] = { 0.669f, 0.845f, 0.657f, -0.43f, 0.19f, 0.206f, -0.305f, 0.761f };
+ int lda = 2;
+ float B[] = { -0.457f, 0.857f, -0.203f, 0.942f, 0.462f, 0.52f, 0.521f, -0.609f, 0.069f, 0.005f, -0.419f, 0.806f };
+ int ldb = 2;
+ float B_expected[] = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1892) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1892) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 0.0f};
+ float A[] = { -0.269f, -0.87f, -0.592f, 0.813f, 0.977f, -0.848f, 0.282f, -0.311f };
+ int lda = 2;
+ float B[] = { -0.654f, 0.857f, -0.834f, 0.796f, 0.414f, -0.499f, 0.961f, 0.643f, 0.117f, 0.758f, -0.189f, -0.768f };
+ int ldb = 2;
+ float B_expected[] = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1893) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1893) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 0.0f};
+ float A[] = { 0.361f, -0.818f, 0.039f, 0.275f, 0.541f, -0.615f, 0.025f, -0.691f, -0.697f, 0.976f, 0.746f, 0.607f, 0.651f, -0.918f, -0.702f, 0.37f, -0.668f, -0.114f };
+ int lda = 3;
+ float B[] = { 0.218f, 0.75f, 0.575f, -0.702f, 0.7f, -0.41f, 0.374f, 0.489f, -0.876f, 0.842f, -0.848f, 0.901f };
+ int ldb = 3;
+ float B_expected[] = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1894) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1894) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 0.0f};
+ float A[] = { 0.483f, 0.088f, -0.192f, 0.17f, 0.683f, 0.293f, -0.773f, 0.365f, -0.28f, 0.257f, 0.818f, 0.45f, -0.551f, -0.051f, 0.899f, -0.127f, -0.915f, 0.152f };
+ int lda = 3;
+ float B[] = { 0.732f, -0.394f, 0.073f, -0.082f, 0.918f, -0.53f, 0.67f, 0.149f, -0.344f, -0.65f, -0.62f, -0.632f };
+ int ldb = 3;
+ float B_expected[] = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1895) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1895) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 0.0f};
+ float A[] = { 0.508f, -0.251f, 0.655f, -0.315f, -0.26f, 0.229f, 0.05f, -0.276f, -0.993f, 0.647f, -0.547f, -0.34f, 0.781f, -0.819f, 0.865f, 0.361f, -0.028f, 0.178f };
+ int lda = 3;
+ float B[] = { 0.972f, 0.048f, 0.71f, -0.168f, -0.274f, 0.92f, 0.789f, 0.485f, 0.578f, 0.73f, -0.931f, 0.288f };
+ int ldb = 3;
+ float B_expected[] = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1896) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1896) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 0.0f};
+ float A[] = { -0.874f, 0.651f, 0.074f, -0.862f, -0.42f, 0.066f, -0.845f, 0.482f, -0.44f, 0.724f, 0.137f, -0.123f, -0.63f, -0.011f, -0.187f, -0.205f, 0.976f, -0.81f };
+ int lda = 3;
+ float B[] = { 0.539f, 0.131f, 0.986f, 0.615f, 0.983f, -0.22f, 0.144f, 0.677f, 0.561f, -0.494f, -0.433f, -0.089f };
+ int ldb = 3;
+ float B_expected[] = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1897) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1897) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 0.0f};
+ float A[] = { 0.284f, 0.871f, -0.835f, 0.926f, 0.459f, -0.889f, 0.387f, 0.319f, -0.366f, 0.884f, 0.236f, 0.921f, 0.619f, -0.41f, -0.709f, -0.372f, 0.06f, 0.551f };
+ int lda = 3;
+ float B[] = { 0.354f, 0.245f, 0.552f, 0.77f, -0.524f, -0.973f, -0.814f, -0.835f, -0.976f, 0.396f, -0.726f, -0.204f };
+ int ldb = 2;
+ float B_expected[] = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1898) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1898) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 0.0f};
+ float A[] = { -0.98f, -0.854f, -0.832f, 0.514f, -0.028f, -0.857f, 0.066f, 0.415f, -0.316f, 0.538f, -0.465f, -0.691f, 0.286f, 0.954f, -0.486f, -0.574f, -0.429f, 0.992f };
+ int lda = 3;
+ float B[] = { 0.295f, 0.578f, -0.167f, 0.106f, -0.782f, 0.668f, 0.278f, 0.855f, 0.038f, 0.976f, 0.167f, -0.777f };
+ int ldb = 2;
+ float B_expected[] = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1899) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1899) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 0.0f};
+ float A[] = { 0.534f, 0.782f, 0.282f, 0.581f, 0.804f, -0.68f, 0.234f, -0.758f, 0.033f, -0.503f, 0.981f, -0.839f, 0.919f, 0.175f, 0.152f, -0.683f, -0.346f, -0.279f };
+ int lda = 3;
+ float B[] = { 0.135f, -0.969f, -0.314f, -0.026f, -0.284f, 0.529f, 0.781f, -0.413f, -0.018f, -0.859f, -0.817f, -0.849f };
+ int ldb = 2;
+ float B_expected[] = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1900) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1900) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 0.0f};
+ float A[] = { -0.426f, 0.148f, 0.889f, 0.217f, 0.779f, -0.963f, -0.516f, -0.366f, 0.721f, 0.4f, -0.976f, -0.365f, 0.532f, 0.188f, 0.176f, 0.082f, -0.691f, -0.833f };
+ int lda = 3;
+ float B[] = { -0.71f, 0.72f, 0.533f, 0.395f, -0.749f, 0.151f, 0.871f, 0.445f, 0.195f, -0.38f, -0.318f, -0.833f };
+ int ldb = 2;
+ float B_expected[] = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1901) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1901) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 1.0f};
+ float A[] = { -0.068f, 0.806f, -0.621f, 0.037f, 0.096f, -0.312f, 0.416f, 0.428f };
+ int lda = 2;
+ float B[] = { 0.481f, 0.192f, -0.954f, -0.958f, -0.015f, -0.203f, -0.352f, 0.08f, -0.662f, 0.681f, -0.571f, 0.146f };
+ int ldb = 3;
+ float B_expected[] = { 0.612512f, 0.186537f, -1.27483f, -1.08103f, -0.0395775f, -0.248522f, 0.0478574f, -0.671409f, -3.31165f, 0.315466f, -1.07961f, -0.629312f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1902) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1902) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 1.0f};
+ float A[] = { 0.863f, 0.689f, 0.171f, -0.164f, 0.065f, -0.727f, -0.245f, -0.556f };
+ int lda = 2;
+ float B[] = { 0.711f, -0.616f, -0.684f, 0.823f, 0.491f, 0.06f, -0.776f, 0.768f, 0.391f, 0.897f, 0.779f, -0.875f };
+ int ldb = 3;
+ float B_expected[] = { 0.616f, 0.711f, -0.823f, -0.684f, -0.06f, 0.491f, -0.98994f, -0.796557f, -0.644091f, 0.372992f, 0.804736f, 0.685199f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1903) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1903) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 1.0f};
+ float A[] = { 0.718f, -0.323f, 0.264f, 0.081f, -0.73f, 0.809f, -0.349f, -0.543f };
+ int lda = 2;
+ float B[] = { 0.862f, 0.676f, -0.085f, 0.204f, 0.063f, -0.124f, 0.162f, 0.754f, -0.978f, -0.097f, 0.986f, 0.943f };
+ int ldb = 3;
+ float B_expected[] = { -1.32203f, -1.00495f, 1.84655f, 0.329156f, -1.66053f, -2.19061f, 0.420449f, -1.11835f, 1.19333f, 0.945621f, -0.495118f, -2.05487f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1904) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1904) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 1.0f};
+ float A[] = { -0.515f, -0.166f, -0.364f, 0.24f, 0.056f, 0.023f, 0.05f, 0.853f };
+ int lda = 2;
+ float B[] = { 0.779f, 0.443f, -0.852f, 0.037f, -0.649f, 0.554f, 0.469f, 0.632f, 0.224f, -0.148f, 0.457f, -0.78f };
+ int ldb = 3;
+ float B_expected[] = { -0.396821f, 0.767272f, -0.040136f, -0.867948f, -0.587169f, -0.692532f, -0.632f, 0.469f, 0.148f, 0.224f, 0.78f, 0.457f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1905) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1905) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 1.0f};
+ float A[] = { 0.576f, 0.785f, 0.297f, -0.561f, -0.164f, 0.463f, -0.454f, 0.803f };
+ int lda = 2;
+ float B[] = { -0.78f, -0.792f, 0.223f, 0.206f, -0.097f, 0.504f, 0.721f, 0.205f, 0.508f, -0.8f, -0.469f, 0.283f };
+ int ldb = 2;
+ float B_expected[] = { -0.164671f, -1.12975f, 0.510941f, 0.652691f, -0.386549f, 0.358405f, 0.959415f, -0.414847f, 0.906729f, -0.353789f, -0.734462f, 0.786484f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1906) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1906) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 1.0f};
+ float A[] = { -0.04f, 0.917f, 0.327f, -0.115f, -0.656f, -0.811f, -0.646f, 0.78f };
+ int lda = 2;
+ float B[] = { 0.131f, 0.677f, -0.431f, -0.652f, -0.415f, 0.094f, -0.253f, 0.496f, 0.797f, 0.166f, 0.737f, -0.685f };
+ int ldb = 2;
+ float B_expected[] = { -0.677f, 0.131f, 0.101647f, -0.894111f, -0.094f, -0.415f, -0.221099f, -0.601474f, -0.166f, 0.797f, -0.070263f, 1.12521f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1907) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1907) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 1.0f};
+ float A[] = { 0.769f, -0.384f, -0.522f, -0.086f, -0.129f, -0.574f, 0.56f, -0.809f };
+ int lda = 2;
+ float B[] = { 0.367f, 0.169f, -0.321f, -0.982f, -0.563f, -0.051f, -0.742f, 0.595f, 0.067f, -0.183f, -0.524f, 0.77f };
+ int ldb = 2;
+ float B_expected[] = { -0.178752f, 0.912513f, 0.836303f, 0.634945f, 0.817549f, -0.921899f, 0.275884f, -0.926446f, 0.49345f, -0.309856f, -0.00752416f, -0.946584f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1908) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1908) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 1.0f};
+ float A[] = { 0.758f, 0.228f, 0.263f, 0.731f, 0.171f, 0.051f, 0.968f, 0.731f };
+ int lda = 2;
+ float B[] = { 0.783f, 0.422f, -0.649f, -0.428f, 0.216f, 0.659f, -0.608f, -0.239f, -0.588f, 0.01f, -0.009f, -0.374f };
+ int ldb = 2;
+ float B_expected[] = { -1.00898f, 0.640819f, 0.428f, -0.649f, -1.1663f, 0.201195f, 0.239f, -0.608f, -0.114941f, -0.859027f, 0.374f, -0.009f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1909) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1909) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 1.0f};
+ float A[] = { 0.601f, -0.017f, 0.518f, -0.975f, -0.394f, 0.396f, 0.395f, -0.374f, -0.321f, 0.221f, 0.809f, 0.74f, -0.009f, 0.88f, 0.057f, 0.65f, 0.761f, -0.839f };
+ int lda = 3;
+ float B[] = { -0.644f, 0.29f, 0.458f, 0.755f, -0.725f, 0.313f, 0.537f, 0.945f, 0.377f, 0.776f, -0.686f, -0.561f };
+ int ldb = 3;
+ float B_expected[] = { -5.28862f, 4.51343f, 4.18447f, 0.519474f, 0.288441f, -0.634688f, -7.53878f, 2.5597f, 2.79299f, 2.44873f, 0.781327f, -0.0400353f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1910) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1910) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 1.0f};
+ float A[] = { 0.746f, 0.079f, -0.151f, -0.433f, 0.524f, -0.201f, 0.198f, -0.368f, -0.449f, 0.693f, -0.14f, -0.574f, -0.242f, -0.584f, -0.298f, 0.41f, -0.234f, 0.92f };
+ int lda = 3;
+ float B[] = { -0.787f, 0.186f, -0.104f, -0.142f, -0.548f, 0.332f, -0.66f, 0.413f, 0.046f, 0.818f, -0.783f, -0.376f };
+ int ldb = 3;
+ float B_expected[] = { 0.320805f, -0.445083f, 0.410072f, -0.371288f, -0.332f, -0.548f, -0.566249f, -0.287942f, -0.315918f, 0.152204f, 0.376f, -0.783f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1911) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1911) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 1.0f};
+ float A[] = { -0.623f, -0.229f, 0.653f, -0.19f, 0.42f, -0.181f, -0.061f, 0.963f, 0.422f, 0.989f, 0.919f, -0.352f, -0.849f, 0.052f, 0.02f, -0.771f, -0.38f, -0.566f };
+ int lda = 3;
+ float B[] = { 0.018f, 0.461f, -0.184f, 0.334f, 0.075f, 0.694f, 0.022f, 0.239f, 0.971f, -0.339f, 0.203f, 0.083f };
+ int ldb = 3;
+ float B_expected[] = { 0.642534f, -0.265073f, -0.901268f, 0.171623f, 1.29999f, 0.384146f, 0.326529f, -0.155337f, 0.629902f, 0.0571184f, -0.761884f, -0.282697f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1912) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1912) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 1.0f};
+ float A[] = { 0.35f, 0.154f, 0.397f, -0.709f, 0.587f, -0.895f, -0.848f, 0.933f, -0.887f, -0.393f, 0.824f, 0.182f, 0.159f, 0.303f, -0.011f, -0.363f, 0.875f, 0.991f };
+ int lda = 3;
+ float B[] = { -0.513f, 0.564f, 0.404f, -0.635f, 0.924f, 0.238f, -0.059f, 0.96f, 0.341f, 0.483f, -0.844f, 0.84f };
+ int ldb = 3;
+ float B_expected[] = { -0.564f, -0.513f, -0.321901f, 0.495188f, -0.487057f, 1.06506f, -0.96f, -0.059f, -1.35213f, 1.18665f, -1.15086f, -1.02151f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1913) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1913) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 1.0f};
+ float A[] = { 0.87f, 0.914f, -0.097f, -0.138f, 0.894f, -0.173f, 0.648f, -0.327f, 0.7f, 0.816f, 0.63f, 0.637f, -0.671f, 0.322f, -0.922f, 0.618f, 0.93f, 0.654f };
+ int lda = 3;
+ float B[] = { -0.347f, -0.273f, -0.384f, 0.02f, 0.392f, -0.206f, 0.347f, 0.269f, 0.016f, 0.797f, 0.699f, -0.966f };
+ int ldb = 2;
+ float B_expected[] = { -0.443754f, 0.343363f, 0.300599f, -0.548484f, 0.757674f, 0.722159f, 0.224607f, -0.673284f, -0.565323f, 0.414754f, 1.04867f, 0.014162f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1914) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1914) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 1.0f};
+ float A[] = { 0.965f, -0.191f, 0.489f, 0.84f, 0.011f, -0.951f, 0.067f, -0.21f, -0.911f, 0.767f, -0.162f, 0.274f, -0.502f, -0.445f, 0.492f, 0.023f, -0.818f, 0.859f };
+ int lda = 3;
+ float B[] = { 0.66f, -0.303f, 0.223f, 0.261f, -0.252f, -0.238f, -0.012f, -0.485f, 0.783f, -0.196f, -0.57f, 0.929f };
+ int ldb = 2;
+ float B_expected[] = { 0.177032f, 1.21679f, -0.596808f, -0.300881f, 0.159577f, -0.641744f, 0.928958f, 0.289807f, 0.196f, 0.783f, -0.929f, -0.57f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1915) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1915) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 1.0f};
+ float A[] = { -0.652f, 0.046f, -0.229f, 0.473f, -0.783f, -0.211f, 0.698f, 0.201f, -0.153f, 0.918f, -0.996f, -0.186f, 0.84f, -0.545f, -0.457f, 0.057f, 0.649f, 0.77f };
+ int lda = 3;
+ float B[] = { -0.227f, 0.14f, 0.165f, -0.945f, -0.212f, -0.522f, 0.908f, 0.722f, -0.208f, 0.969f, 0.721f, -0.816f };
+ int ldb = 2;
+ float B_expected[] = { 0.189219f, 0.361509f, -1.42444f, -0.353565f, -0.361882f, -0.741783f, 1.80537f, 1.02311f, -1.24128f, 0.407779f, 2.0229f, -0.0912412f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1916) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1916) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 1.0f};
+ float A[] = { -0.945f, 0.36f, 0.3f, 0.128f, -0.27f, -0.834f, 0.349f, -0.6f, -0.293f, 0.122f, -0.481f, -0.681f, -0.815f, -0.195f, 0.728f, 0.016f, 0.037f, 0.989f };
+ int lda = 3;
+ float B[] = { -0.97f, 0.784f, 0.488f, 0.39f, -0.482f, -0.518f, -0.797f, 0.271f, 0.257f, 0.637f, 0.118f, -0.993f };
+ int ldb = 2;
+ float B_expected[] = { -0.784f, -0.97f, -0.39f, 0.488f, 0.62904f, -0.090648f, -0.091536f, -0.89348f, 0.3246f, -0.273981f, 1.04514f, -0.5676f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1917) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1917) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int trans = 113;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 0.1f};
+ float A[] = { 0.795f, 0.073f, 0.104f, -0.261f, -0.712f, 0.881f, -0.474f, -0.906f };
+ int lda = 2;
+ float B[] = { -0.41f, -0.191f, -0.359f, -0.718f, -0.902f, 0.646f, -0.703f, -0.809f, -0.342f, -0.783f, -0.053f, 0.917f };
+ int ldb = 3;
+ float B_expected[] = { 0.0285203f, -0.0489535f, 0.0936712f, -0.036556f, -0.0702473f, -0.11991f, -0.0924979f, -0.0235243f, -0.0742841f, -0.0262764f, 0.074552f, 0.0886899f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1918) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1918) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int trans = 113;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 0.1f};
+ float A[] = { -0.281f, -0.111f, 0.055f, -0.643f, 0.33f, -0.663f, 0.32f, 0.423f };
+ int lda = 2;
+ float B[] = { 0.103f, 0.357f, -0.591f, 0.833f, -0.906f, -0.192f, -0.391f, -0.622f, -0.345f, -0.58f, -0.132f, -0.874f };
+ int ldb = 3;
+ float B_expected[] = { -0.0357f, 0.0103f, -0.0833f, -0.0591f, 0.0192f, -0.0906f, 0.0707864f, -0.0167114f, 0.0245802f, 0.0223124f, 0.0280882f, -0.0205626f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1919) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1919) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int trans = 113;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 0.1f};
+ float A[] = { 0.311f, -0.648f, -0.732f, 0.825f, 0.152f, -0.529f, -0.353f, 0.568f };
+ int lda = 2;
+ float B[] = { 0.86f, -0.991f, -0.992f, -0.617f, 0.137f, -0.585f, -0.467f, 0.632f, 0.672f, 0.777f, -0.609f, 0.511f };
+ int ldb = 3;
+ float B_expected[] = { 0.0795347f, -0.0537122f, -0.0885393f, -0.0194836f, -0.0386006f, -0.0674606f, 0.109194f, -0.0434058f, -0.0240177f, -0.151722f, 0.117678f, -0.0168304f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1920) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1920) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int trans = 113;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 0.1f};
+ float A[] = { 0.318f, -0.946f, -0.389f, 0.051f, 0.322f, -0.626f, -0.839f, -0.252f };
+ int lda = 2;
+ float B[] = { 0.372f, -0.23f, 0.515f, 0.213f, 0.222f, 0.296f, -0.524f, 0.442f, -0.581f, -0.409f, 0.894f, -0.246f };
+ int ldb = 3;
+ float B_expected[] = { 0.00443f, 0.081742f, -0.0708404f, 0.0446048f, 0.0184432f, -0.0219864f, -0.0442f, -0.0524f, 0.0409f, -0.0581f, 0.0246f, 0.0894f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1921) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1921) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int trans = 113;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 0.1f};
+ float A[] = { -0.411f, 0.34f, -0.85f, 0.557f, -0.918f, 0.484f, -0.889f, 0.561f };
+ int lda = 2;
+ float B[] = { -0.763f, -0.514f, -0.744f, -0.948f, -0.312f, 0.818f, -0.686f, 0.341f, -0.043f, 0.235f, -0.201f, 0.874f };
+ int ldb = 2;
+ float B_expected[] = { 0.0169288f, 0.17164f, -0.0683166f, -0.0596556f, 0.155447f, -0.0526808f, -0.086698f, 0.101645f, 0.039085f, -0.0218708f, 0.0437248f, -0.0036776f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1922) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1922) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int trans = 113;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 0.1f};
+ float A[] = { 0.046f, 0.571f, 0.825f, 0.665f, 0.658f, -0.977f, 0.247f, -0.944f };
+ int lda = 2;
+ float B[] = { -0.342f, 0.089f, -0.975f, 0.027f, -0.621f, -0.127f, 0.937f, -0.332f, -0.357f, -0.213f, 0.57f, 0.134f };
+ int ldb = 2;
+ float B_expected[] = { -0.0089f, -0.0342f, -0.0302572f, -0.0663011f, 0.0127f, -0.0621f, -0.0358283f, 0.122154f, 0.0213f, -0.0357f, -0.0622943f, 0.0596805f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1923) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1923) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int trans = 113;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 0.1f};
+ float A[] = { 0.655f, 0.051f, -0.864f, 0.04f, -0.45f, 0.276f, -0.365f, 0.766f };
+ int lda = 2;
+ float B[] = { 0.12f, 0.036f, 0.425f, -0.145f, -0.772f, -0.483f, -0.154f, -0.327f, 0.532f, 0.59f, 0.305f, 0.443f };
+ int ldb = 2;
+ float B_expected[] = { -0.0745593f, 0.00123365f, -0.0525674f, -0.00611891f, 0.0752311f, -0.0558274f, -0.0001932f, 0.0425972f, -0.0986826f, -0.00963885f, -0.00999124f, -0.0625937f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1924) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1924) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int trans = 113;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 0.1f};
+ float A[] = { 0.253f, -0.163f, -0.061f, -0.032f, -0.764f, 0.863f, 0.051f, 0.669f };
+ int lda = 2;
+ float B[] = { 0.966f, 0.42f, -0.765f, 0.186f, -0.798f, 0.278f, -0.37f, -0.484f, -0.724f, -0.682f, 0.034f, 0.352f };
+ int ldb = 2;
+ float B_expected[] = { -0.0455826f, 0.0925287f, -0.0186f, -0.0765f, -0.0260316f, -0.0836058f, 0.0484f, -0.037f, 0.0661616f, -0.0710662f, -0.0352f, 0.0034f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1925) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1925) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int trans = 113;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 0.1f};
+ float A[] = { 0.017f, -0.631f, -0.052f, 0.296f, -0.486f, -0.279f, -0.378f, 0.997f, 0.533f, 0.87f, 0.808f, 0.007f, 0.185f, -0.263f, -0.757f, -0.856f, 0.575f, -0.81f };
+ int lda = 3;
+ float B[] = { -0.238f, -0.924f, 0.494f, -0.089f, 0.96f, 0.959f, 0.415f, 0.39f, -0.744f, -0.881f, -0.594f, 0.629f };
+ int ldb = 3;
+ float B_expected[] = { 0.0798921f, -0.243487f, 0.0441094f, -0.0391653f, 0.0229218f, 0.134667f, 0.192099f, 0.152741f, 0.154557f, 0.0857677f, -0.0854154f, 0.0170199f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1926) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1926) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int trans = 113;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 0.1f};
+ float A[] = { -0.977f, -0.949f, 0.192f, 0.803f, -0.964f, -0.162f, 0.799f, -0.081f, -0.055f, 0.014f, 0.99f, 0.804f, 0.913f, -0.898f, -0.057f, 0.51f, 0.453f, 0.622f };
+ int lda = 3;
+ float B[] = { -0.852f, -0.001f, -0.955f, -0.97f, -0.071f, -0.664f, -0.077f, -0.746f, 0.228f, -0.948f, 0.476f, -0.285f };
+ int ldb = 3;
+ float B_expected[] = { 0.0840343f, -0.066376f, 0.0369724f, -0.0350854f, 0.0664f, -0.0071f, 0.105481f, 0.0565767f, 0.0283146f, -0.00141f, 0.0285f, 0.0476f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1927) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1927) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int trans = 113;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 0.1f};
+ float A[] = { 0.822f, 0.618f, -0.935f, 0.49f, 0.885f, -0.488f, 0.412f, 0.861f, -0.144f, 0.906f, -0.054f, 0.455f, 0.213f, 0.34f, -0.465f, 0.107f, -0.611f, 0.088f };
+ int lda = 3;
+ float B[] = { 0.476f, -0.297f, -0.966f, -0.038f, -0.346f, -0.81f, -0.749f, -0.065f, -0.225f, -0.663f, 0.073f, -0.379f };
+ int ldb = 3;
+ float B_expected[] = { -0.00473086f, 0.0543508f, 0.139511f, -0.0231317f, -0.199775f, 0.100154f, 0.0488188f, -0.054416f, -0.0610839f, 0.0929832f, -0.0289368f, -0.113983f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1928) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1928) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int trans = 113;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 0.1f};
+ float A[] = { -0.188f, 0.741f, 0.583f, 0.527f, 0.025f, 0.216f, -0.44f, -0.071f, -0.126f, -0.093f, 0.743f, -0.476f, 0.661f, -0.66f, 0.564f, -0.943f, -0.976f, -0.035f };
+ int lda = 3;
+ float B[] = { -0.648f, -0.367f, -0.402f, -0.309f, 0.412f, 0.531f, -0.248f, 0.181f, 0.507f, 0.502f, -0.593f, 0.404f };
+ int ldb = 3;
+ float B_expected[] = { 0.0367f, -0.0648f, 0.0424472f, -0.0713177f, -0.21132f, 0.0600063f, -0.0181f, -0.0248f, -0.0599248f, 0.0410731f, 0.0277256f, 0.00238266f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1929) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1929) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int trans = 113;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 0.1f};
+ float A[] = { 0.76f, -0.021f, -0.011f, 0.14f, 0.699f, 0.94f, 0.296f, 0.333f, 0.654f, -0.917f, 0.008f, -0.999f, -0.963f, 0.687f, -0.481f, 0.106f, 0.128f, -0.165f };
+ int lda = 3;
+ float B[] = { -0.742f, 0.774f, -0.335f, -0.99f, 0.799f, 0.901f, 0.753f, -0.085f, -0.042f, -0.591f, 0.202f, 0.515f };
+ int ldb = 2;
+ float B_expected[] = { 0.313744f, -0.259345f, -0.290807f, 0.212822f, -0.00668591f, -0.0164417f, 0.10903f, 0.137068f, 0.157578f, -0.23594f, -0.0747323f, 0.254147f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1930) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1930) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int trans = 113;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 0.1f};
+ float A[] = { 0.582f, -0.175f, -0.48f, 0.567f, -0.571f, 0.062f, 0.038f, -0.625f, 0.737f, 0.799f, -0.569f, -0.932f, 0.522f, -0.763f, 0.156f, -0.524f, 0.138f, 0.007f };
+ int lda = 3;
+ float B[] = { 0.998f, 0.6f, 0.555f, -0.737f, -0.162f, 0.263f, 0.317f, -0.092f, 0.302f, -0.671f, 0.418f, -0.814f };
+ int ldb = 2;
+ float B_expected[] = { -0.106233f, 0.0480583f, 0.0514817f, -0.0392668f, -0.0209428f, -0.0560716f, 0.0184048f, -0.0174744f, 0.0671f, 0.0302f, 0.0814f, 0.0418f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1931) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1931) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int trans = 113;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 0.1f};
+ float A[] = { 0.964f, 0.509f, 0.48f, -0.833f, 0.867f, 0.51f, -0.643f, 0.115f, -0.594f, -0.409f, -0.174f, 0.527f, 0.676f, 0.431f, 0.261f, -0.239f, 0.816f, -0.231f };
+ int lda = 3;
+ float B[] = { -0.659f, -0.029f, -0.581f, -0.938f, -0.904f, -0.445f, 0.119f, 0.709f, -0.649f, 0.825f, 0.532f, -0.453f };
+ int ldb = 2;
+ float B_expected[] = { 0.0305784f, -0.0522153f, 0.100975f, -0.00695419f, -0.055793f, 0.11446f, 0.0887801f, 0.177079f, -0.177262f, 0.0336107f, -0.0717714f, 0.251108f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1932) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1932) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int trans = 113;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ float alpha[2] = {0.0f, 0.1f};
+ float A[] = { 0.859f, 0.745f, 0.03f, -0.98f, -0.402f, 0.38f, -0.214f, 0.605f, 0.342f, -0.059f, -0.096f, 0.606f, -0.543f, 0.503f, 0.63f, -0.269f, 0.252f, 0.626f };
+ int lda = 3;
+ float B[] = { 0.85f, 0.642f, 0.679f, -0.254f, 0.192f, 0.766f, -0.869f, -0.09f, 0.68f, -0.898f, 0.272f, -0.651f };
+ int ldb = 2;
+ float B_expected[] = { -0.0642f, 0.085f, 0.0254f, 0.0679f, 0.008626f, 0.079566f, 0.07478f, -0.113829f, -0.0156973f, 0.0906397f, 0.125668f, 0.0985369f };
+ cblas_ctrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], flteps, "ctrsm(case 1933) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], flteps, "ctrsm(case 1933) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0};
+ double A[] = { 0.189, 0.519, -0.455, -0.444, -0.21, -0.507, -0.591, 0.859 };
+ int lda = 2;
+ double B[] = { -0.779, -0.484, 0.249, -0.107, -0.755, -0.047, 0.941, 0.675, -0.757, 0.645, -0.649, 0.242 };
+ int ldb = 3;
+ double B_expected[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1934) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1934) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0};
+ double A[] = { -0.988, 0.73, 0.279, -0.967, -0.288, -0.095, -0.821, 0.178 };
+ int lda = 2;
+ double B[] = { 0.702, 0.943, -0.235, -0.565, 0.279, -0.146, 0.816, 0.473, 0.893, 0.877, -0.797, -0.159 };
+ int ldb = 3;
+ double B_expected[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1935) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1935) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0};
+ double A[] = { 0.716, -0.549, 0.436, -0.822, -0.029, -0.586, 0.791, -0.159 };
+ int lda = 2;
+ double B[] = { 0.021, 0.391, 0.296, -0.154, -0.513, 0.738, -0.336, 0.317, 0.502, 0.543, 0.027, 0.802 };
+ int ldb = 3;
+ double B_expected[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1936) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1936) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0};
+ double A[] = { 0.715, -0.875, -0.501, 0.425, -0.928, -0.929, -0.542, 0.915 };
+ int lda = 2;
+ double B[] = { 0.065, 0.679, -0.545, 0.042, 0.199, -0.86, 0.159, 0.943, 0.19, 0.403, 0.994, 0.76 };
+ int ldb = 3;
+ double B_expected[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1937) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1937) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0};
+ double A[] = { -0.936, -0.989, -0.57, 0.018, -0.821, 0.516, -0.479, 0.209 };
+ int lda = 2;
+ double B[] = { 0.722, -0.756, -0.828, -0.191, -0.981, -0.466, 0.347, 0.85, -0.596, -0.826, -0.182, -0.321 };
+ int ldb = 2;
+ double B_expected[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1938) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1938) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0};
+ double A[] = { 0.693, 0.976, -0.356, -0.313, 0.926, -0.164, -0.337, 0.056 };
+ int lda = 2;
+ double B[] = { -0.988, -0.633, -0.745, -0.392, -0.362, -0.708, -0.706, -0.093, -0.177, 0.837, 0.391, -0.853 };
+ int ldb = 2;
+ double B_expected[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1939) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1939) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0};
+ double A[] = { -0.483, -0.383, 0.357, 0.889, 0.523, -0.148, -0.592, 0.481 };
+ int lda = 2;
+ double B[] = { -0.41, 0.994, -0.779, -0.354, 0.571, 0.51, -0.526, 0.934, 0.469, 0.735, -0.47, -0.164 };
+ int ldb = 2;
+ double B_expected[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1940) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1940) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0};
+ double A[] = { -0.576, -0.089, 0.953, -0.317, 0.408, 0.618, 0.092, -0.84 };
+ int lda = 2;
+ double B[] = { 0.141, -0.32, -0.007, -0.682, -0.068, -0.412, 0.675, -0.809, 0.931, -0.257, -0.048, 0.633 };
+ int ldb = 2;
+ double B_expected[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1941) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1941) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0};
+ double A[] = { 0.269, 0.567, 0.497, -0.969, 0.957, 0.538, -0.921, 0.639, 0.599, -0.436, -0.045, 0.164, 0.827, 0.489, -0.729, 0.723, -0.01, 0.934 };
+ int lda = 3;
+ double B[] = { -0.391, 0.434, -0.349, -0.456, -0.541, 0.289, 0.31, 0.447, 0.971, -0.626, -0.77, -0.882 };
+ int ldb = 3;
+ double B_expected[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1942) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1942) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0};
+ double A[] = { -0.523, -0.364, -0.492, 0.294, 0.71, -0.401, 0.947, -0.008, 0.235, -0.47, 0.298, -0.603, -0.193, 0.598, 0.122, -0.733, -0.827, 0.491 };
+ int lda = 3;
+ double B[] = { 0.872, 0.441, 0.518, 0.607, -0.04, -0.976, 0.201, -0.136, -0.958, -0.501, -0.549, -0.4 };
+ int ldb = 3;
+ double B_expected[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1943) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1943) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0};
+ double A[] = { -0.177, -0.965, 0.589, -0.236, -0.303, -0.301, 0.982, 0.006, -0.73, 0.241, 0.636, -0.672, 0.886, 0.952, 0.501, -0.803, -0.823, -0.09 };
+ int lda = 3;
+ double B[] = { -0.475, -0.646, -0.666, -0.886, 0.04, -0.736, -0.592, -0.995, 0.259, 0.701, -0.033, 0.616 };
+ int ldb = 3;
+ double B_expected[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1944) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1944) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0};
+ double A[] = { -0.76, -0.29, -0.601, 0.327, 0.383, 0.883, 0.589, -0.708, 0.912, -0.982, 0.629, 0.879, -0.578, -0.814, 0.168, 0.91, 0.328, 0.223 };
+ int lda = 3;
+ double B[] = { 0.381, 0.829, 0.096, 0.382, 0.664, 0.006, -0.376, -0.338, 0.344, -0.889, -0.175, 0.083 };
+ int ldb = 3;
+ double B_expected[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1945) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1945) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0};
+ double A[] = { 0.129, -0.161, 0.102, 0.443, -0.138, 0.677, -0.87, 0.327, 0.917, 0.446, 0.798, -0.91, -0.574, 0.333, -0.626, 0.14, 0.109, 0.161 };
+ int lda = 3;
+ double B[] = { -0.689, -0.94, -0.814, 0.761, 0.389, 0.03, -0.175, -0.739, -0.904, 0.463, -0.511, 0.615 };
+ int ldb = 2;
+ double B_expected[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1946) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1946) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0};
+ double A[] = { 0.062, 0.756, 0.179, 0.359, -0.047, -0.197, 0.678, 0.873, 0.003, -0.996, 0.507, -0.491, -0.726, -0.833, -0.118, -0.71, 0.714, 0.638 };
+ int lda = 3;
+ double B[] = { -0.614, 0.193, 0.881, 0.538, 0.183, -0.034, 0.099, -0.154, -0.121, 0.842, -0.182, -0.229 };
+ int ldb = 2;
+ double B_expected[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1947) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1947) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0};
+ double A[] = { -0.874, 0.171, 0.637, 0.554, 0.852, -0.203, 0.455, 0.619, -0.128, 0.759, 0.342, 0.372, 0.669, -0.537, -0.76, -0.348, -0.714, 0.573 };
+ int lda = 3;
+ double B[] = { -0.434, 0.921, -0.949, 0.282, -0.665, 0.223, -0.633, 0.921, -0.73, 0.457, -0.021, -0.844 };
+ int ldb = 2;
+ double B_expected[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1948) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1948) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int trans = 111;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0};
+ double A[] = { -0.189, -0.931, 0.414, 0.288, -0.245, 0.252, -0.465, -0.073, 0.327, 0.176, -0.067, 0.1, 0.124, 0.885, -0.731, -0.303, 0.954, -0.763 };
+ int lda = 3;
+ double B[] = { 0.818, 0.948, -0.749, 0.808, -0.959, -0.797, 0.727, 0.701, 0.244, -0.801, 0.354, -0.781 };
+ int ldb = 2;
+ double B_expected[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1949) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1949) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {-1, 0};
+ double A[] = { -0.65, -0.279, -0.543, -0.097, -0.641, 0.984, 0.507, -0.809 };
+ int lda = 2;
+ double B[] = { -0.176, 0.87, -0.681, 0.409, -0.878, 0.522, 0.348, 0.679, -0.975, -0.815, -0.608, 0.86 };
+ int ldb = 3;
+ double B_expected[] = { 0.256485077177, 1.22837025149, -0.656630178218, 0.911076645728, -0.849544610576, 1.16772760977, -0.193804546743, -0.283833884163, -0.811035478317, 1.16349859839, 0.292241175557, -0.141827660937 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1950) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1950) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {-1, 0};
+ double A[] = { 0.23, -0.597, 0.068, 0.945, 0.045, -0.436, 0.113, 0.035 };
+ int lda = 2;
+ double B[] = { -0.744, -0.465, -0.742, 0.996, -0.835, 0.712, -0.968, 0.053, -0.813, 0.36, 0.572, -0.489 };
+ int ldb = 3;
+ double B_expected[] = { 0.744, 0.465, 0.742, -0.996, 0.835, -0.712, 1.356833, -0.7877, -0.178676, -0.993462, -1.30162, -0.251659 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1951) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1951) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {-1, 0};
+ double A[] = { -0.689, -0.396, 0.415, -0.567, 0.001, 0.513, 0.837, 0.045 };
+ int lda = 2;
+ double B[] = { -0.012, 0.2, 0.22, 0.81, -0.586, -0.198, 0.16, -0.958, -0.125, 0.833, 0.344, 0.213 };
+ int ldb = 3;
+ double B_expected[] = { -0.573154258944, 0.525131422048, 1.33801555643, 0.47629585874, -0.770607912552, -0.160087833623, -0.129249609305, 1.15151282248, 0.0955601670381, -1.00035867087, -0.423449388979, -0.231714190557 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1952) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1952) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {-1, 0};
+ double A[] = { 0.102, 0.86, -0.067, 0.12, 0.92, 0.441, 0.367, -0.104 };
+ int lda = 2;
+ double B[] = { 0.386, 0.59, 0.222, 0.824, 0.091, 0.486, 0.43, 0.766, 0.576, 0.042, 0.013, -0.008 };
+ int ldb = 3;
+ double B_expected[] = { -0.328206, 0.30435, 0.289398, -0.531344, -0.075512, -0.487627, -0.43, -0.766, -0.576, -0.042, -0.013, 0.008 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1953) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1953) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {-1, 0};
+ double A[] = { -0.087, 0.925, -0.315, 0.251, 0.7, -0.223, 0.448, 0.373 };
+ int lda = 2;
+ double B[] = { -0.333, -0.495, 0.995, -0.229, 0.425, -0.269, -0.756, -0.783, -0.214, 0.582, -0.351, -0.095 };
+ int ldb = 2;
+ double B_expected[] = { 0.496880191475, -0.406733596387, -0.965186357327, 2.19761676664, 0.331095906598, 0.428318547163, 1.17655095681, 0.263745306399, -0.645240814927, -0.170663836866, 1.18578937767, -0.829739852214 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1954) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1954) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {-1, 0};
+ double A[] = { 0.717, 0.572, -0.304, 0.878, 0.625, -0.615, -0.565, -0.643 };
+ int lda = 2;
+ double B[] = { -0.383, -0.669, -0.043, -0.09, -0.999, -0.427, 0.834, 0.539, -0.973, -0.481, 0.071, -0.71 };
+ int ldb = 2;
+ double B_expected[] = { 0.383, 0.669, -0.60781, -0.09258, 0.999, 0.427, -1.72098, -0.19149, 0.973, 0.481, -0.97494, 1.00777 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1955) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1955) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {-1, 0};
+ double A[] = { 0.143, -0.022, 0.487, 0.444, 0.138, -0.871, 0.572, -0.093 };
+ int lda = 2;
+ double B[] = { -0.073, -0.9, -0.688, 0.436, -0.213, -0.733, 0.809, -0.618, 0.696, 0.259, 0.494, 0.162 };
+ int ldb = 2;
+ double B_expected[] = { -6.10129128737, 3.22195959384, 1.29255909931, -0.552083922664, 8.05253150033, 8.35261031753, -1.54904967648, 0.828563601552, -3.66721033067, 1.50334288416, -0.796532800529, -0.412722990296 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1956) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1956) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {-1, 0};
+ double A[] = { 0.544, 0.918, -0.524, 0.547, -0.839, 0.4, -0.548, 0.49 };
+ int lda = 2;
+ double B[] = { 0.475, -0.594, 0.252, -0.717, 0.867, 0.07, 0.264, 0.538, 0.028, 0.482, -0.59, -0.533 };
+ int ldb = 2;
+ double B_expected[] = { -0.214849, 1.107552, -0.252, 0.717, -1.299622, -0.207504, -0.264, -0.538, 0.572711, -0.525438, 0.59, 0.533 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1957) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1957) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {-1, 0};
+ double A[] = { -0.038, -0.116, -0.476, -0.818, 0.961, 0.271, -0.593, 0.548, -0.86, 0.429, -0.396, -0.559, 0.766, -0.326, -0.335, 0.633, -0.532, 0.317 };
+ int lda = 3;
+ double B[] = { -0.459, 0.904, 0.887, 0.07, -0.497, -0.48, -0.313, 0.864, -0.029, -0.754, -0.566, -0.108 };
+ int ldb = 3;
+ double B_expected[] = { -4.58258258525, -3.00717937382, 0.0668903493808, 0.800759804641, -0.292673260098, -1.0766492922, -0.911020412982, 7.68812066826, -0.0359723342287, -0.157963939743, -0.695872108638, -0.617653117365 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1958) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1958) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {-1, 0};
+ double A[] = { 0.886, 0.945, 0.065, 0.882, -0.46, -0.095, 0.823, -0.245, -0.825, 0.904, -0.214, -0.268, -0.935, -0.017, 0.902, 0.561, 0.954, -0.665 };
+ int lda = 3;
+ double B[] = { 0.076, -0.043, 0.873, -0.831, -0.329, -0.896, -0.174, 0.653, 0.489, 0.25, -0.896, 0.609 };
+ int ldb = 3;
+ double B_expected[] = { 1.037824842, 1.333886264, -1.042722, 1.110916, 0.329, 0.896, 0.529073224, -0.720680322, -0.134044, -0.140198, 0.896, -0.609 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1959) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1959) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {-1, 0};
+ double A[] = { -0.691, -0.056, -0.339, -0.483, -0.975, -0.052, -0.198, 0.576, -0.075, 0.718, -0.321, 0.728, -0.124, 0.774, 0.685, -0.112, 0.178, 0.275 };
+ int lda = 3;
+ double B[] = { -0.062, -0.391, 0.326, 0.42, -0.203, 0.45, 0.338, 0.991, -0.47, -0.363, 0.766, -0.961 };
+ int ldb = 3;
+ double B_expected[] = { -0.134697690677, -0.554930433172, -0.526377715671, 0.991348747823, -2.94323584375, -1.92805449726, 0.601422754501, 1.38541291715, 0.201151053335, -1.95287726277, 5.96201044303, 2.1797020274 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1960) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1960) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {-1, 0};
+ double A[] = { -0.318, 0.067, -0.097, 0.359, -0.688, 0.307, -0.63, -0.616, 0.193, 0.817, -0.792, -0.117, -0.501, -0.929, -0.595, -0.144, 0.453, 0.658 };
+ int lda = 3;
+ double B[] = { -0.249, -0.206, 0.424, -0.681, -0.464, 0.21, 0.541, 0.082, 0.803, -0.461, -0.638, 0.358 };
+ int ldb = 3;
+ double B_expected[] = { 0.249, 0.206, -0.394026, 0.964164, 0.024089914, 0.641464836, -0.541, -0.082, -1.093318, 0.076084, -0.218343306, -1.013838812 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1961) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1961) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {-1, 0};
+ double A[] = { 0.691, 0.808, -0.178, 0.489, 0.159, -0.646, -0.692, -0.968, -0.146, -0.281, -0.385, 0.773, 0.704, 0.782, 0.551, -0.727, 0.669, 0.858 };
+ int lda = 3;
+ double B[] = { -0.657, -0.69, -0.051, 0.28, -0.846, 0.304, 0.052, 0.543, 0.613, -0.98, 0.983, -0.484 };
+ int ldb = 2;
+ double B_expected[] = { 2.42007211075, -0.148130095453, 4.93683906416, -0.804178199722, 1.76852672271, 0.633536755193, 4.41638755104, -0.0400468884046, 0.363887727302, 0.998182854971, -0.204739276437, 0.986048279795 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1962) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1962) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {-1, 0};
+ double A[] = { -0.244, -0.925, -0.539, 0.422, 0.285, -0.954, -0.347, -0.255, -0.616, -0.979, 0.631, -0.864, -0.053, -0.715, -0.749, -0.973, -0.409, -0.247 };
+ int lda = 3;
+ double B[] = { 0.922, -0.728, 0.588, -0.715, -0.92, -0.065, -0.583, 0.178, 0.996, 0.215, -0.614, -0.443 };
+ int ldb = 2;
+ double B_expected[] = { -0.416484258, -0.267425916, -0.851455486, 1.594186448, 0.383191, -1.065143, 0.611847, 0.751229, -0.996, -0.215, 0.614, 0.443 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1963) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1963) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {-1, 0};
+ double A[] = { 0.992, 0.172, -0.646, 0.067, -0.823, -0.013, -0.55, -0.438, -0.44, -0.302, 0.99, -0.373, 0.513, -0.106, -0.591, -0.504, 0.929, -0.318 };
+ int lda = 3;
+ double B[] = { 0.467, 0.227, 0.988, -0.709, -0.272, -0.601, 0.719, -0.133, 0.203, 0.937, -0.382, -0.334 };
+ int ldb = 2;
+ double B_expected[] = { -0.495544804508, -0.142909570186, -0.846593689328, 0.861506163875, -0.485462670276, -0.898345893497, 1.07522946065, -2.43403194583, 0.315527055267, -0.271726799352, -1.73234815305, 3.5434654009 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1964) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1964) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int trans = 112;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {-1, 0};
+ double A[] = { -0.692, -0.245, -0.874, 0.77, 0.07, 0.01, 0.018, -0.42, -0.405, -0.387, 0.888, -0.912, -0.81, 0.314, 0.66, -0.895, -0.556, 0.157 };
+ int lda = 3;
+ double B[] = { -0.801, 0.542, 0.699, 0.574, -0.56, 0.043, 0.742, -0.331, -0.614, 0.776, -0.335, 0.131 };
+ int ldb = 2;
+ double B_expected[] = { 0.801, -0.542, -0.699, -0.574, 0.842734, -1.133478, -1.794906, 0.367554, 0.837894144, 1.029031872, 1.63685728, -2.047172224 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1965) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1965) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int trans = 113;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0.1};
+ double A[] = { -0.035, -0.456, 0.152, 0.976, 0.687, -0.527, -0.571, 0.832 };
+ int lda = 2;
+ double B[] = { -0.868, 0.033, -0.131, -0.936, 0.993, 0.104, -0.684, 0.851, 0.523, 0.836, -0.205, 0.319 };
+ int ldb = 3;
+ double B_expected[] = { -0.188683836853, 0.0217191541444, -0.044222393276, -0.201868895253, 0.218228063549, 0.00605705652583, 0.252579293874, 0.0800538768738, -0.099911150161, 0.0758372341381, -0.116723296822, -0.16542230206 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1966) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1966) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 121;
+ int trans = 113;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0.1};
+ double A[] = { -0.481, -0.442, 0.69, 0.415, 0.983, -0.466, 0.503, -0.147 };
+ int lda = 2;
+ double B[] = { -0.287, -0.777, -0.187, 0.061, 0.631, 0.797, 0.833, -0.49, -0.188, 0.386, -0.904, -0.793 };
+ int ldb = 3;
+ double B_expected[] = { 0.0777, -0.0287, -0.0061, -0.0187, -0.0797, 0.0631, 0.0072975, 0.1353485, -0.0266305, -0.0084285, 0.1081065, -0.1670145 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1967) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1967) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int trans = 113;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0.1};
+ double A[] = { -0.286, 0.025, -0.111, 0.724, -0.973, -0.071, 0.527, -0.334 };
+ int lda = 2;
+ double B[] = { -0.381, -0.131, 0.33, 0.09, 0.35, 0.062, -0.874, 0.252, 0.924, 0.251, 0.559, -0.619 };
+ int ldb = 3;
+ double B_expected[] = { 0.38447496828, 0.401499279514, -0.210140860451, -0.584596680596, -0.443343106286, -0.127686958741, -0.109102585509, -0.096697792106, 0.045298174859, 0.146623168116, 0.131759250934, 0.0225662432408 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1968) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1968) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 141;
+ int uplo = 122;
+ int trans = 113;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0.1};
+ double A[] = { -0.862, -0.003, 0.975, 0.364, -0.996, 0.909, -0.316, -0.816 };
+ int lda = 2;
+ double B[] = { 0.167, 0.961, 0.116, 0.675, 0.086, 0.259, -0.483, 0.898, 0.434, 0.723, 0.505, 0.042 };
+ int ldb = 3;
+ double B_expected[] = { -0.1416361, -0.113035, -0.1789614, -0.0108943, -0.0759877, 0.0550802, -0.0898, -0.0483, -0.0723, 0.0434, -0.0042, 0.0505 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1969) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1969) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int trans = 113;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0.1};
+ double A[] = { -0.826, -0.025, 0.638, -0.183, -0.184, 0.806, 0.131, 0.764 };
+ int lda = 2;
+ double B[] = { -0.038, 0.14, -0.31, -0.494, -0.974, -0.396, -0.217, 0.519, -0.656, -0.737, 0.383, -0.03 };
+ int ldb = 2;
+ double B_expected[] = { 0.0167945280502, 0.00510879322186, 0.0315562985639, 0.0579039669012, -0.0514636821443, 0.116360058046, 0.0192833017545, -0.206389577002, -0.0915450409357, 0.0766481525141, 0.0107002286761, -0.100817314679 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1970) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1970) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 121;
+ int trans = 113;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0.1};
+ double A[] = { 0.282, -0.433, -0.793, -0.008, -0.999, 0.377, -0.979, 0.421 };
+ int lda = 2;
+ double B[] = { 0.622, -0.722, 0.605, -0.877, 0.935, -0.906, 0.719, -0.607, 0.022, -0.326, -0.905, 0.323 };
+ int ldb = 2;
+ double B_expected[] = { 0.0722, 0.0622, 0.1363784, 0.1498572, 0.0906, 0.0935, 0.1159599, 0.1994627, 0.0326, 0.0022, -0.000562, -0.076012 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1971) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1971) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int trans = 113;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0.1};
+ double A[] = { 0.934, 0.007, -0.958, 0.434, 0.263, 0.776, 0.097, 0.83 };
+ int lda = 2;
+ double B[] = { -0.405, 0.251, 0.13, 0.388, -0.664, -0.732, -0.779, -0.5, 0.775, -0.299, -0.45, 0.923 };
+ int ldb = 2;
+ double B_expected[] = { -0.026920633021, -0.0986978374343, -0.020841203536, -0.0443113292253, 0.157683298836, 0.0261984465224, 0.099536165222, 0.0486084240644, 0.127725373746, -0.0161073528761, 0.0406652355905, -0.115957262473 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1972) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1972) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 141;
+ int uplo = 122;
+ int trans = 113;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0.1};
+ double A[] = { -0.169, -0.768, -0.529, 0.236, -0.506, 0.691, -0.786, -0.36 };
+ int lda = 2;
+ double B[] = { 0.289, -0.985, 0.931, 0.652, -0.861, -0.51, -0.753, -0.542, -0.822, 0.174, 0.799, 0.8 };
+ int ldb = 2;
+ double B_expected[] = { 0.0420376, 0.0627627, -0.0652, 0.0931, 0.0974426, -0.1131425, 0.0542, -0.0753, -0.0785764, -0.0588129, -0.08, 0.0799 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1973) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1973) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int trans = 113;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0.1};
+ double A[] = { 0.834, 0.53, 0.278, 0.293, 0.66, 0.497, -0.664, 0.429, -0.294, -0.661, 0.52, -0.247, 0.392, -0.227, 0.209, -0.902, 0.843, 0.37 };
+ int lda = 3;
+ double B[] = { -0.738, 0.166, 0.721, -0.541, -0.963, -0.832, -0.376, -0.718, 0.765, -0.547, 0.451, -0.581 };
+ int ldb = 3;
+ double B_expected[] = { -0.115188282202, -0.000411685478887, 0.105497263516, -0.0083759187965, 0.124793492766, -0.0594619308146, 0.0499107469, -0.0152598288542, 0.00927285309719, -0.0831454824908, 0.0380996260983, 0.0702216627003 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1974) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1974) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 121;
+ int trans = 113;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0.1};
+ double A[] = { 0.531, -0.691, 0.801, 0.437, 0.402, 0.788, 0.824, 0.599, -0.362, 0.076, 0.192, 0.229, -0.259, -0.279, 0.79, -0.797, 0.728, 0.397 };
+ int lda = 3;
+ double B[] = { -0.049, 0.642, 0.36, 0.428, 0.523, -0.612, 0.459, -0.664, 0.328, 0.513, -0.225, 0.273 };
+ int ldb = 3;
+ double B_expected[] = { -0.0941948813, -0.0387898759, -0.0665271, 0.0399732, 0.0612, 0.0523, 0.1143807788, -0.0091687866, -0.0409059, 0.0308683, -0.0273, -0.0225 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1975) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1975) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int trans = 113;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0.1};
+ double A[] = { 0.169, -0.092, -0.13, 0.001, 0.573, 0.256, 0.632, -0.09, -0.942, 0.948, 0.595, -0.337, 0.01, -0.786, 0.944, 0.906, -0.832, -0.566 };
+ int lda = 3;
+ double B[] = { -0.461, -0.112, 0.674, -0.268, -0.286, -0.657, 0.329, 0.91, 0.73, 0.488, -0.363, -0.01 };
+ int ldb = 3;
+ double B_expected[] = { -0.0634274139095, -0.238252532073, -0.142693434208, -0.0938542376785, -0.0907100858097, -0.0412217911039, -0.333617825793, 0.376288993923, -0.0317846476268, 0.175075250306, -0.125200687799, -0.118937960805 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1976) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1976) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int side = 142;
+ int uplo = 122;
+ int trans = 113;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0.1};
+ double A[] = { -0.53, 0.141, 0.235, 0.474, -0.964, -0.441, 0.197, -0.703, 0.942, 0.98, 0.741, 0.499, -0.738, 0.234, -0.27, -0.158, 0.804, -0.878 };
+ int lda = 3;
+ double B[] = { 0.46, -0.508, 0.918, -0.516, 0.012, -0.451, -0.676, 0.551, -0.38, 0.053, 0.645, 0.785 };
+ int ldb = 3;
+ double B_expected[] = { 0.0508, 0.046, 0.0739304, 0.0470256, 0.0992176528, 0.0480511088, -0.0551, -0.0676, -0.0419681, 0.0140525, -0.112456492, 0.0121429348 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1977) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1977) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int trans = 113;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0.1};
+ double A[] = { 0.286, 0.548, 0.637, -0.856, -0.739, 0.307, -0.049, -0.342, -0.39, 0.618, -0.757, -0.453, -0.533, 0.131, 0.431, 0.087, -0.776, -0.439 };
+ int lda = 3;
+ double B[] = { 0.968, 0.032, 0.013, 0.684, -0.485, 0.613, 0.316, 0.812, -0.459, 0.34, -0.268, -0.565 };
+ int ldb = 2;
+ double B_expected[] = { -0.126374952238, 0.0484874156039, -0.0755178690743, -0.200973083054, 0.138328459491, -0.0263170966956, 0.00492064241274, -0.0787874374991, 0.00784239970713, 0.0635860998343, -0.0699577429529, -0.00504052726328 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1978) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1978) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 121;
+ int trans = 113;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0.1};
+ double A[] = { -0.911, 0.645, -0.525, 0.045, -0.654, -0.896, -0.39, 0.419, 0.867, 0.561, -0.842, -0.835, -0.249, -0.384, 0.575, -0.41, 0.105, -0.282 };
+ int lda = 3;
+ double B[] = { 0.777, 0.361, 0.535, 0.441, 0.508, 0.439, -0.347, 0.131, -0.874, 0.646, 0.917, 0.746 };
+ int ldb = 2;
+ double B_expected[] = { -0.155796389, 0.112639999, 0.0226368685, 0.111048763, -0.042589, 0.127541, 0.067392, -0.0568415, -0.0646, -0.0874, -0.0746, 0.0917 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1979) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1979) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int trans = 113;
+ int diag = 131;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0.1};
+ double A[] = { -0.519, 0.318, -0.318, 0.73, 0.721, 0.302, -0.604, 0.721, 0.387, 0.673, -0.549, -0.136, 0.101, 0.676, -0.064, -0.659, -0.141, 0.991 };
+ int lda = 3;
+ double B[] = { -0.856, -0.128, 0.721, -0.511, 0.175, -0.341, 0.832, -0.662, 0.652, -0.939, -0.775, -0.899 };
+ int ldb = 2;
+ double B_expected[] = { 0.055542329649, 0.130900846188, -0.133470180979, -0.0571415846795, -0.13942012508, 0.0150972236507, 0.0782230770838, 0.0522994181773, -0.00621452256957, -0.0615971232698, 0.0222285648871, 0.258910370231 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1980) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1980) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int side = 142;
+ int uplo = 122;
+ int trans = 113;
+ int diag = 132;
+ int M = 2;
+ int N = 3;
+ double alpha[2] = {0, 0.1};
+ double A[] = { -0.092, -0.392, 0.108, -0.918, 0.505, -0.974, 0.213, 0.97, -0.465, 0.604, -0.737, -0.578, -0.051, -0.43, 0.066, -0.934, -0.347, 0.157 };
+ int lda = 3;
+ double B[] = { -0.489, 0.673, -0.232, 0.668, -0.396, -0.569, 0.763, 0.581, 0.117, -0.249, 0.272, -0.832 };
+ int ldb = 2;
+ double B_expected[] = { -0.0673, -0.0489, -0.0668, -0.0232, 0.0192782, 0.0274626, -0.0721832, 0.140128, 0.0413393162, 0.1110418366, 0.1221321656, 0.2489754256 };
+ cblas_ztrsm(order, side, uplo, trans, diag, M, N, alpha, A, lda, B, ldb);
+ {
+ int i;
+ for (i = 0; i < 6; i++) {
+ gsl_test_rel(B[2*i], B_expected[2*i], dbleps, "ztrsm(case 1981) real");
+ gsl_test_rel(B[2*i+1], B_expected[2*i+1], dbleps, "ztrsm(case 1981) imag");
+ };
+ };
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/test_trsv.c b/gsl-1.9/cblas/test_trsv.c
new file mode 100644
index 0000000..39f5083
--- /dev/null
+++ b/gsl-1.9/cblas/test_trsv.c
@@ -0,0 +1,1739 @@
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+
+#include "tests.h"
+
+void
+test_trsv (void) {
+const double flteps = 1e-4, dbleps = 1e-6;
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.995f };
+ float X[] = { 0.348f };
+ int incX = -1;
+ float x_expected[] = { 0.349749f };
+ cblas_strsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "strsv(case 1150)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.995f };
+ float X[] = { 0.348f };
+ int incX = -1;
+ float x_expected[] = { 0.348f };
+ cblas_strsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "strsv(case 1151)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.995f };
+ float X[] = { 0.348f };
+ int incX = -1;
+ float x_expected[] = { 0.349749f };
+ cblas_strsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "strsv(case 1152)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.995f };
+ float X[] = { 0.348f };
+ int incX = -1;
+ float x_expected[] = { 0.348f };
+ cblas_strsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "strsv(case 1153)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.995f };
+ float X[] = { 0.348f };
+ int incX = -1;
+ float x_expected[] = { 0.349749f };
+ cblas_strsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "strsv(case 1154)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.995f };
+ float X[] = { 0.348f };
+ int incX = -1;
+ float x_expected[] = { 0.348f };
+ cblas_strsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "strsv(case 1155)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.995f };
+ float X[] = { 0.348f };
+ int incX = -1;
+ float x_expected[] = { 0.349749f };
+ cblas_strsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "strsv(case 1156)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.995f };
+ float X[] = { 0.348f };
+ int incX = -1;
+ float x_expected[] = { 0.348f };
+ cblas_strsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "strsv(case 1157)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.793f };
+ float X[] = { 0.338f };
+ int incX = -1;
+ float x_expected[] = { 0.42623f };
+ cblas_strsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "strsv(case 1158)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.793f };
+ float X[] = { 0.338f };
+ int incX = -1;
+ float x_expected[] = { 0.338f };
+ cblas_strsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "strsv(case 1159)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.793f };
+ float X[] = { 0.338f };
+ int incX = -1;
+ float x_expected[] = { 0.42623f };
+ cblas_strsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "strsv(case 1160)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.793f };
+ float X[] = { 0.338f };
+ int incX = -1;
+ float x_expected[] = { 0.338f };
+ cblas_strsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "strsv(case 1161)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.793f };
+ float X[] = { 0.338f };
+ int incX = -1;
+ float x_expected[] = { 0.42623f };
+ cblas_strsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "strsv(case 1162)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.793f };
+ float X[] = { 0.338f };
+ int incX = -1;
+ float x_expected[] = { 0.338f };
+ cblas_strsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "strsv(case 1163)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.793f };
+ float X[] = { 0.338f };
+ int incX = -1;
+ float x_expected[] = { 0.42623f };
+ cblas_strsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "strsv(case 1164)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.793f };
+ float X[] = { 0.338f };
+ int incX = -1;
+ float x_expected[] = { 0.338f };
+ cblas_strsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], flteps, "strsv(case 1165)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ double A[] = { -0.21 };
+ double X[] = { 0.473 };
+ int incX = -1;
+ double x_expected[] = { -2.25238095238 };
+ cblas_dtrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtrsv(case 1166)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ double A[] = { -0.21 };
+ double X[] = { 0.473 };
+ int incX = -1;
+ double x_expected[] = { 0.473 };
+ cblas_dtrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtrsv(case 1167)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ double A[] = { -0.21 };
+ double X[] = { 0.473 };
+ int incX = -1;
+ double x_expected[] = { -2.25238095238 };
+ cblas_dtrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtrsv(case 1168)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ double A[] = { -0.21 };
+ double X[] = { 0.473 };
+ int incX = -1;
+ double x_expected[] = { 0.473 };
+ cblas_dtrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtrsv(case 1169)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ double A[] = { -0.21 };
+ double X[] = { 0.473 };
+ int incX = -1;
+ double x_expected[] = { -2.25238095238 };
+ cblas_dtrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtrsv(case 1170)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ double A[] = { -0.21 };
+ double X[] = { 0.473 };
+ int incX = -1;
+ double x_expected[] = { 0.473 };
+ cblas_dtrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtrsv(case 1171)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ double A[] = { -0.21 };
+ double X[] = { 0.473 };
+ int incX = -1;
+ double x_expected[] = { -2.25238095238 };
+ cblas_dtrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtrsv(case 1172)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ double A[] = { -0.21 };
+ double X[] = { 0.473 };
+ int incX = -1;
+ double x_expected[] = { 0.473 };
+ cblas_dtrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtrsv(case 1173)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.748 };
+ double X[] = { 0.979 };
+ int incX = -1;
+ double x_expected[] = { 1.30882352941 };
+ cblas_dtrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtrsv(case 1174)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.748 };
+ double X[] = { 0.979 };
+ int incX = -1;
+ double x_expected[] = { 0.979 };
+ cblas_dtrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtrsv(case 1175)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.748 };
+ double X[] = { 0.979 };
+ int incX = -1;
+ double x_expected[] = { 1.30882352941 };
+ cblas_dtrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtrsv(case 1176)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.748 };
+ double X[] = { 0.979 };
+ int incX = -1;
+ double x_expected[] = { 0.979 };
+ cblas_dtrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtrsv(case 1177)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.748 };
+ double X[] = { 0.979 };
+ int incX = -1;
+ double x_expected[] = { 1.30882352941 };
+ cblas_dtrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtrsv(case 1178)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.748 };
+ double X[] = { 0.979 };
+ int incX = -1;
+ double x_expected[] = { 0.979 };
+ cblas_dtrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtrsv(case 1179)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.748 };
+ double X[] = { 0.979 };
+ int incX = -1;
+ double x_expected[] = { 1.30882352941 };
+ cblas_dtrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtrsv(case 1180)");
+ }
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.748 };
+ double X[] = { 0.979 };
+ int incX = -1;
+ double x_expected[] = { 0.979 };
+ cblas_dtrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[i], x_expected[i], dbleps, "dtrsv(case 1181)");
+ }
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.529f, -0.348f };
+ float X[] = { -0.95f, 0.343f };
+ int incX = -1;
+ float x_expected[] = { -1.55112f, -0.372004f };
+ cblas_ctrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrsv(case 1182) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrsv(case 1182) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.529f, -0.348f };
+ float X[] = { -0.95f, 0.343f };
+ int incX = -1;
+ float x_expected[] = { -0.95f, 0.343f };
+ cblas_ctrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrsv(case 1183) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrsv(case 1183) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.529f, -0.348f };
+ float X[] = { -0.95f, 0.343f };
+ int incX = -1;
+ float x_expected[] = { -1.55112f, -0.372004f };
+ cblas_ctrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrsv(case 1184) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrsv(case 1184) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.529f, -0.348f };
+ float X[] = { -0.95f, 0.343f };
+ int incX = -1;
+ float x_expected[] = { -0.95f, 0.343f };
+ cblas_ctrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrsv(case 1185) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrsv(case 1185) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.529f, -0.348f };
+ float X[] = { -0.95f, 0.343f };
+ int incX = -1;
+ float x_expected[] = { -1.55112f, -0.372004f };
+ cblas_ctrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrsv(case 1186) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrsv(case 1186) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.529f, -0.348f };
+ float X[] = { -0.95f, 0.343f };
+ int incX = -1;
+ float x_expected[] = { -0.95f, 0.343f };
+ cblas_ctrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrsv(case 1187) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrsv(case 1187) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.529f, -0.348f };
+ float X[] = { -0.95f, 0.343f };
+ int incX = -1;
+ float x_expected[] = { -1.55112f, -0.372004f };
+ cblas_ctrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrsv(case 1188) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrsv(case 1188) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.529f, -0.348f };
+ float X[] = { -0.95f, 0.343f };
+ int incX = -1;
+ float x_expected[] = { -0.95f, 0.343f };
+ cblas_ctrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrsv(case 1189) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrsv(case 1189) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.6f, 0.041f };
+ float X[] = { 0.896f, -0.447f };
+ int incX = -1;
+ float x_expected[] = { 1.43572f, -0.843108f };
+ cblas_ctrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrsv(case 1190) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrsv(case 1190) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.6f, 0.041f };
+ float X[] = { 0.896f, -0.447f };
+ int incX = -1;
+ float x_expected[] = { 0.896f, -0.447f };
+ cblas_ctrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrsv(case 1191) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrsv(case 1191) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.6f, 0.041f };
+ float X[] = { 0.896f, -0.447f };
+ int incX = -1;
+ float x_expected[] = { 1.43572f, -0.843108f };
+ cblas_ctrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrsv(case 1192) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrsv(case 1192) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.6f, 0.041f };
+ float X[] = { 0.896f, -0.447f };
+ int incX = -1;
+ float x_expected[] = { 0.896f, -0.447f };
+ cblas_ctrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrsv(case 1193) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrsv(case 1193) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.6f, 0.041f };
+ float X[] = { 0.896f, -0.447f };
+ int incX = -1;
+ float x_expected[] = { 1.43572f, -0.843108f };
+ cblas_ctrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrsv(case 1194) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrsv(case 1194) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.6f, 0.041f };
+ float X[] = { 0.896f, -0.447f };
+ int incX = -1;
+ float x_expected[] = { 0.896f, -0.447f };
+ cblas_ctrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrsv(case 1195) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrsv(case 1195) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.6f, 0.041f };
+ float X[] = { 0.896f, -0.447f };
+ int incX = -1;
+ float x_expected[] = { 1.43572f, -0.843108f };
+ cblas_ctrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrsv(case 1196) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrsv(case 1196) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.6f, 0.041f };
+ float X[] = { 0.896f, -0.447f };
+ int incX = -1;
+ float x_expected[] = { 0.896f, -0.447f };
+ cblas_ctrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrsv(case 1197) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrsv(case 1197) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.397f, 0.683f };
+ float X[] = { 0.765f, 0.18f };
+ int incX = -1;
+ float x_expected[] = { 0.289642f, 0.951701f };
+ cblas_ctrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrsv(case 1198) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrsv(case 1198) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.397f, 0.683f };
+ float X[] = { 0.765f, 0.18f };
+ int incX = -1;
+ float x_expected[] = { 0.765f, 0.18f };
+ cblas_ctrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrsv(case 1199) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrsv(case 1199) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.397f, 0.683f };
+ float X[] = { 0.765f, 0.18f };
+ int incX = -1;
+ float x_expected[] = { 0.289642f, 0.951701f };
+ cblas_ctrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrsv(case 1200) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrsv(case 1200) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.397f, 0.683f };
+ float X[] = { 0.765f, 0.18f };
+ int incX = -1;
+ float x_expected[] = { 0.765f, 0.18f };
+ cblas_ctrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrsv(case 1201) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrsv(case 1201) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.397f, 0.683f };
+ float X[] = { 0.765f, 0.18f };
+ int incX = -1;
+ float x_expected[] = { 0.289642f, 0.951701f };
+ cblas_ctrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrsv(case 1202) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrsv(case 1202) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.397f, 0.683f };
+ float X[] = { 0.765f, 0.18f };
+ int incX = -1;
+ float x_expected[] = { 0.765f, 0.18f };
+ cblas_ctrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrsv(case 1203) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrsv(case 1203) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.397f, 0.683f };
+ float X[] = { 0.765f, 0.18f };
+ int incX = -1;
+ float x_expected[] = { 0.289642f, 0.951701f };
+ cblas_ctrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrsv(case 1204) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrsv(case 1204) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ float A[] = { 0.397f, 0.683f };
+ float X[] = { 0.765f, 0.18f };
+ int incX = -1;
+ float x_expected[] = { 0.765f, 0.18f };
+ cblas_ctrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], flteps, "ctrsv(case 1205) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], flteps, "ctrsv(case 1205) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.977, -0.955 };
+ double X[] = { -0.627, 0.281 };
+ int incX = -1;
+ double x_expected[] = { -0.471957414573, -0.173714770642 };
+ cblas_ztrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrsv(case 1206) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrsv(case 1206) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.977, -0.955 };
+ double X[] = { -0.627, 0.281 };
+ int incX = -1;
+ double x_expected[] = { -0.627, 0.281 };
+ cblas_ztrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrsv(case 1207) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrsv(case 1207) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.977, -0.955 };
+ double X[] = { -0.627, 0.281 };
+ int incX = -1;
+ double x_expected[] = { -0.471957414573, -0.173714770642 };
+ cblas_ztrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrsv(case 1208) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrsv(case 1208) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.977, -0.955 };
+ double X[] = { -0.627, 0.281 };
+ int incX = -1;
+ double x_expected[] = { -0.627, 0.281 };
+ cblas_ztrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrsv(case 1209) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrsv(case 1209) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.977, -0.955 };
+ double X[] = { -0.627, 0.281 };
+ int incX = -1;
+ double x_expected[] = { -0.471957414573, -0.173714770642 };
+ cblas_ztrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrsv(case 1210) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrsv(case 1210) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 121;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.977, -0.955 };
+ double X[] = { -0.627, 0.281 };
+ int incX = -1;
+ double x_expected[] = { -0.627, 0.281 };
+ cblas_ztrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrsv(case 1211) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrsv(case 1211) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.977, -0.955 };
+ double X[] = { -0.627, 0.281 };
+ int incX = -1;
+ double x_expected[] = { -0.471957414573, -0.173714770642 };
+ cblas_ztrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrsv(case 1212) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrsv(case 1212) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 111;
+ int uplo = 122;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.977, -0.955 };
+ double X[] = { -0.627, 0.281 };
+ int incX = -1;
+ double x_expected[] = { -0.627, 0.281 };
+ cblas_ztrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrsv(case 1213) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrsv(case 1213) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.076, -0.16 };
+ double X[] = { 0.3, -0.874 };
+ int incX = -1;
+ double x_expected[] = { 5.18357980622, -0.587200407955 };
+ cblas_ztrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrsv(case 1214) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrsv(case 1214) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.076, -0.16 };
+ double X[] = { 0.3, -0.874 };
+ int incX = -1;
+ double x_expected[] = { 0.3, -0.874 };
+ cblas_ztrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrsv(case 1215) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrsv(case 1215) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.076, -0.16 };
+ double X[] = { 0.3, -0.874 };
+ int incX = -1;
+ double x_expected[] = { 5.18357980622, -0.587200407955 };
+ cblas_ztrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrsv(case 1216) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrsv(case 1216) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.076, -0.16 };
+ double X[] = { 0.3, -0.874 };
+ int incX = -1;
+ double x_expected[] = { 0.3, -0.874 };
+ cblas_ztrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrsv(case 1217) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrsv(case 1217) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.076, -0.16 };
+ double X[] = { 0.3, -0.874 };
+ int incX = -1;
+ double x_expected[] = { 5.18357980622, -0.587200407955 };
+ cblas_ztrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrsv(case 1218) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrsv(case 1218) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 121;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.076, -0.16 };
+ double X[] = { 0.3, -0.874 };
+ int incX = -1;
+ double x_expected[] = { 0.3, -0.874 };
+ cblas_ztrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrsv(case 1219) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrsv(case 1219) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.076, -0.16 };
+ double X[] = { 0.3, -0.874 };
+ int incX = -1;
+ double x_expected[] = { 5.18357980622, -0.587200407955 };
+ cblas_ztrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrsv(case 1220) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrsv(case 1220) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 112;
+ int uplo = 122;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.076, -0.16 };
+ double X[] = { 0.3, -0.874 };
+ int incX = -1;
+ double x_expected[] = { 0.3, -0.874 };
+ cblas_ztrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrsv(case 1221) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrsv(case 1221) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.372, -0.745 };
+ double X[] = { -0.085, -0.303 };
+ int incX = -1;
+ double x_expected[] = { -0.371144591432, -0.0712292456544 };
+ cblas_ztrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrsv(case 1222) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrsv(case 1222) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.372, -0.745 };
+ double X[] = { -0.085, -0.303 };
+ int incX = -1;
+ double x_expected[] = { -0.085, -0.303 };
+ cblas_ztrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrsv(case 1223) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrsv(case 1223) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.372, -0.745 };
+ double X[] = { -0.085, -0.303 };
+ int incX = -1;
+ double x_expected[] = { -0.371144591432, -0.0712292456544 };
+ cblas_ztrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrsv(case 1224) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrsv(case 1224) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 101;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.372, -0.745 };
+ double X[] = { -0.085, -0.303 };
+ int incX = -1;
+ double x_expected[] = { -0.085, -0.303 };
+ cblas_ztrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrsv(case 1225) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrsv(case 1225) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.372, -0.745 };
+ double X[] = { -0.085, -0.303 };
+ int incX = -1;
+ double x_expected[] = { -0.371144591432, -0.0712292456544 };
+ cblas_ztrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrsv(case 1226) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrsv(case 1226) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 121;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.372, -0.745 };
+ double X[] = { -0.085, -0.303 };
+ int incX = -1;
+ double x_expected[] = { -0.085, -0.303 };
+ cblas_ztrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrsv(case 1227) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrsv(case 1227) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 131;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.372, -0.745 };
+ double X[] = { -0.085, -0.303 };
+ int incX = -1;
+ double x_expected[] = { -0.371144591432, -0.0712292456544 };
+ cblas_ztrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrsv(case 1228) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrsv(case 1228) imag");
+ };
+ };
+ };
+
+
+ {
+ int order = 102;
+ int trans = 113;
+ int uplo = 122;
+ int diag = 132;
+ int N = 1;
+ int lda = 1;
+ double A[] = { 0.372, -0.745 };
+ double X[] = { -0.085, -0.303 };
+ int incX = -1;
+ double x_expected[] = { -0.085, -0.303 };
+ cblas_ztrsv(order, uplo, trans, diag, N, A, lda, X, incX);
+ {
+ int i;
+ for (i = 0; i < 1; i++) {
+ gsl_test_rel(X[2*i], x_expected[2*i], dbleps, "ztrsv(case 1229) real");
+ gsl_test_rel(X[2*i+1], x_expected[2*i+1], dbleps, "ztrsv(case 1229) imag");
+ };
+ };
+ };
+
+
+}
diff --git a/gsl-1.9/cblas/tests.c b/gsl-1.9/cblas/tests.c
new file mode 100644
index 0000000..af00945
--- /dev/null
+++ b/gsl-1.9/cblas/tests.c
@@ -0,0 +1,44 @@
+ test_dot ();
+ test_nrm2 ();
+ test_asum ();
+ test_amax ();
+ test_axpy ();
+ test_copy ();
+ test_swap ();
+ test_scal ();
+ test_rotg ();
+ test_rot ();
+ test_rotmg ();
+ test_rotm ();
+ test_gemv ();
+ test_gbmv ();
+ test_trmv ();
+ test_tbmv ();
+ test_tpmv ();
+ test_symv ();
+ test_hemv ();
+ test_hbmv ();
+ test_sbmv ();
+ test_hpmv ();
+ test_spmv ();
+ test_trsv ();
+ test_tbsv ();
+ test_tpsv ();
+ test_ger ();
+ test_syr ();
+ test_her ();
+ test_hpr ();
+ test_spr ();
+ test_syr2 ();
+ test_spr2 ();
+ test_her2 ();
+ test_hpr2 ();
+ test_gemm ();
+ test_symm ();
+ test_hemm ();
+ test_syrk ();
+ test_herk ();
+ test_syr2k ();
+ test_her2k ();
+ test_trmm ();
+ test_trsm ();
diff --git a/gsl-1.9/cblas/tests.h b/gsl-1.9/cblas/tests.h
new file mode 100644
index 0000000..9bfb0fa
--- /dev/null
+++ b/gsl-1.9/cblas/tests.h
@@ -0,0 +1,44 @@
+void test_dot (void);
+void test_nrm2 (void);
+void test_asum (void);
+void test_amax (void);
+void test_axpy (void);
+void test_copy (void);
+void test_swap (void);
+void test_scal (void);
+void test_rotg (void);
+void test_rot (void);
+void test_rotmg (void);
+void test_rotm (void);
+void test_gemv (void);
+void test_gbmv (void);
+void test_trmv (void);
+void test_tbmv (void);
+void test_tpmv (void);
+void test_symv (void);
+void test_hemv (void);
+void test_hbmv (void);
+void test_sbmv (void);
+void test_hpmv (void);
+void test_spmv (void);
+void test_trsv (void);
+void test_tbsv (void);
+void test_tpsv (void);
+void test_ger (void);
+void test_syr (void);
+void test_her (void);
+void test_hpr (void);
+void test_spr (void);
+void test_syr2 (void);
+void test_spr2 (void);
+void test_her2 (void);
+void test_hpr2 (void);
+void test_gemm (void);
+void test_symm (void);
+void test_hemm (void);
+void test_syrk (void);
+void test_herk (void);
+void test_syr2k (void);
+void test_her2k (void);
+void test_trmm (void);
+void test_trsm (void);
diff --git a/gsl-1.9/cblas/xerbla.c b/gsl-1.9/cblas/xerbla.c
new file mode 100644
index 0000000..3991641
--- /dev/null
+++ b/gsl-1.9/cblas/xerbla.c
@@ -0,0 +1,44 @@
+/* xerbla.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_xerbla (int p, const char *rout, const char *form, ...)
+{
+ va_list ap;
+
+ va_start (ap, form);
+
+ if (p)
+ {
+ fprintf (stderr, "Parameter %d to routine %s was incorrect\n", p, rout);
+ }
+
+ vfprintf (stderr, form, ap);
+ va_end (ap);
+
+ abort ();
+}
diff --git a/gsl-1.9/cblas/zaxpy.c b/gsl-1.9/cblas/zaxpy.c
new file mode 100644
index 0000000..d648401
--- /dev/null
+++ b/gsl-1.9/cblas/zaxpy.c
@@ -0,0 +1,12 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_zaxpy (const int N, const void *alpha, const void *X, const int incX,
+ void *Y, const int incY)
+{
+#define BASE double
+#include "source_axpy_c.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/zcopy.c b/gsl-1.9/cblas/zcopy.c
new file mode 100644
index 0000000..5e80eb4
--- /dev/null
+++ b/gsl-1.9/cblas/zcopy.c
@@ -0,0 +1,12 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_zcopy (const int N, const void *X, const int incX, void *Y,
+ const int incY)
+{
+#define BASE double
+#include "source_copy_c.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/zdotc_sub.c b/gsl-1.9/cblas/zdotc_sub.c
new file mode 100644
index 0000000..43af96e
--- /dev/null
+++ b/gsl-1.9/cblas/zdotc_sub.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_zdotc_sub (const int N, const void *X, const int incX, const void *Y,
+ const int incY, void *result)
+{
+#define BASE double
+#define CONJ_SIGN (-1.0)
+#include "source_dot_c.h"
+#undef CONJ_SIGN
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/zdotu_sub.c b/gsl-1.9/cblas/zdotu_sub.c
new file mode 100644
index 0000000..65b9898
--- /dev/null
+++ b/gsl-1.9/cblas/zdotu_sub.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_zdotu_sub (const int N, const void *X, const int incX, const void *Y,
+ const int incY, void *result)
+{
+#define BASE double
+#define CONJ_SIGN 1.0
+#include "source_dot_c.h"
+#undef CONJ_SIGN
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/zdscal.c b/gsl-1.9/cblas/zdscal.c
new file mode 100644
index 0000000..6167664
--- /dev/null
+++ b/gsl-1.9/cblas/zdscal.c
@@ -0,0 +1,11 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_zdscal (const int N, const double alpha, void *X, const int incX)
+{
+#define BASE double
+#include "source_scal_c_s.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/zgbmv.c b/gsl-1.9/cblas/zgbmv.c
new file mode 100644
index 0000000..dc87576
--- /dev/null
+++ b/gsl-1.9/cblas/zgbmv.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_zgbmv (const enum CBLAS_ORDER order, const enum CBLAS_TRANSPOSE TransA,
+ const int M, const int N, const int KL, const int KU,
+ const void *alpha, const void *A, const int lda, const void *X,
+ const int incX, const void *beta, void *Y, const int incY)
+{
+#define BASE double
+#include "source_gbmv_c.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/zgemm.c b/gsl-1.9/cblas/zgemm.c
new file mode 100644
index 0000000..2046558
--- /dev/null
+++ b/gsl-1.9/cblas/zgemm.c
@@ -0,0 +1,15 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_zgemm (const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA,
+ const enum CBLAS_TRANSPOSE TransB, const int M, const int N,
+ const int K, const void *alpha, const void *A, const int lda,
+ const void *B, const int ldb, const void *beta, void *C,
+ const int ldc)
+{
+#define BASE double
+#include "source_gemm_c.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/zgemv.c b/gsl-1.9/cblas/zgemv.c
new file mode 100644
index 0000000..41eca39
--- /dev/null
+++ b/gsl-1.9/cblas/zgemv.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_zgemv (const enum CBLAS_ORDER order, const enum CBLAS_TRANSPOSE TransA,
+ const int M, const int N, const void *alpha, const void *A,
+ const int lda, const void *X, const int incX, const void *beta,
+ void *Y, const int incY)
+{
+#define BASE double
+#include "source_gemv_c.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/zgerc.c b/gsl-1.9/cblas/zgerc.c
new file mode 100644
index 0000000..9478c3c
--- /dev/null
+++ b/gsl-1.9/cblas/zgerc.c
@@ -0,0 +1,13 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_zgerc (const enum CBLAS_ORDER order, const int M, const int N,
+ const void *alpha, const void *X, const int incX, const void *Y,
+ const int incY, void *A, const int lda)
+{
+#define BASE double
+#include "source_gerc.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/zgeru.c b/gsl-1.9/cblas/zgeru.c
new file mode 100644
index 0000000..d0f4b96
--- /dev/null
+++ b/gsl-1.9/cblas/zgeru.c
@@ -0,0 +1,13 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_zgeru (const enum CBLAS_ORDER order, const int M, const int N,
+ const void *alpha, const void *X, const int incX, const void *Y,
+ const int incY, void *A, const int lda)
+{
+#define BASE double
+#include "source_geru.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/zhbmv.c b/gsl-1.9/cblas/zhbmv.c
new file mode 100644
index 0000000..25692ca
--- /dev/null
+++ b/gsl-1.9/cblas/zhbmv.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_zhbmv (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const int K, const void *alpha, const void *A,
+ const int lda, const void *X, const int incX, const void *beta,
+ void *Y, const int incY)
+{
+#define BASE double
+#include "source_hbmv.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/zhemm.c b/gsl-1.9/cblas/zhemm.c
new file mode 100644
index 0000000..d6b69fe
--- /dev/null
+++ b/gsl-1.9/cblas/zhemm.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_zhemm (const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
+ const enum CBLAS_UPLO Uplo, const int M, const int N,
+ const void *alpha, const void *A, const int lda, const void *B,
+ const int ldb, const void *beta, void *C, const int ldc)
+{
+#define BASE double
+#include "source_hemm.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/zhemv.c b/gsl-1.9/cblas/zhemv.c
new file mode 100644
index 0000000..5bc76fa
--- /dev/null
+++ b/gsl-1.9/cblas/zhemv.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_zhemv (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const void *alpha, const void *A, const int lda,
+ const void *X, const int incX, const void *beta, void *Y,
+ const int incY)
+{
+#define BASE double
+#include "source_hemv.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/zher.c b/gsl-1.9/cblas/zher.c
new file mode 100644
index 0000000..c3e3a6e
--- /dev/null
+++ b/gsl-1.9/cblas/zher.c
@@ -0,0 +1,13 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_zher (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const double alpha, const void *X, const int incX,
+ void *A, const int lda)
+{
+#define BASE double
+#include "source_her.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/zher2.c b/gsl-1.9/cblas/zher2.c
new file mode 100644
index 0000000..db7e1e6
--- /dev/null
+++ b/gsl-1.9/cblas/zher2.c
@@ -0,0 +1,13 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_zher2 (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const void *alpha, const void *X, const int incX,
+ const void *Y, const int incY, void *A, const int lda)
+{
+#define BASE double
+#include "source_her2.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/zher2k.c b/gsl-1.9/cblas/zher2k.c
new file mode 100644
index 0000000..be73ab4
--- /dev/null
+++ b/gsl-1.9/cblas/zher2k.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_zher2k (const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
+ const void *alpha, const void *A, const int lda, const void *B,
+ const int ldb, const double beta, void *C, const int ldc)
+{
+#define BASE double
+#include "source_her2k.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/zherk.c b/gsl-1.9/cblas/zherk.c
new file mode 100644
index 0000000..ccfd1d9
--- /dev/null
+++ b/gsl-1.9/cblas/zherk.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_zherk (const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
+ const double alpha, const void *A, const int lda,
+ const double beta, void *C, const int ldc)
+{
+#define BASE double
+#include "source_herk.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/zhpmv.c b/gsl-1.9/cblas/zhpmv.c
new file mode 100644
index 0000000..518c264
--- /dev/null
+++ b/gsl-1.9/cblas/zhpmv.c
@@ -0,0 +1,13 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_zhpmv (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const void *alpha, const void *Ap, const void *X,
+ const int incX, const void *beta, void *Y, const int incY)
+{
+#define BASE double
+#include "source_hpmv.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/zhpr.c b/gsl-1.9/cblas/zhpr.c
new file mode 100644
index 0000000..964e3af
--- /dev/null
+++ b/gsl-1.9/cblas/zhpr.c
@@ -0,0 +1,13 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_zhpr (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const double alpha, const void *X, const int incX,
+ void *Ap)
+{
+#define BASE double
+#include "source_hpr.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/zhpr2.c b/gsl-1.9/cblas/zhpr2.c
new file mode 100644
index 0000000..971af91
--- /dev/null
+++ b/gsl-1.9/cblas/zhpr2.c
@@ -0,0 +1,13 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_zhpr2 (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const int N, const void *alpha, const void *X, const int incX,
+ const void *Y, const int incY, void *Ap)
+{
+#define BASE double
+#include "source_hpr2.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/zscal.c b/gsl-1.9/cblas/zscal.c
new file mode 100644
index 0000000..2667743
--- /dev/null
+++ b/gsl-1.9/cblas/zscal.c
@@ -0,0 +1,11 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_zscal (const int N, const void *alpha, void *X, const int incX)
+{
+#define BASE double
+#include "source_scal_c.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/zswap.c b/gsl-1.9/cblas/zswap.c
new file mode 100644
index 0000000..9cf6796
--- /dev/null
+++ b/gsl-1.9/cblas/zswap.c
@@ -0,0 +1,11 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_zswap (const int N, void *X, const int incX, void *Y, const int incY)
+{
+#define BASE double
+#include "source_swap_c.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/zsymm.c b/gsl-1.9/cblas/zsymm.c
new file mode 100644
index 0000000..dcc6d2f
--- /dev/null
+++ b/gsl-1.9/cblas/zsymm.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_zsymm (const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
+ const enum CBLAS_UPLO Uplo, const int M, const int N,
+ const void *alpha, const void *A, const int lda, const void *B,
+ const int ldb, const void *beta, void *C, const int ldc)
+{
+#define BASE double
+#include "source_symm_c.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/zsyr2k.c b/gsl-1.9/cblas/zsyr2k.c
new file mode 100644
index 0000000..68fe0c5
--- /dev/null
+++ b/gsl-1.9/cblas/zsyr2k.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_zsyr2k (const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
+ const void *alpha, const void *A, const int lda, const void *B,
+ const int ldb, const void *beta, void *C, const int ldc)
+{
+#define BASE double
+#include "source_syr2k_c.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/zsyrk.c b/gsl-1.9/cblas/zsyrk.c
new file mode 100644
index 0000000..6593642
--- /dev/null
+++ b/gsl-1.9/cblas/zsyrk.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_zsyrk (const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
+ const void *alpha, const void *A, const int lda,
+ const void *beta, void *C, const int ldc)
+{
+#define BASE double
+#include "source_syrk_c.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/ztbmv.c b/gsl-1.9/cblas/ztbmv.c
new file mode 100644
index 0000000..b3510e8
--- /dev/null
+++ b/gsl-1.9/cblas/ztbmv.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_ztbmv (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const int K, const void *A, const int lda, void *X,
+ const int incX)
+{
+#define BASE double
+#include "source_tbmv_c.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/ztbsv.c b/gsl-1.9/cblas/ztbsv.c
new file mode 100644
index 0000000..b9f35e5
--- /dev/null
+++ b/gsl-1.9/cblas/ztbsv.c
@@ -0,0 +1,16 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+#include "hypot.c"
+
+void
+cblas_ztbsv (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const int K, const void *A, const int lda, void *X,
+ const int incX)
+{
+#define BASE double
+#include "source_tbsv_c.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/ztpmv.c b/gsl-1.9/cblas/ztpmv.c
new file mode 100644
index 0000000..be6dee3
--- /dev/null
+++ b/gsl-1.9/cblas/ztpmv.c
@@ -0,0 +1,13 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_ztpmv (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const void *Ap, void *X, const int incX)
+{
+#define BASE double
+#include "source_tpmv_c.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/ztpsv.c b/gsl-1.9/cblas/ztpsv.c
new file mode 100644
index 0000000..c7ac791
--- /dev/null
+++ b/gsl-1.9/cblas/ztpsv.c
@@ -0,0 +1,15 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+#include "hypot.c"
+
+void
+cblas_ztpsv (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const void *Ap, void *X, const int incX)
+{
+#define BASE double
+#include "source_tpsv_c.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/ztrmm.c b/gsl-1.9/cblas/ztrmm.c
new file mode 100644
index 0000000..f55b1d2
--- /dev/null
+++ b/gsl-1.9/cblas/ztrmm.c
@@ -0,0 +1,15 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_ztrmm (const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
+ const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA,
+ const enum CBLAS_DIAG Diag, const int M, const int N,
+ const void *alpha, const void *A, const int lda, void *B,
+ const int ldb)
+{
+#define BASE double
+#include "source_trmm_c.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/ztrmv.c b/gsl-1.9/cblas/ztrmv.c
new file mode 100644
index 0000000..1ed58be
--- /dev/null
+++ b/gsl-1.9/cblas/ztrmv.c
@@ -0,0 +1,14 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+void
+cblas_ztrmv (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const void *A, const int lda, void *X,
+ const int incX)
+{
+#define BASE double
+#include "source_trmv_c.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/ztrsm.c b/gsl-1.9/cblas/ztrsm.c
new file mode 100644
index 0000000..b44b0e1
--- /dev/null
+++ b/gsl-1.9/cblas/ztrsm.c
@@ -0,0 +1,17 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+#include "hypot.c"
+
+void
+cblas_ztrsm (const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
+ const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA,
+ const enum CBLAS_DIAG Diag, const int M, const int N,
+ const void *alpha, const void *A, const int lda, void *B,
+ const int ldb)
+{
+#define BASE double
+#include "source_trsm_c.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cblas/ztrsv.c b/gsl-1.9/cblas/ztrsv.c
new file mode 100644
index 0000000..54d43ae
--- /dev/null
+++ b/gsl-1.9/cblas/ztrsv.c
@@ -0,0 +1,16 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cblas.h>
+#include "cblas.h"
+
+#include "hypot.c"
+
+void
+cblas_ztrsv (const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
+ const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+ const int N, const void *A, const int lda, void *X,
+ const int incX)
+{
+#define BASE double
+#include "source_trsv_c.h"
+#undef BASE
+}
diff --git a/gsl-1.9/cdf/ChangeLog b/gsl-1.9/cdf/ChangeLog
new file mode 100644
index 0000000..6b4dc47
--- /dev/null
+++ b/gsl-1.9/cdf/ChangeLog
@@ -0,0 +1,87 @@
+2007-01-23 Brian Gough <bjg@network-theory.co.uk>
+
+ * betainv.c (gsl_cdf_beta_Pinv): avoid generating a NaN for lx > 0
+
+2006-04-18 Brian Gough <bjg@network-theory.co.uk>
+
+ * betainv.c (gsl_cdf_beta_Qinv): fix prototype const
+
+2006-03-07 Brian Gough <bjg@network-theory.co.uk>
+
+ * poisson.c: added poisson cdf
+
+ * nbinomial.c: added negative binomial cdf
+
+ * hypergeometric.c: added hypergeometric cdf
+
+ * geometric.c: added geometric cdf
+
+ * binomial.c (gsl_cdf_binomial_Q): added binomial cdf
+
+ * test.c: added discrete function tests
+
+ * gamma.c (gsl_cdf_gamma_P, gsl_cdf_gamma_Q): clean up unused
+ code, ensure that branches make P+Q=1 always true
+
+ * fdistinv.c (gsl_cdf_fdist_Pinv): use P instead of p for consistency
+
+ * fdist.c (gsl_cdf_fdist_Q): use Q instead of P for consistency
+
+ * beta.c (gsl_cdf_beta_Q): use Q instead of P for consistency
+
+2006-02-27 Brian Gough <bjg@network-theory.co.uk>
+
+ * fdistinv.c (gsl_cdf_fdist_Pinv, gsl_cdf_fdist_Qinv): added
+ inverse functions
+
+ * betainv.c (gsl_cdf_beta_Pinv, gsl_cdf_beta_Qinv): added inverse
+ functions
+
+ * tdistinv.c (gsl_cdf_tdist_Qinv, gsl_cdf_tdist_Pinv): max 32
+ iterations, prevent infinite loop
+
+ * gammainv.c (gsl_cdf_gamma_Qinv, gsl_cdf_gamma_Pinv): max 32
+ iterations, prevent infinite loop
+
+2005-06-20 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c: removed tests using subnormal values, since they tend to
+ fail when extended precision registers are not available.
+
+2004-10-26 Brian Gough <bjg@network-theory.co.uk>
+
+ * exppow.c: added exppow distribution
+
+2004-10-01 Brian Gough <bjg@network-theory.co.uk>
+
+ * beta.c (gsl_cdf_beta_P, gsl_cdf_beta_P): return consistent
+ results for out of range values.
+
+2003-08-27 Brian Gough <bjg@network-theory.co.uk>
+
+ * gauss.c: use parentheses around constant macros to avoid -(-X)
+ being interpreted as --X
+
+2003-07-27 Brian Gough <bjg@network-theory.co.uk>
+
+ * gumbel1.c (gsl_cdf_gumbel1_Q): use pow in place of exp since
+ compilers seem to handle overflow better in this case (perhaps
+ because it is not an intrinsic function).
+
+ * gumbel2.c (gsl_cdf_gumbel2_P): handle case of x = 0 explicitly
+ (gsl_cdf_gumbel2_Q): handle case of x = 0 explicitly
+
+2003-07-22 Brian Gough <bjg@network-theory.co.uk>
+
+ * gamma.c (gsl_cdf_gamma_P): Peizer and Pratt approximation for
+ large a seems to be inaccurate in tails
+ (gsl_cdf_gamma_Q): Peizer and Pratt approximation for large a
+ seems to be inaccurate in tails
+
+ * test.c (main): added test for large a for gamma
+
+ * cauchyinv.c (gsl_cdf_cauchy_Qinv): corrected limiting value for
+ Q=1
+
+ * added Cumulative Distribution functions from savannah.gnu.org
+
diff --git a/gsl-1.9/cdf/Makefile.am b/gsl-1.9/cdf/Makefile.am
new file mode 100644
index 0000000..5e389d3
--- /dev/null
+++ b/gsl-1.9/cdf/Makefile.am
@@ -0,0 +1,17 @@
+## Process this file with automake to produce Makefile.in
+noinst_LTLIBRARIES = libgslcdf.la
+
+pkginclude_HEADERS= gsl_cdf.h
+
+INCLUDES= -I$(top_builddir)
+
+libgslcdf_la_SOURCES = beta.c betainv.c cauchy.c cauchyinv.c chisq.c chisqinv.c exponential.c exponentialinv.c exppow.c fdist.c fdistinv.c flat.c flatinv.c gamma.c gammainv.c gauss.c gaussinv.c gumbel1.c gumbel1inv.c gumbel2.c gumbel2inv.c laplace.c laplaceinv.c logistic.c logisticinv.c lognormal.c lognormalinv.c pareto.c paretoinv.c rayleigh.c rayleighinv.c tdist.c tdistinv.c weibull.c weibullinv.c binomial.c poisson.c geometric.c nbinomial.c pascal.c hypergeometric.c
+
+noinst_HEADERS = beta_inc.c rat_eval.h test_auto.c error.h
+
+TESTS = $(check_PROGRAMS)
+
+check_PROGRAMS = test
+
+test_SOURCES = test.c
+test_LDADD = libgslcdf.la ../randist/libgslrandist.la ../rng/libgslrng.la ../specfunc/libgslspecfunc.la ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
diff --git a/gsl-1.9/cdf/Makefile.in b/gsl-1.9/cdf/Makefile.in
new file mode 100644
index 0000000..b7cdb79
--- /dev/null
+++ b/gsl-1.9/cdf/Makefile.in
@@ -0,0 +1,554 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = test$(EXEEXT)
+subdir = cdf
+DIST_COMMON = $(noinst_HEADERS) $(pkginclude_HEADERS) \
+ $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgslcdf_la_LIBADD =
+am_libgslcdf_la_OBJECTS = beta.lo betainv.lo cauchy.lo cauchyinv.lo \
+ chisq.lo chisqinv.lo exponential.lo exponentialinv.lo \
+ exppow.lo fdist.lo fdistinv.lo flat.lo flatinv.lo gamma.lo \
+ gammainv.lo gauss.lo gaussinv.lo gumbel1.lo gumbel1inv.lo \
+ gumbel2.lo gumbel2inv.lo laplace.lo laplaceinv.lo logistic.lo \
+ logisticinv.lo lognormal.lo lognormalinv.lo pareto.lo \
+ paretoinv.lo rayleigh.lo rayleighinv.lo tdist.lo tdistinv.lo \
+ weibull.lo weibullinv.lo binomial.lo poisson.lo geometric.lo \
+ nbinomial.lo pascal.lo hypergeometric.lo
+libgslcdf_la_OBJECTS = $(am_libgslcdf_la_OBJECTS)
+am_test_OBJECTS = test.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = libgslcdf.la ../randist/libgslrandist.la \
+ ../rng/libgslrng.la ../specfunc/libgslspecfunc.la \
+ ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la \
+ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \
+ ../utils/libutils.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgslcdf_la_SOURCES) $(test_SOURCES)
+DIST_SOURCES = $(libgslcdf_la_SOURCES) $(test_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libgslcdf.la
+pkginclude_HEADERS = gsl_cdf.h
+INCLUDES = -I$(top_builddir)
+libgslcdf_la_SOURCES = beta.c betainv.c cauchy.c cauchyinv.c chisq.c chisqinv.c exponential.c exponentialinv.c exppow.c fdist.c fdistinv.c flat.c flatinv.c gamma.c gammainv.c gauss.c gaussinv.c gumbel1.c gumbel1inv.c gumbel2.c gumbel2inv.c laplace.c laplaceinv.c logistic.c logisticinv.c lognormal.c lognormalinv.c pareto.c paretoinv.c rayleigh.c rayleighinv.c tdist.c tdistinv.c weibull.c weibullinv.c binomial.c poisson.c geometric.c nbinomial.c pascal.c hypergeometric.c
+noinst_HEADERS = beta_inc.c rat_eval.h test_auto.c error.h
+TESTS = $(check_PROGRAMS)
+test_SOURCES = test.c
+test_LDADD = libgslcdf.la ../randist/libgslrandist.la ../rng/libgslrng.la ../specfunc/libgslspecfunc.la ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps cdf/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps cdf/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgslcdf.la: $(libgslcdf_la_OBJECTS) $(libgslcdf_la_DEPENDENCIES)
+ $(LINK) $(libgslcdf_la_LDFLAGS) $(libgslcdf_la_OBJECTS) $(libgslcdf_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkgincludeHEADERS
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/cdf/beta.c b/gsl-1.9/cdf/beta.c
new file mode 100644
index 0000000..524391d
--- /dev/null
+++ b/gsl-1.9/cdf/beta.c
@@ -0,0 +1,66 @@
+/* cdf/cdf_beta.c
+ *
+ * Copyright (C) 2003 Brian Gough.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_cdf.h>
+#include <gsl/gsl_sf_gamma.h>
+#include <gsl/gsl_math.h>
+
+#include "beta_inc.c"
+
+double
+gsl_cdf_beta_P (const double x, const double a, const double b)
+{
+ double P;
+
+ if (x <= 0.0 )
+ {
+ return 0.0;
+ }
+
+ if ( x >= 1.0 )
+ {
+ return 1.0;
+ }
+
+ P = beta_inc_AXPY (1.0, 0.0, a, b, x);
+
+ return P;
+}
+
+double
+gsl_cdf_beta_Q (const double x, const double a, const double b)
+{
+ double Q;
+
+ if ( x >= 1.0)
+ {
+ return 0.0;
+ }
+
+ if ( x <= 0.0 )
+ {
+ return 1.0;
+ }
+
+ Q = beta_inc_AXPY (-1.0, 1.0, a, b, x);
+
+ return Q;
+}
diff --git a/gsl-1.9/cdf/beta_inc.c b/gsl-1.9/cdf/beta_inc.c
new file mode 100644
index 0000000..8a0165a
--- /dev/null
+++ b/gsl-1.9/cdf/beta_inc.c
@@ -0,0 +1,177 @@
+/* specfunc/beta_inc.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+/* Modified for cdfs by Brian Gough, June 2003 */
+
+static double
+beta_cont_frac (const double a, const double b, const double x,
+ const double epsabs)
+{
+ const unsigned int max_iter = 512; /* control iterations */
+ const double cutoff = 2.0 * GSL_DBL_MIN; /* control the zero cutoff */
+ unsigned int iter_count = 0;
+ double cf;
+
+ /* standard initialization for continued fraction */
+ double num_term = 1.0;
+ double den_term = 1.0 - (a + b) * x / (a + 1.0);
+
+ if (fabs (den_term) < cutoff)
+ den_term = GSL_NAN;
+
+ den_term = 1.0 / den_term;
+ cf = den_term;
+
+ while (iter_count < max_iter)
+ {
+ const int k = iter_count + 1;
+ double coeff = k * (b - k) * x / (((a - 1.0) + 2 * k) * (a + 2 * k));
+ double delta_frac;
+
+ /* first step */
+ den_term = 1.0 + coeff * den_term;
+ num_term = 1.0 + coeff / num_term;
+
+ if (fabs (den_term) < cutoff)
+ den_term = GSL_NAN;
+
+ if (fabs (num_term) < cutoff)
+ num_term = GSL_NAN;
+
+ den_term = 1.0 / den_term;
+
+ delta_frac = den_term * num_term;
+ cf *= delta_frac;
+
+ coeff = -(a + k) * (a + b + k) * x / ((a + 2 * k) * (a + 2 * k + 1.0));
+
+ /* second step */
+ den_term = 1.0 + coeff * den_term;
+ num_term = 1.0 + coeff / num_term;
+
+ if (fabs (den_term) < cutoff)
+ den_term = GSL_NAN;
+
+ if (fabs (num_term) < cutoff)
+ num_term = GSL_NAN;
+
+ den_term = 1.0 / den_term;
+
+ delta_frac = den_term * num_term;
+ cf *= delta_frac;
+
+ if (fabs (delta_frac - 1.0) < 2.0 * GSL_DBL_EPSILON)
+ break;
+
+ if (cf * fabs (delta_frac - 1.0) < epsabs)
+ break;
+
+ ++iter_count;
+ }
+
+ if (iter_count >= max_iter)
+ return GSL_NAN;
+
+ return cf;
+}
+
+/* The function beta_inc_AXPY(A,Y,a,b,x) computes A * beta_inc(a,b,x)
+ + Y taking account of possible cancellations when using the
+ hypergeometric transformation beta_inc(a,b,x)=1-beta_inc(b,a,1-x).
+
+ It also adjusts the accuracy of beta_inc() to fit the overall
+ absolute error when A*beta_inc is added to Y. (e.g. if Y >>
+ A*beta_inc then the accuracy of beta_inc can be reduced) */
+
+static double
+beta_inc_AXPY (const double A, const double Y,
+ const double a, const double b, const double x)
+{
+ if (x == 0.0)
+ {
+ return A * 0 + Y;
+ }
+ else if (x == 1.0)
+ {
+ return A * 1 + Y;
+ }
+ else
+ {
+ double ln_beta = gsl_sf_lnbeta (a, b);
+ double ln_pre = -ln_beta + a * log (x) + b * log1p (-x);
+
+ double prefactor = exp (ln_pre);
+
+ if (x < (a + 1.0) / (a + b + 2.0))
+ {
+ /* Apply continued fraction directly. */
+ double epsabs = fabs (Y / (A * prefactor / a)) * GSL_DBL_EPSILON;
+
+ double cf = beta_cont_frac (a, b, x, epsabs);
+
+ return A * (prefactor * cf / a) + Y;
+ }
+ else
+ {
+ /* Apply continued fraction after hypergeometric transformation. */
+ double epsabs =
+ fabs ((A + Y) / (A * prefactor / b)) * GSL_DBL_EPSILON;
+ double cf = beta_cont_frac (b, a, 1.0 - x, epsabs);
+ double term = prefactor * cf / b;
+
+ if (A == -Y)
+ {
+ return -A * term;
+ }
+ else
+ {
+ return A * (1 - term) + Y;
+ }
+ }
+ }
+}
+
+/* Direct series evaluation for testing purposes only */
+
+#if 0
+static double
+beta_series (const double a, const double b, const double x,
+ const double epsabs)
+{
+ double f = x / (1 - x);
+ double c = (b - 1) / (a + 1) * f;
+ double s = 1;
+ double n = 0;
+
+ s += c;
+
+ do
+ {
+ n++;
+ c *= -f * (2 + n - b) / (2 + n + a);
+ s += c;
+ }
+ while (n < 512 && fabs (c) > GSL_DBL_EPSILON * fabs (s) + epsabs);
+
+ s /= (1 - x);
+
+ return s;
+}
+#endif
diff --git a/gsl-1.9/cdf/betainv.c b/gsl-1.9/cdf/betainv.c
new file mode 100644
index 0000000..b9fac7b
--- /dev/null
+++ b/gsl-1.9/cdf/betainv.c
@@ -0,0 +1,195 @@
+/* cdf/betainv.c
+ *
+ * Copyright (C) 2004 Free Software Foundation, Inc.
+ * Copyright (C) 2006 Brian Gough
+ * Written by Jason H. Stover.
+ * Modified for GSL by Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+/*
+ * Invert the Beta distribution.
+ *
+ * References:
+ *
+ * Roger W. Abernathy and Robert P. Smith. "Applying Series Expansion
+ * to the Inverse Beta Distribution to Find Percentiles of the
+ * F-Distribution," ACM Transactions on Mathematical Software, volume
+ * 19, number 4, December 1993, pages 474-480.
+ *
+ * G.W. Hill and A.W. Davis. "Generalized asymptotic expansions of a
+ * Cornish-Fisher type," Annals of Mathematical Statistics, volume 39,
+ * number 8, August 1968, pages 1264-1273.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_gamma.h>
+#include <gsl/gsl_cdf.h>
+#include <gsl/gsl_randist.h>
+
+#include "error.h"
+
+double
+gsl_cdf_beta_Pinv (const double P, const double a, const double b)
+{
+ double x, mean;
+
+ if (P < 0.0 || P > 1.0)
+ {
+ CDF_ERROR ("P must be in range 0 < P < 1", GSL_EDOM);
+ }
+
+ if (a < 0.0)
+ {
+ CDF_ERROR ("a < 0", GSL_EDOM);
+ }
+
+ if (b < 0.0)
+ {
+ CDF_ERROR ("b < 0", GSL_EDOM);
+ }
+
+ if (P == 0.0)
+ {
+ return 0.0;
+ }
+
+ if (P == 1.0)
+ {
+ return 1.0;
+ }
+
+ if (P > 0.5)
+ {
+ return gsl_cdf_beta_Qinv (1 - P, a, b);
+ }
+
+ mean = a / (a + b);
+
+ if (P < 0.1)
+ {
+ /* small x */
+
+ double lg_ab = gsl_sf_lngamma (a + b);
+ double lg_a = gsl_sf_lngamma (a);
+ double lg_b = gsl_sf_lngamma (b);
+
+ double lx = (log (a) + lg_a + lg_b - lg_ab + log (P)) / a;
+ if (lx <= 0) {
+ x = exp (lx); /* first approximation */
+ x *= pow (1 - x, -(b - 1) / a); /* second approximation */
+ } else {
+ x = mean;
+ }
+
+ if (x > mean)
+ x = mean;
+ }
+ else
+ {
+ /* Use expected value as first guess */
+ x = mean;
+ }
+
+ {
+ double lambda, dP, phi;
+ unsigned int n = 0;
+
+ start:
+ dP = P - gsl_cdf_beta_P (x, a, b);
+ phi = gsl_ran_beta_pdf (x, a, b);
+
+ if (dP == 0.0 || n++ > 64)
+ goto end;
+
+ lambda = dP / GSL_MAX (2 * fabs (dP / x), phi);
+
+ {
+ double step0 = lambda;
+ double step1 = -((a - 1) / x - (b - 1) / (1 - x)) * lambda * lambda / 2;
+
+ double step = step0;
+
+ if (fabs (step1) < fabs (step0))
+ {
+ step += step1;
+ }
+ else
+ {
+ /* scale back step to a reasonable size when too large */
+ step *= 2 * fabs (step0 / step1);
+ };
+
+ if (x + step > 0 && x + step < 1)
+ {
+ x += step;
+ }
+ else
+ {
+ x = sqrt (x) * sqrt (mean); /* try a new starting point */
+ }
+
+ if (fabs (step0) > 1e-10 * x)
+ goto start;
+ }
+
+ end:
+ return x;
+
+ }
+}
+
+double
+gsl_cdf_beta_Qinv (const double Q, const double a, const double b)
+{
+
+ if (Q < 0.0 || Q > 1.0)
+ {
+ CDF_ERROR ("Q must be inside range 0 < Q < 1", GSL_EDOM);
+ }
+
+ if (a < 0.0)
+ {
+ CDF_ERROR ("a < 0", GSL_EDOM);
+ }
+
+ if (b < 0.0)
+ {
+ CDF_ERROR ("b < 0", GSL_EDOM);
+ }
+
+ if (Q == 0.0)
+ {
+ return 1.0;
+ }
+
+ if (Q == 1.0)
+ {
+ return 0.0;
+ }
+
+ if (Q > 0.5)
+ {
+ return gsl_cdf_beta_Pinv (1 - Q, a, b);
+ }
+ else
+ {
+ return 1 - gsl_cdf_beta_Pinv (Q, b, a);
+ };
+}
diff --git a/gsl-1.9/cdf/binomial.c b/gsl-1.9/cdf/binomial.c
new file mode 100644
index 0000000..40a8d58
--- /dev/null
+++ b/gsl-1.9/cdf/binomial.c
@@ -0,0 +1,108 @@
+/* cdf/binomial.c
+ *
+ * Copyright (C) 2004 Jason H. Stover.
+ * Copyright (C) 2004 Giulio Bottazzi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cdf.h>
+#include <gsl/gsl_sf_gamma.h>
+
+#include "error.h"
+
+/* Computes the cumulative distribution function for a binomial
+ random variable. For a binomial random variable X with n trials
+ and success probability p,
+
+ Pr( X <= k ) = Pr( Y >= p )
+
+ where Y is a beta random variable with parameters k+1 and n-k.
+
+ The binomial distribution has the form,
+
+ prob(k) = n!/(k!(n-k)!) * p^k (1-p)^(n-k) for k = 0, 1, ..., n
+
+ The cumulated distributions can be expressed in terms of normalized
+ incomplete beta functions (see Abramowitz & Stegun eq. 26.5.26 and
+ eq. 6.6.3).
+
+ Reference:
+
+ W. Feller, "An Introduction to Probability and Its
+ Applications," volume 1. Wiley, 1968. Exercise 45, page 173,
+ chapter 6.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_cdf.h>
+
+double
+gsl_cdf_binomial_P (const unsigned int k, const double p, const unsigned int n)
+{
+ double P;
+ double a;
+ double b;
+
+ if (p > 1.0 || p < 0.0)
+ {
+ CDF_ERROR ("p < 0 or p > 1", GSL_EDOM);
+ }
+
+ if (k >= n)
+ {
+ P = 1.0;
+ }
+ else
+ {
+ a = (double) k + 1.0;
+ b = (double) n - k;
+ P = gsl_cdf_beta_Q (p, a, b);
+ }
+
+ return P;
+}
+
+double
+gsl_cdf_binomial_Q (const unsigned int k, const double p, const unsigned int n)
+{
+ double Q;
+ double a;
+ double b;
+
+ if (p > 1.0 || p < 0.0)
+ {
+ CDF_ERROR ("p < 0 or p > 1", GSL_EDOM);
+ }
+
+ if (k >= n)
+ {
+ Q = 0.0;
+ }
+ else
+ {
+ a = (double) k + 1.0;
+ b = (double) n - k;
+ Q = gsl_cdf_beta_P (p, a, b);
+ }
+
+ return Q;
+}
diff --git a/gsl-1.9/cdf/cauchy.c b/gsl-1.9/cdf/cauchy.c
new file mode 100644
index 0000000..7a2ccb3
--- /dev/null
+++ b/gsl-1.9/cdf/cauchy.c
@@ -0,0 +1,59 @@
+/* cdf/cauchy.c
+ *
+ * Copyright (C) 2003 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cdf.h>
+
+double
+gsl_cdf_cauchy_P (const double x, const double a)
+{
+ double P;
+ double u = x / a;
+
+ if (u > -1)
+ {
+ P = 0.5 + atan (u) / M_PI;
+ }
+ else
+ {
+ P = atan(-1/u) / M_PI;
+ }
+
+ return P;
+}
+
+double
+gsl_cdf_cauchy_Q (const double x, const double a)
+{
+ double Q;
+ double u = x / a;
+
+ if (u < 1)
+ {
+ Q = 0.5 - atan (u) / M_PI;
+ }
+ else
+ {
+ Q = atan(1/u) / M_PI;
+ }
+
+ return Q;
+}
diff --git a/gsl-1.9/cdf/cauchyinv.c b/gsl-1.9/cdf/cauchyinv.c
new file mode 100644
index 0000000..291ca88
--- /dev/null
+++ b/gsl-1.9/cdf/cauchyinv.c
@@ -0,0 +1,75 @@
+/* cdf/cauchyinv.c
+ *
+ * Copyright (C) 2003 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cdf.h>
+
+double
+gsl_cdf_cauchy_Pinv (const double P, const double a)
+{
+ double x;
+
+ if (P == 1.0)
+ {
+ return GSL_POSINF;
+ }
+ else if (P == 0.0)
+ {
+ return GSL_NEGINF;
+ }
+
+ if (P > 0.5)
+ {
+ x = a * tan (M_PI * (P - 0.5));
+ }
+ else
+ {
+ x = -a / tan (M_PI * P);
+ }
+
+ return x;
+}
+
+double
+gsl_cdf_cauchy_Qinv (const double Q, const double a)
+{
+ double x;
+
+ if (Q == 0.0)
+ {
+ return GSL_POSINF;
+ }
+ else if (Q == 1.0)
+ {
+ return GSL_NEGINF;
+ }
+
+ if (Q > 0.5)
+ {
+ x = a * tan (M_PI * (0.5 - Q));
+ }
+ else
+ {
+ x = a / tan (M_PI * Q);
+ }
+
+ return x;
+}
diff --git a/gsl-1.9/cdf/chisq.c b/gsl-1.9/cdf/chisq.c
new file mode 100644
index 0000000..ec5c70d
--- /dev/null
+++ b/gsl-1.9/cdf/chisq.c
@@ -0,0 +1,34 @@
+/* cdf/cdf_chisq.c
+ *
+ * Copyright (C) 2003 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_cdf.h>
+#include <gsl/gsl_sf_gamma.h>
+
+double
+gsl_cdf_chisq_P (const double x, const double nu)
+{
+ return gsl_cdf_gamma_P (x, nu / 2, 2.0);
+}
+
+double
+gsl_cdf_chisq_Q (const double x, const double nu)
+{
+ return gsl_cdf_gamma_Q (x, nu / 2, 2.0);
+}
diff --git a/gsl-1.9/cdf/chisqinv.c b/gsl-1.9/cdf/chisqinv.c
new file mode 100644
index 0000000..941db52
--- /dev/null
+++ b/gsl-1.9/cdf/chisqinv.c
@@ -0,0 +1,34 @@
+/* cdf/chisqinv.c
+ *
+ * Copyright (C) 2003 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_cdf.h>
+#include <gsl/gsl_sf_gamma.h>
+
+double
+gsl_cdf_chisq_Pinv (const double P, const double nu)
+{
+ return gsl_cdf_gamma_Pinv (P, nu / 2, 2.0);
+}
+
+double
+gsl_cdf_chisq_Qinv (const double Q, const double nu)
+{
+ return gsl_cdf_gamma_Qinv (Q, nu / 2, 2.0);
+}
diff --git a/gsl-1.9/cdf/error.h b/gsl-1.9/cdf/error.h
new file mode 100644
index 0000000..83db7ba
--- /dev/null
+++ b/gsl-1.9/cdf/error.h
@@ -0,0 +1,4 @@
+/* CDF_ERROR: call the error handler, and return a NAN. */
+
+#define CDF_ERROR(reason, gsl_errno) GSL_ERROR_VAL(reason, gsl_errno, GSL_NAN)
+
diff --git a/gsl-1.9/cdf/exponential.c b/gsl-1.9/cdf/exponential.c
new file mode 100644
index 0000000..e997bb0
--- /dev/null
+++ b/gsl-1.9/cdf/exponential.c
@@ -0,0 +1,59 @@
+/* cdf/exponential.c
+ *
+ * Copyright (C) 2003 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cdf.h>
+
+/* The exponential distribution has the form
+
+ p(x) dx = exp(-x/mu) dx/mu
+
+ for x = 0 ... +infty */
+
+double
+gsl_cdf_exponential_P (const double x, const double mu)
+{
+ if (x < 0)
+ {
+ return 0;
+ }
+ else
+ {
+ double P = -expm1 (-x / mu);
+
+ return P;
+ }
+}
+
+double
+gsl_cdf_exponential_Q (const double x, const double mu)
+{
+ if (x < 0)
+ {
+ return 1;
+ }
+ else
+ {
+ double Q = exp (-x / mu);
+
+ return Q;
+ }
+}
diff --git a/gsl-1.9/cdf/exponentialinv.c b/gsl-1.9/cdf/exponentialinv.c
new file mode 100644
index 0000000..035340c
--- /dev/null
+++ b/gsl-1.9/cdf/exponentialinv.c
@@ -0,0 +1,39 @@
+/* cdf/exponentialinv.c
+ *
+ * Copyright (C) 2003 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cdf.h>
+
+double
+gsl_cdf_exponential_Pinv (const double P, const double mu)
+{
+ double x = -mu * log1p (-P);
+
+ return x;
+}
+
+double
+gsl_cdf_exponential_Qinv (const double Q, const double mu)
+{
+ double x = -mu * log (Q);
+
+ return x;
+}
diff --git a/gsl-1.9/cdf/exppow.c b/gsl-1.9/cdf/exppow.c
new file mode 100644
index 0000000..440f5c4
--- /dev/null
+++ b/gsl-1.9/cdf/exppow.c
@@ -0,0 +1,70 @@
+/* cdf/exppow.c
+ *
+ * Copyright (C) 2004 Giulio Bottazzi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_cdf.h>
+#include <gsl/gsl_sf_gamma.h>
+
+/* The exponential power density is parametrized according to
+
+ p(x) dx = (1/(2 a Gamma(1 + 1/b))) * exp(-|x/a|^b) dx
+
+ so that the distribution reads
+
+ / x<0 0.5 - Gamma_inc_P(1/b,|x/a|^b)
+ P(x) = | x=0 0.5
+ \ x>0 0.5 + Gamma_inc_P(1/b,|x/a|^b)
+
+
+ for x in (-infty,+infty) */
+
+double
+gsl_cdf_exppow_P (const double x, const double a, const double b)
+{
+ const double u = x / a;
+
+ if (u < 0)
+ {
+ double P = 0.5 * gsl_sf_gamma_inc_Q (1.0 / b, pow (-u, b));
+ return P;
+ }
+ else
+ {
+ double P = 0.5 * (1.0 + gsl_sf_gamma_inc_P (1.0 / b, pow (u, b)));
+ return P;
+ }
+}
+
+double
+gsl_cdf_exppow_Q (const double x, const double a, const double b)
+{
+ const double u = x / a;
+
+ if (u < 0)
+ {
+ double Q = 0.5 * (1.0 + gsl_sf_gamma_inc_P (1.0 / b, pow (-u, b)));
+ return Q;
+ }
+ else
+ {
+ double Q = 0.5 * gsl_sf_gamma_inc_Q (1.0 / b, pow (u, b));
+ return Q;
+ }
+}
diff --git a/gsl-1.9/cdf/fdist.c b/gsl-1.9/cdf/fdist.c
new file mode 100644
index 0000000..fb3321f
--- /dev/null
+++ b/gsl-1.9/cdf/fdist.c
@@ -0,0 +1,81 @@
+/* cdf/fdist.c
+ *
+ * Copyright (C) 2002 Przemyslaw Sliwa and Jason H. Stover.
+ * Copyright (C) 2006 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_cdf.h>
+#include <gsl/gsl_sf_gamma.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+
+#include "error.h"
+#include "beta_inc.c"
+
+/*
+ * Lower tail.
+ */
+
+double
+gsl_cdf_fdist_P (const double x, const double nu1, const double nu2)
+{
+ double P;
+ double r = nu2 / nu1;
+
+ if (x < r)
+ {
+ double u = x / (r + x);
+
+ P = beta_inc_AXPY (1.0, 0.0, nu1 / 2.0, nu2 / 2.0, u);
+ }
+ else
+ {
+ double u = r / (r + x);
+
+ P = beta_inc_AXPY (-1.0, 1.0, nu2 / 2.0, nu1 / 2.0, u);
+ }
+
+ return P;
+}
+
+/*
+ * Upper tail.
+ */
+
+double
+gsl_cdf_fdist_Q (const double x, const double nu1, const double nu2)
+{
+ double Q;
+ double r = nu2 / nu1;
+
+ if (x < r)
+ {
+ double u = x / (r + x);
+
+ Q = beta_inc_AXPY (-1.0, 1.0, nu1 / 2.0, nu2 / 2.0, u);
+ }
+ else
+ {
+ double u = r / (r + x);
+
+ Q = beta_inc_AXPY (1.0, 0.0, nu2 / 2.0, nu1 / 2.0, u);
+ }
+
+ return Q;
+}
diff --git a/gsl-1.9/cdf/fdistinv.c b/gsl-1.9/cdf/fdistinv.c
new file mode 100644
index 0000000..231f5c1
--- /dev/null
+++ b/gsl-1.9/cdf/fdistinv.c
@@ -0,0 +1,104 @@
+/* cdf/fdistinv.c
+ *
+ * Copyright (C) 2002 Przemyslaw Sliwa and Jason H. Stover.
+ * Copyright (C) 2006 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_cdf.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+
+#include "error.h"
+
+double
+gsl_cdf_fdist_Pinv (const double P, const double nu1, const double nu2)
+{
+ double result;
+ double y;
+
+ if (P < 0.0)
+ {
+ CDF_ERROR ("P < 0.0", GSL_EDOM);
+ }
+ if (P > 1.0)
+ {
+ CDF_ERROR ("P > 1.0", GSL_EDOM);
+ }
+ if (nu1 < 1.0)
+ {
+ CDF_ERROR ("nu1 < 1", GSL_EDOM);
+ }
+ if (nu2 < 1.0)
+ {
+ CDF_ERROR ("nu2 < 1", GSL_EDOM);
+ }
+
+ if (P < 0.5)
+ {
+ y = gsl_cdf_beta_Pinv (P, nu1 / 2.0, nu2 / 2.0);
+
+ result = nu2 * y / (nu1 * (1.0 - y));
+ }
+ else
+ {
+ y = gsl_cdf_beta_Qinv (P, nu2 / 2.0, nu1 / 2.0);
+
+ result = nu2 * (1 - y) / (nu1 * y);
+ }
+
+ return result;
+}
+
+double
+gsl_cdf_fdist_Qinv (const double Q, const double nu1, const double nu2)
+{
+ double result;
+ double y;
+
+ if (Q < 0.0)
+ {
+ CDF_ERROR ("Q < 0.0", GSL_EDOM);
+ }
+ if (Q > 1.0)
+ {
+ CDF_ERROR ("Q > 1.0", GSL_EDOM);
+ }
+ if (nu1 < 1.0)
+ {
+ CDF_ERROR ("nu1 < 1", GSL_EDOM);
+ }
+ if (nu2 < 1.0)
+ {
+ CDF_ERROR ("nu2 < 1", GSL_EDOM);
+ }
+
+ if (Q > 0.5)
+ {
+ y = gsl_cdf_beta_Qinv (Q, nu1 / 2.0, nu2 / 2.0);
+
+ result = nu2 * y / (nu1 * (1.0 - y));
+ }
+ else
+ {
+ y = gsl_cdf_beta_Pinv (Q, nu2 / 2.0, nu1 / 2.0);
+
+ result = nu2 * (1 - y) / (nu1 * y);
+ }
+
+ return result;
+}
diff --git a/gsl-1.9/cdf/flat.c b/gsl-1.9/cdf/flat.c
new file mode 100644
index 0000000..407b195
--- /dev/null
+++ b/gsl-1.9/cdf/flat.c
@@ -0,0 +1,65 @@
+/* cdf/flat.c
+ *
+ * Copyright (C) 2003 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cdf.h>
+
+double
+gsl_cdf_flat_P (const double x, const double a, const double b)
+{
+ double P;
+
+ if (x < a)
+ {
+ P = 0;
+ }
+ else if (x > b)
+ {
+ P = 1;
+ }
+ else
+ {
+ P = (x-a)/(b-a);
+ }
+
+ return P;
+}
+
+double
+gsl_cdf_flat_Q (const double x, const double a, const double b)
+{
+ double Q;
+
+ if (x < a)
+ {
+ Q = 1;
+ }
+ else if (x > b)
+ {
+ Q = 0;
+ }
+ else
+ {
+ Q = (b-x)/(b-a);
+ }
+
+ return Q;
+}
diff --git a/gsl-1.9/cdf/flatinv.c b/gsl-1.9/cdf/flatinv.c
new file mode 100644
index 0000000..d31014e
--- /dev/null
+++ b/gsl-1.9/cdf/flatinv.c
@@ -0,0 +1,59 @@
+/* cdf/flatinv.c
+ *
+ * Copyright (C) 2003 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_cdf.h>
+
+double
+gsl_cdf_flat_Pinv (const double P, const double a, const double b)
+{
+ double x;
+
+ if (P == 1.0)
+ {
+ return b;
+ }
+ else if (P == 0.0)
+ {
+ return a;
+ }
+
+ x = (1 - P) * a + P * b;
+
+ return x;
+}
+
+double
+gsl_cdf_flat_Qinv (const double Q, const double a, const double b)
+{
+ double x;
+
+ if (Q == 0.0)
+ {
+ return b;
+ }
+ else if (Q == 1.0)
+ {
+ return a;
+ }
+
+ x = Q * a + (1 - Q) * b;
+
+ return x;
+}
diff --git a/gsl-1.9/cdf/gamma.c b/gsl-1.9/cdf/gamma.c
new file mode 100644
index 0000000..8174408
--- /dev/null
+++ b/gsl-1.9/cdf/gamma.c
@@ -0,0 +1,74 @@
+/* cdf/cdf_gamma.c
+ *
+ * Copyright (C) 2003 Jason Stover.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+/*
+ * Author: J. Stover
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_cdf.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_sf_gamma.h>
+
+double
+gsl_cdf_gamma_P (const double x, const double a, const double b)
+{
+ double P;
+ double y = x / b;
+
+ if (x <= 0.0)
+ {
+ return 0.0;
+ }
+
+ if (y > a)
+ {
+ P = 1 - gsl_sf_gamma_inc_Q (a, y);
+ }
+ else
+ {
+ P = gsl_sf_gamma_inc_P (a, y);
+ }
+
+ return P;
+}
+
+double
+gsl_cdf_gamma_Q (const double x, const double a, const double b)
+{
+ double Q;
+ double y = x / b;
+
+ if (x <= 0.0)
+ {
+ return 1.0;
+ }
+
+ if (y < a)
+ {
+ Q = 1 - gsl_sf_gamma_inc_P (a, y);
+ }
+ else
+ {
+ Q = gsl_sf_gamma_inc_Q (a, y);
+ }
+
+ return Q;
+}
diff --git a/gsl-1.9/cdf/gammainv.c b/gsl-1.9/cdf/gammainv.c
new file mode 100644
index 0000000..47a77dd
--- /dev/null
+++ b/gsl-1.9/cdf/gammainv.c
@@ -0,0 +1,185 @@
+/* cdf/gammainv.c
+ *
+ * Copyright (C) 2003 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_cdf.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_randist.h>
+#include <gsl/gsl_sf_gamma.h>
+
+#include <stdio.h>
+
+double
+gsl_cdf_gamma_Pinv (const double P, const double a, const double b)
+{
+ double x;
+
+ if (P == 1.0)
+ {
+ return GSL_POSINF;
+ }
+ else if (P == 0.0)
+ {
+ return 0.0;
+ }
+
+ /* Consider, small, large and intermediate cases separately. The
+ boundaries at 0.05 and 0.95 have not been optimised, but seem ok
+ for an initial approximation. */
+
+ if (P < 0.05)
+ {
+ double x0 = exp ((gsl_sf_lngamma (a) + log (P)) / a);
+ x = x0;
+ }
+ else if (P > 0.95)
+ {
+ double x0 = -log1p (-P) + gsl_sf_lngamma (a);
+ x = x0;
+ }
+ else
+ {
+ double xg = gsl_cdf_ugaussian_Pinv (P);
+ double x0 = (xg < -sqrt (a)) ? a : sqrt (a) * xg + a;
+ x = x0;
+ }
+
+ /* Use Lagrange's interpolation for E(x)/phi(x0) to work backwards
+ to an improved value of x (Abramowitz & Stegun, 3.6.6)
+
+ where E(x)=P-integ(phi(u),u,x0,x) and phi(u) is the pdf.
+ */
+
+ {
+ double lambda, dP, phi;
+ unsigned int n = 0;
+
+ start:
+ dP = P - gsl_cdf_gamma_P (x, a, 1.0);
+ phi = gsl_ran_gamma_pdf (x, a, 1.0);
+
+ if (dP == 0.0 || n++ > 32)
+ goto end;
+
+ lambda = dP / GSL_MAX (2 * fabs (dP / x), phi);
+
+ {
+ double step0 = lambda;
+ double step1 = -((a - 1) / x - 1) * lambda * lambda / 4.0;
+
+ double step = step0;
+ if (fabs (step1) < fabs (step0))
+ step += step1;
+
+ if (x + step > 0)
+ x += step;
+ else
+ {
+ x /= 2.0;
+ }
+
+ if (fabs (step0) > 1e-10 * x)
+ goto start;
+ }
+
+ }
+
+end:
+ return b * x;
+}
+
+double
+gsl_cdf_gamma_Qinv (const double Q, const double a, const double b)
+{
+ double x;
+
+ if (Q == 1.0)
+ {
+ return 0.0;
+ }
+ else if (Q == 0.0)
+ {
+ return GSL_POSINF;
+ }
+
+ /* Consider, small, large and intermediate cases separately. The
+ boundaries at 0.05 and 0.95 have not been optimised, but seem ok
+ for an initial approximation. */
+
+ if (Q < 0.05)
+ {
+ double x0 = -log (Q) + gsl_sf_lngamma (a);
+ x = x0;
+ }
+ else if (Q > 0.95)
+ {
+ double x0 = exp ((gsl_sf_lngamma (a) + log1p (-Q)) / a);
+ x = x0;
+ }
+ else
+ {
+ double xg = gsl_cdf_ugaussian_Qinv (Q);
+ double x0 = (xg < -sqrt (a)) ? a : sqrt (a) * xg + a;
+ x = x0;
+ }
+
+ /* Use Lagrange's interpolation for E(x)/phi(x0) to work backwards
+ to an improved value of x (Abramowitz & Stegun, 3.6.6)
+
+ where E(x)=P-integ(phi(u),u,x0,x) and phi(u) is the pdf.
+ */
+
+ {
+ double lambda, dQ, phi;
+ unsigned int n = 0;
+
+ start:
+ dQ = Q - gsl_cdf_gamma_Q (x, a, 1.0);
+ phi = gsl_ran_gamma_pdf (x, a, 1.0);
+
+ if (dQ == 0.0 || n++ > 32)
+ goto end;
+
+ lambda = -dQ / GSL_MAX (2 * fabs (dQ / x), phi);
+
+ {
+ double step0 = lambda;
+ double step1 = -((a - 1) / x - 1) * lambda * lambda / 4.0;
+
+ double step = step0;
+ if (fabs (step1) < fabs (step0))
+ step += step1;
+
+ if (x + step > 0)
+ x += step;
+ else
+ {
+ x /= 2.0;
+ }
+
+ if (fabs (step0) > 1e-10 * x)
+ goto start;
+ }
+
+ }
+
+end:
+ return b * x;
+}
diff --git a/gsl-1.9/cdf/gauss.c b/gsl-1.9/cdf/gauss.c
new file mode 100644
index 0000000..235c978
--- /dev/null
+++ b/gsl-1.9/cdf/gauss.c
@@ -0,0 +1,351 @@
+/* cdf/gauss.c
+ *
+ * Copyright (C) 2002, 2004 Jason H. Stover.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+/*
+ * Computes the cumulative distribution function for the Gaussian
+ * distribution using a rational function approximation. The
+ * computation is for the standard Normal distribution, i.e., mean 0
+ * and standard deviation 1. If you want to compute Pr(X < t) for a
+ * Gaussian random variable X with non-zero mean m and standard
+ * deviation sd not equal to 1, find gsl_cdf_ugaussian ((t-m)/sd).
+ * This approximation is accurate to at least double precision. The
+ * accuracy was verified with a pari-gp script. The largest error
+ * found was about 1.4E-20. The coefficients were derived by Cody.
+ *
+ * References:
+ *
+ * W.J. Cody. "Rational Chebyshev Approximations for the Error
+ * Function," Mathematics of Computation, v23 n107 1969, 631-637.
+ *
+ * W. Fraser, J.F Hart. "On the Computation of Rational Approximations
+ * to Continuous Functions," Communications of the ACM, v5 1962.
+ *
+ * W.J. Kennedy Jr., J.E. Gentle. "Statistical Computing." Marcel Dekker. 1980.
+ *
+ *
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cdf.h>
+
+#ifndef M_1_SQRT2PI
+#define M_1_SQRT2PI (M_2_SQRTPI * M_SQRT1_2 / 2.0)
+#endif
+
+#define SQRT32 (4.0 * M_SQRT2)
+
+/*
+ * IEEE double precision dependent constants.
+ *
+ * GAUSS_EPSILON: Smallest positive value such that
+ * gsl_cdf_gaussian(x) > 0.5.
+ * GAUSS_XUPPER: Largest value x such that gsl_cdf_gaussian(x) < 1.0.
+ * GAUSS_XLOWER: Smallest value x such that gsl_cdf_gaussian(x) > 0.0.
+ */
+
+#define GAUSS_EPSILON (GSL_DBL_EPSILON / 2)
+#define GAUSS_XUPPER (8.572)
+#define GAUSS_XLOWER (-37.519)
+
+#define GAUSS_SCALE (16.0)
+
+static double
+get_del (double x, double rational)
+{
+ double xsq = 0.0;
+ double del = 0.0;
+ double result = 0.0;
+
+ xsq = floor (x * GAUSS_SCALE) / GAUSS_SCALE;
+ del = (x - xsq) * (x + xsq);
+ del *= 0.5;
+
+ result = exp (-0.5 * xsq * xsq) * exp (-1.0 * del) * rational;
+
+ return result;
+}
+
+/*
+ * Normal cdf for fabs(x) < 0.66291
+ */
+static double
+gauss_small (const double x)
+{
+ unsigned int i;
+ double result = 0.0;
+ double xsq;
+ double xnum;
+ double xden;
+
+ const double a[5] = {
+ 2.2352520354606839287,
+ 161.02823106855587881,
+ 1067.6894854603709582,
+ 18154.981253343561249,
+ 0.065682337918207449113
+ };
+ const double b[4] = {
+ 47.20258190468824187,
+ 976.09855173777669322,
+ 10260.932208618978205,
+ 45507.789335026729956
+ };
+
+ xsq = x * x;
+ xnum = a[4] * xsq;
+ xden = xsq;
+
+ for (i = 0; i < 3; i++)
+ {
+ xnum = (xnum + a[i]) * xsq;
+ xden = (xden + b[i]) * xsq;
+ }
+
+ result = x * (xnum + a[3]) / (xden + b[3]);
+
+ return result;
+}
+
+/*
+ * Normal cdf for 0.66291 < fabs(x) < sqrt(32).
+ */
+static double
+gauss_medium (const double x)
+{
+ unsigned int i;
+ double temp = 0.0;
+ double result = 0.0;
+ double xnum;
+ double xden;
+ double absx;
+
+ const double c[9] = {
+ 0.39894151208813466764,
+ 8.8831497943883759412,
+ 93.506656132177855979,
+ 597.27027639480026226,
+ 2494.5375852903726711,
+ 6848.1904505362823326,
+ 11602.651437647350124,
+ 9842.7148383839780218,
+ 1.0765576773720192317e-8
+ };
+ const double d[8] = {
+ 22.266688044328115691,
+ 235.38790178262499861,
+ 1519.377599407554805,
+ 6485.558298266760755,
+ 18615.571640885098091,
+ 34900.952721145977266,
+ 38912.003286093271411,
+ 19685.429676859990727
+ };
+
+ absx = fabs (x);
+
+ xnum = c[8] * absx;
+ xden = absx;
+
+ for (i = 0; i < 7; i++)
+ {
+ xnum = (xnum + c[i]) * absx;
+ xden = (xden + d[i]) * absx;
+ }
+
+ temp = (xnum + c[7]) / (xden + d[7]);
+
+ result = get_del (x, temp);
+
+ return result;
+}
+
+/*
+ * Normal cdf for
+ * {sqrt(32) < x < GAUSS_XUPPER} union { GAUSS_XLOWER < x < -sqrt(32) }.
+ */
+static double
+gauss_large (const double x)
+{
+ int i;
+ double result;
+ double xsq;
+ double temp;
+ double xnum;
+ double xden;
+ double absx;
+
+ const double p[6] = {
+ 0.21589853405795699,
+ 0.1274011611602473639,
+ 0.022235277870649807,
+ 0.001421619193227893466,
+ 2.9112874951168792e-5,
+ 0.02307344176494017303
+ };
+ const double q[5] = {
+ 1.28426009614491121,
+ 0.468238212480865118,
+ 0.0659881378689285515,
+ 0.00378239633202758244,
+ 7.29751555083966205e-5
+ };
+
+ absx = fabs (x);
+ xsq = 1.0 / (x * x);
+ xnum = p[5] * xsq;
+ xden = xsq;
+
+ for (i = 0; i < 4; i++)
+ {
+ xnum = (xnum + p[i]) * xsq;
+ xden = (xden + q[i]) * xsq;
+ }
+
+ temp = xsq * (xnum + p[4]) / (xden + q[4]);
+ temp = (M_1_SQRT2PI - temp) / absx;
+
+ result = get_del (x, temp);
+
+ return result;
+}
+
+double
+gsl_cdf_ugaussian_P (const double x)
+{
+ double result;
+ double absx = fabs (x);
+
+ if (absx < GAUSS_EPSILON)
+ {
+ result = 0.5;
+ return result;
+ }
+ else if (absx < 0.66291)
+ {
+ result = 0.5 + gauss_small (x);
+ return result;
+ }
+ else if (absx < SQRT32)
+ {
+ result = gauss_medium (x);
+
+ if (x > 0.0)
+ {
+ result = 1.0 - result;
+ }
+
+ return result;
+ }
+ else if (x > GAUSS_XUPPER)
+ {
+ result = 1.0;
+ return result;
+ }
+ else if (x < GAUSS_XLOWER)
+ {
+ result = 0.0;
+ return result;
+ }
+ else
+ {
+ result = gauss_large (x);
+
+ if (x > 0.0)
+ {
+ result = 1.0 - result;
+ }
+ }
+
+ return result;
+}
+
+double
+gsl_cdf_ugaussian_Q (const double x)
+{
+ double result;
+ double absx = fabs (x);
+
+ if (absx < GAUSS_EPSILON)
+ {
+ result = 0.5;
+ return result;
+ }
+ else if (absx < 0.66291)
+ {
+ result = gauss_small (x);
+
+ if (x < 0.0)
+ {
+ result = fabs (result) + 0.5;
+ }
+ else
+ {
+ result = 0.5 - result;
+ }
+
+ return result;
+ }
+ else if (absx < SQRT32)
+ {
+ result = gauss_medium (x);
+
+ if (x < 0.0)
+ {
+ result = 1.0 - result;
+ }
+
+ return result;
+ }
+ else if (x > -(GAUSS_XLOWER))
+ {
+ result = 0.0;
+ return result;
+ }
+ else if (x < -(GAUSS_XUPPER))
+ {
+ result = 1.0;
+ return result;
+ }
+ else
+ {
+ result = gauss_large (x);
+
+ if (x < 0.0)
+ {
+ result = 1.0 - result;
+ }
+
+ }
+
+ return result;
+}
+
+double
+gsl_cdf_gaussian_P (const double x, const double sigma)
+{
+ return gsl_cdf_ugaussian_P (x / sigma);
+}
+
+double
+gsl_cdf_gaussian_Q (const double x, const double sigma)
+{
+ return gsl_cdf_ugaussian_Q (x / sigma);
+}
diff --git a/gsl-1.9/cdf/gaussinv.c b/gsl-1.9/cdf/gaussinv.c
new file mode 100644
index 0000000..fbddb9e
--- /dev/null
+++ b/gsl-1.9/cdf/gaussinv.c
@@ -0,0 +1,202 @@
+/* cdf/inverse_normal.c
+ *
+ * Copyright (C) 2002 Przemyslaw Sliwa and Jason H. Stover.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+/*
+ * Computes the inverse normal cumulative distribution function
+ * according to the algorithm shown in
+ *
+ * Wichura, M.J. (1988).
+ * Algorithm AS 241: The Percentage Points of the Normal Distribution.
+ * Applied Statistics, 37, 477-484.
+ */
+
+#include <config.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cdf.h>
+
+#include "rat_eval.h"
+
+static double
+small (double q)
+{
+ const double a[8] = { 3.387132872796366608, 133.14166789178437745,
+ 1971.5909503065514427, 13731.693765509461125,
+ 45921.953931549871457, 67265.770927008700853,
+ 33430.575583588128105, 2509.0809287301226727
+ };
+
+ const double b[8] = { 1.0, 42.313330701600911252,
+ 687.1870074920579083, 5394.1960214247511077,
+ 21213.794301586595867, 39307.89580009271061,
+ 28729.085735721942674, 5226.495278852854561
+ };
+
+ double r = 0.180625 - q * q;
+
+ double x = q * rat_eval (a, 8, b, 8, r);
+
+ return x;
+}
+
+static double
+intermediate (double r)
+{
+ const double a[] = { 1.42343711074968357734, 4.6303378461565452959,
+ 5.7694972214606914055, 3.64784832476320460504,
+ 1.27045825245236838258, 0.24178072517745061177,
+ 0.0227238449892691845833, 7.7454501427834140764e-4
+ };
+
+ const double b[] = { 1.0, 2.05319162663775882187,
+ 1.6763848301838038494, 0.68976733498510000455,
+ 0.14810397642748007459, 0.0151986665636164571966,
+ 5.475938084995344946e-4, 1.05075007164441684324e-9
+ };
+
+ double x = rat_eval (a, 8, b, 8, (r - 1.6));
+
+ return x;
+}
+
+static double
+tail (double r)
+{
+ const double a[] = { 6.6579046435011037772, 5.4637849111641143699,
+ 1.7848265399172913358, 0.29656057182850489123,
+ 0.026532189526576123093, 0.0012426609473880784386,
+ 2.71155556874348757815e-5, 2.01033439929228813265e-7
+ };
+
+ const double b[] = { 1.0, 0.59983220655588793769,
+ 0.13692988092273580531, 0.0148753612908506148525,
+ 7.868691311456132591e-4, 1.8463183175100546818e-5,
+ 1.4215117583164458887e-7, 2.04426310338993978564e-15
+ };
+
+ double x = rat_eval (a, 8, b, 8, (r - 5.0));
+
+ return x;
+}
+
+double
+gsl_cdf_ugaussian_Pinv (const double P)
+{
+ double r, x, pp;
+
+ double dP = P - 0.5;
+
+ if (P == 1.0)
+ {
+ return GSL_POSINF;
+ }
+ else if (P == 0.0)
+ {
+ return GSL_NEGINF;
+ }
+
+ if (fabs (dP) <= 0.425)
+ {
+ x = small (dP);
+
+ return x;
+ }
+
+ pp = (P < 0.5) ? P : 1.0 - P;
+
+ r = sqrt (-log (pp));
+
+ if (r <= 5.0)
+ {
+ x = intermediate (r);
+ }
+ else
+ {
+ x = tail (r);
+ }
+
+ if (P < 0.5)
+ {
+ return -x;
+ }
+ else
+ {
+ return x;
+ }
+
+}
+
+double
+gsl_cdf_ugaussian_Qinv (const double Q)
+{
+ double r, x, pp;
+
+ double dQ = Q - 0.5;
+
+ if (Q == 1.0)
+ {
+ return GSL_NEGINF;
+ }
+ else if (Q == 0.0)
+ {
+ return GSL_POSINF;
+ }
+
+ if (fabs (dQ) <= 0.425)
+ {
+ x = small (dQ);
+
+ return -x;
+ }
+
+ pp = (Q < 0.5) ? Q : 1.0 - Q;
+
+ r = sqrt (-log (pp));
+
+ if (r <= 5.0)
+ {
+ x = intermediate (r);
+ }
+ else
+ {
+ x = tail (r);
+ }
+
+ if (Q < 0.5)
+ {
+ return x;
+ }
+ else
+ {
+ return -x;
+ }
+}
+
+
+double
+gsl_cdf_gaussian_Pinv (const double P, const double sigma)
+{
+ return sigma * gsl_cdf_ugaussian_Pinv (P);
+}
+
+double
+gsl_cdf_gaussian_Qinv (const double Q, const double sigma)
+{
+ return sigma * gsl_cdf_ugaussian_Qinv (Q);
+}
diff --git a/gsl-1.9/cdf/geometric.c b/gsl-1.9/cdf/geometric.c
new file mode 100644
index 0000000..1f671be
--- /dev/null
+++ b/gsl-1.9/cdf/geometric.c
@@ -0,0 +1,89 @@
+/* cdf/geometric.c
+ *
+ * Copyright (C) 2004 Jason H. Stover.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_cdf.h>
+
+#include "error.h"
+
+/* Pr (X <= k), i.e., the probability of n or fewer failures until the
+ first success. */
+
+double
+gsl_cdf_geometric_P (const unsigned int k, const double p)
+{
+ double P, a, q;
+
+ if (p > 1.0 || p < 0.0)
+ {
+ CDF_ERROR ("p < 0 or p > 1", GSL_EDOM);
+ }
+
+ if (k < 1)
+ {
+ return 0.0;
+ }
+
+ q = 1.0 - p;
+ a = (double) k;
+
+ if (p < 0.5)
+ {
+ P = -expm1 (a * log1p (-p));
+ }
+ else
+ {
+ P = 1.0 - pow (q, a);
+ }
+
+ return P;
+}
+
+double
+gsl_cdf_geometric_Q (const unsigned int k, const double p)
+{
+ double Q, a, q;
+
+ if (p > 1.0 || p < 0.0)
+ {
+ CDF_ERROR ("p < 0 or p > 1", GSL_EDOM);
+ }
+
+ if (k < 1)
+ {
+ Q = 1.0;
+ }
+
+ q = 1.0 - p;
+ a = (double) k;
+
+ if (p < 0.5)
+ {
+ Q = exp (a * log1p (-p));
+ }
+ else
+ {
+ Q = pow (q, a);
+ }
+
+ return Q;
+}
diff --git a/gsl-1.9/cdf/gsl_cdf.h b/gsl-1.9/cdf/gsl_cdf.h
new file mode 100644
index 0000000..662cf5d
--- /dev/null
+++ b/gsl-1.9/cdf/gsl_cdf.h
@@ -0,0 +1,170 @@
+/* cdf/gsl_cdf.h
+ *
+ * Copyright (C) 2002 Jason H. Stover.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+/* Author: J. Stover */
+
+#ifndef __GSL_CDF_H__
+#define __GSL_CDF_H__
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+double gsl_cdf_ugaussian_P (const double x);
+double gsl_cdf_ugaussian_Q (const double x);
+
+double gsl_cdf_ugaussian_Pinv (const double P);
+double gsl_cdf_ugaussian_Qinv (const double Q);
+
+double gsl_cdf_gaussian_P (const double x, const double sigma);
+double gsl_cdf_gaussian_Q (const double x, const double sigma);
+
+double gsl_cdf_gaussian_Pinv (const double P, const double sigma);
+double gsl_cdf_gaussian_Qinv (const double Q, const double sigma);
+
+double gsl_cdf_gamma_P (const double x, const double a, const double b);
+double gsl_cdf_gamma_Q (const double x, const double a, const double b);
+
+double gsl_cdf_gamma_Pinv (const double P, const double a, const double b);
+double gsl_cdf_gamma_Qinv (const double Q, const double a, const double b);
+
+double gsl_cdf_cauchy_P (const double x, const double a);
+double gsl_cdf_cauchy_Q (const double x, const double a);
+
+double gsl_cdf_cauchy_Pinv (const double P, const double a);
+double gsl_cdf_cauchy_Qinv (const double Q, const double a);
+
+double gsl_cdf_laplace_P (const double x, const double a);
+double gsl_cdf_laplace_Q (const double x, const double a);
+
+double gsl_cdf_laplace_Pinv (const double P, const double a);
+double gsl_cdf_laplace_Qinv (const double Q, const double a);
+
+double gsl_cdf_rayleigh_P (const double x, const double sigma);
+double gsl_cdf_rayleigh_Q (const double x, const double sigma);
+
+double gsl_cdf_rayleigh_Pinv (const double P, const double sigma);
+double gsl_cdf_rayleigh_Qinv (const double Q, const double sigma);
+
+double gsl_cdf_chisq_P (const double x, const double nu);
+double gsl_cdf_chisq_Q (const double x, const double nu);
+
+double gsl_cdf_chisq_Pinv (const double P, const double nu);
+double gsl_cdf_chisq_Qinv (const double Q, const double nu);
+
+double gsl_cdf_exponential_P (const double x, const double mu);
+double gsl_cdf_exponential_Q (const double x, const double mu);
+
+double gsl_cdf_exponential_Pinv (const double P, const double mu);
+double gsl_cdf_exponential_Qinv (const double Q, const double mu);
+
+double gsl_cdf_exppow_P (const double x, const double a, const double b);
+double gsl_cdf_exppow_Q (const double x, const double a, const double b);
+
+double gsl_cdf_tdist_P (const double x, const double nu);
+double gsl_cdf_tdist_Q (const double x, const double nu);
+
+double gsl_cdf_tdist_Pinv (const double P, const double nu);
+double gsl_cdf_tdist_Qinv (const double Q, const double nu);
+
+double gsl_cdf_fdist_P (const double x, const double nu1, const double nu2);
+double gsl_cdf_fdist_Q (const double x, const double nu1, const double nu2);
+
+double gsl_cdf_fdist_Pinv (const double P, const double nu1, const double nu2);
+double gsl_cdf_fdist_Qinv (const double Q, const double nu1, const double nu2);
+
+double gsl_cdf_beta_P (const double x, const double a, const double b);
+double gsl_cdf_beta_Q (const double x, const double a, const double b);
+
+double gsl_cdf_beta_Pinv (const double P, const double a, const double b);
+double gsl_cdf_beta_Qinv (const double Q, const double a, const double b);
+
+double gsl_cdf_flat_P (const double x, const double a, const double b);
+double gsl_cdf_flat_Q (const double x, const double a, const double b);
+
+double gsl_cdf_flat_Pinv (const double P, const double a, const double b);
+double gsl_cdf_flat_Qinv (const double Q, const double a, const double b);
+
+double gsl_cdf_lognormal_P (const double x, const double zeta, const double sigma);
+double gsl_cdf_lognormal_Q (const double x, const double zeta, const double sigma);
+
+double gsl_cdf_lognormal_Pinv (const double P, const double zeta, const double sigma);
+double gsl_cdf_lognormal_Qinv (const double Q, const double zeta, const double sigma);
+
+double gsl_cdf_gumbel1_P (const double x, const double a, const double b);
+double gsl_cdf_gumbel1_Q (const double x, const double a, const double b);
+
+double gsl_cdf_gumbel1_Pinv (const double P, const double a, const double b);
+double gsl_cdf_gumbel1_Qinv (const double Q, const double a, const double b);
+
+double gsl_cdf_gumbel2_P (const double x, const double a, const double b);
+double gsl_cdf_gumbel2_Q (const double x, const double a, const double b);
+
+double gsl_cdf_gumbel2_Pinv (const double P, const double a, const double b);
+double gsl_cdf_gumbel2_Qinv (const double Q, const double a, const double b);
+
+double gsl_cdf_weibull_P (const double x, const double a, const double b);
+double gsl_cdf_weibull_Q (const double x, const double a, const double b);
+
+double gsl_cdf_weibull_Pinv (const double P, const double a, const double b);
+double gsl_cdf_weibull_Qinv (const double Q, const double a, const double b);
+
+double gsl_cdf_pareto_P (const double x, const double a, const double b);
+double gsl_cdf_pareto_Q (const double x, const double a, const double b);
+
+double gsl_cdf_pareto_Pinv (const double P, const double a, const double b);
+double gsl_cdf_pareto_Qinv (const double Q, const double a, const double b);
+
+double gsl_cdf_logistic_P (const double x, const double a);
+double gsl_cdf_logistic_Q (const double x, const double a);
+
+double gsl_cdf_logistic_Pinv (const double P, const double a);
+double gsl_cdf_logistic_Qinv (const double Q, const double a);
+
+double gsl_cdf_binomial_P (const unsigned int k, const double p, const unsigned int n);
+double gsl_cdf_binomial_Q (const unsigned int k, const double p, const unsigned int n);
+
+double gsl_cdf_poisson_P (const unsigned int k, const double mu);
+double gsl_cdf_poisson_Q (const unsigned int k, const double mu);
+
+double gsl_cdf_geometric_P (const unsigned int k, const double p);
+double gsl_cdf_geometric_Q (const unsigned int k, const double p);
+
+double gsl_cdf_negative_binomial_P (const unsigned int k, const double p, const double n);
+double gsl_cdf_negative_binomial_Q (const unsigned int k, const double p, const double n);
+
+double gsl_cdf_pascal_P (const unsigned int k, const double p, const unsigned int n);
+double gsl_cdf_pascal_Q (const unsigned int k, const double p, const unsigned int n);
+
+double gsl_cdf_hypergeometric_P (const unsigned int k, const unsigned int n1,
+ const unsigned int n2, const unsigned int t);
+double gsl_cdf_hypergeometric_Q (const unsigned int k, const unsigned int n1,
+ const unsigned int n2, const unsigned int t);
+
+__END_DECLS
+
+#endif /* __GSL_CDF_H__ */
diff --git a/gsl-1.9/cdf/gumbel1.c b/gsl-1.9/cdf/gumbel1.c
new file mode 100644
index 0000000..ec8ef21
--- /dev/null
+++ b/gsl-1.9/cdf/gumbel1.c
@@ -0,0 +1,49 @@
+/* cdf/gumbel1.c
+ *
+ * Copyright (C) 2003 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cdf.h>
+
+double
+gsl_cdf_gumbel1_P (const double x, const double a, const double b)
+{
+ double P = pow(exp (-b), exp (-a * x));
+ return P;
+}
+
+double
+gsl_cdf_gumbel1_Q (const double x, const double a, const double b)
+{
+ double u = exp (-a * x);
+ double Q;
+ double P = pow(exp (-b), u);
+
+ if (P < 0.5)
+ {
+ Q = 1 - P;
+ }
+ else
+ {
+ Q = -expm1 (-b * u);
+ }
+
+ return Q;
+}
diff --git a/gsl-1.9/cdf/gumbel1inv.c b/gsl-1.9/cdf/gumbel1inv.c
new file mode 100644
index 0000000..c17ad93
--- /dev/null
+++ b/gsl-1.9/cdf/gumbel1inv.c
@@ -0,0 +1,61 @@
+/* cdf/gumbel1inv.c
+ *
+ * Copyright (C) 2003 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cdf.h>
+
+double
+gsl_cdf_gumbel1_Pinv (const double P, const double a, const double b)
+{
+ double x;
+
+ if (P == 1.0)
+ {
+ return GSL_POSINF;
+ }
+ else if (P == 0.0)
+ {
+ return GSL_NEGINF;
+ }
+
+ x = log(-b / log(P)) / a;
+
+ return x;
+}
+
+double
+gsl_cdf_gumbel1_Qinv (const double Q, const double a, const double b)
+{
+ double x;
+
+ if (Q == 0.0)
+ {
+ return GSL_POSINF;
+ }
+ else if (Q == 1.0)
+ {
+ return GSL_NEGINF;
+ }
+
+ x = log(-b / log1p(-Q)) / a;
+
+ return x;
+}
diff --git a/gsl-1.9/cdf/gumbel2.c b/gsl-1.9/cdf/gumbel2.c
new file mode 100644
index 0000000..62df56b
--- /dev/null
+++ b/gsl-1.9/cdf/gumbel2.c
@@ -0,0 +1,59 @@
+/* cdf/gumbel2.c
+ *
+ * Copyright (C) 2003 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cdf.h>
+
+double
+gsl_cdf_gumbel2_P (const double x, const double a, const double b)
+{
+ double P;
+
+ if (x == 0)
+ {
+ P = 0;
+ }
+ else
+ {
+ double u = pow (x, a);
+ P = exp (-b / u);
+ }
+
+ return P;
+}
+
+double
+gsl_cdf_gumbel2_Q (const double x, const double a, const double b)
+{
+ double Q;
+
+ if (x == 0)
+ {
+ Q = 1;
+ }
+ else
+ {
+ double u = pow (x, a);
+ Q = -expm1 (-b / u);
+ }
+
+ return Q;
+}
diff --git a/gsl-1.9/cdf/gumbel2inv.c b/gsl-1.9/cdf/gumbel2inv.c
new file mode 100644
index 0000000..b397f80
--- /dev/null
+++ b/gsl-1.9/cdf/gumbel2inv.c
@@ -0,0 +1,61 @@
+/* cdf/gumbel2inv.c
+ *
+ * Copyright (C) 2003 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cdf.h>
+
+double
+gsl_cdf_gumbel2_Pinv (const double P, const double a, const double b)
+{
+ double x;
+
+ if (P == 1.0)
+ {
+ return GSL_POSINF;
+ }
+ else if (P == 0.0)
+ {
+ return 0.0;
+ }
+
+ x = pow(b / (-log(P)), 1/a);
+
+ return x;
+}
+
+double
+gsl_cdf_gumbel2_Qinv (const double Q, const double a, const double b)
+{
+ double x;
+
+ if (Q == 0.0)
+ {
+ return GSL_POSINF;
+ }
+ else if (Q == 1.0)
+ {
+ return 0.0;
+ }
+
+ x = pow(b / (-log1p(-Q)), 1/a);
+
+ return x;
+}
diff --git a/gsl-1.9/cdf/hypergeometric.c b/gsl-1.9/cdf/hypergeometric.c
new file mode 100644
index 0000000..c0dee39
--- /dev/null
+++ b/gsl-1.9/cdf/hypergeometric.c
@@ -0,0 +1,183 @@
+/* cdf/hypergeometric.c
+ *
+ * Copyright (C) 2004 Jason H. Stover.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+/*
+ * Computes the cumulative distribution function for a hypergeometric
+ * random variable. A hypergeometric random variable X is the number
+ * of elements of type 1 in a sample of size t, drawn from a population
+ * of size n1 + n2, in which n1 are of type 1 and n2 are of type 2.
+ *
+ * This algorithm computes Pr( X <= k ) by summing the terms from
+ * the mass function, Pr( X = k ).
+ *
+ * References:
+ *
+ * T. Wu. An accurate computation of the hypergeometric distribution
+ * function. ACM Transactions on Mathematical Software. Volume 19, number 1,
+ * March 1993.
+ * This algorithm is not used, since it requires factoring the
+ * numerator and denominator, then cancelling. It is more accurate
+ * than the algorithm used here, but the cancellation requires more
+ * time than the algorithm used here.
+ *
+ * W. Feller. An Introduction to Probability Theory and Its Applications,
+ * third edition. 1968. Chapter 2, section 6.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_cdf.h>
+#include <gsl/gsl_randist.h>
+
+#include "error.h"
+
+static double
+lower_tail (const unsigned int k, const unsigned int n1,
+ const unsigned int n2, const unsigned int t)
+{
+ double relerr;
+ int i = k;
+ double s, P;
+
+ s = gsl_ran_hypergeometric_pdf (i, n1, n2, t);
+ P = s;
+
+ while (i > 0)
+ {
+ double factor =
+ (i / (n1 - i + 1.0)) * ((n2 + i - t) / (t - i + 1.0));
+ s *= factor;
+ P += s;
+ relerr = s / P;
+ if (relerr < GSL_DBL_EPSILON)
+ break;
+ i--;
+ }
+
+ return P;
+}
+
+static double
+upper_tail (const unsigned int k, const unsigned int n1,
+ const unsigned int n2, const unsigned int t)
+{
+ double relerr;
+ unsigned int i = k + 1;
+ double s, Q;
+
+ s = gsl_ran_hypergeometric_pdf (i, n1, n2, t);
+ Q = s;
+
+ while (i < t)
+ {
+ double factor =
+ ((n1 - i) / (i + 1.0)) * ((t - i) / (n2 + i + 1.0 - t));
+ s *= factor;
+ Q += s;
+ relerr = s / Q;
+ if (relerr < GSL_DBL_EPSILON)
+ break;
+ i++;
+ }
+
+ return Q;
+}
+
+
+
+
+/*
+ * Pr (X <= k)
+ */
+double
+gsl_cdf_hypergeometric_P (const unsigned int k,
+ const unsigned int n1,
+ const unsigned int n2, const unsigned int t)
+{
+ double P;
+
+ if (t > (n1 + n2))
+ {
+ CDF_ERROR ("t larger than population size", GSL_EDOM);
+ }
+ else if (k >= n1 || k >= t)
+ {
+ P = 1.0;
+ }
+ else if (k < 0.0)
+ {
+ P = 0.0;
+ }
+ else
+ {
+ double midpoint = (int) (t * n1 / (n1 + n2));
+
+ if (k >= midpoint)
+ {
+ P = 1 - upper_tail (k, n1, n2, t);
+ }
+ else
+ {
+ P = lower_tail (k, n1, n2, t);
+ }
+ }
+
+ return P;
+}
+
+/*
+ * Pr (X > k)
+ */
+double
+gsl_cdf_hypergeometric_Q (const unsigned int k,
+ const unsigned int n1,
+ const unsigned int n2, const unsigned int t)
+{
+ double Q;
+
+ if (t > (n1 + n2))
+ {
+ CDF_ERROR ("t larger than population size", GSL_EDOM);
+ }
+ else if (k >= n1 || k >= t)
+ {
+ Q = 0.0;
+ }
+ else if (k < 0.0)
+ {
+ Q = 1.0;
+ }
+ else
+ {
+ double midpoint = (int) (t * n1 / (n1 + n2));
+
+ if (k < midpoint)
+ {
+ Q = 1 - lower_tail (k, n1, n2, t);
+ }
+ else
+ {
+ Q = upper_tail (k, n1, n2, t);
+ }
+ }
+
+ return Q;
+}
diff --git a/gsl-1.9/cdf/laplace.c b/gsl-1.9/cdf/laplace.c
new file mode 100644
index 0000000..a92237c
--- /dev/null
+++ b/gsl-1.9/cdf/laplace.c
@@ -0,0 +1,59 @@
+/* cdf/laplace.c
+ *
+ * Copyright (C) 2003 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cdf.h>
+
+double
+gsl_cdf_laplace_P (const double x, const double a)
+{
+ double P;
+ double u = x / a;
+
+ if (u > 0)
+ {
+ P = 0.5 + 0.5*(1 - exp(-u)) ;
+ }
+ else
+ {
+ P = 0.5 * exp(u);
+ }
+
+ return P;
+}
+
+double
+gsl_cdf_laplace_Q (const double x, const double a)
+{
+ double Q;
+ double u = x / a;
+
+ if (u > 0)
+ {
+ Q = 0.5 * exp(-u);
+ }
+ else
+ {
+ Q = 1 - 0.5 *exp(u);
+ }
+
+ return Q;
+}
diff --git a/gsl-1.9/cdf/laplaceinv.c b/gsl-1.9/cdf/laplaceinv.c
new file mode 100644
index 0000000..2c21642
--- /dev/null
+++ b/gsl-1.9/cdf/laplaceinv.c
@@ -0,0 +1,75 @@
+/* cdf/laplaceinv.c
+ *
+ * Copyright (C) 2003 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cdf.h>
+
+double
+gsl_cdf_laplace_Pinv (const double P, const double a)
+{
+ double x;
+
+ if (P == 1.0)
+ {
+ return GSL_POSINF;
+ }
+ else if (P == 0.0)
+ {
+ return GSL_NEGINF;
+ }
+
+ if (P < 0.5)
+ {
+ x = a * log(2*P);
+ }
+ else
+ {
+ x = -a * log(2*(1-P));
+ }
+
+ return x;
+}
+
+double
+gsl_cdf_laplace_Qinv (const double Q, const double a)
+{
+ double x;
+
+ if (Q == 0.0)
+ {
+ return GSL_POSINF;
+ }
+ else if (Q == 1.0)
+ {
+ return GSL_NEGINF;
+ }
+
+ if (Q < 0.5)
+ {
+ x = -a * log(2*Q);
+ }
+ else
+ {
+ x = a * log(2*(1-Q));
+ }
+
+ return x;
+}
diff --git a/gsl-1.9/cdf/logistic.c b/gsl-1.9/cdf/logistic.c
new file mode 100644
index 0000000..3b1e1ed
--- /dev/null
+++ b/gsl-1.9/cdf/logistic.c
@@ -0,0 +1,59 @@
+/* cdf/logistic.c
+ *
+ * Copyright (C) 2003 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cdf.h>
+
+double
+gsl_cdf_logistic_P (const double x, const double a)
+{
+ double P;
+ double u = x / a;
+
+ if (u >= 0)
+ {
+ P = 1 / (1 + exp (-u));
+ }
+ else
+ {
+ P = exp (u) / (1 + exp (u));
+ }
+
+ return P;
+}
+
+double
+gsl_cdf_logistic_Q (const double x, const double a)
+{
+ double Q;
+ double u = x / a;
+
+ if (u >= 0)
+ {
+ Q = exp (-u) / (1 + exp (-u));
+ }
+ else
+ {
+ Q = 1 / (1 + exp (u));
+ }
+
+ return Q;
+}
diff --git a/gsl-1.9/cdf/logisticinv.c b/gsl-1.9/cdf/logisticinv.c
new file mode 100644
index 0000000..1873c1b
--- /dev/null
+++ b/gsl-1.9/cdf/logisticinv.c
@@ -0,0 +1,61 @@
+/* cdf/logisticinv.c
+ *
+ * Copyright (C) 2003 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cdf.h>
+
+double
+gsl_cdf_logistic_Pinv (const double P, const double a)
+{
+ double x;
+
+ if (P == 1.0)
+ {
+ return GSL_POSINF;
+ }
+ else if (P == 0.0)
+ {
+ return GSL_NEGINF;
+ }
+
+ x = a * log(P/(1-P));
+
+ return x;
+}
+
+double
+gsl_cdf_logistic_Qinv (const double Q, const double a)
+{
+ double x;
+
+ if (Q == 0.0)
+ {
+ return GSL_POSINF;
+ }
+ else if (Q == 1.0)
+ {
+ return GSL_NEGINF;
+ }
+
+ x = a * log((1-Q)/Q);
+
+ return x;
+}
diff --git a/gsl-1.9/cdf/lognormal.c b/gsl-1.9/cdf/lognormal.c
new file mode 100644
index 0000000..5e2923e
--- /dev/null
+++ b/gsl-1.9/cdf/lognormal.c
@@ -0,0 +1,39 @@
+/* cdf/lognormal.c
+ *
+ * Copyright (C) 2003 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cdf.h>
+
+double
+gsl_cdf_lognormal_P (const double x, const double zeta, const double sigma)
+{
+ double u = (log (x) - zeta) / sigma;
+ double P = gsl_cdf_ugaussian_P (u);
+ return P;
+}
+
+double
+gsl_cdf_lognormal_Q (const double x, const double zeta, const double sigma)
+{
+ double u = (log (x) - zeta) / sigma;
+ double Q = gsl_cdf_ugaussian_Q (u);
+ return Q;
+}
diff --git a/gsl-1.9/cdf/lognormalinv.c b/gsl-1.9/cdf/lognormalinv.c
new file mode 100644
index 0000000..c2c47e8
--- /dev/null
+++ b/gsl-1.9/cdf/lognormalinv.c
@@ -0,0 +1,65 @@
+/* cdf/lognormalinv.c
+ *
+ * Copyright (C) 2003 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cdf.h>
+
+double
+gsl_cdf_lognormal_Pinv (const double P, const double zeta, const double sigma)
+{
+ double x, u;
+
+ if (P == 1.0)
+ {
+ return GSL_POSINF;
+ }
+ else if (P == 0.0)
+ {
+ return 0.0;
+ }
+
+ u = gsl_cdf_ugaussian_Pinv (P);
+
+ x = exp (zeta + sigma * u);
+
+ return x;
+}
+
+double
+gsl_cdf_lognormal_Qinv (const double Q, const double zeta, const double sigma)
+{
+ double x, u;
+
+ if (Q == 0.0)
+ {
+ return GSL_POSINF;
+ }
+ else if (Q == 1.0)
+ {
+ return 0.0;
+ }
+
+ u = gsl_cdf_ugaussian_Qinv (Q);
+
+ x = exp (zeta + sigma * u);
+
+ return x;
+}
diff --git a/gsl-1.9/cdf/nbinomial.c b/gsl-1.9/cdf/nbinomial.c
new file mode 100644
index 0000000..c2c17e7
--- /dev/null
+++ b/gsl-1.9/cdf/nbinomial.c
@@ -0,0 +1,83 @@
+/* cdf/negbinom.c
+ *
+ * Copyright (C) 2004 Jason H. Stover.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_cdf.h>
+
+#include "error.h"
+
+/*
+ * Pr(X <= k) for a negative binomial random variable X, i.e.,
+ * the probability of k or fewer failuers before success n.
+ */
+
+double
+gsl_cdf_negative_binomial_P (const unsigned int k, const double p, const double n)
+{
+ double P;
+ double a;
+ double b;
+
+ if (p > 1.0 || p < 0.0)
+ {
+ CDF_ERROR ("p < 0 or p > 1", GSL_EDOM);
+ }
+
+ if (n < 0)
+ {
+ CDF_ERROR ("n < 0", GSL_EDOM);
+ }
+
+ a = (double) n;
+ b = (double) k + 1.0;
+ P = gsl_cdf_beta_P (p, a, b);
+
+ return P;
+}
+
+/*
+ * Pr ( X > k ).
+ */
+
+double
+gsl_cdf_negative_binomial_Q (const unsigned int k, const double p, const double n)
+{
+ double Q;
+ double a;
+ double b;
+
+ if (p > 1.0 || p < 0.0)
+ {
+ CDF_ERROR ("p < 0 or p > 1", GSL_EDOM);
+ }
+
+ if (n < 0)
+ {
+ CDF_ERROR ("n < 0", GSL_EDOM);
+ }
+
+ a = (double) n;
+ b = (double) k + 1.0;
+ Q = gsl_cdf_beta_Q (p, a, b);
+
+ return Q;
+}
diff --git a/gsl-1.9/cdf/pareto.c b/gsl-1.9/cdf/pareto.c
new file mode 100644
index 0000000..3919155
--- /dev/null
+++ b/gsl-1.9/cdf/pareto.c
@@ -0,0 +1,57 @@
+/* cdf/pareto.c
+ *
+ * Copyright (C) 2003 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cdf.h>
+
+double
+gsl_cdf_pareto_P (const double x, const double a, const double b)
+{
+ double P;
+
+ if (x < b)
+ {
+ P = 0;
+ }
+ else
+ {
+ P = 1 - pow(b/x, a);
+ }
+
+ return P;
+}
+
+double
+gsl_cdf_pareto_Q (const double x, const double a, const double b)
+{
+ double Q;
+
+ if (x < b)
+ {
+ Q = 1;
+ }
+ else
+ {
+ Q = pow(b/x, a);
+ }
+
+ return Q;
+}
diff --git a/gsl-1.9/cdf/paretoinv.c b/gsl-1.9/cdf/paretoinv.c
new file mode 100644
index 0000000..04fff30
--- /dev/null
+++ b/gsl-1.9/cdf/paretoinv.c
@@ -0,0 +1,61 @@
+/* cdf/paretoinv.c
+ *
+ * Copyright (C) 2003 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cdf.h>
+
+double
+gsl_cdf_pareto_Pinv (const double P, const double a, const double b)
+{
+ double x;
+
+ if (P == 1.0)
+ {
+ return GSL_POSINF;
+ }
+ else if (P == 0.0)
+ {
+ return b;
+ }
+
+ x = b * exp(-log1p(-P)/a);
+
+ return x;
+}
+
+double
+gsl_cdf_pareto_Qinv (const double Q, const double a, const double b)
+{
+ double x;
+
+ if (Q == 0.0)
+ {
+ return GSL_POSINF;
+ }
+ else if (Q == 1.0)
+ {
+ return b;
+ }
+
+ x = b * exp(-log(Q) / a);
+
+ return x;
+}
diff --git a/gsl-1.9/cdf/pascal.c b/gsl-1.9/cdf/pascal.c
new file mode 100644
index 0000000..5eb0265
--- /dev/null
+++ b/gsl-1.9/cdf/pascal.c
@@ -0,0 +1,40 @@
+/* cdf/pascal.c
+ *
+ * Copyright (C) 2006 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cdf.h>
+
+/* The Pascal distribution is a negative binomial with valued integer n */
+
+
+double
+gsl_cdf_pascal_P (const unsigned int k, const double p, const unsigned int n)
+{
+ double P = gsl_cdf_negative_binomial_P (k, p, (double) n);
+ return P;
+}
+
+double
+gsl_cdf_pascal_Q (const unsigned int k, const double p, const unsigned int n)
+{
+ double Q = gsl_cdf_negative_binomial_Q (k, p, (double) n);
+ return Q;
+}
diff --git a/gsl-1.9/cdf/poisson.c b/gsl-1.9/cdf/poisson.c
new file mode 100644
index 0000000..cab0450
--- /dev/null
+++ b/gsl-1.9/cdf/poisson.c
@@ -0,0 +1,84 @@
+/* cdf/poisson.c
+ *
+ * Copyright (C) 2004 Jason H. Stover.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+/*
+ * Computes the cumulative distribution function for a Poisson
+ * random variable. For a Poisson random variable X with parameter
+ * mu,
+ *
+ * Pr( X <= k ) = Pr( Y >= p )
+ *
+ * where Y is a gamma random variable with parameters k+1 and 1.
+ *
+ * Reference:
+ *
+ * W. Feller, "An Introduction to Probability and Its
+ * Applications," volume 1. Wiley, 1968. Exercise 46, page 173,
+ * chapter 6.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_cdf.h>
+
+#include "error.h"
+
+/*
+ * Pr (X <= k) for a Poisson random variable X.
+ */
+
+double
+gsl_cdf_poisson_P (const unsigned int k, const double mu)
+{
+ double P;
+ double a;
+
+ if (mu <= 0.0)
+ {
+ CDF_ERROR ("mu <= 0", GSL_EDOM);
+ }
+
+ a = (double) k + 1.0;
+ P = gsl_cdf_gamma_Q (mu, a, 1.0);
+
+ return P;
+}
+
+/*
+ * Pr ( X > k ) for a Possion random variable X.
+ */
+
+double
+gsl_cdf_poisson_Q (const unsigned int k, const double mu)
+{
+ double Q;
+ double a;
+
+ if (mu <= 0.0)
+ {
+ CDF_ERROR ("mu <= 0", GSL_EDOM);
+ }
+
+ a = (double) k + 1.0;
+ Q = gsl_cdf_gamma_P (mu, a, 1.0);
+
+ return Q;
+}
diff --git a/gsl-1.9/cdf/rat_eval.h b/gsl-1.9/cdf/rat_eval.h
new file mode 100644
index 0000000..5e6fc19
--- /dev/null
+++ b/gsl-1.9/cdf/rat_eval.h
@@ -0,0 +1,25 @@
+static double
+rat_eval (const double a[], const size_t na,
+ const double b[], const size_t nb, const double x)
+{
+ size_t i, j;
+ double u, v, r;
+
+ u = a[na - 1];
+
+ for (i = na - 1; i > 0; i--)
+ {
+ u = x * u + a[i - 1];
+ }
+
+ v = b[nb - 1];
+
+ for (j = nb - 1; j > 0; j--)
+ {
+ v = x * v + b[j - 1];
+ }
+
+ r = u / v;
+
+ return r;
+}
diff --git a/gsl-1.9/cdf/rayleigh.c b/gsl-1.9/cdf/rayleigh.c
new file mode 100644
index 0000000..e0c3695
--- /dev/null
+++ b/gsl-1.9/cdf/rayleigh.c
@@ -0,0 +1,39 @@
+/* cdf/rayleigh.c
+ *
+ * Copyright (C) 2003 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cdf.h>
+
+double
+gsl_cdf_rayleigh_P (const double x, const double sigma)
+{
+ double u = x / sigma;
+ double P = -expm1 (-u*u/2);
+ return P;
+}
+
+double
+gsl_cdf_rayleigh_Q (const double x, const double sigma)
+{
+ double u = x / sigma;
+ double Q = exp (-u*u/2);
+ return Q;
+}
diff --git a/gsl-1.9/cdf/rayleighinv.c b/gsl-1.9/cdf/rayleighinv.c
new file mode 100644
index 0000000..f80de73
--- /dev/null
+++ b/gsl-1.9/cdf/rayleighinv.c
@@ -0,0 +1,61 @@
+/* cdf/rayleighinv.c
+ *
+ * Copyright (C) 2003 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cdf.h>
+
+double
+gsl_cdf_rayleigh_Pinv (const double P, const double sigma)
+{
+ double x;
+
+ if (P == 1.0)
+ {
+ return GSL_POSINF;
+ }
+ else if (P == 0.0)
+ {
+ return 0.0;
+ }
+
+ x = sigma * M_SQRT2 * sqrt (-log1p (-P));
+
+ return x;
+}
+
+double
+gsl_cdf_rayleigh_Qinv (const double Q, const double sigma)
+{
+ double x;
+
+ if (Q == 0.0)
+ {
+ return GSL_POSINF;
+ }
+ else if (Q == 1.0)
+ {
+ return 0.0;
+ }
+
+ x = sigma * M_SQRT2 * sqrt (-log (Q));
+
+ return x;
+}
diff --git a/gsl-1.9/cdf/tdist.c b/gsl-1.9/cdf/tdist.c
new file mode 100644
index 0000000..77e6bb8
--- /dev/null
+++ b/gsl-1.9/cdf/tdist.c
@@ -0,0 +1,271 @@
+/* cdf/tdist.c
+ *
+ * Copyright (C) 2002 Jason H. Stover.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+/*
+ * Computes the Student's t cumulative distribution function using
+ * the method detailed in
+ *
+ * W.J. Kennedy and J.E. Gentle, "Statistical Computing." 1980.
+ * Marcel Dekker. ISBN 0-8247-6898-1.
+ *
+ * G.W. Hill and A.W. Davis. "Generalized asymptotic expansions
+ * of Cornish-Fisher type." Annals of Mathematical Statistics,
+ * vol. 39, 1264-1273. 1968.
+ *
+ * G.W. Hill. "Algorithm 395: Student's t-distribution," Communications
+ * of the ACM, volume 13, number 10, page 617. October 1970.
+ *
+ * G.W. Hill, "Remark on algorithm 395: Student's t-distribution,"
+ * Transactions on Mathematical Software, volume 7, number 2, page
+ * 247. June 1982.
+ */
+
+#include <config.h>
+#include <gsl/gsl_cdf.h>
+#include <gsl/gsl_sf_gamma.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+
+#include "beta_inc.c"
+
+static double
+poly_eval (const double c[], unsigned int n, double x)
+{
+ unsigned int i;
+ double y = c[0] * x;
+
+ for (i = 1; i < n; i++)
+ {
+ y = x * (y + c[i]);
+ }
+
+ y += c[n];
+
+ return y;
+}
+
+/*
+ * Use the Cornish-Fisher asymptotic expansion to find a point u such
+ * that gsl_cdf_gauss(y) = tcdf(t).
+ *
+ */
+
+static double
+cornish_fisher (double t, double n)
+{
+ const double coeffs6[10] = {
+ 0.265974025974025974026,
+ 5.449696969696969696970,
+ 122.20294372294372294372,
+ 2354.7298701298701298701,
+ 37625.00902597402597403,
+ 486996.1392857142857143,
+ 4960870.65,
+ 37978595.55,
+ 201505390.875,
+ 622437908.625
+ };
+ const double coeffs5[8] = {
+ 0.2742857142857142857142,
+ 4.499047619047619047619,
+ 78.45142857142857142857,
+ 1118.710714285714285714,
+ 12387.6,
+ 101024.55,
+ 559494.0,
+ 1764959.625
+ };
+ const double coeffs4[6] = {
+ 0.3047619047619047619048,
+ 3.752380952380952380952,
+ 46.67142857142857142857,
+ 427.5,
+ 2587.5,
+ 8518.5
+ };
+ const double coeffs3[4] = {
+ 0.4,
+ 3.3,
+ 24.0,
+ 85.5
+ };
+
+ double a = n - 0.5;
+ double b = 48.0 * a * a;
+
+ double z2 = a * log1p (t * t / n);
+ double z = sqrt (z2);
+
+ double p5 = z * poly_eval (coeffs6, 9, z2);
+ double p4 = -z * poly_eval (coeffs5, 7, z2);
+ double p3 = z * poly_eval (coeffs4, 5, z2);
+ double p2 = -z * poly_eval (coeffs3, 3, z2);
+ double p1 = z * (z2 + 3.0);
+ double p0 = z;
+
+ double y = p5;
+ y = (y / b) + p4;
+ y = (y / b) + p3;
+ y = (y / b) + p2;
+ y = (y / b) + p1;
+ y = (y / b) + p0;
+
+ if (t < 0)
+ y *= -1;
+
+ return y;
+}
+
+#if 0
+/*
+ * Series approximation for t > 4.0. This needs to be fixed;
+ * it shouldn't subtract the result from 1.0. A better way is
+ * to use two different series expansions. Figuring this out
+ * means rummaging through Fisher's paper in Metron, v5, 1926,
+ * "Expansion of Student's integral in powers of n^{-1}."
+ */
+
+#define MAXI 40
+
+static double
+normal_approx (const double x, const double nu)
+{
+ double y;
+ double num;
+ double diff;
+ double q;
+ int i;
+ double lg1, lg2;
+
+ y = 1 / sqrt (1 + x * x / nu);
+ num = 1.0;
+ q = 0.0;
+ diff = 2 * GSL_DBL_EPSILON;
+ for (i = 2; (i < MAXI) && (diff > GSL_DBL_EPSILON); i += 2)
+ {
+ diff = q;
+ num *= y * y * (i - 1) / i;
+ q += num / (nu + i);
+ diff = q - diff;
+ }
+ q += 1 / nu;
+ lg1 = gsl_sf_lngamma (nu / 2.0);
+ lg2 = gsl_sf_lngamma ((nu + 1.0) / 2.0);
+
+ diff = lg2 - lg1;
+ q *= pow (y, nu) * exp (diff) / sqrt (M_PI);
+
+ return q;
+}
+#endif
+
+double
+gsl_cdf_tdist_P (const double x, const double nu)
+{
+ double P;
+
+ double x2 = x * x;
+
+ if (nu > 30 && x2 < 10 * nu)
+ {
+ double u = cornish_fisher (x, nu);
+ P = gsl_cdf_ugaussian_P (u);
+
+ return P;
+ }
+
+ if (x2 < nu)
+ {
+ double u = x2 / nu;
+ double eps = u / (1 + u);
+
+ if (x >= 0)
+ {
+ P = beta_inc_AXPY (0.5, 0.5, 0.5, nu / 2.0, eps);
+ }
+ else
+ {
+ P = beta_inc_AXPY (-0.5, 0.5, 0.5, nu / 2.0, eps);
+ }
+ }
+ else
+ {
+ double v = nu / (x * x);
+ double eps = v / (1 + v);
+
+ if (x >= 0)
+ {
+ P = beta_inc_AXPY (-0.5, 1.0, nu / 2.0, 0.5, eps);
+ }
+ else
+ {
+ P = beta_inc_AXPY (0.5, 0.0, nu / 2.0, 0.5, eps);
+ }
+ }
+
+ return P;
+}
+
+
+double
+gsl_cdf_tdist_Q (const double x, const double nu)
+{
+ double Q;
+
+ double x2 = x * x;
+
+ if (nu > 30 && x2 < 10 * nu)
+ {
+ double u = cornish_fisher (x, nu);
+ Q = gsl_cdf_ugaussian_Q (u);
+
+ return Q;
+ }
+
+ if (x2 < nu)
+ {
+ double u = x2 / nu;
+ double eps = u / (1 + u);
+
+ if (x >= 0)
+ {
+ Q = beta_inc_AXPY (-0.5, 0.5, 0.5, nu / 2.0, eps);
+ }
+ else
+ {
+ Q = beta_inc_AXPY (0.5, 0.5, 0.5, nu / 2.0, eps);
+ }
+ }
+ else
+ {
+ double v = nu / (x * x);
+ double eps = v / (1 + v);
+
+ if (x >= 0)
+ {
+ Q = beta_inc_AXPY (0.5, 0.0, nu / 2.0, 0.5, eps);
+ }
+ else
+ {
+ Q = beta_inc_AXPY (-0.5, 1.0, nu / 2.0, 0.5, eps);
+ }
+ }
+
+ return Q;
+}
diff --git a/gsl-1.9/cdf/tdistinv.c b/gsl-1.9/cdf/tdistinv.c
new file mode 100644
index 0000000..63ac409
--- /dev/null
+++ b/gsl-1.9/cdf/tdistinv.c
@@ -0,0 +1,232 @@
+/* cdf/tdistinv.c
+ *
+ * Copyright (C) 2002 Jason H. Stover.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_cdf.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_randist.h>
+#include <gsl/gsl_sf_gamma.h>
+
+#include <stdio.h>
+
+static double
+inv_cornish_fisher (double z, double nu)
+{
+ double a = 1 / (nu - 0.5);
+ double b = 48.0 / (a * a);
+
+ double cf1 = z * (3 + z * z);
+ double cf2 = z * (945 + z * z * (360 + z * z * (63 + z * z * 4)));
+
+ double y = z - cf1 / b + cf2 / (10 * b * b);
+
+ double t = GSL_SIGN (z) * sqrt (nu * expm1 (a * y * y));
+
+ return t;
+}
+
+
+double
+gsl_cdf_tdist_Pinv (const double P, const double nu)
+{
+ double x, ptail;
+
+ if (P == 1.0)
+ {
+ return GSL_POSINF;
+ }
+ else if (P == 0.0)
+ {
+ return GSL_NEGINF;
+ }
+
+ if (nu == 1.0)
+ {
+ x = tan (M_PI * (P - 0.5));
+ }
+ else if (nu == 2.0)
+ {
+ double a = 2 * P - 1;
+ x = a / sqrt (2 * (1 - a * a));
+ }
+
+ ptail = (P < 0.5) ? P : 1 - P;
+
+ if (sqrt (M_PI * nu / 2) * ptail > pow (0.05, nu / 2))
+ {
+ double xg = gsl_cdf_ugaussian_Pinv (P);
+ x = inv_cornish_fisher (xg, nu);
+ }
+ else
+ {
+ /* Use an asymptotic expansion of the tail of integral */
+
+ double beta = gsl_sf_beta (0.5, nu / 2);
+
+ if (P < 0.5)
+ {
+ x = -sqrt (nu) * pow (beta * nu * P, -1.0 / nu);
+ }
+ else
+ {
+ x = sqrt (nu) * pow (beta * nu * (1 - P), -1.0 / nu);
+ }
+
+ /* Correct nu -> nu/(1+nu/x^2) in the leading term to account
+ for higher order terms. This avoids overestimating x, which
+ makes the iteration unstable due to the rapidly decreasing
+ tails of the distribution. */
+
+ x /= sqrt (1 + nu / (x * x));
+ }
+
+ {
+ double dP, phi;
+ unsigned int n = 0;
+
+ start:
+ dP = P - gsl_cdf_tdist_P (x, nu);
+ phi = gsl_ran_tdist_pdf (x, nu);
+
+ if (dP == 0.0 || n++ > 32)
+ goto end;
+
+ {
+ double lambda = dP / phi;
+ double step0 = lambda;
+ double step1 = ((nu + 1) * x / (x * x + nu)) * (lambda * lambda / 4.0);
+
+ double step = step0;
+
+ if (fabs (step1) < fabs (step0))
+ {
+ step += step1;
+ }
+
+ if (P > 0.5 && x + step < 0)
+ x /= 2;
+ else if (P < 0.5 && x + step > 0)
+ x /= 2;
+ else
+ x += step;
+
+ if (fabs (step) > 1e-10 * fabs (x))
+ goto start;
+ }
+ }
+
+end:
+
+ return x;
+}
+
+double
+gsl_cdf_tdist_Qinv (const double Q, const double nu)
+{
+ double x, qtail;
+
+ if (Q == 0.0)
+ {
+ return GSL_POSINF;
+ }
+ else if (Q == 1.0)
+ {
+ return GSL_NEGINF;
+ }
+
+ if (nu == 1.0)
+ {
+ x = tan (M_PI * (0.5 - Q));
+ }
+ else if (nu == 2.0)
+ {
+ double a = 2 * (1 - Q) - 1;
+ x = a / sqrt (2 * (1 - a * a));
+ }
+
+ qtail = (Q < 0.5) ? Q : 1 - Q;
+
+ if (sqrt (M_PI * nu / 2) * qtail > pow (0.05, nu / 2))
+ {
+ double xg = gsl_cdf_ugaussian_Qinv (Q);
+ x = inv_cornish_fisher (xg, nu);
+ }
+ else
+ {
+ /* Use an asymptotic expansion of the tail of integral */
+
+ double beta = gsl_sf_beta (0.5, nu / 2);
+
+ if (Q < 0.5)
+ {
+ x = sqrt (nu) * pow (beta * nu * Q, -1.0 / nu);
+ }
+ else
+ {
+ x = -sqrt (nu) * pow (beta * nu * (1 - Q), -1.0 / nu);
+ }
+
+ /* Correct nu -> nu/(1+nu/x^2) in the leading term to account
+ for higher order terms. This avoids overestimating x, which
+ makes the iteration unstable due to the rapidly decreasing
+ tails of the distribution. */
+
+ x /= sqrt (1 + nu / (x * x));
+ }
+
+ {
+ double dQ, phi;
+ unsigned int n = 0;
+
+ start:
+ dQ = Q - gsl_cdf_tdist_Q (x, nu);
+ phi = gsl_ran_tdist_pdf (x, nu);
+
+ if (dQ == 0.0 || n++ > 32)
+ goto end;
+
+ {
+ double lambda = - dQ / phi;
+ double step0 = lambda;
+ double step1 = ((nu + 1) * x / (x * x + nu)) * (lambda * lambda / 4.0);
+
+ double step = step0;
+
+ if (fabs (step1) < fabs (step0))
+ {
+ step += step1;
+ }
+
+ if (Q < 0.5 && x + step < 0)
+ x /= 2;
+ else if (Q > 0.5 && x + step > 0)
+ x /= 2;
+ else
+ x += step;
+
+ if (fabs (step) > 1e-10 * fabs (x))
+ goto start;
+ }
+ }
+
+end:
+
+ return x;
+}
diff --git a/gsl-1.9/cdf/test.c b/gsl-1.9/cdf/test.c
new file mode 100644
index 0000000..b07702c
--- /dev/null
+++ b/gsl-1.9/cdf/test.c
@@ -0,0 +1,1327 @@
+/* cdf/test.c
+ *
+ * Copyright (C) 2002 Jason H Stover.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_randist.h>
+#include <gsl/gsl_cdf.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+
+#define TEST(func, args, value, tol) { double res = func args ; gsl_test_rel (res, value, tol, #func #args); } ;
+
+#define TEST_TOL0 (2.0*GSL_DBL_EPSILON)
+#define TEST_TOL1 (16.0*GSL_DBL_EPSILON)
+#define TEST_TOL2 (256.0*GSL_DBL_EPSILON)
+#define TEST_TOL3 (2048.0*GSL_DBL_EPSILON)
+#define TEST_TOL4 (16384.0*GSL_DBL_EPSILON)
+#define TEST_TOL5 (131072.0*GSL_DBL_EPSILON)
+#define TEST_TOL6 (1048576.0*GSL_DBL_EPSILON)
+
+void test_ugaussian (void);
+void test_ugaussianinv (void);
+void test_exponential (void);
+void test_exponentialinv (void);
+void test_exppow (void);
+void test_tdist (void);
+void test_fdist (void);
+void test_gamma (void);
+void test_chisq (void);
+void test_beta (void);
+void test_gammainv (void);
+void test_chisqinv (void);
+void test_tdistinv (void);
+void test_betainv (void);
+void test_finv (void);
+
+#include "test_auto.c"
+
+struct range { unsigned int min; unsigned int max; } ;
+double test_binomial_pdf (unsigned int n);
+double test_binomial_cdf_P (unsigned int n);
+double test_binomial_cdf_Q (unsigned int n);
+
+struct range
+test_binomial_range (void)
+{
+ struct range r = {0, 5};
+ return r;
+}
+
+double
+test_binomial_pdf (unsigned int k)
+{
+ return gsl_ran_binomial_pdf (k, 0.3, 5);
+}
+
+double
+test_binomial_cdf_P (unsigned int k)
+{
+ return gsl_cdf_binomial_P (k, 0.3, 5);
+}
+
+double
+test_binomial_cdf_Q (unsigned int k)
+{
+ return gsl_cdf_binomial_Q (k, 0.3, 5);
+}
+
+struct range
+test_poisson_range (void)
+{
+ struct range r = {0, 25};
+ return r;
+}
+
+double
+test_poisson_pdf (unsigned int k)
+{
+ return gsl_ran_poisson_pdf (k, 2.3);
+}
+
+double
+test_poisson_cdf_P (unsigned int k)
+{
+ return gsl_cdf_poisson_P (k, 2.3);
+}
+
+double
+test_poisson_cdf_Q (unsigned int k)
+{
+ return gsl_cdf_poisson_Q (k, 2.3);
+}
+
+struct range
+test_geometric_range (void)
+{
+ struct range r = {0, 25};
+ return r;
+}
+
+double
+test_geometric_pdf (unsigned int k)
+{
+ return gsl_ran_geometric_pdf (k, 0.3);
+}
+
+double
+test_geometric_cdf_P (unsigned int k)
+{
+ return gsl_cdf_geometric_P (k, 0.3);
+}
+
+double
+test_geometric_cdf_Q (unsigned int k)
+{
+ return gsl_cdf_geometric_Q (k, 0.3);
+}
+
+struct range
+test_negative_binomial_range (void)
+{
+ struct range r = {0, 15};
+ return r;
+}
+
+double
+test_negative_binomial_pdf (unsigned int k)
+{
+ return gsl_ran_negative_binomial_pdf (k, 0.3, 5.3);
+}
+
+double
+test_negative_binomial_cdf_P (unsigned int k)
+{
+ return gsl_cdf_negative_binomial_P (k, 0.3, 5.3);
+}
+
+double
+test_negative_binomial_cdf_Q (unsigned int k)
+{
+ return gsl_cdf_negative_binomial_Q (k, 0.3, 5.3);
+}
+
+struct range
+test_pascal_range (void)
+{
+ struct range r = {0, 15};
+ return r;
+}
+
+double
+test_pascal_pdf (unsigned int k)
+{
+ return gsl_ran_pascal_pdf (k, 0.3, 5);
+}
+
+double
+test_pascal_cdf_P (unsigned int k)
+{
+ return gsl_cdf_pascal_P (k, 0.3, 5);
+}
+
+double
+test_pascal_cdf_Q (unsigned int k)
+{
+ return gsl_cdf_pascal_Q (k, 0.3, 5);
+}
+
+struct range
+test_hypergeometric_range (void)
+{
+ struct range r = {0, 26};
+ return r;
+}
+
+double
+test_hypergeometric_pdf (unsigned int k)
+{
+ return gsl_ran_hypergeometric_pdf (k, 7, 19, 13);
+}
+
+double
+test_hypergeometric_cdf_P (unsigned int k)
+{
+ return gsl_cdf_hypergeometric_P (k, 7, 19, 13);
+}
+
+double
+test_hypergeometric_cdf_Q (unsigned int k)
+{
+ return gsl_cdf_hypergeometric_Q (k, 7, 19, 13);
+}
+
+#ifdef LOGARITHMIC
+struct range
+test_logarithmic_range (void)
+{
+ struct range r = {1, 200};
+ return r;
+}
+
+double
+test_logarithmic_pdf (unsigned int k)
+{
+ return gsl_ran_logarithmic_pdf (k, 0.9);
+}
+
+double
+test_logarithmic_cdf_P (unsigned int k)
+{
+ return gsl_cdf_logarithmic_P (k, 0.9);
+}
+
+double
+test_logarithmic_cdf_Q (unsigned int k)
+{
+ return gsl_cdf_logarithmic_Q (k, 0.9);
+}
+#endif
+
+void
+test_discrete_cdf_P (double (*pdf)(unsigned int),
+ double (*cdf_P)(unsigned int),
+ struct range (*range)(void),
+ const char * desc)
+{
+ double sum;
+ double tol = TEST_TOL2;
+ int i, min, max;
+
+ struct range r = range();
+
+ min = r.min;
+ max = r.max;
+ sum = 0.0;
+
+ for (i = min; i <= max; i++)
+ {
+ double pi = pdf(i);
+ double Pi = cdf_P(i);
+ sum += pi;
+ gsl_test_rel (Pi, sum, tol, desc, i);
+ }
+}
+
+void
+test_discrete_cdf_Q (double (*pdf)(unsigned int),
+ double (*cdf_Q)(unsigned int),
+ struct range (*range)(void),
+ const char * desc)
+{
+ double sum;
+ double tol = TEST_TOL2;
+ int i, min, max;
+
+ struct range r = range();
+
+ min = r.min;
+ max = r.max;
+ sum = cdf_Q(max);
+
+ for (i = max; i >= min; i--)
+ {
+ double pi = pdf(i);
+ double Qi = cdf_Q(i);
+ gsl_test_rel (Qi, sum, tol, desc, i);
+ sum += pi;
+ }
+}
+
+void
+test_discrete_cdf_PQ (double (*cdf_P)(unsigned int),
+ double (*cdf_Q)(unsigned int),
+ struct range (*range)(void),
+ const char * desc)
+{
+ double sum;
+ double tol = GSL_DBL_EPSILON;
+ int i, min, max;
+
+ struct range r = range();
+
+ min = r.min;
+ max = r.max;
+
+ for (i = min; i <= max; i++)
+ {
+ double Pi = cdf_P(i);
+ double Qi = cdf_Q(i);
+ sum = Pi + Qi;
+ gsl_test_rel (sum, 1.0, tol, desc, i);
+ }
+
+}
+
+#define TEST_DISCRETE(name) do { \
+ test_discrete_cdf_P(&test_ ## name ## _pdf, &test_ ## name ## _cdf_P, &test_ ## name ## _range, "test gsl_cdf_" #name "_P (k=%d)") ; \
+ test_discrete_cdf_Q(&test_ ## name ## _pdf, &test_ ## name ## _cdf_Q, &test_ ## name ## _range, "test gsl_cdf_" #name "_Q (k=%d)") ; \
+ test_discrete_cdf_PQ(&test_ ## name ## _cdf_P, &test_ ## name ## _cdf_Q, &test_ ## name ## _range, "test gsl_cdf_" #name "_P+Q (k=%d)") ; \
+} while (0);
+
+int
+main (void)
+{
+ gsl_ieee_env_setup ();
+
+ TEST_DISCRETE(binomial);
+ TEST_DISCRETE(poisson);
+ TEST_DISCRETE(geometric);
+ TEST_DISCRETE(negative_binomial);
+ TEST_DISCRETE(pascal);
+ TEST_DISCRETE(hypergeometric);
+
+#ifdef LOGARITHMIC
+ TEST_DISCRETE(logarithmic);
+#endif
+
+ /* exit (gsl_test_summary ()); */
+
+ /* Tests for gaussian cumulative distribution function
+ Function values computed with PARI, 28 digits precision */
+
+ test_ugaussian ();
+ test_exponential ();
+ test_exppow ();
+ test_tdist ();
+ test_fdist ();
+ test_gamma ();
+ test_chisq ();
+ test_beta ();
+
+ test_ugaussianinv ();
+ test_exponentialinv ();
+ test_gammainv ();
+ test_chisqinv ();
+ test_tdistinv ();
+ test_betainv ();
+ test_finv ();
+
+ test_auto_beta ();
+ test_auto_fdist ();
+ test_auto_cauchy ();
+ test_auto_gaussian ();
+ test_auto_laplace ();
+ test_auto_rayleigh ();
+ test_auto_flat ();
+ test_auto_lognormal ();
+ test_auto_gamma ();
+ test_auto_chisq ();
+ test_auto_tdist ();
+ test_auto_gumbel1 ();
+ test_auto_gumbel2 ();
+ test_auto_weibull ();
+ test_auto_pareto ();
+ test_auto_logistic ();
+ test_auto_gammalarge ();
+
+ exit (gsl_test_summary ());
+}
+
+void test_ugaussian (void)
+{
+ TEST (gsl_cdf_ugaussian_P, (0.0), 0.5, TEST_TOL0);
+ TEST (gsl_cdf_ugaussian_P, (1e-32), 0.5, TEST_TOL0);
+ TEST (gsl_cdf_ugaussian_P, (1e-16), 0.5000000000000000398942280401, TEST_TOL0);
+ TEST (gsl_cdf_ugaussian_P, (1e-8), 0.5000000039894228040143267129, TEST_TOL0);
+ TEST (gsl_cdf_ugaussian_P, (0.5), 0.6914624612740131036377046105, TEST_TOL0);
+ TEST (gsl_cdf_ugaussian_P, (0.7), 0.7580363477769269852506495717, TEST_TOL0);
+ TEST (gsl_cdf_ugaussian_P, (5.0), 0.9999997133484281208060883262, TEST_TOL0);
+ TEST (gsl_cdf_ugaussian_P, (10.0), 0.9999999999999999999999923801, TEST_TOL0);
+ TEST (gsl_cdf_ugaussian_P, (30.0), 1.000000000000000000000000000, TEST_TOL0);
+ TEST (gsl_cdf_ugaussian_P, (40.0), 1.000000000000000000000000000, TEST_TOL0);
+ TEST (gsl_cdf_ugaussian_P, (1e10), 1.000000000000000000000000000, TEST_TOL0);
+
+ TEST (gsl_cdf_ugaussian_P, (-1e-32), 0.5, TEST_TOL0);
+ TEST (gsl_cdf_ugaussian_P, (-1e-16), 0.4999999999999999601057719598, TEST_TOL0);
+ TEST (gsl_cdf_ugaussian_P, (-1e-8), 0.4999999960105771959856732870, TEST_TOL0);
+ TEST (gsl_cdf_ugaussian_P, (-0.5), 0.3085375387259868963622953894, TEST_TOL0);
+ TEST (gsl_cdf_ugaussian_P, (-0.7), 0.2419636522230730147493504282, TEST_TOL0);
+ TEST (gsl_cdf_ugaussian_P, (-5.0), 0.0000002866515718791939116737523329, TEST_TOL1);
+ TEST (gsl_cdf_ugaussian_P, (-10.0), 7.619853024160526065973343257e-24, TEST_TOL3);
+ TEST (gsl_cdf_ugaussian_P, (-30.0), 4.906713927148187059533809288e-198, TEST_TOL3);
+ TEST (gsl_cdf_ugaussian_P, (-1e10), 0.0, 0.0);
+
+ TEST (gsl_cdf_ugaussian_Q, (0.0), 0.5, TEST_TOL0);
+ TEST (gsl_cdf_ugaussian_Q, (1e-32), 0.5, TEST_TOL0);
+ TEST (gsl_cdf_ugaussian_Q, (1e-16), 0.4999999999999999601057719598, TEST_TOL0);
+ TEST (gsl_cdf_ugaussian_Q, (1e-8), 0.4999999960105771959856732870, TEST_TOL0);
+ TEST (gsl_cdf_ugaussian_Q, (0.5), 0.3085375387259868963622953894, TEST_TOL0);
+ TEST (gsl_cdf_ugaussian_Q, (0.7), 0.2419636522230730147493504282, TEST_TOL0);
+ TEST (gsl_cdf_ugaussian_Q, (5.0), 0.0000002866515718791939116737523329, TEST_TOL3);
+ TEST (gsl_cdf_ugaussian_Q, (10.0), 7.619853024160526065973343257e-24, TEST_TOL3);
+ TEST (gsl_cdf_ugaussian_Q, (30.0), 4.906713927148187059533809288e-198, TEST_TOL3);
+ TEST (gsl_cdf_ugaussian_Q, (1e10), 0.0, 0.0);
+
+ TEST (gsl_cdf_ugaussian_Q, (-1e-32), 0.5, TEST_TOL0);
+ TEST (gsl_cdf_ugaussian_Q, (-1e-16), 0.5000000000000000398942280401, TEST_TOL0);
+ TEST (gsl_cdf_ugaussian_Q, (-1e-8), 0.5000000039894228040143267129, TEST_TOL0);
+ TEST (gsl_cdf_ugaussian_Q, (-0.5), 0.6914624612740131036377046105, TEST_TOL0);
+ TEST (gsl_cdf_ugaussian_Q, (-0.7), 0.7580363477769269852506495717, TEST_TOL0);
+ TEST (gsl_cdf_ugaussian_Q, (-5.0), 0.9999997133484281208060883262, TEST_TOL0);
+ TEST (gsl_cdf_ugaussian_Q, (-10.0), 0.9999999999999999999999923801, TEST_TOL0);
+ TEST (gsl_cdf_ugaussian_Q, (-30.0), 1.000000000000000000000000000, TEST_TOL0);
+ TEST (gsl_cdf_ugaussian_Q, (-40.0), 1.000000000000000000000000000, TEST_TOL0);
+ TEST (gsl_cdf_ugaussian_Q, (-1e10), 1.000000000000000000000000000, TEST_TOL0);
+}
+ /* Test values from Abramowitz & Stegun, Handbook of Mathematical
+ Functions, Table 26.1. Error term is given by dx = dP / Z(x) */
+
+void test_ugaussianinv (void) {
+ TEST (gsl_cdf_ugaussian_Pinv, (0.9999997133), 5.0, 1e-4);
+ TEST (gsl_cdf_ugaussian_Pinv, (0.9999683288), 4.0, 1e-6);
+ TEST (gsl_cdf_ugaussian_Pinv, (0.9986501020), 3.0, 1e-8);
+ TEST (gsl_cdf_ugaussian_Pinv, (0.977249868051821), 2.0, 1e-14);
+ TEST (gsl_cdf_ugaussian_Pinv, (0.841344746068543), 1.0, TEST_TOL3);
+ TEST (gsl_cdf_ugaussian_Pinv, (0.691462461274013), 0.5, TEST_TOL2);
+ TEST (gsl_cdf_ugaussian_Pinv, (0.655421741610324), 0.4, TEST_TOL1);
+ TEST (gsl_cdf_ugaussian_Pinv, (0.617911422188953), 0.3, TEST_TOL1);
+ TEST (gsl_cdf_ugaussian_Pinv, (0.579259709439103), 0.2, TEST_TOL1);
+ TEST (gsl_cdf_ugaussian_Pinv, (0.539827837277029), 0.1, TEST_TOL1);
+ TEST (gsl_cdf_ugaussian_Pinv, (0.5), 0.0, TEST_TOL0);
+ TEST (gsl_cdf_ugaussian_Pinv, (4.60172162722971e-1), -0.1, TEST_TOL1);
+ TEST (gsl_cdf_ugaussian_Pinv, (4.20740290560897e-1), -0.2, TEST_TOL1);
+ TEST (gsl_cdf_ugaussian_Pinv, (3.82088577811047e-1), -0.3, TEST_TOL1);
+ TEST (gsl_cdf_ugaussian_Pinv, (3.44578258389676e-1), -0.4, TEST_TOL1);
+ TEST (gsl_cdf_ugaussian_Pinv, (3.08537538725987e-1), -0.5, TEST_TOL2);
+ TEST (gsl_cdf_ugaussian_Pinv, (1.58655253931457e-1), -1.0, TEST_TOL3);
+ TEST (gsl_cdf_ugaussian_Pinv, (2.2750131948179e-2), -2.0, 1e-14);
+ TEST (gsl_cdf_ugaussian_Pinv, (1.349898e-3), -3.0, 1e-8);
+ TEST (gsl_cdf_ugaussian_Pinv, (3.16712e-5), -4.0, 1e-6);
+ TEST (gsl_cdf_ugaussian_Pinv, (2.86648e-7), -5.0, 1e-4);
+
+ TEST (gsl_cdf_ugaussian_Pinv, (7.61985302416052e-24), -10.0, 1e-4);
+
+ TEST (gsl_cdf_ugaussian_Qinv, (7.61985302416052e-24), 10.0, 1e-4);
+
+ TEST (gsl_cdf_ugaussian_Qinv, (2.86648e-7), 5.0, 1e-4);
+ TEST (gsl_cdf_ugaussian_Qinv, (3.16712e-5), 4.0, 1e-6);
+ TEST (gsl_cdf_ugaussian_Qinv, (1.349898e-3), 3.0, 1e-8);
+ TEST (gsl_cdf_ugaussian_Qinv, (2.2750131948179e-2), 2.0, 1e-14);
+ TEST (gsl_cdf_ugaussian_Qinv, (1.58655253931457e-1), 1.0, TEST_TOL3);
+ TEST (gsl_cdf_ugaussian_Qinv, (3.08537538725987e-1), 0.5, TEST_TOL2);
+ TEST (gsl_cdf_ugaussian_Qinv, (3.44578258389676e-1), 0.4, TEST_TOL1);
+ TEST (gsl_cdf_ugaussian_Qinv, (3.82088577811047e-1), 0.3, TEST_TOL1);
+ TEST (gsl_cdf_ugaussian_Qinv, (4.20740290560897e-1), 0.2, TEST_TOL1);
+ TEST (gsl_cdf_ugaussian_Qinv, (4.60172162722971e-1), 0.1, TEST_TOL1);
+ TEST (gsl_cdf_ugaussian_Qinv, (0.5), 0.0, TEST_TOL0);
+ TEST (gsl_cdf_ugaussian_Qinv, (0.539827837277029), -0.1, TEST_TOL1);
+ TEST (gsl_cdf_ugaussian_Qinv, (0.579259709439103), -0.2, TEST_TOL1);
+ TEST (gsl_cdf_ugaussian_Qinv, (0.617911422188953), -0.3, TEST_TOL1);
+ TEST (gsl_cdf_ugaussian_Qinv, (0.655421741610324), -0.4, TEST_TOL1);
+ TEST (gsl_cdf_ugaussian_Qinv, (0.691462461274013), -0.5, TEST_TOL2);
+ TEST (gsl_cdf_ugaussian_Qinv, (0.841344746068543), -1.0, TEST_TOL3);
+ TEST (gsl_cdf_ugaussian_Qinv, (0.977249868051821), -2.0, 1e-14);
+ TEST (gsl_cdf_ugaussian_Qinv, (0.9986501020), -3.0, 1e-8);
+ TEST (gsl_cdf_ugaussian_Qinv, (0.9999683288), -4.0, 1e-6);
+ TEST (gsl_cdf_ugaussian_Qinv, (0.9999997133), -5.0, 1e-4);
+}
+
+
+ /* Tests for exponential cumulative distribution function
+ Function values computed with PARI, 28 digits precision */
+
+void test_exponential (void)
+{
+ TEST (gsl_cdf_exponential_P, (0.1, 0.7), 1.33122100249818372e-1, TEST_TOL0);
+ TEST (gsl_cdf_exponential_P, (1e-32, 0.7), 1.42857142857142857e-32, TEST_TOL0);
+ TEST (gsl_cdf_exponential_P, (1000.0, 0.7), 1.0, TEST_TOL6);
+
+ TEST (gsl_cdf_exponential_Q, (0.1, 0.7), 8.66877899750181628e-1, TEST_TOL0);
+ TEST (gsl_cdf_exponential_Q, (1e-32, 0.7), 1.0, TEST_TOL0);
+ TEST (gsl_cdf_exponential_Q, (1000.0, 0.7), 0.0, TEST_TOL6);
+}
+
+void test_exponentialinv (void) {
+ TEST (gsl_cdf_exponential_Pinv, (0.13, 0.7), 9.74834471334553546e-2, TEST_TOL0);
+ TEST (gsl_cdf_exponential_Pinv, (1.42e-32, 0.7), 9.94000000000000000e-33, TEST_TOL0);
+
+ TEST (gsl_cdf_exponential_Qinv, (0.86, 0.7), 1.05576022814208545e-1, TEST_TOL0);
+ TEST (gsl_cdf_exponential_Qinv, (0.99999, 0.7), 7.00003500023333508e-6, TEST_TOL6);
+}
+
+
+
+void test_exppow (void)
+{
+ TEST (gsl_cdf_exppow_P, (-1000.0, 0.7, 1.8), 0.0, TEST_TOL6);
+ TEST (gsl_cdf_exppow_P, (-0.1, 0.7, 1.8), 0.4205349082867515493458053850, TEST_TOL0);
+ TEST (gsl_cdf_exppow_P, (-1e-32, 0.7, 1.8), 0.4999999999999999999999999999, TEST_TOL0);
+
+ TEST (gsl_cdf_exppow_P, (0.1, 0.7, 1.8), 0.5794650917132484506541946149, TEST_TOL0);
+ TEST (gsl_cdf_exppow_P, (1e-32, 0.7, 1.8), 0.5, TEST_TOL0);
+ TEST (gsl_cdf_exppow_P, (1000.0, 0.7, 1.8), 0.9999999999999999999999956212, TEST_TOL6);
+
+ TEST (gsl_cdf_exppow_Q, (-1000.0, 0.7, 1.8), 0.9999999999999999999999956212, TEST_TOL6);
+ TEST (gsl_cdf_exppow_Q, (-0.1, 0.7, 1.8), 0.5794650917132484506541946149, TEST_TOL0);
+ TEST (gsl_cdf_exppow_Q, (-1e-32, 0.7, 1.8), 0.5, TEST_TOL0);
+
+ TEST (gsl_cdf_exppow_Q, (0.1, 0.7, 1.8), 0.4205349082867515493458053850, TEST_TOL0);
+ TEST (gsl_cdf_exppow_Q, (1e-32, 0.7, 1.8), 0.4999999999999999999999999999, TEST_TOL0);
+ TEST (gsl_cdf_exppow_Q, (1000.0, 0.7, 1.8), 0.0, TEST_TOL6);
+}
+
+
+ /* Tests for student's T distribution */
+
+ /* p(x,nu) = (1/2)*(1+sign(x)*betaI(x^2/(nu+x^2),1/2,nu/2))
+ q(x,nu) = (1/2)*(1-sign(x)*betaI(x^2/(nu+x^2),1/2,nu/2)) */
+
+void test_tdist (void) {
+ TEST (gsl_cdf_tdist_P, (0.0, 1.0), 0.5, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (1e-100, 1.0), 0.5, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (0.001, 1.0), 5.00318309780080559e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (0.01, 1.0), 5.03182992764908255e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (0.1, 1.0), 5.31725517430553569e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (0.325, 1.0), 6.00023120032852123e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (1.0, 1.0), 0.75000000000000000e0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (1.5, 1.0), 8.12832958189001183e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (2.0, 1.0), 8.52416382349566726e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (10.0, 1.0), 9.68274482569446430e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (20.0, 1.0), 9.84097748743823625e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (100.0, 1.0), 9.96817007235091745e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (1000.0, 1.0), 9.99681690219919441e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (10000.0, 1.0), 9.99968169011487724e-1, TEST_TOL6);
+
+ TEST (gsl_cdf_tdist_Q, (0.0, 1.0), 0.5, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (1e-100, 1.0), 0.5, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (0.001, 1.0), 4.99681690219919441e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (0.01, 1.0), 4.96817007235091745e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (0.1, 1.0), 4.68274482569446430e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (0.325, 1.0), 3.99976879967147876e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (1.0, 1.0), 2.5e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (1.5, 1.0), 1.87167041810998816e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (2.0, 1.0), 1.47583617650433274e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (10.0, 1.0), 3.17255174305535695e-2, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (20.0, 1.0), 1.59022512561763752e-2, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (100.0, 1.0), 3.18299276490825515e-3, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (1000.0, 1.0), 3.18309780080558939e-4, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (10000.0, 1.0), 3.18309885122757724e-5, TEST_TOL6);
+
+ TEST (gsl_cdf_tdist_P, (-1e-100, 1.0), 0.5, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (-0.001, 1.0), 4.99681690219919441e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (-0.01, 1.0), 4.96817007235091744e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (-0.1, 1.0), 4.68274482569446430e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (-0.325, 1.0), 3.99976879967147876e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (-1.0, 1.0), 0.25, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (-1.5, 1.0), 1.87167041810998816e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (-2.0, 1.0), 1.47583617650433274e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (-10.0, 1.0), 3.17255174305535695e-2, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (-20.0, 1.0), 1.59022512561763751e-2, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (-100.0, 1.0), 3.18299276490825514e-3, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (-1000.0, 1.0), 3.18309780080558938e-4, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (-10000.0, 1.0), 3.18309885122757724e-5, TEST_TOL6);
+
+ TEST (gsl_cdf_tdist_Q, (-1e-100, 1.0), 0.5, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (-0.001, 1.0), 5.00318309780080559e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (-0.01, 1.0), 5.03182992764908255e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (-0.1, 1.0), 5.31725517430553570e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (-0.325, 1.0), 6.00023120032852124e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (-1.0, 1.0), 7.5e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (-1.5, 1.0), 8.12832958189001184e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (-2.0, 1.0), 8.52416382349566726e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (-10.0, 1.0), 9.68274482569446430e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (-20.0, 1.0), 9.84097748743823625e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (-100.0, 1.0), 9.96817007235091745e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (-1000.0, 1.0), 9.99681690219919441e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (-10000.0, 1.0), 9.99968169011487724e-1, TEST_TOL6);
+
+ TEST (gsl_cdf_tdist_P, (0.0, 2.0), 5.00000000000000000e-01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (1e-100, 2.0), 5.00000000000000000e-01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (0.001, 2.0), 5.00353553302204959e-01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (0.01, 2.0), 5.03535445520899514e-01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (0.1, 2.0), 5.35267280792929913e-01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (0.325, 2.0), 6.11985772746873767e-01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (1.0, 2.0), 7.88675134594812882e-01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (1.5, 2.0), 8.63803437554499460e-01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (2.0, 2.0), 9.08248290463863016e-01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (10.0, 2.0), 9.95073771488337154e-01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (20.0, 2.0), 9.98754668053816452e-01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (100.0, 2.0), 9.99950007498750219e-01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (1000.0, 2.0), 9.99999500000749945e-01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (10000.0, 2.0), 9.999999950000000739e-01, TEST_TOL6);
+
+ TEST (gsl_cdf_tdist_Q, (0.0, 2.0), 5.00000000000000000e-01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (1e-100, 2.0), 5.00000000000000000e-01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (0.001, 2.0), 4.99646446697795041e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (0.01, 2.0), 4.96464554479100486e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (0.1, 2.0), 4.64732719207070087e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (0.325, 2.0), 3.88014227253126233e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (1.0, 2.0), 2.11324865405187118e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (1.5, 2.0), 1.36196562445500540e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (2.0, 2.0), 9.17517095361369836e-2, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (10.0, 2.0), 4.92622851166284542e-3, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (20.0, 2.0), 1.24533194618354849e-3, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (100.0, 2.0), 4.99925012497812894e-5, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (1000.0, 2.0), 4.99999250001249998e-7, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (10000.0, 2.0), 4.99999992500000125e-9, TEST_TOL6);
+
+ TEST (gsl_cdf_tdist_P, (-1e-100, 2.0), 5.00000000000000000e-01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (-0.001, 2.0), 4.99646446697795041e-01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (-0.01, 2.0), 4.96464554479100486e-01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (-0.1, 2.0), 4.64732719207070087e-01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (-0.325, 2.0), 3.88014227253126233e-01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (-1.0, 2.0), 2.11324865405187118e-01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (-1.5, 2.0), 1.36196562445500540e-01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (-2.0, 2.0), 9.17517095361369836e-02, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (-10.0, 2.0), 4.92622851166284542e-03, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (-20.0, 2.0), 1.24533194618354849e-03, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (-100.0, 2.0), 4.99925012497812894e-05, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (-1000.0, 2.0), 4.99999250001249998e-07, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (-10000.0, 2.0), 4.99999992500000125e-09, TEST_TOL6);
+
+ TEST (gsl_cdf_tdist_Q, (-1e-100, 2.0), 5.00000000000000000e-01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (-0.001, 2.0), 5.00353553302204959e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (-0.01, 2.0), 5.03535445520899514e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (-0.1, 2.0), 5.35267280792929913e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (-0.325, 2.0), 6.11985772746873767e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (-1.0, 2.0), 7.88675134594812882e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (-1.5, 2.0), 8.63803437554499460e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (-2.0, 2.0), 9.08248290463863016e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (-10.0, 2.0), 9.95073771488337155e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (-20.0, 2.0), 9.98754668053816452e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (-100.0, 2.0), 9.99950007498750219e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (-1000.0, 2.0), 9.99999500000749999e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (-10000.0, 2.0), 9.99999995000000075e-1, TEST_TOL6);
+
+ TEST (gsl_cdf_tdist_P, (0.0, 300.0), 5.00000000000000000e-01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (1e-100, 300.0), 5.00000000000000000e-01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (0.001, 300.0), 5.00398609900942949e-01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (0.01, 300.0), 5.03986033020559088e-01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (0.1, 300.0), 5.39794441177768194e-01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (0.325, 300.0), 6.27296201542523812e-01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (1.0, 300.0), 8.40941797784686861e-01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (1.5, 300.0), 9.32666983425369137e-01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (2.0, 300.0), 9.76799239508425455e-01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (10.0, 300.0), 1.00000000000000000e+00, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (20.0, 300.0), 1.00000000000000000e+00, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (100.0, 300.0), 1.00000000000000000e+00, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (1000.0, 300.0), 1.00000000000000000e+00, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (10000.0, 300.0), 1.00000000000000000e+00, TEST_TOL6);
+
+ TEST (gsl_cdf_tdist_Q, (0.0, 300.0), 5.00000000000000000e-01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (1e-100, 300.0), 5.00000000000000000e-01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (0.001, 300.0), 4.99601390099057051e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (0.01, 300.0), 4.96013966979440912e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (0.1, 300.0), 4.60205558822231806e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (0.325, 300.0), 3.72703798457476188e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (1.0, 300.0), 1.59058202215313138e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (1.5, 300.0), 6.73330165746308628e-2, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (2.0, 300.0), 2.32007604915745452e-2, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (10.0, 300.0), 8.279313677e-21, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (20.0, 300.0), 1.93159812815803978e-57, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (100.0, 300.0), 1.02557519997736154e-232, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (1000.0, 300.0), 0.00000000000000000e+00, 0.0);
+ TEST (gsl_cdf_tdist_Q, (10000.0, 300.0), 0.00000000000000000e+00, 0.0);
+
+ TEST (gsl_cdf_tdist_P, (-1e-100, 300.0), 5.00000000000000000e-01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (-0.001, 300.0), 4.99601390099057051e-01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (-0.01, 300.0), 4.96013966979440912e-01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (-0.1, 300.0), 4.60205558822231806e-01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (-0.325, 300.0), 3.72703798457476188e-01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (-1.0, 300.0), 1.59058202215313138e-01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (-1.5, 300.0), 6.73330165746308628e-02, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (-2.0, 300.0), 2.32007604915745452e-02, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (-10.0, 300.0), 8.279313675556272534e-21, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (-20.0, 300.0), 1.93159812815803978e-57, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (-100.0, 300.0), 1.02557519997736154e-232, TEST_TOL6);
+ TEST (gsl_cdf_tdist_P, (-1000.0, 300.0), 0.0, 0.0);
+ TEST (gsl_cdf_tdist_P, (-10000.0, 300.0), 0.0, 0.0);
+
+ TEST (gsl_cdf_tdist_Q, (-1e-100, 300.0), 5.00000000000000000e-01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (-0.001, 300.0), 5.00398609900942949e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (-0.01, 300.0), 5.03986033020559088e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (-0.1, 300.0), 5.39794441177768194e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (-0.325, 300.0), 6.27296201542523812e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (-1.0, 300.0), 8.40941797784686862e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (-1.5, 300.0), 9.32666983425369137e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (-2.0, 300.0), 9.76799239508425455e-1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (-10.0, 300.0), 1.000000000000000000e0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (-20.0, 300.0), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (-100.0, 300.0), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (-1000.0, 300.0), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Q, (-10000.0, 300.0), 1.0, TEST_TOL6);
+}
+
+ /* Tests for F distribution */
+
+ /* p(x, nu1, nu2) := betaI(1 / (1 + nu2 / nu1 * x), nu1 / 2, nu2 / 2) */
+
+void test_fdist (void) {
+ TEST (gsl_cdf_fdist_P, (0.0, 1.2, 1.3), 0.0, 0.0);
+ TEST (gsl_cdf_fdist_P, (1e-100, 1.2, 1.3), 6.98194275525039002e-61, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (0.001, 1.2, 1.3), 1.10608485860238564e-2, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (0.01, 1.2, 1.3), 4.38636757068313850e-2, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (0.1, 1.2, 1.3), 1.68242392712840734e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (0.325, 1.2, 1.3), 3.14130045246195449e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (1.0, 1.2, 1.3), 5.09630779074755253e-01, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (1.5, 1.2, 1.3), 5.83998640641553852e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (2.0, 1.2, 1.3), 6.34733581351938787e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (10.0, 1.2, 1.3), 8.48446237879200975e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (20.0, 1.2, 1.3), 9.00987726336875039e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (100.0, 1.2, 1.3), 9.64489127047688435e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (1000.0, 1.2, 1.3), 9.92012051694116388e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (10000.0, 1.2, 1.3), 9.98210862808842585e-1, TEST_TOL6);
+
+ TEST (gsl_cdf_fdist_Q, (0.0, 1.2, 1.3), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (1e-100, 1.2, 1.3), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (0.001, 1.2, 1.3), 9.88939151413976144e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (0.01, 1.2, 1.3), 9.56136324293168615e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (0.1, 1.2, 1.3), 8.31757607287159265e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (0.325, 1.2, 1.3), 6.85869954753804551e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (1.0, 1.2, 1.3), 4.90369220925244747e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (1.5, 1.2, 1.3), 4.16001359358446148e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (2.0, 1.2, 1.3), 3.65266418648061213e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (10.0, 1.2, 1.3), 1.51553762120799025e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (20.0, 1.2, 1.3), 9.90122736631249612e-2, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (100.0, 1.2, 1.3), 3.55108729523115643e-2, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (1000.0, 1.2, 1.3), 7.98794830588361109e-3, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (10000.0, 1.2, 1.3), 1.7891371911574145e-3, TEST_TOL6);
+
+
+ TEST (gsl_cdf_fdist_P, (0.0, 500.0, 1.3), 0.0, 0.0);
+ TEST (gsl_cdf_fdist_P, (1e-100, 500.0, 1.3), 0.0, 0.0);
+
+ TEST (gsl_cdf_fdist_P, (0.001, 500.0, 1.3), 9.83434460393304765e-141, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (0.01, 500.0, 1.3), 1.45915624888550014e-26, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (0.1, 500.0, 1.3), 5.89976509619688165e-4, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (0.325, 500.0, 1.3), 6.86110486051542533e-2, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (1.0, 500.0, 1.3), 3.38475053806404615e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (1.5, 500.0, 1.3), 4.52016245247457422e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (2.0, 500.0, 1.3), 5.27339068937388798e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (10.0, 500.0, 1.3), 8.16839628578413905e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (20.0, 500.0, 1.3), 8.81784623056911406e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (100.0, 500.0, 1.3), 9.58045057204221295e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (1000.0, 500.0, 1.3), 9.90585749380655275e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (10000.0, 500.0, 1.3), 9.97891924831461387e-1, TEST_TOL6);
+
+ TEST (gsl_cdf_fdist_Q, (0.0, 500.0, 1.3), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (1e-100, 500.0, 1.3), 1.0, TEST_TOL6);
+
+ TEST (gsl_cdf_fdist_Q, (0.001, 500.0, 1.3), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (0.01, 500.0, 1.3), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (0.1, 500.0, 1.3), 9.99410023490380312e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (0.325, 500.0, 1.3), 9.31388951394845747e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (1.0, 500.0, 1.3), 6.61524946193595385e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (1.5, 500.0, 1.3), 5.47983754752542572e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (2.0, 500.0, 1.3), 4.72660931062611202e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (10.0, 500.0, 1.3), 1.83160371421586096e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (20.0, 500.0, 1.3), 1.18215376943088595e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (100.0, 500.0, 1.3), 4.19549427957787016e-2, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (1000.0, 500.0, 1.3), 9.41425061934473424e-3, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (10000.0, 500.0, 1.3), 2.10807516853862603e-3, TEST_TOL6);
+
+ TEST (gsl_cdf_fdist_P, (0.0, 1.2, 500.0), 0.0, 0.0);
+ TEST (gsl_cdf_fdist_P, (1e-100, 1.2, 500.0), 8.23342055585482999e-61, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (0.001, 1.2, 500.0), 1.30461496441289529e-2, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (0.01, 1.2, 500.0), 5.18324224608033294e-2, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (0.1, 1.2, 500.0), 2.02235101716076289e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (0.325, 1.2, 500.0), 3.90502983219393749e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (1.0, 1.2, 500.0), 6.67656191574653619e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (1.5, 1.2, 500.0), 7.75539230271467054e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (2.0, 1.2, 500.0), 8.45209114904613705e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (10.0, 1.2, 500.0), 9.99168017659120988e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (20.0, 1.2, 500.0), 9.99998005738371669e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (100.0, 1.2, 500.0), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (1000.0, 1.2, 500.0), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (10000.0, 1.2, 500.0), 1.0, TEST_TOL6);
+
+ TEST (gsl_cdf_fdist_Q, (0.0, 1.2, 500.0), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (1e-100, 1.2, 500.0), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (0.001, 1.2, 500.0), 9.86953850355871047e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (0.01, 1.2, 500.0), 9.48167577539196671e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (0.1, 1.2, 500.0), 7.97764898283923711e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (0.325, 1.2, 500.0), 6.09497016780606251e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (1.0, 1.2, 500.0), 3.32343808425346381e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (1.5, 1.2, 500.0), 2.24460769728532946e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (2.0, 1.2, 500.0), 1.54790885095386295e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (10.0, 1.2, 500.0), 8.3198234087901168e-4, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (20.0, 1.2, 500.0), 1.99426162833131e-6, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (100.0, 1.2, 500.0), 6.23302662288217117e-25, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (1000.0, 1.2, 500.0), 1.14328577259666930e-134, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (10000.0, 1.2, 500.0), 0.0, 0.0);
+
+
+ TEST (gsl_cdf_fdist_P, (0.0, 200.0, 500.0), 0.0, 0.0);
+ TEST (gsl_cdf_fdist_P, (1e-100, 200.0, 500.0), 0.0, 0.0);
+ TEST (gsl_cdf_fdist_P, (0.001, 200.0, 500.0), 4.09325080403669893e-251, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (0.01, 200.0, 500.0), 1.17894325419628688e-151, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (0.1, 200.0, 500.0), 5.92430940796861258e-57, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (0.325, 200.0, 500.0), 3.18220452357263554e-18, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (1.0, 200.0, 500.0), 5.06746326121168266e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (1.5, 200.0, 500.0), 9.99794175718712438e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (2.0, 200.0, 500.0), 9.99999999528236152e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (10.0, 200.0, 500.0), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (20.0, 200.0, 500.0), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (100.0, 200.0, 500.0), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (1000.0, 200.0, 500.0), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_P, (10000.0, 200.0, 500.0), 1.0, TEST_TOL6);
+
+ TEST (gsl_cdf_fdist_Q, (0.0, 200.0, 500.0), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (1e-100, 200.0, 500.0), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (0.001, 200.0, 500.0), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (0.01, 200.0, 500.0), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (0.1, 200.0, 500.0), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (0.325, 200.0, 500.0), 9.99999999999999997e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (1.0, 200.0, 500.0), 4.93253673878831734e-1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (1.5, 200.0, 500.0), 2.05824281287561795e-4, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (2.0, 200.0, 500.0), 4.71763848371410786e-10, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (10.0, 200.0, 500.0), 5.98048337181948436e-96, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (20.0, 200.0, 500.0), 2.92099265879979502e-155, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Q, (1000.0, 200.0, 500.0), 0.0, 0.0);
+ TEST (gsl_cdf_fdist_Q, (10000.0, 200.0, 500.0), 0.0, 0.0);
+}
+
+void test_finv (void) {
+ TEST (gsl_cdf_fdist_Pinv, (0.0, 1.2, 1.3), 0.0, 0.0);
+ TEST (gsl_cdf_fdist_Pinv, ( 6.98194275525039002e-61, 1.2, 1.3), 1e-100, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Pinv, ( 1.10608485860238564e-2, 1.2, 1.3), 0.001, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Pinv, ( 4.38636757068313850e-2, 1.2, 1.3), 0.01, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Pinv, ( 1.68242392712840734e-1, 1.2, 1.3), 0.1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Pinv, ( 3.14130045246195449e-1, 1.2, 1.3), 0.325, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Pinv, ( 5.09630779074755253e-01, 1.2, 1.3), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Pinv, ( 5.83998640641553852e-1, 1.2, 1.3), 1.5, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Pinv, ( 6.34733581351938787e-1, 1.2, 1.3), 2.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Pinv, ( 8.48446237879200975e-1, 1.2, 1.3), 10.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Pinv, ( 9.00987726336875039e-1, 1.2, 1.3), 20.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Pinv, ( 9.64489127047688435e-1, 1.2, 1.3), 100.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Pinv, ( 9.92012051694116388e-1, 1.2, 1.3), 1000.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Pinv, ( 9.98210862808842585e-1, 1.2, 1.3), 10000.0, TEST_TOL6);
+
+ TEST (gsl_cdf_fdist_Qinv, ( 1.0, 1.2, 1.3), 0.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Qinv, ( 9.88939151413976144e-1, 1.2, 1.3), 0.001, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Qinv, ( 9.56136324293168615e-1, 1.2, 1.3), 0.01, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Qinv, ( 8.31757607287159265e-1, 1.2, 1.3), 0.1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Qinv, ( 6.85869954753804551e-1, 1.2, 1.3), 0.325, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Qinv, ( 4.90369220925244747e-1, 1.2, 1.3), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Qinv, ( 4.16001359358446148e-1, 1.2, 1.3), 1.5, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Qinv, ( 3.65266418648061213e-1, 1.2, 1.3), 2.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Qinv, ( 1.51553762120799025e-1, 1.2, 1.3), 10.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Qinv, ( 9.90122736631249612e-2, 1.2, 1.3), 20.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Qinv, ( 3.55108729523115643e-2, 1.2, 1.3), 100.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Qinv, ( 7.98794830588361109e-3, 1.2, 1.3), 1000.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Qinv, ( 1.7891371911574145e-3, 1.2, 1.3), 10000.0, TEST_TOL6);
+
+
+ TEST (gsl_cdf_fdist_Pinv, ( 0.0, 500.0, 1.3), 0.0, 0.0);
+
+ TEST (gsl_cdf_fdist_Pinv, ( 9.83434460393304765e-141, 500.0, 1.3), 0.001, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Pinv, ( 1.45915624888550014e-26, 500.0, 1.3), 0.01, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Pinv, ( 5.89976509619688165e-4, 500.0, 1.3), 0.1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Pinv, ( 6.86110486051542533e-2, 500.0, 1.3), 0.325, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Pinv, ( 3.38475053806404615e-1, 500.0, 1.3), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Pinv, ( 4.52016245247457422e-1, 500.0, 1.3), 1.5, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Pinv, ( 5.27339068937388798e-1, 500.0, 1.3), 2.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Pinv, ( 8.16839628578413905e-1, 500.0, 1.3), 10.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Pinv, ( 8.81784623056911406e-1, 500.0, 1.3), 20.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Pinv, ( 9.58045057204221295e-1, 500.0, 1.3), 100.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Pinv, ( 9.90585749380655275e-1, 500.0, 1.3), 1000.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Pinv, ( 9.97891924831461387e-1, 500.0, 1.3), 10000.0, TEST_TOL6);
+
+ TEST (gsl_cdf_fdist_Qinv, ( 1.0, 500.0, 1.3), 0.0, TEST_TOL6);
+
+ /*
+ * The algorithm currently implemented in gsl_cdf_fdist_Qinv and Pinv
+ * are not accurate for very large degrees of freedom, so the tests
+ * here are commented out. Another algorithm more suitable for
+ * these extreme values might pass these tests.
+ */
+
+ TEST (gsl_cdf_fdist_Qinv, ( 9.99410023490380312e-1, 500.0, 1.3), 0.1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Qinv, ( 9.31388951394845747e-1, 500.0, 1.3), 0.325, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Qinv, ( 6.61524946193595385e-1, 500.0, 1.3), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Qinv, ( 5.47983754752542572e-1, 500.0, 1.3), 1.5, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Qinv, ( 4.72660931062611202e-1, 500.0, 1.3), 2.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Qinv, ( 1.83160371421586096e-1, 500.0, 1.3), 10.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Qinv, ( 1.18215376943088595e-1, 500.0, 1.3), 20.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Qinv, ( 4.19549427957787016e-2, 500.0, 1.3), 100.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Qinv, ( 9.41425061934473424e-3, 500.0, 1.3), 1000.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Qinv, ( 2.10807516853862603e-3, 500.0, 1.3), 10000.0, TEST_TOL6);
+
+ TEST (gsl_cdf_fdist_Pinv, ( 0.0, 1.2, 500.0), 0.0, 0.0);
+ TEST (gsl_cdf_fdist_Pinv, ( 8.23342055585482999e-61, 1.2, 500.0), 1e-100, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Pinv, ( 1.30461496441289529e-2, 1.2, 500.0), 0.001, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Pinv, ( 5.18324224608033294e-2, 1.2, 500.0), 0.01, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Pinv, ( 2.02235101716076289e-1, 1.2, 500.0), 0.1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Pinv, ( 3.90502983219393749e-1, 1.2, 500.0), 0.325, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Pinv, ( 6.67656191574653619e-1, 1.2, 500.0), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Pinv, ( 7.75539230271467054e-1, 1.2, 500.0), 1.5, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Pinv, ( 8.45209114904613705e-1, 1.2, 500.0), 2.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Pinv, ( 9.99168017659120988e-1, 1.2, 500.0), 10.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Pinv, ( 9.99998005738371669e-1, 1.2, 500.0), 20.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Pinv, ( 1.0, 1.2, 500.0), GSL_POSINF, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Pinv, ( 1.0, 1.2, 500.0), GSL_POSINF, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Pinv, ( 1.0, 1.2, 500.0), GSL_POSINF, TEST_TOL6);
+
+ TEST (gsl_cdf_fdist_Qinv, ( 1.0, 1.2, 500.0), 0.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Qinv, ( 9.86953850355871047e-1, 1.2, 500.0), 0.001, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Qinv, ( 9.48167577539196671e-1, 1.2, 500.0), 0.01, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Qinv, ( 7.97764898283923711e-1, 1.2, 500.0), 0.1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Qinv, ( 6.09497016780606251e-1, 1.2, 500.0), 0.325, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Qinv, ( 3.32343808425346381e-1, 1.2, 500.0), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Qinv, ( 2.24460769728532946e-1, 1.2, 500.0), 1.5, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Qinv, ( 1.54790885095386295e-1, 1.2, 500.0), 2.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Qinv, ( 8.3198234087901168e-4, 1.2, 500.0), 10.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Qinv, ( 1.99426162833131e-6, 1.2, 500.0), 20.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Qinv, ( 6.23302662288217117e-25, 1.2, 500.0), 100.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Qinv, ( 1.14328577259666930e-134, 1.2, 500.0), 1000.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Qinv, ( 0.0, 1.2, 500.0), GSL_POSINF, 0.0);
+
+ TEST (gsl_cdf_fdist_Pinv, ( 0.0, 200.0, 500.0), 0.0, 0.0);
+ TEST (gsl_cdf_fdist_Pinv, ( 4.09325080403669893e-251, 200.0, 500.0), 0.001, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Pinv, ( 1.17894325419628688e-151, 200.0, 500.0), 0.01, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Pinv, ( 5.92430940796861258e-57, 200.0, 500.0), 0.1, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Pinv, ( 3.18220452357263554e-18, 200.0, 500.0), 0.325, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Pinv, ( 5.06746326121168266e-1, 200.0, 500.0), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Pinv, ( 9.99794175718712438e-1, 200.0, 500.0), 1.5, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Pinv, ( 1.0, 200.0, 500.0), GSL_POSINF, TEST_TOL6);
+
+ TEST (gsl_cdf_fdist_Qinv, ( 1.0, 200.0, 500.0), 0.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Qinv, ( 4.93253673878831734e-1, 200.0, 500.0), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Qinv, ( 2.05824281287561795e-4, 200.0, 500.0), 1.5, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Qinv, ( 4.71763848371410786e-10, 200.0, 500.0), 2.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Qinv, ( 5.98048337181948436e-96, 200.0, 500.0), 10.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Qinv, ( 2.92099265879979502e-155, 200.0, 500.0), 20.0, TEST_TOL6);
+ TEST (gsl_cdf_fdist_Qinv, ( 0.0, 200.0, 500.0), GSL_POSINF, 0.0);
+
+ TEST (gsl_cdf_fdist_Pinv, (0.95,1.0,261.0), 3.8773340322508720313e+00, TEST_TOL3);
+}
+
+ /* Tests for gamma distribution */
+
+ /* p(x, a, b) := gammaP(b, x / a) */
+
+void test_gamma (void)
+{
+ TEST (gsl_cdf_gamma_P, (0.0, 1.0, 1.0), 0.0, 0.0);
+ TEST (gsl_cdf_gamma_P, (1e-100, 1.0, 1.0), 1e-100, TEST_TOL6);
+ TEST (gsl_cdf_gamma_P, (0.001, 1.0, 1.0), 9.99500166625008332e-4, TEST_TOL6);
+ TEST (gsl_cdf_gamma_P, (0.01, 1.0, 1.0), 9.95016625083194643e-3, TEST_TOL6);
+ TEST (gsl_cdf_gamma_P, (0.1, 1.0, 1.0), 9.51625819640404268e-2, TEST_TOL6);
+ TEST (gsl_cdf_gamma_P, (0.325, 1.0, 1.0), 2.77472646357927811e-1, TEST_TOL6);
+ TEST (gsl_cdf_gamma_P, (1.0, 1.0, 1.0), 6.32120558828557678e-1, TEST_TOL6);
+ TEST (gsl_cdf_gamma_P, (1.5, 1.0, 1.0), 7.76869839851570171e-1, TEST_TOL6);
+ TEST (gsl_cdf_gamma_P, (2.0, 1.0, 1.0), 8.64664716763387308e-1, TEST_TOL6);
+ TEST (gsl_cdf_gamma_P, (10.0, 1.0, 1.0), 9.99954600070237515e-1, TEST_TOL6);
+ TEST (gsl_cdf_gamma_P, (20.0, 1.0, 1.0), 9.99999997938846378e-1, TEST_TOL6);
+ TEST (gsl_cdf_gamma_P, (100.0, 1.0, 1.0), 1e0, TEST_TOL6);
+ TEST (gsl_cdf_gamma_P, (1000.0, 1.0, 1.0), 1e0, TEST_TOL6);
+ TEST (gsl_cdf_gamma_P, (10000.0, 1.0, 1.0), 1e0, TEST_TOL6);
+
+ TEST (gsl_cdf_gamma_Q, (0.0, 1.0, 1.0), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Q, (1e-100, 1.0, 1.0), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Q, (0.001, 1.0, 1.0), 9.99000499833374992e-1, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Q, (0.01, 1.0, 1.0), 9.90049833749168054e-1, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Q, (0.1, 1.0, 1.0), 9.04837418035959573e-1, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Q, (0.325, 1.0, 1.0), 7.22527353642072189e-1, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Q, (1.0, 1.0, 1.0), 3.67879441171442322e-1, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Q, (1.5, 1.0, 1.0), 2.23130160148429829e-1, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Q, (2.0, 1.0, 1.0), 1.35335283236612692e-1, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Q, (10.0, 1.0, 1.0), 4.53999297624848515e-5, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Q, (20.0, 1.0, 1.0), 2.06115362243855783e-9, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Q, (100.0, 1.0, 1.0), 3.72007597602083596e-44, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Q, (1000.0, 1.0, 1.0), 0.0, 0.0);
+ TEST (gsl_cdf_gamma_Q, (10000.0, 1.0, 1.0), 0.0, 0.0);
+
+ TEST (gsl_cdf_gamma_P, (0.0, 1.0, 10.0), 0.0, 0.0);
+ TEST (gsl_cdf_gamma_P, (1e-100, 1.0, 10.0), 1e-101, TEST_TOL6);
+ TEST (gsl_cdf_gamma_P, (0.001, 1.0, 10.0), 9.99950001666625001e-5, TEST_TOL6);
+ TEST (gsl_cdf_gamma_P, (0.01, 1.0, 10.0), 9.99500166625008332e-4, TEST_TOL6);
+ TEST (gsl_cdf_gamma_P, (0.1, 1.0, 10.0), 9.95016625083194643e-3, TEST_TOL6);
+ TEST (gsl_cdf_gamma_P, (0.325, 1.0, 10.0), 3.19775501686939529e-2, TEST_TOL6);
+ TEST (gsl_cdf_gamma_P, (1.0, 1.0, 10.0), 9.51625819640404268e-2, TEST_TOL6);
+ TEST (gsl_cdf_gamma_P, (1.5, 1.0, 10.0), 1.39292023574942193e-1, TEST_TOL6);
+ TEST (gsl_cdf_gamma_P, (2.0, 1.0, 10.0), 1.81269246922018141e-1, TEST_TOL6);
+ TEST (gsl_cdf_gamma_P, (10.0, 1.0, 10.0), 6.32120558828557678e-1, TEST_TOL6);
+ TEST (gsl_cdf_gamma_P, (20.0, 1.0, 10.0), 8.64664716763387308e-1, TEST_TOL6);
+ TEST (gsl_cdf_gamma_P, (100.0, 1.0, 10.0), 9.99954600070237515e-1, TEST_TOL6);
+ TEST (gsl_cdf_gamma_P, (1000.0, 1.0, 10.0), 1e0, TEST_TOL6);
+ TEST (gsl_cdf_gamma_P, (10000.0, 1.0, 10.0), 1e0, TEST_TOL6);
+
+ TEST (gsl_cdf_gamma_Q, (0.0, 1.0, 10.0), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Q, (1e-100, 1.0, 10.0), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Q, (0.001, 1.0, 10.0), 9.99900004999833337e-1, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Q, (0.01, 1.0, 10.0), 9.99000499833374992e-1, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Q, (0.1, 1.0, 10.0), 9.90049833749168054e-1, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Q, (0.325, 1.0, 10.0), 9.68022449831306047e-1, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Q, (1.0, 1.0, 10.0), 9.04837418035959573e-1, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Q, (1.5, 1.0, 10.0), 8.60707976425057807e-1, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Q, (2.0, 1.0, 10.0), 8.18730753077981859e-1, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Q, (10.0, 1.0, 10.0), 3.67879441171442322e-1, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Q, (20.0, 1.0, 10.0), 1.35335283236612692e-1, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Q, (100.0, 1.0, 10.0), 4.53999297624848515e-5, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Q, (1000.0, 1.0, 10.0), 3.72007597602083596e-44, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Q, (10000.0, 1.0, 10.0), 0.0, 0.0);
+
+ TEST (gsl_cdf_gamma_P, (0.0, 17.0, 10.0), 0e0, 0.0);
+ TEST (gsl_cdf_gamma_P, (1e-100, 17.0, 10.0), 0e0, 0.0);
+ TEST (gsl_cdf_gamma_P, (0.001, 17.0, 10.0), 2.81119174040422844e-83, TEST_TOL6);
+ TEST (gsl_cdf_gamma_P, (0.01, 17.0, 10.0), 2.80880324651985887e-66, TEST_TOL6);
+ TEST (gsl_cdf_gamma_P, (0.1, 17.0, 10.0), 2.78502998087492130e-49, TEST_TOL6);
+ TEST (gsl_cdf_gamma_P, (0.325, 17.0, 10.0), 1.37283653245125844e-40, TEST_TOL6);
+ TEST (gsl_cdf_gamma_P, (1.0, 17.0, 10.0), 2.55811932292544243e-32, TEST_TOL6);
+ TEST (gsl_cdf_gamma_P, (1.5, 17.0, 10.0), 2.40420441175422372e-29, TEST_TOL6);
+ TEST (gsl_cdf_gamma_P, (2.0, 17.0, 10.0), 3.05092926217898577e-27, TEST_TOL6);
+ TEST (gsl_cdf_gamma_P, (10.0, 17.0, 10.0), 1.094920130378183e-15, TEST_TOL6);
+ TEST (gsl_cdf_gamma_P, (20.0, 17.0, 10.0), 5.60605096173161688e-11, TEST_TOL6);
+ TEST (gsl_cdf_gamma_P, (100.0, 17.0, 10.0), 2.70416097848011280e-2, TEST_TOL6);
+ TEST (gsl_cdf_gamma_P, (1000.0, 17.0, 10.0), 1.000000000000000000e0, TEST_TOL6);
+ TEST (gsl_cdf_gamma_P, (10000.0, 17.0, 10.0), 1.000000000000000000e0, TEST_TOL6);
+
+ TEST (gsl_cdf_gamma_Q, (0.0, 17.0, 10.0), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Q, (1e-100, 17.0, 10.0), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Q, (0.001, 17.0, 10.0), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Q, (0.01, 17.0, 10.0), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Q, (0.1, 17.0, 10.0), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Q, (0.325, 17.0, 10.0), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Q, (1.0, 17.0, 10.0), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Q, (1.5, 17.0, 10.0), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Q, (2.0, 17.0, 10.0), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Q, (10.0, 17.0, 10.0), 9.99999999999998905e-1, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Q, (20.0, 17.0, 10.0), 9.99999999943939490e-1, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Q, (100.0, 17.0, 10.0), 9.72958390215198872e-1, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Q, (1000.0, 17.0, 10.0), 2.11200951633948570e-25, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Q, (10000.0, 17.0, 10.0), 0.0, 0.0);
+}
+
+void test_chisq (void) {
+ TEST (gsl_cdf_chisq_P, (0.0, 13.0), 0.0, 0.0);
+ TEST (gsl_cdf_chisq_P, (1e-100, 13.0), 0.0, 0.0);
+ TEST (gsl_cdf_chisq_P, (0.001, 13.0), 1.86631102655845996e-25, TEST_TOL6);
+ TEST (gsl_cdf_chisq_P, (0.01, 13.0), 5.87882248504529790e-19, TEST_TOL6);
+ TEST (gsl_cdf_chisq_P, (0.1, 13.0), 1.78796983358555410e-12, TEST_TOL6);
+ TEST (gsl_cdf_chisq_P, (0.325, 13.0), 3.44611313779905183e-9, TEST_TOL6);
+ TEST (gsl_cdf_chisq_P, (1.0, 13.0), 3.83473473513595154e-6, TEST_TOL6);
+ TEST (gsl_cdf_chisq_P, (1.5, 13.0), 4.31718389201041932e-5, TEST_TOL6);
+ TEST (gsl_cdf_chisq_P, (2.0, 13.0), 2.26250084656047180e-4, TEST_TOL6);
+ TEST (gsl_cdf_chisq_P, (10.0, 13.0), 3.06065632019251110e-1, TEST_TOL6);
+ TEST (gsl_cdf_chisq_P, (20.0, 13.0), 9.04789743921908487e-1, TEST_TOL6);
+ TEST (gsl_cdf_chisq_P, (100.0, 13.0), 9.99999999999998341e-1, TEST_TOL6);
+ TEST (gsl_cdf_chisq_P, (1000.0, 13.0), 1e0, TEST_TOL6);
+ TEST (gsl_cdf_chisq_P, (10000.0, 13.0), 1e0, TEST_TOL6);
+
+ TEST (gsl_cdf_chisq_Q, (0.0, 13.0), 1e0, TEST_TOL6);
+ TEST (gsl_cdf_chisq_Q, (1e-100, 13.0), 1e0, TEST_TOL6);
+ TEST (gsl_cdf_chisq_Q, (0.001, 13.0), 1e0, TEST_TOL6);
+ TEST (gsl_cdf_chisq_Q, (0.01, 13.0), 9.99999999999999999e-1, TEST_TOL6);
+ TEST (gsl_cdf_chisq_Q, (0.1, 13.0), 9.99999999998212030e-1, TEST_TOL6);
+ TEST (gsl_cdf_chisq_Q, (0.325, 13.0), 9.99999996553886862e-1, TEST_TOL6);
+ TEST (gsl_cdf_chisq_Q, (1.0, 13.0), 9.99996165265264864e-1, TEST_TOL6);
+ TEST (gsl_cdf_chisq_Q, (1.5, 13.0), 9.99956828161079896e-1, TEST_TOL6);
+ TEST (gsl_cdf_chisq_Q, (2.0, 13.0), 9.99773749915343953e-1, TEST_TOL6);
+ TEST (gsl_cdf_chisq_Q, (10.0, 13.0), 6.93934367980748890e-1, TEST_TOL6);
+ TEST (gsl_cdf_chisq_Q, (20.0, 13.0), 9.52102560780915127e-2, TEST_TOL6);
+ TEST (gsl_cdf_chisq_Q, (100.0, 13.0), 1.65902608070858809e-15, TEST_TOL6);
+ TEST (gsl_cdf_chisq_Q, (1000.0, 13.0), 1.74851191544860225e-205, TEST_TOL6);
+ TEST (gsl_cdf_chisq_Q, (10000.0, 13.0), 0.0, 0.0);
+}
+
+
+ /* Beta distribution */
+
+void test_beta (void) {
+ TEST (gsl_cdf_beta_P, (0.0, 1.2, 1.3), 0.0, 0.0);
+ TEST (gsl_cdf_beta_P, (1e-100, 1.2, 1.3), 1.34434944656489596e-120, TEST_TOL6);
+ TEST (gsl_cdf_beta_P, (0.001, 1.2, 1.3), 3.37630042504535813e-4, TEST_TOL6);
+ TEST (gsl_cdf_beta_P, (0.01, 1.2, 1.3), 5.34317264038929473e-3, TEST_TOL6);
+ TEST (gsl_cdf_beta_P, (0.1, 1.2, 1.3), 8.33997828306748346e-2, TEST_TOL6);
+ TEST (gsl_cdf_beta_P, (0.325, 1.2, 1.3), 3.28698654180583916e-1, TEST_TOL6);
+ TEST (gsl_cdf_beta_P, (0.5, 1.2, 1.3), 5.29781429451299081e-1, TEST_TOL6);
+ TEST (gsl_cdf_beta_P, (0.9, 1.2, 1.3), 9.38529397224430659e-1, TEST_TOL6);
+ TEST (gsl_cdf_beta_P, (0.99, 1.2, 1.3), 9.96886438341254380e-1, TEST_TOL6);
+ TEST (gsl_cdf_beta_P, (0.999, 1.2, 1.3), 9.99843792833067634e-1, TEST_TOL6);
+ TEST (gsl_cdf_beta_P, (1.0, 1.2, 1.3), 1.0, TEST_TOL6);
+
+ TEST (gsl_cdf_beta_Q, (0.0, 1.2, 1.3), 1.0, 0.0);
+ TEST (gsl_cdf_beta_Q, (1e-100, 1.2, 1.3), 1e0, TEST_TOL6);
+ TEST (gsl_cdf_beta_Q, (0.001, 1.2, 1.3), 9.99662369957495464e-1, TEST_TOL6);
+ TEST (gsl_cdf_beta_Q, (0.01, 1.2, 1.3), 9.94656827359610705e-1, TEST_TOL6);
+ TEST (gsl_cdf_beta_Q, (0.1, 1.2, 1.3), 9.16600217169325165e-1, TEST_TOL6);
+ TEST (gsl_cdf_beta_Q, (0.325, 1.2, 1.3), 6.71301345819416084e-1, TEST_TOL6);
+ TEST (gsl_cdf_beta_Q, (0.5, 1.2, 1.3), 4.70218570548700919e-1, TEST_TOL6);
+ TEST (gsl_cdf_beta_Q, (0.9, 1.2, 1.3), 6.14706027755693408e-2, TEST_TOL6);
+ TEST (gsl_cdf_beta_Q, (0.99, 1.2, 1.3), 3.11356165874561958e-3, TEST_TOL6);
+ TEST (gsl_cdf_beta_Q, (0.999, 1.2, 1.3), 1.56207166932365759e-4, TEST_TOL6);
+ TEST (gsl_cdf_beta_Q, (1.0, 1.2, 1.3), 0.0, TEST_TOL6);
+}
+
+void test_betainv (void) {
+ TEST (gsl_cdf_beta_Pinv, (0.0, 1.2, 1.3), 0.0, 0.0);
+ TEST (gsl_cdf_beta_Pinv, ( 1.34434944656489596e-120, 1.2, 1.3), 1e-100, TEST_TOL6);
+ TEST (gsl_cdf_beta_Pinv, ( 3.37630042504535813e-4, 1.2, 1.3), 0.001, TEST_TOL6);
+ TEST (gsl_cdf_beta_Pinv, ( 5.34317264038929473e-3, 1.2, 1.3), 0.01, TEST_TOL6);
+ TEST (gsl_cdf_beta_Pinv, ( 8.33997828306748346e-2, 1.2, 1.3), 0.1, TEST_TOL6);
+ TEST (gsl_cdf_beta_Pinv, ( 3.28698654180583916e-1, 1.2, 1.3), 0.325, TEST_TOL6);
+ TEST (gsl_cdf_beta_Pinv, ( 5.29781429451299081e-1, 1.2, 1.3), 0.5, TEST_TOL6);
+ TEST (gsl_cdf_beta_Pinv, ( 9.38529397224430659e-1, 1.2, 1.3), 0.9, TEST_TOL6);
+ TEST (gsl_cdf_beta_Pinv, ( 9.96886438341254380e-1, 1.2, 1.3), 0.99, TEST_TOL6);
+ TEST (gsl_cdf_beta_Pinv, ( 9.99843792833067634e-1, 1.2, 1.3), 0.999, TEST_TOL6);
+ TEST (gsl_cdf_beta_Pinv, ( 1.0, 1.2, 1.3), 1.0, TEST_TOL6);
+
+ TEST (gsl_cdf_beta_Qinv, ( 1.0, 1.2, 1.3), 0.0, 0.0);
+ TEST (gsl_cdf_beta_Qinv, ( 1e0, 1.2, 1.3), 0.0, TEST_TOL6);
+ TEST (gsl_cdf_beta_Qinv, ( 9.99662369957495464e-1, 1.2, 1.3), 0.001, TEST_TOL6);
+ TEST (gsl_cdf_beta_Qinv, ( 9.94656827359610705e-1, 1.2, 1.3), 0.01, TEST_TOL6);
+ TEST (gsl_cdf_beta_Qinv, ( 9.16600217169325165e-1, 1.2, 1.3), 0.1, TEST_TOL6);
+ TEST (gsl_cdf_beta_Qinv, ( 6.71301345819416084e-1, 1.2, 1.3), 0.325, TEST_TOL6);
+ TEST (gsl_cdf_beta_Qinv, ( 4.70218570548700919e-1, 1.2, 1.3), 0.5, TEST_TOL6);
+ TEST (gsl_cdf_beta_Qinv, ( 6.14706027755693408e-2, 1.2, 1.3), 0.9, TEST_TOL6);
+ TEST (gsl_cdf_beta_Qinv, ( 3.11356165874561958e-3, 1.2, 1.3), 0.99, TEST_TOL6);
+ TEST (gsl_cdf_beta_Qinv, ( 1.56207166932365759e-4, 1.2, 1.3), 0.999, TEST_TOL6);
+ TEST (gsl_cdf_beta_Qinv, ( 0.0, 1.2, 1.3), 1.0, TEST_TOL6);
+}
+
+void test_gammainv (void) {
+ TEST (gsl_cdf_gamma_Pinv, (0.0, 1.0, 1.0), 0.0, 0.0);
+ TEST (gsl_cdf_gamma_Pinv, (1e-100, 1.0, 1.0), 1e-100, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Pinv, (9.99500166625008332e-4, 1.0, 1.0), 0.001, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Pinv, (9.95016625083194643e-3, 1.0, 1.0), 0.01, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Pinv, (9.51625819640404268e-2, 1.0, 1.0), 0.1, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Pinv, (2.77472646357927811e-1, 1.0, 1.0), 0.325, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Pinv, (6.32120558828557678e-1, 1.0, 1.0), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Pinv, (7.76869839851570171e-1, 1.0, 1.0), 1.5, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Pinv, (8.64664716763387308e-1, 1.0, 1.0), 2.0, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Pinv, (9.99954600070237515e-1, 1.0, 1.0), 10.0, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Pinv, (9.99999997938846378e-1, 1.0, 1.0), 20.0, 100 * TEST_TOL6);
+ TEST (gsl_cdf_gamma_Pinv, (1.0, 1.0, 1.0), GSL_POSINF, 0.0);
+
+ TEST (gsl_cdf_gamma_Qinv, (0.0, 1.0, 1.0), GSL_POSINF, 0.0);
+ TEST (gsl_cdf_gamma_Qinv, (2.06115362243855783e-9, 1.0, 1.0), 20.0, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Qinv, (4.53999297624848515e-5, 1.0, 1.0), 10.0, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Qinv, (1.35335283236612692e-1, 1.0, 1.0), 2.0, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Qinv, (2.23130160148429829e-1, 1.0, 1.0), 1.5, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Qinv, (3.67879441171442322e-1, 1.0, 1.0), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Qinv, (7.22527353642072189e-1, 1.0, 1.0), 0.325, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Qinv, (9.04837418035959573e-1, 1.0, 1.0), 0.1, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Qinv, (9.90049833749168054e-1, 1.0, 1.0), 0.01, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Qinv, (9.99000499833374992e-1, 1.0, 1.0), 0.001, TEST_TOL6);
+ TEST (gsl_cdf_gamma_Qinv, (1.0, 1.0, 1.0), 0.0, 0.0);
+}
+
+void test_chisqinv (void) {
+ TEST (gsl_cdf_chisq_Pinv, (0.0, 13.0), 0.0, 0.0);
+ TEST (gsl_cdf_chisq_Pinv, (1.86631102655845996e-25, 13.0), 0.001, TEST_TOL6);
+ TEST (gsl_cdf_chisq_Pinv, (5.87882248504529790e-19, 13.0), 0.01, TEST_TOL6);
+ TEST (gsl_cdf_chisq_Pinv, (1.78796983358555410e-12, 13.0), 0.1, TEST_TOL6);
+ TEST (gsl_cdf_chisq_Pinv, (3.44611313779905183e-9, 13.0), 0.325, TEST_TOL6);
+ TEST (gsl_cdf_chisq_Pinv, (3.83473473513595154e-6, 13.0), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_chisq_Pinv, (4.31718389201041932e-5, 13.0), 1.5, TEST_TOL6);
+ TEST (gsl_cdf_chisq_Pinv, (2.26250084656047180e-4, 13.0), 2.0, TEST_TOL6);
+ TEST (gsl_cdf_chisq_Pinv, (3.06065632019251110e-1, 13.0), 10.0, TEST_TOL6);
+ TEST (gsl_cdf_chisq_Pinv, (9.04789743921908487e-1, 13.0), 20.0, TEST_TOL6);
+ TEST (gsl_cdf_chisq_Pinv, (9.99999999999998341e-1, 13.0), 100.0, 0.01);
+ TEST (gsl_cdf_chisq_Pinv, (1e0, 13.0), GSL_POSINF, 0.0);
+
+ TEST (gsl_cdf_chisq_Qinv, (0.0, 13.0), GSL_POSINF, TEST_TOL6);
+ TEST (gsl_cdf_chisq_Qinv, (1.65902608070858809e-15, 13.0), 100.0, TEST_TOL6);
+ TEST (gsl_cdf_chisq_Qinv, (9.52102560780915127e-2, 13.0), 20.0, TEST_TOL6);
+ TEST (gsl_cdf_chisq_Qinv, (6.93934367980748892e-1, 13.0), 10.0, TEST_TOL6);
+ TEST (gsl_cdf_chisq_Qinv, (9.99773749915343954e-1, 13.0), 2.0, TEST_TOL6);
+ TEST (gsl_cdf_chisq_Qinv, (9.99956828161079894e-1, 13.0), 1.5, TEST_TOL6);
+ TEST (gsl_cdf_chisq_Qinv, (9.99996165265264863e-1, 13.0), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_chisq_Qinv, (9.99999996553886862e-1, 13.0), 0.325, 1e-6);
+ TEST (gsl_cdf_chisq_Qinv, (9.99999999998212031e-1, 13.0), 0.1, 1e-5);
+ TEST (gsl_cdf_chisq_Qinv, (1.0, 13.0), 0.0, 0.0);
+}
+
+void test_tdistinv (void) {
+ TEST (gsl_cdf_tdist_Pinv, (0.5, 1.0), 0.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (5.00318309780080559e-1, 1.0), 0.001, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (5.03182992764908255e-1, 1.0), 0.01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (5.31725517430553569e-1, 1.0), 0.1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (6.00023120032852123e-1, 1.0), 0.325, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (0.75000000000000000e0, 1.0), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (8.12832958189001183e-1, 1.0), 1.5, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (8.52416382349566726e-1, 1.0), 2.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (9.68274482569446430e-1, 1.0), 10.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (9.84097748743823625e-1, 1.0), 20.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (9.96817007235091745e-1, 1.0), 100.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (9.99681690219919441e-1, 1.0), 1000.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (9.99968169011487724e-1, 1.0), 10000.0, TEST_TOL6);
+
+ TEST (gsl_cdf_tdist_Pinv, (4.99681690219919441e-1, 1.0), -0.001, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (4.96817007235091744e-1, 1.0), -0.01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (4.68274482569446430e-1, 1.0), -0.1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (3.99976879967147876e-1, 1.0), -0.325, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (0.25, 1.0), -1.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (1.87167041810998816e-1, 1.0), -1.5, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (1.47583617650433274e-1, 1.0), -2.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (3.17255174305535695e-2, 1.0), -10.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (1.59022512561763751e-2, 1.0), -20.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (3.18299276490825514e-3, 1.0), -100.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (3.18309780080558938e-4, 1.0), -1000.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (3.18309885122757724e-5, 1.0), -10000.0, TEST_TOL6);
+
+
+ TEST (gsl_cdf_tdist_Qinv, (0.5, 1.0), 0.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (4.99681690219919441e-1, 1.0), 0.001, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (4.96817007235091745e-1, 1.0), 0.01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (4.68274482569446430e-1, 1.0), 0.1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (3.99976879967147876e-1, 1.0), 0.325, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (2.5e-1, 1.0), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (1.87167041810998816e-1, 1.0), 1.5, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (1.47583617650433274e-1, 1.0), 2.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (3.17255174305535695e-2, 1.0), 10.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (1.59022512561763752e-2, 1.0), 20.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (3.18299276490825515e-3, 1.0), 100.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (3.18309780080558939e-4, 1.0), 1000.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (3.18309885122757724e-5, 1.0), 10000.0, TEST_TOL6);
+
+ TEST (gsl_cdf_tdist_Pinv, (4.99681690219919441e-1, 1.0), -0.001, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (4.96817007235091744e-1, 1.0), -0.01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (4.68274482569446430e-1, 1.0), -0.1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (3.99976879967147876e-1, 1.0), -0.325, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (0.25, 1.0), -1.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (1.87167041810998816e-1, 1.0), -1.5, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (1.47583617650433274e-1, 1.0), -2.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (3.17255174305535695e-2, 1.0), -10.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (1.59022512561763751e-2, 1.0), -20.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (3.18299276490825514e-3, 1.0), -100.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (3.18309780080558938e-4, 1.0), -1000.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (3.18309885122757724e-5, 1.0), -10000.0, TEST_TOL6);
+
+ TEST (gsl_cdf_tdist_Qinv, (5.00318309780080559e-1, 1.0), -0.001, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (5.03182992764908255e-1, 1.0), -0.01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (5.31725517430553570e-1, 1.0), -0.1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (6.00023120032852124e-1, 1.0), -0.325, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (7.5e-1, 1.0), -1.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (8.12832958189001184e-1, 1.0), -1.5, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (8.52416382349566726e-1, 1.0), -2.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (9.68274482569446430e-1, 1.0), -10.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (9.84097748743823625e-1, 1.0), -20.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (9.96817007235091745e-1, 1.0), -100.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (9.99681690219919441e-1, 1.0), -1000.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (9.99968169011487724e-1, 1.0), -10000.0, TEST_TOL6);
+
+ TEST (gsl_cdf_tdist_Pinv, (4.99646446697795041e-01, 2.0), -0.001, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (4.96464554479100486e-01, 2.0), -0.01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (4.64732719207070087e-01, 2.0), -0.1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (3.88014227253126233e-01, 2.0), -0.325, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (2.11324865405187118e-01, 2.0), -1.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (1.36196562445500540e-01, 2.0), -1.5, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (9.17517095361369836e-02, 2.0), -2.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (4.92622851166284542e-03, 2.0), -10.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (1.24533194618354849e-03, 2.0), -20.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (4.99925012497812894e-05, 2.0), -100.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (4.99999250001249998e-07, 2.0), -1000.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (4.99999992500000125e-09, 2.0), -10000.0, TEST_TOL6);
+
+ TEST (gsl_cdf_tdist_Qinv, (5.00353553302204959e-1, 2.0), -0.001, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (5.03535445520899514e-1, 2.0), -0.01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (5.35267280792929913e-1, 2.0), -0.1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (6.11985772746873767e-1, 2.0), -0.325, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (7.88675134594812882e-1, 2.0), -1.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (8.63803437554499460e-1, 2.0), -1.5, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (9.08248290463863016e-1, 2.0), -2.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (9.95073771488337155e-1, 2.0), -10.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (9.98754668053816452e-1, 2.0), -20.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (9.99950007498750219e-1, 2.0), -100.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (9.99999500000749999e-1, 2.0), -1000.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (9.99999995000000075e-1, 2.0), -10000.0, 1e-6);
+
+ TEST (gsl_cdf_tdist_Pinv, (5.00000000000000000e-01, 300.0), 0.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (5.00398609900942949e-01, 300.0), 0.001, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (5.03986033020559088e-01, 300.0), 0.01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (5.39794441177768194e-01, 300.0), 0.1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (6.27296201542523812e-01, 300.0), 0.325, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (8.40941797784686861e-01, 300.0), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (9.32666983425369137e-01, 300.0), 1.5, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (9.76799239508425455e-01, 300.0), 2.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (1.00000000000000000e+00, 300.0), GSL_POSINF, 0.0);
+
+ TEST (gsl_cdf_tdist_Qinv, (5.00000000000000000e-01, 300.0), 0.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (4.99601390099057051e-1, 300.0), 0.001, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (4.96013966979440912e-1, 300.0), 0.01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (4.60205558822231806e-1, 300.0), 0.1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (3.72703798457476188e-1, 300.0), 0.325, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (1.59058202215313138e-1, 300.0), 1.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (6.73330165746308628e-2, 300.0), 1.5, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (2.32007604915745452e-2, 300.0), 2.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (8.279313677e-21, 300.0), 10.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (1.93159812815803978e-57, 300.0), 20.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (1.02557519997736154e-232, 300.0), 100.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (0.00000000000000000e+00, 300.0), GSL_POSINF, 0.0);
+
+ TEST (gsl_cdf_tdist_Pinv, (4.99601390099057051e-01, 300.0), -0.001, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (4.96013966979440912e-01, 300.0), -0.01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (4.60205558822231806e-01, 300.0), -0.1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (3.72703798457476188e-01, 300.0), -0.325, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (1.59058202215313138e-01, 300.0), -1.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (6.73330165746308628e-02, 300.0), -1.5, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (2.32007604915745452e-02, 300.0), -2.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (8.279313675556272534e-21, 300.0), -10.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (1.93159812815803978e-57, 300.0), -20.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (1.02557519997736154e-232, 300.0), -100.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Pinv, (0.0, 300.0), GSL_NEGINF, 0.0);
+
+ TEST (gsl_cdf_tdist_Qinv, (5.00398609900942949e-1, 300.0), -0.001, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (5.03986033020559088e-1, 300.0), -0.01, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (5.39794441177768194e-1, 300.0), -0.1, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (6.27296201542523812e-1, 300.0), -0.325, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (8.40941797784686862e-1, 300.0), -1.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (9.32666983425369137e-1, 300.0), -1.5, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (9.76799239508425455e-1, 300.0), -2.0, TEST_TOL6);
+ TEST (gsl_cdf_tdist_Qinv, (1.000000000000000000e0, 300.0), GSL_NEGINF, TEST_TOL6);
+}
+
+
+
diff --git a/gsl-1.9/cdf/test_auto.c b/gsl-1.9/cdf/test_auto.c
new file mode 100644
index 0000000..cf6f610
--- /dev/null
+++ b/gsl-1.9/cdf/test_auto.c
@@ -0,0 +1,1464 @@
+void test_auto_beta (void);
+
+void
+test_auto_beta (void)
+{
+ TEST(gsl_cdf_beta_P, (0.0000000000000000e+00,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_beta_P, (1.0000000000000000e-10,1.3,2.7), 3.329258013904e-13, TEST_TOL6);
+ TEST(gsl_cdf_beta_P, (1.0000000000000001e-09,1.3,2.7), 6.642743046207e-12, TEST_TOL6);
+ TEST(gsl_cdf_beta_P, (1.0000000000000000e-08,1.3,2.7), 1.325401475350e-10, TEST_TOL6);
+ TEST(gsl_cdf_beta_P, (9.9999999999999995e-08,1.3,2.7), 2.644523387276e-09, TEST_TOL6);
+ TEST(gsl_cdf_beta_P, (9.9999999999999995e-07,1.3,2.7), 5.276513292646e-08, TEST_TOL6);
+ TEST(gsl_cdf_beta_P, (1.0000000000000001e-05,1.3,2.7), 1.052793708285e-06, TEST_TOL6);
+ TEST(gsl_cdf_beta_P, (1.0000000000000000e-04,1.3,2.7), 2.100417958505e-05, TEST_TOL6);
+ TEST(gsl_cdf_beta_P, (1.0000000000000000e-03,1.3,2.7), 4.187261218400e-04, TEST_TOL6);
+ TEST(gsl_cdf_beta_P, (1.0000000000000000e-02,1.3,2.7), 8.282559388393e-03, TEST_TOL6);
+ TEST(gsl_cdf_beta_P, (1.0000000000000001e-01,1.3,2.7), 1.512194578010e-01, TEST_TOL6);
+ TEST(gsl_cdf_beta_P, (2.0000000000000001e-01,1.3,2.7), 3.358123280407e-01, TEST_TOL6);
+ TEST(gsl_cdf_beta_P, (2.9999999999999999e-01,1.3,2.7), 5.104163996495e-01, TEST_TOL6);
+ TEST(gsl_cdf_beta_P, (4.0000000000000002e-01,1.3,2.7), 6.620682399410e-01, TEST_TOL6);
+ TEST(gsl_cdf_beta_P, (5.0000000000000000e-01,1.3,2.7), 7.852786981833e-01, TEST_TOL6);
+ TEST(gsl_cdf_beta_P, (5.9999999999999998e-01,1.3,2.7), 8.784005878950e-01, TEST_TOL6);
+ TEST(gsl_cdf_beta_P, (8.0000000000000004e-01,1.3,2.7), 9.801824171406e-01, TEST_TOL6);
+ TEST(gsl_cdf_beta_P, (9.0000000000000002e-01,1.3,2.7), 9.968736852365e-01, TEST_TOL6);
+ TEST(gsl_cdf_beta_P, (9.8999999999999999e-01,1.3,2.7), 9.999936324464e-01, TEST_TOL6);
+ TEST(gsl_cdf_beta_P, (9.9900000000000000e-01,1.3,2.7), 9.999999872699e-01, TEST_TOL6);
+ TEST(gsl_cdf_beta_P, (9.9990000000000001e-01,1.3,2.7), 9.999999999746e-01, TEST_TOL6);
+ TEST(gsl_cdf_beta_P, (9.9999000000000005e-01,1.3,2.7), 9.999999999999e-01, TEST_TOL6);
+ TEST(gsl_cdf_beta_P, (1.0000000000000000e+00,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+
+ TEST(gsl_cdf_beta_Q, (1.0000000000000000e+00,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_beta_Q, (9.9999000000000005e-01,1.3,2.7), 5.069044353228e-14, TEST_TOL6);
+ TEST(gsl_cdf_beta_Q, (9.9990000000000001e-01,1.3,2.7), 2.540490259443e-11, TEST_TOL6);
+ TEST(gsl_cdf_beta_Q, (9.9900000000000000e-01,1.3,2.7), 1.273010336738e-08, TEST_TOL6);
+ TEST(gsl_cdf_beta_Q, (9.8999999999999999e-01,1.3,2.7), 6.367553598351e-06, TEST_TOL6);
+ TEST(gsl_cdf_beta_Q, (9.0000000000000002e-01,1.3,2.7), 3.126314763488e-03, TEST_TOL6);
+ TEST(gsl_cdf_beta_Q, (8.0000000000000004e-01,1.3,2.7), 1.981758285937e-02, TEST_TOL6);
+ TEST(gsl_cdf_beta_Q, (5.9999999999999998e-01,1.3,2.7), 1.215994121050e-01, TEST_TOL6);
+ TEST(gsl_cdf_beta_Q, (5.0000000000000000e-01,1.3,2.7), 2.147213018167e-01, TEST_TOL6);
+ TEST(gsl_cdf_beta_Q, (4.0000000000000002e-01,1.3,2.7), 3.379317600590e-01, TEST_TOL6);
+ TEST(gsl_cdf_beta_Q, (2.9999999999999999e-01,1.3,2.7), 4.895836003505e-01, TEST_TOL6);
+ TEST(gsl_cdf_beta_Q, (2.0000000000000001e-01,1.3,2.7), 6.641876719593e-01, TEST_TOL6);
+ TEST(gsl_cdf_beta_Q, (1.0000000000000001e-01,1.3,2.7), 8.487805421990e-01, TEST_TOL6);
+ TEST(gsl_cdf_beta_Q, (1.0000000000000000e-02,1.3,2.7), 9.917174406116e-01, TEST_TOL6);
+ TEST(gsl_cdf_beta_Q, (1.0000000000000000e-03,1.3,2.7), 9.995812738782e-01, TEST_TOL6);
+ TEST(gsl_cdf_beta_Q, (1.0000000000000000e-04,1.3,2.7), 9.999789958204e-01, TEST_TOL6);
+ TEST(gsl_cdf_beta_Q, (1.0000000000000001e-05,1.3,2.7), 9.999989472063e-01, TEST_TOL6);
+ TEST(gsl_cdf_beta_Q, (9.9999999999999995e-07,1.3,2.7), 9.999999472349e-01, TEST_TOL6);
+ TEST(gsl_cdf_beta_Q, (9.9999999999999995e-08,1.3,2.7), 9.999999973555e-01, TEST_TOL6);
+ TEST(gsl_cdf_beta_Q, (1.0000000000000000e-08,1.3,2.7), 9.999999998675e-01, TEST_TOL6);
+ TEST(gsl_cdf_beta_Q, (1.0000000000000001e-09,1.3,2.7), 9.999999999934e-01, TEST_TOL6);
+ TEST(gsl_cdf_beta_Q, (1.0000000000000000e-10,1.3,2.7), 9.999999999997e-01, TEST_TOL6);
+ TEST(gsl_cdf_beta_Q, (0.0000000000000000e+00,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+}
+
+void test_auto_fdist (void);
+
+void
+test_auto_fdist (void)
+{
+ TEST(gsl_cdf_fdist_P, (0.0000000000000000e+00,5.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_fdist_P, (1.0000000000000000e-10,5.3,2.7), 3.231380663090e-26, TEST_TOL6);
+ TEST(gsl_cdf_fdist_P, (1.0000000000000001e-09,5.3,2.7), 1.443404714791e-23, TEST_TOL6);
+ TEST(gsl_cdf_fdist_P, (1.0000000000000000e-08,5.3,2.7), 6.447451698511e-21, TEST_TOL6);
+ TEST(gsl_cdf_fdist_P, (9.9999999999999995e-08,5.3,2.7), 2.879969407315e-18, TEST_TOL6);
+ TEST(gsl_cdf_fdist_P, (9.9999999999999995e-07,5.3,2.7), 1.286428479993e-15, TEST_TOL6);
+ TEST(gsl_cdf_fdist_P, (1.0000000000000001e-05,5.3,2.7), 5.745970138195e-13, TEST_TOL6);
+ TEST(gsl_cdf_fdist_P, (1.0000000000000000e-04,5.3,2.7), 2.565314230632e-10, TEST_TOL6);
+ TEST(gsl_cdf_fdist_P, (1.0000000000000000e-03,5.3,2.7), 1.140026203760e-07, TEST_TOL6);
+ TEST(gsl_cdf_fdist_P, (1.0000000000000000e-02,5.3,2.7), 4.840333162527e-05, TEST_TOL6);
+ TEST(gsl_cdf_fdist_P, (1.0000000000000001e-01,5.3,2.7), 1.360698992545e-02, TEST_TOL6);
+ TEST(gsl_cdf_fdist_P, (1.0000000000000000e+00,5.3,2.7), 4.532720490874e-01, TEST_TOL6);
+ TEST(gsl_cdf_fdist_P, (1.0000000000000000e+01,5.3,2.7), 9.461328174717e-01, TEST_TOL6);
+ TEST(gsl_cdf_fdist_P, (1.0000000000000000e+02,5.3,2.7), 9.973356976994e-01, TEST_TOL6);
+ TEST(gsl_cdf_fdist_P, (1.0000000000000000e+03,5.3,2.7), 9.998797338050e-01, TEST_TOL6);
+ TEST(gsl_cdf_fdist_P, (1.0000000000000000e+04,5.3,2.7), 9.999946222456e-01, TEST_TOL6);
+ TEST(gsl_cdf_fdist_P, (1.0000000000000000e+05,5.3,2.7), 9.999997597592e-01, TEST_TOL6);
+ TEST(gsl_cdf_fdist_P, (1.0000000000000000e+06,5.3,2.7), 9.999999892687e-01, TEST_TOL6);
+ TEST(gsl_cdf_fdist_P, (1.0000000000000000e+07,5.3,2.7), 9.999999995207e-01, TEST_TOL6);
+ TEST(gsl_cdf_fdist_P, (1.0000000000000000e+08,5.3,2.7), 9.999999999786e-01, TEST_TOL6);
+ TEST(gsl_cdf_fdist_P, (1.0000000000000000e+09,5.3,2.7), 9.999999999990e-01, TEST_TOL6);
+ TEST(gsl_cdf_fdist_P, (1.0000000000000000e+10,5.3,2.7), 1.000000000000e-00, TEST_TOL6);
+
+ TEST(gsl_cdf_fdist_Q, (1.0000000000000000e+10,5.3,2.7), 4.272202262298e-14, TEST_TOL6);
+ TEST(gsl_cdf_fdist_Q, (1.0000000000000000e+09,5.3,2.7), 9.564269502770e-13, TEST_TOL6);
+ TEST(gsl_cdf_fdist_Q, (1.0000000000000000e+08,5.3,2.7), 2.141173208523e-11, TEST_TOL6);
+ TEST(gsl_cdf_fdist_Q, (1.0000000000000000e+07,5.3,2.7), 4.793489218238e-10, TEST_TOL6);
+ TEST(gsl_cdf_fdist_Q, (1.0000000000000000e+06,5.3,2.7), 1.073127433440e-08, TEST_TOL6);
+ TEST(gsl_cdf_fdist_Q, (1.0000000000000000e+05,5.3,2.7), 2.402407758939e-07, TEST_TOL6);
+ TEST(gsl_cdf_fdist_Q, (1.0000000000000000e+04,5.3,2.7), 5.377754447932e-06, TEST_TOL6);
+ TEST(gsl_cdf_fdist_Q, (1.0000000000000000e+03,5.3,2.7), 1.202661950234e-04, TEST_TOL6);
+ TEST(gsl_cdf_fdist_Q, (1.0000000000000000e+02,5.3,2.7), 2.664302300604e-03, TEST_TOL6);
+ TEST(gsl_cdf_fdist_Q, (1.0000000000000000e+01,5.3,2.7), 5.386718252832e-02, TEST_TOL6);
+ TEST(gsl_cdf_fdist_Q, (1.0000000000000000e+00,5.3,2.7), 5.467279509126e-01, TEST_TOL6);
+ TEST(gsl_cdf_fdist_Q, (1.0000000000000001e-01,5.3,2.7), 9.863930100746e-01, TEST_TOL6);
+ TEST(gsl_cdf_fdist_Q, (1.0000000000000000e-02,5.3,2.7), 9.999515966684e-01, TEST_TOL6);
+ TEST(gsl_cdf_fdist_Q, (1.0000000000000000e-03,5.3,2.7), 9.999998859974e-01, TEST_TOL6);
+ TEST(gsl_cdf_fdist_Q, (1.0000000000000000e-04,5.3,2.7), 9.999999997435e-01, TEST_TOL6);
+ TEST(gsl_cdf_fdist_Q, (1.0000000000000001e-05,5.3,2.7), 9.999999999994e-01, TEST_TOL6);
+ TEST(gsl_cdf_fdist_Q, (9.9999999999999995e-07,5.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_fdist_Q, (9.9999999999999995e-08,5.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_fdist_Q, (1.0000000000000000e-08,5.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_fdist_Q, (1.0000000000000001e-09,5.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_fdist_Q, (1.0000000000000000e-10,5.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_fdist_Q, (0.0000000000000000e+00,5.3,2.7), 1.000000000000e+00, TEST_TOL6);
+}
+
+void test_auto_cauchy (void);
+
+void
+test_auto_cauchy (void)
+{
+ TEST(gsl_cdf_cauchy_P, (-1.0000000000000000e+10,1.3), 4.138028520389e-11, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Pinv, (4.1380285203892783e-11,1.3), -1.000000000000e+10, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_P, (-1.0000000000000000e+09,1.3), 4.138028520389e-10, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Pinv, (4.1380285203892792e-10,1.3), -1.000000000000e+09, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_P, (-1.0000000000000000e+08,1.3), 4.138028520389e-09, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Pinv, (4.1380285203892787e-09,1.3), -1.000000000000e+08, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_P, (-1.0000000000000000e+07,1.3), 4.138028520389e-08, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Pinv, (4.1380285203892555e-08,1.3), -1.000000000000e+07, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_P, (-1.0000000000000000e+06,1.3), 4.138028520387e-07, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Pinv, (4.1380285203869488e-07,1.3), -1.000000000000e+06, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_P, (-1.0000000000000000e+05,1.3), 4.138028520156e-06, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Pinv, (4.1380285201561693e-06,1.3), -1.000000000000e+05, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_P, (-1.0000000000000000e+04,1.3), 4.138028497078e-05, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Pinv, (4.1380284970783855e-05,1.3), -1.000000000000e+04, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_P, (-1.0000000000000000e+03,1.3), 4.138026189302e-04, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Pinv, (4.1380261893022424e-04,1.3), -1.000000000000e+03, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_P, (-1.0000000000000000e+02,1.3), 4.137795435084e-03, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Pinv, (4.1377954350836910e-03,1.3), -1.000000000000e+02, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_P, (-1.0000000000000000e+01,1.3), 4.114951182497e-02, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Pinv, (4.1149511824973506e-02,1.3), -1.000000000000e+01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_P, (-1.0000000000000000e+00,1.3), 2.912855998398e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Pinv, (2.9128559983984725e-01,1.3), -1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_P, (-1.0000000000000001e-01,1.3), 4.755627480278e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Pinv, (4.7556274802780252e-01,1.3), -1.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_P, (-1.0000000000000000e-02,1.3), 4.975515107069e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Pinv, (4.9755151070688325e-01,1.3), -1.000000000000e-02, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_P, (-1.0000000000000000e-03,1.3), 4.997551462897e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Pinv, (4.9975514628969159e-01,1.3), -1.000000000000e-03, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_P, (-1.0000000000000000e-04,1.3), 4.999755146242e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_P, (-1.0000000000000001e-05,1.3), 4.999975514624e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_P, (-9.9999999999999995e-07,1.3), 4.999997551462e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_P, (-9.9999999999999995e-08,1.3), 4.999999755146e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_P, (-1.0000000000000000e-08,1.3), 4.999999975515e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_P, (-1.0000000000000001e-09,1.3), 4.999999997551e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_P, (-1.0000000000000000e-10,1.3), 4.999999999755e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_P, (0.0000000000000000e+00,1.3), 5.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Pinv, (5.0000000000000011e-01,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_P, (1.0000000000000000e-10,1.3), 5.000000000245e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_P, (1.0000000000000001e-09,1.3), 5.000000002449e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_P, (1.0000000000000000e-08,1.3), 5.000000024485e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_P, (9.9999999999999995e-08,1.3), 5.000000244854e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_P, (9.9999999999999995e-07,1.3), 5.000002448538e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_P, (1.0000000000000001e-05,1.3), 5.000024485376e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_P, (1.0000000000000000e-04,1.3), 5.000244853758e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_P, (1.0000000000000000e-03,1.3), 5.002448537103e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Pinv, (5.0024485371030836e-01,1.3), 1.000000000000e-03, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_P, (1.0000000000000000e-02,1.3), 5.024484892931e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Pinv, (5.0244848929311670e-01,1.3), 1.000000000000e-02, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_P, (1.0000000000000001e-01,1.3), 5.244372519722e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Pinv, (5.2443725197219748e-01,1.3), 1.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_P, (1.0000000000000000e+00,1.3), 7.087144001602e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Pinv, (7.0871440016015275e-01,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_P, (1.0000000000000000e+01,1.3), 9.588504881750e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Pinv, (9.5885048817502649e-01,1.3), 1.000000000000e+01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_P, (1.0000000000000000e+02,1.3), 9.958622045649e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Pinv, (9.9586220456491636e-01,1.3), 1.000000000000e+02, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_P, (1.0000000000000000e+03,1.3), 9.995861973811e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Pinv, (9.9958619738106980e-01,1.3), 1.000000000000e+03, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_P, (1.0000000000000000e+04,1.3), 9.999586197150e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_P, (1.0000000000000000e+05,1.3), 9.999958619715e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_P, (1.0000000000000000e+06,1.3), 9.999995861971e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_P, (1.0000000000000000e+07,1.3), 9.999999586197e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_P, (1.0000000000000000e+08,1.3), 9.999999958620e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_P, (1.0000000000000000e+09,1.3), 9.999999995862e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_P, (1.0000000000000000e+10,1.3), 9.999999999586e-01, TEST_TOL6);
+
+ TEST(gsl_cdf_cauchy_Q, (1.0000000000000000e+10,1.3), 4.138028520389e-11, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Qinv, (4.1380285203892783e-11,1.3), 1.000000000000e+10, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Q, (1.0000000000000000e+09,1.3), 4.138028520389e-10, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Qinv, (4.1380285203892792e-10,1.3), 1.000000000000e+09, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Q, (1.0000000000000000e+08,1.3), 4.138028520389e-09, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Qinv, (4.1380285203892787e-09,1.3), 1.000000000000e+08, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Q, (1.0000000000000000e+07,1.3), 4.138028520389e-08, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Qinv, (4.1380285203892555e-08,1.3), 1.000000000000e+07, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Q, (1.0000000000000000e+06,1.3), 4.138028520387e-07, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Qinv, (4.1380285203869488e-07,1.3), 1.000000000000e+06, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Q, (1.0000000000000000e+05,1.3), 4.138028520156e-06, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Qinv, (4.1380285201561693e-06,1.3), 1.000000000000e+05, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Q, (1.0000000000000000e+04,1.3), 4.138028497078e-05, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Qinv, (4.1380284970783855e-05,1.3), 1.000000000000e+04, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Q, (1.0000000000000000e+03,1.3), 4.138026189302e-04, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Qinv, (4.1380261893022424e-04,1.3), 1.000000000000e+03, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Q, (1.0000000000000000e+02,1.3), 4.137795435084e-03, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Qinv, (4.1377954350836910e-03,1.3), 1.000000000000e+02, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Q, (1.0000000000000000e+01,1.3), 4.114951182497e-02, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Qinv, (4.1149511824973506e-02,1.3), 1.000000000000e+01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Q, (1.0000000000000000e+00,1.3), 2.912855998398e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Qinv, (2.9128559983984725e-01,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Q, (1.0000000000000001e-01,1.3), 4.755627480278e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Qinv, (4.7556274802780252e-01,1.3), 1.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Q, (1.0000000000000000e-02,1.3), 4.975515107069e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Qinv, (4.9755151070688325e-01,1.3), 1.000000000000e-02, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Q, (1.0000000000000000e-03,1.3), 4.997551462897e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Qinv, (4.9975514628969159e-01,1.3), 1.000000000000e-03, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Q, (1.0000000000000000e-04,1.3), 4.999755146242e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Q, (1.0000000000000001e-05,1.3), 4.999975514624e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Q, (9.9999999999999995e-07,1.3), 4.999997551462e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Q, (9.9999999999999995e-08,1.3), 4.999999755146e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Q, (1.0000000000000000e-08,1.3), 4.999999975515e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Q, (1.0000000000000001e-09,1.3), 4.999999997551e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Q, (1.0000000000000000e-10,1.3), 4.999999999755e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Q, (0.0000000000000000e+00,1.3), 5.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Qinv, (5.0000000000000011e-01,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Q, (-1.0000000000000000e-10,1.3), 5.000000000245e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Q, (-1.0000000000000001e-09,1.3), 5.000000002449e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Q, (-1.0000000000000000e-08,1.3), 5.000000024485e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Q, (-9.9999999999999995e-08,1.3), 5.000000244854e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Q, (-9.9999999999999995e-07,1.3), 5.000002448538e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Q, (-1.0000000000000001e-05,1.3), 5.000024485376e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Q, (-1.0000000000000000e-04,1.3), 5.000244853758e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Q, (-1.0000000000000000e-03,1.3), 5.002448537103e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Qinv, (5.0024485371030836e-01,1.3), -1.000000000000e-03, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Q, (-1.0000000000000000e-02,1.3), 5.024484892931e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Qinv, (5.0244848929311670e-01,1.3), -1.000000000000e-02, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Q, (-1.0000000000000001e-01,1.3), 5.244372519722e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Qinv, (5.2443725197219748e-01,1.3), -1.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Q, (-1.0000000000000000e+00,1.3), 7.087144001602e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Qinv, (7.0871440016015275e-01,1.3), -1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Q, (-1.0000000000000000e+01,1.3), 9.588504881750e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Qinv, (9.5885048817502649e-01,1.3), -1.000000000000e+01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Q, (-1.0000000000000000e+02,1.3), 9.958622045649e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Qinv, (9.9586220456491636e-01,1.3), -1.000000000000e+02, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Q, (-1.0000000000000000e+03,1.3), 9.995861973811e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Qinv, (9.9958619738106980e-01,1.3), -1.000000000000e+03, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Q, (-1.0000000000000000e+04,1.3), 9.999586197150e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Q, (-1.0000000000000000e+05,1.3), 9.999958619715e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Q, (-1.0000000000000000e+06,1.3), 9.999995861971e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Q, (-1.0000000000000000e+07,1.3), 9.999999586197e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Q, (-1.0000000000000000e+08,1.3), 9.999999958620e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Q, (-1.0000000000000000e+09,1.3), 9.999999995862e-01, TEST_TOL6);
+ TEST(gsl_cdf_cauchy_Q, (-1.0000000000000000e+10,1.3), 9.999999999586e-01, TEST_TOL6);
+}
+
+void test_auto_gaussian (void);
+
+void
+test_auto_gaussian (void)
+{
+ TEST(gsl_cdf_gaussian_P, (-1.0000000000000000e+10,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_P, (-1.0000000000000000e+09,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_P, (-1.0000000000000000e+08,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_P, (-1.0000000000000000e+07,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_P, (-1.0000000000000000e+06,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_P, (-1.0000000000000000e+05,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_P, (-1.0000000000000000e+04,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_P, (-1.0000000000000000e+03,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_P, (-1.0000000000000000e+02,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_P, (-1.0000000000000000e+01,1.3), 7.225229227927e-15, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Pinv, (7.2252292279265077e-15,1.3), -1.000000000000e+01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_P, (-1.0000000000000000e+00,1.3), 2.208781637125e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Pinv, (2.2087816371245972e-01,1.3), -1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_P, (-1.0000000000000001e-01,1.3), 4.693423696034e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Pinv, (4.6934236960338749e-01,1.3), -1.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_P, (-1.0000000000000000e-02,1.3), 4.969312434916e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Pinv, (4.9693124349158196e-01,1.3), -1.000000000000e-02, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_P, (-1.0000000000000000e-03,1.3), 4.996931213530e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Pinv, (4.9969312135303229e-01,1.3), -1.000000000000e-03, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_P, (-1.0000000000000000e-04,1.3), 4.999693121323e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_P, (-1.0000000000000001e-05,1.3), 4.999969312132e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_P, (-9.9999999999999995e-07,1.3), 4.999996931213e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_P, (-9.9999999999999995e-08,1.3), 4.999999693121e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_P, (-1.0000000000000000e-08,1.3), 4.999999969312e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_P, (-1.0000000000000001e-09,1.3), 4.999999996931e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_P, (-1.0000000000000000e-10,1.3), 4.999999999693e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_P, (0.0000000000000000e+00,1.3), 5.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Pinv, (5.0000000000000000e-01,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_P, (1.0000000000000000e-10,1.3), 5.000000000307e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_P, (1.0000000000000001e-09,1.3), 5.000000003069e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_P, (1.0000000000000000e-08,1.3), 5.000000030688e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_P, (9.9999999999999995e-08,1.3), 5.000000306879e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_P, (9.9999999999999995e-07,1.3), 5.000003068787e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_P, (1.0000000000000001e-05,1.3), 5.000030687868e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_P, (1.0000000000000000e-04,1.3), 5.000306878677e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_P, (1.0000000000000000e-03,1.3), 5.003068786470e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Pinv, (5.0030687864696777e-01,1.3), 1.000000000000e-03, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_P, (1.0000000000000000e-02,1.3), 5.030687565084e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Pinv, (5.0306875650841798e-01,1.3), 1.000000000000e-02, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_P, (1.0000000000000001e-01,1.3), 5.306576303966e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Pinv, (5.3065763039661251e-01,1.3), 1.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_P, (1.0000000000000000e+00,1.3), 7.791218362875e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Pinv, (7.7912183628754028e-01,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_P, (1.0000000000000000e+01,1.3), 1.000000000000e-00, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_P, (1.0000000000000000e+02,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_P, (1.0000000000000000e+03,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_P, (1.0000000000000000e+04,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_P, (1.0000000000000000e+05,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_P, (1.0000000000000000e+06,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_P, (1.0000000000000000e+07,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_P, (1.0000000000000000e+08,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_P, (1.0000000000000000e+09,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_P, (1.0000000000000000e+10,1.3), 1.000000000000e+00, TEST_TOL6);
+
+ TEST(gsl_cdf_gaussian_Q, (1.0000000000000000e+10,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Q, (1.0000000000000000e+09,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Q, (1.0000000000000000e+08,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Q, (1.0000000000000000e+07,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Q, (1.0000000000000000e+06,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Q, (1.0000000000000000e+05,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Q, (1.0000000000000000e+04,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Q, (1.0000000000000000e+03,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Q, (1.0000000000000000e+02,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Q, (1.0000000000000000e+01,1.3), 7.225229227927e-15, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Qinv, (7.2252292279265077e-15,1.3), 1.000000000000e+01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Q, (1.0000000000000000e+00,1.3), 2.208781637125e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Qinv, (2.2087816371245972e-01,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Q, (1.0000000000000001e-01,1.3), 4.693423696034e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Qinv, (4.6934236960338749e-01,1.3), 1.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Q, (1.0000000000000000e-02,1.3), 4.969312434916e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Qinv, (4.9693124349158196e-01,1.3), 1.000000000000e-02, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Q, (1.0000000000000000e-03,1.3), 4.996931213530e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Qinv, (4.9969312135303229e-01,1.3), 1.000000000000e-03, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Q, (1.0000000000000000e-04,1.3), 4.999693121323e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Q, (1.0000000000000001e-05,1.3), 4.999969312132e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Q, (9.9999999999999995e-07,1.3), 4.999996931213e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Q, (9.9999999999999995e-08,1.3), 4.999999693121e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Q, (1.0000000000000000e-08,1.3), 4.999999969312e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Q, (1.0000000000000001e-09,1.3), 4.999999996931e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Q, (1.0000000000000000e-10,1.3), 4.999999999693e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Q, (0.0000000000000000e+00,1.3), 5.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Qinv, (5.0000000000000000e-01,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Q, (-1.0000000000000000e-10,1.3), 5.000000000307e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Q, (-1.0000000000000001e-09,1.3), 5.000000003069e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Q, (-1.0000000000000000e-08,1.3), 5.000000030688e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Q, (-9.9999999999999995e-08,1.3), 5.000000306879e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Q, (-9.9999999999999995e-07,1.3), 5.000003068787e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Q, (-1.0000000000000001e-05,1.3), 5.000030687868e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Q, (-1.0000000000000000e-04,1.3), 5.000306878677e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Q, (-1.0000000000000000e-03,1.3), 5.003068786470e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Qinv, (5.0030687864696777e-01,1.3), -1.000000000000e-03, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Q, (-1.0000000000000000e-02,1.3), 5.030687565084e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Qinv, (5.0306875650841798e-01,1.3), -1.000000000000e-02, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Q, (-1.0000000000000001e-01,1.3), 5.306576303966e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Qinv, (5.3065763039661251e-01,1.3), -1.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Q, (-1.0000000000000000e+00,1.3), 7.791218362875e-01, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Qinv, (7.7912183628754028e-01,1.3), -1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Q, (-1.0000000000000000e+01,1.3), 1.000000000000e-00, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Q, (-1.0000000000000000e+02,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Q, (-1.0000000000000000e+03,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Q, (-1.0000000000000000e+04,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Q, (-1.0000000000000000e+05,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Q, (-1.0000000000000000e+06,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Q, (-1.0000000000000000e+07,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Q, (-1.0000000000000000e+08,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Q, (-1.0000000000000000e+09,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gaussian_Q, (-1.0000000000000000e+10,1.3), 1.000000000000e+00, TEST_TOL6);
+}
+
+void test_auto_laplace (void);
+
+void
+test_auto_laplace (void)
+{
+ TEST(gsl_cdf_laplace_P, (-1.0000000000000000e+10,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_laplace_P, (-1.0000000000000000e+09,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_laplace_P, (-1.0000000000000000e+08,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_laplace_P, (-1.0000000000000000e+07,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_laplace_P, (-1.0000000000000000e+06,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_laplace_P, (-1.0000000000000000e+05,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_laplace_P, (-1.0000000000000000e+04,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_laplace_P, (-1.0000000000000000e+03,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_laplace_P, (-1.0000000000000000e+02,1.3), 1.957501779912e-34, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Pinv, (1.9575017799122328e-34,1.3), -1.000000000000e+02, TEST_TOL6);
+ TEST(gsl_cdf_laplace_P, (-1.0000000000000000e+01,1.3), 2.281619502905e-04, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Pinv, (2.2816195029051560e-04,1.3), -1.000000000000e+01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_P, (-1.0000000000000000e+00,1.3), 2.316846846156e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Pinv, (2.3168468461558764e-01,1.3), -1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_laplace_P, (-1.0000000000000001e-01,1.3), 4.629805393212e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Pinv, (4.6298053932115801e-01,1.3), -1.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_P, (-1.0000000000000000e-02,1.3), 4.961686011956e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Pinv, (4.9616860119557432e-01,1.3), -1.000000000000e-02, TEST_TOL6);
+ TEST(gsl_cdf_laplace_P, (-1.0000000000000000e-03,1.3), 4.996155325065e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Pinv, (4.9961553250645546e-01,1.3), -1.000000000000e-03, TEST_TOL6);
+ TEST(gsl_cdf_laplace_P, (-1.0000000000000000e-04,1.3), 4.999615399408e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_P, (-1.0000000000000001e-05,1.3), 4.999961538609e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_P, (-9.9999999999999995e-07,1.3), 4.999996153848e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_P, (-9.9999999999999995e-08,1.3), 4.999999615385e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_P, (-1.0000000000000000e-08,1.3), 4.999999961538e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_P, (-1.0000000000000001e-09,1.3), 4.999999996154e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_P, (-1.0000000000000000e-10,1.3), 4.999999999615e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_P, (0.0000000000000000e+00,1.3), 5.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Pinv, (5.0000000000000000e-01,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_laplace_P, (1.0000000000000000e-10,1.3), 5.000000000385e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_P, (1.0000000000000001e-09,1.3), 5.000000003846e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_P, (1.0000000000000000e-08,1.3), 5.000000038462e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_P, (9.9999999999999995e-08,1.3), 5.000000384615e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_P, (9.9999999999999995e-07,1.3), 5.000003846152e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_P, (1.0000000000000001e-05,1.3), 5.000038461391e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_P, (1.0000000000000000e-04,1.3), 5.000384600592e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_P, (1.0000000000000000e-03,1.3), 5.003844674935e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Pinv, (5.0038446749354448e-01,1.3), 1.000000000000e-03, TEST_TOL6);
+ TEST(gsl_cdf_laplace_P, (1.0000000000000000e-02,1.3), 5.038313988044e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Pinv, (5.0383139880442562e-01,1.3), 1.000000000000e-02, TEST_TOL6);
+ TEST(gsl_cdf_laplace_P, (1.0000000000000001e-01,1.3), 5.370194606788e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Pinv, (5.3701946067884199e-01,1.3), 1.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_P, (1.0000000000000000e+00,1.3), 7.683153153844e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Pinv, (7.6831531538441233e-01,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_laplace_P, (1.0000000000000000e+01,1.3), 9.997718380497e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Pinv, (9.9977183804970948e-01,1.3), 1.000000000000e+01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_P, (1.0000000000000000e+02,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_laplace_P, (1.0000000000000000e+03,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_laplace_P, (1.0000000000000000e+04,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_laplace_P, (1.0000000000000000e+05,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_laplace_P, (1.0000000000000000e+06,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_laplace_P, (1.0000000000000000e+07,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_laplace_P, (1.0000000000000000e+08,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_laplace_P, (1.0000000000000000e+09,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_laplace_P, (1.0000000000000000e+10,1.3), 1.000000000000e+00, TEST_TOL6);
+
+ TEST(gsl_cdf_laplace_Q, (1.0000000000000000e+10,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Q, (1.0000000000000000e+09,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Q, (1.0000000000000000e+08,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Q, (1.0000000000000000e+07,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Q, (1.0000000000000000e+06,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Q, (1.0000000000000000e+05,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Q, (1.0000000000000000e+04,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Q, (1.0000000000000000e+03,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Q, (1.0000000000000000e+02,1.3), 1.957501779912e-34, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Qinv, (1.9575017799122328e-34,1.3), 1.000000000000e+02, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Q, (1.0000000000000000e+01,1.3), 2.281619502905e-04, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Qinv, (2.2816195029051560e-04,1.3), 1.000000000000e+01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Q, (1.0000000000000000e+00,1.3), 2.316846846156e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Qinv, (2.3168468461558764e-01,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Q, (1.0000000000000001e-01,1.3), 4.629805393212e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Qinv, (4.6298053932115801e-01,1.3), 1.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Q, (1.0000000000000000e-02,1.3), 4.961686011956e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Qinv, (4.9616860119557432e-01,1.3), 1.000000000000e-02, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Q, (1.0000000000000000e-03,1.3), 4.996155325065e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Qinv, (4.9961553250645546e-01,1.3), 1.000000000000e-03, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Q, (1.0000000000000000e-04,1.3), 4.999615399408e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Q, (1.0000000000000001e-05,1.3), 4.999961538609e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Q, (9.9999999999999995e-07,1.3), 4.999996153848e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Q, (9.9999999999999995e-08,1.3), 4.999999615385e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Q, (1.0000000000000000e-08,1.3), 4.999999961538e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Q, (1.0000000000000001e-09,1.3), 4.999999996154e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Q, (1.0000000000000000e-10,1.3), 4.999999999615e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Q, (0.0000000000000000e+00,1.3), 5.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Qinv, (5.0000000000000000e-01,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Q, (-1.0000000000000000e-10,1.3), 5.000000000385e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Q, (-1.0000000000000001e-09,1.3), 5.000000003846e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Q, (-1.0000000000000000e-08,1.3), 5.000000038462e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Q, (-9.9999999999999995e-08,1.3), 5.000000384615e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Q, (-9.9999999999999995e-07,1.3), 5.000003846152e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Q, (-1.0000000000000001e-05,1.3), 5.000038461391e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Q, (-1.0000000000000000e-04,1.3), 5.000384600592e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Q, (-1.0000000000000000e-03,1.3), 5.003844674935e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Qinv, (5.0038446749354448e-01,1.3), -1.000000000000e-03, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Q, (-1.0000000000000000e-02,1.3), 5.038313988044e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Qinv, (5.0383139880442562e-01,1.3), -1.000000000000e-02, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Q, (-1.0000000000000001e-01,1.3), 5.370194606788e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Qinv, (5.3701946067884199e-01,1.3), -1.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Q, (-1.0000000000000000e+00,1.3), 7.683153153844e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Qinv, (7.6831531538441233e-01,1.3), -1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Q, (-1.0000000000000000e+01,1.3), 9.997718380497e-01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Qinv, (9.9977183804970948e-01,1.3), -1.000000000000e+01, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Q, (-1.0000000000000000e+02,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Q, (-1.0000000000000000e+03,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Q, (-1.0000000000000000e+04,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Q, (-1.0000000000000000e+05,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Q, (-1.0000000000000000e+06,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Q, (-1.0000000000000000e+07,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Q, (-1.0000000000000000e+08,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Q, (-1.0000000000000000e+09,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_laplace_Q, (-1.0000000000000000e+10,1.3), 1.000000000000e+00, TEST_TOL6);
+}
+
+void test_auto_rayleigh (void);
+
+void
+test_auto_rayleigh (void)
+{
+ TEST(gsl_cdf_rayleigh_P, (0.0000000000000000e+00,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_P, (1.0000000000000000e-10,1.3), 2.958579881657e-21, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_Pinv, (2.9585798816568050e-21,1.3), 1.000000000000e-10, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_P, (1.0000000000000001e-09,1.3), 2.958579881657e-19, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_Pinv, (2.9585798816568049e-19,1.3), 1.000000000000e-09, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_P, (1.0000000000000000e-08,1.3), 2.958579881657e-17, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_Pinv, (2.9585798816568048e-17,1.3), 1.000000000000e-08, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_P, (9.9999999999999995e-08,1.3), 2.958579881657e-15, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_Pinv, (2.9585798816568001e-15,1.3), 1.000000000000e-07, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_P, (9.9999999999999995e-07,1.3), 2.958579881656e-13, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_Pinv, (2.9585798816563665e-13,1.3), 1.000000000000e-06, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_P, (1.0000000000000001e-05,1.3), 2.958579881613e-11, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_Pinv, (2.9585798816130393e-11,1.3), 1.000000000000e-05, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_P, (1.0000000000000000e-04,1.3), 2.958579877280e-09, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_Pinv, (2.9585798772802076e-09,1.3), 1.000000000000e-04, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_P, (1.0000000000000000e-03,1.3), 2.958579443997e-07, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_Pinv, (2.9585794439971025e-07,1.3), 1.000000000000e-03, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_P, (1.0000000000000000e-02,1.3), 2.958536116114e-05, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_Pinv, (2.9585361161138382e-05,1.3), 1.000000000000e-02, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_P, (1.0000000000000001e-01,1.3), 2.954207597179e-03, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_Pinv, (2.9542075971792496e-03,1.3), 1.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_P, (1.0000000000000000e+00,1.3), 2.561069378624e-01, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_Pinv, (2.5610693786235361e-01,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_P, (1.0000000000000000e+01,1.3), 9.999999999999e-01, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_P, (1.0000000000000000e+02,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_P, (1.0000000000000000e+03,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_P, (1.0000000000000000e+04,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_P, (1.0000000000000000e+05,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_P, (1.0000000000000000e+06,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_P, (1.0000000000000000e+07,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_P, (1.0000000000000000e+08,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_P, (1.0000000000000000e+09,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_P, (1.0000000000000000e+10,1.3), 1.000000000000e+00, TEST_TOL6);
+
+ TEST(gsl_cdf_rayleigh_Q, (1.0000000000000000e+10,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_Q, (1.0000000000000000e+09,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_Q, (1.0000000000000000e+08,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_Q, (1.0000000000000000e+07,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_Q, (1.0000000000000000e+06,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_Q, (1.0000000000000000e+05,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_Q, (1.0000000000000000e+04,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_Q, (1.0000000000000000e+03,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_Q, (1.0000000000000000e+02,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_Q, (1.0000000000000000e+01,1.3), 1.415959498849e-13, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_Qinv, (1.4159594988487832e-13,1.3), 1.000000000000e+01, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_Q, (1.0000000000000000e+00,1.3), 7.438930621376e-01, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_Qinv, (7.4389306213764639e-01,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_Q, (1.0000000000000001e-01,1.3), 9.970457924028e-01, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_Qinv, (9.9704579240282076e-01,1.3), 1.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_Q, (1.0000000000000000e-02,1.3), 9.999704146388e-01, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_Q, (1.0000000000000000e-03,1.3), 9.999997041421e-01, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_Q, (1.0000000000000000e-04,1.3), 9.999999970414e-01, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_Q, (1.0000000000000001e-05,1.3), 9.999999999704e-01, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_Q, (9.9999999999999995e-07,1.3), 9.999999999997e-01, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_Q, (9.9999999999999995e-08,1.3), 1.000000000000e-00, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_Q, (1.0000000000000000e-08,1.3), 1.000000000000e-00, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_Q, (1.0000000000000001e-09,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_Q, (1.0000000000000000e-10,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_rayleigh_Q, (0.0000000000000000e+00,1.3), 1.000000000000e+00, TEST_TOL6);
+}
+
+void test_auto_flat (void);
+
+void
+test_auto_flat (void)
+{
+ TEST(gsl_cdf_flat_P, (0.0000000000000000e+00,1.3,750.0), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_flat_P, (1.0000000000000000e-10,1.3,750.0), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_flat_P, (1.0000000000000001e-09,1.3,750.0), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_flat_P, (1.0000000000000000e-08,1.3,750.0), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_flat_P, (9.9999999999999995e-08,1.3,750.0), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_flat_P, (9.9999999999999995e-07,1.3,750.0), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_flat_P, (1.0000000000000001e-05,1.3,750.0), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_flat_P, (1.0000000000000000e-04,1.3,750.0), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_flat_P, (1.0000000000000000e-03,1.3,750.0), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_flat_P, (1.0000000000000000e-02,1.3,750.0), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_flat_P, (1.0000000000000001e-01,1.3,750.0), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_flat_P, (1.0000000000000000e+00,1.3,750.0), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_flat_P, (1.0000000000000000e+01,1.3,750.0), 1.162014157874e-02, TEST_TOL6);
+ TEST(gsl_cdf_flat_Pinv, (1.1620141578738545e-02,1.3,750.0), 1.000000000000e+01, TEST_TOL6);
+ TEST(gsl_cdf_flat_P, (1.0000000000000000e+02,1.3,750.0), 1.318285027381e-01, TEST_TOL6);
+ TEST(gsl_cdf_flat_Pinv, (1.3182850273808142e-01,1.3,750.0), 1.000000000000e+02, TEST_TOL6);
+ TEST(gsl_cdf_flat_P, (1.0000000000000000e+03,1.3,750.0), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_flat_P, (1.0000000000000000e+04,1.3,750.0), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_flat_P, (1.0000000000000000e+05,1.3,750.0), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_flat_P, (1.0000000000000000e+06,1.3,750.0), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_flat_P, (1.0000000000000000e+07,1.3,750.0), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_flat_P, (1.0000000000000000e+08,1.3,750.0), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_flat_P, (1.0000000000000000e+09,1.3,750.0), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_flat_P, (1.0000000000000000e+10,1.3,750.0), 1.000000000000e+00, TEST_TOL6);
+
+ TEST(gsl_cdf_flat_Q, (1.0000000000000000e+10,1.3,750.0), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_flat_Q, (1.0000000000000000e+09,1.3,750.0), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_flat_Q, (1.0000000000000000e+08,1.3,750.0), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_flat_Q, (1.0000000000000000e+07,1.3,750.0), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_flat_Q, (1.0000000000000000e+06,1.3,750.0), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_flat_Q, (1.0000000000000000e+05,1.3,750.0), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_flat_Q, (1.0000000000000000e+04,1.3,750.0), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_flat_Q, (1.0000000000000000e+03,1.3,750.0), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_flat_Q, (1.0000000000000000e+02,1.3,750.0), 8.681714972619e-01, TEST_TOL6);
+ TEST(gsl_cdf_flat_Qinv, (8.6817149726190368e-01,1.3,750.0), 1.000000000000e+02, TEST_TOL6);
+ TEST(gsl_cdf_flat_Q, (1.0000000000000000e+01,1.3,750.0), 9.883798584213e-01, TEST_TOL6);
+ TEST(gsl_cdf_flat_Qinv, (9.8837985842125353e-01,1.3,750.0), 1.000000000000e+01, TEST_TOL6);
+ TEST(gsl_cdf_flat_Q, (1.0000000000000000e+00,1.3,750.0), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_flat_Q, (1.0000000000000001e-01,1.3,750.0), 1.000000000000e-00, TEST_TOL6);
+ TEST(gsl_cdf_flat_Q, (1.0000000000000000e-02,1.3,750.0), 1.000000000000e-00, TEST_TOL6);
+ TEST(gsl_cdf_flat_Q, (1.0000000000000000e-03,1.3,750.0), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_flat_Q, (1.0000000000000000e-04,1.3,750.0), 1.000000000000e-00, TEST_TOL6);
+ TEST(gsl_cdf_flat_Q, (1.0000000000000001e-05,1.3,750.0), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_flat_Q, (9.9999999999999995e-07,1.3,750.0), 1.000000000000e-00, TEST_TOL6);
+ TEST(gsl_cdf_flat_Q, (9.9999999999999995e-08,1.3,750.0), 1.000000000000e-00, TEST_TOL6);
+ TEST(gsl_cdf_flat_Q, (1.0000000000000000e-08,1.3,750.0), 1.000000000000e-00, TEST_TOL6);
+ TEST(gsl_cdf_flat_Q, (1.0000000000000001e-09,1.3,750.0), 1.000000000000e-00, TEST_TOL6);
+ TEST(gsl_cdf_flat_Q, (1.0000000000000000e-10,1.3,750.0), 1.000000000000e-00, TEST_TOL6);
+ TEST(gsl_cdf_flat_Q, (0.0000000000000000e+00,1.3,750.0), 1.000000000000e+00, TEST_TOL6);
+}
+
+void test_auto_lognormal (void);
+
+void
+test_auto_lognormal (void)
+{
+ TEST(gsl_cdf_lognormal_P, (0.0000000000000000e+00,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_P, (1.0000000000000000e-10,1.3,2.7), 1.034288276012e-19, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Pinv, (1.0342882760115472e-19,1.3,2.7), 1.000000000000e-10, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_P, (1.0000000000000001e-09,1.3,2.7), 1.720583234428e-16, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Pinv, (1.7205832344275183e-16,1.3,2.7), 1.000000000000e-09, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_P, (1.0000000000000000e-08,1.3,2.7), 1.397140696550e-13, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Pinv, (1.3971406965496307e-13,1.3,2.7), 1.000000000000e-08, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_P, (9.9999999999999995e-08,1.3,2.7), 5.550354890102e-11, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Pinv, (5.5503548901015757e-11,1.3,2.7), 1.000000000000e-07, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_P, (9.9999999999999995e-07,1.3,2.7), 1.082087222875e-08, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Pinv, (1.0820872228749844e-08,1.3,2.7), 1.000000000000e-06, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_P, (1.0000000000000001e-05,1.3,2.7), 1.039815967490e-06, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Pinv, (1.0398159674903829e-06,1.3,2.7), 1.000000000000e-05, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_P, (1.0000000000000000e-04,1.3,2.7), 4.956354352667e-05, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Pinv, (4.9563543526667839e-05,1.3,2.7), 1.000000000000e-04, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_P, (1.0000000000000000e-03,1.3,2.7), 1.183246775456e-03, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Pinv, (1.1832467754562060e-03,1.3,2.7), 1.000000000000e-03, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_P, (1.0000000000000000e-02,1.3,2.7), 1.436760981041e-02, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Pinv, (1.4367609810406523e-02,1.3,2.7), 1.000000000000e-02, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_P, (1.0000000000000001e-01,1.3,2.7), 9.105428982941e-02, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Pinv, (9.1054289829405582e-02,1.3,2.7), 1.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_P, (1.0000000000000000e+00,1.3,2.7), 3.150871690838e-01, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Pinv, (3.1508716908375517e-01,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_P, (1.0000000000000000e+01,1.3,2.7), 6.448033073717e-01, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Pinv, (6.4480330737174019e-01,1.3,2.7), 1.000000000000e+01, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_P, (1.0000000000000000e+02,1.3,2.7), 8.895497448370e-01, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Pinv, (8.8954974483702642e-01,1.3,2.7), 1.000000000000e+02, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_P, (1.0000000000000000e+03,1.3,2.7), 9.810967467052e-01, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Pinv, (9.8109674670518154e-01,1.3,2.7), 1.000000000000e+03, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_P, (1.0000000000000000e+04,1.3,2.7), 9.983038570318e-01, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Pinv, (9.9830385703184354e-01,1.3,2.7), 1.000000000000e+04, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_P, (1.0000000000000000e+05,1.3,2.7), 9.999223897251e-01, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Pinv, (9.9992238972508574e-01,1.3,2.7), 1.000000000000e+05, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_P, (1.0000000000000000e+06,1.3,2.7), 9.999982185389e-01, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_P, (1.0000000000000000e+07,1.3,2.7), 9.999999796956e-01, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_P, (1.0000000000000000e+08,1.3,2.7), 9.999999998859e-01, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_P, (1.0000000000000000e+09,1.3,2.7), 9.999999999997e-01, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_P, (1.0000000000000000e+10,1.3,2.7), 1.000000000000e-00, TEST_TOL6);
+
+ TEST(gsl_cdf_lognormal_Q, (1.0000000000000000e+10,1.3,2.7), 4.255893513650e-16, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Qinv, (4.2558935136502785e-16,1.3,2.7), 1.000000000000e+10, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Q, (1.0000000000000000e+09,1.3,2.7), 3.150574023842e-13, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Qinv, (3.1505740238418296e-13,1.3,2.7), 1.000000000000e+09, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Q, (1.0000000000000000e+08,1.3,2.7), 1.141445550080e-10, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Qinv, (1.1414455500802107e-10,1.3,2.7), 1.000000000000e+08, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Q, (1.0000000000000000e+07,1.3,2.7), 2.030439602858e-08, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Qinv, (2.0304396028576915e-08,1.3,2.7), 1.000000000000e+07, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Q, (1.0000000000000000e+06,1.3,2.7), 1.781461076603e-06, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Qinv, (1.7814610766031938e-06,1.3,2.7), 1.000000000000e+06, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Q, (1.0000000000000000e+05,1.3,2.7), 7.761027491429e-05, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Qinv, (7.7610274914290006e-05,1.3,2.7), 1.000000000000e+05, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Q, (1.0000000000000000e+04,1.3,2.7), 1.696142968157e-03, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Qinv, (1.6961429681565346e-03,1.3,2.7), 1.000000000000e+04, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Q, (1.0000000000000000e+03,1.3,2.7), 1.890325329482e-02, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Qinv, (1.8903253294818529e-02,1.3,2.7), 1.000000000000e+03, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Q, (1.0000000000000000e+02,1.3,2.7), 1.104502551630e-01, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Qinv, (1.1045025516297369e-01,1.3,2.7), 1.000000000000e+02, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Q, (1.0000000000000000e+01,1.3,2.7), 3.551966926283e-01, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Qinv, (3.5519669262825992e-01,1.3,2.7), 1.000000000000e+01, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Q, (1.0000000000000000e+00,1.3,2.7), 6.849128309162e-01, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Qinv, (6.8491283091624500e-01,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Q, (1.0000000000000001e-01,1.3,2.7), 9.089457101706e-01, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Qinv, (9.0894571017059467e-01,1.3,2.7), 1.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Q, (1.0000000000000000e-02,1.3,2.7), 9.856323901896e-01, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Qinv, (9.8563239018959370e-01,1.3,2.7), 1.000000000000e-02, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Q, (1.0000000000000000e-03,1.3,2.7), 9.988167532245e-01, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Qinv, (9.9881675322454400e-01,1.3,2.7), 1.000000000000e-03, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Q, (1.0000000000000000e-04,1.3,2.7), 9.999504364565e-01, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Q, (1.0000000000000001e-05,1.3,2.7), 9.999989601840e-01, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Q, (9.9999999999999995e-07,1.3,2.7), 9.999999891791e-01, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Q, (9.9999999999999995e-08,1.3,2.7), 9.999999999445e-01, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Q, (1.0000000000000000e-08,1.3,2.7), 9.999999999999e-01, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Q, (1.0000000000000001e-09,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Q, (1.0000000000000000e-10,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_lognormal_Q, (0.0000000000000000e+00,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+}
+
+void test_auto_gamma (void);
+
+void
+test_auto_gamma (void)
+{
+ TEST(gsl_cdf_gamma_P, (0.0000000000000000e+00,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gamma_P, (1.0000000000000000e-10,1.3,2.7), 2.356478475164e-14, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Pinv, (2.3564784751638661e-14,1.3,2.7), 1.000000000000e-10, TEST_TOL6);
+ TEST(gsl_cdf_gamma_P, (1.0000000000000001e-09,1.3,2.7), 4.701792696644e-13, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Pinv, (4.7017926966439445e-13,1.3,2.7), 1.000000000000e-09, TEST_TOL6);
+ TEST(gsl_cdf_gamma_P, (1.0000000000000000e-08,1.3,2.7), 9.381309762735e-12, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Pinv, (9.3813097627346386e-12,1.3,2.7), 1.000000000000e-08, TEST_TOL6);
+ TEST(gsl_cdf_gamma_P, (9.9999999999999995e-08,1.3,2.7), 1.871817348197e-10, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Pinv, (1.8718173481972823e-10,1.3,2.7), 1.000000000000e-07, TEST_TOL6);
+ TEST(gsl_cdf_gamma_P, (9.9999999999999995e-07,1.3,2.7), 3.734765911711e-09, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Pinv, (3.7347659117114240e-09,1.3,2.7), 1.000000000000e-06, TEST_TOL6);
+ TEST(gsl_cdf_gamma_P, (1.0000000000000001e-05,1.3,2.7), 7.451823639191e-08, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Pinv, (7.4518236391910116e-08,1.3,2.7), 1.000000000000e-05, TEST_TOL6);
+ TEST(gsl_cdf_gamma_P, (1.0000000000000000e-04,1.3,2.7), 1.486806276026e-06, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Pinv, (1.4868062760263472e-06,1.3,2.7), 1.000000000000e-04, TEST_TOL6);
+ TEST(gsl_cdf_gamma_P, (1.0000000000000000e-03,1.3,2.7), 2.966009681152e-05, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Pinv, (2.9660096811518665e-05,1.3,2.7), 1.000000000000e-03, TEST_TOL6);
+ TEST(gsl_cdf_gamma_P, (1.0000000000000000e-02,1.3,2.7), 5.906831032950e-04, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Pinv, (5.9068310329499826e-04,1.3,2.7), 1.000000000000e-02, TEST_TOL6);
+ TEST(gsl_cdf_gamma_P, (1.0000000000000001e-01,1.3,2.7), 1.156629233128e-02, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Pinv, (1.1566292331279586e-02,1.3,2.7), 1.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_gamma_P, (1.0000000000000000e+00,1.3,2.7), 1.921237769663e-01, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Pinv, (1.9212377696630473e-01,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gamma_P, (1.0000000000000000e+01,1.3,2.7), 9.565035356115e-01, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Pinv, (9.5650353561153789e-01,1.3,2.7), 1.000000000000e+01, TEST_TOL6);
+ TEST(gsl_cdf_gamma_P, (1.0000000000000000e+02,1.3,2.7), 1.000000000000e-00, TEST_TOL6);
+ TEST(gsl_cdf_gamma_P, (1.0000000000000000e+03,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gamma_P, (1.0000000000000000e+04,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gamma_P, (1.0000000000000000e+05,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gamma_P, (1.0000000000000000e+06,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gamma_P, (1.0000000000000000e+07,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gamma_P, (1.0000000000000000e+08,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gamma_P, (1.0000000000000000e+09,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gamma_P, (1.0000000000000000e+10,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+
+ TEST(gsl_cdf_gamma_Q, (1.0000000000000000e+10,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Q, (1.0000000000000000e+09,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Q, (1.0000000000000000e+08,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Q, (1.0000000000000000e+07,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Q, (1.0000000000000000e+06,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Q, (1.0000000000000000e+05,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Q, (1.0000000000000000e+04,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Q, (1.0000000000000000e+03,1.3,2.7), 9.292091038794e-161, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Qinv, (9.2920910387939860e-161,1.3,2.7), 1.000000000000e+03, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Q, (1.0000000000000000e+02,1.3,2.7), 2.729167976527e-16, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Qinv, (2.7291679765273174e-16,1.3,2.7), 1.000000000000e+02, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Q, (1.0000000000000000e+01,1.3,2.7), 4.349646438846e-02, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Qinv, (4.3496464388462192e-02,1.3,2.7), 1.000000000000e+01, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Q, (1.0000000000000000e+00,1.3,2.7), 8.078762230337e-01, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Qinv, (8.0787622303369533e-01,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Q, (1.0000000000000001e-01,1.3,2.7), 9.884337076687e-01, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Qinv, (9.8843370766872041e-01,1.3,2.7), 1.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Q, (1.0000000000000000e-02,1.3,2.7), 9.994093168967e-01, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Qinv, (9.9940931689670498e-01,1.3,2.7), 1.000000000000e-02, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Q, (1.0000000000000000e-03,1.3,2.7), 9.999703399032e-01, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Q, (1.0000000000000000e-04,1.3,2.7), 9.999985131937e-01, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Q, (1.0000000000000001e-05,1.3,2.7), 9.999999254818e-01, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Q, (9.9999999999999995e-07,1.3,2.7), 9.999999962652e-01, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Q, (9.9999999999999995e-08,1.3,2.7), 9.999999998128e-01, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Q, (1.0000000000000000e-08,1.3,2.7), 9.999999999906e-01, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Q, (1.0000000000000001e-09,1.3,2.7), 9.999999999995e-01, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Q, (1.0000000000000000e-10,1.3,2.7), 1.000000000000e-00, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Q, (0.0000000000000000e+00,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+}
+
+void test_auto_chisq (void);
+
+void
+test_auto_chisq (void)
+{
+ TEST(gsl_cdf_chisq_P, (0.0000000000000000e+00,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_chisq_P, (1.0000000000000000e-10,1.3), 2.238884178785e-07, TEST_TOL6);
+ TEST(gsl_cdf_chisq_Pinv, (2.2388841787852728e-07,1.3), 1.000000000000e-10, TEST_TOL6);
+ TEST(gsl_cdf_chisq_P, (1.0000000000000001e-09,1.3), 1.000072827212e-06, TEST_TOL6);
+ TEST(gsl_cdf_chisq_Pinv, (1.0000728272124926e-06,1.3), 1.000000000000e-09, TEST_TOL6);
+ TEST(gsl_cdf_chisq_P, (1.0000000000000000e-08,1.3), 4.467161220799e-06, TEST_TOL6);
+ TEST(gsl_cdf_chisq_Pinv, (4.4671612207994108e-06,1.3), 1.000000000000e-08, TEST_TOL6);
+ TEST(gsl_cdf_chisq_P, (9.9999999999999995e-08,1.3), 1.995407585451e-05, TEST_TOL6);
+ TEST(gsl_cdf_chisq_Pinv, (1.9954075854510294e-05,1.3), 1.000000000000e-07, TEST_TOL6);
+ TEST(gsl_cdf_chisq_P, (9.9999999999999995e-07,1.3), 8.913156700686e-05, TEST_TOL6);
+ TEST(gsl_cdf_chisq_Pinv, (8.9131567006858211e-05,1.3), 1.000000000000e-06, TEST_TOL6);
+ TEST(gsl_cdf_chisq_P, (1.0000000000000001e-05,1.3), 3.981353794611e-04, TEST_TOL6);
+ TEST(gsl_cdf_chisq_Pinv, (3.9813537946105002e-04,1.3), 1.000000000000e-05, TEST_TOL6);
+ TEST(gsl_cdf_chisq_P, (1.0000000000000000e-04,1.3), 1.778373888800e-03, TEST_TOL6);
+ TEST(gsl_cdf_chisq_Pinv, (1.7783738888003920e-03,1.3), 1.000000000000e-04, TEST_TOL6);
+ TEST(gsl_cdf_chisq_P, (1.0000000000000000e-03,1.3), 7.942296379590e-03, TEST_TOL6);
+ TEST(gsl_cdf_chisq_Pinv, (7.9422963795896199e-03,1.3), 1.000000000000e-03, TEST_TOL6);
+ TEST(gsl_cdf_chisq_P, (1.0000000000000000e-02,1.3), 3.541413902540e-02, TEST_TOL6);
+ TEST(gsl_cdf_chisq_Pinv, (3.5414139025402407e-02,1.3), 1.000000000000e-02, TEST_TOL6);
+ TEST(gsl_cdf_chisq_P, (1.0000000000000001e-01,1.3), 1.554268895840e-01, TEST_TOL6);
+ TEST(gsl_cdf_chisq_Pinv, (1.5542688958403586e-01,1.3), 1.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_chisq_P, (1.0000000000000000e+00,1.3), 5.878620132779e-01, TEST_TOL6);
+ TEST(gsl_cdf_chisq_Pinv, (5.8786201327788579e-01,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_chisq_P, (1.0000000000000000e+01,1.3), 9.973867890205e-01, TEST_TOL6);
+ TEST(gsl_cdf_chisq_Pinv, (9.9738678902053046e-01,1.3), 1.000000000000e+01, TEST_TOL6);
+ TEST(gsl_cdf_chisq_P, (1.0000000000000000e+02,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_chisq_P, (1.0000000000000000e+03,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_chisq_P, (1.0000000000000000e+04,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_chisq_P, (1.0000000000000000e+05,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_chisq_P, (1.0000000000000000e+06,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_chisq_P, (1.0000000000000000e+07,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_chisq_P, (1.0000000000000000e+08,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_chisq_P, (1.0000000000000000e+09,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_chisq_P, (1.0000000000000000e+10,1.3), 1.000000000000e+00, TEST_TOL6);
+
+ TEST(gsl_cdf_chisq_Q, (1.0000000000000000e+10,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_chisq_Q, (1.0000000000000000e+09,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_chisq_Q, (1.0000000000000000e+08,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_chisq_Q, (1.0000000000000000e+07,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_chisq_Q, (1.0000000000000000e+06,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_chisq_Q, (1.0000000000000000e+05,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_chisq_Q, (1.0000000000000000e+04,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_chisq_Q, (1.0000000000000000e+03,1.3), 5.840240518729e-219, TEST_TOL6);
+ TEST(gsl_cdf_chisq_Qinv, (5.8402405187288964e-219,1.3), 1.000000000000e+03, TEST_TOL6);
+ TEST(gsl_cdf_chisq_Q, (1.0000000000000000e+02,1.3), 3.517864771108e-23, TEST_TOL6);
+ TEST(gsl_cdf_chisq_Qinv, (3.5178647711076648e-23,1.3), 1.000000000000e+02, TEST_TOL6);
+ TEST(gsl_cdf_chisq_Q, (1.0000000000000000e+01,1.3), 2.613210979470e-03, TEST_TOL6);
+ TEST(gsl_cdf_chisq_Qinv, (2.6132109794696230e-03,1.3), 1.000000000000e+01, TEST_TOL6);
+ TEST(gsl_cdf_chisq_Q, (1.0000000000000000e+00,1.3), 4.121379867221e-01, TEST_TOL6);
+ TEST(gsl_cdf_chisq_Qinv, (4.1213798672211427e-01,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_chisq_Q, (1.0000000000000001e-01,1.3), 8.445731104160e-01, TEST_TOL6);
+ TEST(gsl_cdf_chisq_Qinv, (8.4457311041596417e-01,1.3), 1.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_chisq_Q, (1.0000000000000000e-02,1.3), 9.645858609746e-01, TEST_TOL6);
+ TEST(gsl_cdf_chisq_Qinv, (9.6458586097459775e-01,1.3), 1.000000000000e-02, TEST_TOL6);
+ TEST(gsl_cdf_chisq_Q, (1.0000000000000000e-03,1.3), 9.920577036204e-01, TEST_TOL6);
+ TEST(gsl_cdf_chisq_Qinv, (9.9205770362041057e-01,1.3), 1.000000000000e-03, TEST_TOL6);
+ TEST(gsl_cdf_chisq_Q, (1.0000000000000000e-04,1.3), 9.982216261112e-01, TEST_TOL6);
+ TEST(gsl_cdf_chisq_Qinv, (9.9822162611119969e-01,1.3), 1.000000000000e-04, TEST_TOL6);
+ TEST(gsl_cdf_chisq_Q, (1.0000000000000001e-05,1.3), 9.996018646205e-01, TEST_TOL6);
+ TEST(gsl_cdf_chisq_Qinv, (9.9960186462053913e-01,1.3), 1.000000000000e-05, TEST_TOL6);
+ TEST(gsl_cdf_chisq_Q, (9.9999999999999995e-07,1.3), 9.999108684330e-01, TEST_TOL6);
+ TEST(gsl_cdf_chisq_Q, (9.9999999999999995e-08,1.3), 9.999800459241e-01, TEST_TOL6);
+ TEST(gsl_cdf_chisq_Q, (1.0000000000000000e-08,1.3), 9.999955328388e-01, TEST_TOL6);
+ TEST(gsl_cdf_chisq_Q, (1.0000000000000001e-09,1.3), 9.999989999272e-01, TEST_TOL6);
+ TEST(gsl_cdf_chisq_Q, (1.0000000000000000e-10,1.3), 9.999997761116e-01, TEST_TOL6);
+ TEST(gsl_cdf_chisq_Q, (0.0000000000000000e+00,1.3), 1.000000000000e+00, TEST_TOL6);
+}
+
+void test_auto_tdist (void);
+
+void
+test_auto_tdist (void)
+{
+ TEST(gsl_cdf_tdist_P, (-1.0000000000000000e+10,1.3), 3.467848111850e-14, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Pinv, (3.4678481118500305e-14,1.3), -1.000000000000e+10, TEST_TOL6);
+ TEST(gsl_cdf_tdist_P, (-1.0000000000000000e+09,1.3), 6.919266651610e-13, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Pinv, (6.9192666516103524e-13,1.3), -1.000000000000e+09, TEST_TOL6);
+ TEST(gsl_cdf_tdist_P, (-1.0000000000000000e+08,1.3), 1.380575199718e-11, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Pinv, (1.3805751997179027e-11,1.3), -1.000000000000e+08, TEST_TOL6);
+ TEST(gsl_cdf_tdist_P, (-1.0000000000000000e+07,1.3), 2.754609668978e-10, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Pinv, (2.7546096689777484e-10,1.3), -1.000000000000e+07, TEST_TOL6);
+ TEST(gsl_cdf_tdist_P, (-1.0000000000000000e+06,1.3), 5.496168864957e-09, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Pinv, (5.4961688649569980e-09,1.3), -1.000000000000e+06, TEST_TOL6);
+ TEST(gsl_cdf_tdist_P, (-1.0000000000000000e+05,1.3), 1.096629861231e-07, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Pinv, (1.0966298612314582e-07,1.3), -1.000000000000e+05, TEST_TOL6);
+ TEST(gsl_cdf_tdist_P, (-1.0000000000000000e+04,1.3), 2.188064222827e-06, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Pinv, (2.1880642228271703e-06,1.3), -1.000000000000e+04, TEST_TOL6);
+ TEST(gsl_cdf_tdist_P, (-1.0000000000000000e+03,1.3), 4.365759541083e-05, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Pinv, (4.3657595410833571e-05,1.3), -1.000000000000e+03, TEST_TOL6);
+ TEST(gsl_cdf_tdist_P, (-1.0000000000000000e+02,1.3), 8.710327647608e-04, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Pinv, (8.7103276476079201e-04,1.3), -1.000000000000e+02, TEST_TOL6);
+ TEST(gsl_cdf_tdist_P, (-1.0000000000000000e+01,1.3), 1.727893386820e-02, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Pinv, (1.7278933868204446e-02,1.3), -1.000000000000e+01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_P, (-1.0000000000000000e+00,1.3), 2.336211937932e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Pinv, (2.3362119379322516e-01,1.3), -1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_tdist_P, (-1.0000000000000001e-01,1.3), 4.667575980083e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Pinv, (4.6675759800826139e-01,1.3), -1.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_P, (-1.0000000000000000e-02,1.3), 4.966660755117e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Pinv, (4.9666607551169606e-01,1.3), -1.000000000000e-02, TEST_TOL6);
+ TEST(gsl_cdf_tdist_P, (-1.0000000000000000e-03,1.3), 4.996665978189e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Pinv, (4.9966659781887629e-01,1.3), -1.000000000000e-03, TEST_TOL6);
+ TEST(gsl_cdf_tdist_P, (-1.0000000000000000e-04,1.3), 4.999666597722e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_P, (-1.0000000000000001e-05,1.3), 4.999966659772e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_P, (-9.9999999999999995e-07,1.3), 4.999996665977e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_P, (-9.9999999999999995e-08,1.3), 4.999999666598e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_P, (-1.0000000000000000e-08,1.3), 4.999999966660e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_P, (-1.0000000000000001e-09,1.3), 4.999999996666e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_P, (-1.0000000000000000e-10,1.3), 4.999999999667e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_P, (0.0000000000000000e+00,1.3), 5.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Pinv, (4.9999999999999900e-01,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_tdist_P, (1.0000000000000000e-10,1.3), 5.000000000333e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_P, (1.0000000000000001e-09,1.3), 5.000000003334e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_P, (1.0000000000000000e-08,1.3), 5.000000033340e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_P, (9.9999999999999995e-08,1.3), 5.000000333402e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_P, (9.9999999999999995e-07,1.3), 5.000003334023e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_P, (1.0000000000000001e-05,1.3), 5.000033340228e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_P, (1.0000000000000000e-04,1.3), 5.000333402278e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_P, (1.0000000000000000e-03,1.3), 5.003334021811e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Pinv, (5.0033340218112365e-01,1.3), 1.000000000000e-03, TEST_TOL6);
+ TEST(gsl_cdf_tdist_P, (1.0000000000000000e-02,1.3), 5.033339244883e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Pinv, (5.0333392448830394e-01,1.3), 1.000000000000e-02, TEST_TOL6);
+ TEST(gsl_cdf_tdist_P, (1.0000000000000001e-01,1.3), 5.332424019917e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Pinv, (5.3324240199173856e-01,1.3), 1.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_P, (1.0000000000000000e+00,1.3), 7.663788062068e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Pinv, (7.6637880620677490e-01,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_tdist_P, (1.0000000000000000e+01,1.3), 9.827210661318e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Pinv, (9.8272106613179555e-01,1.3), 1.000000000000e+01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_P, (1.0000000000000000e+02,1.3), 9.991289672352e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Pinv, (9.9912896723523925e-01,1.3), 1.000000000000e+02, TEST_TOL6);
+ TEST(gsl_cdf_tdist_P, (1.0000000000000000e+03,1.3), 9.999563424046e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_P, (1.0000000000000000e+04,1.3), 9.999978119358e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_P, (1.0000000000000000e+05,1.3), 9.999998903370e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_P, (1.0000000000000000e+06,1.3), 9.999999945038e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_P, (1.0000000000000000e+07,1.3), 9.999999997245e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_P, (1.0000000000000000e+08,1.3), 9.999999999862e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_P, (1.0000000000000000e+09,1.3), 9.999999999993e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_P, (1.0000000000000000e+10,1.3), 1.000000000000e-00, TEST_TOL6);
+
+ TEST(gsl_cdf_tdist_Q, (1.0000000000000000e+10,1.3), 3.467848111850e-14, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Qinv, (3.4678481118500305e-14,1.3), 1.000000000000e+10, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Q, (1.0000000000000000e+09,1.3), 6.919266651610e-13, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Qinv, (6.9192666516103524e-13,1.3), 1.000000000000e+09, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Q, (1.0000000000000000e+08,1.3), 1.380575199718e-11, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Qinv, (1.3805751997179027e-11,1.3), 1.000000000000e+08, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Q, (1.0000000000000000e+07,1.3), 2.754609668978e-10, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Qinv, (2.7546096689777484e-10,1.3), 1.000000000000e+07, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Q, (1.0000000000000000e+06,1.3), 5.496168864957e-09, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Qinv, (5.4961688649569980e-09,1.3), 1.000000000000e+06, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Q, (1.0000000000000000e+05,1.3), 1.096629861231e-07, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Qinv, (1.0966298612314582e-07,1.3), 1.000000000000e+05, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Q, (1.0000000000000000e+04,1.3), 2.188064222827e-06, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Qinv, (2.1880642228271703e-06,1.3), 1.000000000000e+04, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Q, (1.0000000000000000e+03,1.3), 4.365759541083e-05, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Qinv, (4.3657595410833571e-05,1.3), 1.000000000000e+03, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Q, (1.0000000000000000e+02,1.3), 8.710327647608e-04, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Qinv, (8.7103276476079201e-04,1.3), 1.000000000000e+02, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Q, (1.0000000000000000e+01,1.3), 1.727893386820e-02, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Qinv, (1.7278933868204446e-02,1.3), 1.000000000000e+01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Q, (1.0000000000000000e+00,1.3), 2.336211937932e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Qinv, (2.3362119379322516e-01,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Q, (1.0000000000000001e-01,1.3), 4.667575980083e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Qinv, (4.6675759800826139e-01,1.3), 1.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Q, (1.0000000000000000e-02,1.3), 4.966660755117e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Qinv, (4.9666607551169606e-01,1.3), 1.000000000000e-02, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Q, (1.0000000000000000e-03,1.3), 4.996665978189e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Qinv, (4.9966659781887629e-01,1.3), 1.000000000000e-03, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Q, (1.0000000000000000e-04,1.3), 4.999666597722e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Q, (1.0000000000000001e-05,1.3), 4.999966659772e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Q, (9.9999999999999995e-07,1.3), 4.999996665977e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Q, (9.9999999999999995e-08,1.3), 4.999999666598e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Q, (1.0000000000000000e-08,1.3), 4.999999966660e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Q, (1.0000000000000001e-09,1.3), 4.999999996666e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Q, (1.0000000000000000e-10,1.3), 4.999999999667e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Q, (0.0000000000000000e+00,1.3), 5.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Qinv, (4.9999999999999900e-01,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Q, (-1.0000000000000000e-10,1.3), 5.000000000333e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Q, (-1.0000000000000001e-09,1.3), 5.000000003334e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Q, (-1.0000000000000000e-08,1.3), 5.000000033340e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Q, (-9.9999999999999995e-08,1.3), 5.000000333402e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Q, (-9.9999999999999995e-07,1.3), 5.000003334023e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Q, (-1.0000000000000001e-05,1.3), 5.000033340228e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Q, (-1.0000000000000000e-04,1.3), 5.000333402278e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Q, (-1.0000000000000000e-03,1.3), 5.003334021811e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Qinv, (5.0033340218112365e-01,1.3), -1.000000000000e-03, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Q, (-1.0000000000000000e-02,1.3), 5.033339244883e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Qinv, (5.0333392448830394e-01,1.3), -1.000000000000e-02, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Q, (-1.0000000000000001e-01,1.3), 5.332424019917e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Qinv, (5.3324240199173856e-01,1.3), -1.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Q, (-1.0000000000000000e+00,1.3), 7.663788062068e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Qinv, (7.6637880620677490e-01,1.3), -1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Q, (-1.0000000000000000e+01,1.3), 9.827210661318e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Qinv, (9.8272106613179555e-01,1.3), -1.000000000000e+01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Q, (-1.0000000000000000e+02,1.3), 9.991289672352e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Qinv, (9.9912896723523925e-01,1.3), -1.000000000000e+02, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Q, (-1.0000000000000000e+03,1.3), 9.999563424046e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Q, (-1.0000000000000000e+04,1.3), 9.999978119358e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Q, (-1.0000000000000000e+05,1.3), 9.999998903370e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Q, (-1.0000000000000000e+06,1.3), 9.999999945038e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Q, (-1.0000000000000000e+07,1.3), 9.999999997245e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Q, (-1.0000000000000000e+08,1.3), 9.999999999862e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Q, (-1.0000000000000000e+09,1.3), 9.999999999993e-01, TEST_TOL6);
+ TEST(gsl_cdf_tdist_Q, (-1.0000000000000000e+10,1.3), 1.000000000000e-00, TEST_TOL6);
+}
+
+void test_auto_gumbel1 (void);
+
+void
+test_auto_gumbel1 (void)
+{
+ TEST(gsl_cdf_gumbel1_P, (-1.0000000000000000e+10,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_P, (-1.0000000000000000e+09,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_P, (-1.0000000000000000e+08,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_P, (-1.0000000000000000e+07,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_P, (-1.0000000000000000e+06,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_P, (-1.0000000000000000e+05,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_P, (-1.0000000000000000e+04,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_P, (-1.0000000000000000e+03,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_P, (-1.0000000000000000e+02,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_P, (-1.0000000000000000e+01,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_P, (-1.0000000000000000e+00,1.3,2.7), 4.981965353092e-05, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Pinv, (4.9819653530918237e-05,1.3,2.7), -1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_P, (-1.0000000000000001e-01,1.3,2.7), 4.619717476780e-02, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Pinv, (4.6197174767798083e-02,1.3,2.7), -1.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_P, (-1.0000000000000000e-02,1.3,2.7), 6.487265128366e-02, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Pinv, (6.4872651283663055e-02,1.3,2.7), -1.000000000000e-02, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_P, (-1.0000000000000000e-03,1.3,2.7), 6.696988203722e-02, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Pinv, (6.6969882037217598e-02,1.3,2.7), -1.000000000000e-03, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_P, (-1.0000000000000000e-04,1.3,2.7), 6.718192621136e-02, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Pinv, (6.7181926211364873e-02,1.3,2.7), -1.000000000000e-04, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_P, (-1.0000000000000001e-05,1.3,2.7), 6.720315385232e-02, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_P, (-9.9999999999999995e-07,1.3,2.7), 6.720527684866e-02, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_P, (-9.9999999999999995e-08,1.3,2.7), 6.720548915062e-02, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_P, (-1.0000000000000000e-08,1.3,2.7), 6.720551038084e-02, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_P, (-1.0000000000000001e-09,1.3,2.7), 6.720551250386e-02, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_P, (-1.0000000000000000e-10,1.3,2.7), 6.720551271616e-02, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_P, (0.0000000000000000e+00,1.3,2.7), 6.720551273975e-02, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Pinv, (6.7205512739749951e-02,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_P, (1.0000000000000000e-10,1.3,2.7), 6.720551276334e-02, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_P, (1.0000000000000001e-09,1.3,2.7), 6.720551297564e-02, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_P, (1.0000000000000000e-08,1.3,2.7), 6.720551509866e-02, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_P, (9.9999999999999995e-08,1.3,2.7), 6.720553632889e-02, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_P, (9.9999999999999995e-07,1.3,2.7), 6.720574863136e-02, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_P, (1.0000000000000001e-05,1.3,2.7), 6.720787167931e-02, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_P, (1.0000000000000000e-04,1.3,2.7), 6.722910448133e-02, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Pinv, (6.7229104481333457e-02,1.3,2.7), 1.000000000000e-04, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_P, (1.0000000000000000e-03,1.3,2.7), 6.744166476190e-02, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Pinv, (6.7441664761898834e-02,1.3,2.7), 1.000000000000e-03, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_P, (1.0000000000000000e-02,1.3,2.7), 6.959050352518e-02, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Pinv, (6.9590503525179814e-02,1.3,2.7), 1.000000000000e-02, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_P, (1.0000000000000001e-01,1.3,2.7), 9.340058564429e-02, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Pinv, (9.3400585644290435e-02,1.3,2.7), 1.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_P, (1.0000000000000000e+00,1.3,2.7), 4.791048360125e-01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Pinv, (4.7910483601248477e-01,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_P, (1.0000000000000000e+01,1.3,2.7), 9.999938971292e-01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_P, (1.0000000000000000e+02,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_P, (1.0000000000000000e+03,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_P, (1.0000000000000000e+04,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_P, (1.0000000000000000e+05,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_P, (1.0000000000000000e+06,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_P, (1.0000000000000000e+07,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_P, (1.0000000000000000e+08,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_P, (1.0000000000000000e+09,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_P, (1.0000000000000000e+10,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+
+ TEST(gsl_cdf_gumbel1_Q, (1.0000000000000000e+10,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Q, (1.0000000000000000e+09,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Q, (1.0000000000000000e+08,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Q, (1.0000000000000000e+07,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Q, (1.0000000000000000e+06,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Q, (1.0000000000000000e+05,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Q, (1.0000000000000000e+04,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Q, (1.0000000000000000e+03,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Q, (1.0000000000000000e+02,1.3,2.7), 9.398988467742e-57, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Qinv, (9.3989884677416057e-57,1.3,2.7), 1.000000000000e+02, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Q, (1.0000000000000000e+01,1.3,2.7), 6.102870776257e-06, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Qinv, (6.1028707762572197e-06,1.3,2.7), 1.000000000000e+01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Q, (1.0000000000000000e+00,1.3,2.7), 5.208951639875e-01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Qinv, (5.2089516398751523e-01,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Q, (1.0000000000000001e-01,1.3,2.7), 9.065994143557e-01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Qinv, (9.0659941435570957e-01,1.3,2.7), 1.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Q, (1.0000000000000000e-02,1.3,2.7), 9.304094964748e-01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Qinv, (9.3040949647482019e-01,1.3,2.7), 1.000000000000e-02, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Q, (1.0000000000000000e-03,1.3,2.7), 9.325583352381e-01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Qinv, (9.3255833523810117e-01,1.3,2.7), 1.000000000000e-03, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Q, (1.0000000000000000e-04,1.3,2.7), 9.327708955187e-01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Q, (1.0000000000000001e-05,1.3,2.7), 9.327921283207e-01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Q, (9.9999999999999995e-07,1.3,2.7), 9.327942513686e-01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Q, (9.9999999999999995e-08,1.3,2.7), 9.327944636711e-01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Q, (1.0000000000000000e-08,1.3,2.7), 9.327944849013e-01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Q, (1.0000000000000001e-09,1.3,2.7), 9.327944870244e-01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Q, (1.0000000000000000e-10,1.3,2.7), 9.327944872367e-01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Q, (0.0000000000000000e+00,1.3,2.7), 9.327944872603e-01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Qinv, (9.3279448726025027e-01,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Q, (-1.0000000000000000e-10,1.3,2.7), 9.327944872838e-01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Q, (-1.0000000000000001e-09,1.3,2.7), 9.327944874961e-01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Q, (-1.0000000000000000e-08,1.3,2.7), 9.327944896192e-01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Q, (-9.9999999999999995e-08,1.3,2.7), 9.327945108494e-01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Q, (-9.9999999999999995e-07,1.3,2.7), 9.327947231513e-01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Q, (-1.0000000000000001e-05,1.3,2.7), 9.327968461477e-01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Q, (-1.0000000000000000e-04,1.3,2.7), 9.328180737886e-01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Q, (-1.0000000000000000e-03,1.3,2.7), 9.330301179628e-01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Qinv, (9.3303011796278246e-01,1.3,2.7), -1.000000000000e-03, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Q, (-1.0000000000000000e-02,1.3,2.7), 9.351273487163e-01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Qinv, (9.3512734871633696e-01,1.3,2.7), -1.000000000000e-02, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Q, (-1.0000000000000001e-01,1.3,2.7), 9.538028252322e-01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Qinv, (9.5380282523220195e-01,1.3,2.7), -1.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Q, (-1.0000000000000000e+00,1.3,2.7), 9.999501803465e-01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Qinv, (9.9995018034646910e-01,1.3,2.7), -1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Q, (-1.0000000000000000e+01,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Q, (-1.0000000000000000e+02,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Q, (-1.0000000000000000e+03,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Q, (-1.0000000000000000e+04,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Q, (-1.0000000000000000e+05,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Q, (-1.0000000000000000e+06,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Q, (-1.0000000000000000e+07,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Q, (-1.0000000000000000e+08,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Q, (-1.0000000000000000e+09,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel1_Q, (-1.0000000000000000e+10,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+}
+
+void test_auto_gumbel2 (void);
+
+void
+test_auto_gumbel2 (void)
+{
+ TEST(gsl_cdf_gumbel2_P, (0.0000000000000000e+00,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_P, (1.0000000000000000e-10,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_P, (1.0000000000000001e-09,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_P, (1.0000000000000000e-08,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_P, (9.9999999999999995e-08,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_P, (9.9999999999999995e-07,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_P, (1.0000000000000001e-05,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_P, (1.0000000000000000e-04,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_P, (1.0000000000000000e-03,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_P, (1.0000000000000000e-02,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_P, (1.0000000000000001e-01,1.3,2.7), 4.014688368993e-24, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_Pinv, (4.0146883689934746e-24,1.3,2.7), 1.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_P, (1.0000000000000000e+00,1.3,2.7), 6.720551273975e-02, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_Pinv, (6.7205512739749743e-02,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_P, (1.0000000000000000e+01,1.3,2.7), 8.734358842463e-01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_Pinv, (8.7343588424628138e-01,1.3,2.7), 1.000000000000e+01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_P, (1.0000000000000000e+02,1.3,2.7), 9.932408531257e-01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_Pinv, (9.9324085312574451e-01,1.3,2.7), 1.000000000000e+02, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_P, (1.0000000000000000e+03,1.3,2.7), 9.996601479016e-01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_Pinv, (9.9966014790162783e-01,1.3,2.7), 1.000000000000e+03, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_P, (1.0000000000000000e+04,1.3,2.7), 9.999829642968e-01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_P, (1.0000000000000000e+05,1.3,2.7), 9.999991461854e-01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_P, (1.0000000000000000e+06,1.3,2.7), 9.999999572079e-01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_P, (1.0000000000000000e+07,1.3,2.7), 9.999999978553e-01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_P, (1.0000000000000000e+08,1.3,2.7), 9.999999998925e-01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_P, (1.0000000000000000e+09,1.3,2.7), 9.999999999946e-01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_P, (1.0000000000000000e+10,1.3,2.7), 9.999999999997e-01, TEST_TOL6);
+
+ TEST(gsl_cdf_gumbel2_Q, (1.0000000000000000e+10,1.3,2.7), 2.700000000000e-13, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_Qinv, (2.6999999999996492e-13,1.3,2.7), 1.000000000000e+10, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_Q, (1.0000000000000000e+09,1.3,2.7), 5.387208250401e-12, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_Qinv, (5.3872082504014914e-12,1.3,2.7), 1.000000000000e+09, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_Q, (1.0000000000000000e+08,1.3,2.7), 1.074889360437e-10, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_Qinv, (1.0748893604366781e-10,1.3,2.7), 1.000000000000e+08, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_Q, (1.0000000000000000e+07,1.3,2.7), 2.144686231456e-09, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_Qinv, (2.1446862314557286e-09,1.3,2.7), 1.000000000000e+07, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_Q, (1.0000000000000000e+06,1.3,2.7), 4.279211528087e-08, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_Qinv, (4.2792115280867646e-08,1.3,2.7), 1.000000000000e+06, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_Q, (1.0000000000000000e+05,1.3,2.7), 8.538146037456e-07, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_Qinv, (8.5381460374556900e-07,1.3,2.7), 1.000000000000e+05, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_Q, (1.0000000000000000e+04,1.3,2.7), 1.703570319173e-05, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_Qinv, (1.7035703191725618e-05,1.3,2.7), 1.000000000000e+04, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_Q, (1.0000000000000000e+03,1.3,2.7), 3.398520983725e-04, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_Qinv, (3.3985209837246249e-04,1.3,2.7), 1.000000000000e+03, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_Q, (1.0000000000000000e+02,1.3,2.7), 6.759146874256e-03, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_Qinv, (6.7591468742558315e-03,1.3,2.7), 1.000000000000e+02, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_Q, (1.0000000000000000e+01,1.3,2.7), 1.265641157537e-01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_Qinv, (1.2656411575371904e-01,1.3,2.7), 1.000000000000e+01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_Q, (1.0000000000000000e+00,1.3,2.7), 9.327944872603e-01, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_Qinv, (9.3279448726025116e-01,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_Q, (1.0000000000000001e-01,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_Q, (1.0000000000000000e-02,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_Q, (1.0000000000000000e-03,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_Q, (1.0000000000000000e-04,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_Q, (1.0000000000000001e-05,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_Q, (9.9999999999999995e-07,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_Q, (9.9999999999999995e-08,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_Q, (1.0000000000000000e-08,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_Q, (1.0000000000000001e-09,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_Q, (1.0000000000000000e-10,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gumbel2_Q, (0.0000000000000000e+00,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+}
+
+void test_auto_weibull (void);
+
+void
+test_auto_weibull (void)
+{
+ TEST(gsl_cdf_weibull_P, (0.0000000000000000e+00,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_weibull_P, (1.0000000000000000e-10,1.3,2.7), 4.924395760785e-28, TEST_TOL6);
+ TEST(gsl_cdf_weibull_Pinv, (4.9243957607852698e-28,1.3,2.7), 1.000000000000e-10, TEST_TOL6);
+ TEST(gsl_cdf_weibull_P, (1.0000000000000001e-09,1.3,2.7), 2.468044288634e-25, TEST_TOL6);
+ TEST(gsl_cdf_weibull_Pinv, (2.4680442886338381e-25,1.3,2.7), 1.000000000000e-09, TEST_TOL6);
+ TEST(gsl_cdf_weibull_P, (1.0000000000000000e-08,1.3,2.7), 1.236952289490e-22, TEST_TOL6);
+ TEST(gsl_cdf_weibull_Pinv, (1.2369522894899823e-22,1.3,2.7), 1.000000000000e-08, TEST_TOL6);
+ TEST(gsl_cdf_weibull_P, (9.9999999999999995e-08,1.3,2.7), 6.199446960984e-20, TEST_TOL6);
+ TEST(gsl_cdf_weibull_Pinv, (6.1994469609840516e-20,1.3,2.7), 1.000000000000e-07, TEST_TOL6);
+ TEST(gsl_cdf_weibull_P, (9.9999999999999995e-07,1.3,2.7), 3.107083672395e-17, TEST_TOL6);
+ TEST(gsl_cdf_weibull_Pinv, (3.1070836723945982e-17,1.3,2.7), 1.000000000000e-06, TEST_TOL6);
+ TEST(gsl_cdf_weibull_P, (1.0000000000000001e-05,1.3,2.7), 1.557230670416e-14, TEST_TOL6);
+ TEST(gsl_cdf_weibull_Pinv, (1.5572306704159031e-14,1.3,2.7), 1.000000000000e-05, TEST_TOL6);
+ TEST(gsl_cdf_weibull_P, (1.0000000000000000e-04,1.3,2.7), 7.804641318223e-12, TEST_TOL6);
+ TEST(gsl_cdf_weibull_Pinv, (7.8046413182225018e-12,1.3,2.7), 1.000000000000e-04, TEST_TOL6);
+ TEST(gsl_cdf_weibull_P, (1.0000000000000000e-03,1.3,2.7), 3.911586584098e-09, TEST_TOL6);
+ TEST(gsl_cdf_weibull_Pinv, (3.9115865840980536e-09,1.3,2.7), 1.000000000000e-03, TEST_TOL6);
+ TEST(gsl_cdf_weibull_P, (1.0000000000000000e-02,1.3,2.7), 1.960435341356e-06, TEST_TOL6);
+ TEST(gsl_cdf_weibull_Pinv, (1.9604353413559907e-06,1.3,2.7), 1.000000000000e-02, TEST_TOL6);
+ TEST(gsl_cdf_weibull_P, (1.0000000000000001e-01,1.3,2.7), 9.820635881537e-04, TEST_TOL6);
+ TEST(gsl_cdf_weibull_Pinv, (9.8206358815371392e-04,1.3,2.7), 1.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_weibull_P, (1.0000000000000000e+00,1.3,2.7), 3.888663329609e-01, TEST_TOL6);
+ TEST(gsl_cdf_weibull_Pinv, (3.8886633296085954e-01,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_weibull_P, (1.0000000000000000e+01,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_weibull_P, (1.0000000000000000e+02,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_weibull_P, (1.0000000000000000e+03,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_weibull_P, (1.0000000000000000e+04,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_weibull_P, (1.0000000000000000e+05,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_weibull_P, (1.0000000000000000e+06,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_weibull_P, (1.0000000000000000e+07,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_weibull_P, (1.0000000000000000e+08,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_weibull_P, (1.0000000000000000e+09,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_weibull_P, (1.0000000000000000e+10,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+
+ TEST(gsl_cdf_weibull_Q, (1.0000000000000000e+10,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_weibull_Q, (1.0000000000000000e+09,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_weibull_Q, (1.0000000000000000e+08,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_weibull_Q, (1.0000000000000000e+07,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_weibull_Q, (1.0000000000000000e+06,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_weibull_Q, (1.0000000000000000e+05,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_weibull_Q, (1.0000000000000000e+04,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_weibull_Q, (1.0000000000000000e+03,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_weibull_Q, (1.0000000000000000e+02,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_weibull_Q, (1.0000000000000000e+01,1.3,2.7), 6.519262004070e-108, TEST_TOL6);
+ TEST(gsl_cdf_weibull_Qinv, (6.5192620040698617e-108,1.3,2.7), 1.000000000000e+01, TEST_TOL6);
+ TEST(gsl_cdf_weibull_Q, (1.0000000000000000e+00,1.3,2.7), 6.111336670391e-01, TEST_TOL6);
+ TEST(gsl_cdf_weibull_Qinv, (6.1113366703914040e-01,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_weibull_Q, (1.0000000000000001e-01,1.3,2.7), 9.990179364118e-01, TEST_TOL6);
+ TEST(gsl_cdf_weibull_Qinv, (9.9901793641184633e-01,1.3,2.7), 1.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_weibull_Q, (1.0000000000000000e-02,1.3,2.7), 9.999980395647e-01, TEST_TOL6);
+ TEST(gsl_cdf_weibull_Q, (1.0000000000000000e-03,1.3,2.7), 9.999999960884e-01, TEST_TOL6);
+ TEST(gsl_cdf_weibull_Q, (1.0000000000000000e-04,1.3,2.7), 9.999999999922e-01, TEST_TOL6);
+ TEST(gsl_cdf_weibull_Q, (1.0000000000000001e-05,1.3,2.7), 1.000000000000e-00, TEST_TOL6);
+ TEST(gsl_cdf_weibull_Q, (9.9999999999999995e-07,1.3,2.7), 1.000000000000e-00, TEST_TOL6);
+ TEST(gsl_cdf_weibull_Q, (9.9999999999999995e-08,1.3,2.7), 1.000000000000e-00, TEST_TOL6);
+ TEST(gsl_cdf_weibull_Q, (1.0000000000000000e-08,1.3,2.7), 1.000000000000e-00, TEST_TOL6);
+ TEST(gsl_cdf_weibull_Q, (1.0000000000000001e-09,1.3,2.7), 1.000000000000e-00, TEST_TOL6);
+ TEST(gsl_cdf_weibull_Q, (1.0000000000000000e-10,1.3,2.7), 1.000000000000e-00, TEST_TOL6);
+ TEST(gsl_cdf_weibull_Q, (0.0000000000000000e+00,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+}
+
+void test_auto_pareto (void);
+
+void
+test_auto_pareto (void)
+{
+ TEST(gsl_cdf_pareto_P, (0.0000000000000000e+00,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_pareto_P, (1.0000000000000000e-10,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_pareto_P, (1.0000000000000001e-09,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_pareto_P, (1.0000000000000000e-08,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_pareto_P, (9.9999999999999995e-08,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_pareto_P, (9.9999999999999995e-07,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_pareto_P, (1.0000000000000001e-05,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_pareto_P, (1.0000000000000000e-04,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_pareto_P, (1.0000000000000000e-03,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_pareto_P, (1.0000000000000000e-02,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_pareto_P, (1.0000000000000001e-01,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_pareto_P, (1.0000000000000000e+00,1.3,2.7), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_pareto_P, (1.0000000000000000e+01,1.3,2.7), 8.177057822240e-01, TEST_TOL6);
+ TEST(gsl_cdf_pareto_Pinv, (8.1770578222395374e-01,1.3,2.7), 1.000000000000e+01, TEST_TOL6);
+ TEST(gsl_cdf_pareto_P, (1.0000000000000000e+02,1.3,2.7), 9.908636465287e-01, TEST_TOL6);
+ TEST(gsl_cdf_pareto_Pinv, (9.9086364652869807e-01,1.3,2.7), 1.000000000000e+02, TEST_TOL6);
+ TEST(gsl_cdf_pareto_P, (1.0000000000000000e+03,1.3,2.7), 9.995420976279e-01, TEST_TOL6);
+ TEST(gsl_cdf_pareto_Pinv, (9.9954209762786816e-01,1.3,2.7), 1.000000000000e+03, TEST_TOL6);
+ TEST(gsl_cdf_pareto_P, (1.0000000000000000e+04,1.3,2.7), 9.999770505177e-01, TEST_TOL6);
+ TEST(gsl_cdf_pareto_P, (1.0000000000000000e+05,1.3,2.7), 9.999988498013e-01, TEST_TOL6);
+ TEST(gsl_cdf_pareto_P, (1.0000000000000000e+06,1.3,2.7), 9.999999423535e-01, TEST_TOL6);
+ TEST(gsl_cdf_pareto_P, (1.0000000000000000e+07,1.3,2.7), 9.999999971109e-01, TEST_TOL6);
+ TEST(gsl_cdf_pareto_P, (1.0000000000000000e+08,1.3,2.7), 9.999999998552e-01, TEST_TOL6);
+ TEST(gsl_cdf_pareto_P, (1.0000000000000000e+09,1.3,2.7), 9.999999999928e-01, TEST_TOL6);
+ TEST(gsl_cdf_pareto_P, (1.0000000000000000e+10,1.3,2.7), 9.999999999997e-01, TEST_TOL6);
+
+ TEST(gsl_cdf_pareto_Q, (1.0000000000000000e+10,1.3,2.7), 3.637247829654e-13, TEST_TOL6);
+ TEST(gsl_cdf_pareto_Qinv, (3.6372478296536173e-13,1.3,2.7), 1.000000000000e+10, TEST_TOL6);
+ TEST(gsl_cdf_pareto_Q, (1.0000000000000000e+09,1.3,2.7), 7.257263524710e-12, TEST_TOL6);
+ TEST(gsl_cdf_pareto_Qinv, (7.2572635247102111e-12,1.3,2.7), 1.000000000000e+09, TEST_TOL6);
+ TEST(gsl_cdf_pareto_Q, (1.0000000000000000e+08,1.3,2.7), 1.448014442065e-10, TEST_TOL6);
+ TEST(gsl_cdf_pareto_Qinv, (1.4480144420652496e-10,1.3,2.7), 1.000000000000e+08, TEST_TOL6);
+ TEST(gsl_cdf_pareto_Q, (1.0000000000000000e+07,1.3,2.7), 2.889168647783e-09, TEST_TOL6);
+ TEST(gsl_cdf_pareto_Qinv, (2.8891686477834784e-09,1.3,2.7), 1.000000000000e+07, TEST_TOL6);
+ TEST(gsl_cdf_pareto_Q, (1.0000000000000000e+06,1.3,2.7), 5.764649324512e-08, TEST_TOL6);
+ TEST(gsl_cdf_pareto_Qinv, (5.7646493245119715e-08,1.3,2.7), 1.000000000000e+06, TEST_TOL6);
+ TEST(gsl_cdf_pareto_Q, (1.0000000000000000e+05,1.3,2.7), 1.150198755621e-06, TEST_TOL6);
+ TEST(gsl_cdf_pareto_Qinv, (1.1501987556209536e-06,1.3,2.7), 1.000000000000e+05, TEST_TOL6);
+ TEST(gsl_cdf_pareto_Q, (1.0000000000000000e+04,1.3,2.7), 2.294948231815e-05, TEST_TOL6);
+ TEST(gsl_cdf_pareto_Qinv, (2.2949482318145872e-05,1.3,2.7), 1.000000000000e+04, TEST_TOL6);
+ TEST(gsl_cdf_pareto_Q, (1.0000000000000000e+03,1.3,2.7), 4.579023721744e-04, TEST_TOL6);
+ TEST(gsl_cdf_pareto_Qinv, (4.5790237217441070e-04,1.3,2.7), 1.000000000000e+03, TEST_TOL6);
+ TEST(gsl_cdf_pareto_Q, (1.0000000000000000e+02,1.3,2.7), 9.136353471345e-03, TEST_TOL6);
+ TEST(gsl_cdf_pareto_Qinv, (9.1363534713445622e-03,1.3,2.7), 1.000000000000e+02, TEST_TOL6);
+ TEST(gsl_cdf_pareto_Q, (1.0000000000000000e+01,1.3,2.7), 1.822942177761e-01, TEST_TOL6);
+ TEST(gsl_cdf_pareto_Qinv, (1.8229421777608898e-01,1.3,2.7), 1.000000000000e+01, TEST_TOL6);
+ TEST(gsl_cdf_pareto_Q, (1.0000000000000000e+00,1.3,2.7), 1.000000000000e-00, TEST_TOL6);
+ TEST(gsl_cdf_pareto_Q, (1.0000000000000001e-01,1.3,2.7), 1.000000000000e-00, TEST_TOL6);
+ TEST(gsl_cdf_pareto_Q, (1.0000000000000000e-02,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_pareto_Q, (1.0000000000000000e-03,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_pareto_Q, (1.0000000000000000e-04,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_pareto_Q, (1.0000000000000001e-05,1.3,2.7), 1.000000000000e-00, TEST_TOL6);
+ TEST(gsl_cdf_pareto_Q, (9.9999999999999995e-07,1.3,2.7), 1.000000000000e-00, TEST_TOL6);
+ TEST(gsl_cdf_pareto_Q, (9.9999999999999995e-08,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_pareto_Q, (1.0000000000000000e-08,1.3,2.7), 1.000000000000e-00, TEST_TOL6);
+ TEST(gsl_cdf_pareto_Q, (1.0000000000000001e-09,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_pareto_Q, (1.0000000000000000e-10,1.3,2.7), 1.000000000000e-00, TEST_TOL6);
+ TEST(gsl_cdf_pareto_Q, (0.0000000000000000e+00,1.3,2.7), 1.000000000000e+00, TEST_TOL6);
+}
+
+void test_auto_logistic (void);
+
+void
+test_auto_logistic (void)
+{
+ TEST(gsl_cdf_logistic_P, (-1.0000000000000000e+10,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_logistic_P, (-1.0000000000000000e+09,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_logistic_P, (-1.0000000000000000e+08,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_logistic_P, (-1.0000000000000000e+07,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_logistic_P, (-1.0000000000000000e+06,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_logistic_P, (-1.0000000000000000e+05,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_logistic_P, (-1.0000000000000000e+04,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_logistic_P, (-1.0000000000000000e+03,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_logistic_P, (-1.0000000000000000e+02,1.3), 3.915003559824e-34, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Pinv, (3.9150035598244656e-34,1.3), -1.000000000000e+02, TEST_TOL6);
+ TEST(gsl_cdf_logistic_P, (-1.0000000000000000e+01,1.3), 4.561157640565e-04, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Pinv, (4.5611576405646045e-04,1.3), -1.000000000000e+01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_P, (-1.0000000000000000e+00,1.3), 3.166455298122e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Pinv, (3.1664552981221700e-01,1.3), -1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_logistic_P, (-1.0000000000000001e-01,1.3), 4.807787077894e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Pinv, (4.8077870778939180e-01,1.3), -1.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_P, (-1.0000000000000000e-02,1.3), 4.980769325595e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Pinv, (4.9807693255949481e-01,1.3), -1.000000000000e-02, TEST_TOL6);
+ TEST(gsl_cdf_logistic_P, (-1.0000000000000000e-03,1.3), 4.998076923172e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Pinv, (4.9980769231717492e-01,1.3), -1.000000000000e-03, TEST_TOL6);
+ TEST(gsl_cdf_logistic_P, (-1.0000000000000000e-04,1.3), 4.999807692308e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_P, (-1.0000000000000001e-05,1.3), 4.999980769231e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_P, (-9.9999999999999995e-07,1.3), 4.999998076923e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_P, (-9.9999999999999995e-08,1.3), 4.999999807692e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_P, (-1.0000000000000000e-08,1.3), 4.999999980769e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_P, (-1.0000000000000001e-09,1.3), 4.999999998077e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_P, (-1.0000000000000000e-10,1.3), 4.999999999808e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_P, (0.0000000000000000e+00,1.3), 5.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Pinv, (5.0000000000000000e-01,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_logistic_P, (1.0000000000000000e-10,1.3), 5.000000000192e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_P, (1.0000000000000001e-09,1.3), 5.000000001923e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_P, (1.0000000000000000e-08,1.3), 5.000000019231e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_P, (9.9999999999999995e-08,1.3), 5.000000192308e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_P, (9.9999999999999995e-07,1.3), 5.000001923077e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_P, (1.0000000000000001e-05,1.3), 5.000019230769e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_P, (1.0000000000000000e-04,1.3), 5.000192307692e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_P, (1.0000000000000000e-03,1.3), 5.001923076828e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Pinv, (5.0019230768282508e-01,1.3), 1.000000000000e-03, TEST_TOL6);
+ TEST(gsl_cdf_logistic_P, (1.0000000000000000e-02,1.3), 5.019230674405e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Pinv, (5.0192306744050519e-01,1.3), 1.000000000000e-02, TEST_TOL6);
+ TEST(gsl_cdf_logistic_P, (1.0000000000000001e-01,1.3), 5.192212922106e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Pinv, (5.1922129221060820e-01,1.3), 1.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_P, (1.0000000000000000e+00,1.3), 6.833544701878e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Pinv, (6.8335447018778295e-01,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_logistic_P, (1.0000000000000000e+01,1.3), 9.995438842359e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Pinv, (9.9954388423594354e-01,1.3), 1.000000000000e+01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_P, (1.0000000000000000e+02,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_logistic_P, (1.0000000000000000e+03,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_logistic_P, (1.0000000000000000e+04,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_logistic_P, (1.0000000000000000e+05,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_logistic_P, (1.0000000000000000e+06,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_logistic_P, (1.0000000000000000e+07,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_logistic_P, (1.0000000000000000e+08,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_logistic_P, (1.0000000000000000e+09,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_logistic_P, (1.0000000000000000e+10,1.3), 1.000000000000e+00, TEST_TOL6);
+
+ TEST(gsl_cdf_logistic_Q, (1.0000000000000000e+10,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Q, (1.0000000000000000e+09,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Q, (1.0000000000000000e+08,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Q, (1.0000000000000000e+07,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Q, (1.0000000000000000e+06,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Q, (1.0000000000000000e+05,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Q, (1.0000000000000000e+04,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Q, (1.0000000000000000e+03,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Q, (1.0000000000000000e+02,1.3), 3.915003559824e-34, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Qinv, (3.9150035598244656e-34,1.3), 1.000000000000e+02, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Q, (1.0000000000000000e+01,1.3), 4.561157640565e-04, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Qinv, (4.5611576405646045e-04,1.3), 1.000000000000e+01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Q, (1.0000000000000000e+00,1.3), 3.166455298122e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Qinv, (3.1664552981221700e-01,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Q, (1.0000000000000001e-01,1.3), 4.807787077894e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Qinv, (4.8077870778939180e-01,1.3), 1.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Q, (1.0000000000000000e-02,1.3), 4.980769325595e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Qinv, (4.9807693255949481e-01,1.3), 1.000000000000e-02, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Q, (1.0000000000000000e-03,1.3), 4.998076923172e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Qinv, (4.9980769231717492e-01,1.3), 1.000000000000e-03, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Q, (1.0000000000000000e-04,1.3), 4.999807692308e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Q, (1.0000000000000001e-05,1.3), 4.999980769231e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Q, (9.9999999999999995e-07,1.3), 4.999998076923e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Q, (9.9999999999999995e-08,1.3), 4.999999807692e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Q, (1.0000000000000000e-08,1.3), 4.999999980769e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Q, (1.0000000000000001e-09,1.3), 4.999999998077e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Q, (1.0000000000000000e-10,1.3), 4.999999999808e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Q, (0.0000000000000000e+00,1.3), 5.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Qinv, (5.0000000000000000e-01,1.3), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Q, (-1.0000000000000000e-10,1.3), 5.000000000192e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Q, (-1.0000000000000001e-09,1.3), 5.000000001923e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Q, (-1.0000000000000000e-08,1.3), 5.000000019231e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Q, (-9.9999999999999995e-08,1.3), 5.000000192308e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Q, (-9.9999999999999995e-07,1.3), 5.000001923077e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Q, (-1.0000000000000001e-05,1.3), 5.000019230769e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Q, (-1.0000000000000000e-04,1.3), 5.000192307692e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Q, (-1.0000000000000000e-03,1.3), 5.001923076828e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Qinv, (5.0019230768282508e-01,1.3), -1.000000000000e-03, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Q, (-1.0000000000000000e-02,1.3), 5.019230674405e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Qinv, (5.0192306744050519e-01,1.3), -1.000000000000e-02, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Q, (-1.0000000000000001e-01,1.3), 5.192212922106e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Qinv, (5.1922129221060820e-01,1.3), -1.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Q, (-1.0000000000000000e+00,1.3), 6.833544701878e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Qinv, (6.8335447018778295e-01,1.3), -1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Q, (-1.0000000000000000e+01,1.3), 9.995438842359e-01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Qinv, (9.9954388423594354e-01,1.3), -1.000000000000e+01, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Q, (-1.0000000000000000e+02,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Q, (-1.0000000000000000e+03,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Q, (-1.0000000000000000e+04,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Q, (-1.0000000000000000e+05,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Q, (-1.0000000000000000e+06,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Q, (-1.0000000000000000e+07,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Q, (-1.0000000000000000e+08,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Q, (-1.0000000000000000e+09,1.3), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_logistic_Q, (-1.0000000000000000e+10,1.3), 1.000000000000e+00, TEST_TOL6);
+}
+
+void test_auto_gammalarge (void);
+
+void
+test_auto_gammalarge (void)
+{
+ TEST(gsl_cdf_gamma_P, (0.0000000000000000e+00,1.3,123.0), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gamma_P, (1.0000000000000000e-10,1.3,123.0), 1.644976604681e-16, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Pinv, (1.6449766046812008e-16,1.3,123.0), 1.000000000000e-10, TEST_TOL6);
+ TEST(gsl_cdf_gamma_P, (1.0000000000000001e-09,1.3,123.0), 3.282159828312e-15, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Pinv, (3.2821598283122862e-15,1.3,123.0), 1.000000000000e-09, TEST_TOL6);
+ TEST(gsl_cdf_gamma_P, (1.0000000000000000e-08,1.3,123.0), 6.548769816865e-14, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Pinv, (6.5487698168653935e-14,1.3,123.0), 1.000000000000e-08, TEST_TOL6);
+ TEST(gsl_cdf_gamma_P, (9.9999999999999995e-08,1.3,123.0), 1.306651361959e-12, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Pinv, (1.3066513619593202e-12,1.3,123.0), 1.000000000000e-07, TEST_TOL6);
+ TEST(gsl_cdf_gamma_P, (9.9999999999999995e-07,1.3,123.0), 2.607112210538e-11, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Pinv, (2.6071122105378624e-11,1.3,123.0), 1.000000000000e-06, TEST_TOL6);
+ TEST(gsl_cdf_gamma_P, (1.0000000000000001e-05,1.3,123.0), 5.201872529446e-10, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Pinv, (5.2018725294456393e-10,1.3,123.0), 1.000000000000e-05, TEST_TOL6);
+ TEST(gsl_cdf_gamma_P, (1.0000000000000000e-04,1.3,123.0), 1.037909593275e-08, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Pinv, (1.0379095932752980e-08,1.3,123.0), 1.000000000000e-04, TEST_TOL6);
+ TEST(gsl_cdf_gamma_P, (1.0000000000000000e-03,1.3,123.0), 2.070893333124e-07, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Pinv, (2.0708933331240137e-07,1.3,123.0), 1.000000000000e-03, TEST_TOL6);
+ TEST(gsl_cdf_gamma_P, (1.0000000000000000e-02,1.3,123.0), 4.131804542806e-06, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Pinv, (4.1318045428061286e-06,1.3,123.0), 1.000000000000e-02, TEST_TOL6);
+ TEST(gsl_cdf_gamma_P, (1.0000000000000001e-01,1.3,123.0), 8.240625287202e-05, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Pinv, (8.2406252872017186e-05,1.3,123.0), 1.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_gamma_P, (1.0000000000000000e+00,1.3,123.0), 1.637438876041e-03, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Pinv, (1.6374388760411608e-03,1.3,123.0), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gamma_P, (1.0000000000000000e+01,1.3,123.0), 3.135521671622e-02, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Pinv, (3.1355216716223523e-02,1.3,123.0), 1.000000000000e+01, TEST_TOL6);
+ TEST(gsl_cdf_gamma_P, (1.0000000000000000e+02,1.3,123.0), 4.240385705334e-01, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Pinv, (4.2403857053338523e-01,1.3,123.0), 1.000000000000e+02, TEST_TOL6);
+ TEST(gsl_cdf_gamma_P, (1.0000000000000000e+03,1.3,123.0), 9.993635318324e-01, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Pinv, (9.9936353183235616e-01,1.3,123.0), 1.000000000000e+03, TEST_TOL6);
+ TEST(gsl_cdf_gamma_P, (1.0000000000000000e+04,1.3,123.0), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gamma_P, (1.0000000000000000e+05,1.3,123.0), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gamma_P, (1.0000000000000000e+06,1.3,123.0), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gamma_P, (1.0000000000000000e+07,1.3,123.0), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gamma_P, (1.0000000000000000e+08,1.3,123.0), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gamma_P, (1.0000000000000000e+09,1.3,123.0), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gamma_P, (1.0000000000000000e+10,1.3,123.0), 1.000000000000e+00, TEST_TOL6);
+
+ TEST(gsl_cdf_gamma_Q, (1.0000000000000000e+10,1.3,123.0), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Q, (1.0000000000000000e+09,1.3,123.0), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Q, (1.0000000000000000e+08,1.3,123.0), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Q, (1.0000000000000000e+07,1.3,123.0), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Q, (1.0000000000000000e+06,1.3,123.0), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Q, (1.0000000000000000e+05,1.3,123.0), 0.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Q, (1.0000000000000000e+04,1.3,123.0), 2.056363344745e-35, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Qinv, (2.0563633447452943e-35,1.3,123.0), 1.000000000000e+04, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Q, (1.0000000000000000e+03,1.3,123.0), 6.364681676440e-04, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Qinv, (6.3646816764395531e-04,1.3,123.0), 1.000000000000e+03, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Q, (1.0000000000000000e+02,1.3,123.0), 5.759614294666e-01, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Qinv, (5.7596142946661488e-01,1.3,123.0), 1.000000000000e+02, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Q, (1.0000000000000000e+01,1.3,123.0), 9.686447832838e-01, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Qinv, (9.6864478328377646e-01,1.3,123.0), 1.000000000000e+01, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Q, (1.0000000000000000e+00,1.3,123.0), 9.983625611240e-01, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Qinv, (9.9836256112395882e-01,1.3,123.0), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Q, (1.0000000000000001e-01,1.3,123.0), 9.999175937471e-01, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Qinv, (9.9991759374712796e-01,1.3,123.0), 1.000000000000e-01, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Q, (1.0000000000000000e-02,1.3,123.0), 9.999958681955e-01, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Q, (1.0000000000000000e-03,1.3,123.0), 9.999997929107e-01, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Q, (1.0000000000000000e-04,1.3,123.0), 9.999999896209e-01, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Q, (1.0000000000000001e-05,1.3,123.0), 9.999999994798e-01, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Q, (9.9999999999999995e-07,1.3,123.0), 9.999999999739e-01, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Q, (9.9999999999999995e-08,1.3,123.0), 9.999999999987e-01, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Q, (1.0000000000000000e-08,1.3,123.0), 9.999999999999e-01, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Q, (1.0000000000000001e-09,1.3,123.0), 1.000000000000e-00, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Q, (1.0000000000000000e-10,1.3,123.0), 1.000000000000e+00, TEST_TOL6);
+ TEST(gsl_cdf_gamma_Q, (0.0000000000000000e+00,1.3,123.0), 1.000000000000e+00, TEST_TOL6);
+}
+
diff --git a/gsl-1.9/cdf/weibull.c b/gsl-1.9/cdf/weibull.c
new file mode 100644
index 0000000..256d74a
--- /dev/null
+++ b/gsl-1.9/cdf/weibull.c
@@ -0,0 +1,37 @@
+/* cdf/weibull.c
+ *
+ * Copyright (C) 2003 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cdf.h>
+
+double
+gsl_cdf_weibull_P (const double x, const double a, const double b)
+{
+ double P = -expm1 (-pow(x/a, b));
+ return P;
+}
+
+double
+gsl_cdf_weibull_Q (const double x, const double a, const double b)
+{
+ double Q = exp (-pow(x/a, b));
+ return Q;
+}
diff --git a/gsl-1.9/cdf/weibullinv.c b/gsl-1.9/cdf/weibullinv.c
new file mode 100644
index 0000000..dce61e2
--- /dev/null
+++ b/gsl-1.9/cdf/weibullinv.c
@@ -0,0 +1,61 @@
+/* cdf/weibullinv.c
+ *
+ * Copyright (C) 2003 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_cdf.h>
+
+double
+gsl_cdf_weibull_Pinv (const double P, const double a, const double b)
+{
+ double x;
+
+ if (P == 1.0)
+ {
+ return GSL_POSINF;
+ }
+ else if (P == 0.0)
+ {
+ return 0.0;
+ }
+
+ x = a * pow(-log1p(-P), 1/b);
+
+ return x;
+}
+
+double
+gsl_cdf_weibull_Qinv (const double Q, const double a, const double b)
+{
+ double x;
+
+ if (Q == 0.0)
+ {
+ return GSL_POSINF;
+ }
+ else if (Q == 1.0)
+ {
+ return 0.0;
+ }
+
+ x = a * pow(-log(Q), 1/b);
+
+ return x;
+}
diff --git a/gsl-1.9/cheb/ChangeLog b/gsl-1.9/cheb/ChangeLog
new file mode 100644
index 0000000..7465d7e
--- /dev/null
+++ b/gsl-1.9/cheb/ChangeLog
@@ -0,0 +1,54 @@
+2007-01-29 Brian Gough <bjg@network-theory.co.uk>
+
+ * eval.c (gsl_cheb_eval_mode_e): compute error consistently with
+ other routines
+
+2004-12-29 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_chebyshev.h: added const to declaration of
+ gsl_cheb_eval_mode to match definition
+
+2004-12-24 Brian Gough <bjg@network-theory.co.uk>
+
+ * eval.c (gsl_cheb_eval_n_err): use eval_order instead of
+ cs->order for error estimate
+
+2004-12-23 Brian Gough <bjg@network-theory.co.uk>
+
+ * eval.c (gsl_cheb_eval_mode): added missing function
+
+2004-08-27 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c (main): make the hard-coded tolerances a variable, ftol
+
+2003-06-09 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c (main): added some tests for the coefficients
+
+2003-02-09 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_chebyshev.h: added missing #include for gsl_math (to declare
+ gsl_function) fixes Debian Bug#179665
+
+Fri May 24 19:23:47 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * init.c (gsl_cheb_free): added missing free() for cs->f
+
+Fri Aug 24 19:18:23 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c (main): renamed fsin to f_sin to avoid conflicts with
+ irix math libs.
+
+Sun May 6 09:49:28 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * eval.c (gsl_cheb_eval_err): take roundoff into account when
+ computing evaluation error (important when result is near zero).
+ (gsl_cheb_eval_n_err): ditto
+
+Tue Apr 24 17:08:29 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * made deriv/integ functions thread safe
+
+ * split out from specfunc directory
+
+
diff --git a/gsl-1.9/cheb/Makefile.am b/gsl-1.9/cheb/Makefile.am
new file mode 100644
index 0000000..cf28e27
--- /dev/null
+++ b/gsl-1.9/cheb/Makefile.am
@@ -0,0 +1,17 @@
+noinst_LTLIBRARIES = libgslcheb.la
+
+pkginclude_HEADERS = gsl_chebyshev.h
+
+INCLUDES= -I$(top_builddir)
+
+libgslcheb_la_SOURCES = deriv.c eval.c init.c integ.c
+
+TESTS = $(check_PROGRAMS)
+
+check_PROGRAMS = test
+
+test_LDADD = libgslcheb.la ../ieee-utils/libgslieeeutils.la ../test/libgsltest.la ../sys/libgslsys.la ../err/libgslerr.la ../utils/libutils.la
+
+test_SOURCES = test.c
+
+
diff --git a/gsl-1.9/cheb/Makefile.in b/gsl-1.9/cheb/Makefile.in
new file mode 100644
index 0000000..b2a8bda
--- /dev/null
+++ b/gsl-1.9/cheb/Makefile.in
@@ -0,0 +1,543 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = test$(EXEEXT)
+subdir = cheb
+DIST_COMMON = $(pkginclude_HEADERS) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in ChangeLog
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgslcheb_la_LIBADD =
+am_libgslcheb_la_OBJECTS = deriv.lo eval.lo init.lo integ.lo
+libgslcheb_la_OBJECTS = $(am_libgslcheb_la_OBJECTS)
+am_test_OBJECTS = test.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = libgslcheb.la ../ieee-utils/libgslieeeutils.la \
+ ../test/libgsltest.la ../sys/libgslsys.la ../err/libgslerr.la \
+ ../utils/libutils.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgslcheb_la_SOURCES) $(test_SOURCES)
+DIST_SOURCES = $(libgslcheb_la_SOURCES) $(test_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libgslcheb.la
+pkginclude_HEADERS = gsl_chebyshev.h
+INCLUDES = -I$(top_builddir)
+libgslcheb_la_SOURCES = deriv.c eval.c init.c integ.c
+TESTS = $(check_PROGRAMS)
+test_LDADD = libgslcheb.la ../ieee-utils/libgslieeeutils.la ../test/libgsltest.la ../sys/libgslsys.la ../err/libgslerr.la ../utils/libutils.la
+test_SOURCES = test.c
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps cheb/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps cheb/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgslcheb.la: $(libgslcheb_la_OBJECTS) $(libgslcheb_la_DEPENDENCIES)
+ $(LINK) $(libgslcheb_la_LDFLAGS) $(libgslcheb_la_OBJECTS) $(libgslcheb_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkgincludeHEADERS
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/cheb/deriv.c b/gsl-1.9/cheb/deriv.c
new file mode 100644
index 0000000..57c22df
--- /dev/null
+++ b/gsl-1.9/cheb/deriv.c
@@ -0,0 +1,63 @@
+/* cheb/deriv.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_chebyshev.h>
+
+int gsl_cheb_calc_deriv(gsl_cheb_series * deriv, const gsl_cheb_series * f)
+{
+ const size_t n = f->order + 1;
+ const double con = 2.0 / (f->b - f->a);
+ size_t i;
+
+ if(deriv->order != f->order)
+ {
+ GSL_ERROR ("order of chebyshev series must be equal", GSL_ENOMEM);
+ }
+
+ /* set the other parameters in the chebyshev struct */
+
+ deriv->a = f->a;
+ deriv->b = f->b;
+
+#ifdef ERR
+ deriv->err = n * n * f->c[n-1]; /* error in derivative is n^2 c_n */
+#endif
+
+ /* FIXME: should probably set deriv->f[] as well */
+
+ deriv->c[n-1] = 0.0;
+
+ if(n > 1) {
+ deriv->c[n-2] = 2.0 *(n-1.0) * f->c[n-1];
+
+ for(i = n-3; i>0; i--)
+ deriv->c[i] = deriv->c[i+2] + 2.0 *(i+1.0) * f->c[i+1];
+
+ deriv->c[0] = deriv->c[2] + 2.0 * f->c[1];
+
+ for(i = 0 ; i<n ; i++)
+ deriv->c[i] *= con;
+ }
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/cheb/eval.c b/gsl-1.9/cheb/eval.c
new file mode 100644
index 0000000..9d5acda
--- /dev/null
+++ b/gsl-1.9/cheb/eval.c
@@ -0,0 +1,206 @@
+/* cheb/eval.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_chebyshev.h>
+
+/* For efficiency there are separate implementations of each of these
+ functions */
+
+double
+gsl_cheb_eval (const gsl_cheb_series * cs, const double x)
+{
+ size_t i;
+ double d1 = 0.0;
+ double d2 = 0.0;
+
+ double y = (2.0 * x - cs->a - cs->b) / (cs->b - cs->a);
+ double y2 = 2.0 * y;
+
+ for (i = cs->order; i >= 1; i--)
+ {
+ double temp = d1;
+ d1 = y2 * d1 - d2 + cs->c[i];
+ d2 = temp;
+ }
+
+ return y * d1 - d2 + 0.5 * cs->c[0];
+}
+
+double
+gsl_cheb_eval_n (const gsl_cheb_series * cs, const size_t n, const double x)
+{
+ size_t i;
+ double d1 = 0.0;
+ double d2 = 0.0;
+
+ size_t eval_order = GSL_MIN (n, cs->order);
+
+ double y = (2.0 * x - cs->a - cs->b) / (cs->b - cs->a);
+ double y2 = 2.0 * y;
+
+ for (i = eval_order; i >= 1; i--)
+ {
+ double temp = d1;
+ d1 = y2 * d1 - d2 + cs->c[i];
+ d2 = temp;
+ }
+
+ return y * d1 - d2 + 0.5 * cs->c[0];
+}
+
+
+int
+gsl_cheb_eval_err (const gsl_cheb_series * cs, const double x,
+ double *result, double *abserr)
+{
+ size_t i;
+ double d1 = 0.0;
+ double d2 = 0.0;
+
+ double y = (2. * x - cs->a - cs->b) / (cs->b - cs->a);
+ double y2 = 2.0 * y;
+
+ double absc = 0.0;
+
+ for (i = cs->order; i >= 1; i--)
+ {
+ double temp = d1;
+ d1 = y2 * d1 - d2 + cs->c[i];
+ d2 = temp;
+ }
+
+ *result = y * d1 - d2 + 0.5 * cs->c[0];
+
+ /* Estimate cumulative numerical error */
+
+ for (i = 0; i <= cs->order; i++)
+ {
+ absc += fabs(cs->c[i]);
+ }
+
+ /* Combine truncation error and numerical error */
+
+ *abserr = fabs (cs->c[cs->order]) + absc * GSL_DBL_EPSILON;
+
+ return GSL_SUCCESS;
+}
+
+int
+gsl_cheb_eval_n_err (const gsl_cheb_series * cs,
+ const size_t n, const double x,
+ double *result, double *abserr)
+{
+ size_t i;
+ double d1 = 0.0;
+ double d2 = 0.0;
+
+ double y = (2. * x - cs->a - cs->b) / (cs->b - cs->a);
+ double y2 = 2.0 * y;
+
+ double absc = 0.0;
+
+ size_t eval_order = GSL_MIN (n, cs->order);
+
+ for (i = eval_order; i >= 1; i--)
+ {
+ double temp = d1;
+ d1 = y2 * d1 - d2 + cs->c[i];
+ d2 = temp;
+ }
+
+ *result = y * d1 - d2 + 0.5 * cs->c[0];
+
+ /* Estimate cumulative numerical error */
+
+ for (i = 0; i <= eval_order; i++)
+ {
+ absc += fabs(cs->c[i]);
+ }
+
+ /* Combine truncation error and numerical error */
+
+ *abserr = fabs (cs->c[eval_order]) + absc * GSL_DBL_EPSILON;
+
+ return GSL_SUCCESS;
+}
+
+int
+gsl_cheb_eval_mode_e (const gsl_cheb_series * cs,
+ const double x, gsl_mode_t mode,
+ double *result, double *abserr)
+{
+ size_t i;
+ double d1 = 0.0;
+ double d2 = 0.0;
+
+ double y = (2. * x - cs->a - cs->b) / (cs->b - cs->a);
+ double y2 = 2.0 * y;
+
+ double absc = 0.0;
+
+ size_t eval_order;
+
+ if (GSL_MODE_PREC (mode) == GSL_PREC_DOUBLE)
+ eval_order = cs->order;
+ else
+ eval_order = cs->order_sp;
+
+ for (i = eval_order; i >= 1; i--)
+ {
+ double temp = d1;
+ d1 = y2 * d1 - d2 + cs->c[i];
+ d2 = temp;
+ }
+
+ *result = y * d1 - d2 + 0.5 * cs->c[0];
+
+ /* Estimate cumulative numerical error */
+
+ for (i = 0; i <= eval_order; i++)
+ {
+ absc += fabs(cs->c[i]);
+ }
+
+ /* Combine truncation error and numerical error */
+
+ *abserr = fabs (cs->c[eval_order]) + absc * GSL_DBL_EPSILON;
+
+ return GSL_SUCCESS;
+}
+
+double
+gsl_cheb_eval_mode (const gsl_cheb_series * cs,
+ const double x, gsl_mode_t mode)
+{
+ double result, abserr;
+ int status = gsl_cheb_eval_mode_e (cs, x, mode, &result, &abserr);
+
+ if (status != GSL_SUCCESS)
+ {
+ GSL_ERROR_VAL("gsl_cheb_eval_mode", status, result);
+ };
+
+ return result;
+}
+
+
diff --git a/gsl-1.9/cheb/gsl_chebyshev.h b/gsl-1.9/cheb/gsl_chebyshev.h
new file mode 100644
index 0000000..2557908
--- /dev/null
+++ b/gsl-1.9/cheb/gsl_chebyshev.h
@@ -0,0 +1,129 @@
+/* cheb/gsl_chebyshev.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_CHEBYSHEV_H__
+#define __GSL_CHEBYSHEV_H__
+
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_mode.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+
+/* data for a Chebyshev series over a given interval */
+
+struct gsl_cheb_series_struct {
+
+ double * c; /* coefficients */
+ size_t order; /* order of expansion */
+ double a; /* lower interval point */
+ double b; /* upper interval point */
+
+ /* The following exists (mostly) for the benefit
+ * of the implementation. It is an effective single
+ * precision order, for use in single precision
+ * evaluation. Users can use it if they like, but
+ * only they know how to calculate it, since it is
+ * specific to the approximated function. By default,
+ * order_sp = order.
+ * It is used explicitly only by the gsl_cheb_eval_mode
+ * functions, which are not meant for casual use.
+ */
+ size_t order_sp;
+
+ /* Additional elements not used by specfunc */
+
+ double * f; /* function evaluated at chebyschev points */
+};
+typedef struct gsl_cheb_series_struct gsl_cheb_series;
+
+
+/* Calculate a Chebyshev series of specified order over
+ * a specified interval, for a given function.
+ * Return 0 on failure.
+ */
+gsl_cheb_series * gsl_cheb_alloc(const size_t order);
+
+/* Free a Chebyshev series previously calculated with gsl_cheb_alloc().
+ */
+void gsl_cheb_free(gsl_cheb_series * cs);
+
+/* Calculate a Chebyshev series using the storage provided.
+ * Uses the interval (a,b) and the order with which it
+ * was initially created.
+ *
+ */
+int gsl_cheb_init(gsl_cheb_series * cs, const gsl_function * func,
+ const double a, const double b);
+
+
+/* Evaluate a Chebyshev series at a given point.
+ * No errors can occur for a struct obtained from gsl_cheb_new().
+ */
+double gsl_cheb_eval(const gsl_cheb_series * cs, const double x);
+int gsl_cheb_eval_err(const gsl_cheb_series * cs, const double x,
+ double * result, double * abserr);
+
+
+/* Evaluate a Chebyshev series at a given point, to (at most) the given order.
+ * No errors can occur for a struct obtained from gsl_cheb_new().
+ */
+double gsl_cheb_eval_n(const gsl_cheb_series * cs, const size_t order,
+ const double x);
+int gsl_cheb_eval_n_err(const gsl_cheb_series * cs, const size_t order,
+ const double x, double * result, double * abserr);
+
+
+/* Evaluate a Chebyshev series at a given point, using the default
+ * order for double precision mode(s) and the single precision
+ * order for other modes.
+ * No errors can occur for a struct obtained from gsl_cheb_new().
+ */
+double gsl_cheb_eval_mode(const gsl_cheb_series * cs, const double x, gsl_mode_t mode);
+int gsl_cheb_eval_mode_e(const gsl_cheb_series * cs, const double x, gsl_mode_t mode, double * result, double * abserr);
+
+
+
+/* Compute the derivative of a Chebyshev series.
+ */
+int gsl_cheb_calc_deriv(gsl_cheb_series * deriv, const gsl_cheb_series * cs);
+
+/* Compute the integral of a Chebyshev series. The
+ * integral is fixed by the condition that it equals zero at
+ * the left end-point, ie it is precisely
+ * Integrate[cs(t; a,b), {t, a, x}]
+ */
+int gsl_cheb_calc_integ(gsl_cheb_series * integ, const gsl_cheb_series * cs);
+
+
+
+
+__END_DECLS
+
+#endif /* __GSL_CHEBYSHEV_H__ */
diff --git a/gsl-1.9/cheb/init.c b/gsl-1.9/cheb/init.c
new file mode 100644
index 0000000..9b42021
--- /dev/null
+++ b/gsl-1.9/cheb/init.c
@@ -0,0 +1,101 @@
+/* cheb/init.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_chebyshev.h>
+
+/*-*-*-*-*-*-*-*-*-*-*-* Allocators *-*-*-*-*-*-*-*-*-*-*-*/
+
+gsl_cheb_series *
+gsl_cheb_alloc(const size_t order)
+{
+ gsl_cheb_series * cs = (gsl_cheb_series *) malloc(sizeof(gsl_cheb_series));
+
+ if(cs == 0) {
+ GSL_ERROR_VAL("failed to allocate gsl_cheb_series struct", GSL_ENOMEM, 0);
+ }
+
+ cs->order = order;
+ cs->order_sp = order;
+
+ cs->c = (double *) malloc((order+1) * sizeof(double));
+
+ if(cs->c == 0) {
+ GSL_ERROR_VAL("failed to allocate cheb coefficients", GSL_ENOMEM, 0);
+ }
+
+ cs->f = (double *) malloc((order+1) * sizeof(double));
+
+ if(cs->f == 0) {
+ GSL_ERROR_VAL("failed to allocate cheb function space", GSL_ENOMEM, 0);
+ }
+
+ return cs;
+}
+
+
+void gsl_cheb_free(gsl_cheb_series * cs)
+{
+ free(cs->f);
+ free(cs->c);
+ free(cs);
+}
+
+/*-*-*-*-*-*-*-*-*-*-*-* Initializer *-*-*-*-*-*-*-*-*-*-*-*/
+
+int gsl_cheb_init(gsl_cheb_series * cs, const gsl_function *func,
+ const double a, const double b)
+{
+ size_t k, j;
+
+ if(a >= b) {
+ GSL_ERROR_VAL("null function interval [a,b]", GSL_EDOM, 0);
+ }
+ cs->a = a;
+ cs->b = b;
+ /* cs->err = 0.0; */
+
+ {
+ double bma = 0.5 * (cs->b - cs->a);
+ double bpa = 0.5 * (cs->b + cs->a);
+ double fac = 2.0/(cs->order +1.0);
+
+ for(k = 0; k<=cs->order; k++) {
+ double y = cos(M_PI * (k+0.5)/(cs->order+1));
+ cs->f[k] = GSL_FN_EVAL(func, (y*bma + bpa));
+ }
+
+ for(j = 0; j<=cs->order; j++) {
+ double sum = 0.0;
+ for(k = 0; k<=cs->order; k++)
+ sum += cs->f[k]*cos(M_PI * j*(k+0.5)/(cs->order+1));
+ cs->c[j] = fac * sum;
+ }
+
+ }
+ return GSL_SUCCESS;
+}
+
+
+
+
+
diff --git a/gsl-1.9/cheb/integ.c b/gsl-1.9/cheb/integ.c
new file mode 100644
index 0000000..0f49dd9
--- /dev/null
+++ b/gsl-1.9/cheb/integ.c
@@ -0,0 +1,65 @@
+/* cheb/integ.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_chebyshev.h>
+
+int gsl_cheb_calc_integ(gsl_cheb_series * integ, const gsl_cheb_series * f)
+{
+ const size_t n = f->order + 1;
+ const double con = 0.25 * (f->b - f->a);
+
+ if(integ->order != f->order)
+ {
+ GSL_ERROR ("order of chebyshev series must be equal", GSL_ENOMEM);
+ }
+
+ /* set the other parameters in the chebyshev struct */
+
+ integ->a = f->a;
+ integ->b = f->b;
+
+ /* FIXME: should probably set integ->f[] as well */
+
+ if(n == 1) {
+ integ->c[0] = 0.;
+ }
+ else if(n == 2) {
+ integ->c[1] = con * f->c[0];
+ integ->c[0] = 2.0 * integ->c[1];
+ }
+ else {
+ double sum = 0.0;
+ double fac = 1.0;
+ size_t i;
+ for(i=1; i<=n-2; i++) {
+ integ->c[i] = con * (f->c[i-1] - f->c[i+1])/((double)i);
+ sum += fac * integ->c[i];
+ fac = -fac;
+ }
+ integ->c[n-1] = con * f->c[n-2]/(n-1.0);
+ sum += fac * integ->c[n-1];
+ integ->c[0] = 2.0 * sum;
+ }
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/cheb/test.c b/gsl-1.9/cheb/test.c
new file mode 100644
index 0000000..7c27d84
--- /dev/null
+++ b/gsl-1.9/cheb/test.c
@@ -0,0 +1,208 @@
+/* cheb/test.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_chebyshev.h>
+
+double f_T0 (double x, void * p) {
+ p = 0;
+ return 1.0;
+}
+
+double f_T1 (double x, void * p) {
+ p = 0;
+ return x;
+}
+
+double f_T2 (double x, void * p) {
+ p = 0;
+ return 2*x*x - 1;
+}
+
+double f_sin (double x, void * p) {
+ p = 0;
+ return sin(x);
+}
+
+int
+main(void)
+{
+ double tol = 100.0 * GSL_DBL_EPSILON;
+ double ftol = 20.0;
+ double x;
+ size_t i;
+
+ gsl_cheb_series * cs = gsl_cheb_alloc(40);
+ gsl_cheb_series * csd = gsl_cheb_alloc(40);
+ gsl_cheb_series * csi = gsl_cheb_alloc(40);
+
+ gsl_function F_sin, F_T0, F_T1, F_T2;
+
+ F_sin.function = f_sin;
+ F_sin.params = 0;
+
+ F_T0.function = f_T0;
+ F_T0.params = 0;
+
+ F_T1.function = f_T1;
+ F_T1.params = 0;
+
+ F_T2.function = f_T2;
+ F_T2.params = 0;
+
+ gsl_ieee_env_setup();
+
+ gsl_cheb_init(cs, &F_T0, -1.0, 1.0);
+
+ for (i = 0; i<cs->order; i++)
+ {
+ double c_exp = (i == 0) ? 2.0 : 0.0;
+ gsl_test_abs (cs->c[i], c_exp, tol, "c[%d] for T_0(x)", i);
+ }
+
+ gsl_cheb_init(cs, &F_T1, -1.0, 1.0);
+
+ for (i = 0; i<cs->order; i++)
+ {
+ double c_exp = (i == 1) ? 1.0 : 0.0;
+ gsl_test_abs (cs->c[i], c_exp, tol, "c[%d] for T_1(x)", i);
+ }
+
+ gsl_cheb_init(cs, &F_T2, -1.0, 1.0);
+
+ for (i = 0; i<cs->order; i++)
+ {
+ double c_exp = (i == 2) ? 1.0 : 0.0;
+ gsl_test_abs (cs->c[i], c_exp, tol, "c[%d] for T_2(x)", i);
+ }
+
+ gsl_cheb_init(cs, &F_sin, -M_PI, M_PI);
+
+ gsl_test_abs (cs->c[0], 0.0, tol, "c[0] for F_sin(x)");
+ gsl_test_abs (cs->c[1], 5.69230686359506e-01, tol, "c[1] for F_sin(x)");
+ gsl_test_abs (cs->c[2], 0.0, tol, "c[2] for F_sin(x)");
+ gsl_test_abs (cs->c[3], -6.66916672405979e-01, tol, "c[3] for F_sin(x)");
+ gsl_test_abs (cs->c[4], 0.0, tol, "c[4] for F_sin(x)");
+ gsl_test_abs (cs->c[5], 1.04282368734237e-01, tol, "c[5] for F_sin(x)");
+
+ for(x=-M_PI; x<M_PI; x += M_PI/100.0) {
+ double r = gsl_cheb_eval(cs, x);
+ gsl_test_abs(r, sin(x), tol, "gsl_cheb_eval, sin(%.3g)", x);
+ }
+
+ for(x=-M_PI; x<M_PI; x += M_PI/100.0) {
+ double r, e;
+ gsl_cheb_eval_err(cs, x, &r, &e);
+ gsl_test_abs(r, sin(x), tol, "gsl_cheb_eval_err, sin(%.3g)", x);
+ gsl_test_factor(fabs(r-sin(x)) + GSL_DBL_EPSILON, e, ftol,
+ "gsl_cheb_eval_err, error sin(%.3g)", x);
+ }
+
+ for(x=-M_PI; x<M_PI; x += M_PI/100.0) {
+ double r = gsl_cheb_eval_n(cs, 25, x);
+ gsl_test_abs(r, sin(x), tol, "gsl_cheb_eval_n, sin(%.3g)", x);
+ }
+
+ for(x=-M_PI; x<M_PI; x += M_PI/100.0) {
+ double r, e;
+ gsl_cheb_eval_n_err(cs, 25, x, &r, &e);
+ gsl_test_abs(r, sin(x), 100.0 * tol, "gsl_cheb_eval_n_err, deriv sin(%.3g)", x);
+ gsl_test_factor(fabs(r-sin(x)) + GSL_DBL_EPSILON, e, ftol,
+ "gsl_cheb_eval_n_err, error sin(%.3g)", x);
+ }
+
+ /* Test derivative */
+
+ gsl_cheb_calc_deriv(csd, cs);
+
+ for(x=-M_PI; x<M_PI; x += M_PI/100.0) {
+ double r = gsl_cheb_eval(csd, x);
+ gsl_test_abs(r, cos(x), 1600 * tol, "gsl_cheb_eval, deriv sin(%.3g)", x);
+ }
+
+#ifdef TEST_DERIVATIVE_ERR
+ for(x=-M_PI; x<M_PI; x += M_PI/100.0) {
+ double r, e;
+ gsl_cheb_eval_err(csd, x, &r, &e);
+ gsl_test_abs(r, cos(x), tol, "gsl_cheb_eval_err, deriv sin(%.3g)", x);
+ gsl_test_factor(fabs(r-cos(x)) + GSL_DBL_EPSILON, e, ftol,
+ "gsl_cheb_eval_err, deriv error sin(%.3g)", x);
+ }
+#endif
+
+ for(x=-M_PI; x<M_PI; x += M_PI/100.0) {
+ double r = gsl_cheb_eval_n(csd, 25, x);
+ gsl_test_abs(r, cos(x), 1600 * tol, "gsl_cheb_eval_n, deriv sin(%.3g)", x);
+ }
+
+#ifdef TEST_DERIVATIVE_ERR
+ for(x=-M_PI; x<M_PI; x += M_PI/100.0) {
+ double r, e;
+ gsl_cheb_eval_n_err(csd, 25, x, &r, &e);
+ gsl_test_abs(r, cos(x), 100.0 * tol, "gsl_cheb_eval_n_err, deriv sin(%.3g)", x);
+ gsl_test_factor(fabs(r-cos(x)) + GSL_DBL_EPSILON, e, ftol,
+ "gsl_cheb_eval_n_err, deriv error sin(%.3g)", x);
+ }
+#endif
+
+ /* Test integral */
+
+ gsl_cheb_calc_integ(csi, cs);
+
+ for(x=-M_PI; x<M_PI; x += M_PI/100.0) {
+ double r = gsl_cheb_eval(csi, x);
+ gsl_test_abs(r, -(1+cos(x)), tol, "gsl_cheb_eval, integ sin(%.3g)", x);
+ }
+
+#ifdef TEST_INTEGRAL_ERR
+ for(x=-M_PI; x<M_PI; x += M_PI/100.0) {
+ double r, e;
+ gsl_cheb_eval_err(csi, x, &r, &e);
+ gsl_test_abs(r, -(1+cos(x)), tol, "gsl_cheb_eval_err, integ sin(%.3g)", x);
+ gsl_test_factor(fabs(r-(-1-cos(x))) + GSL_DBL_EPSILON, e, ftol,
+ "gsl_cheb_eval_err, integ error sin(%.3g)", x);
+ }
+#endif
+
+ for(x=-M_PI; x<M_PI; x += M_PI/100.0) {
+ double r = gsl_cheb_eval_n(csi, 25, x);
+ gsl_test_abs(r, -(1+cos(x)), tol, "gsl_cheb_eval_n, integ sin(%.3g)", x);
+ }
+
+#ifdef TEST_INTEGRAL_ERR
+ for(x=-M_PI; x<M_PI; x += M_PI/100.0) {
+ double r, e;
+ gsl_cheb_eval_n_err(csi, 25, x, &r, &e);
+ gsl_test_abs(r, -(1+cos(x)), 100.0 * tol, "gsl_cheb_eval_n_err, integ sin(%.3g)", x);
+ gsl_test_factor(fabs(r-(-1-cos(x))) + GSL_DBL_EPSILON, e, ftol,
+ "gsl_cheb_eval_n_err, integ error sin(%.3g)", x);
+ }
+#endif
+
+ gsl_cheb_free(csi);
+ gsl_cheb_free(csd);
+ gsl_cheb_free(cs);
+
+ exit (gsl_test_summary());
+}
diff --git a/gsl-1.9/combination/ChangeLog b/gsl-1.9/combination/ChangeLog
new file mode 100644
index 0000000..b8a21ad
--- /dev/null
+++ b/gsl-1.9/combination/ChangeLog
@@ -0,0 +1,28 @@
+2003-07-30 Brian Gough <bjg@network-theory.co.uk>
+
+ * init.c (gsl_combination_alloc): set c->data to NULL when k=0
+
+2003-04-12 Szymon Jaroszewicz <sj@cs.umb.edu>
+
+ * combination.c (gsl_combination_valid): fix a typo in error
+ message
+
+2003-03-22 Brian Gough <bjg@network-theory.co.uk>
+
+ * combination.c (gsl_combination_memcpy): added memcpy function
+
+2003-03-21 Brian Gough <bjg@network-theory.co.uk>
+
+ * combination.c (gsl_combination_valid): fix bug in test for
+ validity (cj<ci not ci<cj)
+
+ * test.c (main): added tests of gsl_combination_valid
+
+Sat Jan 26 22:39:03 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c: use unsigned loop variables
+
+Sat Dec 8 18:22:06 2001 Szymon Jaroszewicz <sj@cs.umb.edu>
+
+ * added combination support to GSL
+
diff --git a/gsl-1.9/combination/Makefile.am b/gsl-1.9/combination/Makefile.am
new file mode 100644
index 0000000..715dac4
--- /dev/null
+++ b/gsl-1.9/combination/Makefile.am
@@ -0,0 +1,25 @@
+noinst_LTLIBRARIES = libgslcombination.la
+
+pkginclude_HEADERS = gsl_combination.h
+
+INCLUDES= -I$(top_builddir) -I$(top_srcdir)
+
+libgslcombination_la_SOURCES = init.c file.c combination.c
+
+noinst_HEADERS =
+
+TESTS = $(check_PROGRAMS)
+
+check_PROGRAMS = test
+
+test_SOURCES = test.c
+
+test_LDADD = libgslcombination.la ../vector/libgslvector.la ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+
+#noinst_PROGRAMS = demo
+#demo_SOURCES = demo.c
+#demo_LDADD = libgslcombination.la ../vector/libgslvector.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+
+#CLEANFILES = test.txt test.dat
+
+
diff --git a/gsl-1.9/combination/Makefile.in b/gsl-1.9/combination/Makefile.in
new file mode 100644
index 0000000..a6be469
--- /dev/null
+++ b/gsl-1.9/combination/Makefile.in
@@ -0,0 +1,551 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = test$(EXEEXT)
+subdir = combination
+DIST_COMMON = $(noinst_HEADERS) $(pkginclude_HEADERS) \
+ $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgslcombination_la_LIBADD =
+am_libgslcombination_la_OBJECTS = init.lo file.lo combination.lo
+libgslcombination_la_OBJECTS = $(am_libgslcombination_la_OBJECTS)
+am_test_OBJECTS = test.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = libgslcombination.la ../vector/libgslvector.la \
+ ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la \
+ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \
+ ../utils/libutils.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgslcombination_la_SOURCES) $(test_SOURCES)
+DIST_SOURCES = $(libgslcombination_la_SOURCES) $(test_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libgslcombination.la
+pkginclude_HEADERS = gsl_combination.h
+INCLUDES = -I$(top_builddir) -I$(top_srcdir)
+libgslcombination_la_SOURCES = init.c file.c combination.c
+noinst_HEADERS =
+TESTS = $(check_PROGRAMS)
+test_SOURCES = test.c
+test_LDADD = libgslcombination.la ../vector/libgslvector.la ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps combination/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps combination/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgslcombination.la: $(libgslcombination_la_OBJECTS) $(libgslcombination_la_DEPENDENCIES)
+ $(LINK) $(libgslcombination_la_LDFLAGS) $(libgslcombination_la_OBJECTS) $(libgslcombination_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkgincludeHEADERS
+
+
+#noinst_PROGRAMS = demo
+#demo_SOURCES = demo.c
+#demo_LDADD = libgslcombination.la ../vector/libgslvector.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+
+#CLEANFILES = test.txt test.dat
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/combination/combination.c b/gsl-1.9/combination/combination.c
new file mode 100644
index 0000000..6f8c817
--- /dev/null
+++ b/gsl-1.9/combination/combination.c
@@ -0,0 +1,189 @@
+/* combination/combination.c
+ * based on permutation/permutation.c by Brian Gough
+ *
+ * Copyright (C) 2001 Szymon Jaroszewicz
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_combination.h>
+
+size_t
+gsl_combination_n (const gsl_combination * c)
+{
+ return c->n ;
+}
+
+size_t
+gsl_combination_k (const gsl_combination * c)
+{
+ return c->k ;
+}
+
+size_t *
+gsl_combination_data (const gsl_combination * c)
+{
+ return c->data ;
+}
+
+#ifndef HIDE_INLINE_STATIC
+size_t
+gsl_combination_get (const gsl_combination * c, const size_t i)
+{
+ if (gsl_check_range)
+ {
+ if (i >= c->k) /* size_t is unsigned, can't be negative */
+ {
+ GSL_ERROR_VAL ("index out of range", GSL_EINVAL, 0);
+ }
+ }
+
+ return c->data[i];
+}
+#endif
+
+
+int
+gsl_combination_valid (gsl_combination * c)
+{
+ const size_t n = c->n ;
+ const size_t k = c->k ;
+
+ size_t i, j ;
+
+ if( k > n )
+ {
+ GSL_ERROR("combination has k greater than n", GSL_FAILURE) ;
+ }
+ for (i = 0; i < k; i++)
+ {
+ const size_t ci = c->data[i];
+
+ if (ci >= n)
+ {
+ GSL_ERROR("combination index outside range", GSL_FAILURE) ;
+ }
+
+ for (j = 0; j < i; j++)
+ {
+ if (c->data[j] == ci)
+ {
+ GSL_ERROR("duplicate combination index", GSL_FAILURE) ;
+ }
+ if (c->data[j] > ci)
+ {
+ GSL_ERROR("combination indices not in increasing order",
+ GSL_FAILURE) ;
+ }
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+int
+gsl_combination_next (gsl_combination * c)
+{
+ /* Replaces c with the next combination (in the standard lexicographical
+ * ordering). Returns GSL_FAILURE if there is no next combination.
+ */
+ const size_t n = c->n;
+ const size_t k = c->k;
+ size_t *data = c->data;
+ size_t i;
+
+ if(k == 0)
+ {
+ return GSL_FAILURE;
+ }
+ i = k - 1;
+
+ while(i > 0 && data[i] == n - k + i)
+ {
+ i--;
+ }
+ if(i == 0 && data[i] == n - k)
+ {
+ return GSL_FAILURE;
+ }
+ data[i]++;
+ for(; i < k - 1; i++)
+ {
+ data[i + 1] = data[i] + 1;
+ }
+ return GSL_SUCCESS;
+}
+
+int
+gsl_combination_prev (gsl_combination * c)
+{
+ /* Replaces c with the previous combination (in the standard
+ * lexicographical ordering). Returns GSL_FAILURE if there is no
+ * previous combination.
+ */
+ const size_t n = c->n;
+ const size_t k = c->k;
+ size_t *data = c->data;
+ size_t i;
+
+ if(k == 0)
+ {
+ return GSL_FAILURE;
+ }
+ i = k - 1;
+
+ while(i > 0 && data[i] == data[i-1] + 1)
+ {
+ i--;
+ }
+ if(i == 0 && data[i] == 0)
+ {
+ return GSL_FAILURE;
+ }
+ data[i++]--;
+ for(; i < k; i++)
+ {
+ data[i] = n - k + i;
+ }
+ return GSL_SUCCESS;
+}
+
+int
+gsl_combination_memcpy (gsl_combination * dest, const gsl_combination * src)
+{
+ const size_t src_n = src->n;
+ const size_t src_k = src->k;
+ const size_t dest_n = dest->n;
+ const size_t dest_k = dest->k;
+
+ if (src_n != dest_n || src_k != dest_k)
+ {
+ GSL_ERROR ("combination lengths are not equal", GSL_EBADLEN);
+ }
+
+ {
+ size_t j;
+
+ for (j = 0; j < src_k; j++)
+ {
+ dest->data[j] = src->data[j];
+ }
+ }
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/combination/file.c b/gsl-1.9/combination/file.c
new file mode 100644
index 0000000..8932fd1
--- /dev/null
+++ b/gsl-1.9/combination/file.c
@@ -0,0 +1,114 @@
+/* combination/file.c
+ * based on permutation/file.c by Brian Gough
+ *
+ * Copyright (C) 2001 Szymon Jaroszewicz
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_combination.h>
+
+#define IN_FORMAT "%lu"
+
+int
+gsl_combination_fread (FILE * stream, gsl_combination * c)
+{
+ size_t k = c->k ;
+
+ size_t * data = c->data ;
+
+ size_t items = fread (data, sizeof (size_t), k, stream);
+
+ if (items != k)
+ {
+ GSL_ERROR ("fread failed", GSL_EFAILED);
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+gsl_combination_fwrite (FILE * stream, const gsl_combination * c)
+{
+ size_t k = c->k ;
+
+ size_t * data = c->data ;
+
+ size_t items = fwrite (data, sizeof (size_t), k, stream);
+
+ if (items != k)
+ {
+ GSL_ERROR ("fwrite failed", GSL_EFAILED);
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+gsl_combination_fprintf (FILE * stream, const gsl_combination * c, const char *format)
+{
+ size_t k = c->k ;
+
+ size_t * data = c->data ;
+
+ size_t i;
+
+ for (i = 0; i < k; i++)
+ {
+ int status = fprintf (stream, format, data[i]);
+
+ if (status < 0)
+ {
+ GSL_ERROR ("fprintf failed", GSL_EFAILED);
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+gsl_combination_fscanf (FILE * stream, gsl_combination * c)
+{
+ size_t k = c->k ;
+
+ size_t * data = c->data ;
+
+ size_t i;
+
+ for (i = 0; i < k; i++)
+ {
+ unsigned long j ;
+
+ /* FIXME: what if size_t != unsigned long ???
+
+ want read in size_t but have to read in unsigned long to avoid
+ error from compiler */
+
+ int status = fscanf (stream, IN_FORMAT, &j);
+
+ if (status != 1)
+ {
+ GSL_ERROR ("fscanf failed", GSL_EFAILED);
+ }
+
+ data[i] = j;
+ }
+
+ return GSL_SUCCESS;
+}
+
diff --git a/gsl-1.9/combination/gsl_combination.h b/gsl-1.9/combination/gsl_combination.h
new file mode 100644
index 0000000..ece1b72
--- /dev/null
+++ b/gsl-1.9/combination/gsl_combination.h
@@ -0,0 +1,91 @@
+/* combination/gsl_combination.h
+ * based on permutation/gsl_permutation.h by Brian Gough
+ *
+ * Copyright (C) 2001 Szymon Jaroszewicz
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_COMBINATION_H__
+#define __GSL_COMBINATION_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_types.h>
+#include <gsl/gsl_check_range.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+struct gsl_combination_struct
+{
+ size_t n;
+ size_t k;
+ size_t *data;
+};
+
+typedef struct gsl_combination_struct gsl_combination;
+
+gsl_combination *gsl_combination_alloc (const size_t n, const size_t k);
+gsl_combination *gsl_combination_calloc (const size_t n, const size_t k);
+void gsl_combination_init_first (gsl_combination * c);
+void gsl_combination_init_last (gsl_combination * c);
+void gsl_combination_free (gsl_combination * c);
+int gsl_combination_memcpy (gsl_combination * dest, const gsl_combination * src);
+
+int gsl_combination_fread (FILE * stream, gsl_combination * c);
+int gsl_combination_fwrite (FILE * stream, const gsl_combination * c);
+int gsl_combination_fscanf (FILE * stream, gsl_combination * c);
+int gsl_combination_fprintf (FILE * stream, const gsl_combination * c, const char *format);
+
+size_t gsl_combination_n (const gsl_combination * c);
+size_t gsl_combination_k (const gsl_combination * c);
+size_t * gsl_combination_data (const gsl_combination * c);
+
+size_t gsl_combination_get (const gsl_combination * c, const size_t i);
+
+int gsl_combination_valid (gsl_combination * c);
+int gsl_combination_next (gsl_combination * c);
+int gsl_combination_prev (gsl_combination * c);
+
+#ifdef HAVE_INLINE
+
+extern inline
+size_t
+gsl_combination_get (const gsl_combination * c, const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= c->k)
+ {
+ GSL_ERROR_VAL ("index out of range", GSL_EINVAL, 0);
+ }
+#endif
+ return c->data[i];
+}
+
+#endif /* HAVE_INLINE */
+
+__END_DECLS
+
+#endif /* __GSL_COMBINATION_H__ */
diff --git a/gsl-1.9/combination/init.c b/gsl-1.9/combination/init.c
new file mode 100644
index 0000000..6bac2d4
--- /dev/null
+++ b/gsl-1.9/combination/init.c
@@ -0,0 +1,126 @@
+/* combination/init.c
+ * based on permutation/init.c by Brian Gough
+ *
+ * Copyright (C) 2001 Szymon Jaroszewicz
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_combination.h>
+
+gsl_combination *
+gsl_combination_alloc (const size_t n, const size_t k)
+{
+ gsl_combination * c;
+
+ if (n == 0)
+ {
+ GSL_ERROR_VAL ("combination parameter n must be positive integer",
+ GSL_EDOM, 0);
+ }
+ if (k > n)
+ {
+ GSL_ERROR_VAL ("combination length k must be an integer less than or equal to n",
+ GSL_EDOM, 0);
+ }
+ c = (gsl_combination *) malloc (sizeof (gsl_combination));
+
+ if (c == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for combination struct",
+ GSL_ENOMEM, 0);
+ }
+
+ if (k > 0)
+ {
+ c->data = (size_t *) malloc (k * sizeof (size_t));
+
+ if (c->data == 0)
+ {
+ free (c); /* exception in constructor, avoid memory leak */
+
+ GSL_ERROR_VAL ("failed to allocate space for combination data",
+ GSL_ENOMEM, 0);
+ }
+ }
+ else
+ {
+ c->data = 0;
+ }
+
+ c->n = n;
+ c->k = k;
+
+ return c;
+}
+
+gsl_combination *
+gsl_combination_calloc (const size_t n, const size_t k)
+{
+ size_t i;
+
+ gsl_combination * c = gsl_combination_alloc (n, k);
+
+ if (c == 0)
+ return 0;
+
+ /* initialize combination to identity */
+
+ for (i = 0; i < k; i++)
+ {
+ c->data[i] = i;
+ }
+
+ return c;
+}
+
+void
+gsl_combination_init_first (gsl_combination * c)
+{
+ const size_t k = c->k ;
+ size_t i;
+
+ /* initialize combination to identity */
+
+ for (i = 0; i < k; i++)
+ {
+ c->data[i] = i;
+ }
+}
+
+void
+gsl_combination_init_last (gsl_combination * c)
+{
+ const size_t k = c->k ;
+ size_t i;
+ size_t n = c->n;
+
+ /* initialize combination to identity */
+
+ for (i = 0; i < k; i++)
+ {
+ c->data[i] = n - k + i;
+ }
+}
+
+void
+gsl_combination_free (gsl_combination * c)
+{
+ if (c->k > 0) free (c->data);
+ free (c);
+}
diff --git a/gsl-1.9/combination/test.c b/gsl-1.9/combination/test.c
new file mode 100644
index 0000000..cd55c78
--- /dev/null
+++ b/gsl-1.9/combination/test.c
@@ -0,0 +1,261 @@
+/* combination/test.c
+ * based on permutation/test.c by Brian Gough
+ *
+ * Copyright (C) 2001 Szymon Jaroszewicz
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <gsl/gsl_combination.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+
+size_t c63[20][3] = {
+ { 0, 1, 2 }, { 0, 1, 3 }, { 0, 1, 4 }, { 0, 1, 5 },
+ { 0, 2, 3 }, { 0, 2, 4 }, { 0, 2, 5 }, { 0, 3, 4 },
+ { 0, 3, 5 }, { 0, 4, 5 }, { 1, 2, 3 }, { 1, 2, 4 },
+ { 1, 2, 5 }, { 1, 3, 4 }, { 1, 3, 5 }, { 1, 4, 5 },
+ { 2, 3, 4 }, { 2, 3, 5 }, { 2, 4, 5 }, { 3, 4, 5 }
+} ;
+
+void my_error_handler (const char *reason, const char *file, int line, int err);
+
+
+int
+main (void)
+{
+ size_t i, j;
+ int status = 0, s;
+ gsl_combination * c ;
+
+ gsl_ieee_env_setup ();
+
+ c = gsl_combination_alloc (6,3);
+
+ /* Test combinations in forward order */
+
+ gsl_combination_init_first (c);
+
+ i = 0;
+
+ do
+ {
+ if ( i >= 20 )
+ {
+ status = 1;
+ break;
+ }
+ for (j = 0; j < 3; j++)
+ {
+ status |= (c->data[j] != c63[i][j]);
+ }
+
+ {
+ int s1 = gsl_combination_valid (c);
+ gsl_test (s1, "gsl_combination_valid (%u)", i);
+ }
+
+ i++;
+ }
+ while (gsl_combination_next(c) == GSL_SUCCESS);
+
+ gsl_test(status, "gsl_combination_next, 6 choose 3 combination, 20 steps");
+
+ gsl_combination_next(c);
+ gsl_combination_next(c);
+ gsl_combination_next(c);
+ for (j = 0; j < 3; j++)
+ {
+ status |= (c->data[j] != c63[19][j]);
+ }
+ gsl_test(status, "gsl_combination_next on the last combination");
+
+ {
+ int s1 = gsl_combination_valid (c);
+ gsl_test (s1, "gsl_combination_valid on the last combination");
+ }
+
+ {
+ gsl_combination * d = gsl_combination_alloc (6,3);
+ gsl_combination_memcpy (d, c);
+
+ status = 0;
+
+ for (j = 0; j < 3; j++)
+ {
+ status |= (d->data[j] != c->data[j]);
+ }
+
+ gsl_test (status, "gsl_combination_memcpy, 6 choose 3 combination");
+ gsl_combination_free(d);
+ }
+
+
+ /* Now test combinations in reverse order */
+
+ gsl_combination_init_last (c);
+
+ i = 20;
+ do
+ {
+ if ( i == 0 )
+ {
+ status = 1;
+ break;
+ }
+
+ i--;
+
+ for (j = 0; j < 3; j++)
+ {
+ status |= (c->data[j] != c63[i][j]);
+ }
+
+ {
+ int s1 = gsl_combination_valid (c);
+ gsl_test (s1, "gsl_combination_valid (%u)", i);
+ }
+ }
+ while (gsl_combination_prev(c) == GSL_SUCCESS);
+
+ gsl_test(status, "gsl_combination_prev, 6 choose 3 combination, 20 steps");
+
+ gsl_combination_prev(c);
+ gsl_combination_prev(c);
+ gsl_combination_prev(c);
+ for (j = 0; j < 3; j++)
+ {
+ status |= (c->data[j] != c63[0][j]);
+ }
+ gsl_test(status, "gsl_combination_prev on the first combination");
+
+ {
+ int s1 = gsl_combination_valid (c);
+ gsl_test (s1, "gsl_combination_valid on the first combination");
+ }
+
+ {
+ gsl_combination * d = gsl_combination_alloc (6,3);
+ gsl_combination_memcpy (d, c);
+
+ status = 0;
+
+ for (j = 0; j < 3; j++)
+ {
+ status |= (d->data[j] != c->data[j]);
+ }
+
+ gsl_test (status, "gsl_combination_memcpy, 6 choose 3 combination");
+ gsl_combination_free(d);
+ }
+
+ gsl_combination_free (c);
+
+ c = gsl_combination_calloc(7, 0);
+ /* should return GSL_FAILURE every time */
+ status |= (gsl_combination_next(c) != GSL_FAILURE);
+ status |= (gsl_combination_next(c) != GSL_FAILURE);
+ status |= (gsl_combination_prev(c) != GSL_FAILURE);
+ status |= (gsl_combination_prev(c) != GSL_FAILURE);
+ gsl_test(status, "gsl_combination 7 choose 0");
+ gsl_combination_free (c);
+
+ c = gsl_combination_calloc(7, 7);
+ /* should return GSL_FAILURE every time */
+ for(j = 0; j < 7; j++)
+ {
+ status |= (gsl_combination_get(c, j) != j);
+ }
+ status |= (gsl_combination_next(c) != GSL_FAILURE);
+ for(j = 0; j < 7; j++)
+ {
+ status |= (gsl_combination_get(c, j) != j);
+ }
+ status |= (gsl_combination_next(c) != GSL_FAILURE);
+ for(j = 0; j < 7; j++)
+ {
+ status |= (gsl_combination_get(c, j) != j);
+ }
+ status |= (gsl_combination_prev(c) != GSL_FAILURE);
+ for(j = 0; j < 7; j++)
+ {
+ status |= (gsl_combination_get(c, j) != j);
+ }
+ status |= (gsl_combination_prev(c) != GSL_FAILURE);
+ for(j = 0; j < 7; j++)
+ {
+ status |= (gsl_combination_get(c, j) != j);
+ }
+ gsl_test(status, "gsl_combination 7 choose 7");
+ gsl_combination_free (c);
+
+ c = gsl_combination_calloc(6, 3);
+
+ gsl_set_error_handler (&my_error_handler);
+
+ c->data[0] = 1;
+ c->data[1] = 1;
+ c->data[2] = 2;
+ s = gsl_combination_valid (c);
+ gsl_test (!s, "gsl_combination_valid on an invalid combination (1,1,2)");
+
+ c->data[0] = 2;
+ c->data[1] = 1;
+ c->data[2] = 0;
+ s = gsl_combination_valid (c);
+ gsl_test (!s, "gsl_combination_valid on an invalid combination (2,1,0)");
+
+ c->data[0] = 1;
+ c->data[1] = 2;
+ c->data[2] = 0;
+ s = gsl_combination_valid (c);
+ gsl_test (!s, "gsl_combination_valid on an invalid combination (1,2,0)");
+
+ {
+ gsl_combination * d = gsl_combination_alloc (6,4);
+ int s = gsl_combination_memcpy (d, c);
+ gsl_test (!s, "gsl_combination_memcpy, (6,4) vs (6,3)");
+ gsl_combination_free(d);
+ }
+
+ {
+ gsl_combination * d = gsl_combination_alloc (7,3);
+ int s = gsl_combination_memcpy (d, c);
+ gsl_test (!s, "gsl_combination_memcpy, (7,3) vs (6,3)");
+ gsl_combination_free(d);
+ }
+
+ {
+ gsl_combination * d = gsl_combination_alloc (7,2);
+ int s = gsl_combination_memcpy (d, c);
+ gsl_test (!s, "gsl_combination_memcpy, (7,2) vs (6,3)");
+ gsl_combination_free(d);
+ }
+
+
+ gsl_combination_free (c);
+
+ exit (gsl_test_summary());
+}
+
+void
+my_error_handler (const char *reason, const char *file, int line, int err)
+{
+ if (0) printf ("(caught [%s:%d: %s (%d)])\n", file, line, reason, err) ;
+}
diff --git a/gsl-1.9/complex/ChangeLog b/gsl-1.9/complex/ChangeLog
new file mode 100644
index 0000000..72edc7d
--- /dev/null
+++ b/gsl-1.9/complex/ChangeLog
@@ -0,0 +1,48 @@
+2003-01-25 Brian Gough <brian.gough@network-theory.co.uk>
+
+ * math.c (gsl_complex_arccsc_real): fixed bug for incorrect sign
+ of imaginary part when -1<a<0
+
+Wed Dec 11 13:17:21 2002 Brian Gough <brian.gough@network-theory.co.uk>
+
+ * math.c (gsl_complex_arg): enforce special case arg(0,0) = 0.0
+
+Mon Sep 10 22:57:27 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * math.c (gsl_complex_div_real gsl_complex_div_real): added
+ missing functions div_real and div_imag
+
+Mon Aug 27 18:58:41 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.el: trim the tests down to a more reasonable size
+
+Thu Aug 9 15:48:48 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * math.c (gsl_complex_tanh): improve accuracy for large R
+
+Fri Jul 27 23:29:10 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * math.c (gsl_complex_cos): avoid returning negative zero for the
+ imaginary part when the argument is purely real
+
+Wed Mar 21 14:40:34 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_complex.h (GSL_COMPLEX_P): added macro to point to beginning
+ of complex array within the struct
+
+Mon Dec 4 12:29:12 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * math.c (gsl_complex_rect): changed the function gsl_complex_xy
+ to gsl_complex_rect, since this is more meaningful
+
+Sun Oct 22 13:55:09 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * math.c: changed calls to gsl_hypot() to hypot() so that the
+ system function is used in preference (the configure script will
+ define hypot to gsl_hypot if hypot is unavailable), similar change
+ for functions log1p and gsl_log1p also
+
+Wed Mar 15 11:17:21 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_complex.h: moved into complex/ subdirectory from top-level
+
diff --git a/gsl-1.9/complex/Makefile.am b/gsl-1.9/complex/Makefile.am
new file mode 100644
index 0000000..9fd87a9
--- /dev/null
+++ b/gsl-1.9/complex/Makefile.am
@@ -0,0 +1,15 @@
+noinst_LTLIBRARIES = libgslcomplex.la
+
+pkginclude_HEADERS = gsl_complex.h gsl_complex_math.h
+
+#INCLUDES = -I$(top_builddir) -I$(top_srcdir)
+INCLUDES = -I$(top_srcdir)
+
+libgslcomplex_la_SOURCES = math.c
+
+TESTS = $(check_PROGRAMS)
+check_PROGRAMS = test
+
+test_SOURCES = test.c results.h results1.h results_real.h
+test_LDADD = libgslcomplex.la ../err/libgslerr.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+
diff --git a/gsl-1.9/complex/Makefile.in b/gsl-1.9/complex/Makefile.in
new file mode 100644
index 0000000..2e90920
--- /dev/null
+++ b/gsl-1.9/complex/Makefile.in
@@ -0,0 +1,545 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = test$(EXEEXT)
+subdir = complex
+DIST_COMMON = $(pkginclude_HEADERS) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in ChangeLog TODO
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgslcomplex_la_LIBADD =
+am_libgslcomplex_la_OBJECTS = math.lo
+libgslcomplex_la_OBJECTS = $(am_libgslcomplex_la_OBJECTS)
+am_test_OBJECTS = test.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = libgslcomplex.la ../err/libgslerr.la \
+ ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la \
+ ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgslcomplex_la_SOURCES) $(test_SOURCES)
+DIST_SOURCES = $(libgslcomplex_la_SOURCES) $(test_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libgslcomplex.la
+pkginclude_HEADERS = gsl_complex.h gsl_complex_math.h
+
+#INCLUDES = -I$(top_builddir) -I$(top_srcdir)
+INCLUDES = -I$(top_srcdir)
+libgslcomplex_la_SOURCES = math.c
+TESTS = $(check_PROGRAMS)
+test_SOURCES = test.c results.h results1.h results_real.h
+test_LDADD = libgslcomplex.la ../err/libgslerr.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps complex/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps complex/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgslcomplex.la: $(libgslcomplex_la_OBJECTS) $(libgslcomplex_la_DEPENDENCIES)
+ $(LINK) $(libgslcomplex_la_LDFLAGS) $(libgslcomplex_la_OBJECTS) $(libgslcomplex_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkgincludeHEADERS
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/complex/TODO b/gsl-1.9/complex/TODO
new file mode 100644
index 0000000..aa07561
--- /dev/null
+++ b/gsl-1.9/complex/TODO
@@ -0,0 +1,16 @@
+* Complex polynomial solvers (Got Newton-Mueller from
+jotahtin@cc.hut.fi, still to add (BJG)).
+
+* The asymptotic behavior of the secondary functions (sec, csc, cot,
+etc) can overflow because of expressions like cosh(x) / D , where D =
+cosh^2 which is computed prior to the division. This should by
+special casing "small" vs "large" arguments as has been done for the
+sin,cos,tan versions.
+
+* Perhaps there is something useful in LCY65 L. A. Lyusternik,
+O. A. Chervonenkis, and A. R. Yanpol'skii, Handbook for computing
+elementary functions, International Series of Monographs in Pure and
+Applied Mathematics, vol. 76, Pergamon Press, Oxford, 1965.
+
+
+
diff --git a/gsl-1.9/complex/gsl_complex.h b/gsl-1.9/complex/gsl_complex.h
new file mode 100644
index 0000000..f97f5ac
--- /dev/null
+++ b/gsl-1.9/complex/gsl_complex.h
@@ -0,0 +1,103 @@
+/* complex/gsl_complex.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_COMPLEX_H__
+#define __GSL_COMPLEX_H__
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+
+/* two consecutive built-in types as a complex number */
+typedef double * gsl_complex_packed ;
+typedef float * gsl_complex_packed_float ;
+typedef long double * gsl_complex_packed_long_double ;
+
+typedef const double * gsl_const_complex_packed ;
+typedef const float * gsl_const_complex_packed_float ;
+typedef const long double * gsl_const_complex_packed_long_double ;
+
+
+/* 2N consecutive built-in types as N complex numbers */
+typedef double * gsl_complex_packed_array ;
+typedef float * gsl_complex_packed_array_float ;
+typedef long double * gsl_complex_packed_array_long_double ;
+
+typedef const double * gsl_const_complex_packed_array ;
+typedef const float * gsl_const_complex_packed_array_float ;
+typedef const long double * gsl_const_complex_packed_array_long_double ;
+
+
+/* Yes... this seems weird. Trust us. The point is just that
+ sometimes you want to make it obvious that something is
+ an output value. The fact that it lacks a 'const' may not
+ be enough of a clue for people in some contexts.
+ */
+typedef double * gsl_complex_packed_ptr ;
+typedef float * gsl_complex_packed_float_ptr ;
+typedef long double * gsl_complex_packed_long_double_ptr ;
+
+typedef const double * gsl_const_complex_packed_ptr ;
+typedef const float * gsl_const_complex_packed_float_ptr ;
+typedef const long double * gsl_const_complex_packed_long_double_ptr ;
+
+
+typedef struct
+ {
+ long double dat[2];
+ }
+gsl_complex_long_double;
+
+typedef struct
+ {
+ double dat[2];
+ }
+gsl_complex;
+
+typedef struct
+ {
+ float dat[2];
+ }
+gsl_complex_float;
+
+#define GSL_REAL(z) ((z).dat[0])
+#define GSL_IMAG(z) ((z).dat[1])
+#define GSL_COMPLEX_P(zp) ((zp)->dat)
+#define GSL_COMPLEX_P_REAL(zp) ((zp)->dat[0])
+#define GSL_COMPLEX_P_IMAG(zp) ((zp)->dat[1])
+#define GSL_COMPLEX_EQ(z1,z2) (((z1).dat[0] == (z2).dat[0]) && ((z1).dat[1] == (z2).dat[1]))
+
+#define GSL_SET_COMPLEX(zp,x,y) do {(zp)->dat[0]=(x); (zp)->dat[1]=(y);} while(0)
+#define GSL_SET_REAL(zp,x) do {(zp)->dat[0]=(x);} while(0)
+#define GSL_SET_IMAG(zp,y) do {(zp)->dat[1]=(y);} while(0)
+
+#define GSL_SET_COMPLEX_PACKED(zp,n,x,y) do {*((zp)+2*(n))=(x); *((zp)+(2*(n)+1))=(y);} while(0)
+
+__END_DECLS
+
+#endif /* __GSL_COMPLEX_H__ */
diff --git a/gsl-1.9/complex/gsl_complex_math.h b/gsl-1.9/complex/gsl_complex_math.h
new file mode 100644
index 0000000..8f521a7
--- /dev/null
+++ b/gsl-1.9/complex/gsl_complex_math.h
@@ -0,0 +1,140 @@
+/* complex/gsl_complex_math.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004 Jorma Olavi Tähtinen, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_COMPLEX_MATH_H__
+#define __GSL_COMPLEX_MATH_H__
+#include <gsl/gsl_complex.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+#define __BEGIN_DECLS extern "C" {
+#define __END_DECLS }
+#else
+#define __BEGIN_DECLS /* empty */
+#define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+/* Complex numbers */
+
+gsl_complex gsl_complex_rect (double x, double y); /* r= real+i*imag */
+gsl_complex gsl_complex_polar (double r, double theta); /* r= r e^(i theta) */
+
+#ifdef HAVE_INLINE
+extern inline gsl_complex
+gsl_complex_rect (double x, double y)
+{ /* return z = x + i y */
+ gsl_complex z;
+ GSL_SET_COMPLEX (&z, x, y);
+ return z;
+}
+#endif
+
+#define GSL_COMPLEX_ONE (gsl_complex_rect(1.0,0.0))
+#define GSL_COMPLEX_ZERO (gsl_complex_rect(0.0,0.0))
+#define GSL_COMPLEX_NEGONE (gsl_complex_rect(-1.0,0.0))
+
+/* Properties of complex numbers */
+
+double gsl_complex_arg (gsl_complex z); /* return arg(z), -pi< arg(z) <=+pi */
+double gsl_complex_abs (gsl_complex z); /* return |z| */
+double gsl_complex_abs2 (gsl_complex z); /* return |z|^2 */
+double gsl_complex_logabs (gsl_complex z); /* return log|z| */
+
+/* Complex arithmetic operators */
+
+gsl_complex gsl_complex_add (gsl_complex a, gsl_complex b); /* r=a+b */
+gsl_complex gsl_complex_sub (gsl_complex a, gsl_complex b); /* r=a-b */
+gsl_complex gsl_complex_mul (gsl_complex a, gsl_complex b); /* r=a*b */
+gsl_complex gsl_complex_div (gsl_complex a, gsl_complex b); /* r=a/b */
+
+gsl_complex gsl_complex_add_real (gsl_complex a, double x); /* r=a+x */
+gsl_complex gsl_complex_sub_real (gsl_complex a, double x); /* r=a-x */
+gsl_complex gsl_complex_mul_real (gsl_complex a, double x); /* r=a*x */
+gsl_complex gsl_complex_div_real (gsl_complex a, double x); /* r=a/x */
+
+gsl_complex gsl_complex_add_imag (gsl_complex a, double y); /* r=a+iy */
+gsl_complex gsl_complex_sub_imag (gsl_complex a, double y); /* r=a-iy */
+gsl_complex gsl_complex_mul_imag (gsl_complex a, double y); /* r=a*iy */
+gsl_complex gsl_complex_div_imag (gsl_complex a, double y); /* r=a/iy */
+
+gsl_complex gsl_complex_conjugate (gsl_complex z); /* r=conj(z) */
+gsl_complex gsl_complex_inverse (gsl_complex a); /* r=1/a */
+gsl_complex gsl_complex_negative (gsl_complex a); /* r=-a */
+
+/* Elementary Complex Functions */
+
+gsl_complex gsl_complex_sqrt (gsl_complex z); /* r=sqrt(z) */
+gsl_complex gsl_complex_sqrt_real (double x); /* r=sqrt(x) (x<0 ok) */
+
+gsl_complex gsl_complex_pow (gsl_complex a, gsl_complex b); /* r=a^b */
+gsl_complex gsl_complex_pow_real (gsl_complex a, double b); /* r=a^b */
+
+gsl_complex gsl_complex_exp (gsl_complex a); /* r=exp(a) */
+gsl_complex gsl_complex_log (gsl_complex a); /* r=log(a) (base e) */
+gsl_complex gsl_complex_log10 (gsl_complex a); /* r=log10(a) (base 10) */
+gsl_complex gsl_complex_log_b (gsl_complex a, gsl_complex b); /* r=log_b(a) (base=b) */
+
+/* Complex Trigonometric Functions */
+
+gsl_complex gsl_complex_sin (gsl_complex a); /* r=sin(a) */
+gsl_complex gsl_complex_cos (gsl_complex a); /* r=cos(a) */
+gsl_complex gsl_complex_sec (gsl_complex a); /* r=sec(a) */
+gsl_complex gsl_complex_csc (gsl_complex a); /* r=csc(a) */
+gsl_complex gsl_complex_tan (gsl_complex a); /* r=tan(a) */
+gsl_complex gsl_complex_cot (gsl_complex a); /* r=cot(a) */
+
+/* Inverse Complex Trigonometric Functions */
+
+gsl_complex gsl_complex_arcsin (gsl_complex a); /* r=arcsin(a) */
+gsl_complex gsl_complex_arcsin_real (double a); /* r=arcsin(a) */
+gsl_complex gsl_complex_arccos (gsl_complex a); /* r=arccos(a) */
+gsl_complex gsl_complex_arccos_real (double a); /* r=arccos(a) */
+gsl_complex gsl_complex_arcsec (gsl_complex a); /* r=arcsec(a) */
+gsl_complex gsl_complex_arcsec_real (double a); /* r=arcsec(a) */
+gsl_complex gsl_complex_arccsc (gsl_complex a); /* r=arccsc(a) */
+gsl_complex gsl_complex_arccsc_real (double a); /* r=arccsc(a) */
+gsl_complex gsl_complex_arctan (gsl_complex a); /* r=arctan(a) */
+gsl_complex gsl_complex_arccot (gsl_complex a); /* r=arccot(a) */
+
+/* Complex Hyperbolic Functions */
+
+gsl_complex gsl_complex_sinh (gsl_complex a); /* r=sinh(a) */
+gsl_complex gsl_complex_cosh (gsl_complex a); /* r=coshh(a) */
+gsl_complex gsl_complex_sech (gsl_complex a); /* r=sech(a) */
+gsl_complex gsl_complex_csch (gsl_complex a); /* r=csch(a) */
+gsl_complex gsl_complex_tanh (gsl_complex a); /* r=tanh(a) */
+gsl_complex gsl_complex_coth (gsl_complex a); /* r=coth(a) */
+
+/* Inverse Complex Hyperbolic Functions */
+
+gsl_complex gsl_complex_arcsinh (gsl_complex a); /* r=arcsinh(a) */
+gsl_complex gsl_complex_arccosh (gsl_complex a); /* r=arccosh(a) */
+gsl_complex gsl_complex_arccosh_real (double a); /* r=arccosh(a) */
+gsl_complex gsl_complex_arcsech (gsl_complex a); /* r=arcsech(a) */
+gsl_complex gsl_complex_arccsch (gsl_complex a); /* r=arccsch(a) */
+gsl_complex gsl_complex_arctanh (gsl_complex a); /* r=arctanh(a) */
+gsl_complex gsl_complex_arctanh_real (double a); /* r=arctanh(a) */
+gsl_complex gsl_complex_arccoth (gsl_complex a); /* r=arccoth(a) */
+
+__END_DECLS
+
+#endif /* __GSL_COMPLEX_MATH_H__ */
diff --git a/gsl-1.9/complex/math.c b/gsl-1.9/complex/math.c
new file mode 100644
index 0000000..19df2ac
--- /dev/null
+++ b/gsl-1.9/complex/math.c
@@ -0,0 +1,1007 @@
+/* complex/math.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Jorma Olavi Tähtinen, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Basic complex arithmetic functions
+
+ * Original version by Jorma Olavi Tähtinen <jotahtin@cc.hut.fi>
+ *
+ * Modified for GSL by Brian Gough, 3/2000
+ */
+
+/* The following references describe the methods used in these
+ * functions,
+ *
+ * T. E. Hull and Thomas F. Fairgrieve and Ping Tak Peter Tang,
+ * "Implementing Complex Elementary Functions Using Exception
+ * Handling", ACM Transactions on Mathematical Software, Volume 20
+ * (1994), pp 215-244, Corrigenda, p553
+ *
+ * Hull et al, "Implementing the complex arcsin and arccosine
+ * functions using exception handling", ACM Transactions on
+ * Mathematical Software, Volume 23 (1997) pp 299-335
+ *
+ * Abramowitz and Stegun, Handbook of Mathematical Functions, "Inverse
+ * Circular Functions in Terms of Real and Imaginary Parts", Formulas
+ * 4.4.37, 4.4.38, 4.4.39
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_complex.h>
+#include <gsl/gsl_complex_math.h>
+
+/**********************************************************************
+ * Complex numbers
+ **********************************************************************/
+
+#ifndef HIDE_INLINE_STATIC
+gsl_complex
+gsl_complex_rect (double x, double y)
+{ /* return z = x + i y */
+ gsl_complex z;
+ GSL_SET_COMPLEX (&z, x, y);
+ return z;
+}
+#endif
+
+gsl_complex
+gsl_complex_polar (double r, double theta)
+{ /* return z = r exp(i theta) */
+ gsl_complex z;
+ GSL_SET_COMPLEX (&z, r * cos (theta), r * sin (theta));
+ return z;
+}
+
+/**********************************************************************
+ * Properties of complex numbers
+ **********************************************************************/
+
+double
+gsl_complex_arg (gsl_complex z)
+{ /* return arg(z), -pi < arg(z) <= +pi */
+ double x = GSL_REAL (z);
+ double y = GSL_IMAG (z);
+
+ if (x == 0.0 && y == 0.0)
+ {
+ return 0;
+ }
+
+ return atan2 (y, x);
+}
+
+double
+gsl_complex_abs (gsl_complex z)
+{ /* return |z| */
+ return hypot (GSL_REAL (z), GSL_IMAG (z));
+}
+
+double
+gsl_complex_abs2 (gsl_complex z)
+{ /* return |z|^2 */
+ double x = GSL_REAL (z);
+ double y = GSL_IMAG (z);
+
+ return (x * x + y * y);
+}
+
+double
+gsl_complex_logabs (gsl_complex z)
+{ /* return log|z| */
+ double xabs = fabs (GSL_REAL (z));
+ double yabs = fabs (GSL_IMAG (z));
+ double max, u;
+
+ if (xabs >= yabs)
+ {
+ max = xabs;
+ u = yabs / xabs;
+ }
+ else
+ {
+ max = yabs;
+ u = xabs / yabs;
+ }
+
+ /* Handle underflow when u is close to 0 */
+
+ return log (max) + 0.5 * log1p (u * u);
+}
+
+
+/***********************************************************************
+ * Complex arithmetic operators
+ ***********************************************************************/
+
+gsl_complex
+gsl_complex_add (gsl_complex a, gsl_complex b)
+{ /* z=a+b */
+ double ar = GSL_REAL (a), ai = GSL_IMAG (a);
+ double br = GSL_REAL (b), bi = GSL_IMAG (b);
+
+ gsl_complex z;
+ GSL_SET_COMPLEX (&z, ar + br, ai + bi);
+ return z;
+}
+
+gsl_complex
+gsl_complex_add_real (gsl_complex a, double x)
+{ /* z=a+x */
+ gsl_complex z;
+ GSL_SET_COMPLEX (&z, GSL_REAL (a) + x, GSL_IMAG (a));
+ return z;
+}
+
+gsl_complex
+gsl_complex_add_imag (gsl_complex a, double y)
+{ /* z=a+iy */
+ gsl_complex z;
+ GSL_SET_COMPLEX (&z, GSL_REAL (a), GSL_IMAG (a) + y);
+ return z;
+}
+
+
+gsl_complex
+gsl_complex_sub (gsl_complex a, gsl_complex b)
+{ /* z=a-b */
+ double ar = GSL_REAL (a), ai = GSL_IMAG (a);
+ double br = GSL_REAL (b), bi = GSL_IMAG (b);
+
+ gsl_complex z;
+ GSL_SET_COMPLEX (&z, ar - br, ai - bi);
+ return z;
+}
+
+gsl_complex
+gsl_complex_sub_real (gsl_complex a, double x)
+{ /* z=a-x */
+ gsl_complex z;
+ GSL_SET_COMPLEX (&z, GSL_REAL (a) - x, GSL_IMAG (a));
+ return z;
+}
+
+gsl_complex
+gsl_complex_sub_imag (gsl_complex a, double y)
+{ /* z=a-iy */
+ gsl_complex z;
+ GSL_SET_COMPLEX (&z, GSL_REAL (a), GSL_IMAG (a) - y);
+ return z;
+}
+
+gsl_complex
+gsl_complex_mul (gsl_complex a, gsl_complex b)
+{ /* z=a*b */
+ double ar = GSL_REAL (a), ai = GSL_IMAG (a);
+ double br = GSL_REAL (b), bi = GSL_IMAG (b);
+
+ gsl_complex z;
+ GSL_SET_COMPLEX (&z, ar * br - ai * bi, ar * bi + ai * br);
+ return z;
+}
+
+gsl_complex
+gsl_complex_mul_real (gsl_complex a, double x)
+{ /* z=a*x */
+ gsl_complex z;
+ GSL_SET_COMPLEX (&z, x * GSL_REAL (a), x * GSL_IMAG (a));
+ return z;
+}
+
+gsl_complex
+gsl_complex_mul_imag (gsl_complex a, double y)
+{ /* z=a*iy */
+ gsl_complex z;
+ GSL_SET_COMPLEX (&z, -y * GSL_IMAG (a), y * GSL_REAL (a));
+ return z;
+}
+
+gsl_complex
+gsl_complex_div (gsl_complex a, gsl_complex b)
+{ /* z=a/b */
+ double ar = GSL_REAL (a), ai = GSL_IMAG (a);
+ double br = GSL_REAL (b), bi = GSL_IMAG (b);
+
+ double s = 1.0 / gsl_complex_abs (b);
+
+ double sbr = s * br;
+ double sbi = s * bi;
+
+ double zr = (ar * sbr + ai * sbi) * s;
+ double zi = (ai * sbr - ar * sbi) * s;
+
+ gsl_complex z;
+ GSL_SET_COMPLEX (&z, zr, zi);
+ return z;
+}
+
+gsl_complex
+gsl_complex_div_real (gsl_complex a, double x)
+{ /* z=a/x */
+ gsl_complex z;
+ GSL_SET_COMPLEX (&z, GSL_REAL (a) / x, GSL_IMAG (a) / x);
+ return z;
+}
+
+gsl_complex
+gsl_complex_div_imag (gsl_complex a, double y)
+{ /* z=a/(iy) */
+ gsl_complex z;
+ GSL_SET_COMPLEX (&z, GSL_IMAG (a) / y, - GSL_REAL (a) / y);
+ return z;
+}
+
+gsl_complex
+gsl_complex_conjugate (gsl_complex a)
+{ /* z=conj(a) */
+ gsl_complex z;
+ GSL_SET_COMPLEX (&z, GSL_REAL (a), -GSL_IMAG (a));
+ return z;
+}
+
+gsl_complex
+gsl_complex_negative (gsl_complex a)
+{ /* z=-a */
+ gsl_complex z;
+ GSL_SET_COMPLEX (&z, -GSL_REAL (a), -GSL_IMAG (a));
+ return z;
+}
+
+gsl_complex
+gsl_complex_inverse (gsl_complex a)
+{ /* z=1/a */
+ double s = 1.0 / gsl_complex_abs (a);
+
+ gsl_complex z;
+ GSL_SET_COMPLEX (&z, (GSL_REAL (a) * s) * s, -(GSL_IMAG (a) * s) * s);
+ return z;
+}
+
+/**********************************************************************
+ * Elementary complex functions
+ **********************************************************************/
+
+gsl_complex
+gsl_complex_sqrt (gsl_complex a)
+{ /* z=sqrt(a) */
+ gsl_complex z;
+
+ if (GSL_REAL (a) == 0.0 && GSL_IMAG (a) == 0.0)
+ {
+ GSL_SET_COMPLEX (&z, 0, 0);
+ }
+ else
+ {
+ double x = fabs (GSL_REAL (a));
+ double y = fabs (GSL_IMAG (a));
+ double w;
+
+ if (x >= y)
+ {
+ double t = y / x;
+ w = sqrt (x) * sqrt (0.5 * (1.0 + sqrt (1.0 + t * t)));
+ }
+ else
+ {
+ double t = x / y;
+ w = sqrt (y) * sqrt (0.5 * (t + sqrt (1.0 + t * t)));
+ }
+
+ if (GSL_REAL (a) >= 0.0)
+ {
+ double ai = GSL_IMAG (a);
+ GSL_SET_COMPLEX (&z, w, ai / (2.0 * w));
+ }
+ else
+ {
+ double ai = GSL_IMAG (a);
+ double vi = (ai >= 0) ? w : -w;
+ GSL_SET_COMPLEX (&z, ai / (2.0 * vi), vi);
+ }
+ }
+
+ return z;
+}
+
+gsl_complex
+gsl_complex_sqrt_real (double x)
+{ /* z=sqrt(x) */
+ gsl_complex z;
+
+ if (x >= 0)
+ {
+ GSL_SET_COMPLEX (&z, sqrt (x), 0.0);
+ }
+ else
+ {
+ GSL_SET_COMPLEX (&z, 0.0, sqrt (-x));
+ }
+
+ return z;
+}
+
+gsl_complex
+gsl_complex_exp (gsl_complex a)
+{ /* z=exp(a) */
+ double rho = exp (GSL_REAL (a));
+ double theta = GSL_IMAG (a);
+
+ gsl_complex z;
+ GSL_SET_COMPLEX (&z, rho * cos (theta), rho * sin (theta));
+ return z;
+}
+
+gsl_complex
+gsl_complex_pow (gsl_complex a, gsl_complex b)
+{ /* z=a^b */
+ gsl_complex z;
+
+ if (GSL_REAL (a) == 0 && GSL_IMAG (a) == 0.0)
+ {
+ GSL_SET_COMPLEX (&z, 0.0, 0.0);
+ }
+ else
+ {
+ double logr = gsl_complex_logabs (a);
+ double theta = gsl_complex_arg (a);
+
+ double br = GSL_REAL (b), bi = GSL_IMAG (b);
+
+ double rho = exp (logr * br - bi * theta);
+ double beta = theta * br + bi * logr;
+
+ GSL_SET_COMPLEX (&z, rho * cos (beta), rho * sin (beta));
+ }
+
+ return z;
+}
+
+gsl_complex
+gsl_complex_pow_real (gsl_complex a, double b)
+{ /* z=a^b */
+ gsl_complex z;
+
+ if (GSL_REAL (a) == 0 && GSL_IMAG (a) == 0)
+ {
+ GSL_SET_COMPLEX (&z, 0, 0);
+ }
+ else
+ {
+ double logr = gsl_complex_logabs (a);
+ double theta = gsl_complex_arg (a);
+ double rho = exp (logr * b);
+ double beta = theta * b;
+ GSL_SET_COMPLEX (&z, rho * cos (beta), rho * sin (beta));
+ }
+
+ return z;
+}
+
+gsl_complex
+gsl_complex_log (gsl_complex a)
+{ /* z=log(a) */
+ double logr = gsl_complex_logabs (a);
+ double theta = gsl_complex_arg (a);
+
+ gsl_complex z;
+ GSL_SET_COMPLEX (&z, logr, theta);
+ return z;
+}
+
+gsl_complex
+gsl_complex_log10 (gsl_complex a)
+{ /* z = log10(a) */
+ return gsl_complex_mul_real (gsl_complex_log (a), 1 / log (10.));
+}
+
+gsl_complex
+gsl_complex_log_b (gsl_complex a, gsl_complex b)
+{
+ return gsl_complex_div (gsl_complex_log (a), gsl_complex_log (b));
+}
+
+/***********************************************************************
+ * Complex trigonometric functions
+ ***********************************************************************/
+
+gsl_complex
+gsl_complex_sin (gsl_complex a)
+{ /* z = sin(a) */
+ double R = GSL_REAL (a), I = GSL_IMAG (a);
+
+ gsl_complex z;
+
+ if (I == 0.0)
+ {
+ /* avoid returing negative zero (-0.0) for the imaginary part */
+
+ GSL_SET_COMPLEX (&z, sin (R), 0.0);
+ }
+ else
+ {
+ GSL_SET_COMPLEX (&z, sin (R) * cosh (I), cos (R) * sinh (I));
+ }
+
+ return z;
+}
+
+gsl_complex
+gsl_complex_cos (gsl_complex a)
+{ /* z = cos(a) */
+ double R = GSL_REAL (a), I = GSL_IMAG (a);
+
+ gsl_complex z;
+
+ if (I == 0.0)
+ {
+ /* avoid returing negative zero (-0.0) for the imaginary part */
+
+ GSL_SET_COMPLEX (&z, cos (R), 0.0);
+ }
+ else
+ {
+ GSL_SET_COMPLEX (&z, cos (R) * cosh (I), sin (R) * sinh (-I));
+ }
+
+ return z;
+}
+
+gsl_complex
+gsl_complex_tan (gsl_complex a)
+{ /* z = tan(a) */
+ double R = GSL_REAL (a), I = GSL_IMAG (a);
+
+ gsl_complex z;
+
+ if (fabs (I) < 1)
+ {
+ double D = pow (cos (R), 2.0) + pow (sinh (I), 2.0);
+
+ GSL_SET_COMPLEX (&z, 0.5 * sin (2 * R) / D, 0.5 * sinh (2 * I) / D);
+ }
+ else
+ {
+ double u = exp (-I);
+ double C = 2 * u / (1 - pow (u, 2.0));
+ double D = 1 + pow (cos (R), 2.0) * pow (C, 2.0);
+
+ double S = pow (C, 2.0);
+ double T = 1.0 / tanh (I);
+
+ GSL_SET_COMPLEX (&z, 0.5 * sin (2 * R) * S / D, T / D);
+ }
+
+ return z;
+}
+
+gsl_complex
+gsl_complex_sec (gsl_complex a)
+{ /* z = sec(a) */
+ gsl_complex z = gsl_complex_cos (a);
+ return gsl_complex_inverse (z);
+}
+
+gsl_complex
+gsl_complex_csc (gsl_complex a)
+{ /* z = csc(a) */
+ gsl_complex z = gsl_complex_sin (a);
+ return gsl_complex_inverse(z);
+}
+
+
+gsl_complex
+gsl_complex_cot (gsl_complex a)
+{ /* z = cot(a) */
+ gsl_complex z = gsl_complex_tan (a);
+ return gsl_complex_inverse (z);
+}
+
+/**********************************************************************
+ * Inverse Complex Trigonometric Functions
+ **********************************************************************/
+
+gsl_complex
+gsl_complex_arcsin (gsl_complex a)
+{ /* z = arcsin(a) */
+ double R = GSL_REAL (a), I = GSL_IMAG (a);
+ gsl_complex z;
+
+ if (I == 0)
+ {
+ z = gsl_complex_arcsin_real (R);
+ }
+ else
+ {
+ double x = fabs (R), y = fabs (I);
+ double r = hypot (x + 1, y), s = hypot (x - 1, y);
+ double A = 0.5 * (r + s);
+ double B = x / A;
+ double y2 = y * y;
+
+ double real, imag;
+
+ const double A_crossover = 1.5, B_crossover = 0.6417;
+
+ if (B <= B_crossover)
+ {
+ real = asin (B);
+ }
+ else
+ {
+ if (x <= 1)
+ {
+ double D = 0.5 * (A + x) * (y2 / (r + x + 1) + (s + (1 - x)));
+ real = atan (x / sqrt (D));
+ }
+ else
+ {
+ double Apx = A + x;
+ double D = 0.5 * (Apx / (r + x + 1) + Apx / (s + (x - 1)));
+ real = atan (x / (y * sqrt (D)));
+ }
+ }
+
+ if (A <= A_crossover)
+ {
+ double Am1;
+
+ if (x < 1)
+ {
+ Am1 = 0.5 * (y2 / (r + (x + 1)) + y2 / (s + (1 - x)));
+ }
+ else
+ {
+ Am1 = 0.5 * (y2 / (r + (x + 1)) + (s + (x - 1)));
+ }
+
+ imag = log1p (Am1 + sqrt (Am1 * (A + 1)));
+ }
+ else
+ {
+ imag = log (A + sqrt (A * A - 1));
+ }
+
+ GSL_SET_COMPLEX (&z, (R >= 0) ? real : -real, (I >= 0) ? imag : -imag);
+ }
+
+ return z;
+}
+
+gsl_complex
+gsl_complex_arcsin_real (double a)
+{ /* z = arcsin(a) */
+ gsl_complex z;
+
+ if (fabs (a) <= 1.0)
+ {
+ GSL_SET_COMPLEX (&z, asin (a), 0.0);
+ }
+ else
+ {
+ if (a < 0.0)
+ {
+ GSL_SET_COMPLEX (&z, -M_PI_2, acosh (-a));
+ }
+ else
+ {
+ GSL_SET_COMPLEX (&z, M_PI_2, -acosh (a));
+ }
+ }
+
+ return z;
+}
+
+gsl_complex
+gsl_complex_arccos (gsl_complex a)
+{ /* z = arccos(a) */
+ double R = GSL_REAL (a), I = GSL_IMAG (a);
+ gsl_complex z;
+
+ if (I == 0)
+ {
+ z = gsl_complex_arccos_real (R);
+ }
+ else
+ {
+ double x = fabs (R), y = fabs (I);
+ double r = hypot (x + 1, y), s = hypot (x - 1, y);
+ double A = 0.5 * (r + s);
+ double B = x / A;
+ double y2 = y * y;
+
+ double real, imag;
+
+ const double A_crossover = 1.5, B_crossover = 0.6417;
+
+ if (B <= B_crossover)
+ {
+ real = acos (B);
+ }
+ else
+ {
+ if (x <= 1)
+ {
+ double D = 0.5 * (A + x) * (y2 / (r + x + 1) + (s + (1 - x)));
+ real = atan (sqrt (D) / x);
+ }
+ else
+ {
+ double Apx = A + x;
+ double D = 0.5 * (Apx / (r + x + 1) + Apx / (s + (x - 1)));
+ real = atan ((y * sqrt (D)) / x);
+ }
+ }
+
+ if (A <= A_crossover)
+ {
+ double Am1;
+
+ if (x < 1)
+ {
+ Am1 = 0.5 * (y2 / (r + (x + 1)) + y2 / (s + (1 - x)));
+ }
+ else
+ {
+ Am1 = 0.5 * (y2 / (r + (x + 1)) + (s + (x - 1)));
+ }
+
+ imag = log1p (Am1 + sqrt (Am1 * (A + 1)));
+ }
+ else
+ {
+ imag = log (A + sqrt (A * A - 1));
+ }
+
+ GSL_SET_COMPLEX (&z, (R >= 0) ? real : M_PI - real, (I >= 0) ? -imag : imag);
+ }
+
+ return z;
+}
+
+gsl_complex
+gsl_complex_arccos_real (double a)
+{ /* z = arccos(a) */
+ gsl_complex z;
+
+ if (fabs (a) <= 1.0)
+ {
+ GSL_SET_COMPLEX (&z, acos (a), 0);
+ }
+ else
+ {
+ if (a < 0.0)
+ {
+ GSL_SET_COMPLEX (&z, M_PI, -acosh (-a));
+ }
+ else
+ {
+ GSL_SET_COMPLEX (&z, 0, acosh (a));
+ }
+ }
+
+ return z;
+}
+
+gsl_complex
+gsl_complex_arctan (gsl_complex a)
+{ /* z = arctan(a) */
+ double R = GSL_REAL (a), I = GSL_IMAG (a);
+ gsl_complex z;
+
+ if (I == 0)
+ {
+ GSL_SET_COMPLEX (&z, atan (R), 0);
+ }
+ else
+ {
+ /* FIXME: This is a naive implementation which does not fully
+ take into account cancellation errors, overflow, underflow
+ etc. It would benefit from the Hull et al treatment. */
+
+ double r = hypot (R, I);
+
+ double imag;
+
+ double u = 2 * I / (1 + r * r);
+
+ /* FIXME: the following cross-over should be optimized but 0.1
+ seems to work ok */
+
+ if (fabs (u) < 0.1)
+ {
+ imag = 0.25 * (log1p (u) - log1p (-u));
+ }
+ else
+ {
+ double A = hypot (R, I + 1);
+ double B = hypot (R, I - 1);
+ imag = 0.5 * log (A / B);
+ }
+
+ if (R == 0)
+ {
+ if (I > 1)
+ {
+ GSL_SET_COMPLEX (&z, M_PI_2, imag);
+ }
+ else if (I < -1)
+ {
+ GSL_SET_COMPLEX (&z, -M_PI_2, imag);
+ }
+ else
+ {
+ GSL_SET_COMPLEX (&z, 0, imag);
+ };
+ }
+ else
+ {
+ GSL_SET_COMPLEX (&z, 0.5 * atan2 (2 * R, ((1 + r) * (1 - r))), imag);
+ }
+ }
+
+ return z;
+}
+
+gsl_complex
+gsl_complex_arcsec (gsl_complex a)
+{ /* z = arcsec(a) */
+ gsl_complex z = gsl_complex_inverse (a);
+ return gsl_complex_arccos (z);
+}
+
+gsl_complex
+gsl_complex_arcsec_real (double a)
+{ /* z = arcsec(a) */
+ gsl_complex z;
+
+ if (a <= -1.0 || a >= 1.0)
+ {
+ GSL_SET_COMPLEX (&z, acos (1 / a), 0.0);
+ }
+ else
+ {
+ if (a >= 0.0)
+ {
+ GSL_SET_COMPLEX (&z, 0, acosh (1 / a));
+ }
+ else
+ {
+ GSL_SET_COMPLEX (&z, M_PI, -acosh (-1 / a));
+ }
+ }
+
+ return z;
+}
+
+gsl_complex
+gsl_complex_arccsc (gsl_complex a)
+{ /* z = arccsc(a) */
+ gsl_complex z = gsl_complex_inverse (a);
+ return gsl_complex_arcsin (z);
+}
+
+gsl_complex
+gsl_complex_arccsc_real (double a)
+{ /* z = arccsc(a) */
+ gsl_complex z;
+
+ if (a <= -1.0 || a >= 1.0)
+ {
+ GSL_SET_COMPLEX (&z, asin (1 / a), 0.0);
+ }
+ else
+ {
+ if (a >= 0.0)
+ {
+ GSL_SET_COMPLEX (&z, M_PI_2, -acosh (1 / a));
+ }
+ else
+ {
+ GSL_SET_COMPLEX (&z, -M_PI_2, acosh (-1 / a));
+ }
+ }
+
+ return z;
+}
+
+gsl_complex
+gsl_complex_arccot (gsl_complex a)
+{ /* z = arccot(a) */
+ gsl_complex z;
+
+ if (GSL_REAL (a) == 0.0 && GSL_IMAG (a) == 0.0)
+ {
+ GSL_SET_COMPLEX (&z, M_PI_2, 0);
+ }
+ else
+ {
+ z = gsl_complex_inverse (a);
+ z = gsl_complex_arctan (z);
+ }
+
+ return z;
+}
+
+/**********************************************************************
+ * Complex Hyperbolic Functions
+ **********************************************************************/
+
+gsl_complex
+gsl_complex_sinh (gsl_complex a)
+{ /* z = sinh(a) */
+ double R = GSL_REAL (a), I = GSL_IMAG (a);
+
+ gsl_complex z;
+ GSL_SET_COMPLEX (&z, sinh (R) * cos (I), cosh (R) * sin (I));
+ return z;
+}
+
+gsl_complex
+gsl_complex_cosh (gsl_complex a)
+{ /* z = cosh(a) */
+ double R = GSL_REAL (a), I = GSL_IMAG (a);
+
+ gsl_complex z;
+ GSL_SET_COMPLEX (&z, cosh (R) * cos (I), sinh (R) * sin (I));
+ return z;
+}
+
+gsl_complex
+gsl_complex_tanh (gsl_complex a)
+{ /* z = tanh(a) */
+ double R = GSL_REAL (a), I = GSL_IMAG (a);
+
+ gsl_complex z;
+
+ if (fabs(R) < 1.0)
+ {
+ double D = pow (cos (I), 2.0) + pow (sinh (R), 2.0);
+
+ GSL_SET_COMPLEX (&z, sinh (R) * cosh (R) / D, 0.5 * sin (2 * I) / D);
+ }
+ else
+ {
+ double D = pow (cos (I), 2.0) + pow (sinh (R), 2.0);
+ double F = 1 + pow (cos (I) / sinh (R), 2.0);
+
+ GSL_SET_COMPLEX (&z, 1.0 / (tanh (R) * F), 0.5 * sin (2 * I) / D);
+ }
+
+ return z;
+}
+
+gsl_complex
+gsl_complex_sech (gsl_complex a)
+{ /* z = sech(a) */
+ gsl_complex z = gsl_complex_cosh (a);
+ return gsl_complex_inverse (z);
+}
+
+gsl_complex
+gsl_complex_csch (gsl_complex a)
+{ /* z = csch(a) */
+ gsl_complex z = gsl_complex_sinh (a);
+ return gsl_complex_inverse (z);
+}
+
+gsl_complex
+gsl_complex_coth (gsl_complex a)
+{ /* z = coth(a) */
+ gsl_complex z = gsl_complex_tanh (a);
+ return gsl_complex_inverse (z);
+}
+
+/**********************************************************************
+ * Inverse Complex Hyperbolic Functions
+ **********************************************************************/
+
+gsl_complex
+gsl_complex_arcsinh (gsl_complex a)
+{ /* z = arcsinh(a) */
+ gsl_complex z = gsl_complex_mul_imag(a, 1.0);
+ z = gsl_complex_arcsin (z);
+ z = gsl_complex_mul_imag (z, -1.0);
+ return z;
+}
+
+gsl_complex
+gsl_complex_arccosh (gsl_complex a)
+{ /* z = arccosh(a) */
+ gsl_complex z = gsl_complex_arccos (a);
+ z = gsl_complex_mul_imag (z, GSL_IMAG(z) > 0 ? -1.0 : 1.0);
+ return z;
+}
+
+gsl_complex
+gsl_complex_arccosh_real (double a)
+{ /* z = arccosh(a) */
+ gsl_complex z;
+
+ if (a >= 1)
+ {
+ GSL_SET_COMPLEX (&z, acosh (a), 0);
+ }
+ else
+ {
+ if (a >= -1.0)
+ {
+ GSL_SET_COMPLEX (&z, 0, acos (a));
+ }
+ else
+ {
+ GSL_SET_COMPLEX (&z, acosh (-a), M_PI);
+ }
+ }
+
+ return z;
+}
+
+gsl_complex
+gsl_complex_arctanh (gsl_complex a)
+{ /* z = arctanh(a) */
+ if (GSL_IMAG (a) == 0.0)
+ {
+ return gsl_complex_arctanh_real (GSL_REAL (a));
+ }
+ else
+ {
+ gsl_complex z = gsl_complex_mul_imag(a, 1.0);
+ z = gsl_complex_arctan (z);
+ z = gsl_complex_mul_imag (z, -1.0);
+ return z;
+ }
+}
+
+gsl_complex
+gsl_complex_arctanh_real (double a)
+{ /* z = arctanh(a) */
+ gsl_complex z;
+
+ if (a > -1.0 && a < 1.0)
+ {
+ GSL_SET_COMPLEX (&z, atanh (a), 0);
+ }
+ else
+ {
+ GSL_SET_COMPLEX (&z, atanh (1 / a), (a < 0) ? M_PI_2 : -M_PI_2);
+ }
+
+ return z;
+}
+
+gsl_complex
+gsl_complex_arcsech (gsl_complex a)
+{ /* z = arcsech(a); */
+ gsl_complex t = gsl_complex_inverse (a);
+ return gsl_complex_arccosh (t);
+}
+
+gsl_complex
+gsl_complex_arccsch (gsl_complex a)
+{ /* z = arccsch(a) */
+ gsl_complex t = gsl_complex_inverse (a);
+ return gsl_complex_arcsinh (t);
+}
+
+gsl_complex
+gsl_complex_arccoth (gsl_complex a)
+{ /* z = arccoth(a) */
+ gsl_complex t = gsl_complex_inverse (a);
+ return gsl_complex_arctanh (t);
+}
diff --git a/gsl-1.9/complex/results.h b/gsl-1.9/complex/results.h
new file mode 100644
index 0000000..a8eafee
--- /dev/null
+++ b/gsl-1.9/complex/results.h
@@ -0,0 +1,4573 @@
+ {FN (sqrt), ARG(0.0e+00,0.0e+00), RES(0e0, 0.0)},
+ {FN (sqrt), ARG(0.0e+00,1.19209289550781250e-07), RES(2.44140625e-4, 2.44140625e-4)},
+ {FN (sqrt), ARG(0.0e+00,-1.19209289550781250e-07), RES(2.44140625e-4, -2.44140625e-4)},
+ {FN (sqrt), ARG(0.0e+00,5.0e-01), RES(5e-1, 5e-1)},
+ {FN (sqrt), ARG(0.0e+00,-5.0e-01), RES(5e-1, -5e-1)},
+ {FN (sqrt), ARG(0.0e+00,1.0e+00), RES(7.0710678118654752440e-1, 7.0710678118654752440e-1)},
+ {FN (sqrt), ARG(0.0e+00,-1.0e+00), RES(7.0710678118654752440e-1, -7.0710678118654752440e-1)},
+ {FN (sqrt), ARG(0.0e+00,2.0e+00), RES(1, 1)},
+ {FN (sqrt), ARG(0.0e+00,-2.0e+00), RES(1, -1)},
+ {FN (sqrt), ARG(0.0e+00,8.3886080e+06), RES(2048, 2048)},
+ {FN (sqrt), ARG(0.0e+00,-8.3886080e+06), RES(2048, -2048)},
+ {FN (sqrt), ARG(1.19209289550781250e-07,0.0e+00), RES(3.4526698300124390840e-4, 0.0)},
+ {FN (sqrt), ARG(-1.19209289550781250e-07,0.0e+00), RES(0, 3.4526698300124390840e-4)},
+ {FN (sqrt), ARG(1.19209289550781250e-07,1.19209289550781250e-07), RES(3.7933934912842707699e-4, 1.5712750315077700799e-4)},
+ {FN (sqrt), ARG(1.19209289550781250e-07,-1.19209289550781250e-07), RES(3.7933934912842707699e-4, -1.5712750315077700799e-4)},
+ {FN (sqrt), ARG(-1.19209289550781250e-07,1.19209289550781250e-07), RES(1.5712750315077700799e-4, 3.7933934912842707699e-4)},
+ {FN (sqrt), ARG(-1.19209289550781250e-07,-1.19209289550781250e-07), RES(1.5712750315077700799e-4, -3.7933934912842707699e-4)},
+ {FN (sqrt), ARG(1.19209289550781250e-07,5.0e-01), RES(5.0000005960464832810e-1, 4.9999994039535877732e-1)},
+ {FN (sqrt), ARG(1.19209289550781250e-07,-5.0e-01), RES(5.0000005960464832810e-1, -4.9999994039535877732e-1)},
+ {FN (sqrt), ARG(-1.19209289550781250e-07,5.0e-01), RES(4.9999994039535877732e-1, 5.0000005960464832810e-1)},
+ {FN (sqrt), ARG(-1.19209289550781250e-07,-5.0e-01), RES(4.9999994039535877732e-1, -5.0000005960464832810e-1)},
+ {FN (sqrt), ARG(1.19209289550781250e-07,1.0e+00), RES(7.0710682333339729137e-1, 7.0710673903970026958e-1)},
+ {FN (sqrt), ARG(1.19209289550781250e-07,-1.0e+00), RES(7.0710682333339729137e-1, -7.0710673903970026958e-1)},
+ {FN (sqrt), ARG(-1.19209289550781250e-07,1.0e+00), RES(7.0710673903970026958e-1, 7.0710682333339729137e-1)},
+ {FN (sqrt), ARG(-1.19209289550781250e-07,-1.0e+00), RES(7.0710673903970026958e-1, -7.0710682333339729137e-1)},
+ {FN (sqrt), ARG(1.19209289550781250e-07,2.0e+00), RES(1.0000000298023228318e0, 9.9999997019767805639e-1)},
+ {FN (sqrt), ARG(1.19209289550781250e-07,-2.0e+00), RES(1.0000000298023228318e0, -9.9999997019767805639e-1)},
+ {FN (sqrt), ARG(-1.19209289550781250e-07,2.0e+00), RES(9.9999997019767805639e-1, 1.0000000298023228318e0)},
+ {FN (sqrt), ARG(-1.19209289550781250e-07,-2.0e+00), RES(9.9999997019767805639e-1, -1.0000000298023228318e0)},
+ {FN (sqrt), ARG(1.19209289550781250e-07,8.3886080e+06), RES(2.0480000000000145519e3, 2.0479999999999854481e3)},
+ {FN (sqrt), ARG(1.19209289550781250e-07,-8.3886080e+06), RES(2.0480000000000145519e3, -2.0479999999999854481e3)},
+ {FN (sqrt), ARG(-1.19209289550781250e-07,8.3886080e+06), RES(2.0479999999999854481e3, 2.0480000000000145519e3)},
+ {FN (sqrt), ARG(-1.19209289550781250e-07,-8.3886080e+06), RES(2.0479999999999854481e3, -2.0480000000000145519e3)},
+ {FN (sqrt), ARG(5.0e-01,0.0e+00), RES(7.0710678118654752440e-1, 0.0)},
+ {FN (sqrt), ARG(-5.0e-01,0.0e+00), RES(0, 7.0710678118654752440e-1)},
+ {FN (sqrt), ARG(5.0e-01,1.19209289550781250e-07), RES(7.0710678118655254870e-1, 8.4293697021787464631e-8)},
+ {FN (sqrt), ARG(5.0e-01,-1.19209289550781250e-07), RES(7.0710678118655254870e-1, -8.4293697021787464631e-8)},
+ {FN (sqrt), ARG(-5.0e-01,1.19209289550781250e-07), RES(8.4293697021787464631e-8, 7.0710678118655254870e-1)},
+ {FN (sqrt), ARG(-5.0e-01,-1.19209289550781250e-07), RES(8.4293697021787464631e-8, -7.0710678118655254870e-1)},
+ {FN (sqrt), ARG(5.0e-01,5.0e-01), RES(7.7688698701501865367e-1, 3.2179712645279131237e-1)},
+ {FN (sqrt), ARG(5.0e-01,-5.0e-01), RES(7.7688698701501865367e-1, -3.2179712645279131237e-1)},
+ {FN (sqrt), ARG(-5.0e-01,5.0e-01), RES(3.2179712645279131237e-1, 7.7688698701501865367e-1)},
+ {FN (sqrt), ARG(-5.0e-01,-5.0e-01), RES(3.2179712645279131237e-1, -7.7688698701501865367e-1)},
+ {FN (sqrt), ARG(5.0e-01,1.0e+00), RES(8.9945371997393363613e-1, 5.5589297025142117199e-1)},
+ {FN (sqrt), ARG(5.0e-01,-1.0e+00), RES(8.9945371997393363613e-1, -5.5589297025142117199e-1)},
+ {FN (sqrt), ARG(-5.0e-01,1.0e+00), RES(5.5589297025142117199e-1, 8.9945371997393363613e-1)},
+ {FN (sqrt), ARG(-5.0e-01,-1.0e+00), RES(5.5589297025142117199e-1, -8.9945371997393363613e-1)},
+ {FN (sqrt), ARG(5.0e-01,2.0e+00), RES(1.1317139242778694103e0, 8.8361553087551326576e-1)},
+ {FN (sqrt), ARG(5.0e-01,-2.0e+00), RES(1.1317139242778694103e0, -8.8361553087551326576e-1)},
+ {FN (sqrt), ARG(-5.0e-01,2.0e+00), RES(8.8361553087551326576e-1, 1.1317139242778694103e0)},
+ {FN (sqrt), ARG(-5.0e-01,-2.0e+00), RES(8.8361553087551326576e-1, -1.1317139242778694103e0)},
+ {FN (sqrt), ARG(5.0e-01,8.3886080e+06), RES(2.0480000610351571595e3, 2.0479999389648446595e3)},
+ {FN (sqrt), ARG(5.0e-01,-8.3886080e+06), RES(2.0480000610351571595e3, -2.0479999389648446595e3)},
+ {FN (sqrt), ARG(-5.0e-01,8.3886080e+06), RES(2.0479999389648446595e3, 2.0480000610351571595e3)},
+ {FN (sqrt), ARG(-5.0e-01,-8.3886080e+06), RES(2.0479999389648446595e3, -2.0480000610351571595e3)},
+ {FN (sqrt), ARG(1.0e+00,0.0e+00), RES(1e0, 0.0)},
+ {FN (sqrt), ARG(-1.0e+00,0.0e+00), RES(0, 1)},
+ {FN (sqrt), ARG(1.0e+00,1.19209289550781250e-07), RES(1.0000000000000017764e0, 5.9604644775390519121e-8)},
+ {FN (sqrt), ARG(1.0e+00,-1.19209289550781250e-07), RES(1.0000000000000017764e0, -5.9604644775390519121e-8)},
+ {FN (sqrt), ARG(-1.0e+00,1.19209289550781250e-07), RES(5.9604644775390519121e-8, 1.0000000000000017764e0)},
+ {FN (sqrt), ARG(-1.0e+00,-1.19209289550781250e-07), RES(5.9604644775390519121e-8, -1.0000000000000017764e0)},
+ {FN (sqrt), ARG(1.0e+00,5.0e-01), RES(1.0290855136357461252e0, 2.4293413587832283909e-1)},
+ {FN (sqrt), ARG(1.0e+00,-5.0e-01), RES(1.0290855136357461252e0, -2.4293413587832283909e-1)},
+ {FN (sqrt), ARG(-1.0e+00,5.0e-01), RES(2.4293413587832283909e-1, 1.0290855136357461252e0)},
+ {FN (sqrt), ARG(-1.0e+00,-5.0e-01), RES(2.4293413587832283909e-1, -1.0290855136357461252e0)},
+ {FN (sqrt), ARG(1.0e+00,1.0e+00), RES(1.0986841134678099660e0, 4.5508986056222734130e-1)},
+ {FN (sqrt), ARG(1.0e+00,-1.0e+00), RES(1.0986841134678099660e0, -4.5508986056222734130e-1)},
+ {FN (sqrt), ARG(-1.0e+00,1.0e+00), RES(4.5508986056222734130e-1, 1.0986841134678099660e0)},
+ {FN (sqrt), ARG(-1.0e+00,-1.0e+00), RES(4.5508986056222734130e-1, -1.0986841134678099660e0)},
+ {FN (sqrt), ARG(1.0e+00,2.0e+00), RES(1.2720196495140689643e0, 7.8615137775742328607e-1)},
+ {FN (sqrt), ARG(1.0e+00,-2.0e+00), RES(1.2720196495140689643e0, -7.8615137775742328607e-1)},
+ {FN (sqrt), ARG(-1.0e+00,2.0e+00), RES(7.8615137775742328607e-1, 1.2720196495140689643e0)},
+ {FN (sqrt), ARG(-1.0e+00,-2.0e+00), RES(7.8615137775742328607e-1, -1.2720196495140689643e0)},
+ {FN (sqrt), ARG(1.0e+00,8.3886080e+06), RES(2.0480001220703161380e3, 2.0479998779296911380e3)},
+ {FN (sqrt), ARG(1.0e+00,-8.3886080e+06), RES(2.0480001220703161380e3, -2.0479998779296911380e3)},
+ {FN (sqrt), ARG(-1.0e+00,8.3886080e+06), RES(2.0479998779296911380e3, 2.0480001220703161380e3)},
+ {FN (sqrt), ARG(-1.0e+00,-8.3886080e+06), RES(2.0479998779296911380e3, -2.0480001220703161380e3)},
+ {FN (sqrt), ARG(2.0e+00,0.0e+00), RES(1.4142135623730950488e0, 0.0)},
+ {FN (sqrt), ARG(-2.0e+00,0.0e+00), RES(0, 1.4142135623730950488e0)},
+ {FN (sqrt), ARG(2.0e+00,1.19209289550781250e-07), RES(1.4142135623730956768e0, 4.2146848510894013070e-8)},
+ {FN (sqrt), ARG(2.0e+00,-1.19209289550781250e-07), RES(1.4142135623730956768e0, -4.2146848510894013070e-8)},
+ {FN (sqrt), ARG(-2.0e+00,1.19209289550781250e-07), RES(4.2146848510894013070e-8, 1.4142135623730956768e0)},
+ {FN (sqrt), ARG(-2.0e+00,-1.19209289550781250e-07), RES(4.2146848510894013070e-8, -1.4142135623730956768e0)},
+ {FN (sqrt), ARG(2.0e+00,5.0e-01), RES(1.4250531240639470060e0, 1.7543205637629383228e-1)},
+ {FN (sqrt), ARG(2.0e+00,-5.0e-01), RES(1.4250531240639470060e0, -1.7543205637629383228e-1)},
+ {FN (sqrt), ARG(-2.0e+00,5.0e-01), RES(1.7543205637629383228e-1, 1.4250531240639470060e0)},
+ {FN (sqrt), ARG(-2.0e+00,-5.0e-01), RES(1.7543205637629383228e-1, -1.4250531240639470060e0)},
+ {FN (sqrt), ARG(2.0e+00,1.0e+00), RES(1.4553466902253548081e0, 3.4356074972251246414e-1)},
+ {FN (sqrt), ARG(2.0e+00,-1.0e+00), RES(1.4553466902253548081e0, -3.4356074972251246414e-1)},
+ {FN (sqrt), ARG(-2.0e+00,1.0e+00), RES(3.4356074972251246414e-1, 1.4553466902253548081e0)},
+ {FN (sqrt), ARG(-2.0e+00,-1.0e+00), RES(3.4356074972251246414e-1, -1.4553466902253548081e0)},
+ {FN (sqrt), ARG(2.0e+00,2.0e+00), RES(1.5537739740300373073e0, 6.4359425290558262474e-1)},
+ {FN (sqrt), ARG(2.0e+00,-2.0e+00), RES(1.5537739740300373073e0, -6.4359425290558262474e-1)},
+ {FN (sqrt), ARG(-2.0e+00,2.0e+00), RES(6.4359425290558262474e-1, 1.5537739740300373073e0)},
+ {FN (sqrt), ARG(-2.0e+00,-2.0e+00), RES(6.4359425290558262474e-1, -1.5537739740300373073e0)},
+ {FN (sqrt), ARG(2.0e+00,8.3886080e+06), RES(2.0480002441406395519e3, 2.0479997558593895519e3)},
+ {FN (sqrt), ARG(2.0e+00,-8.3886080e+06), RES(2.0480002441406395519e3, -2.0479997558593895519e3)},
+ {FN (sqrt), ARG(-2.0e+00,8.3886080e+06), RES(2.0479997558593895519e3, 2.0480002441406395519e3)},
+ {FN (sqrt), ARG(-2.0e+00,-8.3886080e+06), RES(2.0479997558593895519e3, -2.0480002441406395519e3)},
+ {FN (sqrt), ARG(8.3886080e+06,0.0e+00), RES(2.8963093757400986599e3, 0.0)},
+ {FN (sqrt), ARG(-8.3886080e+06,0.0e+00), RES(0, 2.8963093757400986599e3)},
+ {FN (sqrt), ARG(8.3886080e+06,1.19209289550781250e-07), RES(2.8963093757400986599e3, 2.0579515874459976458e-11)},
+ {FN (sqrt), ARG(8.3886080e+06,-1.19209289550781250e-07), RES(2.8963093757400986599e3, -2.0579515874459976458e-11)},
+ {FN (sqrt), ARG(-8.3886080e+06,1.19209289550781250e-07), RES(2.0579515874459976458e-11, 2.8963093757400986599e3)},
+ {FN (sqrt), ARG(-8.3886080e+06,-1.19209289550781250e-07), RES(2.0579515874459976458e-11, -2.8963093757400986599e3)},
+ {FN (sqrt), ARG(8.3886080e+06,5.0e-01), RES(2.8963093757400999462e3, 8.6316745750310938767e-5)},
+ {FN (sqrt), ARG(8.3886080e+06,-5.0e-01), RES(2.8963093757400999462e3, -8.6316745750310938767e-5)},
+ {FN (sqrt), ARG(-8.3886080e+06,5.0e-01), RES(8.6316745750310938767e-5, 2.8963093757400999462e3)},
+ {FN (sqrt), ARG(-8.3886080e+06,-5.0e-01), RES(8.6316745750310938767e-5, -2.8963093757400999462e3)},
+ {FN (sqrt), ARG(8.3886080e+06,1.0e+00), RES(2.8963093757401038048e3, 1.7263349150062164754e-4)},
+ {FN (sqrt), ARG(8.3886080e+06,-1.0e+00), RES(2.8963093757401038048e3, -1.7263349150062164754e-4)},
+ {FN (sqrt), ARG(-8.3886080e+06,1.0e+00), RES(1.7263349150062164754e-4, 2.8963093757401038048e3)},
+ {FN (sqrt), ARG(-8.3886080e+06,-1.0e+00), RES(1.7263349150062164754e-4, -2.8963093757401038048e3)},
+ {FN (sqrt), ARG(8.3886080e+06,2.0e+00), RES(2.8963093757401192395e3, 3.4526698300124145513e-4)},
+ {FN (sqrt), ARG(8.3886080e+06,-2.0e+00), RES(2.8963093757401192395e3, -3.4526698300124145513e-4)},
+ {FN (sqrt), ARG(-8.3886080e+06,2.0e+00), RES(3.4526698300124145513e-4, 2.8963093757401192395e3)},
+ {FN (sqrt), ARG(-8.3886080e+06,-2.0e+00), RES(3.4526698300124145513e-4, -2.8963093757401192395e3)},
+ {FN (sqrt), ARG(8.3886080e+06,8.3886080e+06), RES(3.1821290988135164054e3, 1.3180810299506332155e3)},
+ {FN (sqrt), ARG(8.3886080e+06,-8.3886080e+06), RES(3.1821290988135164054e3, -1.3180810299506332155e3)},
+ {FN (sqrt), ARG(-8.3886080e+06,8.3886080e+06), RES(1.3180810299506332155e3, 3.1821290988135164054e3)},
+ {FN (sqrt), ARG(-8.3886080e+06,-8.3886080e+06), RES(1.3180810299506332155e3, -3.1821290988135164054e3)},
+ {FN (log), ARG(1.19209289550781250e-07,0.0e+00), RES(-1.5942385152878742117e1, 0.0)},
+ {FN (log), ARG(-1.19209289550781250e-07,0.0e+00), RES(-1.5942385152878742117e1, 3.1415926535897932385e0)},
+ {FN (log), ARG(1.19209289550781250e-07,1.19209289550781250e-07), RES(-1.5595811562598769462e1, 7.8539816339744830962e-1)},
+ {FN (log), ARG(1.19209289550781250e-07,-1.19209289550781250e-07), RES(-1.5595811562598769462e1, -7.8539816339744830962e-1)},
+ {FN (log), ARG(-1.19209289550781250e-07,1.19209289550781250e-07), RES(-1.5595811562598769462e1, 2.3561944901923449288e0)},
+ {FN (log), ARG(-1.19209289550781250e-07,-1.19209289550781250e-07), RES(-1.5595811562598769462e1, -2.3561944901923449288e0)},
+ {FN (log), ARG(1.19209289550781250e-07,5.0e-01), RES(-6.9314718055991688771e-1, 1.5707960883763175177e0)},
+ {FN (log), ARG(1.19209289550781250e-07,-5.0e-01), RES(-6.9314718055991688771e-1, -1.5707960883763175177e0)},
+ {FN (log), ARG(-1.19209289550781250e-07,5.0e-01), RES(-6.9314718055991688771e-1, 1.5707965652134757208e0)},
+ {FN (log), ARG(-1.19209289550781250e-07,-5.0e-01), RES(-6.9314718055991688771e-1, -1.5707965652134757208e0)},
+ {FN (log), ARG(1.19209289550781250e-07,1.0e+00), RES(7.1054273576009513716e-15, 1.5707962075856070685e0)},
+ {FN (log), ARG(1.19209289550781250e-07,-1.0e+00), RES(7.1054273576009513716e-15, -1.5707962075856070685e0)},
+ {FN (log), ARG(-1.19209289550781250e-07,1.0e+00), RES(7.1054273576009513716e-15, 1.570796446004186170e0)},
+ {FN (log), ARG(-1.19209289550781250e-07,-1.0e+00), RES(7.1054273576009513716e-15, -1.570796446004186170e0)},
+ {FN (log), ARG(1.19209289550781250e-07,2.0e+00), RES(6.9314718055994708577e-1, 1.5707962671902518438e0)},
+ {FN (log), ARG(1.19209289550781250e-07,-2.0e+00), RES(6.9314718055994708577e-1, -1.5707962671902518438e0)},
+ {FN (log), ARG(-1.19209289550781250e-07,2.0e+00), RES(6.9314718055994708577e-1, 1.5707963863995413946e0)},
+ {FN (log), ARG(-1.19209289550781250e-07,-2.0e+00), RES(6.9314718055994708577e-1, -1.5707963863995413946e0)},
+ {FN (log), ARG(1.19209289550781250e-07,8.3886080e+06), RES(1.5942385152878742117e1, 1.5707963267948824084e0)},
+ {FN (log), ARG(1.19209289550781250e-07,-8.3886080e+06), RES(1.5942385152878742117e1, -1.5707963267948824084e0)},
+ {FN (log), ARG(-1.19209289550781250e-07,8.3886080e+06), RES(1.5942385152878742117e1, 1.5707963267949108301e0)},
+ {FN (log), ARG(-1.19209289550781250e-07,-8.3886080e+06), RES(1.5942385152878742117e1, -1.5707963267949108301e0)},
+ {FN (log), ARG(5.0e-01,0.0e+00), RES(-6.9314718055994530942e-1, 0.0)},
+ {FN (log), ARG(-5.0e-01,0.0e+00), RES(-6.9314718055994530942e-1, 3.1415926535897932385e0)},
+ {FN (log), ARG(5.0e-01,1.19209289550781250e-07), RES(-6.9314718055991688771e-1, 2.3841857910155798249e-7)},
+ {FN (log), ARG(5.0e-01,-1.19209289550781250e-07), RES(-6.9314718055991688771e-1, -2.3841857910155798249e-7)},
+ {FN (log), ARG(-5.0e-01,1.19209289550781250e-07), RES(-6.9314718055991688771e-1, 3.1415924151712141369e0)},
+ {FN (log), ARG(-5.0e-01,-1.19209289550781250e-07), RES(-6.9314718055991688771e-1, -3.1415924151712141369e0)},
+ {FN (log), ARG(5.0e-01,5.0e-01), RES(-3.4657359027997265471e-1, 7.8539816339744830962e-1)},
+ {FN (log), ARG(5.0e-01,-5.0e-01), RES(-3.4657359027997265471e-1, -7.8539816339744830962e-1)},
+ {FN (log), ARG(-5.0e-01,5.0e-01), RES(-3.4657359027997265471e-1, 2.3561944901923449288e0)},
+ {FN (log), ARG(-5.0e-01,-5.0e-01), RES(-3.4657359027997265471e-1, -2.3561944901923449288e0)},
+ {FN (log), ARG(5.0e-01,1.0e+00), RES(1.1157177565710487788e-1, 1.1071487177940905030e0)},
+ {FN (log), ARG(5.0e-01,-1.0e+00), RES(1.1157177565710487788e-1, -1.1071487177940905030e0)},
+ {FN (log), ARG(-5.0e-01,1.0e+00), RES(1.1157177565710487788e-1, 2.0344439357957027354e0)},
+ {FN (log), ARG(-5.0e-01,-1.0e+00), RES(1.1157177565710487788e-1, -2.0344439357957027354e0)},
+ {FN (log), ARG(5.0e-01,2.0e+00), RES(7.2345949146816273071e-1, 1.3258176636680324651e0)},
+ {FN (log), ARG(5.0e-01,-2.0e+00), RES(7.2345949146816273071e-1, -1.3258176636680324651e0)},
+ {FN (log), ARG(-5.0e-01,2.0e+00), RES(7.2345949146816273071e-1, 1.8157749899217607734e0)},
+ {FN (log), ARG(-5.0e-01,-2.0e+00), RES(7.2345949146816273071e-1, -1.8157749899217607734e0)},
+ {FN (log), ARG(5.0e-01,8.3886080e+06), RES(1.5942385152878743893e1, 1.5707962671902518438e0)},
+ {FN (log), ARG(5.0e-01,-8.3886080e+06), RES(1.5942385152878743893e1, -1.5707962671902518438e0)},
+ {FN (log), ARG(-5.0e-01,8.3886080e+06), RES(1.5942385152878743893e1, 1.5707963863995413946e0)},
+ {FN (log), ARG(-5.0e-01,-8.3886080e+06), RES(1.5942385152878743893e1, -1.5707963863995413946e0)},
+ {FN (log), ARG(1.0e+00,0.0e+00), RES(0e0, 0.0)},
+ {FN (log), ARG(-1.0e+00,0.0e+00), RES(0, 3.1415926535897932385e0)},
+ {FN (log), ARG(1.0e+00,1.19209289550781250e-07), RES(7.1054273576009513716e-15, 1.1920928955078068531e-7)},
+ {FN (log), ARG(1.0e+00,-1.19209289550781250e-07), RES(7.1054273576009513716e-15, -1.1920928955078068531e-7)},
+ {FN (log), ARG(-1.0e+00,1.19209289550781250e-07), RES(7.1054273576009513716e-15, 3.1415925343805036877e0)},
+ {FN (log), ARG(-1.0e+00,-1.19209289550781250e-07), RES(7.1054273576009513716e-15, -3.1415925343805036877e0)},
+ {FN (log), ARG(1.0e+00,5.0e-01), RES(1.1157177565710487788e-1, 4.6364760900080611621e-1)},
+ {FN (log), ARG(1.0e+00,-5.0e-01), RES(1.1157177565710487788e-1, -4.6364760900080611621e-1)},
+ {FN (log), ARG(-1.0e+00,5.0e-01), RES(1.1157177565710487788e-1, 2.6779450445889871222e0)},
+ {FN (log), ARG(-1.0e+00,-5.0e-01), RES(1.1157177565710487788e-1, -2.6779450445889871222e0)},
+ {FN (log), ARG(1.0e+00,1.0e+00), RES(3.4657359027997265471e-1, 7.8539816339744830962e-1)},
+ {FN (log), ARG(1.0e+00,-1.0e+00), RES(3.4657359027997265471e-1, -7.8539816339744830962e-1)},
+ {FN (log), ARG(-1.0e+00,1.0e+00), RES(3.4657359027997265471e-1, 2.3561944901923449288e0)},
+ {FN (log), ARG(-1.0e+00,-1.0e+00), RES(3.4657359027997265471e-1, -2.3561944901923449288e0)},
+ {FN (log), ARG(1.0e+00,2.0e+00), RES(8.0471895621705018730e-1, 1.1071487177940905030e0)},
+ {FN (log), ARG(1.0e+00,-2.0e+00), RES(8.0471895621705018730e-1, -1.1071487177940905030e0)},
+ {FN (log), ARG(-1.0e+00,2.0e+00), RES(8.0471895621705018730e-1, 2.0344439357957027354e0)},
+ {FN (log), ARG(-1.0e+00,-2.0e+00), RES(8.0471895621705018730e-1, -2.0344439357957027354e0)},
+ {FN (log), ARG(1.0e+00,8.3886080e+06), RES(1.5942385152878749222e1, 1.5707962075856070685e0)},
+ {FN (log), ARG(1.0e+00,-8.3886080e+06), RES(1.5942385152878749222e1, -1.5707962075856070685e0)},
+ {FN (log), ARG(-1.0e+00,8.3886080e+06), RES(1.5942385152878749222e1, 1.570796446004186170e0)},
+ {FN (log), ARG(-1.0e+00,-8.3886080e+06), RES(1.5942385152878749222e1, -1.570796446004186170e0)},
+ {FN (log), ARG(2.0e+00,0.0e+00), RES(6.9314718055994530942e-1, 0.0)},
+ {FN (log), ARG(-2.0e+00,0.0e+00), RES(6.9314718055994530942e-1, 3.1415926535897932385e0)},
+ {FN (log), ARG(2.0e+00,1.19209289550781250e-07), RES(6.9314718055994708577e-1, 5.9604644775390554414e-8)},
+ {FN (log), ARG(2.0e+00,-1.19209289550781250e-07), RES(6.9314718055994708577e-1, -5.9604644775390554414e-8)},
+ {FN (log), ARG(-2.0e+00,1.19209289550781250e-07), RES(6.9314718055994708577e-1, 3.1415925939851484631e0)},
+ {FN (log), ARG(-2.0e+00,-1.19209289550781250e-07), RES(6.9314718055994708577e-1, -3.1415925939851484631e0)},
+ {FN (log), ARG(2.0e+00,5.0e-01), RES(7.2345949146816273071e-1, 2.4497866312686415417e-1)},
+ {FN (log), ARG(2.0e+00,-5.0e-01), RES(7.2345949146816273071e-1, -2.4497866312686415417e-1)},
+ {FN (log), ARG(-2.0e+00,5.0e-01), RES(7.2345949146816273071e-1, 2.8966139904629290843e0)},
+ {FN (log), ARG(-2.0e+00,-5.0e-01), RES(7.2345949146816273071e-1, -2.8966139904629290843e0)},
+ {FN (log), ARG(2.0e+00,1.0e+00), RES(8.0471895621705018730e-1, 4.6364760900080611621e-1)},
+ {FN (log), ARG(2.0e+00,-1.0e+00), RES(8.0471895621705018730e-1, -4.6364760900080611621e-1)},
+ {FN (log), ARG(-2.0e+00,1.0e+00), RES(8.0471895621705018730e-1, 2.6779450445889871222e0)},
+ {FN (log), ARG(-2.0e+00,-1.0e+00), RES(8.0471895621705018730e-1, -2.6779450445889871222e0)},
+ {FN (log), ARG(2.0e+00,2.0e+00), RES(1.0397207708399179641e0, 7.8539816339744830962e-1)},
+ {FN (log), ARG(2.0e+00,-2.0e+00), RES(1.0397207708399179641e0, -7.8539816339744830962e-1)},
+ {FN (log), ARG(-2.0e+00,2.0e+00), RES(1.0397207708399179641e0, 2.3561944901923449288e0)},
+ {FN (log), ARG(-2.0e+00,-2.0e+00), RES(1.0397207708399179641e0, -2.3561944901923449288e0)},
+ {FN (log), ARG(2.0e+00,8.3886080e+06), RES(1.5942385152878770538e1, 1.5707960883763175177e0)},
+ {FN (log), ARG(2.0e+00,-8.3886080e+06), RES(1.5942385152878770538e1, -1.5707960883763175177e0)},
+ {FN (log), ARG(-2.0e+00,8.3886080e+06), RES(1.5942385152878770538e1, 1.5707965652134757208e0)},
+ {FN (log), ARG(-2.0e+00,-8.3886080e+06), RES(1.5942385152878770538e1, -1.5707965652134757208e0)},
+ {FN (log), ARG(8.3886080e+06,0.0e+00), RES(1.5942385152878742117e1, 0.0)},
+ {FN (log), ARG(-8.3886080e+06,0.0e+00), RES(1.5942385152878742117e1, 3.1415926535897932385e0)},
+ {FN (log), ARG(8.3886080e+06,1.19209289550781250e-07), RES(1.5942385152878742117e1, 1.4210854715202003717e-14)},
+ {FN (log), ARG(8.3886080e+06,-1.19209289550781250e-07), RES(1.5942385152878742117e1, -1.4210854715202003717e-14)},
+ {FN (log), ARG(-8.3886080e+06,1.19209289550781250e-07), RES(1.5942385152878742117e1, 3.1415926535897790276e0)},
+ {FN (log), ARG(-8.3886080e+06,-1.19209289550781250e-07), RES(1.5942385152878742117e1, -3.1415926535897790276e0)},
+ {FN (log), ARG(8.3886080e+06,5.0e-01), RES(1.5942385152878743893e1, 5.9604644775390554414e-8)},
+ {FN (log), ARG(8.3886080e+06,-5.0e-01), RES(1.5942385152878743893e1, -5.9604644775390554414e-8)},
+ {FN (log), ARG(-8.3886080e+06,5.0e-01), RES(1.5942385152878743893e1, 3.1415925939851484631e0)},
+ {FN (log), ARG(-8.3886080e+06,-5.0e-01), RES(1.5942385152878743893e1, -3.1415925939851484631e0)},
+ {FN (log), ARG(8.3886080e+06,1.0e+00), RES(1.5942385152878749222e1, 1.1920928955078068531e-7)},
+ {FN (log), ARG(8.3886080e+06,-1.0e+00), RES(1.5942385152878749222e1, -1.1920928955078068531e-7)},
+ {FN (log), ARG(-8.3886080e+06,1.0e+00), RES(1.5942385152878749222e1, 3.1415925343805036877e0)},
+ {FN (log), ARG(-8.3886080e+06,-1.0e+00), RES(1.5942385152878749222e1, -3.1415925343805036877e0)},
+ {FN (log), ARG(8.3886080e+06,2.0e+00), RES(1.5942385152878770538e1, 2.3841857910155798249e-7)},
+ {FN (log), ARG(8.3886080e+06,-2.0e+00), RES(1.5942385152878770538e1, -2.3841857910155798249e-7)},
+ {FN (log), ARG(-8.3886080e+06,2.0e+00), RES(1.5942385152878770538e1, 3.1415924151712141369e0)},
+ {FN (log), ARG(-8.3886080e+06,-2.0e+00), RES(1.5942385152878770538e1, -3.1415924151712141369e0)},
+ {FN (log), ARG(8.3886080e+06,8.3886080e+06), RES(1.6288958743158714771e1, 7.8539816339744830962e-1)},
+ {FN (log), ARG(8.3886080e+06,-8.3886080e+06), RES(1.6288958743158714771e1, -7.8539816339744830962e-1)},
+ {FN (log), ARG(-8.3886080e+06,8.3886080e+06), RES(1.6288958743158714771e1, 2.3561944901923449288e0)},
+ {FN (log), ARG(-8.3886080e+06,-8.3886080e+06), RES(1.6288958743158714771e1, -2.3561944901923449288e0)},
+ {FN (log), ARG(0.0e+00,1.19209289550781250e-07), RES(-1.5942385152878742117e1, 1.5707963267948966192e0)},
+ {FN (log), ARG(0.0e+00,-1.19209289550781250e-07), RES(-1.5942385152878742117e1, -1.5707963267948966192e0)},
+ {FN (log), ARG(0.0e+00,5.0e-01), RES(-6.9314718055994530942e-1, 1.5707963267948966192e0)},
+ {FN (log), ARG(0.0e+00,-5.0e-01), RES(-6.9314718055994530942e-1, -1.5707963267948966192e0)},
+ {FN (log), ARG(0.0e+00,1.0e+00), RES(0, 1.5707963267948966192e0)},
+ {FN (log), ARG(0.0e+00,-1.0e+00), RES(0, -1.5707963267948966192e0)},
+ {FN (log), ARG(0.0e+00,2.0e+00), RES(6.9314718055994530942e-1, 1.5707963267948966192e0)},
+ {FN (log), ARG(0.0e+00,-2.0e+00), RES(6.9314718055994530942e-1, -1.5707963267948966192e0)},
+ {FN (log), ARG(0.0e+00,8.3886080e+06), RES(1.5942385152878742117e1, 1.5707963267948966192e0)},
+ {FN (log), ARG(0.0e+00,-8.3886080e+06), RES(1.5942385152878742117e1, -1.5707963267948966192e0)},
+ {FN (log), ARG(1.19209289550781250e-07,1.19209289550781250e-07), RES(-1.5595811562598769462e1, 7.8539816339744830962e-1)},
+ {FN (log), ARG(1.19209289550781250e-07,-1.19209289550781250e-07), RES(-1.5595811562598769462e1, -7.8539816339744830962e-1)},
+ {FN (log), ARG(-1.19209289550781250e-07,1.19209289550781250e-07), RES(-1.5595811562598769462e1, 2.3561944901923449288e0)},
+ {FN (log), ARG(-1.19209289550781250e-07,-1.19209289550781250e-07), RES(-1.5595811562598769462e1, -2.3561944901923449288e0)},
+ {FN (log), ARG(1.19209289550781250e-07,5.0e-01), RES(-6.9314718055991688771e-1, 1.5707960883763175177e0)},
+ {FN (log), ARG(1.19209289550781250e-07,-5.0e-01), RES(-6.9314718055991688771e-1, -1.5707960883763175177e0)},
+ {FN (log), ARG(-1.19209289550781250e-07,5.0e-01), RES(-6.9314718055991688771e-1, 1.5707965652134757208e0)},
+ {FN (log), ARG(-1.19209289550781250e-07,-5.0e-01), RES(-6.9314718055991688771e-1, -1.5707965652134757208e0)},
+ {FN (log), ARG(1.19209289550781250e-07,1.0e+00), RES(7.1054273576009513716e-15, 1.5707962075856070685e0)},
+ {FN (log), ARG(1.19209289550781250e-07,-1.0e+00), RES(7.1054273576009513716e-15, -1.5707962075856070685e0)},
+ {FN (log), ARG(-1.19209289550781250e-07,1.0e+00), RES(7.1054273576009513716e-15, 1.570796446004186170e0)},
+ {FN (log), ARG(-1.19209289550781250e-07,-1.0e+00), RES(7.1054273576009513716e-15, -1.570796446004186170e0)},
+ {FN (log), ARG(1.19209289550781250e-07,2.0e+00), RES(6.9314718055994708577e-1, 1.5707962671902518438e0)},
+ {FN (log), ARG(1.19209289550781250e-07,-2.0e+00), RES(6.9314718055994708577e-1, -1.5707962671902518438e0)},
+ {FN (log), ARG(-1.19209289550781250e-07,2.0e+00), RES(6.9314718055994708577e-1, 1.5707963863995413946e0)},
+ {FN (log), ARG(-1.19209289550781250e-07,-2.0e+00), RES(6.9314718055994708577e-1, -1.5707963863995413946e0)},
+ {FN (log), ARG(1.19209289550781250e-07,8.3886080e+06), RES(1.5942385152878742117e1, 1.5707963267948824084e0)},
+ {FN (log), ARG(1.19209289550781250e-07,-8.3886080e+06), RES(1.5942385152878742117e1, -1.5707963267948824084e0)},
+ {FN (log), ARG(-1.19209289550781250e-07,8.3886080e+06), RES(1.5942385152878742117e1, 1.5707963267949108301e0)},
+ {FN (log), ARG(-1.19209289550781250e-07,-8.3886080e+06), RES(1.5942385152878742117e1, -1.5707963267949108301e0)},
+ {FN (log), ARG(5.0e-01,1.19209289550781250e-07), RES(-6.9314718055991688771e-1, 2.3841857910155798249e-7)},
+ {FN (log), ARG(5.0e-01,-1.19209289550781250e-07), RES(-6.9314718055991688771e-1, -2.3841857910155798249e-7)},
+ {FN (log), ARG(-5.0e-01,1.19209289550781250e-07), RES(-6.9314718055991688771e-1, 3.1415924151712141369e0)},
+ {FN (log), ARG(-5.0e-01,-1.19209289550781250e-07), RES(-6.9314718055991688771e-1, -3.1415924151712141369e0)},
+ {FN (log), ARG(5.0e-01,5.0e-01), RES(-3.4657359027997265471e-1, 7.8539816339744830962e-1)},
+ {FN (log), ARG(5.0e-01,-5.0e-01), RES(-3.4657359027997265471e-1, -7.8539816339744830962e-1)},
+ {FN (log), ARG(-5.0e-01,5.0e-01), RES(-3.4657359027997265471e-1, 2.3561944901923449288e0)},
+ {FN (log), ARG(-5.0e-01,-5.0e-01), RES(-3.4657359027997265471e-1, -2.3561944901923449288e0)},
+ {FN (log), ARG(5.0e-01,1.0e+00), RES(1.1157177565710487788e-1, 1.1071487177940905030e0)},
+ {FN (log), ARG(5.0e-01,-1.0e+00), RES(1.1157177565710487788e-1, -1.1071487177940905030e0)},
+ {FN (log), ARG(-5.0e-01,1.0e+00), RES(1.1157177565710487788e-1, 2.0344439357957027354e0)},
+ {FN (log), ARG(-5.0e-01,-1.0e+00), RES(1.1157177565710487788e-1, -2.0344439357957027354e0)},
+ {FN (log), ARG(5.0e-01,2.0e+00), RES(7.2345949146816273071e-1, 1.3258176636680324651e0)},
+ {FN (log), ARG(5.0e-01,-2.0e+00), RES(7.2345949146816273071e-1, -1.3258176636680324651e0)},
+ {FN (log), ARG(-5.0e-01,2.0e+00), RES(7.2345949146816273071e-1, 1.8157749899217607734e0)},
+ {FN (log), ARG(-5.0e-01,-2.0e+00), RES(7.2345949146816273071e-1, -1.8157749899217607734e0)},
+ {FN (log), ARG(5.0e-01,8.3886080e+06), RES(1.5942385152878743893e1, 1.5707962671902518438e0)},
+ {FN (log), ARG(5.0e-01,-8.3886080e+06), RES(1.5942385152878743893e1, -1.5707962671902518438e0)},
+ {FN (log), ARG(-5.0e-01,8.3886080e+06), RES(1.5942385152878743893e1, 1.5707963863995413946e0)},
+ {FN (log), ARG(-5.0e-01,-8.3886080e+06), RES(1.5942385152878743893e1, -1.5707963863995413946e0)},
+ {FN (log), ARG(1.0e+00,1.19209289550781250e-07), RES(7.1054273576009513716e-15, 1.1920928955078068531e-7)},
+ {FN (log), ARG(1.0e+00,-1.19209289550781250e-07), RES(7.1054273576009513716e-15, -1.1920928955078068531e-7)},
+ {FN (log), ARG(-1.0e+00,1.19209289550781250e-07), RES(7.1054273576009513716e-15, 3.1415925343805036877e0)},
+ {FN (log), ARG(-1.0e+00,-1.19209289550781250e-07), RES(7.1054273576009513716e-15, -3.1415925343805036877e0)},
+ {FN (log), ARG(1.0e+00,5.0e-01), RES(1.1157177565710487788e-1, 4.6364760900080611621e-1)},
+ {FN (log), ARG(1.0e+00,-5.0e-01), RES(1.1157177565710487788e-1, -4.6364760900080611621e-1)},
+ {FN (log), ARG(-1.0e+00,5.0e-01), RES(1.1157177565710487788e-1, 2.6779450445889871222e0)},
+ {FN (log), ARG(-1.0e+00,-5.0e-01), RES(1.1157177565710487788e-1, -2.6779450445889871222e0)},
+ {FN (log), ARG(1.0e+00,1.0e+00), RES(3.4657359027997265471e-1, 7.8539816339744830962e-1)},
+ {FN (log), ARG(1.0e+00,-1.0e+00), RES(3.4657359027997265471e-1, -7.8539816339744830962e-1)},
+ {FN (log), ARG(-1.0e+00,1.0e+00), RES(3.4657359027997265471e-1, 2.3561944901923449288e0)},
+ {FN (log), ARG(-1.0e+00,-1.0e+00), RES(3.4657359027997265471e-1, -2.3561944901923449288e0)},
+ {FN (log), ARG(1.0e+00,2.0e+00), RES(8.0471895621705018730e-1, 1.1071487177940905030e0)},
+ {FN (log), ARG(1.0e+00,-2.0e+00), RES(8.0471895621705018730e-1, -1.1071487177940905030e0)},
+ {FN (log), ARG(-1.0e+00,2.0e+00), RES(8.0471895621705018730e-1, 2.0344439357957027354e0)},
+ {FN (log), ARG(-1.0e+00,-2.0e+00), RES(8.0471895621705018730e-1, -2.0344439357957027354e0)},
+ {FN (log), ARG(1.0e+00,8.3886080e+06), RES(1.5942385152878749222e1, 1.5707962075856070685e0)},
+ {FN (log), ARG(1.0e+00,-8.3886080e+06), RES(1.5942385152878749222e1, -1.5707962075856070685e0)},
+ {FN (log), ARG(-1.0e+00,8.3886080e+06), RES(1.5942385152878749222e1, 1.570796446004186170e0)},
+ {FN (log), ARG(-1.0e+00,-8.3886080e+06), RES(1.5942385152878749222e1, -1.570796446004186170e0)},
+ {FN (log), ARG(2.0e+00,1.19209289550781250e-07), RES(6.9314718055994708577e-1, 5.9604644775390554414e-8)},
+ {FN (log), ARG(2.0e+00,-1.19209289550781250e-07), RES(6.9314718055994708577e-1, -5.9604644775390554414e-8)},
+ {FN (log), ARG(-2.0e+00,1.19209289550781250e-07), RES(6.9314718055994708577e-1, 3.1415925939851484631e0)},
+ {FN (log), ARG(-2.0e+00,-1.19209289550781250e-07), RES(6.9314718055994708577e-1, -3.1415925939851484631e0)},
+ {FN (log), ARG(2.0e+00,5.0e-01), RES(7.2345949146816273071e-1, 2.4497866312686415417e-1)},
+ {FN (log), ARG(2.0e+00,-5.0e-01), RES(7.2345949146816273071e-1, -2.4497866312686415417e-1)},
+ {FN (log), ARG(-2.0e+00,5.0e-01), RES(7.2345949146816273071e-1, 2.8966139904629290843e0)},
+ {FN (log), ARG(-2.0e+00,-5.0e-01), RES(7.2345949146816273071e-1, -2.8966139904629290843e0)},
+ {FN (log), ARG(2.0e+00,1.0e+00), RES(8.0471895621705018730e-1, 4.6364760900080611621e-1)},
+ {FN (log), ARG(2.0e+00,-1.0e+00), RES(8.0471895621705018730e-1, -4.6364760900080611621e-1)},
+ {FN (log), ARG(-2.0e+00,1.0e+00), RES(8.0471895621705018730e-1, 2.6779450445889871222e0)},
+ {FN (log), ARG(-2.0e+00,-1.0e+00), RES(8.0471895621705018730e-1, -2.6779450445889871222e0)},
+ {FN (log), ARG(2.0e+00,2.0e+00), RES(1.0397207708399179641e0, 7.8539816339744830962e-1)},
+ {FN (log), ARG(2.0e+00,-2.0e+00), RES(1.0397207708399179641e0, -7.8539816339744830962e-1)},
+ {FN (log), ARG(-2.0e+00,2.0e+00), RES(1.0397207708399179641e0, 2.3561944901923449288e0)},
+ {FN (log), ARG(-2.0e+00,-2.0e+00), RES(1.0397207708399179641e0, -2.3561944901923449288e0)},
+ {FN (log), ARG(2.0e+00,8.3886080e+06), RES(1.5942385152878770538e1, 1.5707960883763175177e0)},
+ {FN (log), ARG(2.0e+00,-8.3886080e+06), RES(1.5942385152878770538e1, -1.5707960883763175177e0)},
+ {FN (log), ARG(-2.0e+00,8.3886080e+06), RES(1.5942385152878770538e1, 1.5707965652134757208e0)},
+ {FN (log), ARG(-2.0e+00,-8.3886080e+06), RES(1.5942385152878770538e1, -1.5707965652134757208e0)},
+ {FN (log), ARG(8.3886080e+06,1.19209289550781250e-07), RES(1.5942385152878742117e1, 1.4210854715202003717e-14)},
+ {FN (log), ARG(8.3886080e+06,-1.19209289550781250e-07), RES(1.5942385152878742117e1, -1.4210854715202003717e-14)},
+ {FN (log), ARG(-8.3886080e+06,1.19209289550781250e-07), RES(1.5942385152878742117e1, 3.1415926535897790276e0)},
+ {FN (log), ARG(-8.3886080e+06,-1.19209289550781250e-07), RES(1.5942385152878742117e1, -3.1415926535897790276e0)},
+ {FN (log), ARG(8.3886080e+06,5.0e-01), RES(1.5942385152878743893e1, 5.9604644775390554414e-8)},
+ {FN (log), ARG(8.3886080e+06,-5.0e-01), RES(1.5942385152878743893e1, -5.9604644775390554414e-8)},
+ {FN (log), ARG(-8.3886080e+06,5.0e-01), RES(1.5942385152878743893e1, 3.1415925939851484631e0)},
+ {FN (log), ARG(-8.3886080e+06,-5.0e-01), RES(1.5942385152878743893e1, -3.1415925939851484631e0)},
+ {FN (log), ARG(8.3886080e+06,1.0e+00), RES(1.5942385152878749222e1, 1.1920928955078068531e-7)},
+ {FN (log), ARG(8.3886080e+06,-1.0e+00), RES(1.5942385152878749222e1, -1.1920928955078068531e-7)},
+ {FN (log), ARG(-8.3886080e+06,1.0e+00), RES(1.5942385152878749222e1, 3.1415925343805036877e0)},
+ {FN (log), ARG(-8.3886080e+06,-1.0e+00), RES(1.5942385152878749222e1, -3.1415925343805036877e0)},
+ {FN (log), ARG(8.3886080e+06,2.0e+00), RES(1.5942385152878770538e1, 2.3841857910155798249e-7)},
+ {FN (log), ARG(8.3886080e+06,-2.0e+00), RES(1.5942385152878770538e1, -2.3841857910155798249e-7)},
+ {FN (log), ARG(-8.3886080e+06,2.0e+00), RES(1.5942385152878770538e1, 3.1415924151712141369e0)},
+ {FN (log), ARG(-8.3886080e+06,-2.0e+00), RES(1.5942385152878770538e1, -3.1415924151712141369e0)},
+ {FN (log), ARG(8.3886080e+06,8.3886080e+06), RES(1.6288958743158714771e1, 7.8539816339744830962e-1)},
+ {FN (log), ARG(8.3886080e+06,-8.3886080e+06), RES(1.6288958743158714771e1, -7.8539816339744830962e-1)},
+ {FN (log), ARG(-8.3886080e+06,8.3886080e+06), RES(1.6288958743158714771e1, 2.3561944901923449288e0)},
+ {FN (log), ARG(-8.3886080e+06,-8.3886080e+06), RES(1.6288958743158714771e1, -2.3561944901923449288e0)},
+ {FN (log10), ARG(1.19209289550781250e-07,0.0e+00), RES(-6.9236899002715674899e0, 0.0)},
+ {FN (log10), ARG(-1.19209289550781250e-07,0.0e+00), RES(-6.9236899002715674899e0, 1.3643763538418413475e0)},
+ {FN (log10), ARG(1.19209289550781250e-07,1.19209289550781250e-07), RES(-6.7731749024395768923e0, 3.4109408846046033687e-1)},
+ {FN (log10), ARG(1.19209289550781250e-07,-1.19209289550781250e-07), RES(-6.7731749024395768923e0, -3.4109408846046033687e-1)},
+ {FN (log10), ARG(-1.19209289550781250e-07,1.19209289550781250e-07), RES(-6.7731749024395768923e0, 1.0232822653813810106e0)},
+ {FN (log10), ARG(-1.19209289550781250e-07,-1.19209289550781250e-07), RES(-6.7731749024395768923e0, -1.0232822653813810106e0)},
+ {FN (log10), ARG(1.19209289550781250e-07,5.0e-01), RES(-3.0102999566396885182e-1, 6.8218807337704738672e-1)},
+ {FN (log10), ARG(1.19209289550781250e-07,-5.0e-01), RES(-3.0102999566396885182e-1, -6.8218807337704738672e-1)},
+ {FN (log10), ARG(-1.19209289550781250e-07,5.0e-01), RES(-3.0102999566396885182e-1, 6.8218828046479396076e-1)},
+ {FN (log10), ARG(-1.19209289550781250e-07,-5.0e-01), RES(-3.0102999566396885182e-1, -6.8218828046479396076e-1)},
+ {FN (log10), ARG(1.19209289550781250e-07,1.0e+00), RES(3.0858478929704968280e-15, 6.8218812514898403023e-1)},
+ {FN (log10), ARG(1.19209289550781250e-07,-1.0e+00), RES(3.0858478929704968280e-15, -6.8218812514898403023e-1)},
+ {FN (log10), ARG(-1.19209289550781250e-07,1.0e+00), RES(3.0858478929704968280e-15, 6.8218822869285731725e-1)},
+ {FN (log10), ARG(-1.19209289550781250e-07,-1.0e+00), RES(3.0858478929704968280e-15, -6.8218822869285731725e-1)},
+ {FN (log10), ARG(1.19209289550781250e-07,2.0e+00), RES(3.0102999566398196668e-1, 6.8218815103495235199e-1)},
+ {FN (log10), ARG(1.19209289550781250e-07,-2.0e+00), RES(3.0102999566398196668e-1, -6.8218815103495235199e-1)},
+ {FN (log10), ARG(-1.19209289550781250e-07,2.0e+00), RES(3.0102999566398196668e-1, 6.8218820280688899550e-1)},
+ {FN (log10), ARG(-1.19209289550781250e-07,-2.0e+00), RES(3.0102999566398196668e-1, -6.8218820280688899550e-1)},
+ {FN (log10), ARG(1.19209289550781250e-07,8.3886080e+06), RES(6.9236899002715674899e0, 6.8218817692091450205e-1)},
+ {FN (log10), ARG(1.19209289550781250e-07,-8.3886080e+06), RES(6.9236899002715674899e0, -6.8218817692091450205e-1)},
+ {FN (log10), ARG(-1.19209289550781250e-07,8.3886080e+06), RES(6.9236899002715674899e0, 6.8218817692092684544e-1)},
+ {FN (log10), ARG(-1.19209289550781250e-07,-8.3886080e+06), RES(6.9236899002715674899e0, -6.8218817692092684544e-1)},
+ {FN (log10), ARG(5.0e-01,0.0e+00), RES(-3.0102999566398119521e-1, 0.0)},
+ {FN (log10), ARG(-5.0e-01,0.0e+00), RES(-3.0102999566398119521e-1, 1.3643763538418413475e0)},
+ {FN (log10), ARG(5.0e-01,1.19209289550781250e-07), RES(-3.0102999566396885182e-1, 1.0354387328702058762e-7)},
+ {FN (log10), ARG(5.0e-01,-1.19209289550781250e-07), RES(-3.0102999566396885182e-1, -1.0354387328702058762e-7)},
+ {FN (log10), ARG(-5.0e-01,1.19209289550781250e-07), RES(-3.0102999566396885182e-1, 1.3643762502979680605e0)},
+ {FN (log10), ARG(-5.0e-01,-1.19209289550781250e-07), RES(-3.0102999566396885182e-1, -1.3643762502979680605e0)},
+ {FN (log10), ARG(5.0e-01,5.0e-01), RES(-1.5051499783199059761e-1, 3.4109408846046033687e-1)},
+ {FN (log10), ARG(5.0e-01,-5.0e-01), RES(-1.5051499783199059761e-1, -3.4109408846046033687e-1)},
+ {FN (log10), ARG(-5.0e-01,5.0e-01), RES(-1.5051499783199059761e-1, 1.0232822653813810106e0)},
+ {FN (log10), ARG(-5.0e-01,-5.0e-01), RES(-1.5051499783199059761e-1, -1.0232822653813810106e0)},
+ {FN (log10), ARG(5.0e-01,1.0e+00), RES(4.8455006504028207179e-2, 4.8082857878423410270e-1)},
+ {FN (log10), ARG(5.0e-01,-1.0e+00), RES(4.8455006504028207179e-2, -4.8082857878423410270e-1)},
+ {FN (log10), ARG(-5.0e-01,1.0e+00), RES(4.8455006504028207179e-2, 8.8354777505760724478e-1)},
+ {FN (log10), ARG(-5.0e-01,-1.0e+00), RES(4.8455006504028207179e-2, -8.8354777505760724478e-1)},
+ {FN (log10), ARG(5.0e-01,2.0e+00), RES(3.1419446502515576906e-1, 5.7579529534088794354e-1)},
+ {FN (log10), ARG(5.0e-01,-2.0e+00), RES(3.1419446502515576906e-1, -5.7579529534088794354e-1)},
+ {FN (log10), ARG(-5.0e-01,2.0e+00), RES(3.1419446502515576906e-1, 7.8858105850095340394e-1)},
+ {FN (log10), ARG(-5.0e-01,-2.0e+00), RES(3.1419446502515576906e-1, -7.8858105850095340394e-1)},
+ {FN (log10), ARG(5.0e-01,8.3886080e+06), RES(6.9236899002715682614e0, 6.8218815103495235199e-1)},
+ {FN (log10), ARG(5.0e-01,-8.3886080e+06), RES(6.9236899002715682614e0, -6.8218815103495235199e-1)},
+ {FN (log10), ARG(-5.0e-01,8.3886080e+06), RES(6.9236899002715682614e0, 6.8218820280688899550e-1)},
+ {FN (log10), ARG(-5.0e-01,-8.3886080e+06), RES(6.9236899002715682614e0, -6.8218820280688899550e-1)},
+ {FN (log10), ARG(1.0e+00,0.0e+00), RES(0e0, 0.0)},
+ {FN (log10), ARG(-1.0e+00,0.0e+00), RES(0, 1.3643763538418413475e0)},
+ {FN (log10), ARG(1.0e+00,1.19209289550781250e-07), RES(3.0858478929704968280e-15, 5.1771936643511029532e-8)},
+ {FN (log10), ARG(1.0e+00,-1.19209289550781250e-07), RES(3.0858478929704968280e-15, -5.1771936643511029532e-8)},
+ {FN (log10), ARG(-1.0e+00,1.19209289550781250e-07), RES(3.0858478929704968280e-15, 1.3643763020699047040e0)},
+ {FN (log10), ARG(-1.0e+00,-1.19209289550781250e-07), RES(3.0858478929704968280e-15, -1.3643763020699047040e0)},
+ {FN (log10), ARG(1.0e+00,5.0e-01), RES(4.8455006504028207179e-2, 2.0135959813668657104e-1)},
+ {FN (log10), ARG(1.0e+00,-5.0e-01), RES(4.8455006504028207179e-2, -2.0135959813668657104e-1)},
+ {FN (log10), ARG(-1.0e+00,5.0e-01), RES(4.8455006504028207179e-2, 1.1630167557051547764e0)},
+ {FN (log10), ARG(-1.0e+00,-5.0e-01), RES(4.8455006504028207179e-2, -1.1630167557051547764e0)},
+ {FN (log10), ARG(1.0e+00,1.0e+00), RES(1.5051499783199059761e-1, 3.4109408846046033687e-1)},
+ {FN (log10), ARG(1.0e+00,-1.0e+00), RES(1.5051499783199059761e-1, -3.4109408846046033687e-1)},
+ {FN (log10), ARG(-1.0e+00,1.0e+00), RES(1.5051499783199059761e-1, 1.0232822653813810106e0)},
+ {FN (log10), ARG(-1.0e+00,-1.0e+00), RES(1.5051499783199059761e-1, -1.0232822653813810106e0)},
+ {FN (log10), ARG(1.0e+00,2.0e+00), RES(3.4948500216800940239e-1, 4.8082857878423410270e-1)},
+ {FN (log10), ARG(1.0e+00,-2.0e+00), RES(3.4948500216800940239e-1, -4.8082857878423410270e-1)},
+ {FN (log10), ARG(-1.0e+00,2.0e+00), RES(3.4948500216800940239e-1, 8.8354777505760724478e-1)},
+ {FN (log10), ARG(-1.0e+00,-2.0e+00), RES(3.4948500216800940239e-1, -8.8354777505760724478e-1)},
+ {FN (log10), ARG(1.0e+00,8.3886080e+06), RES(6.9236899002715705758e0, 6.8218812514898403023e-1)},
+ {FN (log10), ARG(1.0e+00,-8.3886080e+06), RES(6.9236899002715705758e0, -6.8218812514898403023e-1)},
+ {FN (log10), ARG(-1.0e+00,8.3886080e+06), RES(6.9236899002715705758e0, 6.8218822869285731725e-1)},
+ {FN (log10), ARG(-1.0e+00,-8.3886080e+06), RES(6.9236899002715705758e0, -6.8218822869285731725e-1)},
+ {FN (log10), ARG(2.0e+00,0.0e+00), RES(3.0102999566398119521e-1, 0.0)},
+ {FN (log10), ARG(-2.0e+00,0.0e+00), RES(3.0102999566398119521e-1, 1.3643763538418413475e0)},
+ {FN (log10), ARG(2.0e+00,1.19209289550781250e-07), RES(3.0102999566398196668e-1, 2.5885968321755606731e-8)},
+ {FN (log10), ARG(2.0e+00,-1.19209289550781250e-07), RES(3.0102999566398196668e-1, -2.5885968321755606731e-8)},
+ {FN (log10), ARG(-2.0e+00,1.19209289550781250e-07), RES(3.0102999566398196668e-1, 1.3643763279558730257e0)},
+ {FN (log10), ARG(-2.0e+00,-1.19209289550781250e-07), RES(3.0102999566398196668e-1, -1.3643763279558730257e0)},
+ {FN (log10), ARG(2.0e+00,5.0e-01), RES(3.1419446502515576906e-1, 1.0639288158003273020e-1)},
+ {FN (log10), ARG(2.0e+00,-5.0e-01), RES(3.1419446502515576906e-1, -1.0639288158003273020e-1)},
+ {FN (log10), ARG(-2.0e+00,5.0e-01), RES(3.1419446502515576906e-1, 1.2579834722618086173e0)},
+ {FN (log10), ARG(-2.0e+00,-5.0e-01), RES(3.1419446502515576906e-1, -1.2579834722618086173e0)},
+ {FN (log10), ARG(2.0e+00,1.0e+00), RES(3.4948500216800940239e-1, 2.0135959813668657104e-1)},
+ {FN (log10), ARG(2.0e+00,-1.0e+00), RES(3.4948500216800940239e-1, -2.0135959813668657104e-1)},
+ {FN (log10), ARG(-2.0e+00,1.0e+00), RES(3.4948500216800940239e-1, 1.1630167557051547764e0)},
+ {FN (log10), ARG(-2.0e+00,-1.0e+00), RES(3.4948500216800940239e-1, -1.1630167557051547764e0)},
+ {FN (log10), ARG(2.0e+00,2.0e+00), RES(4.5154499349597179282e-1, 3.4109408846046033687e-1)},
+ {FN (log10), ARG(2.0e+00,-2.0e+00), RES(4.5154499349597179282e-1, -3.4109408846046033687e-1)},
+ {FN (log10), ARG(-2.0e+00,2.0e+00), RES(4.5154499349597179282e-1, 1.0232822653813810106e0)},
+ {FN (log10), ARG(-2.0e+00,-2.0e+00), RES(4.5154499349597179282e-1, -1.0232822653813810106e0)},
+ {FN (log10), ARG(2.0e+00,8.3886080e+06), RES(6.9236899002715798333e0, 6.8218807337704738672e-1)},
+ {FN (log10), ARG(2.0e+00,-8.3886080e+06), RES(6.9236899002715798333e0, -6.8218807337704738672e-1)},
+ {FN (log10), ARG(-2.0e+00,8.3886080e+06), RES(6.9236899002715798333e0, 6.8218828046479396076e-1)},
+ {FN (log10), ARG(-2.0e+00,-8.3886080e+06), RES(6.9236899002715798333e0, -6.8218828046479396076e-1)},
+ {FN (log10), ARG(8.3886080e+06,0.0e+00), RES(6.9236899002715674899e0, 0.0)},
+ {FN (log10), ARG(-8.3886080e+06,0.0e+00), RES(6.9236899002715674899e0, 1.3643763538418413475e0)},
+ {FN (log10), ARG(8.3886080e+06,1.19209289550781250e-07), RES(6.9236899002715674899e0, 6.1716957859410375086e-15)},
+ {FN (log10), ARG(8.3886080e+06,-1.19209289550781250e-07), RES(6.9236899002715674899e0, -6.1716957859410375086e-15)},
+ {FN (log10), ARG(-8.3886080e+06,1.19209289550781250e-07), RES(6.9236899002715674899e0, 1.3643763538418351758e0)},
+ {FN (log10), ARG(-8.3886080e+06,-1.19209289550781250e-07), RES(6.9236899002715674899e0, -1.3643763538418351758e0)},
+ {FN (log10), ARG(8.3886080e+06,5.0e-01), RES(6.9236899002715682614e0, 2.5885968321755606731e-8)},
+ {FN (log10), ARG(8.3886080e+06,-5.0e-01), RES(6.9236899002715682614e0, -2.5885968321755606731e-8)},
+ {FN (log10), ARG(-8.3886080e+06,5.0e-01), RES(6.9236899002715682614e0, 1.3643763279558730257e0)},
+ {FN (log10), ARG(-8.3886080e+06,-5.0e-01), RES(6.9236899002715682614e0, -1.3643763279558730257e0)},
+ {FN (log10), ARG(8.3886080e+06,1.0e+00), RES(6.9236899002715705758e0, 5.1771936643511029532e-8)},
+ {FN (log10), ARG(8.3886080e+06,-1.0e+00), RES(6.9236899002715705758e0, -5.1771936643511029532e-8)},
+ {FN (log10), ARG(-8.3886080e+06,1.0e+00), RES(6.9236899002715705758e0, 1.3643763020699047040e0)},
+ {FN (log10), ARG(-8.3886080e+06,-1.0e+00), RES(6.9236899002715705758e0, -1.3643763020699047040e0)},
+ {FN (log10), ARG(8.3886080e+06,2.0e+00), RES(6.9236899002715798333e0, 1.0354387328702058762e-7)},
+ {FN (log10), ARG(8.3886080e+06,-2.0e+00), RES(6.9236899002715798333e0, -1.0354387328702058762e-7)},
+ {FN (log10), ARG(-8.3886080e+06,2.0e+00), RES(6.9236899002715798333e0, 1.3643762502979680605e0)},
+ {FN (log10), ARG(-8.3886080e+06,-2.0e+00), RES(6.9236899002715798333e0, -1.3643762502979680605e0)},
+ {FN (log10), ARG(8.3886080e+06,8.3886080e+06), RES(7.0742048981035580875e0, 3.4109408846046033687e-1)},
+ {FN (log10), ARG(8.3886080e+06,-8.3886080e+06), RES(7.0742048981035580875e0, -3.4109408846046033687e-1)},
+ {FN (log10), ARG(-8.3886080e+06,8.3886080e+06), RES(7.0742048981035580875e0, 1.0232822653813810106e0)},
+ {FN (log10), ARG(-8.3886080e+06,-8.3886080e+06), RES(7.0742048981035580875e0, -1.0232822653813810106e0)},
+ {FN (log10), ARG(0.0e+00,1.19209289550781250e-07), RES(-6.9236899002715674899e0, 6.8218817692092067374e-1)},
+ {FN (log10), ARG(0.0e+00,-1.19209289550781250e-07), RES(-6.9236899002715674899e0, -6.8218817692092067374e-1)},
+ {FN (log10), ARG(0.0e+00,5.0e-01), RES(-3.0102999566398119521e-1, 6.8218817692092067374e-1)},
+ {FN (log10), ARG(0.0e+00,-5.0e-01), RES(-3.0102999566398119521e-1, -6.8218817692092067374e-1)},
+ {FN (log10), ARG(0.0e+00,1.0e+00), RES(0, 6.8218817692092067374e-1)},
+ {FN (log10), ARG(0.0e+00,-1.0e+00), RES(0, -6.8218817692092067374e-1)},
+ {FN (log10), ARG(0.0e+00,2.0e+00), RES(3.0102999566398119521e-1, 6.8218817692092067374e-1)},
+ {FN (log10), ARG(0.0e+00,-2.0e+00), RES(3.0102999566398119521e-1, -6.8218817692092067374e-1)},
+ {FN (log10), ARG(0.0e+00,8.3886080e+06), RES(6.9236899002715674899e0, 6.8218817692092067374e-1)},
+ {FN (log10), ARG(0.0e+00,-8.3886080e+06), RES(6.9236899002715674899e0, -6.8218817692092067374e-1)},
+ {FN (log10), ARG(1.19209289550781250e-07,1.19209289550781250e-07), RES(-6.7731749024395768923e0, 3.4109408846046033687e-1)},
+ {FN (log10), ARG(1.19209289550781250e-07,-1.19209289550781250e-07), RES(-6.7731749024395768923e0, -3.4109408846046033687e-1)},
+ {FN (log10), ARG(-1.19209289550781250e-07,1.19209289550781250e-07), RES(-6.7731749024395768923e0, 1.0232822653813810106e0)},
+ {FN (log10), ARG(-1.19209289550781250e-07,-1.19209289550781250e-07), RES(-6.7731749024395768923e0, -1.0232822653813810106e0)},
+ {FN (log10), ARG(1.19209289550781250e-07,5.0e-01), RES(-3.0102999566396885182e-1, 6.8218807337704738672e-1)},
+ {FN (log10), ARG(1.19209289550781250e-07,-5.0e-01), RES(-3.0102999566396885182e-1, -6.8218807337704738672e-1)},
+ {FN (log10), ARG(-1.19209289550781250e-07,5.0e-01), RES(-3.0102999566396885182e-1, 6.8218828046479396076e-1)},
+ {FN (log10), ARG(-1.19209289550781250e-07,-5.0e-01), RES(-3.0102999566396885182e-1, -6.8218828046479396076e-1)},
+ {FN (log10), ARG(1.19209289550781250e-07,1.0e+00), RES(3.0858478929704968280e-15, 6.8218812514898403023e-1)},
+ {FN (log10), ARG(1.19209289550781250e-07,-1.0e+00), RES(3.0858478929704968280e-15, -6.8218812514898403023e-1)},
+ {FN (log10), ARG(-1.19209289550781250e-07,1.0e+00), RES(3.0858478929704968280e-15, 6.8218822869285731725e-1)},
+ {FN (log10), ARG(-1.19209289550781250e-07,-1.0e+00), RES(3.0858478929704968280e-15, -6.8218822869285731725e-1)},
+ {FN (log10), ARG(1.19209289550781250e-07,2.0e+00), RES(3.0102999566398196668e-1, 6.8218815103495235199e-1)},
+ {FN (log10), ARG(1.19209289550781250e-07,-2.0e+00), RES(3.0102999566398196668e-1, -6.8218815103495235199e-1)},
+ {FN (log10), ARG(-1.19209289550781250e-07,2.0e+00), RES(3.0102999566398196668e-1, 6.8218820280688899550e-1)},
+ {FN (log10), ARG(-1.19209289550781250e-07,-2.0e+00), RES(3.0102999566398196668e-1, -6.8218820280688899550e-1)},
+ {FN (log10), ARG(1.19209289550781250e-07,8.3886080e+06), RES(6.9236899002715674899e0, 6.8218817692091450205e-1)},
+ {FN (log10), ARG(1.19209289550781250e-07,-8.3886080e+06), RES(6.9236899002715674899e0, -6.8218817692091450205e-1)},
+ {FN (log10), ARG(-1.19209289550781250e-07,8.3886080e+06), RES(6.9236899002715674899e0, 6.8218817692092684544e-1)},
+ {FN (log10), ARG(-1.19209289550781250e-07,-8.3886080e+06), RES(6.9236899002715674899e0, -6.8218817692092684544e-1)},
+ {FN (log10), ARG(5.0e-01,1.19209289550781250e-07), RES(-3.0102999566396885182e-1, 1.0354387328702058762e-7)},
+ {FN (log10), ARG(5.0e-01,-1.19209289550781250e-07), RES(-3.0102999566396885182e-1, -1.0354387328702058762e-7)},
+ {FN (log10), ARG(-5.0e-01,1.19209289550781250e-07), RES(-3.0102999566396885182e-1, 1.3643762502979680605e0)},
+ {FN (log10), ARG(-5.0e-01,-1.19209289550781250e-07), RES(-3.0102999566396885182e-1, -1.3643762502979680605e0)},
+ {FN (log10), ARG(5.0e-01,5.0e-01), RES(-1.5051499783199059761e-1, 3.4109408846046033687e-1)},
+ {FN (log10), ARG(5.0e-01,-5.0e-01), RES(-1.5051499783199059761e-1, -3.4109408846046033687e-1)},
+ {FN (log10), ARG(-5.0e-01,5.0e-01), RES(-1.5051499783199059761e-1, 1.0232822653813810106e0)},
+ {FN (log10), ARG(-5.0e-01,-5.0e-01), RES(-1.5051499783199059761e-1, -1.0232822653813810106e0)},
+ {FN (log10), ARG(5.0e-01,1.0e+00), RES(4.8455006504028207179e-2, 4.8082857878423410270e-1)},
+ {FN (log10), ARG(5.0e-01,-1.0e+00), RES(4.8455006504028207179e-2, -4.8082857878423410270e-1)},
+ {FN (log10), ARG(-5.0e-01,1.0e+00), RES(4.8455006504028207179e-2, 8.8354777505760724478e-1)},
+ {FN (log10), ARG(-5.0e-01,-1.0e+00), RES(4.8455006504028207179e-2, -8.8354777505760724478e-1)},
+ {FN (log10), ARG(5.0e-01,2.0e+00), RES(3.1419446502515576906e-1, 5.7579529534088794354e-1)},
+ {FN (log10), ARG(5.0e-01,-2.0e+00), RES(3.1419446502515576906e-1, -5.7579529534088794354e-1)},
+ {FN (log10), ARG(-5.0e-01,2.0e+00), RES(3.1419446502515576906e-1, 7.8858105850095340394e-1)},
+ {FN (log10), ARG(-5.0e-01,-2.0e+00), RES(3.1419446502515576906e-1, -7.8858105850095340394e-1)},
+ {FN (log10), ARG(5.0e-01,8.3886080e+06), RES(6.9236899002715682614e0, 6.8218815103495235199e-1)},
+ {FN (log10), ARG(5.0e-01,-8.3886080e+06), RES(6.9236899002715682614e0, -6.8218815103495235199e-1)},
+ {FN (log10), ARG(-5.0e-01,8.3886080e+06), RES(6.9236899002715682614e0, 6.8218820280688899550e-1)},
+ {FN (log10), ARG(-5.0e-01,-8.3886080e+06), RES(6.9236899002715682614e0, -6.8218820280688899550e-1)},
+ {FN (log10), ARG(1.0e+00,1.19209289550781250e-07), RES(3.0858478929704968280e-15, 5.1771936643511029532e-8)},
+ {FN (log10), ARG(1.0e+00,-1.19209289550781250e-07), RES(3.0858478929704968280e-15, -5.1771936643511029532e-8)},
+ {FN (log10), ARG(-1.0e+00,1.19209289550781250e-07), RES(3.0858478929704968280e-15, 1.3643763020699047040e0)},
+ {FN (log10), ARG(-1.0e+00,-1.19209289550781250e-07), RES(3.0858478929704968280e-15, -1.3643763020699047040e0)},
+ {FN (log10), ARG(1.0e+00,5.0e-01), RES(4.8455006504028207179e-2, 2.0135959813668657104e-1)},
+ {FN (log10), ARG(1.0e+00,-5.0e-01), RES(4.8455006504028207179e-2, -2.0135959813668657104e-1)},
+ {FN (log10), ARG(-1.0e+00,5.0e-01), RES(4.8455006504028207179e-2, 1.1630167557051547764e0)},
+ {FN (log10), ARG(-1.0e+00,-5.0e-01), RES(4.8455006504028207179e-2, -1.1630167557051547764e0)},
+ {FN (log10), ARG(1.0e+00,1.0e+00), RES(1.5051499783199059761e-1, 3.4109408846046033687e-1)},
+ {FN (log10), ARG(1.0e+00,-1.0e+00), RES(1.5051499783199059761e-1, -3.4109408846046033687e-1)},
+ {FN (log10), ARG(-1.0e+00,1.0e+00), RES(1.5051499783199059761e-1, 1.0232822653813810106e0)},
+ {FN (log10), ARG(-1.0e+00,-1.0e+00), RES(1.5051499783199059761e-1, -1.0232822653813810106e0)},
+ {FN (log10), ARG(1.0e+00,2.0e+00), RES(3.4948500216800940239e-1, 4.8082857878423410270e-1)},
+ {FN (log10), ARG(1.0e+00,-2.0e+00), RES(3.4948500216800940239e-1, -4.8082857878423410270e-1)},
+ {FN (log10), ARG(-1.0e+00,2.0e+00), RES(3.4948500216800940239e-1, 8.8354777505760724478e-1)},
+ {FN (log10), ARG(-1.0e+00,-2.0e+00), RES(3.4948500216800940239e-1, -8.8354777505760724478e-1)},
+ {FN (log10), ARG(1.0e+00,8.3886080e+06), RES(6.9236899002715705758e0, 6.8218812514898403023e-1)},
+ {FN (log10), ARG(1.0e+00,-8.3886080e+06), RES(6.9236899002715705758e0, -6.8218812514898403023e-1)},
+ {FN (log10), ARG(-1.0e+00,8.3886080e+06), RES(6.9236899002715705758e0, 6.8218822869285731725e-1)},
+ {FN (log10), ARG(-1.0e+00,-8.3886080e+06), RES(6.9236899002715705758e0, -6.8218822869285731725e-1)},
+ {FN (log10), ARG(2.0e+00,1.19209289550781250e-07), RES(3.0102999566398196668e-1, 2.5885968321755606731e-8)},
+ {FN (log10), ARG(2.0e+00,-1.19209289550781250e-07), RES(3.0102999566398196668e-1, -2.5885968321755606731e-8)},
+ {FN (log10), ARG(-2.0e+00,1.19209289550781250e-07), RES(3.0102999566398196668e-1, 1.3643763279558730257e0)},
+ {FN (log10), ARG(-2.0e+00,-1.19209289550781250e-07), RES(3.0102999566398196668e-1, -1.3643763279558730257e0)},
+ {FN (log10), ARG(2.0e+00,5.0e-01), RES(3.1419446502515576906e-1, 1.0639288158003273020e-1)},
+ {FN (log10), ARG(2.0e+00,-5.0e-01), RES(3.1419446502515576906e-1, -1.0639288158003273020e-1)},
+ {FN (log10), ARG(-2.0e+00,5.0e-01), RES(3.1419446502515576906e-1, 1.2579834722618086173e0)},
+ {FN (log10), ARG(-2.0e+00,-5.0e-01), RES(3.1419446502515576906e-1, -1.2579834722618086173e0)},
+ {FN (log10), ARG(2.0e+00,1.0e+00), RES(3.4948500216800940239e-1, 2.0135959813668657104e-1)},
+ {FN (log10), ARG(2.0e+00,-1.0e+00), RES(3.4948500216800940239e-1, -2.0135959813668657104e-1)},
+ {FN (log10), ARG(-2.0e+00,1.0e+00), RES(3.4948500216800940239e-1, 1.1630167557051547764e0)},
+ {FN (log10), ARG(-2.0e+00,-1.0e+00), RES(3.4948500216800940239e-1, -1.1630167557051547764e0)},
+ {FN (log10), ARG(2.0e+00,2.0e+00), RES(4.5154499349597179282e-1, 3.4109408846046033687e-1)},
+ {FN (log10), ARG(2.0e+00,-2.0e+00), RES(4.5154499349597179282e-1, -3.4109408846046033687e-1)},
+ {FN (log10), ARG(-2.0e+00,2.0e+00), RES(4.5154499349597179282e-1, 1.0232822653813810106e0)},
+ {FN (log10), ARG(-2.0e+00,-2.0e+00), RES(4.5154499349597179282e-1, -1.0232822653813810106e0)},
+ {FN (log10), ARG(2.0e+00,8.3886080e+06), RES(6.9236899002715798333e0, 6.8218807337704738672e-1)},
+ {FN (log10), ARG(2.0e+00,-8.3886080e+06), RES(6.9236899002715798333e0, -6.8218807337704738672e-1)},
+ {FN (log10), ARG(-2.0e+00,8.3886080e+06), RES(6.9236899002715798333e0, 6.8218828046479396076e-1)},
+ {FN (log10), ARG(-2.0e+00,-8.3886080e+06), RES(6.9236899002715798333e0, -6.8218828046479396076e-1)},
+ {FN (log10), ARG(8.3886080e+06,1.19209289550781250e-07), RES(6.9236899002715674899e0, 6.1716957859410375086e-15)},
+ {FN (log10), ARG(8.3886080e+06,-1.19209289550781250e-07), RES(6.9236899002715674899e0, -6.1716957859410375086e-15)},
+ {FN (log10), ARG(-8.3886080e+06,1.19209289550781250e-07), RES(6.9236899002715674899e0, 1.3643763538418351758e0)},
+ {FN (log10), ARG(-8.3886080e+06,-1.19209289550781250e-07), RES(6.9236899002715674899e0, -1.3643763538418351758e0)},
+ {FN (log10), ARG(8.3886080e+06,5.0e-01), RES(6.9236899002715682614e0, 2.5885968321755606731e-8)},
+ {FN (log10), ARG(8.3886080e+06,-5.0e-01), RES(6.9236899002715682614e0, -2.5885968321755606731e-8)},
+ {FN (log10), ARG(-8.3886080e+06,5.0e-01), RES(6.9236899002715682614e0, 1.3643763279558730257e0)},
+ {FN (log10), ARG(-8.3886080e+06,-5.0e-01), RES(6.9236899002715682614e0, -1.3643763279558730257e0)},
+ {FN (log10), ARG(8.3886080e+06,1.0e+00), RES(6.9236899002715705758e0, 5.1771936643511029532e-8)},
+ {FN (log10), ARG(8.3886080e+06,-1.0e+00), RES(6.9236899002715705758e0, -5.1771936643511029532e-8)},
+ {FN (log10), ARG(-8.3886080e+06,1.0e+00), RES(6.9236899002715705758e0, 1.3643763020699047040e0)},
+ {FN (log10), ARG(-8.3886080e+06,-1.0e+00), RES(6.9236899002715705758e0, -1.3643763020699047040e0)},
+ {FN (log10), ARG(8.3886080e+06,2.0e+00), RES(6.9236899002715798333e0, 1.0354387328702058762e-7)},
+ {FN (log10), ARG(8.3886080e+06,-2.0e+00), RES(6.9236899002715798333e0, -1.0354387328702058762e-7)},
+ {FN (log10), ARG(-8.3886080e+06,2.0e+00), RES(6.9236899002715798333e0, 1.3643762502979680605e0)},
+ {FN (log10), ARG(-8.3886080e+06,-2.0e+00), RES(6.9236899002715798333e0, -1.3643762502979680605e0)},
+ {FN (log10), ARG(8.3886080e+06,8.3886080e+06), RES(7.0742048981035580875e0, 3.4109408846046033687e-1)},
+ {FN (log10), ARG(8.3886080e+06,-8.3886080e+06), RES(7.0742048981035580875e0, -3.4109408846046033687e-1)},
+ {FN (log10), ARG(-8.3886080e+06,8.3886080e+06), RES(7.0742048981035580875e0, 1.0232822653813810106e0)},
+ {FN (log10), ARG(-8.3886080e+06,-8.3886080e+06), RES(7.0742048981035580875e0, -1.0232822653813810106e0)},
+ {FN (exp), ARG(0.0e+00,-3.45266983001243932001e-04), RES(9.9999994039535581673e-1, -3.4526697614140534807e-4)},
+ {FN (exp), ARG(0.0e+00,3.45266983001243932001e-04), RES(9.9999994039535581673e-1, 3.4526697614140534807e-4)},
+ {FN (exp), ARG(0.0e+00,1.57045105981189525579e+00), RES(3.4526697614152485627e-4, 9.9999994039535581669e-1)},
+ {FN (exp), ARG(0.0e+00,-1.57045105981189525579e+00), RES(3.4526697614152485627e-4, -9.9999994039535581669e-1)},
+ {FN (exp), ARG(0.0e+00,1.57114159377789786021e+00), RES(-3.4526697614140239160e-4, 9.9999994039535581673e-1)},
+ {FN (exp), ARG(0.0e+00,-1.57114159377789786021e+00), RES(-3.4526697614140239160e-4, -9.9999994039535581673e-1)},
+ {FN (exp), ARG(0.0e+00,3.14124738660679181379e+00), RES(-9.9999994039535581667e-1, 3.4526697614158608860e-4)},
+ {FN (exp), ARG(0.0e+00,-3.14124738660679181379e+00), RES(-9.9999994039535581667e-1, -3.4526697614158608860e-4)},
+ {FN (exp), ARG(0.0e+00,3.14193792057279441821e+00), RES(-9.9999994039535581675e-1, -3.4526697614134115926e-4)},
+ {FN (exp), ARG(0.0e+00,-3.14193792057279441821e+00), RES(-9.9999994039535581675e-1, 3.4526697614134115926e-4)},
+ {FN (exp), ARG(0.0e+00,4.71204371340168837179e+00), RES(-3.4526697614164732094e-4, -9.9999994039535581664e-1)},
+ {FN (exp), ARG(0.0e+00,-4.71204371340168837179e+00), RES(-3.4526697614164732094e-4, 9.9999994039535581664e-1)},
+ {FN (exp), ARG(0.0e+00,4.71273424736769097620e+00), RES(3.4526697614127992692e-4, -9.9999994039535581677e-1)},
+ {FN (exp), ARG(0.0e+00,-4.71273424736769097620e+00), RES(3.4526697614127992692e-4, 9.9999994039535581677e-1)},
+ {FN (exp), ARG(0.0e+00,6.28284004019658492979e+00), RES(9.9999994039535581662e-1, -3.4526697614170855328e-4)},
+ {FN (exp), ARG(0.0e+00,-6.28284004019658492979e+00), RES(9.9999994039535581662e-1, 3.4526697614170855328e-4)},
+ {FN (exp), ARG(0.0e+00,6.28353057416258753420e+00), RES(9.9999994039535581679e-1, 3.4526697614121869459e-4)},
+ {FN (exp), ARG(0.0e+00,-6.28353057416258753420e+00), RES(9.9999994039535581679e-1, -3.4526697614121869459e-4)},
+ {FN (exp), ARG(0.0e+00,9.42443269378637893396e+00), RES(-9.9999994039535581689e-1, 3.4526697614094283958e-4)},
+ {FN (exp), ARG(0.0e+00,-9.42443269378637893396e+00), RES(-9.9999994039535581689e-1, -3.4526697614094283958e-4)},
+ {FN (exp), ARG(0.0e+00,9.42512322775237976202e+00), RES(-9.9999994039535581714e-1, -3.4526697614020805155e-4)},
+ {FN (exp), ARG(0.0e+00,-9.42512322775237976202e+00), RES(-9.9999994039535581714e-1, 3.4526697614020805155e-4)},
+ {FN (exp), ARG(1.19209289550781250e-07,-3.45266983001243932001e-04), RES(1.0000000596046453675e0, -3.4526701730043873250e-4)},
+ {FN (exp), ARG(1.19209289550781250e-07,3.45266983001243932001e-04), RES(1.0000000596046453675e0, 3.4526701730043873250e-4)},
+ {FN (exp), ARG(-1.19209289550781250e-07,-3.45266983001243932001e-04), RES(9.9999982118608047680e-1, -3.4526693498237687017e-4)},
+ {FN (exp), ARG(-1.19209289550781250e-07,3.45266983001243932001e-04), RES(9.9999982118608047680e-1, 3.4526693498237687017e-4)},
+ {FN (exp), ARG(1.19209289550781250e-07,1.57045105981189525579e+00), RES(3.4526701730055824072e-4, 1.0000000596046453675e0)},
+ {FN (exp), ARG(1.19209289550781250e-07,-1.57045105981189525579e+00), RES(3.4526701730055824072e-4, -1.0000000596046453675e0)},
+ {FN (exp), ARG(-1.19209289550781250e-07,1.57045105981189525579e+00), RES(3.4526693498249637836e-4, 9.9999982118608047676e-1)},
+ {FN (exp), ARG(-1.19209289550781250e-07,-1.57045105981189525579e+00), RES(3.4526693498249637836e-4, -9.9999982118608047676e-1)},
+ {FN (exp), ARG(1.19209289550781250e-07,1.57114159377789786021e+00), RES(-3.4526701730043577603e-4, 1.0000000596046453675e0)},
+ {FN (exp), ARG(1.19209289550781250e-07,-1.57114159377789786021e+00), RES(-3.4526701730043577603e-4, -1.0000000596046453675e0)},
+ {FN (exp), ARG(-1.19209289550781250e-07,1.57114159377789786021e+00), RES(-3.4526693498237391370e-4, 9.9999982118608047680e-1)},
+ {FN (exp), ARG(-1.19209289550781250e-07,-1.57114159377789786021e+00), RES(-3.4526693498237391370e-4, -9.9999982118608047680e-1)},
+ {FN (exp), ARG(1.19209289550781250e-07,3.14124738660679181379e+00), RES(-1.0000000596046453674e0, 3.4526701730061947306e-4)},
+ {FN (exp), ARG(1.19209289550781250e-07,-3.14124738660679181379e+00), RES(-1.0000000596046453674e0, -3.4526701730061947306e-4)},
+ {FN (exp), ARG(-1.19209289550781250e-07,3.14124738660679181379e+00), RES(-9.9999982118608047674e-1, 3.4526693498255761069e-4)},
+ {FN (exp), ARG(-1.19209289550781250e-07,-3.14124738660679181379e+00), RES(-9.9999982118608047674e-1, -3.4526693498255761069e-4)},
+ {FN (exp), ARG(1.19209289550781250e-07,3.14193792057279441821e+00), RES(-1.0000000596046453675e0, -3.4526701730037454368e-4)},
+ {FN (exp), ARG(1.19209289550781250e-07,-3.14193792057279441821e+00), RES(-1.0000000596046453675e0, 3.4526701730037454368e-4)},
+ {FN (exp), ARG(-1.19209289550781250e-07,3.14193792057279441821e+00), RES(-9.9999982118608047682e-1, -3.4526693498231268137e-4)},
+ {FN (exp), ARG(-1.19209289550781250e-07,-3.14193792057279441821e+00), RES(-9.9999982118608047682e-1, 3.4526693498231268137e-4)},
+ {FN (exp), ARG(1.19209289550781250e-07,4.71204371340168837179e+00), RES(-3.4526701730068070540e-4, -1.0000000596046453674e0)},
+ {FN (exp), ARG(1.19209289550781250e-07,-4.71204371340168837179e+00), RES(-3.4526701730068070540e-4, 1.0000000596046453674e0)},
+ {FN (exp), ARG(-1.19209289550781250e-07,4.71204371340168837179e+00), RES(-3.4526693498261884302e-4, -9.9999982118608047672e-1)},
+ {FN (exp), ARG(-1.19209289550781250e-07,-4.71204371340168837179e+00), RES(-3.4526693498261884302e-4, 9.9999982118608047672e-1)},
+ {FN (exp), ARG(1.19209289550781250e-07,4.71273424736769097620e+00), RES(3.4526701730031331134e-4, -1.0000000596046453676e0)},
+ {FN (exp), ARG(1.19209289550781250e-07,-4.71273424736769097620e+00), RES(3.4526701730031331134e-4, 1.0000000596046453676e0)},
+ {FN (exp), ARG(-1.19209289550781250e-07,4.71273424736769097620e+00), RES(3.4526693498225144904e-4, -9.9999982118608047684e-1)},
+ {FN (exp), ARG(-1.19209289550781250e-07,-4.71273424736769097620e+00), RES(3.4526693498225144904e-4, 9.9999982118608047684e-1)},
+ {FN (exp), ARG(1.19209289550781250e-07,6.28284004019658492979e+00), RES(1.0000000596046453674e0, -3.4526701730074193775e-4)},
+ {FN (exp), ARG(1.19209289550781250e-07,-6.28284004019658492979e+00), RES(1.0000000596046453674e0, 3.4526701730074193775e-4)},
+ {FN (exp), ARG(-1.19209289550781250e-07,6.28284004019658492979e+00), RES(9.9999982118608047670e-1, -3.4526693498268007535e-4)},
+ {FN (exp), ARG(-1.19209289550781250e-07,-6.28284004019658492979e+00), RES(9.9999982118608047670e-1, 3.4526693498268007535e-4)},
+ {FN (exp), ARG(1.19209289550781250e-07,6.28353057416258753420e+00), RES(1.0000000596046453676e0, 3.452670173002520790e-4)},
+ {FN (exp), ARG(1.19209289550781250e-07,-6.28353057416258753420e+00), RES(1.0000000596046453676e0, -3.452670173002520790e-4)},
+ {FN (exp), ARG(-1.19209289550781250e-07,6.28353057416258753420e+00), RES(9.9999982118608047687e-1, 3.4526693498219021671e-4)},
+ {FN (exp), ARG(-1.19209289550781250e-07,-6.28353057416258753420e+00), RES(9.9999982118608047687e-1, -3.4526693498219021671e-4)},
+ {FN (exp), ARG(1.19209289550781250e-07,9.42443269378637893396e+00), RES(-1.0000000596046453677e0, 3.4526701729997622396e-4)},
+ {FN (exp), ARG(1.19209289550781250e-07,-9.42443269378637893396e+00), RES(-1.0000000596046453677e0, -3.4526701729997622396e-4)},
+ {FN (exp), ARG(-1.19209289550781250e-07,9.42443269378637893396e+00), RES(-9.9999982118608047696e-1, 3.4526693498191436174e-4)},
+ {FN (exp), ARG(-1.19209289550781250e-07,-9.42443269378637893396e+00), RES(-9.9999982118608047696e-1, -3.4526693498191436174e-4)},
+ {FN (exp), ARG(1.19209289550781250e-07,9.42512322775237976202e+00), RES(-1.0000000596046453679e0, -3.4526701729924143584e-4)},
+ {FN (exp), ARG(1.19209289550781250e-07,-9.42512322775237976202e+00), RES(-1.0000000596046453679e0, 3.4526701729924143584e-4)},
+ {FN (exp), ARG(-1.19209289550781250e-07,9.42512322775237976202e+00), RES(-9.9999982118608047721e-1, -3.4526693498117957380e-4)},
+ {FN (exp), ARG(-1.19209289550781250e-07,-9.42512322775237976202e+00), RES(-9.9999982118608047721e-1, 3.4526693498117957380e-4)},
+ {FN (exp), ARG(5.0e-01,-3.45266983001243932001e-04), RES(1.6487211724286834494e0, -5.6924900763464865323e-4)},
+ {FN (exp), ARG(5.0e-01,3.45266983001243932001e-04), RES(1.6487211724286834494e0, 5.6924900763464865323e-4)},
+ {FN (exp), ARG(-5.0e-01,-3.45266983001243932001e-04), RES(6.0653062356058926519e-1, -2.0941500681603265022e-4)},
+ {FN (exp), ARG(-5.0e-01,3.45266983001243932001e-04), RES(6.0653062356058926519e-1, 2.0941500681603265022e-4)},
+ {FN (exp), ARG(5.0e-01,1.57045105981189525579e+00), RES(5.6924900763484568894e-4, 1.6487211724286834493e0)},
+ {FN (exp), ARG(5.0e-01,-1.57045105981189525579e+00), RES(5.6924900763484568894e-4, -1.6487211724286834493e0)},
+ {FN (exp), ARG(-5.0e-01,1.57045105981189525579e+00), RES(2.0941500681610513560e-4, 6.0653062356058926516e-1)},
+ {FN (exp), ARG(-5.0e-01,-1.57045105981189525579e+00), RES(2.0941500681610513560e-4, -6.0653062356058926516e-1)},
+ {FN (exp), ARG(5.0e-01,1.57114159377789786021e+00), RES(-5.6924900763464377883e-4, 1.6487211724286834494e0)},
+ {FN (exp), ARG(5.0e-01,-1.57114159377789786021e+00), RES(-5.6924900763464377883e-4, -1.6487211724286834494e0)},
+ {FN (exp), ARG(-5.0e-01,1.57114159377789786021e+00), RES(-2.0941500681603085702e-4, 6.0653062356058926519e-1)},
+ {FN (exp), ARG(-5.0e-01,-1.57114159377789786021e+00), RES(-2.0941500681603085702e-4, -6.0653062356058926519e-1)},
+ {FN (exp), ARG(5.0e-01,3.14124738660679181379e+00), RES(-1.6487211724286834493e0, 5.6924900763494664399e-4)},
+ {FN (exp), ARG(5.0e-01,-3.14124738660679181379e+00), RES(-1.6487211724286834493e0, -5.6924900763494664399e-4)},
+ {FN (exp), ARG(-5.0e-01,3.14124738660679181379e+00), RES(-6.0653062356058926515e-1, 2.0941500681614227489e-4)},
+ {FN (exp), ARG(-5.0e-01,-3.14124738660679181379e+00), RES(-6.0653062356058926515e-1, -2.0941500681614227489e-4)},
+ {FN (exp), ARG(5.0e-01,3.14193792057279441821e+00), RES(-1.6487211724286834494e0, -5.6924900763454282377e-4)},
+ {FN (exp), ARG(5.0e-01,-3.14193792057279441821e+00), RES(-1.6487211724286834494e0, 5.6924900763454282377e-4)},
+ {FN (exp), ARG(-5.0e-01,3.14193792057279441821e+00), RES(-6.0653062356058926520e-1, -2.0941500681599371773e-4)},
+ {FN (exp), ARG(-5.0e-01,-3.14193792057279441821e+00), RES(-6.0653062356058926520e-1, 2.0941500681599371773e-4)},
+ {FN (exp), ARG(5.0e-01,4.71204371340168837179e+00), RES(-5.6924900763504759905e-4, -1.6487211724286834492e0)},
+ {FN (exp), ARG(5.0e-01,-4.71204371340168837179e+00), RES(-5.6924900763504759905e-4, 1.6487211724286834492e0)},
+ {FN (exp), ARG(-5.0e-01,4.71204371340168837179e+00), RES(-2.0941500681617941418e-4, -6.0653062356058926514e-1)},
+ {FN (exp), ARG(-5.0e-01,-4.71204371340168837179e+00), RES(-2.0941500681617941418e-4, 6.0653062356058926514e-1)},
+ {FN (exp), ARG(5.0e-01,4.71273424736769097620e+00), RES(5.6924900763444186872e-4, -1.6487211724286834494e0)},
+ {FN (exp), ARG(5.0e-01,-4.71273424736769097620e+00), RES(5.6924900763444186872e-4, 1.6487211724286834494e0)},
+ {FN (exp), ARG(-5.0e-01,4.71273424736769097620e+00), RES(2.0941500681595657844e-4, -6.0653062356058926521e-1)},
+ {FN (exp), ARG(-5.0e-01,-4.71273424736769097620e+00), RES(2.0941500681595657844e-4, 6.0653062356058926521e-1)},
+ {FN (exp), ARG(5.0e-01,6.28284004019658492979e+00), RES(1.6487211724286834492e0, -5.6924900763514855410e-4)},
+ {FN (exp), ARG(5.0e-01,-6.28284004019658492979e+00), RES(1.6487211724286834492e0, 5.6924900763514855410e-4)},
+ {FN (exp), ARG(-5.0e-01,6.28284004019658492979e+00), RES(6.0653062356058926512e-1, -2.0941500681621655347e-4)},
+ {FN (exp), ARG(-5.0e-01,-6.28284004019658492979e+00), RES(6.0653062356058926512e-1, 2.0941500681621655347e-4)},
+ {FN (exp), ARG(5.0e-01,6.28353057416258753420e+00), RES(1.6487211724286834495e0, 5.6924900763434091366e-4)},
+ {FN (exp), ARG(5.0e-01,-6.28353057416258753420e+00), RES(1.6487211724286834495e0, -5.6924900763434091366e-4)},
+ {FN (exp), ARG(-5.0e-01,6.28353057416258753420e+00), RES(6.0653062356058926523e-1, 2.0941500681591943916e-4)},
+ {FN (exp), ARG(-5.0e-01,-6.28353057416258753420e+00), RES(6.0653062356058926523e-1, -2.0941500681591943916e-4)},
+ {FN (exp), ARG(5.0e-01,9.42443269378637893396e+00), RES(-1.6487211724286834496e0, 5.6924900763388610565e-4)},
+ {FN (exp), ARG(5.0e-01,-9.42443269378637893396e+00), RES(-1.6487211724286834496e0, -5.6924900763388610565e-4)},
+ {FN (exp), ARG(-5.0e-01,9.42443269378637893396e+00), RES(-6.0653062356058926528e-1, 2.0941500681575212464e-4)},
+ {FN (exp), ARG(-5.0e-01,-9.42443269378637893396e+00), RES(-6.0653062356058926528e-1, -2.0941500681575212464e-4)},
+ {FN (exp), ARG(5.0e-01,9.42512322775237976202e+00), RES(-1.6487211724286834501e0, -5.6924900763267464498e-4)},
+ {FN (exp), ARG(5.0e-01,-9.42512322775237976202e+00), RES(-1.6487211724286834501e0, 5.6924900763267464498e-4)},
+ {FN (exp), ARG(-5.0e-01,9.42512322775237976202e+00), RES(-6.0653062356058926544e-1, -2.0941500681530645317e-4)},
+ {FN (exp), ARG(-5.0e-01,-9.42512322775237976202e+00), RES(-6.0653062356058926544e-1, 2.0941500681530645317e-4)},
+ {FN (exp), ARG(1.0e+00,-3.45266983001243932001e-04), RES(2.7182816664368240602e0, -9.3853294721218487636e-4)},
+ {FN (exp), ARG(1.0e+00,3.45266983001243932001e-04), RES(2.7182816664368240602e0, 9.3853294721218487636e-4)},
+ {FN (exp), ARG(-1.0e+00,-3.45266983001243932001e-04), RES(3.6787941924411912823e-1, -1.2701662223785390836e-4)},
+ {FN (exp), ARG(-1.0e+00,3.45266983001243932001e-04), RES(3.6787941924411912823e-1, 1.2701662223785390836e-4)},
+ {FN (exp), ARG(1.0e+00,1.57045105981189525579e+00), RES(9.3853294721250973333e-4, 2.7182816664368240601e0)},
+ {FN (exp), ARG(1.0e+00,-1.57045105981189525579e+00), RES(9.3853294721250973333e-4, -2.7182816664368240601e0)},
+ {FN (exp), ARG(-1.0e+00,1.57045105981189525579e+00), RES(1.2701662223789787297e-4, 3.6787941924411912822e-1)},
+ {FN (exp), ARG(-1.0e+00,-1.57045105981189525579e+00), RES(1.2701662223789787297e-4, -3.6787941924411912822e-1)},
+ {FN (exp), ARG(1.0e+00,1.57114159377789786021e+00), RES(-9.3853294721217683983e-4, 2.7182816664368240602e0)},
+ {FN (exp), ARG(1.0e+00,-1.57114159377789786021e+00), RES(-9.3853294721217683983e-4, -2.7182816664368240602e0)},
+ {FN (exp), ARG(-1.0e+00,1.57114159377789786021e+00), RES(-1.2701662223785282074e-4, 3.6787941924411912823e-1)},
+ {FN (exp), ARG(-1.0e+00,-1.57114159377789786021e+00), RES(-1.2701662223785282074e-4, -3.6787941924411912823e-1)},
+ {FN (exp), ARG(1.0e+00,3.14124738660679181379e+00), RES(-2.718281666436824060e0, 9.3853294721267618008e-4)},
+ {FN (exp), ARG(1.0e+00,-3.14124738660679181379e+00), RES(-2.718281666436824060e0, -9.3853294721267618008e-4)},
+ {FN (exp), ARG(-1.0e+00,3.14124738660679181379e+00), RES(-3.6787941924411912821e-1, 1.2701662223792039909e-4)},
+ {FN (exp), ARG(-1.0e+00,-3.14124738660679181379e+00), RES(-3.6787941924411912821e-1, -1.2701662223792039909e-4)},
+ {FN (exp), ARG(1.0e+00,3.14193792057279441821e+00), RES(-2.7182816664368240603e0, -9.3853294721201039309e-4)},
+ {FN (exp), ARG(1.0e+00,-3.14193792057279441821e+00), RES(-2.7182816664368240603e0, 9.3853294721201039309e-4)},
+ {FN (exp), ARG(-1.0e+00,3.14193792057279441821e+00), RES(-3.6787941924411912824e-1, -1.2701662223783029462e-4)},
+ {FN (exp), ARG(-1.0e+00,-3.14193792057279441821e+00), RES(-3.6787941924411912824e-1, 1.2701662223783029462e-4)},
+ {FN (exp), ARG(1.0e+00,4.71204371340168837179e+00), RES(-9.3853294721284262682e-4, -2.718281666436824060e0)},
+ {FN (exp), ARG(1.0e+00,-4.71204371340168837179e+00), RES(-9.3853294721284262682e-4, 2.718281666436824060e0)},
+ {FN (exp), ARG(-1.0e+00,4.71204371340168837179e+00), RES(-1.2701662223794292521e-4, -3.6787941924411912820e-1)},
+ {FN (exp), ARG(-1.0e+00,-4.71204371340168837179e+00), RES(-1.2701662223794292521e-4, 3.6787941924411912820e-1)},
+ {FN (exp), ARG(1.0e+00,4.71273424736769097620e+00), RES(9.3853294721184394634e-4, -2.7182816664368240603e0)},
+ {FN (exp), ARG(1.0e+00,-4.71273424736769097620e+00), RES(9.3853294721184394634e-4, 2.7182816664368240603e0)},
+ {FN (exp), ARG(-1.0e+00,4.71273424736769097620e+00), RES(1.2701662223780776850e-4, -3.6787941924411912825e-1)},
+ {FN (exp), ARG(-1.0e+00,-4.71273424736769097620e+00), RES(1.2701662223780776850e-4, 3.6787941924411912825e-1)},
+ {FN (exp), ARG(1.0e+00,6.28284004019658492979e+00), RES(2.7182816664368240599e0, -9.3853294721300907357e-4)},
+ {FN (exp), ARG(1.0e+00,-6.28284004019658492979e+00), RES(2.7182816664368240599e0, 9.3853294721300907357e-4)},
+ {FN (exp), ARG(-1.0e+00,6.28284004019658492979e+00), RES(3.6787941924411912819e-1, -1.2701662223796545132e-4)},
+ {FN (exp), ARG(-1.0e+00,-6.28284004019658492979e+00), RES(3.6787941924411912819e-1, 1.2701662223796545132e-4)},
+ {FN (exp), ARG(1.0e+00,6.28353057416258753420e+00), RES(2.7182816664368240604e0, 9.3853294721167749959e-4)},
+ {FN (exp), ARG(1.0e+00,-6.28353057416258753420e+00), RES(2.7182816664368240604e0, -9.3853294721167749959e-4)},
+ {FN (exp), ARG(-1.0e+00,6.28353057416258753420e+00), RES(3.6787941924411912825e-1, 1.2701662223778524238e-4)},
+ {FN (exp), ARG(-1.0e+00,-6.28353057416258753420e+00), RES(3.6787941924411912825e-1, -1.2701662223778524238e-4)},
+ {FN (exp), ARG(1.0e+00,9.42443269378637893396e+00), RES(-2.7182816664368240606e0, 9.3853294721092764795e-4)},
+ {FN (exp), ARG(1.0e+00,-9.42443269378637893396e+00), RES(-2.7182816664368240606e0, -9.3853294721092764795e-4)},
+ {FN (exp), ARG(-1.0e+00,9.42443269378637893396e+00), RES(-3.6787941924411912829e-1, 1.270166222376837610e-4)},
+ {FN (exp), ARG(-1.0e+00,-9.42443269378637893396e+00), RES(-3.6787941924411912829e-1, -1.270166222376837610e-4)},
+ {FN (exp), ARG(1.0e+00,9.42512322775237976202e+00), RES(-2.7182816664368240613e0, -9.3853294720893028698e-4)},
+ {FN (exp), ARG(1.0e+00,-9.42512322775237976202e+00), RES(-2.7182816664368240613e0, 9.3853294720893028698e-4)},
+ {FN (exp), ARG(-1.0e+00,9.42512322775237976202e+00), RES(-3.6787941924411912838e-1, -1.2701662223741344759e-4)},
+ {FN (exp), ARG(-1.0e+00,-9.42512322775237976202e+00), RES(-3.6787941924411912838e-1, 1.2701662223741344759e-4)},
+ {FN (exp), ARG(2.0e+00,-3.45266983001243932001e-04), RES(7.3890556585085906002e0, -2.5511970558169944872e-3)},
+ {FN (exp), ARG(2.0e+00,3.45266983001243932001e-04), RES(7.3890556585085906002e0, 2.5511970558169944872e-3)},
+ {FN (exp), ARG(-2.0e+00,-3.45266983001243932001e-04), RES(1.3533527517000128913e-1, -4.6726804008345889445e-5)},
+ {FN (exp), ARG(-2.0e+00,3.45266983001243932001e-04), RES(1.3533527517000128913e-1, 4.6726804008345889445e-5)},
+ {FN (exp), ARG(2.0e+00,1.57045105981189525579e+00), RES(2.551197055817877540e-3, 7.3890556585085905999e0)},
+ {FN (exp), ARG(2.0e+00,-1.57045105981189525579e+00), RES(2.551197055817877540e-3, -7.3890556585085905999e0)},
+ {FN (exp), ARG(-2.0e+00,1.57045105981189525579e+00), RES(4.6726804008362063122e-5, 1.3533527517000128913e-1)},
+ {FN (exp), ARG(-2.0e+00,-1.57045105981189525579e+00), RES(4.6726804008362063122e-5, -1.3533527517000128913e-1)},
+ {FN (exp), ARG(2.0e+00,1.57114159377789786021e+00), RES(-2.5511970558169726417e-3, 7.3890556585085906002e0)},
+ {FN (exp), ARG(2.0e+00,-1.57114159377789786021e+00), RES(-2.5511970558169726417e-3, -7.3890556585085906002e0)},
+ {FN (exp), ARG(-2.0e+00,1.57114159377789786021e+00), RES(-4.6726804008345489330e-5, 1.3533527517000128913e-1)},
+ {FN (exp), ARG(-2.0e+00,-1.57114159377789786021e+00), RES(-4.6726804008345489330e-5, -1.3533527517000128913e-1)},
+ {FN (exp), ARG(2.0e+00,3.14124738660679181379e+00), RES(-7.3890556585085905998e0, 2.5511970558183299892e-3)},
+ {FN (exp), ARG(2.0e+00,-3.14124738660679181379e+00), RES(-7.3890556585085905998e0, -2.5511970558183299892e-3)},
+ {FN (exp), ARG(-2.0e+00,3.14124738660679181379e+00), RES(-1.3533527517000128912e-1, 4.6726804008370350017e-5)},
+ {FN (exp), ARG(-2.0e+00,-3.14124738660679181379e+00), RES(-1.3533527517000128912e-1, -4.6726804008370350017e-5)},
+ {FN (exp), ARG(2.0e+00,3.14193792057279441821e+00), RES(-7.3890556585085906004e0, -2.5511970558165201925e-3)},
+ {FN (exp), ARG(2.0e+00,-3.14193792057279441821e+00), RES(-7.3890556585085906004e0, 2.5511970558165201925e-3)},
+ {FN (exp), ARG(-2.0e+00,3.14193792057279441821e+00), RES(-1.3533527517000128914e-1, -4.6726804008337202435e-5)},
+ {FN (exp), ARG(-2.0e+00,-3.14193792057279441821e+00), RES(-1.3533527517000128914e-1, 4.6726804008337202435e-5)},
+ {FN (exp), ARG(2.0e+00,4.71204371340168837179e+00), RES(-2.5511970558187824384e-3, -7.3890556585085905996e0)},
+ {FN (exp), ARG(2.0e+00,-4.71204371340168837179e+00), RES(-2.5511970558187824384e-3, 7.3890556585085905996e0)},
+ {FN (exp), ARG(-2.0e+00,4.71204371340168837179e+00), RES(-4.6726804008378636913e-5, -1.3533527517000128912e-1)},
+ {FN (exp), ARG(-2.0e+00,-4.71204371340168837179e+00), RES(-4.6726804008378636913e-5, 1.3533527517000128912e-1)},
+ {FN (exp), ARG(2.0e+00,4.71273424736769097620e+00), RES(2.5511970558160677434e-3, -7.3890556585085906006e0)},
+ {FN (exp), ARG(2.0e+00,-4.71273424736769097620e+00), RES(2.5511970558160677434e-3, 7.3890556585085906006e0)},
+ {FN (exp), ARG(-2.0e+00,4.71273424736769097620e+00), RES(4.6726804008328915539e-5, -1.3533527517000128914e-1)},
+ {FN (exp), ARG(-2.0e+00,-4.71273424736769097620e+00), RES(4.6726804008328915539e-5, 1.3533527517000128914e-1)},
+ {FN (exp), ARG(2.0e+00,6.28284004019658492979e+00), RES(7.3890556585085905995e0, -2.5511970558192348875e-3)},
+ {FN (exp), ARG(2.0e+00,-6.28284004019658492979e+00), RES(7.3890556585085905995e0, 2.5511970558192348875e-3)},
+ {FN (exp), ARG(-2.0e+00,6.28284004019658492979e+00), RES(1.3533527517000128912e-1, -4.6726804008386923808e-5)},
+ {FN (exp), ARG(-2.0e+00,-6.28284004019658492979e+00), RES(1.3533527517000128912e-1, 4.6726804008386923808e-5)},
+ {FN (exp), ARG(2.0e+00,6.28353057416258753420e+00), RES(7.3890556585085906007e0, 2.5511970558156152942e-3)},
+ {FN (exp), ARG(2.0e+00,-6.28353057416258753420e+00), RES(7.3890556585085906007e0, -2.5511970558156152942e-3)},
+ {FN (exp), ARG(-2.0e+00,6.28353057416258753420e+00), RES(1.3533527517000128914e-1, 4.6726804008320628644e-5)},
+ {FN (exp), ARG(-2.0e+00,-6.28353057416258753420e+00), RES(1.3533527517000128914e-1, -4.6726804008320628644e-5)},
+ {FN (exp), ARG(2.0e+00,9.42443269378637893396e+00), RES(-7.3890556585085906014e0, 2.5511970558135769861e-3)},
+ {FN (exp), ARG(2.0e+00,-9.42443269378637893396e+00), RES(-7.3890556585085906014e0, -2.5511970558135769861e-3)},
+ {FN (exp), ARG(-2.0e+00,9.42443269378637893396e+00), RES(-1.3533527517000128916e-1, 4.6726804008283295729e-5)},
+ {FN (exp), ARG(-2.0e+00,-9.42443269378637893396e+00), RES(-1.3533527517000128916e-1, -4.6726804008283295729e-5)},
+ {FN (exp), ARG(2.0e+00,9.42512322775237976202e+00), RES(-7.3890556585085906033e0, -2.5511970558081475961e-3)},
+ {FN (exp), ARG(2.0e+00,-9.42512322775237976202e+00), RES(-7.3890556585085906033e0, 2.5511970558081475961e-3)},
+ {FN (exp), ARG(-2.0e+00,9.42512322775237976202e+00), RES(-1.3533527517000128919e-1, -4.6726804008183852982e-5)},
+ {FN (exp), ARG(-2.0e+00,-9.42512322775237976202e+00), RES(-1.3533527517000128919e-1, 4.6726804008183852982e-5)},
+ {FN (sin), ARG(-3.45266983001243932001e-04,0.0e+00), RES(-3.4526697614140534807e-4, 0.0)},
+ {FN (sin), ARG(3.45266983001243932001e-04,0.0e+00), RES(3.4526697614140534807e-4, 0.0)},
+ {FN (sin), ARG(-3.45266983001243932001e-04,1.19209289550781250e-07), RES(-3.4526697614140780134e-4, 1.1920928244535424533e-7)},
+ {FN (sin), ARG(-3.45266983001243932001e-04,-1.19209289550781250e-07), RES(-3.4526697614140780134e-4, -1.1920928244535424533e-7)},
+ {FN (sin), ARG(3.45266983001243932001e-04,1.19209289550781250e-07), RES(3.4526697614140780134e-4, 1.1920928244535424533e-7)},
+ {FN (sin), ARG(3.45266983001243932001e-04,-1.19209289550781250e-07), RES(3.4526697614140780134e-4, -1.1920928244535424533e-7)},
+ {FN (sin), ARG(-3.45266983001243932001e-04,5.0e-01), RES(-3.8933200722534065172e-4, 5.2109527443404709209e-1)},
+ {FN (sin), ARG(-3.45266983001243932001e-04,-5.0e-01), RES(-3.8933200722534065172e-4, -5.2109527443404709209e-1)},
+ {FN (sin), ARG(3.45266983001243932001e-04,5.0e-01), RES(3.8933200722534065172e-4, 5.2109527443404709209e-1)},
+ {FN (sin), ARG(3.45266983001243932001e-04,-5.0e-01), RES(3.8933200722534065172e-4, -5.2109527443404709209e-1)},
+ {FN (sin), ARG(-3.45266983001243932001e-04,1.0e+00), RES(-5.3277478472501939236e-4, 1.1752011235963524660e0)},
+ {FN (sin), ARG(-3.45266983001243932001e-04,-1.0e+00), RES(-5.3277478472501939236e-4, -1.1752011235963524660e0)},
+ {FN (sin), ARG(3.45266983001243932001e-04,1.0e+00), RES(5.3277478472501939236e-4, 1.1752011235963524660e0)},
+ {FN (sin), ARG(3.45266983001243932001e-04,-1.0e+00), RES(5.3277478472501939236e-4, -1.1752011235963524660e0)},
+ {FN (sin), ARG(-3.45266983001243932001e-04,2.0e+00), RES(-1.2989619299126701883e-3, 3.6268601916692946556e0)},
+ {FN (sin), ARG(-3.45266983001243932001e-04,-2.0e+00), RES(-1.2989619299126701883e-3, -3.6268601916692946556e0)},
+ {FN (sin), ARG(3.45266983001243932001e-04,2.0e+00), RES(1.2989619299126701883e-3, 3.6268601916692946556e0)},
+ {FN (sin), ARG(3.45266983001243932001e-04,-2.0e+00), RES(1.2989619299126701883e-3, -3.6268601916692946556e0)},
+ {FN (sin), ARG(1.57045105981189525579e+00,0.0e+00), RES(9.9999994039535581669e-1, 0.0)},
+ {FN (sin), ARG(-1.57045105981189525579e+00,0.0e+00), RES(-9.9999994039535581669e-1, 0.0)},
+ {FN (sin), ARG(1.57045105981189525579e+00,1.19209289550781250e-07), RES(9.9999994039536292211e-1, 4.1159030931177815679e-11)},
+ {FN (sin), ARG(1.57045105981189525579e+00,-1.19209289550781250e-07), RES(9.9999994039536292211e-1, -4.1159030931177815679e-11)},
+ {FN (sin), ARG(-1.57045105981189525579e+00,1.19209289550781250e-07), RES(-9.9999994039536292211e-1, 4.1159030931177815679e-11)},
+ {FN (sin), ARG(-1.57045105981189525579e+00,-1.19209289550781250e-07), RES(-9.9999994039536292211e-1, -4.1159030931177815679e-11)},
+ {FN (sin), ARG(1.57045105981189525579e+00,5.0e-01), RES(1.1276258979946363572e0, 1.7991700040937027667e-4)},
+ {FN (sin), ARG(1.57045105981189525579e+00,-5.0e-01), RES(1.1276258979946363572e0, -1.7991700040937027667e-4)},
+ {FN (sin), ARG(-1.57045105981189525579e+00,5.0e-01), RES(-1.1276258979946363572e0, 1.7991700040937027667e-4)},
+ {FN (sin), ARG(-1.57045105981189525579e+00,-5.0e-01), RES(-1.1276258979946363572e0, -1.7991700040937027667e-4)},
+ {FN (sin), ARG(1.57045105981189525579e+00,1.0e+00), RES(1.5430805428404715942e0, 4.0575816248730593018e-4)},
+ {FN (sin), ARG(1.57045105981189525579e+00,-1.0e+00), RES(1.5430805428404715942e0, -4.0575816248730593018e-4)},
+ {FN (sin), ARG(-1.57045105981189525579e+00,1.0e+00), RES(-1.5430805428404715942e0, 4.0575816248730593018e-4)},
+ {FN (sin), ARG(-1.57045105981189525579e+00,-1.0e+00), RES(-1.5430805428404715942e0, -4.0575816248730593018e-4)},
+ {FN (sin), ARG(1.57045105981189525579e+00,2.0e+00), RES(3.7621954668392959445e0, 1.2522351259047577385e-3)},
+ {FN (sin), ARG(1.57045105981189525579e+00,-2.0e+00), RES(3.7621954668392959445e0, -1.2522351259047577385e-3)},
+ {FN (sin), ARG(-1.57045105981189525579e+00,2.0e+00), RES(-3.7621954668392959445e0, 1.2522351259047577385e-3)},
+ {FN (sin), ARG(-1.57045105981189525579e+00,-2.0e+00), RES(-3.7621954668392959445e0, -1.2522351259047577385e-3)},
+ {FN (sin), ARG(1.57114159377789786021e+00,0.0e+00), RES(9.9999994039535581673e-1, 0.0)},
+ {FN (sin), ARG(-1.57114159377789786021e+00,0.0e+00), RES(-9.9999994039535581673e-1, 0.0)},
+ {FN (sin), ARG(1.57114159377789786021e+00,1.19209289550781250e-07), RES(9.9999994039536292216e-1, -4.1159030931163216752e-11)},
+ {FN (sin), ARG(1.57114159377789786021e+00,-1.19209289550781250e-07), RES(9.9999994039536292216e-1, 4.1159030931163216752e-11)},
+ {FN (sin), ARG(-1.57114159377789786021e+00,1.19209289550781250e-07), RES(-9.9999994039536292216e-1, -4.1159030931163216752e-11)},
+ {FN (sin), ARG(-1.57114159377789786021e+00,-1.19209289550781250e-07), RES(-9.9999994039536292216e-1, 4.1159030931163216752e-11)},
+ {FN (sin), ARG(1.57114159377789786021e+00,5.0e-01), RES(1.1276258979946363573e0, -1.7991700040930646090e-4)},
+ {FN (sin), ARG(1.57114159377789786021e+00,-5.0e-01), RES(1.1276258979946363573e0, 1.7991700040930646090e-4)},
+ {FN (sin), ARG(-1.57114159377789786021e+00,5.0e-01), RES(-1.1276258979946363573e0, -1.7991700040930646090e-4)},
+ {FN (sin), ARG(-1.57114159377789786021e+00,-5.0e-01), RES(-1.1276258979946363573e0, 1.7991700040930646090e-4)},
+ {FN (sin), ARG(1.57114159377789786021e+00,1.0e+00), RES(1.5430805428404715942e0, -4.0575816248716200955e-4)},
+ {FN (sin), ARG(1.57114159377789786021e+00,-1.0e+00), RES(1.5430805428404715942e0, 4.0575816248716200955e-4)},
+ {FN (sin), ARG(-1.57114159377789786021e+00,1.0e+00), RES(-1.5430805428404715942e0, -4.0575816248716200955e-4)},
+ {FN (sin), ARG(-1.57114159377789786021e+00,-1.0e+00), RES(-1.5430805428404715942e0, 4.0575816248716200955e-4)},
+ {FN (sin), ARG(1.57114159377789786021e+00,2.0e+00), RES(3.7621954668392959447e0, -1.2522351259043135762e-3)},
+ {FN (sin), ARG(1.57114159377789786021e+00,-2.0e+00), RES(3.7621954668392959447e0, 1.2522351259043135762e-3)},
+ {FN (sin), ARG(-1.57114159377789786021e+00,2.0e+00), RES(-3.7621954668392959447e0, -1.2522351259043135762e-3)},
+ {FN (sin), ARG(-1.57114159377789786021e+00,-2.0e+00), RES(-3.7621954668392959447e0, 1.2522351259043135762e-3)},
+ {FN (sin), ARG(3.14124738660679181379e+00,0.0e+00), RES(3.4526697614158608860e-4, 0.0)},
+ {FN (sin), ARG(-3.14124738660679181379e+00,0.0e+00), RES(-3.4526697614158608860e-4, 0.0)},
+ {FN (sin), ARG(3.14124738660679181379e+00,1.19209289550781250e-07), RES(3.4526697614158854187e-4, -1.1920928244535424532e-7)},
+ {FN (sin), ARG(3.14124738660679181379e+00,-1.19209289550781250e-07), RES(3.4526697614158854187e-4, 1.1920928244535424532e-7)},
+ {FN (sin), ARG(-3.14124738660679181379e+00,1.19209289550781250e-07), RES(-3.4526697614158854187e-4, -1.1920928244535424532e-7)},
+ {FN (sin), ARG(-3.14124738660679181379e+00,-1.19209289550781250e-07), RES(-3.4526697614158854187e-4, 1.1920928244535424532e-7)},
+ {FN (sin), ARG(3.14124738660679181379e+00,5.0e-01), RES(3.8933200722554445944e-4, -5.2109527443404709206e-1)},
+ {FN (sin), ARG(3.14124738660679181379e+00,-5.0e-01), RES(3.8933200722554445944e-4, 5.2109527443404709206e-1)},
+ {FN (sin), ARG(-3.14124738660679181379e+00,5.0e-01), RES(-3.8933200722554445944e-4, -5.2109527443404709206e-1)},
+ {FN (sin), ARG(-3.14124738660679181379e+00,-5.0e-01), RES(-3.8933200722554445944e-4, 5.2109527443404709206e-1)},
+ {FN (sin), ARG(3.14124738660679181379e+00,1.0e+00), RES(5.3277478472529828958e-4, -1.1752011235963524659e0)},
+ {FN (sin), ARG(3.14124738660679181379e+00,-1.0e+00), RES(5.3277478472529828958e-4, 1.1752011235963524659e0)},
+ {FN (sin), ARG(-3.14124738660679181379e+00,1.0e+00), RES(-5.3277478472529828958e-4, -1.1752011235963524659e0)},
+ {FN (sin), ARG(-3.14124738660679181379e+00,-1.0e+00), RES(-5.3277478472529828958e-4, 1.1752011235963524659e0)},
+ {FN (sin), ARG(3.14124738660679181379e+00,2.0e+00), RES(1.2989619299133501696e-3, -3.6268601916692946553e0)},
+ {FN (sin), ARG(3.14124738660679181379e+00,-2.0e+00), RES(1.2989619299133501696e-3, 3.6268601916692946553e0)},
+ {FN (sin), ARG(-3.14124738660679181379e+00,2.0e+00), RES(-1.2989619299133501696e-3, -3.6268601916692946553e0)},
+ {FN (sin), ARG(-3.14124738660679181379e+00,-2.0e+00), RES(-1.2989619299133501696e-3, 3.6268601916692946553e0)},
+ {FN (sin), ARG(3.14193792057279441821e+00,0.0e+00), RES(-3.4526697614134115926e-4, 0.0)},
+ {FN (sin), ARG(-3.14193792057279441821e+00,0.0e+00), RES(3.4526697614134115926e-4, 0.0)},
+ {FN (sin), ARG(3.14193792057279441821e+00,1.19209289550781250e-07), RES(-3.4526697614134361253e-4, -1.1920928244535424533e-7)},
+ {FN (sin), ARG(3.14193792057279441821e+00,-1.19209289550781250e-07), RES(-3.4526697614134361253e-4, 1.1920928244535424533e-7)},
+ {FN (sin), ARG(-3.14193792057279441821e+00,1.19209289550781250e-07), RES(3.4526697614134361253e-4, -1.1920928244535424533e-7)},
+ {FN (sin), ARG(-3.14193792057279441821e+00,-1.19209289550781250e-07), RES(3.4526697614134361253e-4, 1.1920928244535424533e-7)},
+ {FN (sin), ARG(3.14193792057279441821e+00,5.0e-01), RES(-3.8933200722526827075e-4, -5.2109527443404709211e-1)},
+ {FN (sin), ARG(3.14193792057279441821e+00,-5.0e-01), RES(-3.8933200722526827075e-4, 5.2109527443404709211e-1)},
+ {FN (sin), ARG(-3.14193792057279441821e+00,5.0e-01), RES(3.8933200722526827075e-4, -5.2109527443404709211e-1)},
+ {FN (sin), ARG(-3.14193792057279441821e+00,-5.0e-01), RES(3.8933200722526827075e-4, 5.2109527443404709211e-1)},
+ {FN (sin), ARG(3.14193792057279441821e+00,1.0e+00), RES(-5.3277478472492034385e-4, -1.1752011235963524660e0)},
+ {FN (sin), ARG(3.14193792057279441821e+00,-1.0e+00), RES(-5.3277478472492034385e-4, 1.1752011235963524660e0)},
+ {FN (sin), ARG(-3.14193792057279441821e+00,1.0e+00), RES(5.3277478472492034385e-4, -1.1752011235963524660e0)},
+ {FN (sin), ARG(-3.14193792057279441821e+00,-1.0e+00), RES(5.3277478472492034385e-4, 1.1752011235963524660e0)},
+ {FN (sin), ARG(3.14193792057279441821e+00,2.0e+00), RES(-1.2989619299124286975e-3, -3.6268601916692946556e0)},
+ {FN (sin), ARG(3.14193792057279441821e+00,-2.0e+00), RES(-1.2989619299124286975e-3, 3.6268601916692946556e0)},
+ {FN (sin), ARG(-3.14193792057279441821e+00,2.0e+00), RES(1.2989619299124286975e-3, -3.6268601916692946556e0)},
+ {FN (sin), ARG(-3.14193792057279441821e+00,-2.0e+00), RES(1.2989619299124286975e-3, 3.6268601916692946556e0)},
+ {FN (sin), ARG(4.71204371340168837179e+00,0.0e+00), RES(-9.9999994039535581664e-1, 0.0)},
+ {FN (sin), ARG(-4.71204371340168837179e+00,0.0e+00), RES(9.9999994039535581664e-1, 0.0)},
+ {FN (sin), ARG(4.71204371340168837179e+00,1.19209289550781250e-07), RES(-9.9999994039536292207e-1, -4.1159030931192414605e-11)},
+ {FN (sin), ARG(4.71204371340168837179e+00,-1.19209289550781250e-07), RES(-9.9999994039536292207e-1, 4.1159030931192414605e-11)},
+ {FN (sin), ARG(-4.71204371340168837179e+00,1.19209289550781250e-07), RES(9.9999994039536292207e-1, -4.1159030931192414605e-11)},
+ {FN (sin), ARG(-4.71204371340168837179e+00,-1.19209289550781250e-07), RES(9.9999994039536292207e-1, 4.1159030931192414605e-11)},
+ {FN (sin), ARG(4.71204371340168837179e+00,5.0e-01), RES(-1.1276258979946363572e0, -1.7991700040943409243e-4)},
+ {FN (sin), ARG(4.71204371340168837179e+00,-5.0e-01), RES(-1.1276258979946363572e0, 1.7991700040943409243e-4)},
+ {FN (sin), ARG(-4.71204371340168837179e+00,5.0e-01), RES(1.1276258979946363572e0, -1.7991700040943409243e-4)},
+ {FN (sin), ARG(-4.71204371340168837179e+00,-5.0e-01), RES(1.1276258979946363572e0, 1.7991700040943409243e-4)},
+ {FN (sin), ARG(4.71204371340168837179e+00,1.0e+00), RES(-1.5430805428404715941e0, -4.0575816248744985081e-4)},
+ {FN (sin), ARG(4.71204371340168837179e+00,-1.0e+00), RES(-1.5430805428404715941e0, 4.0575816248744985081e-4)},
+ {FN (sin), ARG(-4.71204371340168837179e+00,1.0e+00), RES(1.5430805428404715941e0, -4.0575816248744985081e-4)},
+ {FN (sin), ARG(-4.71204371340168837179e+00,-1.0e+00), RES(1.5430805428404715941e0, 4.0575816248744985081e-4)},
+ {FN (sin), ARG(4.71204371340168837179e+00,2.0e+00), RES(-3.7621954668392959444e0, -1.2522351259052019007e-3)},
+ {FN (sin), ARG(4.71204371340168837179e+00,-2.0e+00), RES(-3.7621954668392959444e0, 1.2522351259052019007e-3)},
+ {FN (sin), ARG(-4.71204371340168837179e+00,2.0e+00), RES(3.7621954668392959444e0, -1.2522351259052019007e-3)},
+ {FN (sin), ARG(-4.71204371340168837179e+00,-2.0e+00), RES(3.7621954668392959444e0, 1.2522351259052019007e-3)},
+ {FN (sin), ARG(4.71273424736769097620e+00,0.0e+00), RES(-9.9999994039535581677e-1, 0.0)},
+ {FN (sin), ARG(-4.71273424736769097620e+00,0.0e+00), RES(9.9999994039535581677e-1, 0.0)},
+ {FN (sin), ARG(4.71273424736769097620e+00,1.19209289550781250e-07), RES(-9.9999994039536292220e-1, 4.1159030931148617825e-11)},
+ {FN (sin), ARG(4.71273424736769097620e+00,-1.19209289550781250e-07), RES(-9.9999994039536292220e-1, -4.1159030931148617825e-11)},
+ {FN (sin), ARG(-4.71273424736769097620e+00,1.19209289550781250e-07), RES(9.9999994039536292220e-1, 4.1159030931148617825e-11)},
+ {FN (sin), ARG(-4.71273424736769097620e+00,-1.19209289550781250e-07), RES(9.9999994039536292220e-1, -4.1159030931148617825e-11)},
+ {FN (sin), ARG(4.71273424736769097620e+00,5.0e-01), RES(-1.1276258979946363573e0, 1.7991700040924264514e-4)},
+ {FN (sin), ARG(4.71273424736769097620e+00,-5.0e-01), RES(-1.1276258979946363573e0, -1.7991700040924264514e-4)},
+ {FN (sin), ARG(-4.71273424736769097620e+00,5.0e-01), RES(1.1276258979946363573e0, 1.7991700040924264514e-4)},
+ {FN (sin), ARG(-4.71273424736769097620e+00,-5.0e-01), RES(1.1276258979946363573e0, -1.7991700040924264514e-4)},
+ {FN (sin), ARG(4.71273424736769097620e+00,1.0e+00), RES(-1.5430805428404715943e0, 4.0575816248701808892e-4)},
+ {FN (sin), ARG(4.71273424736769097620e+00,-1.0e+00), RES(-1.5430805428404715943e0, -4.0575816248701808892e-4)},
+ {FN (sin), ARG(-4.71273424736769097620e+00,1.0e+00), RES(1.5430805428404715943e0, 4.0575816248701808892e-4)},
+ {FN (sin), ARG(-4.71273424736769097620e+00,-1.0e+00), RES(1.5430805428404715943e0, -4.0575816248701808892e-4)},
+ {FN (sin), ARG(4.71273424736769097620e+00,2.0e+00), RES(-3.7621954668392959448e0, 1.2522351259038694139e-3)},
+ {FN (sin), ARG(4.71273424736769097620e+00,-2.0e+00), RES(-3.7621954668392959448e0, -1.2522351259038694139e-3)},
+ {FN (sin), ARG(-4.71273424736769097620e+00,2.0e+00), RES(3.7621954668392959448e0, 1.2522351259038694139e-3)},
+ {FN (sin), ARG(-4.71273424736769097620e+00,-2.0e+00), RES(3.7621954668392959448e0, -1.2522351259038694139e-3)},
+ {FN (sin), ARG(6.28284004019658492979e+00,0.0e+00), RES(-3.4526697614170855328e-4, 0.0)},
+ {FN (sin), ARG(-6.28284004019658492979e+00,0.0e+00), RES(3.4526697614170855328e-4, 0.0)},
+ {FN (sin), ARG(6.28284004019658492979e+00,1.19209289550781250e-07), RES(-3.4526697614171100655e-4, 1.1920928244535424532e-7)},
+ {FN (sin), ARG(6.28284004019658492979e+00,-1.19209289550781250e-07), RES(-3.4526697614171100655e-4, -1.1920928244535424532e-7)},
+ {FN (sin), ARG(-6.28284004019658492979e+00,1.19209289550781250e-07), RES(3.4526697614171100655e-4, 1.1920928244535424532e-7)},
+ {FN (sin), ARG(-6.28284004019658492979e+00,-1.19209289550781250e-07), RES(3.4526697614171100655e-4, -1.1920928244535424532e-7)},
+ {FN (sin), ARG(6.28284004019658492979e+00,5.0e-01), RES(-3.8933200722568255379e-4, 5.2109527443404709204e-1)},
+ {FN (sin), ARG(6.28284004019658492979e+00,-5.0e-01), RES(-3.8933200722568255379e-4, -5.2109527443404709204e-1)},
+ {FN (sin), ARG(-6.28284004019658492979e+00,5.0e-01), RES(3.8933200722568255379e-4, 5.2109527443404709204e-1)},
+ {FN (sin), ARG(-6.28284004019658492979e+00,-5.0e-01), RES(3.8933200722568255379e-4, -5.2109527443404709204e-1)},
+ {FN (sin), ARG(6.28284004019658492979e+00,1.0e+00), RES(-5.3277478472548726245e-4, 1.1752011235963524659e0)},
+ {FN (sin), ARG(6.28284004019658492979e+00,-1.0e+00), RES(-5.3277478472548726245e-4, -1.1752011235963524659e0)},
+ {FN (sin), ARG(-6.28284004019658492979e+00,1.0e+00), RES(5.3277478472548726245e-4, 1.1752011235963524659e0)},
+ {FN (sin), ARG(-6.28284004019658492979e+00,-1.0e+00), RES(5.3277478472548726245e-4, -1.1752011235963524659e0)},
+ {FN (sin), ARG(6.28284004019658492979e+00,2.0e+00), RES(-1.2989619299138109057e-3, 3.6268601916692946552e0)},
+ {FN (sin), ARG(6.28284004019658492979e+00,-2.0e+00), RES(-1.2989619299138109057e-3, -3.6268601916692946552e0)},
+ {FN (sin), ARG(-6.28284004019658492979e+00,2.0e+00), RES(1.2989619299138109057e-3, 3.6268601916692946552e0)},
+ {FN (sin), ARG(-6.28284004019658492979e+00,-2.0e+00), RES(1.2989619299138109057e-3, -3.6268601916692946552e0)},
+ {FN (sin), ARG(6.28353057416258753420e+00,0.0e+00), RES(3.4526697614121869459e-4, 0.0)},
+ {FN (sin), ARG(-6.28353057416258753420e+00,0.0e+00), RES(-3.4526697614121869459e-4, 0.0)},
+ {FN (sin), ARG(6.28353057416258753420e+00,1.19209289550781250e-07), RES(3.4526697614122114786e-4, 1.1920928244535424534e-7)},
+ {FN (sin), ARG(6.28353057416258753420e+00,-1.19209289550781250e-07), RES(3.4526697614122114786e-4, -1.1920928244535424534e-7)},
+ {FN (sin), ARG(-6.28353057416258753420e+00,1.19209289550781250e-07), RES(-3.4526697614122114786e-4, 1.1920928244535424534e-7)},
+ {FN (sin), ARG(-6.28353057416258753420e+00,-1.19209289550781250e-07), RES(-3.4526697614122114786e-4, -1.1920928244535424534e-7)},
+ {FN (sin), ARG(6.28353057416258753420e+00,5.0e-01), RES(3.8933200722513017641e-4, 5.2109527443404709213e-1)},
+ {FN (sin), ARG(6.28353057416258753420e+00,-5.0e-01), RES(3.8933200722513017641e-4, -5.2109527443404709213e-1)},
+ {FN (sin), ARG(-6.28353057416258753420e+00,5.0e-01), RES(-3.8933200722513017641e-4, 5.2109527443404709213e-1)},
+ {FN (sin), ARG(-6.28353057416258753420e+00,-5.0e-01), RES(-3.8933200722513017641e-4, -5.2109527443404709213e-1)},
+ {FN (sin), ARG(6.28353057416258753420e+00,1.0e+00), RES(5.3277478472473137099e-4, 1.1752011235963524661e0)},
+ {FN (sin), ARG(6.28353057416258753420e+00,-1.0e+00), RES(5.3277478472473137099e-4, -1.1752011235963524661e0)},
+ {FN (sin), ARG(-6.28353057416258753420e+00,1.0e+00), RES(-5.3277478472473137099e-4, 1.1752011235963524661e0)},
+ {FN (sin), ARG(-6.28353057416258753420e+00,-1.0e+00), RES(-5.3277478472473137099e-4, -1.1752011235963524661e0)},
+ {FN (sin), ARG(6.28353057416258753420e+00,2.0e+00), RES(1.2989619299119679614e-3, 3.6268601916692946558e0)},
+ {FN (sin), ARG(6.28353057416258753420e+00,-2.0e+00), RES(1.2989619299119679614e-3, -3.6268601916692946558e0)},
+ {FN (sin), ARG(-6.28353057416258753420e+00,2.0e+00), RES(-1.2989619299119679614e-3, 3.6268601916692946558e0)},
+ {FN (sin), ARG(-6.28353057416258753420e+00,-2.0e+00), RES(-1.2989619299119679614e-3, -3.6268601916692946558e0)},
+ {FN (sin), ARG(9.42443269378637893396e+00,0.0e+00), RES(3.4526697614094283958e-4, 0.0)},
+ {FN (sin), ARG(-9.42443269378637893396e+00,0.0e+00), RES(-3.4526697614094283958e-4, 0.0)},
+ {FN (sin), ARG(9.42443269378637893396e+00,1.19209289550781250e-07), RES(3.4526697614094529285e-4, -1.1920928244535424535e-7)},
+ {FN (sin), ARG(9.42443269378637893396e+00,-1.19209289550781250e-07), RES(3.4526697614094529285e-4, 1.1920928244535424535e-7)},
+ {FN (sin), ARG(-9.42443269378637893396e+00,1.19209289550781250e-07), RES(-3.4526697614094529285e-4, -1.1920928244535424535e-7)},
+ {FN (sin), ARG(-9.42443269378637893396e+00,-1.19209289550781250e-07), RES(-3.4526697614094529285e-4, 1.1920928244535424535e-7)},
+ {FN (sin), ARG(9.42443269378637893396e+00,5.0e-01), RES(3.8933200722481911514e-4, -5.2109527443404709218e-1)},
+ {FN (sin), ARG(9.42443269378637893396e+00,-5.0e-01), RES(3.8933200722481911514e-4, 5.2109527443404709218e-1)},
+ {FN (sin), ARG(-9.42443269378637893396e+00,5.0e-01), RES(-3.8933200722481911514e-4, -5.2109527443404709218e-1)},
+ {FN (sin), ARG(-9.42443269378637893396e+00,-5.0e-01), RES(-3.8933200722481911514e-4, 5.2109527443404709218e-1)},
+ {FN (sin), ARG(9.42443269378637893396e+00,1.0e+00), RES(5.3277478472430570447e-4, -1.1752011235963524662e0)},
+ {FN (sin), ARG(9.42443269378637893396e+00,-1.0e+00), RES(5.3277478472430570447e-4, 1.1752011235963524662e0)},
+ {FN (sin), ARG(-9.42443269378637893396e+00,1.0e+00), RES(-5.3277478472430570447e-4, -1.1752011235963524662e0)},
+ {FN (sin), ARG(-9.42443269378637893396e+00,-1.0e+00), RES(-5.3277478472430570447e-4, 1.1752011235963524662e0)},
+ {FN (sin), ARG(9.42443269378637893396e+00,2.0e+00), RES(1.2989619299109301409e-3, -3.6268601916692946561e0)},
+ {FN (sin), ARG(9.42443269378637893396e+00,-2.0e+00), RES(1.2989619299109301409e-3, 3.6268601916692946561e0)},
+ {FN (sin), ARG(-9.42443269378637893396e+00,2.0e+00), RES(-1.2989619299109301409e-3, -3.6268601916692946561e0)},
+ {FN (sin), ARG(-9.42443269378637893396e+00,-2.0e+00), RES(-1.2989619299109301409e-3, 3.6268601916692946561e0)},
+ {FN (sin), ARG(9.42512322775237976202e+00,0.0e+00), RES(-3.4526697614020805155e-4, 0.0)},
+ {FN (sin), ARG(-9.42512322775237976202e+00,0.0e+00), RES(3.4526697614020805155e-4, 0.0)},
+ {FN (sin), ARG(9.42512322775237976202e+00,1.19209289550781250e-07), RES(-3.4526697614021050482e-4, -1.1920928244535424538e-7)},
+ {FN (sin), ARG(9.42512322775237976202e+00,-1.19209289550781250e-07), RES(-3.4526697614021050482e-4, 1.1920928244535424538e-7)},
+ {FN (sin), ARG(-9.42512322775237976202e+00,1.19209289550781250e-07), RES(3.4526697614021050482e-4, -1.1920928244535424538e-7)},
+ {FN (sin), ARG(-9.42512322775237976202e+00,-1.19209289550781250e-07), RES(3.4526697614021050482e-4, 1.1920928244535424538e-7)},
+ {FN (sin), ARG(9.42512322775237976202e+00,5.0e-01), RES(-3.8933200722399054908e-4, -5.2109527443404709231e-1)},
+ {FN (sin), ARG(9.42512322775237976202e+00,-5.0e-01), RES(-3.8933200722399054908e-4, 5.2109527443404709231e-1)},
+ {FN (sin), ARG(-9.42512322775237976202e+00,5.0e-01), RES(3.8933200722399054908e-4, -5.2109527443404709231e-1)},
+ {FN (sin), ARG(-9.42512322775237976202e+00,-5.0e-01), RES(3.8933200722399054908e-4, 5.2109527443404709231e-1)},
+ {FN (sin), ARG(9.42512322775237976202e+00,1.0e+00), RES(-5.3277478472317186729e-4, -1.1752011235963524665e0)},
+ {FN (sin), ARG(9.42512322775237976202e+00,-1.0e+00), RES(-5.3277478472317186729e-4, 1.1752011235963524665e0)},
+ {FN (sin), ARG(-9.42512322775237976202e+00,1.0e+00), RES(5.3277478472317186729e-4, -1.1752011235963524665e0)},
+ {FN (sin), ARG(-9.42512322775237976202e+00,-1.0e+00), RES(5.3277478472317186729e-4, 1.1752011235963524665e0)},
+ {FN (sin), ARG(9.42512322775237976202e+00,2.0e+00), RES(-1.2989619299081657245e-3, -3.6268601916692946571e0)},
+ {FN (sin), ARG(9.42512322775237976202e+00,-2.0e+00), RES(-1.2989619299081657245e-3, 3.6268601916692946571e0)},
+ {FN (sin), ARG(-9.42512322775237976202e+00,2.0e+00), RES(1.2989619299081657245e-3, -3.6268601916692946571e0)},
+ {FN (sin), ARG(-9.42512322775237976202e+00,-2.0e+00), RES(1.2989619299081657245e-3, 3.6268601916692946571e0)},
+ {FN (cos), ARG(-3.45266983001243932001e-04,0.0e+00), RES(9.9999994039535581673e-1, 0.0)},
+ {FN (cos), ARG(3.45266983001243932001e-04,0.0e+00), RES(9.9999994039535581673e-1, 0.0)},
+ {FN (cos), ARG(-3.45266983001243932001e-04,1.19209289550781250e-07), RES(9.9999994039536292216e-1, 4.1159030931163569191e-11)},
+ {FN (cos), ARG(-3.45266983001243932001e-04,-1.19209289550781250e-07), RES(9.9999994039536292216e-1, -4.1159030931163569191e-11)},
+ {FN (cos), ARG(3.45266983001243932001e-04,1.19209289550781250e-07), RES(9.9999994039536292216e-1, -4.1159030931163569191e-11)},
+ {FN (cos), ARG(3.45266983001243932001e-04,-1.19209289550781250e-07), RES(9.9999994039536292216e-1, 4.1159030931163569191e-11)},
+ {FN (cos), ARG(-3.45266983001243932001e-04,5.0e-01), RES(1.1276258979946363573e0, 1.7991700040930800151e-4)},
+ {FN (cos), ARG(-3.45266983001243932001e-04,-5.0e-01), RES(1.1276258979946363573e0, -1.7991700040930800151e-4)},
+ {FN (cos), ARG(3.45266983001243932001e-04,5.0e-01), RES(1.1276258979946363573e0, -1.7991700040930800151e-4)},
+ {FN (cos), ARG(3.45266983001243932001e-04,-5.0e-01), RES(1.1276258979946363573e0, 1.7991700040930800151e-4)},
+ {FN (cos), ARG(-3.45266983001243932001e-04,1.0e+00), RES(1.5430805428404715942e0, 4.057581624871654840e-4)},
+ {FN (cos), ARG(-3.45266983001243932001e-04,-1.0e+00), RES(1.5430805428404715942e0, -4.057581624871654840e-4)},
+ {FN (cos), ARG(3.45266983001243932001e-04,1.0e+00), RES(1.5430805428404715942e0, -4.057581624871654840e-4)},
+ {FN (cos), ARG(3.45266983001243932001e-04,-1.0e+00), RES(1.5430805428404715942e0, 4.057581624871654840e-4)},
+ {FN (cos), ARG(-3.45266983001243932001e-04,2.0e+00), RES(3.7621954668392959447e0, 1.2522351259043242989e-3)},
+ {FN (cos), ARG(-3.45266983001243932001e-04,-2.0e+00), RES(3.7621954668392959447e0, -1.2522351259043242989e-3)},
+ {FN (cos), ARG(3.45266983001243932001e-04,2.0e+00), RES(3.7621954668392959447e0, -1.2522351259043242989e-3)},
+ {FN (cos), ARG(3.45266983001243932001e-04,-2.0e+00), RES(3.7621954668392959447e0, 1.2522351259043242989e-3)},
+ {FN (cos), ARG(1.57045105981189525579e+00,0.0e+00), RES(3.4526697614152485627e-4, 0.0)},
+ {FN (cos), ARG(-1.57045105981189525579e+00,0.0e+00), RES(3.4526697614152485627e-4, 0.0)},
+ {FN (cos), ARG(1.57045105981189525579e+00,1.19209289550781250e-07), RES(3.4526697614152730954e-4, -1.1920928244535424532e-7)},
+ {FN (cos), ARG(1.57045105981189525579e+00,-1.19209289550781250e-07), RES(3.4526697614152730954e-4, 1.1920928244535424532e-7)},
+ {FN (cos), ARG(-1.57045105981189525579e+00,1.19209289550781250e-07), RES(3.4526697614152730954e-4, 1.1920928244535424532e-7)},
+ {FN (cos), ARG(-1.57045105981189525579e+00,-1.19209289550781250e-07), RES(3.4526697614152730954e-4, -1.1920928244535424532e-7)},
+ {FN (cos), ARG(1.57045105981189525579e+00,5.0e-01), RES(3.8933200722547541227e-4, -5.2109527443404709207e-1)},
+ {FN (cos), ARG(1.57045105981189525579e+00,-5.0e-01), RES(3.8933200722547541227e-4, 5.2109527443404709207e-1)},
+ {FN (cos), ARG(-1.57045105981189525579e+00,5.0e-01), RES(3.8933200722547541227e-4, 5.2109527443404709207e-1)},
+ {FN (cos), ARG(-1.57045105981189525579e+00,-5.0e-01), RES(3.8933200722547541227e-4, -5.2109527443404709207e-1)},
+ {FN (cos), ARG(1.57045105981189525579e+00,1.0e+00), RES(5.3277478472520380315e-4, -1.1752011235963524659e0)},
+ {FN (cos), ARG(1.57045105981189525579e+00,-1.0e+00), RES(5.3277478472520380315e-4, 1.1752011235963524659e0)},
+ {FN (cos), ARG(-1.57045105981189525579e+00,1.0e+00), RES(5.3277478472520380315e-4, 1.1752011235963524659e0)},
+ {FN (cos), ARG(-1.57045105981189525579e+00,-1.0e+00), RES(5.3277478472520380315e-4, -1.1752011235963524659e0)},
+ {FN (cos), ARG(1.57045105981189525579e+00,2.0e+00), RES(1.2989619299131198016e-3, -3.6268601916692946554e0)},
+ {FN (cos), ARG(1.57045105981189525579e+00,-2.0e+00), RES(1.2989619299131198016e-3, 3.6268601916692946554e0)},
+ {FN (cos), ARG(-1.57045105981189525579e+00,2.0e+00), RES(1.2989619299131198016e-3, 3.6268601916692946554e0)},
+ {FN (cos), ARG(-1.57045105981189525579e+00,-2.0e+00), RES(1.2989619299131198016e-3, -3.6268601916692946554e0)},
+ {FN (cos), ARG(1.57114159377789786021e+00,0.0e+00), RES(-3.4526697614140239160e-4, 0.0)},
+ {FN (cos), ARG(-1.57114159377789786021e+00,0.0e+00), RES(-3.4526697614140239160e-4, 0.0)},
+ {FN (cos), ARG(1.57114159377789786021e+00,1.19209289550781250e-07), RES(-3.4526697614140484486e-4, -1.1920928244535424533e-7)},
+ {FN (cos), ARG(1.57114159377789786021e+00,-1.19209289550781250e-07), RES(-3.4526697614140484486e-4, 1.1920928244535424533e-7)},
+ {FN (cos), ARG(-1.57114159377789786021e+00,1.19209289550781250e-07), RES(-3.4526697614140484486e-4, 1.1920928244535424533e-7)},
+ {FN (cos), ARG(-1.57114159377789786021e+00,-1.19209289550781250e-07), RES(-3.4526697614140484486e-4, -1.1920928244535424533e-7)},
+ {FN (cos), ARG(1.57114159377789786021e+00,5.0e-01), RES(-3.8933200722533731792e-4, -5.2109527443404709209e-1)},
+ {FN (cos), ARG(1.57114159377789786021e+00,-5.0e-01), RES(-3.8933200722533731792e-4, 5.2109527443404709209e-1)},
+ {FN (cos), ARG(-1.57114159377789786021e+00,5.0e-01), RES(-3.8933200722533731792e-4, 5.2109527443404709209e-1)},
+ {FN (cos), ARG(-1.57114159377789786021e+00,-5.0e-01), RES(-3.8933200722533731792e-4, -5.2109527443404709209e-1)},
+ {FN (cos), ARG(1.57114159377789786021e+00,1.0e+00), RES(-5.3277478472501483029e-4, -1.1752011235963524660e0)},
+ {FN (cos), ARG(1.57114159377789786021e+00,-1.0e+00), RES(-5.3277478472501483029e-4, 1.1752011235963524660e0)},
+ {FN (cos), ARG(-1.57114159377789786021e+00,1.0e+00), RES(-5.3277478472501483029e-4, 1.1752011235963524660e0)},
+ {FN (cos), ARG(-1.57114159377789786021e+00,-1.0e+00), RES(-5.3277478472501483029e-4, -1.1752011235963524660e0)},
+ {FN (cos), ARG(1.57114159377789786021e+00,2.0e+00), RES(-1.2989619299126590655e-3, -3.6268601916692946556e0)},
+ {FN (cos), ARG(1.57114159377789786021e+00,-2.0e+00), RES(-1.2989619299126590655e-3, 3.6268601916692946556e0)},
+ {FN (cos), ARG(-1.57114159377789786021e+00,2.0e+00), RES(-1.2989619299126590655e-3, 3.6268601916692946556e0)},
+ {FN (cos), ARG(-1.57114159377789786021e+00,-2.0e+00), RES(-1.2989619299126590655e-3, -3.6268601916692946556e0)},
+ {FN (cos), ARG(3.14124738660679181379e+00,0.0e+00), RES(-9.9999994039535581667e-1, 0.0)},
+ {FN (cos), ARG(-3.14124738660679181379e+00,0.0e+00), RES(-9.9999994039535581667e-1, 0.0)},
+ {FN (cos), ARG(3.14124738660679181379e+00,1.19209289550781250e-07), RES(-9.9999994039536292209e-1, -4.1159030931185115142e-11)},
+ {FN (cos), ARG(3.14124738660679181379e+00,-1.19209289550781250e-07), RES(-9.9999994039536292209e-1, 4.1159030931185115142e-11)},
+ {FN (cos), ARG(-3.14124738660679181379e+00,1.19209289550781250e-07), RES(-9.9999994039536292209e-1, 4.1159030931185115142e-11)},
+ {FN (cos), ARG(-3.14124738660679181379e+00,-1.19209289550781250e-07), RES(-9.9999994039536292209e-1, -4.1159030931185115142e-11)},
+ {FN (cos), ARG(3.14124738660679181379e+00,5.0e-01), RES(-1.1276258979946363572e0, -1.7991700040940218455e-4)},
+ {FN (cos), ARG(3.14124738660679181379e+00,-5.0e-01), RES(-1.1276258979946363572e0, 1.7991700040940218455e-4)},
+ {FN (cos), ARG(-3.14124738660679181379e+00,5.0e-01), RES(-1.1276258979946363572e0, 1.7991700040940218455e-4)},
+ {FN (cos), ARG(-3.14124738660679181379e+00,-5.0e-01), RES(-1.1276258979946363572e0, -1.7991700040940218455e-4)},
+ {FN (cos), ARG(3.14124738660679181379e+00,1.0e+00), RES(-1.5430805428404715941e0, -4.0575816248737789049e-4)},
+ {FN (cos), ARG(3.14124738660679181379e+00,-1.0e+00), RES(-1.5430805428404715941e0, 4.0575816248737789049e-4)},
+ {FN (cos), ARG(-3.14124738660679181379e+00,1.0e+00), RES(-1.5430805428404715941e0, 4.0575816248737789049e-4)},
+ {FN (cos), ARG(-3.14124738660679181379e+00,-1.0e+00), RES(-1.5430805428404715941e0, -4.0575816248737789049e-4)},
+ {FN (cos), ARG(3.14124738660679181379e+00,2.0e+00), RES(-3.7621954668392959444e0, -1.2522351259049798196e-3)},
+ {FN (cos), ARG(3.14124738660679181379e+00,-2.0e+00), RES(-3.7621954668392959444e0, 1.2522351259049798196e-3)},
+ {FN (cos), ARG(-3.14124738660679181379e+00,2.0e+00), RES(-3.7621954668392959444e0, 1.2522351259049798196e-3)},
+ {FN (cos), ARG(-3.14124738660679181379e+00,-2.0e+00), RES(-3.7621954668392959444e0, -1.2522351259049798196e-3)},
+ {FN (cos), ARG(3.14193792057279441821e+00,0.0e+00), RES(-9.9999994039535581675e-1, 0.0)},
+ {FN (cos), ARG(-3.14193792057279441821e+00,0.0e+00), RES(-9.9999994039535581675e-1, 0.0)},
+ {FN (cos), ARG(3.14193792057279441821e+00,1.19209289550781250e-07), RES(-9.9999994039536292218e-1, 4.1159030931155917289e-11)},
+ {FN (cos), ARG(3.14193792057279441821e+00,-1.19209289550781250e-07), RES(-9.9999994039536292218e-1, -4.1159030931155917289e-11)},
+ {FN (cos), ARG(-3.14193792057279441821e+00,1.19209289550781250e-07), RES(-9.9999994039536292218e-1, -4.1159030931155917289e-11)},
+ {FN (cos), ARG(-3.14193792057279441821e+00,-1.19209289550781250e-07), RES(-9.9999994039536292218e-1, 4.1159030931155917289e-11)},
+ {FN (cos), ARG(3.14193792057279441821e+00,5.0e-01), RES(-1.1276258979946363573e0, 1.7991700040927455302e-4)},
+ {FN (cos), ARG(3.14193792057279441821e+00,-5.0e-01), RES(-1.1276258979946363573e0, -1.7991700040927455302e-4)},
+ {FN (cos), ARG(-3.14193792057279441821e+00,5.0e-01), RES(-1.1276258979946363573e0, -1.7991700040927455302e-4)},
+ {FN (cos), ARG(-3.14193792057279441821e+00,-5.0e-01), RES(-1.1276258979946363573e0, 1.7991700040927455302e-4)},
+ {FN (cos), ARG(3.14193792057279441821e+00,1.0e+00), RES(-1.5430805428404715943e0, 4.0575816248709004923e-4)},
+ {FN (cos), ARG(3.14193792057279441821e+00,-1.0e+00), RES(-1.5430805428404715943e0, -4.0575816248709004923e-4)},
+ {FN (cos), ARG(-3.14193792057279441821e+00,1.0e+00), RES(-1.5430805428404715943e0, -4.0575816248709004923e-4)},
+ {FN (cos), ARG(-3.14193792057279441821e+00,-1.0e+00), RES(-1.5430805428404715943e0, 4.0575816248709004923e-4)},
+ {FN (cos), ARG(3.14193792057279441821e+00,2.0e+00), RES(-3.7621954668392959448e0, 1.2522351259040914950e-3)},
+ {FN (cos), ARG(3.14193792057279441821e+00,-2.0e+00), RES(-3.7621954668392959448e0, -1.2522351259040914950e-3)},
+ {FN (cos), ARG(-3.14193792057279441821e+00,2.0e+00), RES(-3.7621954668392959448e0, -1.2522351259040914950e-3)},
+ {FN (cos), ARG(-3.14193792057279441821e+00,-2.0e+00), RES(-3.7621954668392959448e0, 1.2522351259040914950e-3)},
+ {FN (cos), ARG(4.71204371340168837179e+00,0.0e+00), RES(-3.4526697614164732094e-4, 0.0)},
+ {FN (cos), ARG(-4.71204371340168837179e+00,0.0e+00), RES(-3.4526697614164732094e-4, 0.0)},
+ {FN (cos), ARG(4.71204371340168837179e+00,1.19209289550781250e-07), RES(-3.4526697614164977421e-4, 1.1920928244535424532e-7)},
+ {FN (cos), ARG(4.71204371340168837179e+00,-1.19209289550781250e-07), RES(-3.4526697614164977421e-4, -1.1920928244535424532e-7)},
+ {FN (cos), ARG(-4.71204371340168837179e+00,1.19209289550781250e-07), RES(-3.4526697614164977421e-4, -1.1920928244535424532e-7)},
+ {FN (cos), ARG(-4.71204371340168837179e+00,-1.19209289550781250e-07), RES(-3.4526697614164977421e-4, 1.1920928244535424532e-7)},
+ {FN (cos), ARG(4.71204371340168837179e+00,5.0e-01), RES(-3.8933200722561350661e-4, 5.2109527443404709205e-1)},
+ {FN (cos), ARG(4.71204371340168837179e+00,-5.0e-01), RES(-3.8933200722561350661e-4, -5.2109527443404709205e-1)},
+ {FN (cos), ARG(-4.71204371340168837179e+00,5.0e-01), RES(-3.8933200722561350661e-4, -5.2109527443404709205e-1)},
+ {FN (cos), ARG(-4.71204371340168837179e+00,-5.0e-01), RES(-3.8933200722561350661e-4, 5.2109527443404709205e-1)},
+ {FN (cos), ARG(4.71204371340168837179e+00,1.0e+00), RES(-5.3277478472539277601e-4, 1.1752011235963524659e0)},
+ {FN (cos), ARG(4.71204371340168837179e+00,-1.0e+00), RES(-5.3277478472539277601e-4, -1.1752011235963524659e0)},
+ {FN (cos), ARG(-4.71204371340168837179e+00,1.0e+00), RES(-5.3277478472539277601e-4, -1.1752011235963524659e0)},
+ {FN (cos), ARG(-4.71204371340168837179e+00,-1.0e+00), RES(-5.3277478472539277601e-4, 1.1752011235963524659e0)},
+ {FN (cos), ARG(4.71204371340168837179e+00,2.0e+00), RES(-1.2989619299135805376e-3, 3.6268601916692946552e0)},
+ {FN (cos), ARG(4.71204371340168837179e+00,-2.0e+00), RES(-1.2989619299135805376e-3, -3.6268601916692946552e0)},
+ {FN (cos), ARG(-4.71204371340168837179e+00,2.0e+00), RES(-1.2989619299135805376e-3, -3.6268601916692946552e0)},
+ {FN (cos), ARG(-4.71204371340168837179e+00,-2.0e+00), RES(-1.2989619299135805376e-3, 3.6268601916692946552e0)},
+ {FN (cos), ARG(4.71273424736769097620e+00,0.0e+00), RES(3.4526697614127992692e-4, 0.0)},
+ {FN (cos), ARG(-4.71273424736769097620e+00,0.0e+00), RES(3.4526697614127992692e-4, 0.0)},
+ {FN (cos), ARG(4.71273424736769097620e+00,1.19209289550781250e-07), RES(3.4526697614128238019e-4, 1.1920928244535424533e-7)},
+ {FN (cos), ARG(4.71273424736769097620e+00,-1.19209289550781250e-07), RES(3.4526697614128238019e-4, -1.1920928244535424533e-7)},
+ {FN (cos), ARG(-4.71273424736769097620e+00,1.19209289550781250e-07), RES(3.4526697614128238019e-4, -1.1920928244535424533e-7)},
+ {FN (cos), ARG(-4.71273424736769097620e+00,-1.19209289550781250e-07), RES(3.4526697614128238019e-4, 1.1920928244535424533e-7)},
+ {FN (cos), ARG(4.71273424736769097620e+00,5.0e-01), RES(3.8933200722519922358e-4, 5.2109527443404709212e-1)},
+ {FN (cos), ARG(4.71273424736769097620e+00,-5.0e-01), RES(3.8933200722519922358e-4, -5.2109527443404709212e-1)},
+ {FN (cos), ARG(-4.71273424736769097620e+00,5.0e-01), RES(3.8933200722519922358e-4, -5.2109527443404709212e-1)},
+ {FN (cos), ARG(-4.71273424736769097620e+00,-5.0e-01), RES(3.8933200722519922358e-4, 5.2109527443404709212e-1)},
+ {FN (cos), ARG(4.71273424736769097620e+00,1.0e+00), RES(5.3277478472482585742e-4, 1.1752011235963524660e0)},
+ {FN (cos), ARG(4.71273424736769097620e+00,-1.0e+00), RES(5.3277478472482585742e-4, -1.1752011235963524660e0)},
+ {FN (cos), ARG(-4.71273424736769097620e+00,1.0e+00), RES(5.3277478472482585742e-4, -1.1752011235963524660e0)},
+ {FN (cos), ARG(-4.71273424736769097620e+00,-1.0e+00), RES(5.3277478472482585742e-4, 1.1752011235963524660e0)},
+ {FN (cos), ARG(4.71273424736769097620e+00,2.0e+00), RES(1.2989619299121983294e-3, 3.6268601916692946557e0)},
+ {FN (cos), ARG(4.71273424736769097620e+00,-2.0e+00), RES(1.2989619299121983294e-3, -3.6268601916692946557e0)},
+ {FN (cos), ARG(-4.71273424736769097620e+00,2.0e+00), RES(1.2989619299121983294e-3, -3.6268601916692946557e0)},
+ {FN (cos), ARG(-4.71273424736769097620e+00,-2.0e+00), RES(1.2989619299121983294e-3, 3.6268601916692946557e0)},
+ {FN (cos), ARG(6.28284004019658492979e+00,0.0e+00), RES(9.9999994039535581662e-1, 0.0)},
+ {FN (cos), ARG(-6.28284004019658492979e+00,0.0e+00), RES(9.9999994039535581662e-1, 0.0)},
+ {FN (cos), ARG(6.28284004019658492979e+00,1.19209289550781250e-07), RES(9.9999994039536292205e-1, 4.1159030931199714069e-11)},
+ {FN (cos), ARG(6.28284004019658492979e+00,-1.19209289550781250e-07), RES(9.9999994039536292205e-1, -4.1159030931199714069e-11)},
+ {FN (cos), ARG(-6.28284004019658492979e+00,1.19209289550781250e-07), RES(9.9999994039536292205e-1, -4.1159030931199714069e-11)},
+ {FN (cos), ARG(-6.28284004019658492979e+00,-1.19209289550781250e-07), RES(9.9999994039536292205e-1, 4.1159030931199714069e-11)},
+ {FN (cos), ARG(6.28284004019658492979e+00,5.0e-01), RES(1.1276258979946363572e0, 1.7991700040946600032e-4)},
+ {FN (cos), ARG(6.28284004019658492979e+00,-5.0e-01), RES(1.1276258979946363572e0, -1.7991700040946600032e-4)},
+ {FN (cos), ARG(-6.28284004019658492979e+00,5.0e-01), RES(1.1276258979946363572e0, -1.7991700040946600032e-4)},
+ {FN (cos), ARG(-6.28284004019658492979e+00,-5.0e-01), RES(1.1276258979946363572e0, 1.7991700040946600032e-4)},
+ {FN (cos), ARG(6.28284004019658492979e+00,1.0e+00), RES(1.5430805428404715941e0, 4.0575816248752181112e-4)},
+ {FN (cos), ARG(6.28284004019658492979e+00,-1.0e+00), RES(1.5430805428404715941e0, -4.0575816248752181112e-4)},
+ {FN (cos), ARG(-6.28284004019658492979e+00,1.0e+00), RES(1.5430805428404715941e0, -4.0575816248752181112e-4)},
+ {FN (cos), ARG(-6.28284004019658492979e+00,-1.0e+00), RES(1.5430805428404715941e0, 4.0575816248752181112e-4)},
+ {FN (cos), ARG(6.28284004019658492979e+00,2.0e+00), RES(3.7621954668392959443e0, 1.2522351259054239819e-3)},
+ {FN (cos), ARG(6.28284004019658492979e+00,-2.0e+00), RES(3.7621954668392959443e0, -1.2522351259054239819e-3)},
+ {FN (cos), ARG(-6.28284004019658492979e+00,2.0e+00), RES(3.7621954668392959443e0, -1.2522351259054239819e-3)},
+ {FN (cos), ARG(-6.28284004019658492979e+00,-2.0e+00), RES(3.7621954668392959443e0, 1.2522351259054239819e-3)},
+ {FN (cos), ARG(6.28353057416258753420e+00,0.0e+00), RES(9.9999994039535581679e-1, 0.0)},
+ {FN (cos), ARG(-6.28353057416258753420e+00,0.0e+00), RES(9.9999994039535581679e-1, 0.0)},
+ {FN (cos), ARG(6.28353057416258753420e+00,1.19209289550781250e-07), RES(9.9999994039536292222e-1, -4.1159030931141318362e-11)},
+ {FN (cos), ARG(6.28353057416258753420e+00,-1.19209289550781250e-07), RES(9.9999994039536292222e-1, 4.1159030931141318362e-11)},
+ {FN (cos), ARG(-6.28353057416258753420e+00,1.19209289550781250e-07), RES(9.9999994039536292222e-1, 4.1159030931141318362e-11)},
+ {FN (cos), ARG(-6.28353057416258753420e+00,-1.19209289550781250e-07), RES(9.9999994039536292222e-1, -4.1159030931141318362e-11)},
+ {FN (cos), ARG(6.28353057416258753420e+00,5.0e-01), RES(1.1276258979946363574e0, -1.7991700040921073725e-4)},
+ {FN (cos), ARG(6.28353057416258753420e+00,-5.0e-01), RES(1.1276258979946363574e0, 1.7991700040921073725e-4)},
+ {FN (cos), ARG(-6.28353057416258753420e+00,5.0e-01), RES(1.1276258979946363574e0, 1.7991700040921073725e-4)},
+ {FN (cos), ARG(-6.28353057416258753420e+00,-5.0e-01), RES(1.1276258979946363574e0, -1.7991700040921073725e-4)},
+ {FN (cos), ARG(6.28353057416258753420e+00,1.0e+00), RES(1.5430805428404715943e0, -4.0575816248694612861e-4)},
+ {FN (cos), ARG(6.28353057416258753420e+00,-1.0e+00), RES(1.5430805428404715943e0, 4.0575816248694612861e-4)},
+ {FN (cos), ARG(-6.28353057416258753420e+00,1.0e+00), RES(1.5430805428404715943e0, 4.0575816248694612861e-4)},
+ {FN (cos), ARG(-6.28353057416258753420e+00,-1.0e+00), RES(1.5430805428404715943e0, -4.0575816248694612861e-4)},
+ {FN (cos), ARG(6.28353057416258753420e+00,2.0e+00), RES(3.7621954668392959449e0, -1.2522351259036473328e-3)},
+ {FN (cos), ARG(6.28353057416258753420e+00,-2.0e+00), RES(3.7621954668392959449e0, 1.2522351259036473328e-3)},
+ {FN (cos), ARG(-6.28353057416258753420e+00,2.0e+00), RES(3.7621954668392959449e0, 1.2522351259036473328e-3)},
+ {FN (cos), ARG(-6.28353057416258753420e+00,-2.0e+00), RES(3.7621954668392959449e0, -1.2522351259036473328e-3)},
+ {FN (cos), ARG(9.42443269378637893396e+00,0.0e+00), RES(-9.9999994039535581689e-1, 0.0)},
+ {FN (cos), ARG(-9.42443269378637893396e+00,0.0e+00), RES(-9.9999994039535581689e-1, 0.0)},
+ {FN (cos), ARG(9.42443269378637893396e+00,1.19209289550781250e-07), RES(-9.9999994039536292231e-1, -4.1159030931108433883e-11)},
+ {FN (cos), ARG(9.42443269378637893396e+00,-1.19209289550781250e-07), RES(-9.9999994039536292231e-1, 4.1159030931108433883e-11)},
+ {FN (cos), ARG(-9.42443269378637893396e+00,1.19209289550781250e-07), RES(-9.9999994039536292231e-1, 4.1159030931108433883e-11)},
+ {FN (cos), ARG(-9.42443269378637893396e+00,-1.19209289550781250e-07), RES(-9.9999994039536292231e-1, -4.1159030931108433883e-11)},
+ {FN (cos), ARG(9.42443269378637893396e+00,5.0e-01), RES(-1.1276258979946363575e0, -1.7991700040906699050e-4)},
+ {FN (cos), ARG(9.42443269378637893396e+00,-5.0e-01), RES(-1.1276258979946363575e0, 1.7991700040906699050e-4)},
+ {FN (cos), ARG(-9.42443269378637893396e+00,5.0e-01), RES(-1.1276258979946363575e0, 1.7991700040906699050e-4)},
+ {FN (cos), ARG(-9.42443269378637893396e+00,-5.0e-01), RES(-1.1276258979946363575e0, -1.7991700040906699050e-4)},
+ {FN (cos), ARG(9.42443269378637893396e+00,1.0e+00), RES(-1.5430805428404715945e0, -4.0575816248662194348e-4)},
+ {FN (cos), ARG(9.42443269378637893396e+00,-1.0e+00), RES(-1.5430805428404715945e0, 4.0575816248662194348e-4)},
+ {FN (cos), ARG(-9.42443269378637893396e+00,1.0e+00), RES(-1.5430805428404715945e0, 4.0575816248662194348e-4)},
+ {FN (cos), ARG(-9.42443269378637893396e+00,-1.0e+00), RES(-1.5430805428404715945e0, -4.0575816248662194348e-4)},
+ {FN (cos), ARG(9.42443269378637893396e+00,2.0e+00), RES(-3.7621954668392959453e0, -1.2522351259026468452e-3)},
+ {FN (cos), ARG(9.42443269378637893396e+00,-2.0e+00), RES(-3.7621954668392959453e0, 1.2522351259026468452e-3)},
+ {FN (cos), ARG(-9.42443269378637893396e+00,2.0e+00), RES(-3.7621954668392959453e0, 1.2522351259026468452e-3)},
+ {FN (cos), ARG(-9.42443269378637893396e+00,-2.0e+00), RES(-3.7621954668392959453e0, -1.2522351259026468452e-3)},
+ {FN (cos), ARG(9.42512322775237976202e+00,0.0e+00), RES(-9.9999994039535581714e-1, 0.0)},
+ {FN (cos), ARG(-9.42512322775237976202e+00,0.0e+00), RES(-9.9999994039535581714e-1, 0.0)},
+ {FN (cos), ARG(9.42512322775237976202e+00,1.19209289550781250e-07), RES(-9.9999994039536292257e-1, 4.1159030931020840323e-11)},
+ {FN (cos), ARG(9.42512322775237976202e+00,-1.19209289550781250e-07), RES(-9.9999994039536292257e-1, -4.1159030931020840323e-11)},
+ {FN (cos), ARG(-9.42512322775237976202e+00,1.19209289550781250e-07), RES(-9.9999994039536292257e-1, -4.1159030931020840323e-11)},
+ {FN (cos), ARG(-9.42512322775237976202e+00,-1.19209289550781250e-07), RES(-9.9999994039536292257e-1, 4.1159030931020840323e-11)},
+ {FN (cos), ARG(9.42512322775237976202e+00,5.0e-01), RES(-1.1276258979946363577e0, 1.7991700040868409591e-4)},
+ {FN (cos), ARG(9.42512322775237976202e+00,-5.0e-01), RES(-1.1276258979946363577e0, -1.7991700040868409591e-4)},
+ {FN (cos), ARG(-9.42512322775237976202e+00,5.0e-01), RES(-1.1276258979946363577e0, -1.7991700040868409591e-4)},
+ {FN (cos), ARG(-9.42512322775237976202e+00,-5.0e-01), RES(-1.1276258979946363577e0, 1.7991700040868409591e-4)},
+ {FN (cos), ARG(9.42512322775237976202e+00,1.0e+00), RES(-1.5430805428404715949e0, 4.0575816248575841970e-4)},
+ {FN (cos), ARG(9.42512322775237976202e+00,-1.0e+00), RES(-1.5430805428404715949e0, -4.0575816248575841970e-4)},
+ {FN (cos), ARG(-9.42512322775237976202e+00,1.0e+00), RES(-1.5430805428404715949e0, -4.0575816248575841970e-4)},
+ {FN (cos), ARG(-9.42512322775237976202e+00,-1.0e+00), RES(-1.5430805428404715949e0, 4.0575816248575841970e-4)},
+ {FN (cos), ARG(9.42512322775237976202e+00,2.0e+00), RES(-3.7621954668392959462e0, 1.2522351258999818715e-3)},
+ {FN (cos), ARG(9.42512322775237976202e+00,-2.0e+00), RES(-3.7621954668392959462e0, -1.2522351258999818715e-3)},
+ {FN (cos), ARG(-9.42512322775237976202e+00,2.0e+00), RES(-3.7621954668392959462e0, -1.2522351258999818715e-3)},
+ {FN (cos), ARG(-9.42512322775237976202e+00,-2.0e+00), RES(-3.7621954668392959462e0, 1.2522351258999818715e-3)},
+ {FN (tan), ARG(-3.45266983001243932001e-04,0.0e+00), RES(-3.4526699672092183585e-4, 0.0)},
+ {FN (tan), ARG(3.45266983001243932001e-04,0.0e+00), RES(3.4526699672092183585e-4, 0.0)},
+ {FN (tan), ARG(-3.45266983001243932001e-04,1.19209289550781250e-07), RES(-3.4526699672091692931e-4, 1.1920930376163652989e-7)},
+ {FN (tan), ARG(-3.45266983001243932001e-04,-1.19209289550781250e-07), RES(-3.4526699672091692931e-4, -1.1920930376163652989e-7)},
+ {FN (tan), ARG(3.45266983001243932001e-04,1.19209289550781250e-07), RES(3.4526699672091692931e-4, 1.1920930376163652989e-7)},
+ {FN (tan), ARG(3.45266983001243932001e-04,-1.19209289550781250e-07), RES(3.4526699672091692931e-4, -1.1920930376163652989e-7)},
+ {FN (tan), ARG(-3.45266983001243932001e-04,5.0e-01), RES(-2.7153443992655805934e-4, 4.6211720058436229979e-1)},
+ {FN (tan), ARG(-3.45266983001243932001e-04,-5.0e-01), RES(-2.7153443992655805934e-4, -4.6211720058436229979e-1)},
+ {FN (tan), ARG(3.45266983001243932001e-04,5.0e-01), RES(2.7153443992655805934e-4, 4.6211720058436229979e-1)},
+ {FN (tan), ARG(3.45266983001243932001e-04,-5.0e-01), RES(2.7153443992655805934e-4, -4.6211720058436229979e-1)},
+ {FN (tan), ARG(-3.45266983001243932001e-04,1.0e+00), RES(-1.4500326960274960880e-4, 7.6159419408485704836e-1)},
+ {FN (tan), ARG(-3.45266983001243932001e-04,-1.0e+00), RES(-1.4500326960274960880e-4, -7.6159419408485704836e-1)},
+ {FN (tan), ARG(3.45266983001243932001e-04,1.0e+00), RES(1.4500326960274960880e-4, 7.6159419408485704836e-1)},
+ {FN (tan), ARG(3.45266983001243932001e-04,-1.0e+00), RES(1.4500326960274960880e-4, -7.6159419408485704836e-1)},
+ {FN (tan), ARG(-3.45266983001243932001e-04,2.0e+00), RES(-2.4393395410435306874e-5, 9.6402758819508310556e-1)},
+ {FN (tan), ARG(-3.45266983001243932001e-04,-2.0e+00), RES(-2.4393395410435306874e-5, -9.6402758819508310556e-1)},
+ {FN (tan), ARG(3.45266983001243932001e-04,2.0e+00), RES(2.4393395410435306874e-5, 9.6402758819508310556e-1)},
+ {FN (tan), ARG(3.45266983001243932001e-04,-2.0e+00), RES(2.4393395410435306874e-5, -9.6402758819508310556e-1)},
+ {FN (tan), ARG(1.57045105981189525579e+00,0.0e+00), RES(2.8963092606501007060e3, 0.0)},
+ {FN (tan), ARG(-1.57045105981189525579e+00,0.0e+00), RES(-2.8963092606501007060e3, 0.0)},
+ {FN (tan), ARG(1.57045105981189525579e+00,1.19209289550781250e-07), RES(2.8963089153831588642e3, 9.9999992052646305569e-1)},
+ {FN (tan), ARG(1.57045105981189525579e+00,-1.19209289550781250e-07), RES(2.8963089153831588642e3, -9.9999992052646305569e-1)},
+ {FN (tan), ARG(-1.57045105981189525579e+00,1.19209289550781250e-07), RES(-2.8963089153831588642e3, 9.9999992052646305569e-1)},
+ {FN (tan), ARG(-1.57045105981189525579e+00,-1.19209289550781250e-07), RES(-2.8963089153831588642e3, -9.9999992052646305569e-1)},
+ {FN (tan), ARG(1.57045105981189525579e+00,5.0e-01), RES(1.2715121175455623363e-3, 2.1639524637389325996e0)},
+ {FN (tan), ARG(1.57045105981189525579e+00,-5.0e-01), RES(1.2715121175455623363e-3, -2.1639524637389325996e0)},
+ {FN (tan), ARG(-1.57045105981189525579e+00,5.0e-01), RES(-1.2715121175455623363e-3, 2.1639524637389325996e0)},
+ {FN (tan), ARG(-1.57045105981189525579e+00,-5.0e-01), RES(-1.2715121175455623363e-3, -2.1639524637389325996e0)},
+ {FN (tan), ARG(1.57045105981189525579e+00,1.0e+00), RES(2.4999454374276273814e-4, 1.3130351721648674823e0)},
+ {FN (tan), ARG(1.57045105981189525579e+00,-1.0e+00), RES(2.4999454374276273814e-4, -1.3130351721648674823e0)},
+ {FN (tan), ARG(-1.57045105981189525579e+00,1.0e+00), RES(-2.4999454374276273814e-4, 1.3130351721648674823e0)},
+ {FN (tan), ARG(-1.57045105981189525579e+00,-1.0e+00), RES(-2.4999454374276273814e-4, -1.3130351721648674823e0)},
+ {FN (tan), ARG(1.57045105981189525579e+00,2.0e+00), RES(2.6247825506572821595e-5, 1.0373147113268752620e0)},
+ {FN (tan), ARG(1.57045105981189525579e+00,-2.0e+00), RES(2.6247825506572821595e-5, -1.0373147113268752620e0)},
+ {FN (tan), ARG(-1.57045105981189525579e+00,2.0e+00), RES(-2.6247825506572821595e-5, 1.0373147113268752620e0)},
+ {FN (tan), ARG(-1.57045105981189525579e+00,-2.0e+00), RES(-2.6247825506572821595e-5, -1.0373147113268752620e0)},
+ {FN (tan), ARG(1.57114159377789786021e+00,0.0e+00), RES(-2.8963092606511280143e3, 0.0)},
+ {FN (tan), ARG(-1.57114159377789786021e+00,0.0e+00), RES(2.8963092606511280143e3, 0.0)},
+ {FN (tan), ARG(1.57114159377789786021e+00,1.19209289550781250e-07), RES(-2.8963089153841861720e3, 9.9999992052717244672e-1)},
+ {FN (tan), ARG(1.57114159377789786021e+00,-1.19209289550781250e-07), RES(-2.8963089153841861720e3, -9.9999992052717244672e-1)},
+ {FN (tan), ARG(-1.57114159377789786021e+00,1.19209289550781250e-07), RES(2.8963089153841861720e3, 9.9999992052717244672e-1)},
+ {FN (tan), ARG(-1.57114159377789786021e+00,-1.19209289550781250e-07), RES(2.8963089153841861720e3, -9.9999992052717244672e-1)},
+ {FN (tan), ARG(1.57114159377789786021e+00,5.0e-01), RES(-1.2715121175451113370e-3, 2.1639524637389326002e0)},
+ {FN (tan), ARG(1.57114159377789786021e+00,-5.0e-01), RES(-1.2715121175451113370e-3, -2.1639524637389326002e0)},
+ {FN (tan), ARG(-1.57114159377789786021e+00,5.0e-01), RES(1.2715121175451113370e-3, 2.1639524637389326002e0)},
+ {FN (tan), ARG(-1.57114159377789786021e+00,-5.0e-01), RES(1.2715121175451113370e-3, -2.1639524637389326002e0)},
+ {FN (tan), ARG(1.57114159377789786021e+00,1.0e+00), RES(-2.4999454374267406620e-4, 1.3130351721648674824e0)},
+ {FN (tan), ARG(1.57114159377789786021e+00,-1.0e+00), RES(-2.4999454374267406620e-4, -1.3130351721648674824e0)},
+ {FN (tan), ARG(-1.57114159377789786021e+00,1.0e+00), RES(2.4999454374267406620e-4, 1.3130351721648674824e0)},
+ {FN (tan), ARG(-1.57114159377789786021e+00,-1.0e+00), RES(2.4999454374267406620e-4, -1.3130351721648674824e0)},
+ {FN (tan), ARG(1.57114159377789786021e+00,2.0e+00), RES(-2.6247825506563511609e-5, 1.0373147113268752620e0)},
+ {FN (tan), ARG(1.57114159377789786021e+00,-2.0e+00), RES(-2.6247825506563511609e-5, -1.0373147113268752620e0)},
+ {FN (tan), ARG(-1.57114159377789786021e+00,2.0e+00), RES(2.6247825506563511609e-5, 1.0373147113268752620e0)},
+ {FN (tan), ARG(-1.57114159377789786021e+00,-2.0e+00), RES(2.6247825506563511609e-5, -1.0373147113268752620e0)},
+ {FN (tan), ARG(3.14124738660679181379e+00,0.0e+00), RES(-3.4526699672110257641e-4, 0.0)},
+ {FN (tan), ARG(-3.14124738660679181379e+00,0.0e+00), RES(3.4526699672110257641e-4, 0.0)},
+ {FN (tan), ARG(3.14124738660679181379e+00,1.19209289550781250e-07), RES(-3.4526699672109766987e-4, 1.1920930376163652991e-7)},
+ {FN (tan), ARG(3.14124738660679181379e+00,-1.19209289550781250e-07), RES(-3.4526699672109766987e-4, -1.1920930376163652991e-7)},
+ {FN (tan), ARG(-3.14124738660679181379e+00,1.19209289550781250e-07), RES(3.4526699672109766987e-4, 1.1920930376163652991e-7)},
+ {FN (tan), ARG(-3.14124738660679181379e+00,-1.19209289550781250e-07), RES(3.4526699672109766987e-4, -1.1920930376163652991e-7)},
+ {FN (tan), ARG(3.14124738660679181379e+00,5.0e-01), RES(-2.7153443992670020234e-4, 4.6211720058436229984e-1)},
+ {FN (tan), ARG(3.14124738660679181379e+00,-5.0e-01), RES(-2.7153443992670020234e-4, -4.6211720058436229984e-1)},
+ {FN (tan), ARG(-3.14124738660679181379e+00,5.0e-01), RES(2.7153443992670020234e-4, 4.6211720058436229984e-1)},
+ {FN (tan), ARG(-3.14124738660679181379e+00,-5.0e-01), RES(2.7153443992670020234e-4, -4.6211720058436229984e-1)},
+ {FN (tan), ARG(3.14124738660679181379e+00,1.0e+00), RES(-1.4500326960282551519e-4, 7.6159419408485704840e-1)},
+ {FN (tan), ARG(3.14124738660679181379e+00,-1.0e+00), RES(-1.4500326960282551519e-4, -7.6159419408485704840e-1)},
+ {FN (tan), ARG(-3.14124738660679181379e+00,1.0e+00), RES(1.4500326960282551519e-4, 7.6159419408485704840e-1)},
+ {FN (tan), ARG(-3.14124738660679181379e+00,-1.0e+00), RES(1.4500326960282551519e-4, -7.6159419408485704840e-1)},
+ {FN (tan), ARG(3.14124738660679181379e+00,2.0e+00), RES(-2.4393395410448076340e-5, 9.6402758819508310557e-1)},
+ {FN (tan), ARG(3.14124738660679181379e+00,-2.0e+00), RES(-2.4393395410448076340e-5, -9.6402758819508310557e-1)},
+ {FN (tan), ARG(-3.14124738660679181379e+00,2.0e+00), RES(2.4393395410448076340e-5, 9.6402758819508310557e-1)},
+ {FN (tan), ARG(-3.14124738660679181379e+00,-2.0e+00), RES(2.4393395410448076340e-5, -9.6402758819508310557e-1)},
+ {FN (tan), ARG(3.14193792057279441821e+00,0.0e+00), RES(3.4526699672085764703e-4, 0.0)},
+ {FN (tan), ARG(-3.14193792057279441821e+00,0.0e+00), RES(-3.4526699672085764703e-4, 0.0)},
+ {FN (tan), ARG(3.14193792057279441821e+00,1.19209289550781250e-07), RES(3.4526699672085274049e-4, 1.1920930376163652989e-7)},
+ {FN (tan), ARG(3.14193792057279441821e+00,-1.19209289550781250e-07), RES(3.4526699672085274049e-4, -1.1920930376163652989e-7)},
+ {FN (tan), ARG(-3.14193792057279441821e+00,1.19209289550781250e-07), RES(-3.4526699672085274049e-4, 1.1920930376163652989e-7)},
+ {FN (tan), ARG(-3.14193792057279441821e+00,-1.19209289550781250e-07), RES(-3.4526699672085274049e-4, -1.1920930376163652989e-7)},
+ {FN (tan), ARG(3.14193792057279441821e+00,5.0e-01), RES(2.7153443992650757820e-4, 4.6211720058436229978e-1)},
+ {FN (tan), ARG(3.14193792057279441821e+00,-5.0e-01), RES(2.7153443992650757820e-4, -4.6211720058436229978e-1)},
+ {FN (tan), ARG(-3.14193792057279441821e+00,5.0e-01), RES(-2.7153443992650757820e-4, 4.6211720058436229978e-1)},
+ {FN (tan), ARG(-3.14193792057279441821e+00,-5.0e-01), RES(-2.7153443992650757820e-4, -4.6211720058436229978e-1)},
+ {FN (tan), ARG(3.14193792057279441821e+00,1.0e+00), RES(1.4500326960272265115e-4, 7.6159419408485704835e-1)},
+ {FN (tan), ARG(3.14193792057279441821e+00,-1.0e+00), RES(1.4500326960272265115e-4, -7.6159419408485704835e-1)},
+ {FN (tan), ARG(-3.14193792057279441821e+00,1.0e+00), RES(-1.4500326960272265115e-4, 7.6159419408485704835e-1)},
+ {FN (tan), ARG(-3.14193792057279441821e+00,-1.0e+00), RES(-1.4500326960272265115e-4, -7.6159419408485704835e-1)},
+ {FN (tan), ARG(3.14193792057279441821e+00,2.0e+00), RES(2.4393395410430771882e-5, 9.6402758819508310556e-1)},
+ {FN (tan), ARG(3.14193792057279441821e+00,-2.0e+00), RES(2.4393395410430771882e-5, -9.6402758819508310556e-1)},
+ {FN (tan), ARG(-3.14193792057279441821e+00,2.0e+00), RES(-2.4393395410430771882e-5, 9.6402758819508310556e-1)},
+ {FN (tan), ARG(-3.14193792057279441821e+00,-2.0e+00), RES(-2.4393395410430771882e-5, -9.6402758819508310556e-1)},
+ {FN (tan), ARG(4.71204371340168837179e+00,0.0e+00), RES(2.8963092606490733978e3, 0.0)},
+ {FN (tan), ARG(-4.71204371340168837179e+00,0.0e+00), RES(-2.8963092606490733978e3, 0.0)},
+ {FN (tan), ARG(4.71204371340168837179e+00,1.19209289550781250e-07), RES(2.8963089153821315563e3, 9.9999992052575366466e-1)},
+ {FN (tan), ARG(4.71204371340168837179e+00,-1.19209289550781250e-07), RES(2.8963089153821315563e3, -9.9999992052575366466e-1)},
+ {FN (tan), ARG(-4.71204371340168837179e+00,1.19209289550781250e-07), RES(-2.8963089153821315563e3, 9.9999992052575366466e-1)},
+ {FN (tan), ARG(-4.71204371340168837179e+00,-1.19209289550781250e-07), RES(-2.8963089153821315563e3, -9.9999992052575366466e-1)},
+ {FN (tan), ARG(4.71204371340168837179e+00,5.0e-01), RES(1.2715121175460133355e-3, 2.1639524637389325989e0)},
+ {FN (tan), ARG(4.71204371340168837179e+00,-5.0e-01), RES(1.2715121175460133355e-3, -2.1639524637389325989e0)},
+ {FN (tan), ARG(-4.71204371340168837179e+00,5.0e-01), RES(-1.2715121175460133355e-3, 2.1639524637389325989e0)},
+ {FN (tan), ARG(-4.71204371340168837179e+00,-5.0e-01), RES(-1.2715121175460133355e-3, -2.1639524637389325989e0)},
+ {FN (tan), ARG(4.71204371340168837179e+00,1.0e+00), RES(2.4999454374285141007e-4, 1.3130351721648674822e0)},
+ {FN (tan), ARG(4.71204371340168837179e+00,-1.0e+00), RES(2.4999454374285141007e-4, -1.3130351721648674822e0)},
+ {FN (tan), ARG(-4.71204371340168837179e+00,1.0e+00), RES(-2.4999454374285141007e-4, 1.3130351721648674822e0)},
+ {FN (tan), ARG(-4.71204371340168837179e+00,-1.0e+00), RES(-2.4999454374285141007e-4, -1.3130351721648674822e0)},
+ {FN (tan), ARG(4.71204371340168837179e+00,2.0e+00), RES(2.6247825506582131582e-5, 1.0373147113268752620e0)},
+ {FN (tan), ARG(4.71204371340168837179e+00,-2.0e+00), RES(2.6247825506582131582e-5, -1.0373147113268752620e0)},
+ {FN (tan), ARG(-4.71204371340168837179e+00,2.0e+00), RES(-2.6247825506582131582e-5, 1.0373147113268752620e0)},
+ {FN (tan), ARG(-4.71204371340168837179e+00,-2.0e+00), RES(-2.6247825506582131582e-5, -1.0373147113268752620e0)},
+ {FN (tan), ARG(4.71273424736769097620e+00,0.0e+00), RES(-2.8963092606521553225e3, 0.0)},
+ {FN (tan), ARG(-4.71273424736769097620e+00,0.0e+00), RES(2.8963092606521553225e3, 0.0)},
+ {FN (tan), ARG(4.71273424736769097620e+00,1.19209289550781250e-07), RES(-2.8963089153852134799e3, 9.9999992052788183776e-1)},
+ {FN (tan), ARG(4.71273424736769097620e+00,-1.19209289550781250e-07), RES(-2.8963089153852134799e3, -9.9999992052788183776e-1)},
+ {FN (tan), ARG(-4.71273424736769097620e+00,1.19209289550781250e-07), RES(2.8963089153852134799e3, 9.9999992052788183776e-1)},
+ {FN (tan), ARG(-4.71273424736769097620e+00,-1.19209289550781250e-07), RES(2.8963089153852134799e3, -9.9999992052788183776e-1)},
+ {FN (tan), ARG(4.71273424736769097620e+00,5.0e-01), RES(-1.2715121175446603377e-3, 2.1639524637389326009e0)},
+ {FN (tan), ARG(4.71273424736769097620e+00,-5.0e-01), RES(-1.2715121175446603377e-3, -2.1639524637389326009e0)},
+ {FN (tan), ARG(-4.71273424736769097620e+00,5.0e-01), RES(1.2715121175446603377e-3, 2.1639524637389326009e0)},
+ {FN (tan), ARG(-4.71273424736769097620e+00,-5.0e-01), RES(1.2715121175446603377e-3, -2.1639524637389326009e0)},
+ {FN (tan), ARG(4.71273424736769097620e+00,1.0e+00), RES(-2.4999454374258539427e-4, 1.3130351721648674825e0)},
+ {FN (tan), ARG(4.71273424736769097620e+00,-1.0e+00), RES(-2.4999454374258539427e-4, -1.3130351721648674825e0)},
+ {FN (tan), ARG(-4.71273424736769097620e+00,1.0e+00), RES(2.4999454374258539427e-4, 1.3130351721648674825e0)},
+ {FN (tan), ARG(-4.71273424736769097620e+00,-1.0e+00), RES(2.4999454374258539427e-4, -1.3130351721648674825e0)},
+ {FN (tan), ARG(4.71273424736769097620e+00,2.0e+00), RES(-2.6247825506554201622e-5, 1.0373147113268752620e0)},
+ {FN (tan), ARG(4.71273424736769097620e+00,-2.0e+00), RES(-2.6247825506554201622e-5, -1.0373147113268752620e0)},
+ {FN (tan), ARG(-4.71273424736769097620e+00,2.0e+00), RES(2.6247825506554201622e-5, 1.0373147113268752620e0)},
+ {FN (tan), ARG(-4.71273424736769097620e+00,-2.0e+00), RES(2.6247825506554201622e-5, -1.0373147113268752620e0)},
+ {FN (tan), ARG(6.28284004019658492979e+00,0.0e+00), RES(-3.4526699672122504111e-4, 0.0)},
+ {FN (tan), ARG(-6.28284004019658492979e+00,0.0e+00), RES(3.4526699672122504111e-4, 0.0)},
+ {FN (tan), ARG(6.28284004019658492979e+00,1.19209289550781250e-07), RES(-3.4526699672122013457e-4, 1.1920930376163652992e-7)},
+ {FN (tan), ARG(6.28284004019658492979e+00,-1.19209289550781250e-07), RES(-3.4526699672122013457e-4, -1.1920930376163652992e-7)},
+ {FN (tan), ARG(-6.28284004019658492979e+00,1.19209289550781250e-07), RES(3.4526699672122013457e-4, 1.1920930376163652992e-7)},
+ {FN (tan), ARG(-6.28284004019658492979e+00,-1.19209289550781250e-07), RES(3.4526699672122013457e-4, -1.1920930376163652992e-7)},
+ {FN (tan), ARG(6.28284004019658492979e+00,5.0e-01), RES(-2.7153443992679651442e-4, 4.6211720058436229987e-1)},
+ {FN (tan), ARG(6.28284004019658492979e+00,-5.0e-01), RES(-2.7153443992679651442e-4, -4.6211720058436229987e-1)},
+ {FN (tan), ARG(-6.28284004019658492979e+00,5.0e-01), RES(2.7153443992679651442e-4, 4.6211720058436229987e-1)},
+ {FN (tan), ARG(-6.28284004019658492979e+00,-5.0e-01), RES(2.7153443992679651442e-4, -4.6211720058436229987e-1)},
+ {FN (tan), ARG(6.28284004019658492979e+00,1.0e+00), RES(-1.4500326960287694721e-4, 7.6159419408485704843e-1)},
+ {FN (tan), ARG(6.28284004019658492979e+00,-1.0e+00), RES(-1.4500326960287694721e-4, -7.6159419408485704843e-1)},
+ {FN (tan), ARG(-6.28284004019658492979e+00,1.0e+00), RES(1.4500326960287694721e-4, 7.6159419408485704843e-1)},
+ {FN (tan), ARG(-6.28284004019658492979e+00,-1.0e+00), RES(1.4500326960287694721e-4, -7.6159419408485704843e-1)},
+ {FN (tan), ARG(6.28284004019658492979e+00,2.0e+00), RES(-2.4393395410456728569e-5, 9.6402758819508310558e-1)},
+ {FN (tan), ARG(6.28284004019658492979e+00,-2.0e+00), RES(-2.4393395410456728569e-5, -9.6402758819508310558e-1)},
+ {FN (tan), ARG(-6.28284004019658492979e+00,2.0e+00), RES(2.4393395410456728569e-5, 9.6402758819508310558e-1)},
+ {FN (tan), ARG(-6.28284004019658492979e+00,-2.0e+00), RES(2.4393395410456728569e-5, -9.6402758819508310558e-1)},
+ {FN (tan), ARG(6.28353057416258753420e+00,0.0e+00), RES(3.4526699672073518233e-4, 0.0)},
+ {FN (tan), ARG(-6.28353057416258753420e+00,0.0e+00), RES(-3.4526699672073518233e-4, 0.0)},
+ {FN (tan), ARG(6.28353057416258753420e+00,1.19209289550781250e-07), RES(3.4526699672073027579e-4, 1.1920930376163652988e-7)},
+ {FN (tan), ARG(6.28353057416258753420e+00,-1.19209289550781250e-07), RES(3.4526699672073027579e-4, -1.1920930376163652988e-7)},
+ {FN (tan), ARG(-6.28353057416258753420e+00,1.19209289550781250e-07), RES(-3.4526699672073027579e-4, 1.1920930376163652988e-7)},
+ {FN (tan), ARG(-6.28353057416258753420e+00,-1.19209289550781250e-07), RES(-3.4526699672073027579e-4, -1.1920930376163652988e-7)},
+ {FN (tan), ARG(6.28353057416258753420e+00,5.0e-01), RES(2.7153443992641126612e-4, 4.6211720058436229974e-1)},
+ {FN (tan), ARG(6.28353057416258753420e+00,-5.0e-01), RES(2.7153443992641126612e-4, -4.6211720058436229974e-1)},
+ {FN (tan), ARG(-6.28353057416258753420e+00,5.0e-01), RES(-2.7153443992641126612e-4, 4.6211720058436229974e-1)},
+ {FN (tan), ARG(-6.28353057416258753420e+00,-5.0e-01), RES(-2.7153443992641126612e-4, -4.6211720058436229974e-1)},
+ {FN (tan), ARG(6.28353057416258753420e+00,1.0e+00), RES(1.4500326960267121913e-4, 7.6159419408485704832e-1)},
+ {FN (tan), ARG(6.28353057416258753420e+00,-1.0e+00), RES(1.4500326960267121913e-4, -7.6159419408485704832e-1)},
+ {FN (tan), ARG(-6.28353057416258753420e+00,1.0e+00), RES(-1.4500326960267121913e-4, 7.6159419408485704832e-1)},
+ {FN (tan), ARG(-6.28353057416258753420e+00,-1.0e+00), RES(-1.4500326960267121913e-4, -7.6159419408485704832e-1)},
+ {FN (tan), ARG(6.28353057416258753420e+00,2.0e+00), RES(2.4393395410422119654e-5, 9.6402758819508310555e-1)},
+ {FN (tan), ARG(6.28353057416258753420e+00,-2.0e+00), RES(2.4393395410422119654e-5, -9.6402758819508310555e-1)},
+ {FN (tan), ARG(-6.28353057416258753420e+00,2.0e+00), RES(-2.4393395410422119654e-5, 9.6402758819508310555e-1)},
+ {FN (tan), ARG(-6.28353057416258753420e+00,-2.0e+00), RES(-2.4393395410422119654e-5, -9.6402758819508310555e-1)},
+ {FN (tan), ARG(9.42443269378637893396e+00,0.0e+00), RES(-3.4526699672045932728e-4, 0.0)},
+ {FN (tan), ARG(-9.42443269378637893396e+00,0.0e+00), RES(3.4526699672045932728e-4, 0.0)},
+ {FN (tan), ARG(9.42443269378637893396e+00,1.19209289550781250e-07), RES(-3.4526699672045442074e-4, 1.1920930376163652985e-7)},
+ {FN (tan), ARG(9.42443269378637893396e+00,-1.19209289550781250e-07), RES(-3.4526699672045442074e-4, -1.1920930376163652985e-7)},
+ {FN (tan), ARG(-9.42443269378637893396e+00,1.19209289550781250e-07), RES(3.4526699672045442074e-4, 1.1920930376163652985e-7)},
+ {FN (tan), ARG(-9.42443269378637893396e+00,-1.19209289550781250e-07), RES(3.4526699672045442074e-4, -1.1920930376163652985e-7)},
+ {FN (tan), ARG(9.42443269378637893396e+00,5.0e-01), RES(-2.7153443992619432056e-4, 4.6211720058436229968e-1)},
+ {FN (tan), ARG(9.42443269378637893396e+00,-5.0e-01), RES(-2.7153443992619432056e-4, -4.6211720058436229968e-1)},
+ {FN (tan), ARG(-9.42443269378637893396e+00,5.0e-01), RES(2.7153443992619432056e-4, 4.6211720058436229968e-1)},
+ {FN (tan), ARG(-9.42443269378637893396e+00,-5.0e-01), RES(2.7153443992619432056e-4, -4.6211720058436229968e-1)},
+ {FN (tan), ARG(9.42443269378637893396e+00,1.0e+00), RES(-1.4500326960255536711e-4, 7.6159419408485704826e-1)},
+ {FN (tan), ARG(9.42443269378637893396e+00,-1.0e+00), RES(-1.4500326960255536711e-4, -7.6159419408485704826e-1)},
+ {FN (tan), ARG(-9.42443269378637893396e+00,1.0e+00), RES(1.4500326960255536711e-4, 7.6159419408485704826e-1)},
+ {FN (tan), ARG(-9.42443269378637893396e+00,-1.0e+00), RES(1.4500326960255536711e-4, -7.6159419408485704826e-1)},
+ {FN (tan), ARG(9.42443269378637893396e+00,2.0e+00), RES(-2.4393395410402630273e-5, 9.6402758819508310554e-1)},
+ {FN (tan), ARG(9.42443269378637893396e+00,-2.0e+00), RES(-2.4393395410402630273e-5, -9.6402758819508310554e-1)},
+ {FN (tan), ARG(-9.42443269378637893396e+00,2.0e+00), RES(2.4393395410402630273e-5, 9.6402758819508310554e-1)},
+ {FN (tan), ARG(-9.42443269378637893396e+00,-2.0e+00), RES(2.4393395410402630273e-5, -9.6402758819508310554e-1)},
+ {FN (tan), ARG(9.42512322775237976202e+00,0.0e+00), RES(3.4526699671972453911e-4, 0.0)},
+ {FN (tan), ARG(-9.42512322775237976202e+00,0.0e+00), RES(-3.4526699671972453911e-4, 0.0)},
+ {FN (tan), ARG(9.42512322775237976202e+00,1.19209289550781250e-07), RES(3.4526699671971963257e-4, 1.1920930376163652979e-7)},
+ {FN (tan), ARG(9.42512322775237976202e+00,-1.19209289550781250e-07), RES(3.4526699671971963257e-4, -1.1920930376163652979e-7)},
+ {FN (tan), ARG(-9.42512322775237976202e+00,1.19209289550781250e-07), RES(-3.4526699671971963257e-4, 1.1920930376163652979e-7)},
+ {FN (tan), ARG(-9.42512322775237976202e+00,-1.19209289550781250e-07), RES(-3.4526699671971963257e-4, -1.1920930376163652979e-7)},
+ {FN (tan), ARG(9.42512322775237976202e+00,5.0e-01), RES(2.7153443992561644811e-4, 4.6211720058436229949e-1)},
+ {FN (tan), ARG(9.42512322775237976202e+00,-5.0e-01), RES(2.7153443992561644811e-4, -4.6211720058436229949e-1)},
+ {FN (tan), ARG(-9.42512322775237976202e+00,5.0e-01), RES(-2.7153443992561644811e-4, 4.6211720058436229949e-1)},
+ {FN (tan), ARG(-9.42512322775237976202e+00,-5.0e-01), RES(-2.7153443992561644811e-4, -4.6211720058436229949e-1)},
+ {FN (tan), ARG(9.42512322775237976202e+00,1.0e+00), RES(1.450032696022467750e-4, 7.6159419408485704810e-1)},
+ {FN (tan), ARG(9.42512322775237976202e+00,-1.0e+00), RES(1.450032696022467750e-4, -7.6159419408485704810e-1)},
+ {FN (tan), ARG(-9.42512322775237976202e+00,1.0e+00), RES(-1.450032696022467750e-4, 7.6159419408485704810e-1)},
+ {FN (tan), ARG(-9.42512322775237976202e+00,-1.0e+00), RES(-1.450032696022467750e-4, -7.6159419408485704810e-1)},
+ {FN (tan), ARG(9.42512322775237976202e+00,2.0e+00), RES(2.439339541035071690e-5, 9.6402758819508310550e-1)},
+ {FN (tan), ARG(9.42512322775237976202e+00,-2.0e+00), RES(2.439339541035071690e-5, -9.6402758819508310550e-1)},
+ {FN (tan), ARG(-9.42512322775237976202e+00,2.0e+00), RES(-2.439339541035071690e-5, 9.6402758819508310550e-1)},
+ {FN (tan), ARG(-9.42512322775237976202e+00,-2.0e+00), RES(-2.439339541035071690e-5, -9.6402758819508310550e-1)},
+ {FN (arcsin), ARG(0.0e+00,0.0e+00), RES(0e0, 0.0)},
+ {FN (arcsin), ARG(0.0e+00,1.19209289550781250e-07), RES(0, 1.1920928955078096766e-7)},
+ {FN (arcsin), ARG(0.0e+00,-1.19209289550781250e-07), RES(0, -1.1920928955078096766e-7)},
+ {FN (arcsin), ARG(0.0e+00,5.0e-01), RES(0, 4.8121182505960344750e-1)},
+ {FN (arcsin), ARG(0.0e+00,-5.0e-01), RES(0, -4.8121182505960344750e-1)},
+ {FN (arcsin), ARG(0.0e+00,1.0e+00), RES(0, 8.8137358701954302523e-1)},
+ {FN (arcsin), ARG(0.0e+00,-1.0e+00), RES(0, -8.8137358701954302523e-1)},
+ {FN (arcsin), ARG(0.0e+00,2.0e+00), RES(0, 1.4436354751788103425e0)},
+ {FN (arcsin), ARG(0.0e+00,-2.0e+00), RES(0, -1.4436354751788103425e0)},
+ {FN (arcsin), ARG(0.0e+00,8.3886080e+06), RES(0, 1.6635532333438690979e1)},
+ {FN (arcsin), ARG(0.0e+00,-8.3886080e+06), RES(0, -1.6635532333438690979e1)},
+ {FN (arcsin), ARG(1.19209289550781250e-07,0.0e+00), RES(1.1920928955078153234e-7, 0.0)},
+ {FN (arcsin), ARG(-1.19209289550781250e-07,0.0e+00), RES(-1.1920928955078153234e-7, 0.0)},
+ {FN (arcsin), ARG(1.19209289550781250e-07,1.19209289550781250e-07), RES(1.1920928955078068531e-7, 1.1920928955078181469e-7)},
+ {FN (arcsin), ARG(1.19209289550781250e-07,-1.19209289550781250e-07), RES(1.1920928955078068531e-7, -1.1920928955078181469e-7)},
+ {FN (arcsin), ARG(-1.19209289550781250e-07,1.19209289550781250e-07), RES(-1.1920928955078068531e-7, 1.1920928955078181469e-7)},
+ {FN (arcsin), ARG(-1.19209289550781250e-07,-1.19209289550781250e-07), RES(-1.1920928955078068531e-7, -1.1920928955078181469e-7)},
+ {FN (arcsin), ARG(1.19209289550781250e-07,5.0e-01), RES(1.0662402999400097805e-7, 4.8121182505960598961e-1)},
+ {FN (arcsin), ARG(1.19209289550781250e-07,-5.0e-01), RES(1.0662402999400097805e-7, -4.8121182505960598961e-1)},
+ {FN (arcsin), ARG(-1.19209289550781250e-07,5.0e-01), RES(-1.0662402999400097805e-7, 4.8121182505960598961e-1)},
+ {FN (arcsin), ARG(-1.19209289550781250e-07,-5.0e-01), RES(-1.0662402999400097805e-7, -4.8121182505960598961e-1)},
+ {FN (arcsin), ARG(1.19209289550781250e-07,1.0e+00), RES(8.4293697021788013662e-8, 8.8137358701954553738e-1)},
+ {FN (arcsin), ARG(1.19209289550781250e-07,-1.0e+00), RES(8.4293697021788013662e-8, -8.8137358701954553738e-1)},
+ {FN (arcsin), ARG(-1.19209289550781250e-07,1.0e+00), RES(-8.4293697021788013662e-8, 8.8137358701954553738e-1)},
+ {FN (arcsin), ARG(-1.19209289550781250e-07,-1.0e+00), RES(-8.4293697021788013662e-8, -8.8137358701954553738e-1)},
+ {FN (arcsin), ARG(1.19209289550781250e-07,2.0e+00), RES(5.3312014997000413263e-8, 1.4436354751788116136e0)},
+ {FN (arcsin), ARG(1.19209289550781250e-07,-2.0e+00), RES(5.3312014997000413263e-8, -1.4436354751788116136e0)},
+ {FN (arcsin), ARG(-1.19209289550781250e-07,2.0e+00), RES(-5.3312014997000413263e-8, 1.4436354751788116136e0)},
+ {FN (arcsin), ARG(-1.19209289550781250e-07,-2.0e+00), RES(-5.3312014997000413263e-8, -1.4436354751788116136e0)},
+ {FN (arcsin), ARG(1.19209289550781250e-07,8.3886080e+06), RES(1.4210854715201902743e-14, 1.6635532333438690979e1)},
+ {FN (arcsin), ARG(1.19209289550781250e-07,-8.3886080e+06), RES(1.4210854715201902743e-14, -1.6635532333438690979e1)},
+ {FN (arcsin), ARG(-1.19209289550781250e-07,8.3886080e+06), RES(-1.4210854715201902743e-14, 1.6635532333438690979e1)},
+ {FN (arcsin), ARG(-1.19209289550781250e-07,-8.3886080e+06), RES(-1.4210854715201902743e-14, -1.6635532333438690979e1)},
+ {FN (arcsin), ARG(5.0e-01,0.0e+00), RES(5.2359877559829887308e-1, 0.0)},
+ {FN (arcsin), ARG(-5.0e-01,0.0e+00), RES(-5.2359877559829887308e-1, 0.0)},
+ {FN (arcsin), ARG(5.0e-01,1.19209289550781250e-07), RES(5.2359877559829340332e-1, 1.3765103082409432364e-7)},
+ {FN (arcsin), ARG(5.0e-01,-1.19209289550781250e-07), RES(5.2359877559829340332e-1, -1.3765103082409432364e-7)},
+ {FN (arcsin), ARG(-5.0e-01,1.19209289550781250e-07), RES(-5.2359877559829340332e-1, 1.3765103082409432364e-7)},
+ {FN (arcsin), ARG(-5.0e-01,-1.19209289550781250e-07), RES(-5.2359877559829340332e-1, -1.3765103082409432364e-7)},
+ {FN (arcsin), ARG(5.0e-01,5.0e-01), RES(4.5227844715119068206e-1, 5.3063753095251782602e-1)},
+ {FN (arcsin), ARG(5.0e-01,-5.0e-01), RES(4.5227844715119068206e-1, -5.3063753095251782602e-1)},
+ {FN (arcsin), ARG(-5.0e-01,5.0e-01), RES(-4.5227844715119068206e-1, 5.3063753095251782602e-1)},
+ {FN (arcsin), ARG(-5.0e-01,-5.0e-01), RES(-4.5227844715119068206e-1, -5.3063753095251782602e-1)},
+ {FN (arcsin), ARG(5.0e-01,1.0e+00), RES(3.4943906285721329363e-1, 9.2613303135018242455e-1)},
+ {FN (arcsin), ARG(5.0e-01,-1.0e+00), RES(3.4943906285721329363e-1, -9.2613303135018242455e-1)},
+ {FN (arcsin), ARG(-5.0e-01,1.0e+00), RES(-3.4943906285721329363e-1, 9.2613303135018242455e-1)},
+ {FN (arcsin), ARG(-5.0e-01,-1.0e+00), RES(-3.4943906285721329363e-1, -9.2613303135018242455e-1)},
+ {FN (arcsin), ARG(5.0e-01,2.0e+00), RES(2.2101863562288385890e-1, 1.4657153519472905218e0)},
+ {FN (arcsin), ARG(5.0e-01,-2.0e+00), RES(2.2101863562288385890e-1, -1.4657153519472905218e0)},
+ {FN (arcsin), ARG(-5.0e-01,2.0e+00), RES(-2.2101863562288385890e-1, 1.4657153519472905218e0)},
+ {FN (arcsin), ARG(-5.0e-01,-2.0e+00), RES(-2.2101863562288385890e-1, -1.4657153519472905218e0)},
+ {FN (arcsin), ARG(5.0e-01,8.3886080e+06), RES(5.9604644775390130897e-8, 1.6635532333438692755e1)},
+ {FN (arcsin), ARG(5.0e-01,-8.3886080e+06), RES(5.9604644775390130897e-8, -1.6635532333438692755e1)},
+ {FN (arcsin), ARG(-5.0e-01,8.3886080e+06), RES(-5.9604644775390130897e-8, 1.6635532333438692755e1)},
+ {FN (arcsin), ARG(-5.0e-01,-8.3886080e+06), RES(-5.9604644775390130897e-8, -1.6635532333438692755e1)},
+ {FN (arcsin), ARG(1.0e+00,0.0e+00), RES(1.5707963267948966192e0, 0.0)},
+ {FN (arcsin), ARG(-1.0e+00,0.0e+00), RES(-1.5707963267948966192e0, 0.0)},
+ {FN (arcsin), ARG(1.0e+00,1.19209289550781250e-07), RES(1.5704510598153252947e0, 3.4526698643116312881e-4)},
+ {FN (arcsin), ARG(1.0e+00,-1.19209289550781250e-07), RES(1.5704510598153252947e0, -3.4526698643116312881e-4)},
+ {FN (arcsin), ARG(-1.0e+00,1.19209289550781250e-07), RES(-1.5704510598153252947e0, 3.4526698643116312881e-4)},
+ {FN (arcsin), ARG(-1.0e+00,-1.19209289550781250e-07), RES(-1.5704510598153252947e0, -3.4526698643116312881e-4)},
+ {FN (arcsin), ARG(1.0e+00,5.0e-01), RES(8.9590748120889023907e-1, 7.3285767597364526089e-1)},
+ {FN (arcsin), ARG(1.0e+00,-5.0e-01), RES(8.9590748120889023907e-1, -7.3285767597364526089e-1)},
+ {FN (arcsin), ARG(-1.0e+00,5.0e-01), RES(-8.9590748120889023907e-1, 7.3285767597364526089e-1)},
+ {FN (arcsin), ARG(-1.0e+00,-5.0e-01), RES(-8.9590748120889023907e-1, -7.3285767597364526089e-1)},
+ {FN (arcsin), ARG(1.0e+00,1.0e+00), RES(6.6623943249251525510e-1, 1.0612750619050356520e0)},
+ {FN (arcsin), ARG(1.0e+00,-1.0e+00), RES(6.6623943249251525510e-1, -1.0612750619050356520e0)},
+ {FN (arcsin), ARG(-1.0e+00,1.0e+00), RES(-6.6623943249251525510e-1, 1.0612750619050356520e0)},
+ {FN (arcsin), ARG(-1.0e+00,-1.0e+00), RES(-6.6623943249251525510e-1, -1.0612750619050356520e0)},
+ {FN (arcsin), ARG(1.0e+00,2.0e+00), RES(4.2707858639247612548e-1, 1.5285709194809981613e0)},
+ {FN (arcsin), ARG(1.0e+00,-2.0e+00), RES(4.2707858639247612548e-1, -1.5285709194809981613e0)},
+ {FN (arcsin), ARG(-1.0e+00,2.0e+00), RES(-4.2707858639247612548e-1, 1.5285709194809981613e0)},
+ {FN (arcsin), ARG(-1.0e+00,-2.0e+00), RES(-4.2707858639247612548e-1, -1.5285709194809981613e0)},
+ {FN (arcsin), ARG(1.0e+00,8.3886080e+06), RES(1.1920928955077983828e-7, 1.6635532333438698084e1)},
+ {FN (arcsin), ARG(1.0e+00,-8.3886080e+06), RES(1.1920928955077983828e-7, -1.6635532333438698084e1)},
+ {FN (arcsin), ARG(-1.0e+00,8.3886080e+06), RES(-1.1920928955077983828e-7, 1.6635532333438698084e1)},
+ {FN (arcsin), ARG(-1.0e+00,-8.3886080e+06), RES(-1.1920928955077983828e-7, -1.6635532333438698084e1)},
+ {FN (arcsin), ARG(2.0e+00,0.0e+00), RES(1.5707963267948966192e0, -1.3169578969248167086e0)},
+ {FN (arcsin), ARG(-2.0e+00,0.0e+00), RES(-1.5707963267948966192e0, 1.3169578969248167086e0)},
+ {FN (arcsin), ARG(2.0e+00,1.19209289550781250e-07), RES(1.5707962579693812072e0, 1.3169578969248194435e0)},
+ {FN (arcsin), ARG(2.0e+00,-1.19209289550781250e-07), RES(1.5707962579693812072e0, -1.3169578969248194435e0)},
+ {FN (arcsin), ARG(-2.0e+00,1.19209289550781250e-07), RES(-1.5707962579693812072e0, 1.3169578969248194435e0)},
+ {FN (arcsin), ARG(-2.0e+00,-1.19209289550781250e-07), RES(-1.5707962579693812072e0, -1.3169578969248194435e0)},
+ {FN (arcsin), ARG(2.0e+00,5.0e-01), RES(1.2930420702371826591e0, 1.3618009008578457882e0)},
+ {FN (arcsin), ARG(2.0e+00,-5.0e-01), RES(1.2930420702371826591e0, -1.3618009008578457882e0)},
+ {FN (arcsin), ARG(-2.0e+00,5.0e-01), RES(-1.2930420702371826591e0, 1.3618009008578457882e0)},
+ {FN (arcsin), ARG(-2.0e+00,-5.0e-01), RES(-1.2930420702371826591e0, -1.3618009008578457882e0)},
+ {FN (arcsin), ARG(2.0e+00,1.0e+00), RES(1.0634400235777520562e0, 1.4693517443681852733e0)},
+ {FN (arcsin), ARG(2.0e+00,-1.0e+00), RES(1.0634400235777520562e0, -1.4693517443681852733e0)},
+ {FN (arcsin), ARG(-2.0e+00,1.0e+00), RES(-1.0634400235777520562e0, 1.4693517443681852733e0)},
+ {FN (arcsin), ARG(-2.0e+00,-1.0e+00), RES(-1.0634400235777520562e0, -1.4693517443681852733e0)},
+ {FN (arcsin), ARG(2.0e+00,2.0e+00), RES(7.5424914469804604071e-1, 1.7343245214879664480e0)},
+ {FN (arcsin), ARG(2.0e+00,-2.0e+00), RES(7.5424914469804604071e-1, -1.7343245214879664480e0)},
+ {FN (arcsin), ARG(-2.0e+00,2.0e+00), RES(-7.5424914469804604071e-1, 1.7343245214879664480e0)},
+ {FN (arcsin), ARG(-2.0e+00,-2.0e+00), RES(-7.5424914469804604071e-1, -1.7343245214879664480e0)},
+ {FN (arcsin), ARG(2.0e+00,8.3886080e+06), RES(2.3841857910155628843e-7, 1.663553233343871940e1)},
+ {FN (arcsin), ARG(2.0e+00,-8.3886080e+06), RES(2.3841857910155628843e-7, -1.663553233343871940e1)},
+ {FN (arcsin), ARG(-2.0e+00,8.3886080e+06), RES(-2.3841857910155628843e-7, 1.663553233343871940e1)},
+ {FN (arcsin), ARG(-2.0e+00,-8.3886080e+06), RES(-2.3841857910155628843e-7, -1.663553233343871940e1)},
+ {FN (arcsin), ARG(8.3886080e+06,0.0e+00), RES(1.5707963267948966192e0, -1.6635532333438683873e1)},
+ {FN (arcsin), ARG(-8.3886080e+06,0.0e+00), RES(-1.5707963267948966192e0, 1.6635532333438683873e1)},
+ {FN (arcsin), ARG(8.3886080e+06,1.19209289550781250e-07), RES(1.5707963267948824084e0, 1.6635532333438683873e1)},
+ {FN (arcsin), ARG(8.3886080e+06,-1.19209289550781250e-07), RES(1.5707963267948824084e0, -1.6635532333438683873e1)},
+ {FN (arcsin), ARG(-8.3886080e+06,1.19209289550781250e-07), RES(-1.5707963267948824084e0, 1.6635532333438683873e1)},
+ {FN (arcsin), ARG(-8.3886080e+06,-1.19209289550781250e-07), RES(-1.5707963267948824084e0, -1.6635532333438683873e1)},
+ {FN (arcsin), ARG(8.3886080e+06,5.0e-01), RES(1.5707962671902518438e0, 1.6635532333438685650e1)},
+ {FN (arcsin), ARG(8.3886080e+06,-5.0e-01), RES(1.5707962671902518438e0, -1.6635532333438685650e1)},
+ {FN (arcsin), ARG(-8.3886080e+06,5.0e-01), RES(-1.5707962671902518438e0, 1.6635532333438685650e1)},
+ {FN (arcsin), ARG(-8.3886080e+06,-5.0e-01), RES(-1.5707962671902518438e0, -1.6635532333438685650e1)},
+ {FN (arcsin), ARG(8.3886080e+06,1.0e+00), RES(1.5707962075856070684e0, 1.6635532333438690979e1)},
+ {FN (arcsin), ARG(8.3886080e+06,-1.0e+00), RES(1.5707962075856070684e0, -1.6635532333438690979e1)},
+ {FN (arcsin), ARG(-8.3886080e+06,1.0e+00), RES(-1.5707962075856070684e0, 1.6635532333438690979e1)},
+ {FN (arcsin), ARG(-8.3886080e+06,-1.0e+00), RES(-1.5707962075856070684e0, -1.6635532333438690979e1)},
+ {FN (arcsin), ARG(8.3886080e+06,2.0e+00), RES(1.5707960883763175177e0, 1.6635532333438712295e1)},
+ {FN (arcsin), ARG(8.3886080e+06,-2.0e+00), RES(1.5707960883763175177e0, -1.6635532333438712295e1)},
+ {FN (arcsin), ARG(-8.3886080e+06,2.0e+00), RES(-1.5707960883763175177e0, 1.6635532333438712295e1)},
+ {FN (arcsin), ARG(-8.3886080e+06,-2.0e+00), RES(-1.5707960883763175177e0, -1.6635532333438712295e1)},
+ {FN (arcsin), ARG(8.3886080e+06,8.3886080e+06), RES(7.8539816339744653326e-1, 1.6982105923718660081e1)},
+ {FN (arcsin), ARG(8.3886080e+06,-8.3886080e+06), RES(7.8539816339744653326e-1, -1.6982105923718660081e1)},
+ {FN (arcsin), ARG(-8.3886080e+06,8.3886080e+06), RES(-7.8539816339744653326e-1, 1.6982105923718660081e1)},
+ {FN (arcsin), ARG(-8.3886080e+06,-8.3886080e+06), RES(-7.8539816339744653326e-1, -1.6982105923718660081e1)},
+ {FN (arccos), ARG(0.0e+00,0.0e+00), RES(1.5707963267948966192e0, 0.0)},
+ {FN (arccos), ARG(0.0e+00,1.19209289550781250e-07), RES(1.5707963267948966192e0, -1.1920928955078096766e-7)},
+ {FN (arccos), ARG(0.0e+00,-1.19209289550781250e-07), RES(1.5707963267948966192e0, 1.1920928955078096766e-7)},
+ {FN (arccos), ARG(0.0e+00,5.0e-01), RES(1.5707963267948966192e0, -4.8121182505960344750e-1)},
+ {FN (arccos), ARG(0.0e+00,-5.0e-01), RES(1.5707963267948966192e0, 4.8121182505960344750e-1)},
+ {FN (arccos), ARG(0.0e+00,1.0e+00), RES(1.5707963267948966192e0, -8.8137358701954302523e-1)},
+ {FN (arccos), ARG(0.0e+00,-1.0e+00), RES(1.5707963267948966192e0, 8.8137358701954302523e-1)},
+ {FN (arccos), ARG(0.0e+00,2.0e+00), RES(1.5707963267948966192e0, -1.4436354751788103425e0)},
+ {FN (arccos), ARG(0.0e+00,-2.0e+00), RES(1.5707963267948966192e0, 1.4436354751788103425e0)},
+ {FN (arccos), ARG(0.0e+00,8.3886080e+06), RES(1.5707963267948966192e0, -1.6635532333438690979e1)},
+ {FN (arccos), ARG(0.0e+00,-8.3886080e+06), RES(1.5707963267948966192e0, 1.6635532333438690979e1)},
+ {FN (arccos), ARG(1.19209289550781250e-07,0.0e+00), RES(1.5707962075856070684e0, 0.0)},
+ {FN (arccos), ARG(-1.19209289550781250e-07,0.0e+00), RES(1.570796446004186170e0, 0.0)},
+ {FN (arccos), ARG(1.19209289550781250e-07,1.19209289550781250e-07), RES(1.5707962075856070685e0, -1.1920928955078181469e-7)},
+ {FN (arccos), ARG(1.19209289550781250e-07,-1.19209289550781250e-07), RES(1.5707962075856070685e0, 1.1920928955078181469e-7)},
+ {FN (arccos), ARG(-1.19209289550781250e-07,1.19209289550781250e-07), RES(1.570796446004186170e0, -1.1920928955078181469e-7)},
+ {FN (arccos), ARG(-1.19209289550781250e-07,-1.19209289550781250e-07), RES(1.570796446004186170e0, 1.1920928955078181469e-7)},
+ {FN (arccos), ARG(1.19209289550781250e-07,5.0e-01), RES(1.5707962201708666252e0, -4.8121182505960598961e-1)},
+ {FN (arccos), ARG(1.19209289550781250e-07,-5.0e-01), RES(1.5707962201708666252e0, 4.8121182505960598961e-1)},
+ {FN (arccos), ARG(-1.19209289550781250e-07,5.0e-01), RES(1.5707964334189266132e0, -4.8121182505960598961e-1)},
+ {FN (arccos), ARG(-1.19209289550781250e-07,-5.0e-01), RES(1.5707964334189266132e0, 4.8121182505960598961e-1)},
+ {FN (arccos), ARG(1.19209289550781250e-07,1.0e+00), RES(1.5707962425011995974e0, -8.8137358701954553738e-1)},
+ {FN (arccos), ARG(1.19209289550781250e-07,-1.0e+00), RES(1.5707962425011995974e0, 8.8137358701954553738e-1)},
+ {FN (arccos), ARG(-1.19209289550781250e-07,1.0e+00), RES(1.5707964110885936410e0, -8.8137358701954553738e-1)},
+ {FN (arccos), ARG(-1.19209289550781250e-07,-1.0e+00), RES(1.5707964110885936410e0, 8.8137358701954553738e-1)},
+ {FN (arccos), ARG(1.19209289550781250e-07,2.0e+00), RES(1.5707962734828816222e0, -1.4436354751788116136e0)},
+ {FN (arccos), ARG(1.19209289550781250e-07,-2.0e+00), RES(1.5707962734828816222e0, 1.4436354751788116136e0)},
+ {FN (arccos), ARG(-1.19209289550781250e-07,2.0e+00), RES(1.5707963801069116162e0, -1.4436354751788116136e0)},
+ {FN (arccos), ARG(-1.19209289550781250e-07,-2.0e+00), RES(1.5707963801069116162e0, 1.4436354751788116136e0)},
+ {FN (arccos), ARG(1.19209289550781250e-07,8.3886080e+06), RES(1.5707963267948824084e0, -1.6635532333438690979e1)},
+ {FN (arccos), ARG(1.19209289550781250e-07,-8.3886080e+06), RES(1.5707963267948824084e0, 1.6635532333438690979e1)},
+ {FN (arccos), ARG(-1.19209289550781250e-07,8.3886080e+06), RES(1.5707963267949108301e0, -1.6635532333438690979e1)},
+ {FN (arccos), ARG(-1.19209289550781250e-07,-8.3886080e+06), RES(1.5707963267949108301e0, 1.6635532333438690979e1)},
+ {FN (arccos), ARG(5.0e-01,0.0e+00), RES(1.0471975511965977462e0, 0.0)},
+ {FN (arccos), ARG(-5.0e-01,0.0e+00), RES(2.0943951023931954923e0, 0.0)},
+ {FN (arccos), ARG(5.0e-01,1.19209289550781250e-07), RES(1.0471975511966032159e0, -1.3765103082409432364e-7)},
+ {FN (arccos), ARG(5.0e-01,-1.19209289550781250e-07), RES(1.0471975511966032159e0, 1.3765103082409432364e-7)},
+ {FN (arccos), ARG(-5.0e-01,1.19209289550781250e-07), RES(2.0943951023931900225e0, -1.3765103082409432364e-7)},
+ {FN (arccos), ARG(-5.0e-01,-1.19209289550781250e-07), RES(2.0943951023931900225e0, 1.3765103082409432364e-7)},
+ {FN (arccos), ARG(5.0e-01,5.0e-01), RES(1.1185178796437059372e0, -5.3063753095251782602e-1)},
+ {FN (arccos), ARG(5.0e-01,-5.0e-01), RES(1.1185178796437059372e0, 5.3063753095251782602e-1)},
+ {FN (arccos), ARG(-5.0e-01,5.0e-01), RES(2.0230747739460873013e0, -5.3063753095251782602e-1)},
+ {FN (arccos), ARG(-5.0e-01,-5.0e-01), RES(2.0230747739460873013e0, 5.3063753095251782602e-1)},
+ {FN (arccos), ARG(5.0e-01,1.0e+00), RES(1.2213572639376833256e0, -9.2613303135018242455e-1)},
+ {FN (arccos), ARG(5.0e-01,-1.0e+00), RES(1.2213572639376833256e0, 9.2613303135018242455e-1)},
+ {FN (arccos), ARG(-5.0e-01,1.0e+00), RES(1.9202353896521099129e0, -9.2613303135018242455e-1)},
+ {FN (arccos), ARG(-5.0e-01,-1.0e+00), RES(1.9202353896521099129e0, 9.2613303135018242455e-1)},
+ {FN (arccos), ARG(5.0e-01,2.0e+00), RES(1.3497776911720127603e0, -1.4657153519472905218e0)},
+ {FN (arccos), ARG(5.0e-01,-2.0e+00), RES(1.3497776911720127603e0, 1.4657153519472905218e0)},
+ {FN (arccos), ARG(-5.0e-01,2.0e+00), RES(1.7918149624177804781e0, -1.4657153519472905218e0)},
+ {FN (arccos), ARG(-5.0e-01,-2.0e+00), RES(1.7918149624177804781e0, 1.4657153519472905218e0)},
+ {FN (arccos), ARG(5.0e-01,8.3886080e+06), RES(1.5707962671902518438e0, -1.6635532333438692755e1)},
+ {FN (arccos), ARG(5.0e-01,-8.3886080e+06), RES(1.5707962671902518438e0, 1.6635532333438692755e1)},
+ {FN (arccos), ARG(-5.0e-01,8.3886080e+06), RES(1.5707963863995413946e0, -1.6635532333438692755e1)},
+ {FN (arccos), ARG(-5.0e-01,-8.3886080e+06), RES(1.5707963863995413946e0, 1.6635532333438692755e1)},
+ {FN (arccos), ARG(1.0e+00,0.0e+00), RES(0e0, 0.0)},
+ {FN (arccos), ARG(-1.0e+00,0.0e+00), RES(3.1415926535897932385e0, 0.0)},
+ {FN (arccos), ARG(1.0e+00,1.19209289550781250e-07), RES(3.4526697957132450399e-4, -3.4526698643116312881e-4)},
+ {FN (arccos), ARG(1.0e+00,-1.19209289550781250e-07), RES(3.4526697957132450399e-4, 3.4526698643116312881e-4)},
+ {FN (arccos), ARG(-1.0e+00,1.19209289550781250e-07), RES(3.1412473866102219140e0, -3.4526698643116312881e-4)},
+ {FN (arccos), ARG(-1.0e+00,-1.19209289550781250e-07), RES(3.1412473866102219140e0, 3.4526698643116312881e-4)},
+ {FN (arccos), ARG(1.0e+00,5.0e-01), RES(6.7488884558600638016e-1, -7.3285767597364526089e-1)},
+ {FN (arccos), ARG(1.0e+00,-5.0e-01), RES(6.7488884558600638016e-1, 7.3285767597364526089e-1)},
+ {FN (arccos), ARG(-1.0e+00,5.0e-01), RES(2.4667038080037868583e0, -7.3285767597364526089e-1)},
+ {FN (arccos), ARG(-1.0e+00,-5.0e-01), RES(2.4667038080037868583e0, 7.3285767597364526089e-1)},
+ {FN (arccos), ARG(1.0e+00,1.0e+00), RES(9.0455689430238136413e-1, -1.0612750619050356520e0)},
+ {FN (arccos), ARG(1.0e+00,-1.0e+00), RES(9.0455689430238136413e-1, 1.0612750619050356520e0)},
+ {FN (arccos), ARG(-1.0e+00,1.0e+00), RES(2.2370357592874118743e0, -1.0612750619050356520e0)},
+ {FN (arccos), ARG(-1.0e+00,-1.0e+00), RES(2.2370357592874118743e0, 1.0612750619050356520e0)},
+ {FN (arccos), ARG(1.0e+00,2.0e+00), RES(1.1437177404024204938e0, -1.5285709194809981613e0)},
+ {FN (arccos), ARG(1.0e+00,-2.0e+00), RES(1.1437177404024204938e0, 1.5285709194809981613e0)},
+ {FN (arccos), ARG(-1.0e+00,2.0e+00), RES(1.9978749131873727447e0, -1.5285709194809981613e0)},
+ {FN (arccos), ARG(-1.0e+00,-2.0e+00), RES(1.9978749131873727447e0, 1.5285709194809981613e0)},
+ {FN (arccos), ARG(1.0e+00,8.3886080e+06), RES(1.5707962075856070685e0, -1.6635532333438698084e1)},
+ {FN (arccos), ARG(1.0e+00,-8.3886080e+06), RES(1.5707962075856070685e0, 1.6635532333438698084e1)},
+ {FN (arccos), ARG(-1.0e+00,8.3886080e+06), RES(1.570796446004186170e0, -1.6635532333438698084e1)},
+ {FN (arccos), ARG(-1.0e+00,-8.3886080e+06), RES(1.570796446004186170e0, 1.6635532333438698084e1)},
+ {FN (arccos), ARG(2.0e+00,0.0e+00), RES(0, 1.3169578969248167086e0)},
+ {FN (arccos), ARG(-2.0e+00,0.0e+00), RES(3.1415926535897932385e0, -1.3169578969248167086e0)},
+ {FN (arccos), ARG(2.0e+00,1.19209289550781250e-07), RES(6.8825515412047433504e-8, -1.3169578969248194435e0)},
+ {FN (arccos), ARG(2.0e+00,-1.19209289550781250e-07), RES(6.8825515412047433504e-8, 1.3169578969248194435e0)},
+ {FN (arccos), ARG(-2.0e+00,1.19209289550781250e-07), RES(3.1415925847642778264e0, -1.3169578969248194435e0)},
+ {FN (arccos), ARG(-2.0e+00,-1.19209289550781250e-07), RES(3.1415925847642778264e0, 1.3169578969248194435e0)},
+ {FN (arccos), ARG(2.0e+00,5.0e-01), RES(2.7775425655771396018e-1, -1.3618009008578457882e0)},
+ {FN (arccos), ARG(2.0e+00,-5.0e-01), RES(2.7775425655771396018e-1, 1.3618009008578457882e0)},
+ {FN (arccos), ARG(-2.0e+00,5.0e-01), RES(2.8638383970320792783e0, -1.3618009008578457882e0)},
+ {FN (arccos), ARG(-2.0e+00,-5.0e-01), RES(2.8638383970320792783e0, 1.3618009008578457882e0)},
+ {FN (arccos), ARG(2.0e+00,1.0e+00), RES(5.0735630321714456304e-1, -1.4693517443681852733e0)},
+ {FN (arccos), ARG(2.0e+00,-1.0e+00), RES(5.0735630321714456304e-1, 1.4693517443681852733e0)},
+ {FN (arccos), ARG(-2.0e+00,1.0e+00), RES(2.6342363503726486754e0, -1.4693517443681852733e0)},
+ {FN (arccos), ARG(-2.0e+00,-1.0e+00), RES(2.6342363503726486754e0, 1.4693517443681852733e0)},
+ {FN (arccos), ARG(2.0e+00,2.0e+00), RES(8.1654718209685057852e-1, -1.7343245214879664480e0)},
+ {FN (arccos), ARG(2.0e+00,-2.0e+00), RES(8.1654718209685057852e-1, 1.7343245214879664480e0)},
+ {FN (arccos), ARG(-2.0e+00,2.0e+00), RES(2.3250454714929426599e0, -1.7343245214879664480e0)},
+ {FN (arccos), ARG(-2.0e+00,-2.0e+00), RES(2.3250454714929426599e0, 1.7343245214879664480e0)},
+ {FN (arccos), ARG(2.0e+00,8.3886080e+06), RES(1.5707960883763175177e0, -1.663553233343871940e1)},
+ {FN (arccos), ARG(2.0e+00,-8.3886080e+06), RES(1.5707960883763175177e0, 1.663553233343871940e1)},
+ {FN (arccos), ARG(-2.0e+00,8.3886080e+06), RES(1.5707965652134757208e0, -1.663553233343871940e1)},
+ {FN (arccos), ARG(-2.0e+00,-8.3886080e+06), RES(1.5707965652134757208e0, 1.663553233343871940e1)},
+ {FN (arccos), ARG(8.3886080e+06,0.0e+00), RES(0, 1.6635532333438683873e1)},
+ {FN (arccos), ARG(-8.3886080e+06,0.0e+00), RES(3.1415926535897932385e0, -1.6635532333438683873e1)},
+ {FN (arccos), ARG(8.3886080e+06,1.19209289550781250e-07), RES(1.4210854715202104692e-14, -1.6635532333438683873e1)},
+ {FN (arccos), ARG(8.3886080e+06,-1.19209289550781250e-07), RES(1.4210854715202104692e-14, 1.6635532333438683873e1)},
+ {FN (arccos), ARG(-8.3886080e+06,1.19209289550781250e-07), RES(3.1415926535897790276e0, -1.6635532333438683873e1)},
+ {FN (arccos), ARG(-8.3886080e+06,-1.19209289550781250e-07), RES(3.1415926535897790276e0, 1.6635532333438683873e1)},
+ {FN (arccos), ARG(8.3886080e+06,5.0e-01), RES(5.9604644775390977930e-8, -1.6635532333438685650e1)},
+ {FN (arccos), ARG(8.3886080e+06,-5.0e-01), RES(5.9604644775390977930e-8, 1.6635532333438685650e1)},
+ {FN (arccos), ARG(-8.3886080e+06,5.0e-01), RES(3.1415925939851484631e0, -1.6635532333438685650e1)},
+ {FN (arccos), ARG(-8.3886080e+06,-5.0e-01), RES(3.1415925939851484631e0, 1.6635532333438685650e1)},
+ {FN (arccos), ARG(8.3886080e+06,1.0e+00), RES(1.1920928955078153234e-7, -1.6635532333438690979e1)},
+ {FN (arccos), ARG(8.3886080e+06,-1.0e+00), RES(1.1920928955078153234e-7, 1.6635532333438690979e1)},
+ {FN (arccos), ARG(-8.3886080e+06,1.0e+00), RES(3.1415925343805036877e0, -1.6635532333438690979e1)},
+ {FN (arccos), ARG(-8.3886080e+06,-1.0e+00), RES(3.1415925343805036877e0, 1.6635532333438690979e1)},
+ {FN (arccos), ARG(8.3886080e+06,2.0e+00), RES(2.3841857910155967656e-7, -1.6635532333438712295e1)},
+ {FN (arccos), ARG(8.3886080e+06,-2.0e+00), RES(2.3841857910155967656e-7, 1.6635532333438712295e1)},
+ {FN (arccos), ARG(-8.3886080e+06,2.0e+00), RES(3.1415924151712141369e0, -1.6635532333438712295e1)},
+ {FN (arccos), ARG(-8.3886080e+06,-2.0e+00), RES(3.1415924151712141369e0, 1.6635532333438712295e1)},
+ {FN (arccos), ARG(8.3886080e+06,8.3886080e+06), RES(7.8539816339745008597e-1, -1.6982105923718660081e1)},
+ {FN (arccos), ARG(8.3886080e+06,-8.3886080e+06), RES(7.8539816339745008597e-1, 1.6982105923718660081e1)},
+ {FN (arccos), ARG(-8.3886080e+06,8.3886080e+06), RES(2.3561944901923431525e0, -1.6982105923718660081e1)},
+ {FN (arccos), ARG(-8.3886080e+06,-8.3886080e+06), RES(2.3561944901923431525e0, 1.6982105923718660081e1)},
+ {FN (arctan), ARG(0.0e+00,0.0e+00), RES(0e0, 0.0)},
+ {FN (arctan), ARG(0.0e+00,1.19209289550781250e-07), RES(0, 1.1920928955078181469e-7)},
+ {FN (arctan), ARG(0.0e+00,-1.19209289550781250e-07), RES(0, -1.1920928955078181469e-7)},
+ {FN (arctan), ARG(0.0e+00,5.0e-01), RES(0, 5.4930614433405484570e-1)},
+ {FN (arctan), ARG(0.0e+00,-5.0e-01), RES(0, -5.4930614433405484570e-1)},
+ {FN (arctan), ARG(0.0e+00,2.0e+00), RES(1.5707963267948966192e0, 5.4930614433405484570e-1)},
+ {FN (arctan), ARG(0.0e+00,-2.0e+00), RES(-1.5707963267948966192e0, -5.4930614433405484570e-1)},
+ {FN (arctan), ARG(0.0e+00,8.3886080e+06), RES(1.5707963267948966192e0, 1.1920928955078181469e-7)},
+ {FN (arctan), ARG(0.0e+00,-8.3886080e+06), RES(-1.5707963267948966192e0, -1.1920928955078181469e-7)},
+ {FN (arctan), ARG(1.19209289550781250e-07,0.0e+00), RES(1.1920928955078068531e-7, 0.0)},
+ {FN (arctan), ARG(-1.19209289550781250e-07,0.0e+00), RES(-1.1920928955078068531e-7, 0.0)},
+ {FN (arctan), ARG(1.19209289550781250e-07,1.19209289550781250e-07), RES(1.1920928955078237938e-7, 1.1920928955078012062e-7)},
+ {FN (arctan), ARG(1.19209289550781250e-07,-1.19209289550781250e-07), RES(1.1920928955078237938e-7, -1.1920928955078012062e-7)},
+ {FN (arctan), ARG(-1.19209289550781250e-07,1.19209289550781250e-07), RES(-1.1920928955078237938e-7, 1.1920928955078012062e-7)},
+ {FN (arctan), ARG(-1.19209289550781250e-07,-1.19209289550781250e-07), RES(-1.1920928955078237938e-7, -1.1920928955078012062e-7)},
+ {FN (arctan), ARG(1.19209289550781250e-07,5.0e-01), RES(1.5894571940103932425e-7, 5.4930614433404221383e-1)},
+ {FN (arctan), ARG(1.19209289550781250e-07,-5.0e-01), RES(1.5894571940103932425e-7, -5.4930614433404221383e-1)},
+ {FN (arctan), ARG(-1.19209289550781250e-07,5.0e-01), RES(-1.5894571940103932425e-7, 5.4930614433404221383e-1)},
+ {FN (arctan), ARG(-1.19209289550781250e-07,-5.0e-01), RES(-1.5894571940103932425e-7, -5.4930614433404221383e-1)},
+ {FN (arctan), ARG(1.19209289550781250e-07,1.0e+00), RES(7.8539819319977069731e-1, 8.3177661667193446012e0)},
+ {FN (arctan), ARG(1.19209289550781250e-07,-1.0e+00), RES(7.8539819319977069731e-1, -8.3177661667193446012e0)},
+ {FN (arctan), ARG(-1.19209289550781250e-07,1.0e+00), RES(-7.8539819319977069731e-1, 8.3177661667193446012e0)},
+ {FN (arctan), ARG(-1.19209289550781250e-07,-1.0e+00), RES(-7.8539819319977069731e-1, -8.3177661667193446012e0)},
+ {FN (arctan), ARG(1.19209289550781250e-07,2.0e+00), RES(1.5707962870584667690e0, 5.4930614433405168773e-1)},
+ {FN (arctan), ARG(1.19209289550781250e-07,-2.0e+00), RES(1.5707962870584667690e0, -5.4930614433405168773e-1)},
+ {FN (arctan), ARG(-1.19209289550781250e-07,2.0e+00), RES(-1.5707962870584667690e0, 5.4930614433405168773e-1)},
+ {FN (arctan), ARG(-1.19209289550781250e-07,-2.0e+00), RES(-1.5707962870584667690e0, -5.4930614433405168773e-1)},
+ {FN (arctan), ARG(1.19209289550781250e-07,8.3886080e+06), RES(1.5707963267948966192e0, 1.1920928955078181469e-7)},
+ {FN (arctan), ARG(1.19209289550781250e-07,-8.3886080e+06), RES(1.5707963267948966192e0, -1.1920928955078181469e-7)},
+ {FN (arctan), ARG(-1.19209289550781250e-07,8.3886080e+06), RES(-1.5707963267948966192e0, 1.1920928955078181469e-7)},
+ {FN (arctan), ARG(-1.19209289550781250e-07,-8.3886080e+06), RES(-1.5707963267948966192e0, -1.1920928955078181469e-7)},
+ {FN (arctan), ARG(5.0e-01,0.0e+00), RES(4.6364760900080611621e-1, 0.0)},
+ {FN (arctan), ARG(-5.0e-01,0.0e+00), RES(-4.6364760900080611621e-1, 0.0)},
+ {FN (arctan), ARG(5.0e-01,1.19209289550781250e-07), RES(4.6364760900081066369e-1, 9.5367431640625072280e-8)},
+ {FN (arctan), ARG(5.0e-01,-1.19209289550781250e-07), RES(4.6364760900081066369e-1, -9.5367431640625072280e-8)},
+ {FN (arctan), ARG(-5.0e-01,1.19209289550781250e-07), RES(-4.6364760900081066369e-1, 9.5367431640625072280e-8)},
+ {FN (arctan), ARG(-5.0e-01,-1.19209289550781250e-07), RES(-4.6364760900081066369e-1, -9.5367431640625072280e-8)},
+ {FN (arctan), ARG(5.0e-01,5.0e-01), RES(5.5357435889704525151e-1, 4.0235947810852509365e-1)},
+ {FN (arctan), ARG(5.0e-01,-5.0e-01), RES(5.5357435889704525151e-1, -4.0235947810852509365e-1)},
+ {FN (arctan), ARG(-5.0e-01,5.0e-01), RES(-5.5357435889704525151e-1, 4.0235947810852509365e-1)},
+ {FN (arctan), ARG(-5.0e-01,-5.0e-01), RES(-5.5357435889704525151e-1, -4.0235947810852509365e-1)},
+ {FN (arctan), ARG(5.0e-01,1.0e+00), RES(9.0788749496088038670e-1, 7.0830333601405402006e-1)},
+ {FN (arctan), ARG(5.0e-01,-1.0e+00), RES(9.0788749496088038670e-1, -7.0830333601405402006e-1)},
+ {FN (arctan), ARG(-5.0e-01,1.0e+00), RES(-9.0788749496088038670e-1, 7.0830333601405402006e-1)},
+ {FN (arctan), ARG(-5.0e-01,-1.0e+00), RES(-9.0788749496088038670e-1, -7.0830333601405402006e-1)},
+ {FN (arctan), ARG(5.0e-01,2.0e+00), RES(1.4215468610018069803e0, 5.0037000005253101744e-1)},
+ {FN (arctan), ARG(5.0e-01,-2.0e+00), RES(1.4215468610018069803e0, -5.0037000005253101744e-1)},
+ {FN (arctan), ARG(-5.0e-01,2.0e+00), RES(-1.4215468610018069803e0, 5.0037000005253101744e-1)},
+ {FN (arctan), ARG(-5.0e-01,-2.0e+00), RES(-1.4215468610018069803e0, -5.0037000005253101744e-1)},
+ {FN (arctan), ARG(5.0e-01,8.3886080e+06), RES(1.5707963267948895138e0, 1.1920928955078139117e-7)},
+ {FN (arctan), ARG(5.0e-01,-8.3886080e+06), RES(1.5707963267948895138e0, -1.1920928955078139117e-7)},
+ {FN (arctan), ARG(-5.0e-01,8.3886080e+06), RES(-1.5707963267948895138e0, 1.1920928955078139117e-7)},
+ {FN (arctan), ARG(-5.0e-01,-8.3886080e+06), RES(-1.5707963267948895138e0, -1.1920928955078139117e-7)},
+ {FN (arctan), ARG(1.0e+00,0.0e+00), RES(7.8539816339744830962e-1, 0.0)},
+ {FN (arctan), ARG(-1.0e+00,0.0e+00), RES(-7.8539816339744830962e-1, 0.0)},
+ {FN (arctan), ARG(1.0e+00,1.19209289550781250e-07), RES(7.8539816339745186233e-1, 5.9604644775390483828e-8)},
+ {FN (arctan), ARG(1.0e+00,-1.19209289550781250e-07), RES(7.8539816339745186233e-1, -5.9604644775390483828e-8)},
+ {FN (arctan), ARG(-1.0e+00,1.19209289550781250e-07), RES(-7.8539816339745186233e-1, 5.9604644775390483828e-8)},
+ {FN (arctan), ARG(-1.0e+00,-1.19209289550781250e-07), RES(-7.8539816339745186233e-1, -5.9604644775390483828e-8)},
+ {FN (arctan), ARG(1.0e+00,5.0e-01), RES(8.4757566067082902713e-1, 2.3887786125685909036e-1)},
+ {FN (arctan), ARG(1.0e+00,-5.0e-01), RES(8.4757566067082902713e-1, -2.3887786125685909036e-1)},
+ {FN (arctan), ARG(-1.0e+00,5.0e-01), RES(-8.4757566067082902713e-1, 2.3887786125685909036e-1)},
+ {FN (arctan), ARG(-1.0e+00,-5.0e-01), RES(-8.4757566067082902713e-1, -2.3887786125685909036e-1)},
+ {FN (arctan), ARG(1.0e+00,1.0e+00), RES(1.0172219678978513677e0, 4.0235947810852509365e-1)},
+ {FN (arctan), ARG(1.0e+00,-1.0e+00), RES(1.0172219678978513677e0, -4.0235947810852509365e-1)},
+ {FN (arctan), ARG(-1.0e+00,1.0e+00), RES(-1.0172219678978513677e0, 4.0235947810852509365e-1)},
+ {FN (arctan), ARG(-1.0e+00,-1.0e+00), RES(-1.0172219678978513677e0, -4.0235947810852509365e-1)},
+ {FN (arctan), ARG(1.0e+00,2.0e+00), RES(1.3389725222944935611e0, 4.0235947810852509365e-1)},
+ {FN (arctan), ARG(1.0e+00,-2.0e+00), RES(1.3389725222944935611e0, -4.0235947810852509365e-1)},
+ {FN (arctan), ARG(-1.0e+00,2.0e+00), RES(-1.3389725222944935611e0, 4.0235947810852509365e-1)},
+ {FN (arctan), ARG(-1.0e+00,-2.0e+00), RES(-1.3389725222944935611e0, -4.0235947810852509365e-1)},
+ {FN (arctan), ARG(1.0e+00,8.3886080e+06), RES(1.5707963267948824084e0, 1.1920928955078012062e-7)},
+ {FN (arctan), ARG(1.0e+00,-8.3886080e+06), RES(1.5707963267948824084e0, -1.1920928955078012062e-7)},
+ {FN (arctan), ARG(-1.0e+00,8.3886080e+06), RES(-1.5707963267948824084e0, 1.1920928955078012062e-7)},
+ {FN (arctan), ARG(-1.0e+00,-8.3886080e+06), RES(-1.5707963267948824084e0, -1.1920928955078012062e-7)},
+ {FN (arctan), ARG(2.0e+00,0.0e+00), RES(1.1071487177940905030e0, 0.0)},
+ {FN (arctan), ARG(-2.0e+00,0.0e+00), RES(-1.1071487177940905030e0, 0.0)},
+ {FN (arctan), ARG(2.0e+00,1.19209289550781250e-07), RES(1.1071487177940916399e0, 2.3841857910156200307e-8)},
+ {FN (arctan), ARG(2.0e+00,-1.19209289550781250e-07), RES(1.1071487177940916399e0, -2.3841857910156200307e-8)},
+ {FN (arctan), ARG(-2.0e+00,1.19209289550781250e-07), RES(-1.1071487177940916399e0, 2.3841857910156200307e-8)},
+ {FN (arctan), ARG(-2.0e+00,-1.19209289550781250e-07), RES(-1.1071487177940916399e0, -2.3841857910156200307e-8)},
+ {FN (arctan), ARG(2.0e+00,5.0e-01), RES(1.1265564408348223487e0, 9.6415620202996167238e-2)},
+ {FN (arctan), ARG(2.0e+00,-5.0e-01), RES(1.1265564408348223487e0, -9.6415620202996167238e-2)},
+ {FN (arctan), ARG(-2.0e+00,5.0e-01), RES(-1.1265564408348223487e0, 9.6415620202996167238e-2)},
+ {FN (arctan), ARG(-2.0e+00,-5.0e-01), RES(-1.1265564408348223487e0, -9.6415620202996167238e-2)},
+ {FN (arctan), ARG(2.0e+00,1.0e+00), RES(1.1780972450961724644e0, 1.7328679513998632735e-1)},
+ {FN (arctan), ARG(2.0e+00,-1.0e+00), RES(1.1780972450961724644e0, -1.7328679513998632735e-1)},
+ {FN (arctan), ARG(-2.0e+00,1.0e+00), RES(-1.1780972450961724644e0, 1.7328679513998632735e-1)},
+ {FN (arctan), ARG(-2.0e+00,-1.0e+00), RES(-1.1780972450961724644e0, -1.7328679513998632735e-1)},
+ {FN (arctan), ARG(2.0e+00,2.0e+00), RES(1.3112232696716351433e0, 2.3887786125685909036e-1)},
+ {FN (arctan), ARG(2.0e+00,-2.0e+00), RES(1.3112232696716351433e0, -2.3887786125685909036e-1)},
+ {FN (arctan), ARG(-2.0e+00,2.0e+00), RES(-1.3112232696716351433e0, 2.3887786125685909036e-1)},
+ {FN (arctan), ARG(-2.0e+00,-2.0e+00), RES(-1.3112232696716351433e0, -2.3887786125685909036e-1)},
+ {FN (arctan), ARG(2.0e+00,8.3886080e+06), RES(1.5707963267948681975e0, 1.1920928955077503843e-7)},
+ {FN (arctan), ARG(2.0e+00,-8.3886080e+06), RES(1.5707963267948681975e0, -1.1920928955077503843e-7)},
+ {FN (arctan), ARG(-2.0e+00,8.3886080e+06), RES(-1.5707963267948681975e0, 1.1920928955077503843e-7)},
+ {FN (arctan), ARG(-2.0e+00,-8.3886080e+06), RES(-1.5707963267948681975e0, -1.1920928955077503843e-7)},
+ {FN (arctan), ARG(8.3886080e+06,0.0e+00), RES(1.5707962075856070685e0, 0.0)},
+ {FN (arctan), ARG(-8.3886080e+06,0.0e+00), RES(-1.5707962075856070685e0, 0.0)},
+ {FN (arctan), ARG(8.3886080e+06,1.19209289550781250e-07), RES(1.5707962075856070685e0, 1.6940658945085766040e-21)},
+ {FN (arctan), ARG(8.3886080e+06,-1.19209289550781250e-07), RES(1.5707962075856070685e0, -1.6940658945085766040e-21)},
+ {FN (arctan), ARG(-8.3886080e+06,1.19209289550781250e-07), RES(-1.5707962075856070685e0, 1.6940658945085766040e-21)},
+ {FN (arctan), ARG(-8.3886080e+06,-1.19209289550781250e-07), RES(-1.5707962075856070685e0, -1.6940658945085766040e-21)},
+ {FN (arctan), ARG(8.3886080e+06,5.0e-01), RES(1.5707962075856070685e0, 7.1054273576008756410e-15)},
+ {FN (arctan), ARG(8.3886080e+06,-5.0e-01), RES(1.5707962075856070685e0, -7.1054273576008756410e-15)},
+ {FN (arctan), ARG(-8.3886080e+06,5.0e-01), RES(-1.5707962075856070685e0, 7.1054273576008756410e-15)},
+ {FN (arctan), ARG(-8.3886080e+06,-5.0e-01), RES(-1.5707962075856070685e0, -7.1054273576008756410e-15)},
+ {FN (arctan), ARG(8.3886080e+06,1.0e+00), RES(1.5707962075856070685e0, 1.4210854715201599821e-14)},
+ {FN (arctan), ARG(8.3886080e+06,-1.0e+00), RES(1.5707962075856070685e0, -1.4210854715201599821e-14)},
+ {FN (arctan), ARG(-8.3886080e+06,1.0e+00), RES(-1.5707962075856070685e0, 1.4210854715201599821e-14)},
+ {FN (arctan), ARG(-8.3886080e+06,-1.0e+00), RES(-1.5707962075856070685e0, -1.4210854715201599821e-14)},
+ {FN (arctan), ARG(8.3886080e+06,2.0e+00), RES(1.5707962075856070685e0, 2.8421709430401987951e-14)},
+ {FN (arctan), ARG(8.3886080e+06,-2.0e+00), RES(1.5707962075856070685e0, -2.8421709430401987951e-14)},
+ {FN (arctan), ARG(-8.3886080e+06,2.0e+00), RES(-1.5707962075856070685e0, 2.8421709430401987951e-14)},
+ {FN (arctan), ARG(-8.3886080e+06,-2.0e+00), RES(-1.5707962075856070685e0, -2.8421709430401987951e-14)},
+ {FN (arctan), ARG(8.3886080e+06,8.3886080e+06), RES(1.5707962671902518438e0, 5.9604644775390483828e-8)},
+ {FN (arctan), ARG(8.3886080e+06,-8.3886080e+06), RES(1.5707962671902518438e0, -5.9604644775390483828e-8)},
+ {FN (arctan), ARG(-8.3886080e+06,8.3886080e+06), RES(-1.5707962671902518438e0, 5.9604644775390483828e-8)},
+ {FN (arctan), ARG(-8.3886080e+06,-8.3886080e+06), RES(-1.5707962671902518438e0, -5.9604644775390483828e-8)},
+ {FN (sinh), ARG(0.0e+00,-3.45266983001243932001e-04), RES(0, -3.4526697614140534807e-4)},
+ {FN (sinh), ARG(0.0e+00,3.45266983001243932001e-04), RES(0, 3.4526697614140534807e-4)},
+ {FN (sinh), ARG(0.0e+00,1.57045105981189525579e+00), RES(0, 9.9999994039535581669e-1)},
+ {FN (sinh), ARG(0.0e+00,-1.57045105981189525579e+00), RES(0, -9.9999994039535581669e-1)},
+ {FN (sinh), ARG(0.0e+00,1.57114159377789786021e+00), RES(0, 9.9999994039535581673e-1)},
+ {FN (sinh), ARG(0.0e+00,-1.57114159377789786021e+00), RES(0, -9.9999994039535581673e-1)},
+ {FN (sinh), ARG(0.0e+00,3.14124738660679181379e+00), RES(0, 3.4526697614158608860e-4)},
+ {FN (sinh), ARG(0.0e+00,-3.14124738660679181379e+00), RES(0, -3.4526697614158608860e-4)},
+ {FN (sinh), ARG(0.0e+00,3.14193792057279441821e+00), RES(0, -3.4526697614134115926e-4)},
+ {FN (sinh), ARG(0.0e+00,-3.14193792057279441821e+00), RES(0, 3.4526697614134115926e-4)},
+ {FN (sinh), ARG(0.0e+00,4.71204371340168837179e+00), RES(0, -9.9999994039535581664e-1)},
+ {FN (sinh), ARG(0.0e+00,-4.71204371340168837179e+00), RES(0, 9.9999994039535581664e-1)},
+ {FN (sinh), ARG(0.0e+00,4.71273424736769097620e+00), RES(0, -9.9999994039535581677e-1)},
+ {FN (sinh), ARG(0.0e+00,-4.71273424736769097620e+00), RES(0, 9.9999994039535581677e-1)},
+ {FN (sinh), ARG(0.0e+00,6.28284004019658492979e+00), RES(0, -3.4526697614170855328e-4)},
+ {FN (sinh), ARG(0.0e+00,-6.28284004019658492979e+00), RES(0, 3.4526697614170855328e-4)},
+ {FN (sinh), ARG(0.0e+00,6.28353057416258753420e+00), RES(0, 3.4526697614121869459e-4)},
+ {FN (sinh), ARG(0.0e+00,-6.28353057416258753420e+00), RES(0, -3.4526697614121869459e-4)},
+ {FN (sinh), ARG(0.0e+00,9.42443269378637893396e+00), RES(0, 3.4526697614094283958e-4)},
+ {FN (sinh), ARG(0.0e+00,-9.42443269378637893396e+00), RES(0, -3.4526697614094283958e-4)},
+ {FN (sinh), ARG(0.0e+00,9.42512322775237976202e+00), RES(0, -3.4526697614020805155e-4)},
+ {FN (sinh), ARG(0.0e+00,-9.42512322775237976202e+00), RES(0, 3.4526697614020805155e-4)},
+ {FN (sinh), ARG(1.19209289550781250e-07,-3.45266983001243932001e-04), RES(1.1920928244535424533e-7, -3.4526697614140780134e-4)},
+ {FN (sinh), ARG(1.19209289550781250e-07,3.45266983001243932001e-04), RES(1.1920928244535424533e-7, 3.4526697614140780134e-4)},
+ {FN (sinh), ARG(-1.19209289550781250e-07,-3.45266983001243932001e-04), RES(-1.1920928244535424533e-7, -3.4526697614140780134e-4)},
+ {FN (sinh), ARG(-1.19209289550781250e-07,3.45266983001243932001e-04), RES(-1.1920928244535424533e-7, 3.4526697614140780134e-4)},
+ {FN (sinh), ARG(1.19209289550781250e-07,1.57045105981189525579e+00), RES(4.1159030931177815679e-11, 9.9999994039536292211e-1)},
+ {FN (sinh), ARG(1.19209289550781250e-07,-1.57045105981189525579e+00), RES(4.1159030931177815679e-11, -9.9999994039536292211e-1)},
+ {FN (sinh), ARG(-1.19209289550781250e-07,1.57045105981189525579e+00), RES(-4.1159030931177815679e-11, 9.9999994039536292211e-1)},
+ {FN (sinh), ARG(-1.19209289550781250e-07,-1.57045105981189525579e+00), RES(-4.1159030931177815679e-11, -9.9999994039536292211e-1)},
+ {FN (sinh), ARG(1.19209289550781250e-07,1.57114159377789786021e+00), RES(-4.1159030931163216752e-11, 9.9999994039536292216e-1)},
+ {FN (sinh), ARG(1.19209289550781250e-07,-1.57114159377789786021e+00), RES(-4.1159030931163216752e-11, -9.9999994039536292216e-1)},
+ {FN (sinh), ARG(-1.19209289550781250e-07,1.57114159377789786021e+00), RES(4.1159030931163216752e-11, 9.9999994039536292216e-1)},
+ {FN (sinh), ARG(-1.19209289550781250e-07,-1.57114159377789786021e+00), RES(4.1159030931163216752e-11, -9.9999994039536292216e-1)},
+ {FN (sinh), ARG(1.19209289550781250e-07,3.14124738660679181379e+00), RES(-1.1920928244535424532e-7, 3.4526697614158854187e-4)},
+ {FN (sinh), ARG(1.19209289550781250e-07,-3.14124738660679181379e+00), RES(-1.1920928244535424532e-7, -3.4526697614158854187e-4)},
+ {FN (sinh), ARG(-1.19209289550781250e-07,3.14124738660679181379e+00), RES(1.1920928244535424532e-7, 3.4526697614158854187e-4)},
+ {FN (sinh), ARG(-1.19209289550781250e-07,-3.14124738660679181379e+00), RES(1.1920928244535424532e-7, -3.4526697614158854187e-4)},
+ {FN (sinh), ARG(1.19209289550781250e-07,3.14193792057279441821e+00), RES(-1.1920928244535424533e-7, -3.4526697614134361253e-4)},
+ {FN (sinh), ARG(1.19209289550781250e-07,-3.14193792057279441821e+00), RES(-1.1920928244535424533e-7, 3.4526697614134361253e-4)},
+ {FN (sinh), ARG(-1.19209289550781250e-07,3.14193792057279441821e+00), RES(1.1920928244535424533e-7, -3.4526697614134361253e-4)},
+ {FN (sinh), ARG(-1.19209289550781250e-07,-3.14193792057279441821e+00), RES(1.1920928244535424533e-7, 3.4526697614134361253e-4)},
+ {FN (sinh), ARG(1.19209289550781250e-07,4.71204371340168837179e+00), RES(-4.1159030931192414605e-11, -9.9999994039536292207e-1)},
+ {FN (sinh), ARG(1.19209289550781250e-07,-4.71204371340168837179e+00), RES(-4.1159030931192414605e-11, 9.9999994039536292207e-1)},
+ {FN (sinh), ARG(-1.19209289550781250e-07,4.71204371340168837179e+00), RES(4.1159030931192414605e-11, -9.9999994039536292207e-1)},
+ {FN (sinh), ARG(-1.19209289550781250e-07,-4.71204371340168837179e+00), RES(4.1159030931192414605e-11, 9.9999994039536292207e-1)},
+ {FN (sinh), ARG(1.19209289550781250e-07,4.71273424736769097620e+00), RES(4.1159030931148617825e-11, -9.9999994039536292220e-1)},
+ {FN (sinh), ARG(1.19209289550781250e-07,-4.71273424736769097620e+00), RES(4.1159030931148617825e-11, 9.9999994039536292220e-1)},
+ {FN (sinh), ARG(-1.19209289550781250e-07,4.71273424736769097620e+00), RES(-4.1159030931148617825e-11, -9.9999994039536292220e-1)},
+ {FN (sinh), ARG(-1.19209289550781250e-07,-4.71273424736769097620e+00), RES(-4.1159030931148617825e-11, 9.9999994039536292220e-1)},
+ {FN (sinh), ARG(1.19209289550781250e-07,6.28284004019658492979e+00), RES(1.1920928244535424532e-7, -3.4526697614171100655e-4)},
+ {FN (sinh), ARG(1.19209289550781250e-07,-6.28284004019658492979e+00), RES(1.1920928244535424532e-7, 3.4526697614171100655e-4)},
+ {FN (sinh), ARG(-1.19209289550781250e-07,6.28284004019658492979e+00), RES(-1.1920928244535424532e-7, -3.4526697614171100655e-4)},
+ {FN (sinh), ARG(-1.19209289550781250e-07,-6.28284004019658492979e+00), RES(-1.1920928244535424532e-7, 3.4526697614171100655e-4)},
+ {FN (sinh), ARG(1.19209289550781250e-07,6.28353057416258753420e+00), RES(1.1920928244535424534e-7, 3.4526697614122114786e-4)},
+ {FN (sinh), ARG(1.19209289550781250e-07,-6.28353057416258753420e+00), RES(1.1920928244535424534e-7, -3.4526697614122114786e-4)},
+ {FN (sinh), ARG(-1.19209289550781250e-07,6.28353057416258753420e+00), RES(-1.1920928244535424534e-7, 3.4526697614122114786e-4)},
+ {FN (sinh), ARG(-1.19209289550781250e-07,-6.28353057416258753420e+00), RES(-1.1920928244535424534e-7, -3.4526697614122114786e-4)},
+ {FN (sinh), ARG(1.19209289550781250e-07,9.42443269378637893396e+00), RES(-1.1920928244535424535e-7, 3.4526697614094529285e-4)},
+ {FN (sinh), ARG(1.19209289550781250e-07,-9.42443269378637893396e+00), RES(-1.1920928244535424535e-7, -3.4526697614094529285e-4)},
+ {FN (sinh), ARG(-1.19209289550781250e-07,9.42443269378637893396e+00), RES(1.1920928244535424535e-7, 3.4526697614094529285e-4)},
+ {FN (sinh), ARG(-1.19209289550781250e-07,-9.42443269378637893396e+00), RES(1.1920928244535424535e-7, -3.4526697614094529285e-4)},
+ {FN (sinh), ARG(1.19209289550781250e-07,9.42512322775237976202e+00), RES(-1.1920928244535424538e-7, -3.4526697614021050482e-4)},
+ {FN (sinh), ARG(1.19209289550781250e-07,-9.42512322775237976202e+00), RES(-1.1920928244535424538e-7, 3.4526697614021050482e-4)},
+ {FN (sinh), ARG(-1.19209289550781250e-07,9.42512322775237976202e+00), RES(1.1920928244535424538e-7, -3.4526697614021050482e-4)},
+ {FN (sinh), ARG(-1.19209289550781250e-07,-9.42512322775237976202e+00), RES(1.1920928244535424538e-7, 3.4526697614021050482e-4)},
+ {FN (sinh), ARG(5.0e-01,-3.45266983001243932001e-04), RES(5.2109527443404709209e-1, -3.8933200722534065172e-4)},
+ {FN (sinh), ARG(5.0e-01,3.45266983001243932001e-04), RES(5.2109527443404709209e-1, 3.8933200722534065172e-4)},
+ {FN (sinh), ARG(-5.0e-01,-3.45266983001243932001e-04), RES(-5.2109527443404709209e-1, -3.8933200722534065172e-4)},
+ {FN (sinh), ARG(-5.0e-01,3.45266983001243932001e-04), RES(-5.2109527443404709209e-1, 3.8933200722534065172e-4)},
+ {FN (sinh), ARG(5.0e-01,1.57045105981189525579e+00), RES(1.7991700040937027667e-4, 1.1276258979946363572e0)},
+ {FN (sinh), ARG(5.0e-01,-1.57045105981189525579e+00), RES(1.7991700040937027667e-4, -1.1276258979946363572e0)},
+ {FN (sinh), ARG(-5.0e-01,1.57045105981189525579e+00), RES(-1.7991700040937027667e-4, 1.1276258979946363572e0)},
+ {FN (sinh), ARG(-5.0e-01,-1.57045105981189525579e+00), RES(-1.7991700040937027667e-4, -1.1276258979946363572e0)},
+ {FN (sinh), ARG(5.0e-01,1.57114159377789786021e+00), RES(-1.7991700040930646090e-4, 1.1276258979946363573e0)},
+ {FN (sinh), ARG(5.0e-01,-1.57114159377789786021e+00), RES(-1.7991700040930646090e-4, -1.1276258979946363573e0)},
+ {FN (sinh), ARG(-5.0e-01,1.57114159377789786021e+00), RES(1.7991700040930646090e-4, 1.1276258979946363573e0)},
+ {FN (sinh), ARG(-5.0e-01,-1.57114159377789786021e+00), RES(1.7991700040930646090e-4, -1.1276258979946363573e0)},
+ {FN (sinh), ARG(5.0e-01,3.14124738660679181379e+00), RES(-5.2109527443404709206e-1, 3.8933200722554445944e-4)},
+ {FN (sinh), ARG(5.0e-01,-3.14124738660679181379e+00), RES(-5.2109527443404709206e-1, -3.8933200722554445944e-4)},
+ {FN (sinh), ARG(-5.0e-01,3.14124738660679181379e+00), RES(5.2109527443404709206e-1, 3.8933200722554445944e-4)},
+ {FN (sinh), ARG(-5.0e-01,-3.14124738660679181379e+00), RES(5.2109527443404709206e-1, -3.8933200722554445944e-4)},
+ {FN (sinh), ARG(5.0e-01,3.14193792057279441821e+00), RES(-5.2109527443404709211e-1, -3.8933200722526827075e-4)},
+ {FN (sinh), ARG(5.0e-01,-3.14193792057279441821e+00), RES(-5.2109527443404709211e-1, 3.8933200722526827075e-4)},
+ {FN (sinh), ARG(-5.0e-01,3.14193792057279441821e+00), RES(5.2109527443404709211e-1, -3.8933200722526827075e-4)},
+ {FN (sinh), ARG(-5.0e-01,-3.14193792057279441821e+00), RES(5.2109527443404709211e-1, 3.8933200722526827075e-4)},
+ {FN (sinh), ARG(5.0e-01,4.71204371340168837179e+00), RES(-1.7991700040943409243e-4, -1.1276258979946363572e0)},
+ {FN (sinh), ARG(5.0e-01,-4.71204371340168837179e+00), RES(-1.7991700040943409243e-4, 1.1276258979946363572e0)},
+ {FN (sinh), ARG(-5.0e-01,4.71204371340168837179e+00), RES(1.7991700040943409243e-4, -1.1276258979946363572e0)},
+ {FN (sinh), ARG(-5.0e-01,-4.71204371340168837179e+00), RES(1.7991700040943409243e-4, 1.1276258979946363572e0)},
+ {FN (sinh), ARG(5.0e-01,4.71273424736769097620e+00), RES(1.7991700040924264514e-4, -1.1276258979946363573e0)},
+ {FN (sinh), ARG(5.0e-01,-4.71273424736769097620e+00), RES(1.7991700040924264514e-4, 1.1276258979946363573e0)},
+ {FN (sinh), ARG(-5.0e-01,4.71273424736769097620e+00), RES(-1.7991700040924264514e-4, -1.1276258979946363573e0)},
+ {FN (sinh), ARG(-5.0e-01,-4.71273424736769097620e+00), RES(-1.7991700040924264514e-4, 1.1276258979946363573e0)},
+ {FN (sinh), ARG(5.0e-01,6.28284004019658492979e+00), RES(5.2109527443404709204e-1, -3.8933200722568255379e-4)},
+ {FN (sinh), ARG(5.0e-01,-6.28284004019658492979e+00), RES(5.2109527443404709204e-1, 3.8933200722568255379e-4)},
+ {FN (sinh), ARG(-5.0e-01,6.28284004019658492979e+00), RES(-5.2109527443404709204e-1, -3.8933200722568255379e-4)},
+ {FN (sinh), ARG(-5.0e-01,-6.28284004019658492979e+00), RES(-5.2109527443404709204e-1, 3.8933200722568255379e-4)},
+ {FN (sinh), ARG(5.0e-01,6.28353057416258753420e+00), RES(5.2109527443404709213e-1, 3.8933200722513017641e-4)},
+ {FN (sinh), ARG(5.0e-01,-6.28353057416258753420e+00), RES(5.2109527443404709213e-1, -3.8933200722513017641e-4)},
+ {FN (sinh), ARG(-5.0e-01,6.28353057416258753420e+00), RES(-5.2109527443404709213e-1, 3.8933200722513017641e-4)},
+ {FN (sinh), ARG(-5.0e-01,-6.28353057416258753420e+00), RES(-5.2109527443404709213e-1, -3.8933200722513017641e-4)},
+ {FN (sinh), ARG(5.0e-01,9.42443269378637893396e+00), RES(-5.2109527443404709218e-1, 3.8933200722481911514e-4)},
+ {FN (sinh), ARG(5.0e-01,-9.42443269378637893396e+00), RES(-5.2109527443404709218e-1, -3.8933200722481911514e-4)},
+ {FN (sinh), ARG(-5.0e-01,9.42443269378637893396e+00), RES(5.2109527443404709218e-1, 3.8933200722481911514e-4)},
+ {FN (sinh), ARG(-5.0e-01,-9.42443269378637893396e+00), RES(5.2109527443404709218e-1, -3.8933200722481911514e-4)},
+ {FN (sinh), ARG(5.0e-01,9.42512322775237976202e+00), RES(-5.2109527443404709231e-1, -3.8933200722399054908e-4)},
+ {FN (sinh), ARG(5.0e-01,-9.42512322775237976202e+00), RES(-5.2109527443404709231e-1, 3.8933200722399054908e-4)},
+ {FN (sinh), ARG(-5.0e-01,9.42512322775237976202e+00), RES(5.2109527443404709231e-1, -3.8933200722399054908e-4)},
+ {FN (sinh), ARG(-5.0e-01,-9.42512322775237976202e+00), RES(5.2109527443404709231e-1, 3.8933200722399054908e-4)},
+ {FN (sinh), ARG(1.0e+00,-3.45266983001243932001e-04), RES(1.1752011235963524660e0, -5.3277478472501939236e-4)},
+ {FN (sinh), ARG(1.0e+00,3.45266983001243932001e-04), RES(1.1752011235963524660e0, 5.3277478472501939236e-4)},
+ {FN (sinh), ARG(-1.0e+00,-3.45266983001243932001e-04), RES(-1.1752011235963524660e0, -5.3277478472501939236e-4)},
+ {FN (sinh), ARG(-1.0e+00,3.45266983001243932001e-04), RES(-1.1752011235963524660e0, 5.3277478472501939236e-4)},
+ {FN (sinh), ARG(1.0e+00,1.57045105981189525579e+00), RES(4.0575816248730593018e-4, 1.5430805428404715942e0)},
+ {FN (sinh), ARG(1.0e+00,-1.57045105981189525579e+00), RES(4.0575816248730593018e-4, -1.5430805428404715942e0)},
+ {FN (sinh), ARG(-1.0e+00,1.57045105981189525579e+00), RES(-4.0575816248730593018e-4, 1.5430805428404715942e0)},
+ {FN (sinh), ARG(-1.0e+00,-1.57045105981189525579e+00), RES(-4.0575816248730593018e-4, -1.5430805428404715942e0)},
+ {FN (sinh), ARG(1.0e+00,1.57114159377789786021e+00), RES(-4.0575816248716200955e-4, 1.5430805428404715942e0)},
+ {FN (sinh), ARG(1.0e+00,-1.57114159377789786021e+00), RES(-4.0575816248716200955e-4, -1.5430805428404715942e0)},
+ {FN (sinh), ARG(-1.0e+00,1.57114159377789786021e+00), RES(4.0575816248716200955e-4, 1.5430805428404715942e0)},
+ {FN (sinh), ARG(-1.0e+00,-1.57114159377789786021e+00), RES(4.0575816248716200955e-4, -1.5430805428404715942e0)},
+ {FN (sinh), ARG(1.0e+00,3.14124738660679181379e+00), RES(-1.1752011235963524659e0, 5.3277478472529828958e-4)},
+ {FN (sinh), ARG(1.0e+00,-3.14124738660679181379e+00), RES(-1.1752011235963524659e0, -5.3277478472529828958e-4)},
+ {FN (sinh), ARG(-1.0e+00,3.14124738660679181379e+00), RES(1.1752011235963524659e0, 5.3277478472529828958e-4)},
+ {FN (sinh), ARG(-1.0e+00,-3.14124738660679181379e+00), RES(1.1752011235963524659e0, -5.3277478472529828958e-4)},
+ {FN (sinh), ARG(1.0e+00,3.14193792057279441821e+00), RES(-1.1752011235963524660e0, -5.3277478472492034385e-4)},
+ {FN (sinh), ARG(1.0e+00,-3.14193792057279441821e+00), RES(-1.1752011235963524660e0, 5.3277478472492034385e-4)},
+ {FN (sinh), ARG(-1.0e+00,3.14193792057279441821e+00), RES(1.1752011235963524660e0, -5.3277478472492034385e-4)},
+ {FN (sinh), ARG(-1.0e+00,-3.14193792057279441821e+00), RES(1.1752011235963524660e0, 5.3277478472492034385e-4)},
+ {FN (sinh), ARG(1.0e+00,4.71204371340168837179e+00), RES(-4.0575816248744985081e-4, -1.5430805428404715941e0)},
+ {FN (sinh), ARG(1.0e+00,-4.71204371340168837179e+00), RES(-4.0575816248744985081e-4, 1.5430805428404715941e0)},
+ {FN (sinh), ARG(-1.0e+00,4.71204371340168837179e+00), RES(4.0575816248744985081e-4, -1.5430805428404715941e0)},
+ {FN (sinh), ARG(-1.0e+00,-4.71204371340168837179e+00), RES(4.0575816248744985081e-4, 1.5430805428404715941e0)},
+ {FN (sinh), ARG(1.0e+00,4.71273424736769097620e+00), RES(4.0575816248701808892e-4, -1.5430805428404715943e0)},
+ {FN (sinh), ARG(1.0e+00,-4.71273424736769097620e+00), RES(4.0575816248701808892e-4, 1.5430805428404715943e0)},
+ {FN (sinh), ARG(-1.0e+00,4.71273424736769097620e+00), RES(-4.0575816248701808892e-4, -1.5430805428404715943e0)},
+ {FN (sinh), ARG(-1.0e+00,-4.71273424736769097620e+00), RES(-4.0575816248701808892e-4, 1.5430805428404715943e0)},
+ {FN (sinh), ARG(1.0e+00,6.28284004019658492979e+00), RES(1.1752011235963524659e0, -5.3277478472548726245e-4)},
+ {FN (sinh), ARG(1.0e+00,-6.28284004019658492979e+00), RES(1.1752011235963524659e0, 5.3277478472548726245e-4)},
+ {FN (sinh), ARG(-1.0e+00,6.28284004019658492979e+00), RES(-1.1752011235963524659e0, -5.3277478472548726245e-4)},
+ {FN (sinh), ARG(-1.0e+00,-6.28284004019658492979e+00), RES(-1.1752011235963524659e0, 5.3277478472548726245e-4)},
+ {FN (sinh), ARG(1.0e+00,6.28353057416258753420e+00), RES(1.1752011235963524661e0, 5.3277478472473137099e-4)},
+ {FN (sinh), ARG(1.0e+00,-6.28353057416258753420e+00), RES(1.1752011235963524661e0, -5.3277478472473137099e-4)},
+ {FN (sinh), ARG(-1.0e+00,6.28353057416258753420e+00), RES(-1.1752011235963524661e0, 5.3277478472473137099e-4)},
+ {FN (sinh), ARG(-1.0e+00,-6.28353057416258753420e+00), RES(-1.1752011235963524661e0, -5.3277478472473137099e-4)},
+ {FN (sinh), ARG(1.0e+00,9.42443269378637893396e+00), RES(-1.1752011235963524662e0, 5.3277478472430570447e-4)},
+ {FN (sinh), ARG(1.0e+00,-9.42443269378637893396e+00), RES(-1.1752011235963524662e0, -5.3277478472430570447e-4)},
+ {FN (sinh), ARG(-1.0e+00,9.42443269378637893396e+00), RES(1.1752011235963524662e0, 5.3277478472430570447e-4)},
+ {FN (sinh), ARG(-1.0e+00,-9.42443269378637893396e+00), RES(1.1752011235963524662e0, -5.3277478472430570447e-4)},
+ {FN (sinh), ARG(1.0e+00,9.42512322775237976202e+00), RES(-1.1752011235963524665e0, -5.3277478472317186729e-4)},
+ {FN (sinh), ARG(1.0e+00,-9.42512322775237976202e+00), RES(-1.1752011235963524665e0, 5.3277478472317186729e-4)},
+ {FN (sinh), ARG(-1.0e+00,9.42512322775237976202e+00), RES(1.1752011235963524665e0, -5.3277478472317186729e-4)},
+ {FN (sinh), ARG(-1.0e+00,-9.42512322775237976202e+00), RES(1.1752011235963524665e0, 5.3277478472317186729e-4)},
+ {FN (sinh), ARG(2.0e+00,-3.45266983001243932001e-04), RES(3.6268601916692946556e0, -1.2989619299126701883e-3)},
+ {FN (sinh), ARG(2.0e+00,3.45266983001243932001e-04), RES(3.6268601916692946556e0, 1.2989619299126701883e-3)},
+ {FN (sinh), ARG(-2.0e+00,-3.45266983001243932001e-04), RES(-3.6268601916692946556e0, -1.2989619299126701883e-3)},
+ {FN (sinh), ARG(-2.0e+00,3.45266983001243932001e-04), RES(-3.6268601916692946556e0, 1.2989619299126701883e-3)},
+ {FN (sinh), ARG(2.0e+00,1.57045105981189525579e+00), RES(1.2522351259047577385e-3, 3.7621954668392959445e0)},
+ {FN (sinh), ARG(2.0e+00,-1.57045105981189525579e+00), RES(1.2522351259047577385e-3, -3.7621954668392959445e0)},
+ {FN (sinh), ARG(-2.0e+00,1.57045105981189525579e+00), RES(-1.2522351259047577385e-3, 3.7621954668392959445e0)},
+ {FN (sinh), ARG(-2.0e+00,-1.57045105981189525579e+00), RES(-1.2522351259047577385e-3, -3.7621954668392959445e0)},
+ {FN (sinh), ARG(2.0e+00,1.57114159377789786021e+00), RES(-1.2522351259043135762e-3, 3.7621954668392959447e0)},
+ {FN (sinh), ARG(2.0e+00,-1.57114159377789786021e+00), RES(-1.2522351259043135762e-3, -3.7621954668392959447e0)},
+ {FN (sinh), ARG(-2.0e+00,1.57114159377789786021e+00), RES(1.2522351259043135762e-3, 3.7621954668392959447e0)},
+ {FN (sinh), ARG(-2.0e+00,-1.57114159377789786021e+00), RES(1.2522351259043135762e-3, -3.7621954668392959447e0)},
+ {FN (sinh), ARG(2.0e+00,3.14124738660679181379e+00), RES(-3.6268601916692946553e0, 1.2989619299133501696e-3)},
+ {FN (sinh), ARG(2.0e+00,-3.14124738660679181379e+00), RES(-3.6268601916692946553e0, -1.2989619299133501696e-3)},
+ {FN (sinh), ARG(-2.0e+00,3.14124738660679181379e+00), RES(3.6268601916692946553e0, 1.2989619299133501696e-3)},
+ {FN (sinh), ARG(-2.0e+00,-3.14124738660679181379e+00), RES(3.6268601916692946553e0, -1.2989619299133501696e-3)},
+ {FN (sinh), ARG(2.0e+00,3.14193792057279441821e+00), RES(-3.6268601916692946556e0, -1.2989619299124286975e-3)},
+ {FN (sinh), ARG(2.0e+00,-3.14193792057279441821e+00), RES(-3.6268601916692946556e0, 1.2989619299124286975e-3)},
+ {FN (sinh), ARG(-2.0e+00,3.14193792057279441821e+00), RES(3.6268601916692946556e0, -1.2989619299124286975e-3)},
+ {FN (sinh), ARG(-2.0e+00,-3.14193792057279441821e+00), RES(3.6268601916692946556e0, 1.2989619299124286975e-3)},
+ {FN (sinh), ARG(2.0e+00,4.71204371340168837179e+00), RES(-1.2522351259052019007e-3, -3.7621954668392959444e0)},
+ {FN (sinh), ARG(2.0e+00,-4.71204371340168837179e+00), RES(-1.2522351259052019007e-3, 3.7621954668392959444e0)},
+ {FN (sinh), ARG(-2.0e+00,4.71204371340168837179e+00), RES(1.2522351259052019007e-3, -3.7621954668392959444e0)},
+ {FN (sinh), ARG(-2.0e+00,-4.71204371340168837179e+00), RES(1.2522351259052019007e-3, 3.7621954668392959444e0)},
+ {FN (sinh), ARG(2.0e+00,4.71273424736769097620e+00), RES(1.2522351259038694139e-3, -3.7621954668392959448e0)},
+ {FN (sinh), ARG(2.0e+00,-4.71273424736769097620e+00), RES(1.2522351259038694139e-3, 3.7621954668392959448e0)},
+ {FN (sinh), ARG(-2.0e+00,4.71273424736769097620e+00), RES(-1.2522351259038694139e-3, -3.7621954668392959448e0)},
+ {FN (sinh), ARG(-2.0e+00,-4.71273424736769097620e+00), RES(-1.2522351259038694139e-3, 3.7621954668392959448e0)},
+ {FN (sinh), ARG(2.0e+00,6.28284004019658492979e+00), RES(3.6268601916692946552e0, -1.2989619299138109057e-3)},
+ {FN (sinh), ARG(2.0e+00,-6.28284004019658492979e+00), RES(3.6268601916692946552e0, 1.2989619299138109057e-3)},
+ {FN (sinh), ARG(-2.0e+00,6.28284004019658492979e+00), RES(-3.6268601916692946552e0, -1.2989619299138109057e-3)},
+ {FN (sinh), ARG(-2.0e+00,-6.28284004019658492979e+00), RES(-3.6268601916692946552e0, 1.2989619299138109057e-3)},
+ {FN (sinh), ARG(2.0e+00,6.28353057416258753420e+00), RES(3.6268601916692946558e0, 1.2989619299119679614e-3)},
+ {FN (sinh), ARG(2.0e+00,-6.28353057416258753420e+00), RES(3.6268601916692946558e0, -1.2989619299119679614e-3)},
+ {FN (sinh), ARG(-2.0e+00,6.28353057416258753420e+00), RES(-3.6268601916692946558e0, 1.2989619299119679614e-3)},
+ {FN (sinh), ARG(-2.0e+00,-6.28353057416258753420e+00), RES(-3.6268601916692946558e0, -1.2989619299119679614e-3)},
+ {FN (sinh), ARG(2.0e+00,9.42443269378637893396e+00), RES(-3.6268601916692946561e0, 1.2989619299109301409e-3)},
+ {FN (sinh), ARG(2.0e+00,-9.42443269378637893396e+00), RES(-3.6268601916692946561e0, -1.2989619299109301409e-3)},
+ {FN (sinh), ARG(-2.0e+00,9.42443269378637893396e+00), RES(3.6268601916692946561e0, 1.2989619299109301409e-3)},
+ {FN (sinh), ARG(-2.0e+00,-9.42443269378637893396e+00), RES(3.6268601916692946561e0, -1.2989619299109301409e-3)},
+ {FN (sinh), ARG(2.0e+00,9.42512322775237976202e+00), RES(-3.6268601916692946571e0, -1.2989619299081657245e-3)},
+ {FN (sinh), ARG(2.0e+00,-9.42512322775237976202e+00), RES(-3.6268601916692946571e0, 1.2989619299081657245e-3)},
+ {FN (sinh), ARG(-2.0e+00,9.42512322775237976202e+00), RES(3.6268601916692946571e0, -1.2989619299081657245e-3)},
+ {FN (sinh), ARG(-2.0e+00,-9.42512322775237976202e+00), RES(3.6268601916692946571e0, 1.2989619299081657245e-3)},
+ {FN (cosh), ARG(0.0e+00,-3.45266983001243932001e-04), RES(9.9999994039535581673e-1, 0.0)},
+ {FN (cosh), ARG(0.0e+00,3.45266983001243932001e-04), RES(9.9999994039535581673e-1, 0.0)},
+ {FN (cosh), ARG(0.0e+00,1.57045105981189525579e+00), RES(3.4526697614152485627e-4, 0.0)},
+ {FN (cosh), ARG(0.0e+00,-1.57045105981189525579e+00), RES(3.4526697614152485627e-4, 0.0)},
+ {FN (cosh), ARG(0.0e+00,1.57114159377789786021e+00), RES(-3.4526697614140239160e-4, 0.0)},
+ {FN (cosh), ARG(0.0e+00,-1.57114159377789786021e+00), RES(-3.4526697614140239160e-4, 0.0)},
+ {FN (cosh), ARG(0.0e+00,3.14124738660679181379e+00), RES(-9.9999994039535581667e-1, 0.0)},
+ {FN (cosh), ARG(0.0e+00,-3.14124738660679181379e+00), RES(-9.9999994039535581667e-1, 0.0)},
+ {FN (cosh), ARG(0.0e+00,3.14193792057279441821e+00), RES(-9.9999994039535581675e-1, 0.0)},
+ {FN (cosh), ARG(0.0e+00,-3.14193792057279441821e+00), RES(-9.9999994039535581675e-1, 0.0)},
+ {FN (cosh), ARG(0.0e+00,4.71204371340168837179e+00), RES(-3.4526697614164732094e-4, 0.0)},
+ {FN (cosh), ARG(0.0e+00,-4.71204371340168837179e+00), RES(-3.4526697614164732094e-4, 0.0)},
+ {FN (cosh), ARG(0.0e+00,4.71273424736769097620e+00), RES(3.4526697614127992692e-4, 0.0)},
+ {FN (cosh), ARG(0.0e+00,-4.71273424736769097620e+00), RES(3.4526697614127992692e-4, 0.0)},
+ {FN (cosh), ARG(0.0e+00,6.28284004019658492979e+00), RES(9.9999994039535581662e-1, 0.0)},
+ {FN (cosh), ARG(0.0e+00,-6.28284004019658492979e+00), RES(9.9999994039535581662e-1, 0.0)},
+ {FN (cosh), ARG(0.0e+00,6.28353057416258753420e+00), RES(9.9999994039535581679e-1, 0.0)},
+ {FN (cosh), ARG(0.0e+00,-6.28353057416258753420e+00), RES(9.9999994039535581679e-1, 0.0)},
+ {FN (cosh), ARG(0.0e+00,9.42443269378637893396e+00), RES(-9.9999994039535581689e-1, 0.0)},
+ {FN (cosh), ARG(0.0e+00,-9.42443269378637893396e+00), RES(-9.9999994039535581689e-1, 0.0)},
+ {FN (cosh), ARG(0.0e+00,9.42512322775237976202e+00), RES(-9.9999994039535581714e-1, 0.0)},
+ {FN (cosh), ARG(0.0e+00,-9.42512322775237976202e+00), RES(-9.9999994039535581714e-1, 0.0)},
+ {FN (cosh), ARG(1.19209289550781250e-07,-3.45266983001243932001e-04), RES(9.9999994039536292216e-1, -4.1159030931163569191e-11)},
+ {FN (cosh), ARG(1.19209289550781250e-07,3.45266983001243932001e-04), RES(9.9999994039536292216e-1, 4.1159030931163569191e-11)},
+ {FN (cosh), ARG(-1.19209289550781250e-07,-3.45266983001243932001e-04), RES(9.9999994039536292216e-1, 4.1159030931163569191e-11)},
+ {FN (cosh), ARG(-1.19209289550781250e-07,3.45266983001243932001e-04), RES(9.9999994039536292216e-1, -4.1159030931163569191e-11)},
+ {FN (cosh), ARG(1.19209289550781250e-07,1.57045105981189525579e+00), RES(3.4526697614152730954e-4, 1.1920928244535424532e-7)},
+ {FN (cosh), ARG(1.19209289550781250e-07,-1.57045105981189525579e+00), RES(3.4526697614152730954e-4, -1.1920928244535424532e-7)},
+ {FN (cosh), ARG(-1.19209289550781250e-07,1.57045105981189525579e+00), RES(3.4526697614152730954e-4, -1.1920928244535424532e-7)},
+ {FN (cosh), ARG(-1.19209289550781250e-07,-1.57045105981189525579e+00), RES(3.4526697614152730954e-4, 1.1920928244535424532e-7)},
+ {FN (cosh), ARG(1.19209289550781250e-07,1.57114159377789786021e+00), RES(-3.4526697614140484486e-4, 1.1920928244535424533e-7)},
+ {FN (cosh), ARG(1.19209289550781250e-07,-1.57114159377789786021e+00), RES(-3.4526697614140484486e-4, -1.1920928244535424533e-7)},
+ {FN (cosh), ARG(-1.19209289550781250e-07,1.57114159377789786021e+00), RES(-3.4526697614140484486e-4, -1.1920928244535424533e-7)},
+ {FN (cosh), ARG(-1.19209289550781250e-07,-1.57114159377789786021e+00), RES(-3.4526697614140484486e-4, 1.1920928244535424533e-7)},
+ {FN (cosh), ARG(1.19209289550781250e-07,3.14124738660679181379e+00), RES(-9.9999994039536292209e-1, 4.1159030931185115142e-11)},
+ {FN (cosh), ARG(1.19209289550781250e-07,-3.14124738660679181379e+00), RES(-9.9999994039536292209e-1, -4.1159030931185115142e-11)},
+ {FN (cosh), ARG(-1.19209289550781250e-07,3.14124738660679181379e+00), RES(-9.9999994039536292209e-1, -4.1159030931185115142e-11)},
+ {FN (cosh), ARG(-1.19209289550781250e-07,-3.14124738660679181379e+00), RES(-9.9999994039536292209e-1, 4.1159030931185115142e-11)},
+ {FN (cosh), ARG(1.19209289550781250e-07,3.14193792057279441821e+00), RES(-9.9999994039536292218e-1, -4.1159030931155917289e-11)},
+ {FN (cosh), ARG(1.19209289550781250e-07,-3.14193792057279441821e+00), RES(-9.9999994039536292218e-1, 4.1159030931155917289e-11)},
+ {FN (cosh), ARG(-1.19209289550781250e-07,3.14193792057279441821e+00), RES(-9.9999994039536292218e-1, 4.1159030931155917289e-11)},
+ {FN (cosh), ARG(-1.19209289550781250e-07,-3.14193792057279441821e+00), RES(-9.9999994039536292218e-1, -4.1159030931155917289e-11)},
+ {FN (cosh), ARG(1.19209289550781250e-07,4.71204371340168837179e+00), RES(-3.4526697614164977421e-4, -1.1920928244535424532e-7)},
+ {FN (cosh), ARG(1.19209289550781250e-07,-4.71204371340168837179e+00), RES(-3.4526697614164977421e-4, 1.1920928244535424532e-7)},
+ {FN (cosh), ARG(-1.19209289550781250e-07,4.71204371340168837179e+00), RES(-3.4526697614164977421e-4, 1.1920928244535424532e-7)},
+ {FN (cosh), ARG(-1.19209289550781250e-07,-4.71204371340168837179e+00), RES(-3.4526697614164977421e-4, -1.1920928244535424532e-7)},
+ {FN (cosh), ARG(1.19209289550781250e-07,4.71273424736769097620e+00), RES(3.4526697614128238019e-4, -1.1920928244535424533e-7)},
+ {FN (cosh), ARG(1.19209289550781250e-07,-4.71273424736769097620e+00), RES(3.4526697614128238019e-4, 1.1920928244535424533e-7)},
+ {FN (cosh), ARG(-1.19209289550781250e-07,4.71273424736769097620e+00), RES(3.4526697614128238019e-4, 1.1920928244535424533e-7)},
+ {FN (cosh), ARG(-1.19209289550781250e-07,-4.71273424736769097620e+00), RES(3.4526697614128238019e-4, -1.1920928244535424533e-7)},
+ {FN (cosh), ARG(1.19209289550781250e-07,6.28284004019658492979e+00), RES(9.9999994039536292205e-1, -4.1159030931199714069e-11)},
+ {FN (cosh), ARG(1.19209289550781250e-07,-6.28284004019658492979e+00), RES(9.9999994039536292205e-1, 4.1159030931199714069e-11)},
+ {FN (cosh), ARG(-1.19209289550781250e-07,6.28284004019658492979e+00), RES(9.9999994039536292205e-1, 4.1159030931199714069e-11)},
+ {FN (cosh), ARG(-1.19209289550781250e-07,-6.28284004019658492979e+00), RES(9.9999994039536292205e-1, -4.1159030931199714069e-11)},
+ {FN (cosh), ARG(1.19209289550781250e-07,6.28353057416258753420e+00), RES(9.9999994039536292222e-1, 4.1159030931141318362e-11)},
+ {FN (cosh), ARG(1.19209289550781250e-07,-6.28353057416258753420e+00), RES(9.9999994039536292222e-1, -4.1159030931141318362e-11)},
+ {FN (cosh), ARG(-1.19209289550781250e-07,6.28353057416258753420e+00), RES(9.9999994039536292222e-1, -4.1159030931141318362e-11)},
+ {FN (cosh), ARG(-1.19209289550781250e-07,-6.28353057416258753420e+00), RES(9.9999994039536292222e-1, 4.1159030931141318362e-11)},
+ {FN (cosh), ARG(1.19209289550781250e-07,9.42443269378637893396e+00), RES(-9.9999994039536292231e-1, 4.1159030931108433883e-11)},
+ {FN (cosh), ARG(1.19209289550781250e-07,-9.42443269378637893396e+00), RES(-9.9999994039536292231e-1, -4.1159030931108433883e-11)},
+ {FN (cosh), ARG(-1.19209289550781250e-07,9.42443269378637893396e+00), RES(-9.9999994039536292231e-1, -4.1159030931108433883e-11)},
+ {FN (cosh), ARG(-1.19209289550781250e-07,-9.42443269378637893396e+00), RES(-9.9999994039536292231e-1, 4.1159030931108433883e-11)},
+ {FN (cosh), ARG(1.19209289550781250e-07,9.42512322775237976202e+00), RES(-9.9999994039536292257e-1, -4.1159030931020840323e-11)},
+ {FN (cosh), ARG(1.19209289550781250e-07,-9.42512322775237976202e+00), RES(-9.9999994039536292257e-1, 4.1159030931020840323e-11)},
+ {FN (cosh), ARG(-1.19209289550781250e-07,9.42512322775237976202e+00), RES(-9.9999994039536292257e-1, 4.1159030931020840323e-11)},
+ {FN (cosh), ARG(-1.19209289550781250e-07,-9.42512322775237976202e+00), RES(-9.9999994039536292257e-1, -4.1159030931020840323e-11)},
+ {FN (cosh), ARG(5.0e-01,-3.45266983001243932001e-04), RES(1.1276258979946363573e0, -1.7991700040930800151e-4)},
+ {FN (cosh), ARG(5.0e-01,3.45266983001243932001e-04), RES(1.1276258979946363573e0, 1.7991700040930800151e-4)},
+ {FN (cosh), ARG(-5.0e-01,-3.45266983001243932001e-04), RES(1.1276258979946363573e0, 1.7991700040930800151e-4)},
+ {FN (cosh), ARG(-5.0e-01,3.45266983001243932001e-04), RES(1.1276258979946363573e0, -1.7991700040930800151e-4)},
+ {FN (cosh), ARG(5.0e-01,1.57045105981189525579e+00), RES(3.8933200722547541227e-4, 5.2109527443404709207e-1)},
+ {FN (cosh), ARG(5.0e-01,-1.57045105981189525579e+00), RES(3.8933200722547541227e-4, -5.2109527443404709207e-1)},
+ {FN (cosh), ARG(-5.0e-01,1.57045105981189525579e+00), RES(3.8933200722547541227e-4, -5.2109527443404709207e-1)},
+ {FN (cosh), ARG(-5.0e-01,-1.57045105981189525579e+00), RES(3.8933200722547541227e-4, 5.2109527443404709207e-1)},
+ {FN (cosh), ARG(5.0e-01,1.57114159377789786021e+00), RES(-3.8933200722533731792e-4, 5.2109527443404709209e-1)},
+ {FN (cosh), ARG(5.0e-01,-1.57114159377789786021e+00), RES(-3.8933200722533731792e-4, -5.2109527443404709209e-1)},
+ {FN (cosh), ARG(-5.0e-01,1.57114159377789786021e+00), RES(-3.8933200722533731792e-4, -5.2109527443404709209e-1)},
+ {FN (cosh), ARG(-5.0e-01,-1.57114159377789786021e+00), RES(-3.8933200722533731792e-4, 5.2109527443404709209e-1)},
+ {FN (cosh), ARG(5.0e-01,3.14124738660679181379e+00), RES(-1.1276258979946363572e0, 1.7991700040940218455e-4)},
+ {FN (cosh), ARG(5.0e-01,-3.14124738660679181379e+00), RES(-1.1276258979946363572e0, -1.7991700040940218455e-4)},
+ {FN (cosh), ARG(-5.0e-01,3.14124738660679181379e+00), RES(-1.1276258979946363572e0, -1.7991700040940218455e-4)},
+ {FN (cosh), ARG(-5.0e-01,-3.14124738660679181379e+00), RES(-1.1276258979946363572e0, 1.7991700040940218455e-4)},
+ {FN (cosh), ARG(5.0e-01,3.14193792057279441821e+00), RES(-1.1276258979946363573e0, -1.7991700040927455302e-4)},
+ {FN (cosh), ARG(5.0e-01,-3.14193792057279441821e+00), RES(-1.1276258979946363573e0, 1.7991700040927455302e-4)},
+ {FN (cosh), ARG(-5.0e-01,3.14193792057279441821e+00), RES(-1.1276258979946363573e0, 1.7991700040927455302e-4)},
+ {FN (cosh), ARG(-5.0e-01,-3.14193792057279441821e+00), RES(-1.1276258979946363573e0, -1.7991700040927455302e-4)},
+ {FN (cosh), ARG(5.0e-01,4.71204371340168837179e+00), RES(-3.8933200722561350661e-4, -5.2109527443404709205e-1)},
+ {FN (cosh), ARG(5.0e-01,-4.71204371340168837179e+00), RES(-3.8933200722561350661e-4, 5.2109527443404709205e-1)},
+ {FN (cosh), ARG(-5.0e-01,4.71204371340168837179e+00), RES(-3.8933200722561350661e-4, 5.2109527443404709205e-1)},
+ {FN (cosh), ARG(-5.0e-01,-4.71204371340168837179e+00), RES(-3.8933200722561350661e-4, -5.2109527443404709205e-1)},
+ {FN (cosh), ARG(5.0e-01,4.71273424736769097620e+00), RES(3.8933200722519922358e-4, -5.2109527443404709212e-1)},
+ {FN (cosh), ARG(5.0e-01,-4.71273424736769097620e+00), RES(3.8933200722519922358e-4, 5.2109527443404709212e-1)},
+ {FN (cosh), ARG(-5.0e-01,4.71273424736769097620e+00), RES(3.8933200722519922358e-4, 5.2109527443404709212e-1)},
+ {FN (cosh), ARG(-5.0e-01,-4.71273424736769097620e+00), RES(3.8933200722519922358e-4, -5.2109527443404709212e-1)},
+ {FN (cosh), ARG(5.0e-01,6.28284004019658492979e+00), RES(1.1276258979946363572e0, -1.7991700040946600032e-4)},
+ {FN (cosh), ARG(5.0e-01,-6.28284004019658492979e+00), RES(1.1276258979946363572e0, 1.7991700040946600032e-4)},
+ {FN (cosh), ARG(-5.0e-01,6.28284004019658492979e+00), RES(1.1276258979946363572e0, 1.7991700040946600032e-4)},
+ {FN (cosh), ARG(-5.0e-01,-6.28284004019658492979e+00), RES(1.1276258979946363572e0, -1.7991700040946600032e-4)},
+ {FN (cosh), ARG(5.0e-01,6.28353057416258753420e+00), RES(1.1276258979946363574e0, 1.7991700040921073725e-4)},
+ {FN (cosh), ARG(5.0e-01,-6.28353057416258753420e+00), RES(1.1276258979946363574e0, -1.7991700040921073725e-4)},
+ {FN (cosh), ARG(-5.0e-01,6.28353057416258753420e+00), RES(1.1276258979946363574e0, -1.7991700040921073725e-4)},
+ {FN (cosh), ARG(-5.0e-01,-6.28353057416258753420e+00), RES(1.1276258979946363574e0, 1.7991700040921073725e-4)},
+ {FN (cosh), ARG(5.0e-01,9.42443269378637893396e+00), RES(-1.1276258979946363575e0, 1.7991700040906699050e-4)},
+ {FN (cosh), ARG(5.0e-01,-9.42443269378637893396e+00), RES(-1.1276258979946363575e0, -1.7991700040906699050e-4)},
+ {FN (cosh), ARG(-5.0e-01,9.42443269378637893396e+00), RES(-1.1276258979946363575e0, -1.7991700040906699050e-4)},
+ {FN (cosh), ARG(-5.0e-01,-9.42443269378637893396e+00), RES(-1.1276258979946363575e0, 1.7991700040906699050e-4)},
+ {FN (cosh), ARG(5.0e-01,9.42512322775237976202e+00), RES(-1.1276258979946363577e0, -1.7991700040868409591e-4)},
+ {FN (cosh), ARG(5.0e-01,-9.42512322775237976202e+00), RES(-1.1276258979946363577e0, 1.7991700040868409591e-4)},
+ {FN (cosh), ARG(-5.0e-01,9.42512322775237976202e+00), RES(-1.1276258979946363577e0, 1.7991700040868409591e-4)},
+ {FN (cosh), ARG(-5.0e-01,-9.42512322775237976202e+00), RES(-1.1276258979946363577e0, -1.7991700040868409591e-4)},
+ {FN (cosh), ARG(1.0e+00,-3.45266983001243932001e-04), RES(1.5430805428404715942e0, -4.057581624871654840e-4)},
+ {FN (cosh), ARG(1.0e+00,3.45266983001243932001e-04), RES(1.5430805428404715942e0, 4.057581624871654840e-4)},
+ {FN (cosh), ARG(-1.0e+00,-3.45266983001243932001e-04), RES(1.5430805428404715942e0, 4.057581624871654840e-4)},
+ {FN (cosh), ARG(-1.0e+00,3.45266983001243932001e-04), RES(1.5430805428404715942e0, -4.057581624871654840e-4)},
+ {FN (cosh), ARG(1.0e+00,1.57045105981189525579e+00), RES(5.3277478472520380315e-4, 1.1752011235963524659e0)},
+ {FN (cosh), ARG(1.0e+00,-1.57045105981189525579e+00), RES(5.3277478472520380315e-4, -1.1752011235963524659e0)},
+ {FN (cosh), ARG(-1.0e+00,1.57045105981189525579e+00), RES(5.3277478472520380315e-4, -1.1752011235963524659e0)},
+ {FN (cosh), ARG(-1.0e+00,-1.57045105981189525579e+00), RES(5.3277478472520380315e-4, 1.1752011235963524659e0)},
+ {FN (cosh), ARG(1.0e+00,1.57114159377789786021e+00), RES(-5.3277478472501483029e-4, 1.1752011235963524660e0)},
+ {FN (cosh), ARG(1.0e+00,-1.57114159377789786021e+00), RES(-5.3277478472501483029e-4, -1.1752011235963524660e0)},
+ {FN (cosh), ARG(-1.0e+00,1.57114159377789786021e+00), RES(-5.3277478472501483029e-4, -1.1752011235963524660e0)},
+ {FN (cosh), ARG(-1.0e+00,-1.57114159377789786021e+00), RES(-5.3277478472501483029e-4, 1.1752011235963524660e0)},
+ {FN (cosh), ARG(1.0e+00,3.14124738660679181379e+00), RES(-1.5430805428404715941e0, 4.0575816248737789049e-4)},
+ {FN (cosh), ARG(1.0e+00,-3.14124738660679181379e+00), RES(-1.5430805428404715941e0, -4.0575816248737789049e-4)},
+ {FN (cosh), ARG(-1.0e+00,3.14124738660679181379e+00), RES(-1.5430805428404715941e0, -4.0575816248737789049e-4)},
+ {FN (cosh), ARG(-1.0e+00,-3.14124738660679181379e+00), RES(-1.5430805428404715941e0, 4.0575816248737789049e-4)},
+ {FN (cosh), ARG(1.0e+00,3.14193792057279441821e+00), RES(-1.5430805428404715943e0, -4.0575816248709004923e-4)},
+ {FN (cosh), ARG(1.0e+00,-3.14193792057279441821e+00), RES(-1.5430805428404715943e0, 4.0575816248709004923e-4)},
+ {FN (cosh), ARG(-1.0e+00,3.14193792057279441821e+00), RES(-1.5430805428404715943e0, 4.0575816248709004923e-4)},
+ {FN (cosh), ARG(-1.0e+00,-3.14193792057279441821e+00), RES(-1.5430805428404715943e0, -4.0575816248709004923e-4)},
+ {FN (cosh), ARG(1.0e+00,4.71204371340168837179e+00), RES(-5.3277478472539277601e-4, -1.1752011235963524659e0)},
+ {FN (cosh), ARG(1.0e+00,-4.71204371340168837179e+00), RES(-5.3277478472539277601e-4, 1.1752011235963524659e0)},
+ {FN (cosh), ARG(-1.0e+00,4.71204371340168837179e+00), RES(-5.3277478472539277601e-4, 1.1752011235963524659e0)},
+ {FN (cosh), ARG(-1.0e+00,-4.71204371340168837179e+00), RES(-5.3277478472539277601e-4, -1.1752011235963524659e0)},
+ {FN (cosh), ARG(1.0e+00,4.71273424736769097620e+00), RES(5.3277478472482585742e-4, -1.1752011235963524660e0)},
+ {FN (cosh), ARG(1.0e+00,-4.71273424736769097620e+00), RES(5.3277478472482585742e-4, 1.1752011235963524660e0)},
+ {FN (cosh), ARG(-1.0e+00,4.71273424736769097620e+00), RES(5.3277478472482585742e-4, 1.1752011235963524660e0)},
+ {FN (cosh), ARG(-1.0e+00,-4.71273424736769097620e+00), RES(5.3277478472482585742e-4, -1.1752011235963524660e0)},
+ {FN (cosh), ARG(1.0e+00,6.28284004019658492979e+00), RES(1.5430805428404715941e0, -4.0575816248752181112e-4)},
+ {FN (cosh), ARG(1.0e+00,-6.28284004019658492979e+00), RES(1.5430805428404715941e0, 4.0575816248752181112e-4)},
+ {FN (cosh), ARG(-1.0e+00,6.28284004019658492979e+00), RES(1.5430805428404715941e0, 4.0575816248752181112e-4)},
+ {FN (cosh), ARG(-1.0e+00,-6.28284004019658492979e+00), RES(1.5430805428404715941e0, -4.0575816248752181112e-4)},
+ {FN (cosh), ARG(1.0e+00,6.28353057416258753420e+00), RES(1.5430805428404715943e0, 4.0575816248694612861e-4)},
+ {FN (cosh), ARG(1.0e+00,-6.28353057416258753420e+00), RES(1.5430805428404715943e0, -4.0575816248694612861e-4)},
+ {FN (cosh), ARG(-1.0e+00,6.28353057416258753420e+00), RES(1.5430805428404715943e0, -4.0575816248694612861e-4)},
+ {FN (cosh), ARG(-1.0e+00,-6.28353057416258753420e+00), RES(1.5430805428404715943e0, 4.0575816248694612861e-4)},
+ {FN (cosh), ARG(1.0e+00,9.42443269378637893396e+00), RES(-1.5430805428404715945e0, 4.0575816248662194348e-4)},
+ {FN (cosh), ARG(1.0e+00,-9.42443269378637893396e+00), RES(-1.5430805428404715945e0, -4.0575816248662194348e-4)},
+ {FN (cosh), ARG(-1.0e+00,9.42443269378637893396e+00), RES(-1.5430805428404715945e0, -4.0575816248662194348e-4)},
+ {FN (cosh), ARG(-1.0e+00,-9.42443269378637893396e+00), RES(-1.5430805428404715945e0, 4.0575816248662194348e-4)},
+ {FN (cosh), ARG(1.0e+00,9.42512322775237976202e+00), RES(-1.5430805428404715949e0, -4.0575816248575841970e-4)},
+ {FN (cosh), ARG(1.0e+00,-9.42512322775237976202e+00), RES(-1.5430805428404715949e0, 4.0575816248575841970e-4)},
+ {FN (cosh), ARG(-1.0e+00,9.42512322775237976202e+00), RES(-1.5430805428404715949e0, 4.0575816248575841970e-4)},
+ {FN (cosh), ARG(-1.0e+00,-9.42512322775237976202e+00), RES(-1.5430805428404715949e0, -4.0575816248575841970e-4)},
+ {FN (cosh), ARG(2.0e+00,-3.45266983001243932001e-04), RES(3.7621954668392959447e0, -1.2522351259043242989e-3)},
+ {FN (cosh), ARG(2.0e+00,3.45266983001243932001e-04), RES(3.7621954668392959447e0, 1.2522351259043242989e-3)},
+ {FN (cosh), ARG(-2.0e+00,-3.45266983001243932001e-04), RES(3.7621954668392959447e0, 1.2522351259043242989e-3)},
+ {FN (cosh), ARG(-2.0e+00,3.45266983001243932001e-04), RES(3.7621954668392959447e0, -1.2522351259043242989e-3)},
+ {FN (cosh), ARG(2.0e+00,1.57045105981189525579e+00), RES(1.2989619299131198016e-3, 3.6268601916692946554e0)},
+ {FN (cosh), ARG(2.0e+00,-1.57045105981189525579e+00), RES(1.2989619299131198016e-3, -3.6268601916692946554e0)},
+ {FN (cosh), ARG(-2.0e+00,1.57045105981189525579e+00), RES(1.2989619299131198016e-3, -3.6268601916692946554e0)},
+ {FN (cosh), ARG(-2.0e+00,-1.57045105981189525579e+00), RES(1.2989619299131198016e-3, 3.6268601916692946554e0)},
+ {FN (cosh), ARG(2.0e+00,1.57114159377789786021e+00), RES(-1.2989619299126590655e-3, 3.6268601916692946556e0)},
+ {FN (cosh), ARG(2.0e+00,-1.57114159377789786021e+00), RES(-1.2989619299126590655e-3, -3.6268601916692946556e0)},
+ {FN (cosh), ARG(-2.0e+00,1.57114159377789786021e+00), RES(-1.2989619299126590655e-3, -3.6268601916692946556e0)},
+ {FN (cosh), ARG(-2.0e+00,-1.57114159377789786021e+00), RES(-1.2989619299126590655e-3, 3.6268601916692946556e0)},
+ {FN (cosh), ARG(2.0e+00,3.14124738660679181379e+00), RES(-3.7621954668392959444e0, 1.2522351259049798196e-3)},
+ {FN (cosh), ARG(2.0e+00,-3.14124738660679181379e+00), RES(-3.7621954668392959444e0, -1.2522351259049798196e-3)},
+ {FN (cosh), ARG(-2.0e+00,3.14124738660679181379e+00), RES(-3.7621954668392959444e0, -1.2522351259049798196e-3)},
+ {FN (cosh), ARG(-2.0e+00,-3.14124738660679181379e+00), RES(-3.7621954668392959444e0, 1.2522351259049798196e-3)},
+ {FN (cosh), ARG(2.0e+00,3.14193792057279441821e+00), RES(-3.7621954668392959448e0, -1.2522351259040914950e-3)},
+ {FN (cosh), ARG(2.0e+00,-3.14193792057279441821e+00), RES(-3.7621954668392959448e0, 1.2522351259040914950e-3)},
+ {FN (cosh), ARG(-2.0e+00,3.14193792057279441821e+00), RES(-3.7621954668392959448e0, 1.2522351259040914950e-3)},
+ {FN (cosh), ARG(-2.0e+00,-3.14193792057279441821e+00), RES(-3.7621954668392959448e0, -1.2522351259040914950e-3)},
+ {FN (cosh), ARG(2.0e+00,4.71204371340168837179e+00), RES(-1.2989619299135805376e-3, -3.6268601916692946552e0)},
+ {FN (cosh), ARG(2.0e+00,-4.71204371340168837179e+00), RES(-1.2989619299135805376e-3, 3.6268601916692946552e0)},
+ {FN (cosh), ARG(-2.0e+00,4.71204371340168837179e+00), RES(-1.2989619299135805376e-3, 3.6268601916692946552e0)},
+ {FN (cosh), ARG(-2.0e+00,-4.71204371340168837179e+00), RES(-1.2989619299135805376e-3, -3.6268601916692946552e0)},
+ {FN (cosh), ARG(2.0e+00,4.71273424736769097620e+00), RES(1.2989619299121983294e-3, -3.6268601916692946557e0)},
+ {FN (cosh), ARG(2.0e+00,-4.71273424736769097620e+00), RES(1.2989619299121983294e-3, 3.6268601916692946557e0)},
+ {FN (cosh), ARG(-2.0e+00,4.71273424736769097620e+00), RES(1.2989619299121983294e-3, 3.6268601916692946557e0)},
+ {FN (cosh), ARG(-2.0e+00,-4.71273424736769097620e+00), RES(1.2989619299121983294e-3, -3.6268601916692946557e0)},
+ {FN (cosh), ARG(2.0e+00,6.28284004019658492979e+00), RES(3.7621954668392959443e0, -1.2522351259054239819e-3)},
+ {FN (cosh), ARG(2.0e+00,-6.28284004019658492979e+00), RES(3.7621954668392959443e0, 1.2522351259054239819e-3)},
+ {FN (cosh), ARG(-2.0e+00,6.28284004019658492979e+00), RES(3.7621954668392959443e0, 1.2522351259054239819e-3)},
+ {FN (cosh), ARG(-2.0e+00,-6.28284004019658492979e+00), RES(3.7621954668392959443e0, -1.2522351259054239819e-3)},
+ {FN (cosh), ARG(2.0e+00,6.28353057416258753420e+00), RES(3.7621954668392959449e0, 1.2522351259036473328e-3)},
+ {FN (cosh), ARG(2.0e+00,-6.28353057416258753420e+00), RES(3.7621954668392959449e0, -1.2522351259036473328e-3)},
+ {FN (cosh), ARG(-2.0e+00,6.28353057416258753420e+00), RES(3.7621954668392959449e0, -1.2522351259036473328e-3)},
+ {FN (cosh), ARG(-2.0e+00,-6.28353057416258753420e+00), RES(3.7621954668392959449e0, 1.2522351259036473328e-3)},
+ {FN (cosh), ARG(2.0e+00,9.42443269378637893396e+00), RES(-3.7621954668392959453e0, 1.2522351259026468452e-3)},
+ {FN (cosh), ARG(2.0e+00,-9.42443269378637893396e+00), RES(-3.7621954668392959453e0, -1.2522351259026468452e-3)},
+ {FN (cosh), ARG(-2.0e+00,9.42443269378637893396e+00), RES(-3.7621954668392959453e0, -1.2522351259026468452e-3)},
+ {FN (cosh), ARG(-2.0e+00,-9.42443269378637893396e+00), RES(-3.7621954668392959453e0, 1.2522351259026468452e-3)},
+ {FN (cosh), ARG(2.0e+00,9.42512322775237976202e+00), RES(-3.7621954668392959462e0, -1.2522351258999818715e-3)},
+ {FN (cosh), ARG(2.0e+00,-9.42512322775237976202e+00), RES(-3.7621954668392959462e0, 1.2522351258999818715e-3)},
+ {FN (cosh), ARG(-2.0e+00,9.42512322775237976202e+00), RES(-3.7621954668392959462e0, 1.2522351258999818715e-3)},
+ {FN (cosh), ARG(-2.0e+00,-9.42512322775237976202e+00), RES(-3.7621954668392959462e0, -1.2522351258999818715e-3)},
+ {FN (tanh), ARG(0.0e+00,-3.45266983001243932001e-04), RES(0, -3.4526699672092183585e-4)},
+ {FN (tanh), ARG(0.0e+00,3.45266983001243932001e-04), RES(0, 3.4526699672092183585e-4)},
+ {FN (tanh), ARG(0.0e+00,1.57045105981189525579e+00), RES(0, 2.8963092606501007060e3)},
+ {FN (tanh), ARG(0.0e+00,-1.57045105981189525579e+00), RES(0, -2.8963092606501007060e3)},
+ {FN (tanh), ARG(0.0e+00,1.57114159377789786021e+00), RES(0, -2.8963092606511280143e3)},
+ {FN (tanh), ARG(0.0e+00,-1.57114159377789786021e+00), RES(0, 2.8963092606511280143e3)},
+ {FN (tanh), ARG(0.0e+00,3.14124738660679181379e+00), RES(0, -3.4526699672110257641e-4)},
+ {FN (tanh), ARG(0.0e+00,-3.14124738660679181379e+00), RES(0, 3.4526699672110257641e-4)},
+ {FN (tanh), ARG(0.0e+00,3.14193792057279441821e+00), RES(0, 3.4526699672085764703e-4)},
+ {FN (tanh), ARG(0.0e+00,-3.14193792057279441821e+00), RES(0, -3.4526699672085764703e-4)},
+ {FN (tanh), ARG(0.0e+00,4.71204371340168837179e+00), RES(0, 2.8963092606490733978e3)},
+ {FN (tanh), ARG(0.0e+00,-4.71204371340168837179e+00), RES(0, -2.8963092606490733978e3)},
+ {FN (tanh), ARG(0.0e+00,4.71273424736769097620e+00), RES(0, -2.8963092606521553225e3)},
+ {FN (tanh), ARG(0.0e+00,-4.71273424736769097620e+00), RES(0, 2.8963092606521553225e3)},
+ {FN (tanh), ARG(0.0e+00,6.28284004019658492979e+00), RES(0, -3.4526699672122504111e-4)},
+ {FN (tanh), ARG(0.0e+00,-6.28284004019658492979e+00), RES(0, 3.4526699672122504111e-4)},
+ {FN (tanh), ARG(0.0e+00,6.28353057416258753420e+00), RES(0, 3.4526699672073518233e-4)},
+ {FN (tanh), ARG(0.0e+00,-6.28353057416258753420e+00), RES(0, -3.4526699672073518233e-4)},
+ {FN (tanh), ARG(0.0e+00,9.42443269378637893396e+00), RES(0, -3.4526699672045932728e-4)},
+ {FN (tanh), ARG(0.0e+00,-9.42443269378637893396e+00), RES(0, 3.4526699672045932728e-4)},
+ {FN (tanh), ARG(0.0e+00,9.42512322775237976202e+00), RES(0, 3.4526699671972453911e-4)},
+ {FN (tanh), ARG(0.0e+00,-9.42512322775237976202e+00), RES(0, -3.4526699671972453911e-4)},
+ {FN (tanh), ARG(1.19209289550781250e-07,-3.45266983001243932001e-04), RES(1.1920930376163652989e-7, -3.4526699672091692931e-4)},
+ {FN (tanh), ARG(1.19209289550781250e-07,3.45266983001243932001e-04), RES(1.1920930376163652989e-7, 3.4526699672091692931e-4)},
+ {FN (tanh), ARG(-1.19209289550781250e-07,-3.45266983001243932001e-04), RES(-1.1920930376163652989e-7, -3.4526699672091692931e-4)},
+ {FN (tanh), ARG(-1.19209289550781250e-07,3.45266983001243932001e-04), RES(-1.1920930376163652989e-7, 3.4526699672091692931e-4)},
+ {FN (tanh), ARG(1.19209289550781250e-07,1.57045105981189525579e+00), RES(9.9999992052646305569e-1, 2.8963089153831588642e3)},
+ {FN (tanh), ARG(1.19209289550781250e-07,-1.57045105981189525579e+00), RES(9.9999992052646305569e-1, -2.8963089153831588642e3)},
+ {FN (tanh), ARG(-1.19209289550781250e-07,1.57045105981189525579e+00), RES(-9.9999992052646305569e-1, 2.8963089153831588642e3)},
+ {FN (tanh), ARG(-1.19209289550781250e-07,-1.57045105981189525579e+00), RES(-9.9999992052646305569e-1, -2.8963089153831588642e3)},
+ {FN (tanh), ARG(1.19209289550781250e-07,1.57114159377789786021e+00), RES(9.9999992052717244672e-1, -2.8963089153841861720e3)},
+ {FN (tanh), ARG(1.19209289550781250e-07,-1.57114159377789786021e+00), RES(9.9999992052717244672e-1, 2.8963089153841861720e3)},
+ {FN (tanh), ARG(-1.19209289550781250e-07,1.57114159377789786021e+00), RES(-9.9999992052717244672e-1, -2.8963089153841861720e3)},
+ {FN (tanh), ARG(-1.19209289550781250e-07,-1.57114159377789786021e+00), RES(-9.9999992052717244672e-1, 2.8963089153841861720e3)},
+ {FN (tanh), ARG(1.19209289550781250e-07,3.14124738660679181379e+00), RES(1.1920930376163652991e-7, -3.4526699672109766987e-4)},
+ {FN (tanh), ARG(1.19209289550781250e-07,-3.14124738660679181379e+00), RES(1.1920930376163652991e-7, 3.4526699672109766987e-4)},
+ {FN (tanh), ARG(-1.19209289550781250e-07,3.14124738660679181379e+00), RES(-1.1920930376163652991e-7, -3.4526699672109766987e-4)},
+ {FN (tanh), ARG(-1.19209289550781250e-07,-3.14124738660679181379e+00), RES(-1.1920930376163652991e-7, 3.4526699672109766987e-4)},
+ {FN (tanh), ARG(1.19209289550781250e-07,3.14193792057279441821e+00), RES(1.1920930376163652989e-7, 3.4526699672085274049e-4)},
+ {FN (tanh), ARG(1.19209289550781250e-07,-3.14193792057279441821e+00), RES(1.1920930376163652989e-7, -3.4526699672085274049e-4)},
+ {FN (tanh), ARG(-1.19209289550781250e-07,3.14193792057279441821e+00), RES(-1.1920930376163652989e-7, 3.4526699672085274049e-4)},
+ {FN (tanh), ARG(-1.19209289550781250e-07,-3.14193792057279441821e+00), RES(-1.1920930376163652989e-7, -3.4526699672085274049e-4)},
+ {FN (tanh), ARG(1.19209289550781250e-07,4.71204371340168837179e+00), RES(9.9999992052575366466e-1, 2.8963089153821315563e3)},
+ {FN (tanh), ARG(1.19209289550781250e-07,-4.71204371340168837179e+00), RES(9.9999992052575366466e-1, -2.8963089153821315563e3)},
+ {FN (tanh), ARG(-1.19209289550781250e-07,4.71204371340168837179e+00), RES(-9.9999992052575366466e-1, 2.8963089153821315563e3)},
+ {FN (tanh), ARG(-1.19209289550781250e-07,-4.71204371340168837179e+00), RES(-9.9999992052575366466e-1, -2.8963089153821315563e3)},
+ {FN (tanh), ARG(1.19209289550781250e-07,4.71273424736769097620e+00), RES(9.9999992052788183776e-1, -2.8963089153852134799e3)},
+ {FN (tanh), ARG(1.19209289550781250e-07,-4.71273424736769097620e+00), RES(9.9999992052788183776e-1, 2.8963089153852134799e3)},
+ {FN (tanh), ARG(-1.19209289550781250e-07,4.71273424736769097620e+00), RES(-9.9999992052788183776e-1, -2.8963089153852134799e3)},
+ {FN (tanh), ARG(-1.19209289550781250e-07,-4.71273424736769097620e+00), RES(-9.9999992052788183776e-1, 2.8963089153852134799e3)},
+ {FN (tanh), ARG(1.19209289550781250e-07,6.28284004019658492979e+00), RES(1.1920930376163652992e-7, -3.4526699672122013457e-4)},
+ {FN (tanh), ARG(1.19209289550781250e-07,-6.28284004019658492979e+00), RES(1.1920930376163652992e-7, 3.4526699672122013457e-4)},
+ {FN (tanh), ARG(-1.19209289550781250e-07,6.28284004019658492979e+00), RES(-1.1920930376163652992e-7, -3.4526699672122013457e-4)},
+ {FN (tanh), ARG(-1.19209289550781250e-07,-6.28284004019658492979e+00), RES(-1.1920930376163652992e-7, 3.4526699672122013457e-4)},
+ {FN (tanh), ARG(1.19209289550781250e-07,6.28353057416258753420e+00), RES(1.1920930376163652988e-7, 3.4526699672073027579e-4)},
+ {FN (tanh), ARG(1.19209289550781250e-07,-6.28353057416258753420e+00), RES(1.1920930376163652988e-7, -3.4526699672073027579e-4)},
+ {FN (tanh), ARG(-1.19209289550781250e-07,6.28353057416258753420e+00), RES(-1.1920930376163652988e-7, 3.4526699672073027579e-4)},
+ {FN (tanh), ARG(-1.19209289550781250e-07,-6.28353057416258753420e+00), RES(-1.1920930376163652988e-7, -3.4526699672073027579e-4)},
+ {FN (tanh), ARG(1.19209289550781250e-07,9.42443269378637893396e+00), RES(1.1920930376163652985e-7, -3.4526699672045442074e-4)},
+ {FN (tanh), ARG(1.19209289550781250e-07,-9.42443269378637893396e+00), RES(1.1920930376163652985e-7, 3.4526699672045442074e-4)},
+ {FN (tanh), ARG(-1.19209289550781250e-07,9.42443269378637893396e+00), RES(-1.1920930376163652985e-7, -3.4526699672045442074e-4)},
+ {FN (tanh), ARG(-1.19209289550781250e-07,-9.42443269378637893396e+00), RES(-1.1920930376163652985e-7, 3.4526699672045442074e-4)},
+ {FN (tanh), ARG(1.19209289550781250e-07,9.42512322775237976202e+00), RES(1.1920930376163652979e-7, 3.4526699671971963257e-4)},
+ {FN (tanh), ARG(1.19209289550781250e-07,-9.42512322775237976202e+00), RES(1.1920930376163652979e-7, -3.4526699671971963257e-4)},
+ {FN (tanh), ARG(-1.19209289550781250e-07,9.42512322775237976202e+00), RES(-1.1920930376163652979e-7, 3.4526699671971963257e-4)},
+ {FN (tanh), ARG(-1.19209289550781250e-07,-9.42512322775237976202e+00), RES(-1.1920930376163652979e-7, -3.4526699671971963257e-4)},
+ {FN (tanh), ARG(5.0e-01,-3.45266983001243932001e-04), RES(4.6211720058436229979e-1, -2.7153443992655805934e-4)},
+ {FN (tanh), ARG(5.0e-01,3.45266983001243932001e-04), RES(4.6211720058436229979e-1, 2.7153443992655805934e-4)},
+ {FN (tanh), ARG(-5.0e-01,-3.45266983001243932001e-04), RES(-4.6211720058436229979e-1, -2.7153443992655805934e-4)},
+ {FN (tanh), ARG(-5.0e-01,3.45266983001243932001e-04), RES(-4.6211720058436229979e-1, 2.7153443992655805934e-4)},
+ {FN (tanh), ARG(5.0e-01,1.57045105981189525579e+00), RES(2.1639524637389325996e0, 1.2715121175455623363e-3)},
+ {FN (tanh), ARG(5.0e-01,-1.57045105981189525579e+00), RES(2.1639524637389325996e0, -1.2715121175455623363e-3)},
+ {FN (tanh), ARG(-5.0e-01,1.57045105981189525579e+00), RES(-2.1639524637389325996e0, 1.2715121175455623363e-3)},
+ {FN (tanh), ARG(-5.0e-01,-1.57045105981189525579e+00), RES(-2.1639524637389325996e0, -1.2715121175455623363e-3)},
+ {FN (tanh), ARG(5.0e-01,1.57114159377789786021e+00), RES(2.1639524637389326002e0, -1.2715121175451113370e-3)},
+ {FN (tanh), ARG(5.0e-01,-1.57114159377789786021e+00), RES(2.1639524637389326002e0, 1.2715121175451113370e-3)},
+ {FN (tanh), ARG(-5.0e-01,1.57114159377789786021e+00), RES(-2.1639524637389326002e0, -1.2715121175451113370e-3)},
+ {FN (tanh), ARG(-5.0e-01,-1.57114159377789786021e+00), RES(-2.1639524637389326002e0, 1.2715121175451113370e-3)},
+ {FN (tanh), ARG(5.0e-01,3.14124738660679181379e+00), RES(4.6211720058436229984e-1, -2.7153443992670020234e-4)},
+ {FN (tanh), ARG(5.0e-01,-3.14124738660679181379e+00), RES(4.6211720058436229984e-1, 2.7153443992670020234e-4)},
+ {FN (tanh), ARG(-5.0e-01,3.14124738660679181379e+00), RES(-4.6211720058436229984e-1, -2.7153443992670020234e-4)},
+ {FN (tanh), ARG(-5.0e-01,-3.14124738660679181379e+00), RES(-4.6211720058436229984e-1, 2.7153443992670020234e-4)},
+ {FN (tanh), ARG(5.0e-01,3.14193792057279441821e+00), RES(4.6211720058436229978e-1, 2.7153443992650757820e-4)},
+ {FN (tanh), ARG(5.0e-01,-3.14193792057279441821e+00), RES(4.6211720058436229978e-1, -2.7153443992650757820e-4)},
+ {FN (tanh), ARG(-5.0e-01,3.14193792057279441821e+00), RES(-4.6211720058436229978e-1, 2.7153443992650757820e-4)},
+ {FN (tanh), ARG(-5.0e-01,-3.14193792057279441821e+00), RES(-4.6211720058436229978e-1, -2.7153443992650757820e-4)},
+ {FN (tanh), ARG(5.0e-01,4.71204371340168837179e+00), RES(2.1639524637389325989e0, 1.2715121175460133355e-3)},
+ {FN (tanh), ARG(5.0e-01,-4.71204371340168837179e+00), RES(2.1639524637389325989e0, -1.2715121175460133355e-3)},
+ {FN (tanh), ARG(-5.0e-01,4.71204371340168837179e+00), RES(-2.1639524637389325989e0, 1.2715121175460133355e-3)},
+ {FN (tanh), ARG(-5.0e-01,-4.71204371340168837179e+00), RES(-2.1639524637389325989e0, -1.2715121175460133355e-3)},
+ {FN (tanh), ARG(5.0e-01,4.71273424736769097620e+00), RES(2.1639524637389326009e0, -1.2715121175446603377e-3)},
+ {FN (tanh), ARG(5.0e-01,-4.71273424736769097620e+00), RES(2.1639524637389326009e0, 1.2715121175446603377e-3)},
+ {FN (tanh), ARG(-5.0e-01,4.71273424736769097620e+00), RES(-2.1639524637389326009e0, -1.2715121175446603377e-3)},
+ {FN (tanh), ARG(-5.0e-01,-4.71273424736769097620e+00), RES(-2.1639524637389326009e0, 1.2715121175446603377e-3)},
+ {FN (tanh), ARG(5.0e-01,6.28284004019658492979e+00), RES(4.6211720058436229987e-1, -2.7153443992679651442e-4)},
+ {FN (tanh), ARG(5.0e-01,-6.28284004019658492979e+00), RES(4.6211720058436229987e-1, 2.7153443992679651442e-4)},
+ {FN (tanh), ARG(-5.0e-01,6.28284004019658492979e+00), RES(-4.6211720058436229987e-1, -2.7153443992679651442e-4)},
+ {FN (tanh), ARG(-5.0e-01,-6.28284004019658492979e+00), RES(-4.6211720058436229987e-1, 2.7153443992679651442e-4)},
+ {FN (tanh), ARG(5.0e-01,6.28353057416258753420e+00), RES(4.6211720058436229974e-1, 2.7153443992641126612e-4)},
+ {FN (tanh), ARG(5.0e-01,-6.28353057416258753420e+00), RES(4.6211720058436229974e-1, -2.7153443992641126612e-4)},
+ {FN (tanh), ARG(-5.0e-01,6.28353057416258753420e+00), RES(-4.6211720058436229974e-1, 2.7153443992641126612e-4)},
+ {FN (tanh), ARG(-5.0e-01,-6.28353057416258753420e+00), RES(-4.6211720058436229974e-1, -2.7153443992641126612e-4)},
+ {FN (tanh), ARG(5.0e-01,9.42443269378637893396e+00), RES(4.6211720058436229968e-1, -2.7153443992619432056e-4)},
+ {FN (tanh), ARG(5.0e-01,-9.42443269378637893396e+00), RES(4.6211720058436229968e-1, 2.7153443992619432056e-4)},
+ {FN (tanh), ARG(-5.0e-01,9.42443269378637893396e+00), RES(-4.6211720058436229968e-1, -2.7153443992619432056e-4)},
+ {FN (tanh), ARG(-5.0e-01,-9.42443269378637893396e+00), RES(-4.6211720058436229968e-1, 2.7153443992619432056e-4)},
+ {FN (tanh), ARG(5.0e-01,9.42512322775237976202e+00), RES(4.6211720058436229949e-1, 2.7153443992561644811e-4)},
+ {FN (tanh), ARG(5.0e-01,-9.42512322775237976202e+00), RES(4.6211720058436229949e-1, -2.7153443992561644811e-4)},
+ {FN (tanh), ARG(-5.0e-01,9.42512322775237976202e+00), RES(-4.6211720058436229949e-1, 2.7153443992561644811e-4)},
+ {FN (tanh), ARG(-5.0e-01,-9.42512322775237976202e+00), RES(-4.6211720058436229949e-1, -2.7153443992561644811e-4)},
+ {FN (tanh), ARG(1.0e+00,-3.45266983001243932001e-04), RES(7.6159419408485704836e-1, -1.4500326960274960880e-4)},
+ {FN (tanh), ARG(1.0e+00,3.45266983001243932001e-04), RES(7.6159419408485704836e-1, 1.4500326960274960880e-4)},
+ {FN (tanh), ARG(-1.0e+00,-3.45266983001243932001e-04), RES(-7.6159419408485704836e-1, -1.4500326960274960880e-4)},
+ {FN (tanh), ARG(-1.0e+00,3.45266983001243932001e-04), RES(-7.6159419408485704836e-1, 1.4500326960274960880e-4)},
+ {FN (tanh), ARG(1.0e+00,1.57045105981189525579e+00), RES(1.3130351721648674823e0, 2.4999454374276273814e-4)},
+ {FN (tanh), ARG(1.0e+00,-1.57045105981189525579e+00), RES(1.3130351721648674823e0, -2.4999454374276273814e-4)},
+ {FN (tanh), ARG(-1.0e+00,1.57045105981189525579e+00), RES(-1.3130351721648674823e0, 2.4999454374276273814e-4)},
+ {FN (tanh), ARG(-1.0e+00,-1.57045105981189525579e+00), RES(-1.3130351721648674823e0, -2.4999454374276273814e-4)},
+ {FN (tanh), ARG(1.0e+00,1.57114159377789786021e+00), RES(1.3130351721648674824e0, -2.4999454374267406620e-4)},
+ {FN (tanh), ARG(1.0e+00,-1.57114159377789786021e+00), RES(1.3130351721648674824e0, 2.4999454374267406620e-4)},
+ {FN (tanh), ARG(-1.0e+00,1.57114159377789786021e+00), RES(-1.3130351721648674824e0, -2.4999454374267406620e-4)},
+ {FN (tanh), ARG(-1.0e+00,-1.57114159377789786021e+00), RES(-1.3130351721648674824e0, 2.4999454374267406620e-4)},
+ {FN (tanh), ARG(1.0e+00,3.14124738660679181379e+00), RES(7.6159419408485704840e-1, -1.4500326960282551519e-4)},
+ {FN (tanh), ARG(1.0e+00,-3.14124738660679181379e+00), RES(7.6159419408485704840e-1, 1.4500326960282551519e-4)},
+ {FN (tanh), ARG(-1.0e+00,3.14124738660679181379e+00), RES(-7.6159419408485704840e-1, -1.4500326960282551519e-4)},
+ {FN (tanh), ARG(-1.0e+00,-3.14124738660679181379e+00), RES(-7.6159419408485704840e-1, 1.4500326960282551519e-4)},
+ {FN (tanh), ARG(1.0e+00,3.14193792057279441821e+00), RES(7.6159419408485704835e-1, 1.4500326960272265115e-4)},
+ {FN (tanh), ARG(1.0e+00,-3.14193792057279441821e+00), RES(7.6159419408485704835e-1, -1.4500326960272265115e-4)},
+ {FN (tanh), ARG(-1.0e+00,3.14193792057279441821e+00), RES(-7.6159419408485704835e-1, 1.4500326960272265115e-4)},
+ {FN (tanh), ARG(-1.0e+00,-3.14193792057279441821e+00), RES(-7.6159419408485704835e-1, -1.4500326960272265115e-4)},
+ {FN (tanh), ARG(1.0e+00,4.71204371340168837179e+00), RES(1.3130351721648674822e0, 2.4999454374285141007e-4)},
+ {FN (tanh), ARG(1.0e+00,-4.71204371340168837179e+00), RES(1.3130351721648674822e0, -2.4999454374285141007e-4)},
+ {FN (tanh), ARG(-1.0e+00,4.71204371340168837179e+00), RES(-1.3130351721648674822e0, 2.4999454374285141007e-4)},
+ {FN (tanh), ARG(-1.0e+00,-4.71204371340168837179e+00), RES(-1.3130351721648674822e0, -2.4999454374285141007e-4)},
+ {FN (tanh), ARG(1.0e+00,4.71273424736769097620e+00), RES(1.3130351721648674825e0, -2.4999454374258539427e-4)},
+ {FN (tanh), ARG(1.0e+00,-4.71273424736769097620e+00), RES(1.3130351721648674825e0, 2.4999454374258539427e-4)},
+ {FN (tanh), ARG(-1.0e+00,4.71273424736769097620e+00), RES(-1.3130351721648674825e0, -2.4999454374258539427e-4)},
+ {FN (tanh), ARG(-1.0e+00,-4.71273424736769097620e+00), RES(-1.3130351721648674825e0, 2.4999454374258539427e-4)},
+ {FN (tanh), ARG(1.0e+00,6.28284004019658492979e+00), RES(7.6159419408485704843e-1, -1.4500326960287694721e-4)},
+ {FN (tanh), ARG(1.0e+00,-6.28284004019658492979e+00), RES(7.6159419408485704843e-1, 1.4500326960287694721e-4)},
+ {FN (tanh), ARG(-1.0e+00,6.28284004019658492979e+00), RES(-7.6159419408485704843e-1, -1.4500326960287694721e-4)},
+ {FN (tanh), ARG(-1.0e+00,-6.28284004019658492979e+00), RES(-7.6159419408485704843e-1, 1.4500326960287694721e-4)},
+ {FN (tanh), ARG(1.0e+00,6.28353057416258753420e+00), RES(7.6159419408485704832e-1, 1.4500326960267121913e-4)},
+ {FN (tanh), ARG(1.0e+00,-6.28353057416258753420e+00), RES(7.6159419408485704832e-1, -1.4500326960267121913e-4)},
+ {FN (tanh), ARG(-1.0e+00,6.28353057416258753420e+00), RES(-7.6159419408485704832e-1, 1.4500326960267121913e-4)},
+ {FN (tanh), ARG(-1.0e+00,-6.28353057416258753420e+00), RES(-7.6159419408485704832e-1, -1.4500326960267121913e-4)},
+ {FN (tanh), ARG(1.0e+00,9.42443269378637893396e+00), RES(7.6159419408485704826e-1, -1.4500326960255536711e-4)},
+ {FN (tanh), ARG(1.0e+00,-9.42443269378637893396e+00), RES(7.6159419408485704826e-1, 1.4500326960255536711e-4)},
+ {FN (tanh), ARG(-1.0e+00,9.42443269378637893396e+00), RES(-7.6159419408485704826e-1, -1.4500326960255536711e-4)},
+ {FN (tanh), ARG(-1.0e+00,-9.42443269378637893396e+00), RES(-7.6159419408485704826e-1, 1.4500326960255536711e-4)},
+ {FN (tanh), ARG(1.0e+00,9.42512322775237976202e+00), RES(7.6159419408485704810e-1, 1.450032696022467750e-4)},
+ {FN (tanh), ARG(1.0e+00,-9.42512322775237976202e+00), RES(7.6159419408485704810e-1, -1.450032696022467750e-4)},
+ {FN (tanh), ARG(-1.0e+00,9.42512322775237976202e+00), RES(-7.6159419408485704810e-1, 1.450032696022467750e-4)},
+ {FN (tanh), ARG(-1.0e+00,-9.42512322775237976202e+00), RES(-7.6159419408485704810e-1, -1.450032696022467750e-4)},
+ {FN (tanh), ARG(2.0e+00,-3.45266983001243932001e-04), RES(9.6402758819508310556e-1, -2.4393395410435306874e-5)},
+ {FN (tanh), ARG(2.0e+00,3.45266983001243932001e-04), RES(9.6402758819508310556e-1, 2.4393395410435306874e-5)},
+ {FN (tanh), ARG(-2.0e+00,-3.45266983001243932001e-04), RES(-9.6402758819508310556e-1, -2.4393395410435306874e-5)},
+ {FN (tanh), ARG(-2.0e+00,3.45266983001243932001e-04), RES(-9.6402758819508310556e-1, 2.4393395410435306874e-5)},
+ {FN (tanh), ARG(2.0e+00,1.57045105981189525579e+00), RES(1.0373147113268752620e0, 2.6247825506572821595e-5)},
+ {FN (tanh), ARG(2.0e+00,-1.57045105981189525579e+00), RES(1.0373147113268752620e0, -2.6247825506572821595e-5)},
+ {FN (tanh), ARG(-2.0e+00,1.57045105981189525579e+00), RES(-1.0373147113268752620e0, 2.6247825506572821595e-5)},
+ {FN (tanh), ARG(-2.0e+00,-1.57045105981189525579e+00), RES(-1.0373147113268752620e0, -2.6247825506572821595e-5)},
+ {FN (tanh), ARG(2.0e+00,1.57114159377789786021e+00), RES(1.0373147113268752620e0, -2.6247825506563511609e-5)},
+ {FN (tanh), ARG(2.0e+00,-1.57114159377789786021e+00), RES(1.0373147113268752620e0, 2.6247825506563511609e-5)},
+ {FN (tanh), ARG(-2.0e+00,1.57114159377789786021e+00), RES(-1.0373147113268752620e0, -2.6247825506563511609e-5)},
+ {FN (tanh), ARG(-2.0e+00,-1.57114159377789786021e+00), RES(-1.0373147113268752620e0, 2.6247825506563511609e-5)},
+ {FN (tanh), ARG(2.0e+00,3.14124738660679181379e+00), RES(9.6402758819508310557e-1, -2.4393395410448076340e-5)},
+ {FN (tanh), ARG(2.0e+00,-3.14124738660679181379e+00), RES(9.6402758819508310557e-1, 2.4393395410448076340e-5)},
+ {FN (tanh), ARG(-2.0e+00,3.14124738660679181379e+00), RES(-9.6402758819508310557e-1, -2.4393395410448076340e-5)},
+ {FN (tanh), ARG(-2.0e+00,-3.14124738660679181379e+00), RES(-9.6402758819508310557e-1, 2.4393395410448076340e-5)},
+ {FN (tanh), ARG(2.0e+00,3.14193792057279441821e+00), RES(9.6402758819508310556e-1, 2.4393395410430771882e-5)},
+ {FN (tanh), ARG(2.0e+00,-3.14193792057279441821e+00), RES(9.6402758819508310556e-1, -2.4393395410430771882e-5)},
+ {FN (tanh), ARG(-2.0e+00,3.14193792057279441821e+00), RES(-9.6402758819508310556e-1, 2.4393395410430771882e-5)},
+ {FN (tanh), ARG(-2.0e+00,-3.14193792057279441821e+00), RES(-9.6402758819508310556e-1, -2.4393395410430771882e-5)},
+ {FN (tanh), ARG(2.0e+00,4.71204371340168837179e+00), RES(1.0373147113268752620e0, 2.6247825506582131582e-5)},
+ {FN (tanh), ARG(2.0e+00,-4.71204371340168837179e+00), RES(1.0373147113268752620e0, -2.6247825506582131582e-5)},
+ {FN (tanh), ARG(-2.0e+00,4.71204371340168837179e+00), RES(-1.0373147113268752620e0, 2.6247825506582131582e-5)},
+ {FN (tanh), ARG(-2.0e+00,-4.71204371340168837179e+00), RES(-1.0373147113268752620e0, -2.6247825506582131582e-5)},
+ {FN (tanh), ARG(2.0e+00,4.71273424736769097620e+00), RES(1.0373147113268752620e0, -2.6247825506554201622e-5)},
+ {FN (tanh), ARG(2.0e+00,-4.71273424736769097620e+00), RES(1.0373147113268752620e0, 2.6247825506554201622e-5)},
+ {FN (tanh), ARG(-2.0e+00,4.71273424736769097620e+00), RES(-1.0373147113268752620e0, -2.6247825506554201622e-5)},
+ {FN (tanh), ARG(-2.0e+00,-4.71273424736769097620e+00), RES(-1.0373147113268752620e0, 2.6247825506554201622e-5)},
+ {FN (tanh), ARG(2.0e+00,6.28284004019658492979e+00), RES(9.6402758819508310558e-1, -2.4393395410456728569e-5)},
+ {FN (tanh), ARG(2.0e+00,-6.28284004019658492979e+00), RES(9.6402758819508310558e-1, 2.4393395410456728569e-5)},
+ {FN (tanh), ARG(-2.0e+00,6.28284004019658492979e+00), RES(-9.6402758819508310558e-1, -2.4393395410456728569e-5)},
+ {FN (tanh), ARG(-2.0e+00,-6.28284004019658492979e+00), RES(-9.6402758819508310558e-1, 2.4393395410456728569e-5)},
+ {FN (tanh), ARG(2.0e+00,6.28353057416258753420e+00), RES(9.6402758819508310555e-1, 2.4393395410422119654e-5)},
+ {FN (tanh), ARG(2.0e+00,-6.28353057416258753420e+00), RES(9.6402758819508310555e-1, -2.4393395410422119654e-5)},
+ {FN (tanh), ARG(-2.0e+00,6.28353057416258753420e+00), RES(-9.6402758819508310555e-1, 2.4393395410422119654e-5)},
+ {FN (tanh), ARG(-2.0e+00,-6.28353057416258753420e+00), RES(-9.6402758819508310555e-1, -2.4393395410422119654e-5)},
+ {FN (tanh), ARG(2.0e+00,9.42443269378637893396e+00), RES(9.6402758819508310554e-1, -2.4393395410402630273e-5)},
+ {FN (tanh), ARG(2.0e+00,-9.42443269378637893396e+00), RES(9.6402758819508310554e-1, 2.4393395410402630273e-5)},
+ {FN (tanh), ARG(-2.0e+00,9.42443269378637893396e+00), RES(-9.6402758819508310554e-1, -2.4393395410402630273e-5)},
+ {FN (tanh), ARG(-2.0e+00,-9.42443269378637893396e+00), RES(-9.6402758819508310554e-1, 2.4393395410402630273e-5)},
+ {FN (tanh), ARG(2.0e+00,9.42512322775237976202e+00), RES(9.6402758819508310550e-1, 2.439339541035071690e-5)},
+ {FN (tanh), ARG(2.0e+00,-9.42512322775237976202e+00), RES(9.6402758819508310550e-1, -2.439339541035071690e-5)},
+ {FN (tanh), ARG(-2.0e+00,9.42512322775237976202e+00), RES(-9.6402758819508310550e-1, 2.439339541035071690e-5)},
+ {FN (tanh), ARG(-2.0e+00,-9.42512322775237976202e+00), RES(-9.6402758819508310550e-1, -2.439339541035071690e-5)},
+ {FN (arcsinh), ARG(0.0e+00,0.0e+00), RES(0e0, 0.0)},
+ {FN (arcsinh), ARG(0.0e+00,1.19209289550781250e-07), RES(0, 1.1920928955078153234e-7)},
+ {FN (arcsinh), ARG(0.0e+00,-1.19209289550781250e-07), RES(0, -1.1920928955078153234e-7)},
+ {FN (arcsinh), ARG(0.0e+00,5.0e-01), RES(0, 5.2359877559829887308e-1)},
+ {FN (arcsinh), ARG(0.0e+00,-5.0e-01), RES(0, -5.2359877559829887308e-1)},
+ {FN (arcsinh), ARG(0.0e+00,1.0e+00), RES(0, 1.5707963267948966192e0)},
+ {FN (arcsinh), ARG(0.0e+00,-1.0e+00), RES(0, -1.5707963267948966192e0)},
+ {FN (arcsinh), ARG(0.0e+00,2.0e+00), RES(1.3169578969248167086e0, 1.5707963267948966192e0)},
+ {FN (arcsinh), ARG(0.0e+00,-2.0e+00), RES(-1.3169578969248167086e0, -1.5707963267948966192e0)},
+ {FN (arcsinh), ARG(0.0e+00,8.3886080e+06), RES(1.6635532333438683873e1, 1.5707963267948966192e0)},
+ {FN (arcsinh), ARG(0.0e+00,-8.3886080e+06), RES(-1.6635532333438683873e1, -1.5707963267948966192e0)},
+ {FN (arcsinh), ARG(1.19209289550781250e-07,0.0e+00), RES(1.1920928955078096766e-7, 0.0)},
+ {FN (arcsinh), ARG(-1.19209289550781250e-07,0.0e+00), RES(-1.1920928955078096766e-7, 0.0)},
+ {FN (arcsinh), ARG(1.19209289550781250e-07,1.19209289550781250e-07), RES(1.1920928955078181469e-7, 1.1920928955078068531e-7)},
+ {FN (arcsinh), ARG(1.19209289550781250e-07,-1.19209289550781250e-07), RES(1.1920928955078181469e-7, -1.1920928955078068531e-7)},
+ {FN (arcsinh), ARG(-1.19209289550781250e-07,1.19209289550781250e-07), RES(-1.1920928955078181469e-7, 1.1920928955078068531e-7)},
+ {FN (arcsinh), ARG(-1.19209289550781250e-07,-1.19209289550781250e-07), RES(-1.1920928955078181469e-7, -1.1920928955078068531e-7)},
+ {FN (arcsinh), ARG(1.19209289550781250e-07,5.0e-01), RES(1.3765103082409432364e-7, 5.2359877559829340332e-1)},
+ {FN (arcsinh), ARG(1.19209289550781250e-07,-5.0e-01), RES(1.3765103082409432364e-7, -5.2359877559829340332e-1)},
+ {FN (arcsinh), ARG(-1.19209289550781250e-07,5.0e-01), RES(-1.3765103082409432364e-7, 5.2359877559829340332e-1)},
+ {FN (arcsinh), ARG(-1.19209289550781250e-07,-5.0e-01), RES(-1.3765103082409432364e-7, -5.2359877559829340332e-1)},
+ {FN (arcsinh), ARG(1.19209289550781250e-07,1.0e+00), RES(3.4526698643116312881e-4, 1.5704510598153252947e0)},
+ {FN (arcsinh), ARG(1.19209289550781250e-07,-1.0e+00), RES(3.4526698643116312881e-4, -1.5704510598153252947e0)},
+ {FN (arcsinh), ARG(-1.19209289550781250e-07,1.0e+00), RES(-3.4526698643116312881e-4, 1.5704510598153252947e0)},
+ {FN (arcsinh), ARG(-1.19209289550781250e-07,-1.0e+00), RES(-3.4526698643116312881e-4, -1.5704510598153252947e0)},
+ {FN (arcsinh), ARG(1.19209289550781250e-07,2.0e+00), RES(1.3169578969248194435e0, 1.5707962579693812072e0)},
+ {FN (arcsinh), ARG(1.19209289550781250e-07,-2.0e+00), RES(1.3169578969248194435e0, -1.5707962579693812072e0)},
+ {FN (arcsinh), ARG(-1.19209289550781250e-07,2.0e+00), RES(-1.3169578969248194435e0, 1.5707962579693812072e0)},
+ {FN (arcsinh), ARG(-1.19209289550781250e-07,-2.0e+00), RES(-1.3169578969248194435e0, -1.5707962579693812072e0)},
+ {FN (arcsinh), ARG(1.19209289550781250e-07,8.3886080e+06), RES(1.6635532333438683873e1, 1.5707963267948824084e0)},
+ {FN (arcsinh), ARG(1.19209289550781250e-07,-8.3886080e+06), RES(1.6635532333438683873e1, -1.5707963267948824084e0)},
+ {FN (arcsinh), ARG(-1.19209289550781250e-07,8.3886080e+06), RES(-1.6635532333438683873e1, 1.5707963267948824084e0)},
+ {FN (arcsinh), ARG(-1.19209289550781250e-07,-8.3886080e+06), RES(-1.6635532333438683873e1, -1.5707963267948824084e0)},
+ {FN (arcsinh), ARG(5.0e-01,0.0e+00), RES(4.8121182505960344750e-1, 0.0)},
+ {FN (arcsinh), ARG(-5.0e-01,0.0e+00), RES(-4.8121182505960344750e-1, 0.0)},
+ {FN (arcsinh), ARG(5.0e-01,1.19209289550781250e-07), RES(4.8121182505960598961e-1, 1.0662402999400097805e-7)},
+ {FN (arcsinh), ARG(5.0e-01,-1.19209289550781250e-07), RES(4.8121182505960598961e-1, -1.0662402999400097805e-7)},
+ {FN (arcsinh), ARG(-5.0e-01,1.19209289550781250e-07), RES(-4.8121182505960598961e-1, 1.0662402999400097805e-7)},
+ {FN (arcsinh), ARG(-5.0e-01,-1.19209289550781250e-07), RES(-4.8121182505960598961e-1, -1.0662402999400097805e-7)},
+ {FN (arcsinh), ARG(5.0e-01,5.0e-01), RES(5.3063753095251782602e-1, 4.5227844715119068206e-1)},
+ {FN (arcsinh), ARG(5.0e-01,-5.0e-01), RES(5.3063753095251782602e-1, -4.5227844715119068206e-1)},
+ {FN (arcsinh), ARG(-5.0e-01,5.0e-01), RES(-5.3063753095251782602e-1, 4.5227844715119068206e-1)},
+ {FN (arcsinh), ARG(-5.0e-01,-5.0e-01), RES(-5.3063753095251782602e-1, -4.5227844715119068206e-1)},
+ {FN (arcsinh), ARG(5.0e-01,1.0e+00), RES(7.3285767597364526089e-1, 8.9590748120889023907e-1)},
+ {FN (arcsinh), ARG(5.0e-01,-1.0e+00), RES(7.3285767597364526089e-1, -8.9590748120889023907e-1)},
+ {FN (arcsinh), ARG(-5.0e-01,1.0e+00), RES(-7.3285767597364526089e-1, 8.9590748120889023907e-1)},
+ {FN (arcsinh), ARG(-5.0e-01,-1.0e+00), RES(-7.3285767597364526089e-1, -8.9590748120889023907e-1)},
+ {FN (arcsinh), ARG(5.0e-01,2.0e+00), RES(1.3618009008578457882e0, 1.2930420702371826591e0)},
+ {FN (arcsinh), ARG(5.0e-01,-2.0e+00), RES(1.3618009008578457882e0, -1.2930420702371826591e0)},
+ {FN (arcsinh), ARG(-5.0e-01,2.0e+00), RES(-1.3618009008578457882e0, 1.2930420702371826591e0)},
+ {FN (arcsinh), ARG(-5.0e-01,-2.0e+00), RES(-1.3618009008578457882e0, -1.2930420702371826591e0)},
+ {FN (arcsinh), ARG(5.0e-01,8.3886080e+06), RES(1.6635532333438685650e1, 1.5707962671902518438e0)},
+ {FN (arcsinh), ARG(5.0e-01,-8.3886080e+06), RES(1.6635532333438685650e1, -1.5707962671902518438e0)},
+ {FN (arcsinh), ARG(-5.0e-01,8.3886080e+06), RES(-1.6635532333438685650e1, 1.5707962671902518438e0)},
+ {FN (arcsinh), ARG(-5.0e-01,-8.3886080e+06), RES(-1.6635532333438685650e1, -1.5707962671902518438e0)},
+ {FN (arcsinh), ARG(1.0e+00,0.0e+00), RES(8.8137358701954302523e-1, 0.0)},
+ {FN (arcsinh), ARG(-1.0e+00,0.0e+00), RES(-8.8137358701954302523e-1, 0.0)},
+ {FN (arcsinh), ARG(1.0e+00,1.19209289550781250e-07), RES(8.8137358701954553738e-1, 8.4293697021788013662e-8)},
+ {FN (arcsinh), ARG(1.0e+00,-1.19209289550781250e-07), RES(8.8137358701954553738e-1, -8.4293697021788013662e-8)},
+ {FN (arcsinh), ARG(-1.0e+00,1.19209289550781250e-07), RES(-8.8137358701954553738e-1, 8.4293697021788013662e-8)},
+ {FN (arcsinh), ARG(-1.0e+00,-1.19209289550781250e-07), RES(-8.8137358701954553738e-1, -8.4293697021788013662e-8)},
+ {FN (arcsinh), ARG(1.0e+00,5.0e-01), RES(9.2613303135018242455e-1, 3.4943906285721329363e-1)},
+ {FN (arcsinh), ARG(1.0e+00,-5.0e-01), RES(9.2613303135018242455e-1, -3.4943906285721329363e-1)},
+ {FN (arcsinh), ARG(-1.0e+00,5.0e-01), RES(-9.2613303135018242455e-1, 3.4943906285721329363e-1)},
+ {FN (arcsinh), ARG(-1.0e+00,-5.0e-01), RES(-9.2613303135018242455e-1, -3.4943906285721329363e-1)},
+ {FN (arcsinh), ARG(1.0e+00,1.0e+00), RES(1.0612750619050356520e0, 6.6623943249251525510e-1)},
+ {FN (arcsinh), ARG(1.0e+00,-1.0e+00), RES(1.0612750619050356520e0, -6.6623943249251525510e-1)},
+ {FN (arcsinh), ARG(-1.0e+00,1.0e+00), RES(-1.0612750619050356520e0, 6.6623943249251525510e-1)},
+ {FN (arcsinh), ARG(-1.0e+00,-1.0e+00), RES(-1.0612750619050356520e0, -6.6623943249251525510e-1)},
+ {FN (arcsinh), ARG(1.0e+00,2.0e+00), RES(1.4693517443681852733e0, 1.0634400235777520562e0)},
+ {FN (arcsinh), ARG(1.0e+00,-2.0e+00), RES(1.4693517443681852733e0, -1.0634400235777520562e0)},
+ {FN (arcsinh), ARG(-1.0e+00,2.0e+00), RES(-1.4693517443681852733e0, 1.0634400235777520562e0)},
+ {FN (arcsinh), ARG(-1.0e+00,-2.0e+00), RES(-1.4693517443681852733e0, -1.0634400235777520562e0)},
+ {FN (arcsinh), ARG(1.0e+00,8.3886080e+06), RES(1.6635532333438690979e1, 1.5707962075856070684e0)},
+ {FN (arcsinh), ARG(1.0e+00,-8.3886080e+06), RES(1.6635532333438690979e1, -1.5707962075856070684e0)},
+ {FN (arcsinh), ARG(-1.0e+00,8.3886080e+06), RES(-1.6635532333438690979e1, 1.5707962075856070684e0)},
+ {FN (arcsinh), ARG(-1.0e+00,-8.3886080e+06), RES(-1.6635532333438690979e1, -1.5707962075856070684e0)},
+ {FN (arcsinh), ARG(2.0e+00,0.0e+00), RES(1.4436354751788103425e0, 0.0)},
+ {FN (arcsinh), ARG(-2.0e+00,0.0e+00), RES(-1.4436354751788103425e0, 0.0)},
+ {FN (arcsinh), ARG(2.0e+00,1.19209289550781250e-07), RES(1.4436354751788116136e0, 5.3312014997000413263e-8)},
+ {FN (arcsinh), ARG(2.0e+00,-1.19209289550781250e-07), RES(1.4436354751788116136e0, -5.3312014997000413263e-8)},
+ {FN (arcsinh), ARG(-2.0e+00,1.19209289550781250e-07), RES(-1.4436354751788116136e0, 5.3312014997000413263e-8)},
+ {FN (arcsinh), ARG(-2.0e+00,-1.19209289550781250e-07), RES(-1.4436354751788116136e0, -5.3312014997000413263e-8)},
+ {FN (arcsinh), ARG(2.0e+00,5.0e-01), RES(1.4657153519472905218e0, 2.2101863562288385890e-1)},
+ {FN (arcsinh), ARG(2.0e+00,-5.0e-01), RES(1.4657153519472905218e0, -2.2101863562288385890e-1)},
+ {FN (arcsinh), ARG(-2.0e+00,5.0e-01), RES(-1.4657153519472905218e0, 2.2101863562288385890e-1)},
+ {FN (arcsinh), ARG(-2.0e+00,-5.0e-01), RES(-1.4657153519472905218e0, -2.2101863562288385890e-1)},
+ {FN (arcsinh), ARG(2.0e+00,1.0e+00), RES(1.5285709194809981613e0, 4.2707858639247612548e-1)},
+ {FN (arcsinh), ARG(2.0e+00,-1.0e+00), RES(1.5285709194809981613e0, -4.2707858639247612548e-1)},
+ {FN (arcsinh), ARG(-2.0e+00,1.0e+00), RES(-1.5285709194809981613e0, 4.2707858639247612548e-1)},
+ {FN (arcsinh), ARG(-2.0e+00,-1.0e+00), RES(-1.5285709194809981613e0, -4.2707858639247612548e-1)},
+ {FN (arcsinh), ARG(2.0e+00,2.0e+00), RES(1.7343245214879664480e0, 7.5424914469804604071e-1)},
+ {FN (arcsinh), ARG(2.0e+00,-2.0e+00), RES(1.7343245214879664480e0, -7.5424914469804604071e-1)},
+ {FN (arcsinh), ARG(-2.0e+00,2.0e+00), RES(-1.7343245214879664480e0, 7.5424914469804604071e-1)},
+ {FN (arcsinh), ARG(-2.0e+00,-2.0e+00), RES(-1.7343245214879664480e0, -7.5424914469804604071e-1)},
+ {FN (arcsinh), ARG(2.0e+00,8.3886080e+06), RES(1.6635532333438712295e1, 1.5707960883763175177e0)},
+ {FN (arcsinh), ARG(2.0e+00,-8.3886080e+06), RES(1.6635532333438712295e1, -1.5707960883763175177e0)},
+ {FN (arcsinh), ARG(-2.0e+00,8.3886080e+06), RES(-1.6635532333438712295e1, 1.5707960883763175177e0)},
+ {FN (arcsinh), ARG(-2.0e+00,-8.3886080e+06), RES(-1.6635532333438712295e1, -1.5707960883763175177e0)},
+ {FN (arcsinh), ARG(8.3886080e+06,0.0e+00), RES(1.6635532333438690979e1, 0.0)},
+ {FN (arcsinh), ARG(-8.3886080e+06,0.0e+00), RES(-1.6635532333438690979e1, 0.0)},
+ {FN (arcsinh), ARG(8.3886080e+06,1.19209289550781250e-07), RES(1.6635532333438690979e1, 1.4210854715201902743e-14)},
+ {FN (arcsinh), ARG(8.3886080e+06,-1.19209289550781250e-07), RES(1.6635532333438690979e1, -1.4210854715201902743e-14)},
+ {FN (arcsinh), ARG(-8.3886080e+06,1.19209289550781250e-07), RES(-1.6635532333438690979e1, 1.4210854715201902743e-14)},
+ {FN (arcsinh), ARG(-8.3886080e+06,-1.19209289550781250e-07), RES(-1.6635532333438690979e1, -1.4210854715201902743e-14)},
+ {FN (arcsinh), ARG(8.3886080e+06,5.0e-01), RES(1.6635532333438692755e1, 5.9604644775390130897e-8)},
+ {FN (arcsinh), ARG(8.3886080e+06,-5.0e-01), RES(1.6635532333438692755e1, -5.9604644775390130897e-8)},
+ {FN (arcsinh), ARG(-8.3886080e+06,5.0e-01), RES(-1.6635532333438692755e1, 5.9604644775390130897e-8)},
+ {FN (arcsinh), ARG(-8.3886080e+06,-5.0e-01), RES(-1.6635532333438692755e1, -5.9604644775390130897e-8)},
+ {FN (arcsinh), ARG(8.3886080e+06,1.0e+00), RES(1.6635532333438698084e1, 1.1920928955077983828e-7)},
+ {FN (arcsinh), ARG(8.3886080e+06,-1.0e+00), RES(1.6635532333438698084e1, -1.1920928955077983828e-7)},
+ {FN (arcsinh), ARG(-8.3886080e+06,1.0e+00), RES(-1.6635532333438698084e1, 1.1920928955077983828e-7)},
+ {FN (arcsinh), ARG(-8.3886080e+06,-1.0e+00), RES(-1.6635532333438698084e1, -1.1920928955077983828e-7)},
+ {FN (arcsinh), ARG(8.3886080e+06,2.0e+00), RES(1.663553233343871940e1, 2.3841857910155628843e-7)},
+ {FN (arcsinh), ARG(8.3886080e+06,-2.0e+00), RES(1.663553233343871940e1, -2.3841857910155628843e-7)},
+ {FN (arcsinh), ARG(-8.3886080e+06,2.0e+00), RES(-1.663553233343871940e1, 2.3841857910155628843e-7)},
+ {FN (arcsinh), ARG(-8.3886080e+06,-2.0e+00), RES(-1.663553233343871940e1, -2.3841857910155628843e-7)},
+ {FN (arcsinh), ARG(8.3886080e+06,8.3886080e+06), RES(1.6982105923718660081e1, 7.8539816339744653326e-1)},
+ {FN (arcsinh), ARG(8.3886080e+06,-8.3886080e+06), RES(1.6982105923718660081e1, -7.8539816339744653326e-1)},
+ {FN (arcsinh), ARG(-8.3886080e+06,8.3886080e+06), RES(-1.6982105923718660081e1, 7.8539816339744653326e-1)},
+ {FN (arcsinh), ARG(-8.3886080e+06,-8.3886080e+06), RES(-1.6982105923718660081e1, -7.8539816339744653326e-1)},
+ {FN (arccosh), ARG(0.0e+00,0.0e+00), RES(0, 1.5707963267948966192e0)},
+ {FN (arccosh), ARG(0.0e+00,1.19209289550781250e-07), RES(1.1920928955078096766e-7, 1.5707963267948966192e0)},
+ {FN (arccosh), ARG(0.0e+00,-1.19209289550781250e-07), RES(1.1920928955078096766e-7, -1.5707963267948966192e0)},
+ {FN (arccosh), ARG(0.0e+00,5.0e-01), RES(4.8121182505960344750e-1, 1.5707963267948966192e0)},
+ {FN (arccosh), ARG(0.0e+00,-5.0e-01), RES(4.8121182505960344750e-1, -1.5707963267948966192e0)},
+ {FN (arccosh), ARG(0.0e+00,1.0e+00), RES(8.8137358701954302523e-1, 1.5707963267948966192e0)},
+ {FN (arccosh), ARG(0.0e+00,-1.0e+00), RES(8.8137358701954302523e-1, -1.5707963267948966192e0)},
+ {FN (arccosh), ARG(0.0e+00,2.0e+00), RES(1.4436354751788103425e0, 1.5707963267948966192e0)},
+ {FN (arccosh), ARG(0.0e+00,-2.0e+00), RES(1.4436354751788103425e0, -1.5707963267948966192e0)},
+ {FN (arccosh), ARG(0.0e+00,8.3886080e+06), RES(1.6635532333438690979e1, 1.5707963267948966192e0)},
+ {FN (arccosh), ARG(0.0e+00,-8.3886080e+06), RES(1.6635532333438690979e1, -1.5707963267948966192e0)},
+ {FN (arccosh), ARG(1.19209289550781250e-07,0.0e+00), RES(0, 1.5707962075856070684e0)},
+ {FN (arccosh), ARG(-1.19209289550781250e-07,0.0e+00), RES(0, 1.570796446004186170e0)},
+ {FN (arccosh), ARG(1.19209289550781250e-07,1.19209289550781250e-07), RES(1.1920928955078181469e-7, 1.5707962075856070685e0)},
+ {FN (arccosh), ARG(1.19209289550781250e-07,-1.19209289550781250e-07), RES(1.1920928955078181469e-7, -1.5707962075856070685e0)},
+ {FN (arccosh), ARG(-1.19209289550781250e-07,1.19209289550781250e-07), RES(1.1920928955078181469e-7, 1.570796446004186170e0)},
+ {FN (arccosh), ARG(-1.19209289550781250e-07,-1.19209289550781250e-07), RES(1.1920928955078181469e-7, -1.570796446004186170e0)},
+ {FN (arccosh), ARG(1.19209289550781250e-07,5.0e-01), RES(4.8121182505960598961e-1, 1.5707962201708666252e0)},
+ {FN (arccosh), ARG(1.19209289550781250e-07,-5.0e-01), RES(4.8121182505960598961e-1, -1.5707962201708666252e0)},
+ {FN (arccosh), ARG(-1.19209289550781250e-07,5.0e-01), RES(4.8121182505960598961e-1, 1.5707964334189266132e0)},
+ {FN (arccosh), ARG(-1.19209289550781250e-07,-5.0e-01), RES(4.8121182505960598961e-1, -1.5707964334189266132e0)},
+ {FN (arccosh), ARG(1.19209289550781250e-07,1.0e+00), RES(8.8137358701954553738e-1, 1.5707962425011995974e0)},
+ {FN (arccosh), ARG(1.19209289550781250e-07,-1.0e+00), RES(8.8137358701954553738e-1, -1.5707962425011995974e0)},
+ {FN (arccosh), ARG(-1.19209289550781250e-07,1.0e+00), RES(8.8137358701954553738e-1, 1.5707964110885936410e0)},
+ {FN (arccosh), ARG(-1.19209289550781250e-07,-1.0e+00), RES(8.8137358701954553738e-1, -1.5707964110885936410e0)},
+ {FN (arccosh), ARG(1.19209289550781250e-07,2.0e+00), RES(1.4436354751788116136e0, 1.5707962734828816222e0)},
+ {FN (arccosh), ARG(1.19209289550781250e-07,-2.0e+00), RES(1.4436354751788116136e0, -1.5707962734828816222e0)},
+ {FN (arccosh), ARG(-1.19209289550781250e-07,2.0e+00), RES(1.4436354751788116136e0, 1.5707963801069116162e0)},
+ {FN (arccosh), ARG(-1.19209289550781250e-07,-2.0e+00), RES(1.4436354751788116136e0, -1.5707963801069116162e0)},
+ {FN (arccosh), ARG(1.19209289550781250e-07,8.3886080e+06), RES(1.6635532333438690979e1, 1.5707963267948824084e0)},
+ {FN (arccosh), ARG(1.19209289550781250e-07,-8.3886080e+06), RES(1.6635532333438690979e1, -1.5707963267948824084e0)},
+ {FN (arccosh), ARG(-1.19209289550781250e-07,8.3886080e+06), RES(1.6635532333438690979e1, 1.5707963267949108301e0)},
+ {FN (arccosh), ARG(-1.19209289550781250e-07,-8.3886080e+06), RES(1.6635532333438690979e1, -1.5707963267949108301e0)},
+ {FN (arccosh), ARG(5.0e-01,0.0e+00), RES(0, 1.0471975511965977462e0)},
+ {FN (arccosh), ARG(-5.0e-01,0.0e+00), RES(0, 2.0943951023931954923e0)},
+ {FN (arccosh), ARG(5.0e-01,1.19209289550781250e-07), RES(1.3765103082409432364e-7, 1.0471975511966032159e0)},
+ {FN (arccosh), ARG(5.0e-01,-1.19209289550781250e-07), RES(1.3765103082409432364e-7, -1.0471975511966032159e0)},
+ {FN (arccosh), ARG(-5.0e-01,1.19209289550781250e-07), RES(1.3765103082409432364e-7, 2.0943951023931900225e0)},
+ {FN (arccosh), ARG(-5.0e-01,-1.19209289550781250e-07), RES(1.3765103082409432364e-7, -2.0943951023931900225e0)},
+ {FN (arccosh), ARG(5.0e-01,5.0e-01), RES(5.3063753095251782602e-1, 1.1185178796437059372e0)},
+ {FN (arccosh), ARG(5.0e-01,-5.0e-01), RES(5.3063753095251782602e-1, -1.1185178796437059372e0)},
+ {FN (arccosh), ARG(-5.0e-01,5.0e-01), RES(5.3063753095251782602e-1, 2.0230747739460873013e0)},
+ {FN (arccosh), ARG(-5.0e-01,-5.0e-01), RES(5.3063753095251782602e-1, -2.0230747739460873013e0)},
+ {FN (arccosh), ARG(5.0e-01,1.0e+00), RES(9.2613303135018242455e-1, 1.2213572639376833256e0)},
+ {FN (arccosh), ARG(5.0e-01,-1.0e+00), RES(9.2613303135018242455e-1, -1.2213572639376833256e0)},
+ {FN (arccosh), ARG(-5.0e-01,1.0e+00), RES(9.2613303135018242455e-1, 1.9202353896521099129e0)},
+ {FN (arccosh), ARG(-5.0e-01,-1.0e+00), RES(9.2613303135018242455e-1, -1.9202353896521099129e0)},
+ {FN (arccosh), ARG(5.0e-01,2.0e+00), RES(1.4657153519472905218e0, 1.3497776911720127603e0)},
+ {FN (arccosh), ARG(5.0e-01,-2.0e+00), RES(1.4657153519472905218e0, -1.3497776911720127603e0)},
+ {FN (arccosh), ARG(-5.0e-01,2.0e+00), RES(1.4657153519472905218e0, 1.7918149624177804781e0)},
+ {FN (arccosh), ARG(-5.0e-01,-2.0e+00), RES(1.4657153519472905218e0, -1.7918149624177804781e0)},
+ {FN (arccosh), ARG(5.0e-01,8.3886080e+06), RES(1.6635532333438692755e1, 1.5707962671902518438e0)},
+ {FN (arccosh), ARG(5.0e-01,-8.3886080e+06), RES(1.6635532333438692755e1, -1.5707962671902518438e0)},
+ {FN (arccosh), ARG(-5.0e-01,8.3886080e+06), RES(1.6635532333438692755e1, 1.5707963863995413946e0)},
+ {FN (arccosh), ARG(-5.0e-01,-8.3886080e+06), RES(1.6635532333438692755e1, -1.5707963863995413946e0)},
+ {FN (arccosh), ARG(1.0e+00,0.0e+00), RES(0e0, 0.0)},
+ {FN (arccosh), ARG(-1.0e+00,0.0e+00), RES(0, 3.1415926535897932385e0)},
+ {FN (arccosh), ARG(1.0e+00,1.19209289550781250e-07), RES(3.4526698643116312881e-4, 3.4526697957132450399e-4)},
+ {FN (arccosh), ARG(1.0e+00,-1.19209289550781250e-07), RES(3.4526698643116312881e-4, -3.4526697957132450399e-4)},
+ {FN (arccosh), ARG(-1.0e+00,1.19209289550781250e-07), RES(3.4526698643116312881e-4, 3.1412473866102219140e0)},
+ {FN (arccosh), ARG(-1.0e+00,-1.19209289550781250e-07), RES(3.4526698643116312881e-4, -3.1412473866102219140e0)},
+ {FN (arccosh), ARG(1.0e+00,5.0e-01), RES(7.3285767597364526089e-1, 6.7488884558600638016e-1)},
+ {FN (arccosh), ARG(1.0e+00,-5.0e-01), RES(7.3285767597364526089e-1, -6.7488884558600638016e-1)},
+ {FN (arccosh), ARG(-1.0e+00,5.0e-01), RES(7.3285767597364526089e-1, 2.4667038080037868583e0)},
+ {FN (arccosh), ARG(-1.0e+00,-5.0e-01), RES(7.3285767597364526089e-1, -2.4667038080037868583e0)},
+ {FN (arccosh), ARG(1.0e+00,1.0e+00), RES(1.0612750619050356520e0, 9.0455689430238136413e-1)},
+ {FN (arccosh), ARG(1.0e+00,-1.0e+00), RES(1.0612750619050356520e0, -9.0455689430238136413e-1)},
+ {FN (arccosh), ARG(-1.0e+00,1.0e+00), RES(1.0612750619050356520e0, 2.2370357592874118743e0)},
+ {FN (arccosh), ARG(-1.0e+00,-1.0e+00), RES(1.0612750619050356520e0, -2.2370357592874118743e0)},
+ {FN (arccosh), ARG(1.0e+00,2.0e+00), RES(1.5285709194809981613e0, 1.1437177404024204938e0)},
+ {FN (arccosh), ARG(1.0e+00,-2.0e+00), RES(1.5285709194809981613e0, -1.1437177404024204938e0)},
+ {FN (arccosh), ARG(-1.0e+00,2.0e+00), RES(1.5285709194809981613e0, 1.9978749131873727447e0)},
+ {FN (arccosh), ARG(-1.0e+00,-2.0e+00), RES(1.5285709194809981613e0, -1.9978749131873727447e0)},
+ {FN (arccosh), ARG(1.0e+00,8.3886080e+06), RES(1.6635532333438698084e1, 1.5707962075856070685e0)},
+ {FN (arccosh), ARG(1.0e+00,-8.3886080e+06), RES(1.6635532333438698084e1, -1.5707962075856070685e0)},
+ {FN (arccosh), ARG(-1.0e+00,8.3886080e+06), RES(1.6635532333438698084e1, 1.570796446004186170e0)},
+ {FN (arccosh), ARG(-1.0e+00,-8.3886080e+06), RES(1.6635532333438698084e1, -1.570796446004186170e0)},
+ {FN (arccosh), ARG(2.0e+00,0.0e+00), RES(1.3169578969248167086e0, 0.0)},
+ {FN (arccosh), ARG(-2.0e+00,0.0e+00), RES(1.3169578969248167086e0, 3.1415926535897932385e0)},
+ {FN (arccosh), ARG(2.0e+00,1.19209289550781250e-07), RES(1.3169578969248194435e0, 6.8825515412047433504e-8)},
+ {FN (arccosh), ARG(2.0e+00,-1.19209289550781250e-07), RES(1.3169578969248194435e0, -6.8825515412047433504e-8)},
+ {FN (arccosh), ARG(-2.0e+00,1.19209289550781250e-07), RES(1.3169578969248194435e0, 3.1415925847642778264e0)},
+ {FN (arccosh), ARG(-2.0e+00,-1.19209289550781250e-07), RES(1.3169578969248194435e0, -3.1415925847642778264e0)},
+ {FN (arccosh), ARG(2.0e+00,5.0e-01), RES(1.3618009008578457882e0, 2.7775425655771396018e-1)},
+ {FN (arccosh), ARG(2.0e+00,-5.0e-01), RES(1.3618009008578457882e0, -2.7775425655771396018e-1)},
+ {FN (arccosh), ARG(-2.0e+00,5.0e-01), RES(1.3618009008578457882e0, 2.8638383970320792783e0)},
+ {FN (arccosh), ARG(-2.0e+00,-5.0e-01), RES(1.3618009008578457882e0, -2.8638383970320792783e0)},
+ {FN (arccosh), ARG(2.0e+00,1.0e+00), RES(1.4693517443681852733e0, 5.0735630321714456304e-1)},
+ {FN (arccosh), ARG(2.0e+00,-1.0e+00), RES(1.4693517443681852733e0, -5.0735630321714456304e-1)},
+ {FN (arccosh), ARG(-2.0e+00,1.0e+00), RES(1.4693517443681852733e0, 2.6342363503726486754e0)},
+ {FN (arccosh), ARG(-2.0e+00,-1.0e+00), RES(1.4693517443681852733e0, -2.6342363503726486754e0)},
+ {FN (arccosh), ARG(2.0e+00,2.0e+00), RES(1.7343245214879664480e0, 8.1654718209685057852e-1)},
+ {FN (arccosh), ARG(2.0e+00,-2.0e+00), RES(1.7343245214879664480e0, -8.1654718209685057852e-1)},
+ {FN (arccosh), ARG(-2.0e+00,2.0e+00), RES(1.7343245214879664480e0, 2.3250454714929426599e0)},
+ {FN (arccosh), ARG(-2.0e+00,-2.0e+00), RES(1.7343245214879664480e0, -2.3250454714929426599e0)},
+ {FN (arccosh), ARG(2.0e+00,8.3886080e+06), RES(1.663553233343871940e1, 1.5707960883763175177e0)},
+ {FN (arccosh), ARG(2.0e+00,-8.3886080e+06), RES(1.663553233343871940e1, -1.5707960883763175177e0)},
+ {FN (arccosh), ARG(-2.0e+00,8.3886080e+06), RES(1.663553233343871940e1, 1.5707965652134757208e0)},
+ {FN (arccosh), ARG(-2.0e+00,-8.3886080e+06), RES(1.663553233343871940e1, -1.5707965652134757208e0)},
+ {FN (arccosh), ARG(8.3886080e+06,0.0e+00), RES(1.6635532333438683873e1, 0.0)},
+ {FN (arccosh), ARG(-8.3886080e+06,0.0e+00), RES(1.6635532333438683873e1, 3.1415926535897932385e0)},
+ {FN (arccosh), ARG(8.3886080e+06,1.19209289550781250e-07), RES(1.6635532333438683873e1, 1.4210854715202104692e-14)},
+ {FN (arccosh), ARG(8.3886080e+06,-1.19209289550781250e-07), RES(1.6635532333438683873e1, -1.4210854715202104692e-14)},
+ {FN (arccosh), ARG(-8.3886080e+06,1.19209289550781250e-07), RES(1.6635532333438683873e1, 3.1415926535897790276e0)},
+ {FN (arccosh), ARG(-8.3886080e+06,-1.19209289550781250e-07), RES(1.6635532333438683873e1, -3.1415926535897790276e0)},
+ {FN (arccosh), ARG(8.3886080e+06,5.0e-01), RES(1.6635532333438685650e1, 5.9604644775390977930e-8)},
+ {FN (arccosh), ARG(8.3886080e+06,-5.0e-01), RES(1.6635532333438685650e1, -5.9604644775390977930e-8)},
+ {FN (arccosh), ARG(-8.3886080e+06,5.0e-01), RES(1.6635532333438685650e1, 3.1415925939851484631e0)},
+ {FN (arccosh), ARG(-8.3886080e+06,-5.0e-01), RES(1.6635532333438685650e1, -3.1415925939851484631e0)},
+ {FN (arccosh), ARG(8.3886080e+06,1.0e+00), RES(1.6635532333438690979e1, 1.1920928955078153234e-7)},
+ {FN (arccosh), ARG(8.3886080e+06,-1.0e+00), RES(1.6635532333438690979e1, -1.1920928955078153234e-7)},
+ {FN (arccosh), ARG(-8.3886080e+06,1.0e+00), RES(1.6635532333438690979e1, 3.1415925343805036877e0)},
+ {FN (arccosh), ARG(-8.3886080e+06,-1.0e+00), RES(1.6635532333438690979e1, -3.1415925343805036877e0)},
+ {FN (arccosh), ARG(8.3886080e+06,2.0e+00), RES(1.6635532333438712295e1, 2.3841857910155967656e-7)},
+ {FN (arccosh), ARG(8.3886080e+06,-2.0e+00), RES(1.6635532333438712295e1, -2.3841857910155967656e-7)},
+ {FN (arccosh), ARG(-8.3886080e+06,2.0e+00), RES(1.6635532333438712295e1, 3.1415924151712141369e0)},
+ {FN (arccosh), ARG(-8.3886080e+06,-2.0e+00), RES(1.6635532333438712295e1, -3.1415924151712141369e0)},
+ {FN (arccosh), ARG(8.3886080e+06,8.3886080e+06), RES(1.6982105923718660081e1, 7.8539816339745008597e-1)},
+ {FN (arccosh), ARG(8.3886080e+06,-8.3886080e+06), RES(1.6982105923718660081e1, -7.8539816339745008597e-1)},
+ {FN (arccosh), ARG(-8.3886080e+06,8.3886080e+06), RES(1.6982105923718660081e1, 2.3561944901923431525e0)},
+ {FN (arccosh), ARG(-8.3886080e+06,-8.3886080e+06), RES(1.6982105923718660081e1, -2.3561944901923431525e0)},
+ {FN (arctanh), ARG(0.0e+00,0.0e+00), RES(0e0, 0.0)},
+ {FN (arctanh), ARG(0.0e+00,1.19209289550781250e-07), RES(0, 1.1920928955078068531e-7)},
+ {FN (arctanh), ARG(0.0e+00,-1.19209289550781250e-07), RES(0, -1.1920928955078068531e-7)},
+ {FN (arctanh), ARG(0.0e+00,5.0e-01), RES(0, 4.6364760900080611621e-1)},
+ {FN (arctanh), ARG(0.0e+00,-5.0e-01), RES(0, -4.6364760900080611621e-1)},
+ {FN (arctanh), ARG(0.0e+00,1.0e+00), RES(0, 7.8539816339744830962e-1)},
+ {FN (arctanh), ARG(0.0e+00,-1.0e+00), RES(0, -7.8539816339744830962e-1)},
+ {FN (arctanh), ARG(0.0e+00,2.0e+00), RES(0, 1.1071487177940905030e0)},
+ {FN (arctanh), ARG(0.0e+00,-2.0e+00), RES(0, -1.1071487177940905030e0)},
+ {FN (arctanh), ARG(0.0e+00,8.3886080e+06), RES(0, 1.5707962075856070685e0)},
+ {FN (arctanh), ARG(0.0e+00,-8.3886080e+06), RES(0, -1.5707962075856070685e0)},
+ {FN (arctanh), ARG(1.19209289550781250e-07,0.0e+00), RES(1.1920928955078181469e-7, 0.0)},
+ {FN (arctanh), ARG(-1.19209289550781250e-07,0.0e+00), RES(-1.1920928955078181469e-7, 0.0)},
+ {FN (arctanh), ARG(1.19209289550781250e-07,1.19209289550781250e-07), RES(1.1920928955078012062e-7, 1.1920928955078237938e-7)},
+ {FN (arctanh), ARG(1.19209289550781250e-07,-1.19209289550781250e-07), RES(1.1920928955078012062e-7, -1.1920928955078237938e-7)},
+ {FN (arctanh), ARG(-1.19209289550781250e-07,1.19209289550781250e-07), RES(-1.1920928955078012062e-7, 1.1920928955078237938e-7)},
+ {FN (arctanh), ARG(-1.19209289550781250e-07,-1.19209289550781250e-07), RES(-1.1920928955078012062e-7, -1.1920928955078237938e-7)},
+ {FN (arctanh), ARG(1.19209289550781250e-07,5.0e-01), RES(9.5367431640625072280e-8, 4.6364760900081066369e-1)},
+ {FN (arctanh), ARG(1.19209289550781250e-07,-5.0e-01), RES(9.5367431640625072280e-8, -4.6364760900081066369e-1)},
+ {FN (arctanh), ARG(-1.19209289550781250e-07,5.0e-01), RES(-9.5367431640625072280e-8, 4.6364760900081066369e-1)},
+ {FN (arctanh), ARG(-1.19209289550781250e-07,-5.0e-01), RES(-9.5367431640625072280e-8, -4.6364760900081066369e-1)},
+ {FN (arctanh), ARG(1.19209289550781250e-07,1.0e+00), RES(5.9604644775390483828e-8, 7.8539816339745186233e-1)},
+ {FN (arctanh), ARG(1.19209289550781250e-07,-1.0e+00), RES(5.9604644775390483828e-8, -7.8539816339745186233e-1)},
+ {FN (arctanh), ARG(-1.19209289550781250e-07,1.0e+00), RES(-5.9604644775390483828e-8, 7.8539816339745186233e-1)},
+ {FN (arctanh), ARG(-1.19209289550781250e-07,-1.0e+00), RES(-5.9604644775390483828e-8, -7.8539816339745186233e-1)},
+ {FN (arctanh), ARG(1.19209289550781250e-07,2.0e+00), RES(2.3841857910156200307e-8, 1.1071487177940916399e0)},
+ {FN (arctanh), ARG(1.19209289550781250e-07,-2.0e+00), RES(2.3841857910156200307e-8, -1.1071487177940916399e0)},
+ {FN (arctanh), ARG(-1.19209289550781250e-07,2.0e+00), RES(-2.3841857910156200307e-8, 1.1071487177940916399e0)},
+ {FN (arctanh), ARG(-1.19209289550781250e-07,-2.0e+00), RES(-2.3841857910156200307e-8, -1.1071487177940916399e0)},
+ {FN (arctanh), ARG(1.19209289550781250e-07,8.3886080e+06), RES(1.6940658945085766040e-21, 1.5707962075856070685e0)},
+ {FN (arctanh), ARG(1.19209289550781250e-07,-8.3886080e+06), RES(1.6940658945085766040e-21, -1.5707962075856070685e0)},
+ {FN (arctanh), ARG(-1.19209289550781250e-07,8.3886080e+06), RES(-1.6940658945085766040e-21, 1.5707962075856070685e0)},
+ {FN (arctanh), ARG(-1.19209289550781250e-07,-8.3886080e+06), RES(-1.6940658945085766040e-21, -1.5707962075856070685e0)},
+ {FN (arctanh), ARG(5.0e-01,0.0e+00), RES(5.4930614433405484570e-1, 0.0)},
+ {FN (arctanh), ARG(-5.0e-01,0.0e+00), RES(-5.4930614433405484570e-1, 0.0)},
+ {FN (arctanh), ARG(5.0e-01,1.19209289550781250e-07), RES(5.4930614433404221383e-1, 1.5894571940103932425e-7)},
+ {FN (arctanh), ARG(5.0e-01,-1.19209289550781250e-07), RES(5.4930614433404221383e-1, -1.5894571940103932425e-7)},
+ {FN (arctanh), ARG(-5.0e-01,1.19209289550781250e-07), RES(-5.4930614433404221383e-1, 1.5894571940103932425e-7)},
+ {FN (arctanh), ARG(-5.0e-01,-1.19209289550781250e-07), RES(-5.4930614433404221383e-1, -1.5894571940103932425e-7)},
+ {FN (arctanh), ARG(5.0e-01,5.0e-01), RES(4.0235947810852509365e-1, 5.5357435889704525151e-1)},
+ {FN (arctanh), ARG(5.0e-01,-5.0e-01), RES(4.0235947810852509365e-1, -5.5357435889704525151e-1)},
+ {FN (arctanh), ARG(-5.0e-01,5.0e-01), RES(-4.0235947810852509365e-1, 5.5357435889704525151e-1)},
+ {FN (arctanh), ARG(-5.0e-01,-5.0e-01), RES(-4.0235947810852509365e-1, -5.5357435889704525151e-1)},
+ {FN (arctanh), ARG(5.0e-01,1.0e+00), RES(2.3887786125685909036e-1, 8.4757566067082902713e-1)},
+ {FN (arctanh), ARG(5.0e-01,-1.0e+00), RES(2.3887786125685909036e-1, -8.4757566067082902713e-1)},
+ {FN (arctanh), ARG(-5.0e-01,1.0e+00), RES(-2.3887786125685909036e-1, 8.4757566067082902713e-1)},
+ {FN (arctanh), ARG(-5.0e-01,-1.0e+00), RES(-2.3887786125685909036e-1, -8.4757566067082902713e-1)},
+ {FN (arctanh), ARG(5.0e-01,2.0e+00), RES(9.6415620202996167238e-2, 1.1265564408348223487e0)},
+ {FN (arctanh), ARG(5.0e-01,-2.0e+00), RES(9.6415620202996167238e-2, -1.1265564408348223487e0)},
+ {FN (arctanh), ARG(-5.0e-01,2.0e+00), RES(-9.6415620202996167238e-2, 1.1265564408348223487e0)},
+ {FN (arctanh), ARG(-5.0e-01,-2.0e+00), RES(-9.6415620202996167238e-2, -1.1265564408348223487e0)},
+ {FN (arctanh), ARG(5.0e-01,8.3886080e+06), RES(7.1054273576008756410e-15, 1.5707962075856070685e0)},
+ {FN (arctanh), ARG(5.0e-01,-8.3886080e+06), RES(7.1054273576008756410e-15, -1.5707962075856070685e0)},
+ {FN (arctanh), ARG(-5.0e-01,8.3886080e+06), RES(-7.1054273576008756410e-15, 1.5707962075856070685e0)},
+ {FN (arctanh), ARG(-5.0e-01,-8.3886080e+06), RES(-7.1054273576008756410e-15, -1.5707962075856070685e0)},
+ {FN (arctanh), ARG(1.0e+00,1.19209289550781250e-07), RES(8.3177661667193446012e0, 7.8539819319977069731e-1)},
+ {FN (arctanh), ARG(1.0e+00,-1.19209289550781250e-07), RES(8.3177661667193446012e0, -7.8539819319977069731e-1)},
+ {FN (arctanh), ARG(-1.0e+00,1.19209289550781250e-07), RES(-8.3177661667193446012e0, 7.8539819319977069731e-1)},
+ {FN (arctanh), ARG(-1.0e+00,-1.19209289550781250e-07), RES(-8.3177661667193446012e0, -7.8539819319977069731e-1)},
+ {FN (arctanh), ARG(1.0e+00,5.0e-01), RES(7.0830333601405402006e-1, 9.0788749496088038670e-1)},
+ {FN (arctanh), ARG(1.0e+00,-5.0e-01), RES(7.0830333601405402006e-1, -9.0788749496088038670e-1)},
+ {FN (arctanh), ARG(-1.0e+00,5.0e-01), RES(-7.0830333601405402006e-1, 9.0788749496088038670e-1)},
+ {FN (arctanh), ARG(-1.0e+00,-5.0e-01), RES(-7.0830333601405402006e-1, -9.0788749496088038670e-1)},
+ {FN (arctanh), ARG(1.0e+00,1.0e+00), RES(4.0235947810852509365e-1, 1.0172219678978513677e0)},
+ {FN (arctanh), ARG(1.0e+00,-1.0e+00), RES(4.0235947810852509365e-1, -1.0172219678978513677e0)},
+ {FN (arctanh), ARG(-1.0e+00,1.0e+00), RES(-4.0235947810852509365e-1, 1.0172219678978513677e0)},
+ {FN (arctanh), ARG(-1.0e+00,-1.0e+00), RES(-4.0235947810852509365e-1, -1.0172219678978513677e0)},
+ {FN (arctanh), ARG(1.0e+00,2.0e+00), RES(1.7328679513998632735e-1, 1.1780972450961724644e0)},
+ {FN (arctanh), ARG(1.0e+00,-2.0e+00), RES(1.7328679513998632735e-1, -1.1780972450961724644e0)},
+ {FN (arctanh), ARG(-1.0e+00,2.0e+00), RES(-1.7328679513998632735e-1, 1.1780972450961724644e0)},
+ {FN (arctanh), ARG(-1.0e+00,-2.0e+00), RES(-1.7328679513998632735e-1, -1.1780972450961724644e0)},
+ {FN (arctanh), ARG(1.0e+00,8.3886080e+06), RES(1.4210854715201599821e-14, 1.5707962075856070685e0)},
+ {FN (arctanh), ARG(1.0e+00,-8.3886080e+06), RES(1.4210854715201599821e-14, -1.5707962075856070685e0)},
+ {FN (arctanh), ARG(-1.0e+00,8.3886080e+06), RES(-1.4210854715201599821e-14, 1.5707962075856070685e0)},
+ {FN (arctanh), ARG(-1.0e+00,-8.3886080e+06), RES(-1.4210854715201599821e-14, -1.5707962075856070685e0)},
+ {FN (arctanh), ARG(2.0e+00,0.0e+00), RES(5.4930614433405484570e-1, -1.5707963267948966192e0)},
+ {FN (arctanh), ARG(-2.0e+00,0.0e+00), RES(-5.4930614433405484570e-1, 1.5707963267948966192e0)},
+ {FN (arctanh), ARG(2.0e+00,1.19209289550781250e-07), RES(5.4930614433405168773e-1, 1.5707962870584667690e0)},
+ {FN (arctanh), ARG(2.0e+00,-1.19209289550781250e-07), RES(5.4930614433405168773e-1, -1.5707962870584667690e0)},
+ {FN (arctanh), ARG(-2.0e+00,1.19209289550781250e-07), RES(-5.4930614433405168773e-1, 1.5707962870584667690e0)},
+ {FN (arctanh), ARG(-2.0e+00,-1.19209289550781250e-07), RES(-5.4930614433405168773e-1, -1.5707962870584667690e0)},
+ {FN (arctanh), ARG(2.0e+00,5.0e-01), RES(5.0037000005253101744e-1, 1.4215468610018069803e0)},
+ {FN (arctanh), ARG(2.0e+00,-5.0e-01), RES(5.0037000005253101744e-1, -1.4215468610018069803e0)},
+ {FN (arctanh), ARG(-2.0e+00,5.0e-01), RES(-5.0037000005253101744e-1, 1.4215468610018069803e0)},
+ {FN (arctanh), ARG(-2.0e+00,-5.0e-01), RES(-5.0037000005253101744e-1, -1.4215468610018069803e0)},
+ {FN (arctanh), ARG(2.0e+00,1.0e+00), RES(4.0235947810852509365e-1, 1.3389725222944935611e0)},
+ {FN (arctanh), ARG(2.0e+00,-1.0e+00), RES(4.0235947810852509365e-1, -1.3389725222944935611e0)},
+ {FN (arctanh), ARG(-2.0e+00,1.0e+00), RES(-4.0235947810852509365e-1, 1.3389725222944935611e0)},
+ {FN (arctanh), ARG(-2.0e+00,-1.0e+00), RES(-4.0235947810852509365e-1, -1.3389725222944935611e0)},
+ {FN (arctanh), ARG(2.0e+00,2.0e+00), RES(2.3887786125685909036e-1, 1.3112232696716351433e0)},
+ {FN (arctanh), ARG(2.0e+00,-2.0e+00), RES(2.3887786125685909036e-1, -1.3112232696716351433e0)},
+ {FN (arctanh), ARG(-2.0e+00,2.0e+00), RES(-2.3887786125685909036e-1, 1.3112232696716351433e0)},
+ {FN (arctanh), ARG(-2.0e+00,-2.0e+00), RES(-2.3887786125685909036e-1, -1.3112232696716351433e0)},
+ {FN (arctanh), ARG(2.0e+00,8.3886080e+06), RES(2.8421709430401987951e-14, 1.5707962075856070685e0)},
+ {FN (arctanh), ARG(2.0e+00,-8.3886080e+06), RES(2.8421709430401987951e-14, -1.5707962075856070685e0)},
+ {FN (arctanh), ARG(-2.0e+00,8.3886080e+06), RES(-2.8421709430401987951e-14, 1.5707962075856070685e0)},
+ {FN (arctanh), ARG(-2.0e+00,-8.3886080e+06), RES(-2.8421709430401987951e-14, -1.5707962075856070685e0)},
+ {FN (arctanh), ARG(8.3886080e+06,0.0e+00), RES(1.1920928955078181469e-7, -1.5707963267948966192e0)},
+ {FN (arctanh), ARG(-8.3886080e+06,0.0e+00), RES(-1.1920928955078181469e-7, 1.5707963267948966192e0)},
+ {FN (arctanh), ARG(8.3886080e+06,1.19209289550781250e-07), RES(1.1920928955078181469e-7, 1.5707963267948966192e0)},
+ {FN (arctanh), ARG(8.3886080e+06,-1.19209289550781250e-07), RES(1.1920928955078181469e-7, -1.5707963267948966192e0)},
+ {FN (arctanh), ARG(-8.3886080e+06,1.19209289550781250e-07), RES(-1.1920928955078181469e-7, 1.5707963267948966192e0)},
+ {FN (arctanh), ARG(-8.3886080e+06,-1.19209289550781250e-07), RES(-1.1920928955078181469e-7, -1.5707963267948966192e0)},
+ {FN (arctanh), ARG(8.3886080e+06,5.0e-01), RES(1.1920928955078139117e-7, 1.5707963267948895138e0)},
+ {FN (arctanh), ARG(8.3886080e+06,-5.0e-01), RES(1.1920928955078139117e-7, -1.5707963267948895138e0)},
+ {FN (arctanh), ARG(-8.3886080e+06,5.0e-01), RES(-1.1920928955078139117e-7, 1.5707963267948895138e0)},
+ {FN (arctanh), ARG(-8.3886080e+06,-5.0e-01), RES(-1.1920928955078139117e-7, -1.5707963267948895138e0)},
+ {FN (arctanh), ARG(8.3886080e+06,1.0e+00), RES(1.1920928955078012062e-7, 1.5707963267948824084e0)},
+ {FN (arctanh), ARG(8.3886080e+06,-1.0e+00), RES(1.1920928955078012062e-7, -1.5707963267948824084e0)},
+ {FN (arctanh), ARG(-8.3886080e+06,1.0e+00), RES(-1.1920928955078012062e-7, 1.5707963267948824084e0)},
+ {FN (arctanh), ARG(-8.3886080e+06,-1.0e+00), RES(-1.1920928955078012062e-7, -1.5707963267948824084e0)},
+ {FN (arctanh), ARG(8.3886080e+06,2.0e+00), RES(1.1920928955077503843e-7, 1.5707963267948681975e0)},
+ {FN (arctanh), ARG(8.3886080e+06,-2.0e+00), RES(1.1920928955077503843e-7, -1.5707963267948681975e0)},
+ {FN (arctanh), ARG(-8.3886080e+06,2.0e+00), RES(-1.1920928955077503843e-7, 1.5707963267948681975e0)},
+ {FN (arctanh), ARG(-8.3886080e+06,-2.0e+00), RES(-1.1920928955077503843e-7, -1.5707963267948681975e0)},
+ {FN (arctanh), ARG(8.3886080e+06,8.3886080e+06), RES(5.9604644775390483828e-8, 1.5707962671902518438e0)},
+ {FN (arctanh), ARG(8.3886080e+06,-8.3886080e+06), RES(5.9604644775390483828e-8, -1.5707962671902518438e0)},
+ {FN (arctanh), ARG(-8.3886080e+06,8.3886080e+06), RES(-5.9604644775390483828e-8, 1.5707962671902518438e0)},
+ {FN (arctanh), ARG(-8.3886080e+06,-8.3886080e+06), RES(-5.9604644775390483828e-8, -1.5707962671902518438e0)},
+ {FN (csc), ARG(-3.45266983001243932001e-04,0.0e+00), RES(-2.8963094332845964291e3, 0.0)},
+ {FN (csc), ARG(3.45266983001243932001e-04,0.0e+00), RES(2.8963094332845964291e3, 0.0)},
+ {FN (csc), ARG(-3.45266983001243932001e-04,1.19209289550781250e-07), RES(-2.8963090880176545869e3, -9.9999986092250876926e-1)},
+ {FN (csc), ARG(-3.45266983001243932001e-04,-1.19209289550781250e-07), RES(-2.8963090880176545869e3, 9.9999986092250876926e-1)},
+ {FN (csc), ARG(3.45266983001243932001e-04,1.19209289550781250e-07), RES(2.8963090880176545869e3, -9.9999986092250876926e-1)},
+ {FN (csc), ARG(3.45266983001243932001e-04,-1.19209289550781250e-07), RES(2.8963090880176545869e3, 9.9999986092250876926e-1)},
+ {FN (csc), ARG(-3.45266983001243932001e-04,5.0e-01), RES(-1.4337901642789801243e-3, -1.9190337944739187237e0)},
+ {FN (csc), ARG(-3.45266983001243932001e-04,-5.0e-01), RES(-1.4337901642789801243e-3, 1.9190337944739187237e0)},
+ {FN (csc), ARG(3.45266983001243932001e-04,5.0e-01), RES(1.4337901642789801243e-3, -1.9190337944739187237e0)},
+ {FN (csc), ARG(3.45266983001243932001e-04,-5.0e-01), RES(1.4337901642789801243e-3, 1.9190337944739187237e0)},
+ {FN (csc), ARG(-3.45266983001243932001e-04,1.0e+00), RES(-3.8576176225198860914e-4, -8.5091800407377002734e-1)},
+ {FN (csc), ARG(-3.45266983001243932001e-04,-1.0e+00), RES(-3.8576176225198860914e-4, 8.5091800407377002734e-1)},
+ {FN (csc), ARG(3.45266983001243932001e-04,1.0e+00), RES(3.8576176225198860914e-4, -8.5091800407377002734e-1)},
+ {FN (csc), ARG(3.45266983001243932001e-04,-1.0e+00), RES(3.8576176225198860914e-4, 8.5091800407377002734e-1)},
+ {FN (csc), ARG(-3.45266983001243932001e-04,2.0e+00), RES(-9.8749461907035665386e-5, -2.7572054583883740768e-1)},
+ {FN (csc), ARG(-3.45266983001243932001e-04,-2.0e+00), RES(-9.8749461907035665386e-5, 2.7572054583883740768e-1)},
+ {FN (csc), ARG(3.45266983001243932001e-04,2.0e+00), RES(9.8749461907035665386e-5, -2.7572054583883740768e-1)},
+ {FN (csc), ARG(3.45266983001243932001e-04,-2.0e+00), RES(9.8749461907035665386e-5, 2.7572054583883740768e-1)},
+ {FN (csc), ARG(1.57045105981189525579e+00,0.0e+00), RES(1.0000000596046477360e0, 0.0)},
+ {FN (csc), ARG(-1.57045105981189525579e+00,0.0e+00), RES(-1.0000000596046477360e0, 0.0)},
+ {FN (csc), ARG(1.57045105981189525579e+00,1.19209289550781250e-07), RES(1.0000000596046406306e0, -4.1159035837716456618e-11)},
+ {FN (csc), ARG(1.57045105981189525579e+00,-1.19209289550781250e-07), RES(1.0000000596046406306e0, 4.1159035837716456618e-11)},
+ {FN (csc), ARG(-1.57045105981189525579e+00,1.19209289550781250e-07), RES(-1.0000000596046406306e0, -4.1159035837716456618e-11)},
+ {FN (csc), ARG(-1.57045105981189525579e+00,-1.19209289550781250e-07), RES(-1.0000000596046406306e0, 4.1159035837716456618e-11)},
+ {FN (csc), ARG(1.57045105981189525579e+00,5.0e-01), RES(8.8681891425248302487e-1, -1.4149533035943115868e-4)},
+ {FN (csc), ARG(1.57045105981189525579e+00,-5.0e-01), RES(8.8681891425248302487e-1, 1.4149533035943115868e-4)},
+ {FN (csc), ARG(-1.57045105981189525579e+00,5.0e-01), RES(-8.8681891425248302487e-1, -1.4149533035943115868e-4)},
+ {FN (csc), ARG(-1.57045105981189525579e+00,-5.0e-01), RES(-8.8681891425248302487e-1, 1.4149533035943115868e-4)},
+ {FN (csc), ARG(1.57045105981189525579e+00,1.0e+00), RES(6.4805426748157480499e-1, -1.7040802567657401279e-4)},
+ {FN (csc), ARG(1.57045105981189525579e+00,-1.0e+00), RES(6.4805426748157480499e-1, 1.7040802567657401279e-4)},
+ {FN (csc), ARG(-1.57045105981189525579e+00,1.0e+00), RES(-6.4805426748157480499e-1, -1.7040802567657401279e-4)},
+ {FN (csc), ARG(-1.57045105981189525579e+00,-1.0e+00), RES(-6.4805426748157480499e-1, 1.7040802567657401279e-4)},
+ {FN (csc), ARG(1.57045105981189525579e+00,2.0e+00), RES(2.6580221522968095406e-1, -8.8471445300404633228e-5)},
+ {FN (csc), ARG(1.57045105981189525579e+00,-2.0e+00), RES(2.6580221522968095406e-1, 8.8471445300404633228e-5)},
+ {FN (csc), ARG(-1.57045105981189525579e+00,2.0e+00), RES(-2.6580221522968095406e-1, -8.8471445300404633228e-5)},
+ {FN (csc), ARG(-1.57045105981189525579e+00,-2.0e+00), RES(-2.6580221522968095406e-1, 8.8471445300404633228e-5)},
+ {FN (csc), ARG(1.57114159377789786021e+00,0.0e+00), RES(1.0000000596046477360e0, 0.0)},
+ {FN (csc), ARG(-1.57114159377789786021e+00,0.0e+00), RES(-1.0000000596046477360e0, 0.0)},
+ {FN (csc), ARG(1.57114159377789786021e+00,1.19209289550781250e-07), RES(1.0000000596046406306e0, 4.1159035837701857686e-11)},
+ {FN (csc), ARG(1.57114159377789786021e+00,-1.19209289550781250e-07), RES(1.0000000596046406306e0, -4.1159035837701857686e-11)},
+ {FN (csc), ARG(-1.57114159377789786021e+00,1.19209289550781250e-07), RES(-1.0000000596046406306e0, 4.1159035837701857686e-11)},
+ {FN (csc), ARG(-1.57114159377789786021e+00,-1.19209289550781250e-07), RES(-1.0000000596046406306e0, -4.1159035837701857686e-11)},
+ {FN (csc), ARG(1.57114159377789786021e+00,5.0e-01), RES(8.8681891425248302485e-1, 1.4149533035938097090e-4)},
+ {FN (csc), ARG(1.57114159377789786021e+00,-5.0e-01), RES(8.8681891425248302485e-1, -1.4149533035938097090e-4)},
+ {FN (csc), ARG(-1.57114159377789786021e+00,5.0e-01), RES(-8.8681891425248302485e-1, 1.4149533035938097090e-4)},
+ {FN (csc), ARG(-1.57114159377789786021e+00,-5.0e-01), RES(-8.8681891425248302485e-1, -1.4149533035938097090e-4)},
+ {FN (csc), ARG(1.57114159377789786021e+00,1.0e+00), RES(6.4805426748157480499e-1, 1.7040802567651356981e-4)},
+ {FN (csc), ARG(1.57114159377789786021e+00,-1.0e+00), RES(6.4805426748157480499e-1, -1.7040802567651356981e-4)},
+ {FN (csc), ARG(-1.57114159377789786021e+00,1.0e+00), RES(-6.4805426748157480499e-1, 1.7040802567651356981e-4)},
+ {FN (csc), ARG(-1.57114159377789786021e+00,-1.0e+00), RES(-6.4805426748157480499e-1, -1.7040802567651356981e-4)},
+ {FN (csc), ARG(1.57114159377789786021e+00,2.0e+00), RES(2.6580221522968095407e-1, 8.8471445300373252796e-5)},
+ {FN (csc), ARG(1.57114159377789786021e+00,-2.0e+00), RES(2.6580221522968095407e-1, -8.8471445300373252796e-5)},
+ {FN (csc), ARG(-1.57114159377789786021e+00,2.0e+00), RES(-2.6580221522968095407e-1, 8.8471445300373252796e-5)},
+ {FN (csc), ARG(-1.57114159377789786021e+00,-2.0e+00), RES(-2.6580221522968095407e-1, -8.8471445300373252796e-5)},
+ {FN (csc), ARG(3.14124738660679181379e+00,0.0e+00), RES(2.8963094332830802676e3, 0.0)},
+ {FN (csc), ARG(-3.14124738660679181379e+00,0.0e+00), RES(-2.8963094332830802676e3, 0.0)},
+ {FN (csc), ARG(3.14124738660679181379e+00,1.19209289550781250e-07), RES(2.8963090880161384259e3, 9.9999986092146180843e-1)},
+ {FN (csc), ARG(3.14124738660679181379e+00,-1.19209289550781250e-07), RES(2.8963090880161384259e3, -9.9999986092146180843e-1)},
+ {FN (csc), ARG(-3.14124738660679181379e+00,1.19209289550781250e-07), RES(-2.8963090880161384259e3, 9.9999986092146180843e-1)},
+ {FN (csc), ARG(-3.14124738660679181379e+00,-1.19209289550781250e-07), RES(-2.8963090880161384259e3, -9.9999986092146180843e-1)},
+ {FN (csc), ARG(3.14124738660679181379e+00,5.0e-01), RES(1.4337901642797306848e-3, 1.9190337944739187227e0)},
+ {FN (csc), ARG(3.14124738660679181379e+00,-5.0e-01), RES(1.4337901642797306848e-3, -1.9190337944739187227e0)},
+ {FN (csc), ARG(-3.14124738660679181379e+00,5.0e-01), RES(-1.4337901642797306848e-3, 1.9190337944739187227e0)},
+ {FN (csc), ARG(-3.14124738660679181379e+00,-5.0e-01), RES(-1.4337901642797306848e-3, -1.9190337944739187227e0)},
+ {FN (csc), ARG(3.14124738660679181379e+00,1.0e+00), RES(3.8576176225219054787e-4, 8.5091800407377002721e-1)},
+ {FN (csc), ARG(3.14124738660679181379e+00,-1.0e+00), RES(3.8576176225219054787e-4, -8.5091800407377002721e-1)},
+ {FN (csc), ARG(-3.14124738660679181379e+00,1.0e+00), RES(-3.8576176225219054787e-4, 8.5091800407377002721e-1)},
+ {FN (csc), ARG(-3.14124738660679181379e+00,-1.0e+00), RES(-3.8576176225219054787e-4, -8.5091800407377002721e-1)},
+ {FN (csc), ARG(3.14124738660679181379e+00,2.0e+00), RES(9.8749461907087358805e-5, 2.7572054583883740766e-1)},
+ {FN (csc), ARG(3.14124738660679181379e+00,-2.0e+00), RES(9.8749461907087358805e-5, -2.7572054583883740766e-1)},
+ {FN (csc), ARG(-3.14124738660679181379e+00,2.0e+00), RES(-9.8749461907087358805e-5, 2.7572054583883740766e-1)},
+ {FN (csc), ARG(-3.14124738660679181379e+00,-2.0e+00), RES(-9.8749461907087358805e-5, -2.7572054583883740766e-1)},
+ {FN (csc), ARG(3.14193792057279441821e+00,0.0e+00), RES(-2.8963094332851348839e3, 0.0)},
+ {FN (csc), ARG(-3.14193792057279441821e+00,0.0e+00), RES(2.8963094332851348839e3, 0.0)},
+ {FN (csc), ARG(3.14193792057279441821e+00,1.19209289550781250e-07), RES(-2.8963090880181930415e3, 9.9999986092288059049e-1)},
+ {FN (csc), ARG(3.14193792057279441821e+00,-1.19209289550781250e-07), RES(-2.8963090880181930415e3, -9.9999986092288059049e-1)},
+ {FN (csc), ARG(-3.14193792057279441821e+00,1.19209289550781250e-07), RES(2.8963090880181930415e3, 9.9999986092288059049e-1)},
+ {FN (csc), ARG(-3.14193792057279441821e+00,-1.19209289550781250e-07), RES(2.8963090880181930415e3, -9.9999986092288059049e-1)},
+ {FN (csc), ARG(3.14193792057279441821e+00,5.0e-01), RES(-1.4337901642787135676e-3, 1.9190337944739187241e0)},
+ {FN (csc), ARG(3.14193792057279441821e+00,-5.0e-01), RES(-1.4337901642787135676e-3, -1.9190337944739187241e0)},
+ {FN (csc), ARG(-3.14193792057279441821e+00,5.0e-01), RES(1.4337901642787135676e-3, 1.9190337944739187241e0)},
+ {FN (csc), ARG(-3.14193792057279441821e+00,-5.0e-01), RES(1.4337901642787135676e-3, -1.9190337944739187241e0)},
+ {FN (csc), ARG(3.14193792057279441821e+00,1.0e+00), RES(-3.8576176225191689193e-4, 8.5091800407377002738e-1)},
+ {FN (csc), ARG(3.14193792057279441821e+00,-1.0e+00), RES(-3.8576176225191689193e-4, -8.5091800407377002738e-1)},
+ {FN (csc), ARG(-3.14193792057279441821e+00,1.0e+00), RES(3.8576176225191689193e-4, 8.5091800407377002738e-1)},
+ {FN (csc), ARG(-3.14193792057279441821e+00,-1.0e+00), RES(3.8576176225191689193e-4, -8.5091800407377002738e-1)},
+ {FN (csc), ARG(3.14193792057279441821e+00,2.0e+00), RES(-9.8749461907017306810e-5, 2.7572054583883740769e-1)},
+ {FN (csc), ARG(3.14193792057279441821e+00,-2.0e+00), RES(-9.8749461907017306810e-5, -2.7572054583883740769e-1)},
+ {FN (csc), ARG(-3.14193792057279441821e+00,2.0e+00), RES(9.8749461907017306810e-5, 2.7572054583883740769e-1)},
+ {FN (csc), ARG(-3.14193792057279441821e+00,-2.0e+00), RES(9.8749461907017306810e-5, -2.7572054583883740769e-1)},
+ {FN (csc), ARG(4.71204371340168837179e+00,0.0e+00), RES(-1.0000000596046477361e0, 0.0)},
+ {FN (csc), ARG(-4.71204371340168837179e+00,0.0e+00), RES(1.0000000596046477361e0, 0.0)},
+ {FN (csc), ARG(4.71204371340168837179e+00,1.19209289550781250e-07), RES(-1.0000000596046406306e0, 4.1159035837731055550e-11)},
+ {FN (csc), ARG(4.71204371340168837179e+00,-1.19209289550781250e-07), RES(-1.0000000596046406306e0, -4.1159035837731055550e-11)},
+ {FN (csc), ARG(-4.71204371340168837179e+00,1.19209289550781250e-07), RES(1.0000000596046406306e0, 4.1159035837731055550e-11)},
+ {FN (csc), ARG(-4.71204371340168837179e+00,-1.19209289550781250e-07), RES(1.0000000596046406306e0, -4.1159035837731055550e-11)},
+ {FN (csc), ARG(4.71204371340168837179e+00,5.0e-01), RES(-8.8681891425248302489e-1, 1.4149533035948134646e-4)},
+ {FN (csc), ARG(4.71204371340168837179e+00,-5.0e-01), RES(-8.8681891425248302489e-1, -1.4149533035948134646e-4)},
+ {FN (csc), ARG(-4.71204371340168837179e+00,5.0e-01), RES(8.8681891425248302489e-1, 1.4149533035948134646e-4)},
+ {FN (csc), ARG(-4.71204371340168837179e+00,-5.0e-01), RES(8.8681891425248302489e-1, -1.4149533035948134646e-4)},
+ {FN (csc), ARG(4.71204371340168837179e+00,1.0e+00), RES(-6.4805426748157480498e-1, 1.7040802567663445577e-4)},
+ {FN (csc), ARG(4.71204371340168837179e+00,-1.0e+00), RES(-6.4805426748157480498e-1, -1.7040802567663445577e-4)},
+ {FN (csc), ARG(-4.71204371340168837179e+00,1.0e+00), RES(6.4805426748157480498e-1, 1.7040802567663445577e-4)},
+ {FN (csc), ARG(-4.71204371340168837179e+00,-1.0e+00), RES(6.4805426748157480498e-1, -1.7040802567663445577e-4)},
+ {FN (csc), ARG(4.71204371340168837179e+00,2.0e+00), RES(-2.6580221522968095405e-1, 8.8471445300436013659e-5)},
+ {FN (csc), ARG(4.71204371340168837179e+00,-2.0e+00), RES(-2.6580221522968095405e-1, -8.8471445300436013659e-5)},
+ {FN (csc), ARG(-4.71204371340168837179e+00,2.0e+00), RES(2.6580221522968095405e-1, 8.8471445300436013659e-5)},
+ {FN (csc), ARG(-4.71204371340168837179e+00,-2.0e+00), RES(2.6580221522968095405e-1, -8.8471445300436013659e-5)},
+ {FN (csc), ARG(4.71273424736769097620e+00,0.0e+00), RES(-1.0000000596046477359e0, 0.0)},
+ {FN (csc), ARG(-4.71273424736769097620e+00,0.0e+00), RES(1.0000000596046477359e0, 0.0)},
+ {FN (csc), ARG(4.71273424736769097620e+00,1.19209289550781250e-07), RES(-1.0000000596046406305e0, -4.1159035837687258754e-11)},
+ {FN (csc), ARG(4.71273424736769097620e+00,-1.19209289550781250e-07), RES(-1.0000000596046406305e0, 4.1159035837687258754e-11)},
+ {FN (csc), ARG(-4.71273424736769097620e+00,1.19209289550781250e-07), RES(1.0000000596046406305e0, -4.1159035837687258754e-11)},
+ {FN (csc), ARG(-4.71273424736769097620e+00,-1.19209289550781250e-07), RES(1.0000000596046406305e0, 4.1159035837687258754e-11)},
+ {FN (csc), ARG(4.71273424736769097620e+00,5.0e-01), RES(-8.8681891425248302483e-1, -1.4149533035933078312e-4)},
+ {FN (csc), ARG(4.71273424736769097620e+00,-5.0e-01), RES(-8.8681891425248302483e-1, 1.4149533035933078312e-4)},
+ {FN (csc), ARG(-4.71273424736769097620e+00,5.0e-01), RES(8.8681891425248302483e-1, -1.4149533035933078312e-4)},
+ {FN (csc), ARG(-4.71273424736769097620e+00,-5.0e-01), RES(8.8681891425248302483e-1, 1.4149533035933078312e-4)},
+ {FN (csc), ARG(4.71273424736769097620e+00,1.0e+00), RES(-6.480542674815748050e-1, -1.7040802567645312683e-4)},
+ {FN (csc), ARG(4.71273424736769097620e+00,-1.0e+00), RES(-6.480542674815748050e-1, 1.7040802567645312683e-4)},
+ {FN (csc), ARG(-4.71273424736769097620e+00,1.0e+00), RES(6.480542674815748050e-1, -1.7040802567645312683e-4)},
+ {FN (csc), ARG(-4.71273424736769097620e+00,-1.0e+00), RES(6.480542674815748050e-1, 1.7040802567645312683e-4)},
+ {FN (csc), ARG(4.71273424736769097620e+00,2.0e+00), RES(-2.6580221522968095408e-1, -8.8471445300341872364e-5)},
+ {FN (csc), ARG(4.71273424736769097620e+00,-2.0e+00), RES(-2.6580221522968095408e-1, 8.8471445300341872364e-5)},
+ {FN (csc), ARG(-4.71273424736769097620e+00,2.0e+00), RES(2.6580221522968095408e-1, -8.8471445300341872364e-5)},
+ {FN (csc), ARG(-4.71273424736769097620e+00,-2.0e+00), RES(2.6580221522968095408e-1, 8.8471445300341872364e-5)},
+ {FN (csc), ARG(6.28284004019658492979e+00,0.0e+00), RES(-2.8963094332820529594e3, 0.0)},
+ {FN (csc), ARG(-6.28284004019658492979e+00,0.0e+00), RES(2.8963094332820529594e3, 0.0)},
+ {FN (csc), ARG(6.28284004019658492979e+00,1.19209289550781250e-07), RES(-2.8963090880151111181e3, -9.9999986092075241740e-1)},
+ {FN (csc), ARG(6.28284004019658492979e+00,-1.19209289550781250e-07), RES(-2.8963090880151111181e3, 9.9999986092075241740e-1)},
+ {FN (csc), ARG(-6.28284004019658492979e+00,1.19209289550781250e-07), RES(2.8963090880151111181e3, -9.9999986092075241740e-1)},
+ {FN (csc), ARG(-6.28284004019658492979e+00,-1.19209289550781250e-07), RES(2.8963090880151111181e3, 9.9999986092075241740e-1)},
+ {FN (csc), ARG(6.28284004019658492979e+00,5.0e-01), RES(-1.4337901642802392434e-3, -1.9190337944739187220e0)},
+ {FN (csc), ARG(6.28284004019658492979e+00,-5.0e-01), RES(-1.4337901642802392434e-3, 1.9190337944739187220e0)},
+ {FN (csc), ARG(-6.28284004019658492979e+00,5.0e-01), RES(1.4337901642802392434e-3, -1.9190337944739187220e0)},
+ {FN (csc), ARG(-6.28284004019658492979e+00,-5.0e-01), RES(1.4337901642802392434e-3, 1.9190337944739187220e0)},
+ {FN (csc), ARG(6.28284004019658492979e+00,1.0e+00), RES(-3.8576176225232737584e-4, -8.5091800407377002712e-1)},
+ {FN (csc), ARG(6.28284004019658492979e+00,-1.0e+00), RES(-3.8576176225232737584e-4, 8.5091800407377002712e-1)},
+ {FN (csc), ARG(-6.28284004019658492979e+00,1.0e+00), RES(3.8576176225232737584e-4, -8.5091800407377002712e-1)},
+ {FN (csc), ARG(-6.28284004019658492979e+00,-1.0e+00), RES(3.8576176225232737584e-4, 8.5091800407377002712e-1)},
+ {FN (csc), ARG(6.28284004019658492979e+00,2.0e+00), RES(-9.8749461907122384803e-5, -2.7572054583883740765e-1)},
+ {FN (csc), ARG(6.28284004019658492979e+00,-2.0e+00), RES(-9.8749461907122384803e-5, 2.7572054583883740765e-1)},
+ {FN (csc), ARG(-6.28284004019658492979e+00,2.0e+00), RES(9.8749461907122384803e-5, -2.7572054583883740765e-1)},
+ {FN (csc), ARG(-6.28284004019658492979e+00,-2.0e+00), RES(9.8749461907122384803e-5, 2.7572054583883740765e-1)},
+ {FN (csc), ARG(6.28353057416258753420e+00,0.0e+00), RES(2.8963094332861621921e3, 0.0)},
+ {FN (csc), ARG(-6.28353057416258753420e+00,0.0e+00), RES(-2.8963094332861621921e3, 0.0)},
+ {FN (csc), ARG(6.28353057416258753420e+00,1.19209289550781250e-07), RES(2.8963090880192203493e3, -9.9999986092358998153e-1)},
+ {FN (csc), ARG(6.28353057416258753420e+00,-1.19209289550781250e-07), RES(2.8963090880192203493e3, 9.9999986092358998153e-1)},
+ {FN (csc), ARG(-6.28353057416258753420e+00,1.19209289550781250e-07), RES(-2.8963090880192203493e3, -9.9999986092358998153e-1)},
+ {FN (csc), ARG(-6.28353057416258753420e+00,-1.19209289550781250e-07), RES(-2.8963090880192203493e3, 9.9999986092358998153e-1)},
+ {FN (csc), ARG(6.28353057416258753420e+00,5.0e-01), RES(1.4337901642782050091e-3, -1.9190337944739187248e0)},
+ {FN (csc), ARG(6.28353057416258753420e+00,-5.0e-01), RES(1.4337901642782050091e-3, 1.9190337944739187248e0)},
+ {FN (csc), ARG(-6.28353057416258753420e+00,5.0e-01), RES(-1.4337901642782050091e-3, -1.9190337944739187248e0)},
+ {FN (csc), ARG(-6.28353057416258753420e+00,-5.0e-01), RES(-1.4337901642782050091e-3, 1.9190337944739187248e0)},
+ {FN (csc), ARG(6.28353057416258753420e+00,1.0e+00), RES(3.8576176225178006396e-4, -8.5091800407377002747e-1)},
+ {FN (csc), ARG(6.28353057416258753420e+00,-1.0e+00), RES(3.8576176225178006396e-4, 8.5091800407377002747e-1)},
+ {FN (csc), ARG(-6.28353057416258753420e+00,1.0e+00), RES(-3.8576176225178006396e-4, -8.5091800407377002747e-1)},
+ {FN (csc), ARG(-6.28353057416258753420e+00,-1.0e+00), RES(-3.8576176225178006396e-4, 8.5091800407377002747e-1)},
+ {FN (csc), ARG(6.28353057416258753420e+00,2.0e+00), RES(9.8749461906982280812e-5, -2.7572054583883740770e-1)},
+ {FN (csc), ARG(6.28353057416258753420e+00,-2.0e+00), RES(9.8749461906982280812e-5, 2.7572054583883740770e-1)},
+ {FN (csc), ARG(-6.28353057416258753420e+00,2.0e+00), RES(-9.8749461906982280812e-5, -2.7572054583883740770e-1)},
+ {FN (csc), ARG(-6.28353057416258753420e+00,-2.0e+00), RES(-9.8749461906982280812e-5, 2.7572054583883740770e-1)},
+ {FN (csc), ARG(9.42443269378637893396e+00,0.0e+00), RES(2.8963094332884762317e3, 0.0)},
+ {FN (csc), ARG(-9.42443269378637893396e+00,0.0e+00), RES(-2.8963094332884762317e3, 0.0)},
+ {FN (csc), ARG(9.42443269378637893396e+00,1.19209289550781250e-07), RES(2.8963090880215343881e3, 9.9999986092518790411e-1)},
+ {FN (csc), ARG(9.42443269378637893396e+00,-1.19209289550781250e-07), RES(2.8963090880215343881e3, -9.9999986092518790411e-1)},
+ {FN (csc), ARG(-9.42443269378637893396e+00,1.19209289550781250e-07), RES(-2.8963090880215343881e3, 9.9999986092518790411e-1)},
+ {FN (csc), ARG(-9.42443269378637893396e+00,-1.19209289550781250e-07), RES(-2.8963090880215343881e3, -9.9999986092518790411e-1)},
+ {FN (csc), ARG(9.42443269378637893396e+00,5.0e-01), RES(1.4337901642770594670e-3, 1.9190337944739187263e0)},
+ {FN (csc), ARG(9.42443269378637893396e+00,-5.0e-01), RES(1.4337901642770594670e-3, -1.9190337944739187263e0)},
+ {FN (csc), ARG(-9.42443269378637893396e+00,5.0e-01), RES(-1.4337901642770594670e-3, 1.9190337944739187263e0)},
+ {FN (csc), ARG(-9.42443269378637893396e+00,-5.0e-01), RES(-1.4337901642770594670e-3, -1.9190337944739187263e0)},
+ {FN (csc), ARG(9.42443269378637893396e+00,1.0e+00), RES(3.8576176225147185523e-4, 8.5091800407377002767e-1)},
+ {FN (csc), ARG(9.42443269378637893396e+00,-1.0e+00), RES(3.8576176225147185523e-4, -8.5091800407377002767e-1)},
+ {FN (csc), ARG(-9.42443269378637893396e+00,1.0e+00), RES(-3.8576176225147185523e-4, 8.5091800407377002767e-1)},
+ {FN (csc), ARG(-9.42443269378637893396e+00,-1.0e+00), RES(-3.8576176225147185523e-4, -8.5091800407377002767e-1)},
+ {FN (csc), ARG(9.42443269378637893396e+00,2.0e+00), RES(9.874946190690338380e-5, 2.7572054583883740773e-1)},
+ {FN (csc), ARG(9.42443269378637893396e+00,-2.0e+00), RES(9.874946190690338380e-5, -2.7572054583883740773e-1)},
+ {FN (csc), ARG(-9.42443269378637893396e+00,2.0e+00), RES(-9.874946190690338380e-5, 2.7572054583883740773e-1)},
+ {FN (csc), ARG(-9.42443269378637893396e+00,-2.0e+00), RES(-9.874946190690338380e-5, -2.7572054583883740773e-1)},
+ {FN (csc), ARG(9.42512322775237976202e+00,0.0e+00), RES(-2.8963094332946400807e3, 0.0)},
+ {FN (csc), ARG(-9.42512322775237976202e+00,0.0e+00), RES(2.8963094332946400807e3, 0.0)},
+ {FN (csc), ARG(9.42512322775237976202e+00,1.19209289550781250e-07), RES(-2.8963090880276982349e3, 9.9999986092944425030e-1)},
+ {FN (csc), ARG(9.42512322775237976202e+00,-1.19209289550781250e-07), RES(-2.8963090880276982349e3, -9.9999986092944425030e-1)},
+ {FN (csc), ARG(-9.42512322775237976202e+00,1.19209289550781250e-07), RES(2.8963090880276982349e3, 9.9999986092944425030e-1)},
+ {FN (csc), ARG(-9.42512322775237976202e+00,-1.19209289550781250e-07), RES(2.8963090880276982349e3, -9.9999986092944425030e-1)},
+ {FN (csc), ARG(9.42512322775237976202e+00,5.0e-01), RES(-1.4337901642740081154e-3, 1.9190337944739187304e0)},
+ {FN (csc), ARG(9.42512322775237976202e+00,-5.0e-01), RES(-1.4337901642740081154e-3, -1.9190337944739187304e0)},
+ {FN (csc), ARG(-9.42512322775237976202e+00,5.0e-01), RES(1.4337901642740081154e-3, 1.9190337944739187304e0)},
+ {FN (csc), ARG(-9.42512322775237976202e+00,-5.0e-01), RES(1.4337901642740081154e-3, -1.9190337944739187304e0)},
+ {FN (csc), ARG(9.42512322775237976202e+00,1.0e+00), RES(-3.8576176225065088741e-4, 8.5091800407377002820e-1)},
+ {FN (csc), ARG(9.42512322775237976202e+00,-1.0e+00), RES(-3.8576176225065088741e-4, -8.5091800407377002820e-1)},
+ {FN (csc), ARG(-9.42512322775237976202e+00,1.0e+00), RES(3.8576176225065088741e-4, 8.5091800407377002820e-1)},
+ {FN (csc), ARG(-9.42512322775237976202e+00,-1.0e+00), RES(3.8576176225065088741e-4, -8.5091800407377002820e-1)},
+ {FN (csc), ARG(9.42512322775237976202e+00,2.0e+00), RES(-9.8749461906693227814e-5, 2.7572054583883740781e-1)},
+ {FN (csc), ARG(9.42512322775237976202e+00,-2.0e+00), RES(-9.8749461906693227814e-5, -2.7572054583883740781e-1)},
+ {FN (csc), ARG(-9.42512322775237976202e+00,2.0e+00), RES(9.8749461906693227814e-5, 2.7572054583883740781e-1)},
+ {FN (csc), ARG(-9.42512322775237976202e+00,-2.0e+00), RES(9.8749461906693227814e-5, -2.7572054583883740781e-1)},
+ {FN (sec), ARG(-3.45266983001243932001e-04,0.0e+00), RES(1.0000000596046477360e0, 0.0)},
+ {FN (sec), ARG(3.45266983001243932001e-04,0.0e+00), RES(1.0000000596046477360e0, 0.0)},
+ {FN (sec), ARG(-3.45266983001243932001e-04,1.19209289550781250e-07), RES(1.0000000596046406306e0, -4.1159035837702210125e-11)},
+ {FN (sec), ARG(-3.45266983001243932001e-04,-1.19209289550781250e-07), RES(1.0000000596046406306e0, 4.1159035837702210125e-11)},
+ {FN (sec), ARG(3.45266983001243932001e-04,1.19209289550781250e-07), RES(1.0000000596046406306e0, 4.1159035837702210125e-11)},
+ {FN (sec), ARG(3.45266983001243932001e-04,-1.19209289550781250e-07), RES(1.0000000596046406306e0, -4.1159035837702210125e-11)},
+ {FN (sec), ARG(-3.45266983001243932001e-04,5.0e-01), RES(8.8681891425248302485e-1, -1.4149533035938218250e-4)},
+ {FN (sec), ARG(-3.45266983001243932001e-04,-5.0e-01), RES(8.8681891425248302485e-1, 1.4149533035938218250e-4)},
+ {FN (sec), ARG(3.45266983001243932001e-04,5.0e-01), RES(8.8681891425248302485e-1, 1.4149533035938218250e-4)},
+ {FN (sec), ARG(3.45266983001243932001e-04,-5.0e-01), RES(8.8681891425248302485e-1, -1.4149533035938218250e-4)},
+ {FN (sec), ARG(-3.45266983001243932001e-04,1.0e+00), RES(6.4805426748157480499e-1, -1.7040802567651502899e-4)},
+ {FN (sec), ARG(-3.45266983001243932001e-04,-1.0e+00), RES(6.4805426748157480499e-1, 1.7040802567651502899e-4)},
+ {FN (sec), ARG(3.45266983001243932001e-04,1.0e+00), RES(6.4805426748157480499e-1, 1.7040802567651502899e-4)},
+ {FN (sec), ARG(3.45266983001243932001e-04,-1.0e+00), RES(6.4805426748157480499e-1, -1.7040802567651502899e-4)},
+ {FN (sec), ARG(-3.45266983001243932001e-04,2.0e+00), RES(2.6580221522968095407e-1, -8.8471445300374010365e-5)},
+ {FN (sec), ARG(-3.45266983001243932001e-04,-2.0e+00), RES(2.6580221522968095407e-1, 8.8471445300374010365e-5)},
+ {FN (sec), ARG(3.45266983001243932001e-04,2.0e+00), RES(2.6580221522968095407e-1, 8.8471445300374010365e-5)},
+ {FN (sec), ARG(3.45266983001243932001e-04,-2.0e+00), RES(2.6580221522968095407e-1, -8.8471445300374010365e-5)},
+ {FN (sec), ARG(1.57045105981189525579e+00,0.0e+00), RES(2.8963094332835939217e3, 0.0)},
+ {FN (sec), ARG(-1.57045105981189525579e+00,0.0e+00), RES(2.8963094332835939217e3, 0.0)},
+ {FN (sec), ARG(1.57045105981189525579e+00,1.19209289550781250e-07), RES(2.8963090880166520798e3, 9.9999986092181650394e-1)},
+ {FN (sec), ARG(1.57045105981189525579e+00,-1.19209289550781250e-07), RES(2.8963090880166520798e3, -9.9999986092181650394e-1)},
+ {FN (sec), ARG(-1.57045105981189525579e+00,1.19209289550781250e-07), RES(2.8963090880166520798e3, -9.9999986092181650394e-1)},
+ {FN (sec), ARG(-1.57045105981189525579e+00,-1.19209289550781250e-07), RES(2.8963090880166520798e3, 9.9999986092181650394e-1)},
+ {FN (sec), ARG(1.57045105981189525579e+00,5.0e-01), RES(1.4337901642794764055e-3, 1.9190337944739187231e0)},
+ {FN (sec), ARG(1.57045105981189525579e+00,-5.0e-01), RES(1.4337901642794764055e-3, -1.9190337944739187231e0)},
+ {FN (sec), ARG(-1.57045105981189525579e+00,5.0e-01), RES(1.4337901642794764055e-3, -1.9190337944739187231e0)},
+ {FN (sec), ARG(-1.57045105981189525579e+00,-5.0e-01), RES(1.4337901642794764055e-3, 1.9190337944739187231e0)},
+ {FN (sec), ARG(1.57045105981189525579e+00,1.0e+00), RES(3.8576176225212213388e-4, 8.5091800407377002725e-1)},
+ {FN (sec), ARG(1.57045105981189525579e+00,-1.0e+00), RES(3.8576176225212213388e-4, -8.5091800407377002725e-1)},
+ {FN (sec), ARG(-1.57045105981189525579e+00,1.0e+00), RES(3.8576176225212213388e-4, -8.5091800407377002725e-1)},
+ {FN (sec), ARG(-1.57045105981189525579e+00,-1.0e+00), RES(3.8576176225212213388e-4, 8.5091800407377002725e-1)},
+ {FN (sec), ARG(1.57045105981189525579e+00,2.0e+00), RES(9.8749461907069845806e-5, 2.7572054583883740767e-1)},
+ {FN (sec), ARG(1.57045105981189525579e+00,-2.0e+00), RES(9.8749461907069845806e-5, -2.7572054583883740767e-1)},
+ {FN (sec), ARG(-1.57045105981189525579e+00,2.0e+00), RES(9.8749461907069845806e-5, -2.7572054583883740767e-1)},
+ {FN (sec), ARG(-1.57045105981189525579e+00,-2.0e+00), RES(9.8749461907069845806e-5, 2.7572054583883740767e-1)},
+ {FN (sec), ARG(1.57114159377789786021e+00,0.0e+00), RES(-2.8963094332846212298e3, 0.0)},
+ {FN (sec), ARG(-1.57114159377789786021e+00,0.0e+00), RES(-2.8963094332846212298e3, 0.0)},
+ {FN (sec), ARG(1.57114159377789786021e+00,1.19209289550781250e-07), RES(-2.8963090880176793876e3, 9.9999986092252589498e-1)},
+ {FN (sec), ARG(1.57114159377789786021e+00,-1.19209289550781250e-07), RES(-2.8963090880176793876e3, -9.9999986092252589498e-1)},
+ {FN (sec), ARG(-1.57114159377789786021e+00,1.19209289550781250e-07), RES(-2.8963090880176793876e3, -9.9999986092252589498e-1)},
+ {FN (sec), ARG(-1.57114159377789786021e+00,-1.19209289550781250e-07), RES(-2.8963090880176793876e3, 9.9999986092252589498e-1)},
+ {FN (sec), ARG(1.57114159377789786021e+00,5.0e-01), RES(-1.4337901642789678469e-3, 1.9190337944739187237e0)},
+ {FN (sec), ARG(1.57114159377789786021e+00,-5.0e-01), RES(-1.4337901642789678469e-3, -1.9190337944739187237e0)},
+ {FN (sec), ARG(-1.57114159377789786021e+00,5.0e-01), RES(-1.4337901642789678469e-3, -1.9190337944739187237e0)},
+ {FN (sec), ARG(-1.57114159377789786021e+00,-5.0e-01), RES(-1.4337901642789678469e-3, 1.9190337944739187237e0)},
+ {FN (sec), ARG(1.57114159377789786021e+00,1.0e+00), RES(-3.8576176225198530591e-4, 8.5091800407377002734e-1)},
+ {FN (sec), ARG(1.57114159377789786021e+00,-1.0e+00), RES(-3.8576176225198530591e-4, -8.5091800407377002734e-1)},
+ {FN (sec), ARG(-1.57114159377789786021e+00,1.0e+00), RES(-3.8576176225198530591e-4, -8.5091800407377002734e-1)},
+ {FN (sec), ARG(-1.57114159377789786021e+00,-1.0e+00), RES(-3.8576176225198530591e-4, 8.5091800407377002734e-1)},
+ {FN (sec), ARG(1.57114159377789786021e+00,2.0e+00), RES(-9.8749461907034819809e-5, 2.7572054583883740768e-1)},
+ {FN (sec), ARG(1.57114159377789786021e+00,-2.0e+00), RES(-9.8749461907034819809e-5, -2.7572054583883740768e-1)},
+ {FN (sec), ARG(-1.57114159377789786021e+00,2.0e+00), RES(-9.8749461907034819809e-5, -2.7572054583883740768e-1)},
+ {FN (sec), ARG(-1.57114159377789786021e+00,-2.0e+00), RES(-9.8749461907034819809e-5, 2.7572054583883740768e-1)},
+ {FN (sec), ARG(3.14124738660679181379e+00,0.0e+00), RES(-1.0000000596046477360e0, 0.0)},
+ {FN (sec), ARG(-3.14124738660679181379e+00,0.0e+00), RES(-1.0000000596046477360e0, 0.0)},
+ {FN (sec), ARG(3.14124738660679181379e+00,1.19209289550781250e-07), RES(-1.0000000596046406306e0, 4.1159035837723756084e-11)},
+ {FN (sec), ARG(3.14124738660679181379e+00,-1.19209289550781250e-07), RES(-1.0000000596046406306e0, -4.1159035837723756084e-11)},
+ {FN (sec), ARG(-3.14124738660679181379e+00,1.19209289550781250e-07), RES(-1.0000000596046406306e0, -4.1159035837723756084e-11)},
+ {FN (sec), ARG(-3.14124738660679181379e+00,-1.19209289550781250e-07), RES(-1.0000000596046406306e0, 4.1159035837723756084e-11)},
+ {FN (sec), ARG(3.14124738660679181379e+00,5.0e-01), RES(-8.8681891425248302488e-1, 1.4149533035945625257e-4)},
+ {FN (sec), ARG(3.14124738660679181379e+00,-5.0e-01), RES(-8.8681891425248302488e-1, -1.4149533035945625257e-4)},
+ {FN (sec), ARG(-3.14124738660679181379e+00,5.0e-01), RES(-8.8681891425248302488e-1, -1.4149533035945625257e-4)},
+ {FN (sec), ARG(-3.14124738660679181379e+00,-5.0e-01), RES(-8.8681891425248302488e-1, 1.4149533035945625257e-4)},
+ {FN (sec), ARG(3.14124738660679181379e+00,1.0e+00), RES(-6.4805426748157480499e-1, 1.7040802567660423428e-4)},
+ {FN (sec), ARG(3.14124738660679181379e+00,-1.0e+00), RES(-6.4805426748157480499e-1, -1.7040802567660423428e-4)},
+ {FN (sec), ARG(-3.14124738660679181379e+00,1.0e+00), RES(-6.4805426748157480499e-1, -1.7040802567660423428e-4)},
+ {FN (sec), ARG(-3.14124738660679181379e+00,-1.0e+00), RES(-6.4805426748157480499e-1, 1.7040802567660423428e-4)},
+ {FN (sec), ARG(3.14124738660679181379e+00,2.0e+00), RES(-2.6580221522968095405e-1, 8.8471445300420323443e-5)},
+ {FN (sec), ARG(3.14124738660679181379e+00,-2.0e+00), RES(-2.6580221522968095405e-1, -8.8471445300420323443e-5)},
+ {FN (sec), ARG(-3.14124738660679181379e+00,2.0e+00), RES(-2.6580221522968095405e-1, -8.8471445300420323443e-5)},
+ {FN (sec), ARG(-3.14124738660679181379e+00,-2.0e+00), RES(-2.6580221522968095405e-1, 8.8471445300420323443e-5)},
+ {FN (sec), ARG(3.14193792057279441821e+00,0.0e+00), RES(-1.0000000596046477360e0, 0.0)},
+ {FN (sec), ARG(-3.14193792057279441821e+00,0.0e+00), RES(-1.0000000596046477360e0, 0.0)},
+ {FN (sec), ARG(3.14193792057279441821e+00,1.19209289550781250e-07), RES(-1.0000000596046406305e0, -4.1159035837694558220e-11)},
+ {FN (sec), ARG(3.14193792057279441821e+00,-1.19209289550781250e-07), RES(-1.0000000596046406305e0, 4.1159035837694558220e-11)},
+ {FN (sec), ARG(-3.14193792057279441821e+00,1.19209289550781250e-07), RES(-1.0000000596046406305e0, 4.1159035837694558220e-11)},
+ {FN (sec), ARG(-3.14193792057279441821e+00,-1.19209289550781250e-07), RES(-1.0000000596046406305e0, -4.1159035837694558220e-11)},
+ {FN (sec), ARG(3.14193792057279441821e+00,5.0e-01), RES(-8.8681891425248302484e-1, -1.4149533035935587701e-4)},
+ {FN (sec), ARG(3.14193792057279441821e+00,-5.0e-01), RES(-8.8681891425248302484e-1, 1.4149533035935587701e-4)},
+ {FN (sec), ARG(-3.14193792057279441821e+00,5.0e-01), RES(-8.8681891425248302484e-1, 1.4149533035935587701e-4)},
+ {FN (sec), ARG(-3.14193792057279441821e+00,-5.0e-01), RES(-8.8681891425248302484e-1, -1.4149533035935587701e-4)},
+ {FN (sec), ARG(3.14193792057279441821e+00,1.0e+00), RES(-6.4805426748157480499e-1, -1.7040802567648334832e-4)},
+ {FN (sec), ARG(3.14193792057279441821e+00,-1.0e+00), RES(-6.4805426748157480499e-1, 1.7040802567648334832e-4)},
+ {FN (sec), ARG(-3.14193792057279441821e+00,1.0e+00), RES(-6.4805426748157480499e-1, 1.7040802567648334832e-4)},
+ {FN (sec), ARG(-3.14193792057279441821e+00,-1.0e+00), RES(-6.4805426748157480499e-1, -1.7040802567648334832e-4)},
+ {FN (sec), ARG(3.14193792057279441821e+00,2.0e+00), RES(-2.6580221522968095407e-1, -8.8471445300357562580e-5)},
+ {FN (sec), ARG(3.14193792057279441821e+00,-2.0e+00), RES(-2.6580221522968095407e-1, 8.8471445300357562580e-5)},
+ {FN (sec), ARG(-3.14193792057279441821e+00,2.0e+00), RES(-2.6580221522968095407e-1, 8.8471445300357562580e-5)},
+ {FN (sec), ARG(-3.14193792057279441821e+00,-2.0e+00), RES(-2.6580221522968095407e-1, -8.8471445300357562580e-5)},
+ {FN (sec), ARG(4.71204371340168837179e+00,0.0e+00), RES(-2.8963094332825666135e3, 0.0)},
+ {FN (sec), ARG(-4.71204371340168837179e+00,0.0e+00), RES(-2.8963094332825666135e3, 0.0)},
+ {FN (sec), ARG(4.71204371340168837179e+00,1.19209289550781250e-07), RES(-2.8963090880156247720e3, -9.9999986092110711291e-1)},
+ {FN (sec), ARG(4.71204371340168837179e+00,-1.19209289550781250e-07), RES(-2.8963090880156247720e3, 9.9999986092110711291e-1)},
+ {FN (sec), ARG(-4.71204371340168837179e+00,1.19209289550781250e-07), RES(-2.8963090880156247720e3, 9.9999986092110711291e-1)},
+ {FN (sec), ARG(-4.71204371340168837179e+00,-1.19209289550781250e-07), RES(-2.8963090880156247720e3, -9.9999986092110711291e-1)},
+ {FN (sec), ARG(4.71204371340168837179e+00,5.0e-01), RES(-1.4337901642799849641e-3, -1.9190337944739187224e0)},
+ {FN (sec), ARG(4.71204371340168837179e+00,-5.0e-01), RES(-1.4337901642799849641e-3, 1.9190337944739187224e0)},
+ {FN (sec), ARG(-4.71204371340168837179e+00,5.0e-01), RES(-1.4337901642799849641e-3, 1.9190337944739187224e0)},
+ {FN (sec), ARG(-4.71204371340168837179e+00,-5.0e-01), RES(-1.4337901642799849641e-3, -1.9190337944739187224e0)},
+ {FN (sec), ARG(4.71204371340168837179e+00,1.0e+00), RES(-3.8576176225225896185e-4, -8.5091800407377002716e-1)},
+ {FN (sec), ARG(4.71204371340168837179e+00,-1.0e+00), RES(-3.8576176225225896185e-4, 8.5091800407377002716e-1)},
+ {FN (sec), ARG(-4.71204371340168837179e+00,1.0e+00), RES(-3.8576176225225896185e-4, 8.5091800407377002716e-1)},
+ {FN (sec), ARG(-4.71204371340168837179e+00,-1.0e+00), RES(-3.8576176225225896185e-4, -8.5091800407377002716e-1)},
+ {FN (sec), ARG(4.71204371340168837179e+00,2.0e+00), RES(-9.8749461907104871804e-5, -2.7572054583883740766e-1)},
+ {FN (sec), ARG(4.71204371340168837179e+00,-2.0e+00), RES(-9.8749461907104871804e-5, 2.7572054583883740766e-1)},
+ {FN (sec), ARG(-4.71204371340168837179e+00,2.0e+00), RES(-9.8749461907104871804e-5, 2.7572054583883740766e-1)},
+ {FN (sec), ARG(-4.71204371340168837179e+00,-2.0e+00), RES(-9.8749461907104871804e-5, -2.7572054583883740766e-1)},
+ {FN (sec), ARG(4.71273424736769097620e+00,0.0e+00), RES(2.8963094332856485380e3, 0.0)},
+ {FN (sec), ARG(-4.71273424736769097620e+00,0.0e+00), RES(2.8963094332856485380e3, 0.0)},
+ {FN (sec), ARG(4.71273424736769097620e+00,1.19209289550781250e-07), RES(2.8963090880187066954e3, -9.9999986092323528601e-1)},
+ {FN (sec), ARG(4.71273424736769097620e+00,-1.19209289550781250e-07), RES(2.8963090880187066954e3, 9.9999986092323528601e-1)},
+ {FN (sec), ARG(-4.71273424736769097620e+00,1.19209289550781250e-07), RES(2.8963090880187066954e3, 9.9999986092323528601e-1)},
+ {FN (sec), ARG(-4.71273424736769097620e+00,-1.19209289550781250e-07), RES(2.8963090880187066954e3, -9.9999986092323528601e-1)},
+ {FN (sec), ARG(4.71273424736769097620e+00,5.0e-01), RES(1.4337901642784592884e-3, -1.9190337944739187244e0)},
+ {FN (sec), ARG(4.71273424736769097620e+00,-5.0e-01), RES(1.4337901642784592884e-3, 1.9190337944739187244e0)},
+ {FN (sec), ARG(-4.71273424736769097620e+00,5.0e-01), RES(1.4337901642784592884e-3, 1.9190337944739187244e0)},
+ {FN (sec), ARG(-4.71273424736769097620e+00,-5.0e-01), RES(1.4337901642784592884e-3, -1.9190337944739187244e0)},
+ {FN (sec), ARG(4.71273424736769097620e+00,1.0e+00), RES(3.8576176225184847794e-4, -8.5091800407377002743e-1)},
+ {FN (sec), ARG(4.71273424736769097620e+00,-1.0e+00), RES(3.8576176225184847794e-4, 8.5091800407377002743e-1)},
+ {FN (sec), ARG(-4.71273424736769097620e+00,1.0e+00), RES(3.8576176225184847794e-4, 8.5091800407377002743e-1)},
+ {FN (sec), ARG(-4.71273424736769097620e+00,-1.0e+00), RES(3.8576176225184847794e-4, -8.5091800407377002743e-1)},
+ {FN (sec), ARG(4.71273424736769097620e+00,2.0e+00), RES(9.8749461906999793811e-5, -2.7572054583883740770e-1)},
+ {FN (sec), ARG(4.71273424736769097620e+00,-2.0e+00), RES(9.8749461906999793811e-5, 2.7572054583883740770e-1)},
+ {FN (sec), ARG(-4.71273424736769097620e+00,2.0e+00), RES(9.8749461906999793811e-5, 2.7572054583883740770e-1)},
+ {FN (sec), ARG(-4.71273424736769097620e+00,-2.0e+00), RES(9.8749461906999793811e-5, -2.7572054583883740770e-1)},
+ {FN (sec), ARG(6.28284004019658492979e+00,0.0e+00), RES(1.0000000596046477361e0, 0.0)},
+ {FN (sec), ARG(-6.28284004019658492979e+00,0.0e+00), RES(1.0000000596046477361e0, 0.0)},
+ {FN (sec), ARG(6.28284004019658492979e+00,1.19209289550781250e-07), RES(1.0000000596046406307e0, -4.1159035837738355016e-11)},
+ {FN (sec), ARG(6.28284004019658492979e+00,-1.19209289550781250e-07), RES(1.0000000596046406307e0, 4.1159035837738355016e-11)},
+ {FN (sec), ARG(-6.28284004019658492979e+00,1.19209289550781250e-07), RES(1.0000000596046406307e0, 4.1159035837738355016e-11)},
+ {FN (sec), ARG(-6.28284004019658492979e+00,-1.19209289550781250e-07), RES(1.0000000596046406307e0, -4.1159035837738355016e-11)},
+ {FN (sec), ARG(6.28284004019658492979e+00,5.0e-01), RES(8.8681891425248302490e-1, -1.4149533035950644034e-4)},
+ {FN (sec), ARG(6.28284004019658492979e+00,-5.0e-01), RES(8.8681891425248302490e-1, 1.4149533035950644034e-4)},
+ {FN (sec), ARG(-6.28284004019658492979e+00,5.0e-01), RES(8.8681891425248302490e-1, 1.4149533035950644034e-4)},
+ {FN (sec), ARG(-6.28284004019658492979e+00,-5.0e-01), RES(8.8681891425248302490e-1, -1.4149533035950644034e-4)},
+ {FN (sec), ARG(6.28284004019658492979e+00,1.0e+00), RES(6.4805426748157480498e-1, -1.7040802567666467726e-4)},
+ {FN (sec), ARG(6.28284004019658492979e+00,-1.0e+00), RES(6.4805426748157480498e-1, 1.7040802567666467726e-4)},
+ {FN (sec), ARG(-6.28284004019658492979e+00,1.0e+00), RES(6.4805426748157480498e-1, 1.7040802567666467726e-4)},
+ {FN (sec), ARG(-6.28284004019658492979e+00,-1.0e+00), RES(6.4805426748157480498e-1, -1.7040802567666467726e-4)},
+ {FN (sec), ARG(6.28284004019658492979e+00,2.0e+00), RES(2.6580221522968095404e-1, -8.8471445300451703875e-5)},
+ {FN (sec), ARG(6.28284004019658492979e+00,-2.0e+00), RES(2.6580221522968095404e-1, 8.8471445300451703875e-5)},
+ {FN (sec), ARG(-6.28284004019658492979e+00,2.0e+00), RES(2.6580221522968095404e-1, 8.8471445300451703875e-5)},
+ {FN (sec), ARG(-6.28284004019658492979e+00,-2.0e+00), RES(2.6580221522968095404e-1, -8.8471445300451703875e-5)},
+ {FN (sec), ARG(6.28353057416258753420e+00,0.0e+00), RES(1.0000000596046477359e0, 0.0)},
+ {FN (sec), ARG(-6.28353057416258753420e+00,0.0e+00), RES(1.0000000596046477359e0, 0.0)},
+ {FN (sec), ARG(6.28353057416258753420e+00,1.19209289550781250e-07), RES(1.0000000596046406305e0, 4.1159035837679959288e-11)},
+ {FN (sec), ARG(6.28353057416258753420e+00,-1.19209289550781250e-07), RES(1.0000000596046406305e0, -4.1159035837679959288e-11)},
+ {FN (sec), ARG(-6.28353057416258753420e+00,1.19209289550781250e-07), RES(1.0000000596046406305e0, -4.1159035837679959288e-11)},
+ {FN (sec), ARG(-6.28353057416258753420e+00,-1.19209289550781250e-07), RES(1.0000000596046406305e0, 4.1159035837679959288e-11)},
+ {FN (sec), ARG(6.28353057416258753420e+00,5.0e-01), RES(8.8681891425248302482e-1, 1.4149533035930568923e-4)},
+ {FN (sec), ARG(6.28353057416258753420e+00,-5.0e-01), RES(8.8681891425248302482e-1, -1.4149533035930568923e-4)},
+ {FN (sec), ARG(-6.28353057416258753420e+00,5.0e-01), RES(8.8681891425248302482e-1, -1.4149533035930568923e-4)},
+ {FN (sec), ARG(-6.28353057416258753420e+00,-5.0e-01), RES(8.8681891425248302482e-1, 1.4149533035930568923e-4)},
+ {FN (sec), ARG(6.28353057416258753420e+00,1.0e+00), RES(6.480542674815748050e-1, 1.7040802567642290534e-4)},
+ {FN (sec), ARG(6.28353057416258753420e+00,-1.0e+00), RES(6.480542674815748050e-1, -1.7040802567642290534e-4)},
+ {FN (sec), ARG(-6.28353057416258753420e+00,1.0e+00), RES(6.480542674815748050e-1, -1.7040802567642290534e-4)},
+ {FN (sec), ARG(-6.28353057416258753420e+00,-1.0e+00), RES(6.480542674815748050e-1, 1.7040802567642290534e-4)},
+ {FN (sec), ARG(6.28353057416258753420e+00,2.0e+00), RES(2.6580221522968095408e-1, 8.8471445300326182148e-5)},
+ {FN (sec), ARG(6.28353057416258753420e+00,-2.0e+00), RES(2.6580221522968095408e-1, -8.8471445300326182148e-5)},
+ {FN (sec), ARG(-6.28353057416258753420e+00,2.0e+00), RES(2.6580221522968095408e-1, -8.8471445300326182148e-5)},
+ {FN (sec), ARG(-6.28353057416258753420e+00,-2.0e+00), RES(2.6580221522968095408e-1, 8.8471445300326182148e-5)},
+ {FN (sec), ARG(9.42443269378637893396e+00,0.0e+00), RES(-1.0000000596046477358e0, 0.0)},
+ {FN (sec), ARG(-9.42443269378637893396e+00,0.0e+00), RES(-1.0000000596046477358e0, 0.0)},
+ {FN (sec), ARG(9.42443269378637893396e+00,1.19209289550781250e-07), RES(-1.0000000596046406304e0, 4.1159035837647074798e-11)},
+ {FN (sec), ARG(9.42443269378637893396e+00,-1.19209289550781250e-07), RES(-1.0000000596046406304e0, -4.1159035837647074798e-11)},
+ {FN (sec), ARG(-9.42443269378637893396e+00,1.19209289550781250e-07), RES(-1.0000000596046406304e0, -4.1159035837647074798e-11)},
+ {FN (sec), ARG(-9.42443269378637893396e+00,-1.19209289550781250e-07), RES(-1.0000000596046406304e0, 4.1159035837647074798e-11)},
+ {FN (sec), ARG(9.42443269378637893396e+00,5.0e-01), RES(-8.8681891425248302477e-1, 1.4149533035919263990e-4)},
+ {FN (sec), ARG(9.42443269378637893396e+00,-5.0e-01), RES(-8.8681891425248302477e-1, -1.4149533035919263990e-4)},
+ {FN (sec), ARG(-9.42443269378637893396e+00,5.0e-01), RES(-8.8681891425248302477e-1, -1.4149533035919263990e-4)},
+ {FN (sec), ARG(-9.42443269378637893396e+00,-5.0e-01), RES(-8.8681891425248302477e-1, 1.4149533035919263990e-4)},
+ {FN (sec), ARG(9.42443269378637893396e+00,1.0e+00), RES(-6.4805426748157480501e-1, 1.7040802567628675588e-4)},
+ {FN (sec), ARG(9.42443269378637893396e+00,-1.0e+00), RES(-6.4805426748157480501e-1, -1.7040802567628675588e-4)},
+ {FN (sec), ARG(-9.42443269378637893396e+00,1.0e+00), RES(-6.4805426748157480501e-1, -1.7040802567628675588e-4)},
+ {FN (sec), ARG(-9.42443269378637893396e+00,-1.0e+00), RES(-6.4805426748157480501e-1, 1.7040802567628675588e-4)},
+ {FN (sec), ARG(9.42443269378637893396e+00,2.0e+00), RES(-2.6580221522968095410e-1, 8.8471445300255496873e-5)},
+ {FN (sec), ARG(9.42443269378637893396e+00,-2.0e+00), RES(-2.6580221522968095410e-1, -8.8471445300255496873e-5)},
+ {FN (sec), ARG(-9.42443269378637893396e+00,2.0e+00), RES(-2.6580221522968095410e-1, -8.8471445300255496873e-5)},
+ {FN (sec), ARG(-9.42443269378637893396e+00,-2.0e+00), RES(-2.6580221522968095410e-1, 8.8471445300255496873e-5)},
+ {FN (sec), ARG(9.42512322775237976202e+00,0.0e+00), RES(-1.0000000596046477356e0, 0.0)},
+ {FN (sec), ARG(-9.42512322775237976202e+00,0.0e+00), RES(-1.0000000596046477356e0, 0.0)},
+ {FN (sec), ARG(9.42512322775237976202e+00,1.19209289550781250e-07), RES(-1.0000000596046406301e0, -4.1159035837559481207e-11)},
+ {FN (sec), ARG(9.42512322775237976202e+00,-1.19209289550781250e-07), RES(-1.0000000596046406301e0, 4.1159035837559481207e-11)},
+ {FN (sec), ARG(-9.42512322775237976202e+00,1.19209289550781250e-07), RES(-1.0000000596046406301e0, 4.1159035837559481207e-11)},
+ {FN (sec), ARG(-9.42512322775237976202e+00,-1.19209289550781250e-07), RES(-1.0000000596046406301e0, -4.1159035837559481207e-11)},
+ {FN (sec), ARG(9.42512322775237976202e+00,5.0e-01), RES(-8.8681891425248302464e-1, -1.4149533035889151322e-4)},
+ {FN (sec), ARG(9.42512322775237976202e+00,-5.0e-01), RES(-8.8681891425248302464e-1, 1.4149533035889151322e-4)},
+ {FN (sec), ARG(-9.42512322775237976202e+00,5.0e-01), RES(-8.8681891425248302464e-1, 1.4149533035889151322e-4)},
+ {FN (sec), ARG(-9.42512322775237976202e+00,-5.0e-01), RES(-8.8681891425248302464e-1, -1.4149533035889151322e-4)},
+ {FN (sec), ARG(9.42512322775237976202e+00,1.0e+00), RES(-6.4805426748157480504e-1, -1.704080256759240980e-4)},
+ {FN (sec), ARG(9.42512322775237976202e+00,-1.0e+00), RES(-6.4805426748157480504e-1, 1.704080256759240980e-4)},
+ {FN (sec), ARG(-9.42512322775237976202e+00,1.0e+00), RES(-6.4805426748157480504e-1, 1.704080256759240980e-4)},
+ {FN (sec), ARG(-9.42512322775237976202e+00,-1.0e+00), RES(-6.4805426748157480504e-1, -1.704080256759240980e-4)},
+ {FN (sec), ARG(9.42512322775237976202e+00,2.0e+00), RES(-2.6580221522968095416e-1, -8.8471445300067214283e-5)},
+ {FN (sec), ARG(9.42512322775237976202e+00,-2.0e+00), RES(-2.6580221522968095416e-1, 8.8471445300067214283e-5)},
+ {FN (sec), ARG(-9.42512322775237976202e+00,2.0e+00), RES(-2.6580221522968095416e-1, 8.8471445300067214283e-5)},
+ {FN (sec), ARG(-9.42512322775237976202e+00,-2.0e+00), RES(-2.6580221522968095416e-1, -8.8471445300067214283e-5)},
+ {FN (cot), ARG(-3.45266983001243932001e-04,0.0e+00), RES(-2.8963092606511032136e3, 0.0)},
+ {FN (cot), ARG(3.45266983001243932001e-04,0.0e+00), RES(2.8963092606511032136e3, 0.0)},
+ {FN (cot), ARG(-3.45266983001243932001e-04,1.19209289550781250e-07), RES(-2.8963089153841613713e3, -9.9999992052715532101e-1)},
+ {FN (cot), ARG(-3.45266983001243932001e-04,-1.19209289550781250e-07), RES(-2.8963089153841613713e3, 9.9999992052715532101e-1)},
+ {FN (cot), ARG(3.45266983001243932001e-04,1.19209289550781250e-07), RES(2.8963089153841613713e3, -9.9999992052715532101e-1)},
+ {FN (cot), ARG(3.45266983001243932001e-04,-1.19209289550781250e-07), RES(2.8963089153841613713e3, 9.9999992052715532101e-1)},
+ {FN (cot), ARG(-3.45266983001243932001e-04,5.0e-01), RES(-1.2715121175451222247e-3, -2.1639524637389326002e0)},
+ {FN (cot), ARG(-3.45266983001243932001e-04,-5.0e-01), RES(-1.2715121175451222247e-3, 2.1639524637389326002e0)},
+ {FN (cot), ARG(3.45266983001243932001e-04,5.0e-01), RES(1.2715121175451222247e-3, -2.1639524637389326002e0)},
+ {FN (cot), ARG(3.45266983001243932001e-04,-5.0e-01), RES(1.2715121175451222247e-3, 2.1639524637389326002e0)},
+ {FN (cot), ARG(-3.45266983001243932001e-04,1.0e+00), RES(-2.4999454374267620687e-4, -1.3130351721648674824e0)},
+ {FN (cot), ARG(-3.45266983001243932001e-04,-1.0e+00), RES(-2.4999454374267620687e-4, 1.3130351721648674824e0)},
+ {FN (cot), ARG(3.45266983001243932001e-04,1.0e+00), RES(2.4999454374267620687e-4, -1.3130351721648674824e0)},
+ {FN (cot), ARG(3.45266983001243932001e-04,-1.0e+00), RES(2.4999454374267620687e-4, 1.3130351721648674824e0)},
+ {FN (cot), ARG(-3.45266983001243932001e-04,2.0e+00), RES(-2.6247825506563736365e-5, -1.0373147113268752620e0)},
+ {FN (cot), ARG(-3.45266983001243932001e-04,-2.0e+00), RES(-2.6247825506563736365e-5, 1.0373147113268752620e0)},
+ {FN (cot), ARG(3.45266983001243932001e-04,2.0e+00), RES(2.6247825506563736365e-5, -1.0373147113268752620e0)},
+ {FN (cot), ARG(3.45266983001243932001e-04,-2.0e+00), RES(2.6247825506563736365e-5, 1.0373147113268752620e0)},
+ {FN (cot), ARG(1.57045105981189525579e+00,0.0e+00), RES(3.4526699672104134407e-4, 0.0)},
+ {FN (cot), ARG(-1.57045105981189525579e+00,0.0e+00), RES(-3.4526699672104134407e-4, 0.0)},
+ {FN (cot), ARG(1.57045105981189525579e+00,1.19209289550781250e-07), RES(3.4526699672103643753e-4, -1.1920930376163652990e-7)},
+ {FN (cot), ARG(1.57045105981189525579e+00,-1.19209289550781250e-07), RES(3.4526699672103643753e-4, 1.1920930376163652990e-7)},
+ {FN (cot), ARG(-1.57045105981189525579e+00,1.19209289550781250e-07), RES(-3.4526699672103643753e-4, -1.1920930376163652990e-7)},
+ {FN (cot), ARG(-1.57045105981189525579e+00,-1.19209289550781250e-07), RES(-3.4526699672103643753e-4, 1.1920930376163652990e-7)},
+ {FN (cot), ARG(1.57045105981189525579e+00,5.0e-01), RES(2.7153443992665204631e-4, -4.6211720058436229982e-1)},
+ {FN (cot), ARG(1.57045105981189525579e+00,-5.0e-01), RES(2.7153443992665204631e-4, 4.6211720058436229982e-1)},
+ {FN (cot), ARG(-1.57045105981189525579e+00,5.0e-01), RES(-2.7153443992665204631e-4, -4.6211720058436229982e-1)},
+ {FN (cot), ARG(-1.57045105981189525579e+00,-5.0e-01), RES(-2.7153443992665204631e-4, 4.6211720058436229982e-1)},
+ {FN (cot), ARG(1.57045105981189525579e+00,1.0e+00), RES(1.4500326960279979918e-4, -7.6159419408485704839e-1)},
+ {FN (cot), ARG(1.57045105981189525579e+00,-1.0e+00), RES(1.4500326960279979918e-4, 7.6159419408485704839e-1)},
+ {FN (cot), ARG(-1.57045105981189525579e+00,1.0e+00), RES(-1.4500326960279979918e-4, -7.6159419408485704839e-1)},
+ {FN (cot), ARG(-1.57045105981189525579e+00,-1.0e+00), RES(-1.4500326960279979918e-4, 7.6159419408485704839e-1)},
+ {FN (cot), ARG(1.57045105981189525579e+00,2.0e+00), RES(2.4393395410443750226e-5, -9.6402758819508310557e-1)},
+ {FN (cot), ARG(1.57045105981189525579e+00,-2.0e+00), RES(2.4393395410443750226e-5, 9.6402758819508310557e-1)},
+ {FN (cot), ARG(-1.57045105981189525579e+00,2.0e+00), RES(-2.4393395410443750226e-5, -9.6402758819508310557e-1)},
+ {FN (cot), ARG(-1.57045105981189525579e+00,-2.0e+00), RES(-2.4393395410443750226e-5, 9.6402758819508310557e-1)},
+ {FN (cot), ARG(1.57114159377789786021e+00,0.0e+00), RES(-3.4526699672091887937e-4, 0.0)},
+ {FN (cot), ARG(-1.57114159377789786021e+00,0.0e+00), RES(3.4526699672091887937e-4, 0.0)},
+ {FN (cot), ARG(1.57114159377789786021e+00,1.19209289550781250e-07), RES(-3.4526699672091397283e-4, -1.1920930376163652989e-7)},
+ {FN (cot), ARG(1.57114159377789786021e+00,-1.19209289550781250e-07), RES(-3.4526699672091397283e-4, 1.1920930376163652989e-7)},
+ {FN (cot), ARG(-1.57114159377789786021e+00,1.19209289550781250e-07), RES(3.4526699672091397283e-4, -1.1920930376163652989e-7)},
+ {FN (cot), ARG(-1.57114159377789786021e+00,-1.19209289550781250e-07), RES(3.4526699672091397283e-4, 1.1920930376163652989e-7)},
+ {FN (cot), ARG(1.57114159377789786021e+00,5.0e-01), RES(-2.7153443992655573423e-4, -4.6211720058436229979e-1)},
+ {FN (cot), ARG(1.57114159377789786021e+00,-5.0e-01), RES(-2.7153443992655573423e-4, 4.6211720058436229979e-1)},
+ {FN (cot), ARG(-1.57114159377789786021e+00,5.0e-01), RES(2.7153443992655573423e-4, -4.6211720058436229979e-1)},
+ {FN (cot), ARG(-1.57114159377789786021e+00,-5.0e-01), RES(2.7153443992655573423e-4, 4.6211720058436229979e-1)},
+ {FN (cot), ARG(1.57114159377789786021e+00,1.0e+00), RES(-1.4500326960274836716e-4, -7.6159419408485704836e-1)},
+ {FN (cot), ARG(1.57114159377789786021e+00,-1.0e+00), RES(-1.4500326960274836716e-4, 7.6159419408485704836e-1)},
+ {FN (cot), ARG(-1.57114159377789786021e+00,1.0e+00), RES(1.4500326960274836716e-4, -7.6159419408485704836e-1)},
+ {FN (cot), ARG(-1.57114159377789786021e+00,-1.0e+00), RES(1.4500326960274836716e-4, 7.6159419408485704836e-1)},
+ {FN (cot), ARG(1.57114159377789786021e+00,2.0e+00), RES(-2.4393395410435097997e-5, -9.6402758819508310556e-1)},
+ {FN (cot), ARG(1.57114159377789786021e+00,-2.0e+00), RES(-2.4393395410435097997e-5, 9.6402758819508310556e-1)},
+ {FN (cot), ARG(-1.57114159377789786021e+00,2.0e+00), RES(2.4393395410435097997e-5, -9.6402758819508310556e-1)},
+ {FN (cot), ARG(-1.57114159377789786021e+00,-2.0e+00), RES(2.4393395410435097997e-5, 9.6402758819508310556e-1)},
+ {FN (cot), ARG(3.14124738660679181379e+00,0.0e+00), RES(-2.8963092606495870519e3, 0.0)},
+ {FN (cot), ARG(-3.14124738660679181379e+00,0.0e+00), RES(2.8963092606495870519e3, 0.0)},
+ {FN (cot), ARG(3.14124738660679181379e+00,1.19209289550781250e-07), RES(-2.8963089153826452102e3, -9.9999992052610836018e-1)},
+ {FN (cot), ARG(3.14124738660679181379e+00,-1.19209289550781250e-07), RES(-2.8963089153826452102e3, 9.9999992052610836018e-1)},
+ {FN (cot), ARG(-3.14124738660679181379e+00,1.19209289550781250e-07), RES(2.8963089153826452102e3, -9.9999992052610836018e-1)},
+ {FN (cot), ARG(-3.14124738660679181379e+00,-1.19209289550781250e-07), RES(2.8963089153826452102e3, 9.9999992052610836018e-1)},
+ {FN (cot), ARG(3.14124738660679181379e+00,5.0e-01), RES(-1.2715121175457878359e-3, -2.1639524637389325992e0)},
+ {FN (cot), ARG(3.14124738660679181379e+00,-5.0e-01), RES(-1.2715121175457878359e-3, 2.1639524637389325992e0)},
+ {FN (cot), ARG(-3.14124738660679181379e+00,5.0e-01), RES(1.2715121175457878359e-3, -2.1639524637389325992e0)},
+ {FN (cot), ARG(-3.14124738660679181379e+00,-5.0e-01), RES(1.2715121175457878359e-3, 2.1639524637389325992e0)},
+ {FN (cot), ARG(3.14124738660679181379e+00,1.0e+00), RES(-2.4999454374280707411e-4, -1.3130351721648674823e0)},
+ {FN (cot), ARG(3.14124738660679181379e+00,-1.0e+00), RES(-2.4999454374280707411e-4, 1.3130351721648674823e0)},
+ {FN (cot), ARG(-3.14124738660679181379e+00,1.0e+00), RES(2.4999454374280707411e-4, -1.3130351721648674823e0)},
+ {FN (cot), ARG(-3.14124738660679181379e+00,-1.0e+00), RES(2.4999454374280707411e-4, 1.3130351721648674823e0)},
+ {FN (cot), ARG(3.14124738660679181379e+00,2.0e+00), RES(-2.6247825506577476589e-5, -1.0373147113268752620e0)},
+ {FN (cot), ARG(3.14124738660679181379e+00,-2.0e+00), RES(-2.6247825506577476589e-5, 1.0373147113268752620e0)},
+ {FN (cot), ARG(-3.14124738660679181379e+00,2.0e+00), RES(2.6247825506577476589e-5, -1.0373147113268752620e0)},
+ {FN (cot), ARG(-3.14124738660679181379e+00,-2.0e+00), RES(2.6247825506577476589e-5, 1.0373147113268752620e0)},
+ {FN (cot), ARG(3.14193792057279441821e+00,0.0e+00), RES(2.8963092606516416684e3, 0.0)},
+ {FN (cot), ARG(-3.14193792057279441821e+00,0.0e+00), RES(-2.8963092606516416684e3, 0.0)},
+ {FN (cot), ARG(3.14193792057279441821e+00,1.19209289550781250e-07), RES(2.8963089153846998260e3, -9.9999992052752714224e-1)},
+ {FN (cot), ARG(3.14193792057279441821e+00,-1.19209289550781250e-07), RES(2.8963089153846998260e3, 9.9999992052752714224e-1)},
+ {FN (cot), ARG(-3.14193792057279441821e+00,1.19209289550781250e-07), RES(-2.8963089153846998260e3, -9.9999992052752714224e-1)},
+ {FN (cot), ARG(-3.14193792057279441821e+00,-1.19209289550781250e-07), RES(-2.8963089153846998260e3, 9.9999992052752714224e-1)},
+ {FN (cot), ARG(3.14193792057279441821e+00,5.0e-01), RES(1.2715121175448858373e-3, -2.1639524637389326006e0)},
+ {FN (cot), ARG(3.14193792057279441821e+00,-5.0e-01), RES(1.2715121175448858373e-3, 2.1639524637389326006e0)},
+ {FN (cot), ARG(-3.14193792057279441821e+00,5.0e-01), RES(-1.2715121175448858373e-3, -2.1639524637389326006e0)},
+ {FN (cot), ARG(-3.14193792057279441821e+00,-5.0e-01), RES(-1.2715121175448858373e-3, 2.1639524637389326006e0)},
+ {FN (cot), ARG(3.14193792057279441821e+00,1.0e+00), RES(2.4999454374262973024e-4, -1.3130351721648674824e0)},
+ {FN (cot), ARG(3.14193792057279441821e+00,-1.0e+00), RES(2.4999454374262973024e-4, 1.3130351721648674824e0)},
+ {FN (cot), ARG(-3.14193792057279441821e+00,1.0e+00), RES(-2.4999454374262973024e-4, -1.3130351721648674824e0)},
+ {FN (cot), ARG(-3.14193792057279441821e+00,-1.0e+00), RES(-2.4999454374262973024e-4, 1.3130351721648674824e0)},
+ {FN (cot), ARG(3.14193792057279441821e+00,2.0e+00), RES(2.6247825506558856616e-5, -1.0373147113268752620e0)},
+ {FN (cot), ARG(3.14193792057279441821e+00,-2.0e+00), RES(2.6247825506558856616e-5, 1.0373147113268752620e0)},
+ {FN (cot), ARG(-3.14193792057279441821e+00,2.0e+00), RES(-2.6247825506558856616e-5, -1.0373147113268752620e0)},
+ {FN (cot), ARG(-3.14193792057279441821e+00,-2.0e+00), RES(-2.6247825506558856616e-5, 1.0373147113268752620e0)},
+ {FN (cot), ARG(4.71204371340168837179e+00,0.0e+00), RES(3.4526699672116380876e-4, 0.0)},
+ {FN (cot), ARG(-4.71204371340168837179e+00,0.0e+00), RES(-3.4526699672116380876e-4, 0.0)},
+ {FN (cot), ARG(4.71204371340168837179e+00,1.19209289550781250e-07), RES(3.4526699672115890222e-4, -1.1920930376163652991e-7)},
+ {FN (cot), ARG(4.71204371340168837179e+00,-1.19209289550781250e-07), RES(3.4526699672115890222e-4, 1.1920930376163652991e-7)},
+ {FN (cot), ARG(-4.71204371340168837179e+00,1.19209289550781250e-07), RES(-3.4526699672115890222e-4, -1.1920930376163652991e-7)},
+ {FN (cot), ARG(-4.71204371340168837179e+00,-1.19209289550781250e-07), RES(-3.4526699672115890222e-4, 1.1920930376163652991e-7)},
+ {FN (cot), ARG(4.71204371340168837179e+00,5.0e-01), RES(2.7153443992674835838e-4, -4.6211720058436229985e-1)},
+ {FN (cot), ARG(4.71204371340168837179e+00,-5.0e-01), RES(2.7153443992674835838e-4, 4.6211720058436229985e-1)},
+ {FN (cot), ARG(-4.71204371340168837179e+00,5.0e-01), RES(-2.7153443992674835838e-4, -4.6211720058436229985e-1)},
+ {FN (cot), ARG(-4.71204371340168837179e+00,-5.0e-01), RES(-2.7153443992674835838e-4, 4.6211720058436229985e-1)},
+ {FN (cot), ARG(4.71204371340168837179e+00,1.0e+00), RES(1.4500326960285123120e-4, -7.6159419408485704842e-1)},
+ {FN (cot), ARG(4.71204371340168837179e+00,-1.0e+00), RES(1.4500326960285123120e-4, 7.6159419408485704842e-1)},
+ {FN (cot), ARG(-4.71204371340168837179e+00,1.0e+00), RES(-1.4500326960285123120e-4, -7.6159419408485704842e-1)},
+ {FN (cot), ARG(-4.71204371340168837179e+00,-1.0e+00), RES(-1.4500326960285123120e-4, 7.6159419408485704842e-1)},
+ {FN (cot), ARG(4.71204371340168837179e+00,2.0e+00), RES(2.4393395410452402454e-5, -9.6402758819508310557e-1)},
+ {FN (cot), ARG(4.71204371340168837179e+00,-2.0e+00), RES(2.4393395410452402454e-5, 9.6402758819508310557e-1)},
+ {FN (cot), ARG(-4.71204371340168837179e+00,2.0e+00), RES(-2.4393395410452402454e-5, -9.6402758819508310557e-1)},
+ {FN (cot), ARG(-4.71204371340168837179e+00,-2.0e+00), RES(-2.4393395410452402454e-5, 9.6402758819508310557e-1)},
+ {FN (cot), ARG(4.71273424736769097620e+00,0.0e+00), RES(-3.4526699672079641468e-4, 0.0)},
+ {FN (cot), ARG(-4.71273424736769097620e+00,0.0e+00), RES(3.4526699672079641468e-4, 0.0)},
+ {FN (cot), ARG(4.71273424736769097620e+00,1.19209289550781250e-07), RES(-3.4526699672079150814e-4, -1.1920930376163652988e-7)},
+ {FN (cot), ARG(4.71273424736769097620e+00,-1.19209289550781250e-07), RES(-3.4526699672079150814e-4, 1.1920930376163652988e-7)},
+ {FN (cot), ARG(-4.71273424736769097620e+00,1.19209289550781250e-07), RES(3.4526699672079150814e-4, -1.1920930376163652988e-7)},
+ {FN (cot), ARG(-4.71273424736769097620e+00,-1.19209289550781250e-07), RES(3.4526699672079150814e-4, 1.1920930376163652988e-7)},
+ {FN (cot), ARG(4.71273424736769097620e+00,5.0e-01), RES(-2.7153443992645942216e-4, -4.6211720058436229976e-1)},
+ {FN (cot), ARG(4.71273424736769097620e+00,-5.0e-01), RES(-2.7153443992645942216e-4, 4.6211720058436229976e-1)},
+ {FN (cot), ARG(-4.71273424736769097620e+00,5.0e-01), RES(2.7153443992645942216e-4, -4.6211720058436229976e-1)},
+ {FN (cot), ARG(-4.71273424736769097620e+00,-5.0e-01), RES(2.7153443992645942216e-4, 4.6211720058436229976e-1)},
+ {FN (cot), ARG(4.71273424736769097620e+00,1.0e+00), RES(-1.4500326960269693514e-4, -7.6159419408485704834e-1)},
+ {FN (cot), ARG(4.71273424736769097620e+00,-1.0e+00), RES(-1.4500326960269693514e-4, 7.6159419408485704834e-1)},
+ {FN (cot), ARG(-4.71273424736769097620e+00,1.0e+00), RES(1.4500326960269693514e-4, -7.6159419408485704834e-1)},
+ {FN (cot), ARG(-4.71273424736769097620e+00,-1.0e+00), RES(1.4500326960269693514e-4, 7.6159419408485704834e-1)},
+ {FN (cot), ARG(4.71273424736769097620e+00,2.0e+00), RES(-2.4393395410426445768e-5, -9.6402758819508310556e-1)},
+ {FN (cot), ARG(4.71273424736769097620e+00,-2.0e+00), RES(-2.4393395410426445768e-5, 9.6402758819508310556e-1)},
+ {FN (cot), ARG(-4.71273424736769097620e+00,2.0e+00), RES(2.4393395410426445768e-5, -9.6402758819508310556e-1)},
+ {FN (cot), ARG(-4.71273424736769097620e+00,-2.0e+00), RES(2.4393395410426445768e-5, 9.6402758819508310556e-1)},
+ {FN (cot), ARG(6.28284004019658492979e+00,0.0e+00), RES(-2.8963092606485597437e3, 0.0)},
+ {FN (cot), ARG(-6.28284004019658492979e+00,0.0e+00), RES(2.8963092606485597437e3, 0.0)},
+ {FN (cot), ARG(6.28284004019658492979e+00,1.19209289550781250e-07), RES(-2.8963089153816179024e3, -9.9999992052539896914e-1)},
+ {FN (cot), ARG(6.28284004019658492979e+00,-1.19209289550781250e-07), RES(-2.8963089153816179024e3, 9.9999992052539896914e-1)},
+ {FN (cot), ARG(-6.28284004019658492979e+00,1.19209289550781250e-07), RES(2.8963089153816179024e3, -9.9999992052539896914e-1)},
+ {FN (cot), ARG(-6.28284004019658492979e+00,-1.19209289550781250e-07), RES(2.8963089153816179024e3, 9.9999992052539896914e-1)},
+ {FN (cot), ARG(6.28284004019658492979e+00,5.0e-01), RES(-1.2715121175462388352e-3, -2.1639524637389325986e0)},
+ {FN (cot), ARG(6.28284004019658492979e+00,-5.0e-01), RES(-1.2715121175462388352e-3, 2.1639524637389325986e0)},
+ {FN (cot), ARG(-6.28284004019658492979e+00,5.0e-01), RES(1.2715121175462388352e-3, -2.1639524637389325986e0)},
+ {FN (cot), ARG(-6.28284004019658492979e+00,-5.0e-01), RES(1.2715121175462388352e-3, 2.1639524637389325986e0)},
+ {FN (cot), ARG(6.28284004019658492979e+00,1.0e+00), RES(-2.4999454374289574604e-4, -1.3130351721648674822e0)},
+ {FN (cot), ARG(6.28284004019658492979e+00,-1.0e+00), RES(-2.4999454374289574604e-4, 1.3130351721648674822e0)},
+ {FN (cot), ARG(-6.28284004019658492979e+00,1.0e+00), RES(2.4999454374289574604e-4, -1.3130351721648674822e0)},
+ {FN (cot), ARG(-6.28284004019658492979e+00,-1.0e+00), RES(2.4999454374289574604e-4, 1.3130351721648674822e0)},
+ {FN (cot), ARG(6.28284004019658492979e+00,2.0e+00), RES(-2.6247825506586786575e-5, -1.0373147113268752620e0)},
+ {FN (cot), ARG(6.28284004019658492979e+00,-2.0e+00), RES(-2.6247825506586786575e-5, 1.0373147113268752620e0)},
+ {FN (cot), ARG(-6.28284004019658492979e+00,2.0e+00), RES(2.6247825506586786575e-5, -1.0373147113268752620e0)},
+ {FN (cot), ARG(-6.28284004019658492979e+00,-2.0e+00), RES(2.6247825506586786575e-5, 1.0373147113268752620e0)},
+ {FN (cot), ARG(6.28353057416258753420e+00,0.0e+00), RES(2.8963092606526689766e3, 0.0)},
+ {FN (cot), ARG(-6.28353057416258753420e+00,0.0e+00), RES(-2.8963092606526689766e3, 0.0)},
+ {FN (cot), ARG(6.28353057416258753420e+00,1.19209289550781250e-07), RES(2.8963089153857271338e3, -9.9999992052823653327e-1)},
+ {FN (cot), ARG(6.28353057416258753420e+00,-1.19209289550781250e-07), RES(2.8963089153857271338e3, 9.9999992052823653327e-1)},
+ {FN (cot), ARG(-6.28353057416258753420e+00,1.19209289550781250e-07), RES(-2.8963089153857271338e3, -9.9999992052823653327e-1)},
+ {FN (cot), ARG(-6.28353057416258753420e+00,-1.19209289550781250e-07), RES(-2.8963089153857271338e3, 9.9999992052823653327e-1)},
+ {FN (cot), ARG(6.28353057416258753420e+00,5.0e-01), RES(1.2715121175444348380e-3, -2.1639524637389326012e0)},
+ {FN (cot), ARG(6.28353057416258753420e+00,-5.0e-01), RES(1.2715121175444348380e-3, 2.1639524637389326012e0)},
+ {FN (cot), ARG(-6.28353057416258753420e+00,5.0e-01), RES(-1.2715121175444348380e-3, -2.1639524637389326012e0)},
+ {FN (cot), ARG(-6.28353057416258753420e+00,-5.0e-01), RES(-1.2715121175444348380e-3, 2.1639524637389326012e0)},
+ {FN (cot), ARG(6.28353057416258753420e+00,1.0e+00), RES(2.4999454374254105830e-4, -1.3130351721648674825e0)},
+ {FN (cot), ARG(6.28353057416258753420e+00,-1.0e+00), RES(2.4999454374254105830e-4, 1.3130351721648674825e0)},
+ {FN (cot), ARG(-6.28353057416258753420e+00,1.0e+00), RES(-2.4999454374254105830e-4, -1.3130351721648674825e0)},
+ {FN (cot), ARG(-6.28353057416258753420e+00,-1.0e+00), RES(-2.4999454374254105830e-4, 1.3130351721648674825e0)},
+ {FN (cot), ARG(6.28353057416258753420e+00,2.0e+00), RES(2.6247825506549546629e-5, -1.0373147113268752620e0)},
+ {FN (cot), ARG(6.28353057416258753420e+00,-2.0e+00), RES(2.6247825506549546629e-5, 1.0373147113268752620e0)},
+ {FN (cot), ARG(-6.28353057416258753420e+00,2.0e+00), RES(-2.6247825506549546629e-5, -1.0373147113268752620e0)},
+ {FN (cot), ARG(-6.28353057416258753420e+00,-2.0e+00), RES(-2.6247825506549546629e-5, 1.0373147113268752620e0)},
+ {FN (cot), ARG(9.42443269378637893396e+00,0.0e+00), RES(-2.8963092606549830163e3, 0.0)},
+ {FN (cot), ARG(-9.42443269378637893396e+00,0.0e+00), RES(2.8963092606549830163e3, 0.0)},
+ {FN (cot), ARG(9.42443269378637893396e+00,1.19209289550781250e-07), RES(-2.8963089153880411727e3, -9.9999992052983445585e-1)},
+ {FN (cot), ARG(9.42443269378637893396e+00,-1.19209289550781250e-07), RES(-2.8963089153880411727e3, 9.9999992052983445585e-1)},
+ {FN (cot), ARG(-9.42443269378637893396e+00,1.19209289550781250e-07), RES(2.8963089153880411727e3, -9.9999992052983445585e-1)},
+ {FN (cot), ARG(-9.42443269378637893396e+00,-1.19209289550781250e-07), RES(2.8963089153880411727e3, 9.9999992052983445585e-1)},
+ {FN (cot), ARG(9.42443269378637893396e+00,5.0e-01), RES(-1.2715121175434189499e-3, -2.1639524637389326028e0)},
+ {FN (cot), ARG(9.42443269378637893396e+00,-5.0e-01), RES(-1.2715121175434189499e-3, 2.1639524637389326028e0)},
+ {FN (cot), ARG(-9.42443269378637893396e+00,5.0e-01), RES(1.2715121175434189499e-3, -2.1639524637389326028e0)},
+ {FN (cot), ARG(-9.42443269378637893396e+00,-5.0e-01), RES(1.2715121175434189499e-3, 2.1639524637389326028e0)},
+ {FN (cot), ARG(9.42443269378637893396e+00,1.0e+00), RES(-2.4999454374234132236e-4, -1.3130351721648674827e0)},
+ {FN (cot), ARG(9.42443269378637893396e+00,-1.0e+00), RES(-2.4999454374234132236e-4, 1.3130351721648674827e0)},
+ {FN (cot), ARG(-9.42443269378637893396e+00,1.0e+00), RES(2.4999454374234132236e-4, -1.3130351721648674827e0)},
+ {FN (cot), ARG(-9.42443269378637893396e+00,-1.0e+00), RES(2.4999454374234132236e-4, 1.3130351721648674827e0)},
+ {FN (cot), ARG(9.42443269378637893396e+00,2.0e+00), RES(-2.6247825506528575631e-5, -1.0373147113268752620e0)},
+ {FN (cot), ARG(9.42443269378637893396e+00,-2.0e+00), RES(-2.6247825506528575631e-5, 1.0373147113268752620e0)},
+ {FN (cot), ARG(-9.42443269378637893396e+00,2.0e+00), RES(2.6247825506528575631e-5, -1.0373147113268752620e0)},
+ {FN (cot), ARG(-9.42443269378637893396e+00,-2.0e+00), RES(2.6247825506528575631e-5, 1.0373147113268752620e0)},
+ {FN (cot), ARG(9.42512322775237976202e+00,0.0e+00), RES(2.8963092606611468657e3, 0.0)},
+ {FN (cot), ARG(-9.42512322775237976202e+00,0.0e+00), RES(-2.8963092606611468657e3, 0.0)},
+ {FN (cot), ARG(9.42512322775237976202e+00,1.19209289550781250e-07), RES(2.8963089153942050199e3, -9.9999992053409080205e-1)},
+ {FN (cot), ARG(9.42512322775237976202e+00,-1.19209289550781250e-07), RES(2.8963089153942050199e3, 9.9999992053409080205e-1)},
+ {FN (cot), ARG(-9.42512322775237976202e+00,1.19209289550781250e-07), RES(-2.8963089153942050199e3, -9.9999992053409080205e-1)},
+ {FN (cot), ARG(-9.42512322775237976202e+00,-1.19209289550781250e-07), RES(-2.8963089153942050199e3, 9.9999992053409080205e-1)},
+ {FN (cot), ARG(9.42512322775237976202e+00,5.0e-01), RES(1.2715121175407129542e-3, -2.1639524637389326068e0)},
+ {FN (cot), ARG(9.42512322775237976202e+00,-5.0e-01), RES(1.2715121175407129542e-3, 2.1639524637389326068e0)},
+ {FN (cot), ARG(-9.42512322775237976202e+00,5.0e-01), RES(-1.2715121175407129542e-3, -2.1639524637389326068e0)},
+ {FN (cot), ARG(-9.42512322775237976202e+00,-5.0e-01), RES(-1.2715121175407129542e-3, 2.1639524637389326068e0)},
+ {FN (cot), ARG(9.42512322775237976202e+00,1.0e+00), RES(2.4999454374180929074e-4, -1.3130351721648674832e0)},
+ {FN (cot), ARG(9.42512322775237976202e+00,-1.0e+00), RES(2.4999454374180929074e-4, 1.3130351721648674832e0)},
+ {FN (cot), ARG(-9.42512322775237976202e+00,1.0e+00), RES(-2.4999454374180929074e-4, -1.3130351721648674832e0)},
+ {FN (cot), ARG(-9.42512322775237976202e+00,-1.0e+00), RES(-2.4999454374180929074e-4, 1.3130351721648674832e0)},
+ {FN (cot), ARG(9.42512322775237976202e+00,2.0e+00), RES(2.6247825506472715712e-5, -1.0373147113268752621e0)},
+ {FN (cot), ARG(9.42512322775237976202e+00,-2.0e+00), RES(2.6247825506472715712e-5, 1.0373147113268752621e0)},
+ {FN (cot), ARG(-9.42512322775237976202e+00,2.0e+00), RES(-2.6247825506472715712e-5, -1.0373147113268752621e0)},
+ {FN (cot), ARG(-9.42512322775237976202e+00,-2.0e+00), RES(-2.6247825506472715712e-5, 1.0373147113268752621e0)},
+ {FN (arccsc), ARG(0.0e+00,1.19209289550781250e-07), RES(0, -1.6635532333438690979e1)},
+ {FN (arccsc), ARG(0.0e+00,-1.19209289550781250e-07), RES(0, 1.6635532333438690979e1)},
+ {FN (arccsc), ARG(0.0e+00,5.0e-01), RES(0, -1.4436354751788103425e0)},
+ {FN (arccsc), ARG(0.0e+00,-5.0e-01), RES(0, 1.4436354751788103425e0)},
+ {FN (arccsc), ARG(0.0e+00,1.0e+00), RES(0, -8.8137358701954302523e-1)},
+ {FN (arccsc), ARG(0.0e+00,-1.0e+00), RES(0, 8.8137358701954302523e-1)},
+ {FN (arccsc), ARG(0.0e+00,2.0e+00), RES(0, -4.8121182505960344750e-1)},
+ {FN (arccsc), ARG(0.0e+00,-2.0e+00), RES(0, 4.8121182505960344750e-1)},
+ {FN (arccsc), ARG(0.0e+00,8.3886080e+06), RES(0, -1.1920928955078096766e-7)},
+ {FN (arccsc), ARG(0.0e+00,-8.3886080e+06), RES(0, 1.1920928955078096766e-7)},
+ {FN (arccsc), ARG(1.19209289550781250e-07,0.0e+00), RES(1.5707963267948966192e0, -1.6635532333438683873e1)},
+ {FN (arccsc), ARG(-1.19209289550781250e-07,0.0e+00), RES(-1.5707963267948966192e0, 1.6635532333438683873e1)},
+ {FN (arccsc), ARG(1.19209289550781250e-07,1.19209289550781250e-07), RES(7.8539816339744120419e-1, -1.6288958743158714771e1)},
+ {FN (arccsc), ARG(1.19209289550781250e-07,-1.19209289550781250e-07), RES(7.8539816339744120419e-1, 1.6288958743158714771e1)},
+ {FN (arccsc), ARG(-1.19209289550781250e-07,1.19209289550781250e-07), RES(-7.8539816339744120419e-1, -1.6288958743158714771e1)},
+ {FN (arccsc), ARG(-1.19209289550781250e-07,-1.19209289550781250e-07), RES(-7.8539816339744120419e-1, 1.6288958743158714771e1)},
+ {FN (arccsc), ARG(1.19209289550781250e-07,5.0e-01), RES(2.1324805998799710740e-7, -1.4436354751787798371e0)},
+ {FN (arccsc), ARG(1.19209289550781250e-07,-5.0e-01), RES(2.1324805998799710740e-7, 1.4436354751787798371e0)},
+ {FN (arccsc), ARG(-1.19209289550781250e-07,5.0e-01), RES(-2.1324805998799710740e-7, -1.4436354751787798371e0)},
+ {FN (arccsc), ARG(-1.19209289550781250e-07,-5.0e-01), RES(-2.1324805998799710740e-7, 1.4436354751787798371e0)},
+ {FN (arccsc), ARG(1.19209289550781250e-07,1.0e+00), RES(8.4293697021787414719e-8, -8.8137358701953548879e-1)},
+ {FN (arccsc), ARG(1.19209289550781250e-07,-1.0e+00), RES(8.4293697021787414719e-8, 8.8137358701953548879e-1)},
+ {FN (arccsc), ARG(-1.19209289550781250e-07,1.0e+00), RES(-8.4293697021787414719e-8, -8.8137358701953548879e-1)},
+ {FN (arccsc), ARG(-1.19209289550781250e-07,-1.0e+00), RES(-8.4293697021787414719e-8, 8.8137358701953548879e-1)},
+ {FN (arccsc), ARG(1.19209289550781250e-07,2.0e+00), RES(2.6656007498500149811e-8, -4.8121182505960201756e-1)},
+ {FN (arccsc), ARG(1.19209289550781250e-07,-2.0e+00), RES(2.6656007498500149811e-8, 4.8121182505960201756e-1)},
+ {FN (arccsc), ARG(-1.19209289550781250e-07,2.0e+00), RES(-2.6656007498500149811e-8, -4.8121182505960201756e-1)},
+ {FN (arccsc), ARG(-1.19209289550781250e-07,-2.0e+00), RES(-2.6656007498500149811e-8, 4.8121182505960201756e-1)},
+ {FN (arccsc), ARG(1.19209289550781250e-07,8.3886080e+06), RES(1.6940658945085886411e-21, -1.1920928955078096766e-7)},
+ {FN (arccsc), ARG(1.19209289550781250e-07,-8.3886080e+06), RES(1.6940658945085886411e-21, 1.1920928955078096766e-7)},
+ {FN (arccsc), ARG(-1.19209289550781250e-07,8.3886080e+06), RES(-1.6940658945085886411e-21, -1.1920928955078096766e-7)},
+ {FN (arccsc), ARG(-1.19209289550781250e-07,-8.3886080e+06), RES(-1.6940658945085886411e-21, 1.1920928955078096766e-7)},
+ {FN (arccsc), ARG(5.0e-01,0.0e+00), RES(1.5707963267948966192e0, -1.3169578969248167086e0)},
+ {FN (arccsc), ARG(-5.0e-01,0.0e+00), RES(-1.5707963267948966192e0, 1.3169578969248167086e0)},
+ {FN (arccsc), ARG(5.0e-01,1.19209289550781250e-07), RES(1.5707960514928349710e0, -1.3169578969247948296e0)},
+ {FN (arccsc), ARG(5.0e-01,-1.19209289550781250e-07), RES(1.5707960514928349710e0, 1.3169578969247948296e0)},
+ {FN (arccsc), ARG(-5.0e-01,1.19209289550781250e-07), RES(-1.5707960514928349710e0, -1.3169578969247948296e0)},
+ {FN (arccsc), ARG(-5.0e-01,-1.19209289550781250e-07), RES(-1.5707960514928349710e0, 1.3169578969247948296e0)},
+ {FN (arccsc), ARG(5.0e-01,5.0e-01), RES(6.6623943249251525510e-1, -1.0612750619050356520e0)},
+ {FN (arccsc), ARG(5.0e-01,-5.0e-01), RES(6.6623943249251525510e-1, 1.0612750619050356520e0)},
+ {FN (arccsc), ARG(-5.0e-01,5.0e-01), RES(-6.6623943249251525510e-1, -1.0612750619050356520e0)},
+ {FN (arccsc), ARG(-5.0e-01,-5.0e-01), RES(-6.6623943249251525510e-1, 1.0612750619050356520e0)},
+ {FN (arccsc), ARG(5.0e-01,1.0e+00), RES(3.1122579724476109533e-1, -7.6388434595371104541e-1)},
+ {FN (arccsc), ARG(5.0e-01,-1.0e+00), RES(3.1122579724476109533e-1, 7.6388434595371104541e-1)},
+ {FN (arccsc), ARG(-5.0e-01,1.0e+00), RES(-3.1122579724476109533e-1, -7.6388434595371104541e-1)},
+ {FN (arccsc), ARG(-5.0e-01,-1.0e+00), RES(-3.1122579724476109533e-1, 7.6388434595371104541e-1)},
+ {FN (arccsc), ARG(5.0e-01,2.0e+00), RES(1.0654050295275703990e-1, -4.5717847686917515748e-1)},
+ {FN (arccsc), ARG(5.0e-01,-2.0e+00), RES(1.0654050295275703990e-1, 4.5717847686917515748e-1)},
+ {FN (arccsc), ARG(-5.0e-01,2.0e+00), RES(-1.0654050295275703990e-1, -4.5717847686917515748e-1)},
+ {FN (arccsc), ARG(-5.0e-01,-2.0e+00), RES(-1.0654050295275703990e-1, 4.5717847686917515748e-1)},
+ {FN (arccsc), ARG(5.0e-01,8.3886080e+06), RES(7.1054273576009261281e-15, -1.1920928955078054414e-7)},
+ {FN (arccsc), ARG(5.0e-01,-8.3886080e+06), RES(7.1054273576009261281e-15, 1.1920928955078054414e-7)},
+ {FN (arccsc), ARG(-5.0e-01,8.3886080e+06), RES(-7.1054273576009261281e-15, -1.1920928955078054414e-7)},
+ {FN (arccsc), ARG(-5.0e-01,-8.3886080e+06), RES(-7.1054273576009261281e-15, 1.1920928955078054414e-7)},
+ {FN (arccsc), ARG(1.0e+00,0.0e+00), RES(1.5707963267948966192e0, 0.0)},
+ {FN (arccsc), ARG(-1.0e+00,0.0e+00), RES(-1.5707963267948966192e0, 0.0)},
+ {FN (arccsc), ARG(1.0e+00,1.19209289550781250e-07), RES(1.5704510597947457801e0, -3.4526696585164602772e-4)},
+ {FN (arccsc), ARG(1.0e+00,-1.19209289550781250e-07), RES(1.5704510597947457801e0, 3.4526696585164602772e-4)},
+ {FN (arccsc), ARG(-1.0e+00,1.19209289550781250e-07), RES(-1.5704510597947457801e0, -3.4526696585164602772e-4)},
+ {FN (arccsc), ARG(-1.0e+00,-1.19209289550781250e-07), RES(-1.5704510597947457801e0, 3.4526696585164602772e-4)},
+ {FN (arccsc), ARG(1.0e+00,5.0e-01), RES(7.7308635671950473342e-1, -5.3321829058411214108e-1)},
+ {FN (arccsc), ARG(1.0e+00,-5.0e-01), RES(7.7308635671950473342e-1, 5.3321829058411214108e-1)},
+ {FN (arccsc), ARG(-1.0e+00,5.0e-01), RES(-7.7308635671950473342e-1, -5.3321829058411214108e-1)},
+ {FN (arccsc), ARG(-1.0e+00,-5.0e-01), RES(-7.7308635671950473342e-1, 5.3321829058411214108e-1)},
+ {FN (arccsc), ARG(1.0e+00,1.0e+00), RES(4.5227844715119068206e-1, -5.3063753095251782602e-1)},
+ {FN (arccsc), ARG(1.0e+00,-1.0e+00), RES(4.5227844715119068206e-1, 5.3063753095251782602e-1)},
+ {FN (arccsc), ARG(-1.0e+00,1.0e+00), RES(-4.5227844715119068206e-1, -5.3063753095251782602e-1)},
+ {FN (arccsc), ARG(-1.0e+00,-1.0e+00), RES(-4.5227844715119068206e-1, 5.3063753095251782602e-1)},
+ {FN (arccsc), ARG(1.0e+00,2.0e+00), RES(1.8631805410781552582e-1, -3.9656823011232897892e-1)},
+ {FN (arccsc), ARG(1.0e+00,-2.0e+00), RES(1.8631805410781552582e-1, 3.9656823011232897892e-1)},
+ {FN (arccsc), ARG(-1.0e+00,2.0e+00), RES(-1.8631805410781552582e-1, -3.9656823011232897892e-1)},
+ {FN (arccsc), ARG(-1.0e+00,-2.0e+00), RES(-1.8631805410781552582e-1, 3.9656823011232897892e-1)},
+ {FN (arccsc), ARG(1.0e+00,8.3886080e+06), RES(1.4210854715201700795e-14, -1.1920928955077927359e-7)},
+ {FN (arccsc), ARG(1.0e+00,-8.3886080e+06), RES(1.4210854715201700795e-14, 1.1920928955077927359e-7)},
+ {FN (arccsc), ARG(-1.0e+00,8.3886080e+06), RES(-1.4210854715201700795e-14, -1.1920928955077927359e-7)},
+ {FN (arccsc), ARG(-1.0e+00,-8.3886080e+06), RES(-1.4210854715201700795e-14, 1.1920928955077927359e-7)},
+ {FN (arccsc), ARG(2.0e+00,0.0e+00), RES(5.2359877559829887308e-1, 0.0)},
+ {FN (arccsc), ARG(-2.0e+00,0.0e+00), RES(-5.2359877559829887308e-1, 0.0)},
+ {FN (arccsc), ARG(2.0e+00,1.19209289550781250e-07), RES(5.2359877559829648006e-1, -3.4412757706023621662e-8)},
+ {FN (arccsc), ARG(2.0e+00,-1.19209289550781250e-07), RES(5.2359877559829648006e-1, 3.4412757706023621662e-8)},
+ {FN (arccsc), ARG(-2.0e+00,1.19209289550781250e-07), RES(-5.2359877559829648006e-1, -3.4412757706023621662e-8)},
+ {FN (arccsc), ARG(-2.0e+00,-1.19209289550781250e-07), RES(-5.2359877559829648006e-1, 3.4412757706023621662e-8)},
+ {FN (arccsc), ARG(2.0e+00,5.0e-01), RES(4.8530734047334251250e-1, -1.3261586085051183885e-1)},
+ {FN (arccsc), ARG(2.0e+00,-5.0e-01), RES(4.8530734047334251250e-1, 1.3261586085051183885e-1)},
+ {FN (arccsc), ARG(-2.0e+00,5.0e-01), RES(-4.8530734047334251250e-1, -1.3261586085051183885e-1)},
+ {FN (arccsc), ARG(-2.0e+00,-5.0e-01), RES(-4.8530734047334251250e-1, 1.3261586085051183885e-1)},
+ {FN (arccsc), ARG(2.0e+00,1.0e+00), RES(4.0158639166780606828e-1, -2.1561241855582964497e-1)},
+ {FN (arccsc), ARG(2.0e+00,-1.0e+00), RES(4.0158639166780606828e-1, 2.1561241855582964497e-1)},
+ {FN (arccsc), ARG(-2.0e+00,1.0e+00), RES(-4.0158639166780606828e-1, -2.1561241855582964497e-1)},
+ {FN (arccsc), ARG(-2.0e+00,-1.0e+00), RES(-4.0158639166780606828e-1, 2.1561241855582964497e-1)},
+ {FN (arccsc), ARG(2.0e+00,2.0e+00), RES(2.4452216513554014646e-1, -2.5489557334055081773e-1)},
+ {FN (arccsc), ARG(2.0e+00,-2.0e+00), RES(2.4452216513554014646e-1, 2.5489557334055081773e-1)},
+ {FN (arccsc), ARG(-2.0e+00,2.0e+00), RES(-2.4452216513554014646e-1, -2.5489557334055081773e-1)},
+ {FN (arccsc), ARG(-2.0e+00,-2.0e+00), RES(-2.4452216513554014646e-1, 2.5489557334055081773e-1)},
+ {FN (arccsc), ARG(2.0e+00,8.3886080e+06), RES(2.8421709430402189899e-14, -1.1920928955077419139e-7)},
+ {FN (arccsc), ARG(2.0e+00,-8.3886080e+06), RES(2.8421709430402189899e-14, 1.1920928955077419139e-7)},
+ {FN (arccsc), ARG(-2.0e+00,8.3886080e+06), RES(-2.8421709430402189899e-14, -1.1920928955077419139e-7)},
+ {FN (arccsc), ARG(-2.0e+00,-8.3886080e+06), RES(-2.8421709430402189899e-14, 1.1920928955077419139e-7)},
+ {FN (arccsc), ARG(8.3886080e+06,0.0e+00), RES(1.1920928955078153234e-7, 0.0)},
+ {FN (arccsc), ARG(-8.3886080e+06,0.0e+00), RES(-1.1920928955078153234e-7, 0.0)},
+ {FN (arccsc), ARG(8.3886080e+06,1.19209289550781250e-07), RES(1.1920928955078153234e-7, -1.6940658945086127152e-21)},
+ {FN (arccsc), ARG(8.3886080e+06,-1.19209289550781250e-07), RES(1.1920928955078153234e-7, 1.6940658945086127152e-21)},
+ {FN (arccsc), ARG(-8.3886080e+06,1.19209289550781250e-07), RES(-1.1920928955078153234e-7, -1.6940658945086127152e-21)},
+ {FN (arccsc), ARG(-8.3886080e+06,-1.19209289550781250e-07), RES(-1.1920928955078153234e-7, 1.6940658945086127152e-21)},
+ {FN (arccsc), ARG(8.3886080e+06,5.0e-01), RES(1.1920928955078110883e-7, -7.1054273576010271023e-15)},
+ {FN (arccsc), ARG(8.3886080e+06,-5.0e-01), RES(1.1920928955078110883e-7, 7.1054273576010271023e-15)},
+ {FN (arccsc), ARG(-8.3886080e+06,5.0e-01), RES(-1.1920928955078110883e-7, -7.1054273576010271023e-15)},
+ {FN (arccsc), ARG(-8.3886080e+06,-5.0e-01), RES(-1.1920928955078110883e-7, 7.1054273576010271023e-15)},
+ {FN (arccsc), ARG(8.3886080e+06,1.0e+00), RES(1.1920928955077983828e-7, -1.4210854715201902743e-14)},
+ {FN (arccsc), ARG(8.3886080e+06,-1.0e+00), RES(1.1920928955077983828e-7, 1.4210854715201902743e-14)},
+ {FN (arccsc), ARG(-8.3886080e+06,1.0e+00), RES(-1.1920928955077983828e-7, -1.4210854715201902743e-14)},
+ {FN (arccsc), ARG(-8.3886080e+06,-1.0e+00), RES(-1.1920928955077983828e-7, 1.4210854715201902743e-14)},
+ {FN (arccsc), ARG(8.3886080e+06,2.0e+00), RES(1.1920928955077475608e-7, -2.8421709430402593796e-14)},
+ {FN (arccsc), ARG(8.3886080e+06,-2.0e+00), RES(1.1920928955077475608e-7, 2.8421709430402593796e-14)},
+ {FN (arccsc), ARG(-8.3886080e+06,2.0e+00), RES(-1.1920928955077475608e-7, -2.8421709430402593796e-14)},
+ {FN (arccsc), ARG(-8.3886080e+06,-2.0e+00), RES(-1.1920928955077475608e-7, 2.8421709430402593796e-14)},
+ {FN (arccsc), ARG(8.3886080e+06,8.3886080e+06), RES(5.9604644775390554414e-8, -5.9604644775390695586e-8)},
+ {FN (arccsc), ARG(8.3886080e+06,-8.3886080e+06), RES(5.9604644775390554414e-8, 5.9604644775390695586e-8)},
+ {FN (arccsc), ARG(-8.3886080e+06,8.3886080e+06), RES(-5.9604644775390554414e-8, -5.9604644775390695586e-8)},
+ {FN (arccsc), ARG(-8.3886080e+06,-8.3886080e+06), RES(-5.9604644775390554414e-8, 5.9604644775390695586e-8)},
+ {FN (arcsec), ARG(0.0e+00,1.19209289550781250e-07), RES(1.5707963267948966192e0, 1.6635532333438690979e1)},
+ {FN (arcsec), ARG(0.0e+00,-1.19209289550781250e-07), RES(1.5707963267948966192e0, -1.6635532333438690979e1)},
+ {FN (arcsec), ARG(0.0e+00,5.0e-01), RES(1.5707963267948966192e0, 1.4436354751788103425e0)},
+ {FN (arcsec), ARG(0.0e+00,-5.0e-01), RES(1.5707963267948966192e0, -1.4436354751788103425e0)},
+ {FN (arcsec), ARG(0.0e+00,1.0e+00), RES(1.5707963267948966192e0, 8.8137358701954302523e-1)},
+ {FN (arcsec), ARG(0.0e+00,-1.0e+00), RES(1.5707963267948966192e0, -8.8137358701954302523e-1)},
+ {FN (arcsec), ARG(0.0e+00,2.0e+00), RES(1.5707963267948966192e0, 4.8121182505960344750e-1)},
+ {FN (arcsec), ARG(0.0e+00,-2.0e+00), RES(1.5707963267948966192e0, -4.8121182505960344750e-1)},
+ {FN (arcsec), ARG(0.0e+00,8.3886080e+06), RES(1.5707963267948966192e0, 1.1920928955078096766e-7)},
+ {FN (arcsec), ARG(0.0e+00,-8.3886080e+06), RES(1.5707963267948966192e0, -1.1920928955078096766e-7)},
+ {FN (arcsec), ARG(1.19209289550781250e-07,0.0e+00), RES(0, 1.6635532333438683873e1)},
+ {FN (arcsec), ARG(-1.19209289550781250e-07,0.0e+00), RES(3.1415926535897932385e0, -1.6635532333438683873e1)},
+ {FN (arcsec), ARG(1.19209289550781250e-07,1.19209289550781250e-07), RES(7.8539816339745541504e-1, 1.6288958743158714771e1)},
+ {FN (arcsec), ARG(1.19209289550781250e-07,-1.19209289550781250e-07), RES(7.8539816339745541504e-1, -1.6288958743158714771e1)},
+ {FN (arcsec), ARG(-1.19209289550781250e-07,1.19209289550781250e-07), RES(2.3561944901923378234e0, 1.6288958743158714771e1)},
+ {FN (arcsec), ARG(-1.19209289550781250e-07,-1.19209289550781250e-07), RES(2.3561944901923378234e0, -1.6288958743158714771e1)},
+ {FN (arcsec), ARG(1.19209289550781250e-07,5.0e-01), RES(1.5707961135468366312e0, 1.4436354751787798371e0)},
+ {FN (arcsec), ARG(1.19209289550781250e-07,-5.0e-01), RES(1.5707961135468366312e0, -1.4436354751787798371e0)},
+ {FN (arcsec), ARG(-1.19209289550781250e-07,5.0e-01), RES(1.5707965400429566072e0, 1.4436354751787798371e0)},
+ {FN (arcsec), ARG(-1.19209289550781250e-07,-5.0e-01), RES(1.5707965400429566072e0, -1.4436354751787798371e0)},
+ {FN (arcsec), ARG(1.19209289550781250e-07,1.0e+00), RES(1.5707962425011995974e0, 8.8137358701953548879e-1)},
+ {FN (arcsec), ARG(1.19209289550781250e-07,-1.0e+00), RES(1.5707962425011995974e0, -8.8137358701953548879e-1)},
+ {FN (arcsec), ARG(-1.19209289550781250e-07,1.0e+00), RES(1.5707964110885936410e0, 8.8137358701953548879e-1)},
+ {FN (arcsec), ARG(-1.19209289550781250e-07,-1.0e+00), RES(1.5707964110885936410e0, -8.8137358701953548879e-1)},
+ {FN (arcsec), ARG(1.19209289550781250e-07,2.0e+00), RES(1.5707963001388891207e0, 4.8121182505960201756e-1)},
+ {FN (arcsec), ARG(1.19209289550781250e-07,-2.0e+00), RES(1.5707963001388891207e0, -4.8121182505960201756e-1)},
+ {FN (arcsec), ARG(-1.19209289550781250e-07,2.0e+00), RES(1.5707963534509041177e0, 4.8121182505960201756e-1)},
+ {FN (arcsec), ARG(-1.19209289550781250e-07,-2.0e+00), RES(1.5707963534509041177e0, -4.8121182505960201756e-1)},
+ {FN (arcsec), ARG(1.19209289550781250e-07,8.3886080e+06), RES(1.5707963267948966192e0, 1.1920928955078096766e-7)},
+ {FN (arcsec), ARG(1.19209289550781250e-07,-8.3886080e+06), RES(1.5707963267948966192e0, -1.1920928955078096766e-7)},
+ {FN (arcsec), ARG(-1.19209289550781250e-07,8.3886080e+06), RES(1.5707963267948966192e0, 1.1920928955078096766e-7)},
+ {FN (arcsec), ARG(-1.19209289550781250e-07,-8.3886080e+06), RES(1.5707963267948966192e0, -1.1920928955078096766e-7)},
+ {FN (arcsec), ARG(5.0e-01,0.0e+00), RES(0, 1.3169578969248167086e0)},
+ {FN (arcsec), ARG(-5.0e-01,0.0e+00), RES(3.1415926535897932385e0, -1.3169578969248167086e0)},
+ {FN (arcsec), ARG(5.0e-01,1.19209289550781250e-07), RES(2.7530206164818516969e-7, 1.3169578969247948296e0)},
+ {FN (arcsec), ARG(5.0e-01,-1.19209289550781250e-07), RES(2.7530206164818516969e-7, -1.3169578969247948296e0)},
+ {FN (arcsec), ARG(-5.0e-01,1.19209289550781250e-07), RES(3.1415923782877315903e0, 1.3169578969247948296e0)},
+ {FN (arcsec), ARG(-5.0e-01,-1.19209289550781250e-07), RES(3.1415923782877315903e0, -1.3169578969247948296e0)},
+ {FN (arcsec), ARG(5.0e-01,5.0e-01), RES(9.0455689430238136413e-1, 1.0612750619050356520e0)},
+ {FN (arcsec), ARG(5.0e-01,-5.0e-01), RES(9.0455689430238136413e-1, -1.0612750619050356520e0)},
+ {FN (arcsec), ARG(-5.0e-01,5.0e-01), RES(2.2370357592874118743e0, 1.0612750619050356520e0)},
+ {FN (arcsec), ARG(-5.0e-01,-5.0e-01), RES(2.2370357592874118743e0, -1.0612750619050356520e0)},
+ {FN (arcsec), ARG(5.0e-01,1.0e+00), RES(1.2595705295501355239e0, 7.6388434595371104541e-1)},
+ {FN (arcsec), ARG(5.0e-01,-1.0e+00), RES(1.2595705295501355239e0, -7.6388434595371104541e-1)},
+ {FN (arcsec), ARG(-5.0e-01,1.0e+00), RES(1.8820221240396577146e0, 7.6388434595371104541e-1)},
+ {FN (arcsec), ARG(-5.0e-01,-1.0e+00), RES(1.8820221240396577146e0, -7.6388434595371104541e-1)},
+ {FN (arcsec), ARG(5.0e-01,2.0e+00), RES(1.4642558238421395793e0, 4.5717847686917515748e-1)},
+ {FN (arcsec), ARG(5.0e-01,-2.0e+00), RES(1.4642558238421395793e0, -4.5717847686917515748e-1)},
+ {FN (arcsec), ARG(-5.0e-01,2.0e+00), RES(1.6773368297476536591e0, 4.5717847686917515748e-1)},
+ {FN (arcsec), ARG(-5.0e-01,-2.0e+00), RES(1.6773368297476536591e0, -4.5717847686917515748e-1)},
+ {FN (arcsec), ARG(5.0e-01,8.3886080e+06), RES(1.5707963267948895138e0, 1.1920928955078054414e-7)},
+ {FN (arcsec), ARG(5.0e-01,-8.3886080e+06), RES(1.5707963267948895138e0, -1.1920928955078054414e-7)},
+ {FN (arcsec), ARG(-5.0e-01,8.3886080e+06), RES(1.5707963267949037247e0, 1.1920928955078054414e-7)},
+ {FN (arcsec), ARG(-5.0e-01,-8.3886080e+06), RES(1.5707963267949037247e0, -1.1920928955078054414e-7)},
+ {FN (arcsec), ARG(1.0e+00,0.0e+00), RES(0e0, 0.0)},
+ {FN (arcsec), ARG(-1.0e+00,0.0e+00), RES(3.1415926535897932385e0, 0.0)},
+ {FN (arcsec), ARG(1.0e+00,1.19209289550781250e-07), RES(3.4526700015083915182e-4, 3.4526696585164602772e-4)},
+ {FN (arcsec), ARG(1.0e+00,-1.19209289550781250e-07), RES(3.4526700015083915182e-4, -3.4526696585164602772e-4)},
+ {FN (arcsec), ARG(-1.0e+00,1.19209289550781250e-07), RES(3.1412473865896423993e0, 3.4526696585164602772e-4)},
+ {FN (arcsec), ARG(-1.0e+00,-1.19209289550781250e-07), RES(3.1412473865896423993e0, -3.4526696585164602772e-4)},
+ {FN (arcsec), ARG(1.0e+00,5.0e-01), RES(7.9770997007539188581e-1, 5.3321829058411214108e-1)},
+ {FN (arcsec), ARG(1.0e+00,-5.0e-01), RES(7.9770997007539188581e-1, -5.3321829058411214108e-1)},
+ {FN (arcsec), ARG(-1.0e+00,5.0e-01), RES(2.3438826835144013527e0, 5.3321829058411214108e-1)},
+ {FN (arcsec), ARG(-1.0e+00,-5.0e-01), RES(2.3438826835144013527e0, -5.3321829058411214108e-1)},
+ {FN (arcsec), ARG(1.0e+00,1.0e+00), RES(1.1185178796437059372e0, 5.3063753095251782602e-1)},
+ {FN (arcsec), ARG(1.0e+00,-1.0e+00), RES(1.1185178796437059372e0, -5.3063753095251782602e-1)},
+ {FN (arcsec), ARG(-1.0e+00,1.0e+00), RES(2.0230747739460873013e0, 5.3063753095251782602e-1)},
+ {FN (arcsec), ARG(-1.0e+00,-1.0e+00), RES(2.0230747739460873013e0, -5.3063753095251782602e-1)},
+ {FN (arcsec), ARG(1.0e+00,2.0e+00), RES(1.3844782726870810934e0, 3.9656823011232897892e-1)},
+ {FN (arcsec), ARG(1.0e+00,-2.0e+00), RES(1.3844782726870810934e0, -3.9656823011232897892e-1)},
+ {FN (arcsec), ARG(-1.0e+00,2.0e+00), RES(1.7571143809027121451e0, 3.9656823011232897892e-1)},
+ {FN (arcsec), ARG(-1.0e+00,-2.0e+00), RES(1.7571143809027121451e0, -3.9656823011232897892e-1)},
+ {FN (arcsec), ARG(1.0e+00,8.3886080e+06), RES(1.5707963267948824084e0, 1.1920928955077927359e-7)},
+ {FN (arcsec), ARG(1.0e+00,-8.3886080e+06), RES(1.5707963267948824084e0, -1.1920928955077927359e-7)},
+ {FN (arcsec), ARG(-1.0e+00,8.3886080e+06), RES(1.5707963267949108301e0, 1.1920928955077927359e-7)},
+ {FN (arcsec), ARG(-1.0e+00,-8.3886080e+06), RES(1.5707963267949108301e0, -1.1920928955077927359e-7)},
+ {FN (arcsec), ARG(2.0e+00,0.0e+00), RES(1.0471975511965977462e0, 0.0)},
+ {FN (arcsec), ARG(-2.0e+00,0.0e+00), RES(2.0943951023931954923e0, 0.0)},
+ {FN (arcsec), ARG(2.0e+00,1.19209289550781250e-07), RES(1.0471975511966001392e0, 3.4412757706023621662e-8)},
+ {FN (arcsec), ARG(2.0e+00,-1.19209289550781250e-07), RES(1.0471975511966001392e0, -3.4412757706023621662e-8)},
+ {FN (arcsec), ARG(-2.0e+00,1.19209289550781250e-07), RES(2.0943951023931930993e0, 3.4412757706023621662e-8)},
+ {FN (arcsec), ARG(-2.0e+00,-1.19209289550781250e-07), RES(2.0943951023931930993e0, -3.4412757706023621662e-8)},
+ {FN (arcsec), ARG(2.0e+00,5.0e-01), RES(1.0854889863215541067e0, 1.3261586085051183885e-1)},
+ {FN (arcsec), ARG(2.0e+00,-5.0e-01), RES(1.0854889863215541067e0, -1.3261586085051183885e-1)},
+ {FN (arcsec), ARG(-2.0e+00,5.0e-01), RES(2.0561036672682391317e0, 1.3261586085051183885e-1)},
+ {FN (arcsec), ARG(-2.0e+00,-5.0e-01), RES(2.0561036672682391317e0, -1.3261586085051183885e-1)},
+ {FN (arcsec), ARG(2.0e+00,1.0e+00), RES(1.1692099351270905509e0, 2.1561241855582964497e-1)},
+ {FN (arcsec), ARG(2.0e+00,-1.0e+00), RES(1.1692099351270905509e0, -2.1561241855582964497e-1)},
+ {FN (arcsec), ARG(-2.0e+00,1.0e+00), RES(1.9723827184627026875e0, 2.1561241855582964497e-1)},
+ {FN (arcsec), ARG(-2.0e+00,-1.0e+00), RES(1.9723827184627026875e0, -2.1561241855582964497e-1)},
+ {FN (arcsec), ARG(2.0e+00,2.0e+00), RES(1.3262741616593564728e0, 2.5489557334055081773e-1)},
+ {FN (arcsec), ARG(2.0e+00,-2.0e+00), RES(1.3262741616593564728e0, -2.5489557334055081773e-1)},
+ {FN (arcsec), ARG(-2.0e+00,2.0e+00), RES(1.8153184919304367657e0, 2.5489557334055081773e-1)},
+ {FN (arcsec), ARG(-2.0e+00,-2.0e+00), RES(1.8153184919304367657e0, -2.5489557334055081773e-1)},
+ {FN (arcsec), ARG(2.0e+00,8.3886080e+06), RES(1.5707963267948681975e0, 1.1920928955077419139e-7)},
+ {FN (arcsec), ARG(2.0e+00,-8.3886080e+06), RES(1.5707963267948681975e0, -1.1920928955077419139e-7)},
+ {FN (arcsec), ARG(-2.0e+00,8.3886080e+06), RES(1.5707963267949250409e0, 1.1920928955077419139e-7)},
+ {FN (arcsec), ARG(-2.0e+00,-8.3886080e+06), RES(1.5707963267949250409e0, -1.1920928955077419139e-7)},
+ {FN (arcsec), ARG(8.3886080e+06,0.0e+00), RES(1.5707962075856070684e0, 0.0)},
+ {FN (arcsec), ARG(-8.3886080e+06,0.0e+00), RES(1.570796446004186170e0, 0.0)},
+ {FN (arcsec), ARG(8.3886080e+06,1.19209289550781250e-07), RES(1.5707962075856070684e0, 1.6940658945086127152e-21)},
+ {FN (arcsec), ARG(8.3886080e+06,-1.19209289550781250e-07), RES(1.5707962075856070684e0, -1.6940658945086127152e-21)},
+ {FN (arcsec), ARG(-8.3886080e+06,1.19209289550781250e-07), RES(1.570796446004186170e0, 1.6940658945086127152e-21)},
+ {FN (arcsec), ARG(-8.3886080e+06,-1.19209289550781250e-07), RES(1.570796446004186170e0, -1.6940658945086127152e-21)},
+ {FN (arcsec), ARG(8.3886080e+06,5.0e-01), RES(1.5707962075856070685e0, 7.1054273576010271023e-15)},
+ {FN (arcsec), ARG(8.3886080e+06,-5.0e-01), RES(1.5707962075856070685e0, -7.1054273576010271023e-15)},
+ {FN (arcsec), ARG(-8.3886080e+06,5.0e-01), RES(1.570796446004186170e0, 7.1054273576010271023e-15)},
+ {FN (arcsec), ARG(-8.3886080e+06,-5.0e-01), RES(1.570796446004186170e0, -7.1054273576010271023e-15)},
+ {FN (arcsec), ARG(8.3886080e+06,1.0e+00), RES(1.5707962075856070685e0, 1.4210854715201902743e-14)},
+ {FN (arcsec), ARG(8.3886080e+06,-1.0e+00), RES(1.5707962075856070685e0, -1.4210854715201902743e-14)},
+ {FN (arcsec), ARG(-8.3886080e+06,1.0e+00), RES(1.570796446004186170e0, 1.4210854715201902743e-14)},
+ {FN (arcsec), ARG(-8.3886080e+06,-1.0e+00), RES(1.570796446004186170e0, -1.4210854715201902743e-14)},
+ {FN (arcsec), ARG(8.3886080e+06,2.0e+00), RES(1.5707962075856070685e0, 2.8421709430402593796e-14)},
+ {FN (arcsec), ARG(8.3886080e+06,-2.0e+00), RES(1.5707962075856070685e0, -2.8421709430402593796e-14)},
+ {FN (arcsec), ARG(-8.3886080e+06,2.0e+00), RES(1.570796446004186170e0, 2.8421709430402593796e-14)},
+ {FN (arcsec), ARG(-8.3886080e+06,-2.0e+00), RES(1.570796446004186170e0, -2.8421709430402593796e-14)},
+ {FN (arcsec), ARG(8.3886080e+06,8.3886080e+06), RES(1.5707962671902518438e0, 5.9604644775390695586e-8)},
+ {FN (arcsec), ARG(8.3886080e+06,-8.3886080e+06), RES(1.5707962671902518438e0, -5.9604644775390695586e-8)},
+ {FN (arcsec), ARG(-8.3886080e+06,8.3886080e+06), RES(1.5707963863995413946e0, 5.9604644775390695586e-8)},
+ {FN (arcsec), ARG(-8.3886080e+06,-8.3886080e+06), RES(1.5707963863995413946e0, -5.9604644775390695586e-8)},
+ {FN (arccot), ARG(0.0e+00,1.19209289550781250e-07), RES(-1.5707963267948966192e0, -1.1920928955078181469e-7)},
+ {FN (arccot), ARG(0.0e+00,-1.19209289550781250e-07), RES(1.5707963267948966192e0, 1.1920928955078181469e-7)},
+ {FN (arccot), ARG(0.0e+00,5.0e-01), RES(-1.5707963267948966192e0, -5.4930614433405484570e-1)},
+ {FN (arccot), ARG(0.0e+00,-5.0e-01), RES(1.5707963267948966192e0, 5.4930614433405484570e-1)},
+ {FN (arccot), ARG(0.0e+00,2.0e+00), RES(0, -5.4930614433405484570e-1)},
+ {FN (arccot), ARG(0.0e+00,-2.0e+00), RES(0, 5.4930614433405484570e-1)},
+ {FN (arccot), ARG(0.0e+00,8.3886080e+06), RES(0, -1.1920928955078181469e-7)},
+ {FN (arccot), ARG(0.0e+00,-8.3886080e+06), RES(0, 1.1920928955078181469e-7)},
+ {FN (arccot), ARG(1.19209289550781250e-07,0.0e+00), RES(1.5707962075856070685e0, 0.0)},
+ {FN (arccot), ARG(-1.19209289550781250e-07,0.0e+00), RES(-1.5707962075856070685e0, 0.0)},
+ {FN (arccot), ARG(1.19209289550781250e-07,1.19209289550781250e-07), RES(1.5707962075856070684e0, -1.1920928955078012062e-7)},
+ {FN (arccot), ARG(1.19209289550781250e-07,-1.19209289550781250e-07), RES(1.5707962075856070684e0, 1.1920928955078012062e-7)},
+ {FN (arccot), ARG(-1.19209289550781250e-07,1.19209289550781250e-07), RES(-1.5707962075856070684e0, -1.1920928955078012062e-7)},
+ {FN (arccot), ARG(-1.19209289550781250e-07,-1.19209289550781250e-07), RES(-1.5707962075856070684e0, 1.1920928955078012062e-7)},
+ {FN (arccot), ARG(1.19209289550781250e-07,5.0e-01), RES(1.5707961678491772182e0, -5.4930614433404221383e-1)},
+ {FN (arccot), ARG(1.19209289550781250e-07,-5.0e-01), RES(1.5707961678491772182e0, 5.4930614433404221383e-1)},
+ {FN (arccot), ARG(-1.19209289550781250e-07,5.0e-01), RES(-1.5707961678491772182e0, -5.4930614433404221383e-1)},
+ {FN (arccot), ARG(-1.19209289550781250e-07,-5.0e-01), RES(-1.5707961678491772182e0, 5.4930614433404221383e-1)},
+ {FN (arccot), ARG(1.19209289550781250e-07,1.0e+00), RES(7.8539813359512592192e-1, -8.3177661667193446012e0)},
+ {FN (arccot), ARG(1.19209289550781250e-07,-1.0e+00), RES(7.8539813359512592192e-1, 8.3177661667193446012e0)},
+ {FN (arccot), ARG(-1.19209289550781250e-07,1.0e+00), RES(-7.8539813359512592192e-1, -8.3177661667193446012e0)},
+ {FN (arccot), ARG(-1.19209289550781250e-07,-1.0e+00), RES(-7.8539813359512592192e-1, 8.3177661667193446012e0)},
+ {FN (arccot), ARG(1.19209289550781250e-07,2.0e+00), RES(3.9736429850260144780e-8, -5.4930614433405168773e-1)},
+ {FN (arccot), ARG(1.19209289550781250e-07,-2.0e+00), RES(3.9736429850260144780e-8, 5.4930614433405168773e-1)},
+ {FN (arccot), ARG(-1.19209289550781250e-07,2.0e+00), RES(-3.9736429850260144780e-8, -5.4930614433405168773e-1)},
+ {FN (arccot), ARG(-1.19209289550781250e-07,-2.0e+00), RES(-3.9736429850260144780e-8, 5.4930614433405168773e-1)},
+ {FN (arccot), ARG(1.19209289550781250e-07,8.3886080e+06), RES(1.6940658945086247523e-21, -1.1920928955078181469e-7)},
+ {FN (arccot), ARG(1.19209289550781250e-07,-8.3886080e+06), RES(1.6940658945086247523e-21, 1.1920928955078181469e-7)},
+ {FN (arccot), ARG(-1.19209289550781250e-07,8.3886080e+06), RES(-1.6940658945086247523e-21, -1.1920928955078181469e-7)},
+ {FN (arccot), ARG(-1.19209289550781250e-07,-8.3886080e+06), RES(-1.6940658945086247523e-21, 1.1920928955078181469e-7)},
+ {FN (arccot), ARG(5.0e-01,0.0e+00), RES(1.1071487177940905030e0, 0.0)},
+ {FN (arccot), ARG(-5.0e-01,0.0e+00), RES(-1.1071487177940905030e0, 0.0)},
+ {FN (arccot), ARG(5.0e-01,1.19209289550781250e-07), RES(1.1071487177940859555e0, -9.5367431640625072280e-8)},
+ {FN (arccot), ARG(5.0e-01,-1.19209289550781250e-07), RES(1.1071487177940859555e0, 9.5367431640625072280e-8)},
+ {FN (arccot), ARG(-5.0e-01,1.19209289550781250e-07), RES(-1.1071487177940859555e0, -9.5367431640625072280e-8)},
+ {FN (arccot), ARG(-5.0e-01,-1.19209289550781250e-07), RES(-1.1071487177940859555e0, 9.5367431640625072280e-8)},
+ {FN (arccot), ARG(5.0e-01,5.0e-01), RES(1.0172219678978513677e0, -4.0235947810852509365e-1)},
+ {FN (arccot), ARG(5.0e-01,-5.0e-01), RES(1.0172219678978513677e0, 4.0235947810852509365e-1)},
+ {FN (arccot), ARG(-5.0e-01,5.0e-01), RES(-1.0172219678978513677e0, -4.0235947810852509365e-1)},
+ {FN (arccot), ARG(-5.0e-01,-5.0e-01), RES(-1.0172219678978513677e0, 4.0235947810852509365e-1)},
+ {FN (arccot), ARG(5.0e-01,1.0e+00), RES(6.6290883183401623253e-1, -7.0830333601405402006e-1)},
+ {FN (arccot), ARG(5.0e-01,-1.0e+00), RES(6.6290883183401623253e-1, 7.0830333601405402006e-1)},
+ {FN (arccot), ARG(-5.0e-01,1.0e+00), RES(-6.6290883183401623253e-1, -7.0830333601405402006e-1)},
+ {FN (arccot), ARG(-5.0e-01,-1.0e+00), RES(-6.6290883183401623253e-1, 7.0830333601405402006e-1)},
+ {FN (arccot), ARG(5.0e-01,2.0e+00), RES(1.4924946579308963897e-1, -5.0037000005253101744e-1)},
+ {FN (arccot), ARG(5.0e-01,-2.0e+00), RES(1.4924946579308963897e-1, 5.0037000005253101744e-1)},
+ {FN (arccot), ARG(-5.0e-01,2.0e+00), RES(-1.4924946579308963897e-1, -5.0037000005253101744e-1)},
+ {FN (arccot), ARG(-5.0e-01,-2.0e+00), RES(-1.4924946579308963897e-1, 5.0037000005253101744e-1)},
+ {FN (arccot), ARG(5.0e-01,8.3886080e+06), RES(7.1054273576010775894e-15, -1.1920928955078139117e-7)},
+ {FN (arccot), ARG(5.0e-01,-8.3886080e+06), RES(7.1054273576010775894e-15, 1.1920928955078139117e-7)},
+ {FN (arccot), ARG(-5.0e-01,8.3886080e+06), RES(-7.1054273576010775894e-15, -1.1920928955078139117e-7)},
+ {FN (arccot), ARG(-5.0e-01,-8.3886080e+06), RES(-7.1054273576010775894e-15, 1.1920928955078139117e-7)},
+ {FN (arccot), ARG(1.0e+00,0.0e+00), RES(7.8539816339744830962e-1, 0.0)},
+ {FN (arccot), ARG(-1.0e+00,0.0e+00), RES(-7.8539816339744830962e-1, 0.0)},
+ {FN (arccot), ARG(1.0e+00,1.19209289550781250e-07), RES(7.8539816339744475690e-1, -5.9604644775390483828e-8)},
+ {FN (arccot), ARG(1.0e+00,-1.19209289550781250e-07), RES(7.8539816339744475690e-1, 5.9604644775390483828e-8)},
+ {FN (arccot), ARG(-1.0e+00,1.19209289550781250e-07), RES(-7.8539816339744475690e-1, -5.9604644775390483828e-8)},
+ {FN (arccot), ARG(-1.0e+00,-1.19209289550781250e-07), RES(-7.8539816339744475690e-1, 5.9604644775390483828e-8)},
+ {FN (arccot), ARG(1.0e+00,5.0e-01), RES(7.2322066612406759210e-1, -2.3887786125685909036e-1)},
+ {FN (arccot), ARG(1.0e+00,-5.0e-01), RES(7.2322066612406759210e-1, 2.3887786125685909036e-1)},
+ {FN (arccot), ARG(-1.0e+00,5.0e-01), RES(-7.2322066612406759210e-1, -2.3887786125685909036e-1)},
+ {FN (arccot), ARG(-1.0e+00,-5.0e-01), RES(-7.2322066612406759210e-1, 2.3887786125685909036e-1)},
+ {FN (arccot), ARG(1.0e+00,1.0e+00), RES(5.5357435889704525151e-1, -4.0235947810852509365e-1)},
+ {FN (arccot), ARG(1.0e+00,-1.0e+00), RES(5.5357435889704525151e-1, 4.0235947810852509365e-1)},
+ {FN (arccot), ARG(-1.0e+00,1.0e+00), RES(-5.5357435889704525151e-1, -4.0235947810852509365e-1)},
+ {FN (arccot), ARG(-1.0e+00,-1.0e+00), RES(-5.5357435889704525151e-1, 4.0235947810852509365e-1)},
+ {FN (arccot), ARG(1.0e+00,2.0e+00), RES(2.3182380450040305811e-1, -4.0235947810852509365e-1)},
+ {FN (arccot), ARG(1.0e+00,-2.0e+00), RES(2.3182380450040305811e-1, 4.0235947810852509365e-1)},
+ {FN (arccot), ARG(-1.0e+00,2.0e+00), RES(-2.3182380450040305811e-1, -4.0235947810852509365e-1)},
+ {FN (arccot), ARG(-1.0e+00,-2.0e+00), RES(-2.3182380450040305811e-1, 4.0235947810852509365e-1)},
+ {FN (arccot), ARG(1.0e+00,8.3886080e+06), RES(1.4210854715202003717e-14, -1.1920928955078012062e-7)},
+ {FN (arccot), ARG(1.0e+00,-8.3886080e+06), RES(1.4210854715202003717e-14, 1.1920928955078012062e-7)},
+ {FN (arccot), ARG(-1.0e+00,8.3886080e+06), RES(-1.4210854715202003717e-14, -1.1920928955078012062e-7)},
+ {FN (arccot), ARG(-1.0e+00,-8.3886080e+06), RES(-1.4210854715202003717e-14, 1.1920928955078012062e-7)},
+ {FN (arccot), ARG(2.0e+00,0.0e+00), RES(4.6364760900080611621e-1, 0.0)},
+ {FN (arccot), ARG(-2.0e+00,0.0e+00), RES(-4.6364760900080611621e-1, 0.0)},
+ {FN (arccot), ARG(2.0e+00,1.19209289550781250e-07), RES(4.6364760900080497935e-1, -2.3841857910156200307e-8)},
+ {FN (arccot), ARG(2.0e+00,-1.19209289550781250e-07), RES(4.6364760900080497935e-1, 2.3841857910156200307e-8)},
+ {FN (arccot), ARG(-2.0e+00,1.19209289550781250e-07), RES(-4.6364760900080497935e-1, -2.3841857910156200307e-8)},
+ {FN (arccot), ARG(-2.0e+00,-1.19209289550781250e-07), RES(-4.6364760900080497935e-1, 2.3841857910156200307e-8)},
+ {FN (arccot), ARG(2.0e+00,5.0e-01), RES(4.4423988596007427049e-1, -9.6415620202996167238e-2)},
+ {FN (arccot), ARG(2.0e+00,-5.0e-01), RES(4.4423988596007427049e-1, 9.6415620202996167238e-2)},
+ {FN (arccot), ARG(-2.0e+00,5.0e-01), RES(-4.4423988596007427049e-1, -9.6415620202996167238e-2)},
+ {FN (arccot), ARG(-2.0e+00,-5.0e-01), RES(-4.4423988596007427049e-1, 9.6415620202996167238e-2)},
+ {FN (arccot), ARG(2.0e+00,1.0e+00), RES(3.9269908169872415481e-1, -1.7328679513998632735e-1)},
+ {FN (arccot), ARG(2.0e+00,-1.0e+00), RES(3.9269908169872415481e-1, 1.7328679513998632735e-1)},
+ {FN (arccot), ARG(-2.0e+00,1.0e+00), RES(-3.9269908169872415481e-1, -1.7328679513998632735e-1)},
+ {FN (arccot), ARG(-2.0e+00,-1.0e+00), RES(-3.9269908169872415481e-1, 1.7328679513998632735e-1)},
+ {FN (arccot), ARG(2.0e+00,2.0e+00), RES(2.5957305712326147589e-1, -2.3887786125685909036e-1)},
+ {FN (arccot), ARG(2.0e+00,-2.0e+00), RES(2.5957305712326147589e-1, 2.3887786125685909036e-1)},
+ {FN (arccot), ARG(-2.0e+00,2.0e+00), RES(-2.5957305712326147589e-1, -2.3887786125685909036e-1)},
+ {FN (arccot), ARG(-2.0e+00,-2.0e+00), RES(-2.5957305712326147589e-1, 2.3887786125685909036e-1)},
+ {FN (arccot), ARG(2.0e+00,8.3886080e+06), RES(2.8421709430402795744e-14, -1.1920928955077503843e-7)},
+ {FN (arccot), ARG(2.0e+00,-8.3886080e+06), RES(2.8421709430402795744e-14, 1.1920928955077503843e-7)},
+ {FN (arccot), ARG(-2.0e+00,8.3886080e+06), RES(-2.8421709430402795744e-14, -1.1920928955077503843e-7)},
+ {FN (arccot), ARG(-2.0e+00,-8.3886080e+06), RES(-2.8421709430402795744e-14, 1.1920928955077503843e-7)},
+ {FN (arccot), ARG(8.3886080e+06,0.0e+00), RES(1.1920928955078068531e-7, 0.0)},
+ {FN (arccot), ARG(-8.3886080e+06,0.0e+00), RES(-1.1920928955078068531e-7, 0.0)},
+ {FN (arccot), ARG(8.3886080e+06,1.19209289550781250e-07), RES(1.1920928955078068531e-7, -1.6940658945085766040e-21)},
+ {FN (arccot), ARG(8.3886080e+06,-1.19209289550781250e-07), RES(1.1920928955078068531e-7, 1.6940658945085766040e-21)},
+ {FN (arccot), ARG(-8.3886080e+06,1.19209289550781250e-07), RES(-1.1920928955078068531e-7, -1.6940658945085766040e-21)},
+ {FN (arccot), ARG(-8.3886080e+06,-1.19209289550781250e-07), RES(-1.1920928955078068531e-7, 1.6940658945085766040e-21)},
+ {FN (arccot), ARG(8.3886080e+06,5.0e-01), RES(1.1920928955078026179e-7, -7.1054273576008756410e-15)},
+ {FN (arccot), ARG(8.3886080e+06,-5.0e-01), RES(1.1920928955078026179e-7, 7.1054273576008756410e-15)},
+ {FN (arccot), ARG(-8.3886080e+06,5.0e-01), RES(-1.1920928955078026179e-7, -7.1054273576008756410e-15)},
+ {FN (arccot), ARG(-8.3886080e+06,-5.0e-01), RES(-1.1920928955078026179e-7, 7.1054273576008756410e-15)},
+ {FN (arccot), ARG(8.3886080e+06,1.0e+00), RES(1.1920928955077899125e-7, -1.4210854715201599821e-14)},
+ {FN (arccot), ARG(8.3886080e+06,-1.0e+00), RES(1.1920928955077899125e-7, 1.4210854715201599821e-14)},
+ {FN (arccot), ARG(-8.3886080e+06,1.0e+00), RES(-1.1920928955077899125e-7, -1.4210854715201599821e-14)},
+ {FN (arccot), ARG(-8.3886080e+06,-1.0e+00), RES(-1.1920928955077899125e-7, 1.4210854715201599821e-14)},
+ {FN (arccot), ARG(8.3886080e+06,2.0e+00), RES(1.1920928955077390905e-7, -2.8421709430401987951e-14)},
+ {FN (arccot), ARG(8.3886080e+06,-2.0e+00), RES(1.1920928955077390905e-7, 2.8421709430401987951e-14)},
+ {FN (arccot), ARG(-8.3886080e+06,2.0e+00), RES(-1.1920928955077390905e-7, -2.8421709430401987951e-14)},
+ {FN (arccot), ARG(-8.3886080e+06,-2.0e+00), RES(-1.1920928955077390905e-7, 2.8421709430401987951e-14)},
+ {FN (arccot), ARG(8.3886080e+06,8.3886080e+06), RES(5.9604644775390766172e-8, -5.9604644775390483828e-8)},
+ {FN (arccot), ARG(8.3886080e+06,-8.3886080e+06), RES(5.9604644775390766172e-8, 5.9604644775390483828e-8)},
+ {FN (arccot), ARG(-8.3886080e+06,8.3886080e+06), RES(-5.9604644775390766172e-8, -5.9604644775390483828e-8)},
+ {FN (arccot), ARG(-8.3886080e+06,-8.3886080e+06), RES(-5.9604644775390766172e-8, 5.9604644775390483828e-8)},
+ {FN (csch), ARG(0.0e+00,-3.45266983001243932001e-04), RES(0, 2.8963094332845964291e3)},
+ {FN (csch), ARG(0.0e+00,3.45266983001243932001e-04), RES(0, -2.8963094332845964291e3)},
+ {FN (csch), ARG(0.0e+00,1.57045105981189525579e+00), RES(0, -1.0000000596046477360e0)},
+ {FN (csch), ARG(0.0e+00,-1.57045105981189525579e+00), RES(0, 1.0000000596046477360e0)},
+ {FN (csch), ARG(0.0e+00,1.57114159377789786021e+00), RES(0, -1.0000000596046477360e0)},
+ {FN (csch), ARG(0.0e+00,-1.57114159377789786021e+00), RES(0, 1.0000000596046477360e0)},
+ {FN (csch), ARG(0.0e+00,3.14124738660679181379e+00), RES(0, -2.8963094332830802676e3)},
+ {FN (csch), ARG(0.0e+00,-3.14124738660679181379e+00), RES(0, 2.8963094332830802676e3)},
+ {FN (csch), ARG(0.0e+00,3.14193792057279441821e+00), RES(0, 2.8963094332851348839e3)},
+ {FN (csch), ARG(0.0e+00,-3.14193792057279441821e+00), RES(0, -2.8963094332851348839e3)},
+ {FN (csch), ARG(0.0e+00,4.71204371340168837179e+00), RES(0, 1.0000000596046477361e0)},
+ {FN (csch), ARG(0.0e+00,-4.71204371340168837179e+00), RES(0, -1.0000000596046477361e0)},
+ {FN (csch), ARG(0.0e+00,4.71273424736769097620e+00), RES(0, 1.0000000596046477359e0)},
+ {FN (csch), ARG(0.0e+00,-4.71273424736769097620e+00), RES(0, -1.0000000596046477359e0)},
+ {FN (csch), ARG(0.0e+00,6.28284004019658492979e+00), RES(0, 2.8963094332820529594e3)},
+ {FN (csch), ARG(0.0e+00,-6.28284004019658492979e+00), RES(0, -2.8963094332820529594e3)},
+ {FN (csch), ARG(0.0e+00,6.28353057416258753420e+00), RES(0, -2.8963094332861621921e3)},
+ {FN (csch), ARG(0.0e+00,-6.28353057416258753420e+00), RES(0, 2.8963094332861621921e3)},
+ {FN (csch), ARG(0.0e+00,9.42443269378637893396e+00), RES(0, -2.8963094332884762317e3)},
+ {FN (csch), ARG(0.0e+00,-9.42443269378637893396e+00), RES(0, 2.8963094332884762317e3)},
+ {FN (csch), ARG(0.0e+00,9.42512322775237976202e+00), RES(0, 2.8963094332946400807e3)},
+ {FN (csch), ARG(0.0e+00,-9.42512322775237976202e+00), RES(0, -2.8963094332946400807e3)},
+ {FN (csch), ARG(1.19209289550781250e-07,-3.45266983001243932001e-04), RES(9.9999986092250876926e-1, 2.8963090880176545869e3)},
+ {FN (csch), ARG(1.19209289550781250e-07,3.45266983001243932001e-04), RES(9.9999986092250876926e-1, -2.8963090880176545869e3)},
+ {FN (csch), ARG(-1.19209289550781250e-07,-3.45266983001243932001e-04), RES(-9.9999986092250876926e-1, 2.8963090880176545869e3)},
+ {FN (csch), ARG(-1.19209289550781250e-07,3.45266983001243932001e-04), RES(-9.9999986092250876926e-1, -2.8963090880176545869e3)},
+ {FN (csch), ARG(1.19209289550781250e-07,1.57045105981189525579e+00), RES(4.1159035837716456618e-11, -1.0000000596046406306e0)},
+ {FN (csch), ARG(1.19209289550781250e-07,-1.57045105981189525579e+00), RES(4.1159035837716456618e-11, 1.0000000596046406306e0)},
+ {FN (csch), ARG(-1.19209289550781250e-07,1.57045105981189525579e+00), RES(-4.1159035837716456618e-11, -1.0000000596046406306e0)},
+ {FN (csch), ARG(-1.19209289550781250e-07,-1.57045105981189525579e+00), RES(-4.1159035837716456618e-11, 1.0000000596046406306e0)},
+ {FN (csch), ARG(1.19209289550781250e-07,1.57114159377789786021e+00), RES(-4.1159035837701857686e-11, -1.0000000596046406306e0)},
+ {FN (csch), ARG(1.19209289550781250e-07,-1.57114159377789786021e+00), RES(-4.1159035837701857686e-11, 1.0000000596046406306e0)},
+ {FN (csch), ARG(-1.19209289550781250e-07,1.57114159377789786021e+00), RES(4.1159035837701857686e-11, -1.0000000596046406306e0)},
+ {FN (csch), ARG(-1.19209289550781250e-07,-1.57114159377789786021e+00), RES(4.1159035837701857686e-11, 1.0000000596046406306e0)},
+ {FN (csch), ARG(1.19209289550781250e-07,3.14124738660679181379e+00), RES(-9.9999986092146180843e-1, -2.8963090880161384259e3)},
+ {FN (csch), ARG(1.19209289550781250e-07,-3.14124738660679181379e+00), RES(-9.9999986092146180843e-1, 2.8963090880161384259e3)},
+ {FN (csch), ARG(-1.19209289550781250e-07,3.14124738660679181379e+00), RES(9.9999986092146180843e-1, -2.8963090880161384259e3)},
+ {FN (csch), ARG(-1.19209289550781250e-07,-3.14124738660679181379e+00), RES(9.9999986092146180843e-1, 2.8963090880161384259e3)},
+ {FN (csch), ARG(1.19209289550781250e-07,3.14193792057279441821e+00), RES(-9.9999986092288059049e-1, 2.8963090880181930415e3)},
+ {FN (csch), ARG(1.19209289550781250e-07,-3.14193792057279441821e+00), RES(-9.9999986092288059049e-1, -2.8963090880181930415e3)},
+ {FN (csch), ARG(-1.19209289550781250e-07,3.14193792057279441821e+00), RES(9.9999986092288059049e-1, 2.8963090880181930415e3)},
+ {FN (csch), ARG(-1.19209289550781250e-07,-3.14193792057279441821e+00), RES(9.9999986092288059049e-1, -2.8963090880181930415e3)},
+ {FN (csch), ARG(1.19209289550781250e-07,4.71204371340168837179e+00), RES(-4.1159035837731055550e-11, 1.0000000596046406306e0)},
+ {FN (csch), ARG(1.19209289550781250e-07,-4.71204371340168837179e+00), RES(-4.1159035837731055550e-11, -1.0000000596046406306e0)},
+ {FN (csch), ARG(-1.19209289550781250e-07,4.71204371340168837179e+00), RES(4.1159035837731055550e-11, 1.0000000596046406306e0)},
+ {FN (csch), ARG(-1.19209289550781250e-07,-4.71204371340168837179e+00), RES(4.1159035837731055550e-11, -1.0000000596046406306e0)},
+ {FN (csch), ARG(1.19209289550781250e-07,4.71273424736769097620e+00), RES(4.1159035837687258754e-11, 1.0000000596046406305e0)},
+ {FN (csch), ARG(1.19209289550781250e-07,-4.71273424736769097620e+00), RES(4.1159035837687258754e-11, -1.0000000596046406305e0)},
+ {FN (csch), ARG(-1.19209289550781250e-07,4.71273424736769097620e+00), RES(-4.1159035837687258754e-11, 1.0000000596046406305e0)},
+ {FN (csch), ARG(-1.19209289550781250e-07,-4.71273424736769097620e+00), RES(-4.1159035837687258754e-11, -1.0000000596046406305e0)},
+ {FN (csch), ARG(1.19209289550781250e-07,6.28284004019658492979e+00), RES(9.9999986092075241740e-1, 2.8963090880151111181e3)},
+ {FN (csch), ARG(1.19209289550781250e-07,-6.28284004019658492979e+00), RES(9.9999986092075241740e-1, -2.8963090880151111181e3)},
+ {FN (csch), ARG(-1.19209289550781250e-07,6.28284004019658492979e+00), RES(-9.9999986092075241740e-1, 2.8963090880151111181e3)},
+ {FN (csch), ARG(-1.19209289550781250e-07,-6.28284004019658492979e+00), RES(-9.9999986092075241740e-1, -2.8963090880151111181e3)},
+ {FN (csch), ARG(1.19209289550781250e-07,6.28353057416258753420e+00), RES(9.9999986092358998153e-1, -2.8963090880192203493e3)},
+ {FN (csch), ARG(1.19209289550781250e-07,-6.28353057416258753420e+00), RES(9.9999986092358998153e-1, 2.8963090880192203493e3)},
+ {FN (csch), ARG(-1.19209289550781250e-07,6.28353057416258753420e+00), RES(-9.9999986092358998153e-1, -2.8963090880192203493e3)},
+ {FN (csch), ARG(-1.19209289550781250e-07,-6.28353057416258753420e+00), RES(-9.9999986092358998153e-1, 2.8963090880192203493e3)},
+ {FN (csch), ARG(1.19209289550781250e-07,9.42443269378637893396e+00), RES(-9.9999986092518790411e-1, -2.8963090880215343881e3)},
+ {FN (csch), ARG(1.19209289550781250e-07,-9.42443269378637893396e+00), RES(-9.9999986092518790411e-1, 2.8963090880215343881e3)},
+ {FN (csch), ARG(-1.19209289550781250e-07,9.42443269378637893396e+00), RES(9.9999986092518790411e-1, -2.8963090880215343881e3)},
+ {FN (csch), ARG(-1.19209289550781250e-07,-9.42443269378637893396e+00), RES(9.9999986092518790411e-1, 2.8963090880215343881e3)},
+ {FN (csch), ARG(1.19209289550781250e-07,9.42512322775237976202e+00), RES(-9.9999986092944425030e-1, 2.8963090880276982349e3)},
+ {FN (csch), ARG(1.19209289550781250e-07,-9.42512322775237976202e+00), RES(-9.9999986092944425030e-1, -2.8963090880276982349e3)},
+ {FN (csch), ARG(-1.19209289550781250e-07,9.42512322775237976202e+00), RES(9.9999986092944425030e-1, 2.8963090880276982349e3)},
+ {FN (csch), ARG(-1.19209289550781250e-07,-9.42512322775237976202e+00), RES(9.9999986092944425030e-1, -2.8963090880276982349e3)},
+ {FN (csch), ARG(5.0e-01,-3.45266983001243932001e-04), RES(1.9190337944739187237e0, 1.4337901642789801243e-3)},
+ {FN (csch), ARG(5.0e-01,3.45266983001243932001e-04), RES(1.9190337944739187237e0, -1.4337901642789801243e-3)},
+ {FN (csch), ARG(-5.0e-01,-3.45266983001243932001e-04), RES(-1.9190337944739187237e0, 1.4337901642789801243e-3)},
+ {FN (csch), ARG(-5.0e-01,3.45266983001243932001e-04), RES(-1.9190337944739187237e0, -1.4337901642789801243e-3)},
+ {FN (csch), ARG(5.0e-01,1.57045105981189525579e+00), RES(1.4149533035943115868e-4, -8.8681891425248302487e-1)},
+ {FN (csch), ARG(5.0e-01,-1.57045105981189525579e+00), RES(1.4149533035943115868e-4, 8.8681891425248302487e-1)},
+ {FN (csch), ARG(-5.0e-01,1.57045105981189525579e+00), RES(-1.4149533035943115868e-4, -8.8681891425248302487e-1)},
+ {FN (csch), ARG(-5.0e-01,-1.57045105981189525579e+00), RES(-1.4149533035943115868e-4, 8.8681891425248302487e-1)},
+ {FN (csch), ARG(5.0e-01,1.57114159377789786021e+00), RES(-1.4149533035938097090e-4, -8.8681891425248302485e-1)},
+ {FN (csch), ARG(5.0e-01,-1.57114159377789786021e+00), RES(-1.4149533035938097090e-4, 8.8681891425248302485e-1)},
+ {FN (csch), ARG(-5.0e-01,1.57114159377789786021e+00), RES(1.4149533035938097090e-4, -8.8681891425248302485e-1)},
+ {FN (csch), ARG(-5.0e-01,-1.57114159377789786021e+00), RES(1.4149533035938097090e-4, 8.8681891425248302485e-1)},
+ {FN (csch), ARG(5.0e-01,3.14124738660679181379e+00), RES(-1.9190337944739187227e0, -1.4337901642797306848e-3)},
+ {FN (csch), ARG(5.0e-01,-3.14124738660679181379e+00), RES(-1.9190337944739187227e0, 1.4337901642797306848e-3)},
+ {FN (csch), ARG(-5.0e-01,3.14124738660679181379e+00), RES(1.9190337944739187227e0, -1.4337901642797306848e-3)},
+ {FN (csch), ARG(-5.0e-01,-3.14124738660679181379e+00), RES(1.9190337944739187227e0, 1.4337901642797306848e-3)},
+ {FN (csch), ARG(5.0e-01,3.14193792057279441821e+00), RES(-1.9190337944739187241e0, 1.4337901642787135676e-3)},
+ {FN (csch), ARG(5.0e-01,-3.14193792057279441821e+00), RES(-1.9190337944739187241e0, -1.4337901642787135676e-3)},
+ {FN (csch), ARG(-5.0e-01,3.14193792057279441821e+00), RES(1.9190337944739187241e0, 1.4337901642787135676e-3)},
+ {FN (csch), ARG(-5.0e-01,-3.14193792057279441821e+00), RES(1.9190337944739187241e0, -1.4337901642787135676e-3)},
+ {FN (csch), ARG(5.0e-01,4.71204371340168837179e+00), RES(-1.4149533035948134646e-4, 8.8681891425248302489e-1)},
+ {FN (csch), ARG(5.0e-01,-4.71204371340168837179e+00), RES(-1.4149533035948134646e-4, -8.8681891425248302489e-1)},
+ {FN (csch), ARG(-5.0e-01,4.71204371340168837179e+00), RES(1.4149533035948134646e-4, 8.8681891425248302489e-1)},
+ {FN (csch), ARG(-5.0e-01,-4.71204371340168837179e+00), RES(1.4149533035948134646e-4, -8.8681891425248302489e-1)},
+ {FN (csch), ARG(5.0e-01,4.71273424736769097620e+00), RES(1.4149533035933078312e-4, 8.8681891425248302483e-1)},
+ {FN (csch), ARG(5.0e-01,-4.71273424736769097620e+00), RES(1.4149533035933078312e-4, -8.8681891425248302483e-1)},
+ {FN (csch), ARG(-5.0e-01,4.71273424736769097620e+00), RES(-1.4149533035933078312e-4, 8.8681891425248302483e-1)},
+ {FN (csch), ARG(-5.0e-01,-4.71273424736769097620e+00), RES(-1.4149533035933078312e-4, -8.8681891425248302483e-1)},
+ {FN (csch), ARG(5.0e-01,6.28284004019658492979e+00), RES(1.9190337944739187220e0, 1.4337901642802392434e-3)},
+ {FN (csch), ARG(5.0e-01,-6.28284004019658492979e+00), RES(1.9190337944739187220e0, -1.4337901642802392434e-3)},
+ {FN (csch), ARG(-5.0e-01,6.28284004019658492979e+00), RES(-1.9190337944739187220e0, 1.4337901642802392434e-3)},
+ {FN (csch), ARG(-5.0e-01,-6.28284004019658492979e+00), RES(-1.9190337944739187220e0, -1.4337901642802392434e-3)},
+ {FN (csch), ARG(5.0e-01,6.28353057416258753420e+00), RES(1.9190337944739187248e0, -1.4337901642782050091e-3)},
+ {FN (csch), ARG(5.0e-01,-6.28353057416258753420e+00), RES(1.9190337944739187248e0, 1.4337901642782050091e-3)},
+ {FN (csch), ARG(-5.0e-01,6.28353057416258753420e+00), RES(-1.9190337944739187248e0, -1.4337901642782050091e-3)},
+ {FN (csch), ARG(-5.0e-01,-6.28353057416258753420e+00), RES(-1.9190337944739187248e0, 1.4337901642782050091e-3)},
+ {FN (csch), ARG(5.0e-01,9.42443269378637893396e+00), RES(-1.9190337944739187263e0, -1.4337901642770594670e-3)},
+ {FN (csch), ARG(5.0e-01,-9.42443269378637893396e+00), RES(-1.9190337944739187263e0, 1.4337901642770594670e-3)},
+ {FN (csch), ARG(-5.0e-01,9.42443269378637893396e+00), RES(1.9190337944739187263e0, -1.4337901642770594670e-3)},
+ {FN (csch), ARG(-5.0e-01,-9.42443269378637893396e+00), RES(1.9190337944739187263e0, 1.4337901642770594670e-3)},
+ {FN (csch), ARG(5.0e-01,9.42512322775237976202e+00), RES(-1.9190337944739187304e0, 1.4337901642740081154e-3)},
+ {FN (csch), ARG(5.0e-01,-9.42512322775237976202e+00), RES(-1.9190337944739187304e0, -1.4337901642740081154e-3)},
+ {FN (csch), ARG(-5.0e-01,9.42512322775237976202e+00), RES(1.9190337944739187304e0, 1.4337901642740081154e-3)},
+ {FN (csch), ARG(-5.0e-01,-9.42512322775237976202e+00), RES(1.9190337944739187304e0, -1.4337901642740081154e-3)},
+ {FN (csch), ARG(1.0e+00,-3.45266983001243932001e-04), RES(8.5091800407377002734e-1, 3.8576176225198860914e-4)},
+ {FN (csch), ARG(1.0e+00,3.45266983001243932001e-04), RES(8.5091800407377002734e-1, -3.8576176225198860914e-4)},
+ {FN (csch), ARG(-1.0e+00,-3.45266983001243932001e-04), RES(-8.5091800407377002734e-1, 3.8576176225198860914e-4)},
+ {FN (csch), ARG(-1.0e+00,3.45266983001243932001e-04), RES(-8.5091800407377002734e-1, -3.8576176225198860914e-4)},
+ {FN (csch), ARG(1.0e+00,1.57045105981189525579e+00), RES(1.7040802567657401279e-4, -6.4805426748157480499e-1)},
+ {FN (csch), ARG(1.0e+00,-1.57045105981189525579e+00), RES(1.7040802567657401279e-4, 6.4805426748157480499e-1)},
+ {FN (csch), ARG(-1.0e+00,1.57045105981189525579e+00), RES(-1.7040802567657401279e-4, -6.4805426748157480499e-1)},
+ {FN (csch), ARG(-1.0e+00,-1.57045105981189525579e+00), RES(-1.7040802567657401279e-4, 6.4805426748157480499e-1)},
+ {FN (csch), ARG(1.0e+00,1.57114159377789786021e+00), RES(-1.7040802567651356981e-4, -6.4805426748157480499e-1)},
+ {FN (csch), ARG(1.0e+00,-1.57114159377789786021e+00), RES(-1.7040802567651356981e-4, 6.4805426748157480499e-1)},
+ {FN (csch), ARG(-1.0e+00,1.57114159377789786021e+00), RES(1.7040802567651356981e-4, -6.4805426748157480499e-1)},
+ {FN (csch), ARG(-1.0e+00,-1.57114159377789786021e+00), RES(1.7040802567651356981e-4, 6.4805426748157480499e-1)},
+ {FN (csch), ARG(1.0e+00,3.14124738660679181379e+00), RES(-8.5091800407377002721e-1, -3.8576176225219054787e-4)},
+ {FN (csch), ARG(1.0e+00,-3.14124738660679181379e+00), RES(-8.5091800407377002721e-1, 3.8576176225219054787e-4)},
+ {FN (csch), ARG(-1.0e+00,3.14124738660679181379e+00), RES(8.5091800407377002721e-1, -3.8576176225219054787e-4)},
+ {FN (csch), ARG(-1.0e+00,-3.14124738660679181379e+00), RES(8.5091800407377002721e-1, 3.8576176225219054787e-4)},
+ {FN (csch), ARG(1.0e+00,3.14193792057279441821e+00), RES(-8.5091800407377002738e-1, 3.8576176225191689193e-4)},
+ {FN (csch), ARG(1.0e+00,-3.14193792057279441821e+00), RES(-8.5091800407377002738e-1, -3.8576176225191689193e-4)},
+ {FN (csch), ARG(-1.0e+00,3.14193792057279441821e+00), RES(8.5091800407377002738e-1, 3.8576176225191689193e-4)},
+ {FN (csch), ARG(-1.0e+00,-3.14193792057279441821e+00), RES(8.5091800407377002738e-1, -3.8576176225191689193e-4)},
+ {FN (csch), ARG(1.0e+00,4.71204371340168837179e+00), RES(-1.7040802567663445577e-4, 6.4805426748157480498e-1)},
+ {FN (csch), ARG(1.0e+00,-4.71204371340168837179e+00), RES(-1.7040802567663445577e-4, -6.4805426748157480498e-1)},
+ {FN (csch), ARG(-1.0e+00,4.71204371340168837179e+00), RES(1.7040802567663445577e-4, 6.4805426748157480498e-1)},
+ {FN (csch), ARG(-1.0e+00,-4.71204371340168837179e+00), RES(1.7040802567663445577e-4, -6.4805426748157480498e-1)},
+ {FN (csch), ARG(1.0e+00,4.71273424736769097620e+00), RES(1.7040802567645312683e-4, 6.480542674815748050e-1)},
+ {FN (csch), ARG(1.0e+00,-4.71273424736769097620e+00), RES(1.7040802567645312683e-4, -6.480542674815748050e-1)},
+ {FN (csch), ARG(-1.0e+00,4.71273424736769097620e+00), RES(-1.7040802567645312683e-4, 6.480542674815748050e-1)},
+ {FN (csch), ARG(-1.0e+00,-4.71273424736769097620e+00), RES(-1.7040802567645312683e-4, -6.480542674815748050e-1)},
+ {FN (csch), ARG(1.0e+00,6.28284004019658492979e+00), RES(8.5091800407377002712e-1, 3.8576176225232737584e-4)},
+ {FN (csch), ARG(1.0e+00,-6.28284004019658492979e+00), RES(8.5091800407377002712e-1, -3.8576176225232737584e-4)},
+ {FN (csch), ARG(-1.0e+00,6.28284004019658492979e+00), RES(-8.5091800407377002712e-1, 3.8576176225232737584e-4)},
+ {FN (csch), ARG(-1.0e+00,-6.28284004019658492979e+00), RES(-8.5091800407377002712e-1, -3.8576176225232737584e-4)},
+ {FN (csch), ARG(1.0e+00,6.28353057416258753420e+00), RES(8.5091800407377002747e-1, -3.8576176225178006396e-4)},
+ {FN (csch), ARG(1.0e+00,-6.28353057416258753420e+00), RES(8.5091800407377002747e-1, 3.8576176225178006396e-4)},
+ {FN (csch), ARG(-1.0e+00,6.28353057416258753420e+00), RES(-8.5091800407377002747e-1, -3.8576176225178006396e-4)},
+ {FN (csch), ARG(-1.0e+00,-6.28353057416258753420e+00), RES(-8.5091800407377002747e-1, 3.8576176225178006396e-4)},
+ {FN (csch), ARG(1.0e+00,9.42443269378637893396e+00), RES(-8.5091800407377002767e-1, -3.8576176225147185523e-4)},
+ {FN (csch), ARG(1.0e+00,-9.42443269378637893396e+00), RES(-8.5091800407377002767e-1, 3.8576176225147185523e-4)},
+ {FN (csch), ARG(-1.0e+00,9.42443269378637893396e+00), RES(8.5091800407377002767e-1, -3.8576176225147185523e-4)},
+ {FN (csch), ARG(-1.0e+00,-9.42443269378637893396e+00), RES(8.5091800407377002767e-1, 3.8576176225147185523e-4)},
+ {FN (csch), ARG(1.0e+00,9.42512322775237976202e+00), RES(-8.5091800407377002820e-1, 3.8576176225065088741e-4)},
+ {FN (csch), ARG(1.0e+00,-9.42512322775237976202e+00), RES(-8.5091800407377002820e-1, -3.8576176225065088741e-4)},
+ {FN (csch), ARG(-1.0e+00,9.42512322775237976202e+00), RES(8.5091800407377002820e-1, 3.8576176225065088741e-4)},
+ {FN (csch), ARG(-1.0e+00,-9.42512322775237976202e+00), RES(8.5091800407377002820e-1, -3.8576176225065088741e-4)},
+ {FN (csch), ARG(2.0e+00,-3.45266983001243932001e-04), RES(2.7572054583883740768e-1, 9.8749461907035665386e-5)},
+ {FN (csch), ARG(2.0e+00,3.45266983001243932001e-04), RES(2.7572054583883740768e-1, -9.8749461907035665386e-5)},
+ {FN (csch), ARG(-2.0e+00,-3.45266983001243932001e-04), RES(-2.7572054583883740768e-1, 9.8749461907035665386e-5)},
+ {FN (csch), ARG(-2.0e+00,3.45266983001243932001e-04), RES(-2.7572054583883740768e-1, -9.8749461907035665386e-5)},
+ {FN (csch), ARG(2.0e+00,1.57045105981189525579e+00), RES(8.8471445300404633228e-5, -2.6580221522968095406e-1)},
+ {FN (csch), ARG(2.0e+00,-1.57045105981189525579e+00), RES(8.8471445300404633228e-5, 2.6580221522968095406e-1)},
+ {FN (csch), ARG(-2.0e+00,1.57045105981189525579e+00), RES(-8.8471445300404633228e-5, -2.6580221522968095406e-1)},
+ {FN (csch), ARG(-2.0e+00,-1.57045105981189525579e+00), RES(-8.8471445300404633228e-5, 2.6580221522968095406e-1)},
+ {FN (csch), ARG(2.0e+00,1.57114159377789786021e+00), RES(-8.8471445300373252796e-5, -2.6580221522968095407e-1)},
+ {FN (csch), ARG(2.0e+00,-1.57114159377789786021e+00), RES(-8.8471445300373252796e-5, 2.6580221522968095407e-1)},
+ {FN (csch), ARG(-2.0e+00,1.57114159377789786021e+00), RES(8.8471445300373252796e-5, -2.6580221522968095407e-1)},
+ {FN (csch), ARG(-2.0e+00,-1.57114159377789786021e+00), RES(8.8471445300373252796e-5, 2.6580221522968095407e-1)},
+ {FN (csch), ARG(2.0e+00,3.14124738660679181379e+00), RES(-2.7572054583883740766e-1, -9.8749461907087358805e-5)},
+ {FN (csch), ARG(2.0e+00,-3.14124738660679181379e+00), RES(-2.7572054583883740766e-1, 9.8749461907087358805e-5)},
+ {FN (csch), ARG(-2.0e+00,3.14124738660679181379e+00), RES(2.7572054583883740766e-1, -9.8749461907087358805e-5)},
+ {FN (csch), ARG(-2.0e+00,-3.14124738660679181379e+00), RES(2.7572054583883740766e-1, 9.8749461907087358805e-5)},
+ {FN (csch), ARG(2.0e+00,3.14193792057279441821e+00), RES(-2.7572054583883740769e-1, 9.8749461907017306810e-5)},
+ {FN (csch), ARG(2.0e+00,-3.14193792057279441821e+00), RES(-2.7572054583883740769e-1, -9.8749461907017306810e-5)},
+ {FN (csch), ARG(-2.0e+00,3.14193792057279441821e+00), RES(2.7572054583883740769e-1, 9.8749461907017306810e-5)},
+ {FN (csch), ARG(-2.0e+00,-3.14193792057279441821e+00), RES(2.7572054583883740769e-1, -9.8749461907017306810e-5)},
+ {FN (csch), ARG(2.0e+00,4.71204371340168837179e+00), RES(-8.8471445300436013659e-5, 2.6580221522968095405e-1)},
+ {FN (csch), ARG(2.0e+00,-4.71204371340168837179e+00), RES(-8.8471445300436013659e-5, -2.6580221522968095405e-1)},
+ {FN (csch), ARG(-2.0e+00,4.71204371340168837179e+00), RES(8.8471445300436013659e-5, 2.6580221522968095405e-1)},
+ {FN (csch), ARG(-2.0e+00,-4.71204371340168837179e+00), RES(8.8471445300436013659e-5, -2.6580221522968095405e-1)},
+ {FN (csch), ARG(2.0e+00,4.71273424736769097620e+00), RES(8.8471445300341872364e-5, 2.6580221522968095408e-1)},
+ {FN (csch), ARG(2.0e+00,-4.71273424736769097620e+00), RES(8.8471445300341872364e-5, -2.6580221522968095408e-1)},
+ {FN (csch), ARG(-2.0e+00,4.71273424736769097620e+00), RES(-8.8471445300341872364e-5, 2.6580221522968095408e-1)},
+ {FN (csch), ARG(-2.0e+00,-4.71273424736769097620e+00), RES(-8.8471445300341872364e-5, -2.6580221522968095408e-1)},
+ {FN (csch), ARG(2.0e+00,6.28284004019658492979e+00), RES(2.7572054583883740765e-1, 9.8749461907122384803e-5)},
+ {FN (csch), ARG(2.0e+00,-6.28284004019658492979e+00), RES(2.7572054583883740765e-1, -9.8749461907122384803e-5)},
+ {FN (csch), ARG(-2.0e+00,6.28284004019658492979e+00), RES(-2.7572054583883740765e-1, 9.8749461907122384803e-5)},
+ {FN (csch), ARG(-2.0e+00,-6.28284004019658492979e+00), RES(-2.7572054583883740765e-1, -9.8749461907122384803e-5)},
+ {FN (csch), ARG(2.0e+00,6.28353057416258753420e+00), RES(2.7572054583883740770e-1, -9.8749461906982280812e-5)},
+ {FN (csch), ARG(2.0e+00,-6.28353057416258753420e+00), RES(2.7572054583883740770e-1, 9.8749461906982280812e-5)},
+ {FN (csch), ARG(-2.0e+00,6.28353057416258753420e+00), RES(-2.7572054583883740770e-1, -9.8749461906982280812e-5)},
+ {FN (csch), ARG(-2.0e+00,-6.28353057416258753420e+00), RES(-2.7572054583883740770e-1, 9.8749461906982280812e-5)},
+ {FN (csch), ARG(2.0e+00,9.42443269378637893396e+00), RES(-2.7572054583883740773e-1, -9.874946190690338380e-5)},
+ {FN (csch), ARG(2.0e+00,-9.42443269378637893396e+00), RES(-2.7572054583883740773e-1, 9.874946190690338380e-5)},
+ {FN (csch), ARG(-2.0e+00,9.42443269378637893396e+00), RES(2.7572054583883740773e-1, -9.874946190690338380e-5)},
+ {FN (csch), ARG(-2.0e+00,-9.42443269378637893396e+00), RES(2.7572054583883740773e-1, 9.874946190690338380e-5)},
+ {FN (csch), ARG(2.0e+00,9.42512322775237976202e+00), RES(-2.7572054583883740781e-1, 9.8749461906693227814e-5)},
+ {FN (csch), ARG(2.0e+00,-9.42512322775237976202e+00), RES(-2.7572054583883740781e-1, -9.8749461906693227814e-5)},
+ {FN (csch), ARG(-2.0e+00,9.42512322775237976202e+00), RES(2.7572054583883740781e-1, 9.8749461906693227814e-5)},
+ {FN (csch), ARG(-2.0e+00,-9.42512322775237976202e+00), RES(2.7572054583883740781e-1, -9.8749461906693227814e-5)},
+ {FN (sech), ARG(0.0e+00,-3.45266983001243932001e-04), RES(1.0000000596046477360e0, 0.0)},
+ {FN (sech), ARG(0.0e+00,3.45266983001243932001e-04), RES(1.0000000596046477360e0, 0.0)},
+ {FN (sech), ARG(0.0e+00,1.57045105981189525579e+00), RES(2.8963094332835939217e3, 0.0)},
+ {FN (sech), ARG(0.0e+00,-1.57045105981189525579e+00), RES(2.8963094332835939217e3, 0.0)},
+ {FN (sech), ARG(0.0e+00,1.57114159377789786021e+00), RES(-2.8963094332846212298e3, 0.0)},
+ {FN (sech), ARG(0.0e+00,-1.57114159377789786021e+00), RES(-2.8963094332846212298e3, 0.0)},
+ {FN (sech), ARG(0.0e+00,3.14124738660679181379e+00), RES(-1.0000000596046477360e0, 0.0)},
+ {FN (sech), ARG(0.0e+00,-3.14124738660679181379e+00), RES(-1.0000000596046477360e0, 0.0)},
+ {FN (sech), ARG(0.0e+00,3.14193792057279441821e+00), RES(-1.0000000596046477360e0, 0.0)},
+ {FN (sech), ARG(0.0e+00,-3.14193792057279441821e+00), RES(-1.0000000596046477360e0, 0.0)},
+ {FN (sech), ARG(0.0e+00,4.71204371340168837179e+00), RES(-2.8963094332825666135e3, 0.0)},
+ {FN (sech), ARG(0.0e+00,-4.71204371340168837179e+00), RES(-2.8963094332825666135e3, 0.0)},
+ {FN (sech), ARG(0.0e+00,4.71273424736769097620e+00), RES(2.8963094332856485380e3, 0.0)},
+ {FN (sech), ARG(0.0e+00,-4.71273424736769097620e+00), RES(2.8963094332856485380e3, 0.0)},
+ {FN (sech), ARG(0.0e+00,6.28284004019658492979e+00), RES(1.0000000596046477361e0, 0.0)},
+ {FN (sech), ARG(0.0e+00,-6.28284004019658492979e+00), RES(1.0000000596046477361e0, 0.0)},
+ {FN (sech), ARG(0.0e+00,6.28353057416258753420e+00), RES(1.0000000596046477359e0, 0.0)},
+ {FN (sech), ARG(0.0e+00,-6.28353057416258753420e+00), RES(1.0000000596046477359e0, 0.0)},
+ {FN (sech), ARG(0.0e+00,9.42443269378637893396e+00), RES(-1.0000000596046477358e0, 0.0)},
+ {FN (sech), ARG(0.0e+00,-9.42443269378637893396e+00), RES(-1.0000000596046477358e0, 0.0)},
+ {FN (sech), ARG(0.0e+00,9.42512322775237976202e+00), RES(-1.0000000596046477356e0, 0.0)},
+ {FN (sech), ARG(0.0e+00,-9.42512322775237976202e+00), RES(-1.0000000596046477356e0, 0.0)},
+ {FN (sech), ARG(1.19209289550781250e-07,-3.45266983001243932001e-04), RES(1.0000000596046406306e0, 4.1159035837702210125e-11)},
+ {FN (sech), ARG(1.19209289550781250e-07,3.45266983001243932001e-04), RES(1.0000000596046406306e0, -4.1159035837702210125e-11)},
+ {FN (sech), ARG(-1.19209289550781250e-07,-3.45266983001243932001e-04), RES(1.0000000596046406306e0, -4.1159035837702210125e-11)},
+ {FN (sech), ARG(-1.19209289550781250e-07,3.45266983001243932001e-04), RES(1.0000000596046406306e0, 4.1159035837702210125e-11)},
+ {FN (sech), ARG(1.19209289550781250e-07,1.57045105981189525579e+00), RES(2.8963090880166520798e3, -9.9999986092181650394e-1)},
+ {FN (sech), ARG(1.19209289550781250e-07,-1.57045105981189525579e+00), RES(2.8963090880166520798e3, 9.9999986092181650394e-1)},
+ {FN (sech), ARG(-1.19209289550781250e-07,1.57045105981189525579e+00), RES(2.8963090880166520798e3, 9.9999986092181650394e-1)},
+ {FN (sech), ARG(-1.19209289550781250e-07,-1.57045105981189525579e+00), RES(2.8963090880166520798e3, -9.9999986092181650394e-1)},
+ {FN (sech), ARG(1.19209289550781250e-07,1.57114159377789786021e+00), RES(-2.8963090880176793876e3, -9.9999986092252589498e-1)},
+ {FN (sech), ARG(1.19209289550781250e-07,-1.57114159377789786021e+00), RES(-2.8963090880176793876e3, 9.9999986092252589498e-1)},
+ {FN (sech), ARG(-1.19209289550781250e-07,1.57114159377789786021e+00), RES(-2.8963090880176793876e3, 9.9999986092252589498e-1)},
+ {FN (sech), ARG(-1.19209289550781250e-07,-1.57114159377789786021e+00), RES(-2.8963090880176793876e3, -9.9999986092252589498e-1)},
+ {FN (sech), ARG(1.19209289550781250e-07,3.14124738660679181379e+00), RES(-1.0000000596046406306e0, -4.1159035837723756084e-11)},
+ {FN (sech), ARG(1.19209289550781250e-07,-3.14124738660679181379e+00), RES(-1.0000000596046406306e0, 4.1159035837723756084e-11)},
+ {FN (sech), ARG(-1.19209289550781250e-07,3.14124738660679181379e+00), RES(-1.0000000596046406306e0, 4.1159035837723756084e-11)},
+ {FN (sech), ARG(-1.19209289550781250e-07,-3.14124738660679181379e+00), RES(-1.0000000596046406306e0, -4.1159035837723756084e-11)},
+ {FN (sech), ARG(1.19209289550781250e-07,3.14193792057279441821e+00), RES(-1.0000000596046406305e0, 4.1159035837694558220e-11)},
+ {FN (sech), ARG(1.19209289550781250e-07,-3.14193792057279441821e+00), RES(-1.0000000596046406305e0, -4.1159035837694558220e-11)},
+ {FN (sech), ARG(-1.19209289550781250e-07,3.14193792057279441821e+00), RES(-1.0000000596046406305e0, -4.1159035837694558220e-11)},
+ {FN (sech), ARG(-1.19209289550781250e-07,-3.14193792057279441821e+00), RES(-1.0000000596046406305e0, 4.1159035837694558220e-11)},
+ {FN (sech), ARG(1.19209289550781250e-07,4.71204371340168837179e+00), RES(-2.8963090880156247720e3, 9.9999986092110711291e-1)},
+ {FN (sech), ARG(1.19209289550781250e-07,-4.71204371340168837179e+00), RES(-2.8963090880156247720e3, -9.9999986092110711291e-1)},
+ {FN (sech), ARG(-1.19209289550781250e-07,4.71204371340168837179e+00), RES(-2.8963090880156247720e3, -9.9999986092110711291e-1)},
+ {FN (sech), ARG(-1.19209289550781250e-07,-4.71204371340168837179e+00), RES(-2.8963090880156247720e3, 9.9999986092110711291e-1)},
+ {FN (sech), ARG(1.19209289550781250e-07,4.71273424736769097620e+00), RES(2.8963090880187066954e3, 9.9999986092323528601e-1)},
+ {FN (sech), ARG(1.19209289550781250e-07,-4.71273424736769097620e+00), RES(2.8963090880187066954e3, -9.9999986092323528601e-1)},
+ {FN (sech), ARG(-1.19209289550781250e-07,4.71273424736769097620e+00), RES(2.8963090880187066954e3, -9.9999986092323528601e-1)},
+ {FN (sech), ARG(-1.19209289550781250e-07,-4.71273424736769097620e+00), RES(2.8963090880187066954e3, 9.9999986092323528601e-1)},
+ {FN (sech), ARG(1.19209289550781250e-07,6.28284004019658492979e+00), RES(1.0000000596046406307e0, 4.1159035837738355016e-11)},
+ {FN (sech), ARG(1.19209289550781250e-07,-6.28284004019658492979e+00), RES(1.0000000596046406307e0, -4.1159035837738355016e-11)},
+ {FN (sech), ARG(-1.19209289550781250e-07,6.28284004019658492979e+00), RES(1.0000000596046406307e0, -4.1159035837738355016e-11)},
+ {FN (sech), ARG(-1.19209289550781250e-07,-6.28284004019658492979e+00), RES(1.0000000596046406307e0, 4.1159035837738355016e-11)},
+ {FN (sech), ARG(1.19209289550781250e-07,6.28353057416258753420e+00), RES(1.0000000596046406305e0, -4.1159035837679959288e-11)},
+ {FN (sech), ARG(1.19209289550781250e-07,-6.28353057416258753420e+00), RES(1.0000000596046406305e0, 4.1159035837679959288e-11)},
+ {FN (sech), ARG(-1.19209289550781250e-07,6.28353057416258753420e+00), RES(1.0000000596046406305e0, 4.1159035837679959288e-11)},
+ {FN (sech), ARG(-1.19209289550781250e-07,-6.28353057416258753420e+00), RES(1.0000000596046406305e0, -4.1159035837679959288e-11)},
+ {FN (sech), ARG(1.19209289550781250e-07,9.42443269378637893396e+00), RES(-1.0000000596046406304e0, -4.1159035837647074798e-11)},
+ {FN (sech), ARG(1.19209289550781250e-07,-9.42443269378637893396e+00), RES(-1.0000000596046406304e0, 4.1159035837647074798e-11)},
+ {FN (sech), ARG(-1.19209289550781250e-07,9.42443269378637893396e+00), RES(-1.0000000596046406304e0, 4.1159035837647074798e-11)},
+ {FN (sech), ARG(-1.19209289550781250e-07,-9.42443269378637893396e+00), RES(-1.0000000596046406304e0, -4.1159035837647074798e-11)},
+ {FN (sech), ARG(1.19209289550781250e-07,9.42512322775237976202e+00), RES(-1.0000000596046406301e0, 4.1159035837559481207e-11)},
+ {FN (sech), ARG(1.19209289550781250e-07,-9.42512322775237976202e+00), RES(-1.0000000596046406301e0, -4.1159035837559481207e-11)},
+ {FN (sech), ARG(-1.19209289550781250e-07,9.42512322775237976202e+00), RES(-1.0000000596046406301e0, -4.1159035837559481207e-11)},
+ {FN (sech), ARG(-1.19209289550781250e-07,-9.42512322775237976202e+00), RES(-1.0000000596046406301e0, 4.1159035837559481207e-11)},
+ {FN (sech), ARG(5.0e-01,-3.45266983001243932001e-04), RES(8.8681891425248302485e-1, 1.4149533035938218250e-4)},
+ {FN (sech), ARG(5.0e-01,3.45266983001243932001e-04), RES(8.8681891425248302485e-1, -1.4149533035938218250e-4)},
+ {FN (sech), ARG(-5.0e-01,-3.45266983001243932001e-04), RES(8.8681891425248302485e-1, -1.4149533035938218250e-4)},
+ {FN (sech), ARG(-5.0e-01,3.45266983001243932001e-04), RES(8.8681891425248302485e-1, 1.4149533035938218250e-4)},
+ {FN (sech), ARG(5.0e-01,1.57045105981189525579e+00), RES(1.4337901642794764055e-3, -1.9190337944739187231e0)},
+ {FN (sech), ARG(5.0e-01,-1.57045105981189525579e+00), RES(1.4337901642794764055e-3, 1.9190337944739187231e0)},
+ {FN (sech), ARG(-5.0e-01,1.57045105981189525579e+00), RES(1.4337901642794764055e-3, 1.9190337944739187231e0)},
+ {FN (sech), ARG(-5.0e-01,-1.57045105981189525579e+00), RES(1.4337901642794764055e-3, -1.9190337944739187231e0)},
+ {FN (sech), ARG(5.0e-01,1.57114159377789786021e+00), RES(-1.4337901642789678469e-3, -1.9190337944739187237e0)},
+ {FN (sech), ARG(5.0e-01,-1.57114159377789786021e+00), RES(-1.4337901642789678469e-3, 1.9190337944739187237e0)},
+ {FN (sech), ARG(-5.0e-01,1.57114159377789786021e+00), RES(-1.4337901642789678469e-3, 1.9190337944739187237e0)},
+ {FN (sech), ARG(-5.0e-01,-1.57114159377789786021e+00), RES(-1.4337901642789678469e-3, -1.9190337944739187237e0)},
+ {FN (sech), ARG(5.0e-01,3.14124738660679181379e+00), RES(-8.8681891425248302488e-1, -1.4149533035945625257e-4)},
+ {FN (sech), ARG(5.0e-01,-3.14124738660679181379e+00), RES(-8.8681891425248302488e-1, 1.4149533035945625257e-4)},
+ {FN (sech), ARG(-5.0e-01,3.14124738660679181379e+00), RES(-8.8681891425248302488e-1, 1.4149533035945625257e-4)},
+ {FN (sech), ARG(-5.0e-01,-3.14124738660679181379e+00), RES(-8.8681891425248302488e-1, -1.4149533035945625257e-4)},
+ {FN (sech), ARG(5.0e-01,3.14193792057279441821e+00), RES(-8.8681891425248302484e-1, 1.4149533035935587701e-4)},
+ {FN (sech), ARG(5.0e-01,-3.14193792057279441821e+00), RES(-8.8681891425248302484e-1, -1.4149533035935587701e-4)},
+ {FN (sech), ARG(-5.0e-01,3.14193792057279441821e+00), RES(-8.8681891425248302484e-1, -1.4149533035935587701e-4)},
+ {FN (sech), ARG(-5.0e-01,-3.14193792057279441821e+00), RES(-8.8681891425248302484e-1, 1.4149533035935587701e-4)},
+ {FN (sech), ARG(5.0e-01,4.71204371340168837179e+00), RES(-1.4337901642799849641e-3, 1.9190337944739187224e0)},
+ {FN (sech), ARG(5.0e-01,-4.71204371340168837179e+00), RES(-1.4337901642799849641e-3, -1.9190337944739187224e0)},
+ {FN (sech), ARG(-5.0e-01,4.71204371340168837179e+00), RES(-1.4337901642799849641e-3, -1.9190337944739187224e0)},
+ {FN (sech), ARG(-5.0e-01,-4.71204371340168837179e+00), RES(-1.4337901642799849641e-3, 1.9190337944739187224e0)},
+ {FN (sech), ARG(5.0e-01,4.71273424736769097620e+00), RES(1.4337901642784592884e-3, 1.9190337944739187244e0)},
+ {FN (sech), ARG(5.0e-01,-4.71273424736769097620e+00), RES(1.4337901642784592884e-3, -1.9190337944739187244e0)},
+ {FN (sech), ARG(-5.0e-01,4.71273424736769097620e+00), RES(1.4337901642784592884e-3, -1.9190337944739187244e0)},
+ {FN (sech), ARG(-5.0e-01,-4.71273424736769097620e+00), RES(1.4337901642784592884e-3, 1.9190337944739187244e0)},
+ {FN (sech), ARG(5.0e-01,6.28284004019658492979e+00), RES(8.8681891425248302490e-1, 1.4149533035950644034e-4)},
+ {FN (sech), ARG(5.0e-01,-6.28284004019658492979e+00), RES(8.8681891425248302490e-1, -1.4149533035950644034e-4)},
+ {FN (sech), ARG(-5.0e-01,6.28284004019658492979e+00), RES(8.8681891425248302490e-1, -1.4149533035950644034e-4)},
+ {FN (sech), ARG(-5.0e-01,-6.28284004019658492979e+00), RES(8.8681891425248302490e-1, 1.4149533035950644034e-4)},
+ {FN (sech), ARG(5.0e-01,6.28353057416258753420e+00), RES(8.8681891425248302482e-1, -1.4149533035930568923e-4)},
+ {FN (sech), ARG(5.0e-01,-6.28353057416258753420e+00), RES(8.8681891425248302482e-1, 1.4149533035930568923e-4)},
+ {FN (sech), ARG(-5.0e-01,6.28353057416258753420e+00), RES(8.8681891425248302482e-1, 1.4149533035930568923e-4)},
+ {FN (sech), ARG(-5.0e-01,-6.28353057416258753420e+00), RES(8.8681891425248302482e-1, -1.4149533035930568923e-4)},
+ {FN (sech), ARG(5.0e-01,9.42443269378637893396e+00), RES(-8.8681891425248302477e-1, -1.4149533035919263990e-4)},
+ {FN (sech), ARG(5.0e-01,-9.42443269378637893396e+00), RES(-8.8681891425248302477e-1, 1.4149533035919263990e-4)},
+ {FN (sech), ARG(-5.0e-01,9.42443269378637893396e+00), RES(-8.8681891425248302477e-1, 1.4149533035919263990e-4)},
+ {FN (sech), ARG(-5.0e-01,-9.42443269378637893396e+00), RES(-8.8681891425248302477e-1, -1.4149533035919263990e-4)},
+ {FN (sech), ARG(5.0e-01,9.42512322775237976202e+00), RES(-8.8681891425248302464e-1, 1.4149533035889151322e-4)},
+ {FN (sech), ARG(5.0e-01,-9.42512322775237976202e+00), RES(-8.8681891425248302464e-1, -1.4149533035889151322e-4)},
+ {FN (sech), ARG(-5.0e-01,9.42512322775237976202e+00), RES(-8.8681891425248302464e-1, -1.4149533035889151322e-4)},
+ {FN (sech), ARG(-5.0e-01,-9.42512322775237976202e+00), RES(-8.8681891425248302464e-1, 1.4149533035889151322e-4)},
+ {FN (sech), ARG(1.0e+00,-3.45266983001243932001e-04), RES(6.4805426748157480499e-1, 1.7040802567651502899e-4)},
+ {FN (sech), ARG(1.0e+00,3.45266983001243932001e-04), RES(6.4805426748157480499e-1, -1.7040802567651502899e-4)},
+ {FN (sech), ARG(-1.0e+00,-3.45266983001243932001e-04), RES(6.4805426748157480499e-1, -1.7040802567651502899e-4)},
+ {FN (sech), ARG(-1.0e+00,3.45266983001243932001e-04), RES(6.4805426748157480499e-1, 1.7040802567651502899e-4)},
+ {FN (sech), ARG(1.0e+00,1.57045105981189525579e+00), RES(3.8576176225212213388e-4, -8.5091800407377002725e-1)},
+ {FN (sech), ARG(1.0e+00,-1.57045105981189525579e+00), RES(3.8576176225212213388e-4, 8.5091800407377002725e-1)},
+ {FN (sech), ARG(-1.0e+00,1.57045105981189525579e+00), RES(3.8576176225212213388e-4, 8.5091800407377002725e-1)},
+ {FN (sech), ARG(-1.0e+00,-1.57045105981189525579e+00), RES(3.8576176225212213388e-4, -8.5091800407377002725e-1)},
+ {FN (sech), ARG(1.0e+00,1.57114159377789786021e+00), RES(-3.8576176225198530591e-4, -8.5091800407377002734e-1)},
+ {FN (sech), ARG(1.0e+00,-1.57114159377789786021e+00), RES(-3.8576176225198530591e-4, 8.5091800407377002734e-1)},
+ {FN (sech), ARG(-1.0e+00,1.57114159377789786021e+00), RES(-3.8576176225198530591e-4, 8.5091800407377002734e-1)},
+ {FN (sech), ARG(-1.0e+00,-1.57114159377789786021e+00), RES(-3.8576176225198530591e-4, -8.5091800407377002734e-1)},
+ {FN (sech), ARG(1.0e+00,3.14124738660679181379e+00), RES(-6.4805426748157480499e-1, -1.7040802567660423428e-4)},
+ {FN (sech), ARG(1.0e+00,-3.14124738660679181379e+00), RES(-6.4805426748157480499e-1, 1.7040802567660423428e-4)},
+ {FN (sech), ARG(-1.0e+00,3.14124738660679181379e+00), RES(-6.4805426748157480499e-1, 1.7040802567660423428e-4)},
+ {FN (sech), ARG(-1.0e+00,-3.14124738660679181379e+00), RES(-6.4805426748157480499e-1, -1.7040802567660423428e-4)},
+ {FN (sech), ARG(1.0e+00,3.14193792057279441821e+00), RES(-6.4805426748157480499e-1, 1.7040802567648334832e-4)},
+ {FN (sech), ARG(1.0e+00,-3.14193792057279441821e+00), RES(-6.4805426748157480499e-1, -1.7040802567648334832e-4)},
+ {FN (sech), ARG(-1.0e+00,3.14193792057279441821e+00), RES(-6.4805426748157480499e-1, -1.7040802567648334832e-4)},
+ {FN (sech), ARG(-1.0e+00,-3.14193792057279441821e+00), RES(-6.4805426748157480499e-1, 1.7040802567648334832e-4)},
+ {FN (sech), ARG(1.0e+00,4.71204371340168837179e+00), RES(-3.8576176225225896185e-4, 8.5091800407377002716e-1)},
+ {FN (sech), ARG(1.0e+00,-4.71204371340168837179e+00), RES(-3.8576176225225896185e-4, -8.5091800407377002716e-1)},
+ {FN (sech), ARG(-1.0e+00,4.71204371340168837179e+00), RES(-3.8576176225225896185e-4, -8.5091800407377002716e-1)},
+ {FN (sech), ARG(-1.0e+00,-4.71204371340168837179e+00), RES(-3.8576176225225896185e-4, 8.5091800407377002716e-1)},
+ {FN (sech), ARG(1.0e+00,4.71273424736769097620e+00), RES(3.8576176225184847794e-4, 8.5091800407377002743e-1)},
+ {FN (sech), ARG(1.0e+00,-4.71273424736769097620e+00), RES(3.8576176225184847794e-4, -8.5091800407377002743e-1)},
+ {FN (sech), ARG(-1.0e+00,4.71273424736769097620e+00), RES(3.8576176225184847794e-4, -8.5091800407377002743e-1)},
+ {FN (sech), ARG(-1.0e+00,-4.71273424736769097620e+00), RES(3.8576176225184847794e-4, 8.5091800407377002743e-1)},
+ {FN (sech), ARG(1.0e+00,6.28284004019658492979e+00), RES(6.4805426748157480498e-1, 1.7040802567666467726e-4)},
+ {FN (sech), ARG(1.0e+00,-6.28284004019658492979e+00), RES(6.4805426748157480498e-1, -1.7040802567666467726e-4)},
+ {FN (sech), ARG(-1.0e+00,6.28284004019658492979e+00), RES(6.4805426748157480498e-1, -1.7040802567666467726e-4)},
+ {FN (sech), ARG(-1.0e+00,-6.28284004019658492979e+00), RES(6.4805426748157480498e-1, 1.7040802567666467726e-4)},
+ {FN (sech), ARG(1.0e+00,6.28353057416258753420e+00), RES(6.480542674815748050e-1, -1.7040802567642290534e-4)},
+ {FN (sech), ARG(1.0e+00,-6.28353057416258753420e+00), RES(6.480542674815748050e-1, 1.7040802567642290534e-4)},
+ {FN (sech), ARG(-1.0e+00,6.28353057416258753420e+00), RES(6.480542674815748050e-1, 1.7040802567642290534e-4)},
+ {FN (sech), ARG(-1.0e+00,-6.28353057416258753420e+00), RES(6.480542674815748050e-1, -1.7040802567642290534e-4)},
+ {FN (sech), ARG(1.0e+00,9.42443269378637893396e+00), RES(-6.4805426748157480501e-1, -1.7040802567628675588e-4)},
+ {FN (sech), ARG(1.0e+00,-9.42443269378637893396e+00), RES(-6.4805426748157480501e-1, 1.7040802567628675588e-4)},
+ {FN (sech), ARG(-1.0e+00,9.42443269378637893396e+00), RES(-6.4805426748157480501e-1, 1.7040802567628675588e-4)},
+ {FN (sech), ARG(-1.0e+00,-9.42443269378637893396e+00), RES(-6.4805426748157480501e-1, -1.7040802567628675588e-4)},
+ {FN (sech), ARG(1.0e+00,9.42512322775237976202e+00), RES(-6.4805426748157480504e-1, 1.704080256759240980e-4)},
+ {FN (sech), ARG(1.0e+00,-9.42512322775237976202e+00), RES(-6.4805426748157480504e-1, -1.704080256759240980e-4)},
+ {FN (sech), ARG(-1.0e+00,9.42512322775237976202e+00), RES(-6.4805426748157480504e-1, -1.704080256759240980e-4)},
+ {FN (sech), ARG(-1.0e+00,-9.42512322775237976202e+00), RES(-6.4805426748157480504e-1, 1.704080256759240980e-4)},
+ {FN (sech), ARG(2.0e+00,-3.45266983001243932001e-04), RES(2.6580221522968095407e-1, 8.8471445300374010365e-5)},
+ {FN (sech), ARG(2.0e+00,3.45266983001243932001e-04), RES(2.6580221522968095407e-1, -8.8471445300374010365e-5)},
+ {FN (sech), ARG(-2.0e+00,-3.45266983001243932001e-04), RES(2.6580221522968095407e-1, -8.8471445300374010365e-5)},
+ {FN (sech), ARG(-2.0e+00,3.45266983001243932001e-04), RES(2.6580221522968095407e-1, 8.8471445300374010365e-5)},
+ {FN (sech), ARG(2.0e+00,1.57045105981189525579e+00), RES(9.8749461907069845806e-5, -2.7572054583883740767e-1)},
+ {FN (sech), ARG(2.0e+00,-1.57045105981189525579e+00), RES(9.8749461907069845806e-5, 2.7572054583883740767e-1)},
+ {FN (sech), ARG(-2.0e+00,1.57045105981189525579e+00), RES(9.8749461907069845806e-5, 2.7572054583883740767e-1)},
+ {FN (sech), ARG(-2.0e+00,-1.57045105981189525579e+00), RES(9.8749461907069845806e-5, -2.7572054583883740767e-1)},
+ {FN (sech), ARG(2.0e+00,1.57114159377789786021e+00), RES(-9.8749461907034819809e-5, -2.7572054583883740768e-1)},
+ {FN (sech), ARG(2.0e+00,-1.57114159377789786021e+00), RES(-9.8749461907034819809e-5, 2.7572054583883740768e-1)},
+ {FN (sech), ARG(-2.0e+00,1.57114159377789786021e+00), RES(-9.8749461907034819809e-5, 2.7572054583883740768e-1)},
+ {FN (sech), ARG(-2.0e+00,-1.57114159377789786021e+00), RES(-9.8749461907034819809e-5, -2.7572054583883740768e-1)},
+ {FN (sech), ARG(2.0e+00,3.14124738660679181379e+00), RES(-2.6580221522968095405e-1, -8.8471445300420323443e-5)},
+ {FN (sech), ARG(2.0e+00,-3.14124738660679181379e+00), RES(-2.6580221522968095405e-1, 8.8471445300420323443e-5)},
+ {FN (sech), ARG(-2.0e+00,3.14124738660679181379e+00), RES(-2.6580221522968095405e-1, 8.8471445300420323443e-5)},
+ {FN (sech), ARG(-2.0e+00,-3.14124738660679181379e+00), RES(-2.6580221522968095405e-1, -8.8471445300420323443e-5)},
+ {FN (sech), ARG(2.0e+00,3.14193792057279441821e+00), RES(-2.6580221522968095407e-1, 8.8471445300357562580e-5)},
+ {FN (sech), ARG(2.0e+00,-3.14193792057279441821e+00), RES(-2.6580221522968095407e-1, -8.8471445300357562580e-5)},
+ {FN (sech), ARG(-2.0e+00,3.14193792057279441821e+00), RES(-2.6580221522968095407e-1, -8.8471445300357562580e-5)},
+ {FN (sech), ARG(-2.0e+00,-3.14193792057279441821e+00), RES(-2.6580221522968095407e-1, 8.8471445300357562580e-5)},
+ {FN (sech), ARG(2.0e+00,4.71204371340168837179e+00), RES(-9.8749461907104871804e-5, 2.7572054583883740766e-1)},
+ {FN (sech), ARG(2.0e+00,-4.71204371340168837179e+00), RES(-9.8749461907104871804e-5, -2.7572054583883740766e-1)},
+ {FN (sech), ARG(-2.0e+00,4.71204371340168837179e+00), RES(-9.8749461907104871804e-5, -2.7572054583883740766e-1)},
+ {FN (sech), ARG(-2.0e+00,-4.71204371340168837179e+00), RES(-9.8749461907104871804e-5, 2.7572054583883740766e-1)},
+ {FN (sech), ARG(2.0e+00,4.71273424736769097620e+00), RES(9.8749461906999793811e-5, 2.7572054583883740770e-1)},
+ {FN (sech), ARG(2.0e+00,-4.71273424736769097620e+00), RES(9.8749461906999793811e-5, -2.7572054583883740770e-1)},
+ {FN (sech), ARG(-2.0e+00,4.71273424736769097620e+00), RES(9.8749461906999793811e-5, -2.7572054583883740770e-1)},
+ {FN (sech), ARG(-2.0e+00,-4.71273424736769097620e+00), RES(9.8749461906999793811e-5, 2.7572054583883740770e-1)},
+ {FN (sech), ARG(2.0e+00,6.28284004019658492979e+00), RES(2.6580221522968095404e-1, 8.8471445300451703875e-5)},
+ {FN (sech), ARG(2.0e+00,-6.28284004019658492979e+00), RES(2.6580221522968095404e-1, -8.8471445300451703875e-5)},
+ {FN (sech), ARG(-2.0e+00,6.28284004019658492979e+00), RES(2.6580221522968095404e-1, -8.8471445300451703875e-5)},
+ {FN (sech), ARG(-2.0e+00,-6.28284004019658492979e+00), RES(2.6580221522968095404e-1, 8.8471445300451703875e-5)},
+ {FN (sech), ARG(2.0e+00,6.28353057416258753420e+00), RES(2.6580221522968095408e-1, -8.8471445300326182148e-5)},
+ {FN (sech), ARG(2.0e+00,-6.28353057416258753420e+00), RES(2.6580221522968095408e-1, 8.8471445300326182148e-5)},
+ {FN (sech), ARG(-2.0e+00,6.28353057416258753420e+00), RES(2.6580221522968095408e-1, 8.8471445300326182148e-5)},
+ {FN (sech), ARG(-2.0e+00,-6.28353057416258753420e+00), RES(2.6580221522968095408e-1, -8.8471445300326182148e-5)},
+ {FN (sech), ARG(2.0e+00,9.42443269378637893396e+00), RES(-2.6580221522968095410e-1, -8.8471445300255496873e-5)},
+ {FN (sech), ARG(2.0e+00,-9.42443269378637893396e+00), RES(-2.6580221522968095410e-1, 8.8471445300255496873e-5)},
+ {FN (sech), ARG(-2.0e+00,9.42443269378637893396e+00), RES(-2.6580221522968095410e-1, 8.8471445300255496873e-5)},
+ {FN (sech), ARG(-2.0e+00,-9.42443269378637893396e+00), RES(-2.6580221522968095410e-1, -8.8471445300255496873e-5)},
+ {FN (sech), ARG(2.0e+00,9.42512322775237976202e+00), RES(-2.6580221522968095416e-1, 8.8471445300067214283e-5)},
+ {FN (sech), ARG(2.0e+00,-9.42512322775237976202e+00), RES(-2.6580221522968095416e-1, -8.8471445300067214283e-5)},
+ {FN (sech), ARG(-2.0e+00,9.42512322775237976202e+00), RES(-2.6580221522968095416e-1, -8.8471445300067214283e-5)},
+ {FN (sech), ARG(-2.0e+00,-9.42512322775237976202e+00), RES(-2.6580221522968095416e-1, 8.8471445300067214283e-5)},
+ {FN (coth), ARG(0.0e+00,-3.45266983001243932001e-04), RES(0, 2.8963092606511032136e3)},
+ {FN (coth), ARG(0.0e+00,3.45266983001243932001e-04), RES(0, -2.8963092606511032136e3)},
+ {FN (coth), ARG(0.0e+00,1.57045105981189525579e+00), RES(0, -3.4526699672104134407e-4)},
+ {FN (coth), ARG(0.0e+00,-1.57045105981189525579e+00), RES(0, 3.4526699672104134407e-4)},
+ {FN (coth), ARG(0.0e+00,1.57114159377789786021e+00), RES(0, 3.4526699672091887937e-4)},
+ {FN (coth), ARG(0.0e+00,-1.57114159377789786021e+00), RES(0, -3.4526699672091887937e-4)},
+ {FN (coth), ARG(0.0e+00,3.14124738660679181379e+00), RES(0, 2.8963092606495870519e3)},
+ {FN (coth), ARG(0.0e+00,-3.14124738660679181379e+00), RES(0, -2.8963092606495870519e3)},
+ {FN (coth), ARG(0.0e+00,3.14193792057279441821e+00), RES(0, -2.8963092606516416684e3)},
+ {FN (coth), ARG(0.0e+00,-3.14193792057279441821e+00), RES(0, 2.8963092606516416684e3)},
+ {FN (coth), ARG(0.0e+00,4.71204371340168837179e+00), RES(0, -3.4526699672116380876e-4)},
+ {FN (coth), ARG(0.0e+00,-4.71204371340168837179e+00), RES(0, 3.4526699672116380876e-4)},
+ {FN (coth), ARG(0.0e+00,4.71273424736769097620e+00), RES(0, 3.4526699672079641468e-4)},
+ {FN (coth), ARG(0.0e+00,-4.71273424736769097620e+00), RES(0, -3.4526699672079641468e-4)},
+ {FN (coth), ARG(0.0e+00,6.28284004019658492979e+00), RES(0, 2.8963092606485597437e3)},
+ {FN (coth), ARG(0.0e+00,-6.28284004019658492979e+00), RES(0, -2.8963092606485597437e3)},
+ {FN (coth), ARG(0.0e+00,6.28353057416258753420e+00), RES(0, -2.8963092606526689766e3)},
+ {FN (coth), ARG(0.0e+00,-6.28353057416258753420e+00), RES(0, 2.8963092606526689766e3)},
+ {FN (coth), ARG(0.0e+00,9.42443269378637893396e+00), RES(0, 2.8963092606549830163e3)},
+ {FN (coth), ARG(0.0e+00,-9.42443269378637893396e+00), RES(0, -2.8963092606549830163e3)},
+ {FN (coth), ARG(0.0e+00,9.42512322775237976202e+00), RES(0, -2.8963092606611468657e3)},
+ {FN (coth), ARG(0.0e+00,-9.42512322775237976202e+00), RES(0, 2.8963092606611468657e3)},
+ {FN (coth), ARG(1.19209289550781250e-07,-3.45266983001243932001e-04), RES(9.9999992052715532101e-1, 2.8963089153841613713e3)},
+ {FN (coth), ARG(1.19209289550781250e-07,3.45266983001243932001e-04), RES(9.9999992052715532101e-1, -2.8963089153841613713e3)},
+ {FN (coth), ARG(-1.19209289550781250e-07,-3.45266983001243932001e-04), RES(-9.9999992052715532101e-1, 2.8963089153841613713e3)},
+ {FN (coth), ARG(-1.19209289550781250e-07,3.45266983001243932001e-04), RES(-9.9999992052715532101e-1, -2.8963089153841613713e3)},
+ {FN (coth), ARG(1.19209289550781250e-07,1.57045105981189525579e+00), RES(1.1920930376163652990e-7, -3.4526699672103643753e-4)},
+ {FN (coth), ARG(1.19209289550781250e-07,-1.57045105981189525579e+00), RES(1.1920930376163652990e-7, 3.4526699672103643753e-4)},
+ {FN (coth), ARG(-1.19209289550781250e-07,1.57045105981189525579e+00), RES(-1.1920930376163652990e-7, -3.4526699672103643753e-4)},
+ {FN (coth), ARG(-1.19209289550781250e-07,-1.57045105981189525579e+00), RES(-1.1920930376163652990e-7, 3.4526699672103643753e-4)},
+ {FN (coth), ARG(1.19209289550781250e-07,1.57114159377789786021e+00), RES(1.1920930376163652989e-7, 3.4526699672091397283e-4)},
+ {FN (coth), ARG(1.19209289550781250e-07,-1.57114159377789786021e+00), RES(1.1920930376163652989e-7, -3.4526699672091397283e-4)},
+ {FN (coth), ARG(-1.19209289550781250e-07,1.57114159377789786021e+00), RES(-1.1920930376163652989e-7, 3.4526699672091397283e-4)},
+ {FN (coth), ARG(-1.19209289550781250e-07,-1.57114159377789786021e+00), RES(-1.1920930376163652989e-7, -3.4526699672091397283e-4)},
+ {FN (coth), ARG(1.19209289550781250e-07,3.14124738660679181379e+00), RES(9.9999992052610836018e-1, 2.8963089153826452102e3)},
+ {FN (coth), ARG(1.19209289550781250e-07,-3.14124738660679181379e+00), RES(9.9999992052610836018e-1, -2.8963089153826452102e3)},
+ {FN (coth), ARG(-1.19209289550781250e-07,3.14124738660679181379e+00), RES(-9.9999992052610836018e-1, 2.8963089153826452102e3)},
+ {FN (coth), ARG(-1.19209289550781250e-07,-3.14124738660679181379e+00), RES(-9.9999992052610836018e-1, -2.8963089153826452102e3)},
+ {FN (coth), ARG(1.19209289550781250e-07,3.14193792057279441821e+00), RES(9.9999992052752714224e-1, -2.8963089153846998260e3)},
+ {FN (coth), ARG(1.19209289550781250e-07,-3.14193792057279441821e+00), RES(9.9999992052752714224e-1, 2.8963089153846998260e3)},
+ {FN (coth), ARG(-1.19209289550781250e-07,3.14193792057279441821e+00), RES(-9.9999992052752714224e-1, -2.8963089153846998260e3)},
+ {FN (coth), ARG(-1.19209289550781250e-07,-3.14193792057279441821e+00), RES(-9.9999992052752714224e-1, 2.8963089153846998260e3)},
+ {FN (coth), ARG(1.19209289550781250e-07,4.71204371340168837179e+00), RES(1.1920930376163652991e-7, -3.4526699672115890222e-4)},
+ {FN (coth), ARG(1.19209289550781250e-07,-4.71204371340168837179e+00), RES(1.1920930376163652991e-7, 3.4526699672115890222e-4)},
+ {FN (coth), ARG(-1.19209289550781250e-07,4.71204371340168837179e+00), RES(-1.1920930376163652991e-7, -3.4526699672115890222e-4)},
+ {FN (coth), ARG(-1.19209289550781250e-07,-4.71204371340168837179e+00), RES(-1.1920930376163652991e-7, 3.4526699672115890222e-4)},
+ {FN (coth), ARG(1.19209289550781250e-07,4.71273424736769097620e+00), RES(1.1920930376163652988e-7, 3.4526699672079150814e-4)},
+ {FN (coth), ARG(1.19209289550781250e-07,-4.71273424736769097620e+00), RES(1.1920930376163652988e-7, -3.4526699672079150814e-4)},
+ {FN (coth), ARG(-1.19209289550781250e-07,4.71273424736769097620e+00), RES(-1.1920930376163652988e-7, 3.4526699672079150814e-4)},
+ {FN (coth), ARG(-1.19209289550781250e-07,-4.71273424736769097620e+00), RES(-1.1920930376163652988e-7, -3.4526699672079150814e-4)},
+ {FN (coth), ARG(1.19209289550781250e-07,6.28284004019658492979e+00), RES(9.9999992052539896914e-1, 2.8963089153816179024e3)},
+ {FN (coth), ARG(1.19209289550781250e-07,-6.28284004019658492979e+00), RES(9.9999992052539896914e-1, -2.8963089153816179024e3)},
+ {FN (coth), ARG(-1.19209289550781250e-07,6.28284004019658492979e+00), RES(-9.9999992052539896914e-1, 2.8963089153816179024e3)},
+ {FN (coth), ARG(-1.19209289550781250e-07,-6.28284004019658492979e+00), RES(-9.9999992052539896914e-1, -2.8963089153816179024e3)},
+ {FN (coth), ARG(1.19209289550781250e-07,6.28353057416258753420e+00), RES(9.9999992052823653327e-1, -2.8963089153857271338e3)},
+ {FN (coth), ARG(1.19209289550781250e-07,-6.28353057416258753420e+00), RES(9.9999992052823653327e-1, 2.8963089153857271338e3)},
+ {FN (coth), ARG(-1.19209289550781250e-07,6.28353057416258753420e+00), RES(-9.9999992052823653327e-1, -2.8963089153857271338e3)},
+ {FN (coth), ARG(-1.19209289550781250e-07,-6.28353057416258753420e+00), RES(-9.9999992052823653327e-1, 2.8963089153857271338e3)},
+ {FN (coth), ARG(1.19209289550781250e-07,9.42443269378637893396e+00), RES(9.9999992052983445585e-1, 2.8963089153880411727e3)},
+ {FN (coth), ARG(1.19209289550781250e-07,-9.42443269378637893396e+00), RES(9.9999992052983445585e-1, -2.8963089153880411727e3)},
+ {FN (coth), ARG(-1.19209289550781250e-07,9.42443269378637893396e+00), RES(-9.9999992052983445585e-1, 2.8963089153880411727e3)},
+ {FN (coth), ARG(-1.19209289550781250e-07,-9.42443269378637893396e+00), RES(-9.9999992052983445585e-1, -2.8963089153880411727e3)},
+ {FN (coth), ARG(1.19209289550781250e-07,9.42512322775237976202e+00), RES(9.9999992053409080205e-1, -2.8963089153942050199e3)},
+ {FN (coth), ARG(1.19209289550781250e-07,-9.42512322775237976202e+00), RES(9.9999992053409080205e-1, 2.8963089153942050199e3)},
+ {FN (coth), ARG(-1.19209289550781250e-07,9.42512322775237976202e+00), RES(-9.9999992053409080205e-1, -2.8963089153942050199e3)},
+ {FN (coth), ARG(-1.19209289550781250e-07,-9.42512322775237976202e+00), RES(-9.9999992053409080205e-1, 2.8963089153942050199e3)},
+ {FN (coth), ARG(5.0e-01,-3.45266983001243932001e-04), RES(2.1639524637389326002e0, 1.2715121175451222247e-3)},
+ {FN (coth), ARG(5.0e-01,3.45266983001243932001e-04), RES(2.1639524637389326002e0, -1.2715121175451222247e-3)},
+ {FN (coth), ARG(-5.0e-01,-3.45266983001243932001e-04), RES(-2.1639524637389326002e0, 1.2715121175451222247e-3)},
+ {FN (coth), ARG(-5.0e-01,3.45266983001243932001e-04), RES(-2.1639524637389326002e0, -1.2715121175451222247e-3)},
+ {FN (coth), ARG(5.0e-01,1.57045105981189525579e+00), RES(4.6211720058436229982e-1, -2.7153443992665204631e-4)},
+ {FN (coth), ARG(5.0e-01,-1.57045105981189525579e+00), RES(4.6211720058436229982e-1, 2.7153443992665204631e-4)},
+ {FN (coth), ARG(-5.0e-01,1.57045105981189525579e+00), RES(-4.6211720058436229982e-1, -2.7153443992665204631e-4)},
+ {FN (coth), ARG(-5.0e-01,-1.57045105981189525579e+00), RES(-4.6211720058436229982e-1, 2.7153443992665204631e-4)},
+ {FN (coth), ARG(5.0e-01,1.57114159377789786021e+00), RES(4.6211720058436229979e-1, 2.7153443992655573423e-4)},
+ {FN (coth), ARG(5.0e-01,-1.57114159377789786021e+00), RES(4.6211720058436229979e-1, -2.7153443992655573423e-4)},
+ {FN (coth), ARG(-5.0e-01,1.57114159377789786021e+00), RES(-4.6211720058436229979e-1, 2.7153443992655573423e-4)},
+ {FN (coth), ARG(-5.0e-01,-1.57114159377789786021e+00), RES(-4.6211720058436229979e-1, -2.7153443992655573423e-4)},
+ {FN (coth), ARG(5.0e-01,3.14124738660679181379e+00), RES(2.1639524637389325992e0, 1.2715121175457878359e-3)},
+ {FN (coth), ARG(5.0e-01,-3.14124738660679181379e+00), RES(2.1639524637389325992e0, -1.2715121175457878359e-3)},
+ {FN (coth), ARG(-5.0e-01,3.14124738660679181379e+00), RES(-2.1639524637389325992e0, 1.2715121175457878359e-3)},
+ {FN (coth), ARG(-5.0e-01,-3.14124738660679181379e+00), RES(-2.1639524637389325992e0, -1.2715121175457878359e-3)},
+ {FN (coth), ARG(5.0e-01,3.14193792057279441821e+00), RES(2.1639524637389326006e0, -1.2715121175448858373e-3)},
+ {FN (coth), ARG(5.0e-01,-3.14193792057279441821e+00), RES(2.1639524637389326006e0, 1.2715121175448858373e-3)},
+ {FN (coth), ARG(-5.0e-01,3.14193792057279441821e+00), RES(-2.1639524637389326006e0, -1.2715121175448858373e-3)},
+ {FN (coth), ARG(-5.0e-01,-3.14193792057279441821e+00), RES(-2.1639524637389326006e0, 1.2715121175448858373e-3)},
+ {FN (coth), ARG(5.0e-01,4.71204371340168837179e+00), RES(4.6211720058436229985e-1, -2.7153443992674835838e-4)},
+ {FN (coth), ARG(5.0e-01,-4.71204371340168837179e+00), RES(4.6211720058436229985e-1, 2.7153443992674835838e-4)},
+ {FN (coth), ARG(-5.0e-01,4.71204371340168837179e+00), RES(-4.6211720058436229985e-1, -2.7153443992674835838e-4)},
+ {FN (coth), ARG(-5.0e-01,-4.71204371340168837179e+00), RES(-4.6211720058436229985e-1, 2.7153443992674835838e-4)},
+ {FN (coth), ARG(5.0e-01,4.71273424736769097620e+00), RES(4.6211720058436229976e-1, 2.7153443992645942216e-4)},
+ {FN (coth), ARG(5.0e-01,-4.71273424736769097620e+00), RES(4.6211720058436229976e-1, -2.7153443992645942216e-4)},
+ {FN (coth), ARG(-5.0e-01,4.71273424736769097620e+00), RES(-4.6211720058436229976e-1, 2.7153443992645942216e-4)},
+ {FN (coth), ARG(-5.0e-01,-4.71273424736769097620e+00), RES(-4.6211720058436229976e-1, -2.7153443992645942216e-4)},
+ {FN (coth), ARG(5.0e-01,6.28284004019658492979e+00), RES(2.1639524637389325986e0, 1.2715121175462388352e-3)},
+ {FN (coth), ARG(5.0e-01,-6.28284004019658492979e+00), RES(2.1639524637389325986e0, -1.2715121175462388352e-3)},
+ {FN (coth), ARG(-5.0e-01,6.28284004019658492979e+00), RES(-2.1639524637389325986e0, 1.2715121175462388352e-3)},
+ {FN (coth), ARG(-5.0e-01,-6.28284004019658492979e+00), RES(-2.1639524637389325986e0, -1.2715121175462388352e-3)},
+ {FN (coth), ARG(5.0e-01,6.28353057416258753420e+00), RES(2.1639524637389326012e0, -1.2715121175444348380e-3)},
+ {FN (coth), ARG(5.0e-01,-6.28353057416258753420e+00), RES(2.1639524637389326012e0, 1.2715121175444348380e-3)},
+ {FN (coth), ARG(-5.0e-01,6.28353057416258753420e+00), RES(-2.1639524637389326012e0, -1.2715121175444348380e-3)},
+ {FN (coth), ARG(-5.0e-01,-6.28353057416258753420e+00), RES(-2.1639524637389326012e0, 1.2715121175444348380e-3)},
+ {FN (coth), ARG(5.0e-01,9.42443269378637893396e+00), RES(2.1639524637389326028e0, 1.2715121175434189499e-3)},
+ {FN (coth), ARG(5.0e-01,-9.42443269378637893396e+00), RES(2.1639524637389326028e0, -1.2715121175434189499e-3)},
+ {FN (coth), ARG(-5.0e-01,9.42443269378637893396e+00), RES(-2.1639524637389326028e0, 1.2715121175434189499e-3)},
+ {FN (coth), ARG(-5.0e-01,-9.42443269378637893396e+00), RES(-2.1639524637389326028e0, -1.2715121175434189499e-3)},
+ {FN (coth), ARG(5.0e-01,9.42512322775237976202e+00), RES(2.1639524637389326068e0, -1.2715121175407129542e-3)},
+ {FN (coth), ARG(5.0e-01,-9.42512322775237976202e+00), RES(2.1639524637389326068e0, 1.2715121175407129542e-3)},
+ {FN (coth), ARG(-5.0e-01,9.42512322775237976202e+00), RES(-2.1639524637389326068e0, -1.2715121175407129542e-3)},
+ {FN (coth), ARG(-5.0e-01,-9.42512322775237976202e+00), RES(-2.1639524637389326068e0, 1.2715121175407129542e-3)},
+ {FN (coth), ARG(1.0e+00,-3.45266983001243932001e-04), RES(1.3130351721648674824e0, 2.4999454374267620687e-4)},
+ {FN (coth), ARG(1.0e+00,3.45266983001243932001e-04), RES(1.3130351721648674824e0, -2.4999454374267620687e-4)},
+ {FN (coth), ARG(-1.0e+00,-3.45266983001243932001e-04), RES(-1.3130351721648674824e0, 2.4999454374267620687e-4)},
+ {FN (coth), ARG(-1.0e+00,3.45266983001243932001e-04), RES(-1.3130351721648674824e0, -2.4999454374267620687e-4)},
+ {FN (coth), ARG(1.0e+00,1.57045105981189525579e+00), RES(7.6159419408485704839e-1, -1.4500326960279979918e-4)},
+ {FN (coth), ARG(1.0e+00,-1.57045105981189525579e+00), RES(7.6159419408485704839e-1, 1.4500326960279979918e-4)},
+ {FN (coth), ARG(-1.0e+00,1.57045105981189525579e+00), RES(-7.6159419408485704839e-1, -1.4500326960279979918e-4)},
+ {FN (coth), ARG(-1.0e+00,-1.57045105981189525579e+00), RES(-7.6159419408485704839e-1, 1.4500326960279979918e-4)},
+ {FN (coth), ARG(1.0e+00,1.57114159377789786021e+00), RES(7.6159419408485704836e-1, 1.4500326960274836716e-4)},
+ {FN (coth), ARG(1.0e+00,-1.57114159377789786021e+00), RES(7.6159419408485704836e-1, -1.4500326960274836716e-4)},
+ {FN (coth), ARG(-1.0e+00,1.57114159377789786021e+00), RES(-7.6159419408485704836e-1, 1.4500326960274836716e-4)},
+ {FN (coth), ARG(-1.0e+00,-1.57114159377789786021e+00), RES(-7.6159419408485704836e-1, -1.4500326960274836716e-4)},
+ {FN (coth), ARG(1.0e+00,3.14124738660679181379e+00), RES(1.3130351721648674823e0, 2.4999454374280707411e-4)},
+ {FN (coth), ARG(1.0e+00,-3.14124738660679181379e+00), RES(1.3130351721648674823e0, -2.4999454374280707411e-4)},
+ {FN (coth), ARG(-1.0e+00,3.14124738660679181379e+00), RES(-1.3130351721648674823e0, 2.4999454374280707411e-4)},
+ {FN (coth), ARG(-1.0e+00,-3.14124738660679181379e+00), RES(-1.3130351721648674823e0, -2.4999454374280707411e-4)},
+ {FN (coth), ARG(1.0e+00,3.14193792057279441821e+00), RES(1.3130351721648674824e0, -2.4999454374262973024e-4)},
+ {FN (coth), ARG(1.0e+00,-3.14193792057279441821e+00), RES(1.3130351721648674824e0, 2.4999454374262973024e-4)},
+ {FN (coth), ARG(-1.0e+00,3.14193792057279441821e+00), RES(-1.3130351721648674824e0, -2.4999454374262973024e-4)},
+ {FN (coth), ARG(-1.0e+00,-3.14193792057279441821e+00), RES(-1.3130351721648674824e0, 2.4999454374262973024e-4)},
+ {FN (coth), ARG(1.0e+00,4.71204371340168837179e+00), RES(7.6159419408485704842e-1, -1.4500326960285123120e-4)},
+ {FN (coth), ARG(1.0e+00,-4.71204371340168837179e+00), RES(7.6159419408485704842e-1, 1.4500326960285123120e-4)},
+ {FN (coth), ARG(-1.0e+00,4.71204371340168837179e+00), RES(-7.6159419408485704842e-1, -1.4500326960285123120e-4)},
+ {FN (coth), ARG(-1.0e+00,-4.71204371340168837179e+00), RES(-7.6159419408485704842e-1, 1.4500326960285123120e-4)},
+ {FN (coth), ARG(1.0e+00,4.71273424736769097620e+00), RES(7.6159419408485704834e-1, 1.4500326960269693514e-4)},
+ {FN (coth), ARG(1.0e+00,-4.71273424736769097620e+00), RES(7.6159419408485704834e-1, -1.4500326960269693514e-4)},
+ {FN (coth), ARG(-1.0e+00,4.71273424736769097620e+00), RES(-7.6159419408485704834e-1, 1.4500326960269693514e-4)},
+ {FN (coth), ARG(-1.0e+00,-4.71273424736769097620e+00), RES(-7.6159419408485704834e-1, -1.4500326960269693514e-4)},
+ {FN (coth), ARG(1.0e+00,6.28284004019658492979e+00), RES(1.3130351721648674822e0, 2.4999454374289574604e-4)},
+ {FN (coth), ARG(1.0e+00,-6.28284004019658492979e+00), RES(1.3130351721648674822e0, -2.4999454374289574604e-4)},
+ {FN (coth), ARG(-1.0e+00,6.28284004019658492979e+00), RES(-1.3130351721648674822e0, 2.4999454374289574604e-4)},
+ {FN (coth), ARG(-1.0e+00,-6.28284004019658492979e+00), RES(-1.3130351721648674822e0, -2.4999454374289574604e-4)},
+ {FN (coth), ARG(1.0e+00,6.28353057416258753420e+00), RES(1.3130351721648674825e0, -2.4999454374254105830e-4)},
+ {FN (coth), ARG(1.0e+00,-6.28353057416258753420e+00), RES(1.3130351721648674825e0, 2.4999454374254105830e-4)},
+ {FN (coth), ARG(-1.0e+00,6.28353057416258753420e+00), RES(-1.3130351721648674825e0, -2.4999454374254105830e-4)},
+ {FN (coth), ARG(-1.0e+00,-6.28353057416258753420e+00), RES(-1.3130351721648674825e0, 2.4999454374254105830e-4)},
+ {FN (coth), ARG(1.0e+00,9.42443269378637893396e+00), RES(1.3130351721648674827e0, 2.4999454374234132236e-4)},
+ {FN (coth), ARG(1.0e+00,-9.42443269378637893396e+00), RES(1.3130351721648674827e0, -2.4999454374234132236e-4)},
+ {FN (coth), ARG(-1.0e+00,9.42443269378637893396e+00), RES(-1.3130351721648674827e0, 2.4999454374234132236e-4)},
+ {FN (coth), ARG(-1.0e+00,-9.42443269378637893396e+00), RES(-1.3130351721648674827e0, -2.4999454374234132236e-4)},
+ {FN (coth), ARG(1.0e+00,9.42512322775237976202e+00), RES(1.3130351721648674832e0, -2.4999454374180929074e-4)},
+ {FN (coth), ARG(1.0e+00,-9.42512322775237976202e+00), RES(1.3130351721648674832e0, 2.4999454374180929074e-4)},
+ {FN (coth), ARG(-1.0e+00,9.42512322775237976202e+00), RES(-1.3130351721648674832e0, -2.4999454374180929074e-4)},
+ {FN (coth), ARG(-1.0e+00,-9.42512322775237976202e+00), RES(-1.3130351721648674832e0, 2.4999454374180929074e-4)},
+ {FN (coth), ARG(2.0e+00,-3.45266983001243932001e-04), RES(1.0373147113268752620e0, 2.6247825506563736365e-5)},
+ {FN (coth), ARG(2.0e+00,3.45266983001243932001e-04), RES(1.0373147113268752620e0, -2.6247825506563736365e-5)},
+ {FN (coth), ARG(-2.0e+00,-3.45266983001243932001e-04), RES(-1.0373147113268752620e0, 2.6247825506563736365e-5)},
+ {FN (coth), ARG(-2.0e+00,3.45266983001243932001e-04), RES(-1.0373147113268752620e0, -2.6247825506563736365e-5)},
+ {FN (coth), ARG(2.0e+00,1.57045105981189525579e+00), RES(9.6402758819508310557e-1, -2.4393395410443750226e-5)},
+ {FN (coth), ARG(2.0e+00,-1.57045105981189525579e+00), RES(9.6402758819508310557e-1, 2.4393395410443750226e-5)},
+ {FN (coth), ARG(-2.0e+00,1.57045105981189525579e+00), RES(-9.6402758819508310557e-1, -2.4393395410443750226e-5)},
+ {FN (coth), ARG(-2.0e+00,-1.57045105981189525579e+00), RES(-9.6402758819508310557e-1, 2.4393395410443750226e-5)},
+ {FN (coth), ARG(2.0e+00,1.57114159377789786021e+00), RES(9.6402758819508310556e-1, 2.4393395410435097997e-5)},
+ {FN (coth), ARG(2.0e+00,-1.57114159377789786021e+00), RES(9.6402758819508310556e-1, -2.4393395410435097997e-5)},
+ {FN (coth), ARG(-2.0e+00,1.57114159377789786021e+00), RES(-9.6402758819508310556e-1, 2.4393395410435097997e-5)},
+ {FN (coth), ARG(-2.0e+00,-1.57114159377789786021e+00), RES(-9.6402758819508310556e-1, -2.4393395410435097997e-5)},
+ {FN (coth), ARG(2.0e+00,3.14124738660679181379e+00), RES(1.0373147113268752620e0, 2.6247825506577476589e-5)},
+ {FN (coth), ARG(2.0e+00,-3.14124738660679181379e+00), RES(1.0373147113268752620e0, -2.6247825506577476589e-5)},
+ {FN (coth), ARG(-2.0e+00,3.14124738660679181379e+00), RES(-1.0373147113268752620e0, 2.6247825506577476589e-5)},
+ {FN (coth), ARG(-2.0e+00,-3.14124738660679181379e+00), RES(-1.0373147113268752620e0, -2.6247825506577476589e-5)},
+ {FN (coth), ARG(2.0e+00,3.14193792057279441821e+00), RES(1.0373147113268752620e0, -2.6247825506558856616e-5)},
+ {FN (coth), ARG(2.0e+00,-3.14193792057279441821e+00), RES(1.0373147113268752620e0, 2.6247825506558856616e-5)},
+ {FN (coth), ARG(-2.0e+00,3.14193792057279441821e+00), RES(-1.0373147113268752620e0, -2.6247825506558856616e-5)},
+ {FN (coth), ARG(-2.0e+00,-3.14193792057279441821e+00), RES(-1.0373147113268752620e0, 2.6247825506558856616e-5)},
+ {FN (coth), ARG(2.0e+00,4.71204371340168837179e+00), RES(9.6402758819508310557e-1, -2.4393395410452402454e-5)},
+ {FN (coth), ARG(2.0e+00,-4.71204371340168837179e+00), RES(9.6402758819508310557e-1, 2.4393395410452402454e-5)},
+ {FN (coth), ARG(-2.0e+00,4.71204371340168837179e+00), RES(-9.6402758819508310557e-1, -2.4393395410452402454e-5)},
+ {FN (coth), ARG(-2.0e+00,-4.71204371340168837179e+00), RES(-9.6402758819508310557e-1, 2.4393395410452402454e-5)},
+ {FN (coth), ARG(2.0e+00,4.71273424736769097620e+00), RES(9.6402758819508310556e-1, 2.4393395410426445768e-5)},
+ {FN (coth), ARG(2.0e+00,-4.71273424736769097620e+00), RES(9.6402758819508310556e-1, -2.4393395410426445768e-5)},
+ {FN (coth), ARG(-2.0e+00,4.71273424736769097620e+00), RES(-9.6402758819508310556e-1, 2.4393395410426445768e-5)},
+ {FN (coth), ARG(-2.0e+00,-4.71273424736769097620e+00), RES(-9.6402758819508310556e-1, -2.4393395410426445768e-5)},
+ {FN (coth), ARG(2.0e+00,6.28284004019658492979e+00), RES(1.0373147113268752620e0, 2.6247825506586786575e-5)},
+ {FN (coth), ARG(2.0e+00,-6.28284004019658492979e+00), RES(1.0373147113268752620e0, -2.6247825506586786575e-5)},
+ {FN (coth), ARG(-2.0e+00,6.28284004019658492979e+00), RES(-1.0373147113268752620e0, 2.6247825506586786575e-5)},
+ {FN (coth), ARG(-2.0e+00,-6.28284004019658492979e+00), RES(-1.0373147113268752620e0, -2.6247825506586786575e-5)},
+ {FN (coth), ARG(2.0e+00,6.28353057416258753420e+00), RES(1.0373147113268752620e0, -2.6247825506549546629e-5)},
+ {FN (coth), ARG(2.0e+00,-6.28353057416258753420e+00), RES(1.0373147113268752620e0, 2.6247825506549546629e-5)},
+ {FN (coth), ARG(-2.0e+00,6.28353057416258753420e+00), RES(-1.0373147113268752620e0, -2.6247825506549546629e-5)},
+ {FN (coth), ARG(-2.0e+00,-6.28353057416258753420e+00), RES(-1.0373147113268752620e0, 2.6247825506549546629e-5)},
+ {FN (coth), ARG(2.0e+00,9.42443269378637893396e+00), RES(1.0373147113268752620e0, 2.6247825506528575631e-5)},
+ {FN (coth), ARG(2.0e+00,-9.42443269378637893396e+00), RES(1.0373147113268752620e0, -2.6247825506528575631e-5)},
+ {FN (coth), ARG(-2.0e+00,9.42443269378637893396e+00), RES(-1.0373147113268752620e0, 2.6247825506528575631e-5)},
+ {FN (coth), ARG(-2.0e+00,-9.42443269378637893396e+00), RES(-1.0373147113268752620e0, -2.6247825506528575631e-5)},
+ {FN (coth), ARG(2.0e+00,9.42512322775237976202e+00), RES(1.0373147113268752621e0, -2.6247825506472715712e-5)},
+ {FN (coth), ARG(2.0e+00,-9.42512322775237976202e+00), RES(1.0373147113268752621e0, 2.6247825506472715712e-5)},
+ {FN (coth), ARG(-2.0e+00,9.42512322775237976202e+00), RES(-1.0373147113268752621e0, -2.6247825506472715712e-5)},
+ {FN (coth), ARG(-2.0e+00,-9.42512322775237976202e+00), RES(-1.0373147113268752621e0, 2.6247825506472715712e-5)},
+ {FN (arccsch), ARG(0.0e+00,1.19209289550781250e-07), RES(-1.6635532333438683873e1, -1.5707963267948966192e0)},
+ {FN (arccsch), ARG(0.0e+00,-1.19209289550781250e-07), RES(1.6635532333438683873e1, 1.5707963267948966192e0)},
+ {FN (arccsch), ARG(0.0e+00,5.0e-01), RES(-1.3169578969248167086e0, -1.5707963267948966192e0)},
+ {FN (arccsch), ARG(0.0e+00,-5.0e-01), RES(1.3169578969248167086e0, 1.5707963267948966192e0)},
+ {FN (arccsch), ARG(0.0e+00,1.0e+00), RES(0, -1.5707963267948966192e0)},
+ {FN (arccsch), ARG(0.0e+00,-1.0e+00), RES(0, 1.5707963267948966192e0)},
+ {FN (arccsch), ARG(0.0e+00,2.0e+00), RES(0, -5.2359877559829887308e-1)},
+ {FN (arccsch), ARG(0.0e+00,-2.0e+00), RES(0, 5.2359877559829887308e-1)},
+ {FN (arccsch), ARG(0.0e+00,8.3886080e+06), RES(0, -1.1920928955078153234e-7)},
+ {FN (arccsch), ARG(0.0e+00,-8.3886080e+06), RES(0, 1.1920928955078153234e-7)},
+ {FN (arccsch), ARG(1.19209289550781250e-07,0.0e+00), RES(1.6635532333438690979e1, 0.0)},
+ {FN (arccsch), ARG(-1.19209289550781250e-07,0.0e+00), RES(-1.6635532333438690979e1, 0.0)},
+ {FN (arccsch), ARG(1.19209289550781250e-07,1.19209289550781250e-07), RES(1.6288958743158714771e1, -7.8539816339744120419e-1)},
+ {FN (arccsch), ARG(1.19209289550781250e-07,-1.19209289550781250e-07), RES(1.6288958743158714771e1, 7.8539816339744120419e-1)},
+ {FN (arccsch), ARG(-1.19209289550781250e-07,1.19209289550781250e-07), RES(-1.6288958743158714771e1, -7.8539816339744120419e-1)},
+ {FN (arccsch), ARG(-1.19209289550781250e-07,-1.19209289550781250e-07), RES(-1.6288958743158714771e1, 7.8539816339744120419e-1)},
+ {FN (arccsch), ARG(1.19209289550781250e-07,5.0e-01), RES(1.3169578969247948296e0, -1.5707960514928349710e0)},
+ {FN (arccsch), ARG(1.19209289550781250e-07,-5.0e-01), RES(1.3169578969247948296e0, 1.5707960514928349710e0)},
+ {FN (arccsch), ARG(-1.19209289550781250e-07,5.0e-01), RES(-1.3169578969247948296e0, -1.5707960514928349710e0)},
+ {FN (arccsch), ARG(-1.19209289550781250e-07,-5.0e-01), RES(-1.3169578969247948296e0, 1.5707960514928349710e0)},
+ {FN (arccsch), ARG(1.19209289550781250e-07,1.0e+00), RES(3.4526696585164602772e-4, -1.5704510597947457801e0)},
+ {FN (arccsch), ARG(1.19209289550781250e-07,-1.0e+00), RES(3.4526696585164602772e-4, 1.5704510597947457801e0)},
+ {FN (arccsch), ARG(-1.19209289550781250e-07,1.0e+00), RES(-3.4526696585164602772e-4, -1.5704510597947457801e0)},
+ {FN (arccsch), ARG(-1.19209289550781250e-07,-1.0e+00), RES(-3.4526696585164602772e-4, 1.5704510597947457801e0)},
+ {FN (arccsch), ARG(1.19209289550781250e-07,2.0e+00), RES(3.4412757706023621662e-8, -5.2359877559829648006e-1)},
+ {FN (arccsch), ARG(1.19209289550781250e-07,-2.0e+00), RES(3.4412757706023621662e-8, 5.2359877559829648006e-1)},
+ {FN (arccsch), ARG(-1.19209289550781250e-07,2.0e+00), RES(-3.4412757706023621662e-8, -5.2359877559829648006e-1)},
+ {FN (arccsch), ARG(-1.19209289550781250e-07,-2.0e+00), RES(-3.4412757706023621662e-8, 5.2359877559829648006e-1)},
+ {FN (arccsch), ARG(1.19209289550781250e-07,8.3886080e+06), RES(1.6940658945086127152e-21, -1.1920928955078153234e-7)},
+ {FN (arccsch), ARG(1.19209289550781250e-07,-8.3886080e+06), RES(1.6940658945086127152e-21, 1.1920928955078153234e-7)},
+ {FN (arccsch), ARG(-1.19209289550781250e-07,8.3886080e+06), RES(-1.6940658945086127152e-21, -1.1920928955078153234e-7)},
+ {FN (arccsch), ARG(-1.19209289550781250e-07,-8.3886080e+06), RES(-1.6940658945086127152e-21, 1.1920928955078153234e-7)},
+ {FN (arccsch), ARG(5.0e-01,0.0e+00), RES(1.4436354751788103425e0, 0.0)},
+ {FN (arccsch), ARG(-5.0e-01,0.0e+00), RES(-1.4436354751788103425e0, 0.0)},
+ {FN (arccsch), ARG(5.0e-01,1.19209289550781250e-07), RES(1.4436354751787798371e0, -2.1324805998799710740e-7)},
+ {FN (arccsch), ARG(5.0e-01,-1.19209289550781250e-07), RES(1.4436354751787798371e0, 2.1324805998799710740e-7)},
+ {FN (arccsch), ARG(-5.0e-01,1.19209289550781250e-07), RES(-1.4436354751787798371e0, -2.1324805998799710740e-7)},
+ {FN (arccsch), ARG(-5.0e-01,-1.19209289550781250e-07), RES(-1.4436354751787798371e0, 2.1324805998799710740e-7)},
+ {FN (arccsch), ARG(5.0e-01,5.0e-01), RES(1.0612750619050356520e0, -6.6623943249251525510e-1)},
+ {FN (arccsch), ARG(5.0e-01,-5.0e-01), RES(1.0612750619050356520e0, 6.6623943249251525510e-1)},
+ {FN (arccsch), ARG(-5.0e-01,5.0e-01), RES(-1.0612750619050356520e0, -6.6623943249251525510e-1)},
+ {FN (arccsch), ARG(-5.0e-01,-5.0e-01), RES(-1.0612750619050356520e0, 6.6623943249251525510e-1)},
+ {FN (arccsch), ARG(5.0e-01,1.0e+00), RES(5.3321829058411214108e-1, -7.7308635671950473342e-1)},
+ {FN (arccsch), ARG(5.0e-01,-1.0e+00), RES(5.3321829058411214108e-1, 7.7308635671950473342e-1)},
+ {FN (arccsch), ARG(-5.0e-01,1.0e+00), RES(-5.3321829058411214108e-1, -7.7308635671950473342e-1)},
+ {FN (arccsch), ARG(-5.0e-01,-1.0e+00), RES(-5.3321829058411214108e-1, 7.7308635671950473342e-1)},
+ {FN (arccsch), ARG(5.0e-01,2.0e+00), RES(1.3261586085051183885e-1, -4.8530734047334251250e-1)},
+ {FN (arccsch), ARG(5.0e-01,-2.0e+00), RES(1.3261586085051183885e-1, 4.8530734047334251250e-1)},
+ {FN (arccsch), ARG(-5.0e-01,2.0e+00), RES(-1.3261586085051183885e-1, -4.8530734047334251250e-1)},
+ {FN (arccsch), ARG(-5.0e-01,-2.0e+00), RES(-1.3261586085051183885e-1, 4.8530734047334251250e-1)},
+ {FN (arccsch), ARG(5.0e-01,8.3886080e+06), RES(7.1054273576010271023e-15, -1.1920928955078110883e-7)},
+ {FN (arccsch), ARG(5.0e-01,-8.3886080e+06), RES(7.1054273576010271023e-15, 1.1920928955078110883e-7)},
+ {FN (arccsch), ARG(-5.0e-01,8.3886080e+06), RES(-7.1054273576010271023e-15, -1.1920928955078110883e-7)},
+ {FN (arccsch), ARG(-5.0e-01,-8.3886080e+06), RES(-7.1054273576010271023e-15, 1.1920928955078110883e-7)},
+ {FN (arccsch), ARG(1.0e+00,0.0e+00), RES(8.8137358701954302523e-1, 0.0)},
+ {FN (arccsch), ARG(-1.0e+00,0.0e+00), RES(-8.8137358701954302523e-1, 0.0)},
+ {FN (arccsch), ARG(1.0e+00,1.19209289550781250e-07), RES(8.8137358701953548879e-1, -8.4293697021787414719e-8)},
+ {FN (arccsch), ARG(1.0e+00,-1.19209289550781250e-07), RES(8.8137358701953548879e-1, 8.4293697021787414719e-8)},
+ {FN (arccsch), ARG(-1.0e+00,1.19209289550781250e-07), RES(-8.8137358701953548879e-1, -8.4293697021787414719e-8)},
+ {FN (arccsch), ARG(-1.0e+00,-1.19209289550781250e-07), RES(-8.8137358701953548879e-1, 8.4293697021787414719e-8)},
+ {FN (arccsch), ARG(1.0e+00,5.0e-01), RES(7.6388434595371104541e-1, -3.1122579724476109533e-1)},
+ {FN (arccsch), ARG(1.0e+00,-5.0e-01), RES(7.6388434595371104541e-1, 3.1122579724476109533e-1)},
+ {FN (arccsch), ARG(-1.0e+00,5.0e-01), RES(-7.6388434595371104541e-1, -3.1122579724476109533e-1)},
+ {FN (arccsch), ARG(-1.0e+00,-5.0e-01), RES(-7.6388434595371104541e-1, 3.1122579724476109533e-1)},
+ {FN (arccsch), ARG(1.0e+00,1.0e+00), RES(5.3063753095251782602e-1, -4.5227844715119068206e-1)},
+ {FN (arccsch), ARG(1.0e+00,-1.0e+00), RES(5.3063753095251782602e-1, 4.5227844715119068206e-1)},
+ {FN (arccsch), ARG(-1.0e+00,1.0e+00), RES(-5.3063753095251782602e-1, -4.5227844715119068206e-1)},
+ {FN (arccsch), ARG(-1.0e+00,-1.0e+00), RES(-5.3063753095251782602e-1, 4.5227844715119068206e-1)},
+ {FN (arccsch), ARG(1.0e+00,2.0e+00), RES(2.1561241855582964497e-1, -4.0158639166780606828e-1)},
+ {FN (arccsch), ARG(1.0e+00,-2.0e+00), RES(2.1561241855582964497e-1, 4.0158639166780606828e-1)},
+ {FN (arccsch), ARG(-1.0e+00,2.0e+00), RES(-2.1561241855582964497e-1, -4.0158639166780606828e-1)},
+ {FN (arccsch), ARG(-1.0e+00,-2.0e+00), RES(-2.1561241855582964497e-1, 4.0158639166780606828e-1)},
+ {FN (arccsch), ARG(1.0e+00,8.3886080e+06), RES(1.4210854715201902743e-14, -1.1920928955077983828e-7)},
+ {FN (arccsch), ARG(1.0e+00,-8.3886080e+06), RES(1.4210854715201902743e-14, 1.1920928955077983828e-7)},
+ {FN (arccsch), ARG(-1.0e+00,8.3886080e+06), RES(-1.4210854715201902743e-14, -1.1920928955077983828e-7)},
+ {FN (arccsch), ARG(-1.0e+00,-8.3886080e+06), RES(-1.4210854715201902743e-14, 1.1920928955077983828e-7)},
+ {FN (arccsch), ARG(2.0e+00,0.0e+00), RES(4.8121182505960344750e-1, 0.0)},
+ {FN (arccsch), ARG(-2.0e+00,0.0e+00), RES(-4.8121182505960344750e-1, 0.0)},
+ {FN (arccsch), ARG(2.0e+00,1.19209289550781250e-07), RES(4.8121182505960201756e-1, -2.6656007498500149811e-8)},
+ {FN (arccsch), ARG(2.0e+00,-1.19209289550781250e-07), RES(4.8121182505960201756e-1, 2.6656007498500149811e-8)},
+ {FN (arccsch), ARG(-2.0e+00,1.19209289550781250e-07), RES(-4.8121182505960201756e-1, -2.6656007498500149811e-8)},
+ {FN (arccsch), ARG(-2.0e+00,-1.19209289550781250e-07), RES(-4.8121182505960201756e-1, 2.6656007498500149811e-8)},
+ {FN (arccsch), ARG(2.0e+00,5.0e-01), RES(4.5717847686917515748e-1, -1.0654050295275703990e-1)},
+ {FN (arccsch), ARG(2.0e+00,-5.0e-01), RES(4.5717847686917515748e-1, 1.0654050295275703990e-1)},
+ {FN (arccsch), ARG(-2.0e+00,5.0e-01), RES(-4.5717847686917515748e-1, -1.0654050295275703990e-1)},
+ {FN (arccsch), ARG(-2.0e+00,-5.0e-01), RES(-4.5717847686917515748e-1, 1.0654050295275703990e-1)},
+ {FN (arccsch), ARG(2.0e+00,1.0e+00), RES(3.9656823011232897892e-1, -1.8631805410781552582e-1)},
+ {FN (arccsch), ARG(2.0e+00,-1.0e+00), RES(3.9656823011232897892e-1, 1.8631805410781552582e-1)},
+ {FN (arccsch), ARG(-2.0e+00,1.0e+00), RES(-3.9656823011232897892e-1, -1.8631805410781552582e-1)},
+ {FN (arccsch), ARG(-2.0e+00,-1.0e+00), RES(-3.9656823011232897892e-1, 1.8631805410781552582e-1)},
+ {FN (arccsch), ARG(2.0e+00,2.0e+00), RES(2.5489557334055081773e-1, -2.4452216513554014646e-1)},
+ {FN (arccsch), ARG(2.0e+00,-2.0e+00), RES(2.5489557334055081773e-1, 2.4452216513554014646e-1)},
+ {FN (arccsch), ARG(-2.0e+00,2.0e+00), RES(-2.5489557334055081773e-1, -2.4452216513554014646e-1)},
+ {FN (arccsch), ARG(-2.0e+00,-2.0e+00), RES(-2.5489557334055081773e-1, 2.4452216513554014646e-1)},
+ {FN (arccsch), ARG(2.0e+00,8.3886080e+06), RES(2.8421709430402593796e-14, -1.1920928955077475608e-7)},
+ {FN (arccsch), ARG(2.0e+00,-8.3886080e+06), RES(2.8421709430402593796e-14, 1.1920928955077475608e-7)},
+ {FN (arccsch), ARG(-2.0e+00,8.3886080e+06), RES(-2.8421709430402593796e-14, -1.1920928955077475608e-7)},
+ {FN (arccsch), ARG(-2.0e+00,-8.3886080e+06), RES(-2.8421709430402593796e-14, 1.1920928955077475608e-7)},
+ {FN (arccsch), ARG(8.3886080e+06,0.0e+00), RES(1.1920928955078096766e-7, 0.0)},
+ {FN (arccsch), ARG(-8.3886080e+06,0.0e+00), RES(-1.1920928955078096766e-7, 0.0)},
+ {FN (arccsch), ARG(8.3886080e+06,1.19209289550781250e-07), RES(1.1920928955078096766e-7, -1.6940658945085886411e-21)},
+ {FN (arccsch), ARG(8.3886080e+06,-1.19209289550781250e-07), RES(1.1920928955078096766e-7, 1.6940658945085886411e-21)},
+ {FN (arccsch), ARG(-8.3886080e+06,1.19209289550781250e-07), RES(-1.1920928955078096766e-7, -1.6940658945085886411e-21)},
+ {FN (arccsch), ARG(-8.3886080e+06,-1.19209289550781250e-07), RES(-1.1920928955078096766e-7, 1.6940658945085886411e-21)},
+ {FN (arccsch), ARG(8.3886080e+06,5.0e-01), RES(1.1920928955078054414e-7, -7.1054273576009261281e-15)},
+ {FN (arccsch), ARG(8.3886080e+06,-5.0e-01), RES(1.1920928955078054414e-7, 7.1054273576009261281e-15)},
+ {FN (arccsch), ARG(-8.3886080e+06,5.0e-01), RES(-1.1920928955078054414e-7, -7.1054273576009261281e-15)},
+ {FN (arccsch), ARG(-8.3886080e+06,-5.0e-01), RES(-1.1920928955078054414e-7, 7.1054273576009261281e-15)},
+ {FN (arccsch), ARG(8.3886080e+06,1.0e+00), RES(1.1920928955077927359e-7, -1.4210854715201700795e-14)},
+ {FN (arccsch), ARG(8.3886080e+06,-1.0e+00), RES(1.1920928955077927359e-7, 1.4210854715201700795e-14)},
+ {FN (arccsch), ARG(-8.3886080e+06,1.0e+00), RES(-1.1920928955077927359e-7, -1.4210854715201700795e-14)},
+ {FN (arccsch), ARG(-8.3886080e+06,-1.0e+00), RES(-1.1920928955077927359e-7, 1.4210854715201700795e-14)},
+ {FN (arccsch), ARG(8.3886080e+06,2.0e+00), RES(1.1920928955077419139e-7, -2.8421709430402189899e-14)},
+ {FN (arccsch), ARG(8.3886080e+06,-2.0e+00), RES(1.1920928955077419139e-7, 2.8421709430402189899e-14)},
+ {FN (arccsch), ARG(-8.3886080e+06,2.0e+00), RES(-1.1920928955077419139e-7, -2.8421709430402189899e-14)},
+ {FN (arccsch), ARG(-8.3886080e+06,-2.0e+00), RES(-1.1920928955077419139e-7, 2.8421709430402189899e-14)},
+ {FN (arccsch), ARG(8.3886080e+06,8.3886080e+06), RES(5.9604644775390695586e-8, -5.9604644775390554414e-8)},
+ {FN (arccsch), ARG(8.3886080e+06,-8.3886080e+06), RES(5.9604644775390695586e-8, 5.9604644775390554414e-8)},
+ {FN (arccsch), ARG(-8.3886080e+06,8.3886080e+06), RES(-5.9604644775390695586e-8, -5.9604644775390554414e-8)},
+ {FN (arccsch), ARG(-8.3886080e+06,-8.3886080e+06), RES(-5.9604644775390695586e-8, 5.9604644775390554414e-8)},
+ {FN (arcsech), ARG(0.0e+00,1.19209289550781250e-07), RES(1.6635532333438690979e1, -1.5707963267948966192e0)},
+ {FN (arcsech), ARG(0.0e+00,-1.19209289550781250e-07), RES(1.6635532333438690979e1, 1.5707963267948966192e0)},
+ {FN (arcsech), ARG(0.0e+00,5.0e-01), RES(1.4436354751788103425e0, -1.5707963267948966192e0)},
+ {FN (arcsech), ARG(0.0e+00,-5.0e-01), RES(1.4436354751788103425e0, 1.5707963267948966192e0)},
+ {FN (arcsech), ARG(0.0e+00,1.0e+00), RES(8.8137358701954302523e-1, -1.5707963267948966192e0)},
+ {FN (arcsech), ARG(0.0e+00,-1.0e+00), RES(8.8137358701954302523e-1, 1.5707963267948966192e0)},
+ {FN (arcsech), ARG(0.0e+00,2.0e+00), RES(4.8121182505960344750e-1, -1.5707963267948966192e0)},
+ {FN (arcsech), ARG(0.0e+00,-2.0e+00), RES(4.8121182505960344750e-1, 1.5707963267948966192e0)},
+ {FN (arcsech), ARG(0.0e+00,8.3886080e+06), RES(1.1920928955078096766e-7, -1.5707963267948966192e0)},
+ {FN (arcsech), ARG(0.0e+00,-8.3886080e+06), RES(1.1920928955078096766e-7, 1.5707963267948966192e0)},
+ {FN (arcsech), ARG(1.19209289550781250e-07,0.0e+00), RES(1.6635532333438683873e1, 0.0)},
+ {FN (arcsech), ARG(-1.19209289550781250e-07,0.0e+00), RES(1.6635532333438683873e1, 3.1415926535897932385e0)},
+ {FN (arcsech), ARG(1.19209289550781250e-07,1.19209289550781250e-07), RES(1.6288958743158714771e1, -7.8539816339745541504e-1)},
+ {FN (arcsech), ARG(1.19209289550781250e-07,-1.19209289550781250e-07), RES(1.6288958743158714771e1, 7.8539816339745541504e-1)},
+ {FN (arcsech), ARG(-1.19209289550781250e-07,1.19209289550781250e-07), RES(1.6288958743158714771e1, -2.3561944901923378234e0)},
+ {FN (arcsech), ARG(-1.19209289550781250e-07,-1.19209289550781250e-07), RES(1.6288958743158714771e1, 2.3561944901923378234e0)},
+ {FN (arcsech), ARG(1.19209289550781250e-07,5.0e-01), RES(1.4436354751787798371e0, -1.5707961135468366312e0)},
+ {FN (arcsech), ARG(1.19209289550781250e-07,-5.0e-01), RES(1.4436354751787798371e0, 1.5707961135468366312e0)},
+ {FN (arcsech), ARG(-1.19209289550781250e-07,5.0e-01), RES(1.4436354751787798371e0, -1.5707965400429566072e0)},
+ {FN (arcsech), ARG(-1.19209289550781250e-07,-5.0e-01), RES(1.4436354751787798371e0, 1.5707965400429566072e0)},
+ {FN (arcsech), ARG(1.19209289550781250e-07,1.0e+00), RES(8.8137358701953548879e-1, -1.5707962425011995974e0)},
+ {FN (arcsech), ARG(1.19209289550781250e-07,-1.0e+00), RES(8.8137358701953548879e-1, 1.5707962425011995974e0)},
+ {FN (arcsech), ARG(-1.19209289550781250e-07,1.0e+00), RES(8.8137358701953548879e-1, -1.5707964110885936410e0)},
+ {FN (arcsech), ARG(-1.19209289550781250e-07,-1.0e+00), RES(8.8137358701953548879e-1, 1.5707964110885936410e0)},
+ {FN (arcsech), ARG(1.19209289550781250e-07,2.0e+00), RES(4.8121182505960201756e-1, -1.5707963001388891207e0)},
+ {FN (arcsech), ARG(1.19209289550781250e-07,-2.0e+00), RES(4.8121182505960201756e-1, 1.5707963001388891207e0)},
+ {FN (arcsech), ARG(-1.19209289550781250e-07,2.0e+00), RES(4.8121182505960201756e-1, -1.5707963534509041177e0)},
+ {FN (arcsech), ARG(-1.19209289550781250e-07,-2.0e+00), RES(4.8121182505960201756e-1, 1.5707963534509041177e0)},
+ {FN (arcsech), ARG(1.19209289550781250e-07,8.3886080e+06), RES(1.1920928955078096766e-7, -1.5707963267948966192e0)},
+ {FN (arcsech), ARG(1.19209289550781250e-07,-8.3886080e+06), RES(1.1920928955078096766e-7, 1.5707963267948966192e0)},
+ {FN (arcsech), ARG(-1.19209289550781250e-07,8.3886080e+06), RES(1.1920928955078096766e-7, -1.5707963267948966192e0)},
+ {FN (arcsech), ARG(-1.19209289550781250e-07,-8.3886080e+06), RES(1.1920928955078096766e-7, 1.5707963267948966192e0)},
+ {FN (arcsech), ARG(5.0e-01,0.0e+00), RES(1.3169578969248167086e0, 0.0)},
+ {FN (arcsech), ARG(-5.0e-01,0.0e+00), RES(1.3169578969248167086e0, 3.1415926535897932385e0)},
+ {FN (arcsech), ARG(5.0e-01,1.19209289550781250e-07), RES(1.3169578969247948296e0, -2.7530206164818516969e-7)},
+ {FN (arcsech), ARG(5.0e-01,-1.19209289550781250e-07), RES(1.3169578969247948296e0, 2.7530206164818516969e-7)},
+ {FN (arcsech), ARG(-5.0e-01,1.19209289550781250e-07), RES(1.3169578969247948296e0, -3.1415923782877315903e0)},
+ {FN (arcsech), ARG(-5.0e-01,-1.19209289550781250e-07), RES(1.3169578969247948296e0, 3.1415923782877315903e0)},
+ {FN (arcsech), ARG(5.0e-01,5.0e-01), RES(1.0612750619050356520e0, -9.0455689430238136413e-1)},
+ {FN (arcsech), ARG(5.0e-01,-5.0e-01), RES(1.0612750619050356520e0, 9.0455689430238136413e-1)},
+ {FN (arcsech), ARG(-5.0e-01,5.0e-01), RES(1.0612750619050356520e0, -2.2370357592874118743e0)},
+ {FN (arcsech), ARG(-5.0e-01,-5.0e-01), RES(1.0612750619050356520e0, 2.2370357592874118743e0)},
+ {FN (arcsech), ARG(5.0e-01,1.0e+00), RES(7.6388434595371104541e-1, -1.2595705295501355239e0)},
+ {FN (arcsech), ARG(5.0e-01,-1.0e+00), RES(7.6388434595371104541e-1, 1.2595705295501355239e0)},
+ {FN (arcsech), ARG(-5.0e-01,1.0e+00), RES(7.6388434595371104541e-1, -1.8820221240396577146e0)},
+ {FN (arcsech), ARG(-5.0e-01,-1.0e+00), RES(7.6388434595371104541e-1, 1.8820221240396577146e0)},
+ {FN (arcsech), ARG(5.0e-01,2.0e+00), RES(4.5717847686917515748e-1, -1.4642558238421395793e0)},
+ {FN (arcsech), ARG(5.0e-01,-2.0e+00), RES(4.5717847686917515748e-1, 1.4642558238421395793e0)},
+ {FN (arcsech), ARG(-5.0e-01,2.0e+00), RES(4.5717847686917515748e-1, -1.6773368297476536591e0)},
+ {FN (arcsech), ARG(-5.0e-01,-2.0e+00), RES(4.5717847686917515748e-1, 1.6773368297476536591e0)},
+ {FN (arcsech), ARG(5.0e-01,8.3886080e+06), RES(1.1920928955078054414e-7, -1.5707963267948895138e0)},
+ {FN (arcsech), ARG(5.0e-01,-8.3886080e+06), RES(1.1920928955078054414e-7, 1.5707963267948895138e0)},
+ {FN (arcsech), ARG(-5.0e-01,8.3886080e+06), RES(1.1920928955078054414e-7, -1.5707963267949037247e0)},
+ {FN (arcsech), ARG(-5.0e-01,-8.3886080e+06), RES(1.1920928955078054414e-7, 1.5707963267949037247e0)},
+ {FN (arcsech), ARG(1.0e+00,0.0e+00), RES(0e0, 0.0)},
+ {FN (arcsech), ARG(-1.0e+00,0.0e+00), RES(0, 3.1415926535897932385e0)},
+ {FN (arcsech), ARG(1.0e+00,1.19209289550781250e-07), RES(3.4526696585164602772e-4, -3.4526700015083915182e-4)},
+ {FN (arcsech), ARG(1.0e+00,-1.19209289550781250e-07), RES(3.4526696585164602772e-4, 3.4526700015083915182e-4)},
+ {FN (arcsech), ARG(-1.0e+00,1.19209289550781250e-07), RES(3.4526696585164602772e-4, -3.1412473865896423993e0)},
+ {FN (arcsech), ARG(-1.0e+00,-1.19209289550781250e-07), RES(3.4526696585164602772e-4, 3.1412473865896423993e0)},
+ {FN (arcsech), ARG(1.0e+00,5.0e-01), RES(5.3321829058411214108e-1, -7.9770997007539188581e-1)},
+ {FN (arcsech), ARG(1.0e+00,-5.0e-01), RES(5.3321829058411214108e-1, 7.9770997007539188581e-1)},
+ {FN (arcsech), ARG(-1.0e+00,5.0e-01), RES(5.3321829058411214108e-1, -2.3438826835144013527e0)},
+ {FN (arcsech), ARG(-1.0e+00,-5.0e-01), RES(5.3321829058411214108e-1, 2.3438826835144013527e0)},
+ {FN (arcsech), ARG(1.0e+00,1.0e+00), RES(5.3063753095251782602e-1, -1.1185178796437059372e0)},
+ {FN (arcsech), ARG(1.0e+00,-1.0e+00), RES(5.3063753095251782602e-1, 1.1185178796437059372e0)},
+ {FN (arcsech), ARG(-1.0e+00,1.0e+00), RES(5.3063753095251782602e-1, -2.0230747739460873013e0)},
+ {FN (arcsech), ARG(-1.0e+00,-1.0e+00), RES(5.3063753095251782602e-1, 2.0230747739460873013e0)},
+ {FN (arcsech), ARG(1.0e+00,2.0e+00), RES(3.9656823011232897892e-1, -1.3844782726870810934e0)},
+ {FN (arcsech), ARG(1.0e+00,-2.0e+00), RES(3.9656823011232897892e-1, 1.3844782726870810934e0)},
+ {FN (arcsech), ARG(-1.0e+00,2.0e+00), RES(3.9656823011232897892e-1, -1.7571143809027121451e0)},
+ {FN (arcsech), ARG(-1.0e+00,-2.0e+00), RES(3.9656823011232897892e-1, 1.7571143809027121451e0)},
+ {FN (arcsech), ARG(1.0e+00,8.3886080e+06), RES(1.1920928955077927359e-7, -1.5707963267948824084e0)},
+ {FN (arcsech), ARG(1.0e+00,-8.3886080e+06), RES(1.1920928955077927359e-7, 1.5707963267948824084e0)},
+ {FN (arcsech), ARG(-1.0e+00,8.3886080e+06), RES(1.1920928955077927359e-7, -1.5707963267949108301e0)},
+ {FN (arcsech), ARG(-1.0e+00,-8.3886080e+06), RES(1.1920928955077927359e-7, 1.5707963267949108301e0)},
+ {FN (arcsech), ARG(2.0e+00,0.0e+00), RES(0, 1.0471975511965977462e0)},
+ {FN (arcsech), ARG(-2.0e+00,0.0e+00), RES(0, 2.0943951023931954923e0)},
+ {FN (arcsech), ARG(2.0e+00,1.19209289550781250e-07), RES(3.4412757706023621662e-8, -1.0471975511966001392e0)},
+ {FN (arcsech), ARG(2.0e+00,-1.19209289550781250e-07), RES(3.4412757706023621662e-8, 1.0471975511966001392e0)},
+ {FN (arcsech), ARG(-2.0e+00,1.19209289550781250e-07), RES(3.4412757706023621662e-8, -2.0943951023931930993e0)},
+ {FN (arcsech), ARG(-2.0e+00,-1.19209289550781250e-07), RES(3.4412757706023621662e-8, 2.0943951023931930993e0)},
+ {FN (arcsech), ARG(2.0e+00,5.0e-01), RES(1.3261586085051183885e-1, -1.0854889863215541067e0)},
+ {FN (arcsech), ARG(2.0e+00,-5.0e-01), RES(1.3261586085051183885e-1, 1.0854889863215541067e0)},
+ {FN (arcsech), ARG(-2.0e+00,5.0e-01), RES(1.3261586085051183885e-1, -2.0561036672682391317e0)},
+ {FN (arcsech), ARG(-2.0e+00,-5.0e-01), RES(1.3261586085051183885e-1, 2.0561036672682391317e0)},
+ {FN (arcsech), ARG(2.0e+00,1.0e+00), RES(2.1561241855582964497e-1, -1.1692099351270905509e0)},
+ {FN (arcsech), ARG(2.0e+00,-1.0e+00), RES(2.1561241855582964497e-1, 1.1692099351270905509e0)},
+ {FN (arcsech), ARG(-2.0e+00,1.0e+00), RES(2.1561241855582964497e-1, -1.9723827184627026875e0)},
+ {FN (arcsech), ARG(-2.0e+00,-1.0e+00), RES(2.1561241855582964497e-1, 1.9723827184627026875e0)},
+ {FN (arcsech), ARG(2.0e+00,2.0e+00), RES(2.5489557334055081773e-1, -1.3262741616593564728e0)},
+ {FN (arcsech), ARG(2.0e+00,-2.0e+00), RES(2.5489557334055081773e-1, 1.3262741616593564728e0)},
+ {FN (arcsech), ARG(-2.0e+00,2.0e+00), RES(2.5489557334055081773e-1, -1.8153184919304367657e0)},
+ {FN (arcsech), ARG(-2.0e+00,-2.0e+00), RES(2.5489557334055081773e-1, 1.8153184919304367657e0)},
+ {FN (arcsech), ARG(2.0e+00,8.3886080e+06), RES(1.1920928955077419139e-7, -1.5707963267948681975e0)},
+ {FN (arcsech), ARG(2.0e+00,-8.3886080e+06), RES(1.1920928955077419139e-7, 1.5707963267948681975e0)},
+ {FN (arcsech), ARG(-2.0e+00,8.3886080e+06), RES(1.1920928955077419139e-7, -1.5707963267949250409e0)},
+ {FN (arcsech), ARG(-2.0e+00,-8.3886080e+06), RES(1.1920928955077419139e-7, 1.5707963267949250409e0)},
+ {FN (arcsech), ARG(8.3886080e+06,0.0e+00), RES(0, 1.5707962075856070684e0)},
+ {FN (arcsech), ARG(-8.3886080e+06,0.0e+00), RES(0, 1.570796446004186170e0)},
+ {FN (arcsech), ARG(8.3886080e+06,1.19209289550781250e-07), RES(1.6940658945086127152e-21, -1.5707962075856070684e0)},
+ {FN (arcsech), ARG(8.3886080e+06,-1.19209289550781250e-07), RES(1.6940658945086127152e-21, 1.5707962075856070684e0)},
+ {FN (arcsech), ARG(-8.3886080e+06,1.19209289550781250e-07), RES(1.6940658945086127152e-21, -1.570796446004186170e0)},
+ {FN (arcsech), ARG(-8.3886080e+06,-1.19209289550781250e-07), RES(1.6940658945086127152e-21, 1.570796446004186170e0)},
+ {FN (arcsech), ARG(8.3886080e+06,5.0e-01), RES(7.1054273576010271023e-15, -1.5707962075856070685e0)},
+ {FN (arcsech), ARG(8.3886080e+06,-5.0e-01), RES(7.1054273576010271023e-15, 1.5707962075856070685e0)},
+ {FN (arcsech), ARG(-8.3886080e+06,5.0e-01), RES(7.1054273576010271023e-15, -1.570796446004186170e0)},
+ {FN (arcsech), ARG(-8.3886080e+06,-5.0e-01), RES(7.1054273576010271023e-15, 1.570796446004186170e0)},
+ {FN (arcsech), ARG(8.3886080e+06,1.0e+00), RES(1.4210854715201902743e-14, -1.5707962075856070685e0)},
+ {FN (arcsech), ARG(8.3886080e+06,-1.0e+00), RES(1.4210854715201902743e-14, 1.5707962075856070685e0)},
+ {FN (arcsech), ARG(-8.3886080e+06,1.0e+00), RES(1.4210854715201902743e-14, -1.570796446004186170e0)},
+ {FN (arcsech), ARG(-8.3886080e+06,-1.0e+00), RES(1.4210854715201902743e-14, 1.570796446004186170e0)},
+ {FN (arcsech), ARG(8.3886080e+06,2.0e+00), RES(2.8421709430402593796e-14, -1.5707962075856070685e0)},
+ {FN (arcsech), ARG(8.3886080e+06,-2.0e+00), RES(2.8421709430402593796e-14, 1.5707962075856070685e0)},
+ {FN (arcsech), ARG(-8.3886080e+06,2.0e+00), RES(2.8421709430402593796e-14, -1.570796446004186170e0)},
+ {FN (arcsech), ARG(-8.3886080e+06,-2.0e+00), RES(2.8421709430402593796e-14, 1.570796446004186170e0)},
+ {FN (arcsech), ARG(8.3886080e+06,8.3886080e+06), RES(5.9604644775390695586e-8, -1.5707962671902518438e0)},
+ {FN (arcsech), ARG(8.3886080e+06,-8.3886080e+06), RES(5.9604644775390695586e-8, 1.5707962671902518438e0)},
+ {FN (arcsech), ARG(-8.3886080e+06,8.3886080e+06), RES(5.9604644775390695586e-8, -1.5707963863995413946e0)},
+ {FN (arcsech), ARG(-8.3886080e+06,-8.3886080e+06), RES(5.9604644775390695586e-8, 1.5707963863995413946e0)},
+ {FN (arccoth), ARG(0.0e+00,1.19209289550781250e-07), RES(0, -1.5707962075856070685e0)},
+ {FN (arccoth), ARG(0.0e+00,-1.19209289550781250e-07), RES(0, 1.5707962075856070685e0)},
+ {FN (arccoth), ARG(0.0e+00,5.0e-01), RES(0, -1.1071487177940905030e0)},
+ {FN (arccoth), ARG(0.0e+00,-5.0e-01), RES(0, 1.1071487177940905030e0)},
+ {FN (arccoth), ARG(0.0e+00,1.0e+00), RES(0, -7.8539816339744830962e-1)},
+ {FN (arccoth), ARG(0.0e+00,-1.0e+00), RES(0, 7.8539816339744830962e-1)},
+ {FN (arccoth), ARG(0.0e+00,2.0e+00), RES(0, -4.6364760900080611621e-1)},
+ {FN (arccoth), ARG(0.0e+00,-2.0e+00), RES(0, 4.6364760900080611621e-1)},
+ {FN (arccoth), ARG(0.0e+00,8.3886080e+06), RES(0, -1.1920928955078068531e-7)},
+ {FN (arccoth), ARG(0.0e+00,-8.3886080e+06), RES(0, 1.1920928955078068531e-7)},
+ {FN (arccoth), ARG(1.19209289550781250e-07,0.0e+00), RES(1.1920928955078181469e-7, -1.5707963267948966192e0)},
+ {FN (arccoth), ARG(-1.19209289550781250e-07,0.0e+00), RES(-1.1920928955078181469e-7, 1.5707963267948966192e0)},
+ {FN (arccoth), ARG(1.19209289550781250e-07,1.19209289550781250e-07), RES(1.1920928955078012062e-7, -1.5707962075856070684e0)},
+ {FN (arccoth), ARG(1.19209289550781250e-07,-1.19209289550781250e-07), RES(1.1920928955078012062e-7, 1.5707962075856070684e0)},
+ {FN (arccoth), ARG(-1.19209289550781250e-07,1.19209289550781250e-07), RES(-1.1920928955078012062e-7, -1.5707962075856070684e0)},
+ {FN (arccoth), ARG(-1.19209289550781250e-07,-1.19209289550781250e-07), RES(-1.1920928955078012062e-7, 1.5707962075856070684e0)},
+ {FN (arccoth), ARG(1.19209289550781250e-07,5.0e-01), RES(9.5367431640625072280e-8, -1.1071487177940859555e0)},
+ {FN (arccoth), ARG(1.19209289550781250e-07,-5.0e-01), RES(9.5367431640625072280e-8, 1.1071487177940859555e0)},
+ {FN (arccoth), ARG(-1.19209289550781250e-07,5.0e-01), RES(-9.5367431640625072280e-8, -1.1071487177940859555e0)},
+ {FN (arccoth), ARG(-1.19209289550781250e-07,-5.0e-01), RES(-9.5367431640625072280e-8, 1.1071487177940859555e0)},
+ {FN (arccoth), ARG(1.19209289550781250e-07,1.0e+00), RES(5.9604644775390483828e-8, -7.8539816339744475690e-1)},
+ {FN (arccoth), ARG(1.19209289550781250e-07,-1.0e+00), RES(5.9604644775390483828e-8, 7.8539816339744475690e-1)},
+ {FN (arccoth), ARG(-1.19209289550781250e-07,1.0e+00), RES(-5.9604644775390483828e-8, -7.8539816339744475690e-1)},
+ {FN (arccoth), ARG(-1.19209289550781250e-07,-1.0e+00), RES(-5.9604644775390483828e-8, 7.8539816339744475690e-1)},
+ {FN (arccoth), ARG(1.19209289550781250e-07,2.0e+00), RES(2.3841857910156200307e-8, -4.6364760900080497935e-1)},
+ {FN (arccoth), ARG(1.19209289550781250e-07,-2.0e+00), RES(2.3841857910156200307e-8, 4.6364760900080497935e-1)},
+ {FN (arccoth), ARG(-1.19209289550781250e-07,2.0e+00), RES(-2.3841857910156200307e-8, -4.6364760900080497935e-1)},
+ {FN (arccoth), ARG(-1.19209289550781250e-07,-2.0e+00), RES(-2.3841857910156200307e-8, 4.6364760900080497935e-1)},
+ {FN (arccoth), ARG(1.19209289550781250e-07,8.3886080e+06), RES(1.6940658945085766040e-21, -1.1920928955078068531e-7)},
+ {FN (arccoth), ARG(1.19209289550781250e-07,-8.3886080e+06), RES(1.6940658945085766040e-21, 1.1920928955078068531e-7)},
+ {FN (arccoth), ARG(-1.19209289550781250e-07,8.3886080e+06), RES(-1.6940658945085766040e-21, -1.1920928955078068531e-7)},
+ {FN (arccoth), ARG(-1.19209289550781250e-07,-8.3886080e+06), RES(-1.6940658945085766040e-21, 1.1920928955078068531e-7)},
+ {FN (arccoth), ARG(5.0e-01,0.0e+00), RES(5.4930614433405484570e-1, -1.5707963267948966192e0)},
+ {FN (arccoth), ARG(-5.0e-01,0.0e+00), RES(-5.4930614433405484570e-1, 1.5707963267948966192e0)},
+ {FN (arccoth), ARG(5.0e-01,1.19209289550781250e-07), RES(5.4930614433404221383e-1, -1.5707961678491772182e0)},
+ {FN (arccoth), ARG(5.0e-01,-1.19209289550781250e-07), RES(5.4930614433404221383e-1, 1.5707961678491772182e0)},
+ {FN (arccoth), ARG(-5.0e-01,1.19209289550781250e-07), RES(-5.4930614433404221383e-1, -1.5707961678491772182e0)},
+ {FN (arccoth), ARG(-5.0e-01,-1.19209289550781250e-07), RES(-5.4930614433404221383e-1, 1.5707961678491772182e0)},
+ {FN (arccoth), ARG(5.0e-01,5.0e-01), RES(4.0235947810852509365e-1, -1.0172219678978513677e0)},
+ {FN (arccoth), ARG(5.0e-01,-5.0e-01), RES(4.0235947810852509365e-1, 1.0172219678978513677e0)},
+ {FN (arccoth), ARG(-5.0e-01,5.0e-01), RES(-4.0235947810852509365e-1, -1.0172219678978513677e0)},
+ {FN (arccoth), ARG(-5.0e-01,-5.0e-01), RES(-4.0235947810852509365e-1, 1.0172219678978513677e0)},
+ {FN (arccoth), ARG(5.0e-01,1.0e+00), RES(2.3887786125685909036e-1, -7.2322066612406759210e-1)},
+ {FN (arccoth), ARG(5.0e-01,-1.0e+00), RES(2.3887786125685909036e-1, 7.2322066612406759210e-1)},
+ {FN (arccoth), ARG(-5.0e-01,1.0e+00), RES(-2.3887786125685909036e-1, -7.2322066612406759210e-1)},
+ {FN (arccoth), ARG(-5.0e-01,-1.0e+00), RES(-2.3887786125685909036e-1, 7.2322066612406759210e-1)},
+ {FN (arccoth), ARG(5.0e-01,2.0e+00), RES(9.6415620202996167238e-2, -4.4423988596007427049e-1)},
+ {FN (arccoth), ARG(5.0e-01,-2.0e+00), RES(9.6415620202996167238e-2, 4.4423988596007427049e-1)},
+ {FN (arccoth), ARG(-5.0e-01,2.0e+00), RES(-9.6415620202996167238e-2, -4.4423988596007427049e-1)},
+ {FN (arccoth), ARG(-5.0e-01,-2.0e+00), RES(-9.6415620202996167238e-2, 4.4423988596007427049e-1)},
+ {FN (arccoth), ARG(5.0e-01,8.3886080e+06), RES(7.1054273576008756410e-15, -1.1920928955078026179e-7)},
+ {FN (arccoth), ARG(5.0e-01,-8.3886080e+06), RES(7.1054273576008756410e-15, 1.1920928955078026179e-7)},
+ {FN (arccoth), ARG(-5.0e-01,8.3886080e+06), RES(-7.1054273576008756410e-15, -1.1920928955078026179e-7)},
+ {FN (arccoth), ARG(-5.0e-01,-8.3886080e+06), RES(-7.1054273576008756410e-15, 1.1920928955078026179e-7)},
+ {FN (arccoth), ARG(1.0e+00,1.19209289550781250e-07), RES(8.3177661667193446012e0, -7.8539813359512592192e-1)},
+ {FN (arccoth), ARG(1.0e+00,-1.19209289550781250e-07), RES(8.3177661667193446012e0, 7.8539813359512592192e-1)},
+ {FN (arccoth), ARG(-1.0e+00,1.19209289550781250e-07), RES(-8.3177661667193446012e0, -7.8539813359512592192e-1)},
+ {FN (arccoth), ARG(-1.0e+00,-1.19209289550781250e-07), RES(-8.3177661667193446012e0, 7.8539813359512592192e-1)},
+ {FN (arccoth), ARG(1.0e+00,5.0e-01), RES(7.0830333601405402006e-1, -6.6290883183401623253e-1)},
+ {FN (arccoth), ARG(1.0e+00,-5.0e-01), RES(7.0830333601405402006e-1, 6.6290883183401623253e-1)},
+ {FN (arccoth), ARG(-1.0e+00,5.0e-01), RES(-7.0830333601405402006e-1, -6.6290883183401623253e-1)},
+ {FN (arccoth), ARG(-1.0e+00,-5.0e-01), RES(-7.0830333601405402006e-1, 6.6290883183401623253e-1)},
+ {FN (arccoth), ARG(1.0e+00,1.0e+00), RES(4.0235947810852509365e-1, -5.5357435889704525151e-1)},
+ {FN (arccoth), ARG(1.0e+00,-1.0e+00), RES(4.0235947810852509365e-1, 5.5357435889704525151e-1)},
+ {FN (arccoth), ARG(-1.0e+00,1.0e+00), RES(-4.0235947810852509365e-1, -5.5357435889704525151e-1)},
+ {FN (arccoth), ARG(-1.0e+00,-1.0e+00), RES(-4.0235947810852509365e-1, 5.5357435889704525151e-1)},
+ {FN (arccoth), ARG(1.0e+00,2.0e+00), RES(1.7328679513998632735e-1, -3.9269908169872415481e-1)},
+ {FN (arccoth), ARG(1.0e+00,-2.0e+00), RES(1.7328679513998632735e-1, 3.9269908169872415481e-1)},
+ {FN (arccoth), ARG(-1.0e+00,2.0e+00), RES(-1.7328679513998632735e-1, -3.9269908169872415481e-1)},
+ {FN (arccoth), ARG(-1.0e+00,-2.0e+00), RES(-1.7328679513998632735e-1, 3.9269908169872415481e-1)},
+ {FN (arccoth), ARG(1.0e+00,8.3886080e+06), RES(1.4210854715201599821e-14, -1.1920928955077899125e-7)},
+ {FN (arccoth), ARG(1.0e+00,-8.3886080e+06), RES(1.4210854715201599821e-14, 1.1920928955077899125e-7)},
+ {FN (arccoth), ARG(-1.0e+00,8.3886080e+06), RES(-1.4210854715201599821e-14, -1.1920928955077899125e-7)},
+ {FN (arccoth), ARG(-1.0e+00,-8.3886080e+06), RES(-1.4210854715201599821e-14, 1.1920928955077899125e-7)},
+ {FN (arccoth), ARG(2.0e+00,0.0e+00), RES(5.4930614433405484570e-1, 0.0)},
+ {FN (arccoth), ARG(-2.0e+00,0.0e+00), RES(-5.4930614433405484570e-1, 0.0)},
+ {FN (arccoth), ARG(2.0e+00,1.19209289550781250e-07), RES(5.4930614433405168773e-1, -3.9736429850260144780e-8)},
+ {FN (arccoth), ARG(2.0e+00,-1.19209289550781250e-07), RES(5.4930614433405168773e-1, 3.9736429850260144780e-8)},
+ {FN (arccoth), ARG(-2.0e+00,1.19209289550781250e-07), RES(-5.4930614433405168773e-1, -3.9736429850260144780e-8)},
+ {FN (arccoth), ARG(-2.0e+00,-1.19209289550781250e-07), RES(-5.4930614433405168773e-1, 3.9736429850260144780e-8)},
+ {FN (arccoth), ARG(2.0e+00,5.0e-01), RES(5.0037000005253101744e-1, -1.4924946579308963897e-1)},
+ {FN (arccoth), ARG(2.0e+00,-5.0e-01), RES(5.0037000005253101744e-1, 1.4924946579308963897e-1)},
+ {FN (arccoth), ARG(-2.0e+00,5.0e-01), RES(-5.0037000005253101744e-1, -1.4924946579308963897e-1)},
+ {FN (arccoth), ARG(-2.0e+00,-5.0e-01), RES(-5.0037000005253101744e-1, 1.4924946579308963897e-1)},
+ {FN (arccoth), ARG(2.0e+00,1.0e+00), RES(4.0235947810852509365e-1, -2.3182380450040305811e-1)},
+ {FN (arccoth), ARG(2.0e+00,-1.0e+00), RES(4.0235947810852509365e-1, 2.3182380450040305811e-1)},
+ {FN (arccoth), ARG(-2.0e+00,1.0e+00), RES(-4.0235947810852509365e-1, -2.3182380450040305811e-1)},
+ {FN (arccoth), ARG(-2.0e+00,-1.0e+00), RES(-4.0235947810852509365e-1, 2.3182380450040305811e-1)},
+ {FN (arccoth), ARG(2.0e+00,2.0e+00), RES(2.3887786125685909036e-1, -2.5957305712326147589e-1)},
+ {FN (arccoth), ARG(2.0e+00,-2.0e+00), RES(2.3887786125685909036e-1, 2.5957305712326147589e-1)},
+ {FN (arccoth), ARG(-2.0e+00,2.0e+00), RES(-2.3887786125685909036e-1, -2.5957305712326147589e-1)},
+ {FN (arccoth), ARG(-2.0e+00,-2.0e+00), RES(-2.3887786125685909036e-1, 2.5957305712326147589e-1)},
+ {FN (arccoth), ARG(2.0e+00,8.3886080e+06), RES(2.8421709430401987951e-14, -1.1920928955077390905e-7)},
+ {FN (arccoth), ARG(2.0e+00,-8.3886080e+06), RES(2.8421709430401987951e-14, 1.1920928955077390905e-7)},
+ {FN (arccoth), ARG(-2.0e+00,8.3886080e+06), RES(-2.8421709430401987951e-14, -1.1920928955077390905e-7)},
+ {FN (arccoth), ARG(-2.0e+00,-8.3886080e+06), RES(-2.8421709430401987951e-14, 1.1920928955077390905e-7)},
+ {FN (arccoth), ARG(8.3886080e+06,0.0e+00), RES(1.1920928955078181469e-7, 0.0)},
+ {FN (arccoth), ARG(-8.3886080e+06,0.0e+00), RES(-1.1920928955078181469e-7, 0.0)},
+ {FN (arccoth), ARG(8.3886080e+06,1.19209289550781250e-07), RES(1.1920928955078181469e-7, -1.6940658945086247523e-21)},
+ {FN (arccoth), ARG(8.3886080e+06,-1.19209289550781250e-07), RES(1.1920928955078181469e-7, 1.6940658945086247523e-21)},
+ {FN (arccoth), ARG(-8.3886080e+06,1.19209289550781250e-07), RES(-1.1920928955078181469e-7, -1.6940658945086247523e-21)},
+ {FN (arccoth), ARG(-8.3886080e+06,-1.19209289550781250e-07), RES(-1.1920928955078181469e-7, 1.6940658945086247523e-21)},
+ {FN (arccoth), ARG(8.3886080e+06,5.0e-01), RES(1.1920928955078139117e-7, -7.1054273576010775894e-15)},
+ {FN (arccoth), ARG(8.3886080e+06,-5.0e-01), RES(1.1920928955078139117e-7, 7.1054273576010775894e-15)},
+ {FN (arccoth), ARG(-8.3886080e+06,5.0e-01), RES(-1.1920928955078139117e-7, -7.1054273576010775894e-15)},
+ {FN (arccoth), ARG(-8.3886080e+06,-5.0e-01), RES(-1.1920928955078139117e-7, 7.1054273576010775894e-15)},
+ {FN (arccoth), ARG(8.3886080e+06,1.0e+00), RES(1.1920928955078012062e-7, -1.4210854715202003717e-14)},
+ {FN (arccoth), ARG(8.3886080e+06,-1.0e+00), RES(1.1920928955078012062e-7, 1.4210854715202003717e-14)},
+ {FN (arccoth), ARG(-8.3886080e+06,1.0e+00), RES(-1.1920928955078012062e-7, -1.4210854715202003717e-14)},
+ {FN (arccoth), ARG(-8.3886080e+06,-1.0e+00), RES(-1.1920928955078012062e-7, 1.4210854715202003717e-14)},
+ {FN (arccoth), ARG(8.3886080e+06,2.0e+00), RES(1.1920928955077503843e-7, -2.8421709430402795744e-14)},
+ {FN (arccoth), ARG(8.3886080e+06,-2.0e+00), RES(1.1920928955077503843e-7, 2.8421709430402795744e-14)},
+ {FN (arccoth), ARG(-8.3886080e+06,2.0e+00), RES(-1.1920928955077503843e-7, -2.8421709430402795744e-14)},
+ {FN (arccoth), ARG(-8.3886080e+06,-2.0e+00), RES(-1.1920928955077503843e-7, 2.8421709430402795744e-14)},
+ {FN (arccoth), ARG(8.3886080e+06,8.3886080e+06), RES(5.9604644775390483828e-8, -5.9604644775390766172e-8)},
+ {FN (arccoth), ARG(8.3886080e+06,-8.3886080e+06), RES(5.9604644775390483828e-8, 5.9604644775390766172e-8)},
+ {FN (arccoth), ARG(-8.3886080e+06,8.3886080e+06), RES(-5.9604644775390483828e-8, -5.9604644775390766172e-8)},
+ {FN (arccoth), ARG(-8.3886080e+06,-8.3886080e+06), RES(-5.9604644775390483828e-8, 5.9604644775390766172e-8)},
diff --git a/gsl-1.9/complex/results1.h b/gsl-1.9/complex/results1.h
new file mode 100644
index 0000000..7641944
--- /dev/null
+++ b/gsl-1.9/complex/results1.h
@@ -0,0 +1,583 @@
+ {FN (arg), ARG(0.0e+00,0.0e+00), RES(0e0, 0.0)},
+ {FN (arg), ARG(0.0e+00,1.19209289550781250e-07), RES(1.5707963267948966192e0, 0.0)},
+ {FN (arg), ARG(0.0e+00,-1.19209289550781250e-07), RES(-1.5707963267948966192e0, 0.0)},
+ {FN (arg), ARG(0.0e+00,5.0e-01), RES(1.5707963267948966192e0, 0.0)},
+ {FN (arg), ARG(0.0e+00,-5.0e-01), RES(-1.5707963267948966192e0, 0.0)},
+ {FN (arg), ARG(0.0e+00,1.0e+00), RES(1.5707963267948966192e0, 0.0)},
+ {FN (arg), ARG(0.0e+00,-1.0e+00), RES(-1.5707963267948966192e0, 0.0)},
+ {FN (arg), ARG(0.0e+00,2.0e+00), RES(1.5707963267948966192e0, 0.0)},
+ {FN (arg), ARG(0.0e+00,-2.0e+00), RES(-1.5707963267948966192e0, 0.0)},
+ {FN (arg), ARG(0.0e+00,8.3886080e+06), RES(1.5707963267948966192e0, 0.0)},
+ {FN (arg), ARG(0.0e+00,-8.3886080e+06), RES(-1.5707963267948966192e0, 0.0)},
+ {FN (arg), ARG(1.19209289550781250e-07,0.0e+00), RES(0e0, 0.0)},
+ {FN (arg), ARG(-1.19209289550781250e-07,0.0e+00), RES(3.1415926535897932385e0, 0.0)},
+ {FN (arg), ARG(1.19209289550781250e-07,1.19209289550781250e-07), RES(7.8539816339744830962e-1, 0.0)},
+ {FN (arg), ARG(1.19209289550781250e-07,-1.19209289550781250e-07), RES(-7.8539816339744830962e-1, 0.0)},
+ {FN (arg), ARG(-1.19209289550781250e-07,1.19209289550781250e-07), RES(2.3561944901923449288e0, 0.0)},
+ {FN (arg), ARG(-1.19209289550781250e-07,-1.19209289550781250e-07), RES(-2.3561944901923449288e0, 0.0)},
+ {FN (arg), ARG(1.19209289550781250e-07,5.0e-01), RES(1.5707960883763175177e0, 0.0)},
+ {FN (arg), ARG(1.19209289550781250e-07,-5.0e-01), RES(-1.5707960883763175177e0, 0.0)},
+ {FN (arg), ARG(-1.19209289550781250e-07,5.0e-01), RES(1.5707965652134757208e0, 0.0)},
+ {FN (arg), ARG(-1.19209289550781250e-07,-5.0e-01), RES(-1.5707965652134757208e0, 0.0)},
+ {FN (arg), ARG(1.19209289550781250e-07,1.0e+00), RES(1.5707962075856070685e0, 0.0)},
+ {FN (arg), ARG(1.19209289550781250e-07,-1.0e+00), RES(-1.5707962075856070685e0, 0.0)},
+ {FN (arg), ARG(-1.19209289550781250e-07,1.0e+00), RES(1.570796446004186170e0, 0.0)},
+ {FN (arg), ARG(-1.19209289550781250e-07,-1.0e+00), RES(-1.570796446004186170e0, 0.0)},
+ {FN (arg), ARG(1.19209289550781250e-07,2.0e+00), RES(1.5707962671902518438e0, 0.0)},
+ {FN (arg), ARG(1.19209289550781250e-07,-2.0e+00), RES(-1.5707962671902518438e0, 0.0)},
+ {FN (arg), ARG(-1.19209289550781250e-07,2.0e+00), RES(1.5707963863995413946e0, 0.0)},
+ {FN (arg), ARG(-1.19209289550781250e-07,-2.0e+00), RES(-1.5707963863995413946e0, 0.0)},
+ {FN (arg), ARG(1.19209289550781250e-07,8.3886080e+06), RES(1.5707963267948824084e0, 0.0)},
+ {FN (arg), ARG(1.19209289550781250e-07,-8.3886080e+06), RES(-1.5707963267948824084e0, 0.0)},
+ {FN (arg), ARG(-1.19209289550781250e-07,8.3886080e+06), RES(1.5707963267949108301e0, 0.0)},
+ {FN (arg), ARG(-1.19209289550781250e-07,-8.3886080e+06), RES(-1.5707963267949108301e0, 0.0)},
+ {FN (arg), ARG(5.0e-01,0.0e+00), RES(0e0, 0.0)},
+ {FN (arg), ARG(-5.0e-01,0.0e+00), RES(3.1415926535897932385e0, 0.0)},
+ {FN (arg), ARG(5.0e-01,1.19209289550781250e-07), RES(2.3841857910155798249e-7, 0.0)},
+ {FN (arg), ARG(5.0e-01,-1.19209289550781250e-07), RES(-2.3841857910155798249e-7, 0.0)},
+ {FN (arg), ARG(-5.0e-01,1.19209289550781250e-07), RES(3.1415924151712141369e0, 0.0)},
+ {FN (arg), ARG(-5.0e-01,-1.19209289550781250e-07), RES(-3.1415924151712141369e0, 0.0)},
+ {FN (arg), ARG(5.0e-01,5.0e-01), RES(7.8539816339744830962e-1, 0.0)},
+ {FN (arg), ARG(5.0e-01,-5.0e-01), RES(-7.8539816339744830962e-1, 0.0)},
+ {FN (arg), ARG(-5.0e-01,5.0e-01), RES(2.3561944901923449288e0, 0.0)},
+ {FN (arg), ARG(-5.0e-01,-5.0e-01), RES(-2.3561944901923449288e0, 0.0)},
+ {FN (arg), ARG(5.0e-01,1.0e+00), RES(1.1071487177940905030e0, 0.0)},
+ {FN (arg), ARG(5.0e-01,-1.0e+00), RES(-1.1071487177940905030e0, 0.0)},
+ {FN (arg), ARG(-5.0e-01,1.0e+00), RES(2.0344439357957027354e0, 0.0)},
+ {FN (arg), ARG(-5.0e-01,-1.0e+00), RES(-2.0344439357957027354e0, 0.0)},
+ {FN (arg), ARG(5.0e-01,2.0e+00), RES(1.3258176636680324651e0, 0.0)},
+ {FN (arg), ARG(5.0e-01,-2.0e+00), RES(-1.3258176636680324651e0, 0.0)},
+ {FN (arg), ARG(-5.0e-01,2.0e+00), RES(1.8157749899217607734e0, 0.0)},
+ {FN (arg), ARG(-5.0e-01,-2.0e+00), RES(-1.8157749899217607734e0, 0.0)},
+ {FN (arg), ARG(5.0e-01,8.3886080e+06), RES(1.5707962671902518438e0, 0.0)},
+ {FN (arg), ARG(5.0e-01,-8.3886080e+06), RES(-1.5707962671902518438e0, 0.0)},
+ {FN (arg), ARG(-5.0e-01,8.3886080e+06), RES(1.5707963863995413946e0, 0.0)},
+ {FN (arg), ARG(-5.0e-01,-8.3886080e+06), RES(-1.5707963863995413946e0, 0.0)},
+ {FN (arg), ARG(1.0e+00,0.0e+00), RES(0e0, 0.0)},
+ {FN (arg), ARG(-1.0e+00,0.0e+00), RES(3.1415926535897932385e0, 0.0)},
+ {FN (arg), ARG(1.0e+00,1.19209289550781250e-07), RES(1.1920928955078068531e-7, 0.0)},
+ {FN (arg), ARG(1.0e+00,-1.19209289550781250e-07), RES(-1.1920928955078068531e-7, 0.0)},
+ {FN (arg), ARG(-1.0e+00,1.19209289550781250e-07), RES(3.1415925343805036877e0, 0.0)},
+ {FN (arg), ARG(-1.0e+00,-1.19209289550781250e-07), RES(-3.1415925343805036877e0, 0.0)},
+ {FN (arg), ARG(1.0e+00,5.0e-01), RES(4.6364760900080611621e-1, 0.0)},
+ {FN (arg), ARG(1.0e+00,-5.0e-01), RES(-4.6364760900080611621e-1, 0.0)},
+ {FN (arg), ARG(-1.0e+00,5.0e-01), RES(2.6779450445889871222e0, 0.0)},
+ {FN (arg), ARG(-1.0e+00,-5.0e-01), RES(-2.6779450445889871222e0, 0.0)},
+ {FN (arg), ARG(1.0e+00,1.0e+00), RES(7.8539816339744830962e-1, 0.0)},
+ {FN (arg), ARG(1.0e+00,-1.0e+00), RES(-7.8539816339744830962e-1, 0.0)},
+ {FN (arg), ARG(-1.0e+00,1.0e+00), RES(2.3561944901923449288e0, 0.0)},
+ {FN (arg), ARG(-1.0e+00,-1.0e+00), RES(-2.3561944901923449288e0, 0.0)},
+ {FN (arg), ARG(1.0e+00,2.0e+00), RES(1.1071487177940905030e0, 0.0)},
+ {FN (arg), ARG(1.0e+00,-2.0e+00), RES(-1.1071487177940905030e0, 0.0)},
+ {FN (arg), ARG(-1.0e+00,2.0e+00), RES(2.0344439357957027354e0, 0.0)},
+ {FN (arg), ARG(-1.0e+00,-2.0e+00), RES(-2.0344439357957027354e0, 0.0)},
+ {FN (arg), ARG(1.0e+00,8.3886080e+06), RES(1.5707962075856070685e0, 0.0)},
+ {FN (arg), ARG(1.0e+00,-8.3886080e+06), RES(-1.5707962075856070685e0, 0.0)},
+ {FN (arg), ARG(-1.0e+00,8.3886080e+06), RES(1.570796446004186170e0, 0.0)},
+ {FN (arg), ARG(-1.0e+00,-8.3886080e+06), RES(-1.570796446004186170e0, 0.0)},
+ {FN (arg), ARG(2.0e+00,0.0e+00), RES(0e0, 0.0)},
+ {FN (arg), ARG(-2.0e+00,0.0e+00), RES(3.1415926535897932385e0, 0.0)},
+ {FN (arg), ARG(2.0e+00,1.19209289550781250e-07), RES(5.9604644775390554414e-8, 0.0)},
+ {FN (arg), ARG(2.0e+00,-1.19209289550781250e-07), RES(-5.9604644775390554414e-8, 0.0)},
+ {FN (arg), ARG(-2.0e+00,1.19209289550781250e-07), RES(3.1415925939851484631e0, 0.0)},
+ {FN (arg), ARG(-2.0e+00,-1.19209289550781250e-07), RES(-3.1415925939851484631e0, 0.0)},
+ {FN (arg), ARG(2.0e+00,5.0e-01), RES(2.4497866312686415417e-1, 0.0)},
+ {FN (arg), ARG(2.0e+00,-5.0e-01), RES(-2.4497866312686415417e-1, 0.0)},
+ {FN (arg), ARG(-2.0e+00,5.0e-01), RES(2.8966139904629290843e0, 0.0)},
+ {FN (arg), ARG(-2.0e+00,-5.0e-01), RES(-2.8966139904629290843e0, 0.0)},
+ {FN (arg), ARG(2.0e+00,1.0e+00), RES(4.6364760900080611621e-1, 0.0)},
+ {FN (arg), ARG(2.0e+00,-1.0e+00), RES(-4.6364760900080611621e-1, 0.0)},
+ {FN (arg), ARG(-2.0e+00,1.0e+00), RES(2.6779450445889871222e0, 0.0)},
+ {FN (arg), ARG(-2.0e+00,-1.0e+00), RES(-2.6779450445889871222e0, 0.0)},
+ {FN (arg), ARG(2.0e+00,2.0e+00), RES(7.8539816339744830962e-1, 0.0)},
+ {FN (arg), ARG(2.0e+00,-2.0e+00), RES(-7.8539816339744830962e-1, 0.0)},
+ {FN (arg), ARG(-2.0e+00,2.0e+00), RES(2.3561944901923449288e0, 0.0)},
+ {FN (arg), ARG(-2.0e+00,-2.0e+00), RES(-2.3561944901923449288e0, 0.0)},
+ {FN (arg), ARG(2.0e+00,8.3886080e+06), RES(1.5707960883763175177e0, 0.0)},
+ {FN (arg), ARG(2.0e+00,-8.3886080e+06), RES(-1.5707960883763175177e0, 0.0)},
+ {FN (arg), ARG(-2.0e+00,8.3886080e+06), RES(1.5707965652134757208e0, 0.0)},
+ {FN (arg), ARG(-2.0e+00,-8.3886080e+06), RES(-1.5707965652134757208e0, 0.0)},
+ {FN (arg), ARG(8.3886080e+06,0.0e+00), RES(0e0, 0.0)},
+ {FN (arg), ARG(-8.3886080e+06,0.0e+00), RES(3.1415926535897932385e0, 0.0)},
+ {FN (arg), ARG(8.3886080e+06,1.19209289550781250e-07), RES(1.4210854715202003717e-14, 0.0)},
+ {FN (arg), ARG(8.3886080e+06,-1.19209289550781250e-07), RES(-1.4210854715202003717e-14, 0.0)},
+ {FN (arg), ARG(-8.3886080e+06,1.19209289550781250e-07), RES(3.1415926535897790276e0, 0.0)},
+ {FN (arg), ARG(-8.3886080e+06,-1.19209289550781250e-07), RES(-3.1415926535897790276e0, 0.0)},
+ {FN (arg), ARG(8.3886080e+06,5.0e-01), RES(5.9604644775390554414e-8, 0.0)},
+ {FN (arg), ARG(8.3886080e+06,-5.0e-01), RES(-5.9604644775390554414e-8, 0.0)},
+ {FN (arg), ARG(-8.3886080e+06,5.0e-01), RES(3.1415925939851484631e0, 0.0)},
+ {FN (arg), ARG(-8.3886080e+06,-5.0e-01), RES(-3.1415925939851484631e0, 0.0)},
+ {FN (arg), ARG(8.3886080e+06,1.0e+00), RES(1.1920928955078068531e-7, 0.0)},
+ {FN (arg), ARG(8.3886080e+06,-1.0e+00), RES(-1.1920928955078068531e-7, 0.0)},
+ {FN (arg), ARG(-8.3886080e+06,1.0e+00), RES(3.1415925343805036877e0, 0.0)},
+ {FN (arg), ARG(-8.3886080e+06,-1.0e+00), RES(-3.1415925343805036877e0, 0.0)},
+ {FN (arg), ARG(8.3886080e+06,2.0e+00), RES(2.3841857910155798249e-7, 0.0)},
+ {FN (arg), ARG(8.3886080e+06,-2.0e+00), RES(-2.3841857910155798249e-7, 0.0)},
+ {FN (arg), ARG(-8.3886080e+06,2.0e+00), RES(3.1415924151712141369e0, 0.0)},
+ {FN (arg), ARG(-8.3886080e+06,-2.0e+00), RES(-3.1415924151712141369e0, 0.0)},
+ {FN (arg), ARG(8.3886080e+06,8.3886080e+06), RES(7.8539816339744830962e-1, 0.0)},
+ {FN (arg), ARG(8.3886080e+06,-8.3886080e+06), RES(-7.8539816339744830962e-1, 0.0)},
+ {FN (arg), ARG(-8.3886080e+06,8.3886080e+06), RES(2.3561944901923449288e0, 0.0)},
+ {FN (arg), ARG(-8.3886080e+06,-8.3886080e+06), RES(-2.3561944901923449288e0, 0.0)},
+ {FN (abs), ARG(0.0e+00,0.0e+00), RES(0e0, 0.0)},
+ {FN (abs), ARG(0.0e+00,1.19209289550781250e-07), RES(1.1920928955078125e-7, 0.0)},
+ {FN (abs), ARG(0.0e+00,-1.19209289550781250e-07), RES(1.1920928955078125e-7, 0.0)},
+ {FN (abs), ARG(0.0e+00,5.0e-01), RES(5e-1, 0.0)},
+ {FN (abs), ARG(0.0e+00,-5.0e-01), RES(5e-1, 0.0)},
+ {FN (abs), ARG(0.0e+00,1.0e+00), RES(1e0, 0.0)},
+ {FN (abs), ARG(0.0e+00,-1.0e+00), RES(1e0, 0.0)},
+ {FN (abs), ARG(0.0e+00,2.0e+00), RES(2e0, 0.0)},
+ {FN (abs), ARG(0.0e+00,-2.0e+00), RES(2e0, 0.0)},
+ {FN (abs), ARG(0.0e+00,8.3886080e+06), RES(8.388608e6, 0.0)},
+ {FN (abs), ARG(0.0e+00,-8.3886080e+06), RES(8.388608e6, 0.0)},
+ {FN (abs), ARG(1.19209289550781250e-07,0.0e+00), RES(1.1920928955078125e-7, 0.0)},
+ {FN (abs), ARG(-1.19209289550781250e-07,0.0e+00), RES(1.1920928955078125e-7, 0.0)},
+ {FN (abs), ARG(1.19209289550781250e-07,1.19209289550781250e-07), RES(1.6858739404357612715e-7, 0.0)},
+ {FN (abs), ARG(1.19209289550781250e-07,-1.19209289550781250e-07), RES(1.6858739404357612715e-7, 0.0)},
+ {FN (abs), ARG(-1.19209289550781250e-07,1.19209289550781250e-07), RES(1.6858739404357612715e-7, 0.0)},
+ {FN (abs), ARG(-1.19209289550781250e-07,-1.19209289550781250e-07), RES(1.6858739404357612715e-7, 0.0)},
+ {FN (abs), ARG(1.19209289550781250e-07,5.0e-01), RES(5.0000000000001421085e-1, 0.0)},
+ {FN (abs), ARG(1.19209289550781250e-07,-5.0e-01), RES(5.0000000000001421085e-1, 0.0)},
+ {FN (abs), ARG(-1.19209289550781250e-07,5.0e-01), RES(5.0000000000001421085e-1, 0.0)},
+ {FN (abs), ARG(-1.19209289550781250e-07,-5.0e-01), RES(5.0000000000001421085e-1, 0.0)},
+ {FN (abs), ARG(1.19209289550781250e-07,1.0e+00), RES(1.0000000000000071054e0, 0.0)},
+ {FN (abs), ARG(1.19209289550781250e-07,-1.0e+00), RES(1.0000000000000071054e0, 0.0)},
+ {FN (abs), ARG(-1.19209289550781250e-07,1.0e+00), RES(1.0000000000000071054e0, 0.0)},
+ {FN (abs), ARG(-1.19209289550781250e-07,-1.0e+00), RES(1.0000000000000071054e0, 0.0)},
+ {FN (abs), ARG(1.19209289550781250e-07,2.0e+00), RES(2.0000000000000035527e0, 0.0)},
+ {FN (abs), ARG(1.19209289550781250e-07,-2.0e+00), RES(2.0000000000000035527e0, 0.0)},
+ {FN (abs), ARG(-1.19209289550781250e-07,2.0e+00), RES(2.0000000000000035527e0, 0.0)},
+ {FN (abs), ARG(-1.19209289550781250e-07,-2.0e+00), RES(2.0000000000000035527e0, 0.0)},
+ {FN (abs), ARG(1.19209289550781250e-07,8.3886080e+06), RES(8.3886080e6, 0.0)},
+ {FN (abs), ARG(1.19209289550781250e-07,-8.3886080e+06), RES(8.3886080e6, 0.0)},
+ {FN (abs), ARG(-1.19209289550781250e-07,8.3886080e+06), RES(8.3886080e6, 0.0)},
+ {FN (abs), ARG(-1.19209289550781250e-07,-8.3886080e+06), RES(8.3886080e6, 0.0)},
+ {FN (abs), ARG(5.0e-01,0.0e+00), RES(5e-1, 0.0)},
+ {FN (abs), ARG(-5.0e-01,0.0e+00), RES(5e-1, 0.0)},
+ {FN (abs), ARG(5.0e-01,1.19209289550781250e-07), RES(5.0000000000001421085e-1, 0.0)},
+ {FN (abs), ARG(5.0e-01,-1.19209289550781250e-07), RES(5.0000000000001421085e-1, 0.0)},
+ {FN (abs), ARG(-5.0e-01,1.19209289550781250e-07), RES(5.0000000000001421085e-1, 0.0)},
+ {FN (abs), ARG(-5.0e-01,-1.19209289550781250e-07), RES(5.0000000000001421085e-1, 0.0)},
+ {FN (abs), ARG(5.0e-01,5.0e-01), RES(7.0710678118654752440e-1, 0.0)},
+ {FN (abs), ARG(5.0e-01,-5.0e-01), RES(7.0710678118654752440e-1, 0.0)},
+ {FN (abs), ARG(-5.0e-01,5.0e-01), RES(7.0710678118654752440e-1, 0.0)},
+ {FN (abs), ARG(-5.0e-01,-5.0e-01), RES(7.0710678118654752440e-1, 0.0)},
+ {FN (abs), ARG(5.0e-01,1.0e+00), RES(1.1180339887498948482e0, 0.0)},
+ {FN (abs), ARG(5.0e-01,-1.0e+00), RES(1.1180339887498948482e0, 0.0)},
+ {FN (abs), ARG(-5.0e-01,1.0e+00), RES(1.1180339887498948482e0, 0.0)},
+ {FN (abs), ARG(-5.0e-01,-1.0e+00), RES(1.1180339887498948482e0, 0.0)},
+ {FN (abs), ARG(5.0e-01,2.0e+00), RES(2.0615528128088302749e0, 0.0)},
+ {FN (abs), ARG(5.0e-01,-2.0e+00), RES(2.0615528128088302749e0, 0.0)},
+ {FN (abs), ARG(-5.0e-01,2.0e+00), RES(2.0615528128088302749e0, 0.0)},
+ {FN (abs), ARG(-5.0e-01,-2.0e+00), RES(2.0615528128088302749e0, 0.0)},
+ {FN (abs), ARG(5.0e-01,8.3886080e+06), RES(8.3886080000000149012e6, 0.0)},
+ {FN (abs), ARG(5.0e-01,-8.3886080e+06), RES(8.3886080000000149012e6, 0.0)},
+ {FN (abs), ARG(-5.0e-01,8.3886080e+06), RES(8.3886080000000149012e6, 0.0)},
+ {FN (abs), ARG(-5.0e-01,-8.3886080e+06), RES(8.3886080000000149012e6, 0.0)},
+ {FN (abs), ARG(1.0e+00,0.0e+00), RES(1e0, 0.0)},
+ {FN (abs), ARG(-1.0e+00,0.0e+00), RES(1e0, 0.0)},
+ {FN (abs), ARG(1.0e+00,1.19209289550781250e-07), RES(1.0000000000000071054e0, 0.0)},
+ {FN (abs), ARG(1.0e+00,-1.19209289550781250e-07), RES(1.0000000000000071054e0, 0.0)},
+ {FN (abs), ARG(-1.0e+00,1.19209289550781250e-07), RES(1.0000000000000071054e0, 0.0)},
+ {FN (abs), ARG(-1.0e+00,-1.19209289550781250e-07), RES(1.0000000000000071054e0, 0.0)},
+ {FN (abs), ARG(1.0e+00,5.0e-01), RES(1.1180339887498948482e0, 0.0)},
+ {FN (abs), ARG(1.0e+00,-5.0e-01), RES(1.1180339887498948482e0, 0.0)},
+ {FN (abs), ARG(-1.0e+00,5.0e-01), RES(1.1180339887498948482e0, 0.0)},
+ {FN (abs), ARG(-1.0e+00,-5.0e-01), RES(1.1180339887498948482e0, 0.0)},
+ {FN (abs), ARG(1.0e+00,1.0e+00), RES(1.4142135623730950488e0, 0.0)},
+ {FN (abs), ARG(1.0e+00,-1.0e+00), RES(1.4142135623730950488e0, 0.0)},
+ {FN (abs), ARG(-1.0e+00,1.0e+00), RES(1.4142135623730950488e0, 0.0)},
+ {FN (abs), ARG(-1.0e+00,-1.0e+00), RES(1.4142135623730950488e0, 0.0)},
+ {FN (abs), ARG(1.0e+00,2.0e+00), RES(2.2360679774997896964e0, 0.0)},
+ {FN (abs), ARG(1.0e+00,-2.0e+00), RES(2.2360679774997896964e0, 0.0)},
+ {FN (abs), ARG(-1.0e+00,2.0e+00), RES(2.2360679774997896964e0, 0.0)},
+ {FN (abs), ARG(-1.0e+00,-2.0e+00), RES(2.2360679774997896964e0, 0.0)},
+ {FN (abs), ARG(1.0e+00,8.3886080e+06), RES(8.3886080000000596046e6, 0.0)},
+ {FN (abs), ARG(1.0e+00,-8.3886080e+06), RES(8.3886080000000596046e6, 0.0)},
+ {FN (abs), ARG(-1.0e+00,8.3886080e+06), RES(8.3886080000000596046e6, 0.0)},
+ {FN (abs), ARG(-1.0e+00,-8.3886080e+06), RES(8.3886080000000596046e6, 0.0)},
+ {FN (abs), ARG(2.0e+00,0.0e+00), RES(2e0, 0.0)},
+ {FN (abs), ARG(-2.0e+00,0.0e+00), RES(2e0, 0.0)},
+ {FN (abs), ARG(2.0e+00,1.19209289550781250e-07), RES(2.0000000000000035527e0, 0.0)},
+ {FN (abs), ARG(2.0e+00,-1.19209289550781250e-07), RES(2.0000000000000035527e0, 0.0)},
+ {FN (abs), ARG(-2.0e+00,1.19209289550781250e-07), RES(2.0000000000000035527e0, 0.0)},
+ {FN (abs), ARG(-2.0e+00,-1.19209289550781250e-07), RES(2.0000000000000035527e0, 0.0)},
+ {FN (abs), ARG(2.0e+00,5.0e-01), RES(2.0615528128088302749e0, 0.0)},
+ {FN (abs), ARG(2.0e+00,-5.0e-01), RES(2.0615528128088302749e0, 0.0)},
+ {FN (abs), ARG(-2.0e+00,5.0e-01), RES(2.0615528128088302749e0, 0.0)},
+ {FN (abs), ARG(-2.0e+00,-5.0e-01), RES(2.0615528128088302749e0, 0.0)},
+ {FN (abs), ARG(2.0e+00,1.0e+00), RES(2.2360679774997896964e0, 0.0)},
+ {FN (abs), ARG(2.0e+00,-1.0e+00), RES(2.2360679774997896964e0, 0.0)},
+ {FN (abs), ARG(-2.0e+00,1.0e+00), RES(2.2360679774997896964e0, 0.0)},
+ {FN (abs), ARG(-2.0e+00,-1.0e+00), RES(2.2360679774997896964e0, 0.0)},
+ {FN (abs), ARG(2.0e+00,2.0e+00), RES(2.8284271247461900976e0, 0.0)},
+ {FN (abs), ARG(2.0e+00,-2.0e+00), RES(2.8284271247461900976e0, 0.0)},
+ {FN (abs), ARG(-2.0e+00,2.0e+00), RES(2.8284271247461900976e0, 0.0)},
+ {FN (abs), ARG(-2.0e+00,-2.0e+00), RES(2.8284271247461900976e0, 0.0)},
+ {FN (abs), ARG(2.0e+00,8.3886080e+06), RES(8.3886080000002384186e6, 0.0)},
+ {FN (abs), ARG(2.0e+00,-8.3886080e+06), RES(8.3886080000002384186e6, 0.0)},
+ {FN (abs), ARG(-2.0e+00,8.3886080e+06), RES(8.3886080000002384186e6, 0.0)},
+ {FN (abs), ARG(-2.0e+00,-8.3886080e+06), RES(8.3886080000002384186e6, 0.0)},
+ {FN (abs), ARG(8.3886080e+06,0.0e+00), RES(8.388608e6, 0.0)},
+ {FN (abs), ARG(-8.3886080e+06,0.0e+00), RES(8.388608e6, 0.0)},
+ {FN (abs), ARG(8.3886080e+06,1.19209289550781250e-07), RES(8.3886080e6, 0.0)},
+ {FN (abs), ARG(8.3886080e+06,-1.19209289550781250e-07), RES(8.3886080e6, 0.0)},
+ {FN (abs), ARG(-8.3886080e+06,1.19209289550781250e-07), RES(8.3886080e6, 0.0)},
+ {FN (abs), ARG(-8.3886080e+06,-1.19209289550781250e-07), RES(8.3886080e6, 0.0)},
+ {FN (abs), ARG(8.3886080e+06,5.0e-01), RES(8.3886080000000149012e6, 0.0)},
+ {FN (abs), ARG(8.3886080e+06,-5.0e-01), RES(8.3886080000000149012e6, 0.0)},
+ {FN (abs), ARG(-8.3886080e+06,5.0e-01), RES(8.3886080000000149012e6, 0.0)},
+ {FN (abs), ARG(-8.3886080e+06,-5.0e-01), RES(8.3886080000000149012e6, 0.0)},
+ {FN (abs), ARG(8.3886080e+06,1.0e+00), RES(8.3886080000000596046e6, 0.0)},
+ {FN (abs), ARG(8.3886080e+06,-1.0e+00), RES(8.3886080000000596046e6, 0.0)},
+ {FN (abs), ARG(-8.3886080e+06,1.0e+00), RES(8.3886080000000596046e6, 0.0)},
+ {FN (abs), ARG(-8.3886080e+06,-1.0e+00), RES(8.3886080000000596046e6, 0.0)},
+ {FN (abs), ARG(8.3886080e+06,2.0e+00), RES(8.3886080000002384186e6, 0.0)},
+ {FN (abs), ARG(8.3886080e+06,-2.0e+00), RES(8.3886080000002384186e6, 0.0)},
+ {FN (abs), ARG(-8.3886080e+06,2.0e+00), RES(8.3886080000002384186e6, 0.0)},
+ {FN (abs), ARG(-8.3886080e+06,-2.0e+00), RES(8.3886080000002384186e6, 0.0)},
+ {FN (abs), ARG(8.3886080e+06,8.3886080e+06), RES(1.1863283203031444111e7, 0.0)},
+ {FN (abs), ARG(8.3886080e+06,-8.3886080e+06), RES(1.1863283203031444111e7, 0.0)},
+ {FN (abs), ARG(-8.3886080e+06,8.3886080e+06), RES(1.1863283203031444111e7, 0.0)},
+ {FN (abs), ARG(-8.3886080e+06,-8.3886080e+06), RES(1.1863283203031444111e7, 0.0)},
+ {FN (abs2), ARG(0.0e+00,0.0e+00), RES(0e0, 0.0)},
+ {FN (abs2), ARG(0.0e+00,1.19209289550781250e-07), RES(1.4210854715202003717e-14, 0.0)},
+ {FN (abs2), ARG(0.0e+00,-1.19209289550781250e-07), RES(1.4210854715202003717e-14, 0.0)},
+ {FN (abs2), ARG(0.0e+00,5.0e-01), RES(2.5e-1, 0.0)},
+ {FN (abs2), ARG(0.0e+00,-5.0e-01), RES(2.5e-1, 0.0)},
+ {FN (abs2), ARG(0.0e+00,1.0e+00), RES(1e0, 0.0)},
+ {FN (abs2), ARG(0.0e+00,-1.0e+00), RES(1e0, 0.0)},
+ {FN (abs2), ARG(0.0e+00,2.0e+00), RES(4e0, 0.0)},
+ {FN (abs2), ARG(0.0e+00,-2.0e+00), RES(4e0, 0.0)},
+ {FN (abs2), ARG(0.0e+00,8.3886080e+06), RES(7.0368744177664e13, 0.0)},
+ {FN (abs2), ARG(0.0e+00,-8.3886080e+06), RES(7.0368744177664e13, 0.0)},
+ {FN (abs2), ARG(1.19209289550781250e-07,0.0e+00), RES(1.4210854715202003717e-14, 0.0)},
+ {FN (abs2), ARG(-1.19209289550781250e-07,0.0e+00), RES(1.4210854715202003717e-14, 0.0)},
+ {FN (abs2), ARG(1.19209289550781250e-07,1.19209289550781250e-07), RES(2.8421709430404007435e-14, 0.0)},
+ {FN (abs2), ARG(1.19209289550781250e-07,-1.19209289550781250e-07), RES(2.8421709430404007435e-14, 0.0)},
+ {FN (abs2), ARG(-1.19209289550781250e-07,1.19209289550781250e-07), RES(2.8421709430404007435e-14, 0.0)},
+ {FN (abs2), ARG(-1.19209289550781250e-07,-1.19209289550781250e-07), RES(2.8421709430404007435e-14, 0.0)},
+ {FN (abs2), ARG(1.19209289550781250e-07,5.0e-01), RES(2.5000000000001421085e-1, 0.0)},
+ {FN (abs2), ARG(1.19209289550781250e-07,-5.0e-01), RES(2.5000000000001421085e-1, 0.0)},
+ {FN (abs2), ARG(-1.19209289550781250e-07,5.0e-01), RES(2.5000000000001421085e-1, 0.0)},
+ {FN (abs2), ARG(-1.19209289550781250e-07,-5.0e-01), RES(2.5000000000001421085e-1, 0.0)},
+ {FN (abs2), ARG(1.19209289550781250e-07,1.0e+00), RES(1.0000000000000142109e0, 0.0)},
+ {FN (abs2), ARG(1.19209289550781250e-07,-1.0e+00), RES(1.0000000000000142109e0, 0.0)},
+ {FN (abs2), ARG(-1.19209289550781250e-07,1.0e+00), RES(1.0000000000000142109e0, 0.0)},
+ {FN (abs2), ARG(-1.19209289550781250e-07,-1.0e+00), RES(1.0000000000000142109e0, 0.0)},
+ {FN (abs2), ARG(1.19209289550781250e-07,2.0e+00), RES(4.0000000000000142109e0, 0.0)},
+ {FN (abs2), ARG(1.19209289550781250e-07,-2.0e+00), RES(4.0000000000000142109e0, 0.0)},
+ {FN (abs2), ARG(-1.19209289550781250e-07,2.0e+00), RES(4.0000000000000142109e0, 0.0)},
+ {FN (abs2), ARG(-1.19209289550781250e-07,-2.0e+00), RES(4.0000000000000142109e0, 0.0)},
+ {FN (abs2), ARG(1.19209289550781250e-07,8.3886080e+06), RES(7.03687441776640e13, 0.0)},
+ {FN (abs2), ARG(1.19209289550781250e-07,-8.3886080e+06), RES(7.03687441776640e13, 0.0)},
+ {FN (abs2), ARG(-1.19209289550781250e-07,8.3886080e+06), RES(7.03687441776640e13, 0.0)},
+ {FN (abs2), ARG(-1.19209289550781250e-07,-8.3886080e+06), RES(7.03687441776640e13, 0.0)},
+ {FN (abs2), ARG(5.0e-01,0.0e+00), RES(2.5e-1, 0.0)},
+ {FN (abs2), ARG(-5.0e-01,0.0e+00), RES(2.5e-1, 0.0)},
+ {FN (abs2), ARG(5.0e-01,1.19209289550781250e-07), RES(2.5000000000001421085e-1, 0.0)},
+ {FN (abs2), ARG(5.0e-01,-1.19209289550781250e-07), RES(2.5000000000001421085e-1, 0.0)},
+ {FN (abs2), ARG(-5.0e-01,1.19209289550781250e-07), RES(2.5000000000001421085e-1, 0.0)},
+ {FN (abs2), ARG(-5.0e-01,-1.19209289550781250e-07), RES(2.5000000000001421085e-1, 0.0)},
+ {FN (abs2), ARG(5.0e-01,5.0e-01), RES(5e-1, 0.0)},
+ {FN (abs2), ARG(5.0e-01,-5.0e-01), RES(5e-1, 0.0)},
+ {FN (abs2), ARG(-5.0e-01,5.0e-01), RES(5e-1, 0.0)},
+ {FN (abs2), ARG(-5.0e-01,-5.0e-01), RES(5e-1, 0.0)},
+ {FN (abs2), ARG(5.0e-01,1.0e+00), RES(1.25e0, 0.0)},
+ {FN (abs2), ARG(5.0e-01,-1.0e+00), RES(1.25e0, 0.0)},
+ {FN (abs2), ARG(-5.0e-01,1.0e+00), RES(1.25e0, 0.0)},
+ {FN (abs2), ARG(-5.0e-01,-1.0e+00), RES(1.25e0, 0.0)},
+ {FN (abs2), ARG(5.0e-01,2.0e+00), RES(4.25e0, 0.0)},
+ {FN (abs2), ARG(5.0e-01,-2.0e+00), RES(4.25e0, 0.0)},
+ {FN (abs2), ARG(-5.0e-01,2.0e+00), RES(4.25e0, 0.0)},
+ {FN (abs2), ARG(-5.0e-01,-2.0e+00), RES(4.25e0, 0.0)},
+ {FN (abs2), ARG(5.0e-01,8.3886080e+06), RES(7.036874417766425e13, 0.0)},
+ {FN (abs2), ARG(5.0e-01,-8.3886080e+06), RES(7.036874417766425e13, 0.0)},
+ {FN (abs2), ARG(-5.0e-01,8.3886080e+06), RES(7.036874417766425e13, 0.0)},
+ {FN (abs2), ARG(-5.0e-01,-8.3886080e+06), RES(7.036874417766425e13, 0.0)},
+ {FN (abs2), ARG(1.0e+00,0.0e+00), RES(1e0, 0.0)},
+ {FN (abs2), ARG(-1.0e+00,0.0e+00), RES(1e0, 0.0)},
+ {FN (abs2), ARG(1.0e+00,1.19209289550781250e-07), RES(1.0000000000000142109e0, 0.0)},
+ {FN (abs2), ARG(1.0e+00,-1.19209289550781250e-07), RES(1.0000000000000142109e0, 0.0)},
+ {FN (abs2), ARG(-1.0e+00,1.19209289550781250e-07), RES(1.0000000000000142109e0, 0.0)},
+ {FN (abs2), ARG(-1.0e+00,-1.19209289550781250e-07), RES(1.0000000000000142109e0, 0.0)},
+ {FN (abs2), ARG(1.0e+00,5.0e-01), RES(1.25e0, 0.0)},
+ {FN (abs2), ARG(1.0e+00,-5.0e-01), RES(1.25e0, 0.0)},
+ {FN (abs2), ARG(-1.0e+00,5.0e-01), RES(1.25e0, 0.0)},
+ {FN (abs2), ARG(-1.0e+00,-5.0e-01), RES(1.25e0, 0.0)},
+ {FN (abs2), ARG(1.0e+00,1.0e+00), RES(2e0, 0.0)},
+ {FN (abs2), ARG(1.0e+00,-1.0e+00), RES(2e0, 0.0)},
+ {FN (abs2), ARG(-1.0e+00,1.0e+00), RES(2e0, 0.0)},
+ {FN (abs2), ARG(-1.0e+00,-1.0e+00), RES(2e0, 0.0)},
+ {FN (abs2), ARG(1.0e+00,2.0e+00), RES(5e0, 0.0)},
+ {FN (abs2), ARG(1.0e+00,-2.0e+00), RES(5e0, 0.0)},
+ {FN (abs2), ARG(-1.0e+00,2.0e+00), RES(5e0, 0.0)},
+ {FN (abs2), ARG(-1.0e+00,-2.0e+00), RES(5e0, 0.0)},
+ {FN (abs2), ARG(1.0e+00,8.3886080e+06), RES(7.0368744177665e13, 0.0)},
+ {FN (abs2), ARG(1.0e+00,-8.3886080e+06), RES(7.0368744177665e13, 0.0)},
+ {FN (abs2), ARG(-1.0e+00,8.3886080e+06), RES(7.0368744177665e13, 0.0)},
+ {FN (abs2), ARG(-1.0e+00,-8.3886080e+06), RES(7.0368744177665e13, 0.0)},
+ {FN (abs2), ARG(2.0e+00,0.0e+00), RES(4e0, 0.0)},
+ {FN (abs2), ARG(-2.0e+00,0.0e+00), RES(4e0, 0.0)},
+ {FN (abs2), ARG(2.0e+00,1.19209289550781250e-07), RES(4.0000000000000142109e0, 0.0)},
+ {FN (abs2), ARG(2.0e+00,-1.19209289550781250e-07), RES(4.0000000000000142109e0, 0.0)},
+ {FN (abs2), ARG(-2.0e+00,1.19209289550781250e-07), RES(4.0000000000000142109e0, 0.0)},
+ {FN (abs2), ARG(-2.0e+00,-1.19209289550781250e-07), RES(4.0000000000000142109e0, 0.0)},
+ {FN (abs2), ARG(2.0e+00,5.0e-01), RES(4.25e0, 0.0)},
+ {FN (abs2), ARG(2.0e+00,-5.0e-01), RES(4.25e0, 0.0)},
+ {FN (abs2), ARG(-2.0e+00,5.0e-01), RES(4.25e0, 0.0)},
+ {FN (abs2), ARG(-2.0e+00,-5.0e-01), RES(4.25e0, 0.0)},
+ {FN (abs2), ARG(2.0e+00,1.0e+00), RES(5e0, 0.0)},
+ {FN (abs2), ARG(2.0e+00,-1.0e+00), RES(5e0, 0.0)},
+ {FN (abs2), ARG(-2.0e+00,1.0e+00), RES(5e0, 0.0)},
+ {FN (abs2), ARG(-2.0e+00,-1.0e+00), RES(5e0, 0.0)},
+ {FN (abs2), ARG(2.0e+00,2.0e+00), RES(8e0, 0.0)},
+ {FN (abs2), ARG(2.0e+00,-2.0e+00), RES(8e0, 0.0)},
+ {FN (abs2), ARG(-2.0e+00,2.0e+00), RES(8e0, 0.0)},
+ {FN (abs2), ARG(-2.0e+00,-2.0e+00), RES(8e0, 0.0)},
+ {FN (abs2), ARG(2.0e+00,8.3886080e+06), RES(7.0368744177668e13, 0.0)},
+ {FN (abs2), ARG(2.0e+00,-8.3886080e+06), RES(7.0368744177668e13, 0.0)},
+ {FN (abs2), ARG(-2.0e+00,8.3886080e+06), RES(7.0368744177668e13, 0.0)},
+ {FN (abs2), ARG(-2.0e+00,-8.3886080e+06), RES(7.0368744177668e13, 0.0)},
+ {FN (abs2), ARG(8.3886080e+06,0.0e+00), RES(7.0368744177664e13, 0.0)},
+ {FN (abs2), ARG(-8.3886080e+06,0.0e+00), RES(7.0368744177664e13, 0.0)},
+ {FN (abs2), ARG(8.3886080e+06,1.19209289550781250e-07), RES(7.03687441776640e13, 0.0)},
+ {FN (abs2), ARG(8.3886080e+06,-1.19209289550781250e-07), RES(7.03687441776640e13, 0.0)},
+ {FN (abs2), ARG(-8.3886080e+06,1.19209289550781250e-07), RES(7.03687441776640e13, 0.0)},
+ {FN (abs2), ARG(-8.3886080e+06,-1.19209289550781250e-07), RES(7.03687441776640e13, 0.0)},
+ {FN (abs2), ARG(8.3886080e+06,5.0e-01), RES(7.036874417766425e13, 0.0)},
+ {FN (abs2), ARG(8.3886080e+06,-5.0e-01), RES(7.036874417766425e13, 0.0)},
+ {FN (abs2), ARG(-8.3886080e+06,5.0e-01), RES(7.036874417766425e13, 0.0)},
+ {FN (abs2), ARG(-8.3886080e+06,-5.0e-01), RES(7.036874417766425e13, 0.0)},
+ {FN (abs2), ARG(8.3886080e+06,1.0e+00), RES(7.0368744177665e13, 0.0)},
+ {FN (abs2), ARG(8.3886080e+06,-1.0e+00), RES(7.0368744177665e13, 0.0)},
+ {FN (abs2), ARG(-8.3886080e+06,1.0e+00), RES(7.0368744177665e13, 0.0)},
+ {FN (abs2), ARG(-8.3886080e+06,-1.0e+00), RES(7.0368744177665e13, 0.0)},
+ {FN (abs2), ARG(8.3886080e+06,2.0e+00), RES(7.0368744177668e13, 0.0)},
+ {FN (abs2), ARG(8.3886080e+06,-2.0e+00), RES(7.0368744177668e13, 0.0)},
+ {FN (abs2), ARG(-8.3886080e+06,2.0e+00), RES(7.0368744177668e13, 0.0)},
+ {FN (abs2), ARG(-8.3886080e+06,-2.0e+00), RES(7.0368744177668e13, 0.0)},
+ {FN (abs2), ARG(8.3886080e+06,8.3886080e+06), RES(1.40737488355328e14, 0.0)},
+ {FN (abs2), ARG(8.3886080e+06,-8.3886080e+06), RES(1.40737488355328e14, 0.0)},
+ {FN (abs2), ARG(-8.3886080e+06,8.3886080e+06), RES(1.40737488355328e14, 0.0)},
+ {FN (abs2), ARG(-8.3886080e+06,-8.3886080e+06), RES(1.40737488355328e14, 0.0)},
+ {FN (logabs), ARG(1.19209289550781250e-07,0.0e+00), RES(-1.5942385152878742117e1, 0.0)},
+ {FN (logabs), ARG(-1.19209289550781250e-07,0.0e+00), RES(-1.5942385152878742117e1, 0.0)},
+ {FN (logabs), ARG(1.19209289550781250e-07,1.19209289550781250e-07), RES(-1.5595811562598769462e1, 0.0)},
+ {FN (logabs), ARG(1.19209289550781250e-07,-1.19209289550781250e-07), RES(-1.5595811562598769462e1, 0.0)},
+ {FN (logabs), ARG(-1.19209289550781250e-07,1.19209289550781250e-07), RES(-1.5595811562598769462e1, 0.0)},
+ {FN (logabs), ARG(-1.19209289550781250e-07,-1.19209289550781250e-07), RES(-1.5595811562598769462e1, 0.0)},
+ {FN (logabs), ARG(1.19209289550781250e-07,5.0e-01), RES(-6.9314718055991688771e-1, 0.0)},
+ {FN (logabs), ARG(1.19209289550781250e-07,-5.0e-01), RES(-6.9314718055991688771e-1, 0.0)},
+ {FN (logabs), ARG(-1.19209289550781250e-07,5.0e-01), RES(-6.9314718055991688771e-1, 0.0)},
+ {FN (logabs), ARG(-1.19209289550781250e-07,-5.0e-01), RES(-6.9314718055991688771e-1, 0.0)},
+ {FN (logabs), ARG(1.19209289550781250e-07,1.0e+00), RES(7.1054273576009513716e-15, 0.0)},
+ {FN (logabs), ARG(1.19209289550781250e-07,-1.0e+00), RES(7.1054273576009513716e-15, 0.0)},
+ {FN (logabs), ARG(-1.19209289550781250e-07,1.0e+00), RES(7.1054273576009513716e-15, 0.0)},
+ {FN (logabs), ARG(-1.19209289550781250e-07,-1.0e+00), RES(7.1054273576009513716e-15, 0.0)},
+ {FN (logabs), ARG(1.19209289550781250e-07,2.0e+00), RES(6.9314718055994708577e-1, 0.0)},
+ {FN (logabs), ARG(1.19209289550781250e-07,-2.0e+00), RES(6.9314718055994708577e-1, 0.0)},
+ {FN (logabs), ARG(-1.19209289550781250e-07,2.0e+00), RES(6.9314718055994708577e-1, 0.0)},
+ {FN (logabs), ARG(-1.19209289550781250e-07,-2.0e+00), RES(6.9314718055994708577e-1, 0.0)},
+ {FN (logabs), ARG(1.19209289550781250e-07,8.3886080e+06), RES(1.5942385152878742117e1, 0.0)},
+ {FN (logabs), ARG(1.19209289550781250e-07,-8.3886080e+06), RES(1.5942385152878742117e1, 0.0)},
+ {FN (logabs), ARG(-1.19209289550781250e-07,8.3886080e+06), RES(1.5942385152878742117e1, 0.0)},
+ {FN (logabs), ARG(-1.19209289550781250e-07,-8.3886080e+06), RES(1.5942385152878742117e1, 0.0)},
+ {FN (logabs), ARG(5.0e-01,0.0e+00), RES(-6.9314718055994530942e-1, 0.0)},
+ {FN (logabs), ARG(-5.0e-01,0.0e+00), RES(-6.9314718055994530942e-1, 0.0)},
+ {FN (logabs), ARG(5.0e-01,1.19209289550781250e-07), RES(-6.9314718055991688771e-1, 0.0)},
+ {FN (logabs), ARG(5.0e-01,-1.19209289550781250e-07), RES(-6.9314718055991688771e-1, 0.0)},
+ {FN (logabs), ARG(-5.0e-01,1.19209289550781250e-07), RES(-6.9314718055991688771e-1, 0.0)},
+ {FN (logabs), ARG(-5.0e-01,-1.19209289550781250e-07), RES(-6.9314718055991688771e-1, 0.0)},
+ {FN (logabs), ARG(5.0e-01,5.0e-01), RES(-3.4657359027997265471e-1, 0.0)},
+ {FN (logabs), ARG(5.0e-01,-5.0e-01), RES(-3.4657359027997265471e-1, 0.0)},
+ {FN (logabs), ARG(-5.0e-01,5.0e-01), RES(-3.4657359027997265471e-1, 0.0)},
+ {FN (logabs), ARG(-5.0e-01,-5.0e-01), RES(-3.4657359027997265471e-1, 0.0)},
+ {FN (logabs), ARG(5.0e-01,1.0e+00), RES(1.1157177565710487788e-1, 0.0)},
+ {FN (logabs), ARG(5.0e-01,-1.0e+00), RES(1.1157177565710487788e-1, 0.0)},
+ {FN (logabs), ARG(-5.0e-01,1.0e+00), RES(1.1157177565710487788e-1, 0.0)},
+ {FN (logabs), ARG(-5.0e-01,-1.0e+00), RES(1.1157177565710487788e-1, 0.0)},
+ {FN (logabs), ARG(5.0e-01,2.0e+00), RES(7.2345949146816273071e-1, 0.0)},
+ {FN (logabs), ARG(5.0e-01,-2.0e+00), RES(7.2345949146816273071e-1, 0.0)},
+ {FN (logabs), ARG(-5.0e-01,2.0e+00), RES(7.2345949146816273071e-1, 0.0)},
+ {FN (logabs), ARG(-5.0e-01,-2.0e+00), RES(7.2345949146816273071e-1, 0.0)},
+ {FN (logabs), ARG(5.0e-01,8.3886080e+06), RES(1.5942385152878743893e1, 0.0)},
+ {FN (logabs), ARG(5.0e-01,-8.3886080e+06), RES(1.5942385152878743893e1, 0.0)},
+ {FN (logabs), ARG(-5.0e-01,8.3886080e+06), RES(1.5942385152878743893e1, 0.0)},
+ {FN (logabs), ARG(-5.0e-01,-8.3886080e+06), RES(1.5942385152878743893e1, 0.0)},
+ {FN (logabs), ARG(1.0e+00,0.0e+00), RES(0e0, 0.0)},
+ {FN (logabs), ARG(-1.0e+00,0.0e+00), RES(0e0, 0.0)},
+ {FN (logabs), ARG(1.0e+00,1.19209289550781250e-07), RES(7.1054273576009513716e-15, 0.0)},
+ {FN (logabs), ARG(1.0e+00,-1.19209289550781250e-07), RES(7.1054273576009513716e-15, 0.0)},
+ {FN (logabs), ARG(-1.0e+00,1.19209289550781250e-07), RES(7.1054273576009513716e-15, 0.0)},
+ {FN (logabs), ARG(-1.0e+00,-1.19209289550781250e-07), RES(7.1054273576009513716e-15, 0.0)},
+ {FN (logabs), ARG(1.0e+00,5.0e-01), RES(1.1157177565710487788e-1, 0.0)},
+ {FN (logabs), ARG(1.0e+00,-5.0e-01), RES(1.1157177565710487788e-1, 0.0)},
+ {FN (logabs), ARG(-1.0e+00,5.0e-01), RES(1.1157177565710487788e-1, 0.0)},
+ {FN (logabs), ARG(-1.0e+00,-5.0e-01), RES(1.1157177565710487788e-1, 0.0)},
+ {FN (logabs), ARG(1.0e+00,1.0e+00), RES(3.4657359027997265471e-1, 0.0)},
+ {FN (logabs), ARG(1.0e+00,-1.0e+00), RES(3.4657359027997265471e-1, 0.0)},
+ {FN (logabs), ARG(-1.0e+00,1.0e+00), RES(3.4657359027997265471e-1, 0.0)},
+ {FN (logabs), ARG(-1.0e+00,-1.0e+00), RES(3.4657359027997265471e-1, 0.0)},
+ {FN (logabs), ARG(1.0e+00,2.0e+00), RES(8.0471895621705018730e-1, 0.0)},
+ {FN (logabs), ARG(1.0e+00,-2.0e+00), RES(8.0471895621705018730e-1, 0.0)},
+ {FN (logabs), ARG(-1.0e+00,2.0e+00), RES(8.0471895621705018730e-1, 0.0)},
+ {FN (logabs), ARG(-1.0e+00,-2.0e+00), RES(8.0471895621705018730e-1, 0.0)},
+ {FN (logabs), ARG(1.0e+00,8.3886080e+06), RES(1.5942385152878749222e1, 0.0)},
+ {FN (logabs), ARG(1.0e+00,-8.3886080e+06), RES(1.5942385152878749222e1, 0.0)},
+ {FN (logabs), ARG(-1.0e+00,8.3886080e+06), RES(1.5942385152878749222e1, 0.0)},
+ {FN (logabs), ARG(-1.0e+00,-8.3886080e+06), RES(1.5942385152878749222e1, 0.0)},
+ {FN (logabs), ARG(2.0e+00,0.0e+00), RES(6.9314718055994530942e-1, 0.0)},
+ {FN (logabs), ARG(-2.0e+00,0.0e+00), RES(6.9314718055994530942e-1, 0.0)},
+ {FN (logabs), ARG(2.0e+00,1.19209289550781250e-07), RES(6.9314718055994708577e-1, 0.0)},
+ {FN (logabs), ARG(2.0e+00,-1.19209289550781250e-07), RES(6.9314718055994708577e-1, 0.0)},
+ {FN (logabs), ARG(-2.0e+00,1.19209289550781250e-07), RES(6.9314718055994708577e-1, 0.0)},
+ {FN (logabs), ARG(-2.0e+00,-1.19209289550781250e-07), RES(6.9314718055994708577e-1, 0.0)},
+ {FN (logabs), ARG(2.0e+00,5.0e-01), RES(7.2345949146816273071e-1, 0.0)},
+ {FN (logabs), ARG(2.0e+00,-5.0e-01), RES(7.2345949146816273071e-1, 0.0)},
+ {FN (logabs), ARG(-2.0e+00,5.0e-01), RES(7.2345949146816273071e-1, 0.0)},
+ {FN (logabs), ARG(-2.0e+00,-5.0e-01), RES(7.2345949146816273071e-1, 0.0)},
+ {FN (logabs), ARG(2.0e+00,1.0e+00), RES(8.0471895621705018730e-1, 0.0)},
+ {FN (logabs), ARG(2.0e+00,-1.0e+00), RES(8.0471895621705018730e-1, 0.0)},
+ {FN (logabs), ARG(-2.0e+00,1.0e+00), RES(8.0471895621705018730e-1, 0.0)},
+ {FN (logabs), ARG(-2.0e+00,-1.0e+00), RES(8.0471895621705018730e-1, 0.0)},
+ {FN (logabs), ARG(2.0e+00,2.0e+00), RES(1.0397207708399179641e0, 0.0)},
+ {FN (logabs), ARG(2.0e+00,-2.0e+00), RES(1.0397207708399179641e0, 0.0)},
+ {FN (logabs), ARG(-2.0e+00,2.0e+00), RES(1.0397207708399179641e0, 0.0)},
+ {FN (logabs), ARG(-2.0e+00,-2.0e+00), RES(1.0397207708399179641e0, 0.0)},
+ {FN (logabs), ARG(2.0e+00,8.3886080e+06), RES(1.5942385152878770538e1, 0.0)},
+ {FN (logabs), ARG(2.0e+00,-8.3886080e+06), RES(1.5942385152878770538e1, 0.0)},
+ {FN (logabs), ARG(-2.0e+00,8.3886080e+06), RES(1.5942385152878770538e1, 0.0)},
+ {FN (logabs), ARG(-2.0e+00,-8.3886080e+06), RES(1.5942385152878770538e1, 0.0)},
+ {FN (logabs), ARG(8.3886080e+06,0.0e+00), RES(1.5942385152878742117e1, 0.0)},
+ {FN (logabs), ARG(-8.3886080e+06,0.0e+00), RES(1.5942385152878742117e1, 0.0)},
+ {FN (logabs), ARG(8.3886080e+06,1.19209289550781250e-07), RES(1.5942385152878742117e1, 0.0)},
+ {FN (logabs), ARG(8.3886080e+06,-1.19209289550781250e-07), RES(1.5942385152878742117e1, 0.0)},
+ {FN (logabs), ARG(-8.3886080e+06,1.19209289550781250e-07), RES(1.5942385152878742117e1, 0.0)},
+ {FN (logabs), ARG(-8.3886080e+06,-1.19209289550781250e-07), RES(1.5942385152878742117e1, 0.0)},
+ {FN (logabs), ARG(8.3886080e+06,5.0e-01), RES(1.5942385152878743893e1, 0.0)},
+ {FN (logabs), ARG(8.3886080e+06,-5.0e-01), RES(1.5942385152878743893e1, 0.0)},
+ {FN (logabs), ARG(-8.3886080e+06,5.0e-01), RES(1.5942385152878743893e1, 0.0)},
+ {FN (logabs), ARG(-8.3886080e+06,-5.0e-01), RES(1.5942385152878743893e1, 0.0)},
+ {FN (logabs), ARG(8.3886080e+06,1.0e+00), RES(1.5942385152878749222e1, 0.0)},
+ {FN (logabs), ARG(8.3886080e+06,-1.0e+00), RES(1.5942385152878749222e1, 0.0)},
+ {FN (logabs), ARG(-8.3886080e+06,1.0e+00), RES(1.5942385152878749222e1, 0.0)},
+ {FN (logabs), ARG(-8.3886080e+06,-1.0e+00), RES(1.5942385152878749222e1, 0.0)},
+ {FN (logabs), ARG(8.3886080e+06,2.0e+00), RES(1.5942385152878770538e1, 0.0)},
+ {FN (logabs), ARG(8.3886080e+06,-2.0e+00), RES(1.5942385152878770538e1, 0.0)},
+ {FN (logabs), ARG(-8.3886080e+06,2.0e+00), RES(1.5942385152878770538e1, 0.0)},
+ {FN (logabs), ARG(-8.3886080e+06,-2.0e+00), RES(1.5942385152878770538e1, 0.0)},
+ {FN (logabs), ARG(8.3886080e+06,8.3886080e+06), RES(1.6288958743158714771e1, 0.0)},
+ {FN (logabs), ARG(8.3886080e+06,-8.3886080e+06), RES(1.6288958743158714771e1, 0.0)},
+ {FN (logabs), ARG(-8.3886080e+06,8.3886080e+06), RES(1.6288958743158714771e1, 0.0)},
+ {FN (logabs), ARG(-8.3886080e+06,-8.3886080e+06), RES(1.6288958743158714771e1, 0.0)},
+ {FN (logabs), ARG(0.0e+00,1.19209289550781250e-07), RES(-1.5942385152878742117e1, 0.0)},
+ {FN (logabs), ARG(0.0e+00,-1.19209289550781250e-07), RES(-1.5942385152878742117e1, 0.0)},
+ {FN (logabs), ARG(0.0e+00,5.0e-01), RES(-6.9314718055994530942e-1, 0.0)},
+ {FN (logabs), ARG(0.0e+00,-5.0e-01), RES(-6.9314718055994530942e-1, 0.0)},
+ {FN (logabs), ARG(0.0e+00,1.0e+00), RES(0e0, 0.0)},
+ {FN (logabs), ARG(0.0e+00,-1.0e+00), RES(0e0, 0.0)},
+ {FN (logabs), ARG(0.0e+00,2.0e+00), RES(6.9314718055994530942e-1, 0.0)},
+ {FN (logabs), ARG(0.0e+00,-2.0e+00), RES(6.9314718055994530942e-1, 0.0)},
+ {FN (logabs), ARG(0.0e+00,8.3886080e+06), RES(1.5942385152878742117e1, 0.0)},
+ {FN (logabs), ARG(0.0e+00,-8.3886080e+06), RES(1.5942385152878742117e1, 0.0)},
+ {FN (logabs), ARG(1.19209289550781250e-07,1.19209289550781250e-07), RES(-1.5595811562598769462e1, 0.0)},
+ {FN (logabs), ARG(1.19209289550781250e-07,-1.19209289550781250e-07), RES(-1.5595811562598769462e1, 0.0)},
+ {FN (logabs), ARG(-1.19209289550781250e-07,1.19209289550781250e-07), RES(-1.5595811562598769462e1, 0.0)},
+ {FN (logabs), ARG(-1.19209289550781250e-07,-1.19209289550781250e-07), RES(-1.5595811562598769462e1, 0.0)},
+ {FN (logabs), ARG(1.19209289550781250e-07,5.0e-01), RES(-6.9314718055991688771e-1, 0.0)},
+ {FN (logabs), ARG(1.19209289550781250e-07,-5.0e-01), RES(-6.9314718055991688771e-1, 0.0)},
+ {FN (logabs), ARG(-1.19209289550781250e-07,5.0e-01), RES(-6.9314718055991688771e-1, 0.0)},
+ {FN (logabs), ARG(-1.19209289550781250e-07,-5.0e-01), RES(-6.9314718055991688771e-1, 0.0)},
+ {FN (logabs), ARG(1.19209289550781250e-07,1.0e+00), RES(7.1054273576009513716e-15, 0.0)},
+ {FN (logabs), ARG(1.19209289550781250e-07,-1.0e+00), RES(7.1054273576009513716e-15, 0.0)},
+ {FN (logabs), ARG(-1.19209289550781250e-07,1.0e+00), RES(7.1054273576009513716e-15, 0.0)},
+ {FN (logabs), ARG(-1.19209289550781250e-07,-1.0e+00), RES(7.1054273576009513716e-15, 0.0)},
+ {FN (logabs), ARG(1.19209289550781250e-07,2.0e+00), RES(6.9314718055994708577e-1, 0.0)},
+ {FN (logabs), ARG(1.19209289550781250e-07,-2.0e+00), RES(6.9314718055994708577e-1, 0.0)},
+ {FN (logabs), ARG(-1.19209289550781250e-07,2.0e+00), RES(6.9314718055994708577e-1, 0.0)},
+ {FN (logabs), ARG(-1.19209289550781250e-07,-2.0e+00), RES(6.9314718055994708577e-1, 0.0)},
+ {FN (logabs), ARG(1.19209289550781250e-07,8.3886080e+06), RES(1.5942385152878742117e1, 0.0)},
+ {FN (logabs), ARG(1.19209289550781250e-07,-8.3886080e+06), RES(1.5942385152878742117e1, 0.0)},
+ {FN (logabs), ARG(-1.19209289550781250e-07,8.3886080e+06), RES(1.5942385152878742117e1, 0.0)},
+ {FN (logabs), ARG(-1.19209289550781250e-07,-8.3886080e+06), RES(1.5942385152878742117e1, 0.0)},
+ {FN (logabs), ARG(5.0e-01,1.19209289550781250e-07), RES(-6.9314718055991688771e-1, 0.0)},
+ {FN (logabs), ARG(5.0e-01,-1.19209289550781250e-07), RES(-6.9314718055991688771e-1, 0.0)},
+ {FN (logabs), ARG(-5.0e-01,1.19209289550781250e-07), RES(-6.9314718055991688771e-1, 0.0)},
+ {FN (logabs), ARG(-5.0e-01,-1.19209289550781250e-07), RES(-6.9314718055991688771e-1, 0.0)},
+ {FN (logabs), ARG(5.0e-01,5.0e-01), RES(-3.4657359027997265471e-1, 0.0)},
+ {FN (logabs), ARG(5.0e-01,-5.0e-01), RES(-3.4657359027997265471e-1, 0.0)},
+ {FN (logabs), ARG(-5.0e-01,5.0e-01), RES(-3.4657359027997265471e-1, 0.0)},
+ {FN (logabs), ARG(-5.0e-01,-5.0e-01), RES(-3.4657359027997265471e-1, 0.0)},
+ {FN (logabs), ARG(5.0e-01,1.0e+00), RES(1.1157177565710487788e-1, 0.0)},
+ {FN (logabs), ARG(5.0e-01,-1.0e+00), RES(1.1157177565710487788e-1, 0.0)},
+ {FN (logabs), ARG(-5.0e-01,1.0e+00), RES(1.1157177565710487788e-1, 0.0)},
+ {FN (logabs), ARG(-5.0e-01,-1.0e+00), RES(1.1157177565710487788e-1, 0.0)},
+ {FN (logabs), ARG(5.0e-01,2.0e+00), RES(7.2345949146816273071e-1, 0.0)},
+ {FN (logabs), ARG(5.0e-01,-2.0e+00), RES(7.2345949146816273071e-1, 0.0)},
+ {FN (logabs), ARG(-5.0e-01,2.0e+00), RES(7.2345949146816273071e-1, 0.0)},
+ {FN (logabs), ARG(-5.0e-01,-2.0e+00), RES(7.2345949146816273071e-1, 0.0)},
+ {FN (logabs), ARG(5.0e-01,8.3886080e+06), RES(1.5942385152878743893e1, 0.0)},
+ {FN (logabs), ARG(5.0e-01,-8.3886080e+06), RES(1.5942385152878743893e1, 0.0)},
+ {FN (logabs), ARG(-5.0e-01,8.3886080e+06), RES(1.5942385152878743893e1, 0.0)},
+ {FN (logabs), ARG(-5.0e-01,-8.3886080e+06), RES(1.5942385152878743893e1, 0.0)},
+ {FN (logabs), ARG(1.0e+00,1.19209289550781250e-07), RES(7.1054273576009513716e-15, 0.0)},
+ {FN (logabs), ARG(1.0e+00,-1.19209289550781250e-07), RES(7.1054273576009513716e-15, 0.0)},
+ {FN (logabs), ARG(-1.0e+00,1.19209289550781250e-07), RES(7.1054273576009513716e-15, 0.0)},
+ {FN (logabs), ARG(-1.0e+00,-1.19209289550781250e-07), RES(7.1054273576009513716e-15, 0.0)},
+ {FN (logabs), ARG(1.0e+00,5.0e-01), RES(1.1157177565710487788e-1, 0.0)},
+ {FN (logabs), ARG(1.0e+00,-5.0e-01), RES(1.1157177565710487788e-1, 0.0)},
+ {FN (logabs), ARG(-1.0e+00,5.0e-01), RES(1.1157177565710487788e-1, 0.0)},
+ {FN (logabs), ARG(-1.0e+00,-5.0e-01), RES(1.1157177565710487788e-1, 0.0)},
+ {FN (logabs), ARG(1.0e+00,1.0e+00), RES(3.4657359027997265471e-1, 0.0)},
+ {FN (logabs), ARG(1.0e+00,-1.0e+00), RES(3.4657359027997265471e-1, 0.0)},
+ {FN (logabs), ARG(-1.0e+00,1.0e+00), RES(3.4657359027997265471e-1, 0.0)},
+ {FN (logabs), ARG(-1.0e+00,-1.0e+00), RES(3.4657359027997265471e-1, 0.0)},
+ {FN (logabs), ARG(1.0e+00,2.0e+00), RES(8.0471895621705018730e-1, 0.0)},
+ {FN (logabs), ARG(1.0e+00,-2.0e+00), RES(8.0471895621705018730e-1, 0.0)},
+ {FN (logabs), ARG(-1.0e+00,2.0e+00), RES(8.0471895621705018730e-1, 0.0)},
+ {FN (logabs), ARG(-1.0e+00,-2.0e+00), RES(8.0471895621705018730e-1, 0.0)},
+ {FN (logabs), ARG(1.0e+00,8.3886080e+06), RES(1.5942385152878749222e1, 0.0)},
+ {FN (logabs), ARG(1.0e+00,-8.3886080e+06), RES(1.5942385152878749222e1, 0.0)},
+ {FN (logabs), ARG(-1.0e+00,8.3886080e+06), RES(1.5942385152878749222e1, 0.0)},
+ {FN (logabs), ARG(-1.0e+00,-8.3886080e+06), RES(1.5942385152878749222e1, 0.0)},
+ {FN (logabs), ARG(2.0e+00,1.19209289550781250e-07), RES(6.9314718055994708577e-1, 0.0)},
+ {FN (logabs), ARG(2.0e+00,-1.19209289550781250e-07), RES(6.9314718055994708577e-1, 0.0)},
+ {FN (logabs), ARG(-2.0e+00,1.19209289550781250e-07), RES(6.9314718055994708577e-1, 0.0)},
+ {FN (logabs), ARG(-2.0e+00,-1.19209289550781250e-07), RES(6.9314718055994708577e-1, 0.0)},
+ {FN (logabs), ARG(2.0e+00,5.0e-01), RES(7.2345949146816273071e-1, 0.0)},
+ {FN (logabs), ARG(2.0e+00,-5.0e-01), RES(7.2345949146816273071e-1, 0.0)},
+ {FN (logabs), ARG(-2.0e+00,5.0e-01), RES(7.2345949146816273071e-1, 0.0)},
+ {FN (logabs), ARG(-2.0e+00,-5.0e-01), RES(7.2345949146816273071e-1, 0.0)},
+ {FN (logabs), ARG(2.0e+00,1.0e+00), RES(8.0471895621705018730e-1, 0.0)},
+ {FN (logabs), ARG(2.0e+00,-1.0e+00), RES(8.0471895621705018730e-1, 0.0)},
+ {FN (logabs), ARG(-2.0e+00,1.0e+00), RES(8.0471895621705018730e-1, 0.0)},
+ {FN (logabs), ARG(-2.0e+00,-1.0e+00), RES(8.0471895621705018730e-1, 0.0)},
+ {FN (logabs), ARG(2.0e+00,2.0e+00), RES(1.0397207708399179641e0, 0.0)},
+ {FN (logabs), ARG(2.0e+00,-2.0e+00), RES(1.0397207708399179641e0, 0.0)},
+ {FN (logabs), ARG(-2.0e+00,2.0e+00), RES(1.0397207708399179641e0, 0.0)},
+ {FN (logabs), ARG(-2.0e+00,-2.0e+00), RES(1.0397207708399179641e0, 0.0)},
+ {FN (logabs), ARG(2.0e+00,8.3886080e+06), RES(1.5942385152878770538e1, 0.0)},
+ {FN (logabs), ARG(2.0e+00,-8.3886080e+06), RES(1.5942385152878770538e1, 0.0)},
+ {FN (logabs), ARG(-2.0e+00,8.3886080e+06), RES(1.5942385152878770538e1, 0.0)},
+ {FN (logabs), ARG(-2.0e+00,-8.3886080e+06), RES(1.5942385152878770538e1, 0.0)},
+ {FN (logabs), ARG(8.3886080e+06,1.19209289550781250e-07), RES(1.5942385152878742117e1, 0.0)},
+ {FN (logabs), ARG(8.3886080e+06,-1.19209289550781250e-07), RES(1.5942385152878742117e1, 0.0)},
+ {FN (logabs), ARG(-8.3886080e+06,1.19209289550781250e-07), RES(1.5942385152878742117e1, 0.0)},
+ {FN (logabs), ARG(-8.3886080e+06,-1.19209289550781250e-07), RES(1.5942385152878742117e1, 0.0)},
+ {FN (logabs), ARG(8.3886080e+06,5.0e-01), RES(1.5942385152878743893e1, 0.0)},
+ {FN (logabs), ARG(8.3886080e+06,-5.0e-01), RES(1.5942385152878743893e1, 0.0)},
+ {FN (logabs), ARG(-8.3886080e+06,5.0e-01), RES(1.5942385152878743893e1, 0.0)},
+ {FN (logabs), ARG(-8.3886080e+06,-5.0e-01), RES(1.5942385152878743893e1, 0.0)},
+ {FN (logabs), ARG(8.3886080e+06,1.0e+00), RES(1.5942385152878749222e1, 0.0)},
+ {FN (logabs), ARG(8.3886080e+06,-1.0e+00), RES(1.5942385152878749222e1, 0.0)},
+ {FN (logabs), ARG(-8.3886080e+06,1.0e+00), RES(1.5942385152878749222e1, 0.0)},
+ {FN (logabs), ARG(-8.3886080e+06,-1.0e+00), RES(1.5942385152878749222e1, 0.0)},
+ {FN (logabs), ARG(8.3886080e+06,2.0e+00), RES(1.5942385152878770538e1, 0.0)},
+ {FN (logabs), ARG(8.3886080e+06,-2.0e+00), RES(1.5942385152878770538e1, 0.0)},
+ {FN (logabs), ARG(-8.3886080e+06,2.0e+00), RES(1.5942385152878770538e1, 0.0)},
+ {FN (logabs), ARG(-8.3886080e+06,-2.0e+00), RES(1.5942385152878770538e1, 0.0)},
+ {FN (logabs), ARG(8.3886080e+06,8.3886080e+06), RES(1.6288958743158714771e1, 0.0)},
+ {FN (logabs), ARG(8.3886080e+06,-8.3886080e+06), RES(1.6288958743158714771e1, 0.0)},
+ {FN (logabs), ARG(-8.3886080e+06,8.3886080e+06), RES(1.6288958743158714771e1, 0.0)},
+ {FN (logabs), ARG(-8.3886080e+06,-8.3886080e+06), RES(1.6288958743158714771e1, 0.0)},
diff --git a/gsl-1.9/complex/results_real.h b/gsl-1.9/complex/results_real.h
new file mode 100644
index 0000000..356f6f5
--- /dev/null
+++ b/gsl-1.9/complex/results_real.h
@@ -0,0 +1,115 @@
+ {FN (sqrt_real), -1.0e+01, RES(0, 3.1622776601683793320e0)},
+ {FN (sqrt_real), -2.0e+00, RES(0, 1.4142135623730950488e0)},
+ {FN (sqrt_real), -1.0e+00, RES(0, 1)},
+ {FN (sqrt_real), -7.50e-01, RES(0, 8.6602540378443864676e-1)},
+ {FN (sqrt_real), -5.0e-01, RES(0, 7.0710678118654752440e-1)},
+ {FN (sqrt_real), -1.250e-01, RES(0, 3.5355339059327376220e-1)},
+ {FN (sqrt_real), -3.45266983001243932001e-04, RES(0, 1.8581361171917517303e-2)},
+ {FN (sqrt_real), -1.19209289550781250e-07, RES(0, 3.4526698300124390840e-4)},
+ {FN (sqrt_real), 0.0e+00, RES(0e0, 0.0)},
+ {FN (sqrt_real), 1.19209289550781250e-07, RES(3.4526698300124390840e-4, 0.0)},
+ {FN (sqrt_real), 3.45266983001243932001e-04, RES(1.8581361171917517303e-2, 0.0)},
+ {FN (sqrt_real), 1.250e-01, RES(3.5355339059327376220e-1, 0.0)},
+ {FN (sqrt_real), 5.0e-01, RES(7.0710678118654752440e-1, 0.0)},
+ {FN (sqrt_real), 7.50e-01, RES(8.6602540378443864676e-1, 0.0)},
+ {FN (sqrt_real), 1.0e+00, RES(1e0, 0.0)},
+ {FN (sqrt_real), 2.0e+00, RES(1.4142135623730950488e0, 0.0)},
+ {FN (sqrt_real), 1.0e+01, RES(3.1622776601683793320e0, 0.0)},
+ {FN (arcsin_real), -1.0e+01, RES(-1.5707963267948966192e0, 2.9932228461263808979e0)},
+ {FN (arcsin_real), -2.0e+00, RES(-1.5707963267948966192e0, 1.3169578969248167086e0)},
+ {FN (arcsin_real), -1.0e+00, RES(-1.5707963267948966192e0, 0.0)},
+ {FN (arcsin_real), -7.50e-01, RES(-8.4806207898148100805e-1, 0.0)},
+ {FN (arcsin_real), -5.0e-01, RES(-5.2359877559829887308e-1, 0.0)},
+ {FN (arcsin_real), -1.250e-01, RES(-1.2532783116806539687e-1, 0.0)},
+ {FN (arcsin_real), -3.45266983001243932001e-04, RES(-3.4526698986108292481e-4, 0.0)},
+ {FN (arcsin_real), -1.19209289550781250e-07, RES(-1.1920928955078153234e-7, 0.0)},
+ {FN (arcsin_real), 0.0e+00, RES(0e0, 0.0)},
+ {FN (arcsin_real), 1.19209289550781250e-07, RES(1.1920928955078153234e-7, 0.0)},
+ {FN (arcsin_real), 3.45266983001243932001e-04, RES(3.4526698986108292481e-4, 0.0)},
+ {FN (arcsin_real), 1.250e-01, RES(1.2532783116806539687e-1, 0.0)},
+ {FN (arcsin_real), 5.0e-01, RES(5.2359877559829887308e-1, 0.0)},
+ {FN (arcsin_real), 7.50e-01, RES(8.4806207898148100805e-1, 0.0)},
+ {FN (arcsin_real), 1.0e+00, RES(1.5707963267948966192e0, 0.0)},
+ {FN (arcsin_real), 2.0e+00, RES(1.5707963267948966192e0, -1.3169578969248167086e0)},
+ {FN (arcsin_real), 1.0e+01, RES(1.5707963267948966192e0, -2.9932228461263808979e0)},
+ {FN (arccos_real), -1.0e+01, RES(3.1415926535897932385e0, -2.9932228461263808979e0)},
+ {FN (arccos_real), -2.0e+00, RES(3.1415926535897932385e0, -1.3169578969248167086e0)},
+ {FN (arccos_real), -1.0e+00, RES(3.1415926535897932385e0, 0.0)},
+ {FN (arccos_real), -7.50e-01, RES(2.4188584057763776273e0, 0.0)},
+ {FN (arccos_real), -5.0e-01, RES(2.0943951023931954923e0, 0.0)},
+ {FN (arccos_real), -1.250e-01, RES(1.6961241579629620161e0, 0.0)},
+ {FN (arccos_real), -3.45266983001243932001e-04, RES(1.5711415937847577022e0, 0.0)},
+ {FN (arccos_real), -1.19209289550781250e-07, RES(1.570796446004186170e0, 0.0)},
+ {FN (arccos_real), 0.0e+00, RES(1.5707963267948966192e0, 0.0)},
+ {FN (arccos_real), 1.19209289550781250e-07, RES(1.5707962075856070684e0, 0.0)},
+ {FN (arccos_real), 3.45266983001243932001e-04, RES(1.5704510598050355363e0, 0.0)},
+ {FN (arccos_real), 1.250e-01, RES(1.4454684956268312224e0, 0.0)},
+ {FN (arccos_real), 5.0e-01, RES(1.0471975511965977462e0, 0.0)},
+ {FN (arccos_real), 7.50e-01, RES(7.2273424781341561118e-1, 0.0)},
+ {FN (arccos_real), 1.0e+00, RES(0e0, 0.0)},
+ {FN (arccos_real), 2.0e+00, RES(0, 1.3169578969248167086e0)},
+ {FN (arccos_real), 1.0e+01, RES(0, 2.9932228461263808979e0)},
+ {FN (arccosh_real), -1.0e+01, RES(2.9932228461263808979e0, 3.1415926535897932385e0)},
+ {FN (arccosh_real), -2.0e+00, RES(1.3169578969248167086e0, 3.1415926535897932385e0)},
+ {FN (arccosh_real), -1.0e+00, RES(0, 3.1415926535897932385e0)},
+ {FN (arccosh_real), -7.50e-01, RES(0, 2.4188584057763776273e0)},
+ {FN (arccosh_real), -5.0e-01, RES(0, 2.0943951023931954923e0)},
+ {FN (arccosh_real), -1.250e-01, RES(0, 1.6961241579629620161e0)},
+ {FN (arccosh_real), -3.45266983001243932001e-04, RES(0, 1.5711415937847577022e0)},
+ {FN (arccosh_real), -1.19209289550781250e-07, RES(0, 1.570796446004186170e0)},
+ {FN (arccosh_real), 0.0e+00, RES(0, 1.5707963267948966192e0)},
+ {FN (arccosh_real), 1.19209289550781250e-07, RES(0, 1.5707962075856070684e0)},
+ {FN (arccosh_real), 3.45266983001243932001e-04, RES(0, 1.5704510598050355363e0)},
+ {FN (arccosh_real), 1.250e-01, RES(0, 1.4454684956268312224e0)},
+ {FN (arccosh_real), 5.0e-01, RES(0, 1.0471975511965977462e0)},
+ {FN (arccosh_real), 7.50e-01, RES(0, 7.2273424781341561118e-1)},
+ {FN (arccosh_real), 1.0e+00, RES(0e0, 0.0)},
+ {FN (arccosh_real), 2.0e+00, RES(1.3169578969248167086e0, 0.0)},
+ {FN (arccosh_real), 1.0e+01, RES(2.9932228461263808979e0, 0.0)},
+ {FN (arctanh_real), -1.0e+01, RES(-1.0033534773107558064e-1, 1.5707963267948966192e0)},
+ {FN (arctanh_real), -2.0e+00, RES(-5.4930614433405484570e-1, 1.5707963267948966192e0)},
+ {FN (arctanh_real), -7.50e-01, RES(-9.7295507452765665255e-1, 0.0)},
+ {FN (arctanh_real), -5.0e-01, RES(-5.4930614433405484570e-1, 0.0)},
+ {FN (arctanh_real), -1.250e-01, RES(-1.2565721414045303884e-1, 0.0)},
+ {FN (arctanh_real), -3.45266983001243932001e-04, RES(-3.4526699672092216295e-4, 0.0)},
+ {FN (arctanh_real), -1.19209289550781250e-07, RES(-1.1920928955078181469e-7, 0.0)},
+ {FN (arctanh_real), 0.0e+00, RES(0e0, 0.0)},
+ {FN (arctanh_real), 1.19209289550781250e-07, RES(1.1920928955078181469e-7, 0.0)},
+ {FN (arctanh_real), 3.45266983001243932001e-04, RES(3.4526699672092216295e-4, 0.0)},
+ {FN (arctanh_real), 1.250e-01, RES(1.2565721414045303884e-1, 0.0)},
+ {FN (arctanh_real), 5.0e-01, RES(5.4930614433405484570e-1, 0.0)},
+ {FN (arctanh_real), 7.50e-01, RES(9.7295507452765665255e-1, 0.0)},
+ {FN (arctanh_real), 2.0e+00, RES(5.4930614433405484570e-1, -1.5707963267948966192e0)},
+ {FN (arctanh_real), 1.0e+01, RES(1.0033534773107558064e-1, -1.5707963267948966192e0)},
+ {FN (arccsc_real), -1.0e+01, RES(-1.0016742116155979635e-1, 0.0)},
+ {FN (arccsc_real), -2.0e+00, RES(-5.2359877559829887308e-1, 0.0)},
+ {FN (arccsc_real), -1.0e+00, RES(-1.5707963267948966192e0, 0.0)},
+ {FN (arccsc_real), -7.50e-01, RES(-1.5707963267948966192e0, 7.9536546122390563053e-1)},
+ {FN (arccsc_real), -5.0e-01, RES(-1.5707963267948966192e0, 1.3169578969248167086e0)},
+ {FN (arccsc_real), -1.250e-01, RES(-1.5707963267948966192e0, 2.7686593833135738327e0)},
+ {FN (arccsc_real), -3.45266983001243932001e-04, RES(-1.5707963267948966192e0, 8.6643397271969925794e0)},
+ {FN (arccsc_real), -1.19209289550781250e-07, RES(-1.5707963267948966192e0, 1.6635532333438683873e1)},
+ {FN (arccsc_real), 1.19209289550781250e-07, RES(1.5707963267948966192e0, -1.6635532333438683873e1)},
+ {FN (arccsc_real), 3.45266983001243932001e-04, RES(1.5707963267948966192e0, -8.6643397271969925794e0)},
+ {FN (arccsc_real), 1.250e-01, RES(1.5707963267948966192e0, -2.7686593833135738327e0)},
+ {FN (arccsc_real), 5.0e-01, RES(1.5707963267948966192e0, -1.3169578969248167086e0)},
+ {FN (arccsc_real), 7.50e-01, RES(1.5707963267948966192e0, -7.9536546122390563053e-1)},
+ {FN (arccsc_real), 1.0e+00, RES(1.5707963267948966192e0, 0.0)},
+ {FN (arccsc_real), 2.0e+00, RES(5.2359877559829887308e-1, 0.0)},
+ {FN (arccsc_real), 1.0e+01, RES(1.0016742116155979635e-1, 0.0)},
+ {FN (arcsec_real), -1.0e+01, RES(1.6709637479564564156e0, 0.0)},
+ {FN (arcsec_real), -2.0e+00, RES(2.0943951023931954923e0, 0.0)},
+ {FN (arcsec_real), -1.0e+00, RES(3.1415926535897932385e0, 0.0)},
+ {FN (arcsec_real), -7.50e-01, RES(3.1415926535897932385e0, -7.9536546122390563053e-1)},
+ {FN (arcsec_real), -5.0e-01, RES(3.1415926535897932385e0, -1.3169578969248167086e0)},
+ {FN (arcsec_real), -1.250e-01, RES(3.1415926535897932385e0, -2.7686593833135738327e0)},
+ {FN (arcsec_real), -3.45266983001243932001e-04, RES(3.1415926535897932385e0, -8.6643397271969925794e0)},
+ {FN (arcsec_real), -1.19209289550781250e-07, RES(3.1415926535897932385e0, -1.6635532333438683873e1)},
+ {FN (arcsec_real), 1.19209289550781250e-07, RES(0, 1.6635532333438683873e1)},
+ {FN (arcsec_real), 3.45266983001243932001e-04, RES(0, 8.6643397271969925794e0)},
+ {FN (arcsec_real), 1.250e-01, RES(0, 2.7686593833135738327e0)},
+ {FN (arcsec_real), 5.0e-01, RES(0, 1.3169578969248167086e0)},
+ {FN (arcsec_real), 7.50e-01, RES(0, 7.9536546122390563053e-1)},
+ {FN (arcsec_real), 1.0e+00, RES(0e0, 0.0)},
+ {FN (arcsec_real), 2.0e+00, RES(1.0471975511965977462e0, 0.0)},
+ {FN (arcsec_real), 1.0e+01, RES(1.4706289056333368229e0, 0.0)},
diff --git a/gsl-1.9/complex/test.c b/gsl-1.9/complex/test.c
new file mode 100644
index 0000000..7eb31cf
--- /dev/null
+++ b/gsl-1.9/complex/test.c
@@ -0,0 +1,159 @@
+/* complex/test.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_complex.h>
+#include <gsl/gsl_complex_math.h>
+
+struct f
+{
+ char *name;
+ double (*f) (gsl_complex z);
+ double x;
+ double y;
+ double fx;
+ double fy;
+};
+
+struct fz
+{
+ char *name;
+ gsl_complex (*f) (gsl_complex z);
+ double x;
+ double y;
+ double fx;
+ double fy;
+};
+
+struct freal
+{
+ char *name;
+ gsl_complex (*f) (double x);
+ double x;
+ double fx;
+ double fy;
+};
+
+
+#define FN(x) "gsl_complex_" #x, gsl_complex_ ## x
+#define ARG(x,y) x, y
+#define RES(x,y) x, y
+
+struct f list[] =
+{
+#include "results1.h"
+ {"", 0, 0, 0, 0, 0}
+};
+
+
+struct fz listz[] =
+{
+#include "results.h"
+ {"", 0, 0, 0, 0, 0}
+};
+
+struct freal listreal[] =
+{
+#include "results_real.h"
+ {"", 0, 0, 0, 0}
+};
+
+
+int
+main (void)
+{
+ size_t i = 0;
+
+ gsl_ieee_env_setup();
+
+
+ for (i = 0 ; i < 10; i++)
+ {
+ double r = (i - 5.0) * 0.3 ;
+ double t = 2.0 * M_PI * i / 5 ;
+ double x = r * cos(t), y = r * sin(t) ;
+ gsl_complex z = gsl_complex_polar (r, t) ;
+ gsl_test_rel (GSL_REAL(z), x, 10 * GSL_DBL_EPSILON, "gsl_complex_polar real part at (r=%g,t=%g)", r, t);
+
+ gsl_test_rel (GSL_IMAG(z), y, 10 * GSL_DBL_EPSILON, "gsl_complex_polar imag part at (r=%g,t=%g)", r, t);
+ }
+
+ i = 0;
+
+ while (list[i].f)
+ {
+ struct f t = list[i];
+ gsl_complex z = gsl_complex_rect (t.x, t.y);
+ double f = (t.f) (z);
+ gsl_test_rel (f, t.fx, 10 * GSL_DBL_EPSILON, "%s at (%g,%g)", t.name, t.x, t.y);
+ i++;
+ }
+
+ i = 0;
+
+ while (listz[i].f)
+ {
+ struct fz t = listz[i];
+ gsl_complex z = gsl_complex_rect (t.x, t.y);
+ gsl_complex fz = (t.f) (z);
+ double fx = GSL_REAL (fz), fy = GSL_IMAG (fz);
+
+#ifdef DEBUG
+ printf("x = "); gsl_ieee_fprintf_double (stdout, &t.x); printf("\n");
+ printf("y = "); gsl_ieee_fprintf_double (stdout, &t.y); printf("\n");
+ printf("fx = "); gsl_ieee_fprintf_double (stdout, &fx); printf("\n");
+ printf("ex = "); gsl_ieee_fprintf_double (stdout, &t.fx); printf("\n");
+ printf("fy = "); gsl_ieee_fprintf_double (stdout, &fy); printf("\n");
+ printf("ey = "); gsl_ieee_fprintf_double (stdout, &t.fy); printf("\n");
+#endif
+
+ gsl_test_rel (fx, t.fx, 10 * GSL_DBL_EPSILON, "%s real part at (%g,%g)", t.name, t.x, t.y);
+ gsl_test_rel (fy, t.fy, 10 * GSL_DBL_EPSILON, "%s imag part at (%g,%g)", t.name, t.x, t.y);
+ i++;
+ }
+
+
+ i = 0;
+
+ while (listreal[i].f)
+ {
+ struct freal t = listreal[i];
+ gsl_complex fz = (t.f) (t.x);
+ double fx = GSL_REAL (fz), fy = GSL_IMAG (fz);
+
+#ifdef DEBUG
+ printf("x = "); gsl_ieee_fprintf_double (stdout, &t.x); printf("\n");
+ printf("fx = "); gsl_ieee_fprintf_double (stdout, &fx); printf("\n");
+ printf("ex = "); gsl_ieee_fprintf_double (stdout, &t.fx); printf("\n");
+ printf("fy = "); gsl_ieee_fprintf_double (stdout, &fy); printf("\n");
+ printf("ey = "); gsl_ieee_fprintf_double (stdout, &t.fy); printf("\n");
+#endif
+
+ gsl_test_rel (fx, t.fx, 10 * GSL_DBL_EPSILON, "%s real part at (%g,0)", t.name, t.x);
+ gsl_test_rel (fy, t.fy, 10 * GSL_DBL_EPSILON, "%s imag part at (%g,0)", t.name, t.x);
+ i++;
+ }
+
+ exit (gsl_test_summary ());
+}
diff --git a/gsl-1.9/config.guess b/gsl-1.9/config.guess
new file mode 100755
index 0000000..e3ef63f
--- /dev/null
+++ b/gsl-1.9/config.guess
@@ -0,0 +1,1471 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+
+timestamp='2005-12-13'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Originally written by Per Bothner <per@bothner.com>.
+# Please send patches to <config-patches@gnu.org>. Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub. If it succeeds, it prints the system name on stdout, and
+# exits with 0. Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help" >&2
+ exit 1 ;;
+ * )
+ break ;;
+ esac
+done
+
+if test $# != 0; then
+ echo "$me: too many arguments$help" >&2
+ exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,) echo "int x;" > $dummy.c ;
+ for c in cc gcc c89 c99 ; do
+ if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+ CC_FOR_BUILD="$c"; break ;
+ fi ;
+ done ;
+ if test x"$CC_FOR_BUILD" = x ; then
+ CC_FOR_BUILD=no_compiler_found ;
+ fi
+ ;;
+ ,,*) CC_FOR_BUILD=$CC ;;
+ ,*,*) CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+ PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ *:NetBSD:*:*)
+ # NetBSD (nbsd) targets should (where applicable) match one or
+ # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+ # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
+ # switched to ELF, *-*-netbsd* would select the old
+ # object file format. This provides both forward
+ # compatibility and a consistent mechanism for selecting the
+ # object file format.
+ #
+ # Note: NetBSD doesn't particularly care about the vendor
+ # portion of the name. We always set it to "unknown".
+ sysctl="sysctl -n hw.machine_arch"
+ UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+ /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+ case "${UNAME_MACHINE_ARCH}" in
+ armeb) machine=armeb-unknown ;;
+ arm*) machine=arm-unknown ;;
+ sh3el) machine=shl-unknown ;;
+ sh3eb) machine=sh-unknown ;;
+ *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+ esac
+ # The Operating System including object format, if it has switched
+ # to ELF recently, or will in the future.
+ case "${UNAME_MACHINE_ARCH}" in
+ arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+ eval $set_cc_for_build
+ if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep __ELF__ >/dev/null
+ then
+ # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+ # Return netbsd for either. FIX?
+ os=netbsd
+ else
+ os=netbsdelf
+ fi
+ ;;
+ *)
+ os=netbsd
+ ;;
+ esac
+ # The OS release
+ # Debian GNU/NetBSD machines have a different userland, and
+ # thus, need a distinct triplet. However, they do not need
+ # kernel version information, so it can be replaced with a
+ # suitable tag, in the style of linux-gnu.
+ case "${UNAME_VERSION}" in
+ Debian*)
+ release='-gnu'
+ ;;
+ *)
+ release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ ;;
+ esac
+ # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+ # contains redundant information, the shorter form:
+ # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+ echo "${machine}-${os}${release}"
+ exit ;;
+ *:OpenBSD:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+ echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+ exit ;;
+ *:ekkoBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+ exit ;;
+ macppc:MirBSD:*:*)
+ echo powerppc-unknown-mirbsd${UNAME_RELEASE}
+ exit ;;
+ *:MirBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+ exit ;;
+ alpha:OSF1:*:*)
+ case $UNAME_RELEASE in
+ *4.0)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+ ;;
+ *5.*)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+ ;;
+ esac
+ # According to Compaq, /usr/sbin/psrinfo has been available on
+ # OSF/1 and Tru64 systems produced since 1995. I hope that
+ # covers most systems running today. This code pipes the CPU
+ # types through head -n 1, so we only detect the type of CPU 0.
+ ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+ case "$ALPHA_CPU_TYPE" in
+ "EV4 (21064)")
+ UNAME_MACHINE="alpha" ;;
+ "EV4.5 (21064)")
+ UNAME_MACHINE="alpha" ;;
+ "LCA4 (21066/21068)")
+ UNAME_MACHINE="alpha" ;;
+ "EV5 (21164)")
+ UNAME_MACHINE="alphaev5" ;;
+ "EV5.6 (21164A)")
+ UNAME_MACHINE="alphaev56" ;;
+ "EV5.6 (21164PC)")
+ UNAME_MACHINE="alphapca56" ;;
+ "EV5.7 (21164PC)")
+ UNAME_MACHINE="alphapca57" ;;
+ "EV6 (21264)")
+ UNAME_MACHINE="alphaev6" ;;
+ "EV6.7 (21264A)")
+ UNAME_MACHINE="alphaev67" ;;
+ "EV6.8CB (21264C)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.8AL (21264B)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.8CX (21264D)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.9A (21264/EV69A)")
+ UNAME_MACHINE="alphaev69" ;;
+ "EV7 (21364)")
+ UNAME_MACHINE="alphaev7" ;;
+ "EV7.9 (21364A)")
+ UNAME_MACHINE="alphaev79" ;;
+ esac
+ # A Pn.n version is a patched version.
+ # A Vn.n version is a released version.
+ # A Tn.n version is a released field test version.
+ # A Xn.n version is an unreleased experimental baselevel.
+ # 1.2 uses "1.2" for uname -r.
+ echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ exit ;;
+ Alpha\ *:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # Should we change UNAME_MACHINE based on the output of uname instead
+ # of the specific Alpha model?
+ echo alpha-pc-interix
+ exit ;;
+ 21064:Windows_NT:50:3)
+ echo alpha-dec-winnt3.5
+ exit ;;
+ Amiga*:UNIX_System_V:4.0:*)
+ echo m68k-unknown-sysv4
+ exit ;;
+ *:[Aa]miga[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-amigaos
+ exit ;;
+ *:[Mm]orph[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-morphos
+ exit ;;
+ *:OS/390:*:*)
+ echo i370-ibm-openedition
+ exit ;;
+ *:z/VM:*:*)
+ echo s390-ibm-zvmoe
+ exit ;;
+ *:OS400:*:*)
+ echo powerpc-ibm-os400
+ exit ;;
+ arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+ echo arm-acorn-riscix${UNAME_RELEASE}
+ exit ;;
+ arm:riscos:*:*|arm:RISCOS:*:*)
+ echo arm-unknown-riscos
+ exit ;;
+ SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+ echo hppa1.1-hitachi-hiuxmpp
+ exit ;;
+ Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+ # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+ if test "`(/bin/universe) 2>/dev/null`" = att ; then
+ echo pyramid-pyramid-sysv3
+ else
+ echo pyramid-pyramid-bsd
+ fi
+ exit ;;
+ NILE*:*:*:dcosx)
+ echo pyramid-pyramid-svr4
+ exit ;;
+ DRS?6000:unix:4.0:6*)
+ echo sparc-icl-nx6
+ exit ;;
+ DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+ case `/usr/bin/uname -p` in
+ sparc) echo sparc-icl-nx7; exit ;;
+ esac ;;
+ sun4H:SunOS:5.*:*)
+ echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+ echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ i86pc:SunOS:5.*:*)
+ echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:6*:*)
+ # According to config.sub, this is the proper way to canonicalize
+ # SunOS6. Hard to guess exactly what SunOS6 will be like, but
+ # it's likely to be more like Solaris than SunOS4.
+ echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:*:*)
+ case "`/usr/bin/arch -k`" in
+ Series*|S4*)
+ UNAME_RELEASE=`uname -v`
+ ;;
+ esac
+ # Japanese Language versions have a version number like `4.1.3-JL'.
+ echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+ exit ;;
+ sun3*:SunOS:*:*)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ exit ;;
+ sun*:*:4.2BSD:*)
+ UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+ test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+ case "`/bin/arch`" in
+ sun3)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ ;;
+ sun4)
+ echo sparc-sun-sunos${UNAME_RELEASE}
+ ;;
+ esac
+ exit ;;
+ aushp:SunOS:*:*)
+ echo sparc-auspex-sunos${UNAME_RELEASE}
+ exit ;;
+ # The situation for MiNT is a little confusing. The machine name
+ # can be virtually everything (everything which is not
+ # "atarist" or "atariste" at least should have a processor
+ # > m68000). The system name ranges from "MiNT" over "FreeMiNT"
+ # to the lowercase version "mint" (or "freemint"). Finally
+ # the system name "TOS" denotes a system which is actually not
+ # MiNT. But MiNT is downward compatible to TOS, so this should
+ # be no problem.
+ atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+ echo m68k-milan-mint${UNAME_RELEASE}
+ exit ;;
+ hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+ echo m68k-hades-mint${UNAME_RELEASE}
+ exit ;;
+ *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+ echo m68k-unknown-mint${UNAME_RELEASE}
+ exit ;;
+ m68k:machten:*:*)
+ echo m68k-apple-machten${UNAME_RELEASE}
+ exit ;;
+ powerpc:machten:*:*)
+ echo powerpc-apple-machten${UNAME_RELEASE}
+ exit ;;
+ RISC*:Mach:*:*)
+ echo mips-dec-mach_bsd4.3
+ exit ;;
+ RISC*:ULTRIX:*:*)
+ echo mips-dec-ultrix${UNAME_RELEASE}
+ exit ;;
+ VAX*:ULTRIX*:*:*)
+ echo vax-dec-ultrix${UNAME_RELEASE}
+ exit ;;
+ 2020:CLIX:*:* | 2430:CLIX:*:*)
+ echo clipper-intergraph-clix${UNAME_RELEASE}
+ exit ;;
+ mips:*:*:UMIPS | mips:*:*:RISCos)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h> /* for printf() prototype */
+ int main (int argc, char *argv[]) {
+#else
+ int main (argc, argv) int argc; char *argv[]; {
+#endif
+ #if defined (host_mips) && defined (MIPSEB)
+ #if defined (SYSTYPE_SYSV)
+ printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_SVR4)
+ printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+ printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+ #endif
+ #endif
+ exit (-1);
+ }
+EOF
+ $CC_FOR_BUILD -o $dummy $dummy.c &&
+ dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+ SYSTEM_NAME=`$dummy $dummyarg` &&
+ { echo "$SYSTEM_NAME"; exit; }
+ echo mips-mips-riscos${UNAME_RELEASE}
+ exit ;;
+ Motorola:PowerMAX_OS:*:*)
+ echo powerpc-motorola-powermax
+ exit ;;
+ Motorola:*:4.3:PL8-*)
+ echo powerpc-harris-powermax
+ exit ;;
+ Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+ echo powerpc-harris-powermax
+ exit ;;
+ Night_Hawk:Power_UNIX:*:*)
+ echo powerpc-harris-powerunix
+ exit ;;
+ m88k:CX/UX:7*:*)
+ echo m88k-harris-cxux7
+ exit ;;
+ m88k:*:4*:R4*)
+ echo m88k-motorola-sysv4
+ exit ;;
+ m88k:*:3*:R3*)
+ echo m88k-motorola-sysv3
+ exit ;;
+ AViiON:dgux:*:*)
+ # DG/UX returns AViiON for all architectures
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+ then
+ if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+ [ ${TARGET_BINARY_INTERFACE}x = x ]
+ then
+ echo m88k-dg-dgux${UNAME_RELEASE}
+ else
+ echo m88k-dg-dguxbcs${UNAME_RELEASE}
+ fi
+ else
+ echo i586-dg-dgux${UNAME_RELEASE}
+ fi
+ exit ;;
+ M88*:DolphinOS:*:*) # DolphinOS (SVR3)
+ echo m88k-dolphin-sysv3
+ exit ;;
+ M88*:*:R3*:*)
+ # Delta 88k system running SVR3
+ echo m88k-motorola-sysv3
+ exit ;;
+ XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+ echo m88k-tektronix-sysv3
+ exit ;;
+ Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+ echo m68k-tektronix-bsd
+ exit ;;
+ *:IRIX*:*:*)
+ echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+ exit ;;
+ ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+ echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
+ exit ;; # Note that: echo "'`uname -s`'" gives 'AIX '
+ i*86:AIX:*:*)
+ echo i386-ibm-aix
+ exit ;;
+ ia64:AIX:*:*)
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ fi
+ echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+ exit ;;
+ *:AIX:2:3)
+ if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <sys/systemcfg.h>
+
+ main()
+ {
+ if (!__power_pc())
+ exit(1);
+ puts("powerpc-ibm-aix3.2.5");
+ exit(0);
+ }
+EOF
+ if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+ then
+ echo "$SYSTEM_NAME"
+ else
+ echo rs6000-ibm-aix3.2.5
+ fi
+ elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+ echo rs6000-ibm-aix3.2.4
+ else
+ echo rs6000-ibm-aix3.2
+ fi
+ exit ;;
+ *:AIX:*:[45])
+ IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+ if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+ IBM_ARCH=rs6000
+ else
+ IBM_ARCH=powerpc
+ fi
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ fi
+ echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+ exit ;;
+ *:AIX:*:*)
+ echo rs6000-ibm-aix
+ exit ;;
+ ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+ echo romp-ibm-bsd4.4
+ exit ;;
+ ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
+ echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
+ exit ;; # report: romp-ibm BSD 4.3
+ *:BOSX:*:*)
+ echo rs6000-bull-bosx
+ exit ;;
+ DPX/2?00:B.O.S.:*:*)
+ echo m68k-bull-sysv3
+ exit ;;
+ 9000/[34]??:4.3bsd:1.*:*)
+ echo m68k-hp-bsd
+ exit ;;
+ hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+ echo m68k-hp-bsd4.4
+ exit ;;
+ 9000/[34678]??:HP-UX:*:*)
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ case "${UNAME_MACHINE}" in
+ 9000/31? ) HP_ARCH=m68000 ;;
+ 9000/[34]?? ) HP_ARCH=m68k ;;
+ 9000/[678][0-9][0-9])
+ if [ -x /usr/bin/getconf ]; then
+ sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+ sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+ case "${sc_cpu_version}" in
+ 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+ 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+ 532) # CPU_PA_RISC2_0
+ case "${sc_kernel_bits}" in
+ 32) HP_ARCH="hppa2.0n" ;;
+ 64) HP_ARCH="hppa2.0w" ;;
+ '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20
+ esac ;;
+ esac
+ fi
+ if [ "${HP_ARCH}" = "" ]; then
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+
+ #define _HPUX_SOURCE
+ #include <stdlib.h>
+ #include <unistd.h>
+
+ int main ()
+ {
+ #if defined(_SC_KERNEL_BITS)
+ long bits = sysconf(_SC_KERNEL_BITS);
+ #endif
+ long cpu = sysconf (_SC_CPU_VERSION);
+
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+ case CPU_PA_RISC2_0:
+ #if defined(_SC_KERNEL_BITS)
+ switch (bits)
+ {
+ case 64: puts ("hppa2.0w"); break;
+ case 32: puts ("hppa2.0n"); break;
+ default: puts ("hppa2.0"); break;
+ } break;
+ #else /* !defined(_SC_KERNEL_BITS) */
+ puts ("hppa2.0"); break;
+ #endif
+ default: puts ("hppa1.0"); break;
+ }
+ exit (0);
+ }
+EOF
+ (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+ test -z "$HP_ARCH" && HP_ARCH=hppa
+ fi ;;
+ esac
+ if [ ${HP_ARCH} = "hppa2.0w" ]
+ then
+ eval $set_cc_for_build
+
+ # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+ # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler
+ # generating 64-bit code. GNU and HP use different nomenclature:
+ #
+ # $ CC_FOR_BUILD=cc ./config.guess
+ # => hppa2.0w-hp-hpux11.23
+ # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+ # => hppa64-hp-hpux11.23
+
+ if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+ grep __LP64__ >/dev/null
+ then
+ HP_ARCH="hppa2.0w"
+ else
+ HP_ARCH="hppa64"
+ fi
+ fi
+ echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+ exit ;;
+ ia64:HP-UX:*:*)
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ echo ia64-hp-hpux${HPUX_REV}
+ exit ;;
+ 3050*:HI-UX:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <unistd.h>
+ int
+ main ()
+ {
+ long cpu = sysconf (_SC_CPU_VERSION);
+ /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+ true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
+ results, however. */
+ if (CPU_IS_PA_RISC (cpu))
+ {
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+ default: puts ("hppa-hitachi-hiuxwe2"); break;
+ }
+ }
+ else if (CPU_IS_HP_MC68K (cpu))
+ puts ("m68k-hitachi-hiuxwe2");
+ else puts ("unknown-hitachi-hiuxwe2");
+ exit (0);
+ }
+EOF
+ $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+ { echo "$SYSTEM_NAME"; exit; }
+ echo unknown-hitachi-hiuxwe2
+ exit ;;
+ 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+ echo hppa1.1-hp-bsd
+ exit ;;
+ 9000/8??:4.3bsd:*:*)
+ echo hppa1.0-hp-bsd
+ exit ;;
+ *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+ echo hppa1.0-hp-mpeix
+ exit ;;
+ hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+ echo hppa1.1-hp-osf
+ exit ;;
+ hp8??:OSF1:*:*)
+ echo hppa1.0-hp-osf
+ exit ;;
+ i*86:OSF1:*:*)
+ if [ -x /usr/sbin/sysversion ] ; then
+ echo ${UNAME_MACHINE}-unknown-osf1mk
+ else
+ echo ${UNAME_MACHINE}-unknown-osf1
+ fi
+ exit ;;
+ parisc*:Lites*:*:*)
+ echo hppa1.1-hp-lites
+ exit ;;
+ C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+ echo c1-convex-bsd
+ exit ;;
+ C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit ;;
+ C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+ echo c34-convex-bsd
+ exit ;;
+ C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+ echo c38-convex-bsd
+ exit ;;
+ C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+ echo c4-convex-bsd
+ exit ;;
+ CRAY*Y-MP:*:*:*)
+ echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*[A-Z]90:*:*:*)
+ echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+ -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*TS:*:*:*)
+ echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*T3E:*:*:*)
+ echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*SV1:*:*:*)
+ echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ *:UNICOS/mp:*:*)
+ echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+ FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+ echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit ;;
+ 5000:UNIX_System_V:4.*:*)
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+ echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit ;;
+ i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+ echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+ exit ;;
+ sparc*:BSD/OS:*:*)
+ echo sparc-unknown-bsdi${UNAME_RELEASE}
+ exit ;;
+ *:BSD/OS:*:*)
+ echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+ exit ;;
+ *:FreeBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+ exit ;;
+ i*:CYGWIN*:*)
+ echo ${UNAME_MACHINE}-pc-cygwin
+ exit ;;
+ i*:MINGW*:*)
+ echo ${UNAME_MACHINE}-pc-mingw32
+ exit ;;
+ i*:windows32*:*)
+ # uname -m includes "-pc" on this system.
+ echo ${UNAME_MACHINE}-mingw32
+ exit ;;
+ i*:PW*:*)
+ echo ${UNAME_MACHINE}-pc-pw32
+ exit ;;
+ x86:Interix*:[345]*)
+ echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//'
+ exit ;;
+ [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+ echo i${UNAME_MACHINE}-pc-mks
+ exit ;;
+ i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+ # UNAME_MACHINE based on the output of uname instead of i386?
+ echo i586-pc-interix
+ exit ;;
+ i*:UWIN*:*)
+ echo ${UNAME_MACHINE}-pc-uwin
+ exit ;;
+ amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+ echo x86_64-unknown-cygwin
+ exit ;;
+ p*:CYGWIN*:*)
+ echo powerpcle-unknown-cygwin
+ exit ;;
+ prep*:SunOS:5.*:*)
+ echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ *:GNU:*:*)
+ # the GNU system
+ echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+ exit ;;
+ *:GNU/*:*:*)
+ # other systems with GNU libc and userland
+ echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+ exit ;;
+ i*86:Minix:*:*)
+ echo ${UNAME_MACHINE}-pc-minix
+ exit ;;
+ arm*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ cris:Linux:*:*)
+ echo cris-axis-linux-gnu
+ exit ;;
+ crisv32:Linux:*:*)
+ echo crisv32-axis-linux-gnu
+ exit ;;
+ frv:Linux:*:*)
+ echo frv-unknown-linux-gnu
+ exit ;;
+ ia64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ m32r*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ m68*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ mips:Linux:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+ #undef mips
+ #undef mipsel
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ CPU=mipsel
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ CPU=mips
+ #else
+ CPU=
+ #endif
+ #endif
+EOF
+ eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '/^CPU/{s: ::g;p;}'`"
+ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+ ;;
+ mips64:Linux:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+ #undef mips64
+ #undef mips64el
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ CPU=mips64el
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ CPU=mips64
+ #else
+ CPU=
+ #endif
+ #endif
+EOF
+ eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '/^CPU/{s: ::g;p;}'`"
+ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+ ;;
+ or32:Linux:*:*)
+ echo or32-unknown-linux-gnu
+ exit ;;
+ ppc:Linux:*:*)
+ echo powerpc-unknown-linux-gnu
+ exit ;;
+ ppc64:Linux:*:*)
+ echo powerpc64-unknown-linux-gnu
+ exit ;;
+ alpha:Linux:*:*)
+ case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+ EV5) UNAME_MACHINE=alphaev5 ;;
+ EV56) UNAME_MACHINE=alphaev56 ;;
+ PCA56) UNAME_MACHINE=alphapca56 ;;
+ PCA57) UNAME_MACHINE=alphapca56 ;;
+ EV6) UNAME_MACHINE=alphaev6 ;;
+ EV67) UNAME_MACHINE=alphaev67 ;;
+ EV68*) UNAME_MACHINE=alphaev68 ;;
+ esac
+ objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
+ if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+ echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+ exit ;;
+ parisc:Linux:*:* | hppa:Linux:*:*)
+ # Look for CPU level
+ case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+ PA7*) echo hppa1.1-unknown-linux-gnu ;;
+ PA8*) echo hppa2.0-unknown-linux-gnu ;;
+ *) echo hppa-unknown-linux-gnu ;;
+ esac
+ exit ;;
+ parisc64:Linux:*:* | hppa64:Linux:*:*)
+ echo hppa64-unknown-linux-gnu
+ exit ;;
+ s390:Linux:*:* | s390x:Linux:*:*)
+ echo ${UNAME_MACHINE}-ibm-linux
+ exit ;;
+ sh64*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ sh*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ sparc:Linux:*:* | sparc64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ vax:Linux:*:*)
+ echo ${UNAME_MACHINE}-dec-linux-gnu
+ exit ;;
+ x86_64:Linux:*:*)
+ echo x86_64-unknown-linux-gnu
+ exit ;;
+ i*86:Linux:*:*)
+ # The BFD linker knows what the default object file format is, so
+ # first see if it will tell us. cd to the root directory to prevent
+ # problems with other programs or directories called `ld' in the path.
+ # Set LC_ALL=C to ensure ld outputs messages in English.
+ ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
+ | sed -ne '/supported targets:/!d
+ s/[ ][ ]*/ /g
+ s/.*supported targets: *//
+ s/ .*//
+ p'`
+ case "$ld_supported_targets" in
+ elf32-i386)
+ TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+ ;;
+ a.out-i386-linux)
+ echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+ exit ;;
+ coff-i386)
+ echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+ exit ;;
+ "")
+ # Either a pre-BFD a.out linker (linux-gnuoldld) or
+ # one that does not give us useful --help.
+ echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+ exit ;;
+ esac
+ # Determine whether the default compiler is a.out or elf
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <features.h>
+ #ifdef __ELF__
+ # ifdef __GLIBC__
+ # if __GLIBC__ >= 2
+ LIBC=gnu
+ # else
+ LIBC=gnulibc1
+ # endif
+ # else
+ LIBC=gnulibc1
+ # endif
+ #else
+ #if defined(__INTEL_COMPILER) || defined(__PGI)
+ LIBC=gnu
+ #else
+ LIBC=gnuaout
+ #endif
+ #endif
+ #ifdef __dietlibc__
+ LIBC=dietlibc
+ #endif
+EOF
+ eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '/^LIBC/{s: ::g;p;}'`"
+ test x"${LIBC}" != x && {
+ echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+ exit
+ }
+ test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; }
+ ;;
+ i*86:DYNIX/ptx:4*:*)
+ # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+ # earlier versions are messed up and put the nodename in both
+ # sysname and nodename.
+ echo i386-sequent-sysv4
+ exit ;;
+ i*86:UNIX_SV:4.2MP:2.*)
+ # Unixware is an offshoot of SVR4, but it has its own version
+ # number series starting with 2...
+ # I am not positive that other SVR4 systems won't match this,
+ # I just have to hope. -- rms.
+ # Use sysv4.2uw... so that sysv4* matches it.
+ echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+ exit ;;
+ i*86:OS/2:*:*)
+ # If we were able to find `uname', then EMX Unix compatibility
+ # is probably installed.
+ echo ${UNAME_MACHINE}-pc-os2-emx
+ exit ;;
+ i*86:XTS-300:*:STOP)
+ echo ${UNAME_MACHINE}-unknown-stop
+ exit ;;
+ i*86:atheos:*:*)
+ echo ${UNAME_MACHINE}-unknown-atheos
+ exit ;;
+ i*86:syllable:*:*)
+ echo ${UNAME_MACHINE}-pc-syllable
+ exit ;;
+ i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
+ echo i386-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ i*86:*DOS:*:*)
+ echo ${UNAME_MACHINE}-pc-msdosdjgpp
+ exit ;;
+ i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+ UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+ if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+ echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+ else
+ echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+ fi
+ exit ;;
+ i*86:*:5:[678]*)
+ # UnixWare 7.x, OpenUNIX and OpenServer 6.
+ case `/bin/uname -X | grep "^Machine"` in
+ *486*) UNAME_MACHINE=i486 ;;
+ *Pentium) UNAME_MACHINE=i586 ;;
+ *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+ esac
+ echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+ exit ;;
+ i*86:*:3.2:*)
+ if test -f /usr/options/cb.name; then
+ UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+ echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+ elif /bin/uname -X 2>/dev/null >/dev/null ; then
+ UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+ (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+ (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+ && UNAME_MACHINE=i586
+ (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+ && UNAME_MACHINE=i686
+ (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+ && UNAME_MACHINE=i686
+ echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+ else
+ echo ${UNAME_MACHINE}-pc-sysv32
+ fi
+ exit ;;
+ pc:*:*:*)
+ # Left here for compatibility:
+ # uname -m prints for DJGPP always 'pc', but it prints nothing about
+ # the processor, so we play safe by assuming i386.
+ echo i386-pc-msdosdjgpp
+ exit ;;
+ Intel:Mach:3*:*)
+ echo i386-pc-mach3
+ exit ;;
+ paragon:*:*:*)
+ echo i860-intel-osf1
+ exit ;;
+ i860:*:4.*:*) # i860-SVR4
+ if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+ echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+ else # Add other i860-SVR4 vendors below as they are discovered.
+ echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
+ fi
+ exit ;;
+ mini*:CTIX:SYS*5:*)
+ # "miniframe"
+ echo m68010-convergent-sysv
+ exit ;;
+ mc68k:UNIX:SYSTEM5:3.51m)
+ echo m68k-convergent-sysv
+ exit ;;
+ M680?0:D-NIX:5.3:*)
+ echo m68k-diab-dnix
+ exit ;;
+ M68*:*:R3V[5678]*:*)
+ test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+ 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+ OS_REL=''
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+ 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4; exit; } ;;
+ m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+ echo m68k-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ mc68030:UNIX_System_V:4.*:*)
+ echo m68k-atari-sysv4
+ exit ;;
+ TSUNAMI:LynxOS:2.*:*)
+ echo sparc-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ rs6000:LynxOS:2.*:*)
+ echo rs6000-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
+ echo powerpc-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ SM[BE]S:UNIX_SV:*:*)
+ echo mips-dde-sysv${UNAME_RELEASE}
+ exit ;;
+ RM*:ReliantUNIX-*:*:*)
+ echo mips-sni-sysv4
+ exit ;;
+ RM*:SINIX-*:*:*)
+ echo mips-sni-sysv4
+ exit ;;
+ *:SINIX-*:*:*)
+ if uname -p 2>/dev/null >/dev/null ; then
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ echo ${UNAME_MACHINE}-sni-sysv4
+ else
+ echo ns32k-sni-sysv
+ fi
+ exit ;;
+ PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+ # says <Richard.M.Bartel@ccMail.Census.GOV>
+ echo i586-unisys-sysv4
+ exit ;;
+ *:UNIX_System_V:4*:FTX*)
+ # From Gerald Hewes <hewes@openmarket.com>.
+ # How about differentiating between stratus architectures? -djm
+ echo hppa1.1-stratus-sysv4
+ exit ;;
+ *:*:*:FTX*)
+ # From seanf@swdc.stratus.com.
+ echo i860-stratus-sysv4
+ exit ;;
+ i*86:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ echo ${UNAME_MACHINE}-stratus-vos
+ exit ;;
+ *:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ echo hppa1.1-stratus-vos
+ exit ;;
+ mc68*:A/UX:*:*)
+ echo m68k-apple-aux${UNAME_RELEASE}
+ exit ;;
+ news*:NEWS-OS:6*:*)
+ echo mips-sony-newsos6
+ exit ;;
+ R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+ if [ -d /usr/nec ]; then
+ echo mips-nec-sysv${UNAME_RELEASE}
+ else
+ echo mips-unknown-sysv${UNAME_RELEASE}
+ fi
+ exit ;;
+ BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
+ echo powerpc-be-beos
+ exit ;;
+ BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
+ echo powerpc-apple-beos
+ exit ;;
+ BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
+ echo i586-pc-beos
+ exit ;;
+ SX-4:SUPER-UX:*:*)
+ echo sx4-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-5:SUPER-UX:*:*)
+ echo sx5-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-6:SUPER-UX:*:*)
+ echo sx6-nec-superux${UNAME_RELEASE}
+ exit ;;
+ Power*:Rhapsody:*:*)
+ echo powerpc-apple-rhapsody${UNAME_RELEASE}
+ exit ;;
+ *:Rhapsody:*:*)
+ echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+ exit ;;
+ *:Darwin:*:*)
+ UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+ case $UNAME_PROCESSOR in
+ unknown) UNAME_PROCESSOR=powerpc ;;
+ esac
+ echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+ exit ;;
+ *:procnto*:*:* | *:QNX:[0123456789]*:*)
+ UNAME_PROCESSOR=`uname -p`
+ if test "$UNAME_PROCESSOR" = "x86"; then
+ UNAME_PROCESSOR=i386
+ UNAME_MACHINE=pc
+ fi
+ echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+ exit ;;
+ *:QNX:*:4*)
+ echo i386-pc-qnx
+ exit ;;
+ NSE-?:NONSTOP_KERNEL:*:*)
+ echo nse-tandem-nsk${UNAME_RELEASE}
+ exit ;;
+ NSR-?:NONSTOP_KERNEL:*:*)
+ echo nsr-tandem-nsk${UNAME_RELEASE}
+ exit ;;
+ *:NonStop-UX:*:*)
+ echo mips-compaq-nonstopux
+ exit ;;
+ BS2000:POSIX*:*:*)
+ echo bs2000-siemens-sysv
+ exit ;;
+ DS/*:UNIX_System_V:*:*)
+ echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+ exit ;;
+ *:Plan9:*:*)
+ # "uname -m" is not consistent, so use $cputype instead. 386
+ # is converted to i386 for consistency with other x86
+ # operating systems.
+ if test "$cputype" = "386"; then
+ UNAME_MACHINE=i386
+ else
+ UNAME_MACHINE="$cputype"
+ fi
+ echo ${UNAME_MACHINE}-unknown-plan9
+ exit ;;
+ *:TOPS-10:*:*)
+ echo pdp10-unknown-tops10
+ exit ;;
+ *:TENEX:*:*)
+ echo pdp10-unknown-tenex
+ exit ;;
+ KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+ echo pdp10-dec-tops20
+ exit ;;
+ XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+ echo pdp10-xkl-tops20
+ exit ;;
+ *:TOPS-20:*:*)
+ echo pdp10-unknown-tops20
+ exit ;;
+ *:ITS:*:*)
+ echo pdp10-unknown-its
+ exit ;;
+ SEI:*:*:SEIUX)
+ echo mips-sei-seiux${UNAME_RELEASE}
+ exit ;;
+ *:DragonFly:*:*)
+ echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+ exit ;;
+ *:*VMS:*:*)
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ case "${UNAME_MACHINE}" in
+ A*) echo alpha-dec-vms ; exit ;;
+ I*) echo ia64-dec-vms ; exit ;;
+ V*) echo vax-dec-vms ; exit ;;
+ esac ;;
+ *:XENIX:*:SysV)
+ echo i386-pc-xenix
+ exit ;;
+ i*86:skyos:*:*)
+ echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+ exit ;;
+ i*86:rdos:*:*)
+ echo ${UNAME_MACHINE}-pc-rdos
+ exit ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+ /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
+ I don't know.... */
+ printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+ printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+ "4"
+#else
+ ""
+#endif
+ ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+ printf ("arm-acorn-riscix\n"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+ printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+ int version;
+ version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+ if (version < 4)
+ printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+ else
+ printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+ exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+ printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+ printf ("ns32k-encore-mach\n"); exit (0);
+#else
+ printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+ printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+ printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+ printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+ struct utsname un;
+
+ uname(&un);
+
+ if (strncmp(un.version, "V2", 2) == 0) {
+ printf ("i386-sequent-ptx2\n"); exit (0);
+ }
+ if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+ printf ("i386-sequent-ptx1\n"); exit (0);
+ }
+ printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+# include <sys/param.h>
+# if defined (BSD)
+# if BSD == 43
+ printf ("vax-dec-bsd4.3\n"); exit (0);
+# else
+# if BSD == 199006
+ printf ("vax-dec-bsd4.3reno\n"); exit (0);
+# else
+ printf ("vax-dec-bsd\n"); exit (0);
+# endif
+# endif
+# else
+ printf ("vax-dec-bsd\n"); exit (0);
+# endif
+# else
+ printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+ printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+ exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+ { echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+ case `getsysinfo -f cpu_type` in
+ c1*)
+ echo c1-convex-bsd
+ exit ;;
+ c2*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit ;;
+ c34*)
+ echo c34-convex-bsd
+ exit ;;
+ c38*)
+ echo c38-convex-bsd
+ exit ;;
+ c4*)
+ echo c4-convex-bsd
+ exit ;;
+ esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+ http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess
+and
+ http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo = `(hostinfo) 2>/dev/null`
+/bin/universe = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/gsl-1.9/config.h.in b/gsl-1.9/config.h.in
new file mode 100644
index 0000000..4f2e957
--- /dev/null
+++ b/gsl-1.9/config.h.in
@@ -0,0 +1,282 @@
+/* config.h.in. Generated from configure.ac by autoheader. */
+
+/* Define to 1 if you have the declaration of `acosh', and to 0 if you don't.
+ */
+#undef HAVE_DECL_ACOSH
+
+/* Define to 1 if you have the declaration of `asinh', and to 0 if you don't.
+ */
+#undef HAVE_DECL_ASINH
+
+/* Define to 1 if you have the declaration of `atanh', and to 0 if you don't.
+ */
+#undef HAVE_DECL_ATANH
+
+/* Define to 1 if you have the declaration of `expm1', and to 0 if you don't.
+ */
+#undef HAVE_DECL_EXPM1
+
+/* Define to 1 if you have the declaration of `feenableexcept', and to 0 if
+ you don't. */
+#undef HAVE_DECL_FEENABLEEXCEPT
+
+/* Define to 1 if you have the declaration of `fesettrapenable', and to 0 if
+ you don't. */
+#undef HAVE_DECL_FESETTRAPENABLE
+
+/* Define to 1 if you have the declaration of `finite', and to 0 if you don't.
+ */
+#undef HAVE_DECL_FINITE
+
+/* Define to 1 if you have the declaration of `frexp', and to 0 if you don't.
+ */
+#undef HAVE_DECL_FREXP
+
+/* Define to 1 if you have the declaration of `hypot', and to 0 if you don't.
+ */
+#undef HAVE_DECL_HYPOT
+
+/* Define to 1 if you have the declaration of `isfinite', and to 0 if you
+ don't. */
+#undef HAVE_DECL_ISFINITE
+
+/* Define to 1 if you have the declaration of `isinf', and to 0 if you don't.
+ */
+#undef HAVE_DECL_ISINF
+
+/* Define to 1 if you have the declaration of `isnan', and to 0 if you don't.
+ */
+#undef HAVE_DECL_ISNAN
+
+/* Define to 1 if you have the declaration of `ldexp', and to 0 if you don't.
+ */
+#undef HAVE_DECL_LDEXP
+
+/* Define to 1 if you have the declaration of `log1p', and to 0 if you don't.
+ */
+#undef HAVE_DECL_LOG1P
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */
+#undef HAVE_DOPRNT
+
+/* Define to 1 if you have the <ieeefp.h> header file. */
+#undef HAVE_IEEEFP_H
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the `m' library (-lm). */
+#undef HAVE_LIBM
+
+/* Define to 1 if you have the `memcpy' function. */
+#undef HAVE_MEMCPY
+
+/* Define to 1 if you have the `memmove' function. */
+#undef HAVE_MEMMOVE
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the `strdup' function. */
+#undef HAVE_STRDUP
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the `strtol' function. */
+#undef HAVE_STRTOL
+
+/* Define to 1 if you have the `strtoul' function. */
+#undef HAVE_STRTOUL
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to 1 if you have the `vprintf' function. */
+#undef HAVE_VPRINTF
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Version number of package */
+#undef VERSION
+
+/* Define to `__inline__' or `__inline' if that's what the C compiler
+ calls it, or to nothing if 'inline' is not supported under any name. */
+#ifndef __cplusplus
+#undef inline
+#endif
+
+/* Define to `unsigned' if <sys/types.h> does not define. */
+#undef size_t
+
+/* Define to empty if the keyword `volatile' does not work. Warning: valid
+ code using `volatile' can become incorrect without. Disable with care. */
+#undef volatile
+
+/* Defined if this is an official release */
+#undef RELEASED
+
+/* Define if you have inline */
+#undef HAVE_INLINE
+
+/* Define if you need to hide the static definitions of inline functions */
+#undef HIDE_INLINE_STATIC
+
+/* Defined if you have ansi EXIT_SUCCESS and EXIT_FAILURE in stdlib.h */
+#undef HAVE_EXIT_SUCCESS_AND_FAILURE
+
+/* Use 0 and 1 for EXIT_SUCCESS and EXIT_FAILURE if we don't have them */
+#if !HAVE_EXIT_SUCCESS_AND_FAILURE
+#define EXIT_SUCCESS 0
+#define EXIT_FAILURE 1
+#endif
+
+/* Define this if printf can handle %Lf for long double */
+#undef HAVE_PRINTF_LONGDOUBLE
+
+/* Define one of these if you have a known IEEE arithmetic interface */
+#undef HAVE_GNUSPARC_IEEE_INTERFACE
+#undef HAVE_GNUM68K_IEEE_INTERFACE
+#undef HAVE_GNUPPC_IEEE_INTERFACE
+#undef HAVE_GNUX86_IEEE_INTERFACE
+#undef HAVE_SUNOS4_IEEE_INTERFACE
+#undef HAVE_SOLARIS_IEEE_INTERFACE
+#undef HAVE_HPUX11_IEEE_INTERFACE
+#undef HAVE_HPUX_IEEE_INTERFACE
+#undef HAVE_TRU64_IEEE_INTERFACE
+#undef HAVE_IRIX_IEEE_INTERFACE
+#undef HAVE_AIX_IEEE_INTERFACE
+#undef HAVE_FREEBSD_IEEE_INTERFACE
+#undef HAVE_OS2EMX_IEEE_INTERFACE
+#undef HAVE_NETBSD_IEEE_INTERFACE
+#undef HAVE_OPENBSD_IEEE_INTERFACE
+#undef HAVE_DARWIN_IEEE_INTERFACE
+#undef HAVE_DARWIN86_IEEE_INTERFACE
+
+/* Define this if IEEE comparisons work correctly (e.g. NaN != NaN) */
+#undef HAVE_IEEE_COMPARISONS
+
+/* Define this if IEEE denormalized numbers are available */
+#undef HAVE_IEEE_DENORMALS
+
+/* Define a rounding function which moves extended precision values
+ out of registers and rounds them to double-precision. This should
+ be used *sparingly*, in places where it is necessary to keep
+ double-precision rounding for critical expressions while running in
+ extended precision. For example, the following code should ensure
+ exact equality, even when extended precision registers are in use,
+
+ double q = GSL_COERCE_DBL(3.0/7.0) ;
+ if (q == GSL_COERCE_DBL(3.0/7.0)) { ... } ;
+
+ It carries a penalty even when the program is running in double
+ precision mode unless you compile a separate version of the
+ library with HAVE_EXTENDED_PRECISION_REGISTERS turned off. */
+
+#undef HAVE_EXTENDED_PRECISION_REGISTERS
+
+#if HAVE_EXTENDED_PRECISION_REGISTERS
+#define GSL_COERCE_DBL(x) (gsl_coerce_double(x))
+#else
+#define GSL_COERCE_DBL(x) (x)
+#endif
+
+/* Substitute gsl functions for missing system functions */
+
+#if !HAVE_DECL_HYPOT
+#define hypot gsl_hypot
+#endif
+
+#if !HAVE_DECL_LOG1P
+#define log1p gsl_log1p
+#endif
+
+#if !HAVE_DECL_EXPM1
+#define expm1 gsl_expm1
+#endif
+
+#if !HAVE_DECL_ACOSH
+#define acosh gsl_acosh
+#endif
+
+#if !HAVE_DECL_ASINH
+#define asinh gsl_asinh
+#endif
+
+#if !HAVE_DECL_ATANH
+#define atanh gsl_atanh
+#endif
+
+#if !HAVE_DECL_LDEXP
+#define ldexp gsl_ldexp
+#endif
+
+#if !HAVE_DECL_FREXP
+#define frexp gsl_frexp
+#endif
+
+#if !HAVE_DECL_ISINF
+#define isinf gsl_isinf
+#endif
+
+#if !HAVE_DECL_FINITE
+#if HAVE_DECL_ISFINITE
+#define finite isfinite
+#else
+#define finite gsl_finite
+#endif
+#endif
+
+#if !HAVE_DECL_ISNAN
+#define isnan gsl_isnan
+#endif
+
+#ifdef __GNUC__
+#define DISCARD_POINTER(p) do { ; } while(p ? 0 : 0);
+#else
+#define DISCARD_POINTER(p) /* ignoring discarded pointer */
+#endif
+
+#if defined(GSL_RANGE_CHECK_OFF) || !defined(GSL_RANGE_CHECK)
+#define GSL_RANGE_CHECK 0 /* turn off range checking by default internally */
+#endif
+
+/* Disable deprecated functions and enums while building */
+#define GSL_DISABLE_DEPRECATED 1
diff --git a/gsl-1.9/config.sub b/gsl-1.9/config.sub
new file mode 100755
index 0000000..2851647
--- /dev/null
+++ b/gsl-1.9/config.sub
@@ -0,0 +1,1599 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+
+timestamp='2005-12-11'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine. It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Please send patches to <config-patches@gnu.org>. Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support. The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+ $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help"
+ exit 1 ;;
+
+ *local*)
+ # First pass through any local machine types.
+ echo $1
+ exit ;;
+
+ * )
+ break ;;
+ esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+ exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+ exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+ nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
+ uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
+ storm-chaos* | os2-emx* | rtmk-nova*)
+ os=-$maybe_os
+ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+ ;;
+ *)
+ basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+ if [ $basic_machine != $1 ]
+ then os=`echo $1 | sed 's/.*-/-/'`
+ else os=; fi
+ ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work. We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+ -sun*os*)
+ # Prevent following clause from handling this invalid input.
+ ;;
+ -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+ -apple | -axis | -knuth | -cray)
+ os=
+ basic_machine=$1
+ ;;
+ -sim | -cisco | -oki | -wec | -winbond)
+ os=
+ basic_machine=$1
+ ;;
+ -scout)
+ ;;
+ -wrs)
+ os=-vxworks
+ basic_machine=$1
+ ;;
+ -chorusos*)
+ os=-chorusos
+ basic_machine=$1
+ ;;
+ -chorusrdb)
+ os=-chorusrdb
+ basic_machine=$1
+ ;;
+ -hiux*)
+ os=-hiuxwe2
+ ;;
+ -sco6)
+ os=-sco5v6
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco5)
+ os=-sco3.2v5
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco4)
+ os=-sco3.2v4
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2.[4-9]*)
+ os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2v[4-9]*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco5v6*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco*)
+ os=-sco3.2v2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -udk*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -isc)
+ os=-isc2.2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -clix*)
+ basic_machine=clipper-intergraph
+ ;;
+ -isc*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -lynx*)
+ os=-lynxos
+ ;;
+ -ptx*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+ ;;
+ -windowsnt*)
+ os=`echo $os | sed -e 's/windowsnt/winnt/'`
+ ;;
+ -psos*)
+ os=-psos
+ ;;
+ -mint | -mint[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+ # Recognize the basic CPU types without company name.
+ # Some are omitted here because they have special meanings below.
+ 1750a | 580 \
+ | a29k \
+ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+ | am33_2.0 \
+ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
+ | bfin \
+ | c4x | clipper \
+ | d10v | d30v | dlx | dsp16xx \
+ | fr30 | frv \
+ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+ | i370 | i860 | i960 | ia64 \
+ | ip2k | iq2000 \
+ | m32r | m32rle | m68000 | m68k | m88k | maxq | mcore \
+ | mips | mipsbe | mipseb | mipsel | mipsle \
+ | mips16 \
+ | mips64 | mips64el \
+ | mips64vr | mips64vrel \
+ | mips64orion | mips64orionel \
+ | mips64vr4100 | mips64vr4100el \
+ | mips64vr4300 | mips64vr4300el \
+ | mips64vr5000 | mips64vr5000el \
+ | mips64vr5900 | mips64vr5900el \
+ | mipsisa32 | mipsisa32el \
+ | mipsisa32r2 | mipsisa32r2el \
+ | mipsisa64 | mipsisa64el \
+ | mipsisa64r2 | mipsisa64r2el \
+ | mipsisa64sb1 | mipsisa64sb1el \
+ | mipsisa64sr71k | mipsisa64sr71kel \
+ | mipstx39 | mipstx39el \
+ | mn10200 | mn10300 \
+ | mt \
+ | msp430 \
+ | ns16k | ns32k \
+ | or32 \
+ | pdp10 | pdp11 | pj | pjl \
+ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+ | pyramid \
+ | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
+ | sh64 | sh64le \
+ | sparc | sparc64 | sparc64b | sparc86x | sparclet | sparclite \
+ | sparcv8 | sparcv9 | sparcv9b \
+ | strongarm \
+ | tahoe | thumb | tic4x | tic80 | tron \
+ | v850 | v850e \
+ | we32k \
+ | x86 | xscale | xscalee[bl] | xstormy16 | xtensa \
+ | z8k)
+ basic_machine=$basic_machine-unknown
+ ;;
+ m32c)
+ basic_machine=$basic_machine-unknown
+ ;;
+ m6811 | m68hc11 | m6812 | m68hc12)
+ # Motorola 68HC11/12.
+ basic_machine=$basic_machine-unknown
+ os=-none
+ ;;
+ m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+ ;;
+ ms1)
+ basic_machine=mt-unknown
+ ;;
+
+ # We use `pc' rather than `unknown'
+ # because (1) that's what they normally are, and
+ # (2) the word "unknown" tends to confuse beginning users.
+ i*86 | x86_64)
+ basic_machine=$basic_machine-pc
+ ;;
+ # Object if more than one company name word.
+ *-*-*)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+ # Recognize the basic CPU types with company name.
+ 580-* \
+ | a29k-* \
+ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \
+ | avr-* \
+ | bfin-* | bs2000-* \
+ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+ | clipper-* | craynv-* | cydra-* \
+ | d10v-* | d30v-* | dlx-* \
+ | elxsi-* \
+ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
+ | h8300-* | h8500-* \
+ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+ | i*86-* | i860-* | i960-* | ia64-* \
+ | ip2k-* | iq2000-* \
+ | m32r-* | m32rle-* \
+ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+ | m88110-* | m88k-* | maxq-* | mcore-* \
+ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+ | mips16-* \
+ | mips64-* | mips64el-* \
+ | mips64vr-* | mips64vrel-* \
+ | mips64orion-* | mips64orionel-* \
+ | mips64vr4100-* | mips64vr4100el-* \
+ | mips64vr4300-* | mips64vr4300el-* \
+ | mips64vr5000-* | mips64vr5000el-* \
+ | mips64vr5900-* | mips64vr5900el-* \
+ | mipsisa32-* | mipsisa32el-* \
+ | mipsisa32r2-* | mipsisa32r2el-* \
+ | mipsisa64-* | mipsisa64el-* \
+ | mipsisa64r2-* | mipsisa64r2el-* \
+ | mipsisa64sb1-* | mipsisa64sb1el-* \
+ | mipsisa64sr71k-* | mipsisa64sr71kel-* \
+ | mipstx39-* | mipstx39el-* \
+ | mmix-* \
+ | mt-* \
+ | msp430-* \
+ | none-* | np1-* | ns16k-* | ns32k-* \
+ | orion-* \
+ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+ | pyramid-* \
+ | romp-* | rs6000-* \
+ | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | shbe-* \
+ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+ | sparc-* | sparc64-* | sparc64b-* | sparc86x-* | sparclet-* \
+ | sparclite-* \
+ | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
+ | tahoe-* | thumb-* \
+ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+ | tron-* \
+ | v850-* | v850e-* | vax-* \
+ | we32k-* \
+ | x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \
+ | xstormy16-* | xtensa-* \
+ | ymp-* \
+ | z8k-*)
+ ;;
+ m32c-*)
+ ;;
+ # Recognize the various machine names and aliases which stand
+ # for a CPU type and a company and sometimes even an OS.
+ 386bsd)
+ basic_machine=i386-unknown
+ os=-bsd
+ ;;
+ 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+ basic_machine=m68000-att
+ ;;
+ 3b*)
+ basic_machine=we32k-att
+ ;;
+ a29khif)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ abacus)
+ basic_machine=abacus-unknown
+ ;;
+ adobe68k)
+ basic_machine=m68010-adobe
+ os=-scout
+ ;;
+ alliant | fx80)
+ basic_machine=fx80-alliant
+ ;;
+ altos | altos3068)
+ basic_machine=m68k-altos
+ ;;
+ am29k)
+ basic_machine=a29k-none
+ os=-bsd
+ ;;
+ amd64)
+ basic_machine=x86_64-pc
+ ;;
+ amd64-*)
+ basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ amdahl)
+ basic_machine=580-amdahl
+ os=-sysv
+ ;;
+ amiga | amiga-*)
+ basic_machine=m68k-unknown
+ ;;
+ amigaos | amigados)
+ basic_machine=m68k-unknown
+ os=-amigaos
+ ;;
+ amigaunix | amix)
+ basic_machine=m68k-unknown
+ os=-sysv4
+ ;;
+ apollo68)
+ basic_machine=m68k-apollo
+ os=-sysv
+ ;;
+ apollo68bsd)
+ basic_machine=m68k-apollo
+ os=-bsd
+ ;;
+ aux)
+ basic_machine=m68k-apple
+ os=-aux
+ ;;
+ balance)
+ basic_machine=ns32k-sequent
+ os=-dynix
+ ;;
+ c90)
+ basic_machine=c90-cray
+ os=-unicos
+ ;;
+ convex-c1)
+ basic_machine=c1-convex
+ os=-bsd
+ ;;
+ convex-c2)
+ basic_machine=c2-convex
+ os=-bsd
+ ;;
+ convex-c32)
+ basic_machine=c32-convex
+ os=-bsd
+ ;;
+ convex-c34)
+ basic_machine=c34-convex
+ os=-bsd
+ ;;
+ convex-c38)
+ basic_machine=c38-convex
+ os=-bsd
+ ;;
+ cray | j90)
+ basic_machine=j90-cray
+ os=-unicos
+ ;;
+ craynv)
+ basic_machine=craynv-cray
+ os=-unicosmp
+ ;;
+ cr16c)
+ basic_machine=cr16c-unknown
+ os=-elf
+ ;;
+ crds | unos)
+ basic_machine=m68k-crds
+ ;;
+ crisv32 | crisv32-* | etraxfs*)
+ basic_machine=crisv32-axis
+ ;;
+ cris | cris-* | etrax*)
+ basic_machine=cris-axis
+ ;;
+ crx)
+ basic_machine=crx-unknown
+ os=-elf
+ ;;
+ da30 | da30-*)
+ basic_machine=m68k-da30
+ ;;
+ decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+ basic_machine=mips-dec
+ ;;
+ decsystem10* | dec10*)
+ basic_machine=pdp10-dec
+ os=-tops10
+ ;;
+ decsystem20* | dec20*)
+ basic_machine=pdp10-dec
+ os=-tops20
+ ;;
+ delta | 3300 | motorola-3300 | motorola-delta \
+ | 3300-motorola | delta-motorola)
+ basic_machine=m68k-motorola
+ ;;
+ delta88)
+ basic_machine=m88k-motorola
+ os=-sysv3
+ ;;
+ djgpp)
+ basic_machine=i586-pc
+ os=-msdosdjgpp
+ ;;
+ dpx20 | dpx20-*)
+ basic_machine=rs6000-bull
+ os=-bosx
+ ;;
+ dpx2* | dpx2*-bull)
+ basic_machine=m68k-bull
+ os=-sysv3
+ ;;
+ ebmon29k)
+ basic_machine=a29k-amd
+ os=-ebmon
+ ;;
+ elxsi)
+ basic_machine=elxsi-elxsi
+ os=-bsd
+ ;;
+ encore | umax | mmax)
+ basic_machine=ns32k-encore
+ ;;
+ es1800 | OSE68k | ose68k | ose | OSE)
+ basic_machine=m68k-ericsson
+ os=-ose
+ ;;
+ fx2800)
+ basic_machine=i860-alliant
+ ;;
+ genix)
+ basic_machine=ns32k-ns
+ ;;
+ gmicro)
+ basic_machine=tron-gmicro
+ os=-sysv
+ ;;
+ go32)
+ basic_machine=i386-pc
+ os=-go32
+ ;;
+ h3050r* | hiux*)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ h8300hms)
+ basic_machine=h8300-hitachi
+ os=-hms
+ ;;
+ h8300xray)
+ basic_machine=h8300-hitachi
+ os=-xray
+ ;;
+ h8500hms)
+ basic_machine=h8500-hitachi
+ os=-hms
+ ;;
+ harris)
+ basic_machine=m88k-harris
+ os=-sysv3
+ ;;
+ hp300-*)
+ basic_machine=m68k-hp
+ ;;
+ hp300bsd)
+ basic_machine=m68k-hp
+ os=-bsd
+ ;;
+ hp300hpux)
+ basic_machine=m68k-hp
+ os=-hpux
+ ;;
+ hp3k9[0-9][0-9] | hp9[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k2[0-9][0-9] | hp9k31[0-9])
+ basic_machine=m68000-hp
+ ;;
+ hp9k3[2-9][0-9])
+ basic_machine=m68k-hp
+ ;;
+ hp9k6[0-9][0-9] | hp6[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k7[0-79][0-9] | hp7[0-79][0-9])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k78[0-9] | hp78[0-9])
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][13679] | hp8[0-9][13679])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][0-9] | hp8[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hppa-next)
+ os=-nextstep3
+ ;;
+ hppaosf)
+ basic_machine=hppa1.1-hp
+ os=-osf
+ ;;
+ hppro)
+ basic_machine=hppa1.1-hp
+ os=-proelf
+ ;;
+ i370-ibm* | ibm*)
+ basic_machine=i370-ibm
+ ;;
+# I'm not sure what "Sysv32" means. Should this be sysv3.2?
+ i*86v32)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv32
+ ;;
+ i*86v4*)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv4
+ ;;
+ i*86v)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv
+ ;;
+ i*86sol2)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-solaris2
+ ;;
+ i386mach)
+ basic_machine=i386-mach
+ os=-mach
+ ;;
+ i386-vsta | vsta)
+ basic_machine=i386-unknown
+ os=-vsta
+ ;;
+ iris | iris4d)
+ basic_machine=mips-sgi
+ case $os in
+ -irix*)
+ ;;
+ *)
+ os=-irix4
+ ;;
+ esac
+ ;;
+ isi68 | isi)
+ basic_machine=m68k-isi
+ os=-sysv
+ ;;
+ m88k-omron*)
+ basic_machine=m88k-omron
+ ;;
+ magnum | m3230)
+ basic_machine=mips-mips
+ os=-sysv
+ ;;
+ merlin)
+ basic_machine=ns32k-utek
+ os=-sysv
+ ;;
+ mingw32)
+ basic_machine=i386-pc
+ os=-mingw32
+ ;;
+ miniframe)
+ basic_machine=m68000-convergent
+ ;;
+ *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+ mips3*-*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+ ;;
+ mips3*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+ ;;
+ monitor)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ morphos)
+ basic_machine=powerpc-unknown
+ os=-morphos
+ ;;
+ msdos)
+ basic_machine=i386-pc
+ os=-msdos
+ ;;
+ ms1-*)
+ basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+ ;;
+ mvs)
+ basic_machine=i370-ibm
+ os=-mvs
+ ;;
+ ncr3000)
+ basic_machine=i486-ncr
+ os=-sysv4
+ ;;
+ netbsd386)
+ basic_machine=i386-unknown
+ os=-netbsd
+ ;;
+ netwinder)
+ basic_machine=armv4l-rebel
+ os=-linux
+ ;;
+ news | news700 | news800 | news900)
+ basic_machine=m68k-sony
+ os=-newsos
+ ;;
+ news1000)
+ basic_machine=m68030-sony
+ os=-newsos
+ ;;
+ news-3600 | risc-news)
+ basic_machine=mips-sony
+ os=-newsos
+ ;;
+ necv70)
+ basic_machine=v70-nec
+ os=-sysv
+ ;;
+ next | m*-next )
+ basic_machine=m68k-next
+ case $os in
+ -nextstep* )
+ ;;
+ -ns2*)
+ os=-nextstep2
+ ;;
+ *)
+ os=-nextstep3
+ ;;
+ esac
+ ;;
+ nh3000)
+ basic_machine=m68k-harris
+ os=-cxux
+ ;;
+ nh[45]000)
+ basic_machine=m88k-harris
+ os=-cxux
+ ;;
+ nindy960)
+ basic_machine=i960-intel
+ os=-nindy
+ ;;
+ mon960)
+ basic_machine=i960-intel
+ os=-mon960
+ ;;
+ nonstopux)
+ basic_machine=mips-compaq
+ os=-nonstopux
+ ;;
+ np1)
+ basic_machine=np1-gould
+ ;;
+ nsr-tandem)
+ basic_machine=nsr-tandem
+ ;;
+ op50n-* | op60c-*)
+ basic_machine=hppa1.1-oki
+ os=-proelf
+ ;;
+ openrisc | openrisc-*)
+ basic_machine=or32-unknown
+ ;;
+ os400)
+ basic_machine=powerpc-ibm
+ os=-os400
+ ;;
+ OSE68000 | ose68000)
+ basic_machine=m68000-ericsson
+ os=-ose
+ ;;
+ os68k)
+ basic_machine=m68k-none
+ os=-os68k
+ ;;
+ pa-hitachi)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ paragon)
+ basic_machine=i860-intel
+ os=-osf
+ ;;
+ pbd)
+ basic_machine=sparc-tti
+ ;;
+ pbb)
+ basic_machine=m68k-tti
+ ;;
+ pc532 | pc532-*)
+ basic_machine=ns32k-pc532
+ ;;
+ pentium | p5 | k5 | k6 | nexgen | viac3)
+ basic_machine=i586-pc
+ ;;
+ pentiumpro | p6 | 6x86 | athlon | athlon_*)
+ basic_machine=i686-pc
+ ;;
+ pentiumii | pentium2 | pentiumiii | pentium3)
+ basic_machine=i686-pc
+ ;;
+ pentium4)
+ basic_machine=i786-pc
+ ;;
+ pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+ basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumpro-* | p6-* | 6x86-* | athlon-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentium4-*)
+ basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pn)
+ basic_machine=pn-gould
+ ;;
+ power) basic_machine=power-ibm
+ ;;
+ ppc) basic_machine=powerpc-unknown
+ ;;
+ ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppcle | powerpclittle | ppc-le | powerpc-little)
+ basic_machine=powerpcle-unknown
+ ;;
+ ppcle-* | powerpclittle-*)
+ basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppc64) basic_machine=powerpc64-unknown
+ ;;
+ ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+ basic_machine=powerpc64le-unknown
+ ;;
+ ppc64le-* | powerpc64little-*)
+ basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ps2)
+ basic_machine=i386-ibm
+ ;;
+ pw32)
+ basic_machine=i586-unknown
+ os=-pw32
+ ;;
+ rdos)
+ basic_machine=i386-pc
+ os=-rdos
+ ;;
+ rom68k)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ rm[46]00)
+ basic_machine=mips-siemens
+ ;;
+ rtpc | rtpc-*)
+ basic_machine=romp-ibm
+ ;;
+ s390 | s390-*)
+ basic_machine=s390-ibm
+ ;;
+ s390x | s390x-*)
+ basic_machine=s390x-ibm
+ ;;
+ sa29200)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ sb1)
+ basic_machine=mipsisa64sb1-unknown
+ ;;
+ sb1el)
+ basic_machine=mipsisa64sb1el-unknown
+ ;;
+ sei)
+ basic_machine=mips-sei
+ os=-seiux
+ ;;
+ sequent)
+ basic_machine=i386-sequent
+ ;;
+ sh)
+ basic_machine=sh-hitachi
+ os=-hms
+ ;;
+ sh64)
+ basic_machine=sh64-unknown
+ ;;
+ sparclite-wrs | simso-wrs)
+ basic_machine=sparclite-wrs
+ os=-vxworks
+ ;;
+ sps7)
+ basic_machine=m68k-bull
+ os=-sysv2
+ ;;
+ spur)
+ basic_machine=spur-unknown
+ ;;
+ st2000)
+ basic_machine=m68k-tandem
+ ;;
+ stratus)
+ basic_machine=i860-stratus
+ os=-sysv4
+ ;;
+ sun2)
+ basic_machine=m68000-sun
+ ;;
+ sun2os3)
+ basic_machine=m68000-sun
+ os=-sunos3
+ ;;
+ sun2os4)
+ basic_machine=m68000-sun
+ os=-sunos4
+ ;;
+ sun3os3)
+ basic_machine=m68k-sun
+ os=-sunos3
+ ;;
+ sun3os4)
+ basic_machine=m68k-sun
+ os=-sunos4
+ ;;
+ sun4os3)
+ basic_machine=sparc-sun
+ os=-sunos3
+ ;;
+ sun4os4)
+ basic_machine=sparc-sun
+ os=-sunos4
+ ;;
+ sun4sol2)
+ basic_machine=sparc-sun
+ os=-solaris2
+ ;;
+ sun3 | sun3-*)
+ basic_machine=m68k-sun
+ ;;
+ sun4)
+ basic_machine=sparc-sun
+ ;;
+ sun386 | sun386i | roadrunner)
+ basic_machine=i386-sun
+ ;;
+ sv1)
+ basic_machine=sv1-cray
+ os=-unicos
+ ;;
+ symmetry)
+ basic_machine=i386-sequent
+ os=-dynix
+ ;;
+ t3e)
+ basic_machine=alphaev5-cray
+ os=-unicos
+ ;;
+ t90)
+ basic_machine=t90-cray
+ os=-unicos
+ ;;
+ tic54x | c54x*)
+ basic_machine=tic54x-unknown
+ os=-coff
+ ;;
+ tic55x | c55x*)
+ basic_machine=tic55x-unknown
+ os=-coff
+ ;;
+ tic6x | c6x*)
+ basic_machine=tic6x-unknown
+ os=-coff
+ ;;
+ tx39)
+ basic_machine=mipstx39-unknown
+ ;;
+ tx39el)
+ basic_machine=mipstx39el-unknown
+ ;;
+ toad1)
+ basic_machine=pdp10-xkl
+ os=-tops20
+ ;;
+ tower | tower-32)
+ basic_machine=m68k-ncr
+ ;;
+ tpf)
+ basic_machine=s390x-ibm
+ os=-tpf
+ ;;
+ udi29k)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ ultra3)
+ basic_machine=a29k-nyu
+ os=-sym1
+ ;;
+ v810 | necv810)
+ basic_machine=v810-nec
+ os=-none
+ ;;
+ vaxv)
+ basic_machine=vax-dec
+ os=-sysv
+ ;;
+ vms)
+ basic_machine=vax-dec
+ os=-vms
+ ;;
+ vpp*|vx|vx-*)
+ basic_machine=f301-fujitsu
+ ;;
+ vxworks960)
+ basic_machine=i960-wrs
+ os=-vxworks
+ ;;
+ vxworks68)
+ basic_machine=m68k-wrs
+ os=-vxworks
+ ;;
+ vxworks29k)
+ basic_machine=a29k-wrs
+ os=-vxworks
+ ;;
+ w65*)
+ basic_machine=w65-wdc
+ os=-none
+ ;;
+ w89k-*)
+ basic_machine=hppa1.1-winbond
+ os=-proelf
+ ;;
+ xbox)
+ basic_machine=i686-pc
+ os=-mingw32
+ ;;
+ xps | xps100)
+ basic_machine=xps100-honeywell
+ ;;
+ ymp)
+ basic_machine=ymp-cray
+ os=-unicos
+ ;;
+ z8k-*-coff)
+ basic_machine=z8k-unknown
+ os=-sim
+ ;;
+ none)
+ basic_machine=none-none
+ os=-none
+ ;;
+
+# Here we handle the default manufacturer of certain CPU types. It is in
+# some cases the only manufacturer, in others, it is the most popular.
+ w89k)
+ basic_machine=hppa1.1-winbond
+ ;;
+ op50n)
+ basic_machine=hppa1.1-oki
+ ;;
+ op60c)
+ basic_machine=hppa1.1-oki
+ ;;
+ romp)
+ basic_machine=romp-ibm
+ ;;
+ mmix)
+ basic_machine=mmix-knuth
+ ;;
+ rs6000)
+ basic_machine=rs6000-ibm
+ ;;
+ vax)
+ basic_machine=vax-dec
+ ;;
+ pdp10)
+ # there are many clones, so DEC is not a safe bet
+ basic_machine=pdp10-unknown
+ ;;
+ pdp11)
+ basic_machine=pdp11-dec
+ ;;
+ we32k)
+ basic_machine=we32k-att
+ ;;
+ sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)
+ basic_machine=sh-unknown
+ ;;
+ sparc | sparcv8 | sparcv9 | sparcv9b)
+ basic_machine=sparc-sun
+ ;;
+ cydra)
+ basic_machine=cydra-cydrome
+ ;;
+ orion)
+ basic_machine=orion-highlevel
+ ;;
+ orion105)
+ basic_machine=clipper-highlevel
+ ;;
+ mac | mpw | mac-mpw)
+ basic_machine=m68k-apple
+ ;;
+ pmac | pmac-mpw)
+ basic_machine=powerpc-apple
+ ;;
+ *-unknown)
+ # Make sure to match an already-canonicalized machine name.
+ ;;
+ *)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+ *-digital*)
+ basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+ ;;
+ *-commodore*)
+ basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+ ;;
+ *)
+ ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+ # First match some system type aliases
+ # that might get confused with valid system types.
+ # -solaris* is a basic system type, with this one exception.
+ -solaris1 | -solaris1.*)
+ os=`echo $os | sed -e 's|solaris1|sunos4|'`
+ ;;
+ -solaris)
+ os=-solaris2
+ ;;
+ -svr4*)
+ os=-sysv4
+ ;;
+ -unixware*)
+ os=-sysv4.2uw
+ ;;
+ -gnu/linux*)
+ os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+ ;;
+ # First accept the basic system types.
+ # The portable systems comes first.
+ # Each alternative MUST END IN A *, to match a version number.
+ # -sysv* is not here because it comes later, after sysvr4.
+ -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+ | -aos* \
+ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \
+ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+ | -chorusos* | -chorusrdb* \
+ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+ | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
+ | -uxpv* | -beos* | -mpeix* | -udk* \
+ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+ | -skyos* | -haiku* | -rdos*)
+ # Remember, each alternative MUST END IN *, to match a version number.
+ ;;
+ -qnx*)
+ case $basic_machine in
+ x86-* | i*86-*)
+ ;;
+ *)
+ os=-nto$os
+ ;;
+ esac
+ ;;
+ -nto-qnx*)
+ ;;
+ -nto*)
+ os=`echo $os | sed -e 's|nto|nto-qnx|'`
+ ;;
+ -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+ ;;
+ -mac*)
+ os=`echo $os | sed -e 's|mac|macos|'`
+ ;;
+ -linux-dietlibc)
+ os=-linux-dietlibc
+ ;;
+ -linux*)
+ os=`echo $os | sed -e 's|linux|linux-gnu|'`
+ ;;
+ -sunos5*)
+ os=`echo $os | sed -e 's|sunos5|solaris2|'`
+ ;;
+ -sunos6*)
+ os=`echo $os | sed -e 's|sunos6|solaris3|'`
+ ;;
+ -opened*)
+ os=-openedition
+ ;;
+ -os400*)
+ os=-os400
+ ;;
+ -wince*)
+ os=-wince
+ ;;
+ -osfrose*)
+ os=-osfrose
+ ;;
+ -osf*)
+ os=-osf
+ ;;
+ -utek*)
+ os=-bsd
+ ;;
+ -dynix*)
+ os=-bsd
+ ;;
+ -acis*)
+ os=-aos
+ ;;
+ -atheos*)
+ os=-atheos
+ ;;
+ -syllable*)
+ os=-syllable
+ ;;
+ -386bsd)
+ os=-bsd
+ ;;
+ -ctix* | -uts*)
+ os=-sysv
+ ;;
+ -nova*)
+ os=-rtmk-nova
+ ;;
+ -ns2 )
+ os=-nextstep2
+ ;;
+ -nsk*)
+ os=-nsk
+ ;;
+ # Preserve the version number of sinix5.
+ -sinix5.*)
+ os=`echo $os | sed -e 's|sinix|sysv|'`
+ ;;
+ -sinix*)
+ os=-sysv4
+ ;;
+ -tpf*)
+ os=-tpf
+ ;;
+ -triton*)
+ os=-sysv3
+ ;;
+ -oss*)
+ os=-sysv3
+ ;;
+ -svr4)
+ os=-sysv4
+ ;;
+ -svr3)
+ os=-sysv3
+ ;;
+ -sysvr4)
+ os=-sysv4
+ ;;
+ # This must come after -sysvr4.
+ -sysv*)
+ ;;
+ -ose*)
+ os=-ose
+ ;;
+ -es1800*)
+ os=-ose
+ ;;
+ -xenix)
+ os=-xenix
+ ;;
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ os=-mint
+ ;;
+ -aros*)
+ os=-aros
+ ;;
+ -kaos*)
+ os=-kaos
+ ;;
+ -zvmoe)
+ os=-zvmoe
+ ;;
+ -none)
+ ;;
+ *)
+ # Get rid of the `-' at the beginning of $os.
+ os=`echo $os | sed 's/[^-]*-//'`
+ echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system. Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+ *-acorn)
+ os=-riscix1.2
+ ;;
+ arm*-rebel)
+ os=-linux
+ ;;
+ arm*-semi)
+ os=-aout
+ ;;
+ c4x-* | tic4x-*)
+ os=-coff
+ ;;
+ # This must come before the *-dec entry.
+ pdp10-*)
+ os=-tops20
+ ;;
+ pdp11-*)
+ os=-none
+ ;;
+ *-dec | vax-*)
+ os=-ultrix4.2
+ ;;
+ m68*-apollo)
+ os=-domain
+ ;;
+ i386-sun)
+ os=-sunos4.0.2
+ ;;
+ m68000-sun)
+ os=-sunos3
+ # This also exists in the configure program, but was not the
+ # default.
+ # os=-sunos4
+ ;;
+ m68*-cisco)
+ os=-aout
+ ;;
+ mips*-cisco)
+ os=-elf
+ ;;
+ mips*-*)
+ os=-elf
+ ;;
+ or32-*)
+ os=-coff
+ ;;
+ *-tti) # must be before sparc entry or we get the wrong os.
+ os=-sysv3
+ ;;
+ sparc-* | *-sun)
+ os=-sunos4.1.1
+ ;;
+ *-be)
+ os=-beos
+ ;;
+ *-haiku)
+ os=-haiku
+ ;;
+ *-ibm)
+ os=-aix
+ ;;
+ *-knuth)
+ os=-mmixware
+ ;;
+ *-wec)
+ os=-proelf
+ ;;
+ *-winbond)
+ os=-proelf
+ ;;
+ *-oki)
+ os=-proelf
+ ;;
+ *-hp)
+ os=-hpux
+ ;;
+ *-hitachi)
+ os=-hiux
+ ;;
+ i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+ os=-sysv
+ ;;
+ *-cbm)
+ os=-amigaos
+ ;;
+ *-dg)
+ os=-dgux
+ ;;
+ *-dolphin)
+ os=-sysv3
+ ;;
+ m68k-ccur)
+ os=-rtu
+ ;;
+ m88k-omron*)
+ os=-luna
+ ;;
+ *-next )
+ os=-nextstep
+ ;;
+ *-sequent)
+ os=-ptx
+ ;;
+ *-crds)
+ os=-unos
+ ;;
+ *-ns)
+ os=-genix
+ ;;
+ i370-*)
+ os=-mvs
+ ;;
+ *-next)
+ os=-nextstep3
+ ;;
+ *-gould)
+ os=-sysv
+ ;;
+ *-highlevel)
+ os=-bsd
+ ;;
+ *-encore)
+ os=-bsd
+ ;;
+ *-sgi)
+ os=-irix
+ ;;
+ *-siemens)
+ os=-sysv4
+ ;;
+ *-masscomp)
+ os=-rtu
+ ;;
+ f30[01]-fujitsu | f700-fujitsu)
+ os=-uxpv
+ ;;
+ *-rom68k)
+ os=-coff
+ ;;
+ *-*bug)
+ os=-coff
+ ;;
+ *-apple)
+ os=-macos
+ ;;
+ *-atari*)
+ os=-mint
+ ;;
+ *)
+ os=-none
+ ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer. We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+ *-unknown)
+ case $os in
+ -riscix*)
+ vendor=acorn
+ ;;
+ -sunos*)
+ vendor=sun
+ ;;
+ -aix*)
+ vendor=ibm
+ ;;
+ -beos*)
+ vendor=be
+ ;;
+ -hpux*)
+ vendor=hp
+ ;;
+ -mpeix*)
+ vendor=hp
+ ;;
+ -hiux*)
+ vendor=hitachi
+ ;;
+ -unos*)
+ vendor=crds
+ ;;
+ -dgux*)
+ vendor=dg
+ ;;
+ -luna*)
+ vendor=omron
+ ;;
+ -genix*)
+ vendor=ns
+ ;;
+ -mvs* | -opened*)
+ vendor=ibm
+ ;;
+ -os400*)
+ vendor=ibm
+ ;;
+ -ptx*)
+ vendor=sequent
+ ;;
+ -tpf*)
+ vendor=ibm
+ ;;
+ -vxsim* | -vxworks* | -windiss*)
+ vendor=wrs
+ ;;
+ -aux*)
+ vendor=apple
+ ;;
+ -hms*)
+ vendor=hitachi
+ ;;
+ -mpw* | -macos*)
+ vendor=apple
+ ;;
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ vendor=atari
+ ;;
+ -vos*)
+ vendor=stratus
+ ;;
+ esac
+ basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+ ;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/gsl-1.9/configure b/gsl-1.9/configure
new file mode 100755
index 0000000..1bea2e6
--- /dev/null
+++ b/gsl-1.9/configure
@@ -0,0 +1,13023 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.59 for gsl 1.9.
+#
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+ set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
+do
+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+ eval $as_var=C; export $as_var
+ else
+ $as_unset $as_var
+ fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)$' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+ /^X\/\(\/\/\)$/{ s//\1/; q; }
+ /^X\/\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" || {
+ # Find who we are. Look in the path if we contain no path at all
+ # relative or not.
+ case $0 in
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+ ;;
+ esac
+ # We did not find ourselves, most probably we were run as `sh COMMAND'
+ # in which case we are not to be found in the path.
+ if test "x$as_myself" = x; then
+ as_myself=$0
+ fi
+ if test ! -f "$as_myself"; then
+ { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
+ { (exit 1); exit 1; }; }
+ fi
+ case $CONFIG_SHELL in
+ '')
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for as_base in sh bash ksh sh5; do
+ case $as_dir in
+ /*)
+ if ("$as_dir/$as_base" -c '
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then
+ $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+ $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+ CONFIG_SHELL=$as_dir/$as_base
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+ fi;;
+ esac
+ done
+done
+;;
+ esac
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line before each line; the second 'sed' does the real
+ # work. The second script uses 'N' to pair each line-number line
+ # with the numbered line, and appends trailing '-' during
+ # substitution so that $LINENO is not a special case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-)
+ sed '=' <$as_myself |
+ sed '
+ N
+ s,$,-,
+ : loop
+ s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+ t loop
+ s,-$,,
+ s,^['$as_cr_digits']*\n,,
+ ' >$as_me.lineno &&
+ chmod +x $as_me.lineno ||
+ { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+ { (exit 1); exit 1; }; }
+
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensible to this).
+ . ./$as_me.lineno
+ # Exit status is that of the last command.
+ exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+ *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T=' ' ;;
+ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+ *) ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ # We could just check for DJGPP; but this test a) works b) is more generic
+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+ if test -f conf$$.exe; then
+ # Don't use ln at all; we don't have any links
+ as_ln_s='cp -p'
+ else
+ as_ln_s='ln -s'
+ fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" $as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+
+
+# Check that we are running under the correct shell.
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+case X$ECHO in
+X*--fallback-echo)
+ # Remove one level of quotation (which was required for Make).
+ ECHO=`echo "$ECHO" | sed 's,\\\\\$\\$0,'$0','`
+ ;;
+esac
+
+echo=${ECHO-echo}
+if test "X$1" = X--no-reexec; then
+ # Discard the --no-reexec flag, and continue.
+ shift
+elif test "X$1" = X--fallback-echo; then
+ # Avoid inline document here, it may be left over
+ :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then
+ # Yippee, $echo works!
+ :
+else
+ # Restart under the correct shell.
+ exec $SHELL "$0" --no-reexec ${1+"$@"}
+fi
+
+if test "X$1" = X--fallback-echo; then
+ # used as fallback echo
+ shift
+ cat <<EOF
+$*
+EOF
+ exit 0
+fi
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+if test -z "$ECHO"; then
+if test "X${echo_test_string+set}" != Xset; then
+# find a string as large as possible, as long as the shell can cope with it
+ for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do
+ # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
+ if (echo_test_string=`eval $cmd`) 2>/dev/null &&
+ echo_test_string=`eval $cmd` &&
+ (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null
+ then
+ break
+ fi
+ done
+fi
+
+if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ :
+else
+ # The Solaris, AIX, and Digital Unix default echo programs unquote
+ # backslashes. This makes it impossible to quote backslashes using
+ # echo "$something" | sed 's/\\/\\\\/g'
+ #
+ # So, first we look for a working echo in the user's PATH.
+
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for dir in $PATH /usr/ucb; do
+ IFS="$lt_save_ifs"
+ if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
+ test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ echo="$dir/echo"
+ break
+ fi
+ done
+ IFS="$lt_save_ifs"
+
+ if test "X$echo" = Xecho; then
+ # We didn't find a better echo, so look for alternatives.
+ if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ # This shell has a builtin print -r that does the trick.
+ echo='print -r'
+ elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&
+ test "X$CONFIG_SHELL" != X/bin/ksh; then
+ # If we have ksh, try running configure again with it.
+ ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+ export ORIGINAL_CONFIG_SHELL
+ CONFIG_SHELL=/bin/ksh
+ export CONFIG_SHELL
+ exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"}
+ else
+ # Try using printf.
+ echo='printf %s\n'
+ if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ # Cool, printf works
+ :
+ elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
+ test "X$echo_testing_string" = 'X\t' &&
+ echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
+ export CONFIG_SHELL
+ SHELL="$CONFIG_SHELL"
+ export SHELL
+ echo="$CONFIG_SHELL $0 --fallback-echo"
+ elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
+ test "X$echo_testing_string" = 'X\t' &&
+ echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ echo="$CONFIG_SHELL $0 --fallback-echo"
+ else
+ # maybe with a smaller string...
+ prev=:
+
+ for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do
+ if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null
+ then
+ break
+ fi
+ prev="$cmd"
+ done
+
+ if test "$prev" != 'sed 50q "$0"'; then
+ echo_test_string=`eval $prev`
+ export echo_test_string
+ exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"}
+ else
+ # Oops. We lost completely, so just stick with echo.
+ echo=echo
+ fi
+ fi
+ fi
+ fi
+fi
+fi
+
+# Copy echo and quote the copy suitably for passing to libtool from
+# the Makefile, instead of quoting the original, which is used later.
+ECHO=$echo
+if test "X$ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then
+ ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo"
+fi
+
+
+
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+exec 6>&1
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_config_libobj_dir=.
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Maximum number of lines to put in a shell here document.
+# This variable seems obsolete. It should probably be removed, and
+# only ac_max_sed_lines should be used.
+: ${ac_max_here_lines=38}
+
+# Identity of this package.
+PACKAGE_NAME='gsl'
+PACKAGE_TARNAME='gsl'
+PACKAGE_VERSION='1.9'
+PACKAGE_STRING='gsl 1.9'
+PACKAGE_BUGREPORT=''
+
+ac_unique_file="gsl_math.h"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#if HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#if STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# if HAVE_STDLIB_H
+# include <stdlib.h>
+# endif
+#endif
+#if HAVE_STRING_H
+# if !STDC_HEADERS && HAVE_MEMORY_H
+# include <memory.h>
+# endif
+# include <string.h>
+#endif
+#if HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#else
+# if HAVE_STDINT_H
+# include <stdint.h>
+# endif
+#endif
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT GSL_LT_VERSION GSL_LT_CBLAS_VERSION RELEASED build build_cpu build_vendor build_os host host_cpu host_vendor host_os CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP LN_S EGREP ECHO AR ac_ct_AR RANLIB ac_ct_RANLIB LIBTOOL GSL_CFLAGS GSL_LIBS HAVE_INLINE LIBOBJS HAVE_PRINTF_LONGDOUBLE HAVE_EXTENDED_PRECISION_REGISTERS HAVE_GNUSPARC_IEEE_INTERFACE HAVE_GNUM68K_IEEE_INTERFACE HAVE_GNUPPC_IEEE_INTERFACE HAVE_GNUX86_IEEE_INTERFACE HAVE_SUNOS4_IEEE_INTERFACE HAVE_SOLARIS_IEEE_INTERFACE HAVE_HPUX11_IEEE_INTERFACE HAVE_HPUX_IEEE_INTERFACE HAVE_TRU64_IEEE_INTERFACE HAVE_IRIX_IEEE_INTERFACE HAVE_AIX_IEEE_INTERFACE HAVE_FREEBSD_IEEE_INTERFACE HAVE_OS2EMX_IEEE_INTERFACE HAVE_NETBSD_IEEE_INTERFACE HAVE_OPENBSD_IEEE_INTERFACE HAVE_DARWIN_IEEE_INTERFACE HAVE_DARWIN86_IEEE_INTERFACE HAVE_IEEE_COMPARISONS HAVE_IEEE_DENORMALS LTLIBOBJS'
+ac_subst_files=''
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+ac_prev=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval "$ac_prev=\$ac_option"
+ ac_prev=
+ continue
+ fi
+
+ ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case $ac_option in
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+ eval "enable_$ac_feature=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+ case $ac_option in
+ *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_$ac_feature='$ac_optarg'" ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case $ac_option in
+ *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_$ac_package='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package | sed 's/-/_/g'`
+ eval "with_$ac_package=no" ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+ { (exit 1); exit 1; }; }
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+ { (exit 1); exit 1; }; }
+ ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
+ eval "$ac_envvar='$ac_optarg'"
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ { echo "$as_me: error: missing argument to $ac_option" >&2
+ { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute paths.
+for ac_var in exec_prefix prefix
+do
+ eval ac_val=$`echo $ac_var`
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
+ *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# Be sure to have absolute paths.
+for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
+ localstatedir libdir includedir oldincludedir infodir mandir
+do
+ eval ac_val=$`echo $ac_var`
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) ;;
+ *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+ If a cross compiler is detected then cross compile mode will be used." >&2
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then its parent.
+ ac_confdir=`(dirname "$0") 2>/dev/null ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$0" : 'X\(//\)[^/]' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$0" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ srcdir=$ac_confdir
+ if test ! -r $srcdir/$ac_unique_file; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
+ { (exit 1); exit 1; }; }
+ else
+ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+ { (exit 1); exit 1; }; }
+ fi
+fi
+(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||
+ { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2
+ { (exit 1); exit 1; }; }
+srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
+ac_env_build_alias_set=${build_alias+set}
+ac_env_build_alias_value=$build_alias
+ac_cv_env_build_alias_set=${build_alias+set}
+ac_cv_env_build_alias_value=$build_alias
+ac_env_host_alias_set=${host_alias+set}
+ac_env_host_alias_value=$host_alias
+ac_cv_env_host_alias_set=${host_alias+set}
+ac_cv_env_host_alias_value=$host_alias
+ac_env_target_alias_set=${target_alias+set}
+ac_env_target_alias_value=$target_alias
+ac_cv_env_target_alias_set=${target_alias+set}
+ac_cv_env_target_alias_value=$target_alias
+ac_env_CC_set=${CC+set}
+ac_env_CC_value=$CC
+ac_cv_env_CC_set=${CC+set}
+ac_cv_env_CC_value=$CC
+ac_env_CFLAGS_set=${CFLAGS+set}
+ac_env_CFLAGS_value=$CFLAGS
+ac_cv_env_CFLAGS_set=${CFLAGS+set}
+ac_cv_env_CFLAGS_value=$CFLAGS
+ac_env_LDFLAGS_set=${LDFLAGS+set}
+ac_env_LDFLAGS_value=$LDFLAGS
+ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
+ac_cv_env_LDFLAGS_value=$LDFLAGS
+ac_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_env_CPPFLAGS_value=$CPPFLAGS
+ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_cv_env_CPPFLAGS_value=$CPPFLAGS
+ac_env_CPP_set=${CPP+set}
+ac_env_CPP_value=$CPP
+ac_cv_env_CPP_set=${CPP+set}
+ac_cv_env_CPP_value=$CPP
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+\`configure' configures gsl 1.9 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+_ACEOF
+
+ cat <<_ACEOF
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --infodir=DIR info documentation [PREFIX/info]
+ --mandir=DIR man documentation [PREFIX/man]
+_ACEOF
+
+ cat <<\_ACEOF
+
+Program names:
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM run sed PROGRAM on installed program names
+
+System types:
+ --build=BUILD configure for building on BUILD [guessed]
+ --host=HOST cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+ case $ac_init_help in
+ short | recursive ) echo "Configuration of gsl 1.9:";;
+ esac
+ cat <<\_ACEOF
+
+Optional Features:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --enable-maintainer-mode enable make rules and dependencies not useful
+ (and sometimes confusing) to the casual installer
+ --enable-shared[=PKGS]
+ build shared libraries [default=yes]
+ --enable-static[=PKGS]
+ build static libraries [default=yes]
+ --enable-fast-install[=PKGS]
+ optimize for fast installation [default=yes]
+ --disable-libtool-lock avoid locking (might break parallel builds)
+
+Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --with-gnu-ld assume the C compiler uses GNU ld [default=no]
+ --with-pic try to use only PIC/non-PIC objects [default=use
+ both]
+ --with-tags[=TAGS]
+ include additional configurations [automatic]
+
+Some influential environment variables:
+ CC C compiler command
+ CFLAGS C compiler flags
+ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ CPPFLAGS C/C++ preprocessor flags, e.g. -I<include dir> if you have
+ headers in a nonstandard directory <include dir>
+ CPP C preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+_ACEOF
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ ac_popdir=`pwd`
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d $ac_dir || continue
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+ cd $ac_dir
+ # Check for guested configure; otherwise get Cygnus style configure.
+ if test -f $ac_srcdir/configure.gnu; then
+ echo
+ $SHELL $ac_srcdir/configure.gnu --help=recursive
+ elif test -f $ac_srcdir/configure; then
+ echo
+ $SHELL $ac_srcdir/configure --help=recursive
+ elif test -f $ac_srcdir/configure.ac ||
+ test -f $ac_srcdir/configure.in; then
+ echo
+ $ac_configure --help
+ else
+ echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi
+ cd $ac_popdir
+ done
+fi
+
+test -n "$ac_init_help" && exit 0
+if $ac_init_version; then
+ cat <<\_ACEOF
+gsl configure 1.9
+generated by GNU Autoconf 2.59
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit 0
+fi
+exec 5>config.log
+cat >&5 <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by gsl $as_me 1.9, which was
+generated by GNU Autoconf 2.59. Invocation command line was
+
+ $ $0 $@
+
+_ACEOF
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+hostinfo = `(hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ echo "PATH: $as_dir"
+done
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_sep=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+ for ac_arg
+ do
+ case $ac_arg in
+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ continue ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+ ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+ 2)
+ ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+ if test $ac_must_keep_next = true; then
+ ac_must_keep_next=false # Got value, back to normal.
+ else
+ case $ac_arg in
+ *=* | --config-cache | -C | -disable-* | --disable-* \
+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+ | -with-* | --with-* | -without-* | --without-* | --x)
+ case "$ac_configure_args0 " in
+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+ esac
+ ;;
+ -* ) ac_must_keep_next=true ;;
+ esac
+ fi
+ ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
+ # Get rid of the leading space.
+ ac_sep=" "
+ ;;
+ esac
+ done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Be sure not to use single quotes in there, as some shells,
+# such as our DU 5.0 friend, will then `close' the trap.
+trap 'exit_status=$?
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+{
+ (set) 2>&1 |
+ case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ sed -n \
+ "s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
+ ;;
+ *)
+ sed -n \
+ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+ ;;
+ esac;
+}
+ echo
+
+ cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=$`echo $ac_var`
+ echo "$ac_var='"'"'$ac_val'"'"'"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ cat <<\_ASBOX
+## ------------- ##
+## Output files. ##
+## ------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=$`echo $ac_var`
+ echo "$ac_var='"'"'$ac_val'"'"'"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+ echo
+ sed "/^$/d" confdefs.h | sort
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ echo "$as_me: caught signal $ac_signal"
+ echo "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core &&
+ rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+ ' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo >confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special
+ # files actually), so we avoid doing that.
+ if test -f "$cache_file"; then
+ { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . $cache_file;;
+ *) . ./$cache_file;;
+ esac
+ fi
+else
+ { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in `(set) 2>&1 |
+ sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val="\$ac_cv_env_${ac_var}_value"
+ eval ac_new_val="\$ac_env_${ac_var}_value"
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ { echo "$as_me:$LINENO: former value: $ac_old_val" >&5
+echo "$as_me: former value: $ac_old_val" >&2;}
+ { echo "$as_me:$LINENO: current value: $ac_new_val" >&5
+echo "$as_me: current value: $ac_new_val" >&2;}
+ ac_cache_corrupted=:
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+ ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+am__api_version="1.9"
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+ if test -f $ac_dir/install-sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f $ac_dir/install.sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ elif test -f $ac_dir/shtool; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/shtool install -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
+echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"
+ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+ ./ | .// | /cC/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+ if test $ac_prog = install &&
+ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+done
+
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL=$ac_install_sh
+ fi
+fi
+echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo "$as_me:$LINENO: checking whether build environment is sane" >&5
+echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+ if test "$*" = "X"; then
+ # -L didn't work.
+ set X `ls -t $srcdir/configure conftest.file`
+ fi
+ rm -f conftest.file
+ if test "$*" != "X $srcdir/configure conftest.file" \
+ && test "$*" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken
+alias in your environment" >&5
+echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken
+alias in your environment" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+
+ test "$2" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ { { echo "$as_me:$LINENO: error: newly created file is older than distributed files!
+Check your system clock" >&5
+echo "$as_me: error: newly created file is older than distributed files!
+Check your system clock" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+test "$program_prefix" != NONE &&
+ program_transform_name="s,^,$program_prefix,;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+ program_transform_name="s,\$,$program_suffix,;$program_transform_name"
+# Double any \ or $. echo might interpret backslashes.
+# By default was `s,x,x', remove it if useless.
+cat <<\_ACEOF >conftest.sed
+s/[\\$]/&&/g;s/;s,x,x,$//
+_ACEOF
+program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
+rm conftest.sed
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+ am_missing_run="$MISSING --run "
+else
+ am_missing_run=
+ { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5
+echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+ # We used to keeping the `.' as first argument, in order to
+ # allow $(mkdir_p) to be used without argument. As in
+ # $(mkdir_p) $(somedir)
+ # where $(somedir) is conditionally defined. However this is wrong
+ # for two reasons:
+ # 1. if the package is installed by a user who cannot write `.'
+ # make install will fail,
+ # 2. the above comment should most certainly read
+ # $(mkdir_p) $(DESTDIR)$(somedir)
+ # so it does not work when $(somedir) is undefined and
+ # $(DESTDIR) is not.
+ # To support the latter case, we have to write
+ # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+ # so the `.' trick is pointless.
+ mkdir_p='mkdir -p --'
+else
+ # On NextStep and OpenStep, the `mkdir' command does not
+ # recognize any option. It will interpret all options as
+ # directories to create, and then abort because `.' already
+ # exists.
+ for d in ./-p ./--version;
+ do
+ test -d $d && rmdir $d
+ done
+ # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+ if test -f "$ac_aux_dir/mkinstalldirs"; then
+ mkdir_p='$(mkinstalldirs)'
+ else
+ mkdir_p='$(install_sh) -d'
+ fi
+fi
+
+for ac_prog in gawk mawk nawk awk
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_AWK+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$AWK"; then
+ ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AWK="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+ echo "$as_me:$LINENO: result: $AWK" >&5
+echo "${ECHO_T}$AWK" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$AWK" && break
+done
+
+echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'`
+if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.make <<\_ACEOF
+all:
+ @echo 'ac_maketemp="$(MAKE)"'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+ eval ac_cv_prog_make_${ac_make}_set=yes
+else
+ eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftest.make
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ SET_MAKE=
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+ test -f $srcdir/config.status; then
+ { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
+echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='gsl'
+ VERSION='1.9'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'. However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+ ac_ct_STRIP=$STRIP
+ # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":"
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ STRIP=$ac_ct_STRIP
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+
+# We need awk for the "check" target. The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
+
+
+
+
+
+ ac_config_headers="$ac_config_headers config.h"
+
+echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5
+echo $ECHO_N "checking whether to enable maintainer-specific portions of Makefiles... $ECHO_C" >&6
+ # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given.
+if test "${enable_maintainer_mode+set}" = set; then
+ enableval="$enable_maintainer_mode"
+ USE_MAINTAINER_MODE=$enableval
+else
+ USE_MAINTAINER_MODE=no
+fi;
+ echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5
+echo "${ECHO_T}$USE_MAINTAINER_MODE" >&6
+
+
+if test $USE_MAINTAINER_MODE = yes; then
+ MAINTAINER_MODE_TRUE=
+ MAINTAINER_MODE_FALSE='#'
+else
+ MAINTAINER_MODE_TRUE='#'
+ MAINTAINER_MODE_FALSE=
+fi
+
+ MAINT=$MAINTAINER_MODE_TRUE
+
+
+
+
+GSL_LT_VERSION="10:0:10"
+
+GSL_LT_CBLAS_VERSION="0:0:0"
+
+
+case "$VERSION" in
+ *+)
+ cat >>confdefs.h <<\_ACEOF
+#define RELEASED 0
+_ACEOF
+
+ ;;
+ *)
+ cat >>confdefs.h <<\_ACEOF
+#define RELEASED 1
+_ACEOF
+
+ ;;
+esac
+
+
+echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'`
+if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.make <<\_ACEOF
+all:
+ @echo 'ac_maketemp="$(MAKE)"'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+ eval ac_cv_prog_make_${ac_make}_set=yes
+else
+ eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftest.make
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ SET_MAKE=
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+
+# Make sure we can run config.sub.
+$ac_config_sub sun4 >/dev/null 2>&1 ||
+ { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5
+echo "$as_me: error: cannot run $ac_config_sub" >&2;}
+ { (exit 1); exit 1; }; }
+
+echo "$as_me:$LINENO: checking build system type" >&5
+echo $ECHO_N "checking build system type... $ECHO_C" >&6
+if test "${ac_cv_build+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_build_alias=$build_alias
+test -z "$ac_cv_build_alias" &&
+ ac_cv_build_alias=`$ac_config_guess`
+test -z "$ac_cv_build_alias" &&
+ { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
+echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
+ { (exit 1); exit 1; }; }
+ac_cv_build=`$ac_config_sub $ac_cv_build_alias` ||
+ { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;}
+ { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_build" >&5
+echo "${ECHO_T}$ac_cv_build" >&6
+build=$ac_cv_build
+build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+
+echo "$as_me:$LINENO: checking host system type" >&5
+echo $ECHO_N "checking host system type... $ECHO_C" >&6
+if test "${ac_cv_host+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_host_alias=$host_alias
+test -z "$ac_cv_host_alias" &&
+ ac_cv_host_alias=$ac_cv_build_alias
+ac_cv_host=`$ac_config_sub $ac_cv_host_alias` ||
+ { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;}
+ { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_host" >&5
+echo "${ECHO_T}$ac_cv_host" >&6
+host=$ac_cv_host
+host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ CC=$ac_ct_CC
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ CC=$ac_ct_CC
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+fi
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# != 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+ fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$ac_ct_CC" && break
+done
+
+ CC=$ac_ct_CC
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+ "checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+ (eval $ac_compiler --version </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+ (eval $ac_compiler -v </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+ (eval $ac_compiler -V </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
+ (eval $ac_link_default) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # Find the output, starting from the most likely. This scheme is
+# not robust to junk in `.', hence go to wildcards (a.*) only as a last
+# resort.
+
+# Be careful to initialize this variable, since it used to be cached.
+# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
+ac_cv_exeext=
+# b.out is created by i960 compilers.
+for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out
+do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )
+ ;;
+ conftest.$ac_ext )
+ # This is the source file.
+ ;;
+ [ab].out )
+ # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* )
+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ # FIXME: I believe we export ac_cv_exeext for Libtool,
+ # but it would be cool to find out if it's true. Does anybody
+ # maintain Libtool? --akim.
+ export ac_cv_exeext
+ break;;
+ * )
+ break;;
+ esac
+done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
+See \`config.log' for more details." >&5
+echo "$as_me: error: C compiler cannot create executables
+See \`config.log' for more details." >&2;}
+ { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6
+
+# Check the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+ if { ac_try='./$ac_file'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { echo "$as_me:$LINENO: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ fi
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6
+
+echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ export ac_cv_exeext
+ break;;
+ * ) break;;
+ esac
+done
+else
+ { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
+if test "${ac_cv_objext+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_compiler_gnu=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+CFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_g+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cc_g=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cc_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
+echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_stdc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_prog_cc_stdc=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not '\xHH' hex character constants.
+ These don't provoke an error unfortunately, instead are silently treated
+ as 'x'. The following induces an error, until -std1 is added to get
+ proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
+ array size at least. It's necessary to write '\x00'==0 to get something
+ that's true only with -std1. */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
+ ;
+ return 0;
+}
+_ACEOF
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX -qlanglvl=ansi
+# Ultrix and OSF/1 -std1
+# HP-UX 10.20 and later -Ae
+# HP-UX older versions -Aa -D_HPUX_SOURCE
+# SVR4 -Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cc_stdc=$ac_arg
+break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext
+done
+rm -f conftest.$ac_ext conftest.$ac_objext
+CC=$ac_save_CC
+
+fi
+
+case "x$ac_cv_prog_cc_stdc" in
+ x|xno)
+ echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6 ;;
+ *)
+ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
+ CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+
+# Some people use a C++ compiler to compile C. Since we use `exit',
+# in C++ we need to declare it. In case someone uses the same compiler
+# for both compiling C and C++ we need to have the C++ compiler decide
+# the declaration of exit, since it's the most demanding environment.
+cat >conftest.$ac_ext <<_ACEOF
+#ifndef __cplusplus
+ choke me
+#endif
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ for ac_declaration in \
+ '' \
+ 'extern "C" void std::exit (int) throw (); using std::exit;' \
+ 'extern "C" void std::exit (int); using std::exit;' \
+ 'extern "C" void exit (int) throw ();' \
+ 'extern "C" void exit (int);' \
+ 'void exit (int);'
+do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_declaration
+#include <stdlib.h>
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+ echo '#ifdef __cplusplus' >>confdefs.h
+ echo $ac_declaration >>confdefs.h
+ echo '#endif' >>confdefs.h
+fi
+
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+ if test "${ac_cv_prog_CPP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # Double quotes because CPP needs to be expanded
+ for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+ do
+ ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ break
+fi
+
+ done
+ ac_cv_prog_CPP=$CPP
+
+fi
+ CPP=$ac_cv_prog_CPP
+else
+ ac_cv_prog_CPP=$CPP
+fi
+echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ :
+else
+ { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+ ./ | .// | /cC/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+ if test $ac_prog = install &&
+ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+done
+
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL=$ac_install_sh
+ fi
+fi
+echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo "$as_me:$LINENO: checking whether ln -s works" >&5
+echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+ echo "$as_me:$LINENO: result: no, using $LN_S" >&5
+echo "${ECHO_T}no, using $LN_S" >&6
+fi
+
+
+# Check whether --enable-shared or --disable-shared was given.
+if test "${enable_shared+set}" = set; then
+ enableval="$enable_shared"
+ p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_shared=yes ;;
+ no) enable_shared=no ;;
+ *)
+ enable_shared=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for pkg in $enableval; do
+ IFS="$lt_save_ifs"
+ if test "X$pkg" = "X$p"; then
+ enable_shared=yes
+ fi
+ done
+ IFS="$lt_save_ifs"
+ ;;
+ esac
+else
+ enable_shared=yes
+fi;
+
+# Check whether --enable-static or --disable-static was given.
+if test "${enable_static+set}" = set; then
+ enableval="$enable_static"
+ p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_static=yes ;;
+ no) enable_static=no ;;
+ *)
+ enable_static=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for pkg in $enableval; do
+ IFS="$lt_save_ifs"
+ if test "X$pkg" = "X$p"; then
+ enable_static=yes
+ fi
+ done
+ IFS="$lt_save_ifs"
+ ;;
+ esac
+else
+ enable_static=yes
+fi;
+
+# Check whether --enable-fast-install or --disable-fast-install was given.
+if test "${enable_fast_install+set}" = set; then
+ enableval="$enable_fast_install"
+ p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_fast_install=yes ;;
+ no) enable_fast_install=no ;;
+ *)
+ enable_fast_install=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for pkg in $enableval; do
+ IFS="$lt_save_ifs"
+ if test "X$pkg" = "X$p"; then
+ enable_fast_install=yes
+ fi
+ done
+ IFS="$lt_save_ifs"
+ ;;
+ esac
+else
+ enable_fast_install=yes
+fi;
+
+echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5
+echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6
+if test "${lt_cv_path_SED+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # Loop through the user's path and test for sed and gsed.
+# Then use that list of sed's as ones to test for truncation.
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for lt_ac_prog in sed gsed; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
+ lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
+ fi
+ done
+ done
+done
+lt_ac_max=0
+lt_ac_count=0
+# Add /usr/xpg4/bin/sed as it is typically found on Solaris
+# along with /bin/sed that truncates output.
+for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
+ test ! -f $lt_ac_sed && continue
+ cat /dev/null > conftest.in
+ lt_ac_count=0
+ echo $ECHO_N "0123456789$ECHO_C" >conftest.in
+ # Check for GNU sed and select it if it is found.
+ if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
+ lt_cv_path_SED=$lt_ac_sed
+ break
+ fi
+ while true; do
+ cat conftest.in conftest.in >conftest.tmp
+ mv conftest.tmp conftest.in
+ cp conftest.in conftest.nl
+ echo >>conftest.nl
+ $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
+ cmp -s conftest.out conftest.nl || break
+ # 10000 chars as input seems more than enough
+ test $lt_ac_count -gt 10 && break
+ lt_ac_count=`expr $lt_ac_count + 1`
+ if test $lt_ac_count -gt $lt_ac_max; then
+ lt_ac_max=$lt_ac_count
+ lt_cv_path_SED=$lt_ac_sed
+ fi
+ done
+done
+
+fi
+
+SED=$lt_cv_path_SED
+echo "$as_me:$LINENO: result: $SED" >&5
+echo "${ECHO_T}$SED" >&6
+
+echo "$as_me:$LINENO: checking for egrep" >&5
+echo $ECHO_N "checking for egrep... $ECHO_C" >&6
+if test "${ac_cv_prog_egrep+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if echo a | (grep -E '(a|b)') >/dev/null 2>&1
+ then ac_cv_prog_egrep='grep -E'
+ else ac_cv_prog_egrep='egrep'
+ fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5
+echo "${ECHO_T}$ac_cv_prog_egrep" >&6
+ EGREP=$ac_cv_prog_egrep
+
+
+
+# Check whether --with-gnu-ld or --without-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then
+ withval="$with_gnu_ld"
+ test "$withval" = no || with_gnu_ld=yes
+else
+ with_gnu_ld=no
+fi;
+ac_prog=ld
+if test "$GCC" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ echo "$as_me:$LINENO: checking for ld used by $CC" >&5
+echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [\\/]* | ?:[\\/]*)
+ re_direlt='/[^/][^/]*/\.\./'
+ # Canonicalize the pathname of ld
+ ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'`
+ while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD="$ac_prog"
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test "$with_gnu_ld" = yes; then
+ echo "$as_me:$LINENO: checking for GNU ld" >&5
+echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6
+else
+ echo "$as_me:$LINENO: checking for non-GNU ld" >&5
+echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6
+fi
+if test "${lt_cv_path_LD+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -z "$LD"; then
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS="$lt_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ lt_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some variants of GNU ld only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+ *GNU* | *'with BFD'*)
+ test "$with_gnu_ld" != no && break
+ ;;
+ *)
+ test "$with_gnu_ld" != yes && break
+ ;;
+ esac
+ fi
+ done
+ IFS="$lt_save_ifs"
+else
+ lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+ echo "$as_me:$LINENO: result: $LD" >&5
+echo "${ECHO_T}$LD" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
+echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
+ { (exit 1); exit 1; }; }
+echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
+echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6
+if test "${lt_cv_prog_gnu_ld+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ lt_cv_prog_gnu_ld=yes
+ ;;
+*)
+ lt_cv_prog_gnu_ld=no
+ ;;
+esac
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5
+echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5
+echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6
+if test "${lt_cv_ld_reload_flag+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_cv_ld_reload_flag='-r'
+fi
+echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5
+echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+ darwin*)
+ if test "$GCC" = yes; then
+ reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+ else
+ reload_cmds='$LD$reload_flag -o $output$reload_objs'
+ fi
+ ;;
+esac
+
+echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5
+echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6
+if test "${lt_cv_path_NM+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$NM"; then
+ # Let the user override the test.
+ lt_cv_path_NM="$NM"
+else
+ lt_nm_to_check="${ac_tool_prefix}nm"
+ if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+ lt_nm_to_check="$lt_nm_to_check nm"
+ fi
+ for lt_tmp_nm in $lt_nm_to_check; do
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+ IFS="$lt_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ tmp_nm="$ac_dir/$lt_tmp_nm"
+ if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+ # Check to see if the nm accepts a BSD-compat flag.
+ # Adding the `sed 1q' prevents false positives on HP-UX, which says:
+ # nm: unknown option "B" ignored
+ # Tru64's nm complains that /dev/null is an invalid object file
+ case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+ */dev/null* | *'Invalid file or object type'*)
+ lt_cv_path_NM="$tmp_nm -B"
+ break
+ ;;
+ *)
+ case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+ */dev/null*)
+ lt_cv_path_NM="$tmp_nm -p"
+ break
+ ;;
+ *)
+ lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+ continue # so that we can try to find one that supports BSD flags
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ done
+ IFS="$lt_save_ifs"
+ done
+ test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm
+fi
+fi
+echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5
+echo "${ECHO_T}$lt_cv_path_NM" >&6
+NM="$lt_cv_path_NM"
+
+echo "$as_me:$LINENO: checking how to recognise dependent libraries" >&5
+echo $ECHO_N "checking how to recognise dependent libraries... $ECHO_C" >&6
+if test "${lt_cv_deplibs_check_method+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix4* | aix5*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+beos*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+bsdi[45]*)
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
+ lt_cv_file_magic_cmd='/usr/bin/file -L'
+ lt_cv_file_magic_test_file=/shlib/libc.so
+ ;;
+
+cygwin*)
+ # func_win32_libid is a shell function defined in ltmain.sh
+ lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+ lt_cv_file_magic_cmd='func_win32_libid'
+ ;;
+
+mingw* | pw32*)
+ # Base MSYS/MinGW do not provide the 'file' command needed by
+ # func_win32_libid shell function, so use a weaker test based on 'objdump'.
+ lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+ lt_cv_file_magic_cmd='$OBJDUMP -f'
+ ;;
+
+darwin* | rhapsody*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+freebsd* | kfreebsd*-gnu | dragonfly*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+ case $host_cpu in
+ i*86 )
+ # Not sure whether the presence of OpenBSD here was a mistake.
+ # Let's accept both of them until this is cleared up.
+ lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
+ lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+ ;;
+ esac
+ else
+ lt_cv_deplibs_check_method=pass_all
+ fi
+ ;;
+
+gnu*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+hpux10.20* | hpux11*)
+ lt_cv_file_magic_cmd=/usr/bin/file
+ case $host_cpu in
+ ia64*)
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
+ lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+ ;;
+ hppa*64*)
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'
+ lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+ ;;
+ *)
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library'
+ lt_cv_file_magic_test_file=/usr/lib/libc.sl
+ ;;
+ esac
+ ;;
+
+interix3*)
+ # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $LD in
+ *-32|*"-32 ") libmagic=32-bit;;
+ *-n32|*"-n32 ") libmagic=N32;;
+ *-64|*"-64 ") libmagic=64-bit;;
+ *) libmagic=never-match;;
+ esac
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+# This must be Linux ELF.
+linux*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+ else
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
+ fi
+ ;;
+
+newos6*)
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
+ lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_test_file=/usr/lib/libnls.so
+ ;;
+
+nto-qnx*)
+ lt_cv_deplibs_check_method=unknown
+ ;;
+
+openbsd*)
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
+ else
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+ fi
+ ;;
+
+osf3* | osf4* | osf5*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+solaris*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+sysv4 | sysv4.3*)
+ case $host_vendor in
+ motorola)
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+ ;;
+ ncr)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ sequent)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+ ;;
+ sni)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
+ lt_cv_file_magic_test_file=/lib/libc.so
+ ;;
+ siemens)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ pc)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ esac
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+esac
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5
+echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# Check whether --enable-libtool-lock or --disable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then
+ enableval="$enable_libtool_lock"
+
+fi;
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+ # Find out which ABI we are using.
+ echo 'int i;' > conftest.$ac_ext
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ case `/usr/bin/file conftest.$ac_objext` in
+ *ELF-32*)
+ HPUX_IA64_MODE="32"
+ ;;
+ *ELF-64*)
+ HPUX_IA64_MODE="64"
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+*-*-irix6*)
+ # Find out which ABI we are using.
+ echo '#line 3869 "configure"' > conftest.$ac_ext
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ if test "$lt_cv_prog_gnu_ld" = yes; then
+ case `/usr/bin/file conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -melf32bsmip"
+ ;;
+ *N32*)
+ LD="${LD-ld} -melf32bmipn32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -melf64bmip"
+ ;;
+ esac
+ else
+ case `/usr/bin/file conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -32"
+ ;;
+ *N32*)
+ LD="${LD-ld} -n32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -64"
+ ;;
+ esac
+ fi
+ fi
+ rm -rf conftest*
+ ;;
+
+x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*)
+ # Find out which ABI we are using.
+ echo 'int i;' > conftest.$ac_ext
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ case `/usr/bin/file conftest.o` in
+ *32-bit*)
+ case $host in
+ x86_64-*linux*)
+ LD="${LD-ld} -m elf_i386"
+ ;;
+ ppc64-*linux*|powerpc64-*linux*)
+ LD="${LD-ld} -m elf32ppclinux"
+ ;;
+ s390x-*linux*)
+ LD="${LD-ld} -m elf_s390"
+ ;;
+ sparc64-*linux*)
+ LD="${LD-ld} -m elf32_sparc"
+ ;;
+ esac
+ ;;
+ *64-bit*)
+ case $host in
+ x86_64-*linux*)
+ LD="${LD-ld} -m elf_x86_64"
+ ;;
+ ppc*-*linux*|powerpc*-*linux*)
+ LD="${LD-ld} -m elf64ppc"
+ ;;
+ s390*-*linux*)
+ LD="${LD-ld} -m elf64_s390"
+ ;;
+ sparc*-*linux*)
+ LD="${LD-ld} -m elf64_sparc"
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+*-*-sco3.2v5*)
+ # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+ SAVE_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -belf"
+ echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5
+echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6
+if test "${lt_cv_cc_needs_belf+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ lt_cv_cc_needs_belf=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+lt_cv_cc_needs_belf=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5
+echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6
+ if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+ # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+ CFLAGS="$SAVE_CFLAGS"
+ fi
+ ;;
+sparc*-*solaris*)
+ # Find out which ABI we are using.
+ echo 'int i;' > conftest.$ac_ext
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ case `/usr/bin/file conftest.o` in
+ *64-bit*)
+ case $lt_cv_prog_gnu_ld in
+ yes*) LD="${LD-ld} -m elf64_sparc" ;;
+ *) LD="${LD-ld} -64" ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+
+esac
+
+need_locks="$enable_libtool_lock"
+
+
+
+echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
+if test "${ac_cv_header_stdc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_header_stdc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_header_stdc=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "memchr" >/dev/null 2>&1; then
+ :
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "free" >/dev/null 2>&1; then
+ :
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+ if test "$cross_compiling" = yes; then
+ :
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ctype.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+ (('a' <= (c) && (c) <= 'i') \
+ || ('j' <= (c) && (c) <= 'r') \
+ || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+ int i;
+ for (i = 0; i < 256; i++)
+ if (XOR (islower (i), ISLOWER (i))
+ || toupper (i) != TOUPPER (i))
+ exit(2);
+ exit (0);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_header_stdc=no
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6
+if test $ac_cv_header_stdc = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define STDC_HEADERS 1
+_ACEOF
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+
+
+
+
+
+
+
+
+
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+ inttypes.h stdint.h unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_Header=no"
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+for ac_header in dlfcn.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## ------------------------------ ##
+## Report this to the gsl lists. ##
+## ------------------------------ ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers!
+
+# find the maximum length of command line arguments
+echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5
+echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6
+if test "${lt_cv_sys_max_cmd_len+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ i=0
+ teststring="ABCD"
+
+ case $build_os in
+ msdosdjgpp*)
+ # On DJGPP, this test can blow up pretty badly due to problems in libc
+ # (any single argument exceeding 2000 bytes causes a buffer overrun
+ # during glob expansion). Even if it were fixed, the result of this
+ # check would be larger than it should be.
+ lt_cv_sys_max_cmd_len=12288; # 12K is about right
+ ;;
+
+ gnu*)
+ # Under GNU Hurd, this test is not required because there is
+ # no limit to the length of command line arguments.
+ # Libtool will interpret -1 as no limit whatsoever
+ lt_cv_sys_max_cmd_len=-1;
+ ;;
+
+ cygwin* | mingw*)
+ # On Win9x/ME, this test blows up -- it succeeds, but takes
+ # about 5 minutes as the teststring grows exponentially.
+ # Worse, since 9x/ME are not pre-emptively multitasking,
+ # you end up with a "frozen" computer, even though with patience
+ # the test eventually succeeds (with a max line length of 256k).
+ # Instead, let's just punt: use the minimum linelength reported by
+ # all of the supported platforms: 8192 (on NT/2K/XP).
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ amigaos*)
+ # On AmigaOS with pdksh, this test takes hours, literally.
+ # So we just punt and use a minimum line length of 8192.
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+ # This has been around since 386BSD, at least. Likely further.
+ if test -x /sbin/sysctl; then
+ lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+ elif test -x /usr/sbin/sysctl; then
+ lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+ else
+ lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs
+ fi
+ # And add a safety zone
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+ ;;
+
+ interix*)
+ # We know the value 262144 and hardcode it with a safety zone (like BSD)
+ lt_cv_sys_max_cmd_len=196608
+ ;;
+
+ osf*)
+ # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+ # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+ # nice to cause kernel panics so lets avoid the loop below.
+ # First set a reasonable default.
+ lt_cv_sys_max_cmd_len=16384
+ #
+ if test -x /sbin/sysconfig; then
+ case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+ *1*) lt_cv_sys_max_cmd_len=-1 ;;
+ esac
+ fi
+ ;;
+ sco3.2v5*)
+ lt_cv_sys_max_cmd_len=102400
+ ;;
+ sysv5* | sco5v6* | sysv4.2uw2*)
+ kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+ if test -n "$kargmax"; then
+ lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'`
+ else
+ lt_cv_sys_max_cmd_len=32768
+ fi
+ ;;
+ *)
+ # If test is not a shell built-in, we'll probably end up computing a
+ # maximum length that is only half of the actual maximum length, but
+ # we can't tell.
+ SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+ while (test "X"`$SHELL $0 --fallback-echo "X$teststring" 2>/dev/null` \
+ = "XX$teststring") >/dev/null 2>&1 &&
+ new_result=`expr "X$teststring" : ".*" 2>&1` &&
+ lt_cv_sys_max_cmd_len=$new_result &&
+ test $i != 17 # 1/2 MB should be enough
+ do
+ i=`expr $i + 1`
+ teststring=$teststring$teststring
+ done
+ teststring=
+ # Add a significant safety factor because C++ compilers can tack on massive
+ # amounts of additional arguments before passing them to the linker.
+ # It appears as though 1/2 is a usable value.
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+ ;;
+ esac
+
+fi
+
+if test -n $lt_cv_sys_max_cmd_len ; then
+ echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5
+echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6
+else
+ echo "$as_me:$LINENO: result: none" >&5
+echo "${ECHO_T}none" >&6
+fi
+
+
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5
+echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6
+if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix. What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Transform an extracted symbol line into a proper C declaration
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+ symcode='[BCDT]'
+ ;;
+cygwin* | mingw* | pw32*)
+ symcode='[ABCDGISTW]'
+ ;;
+hpux*) # Its linker distinguishes data from code symbols
+ if test "$host_cpu" = ia64; then
+ symcode='[ABCDEGRST]'
+ fi
+ lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+ lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
+ ;;
+linux*)
+ if test "$host_cpu" = ia64; then
+ symcode='[ABCDGIRSTW]'
+ lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+ lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
+ fi
+ ;;
+irix* | nonstopux*)
+ symcode='[BCDEGRST]'
+ ;;
+osf*)
+ symcode='[BCDEGQRST]'
+ ;;
+solaris*)
+ symcode='[BDRT]'
+ ;;
+sco3.2v5*)
+ symcode='[DT]'
+ ;;
+sysv4.2uw2*)
+ symcode='[DT]'
+ ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+ symcode='[ABDT]'
+ ;;
+sysv4)
+ symcode='[DFNSTU]'
+ ;;
+esac
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+ opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+ ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+ symcode='[ABCDGIRSTW]' ;;
+esac
+
+# Try without a prefix undercore, then with it.
+for ac_symprfx in "" "_"; do
+
+ # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+ symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+ # Write the raw and C identifiers.
+ lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+
+ # Check to see that the pipe works correctly.
+ pipe_works=no
+
+ rm -f conftest*
+ cat > conftest.$ac_ext <<EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+EOF
+
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # Now try to grab the symbols.
+ nlist=conftest.nm
+ if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5
+ (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && test -s "$nlist"; then
+ # Try sorting and uniquifying the output.
+ if sort "$nlist" | uniq > "$nlist"T; then
+ mv -f "$nlist"T "$nlist"
+ else
+ rm -f "$nlist"T
+ fi
+
+ # Make sure that we snagged all the symbols we need.
+ if grep ' nm_test_var$' "$nlist" >/dev/null; then
+ if grep ' nm_test_func$' "$nlist" >/dev/null; then
+ cat <<EOF > conftest.$ac_ext
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EOF
+ # Now generate the symbol file.
+ eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext'
+
+ cat <<EOF >> conftest.$ac_ext
+#if defined (__STDC__) && __STDC__
+# define lt_ptr_t void *
+#else
+# define lt_ptr_t char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+const struct {
+ const char *name;
+ lt_ptr_t address;
+}
+lt_preloaded_symbols[] =
+{
+EOF
+ $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext
+ cat <<\EOF >> conftest.$ac_ext
+ {0, (lt_ptr_t) 0}
+};
+
+#ifdef __cplusplus
+}
+#endif
+EOF
+ # Now try linking the two files.
+ mv conftest.$ac_objext conftstm.$ac_objext
+ lt_save_LIBS="$LIBS"
+ lt_save_CFLAGS="$CFLAGS"
+ LIBS="conftstm.$ac_objext"
+ CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
+ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && test -s conftest${ac_exeext}; then
+ pipe_works=yes
+ fi
+ LIBS="$lt_save_LIBS"
+ CFLAGS="$lt_save_CFLAGS"
+ else
+ echo "cannot find nm_test_func in $nlist" >&5
+ fi
+ else
+ echo "cannot find nm_test_var in $nlist" >&5
+ fi
+ else
+ echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
+ fi
+ else
+ echo "$progname: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ fi
+ rm -f conftest* conftst*
+
+ # Do not use the global_symbol_pipe unless it works.
+ if test "$pipe_works" = yes; then
+ break
+ else
+ lt_cv_sys_global_symbol_pipe=
+ fi
+done
+
+fi
+
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+ lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+ echo "$as_me:$LINENO: result: failed" >&5
+echo "${ECHO_T}failed" >&6
+else
+ echo "$as_me:$LINENO: result: ok" >&5
+echo "${ECHO_T}ok" >&6
+fi
+
+echo "$as_me:$LINENO: checking for objdir" >&5
+echo $ECHO_N "checking for objdir... $ECHO_C" >&6
+if test "${lt_cv_objdir+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+ lt_cv_objdir=.libs
+else
+ # MS-DOS does not allow filenames that begin with a dot.
+ lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+fi
+echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5
+echo "${ECHO_T}$lt_cv_objdir" >&6
+objdir=$lt_cv_objdir
+
+
+
+
+
+case $host_os in
+aix3*)
+ # AIX sometimes has problems with the GCC collect2 program. For some
+ # reason, if we set the COLLECT_NAMES environment variable, the problems
+ # vanish in a puff of smoke.
+ if test "X${COLLECT_NAMES+set}" != Xset; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+ fi
+ ;;
+esac
+
+# Sed substitution that helps us do robust quoting. It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='sed -e 1s/^X//'
+sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+# Constants:
+rm="rm -f"
+
+# Global variables:
+default_ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+ltmain="$ac_aux_dir/ltmain.sh"
+ofile="$default_ofile"
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ar; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_AR+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$AR"; then
+ ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AR="${ac_tool_prefix}ar"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+ echo "$as_me:$LINENO: result: $AR" >&5
+echo "${ECHO_T}$AR" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_AR"; then
+ ac_ct_AR=$AR
+ # Extract the first word of "ar", so it can be a program name with args.
+set dummy ar; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_AR+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_AR"; then
+ ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_AR="ar"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_prog_ac_ct_AR" && ac_cv_prog_ac_ct_AR="false"
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+ echo "$as_me:$LINENO: result: $ac_ct_AR" >&5
+echo "${ECHO_T}$ac_ct_AR" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ AR=$ac_ct_AR
+else
+ AR="$ac_cv_prog_AR"
+fi
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_RANLIB+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+ echo "$as_me:$LINENO: result: $RANLIB" >&5
+echo "${ECHO_T}$RANLIB" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+ ac_ct_RANLIB=$RANLIB
+ # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_RANLIB"; then
+ ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_RANLIB="ranlib"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":"
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+ echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
+echo "${ECHO_T}$ac_ct_RANLIB" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ RANLIB=$ac_ct_RANLIB
+else
+ RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+ ac_ct_STRIP=$STRIP
+ # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":"
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ STRIP=$ac_ct_STRIP
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$AR" && AR=ar
+test -z "$AR_FLAGS" && AR_FLAGS=cru
+test -z "$AS" && AS=as
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+test -z "$LD" && LD=ld
+test -z "$LN_S" && LN_S="ln -s"
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+test -z "$NM" && NM=nm
+test -z "$SED" && SED=sed
+test -z "$OBJDUMP" && OBJDUMP=objdump
+test -z "$RANLIB" && RANLIB=:
+test -z "$STRIP" && STRIP=:
+test -z "$ac_objext" && ac_objext=o
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+ case $host_os in
+ openbsd*)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
+ ;;
+ *)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
+ ;;
+ esac
+ old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+fi
+
+for cc_temp in $compiler""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+
+# Only perform the check for file, if the check method requires it
+case $deplibs_check_method in
+file_magic*)
+ if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+ echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5
+echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6
+if test "${lt_cv_path_MAGIC_CMD+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $MAGIC_CMD in
+[\\/*] | ?:[\\/]*)
+ lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+ ;;
+*)
+ lt_save_MAGIC_CMD="$MAGIC_CMD"
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+ for ac_dir in $ac_dummy; do
+ IFS="$lt_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/${ac_tool_prefix}file; then
+ lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
+ if test -n "$file_magic_test_file"; then
+ case $deplibs_check_method in
+ "file_magic "*)
+ file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+ MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+ $EGREP "$file_magic_regex" > /dev/null; then
+ :
+ else
+ cat <<EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such. This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem. Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+EOF
+ fi ;;
+ esac
+ fi
+ break
+ fi
+ done
+ IFS="$lt_save_ifs"
+ MAGIC_CMD="$lt_save_MAGIC_CMD"
+ ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+ echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
+echo "${ECHO_T}$MAGIC_CMD" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+ if test -n "$ac_tool_prefix"; then
+ echo "$as_me:$LINENO: checking for file" >&5
+echo $ECHO_N "checking for file... $ECHO_C" >&6
+if test "${lt_cv_path_MAGIC_CMD+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $MAGIC_CMD in
+[\\/*] | ?:[\\/]*)
+ lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+ ;;
+*)
+ lt_save_MAGIC_CMD="$MAGIC_CMD"
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+ for ac_dir in $ac_dummy; do
+ IFS="$lt_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/file; then
+ lt_cv_path_MAGIC_CMD="$ac_dir/file"
+ if test -n "$file_magic_test_file"; then
+ case $deplibs_check_method in
+ "file_magic "*)
+ file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+ MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+ $EGREP "$file_magic_regex" > /dev/null; then
+ :
+ else
+ cat <<EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such. This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem. Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+EOF
+ fi ;;
+ esac
+ fi
+ break
+ fi
+ done
+ IFS="$lt_save_ifs"
+ MAGIC_CMD="$lt_save_MAGIC_CMD"
+ ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+ echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
+echo "${ECHO_T}$MAGIC_CMD" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ else
+ MAGIC_CMD=:
+ fi
+fi
+
+ fi
+ ;;
+esac
+
+enable_dlopen=no
+enable_win32_dll=no
+
+# Check whether --enable-libtool-lock or --disable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then
+ enableval="$enable_libtool_lock"
+
+fi;
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+
+# Check whether --with-pic or --without-pic was given.
+if test "${with_pic+set}" = set; then
+ withval="$with_pic"
+ pic_mode="$withval"
+else
+ pic_mode=default
+fi;
+test -z "$pic_mode" && pic_mode=default
+
+# Use C for the default configuration in the libtool script
+tagname=
+lt_save_CC="$CC"
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+objext=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}\n'
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+printf "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$rm conftest*
+
+ac_outfile=conftest.$ac_objext
+printf "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$rm conftest*
+
+
+
+lt_prog_compiler_no_builtin_flag=
+
+if test "$GCC" = yes; then
+ lt_prog_compiler_no_builtin_flag=' -fno-builtin'
+
+
+echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6
+if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_cv_prog_compiler_rtti_exceptions=no
+ ac_outfile=conftest.$ac_objext
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="-fno-rtti -fno-exceptions"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:5358: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:5362: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_rtti_exceptions=yes
+ fi
+ fi
+ $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6
+
+if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
+ lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
+else
+ :
+fi
+
+fi
+
+lt_prog_compiler_wl=
+lt_prog_compiler_pic=
+lt_prog_compiler_static=
+
+echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
+echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6
+
+ if test "$GCC" = yes; then
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_static='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static='-Bstatic'
+ fi
+ ;;
+
+ amigaos*)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the `-m68020' flag to GCC prevents building anything better,
+ # like `-m68040'.
+ lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
+ ;;
+
+ beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+
+ mingw* | pw32* | os2*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ lt_prog_compiler_pic='-DDLL_EXPORT'
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic='-fno-common'
+ ;;
+
+ interix3*)
+ # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+ # Instead, we relocate shared libraries at runtime.
+ ;;
+
+ msdosdjgpp*)
+ # Just because we use GCC doesn't mean we suddenly get shared libraries
+ # on systems that don't support them.
+ lt_prog_compiler_can_build_shared=no
+ enable_shared=no
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic=-Kconform_pic
+ fi
+ ;;
+
+ hpux*)
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+ esac
+ ;;
+
+ *)
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+ esac
+ else
+ # PORTME Check for flag to pass linker flags through the system compiler.
+ case $host_os in
+ aix*)
+ lt_prog_compiler_wl='-Wl,'
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static='-Bstatic'
+ else
+ lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+ darwin*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ case $cc_basename in
+ xlc*)
+ lt_prog_compiler_pic='-qnocommon'
+ lt_prog_compiler_wl='-Wl,'
+ ;;
+ esac
+ ;;
+
+ mingw* | pw32* | os2*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ lt_prog_compiler_pic='-DDLL_EXPORT'
+ ;;
+
+ hpux9* | hpux10* | hpux11*)
+ lt_prog_compiler_wl='-Wl,'
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic='+Z'
+ ;;
+ esac
+ # Is there a better lt_prog_compiler_static that works with the bundled CC?
+ lt_prog_compiler_static='${wl}-a ${wl}archive'
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ lt_prog_compiler_wl='-Wl,'
+ # PIC (with -KPIC) is the default.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+
+ newsos6)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ linux*)
+ case $cc_basename in
+ icc* | ecc*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ pgcc* | pgf77* | pgf90* | pgf95*)
+ # Portland Group compilers (*not* the Pentium gcc compiler,
+ # which looks to be a dead project)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fpic'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ ccc*)
+ lt_prog_compiler_wl='-Wl,'
+ # All Alpha code is PIC.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+ esac
+ ;;
+
+ osf3* | osf4* | osf5*)
+ lt_prog_compiler_wl='-Wl,'
+ # All OSF/1 code is PIC.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+
+ solaris*)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ case $cc_basename in
+ f77* | f90* | f95*)
+ lt_prog_compiler_wl='-Qoption ld ';;
+ *)
+ lt_prog_compiler_wl='-Wl,';;
+ esac
+ ;;
+
+ sunos4*)
+ lt_prog_compiler_wl='-Qoption ld '
+ lt_prog_compiler_pic='-PIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ sysv4 | sysv4.2uw2* | sysv4.3*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec ;then
+ lt_prog_compiler_pic='-Kconform_pic'
+ lt_prog_compiler_static='-Bstatic'
+ fi
+ ;;
+
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ unicos*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_can_build_shared=no
+ ;;
+
+ uts4*)
+ lt_prog_compiler_pic='-pic'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ *)
+ lt_prog_compiler_can_build_shared=no
+ ;;
+ esac
+ fi
+
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic" >&6
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic"; then
+
+echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6
+if test "${lt_prog_compiler_pic_works+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_prog_compiler_pic_works=no
+ ac_outfile=conftest.$ac_objext
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:5626: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:5630: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_prog_compiler_pic_works=yes
+ fi
+ fi
+ $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_works" >&6
+
+if test x"$lt_prog_compiler_pic_works" = xyes; then
+ case $lt_prog_compiler_pic in
+ "" | " "*) ;;
+ *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
+ esac
+else
+ lt_prog_compiler_pic=
+ lt_prog_compiler_can_build_shared=no
+fi
+
+fi
+case $host_os in
+ # For platforms which do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ lt_prog_compiler_pic=
+ ;;
+ *)
+ lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
+ ;;
+esac
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
+echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6
+if test "${lt_prog_compiler_static_works+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_prog_compiler_static_works=no
+ save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+ printf "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&5
+ $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_prog_compiler_static_works=yes
+ fi
+ else
+ lt_prog_compiler_static_works=yes
+ fi
+ fi
+ $rm conftest*
+ LDFLAGS="$save_LDFLAGS"
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5
+echo "${ECHO_T}$lt_prog_compiler_static_works" >&6
+
+if test x"$lt_prog_compiler_static_works" = xyes; then
+ :
+else
+ lt_prog_compiler_static=
+fi
+
+
+echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6
+if test "${lt_cv_prog_compiler_c_o+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_cv_prog_compiler_c_o=no
+ $rm -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:5730: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:5734: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_c_o=yes
+ fi
+ fi
+ chmod u+w . 2>&5
+ $rm conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
+ $rm out/* && rmdir out
+ cd ..
+ rmdir conftest
+ $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
+ # do not overwrite the value of need_locks provided by the user
+ echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
+echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6
+ hard_links=yes
+ $rm conftest*
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ touch conftest.a
+ ln conftest.a conftest.b 2>&5 || hard_links=no
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ echo "$as_me:$LINENO: result: $hard_links" >&5
+echo "${ECHO_T}$hard_links" >&6
+ if test "$hard_links" = no; then
+ { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+ need_locks=warn
+ fi
+else
+ need_locks=no
+fi
+
+echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
+
+ runpath_var=
+ allow_undefined_flag=
+ enable_shared_with_static_runtimes=no
+ archive_cmds=
+ archive_expsym_cmds=
+ old_archive_From_new_cmds=
+ old_archive_from_expsyms_cmds=
+ export_dynamic_flag_spec=
+ whole_archive_flag_spec=
+ thread_safe_flag_spec=
+ hardcode_libdir_flag_spec=
+ hardcode_libdir_flag_spec_ld=
+ hardcode_libdir_separator=
+ hardcode_direct=no
+ hardcode_minus_L=no
+ hardcode_shlibpath_var=unsupported
+ link_all_deplibs=unknown
+ hardcode_automatic=no
+ module_cmds=
+ module_expsym_cmds=
+ always_export_symbols=no
+ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ # include_expsyms should be a list of space-separated symbols to be *always*
+ # included in the symbol list
+ include_expsyms=
+ # exclude_expsyms can be an extended regexp of symbols to exclude
+ # it will be wrapped by ` (' and `)$', so one must not match beginning or
+ # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+ # as well as any symbol that contains `d'.
+ exclude_expsyms="_GLOBAL_OFFSET_TABLE_"
+ # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+ # platforms (ab)use it in PIC code, but their linkers get confused if
+ # the symbol is explicitly referenced. Since portable code cannot
+ # rely on this symbol name, it's probably fine to never include it in
+ # preloaded symbol tables.
+ extract_expsyms_cmds=
+ # Just being paranoid about ensuring that cc_basename is set.
+ for cc_temp in $compiler""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+ case $host_os in
+ cygwin* | mingw* | pw32*)
+ # FIXME: the MSVC++ port hasn't been tested in a loooong time
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ if test "$GCC" != yes; then
+ with_gnu_ld=no
+ fi
+ ;;
+ interix*)
+ # we just hope/assume this is gcc and not c89 (= MSVC++)
+ with_gnu_ld=yes
+ ;;
+ openbsd*)
+ with_gnu_ld=no
+ ;;
+ esac
+
+ ld_shlibs=yes
+ if test "$with_gnu_ld" = yes; then
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ wlarc='${wl}'
+
+ # Set some defaults for GNU ld with shared library support. These
+ # are reset later if shared libraries are not supported. Putting them
+ # here allows them to be overridden if necessary.
+ runpath_var=LD_RUN_PATH
+ hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir'
+ export_dynamic_flag_spec='${wl}--export-dynamic'
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then
+ whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ else
+ whole_archive_flag_spec=
+ fi
+ supports_anon_versioning=no
+ case `$LD -v 2>/dev/null` in
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+ *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+ *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+ *\ 2.11.*) ;; # other 2.11 versions
+ *) supports_anon_versioning=yes ;;
+ esac
+
+ # See if GNU ld supports shared libraries.
+ case $host_os in
+ aix3* | aix4* | aix5*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test "$host_cpu" != ia64; then
+ ld_shlibs=no
+ cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support. If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+ fi
+ ;;
+
+ amigaos*)
+ archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+
+ # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
+ # that the semantics of dynamic libraries on AmigaOS, at least up
+ # to version 4, is to share data among multiple programs linked
+ # with the same dynamic library. Since this doesn't match the
+ # behavior of shared libraries on other platforms, we can't use
+ # them.
+ ld_shlibs=no
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ allow_undefined_flag=unsupported
+ # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
+ # as there is no search path for DLLs.
+ hardcode_libdir_flag_spec='-L$libdir'
+ allow_undefined_flag=unsupported
+ always_export_symbols=no
+ enable_shared_with_static_runtimes=yes
+ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols'
+
+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ # If the export-symbols file already is a .def file (1st line
+ # is EXPORTS), use it as is; otherwise, prepend...
+ archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ interix3*)
+ hardcode_direct=no
+ hardcode_shlibpath_var=no
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ export_dynamic_flag_spec='${wl}-E'
+ # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+ # Instead, shared libraries are loaded at an image base (0x10000000 by
+ # default) and relocated if they conflict, which is a slow very memory
+ # consuming and fragmenting process. To avoid this, we pick a random,
+ # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+ # time. Moving up from 0x10000000 also allows more sbrk(2) space.
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ ;;
+
+ linux*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ tmp_addflag=
+ case $cc_basename,$host_cpu in
+ pgcc*) # Portland Group C compiler
+ whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+ tmp_addflag=' $pic_flag'
+ ;;
+ pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers
+ whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+ tmp_addflag=' $pic_flag -Mnomain' ;;
+ ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64
+ tmp_addflag=' -i_dynamic' ;;
+ efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64
+ tmp_addflag=' -i_dynamic -nofor_main' ;;
+ ifc* | ifort*) # Intel Fortran compiler
+ tmp_addflag=' -nofor_main' ;;
+ esac
+ archive_cmds='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+ if test $supports_anon_versioning = yes; then
+ archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ $echo "local: *; };" >> $output_objdir/$libname.ver~
+ $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+ fi
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+ wlarc=
+ else
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ fi
+ ;;
+
+ solaris*)
+ if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+ ld_shlibs=no
+ cat <<EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+EOF
+ elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+ case `$LD -v 2>&1` in
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+ ld_shlibs=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+ ;;
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+ ;;
+
+ sunos4*)
+ archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ wlarc=
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+
+ if test "$ld_shlibs" = no; then
+ runpath_var=
+ hardcode_libdir_flag_spec=
+ export_dynamic_flag_spec=
+ whole_archive_flag_spec=
+ fi
+ else
+ # PORTME fill in a description of your system's linker (not GNU ld)
+ case $host_os in
+ aix3*)
+ allow_undefined_flag=unsupported
+ always_export_symbols=yes
+ archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+ # Note: this linker hardcodes the directories in LIBPATH if there
+ # are no directories specified by -L.
+ hardcode_minus_L=yes
+ if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+ # Neither direct hardcoding nor static linking is supported with a
+ # broken collect2.
+ hardcode_direct=unsupported
+ fi
+ ;;
+
+ aix4* | aix5*)
+ if test "$host_cpu" = ia64; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=""
+ else
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to AIX nm, but means don't demangle with GNU nm
+ if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+ export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+ else
+ export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+ fi
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # need to do runtime linking.
+ case $host_os in aix4.[23]|aix4.[23].*|aix5*)
+ for ld_flag in $LDFLAGS; do
+ if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+ aix_use_runtimelinking=yes
+ break
+ fi
+ done
+ ;;
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ archive_cmds=''
+ hardcode_direct=yes
+ hardcode_libdir_separator=':'
+ link_all_deplibs=yes
+
+ if test "$GCC" = yes; then
+ case $host_os in aix4.[012]|aix4.[012].*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`${CC} -print-prog-name=collect2`
+ if test -f "$collect2name" && \
+ strings "$collect2name" | grep resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ hardcode_direct=yes
+ else
+ # We have old collect2
+ hardcode_direct=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ hardcode_minus_L=yes
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_libdir_separator=
+ fi
+ ;;
+ esac
+ shared_flag='-shared'
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag="$shared_flag "'${wl}-G'
+ fi
+ else
+ # not using gcc
+ if test "$host_cpu" = ia64; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag='${wl}-G'
+ else
+ shared_flag='${wl}-bM:SRE'
+ fi
+ fi
+ fi
+
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to export.
+ always_export_symbols=yes
+ if test "$aix_use_runtimelinking" = yes; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ allow_undefined_flag='-berok'
+ # Determine the default libpath from the value encoded in an empty executable.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`; fi
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+ hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+ archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+ else
+ if test "$host_cpu" = ia64; then
+ hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+ allow_undefined_flag="-z nodefs"
+ archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an empty executable.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`; fi
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+ hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ no_undefined_flag=' ${wl}-bernotok'
+ allow_undefined_flag=' ${wl}-berok'
+ # Exported symbols can be pulled into shared objects from archives
+ whole_archive_flag_spec='$convenience'
+ archive_cmds_need_lc=yes
+ # This is similar to how AIX traditionally builds its shared libraries.
+ archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+ fi
+ fi
+ ;;
+
+ amigaos*)
+ archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ # see comment about different semantics on the GNU ld section
+ ld_shlibs=no
+ ;;
+
+ bsdi[45]*)
+ export_dynamic_flag_spec=-rdynamic
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec=' '
+ allow_undefined_flag=unsupported
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=".dll"
+ # FIXME: Setting linknames here is a bad hack.
+ archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
+ # The linker will automatically build a .lib file if we build a DLL.
+ old_archive_From_new_cmds='true'
+ # FIXME: Should let the user specify the lib program.
+ old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs'
+ fix_srcfile_path='`cygpath -w "$srcfile"`'
+ enable_shared_with_static_runtimes=yes
+ ;;
+
+ darwin* | rhapsody*)
+ case $host_os in
+ rhapsody* | darwin1.[012])
+ allow_undefined_flag='${wl}-undefined ${wl}suppress'
+ ;;
+ *) # Darwin 1.3 on
+ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+ allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ else
+ case ${MACOSX_DEPLOYMENT_TARGET} in
+ 10.[012])
+ allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ ;;
+ 10.*)
+ allow_undefined_flag='${wl}-undefined ${wl}dynamic_lookup'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ archive_cmds_need_lc=no
+ hardcode_direct=no
+ hardcode_automatic=yes
+ hardcode_shlibpath_var=unsupported
+ whole_archive_flag_spec=''
+ link_all_deplibs=yes
+ if test "$GCC" = yes ; then
+ output_verbose_link_cmd='echo'
+ archive_cmds='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+ module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ else
+ case $cc_basename in
+ xlc*)
+ output_verbose_link_cmd='echo'
+ archive_cmds='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
+ module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ ;;
+ *)
+ ld_shlibs=no
+ ;;
+ esac
+ fi
+ ;;
+
+ dgux*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_shlibpath_var=no
+ ;;
+
+ freebsd1*)
+ ld_shlibs=no
+ ;;
+
+ # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+ # support. Future versions do this automatically, but an explicit c++rt0.o
+ # does not break anything, and helps significantly (at the cost of a little
+ # extra space).
+ freebsd2.2*)
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+ freebsd2*)
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+ freebsd* | kfreebsd*-gnu | dragonfly*)
+ archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ hpux9*)
+ if test "$GCC" = yes; then
+ archive_cmds='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ else
+ archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ fi
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ export_dynamic_flag_spec='${wl}-E'
+ ;;
+
+ hpux10*)
+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+ archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ if test "$with_gnu_ld" = no; then
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+
+ hardcode_direct=yes
+ export_dynamic_flag_spec='${wl}-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ fi
+ ;;
+
+ hpux11*)
+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ else
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ fi
+ if test "$with_gnu_ld" = no; then
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+
+ case $host_cpu in
+ hppa*64*|ia64*)
+ hardcode_libdir_flag_spec_ld='+b $libdir'
+ hardcode_direct=no
+ hardcode_shlibpath_var=no
+ ;;
+ *)
+ hardcode_direct=yes
+ export_dynamic_flag_spec='${wl}-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ ;;
+ esac
+ fi
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ if test "$GCC" = yes; then
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ hardcode_libdir_flag_spec_ld='-rpath $libdir'
+ fi
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ link_all_deplibs=yes
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
+ else
+ archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
+ fi
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ newsos6)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ hardcode_shlibpath_var=no
+ ;;
+
+ openbsd*)
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ export_dynamic_flag_spec='${wl}-E'
+ else
+ case $host_os in
+ openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='-R$libdir'
+ ;;
+ *)
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ ;;
+ esac
+ fi
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ allow_undefined_flag=unsupported
+ archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+ old_archive_From_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+ ;;
+
+ osf3*)
+ if test "$GCC" = yes; then
+ allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ allow_undefined_flag=' -expect_unresolved \*'
+ archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ fi
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ ;;
+
+ osf4* | osf5*) # as osf3* with the addition of -msym flag
+ if test "$GCC" = yes; then
+ allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ else
+ allow_undefined_flag=' -expect_unresolved \*'
+ archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
+ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp'
+
+ # Both c and cxx compiler support -rpath directly
+ hardcode_libdir_flag_spec='-rpath $libdir'
+ fi
+ hardcode_libdir_separator=:
+ ;;
+
+ solaris*)
+ no_undefined_flag=' -z text'
+ if test "$GCC" = yes; then
+ wlarc='${wl}'
+ archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
+ else
+ wlarc=''
+ archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+ fi
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_shlibpath_var=no
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *)
+ # The compiler driver will combine linker options so we
+ # cannot just pass the convience library names through
+ # without $wl, iff we do not link with $LD.
+ # Luckily, gcc supports the same syntax we need for Sun Studio.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ case $wlarc in
+ '')
+ whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;;
+ *)
+ whole_archive_flag_spec='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;;
+ esac ;;
+ esac
+ link_all_deplibs=yes
+ ;;
+
+ sunos4*)
+ if test "x$host_vendor" = xsequent; then
+ # Use $CC to link under sequent, because it throws in some extra .o
+ # files that make .init and .fini sections work.
+ archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ sysv4)
+ case $host_vendor in
+ sni)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes # is this really true???
+ ;;
+ siemens)
+ ## LD is ld it makes a PLAMLIB
+ ## CC just makes a GrossModule.
+ archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+ reload_cmds='$CC -r -o $output$reload_objs'
+ hardcode_direct=no
+ ;;
+ motorola)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+ ;;
+ esac
+ runpath_var='LD_RUN_PATH'
+ hardcode_shlibpath_var=no
+ ;;
+
+ sysv4.3*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var=no
+ export_dynamic_flag_spec='-Bexport'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var=no
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ ld_shlibs=yes
+ fi
+ ;;
+
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*)
+ no_undefined_flag='${wl}-z,text'
+ archive_cmds_need_lc=no
+ hardcode_shlibpath_var=no
+ runpath_var='LD_RUN_PATH'
+
+ if test "$GCC" = yes; then
+ archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6*)
+ # Note: We can NOT use -z defs as we might desire, because we do not
+ # link with -lc, and that would cause any symbols used from libc to
+ # always be unresolved, which means just about no library would
+ # ever link correctly. If we're not using GNU ld we use -z text
+ # though, which does catch some bad symbols but isn't as heavy-handed
+ # as -z defs.
+ no_undefined_flag='${wl}-z,text'
+ allow_undefined_flag='${wl}-z,nodefs'
+ archive_cmds_need_lc=no
+ hardcode_shlibpath_var=no
+ hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+ hardcode_libdir_separator=':'
+ link_all_deplibs=yes
+ export_dynamic_flag_spec='${wl}-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ if test "$GCC" = yes; then
+ archive_cmds='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ uts4*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_shlibpath_var=no
+ ;;
+
+ *)
+ ld_shlibs=no
+ ;;
+ esac
+ fi
+
+echo "$as_me:$LINENO: result: $ld_shlibs" >&5
+echo "${ECHO_T}$ld_shlibs" >&6
+test "$ld_shlibs" = no && can_build_shared=no
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc" in
+x|xyes)
+ # Assume -lc should be added
+ archive_cmds_need_lc=yes
+
+ if test "$enable_shared" = yes && test "$GCC" = yes; then
+ case $archive_cmds in
+ *'~'*)
+ # FIXME: we may have to deal with multi-command sequences.
+ ;;
+ '$CC '*)
+ # Test whether the compiler implicitly links with -lc since on some
+ # systems, -lgcc has to come before -lc. If gcc already passes -lc
+ # to ld, don't add -lc before -lgcc.
+ echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
+echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6
+ $rm conftest*
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } 2>conftest.err; then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$lt_prog_compiler_wl
+ pic_flag=$lt_prog_compiler_pic
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$allow_undefined_flag
+ allow_undefined_flag=
+ if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5
+ (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ then
+ archive_cmds_need_lc=no
+ else
+ archive_cmds_need_lc=yes
+ fi
+ allow_undefined_flag=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $rm conftest*
+ echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5
+echo "${ECHO_T}$archive_cmds_need_lc" >&6
+ ;;
+ esac
+ fi
+ ;;
+esac
+
+echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
+echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
+ # if the path contains ";" then we assume it to be the separator
+ # otherwise default to the standard path separator (i.e. ":") - it is
+ # assumed that no part of a normal pathname contains ";" but that should
+ # okay in the real world where ";" in dirpaths is itself problematic.
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+else
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+ shlibpath_var=LIBPATH
+
+ # AIX 3 has no versioning support, so we append a major version to the name.
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+
+aix4* | aix5*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ hardcode_into_libs=yes
+ if test "$host_cpu" = ia64; then
+ # AIX 5 supports IA64
+ library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ else
+ # With GCC up to 2.95.x, collect2 would create an import file
+ # for dependence libraries. The import file would start with
+ # the line `#! .'. This would cause the generated library to
+ # depend on `.', always an invalid library. This was fixed in
+ # development snapshots of GCC prior to 3.0.
+ case $host_os in
+ aix4 | aix4.[01] | aix4.[01].*)
+ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+ echo ' yes '
+ echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
+ :
+ else
+ can_build_shared=no
+ fi
+ ;;
+ esac
+ # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+ # soname into executable. Probably we can add versioning support to
+ # collect2, so additional links can be useful in future.
+ if test "$aix_use_runtimelinking" = yes; then
+ # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+ # instead of lib<name>.a to let people know that these are not
+ # typical AIX shared libraries.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ else
+ # We preserve .a as extension for shared libraries through AIX4.2
+ # and later when we are not doing run time linking.
+ library_names_spec='${libname}${release}.a $libname.a'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ fi
+ shlibpath_var=LIBPATH
+ fi
+ ;;
+
+amigaos*)
+ library_names_spec='$libname.ixlibrary $libname.a'
+ # Create ${libname}_ixlibrary.a entries in /sys/libs.
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+ ;;
+
+beos*)
+ library_names_spec='${libname}${shared_ext}'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi[45]*)
+ version_type=linux
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+ # the default ld.so.conf also contains /usr/contrib/lib and
+ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+ # libtool to hard-code these into programs
+ ;;
+
+cygwin* | mingw* | pw32*)
+ version_type=windows
+ shrext_cmds=".dll"
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$host_os in
+ yes,cygwin* | yes,mingw* | yes,pw32*)
+ library_names_spec='$libname.dll.a'
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \${file}`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $rm \$dlpath'
+ shlibpath_overrides_runpath=yes
+
+ case $host_os in
+ cygwin*)
+ # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+ soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+ ;;
+ mingw*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then
+ # It is most probably a Windows format PATH printed by
+ # mingw gcc, but we are running on Cygwin. Gcc prints its search
+ # path with ; separators, and with drive letters. We can handle the
+ # drive letters (cygwin fileutils understands them), so leave them,
+ # especially as we might pass files found there to a mingw objdump,
+ # which wouldn't understand a cygwinified path. Ahh.
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ ;;
+ pw32*)
+ # pw32 DLLs use 'pw' prefix rather than 'lib'
+ library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ ;;
+ esac
+ ;;
+
+ *)
+ library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ # FIXME: first we should search . and the directory the executable is in
+ shlibpath_var=PATH
+ ;;
+
+darwin* | rhapsody*)
+ dynamic_linker="$host_os dyld"
+ version_type=darwin
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+ soname_spec='${libname}${release}${major}$shared_ext'
+ shlibpath_overrides_runpath=yes
+ shlibpath_var=DYLD_LIBRARY_PATH
+ shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+ # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
+ if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
+ else
+ sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
+ fi
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+freebsd1*)
+ dynamic_linker=no
+ ;;
+
+kfreebsd*-gnu)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='GNU ld.so'
+ ;;
+
+freebsd* | dragonfly*)
+ # DragonFly does not have aout. When/if they implement a new
+ # versioning mechanism, adjust this.
+ if test -x /usr/bin/objformat; then
+ objformat=`/usr/bin/objformat`
+ else
+ case $host_os in
+ freebsd[123]*) objformat=aout ;;
+ *) objformat=elf ;;
+ esac
+ fi
+ version_type=freebsd-$objformat
+ case $version_type in
+ freebsd-elf*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+ need_version=no
+ need_lib_prefix=no
+ ;;
+ freebsd-*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+ need_version=yes
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_os in
+ freebsd2*)
+ shlibpath_overrides_runpath=yes
+ ;;
+ freebsd3.[01]* | freebsdelf3.[01]*)
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+ freebsd*) # from 4.6 on
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+gnu*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ hardcode_into_libs=yes
+ ;;
+
+hpux9* | hpux10* | hpux11*)
+ # Give a soname corresponding to the major version so that dld.sl refuses to
+ # link against other versions.
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ case $host_cpu in
+ ia64*)
+ shrext_cmds='.so'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.so"
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ if test "X$HPUX_IA64_MODE" = X32; then
+ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+ else
+ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+ fi
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ hppa*64*)
+ shrext_cmds='.sl'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ *)
+ shrext_cmds='.sl'
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=SHLIB_PATH
+ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+ esac
+ # HP-UX runs *really* slowly unless shared libraries are mode 555.
+ postinstall_cmds='chmod 555 $lib'
+ ;;
+
+interix3*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $host_os in
+ nonstopux*) version_type=nonstopux ;;
+ *)
+ if test "$lt_cv_prog_gnu_ld" = yes; then
+ version_type=linux
+ else
+ version_type=irix
+ fi ;;
+ esac
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+ case $host_os in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in # libtool.m4 will add one of these switches to LD
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+ libsuff= shlibsuff= libmagic=32-bit;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+ libsuff=32 shlibsuff=N32 libmagic=N32;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+ libsuff=64 shlibsuff=64 libmagic=64-bit;;
+ *) libsuff= shlibsuff= libmagic=never-match;;
+ esac
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+ sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+ hardcode_into_libs=yes
+ ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+ dynamic_linker=no
+ ;;
+
+# This must be Linux ELF.
+linux*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ # Append ld.so.conf contents to the search path
+ if test -f /etc/ld.so.conf; then
+ lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
+ sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+ fi
+
+ # We used to test for /lib/ld.so.1 and disable shared libraries on
+ # powerpc, because MkLinux only supported shared libraries with the
+ # GNU dynamic linker. Since this was broken with cross compilers,
+ # most powerpc-linux boxes support dynamic linking these days and
+ # people can always --disable-shared, the test was removed, and we
+ # assume the GNU/Linux dynamic linker is in use.
+ dynamic_linker='GNU/Linux ld.so'
+ ;;
+
+knetbsd*-gnu)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='GNU ld.so'
+ ;;
+
+netbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ dynamic_linker='NetBSD (a.out) ld.so'
+ else
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ dynamic_linker='NetBSD ld.elf_so'
+ fi
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+
+newsos6)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+nto-qnx*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+openbsd*)
+ version_type=sunos
+ sys_lib_dlsearch_path_spec="/usr/lib"
+ need_lib_prefix=no
+ # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+ case $host_os in
+ openbsd3.3 | openbsd3.3.*) need_version=yes ;;
+ *) need_version=no ;;
+ esac
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ case $host_os in
+ openbsd2.[89] | openbsd2.[89].*)
+ shlibpath_overrides_runpath=no
+ ;;
+ *)
+ shlibpath_overrides_runpath=yes
+ ;;
+ esac
+ else
+ shlibpath_overrides_runpath=yes
+ fi
+ ;;
+
+os2*)
+ libname_spec='$name'
+ shrext_cmds=".dll"
+ need_lib_prefix=no
+ library_names_spec='$libname${shared_ext} $libname.a'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=LIBPATH
+ ;;
+
+osf3* | osf4* | osf5*)
+ version_type=osf
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+ sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+ ;;
+
+solaris*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ # ldd complains unless libraries are executable
+ postinstall_cmds='chmod +x $lib'
+ ;;
+
+sunos4*)
+ version_type=sunos
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ if test "$with_gnu_ld" = yes; then
+ need_lib_prefix=no
+ fi
+ need_version=yes
+ ;;
+
+sysv4 | sysv4.3*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_vendor in
+ sni)
+ shlibpath_overrides_runpath=no
+ need_lib_prefix=no
+ export_dynamic_flag_spec='${wl}-Blargedynsym'
+ runpath_var=LD_RUN_PATH
+ ;;
+ siemens)
+ need_lib_prefix=no
+ ;;
+ motorola)
+ need_lib_prefix=no
+ need_version=no
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+ ;;
+ esac
+ ;;
+
+sysv4*MP*)
+ if test -d /usr/nec ;then
+ version_type=linux
+ library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+ soname_spec='$libname${shared_ext}.$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ fi
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ version_type=freebsd-elf
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ hardcode_into_libs=yes
+ if test "$with_gnu_ld" = yes; then
+ sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+ shlibpath_overrides_runpath=no
+ else
+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+ shlibpath_overrides_runpath=yes
+ case $host_os in
+ sco3.2v5*)
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+ ;;
+ esac
+ fi
+ sys_lib_dlsearch_path_spec='/usr/lib'
+ ;;
+
+uts4*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+*)
+ dynamic_linker=no
+ ;;
+esac
+echo "$as_me:$LINENO: result: $dynamic_linker" >&5
+echo "${ECHO_T}$dynamic_linker" >&6
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
+echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" || \
+ test -n "$runpath_var" || \
+ test "X$hardcode_automatic" = "Xyes" ; then
+
+ # We can hardcode non-existant directories.
+ if test "$hardcode_direct" != no &&
+ # If the only mechanism to avoid hardcoding is shlibpath_var, we
+ # have to relink, otherwise we might link with an installed library
+ # when we should be linking with a yet-to-be-installed one
+ ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, )" != no &&
+ test "$hardcode_minus_L" != no; then
+ # Linking always hardcodes the temporary library directory.
+ hardcode_action=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ hardcode_action=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ hardcode_action=unsupported
+fi
+echo "$as_me:$LINENO: result: $hardcode_action" >&5
+echo "${ECHO_T}$hardcode_action" >&6
+
+if test "$hardcode_action" = relink; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+ test "$enable_shared" = no; then
+ # Fast installation is not necessary
+ enable_fast_install=needless
+fi
+
+striplib=
+old_striplib=
+echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5
+echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6
+if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then
+ test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+ test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+ case $host_os in
+ darwin*)
+ if test -n "$STRIP" ; then
+ striplib="$STRIP -x"
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+ ;;
+ *)
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ ;;
+ esac
+fi
+
+if test "x$enable_dlopen" != xyes; then
+ enable_dlopen=unknown
+ enable_dlopen_self=unknown
+ enable_dlopen_self_static=unknown
+else
+ lt_cv_dlopen=no
+ lt_cv_dlopen_libs=
+
+ case $host_os in
+ beos*)
+ lt_cv_dlopen="load_add_on"
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+ ;;
+
+ mingw* | pw32*)
+ lt_cv_dlopen="LoadLibrary"
+ lt_cv_dlopen_libs=
+ ;;
+
+ cygwin*)
+ lt_cv_dlopen="dlopen"
+ lt_cv_dlopen_libs=
+ ;;
+
+ darwin*)
+ # if libdl is installed we need to link against it
+ echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
+echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6
+if test "${ac_cv_lib_dl_dlopen+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+int
+main ()
+{
+dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_dl_dlopen=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_dl_dlopen=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6
+if test $ac_cv_lib_dl_dlopen = yes; then
+ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+
+ lt_cv_dlopen="dyld"
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+
+fi
+
+ ;;
+
+ *)
+ echo "$as_me:$LINENO: checking for shl_load" >&5
+echo $ECHO_N "checking for shl_load... $ECHO_C" >&6
+if test "${ac_cv_func_shl_load+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define shl_load to an innocuous variant, in case <limits.h> declares shl_load.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define shl_load innocuous_shl_load
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char shl_load (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef shl_load
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char shl_load ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_shl_load) || defined (__stub___shl_load)
+choke me
+#else
+char (*f) () = shl_load;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != shl_load;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_shl_load=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_shl_load=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5
+echo "${ECHO_T}$ac_cv_func_shl_load" >&6
+if test $ac_cv_func_shl_load = yes; then
+ lt_cv_dlopen="shl_load"
+else
+ echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5
+echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6
+if test "${ac_cv_lib_dld_shl_load+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char shl_load ();
+int
+main ()
+{
+shl_load ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_dld_shl_load=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_dld_shl_load=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5
+echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6
+if test $ac_cv_lib_dld_shl_load = yes; then
+ lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"
+else
+ echo "$as_me:$LINENO: checking for dlopen" >&5
+echo $ECHO_N "checking for dlopen... $ECHO_C" >&6
+if test "${ac_cv_func_dlopen+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define dlopen to an innocuous variant, in case <limits.h> declares dlopen.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define dlopen innocuous_dlopen
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char dlopen (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef dlopen
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_dlopen) || defined (__stub___dlopen)
+choke me
+#else
+char (*f) () = dlopen;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != dlopen;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_dlopen=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_dlopen=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5
+echo "${ECHO_T}$ac_cv_func_dlopen" >&6
+if test $ac_cv_func_dlopen = yes; then
+ lt_cv_dlopen="dlopen"
+else
+ echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
+echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6
+if test "${ac_cv_lib_dl_dlopen+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+int
+main ()
+{
+dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_dl_dlopen=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_dl_dlopen=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6
+if test $ac_cv_lib_dl_dlopen = yes; then
+ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+ echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5
+echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6
+if test "${ac_cv_lib_svld_dlopen+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+int
+main ()
+{
+dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_svld_dlopen=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_svld_dlopen=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6
+if test $ac_cv_lib_svld_dlopen = yes; then
+ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
+else
+ echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5
+echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6
+if test "${ac_cv_lib_dld_dld_link+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dld_link ();
+int
+main ()
+{
+dld_link ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_dld_dld_link=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_dld_dld_link=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5
+echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6
+if test $ac_cv_lib_dld_dld_link = yes; then
+ lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+ ;;
+ esac
+
+ if test "x$lt_cv_dlopen" != xno; then
+ enable_dlopen=yes
+ else
+ enable_dlopen=no
+ fi
+
+ case $lt_cv_dlopen in
+ dlopen)
+ save_CPPFLAGS="$CPPFLAGS"
+ test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+ save_LDFLAGS="$LDFLAGS"
+ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+ save_LIBS="$LIBS"
+ LIBS="$lt_cv_dlopen_libs $LIBS"
+
+ echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5
+echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6
+if test "${lt_cv_dlopen_self+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then :
+ lt_cv_dlopen_self=cross
+else
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<EOF
+#line 8075 "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LT_DLGLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LT_DLGLOBAL DL_GLOBAL
+# else
+# define LT_DLGLOBAL 0
+# endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LT_DLLAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LT_DLLAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LT_DLLAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LT_DLLAZY_OR_NOW DL_NOW
+# else
+# define LT_DLLAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+#ifdef __cplusplus
+extern "C" void exit (int);
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+ int status = $lt_dlunknown;
+
+ if (self)
+ {
+ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
+ else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ /* dlclose (self); */
+ }
+ else
+ puts (dlerror ());
+
+ exit (status);
+}
+EOF
+ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then
+ (./conftest; exit; ) >&5 2>/dev/null
+ lt_status=$?
+ case x$lt_status in
+ x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
+ x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
+ x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
+ esac
+ else :
+ # compilation failed
+ lt_cv_dlopen_self=no
+ fi
+fi
+rm -fr conftest*
+
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5
+echo "${ECHO_T}$lt_cv_dlopen_self" >&6
+
+ if test "x$lt_cv_dlopen_self" = xyes; then
+ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+ echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5
+echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6
+if test "${lt_cv_dlopen_self_static+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then :
+ lt_cv_dlopen_self_static=cross
+else
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<EOF
+#line 8175 "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LT_DLGLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LT_DLGLOBAL DL_GLOBAL
+# else
+# define LT_DLGLOBAL 0
+# endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LT_DLLAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LT_DLLAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LT_DLLAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LT_DLLAZY_OR_NOW DL_NOW
+# else
+# define LT_DLLAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+#ifdef __cplusplus
+extern "C" void exit (int);
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+ int status = $lt_dlunknown;
+
+ if (self)
+ {
+ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
+ else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ /* dlclose (self); */
+ }
+ else
+ puts (dlerror ());
+
+ exit (status);
+}
+EOF
+ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then
+ (./conftest; exit; ) >&5 2>/dev/null
+ lt_status=$?
+ case x$lt_status in
+ x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
+ x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
+ x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
+ esac
+ else :
+ # compilation failed
+ lt_cv_dlopen_self_static=no
+ fi
+fi
+rm -fr conftest*
+
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5
+echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6
+ fi
+
+ CPPFLAGS="$save_CPPFLAGS"
+ LDFLAGS="$save_LDFLAGS"
+ LIBS="$save_LIBS"
+ ;;
+ esac
+
+ case $lt_cv_dlopen_self in
+ yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+ *) enable_dlopen_self=unknown ;;
+ esac
+
+ case $lt_cv_dlopen_self_static in
+ yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+ *) enable_dlopen_self_static=unknown ;;
+ esac
+fi
+
+
+# Report which library types will actually be built
+echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5
+echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $can_build_shared" >&5
+echo "${ECHO_T}$can_build_shared" >&6
+
+echo "$as_me:$LINENO: checking whether to build shared libraries" >&5
+echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6
+test "$can_build_shared" = "no" && enable_shared=no
+
+# On AIX, shared libraries and static libraries use the same namespace, and
+# are all built from PIC.
+case $host_os in
+aix3*)
+ test "$enable_shared" = yes && enable_static=no
+ if test -n "$RANLIB"; then
+ archive_cmds="$archive_cmds~\$RANLIB \$lib"
+ postinstall_cmds='$RANLIB $lib'
+ fi
+ ;;
+
+aix4* | aix5*)
+ if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+ test "$enable_shared" = yes && enable_static=no
+ fi
+ ;;
+esac
+echo "$as_me:$LINENO: result: $enable_shared" >&5
+echo "${ECHO_T}$enable_shared" >&6
+
+echo "$as_me:$LINENO: checking whether to build static libraries" >&5
+echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6
+# Make sure either enable_shared or enable_static is yes.
+test "$enable_shared" = yes || enable_static=yes
+echo "$as_me:$LINENO: result: $enable_static" >&5
+echo "${ECHO_T}$enable_static" >&6
+
+# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+ # See if we are running on zsh, and set the options which allow our commands through
+ # without removal of \ escapes.
+ if test -n "${ZSH_VERSION+set}" ; then
+ setopt NO_GLOB_SUBST
+ fi
+ # Now quote all the things that may contain metacharacters while being
+ # careful not to overquote the AC_SUBSTed values. We take copies of the
+ # variables and quote the copies for generation of the libtool script.
+ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+ SED SHELL STRIP \
+ libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+ old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+ deplibs_check_method reload_flag reload_cmds need_locks \
+ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+ lt_cv_sys_global_symbol_to_c_name_address \
+ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+ old_postinstall_cmds old_postuninstall_cmds \
+ compiler \
+ CC \
+ LD \
+ lt_prog_compiler_wl \
+ lt_prog_compiler_pic \
+ lt_prog_compiler_static \
+ lt_prog_compiler_no_builtin_flag \
+ export_dynamic_flag_spec \
+ thread_safe_flag_spec \
+ whole_archive_flag_spec \
+ enable_shared_with_static_runtimes \
+ old_archive_cmds \
+ old_archive_from_new_cmds \
+ predep_objects \
+ postdep_objects \
+ predeps \
+ postdeps \
+ compiler_lib_search_path \
+ archive_cmds \
+ archive_expsym_cmds \
+ postinstall_cmds \
+ postuninstall_cmds \
+ old_archive_from_expsyms_cmds \
+ allow_undefined_flag \
+ no_undefined_flag \
+ export_symbols_cmds \
+ hardcode_libdir_flag_spec \
+ hardcode_libdir_flag_spec_ld \
+ hardcode_libdir_separator \
+ hardcode_automatic \
+ module_cmds \
+ module_expsym_cmds \
+ lt_cv_prog_compiler_c_o \
+ exclude_expsyms \
+ include_expsyms; do
+
+ case $var in
+ old_archive_cmds | \
+ old_archive_from_new_cmds | \
+ archive_cmds | \
+ archive_expsym_cmds | \
+ module_cmds | \
+ module_expsym_cmds | \
+ old_archive_from_expsyms_cmds | \
+ export_symbols_cmds | \
+ extract_expsyms_cmds | reload_cmds | finish_cmds | \
+ postinstall_cmds | postuninstall_cmds | \
+ old_postinstall_cmds | old_postuninstall_cmds | \
+ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+ # Double-quote double-evaled strings.
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+ ;;
+ *)
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+ ;;
+ esac
+ done
+
+ case $lt_echo in
+ *'\$0 --fallback-echo"')
+ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+ ;;
+ esac
+
+cfgfile="${ofile}T"
+ trap "$rm \"$cfgfile\"; exit 1" 1 2 15
+ $rm -f "$cfgfile"
+ { echo "$as_me:$LINENO: creating $ofile" >&5
+echo "$as_me: creating $ofile" >&6;}
+
+ cat <<__EOF__ >> "$cfgfile"
+#! $SHELL
+
+# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
+# Free Software Foundation, Inc.
+#
+# This file is part of GNU Libtool:
+# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="$SED -e 1s/^X//"
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# The names of the tagged configurations supported by this script.
+available_tags=
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_compiler
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names. First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_predep_objects
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_postdep_objects
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_predeps
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_postdeps
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Set to yes if building a shared library automatically hardcodes DIR into the library
+# and all subsequent libraries and executables linked against it.
+hardcode_automatic=$hardcode_automatic
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$fix_srcfile_path"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# ### END LIBTOOL CONFIG
+
+__EOF__
+
+
+ case $host_os in
+ aix3*)
+ cat <<\EOF >> "$cfgfile"
+
+# AIX sometimes has problems with the GCC collect2 program. For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+fi
+EOF
+ ;;
+ esac
+
+ # We use sed instead of cat because bash on DJGPP gets confused if
+ # if finds mixed CR/LF and LF-only lines. Since sed operates in
+ # text mode, it properly converts lines to CR/LF. This bash problem
+ # is reportedly fixed, but why not run on old versions too?
+ sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1)
+
+ mv -f "$cfgfile" "$ofile" || \
+ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+ chmod +x "$ofile"
+
+else
+ # If there is no Makefile yet, we rely on a make rule to execute
+ # `config.status --recheck' to rerun these tests and create the
+ # libtool script then.
+ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+ if test -f "$ltmain_in"; then
+ test -f Makefile && make "$ltmain"
+ fi
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC="$lt_save_CC"
+
+
+# Check whether --with-tags or --without-tags was given.
+if test "${with_tags+set}" = set; then
+ withval="$with_tags"
+ tagnames="$withval"
+fi;
+
+if test -f "$ltmain" && test -n "$tagnames"; then
+ if test ! -f "${ofile}"; then
+ { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not exist" >&5
+echo "$as_me: WARNING: output file \`$ofile' does not exist" >&2;}
+ fi
+
+ if test -z "$LTCC"; then
+ eval "`$SHELL ${ofile} --config | grep '^LTCC='`"
+ if test -z "$LTCC"; then
+ { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not look like a libtool script" >&5
+echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script" >&2;}
+ else
+ { echo "$as_me:$LINENO: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&5
+echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;}
+ fi
+ fi
+ if test -z "$LTCFLAGS"; then
+ eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`"
+ fi
+
+ # Extract list of available tagged configurations in $ofile.
+ # Note that this assumes the entire list is on one line.
+ available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'`
+
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for tagname in $tagnames; do
+ IFS="$lt_save_ifs"
+ # Check whether tagname contains only valid characters
+ case `$echo "X$tagname" | $Xsed -e 's:[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]::g'` in
+ "") ;;
+ *) { { echo "$as_me:$LINENO: error: invalid tag name: $tagname" >&5
+echo "$as_me: error: invalid tag name: $tagname" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+ esac
+
+ if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null
+ then
+ { { echo "$as_me:$LINENO: error: tag name \"$tagname\" already exists" >&5
+echo "$as_me: error: tag name \"$tagname\" already exists" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+
+ # Update the list of available tags.
+ if test -n "$tagname"; then
+ echo appending configuration tag \"$tagname\" to $ofile
+
+ case $tagname in
+ CXX)
+ if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+ ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+ (test "X$CXX" != "Xg++"))) ; then
+ :
+ else
+ tagname=""
+ fi
+ ;;
+
+ F77)
+ if test -n "$F77" && test "X$F77" != "Xno"; then
+ :
+ else
+ tagname=""
+ fi
+ ;;
+
+ GCJ)
+ if test -n "$GCJ" && test "X$GCJ" != "Xno"; then
+ :
+ else
+ tagname=""
+ fi
+ ;;
+
+ RC)
+
+
+
+# Source file extension for RC test sources.
+ac_ext=rc
+
+# Object file extension for compiled RC test sources.
+objext=o
+objext_RC=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }\n'
+
+# Code to be used in simple link tests
+lt_simple_link_test_code="$lt_simple_compile_test_code"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+printf "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$rm conftest*
+
+ac_outfile=conftest.$ac_objext
+printf "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$rm conftest*
+
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${RC-"windres"}
+compiler=$CC
+compiler_RC=$CC
+for cc_temp in $compiler""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+lt_cv_prog_compiler_c_o_RC=yes
+
+# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+ # See if we are running on zsh, and set the options which allow our commands through
+ # without removal of \ escapes.
+ if test -n "${ZSH_VERSION+set}" ; then
+ setopt NO_GLOB_SUBST
+ fi
+ # Now quote all the things that may contain metacharacters while being
+ # careful not to overquote the AC_SUBSTed values. We take copies of the
+ # variables and quote the copies for generation of the libtool script.
+ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+ SED SHELL STRIP \
+ libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+ old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+ deplibs_check_method reload_flag reload_cmds need_locks \
+ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+ lt_cv_sys_global_symbol_to_c_name_address \
+ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+ old_postinstall_cmds old_postuninstall_cmds \
+ compiler_RC \
+ CC_RC \
+ LD_RC \
+ lt_prog_compiler_wl_RC \
+ lt_prog_compiler_pic_RC \
+ lt_prog_compiler_static_RC \
+ lt_prog_compiler_no_builtin_flag_RC \
+ export_dynamic_flag_spec_RC \
+ thread_safe_flag_spec_RC \
+ whole_archive_flag_spec_RC \
+ enable_shared_with_static_runtimes_RC \
+ old_archive_cmds_RC \
+ old_archive_from_new_cmds_RC \
+ predep_objects_RC \
+ postdep_objects_RC \
+ predeps_RC \
+ postdeps_RC \
+ compiler_lib_search_path_RC \
+ archive_cmds_RC \
+ archive_expsym_cmds_RC \
+ postinstall_cmds_RC \
+ postuninstall_cmds_RC \
+ old_archive_from_expsyms_cmds_RC \
+ allow_undefined_flag_RC \
+ no_undefined_flag_RC \
+ export_symbols_cmds_RC \
+ hardcode_libdir_flag_spec_RC \
+ hardcode_libdir_flag_spec_ld_RC \
+ hardcode_libdir_separator_RC \
+ hardcode_automatic_RC \
+ module_cmds_RC \
+ module_expsym_cmds_RC \
+ lt_cv_prog_compiler_c_o_RC \
+ exclude_expsyms_RC \
+ include_expsyms_RC; do
+
+ case $var in
+ old_archive_cmds_RC | \
+ old_archive_from_new_cmds_RC | \
+ archive_cmds_RC | \
+ archive_expsym_cmds_RC | \
+ module_cmds_RC | \
+ module_expsym_cmds_RC | \
+ old_archive_from_expsyms_cmds_RC | \
+ export_symbols_cmds_RC | \
+ extract_expsyms_cmds | reload_cmds | finish_cmds | \
+ postinstall_cmds | postuninstall_cmds | \
+ old_postinstall_cmds | old_postuninstall_cmds | \
+ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+ # Double-quote double-evaled strings.
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+ ;;
+ *)
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+ ;;
+ esac
+ done
+
+ case $lt_echo in
+ *'\$0 --fallback-echo"')
+ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+ ;;
+ esac
+
+cfgfile="$ofile"
+
+ cat <<__EOF__ >> "$cfgfile"
+# ### BEGIN LIBTOOL TAG CONFIG: $tagname
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_RC
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_RC
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_compiler_RC
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC_RC
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_LD_RC
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_RC
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_RC
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_RC
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_RC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_RC
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_RC
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_RC
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec_RC
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names. First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds_RC
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_RC
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_RC
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds_RC
+archive_expsym_cmds=$lt_archive_expsym_cmds_RC
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_module_cmds_RC
+module_expsym_cmds=$lt_module_expsym_cmds_RC
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_predep_objects_RC
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_postdep_objects_RC
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_predeps_RC
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_postdeps_RC
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_RC
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_RC
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_RC
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_RC
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_RC
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_RC
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_RC
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct_RC
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L_RC
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_RC
+
+# Set to yes if building a shared library automatically hardcodes DIR into the library
+# and all subsequent libraries and executables linked against it.
+hardcode_automatic=$hardcode_automatic_RC
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_RC
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$fix_srcfile_path_RC"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols_RC
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_RC
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_RC
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_RC
+
+# ### END LIBTOOL TAG CONFIG: $tagname
+
+__EOF__
+
+
+else
+ # If there is no Makefile yet, we rely on a make rule to execute
+ # `config.status --recheck' to rerun these tests and create the
+ # libtool script then.
+ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+ if test -f "$ltmain_in"; then
+ test -f Makefile && make "$ltmain"
+ fi
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC="$lt_save_CC"
+
+ ;;
+
+ *)
+ { { echo "$as_me:$LINENO: error: Unsupported tag name: $tagname" >&5
+echo "$as_me: error: Unsupported tag name: $tagname" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+ esac
+
+ # Append the new tag name to the list of available tags.
+ if test -n "$tagname" ; then
+ available_tags="$available_tags $tagname"
+ fi
+ fi
+ done
+ IFS="$lt_save_ifs"
+
+ # Now substitute the updated list of available tags.
+ if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then
+ mv "${ofile}T" "$ofile"
+ chmod +x "$ofile"
+ else
+ rm -f "${ofile}T"
+ { { echo "$as_me:$LINENO: error: unable to update list of available tagged configurations." >&5
+echo "$as_me: error: unable to update list of available tagged configurations." >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+fi
+
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+# Prevent multiple expansion
+
+
+
+
+
+
+
+
+
+
+echo "$as_me:$LINENO: checking for size_t" >&5
+echo $ECHO_N "checking for size_t... $ECHO_C" >&6
+if test "${ac_cv_type_size_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((size_t *) 0)
+ return 0;
+if (sizeof (size_t))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_size_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_size_t=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5
+echo "${ECHO_T}$ac_cv_type_size_t" >&6
+if test $ac_cv_type_size_t = yes; then
+ :
+else
+
+cat >>confdefs.h <<_ACEOF
+#define size_t unsigned
+_ACEOF
+
+fi
+
+echo "$as_me:$LINENO: checking for working volatile" >&5
+echo $ECHO_N "checking for working volatile... $ECHO_C" >&6
+if test "${ac_cv_c_volatile+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+volatile int x;
+int * volatile y;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_c_volatile=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_c_volatile=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_volatile" >&5
+echo "${ECHO_T}$ac_cv_c_volatile" >&6
+if test $ac_cv_c_volatile = no; then
+
+cat >>confdefs.h <<\_ACEOF
+#define volatile
+_ACEOF
+
+fi
+
+echo "$as_me:$LINENO: checking for inline" >&5
+echo $ECHO_N "checking for inline... $ECHO_C" >&6
+if test "${ac_cv_c_inline+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifndef __cplusplus
+typedef int foo_t;
+static $ac_kw foo_t static_foo () {return 0; }
+$ac_kw foo_t foo () {return 0; }
+#endif
+
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_c_inline=$ac_kw; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5
+echo "${ECHO_T}$ac_cv_c_inline" >&6
+
+
+case $ac_cv_c_inline in
+ inline | yes) ;;
+ *)
+ case $ac_cv_c_inline in
+ no) ac_val=;;
+ *) ac_val=$ac_cv_c_inline;;
+ esac
+ cat >>confdefs.h <<_ACEOF
+#ifndef __cplusplus
+#define inline $ac_val
+#endif
+_ACEOF
+ ;;
+esac
+
+
+GSL_CFLAGS="-I$includedir"
+GSL_LIBS="-L$libdir -lgsl"
+
+
+
+
+echo "$as_me:$LINENO: checking for extern inline" >&5
+echo $ECHO_N "checking for extern inline... $ECHO_C" >&6
+if test "${ac_cv_c_extern_inline+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_c_extern_inline=no
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+extern $ac_cv_c_inline double foo(double x);
+extern $ac_cv_c_inline double foo(double x) { return x + 1.0 ; } ;
+double foo (double x) { return x + 1.0 ; };
+int
+main ()
+{
+ foo(1.0)
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_c_extern_inline="yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_extern_inline" >&5
+echo "${ECHO_T}$ac_cv_c_extern_inline" >&6
+
+if test "$ac_cv_c_extern_inline" != no ; then
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_INLINE 1
+_ACEOF
+
+
+fi
+
+
+for ac_header in ieeefp.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## ------------------------------ ##
+## Report this to the gsl lists. ##
+## ------------------------------ ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+
+
+for ac_func in vprintf
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+char (*f) () = $ac_func;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != $ac_func;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_var=no"
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+echo "$as_me:$LINENO: checking for _doprnt" >&5
+echo $ECHO_N "checking for _doprnt... $ECHO_C" >&6
+if test "${ac_cv_func__doprnt+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define _doprnt to an innocuous variant, in case <limits.h> declares _doprnt.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define _doprnt innocuous__doprnt
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char _doprnt (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef _doprnt
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char _doprnt ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub__doprnt) || defined (__stub____doprnt)
+choke me
+#else
+char (*f) () = _doprnt;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != _doprnt;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func__doprnt=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func__doprnt=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func__doprnt" >&5
+echo "${ECHO_T}$ac_cv_func__doprnt" >&6
+if test $ac_cv_func__doprnt = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_DOPRNT 1
+_ACEOF
+
+fi
+
+fi
+done
+
+
+
+
+
+
+
+
+for ac_func in memcpy memmove strdup strtol strtoul
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+char (*f) () = $ac_func;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != $ac_func;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_var=no"
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ case $LIBOBJS in
+ "$ac_func.$ac_objext" | \
+ *" $ac_func.$ac_objext" | \
+ "$ac_func.$ac_objext "* | \
+ *" $ac_func.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS $ac_func.$ac_objext" ;;
+esac
+
+fi
+done
+
+
+
+echo "$as_me:$LINENO: checking for EXIT_SUCCESS and EXIT_FAILURE" >&5
+echo $ECHO_N "checking for EXIT_SUCCESS and EXIT_FAILURE... $ECHO_C" >&6
+if test "${ac_cv_decl_exit_success_and_failure+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <stdlib.h>
+#ifdef EXIT_SUCCESS
+yes
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "yes" >/dev/null 2>&1; then
+ ac_cv_decl_exit_success_and_failure=yes
+else
+ ac_cv_decl_exit_success_and_failure=no
+fi
+rm -f conftest*
+
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_decl_exit_success_and_failure" >&5
+echo "${ECHO_T}$ac_cv_decl_exit_success_and_failure" >&6
+
+if test "$ac_cv_decl_exit_success_and_failure" = yes ; then
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_EXIT_SUCCESS_AND_FAILURE 1
+_ACEOF
+
+fi ;
+
+
+if test "x$LIBS" = "x" ; then
+
+echo "$as_me:$LINENO: checking for cos in -lm" >&5
+echo $ECHO_N "checking for cos in -lm... $ECHO_C" >&6
+if test "${ac_cv_lib_m_cos+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lm $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char cos ();
+int
+main ()
+{
+cos ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_m_cos=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_m_cos=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_m_cos" >&5
+echo "${ECHO_T}$ac_cv_lib_m_cos" >&6
+if test $ac_cv_lib_m_cos = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBM 1
+_ACEOF
+
+ LIBS="-lm $LIBS"
+
+fi
+
+fi
+
+echo "$as_me:$LINENO: checking whether feenableexcept is declared" >&5
+echo $ECHO_N "checking whether feenableexcept is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_feenableexcept+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#define _GNU_SOURCE 1
+#include <fenv.h>
+
+int
+main ()
+{
+#ifndef feenableexcept
+ char *p = (char *) feenableexcept;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_feenableexcept=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_feenableexcept=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_feenableexcept" >&5
+echo "${ECHO_T}$ac_cv_have_decl_feenableexcept" >&6
+if test $ac_cv_have_decl_feenableexcept = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FEENABLEEXCEPT 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FEENABLEEXCEPT 0
+_ACEOF
+
+
+fi
+
+
+echo "$as_me:$LINENO: checking whether fesettrapenable is declared" >&5
+echo $ECHO_N "checking whether fesettrapenable is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_fesettrapenable+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#define _GNU_SOURCE 1
+#include <fenv.h>
+
+int
+main ()
+{
+#ifndef fesettrapenable
+ char *p = (char *) fesettrapenable;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_fesettrapenable=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_fesettrapenable=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_fesettrapenable" >&5
+echo "${ECHO_T}$ac_cv_have_decl_fesettrapenable" >&6
+if test $ac_cv_have_decl_fesettrapenable = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FESETTRAPENABLE 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FESETTRAPENABLE 0
+_ACEOF
+
+
+fi
+
+
+echo "$as_me:$LINENO: checking whether hypot is declared" >&5
+echo $ECHO_N "checking whether hypot is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_hypot+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <math.h>
+
+int
+main ()
+{
+#ifndef hypot
+ char *p = (char *) hypot;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_hypot=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_hypot=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_hypot" >&5
+echo "${ECHO_T}$ac_cv_have_decl_hypot" >&6
+if test $ac_cv_have_decl_hypot = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_HYPOT 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_HYPOT 0
+_ACEOF
+
+
+fi
+
+
+echo "$as_me:$LINENO: checking whether expm1 is declared" >&5
+echo $ECHO_N "checking whether expm1 is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_expm1+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <math.h>
+
+int
+main ()
+{
+#ifndef expm1
+ char *p = (char *) expm1;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_expm1=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_expm1=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_expm1" >&5
+echo "${ECHO_T}$ac_cv_have_decl_expm1" >&6
+if test $ac_cv_have_decl_expm1 = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_EXPM1 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_EXPM1 0
+_ACEOF
+
+
+fi
+
+
+echo "$as_me:$LINENO: checking whether acosh is declared" >&5
+echo $ECHO_N "checking whether acosh is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_acosh+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <math.h>
+
+int
+main ()
+{
+#ifndef acosh
+ char *p = (char *) acosh;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_acosh=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_acosh=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_acosh" >&5
+echo "${ECHO_T}$ac_cv_have_decl_acosh" >&6
+if test $ac_cv_have_decl_acosh = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_ACOSH 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_ACOSH 0
+_ACEOF
+
+
+fi
+
+
+echo "$as_me:$LINENO: checking whether asinh is declared" >&5
+echo $ECHO_N "checking whether asinh is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_asinh+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <math.h>
+
+int
+main ()
+{
+#ifndef asinh
+ char *p = (char *) asinh;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_asinh=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_asinh=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_asinh" >&5
+echo "${ECHO_T}$ac_cv_have_decl_asinh" >&6
+if test $ac_cv_have_decl_asinh = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_ASINH 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_ASINH 0
+_ACEOF
+
+
+fi
+
+
+echo "$as_me:$LINENO: checking whether atanh is declared" >&5
+echo $ECHO_N "checking whether atanh is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_atanh+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <math.h>
+
+int
+main ()
+{
+#ifndef atanh
+ char *p = (char *) atanh;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_atanh=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_atanh=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_atanh" >&5
+echo "${ECHO_T}$ac_cv_have_decl_atanh" >&6
+if test $ac_cv_have_decl_atanh = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_ATANH 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_ATANH 0
+_ACEOF
+
+
+fi
+
+
+echo "$as_me:$LINENO: checking whether ldexp is declared" >&5
+echo $ECHO_N "checking whether ldexp is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_ldexp+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <math.h>
+
+int
+main ()
+{
+#ifndef ldexp
+ char *p = (char *) ldexp;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_ldexp=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_ldexp=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_ldexp" >&5
+echo "${ECHO_T}$ac_cv_have_decl_ldexp" >&6
+if test $ac_cv_have_decl_ldexp = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_LDEXP 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_LDEXP 0
+_ACEOF
+
+
+fi
+
+
+echo "$as_me:$LINENO: checking whether frexp is declared" >&5
+echo $ECHO_N "checking whether frexp is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_frexp+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <math.h>
+
+int
+main ()
+{
+#ifndef frexp
+ char *p = (char *) frexp;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_frexp=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_frexp=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_frexp" >&5
+echo "${ECHO_T}$ac_cv_have_decl_frexp" >&6
+if test $ac_cv_have_decl_frexp = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FREXP 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FREXP 0
+_ACEOF
+
+
+fi
+
+
+echo "$as_me:$LINENO: checking whether isinf is declared" >&5
+echo $ECHO_N "checking whether isinf is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_isinf+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <math.h>
+
+int
+main ()
+{
+#ifndef isinf
+ char *p = (char *) isinf;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_isinf=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_isinf=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_isinf" >&5
+echo "${ECHO_T}$ac_cv_have_decl_isinf" >&6
+if test $ac_cv_have_decl_isinf = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_ISINF 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_ISINF 0
+_ACEOF
+
+
+fi
+
+
+echo "$as_me:$LINENO: checking whether finite is declared" >&5
+echo $ECHO_N "checking whether finite is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_finite+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <math.h>
+
+int
+main ()
+{
+#ifndef finite
+ char *p = (char *) finite;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_finite=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_finite=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_finite" >&5
+echo "${ECHO_T}$ac_cv_have_decl_finite" >&6
+if test $ac_cv_have_decl_finite = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FINITE 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FINITE 0
+_ACEOF
+
+
+fi
+
+
+echo "$as_me:$LINENO: checking whether isfinite is declared" >&5
+echo $ECHO_N "checking whether isfinite is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_isfinite+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <math.h>
+
+int
+main ()
+{
+#ifndef isfinite
+ char *p = (char *) isfinite;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_isfinite=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_isfinite=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_isfinite" >&5
+echo "${ECHO_T}$ac_cv_have_decl_isfinite" >&6
+if test $ac_cv_have_decl_isfinite = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_ISFINITE 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_ISFINITE 0
+_ACEOF
+
+
+fi
+
+
+echo "$as_me:$LINENO: checking whether isnan is declared" >&5
+echo $ECHO_N "checking whether isnan is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_isnan+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <math.h>
+
+int
+main ()
+{
+#ifndef isnan
+ char *p = (char *) isnan;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_isnan=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_isnan=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_isnan" >&5
+echo "${ECHO_T}$ac_cv_have_decl_isnan" >&6
+if test $ac_cv_have_decl_isnan = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_ISNAN 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_ISNAN 0
+_ACEOF
+
+
+fi
+
+
+
+case "$host" in
+ *-*-*openbsd*)
+ echo "$as_me:$LINENO: result: avoiding OpenBSD system log1p - using gsl version" >&5
+echo "${ECHO_T}avoiding OpenBSD system log1p - using gsl version" >&6
+ ;;
+ *)
+ echo "$as_me:$LINENO: checking whether log1p is declared" >&5
+echo $ECHO_N "checking whether log1p is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_log1p+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <math.h>
+
+int
+main ()
+{
+#ifndef log1p
+ char *p = (char *) log1p;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_log1p=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_log1p=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_log1p" >&5
+echo "${ECHO_T}$ac_cv_have_decl_log1p" >&6
+if test $ac_cv_have_decl_log1p = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_LOG1P 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_LOG1P 0
+_ACEOF
+
+
+fi
+
+
+ ;;
+esac
+
+echo "$as_me:$LINENO: checking for long double stdio" >&5
+echo $ECHO_N "checking for long double stdio... $ECHO_C" >&6
+if test "${ac_cv_func_printf_longdouble+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_func_printf_longdouble="no"
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <stdlib.h>
+#include <stdio.h>
+int main (void)
+{
+const char * s = "5678"; long double x = 1.234 ;
+fprintf(stderr,"%Lg\n",x) ;
+sscanf(s, "%Lg", &x);
+if (x == 5678) {exit (0);} else {exit(1); };
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_printf_longdouble="yes"
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_func_printf_longdouble="no"
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_printf_longdouble" >&5
+echo "${ECHO_T}$ac_cv_func_printf_longdouble" >&6
+
+if test "$ac_cv_func_printf_longdouble" != no; then
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_PRINTF_LONGDOUBLE 1
+_ACEOF
+
+
+fi
+
+echo "$as_me:$LINENO: checking for extended floating point registers" >&5
+echo $ECHO_N "checking for extended floating point registers... $ECHO_C" >&6
+if test "${ac_cv_c_extended_fp+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case "$host" in
+ *sparc*-*-*)
+ ac_cv_c_extended_fp=no
+ ;;
+ *powerpc*-*-*)
+ ac_cv_c_extended_fp=no
+ ;;
+ *hppa*-*-*)
+ ac_cv_c_extended_fp=no
+ ;;
+ *alpha*-*-*)
+ ac_cv_c_extended_fp=no
+ ;;
+ *68k*-*-*)
+ ac_cv_c_extended_fp=yes
+ ;;
+ *86-*-*)
+ ac_cv_c_extended_fp=yes
+ ;;
+ x86_64-*-*)
+ ac_cv_c_extended_fp=yes
+ ;;
+ *)
+ ac_cv_c_extended_fp=unknown
+ ;;
+esac
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_extended_fp" >&5
+echo "${ECHO_T}$ac_cv_c_extended_fp" >&6
+
+if test $ac_cv_c_extended_fp != "no" ; then
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_EXTENDED_PRECISION_REGISTERS 1
+_ACEOF
+
+
+fi
+
+echo "$as_me:$LINENO: checking for IEEE arithmetic interface type" >&5
+echo $ECHO_N "checking for IEEE arithmetic interface type... $ECHO_C" >&6
+if test "${ac_cv_c_ieee_interface+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case "$host" in
+ sparc-*-linux*)
+ ac_cv_c_ieee_interface=gnusparc
+ ;;
+ m68k-*-linux*)
+ ac_cv_c_ieee_interface=gnum68k
+ ;;
+ powerpc-*-linux*)
+ ac_cv_c_ieee_interface=gnuppc
+ ;;
+ *86-*-gnu | *86_64-*-gnu | *86-*-linux* | *86_64-*-linux*)
+ ac_cv_c_ieee_interface=gnux86
+ ;;
+ *-*-sunos4*)
+ ac_cv_c_ieee_interface=sunos4
+ ;;
+ *-*-solaris*)
+ ac_cv_c_ieee_interface=solaris
+ ;;
+ *-*-hpux11*)
+ ac_cv_c_ieee_interface=hpux11
+ ;;
+ *-*-hpux*)
+ ac_cv_c_ieee_interface=hpux
+ ;;
+ *-*-osf*)
+ ac_cv_c_ieee_interface=tru64
+ ;;
+ *-*-aix*)
+ ac_cv_c_ieee_interface=aix
+ ;;
+ *-*-irix*)
+ ac_cv_c_ieee_interface=irix
+ ;;
+ powerpc-*-*darwin*)
+ ac_cv_c_ieee_interface=darwin
+ ;;
+ *86-*-*darwin*)
+ ac_cv_c_ieee_interface=darwin86
+ ;;
+ *-*-*netbsd*)
+ ac_cv_c_ieee_interface=netbsd
+ ;;
+ *-*-*openbsd*)
+ ac_cv_c_ieee_interface=openbsd
+ ;;
+ *-*-*bsd*)
+ ac_cv_c_ieee_interface=freebsd
+ ;;
+ *-*-os2*)
+ ac_cv_c_ieee_interface=os2emx
+ ;;
+ *)
+ ac_cv_c_ieee_interface=unknown
+ ;;
+esac
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_ieee_interface" >&5
+echo "${ECHO_T}$ac_cv_c_ieee_interface" >&6
+
+if test "$ac_cv_c_ieee_interface" = "gnux86" ; then
+ echo "$as_me:$LINENO: checking for FPU_SETCW" >&5
+echo $ECHO_N "checking for FPU_SETCW... $ECHO_C" >&6
+if test "${ac_cv_c_fpu_setcw+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_c_fpu_setcw=no
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <fpu_control.h>
+#ifndef _FPU_SETCW
+#include <i386/fpu_control.h>
+#define _FPU_SETCW(cw) __setfpucw(cw)
+#endif
+
+int
+main ()
+{
+ unsigned short mode = 0 ; _FPU_SETCW(mode);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_c_fpu_setcw="yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_c_ieee_interface=unknown
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_fpu_setcw" >&5
+echo "${ECHO_T}$ac_cv_c_fpu_setcw" >&6
+fi
+
+ac_tr_ieee_interface=HAVE_`echo $ac_cv_c_ieee_interface | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`_IEEE_INTERFACE
+
+cat >>confdefs.h <<_ACEOF
+#define $ac_tr_ieee_interface 1
+_ACEOF
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+save_cflags="$CFLAGS"
+echo "$as_me:$LINENO: checking for IEEE compiler flags" >&5
+echo $ECHO_N "checking for IEEE compiler flags... $ECHO_C" >&6
+if test "${ac_cv_c_ieee_flags+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+case "$host" in
+ alpha*-*-*)
+ if test X"$GCC" = Xyes ; then
+ ieee_flags='-mieee -mfp-rounding-mode=d'
+ else
+ # This assumes Compaq's C compiler.
+ ieee_flags='-ieee -fprm d'
+ fi
+ ;;
+esac
+if test X"$ieee_flags" != X ; then
+ CFLAGS="$ieee_flags $CFLAGS"
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+int foo;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_c_ieee_flags="$ieee_flags"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_c_ieee_flags="none"
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+ ac_cv_c_ieee_flags="none"
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_ieee_flags" >&5
+echo "${ECHO_T}$ac_cv_c_ieee_flags" >&6
+
+if test "$ac_cv_c_ieee_flags" != "none" ; then
+ CFLAGS="$ac_cv_c_ieee_flags $save_cflags"
+else
+ CFLAGS="$save_cflags"
+fi
+
+echo "$as_me:$LINENO: checking for IEEE comparisons" >&5
+echo $ECHO_N "checking for IEEE comparisons... $ECHO_C" >&6
+if test "${ac_cv_c_ieee_comparisons+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_c_ieee_comparisons="yes"
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <math.h>
+int main (void)
+{
+ int status; double inf, nan;
+ inf = exp(1.0e10);
+ nan = inf / inf ;
+ status = (nan == nan);
+ exit (status);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_c_ieee_comparisons="yes"
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_c_ieee_comparisons="no"
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_ieee_comparisons" >&5
+echo "${ECHO_T}$ac_cv_c_ieee_comparisons" >&6
+
+if test "$ac_cv_c_ieee_comparisons" != no ; then
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_IEEE_COMPARISONS 1
+_ACEOF
+
+
+fi
+
+echo "$as_me:$LINENO: checking for IEEE denormalized values" >&5
+echo $ECHO_N "checking for IEEE denormalized values... $ECHO_C" >&6
+if test "${ac_cv_c_ieee_denormals+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_c_ieee_denormals="yes"
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <math.h>
+int main (void)
+{
+ int i, status;
+ volatile double z = 1e-308;
+ for (i = 0; i < 5; i++) { z = z / 10.0 ; };
+ for (i = 0; i < 5; i++) { z = z * 10.0 ; };
+ status = (z == 0.0);
+ exit (status);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_c_ieee_denormals="yes"
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_c_ieee_denormals="no"
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_ieee_denormals" >&5
+echo "${ECHO_T}$ac_cv_c_ieee_denormals" >&6
+
+if test "$ac_cv_c_ieee_denormals" != no ; then
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_IEEE_DENORMALS 1
+_ACEOF
+
+
+fi
+
+ ac_config_files="$ac_config_files gsl-config gsl.pc gsl_version.h gsl.spec gsl/Makefile test/Makefile err/Makefile sys/Makefile utils/Makefile const/Makefile min/Makefile multimin/Makefile ieee-utils/Makefile fft/Makefile specfunc/Makefile dht/Makefile fit/Makefile multifit/Makefile bspline/Makefile statistics/Makefile sum/Makefile roots/Makefile multiroots/Makefile ntuple/Makefile poly/Makefile qrng/Makefile rng/Makefile randist/Makefile siman/Makefile integration/Makefile interpolation/Makefile doc/Makefile block/Makefile vector/Makefile matrix/Makefile histogram/Makefile monte/Makefile ode-initval/Makefile cblas/Makefile blas/Makefile linalg/Makefile eigen/Makefile permutation/Makefile combination/Makefile sort/Makefile complex/Makefile diff/Makefile deriv/Makefile cheb/Makefile cdf/Makefile wavelet/Makefile Makefile"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+{
+ (set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n \
+ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+ ;;
+ esac;
+} |
+ sed '
+ t clear
+ : clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ t end
+ /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ : end' >>confcache
+if diff $cache_file confcache >/dev/null 2>&1; then :; else
+ if test -w $cache_file; then
+ test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+ cat confcache >$cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[ ]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[ ]*$//;
+}'
+fi
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_i=`echo "$ac_i" |
+ sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
+ # 2. Add them.
+ ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"
+ ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+ set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
+do
+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+ eval $as_var=C; export $as_var
+ else
+ $as_unset $as_var
+ fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)$' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+ /^X\/\(\/\/\)$/{ s//\1/; q; }
+ /^X\/\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" || {
+ # Find who we are. Look in the path if we contain no path at all
+ # relative or not.
+ case $0 in
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+ ;;
+ esac
+ # We did not find ourselves, most probably we were run as `sh COMMAND'
+ # in which case we are not to be found in the path.
+ if test "x$as_myself" = x; then
+ as_myself=$0
+ fi
+ if test ! -f "$as_myself"; then
+ { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
+echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ case $CONFIG_SHELL in
+ '')
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for as_base in sh bash ksh sh5; do
+ case $as_dir in
+ /*)
+ if ("$as_dir/$as_base" -c '
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then
+ $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+ $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+ CONFIG_SHELL=$as_dir/$as_base
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+ fi;;
+ esac
+ done
+done
+;;
+ esac
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line before each line; the second 'sed' does the real
+ # work. The second script uses 'N' to pair each line-number line
+ # with the numbered line, and appends trailing '-' during
+ # substitution so that $LINENO is not a special case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-)
+ sed '=' <$as_myself |
+ sed '
+ N
+ s,$,-,
+ : loop
+ s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+ t loop
+ s,-$,,
+ s,^['$as_cr_digits']*\n,,
+ ' >$as_me.lineno &&
+ chmod +x $as_me.lineno ||
+ { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
+echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
+ { (exit 1); exit 1; }; }
+
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensible to this).
+ . ./$as_me.lineno
+ # Exit status is that of the last command.
+ exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+ *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T=' ' ;;
+ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+ *) ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ # We could just check for DJGPP; but this test a) works b) is more generic
+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+ if test -f conf$$.exe; then
+ # Don't use ln at all; we don't have any links
+ as_ln_s='cp -p'
+ else
+ as_ln_s='ln -s'
+ fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" $as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+exec 6>&1
+
+# Open the log real soon, to keep \$[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling. Logging --version etc. is OK.
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+cat >&5 <<_CSEOF
+
+This file was extended by gsl $as_me 1.9, which was
+generated by GNU Autoconf 2.59. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+_CSEOF
+echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
+echo >&5
+_ACEOF
+
+# Files that config.status was made for.
+if test -n "$ac_config_files"; then
+ echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_headers"; then
+ echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_links"; then
+ echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_commands"; then
+ echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number, then exit
+ -q, --quiet do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+ --header=FILE[:TEMPLATE]
+ instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Report bugs to <bug-autoconf@gnu.org>."
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+gsl config.status 1.9
+configured by $0, generated by GNU Autoconf 2.59,
+ with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir=$srcdir
+INSTALL="$INSTALL"
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value. By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=*)
+ ac_option=`expr "x$1" : 'x\([^=]*\)='`
+ ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ -*)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ *) # This is not an option, so the user has probably given explicit
+ # arguments.
+ ac_option=$1
+ ac_need_defaults=false;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --vers* | -V )
+ echo "$ac_cs_version"; exit 0 ;;
+ --he | --h)
+ # Conflict between --help and --header
+ { { echo "$as_me:$LINENO: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+ { (exit 1); exit 1; }; };;
+ --help | --hel | -h )
+ echo "$ac_cs_usage"; exit 0 ;;
+ --debug | --d* | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+ ac_need_defaults=false;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+ { (exit 1); exit 1; }; } ;;
+
+ *) ac_config_targets="$ac_config_targets $1" ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+ echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+ exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+
+
+
+
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_config_target in $ac_config_targets
+do
+ case "$ac_config_target" in
+ # Handling of arguments.
+ "gsl-config" ) CONFIG_FILES="$CONFIG_FILES gsl-config" ;;
+ "gsl.pc" ) CONFIG_FILES="$CONFIG_FILES gsl.pc" ;;
+ "gsl_version.h" ) CONFIG_FILES="$CONFIG_FILES gsl_version.h" ;;
+ "gsl.spec" ) CONFIG_FILES="$CONFIG_FILES gsl.spec" ;;
+ "gsl/Makefile" ) CONFIG_FILES="$CONFIG_FILES gsl/Makefile" ;;
+ "test/Makefile" ) CONFIG_FILES="$CONFIG_FILES test/Makefile" ;;
+ "err/Makefile" ) CONFIG_FILES="$CONFIG_FILES err/Makefile" ;;
+ "sys/Makefile" ) CONFIG_FILES="$CONFIG_FILES sys/Makefile" ;;
+ "utils/Makefile" ) CONFIG_FILES="$CONFIG_FILES utils/Makefile" ;;
+ "const/Makefile" ) CONFIG_FILES="$CONFIG_FILES const/Makefile" ;;
+ "min/Makefile" ) CONFIG_FILES="$CONFIG_FILES min/Makefile" ;;
+ "multimin/Makefile" ) CONFIG_FILES="$CONFIG_FILES multimin/Makefile" ;;
+ "ieee-utils/Makefile" ) CONFIG_FILES="$CONFIG_FILES ieee-utils/Makefile" ;;
+ "fft/Makefile" ) CONFIG_FILES="$CONFIG_FILES fft/Makefile" ;;
+ "specfunc/Makefile" ) CONFIG_FILES="$CONFIG_FILES specfunc/Makefile" ;;
+ "dht/Makefile" ) CONFIG_FILES="$CONFIG_FILES dht/Makefile" ;;
+ "fit/Makefile" ) CONFIG_FILES="$CONFIG_FILES fit/Makefile" ;;
+ "multifit/Makefile" ) CONFIG_FILES="$CONFIG_FILES multifit/Makefile" ;;
+ "bspline/Makefile" ) CONFIG_FILES="$CONFIG_FILES bspline/Makefile" ;;
+ "statistics/Makefile" ) CONFIG_FILES="$CONFIG_FILES statistics/Makefile" ;;
+ "sum/Makefile" ) CONFIG_FILES="$CONFIG_FILES sum/Makefile" ;;
+ "roots/Makefile" ) CONFIG_FILES="$CONFIG_FILES roots/Makefile" ;;
+ "multiroots/Makefile" ) CONFIG_FILES="$CONFIG_FILES multiroots/Makefile" ;;
+ "ntuple/Makefile" ) CONFIG_FILES="$CONFIG_FILES ntuple/Makefile" ;;
+ "poly/Makefile" ) CONFIG_FILES="$CONFIG_FILES poly/Makefile" ;;
+ "qrng/Makefile" ) CONFIG_FILES="$CONFIG_FILES qrng/Makefile" ;;
+ "rng/Makefile" ) CONFIG_FILES="$CONFIG_FILES rng/Makefile" ;;
+ "randist/Makefile" ) CONFIG_FILES="$CONFIG_FILES randist/Makefile" ;;
+ "siman/Makefile" ) CONFIG_FILES="$CONFIG_FILES siman/Makefile" ;;
+ "integration/Makefile" ) CONFIG_FILES="$CONFIG_FILES integration/Makefile" ;;
+ "interpolation/Makefile" ) CONFIG_FILES="$CONFIG_FILES interpolation/Makefile" ;;
+ "doc/Makefile" ) CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
+ "block/Makefile" ) CONFIG_FILES="$CONFIG_FILES block/Makefile" ;;
+ "vector/Makefile" ) CONFIG_FILES="$CONFIG_FILES vector/Makefile" ;;
+ "matrix/Makefile" ) CONFIG_FILES="$CONFIG_FILES matrix/Makefile" ;;
+ "histogram/Makefile" ) CONFIG_FILES="$CONFIG_FILES histogram/Makefile" ;;
+ "monte/Makefile" ) CONFIG_FILES="$CONFIG_FILES monte/Makefile" ;;
+ "ode-initval/Makefile" ) CONFIG_FILES="$CONFIG_FILES ode-initval/Makefile" ;;
+ "cblas/Makefile" ) CONFIG_FILES="$CONFIG_FILES cblas/Makefile" ;;
+ "blas/Makefile" ) CONFIG_FILES="$CONFIG_FILES blas/Makefile" ;;
+ "linalg/Makefile" ) CONFIG_FILES="$CONFIG_FILES linalg/Makefile" ;;
+ "eigen/Makefile" ) CONFIG_FILES="$CONFIG_FILES eigen/Makefile" ;;
+ "permutation/Makefile" ) CONFIG_FILES="$CONFIG_FILES permutation/Makefile" ;;
+ "combination/Makefile" ) CONFIG_FILES="$CONFIG_FILES combination/Makefile" ;;
+ "sort/Makefile" ) CONFIG_FILES="$CONFIG_FILES sort/Makefile" ;;
+ "complex/Makefile" ) CONFIG_FILES="$CONFIG_FILES complex/Makefile" ;;
+ "diff/Makefile" ) CONFIG_FILES="$CONFIG_FILES diff/Makefile" ;;
+ "deriv/Makefile" ) CONFIG_FILES="$CONFIG_FILES deriv/Makefile" ;;
+ "cheb/Makefile" ) CONFIG_FILES="$CONFIG_FILES cheb/Makefile" ;;
+ "cdf/Makefile" ) CONFIG_FILES="$CONFIG_FILES cdf/Makefile" ;;
+ "wavelet/Makefile" ) CONFIG_FILES="$CONFIG_FILES wavelet/Makefile" ;;
+ "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+ *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+ test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason to put it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+ trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+ trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
+ test -n "$tmp" && test -d "$tmp"
+} ||
+{
+ tmp=./confstat$$-$RANDOM
+ (umask 077 && mkdir $tmp)
+} ||
+{
+ echo "$me: cannot create a temporary directory in ." >&2
+ { (exit 1); exit 1; }
+}
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "\$CONFIG_FILES"; then
+ # Protect against being on the right side of a sed subst in config.status.
+ sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
+ s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
+s,@SHELL@,$SHELL,;t t
+s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
+s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t
+s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
+s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
+s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t
+s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
+s,@exec_prefix@,$exec_prefix,;t t
+s,@prefix@,$prefix,;t t
+s,@program_transform_name@,$program_transform_name,;t t
+s,@bindir@,$bindir,;t t
+s,@sbindir@,$sbindir,;t t
+s,@libexecdir@,$libexecdir,;t t
+s,@datadir@,$datadir,;t t
+s,@sysconfdir@,$sysconfdir,;t t
+s,@sharedstatedir@,$sharedstatedir,;t t
+s,@localstatedir@,$localstatedir,;t t
+s,@libdir@,$libdir,;t t
+s,@includedir@,$includedir,;t t
+s,@oldincludedir@,$oldincludedir,;t t
+s,@infodir@,$infodir,;t t
+s,@mandir@,$mandir,;t t
+s,@build_alias@,$build_alias,;t t
+s,@host_alias@,$host_alias,;t t
+s,@target_alias@,$target_alias,;t t
+s,@DEFS@,$DEFS,;t t
+s,@ECHO_C@,$ECHO_C,;t t
+s,@ECHO_N@,$ECHO_N,;t t
+s,@ECHO_T@,$ECHO_T,;t t
+s,@LIBS@,$LIBS,;t t
+s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
+s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
+s,@INSTALL_DATA@,$INSTALL_DATA,;t t
+s,@CYGPATH_W@,$CYGPATH_W,;t t
+s,@PACKAGE@,$PACKAGE,;t t
+s,@VERSION@,$VERSION,;t t
+s,@ACLOCAL@,$ACLOCAL,;t t
+s,@AUTOCONF@,$AUTOCONF,;t t
+s,@AUTOMAKE@,$AUTOMAKE,;t t
+s,@AUTOHEADER@,$AUTOHEADER,;t t
+s,@MAKEINFO@,$MAKEINFO,;t t
+s,@install_sh@,$install_sh,;t t
+s,@STRIP@,$STRIP,;t t
+s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t
+s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t
+s,@mkdir_p@,$mkdir_p,;t t
+s,@AWK@,$AWK,;t t
+s,@SET_MAKE@,$SET_MAKE,;t t
+s,@am__leading_dot@,$am__leading_dot,;t t
+s,@AMTAR@,$AMTAR,;t t
+s,@am__tar@,$am__tar,;t t
+s,@am__untar@,$am__untar,;t t
+s,@MAINTAINER_MODE_TRUE@,$MAINTAINER_MODE_TRUE,;t t
+s,@MAINTAINER_MODE_FALSE@,$MAINTAINER_MODE_FALSE,;t t
+s,@MAINT@,$MAINT,;t t
+s,@GSL_LT_VERSION@,$GSL_LT_VERSION,;t t
+s,@GSL_LT_CBLAS_VERSION@,$GSL_LT_CBLAS_VERSION,;t t
+s,@RELEASED@,$RELEASED,;t t
+s,@build@,$build,;t t
+s,@build_cpu@,$build_cpu,;t t
+s,@build_vendor@,$build_vendor,;t t
+s,@build_os@,$build_os,;t t
+s,@host@,$host,;t t
+s,@host_cpu@,$host_cpu,;t t
+s,@host_vendor@,$host_vendor,;t t
+s,@host_os@,$host_os,;t t
+s,@CC@,$CC,;t t
+s,@CFLAGS@,$CFLAGS,;t t
+s,@LDFLAGS@,$LDFLAGS,;t t
+s,@CPPFLAGS@,$CPPFLAGS,;t t
+s,@ac_ct_CC@,$ac_ct_CC,;t t
+s,@EXEEXT@,$EXEEXT,;t t
+s,@OBJEXT@,$OBJEXT,;t t
+s,@CPP@,$CPP,;t t
+s,@LN_S@,$LN_S,;t t
+s,@EGREP@,$EGREP,;t t
+s,@ECHO@,$ECHO,;t t
+s,@AR@,$AR,;t t
+s,@ac_ct_AR@,$ac_ct_AR,;t t
+s,@RANLIB@,$RANLIB,;t t
+s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t
+s,@LIBTOOL@,$LIBTOOL,;t t
+s,@GSL_CFLAGS@,$GSL_CFLAGS,;t t
+s,@GSL_LIBS@,$GSL_LIBS,;t t
+s,@HAVE_INLINE@,$HAVE_INLINE,;t t
+s,@LIBOBJS@,$LIBOBJS,;t t
+s,@HAVE_PRINTF_LONGDOUBLE@,$HAVE_PRINTF_LONGDOUBLE,;t t
+s,@HAVE_EXTENDED_PRECISION_REGISTERS@,$HAVE_EXTENDED_PRECISION_REGISTERS,;t t
+s,@HAVE_GNUSPARC_IEEE_INTERFACE@,$HAVE_GNUSPARC_IEEE_INTERFACE,;t t
+s,@HAVE_GNUM68K_IEEE_INTERFACE@,$HAVE_GNUM68K_IEEE_INTERFACE,;t t
+s,@HAVE_GNUPPC_IEEE_INTERFACE@,$HAVE_GNUPPC_IEEE_INTERFACE,;t t
+s,@HAVE_GNUX86_IEEE_INTERFACE@,$HAVE_GNUX86_IEEE_INTERFACE,;t t
+s,@HAVE_SUNOS4_IEEE_INTERFACE@,$HAVE_SUNOS4_IEEE_INTERFACE,;t t
+s,@HAVE_SOLARIS_IEEE_INTERFACE@,$HAVE_SOLARIS_IEEE_INTERFACE,;t t
+s,@HAVE_HPUX11_IEEE_INTERFACE@,$HAVE_HPUX11_IEEE_INTERFACE,;t t
+s,@HAVE_HPUX_IEEE_INTERFACE@,$HAVE_HPUX_IEEE_INTERFACE,;t t
+s,@HAVE_TRU64_IEEE_INTERFACE@,$HAVE_TRU64_IEEE_INTERFACE,;t t
+s,@HAVE_IRIX_IEEE_INTERFACE@,$HAVE_IRIX_IEEE_INTERFACE,;t t
+s,@HAVE_AIX_IEEE_INTERFACE@,$HAVE_AIX_IEEE_INTERFACE,;t t
+s,@HAVE_FREEBSD_IEEE_INTERFACE@,$HAVE_FREEBSD_IEEE_INTERFACE,;t t
+s,@HAVE_OS2EMX_IEEE_INTERFACE@,$HAVE_OS2EMX_IEEE_INTERFACE,;t t
+s,@HAVE_NETBSD_IEEE_INTERFACE@,$HAVE_NETBSD_IEEE_INTERFACE,;t t
+s,@HAVE_OPENBSD_IEEE_INTERFACE@,$HAVE_OPENBSD_IEEE_INTERFACE,;t t
+s,@HAVE_DARWIN_IEEE_INTERFACE@,$HAVE_DARWIN_IEEE_INTERFACE,;t t
+s,@HAVE_DARWIN86_IEEE_INTERFACE@,$HAVE_DARWIN86_IEEE_INTERFACE,;t t
+s,@HAVE_IEEE_COMPARISONS@,$HAVE_IEEE_COMPARISONS,;t t
+s,@HAVE_IEEE_DENORMALS@,$HAVE_IEEE_DENORMALS,;t t
+s,@LTLIBOBJS@,$LTLIBOBJS,;t t
+CEOF
+
+_ACEOF
+
+ cat >>$CONFIG_STATUS <<\_ACEOF
+ # Split the substitutions into bite-sized pieces for seds with
+ # small command number limits, like on Digital OSF/1 and HP-UX.
+ ac_max_sed_lines=48
+ ac_sed_frag=1 # Number of current file.
+ ac_beg=1 # First line for current file.
+ ac_end=$ac_max_sed_lines # Line after last line for current file.
+ ac_more_lines=:
+ ac_sed_cmds=
+ while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+ else
+ sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+ fi
+ if test ! -s $tmp/subs.frag; then
+ ac_more_lines=false
+ else
+ # The purpose of the label and of the branching condition is to
+ # speed up the sed processing (if there are no `@' at all, there
+ # is no need to browse any of the substitutions).
+ # These are the two extra sed commands mentioned above.
+ (echo ':t
+ /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
+ fi
+ ac_sed_frag=`expr $ac_sed_frag + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_lines`
+ fi
+ done
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+ fi
+fi # test -n "$CONFIG_FILES"
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case $ac_file in
+ - | *:- | *:-:* ) # input from stdin
+ cat >$tmp/stdin
+ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ * ) ac_file_in=$ac_file.in ;;
+ esac
+
+ # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+ ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_top_builddir$INSTALL ;;
+ esac
+
+ if test x"$ac_file" != x-; then
+ { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+ rm -f "$ac_file"
+ fi
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ if test x"$ac_file" = x-; then
+ configure_input=
+ else
+ configure_input="$ac_file. "
+ fi
+ configure_input=$configure_input"Generated from `echo $ac_file_in |
+ sed 's,.*/,,'` by configure."
+
+ # First look for the input files in the build tree, otherwise in the
+ # src tree.
+ ac_file_inputs=`IFS=:
+ for f in $ac_file_in; do
+ case $f in
+ -) echo $tmp/stdin ;;
+ [\\/$]*)
+ # Absolute (can't be DOS-style, as IFS=:)
+ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ echo "$f";;
+ *) # Relative
+ if test -f "$f"; then
+ # Build tree
+ echo "$f"
+ elif test -f "$srcdir/$f"; then
+ # Source tree
+ echo "$srcdir/$f"
+ else
+ # /dev/null tree
+ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ fi;;
+ esac
+ done` || { (exit 1); exit 1; }
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+ sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s,@configure_input@,$configure_input,;t t
+s,@srcdir@,$ac_srcdir,;t t
+s,@abs_srcdir@,$ac_abs_srcdir,;t t
+s,@top_srcdir@,$ac_top_srcdir,;t t
+s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t
+s,@builddir@,$ac_builddir,;t t
+s,@abs_builddir@,$ac_abs_builddir,;t t
+s,@top_builddir@,$ac_top_builddir,;t t
+s,@abs_top_builddir@,$ac_abs_top_builddir,;t t
+s,@INSTALL@,$ac_INSTALL,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
+ rm -f $tmp/stdin
+ if test x"$ac_file" != x-; then
+ mv $tmp/out $ac_file
+ else
+ cat $tmp/out
+ rm -f $tmp/out
+ fi
+
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_HEADER section.
+#
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)'
+ac_dB='[ ].*$,\1#\2'
+ac_dC=' '
+ac_dD=',;t'
+# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_uB='$,\1#\2define\3'
+ac_uC=' '
+ac_uD=',;t'
+
+for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case $ac_file in
+ - | *:- | *:-:* ) # input from stdin
+ cat >$tmp/stdin
+ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ * ) ac_file_in=$ac_file.in ;;
+ esac
+
+ test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+
+ # First look for the input files in the build tree, otherwise in the
+ # src tree.
+ ac_file_inputs=`IFS=:
+ for f in $ac_file_in; do
+ case $f in
+ -) echo $tmp/stdin ;;
+ [\\/$]*)
+ # Absolute (can't be DOS-style, as IFS=:)
+ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ # Do quote $f, to prevent DOS paths from being IFS'd.
+ echo "$f";;
+ *) # Relative
+ if test -f "$f"; then
+ # Build tree
+ echo "$f"
+ elif test -f "$srcdir/$f"; then
+ # Source tree
+ echo "$srcdir/$f"
+ else
+ # /dev/null tree
+ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ fi;;
+ esac
+ done` || { (exit 1); exit 1; }
+ # Remove the trailing spaces.
+ sed 's/[ ]*$//' $ac_file_inputs >$tmp/in
+
+_ACEOF
+
+# Transform confdefs.h into two sed scripts, `conftest.defines' and
+# `conftest.undefs', that substitutes the proper values into
+# config.h.in to produce config.h. The first handles `#define'
+# templates, and the second `#undef' templates.
+# And first: Protect against being on the right side of a sed subst in
+# config.status. Protect against being in an unquoted here document
+# in config.status.
+rm -f conftest.defines conftest.undefs
+# Using a here document instead of a string reduces the quoting nightmare.
+# Putting comments in sed scripts is not portable.
+#
+# `end' is used to avoid that the second main sed command (meant for
+# 0-ary CPP macros) applies to n-ary macro definitions.
+# See the Autoconf documentation for `clear'.
+cat >confdef2sed.sed <<\_ACEOF
+s/[\\&,]/\\&/g
+s,[\\$`],\\&,g
+t clear
+: clear
+s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp
+t end
+s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp
+: end
+_ACEOF
+# If some macros were called several times there might be several times
+# the same #defines, which is useless. Nevertheless, we may not want to
+# sort them, since we want the *last* AC-DEFINE to be honored.
+uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines
+sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs
+rm -f confdef2sed.sed
+
+# This sed command replaces #undef with comments. This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >>conftest.undefs <<\_ACEOF
+s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
+_ACEOF
+
+# Break up conftest.defines because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS
+echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS
+echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS
+echo ' :' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.defines >/dev/null
+do
+ # Write a limited-size here document to $tmp/defines.sed.
+ echo ' cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS
+ # Speed up: don't consider the non `#define' lines.
+ echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS
+ # Work around the forget-to-reset-the-flag bug.
+ echo 't clr' >>$CONFIG_STATUS
+ echo ': clr' >>$CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS
+ echo 'CEOF
+ sed -f $tmp/defines.sed $tmp/in >$tmp/out
+ rm -f $tmp/in
+ mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail
+ rm -f conftest.defines
+ mv conftest.tail conftest.defines
+done
+rm -f conftest.defines
+echo ' fi # grep' >>$CONFIG_STATUS
+echo >>$CONFIG_STATUS
+
+# Break up conftest.undefs because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo ' # Handle all the #undef templates' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.undefs >/dev/null
+do
+ # Write a limited-size here document to $tmp/undefs.sed.
+ echo ' cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS
+ # Speed up: don't consider the non `#undef'
+ echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS
+ # Work around the forget-to-reset-the-flag bug.
+ echo 't clr' >>$CONFIG_STATUS
+ echo ': clr' >>$CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS
+ echo 'CEOF
+ sed -f $tmp/undefs.sed $tmp/in >$tmp/out
+ rm -f $tmp/in
+ mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail
+ rm -f conftest.undefs
+ mv conftest.tail conftest.undefs
+done
+rm -f conftest.undefs
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ if test x"$ac_file" = x-; then
+ echo "/* Generated by configure. */" >$tmp/config.h
+ else
+ echo "/* $ac_file. Generated by configure. */" >$tmp/config.h
+ fi
+ cat $tmp/in >>$tmp/config.h
+ rm -f $tmp/in
+ if test x"$ac_file" != x-; then
+ if diff $ac_file $tmp/config.h >/dev/null 2>&1; then
+ { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+ else
+ ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ rm -f $ac_file
+ mv $tmp/config.h $ac_file
+ fi
+ else
+ cat $tmp/config.h
+ rm -f $tmp/config.h
+ fi
+# Compute $ac_file's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $ac_file | $ac_file:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null ||
+$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X$ac_file : 'X\(//\)[^/]' \| \
+ X$ac_file : 'X\(//\)$' \| \
+ X$ac_file : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X$ac_file |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`/stamp-h$_am_stamp_count
+done
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ ac_config_status_args=
+ test "$silent" = yes &&
+ ac_config_status_args="$ac_config_status_args --quiet"
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || { (exit 1); exit 1; }
+fi
+
diff --git a/gsl-1.9/configure.ac b/gsl-1.9/configure.ac
new file mode 100644
index 0000000..2a52138
--- /dev/null
+++ b/gsl-1.9/configure.ac
@@ -0,0 +1,368 @@
+dnl Process this file with autoconf to produce a configure script.
+
+AC_INIT([gsl],[1.9])
+AC_CONFIG_SRCDIR(gsl_math.h)
+
+AM_INIT_AUTOMAKE([gnu no-dependencies])
+AC_CONFIG_HEADERS([config.h])
+AM_MAINTAINER_MODE
+
+dnl Library versioning (current:revision:age)
+dnl See the libtool manual for an explanation of the numbers
+dnl
+dnl gsl-1.0 libgsl 0:0:0 libgslcblas 0:0:0
+dnl gsl-1.1 libgsl 1:0:1 libgslcblas 0:0:0
+dnl gsl-1.1.1 libgsl 2:0:2 libgslcblas 0:0:0
+dnl gsl-1.2 libgsl 3:0:3 libgslcblas 0:0:0
+dnl gsl-1.3 libgsl 4:0:4 libgslcblas 0:0:0
+dnl gsl-1.4 libgsl 5:0:5 libgslcblas 0:0:0
+dnl gsl-1.5 libgsl 6:0:6 libgslcblas 0:0:0
+dnl gsl-1.6 libgsl 7:0:7 libgslcblas 0:0:0
+dnl gsl-1.7 libgsl 8:0:8 libgslcblas 0:0:0
+dnl gsl-1.8 libgsl 9:0:9 libgslcblas 0:0:0
+dnl gsl-1.9 libgsl 10:0:10 libgslcblas 0:0:0
+
+GSL_LT_VERSION="10:0:10"
+AC_SUBST(GSL_LT_VERSION)
+GSL_LT_CBLAS_VERSION="0:0:0"
+AC_SUBST(GSL_LT_CBLAS_VERSION)
+
+case "$VERSION" in
+ *+)
+ AC_DEFINE(RELEASED,0)
+ ;;
+ *)
+ AC_DEFINE(RELEASED,1)
+ ;;
+esac
+AC_SUBST(RELEASED)
+
+dnl things required by automake
+dnl AC_ARG_PROGRAM
+AC_PROG_MAKE_SET
+
+dnl Check for which system.
+AC_CANONICAL_HOST
+
+dnl Checks for programs.
+AC_LANG(C)
+AC_PROG_CC
+AC_PROG_CPP
+AC_PROG_INSTALL
+AC_PROG_LN_S
+
+dnl Disable unnecessary libtool tests for c++,fortran,java
+define([AC_LIBTOOL_LANG_CXX_CONFIG], [:])dnl
+define([AC_LIBTOOL_LANG_F77_CONFIG], [:])dnl
+define([AC_LIBTOOL_LANG_GCJ_CONFIG], [:])dnl
+AC_PROG_LIBTOOL
+
+dnl Check compiler features
+AC_TYPE_SIZE_T
+dnl AC_C_CONST
+AC_C_VOLATILE
+AC_C_INLINE
+
+GSL_CFLAGS="-I$includedir"
+GSL_LIBS="-L$libdir -lgsl"
+
+AC_SUBST(GSL_CFLAGS)
+AC_SUBST(GSL_LIBS)
+
+dnl Check for "extern inline", using a modified version of the test
+dnl for AC_C_INLINE from acspecific.mt
+dnl
+AC_CACHE_CHECK([for extern inline], ac_cv_c_extern_inline,
+[ac_cv_c_extern_inline=no
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[extern $ac_cv_c_inline double foo(double x);
+extern $ac_cv_c_inline double foo(double x) { return x + 1.0 ; } ;
+double foo (double x) { return x + 1.0 ; };]], [[ foo(1.0) ]])],[ac_cv_c_extern_inline="yes"],[])
+])
+
+if test "$ac_cv_c_extern_inline" != no ; then
+ AC_DEFINE(HAVE_INLINE,1)
+ AC_SUBST(HAVE_INLINE)
+fi
+
+dnl Checks for header files.
+AC_CHECK_HEADERS(ieeefp.h)
+
+dnl Checks for typedefs, structures, and compiler characteristics.
+
+dnl Checks for library functions.
+
+dnl AC_FUNC_ALLOCA
+AC_FUNC_VPRINTF
+
+dnl strcasecmp, strerror, xmalloc, xrealloc, probably others should be added.
+dnl removed strerror from this list, it's hardcoded in the err/ directory
+dnl Any functions which appear in this list of functions should be provided
+dnl in the utils/ directory
+dnl xmalloc is not used, removed (bjg)
+AC_REPLACE_FUNCS(memcpy memmove strdup strtol strtoul)
+
+AC_CACHE_CHECK(for EXIT_SUCCESS and EXIT_FAILURE,
+ac_cv_decl_exit_success_and_failure,
+AC_EGREP_CPP(yes,
+[
+#include <stdlib.h>
+#ifdef EXIT_SUCCESS
+yes
+#endif
+],
+ac_cv_decl_exit_success_and_failure=yes,
+ac_cv_decl_exit_success_and_failure=no)
+)
+
+if test "$ac_cv_decl_exit_success_and_failure" = yes ; then
+ AC_DEFINE(HAVE_EXIT_SUCCESS_AND_FAILURE)
+fi ;
+
+dnl Use alternate libm if specified by user
+
+if test "x$LIBS" = "x" ; then
+ AC_CHECK_LIB(m, cos)
+fi
+
+dnl Remember to put a definition in acconfig.h for each of these
+AC_CHECK_DECLS(feenableexcept,,,[#define _GNU_SOURCE 1
+#include <fenv.h>])
+AC_CHECK_DECLS(fesettrapenable,,,[#define _GNU_SOURCE 1
+#include <fenv.h>])
+AC_CHECK_DECLS(hypot,,,[#include <math.h>])
+AC_CHECK_DECLS(expm1,,,[#include <math.h>])
+AC_CHECK_DECLS(acosh,,,[#include <math.h>])
+AC_CHECK_DECLS(asinh,,,[#include <math.h>])
+AC_CHECK_DECLS(atanh,,,[#include <math.h>])
+AC_CHECK_DECLS(ldexp,,,[#include <math.h>])
+AC_CHECK_DECLS(frexp,,,[#include <math.h>])
+AC_CHECK_DECLS(isinf,,,[#include <math.h>])
+AC_CHECK_DECLS(finite,,,[#include <math.h>])
+AC_CHECK_DECLS(isfinite,,,[#include <math.h>])
+AC_CHECK_DECLS(isnan,,,[#include <math.h>])
+
+dnl OpenBSD has a broken implementation of log1p.
+case "$host" in
+ *-*-*openbsd*)
+ AC_MSG_RESULT([avoiding OpenBSD system log1p - using gsl version])
+ ;;
+ *)
+ AC_CHECK_DECLS(log1p,,,[#include <math.h>])
+ ;;
+esac
+
+AC_CACHE_CHECK([for long double stdio], ac_cv_func_printf_longdouble,
+[AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <stdlib.h>
+#include <stdio.h>
+int main (void)
+{
+const char * s = "5678"; long double x = 1.234 ;
+fprintf(stderr,"%Lg\n",x) ;
+sscanf(s, "%Lg", &x);
+if (x == 5678) {exit (0);} else {exit(1); };
+}]])],[ac_cv_func_printf_longdouble="yes"],[ac_cv_func_printf_longdouble="no"],[ac_cv_func_printf_longdouble="no"])])
+
+if test "$ac_cv_func_printf_longdouble" != no; then
+ AC_DEFINE(HAVE_PRINTF_LONGDOUBLE,1)
+ AC_SUBST(HAVE_PRINTF_LONGDOUBLE)
+fi
+
+AC_CACHE_CHECK([for extended floating point registers],ac_cv_c_extended_fp,
+[case "$host" in
+ *sparc*-*-*)
+ ac_cv_c_extended_fp=no
+ ;;
+ *powerpc*-*-*)
+ ac_cv_c_extended_fp=no
+ ;;
+ *hppa*-*-*)
+ ac_cv_c_extended_fp=no
+ ;;
+ *alpha*-*-*)
+ ac_cv_c_extended_fp=no
+ ;;
+ *68k*-*-*)
+ ac_cv_c_extended_fp=yes
+ ;;
+ *86-*-*)
+ ac_cv_c_extended_fp=yes
+ ;;
+ x86_64-*-*)
+ ac_cv_c_extended_fp=yes
+ ;;
+ *)
+ ac_cv_c_extended_fp=unknown
+ ;;
+esac
+])
+
+if test $ac_cv_c_extended_fp != "no" ; then
+ AC_DEFINE(HAVE_EXTENDED_PRECISION_REGISTERS,1)
+ AC_SUBST(HAVE_EXTENDED_PRECISION_REGISTERS)
+fi
+
+AC_CACHE_CHECK([for IEEE arithmetic interface type], ac_cv_c_ieee_interface,
+[case "$host" in
+ sparc-*-linux*)
+ ac_cv_c_ieee_interface=gnusparc
+ ;;
+ m68k-*-linux*)
+ ac_cv_c_ieee_interface=gnum68k
+ ;;
+ powerpc-*-linux*)
+ ac_cv_c_ieee_interface=gnuppc
+ ;;
+ *86-*-gnu | *86_64-*-gnu | *86-*-linux* | *86_64-*-linux*)
+ ac_cv_c_ieee_interface=gnux86
+ ;;
+ *-*-sunos4*)
+ ac_cv_c_ieee_interface=sunos4
+ ;;
+ *-*-solaris*)
+ ac_cv_c_ieee_interface=solaris
+ ;;
+ *-*-hpux11*)
+ ac_cv_c_ieee_interface=hpux11
+ ;;
+ *-*-hpux*)
+ ac_cv_c_ieee_interface=hpux
+ ;;
+ *-*-osf*)
+ ac_cv_c_ieee_interface=tru64
+ ;;
+ *-*-aix*)
+ ac_cv_c_ieee_interface=aix
+ ;;
+ *-*-irix*)
+ ac_cv_c_ieee_interface=irix
+ ;;
+ powerpc-*-*darwin*)
+ ac_cv_c_ieee_interface=darwin
+ ;;
+ *86-*-*darwin*)
+ ac_cv_c_ieee_interface=darwin86
+ ;;
+ *-*-*netbsd*)
+ ac_cv_c_ieee_interface=netbsd
+ ;;
+ *-*-*openbsd*)
+ ac_cv_c_ieee_interface=openbsd
+ ;;
+ *-*-*bsd*)
+ ac_cv_c_ieee_interface=freebsd
+ ;;
+ *-*-os2*)
+ ac_cv_c_ieee_interface=os2emx
+ ;;
+ *)
+ ac_cv_c_ieee_interface=unknown
+ ;;
+esac
+])
+
+if test "$ac_cv_c_ieee_interface" = "gnux86" ; then
+ AC_CACHE_CHECK([for FPU_SETCW], ac_cv_c_fpu_setcw,
+ [ac_cv_c_fpu_setcw=no
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <fpu_control.h>
+#ifndef _FPU_SETCW
+#include <i386/fpu_control.h>
+#define _FPU_SETCW(cw) __setfpucw(cw)
+#endif
+]], [[ unsigned short mode = 0 ; _FPU_SETCW(mode); ]])],[ac_cv_c_fpu_setcw="yes"],[ac_cv_c_ieee_interface=unknown])
+ ])
+fi
+
+ac_tr_ieee_interface=HAVE_`echo $ac_cv_c_ieee_interface | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`_IEEE_INTERFACE
+AC_DEFINE_UNQUOTED($ac_tr_ieee_interface,1,[IEEE Interface Type])
+
+AC_SUBST(HAVE_GNUSPARC_IEEE_INTERFACE)
+AC_SUBST(HAVE_GNUM68K_IEEE_INTERFACE)
+AC_SUBST(HAVE_GNUPPC_IEEE_INTERFACE)
+AC_SUBST(HAVE_GNUX86_IEEE_INTERFACE)
+AC_SUBST(HAVE_SUNOS4_IEEE_INTERFACE)
+AC_SUBST(HAVE_SOLARIS_IEEE_INTERFACE)
+AC_SUBST(HAVE_HPUX11_IEEE_INTERFACE)
+AC_SUBST(HAVE_HPUX_IEEE_INTERFACE)
+AC_SUBST(HAVE_TRU64_IEEE_INTERFACE)
+AC_SUBST(HAVE_IRIX_IEEE_INTERFACE)
+AC_SUBST(HAVE_AIX_IEEE_INTERFACE)
+AC_SUBST(HAVE_FREEBSD_IEEE_INTERFACE)
+AC_SUBST(HAVE_OS2EMX_IEEE_INTERFACE)
+AC_SUBST(HAVE_NETBSD_IEEE_INTERFACE)
+AC_SUBST(HAVE_OPENBSD_IEEE_INTERFACE)
+AC_SUBST(HAVE_DARWIN_IEEE_INTERFACE)
+AC_SUBST(HAVE_DARWIN86_IEEE_INTERFACE)
+
+dnl Check for IEEE control flags
+
+save_cflags="$CFLAGS"
+AC_CACHE_CHECK([for IEEE compiler flags], ac_cv_c_ieee_flags,
+[
+case "$host" in
+ alpha*-*-*)
+ if test X"$GCC" = Xyes ; then
+ ieee_flags='-mieee -mfp-rounding-mode=d'
+ else
+ # This assumes Compaq's C compiler.
+ ieee_flags='-ieee -fprm d'
+ fi
+ ;;
+esac
+if test X"$ieee_flags" != X ; then
+ CFLAGS="$ieee_flags $CFLAGS"
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[int foo;]])],[ac_cv_c_ieee_flags="$ieee_flags"],[ac_cv_c_ieee_flags="none"])
+else
+ ac_cv_c_ieee_flags="none"
+fi])
+
+if test "$ac_cv_c_ieee_flags" != "none" ; then
+ CFLAGS="$ac_cv_c_ieee_flags $save_cflags"
+else
+ CFLAGS="$save_cflags"
+fi
+
+dnl Check IEEE comparisons, whether "x != x" is true for NaNs
+dnl
+AC_CACHE_CHECK([for IEEE comparisons], ac_cv_c_ieee_comparisons,
+[AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <math.h>
+int main (void)
+{
+ int status; double inf, nan;
+ inf = exp(1.0e10);
+ nan = inf / inf ;
+ status = (nan == nan);
+ exit (status);
+}]])],[ac_cv_c_ieee_comparisons="yes"],[ac_cv_c_ieee_comparisons="no"],[ac_cv_c_ieee_comparisons="yes"])
+])
+
+if test "$ac_cv_c_ieee_comparisons" != no ; then
+ AC_DEFINE(HAVE_IEEE_COMPARISONS,1)
+ AC_SUBST(HAVE_IEEE_COMPARISONS)
+fi
+
+dnl Check for IEEE denormalized arithmetic
+dnl
+AC_CACHE_CHECK([for IEEE denormalized values], ac_cv_c_ieee_denormals,
+[AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <math.h>
+int main (void)
+{
+ int i, status;
+ volatile double z = 1e-308;
+ for (i = 0; i < 5; i++) { z = z / 10.0 ; };
+ for (i = 0; i < 5; i++) { z = z * 10.0 ; };
+ status = (z == 0.0);
+ exit (status);
+}]])],[ac_cv_c_ieee_denormals="yes"],[ac_cv_c_ieee_denormals="no"],[ac_cv_c_ieee_denormals="yes"])
+])
+
+if test "$ac_cv_c_ieee_denormals" != no ; then
+ AC_DEFINE(HAVE_IEEE_DENORMALS,1)
+ AC_SUBST(HAVE_IEEE_DENORMALS)
+fi
+
+dnl
+AC_CONFIG_FILES([gsl-config gsl.pc gsl_version.h gsl.spec gsl/Makefile test/Makefile err/Makefile sys/Makefile utils/Makefile const/Makefile min/Makefile multimin/Makefile ieee-utils/Makefile fft/Makefile specfunc/Makefile dht/Makefile fit/Makefile multifit/Makefile bspline/Makefile statistics/Makefile sum/Makefile roots/Makefile multiroots/Makefile ntuple/Makefile poly/Makefile qrng/Makefile rng/Makefile randist/Makefile siman/Makefile integration/Makefile interpolation/Makefile doc/Makefile block/Makefile vector/Makefile matrix/Makefile histogram/Makefile monte/Makefile ode-initval/Makefile cblas/Makefile blas/Makefile linalg/Makefile eigen/Makefile permutation/Makefile combination/Makefile sort/Makefile complex/Makefile diff/Makefile deriv/Makefile cheb/Makefile cdf/Makefile wavelet/Makefile Makefile])
+AC_OUTPUT
diff --git a/gsl-1.9/const/ChangeLog b/gsl-1.9/const/ChangeLog
new file mode 100644
index 0000000..a37a02d
--- /dev/null
+++ b/gsl-1.9/const/ChangeLog
@@ -0,0 +1,72 @@
+2006-03-21 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c (main): added some extra tests
+
+2006-03-17 Brian Gough <bjg@network-theory.co.uk>
+
+ * const.el (gsl-electrical-constants): added debye unit
+
+2004-05-26 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c: added stdlib.h for exit()
+
+2004-03-05 Brian Gough <bjg@network-theory.co.uk>
+
+ * const.el: added CGS and MKS systems back in, with CGSM electrical
+ units excluded from CGS, for backwards compatibility
+
+2003-11-27 Brian Gough <bjg@network-theory.co.uk>
+
+ * const.el (gsl-constants): added stefan-boltzmann constant and
+ thomson cross section
+
+2003-09-18 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c: added a test program
+
+ * gsl_const.h: fixed to use new header files for MKSA and CGSM
+
+2003-06-09 Brian Gough <bjg@network-theory.co.uk>
+
+ * calc-units-update.el: changed to use MKSA and CGSM units, so
+ that electromagnetic constants are converted correctly
+
+Sat Jul 20 21:25:56 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * calc-units-update.el (math-additional-units): changed setvar to
+ setq, otherwise the new values do not override the original values
+
+Wed May 29 22:41:31 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * calc-units-update.el (math-additional-units): updated unit
+ values, in a backwards compatible way. Made mue an absolute
+ value, and put Ryd in energy units.
+
+2002-05-18 Jochen Küpper <jochen@unc.edu>
+
+ * calc-units-update.el (math-additional-units): Add this file to
+ provide updated costants for Emacs calc. (These values are in the
+ current development versions of GNU Emacs and Xemacs already.)
+
+Mon Apr 1 19:27:57 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * const.el (gsl-constants): Added newton, dyne, joule, erg and
+ power-of-ten prefixes, Mega, Giga, Tera, etc.
+
+Tue Jan 8 21:48:56 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * const.el (gsl-constants): added bohr_radius and
+ vacuum_permittivity
+
+Tue Sep 25 15:15:33 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * const.el (fn): make all output double precision to avoid
+ possibility of unexpected integer division.
+ (gsl-constants): fix definition of barn and btu
+ (gsl-constants): added solar mass
+
+Tue Jan 23 16:19:50 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * const.el (gsl-constants): fixed definition of POINT (from pt to
+ point, was previously measuring 'pints')
+
diff --git a/gsl-1.9/const/Makefile.am b/gsl-1.9/const/Makefile.am
new file mode 100644
index 0000000..83b82be
--- /dev/null
+++ b/gsl-1.9/const/Makefile.am
@@ -0,0 +1,15 @@
+pkginclude_HEADERS = gsl_const.h gsl_const_cgs.h gsl_const_mks.h gsl_const_cgsm.h gsl_const_mksa.h gsl_const_num.h
+
+INCLUDES= -I$(top_builddir)
+
+TESTS = $(check_PROGRAMS)
+
+check_PROGRAMS = test
+
+test_SOURCES = test.c
+
+test_LDADD = ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+
+
+
+
diff --git a/gsl-1.9/const/Makefile.in b/gsl-1.9/const/Makefile.in
new file mode 100644
index 0000000..493adba
--- /dev/null
+++ b/gsl-1.9/const/Makefile.in
@@ -0,0 +1,524 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = test$(EXEEXT)
+subdir = const
+DIST_COMMON = $(pkginclude_HEADERS) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in ChangeLog TODO
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am_test_OBJECTS = test.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = ../ieee-utils/libgslieeeutils.la \
+ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \
+ ../utils/libutils.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(test_SOURCES)
+DIST_SOURCES = $(test_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+pkginclude_HEADERS = gsl_const.h gsl_const_cgs.h gsl_const_mks.h gsl_const_cgsm.h gsl_const_mksa.h gsl_const_num.h
+INCLUDES = -I$(top_builddir)
+TESTS = $(check_PROGRAMS)
+test_SOURCES = test.c
+test_LDADD = ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps const/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps const/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool ctags \
+ distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-exec install-exec-am install-info \
+ install-info-am install-man install-pkgincludeHEADERS \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags uninstall uninstall-am \
+ uninstall-info-am uninstall-pkgincludeHEADERS
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/const/TODO b/gsl-1.9/const/TODO
new file mode 100644
index 0000000..6095191
--- /dev/null
+++ b/gsl-1.9/const/TODO
@@ -0,0 +1 @@
+could add RADIATION_DENSITY_CONSTANT (7.56591e-16) /* J m-3 K-4 */
diff --git a/gsl-1.9/const/gsl_const.h b/gsl-1.9/const/gsl_const.h
new file mode 100644
index 0000000..8cc4c57
--- /dev/null
+++ b/gsl-1.9/const/gsl_const.h
@@ -0,0 +1,31 @@
+/* const/gsl_const.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_CONST__
+#define __GSL_CONST__
+
+#include <gsl/gsl_const_num.h>
+
+#include <gsl/gsl_const_cgs.h>
+#include <gsl/gsl_const_mks.h>
+
+#include <gsl/gsl_const_cgsm.h>
+#include <gsl/gsl_const_mksa.h>
+
+#endif /* __GSL_CONST__ */
diff --git a/gsl-1.9/const/gsl_const_cgs.h b/gsl-1.9/const/gsl_const_cgs.h
new file mode 100644
index 0000000..673ad1b
--- /dev/null
+++ b/gsl-1.9/const/gsl_const_cgs.h
@@ -0,0 +1,123 @@
+/* const/gsl_const_cgs.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+ * 2006 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_CONST_CGS__
+#define __GSL_CONST_CGS__
+
+#define GSL_CONST_CGS_SPEED_OF_LIGHT (2.99792458e10) /* cm / s */
+#define GSL_CONST_CGS_GRAVITATIONAL_CONSTANT (6.673e-8) /* cm^3 / g s^2 */
+#define GSL_CONST_CGS_PLANCKS_CONSTANT_H (6.62606876e-27) /* g cm^2 / s */
+#define GSL_CONST_CGS_PLANCKS_CONSTANT_HBAR (1.05457159642e-27) /* g cm^2 / s */
+#define GSL_CONST_CGS_ASTRONOMICAL_UNIT (1.49597870691e13) /* cm */
+#define GSL_CONST_CGS_LIGHT_YEAR (9.46053620707e17) /* cm */
+#define GSL_CONST_CGS_PARSEC (3.08567758135e18) /* cm */
+#define GSL_CONST_CGS_GRAV_ACCEL (9.80665e2) /* cm / s^2 */
+#define GSL_CONST_CGS_ELECTRON_VOLT (1.602176462e-12) /* g cm^2 / s^2 */
+#define GSL_CONST_CGS_MASS_ELECTRON (9.10938188e-28) /* g */
+#define GSL_CONST_CGS_MASS_MUON (1.88353109e-25) /* g */
+#define GSL_CONST_CGS_MASS_PROTON (1.67262158e-24) /* g */
+#define GSL_CONST_CGS_MASS_NEUTRON (1.67492716e-24) /* g */
+#define GSL_CONST_CGS_RYDBERG (2.17987190389e-11) /* g cm^2 / s^2 */
+#define GSL_CONST_CGS_BOLTZMANN (1.3806503e-16) /* g cm^2 / K s^2 */
+#define GSL_CONST_CGS_BOHR_MAGNETON (9.27400899e-20) /* A cm^2 */
+#define GSL_CONST_CGS_NUCLEAR_MAGNETON (5.05078317e-23) /* A cm^2 */
+#define GSL_CONST_CGS_ELECTRON_MAGNETIC_MOMENT (9.28476362e-20) /* A cm^2 */
+#define GSL_CONST_CGS_PROTON_MAGNETIC_MOMENT (1.410606633e-22) /* A cm^2 */
+#define GSL_CONST_CGS_MOLAR_GAS (8.314472e7) /* g cm^2 / K mol s^2 */
+#define GSL_CONST_CGS_STANDARD_GAS_VOLUME (2.2710981e4) /* cm^3 / mol */
+#define GSL_CONST_CGS_MINUTE (6e1) /* s */
+#define GSL_CONST_CGS_HOUR (3.6e3) /* s */
+#define GSL_CONST_CGS_DAY (8.64e4) /* s */
+#define GSL_CONST_CGS_WEEK (6.048e5) /* s */
+#define GSL_CONST_CGS_INCH (2.54e0) /* cm */
+#define GSL_CONST_CGS_FOOT (3.048e1) /* cm */
+#define GSL_CONST_CGS_YARD (9.144e1) /* cm */
+#define GSL_CONST_CGS_MILE (1.609344e5) /* cm */
+#define GSL_CONST_CGS_NAUTICAL_MILE (1.852e5) /* cm */
+#define GSL_CONST_CGS_FATHOM (1.8288e2) /* cm */
+#define GSL_CONST_CGS_MIL (2.54e-3) /* cm */
+#define GSL_CONST_CGS_POINT (3.52777777778e-2) /* cm */
+#define GSL_CONST_CGS_TEXPOINT (3.51459803515e-2) /* cm */
+#define GSL_CONST_CGS_MICRON (1e-4) /* cm */
+#define GSL_CONST_CGS_ANGSTROM (1e-8) /* cm */
+#define GSL_CONST_CGS_HECTARE (1e8) /* cm^2 */
+#define GSL_CONST_CGS_ACRE (4.04685642241e7) /* cm^2 */
+#define GSL_CONST_CGS_BARN (1e-24) /* cm^2 */
+#define GSL_CONST_CGS_LITER (1e3) /* cm^3 */
+#define GSL_CONST_CGS_US_GALLON (3.78541178402e3) /* cm^3 */
+#define GSL_CONST_CGS_QUART (9.46352946004e2) /* cm^3 */
+#define GSL_CONST_CGS_PINT (4.73176473002e2) /* cm^3 */
+#define GSL_CONST_CGS_CUP (2.36588236501e2) /* cm^3 */
+#define GSL_CONST_CGS_FLUID_OUNCE (2.95735295626e1) /* cm^3 */
+#define GSL_CONST_CGS_TABLESPOON (1.47867647813e1) /* cm^3 */
+#define GSL_CONST_CGS_TEASPOON (4.92892159375e0) /* cm^3 */
+#define GSL_CONST_CGS_CANADIAN_GALLON (4.54609e3) /* cm^3 */
+#define GSL_CONST_CGS_UK_GALLON (4.546092e3) /* cm^3 */
+#define GSL_CONST_CGS_MILES_PER_HOUR (4.4704e1) /* cm / s */
+#define GSL_CONST_CGS_KILOMETERS_PER_HOUR (2.77777777778e1) /* cm / s */
+#define GSL_CONST_CGS_KNOT (5.14444444444e1) /* cm / s */
+#define GSL_CONST_CGS_POUND_MASS (4.5359237e2) /* g */
+#define GSL_CONST_CGS_OUNCE_MASS (2.8349523125e1) /* g */
+#define GSL_CONST_CGS_TON (9.0718474e5) /* g */
+#define GSL_CONST_CGS_METRIC_TON (1e6) /* g */
+#define GSL_CONST_CGS_UK_TON (1.0160469088e6) /* g */
+#define GSL_CONST_CGS_TROY_OUNCE (3.1103475e1) /* g */
+#define GSL_CONST_CGS_CARAT (2e-1) /* g */
+#define GSL_CONST_CGS_UNIFIED_ATOMIC_MASS (1.66053873e-24) /* g */
+#define GSL_CONST_CGS_GRAM_FORCE (9.80665e2) /* cm g / s^2 */
+#define GSL_CONST_CGS_POUND_FORCE (4.44822161526e5) /* cm g / s^2 */
+#define GSL_CONST_CGS_KILOPOUND_FORCE (4.44822161526e8) /* cm g / s^2 */
+#define GSL_CONST_CGS_POUNDAL (1.38255e4) /* cm g / s^2 */
+#define GSL_CONST_CGS_CALORIE (4.1868e7) /* g cm^2 / s^2 */
+#define GSL_CONST_CGS_BTU (1.05505585262e10) /* g cm^2 / s^2 */
+#define GSL_CONST_CGS_THERM (1.05506e15) /* g cm^2 / s^2 */
+#define GSL_CONST_CGS_HORSEPOWER (7.457e9) /* g cm^2 / s^3 */
+#define GSL_CONST_CGS_BAR (1e6) /* g / cm s^2 */
+#define GSL_CONST_CGS_STD_ATMOSPHERE (1.01325e6) /* g / cm s^2 */
+#define GSL_CONST_CGS_TORR (1.33322368421e3) /* g / cm s^2 */
+#define GSL_CONST_CGS_METER_OF_MERCURY (1.33322368421e6) /* g / cm s^2 */
+#define GSL_CONST_CGS_INCH_OF_MERCURY (3.38638815789e4) /* g / cm s^2 */
+#define GSL_CONST_CGS_INCH_OF_WATER (2.490889e3) /* g / cm s^2 */
+#define GSL_CONST_CGS_PSI (6.89475729317e4) /* g / cm s^2 */
+#define GSL_CONST_CGS_POISE (1e0) /* g / cm s */
+#define GSL_CONST_CGS_STOKES (1e0) /* cm^2 / s */
+#define GSL_CONST_CGS_FARADAY (9.6485341472e4) /* A s / mol */
+#define GSL_CONST_CGS_ELECTRON_CHARGE (1.602176462e-19) /* A s */
+#define GSL_CONST_CGS_GAUSS (1e-1) /* g / A s^2 */
+#define GSL_CONST_CGS_STILB (1e0) /* cd / cm^2 */
+#define GSL_CONST_CGS_LUMEN (1e0) /* cd sr */
+#define GSL_CONST_CGS_LUX (1e-4) /* cd sr / cm^2 */
+#define GSL_CONST_CGS_PHOT (1e0) /* cd sr / cm^2 */
+#define GSL_CONST_CGS_FOOTCANDLE (1.076e-3) /* cd sr / cm^2 */
+#define GSL_CONST_CGS_LAMBERT (1e0) /* cd sr / cm^2 */
+#define GSL_CONST_CGS_FOOTLAMBERT (1.07639104e-3) /* cd sr / cm^2 */
+#define GSL_CONST_CGS_CURIE (3.7e10) /* 1 / s */
+#define GSL_CONST_CGS_ROENTGEN (2.58e-7) /* A s / g */
+#define GSL_CONST_CGS_RAD (1e2) /* cm^2 / s^2 */
+#define GSL_CONST_CGS_SOLAR_MASS (1.98892e33) /* g */
+#define GSL_CONST_CGS_BOHR_RADIUS (5.291772083e-9) /* cm */
+#define GSL_CONST_CGS_NEWTON (1e5) /* cm g / s^2 */
+#define GSL_CONST_CGS_DYNE (1e0) /* cm g / s^2 */
+#define GSL_CONST_CGS_JOULE (1e7) /* g cm^2 / s^2 */
+#define GSL_CONST_CGS_ERG (1e0) /* g cm^2 / s^2 */
+#define GSL_CONST_CGS_STEFAN_BOLTZMANN_CONSTANT (5.67039934436e-5) /* g / K^4 s^3 */
+#define GSL_CONST_CGS_THOMSON_CROSS_SECTION (6.65245853542e-25) /* cm^2 */
+
+#endif /* __GSL_CONST_CGS__ */
diff --git a/gsl-1.9/const/gsl_const_cgsm.h b/gsl-1.9/const/gsl_const_cgsm.h
new file mode 100644
index 0000000..6c242d6
--- /dev/null
+++ b/gsl-1.9/const/gsl_const_cgsm.h
@@ -0,0 +1,123 @@
+/* const/gsl_const_cgsm.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+ * 2006 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_CONST_CGSM__
+#define __GSL_CONST_CGSM__
+
+#define GSL_CONST_CGSM_SPEED_OF_LIGHT (2.99792458e10) /* cm / s */
+#define GSL_CONST_CGSM_GRAVITATIONAL_CONSTANT (6.673e-8) /* cm^3 / g s^2 */
+#define GSL_CONST_CGSM_PLANCKS_CONSTANT_H (6.62606876e-27) /* g cm^2 / s */
+#define GSL_CONST_CGSM_PLANCKS_CONSTANT_HBAR (1.05457159642e-27) /* g cm^2 / s */
+#define GSL_CONST_CGSM_ASTRONOMICAL_UNIT (1.49597870691e13) /* cm */
+#define GSL_CONST_CGSM_LIGHT_YEAR (9.46053620707e17) /* cm */
+#define GSL_CONST_CGSM_PARSEC (3.08567758135e18) /* cm */
+#define GSL_CONST_CGSM_GRAV_ACCEL (9.80665e2) /* cm / s^2 */
+#define GSL_CONST_CGSM_ELECTRON_VOLT (1.602176462e-12) /* g cm^2 / s^2 */
+#define GSL_CONST_CGSM_MASS_ELECTRON (9.10938188e-28) /* g */
+#define GSL_CONST_CGSM_MASS_MUON (1.88353109e-25) /* g */
+#define GSL_CONST_CGSM_MASS_PROTON (1.67262158e-24) /* g */
+#define GSL_CONST_CGSM_MASS_NEUTRON (1.67492716e-24) /* g */
+#define GSL_CONST_CGSM_RYDBERG (2.17987190389e-11) /* g cm^2 / s^2 */
+#define GSL_CONST_CGSM_BOLTZMANN (1.3806503e-16) /* g cm^2 / K s^2 */
+#define GSL_CONST_CGSM_BOHR_MAGNETON (9.27400899e-21) /* abamp cm^2 */
+#define GSL_CONST_CGSM_NUCLEAR_MAGNETON (5.05078317e-24) /* abamp cm^2 */
+#define GSL_CONST_CGSM_ELECTRON_MAGNETIC_MOMENT (9.28476362e-21) /* abamp cm^2 */
+#define GSL_CONST_CGSM_PROTON_MAGNETIC_MOMENT (1.410606633e-23) /* abamp cm^2 */
+#define GSL_CONST_CGSM_MOLAR_GAS (8.314472e7) /* g cm^2 / K mol s^2 */
+#define GSL_CONST_CGSM_STANDARD_GAS_VOLUME (2.2710981e4) /* cm^3 / mol */
+#define GSL_CONST_CGSM_MINUTE (6e1) /* s */
+#define GSL_CONST_CGSM_HOUR (3.6e3) /* s */
+#define GSL_CONST_CGSM_DAY (8.64e4) /* s */
+#define GSL_CONST_CGSM_WEEK (6.048e5) /* s */
+#define GSL_CONST_CGSM_INCH (2.54e0) /* cm */
+#define GSL_CONST_CGSM_FOOT (3.048e1) /* cm */
+#define GSL_CONST_CGSM_YARD (9.144e1) /* cm */
+#define GSL_CONST_CGSM_MILE (1.609344e5) /* cm */
+#define GSL_CONST_CGSM_NAUTICAL_MILE (1.852e5) /* cm */
+#define GSL_CONST_CGSM_FATHOM (1.8288e2) /* cm */
+#define GSL_CONST_CGSM_MIL (2.54e-3) /* cm */
+#define GSL_CONST_CGSM_POINT (3.52777777778e-2) /* cm */
+#define GSL_CONST_CGSM_TEXPOINT (3.51459803515e-2) /* cm */
+#define GSL_CONST_CGSM_MICRON (1e-4) /* cm */
+#define GSL_CONST_CGSM_ANGSTROM (1e-8) /* cm */
+#define GSL_CONST_CGSM_HECTARE (1e8) /* cm^2 */
+#define GSL_CONST_CGSM_ACRE (4.04685642241e7) /* cm^2 */
+#define GSL_CONST_CGSM_BARN (1e-24) /* cm^2 */
+#define GSL_CONST_CGSM_LITER (1e3) /* cm^3 */
+#define GSL_CONST_CGSM_US_GALLON (3.78541178402e3) /* cm^3 */
+#define GSL_CONST_CGSM_QUART (9.46352946004e2) /* cm^3 */
+#define GSL_CONST_CGSM_PINT (4.73176473002e2) /* cm^3 */
+#define GSL_CONST_CGSM_CUP (2.36588236501e2) /* cm^3 */
+#define GSL_CONST_CGSM_FLUID_OUNCE (2.95735295626e1) /* cm^3 */
+#define GSL_CONST_CGSM_TABLESPOON (1.47867647813e1) /* cm^3 */
+#define GSL_CONST_CGSM_TEASPOON (4.92892159375e0) /* cm^3 */
+#define GSL_CONST_CGSM_CANADIAN_GALLON (4.54609e3) /* cm^3 */
+#define GSL_CONST_CGSM_UK_GALLON (4.546092e3) /* cm^3 */
+#define GSL_CONST_CGSM_MILES_PER_HOUR (4.4704e1) /* cm / s */
+#define GSL_CONST_CGSM_KILOMETERS_PER_HOUR (2.77777777778e1) /* cm / s */
+#define GSL_CONST_CGSM_KNOT (5.14444444444e1) /* cm / s */
+#define GSL_CONST_CGSM_POUND_MASS (4.5359237e2) /* g */
+#define GSL_CONST_CGSM_OUNCE_MASS (2.8349523125e1) /* g */
+#define GSL_CONST_CGSM_TON (9.0718474e5) /* g */
+#define GSL_CONST_CGSM_METRIC_TON (1e6) /* g */
+#define GSL_CONST_CGSM_UK_TON (1.0160469088e6) /* g */
+#define GSL_CONST_CGSM_TROY_OUNCE (3.1103475e1) /* g */
+#define GSL_CONST_CGSM_CARAT (2e-1) /* g */
+#define GSL_CONST_CGSM_UNIFIED_ATOMIC_MASS (1.66053873e-24) /* g */
+#define GSL_CONST_CGSM_GRAM_FORCE (9.80665e2) /* cm g / s^2 */
+#define GSL_CONST_CGSM_POUND_FORCE (4.44822161526e5) /* cm g / s^2 */
+#define GSL_CONST_CGSM_KILOPOUND_FORCE (4.44822161526e8) /* cm g / s^2 */
+#define GSL_CONST_CGSM_POUNDAL (1.38255e4) /* cm g / s^2 */
+#define GSL_CONST_CGSM_CALORIE (4.1868e7) /* g cm^2 / s^2 */
+#define GSL_CONST_CGSM_BTU (1.05505585262e10) /* g cm^2 / s^2 */
+#define GSL_CONST_CGSM_THERM (1.05506e15) /* g cm^2 / s^2 */
+#define GSL_CONST_CGSM_HORSEPOWER (7.457e9) /* g cm^2 / s^3 */
+#define GSL_CONST_CGSM_BAR (1e6) /* g / cm s^2 */
+#define GSL_CONST_CGSM_STD_ATMOSPHERE (1.01325e6) /* g / cm s^2 */
+#define GSL_CONST_CGSM_TORR (1.33322368421e3) /* g / cm s^2 */
+#define GSL_CONST_CGSM_METER_OF_MERCURY (1.33322368421e6) /* g / cm s^2 */
+#define GSL_CONST_CGSM_INCH_OF_MERCURY (3.38638815789e4) /* g / cm s^2 */
+#define GSL_CONST_CGSM_INCH_OF_WATER (2.490889e3) /* g / cm s^2 */
+#define GSL_CONST_CGSM_PSI (6.89475729317e4) /* g / cm s^2 */
+#define GSL_CONST_CGSM_POISE (1e0) /* g / cm s */
+#define GSL_CONST_CGSM_STOKES (1e0) /* cm^2 / s */
+#define GSL_CONST_CGSM_FARADAY (9.6485341472e3) /* abamp s / mol */
+#define GSL_CONST_CGSM_ELECTRON_CHARGE (1.602176462e-20) /* abamp s */
+#define GSL_CONST_CGSM_GAUSS (1e0) /* g / abamp s^2 */
+#define GSL_CONST_CGSM_STILB (1e0) /* cd / cm^2 */
+#define GSL_CONST_CGSM_LUMEN (1e0) /* cd sr */
+#define GSL_CONST_CGSM_LUX (1e-4) /* cd sr / cm^2 */
+#define GSL_CONST_CGSM_PHOT (1e0) /* cd sr / cm^2 */
+#define GSL_CONST_CGSM_FOOTCANDLE (1.076e-3) /* cd sr / cm^2 */
+#define GSL_CONST_CGSM_LAMBERT (1e0) /* cd sr / cm^2 */
+#define GSL_CONST_CGSM_FOOTLAMBERT (1.07639104e-3) /* cd sr / cm^2 */
+#define GSL_CONST_CGSM_CURIE (3.7e10) /* 1 / s */
+#define GSL_CONST_CGSM_ROENTGEN (2.58e-8) /* abamp s / g */
+#define GSL_CONST_CGSM_RAD (1e2) /* cm^2 / s^2 */
+#define GSL_CONST_CGSM_SOLAR_MASS (1.98892e33) /* g */
+#define GSL_CONST_CGSM_BOHR_RADIUS (5.291772083e-9) /* cm */
+#define GSL_CONST_CGSM_NEWTON (1e5) /* cm g / s^2 */
+#define GSL_CONST_CGSM_DYNE (1e0) /* cm g / s^2 */
+#define GSL_CONST_CGSM_JOULE (1e7) /* g cm^2 / s^2 */
+#define GSL_CONST_CGSM_ERG (1e0) /* g cm^2 / s^2 */
+#define GSL_CONST_CGSM_STEFAN_BOLTZMANN_CONSTANT (5.67039934436e-5) /* g / K^4 s^3 */
+#define GSL_CONST_CGSM_THOMSON_CROSS_SECTION (6.65245853542e-25) /* cm^2 */
+
+#endif /* __GSL_CONST_CGSM__ */
diff --git a/gsl-1.9/const/gsl_const_mks.h b/gsl-1.9/const/gsl_const_mks.h
new file mode 100644
index 0000000..f762a9c
--- /dev/null
+++ b/gsl-1.9/const/gsl_const_mks.h
@@ -0,0 +1,126 @@
+/* const/gsl_const_mks.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+ * 2006 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_CONST_MKS__
+#define __GSL_CONST_MKS__
+
+#define GSL_CONST_MKS_SPEED_OF_LIGHT (2.99792458e8) /* m / s */
+#define GSL_CONST_MKS_GRAVITATIONAL_CONSTANT (6.673e-11) /* m^3 / kg s^2 */
+#define GSL_CONST_MKS_PLANCKS_CONSTANT_H (6.62606876e-34) /* kg m^2 / s */
+#define GSL_CONST_MKS_PLANCKS_CONSTANT_HBAR (1.05457159642e-34) /* kg m^2 / s */
+#define GSL_CONST_MKS_ASTRONOMICAL_UNIT (1.49597870691e11) /* m */
+#define GSL_CONST_MKS_LIGHT_YEAR (9.46053620707e15) /* m */
+#define GSL_CONST_MKS_PARSEC (3.08567758135e16) /* m */
+#define GSL_CONST_MKS_GRAV_ACCEL (9.80665e0) /* m / s^2 */
+#define GSL_CONST_MKS_ELECTRON_VOLT (1.602176462e-19) /* kg m^2 / s^2 */
+#define GSL_CONST_MKS_MASS_ELECTRON (9.10938188e-31) /* kg */
+#define GSL_CONST_MKS_MASS_MUON (1.88353109e-28) /* kg */
+#define GSL_CONST_MKS_MASS_PROTON (1.67262158e-27) /* kg */
+#define GSL_CONST_MKS_MASS_NEUTRON (1.67492716e-27) /* kg */
+#define GSL_CONST_MKS_RYDBERG (2.17987190389e-18) /* kg m^2 / s^2 */
+#define GSL_CONST_MKS_BOLTZMANN (1.3806503e-23) /* kg m^2 / K s^2 */
+#define GSL_CONST_MKS_BOHR_MAGNETON (9.27400899e-24) /* A m^2 */
+#define GSL_CONST_MKS_NUCLEAR_MAGNETON (5.05078317e-27) /* A m^2 */
+#define GSL_CONST_MKS_ELECTRON_MAGNETIC_MOMENT (9.28476362e-24) /* A m^2 */
+#define GSL_CONST_MKS_PROTON_MAGNETIC_MOMENT (1.410606633e-26) /* A m^2 */
+#define GSL_CONST_MKS_MOLAR_GAS (8.314472e0) /* kg m^2 / K mol s^2 */
+#define GSL_CONST_MKS_STANDARD_GAS_VOLUME (2.2710981e-2) /* m^3 / mol */
+#define GSL_CONST_MKS_MINUTE (6e1) /* s */
+#define GSL_CONST_MKS_HOUR (3.6e3) /* s */
+#define GSL_CONST_MKS_DAY (8.64e4) /* s */
+#define GSL_CONST_MKS_WEEK (6.048e5) /* s */
+#define GSL_CONST_MKS_INCH (2.54e-2) /* m */
+#define GSL_CONST_MKS_FOOT (3.048e-1) /* m */
+#define GSL_CONST_MKS_YARD (9.144e-1) /* m */
+#define GSL_CONST_MKS_MILE (1.609344e3) /* m */
+#define GSL_CONST_MKS_NAUTICAL_MILE (1.852e3) /* m */
+#define GSL_CONST_MKS_FATHOM (1.8288e0) /* m */
+#define GSL_CONST_MKS_MIL (2.54e-5) /* m */
+#define GSL_CONST_MKS_POINT (3.52777777778e-4) /* m */
+#define GSL_CONST_MKS_TEXPOINT (3.51459803515e-4) /* m */
+#define GSL_CONST_MKS_MICRON (1e-6) /* m */
+#define GSL_CONST_MKS_ANGSTROM (1e-10) /* m */
+#define GSL_CONST_MKS_HECTARE (1e4) /* m^2 */
+#define GSL_CONST_MKS_ACRE (4.04685642241e3) /* m^2 */
+#define GSL_CONST_MKS_BARN (1e-28) /* m^2 */
+#define GSL_CONST_MKS_LITER (1e-3) /* m^3 */
+#define GSL_CONST_MKS_US_GALLON (3.78541178402e-3) /* m^3 */
+#define GSL_CONST_MKS_QUART (9.46352946004e-4) /* m^3 */
+#define GSL_CONST_MKS_PINT (4.73176473002e-4) /* m^3 */
+#define GSL_CONST_MKS_CUP (2.36588236501e-4) /* m^3 */
+#define GSL_CONST_MKS_FLUID_OUNCE (2.95735295626e-5) /* m^3 */
+#define GSL_CONST_MKS_TABLESPOON (1.47867647813e-5) /* m^3 */
+#define GSL_CONST_MKS_TEASPOON (4.92892159375e-6) /* m^3 */
+#define GSL_CONST_MKS_CANADIAN_GALLON (4.54609e-3) /* m^3 */
+#define GSL_CONST_MKS_UK_GALLON (4.546092e-3) /* m^3 */
+#define GSL_CONST_MKS_MILES_PER_HOUR (4.4704e-1) /* m / s */
+#define GSL_CONST_MKS_KILOMETERS_PER_HOUR (2.77777777778e-1) /* m / s */
+#define GSL_CONST_MKS_KNOT (5.14444444444e-1) /* m / s */
+#define GSL_CONST_MKS_POUND_MASS (4.5359237e-1) /* kg */
+#define GSL_CONST_MKS_OUNCE_MASS (2.8349523125e-2) /* kg */
+#define GSL_CONST_MKS_TON (9.0718474e2) /* kg */
+#define GSL_CONST_MKS_METRIC_TON (1e3) /* kg */
+#define GSL_CONST_MKS_UK_TON (1.0160469088e3) /* kg */
+#define GSL_CONST_MKS_TROY_OUNCE (3.1103475e-2) /* kg */
+#define GSL_CONST_MKS_CARAT (2e-4) /* kg */
+#define GSL_CONST_MKS_UNIFIED_ATOMIC_MASS (1.66053873e-27) /* kg */
+#define GSL_CONST_MKS_GRAM_FORCE (9.80665e-3) /* kg m / s^2 */
+#define GSL_CONST_MKS_POUND_FORCE (4.44822161526e0) /* kg m / s^2 */
+#define GSL_CONST_MKS_KILOPOUND_FORCE (4.44822161526e3) /* kg m / s^2 */
+#define GSL_CONST_MKS_POUNDAL (1.38255e-1) /* kg m / s^2 */
+#define GSL_CONST_MKS_CALORIE (4.1868e0) /* kg m^2 / s^2 */
+#define GSL_CONST_MKS_BTU (1.05505585262e3) /* kg m^2 / s^2 */
+#define GSL_CONST_MKS_THERM (1.05506e8) /* kg m^2 / s^2 */
+#define GSL_CONST_MKS_HORSEPOWER (7.457e2) /* kg m^2 / s^3 */
+#define GSL_CONST_MKS_BAR (1e5) /* kg / m s^2 */
+#define GSL_CONST_MKS_STD_ATMOSPHERE (1.01325e5) /* kg / m s^2 */
+#define GSL_CONST_MKS_TORR (1.33322368421e2) /* kg / m s^2 */
+#define GSL_CONST_MKS_METER_OF_MERCURY (1.33322368421e5) /* kg / m s^2 */
+#define GSL_CONST_MKS_INCH_OF_MERCURY (3.38638815789e3) /* kg / m s^2 */
+#define GSL_CONST_MKS_INCH_OF_WATER (2.490889e2) /* kg / m s^2 */
+#define GSL_CONST_MKS_PSI (6.89475729317e3) /* kg / m s^2 */
+#define GSL_CONST_MKS_POISE (1e-1) /* kg m^-1 s^-1 */
+#define GSL_CONST_MKS_STOKES (1e-4) /* m^2 / s */
+#define GSL_CONST_MKS_FARADAY (9.6485341472e4) /* A s / mol */
+#define GSL_CONST_MKS_ELECTRON_CHARGE (1.602176462e-19) /* A s */
+#define GSL_CONST_MKS_GAUSS (1e-4) /* kg / A s^2 */
+#define GSL_CONST_MKS_STILB (1e4) /* cd / m^2 */
+#define GSL_CONST_MKS_LUMEN (1e0) /* cd sr */
+#define GSL_CONST_MKS_LUX (1e0) /* cd sr / m^2 */
+#define GSL_CONST_MKS_PHOT (1e4) /* cd sr / m^2 */
+#define GSL_CONST_MKS_FOOTCANDLE (1.076e1) /* cd sr / m^2 */
+#define GSL_CONST_MKS_LAMBERT (1e4) /* cd sr / m^2 */
+#define GSL_CONST_MKS_FOOTLAMBERT (1.07639104e1) /* cd sr / m^2 */
+#define GSL_CONST_MKS_CURIE (3.7e10) /* 1 / s */
+#define GSL_CONST_MKS_ROENTGEN (2.58e-4) /* A s / kg */
+#define GSL_CONST_MKS_RAD (1e-2) /* m^2 / s^2 */
+#define GSL_CONST_MKS_SOLAR_MASS (1.98892e30) /* kg */
+#define GSL_CONST_MKS_BOHR_RADIUS (5.291772083e-11) /* m */
+#define GSL_CONST_MKS_NEWTON (1e0) /* kg m / s^2 */
+#define GSL_CONST_MKS_DYNE (1e-5) /* kg m / s^2 */
+#define GSL_CONST_MKS_JOULE (1e0) /* kg m^2 / s^2 */
+#define GSL_CONST_MKS_ERG (1e-7) /* kg m^2 / s^2 */
+#define GSL_CONST_MKS_STEFAN_BOLTZMANN_CONSTANT (5.67039934436e-8) /* kg / K^4 s^3 */
+#define GSL_CONST_MKS_THOMSON_CROSS_SECTION (6.65245853542e-29) /* m^2 */
+#define GSL_CONST_MKS_VACUUM_PERMITTIVITY (8.854187817e-12) /* A^2 s^4 / kg m^3 */
+#define GSL_CONST_MKS_VACUUM_PERMEABILITY (1.25663706144e-6) /* kg m / A^2 s^2 */
+#define GSL_CONST_MKS_DEBYE (3.33564095198e-30) /* A s^2 / m^2 */
+
+#endif /* __GSL_CONST_MKS__ */
diff --git a/gsl-1.9/const/gsl_const_mksa.h b/gsl-1.9/const/gsl_const_mksa.h
new file mode 100644
index 0000000..f084f29
--- /dev/null
+++ b/gsl-1.9/const/gsl_const_mksa.h
@@ -0,0 +1,126 @@
+/* const/gsl_const_mksa.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+ * 2006 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_CONST_MKSA__
+#define __GSL_CONST_MKSA__
+
+#define GSL_CONST_MKSA_SPEED_OF_LIGHT (2.99792458e8) /* m / s */
+#define GSL_CONST_MKSA_GRAVITATIONAL_CONSTANT (6.673e-11) /* m^3 / kg s^2 */
+#define GSL_CONST_MKSA_PLANCKS_CONSTANT_H (6.62606876e-34) /* kg m^2 / s */
+#define GSL_CONST_MKSA_PLANCKS_CONSTANT_HBAR (1.05457159642e-34) /* kg m^2 / s */
+#define GSL_CONST_MKSA_ASTRONOMICAL_UNIT (1.49597870691e11) /* m */
+#define GSL_CONST_MKSA_LIGHT_YEAR (9.46053620707e15) /* m */
+#define GSL_CONST_MKSA_PARSEC (3.08567758135e16) /* m */
+#define GSL_CONST_MKSA_GRAV_ACCEL (9.80665e0) /* m / s^2 */
+#define GSL_CONST_MKSA_ELECTRON_VOLT (1.602176462e-19) /* kg m^2 / s^2 */
+#define GSL_CONST_MKSA_MASS_ELECTRON (9.10938188e-31) /* kg */
+#define GSL_CONST_MKSA_MASS_MUON (1.88353109e-28) /* kg */
+#define GSL_CONST_MKSA_MASS_PROTON (1.67262158e-27) /* kg */
+#define GSL_CONST_MKSA_MASS_NEUTRON (1.67492716e-27) /* kg */
+#define GSL_CONST_MKSA_RYDBERG (2.17987190389e-18) /* kg m^2 / s^2 */
+#define GSL_CONST_MKSA_BOLTZMANN (1.3806503e-23) /* kg m^2 / K s^2 */
+#define GSL_CONST_MKSA_BOHR_MAGNETON (9.27400899e-24) /* A m^2 */
+#define GSL_CONST_MKSA_NUCLEAR_MAGNETON (5.05078317e-27) /* A m^2 */
+#define GSL_CONST_MKSA_ELECTRON_MAGNETIC_MOMENT (9.28476362e-24) /* A m^2 */
+#define GSL_CONST_MKSA_PROTON_MAGNETIC_MOMENT (1.410606633e-26) /* A m^2 */
+#define GSL_CONST_MKSA_MOLAR_GAS (8.314472e0) /* kg m^2 / K mol s^2 */
+#define GSL_CONST_MKSA_STANDARD_GAS_VOLUME (2.2710981e-2) /* m^3 / mol */
+#define GSL_CONST_MKSA_MINUTE (6e1) /* s */
+#define GSL_CONST_MKSA_HOUR (3.6e3) /* s */
+#define GSL_CONST_MKSA_DAY (8.64e4) /* s */
+#define GSL_CONST_MKSA_WEEK (6.048e5) /* s */
+#define GSL_CONST_MKSA_INCH (2.54e-2) /* m */
+#define GSL_CONST_MKSA_FOOT (3.048e-1) /* m */
+#define GSL_CONST_MKSA_YARD (9.144e-1) /* m */
+#define GSL_CONST_MKSA_MILE (1.609344e3) /* m */
+#define GSL_CONST_MKSA_NAUTICAL_MILE (1.852e3) /* m */
+#define GSL_CONST_MKSA_FATHOM (1.8288e0) /* m */
+#define GSL_CONST_MKSA_MIL (2.54e-5) /* m */
+#define GSL_CONST_MKSA_POINT (3.52777777778e-4) /* m */
+#define GSL_CONST_MKSA_TEXPOINT (3.51459803515e-4) /* m */
+#define GSL_CONST_MKSA_MICRON (1e-6) /* m */
+#define GSL_CONST_MKSA_ANGSTROM (1e-10) /* m */
+#define GSL_CONST_MKSA_HECTARE (1e4) /* m^2 */
+#define GSL_CONST_MKSA_ACRE (4.04685642241e3) /* m^2 */
+#define GSL_CONST_MKSA_BARN (1e-28) /* m^2 */
+#define GSL_CONST_MKSA_LITER (1e-3) /* m^3 */
+#define GSL_CONST_MKSA_US_GALLON (3.78541178402e-3) /* m^3 */
+#define GSL_CONST_MKSA_QUART (9.46352946004e-4) /* m^3 */
+#define GSL_CONST_MKSA_PINT (4.73176473002e-4) /* m^3 */
+#define GSL_CONST_MKSA_CUP (2.36588236501e-4) /* m^3 */
+#define GSL_CONST_MKSA_FLUID_OUNCE (2.95735295626e-5) /* m^3 */
+#define GSL_CONST_MKSA_TABLESPOON (1.47867647813e-5) /* m^3 */
+#define GSL_CONST_MKSA_TEASPOON (4.92892159375e-6) /* m^3 */
+#define GSL_CONST_MKSA_CANADIAN_GALLON (4.54609e-3) /* m^3 */
+#define GSL_CONST_MKSA_UK_GALLON (4.546092e-3) /* m^3 */
+#define GSL_CONST_MKSA_MILES_PER_HOUR (4.4704e-1) /* m / s */
+#define GSL_CONST_MKSA_KILOMETERS_PER_HOUR (2.77777777778e-1) /* m / s */
+#define GSL_CONST_MKSA_KNOT (5.14444444444e-1) /* m / s */
+#define GSL_CONST_MKSA_POUND_MASS (4.5359237e-1) /* kg */
+#define GSL_CONST_MKSA_OUNCE_MASS (2.8349523125e-2) /* kg */
+#define GSL_CONST_MKSA_TON (9.0718474e2) /* kg */
+#define GSL_CONST_MKSA_METRIC_TON (1e3) /* kg */
+#define GSL_CONST_MKSA_UK_TON (1.0160469088e3) /* kg */
+#define GSL_CONST_MKSA_TROY_OUNCE (3.1103475e-2) /* kg */
+#define GSL_CONST_MKSA_CARAT (2e-4) /* kg */
+#define GSL_CONST_MKSA_UNIFIED_ATOMIC_MASS (1.66053873e-27) /* kg */
+#define GSL_CONST_MKSA_GRAM_FORCE (9.80665e-3) /* kg m / s^2 */
+#define GSL_CONST_MKSA_POUND_FORCE (4.44822161526e0) /* kg m / s^2 */
+#define GSL_CONST_MKSA_KILOPOUND_FORCE (4.44822161526e3) /* kg m / s^2 */
+#define GSL_CONST_MKSA_POUNDAL (1.38255e-1) /* kg m / s^2 */
+#define GSL_CONST_MKSA_CALORIE (4.1868e0) /* kg m^2 / s^2 */
+#define GSL_CONST_MKSA_BTU (1.05505585262e3) /* kg m^2 / s^2 */
+#define GSL_CONST_MKSA_THERM (1.05506e8) /* kg m^2 / s^2 */
+#define GSL_CONST_MKSA_HORSEPOWER (7.457e2) /* kg m^2 / s^3 */
+#define GSL_CONST_MKSA_BAR (1e5) /* kg / m s^2 */
+#define GSL_CONST_MKSA_STD_ATMOSPHERE (1.01325e5) /* kg / m s^2 */
+#define GSL_CONST_MKSA_TORR (1.33322368421e2) /* kg / m s^2 */
+#define GSL_CONST_MKSA_METER_OF_MERCURY (1.33322368421e5) /* kg / m s^2 */
+#define GSL_CONST_MKSA_INCH_OF_MERCURY (3.38638815789e3) /* kg / m s^2 */
+#define GSL_CONST_MKSA_INCH_OF_WATER (2.490889e2) /* kg / m s^2 */
+#define GSL_CONST_MKSA_PSI (6.89475729317e3) /* kg / m s^2 */
+#define GSL_CONST_MKSA_POISE (1e-1) /* kg m^-1 s^-1 */
+#define GSL_CONST_MKSA_STOKES (1e-4) /* m^2 / s */
+#define GSL_CONST_MKSA_FARADAY (9.6485341472e4) /* A s / mol */
+#define GSL_CONST_MKSA_ELECTRON_CHARGE (1.602176462e-19) /* A s */
+#define GSL_CONST_MKSA_GAUSS (1e-4) /* kg / A s^2 */
+#define GSL_CONST_MKSA_STILB (1e4) /* cd / m^2 */
+#define GSL_CONST_MKSA_LUMEN (1e0) /* cd sr */
+#define GSL_CONST_MKSA_LUX (1e0) /* cd sr / m^2 */
+#define GSL_CONST_MKSA_PHOT (1e4) /* cd sr / m^2 */
+#define GSL_CONST_MKSA_FOOTCANDLE (1.076e1) /* cd sr / m^2 */
+#define GSL_CONST_MKSA_LAMBERT (1e4) /* cd sr / m^2 */
+#define GSL_CONST_MKSA_FOOTLAMBERT (1.07639104e1) /* cd sr / m^2 */
+#define GSL_CONST_MKSA_CURIE (3.7e10) /* 1 / s */
+#define GSL_CONST_MKSA_ROENTGEN (2.58e-4) /* A s / kg */
+#define GSL_CONST_MKSA_RAD (1e-2) /* m^2 / s^2 */
+#define GSL_CONST_MKSA_SOLAR_MASS (1.98892e30) /* kg */
+#define GSL_CONST_MKSA_BOHR_RADIUS (5.291772083e-11) /* m */
+#define GSL_CONST_MKSA_NEWTON (1e0) /* kg m / s^2 */
+#define GSL_CONST_MKSA_DYNE (1e-5) /* kg m / s^2 */
+#define GSL_CONST_MKSA_JOULE (1e0) /* kg m^2 / s^2 */
+#define GSL_CONST_MKSA_ERG (1e-7) /* kg m^2 / s^2 */
+#define GSL_CONST_MKSA_STEFAN_BOLTZMANN_CONSTANT (5.67039934436e-8) /* kg / K^4 s^3 */
+#define GSL_CONST_MKSA_THOMSON_CROSS_SECTION (6.65245853542e-29) /* m^2 */
+#define GSL_CONST_MKSA_VACUUM_PERMITTIVITY (8.854187817e-12) /* A^2 s^4 / kg m^3 */
+#define GSL_CONST_MKSA_VACUUM_PERMEABILITY (1.25663706144e-6) /* kg m / A^2 s^2 */
+#define GSL_CONST_MKSA_DEBYE (3.33564095198e-30) /* A s^2 / m^2 */
+
+#endif /* __GSL_CONST_MKSA__ */
diff --git a/gsl-1.9/const/gsl_const_num.h b/gsl-1.9/const/gsl_const_num.h
new file mode 100644
index 0000000..13a3af1
--- /dev/null
+++ b/gsl-1.9/const/gsl_const_num.h
@@ -0,0 +1,43 @@
+/* const/gsl_const_num.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+ * 2006 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_CONST_NUM__
+#define __GSL_CONST_NUM__
+
+#define GSL_CONST_NUM_FINE_STRUCTURE (7.297352533e-3) /* 1 */
+#define GSL_CONST_NUM_AVOGADRO (6.02214199e23) /* 1 / mol */
+#define GSL_CONST_NUM_YOTTA (1e24) /* 1 */
+#define GSL_CONST_NUM_ZETTA (1e21) /* 1 */
+#define GSL_CONST_NUM_EXA (1e18) /* 1 */
+#define GSL_CONST_NUM_PETA (1e15) /* 1 */
+#define GSL_CONST_NUM_TERA (1e12) /* 1 */
+#define GSL_CONST_NUM_GIGA (1e9) /* 1 */
+#define GSL_CONST_NUM_MEGA (1e6) /* 1 */
+#define GSL_CONST_NUM_KILO (1e3) /* 1 */
+#define GSL_CONST_NUM_MILLI (1e-3) /* 1 */
+#define GSL_CONST_NUM_MICRO (1e-6) /* 1 */
+#define GSL_CONST_NUM_NANO (1e-9) /* 1 */
+#define GSL_CONST_NUM_PICO (1e-12) /* 1 */
+#define GSL_CONST_NUM_FEMTO (1e-15) /* 1 */
+#define GSL_CONST_NUM_ATTO (1e-18) /* 1 */
+#define GSL_CONST_NUM_ZEPTO (1e-21) /* 1 */
+#define GSL_CONST_NUM_YOCTO (1e-24) /* 1 */
+
+#endif /* __GSL_CONST_NUM__ */
diff --git a/gsl-1.9/const/test.c b/gsl-1.9/const/test.c
new file mode 100644
index 0000000..836980f
--- /dev/null
+++ b/gsl-1.9/const/test.c
@@ -0,0 +1,97 @@
+/* const/test.c
+ *
+ * Copyright (C) 2003 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_const.h>
+#include <gsl/gsl_test.h>
+
+#include <gsl/gsl_ieee_utils.h>
+
+int
+main (void)
+{
+ gsl_ieee_env_setup ();
+
+ /* Basic check to make sure the header files are functioning */
+
+ {
+ double c = GSL_CONST_MKS_SPEED_OF_LIGHT;
+ double eps = GSL_CONST_MKS_VACUUM_PERMITTIVITY;
+ double mu = GSL_CONST_MKS_VACUUM_PERMEABILITY;
+
+ gsl_test_rel (c, 1.0/sqrt(eps*mu), 1e-6, "speed of light (mks)");
+ }
+
+ {
+ double ly = GSL_CONST_CGS_LIGHT_YEAR;
+ double c = GSL_CONST_CGS_SPEED_OF_LIGHT;
+ double y = 365.2425 * GSL_CONST_CGS_DAY;
+
+ gsl_test_rel (ly, c * y, 1e-6, "light year (cgs)");
+ }
+
+ {
+ double c = GSL_CONST_MKSA_SPEED_OF_LIGHT;
+ double eps = GSL_CONST_MKSA_VACUUM_PERMITTIVITY;
+ double mu = GSL_CONST_MKSA_VACUUM_PERMEABILITY;
+
+ gsl_test_rel (c, 1.0/sqrt(eps*mu), 1e-6, "speed of light (mksa)");
+ }
+
+ {
+ double ly = GSL_CONST_CGSM_LIGHT_YEAR;
+ double c = GSL_CONST_CGSM_SPEED_OF_LIGHT;
+ double y = 365.2425 * GSL_CONST_CGSM_DAY;
+
+ gsl_test_rel (ly, c * y, 1e-6, "light year (cgsm)");
+ }
+
+ {
+ double micro = GSL_CONST_NUM_MICRO;
+ double mega = GSL_CONST_NUM_MEGA;
+ double kilo = GSL_CONST_NUM_KILO;
+
+ gsl_test_rel (mega/kilo, 1/(micro*kilo), 1e-10, "kilo (mega/kilo, 1/(micro*kilo))");
+ }
+
+ {
+ double d = GSL_CONST_MKSA_DEBYE;
+ double c = GSL_CONST_MKSA_SPEED_OF_LIGHT;
+ double desu = d * c * 1000.0;
+
+ gsl_test_rel (desu, 1e-18, 1e-10, "debye (esu)");
+ }
+
+ {
+ double k = GSL_CONST_MKSA_BOLTZMANN;
+ double c = GSL_CONST_MKSA_SPEED_OF_LIGHT;
+ double h = GSL_CONST_MKSA_PLANCKS_CONSTANT_H;
+ double s = 2 * pow(M_PI, 5.0) * pow(k, 4.0) / (15 * pow(c, 2.0) * pow(h, 3.0));
+ double sigma = GSL_CONST_MKSA_STEFAN_BOLTZMANN_CONSTANT;
+
+ gsl_test_rel(s, sigma, 1e-10, "stefan boltzmann constant");
+ }
+
+
+ exit (gsl_test_summary ());
+}
+
diff --git a/gsl-1.9/deriv/ChangeLog b/gsl-1.9/deriv/ChangeLog
new file mode 100644
index 0000000..5e0f84f
--- /dev/null
+++ b/gsl-1.9/deriv/ChangeLog
@@ -0,0 +1,4 @@
+2004-03-06 Brian Gough <bjg@network-theory.co.uk>
+
+ * reworking API of gsl_diff
+
diff --git a/gsl-1.9/deriv/Makefile.am b/gsl-1.9/deriv/Makefile.am
new file mode 100644
index 0000000..fcf3928
--- /dev/null
+++ b/gsl-1.9/deriv/Makefile.am
@@ -0,0 +1,16 @@
+noinst_LTLIBRARIES = libgslderiv.la
+
+INCLUDES= -I$(top_builddir)
+
+libgslderiv_la_SOURCES = deriv.c
+
+pkginclude_HEADERS = gsl_deriv.h
+
+TESTS = $(check_PROGRAMS)
+check_PROGRAMS = test #demo
+
+test_SOURCES = test.c
+test_LDADD = libgslderiv.la ../vector/libgslvector.la ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la
+
+#demo_SOURCES = demo.c
+#demo_LDADD = libgslderiv.la ../vector/libgslvector.la ../block/libgslblock.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la
diff --git a/gsl-1.9/deriv/Makefile.in b/gsl-1.9/deriv/Makefile.in
new file mode 100644
index 0000000..f92a7a7
--- /dev/null
+++ b/gsl-1.9/deriv/Makefile.in
@@ -0,0 +1,546 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = test$(EXEEXT)
+subdir = deriv
+DIST_COMMON = $(pkginclude_HEADERS) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in ChangeLog
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgslderiv_la_LIBADD =
+am_libgslderiv_la_OBJECTS = deriv.lo
+libgslderiv_la_OBJECTS = $(am_libgslderiv_la_OBJECTS)
+am_test_OBJECTS = test.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = libgslderiv.la ../vector/libgslvector.la \
+ ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la \
+ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgslderiv_la_SOURCES) $(test_SOURCES)
+DIST_SOURCES = $(libgslderiv_la_SOURCES) $(test_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libgslderiv.la
+INCLUDES = -I$(top_builddir)
+libgslderiv_la_SOURCES = deriv.c
+pkginclude_HEADERS = gsl_deriv.h
+TESTS = $(check_PROGRAMS)
+test_SOURCES = test.c
+test_LDADD = libgslderiv.la ../vector/libgslvector.la ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps deriv/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps deriv/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgslderiv.la: $(libgslderiv_la_OBJECTS) $(libgslderiv_la_DEPENDENCIES)
+ $(LINK) $(libgslderiv_la_LDFLAGS) $(libgslderiv_la_OBJECTS) $(libgslderiv_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkgincludeHEADERS
+
+
+#demo_SOURCES = demo.c
+#demo_LDADD = libgslderiv.la ../vector/libgslvector.la ../block/libgslblock.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/deriv/deriv.c b/gsl-1.9/deriv/deriv.c
new file mode 100644
index 0000000..5d31a95
--- /dev/null
+++ b/gsl-1.9/deriv/deriv.c
@@ -0,0 +1,174 @@
+/* deriv/deriv.c
+ *
+ * Copyright (C) 2004 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_deriv.h>
+
+static void
+central_deriv (const gsl_function * f, double x, double h,
+ double *result, double *abserr_round, double *abserr_trunc)
+{
+ /* Compute the derivative using the 5-point rule (x-h, x-h/2, x,
+ x+h/2, x+h). Note that the central point is not used.
+
+ Compute the error using the difference between the 5-point and
+ the 3-point rule (x-h,x,x+h). Again the central point is not
+ used. */
+
+ double fm1 = GSL_FN_EVAL (f, x - h);
+ double fp1 = GSL_FN_EVAL (f, x + h);
+
+ double fmh = GSL_FN_EVAL (f, x - h / 2);
+ double fph = GSL_FN_EVAL (f, x + h / 2);
+
+ double r3 = 0.5 * (fp1 - fm1);
+ double r5 = (4.0 / 3.0) * (fph - fmh) - (1.0 / 3.0) * r3;
+
+ double e3 = (fabs (fp1) + fabs (fm1)) * GSL_DBL_EPSILON;
+ double e5 = 2.0 * (fabs (fph) + fabs (fmh)) * GSL_DBL_EPSILON + e3;
+
+ double dy = GSL_MAX (fabs (r3), fabs (r5)) * fabs (x) * GSL_DBL_EPSILON;
+
+ /* The truncation error in the r5 approximation itself is O(h^4).
+ However, for safety, we estimate the error from r5-r3, which is
+ O(h^2). By scaling h we will minimise this estimated error, not
+ the actual truncation error in r5. */
+
+ *result = r5 / h;
+ *abserr_trunc = fabs ((r5 - r3) / h); /* Estimated truncation error O(h^2) */
+ *abserr_round = fabs (e5 / h) + dy; /* Rounding error (cancellations) */
+}
+
+int
+gsl_deriv_central (const gsl_function * f, double x, double h,
+ double *result, double *abserr)
+{
+ double r_0, round, trunc, error;
+ central_deriv (f, x, h, &r_0, &round, &trunc);
+ error = round + trunc;
+
+ if (round < trunc && (round > 0 && trunc > 0))
+ {
+ double r_opt, round_opt, trunc_opt, error_opt;
+
+ /* Compute an optimised stepsize to minimize the total error,
+ using the scaling of the truncation error (O(h^2)) and
+ rounding error (O(1/h)). */
+
+ double h_opt = h * pow (round / (2.0 * trunc), 1.0 / 3.0);
+ central_deriv (f, x, h_opt, &r_opt, &round_opt, &trunc_opt);
+ error_opt = round_opt + trunc_opt;
+
+ /* Check that the new error is smaller, and that the new derivative
+ is consistent with the error bounds of the original estimate. */
+
+ if (error_opt < error && fabs (r_opt - r_0) < 4.0 * error)
+ {
+ r_0 = r_opt;
+ error = error_opt;
+ }
+ }
+
+ *result = r_0;
+ *abserr = error;
+
+ return GSL_SUCCESS;
+}
+
+
+static void
+forward_deriv (const gsl_function * f, double x, double h,
+ double *result, double *abserr_round, double *abserr_trunc)
+{
+ /* Compute the derivative using the 4-point rule (x+h/4, x+h/2,
+ x+3h/4, x+h).
+
+ Compute the error using the difference between the 4-point and
+ the 2-point rule (x+h/2,x+h). */
+
+ double f1 = GSL_FN_EVAL (f, x + h / 4.0);
+ double f2 = GSL_FN_EVAL (f, x + h / 2.0);
+ double f3 = GSL_FN_EVAL (f, x + (3.0 / 4.0) * h);
+ double f4 = GSL_FN_EVAL (f, x + h);
+
+ double r2 = 2.0*(f4 - f2);
+ double r4 = (22.0 / 3.0) * (f4 - f3) - (62.0 / 3.0) * (f3 - f2) +
+ (52.0 / 3.0) * (f2 - f1);
+
+ /* Estimate the rounding error for r4 */
+
+ double e4 = 2 * 20.67 * (fabs (f4) + fabs (f3) + fabs (f2) + fabs (f1)) * GSL_DBL_EPSILON;
+
+ double dy = GSL_MAX (fabs (r2), fabs (r4)) * fabs (x) * GSL_DBL_EPSILON;
+
+ /* The truncation error in the r4 approximation itself is O(h^3).
+ However, for safety, we estimate the error from r4-r2, which is
+ O(h). By scaling h we will minimise this estimated error, not
+ the actual truncation error in r4. */
+
+ *result = r4 / h;
+ *abserr_trunc = fabs ((r4 - r2) / h); /* Estimated truncation error O(h) */
+ *abserr_round = fabs (e4 / h) + dy;
+}
+
+int
+gsl_deriv_forward (const gsl_function * f, double x, double h,
+ double *result, double *abserr)
+{
+ double r_0, round, trunc, error;
+ forward_deriv (f, x, h, &r_0, &round, &trunc);
+ error = round + trunc;
+
+ if (round < trunc && (round > 0 && trunc > 0))
+ {
+ double r_opt, round_opt, trunc_opt, error_opt;
+
+ /* Compute an optimised stepsize to minimize the total error,
+ using the scaling of the estimated truncation error (O(h)) and
+ rounding error (O(1/h)). */
+
+ double h_opt = h * pow (round / (trunc), 1.0 / 2.0);
+ forward_deriv (f, x, h_opt, &r_opt, &round_opt, &trunc_opt);
+ error_opt = round_opt + trunc_opt;
+
+ /* Check that the new error is smaller, and that the new derivative
+ is consistent with the error bounds of the original estimate. */
+
+ if (error_opt < error && fabs (r_opt - r_0) < 4.0 * error)
+ {
+ r_0 = r_opt;
+ error = error_opt;
+ }
+ }
+
+ *result = r_0;
+ *abserr = error;
+
+ return GSL_SUCCESS;
+}
+
+int
+gsl_deriv_backward (const gsl_function * f, double x, double h,
+ double *result, double *abserr)
+{
+ return gsl_deriv_forward (f, x, -h, result, abserr);
+}
diff --git a/gsl-1.9/deriv/gsl_deriv.h b/gsl-1.9/deriv/gsl_deriv.h
new file mode 100644
index 0000000..f48666a
--- /dev/null
+++ b/gsl-1.9/deriv/gsl_deriv.h
@@ -0,0 +1,50 @@
+/* deriv/gsl_deriv.h
+ *
+ * Copyright (C) 2000 David Morrison
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_DERIV_H__
+#define __GSL_DERIV_H__
+#include <gsl/gsl_math.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+int gsl_deriv_central (const gsl_function *f,
+ double x, double h,
+ double *result, double *abserr);
+
+int gsl_deriv_backward (const gsl_function *f,
+ double x, double h,
+ double *result, double *abserr);
+
+int gsl_deriv_forward (const gsl_function *f,
+ double x, double h,
+ double *result, double *abserr);
+
+__END_DECLS
+
+#endif /* __GSL_DERIV_H__ */
diff --git a/gsl-1.9/deriv/test.c b/gsl-1.9/deriv/test.c
new file mode 100644
index 0000000..42463d3
--- /dev/null
+++ b/gsl-1.9/deriv/test.c
@@ -0,0 +1,209 @@
+/* deriv/test.c
+ *
+ * Copyright (C) 2000 David Morrison
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_deriv.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+
+double
+f1 (double x, void *params)
+{
+ return exp (x);
+}
+
+double
+df1 (double x, void *params)
+{
+ return exp (x);
+}
+
+double
+f2 (double x, void *params)
+{
+ if (x >= 0.0)
+ {
+ return x * sqrt (x);
+ }
+ else
+ {
+ return 0.0;
+ }
+}
+
+double
+df2 (double x, void *params)
+{
+ if (x >= 0.0)
+ {
+ return 1.5 * sqrt (x);
+ }
+ else
+ {
+ return 0.0;
+ }
+}
+
+double
+f3 (double x, void *params)
+{
+ if (x != 0.0)
+ {
+ return sin (1 / x);
+ }
+ else
+ {
+ return 0.0;
+ }
+}
+
+double
+df3 (double x, void *params)
+{
+ if (x != 0.0)
+ {
+ return -cos (1 / x) / (x * x);
+ }
+ else
+ {
+ return 0.0;
+ }
+}
+
+double
+f4 (double x, void *params)
+{
+ return exp (-x * x);
+}
+
+double
+df4 (double x, void *params)
+{
+ return -2.0 * x * exp (-x * x);
+}
+
+double
+f5 (double x, void *params)
+{
+ return x * x;
+}
+
+double
+df5 (double x, void *params)
+{
+ return 2.0 * x;
+}
+
+double
+f6 (double x, void *params)
+{
+ return 1.0 / x;
+}
+
+double
+df6 (double x, void *params)
+{
+ return -1.0 / (x * x);
+}
+
+typedef int (deriv_fn) (const gsl_function * f, double x, double h, double * res, double *abserr);
+
+void
+test (deriv_fn * deriv, gsl_function * f, gsl_function * df, double x,
+ const char * desc)
+{
+ double result, abserr;
+ double expected = GSL_FN_EVAL (df, x);
+ (*deriv) (f, x, 1e-4, &result, &abserr);
+
+ gsl_test_abs (result, expected, GSL_MIN(1e-4,fabs(expected)) + GSL_DBL_EPSILON, desc);
+
+ if (abserr < fabs(result-expected))
+ {
+ gsl_test_factor (abserr, fabs(result-expected), 2, "%s error estimate", desc);
+ }
+ else if (result == expected || expected == 0.0)
+ {
+ gsl_test_abs (abserr, 0.0, 1e-6, "%s abserr", desc);
+ }
+ else
+ {
+ double d = fabs(result - expected);
+ gsl_test_abs (abserr, fabs(result-expected), 1e6*d, "%s abserr", desc);
+ }
+}
+
+int
+main ()
+{
+ gsl_function F1, DF1, F2, DF2, F3, DF3, F4, DF4, F5, DF5, F6, DF6;
+
+ gsl_ieee_env_setup ();
+
+ F1.function = &f1;
+ DF1.function = &df1;
+
+ F2.function = &f2;
+ DF2.function = &df2;
+
+ F3.function = &f3;
+ DF3.function = &df3;
+
+ F4.function = &f4;
+ DF4.function = &df4;
+
+ F5.function = &f5;
+ DF5.function = &df5;
+
+ F6.function = &f6;
+ DF6.function = &df6;
+
+ test (&gsl_deriv_central, &F1, &DF1, 1.0, "exp(x), x=1, central deriv");
+ test (&gsl_deriv_forward, &F1, &DF1, 1.0, "exp(x), x=1, forward deriv");
+ test (&gsl_deriv_backward, &F1, &DF1, 1.0, "exp(x), x=1, backward deriv");
+
+ test (&gsl_deriv_central, &F2, &DF2, 0.1, "x^(3/2), x=0.1, central deriv");
+ test (&gsl_deriv_forward, &F2, &DF2, 0.1, "x^(3/2), x=0.1, forward deriv");
+ test (&gsl_deriv_backward, &F2, &DF2, 0.1, "x^(3/2), x=0.1, backward deriv");
+
+ test (&gsl_deriv_central, &F3, &DF3, 0.45, "sin(1/x), x=0.45, central deriv");
+ test (&gsl_deriv_forward, &F3, &DF3, 0.45, "sin(1/x), x=0.45, forward deriv");
+ test (&gsl_deriv_backward, &F3, &DF3, 0.45, "sin(1/x), x=0.45, backward deriv");
+
+ test (&gsl_deriv_central, &F4, &DF4, 0.5, "exp(-x^2), x=0.5, central deriv");
+ test (&gsl_deriv_forward, &F4, &DF4, 0.5, "exp(-x^2), x=0.5, forward deriv");
+ test (&gsl_deriv_backward, &F4, &DF4, 0.5, "exp(-x^2), x=0.5, backward deriv");
+
+ test (&gsl_deriv_central, &F5, &DF5, 0.0, "x^2, x=0, central deriv");
+ test (&gsl_deriv_forward, &F5, &DF5, 0.0, "x^2, x=0, forward deriv");
+ test (&gsl_deriv_backward, &F5, &DF5, 0.0, "x^2, x=0, backward deriv");
+
+ test (&gsl_deriv_central, &F6, &DF6, 10.0, "1/x, x=10, central deriv");
+ test (&gsl_deriv_forward, &F6, &DF6, 10.0, "1/x, x=10, forward deriv");
+ test (&gsl_deriv_backward, &F6, &DF6, 10.0, "1/x, x=10, backward deriv");
+
+ exit (gsl_test_summary ());
+}
+
+
diff --git a/gsl-1.9/dht/ChangeLog b/gsl-1.9/dht/ChangeLog
new file mode 100644
index 0000000..3c7c199
--- /dev/null
+++ b/gsl-1.9/dht/ChangeLog
@@ -0,0 +1,6 @@
+Mon Apr 23 10:31:58 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * unified error handling conventions to _e for error handling
+ functions and no suffix for plain functions, so _impl functions
+ are no longer needed.
+
diff --git a/gsl-1.9/dht/Makefile.am b/gsl-1.9/dht/Makefile.am
new file mode 100644
index 0000000..a8ce8b4
--- /dev/null
+++ b/gsl-1.9/dht/Makefile.am
@@ -0,0 +1,15 @@
+noinst_LTLIBRARIES = libgsldht.la
+
+pkginclude_HEADERS = gsl_dht.h
+
+INCLUDES= -I$(top_builddir)
+
+TESTS = $(check_PROGRAMS)
+
+check_PROGRAMS = test
+
+test_LDADD = libgsldht.la ../specfunc/libgslspecfunc.la ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+
+test_SOURCES = test.c
+
+libgsldht_la_SOURCES = dht.c
diff --git a/gsl-1.9/dht/Makefile.in b/gsl-1.9/dht/Makefile.in
new file mode 100644
index 0000000..d89c248
--- /dev/null
+++ b/gsl-1.9/dht/Makefile.in
@@ -0,0 +1,544 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = test$(EXEEXT)
+subdir = dht
+DIST_COMMON = $(pkginclude_HEADERS) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in ChangeLog
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgsldht_la_LIBADD =
+am_libgsldht_la_OBJECTS = dht.lo
+libgsldht_la_OBJECTS = $(am_libgsldht_la_OBJECTS)
+am_test_OBJECTS = test.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = libgsldht.la ../specfunc/libgslspecfunc.la \
+ ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la \
+ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \
+ ../utils/libutils.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgsldht_la_SOURCES) $(test_SOURCES)
+DIST_SOURCES = $(libgsldht_la_SOURCES) $(test_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libgsldht.la
+pkginclude_HEADERS = gsl_dht.h
+INCLUDES = -I$(top_builddir)
+TESTS = $(check_PROGRAMS)
+test_LDADD = libgsldht.la ../specfunc/libgslspecfunc.la ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+test_SOURCES = test.c
+libgsldht_la_SOURCES = dht.c
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps dht/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps dht/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgsldht.la: $(libgsldht_la_OBJECTS) $(libgsldht_la_DEPENDENCIES)
+ $(LINK) $(libgsldht_la_LDFLAGS) $(libgsldht_la_OBJECTS) $(libgsldht_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkgincludeHEADERS
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/dht/dht.c b/gsl-1.9/dht/dht.c
new file mode 100644
index 0000000..2ba6fb1
--- /dev/null
+++ b/gsl-1.9/dht/dht.c
@@ -0,0 +1,225 @@
+/* dht/dht.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman
+ */
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_sf_bessel.h>
+#include <gsl/gsl_dht.h>
+
+
+gsl_dht *
+gsl_dht_alloc (size_t size)
+{
+ gsl_dht * t;
+
+ if(size == 0) {
+ GSL_ERROR_VAL("size == 0", GSL_EDOM, 0);
+ }
+
+ t = (gsl_dht *)malloc(sizeof(gsl_dht));
+
+ if(t == 0) {
+ GSL_ERROR_VAL("out of memory", GSL_ENOMEM, 0);
+ }
+
+ t->size = size;
+
+ t->xmax = -1.0; /* Make it clear that this needs to be calculated. */
+ t->nu = -1.0;
+
+ t->j = (double *)malloc((size+2)*sizeof(double));
+
+ if(t->j == 0) {
+ free(t);
+ GSL_ERROR_VAL("could not allocate memory for j", GSL_ENOMEM, 0);
+ }
+
+ t->Jjj = (double *)malloc(size*(size+1)/2 * sizeof(double));
+
+ if(t->Jjj == 0) {
+ free(t->j);
+ free(t);
+ GSL_ERROR_VAL("could not allocate memory for Jjj", GSL_ENOMEM, 0);
+ }
+
+ t->J2 = (double *)malloc((size+1)*sizeof(double));
+
+ if(t->J2 == 0) {
+ free(t->Jjj);
+ free(t->j);
+ free(t);
+ GSL_ERROR_VAL("could not allocate memory for J2", GSL_ENOMEM, 0);
+ }
+
+ return t;
+}
+
+/* Handle internal calculation of Bessel zeros. */
+static int
+dht_bessel_zeros(gsl_dht * t)
+{
+ unsigned int s;
+ gsl_sf_result z;
+ int stat_z = 0;
+ t->j[0] = 0.0;
+ for(s=1; s < t->size + 2; s++) {
+ stat_z += gsl_sf_bessel_zero_Jnu_e(t->nu, s, &z);
+ t->j[s] = z.val;
+ }
+ if(stat_z != 0) {
+ GSL_ERROR("could not compute bessel zeroes", GSL_EFAILED);
+ }
+ else {
+ return GSL_SUCCESS;
+ }
+}
+
+gsl_dht *
+gsl_dht_new (size_t size, double nu, double xmax)
+{
+ int status;
+
+ gsl_dht * dht = gsl_dht_alloc (size);
+
+ if (dht == 0)
+ return 0;
+
+ status = gsl_dht_init(dht, nu, xmax);
+
+ if (status)
+ return 0;
+
+ return dht;
+}
+
+int
+gsl_dht_init(gsl_dht * t, double nu, double xmax)
+{
+ if(xmax <= 0.0) {
+ GSL_ERROR ("xmax is not positive", GSL_EDOM);
+ } else if(nu < 0.0) {
+ GSL_ERROR ("nu is negative", GSL_EDOM);
+ }
+ else {
+ size_t n, m;
+ int stat_bz = GSL_SUCCESS;
+ int stat_J = 0;
+ double jN;
+
+ if(nu != t->nu) {
+ /* Recalculate Bessel zeros if necessary. */
+ t->nu = nu;
+ stat_bz = dht_bessel_zeros(t);
+ }
+
+ jN = t->j[t->size+1];
+
+ t->xmax = xmax;
+ t->kmax = jN / xmax;
+
+ t->J2[0] = 0.0;
+ for(m=1; m<t->size+1; m++) {
+ gsl_sf_result J;
+ stat_J += gsl_sf_bessel_Jnu_e(nu + 1.0, t->j[m], &J);
+ t->J2[m] = J.val * J.val;
+ }
+
+ /* J_nu(j[n] j[m] / j[N]) = Jjj[n(n-1)/2 + m - 1], 1 <= n,m <= size
+ */
+ for(n=1; n<t->size+1; n++) {
+ for(m=1; m<=n; m++) {
+ double arg = t->j[n] * t->j[m] / jN;
+ gsl_sf_result J;
+ stat_J += gsl_sf_bessel_Jnu_e(nu, arg, &J);
+ t->Jjj[n*(n-1)/2 + m - 1] = J.val;
+ }
+ }
+
+ if(stat_J != 0) {
+ GSL_ERROR("error computing bessel function", GSL_EFAILED);
+ }
+ else {
+ return stat_bz;
+ }
+ }
+}
+
+
+double gsl_dht_x_sample(const gsl_dht * t, int n)
+{
+ return t->j[n+1]/t->j[t->size+1] * t->xmax;
+}
+
+
+double gsl_dht_k_sample(const gsl_dht * t, int n)
+{
+ return t->j[n+1] / t->xmax;
+}
+
+
+void gsl_dht_free(gsl_dht * t)
+{
+ free(t->J2);
+ free(t->Jjj);
+ free(t->j);
+ free(t);
+}
+
+
+int
+gsl_dht_apply(const gsl_dht * t, double * f_in, double * f_out)
+{
+ const double jN = t->j[t->size + 1];
+ const double r = t->xmax / jN;
+ size_t m;
+ size_t i;
+
+ for(m=0; m<t->size; m++) {
+ double sum = 0.0;
+ double Y;
+ for(i=0; i<t->size; i++) {
+ /* Need to find max and min so that we
+ * address the symmetric Jjj matrix properly.
+ * FIXME: we can presumably optimize this
+ * by just running over the elements of Jjj
+ * in a deterministic manner.
+ */
+ size_t m_local;
+ size_t n_local;
+ if(i < m) {
+ m_local = i;
+ n_local = m;
+ }
+ else {
+ m_local = m;
+ n_local = i;
+ }
+ Y = t->Jjj[n_local*(n_local+1)/2 + m_local] / t->J2[i+1];
+ sum += Y * f_in[i];
+ }
+ f_out[m] = sum * 2.0 * r*r;
+ }
+
+ return GSL_SUCCESS;
+}
+
diff --git a/gsl-1.9/dht/gsl_dht.h b/gsl-1.9/dht/gsl_dht.h
new file mode 100644
index 0000000..bb6e0d2
--- /dev/null
+++ b/gsl-1.9/dht/gsl_dht.h
@@ -0,0 +1,87 @@
+/* dht/gsl_dht.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman
+ */
+#ifndef __GSL_DHT_H__
+#define __GSL_DHT_H__
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+
+struct gsl_dht_struct {
+ size_t size; /* size of the sample arrays to be transformed */
+ double nu; /* Bessel function order */
+ double xmax; /* the upper limit to the x-sampling domain */
+ double kmax; /* the upper limit to the k-sampling domain */
+ double * j; /* array of computed J_nu zeros, j_{nu,s} = j[s] */
+ double * Jjj; /* transform numerator, J_nu(j_i j_m / j_N) */
+ double * J2; /* transform denominator, J_{nu+1}^2(j_m) */
+};
+typedef struct gsl_dht_struct gsl_dht;
+
+
+/* Create a new transform object for a given size
+ * sampling array on the domain [0, xmax].
+ */
+gsl_dht * gsl_dht_alloc(size_t size);
+gsl_dht * gsl_dht_new(size_t size, double nu, double xmax);
+
+/* Recalculate a transform object for given values of nu, xmax.
+ * You cannot change the size of the object since the internal
+ * allocation is reused.
+ */
+int gsl_dht_init(gsl_dht * t, double nu, double xmax);
+
+/* The n'th computed x sample point for a given transform.
+ * 0 <= n <= size-1
+ */
+double gsl_dht_x_sample(const gsl_dht * t, int n);
+
+
+/* The n'th computed k sample point for a given transform.
+ * 0 <= n <= size-1
+ */
+double gsl_dht_k_sample(const gsl_dht * t, int n);
+
+
+/* Free a transform object.
+ */
+void gsl_dht_free(gsl_dht * t);
+
+
+/* Perform a transform on a sampled array.
+ * f_in[0] ... f_in[size-1] and similarly for f_out[]
+ */
+int gsl_dht_apply(const gsl_dht * t, double * f_in, double * f_out);
+
+
+__END_DECLS
+
+#endif /* __GSL_DHT_H__ */
diff --git a/gsl-1.9/dht/test.c b/gsl-1.9/dht/test.c
new file mode 100644
index 0000000..1ebbd54
--- /dev/null
+++ b/gsl-1.9/dht/test.c
@@ -0,0 +1,193 @@
+/* dht/test_dht.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman
+ */
+#include <config.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_dht.h>
+
+
+/* Test exact small transform.
+ */
+int
+test_dht_exact(void)
+{
+ int stat = 0;
+ double f_in[3] = { 1.0, 2.0, 3.0 };
+ double f_out[3];
+ gsl_dht * t = gsl_dht_new(3, 1.0, 1.0);
+ gsl_dht_apply(t, f_in, f_out);
+
+ /* Check values. */
+ if(fabs( f_out[0]-( 0.375254649407520))/0.375254649407520 > 1.0e-14) stat++;
+ if(fabs( f_out[1]-(-0.133507872695560))/0.133507872695560 > 1.0e-14) stat++;
+ if(fabs( f_out[2]-( 0.044679925143840))/0.044679925143840 > 1.0e-14) stat++;
+
+
+ /* Check inverse.
+ * We have to adjust the normalization
+ * so we can use the same precalculated transform.
+ */
+ gsl_dht_apply(t, f_out, f_in);
+ f_in[0] *= 13.323691936314223*13.323691936314223; /* jzero[1,4]^2 */
+ f_in[1] *= 13.323691936314223*13.323691936314223;
+ f_in[2] *= 13.323691936314223*13.323691936314223;
+
+ /* The loss of precision on the inverse
+ * is a little surprising. However, this
+ * thing is quite tricky since the band-limited
+ * function represented by the samples {1,2,3}
+ * need not be very nice. Like in any spectral
+ * application, you really have to have some
+ * a-priori knowledge of the underlying function.
+ */
+ if(fabs( f_in[0]-1.0)/1.0 > 2.0e-05) stat++;
+ if(fabs( f_in[1]-2.0)/2.0 > 2.0e-05) stat++;
+ if(fabs( f_in[2]-3.0)/3.0 > 2.0e-05) stat++;
+
+ gsl_dht_free(t);
+
+ return stat;
+}
+
+
+
+/* Test the transform
+ * Integrate[x J_0(a x) / (x^2 + 1), {x,0,Inf}] = K_0(a)
+ */
+int
+test_dht_simple(void)
+{
+ int stat = 0;
+ int n;
+ double f_in[128];
+ double f_out[128];
+ gsl_dht * t = gsl_dht_new(128, 0.0, 100.0);
+
+ for(n=0; n<128; n++) {
+ const double x = gsl_dht_x_sample(t, n);
+ f_in[n] = 1.0/(1.0+x*x);
+ }
+
+ gsl_dht_apply(t, f_in, f_out);
+
+ /* This is a difficult transform to calculate this way,
+ * since it does not satisfy the boundary condition and
+ * it dies quite slowly. So it is not meaningful to
+ * compare this to high accuracy. We only check
+ * that it seems to be working.
+ */
+ if(fabs( f_out[0]-4.00)/4.00 > 0.02) stat++;
+ if(fabs( f_out[5]-1.84)/1.84 > 0.02) stat++;
+ if(fabs(f_out[10]-1.27)/1.27 > 0.02) stat++;
+ if(fabs(f_out[35]-0.352)/0.352 > 0.02) stat++;
+ if(fabs(f_out[100]-0.0237)/0.0237 > 0.02) stat++;
+
+ gsl_dht_free(t);
+
+ return stat;
+}
+
+
+/* Test the transform
+ * Integrate[ x exp(-x) J_1(a x), {x,0,Inf}] = a F(3/2, 2; 2; -a^2)
+ */
+int
+test_dht_exp1(void)
+{
+ int stat = 0;
+ int n;
+ double f_in[128];
+ double f_out[128];
+ gsl_dht * t = gsl_dht_new(128, 1.0, 20.0);
+
+ for(n=0; n<128; n++) {
+ const double x = gsl_dht_x_sample(t, n);
+ f_in[n] = exp(-x);
+ }
+
+ gsl_dht_apply(t, f_in, f_out);
+
+ /* Spot check.
+ * Note that the systematic errors in the calculation
+ * are quite large, so it is meaningless to compare
+ * to a high accuracy.
+ */
+ if(fabs( f_out[0]-0.181)/0.181 > 0.02) stat++;
+ if(fabs( f_out[5]-0.357)/0.357 > 0.02) stat++;
+ if(fabs(f_out[10]-0.211)/0.211 > 0.02) stat++;
+ if(fabs(f_out[35]-0.0289)/0.0289 > 0.02) stat++;
+ if(fabs(f_out[100]-0.00221)/0.00211 > 0.02) stat++;
+
+ gsl_dht_free(t);
+
+ return stat;
+}
+
+
+/* Test the transform
+ * Integrate[ x^2 (1-x^2) J_1(a x), {x,0,1}] = 2/a^2 J_3(a)
+ */
+int
+test_dht_poly1(void)
+{
+ int stat = 0;
+ int n;
+ double f_in[128];
+ double f_out[128];
+ gsl_dht * t = gsl_dht_new(128, 1.0, 1.0);
+
+ for(n=0; n<128; n++) {
+ const double x = gsl_dht_x_sample(t, n);
+ f_in[n] = x * (1.0 - x*x);
+ }
+
+ gsl_dht_apply(t, f_in, f_out);
+
+ /* Spot check. This function satisfies the boundary condition,
+ * so the accuracy should be ok.
+ */
+ if(fabs( f_out[0]-0.057274214)/0.057274214 > 1.0e-07) stat++;
+ if(fabs( f_out[5]-(-0.000190850))/0.000190850 > 1.0e-05) stat++;
+ if(fabs(f_out[10]-0.000024342)/0.000024342 > 1.0e-04) stat++;
+ if(fabs(f_out[35]-(-4.04e-07))/4.04e-07 > 1.0e-03) stat++;
+ if(fabs(f_out[100]-1.0e-08)/1.0e-08 > 0.25) stat++;
+
+ gsl_dht_free(t);
+
+ return stat;
+}
+
+
+int main()
+{
+ gsl_ieee_env_setup ();
+
+ gsl_test( test_dht_exact(), "Small Exact DHT");
+ gsl_test( test_dht_simple(), "Simple DHT");
+ gsl_test( test_dht_exp1(), "Exp J1 DHT");
+ gsl_test( test_dht_poly1(), "Poly J1 DHT");
+
+ exit (gsl_test_summary());
+}
diff --git a/gsl-1.9/diff/ChangeLog b/gsl-1.9/diff/ChangeLog
new file mode 100644
index 0000000..863e949
--- /dev/null
+++ b/gsl-1.9/diff/ChangeLog
@@ -0,0 +1,13 @@
+Mon Apr 23 13:26:21 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * Makefile.am: removed demo from Makefile
+
+ * test.c (test): changed return type to void
+
+Mon Feb 5 13:42:54 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * diff.c: moved gradient calculating function into multimin since
+ it depends on multimin functions
+
+ * test.c (main): tidied up the tests
+
diff --git a/gsl-1.9/diff/Makefile.am b/gsl-1.9/diff/Makefile.am
new file mode 100644
index 0000000..bb1ad5b
--- /dev/null
+++ b/gsl-1.9/diff/Makefile.am
@@ -0,0 +1,16 @@
+noinst_LTLIBRARIES = libgsldiff.la
+
+INCLUDES= -I$(top_builddir)
+
+libgsldiff_la_SOURCES = diff.c
+
+pkginclude_HEADERS = gsl_diff.h
+
+TESTS = $(check_PROGRAMS)
+check_PROGRAMS = test #demo
+
+test_SOURCES = test.c
+test_LDADD = libgsldiff.la ../vector/libgslvector.la ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la
+
+#demo_SOURCES = demo.c
+#demo_LDADD = libgsldiff.la ../vector/libgslvector.la ../block/libgslblock.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la
diff --git a/gsl-1.9/diff/Makefile.in b/gsl-1.9/diff/Makefile.in
new file mode 100644
index 0000000..efea5f7
--- /dev/null
+++ b/gsl-1.9/diff/Makefile.in
@@ -0,0 +1,546 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = test$(EXEEXT)
+subdir = diff
+DIST_COMMON = $(pkginclude_HEADERS) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in ChangeLog
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgsldiff_la_LIBADD =
+am_libgsldiff_la_OBJECTS = diff.lo
+libgsldiff_la_OBJECTS = $(am_libgsldiff_la_OBJECTS)
+am_test_OBJECTS = test.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = libgsldiff.la ../vector/libgslvector.la \
+ ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la \
+ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgsldiff_la_SOURCES) $(test_SOURCES)
+DIST_SOURCES = $(libgsldiff_la_SOURCES) $(test_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libgsldiff.la
+INCLUDES = -I$(top_builddir)
+libgsldiff_la_SOURCES = diff.c
+pkginclude_HEADERS = gsl_diff.h
+TESTS = $(check_PROGRAMS)
+test_SOURCES = test.c
+test_LDADD = libgsldiff.la ../vector/libgslvector.la ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps diff/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps diff/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgsldiff.la: $(libgsldiff_la_OBJECTS) $(libgsldiff_la_DEPENDENCIES)
+ $(LINK) $(libgsldiff_la_LDFLAGS) $(libgsldiff_la_OBJECTS) $(libgsldiff_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkgincludeHEADERS
+
+
+#demo_SOURCES = demo.c
+#demo_LDADD = libgsldiff.la ../vector/libgslvector.la ../block/libgslblock.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/diff/diff.c b/gsl-1.9/diff/diff.c
new file mode 100644
index 0000000..83aae18
--- /dev/null
+++ b/gsl-1.9/diff/diff.c
@@ -0,0 +1,180 @@
+/* diff/diff.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 David Morrison
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_diff.h>
+
+int
+gsl_diff_backward (const gsl_function * f,
+ double x, double *result, double *abserr)
+{
+ /* Construct a divided difference table with a fairly large step
+ size to get a very rough estimate of f''. Use this to estimate
+ the step size which will minimize the error in calculating f'. */
+
+ int i, k;
+ double h = GSL_SQRT_DBL_EPSILON;
+ double a[3], d[3], a2;
+
+ /* Algorithm based on description on pg. 204 of Conte and de Boor
+ (CdB) - coefficients of Newton form of polynomial of degree 2. */
+
+ for (i = 0; i < 3; i++)
+ {
+ a[i] = x + (i - 2.0) * h;
+ d[i] = GSL_FN_EVAL (f, a[i]);
+ }
+
+ for (k = 1; k < 4; k++)
+ {
+ for (i = 0; i < 3 - k; i++)
+ {
+ d[i] = (d[i + 1] - d[i]) / (a[i + k] - a[i]);
+ }
+ }
+
+ /* Adapt procedure described on pg. 282 of CdB to find best value of
+ step size. */
+
+ a2 = fabs (d[0] + d[1] + d[2]);
+
+ if (a2 < 100.0 * GSL_SQRT_DBL_EPSILON)
+ {
+ a2 = 100.0 * GSL_SQRT_DBL_EPSILON;
+ }
+
+ h = sqrt (GSL_SQRT_DBL_EPSILON / (2.0 * a2));
+
+ if (h > 100.0 * GSL_SQRT_DBL_EPSILON)
+ {
+ h = 100.0 * GSL_SQRT_DBL_EPSILON;
+ }
+
+ *result = (GSL_FN_EVAL (f, x) - GSL_FN_EVAL (f, x - h)) / h;
+ *abserr = fabs (10.0 * a2 * h);
+
+ return GSL_SUCCESS;
+}
+
+int
+gsl_diff_forward (const gsl_function * f,
+ double x, double *result, double *abserr)
+{
+ /* Construct a divided difference table with a fairly large step
+ size to get a very rough estimate of f''. Use this to estimate
+ the step size which will minimize the error in calculating f'. */
+
+ int i, k;
+ double h = GSL_SQRT_DBL_EPSILON;
+ double a[3], d[3], a2;
+
+ /* Algorithm based on description on pg. 204 of Conte and de Boor
+ (CdB) - coefficients of Newton form of polynomial of degree 2. */
+
+ for (i = 0; i < 3; i++)
+ {
+ a[i] = x + i * h;
+ d[i] = GSL_FN_EVAL (f, a[i]);
+ }
+
+ for (k = 1; k < 4; k++)
+ {
+ for (i = 0; i < 3 - k; i++)
+ {
+ d[i] = (d[i + 1] - d[i]) / (a[i + k] - a[i]);
+ }
+ }
+
+ /* Adapt procedure described on pg. 282 of CdB to find best value of
+ step size. */
+
+ a2 = fabs (d[0] + d[1] + d[2]);
+
+ if (a2 < 100.0 * GSL_SQRT_DBL_EPSILON)
+ {
+ a2 = 100.0 * GSL_SQRT_DBL_EPSILON;
+ }
+
+ h = sqrt (GSL_SQRT_DBL_EPSILON / (2.0 * a2));
+
+ if (h > 100.0 * GSL_SQRT_DBL_EPSILON)
+ {
+ h = 100.0 * GSL_SQRT_DBL_EPSILON;
+ }
+
+ *result = (GSL_FN_EVAL (f, x + h) - GSL_FN_EVAL (f, x)) / h;
+ *abserr = fabs (10.0 * a2 * h);
+
+ return GSL_SUCCESS;
+}
+
+int
+gsl_diff_central (const gsl_function * f,
+ double x, double *result, double *abserr)
+{
+ /* Construct a divided difference table with a fairly large step
+ size to get a very rough estimate of f'''. Use this to estimate
+ the step size which will minimize the error in calculating f'. */
+
+ int i, k;
+ double h = GSL_SQRT_DBL_EPSILON;
+ double a[4], d[4], a3;
+
+ /* Algorithm based on description on pg. 204 of Conte and de Boor
+ (CdB) - coefficients of Newton form of polynomial of degree 3. */
+
+ for (i = 0; i < 4; i++)
+ {
+ a[i] = x + (i - 2.0) * h;
+ d[i] = GSL_FN_EVAL (f, a[i]);
+ }
+
+ for (k = 1; k < 5; k++)
+ {
+ for (i = 0; i < 4 - k; i++)
+ {
+ d[i] = (d[i + 1] - d[i]) / (a[i + k] - a[i]);
+ }
+ }
+
+ /* Adapt procedure described on pg. 282 of CdB to find best
+ value of step size. */
+
+ a3 = fabs (d[0] + d[1] + d[2] + d[3]);
+
+ if (a3 < 100.0 * GSL_SQRT_DBL_EPSILON)
+ {
+ a3 = 100.0 * GSL_SQRT_DBL_EPSILON;
+ }
+
+ h = pow (GSL_SQRT_DBL_EPSILON / (2.0 * a3), 1.0 / 3.0);
+
+ if (h > 100.0 * GSL_SQRT_DBL_EPSILON)
+ {
+ h = 100.0 * GSL_SQRT_DBL_EPSILON;
+ }
+
+ *result = (GSL_FN_EVAL (f, x + h) - GSL_FN_EVAL (f, x - h)) / (2.0 * h);
+ *abserr = fabs (100.0 * a3 * h * h);
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/diff/gsl_diff.h b/gsl-1.9/diff/gsl_diff.h
new file mode 100644
index 0000000..4080f7e
--- /dev/null
+++ b/gsl-1.9/diff/gsl_diff.h
@@ -0,0 +1,50 @@
+/* diff/gsl_diff.h
+ *
+ * Copyright (C) 2000 David Morrison
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_DIFF_H__
+#define __GSL_DIFF_H__
+#include <gsl/gsl_math.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+int gsl_diff_central (const gsl_function *f,
+ double x,
+ double *result, double *abserr);
+
+int gsl_diff_backward (const gsl_function *f,
+ double x,
+ double *result, double *abserr);
+
+int gsl_diff_forward (const gsl_function *f,
+ double x,
+ double *result, double *abserr);
+
+__END_DECLS
+
+#endif /* __GSL_DIFF_H__ */
diff --git a/gsl-1.9/diff/test.c b/gsl-1.9/diff/test.c
new file mode 100644
index 0000000..0e6f696
--- /dev/null
+++ b/gsl-1.9/diff/test.c
@@ -0,0 +1,195 @@
+/* diff/test.c
+ *
+ * Copyright (C) 2000 David Morrison
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_diff.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+
+double
+f1 (double x, void *params)
+{
+ return exp (x);
+}
+
+double
+df1 (double x, void *params)
+{
+ return exp (x);
+}
+
+double
+f2 (double x, void *params)
+{
+ if (x >= 0.0)
+ {
+ return x * sqrt (x);
+ }
+ else
+ {
+ return 0.0;
+ }
+}
+
+double
+df2 (double x, void *params)
+{
+ if (x >= 0.0)
+ {
+ return 1.5 * sqrt (x);
+ }
+ else
+ {
+ return 0.0;
+ }
+}
+
+double
+f3 (double x, void *params)
+{
+ if (x != 0.0)
+ {
+ return sin (1 / x);
+ }
+ else
+ {
+ return 0.0;
+ }
+}
+
+double
+df3 (double x, void *params)
+{
+ if (x != 0.0)
+ {
+ return -cos (1 / x) / (x * x);
+ }
+ else
+ {
+ return 0.0;
+ }
+}
+
+double
+f4 (double x, void *params)
+{
+ return exp (-x * x);
+}
+
+double
+df4 (double x, void *params)
+{
+ return -2.0 * x * exp (-x * x);
+}
+
+double
+f5 (double x, void *params)
+{
+ return x * x;
+}
+
+double
+df5 (double x, void *params)
+{
+ return 2.0 * x;
+}
+
+double
+f6 (double x, void *params)
+{
+ return 1.0 / x;
+}
+
+double
+df6 (double x, void *params)
+{
+ return -1.0 / (x * x);
+}
+
+typedef int (diff_fn) (const gsl_function * f, double x, double * res, double *abserr);
+
+void
+test (diff_fn * diff, gsl_function * f, gsl_function * df, double x,
+ const char * desc)
+{
+ double result, abserr;
+ double expected = GSL_FN_EVAL (df, x);
+ (*diff) (f, x, &result, &abserr);
+ gsl_test_abs (result, expected, abserr, desc);
+ gsl_test (fabs(result-expected) > abserr, "%s, valid error estimate", desc);
+}
+
+int
+main ()
+{
+ gsl_function F1, DF1, F2, DF2, F3, DF3, F4, DF4, F5, DF5, F6, DF6;
+
+ gsl_ieee_env_setup ();
+
+ F1.function = &f1;
+ DF1.function = &df1;
+
+ F2.function = &f2;
+ DF2.function = &df2;
+
+ F3.function = &f3;
+ DF3.function = &df3;
+
+ F4.function = &f4;
+ DF4.function = &df4;
+
+ F5.function = &f5;
+ DF5.function = &df5;
+
+ F6.function = &f6;
+ DF6.function = &df6;
+
+ test (&gsl_diff_central, &F1, &DF1, 1.0, "exp(x), x=1, central diff");
+ test (&gsl_diff_forward, &F1, &DF1, 1.0, "exp(x), x=1, forward diff");
+ test (&gsl_diff_backward, &F1, &DF1, 1.0, "exp(x), x=1, backward diff");
+
+ test (&gsl_diff_central, &F2, &DF2, 0.1, "x^(3/2), x=0.1, central diff");
+ test (&gsl_diff_forward, &F2, &DF2, 0.1, "x^(3/2), x=0.1, forward diff");
+ test (&gsl_diff_backward, &F2, &DF2, 0.1, "x^(3/2), x=0.1, backward diff");
+
+ test (&gsl_diff_central, &F3, &DF3, 0.45, "sin(1/x), x=0.45, central diff");
+ test (&gsl_diff_forward, &F3, &DF3, 0.45, "sin(1/x), x=0.45, forward diff");
+ test (&gsl_diff_backward, &F3, &DF3, 0.45, "sin(1/x), x=0.45, backward diff");
+
+ test (&gsl_diff_central, &F4, &DF4, 0.5, "exp(-x^2), x=0.5, central diff");
+ test (&gsl_diff_forward, &F4, &DF4, 0.5, "exp(-x^2), x=0.5, forward diff");
+ test (&gsl_diff_backward, &F4, &DF4, 0.5, "exp(-x^2), x=0.5, backward diff");
+
+ test (&gsl_diff_central, &F5, &DF5, 0.0, "x^2, x=0, central diff");
+ test (&gsl_diff_forward, &F5, &DF5, 0.0, "x^2, x=0, forward diff");
+ test (&gsl_diff_backward, &F5, &DF5, 0.0, "x^2, x=0, backward diff");
+
+ test (&gsl_diff_central, &F6, &DF6, 10.0, "1/x, x=10, central diff");
+ test (&gsl_diff_forward, &F6, &DF6, 10.0, "1/x, x=10, forward diff");
+ test (&gsl_diff_backward, &F6, &DF6, 10.0, "1/x, x=10, backward diff");
+
+ exit (gsl_test_summary ());
+}
+
+
diff --git a/gsl-1.9/doc/12-cities.eps b/gsl-1.9/doc/12-cities.eps
new file mode 100644
index 0000000..f2b8726
--- /dev/null
+++ b/gsl-1.9/doc/12-cities.eps
@@ -0,0 +1,15622 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: GNU libplot drawing library 4.1
+%%Title: PostScript plot
+%%CreationDate: Thu Jan 4 06:48:42 2007
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 1
+%%Pages: 1
+%%PageOrder: Ascend
+%%Orientation: Portrait
+%%BoundingBox: 56 177 500 610
+%%DocumentNeededResources:
+%%DocumentSuppliedResources: procset GNU_libplot 1.0 0
+%%EndComments
+
+%%BeginDefaults
+%%PageResources:
+%%EndDefaults
+
+%%BeginProlog
+%%EndProlog
+
+%%BeginSetup
+/DrawDict 50 dict def
+DrawDict begin
+%%BeginResource procset GNU_libplot 1.0 0
+/none null def
+/numGraphicParameters 17 def
+/stringLimit 65535 def
+/arrowHeight 8 def
+/eoFillRule true def
+
+/Begin { save numGraphicParameters dict begin } def
+/End { end restore } def
+
+/SetB {
+dup type /nulltype eq {
+pop
+false /brushRightArrow idef
+false /brushLeftArrow idef
+true /brushNone idef
+} {
+/brushDashOffset idef
+/brushDashArray idef
+0 ne /brushRightArrow idef
+0 ne /brushLeftArrow idef
+/brushWidth idef
+false /brushNone idef
+} ifelse
+} def
+
+/SetCFg {
+/fgblue idef
+/fggreen idef
+/fgred idef
+} def
+
+/SetCBg {
+/bgblue idef
+/bggreen idef
+/bgred idef
+} def
+
+/SetF {
+/printSize idef
+/printFont idef
+} def
+
+/SetP {
+dup type /nulltype eq {
+pop true /patternNone idef
+} {
+/patternGrayLevel idef
+patternGrayLevel -1 eq {
+/patternString idef
+} if
+false /patternNone idef
+} ifelse
+} def
+
+/BSpl {
+0 begin
+storexyn
+newpath
+n 1 gt {
+0 0 0 0 0 0 1 1 true subspline
+n 2 gt {
+0 0 0 0 1 1 2 2 false subspline
+1 1 n 3 sub {
+/i exch def
+i 1 sub dup i dup i 1 add dup i 2 add dup false subspline
+} for
+n 3 sub dup n 2 sub dup n 1 sub dup 2 copy false subspline
+} if
+n 2 sub dup n 1 sub dup 2 copy 2 copy false subspline
+patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if
+brushNone not { istroke } if
+0 0 1 1 leftarrow
+n 2 sub dup 1 sub dup rightarrow
+} if
+end
+} dup 0 4 dict put def
+
+/Circ {
+newpath
+0 360 arc
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+} def
+
+/CBSpl {
+0 begin
+dup 2 gt {
+storexyn
+newpath
+n 1 sub dup 0 0 1 1 2 2 true subspline
+1 1 n 3 sub {
+/i exch def
+i 1 sub dup i dup i 1 add dup i 2 add dup false subspline
+} for
+n 3 sub dup n 2 sub dup n 1 sub dup 0 0 false subspline
+n 2 sub dup n 1 sub dup 0 0 1 1 false subspline
+patternNone not { ifill } if
+brushNone not { istroke } if
+} {
+Poly
+} ifelse
+end
+} dup 0 4 dict put def
+
+/Elli {
+0 begin
+newpath
+4 2 roll
+translate
+scale
+0 0 1 0 360 arc
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+end
+} dup 0 1 dict put def
+
+/Line {
+0 begin
+2 storexyn
+newpath
+x 0 get y 0 get moveto
+x 1 get y 1 get lineto
+brushNone not { istroke } if
+0 0 1 1 leftarrow
+0 0 1 1 rightarrow
+end
+} dup 0 4 dict put def
+
+/MLine {
+0 begin
+storexyn
+newpath
+n 1 gt {
+x 0 get y 0 get moveto
+1 1 n 1 sub {
+/i exch def
+x i get y i get lineto
+} for
+patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if
+brushNone not { istroke } if
+0 0 1 1 leftarrow
+n 2 sub dup n 1 sub dup rightarrow
+} if
+end
+} dup 0 4 dict put def
+
+/Poly {
+3 1 roll
+newpath
+moveto
+-1 add
+{ lineto } repeat
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+} def
+
+/Rect {
+0 begin
+/t exch def
+/r exch def
+/b exch def
+/l exch def
+newpath
+l b moveto
+l t lineto
+r t lineto
+r b lineto
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+end
+} dup 0 4 dict put def
+
+/Text {
+ishow
+} def
+
+/idef {
+dup where { pop pop pop } { exch def } ifelse
+} def
+
+/ifill {
+0 begin
+gsave
+patternGrayLevel -1 ne {
+fgred bgred fgred sub patternGrayLevel mul add
+fggreen bggreen fggreen sub patternGrayLevel mul add
+fgblue bgblue fgblue sub patternGrayLevel mul add setrgbcolor
+eoFillRule { eofill } { fill } ifelse
+} {
+eoFillRule { eoclip } { clip } ifelse
+originalCTM setmatrix
+pathbbox /t exch def /r exch def /b exch def /l exch def
+/w r l sub ceiling cvi def
+/h t b sub ceiling cvi def
+/imageByteWidth w 8 div ceiling cvi def
+/imageHeight h def
+bgred bggreen bgblue setrgbcolor
+eoFillRule { eofill } { fill } ifelse
+fgred fggreen fgblue setrgbcolor
+w 0 gt h 0 gt and {
+l b translate w h scale
+w h true [w 0 0 h neg 0 h] { patternproc } imagemask
+} if
+} ifelse
+grestore
+end
+} dup 0 8 dict put def
+
+/istroke {
+gsave
+brushDashOffset -1 eq {
+[] 0 setdash
+1 setgray
+} {
+brushDashArray brushDashOffset setdash
+fgred fggreen fgblue setrgbcolor
+} ifelse
+brushWidth setlinewidth
+originalCTM setmatrix
+stroke
+grestore
+} def
+
+/ishow {
+0 begin
+gsave
+fgred fggreen fgblue setrgbcolor
+/fontDict printFont findfont printSize scalefont dup setfont def
+/descender fontDict begin 0 /FontBBox load 1 get FontMatrix end
+transform exch pop def
+/vertoffset 1 printSize sub descender sub def {
+0 vertoffset moveto show
+/vertoffset vertoffset printSize sub def
+} forall
+grestore
+end
+} dup 0 3 dict put def
+
+/patternproc {
+0 begin
+/patternByteLength patternString length def
+/patternHeight patternByteLength 8 mul sqrt cvi def
+/patternWidth patternHeight def
+/patternByteWidth patternWidth 8 idiv def
+/imageByteMaxLength imageByteWidth imageHeight mul
+stringLimit patternByteWidth sub min def
+/imageMaxHeight imageByteMaxLength imageByteWidth idiv patternHeight idiv
+patternHeight mul patternHeight max def
+/imageHeight imageHeight imageMaxHeight sub store
+/imageString imageByteWidth imageMaxHeight mul patternByteWidth add string def
+0 1 imageMaxHeight 1 sub {
+/y exch def
+/patternRow y patternByteWidth mul patternByteLength mod def
+/patternRowString patternString patternRow patternByteWidth getinterval def
+/imageRow y imageByteWidth mul def
+0 patternByteWidth imageByteWidth 1 sub {
+/x exch def
+imageString imageRow x add patternRowString putinterval
+} for
+} for
+imageString
+end
+} dup 0 12 dict put def
+
+/min {
+dup 3 2 roll dup 4 3 roll lt { exch } if pop
+} def
+
+/max {
+dup 3 2 roll dup 4 3 roll gt { exch } if pop
+} def
+
+/midpoint {
+0 begin
+/y1 exch def
+/x1 exch def
+/y0 exch def
+/x0 exch def
+x0 x1 add 2 div
+y0 y1 add 2 div
+end
+} dup 0 4 dict put def
+
+/thirdpoint {
+0 begin
+/y1 exch def
+/x1 exch def
+/y0 exch def
+/x0 exch def
+x0 2 mul x1 add 3 div
+y0 2 mul y1 add 3 div
+end
+} dup 0 4 dict put def
+
+/subspline {
+0 begin
+/movetoNeeded exch def
+y exch get /y3 exch def
+x exch get /x3 exch def
+y exch get /y2 exch def
+x exch get /x2 exch def
+y exch get /y1 exch def
+x exch get /x1 exch def
+y exch get /y0 exch def
+x exch get /x0 exch def
+x1 y1 x2 y2 thirdpoint
+/p1y exch def
+/p1x exch def
+x2 y2 x1 y1 thirdpoint
+/p2y exch def
+/p2x exch def
+x1 y1 x0 y0 thirdpoint
+p1x p1y midpoint
+/p0y exch def
+/p0x exch def
+x2 y2 x3 y3 thirdpoint
+p2x p2y midpoint
+/p3y exch def
+/p3x exch def
+movetoNeeded { p0x p0y moveto } if
+p1x p1y p2x p2y p3x p3y curveto
+end
+} dup 0 17 dict put def
+
+/storexyn {
+/n exch def
+/y n array def
+/x n array def
+n 1 sub -1 0 {
+/i exch def
+y i 3 2 roll put
+x i 3 2 roll put
+} for
+} def
+
+/arrowhead {
+0 begin
+transform originalCTM itransform
+/taily exch def
+/tailx exch def
+transform originalCTM itransform
+/tipy exch def
+/tipx exch def
+/dy tipy taily sub def
+/dx tipx tailx sub def
+/angle dx 0 ne dy 0 ne or { dy dx atan } { 90 } ifelse def
+gsave
+originalCTM setmatrix
+tipx tipy translate
+angle rotate
+newpath
+arrowHeight neg arrowWidth 2 div moveto
+0 0 lineto
+arrowHeight neg arrowWidth 2 div neg lineto
+patternNone not {
+originalCTM setmatrix
+/padtip arrowHeight 2 exp 0.25 arrowWidth 2 exp mul add sqrt brushWidth mul
+arrowWidth div def
+/padtail brushWidth 2 div def
+tipx tipy translate
+angle rotate
+padtip 0 translate
+arrowHeight padtip add padtail add arrowHeight div dup scale
+arrowheadpath
+ifill
+} if
+brushNone not {
+originalCTM setmatrix
+tipx tipy translate
+angle rotate
+arrowheadpath
+istroke
+} if
+grestore
+end
+} dup 0 9 dict put def
+
+/arrowheadpath {
+newpath
+arrowHeight neg arrowWidth 2 div moveto
+0 0 lineto
+arrowHeight neg arrowWidth 2 div neg lineto
+} def
+
+/leftarrow {
+0 begin
+y exch get /taily exch def
+x exch get /tailx exch def
+y exch get /tipy exch def
+x exch get /tipx exch def
+brushLeftArrow { tipx tipy tailx taily arrowhead } if
+end
+} dup 0 4 dict put def
+
+/rightarrow {
+0 begin
+y exch get /tipy exch def
+x exch get /tipx exch def
+y exch get /taily exch def
+x exch get /tailx exch def
+brushRightArrow { tipx tipy tailx taily arrowhead } if
+end
+} dup 0 4 dict put def
+%%EndResource
+%%EndSetup
+
+%%Page: 1 1
+%%PageResources:
+%%PageBoundingBox: 56 177 500 610
+%%BeginPageSetup
+%I Idraw 8
+
+Begin
+%I b u
+%I cfg u
+%I cbg u
+%I f u
+%I p u
+%I t
+[ 1 0 0 1 0 0 ] concat
+/originalCTM matrix currentmatrix def
+/trueoriginalCTM matrix currentmatrix def
+%%EndPageSetup
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2564 10017
+2564 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2578 10017
+2578 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2476 10017
+2461 9930
+2461 10017
+2681 10017
+2681 9930
+2666 10017
+6 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2520 9710
+2622 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+2945 9973
+2960 10017
+2960 9930
+2945 9973
+2916 10003
+2872 10017
+2828 10017
+2784 10003
+2754 9973
+2754 9944
+2769 9915
+2784 9900
+2813 9886
+2901 9856
+2930 9842
+2960 9812
+16 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+2754 9944
+2784 9915
+2813 9900
+2901 9871
+2930 9856
+2945 9842
+2960 9812
+2960 9754
+2930 9724
+2886 9710
+2842 9710
+2798 9724
+2769 9754
+2754 9798
+2754 9710
+2769 9754
+16 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3077 10017
+3077 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3092 10017
+3092 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+3033 10017
+3209 10017
+3253 10003
+3267 9988
+3282 9959
+3282 9915
+3267 9886
+3253 9871
+3209 9856
+3092 9856
+10 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+3209 10017
+3238 10003
+3253 9988
+3267 9959
+3267 9915
+3253 9886
+3238 9871
+3209 9856
+8 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3033 9710
+3136 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3619 9842
+3883 9842
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+4264 9959
+4294 9973
+4338 10017
+4338 9710
+4 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4323 10003
+4323 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4264 9710
+4396 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 20
+4528 9959
+4543 9944
+4528 9930
+4514 9944
+4514 9959
+4528 9988
+4543 10003
+4587 10017
+4646 10017
+4690 10003
+4704 9988
+4719 9959
+4719 9930
+4704 9900
+4660 9871
+4587 9842
+4558 9827
+4528 9798
+4514 9754
+4514 9710
+20 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+4646 10017
+4675 10003
+4690 9988
+4704 9959
+4704 9930
+4690 9900
+4646 9871
+4587 9842
+8 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+4514 9739
+4528 9754
+4558 9754
+4631 9724
+4675 9724
+4704 9739
+4719 9754
+7 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+4558 9754
+4631 9710
+4690 9710
+4704 9724
+4719 9754
+4719 9783
+6 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+5188 9886
+5203 9915
+5203 9856
+5188 9886
+5174 9900
+5144 9915
+5086 9915
+5056 9900
+5042 9886
+5042 9856
+5056 9842
+5086 9827
+5159 9798
+5188 9783
+5203 9768
+15 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+5042 9871
+5056 9856
+5086 9842
+5159 9812
+5188 9798
+5203 9783
+5203 9739
+5188 9724
+5159 9710
+5100 9710
+5071 9724
+5056 9739
+5042 9768
+5042 9710
+5056 9739
+15 MLine
+End
+
+Begin %I Poly
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+5408 9915
+5452 9900
+5481 9871
+5496 9827
+5496 9798
+5481 9754
+5452 9724
+5408 9710
+5379 9710
+5335 9724
+5305 9754
+5291 9798
+5291 9827
+5305 9871
+5335 9900
+5379 9915
+16 Poly
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+5379 9915
+5349 9900
+5320 9871
+5305 9827
+5305 9798
+5320 9754
+5349 9724
+5379 9710
+8 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+5408 9710
+5437 9724
+5467 9754
+5481 9798
+5481 9827
+5467 9871
+5437 9900
+5408 9915
+8 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+5613 9915
+5613 9754
+5628 9724
+5672 9710
+5701 9710
+5745 9724
+5775 9754
+7 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+5628 9915
+5628 9754
+5643 9724
+5672 9710
+4 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5775 9915
+5775 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5789 9915
+5789 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5569 9915
+5628 9915
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5731 9915
+5789 9915
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5775 9710
+5833 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+5936 10017
+5936 9768
+5951 9724
+5980 9710
+6009 9710
+6039 9724
+6053 9754
+7 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+5951 10017
+5951 9768
+5965 9724
+5980 9710
+4 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5892 9915
+6009 9915
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6156 10017
+6156 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6171 10017
+6171 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+6171 9871
+6200 9900
+6244 9915
+6273 9915
+6317 9900
+6332 9871
+6332 9710
+7 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+6273 9915
+6302 9900
+6317 9871
+6317 9710
+4 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6112 10017
+6171 10017
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6112 9710
+6215 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6273 9710
+6376 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6464 9915
+6522 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6478 9915
+6522 9754
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6581 9915
+6522 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6581 9915
+6640 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6596 9915
+6640 9754
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6698 9915
+6640 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6420 9915
+6522 9915
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6654 9915
+6742 9915
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 17
+6816 9827
+6992 9827
+6992 9856
+6977 9886
+6962 9900
+6933 9915
+6889 9915
+6845 9900
+6816 9871
+6801 9827
+6801 9798
+6816 9754
+6845 9724
+6889 9710
+6918 9710
+6962 9724
+6992 9754
+17 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+6977 9827
+6977 9871
+6962 9900
+3 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+6889 9915
+6860 9900
+6830 9871
+6816 9827
+6816 9798
+6830 9754
+6860 9724
+6889 9710
+8 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+7226 9886
+7241 9915
+7241 9856
+7226 9886
+7212 9900
+7182 9915
+7124 9915
+7094 9900
+7080 9886
+7080 9856
+7094 9842
+7124 9827
+7197 9798
+7226 9783
+7241 9768
+15 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+7080 9871
+7094 9856
+7124 9842
+7197 9812
+7226 9798
+7241 9783
+7241 9739
+7226 9724
+7197 9710
+7138 9710
+7109 9724
+7094 9739
+7080 9768
+7080 9710
+7094 9739
+15 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+7358 10017
+7358 9768
+7373 9724
+7402 9710
+7431 9710
+7461 9724
+7475 9754
+7 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+7373 10017
+7373 9768
+7387 9724
+7402 9710
+4 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7314 9915
+7431 9915
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 18
+7959 9871
+7945 9856
+7959 9842
+7974 9856
+7974 9871
+7945 9900
+7915 9915
+7871 9915
+7827 9900
+7798 9871
+7783 9827
+7783 9798
+7798 9754
+7827 9724
+7871 9710
+7901 9710
+7945 9724
+7974 9754
+18 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+7871 9915
+7842 9900
+7813 9871
+7798 9827
+7798 9798
+7813 9754
+7842 9724
+7871 9710
+8 MLine
+End
+
+Begin %I Poly
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+8106 10003
+8091 9988
+8077 10003
+8091 10017
+4 Poly
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8091 9915
+8091 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8106 9915
+8106 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8047 9915
+8106 9915
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8047 9710
+8150 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+8253 10017
+8253 9768
+8267 9724
+8296 9710
+8326 9710
+8355 9724
+8370 9754
+7 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+8267 10017
+8267 9768
+8282 9724
+8296 9710
+4 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8209 9915
+8326 9915
+2 MLine
+End
+
+Begin %I Poly
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+8487 10003
+8472 9988
+8458 10003
+8472 10017
+4 Poly
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8472 9915
+8472 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8487 9915
+8487 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8428 9915
+8487 9915
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8428 9710
+8531 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 17
+8619 9827
+8795 9827
+8795 9856
+8780 9886
+8766 9900
+8736 9915
+8692 9915
+8648 9900
+8619 9871
+8604 9827
+8604 9798
+8619 9754
+8648 9724
+8692 9710
+8722 9710
+8766 9724
+8795 9754
+17 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+8780 9827
+8780 9871
+8766 9900
+3 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+8692 9915
+8663 9900
+8634 9871
+8619 9827
+8619 9798
+8634 9754
+8663 9724
+8692 9710
+8 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+9030 9886
+9044 9915
+9044 9856
+9030 9886
+9015 9900
+8986 9915
+8927 9915
+8898 9900
+8883 9886
+8883 9856
+8898 9842
+8927 9827
+9000 9798
+9030 9783
+9044 9768
+15 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+8883 9871
+8898 9856
+8927 9842
+9000 9812
+9030 9798
+9044 9783
+9044 9739
+9030 9724
+9000 9710
+8942 9710
+8912 9724
+8898 9739
+8883 9768
+8883 9710
+8898 9739
+15 MLine
+End
+
+Begin %I Rect
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+2304 2304 9216 9216 Rect
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+2315 2151
+2348 2140
+2370 2107
+2381 2052
+2381 2019
+2370 1964
+2348 1931
+2315 1920
+2293 1920
+2260 1931
+2238 1964
+2227 2019
+2227 2052
+2238 2107
+2260 2140
+2293 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+2293 2151
+2271 2140
+2260 2129
+2249 2107
+2238 2052
+2238 2019
+2249 1964
+2260 1942
+2271 1931
+2293 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+2315 1920
+2337 1931
+2348 1942
+2359 1964
+2370 2019
+2370 2052
+2359 2107
+2348 2129
+2337 2140
+2315 2151
+10 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 9216
+2304 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2304 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+3313 2107
+3335 2118
+3368 2151
+3368 1920
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3357 2140
+3357 1920
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3313 1920
+3411 1920
+2 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+3587 2151
+3620 2140
+3642 2107
+3653 2052
+3653 2019
+3642 1964
+3620 1931
+3587 1920
+3565 1920
+3532 1931
+3510 1964
+3499 2019
+3499 2052
+3510 2107
+3532 2140
+3565 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+3565 2151
+3543 2140
+3532 2129
+3521 2107
+3510 2052
+3510 2019
+3521 1964
+3532 1942
+3543 1931
+3565 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+3587 1920
+3609 1931
+3620 1942
+3631 1964
+3642 2019
+3642 2052
+3631 2107
+3620 2129
+3609 2140
+3587 2151
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+3807 2151
+3840 2140
+3862 2107
+3873 2052
+3873 2019
+3862 1964
+3840 1931
+3807 1920
+3785 1920
+3752 1931
+3730 1964
+3719 2019
+3719 2052
+3730 2107
+3752 2140
+3785 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+3785 2151
+3763 2140
+3752 2129
+3741 2107
+3730 2052
+3730 2019
+3741 1964
+3752 1942
+3763 1931
+3785 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+3807 1920
+3829 1931
+3840 1942
+3851 1964
+3862 2019
+3862 2052
+3851 2107
+3840 2129
+3829 2140
+3807 2151
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+4027 2151
+4060 2140
+4082 2107
+4093 2052
+4093 2019
+4082 1964
+4060 1931
+4027 1920
+4005 1920
+3972 1931
+3950 1964
+3939 2019
+3939 2052
+3950 2107
+3972 2140
+4005 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+4005 2151
+3983 2140
+3972 2129
+3961 2107
+3950 2052
+3950 2019
+3961 1964
+3972 1942
+3983 1931
+4005 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+4027 1920
+4049 1931
+4060 1942
+4071 1964
+4082 2019
+4082 2052
+4071 2107
+4060 2129
+4049 2140
+4027 2151
+10 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3686 9216
+3686 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3686 2304
+3686 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 20
+4673 2107
+4684 2096
+4673 2085
+4662 2096
+4662 2107
+4673 2129
+4684 2140
+4717 2151
+4761 2151
+4794 2140
+4805 2129
+4816 2107
+4816 2085
+4805 2063
+4772 2041
+4717 2019
+4695 2008
+4673 1986
+4662 1953
+4662 1920
+20 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+4761 2151
+4783 2140
+4794 2129
+4805 2107
+4805 2085
+4794 2063
+4761 2041
+4717 2019
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+4662 1942
+4673 1953
+4695 1953
+4750 1931
+4783 1931
+4805 1942
+4816 1953
+7 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+4695 1953
+4750 1920
+4794 1920
+4805 1931
+4816 1953
+4816 1975
+6 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+4970 2151
+5003 2140
+5025 2107
+5036 2052
+5036 2019
+5025 1964
+5003 1931
+4970 1920
+4948 1920
+4915 1931
+4893 1964
+4882 2019
+4882 2052
+4893 2107
+4915 2140
+4948 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+4948 2151
+4926 2140
+4915 2129
+4904 2107
+4893 2052
+4893 2019
+4904 1964
+4915 1942
+4926 1931
+4948 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+4970 1920
+4992 1931
+5003 1942
+5014 1964
+5025 2019
+5025 2052
+5014 2107
+5003 2129
+4992 2140
+4970 2151
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+5190 2151
+5223 2140
+5245 2107
+5256 2052
+5256 2019
+5245 1964
+5223 1931
+5190 1920
+5168 1920
+5135 1931
+5113 1964
+5102 2019
+5102 2052
+5113 2107
+5135 2140
+5168 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+5168 2151
+5146 2140
+5135 2129
+5124 2107
+5113 2052
+5113 2019
+5124 1964
+5135 1942
+5146 1931
+5168 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+5190 1920
+5212 1931
+5223 1942
+5234 1964
+5245 2019
+5245 2052
+5234 2107
+5223 2129
+5212 2140
+5190 2151
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+5410 2151
+5443 2140
+5465 2107
+5476 2052
+5476 2019
+5465 1964
+5443 1931
+5410 1920
+5388 1920
+5355 1931
+5333 1964
+5322 2019
+5322 2052
+5333 2107
+5355 2140
+5388 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+5388 2151
+5366 2140
+5355 2129
+5344 2107
+5333 2052
+5333 2019
+5344 1964
+5355 1942
+5366 1931
+5388 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+5410 1920
+5432 1931
+5443 1942
+5454 1964
+5465 2019
+5465 2052
+5454 2107
+5443 2129
+5432 2140
+5410 2151
+10 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5069 9216
+5069 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5069 2304
+5069 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+6055 2107
+6066 2096
+6055 2085
+6044 2096
+6044 2107
+6055 2129
+6066 2140
+6099 2151
+6143 2151
+6176 2140
+6187 2118
+6187 2085
+6176 2063
+6143 2052
+6110 2052
+15 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+6143 2151
+6165 2140
+6176 2118
+6176 2085
+6165 2063
+6143 2052
+6 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+6143 2052
+6165 2041
+6187 2019
+6198 1997
+6198 1964
+6187 1942
+6176 1931
+6143 1920
+6099 1920
+6066 1931
+6055 1942
+6044 1964
+6044 1975
+6055 1986
+6066 1975
+6055 1964
+16 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+6176 2030
+6187 1997
+6187 1964
+6176 1942
+6165 1931
+6143 1920
+6 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+6352 2151
+6385 2140
+6407 2107
+6418 2052
+6418 2019
+6407 1964
+6385 1931
+6352 1920
+6330 1920
+6297 1931
+6275 1964
+6264 2019
+6264 2052
+6275 2107
+6297 2140
+6330 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+6330 2151
+6308 2140
+6297 2129
+6286 2107
+6275 2052
+6275 2019
+6286 1964
+6297 1942
+6308 1931
+6330 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+6352 1920
+6374 1931
+6385 1942
+6396 1964
+6407 2019
+6407 2052
+6396 2107
+6385 2129
+6374 2140
+6352 2151
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+6572 2151
+6605 2140
+6627 2107
+6638 2052
+6638 2019
+6627 1964
+6605 1931
+6572 1920
+6550 1920
+6517 1931
+6495 1964
+6484 2019
+6484 2052
+6495 2107
+6517 2140
+6550 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+6550 2151
+6528 2140
+6517 2129
+6506 2107
+6495 2052
+6495 2019
+6506 1964
+6517 1942
+6528 1931
+6550 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+6572 1920
+6594 1931
+6605 1942
+6616 1964
+6627 2019
+6627 2052
+6616 2107
+6605 2129
+6594 2140
+6572 2151
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+6792 2151
+6825 2140
+6847 2107
+6858 2052
+6858 2019
+6847 1964
+6825 1931
+6792 1920
+6770 1920
+6737 1931
+6715 1964
+6704 2019
+6704 2052
+6715 2107
+6737 2140
+6770 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+6770 2151
+6748 2140
+6737 2129
+6726 2107
+6715 2052
+6715 2019
+6726 1964
+6737 1942
+6748 1931
+6770 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+6792 1920
+6814 1931
+6825 1942
+6836 1964
+6847 2019
+6847 2052
+6836 2107
+6825 2129
+6814 2140
+6792 2151
+10 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6451 9216
+6451 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6451 2304
+6451 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7526 2129
+7526 1920
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7537 2151
+7537 1920
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+7537 2151
+7416 1986
+7592 1986
+3 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7493 1920
+7570 1920
+2 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+7735 2151
+7768 2140
+7790 2107
+7801 2052
+7801 2019
+7790 1964
+7768 1931
+7735 1920
+7713 1920
+7680 1931
+7658 1964
+7647 2019
+7647 2052
+7658 2107
+7680 2140
+7713 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+7713 2151
+7691 2140
+7680 2129
+7669 2107
+7658 2052
+7658 2019
+7669 1964
+7680 1942
+7691 1931
+7713 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+7735 1920
+7757 1931
+7768 1942
+7779 1964
+7790 2019
+7790 2052
+7779 2107
+7768 2129
+7757 2140
+7735 2151
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+7955 2151
+7988 2140
+8010 2107
+8021 2052
+8021 2019
+8010 1964
+7988 1931
+7955 1920
+7933 1920
+7900 1931
+7878 1964
+7867 2019
+7867 2052
+7878 2107
+7900 2140
+7933 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+7933 2151
+7911 2140
+7900 2129
+7889 2107
+7878 2052
+7878 2019
+7889 1964
+7900 1942
+7911 1931
+7933 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+7955 1920
+7977 1931
+7988 1942
+7999 1964
+8010 2019
+8010 2052
+7999 2107
+7988 2129
+7977 2140
+7955 2151
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+8174 2151
+8207 2140
+8229 2107
+8240 2052
+8240 2019
+8229 1964
+8207 1931
+8174 1920
+8152 1920
+8120 1931
+8098 1964
+8087 2019
+8087 2052
+8098 2107
+8120 2140
+8152 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+8152 2151
+8131 2140
+8120 2129
+8109 2107
+8098 2052
+8098 2019
+8109 1964
+8120 1942
+8131 1931
+8152 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+8174 1920
+8196 1931
+8207 1942
+8218 1964
+8229 2019
+8229 2052
+8218 2107
+8207 2129
+8196 2140
+8174 2151
+10 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7834 9216
+7834 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7834 2304
+7834 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8831 2151
+8809 2041
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 19
+8809 2041
+8831 2063
+8864 2074
+8897 2074
+8930 2063
+8952 2041
+8963 2008
+8963 1986
+8952 1953
+8930 1931
+8897 1920
+8864 1920
+8831 1931
+8820 1942
+8809 1964
+8809 1975
+8820 1986
+8831 1975
+8820 1964
+19 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+8897 2074
+8919 2063
+8941 2041
+8952 2008
+8952 1986
+8941 1953
+8919 1931
+8897 1920
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8831 2151
+8941 2151
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+8831 2140
+8886 2140
+8941 2151
+3 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+9117 2151
+9150 2140
+9172 2107
+9183 2052
+9183 2019
+9172 1964
+9150 1931
+9117 1920
+9095 1920
+9062 1931
+9040 1964
+9029 2019
+9029 2052
+9040 2107
+9062 2140
+9095 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+9095 2151
+9073 2140
+9062 2129
+9051 2107
+9040 2052
+9040 2019
+9051 1964
+9062 1942
+9073 1931
+9095 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+9117 1920
+9139 1931
+9150 1942
+9161 1964
+9172 2019
+9172 2052
+9161 2107
+9150 2129
+9139 2140
+9117 2151
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+9337 2151
+9370 2140
+9392 2107
+9403 2052
+9403 2019
+9392 1964
+9370 1931
+9337 1920
+9315 1920
+9282 1931
+9260 1964
+9249 2019
+9249 2052
+9260 2107
+9282 2140
+9315 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+9315 2151
+9293 2140
+9282 2129
+9271 2107
+9260 2052
+9260 2019
+9271 1964
+9282 1942
+9293 1931
+9315 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+9337 1920
+9359 1931
+9370 1942
+9381 1964
+9392 2019
+9392 2052
+9381 2107
+9370 2129
+9359 2140
+9337 2151
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+9557 2151
+9590 2140
+9612 2107
+9623 2052
+9623 2019
+9612 1964
+9590 1931
+9557 1920
+9535 1920
+9502 1931
+9480 1964
+9469 2019
+9469 2052
+9480 2107
+9502 2140
+9535 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+9535 2151
+9513 2140
+9502 2129
+9491 2107
+9480 2052
+9480 2019
+9491 1964
+9502 1942
+9513 1931
+9535 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+9557 1920
+9579 1931
+9590 1942
+9601 1964
+9612 2019
+9612 2052
+9601 2107
+9590 2129
+9579 2140
+9557 2151
+10 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 9216
+9216 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2304
+9216 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 9216
+2304 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2304 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2580 9216
+2580 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2580 2304
+2580 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2857 9216
+2857 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2857 2304
+2857 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3133 9216
+3133 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3133 2304
+3133 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3410 9216
+3410 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3410 2304
+3410 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3686 9216
+3686 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3686 2304
+3686 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3963 9216
+3963 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3963 2304
+3963 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4239 9216
+4239 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4239 2304
+4239 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4516 9216
+4516 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4516 2304
+4516 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4792 9216
+4792 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4792 2304
+4792 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5069 9216
+5069 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5069 2304
+5069 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5345 9216
+5345 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5345 2304
+5345 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5622 9216
+5622 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5622 2304
+5622 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5898 9216
+5898 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5898 2304
+5898 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6175 9216
+6175 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6175 2304
+6175 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6451 9216
+6451 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6451 2304
+6451 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6728 9216
+6728 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6728 2304
+6728 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7004 9216
+7004 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7004 2304
+7004 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7281 9216
+7281 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7281 2304
+7281 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7557 9216
+7557 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7557 2304
+7557 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7834 9216
+7834 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7834 2304
+7834 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8110 9216
+8110 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8110 2304
+8110 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8387 9216
+8387 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8387 2304
+8387 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8663 9216
+8663 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8663 2304
+8663 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8940 9216
+8940 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8940 2304
+8940 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 9216
+9216 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2304
+9216 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+1365 2824
+1376 2813
+1365 2802
+1354 2813
+1354 2824
+1365 2846
+1376 2857
+1409 2868
+1453 2868
+1486 2857
+1497 2835
+1497 2802
+1486 2780
+1453 2769
+1420 2769
+15 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+1453 2868
+1475 2857
+1486 2835
+1486 2802
+1475 2780
+1453 2769
+6 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+1453 2769
+1475 2758
+1497 2736
+1508 2714
+1508 2681
+1497 2659
+1486 2648
+1453 2637
+1409 2637
+1376 2648
+1365 2659
+1354 2681
+1354 2692
+1365 2703
+1376 2692
+1365 2681
+16 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+1486 2747
+1497 2714
+1497 2681
+1486 2659
+1475 2648
+1453 2637
+6 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1596 2868
+1574 2758
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 19
+1574 2758
+1596 2780
+1629 2791
+1661 2791
+1694 2780
+1716 2758
+1727 2725
+1727 2703
+1716 2670
+1694 2648
+1661 2637
+1629 2637
+1596 2648
+1585 2659
+1574 2681
+1574 2692
+1585 2703
+1596 2692
+1585 2681
+19 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+1661 2791
+1683 2780
+1705 2758
+1716 2725
+1716 2703
+1705 2670
+1683 2648
+1661 2637
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1596 2868
+1705 2868
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+1596 2857
+1651 2857
+1705 2868
+3 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+1881 2868
+1914 2857
+1936 2824
+1947 2769
+1947 2736
+1936 2681
+1914 2648
+1881 2637
+1859 2637
+1826 2648
+1804 2681
+1793 2736
+1793 2769
+1804 2824
+1826 2857
+1859 2868
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+1859 2868
+1837 2857
+1826 2846
+1815 2824
+1804 2769
+1804 2736
+1815 2681
+1826 2659
+1837 2648
+1859 2637
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+1881 2637
+1903 2648
+1914 2659
+1925 2681
+1936 2736
+1936 2769
+1925 2824
+1914 2846
+1903 2857
+1881 2868
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+2101 2868
+2134 2857
+2156 2824
+2167 2769
+2167 2736
+2156 2681
+2134 2648
+2101 2637
+2079 2637
+2046 2648
+2024 2681
+2013 2736
+2013 2769
+2024 2824
+2046 2857
+2079 2868
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+2079 2868
+2057 2857
+2046 2846
+2035 2824
+2024 2769
+2024 2736
+2035 2681
+2046 2659
+2057 2648
+2079 2637
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+2101 2637
+2123 2648
+2134 2659
+2145 2681
+2156 2736
+2156 2769
+2145 2824
+2134 2846
+2123 2857
+2101 2868
+10 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2736
+9078 2736
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2736
+2442 2736
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1453 3926
+1453 3717
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1464 3948
+1464 3717
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+1464 3948
+1343 3783
+1519 3783
+3 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1420 3717
+1497 3717
+2 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+1661 3948
+1694 3937
+1716 3904
+1727 3849
+1727 3816
+1716 3761
+1694 3728
+1661 3717
+1640 3717
+1607 3728
+1585 3761
+1574 3816
+1574 3849
+1585 3904
+1607 3937
+1640 3948
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+1640 3948
+1618 3937
+1607 3926
+1596 3904
+1585 3849
+1585 3816
+1596 3761
+1607 3739
+1618 3728
+1640 3717
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+1661 3717
+1683 3728
+1694 3739
+1705 3761
+1716 3816
+1716 3849
+1705 3904
+1694 3926
+1683 3937
+1661 3948
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+1881 3948
+1914 3937
+1936 3904
+1947 3849
+1947 3816
+1936 3761
+1914 3728
+1881 3717
+1859 3717
+1826 3728
+1804 3761
+1793 3816
+1793 3849
+1804 3904
+1826 3937
+1859 3948
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+1859 3948
+1837 3937
+1826 3926
+1815 3904
+1804 3849
+1804 3816
+1815 3761
+1826 3739
+1837 3728
+1859 3717
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+1881 3717
+1903 3728
+1914 3739
+1925 3761
+1936 3816
+1936 3849
+1925 3904
+1914 3926
+1903 3937
+1881 3948
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+2101 3948
+2134 3937
+2156 3904
+2167 3849
+2167 3816
+2156 3761
+2134 3728
+2101 3717
+2079 3717
+2046 3728
+2024 3761
+2013 3816
+2013 3849
+2024 3904
+2046 3937
+2079 3948
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+2079 3948
+2057 3937
+2046 3926
+2035 3904
+2024 3849
+2024 3816
+2035 3761
+2046 3739
+2057 3728
+2079 3717
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+2101 3717
+2123 3728
+2134 3739
+2145 3761
+2156 3816
+2156 3849
+2145 3904
+2134 3926
+2123 3937
+2101 3948
+10 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 3816
+9078 3816
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3816
+2442 3816
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1453 5006
+1453 4797
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1464 5028
+1464 4797
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+1464 5028
+1343 4863
+1519 4863
+3 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1420 4797
+1497 4797
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1596 5028
+1574 4918
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 19
+1574 4918
+1596 4940
+1629 4951
+1661 4951
+1694 4940
+1716 4918
+1727 4885
+1727 4863
+1716 4830
+1694 4808
+1661 4797
+1629 4797
+1596 4808
+1585 4819
+1574 4841
+1574 4852
+1585 4863
+1596 4852
+1585 4841
+19 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+1661 4951
+1683 4940
+1705 4918
+1716 4885
+1716 4863
+1705 4830
+1683 4808
+1661 4797
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1596 5028
+1705 5028
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+1596 5017
+1651 5017
+1705 5028
+3 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+1881 5028
+1914 5017
+1936 4984
+1947 4929
+1947 4896
+1936 4841
+1914 4808
+1881 4797
+1859 4797
+1826 4808
+1804 4841
+1793 4896
+1793 4929
+1804 4984
+1826 5017
+1859 5028
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+1859 5028
+1837 5017
+1826 5006
+1815 4984
+1804 4929
+1804 4896
+1815 4841
+1826 4819
+1837 4808
+1859 4797
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+1881 4797
+1903 4808
+1914 4819
+1925 4841
+1936 4896
+1936 4929
+1925 4984
+1914 5006
+1903 5017
+1881 5028
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+2101 5028
+2134 5017
+2156 4984
+2167 4929
+2167 4896
+2156 4841
+2134 4808
+2101 4797
+2079 4797
+2046 4808
+2024 4841
+2013 4896
+2013 4929
+2024 4984
+2046 5017
+2079 5028
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+2079 5028
+2057 5017
+2046 5006
+2035 4984
+2024 4929
+2024 4896
+2035 4841
+2046 4819
+2057 4808
+2079 4797
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+2101 4797
+2123 4808
+2134 4819
+2145 4841
+2156 4896
+2156 4929
+2145 4984
+2134 5006
+2123 5017
+2101 5028
+10 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4896
+9078 4896
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4896
+2442 4896
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1376 6108
+1354 5998
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 19
+1354 5998
+1376 6020
+1409 6031
+1442 6031
+1475 6020
+1497 5998
+1508 5965
+1508 5943
+1497 5910
+1475 5888
+1442 5877
+1409 5877
+1376 5888
+1365 5899
+1354 5921
+1354 5932
+1365 5943
+1376 5932
+1365 5921
+19 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+1442 6031
+1464 6020
+1486 5998
+1497 5965
+1497 5943
+1486 5910
+1464 5888
+1442 5877
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1376 6108
+1486 6108
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+1376 6097
+1431 6097
+1486 6108
+3 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+1661 6108
+1694 6097
+1716 6064
+1727 6009
+1727 5976
+1716 5921
+1694 5888
+1661 5877
+1640 5877
+1607 5888
+1585 5921
+1574 5976
+1574 6009
+1585 6064
+1607 6097
+1640 6108
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+1640 6108
+1618 6097
+1607 6086
+1596 6064
+1585 6009
+1585 5976
+1596 5921
+1607 5899
+1618 5888
+1640 5877
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+1661 5877
+1683 5888
+1694 5899
+1705 5921
+1716 5976
+1716 6009
+1705 6064
+1694 6086
+1683 6097
+1661 6108
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+1881 6108
+1914 6097
+1936 6064
+1947 6009
+1947 5976
+1936 5921
+1914 5888
+1881 5877
+1859 5877
+1826 5888
+1804 5921
+1793 5976
+1793 6009
+1804 6064
+1826 6097
+1859 6108
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+1859 6108
+1837 6097
+1826 6086
+1815 6064
+1804 6009
+1804 5976
+1815 5921
+1826 5899
+1837 5888
+1859 5877
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+1881 5877
+1903 5888
+1914 5899
+1925 5921
+1936 5976
+1936 6009
+1925 6064
+1914 6086
+1903 6097
+1881 6108
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+2101 6108
+2134 6097
+2156 6064
+2167 6009
+2167 5976
+2156 5921
+2134 5888
+2101 5877
+2079 5877
+2046 5888
+2024 5921
+2013 5976
+2013 6009
+2024 6064
+2046 6097
+2079 6108
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+2079 6108
+2057 6097
+2046 6086
+2035 6064
+2024 6009
+2024 5976
+2035 5921
+2046 5899
+2057 5888
+2079 5877
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+2101 5877
+2123 5888
+2134 5899
+2145 5921
+2156 5976
+2156 6009
+2145 6064
+2134 6086
+2123 6097
+2101 6108
+10 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5976
+9078 5976
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5976
+2442 5976
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1376 7188
+1354 7078
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 19
+1354 7078
+1376 7100
+1409 7111
+1442 7111
+1475 7100
+1497 7078
+1508 7045
+1508 7023
+1497 6990
+1475 6968
+1442 6957
+1409 6957
+1376 6968
+1365 6979
+1354 7001
+1354 7012
+1365 7023
+1376 7012
+1365 7001
+19 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+1442 7111
+1464 7100
+1486 7078
+1497 7045
+1497 7023
+1486 6990
+1464 6968
+1442 6957
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1376 7188
+1486 7188
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+1376 7177
+1431 7177
+1486 7188
+3 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1596 7188
+1574 7078
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 19
+1574 7078
+1596 7100
+1629 7111
+1661 7111
+1694 7100
+1716 7078
+1727 7045
+1727 7023
+1716 6990
+1694 6968
+1661 6957
+1629 6957
+1596 6968
+1585 6979
+1574 7001
+1574 7012
+1585 7023
+1596 7012
+1585 7001
+19 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+1661 7111
+1683 7100
+1705 7078
+1716 7045
+1716 7023
+1705 6990
+1683 6968
+1661 6957
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1596 7188
+1705 7188
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+1596 7177
+1651 7177
+1705 7188
+3 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+1881 7188
+1914 7177
+1936 7144
+1947 7089
+1947 7056
+1936 7001
+1914 6968
+1881 6957
+1859 6957
+1826 6968
+1804 7001
+1793 7056
+1793 7089
+1804 7144
+1826 7177
+1859 7188
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+1859 7188
+1837 7177
+1826 7166
+1815 7144
+1804 7089
+1804 7056
+1815 7001
+1826 6979
+1837 6968
+1859 6957
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+1881 6957
+1903 6968
+1914 6979
+1925 7001
+1936 7056
+1936 7089
+1925 7144
+1914 7166
+1903 7177
+1881 7188
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+2101 7188
+2134 7177
+2156 7144
+2167 7089
+2167 7056
+2156 7001
+2134 6968
+2101 6957
+2079 6957
+2046 6968
+2024 7001
+2013 7056
+2013 7089
+2024 7144
+2046 7177
+2079 7188
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+2079 7188
+2057 7177
+2046 7166
+2035 7144
+2024 7089
+2024 7056
+2035 7001
+2046 6979
+2057 6968
+2079 6957
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+2101 6957
+2123 6968
+2134 6979
+2145 7001
+2156 7056
+2156 7089
+2145 7144
+2134 7166
+2123 7177
+2101 7188
+10 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 7056
+9078 7056
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 7056
+2442 7056
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 28
+1486 8235
+1475 8224
+1486 8213
+1497 8224
+1497 8235
+1486 8257
+1464 8268
+1431 8268
+1398 8257
+1376 8235
+1365 8213
+1354 8169
+1354 8103
+1365 8070
+1387 8048
+1420 8037
+1442 8037
+1475 8048
+1497 8070
+1508 8103
+1508 8114
+1497 8147
+1475 8169
+1442 8180
+1431 8180
+1398 8169
+1376 8147
+1365 8114
+28 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 9
+1431 8268
+1409 8257
+1387 8235
+1376 8213
+1365 8169
+1365 8103
+1376 8070
+1398 8048
+1420 8037
+9 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+1442 8037
+1464 8048
+1486 8070
+1497 8103
+1497 8114
+1486 8147
+1464 8169
+1442 8180
+8 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+1661 8268
+1694 8257
+1716 8224
+1727 8169
+1727 8136
+1716 8081
+1694 8048
+1661 8037
+1640 8037
+1607 8048
+1585 8081
+1574 8136
+1574 8169
+1585 8224
+1607 8257
+1640 8268
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+1640 8268
+1618 8257
+1607 8246
+1596 8224
+1585 8169
+1585 8136
+1596 8081
+1607 8059
+1618 8048
+1640 8037
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+1661 8037
+1683 8048
+1694 8059
+1705 8081
+1716 8136
+1716 8169
+1705 8224
+1694 8246
+1683 8257
+1661 8268
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+1881 8268
+1914 8257
+1936 8224
+1947 8169
+1947 8136
+1936 8081
+1914 8048
+1881 8037
+1859 8037
+1826 8048
+1804 8081
+1793 8136
+1793 8169
+1804 8224
+1826 8257
+1859 8268
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+1859 8268
+1837 8257
+1826 8246
+1815 8224
+1804 8169
+1804 8136
+1815 8081
+1826 8059
+1837 8048
+1859 8037
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+1881 8037
+1903 8048
+1914 8059
+1925 8081
+1936 8136
+1936 8169
+1925 8224
+1914 8246
+1903 8257
+1881 8268
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+2101 8268
+2134 8257
+2156 8224
+2167 8169
+2167 8136
+2156 8081
+2134 8048
+2101 8037
+2079 8037
+2046 8048
+2024 8081
+2013 8136
+2013 8169
+2024 8224
+2046 8257
+2079 8268
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+2079 8268
+2057 8257
+2046 8246
+2035 8224
+2024 8169
+2024 8136
+2035 8081
+2046 8059
+2057 8048
+2079 8037
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+2101 8037
+2123 8048
+2134 8059
+2145 8081
+2156 8136
+2156 8169
+2145 8224
+2134 8246
+2123 8257
+2101 8268
+10 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 8136
+9078 8136
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 8136
+2442 8136
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 28
+1486 9315
+1475 9304
+1486 9293
+1497 9304
+1497 9315
+1486 9337
+1464 9348
+1431 9348
+1398 9337
+1376 9315
+1365 9293
+1354 9249
+1354 9183
+1365 9150
+1387 9128
+1420 9117
+1442 9117
+1475 9128
+1497 9150
+1508 9183
+1508 9194
+1497 9227
+1475 9249
+1442 9260
+1431 9260
+1398 9249
+1376 9227
+1365 9194
+28 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 9
+1431 9348
+1409 9337
+1387 9315
+1376 9293
+1365 9249
+1365 9183
+1376 9150
+1398 9128
+1420 9117
+9 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+1442 9117
+1464 9128
+1486 9150
+1497 9183
+1497 9194
+1486 9227
+1464 9249
+1442 9260
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1596 9348
+1574 9238
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 19
+1574 9238
+1596 9260
+1629 9271
+1661 9271
+1694 9260
+1716 9238
+1727 9205
+1727 9183
+1716 9150
+1694 9128
+1661 9117
+1629 9117
+1596 9128
+1585 9139
+1574 9161
+1574 9172
+1585 9183
+1596 9172
+1585 9161
+19 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+1661 9271
+1683 9260
+1705 9238
+1716 9205
+1716 9183
+1705 9150
+1683 9128
+1661 9117
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1596 9348
+1705 9348
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+1596 9337
+1651 9337
+1705 9348
+3 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+1881 9348
+1914 9337
+1936 9304
+1947 9249
+1947 9216
+1936 9161
+1914 9128
+1881 9117
+1859 9117
+1826 9128
+1804 9161
+1793 9216
+1793 9249
+1804 9304
+1826 9337
+1859 9348
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+1859 9348
+1837 9337
+1826 9326
+1815 9304
+1804 9249
+1804 9216
+1815 9161
+1826 9139
+1837 9128
+1859 9117
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+1881 9117
+1903 9128
+1914 9139
+1925 9161
+1936 9216
+1936 9249
+1925 9304
+1914 9326
+1903 9337
+1881 9348
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+2101 9348
+2134 9337
+2156 9304
+2167 9249
+2167 9216
+2156 9161
+2134 9128
+2101 9117
+2079 9117
+2046 9128
+2024 9161
+2013 9216
+2013 9249
+2024 9304
+2046 9337
+2079 9348
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+2079 9348
+2057 9337
+2046 9326
+2035 9304
+2024 9249
+2024 9216
+2035 9161
+2046 9139
+2057 9128
+2079 9117
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+2101 9117
+2123 9128
+2134 9139
+2145 9161
+2156 9216
+2156 9249
+2145 9304
+2134 9326
+2123 9337
+2101 9348
+10 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 9216
+9078 9216
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 9216
+2442 9216
+2 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+4858 1621
+4880 1610
+4891 1599
+4902 1577
+4902 1555
+4891 1533
+4880 1522
+4858 1511
+4836 1511
+4814 1522
+4803 1533
+4792 1555
+4792 1577
+4803 1599
+4814 1610
+4836 1621
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+4814 1610
+4803 1588
+4803 1544
+4814 1522
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+4880 1522
+4891 1544
+4891 1588
+4880 1610
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 5
+4891 1599
+4902 1610
+4924 1621
+4924 1610
+4902 1610
+5 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 9
+4803 1533
+4792 1522
+4781 1500
+4781 1489
+4792 1467
+4825 1456
+4880 1456
+4913 1445
+4924 1434
+9 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+4781 1489
+4792 1478
+4825 1467
+4880 1467
+4913 1456
+4924 1434
+4924 1423
+4913 1401
+4880 1390
+4814 1390
+4781 1401
+4770 1423
+4770 1434
+4781 1456
+4814 1467
+15 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 17
+5001 1555
+5133 1555
+5133 1577
+5122 1599
+5111 1610
+5089 1621
+5056 1621
+5023 1610
+5001 1588
+4990 1555
+4990 1533
+5001 1500
+5023 1478
+5056 1467
+5078 1467
+5111 1478
+5133 1500
+17 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+5122 1555
+5122 1588
+5111 1610
+3 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+5056 1621
+5034 1610
+5012 1588
+5001 1555
+5001 1533
+5012 1500
+5034 1478
+5056 1467
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5221 1621
+5221 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5232 1621
+5232 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+5232 1588
+5254 1610
+5287 1621
+5309 1621
+5342 1610
+5353 1588
+5353 1467
+7 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+5309 1621
+5331 1610
+5342 1588
+5342 1467
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5188 1621
+5232 1621
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5188 1467
+5265 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5309 1467
+5386 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 17
+5452 1555
+5584 1555
+5584 1577
+5573 1599
+5562 1610
+5540 1621
+5507 1621
+5474 1610
+5452 1588
+5441 1555
+5441 1533
+5452 1500
+5474 1478
+5507 1467
+5529 1467
+5562 1478
+5584 1500
+17 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+5573 1555
+5573 1588
+5562 1610
+3 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+5507 1621
+5485 1610
+5463 1588
+5452 1555
+5452 1533
+5463 1500
+5485 1478
+5507 1467
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5672 1621
+5672 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5683 1621
+5683 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+5683 1555
+5694 1588
+5716 1610
+5738 1621
+5771 1621
+5782 1610
+5782 1599
+5771 1588
+5760 1599
+5771 1610
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5639 1621
+5683 1621
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5639 1467
+5716 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 13
+5859 1599
+5859 1588
+5848 1588
+5848 1599
+5859 1610
+5881 1621
+5925 1621
+5947 1610
+5958 1599
+5969 1577
+5969 1500
+5980 1478
+5991 1467
+13 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 5
+5958 1599
+5958 1500
+5969 1478
+5991 1467
+6002 1467
+5 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 11
+5958 1577
+5947 1566
+5881 1555
+5848 1544
+5837 1522
+5837 1500
+5848 1478
+5881 1467
+5914 1467
+5936 1478
+5958 1500
+11 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+5881 1555
+5859 1544
+5848 1522
+5848 1500
+5859 1478
+5881 1467
+6 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+6079 1698
+6079 1511
+6090 1478
+6112 1467
+6134 1467
+6156 1478
+6167 1500
+7 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+6090 1698
+6090 1511
+6101 1478
+6112 1467
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6046 1621
+6134 1621
+2 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+6255 1687
+6244 1676
+6233 1687
+6244 1698
+4 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6244 1621
+6244 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6255 1621
+6255 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6211 1621
+6255 1621
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6211 1467
+6288 1467
+2 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+6431 1621
+6464 1610
+6486 1588
+6497 1555
+6497 1533
+6486 1500
+6464 1478
+6431 1467
+6409 1467
+6376 1478
+6354 1500
+6343 1533
+6343 1555
+6354 1588
+6376 1610
+6409 1621
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+6409 1621
+6387 1610
+6365 1588
+6354 1555
+6354 1533
+6365 1500
+6387 1478
+6409 1467
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+6431 1467
+6453 1478
+6475 1500
+6486 1533
+6486 1555
+6475 1588
+6453 1610
+6431 1621
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6585 1621
+6585 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6596 1621
+6596 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+6596 1588
+6618 1610
+6651 1621
+6673 1621
+6706 1610
+6717 1588
+6717 1467
+7 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+6673 1621
+6695 1610
+6706 1588
+6706 1467
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6552 1621
+6596 1621
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6552 1467
+6629 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6673 1467
+6750 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+771 5133
+1002 5133
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+771 5144
+1002 5144
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 14
+881 5133
+859 5111
+848 5089
+848 5067
+859 5034
+881 5012
+914 5001
+936 5001
+969 5012
+991 5034
+1002 5067
+1002 5089
+991 5111
+969 5133
+14 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+848 5067
+859 5045
+881 5023
+914 5012
+936 5012
+969 5023
+991 5045
+1002 5067
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+771 5100
+771 5144
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1002 5133
+1002 5177
+2 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+782 5265
+793 5254
+782 5243
+771 5254
+4 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+848 5254
+1002 5254
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+848 5265
+1002 5265
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+848 5221
+848 5265
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1002 5221
+1002 5298
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+870 5463
+848 5474
+892 5474
+870 5463
+859 5452
+848 5430
+848 5386
+859 5364
+870 5353
+892 5353
+903 5364
+914 5386
+936 5441
+947 5463
+958 5474
+15 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+881 5353
+892 5364
+903 5386
+925 5441
+936 5463
+947 5474
+980 5474
+991 5463
+1002 5441
+1002 5397
+991 5375
+980 5364
+958 5353
+1002 5353
+980 5364
+15 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+771 5562
+958 5562
+991 5573
+1002 5595
+1002 5617
+991 5639
+969 5650
+7 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+771 5573
+958 5573
+991 5584
+1002 5595
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+848 5529
+848 5617
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 13
+870 5727
+881 5727
+881 5716
+870 5716
+859 5727
+848 5749
+848 5793
+859 5815
+870 5826
+892 5837
+969 5837
+991 5848
+1002 5859
+13 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 5
+870 5826
+969 5826
+991 5837
+1002 5859
+1002 5870
+5 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 11
+892 5826
+903 5815
+914 5749
+925 5716
+947 5705
+969 5705
+991 5716
+1002 5749
+1002 5782
+991 5804
+969 5826
+11 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+914 5749
+925 5727
+947 5716
+969 5716
+991 5727
+1002 5749
+6 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+848 5947
+1002 5947
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+848 5958
+1002 5958
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+881 5958
+859 5980
+848 6013
+848 6035
+859 6068
+881 6079
+1002 6079
+7 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+848 6035
+859 6057
+881 6068
+1002 6068
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+848 5914
+848 5958
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1002 5914
+1002 5991
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1002 6035
+1002 6112
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 18
+881 6299
+892 6288
+903 6299
+892 6310
+881 6310
+859 6288
+848 6266
+848 6233
+859 6200
+881 6178
+914 6167
+936 6167
+969 6178
+991 6200
+1002 6233
+1002 6255
+991 6288
+969 6310
+18 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+848 6233
+859 6211
+881 6189
+914 6178
+936 6178
+969 6189
+991 6211
+1002 6233
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 17
+914 6387
+914 6519
+892 6519
+870 6508
+859 6497
+848 6475
+848 6442
+859 6409
+881 6387
+914 6376
+936 6376
+969 6387
+991 6409
+1002 6442
+1002 6464
+991 6497
+969 6519
+17 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+914 6508
+881 6508
+859 6497
+3 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+848 6442
+859 6420
+881 6398
+914 6387
+936 6387
+969 6398
+991 6420
+1002 6442
+8 MLine
+End
+
+Begin %I MLine
+[1 0 0 1 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+0 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 500
+2304 5975
+2305 7816
+2307 4950
+2308 6253
+2310 6424
+2311 7247
+2312 7226
+2314 7637
+2315 5613
+2316 5493
+2318 6547
+2319 6692
+2321 5964
+2322 7196
+2323 5558
+2325 5777
+2326 5879
+2328 6986
+2329 6683
+2330 6582
+2332 7053
+2333 6524
+2334 7103
+2336 6771
+2337 6085
+2339 6261
+2340 7658
+2341 6191
+2343 5763
+2344 5180
+2345 6647
+2347 6690
+2348 6033
+2350 5517
+2351 6947
+2352 6031
+2354 7215
+2355 5701
+2357 6826
+2358 4979
+2359 7053
+2361 7059
+2362 6081
+2363 5251
+2365 6631
+2366 7749
+2368 7219
+2369 7019
+2370 5147
+2372 6824
+2373 7042
+2375 5319
+2376 6485
+2377 6702
+2379 7476
+2380 6497
+2381 5692
+2383 7014
+2384 6696
+2386 7546
+2387 6374
+2388 7684
+2390 5675
+2391 6634
+2392 5907
+2394 6945
+2395 4627
+2397 5267
+2398 7319
+2399 6397
+2401 6962
+2402 6413
+2404 5424
+2405 4277
+2406 7412
+2408 5725
+2409 5438
+2410 7077
+2412 7297
+2413 6874
+2415 5718
+2416 7183
+2417 6089
+2419 6439
+2420 5788
+2422 7577
+2423 7135
+2424 4970
+2426 4854
+2427 7340
+2428 6868
+2430 7205
+2431 4963
+2433 5641
+2434 6536
+2435 4679
+2437 6735
+2438 4672
+2439 8293
+2441 6474
+2442 7717
+2444 7297
+2445 5583
+2446 7717
+2448 6229
+2449 7615
+2451 5946
+2452 7426
+2453 7569
+2455 7305
+2456 7030
+2457 5945
+2459 6252
+2460 6256
+2462 5037
+2463 7580
+2464 6202
+2466 6322
+2467 7211
+2469 6680
+2470 7020
+2471 7596
+2473 6861
+2474 6352
+2475 6302
+2477 6238
+2478 5681
+2480 7024
+2481 7194
+2482 7181
+2484 5997
+2485 7477
+2486 6567
+2488 5778
+2489 7126
+2491 7143
+2492 4981
+2493 7184
+2495 6655
+2496 6103
+2498 7571
+2499 7773
+2500 4533
+2502 7966
+2503 6383
+2504 5874
+2506 6128
+2507 7545
+2509 7794
+2510 5779
+2511 6850
+2513 6570
+2514 6612
+2516 6800
+2517 7324
+2518 6811
+2520 6237
+2521 5937
+2522 7023
+2524 5700
+2525 6549
+2527 5356
+2528 4062
+2529 5495
+2531 7192
+2532 7316
+2533 6114
+2535 7015
+2536 6818
+2538 6597
+2539 7315
+2540 6174
+2542 5431
+2543 4943
+2545 7012
+2546 6702
+2547 7220
+2549 6142
+2550 7649
+2551 6097
+2553 7626
+2554 5399
+2556 6739
+2557 5159
+2558 6984
+2560 6165
+2561 6070
+2563 7594
+2564 6333
+2565 6072
+2567 6981
+2568 6118
+2569 8009
+2571 6786
+2572 3964
+2574 7069
+2575 6203
+2576 7315
+2578 6263
+2579 6910
+2580 7867
+2582 7539
+2583 6058
+2585 7242
+2586 7161
+2587 4653
+2589 5701
+2590 5840
+2592 7394
+2593 6140
+2594 6588
+2596 7405
+2597 7363
+2598 6270
+2600 6828
+2601 6694
+2603 6633
+2604 5843
+2605 6859
+2607 7988
+2608 8335
+2610 6485
+2611 6899
+2612 6402
+2614 6170
+2615 6849
+2616 6781
+2618 5607
+2619 7433
+2621 6231
+2622 6930
+2623 6528
+2625 5108
+2626 5909
+2627 6618
+2629 6798
+2630 7872
+2632 6204
+2633 5670
+2634 6511
+2636 7405
+2637 7134
+2639 6024
+2640 5627
+2641 7504
+2643 6354
+2644 6328
+2645 6850
+2647 6170
+2648 5736
+2650 5071
+2651 7988
+2652 5623
+2654 7860
+2655 8050
+2657 6341
+2658 6585
+2659 7083
+2661 6648
+2662 6756
+2663 5424
+2665 6470
+2666 7593
+2668 5424
+2669 6352
+2670 6943
+2672 6103
+2673 5837
+2674 7117
+2676 6315
+2677 5418
+2679 6215
+2680 6400
+2681 6010
+2683 7503
+2684 7385
+2686 6992
+2687 6667
+2688 6781
+2690 5817
+2691 5413
+2692 5412
+2694 5498
+2695 4809
+2697 6155
+2698 6572
+2699 5742
+2701 6998
+2702 7159
+2704 5752
+2705 6282
+2706 7428
+2708 6185
+2709 5320
+2710 5352
+2712 7322
+2713 6880
+2715 5045
+2716 8073
+2717 6522
+2719 6304
+2720 6838
+2721 7607
+2723 6454
+2724 4543
+2726 5443
+2727 4373
+2728 6075
+2730 4438
+2731 6222
+2733 6471
+2734 6127
+2735 4718
+2737 6646
+2738 7497
+2739 6643
+2741 6507
+2742 7559
+2744 5945
+2745 6344
+2746 5749
+2748 3931
+2749 5983
+2751 5519
+2752 7380
+2753 6519
+2755 6871
+2756 6904
+2757 4866
+2759 6241
+2760 6975
+2762 6489
+2763 6289
+2764 7682
+2766 6684
+2767 7146
+2768 4765
+2770 6388
+2771 5567
+2773 6850
+2774 7391
+2775 6612
+2777 6446
+2778 6030
+2780 4342
+2781 4427
+2782 6825
+2784 5752
+2785 6568
+2786 7571
+2788 6257
+2789 6656
+2791 6926
+2792 6282
+2793 6897
+2795 6227
+2796 5113
+2798 7030
+2799 7242
+2800 5510
+2802 7129
+2803 6568
+2804 6192
+2806 6959
+2807 5321
+2809 4693
+2810 6100
+2811 6395
+2813 6826
+2814 5490
+2815 6969
+2817 6078
+2818 7152
+2820 6091
+2821 7381
+2822 6617
+2824 7695
+2825 5593
+2827 6622
+2828 6288
+2829 6702
+2831 6934
+2832 6624
+2833 5925
+2835 7798
+2836 4630
+2838 6688
+2839 7861
+2840 6913
+2842 6210
+2843 6419
+2845 6804
+2846 7672
+2847 7459
+2849 7743
+2850 6174
+2851 7115
+2853 7227
+2854 6955
+2856 4666
+2857 5437
+2858 7272
+2860 7161
+2861 6287
+2862 6510
+2864 7009
+2865 6230
+2867 8104
+2868 5213
+2869 7444
+2871 5270
+2872 6554
+2874 8316
+2875 6849
+2876 7049
+2878 7424
+2879 5947
+2880 7143
+2882 4998
+2883 6869
+2885 6666
+2886 5571
+2887 4916
+2889 7033
+2890 7221
+2892 6641
+2893 5717
+2894 5146
+2896 5780
+2897 6069
+2898 5560
+2900 6828
+2901 6165
+2903 5213
+2904 7420
+2905 5039
+2907 6388
+2908 7049
+2909 6891
+2911 6493
+2912 7226
+2914 7190
+2915 6023
+2916 7258
+2918 7024
+2919 7329
+2921 5204
+2922 6316
+2923 7768
+2925 5235
+2926 3984
+2927 4882
+2929 5740
+2930 6666
+2932 5163
+2933 6564
+2934 7307
+2936 5580
+2937 7181
+2939 6624
+2940 7831
+2941 7859
+2943 5221
+2944 7092
+2945 7608
+2947 5700
+2948 6040
+2950 7511
+2951 5388
+2952 7134
+2954 6344
+2955 7619
+2956 5623
+2958 5272
+2959 5360
+2961 6245
+2962 6129
+2963 6190
+2965 6880
+2966 6481
+2968 6064
+2969 5978
+2970 5826
+2972 6860
+2973 7539
+2974 5309
+2976 5697
+2977 6036
+2979 5645
+2980 7292
+2981 7775
+2983 5403
+2984 7097
+2986 6945
+2987 6146
+2988 5767
+2990 6920
+2991 6175
+2992 6384
+2994 6065
+500 MLine
+End
+
+Begin %I MLine
+[1 0 0 1 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+0 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 500
+2994 6065
+2995 6508
+2997 6632
+2998 5605
+2999 7427
+3001 6132
+3002 6997
+3003 5107
+3005 8057
+3006 5980
+3008 6607
+3009 5047
+3010 7159
+3012 6130
+3013 6326
+3015 5480
+3016 7144
+3017 6460
+3019 6057
+3020 5236
+3021 7111
+3023 6834
+3024 7882
+3026 6138
+3027 6672
+3028 4868
+3030 5932
+3031 6708
+3033 5904
+3034 6156
+3035 7098
+3037 6948
+3038 7216
+3039 5263
+3041 4902
+3042 5075
+3044 6038
+3045 5928
+3046 6721
+3048 6916
+3049 6175
+3050 6186
+3052 5165
+3053 6628
+3055 4563
+3056 6825
+3057 6994
+3059 5837
+3060 6024
+3062 4145
+3063 6181
+3064 7149
+3066 6230
+3067 7353
+3068 5027
+3070 6784
+3071 5176
+3073 4734
+3074 6185
+3075 7018
+3077 6738
+3078 7112
+3080 5657
+3081 6499
+3082 6577
+3084 5404
+3085 6748
+3086 7088
+3088 6050
+3089 4645
+3091 7826
+3092 4502
+3093 3982
+3095 6140
+3096 6906
+3097 5287
+3099 6297
+3100 7275
+3102 7638
+3103 6758
+3104 6217
+3106 6206
+3107 6472
+3109 7863
+3110 5915
+3111 6128
+3113 7946
+3114 6022
+3115 6673
+3117 7093
+3118 7403
+3120 5984
+3121 7523
+3122 5666
+3124 5830
+3125 7180
+3127 7926
+3128 5279
+3129 7104
+3131 6301
+3132 7283
+3133 6673
+3135 5524
+3136 4270
+3138 7139
+3139 5666
+3140 6830
+3142 6505
+3143 4847
+3144 7208
+3146 5955
+3147 6739
+3149 4931
+3150 6824
+3151 6430
+3153 6334
+3154 6755
+3156 6898
+3157 7908
+3158 7316
+3160 4991
+3161 5627
+3162 6798
+3164 7575
+3165 4947
+3167 5466
+3168 7527
+3169 6864
+3171 5942
+3172 6255
+3174 6357
+3175 6552
+3176 8008
+3178 5726
+3179 5386
+3180 7356
+3182 7055
+3183 7835
+3185 5904
+3186 7610
+3187 6764
+3189 6366
+3190 7155
+3192 6349
+3193 6661
+3194 6692
+3196 7036
+3197 6412
+3198 6167
+3200 5942
+3201 6170
+3203 6511
+3204 6497
+3205 5323
+3207 5020
+3208 6034
+3209 7502
+3211 7104
+3212 6304
+3214 4423
+3215 5941
+3216 6554
+3218 5133
+3219 5137
+3221 4899
+3222 5826
+3223 7202
+3225 5999
+3226 5980
+3227 7764
+3229 5558
+3230 5769
+3232 6808
+3233 6655
+3234 7062
+3236 4576
+3237 7493
+3239 5320
+3240 6538
+3241 6106
+3243 6974
+3244 6782
+3245 5881
+3247 5960
+3248 6582
+3250 3852
+3251 7165
+3252 5777
+3254 4462
+3255 6883
+3256 5868
+3258 6677
+3259 7032
+3261 7121
+3262 6284
+3263 4604
+3265 6944
+3266 5429
+3268 5106
+3269 4632
+3270 5302
+3272 7407
+3273 6297
+3274 4845
+3276 5363
+3277 5750
+3279 6514
+3280 6256
+3281 6940
+3283 5749
+3284 5088
+3286 5680
+3287 6105
+3288 5626
+3290 7455
+3291 6419
+3292 7427
+3294 6426
+3295 6968
+3297 7535
+3298 6764
+3299 7084
+3301 6368
+3302 7328
+3303 6864
+3305 7209
+3306 5261
+3308 6392
+3309 4682
+3310 5981
+3312 6751
+3313 6832
+3315 5489
+3316 6844
+3317 6692
+3319 6347
+3320 7442
+3321 5362
+3323 5816
+3324 6621
+3326 6946
+3327 7012
+3328 5654
+3330 5382
+3331 7440
+3333 4981
+3334 6342
+3335 6539
+3337 5497
+3338 7107
+3339 6330
+3341 7525
+3342 6899
+3344 5995
+3345 5421
+3346 6763
+3348 6741
+3349 5918
+3350 6332
+3352 6261
+3353 5289
+3355 6792
+3356 4720
+3357 6069
+3359 5393
+3360 7078
+3362 6579
+3363 5048
+3364 6334
+3366 4833
+3367 5472
+3368 7092
+3370 5130
+3371 8076
+3373 5672
+3374 5522
+3375 5711
+3377 7683
+3378 6997
+3380 6467
+3381 6152
+3382 6038
+3384 6242
+3385 4935
+3386 7055
+3388 6717
+3389 7209
+3391 6157
+3392 7196
+3393 5341
+3395 7441
+3396 7034
+3397 6058
+3399 7014
+3400 6908
+3402 7481
+3403 6465
+3404 6024
+3406 5161
+3407 7598
+3409 4797
+3410 6655
+3411 6232
+3413 7690
+3414 4949
+3415 7138
+3417 5030
+3418 4984
+3420 6002
+3421 5609
+3422 6021
+3424 6210
+3425 6712
+3427 5799
+3428 4447
+3429 5318
+3431 6674
+3432 6104
+3433 5491
+3435 5034
+3436 5408
+3438 5728
+3439 5729
+3440 7040
+3442 6414
+3443 6618
+3444 4612
+3446 5057
+3447 5917
+3449 5631
+3450 7749
+3451 5845
+3453 4696
+3454 6539
+3456 5306
+3457 6940
+3458 6095
+3460 5522
+3461 7480
+3462 7401
+3464 6061
+3465 4705
+3467 7143
+3468 6591
+3469 6361
+3471 6358
+3472 6579
+3474 5328
+3475 5058
+3476 5359
+3478 7628
+3479 4818
+3480 6228
+3482 6697
+3483 5229
+3485 7214
+3486 6968
+3487 6231
+3489 7966
+3490 6855
+3491 5392
+3493 6562
+3494 4965
+3496 5518
+3497 4392
+3498 6042
+3500 5510
+3501 5253
+3503 7226
+3504 5400
+3505 5482
+3507 5709
+3508 6324
+3509 5405
+3511 5800
+3512 6493
+3514 5151
+3515 5342
+3516 5332
+3518 6004
+3519 6017
+3521 6112
+3522 4149
+3523 6556
+3525 6055
+3526 4613
+3527 6550
+3529 7414
+3530 5444
+3532 5983
+3533 5153
+3534 6227
+3536 6975
+3537 6840
+3538 6669
+3540 5521
+3541 7013
+3543 6924
+3544 6700
+3545 6718
+3547 6761
+3548 6997
+3550 4070
+3551 5336
+3552 5382
+3554 7298
+3555 6985
+3556 5151
+3558 7633
+3559 5992
+3561 4105
+3562 7280
+3563 6925
+3565 5363
+3566 6286
+3568 6211
+3569 4586
+3570 5155
+3572 4908
+3573 6782
+3574 6281
+3576 4295
+3577 6229
+3579 6564
+3580 3982
+3581 6056
+3583 4917
+3584 6610
+3585 7452
+3587 6288
+3588 6866
+3590 6604
+3591 5803
+3592 5523
+3594 7327
+3595 6162
+3597 5427
+3598 4539
+3599 4636
+3601 6353
+3602 6531
+3603 6937
+3605 6264
+3606 5553
+3608 7460
+3609 6216
+3610 5923
+3612 7448
+3613 6211
+3615 5896
+3616 7463
+3617 7677
+3619 7453
+3620 6312
+3621 6029
+3623 6315
+3624 5449
+3626 5130
+3627 5696
+3628 6288
+3630 5038
+3631 6149
+3632 5816
+3634 5556
+3635 6803
+3637 6792
+3638 6528
+3639 4853
+3641 6032
+3642 5143
+3644 5579
+3645 5671
+3646 7076
+3648 6538
+3649 4431
+3650 5194
+3652 6770
+3653 6072
+3655 4156
+3656 4607
+3657 7255
+3659 5704
+3660 6602
+3662 6843
+3663 6291
+3664 5185
+3666 7251
+3667 6110
+3668 5283
+3670 6565
+3671 6153
+3673 6825
+3674 5929
+3675 4326
+3677 5884
+3678 6694
+3679 4817
+3681 5716
+3682 7328
+3684 6636
+500 MLine
+End
+
+Begin %I MLine
+[1 0 0 1 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+0 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 500
+3684 6636
+3685 6170
+3686 5820
+3688 5297
+3689 5708
+3691 4592
+3692 4857
+3693 6834
+3695 7258
+3696 6691
+3697 6333
+3699 7118
+3700 5369
+3702 6478
+3703 6327
+3704 6422
+3706 5175
+3707 6853
+3709 6431
+3710 5454
+3711 5344
+3713 6855
+3714 5590
+3715 7694
+3717 6550
+3718 7201
+3720 6486
+3721 4999
+3722 7183
+3724 5553
+3725 6642
+3726 4676
+3728 6758
+3729 4332
+3731 5495
+3732 5165
+3733 5613
+3735 5879
+3736 4700
+3738 4972
+3739 4334
+3740 6682
+3742 7116
+3743 5894
+3744 6361
+3746 5605
+3747 6007
+3749 5479
+3750 5883
+3751 5141
+3753 7290
+3754 6674
+3756 4964
+3757 5153
+3758 7665
+3760 4429
+3761 4644
+3762 4841
+3764 6395
+3765 5078
+3767 4876
+3768 6966
+3769 5723
+3771 7599
+3772 7060
+3773 5417
+3775 3796
+3776 5048
+3778 6809
+3779 5829
+3780 6202
+3782 5439
+3783 7151
+3785 5412
+3786 6694
+3787 4841
+3789 7062
+3790 5192
+3791 4741
+3793 4764
+3794 4839
+3796 6243
+3797 5745
+3798 5906
+3800 7574
+3801 4236
+3803 6197
+3804 7421
+3805 3958
+3807 6458
+3808 7604
+3809 5816
+3811 4430
+3812 5677
+3814 5400
+3815 5773
+3816 6096
+3818 3143
+3819 5402
+3820 7683
+3822 5902
+3823 6980
+3825 4711
+3826 4456
+3827 6765
+3829 6019
+3830 5095
+3832 4937
+3833 5773
+3834 5615
+3836 6371
+3837 6926
+3838 6176
+3840 6255
+3841 6747
+3843 7824
+3844 6753
+3845 6128
+3847 5596
+3848 3728
+3850 5860
+3851 5295
+3852 5202
+3854 5454
+3855 5691
+3856 5828
+3858 6077
+3859 4998
+3861 7756
+3862 6009
+3863 5641
+3865 4587
+3866 5874
+3867 5728
+3869 5814
+3870 6350
+3872 6834
+3873 5732
+3874 5525
+3876 5287
+3877 5901
+3879 6770
+3880 5634
+3881 6675
+3883 5801
+3884 6346
+3885 6345
+3887 3944
+3888 6323
+3890 7631
+3891 5038
+3892 5339
+3894 5718
+3895 6260
+3897 4656
+3898 5858
+3899 5914
+3901 5009
+3902 6377
+3903 6192
+3905 3838
+3906 5374
+3908 6010
+3909 6069
+3910 4908
+3912 6819
+3913 5734
+3914 5874
+3916 3925
+3917 6544
+3919 7007
+3920 4534
+3921 4806
+3923 6988
+3924 4958
+3926 4422
+3927 6334
+3928 4903
+3930 7559
+3931 6882
+3932 7246
+3934 7262
+3935 6130
+3937 3709
+3938 5727
+3939 6338
+3941 4823
+3942 6971
+3944 6382
+3945 5852
+3946 5377
+3948 6003
+3949 6432
+3950 5140
+3952 5964
+3953 6563
+3955 4698
+3956 7282
+3957 5322
+3959 6201
+3960 5999
+3961 7515
+3963 7765
+3964 6574
+3966 6829
+3967 5806
+3968 6656
+3970 6808
+3971 6480
+3973 4308
+3974 5807
+3975 4915
+3977 5140
+3978 5656
+3979 6004
+3981 7332
+3982 6410
+3984 5599
+3985 5602
+3986 5153
+3988 4864
+3989 5306
+3991 5471
+3992 5498
+3993 5240
+3995 6296
+3996 5165
+3997 7085
+3999 4961
+4000 4641
+4002 6059
+4003 5248
+4004 6500
+4006 5729
+4007 6164
+4008 4816
+4010 4014
+4011 5666
+4013 4345
+4014 4585
+4015 5984
+4017 4942
+4018 4814
+4020 5578
+4021 4211
+4022 7063
+4024 4061
+4025 4690
+4026 5719
+4028 6475
+4029 7119
+4031 4972
+4032 5645
+4033 7593
+4035 5954
+4036 6742
+4038 4801
+4039 6177
+4040 7284
+4042 6661
+4043 5013
+4044 4135
+4046 4466
+4047 4334
+4049 3960
+4050 4191
+4051 5243
+4053 7723
+4054 6634
+4056 5310
+4057 5735
+4058 7055
+4060 6541
+4061 7189
+4062 5539
+4064 6938
+4065 4548
+4067 4666
+4068 6024
+4069 5072
+4071 5066
+4072 4461
+4073 5766
+4075 4976
+4076 4248
+4078 6228
+4079 6556
+4080 6204
+4082 4209
+4083 7114
+4085 6552
+4086 6478
+4087 6333
+4089 5969
+4090 5169
+4091 7604
+4093 6236
+4094 6638
+4096 5579
+4097 6672
+4098 6449
+4100 5180
+4101 6388
+4103 4234
+4104 4391
+4105 4651
+4107 6191
+4108 6119
+4109 5000
+4111 5240
+4112 6411
+4114 5193
+4115 7274
+4116 4555
+4118 5460
+4119 3571
+4120 6938
+4122 6110
+4123 4595
+4125 5067
+4126 5035
+4127 7996
+4129 4122
+4130 6991
+4132 4827
+4133 4823
+4134 5016
+4136 5928
+4137 4319
+4138 5626
+4140 5762
+4141 5980
+4143 5354
+4144 7235
+4145 5318
+4147 6232
+4148 5351
+4150 5777
+4151 5357
+4152 5312
+4154 4073
+4155 5107
+4156 6022
+4158 3898
+4159 5845
+4161 4139
+4162 7499
+4163 6649
+4165 5487
+4166 6164
+4167 5959
+4169 5074
+4170 5523
+4172 5028
+4173 6271
+4174 5409
+4176 7406
+4177 5963
+4179 5488
+4180 4874
+4181 5595
+4183 4673
+4184 4818
+4185 4402
+4187 5036
+4188 5949
+4190 5548
+4191 4019
+4192 4972
+4194 4866
+4195 6727
+4197 5365
+4198 4732
+4199 6428
+4201 3299
+4202 4261
+4203 5529
+4205 5748
+4206 3059
+4208 5490
+4209 4973
+4210 6017
+4212 4664
+4213 3796
+4214 4896
+4216 4452
+4217 6510
+4219 4747
+4220 5521
+4221 4193
+4223 4976
+4224 4771
+4226 4945
+4227 4345
+4228 5805
+4230 5689
+4231 4711
+4232 6199
+4234 4049
+4235 5158
+4237 3510
+4238 5769
+4239 5298
+4241 5926
+4242 4664
+4244 6605
+4245 5619
+4246 4499
+4248 5892
+4249 5683
+4250 5952
+4252 6122
+4253 4120
+4255 6840
+4256 4934
+4257 5462
+4259 3921
+4260 6392
+4261 3845
+4263 4635
+4264 5077
+4266 5357
+4267 5407
+4268 4526
+4270 5522
+4271 5350
+4273 6841
+4274 5624
+4275 6043
+4277 6499
+4278 6918
+4279 7601
+4281 5802
+4282 4525
+4284 5221
+4285 6049
+4286 4410
+4288 4131
+4289 3651
+4291 6234
+4292 5942
+4293 5465
+4295 3740
+4296 4637
+4297 5424
+4299 5638
+4300 5997
+4302 5276
+4303 5294
+4304 5911
+4306 5647
+4307 3782
+4308 5702
+4310 6094
+4311 6285
+4313 5162
+4314 6497
+4315 5088
+4317 5544
+4318 4826
+4320 4705
+4321 5791
+4322 3410
+4324 5219
+4325 5887
+4326 7402
+4328 4437
+4329 4834
+4331 3945
+4332 5536
+4333 4938
+4335 4561
+4336 4568
+4338 4726
+4339 4517
+4340 4483
+4342 4659
+4343 5097
+4344 4829
+4346 6115
+4347 4631
+4349 4721
+4350 6862
+4351 6986
+4353 4668
+4354 6283
+4355 3399
+4357 4840
+4358 4100
+4360 3782
+4361 5525
+4362 5422
+4364 5764
+4365 4929
+4367 4125
+4368 4868
+4369 6211
+4371 5907
+4372 4884
+4373 4001
+500 MLine
+End
+
+Begin %I MLine
+[1 0 0 1 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+0 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 500
+4373 4001
+4375 6307
+4376 5989
+4378 4968
+4379 5533
+4380 4396
+4382 5916
+4383 5373
+4385 5302
+4386 5738
+4387 4804
+4389 4709
+4390 6196
+4391 4473
+4393 7109
+4394 5018
+4396 4731
+4397 5907
+4398 4788
+4400 6437
+4401 5667
+4402 5365
+4404 3650
+4405 4945
+4407 3976
+4408 4879
+4409 4407
+4411 6014
+4412 4096
+4414 5222
+4415 6216
+4416 5301
+4418 5797
+4419 4803
+4420 4612
+4422 4215
+4423 4238
+4425 6240
+4426 4646
+4427 4413
+4429 5132
+4430 4949
+4432 5271
+4433 5711
+4434 4627
+4436 5084
+4437 5256
+4438 5503
+4440 4790
+4441 5481
+4443 5128
+4444 4624
+4445 4050
+4447 4813
+4448 5188
+4449 4801
+4451 5200
+4452 4263
+4454 5300
+4455 4722
+4456 5144
+4458 4835
+4459 4681
+4461 4219
+4462 3599
+4463 5365
+4465 6045
+4466 5993
+4467 3658
+4469 4438
+4470 4802
+4472 4337
+4473 5162
+4474 4701
+4476 5821
+4477 5553
+4479 6380
+4480 4313
+4481 4448
+4483 5026
+4484 5513
+4485 4882
+4487 4593
+4488 6002
+4490 4918
+4491 5307
+4492 4385
+4494 5196
+4495 4424
+4496 5074
+4498 5191
+4499 2876
+4501 5532
+4502 4186
+4503 5173
+4505 4020
+4506 5470
+4508 6183
+4509 5789
+4510 5566
+4512 7397
+4513 4030
+4514 4571
+4516 5151
+4517 4024
+4519 4736
+4520 5770
+4521 5857
+4523 3621
+4524 3999
+4526 4367
+4527 4136
+4528 4411
+4530 6602
+4531 5130
+4532 4375
+4534 4136
+4535 4354
+4537 4480
+4538 5302
+4539 5085
+4541 5188
+4542 4070
+4543 5418
+4545 3478
+4546 4261
+4548 4781
+4549 4659
+4550 5145
+4552 4164
+4553 4856
+4555 6950
+4556 4181
+4557 4789
+4559 5802
+4560 6507
+4561 6295
+4563 2845
+4564 3797
+4566 4108
+4567 5561
+4568 5758
+4570 5495
+4571 6497
+4573 4735
+4574 3843
+4575 5613
+4577 4142
+4578 4111
+4579 4694
+4581 4239
+4582 4944
+4584 5527
+4585 4880
+4586 4081
+4588 5156
+4589 4686
+4590 5033
+4592 4636
+4593 4331
+4595 4534
+4596 4100
+4597 5606
+4599 5805
+4600 5260
+4602 5058
+4603 3519
+4604 5371
+4606 4458
+4607 5803
+4608 6090
+4610 3593
+4611 6145
+4613 5581
+4614 3785
+4615 3642
+4617 5094
+4618 4028
+4620 6271
+4621 4236
+4622 4135
+4624 5583
+4625 3876
+4626 5511
+4628 4542
+4629 3819
+4631 3291
+4632 4485
+4633 5821
+4635 2945
+4636 4217
+4637 4247
+4639 5298
+4640 5690
+4642 4138
+4643 4686
+4644 6049
+4646 5350
+4647 3809
+4649 4497
+4650 4178
+4651 5365
+4653 4685
+4654 4860
+4655 3455
+4657 3674
+4658 4198
+4660 4522
+4661 5279
+4662 4441
+4664 4086
+4665 3529
+4667 4959
+4668 4313
+4669 4104
+4671 4460
+4672 5557
+4673 4769
+4675 4642
+4676 5072
+4678 4229
+4679 4214
+4680 4135
+4682 3574
+4683 5016
+4684 3918
+4686 3988
+4687 4638
+4689 3379
+4690 3912
+4691 3752
+4693 4410
+4694 3841
+4696 3147
+4697 5088
+4698 4660
+4700 4743
+4701 4963
+4702 3857
+4704 4519
+4705 4511
+4707 6638
+4708 3514
+4709 3953
+4711 4098
+4712 4830
+4714 4213
+4715 4801
+4716 4252
+4718 4835
+4719 4799
+4720 4029
+4722 4666
+4723 5112
+4725 4237
+4726 3929
+4727 5011
+4729 5031
+4730 4380
+4731 5397
+4733 4341
+4734 4368
+4736 3439
+4737 5105
+4738 4054
+4740 4108
+4741 3825
+4743 3774
+4744 4465
+4745 4408
+4747 3875
+4748 3327
+4749 4335
+4751 5010
+4752 3419
+4754 3467
+4755 5674
+4756 3545
+4758 4611
+4759 5626
+4761 4621
+4762 4163
+4763 4579
+4765 4164
+4766 3478
+4767 4734
+4769 4378
+4770 4729
+4772 4792
+4773 2917
+4774 4123
+4776 4701
+4777 3921
+4778 4556
+4780 4234
+4781 3942
+4783 3896
+4784 4881
+4785 3423
+4787 4234
+4788 3534
+4790 3747
+4791 3514
+4792 3246
+4794 5988
+4795 4811
+4796 3302
+4798 3206
+4799 4655
+4801 4662
+4802 3633
+4803 3951
+4805 3603
+4806 3966
+4808 3180
+4809 3612
+4810 3946
+4812 5075
+4813 4119
+4814 4512
+4816 4386
+4817 3565
+4819 4355
+4820 3819
+4821 4626
+4823 4929
+4824 3337
+4825 5396
+4827 3200
+4828 4573
+4830 4451
+4831 3233
+4832 4307
+4834 2969
+4835 4928
+4837 4062
+4838 4411
+4839 4053
+4841 4414
+4842 3122
+4843 3562
+4845 3344
+4846 5002
+4848 3488
+4849 3619
+4850 5116
+4852 4652
+4853 3643
+4855 3366
+4856 3762
+4857 3847
+4859 3509
+4860 3357
+4861 3683
+4863 3601
+4864 4759
+4866 3734
+4867 4163
+4868 3625
+4870 3684
+4871 3988
+4872 3739
+4874 3013
+4875 3886
+4877 4262
+4878 4208
+4879 3747
+4881 3695
+4882 3499
+4884 4756
+4885 4083
+4886 3708
+4888 4346
+4889 4228
+4890 4875
+4892 4302
+4893 3129
+4895 3595
+4896 3206
+4897 3657
+4899 3897
+4900 3714
+4902 4546
+4903 3941
+4904 3987
+4906 3399
+4907 3728
+4908 4032
+4910 4304
+4911 3607
+4913 4106
+4914 3293
+4915 4661
+4917 4094
+4918 3563
+4920 3370
+4921 3443
+4922 3681
+4924 3064
+4925 3626
+4926 3979
+4928 5253
+4929 3296
+4931 5318
+4932 3374
+4933 4219
+4935 3011
+4936 4587
+4937 5470
+4939 3823
+4940 3979
+4942 2946
+4943 3030
+4944 4637
+4946 3945
+4947 3750
+4949 4495
+4950 6040
+4951 3667
+4953 4144
+4954 3213
+4955 4001
+4957 3328
+4958 3290
+4960 4729
+4961 3859
+4962 2930
+4964 3991
+4965 4481
+4967 3328
+4968 4332
+4969 3967
+4971 3367
+4972 3517
+4973 4507
+4975 3048
+4976 4018
+4978 3168
+4979 3484
+4980 3019
+4982 3981
+4983 3219
+4984 3418
+4986 4245
+4987 2792
+4989 4461
+4990 4808
+4991 3574
+4993 3264
+4994 4046
+4996 4112
+4997 3535
+4998 3439
+5000 3694
+5001 2853
+5002 3746
+5004 3686
+5005 2864
+5007 4195
+5008 3154
+5009 3880
+5011 3566
+5012 3762
+5014 4567
+5015 3416
+5016 3373
+5018 4005
+5019 3810
+5020 4561
+5022 4018
+5023 3856
+5025 3308
+5026 3627
+5027 3297
+5029 3280
+5030 3243
+5031 3710
+5033 4076
+5034 3332
+5036 5182
+5037 2777
+5038 5224
+5040 2786
+5041 2890
+5043 4560
+5044 3147
+5045 4228
+5047 4021
+5048 2970
+5049 4851
+5051 4002
+5052 3527
+5054 3231
+5055 3118
+5056 3904
+5058 3773
+5059 3850
+5061 3070
+5062 3773
+5063 3879
+500 MLine
+End
+
+Begin %I MLine
+[1 0 0 1 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+0 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 500
+5063 3879
+5065 3441
+5066 4339
+5067 3743
+5069 4075
+5070 3051
+5072 4049
+5073 4028
+5074 3206
+5076 3346
+5077 3790
+5078 3009
+5080 3329
+5081 3559
+5083 4121
+5084 3576
+5085 3450
+5087 2877
+5088 3404
+5090 3346
+5091 3182
+5092 2917
+5094 3480
+5095 2904
+5096 3539
+5098 4145
+5099 3587
+5101 4768
+5102 2948
+5103 3781
+5105 2945
+5106 3064
+5108 4570
+5109 3327
+5110 4250
+5112 2959
+5113 3737
+5114 3623
+5116 3186
+5117 3718
+5119 2897
+5120 2984
+5121 4505
+5123 3127
+5124 3793
+5125 4309
+5127 3412
+5128 3062
+5130 3808
+5131 2960
+5132 3298
+5134 3533
+5135 3190
+5137 3457
+5138 2788
+5139 3136
+5141 3197
+5142 3653
+5143 3043
+5145 3119
+5146 3192
+5148 3071
+5149 3284
+5150 3910
+5152 3711
+5153 3611
+5155 3356
+5156 3826
+5157 2917
+5159 3157
+5160 3312
+5161 4161
+5163 3561
+5164 3936
+5166 3871
+5167 3756
+5168 3744
+5170 3495
+5171 3013
+5172 3203
+5174 4517
+5175 3220
+5177 3923
+5178 3751
+5179 3117
+5181 4169
+5182 3055
+5184 3006
+5185 3403
+5186 2931
+5188 3579
+5189 3710
+5190 3432
+5192 3242
+5193 4417
+5195 3799
+5196 3103
+5197 2984
+5199 4025
+5200 4361
+5202 3475
+5203 3287
+5204 3220
+5206 4545
+5207 3662
+5208 3381
+5210 3982
+5211 2876
+5213 3510
+5214 3643
+5215 4000
+5217 2982
+5218 3840
+5219 3011
+5221 3072
+5222 2792
+5224 3720
+5225 2818
+5226 3808
+5228 3551
+5229 3639
+5231 2946
+5232 3743
+5233 3761
+5235 3335
+5236 3316
+5237 2889
+5239 3142
+5240 2788
+5242 3173
+5243 2806
+5244 3410
+5246 3148
+5247 3062
+5249 3936
+5250 2843
+5251 4039
+5253 3585
+5254 3841
+5255 2896
+5257 3356
+5258 3013
+5260 4154
+5261 3697
+5262 2950
+5264 3484
+5265 3633
+5266 3557
+5268 3037
+5269 3457
+5271 3461
+5272 3551
+5273 4206
+5275 3111
+5276 3106
+5278 3003
+5279 3547
+5280 3048
+5282 3915
+5283 2977
+5284 3170
+5286 3217
+5287 3901
+5289 3362
+5290 2792
+5291 3396
+5293 3077
+5294 3785
+5296 3244
+5297 3439
+5298 3267
+5300 3481
+5301 3080
+5302 3152
+5304 3088
+5305 3310
+5307 3713
+5308 3899
+5309 3541
+5311 3177
+5312 3118
+5313 3647
+5315 2988
+5316 2756
+5318 2727
+5319 2948
+5320 3117
+5322 3935
+5323 2961
+5325 3929
+5326 3201
+5327 3554
+5329 3020
+5330 3453
+5331 3253
+5333 3033
+5334 4427
+5336 2836
+5337 2921
+5338 4102
+5340 2814
+5341 3323
+5343 2988
+5344 3271
+5345 3288
+5347 2836
+5348 3468
+5349 2984
+5351 2853
+5352 2792
+5354 3206
+5355 2745
+5356 3203
+5358 3541
+5359 3217
+5360 2989
+5362 3379
+5363 3504
+5365 3251
+5366 3346
+5367 3070
+5369 3489
+5370 2946
+5372 3064
+5373 3160
+5374 2881
+5376 3045
+5377 3585
+5378 2801
+5380 3463
+5381 3051
+5383 3284
+5384 3000
+5385 3717
+5387 2952
+5388 3091
+5390 3180
+5391 3575
+5392 3165
+5394 3031
+5395 2950
+5396 2944
+5398 3282
+5399 3210
+5401 3319
+5402 3373
+5403 2919
+5405 2818
+5406 2843
+5407 3016
+5409 2716
+5410 2792
+5412 2853
+5413 2788
+5414 2897
+5416 3626
+5417 3268
+5419 2818
+5420 3655
+5421 3558
+5423 3364
+5424 3011
+5425 2898
+5427 2786
+5428 2919
+5430 3606
+5431 3429
+5432 2716
+5434 2898
+5435 2745
+5437 3037
+5438 2940
+5439 3036
+5441 2814
+5442 3247
+5443 2853
+5445 2930
+5446 2914
+5448 2817
+5449 2981
+5450 2976
+5452 2910
+5453 2878
+5454 2817
+5456 2727
+5457 3086
+5459 2817
+5460 2822
+5461 3188
+5463 3008
+5464 2898
+5466 2945
+5467 2896
+5468 2817
+5470 2916
+5471 2986
+5472 3204
+5474 2898
+5475 2756
+5477 3578
+5478 2898
+5479 3110
+5481 2853
+5482 2836
+5484 3011
+5485 3708
+5486 3119
+5488 3087
+5489 3051
+5490 3256
+5492 2942
+5493 3278
+5495 2838
+5496 2814
+5497 3027
+5499 3363
+5500 2806
+5501 2897
+5503 3186
+5504 2756
+5506 2921
+5507 3441
+5508 2858
+5510 2806
+5511 2984
+5513 3324
+5514 2939
+5515 3112
+5517 2838
+5518 2943
+5519 2955
+5521 3062
+5522 3133
+5524 3072
+5525 2881
+5526 2944
+5528 2890
+5529 3096
+5531 3266
+5532 3733
+5533 2766
+5535 2930
+5536 2756
+5537 3186
+5539 2788
+5540 2981
+5542 2788
+5543 3252
+5544 2890
+5546 3093
+5547 3157
+5548 3029
+5550 3290
+5551 2917
+5553 2992
+5554 2862
+5555 2942
+5557 3112
+5558 2917
+5560 2862
+5561 3132
+5562 2876
+5564 2910
+5565 2952
+5566 2814
+5568 2943
+5569 2999
+5571 2818
+5572 2876
+5573 3586
+5575 3002
+5576 3130
+5578 3532
+5579 3157
+5580 2817
+5582 2792
+5583 3246
+5584 2716
+5586 3204
+5587 2822
+5589 3351
+5590 3107
+5591 3048
+5593 3037
+5594 3502
+5595 3297
+5597 3290
+5598 3196
+5600 3259
+5601 2839
+5602 3924
+5604 2976
+5605 2777
+5607 3056
+5608 2914
+5609 2864
+5611 2777
+5612 2814
+5613 3511
+5615 2777
+5616 3017
+5618 3115
+5619 2792
+5620 3005
+5622 2814
+5623 2839
+5625 2864
+5626 2727
+5627 3180
+5629 2981
+5630 2977
+5631 3086
+5633 2955
+5634 2988
+5636 2988
+5637 2914
+5638 2772
+5640 3015
+5641 3077
+5642 2973
+5644 3170
+5645 3077
+5647 2973
+5648 2877
+5649 3246
+5651 2943
+5652 2992
+5654 2788
+5655 3052
+5656 2772
+5658 2814
+5659 2817
+5660 2872
+5662 2818
+5663 2801
+5665 3387
+5666 2876
+5667 3006
+5669 2788
+5670 2817
+5672 2862
+5673 2814
+5674 2814
+5676 2872
+5677 2801
+5678 3055
+5680 2838
+5681 2772
+5683 2801
+5684 2865
+5685 2931
+5687 3045
+5688 2952
+5689 2862
+5691 2982
+5692 2792
+5694 2948
+5695 2727
+5696 2885
+5698 3159
+5699 3161
+5701 3156
+5702 2806
+5703 2876
+5705 2716
+5706 2956
+5707 2716
+5709 2933
+5710 3131
+5712 2945
+5713 2919
+5714 2981
+5716 2727
+5717 2885
+5719 3035
+5720 2772
+5721 2727
+5723 2853
+5724 2843
+5725 2955
+5727 2727
+5728 2843
+5730 2845
+5731 2756
+5732 2756
+5734 2727
+5735 3152
+5736 3472
+5738 2818
+5739 2814
+5741 3105
+5742 3108
+5743 2872
+5745 3054
+5746 2727
+5748 2727
+5749 2921
+5750 2727
+5752 2943
+5753 2756
+500 MLine
+End
+
+Begin %I MLine
+[1 0 0 1 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+0 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 500
+5753 2756
+5754 2756
+5756 2857
+5757 3025
+5759 2814
+5760 2727
+5761 2945
+5763 2756
+5764 2843
+5766 2756
+5767 3115
+5768 2777
+5770 3071
+5771 2916
+5772 2727
+5774 2788
+5775 2756
+5777 2981
+5778 2902
+5779 2838
+5781 2992
+5782 2942
+5784 2986
+5785 2772
+5786 2872
+5788 3157
+5789 2772
+5790 3007
+5792 2801
+5793 2788
+5795 2910
+5796 2772
+5797 3196
+5799 2950
+5800 2872
+5801 2788
+5803 3064
+5804 2788
+5806 2801
+5807 3006
+5808 3215
+5810 2788
+5811 2872
+5813 2772
+5814 3046
+5815 2986
+5817 2942
+5818 2788
+5819 3016
+5821 2817
+5822 2897
+5824 2878
+5825 2955
+5826 2727
+5828 2792
+5829 2745
+5831 2716
+5832 2766
+5833 3071
+5835 2806
+5836 2745
+5837 2889
+5839 3368
+5840 2986
+5842 2890
+5843 2961
+5844 2982
+5846 2716
+5847 2898
+5848 2982
+5850 2745
+5851 2836
+5853 2745
+5854 2858
+5855 2766
+5857 2745
+5858 2745
+5860 2745
+5861 3028
+5862 2806
+5864 2716
+5865 2845
+5866 2716
+5868 2876
+5869 2912
+5871 2839
+5872 2843
+5873 2946
+5875 2756
+5876 2857
+5878 2939
+5879 2916
+5880 2777
+5882 2777
+5883 2864
+5884 2792
+5886 2777
+5887 2727
+5889 2727
+5890 2885
+5891 2843
+5893 2727
+5894 2756
+5895 2727
+5897 2788
+5898 2885
+5900 2843
+5901 2727
+5902 2864
+5904 2727
+5905 2792
+5907 2864
+5908 2727
+5909 2756
+5911 2727
+5912 2756
+5913 2727
+5915 2916
+5916 2756
+5918 2727
+5919 2756
+5920 2792
+5922 2853
+5923 2727
+5925 2727
+5926 2839
+5927 2792
+5929 2857
+5930 2914
+5931 2976
+5933 3013
+5934 2766
+5936 2745
+5937 3064
+5938 2836
+5940 2961
+5941 2919
+5942 3050
+5944 2716
+5945 2716
+5947 2766
+5948 2786
+5949 2716
+5951 2786
+5952 2836
+5954 2716
+5955 2716
+5956 2716
+5958 3048
+5959 2815
+5960 2766
+5962 2786
+5963 2716
+5965 2990
+5966 2766
+5967 2716
+5969 2806
+5970 3096
+5972 2766
+5973 2716
+5974 2836
+5976 2745
+5977 2902
+5978 2960
+5980 2889
+5981 2745
+5983 2716
+5984 2945
+5985 2916
+5987 2845
+5988 2806
+5989 2716
+5991 2786
+5992 2815
+5994 2806
+5995 2716
+5996 2745
+5998 2806
+5999 2766
+6001 2716
+6002 2853
+6003 2815
+6005 2933
+6006 2786
+6007 2912
+6009 2716
+6010 2716
+6012 2716
+6013 2766
+6014 3028
+6016 2716
+6017 2716
+6019 2745
+6020 2841
+6021 2745
+6023 2836
+6024 2815
+6025 2961
+6027 2845
+6028 2745
+6030 2841
+6031 2836
+6032 2716
+6034 2766
+6035 2716
+6036 2716
+6038 2836
+6039 2716
+6041 2786
+6042 2766
+6043 2745
+6045 2716
+6046 2716
+6048 2745
+6049 2716
+6050 2716
+6052 2766
+6053 2786
+6054 2716
+6056 2845
+6057 2716
+6059 2745
+6060 2876
+6061 2766
+6063 2766
+6064 2786
+6066 2716
+6067 2716
+6068 2933
+6070 2716
+6071 2716
+6072 2716
+6074 2745
+6075 2716
+6077 2716
+6078 2786
+6079 2716
+6081 2745
+6082 2716
+6083 2853
+6085 2806
+6086 2716
+6088 2766
+6089 2845
+6090 2876
+6092 2786
+6093 2716
+6095 2836
+6096 2841
+6097 2745
+6099 2845
+6100 2874
+6101 2940
+6103 2845
+6104 2876
+6106 2766
+6107 2806
+6108 2806
+6110 2716
+6111 2841
+6113 2716
+6114 2745
+6115 2766
+6117 2716
+6118 2716
+6119 2716
+6121 2986
+6122 2853
+6124 2845
+6125 2745
+6126 3047
+6128 3093
+6129 2745
+6130 2716
+6132 2745
+6133 2716
+6135 2745
+6136 2716
+6137 2858
+6139 2716
+6140 2766
+6142 2716
+6143 2806
+6144 2745
+6146 2745
+6147 2766
+6148 2806
+6150 3020
+6151 2716
+6153 2876
+6154 2845
+6155 2766
+6157 2786
+6158 2786
+6160 2716
+6161 2745
+6162 2806
+6164 2716
+6165 2716
+6166 2745
+6168 2716
+6169 2745
+6171 2745
+6172 2745
+6173 2716
+6175 2716
+6176 2745
+6177 2716
+6179 2716
+6180 2716
+6182 2766
+6183 2716
+6184 2815
+6186 2745
+6187 2716
+6189 2745
+6190 2716
+6191 2716
+6193 2766
+6194 2944
+6195 2919
+6197 2716
+6198 2745
+6200 2845
+6201 2716
+6202 2716
+6204 2716
+6205 2716
+6207 2716
+6208 2786
+6209 2716
+6211 2716
+6212 2745
+6213 2815
+6215 2806
+6216 2716
+6218 2836
+6219 2716
+6220 2786
+6222 2836
+6223 2716
+6224 2716
+6226 2716
+6227 2786
+6229 2845
+6230 2716
+6231 2716
+6233 2916
+6234 2745
+6236 2716
+6237 2786
+6238 2745
+6240 2786
+6241 2806
+6242 2745
+6244 2716
+6245 2716
+6247 2786
+6248 2766
+6249 2853
+6251 2716
+6252 2716
+6254 2766
+6255 2766
+6256 2716
+6258 2745
+6259 2745
+6260 2716
+6262 2815
+6263 2766
+6265 2919
+6266 3047
+6267 2944
+6269 2944
+6270 2766
+6271 2766
+6273 2716
+6274 2716
+6276 2815
+6277 2716
+6278 2716
+6280 2716
+6281 2716
+6283 2845
+6284 2815
+6285 2716
+6287 2716
+6288 2766
+6289 2836
+6291 2716
+6292 2716
+6294 2716
+6295 2745
+6296 2716
+6298 2766
+6299 2716
+6301 2815
+6302 2745
+6303 2716
+6305 2745
+6306 2716
+6307 2786
+6309 2716
+6310 2858
+6312 2766
+6313 2786
+6314 2745
+6316 2745
+6317 2766
+6318 2786
+6320 2716
+6321 2716
+6323 2716
+6324 2716
+6325 2806
+6327 2716
+6328 2716
+6330 2745
+6331 2836
+6332 2716
+6334 2716
+6335 2745
+6336 2716
+6338 2716
+6339 2716
+6341 2716
+6342 2716
+6343 2786
+6345 2745
+6346 2845
+6348 2716
+6349 2745
+6350 2716
+6352 2845
+6353 2716
+6354 2716
+6356 2841
+6357 2766
+6359 2766
+6360 2806
+6361 2745
+6363 2745
+6364 2716
+6365 2766
+6367 2766
+6368 2716
+6370 2874
+6371 2858
+6372 2815
+6374 2716
+6375 2745
+6377 2716
+6378 2716
+6379 2716
+6381 2716
+6382 2786
+6383 2745
+6385 2766
+6386 2815
+6388 2716
+6389 2716
+6390 2716
+6392 2786
+6393 2745
+6395 2766
+6396 2716
+6397 2766
+6399 2716
+6400 2716
+6401 2806
+6403 2716
+6404 2716
+6406 2716
+6407 2716
+6408 2716
+6410 2716
+6411 2716
+6412 2766
+6414 2716
+6415 2716
+6417 2716
+6418 2716
+6419 2766
+6421 2874
+6422 2745
+6424 2836
+6425 2745
+6426 2716
+6428 2766
+6429 2716
+6430 2716
+6432 2716
+6433 2716
+6435 2766
+6436 2745
+6437 2786
+6439 2745
+6440 2876
+6442 2766
+6443 2766
+500 MLine
+End
+
+Begin %I MLine
+[1 0 0 1 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+0 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 500
+6443 2766
+6444 2716
+6446 2716
+6447 2745
+6448 2716
+6450 2716
+6451 2716
+6453 2716
+6454 2716
+6455 2745
+6457 2745
+6458 2716
+6459 2716
+6461 2716
+6462 2745
+6464 2716
+6465 2745
+6466 2745
+6468 2716
+6469 2716
+6471 2716
+6472 2716
+6473 2745
+6475 2716
+6476 2716
+6477 2716
+6479 2745
+6480 2716
+6482 2716
+6483 2716
+6484 2716
+6486 2716
+6487 2745
+6489 2716
+6490 2786
+6491 2716
+6493 2745
+6494 2716
+6495 2745
+6497 2716
+6498 2716
+6500 2716
+6501 2716
+6502 2716
+6504 2745
+6505 2716
+6506 2716
+6508 2716
+6509 2745
+6511 2745
+6512 2716
+6513 2716
+6515 2745
+6516 2716
+6518 2716
+6519 2716
+6520 2766
+6522 2716
+6523 2716
+6524 2766
+6526 2716
+6527 2745
+6529 2745
+6530 2716
+6531 2716
+6533 2716
+6534 2716
+6536 2745
+6537 2716
+6538 2716
+6540 2716
+6541 2716
+6542 2716
+6544 2716
+6545 2716
+6547 2716
+6548 2716
+6549 2716
+6551 2716
+6552 2716
+6553 2716
+6555 2766
+6556 2716
+6558 2716
+6559 2716
+6560 2716
+6562 2716
+6563 2766
+6565 2716
+6566 2716
+6567 2745
+6569 2716
+6570 2716
+6571 2716
+6573 2716
+6574 2716
+6576 2716
+6577 2716
+6578 2716
+6580 2716
+6581 2716
+6583 2745
+6584 2745
+6585 2716
+6587 2745
+6588 2716
+6589 2716
+6591 2716
+6592 2716
+6594 2716
+6595 2716
+6596 2716
+6598 2716
+6599 2716
+6600 2716
+6602 2716
+6603 2716
+6605 2716
+6606 2716
+6607 2716
+6609 2716
+6610 2716
+6612 2716
+6613 2766
+6614 2716
+6616 2716
+6617 2766
+6618 2716
+6620 2716
+6621 2716
+6623 2716
+6624 2806
+6625 2716
+6627 2745
+6628 2716
+6630 2716
+6631 2716
+6632 2716
+6634 2716
+6635 2745
+6636 2716
+6638 2745
+6639 2716
+6641 2716
+6642 2716
+6643 2745
+6645 2716
+6646 2745
+6648 2745
+6649 2716
+6650 2745
+6652 2716
+6653 2716
+6654 2716
+6656 2766
+6657 2716
+6659 2716
+6660 2716
+6661 2716
+6663 2716
+6664 2716
+6665 2745
+6667 2716
+6668 2745
+6670 2745
+6671 2716
+6672 2716
+6674 2716
+6675 2716
+6677 2745
+6678 2745
+6679 2716
+6681 2716
+6682 2716
+6683 2745
+6685 2766
+6686 2766
+6688 2716
+6689 2716
+6690 2716
+6692 2716
+6693 2716
+6695 2716
+6696 2716
+6697 2745
+6699 2716
+6700 2745
+6701 2716
+6703 2716
+6704 2716
+6706 2716
+6707 2716
+6708 2716
+6710 2745
+6711 2716
+6712 2716
+6714 2716
+6715 2716
+6717 2716
+6718 2716
+6719 2836
+6721 2745
+6722 2716
+6724 2716
+6725 2716
+6726 2716
+6728 2716
+6729 2716
+6730 2766
+6732 2745
+6733 2716
+6735 2716
+6736 2716
+6737 2716
+6739 2716
+6740 2716
+6742 2745
+6743 2716
+6744 2745
+6746 2716
+6747 2716
+6748 2716
+6750 2716
+6751 2745
+6753 2716
+6754 2716
+6755 2716
+6757 2745
+6758 2745
+6759 2716
+6761 2716
+6762 2786
+6764 2745
+6765 2716
+6766 2716
+6768 2716
+6769 2716
+6771 2716
+6772 2716
+6773 2745
+6775 2745
+6776 2716
+6777 2716
+6779 2745
+6780 2745
+6782 2716
+6783 2716
+6784 2716
+6786 2745
+6787 2716
+6789 2716
+6790 2716
+6791 2716
+6793 2766
+6794 2716
+6795 2716
+6797 2716
+6798 2716
+6800 2716
+6801 2716
+6802 2716
+6804 2716
+6805 2716
+6806 2716
+6808 2716
+6809 2716
+6811 2745
+6812 2786
+6813 2786
+6815 2745
+6816 2716
+6818 2716
+6819 2716
+6820 2716
+6822 2745
+6823 2716
+6824 2745
+6826 2716
+6827 2716
+6829 2716
+6830 2716
+6831 2716
+6833 2716
+6834 2716
+6836 2716
+6837 2716
+6838 2716
+6840 2716
+6841 2745
+6842 2716
+6844 2716
+6845 2716
+6847 2745
+6848 2745
+6849 2716
+6851 2745
+6852 2716
+6853 2716
+6855 2745
+6856 2716
+6858 2716
+6859 2716
+6860 2716
+6862 2716
+6863 2716
+6865 2716
+6866 2716
+6867 2716
+6869 2716
+6870 2716
+6871 2716
+6873 2716
+6874 2716
+6876 2716
+6877 2745
+6878 2716
+6880 2745
+6881 2716
+6883 2716
+6884 2716
+6885 2716
+6887 2716
+6888 2716
+6889 2716
+6891 2716
+6892 2716
+6894 2716
+6895 2716
+6896 2716
+6898 2716
+6899 2716
+6900 2716
+6902 2716
+6903 2716
+6905 2716
+6906 2745
+6907 2716
+6909 2716
+6910 2716
+6912 2716
+6913 2716
+6914 2716
+6916 2716
+6917 2716
+6918 2716
+6920 2716
+6921 2716
+6923 2716
+6924 2745
+6925 2716
+6927 2716
+6928 2716
+6930 2716
+6931 2716
+6932 2716
+6934 2716
+6935 2716
+6936 2716
+6938 2716
+6939 2716
+6941 2716
+6942 2716
+6943 2716
+6945 2716
+6946 2716
+6947 2745
+6949 2716
+6950 2745
+6952 2716
+6953 2716
+6954 2716
+6956 2716
+6957 2716
+6959 2716
+6960 2716
+6961 2716
+6963 2716
+6964 2716
+6965 2716
+6967 2716
+6968 2745
+6970 2716
+6971 2716
+6972 2745
+6974 2716
+6975 2716
+6977 2716
+6978 2745
+6979 2716
+6981 2716
+6982 2716
+6983 2716
+6985 2716
+6986 2716
+6988 2716
+6989 2716
+6990 2716
+6992 2716
+6993 2716
+6994 2716
+6996 2716
+6997 2745
+6999 2716
+7000 2716
+7001 2745
+7003 2716
+7004 2716
+7006 2716
+7007 2716
+7008 2716
+7010 2716
+7011 2716
+7012 2716
+7014 2716
+7015 2716
+7017 2716
+7018 2716
+7019 2716
+7021 2716
+7022 2716
+7024 2716
+7025 2716
+7026 2716
+7028 2716
+7029 2716
+7030 2716
+7032 2745
+7033 2716
+7035 2716
+7036 2716
+7037 2716
+7039 2745
+7040 2716
+7041 2716
+7043 2716
+7044 2716
+7046 2716
+7047 2716
+7048 2716
+7050 2716
+7051 2716
+7053 2716
+7054 2716
+7055 2716
+7057 2716
+7058 2745
+7059 2745
+7061 2716
+7062 2716
+7064 2716
+7065 2716
+7066 2716
+7068 2716
+7069 2716
+7071 2716
+7072 2716
+7073 2716
+7075 2716
+7076 2716
+7077 2716
+7079 2716
+7080 2716
+7082 2716
+7083 2716
+7084 2745
+7086 2716
+7087 2716
+7088 2716
+7090 2745
+7091 2716
+7093 2716
+7094 2716
+7095 2716
+7097 2716
+7098 2716
+7100 2716
+7101 2716
+7102 2716
+7104 2716
+7105 2716
+7106 2716
+7108 2716
+7109 2716
+7111 2716
+7112 2745
+7113 2716
+7115 2716
+7116 2716
+7118 2716
+7119 2716
+7120 2716
+7122 2716
+7123 2716
+7124 2745
+7126 2716
+7127 2716
+7129 2716
+7130 2716
+7131 2716
+7133 2716
+500 MLine
+End
+
+Begin %I MLine
+[1 0 0 1 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+0 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 500
+7133 2716
+7134 2716
+7135 2716
+7137 2716
+7138 2716
+7140 2716
+7141 2716
+7142 2716
+7144 2716
+7145 2716
+7147 2716
+7148 2745
+7149 2745
+7151 2745
+7152 2716
+7153 2716
+7155 2716
+7156 2716
+7158 2716
+7159 2716
+7160 2716
+7162 2716
+7163 2716
+7165 2716
+7166 2716
+7167 2716
+7169 2716
+7170 2716
+7171 2716
+7173 2716
+7174 2716
+7176 2716
+7177 2716
+7178 2716
+7180 2716
+7181 2716
+7182 2716
+7184 2716
+7185 2716
+7187 2716
+7188 2716
+7189 2716
+7191 2716
+7192 2716
+7194 2716
+7195 2716
+7196 2716
+7198 2716
+7199 2716
+7200 2716
+7202 2716
+7203 2716
+7205 2716
+7206 2716
+7207 2716
+7209 2716
+7210 2716
+7212 2716
+7213 2716
+7214 2745
+7216 2716
+7217 2716
+7218 2716
+7220 2716
+7221 2716
+7223 2716
+7224 2716
+7225 2716
+7227 2716
+7228 2716
+7229 2716
+7231 2716
+7232 2716
+7234 2716
+7235 2716
+7236 2716
+7238 2716
+7239 2716
+7241 2716
+7242 2716
+7243 2716
+7245 2716
+7246 2716
+7247 2716
+7249 2716
+7250 2716
+7252 2716
+7253 2716
+7254 2716
+7256 2716
+7257 2716
+7259 2716
+7260 2716
+7261 2716
+7263 2716
+7264 2716
+7265 2716
+7267 2716
+7268 2716
+7270 2716
+7271 2716
+7272 2716
+7274 2716
+7275 2716
+7276 2716
+7278 2716
+7279 2716
+7281 2716
+7282 2716
+7283 2716
+7285 2716
+7286 2716
+7288 2716
+7289 2716
+7290 2716
+7292 2716
+7293 2716
+7294 2716
+7296 2716
+7297 2716
+7299 2766
+7300 2716
+7301 2716
+7303 2716
+7304 2716
+7306 2716
+7307 2716
+7308 2716
+7310 2716
+7311 2716
+7312 2716
+7314 2716
+7315 2716
+7317 2716
+7318 2716
+7319 2716
+7321 2716
+7322 2716
+7323 2716
+7325 2716
+7326 2716
+7328 2716
+7329 2716
+7330 2716
+7332 2716
+7333 2716
+7335 2716
+7336 2716
+7337 2716
+7339 2716
+7340 2716
+7341 2716
+7343 2716
+7344 2716
+7346 2716
+7347 2716
+7348 2716
+7350 2716
+7351 2716
+7353 2716
+7354 2716
+7355 2716
+7357 2716
+7358 2716
+7359 2716
+7361 2716
+7362 2716
+7364 2716
+7365 2716
+7366 2716
+7368 2716
+7369 2716
+7370 2716
+7372 2716
+7373 2716
+7375 2716
+7376 2716
+7377 2716
+7379 2716
+7380 2716
+7382 2716
+7383 2716
+7384 2716
+7386 2716
+7387 2716
+7388 2716
+7390 2716
+7391 2716
+7393 2716
+7394 2716
+7395 2716
+7397 2716
+7398 2716
+7400 2716
+7401 2716
+7402 2716
+7404 2716
+7405 2716
+7406 2716
+7408 2716
+7409 2716
+7411 2716
+7412 2716
+7413 2716
+7415 2716
+7416 2716
+7417 2716
+7419 2716
+7420 2716
+7422 2716
+7423 2716
+7424 2716
+7426 2716
+7427 2716
+7429 2716
+7430 2716
+7431 2716
+7433 2716
+7434 2716
+7435 2716
+7437 2716
+7438 2716
+7440 2716
+7441 2716
+7442 2716
+7444 2716
+7445 2716
+7447 2716
+7448 2716
+7449 2716
+7451 2716
+7452 2716
+7453 2716
+7455 2716
+7456 2716
+7458 2716
+7459 2716
+7460 2716
+7462 2716
+7463 2716
+7464 2716
+7466 2716
+7467 2716
+7469 2716
+7470 2716
+7471 2716
+7473 2716
+7474 2716
+7476 2716
+7477 2716
+7478 2716
+7480 2716
+7481 2716
+7482 2716
+7484 2716
+7485 2716
+7487 2716
+7488 2716
+7489 2716
+7491 2716
+7492 2716
+7494 2716
+7495 2716
+7496 2716
+7498 2716
+7499 2716
+7500 2716
+7502 2716
+7503 2716
+7505 2716
+7506 2716
+7507 2716
+7509 2716
+7510 2716
+7512 2716
+7513 2716
+7514 2716
+7516 2716
+7517 2716
+7518 2716
+7520 2716
+7521 2716
+7523 2716
+7524 2716
+7525 2716
+7527 2716
+7528 2716
+7529 2716
+7531 2716
+7532 2716
+7534 2716
+7535 2716
+7536 2716
+7538 2716
+7539 2716
+7541 2716
+7542 2716
+7543 2716
+7545 2716
+7546 2716
+7547 2716
+7549 2716
+7550 2716
+7552 2716
+7553 2716
+7554 2716
+7556 2716
+7557 2716
+7559 2716
+7560 2716
+7561 2716
+7563 2716
+7564 2716
+7565 2716
+7567 2716
+7568 2716
+7570 2716
+7571 2716
+7572 2716
+7574 2716
+7575 2716
+7576 2716
+7578 2716
+7579 2716
+7581 2745
+7582 2745
+7583 2745
+7585 2716
+7586 2716
+7588 2716
+7589 2716
+7590 2716
+7592 2716
+7593 2716
+7594 2716
+7596 2716
+7597 2716
+7599 2716
+7600 2716
+7601 2716
+7603 2716
+7604 2716
+7606 2716
+7607 2716
+7608 2716
+7610 2716
+7611 2716
+7612 2716
+7614 2716
+7615 2716
+7617 2716
+7618 2716
+7619 2716
+7621 2716
+7622 2716
+7623 2716
+7625 2716
+7626 2716
+7628 2716
+7629 2716
+7630 2716
+7632 2716
+7633 2716
+7635 2716
+7636 2716
+7637 2716
+7639 2716
+7640 2716
+7641 2716
+7643 2716
+7644 2716
+7646 2716
+7647 2716
+7648 2716
+7650 2716
+7651 2716
+7653 2716
+7654 2716
+7655 2716
+7657 2716
+7658 2716
+7659 2716
+7661 2716
+7662 2716
+7664 2716
+7665 2716
+7666 2716
+7668 2716
+7669 2716
+7670 2716
+7672 2716
+7673 2716
+7675 2716
+7676 2716
+7677 2716
+7679 2716
+7680 2716
+7682 2716
+7683 2716
+7684 2716
+7686 2716
+7687 2716
+7688 2716
+7690 2716
+7691 2716
+7693 2716
+7694 2716
+7695 2716
+7697 2716
+7698 2716
+7700 2716
+7701 2716
+7702 2716
+7704 2716
+7705 2716
+7706 2716
+7708 2716
+7709 2716
+7711 2716
+7712 2716
+7713 2716
+7715 2716
+7716 2716
+7717 2716
+7719 2716
+7720 2716
+7722 2716
+7723 2716
+7724 2716
+7726 2716
+7727 2716
+7729 2716
+7730 2716
+7731 2716
+7733 2716
+7734 2716
+7735 2716
+7737 2716
+7738 2716
+7740 2716
+7741 2716
+7742 2716
+7744 2716
+7745 2716
+7747 2716
+7748 2716
+7749 2716
+7751 2716
+7752 2716
+7753 2716
+7755 2716
+7756 2716
+7758 2716
+7759 2716
+7760 2716
+7762 2716
+7763 2716
+7764 2716
+7766 2716
+7767 2716
+7769 2716
+7770 2716
+7771 2716
+7773 2716
+7774 2716
+7776 2716
+7777 2716
+7778 2716
+7780 2716
+7781 2716
+7782 2716
+7784 2716
+7785 2716
+7787 2716
+7788 2716
+7789 2716
+7791 2716
+7792 2716
+7794 2716
+7795 2716
+7796 2716
+7798 2716
+7799 2716
+7800 2716
+7802 2716
+7803 2716
+7805 2716
+7806 2716
+7807 2716
+7809 2716
+7810 2716
+7811 2716
+7813 2716
+7814 2716
+7816 2716
+7817 2716
+7818 2716
+7820 2716
+7821 2716
+7823 2716
+500 MLine
+End
+
+Begin %I MLine
+[1 0 0 1 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+0 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 500
+7823 2716
+7824 2716
+7825 2716
+7827 2716
+7828 2716
+7829 2716
+7831 2716
+7832 2716
+7834 2716
+7835 2716
+7836 2716
+7838 2716
+7839 2716
+7841 2716
+7842 2716
+7843 2716
+7845 2716
+7846 2716
+7847 2716
+7849 2716
+7850 2716
+7852 2716
+7853 2716
+7854 2716
+7856 2716
+7857 2716
+7858 2716
+7860 2716
+7861 2716
+7863 2716
+7864 2716
+7865 2716
+7867 2716
+7868 2716
+7870 2716
+7871 2716
+7872 2716
+7874 2716
+7875 2716
+7876 2716
+7878 2716
+7879 2716
+7881 2716
+7882 2716
+7883 2716
+7885 2716
+7886 2716
+7888 2716
+7889 2716
+7890 2716
+7892 2716
+7893 2716
+7894 2716
+7896 2716
+7897 2716
+7899 2716
+7900 2716
+7901 2716
+7903 2716
+7904 2716
+7905 2716
+7907 2716
+7908 2716
+7910 2716
+7911 2716
+7912 2716
+7914 2716
+7915 2716
+7917 2716
+7918 2716
+7919 2716
+7921 2716
+7922 2716
+7923 2716
+7925 2716
+7926 2716
+7928 2716
+7929 2716
+7930 2716
+7932 2716
+7933 2716
+7935 2716
+7936 2716
+7937 2716
+7939 2716
+7940 2716
+7941 2716
+7943 2716
+7944 2716
+7946 2716
+7947 2716
+7948 2716
+7950 2716
+7951 2716
+7952 2716
+7954 2716
+7955 2716
+7957 2716
+7958 2716
+7959 2716
+7961 2716
+7962 2716
+7964 2716
+7965 2716
+7966 2716
+7968 2716
+7969 2716
+7970 2716
+7972 2716
+7973 2716
+7975 2716
+7976 2716
+7977 2716
+7979 2716
+7980 2716
+7982 2716
+7983 2716
+7984 2716
+7986 2716
+7987 2716
+7988 2716
+7990 2716
+7991 2716
+7993 2716
+7994 2716
+7995 2716
+7997 2716
+7998 2716
+7999 2716
+8001 2716
+8002 2716
+8004 2716
+8005 2716
+8006 2716
+8008 2716
+8009 2716
+8011 2716
+8012 2716
+8013 2716
+8015 2716
+8016 2716
+8017 2716
+8019 2716
+8020 2716
+8022 2716
+8023 2716
+8024 2716
+8026 2716
+8027 2716
+8029 2716
+8030 2716
+8031 2716
+8033 2716
+8034 2716
+8035 2716
+8037 2716
+8038 2716
+8040 2716
+8041 2716
+8042 2716
+8044 2716
+8045 2716
+8046 2716
+8048 2716
+8049 2716
+8051 2716
+8052 2716
+8053 2716
+8055 2716
+8056 2716
+8058 2716
+8059 2716
+8060 2716
+8062 2716
+8063 2716
+8064 2716
+8066 2716
+8067 2716
+8069 2716
+8070 2716
+8071 2716
+8073 2716
+8074 2716
+8076 2716
+8077 2716
+8078 2716
+8080 2716
+8081 2716
+8082 2716
+8084 2716
+8085 2716
+8087 2716
+8088 2716
+8089 2716
+8091 2716
+8092 2716
+8093 2716
+8095 2716
+8096 2716
+8098 2716
+8099 2716
+8100 2716
+8102 2716
+8103 2716
+8105 2716
+8106 2716
+8107 2716
+8109 2716
+8110 2716
+8111 2716
+8113 2716
+8114 2716
+8116 2716
+8117 2716
+8118 2716
+8120 2716
+8121 2716
+8123 2716
+8124 2716
+8125 2716
+8127 2716
+8128 2716
+8129 2716
+8131 2716
+8132 2716
+8134 2716
+8135 2716
+8136 2716
+8138 2716
+8139 2716
+8140 2716
+8142 2716
+8143 2716
+8145 2716
+8146 2716
+8147 2716
+8149 2716
+8150 2716
+8152 2716
+8153 2716
+8154 2716
+8156 2716
+8157 2716
+8158 2716
+8160 2716
+8161 2716
+8163 2716
+8164 2716
+8165 2716
+8167 2716
+8168 2716
+8170 2716
+8171 2716
+8172 2716
+8174 2716
+8175 2716
+8176 2716
+8178 2716
+8179 2716
+8181 2716
+8182 2716
+8183 2716
+8185 2716
+8186 2716
+8187 2716
+8189 2716
+8190 2716
+8192 2716
+8193 2716
+8194 2716
+8196 2716
+8197 2716
+8199 2716
+8200 2716
+8201 2716
+8203 2716
+8204 2716
+8205 2716
+8207 2716
+8208 2716
+8210 2716
+8211 2716
+8212 2716
+8214 2716
+8215 2716
+8217 2716
+8218 2716
+8219 2716
+8221 2716
+8222 2716
+8223 2716
+8225 2716
+8226 2716
+8228 2716
+8229 2716
+8230 2716
+8232 2716
+8233 2716
+8234 2716
+8236 2716
+8237 2716
+8239 2716
+8240 2716
+8241 2716
+8243 2716
+8244 2716
+8246 2716
+8247 2716
+8248 2716
+8250 2716
+8251 2716
+8252 2716
+8254 2716
+8255 2716
+8257 2716
+8258 2716
+8259 2716
+8261 2716
+8262 2716
+8264 2716
+8265 2716
+8266 2716
+8268 2716
+8269 2716
+8270 2716
+8272 2716
+8273 2716
+8275 2716
+8276 2716
+8277 2716
+8279 2716
+8280 2716
+8281 2716
+8283 2716
+8284 2716
+8286 2716
+8287 2716
+8288 2716
+8290 2716
+8291 2716
+8293 2716
+8294 2716
+8295 2716
+8297 2716
+8298 2716
+8299 2716
+8301 2716
+8302 2716
+8304 2716
+8305 2716
+8306 2716
+8308 2716
+8309 2716
+8311 2716
+8312 2716
+8313 2716
+8315 2716
+8316 2716
+8317 2716
+8319 2716
+8320 2716
+8322 2716
+8323 2716
+8324 2716
+8326 2716
+8327 2716
+8328 2716
+8330 2716
+8331 2716
+8333 2716
+8334 2716
+8335 2716
+8337 2716
+8338 2716
+8340 2716
+8341 2716
+8342 2716
+8344 2716
+8345 2716
+8346 2716
+8348 2716
+8349 2716
+8351 2716
+8352 2716
+8353 2716
+8355 2716
+8356 2716
+8358 2716
+8359 2716
+8360 2716
+8362 2716
+8363 2716
+8364 2716
+8366 2716
+8367 2716
+8369 2716
+8370 2716
+8371 2716
+8373 2716
+8374 2716
+8376 2716
+8377 2716
+8378 2716
+8380 2716
+8381 2716
+8382 2716
+8384 2716
+8385 2716
+8387 2716
+8388 2716
+8389 2716
+8391 2716
+8392 2716
+8393 2716
+8395 2716
+8396 2716
+8398 2716
+8399 2716
+8400 2716
+8402 2716
+8403 2716
+8405 2716
+8406 2716
+8407 2716
+8409 2716
+8410 2716
+8411 2716
+8413 2716
+8414 2716
+8416 2716
+8417 2716
+8418 2716
+8420 2716
+8421 2716
+8423 2716
+8424 2716
+8425 2716
+8427 2716
+8428 2716
+8429 2716
+8431 2716
+8432 2716
+8434 2716
+8435 2716
+8436 2716
+8438 2716
+8439 2716
+8440 2716
+8442 2716
+8443 2716
+8445 2716
+8446 2716
+8447 2716
+8449 2716
+8450 2716
+8452 2716
+8453 2716
+8454 2716
+8456 2716
+8457 2716
+8458 2716
+8460 2716
+8461 2716
+8463 2716
+8464 2716
+8465 2716
+8467 2716
+8468 2716
+8470 2716
+8471 2716
+8472 2716
+8474 2716
+8475 2716
+8476 2716
+8478 2716
+8479 2716
+8481 2716
+8482 2716
+8483 2716
+8485 2716
+8486 2716
+8487 2716
+8489 2716
+8490 2716
+8492 2716
+8493 2716
+8494 2716
+8496 2716
+8497 2716
+8499 2716
+8500 2716
+8501 2716
+8503 2716
+8504 2716
+8505 2716
+8507 2716
+8508 2716
+8510 2716
+8511 2716
+8512 2716
+500 MLine
+End
+
+Begin %I MLine
+[1 0 0 1 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+0 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 119
+8512 2716
+8514 2716
+8515 2716
+8517 2716
+8518 2716
+8519 2716
+8521 2716
+8522 2716
+8523 2716
+8525 2716
+8526 2716
+8528 2716
+8529 2716
+8530 2716
+8532 2716
+8533 2716
+8534 2716
+8536 2716
+8537 2716
+8539 2716
+8540 2716
+8541 2716
+8543 2716
+8544 2716
+8546 2716
+8547 2716
+8548 2716
+8550 2716
+8551 2716
+8552 2716
+8554 2716
+8555 2716
+8557 2716
+8558 2716
+8559 2716
+8561 2716
+8562 2716
+8564 2716
+8565 2716
+8566 2716
+8568 2716
+8569 2716
+8570 2716
+8572 2716
+8573 2716
+8575 2716
+8576 2716
+8577 2716
+8579 2716
+8580 2716
+8581 2716
+8583 2716
+8584 2716
+8586 2716
+8587 2716
+8588 2716
+8590 2716
+8591 2716
+8593 2716
+8594 2716
+8595 2716
+8597 2716
+8598 2716
+8599 2716
+8601 2716
+8602 2716
+8604 2716
+8605 2716
+8606 2716
+8608 2716
+8609 2716
+8611 2716
+8612 2716
+8613 2716
+8615 2716
+8616 2716
+8617 2716
+8619 2716
+8620 2716
+8622 2716
+8623 2716
+8624 2716
+8626 2716
+8627 2716
+8628 2716
+8630 2716
+8631 2716
+8633 2716
+8634 2716
+8635 2716
+8637 2716
+8638 2716
+8640 2716
+8641 2716
+8642 2716
+8644 2716
+8645 2716
+8646 2716
+8648 2716
+8649 2716
+8651 2716
+8652 2716
+8653 2716
+8655 2716
+8656 2716
+8658 2716
+8659 2716
+8660 2716
+8662 2716
+8663 2716
+8664 2716
+8666 2716
+8667 2716
+8669 2716
+8670 2716
+8671 2716
+8673 2716
+8674 2716
+8675 2716
+119 MLine
+End
+
+%%PageTrailer
+End %I eop
+showpage
+
+%%Trailer
+end
+%%EOF
diff --git a/gsl-1.9/doc/ChangeLog b/gsl-1.9/doc/ChangeLog
new file mode 100644
index 0000000..09cd473
--- /dev/null
+++ b/gsl-1.9/doc/ChangeLog
@@ -0,0 +1,62 @@
+2006-02-09 Brian Gough <bjg@network-theory.co.uk>
+
+ * Makefile.am: disable pdf, as it would require maintaining a
+ separate set of figure files.
+
+Mon Apr 7 12:54:30 MDT 2003 G. Jungman
+
+ * specfunc-gamma.texi: added entry for gsl_sf_gamma_inc_(),
+ gsl_sf_gamma_inc()
+
+
+2000-10-26 Mark Galassi <rosalia@lanl.gov>
+
+ * gsl-ref.texi: small changes to update the author list.
+
+Mon Oct 23 21:49:25 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * usage.texi: added info on portability functions
+
+Sat Jul 15 23:52:59 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * Makefile.am (EXTRA_DIST): added gsl-design.texi to the
+ distributed files
+
+Thu May 18 12:11:24 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl-ref.texi (Preliminaries): changed the phrase "collection of
+ routines for numerical analysis" to "... numerical computing", as
+ on the web page.
+
+Wed Apr 26 17:46:48 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * math.texi: added a chapter on the elementary functions and
+ constants in gsl_math.h
+
+Tue Apr 4 21:45:27 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * upgraded texinfo.tex to texinfo-4.0
+
+2000-04-01 Mark Galassi <rosalia@lanl.gov>
+
+ * roots.texi (Providing the function to solve): fixed a typo,
+ THANKS Dave Morrison.
+
+1999-12-03 Mark Galassi <rosalia@lanl.gov>
+
+ * gsl-ref.texi, gsl-design.texi: updated my email address.
+
+ * gsl-design.texi: minor changes.
+
+Tue Feb 16 11:36:03 1999 Brian Gough <bjg@netsci.freeserve.co.uk>
+
+ * statistics.texi: removed the multiple descriptions of double,
+ int versions of the functions. Now we just describe the double
+ versions and note the existence of the corresponding versions for
+ other types.
+
+ * ChangeLog: added a changelog file for the documentation,
+ although it is not required by the GNU Coding standards. I use the
+ Changelogs to keep track of pending changes that I need to commit
+ to repository.
+
diff --git a/gsl-1.9/doc/Makefile.am b/gsl-1.9/doc/Makefile.am
new file mode 100644
index 0000000..12095a5
--- /dev/null
+++ b/gsl-1.9/doc/Makefile.am
@@ -0,0 +1,21 @@
+## Process this file with automake to produce Makefile.in
+
+info_TEXINFOS = gsl-ref.texi
+noinst_TEXINFOS = gsl-design.texi
+gsl_ref_TEXINFOS = err.texi cblas.texi blas.texi min.texi fft.texi rng.texi randist.texi roots.texi statistics.texi specfunc.texi specfunc-airy.texi specfunc-bessel.texi specfunc-clausen.texi specfunc-coulomb.texi specfunc-coupling.texi specfunc-dawson.texi specfunc-debye.texi specfunc-dilog.texi specfunc-elementary.texi specfunc-ellint.texi specfunc-elljac.texi specfunc-erf.texi specfunc-exp.texi specfunc-expint.texi specfunc-fermi-dirac.texi specfunc-gamma.texi specfunc-gegenbauer.texi specfunc-hyperg.texi specfunc-lambert.texi specfunc-laguerre.texi specfunc-legendre.texi specfunc-log.texi specfunc-mathieu.texi specfunc-pow-int.texi specfunc-psi.texi specfunc-synchrotron.texi specfunc-transport.texi specfunc-trig.texi specfunc-zeta.texi siman.texi vectors.texi debug.texi histogram.texi ode-initval.texi integration.texi ieee754.texi montecarlo.texi sum.texi intro.texi usage.texi dwt.texi dht.texi interp.texi poly.texi linalg.texi eigen.texi multiroots.texi sort.texi permutation.texi combination.texi complex.texi math.texi fitting.texi multifit.texi const.texi ntuple.texi diff.texi qrng.texi cheb.texi multimin.texi gpl.texi fdl.texi autoconf.texi freemanuals.texi bspline.texi
+
+man_MANS = gsl.3 gsl-config.1 gsl-randist.1 gsl-histogram.1
+
+figures = multimin.eps siman-test.eps siman-energy.eps 12-cities.eps initial-route.eps final-route.eps fft-complex-radix2-f.eps fft-complex-radix2-t.eps fft-complex-radix2.eps fft-real-mixedradix.eps roots-bisection.eps roots-false-position.eps roots-newtons-method.eps roots-secant-method.eps histogram.eps histogram2d.eps min-interval.eps fit-wlinear.eps fit-wlinear2.eps fit-exp.eps ntuple.eps qrng.eps cheb.eps vdp.eps interp2.eps rand-beta.tex rand-binomial.tex rand-cauchy.tex rand-chisq.tex rand-erlang.tex rand-exponential.tex rand-fdist.tex rand-flat.tex rand-gamma.tex rand-gaussian.tex rand-geometric.tex rand-laplace.tex rand-logarithmic.tex rand-logistic.tex rand-lognormal.tex rand-pareto.tex rand-poisson.tex rand-hypergeometric.tex rand-nbinomial.tex rand-pascal.tex rand-bivariate-gaussian.tex rand-rayleigh.tex rand-rayleigh-tail.tex rand-tdist.tex rand-weibull.tex random-walk.tex randplots.gnp rand-exppow.tex rand-levy.tex rand-levyskew.tex rand-gumbel.tex rand-bernoulli.tex rand-gaussian-tail.tex rand-gumbel1.tex rand-gumbel2.tex landau.dat rand-landau.tex dwt-orig.eps dwt-samp.eps interpp2.eps bspline.eps
+
+examples_src = examples/blas.c examples/block.c examples/cblas.c examples/cdf.c examples/cheb.c examples/combination.c examples/const.c examples/demo_fn.c examples/diff.c examples/eigen.c examples/fft.c examples/fftmr.c examples/fftreal.c examples/fitting.c examples/fitting2.c examples/fitting3.c examples/histogram.c examples/histogram2d.c examples/ieee.c examples/ieeeround.c examples/integration.c examples/interp.c examples/intro.c examples/linalglu.c examples/matrix.c examples/matrixw.c examples/min.c examples/monte.c examples/ntupler.c examples/ntuplew.c examples/ode-initval.c examples/odefixed.c examples/permseq.c examples/permshuffle.c examples/polyroots.c examples/qrng.c examples/randpoisson.c examples/randwalk.c examples/rng.c examples/rngunif.c examples/rootnewt.c examples/roots.c examples/siman.c examples/sortsmall.c examples/specfun.c examples/specfun_e.c examples/stat.c examples/statsort.c examples/sum.c examples/vector.c examples/vectorr.c examples/vectorview.c examples/vectorw.c examples/demo_fn.h examples/dwt.c examples/expfit.c examples/nlfit.c examples/interpp.c examples/eigen_nonsymm.c examples/bspline.c
+
+examples_out = examples/blas.out examples/block.out examples/cblas.out examples/cdf.out examples/combination.out examples/const.out examples/diff.out examples/integration.out examples/intro.out examples/linalglu.out examples/min.out examples/polyroots.out examples/randpoisson.2.out examples/randpoisson.out examples/rng.out examples/rngunif.2.out examples/rngunif.out examples/sortsmall.out examples/specfun.out examples/specfun_e.out examples/stat.out examples/statsort.out examples/sum.out examples/vectorview.out examples/ecg.dat examples/dwt.dat
+
+noinst_DATA = $(examples_src) $(examples_out) $(figures)
+
+EXTRA_DIST = $(man_MANS) $(noinst_DATA) gsl-design.texi fftalgorithms.tex fftalgorithms.bib algorithm.sty algorithmic.sty calc.sty
+
+# pdf disabled, use postscript and ps2pdf
+.PHONY: pdf
+pdf:
diff --git a/gsl-1.9/doc/Makefile.in b/gsl-1.9/doc/Makefile.in
new file mode 100644
index 0000000..2c470b7
--- /dev/null
+++ b/gsl-1.9/doc/Makefile.in
@@ -0,0 +1,674 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = doc
+DIST_COMMON = $(gsl_ref_TEXINFOS) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in $(srcdir)/stamp-vti \
+ $(srcdir)/version-ref.texi ChangeLog mdate-sh texinfo.tex
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+depcomp =
+am__depfiles_maybe =
+SOURCES =
+DIST_SOURCES =
+INFO_DEPS = $(srcdir)/gsl-ref.info
+am__TEXINFO_TEX_DIR = $(srcdir)
+DVIS = gsl-ref.dvi
+PDFS = gsl-ref.pdf
+PSS = gsl-ref.ps
+HTMLS = gsl-ref.html
+TEXINFOS = gsl-ref.texi
+TEXI2DVI = texi2dvi
+TEXI2PDF = $(TEXI2DVI) --pdf --batch
+MAKEINFOHTML = $(MAKEINFO) --html
+AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS)
+DVIPS = dvips
+am__installdirs = "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man1dir)" \
+ "$(DESTDIR)$(man3dir)"
+man1dir = $(mandir)/man1
+man3dir = $(mandir)/man3
+NROFF = nroff
+MANS = $(man_MANS)
+DATA = $(noinst_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+info_TEXINFOS = gsl-ref.texi
+noinst_TEXINFOS = gsl-design.texi
+gsl_ref_TEXINFOS = err.texi cblas.texi blas.texi min.texi fft.texi \
+ rng.texi randist.texi roots.texi statistics.texi specfunc.texi \
+ specfunc-airy.texi specfunc-bessel.texi specfunc-clausen.texi \
+ specfunc-coulomb.texi specfunc-coupling.texi \
+ specfunc-dawson.texi specfunc-debye.texi specfunc-dilog.texi \
+ specfunc-elementary.texi specfunc-ellint.texi \
+ specfunc-elljac.texi specfunc-erf.texi specfunc-exp.texi \
+ specfunc-expint.texi specfunc-fermi-dirac.texi \
+ specfunc-gamma.texi specfunc-gegenbauer.texi \
+ specfunc-hyperg.texi specfunc-lambert.texi \
+ specfunc-laguerre.texi specfunc-legendre.texi \
+ specfunc-log.texi specfunc-mathieu.texi specfunc-pow-int.texi \
+ specfunc-psi.texi specfunc-synchrotron.texi \
+ specfunc-transport.texi specfunc-trig.texi specfunc-zeta.texi \
+ siman.texi vectors.texi debug.texi histogram.texi \
+ ode-initval.texi integration.texi ieee754.texi montecarlo.texi \
+ sum.texi intro.texi usage.texi dwt.texi dht.texi interp.texi \
+ poly.texi linalg.texi eigen.texi multiroots.texi sort.texi \
+ permutation.texi combination.texi complex.texi math.texi \
+ fitting.texi multifit.texi const.texi ntuple.texi diff.texi \
+ qrng.texi cheb.texi multimin.texi gpl.texi fdl.texi \
+ autoconf.texi freemanuals.texi bspline.texi
+man_MANS = gsl.3 gsl-config.1 gsl-randist.1 gsl-histogram.1
+figures = multimin.eps siman-test.eps siman-energy.eps 12-cities.eps \
+ initial-route.eps final-route.eps fft-complex-radix2-f.eps \
+ fft-complex-radix2-t.eps fft-complex-radix2.eps \
+ fft-real-mixedradix.eps roots-bisection.eps \
+ roots-false-position.eps roots-newtons-method.eps \
+ roots-secant-method.eps histogram.eps histogram2d.eps \
+ min-interval.eps fit-wlinear.eps fit-wlinear2.eps fit-exp.eps \
+ ntuple.eps qrng.eps cheb.eps vdp.eps interp2.eps rand-beta.tex \
+ rand-binomial.tex rand-cauchy.tex rand-chisq.tex \
+ rand-erlang.tex rand-exponential.tex rand-fdist.tex \
+ rand-flat.tex rand-gamma.tex rand-gaussian.tex \
+ rand-geometric.tex rand-laplace.tex rand-logarithmic.tex \
+ rand-logistic.tex rand-lognormal.tex rand-pareto.tex \
+ rand-poisson.tex rand-hypergeometric.tex rand-nbinomial.tex \
+ rand-pascal.tex rand-bivariate-gaussian.tex rand-rayleigh.tex \
+ rand-rayleigh-tail.tex rand-tdist.tex rand-weibull.tex \
+ random-walk.tex randplots.gnp rand-exppow.tex rand-levy.tex \
+ rand-levyskew.tex rand-gumbel.tex rand-bernoulli.tex \
+ rand-gaussian-tail.tex rand-gumbel1.tex rand-gumbel2.tex \
+ landau.dat rand-landau.tex dwt-orig.eps dwt-samp.eps \
+ interpp2.eps bspline.eps
+examples_src = examples/blas.c examples/block.c examples/cblas.c \
+ examples/cdf.c examples/cheb.c examples/combination.c \
+ examples/const.c examples/demo_fn.c examples/diff.c \
+ examples/eigen.c examples/fft.c examples/fftmr.c \
+ examples/fftreal.c examples/fitting.c examples/fitting2.c \
+ examples/fitting3.c examples/histogram.c \
+ examples/histogram2d.c examples/ieee.c examples/ieeeround.c \
+ examples/integration.c examples/interp.c examples/intro.c \
+ examples/linalglu.c examples/matrix.c examples/matrixw.c \
+ examples/min.c examples/monte.c examples/ntupler.c \
+ examples/ntuplew.c examples/ode-initval.c examples/odefixed.c \
+ examples/permseq.c examples/permshuffle.c examples/polyroots.c \
+ examples/qrng.c examples/randpoisson.c examples/randwalk.c \
+ examples/rng.c examples/rngunif.c examples/rootnewt.c \
+ examples/roots.c examples/siman.c examples/sortsmall.c \
+ examples/specfun.c examples/specfun_e.c examples/stat.c \
+ examples/statsort.c examples/sum.c examples/vector.c \
+ examples/vectorr.c examples/vectorview.c examples/vectorw.c \
+ examples/demo_fn.h examples/dwt.c examples/expfit.c \
+ examples/nlfit.c examples/interpp.c examples/eigen_nonsymm.c \
+ examples/bspline.c
+examples_out = examples/blas.out examples/block.out examples/cblas.out examples/cdf.out examples/combination.out examples/const.out examples/diff.out examples/integration.out examples/intro.out examples/linalglu.out examples/min.out examples/polyroots.out examples/randpoisson.2.out examples/randpoisson.out examples/rng.out examples/rngunif.2.out examples/rngunif.out examples/sortsmall.out examples/specfun.out examples/specfun_e.out examples/stat.out examples/statsort.out examples/sum.out examples/vectorview.out examples/ecg.dat examples/dwt.dat
+noinst_DATA = $(examples_src) $(examples_out) $(figures)
+EXTRA_DIST = $(man_MANS) $(noinst_DATA) gsl-design.texi fftalgorithms.tex fftalgorithms.bib algorithm.sty algorithmic.sty calc.sty
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .dvi .html .info .pdf .ps .texi
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps doc/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps doc/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+
+.texi.info:
+ restore=: && backupdir="$(am__leading_dot)am$$$$" && \
+ am__cwd=`pwd` && cd $(srcdir) && \
+ rm -rf $$backupdir && mkdir $$backupdir && \
+ if ($(MAKEINFO) --version) >/dev/null 2>&1; then \
+ for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \
+ if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \
+ done; \
+ else :; fi && \
+ cd "$$am__cwd"; \
+ if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
+ -o $@ $<; \
+ then \
+ rc=0; \
+ cd $(srcdir); \
+ else \
+ rc=$$?; \
+ cd $(srcdir) && \
+ $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \
+ fi; \
+ rm -rf $$backupdir; exit $$rc
+
+.texi.dvi:
+ TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
+ $(TEXI2DVI) $<
+
+.texi.pdf:
+ TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
+ $(TEXI2PDF) $<
+
+.texi.html:
+ rm -rf $(@:.html=.htp)
+ if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
+ -o $(@:.html=.htp) $<; \
+ then \
+ rm -rf $@; \
+ if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \
+ mv $(@:.html=) $@; else mv $(@:.html=.htp) $@; fi; \
+ else \
+ if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \
+ rm -rf $(@:.html=); else rm -Rf $(@:.html=.htp) $@; fi; \
+ exit 1; \
+ fi
+$(srcdir)/gsl-ref.info: gsl-ref.texi $(srcdir)/version-ref.texi $(gsl_ref_TEXINFOS)
+gsl-ref.dvi: gsl-ref.texi $(srcdir)/version-ref.texi $(gsl_ref_TEXINFOS)
+gsl-ref.pdf: gsl-ref.texi $(srcdir)/version-ref.texi $(gsl_ref_TEXINFOS)
+gsl-ref.html: gsl-ref.texi $(srcdir)/version-ref.texi $(gsl_ref_TEXINFOS)
+$(srcdir)/version-ref.texi: @MAINTAINER_MODE_TRUE@ $(srcdir)/stamp-vti
+$(srcdir)/stamp-vti: gsl-ref.texi $(top_srcdir)/configure
+ @(dir=.; test -f ./gsl-ref.texi || dir=$(srcdir); \
+ set `$(SHELL) $(srcdir)/mdate-sh $$dir/gsl-ref.texi`; \
+ echo "@set UPDATED $$1 $$2 $$3"; \
+ echo "@set UPDATED-MONTH $$2 $$3"; \
+ echo "@set EDITION $(VERSION)"; \
+ echo "@set VERSION $(VERSION)") > vti.tmp
+ @cmp -s vti.tmp $(srcdir)/version-ref.texi \
+ || (echo "Updating $(srcdir)/version-ref.texi"; \
+ cp vti.tmp $(srcdir)/version-ref.texi)
+ -@rm -f vti.tmp
+ @cp $(srcdir)/version-ref.texi $@
+
+mostlyclean-vti:
+ -rm -f vti.tmp
+
+maintainer-clean-vti:
+@MAINTAINER_MODE_TRUE@ -rm -f $(srcdir)/stamp-vti $(srcdir)/version-ref.texi
+.dvi.ps:
+ TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+ $(DVIPS) -o $@ $<
+
+uninstall-info-am:
+ @$(PRE_UNINSTALL)
+ @if (install-info --version && \
+ install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \
+ list='$(INFO_DEPS)'; \
+ for file in $$list; do \
+ relfile=`echo "$$file" | sed 's|^.*/||'`; \
+ echo " install-info --info-dir='$(DESTDIR)$(infodir)' --remove '$(DESTDIR)$(infodir)/$$relfile'"; \
+ install-info --info-dir="$(DESTDIR)$(infodir)" --remove "$(DESTDIR)$(infodir)/$$relfile"; \
+ done; \
+ else :; fi
+ @$(NORMAL_UNINSTALL)
+ @list='$(INFO_DEPS)'; \
+ for file in $$list; do \
+ relfile=`echo "$$file" | sed 's|^.*/||'`; \
+ relfile_i=`echo "$$relfile" | sed 's|\.info$$||;s|$$|.i|'`; \
+ (if cd "$(DESTDIR)$(infodir)"; then \
+ echo " cd '$(DESTDIR)$(infodir)' && rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]"; \
+ rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]; \
+ else :; fi); \
+ done
+
+dist-info: $(INFO_DEPS)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ list='$(INFO_DEPS)'; \
+ for base in $$list; do \
+ case $$base in \
+ $(srcdir)/*) base=`echo "$$base" | sed "s|^$$srcdirstrip/||"`;; \
+ esac; \
+ if test -f $$base; then d=.; else d=$(srcdir); fi; \
+ for file in $$d/$$base*; do \
+ relfile=`expr "$$file" : "$$d/\(.*\)"`; \
+ test -f $(distdir)/$$relfile || \
+ cp -p $$file $(distdir)/$$relfile; \
+ done; \
+ done
+
+mostlyclean-aminfo:
+ -rm -rf gsl-ref.aux gsl-ref.cp gsl-ref.cps gsl-ref.fn gsl-ref.fns gsl-ref.ky \
+ gsl-ref.kys gsl-ref.log gsl-ref.pg gsl-ref.pgs gsl-ref.tmp \
+ gsl-ref.toc gsl-ref.tp gsl-ref.tps gsl-ref.vr gsl-ref.vrs \
+ gsl-ref.dvi gsl-ref.pdf gsl-ref.ps gsl-ref.html
+
+maintainer-clean-aminfo:
+ @list='$(INFO_DEPS)'; for i in $$list; do \
+ i_i=`echo "$$i" | sed 's|\.info$$||;s|$$|.i|'`; \
+ echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \
+ rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \
+ done
+install-man1: $(man1_MANS) $(man_MANS)
+ @$(NORMAL_INSTALL)
+ test -z "$(man1dir)" || $(mkdir_p) "$(DESTDIR)$(man1dir)"
+ @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
+ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+ for i in $$l2; do \
+ case "$$i" in \
+ *.1*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+ else file=$$i; fi; \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ case "$$ext" in \
+ 1*) ;; \
+ *) ext='1' ;; \
+ esac; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed -e 's/^.*\///'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \
+ done
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
+ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+ for i in $$l2; do \
+ case "$$i" in \
+ *.1*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ case "$$ext" in \
+ 1*) ;; \
+ *) ext='1' ;; \
+ esac; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed -e 's/^.*\///'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \
+ rm -f "$(DESTDIR)$(man1dir)/$$inst"; \
+ done
+install-man3: $(man3_MANS) $(man_MANS)
+ @$(NORMAL_INSTALL)
+ test -z "$(man3dir)" || $(mkdir_p) "$(DESTDIR)$(man3dir)"
+ @list='$(man3_MANS) $(dist_man3_MANS) $(nodist_man3_MANS)'; \
+ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+ for i in $$l2; do \
+ case "$$i" in \
+ *.3*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+ else file=$$i; fi; \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ case "$$ext" in \
+ 3*) ;; \
+ *) ext='3' ;; \
+ esac; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed -e 's/^.*\///'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst"; \
+ done
+uninstall-man3:
+ @$(NORMAL_UNINSTALL)
+ @list='$(man3_MANS) $(dist_man3_MANS) $(nodist_man3_MANS)'; \
+ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+ for i in $$l2; do \
+ case "$$i" in \
+ *.3*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ case "$$ext" in \
+ 3*) ;; \
+ *) ext='3' ;; \
+ esac; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed -e 's/^.*\///'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " rm -f '$(DESTDIR)$(man3dir)/$$inst'"; \
+ rm -f "$(DESTDIR)$(man3dir)/$$inst"; \
+ done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+ $(mkdir_p) $(distdir)/examples
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$(top_distdir)" distdir="$(distdir)" \
+ dist-info
+check-am: all-am
+check: check-am
+all-am: Makefile $(INFO_DEPS) $(MANS) $(DATA)
+installdirs:
+ for dir in "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man3dir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-libtool
+
+dvi: dvi-am
+
+dvi-am: $(DVIS)
+
+html: html-am
+
+html-am: $(HTMLS)
+
+info: info-am
+
+info-am: $(INFO_DEPS)
+
+install-data-am: install-info-am install-man
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-info-am: $(INFO_DEPS)
+ @$(NORMAL_INSTALL)
+ test -z "$(infodir)" || $(mkdir_p) "$(DESTDIR)$(infodir)"
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ list='$(INFO_DEPS)'; \
+ for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ esac; \
+ if test -f $$file; then d=.; else d=$(srcdir); fi; \
+ file_i=`echo "$$file" | sed 's|\.info$$||;s|$$|.i|'`; \
+ for ifile in $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9] \
+ $$d/$$file_i[0-9] $$d/$$file_i[0-9][0-9] ; do \
+ if test -f $$ifile; then \
+ relfile=`echo "$$ifile" | sed 's|^.*/||'`; \
+ echo " $(INSTALL_DATA) '$$ifile' '$(DESTDIR)$(infodir)/$$relfile'"; \
+ $(INSTALL_DATA) "$$ifile" "$(DESTDIR)$(infodir)/$$relfile"; \
+ else : ; fi; \
+ done; \
+ done
+ @$(POST_INSTALL)
+ @if (install-info --version && \
+ install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \
+ list='$(INFO_DEPS)'; \
+ for file in $$list; do \
+ relfile=`echo "$$file" | sed 's|^.*/||'`; \
+ echo " install-info --info-dir='$(DESTDIR)$(infodir)' '$(DESTDIR)$(infodir)/$$relfile'";\
+ install-info --info-dir="$(DESTDIR)$(infodir)" "$(DESTDIR)$(infodir)/$$relfile" || :;\
+ done; \
+ else : ; fi
+install-man: install-man1 install-man3
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-aminfo \
+ maintainer-clean-generic maintainer-clean-vti
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-aminfo mostlyclean-generic \
+ mostlyclean-libtool mostlyclean-vti
+
+pdf-am: $(PDFS)
+
+ps: ps-am
+
+ps-am: $(PSS)
+
+uninstall-am: uninstall-info-am uninstall-man
+
+uninstall-man: uninstall-man1 uninstall-man3
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+ dist-info distclean distclean-generic distclean-libtool \
+ distdir dvi dvi-am html html-am info info-am install \
+ install-am install-data install-data-am install-exec \
+ install-exec-am install-info install-info-am install-man \
+ install-man1 install-man3 install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-aminfo maintainer-clean-generic \
+ maintainer-clean-vti mostlyclean mostlyclean-aminfo \
+ mostlyclean-generic mostlyclean-libtool mostlyclean-vti pdf \
+ pdf-am ps ps-am uninstall uninstall-am uninstall-info-am \
+ uninstall-man uninstall-man1 uninstall-man3
+
+
+# pdf disabled, use postscript and ps2pdf
+.PHONY: pdf
+pdf:
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/doc/algorithm.sty b/gsl-1.9/doc/algorithm.sty
new file mode 100644
index 0000000..843e3d5
--- /dev/null
+++ b/gsl-1.9/doc/algorithm.sty
@@ -0,0 +1,79 @@
+% ALGORITHM STYLE -- Released 8 April 1996
+% for LaTeX-2e
+% Copyright -- 1994 Peter Williams
+% E-mail Peter.Williams@dsto.defence.gov.au
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{algorithm}
+\typeout{Document Style `algorithm' - floating environment}
+
+\RequirePackage{float}
+\RequirePackage{ifthen}
+\newcommand{\ALG@within}{nothing}
+\newboolean{ALG@within}
+\setboolean{ALG@within}{false}
+\newcommand{\ALG@floatstyle}{ruled}
+\newcommand{\ALG@name}{Algorithm}
+\newcommand{\listalgorithmname}{List of \ALG@name s}
+
+% Declare Options
+% first appearance
+\DeclareOption{plain}{
+ \renewcommand{\ALG@floatstyle}{plain}
+}
+\DeclareOption{ruled}{
+ \renewcommand{\ALG@floatstyle}{ruled}
+}
+\DeclareOption{boxed}{
+ \renewcommand{\ALG@floatstyle}{boxed}
+}
+% then numbering convention
+\DeclareOption{part}{
+ \renewcommand{\ALG@within}{part}
+ \setboolean{ALG@within}{true}
+}
+\DeclareOption{chapter}{
+ \renewcommand{\ALG@within}{chapter}
+ \setboolean{ALG@within}{true}
+}
+\DeclareOption{section}{
+ \renewcommand{\ALG@within}{section}
+ \setboolean{ALG@within}{true}
+}
+\DeclareOption{subsection}{
+ \renewcommand{\ALG@within}{subsection}
+ \setboolean{ALG@within}{true}
+}
+\DeclareOption{subsubsection}{
+ \renewcommand{\ALG@within}{subsubsection}
+ \setboolean{ALG@within}{true}
+}
+\DeclareOption{nothing}{
+ \renewcommand{\ALG@within}{nothing}
+ \setboolean{ALG@within}{true}
+}
+\DeclareOption*{\edef\ALG@name{\CurrentOption}}
+
+% ALGORITHM
+%
+\ProcessOptions
+\floatstyle{\ALG@floatstyle}
+\ifthenelse{\boolean{ALG@within}}{
+ \ifthenelse{\equal{\ALG@within}{part}}
+ {\newfloat{algorithm}{htbp}{loa}[part]}{}
+ \ifthenelse{\equal{\ALG@within}{chapter}}
+ {\newfloat{algorithm}{htbp}{loa}[chapter]}{}
+ \ifthenelse{\equal{\ALG@within}{section}}
+ {\newfloat{algorithm}{htbp}{loa}[section]}{}
+ \ifthenelse{\equal{\ALG@within}{subsection}}
+ {\newfloat{algorithm}{htbp}{loa}[subsection]}{}
+ \ifthenelse{\equal{\ALG@within}{subsubsection}}
+ {\newfloat{algorithm}{htbp}{loa}[subsubsection]}{}
+ \ifthenelse{\equal{\ALG@within}{nothing}}
+ {\newfloat{algorithm}{htbp}{loa}}{}
+}{
+ \newfloat{algorithm}{htbp}{loa}
+}
+\floatname{algorithm}{\ALG@name}
+
+\newcommand{\listofalgorithms}{\listof{algorithm}{\listalgorithmname}}
+
diff --git a/gsl-1.9/doc/algorithmic.sty b/gsl-1.9/doc/algorithmic.sty
new file mode 100644
index 0000000..68f18aa
--- /dev/null
+++ b/gsl-1.9/doc/algorithmic.sty
@@ -0,0 +1,158 @@
+% ALGORITHMIC STYLE -- Released 8 APRIL 1996
+% for LaTeX version 2e
+% Copyright -- 1994 Peter Williams
+% E-mail PeterWilliams@dsto.defence.gov.au
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{algorithmic}
+\typeout{Document Style `algorithmic' - environment}
+%
+\RequirePackage{ifthen}
+\RequirePackage{calc}
+\newboolean{ALC@noend}
+\setboolean{ALC@noend}{false}
+\newcounter{ALC@line}
+\newcounter{ALC@rem}
+\newlength{\ALC@tlm}
+%
+\DeclareOption{noend}{\setboolean{ALC@noend}{true}}
+%
+\ProcessOptions
+%
+% ALGORITHMIC
+\newcommand{\algorithmicrequire}{\textbf{Require:}}
+\newcommand{\algorithmicensure}{\textbf{Ensure:}}
+\newcommand{\algorithmiccomment}[1]{\{#1\}}
+\newcommand{\algorithmicend}{\textbf{end}}
+\newcommand{\algorithmicif}{\textbf{if}}
+\newcommand{\algorithmicthen}{\textbf{then}}
+\newcommand{\algorithmicelse}{\textbf{else}}
+\newcommand{\algorithmicelsif}{\algorithmicelse\ \algorithmicif}
+\newcommand{\algorithmicendif}{\algorithmicend\ \algorithmicif}
+\newcommand{\algorithmicfor}{\textbf{for}}
+\newcommand{\algorithmicforall}{\textbf{for all}}
+\newcommand{\algorithmicdo}{\textbf{do}}
+\newcommand{\algorithmicendfor}{\algorithmicend\ \algorithmicfor}
+\newcommand{\algorithmicwhile}{\textbf{while}}
+\newcommand{\algorithmicendwhile}{\algorithmicend\ \algorithmicwhile}
+\newcommand{\algorithmicloop}{\textbf{loop}}
+\newcommand{\algorithmicendloop}{\algorithmicend\ \algorithmicloop}
+\newcommand{\algorithmicrepeat}{\textbf{repeat}}
+\newcommand{\algorithmicuntil}{\textbf{until}}
+\def\ALC@item[#1]{%
+\if@noparitem \@donoparitem
+ \else \if@inlabel \indent \par \fi
+ \ifhmode \unskip\unskip \par \fi
+ \if@newlist \if@nobreak \@nbitem \else
+ \addpenalty\@beginparpenalty
+ \addvspace\@topsep \addvspace{-\parskip}\fi
+ \else \addpenalty\@itempenalty \addvspace\itemsep
+ \fi
+ \global\@inlabeltrue
+\fi
+\everypar{\global\@minipagefalse\global\@newlistfalse
+ \if@inlabel\global\@inlabelfalse \hskip -\parindent \box\@labels
+ \penalty\z@ \fi
+ \everypar{}}\global\@nobreakfalse
+\if@noitemarg \@noitemargfalse \if@nmbrlist \refstepcounter{\@listctr}\fi \fi
+\sbox\@tempboxa{\makelabel{#1}}%
+\global\setbox\@labels
+ \hbox{\unhbox\@labels \hskip \itemindent
+ \hskip -\labelwidth \hskip -\ALC@tlm
+ \ifdim \wd\@tempboxa >\labelwidth
+ \box\@tempboxa
+ \else \hbox to\labelwidth {\unhbox\@tempboxa}\fi
+ \hskip \ALC@tlm}\ignorespaces}
+%
+\newenvironment{algorithmic}[1][0]{
+\let\@item\ALC@item
+ \newcommand{\ALC@lno}{%
+\ifthenelse{\equal{\arabic{ALC@rem}}{0}}
+{{\footnotesize \arabic{ALC@line}:}}{}%
+}
+\let\@listii\@listi
+\let\@listiii\@listi
+\let\@listiv\@listi
+\let\@listv\@listi
+\let\@listvi\@listi
+\let\@listvii\@listi
+ \newenvironment{ALC@g}{
+ \begin{list}{\ALC@lno}{ \itemsep\z@ \itemindent\z@
+ \listparindent\z@ \rightmargin\z@
+ \topsep\z@ \partopsep\z@ \parskip\z@\parsep\z@
+ \leftmargin 1em
+ \addtolength{\ALC@tlm}{\leftmargin}
+ }
+ }
+ {\end{list}}
+ \newcommand{\ALC@it}{\addtocounter{ALC@line}{1}\addtocounter{ALC@rem}{1}\ifthenelse{\equal{\arabic{ALC@rem}}{#1}}{\setcounter{ALC@rem}{0}}{}\item}
+ \newcommand{\ALC@com}[1]{\ifthenelse{\equal{##1}{default}}%
+{}{\ \algorithmiccomment{##1}}}
+ \newcommand{\REQUIRE}{\item[\algorithmicrequire]}
+ \newcommand{\ENSURE}{\item[\algorithmicensure]}
+ \newcommand{\STATE}{\ALC@it}
+ \newcommand{\COMMENT}[1]{\algorithmiccomment{##1}}
+ \newenvironment{ALC@if}{\begin{ALC@g}}{\end{ALC@g}}
+ \newenvironment{ALC@for}{\begin{ALC@g}}{\end{ALC@g}}
+ \newenvironment{ALC@whl}{\begin{ALC@g}}{\end{ALC@g}}
+ \newenvironment{ALC@loop}{\begin{ALC@g}}{\end{ALC@g}}
+ \newenvironment{ALC@rpt}{\begin{ALC@g}}{\end{ALC@g}}
+ \renewcommand{\\}{\@centercr}
+ \newcommand{\IF}[2][default]{\ALC@it\algorithmicif\ ##2\ \algorithmicthen%
+\ALC@com{##1}\begin{ALC@if}}
+ \newcommand{\ELSE}[1][default]{\end{ALC@if}\ALC@it\algorithmicelse%
+\ALC@com{##1}\begin{ALC@if}}
+ \newcommand{\ELSIF}[2][default]%
+{\end{ALC@if}\ALC@it\algorithmicelsif\ ##2\ \algorithmicthen%
+\ALC@com{##1}\begin{ALC@if}}
+ \newcommand{\FOR}[2][default]{\ALC@it\algorithmicfor\ ##2\ \algorithmicdo%
+\ALC@com{##1}\begin{ALC@for}}
+ \newcommand{\FORALL}[2][default]{\ALC@it\algorithmicforall\ ##2\ %
+\algorithmicdo%
+\ALC@com{##1}\begin{ALC@for}}
+ \newcommand{\WHILE}[2][default]{\ALC@it\algorithmicwhile\ ##2\ %
+\algorithmicdo%
+\ALC@com{##1}\begin{ALC@whl}}
+ \newcommand{\LOOP}[1][default]{\ALC@it\algorithmicloop%
+\ALC@com{##1}\begin{ALC@loop}}
+ \newcommand{\REPEAT}[1][default]{\ALC@it\algorithmicrepeat%
+\ALC@com{##1}\begin{ALC@rpt}}
+ \newcommand{\UNTIL}[1]{\end{ALC@rpt}\ALC@it\algorithmicuntil\ ##1}
+ \ifthenelse{\boolean{ALC@noend}}{
+ \newcommand{\ENDIF}{\end{ALC@if}}
+ \newcommand{\ENDFOR}{\end{ALC@for}}
+ \newcommand{\ENDWHILE}{\end{ALC@whl}}
+ \newcommand{\ENDLOOP}{\end{ALC@loop}}
+ }{
+ \newcommand{\ENDIF}{\end{ALC@if}\ALC@it\algorithmicendif}
+ \newcommand{\ENDFOR}{\end{ALC@for}\ALC@it\algorithmicendfor}
+ \newcommand{\ENDWHILE}{\end{ALC@whl}\ALC@it\algorithmicendwhile}
+ \newcommand{\ENDLOOP}{\end{ALC@loop}\ALC@it\algorithmicendloop}
+ }
+ \renewcommand{\@toodeep}{}
+ \begin{list}{\ALC@lno}{\setcounter{ALC@line}{0}\setcounter{ALC@rem}{0}%
+ \itemsep\z@ \itemindent\z@ \listparindent\z@%
+ \partopsep\z@ \parskip\z@ \parsep\z@%
+ \labelsep 0.5em \topsep 0.2em%
+\ifthenelse{\equal{#1}{0}}
+ {\labelwidth 0.5em }
+ {\labelwidth 1.2em }
+\leftmargin\labelwidth \addtolength{\leftmargin}{\labelsep}
+ \ALC@tlm\labelsep
+ }
+}
+{\end{list}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/gsl-1.9/doc/autoconf.texi b/gsl-1.9/doc/autoconf.texi
new file mode 100644
index 0000000..8f8344a
--- /dev/null
+++ b/gsl-1.9/doc/autoconf.texi
@@ -0,0 +1,132 @@
+@cindex autoconf, using with GSL
+
+For applications using @code{autoconf} the standard macro
+@code{AC_CHECK_LIB} can be used to link with GSL automatically
+from a @code{configure} script. The library itself depends on the
+presence of a @sc{cblas} and math library as well, so these must also be
+located before linking with the main @code{libgsl} file. The following
+commands should be placed in the @file{configure.ac} file to perform
+these tests,
+
+@example
+AC_CHECK_LIB(m,main)
+AC_CHECK_LIB(gslcblas,main)
+AC_CHECK_LIB(gsl,main)
+@end example
+
+@noindent
+It is important to check for @code{libm} and @code{libgslcblas} before
+@code{libgsl}, otherwise the tests will fail. Assuming the libraries
+are found the output during the configure stage looks like this,
+
+@example
+checking for main in -lm... yes
+checking for main in -lgslcblas... yes
+checking for main in -lgsl... yes
+@end example
+
+@noindent
+If the library is found then the tests will define the macros
+@code{HAVE_LIBGSL}, @code{HAVE_LIBGSLCBLAS}, @code{HAVE_LIBM} and add
+the options @code{-lgsl -lgslcblas -lm} to the variable @code{LIBS}.
+
+The tests above will find any version of the library. They are suitable
+for general use, where the versions of the functions are not important.
+An alternative macro is available in the file @file{gsl.m4} to test for
+a specific version of the library. To use this macro simply add the
+following line to your @file{configure.in} file instead of the tests
+above:
+
+@example
+AM_PATH_GSL(GSL_VERSION,
+ [action-if-found],
+ [action-if-not-found])
+@end example
+
+@noindent
+The argument @code{GSL_VERSION} should be the two or three digit
+@sc{major.minor} or @sc{major.minor.micro} version number of the release
+you require. A suitable choice for @code{action-if-not-found} is,
+
+@example
+AC_MSG_ERROR(could not find required version of GSL)
+@end example
+
+@noindent
+Then you can add the variables @code{GSL_LIBS} and @code{GSL_CFLAGS} to
+your Makefile.am files to obtain the correct compiler flags.
+@code{GSL_LIBS} is equal to the output of the @code{gsl-config --libs}
+command and @code{GSL_CFLAGS} is equal to @code{gsl-config --cflags}
+command. For example,
+
+@example
+libfoo_la_LDFLAGS = -lfoo $(GSL_LIBS) -lgslcblas
+@end example
+
+@noindent
+Note that the macro @code{AM_PATH_GSL} needs to use the C compiler so it
+should appear in the @file{configure.in} file before the macro
+@code{AC_LANG_CPLUSPLUS} for programs that use C++.
+
+To test for @code{inline} the following test should be placed in your
+@file{configure.in} file,
+
+@example
+AC_C_INLINE
+
+if test "$ac_cv_c_inline" != no ; then
+ AC_DEFINE(HAVE_INLINE,1)
+ AC_SUBST(HAVE_INLINE)
+fi
+@end example
+
+@noindent
+and the macro will then be defined in the compilation flags or by
+including the file @file{config.h} before any library headers.
+
+The following autoconf test will check for @code{extern inline},
+
+@smallexample
+dnl Check for "extern inline", using a modified version
+dnl of the test for AC_C_INLINE from acspecific.mt
+dnl
+AC_CACHE_CHECK([for extern inline], ac_cv_c_extern_inline,
+[ac_cv_c_extern_inline=no
+AC_TRY_COMPILE([extern $ac_cv_c_inline double foo(double x);
+extern $ac_cv_c_inline double foo(double x) @{ return x+1.0; @};
+double foo (double x) @{ return x + 1.0; @};],
+[ foo(1.0) ],
+[ac_cv_c_extern_inline="yes"])
+])
+
+if test "$ac_cv_c_extern_inline" != no ; then
+ AC_DEFINE(HAVE_INLINE,1)
+ AC_SUBST(HAVE_INLINE)
+fi
+@end smallexample
+
+The substitution of portability functions can be made automatically if
+you use @code{autoconf}. For example, to test whether the BSD function
+@code{hypot} is available you can include the following line in the
+configure file @file{configure.in} for your application,
+
+@example
+AC_CHECK_FUNCS(hypot)
+@end example
+
+@noindent
+and place the following macro definitions in the file
+@file{config.h.in},
+
+@example
+/* Substitute gsl_hypot for missing system hypot */
+
+#ifndef HAVE_HYPOT
+#define hypot gsl_hypot
+#endif
+@end example
+
+@noindent
+The application source files can then use the include command
+@code{#include <config.h>} to substitute @code{gsl_hypot} for each
+occurrence of @code{hypot} when @code{hypot} is not available.
diff --git a/gsl-1.9/doc/blas.texi b/gsl-1.9/doc/blas.texi
new file mode 100644
index 0000000..65ad95b
--- /dev/null
+++ b/gsl-1.9/doc/blas.texi
@@ -0,0 +1,686 @@
+@cindex linear algebra, BLAS
+@cindex matrix, operations
+@cindex vector, operations
+@cindex BLAS
+@cindex CBLAS
+@cindex Basic Linear Algebra Subroutines (BLAS)
+
+The Basic Linear Algebra Subprograms (@sc{blas}) define a set of fundamental
+operations on vectors and matrices which can be used to create optimized
+higher-level linear algebra functionality.
+
+The library provides a low-level layer which corresponds directly to the
+C-language @sc{blas} standard, referred to here as ``@sc{cblas}'', and a
+higher-level interface for operations on GSL vectors and matrices.
+Users who are interested in simple operations on GSL vector and matrix
+objects should use the high-level layer, which is declared in the file
+@code{gsl_blas.h}. This should satisfy the needs of most users. Note
+that GSL matrices are implemented using dense-storage so the interface
+only includes the corresponding dense-storage @sc{blas} functions. The full
+@sc{blas} functionality for band-format and packed-format matrices is
+available through the low-level @sc{cblas} interface.
+
+The interface for the @code{gsl_cblas} layer is specified in the file
+@code{gsl_cblas.h}. This interface corresponds to the @sc{blas} Technical
+Forum's draft standard for the C interface to legacy @sc{blas}
+implementations. Users who have access to other conforming @sc{cblas}
+implementations can use these in place of the version provided by the
+library. Note that users who have only a Fortran @sc{blas} library can
+use a @sc{cblas} conformant wrapper to convert it into a @sc{cblas}
+library. A reference @sc{cblas} wrapper for legacy Fortran
+implementations exists as part of the draft @sc{cblas} standard and can
+be obtained from Netlib. The complete set of @sc{cblas} functions is
+listed in an appendix (@pxref{GSL CBLAS Library}).
+
+There are three levels of @sc{blas} operations,
+
+@table @b
+@item Level 1
+Vector operations, e.g. @math{y = \alpha x + y}
+@item Level 2
+Matrix-vector operations, e.g. @math{y = \alpha A x + \beta y}
+@item Level 3
+Matrix-matrix operations, e.g. @math{C = \alpha A B + C}
+@end table
+
+@noindent
+Each routine has a name which specifies the operation, the type of
+matrices involved and their precisions. Some of the most common
+operations and their names are given below,
+
+@table @b
+@item DOT
+scalar product, @math{x^T y}
+@item AXPY
+vector sum, @math{\alpha x + y}
+@item MV
+matrix-vector product, @math{A x}
+@item SV
+matrix-vector solve, @math{inv(A) x}
+@item MM
+matrix-matrix product, @math{A B}
+@item SM
+matrix-matrix solve, @math{inv(A) B}
+@end table
+
+@noindent
+The types of matrices are,
+
+@table @b
+@item GE
+general
+@item GB
+general band
+@item SY
+symmetric
+@item SB
+symmetric band
+@item SP
+symmetric packed
+@item HE
+hermitian
+@item HB
+hermitian band
+@item HP
+hermitian packed
+@item TR
+triangular
+@item TB
+triangular band
+@item TP
+triangular packed
+@end table
+
+@noindent
+Each operation is defined for four precisions,
+
+@table @b
+@item S
+single real
+@item D
+double real
+@item C
+single complex
+@item Z
+double complex
+@end table
+
+@noindent
+Thus, for example, the name @sc{sgemm} stands for ``single-precision
+general matrix-matrix multiply'' and @sc{zgemm} stands for
+``double-precision complex matrix-matrix multiply''.
+
+@menu
+* GSL BLAS Interface::
+* BLAS Examples::
+* BLAS References and Further Reading::
+@end menu
+
+@node GSL BLAS Interface
+@section GSL BLAS Interface
+
+GSL provides dense vector and matrix objects, based on the relevant
+built-in types. The library provides an interface to the @sc{blas}
+operations which apply to these objects. The interface to this
+functionality is given in the file @code{gsl_blas.h}.
+
+@comment CblasNoTrans, CblasTrans, CblasConjTrans
+@comment CblasUpper, CblasLower
+@comment CblasNonUnit, CblasUnit
+@comment CblasLeft, CblasRight
+
+@menu
+* Level 1 GSL BLAS Interface::
+* Level 2 GSL BLAS Interface::
+* Level 3 GSL BLAS Interface::
+@end menu
+
+@node Level 1 GSL BLAS Interface
+@subsection Level 1
+
+@deftypefun int gsl_blas_sdsdot (float @var{alpha}, const gsl_vector_float * @var{x}, const gsl_vector_float * @var{y}, float * @var{result})
+@cindex DOT, Level-1 BLAS
+This function computes the sum @math{\alpha + x^T y} for the vectors
+@var{x} and @var{y}, returning the result in @var{result}.
+@end deftypefun
+
+@deftypefun int gsl_blas_sdot (const gsl_vector_float * @var{x}, const gsl_vector_float * @var{y}, float * @var{result})
+@deftypefunx int gsl_blas_dsdot (const gsl_vector_float * @var{x}, const gsl_vector_float * @var{y}, double * @var{result})
+@deftypefunx int gsl_blas_ddot (const gsl_vector * @var{x}, const gsl_vector * @var{y}, double * @var{result})
+These functions compute the scalar product @math{x^T y} for the vectors
+@var{x} and @var{y}, returning the result in @var{result}.
+@end deftypefun
+
+@deftypefun int gsl_blas_cdotu (const gsl_vector_complex_float * @var{x}, const gsl_vector_complex_float * @var{y}, gsl_complex_float * @var{dotu})
+@deftypefunx int gsl_blas_zdotu (const gsl_vector_complex * @var{x}, const gsl_vector_complex * @var{y}, gsl_complex * @var{dotu})
+These functions compute the complex scalar product @math{x^T y} for the
+vectors @var{x} and @var{y}, returning the result in @var{result}
+@end deftypefun
+
+@deftypefun int gsl_blas_cdotc (const gsl_vector_complex_float * @var{x}, const gsl_vector_complex_float * @var{y}, gsl_complex_float * @var{dotc})
+@deftypefunx int gsl_blas_zdotc (const gsl_vector_complex * @var{x}, const gsl_vector_complex * @var{y}, gsl_complex * @var{dotc})
+These functions compute the complex conjugate scalar product @math{x^H
+y} for the vectors @var{x} and @var{y}, returning the result in
+@var{result}
+@end deftypefun
+
+@deftypefun float gsl_blas_snrm2 (const gsl_vector_float * @var{x})
+@deftypefunx double gsl_blas_dnrm2 (const gsl_vector * @var{x})
+@cindex NRM2, Level-1 BLAS
+These functions compute the Euclidean norm
+@c{$||x||_2 = \sqrt{\sum x_i^2}$}
+@math{||x||_2 = \sqrt @{\sum x_i^2@}} of the vector @var{x}.
+@end deftypefun
+
+@deftypefun float gsl_blas_scnrm2 (const gsl_vector_complex_float * @var{x})
+@deftypefunx double gsl_blas_dznrm2 (const gsl_vector_complex * @var{x})
+These functions compute the Euclidean norm of the complex vector @var{x},
+@tex
+\beforedisplay
+$$
+||x||_2 = \sqrt{\sum (\Re(x_i)^2 + \Im(x_i)^2)}.
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+||x||_2 = \sqrt @{\sum (\Re(x_i)^2 + \Im(x_i)^2)@}.
+@end example
+@end ifinfo
+@end deftypefun
+
+@deftypefun float gsl_blas_sasum (const gsl_vector_float * @var{x})
+@deftypefunx double gsl_blas_dasum (const gsl_vector * @var{x})
+@cindex ASUM, Level-1 BLAS
+These functions compute the absolute sum @math{\sum |x_i|} of the
+elements of the vector @var{x}.
+@end deftypefun
+
+@deftypefun float gsl_blas_scasum (const gsl_vector_complex_float * @var{x})
+@deftypefunx double gsl_blas_dzasum (const gsl_vector_complex * @var{x})
+These functions compute the sum of the magnitudes of the real and
+imaginary parts of the complex vector @var{x},
+@c{$\sum \left( |\Re(x_i)| + |\Im(x_i)| \right)$}
+@math{\sum |\Re(x_i)| + |\Im(x_i)|}.
+@end deftypefun
+
+@deftypefun CBLAS_INDEX_t gsl_blas_isamax (const gsl_vector_float * @var{x})
+@deftypefunx CBLAS_INDEX_t gsl_blas_idamax (const gsl_vector * @var{x})
+@deftypefunx CBLAS_INDEX_t gsl_blas_icamax (const gsl_vector_complex_float * @var{x})
+@deftypefunx CBLAS_INDEX_t gsl_blas_izamax (const gsl_vector_complex * @var{x})
+@cindex AMAX, Level-1 BLAS
+These functions return the index of the largest element of the vector
+@var{x}. The largest element is determined by its absolute magnitude for
+real vectors and by the sum of the magnitudes of the real and imaginary
+parts @math{|\Re(x_i)| + |\Im(x_i)|} for complex vectors. If the
+largest value occurs several times then the index of the first
+occurrence is returned.
+@end deftypefun
+
+@deftypefun int gsl_blas_sswap (gsl_vector_float * @var{x}, gsl_vector_float * @var{y})
+@deftypefunx int gsl_blas_dswap (gsl_vector * @var{x}, gsl_vector * @var{y})
+@deftypefunx int gsl_blas_cswap (gsl_vector_complex_float * @var{x}, gsl_vector_complex_float * @var{y})
+@deftypefunx int gsl_blas_zswap (gsl_vector_complex * @var{x}, gsl_vector_complex * @var{y})
+@cindex SWAP, Level-1 BLAS
+These functions exchange the elements of the vectors @var{x} and @var{y}.
+@end deftypefun
+
+@deftypefun int gsl_blas_scopy (const gsl_vector_float * @var{x}, gsl_vector_float * @var{y})
+@deftypefunx int gsl_blas_dcopy (const gsl_vector * @var{x}, gsl_vector * @var{y})
+@deftypefunx int gsl_blas_ccopy (const gsl_vector_complex_float * @var{x}, gsl_vector_complex_float * @var{y})
+@deftypefunx int gsl_blas_zcopy (const gsl_vector_complex * @var{x}, gsl_vector_complex * @var{y})
+@cindex COPY, Level-1 BLAS
+These functions copy the elements of the vector @var{x} into the vector
+@var{y}.
+@end deftypefun
+
+
+@deftypefun int gsl_blas_saxpy (float @var{alpha}, const gsl_vector_float * @var{x}, gsl_vector_float * @var{y})
+@deftypefunx int gsl_blas_daxpy (double @var{alpha}, const gsl_vector * @var{x}, gsl_vector * @var{y})
+@deftypefunx int gsl_blas_caxpy (const gsl_complex_float @var{alpha}, const gsl_vector_complex_float * @var{x}, gsl_vector_complex_float * @var{y})
+@deftypefunx int gsl_blas_zaxpy (const gsl_complex @var{alpha}, const gsl_vector_complex * @var{x}, gsl_vector_complex * @var{y})
+@cindex AXPY, Level-1 BLAS
+@cindex DAXPY, Level-1 BLAS
+@cindex SAXPY, Level-1 BLAS
+These functions compute the sum @math{y = \alpha x + y} for the vectors
+@var{x} and @var{y}.
+@end deftypefun
+
+@deftypefun void gsl_blas_sscal (float @var{alpha}, gsl_vector_float * @var{x})
+@deftypefunx void gsl_blas_dscal (double @var{alpha}, gsl_vector * @var{x})
+@deftypefunx void gsl_blas_cscal (const gsl_complex_float @var{alpha}, gsl_vector_complex_float * @var{x})
+@deftypefunx void gsl_blas_zscal (const gsl_complex @var{alpha}, gsl_vector_complex * @var{x})
+@deftypefunx void gsl_blas_csscal (float @var{alpha}, gsl_vector_complex_float * @var{x})
+@deftypefunx void gsl_blas_zdscal (double @var{alpha}, gsl_vector_complex * @var{x})
+@cindex SCAL, Level-1 BLAS
+These functions rescale the vector @var{x} by the multiplicative factor
+@var{alpha}.
+@end deftypefun
+
+@deftypefun int gsl_blas_srotg (float @var{a}[], float @var{b}[], float @var{c}[], float @var{s}[])
+@deftypefunx int gsl_blas_drotg (double @var{a}[], double @var{b}[], double @var{c}[], double @var{s}[])
+@cindex ROTG, Level-1 BLAS
+@cindex Givens Rotation, BLAS
+These functions compute a Givens rotation @math{(c,s)} which zeroes the
+vector @math{(a,b)},
+@tex
+\beforedisplay
+$$
+\left(
+\matrix{c&s\cr
+-s&c\cr}
+\right)
+\left(
+\matrix{a\cr
+b\cr}
+\right)
+=
+\left(
+\matrix{r'\cr
+0\cr}
+\right)
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+[ c s ] [ a ] = [ r ]
+[ -s c ] [ b ] [ 0 ]
+@end example
+
+@end ifinfo
+@noindent
+The variables @var{a} and @var{b} are overwritten by the routine.
+@end deftypefun
+
+@deftypefun int gsl_blas_srot (gsl_vector_float * @var{x}, gsl_vector_float * @var{y}, float @var{c}, float @var{s})
+@deftypefunx int gsl_blas_drot (gsl_vector * @var{x}, gsl_vector * @var{y}, const double @var{c}, const double @var{s})
+These functions apply a Givens rotation @math{(x', y') = (c x + s y, -s
+x + c y)} to the vectors @var{x}, @var{y}.
+@end deftypefun
+
+@deftypefun int gsl_blas_srotmg (float @var{d1}[], float @var{d2}[], float @var{b1}[], float @var{b2}, float @var{P}[])
+@deftypefunx int gsl_blas_drotmg (double @var{d1}[], double @var{d2}[], double @var{b1}[], double @var{b2}, double @var{P}[])
+@cindex Modified Givens Rotation, BLAS
+@cindex Givens Rotation, Modified, BLAS
+These functions compute a modified Givens transformation. The modified
+Givens transformation is defined in the original Level-1 @sc{blas}
+specification, given in the references.
+@end deftypefun
+
+@deftypefun int gsl_blas_srotm (gsl_vector_float * @var{x}, gsl_vector_float * @var{y}, const float @var{P}[])
+@deftypefunx int gsl_blas_drotm (gsl_vector * @var{x}, gsl_vector * @var{y}, const double @var{P}[])
+These functions apply a modified Givens transformation.
+@end deftypefun
+
+@node Level 2 GSL BLAS Interface
+@subsection Level 2
+
+@deftypefun int gsl_blas_sgemv (CBLAS_TRANSPOSE_t @var{TransA}, float @var{alpha}, const gsl_matrix_float * @var{A}, const gsl_vector_float * @var{x}, float @var{beta}, gsl_vector_float * @var{y})
+@deftypefunx int gsl_blas_dgemv (CBLAS_TRANSPOSE_t @var{TransA}, double @var{alpha}, const gsl_matrix * @var{A}, const gsl_vector * @var{x}, double @var{beta}, gsl_vector * @var{y})
+@deftypefunx int gsl_blas_cgemv (CBLAS_TRANSPOSE_t @var{TransA}, const gsl_complex_float @var{alpha}, const gsl_matrix_complex_float * @var{A}, const gsl_vector_complex_float * @var{x}, const gsl_complex_float @var{beta}, gsl_vector_complex_float * @var{y})
+@deftypefunx int gsl_blas_zgemv (CBLAS_TRANSPOSE_t @var{TransA}, const gsl_complex @var{alpha}, const gsl_matrix_complex * @var{A}, const gsl_vector_complex * @var{x}, const gsl_complex @var{beta}, gsl_vector_complex * @var{y})
+@cindex GEMV, Level-2 BLAS
+These functions compute the matrix-vector product and sum @math{y =
+\alpha op(A) x + \beta y}, where @math{op(A) = A},
+@math{A^T}, @math{A^H} for @var{TransA} = @code{CblasNoTrans},
+@code{CblasTrans}, @code{CblasConjTrans}.
+@end deftypefun
+
+
+@deftypefun int gsl_blas_strmv (CBLAS_UPLO_t @var{Uplo}, CBLAS_TRANSPOSE_t @var{TransA}, CBLAS_DIAG_t @var{Diag}, const gsl_matrix_float * @var{A}, gsl_vector_float * @var{x})
+@deftypefunx int gsl_blas_dtrmv (CBLAS_UPLO_t @var{Uplo}, CBLAS_TRANSPOSE_t @var{TransA}, CBLAS_DIAG_t @var{Diag}, const gsl_matrix * @var{A}, gsl_vector * @var{x})
+@deftypefunx int gsl_blas_ctrmv (CBLAS_UPLO_t @var{Uplo}, CBLAS_TRANSPOSE_t @var{TransA}, CBLAS_DIAG_t @var{Diag}, const gsl_matrix_complex_float * @var{A}, gsl_vector_complex_float * @var{x})
+@deftypefunx int gsl_blas_ztrmv (CBLAS_UPLO_t @var{Uplo}, CBLAS_TRANSPOSE_t @var{TransA}, CBLAS_DIAG_t @var{Diag}, const gsl_matrix_complex * @var{A}, gsl_vector_complex * @var{x})
+@cindex TRMV, Level-2 BLAS
+These functions compute the matrix-vector product
+@math{x = op(A) x} for the triangular matrix @var{A}, where
+@math{op(A) = A}, @math{A^T}, @math{A^H} for @var{TransA} =
+@code{CblasNoTrans}, @code{CblasTrans}, @code{CblasConjTrans}. When
+@var{Uplo} is @code{CblasUpper} then the upper triangle of @var{A} is
+used, and when @var{Uplo} is @code{CblasLower} then the lower triangle
+of @var{A} is used. If @var{Diag} is @code{CblasNonUnit} then the
+diagonal of the matrix is used, but if @var{Diag} is @code{CblasUnit}
+then the diagonal elements of the matrix @var{A} are taken as unity and
+are not referenced.
+@end deftypefun
+
+
+@deftypefun int gsl_blas_strsv (CBLAS_UPLO_t @var{Uplo}, CBLAS_TRANSPOSE_t @var{TransA}, CBLAS_DIAG_t @var{Diag}, const gsl_matrix_float * @var{A}, gsl_vector_float * @var{x})
+@deftypefunx int gsl_blas_dtrsv (CBLAS_UPLO_t @var{Uplo}, CBLAS_TRANSPOSE_t @var{TransA}, CBLAS_DIAG_t @var{Diag}, const gsl_matrix * @var{A}, gsl_vector * @var{x})
+@deftypefunx int gsl_blas_ctrsv (CBLAS_UPLO_t @var{Uplo}, CBLAS_TRANSPOSE_t @var{TransA}, CBLAS_DIAG_t @var{Diag}, const gsl_matrix_complex_float * @var{A}, gsl_vector_complex_float * @var{x})
+@deftypefunx int gsl_blas_ztrsv (CBLAS_UPLO_t @var{Uplo}, CBLAS_TRANSPOSE_t @var{TransA}, CBLAS_DIAG_t @var{Diag}, const gsl_matrix_complex * @var{A}, gsl_vector_complex * @var{x})
+@cindex TRSV, Level-2 BLAS
+These functions compute @math{inv(op(A)) x} for @var{x}, where
+@math{op(A) = A}, @math{A^T}, @math{A^H} for @var{TransA} =
+@code{CblasNoTrans}, @code{CblasTrans}, @code{CblasConjTrans}. When
+@var{Uplo} is @code{CblasUpper} then the upper triangle of @var{A} is
+used, and when @var{Uplo} is @code{CblasLower} then the lower triangle
+of @var{A} is used. If @var{Diag} is @code{CblasNonUnit} then the
+diagonal of the matrix is used, but if @var{Diag} is @code{CblasUnit}
+then the diagonal elements of the matrix @var{A} are taken as unity and
+are not referenced.
+@end deftypefun
+
+
+@deftypefun int gsl_blas_ssymv (CBLAS_UPLO_t @var{Uplo}, float @var{alpha}, const gsl_matrix_float * @var{A}, const gsl_vector_float * @var{x}, float @var{beta}, gsl_vector_float * @var{y})
+@deftypefunx int gsl_blas_dsymv (CBLAS_UPLO_t @var{Uplo}, double @var{alpha}, const gsl_matrix * @var{A}, const gsl_vector * @var{x}, double @var{beta}, gsl_vector * @var{y})
+@cindex SYMV, Level-2 BLAS
+These functions compute the matrix-vector product and sum @math{y =
+\alpha A x + \beta y} for the symmetric matrix @var{A}. Since the
+matrix @var{A} is symmetric only its upper half or lower half need to be
+stored. When @var{Uplo} is @code{CblasUpper} then the upper triangle
+and diagonal of @var{A} are used, and when @var{Uplo} is
+@code{CblasLower} then the lower triangle and diagonal of @var{A} are
+used.
+@end deftypefun
+
+@deftypefun int gsl_blas_chemv (CBLAS_UPLO_t @var{Uplo}, const gsl_complex_float @var{alpha}, const gsl_matrix_complex_float * @var{A}, const gsl_vector_complex_float * @var{x}, const gsl_complex_float @var{beta}, gsl_vector_complex_float * @var{y})
+@deftypefunx int gsl_blas_zhemv (CBLAS_UPLO_t @var{Uplo}, const gsl_complex @var{alpha}, const gsl_matrix_complex * @var{A}, const gsl_vector_complex * @var{x}, const gsl_complex @var{beta}, gsl_vector_complex * @var{y})
+@cindex HEMV, Level-2 BLAS
+These functions compute the matrix-vector product and sum @math{y =
+\alpha A x + \beta y} for the hermitian matrix @var{A}. Since the
+matrix @var{A} is hermitian only its upper half or lower half need to be
+stored. When @var{Uplo} is @code{CblasUpper} then the upper triangle
+and diagonal of @var{A} are used, and when @var{Uplo} is
+@code{CblasLower} then the lower triangle and diagonal of @var{A} are
+used. The imaginary elements of the diagonal are automatically assumed
+to be zero and are not referenced.
+@end deftypefun
+
+@deftypefun int gsl_blas_sger (float @var{alpha}, const gsl_vector_float * @var{x}, const gsl_vector_float * @var{y}, gsl_matrix_float * @var{A})
+@deftypefunx int gsl_blas_dger (double @var{alpha}, const gsl_vector * @var{x}, const gsl_vector * @var{y}, gsl_matrix * @var{A})
+@deftypefunx int gsl_blas_cgeru (const gsl_complex_float @var{alpha}, const gsl_vector_complex_float * @var{x}, const gsl_vector_complex_float * @var{y}, gsl_matrix_complex_float * @var{A})
+@deftypefunx int gsl_blas_zgeru (const gsl_complex @var{alpha}, const gsl_vector_complex * @var{x}, const gsl_vector_complex * @var{y}, gsl_matrix_complex * @var{A})
+@cindex GER, Level-2 BLAS
+@cindex GERU, Level-2 BLAS
+These functions compute the rank-1 update @math{A = \alpha x y^T + A} of
+the matrix @var{A}.
+@end deftypefun
+
+@deftypefun int gsl_blas_cgerc (const gsl_complex_float @var{alpha}, const gsl_vector_complex_float * @var{x}, const gsl_vector_complex_float * @var{y}, gsl_matrix_complex_float * @var{A})
+@deftypefunx int gsl_blas_zgerc (const gsl_complex @var{alpha}, const gsl_vector_complex * @var{x}, const gsl_vector_complex * @var{y}, gsl_matrix_complex * @var{A})
+@cindex GERC, Level-2 BLAS
+These functions compute the conjugate rank-1 update @math{A = \alpha x
+y^H + A} of the matrix @var{A}.
+@end deftypefun
+
+@deftypefun int gsl_blas_ssyr (CBLAS_UPLO_t @var{Uplo}, float @var{alpha}, const gsl_vector_float * @var{x}, gsl_matrix_float * @var{A})
+@deftypefunx int gsl_blas_dsyr (CBLAS_UPLO_t @var{Uplo}, double @var{alpha}, const gsl_vector * @var{x}, gsl_matrix * @var{A})
+@cindex SYR, Level-2 BLAS
+These functions compute the symmetric rank-1 update @math{A = \alpha x
+x^T + A} of the symmetric matrix @var{A}. Since the matrix @var{A} is
+symmetric only its upper half or lower half need to be stored. When
+@var{Uplo} is @code{CblasUpper} then the upper triangle and diagonal of
+@var{A} are used, and when @var{Uplo} is @code{CblasLower} then the
+lower triangle and diagonal of @var{A} are used.
+@end deftypefun
+
+@deftypefun int gsl_blas_cher (CBLAS_UPLO_t @var{Uplo}, float @var{alpha}, const gsl_vector_complex_float * @var{x}, gsl_matrix_complex_float * @var{A})
+@deftypefunx int gsl_blas_zher (CBLAS_UPLO_t @var{Uplo}, double @var{alpha}, const gsl_vector_complex * @var{x}, gsl_matrix_complex * @var{A})
+@cindex HER, Level-2 BLAS
+These functions compute the hermitian rank-1 update @math{A = \alpha x
+x^H + A} of the hermitian matrix @var{A}. Since the matrix @var{A} is
+hermitian only its upper half or lower half need to be stored. When
+@var{Uplo} is @code{CblasUpper} then the upper triangle and diagonal of
+@var{A} are used, and when @var{Uplo} is @code{CblasLower} then the
+lower triangle and diagonal of @var{A} are used. The imaginary elements
+of the diagonal are automatically set to zero.
+@end deftypefun
+
+@deftypefun int gsl_blas_ssyr2 (CBLAS_UPLO_t @var{Uplo}, float @var{alpha}, const gsl_vector_float * @var{x}, const gsl_vector_float * @var{y}, gsl_matrix_float * @var{A})
+@deftypefunx int gsl_blas_dsyr2 (CBLAS_UPLO_t @var{Uplo}, double @var{alpha}, const gsl_vector * @var{x}, const gsl_vector * @var{y}, gsl_matrix * @var{A})
+@cindex SYR2, Level-2 BLAS
+These functions compute the symmetric rank-2 update @math{A = \alpha x
+y^T + \alpha y x^T + A} of the symmetric matrix @var{A}. Since the
+matrix @var{A} is symmetric only its upper half or lower half need to be
+stored. When @var{Uplo} is @code{CblasUpper} then the upper triangle
+and diagonal of @var{A} are used, and when @var{Uplo} is
+@code{CblasLower} then the lower triangle and diagonal of @var{A} are
+used.
+@end deftypefun
+
+@deftypefun int gsl_blas_cher2 (CBLAS_UPLO_t @var{Uplo}, const gsl_complex_float @var{alpha}, const gsl_vector_complex_float * @var{x}, const gsl_vector_complex_float * @var{y}, gsl_matrix_complex_float * @var{A})
+@deftypefunx int gsl_blas_zher2 (CBLAS_UPLO_t @var{Uplo}, const gsl_complex @var{alpha}, const gsl_vector_complex * @var{x}, const gsl_vector_complex * @var{y}, gsl_matrix_complex * @var{A})
+@cindex HER2, Level-2 BLAS
+These functions compute the hermitian rank-2 update @math{A = \alpha x
+y^H + \alpha^* y x^H A} of the hermitian matrix @var{A}. Since the
+matrix @var{A} is hermitian only its upper half or lower half need to be
+stored. When @var{Uplo} is @code{CblasUpper} then the upper triangle
+and diagonal of @var{A} are used, and when @var{Uplo} is
+@code{CblasLower} then the lower triangle and diagonal of @var{A} are
+used. The imaginary elements of the diagonal are automatically set to zero.
+@end deftypefun
+
+@node Level 3 GSL BLAS Interface
+@subsection Level 3
+
+
+@deftypefun int gsl_blas_sgemm (CBLAS_TRANSPOSE_t @var{TransA}, CBLAS_TRANSPOSE_t @var{TransB}, float @var{alpha}, const gsl_matrix_float * @var{A}, const gsl_matrix_float * @var{B}, float @var{beta}, gsl_matrix_float * @var{C})
+@deftypefunx int gsl_blas_dgemm (CBLAS_TRANSPOSE_t @var{TransA}, CBLAS_TRANSPOSE_t @var{TransB}, double @var{alpha}, const gsl_matrix * @var{A}, const gsl_matrix * @var{B}, double @var{beta}, gsl_matrix * @var{C})
+@deftypefunx int gsl_blas_cgemm (CBLAS_TRANSPOSE_t @var{TransA}, CBLAS_TRANSPOSE_t @var{TransB}, const gsl_complex_float @var{alpha}, const gsl_matrix_complex_float * @var{A}, const gsl_matrix_complex_float * @var{B}, const gsl_complex_float @var{beta}, gsl_matrix_complex_float * @var{C})
+@deftypefunx int gsl_blas_zgemm (CBLAS_TRANSPOSE_t @var{TransA}, CBLAS_TRANSPOSE_t @var{TransB}, const gsl_complex @var{alpha}, const gsl_matrix_complex * @var{A}, const gsl_matrix_complex * @var{B}, const gsl_complex @var{beta}, gsl_matrix_complex * @var{C})
+@cindex GEMM, Level-3 BLAS
+These functions compute the matrix-matrix product and sum @math{C =
+\alpha op(A) op(B) + \beta C} where @math{op(A) = A}, @math{A^T},
+@math{A^H} for @var{TransA} = @code{CblasNoTrans}, @code{CblasTrans},
+@code{CblasConjTrans} and similarly for the parameter @var{TransB}.
+@end deftypefun
+
+
+@deftypefun int gsl_blas_ssymm (CBLAS_SIDE_t @var{Side}, CBLAS_UPLO_t @var{Uplo}, float @var{alpha}, const gsl_matrix_float * @var{A}, const gsl_matrix_float * @var{B}, float @var{beta}, gsl_matrix_float * @var{C})
+@deftypefunx int gsl_blas_dsymm (CBLAS_SIDE_t @var{Side}, CBLAS_UPLO_t @var{Uplo}, double @var{alpha}, const gsl_matrix * @var{A}, const gsl_matrix * @var{B}, double @var{beta}, gsl_matrix * @var{C})
+@deftypefunx int gsl_blas_csymm (CBLAS_SIDE_t @var{Side}, CBLAS_UPLO_t @var{Uplo}, const gsl_complex_float @var{alpha}, const gsl_matrix_complex_float * @var{A}, const gsl_matrix_complex_float * @var{B}, const gsl_complex_float @var{beta}, gsl_matrix_complex_float * @var{C})
+@deftypefunx int gsl_blas_zsymm (CBLAS_SIDE_t @var{Side}, CBLAS_UPLO_t @var{Uplo}, const gsl_complex @var{alpha}, const gsl_matrix_complex * @var{A}, const gsl_matrix_complex * @var{B}, const gsl_complex @var{beta}, gsl_matrix_complex * @var{C})
+@cindex SYMM, Level-3 BLAS
+These functions compute the matrix-matrix product and sum @math{C =
+\alpha A B + \beta C} for @var{Side} is @code{CblasLeft} and @math{C =
+\alpha B A + \beta C} for @var{Side} is @code{CblasRight}, where the
+matrix @var{A} is symmetric. When @var{Uplo} is @code{CblasUpper} then
+the upper triangle and diagonal of @var{A} are used, and when @var{Uplo}
+is @code{CblasLower} then the lower triangle and diagonal of @var{A} are
+used.
+@end deftypefun
+
+@deftypefun int gsl_blas_chemm (CBLAS_SIDE_t @var{Side}, CBLAS_UPLO_t @var{Uplo}, const gsl_complex_float @var{alpha}, const gsl_matrix_complex_float * @var{A}, const gsl_matrix_complex_float * @var{B}, const gsl_complex_float @var{beta}, gsl_matrix_complex_float * @var{C})
+@deftypefunx int gsl_blas_zhemm (CBLAS_SIDE_t @var{Side}, CBLAS_UPLO_t @var{Uplo}, const gsl_complex @var{alpha}, const gsl_matrix_complex * @var{A}, const gsl_matrix_complex * @var{B}, const gsl_complex @var{beta}, gsl_matrix_complex * @var{C})
+@cindex HEMM, Level-3 BLAS
+These functions compute the matrix-matrix product and sum @math{C =
+\alpha A B + \beta C} for @var{Side} is @code{CblasLeft} and @math{C =
+\alpha B A + \beta C} for @var{Side} is @code{CblasRight}, where the
+matrix @var{A} is hermitian. When @var{Uplo} is @code{CblasUpper} then
+the upper triangle and diagonal of @var{A} are used, and when @var{Uplo}
+is @code{CblasLower} then the lower triangle and diagonal of @var{A} are
+used. The imaginary elements of the diagonal are automatically set to
+zero.
+@end deftypefun
+
+@deftypefun int gsl_blas_strmm (CBLAS_SIDE_t @var{Side}, CBLAS_UPLO_t @var{Uplo}, CBLAS_TRANSPOSE_t @var{TransA}, CBLAS_DIAG_t @var{Diag}, float @var{alpha}, const gsl_matrix_float * @var{A}, gsl_matrix_float * @var{B})
+@deftypefunx int gsl_blas_dtrmm (CBLAS_SIDE_t @var{Side}, CBLAS_UPLO_t @var{Uplo}, CBLAS_TRANSPOSE_t @var{TransA}, CBLAS_DIAG_t @var{Diag}, double @var{alpha}, const gsl_matrix * @var{A}, gsl_matrix * @var{B})
+@deftypefunx int gsl_blas_ctrmm (CBLAS_SIDE_t @var{Side}, CBLAS_UPLO_t @var{Uplo}, CBLAS_TRANSPOSE_t @var{TransA}, CBLAS_DIAG_t @var{Diag}, const gsl_complex_float @var{alpha}, const gsl_matrix_complex_float * @var{A}, gsl_matrix_complex_float * @var{B})
+@deftypefunx int gsl_blas_ztrmm (CBLAS_SIDE_t @var{Side}, CBLAS_UPLO_t @var{Uplo}, CBLAS_TRANSPOSE_t @var{TransA}, CBLAS_DIAG_t @var{Diag}, const gsl_complex @var{alpha}, const gsl_matrix_complex * @var{A}, gsl_matrix_complex * @var{B})
+@cindex TRMM, Level-3 BLAS
+These functions compute the matrix-matrix product @math{B = \alpha op(A)
+B} for @var{Side} is @code{CblasLeft} and @math{B = \alpha B op(A)} for
+@var{Side} is @code{CblasRight}. The matrix @var{A} is triangular and
+@math{op(A) = A}, @math{A^T}, @math{A^H} for @var{TransA} =
+@code{CblasNoTrans}, @code{CblasTrans}, @code{CblasConjTrans}. When
+@var{Uplo} is @code{CblasUpper} then the upper triangle of @var{A} is
+used, and when @var{Uplo} is @code{CblasLower} then the lower triangle
+of @var{A} is used. If @var{Diag} is @code{CblasNonUnit} then the
+diagonal of @var{A} is used, but if @var{Diag} is @code{CblasUnit} then
+the diagonal elements of the matrix @var{A} are taken as unity and are
+not referenced.
+@end deftypefun
+
+
+@deftypefun int gsl_blas_strsm (CBLAS_SIDE_t @var{Side}, CBLAS_UPLO_t @var{Uplo}, CBLAS_TRANSPOSE_t @var{TransA}, CBLAS_DIAG_t @var{Diag}, float @var{alpha}, const gsl_matrix_float * @var{A}, gsl_matrix_float * @var{B})
+@deftypefunx int gsl_blas_dtrsm (CBLAS_SIDE_t @var{Side}, CBLAS_UPLO_t @var{Uplo}, CBLAS_TRANSPOSE_t @var{TransA}, CBLAS_DIAG_t @var{Diag}, double @var{alpha}, const gsl_matrix * @var{A}, gsl_matrix * @var{B})
+@deftypefunx int gsl_blas_ctrsm (CBLAS_SIDE_t @var{Side}, CBLAS_UPLO_t @var{Uplo}, CBLAS_TRANSPOSE_t @var{TransA}, CBLAS_DIAG_t @var{Diag}, const gsl_complex_float @var{alpha}, const gsl_matrix_complex_float * @var{A}, gsl_matrix_complex_float * @var{B})
+@deftypefunx int gsl_blas_ztrsm (CBLAS_SIDE_t @var{Side}, CBLAS_UPLO_t @var{Uplo}, CBLAS_TRANSPOSE_t @var{TransA}, CBLAS_DIAG_t @var{Diag}, const gsl_complex @var{alpha}, const gsl_matrix_complex * @var{A}, gsl_matrix_complex * @var{B})
+@cindex TRSM, Level-3 BLAS
+These functions compute the inverse-matrix matrix product
+@math{B = \alpha op(inv(A))B} for @var{Side} is
+@code{CblasLeft} and @math{B = \alpha B op(inv(A))} for
+@var{Side} is @code{CblasRight}. The matrix @var{A} is triangular and
+@math{op(A) = A}, @math{A^T}, @math{A^H} for @var{TransA} =
+@code{CblasNoTrans}, @code{CblasTrans}, @code{CblasConjTrans}. When
+@var{Uplo} is @code{CblasUpper} then the upper triangle of @var{A} is
+used, and when @var{Uplo} is @code{CblasLower} then the lower triangle
+of @var{A} is used. If @var{Diag} is @code{CblasNonUnit} then the
+diagonal of @var{A} is used, but if @var{Diag} is @code{CblasUnit} then
+the diagonal elements of the matrix @var{A} are taken as unity and are
+not referenced.
+@end deftypefun
+
+@deftypefun int gsl_blas_ssyrk (CBLAS_UPLO_t @var{Uplo}, CBLAS_TRANSPOSE_t @var{Trans}, float @var{alpha}, const gsl_matrix_float * @var{A}, float @var{beta}, gsl_matrix_float * @var{C})
+@deftypefunx int gsl_blas_dsyrk (CBLAS_UPLO_t @var{Uplo}, CBLAS_TRANSPOSE_t @var{Trans}, double @var{alpha}, const gsl_matrix * @var{A}, double @var{beta}, gsl_matrix * @var{C})
+@deftypefunx int gsl_blas_csyrk (CBLAS_UPLO_t @var{Uplo}, CBLAS_TRANSPOSE_t @var{Trans}, const gsl_complex_float @var{alpha}, const gsl_matrix_complex_float * @var{A}, const gsl_complex_float @var{beta}, gsl_matrix_complex_float * @var{C})
+@deftypefunx int gsl_blas_zsyrk (CBLAS_UPLO_t @var{Uplo}, CBLAS_TRANSPOSE_t @var{Trans}, const gsl_complex @var{alpha}, const gsl_matrix_complex * @var{A}, const gsl_complex @var{beta}, gsl_matrix_complex * @var{C})
+@cindex SYRK, Level-3 BLAS
+These functions compute a rank-k update of the symmetric matrix @var{C},
+@math{C = \alpha A A^T + \beta C} when @var{Trans} is
+@code{CblasNoTrans} and @math{C = \alpha A^T A + \beta C} when
+@var{Trans} is @code{CblasTrans}. Since the matrix @var{C} is symmetric
+only its upper half or lower half need to be stored. When @var{Uplo} is
+@code{CblasUpper} then the upper triangle and diagonal of @var{C} are
+used, and when @var{Uplo} is @code{CblasLower} then the lower triangle
+and diagonal of @var{C} are used.
+@end deftypefun
+
+@deftypefun int gsl_blas_cherk (CBLAS_UPLO_t @var{Uplo}, CBLAS_TRANSPOSE_t @var{Trans}, float @var{alpha}, const gsl_matrix_complex_float * @var{A}, float @var{beta}, gsl_matrix_complex_float * @var{C})
+@deftypefunx int gsl_blas_zherk (CBLAS_UPLO_t @var{Uplo}, CBLAS_TRANSPOSE_t @var{Trans}, double @var{alpha}, const gsl_matrix_complex * @var{A}, double @var{beta}, gsl_matrix_complex * @var{C})
+@cindex HERK, Level-3 BLAS
+These functions compute a rank-k update of the hermitian matrix @var{C},
+@math{C = \alpha A A^H + \beta C} when @var{Trans} is
+@code{CblasNoTrans} and @math{C = \alpha A^H A + \beta C} when
+@var{Trans} is @code{CblasTrans}. Since the matrix @var{C} is hermitian
+only its upper half or lower half need to be stored. When @var{Uplo} is
+@code{CblasUpper} then the upper triangle and diagonal of @var{C} are
+used, and when @var{Uplo} is @code{CblasLower} then the lower triangle
+and diagonal of @var{C} are used. The imaginary elements of the
+diagonal are automatically set to zero.
+@end deftypefun
+
+@deftypefun int gsl_blas_ssyr2k (CBLAS_UPLO_t @var{Uplo}, CBLAS_TRANSPOSE_t @var{Trans}, float @var{alpha}, const gsl_matrix_float * @var{A}, const gsl_matrix_float * @var{B}, float @var{beta}, gsl_matrix_float * @var{C})
+@deftypefunx int gsl_blas_dsyr2k (CBLAS_UPLO_t @var{Uplo}, CBLAS_TRANSPOSE_t @var{Trans}, double @var{alpha}, const gsl_matrix * @var{A}, const gsl_matrix * @var{B}, double @var{beta}, gsl_matrix * @var{C})
+@deftypefunx int gsl_blas_csyr2k (CBLAS_UPLO_t @var{Uplo}, CBLAS_TRANSPOSE_t @var{Trans}, const gsl_complex_float @var{alpha}, const gsl_matrix_complex_float * @var{A}, const gsl_matrix_complex_float * @var{B}, const gsl_complex_float @var{beta}, gsl_matrix_complex_float * @var{C})
+@deftypefunx int gsl_blas_zsyr2k (CBLAS_UPLO_t @var{Uplo}, CBLAS_TRANSPOSE_t @var{Trans}, const gsl_complex @var{alpha}, const gsl_matrix_complex * @var{A}, const gsl_matrix_complex * @var{B}, const gsl_complex @var{beta}, gsl_matrix_complex * @var{C})
+@cindex SYR2K, Level-3 BLAS
+These functions compute a rank-2k update of the symmetric matrix @var{C},
+@math{C = \alpha A B^T + \alpha B A^T + \beta C} when @var{Trans} is
+@code{CblasNoTrans} and @math{C = \alpha A^T B + \alpha B^T A + \beta C} when
+@var{Trans} is @code{CblasTrans}. Since the matrix @var{C} is symmetric
+only its upper half or lower half need to be stored. When @var{Uplo} is
+@code{CblasUpper} then the upper triangle and diagonal of @var{C} are
+used, and when @var{Uplo} is @code{CblasLower} then the lower triangle
+and diagonal of @var{C} are used.
+@end deftypefun
+
+@deftypefun int gsl_blas_cher2k (CBLAS_UPLO_t @var{Uplo}, CBLAS_TRANSPOSE_t @var{Trans}, const gsl_complex_float @var{alpha}, const gsl_matrix_complex_float * @var{A}, const gsl_matrix_complex_float * @var{B}, float @var{beta}, gsl_matrix_complex_float * @var{C})
+@deftypefunx int gsl_blas_zher2k (CBLAS_UPLO_t @var{Uplo}, CBLAS_TRANSPOSE_t @var{Trans}, const gsl_complex @var{alpha}, const gsl_matrix_complex * @var{A}, const gsl_matrix_complex * @var{B}, double @var{beta}, gsl_matrix_complex * @var{C})
+@cindex HER2K, Level-3 BLAS
+These functions compute a rank-2k update of the hermitian matrix @var{C},
+@math{C = \alpha A B^H + \alpha^* B A^H + \beta C} when @var{Trans} is
+@code{CblasNoTrans} and @math{C = \alpha A^H B + \alpha^* B^H A + \beta C} when
+@var{Trans} is @code{CblasConjTrans}. Since the matrix @var{C} is hermitian
+only its upper half or lower half need to be stored. When @var{Uplo} is
+@code{CblasUpper} then the upper triangle and diagonal of @var{C} are
+used, and when @var{Uplo} is @code{CblasLower} then the lower triangle
+and diagonal of @var{C} are used. The imaginary elements of the
+diagonal are automatically set to zero.
+@end deftypefun
+
+@node BLAS Examples
+@section Examples
+
+The following program computes the product of two matrices using the
+Level-3 @sc{blas} function @sc{dgemm},
+@tex
+\beforedisplay
+$$
+\left(
+\matrix{0.11&0.12&0.13\cr
+0.21&0.22&0.23\cr}
+\right)
+\left(
+\matrix{1011&1012\cr
+1021&1022\cr
+1031&1031\cr}
+\right)
+=
+\left(
+\matrix{367.76&368.12\cr
+674.06&674.72\cr}
+\right)
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+[ 0.11 0.12 0.13 ] [ 1011 1012 ] [ 367.76 368.12 ]
+[ 0.21 0.22 0.23 ] [ 1021 1022 ] = [ 674.06 674.72 ]
+ [ 1031 1032 ]
+@end example
+
+@end ifinfo
+@noindent
+The matrices are stored in row major order, according to the C convention
+for arrays.
+
+@example
+@verbatiminclude examples/blas.c
+@end example
+
+@noindent
+Here is the output from the program,
+
+@example
+$ ./a.out
+@verbatiminclude examples/blas.out
+@end example
+
+@node BLAS References and Further Reading
+@section References and Further Reading
+
+Information on the @sc{blas} standards, including both the legacy and
+draft interface standards, is available online from the @sc{blas}
+Homepage and @sc{blas} Technical Forum web-site.
+
+@itemize @asis
+@item
+@cite{BLAS Homepage} @*
+@uref{http://www.netlib.org/blas/}
+@item
+@cite{BLAS Technical Forum} @*
+@uref{http://www.netlib.org/cgi-bin/checkout/blast/blast.pl}
+@end itemize
+
+@noindent
+The following papers contain the specifications for Level 1, Level 2 and
+Level 3 @sc{blas}.
+
+@itemize @asis
+@item
+C. Lawson, R. Hanson, D. Kincaid, F. Krogh, ``Basic Linear Algebra
+Subprograms for Fortran Usage'', @cite{ACM Transactions on Mathematical
+Software}, Vol.@: 5 (1979), Pages 308--325.
+
+@item
+J.J. Dongarra, J. DuCroz, S. Hammarling, R. Hanson, ``An Extended Set of
+Fortran Basic Linear Algebra Subprograms'', @cite{ACM Transactions on
+Mathematical Software}, Vol.@: 14, No.@: 1 (1988), Pages 1--32.
+
+@item
+J.J. Dongarra, I. Duff, J. DuCroz, S. Hammarling, ``A Set of
+Level 3 Basic Linear Algebra Subprograms'', @cite{ACM Transactions on
+Mathematical Software}, Vol.@: 16 (1990), Pages 1--28.
+@end itemize
+
+@noindent
+Postscript versions of the latter two papers are available from
+@uref{http://www.netlib.org/blas/}. A @sc{cblas} wrapper for Fortran @sc{blas}
+libraries is available from the same location.
diff --git a/gsl-1.9/doc/bspline.eps b/gsl-1.9/doc/bspline.eps
new file mode 100644
index 0000000..899a890
--- /dev/null
+++ b/gsl-1.9/doc/bspline.eps
@@ -0,0 +1,6930 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: GNU libplot drawing library 4.2
+%%Title: PostScript plot
+%%CreationDate: Tue Jan 16 12:56:43 2007
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 1
+%%Pages: 1
+%%PageOrder: Ascend
+%%Orientation: Portrait
+%%BoundingBox: 60 174 480 570
+%%DocumentNeededResources: font Helvetica
+%%DocumentSuppliedResources: procset GNU_libplot 1.1 0
+%%EndComments
+
+%%BeginDefaults
+%%PageResources: font Helvetica
+%%EndDefaults
+
+%%BeginProlog
+%%EndProlog
+
+%%BeginSetup
+%%IncludeResource: font Helvetica
+/DrawDict 50 dict def
+DrawDict begin
+/ISOLatin1Encoding [
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright
+/parenleft/parenright/asterisk/plus/comma/minus/period/slash
+/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon
+/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N
+/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright
+/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m
+/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/dotlessi/grave/acute/circumflex/tilde/macron/breve
+/dotaccent/dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut
+/ogonek/caron/space/exclamdown/cent/sterling/currency/yen/brokenbar
+/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot
+/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior
+/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine
+/guillemotright/onequarter/onehalf/threequarters/questiondown
+/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla
+/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex
+/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis
+/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute
+/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis
+/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave
+/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex
+/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis
+/yacute/thorn/ydieresis
+] def
+/reencodeISO {
+dup dup findfont dup length dict begin
+{ 1 index /FID ne { def }{ pop pop } ifelse } forall
+/Encoding ISOLatin1Encoding def
+currentdict end definefont
+} def
+/Helvetica reencodeISO def
+%%BeginResource procset GNU_libplot 1.1 0
+/none null def
+/numGraphicParameters 17 def
+/stringLimit 65535 def
+/arrowHeight 8 def
+/eoFillRule true def
+
+/Begin { save numGraphicParameters dict begin } def
+/End { end restore } def
+
+/SetB {
+dup type /nulltype eq {
+pop
+false /brushRightArrow idef
+false /brushLeftArrow idef
+true /brushNone idef
+} {
+/brushDashOffset idef
+/brushDashArray idef
+0 ne /brushRightArrow idef
+0 ne /brushLeftArrow idef
+/brushWidth idef
+false /brushNone idef
+} ifelse
+} def
+
+/SetCFg {
+/fgblue idef
+/fggreen idef
+/fgred idef
+} def
+
+/SetCBg {
+/bgblue idef
+/bggreen idef
+/bgred idef
+} def
+
+/SetF {
+/printSize idef
+/printFont idef
+} def
+
+/SetP {
+dup type /nulltype eq {
+pop true /patternNone idef
+} {
+/patternGrayLevel idef
+patternGrayLevel -1 eq {
+/patternString idef
+} if
+false /patternNone idef
+} ifelse
+} def
+
+/BSpl {
+0 begin
+storexyn
+newpath
+n 1 gt {
+0 0 0 0 0 0 1 1 true subspline
+n 2 gt {
+0 0 0 0 1 1 2 2 false subspline
+1 1 n 3 sub {
+/i exch def
+i 1 sub dup i dup i 1 add dup i 2 add dup false subspline
+} for
+n 3 sub dup n 2 sub dup n 1 sub dup 2 copy false subspline
+} if
+n 2 sub dup n 1 sub dup 2 copy 2 copy false subspline
+patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if
+brushNone not { istroke } if
+0 0 1 1 leftarrow
+n 2 sub dup 1 sub dup rightarrow
+} if
+end
+} dup 0 4 dict put def
+
+/Circ {
+newpath
+0 360 arc
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+} def
+
+/CBSpl {
+0 begin
+dup 2 gt {
+storexyn
+newpath
+n 1 sub dup 0 0 1 1 2 2 true subspline
+1 1 n 3 sub {
+/i exch def
+i 1 sub dup i dup i 1 add dup i 2 add dup false subspline
+} for
+n 3 sub dup n 2 sub dup n 1 sub dup 0 0 false subspline
+n 2 sub dup n 1 sub dup 0 0 1 1 false subspline
+patternNone not { ifill } if
+brushNone not { istroke } if
+} {
+Poly
+} ifelse
+end
+} dup 0 4 dict put def
+
+/Elli {
+0 begin
+newpath
+4 2 roll
+translate
+scale
+0 0 1 0 360 arc
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+end
+} dup 0 1 dict put def
+
+/Line {
+0 begin
+2 storexyn
+newpath
+x 0 get y 0 get moveto
+x 1 get y 1 get lineto
+brushNone not { istroke } if
+0 0 1 1 leftarrow
+0 0 1 1 rightarrow
+end
+} dup 0 4 dict put def
+
+/MLine {
+0 begin
+storexyn
+newpath
+n 1 gt {
+x 0 get y 0 get moveto
+1 1 n 1 sub {
+/i exch def
+x i get y i get lineto
+} for
+patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if
+brushNone not { istroke } if
+0 0 1 1 leftarrow
+n 2 sub dup n 1 sub dup rightarrow
+} if
+end
+} dup 0 4 dict put def
+
+/Poly {
+3 1 roll
+newpath
+moveto
+-1 add
+{ lineto } repeat
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+} def
+
+/Rect {
+0 begin
+/t exch def
+/r exch def
+/b exch def
+/l exch def
+newpath
+l b moveto
+l t lineto
+r t lineto
+r b lineto
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+end
+} dup 0 4 dict put def
+
+/Text {
+ishow
+} def
+
+/idef {
+dup where { pop pop pop } { exch def } ifelse
+} def
+
+/ifill {
+0 begin
+gsave
+patternGrayLevel -1 ne {
+fgred bgred fgred sub patternGrayLevel mul add
+fggreen bggreen fggreen sub patternGrayLevel mul add
+fgblue bgblue fgblue sub patternGrayLevel mul add setrgbcolor
+eoFillRule { eofill } { fill } ifelse
+} {
+eoFillRule { eoclip } { clip } ifelse
+originalCTM setmatrix
+pathbbox /t exch def /r exch def /b exch def /l exch def
+/w r l sub ceiling cvi def
+/h t b sub ceiling cvi def
+/imageByteWidth w 8 div ceiling cvi def
+/imageHeight h def
+bgred bggreen bgblue setrgbcolor
+eoFillRule { eofill } { fill } ifelse
+fgred fggreen fgblue setrgbcolor
+w 0 gt h 0 gt and {
+l b translate w h scale
+w h true [w 0 0 h neg 0 h] { patternproc } imagemask
+} if
+} ifelse
+grestore
+end
+} dup 0 8 dict put def
+
+/istroke {
+gsave
+brushDashOffset -1 eq {
+[] 0 setdash
+1 setgray
+} {
+brushDashArray brushDashOffset setdash
+fgred fggreen fgblue setrgbcolor
+} ifelse
+brushWidth setlinewidth
+originalCTM setmatrix
+stroke
+grestore
+} def
+
+/ishow {
+0 begin
+gsave
+fgred fggreen fgblue setrgbcolor
+/fontDict printFont findfont printSize scalefont dup setfont def
+/descender fontDict begin 0 /FontBBox load 1 get FontMatrix end
+transform exch pop def
+/vertoffset 1 printSize sub descender sub def {
+0 vertoffset moveto show
+/vertoffset vertoffset printSize sub def
+} forall
+grestore
+end
+} dup 0 3 dict put def
+
+/patternproc {
+0 begin
+/patternByteLength patternString length def
+/patternHeight patternByteLength 8 mul sqrt cvi def
+/patternWidth patternHeight def
+/patternByteWidth patternWidth 8 idiv def
+/imageByteMaxLength imageByteWidth imageHeight mul
+stringLimit patternByteWidth sub min def
+/imageMaxHeight imageByteMaxLength imageByteWidth idiv patternHeight idiv
+patternHeight mul patternHeight max def
+/imageHeight imageHeight imageMaxHeight sub store
+/imageString imageByteWidth imageMaxHeight mul patternByteWidth add string def
+0 1 imageMaxHeight 1 sub {
+/y exch def
+/patternRow y patternByteWidth mul patternByteLength mod def
+/patternRowString patternString patternRow patternByteWidth getinterval def
+/imageRow y imageByteWidth mul def
+0 patternByteWidth imageByteWidth 1 sub {
+/x exch def
+imageString imageRow x add patternRowString putinterval
+} for
+} for
+imageString
+end
+} dup 0 12 dict put def
+
+/min {
+dup 3 2 roll dup 4 3 roll lt { exch } if pop
+} def
+
+/max {
+dup 3 2 roll dup 4 3 roll gt { exch } if pop
+} def
+
+/midpoint {
+0 begin
+/y1 exch def
+/x1 exch def
+/y0 exch def
+/x0 exch def
+x0 x1 add 2 div
+y0 y1 add 2 div
+end
+} dup 0 4 dict put def
+
+/thirdpoint {
+0 begin
+/y1 exch def
+/x1 exch def
+/y0 exch def
+/x0 exch def
+x0 2 mul x1 add 3 div
+y0 2 mul y1 add 3 div
+end
+} dup 0 4 dict put def
+
+/subspline {
+0 begin
+/movetoNeeded exch def
+y exch get /y3 exch def
+x exch get /x3 exch def
+y exch get /y2 exch def
+x exch get /x2 exch def
+y exch get /y1 exch def
+x exch get /x1 exch def
+y exch get /y0 exch def
+x exch get /x0 exch def
+x1 y1 x2 y2 thirdpoint
+/p1y exch def
+/p1x exch def
+x2 y2 x1 y1 thirdpoint
+/p2y exch def
+/p2x exch def
+x1 y1 x0 y0 thirdpoint
+p1x p1y midpoint
+/p0y exch def
+/p0x exch def
+x2 y2 x3 y3 thirdpoint
+p2x p2y midpoint
+/p3y exch def
+/p3x exch def
+movetoNeeded { p0x p0y moveto } if
+p1x p1y p2x p2y p3x p3y curveto
+end
+} dup 0 17 dict put def
+
+/storexyn {
+/n exch def
+/y n array def
+/x n array def
+n 1 sub -1 0 {
+/i exch def
+y i 3 2 roll put
+x i 3 2 roll put
+} for
+} def
+
+/arrowhead {
+0 begin
+transform originalCTM itransform
+/taily exch def
+/tailx exch def
+transform originalCTM itransform
+/tipy exch def
+/tipx exch def
+/dy tipy taily sub def
+/dx tipx tailx sub def
+/angle dx 0 ne dy 0 ne or { dy dx atan } { 90 } ifelse def
+gsave
+originalCTM setmatrix
+tipx tipy translate
+angle rotate
+newpath
+arrowHeight neg arrowWidth 2 div moveto
+0 0 lineto
+arrowHeight neg arrowWidth 2 div neg lineto
+patternNone not {
+originalCTM setmatrix
+/padtip arrowHeight 2 exp 0.25 arrowWidth 2 exp mul add sqrt brushWidth mul
+arrowWidth div def
+/padtail brushWidth 2 div def
+tipx tipy translate
+angle rotate
+padtip 0 translate
+arrowHeight padtip add padtail add arrowHeight div dup scale
+arrowheadpath
+ifill
+} if
+brushNone not {
+originalCTM setmatrix
+tipx tipy translate
+angle rotate
+arrowheadpath
+istroke
+} if
+grestore
+end
+} dup 0 9 dict put def
+
+/arrowheadpath {
+newpath
+arrowHeight neg arrowWidth 2 div moveto
+0 0 lineto
+arrowHeight neg arrowWidth 2 div neg lineto
+} def
+
+/leftarrow {
+0 begin
+y exch get /taily exch def
+x exch get /tailx exch def
+y exch get /tipy exch def
+x exch get /tipx exch def
+brushLeftArrow { tipx tipy tailx taily arrowhead } if
+end
+} dup 0 4 dict put def
+
+/rightarrow {
+0 begin
+y exch get /tipy exch def
+x exch get /tipx exch def
+y exch get /taily exch def
+x exch get /tailx exch def
+brushRightArrow { tipx tipy tailx taily arrowhead } if
+end
+} dup 0 4 dict put def
+%%EndResource
+%%EndSetup
+
+%%Page: 1 1
+%%PageResources: font Helvetica
+%%PageBoundingBox: 60 174 480 570
+%%BeginPageSetup
+%I Idraw 8
+
+Begin
+%I b u
+%I cfg u
+%I cbg u
+%I f u
+%I p u
+%I t
+[ 1 0 0 1 0 0 ] concat
+/originalCTM matrix currentmatrix def
+/trueoriginalCTM matrix currentmatrix def
+%%EndPageSetup
+
+Begin %I Rect
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+2304 2304 9216 9216 Rect
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 128.156 214.1855 ] concat
+%I
+[
+(0)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 9216
+2304 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2304 2442
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 174.236 214.1855 ] concat
+%I
+[
+(2)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3226 9216
+3226 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3226 2304
+3226 2442
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 220.316 214.1855 ] concat
+%I
+[
+(4)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4147 9216
+4147 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4147 2304
+4147 2442
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 266.396 214.1855 ] concat
+%I
+[
+(6)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5069 9216
+5069 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5069 2304
+5069 2442
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 312.476 214.1855 ] concat
+%I
+[
+(8)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5990 9216
+5990 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5990 2304
+5990 2442
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 353.5119 214.1855 ] concat
+%I
+[
+(10)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6912 9216
+6912 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6912 2304
+6912 2442
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 399.5919 214.1855 ] concat
+%I
+[
+(12)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7834 9216
+7834 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7834 2304
+7834 2442
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 445.6719 214.1855 ] concat
+%I
+[
+(14)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8755 9216
+8755 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8755 2304
+8755 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 9216
+2304 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2304 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2765 9216
+2765 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2765 2304
+2765 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3226 9216
+3226 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3226 2304
+3226 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3686 9216
+3686 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3686 2304
+3686 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4147 9216
+4147 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4147 2304
+4147 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4608 9216
+4608 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4608 2304
+4608 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5069 9216
+5069 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5069 2304
+5069 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5530 9216
+5530 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5530 2304
+5530 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5990 9216
+5990 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5990 2304
+5990 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6451 9216
+6451 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6451 2304
+6451 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6912 9216
+6912 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6912 2304
+6912 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7373 9216
+7373 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7373 2304
+7373 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7834 9216
+7834 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7834 2304
+7834 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8294 9216
+8294 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8294 2304
+8294 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8755 9216
+8755 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8755 2304
+8755 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 9216
+9216 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2304
+9216 2359
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 92.19974 229.8568 ] concat
+%I
+[
+(-1.0)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2304
+9078 2304
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2442 2304
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 92.19974 304.9872 ] concat
+%I
+[
+(-0.5)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 3807
+9078 3807
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3807
+2442 3807
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 102.7958 380.1176 ] concat
+%I
+[
+(0.0)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5309
+9078 5309
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5309
+2442 5309
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 102.7958 455.2481 ] concat
+%I
+[
+(0.5)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 6812
+9078 6812
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 6812
+2442 6812
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 102.7958 530.3785 ] concat
+%I
+[
+(1.0)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 8314
+9078 8314
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 8314
+2442 8314
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2304
+9161 2304
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2359 2304
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2605
+9161 2605
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2605
+2359 2605
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2905
+9161 2905
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2905
+2359 2905
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 3206
+9161 3206
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3206
+2359 3206
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 3506
+9161 3506
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3506
+2359 3506
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 3807
+9161 3807
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3807
+2359 3807
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4107
+9161 4107
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4107
+2359 4107
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4408
+9161 4408
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4408
+2359 4408
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4708
+9161 4708
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4708
+2359 4708
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5009
+9161 5009
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5009
+2359 5009
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5309
+9161 5309
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5309
+2359 5309
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5610
+9161 5610
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5610
+2359 5610
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5910
+9161 5910
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5910
+2359 5910
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 6211
+9161 6211
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 6211
+2359 6211
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 6511
+9161 6511
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 6511
+2359 6511
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 6812
+9161 6812
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 6812
+2359 6812
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 7112
+9161 7112
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 7112
+2359 7112
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 7413
+9161 7413
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 7413
+2359 7413
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 7713
+9161 7713
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 7713
+2359 7713
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 8014
+9161 8014
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 8014
+2359 8014
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 8314
+9161 8314
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 8314
+2359 8314
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 8615
+9161 8615
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 8615
+2359 8615
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 8915
+9161 8915
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 8915
+2359 8915
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 9216
+9161 9216
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 9216
+2359 9216
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 34952
+1 0 0 [ 1.48 4.43 ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5309
+9216 5309
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 301.464 191.5487 ] concat
+%I
+[
+(x)
+] Text
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 6.123032e-17 1 -1 6.123032e-17 64.69371 391.464 ] concat
+%I
+[
+(y)
+] Text
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+2304 8355 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+2339 8257 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+2373 8739 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+2408 8393 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+2443 8393 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+2478 7616 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+2512 7173 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+2547 7568 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+2582 7628 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+2617 7764 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+2651 7336 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+2686 6788 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+2721 6805 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+2756 6882 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+2790 6892 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+2825 6288 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+2860 6068 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+2894 6066 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+2929 5665 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+2964 5420 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+2999 5657 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+3033 5168 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+3068 5000 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+3103 4624 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+3138 4542 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+3172 4561 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+3207 4386 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+3242 3986 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+3277 4015 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+3311 4359 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+3346 3720 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+3381 3582 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+3415 3507 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+3450 2685 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+3485 3536 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+3520 3276 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+3554 3157 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+3589 3390 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+3624 3613 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+3659 2997 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+3693 3459 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+3728 3645 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+3763 2900 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+3798 2957 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+3832 3808 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+3867 2964 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+3902 3818 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+3936 3784 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+3971 3337 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+4006 3449 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+4041 4017 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+4075 3665 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+4110 3849 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+4145 4224 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+4180 4274 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+4214 4269 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+4249 4787 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+4284 4523 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+4319 4887 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+4353 4331 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+4388 4877 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+4423 5194 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+4457 5212 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+4492 5215 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+4527 5101 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+4562 6168 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+4596 5909 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+4631 6369 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+4666 6238 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+4701 5971 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+4735 6653 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+4770 6109 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+4805 6687 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+4840 6299 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+4874 6593 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+4909 7139 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+4944 6869 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+4978 7805 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+5013 7386 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+5048 7405 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+5083 7102 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+5117 6600 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+5152 7019 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+5187 7053 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+5222 6198 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+5256 6696 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+5291 6200 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+5326 6510 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+5361 6625 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+5395 6463 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+5430 6702 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+5465 6460 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+5499 6002 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+5534 6139 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+5569 6339 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+5604 6595 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+5638 6718 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+5673 6090 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+5708 6010 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+5743 6237 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+5777 5921 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+5812 5503 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+5847 5678 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+5882 6040 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+5916 5976 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+5951 5115 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+5986 4902 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+6021 4643 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+6055 4515 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+6090 4726 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+6125 5199 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+6159 4270 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+6194 4277 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+6229 4476 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+6264 4506 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+6298 5092 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+6333 4441 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+6368 4398 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+6403 4027 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+6437 4727 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+6472 4070 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+6507 4729 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+6542 4265 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+6576 3833 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+6611 4219 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+6646 4037 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+6680 4422 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+6715 4563 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+6750 4431 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+6785 4104 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+6819 4431 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+6854 4110 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+6889 4187 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+6924 4629 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+6958 4513 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+6993 4378 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+7028 4726 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+7063 4505 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+7097 4728 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+7132 4939 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+7167 5710 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+7201 4737 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+7236 4819 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+7271 5620 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+7306 5621 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+7340 5346 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+7375 5295 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+7410 5340 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+7445 4740 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+7479 5249 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+7514 5600 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+7549 5660 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+7584 5695 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+7618 5830 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+7653 6059 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+7688 5700 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+7722 5933 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+7757 5946 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+7792 6036 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+7827 6476 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+7861 5687 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+7896 6412 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+7931 5820 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+7966 6338 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+8000 6261 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+8035 6254 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+8070 6383 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+8105 6095 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+8139 6208 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+8174 6436 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+8209 5986 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+8243 5886 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+8278 5670 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+8313 6320 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+8348 5897 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+8382 5673 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+8417 6298 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+8452 5372 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+8487 6177 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+8521 5793 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+8556 5846 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+8591 6342 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+8626 6048 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+8660 5497 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+8695 5352 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+8730 5026 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+8764 5160 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+8799 5316 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+8834 5032 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+8869 5605 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+8903 5114 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+8938 4973 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+8973 4843 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+9008 5186 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+9042 5601 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+9077 5206 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+9112 4806 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+9147 4965 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+9181 4774 10 Circ
+End
+
+Begin %I Circ
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+9216 4689 10 Circ
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 151
+2304 8656
+2350 8485
+2396 8302
+2442 8108
+2488 7904
+2534 7692
+2580 7472
+2627 7247
+2673 7016
+2719 6782
+2765 6546
+2811 6308
+2857 6071
+2903 5835
+2949 5601
+2995 5372
+3041 5148
+3087 4930
+3133 4719
+3180 4518
+3226 4326
+3272 4146
+3318 3979
+3364 3825
+3410 3686
+3456 3564
+3502 3459
+3548 3373
+3594 3307
+3640 3262
+3686 3240
+3732 3241
+3779 3264
+3825 3308
+3871 3372
+3917 3453
+3963 3551
+4009 3663
+4055 3789
+4101 3927
+4147 4075
+4193 4233
+4239 4398
+4285 4568
+4332 4744
+4378 4922
+4424 5102
+4470 5282
+4516 5461
+4562 5637
+4608 5809
+4654 5974
+4700 6133
+4746 6283
+4792 6422
+4838 6550
+4884 6665
+4931 6765
+4977 6848
+5023 6915
+5069 6962
+5115 6989
+5161 6996
+5207 6986
+5253 6958
+5299 6915
+5345 6857
+5391 6785
+5437 6702
+5484 6607
+5530 6503
+5576 6390
+5622 6270
+5668 6144
+5714 6012
+5760 5877
+5806 5739
+5852 5600
+5898 5461
+5944 5323
+5990 5187
+6036 5054
+6083 4926
+6129 4804
+6175 4689
+6221 4582
+6267 4485
+6313 4398
+6359 4323
+6405 4261
+6451 4214
+6497 4181
+6543 4163
+6589 4159
+6636 4167
+6682 4188
+6728 4219
+6774 4261
+6820 4313
+6866 4373
+6912 4441
+6958 4515
+7004 4596
+7050 4682
+7096 4772
+7142 4865
+7188 4961
+7235 5059
+7281 5158
+7327 5256
+7373 5354
+7419 5450
+7465 5544
+7511 5634
+7557 5720
+7603 5801
+7649 5876
+7695 5944
+7741 6004
+7788 6056
+7834 6098
+7880 6131
+7926 6153
+7972 6166
+8018 6171
+8064 6167
+8110 6156
+8156 6137
+8202 6111
+8248 6079
+8294 6041
+8340 5998
+8387 5949
+8433 5897
+8479 5840
+8525 5781
+8571 5718
+8617 5653
+8663 5586
+8709 5518
+8755 5448
+8801 5379
+8847 5309
+8893 5240
+8940 5172
+8986 5105
+9032 5040
+9078 4978
+9124 4919
+9170 4864
+9216 4812
+151 MLine
+End
+
+%%PageTrailer
+End %I eop
+showpage
+
+%%Trailer
+end
+%%EOF
diff --git a/gsl-1.9/doc/bspline.texi b/gsl-1.9/doc/bspline.texi
new file mode 100644
index 0000000..718e280
--- /dev/null
+++ b/gsl-1.9/doc/bspline.texi
@@ -0,0 +1,158 @@
+@cindex basis splines, B-splines
+@cindex splines, basis
+
+This chapter describes functions for the computation of smoothing
+basis splines (B-splines). The header file @file{gsl_bspline.h}
+contains prototypes for the bspline functions and related declarations.
+
+@menu
+* Overview of B-splines::
+* Initializing the B-splines solver::
+* Constructing the knots vector::
+* Evaluation of B-spline basis functions::
+* Example programs for B-splines::
+* References and Further Reading::
+@end menu
+
+@node Overview of B-splines
+@section Overview
+@cindex basis splines, overview
+
+B-splines are commonly used as basis functions to fit smoothing
+curves to large data sets. To do this, the abscissa axis is
+broken up into some number of intervals, where the endpoints
+of each interval are called @dfn{breakpoints}. These breakpoints
+are then converted to @dfn{knots} by imposing various continuity
+and smoothness conditions at each interface. Given a nondecreasing
+knot vector @math{t = \{t_0, t_1, \dots, t_{n+k-1}\}}, the
+@math{n} basis splines of order @math{k} are defined by
+@tex
+\beforedisplay
+$$
+B_{i,1}(x) = \left\{\matrix{1, & t_i \le x < t_{i+1}\cr
+ 0, & else}\right.
+$$
+$$
+B_{i,k}(x) = \left[(x - t_i)/(t_{i+k-1} - t_i)\right] B_{i,k-1}(x) +
+ \left[(t_{i+k} - x)/(t_{i+k} - t_{i+1})\right] B_{i+1,k-1}(x)
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+B_(i,1)(x) = (1, t_i <= x < t_(i+1)
+ (0, else
+B_(i,k)(x) = [(x - t_i)/(t_(i+k-1) - t_i)] B_(i,k-1)(x) + [(t_(i+k) - x)/(t_(i+k) - t_(i+1))] B_(i+1,k-1)(x)
+@end example
+
+@end ifinfo
+for @math{i = 0, \dots, n-1}. The common case of cubic B-splines
+is given by @math{k = 4}. The above recurrence relation can be
+evaluated in a numerically stable way by the de Boor algorithm.
+
+If we define appropriate knots on an interval @math{[a,b]} then
+the B-spline basis functions form a complete set on that interval.
+Therefore we can expand a smoothing function as
+@tex
+\beforedisplay
+$$
+f(x) = \sum_{i=0}^{n-1} c_i B_{i,k}(x)
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+f(x) = \sum_i c_i B_(i,k)(x)
+@end example
+
+@end ifinfo
+given enough @math{(x_j, f(x_j))} data pairs. The @math{c_i} can
+be readily obtained from a least-squares fit.
+
+@node Initializing the B-splines solver
+@section Initializing the B-splines solver
+@cindex basis splines, initializing
+
+@deftypefun {gsl_bspline_workspace *} gsl_bspline_alloc (const size_t @var{k}, const size_t @var{nbreak})
+This function allocates a workspace for computing B-splines of order
+@var{k}. The number of breakpoints is given by @var{nbreak}. This
+leads to @math{n = nbreak + k - 2} basis functions. Cubic B-splines
+are specified by @math{k = 4}. The size of the workspace is
+@math{O(5k + nbreak)}.
+@end deftypefun
+
+@deftypefun void gsl_bspline_free (gsl_bspline_workspace * @var{w})
+This function frees the memory associated with the workspace @var{w}.
+@end deftypefun
+
+@node Constructing the knots vector
+@section Constructing the knots vector
+@cindex knots
+
+@deftypefun int gsl_bspline_knots (const gsl_vector * @var{breakpts}, gsl_bspline_workspace * @var{w})
+This function computes the knots associated with the given breakpoints
+and stores them internally in @code{w->knots}.
+@end deftypefun
+
+@deftypefun int gsl_bspline_knots_uniform (const double a, const double b, gsl_bspline_workspace * @var{w})
+This function assumes uniformly spaced breakpoints on @math{[a,b]}
+and constructs the corresponding knot vector using the previously
+specified @var{nbreak} parameter. The knots are stored in
+@code{w->knots}.
+@end deftypefun
+
+@node Evaluation of B-spline basis functions
+@section Evaluation of B-splines
+@cindex basis splines, evaluation
+
+@deftypefun int gsl_bspline_eval (const double @var{x}, gsl_vector * @var{B}, gsl_bspline_workspace * @var{w})
+This function evaluates all B-spline basis functions at the position
+@var{x} and stores them in @var{B}, so that the @math{i}th element
+of @var{B} is @math{B_i(x)}. @var{B} must be of length
+@math{n = nbreak + k - 2}. This value is also stored in @code{w->n}.
+It is far more efficient to compute all of the basis functions at
+once than to compute them individually, due to the nature of the
+defining recurrence relation.
+@end deftypefun
+
+@node Example programs for B-splines
+@section Example programs for B-splines
+@cindex basis splines, examples
+
+The following program computes a linear least squares fit to data using
+cubic B-spline basis functions with uniform breakpoints. The data is
+generated from the curve @math{y(x) = \cos{(x)} \exp{(-0.1 x)}} on
+@math{[0, 15]} with gaussian noise added.
+
+@example
+@verbatiminclude examples/bspline.c
+@end example
+
+The output can be plotted with @sc{gnu} @code{graph}.
+
+@example
+$ ./a.out > bspline.dat
+$ graph -T ps -X x -Y y -x 0 15 -y -1 1.3 < bspline.dat > bspline.ps
+@end example
+
+@iftex
+@sp 1
+@center @image{bspline,3.4in}
+@end iftex
+
+@node References and Further Reading
+@section References and Further Reading
+
+Further information on the algorithms described in this section can be
+found in the following book,
+
+@itemize @asis
+C. de Boor, @cite{A Practical Guide to Splines} (1978), Springer-Verlag,
+ISBN 0-387-90356-9.
+@end itemize
+
+@noindent
+A large collection of B-spline routines is available in the
+@sc{pppack} library available at @uref{http://www.netlib.org/pppack}.
diff --git a/gsl-1.9/doc/calc.sty b/gsl-1.9/doc/calc.sty
new file mode 100644
index 0000000..086273e
--- /dev/null
+++ b/gsl-1.9/doc/calc.sty
@@ -0,0 +1,150 @@
+%%
+%% This is file `calc.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% calc.dtx (with options: `package')
+
+%% File `calc.dtx'.
+%% Copyright (C) 1992--1995 Kresten Krab Thorup and Frank Jensen.
+%% All rights reserved.
+
+\def\fileversion{v4.0c (TEST)}
+\def\filedate{1995/04/10}
+
+%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{calc}[\filedate\space\fileversion]
+\typeout{Package: `calc' \fileversion\space <\filedate> (KKT and FJ)}
+\def\calc@assign@generic#1#2#3#4{\let\calc@A#1\let\calc@B#2%
+ \expandafter\calc@open\expandafter(#4!%
+ \global\calc@A\calc@B\endgroup#3\calc@B}
+\def\calc@assign@count{\calc@assign@generic\calc@Acount\calc@Bcount}
+\def\calc@assign@dimen{\calc@assign@generic\calc@Adimen\calc@Bdimen}
+\def\calc@assign@skip{\calc@assign@generic\calc@Askip\calc@Bskip}
+\newcount\calc@Acount \newcount\calc@Bcount
+\newdimen\calc@Adimen \newdimen\calc@Bdimen
+\newskip\calc@Askip \newskip\calc@Bskip
+\def\setcounter#1#2{\@ifundefined{c@#1}{\@nocounterr{#1}}%
+ {\calc@assign@count{\global\csname c@#1\endcsname}{#2}}}
+\def\addtocounter#1#2{\@ifundefined{c@#1}{\@nocounterr{#1}}%
+ {\calc@assign@count{\global\advance\csname c@#1\endcsname}{#2}}}
+\DeclareRobustCommand\setlength{\calc@assign@skip}
+\DeclareRobustCommand\addtolength[1]{\calc@assign@skip{\advance#1}}
+\def\calc@pre@scan#1{%
+ \ifx(#1%
+ \let\calc@next\calc@open
+ \else
+ \let\calc@next\calc@numeric
+ \fi
+ \calc@next#1}
+\def\calc@open({\begingroup\aftergroup\calc@initB
+ \begingroup\aftergroup\calc@initB
+ \calc@pre@scan}
+\def\calc@initB{\calc@B\calc@A}
+\def\calc@numeric{\afterassignment\calc@post@scan \global\calc@A}
+\def\calc@post@scan#1{%
+ \ifx#1!\let\calc@next\endgroup \else
+ \ifx#1+\let\calc@next\calc@add \else
+ \ifx#1-\let\calc@next\calc@subtract \else
+ \ifx#1*\let\calc@next\calc@multiplyx \else
+ \ifx#1/\let\calc@next\calc@dividex \else
+ \ifx#1)\let\calc@next\calc@close \else \calc@error#1%
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \calc@next}
+\def\calc@add{\calc@generic@add\calc@addAtoB}
+\def\calc@subtract{\calc@generic@add\calc@subtractAfromB}
+\def\calc@generic@add#1{\endgroup\global\calc@A\calc@B\endgroup
+ \begingroup\aftergroup#1\begingroup\aftergroup\calc@initB
+ \calc@pre@scan}
+\def\calc@addAtoB{\advance\calc@B\calc@A}
+\def\calc@subtractAfromB{\advance\calc@B-\calc@A}
+\def\calc@multiplyx#1{\def\calc@tmp{#1}%
+ \ifx\calc@tmp\calc@ratio@x \let\calc@next\calc@ratio@multiply \else
+ \ifx\calc@tmp\calc@real@x \let\calc@next\calc@real@multiply \else
+ \let\calc@next\calc@multiply
+ \fi
+ \fi
+ \calc@next#1}
+\def\calc@dividex#1{\def\calc@tmp{#1}%
+ \ifx\calc@tmp\calc@ratio@x \let\calc@next\calc@ratio@divide \else
+ \ifx\calc@tmp\calc@real@x \let\calc@next\calc@real@divide \else
+ \let\calc@next\calc@divide
+ \fi
+ \fi
+ \calc@next#1}
+\def\calc@ratio@x{\ratio}
+\def\calc@real@x{\real}
+\def\calc@multiply{\calc@generic@multiply\calc@multiplyBbyA}
+\def\calc@divide{\calc@generic@multiply\calc@divideBbyA}
+\def\calc@generic@multiply#1{\endgroup\begingroup
+ \let\calc@A\calc@Acount \let\calc@B\calc@Bcount
+ \aftergroup#1\calc@pre@scan}
+\def\calc@multiplyBbyA{\multiply\calc@B\calc@Acount}
+\def\calc@divideBbyA{\divide\calc@B\calc@Acount}
+\def\calc@close
+ {\endgroup\global\calc@A\calc@B
+ \endgroup\global\calc@A\calc@B
+ \calc@post@scan}
+\def\calc@ratio@multiply\ratio{\calc@ratio@evaluate}
+\def\calc@ratio@divide\ratio#1#2{\calc@ratio@evaluate{#2}{#1}}
+\let\calc@numerator=\calc@Bcount
+\newcount\calc@denominator
+\def\calc@ratio@evaluate#1#2{%
+ \endgroup\begingroup
+ \calc@assign@dimen\calc@numerator{#1}%
+ \calc@assign@dimen\calc@denominator{#2}%
+ \gdef\calc@the@ratio{}%
+ \ifnum\calc@numerator<0 \calc@numerator-\calc@numerator
+ \gdef\calc@the@ratio{-}%
+ \fi
+ \ifnum\calc@denominator<0 \calc@denominator-\calc@denominator
+ \xdef\calc@the@ratio{\calc@the@ratio-}%
+ \fi
+ \calc@Acount\calc@numerator
+ \divide\calc@Acount\calc@denominator
+ \xdef\calc@the@ratio{\calc@the@ratio\number\calc@Acount.}%
+ \calc@next@digit \calc@next@digit \calc@next@digit
+ \calc@next@digit \calc@next@digit \calc@next@digit
+ \endgroup
+ \calc@multiply@by@real\calc@the@ratio
+ \begingroup
+ \calc@post@scan}
+\def\calc@next@digit{%
+ \multiply\calc@Acount\calc@denominator
+ \advance\calc@numerator -\calc@Acount
+ \multiply\calc@numerator 10
+ \calc@Acount\calc@numerator
+ \divide\calc@Acount\calc@denominator
+ \xdef\calc@the@ratio{\calc@the@ratio\number\calc@Acount}}
+\def\calc@multiply@by@real#1{\calc@Bdimen #1\calc@B \calc@B\calc@Bdimen}
+\def\calc@real@multiply\real#1{\endgroup
+ \calc@multiply@by@real{#1}\begingroup
+ \calc@post@scan}
+\def\calc@real@divide\real#1{\calc@ratio@evaluate{1pt}{#1pt}}
+\def\calc@error#1{%
+ \errhelp{Calc error: I expected to see one of: + - * / )}%
+ \errmessage{Invalid character `#1' in arithmetic expression}}
+\endinput
+%%
+%% End of file `calc.sty'.
diff --git a/gsl-1.9/doc/cblas.texi b/gsl-1.9/doc/cblas.texi
new file mode 100644
index 0000000..75bf7a7
--- /dev/null
+++ b/gsl-1.9/doc/cblas.texi
@@ -0,0 +1,514 @@
+@cindex Low-level CBLAS
+@cindex CBLAS, Low-level interface
+@cindex BLAS, Low-level C interface
+@cindex Basic Linear Algebra Subroutines (BLAS)
+The prototypes for the low-level @sc{cblas} functions are declared in
+the file @code{gsl_cblas.h}. For the definition of the functions
+consult the documentation available from Netlib (@pxref{BLAS References
+and Further Reading}).
+
+@menu
+* Level 1 CBLAS Functions::
+* Level 2 CBLAS Functions::
+* Level 3 CBLAS Functions::
+* GSL CBLAS Examples::
+@end menu
+
+@node Level 1 CBLAS Functions
+@section Level 1
+
+@deftypefun float cblas_sdsdot (const int @var{N}, const float @var{alpha}, const float * @var{x}, const int @var{incx}, const float * @var{y}, const int @var{incy})
+@end deftypefun
+
+@deftypefun double cblas_dsdot (const int @var{N}, const float * @var{x}, const int @var{incx}, const float * @var{y}, const int @var{incy})
+@end deftypefun
+
+@deftypefun float cblas_sdot (const int @var{N}, const float * @var{x}, const int @var{incx}, const float * @var{y}, const int @var{incy})
+@end deftypefun
+
+@deftypefun double cblas_ddot (const int @var{N}, const double * @var{x}, const int @var{incx}, const double * @var{y}, const int @var{incy})
+@end deftypefun
+
+@deftypefun void cblas_cdotu_sub (const int @var{N}, const void * @var{x}, const int @var{incx}, const void * @var{y}, const int @var{incy}, void * @var{dotu})
+@end deftypefun
+
+@deftypefun void cblas_cdotc_sub (const int @var{N}, const void * @var{x}, const int @var{incx}, const void * @var{y}, const int @var{incy}, void * @var{dotc})
+@end deftypefun
+
+@deftypefun void cblas_zdotu_sub (const int @var{N}, const void * @var{x}, const int @var{incx}, const void * @var{y}, const int @var{incy}, void * @var{dotu})
+@end deftypefun
+
+@deftypefun void cblas_zdotc_sub (const int @var{N}, const void * @var{x}, const int @var{incx}, const void * @var{y}, const int @var{incy}, void * @var{dotc})
+@end deftypefun
+
+@deftypefun float cblas_snrm2 (const int @var{N}, const float * @var{x}, const int @var{incx})
+@end deftypefun
+
+@deftypefun float cblas_sasum (const int @var{N}, const float * @var{x}, const int @var{incx})
+@end deftypefun
+
+@deftypefun double cblas_dnrm2 (const int @var{N}, const double * @var{x}, const int @var{incx})
+@end deftypefun
+
+@deftypefun double cblas_dasum (const int @var{N}, const double * @var{x}, const int @var{incx})
+@end deftypefun
+
+@deftypefun float cblas_scnrm2 (const int @var{N}, const void * @var{x}, const int @var{incx})
+@end deftypefun
+
+@deftypefun float cblas_scasum (const int @var{N}, const void * @var{x}, const int @var{incx})
+@end deftypefun
+
+@deftypefun double cblas_dznrm2 (const int @var{N}, const void * @var{x}, const int @var{incx})
+@end deftypefun
+
+@deftypefun double cblas_dzasum (const int @var{N}, const void * @var{x}, const int @var{incx})
+@end deftypefun
+
+@deftypefun CBLAS_INDEX cblas_isamax (const int @var{N}, const float * @var{x}, const int @var{incx})
+@end deftypefun
+
+@deftypefun CBLAS_INDEX cblas_idamax (const int @var{N}, const double * @var{x}, const int @var{incx})
+@end deftypefun
+
+@deftypefun CBLAS_INDEX cblas_icamax (const int @var{N}, const void * @var{x}, const int @var{incx})
+@end deftypefun
+
+@deftypefun CBLAS_INDEX cblas_izamax (const int @var{N}, const void * @var{x}, const int @var{incx})
+@end deftypefun
+
+@deftypefun void cblas_sswap (const int @var{N}, float * @var{x}, const int @var{incx}, float * @var{y}, const int @var{incy})
+@end deftypefun
+
+@deftypefun void cblas_scopy (const int @var{N}, const float * @var{x}, const int @var{incx}, float * @var{y}, const int @var{incy})
+@end deftypefun
+
+@deftypefun void cblas_saxpy (const int @var{N}, const float @var{alpha}, const float * @var{x}, const int @var{incx}, float * @var{y}, const int @var{incy})
+@end deftypefun
+
+@deftypefun void cblas_dswap (const int @var{N}, double * @var{x}, const int @var{incx}, double * @var{y}, const int @var{incy})
+@end deftypefun
+
+@deftypefun void cblas_dcopy (const int @var{N}, const double * @var{x}, const int @var{incx}, double * @var{y}, const int @var{incy})
+@end deftypefun
+
+@deftypefun void cblas_daxpy (const int @var{N}, const double @var{alpha}, const double * @var{x}, const int @var{incx}, double * @var{y}, const int @var{incy})
+@end deftypefun
+
+@deftypefun void cblas_cswap (const int @var{N}, void * @var{x}, const int @var{incx}, void * @var{y}, const int @var{incy})
+@end deftypefun
+
+@deftypefun void cblas_ccopy (const int @var{N}, const void * @var{x}, const int @var{incx}, void * @var{y}, const int @var{incy})
+@end deftypefun
+
+@deftypefun void cblas_caxpy (const int @var{N}, const void * @var{alpha}, const void * @var{x}, const int @var{incx}, void * @var{y}, const int @var{incy})
+@end deftypefun
+
+@deftypefun void cblas_zswap (const int @var{N}, void * @var{x}, const int @var{incx}, void * @var{y}, const int @var{incy})
+@end deftypefun
+
+@deftypefun void cblas_zcopy (const int @var{N}, const void * @var{x}, const int @var{incx}, void * @var{y}, const int @var{incy})
+@end deftypefun
+
+@deftypefun void cblas_zaxpy (const int @var{N}, const void * @var{alpha}, const void * @var{x}, const int @var{incx}, void * @var{y}, const int @var{incy})
+@end deftypefun
+
+@deftypefun void cblas_srotg (float * @var{a}, float * @var{b}, float * @var{c}, float * @var{s})
+@end deftypefun
+
+@deftypefun void cblas_srotmg (float * @var{d1}, float * @var{d2}, float * @var{b1}, const float @var{b2}, float * @var{P})
+@end deftypefun
+
+@deftypefun void cblas_srot (const int @var{N}, float * @var{x}, const int @var{incx}, float * @var{y}, const int @var{incy}, const float @var{c}, const float @var{s})
+@end deftypefun
+
+@deftypefun void cblas_srotm (const int @var{N}, float * @var{x}, const int @var{incx}, float * @var{y}, const int @var{incy}, const float * @var{P})
+@end deftypefun
+
+@deftypefun void cblas_drotg (double * @var{a}, double * @var{b}, double * @var{c}, double * @var{s})
+@end deftypefun
+
+@deftypefun void cblas_drotmg (double * @var{d1}, double * @var{d2}, double * @var{b1}, const double @var{b2}, double * @var{P})
+@end deftypefun
+
+@deftypefun void cblas_drot (const int @var{N}, double * @var{x}, const int @var{incx}, double * @var{y}, const int @var{incy}, const double @var{c}, const double @var{s})
+@end deftypefun
+
+@deftypefun void cblas_drotm (const int @var{N}, double * @var{x}, const int @var{incx}, double * @var{y}, const int @var{incy}, const double * @var{P})
+@end deftypefun
+
+@deftypefun void cblas_sscal (const int @var{N}, const float @var{alpha}, float * @var{x}, const int @var{incx})
+@end deftypefun
+
+@deftypefun void cblas_dscal (const int @var{N}, const double @var{alpha}, double * @var{x}, const int @var{incx})
+@end deftypefun
+
+@deftypefun void cblas_cscal (const int @var{N}, const void * @var{alpha}, void * @var{x}, const int @var{incx})
+@end deftypefun
+
+@deftypefun void cblas_zscal (const int @var{N}, const void * @var{alpha}, void * @var{x}, const int @var{incx})
+@end deftypefun
+
+@deftypefun void cblas_csscal (const int @var{N}, const float @var{alpha}, void * @var{x}, const int @var{incx})
+@end deftypefun
+
+@deftypefun void cblas_zdscal (const int @var{N}, const double @var{alpha}, void * @var{x}, const int @var{incx})
+@end deftypefun
+
+@node Level 2 CBLAS Functions
+@section Level 2
+
+@deftypefun void cblas_sgemv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_TRANSPOSE @var{TransA}, const int @var{M}, const int @var{N}, const float @var{alpha}, const float * @var{A}, const int @var{lda}, const float * @var{x}, const int @var{incx}, const float @var{beta}, float * @var{y}, const int @var{incy})
+@end deftypefun
+
+@deftypefun void cblas_sgbmv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_TRANSPOSE @var{TransA}, const int @var{M}, const int @var{N}, const int @var{KL}, const int @var{KU}, const float @var{alpha}, const float * @var{A}, const int @var{lda}, const float * @var{x}, const int @var{incx}, const float @var{beta}, float * @var{y}, const int @var{incy})
+@end deftypefun
+
+@deftypefun void cblas_strmv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{TransA}, const enum CBLAS_DIAG @var{Diag}, const int @var{N}, const float * @var{A}, const int @var{lda}, float * @var{x}, const int @var{incx})
+@end deftypefun
+
+@deftypefun void cblas_stbmv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{TransA}, const enum CBLAS_DIAG @var{Diag}, const int @var{N}, const int @var{K}, const float * @var{A}, const int @var{lda}, float * @var{x}, const int @var{incx})
+@end deftypefun
+
+@deftypefun void cblas_stpmv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{TransA}, const enum CBLAS_DIAG @var{Diag}, const int @var{N}, const float * @var{Ap}, float * @var{x}, const int @var{incx})
+@end deftypefun
+
+@deftypefun void cblas_strsv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{TransA}, const enum CBLAS_DIAG @var{Diag}, const int @var{N}, const float * @var{A}, const int @var{lda}, float * @var{x}, const int @var{incx})
+@end deftypefun
+
+@deftypefun void cblas_stbsv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{TransA}, const enum CBLAS_DIAG @var{Diag}, const int @var{N}, const int @var{K}, const float * @var{A}, const int @var{lda}, float * @var{x}, const int @var{incx})
+@end deftypefun
+
+@deftypefun void cblas_stpsv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{TransA}, const enum CBLAS_DIAG @var{Diag}, const int @var{N}, const float * @var{Ap}, float * @var{x}, const int @var{incx})
+@end deftypefun
+
+@deftypefun void cblas_dgemv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_TRANSPOSE @var{TransA}, const int @var{M}, const int @var{N}, const double @var{alpha}, const double * @var{A}, const int @var{lda}, const double * @var{x}, const int @var{incx}, const double @var{beta}, double * @var{y}, const int @var{incy})
+@end deftypefun
+
+@deftypefun void cblas_dgbmv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_TRANSPOSE @var{TransA}, const int @var{M}, const int @var{N}, const int @var{KL}, const int @var{KU}, const double @var{alpha}, const double * @var{A}, const int @var{lda}, const double * @var{x}, const int @var{incx}, const double @var{beta}, double * @var{y}, const int @var{incy})
+@end deftypefun
+
+@deftypefun void cblas_dtrmv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{TransA}, const enum CBLAS_DIAG @var{Diag}, const int @var{N}, const double * @var{A}, const int @var{lda}, double * @var{x}, const int @var{incx})
+@end deftypefun
+
+@deftypefun void cblas_dtbmv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{TransA}, const enum CBLAS_DIAG @var{Diag}, const int @var{N}, const int @var{K}, const double * @var{A}, const int @var{lda}, double * @var{x}, const int @var{incx})
+@end deftypefun
+
+@deftypefun void cblas_dtpmv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{TransA}, const enum CBLAS_DIAG @var{Diag}, const int @var{N}, const double * @var{Ap}, double * @var{x}, const int @var{incx})
+@end deftypefun
+
+@deftypefun void cblas_dtrsv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{TransA}, const enum CBLAS_DIAG @var{Diag}, const int @var{N}, const double * @var{A}, const int @var{lda}, double * @var{x}, const int @var{incx})
+@end deftypefun
+
+@deftypefun void cblas_dtbsv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{TransA}, const enum CBLAS_DIAG @var{Diag}, const int @var{N}, const int @var{K}, const double * @var{A}, const int @var{lda}, double * @var{x}, const int @var{incx})
+@end deftypefun
+
+@deftypefun void cblas_dtpsv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{TransA}, const enum CBLAS_DIAG @var{Diag}, const int @var{N}, const double * @var{Ap}, double * @var{x}, const int @var{incx})
+@end deftypefun
+
+@deftypefun void cblas_cgemv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_TRANSPOSE @var{TransA}, const int @var{M}, const int @var{N}, const void * @var{alpha}, const void * @var{A}, const int @var{lda}, const void * @var{x}, const int @var{incx}, const void * @var{beta}, void * @var{y}, const int @var{incy})
+@end deftypefun
+
+@deftypefun void cblas_cgbmv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_TRANSPOSE @var{TransA}, const int @var{M}, const int @var{N}, const int @var{KL}, const int @var{KU}, const void * @var{alpha}, const void * @var{A}, const int @var{lda}, const void * @var{x}, const int @var{incx}, const void * @var{beta}, void * @var{y}, const int @var{incy})
+@end deftypefun
+
+@deftypefun void cblas_ctrmv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{TransA}, const enum CBLAS_DIAG @var{Diag}, const int @var{N}, const void * @var{A}, const int @var{lda}, void * @var{x}, const int @var{incx})
+@end deftypefun
+
+@deftypefun void cblas_ctbmv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{TransA}, const enum CBLAS_DIAG @var{Diag}, const int @var{N}, const int @var{K}, const void * @var{A}, const int @var{lda}, void * @var{x}, const int @var{incx})
+@end deftypefun
+
+@deftypefun void cblas_ctpmv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{TransA}, const enum CBLAS_DIAG @var{Diag}, const int @var{N}, const void * @var{Ap}, void * @var{x}, const int @var{incx})
+@end deftypefun
+
+@deftypefun void cblas_ctrsv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{TransA}, const enum CBLAS_DIAG @var{Diag}, const int @var{N}, const void * @var{A}, const int @var{lda}, void * @var{x}, const int @var{incx})
+@end deftypefun
+
+@deftypefun void cblas_ctbsv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{TransA}, const enum CBLAS_DIAG @var{Diag}, const int @var{N}, const int @var{K}, const void * @var{A}, const int @var{lda}, void * @var{x}, const int @var{incx})
+@end deftypefun
+
+@deftypefun void cblas_ctpsv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{TransA}, const enum CBLAS_DIAG @var{Diag}, const int @var{N}, const void * @var{Ap}, void * @var{x}, const int @var{incx})
+@end deftypefun
+
+@deftypefun void cblas_zgemv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_TRANSPOSE @var{TransA}, const int @var{M}, const int @var{N}, const void * @var{alpha}, const void * @var{A}, const int @var{lda}, const void * @var{x}, const int @var{incx}, const void * @var{beta}, void * @var{y}, const int @var{incy})
+@end deftypefun
+
+@deftypefun void cblas_zgbmv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_TRANSPOSE @var{TransA}, const int @var{M}, const int @var{N}, const int @var{KL}, const int @var{KU}, const void * @var{alpha}, const void * @var{A}, const int @var{lda}, const void * @var{x}, const int @var{incx}, const void * @var{beta}, void * @var{y}, const int @var{incy})
+@end deftypefun
+
+@deftypefun void cblas_ztrmv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{TransA}, const enum CBLAS_DIAG @var{Diag}, const int @var{N}, const void * @var{A}, const int @var{lda}, void * @var{x}, const int @var{incx})
+@end deftypefun
+
+@deftypefun void cblas_ztbmv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{TransA}, const enum CBLAS_DIAG @var{Diag}, const int @var{N}, const int @var{K}, const void * @var{A}, const int @var{lda}, void * @var{x}, const int @var{incx})
+@end deftypefun
+
+@deftypefun void cblas_ztpmv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{TransA}, const enum CBLAS_DIAG @var{Diag}, const int @var{N}, const void * @var{Ap}, void * @var{x}, const int @var{incx})
+@end deftypefun
+
+@deftypefun void cblas_ztrsv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{TransA}, const enum CBLAS_DIAG @var{Diag}, const int @var{N}, const void * @var{A}, const int @var{lda}, void * @var{x}, const int @var{incx})
+@end deftypefun
+
+@deftypefun void cblas_ztbsv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{TransA}, const enum CBLAS_DIAG @var{Diag}, const int @var{N}, const int @var{K}, const void * @var{A}, const int @var{lda}, void * @var{x}, const int @var{incx})
+@end deftypefun
+
+@deftypefun void cblas_ztpsv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{TransA}, const enum CBLAS_DIAG @var{Diag}, const int @var{N}, const void * @var{Ap}, void * @var{x}, const int @var{incx})
+@end deftypefun
+
+@deftypefun void cblas_ssymv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const int @var{N}, const float @var{alpha}, const float * @var{A}, const int @var{lda}, const float * @var{x}, const int @var{incx}, const float @var{beta}, float * @var{y}, const int @var{incy})
+@end deftypefun
+
+@deftypefun void cblas_ssbmv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const int @var{N}, const int @var{K}, const float @var{alpha}, const float * @var{A}, const int @var{lda}, const float * @var{x}, const int @var{incx}, const float @var{beta}, float * @var{y}, const int @var{incy})
+@end deftypefun
+
+@deftypefun void cblas_sspmv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const int @var{N}, const float @var{alpha}, const float * @var{Ap}, const float * @var{x}, const int @var{incx}, const float @var{beta}, float * @var{y}, const int @var{incy})
+@end deftypefun
+
+@deftypefun void cblas_sger (const enum CBLAS_ORDER @var{order}, const int @var{M}, const int @var{N}, const float @var{alpha}, const float * @var{x}, const int @var{incx}, const float * @var{y}, const int @var{incy}, float * @var{A}, const int @var{lda})
+@end deftypefun
+
+@deftypefun void cblas_ssyr (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const int @var{N}, const float @var{alpha}, const float * @var{x}, const int @var{incx}, float * @var{A}, const int @var{lda})
+@end deftypefun
+
+@deftypefun void cblas_sspr (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const int @var{N}, const float @var{alpha}, const float * @var{x}, const int @var{incx}, float * @var{Ap})
+@end deftypefun
+
+@deftypefun void cblas_ssyr2 (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const int @var{N}, const float @var{alpha}, const float * @var{x}, const int @var{incx}, const float * @var{y}, const int @var{incy}, float * @var{A}, const int @var{lda})
+@end deftypefun
+
+@deftypefun void cblas_sspr2 (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const int @var{N}, const float @var{alpha}, const float * @var{x}, const int @var{incx}, const float * @var{y}, const int @var{incy}, float * @var{A})
+@end deftypefun
+
+@deftypefun void cblas_dsymv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const int @var{N}, const double @var{alpha}, const double * @var{A}, const int @var{lda}, const double * @var{x}, const int @var{incx}, const double @var{beta}, double * @var{y}, const int @var{incy})
+@end deftypefun
+
+@deftypefun void cblas_dsbmv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const int @var{N}, const int @var{K}, const double @var{alpha}, const double * @var{A}, const int @var{lda}, const double * @var{x}, const int @var{incx}, const double @var{beta}, double * @var{y}, const int @var{incy})
+@end deftypefun
+
+@deftypefun void cblas_dspmv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const int @var{N}, const double @var{alpha}, const double * @var{Ap}, const double * @var{x}, const int @var{incx}, const double @var{beta}, double * @var{y}, const int @var{incy})
+@end deftypefun
+
+@deftypefun void cblas_dger (const enum CBLAS_ORDER @var{order}, const int @var{M}, const int @var{N}, const double @var{alpha}, const double * @var{x}, const int @var{incx}, const double * @var{y}, const int @var{incy}, double * @var{A}, const int @var{lda})
+@end deftypefun
+
+@deftypefun void cblas_dsyr (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const int @var{N}, const double @var{alpha}, const double * @var{x}, const int @var{incx}, double * @var{A}, const int @var{lda})
+@end deftypefun
+
+@deftypefun void cblas_dspr (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const int @var{N}, const double @var{alpha}, const double * @var{x}, const int @var{incx}, double * @var{Ap})
+@end deftypefun
+
+@deftypefun void cblas_dsyr2 (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const int @var{N}, const double @var{alpha}, const double * @var{x}, const int @var{incx}, const double * @var{y}, const int @var{incy}, double * @var{A}, const int @var{lda})
+@end deftypefun
+
+@deftypefun void cblas_dspr2 (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const int @var{N}, const double @var{alpha}, const double * @var{x}, const int @var{incx}, const double * @var{y}, const int @var{incy}, double * @var{A})
+@end deftypefun
+
+@deftypefun void cblas_chemv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const int @var{N}, const void * @var{alpha}, const void * @var{A}, const int @var{lda}, const void * @var{x}, const int @var{incx}, const void * @var{beta}, void * @var{y}, const int @var{incy})
+@end deftypefun
+
+@deftypefun void cblas_chbmv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const int @var{N}, const int @var{K}, const void * @var{alpha}, const void * @var{A}, const int @var{lda}, const void * @var{x}, const int @var{incx}, const void * @var{beta}, void * @var{y}, const int @var{incy})
+@end deftypefun
+
+@deftypefun void cblas_chpmv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const int @var{N}, const void * @var{alpha}, const void * @var{Ap}, const void * @var{x}, const int @var{incx}, const void * @var{beta}, void * @var{y}, const int @var{incy})
+@end deftypefun
+
+@deftypefun void cblas_cgeru (const enum CBLAS_ORDER @var{order}, const int @var{M}, const int @var{N}, const void * @var{alpha}, const void * @var{x}, const int @var{incx}, const void * @var{y}, const int @var{incy}, void * @var{A}, const int @var{lda})
+@end deftypefun
+
+@deftypefun void cblas_cgerc (const enum CBLAS_ORDER @var{order}, const int @var{M}, const int @var{N}, const void * @var{alpha}, const void * @var{x}, const int @var{incx}, const void * @var{y}, const int @var{incy}, void * @var{A}, const int @var{lda})
+@end deftypefun
+
+@deftypefun void cblas_cher (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const int @var{N}, const float @var{alpha}, const void * @var{x}, const int @var{incx}, void * @var{A}, const int @var{lda})
+@end deftypefun
+
+@deftypefun void cblas_chpr (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const int @var{N}, const float @var{alpha}, const void * @var{x}, const int @var{incx}, void * @var{A})
+@end deftypefun
+
+@deftypefun void cblas_cher2 (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const int @var{N}, const void * @var{alpha}, const void * @var{x}, const int @var{incx}, const void * @var{y}, const int @var{incy}, void * @var{A}, const int @var{lda})
+@end deftypefun
+
+@deftypefun void cblas_chpr2 (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const int @var{N}, const void * @var{alpha}, const void * @var{x}, const int @var{incx}, const void * @var{y}, const int @var{incy}, void * @var{Ap})
+@end deftypefun
+
+@deftypefun void cblas_zhemv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const int @var{N}, const void * @var{alpha}, const void * @var{A}, const int @var{lda}, const void * @var{x}, const int @var{incx}, const void * @var{beta}, void * @var{y}, const int @var{incy})
+@end deftypefun
+
+@deftypefun void cblas_zhbmv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const int @var{N}, const int @var{K}, const void * @var{alpha}, const void * @var{A}, const int @var{lda}, const void * @var{x}, const int @var{incx}, const void * @var{beta}, void * @var{y}, const int @var{incy})
+@end deftypefun
+
+@deftypefun void cblas_zhpmv (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const int @var{N}, const void * @var{alpha}, const void * @var{Ap}, const void * @var{x}, const int @var{incx}, const void * @var{beta}, void * @var{y}, const int @var{incy})
+@end deftypefun
+
+@deftypefun void cblas_zgeru (const enum CBLAS_ORDER @var{order}, const int @var{M}, const int @var{N}, const void * @var{alpha}, const void * @var{x}, const int @var{incx}, const void * @var{y}, const int @var{incy}, void * @var{A}, const int @var{lda})
+@end deftypefun
+
+@deftypefun void cblas_zgerc (const enum CBLAS_ORDER @var{order}, const int @var{M}, const int @var{N}, const void * @var{alpha}, const void * @var{x}, const int @var{incx}, const void * @var{y}, const int @var{incy}, void * @var{A}, const int @var{lda})
+@end deftypefun
+
+@deftypefun void cblas_zher (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const int @var{N}, const double @var{alpha}, const void * @var{x}, const int @var{incx}, void * @var{A}, const int @var{lda})
+@end deftypefun
+
+@deftypefun void cblas_zhpr (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const int @var{N}, const double @var{alpha}, const void * @var{x}, const int @var{incx}, void * @var{A})
+@end deftypefun
+
+@deftypefun void cblas_zher2 (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const int @var{N}, const void * @var{alpha}, const void * @var{x}, const int @var{incx}, const void * @var{y}, const int @var{incy}, void * @var{A}, const int @var{lda})
+@end deftypefun
+
+@deftypefun void cblas_zhpr2 (const enum CBLAS_ORDER @var{order}, const enum CBLAS_UPLO @var{Uplo}, const int @var{N}, const void * @var{alpha}, const void * @var{x}, const int @var{incx}, const void * @var{y}, const int @var{incy}, void * @var{Ap})
+@end deftypefun
+
+@node Level 3 CBLAS Functions
+@section Level 3
+
+
+@deftypefun void cblas_sgemm (const enum CBLAS_ORDER @var{Order}, const enum CBLAS_TRANSPOSE @var{TransA}, const enum CBLAS_TRANSPOSE @var{TransB}, const int @var{M}, const int @var{N}, const int @var{K}, const float @var{alpha}, const float * @var{A}, const int @var{lda}, const float * @var{B}, const int @var{ldb}, const float @var{beta}, float * @var{C}, const int @var{ldc})
+@end deftypefun
+
+@deftypefun void cblas_ssymm (const enum CBLAS_ORDER @var{Order}, const enum CBLAS_SIDE @var{Side}, const enum CBLAS_UPLO @var{Uplo}, const int @var{M}, const int @var{N}, const float @var{alpha}, const float * @var{A}, const int @var{lda}, const float * @var{B}, const int @var{ldb}, const float @var{beta}, float * @var{C}, const int @var{ldc})
+@end deftypefun
+
+@deftypefun void cblas_ssyrk (const enum CBLAS_ORDER @var{Order}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{Trans}, const int @var{N}, const int @var{K}, const float @var{alpha}, const float * @var{A}, const int @var{lda}, const float @var{beta}, float * @var{C}, const int @var{ldc})
+@end deftypefun
+
+@deftypefun void cblas_ssyr2k (const enum CBLAS_ORDER @var{Order}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{Trans}, const int @var{N}, const int @var{K}, const float @var{alpha}, const float * @var{A}, const int @var{lda}, const float * @var{B}, const int @var{ldb}, const float @var{beta}, float * @var{C}, const int @var{ldc})
+@end deftypefun
+
+@deftypefun void cblas_strmm (const enum CBLAS_ORDER @var{Order}, const enum CBLAS_SIDE @var{Side}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{TransA}, const enum CBLAS_DIAG @var{Diag}, const int @var{M}, const int @var{N}, const float @var{alpha}, const float * @var{A}, const int @var{lda}, float * @var{B}, const int @var{ldb})
+@end deftypefun
+
+@deftypefun void cblas_strsm (const enum CBLAS_ORDER @var{Order}, const enum CBLAS_SIDE @var{Side}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{TransA}, const enum CBLAS_DIAG @var{Diag}, const int @var{M}, const int @var{N}, const float @var{alpha}, const float * @var{A}, const int @var{lda}, float * @var{B}, const int @var{ldb})
+@end deftypefun
+
+@deftypefun void cblas_dgemm (const enum CBLAS_ORDER @var{Order}, const enum CBLAS_TRANSPOSE @var{TransA}, const enum CBLAS_TRANSPOSE @var{TransB}, const int @var{M}, const int @var{N}, const int @var{K}, const double @var{alpha}, const double * @var{A}, const int @var{lda}, const double * @var{B}, const int @var{ldb}, const double @var{beta}, double * @var{C}, const int @var{ldc})
+@end deftypefun
+
+@deftypefun void cblas_dsymm (const enum CBLAS_ORDER @var{Order}, const enum CBLAS_SIDE @var{Side}, const enum CBLAS_UPLO @var{Uplo}, const int @var{M}, const int @var{N}, const double @var{alpha}, const double * @var{A}, const int @var{lda}, const double * @var{B}, const int @var{ldb}, const double @var{beta}, double * @var{C}, const int @var{ldc})
+@end deftypefun
+
+@deftypefun void cblas_dsyrk (const enum CBLAS_ORDER @var{Order}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{Trans}, const int @var{N}, const int @var{K}, const double @var{alpha}, const double * @var{A}, const int @var{lda}, const double @var{beta}, double * @var{C}, const int @var{ldc})
+@end deftypefun
+
+@deftypefun void cblas_dsyr2k (const enum CBLAS_ORDER @var{Order}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{Trans}, const int @var{N}, const int @var{K}, const double @var{alpha}, const double * @var{A}, const int @var{lda}, const double * @var{B}, const int @var{ldb}, const double @var{beta}, double * @var{C}, const int @var{ldc})
+@end deftypefun
+
+@deftypefun void cblas_dtrmm (const enum CBLAS_ORDER @var{Order}, const enum CBLAS_SIDE @var{Side}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{TransA}, const enum CBLAS_DIAG @var{Diag}, const int @var{M}, const int @var{N}, const double @var{alpha}, const double * @var{A}, const int @var{lda}, double * @var{B}, const int @var{ldb})
+@end deftypefun
+
+@deftypefun void cblas_dtrsm (const enum CBLAS_ORDER @var{Order}, const enum CBLAS_SIDE @var{Side}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{TransA}, const enum CBLAS_DIAG @var{Diag}, const int @var{M}, const int @var{N}, const double @var{alpha}, const double * @var{A}, const int @var{lda}, double * @var{B}, const int @var{ldb})
+@end deftypefun
+
+@deftypefun void cblas_cgemm (const enum CBLAS_ORDER @var{Order}, const enum CBLAS_TRANSPOSE @var{TransA}, const enum CBLAS_TRANSPOSE @var{TransB}, const int @var{M}, const int @var{N}, const int @var{K}, const void * @var{alpha}, const void * @var{A}, const int @var{lda}, const void * @var{B}, const int @var{ldb}, const void * @var{beta}, void * @var{C}, const int @var{ldc})
+@end deftypefun
+
+@deftypefun void cblas_csymm (const enum CBLAS_ORDER @var{Order}, const enum CBLAS_SIDE @var{Side}, const enum CBLAS_UPLO @var{Uplo}, const int @var{M}, const int @var{N}, const void * @var{alpha}, const void * @var{A}, const int @var{lda}, const void * @var{B}, const int @var{ldb}, const void * @var{beta}, void * @var{C}, const int @var{ldc})
+@end deftypefun
+
+@deftypefun void cblas_csyrk (const enum CBLAS_ORDER @var{Order}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{Trans}, const int @var{N}, const int @var{K}, const void * @var{alpha}, const void * @var{A}, const int @var{lda}, const void * @var{beta}, void * @var{C}, const int @var{ldc})
+@end deftypefun
+
+@deftypefun void cblas_csyr2k (const enum CBLAS_ORDER @var{Order}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{Trans}, const int @var{N}, const int @var{K}, const void * @var{alpha}, const void * @var{A}, const int @var{lda}, const void * @var{B}, const int @var{ldb}, const void * @var{beta}, void * @var{C}, const int @var{ldc})
+@end deftypefun
+
+@deftypefun void cblas_ctrmm (const enum CBLAS_ORDER @var{Order}, const enum CBLAS_SIDE @var{Side}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{TransA}, const enum CBLAS_DIAG @var{Diag}, const int @var{M}, const int @var{N}, const void * @var{alpha}, const void * @var{A}, const int @var{lda}, void * @var{B}, const int @var{ldb})
+@end deftypefun
+
+@deftypefun void cblas_ctrsm (const enum CBLAS_ORDER @var{Order}, const enum CBLAS_SIDE @var{Side}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{TransA}, const enum CBLAS_DIAG @var{Diag}, const int @var{M}, const int @var{N}, const void * @var{alpha}, const void * @var{A}, const int @var{lda}, void * @var{B}, const int @var{ldb})
+@end deftypefun
+
+@deftypefun void cblas_zgemm (const enum CBLAS_ORDER @var{Order}, const enum CBLAS_TRANSPOSE @var{TransA}, const enum CBLAS_TRANSPOSE @var{TransB}, const int @var{M}, const int @var{N}, const int @var{K}, const void * @var{alpha}, const void * @var{A}, const int @var{lda}, const void * @var{B}, const int @var{ldb}, const void * @var{beta}, void * @var{C}, const int @var{ldc})
+@end deftypefun
+
+@deftypefun void cblas_zsymm (const enum CBLAS_ORDER @var{Order}, const enum CBLAS_SIDE @var{Side}, const enum CBLAS_UPLO @var{Uplo}, const int @var{M}, const int @var{N}, const void * @var{alpha}, const void * @var{A}, const int @var{lda}, const void * @var{B}, const int @var{ldb}, const void * @var{beta}, void * @var{C}, const int @var{ldc})
+@end deftypefun
+
+@deftypefun void cblas_zsyrk (const enum CBLAS_ORDER @var{Order}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{Trans}, const int @var{N}, const int @var{K}, const void * @var{alpha}, const void * @var{A}, const int @var{lda}, const void * @var{beta}, void * @var{C}, const int @var{ldc})
+@end deftypefun
+
+@deftypefun void cblas_zsyr2k (const enum CBLAS_ORDER @var{Order}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{Trans}, const int @var{N}, const int @var{K}, const void * @var{alpha}, const void * @var{A}, const int @var{lda}, const void * @var{B}, const int @var{ldb}, const void * @var{beta}, void * @var{C}, const int @var{ldc})
+@end deftypefun
+
+@deftypefun void cblas_ztrmm (const enum CBLAS_ORDER @var{Order}, const enum CBLAS_SIDE @var{Side}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{TransA}, const enum CBLAS_DIAG @var{Diag}, const int @var{M}, const int @var{N}, const void * @var{alpha}, const void * @var{A}, const int @var{lda}, void * @var{B}, const int @var{ldb})
+@end deftypefun
+
+@deftypefun void cblas_ztrsm (const enum CBLAS_ORDER @var{Order}, const enum CBLAS_SIDE @var{Side}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{TransA}, const enum CBLAS_DIAG @var{Diag}, const int @var{M}, const int @var{N}, const void * @var{alpha}, const void * @var{A}, const int @var{lda}, void * @var{B}, const int @var{ldb})
+@end deftypefun
+
+@deftypefun void cblas_chemm (const enum CBLAS_ORDER @var{Order}, const enum CBLAS_SIDE @var{Side}, const enum CBLAS_UPLO @var{Uplo}, const int @var{M}, const int @var{N}, const void * @var{alpha}, const void * @var{A}, const int @var{lda}, const void * @var{B}, const int @var{ldb}, const void * @var{beta}, void * @var{C}, const int @var{ldc})
+@end deftypefun
+
+@deftypefun void cblas_cherk (const enum CBLAS_ORDER @var{Order}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{Trans}, const int @var{N}, const int @var{K}, const float @var{alpha}, const void * @var{A}, const int @var{lda}, const float @var{beta}, void * @var{C}, const int @var{ldc})
+@end deftypefun
+
+@deftypefun void cblas_cher2k (const enum CBLAS_ORDER @var{Order}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{Trans}, const int @var{N}, const int @var{K}, const void * @var{alpha}, const void * @var{A}, const int @var{lda}, const void * @var{B}, const int @var{ldb}, const float @var{beta}, void * @var{C}, const int @var{ldc})
+@end deftypefun
+
+@deftypefun void cblas_zhemm (const enum CBLAS_ORDER @var{Order}, const enum CBLAS_SIDE @var{Side}, const enum CBLAS_UPLO @var{Uplo}, const int @var{M}, const int @var{N}, const void * @var{alpha}, const void * @var{A}, const int @var{lda}, const void * @var{B}, const int @var{ldb}, const void * @var{beta}, void * @var{C}, const int @var{ldc})
+@end deftypefun
+
+@deftypefun void cblas_zherk (const enum CBLAS_ORDER @var{Order}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{Trans}, const int @var{N}, const int @var{K}, const double @var{alpha}, const void * @var{A}, const int @var{lda}, const double @var{beta}, void * @var{C}, const int @var{ldc})
+@end deftypefun
+
+@deftypefun void cblas_zher2k (const enum CBLAS_ORDER @var{Order}, const enum CBLAS_UPLO @var{Uplo}, const enum CBLAS_TRANSPOSE @var{Trans}, const int @var{N}, const int @var{K}, const void * @var{alpha}, const void * @var{A}, const int @var{lda}, const void * @var{B}, const int @var{ldb}, const double @var{beta}, void * @var{C}, const int @var{ldc})
+@end deftypefun
+
+@deftypefun void cblas_xerbla (int @var{p}, const char * @var{rout}, const char * @var{form}, ...)
+@end deftypefun
+
+@node GSL CBLAS Examples
+@section Examples
+
+The following program computes the product of two matrices using the
+Level-3 @sc{blas} function @sc{sgemm},
+@tex
+\beforedisplay
+$$
+\left(
+\matrix{0.11&0.12&0.13\cr
+0.21&0.22&0.23\cr}
+\right)
+\left(
+\matrix{1011&1012\cr
+1021&1022\cr
+1031&1031\cr}
+\right)
+=
+\left(
+\matrix{367.76&368.12\cr
+674.06&674.72\cr}
+\right)
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+[ 0.11 0.12 0.13 ] [ 1011 1012 ] [ 367.76 368.12 ]
+[ 0.21 0.22 0.23 ] [ 1021 1022 ] = [ 674.06 674.72 ]
+ [ 1031 1032 ]
+@end example
+
+@end ifinfo
+@noindent
+The matrices are stored in row major order but could be stored in column
+major order if the first argument of the call to @code{cblas_sgemm} was
+changed to @code{CblasColMajor}.
+
+@example
+@verbatiminclude examples/cblas.c
+@end example
+
+@noindent
+To compile the program use the following command line,
+
+@example
+$ gcc -Wall demo.c -lgslcblas
+@end example
+
+@noindent
+There is no need to link with the main library @code{-lgsl} in this
+case as the @sc{cblas} library is an independent unit. Here is the output
+from the program,
+
+@example
+$ ./a.out
+@verbatiminclude examples/cblas.out
+@end example
diff --git a/gsl-1.9/doc/cheb.eps b/gsl-1.9/doc/cheb.eps
new file mode 100644
index 0000000..6e868af
--- /dev/null
+++ b/gsl-1.9/doc/cheb.eps
@@ -0,0 +1,3348 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: cheb.eps
+%%Creator: gnuplot 3.5 (pre 3.6) patchlevel beta 347
+%%CreationDate: Wed Apr 25 18:48:58 2001
+%%DocumentFonts: (atend)
+%%BoundingBox: 50 50 410 302
+%%Orientation: Portrait
+%%EndComments
+/gnudict 120 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+/vshift -46 def
+/dl {10 mul} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke gnulinewidth 2 mul setlinewidth } def
+/AL { stroke gnulinewidth 2 div setlinewidth } def
+/UL { gnulinewidth mul /userlinewidth exch def } def
+/PL { stroke userlinewidth setlinewidth } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 dl 2 dl] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 1 0 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
+/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/Pnt { stroke [] 0 setdash
+ gsave 1 setlinecap M 0 0 V stroke grestore } def
+/Dia { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt } def
+/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt } def
+/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt } def
+/Star { 2 copy Pls Crs } def
+/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill } def
+/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill } def
+/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt } def
+/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill } def
+/Pent { stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt } def
+/PentF { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore } def
+/Circle { stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt } def
+/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
+/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def
+/C1 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C2 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C3 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C4 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C5 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc } bind def
+/C6 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C7 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C8 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C9 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C11 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C12 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C13 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C14 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc } bind def
+/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath } bind def
+/Square { dup Rec } bind def
+/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
+/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
+/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
+/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
+/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill
+ Bsquare } bind def
+/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
+/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare } bind def
+/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare } bind def
+/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
+/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare } bind def
+/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
+/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
+/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
+/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
+/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
+/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
+/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
+/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
+/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
+/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
+/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
+/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
+/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
+/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
+/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
+/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
+/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
+/DiaE { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke } def
+/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke } def
+/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke } def
+/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke } def
+/PentE { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore } def
+/CircE { stroke [] 0 setdash
+ hpt 0 360 arc stroke } def
+/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def
+/DiaW { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke } def
+/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke } def
+/TriUW { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke } def
+/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke } def
+/PentW { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore } def
+/CircW { stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke } def
+/BoxFill { gsave Rec 1 setgray fill grestore } def
+end
+%%EndProlog
+gnudict begin
+gsave
+50 50 translate
+0.050 0.050 scale
+0 setgray
+newpath
+(Helvetica) findfont 140 scalefont setfont
+1.000 UL
+LTb
+420 280 M
+63 0 V
+6549 0 R
+-63 0 V
+336 280 M
+(0) Rshow
+420 1198 M
+63 0 V
+6549 0 R
+-63 0 V
+-6633 0 R
+(0.2) Rshow
+420 2117 M
+63 0 V
+6549 0 R
+-63 0 V
+-6633 0 R
+(0.4) Rshow
+420 3035 M
+63 0 V
+6549 0 R
+-63 0 V
+-6633 0 R
+(0.6) Rshow
+420 3954 M
+63 0 V
+6549 0 R
+-63 0 V
+-6633 0 R
+(0.8) Rshow
+420 4872 M
+63 0 V
+6549 0 R
+-63 0 V
+-6633 0 R
+(1) Rshow
+420 280 M
+0 63 V
+0 4529 R
+0 -63 V
+420 140 M
+(0) Cshow
+1742 280 M
+0 63 V
+0 4529 R
+0 -63 V
+0 -4669 R
+(0.2) Cshow
+3065 280 M
+0 63 V
+0 4529 R
+0 -63 V
+0 -4669 R
+(0.4) Cshow
+4387 280 M
+0 63 V
+0 4529 R
+0 -63 V
+0 -4669 R
+(0.6) Cshow
+5710 280 M
+0 63 V
+0 4529 R
+0 -63 V
+0 -4669 R
+(0.8) Cshow
+7032 280 M
+0 63 V
+0 4529 R
+0 -63 V
+0 -4669 R
+(1) Cshow
+1.000 UL
+LTb
+420 280 M
+6612 0 V
+0 4592 V
+-6612 0 V
+420 280 L
+1.000 UL
+LT0
+420 1428 M
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+currentpoint stroke M
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 2296 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+currentpoint stroke M
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+1.000 UL
+LT1
+420 1331 M
+7 20 V
+6 19 V
+7 17 V
+6 16 V
+7 15 V
+7 14 V
+6 12 V
+7 12 V
+7 10 V
+6 10 V
+7 8 V
+6 8 V
+7 7 V
+7 6 V
+6 5 V
+7 5 V
+6 3 V
+7 4 V
+7 2 V
+6 2 V
+7 1 V
+6 1 V
+7 1 V
+7 -1 V
+6 0 V
+7 -1 V
+7 -2 V
+6 -1 V
+7 -3 V
+6 -2 V
+7 -3 V
+7 -3 V
+6 -3 V
+7 -4 V
+6 -4 V
+7 -4 V
+7 -4 V
+6 -4 V
+7 -4 V
+6 -5 V
+7 -5 V
+7 -4 V
+6 -5 V
+7 -5 V
+7 -5 V
+6 -5 V
+7 -5 V
+6 -5 V
+7 -5 V
+7 -5 V
+6 -5 V
+7 -5 V
+6 -5 V
+7 -5 V
+7 -5 V
+6 -5 V
+7 -4 V
+6 -5 V
+7 -4 V
+7 -5 V
+6 -4 V
+7 -4 V
+7 -4 V
+6 -4 V
+7 -4 V
+6 -4 V
+7 -4 V
+7 -3 V
+6 -4 V
+7 -3 V
+6 -3 V
+7 -3 V
+7 -2 V
+6 -3 V
+7 -3 V
+7 -2 V
+6 -2 V
+7 -2 V
+6 -2 V
+7 -2 V
+7 -1 V
+6 -1 V
+7 -2 V
+6 -1 V
+7 -1 V
+7 0 V
+6 -1 V
+7 -1 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+7 1 V
+6 0 V
+7 1 V
+6 1 V
+7 1 V
+7 1 V
+6 1 V
+7 2 V
+6 1 V
+7 2 V
+7 2 V
+6 2 V
+7 1 V
+6 3 V
+7 2 V
+7 2 V
+6 2 V
+7 3 V
+7 3 V
+6 2 V
+7 3 V
+6 3 V
+7 3 V
+7 3 V
+6 3 V
+7 3 V
+6 3 V
+7 4 V
+7 3 V
+6 3 V
+7 4 V
+7 3 V
+6 4 V
+7 3 V
+6 4 V
+7 4 V
+7 3 V
+6 4 V
+7 4 V
+6 4 V
+7 4 V
+7 3 V
+6 4 V
+7 4 V
+6 4 V
+7 4 V
+7 4 V
+6 3 V
+7 4 V
+7 4 V
+6 4 V
+7 4 V
+6 3 V
+7 4 V
+7 4 V
+6 3 V
+7 4 V
+6 4 V
+7 3 V
+7 4 V
+6 3 V
+7 4 V
+6 3 V
+7 3 V
+7 4 V
+6 3 V
+7 3 V
+7 3 V
+6 3 V
+7 3 V
+6 3 V
+7 3 V
+7 3 V
+6 3 V
+7 2 V
+6 3 V
+7 2 V
+7 3 V
+6 2 V
+7 2 V
+6 2 V
+7 2 V
+7 2 V
+6 2 V
+7 2 V
+7 2 V
+6 1 V
+7 2 V
+6 1 V
+7 2 V
+7 1 V
+6 1 V
+7 1 V
+6 1 V
+7 1 V
+7 1 V
+6 0 V
+7 1 V
+7 1 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 -1 V
+7 0 V
+6 -1 V
+7 -1 V
+6 -1 V
+7 -1 V
+7 -1 V
+6 -1 V
+7 -1 V
+7 -1 V
+6 -2 V
+7 -1 V
+6 -2 V
+7 -1 V
+7 -2 V
+6 -2 V
+7 -2 V
+6 -2 V
+7 -2 V
+7 -3 V
+6 -2 V
+7 -2 V
+6 -3 V
+7 -2 V
+7 -3 V
+6 -3 V
+7 -3 V
+7 -2 V
+6 -3 V
+7 -3 V
+6 -4 V
+7 -3 V
+7 -3 V
+6 -3 V
+7 -4 V
+6 -3 V
+7 -4 V
+7 -3 V
+6 -4 V
+7 -4 V
+6 -3 V
+7 -4 V
+7 -4 V
+6 -4 V
+7 -4 V
+7 -4 V
+6 -4 V
+7 -4 V
+6 -4 V
+7 -4 V
+7 -4 V
+6 -5 V
+7 -4 V
+6 -4 V
+7 -4 V
+7 -5 V
+6 -4 V
+7 -4 V
+7 -5 V
+6 -4 V
+7 -5 V
+6 -4 V
+7 -4 V
+7 -5 V
+6 -4 V
+7 -5 V
+6 -4 V
+7 -5 V
+7 -4 V
+6 -4 V
+7 -5 V
+6 -4 V
+7 -5 V
+7 -4 V
+6 -4 V
+7 -5 V
+7 -4 V
+6 -4 V
+7 -5 V
+6 -4 V
+7 -4 V
+7 -4 V
+6 -4 V
+7 -4 V
+6 -4 V
+7 -4 V
+7 -4 V
+6 -4 V
+7 -4 V
+6 -4 V
+7 -4 V
+7 -3 V
+6 -4 V
+7 -4 V
+7 -3 V
+6 -4 V
+7 -3 V
+6 -3 V
+7 -4 V
+7 -3 V
+6 -3 V
+7 -3 V
+6 -3 V
+7 -3 V
+7 -2 V
+6 -3 V
+7 -3 V
+6 -2 V
+7 -3 V
+7 -2 V
+6 -2 V
+7 -2 V
+7 -3 V
+6 -1 V
+7 -2 V
+6 -2 V
+7 -2 V
+7 -1 V
+6 -2 V
+7 -1 V
+6 -1 V
+7 -1 V
+7 -1 V
+6 -1 V
+7 -1 V
+7 -1 V
+6 0 V
+7 0 V
+6 -1 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 1 V
+7 0 V
+7 1 V
+6 1 V
+7 0 V
+6 1 V
+7 2 V
+7 1 V
+6 1 V
+7 2 V
+7 2 V
+6 1 V
+7 2 V
+6 2 V
+7 3 V
+7 2 V
+6 3 V
+7 2 V
+6 3 V
+7 3 V
+7 3 V
+6 3 V
+7 4 V
+6 3 V
+7 4 V
+7 4 V
+6 4 V
+7 4 V
+7 4 V
+6 5 V
+7 4 V
+6 5 V
+7 5 V
+7 5 V
+6 5 V
+7 5 V
+6 6 V
+7 5 V
+7 6 V
+6 6 V
+7 6 V
+7 6 V
+6 6 V
+7 7 V
+6 6 V
+7 7 V
+7 7 V
+6 7 V
+7 7 V
+6 8 V
+7 7 V
+7 8 V
+6 8 V
+7 7 V
+6 8 V
+7 9 V
+7 8 V
+6 8 V
+7 9 V
+7 9 V
+6 9 V
+7 9 V
+6 9 V
+7 9 V
+7 9 V
+6 10 V
+currentpoint stroke M
+7 10 V
+6 9 V
+7 10 V
+7 10 V
+6 11 V
+7 10 V
+6 10 V
+7 11 V
+7 11 V
+6 10 V
+7 11 V
+7 11 V
+6 11 V
+7 12 V
+6 11 V
+7 12 V
+7 11 V
+6 12 V
+7 12 V
+6 12 V
+7 12 V
+7 12 V
+6 12 V
+7 12 V
+6 13 V
+7 12 V
+7 13 V
+6 13 V
+7 12 V
+7 13 V
+6 13 V
+7 13 V
+6 13 V
+7 14 V
+7 13 V
+6 13 V
+7 14 V
+6 13 V
+7 14 V
+7 14 V
+6 14 V
+7 13 V
+7 14 V
+6 14 V
+7 14 V
+6 14 V
+7 15 V
+7 14 V
+6 14 V
+7 14 V
+6 15 V
+7 14 V
+7 15 V
+6 14 V
+7 15 V
+6 14 V
+7 15 V
+7 15 V
+6 14 V
+7 15 V
+7 15 V
+6 15 V
+7 15 V
+6 14 V
+7 15 V
+7 15 V
+6 15 V
+7 15 V
+6 15 V
+7 15 V
+7 15 V
+6 15 V
+7 15 V
+6 15 V
+7 15 V
+7 15 V
+6 15 V
+7 15 V
+7 15 V
+6 15 V
+7 15 V
+6 15 V
+7 15 V
+7 15 V
+6 15 V
+7 15 V
+6 15 V
+7 15 V
+7 14 V
+6 15 V
+7 15 V
+6 15 V
+7 15 V
+7 14 V
+6 15 V
+7 15 V
+7 14 V
+6 15 V
+7 14 V
+6 15 V
+7 14 V
+7 14 V
+6 15 V
+7 14 V
+6 14 V
+7 14 V
+7 14 V
+6 14 V
+7 14 V
+7 14 V
+6 14 V
+7 14 V
+6 13 V
+7 14 V
+7 14 V
+6 13 V
+7 14 V
+6 13 V
+7 13 V
+7 13 V
+6 13 V
+7 13 V
+6 13 V
+7 13 V
+7 13 V
+6 13 V
+7 12 V
+7 13 V
+6 12 V
+7 12 V
+6 13 V
+7 12 V
+7 12 V
+6 12 V
+7 11 V
+6 12 V
+7 12 V
+7 11 V
+6 12 V
+7 11 V
+6 11 V
+7 11 V
+7 11 V
+6 11 V
+7 11 V
+7 10 V
+6 11 V
+7 10 V
+6 11 V
+7 10 V
+7 10 V
+6 10 V
+7 10 V
+6 9 V
+7 10 V
+7 9 V
+6 10 V
+7 9 V
+6 9 V
+7 9 V
+7 9 V
+6 9 V
+7 8 V
+7 9 V
+6 8 V
+7 8 V
+6 8 V
+7 8 V
+7 8 V
+6 8 V
+7 8 V
+6 7 V
+7 7 V
+7 8 V
+6 7 V
+7 7 V
+7 7 V
+6 6 V
+7 7 V
+6 6 V
+7 7 V
+7 6 V
+6 6 V
+7 6 V
+6 6 V
+7 5 V
+7 6 V
+6 5 V
+7 6 V
+6 5 V
+7 5 V
+7 5 V
+6 4 V
+7 5 V
+7 5 V
+6 4 V
+7 4 V
+6 5 V
+7 4 V
+7 3 V
+6 4 V
+7 4 V
+6 3 V
+7 4 V
+7 3 V
+6 3 V
+7 3 V
+6 3 V
+7 3 V
+7 3 V
+6 2 V
+7 3 V
+7 2 V
+6 2 V
+7 2 V
+6 2 V
+7 2 V
+7 2 V
+6 2 V
+7 1 V
+6 2 V
+7 1 V
+7 1 V
+6 1 V
+7 1 V
+7 1 V
+6 1 V
+7 1 V
+6 0 V
+7 1 V
+7 0 V
+6 1 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 -1 V
+7 0 V
+7 -1 V
+6 0 V
+7 -1 V
+7 -1 V
+6 -1 V
+7 -1 V
+6 -1 V
+7 -1 V
+7 -1 V
+6 -1 V
+7 -2 V
+6 -1 V
+7 -1 V
+7 -2 V
+6 -1 V
+7 -2 V
+6 -2 V
+7 -2 V
+7 -1 V
+6 -2 V
+7 -2 V
+7 -2 V
+6 -2 V
+7 -3 V
+6 -2 V
+7 -2 V
+7 -2 V
+6 -3 V
+7 -2 V
+6 -2 V
+7 -3 V
+7 -2 V
+6 -3 V
+7 -3 V
+6 -2 V
+7 -3 V
+7 -3 V
+6 -2 V
+7 -3 V
+7 -3 V
+6 -3 V
+7 -3 V
+6 -2 V
+7 -3 V
+7 -3 V
+6 -3 V
+7 -3 V
+6 -3 V
+7 -3 V
+7 -3 V
+6 -3 V
+7 -3 V
+7 -3 V
+6 -3 V
+7 -3 V
+6 -3 V
+7 -4 V
+7 -3 V
+6 -3 V
+7 -3 V
+6 -3 V
+7 -3 V
+7 -3 V
+6 -3 V
+7 -3 V
+6 -3 V
+7 -3 V
+7 -3 V
+6 -3 V
+7 -3 V
+7 -3 V
+6 -3 V
+7 -3 V
+6 -3 V
+7 -3 V
+7 -3 V
+6 -3 V
+7 -2 V
+6 -3 V
+7 -3 V
+7 -3 V
+6 -3 V
+7 -2 V
+6 -3 V
+7 -3 V
+7 -2 V
+6 -3 V
+7 -2 V
+7 -3 V
+6 -2 V
+7 -3 V
+6 -2 V
+7 -2 V
+7 -3 V
+6 -2 V
+7 -2 V
+6 -2 V
+7 -2 V
+7 -3 V
+6 -2 V
+7 -2 V
+6 -2 V
+7 -1 V
+7 -2 V
+6 -2 V
+7 -2 V
+7 -2 V
+6 -1 V
+7 -2 V
+6 -1 V
+7 -2 V
+7 -1 V
+6 -2 V
+7 -1 V
+6 -1 V
+7 -2 V
+7 -1 V
+6 -1 V
+7 -1 V
+7 -1 V
+6 -1 V
+7 -1 V
+6 -1 V
+7 0 V
+7 -1 V
+6 -1 V
+7 0 V
+6 -1 V
+7 -1 V
+7 0 V
+6 0 V
+7 -1 V
+6 0 V
+7 0 V
+7 0 V
+6 0 V
+7 -1 V
+7 0 V
+6 1 V
+7 0 V
+6 0 V
+7 0 V
+7 0 V
+6 1 V
+7 0 V
+6 0 V
+7 1 V
+7 1 V
+6 0 V
+7 1 V
+6 0 V
+7 1 V
+7 1 V
+6 1 V
+7 1 V
+7 1 V
+6 1 V
+7 1 V
+6 1 V
+7 1 V
+currentpoint stroke M
+7 1 V
+6 1 V
+7 1 V
+6 2 V
+7 1 V
+7 1 V
+6 2 V
+7 1 V
+6 2 V
+7 1 V
+7 2 V
+6 1 V
+7 2 V
+7 2 V
+6 1 V
+7 2 V
+6 2 V
+7 2 V
+7 1 V
+6 2 V
+7 2 V
+6 2 V
+7 2 V
+7 2 V
+6 2 V
+7 2 V
+7 1 V
+6 2 V
+7 2 V
+6 2 V
+7 2 V
+7 2 V
+6 2 V
+7 2 V
+6 2 V
+7 2 V
+7 3 V
+6 2 V
+7 2 V
+6 2 V
+7 2 V
+7 2 V
+6 2 V
+7 2 V
+7 2 V
+6 2 V
+7 2 V
+6 2 V
+7 2 V
+7 1 V
+6 2 V
+7 2 V
+6 2 V
+7 2 V
+7 2 V
+6 2 V
+7 1 V
+6 2 V
+7 2 V
+7 2 V
+6 1 V
+7 2 V
+7 2 V
+6 1 V
+7 2 V
+6 1 V
+7 2 V
+7 1 V
+6 1 V
+7 2 V
+6 1 V
+7 1 V
+7 2 V
+6 1 V
+7 1 V
+7 1 V
+6 1 V
+7 1 V
+6 1 V
+7 1 V
+7 0 V
+6 1 V
+7 1 V
+6 1 V
+7 0 V
+7 1 V
+6 0 V
+7 1 V
+6 0 V
+7 0 V
+7 0 V
+6 1 V
+7 0 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 -1 V
+6 0 V
+7 0 V
+6 -1 V
+7 0 V
+7 -1 V
+6 0 V
+7 -1 V
+6 -1 V
+7 -1 V
+7 0 V
+6 -1 V
+7 -1 V
+7 -1 V
+6 -1 V
+7 -2 V
+6 -1 V
+7 -1 V
+7 -1 V
+6 -2 V
+7 -1 V
+6 -2 V
+7 -1 V
+7 -2 V
+6 -1 V
+7 -2 V
+6 -2 V
+7 -1 V
+7 -2 V
+6 -2 V
+7 -2 V
+7 -2 V
+6 -1 V
+7 -2 V
+6 -2 V
+7 -2 V
+7 -2 V
+6 -2 V
+7 -2 V
+6 -2 V
+7 -3 V
+7 -2 V
+6 -2 V
+7 -2 V
+7 -2 V
+6 -2 V
+7 -2 V
+6 -2 V
+7 -2 V
+7 -2 V
+6 -2 V
+7 -2 V
+6 -2 V
+7 -2 V
+7 -2 V
+6 -2 V
+7 -2 V
+6 -1 V
+7 -2 V
+7 -2 V
+6 -1 V
+7 -2 V
+7 -1 V
+6 -1 V
+7 -2 V
+6 -1 V
+7 -1 V
+7 -1 V
+6 -1 V
+7 0 V
+6 -1 V
+7 -1 V
+7 0 V
+6 0 V
+7 0 V
+6 0 V
+7 0 V
+7 1 V
+6 0 V
+7 1 V
+7 1 V
+6 1 V
+7 1 V
+6 2 V
+7 2 V
+7 1 V
+6 3 V
+7 2 V
+6 3 V
+7 3 V
+7 3 V
+6 3 V
+7 4 V
+6 4 V
+7 4 V
+7 5 V
+6 5 V
+7 5 V
+7 6 V
+6 6 V
+7 6 V
+6 7 V
+7 7 V
+1.000 UL
+LT2
+420 1457 M
+7 -54 V
+6 0 V
+7 19 V
+6 19 V
+7 13 V
+7 3 V
+6 -4 V
+7 -11 V
+7 -12 V
+6 -12 V
+7 -11 V
+6 -6 V
+7 -3 V
+7 1 V
+6 5 V
+7 7 V
+6 9 V
+7 9 V
+7 9 V
+6 8 V
+7 6 V
+6 5 V
+7 1 V
+7 0 V
+6 -2 V
+7 -5 V
+7 -6 V
+6 -6 V
+7 -8 V
+6 -7 V
+7 -7 V
+7 -7 V
+6 -5 V
+7 -4 V
+6 -3 V
+7 -1 V
+7 0 V
+6 2 V
+7 3 V
+6 4 V
+7 5 V
+7 6 V
+6 6 V
+7 7 V
+7 6 V
+6 6 V
+7 5 V
+6 5 V
+7 4 V
+7 2 V
+6 2 V
+7 1 V
+6 -1 V
+7 -2 V
+7 -2 V
+6 -4 V
+7 -4 V
+6 -5 V
+7 -5 V
+7 -6 V
+6 -5 V
+7 -6 V
+7 -6 V
+6 -5 V
+7 -4 V
+6 -4 V
+7 -3 V
+7 -3 V
+6 -1 V
+7 -1 V
+6 0 V
+7 1 V
+7 2 V
+6 3 V
+7 3 V
+7 4 V
+6 4 V
+7 5 V
+6 5 V
+7 5 V
+7 6 V
+6 5 V
+7 5 V
+6 4 V
+7 5 V
+7 3 V
+6 4 V
+7 2 V
+6 2 V
+7 1 V
+7 1 V
+6 0 V
+7 -1 V
+7 -2 V
+6 -2 V
+7 -3 V
+6 -4 V
+7 -4 V
+7 -4 V
+6 -4 V
+7 -5 V
+6 -5 V
+7 -5 V
+7 -5 V
+6 -5 V
+7 -5 V
+6 -4 V
+7 -4 V
+7 -3 V
+6 -3 V
+7 -2 V
+7 -2 V
+6 -1 V
+7 -1 V
+6 0 V
+7 1 V
+7 1 V
+6 2 V
+7 2 V
+6 3 V
+7 4 V
+7 3 V
+6 5 V
+7 4 V
+7 5 V
+6 4 V
+7 5 V
+6 5 V
+7 5 V
+7 5 V
+6 4 V
+7 4 V
+6 4 V
+7 3 V
+7 3 V
+6 3 V
+7 1 V
+6 2 V
+7 1 V
+7 0 V
+6 0 V
+7 -1 V
+7 -2 V
+6 -2 V
+7 -2 V
+6 -3 V
+7 -3 V
+7 -4 V
+6 -4 V
+7 -5 V
+6 -4 V
+7 -5 V
+7 -5 V
+6 -4 V
+7 -5 V
+6 -5 V
+7 -5 V
+7 -4 V
+6 -4 V
+7 -4 V
+7 -3 V
+6 -3 V
+7 -3 V
+6 -2 V
+7 -2 V
+7 -1 V
+6 0 V
+7 0 V
+6 0 V
+7 1 V
+7 2 V
+6 2 V
+7 2 V
+6 3 V
+7 3 V
+7 4 V
+6 4 V
+7 4 V
+7 5 V
+6 5 V
+7 5 V
+6 5 V
+7 5 V
+7 4 V
+6 5 V
+7 5 V
+6 4 V
+7 5 V
+7 4 V
+6 3 V
+7 3 V
+7 3 V
+6 3 V
+7 1 V
+6 2 V
+7 1 V
+7 0 V
+6 0 V
+7 -1 V
+6 -1 V
+7 -2 V
+7 -2 V
+6 -2 V
+7 -3 V
+6 -4 V
+7 -4 V
+7 -4 V
+6 -4 V
+7 -5 V
+7 -5 V
+6 -5 V
+7 -5 V
+6 -5 V
+7 -6 V
+7 -5 V
+6 -5 V
+7 -5 V
+6 -4 V
+7 -5 V
+7 -4 V
+6 -4 V
+7 -3 V
+6 -3 V
+7 -3 V
+7 -2 V
+6 -1 V
+7 -1 V
+7 -1 V
+6 0 V
+7 0 V
+6 1 V
+7 2 V
+7 2 V
+6 2 V
+7 3 V
+6 4 V
+7 3 V
+7 5 V
+6 4 V
+7 5 V
+6 5 V
+7 5 V
+7 6 V
+6 5 V
+7 6 V
+7 5 V
+6 6 V
+7 6 V
+6 5 V
+7 5 V
+7 5 V
+6 5 V
+7 4 V
+6 4 V
+7 4 V
+7 3 V
+6 3 V
+7 2 V
+7 1 V
+6 2 V
+7 0 V
+6 0 V
+7 0 V
+7 -1 V
+6 -2 V
+7 -2 V
+6 -2 V
+7 -4 V
+7 -3 V
+6 -4 V
+7 -5 V
+6 -4 V
+7 -6 V
+7 -5 V
+6 -6 V
+7 -6 V
+7 -6 V
+6 -6 V
+7 -6 V
+6 -7 V
+7 -6 V
+7 -6 V
+6 -6 V
+7 -6 V
+6 -5 V
+7 -6 V
+7 -5 V
+6 -4 V
+7 -4 V
+6 -4 V
+7 -3 V
+7 -3 V
+6 -2 V
+7 -2 V
+7 -1 V
+6 0 V
+7 0 V
+6 1 V
+7 2 V
+7 2 V
+6 2 V
+7 3 V
+6 4 V
+7 4 V
+7 5 V
+6 5 V
+7 6 V
+6 6 V
+7 6 V
+7 7 V
+6 7 V
+7 7 V
+7 7 V
+6 8 V
+7 7 V
+6 7 V
+7 8 V
+7 7 V
+6 6 V
+7 7 V
+6 6 V
+7 6 V
+7 6 V
+6 5 V
+7 5 V
+7 4 V
+6 3 V
+7 3 V
+6 2 V
+7 2 V
+7 1 V
+6 0 V
+7 0 V
+6 -1 V
+7 -2 V
+7 -3 V
+6 -3 V
+7 -4 V
+6 -4 V
+7 -6 V
+7 -5 V
+6 -7 V
+7 -7 V
+7 -7 V
+6 -8 V
+7 -8 V
+6 -8 V
+7 -9 V
+7 -9 V
+6 -9 V
+7 -9 V
+6 -9 V
+7 -9 V
+7 -9 V
+6 -9 V
+7 -8 V
+6 -8 V
+7 -8 V
+7 -7 V
+6 -7 V
+7 -6 V
+7 -6 V
+6 -5 V
+7 -4 V
+6 -3 V
+7 -3 V
+7 -2 V
+6 -1 V
+7 0 V
+6 1 V
+7 1 V
+7 3 V
+6 3 V
+7 4 V
+7 6 V
+6 6 V
+7 6 V
+6 8 V
+7 8 V
+7 9 V
+6 10 V
+7 10 V
+6 11 V
+7 11 V
+7 11 V
+6 12 V
+7 12 V
+6 12 V
+7 13 V
+7 12 V
+6 12 V
+7 12 V
+7 12 V
+6 12 V
+7 11 V
+6 10 V
+7 10 V
+7 9 V
+6 9 V
+currentpoint stroke M
+7 7 V
+6 7 V
+7 5 V
+7 5 V
+6 4 V
+7 2 V
+6 1 V
+7 1 V
+7 -2 V
+6 -2 V
+7 -4 V
+7 -5 V
+6 -6 V
+7 -8 V
+6 -9 V
+7 -10 V
+7 -11 V
+6 -12 V
+7 -14 V
+6 -14 V
+7 -16 V
+7 -16 V
+6 -18 V
+7 -18 V
+6 -18 V
+7 -19 V
+7 -20 V
+6 -20 V
+7 -20 V
+7 -20 V
+6 -20 V
+7 -20 V
+6 -19 V
+7 -19 V
+7 -18 V
+6 -18 V
+7 -17 V
+6 -15 V
+7 -15 V
+7 -13 V
+6 -12 V
+7 -10 V
+7 -9 V
+6 -7 V
+7 -4 V
+6 -3 V
+7 -1 V
+7 2 V
+6 4 V
+7 6 V
+6 9 V
+7 12 V
+7 14 V
+6 16 V
+7 20 V
+6 22 V
+7 25 V
+7 28 V
+6 30 V
+7 33 V
+7 36 V
+6 38 V
+7 42 V
+6 43 V
+7 46 V
+7 49 V
+6 51 V
+7 53 V
+6 55 V
+7 58 V
+7 59 V
+6 61 V
+7 62 V
+6 64 V
+7 66 V
+7 66 V
+6 68 V
+7 68 V
+7 69 V
+6 69 V
+7 70 V
+6 70 V
+7 70 V
+7 70 V
+6 69 V
+7 69 V
+6 68 V
+7 67 V
+7 66 V
+6 65 V
+7 63 V
+6 62 V
+7 60 V
+7 59 V
+6 56 V
+7 55 V
+7 52 V
+6 50 V
+7 48 V
+6 45 V
+7 43 V
+7 40 V
+6 38 V
+7 35 V
+6 32 V
+7 29 V
+7 27 V
+6 24 V
+7 22 V
+7 18 V
+6 16 V
+7 14 V
+6 10 V
+7 9 V
+7 5 V
+6 4 V
+7 1 V
+6 -1 V
+7 -3 V
+7 -6 V
+6 -7 V
+7 -8 V
+6 -11 V
+7 -12 V
+7 -13 V
+6 -15 V
+7 -16 V
+7 -16 V
+6 -18 V
+7 -18 V
+6 -19 V
+7 -19 V
+7 -20 V
+6 -20 V
+7 -19 V
+6 -20 V
+7 -20 V
+7 -19 V
+6 -19 V
+7 -18 V
+6 -18 V
+7 -17 V
+7 -16 V
+6 -15 V
+7 -15 V
+7 -13 V
+6 -12 V
+7 -11 V
+6 -10 V
+7 -9 V
+7 -7 V
+6 -7 V
+7 -5 V
+6 -4 V
+7 -2 V
+7 -1 V
+6 0 V
+7 1 V
+6 2 V
+7 3 V
+7 5 V
+6 5 V
+7 6 V
+7 8 V
+6 8 V
+7 9 V
+6 9 V
+7 10 V
+7 11 V
+6 11 V
+7 11 V
+6 12 V
+7 12 V
+7 12 V
+6 12 V
+7 12 V
+7 12 V
+6 12 V
+7 11 V
+6 11 V
+7 11 V
+7 10 V
+6 10 V
+7 9 V
+6 8 V
+7 8 V
+7 7 V
+6 6 V
+7 6 V
+6 4 V
+7 4 V
+7 3 V
+6 2 V
+7 2 V
+7 0 V
+6 0 V
+7 -2 V
+6 -2 V
+7 -3 V
+7 -3 V
+6 -4 V
+7 -5 V
+6 -6 V
+7 -6 V
+7 -7 V
+6 -7 V
+7 -7 V
+6 -8 V
+7 -8 V
+7 -9 V
+6 -9 V
+7 -8 V
+7 -9 V
+6 -9 V
+7 -9 V
+6 -8 V
+7 -9 V
+7 -8 V
+6 -8 V
+7 -7 V
+6 -7 V
+7 -7 V
+7 -6 V
+6 -6 V
+7 -5 V
+7 -5 V
+6 -4 V
+7 -3 V
+6 -3 V
+7 -2 V
+7 -1 V
+6 -1 V
+7 0 V
+6 0 V
+7 2 V
+7 2 V
+6 2 V
+7 3 V
+6 4 V
+7 4 V
+7 4 V
+6 5 V
+7 6 V
+7 6 V
+6 6 V
+7 6 V
+6 7 V
+7 7 V
+7 7 V
+6 7 V
+7 7 V
+6 7 V
+7 7 V
+7 7 V
+6 6 V
+7 7 V
+6 6 V
+7 6 V
+7 5 V
+6 5 V
+7 5 V
+7 4 V
+6 4 V
+7 3 V
+6 3 V
+7 2 V
+7 1 V
+6 1 V
+7 1 V
+6 0 V
+7 -1 V
+7 -1 V
+6 -2 V
+7 -2 V
+6 -3 V
+7 -3 V
+7 -4 V
+6 -4 V
+7 -4 V
+7 -5 V
+6 -5 V
+7 -5 V
+6 -6 V
+7 -6 V
+7 -6 V
+6 -6 V
+7 -6 V
+6 -6 V
+7 -5 V
+7 -6 V
+6 -6 V
+7 -5 V
+7 -6 V
+6 -5 V
+7 -4 V
+6 -5 V
+7 -4 V
+7 -3 V
+6 -3 V
+7 -3 V
+6 -2 V
+7 -2 V
+7 -1 V
+6 -1 V
+7 0 V
+6 0 V
+7 1 V
+7 1 V
+6 2 V
+7 2 V
+7 3 V
+6 3 V
+7 3 V
+6 4 V
+7 4 V
+7 4 V
+6 5 V
+7 5 V
+6 5 V
+7 5 V
+7 5 V
+6 5 V
+7 6 V
+6 5 V
+7 5 V
+7 5 V
+6 5 V
+7 5 V
+7 4 V
+6 4 V
+7 4 V
+6 3 V
+7 4 V
+7 2 V
+6 2 V
+7 2 V
+6 2 V
+7 1 V
+7 0 V
+6 0 V
+7 -1 V
+6 -1 V
+7 -1 V
+7 -2 V
+6 -2 V
+7 -3 V
+7 -3 V
+6 -3 V
+7 -4 V
+6 -4 V
+7 -4 V
+7 -5 V
+6 -4 V
+7 -5 V
+6 -5 V
+7 -5 V
+7 -4 V
+6 -5 V
+7 -5 V
+7 -4 V
+6 -5 V
+7 -4 V
+6 -4 V
+7 -4 V
+7 -3 V
+6 -3 V
+7 -2 V
+6 -3 V
+7 -1 V
+7 -2 V
+6 0 V
+7 -1 V
+6 0 V
+7 1 V
+7 1 V
+6 1 V
+7 2 V
+7 2 V
+6 3 V
+7 3 V
+6 3 V
+7 3 V
+7 4 V
+6 4 V
+7 5 V
+6 4 V
+7 4 V
+7 5 V
+6 5 V
+7 4 V
+6 5 V
+7 4 V
+7 4 V
+6 4 V
+7 4 V
+7 3 V
+6 3 V
+7 3 V
+6 2 V
+7 2 V
+currentpoint stroke M
+7 1 V
+6 2 V
+7 0 V
+6 0 V
+7 0 V
+7 -1 V
+6 -1 V
+7 -2 V
+6 -2 V
+7 -2 V
+7 -3 V
+6 -3 V
+7 -4 V
+7 -3 V
+6 -4 V
+7 -4 V
+6 -5 V
+7 -4 V
+7 -4 V
+6 -5 V
+7 -4 V
+6 -4 V
+7 -4 V
+7 -4 V
+6 -4 V
+7 -3 V
+7 -3 V
+6 -3 V
+7 -2 V
+6 -2 V
+7 -1 V
+7 -1 V
+6 -1 V
+7 0 V
+6 1 V
+7 1 V
+7 1 V
+6 2 V
+7 3 V
+6 2 V
+7 3 V
+7 4 V
+6 3 V
+7 4 V
+7 4 V
+6 5 V
+7 4 V
+6 4 V
+7 5 V
+7 4 V
+6 4 V
+7 4 V
+6 3 V
+7 4 V
+7 3 V
+6 2 V
+7 3 V
+6 1 V
+7 2 V
+7 1 V
+6 0 V
+7 0 V
+7 -1 V
+6 -1 V
+7 -2 V
+6 -2 V
+7 -3 V
+7 -3 V
+6 -3 V
+7 -4 V
+6 -4 V
+7 -4 V
+7 -4 V
+6 -5 V
+7 -4 V
+7 -4 V
+6 -5 V
+7 -4 V
+6 -3 V
+7 -4 V
+7 -3 V
+6 -3 V
+7 -2 V
+6 -2 V
+7 -1 V
+7 0 V
+6 0 V
+7 0 V
+6 1 V
+7 2 V
+7 2 V
+6 3 V
+7 3 V
+7 3 V
+6 4 V
+7 4 V
+6 5 V
+7 4 V
+7 5 V
+6 4 V
+7 4 V
+6 5 V
+7 4 V
+7 3 V
+6 3 V
+7 3 V
+6 2 V
+7 2 V
+7 0 V
+6 1 V
+7 -1 V
+7 -1 V
+6 -2 V
+7 -2 V
+6 -3 V
+7 -3 V
+7 -4 V
+6 -4 V
+7 -5 V
+6 -5 V
+7 -5 V
+7 -4 V
+6 -5 V
+7 -4 V
+6 -4 V
+7 -4 V
+7 -3 V
+6 -2 V
+7 -2 V
+7 -1 V
+6 0 V
+7 1 V
+6 1 V
+7 2 V
+7 3 V
+6 4 V
+7 4 V
+6 5 V
+7 4 V
+7 6 V
+6 5 V
+7 5 V
+7 5 V
+6 4 V
+7 4 V
+6 3 V
+7 3 V
+7 1 V
+6 1 V
+7 -1 V
+6 -1 V
+7 -3 V
+7 -3 V
+6 -4 V
+7 -5 V
+6 -6 V
+7 -6 V
+7 -5 V
+6 -6 V
+7 -6 V
+7 -4 V
+6 -4 V
+7 -3 V
+6 -2 V
+7 0 V
+7 1 V
+6 3 V
+7 4 V
+6 5 V
+7 5 V
+7 7 V
+6 7 V
+7 7 V
+6 6 V
+7 5 V
+7 4 V
+6 3 V
+7 0 V
+7 -2 V
+6 -4 V
+7 -5 V
+6 -8 V
+7 -8 V
+7 -9 V
+6 -8 V
+7 -6 V
+6 -4 V
+7 -2 V
+7 3 V
+6 6 V
+7 9 V
+6 12 V
+7 11 V
+7 10 V
+6 4 V
+7 -3 V
+7 -12 V
+6 -18 V
+7 -17 V
+6 0 V
+7 50 V
+stroke
+grestore
+end
+showpage
+%%Trailer
+%%DocumentFonts: Helvetica
diff --git a/gsl-1.9/doc/cheb.texi b/gsl-1.9/doc/cheb.texi
new file mode 100644
index 0000000..0d97a86
--- /dev/null
+++ b/gsl-1.9/doc/cheb.texi
@@ -0,0 +1,177 @@
+@cindex Chebyshev series
+@cindex fitting, using Chebyshev polynomials
+@cindex interpolation, using Chebyshev polynomials
+
+This chapter describes routines for computing Chebyshev approximations
+to univariate functions. A Chebyshev approximation is a truncation of
+the series @math{f(x) = \sum c_n T_n(x)}, where the Chebyshev
+polynomials @math{T_n(x) = \cos(n \arccos x)} provide an orthogonal
+basis of polynomials on the interval @math{[-1,1]} with the weight
+function @c{$1 / \sqrt{1-x^2}$}
+@math{1 / \sqrt@{1-x^2@}}. The first few Chebyshev polynomials are,
+@math{T_0(x) = 1}, @math{T_1(x) = x}, @math{T_2(x) = 2 x^2 - 1}.
+For further information see Abramowitz & Stegun, Chapter 22.
+
+The functions described in this chapter are declared in the header file
+@file{gsl_chebyshev.h}.
+
+@menu
+* Chebyshev Definitions::
+* Creation and Calculation of Chebyshev Series::
+* Chebyshev Series Evaluation::
+* Derivatives and Integrals::
+* Chebyshev Approximation examples::
+* Chebyshev Approximation References and Further Reading::
+@end menu
+
+@node Chebyshev Definitions
+@section Definitions
+
+A Chebyshev series is stored using the following structure,
+
+@example
+typedef struct
+@{
+ double * c; /* coefficients c[0] .. c[order] */
+ int order; /* order of expansion */
+ double a; /* lower interval point */
+ double b; /* upper interval point */
+ ...
+@} gsl_cheb_series
+@end example
+
+@noindent
+The approximation is made over the range @math{[a,b]} using
+@var{order}+1 terms, including the coefficient @math{c[0]}. The series
+is computed using the following convention,
+@tex
+\beforedisplay
+$$
+f(x) = {c_0 \over 2} + \sum_{n=1} c_n T_n(x)
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+f(x) = (c_0 / 2) + \sum_@{n=1@} c_n T_n(x)
+@end example
+
+@end ifinfo
+@noindent
+which is needed when accessing the coefficients directly.
+
+@node Creation and Calculation of Chebyshev Series
+@section Creation and Calculation of Chebyshev Series
+
+@deftypefun {gsl_cheb_series *} gsl_cheb_alloc (const size_t @var{n})
+This function allocates space for a Chebyshev series of order @var{n}
+and returns a pointer to a new @code{gsl_cheb_series} struct.
+@end deftypefun
+
+@deftypefun void gsl_cheb_free (gsl_cheb_series * @var{cs})
+This function frees a previously allocated Chebyshev series @var{cs}.
+@end deftypefun
+
+@deftypefun int gsl_cheb_init (gsl_cheb_series * @var{cs}, const gsl_function * @var{f}, const double @var{a}, const double @var{b})
+This function computes the Chebyshev approximation @var{cs} for the
+function @var{f} over the range @math{(a,b)} to the previously specified
+order. The computation of the Chebyshev approximation is an
+@math{O(n^2)} process, and requires @math{n} function evaluations.
+@end deftypefun
+
+@node Chebyshev Series Evaluation
+@section Chebyshev Series Evaluation
+
+@deftypefun double gsl_cheb_eval (const gsl_cheb_series * @var{cs}, double @var{x})
+This function evaluates the Chebyshev series @var{cs} at a given point @var{x}.
+@end deftypefun
+
+@deftypefun int gsl_cheb_eval_err (const gsl_cheb_series * @var{cs}, const double @var{x}, double * @var{result}, double * @var{abserr})
+This function computes the Chebyshev series @var{cs} at a given point
+@var{x}, estimating both the series @var{result} and its absolute error
+@var{abserr}. The error estimate is made from the first neglected term
+in the series.
+@end deftypefun
+
+@deftypefun double gsl_cheb_eval_n (const gsl_cheb_series * @var{cs}, size_t @var{order}, double @var{x})
+This function evaluates the Chebyshev series @var{cs} at a given point
+@var{n}, to (at most) the given order @var{order}.
+@end deftypefun
+
+@deftypefun int gsl_cheb_eval_n_err (const gsl_cheb_series * @var{cs}, const size_t @var{order}, const double @var{x}, double * @var{result}, double * @var{abserr})
+This function evaluates a Chebyshev series @var{cs} at a given point
+@var{x}, estimating both the series @var{result} and its absolute error
+@var{abserr}, to (at most) the given order @var{order}. The error
+estimate is made from the first neglected term in the series.
+@end deftypefun
+
+@comment @deftypefun double gsl_cheb_eval_mode (const gsl_cheb_series * @var{cs}, double @var{x}, gsl_mode_t @var{mode})
+@comment @end deftypefun
+
+@comment @deftypefun int gsl_cheb_eval_mode_err (const gsl_cheb_series * @var{cs}, const double @var{x}, gsl_mode_t @var{mode}, double * @var{result}, double * @var{abserr})
+@comment Evaluate a Chebyshev series at a given point, using the default
+@comment order for double precision mode(s) and the single precision
+@comment order for other modes.
+@comment @end deftypefun
+
+
+@node Derivatives and Integrals
+@section Derivatives and Integrals
+
+The following functions allow a Chebyshev series to be differentiated or
+integrated, producing a new Chebyshev series. Note that the error
+estimate produced by evaluating the derivative series will be
+underestimated due to the contribution of higher order terms being
+neglected.
+
+@deftypefun int gsl_cheb_calc_deriv (gsl_cheb_series * @var{deriv}, const gsl_cheb_series * @var{cs})
+This function computes the derivative of the series @var{cs}, storing
+the derivative coefficients in the previously allocated @var{deriv}.
+The two series @var{cs} and @var{deriv} must have been allocated with
+the same order.
+@end deftypefun
+
+@deftypefun int gsl_cheb_calc_integ (gsl_cheb_series * @var{integ}, const gsl_cheb_series * @var{cs})
+This function computes the integral of the series @var{cs}, storing the
+integral coefficients in the previously allocated @var{integ}. The two
+series @var{cs} and @var{integ} must have been allocated with the same
+order. The lower limit of the integration is taken to be the left hand
+end of the range @var{a}.
+@end deftypefun
+
+@node Chebyshev Approximation examples
+@section Examples
+
+The following example program computes Chebyshev approximations to a
+step function. This is an extremely difficult approximation to make,
+due to the discontinuity, and was chosen as an example where
+approximation error is visible. For smooth functions the Chebyshev
+approximation converges extremely rapidly and errors would not be
+visible.
+
+@example
+@verbatiminclude examples/cheb.c
+@end example
+
+@noindent
+The output from the program gives the original function, 10-th order
+approximation and 40-th order approximation, all sampled at intervals of
+0.001 in @math{x}.
+
+@iftex
+@sp 1
+@center @image{cheb,3.4in}
+@end iftex
+
+@node Chebyshev Approximation References and Further Reading
+@section References and Further Reading
+
+The following paper describes the use of Chebyshev series,
+
+@itemize @asis
+@item
+R. Broucke, ``Ten Subroutines for the Manipulation of Chebyshev Series
+[C1] (Algorithm 446)''. @cite{Communications of the ACM} 16(4), 254--256
+(1973)
+@end itemize
diff --git a/gsl-1.9/doc/combination.texi b/gsl-1.9/doc/combination.texi
new file mode 100644
index 0000000..d9ef7e1
--- /dev/null
+++ b/gsl-1.9/doc/combination.texi
@@ -0,0 +1,221 @@
+@cindex combinations
+
+This chapter describes functions for creating and manipulating
+combinations. A combination @math{c} is represented by an array of
+@math{k} integers in the range 0 to @math{n-1}, where each value
+@math{c_i} occurs at most once. The combination @math{c} corresponds to
+indices of @math{k} elements chosen from an @math{n} element vector.
+Combinations are useful for iterating over all @math{k}-element subsets
+of a set.
+
+The functions described in this chapter are defined in the header file
+@file{gsl_combination.h}.
+
+@menu
+* The Combination struct::
+* Combination allocation::
+* Accessing combination elements::
+* Combination properties::
+* Combination functions::
+* Reading and writing combinations::
+* Combination Examples::
+* Combination References and Further Reading::
+@end menu
+
+@node The Combination struct
+@section The Combination struct
+
+A combination is defined by a structure containing three components, the
+values of @math{n} and @math{k}, and a pointer to the combination array.
+The elements of the combination array are all of type @code{size_t}, and
+are stored in increasing order. The @code{gsl_combination} structure
+looks like this,
+
+@example
+typedef struct
+@{
+ size_t n;
+ size_t k;
+ size_t *data;
+@} gsl_combination;
+@end example
+@comment
+
+@noindent
+
+@node Combination allocation
+@section Combination allocation
+
+@deftypefun {gsl_combination *} gsl_combination_alloc (size_t @var{n}, size_t @var{k})
+This function allocates memory for a new combination with parameters
+@var{n}, @var{k}. The combination is not initialized and its elements
+are undefined. Use the function @code{gsl_combination_calloc} if you
+want to create a combination which is initialized to the
+lexicographically first combination. A null pointer is returned if
+insufficient memory is available to create the combination.
+@end deftypefun
+
+@deftypefun {gsl_combination *} gsl_combination_calloc (size_t @var{n}, size_t @var{k})
+This function allocates memory for a new combination with parameters
+@var{n}, @var{k} and initializes it to the lexicographically first
+combination. A null pointer is returned if insufficient memory is
+available to create the combination.
+@end deftypefun
+
+@deftypefun void gsl_combination_init_first (gsl_combination * @var{c})
+This function initializes the combination @var{c} to the
+lexicographically first combination, i.e. @math{(0,1,2,@dots{},k-1)}.
+@end deftypefun
+
+@deftypefun void gsl_combination_init_last (gsl_combination * @var{c})
+This function initializes the combination @var{c} to the
+lexicographically last combination, i.e. @math{(n-k,n-k+1,@dots{},n-1)}.
+@end deftypefun
+
+@deftypefun void gsl_combination_free (gsl_combination * @var{c})
+This function frees all the memory used by the combination @var{c}.
+@end deftypefun
+
+@deftypefun int gsl_combination_memcpy (gsl_combination * @var{dest}, const gsl_combination * @var{src})
+This function copies the elements of the combination @var{src} into the
+combination @var{dest}. The two combinations must have the same size.
+@end deftypefun
+
+
+@node Accessing combination elements
+@section Accessing combination elements
+
+The following function can be used to access the elements of a combination.
+
+@deftypefun size_t gsl_combination_get (const gsl_combination * @var{c}, const size_t @var{i})
+This function returns the value of the @var{i}-th element of the
+combination @var{c}. If @var{i} lies outside the allowed range of 0 to
+@math{@var{k}-1} then the error handler is invoked and 0 is returned.
+@end deftypefun
+
+@node Combination properties
+@section Combination properties
+
+@deftypefun size_t gsl_combination_n (const gsl_combination * @var{c})
+This function returns the range (@math{n}) of the combination @var{c}.
+@end deftypefun
+
+@deftypefun size_t gsl_combination_k (const gsl_combination * @var{c})
+This function returns the number of elements (@math{k}) in the combination @var{c}.
+@end deftypefun
+
+@deftypefun {size_t *} gsl_combination_data (const gsl_combination * @var{c})
+This function returns a pointer to the array of elements in the
+combination @var{c}.
+@end deftypefun
+
+@deftypefun int gsl_combination_valid (gsl_combination * @var{c})
+@cindex checking combination for validity
+@cindex testing combination for validity
+This function checks that the combination @var{c} is valid. The @var{k}
+elements should lie in the range 0 to @math{@var{n}-1}, with each
+value occurring once at most and in increasing order.
+@end deftypefun
+
+@node Combination functions
+@section Combination functions
+
+@deftypefun int gsl_combination_next (gsl_combination * @var{c})
+@cindex iterating through combinations
+This function advances the combination @var{c} to the next combination
+in lexicographic order and returns @code{GSL_SUCCESS}. If no further
+combinations are available it returns @code{GSL_FAILURE} and leaves
+@var{c} unmodified. Starting with the first combination and
+repeatedly applying this function will iterate through all possible
+combinations of a given order.
+@end deftypefun
+
+@deftypefun int gsl_combination_prev (gsl_combination * @var{c})
+This function steps backwards from the combination @var{c} to the
+previous combination in lexicographic order, returning
+@code{GSL_SUCCESS}. If no previous combination is available it returns
+@code{GSL_FAILURE} and leaves @var{c} unmodified.
+@end deftypefun
+
+
+@node Reading and writing combinations
+@section Reading and writing combinations
+
+The library provides functions for reading and writing combinations to a
+file as binary data or formatted text.
+
+@deftypefun int gsl_combination_fwrite (FILE * @var{stream}, const gsl_combination * @var{c})
+This function writes the elements of the combination @var{c} to the
+stream @var{stream} in binary format. The function returns
+@code{GSL_EFAILED} if there was a problem writing to the file. Since the
+data is written in the native binary format it may not be portable
+between different architectures.
+@end deftypefun
+
+@deftypefun int gsl_combination_fread (FILE * @var{stream}, gsl_combination * @var{c})
+This function reads elements from the open stream @var{stream} into the
+combination @var{c} in binary format. The combination @var{c} must be
+preallocated with correct values of @math{n} and @math{k} since the
+function uses the size of @var{c} to determine how many bytes to read.
+The function returns @code{GSL_EFAILED} if there was a problem reading
+from the file. The data is assumed to have been written in the native
+binary format on the same architecture.
+@end deftypefun
+
+@deftypefun int gsl_combination_fprintf (FILE * @var{stream}, const gsl_combination * @var{c}, const char * @var{format})
+This function writes the elements of the combination @var{c}
+line-by-line to the stream @var{stream} using the format specifier
+@var{format}, which should be suitable for a type of @var{size_t}. On a
+GNU system the type modifier @code{Z} represents @code{size_t}, so
+@code{"%Zu\n"} is a suitable format. The function returns
+@code{GSL_EFAILED} if there was a problem writing to the file.
+@end deftypefun
+
+@deftypefun int gsl_combination_fscanf (FILE * @var{stream}, gsl_combination * @var{c})
+This function reads formatted data from the stream @var{stream} into the
+combination @var{c}. The combination @var{c} must be preallocated with
+correct values of @math{n} and @math{k} since the function uses the size of @var{c} to
+determine how many numbers to read. The function returns
+@code{GSL_EFAILED} if there was a problem reading from the file.
+@end deftypefun
+
+
+@node Combination Examples
+@section Examples
+The example program below prints all subsets of the set
+@math{@{0,1,2,3@}} ordered by size. Subsets of the same size are
+ordered lexicographically.
+
+@example
+@verbatiminclude examples/combination.c
+@end example
+
+@noindent
+Here is the output from the program,
+
+@example
+$ ./a.out
+@verbatiminclude examples/combination.out
+@end example
+
+@noindent
+All 16 subsets are generated, and the subsets of each size are sorted
+lexicographically.
+
+
+@node Combination References and Further Reading
+@section References and Further Reading
+
+@noindent
+Further information on combinations can be found in,
+
+@itemize @asis
+@item
+Donald L. Kreher, Douglas R. Stinson, @cite{Combinatorial Algorithms:
+Generation, Enumeration and Search}, 1998, CRC Press LLC, ISBN
+084933988X
+@end itemize
+
+@noindent
+
+
diff --git a/gsl-1.9/doc/complex.texi b/gsl-1.9/doc/complex.texi
new file mode 100644
index 0000000..b84a7ac
--- /dev/null
+++ b/gsl-1.9/doc/complex.texi
@@ -0,0 +1,493 @@
+@cindex complex numbers
+
+The functions described in this chapter provide support for complex
+numbers. The algorithms take care to avoid unnecessary intermediate
+underflows and overflows, allowing the functions to be evaluated over
+as much of the complex plane as possible.
+
+@comment FIXME: this still needs to be
+@comment done for the csc,sec,cot,csch,sech,coth functions
+
+For multiple-valued functions the branch cuts have been chosen to follow
+the conventions of Abramowitz and Stegun in the @cite{Handbook of
+Mathematical Functions}. The functions return principal values which are
+the same as those in GNU Calc, which in turn are the same as those in
+@cite{Common Lisp, The Language (Second Edition)}@footnote{Note that the
+first edition uses different definitions.} and the HP-28/48 series of
+calculators.
+
+The complex types are defined in the header file @file{gsl_complex.h},
+while the corresponding complex functions and arithmetic operations are
+defined in @file{gsl_complex_math.h}.
+
+@menu
+* Complex numbers::
+* Properties of complex numbers::
+* Complex arithmetic operators::
+* Elementary Complex Functions::
+* Complex Trigonometric Functions::
+* Inverse Complex Trigonometric Functions::
+* Complex Hyperbolic Functions::
+* Inverse Complex Hyperbolic Functions::
+* Complex Number References and Further Reading::
+@end menu
+
+@node Complex numbers
+@section Complex numbers
+@cindex representations of complex numbers
+@cindex polar form of complex numbers
+@tpindex gsl_complex
+
+Complex numbers are represented using the type @code{gsl_complex}. The
+internal representation of this type may vary across platforms and
+should not be accessed directly. The functions and macros described
+below allow complex numbers to be manipulated in a portable way.
+
+For reference, the default form of the @code{gsl_complex} type is
+given by the following struct,
+
+@example
+typedef struct
+@{
+ double dat[2];
+@} gsl_complex;
+@end example
+
+@noindent
+The real and imaginary part are stored in contiguous elements of a two
+element array. This eliminates any padding between the real and
+imaginary parts, @code{dat[0]} and @code{dat[1]}, allowing the struct to
+be mapped correctly onto packed complex arrays.
+
+@deftypefun gsl_complex gsl_complex_rect (double @var{x}, double @var{y})
+This function uses the rectangular cartesian components
+(@var{x},@var{y}) to return the complex number @math{z = x + i y}.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_polar (double @var{r}, double @var{theta})
+This function returns the complex number @math{z = r \exp(i \theta) = r
+(\cos(\theta) + i \sin(\theta))} from the polar representation
+(@var{r},@var{theta}).
+@end deftypefun
+
+@defmac GSL_REAL (@var{z})
+@defmacx GSL_IMAG (@var{z})
+These macros return the real and imaginary parts of the complex number
+@var{z}.
+@end defmac
+
+@defmac GSL_SET_COMPLEX (@var{zp}, @var{x}, @var{y})
+This macro uses the cartesian components (@var{x},@var{y}) to set the
+real and imaginary parts of the complex number pointed to by @var{zp}.
+For example,
+
+@example
+GSL_SET_COMPLEX(&z, 3, 4)
+@end example
+
+@noindent
+sets @var{z} to be @math{3 + 4i}.
+@end defmac
+
+@defmac GSL_SET_REAL (@var{zp},@var{x})
+@defmacx GSL_SET_IMAG (@var{zp},@var{y})
+These macros allow the real and imaginary parts of the complex number
+pointed to by @var{zp} to be set independently.
+@end defmac
+
+@node Properties of complex numbers
+@section Properties of complex numbers
+
+@deftypefun double gsl_complex_arg (gsl_complex @var{z})
+@cindex argument of complex number
+This function returns the argument of the complex number @var{z},
+@math{\arg(z)}, where @c{$-\pi < \arg(z) \leq \pi$}
+@math{-\pi < \arg(z) <= \pi}.
+@end deftypefun
+
+@deftypefun double gsl_complex_abs (gsl_complex @var{z})
+@cindex magnitude of complex number
+This function returns the magnitude of the complex number @var{z}, @math{|z|}.
+@end deftypefun
+
+@deftypefun double gsl_complex_abs2 (gsl_complex @var{z})
+This function returns the squared magnitude of the complex number
+@var{z}, @math{|z|^2}.
+@end deftypefun
+
+@deftypefun double gsl_complex_logabs (gsl_complex @var{z})
+This function returns the natural logarithm of the magnitude of the
+complex number @var{z}, @math{\log|z|}. It allows an accurate
+evaluation of @math{\log|z|} when @math{|z|} is close to one. The direct
+evaluation of @code{log(gsl_complex_abs(z))} would lead to a loss of
+precision in this case.
+@end deftypefun
+
+
+@node Complex arithmetic operators
+@section Complex arithmetic operators
+@cindex complex arithmetic
+
+@deftypefun gsl_complex gsl_complex_add (gsl_complex @var{a}, gsl_complex @var{b})
+This function returns the sum of the complex numbers @var{a} and
+@var{b}, @math{z=a+b}.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_sub (gsl_complex @var{a}, gsl_complex @var{b})
+This function returns the difference of the complex numbers @var{a} and
+@var{b}, @math{z=a-b}.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_mul (gsl_complex @var{a}, gsl_complex @var{b})
+This function returns the product of the complex numbers @var{a} and
+@var{b}, @math{z=ab}.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_div (gsl_complex @var{a}, gsl_complex @var{b})
+This function returns the quotient of the complex numbers @var{a} and
+@var{b}, @math{z=a/b}.
+@end deftypefun
+
+
+@deftypefun gsl_complex gsl_complex_add_real (gsl_complex @var{a}, double @var{x})
+This function returns the sum of the complex number @var{a} and the
+real number @var{x}, @math{z=a+x}.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_sub_real (gsl_complex @var{a}, double @var{x})
+This function returns the difference of the complex number @var{a} and the
+real number @var{x}, @math{z=a-x}.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_mul_real (gsl_complex @var{a}, double @var{x})
+This function returns the product of the complex number @var{a} and the
+real number @var{x}, @math{z=ax}.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_div_real (gsl_complex @var{a}, double @var{x})
+This function returns the quotient of the complex number @var{a} and the
+real number @var{x}, @math{z=a/x}.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_add_imag (gsl_complex @var{a}, double @var{y})
+This function returns the sum of the complex number @var{a} and the
+imaginary number @math{i}@var{y}, @math{z=a+iy}.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_sub_imag (gsl_complex @var{a}, double @var{y})
+This function returns the difference of the complex number @var{a} and the
+imaginary number @math{i}@var{y}, @math{z=a-iy}.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_mul_imag (gsl_complex @var{a}, double @var{y})
+This function returns the product of the complex number @var{a} and the
+imaginary number @math{i}@var{y}, @math{z=a*(iy)}.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_div_imag (gsl_complex @var{a}, double @var{y})
+This function returns the quotient of the complex number @var{a} and the
+imaginary number @math{i}@var{y}, @math{z=a/(iy)}.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_conjugate (gsl_complex @var{z})
+@cindex conjugate of complex number
+This function returns the complex conjugate of the complex number
+@var{z}, @math{z^* = x - i y}.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_inverse (gsl_complex @var{z})
+This function returns the inverse, or reciprocal, of the complex number
+@var{z}, @math{1/z = (x - i y)/(x^2 + y^2)}.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_negative (gsl_complex @var{z})
+This function returns the negative of the complex number
+@var{z}, @math{-z = (-x) + i(-y)}.
+@end deftypefun
+
+
+@node Elementary Complex Functions
+@section Elementary Complex Functions
+
+@deftypefun gsl_complex gsl_complex_sqrt (gsl_complex @var{z})
+@cindex square root of complex number
+This function returns the square root of the complex number @var{z},
+@math{\sqrt z}. The branch cut is the negative real axis. The result
+always lies in the right half of the complex plane.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_sqrt_real (double @var{x})
+This function returns the complex square root of the real number
+@var{x}, where @var{x} may be negative.
+@end deftypefun
+
+
+@deftypefun gsl_complex gsl_complex_pow (gsl_complex @var{z}, gsl_complex @var{a})
+@cindex power of complex number
+@cindex exponentiation of complex number
+The function returns the complex number @var{z} raised to the complex
+power @var{a}, @math{z^a}. This is computed as @math{\exp(\log(z)*a)}
+using complex logarithms and complex exponentials.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_pow_real (gsl_complex @var{z}, double @var{x})
+This function returns the complex number @var{z} raised to the real
+power @var{x}, @math{z^x}.
+@end deftypefun
+
+
+@deftypefun gsl_complex gsl_complex_exp (gsl_complex @var{z})
+This function returns the complex exponential of the complex number
+@var{z}, @math{\exp(z)}.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_log (gsl_complex @var{z})
+@cindex logarithm of complex number
+This function returns the complex natural logarithm (base @math{e}) of
+the complex number @var{z}, @math{\log(z)}. The branch cut is the
+negative real axis.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_log10 (gsl_complex @var{z})
+This function returns the complex base-10 logarithm of
+the complex number @var{z}, @c{$\log_{10}(z)$}
+@math{\log_10 (z)}.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_log_b (gsl_complex @var{z}, gsl_complex @var{b})
+This function returns the complex base-@var{b} logarithm of the complex
+number @var{z}, @math{\log_b(z)}. This quantity is computed as the ratio
+@math{\log(z)/\log(b)}.
+@end deftypefun
+
+
+@node Complex Trigonometric Functions
+@section Complex Trigonometric Functions
+@cindex trigonometric functions of complex numbers
+
+@deftypefun gsl_complex gsl_complex_sin (gsl_complex @var{z})
+@cindex sin, of complex number
+This function returns the complex sine of the complex number @var{z},
+@math{\sin(z) = (\exp(iz) - \exp(-iz))/(2i)}.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_cos (gsl_complex @var{z})
+@cindex cosine of complex number
+This function returns the complex cosine of the complex number @var{z},
+@math{\cos(z) = (\exp(iz) + \exp(-iz))/2}.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_tan (gsl_complex @var{z})
+@cindex tangent of complex number
+This function returns the complex tangent of the complex number @var{z},
+@math{\tan(z) = \sin(z)/\cos(z)}.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_sec (gsl_complex @var{z})
+This function returns the complex secant of the complex number @var{z},
+@math{\sec(z) = 1/\cos(z)}.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_csc (gsl_complex @var{z})
+This function returns the complex cosecant of the complex number @var{z},
+@math{\csc(z) = 1/\sin(z)}.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_cot (gsl_complex @var{z})
+This function returns the complex cotangent of the complex number @var{z},
+@math{\cot(z) = 1/\tan(z)}.
+@end deftypefun
+
+
+@node Inverse Complex Trigonometric Functions
+@section Inverse Complex Trigonometric Functions
+@cindex inverse complex trigonometric functions
+
+@deftypefun gsl_complex gsl_complex_arcsin (gsl_complex @var{z})
+This function returns the complex arcsine of the complex number @var{z},
+@math{\arcsin(z)}. The branch cuts are on the real axis, less than @math{-1}
+and greater than @math{1}.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_arcsin_real (double @var{z})
+This function returns the complex arcsine of the real number @var{z},
+@math{\arcsin(z)}. For @math{z} between @math{-1} and @math{1}, the
+function returns a real value in the range @math{[-\pi/2,\pi/2]}. For
+@math{z} less than @math{-1} the result has a real part of @math{-\pi/2}
+and a positive imaginary part. For @math{z} greater than @math{1} the
+result has a real part of @math{\pi/2} and a negative imaginary part.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_arccos (gsl_complex @var{z})
+This function returns the complex arccosine of the complex number @var{z},
+@math{\arccos(z)}. The branch cuts are on the real axis, less than @math{-1}
+and greater than @math{1}.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_arccos_real (double @var{z})
+This function returns the complex arccosine of the real number @var{z},
+@math{\arccos(z)}. For @math{z} between @math{-1} and @math{1}, the
+function returns a real value in the range @math{[0,\pi]}. For @math{z}
+less than @math{-1} the result has a real part of @math{\pi} and a
+negative imaginary part. For @math{z} greater than @math{1} the result
+is purely imaginary and positive.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_arctan (gsl_complex @var{z})
+This function returns the complex arctangent of the complex number
+@var{z}, @math{\arctan(z)}. The branch cuts are on the imaginary axis,
+below @math{-i} and above @math{i}.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_arcsec (gsl_complex @var{z})
+This function returns the complex arcsecant of the complex number @var{z},
+@math{\arcsec(z) = \arccos(1/z)}.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_arcsec_real (double @var{z})
+This function returns the complex arcsecant of the real number @var{z},
+@math{\arcsec(z) = \arccos(1/z)}.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_arccsc (gsl_complex @var{z})
+This function returns the complex arccosecant of the complex number @var{z},
+@math{\arccsc(z) = \arcsin(1/z)}.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_arccsc_real (double @var{z})
+This function returns the complex arccosecant of the real number @var{z},
+@math{\arccsc(z) = \arcsin(1/z)}.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_arccot (gsl_complex @var{z})
+This function returns the complex arccotangent of the complex number @var{z},
+@math{\arccot(z) = \arctan(1/z)}.
+@end deftypefun
+
+
+@node Complex Hyperbolic Functions
+@section Complex Hyperbolic Functions
+@cindex hyperbolic functions, complex numbers
+
+@deftypefun gsl_complex gsl_complex_sinh (gsl_complex @var{z})
+This function returns the complex hyperbolic sine of the complex number
+@var{z}, @math{\sinh(z) = (\exp(z) - \exp(-z))/2}.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_cosh (gsl_complex @var{z})
+This function returns the complex hyperbolic cosine of the complex number
+@var{z}, @math{\cosh(z) = (\exp(z) + \exp(-z))/2}.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_tanh (gsl_complex @var{z})
+This function returns the complex hyperbolic tangent of the complex number
+@var{z}, @math{\tanh(z) = \sinh(z)/\cosh(z)}.
+@end deftypefun
+
+
+@deftypefun gsl_complex gsl_complex_sech (gsl_complex @var{z})
+This function returns the complex hyperbolic secant of the complex
+number @var{z}, @math{\sech(z) = 1/\cosh(z)}.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_csch (gsl_complex @var{z})
+This function returns the complex hyperbolic cosecant of the complex
+number @var{z}, @math{\csch(z) = 1/\sinh(z)}.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_coth (gsl_complex @var{z})
+This function returns the complex hyperbolic cotangent of the complex
+number @var{z}, @math{\coth(z) = 1/\tanh(z)}.
+@end deftypefun
+
+
+@node Inverse Complex Hyperbolic Functions
+@section Inverse Complex Hyperbolic Functions
+@cindex inverse hyperbolic functions, complex numbers
+
+@deftypefun gsl_complex gsl_complex_arcsinh (gsl_complex @var{z})
+This function returns the complex hyperbolic arcsine of the
+complex number @var{z}, @math{\arcsinh(z)}. The branch cuts are on the
+imaginary axis, below @math{-i} and above @math{i}.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_arccosh (gsl_complex @var{z})
+This function returns the complex hyperbolic arccosine of the complex
+number @var{z}, @math{\arccosh(z)}. The branch cut is on the real
+axis, less than @math{1}. Note that in this case we use the negative
+square root in formula 4.6.21 of Abramowitz & Stegun giving
+@c{$\arccosh(z)=\log(z-\sqrt{z^2-1})$}
+@math{\arccosh(z)=\log(z-\sqrt@{z^2-1@})}.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_arccosh_real (double @var{z})
+This function returns the complex hyperbolic arccosine of
+the real number @var{z}, @math{\arccosh(z)}.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_arctanh (gsl_complex @var{z})
+This function returns the complex hyperbolic arctangent of the complex
+number @var{z}, @math{\arctanh(z)}. The branch cuts are on the real
+axis, less than @math{-1} and greater than @math{1}.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_arctanh_real (double @var{z})
+This function returns the complex hyperbolic arctangent of the real
+number @var{z}, @math{\arctanh(z)}.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_arcsech (gsl_complex @var{z})
+This function returns the complex hyperbolic arcsecant of the complex
+number @var{z}, @math{\arcsech(z) = \arccosh(1/z)}.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_arccsch (gsl_complex @var{z})
+This function returns the complex hyperbolic arccosecant of the complex
+number @var{z}, @math{\arccsch(z) = \arcsin(1/z)}.
+@end deftypefun
+
+@deftypefun gsl_complex gsl_complex_arccoth (gsl_complex @var{z})
+This function returns the complex hyperbolic arccotangent of the complex
+number @var{z}, @math{\arccoth(z) = \arctanh(1/z)}.
+@end deftypefun
+
+@node Complex Number References and Further Reading
+@section References and Further Reading
+
+The implementations of the elementary and trigonometric functions are
+based on the following papers,
+
+@itemize @asis
+@item
+T. E. Hull, Thomas F. Fairgrieve, Ping Tak Peter Tang,
+``Implementing Complex Elementary Functions Using Exception
+Handling'', @cite{ACM Transactions on Mathematical Software}, Volume 20
+(1994), pp 215--244, Corrigenda, p553
+
+@item
+T. E. Hull, Thomas F. Fairgrieve, Ping Tak Peter Tang,
+``Implementing the complex arcsin and arccosine functions using exception
+handling'', @cite{ACM Transactions on Mathematical Software}, Volume 23
+(1997) pp 299--335
+@end itemize
+
+@noindent
+The general formulas and details of branch cuts can be found in the
+following books,
+
+@itemize @asis
+@item
+Abramowitz and Stegun, @cite{Handbook of Mathematical Functions},
+``Circular Functions in Terms of Real and Imaginary Parts'', Formulas
+4.3.55--58,
+``Inverse Circular Functions in Terms of Real and Imaginary Parts'',
+Formulas 4.4.37--39,
+``Hyperbolic Functions in Terms of Real and Imaginary Parts'',
+Formulas 4.5.49--52,
+``Inverse Hyperbolic Functions---relation to Inverse Circular Functions'',
+Formulas 4.6.14--19.
+
+@item
+Dave Gillespie, @cite{Calc Manual}, Free Software Foundation, ISBN
+1-882114-18-3
+@end itemize
diff --git a/gsl-1.9/doc/const.texi b/gsl-1.9/doc/const.texi
new file mode 100644
index 0000000..aed2935
--- /dev/null
+++ b/gsl-1.9/doc/const.texi
@@ -0,0 +1,575 @@
+@cindex physical constants
+@cindex constants, physical
+@cindex conversion of units
+@cindex units, conversion of
+This chapter describes macros for the values of physical constants, such
+as the speed of light, @math{c}, and gravitational constant, @math{G}.
+The values are available in different unit systems, including the
+standard MKSA system (meters, kilograms, seconds, amperes) and the CGSM
+system (centimeters, grams, seconds, gauss), which is commonly used in
+Astronomy.
+
+The definitions of constants in the MKSA system are available in the file
+@file{gsl_const_mksa.h}. The constants in the CGSM system are defined in
+@file{gsl_const_cgsm.h}. Dimensionless constants, such as the fine
+structure constant, which are pure numbers are defined in
+@file{gsl_const_num.h}.
+
+@menu
+* Fundamental Constants::
+* Astronomy and Astrophysics::
+* Atomic and Nuclear Physics::
+* Measurement of Time::
+* Imperial Units ::
+* Speed and Nautical Units::
+* Printers Units::
+* Volume Area and Length::
+* Mass and Weight ::
+* Thermal Energy and Power::
+* Pressure::
+* Viscosity::
+* Light and Illumination::
+* Radioactivity::
+* Force and Energy::
+* Prefixes::
+* Physical Constant Examples::
+* Physical Constant References and Further Reading::
+@end menu
+
+The full list of constants is described briefly below. Consult the
+header files themselves for the values of the constants used in the
+library.
+
+@node Fundamental Constants
+@section Fundamental Constants
+@cindex fundamental constants
+@cindex constants, fundamental
+@table @code
+@item GSL_CONST_MKSA_SPEED_OF_LIGHT
+The speed of light in vacuum, @math{c}.
+
+@item GSL_CONST_MKSA_VACUUM_PERMEABILITY
+The permeability of free space, @math{\mu_0}. This constant is defined
+in the MKSA system only.
+
+@item GSL_CONST_MKSA_VACUUM_PERMITTIVITY
+The permittivity of free space, @math{\epsilon_0}. This constant is
+defined in the MKSA system only.
+
+@item GSL_CONST_MKSA_PLANCKS_CONSTANT_H
+Planck's constant, @math{h}.
+
+@item GSL_CONST_MKSA_PLANCKS_CONSTANT_HBAR
+Planck's constant divided by @math{2\pi}, @math{\hbar}.
+
+@item GSL_CONST_NUM_AVOGADRO
+Avogadro's number, @math{N_a}.
+
+@item GSL_CONST_MKSA_FARADAY
+The molar charge of 1 Faraday.
+
+@item GSL_CONST_MKSA_BOLTZMANN
+The Boltzmann constant, @math{k}.
+
+@item GSL_CONST_MKSA_MOLAR_GAS
+The molar gas constant, @math{R_0}.
+
+@item GSL_CONST_MKSA_STANDARD_GAS_VOLUME
+The standard gas volume, @math{V_0}.
+
+@item GSL_CONST_MKSA_STEFAN_BOLTZMANN_CONSTANT
+The Stefan-Boltzmann radiation constant, @math{\sigma}.
+
+@item GSL_CONST_MKSA_GAUSS
+The magnetic field of 1 Gauss.
+@end table
+
+@node Astronomy and Astrophysics
+@section Astronomy and Astrophysics
+@cindex astronomical constants
+@table @code
+@item GSL_CONST_MKSA_ASTRONOMICAL_UNIT
+The length of 1 astronomical unit (mean earth-sun distance), @math{au}.
+
+@item GSL_CONST_MKSA_GRAVITATIONAL_CONSTANT
+The gravitational constant, @math{G}.
+
+@item GSL_CONST_MKSA_LIGHT_YEAR
+The distance of 1 light-year, @math{ly}.
+
+@item GSL_CONST_MKSA_PARSEC
+The distance of 1 parsec, @math{pc}.
+
+@item GSL_CONST_MKSA_GRAV_ACCEL
+The standard gravitational acceleration on Earth, @math{g}.
+
+@item GSL_CONST_MKSA_SOLAR_MASS
+The mass of the Sun.
+@end table
+
+@node Atomic and Nuclear Physics
+@section Atomic and Nuclear Physics
+@cindex atomic physics, constants
+@cindex nuclear physics, constants
+@table @code
+@item GSL_CONST_MKSA_ELECTRON_CHARGE
+The charge of the electron, @math{e}.
+
+@item GSL_CONST_MKSA_ELECTRON_VOLT
+The energy of 1 electron volt, @math{eV}.
+
+@item GSL_CONST_MKSA_UNIFIED_ATOMIC_MASS
+The unified atomic mass, @math{amu}.
+
+@item GSL_CONST_MKSA_MASS_ELECTRON
+The mass of the electron, @math{m_e}.
+
+@item GSL_CONST_MKSA_MASS_MUON
+The mass of the muon, @math{m_\mu}.
+
+@item GSL_CONST_MKSA_MASS_PROTON
+The mass of the proton, @math{m_p}.
+
+@item GSL_CONST_MKSA_MASS_NEUTRON
+The mass of the neutron, @math{m_n}.
+
+@item GSL_CONST_NUM_FINE_STRUCTURE
+The electromagnetic fine structure constant @math{\alpha}.
+
+@item GSL_CONST_MKSA_RYDBERG
+The Rydberg constant, @math{Ry}, in units of energy. This is related to
+the Rydberg inverse wavelength @math{R} by @math{Ry = h c R}.
+
+@item GSL_CONST_MKSA_BOHR_RADIUS
+The Bohr radius, @math{a_0}.
+
+@item GSL_CONST_MKSA_ANGSTROM
+The length of 1 angstrom.
+
+@item GSL_CONST_MKSA_BARN
+The area of 1 barn.
+
+@item GSL_CONST_MKSA_BOHR_MAGNETON
+The Bohr Magneton, @math{\mu_B}.
+
+@item GSL_CONST_MKSA_NUCLEAR_MAGNETON
+The Nuclear Magneton, @math{\mu_N}.
+
+@item GSL_CONST_MKSA_ELECTRON_MAGNETIC_MOMENT
+The absolute value of the magnetic moment of the electron, @math{\mu_e}.
+The physical magnetic moment of the electron is negative.
+
+@item GSL_CONST_MKSA_PROTON_MAGNETIC_MOMENT
+The magnetic moment of the proton, @math{\mu_p}.
+
+@item GSL_CONST_MKSA_THOMSON_CROSS_SECTION
+The Thomson cross section, @math{\sigma_T}.
+
+@item GSL_CONST_MKSA_DEBYE
+The electric dipole moment of 1 Debye, @math{D}.
+@end table
+
+
+@node Measurement of Time
+@section Measurement of Time
+@cindex time units
+@table @code
+@item GSL_CONST_MKSA_MINUTE
+The number of seconds in 1 minute.
+
+@item GSL_CONST_MKSA_HOUR
+The number of seconds in 1 hour.
+
+@item GSL_CONST_MKSA_DAY
+The number of seconds in 1 day.
+
+@item GSL_CONST_MKSA_WEEK
+The number of seconds in 1 week.
+@end table
+
+
+@node Imperial Units
+@section Imperial Units
+@cindex imperial units
+@cindex units, imperial
+@table @code
+@item GSL_CONST_MKSA_INCH
+The length of 1 inch.
+
+@item GSL_CONST_MKSA_FOOT
+The length of 1 foot.
+
+@item GSL_CONST_MKSA_YARD
+The length of 1 yard.
+
+@item GSL_CONST_MKSA_MILE
+The length of 1 mile.
+
+@item GSL_CONST_MKSA_MIL
+The length of 1 mil (1/1000th of an inch).
+@end table
+
+
+@node Speed and Nautical Units
+@section Speed and Nautical Units
+@cindex nautical units
+
+@table @code
+@item GSL_CONST_MKSA_KILOMETERS_PER_HOUR
+The speed of 1 kilometer per hour.
+
+@item GSL_CONST_MKSA_MILES_PER_HOUR
+The speed of 1 mile per hour.
+
+@item GSL_CONST_MKSA_NAUTICAL_MILE
+The length of 1 nautical mile.
+
+@item GSL_CONST_MKSA_FATHOM
+The length of 1 fathom.
+
+@item GSL_CONST_MKSA_KNOT
+The speed of 1 knot.
+@end table
+
+
+@node Printers Units
+@section Printers Units
+@cindex printers units
+
+@table @code
+@item GSL_CONST_MKSA_POINT
+The length of 1 printer's point (1/72 inch).
+
+@item GSL_CONST_MKSA_TEXPOINT
+The length of 1 TeX point (1/72.27 inch).
+@end table
+
+
+@node Volume Area and Length
+@section Volume, Area and Length
+@cindex volume units
+
+@table @code
+@item GSL_CONST_MKSA_MICRON
+The length of 1 micron.
+
+@item GSL_CONST_MKSA_HECTARE
+The area of 1 hectare.
+
+@item GSL_CONST_MKSA_ACRE
+The area of 1 acre.
+
+@item GSL_CONST_MKSA_LITER
+The volume of 1 liter.
+
+@item GSL_CONST_MKSA_US_GALLON
+The volume of 1 US gallon.
+
+@item GSL_CONST_MKSA_CANADIAN_GALLON
+The volume of 1 Canadian gallon.
+
+@item GSL_CONST_MKSA_UK_GALLON
+The volume of 1 UK gallon.
+
+@item GSL_CONST_MKSA_QUART
+The volume of 1 quart.
+
+@item GSL_CONST_MKSA_PINT
+The volume of 1 pint.
+@end table
+
+
+@comment @node Cookery
+@comment @section Cookery
+@comment @commentindex cookery units
+
+@comment @table @commentode
+@comment @item GSL_CONST_MKSA_CUP
+@comment The volume of 1 cup.
+
+@comment @item GSL_CONST_MKSA_FLUID_OUNCE
+@comment The volume of 1 fluid ounce.
+
+@comment @item GSL_CONST_MKSA_TABLESPOON
+@comment The volume of 1 tablespoon.
+
+@comment @item GSL_CONST_MKSA_TEASPOON
+@comment The volume of 1 teaspoon.
+@comment @end table
+
+
+@node Mass and Weight
+@section Mass and Weight
+@cindex mass, units of
+@cindex weight, units of
+@table @code
+@item GSL_CONST_MKSA_POUND_MASS
+The mass of 1 pound.
+
+@item GSL_CONST_MKSA_OUNCE_MASS
+The mass of 1 ounce.
+
+@item GSL_CONST_MKSA_TON
+The mass of 1 ton.
+
+@item GSL_CONST_MKSA_METRIC_TON
+The mass of 1 metric ton (1000 kg).
+
+@item GSL_CONST_MKSA_UK_TON
+The mass of 1 UK ton.
+
+@item GSL_CONST_MKSA_TROY_OUNCE
+The mass of 1 troy ounce.
+
+@item GSL_CONST_MKSA_CARAT
+The mass of 1 carat.
+
+@item GSL_CONST_MKSA_GRAM_FORCE
+The force of 1 gram weight.
+
+@item GSL_CONST_MKSA_POUND_FORCE
+The force of 1 pound weight.
+
+@item GSL_CONST_MKSA_KILOPOUND_FORCE
+The force of 1 kilopound weight.
+
+@item GSL_CONST_MKSA_POUNDAL
+The force of 1 poundal.
+@end table
+
+
+@node Thermal Energy and Power
+@section Thermal Energy and Power
+@cindex energy, units of
+@cindex power, units of
+@cindex thermal energy, units of
+@table @code
+@item GSL_CONST_MKSA_CALORIE
+The energy of 1 calorie.
+
+@item GSL_CONST_MKSA_BTU
+The energy of 1 British Thermal Unit, @math{btu}.
+
+@item GSL_CONST_MKSA_THERM
+The energy of 1 Therm.
+
+@item GSL_CONST_MKSA_HORSEPOWER
+The power of 1 horsepower.
+@end table
+
+
+@node Pressure
+@section Pressure
+@cindex pressure, units of
+@table @code
+@item GSL_CONST_MKSA_BAR
+The pressure of 1 bar.
+
+@item GSL_CONST_MKSA_STD_ATMOSPHERE
+The pressure of 1 standard atmosphere.
+
+@item GSL_CONST_MKSA_TORR
+The pressure of 1 torr.
+
+@item GSL_CONST_MKSA_METER_OF_MERCURY
+The pressure of 1 meter of mercury.
+
+@item GSL_CONST_MKSA_INCH_OF_MERCURY
+The pressure of 1 inch of mercury.
+
+@item GSL_CONST_MKSA_INCH_OF_WATER
+The pressure of 1 inch of water.
+
+@item GSL_CONST_MKSA_PSI
+The pressure of 1 pound per square inch.
+@end table
+
+@node Viscosity
+@section Viscosity
+@cindex viscosity, units of
+@table @code
+@item GSL_CONST_MKSA_POISE
+The dynamic viscosity of 1 poise.
+
+@item GSL_CONST_MKSA_STOKES
+The kinematic viscosity of 1 stokes.
+@end table
+
+
+@node Light and Illumination
+@section Light and Illumination
+@cindex light, units of
+@cindex illumination, units of
+
+@table @code
+@item GSL_CONST_MKSA_STILB
+The luminance of 1 stilb.
+
+@item GSL_CONST_MKSA_LUMEN
+The luminous flux of 1 lumen.
+
+@item GSL_CONST_MKSA_LUX
+The illuminance of 1 lux.
+
+@item GSL_CONST_MKSA_PHOT
+The illuminance of 1 phot.
+
+@item GSL_CONST_MKSA_FOOTCANDLE
+The illuminance of 1 footcandle.
+
+@item GSL_CONST_MKSA_LAMBERT
+The luminance of 1 lambert.
+
+@item GSL_CONST_MKSA_FOOTLAMBERT
+The luminance of 1 footlambert.
+@end table
+
+
+@node Radioactivity
+@section Radioactivity
+@cindex radioactivity, units of
+@table @code
+@item GSL_CONST_MKSA_CURIE
+The activity of 1 curie.
+
+@item GSL_CONST_MKSA_ROENTGEN
+The exposure of 1 roentgen.
+
+@item GSL_CONST_MKSA_RAD
+The absorbed dose of 1 rad.
+@end table
+
+
+@node Force and Energy
+@section Force and Energy
+@cindex force and energy, units of
+@table @code
+@item GSL_CONST_MKSA_NEWTON
+The SI unit of force, 1 Newton.
+
+@item GSL_CONST_MKSA_DYNE
+The force of 1 Dyne = @c{$10^{-5}$}
+@math{10^-5} Newton.
+
+@item GSL_CONST_MKSA_JOULE
+The SI unit of energy, 1 Joule.
+
+@item GSL_CONST_MKSA_ERG
+The energy 1 erg = @c{$10^{-7}$}
+@math{10^-7} Joule.
+@end table
+
+
+@node Prefixes
+@section Prefixes
+@cindex prefixes
+@cindex constants, prefixes
+
+These constants are dimensionless scaling factors.
+
+@table @code
+@item GSL_CONST_NUM_YOTTA
+@c{$10^{24}$}
+@math{10^24}
+
+@item GSL_CONST_NUM_ZETTA
+@c{$10^{21}$}
+@math{10^21}
+
+@item GSL_CONST_NUM_EXA
+@c{$10^{18}$}
+@math{10^18}
+
+@item GSL_CONST_NUM_PETA
+@c{$10^{15}$}
+@math{10^15}
+
+@item GSL_CONST_NUM_TERA
+@c{$10^{12}$}
+@math{10^12}
+
+@item GSL_CONST_NUM_GIGA
+@math{10^9}
+
+@item GSL_CONST_NUM_MEGA
+@math{10^6}
+
+@item GSL_CONST_NUM_KILO
+@math{10^3}
+
+@item GSL_CONST_NUM_MILLI
+@c{$10^{-3}$}
+@math{10^-3}
+
+@item GSL_CONST_NUM_MICRO
+@c{$10^{-6}$}
+@math{10^-6}
+
+@item GSL_CONST_NUM_NANO
+@c{$10^{-9}$}
+@math{10^-9}
+
+@item GSL_CONST_NUM_PICO
+@c{$10^{-12}$}
+@math{10^-12}
+
+@item GSL_CONST_NUM_FEMTO
+@c{$10^{-15}$}
+@math{10^-15}
+
+@item GSL_CONST_NUM_ATTO
+@c{$10^{-18}$}
+@math{10^-18}
+
+@item GSL_CONST_NUM_ZEPTO
+@c{$10^{-21}$}
+@math{10^-21}
+
+@item GSL_CONST_NUM_YOCTO
+@c{$10^{-24}$}
+@math{10^-24}
+@end table
+
+@node Physical Constant Examples
+@section Examples
+
+The following program demonstrates the use of the physical constants in
+a calculation. In this case, the goal is to calculate the range of
+light-travel times from Earth to Mars.
+
+The required data is the average distance of each planet from the Sun in
+astronomical units (the eccentricities and inclinations of the orbits
+will be neglected for the purposes of this calculation). The average
+radius of the orbit of Mars is 1.52 astronomical units, and for the
+orbit of Earth it is 1 astronomical unit (by definition). These values
+are combined with the MKSA values of the constants for the speed of
+light and the length of an astronomical unit to produce a result for the
+shortest and longest light-travel times in seconds. The figures are
+converted into minutes before being displayed.
+
+@example
+@verbatiminclude examples/const.c
+@end example
+
+@noindent
+Here is the output from the program,
+
+@example
+@verbatiminclude examples/const.out
+@end example
+
+@node Physical Constant References and Further Reading
+@section References and Further Reading
+
+The authoritative sources for physical constants are the 2002 CODATA
+recommended values, published in the articles below. Further information
+on the values of physical constants is also available from the cited
+articles and the NIST website.
+
+@itemize @asis
+@item Journal of Physical and Chemical Reference Data, 28(6), 1713-1852, 1999
+@item Reviews of Modern Physics, 72(2), 351-495, 2000
+@item @uref{http://www.physics.nist.gov/cuu/Constants/index.html}
+@item @uref{http://physics.nist.gov/Pubs/SP811/appenB9.html}
+@end itemize
+
diff --git a/gsl-1.9/doc/debug.texi b/gsl-1.9/doc/debug.texi
new file mode 100644
index 0000000..2cf0065
--- /dev/null
+++ b/gsl-1.9/doc/debug.texi
@@ -0,0 +1,389 @@
+This chapter describes some tips and tricks for debugging numerical
+programs which use GSL.
+
+@menu
+* Using gdb::
+* Examining floating point registers::
+* Handling floating point exceptions::
+* GCC warning options for numerical programs::
+* Debugging References::
+@end menu
+
+@node Using gdb
+@section Using gdb
+@cindex gdb
+@cindex debugging numerical programs
+@cindex breakpoints
+Any errors reported by the library are passed to the function
+@code{gsl_error}. By running your programs under gdb and setting a
+breakpoint in this function you can automatically catch any library
+errors. You can add a breakpoint for every session by putting
+
+@example
+break gsl_error
+@end example
+@comment
+
+@noindent
+into your @file{.gdbinit} file in the directory where your program is
+started.
+
+If the breakpoint catches an error then you can use a backtrace
+(@code{bt}) to see the call-tree, and the arguments which possibly
+caused the error. By moving up into the calling function you can
+investigate the values of variables at that point. Here is an example
+from the program @code{fft/test_trap}, which contains the following
+line,
+
+@smallexample
+status = gsl_fft_complex_wavetable_alloc (0, &complex_wavetable);
+@end smallexample
+
+@noindent
+The function @code{gsl_fft_complex_wavetable_alloc} takes the length of
+an FFT as its first argument. When this line is executed an error will
+be generated because the length of an FFT is not allowed to be zero.
+
+To debug this problem we start @code{gdb}, using the file
+@file{.gdbinit} to define a breakpoint in @code{gsl_error},
+
+@smallexample
+$ gdb test_trap
+
+GDB is free software and you are welcome to distribute copies
+of it under certain conditions; type "show copying" to see
+the conditions. There is absolutely no warranty for GDB;
+type "show warranty" for details. GDB 4.16 (i586-debian-linux),
+Copyright 1996 Free Software Foundation, Inc.
+
+Breakpoint 1 at 0x8050b1e: file error.c, line 14.
+@end smallexample
+
+@noindent
+When we run the program this breakpoint catches the error and shows the
+reason for it.
+
+@smallexample
+(gdb) run
+Starting program: test_trap
+
+Breakpoint 1, gsl_error (reason=0x8052b0d
+ "length n must be positive integer",
+ file=0x8052b04 "c_init.c", line=108, gsl_errno=1)
+ at error.c:14
+14 if (gsl_error_handler)
+@end smallexample
+@comment
+
+@noindent
+The first argument of @code{gsl_error} is always a string describing the
+error. Now we can look at the backtrace to see what caused the problem,
+
+@smallexample
+(gdb) bt
+#0 gsl_error (reason=0x8052b0d
+ "length n must be positive integer",
+ file=0x8052b04 "c_init.c", line=108, gsl_errno=1)
+ at error.c:14
+#1 0x8049376 in gsl_fft_complex_wavetable_alloc (n=0,
+ wavetable=0xbffff778) at c_init.c:108
+#2 0x8048a00 in main (argc=1, argv=0xbffff9bc)
+ at test_trap.c:94
+#3 0x80488be in ___crt_dummy__ ()
+@end smallexample
+@comment
+
+@noindent
+We can see that the error was generated in the function
+@code{gsl_fft_complex_wavetable_alloc} when it was called with an
+argument of @var{n=0}. The original call came from line 94 in the
+file @file{test_trap.c}.
+
+By moving up to the level of the original call we can find the line that
+caused the error,
+
+@smallexample
+(gdb) up
+#1 0x8049376 in gsl_fft_complex_wavetable_alloc (n=0,
+ wavetable=0xbffff778) at c_init.c:108
+108 GSL_ERROR ("length n must be positive integer", GSL_EDOM);
+(gdb) up
+#2 0x8048a00 in main (argc=1, argv=0xbffff9bc)
+ at test_trap.c:94
+94 status = gsl_fft_complex_wavetable_alloc (0,
+ &complex_wavetable);
+@end smallexample
+@comment
+
+@noindent
+Thus we have found the line that caused the problem. From this point we
+could also print out the values of other variables such as
+@code{complex_wavetable}.
+
+@node Examining floating point registers
+@section Examining floating point registers
+
+The contents of floating point registers can be examined using the
+command @code{info float} (on supported platforms).
+
+@smallexample
+(gdb) info float
+ st0: 0xc4018b895aa17a945000 Valid Normal -7.838871e+308
+ st1: 0x3ff9ea3f50e4d7275000 Valid Normal 0.0285946
+ st2: 0x3fe790c64ce27dad4800 Valid Normal 6.7415931e-08
+ st3: 0x3ffaa3ef0df6607d7800 Spec Normal 0.0400229
+ st4: 0x3c028000000000000000 Valid Normal 4.4501477e-308
+ st5: 0x3ffef5412c22219d9000 Zero Normal 0.9580257
+ st6: 0x3fff8000000000000000 Valid Normal 1
+ st7: 0xc4028b65a1f6d243c800 Valid Normal -1.566206e+309
+ fctrl: 0x0272 53 bit; NEAR; mask DENOR UNDER LOS;
+ fstat: 0xb9ba flags 0001; top 7; excep DENOR OVERF UNDER LOS
+ ftag: 0x3fff
+ fip: 0x08048b5c
+ fcs: 0x051a0023
+ fopoff: 0x08086820
+ fopsel: 0x002b
+@end smallexample
+
+@noindent
+Individual registers can be examined using the variables @var{$reg},
+where @var{reg} is the register name.
+
+@smallexample
+(gdb) p $st1
+$1 = 0.02859464454261210347719
+@end smallexample
+
+@node Handling floating point exceptions
+@section Handling floating point exceptions
+
+It is possible to stop the program whenever a @code{SIGFPE} floating
+point exception occurs. This can be useful for finding the cause of an
+unexpected infinity or @code{NaN}. The current handler settings can be
+shown with the command @code{info signal SIGFPE}.
+
+@smallexample
+(gdb) info signal SIGFPE
+Signal Stop Print Pass to program Description
+SIGFPE Yes Yes Yes Arithmetic exception
+@end smallexample
+
+@noindent
+Unless the program uses a signal handler the default setting should be
+changed so that SIGFPE is not passed to the program, as this would cause
+it to exit. The command @code{handle SIGFPE stop nopass} prevents this.
+
+@smallexample
+(gdb) handle SIGFPE stop nopass
+Signal Stop Print Pass to program Description
+SIGFPE Yes Yes No Arithmetic exception
+@end smallexample
+
+@noindent
+Depending on the platform it may be necessary to instruct the kernel to
+generate signals for floating point exceptions. For programs using GSL
+this can be achieved using the @code{GSL_IEEE_MODE} environment variable
+in conjunction with the function @code{gsl_ieee_env_setup} as described
+in @pxref{IEEE floating-point arithmetic}.
+
+@example
+(gdb) set env GSL_IEEE_MODE=double-precision
+@end example
+
+
+@node GCC warning options for numerical programs
+@section GCC warning options for numerical programs
+@cindex warning options
+@cindex gcc warning options
+
+Writing reliable numerical programs in C requires great care. The
+following GCC warning options are recommended when compiling numerical
+programs:
+
+@comment Uninitialized variables, conversions to and from integers or from
+@comment signed to unsigned integers can all cause hard-to-find problems. For
+@comment many non-numerical programs compiling with @code{gcc}'s warning option
+@comment @code{-Wall} provides a good check against common errors. However, for
+@comment numerical programs @code{-Wall} is not enough.
+
+@comment If you are unconvinced take a look at this program which contains an
+@comment error that can occur in numerical code,
+
+@comment @example
+@comment #include <math.h>
+@comment #include <stdio.h>
+
+@comment double f (int x);
+
+@comment int main ()
+@comment @{
+@comment double a = 1.5;
+@comment double y = f(a);
+@comment printf("a = %g, sqrt(a) = %g\n", a, y);
+@comment return 0;
+@comment @}
+
+@comment double f(x) @{
+@comment return sqrt(x);
+@comment @}
+@comment @end example
+
+@comment @noindent
+@comment This code compiles cleanly with @code{-Wall} but produces some strange
+@comment output,
+
+@comment @example
+@comment bash$ gcc -Wall tmp.c -lm
+@comment bash$ ./a.out
+@comment a = 1.5, sqrt(a) = 1
+@comment @end example
+
+@comment @noindent
+@comment Note that adding @code{-ansi} does not help here, since the program does
+@comment not contain any invalid constructs. What is happening is that the
+@comment prototype for the function @code{f(int x)} is not consistent with the
+@comment function call @code{f(y)}, where @code{y} is a floating point
+@comment number. This results in the argument being silently converted to an
+@comment integer. This is valid C, but in a numerical program it also likely to
+@comment be a programming error so we would like to be warned about it. (If we
+@comment genuinely wanted to convert @code{y} to an integer then we could use an
+@comment explicit cast, @code{(int)y}).
+
+@comment Fortunately GCC provides many additional warnings which can alert you to
+@comment problems such as this. You just have to remember to use them. Here is a
+@comment set of recommended warning options for numerical programs.
+
+@example
+gcc -ansi -pedantic -Werror -Wall -W
+ -Wmissing-prototypes -Wstrict-prototypes
+ -Wtraditional -Wconversion -Wshadow
+ -Wpointer-arith -Wcast-qual -Wcast-align
+ -Wwrite-strings -Wnested-externs
+ -fshort-enums -fno-common -Dinline= -g -O2
+@end example
+
+@noindent
+For details of each option consult the manual @cite{Using and Porting
+GCC}. The following table gives a brief explanation of what types of
+errors these options catch.
+
+@table @code
+@item -ansi -pedantic
+Use ANSI C, and reject any non-ANSI extensions. These flags help in
+writing portable programs that will compile on other systems.
+@item -Werror
+Consider warnings to be errors, so that compilation stops. This prevents
+warnings from scrolling off the top of the screen and being lost. You
+won't be able to compile the program until it is completely
+warning-free.
+@item -Wall
+This turns on a set of warnings for common programming problems. You
+need @code{-Wall}, but it is not enough on its own.
+@item -O2
+Turn on optimization. The warnings for uninitialized variables in
+@code{-Wall} rely on the optimizer to analyze the code. If there is no
+optimization then these warnings aren't generated.
+@item -W
+This turns on some extra warnings not included in @code{-Wall}, such as
+missing return values and comparisons between signed and unsigned
+integers.
+@item -Wmissing-prototypes -Wstrict-prototypes
+Warn if there are any missing or inconsistent prototypes. Without
+prototypes it is harder to detect problems with incorrect arguments.
+@item -Wtraditional
+This warns about certain constructs that behave differently in
+traditional and ANSI C. Whether the traditional or ANSI interpretation
+is used might be unpredictable on other compilers.
+@item -Wconversion
+The main use of this option is to warn about conversions from signed to
+unsigned integers. For example, @code{unsigned int x = -1}. If you need
+to perform such a conversion you can use an explicit cast.
+@item -Wshadow
+This warns whenever a local variable shadows another local variable. If
+two variables have the same name then it is a potential source of
+confusion.
+@item -Wpointer-arith -Wcast-qual -Wcast-align
+These options warn if you try to do pointer arithmetic for types which
+don't have a size, such as @code{void}, if you remove a @code{const}
+cast from a pointer, or if you cast a pointer to a type which has a
+different size, causing an invalid alignment.
+@item -Wwrite-strings
+This option gives string constants a @code{const} qualifier so that it
+will be a compile-time error to attempt to overwrite them.
+@item -fshort-enums
+This option makes the type of @code{enum} as short as possible. Normally
+this makes an @code{enum} different from an @code{int}. Consequently any
+attempts to assign a pointer-to-int to a pointer-to-enum will generate a
+cast-alignment warning.
+@item -fno-common
+This option prevents global variables being simultaneously defined in
+different object files (you get an error at link time). Such a variable
+should be defined in one file and referred to in other files with an
+@code{extern} declaration.
+@item -Wnested-externs
+This warns if an @code{extern} declaration is encountered within a
+function.
+@item -Dinline=
+The @code{inline} keyword is not part of ANSI C. Thus if you want to use
+@code{-ansi} with a program which uses inline functions you can use this
+preprocessor definition to remove the @code{inline} keywords.
+@item -g
+It always makes sense to put debugging symbols in the executable so that
+you can debug it using @code{gdb}. The only effect of debugging symbols
+is to increase the size of the file, and you can use the @code{strip}
+command to remove them later if necessary.
+@end table
+
+@comment For comparison, this is what happens when the test program above is
+@comment compiled with these options.
+
+@comment @example
+@comment bash$ gcc -ansi -pedantic -Werror -W -Wall -Wtraditional
+@comment -Wconversion -Wshadow -Wpointer-arith -Wcast-qual -Wcast-align
+@comment -Wwrite-strings -Waggregate-return -Wstrict-prototypes -fshort-enums
+@comment -fno-common -Wmissing-prototypes -Wnested-externs -Dinline=
+@comment -g -O4 tmp.c
+@comment cc1: warnings being treated as errors
+@comment tmp.c:7: warning: function declaration isn't a prototype
+@comment tmp.c: In function `main':
+@comment tmp.c:9: warning: passing arg 1 of `f' as integer rather than floating
+@comment due to prototype
+@comment tmp.c: In function `f':
+@comment tmp.c:14: warning: type of `x' defaults to `int'
+@comment tmp.c:15: warning: passing arg 1 of `sqrt' as floating rather than integer
+@comment due to prototype
+@comment make: *** [tmp] Error 1
+@comment @end example
+
+@comment @noindent
+@comment The error in the prototype is flagged, plus the fact that we should have
+@comment defined main as @code{int main (void)} in ANSI C. Clearly there is some
+@comment work to do before this program is ready to run.
+
+@node Debugging References
+@section References and Further Reading
+
+The following books are essential reading for anyone writing and
+debugging numerical programs with @sc{gcc} and @sc{gdb}.
+
+@itemize @asis
+@item
+R.M. Stallman, @cite{Using and Porting GNU CC}, Free Software
+Foundation, ISBN 1882114388
+
+@item
+R.M. Stallman, R.H. Pesch, @cite{Debugging with GDB: The GNU
+Source-Level Debugger}, Free Software Foundation, ISBN 1882114779
+@end itemize
+
+@noindent
+For a tutorial introduction to the GNU C Compiler and related programs,
+see
+
+@itemize @asis
+@item
+B.J. Gough, @cite{An Introduction to GCC}, Network Theory Ltd, ISBN
+0954161793
+@end itemize
+
+
diff --git a/gsl-1.9/doc/dht.texi b/gsl-1.9/doc/dht.texi
new file mode 100644
index 0000000..7f9f25f
--- /dev/null
+++ b/gsl-1.9/doc/dht.texi
@@ -0,0 +1,152 @@
+@cindex discrete Hankel transforms
+@cindex Hankel transforms, discrete
+@cindex transforms, Hankel
+This chapter describes functions for performing Discrete Hankel
+Transforms (DHTs). The functions are declared in the header file
+@file{gsl_dht.h}.
+
+@menu
+* Discrete Hankel Transform Definition::
+* Discrete Hankel Transform Functions::
+* Discrete Hankel Transform References::
+@end menu
+
+@node Discrete Hankel Transform Definition
+@section Definitions
+
+The discrete Hankel transform acts on a vector of sampled data, where
+the samples are assumed to have been taken at points related to the
+zeroes of a Bessel function of fixed order; compare this to the case of
+the discrete Fourier transform, where samples are taken at points
+related to the zeroes of the sine or cosine function.
+
+Specifically, let @math{f(t)} be a function on the unit interval.
+Then the finite @math{\nu}-Hankel transform of @math{f(t)} is defined
+to be the set of numbers @math{g_m} given by,
+@tex
+\beforedisplay
+$$
+g_m = \int_0^1 t dt\, J_\nu(j_{\nu,m}t) f(t),
+$$
+\afterdisplay
+@end tex
+@ifinfo
+@example
+g_m = \int_0^1 t dt J_\nu(j_(\nu,m)t) f(t),
+@end example
+
+@end ifinfo
+@noindent
+so that,
+@tex
+\beforedisplay
+$$
+f(t) = \sum_{m=1}^\infty {{2 J_\nu(j_{\nu,m}x)}\over{J_{\nu+1}(j_{\nu,m})^2}} g_m.
+$$
+\afterdisplay
+@end tex
+@ifinfo
+@example
+f(t) = \sum_@{m=1@}^\infty (2 J_\nu(j_(\nu,m)x) / J_(\nu+1)(j_(\nu,m))^2) g_m.
+@end example
+
+@end ifinfo
+@noindent
+Suppose that @math{f} is band-limited in the sense that
+@math{g_m=0} for @math{m > M}. Then we have the following
+fundamental sampling theorem.
+@tex
+\beforedisplay
+$$
+g_m = {{2}\over{j_{\nu,M}^2}}
+ \sum_{k=1}^{M-1} f\left({{j_{\nu,k}}\over{j_{\nu,M}}}\right)
+ {{J_\nu(j_{\nu,m} j_{\nu,k} / j_{\nu,M})}\over{J_{\nu+1}(j_{\nu,k})^2}}.
+$$
+\afterdisplay
+@end tex
+@ifinfo
+@example
+g_m = (2 / j_(\nu,M)^2)
+ \sum_@{k=1@}^@{M-1@} f(j_(\nu,k)/j_(\nu,M))
+ (J_\nu(j_(\nu,m) j_(\nu,k) / j_(\nu,M)) / J_(\nu+1)(j_(\nu,k))^2).
+@end example
+
+@end ifinfo
+@noindent
+It is this discrete expression which defines the discrete Hankel
+transform. The kernel in the summation above defines the matrix of the
+@math{\nu}-Hankel transform of size @math{M-1}. The coefficients of
+this matrix, being dependent on @math{\nu} and @math{M}, must be
+precomputed and stored; the @code{gsl_dht} object encapsulates this
+data. The allocation function @code{gsl_dht_alloc} returns a
+@code{gsl_dht} object which must be properly initialized with
+@code{gsl_dht_init} before it can be used to perform transforms on data
+sample vectors, for fixed @math{\nu} and @math{M}, using the
+@code{gsl_dht_apply} function. The implementation allows a scaling of
+the fundamental interval, for convenience, so that one can assume the
+function is defined on the interval @math{[0,X]}, rather than the unit
+interval.
+
+Notice that by assumption @math{f(t)} vanishes at the endpoints
+of the interval, consistent with the inversion formula
+and the sampling formula given above. Therefore, this transform
+corresponds to an orthogonal expansion in eigenfunctions
+of the Dirichlet problem for the Bessel differential equation.
+
+
+@node Discrete Hankel Transform Functions
+@section Functions
+
+@deftypefun {gsl_dht *} gsl_dht_alloc (size_t @var{size})
+This function allocates a Discrete Hankel transform object of size
+@var{size}.
+@end deftypefun
+
+@deftypefun int gsl_dht_init (gsl_dht * @var{t}, double @var{nu}, double @var{xmax})
+This function initializes the transform @var{t} for the given values of
+@var{nu} and @var{x}.
+@end deftypefun
+
+@deftypefun {gsl_dht *} gsl_dht_new (size_t @var{size}, double @var{nu}, double @var{xmax})
+This function allocates a Discrete Hankel transform object of size
+@var{size} and initializes it for the given values of @var{nu} and
+@var{x}.
+@end deftypefun
+
+@deftypefun void gsl_dht_free (gsl_dht * @var{t})
+This function frees the transform @var{t}.
+@end deftypefun
+
+@deftypefun int gsl_dht_apply (const gsl_dht * @var{t}, double * @var{f_in}, double * @var{f_out})
+This function applies the transform @var{t} to the array @var{f_in}
+whose size is equal to the size of the transform. The result is stored
+in the array @var{f_out} which must be of the same length.
+@end deftypefun
+
+@deftypefun double gsl_dht_x_sample (const gsl_dht * @var{t}, int @var{n})
+This function returns the value of the @var{n}-th sample point in the unit interval,
+@c{${({j_{\nu,n+1}} / {j_{\nu,M}}}) X$}
+@math{(j_@{\nu,n+1@}/j_@{\nu,M@}) X}. These are the
+points where the function @math{f(t)} is assumed to be sampled.
+@end deftypefun
+
+@deftypefun double gsl_dht_k_sample (const gsl_dht * @var{t}, int @var{n})
+This function returns the value of the @var{n}-th sample point in ``k-space'',
+@c{${{j_{\nu,n+1}} / X}$}
+@math{j_@{\nu,n+1@}/X}.
+@end deftypefun
+
+@node Discrete Hankel Transform References
+@section References and Further Reading
+
+The algorithms used by these functions are described in the following papers,
+
+@itemize @asis
+@item
+H. Fisk Johnson, Comp.@: Phys.@: Comm.@: 43, 181 (1987).
+@end itemize
+
+@itemize @asis
+@item
+D. Lemoine, J. Chem.@: Phys.@: 101, 3936 (1994).
+@end itemize
diff --git a/gsl-1.9/doc/diff.texi b/gsl-1.9/doc/diff.texi
new file mode 100644
index 0000000..ba11ebc
--- /dev/null
+++ b/gsl-1.9/doc/diff.texi
@@ -0,0 +1,105 @@
+@cindex differentiation of functions, numeric
+@cindex functions, numerical differentiation
+@cindex derivatives, calculating numerically
+@cindex numerical derivatives
+@cindex slope, see numerical derivative
+
+The functions described in this chapter compute numerical derivatives by
+finite differencing. An adaptive algorithm is used to find the best
+choice of finite difference and to estimate the error in the derivative.
+These functions are declared in the header file @file{gsl_deriv.h}.
+
+@menu
+* Numerical Differentiation functions::
+* Numerical Differentiation Examples::
+* Numerical Differentiation References::
+@end menu
+
+@node Numerical Differentiation functions
+@section Functions
+
+@deftypefun int gsl_deriv_central (const gsl_function * @var{f}, double @var{x}, double @var{h}, double * @var{result}, double * @var{abserr})
+This function computes the numerical derivative of the function @var{f}
+at the point @var{x} using an adaptive central difference algorithm with
+a step-size of @var{h}. The derivative is returned in @var{result} and an
+estimate of its absolute error is returned in @var{abserr}.
+
+The initial value of @var{h} is used to estimate an optimal step-size,
+based on the scaling of the truncation error and round-off error in the
+derivative calculation. The derivative is computed using a 5-point rule
+for equally spaced abscissae at @math{x-h}, @math{x-h/2}, @math{x},
+@math{x+h/2}, @math{x+h}, with an error estimate taken from the difference
+between the 5-point rule and the corresponding 3-point rule @math{x-h},
+@math{x}, @math{x+h}. Note that the value of the function at @math{x}
+does not contribute to the derivative calculation, so only 4-points are
+actually used.
+@end deftypefun
+
+@deftypefun int gsl_deriv_forward (const gsl_function * @var{f}, double @var{x}, double @var{h}, double * @var{result}, double * @var{abserr})
+This function computes the numerical derivative of the function @var{f}
+at the point @var{x} using an adaptive forward difference algorithm with
+a step-size of @var{h}. The function is evaluated only at points greater
+than @var{x}, and never at @var{x} itself. The derivative is returned in
+@var{result} and an estimate of its absolute error is returned in
+@var{abserr}. This function should be used if @math{f(x)} has a
+discontinuity at @var{x}, or is undefined for values less than @var{x}.
+
+The initial value of @var{h} is used to estimate an optimal step-size,
+based on the scaling of the truncation error and round-off error in the
+derivative calculation. The derivative at @math{x} is computed using an
+``open'' 4-point rule for equally spaced abscissae at @math{x+h/4},
+@math{x+h/2}, @math{x+3h/4}, @math{x+h}, with an error estimate taken
+from the difference between the 4-point rule and the corresponding
+2-point rule @math{x+h/2}, @math{x+h}.
+@end deftypefun
+
+@deftypefun int gsl_deriv_backward (const gsl_function * @var{f}, double @var{x}, double @var{h}, double * @var{result}, double * @var{abserr})
+This function computes the numerical derivative of the function @var{f}
+at the point @var{x} using an adaptive backward difference algorithm
+with a step-size of @var{h}. The function is evaluated only at points
+less than @var{x}, and never at @var{x} itself. The derivative is
+returned in @var{result} and an estimate of its absolute error is
+returned in @var{abserr}. This function should be used if @math{f(x)}
+has a discontinuity at @var{x}, or is undefined for values greater than
+@var{x}.
+
+This function is equivalent to calling @code{gsl_deriv_forward} with a
+negative step-size.
+@end deftypefun
+
+@node Numerical Differentiation Examples
+@section Examples
+
+The following code estimates the derivative of the function
+@c{$f(x) = x^{3/2}$}
+@math{f(x) = x^@{3/2@}}
+at @math{x=2} and at @math{x=0}. The function @math{f(x)} is
+undefined for @math{x<0} so the derivative at @math{x=0} is computed
+using @code{gsl_deriv_forward}.
+
+@example
+@verbatiminclude examples/diff.c
+@end example
+
+@noindent
+Here is the output of the program,
+
+@example
+$ ./a.out
+@verbatiminclude examples/diff.out
+@end example
+
+@node Numerical Differentiation References
+@section References and Further Reading
+
+The algorithms used by these functions are described in the following sources:
+
+@itemize @asis
+@item
+Abramowitz and Stegun, @cite{Handbook of Mathematical Functions},
+Section 25.3.4, and Table 25.5 (Coefficients for Differentiation).
+
+@item
+S.D. Conte and Carl de Boor, @cite{Elementary Numerical Analysis: An
+Algorithmic Approach}, McGraw-Hill, 1972.
+@end itemize
diff --git a/gsl-1.9/doc/dwt-orig.eps b/gsl-1.9/doc/dwt-orig.eps
new file mode 100644
index 0000000..2bf4de7
--- /dev/null
+++ b/gsl-1.9/doc/dwt-orig.eps
@@ -0,0 +1,2657 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: GNU libplot drawing library 4.1
+%%Title: PostScript plot
+%%CreationDate: Thu Jul 22 17:12:05 2004
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 1
+%%Pages: 1
+%%PageOrder: Ascend
+%%Orientation: Portrait
+%%BoundingBox: 112 210 487 402
+%%DocumentNeededResources: font Helvetica
+%%DocumentSuppliedResources: procset GNU_libplot 1.0 0
+%%EndComments
+
+%%BeginDefaults
+%%PageResources: font Helvetica
+%%EndDefaults
+
+%%BeginProlog
+%%EndProlog
+
+%%BeginSetup
+%%IncludeResource: font Helvetica
+/DrawDict 50 dict def
+DrawDict begin
+/ISOLatin1Encoding [
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright
+/parenleft/parenright/asterisk/plus/comma/minus/period/slash
+/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon
+/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N
+/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright
+/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m
+/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/dotlessi/grave/acute/circumflex/tilde/macron/breve
+/dotaccent/dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut
+/ogonek/caron/space/exclamdown/cent/sterling/currency/yen/brokenbar
+/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot
+/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior
+/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine
+/guillemotright/onequarter/onehalf/threequarters/questiondown
+/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla
+/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex
+/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis
+/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute
+/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis
+/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave
+/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex
+/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis
+/yacute/thorn/ydieresis
+] def
+/reencodeISO {
+dup dup findfont dup length dict begin
+{ 1 index /FID ne { def }{ pop pop } ifelse } forall
+/Encoding ISOLatin1Encoding def
+currentdict end definefont
+} def
+/Helvetica reencodeISO def
+%%BeginResource procset GNU_libplot 1.0 0
+/none null def
+/numGraphicParameters 17 def
+/stringLimit 65535 def
+/arrowHeight 8 def
+/eoFillRule true def
+
+/Begin { save numGraphicParameters dict begin } def
+/End { end restore } def
+
+/SetB {
+dup type /nulltype eq {
+pop
+false /brushRightArrow idef
+false /brushLeftArrow idef
+true /brushNone idef
+} {
+/brushDashOffset idef
+/brushDashArray idef
+0 ne /brushRightArrow idef
+0 ne /brushLeftArrow idef
+/brushWidth idef
+false /brushNone idef
+} ifelse
+} def
+
+/SetCFg {
+/fgblue idef
+/fggreen idef
+/fgred idef
+} def
+
+/SetCBg {
+/bgblue idef
+/bggreen idef
+/bgred idef
+} def
+
+/SetF {
+/printSize idef
+/printFont idef
+} def
+
+/SetP {
+dup type /nulltype eq {
+pop true /patternNone idef
+} {
+/patternGrayLevel idef
+patternGrayLevel -1 eq {
+/patternString idef
+} if
+false /patternNone idef
+} ifelse
+} def
+
+/BSpl {
+0 begin
+storexyn
+newpath
+n 1 gt {
+0 0 0 0 0 0 1 1 true subspline
+n 2 gt {
+0 0 0 0 1 1 2 2 false subspline
+1 1 n 3 sub {
+/i exch def
+i 1 sub dup i dup i 1 add dup i 2 add dup false subspline
+} for
+n 3 sub dup n 2 sub dup n 1 sub dup 2 copy false subspline
+} if
+n 2 sub dup n 1 sub dup 2 copy 2 copy false subspline
+patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if
+brushNone not { istroke } if
+0 0 1 1 leftarrow
+n 2 sub dup 1 sub dup rightarrow
+} if
+end
+} dup 0 4 dict put def
+
+/Circ {
+newpath
+0 360 arc
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+} def
+
+/CBSpl {
+0 begin
+dup 2 gt {
+storexyn
+newpath
+n 1 sub dup 0 0 1 1 2 2 true subspline
+1 1 n 3 sub {
+/i exch def
+i 1 sub dup i dup i 1 add dup i 2 add dup false subspline
+} for
+n 3 sub dup n 2 sub dup n 1 sub dup 0 0 false subspline
+n 2 sub dup n 1 sub dup 0 0 1 1 false subspline
+patternNone not { ifill } if
+brushNone not { istroke } if
+} {
+Poly
+} ifelse
+end
+} dup 0 4 dict put def
+
+/Elli {
+0 begin
+newpath
+4 2 roll
+translate
+scale
+0 0 1 0 360 arc
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+end
+} dup 0 1 dict put def
+
+/Line {
+0 begin
+2 storexyn
+newpath
+x 0 get y 0 get moveto
+x 1 get y 1 get lineto
+brushNone not { istroke } if
+0 0 1 1 leftarrow
+0 0 1 1 rightarrow
+end
+} dup 0 4 dict put def
+
+/MLine {
+0 begin
+storexyn
+newpath
+n 1 gt {
+x 0 get y 0 get moveto
+1 1 n 1 sub {
+/i exch def
+x i get y i get lineto
+} for
+patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if
+brushNone not { istroke } if
+0 0 1 1 leftarrow
+n 2 sub dup n 1 sub dup rightarrow
+} if
+end
+} dup 0 4 dict put def
+
+/Poly {
+3 1 roll
+newpath
+moveto
+-1 add
+{ lineto } repeat
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+} def
+
+/Rect {
+0 begin
+/t exch def
+/r exch def
+/b exch def
+/l exch def
+newpath
+l b moveto
+l t lineto
+r t lineto
+r b lineto
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+end
+} dup 0 4 dict put def
+
+/Text {
+ishow
+} def
+
+/idef {
+dup where { pop pop pop } { exch def } ifelse
+} def
+
+/ifill {
+0 begin
+gsave
+patternGrayLevel -1 ne {
+fgred bgred fgred sub patternGrayLevel mul add
+fggreen bggreen fggreen sub patternGrayLevel mul add
+fgblue bgblue fgblue sub patternGrayLevel mul add setrgbcolor
+eoFillRule { eofill } { fill } ifelse
+} {
+eoFillRule { eoclip } { clip } ifelse
+originalCTM setmatrix
+pathbbox /t exch def /r exch def /b exch def /l exch def
+/w r l sub ceiling cvi def
+/h t b sub ceiling cvi def
+/imageByteWidth w 8 div ceiling cvi def
+/imageHeight h def
+bgred bggreen bgblue setrgbcolor
+eoFillRule { eofill } { fill } ifelse
+fgred fggreen fgblue setrgbcolor
+w 0 gt h 0 gt and {
+l b translate w h scale
+w h true [w 0 0 h neg 0 h] { patternproc } imagemask
+} if
+} ifelse
+grestore
+end
+} dup 0 8 dict put def
+
+/istroke {
+gsave
+brushDashOffset -1 eq {
+[] 0 setdash
+1 setgray
+} {
+brushDashArray brushDashOffset setdash
+fgred fggreen fgblue setrgbcolor
+} ifelse
+brushWidth setlinewidth
+originalCTM setmatrix
+stroke
+grestore
+} def
+
+/ishow {
+0 begin
+gsave
+fgred fggreen fgblue setrgbcolor
+/fontDict printFont findfont printSize scalefont dup setfont def
+/descender fontDict begin 0 /FontBBox load 1 get FontMatrix end
+transform exch pop def
+/vertoffset 1 printSize sub descender sub def {
+0 vertoffset moveto show
+/vertoffset vertoffset printSize sub def
+} forall
+grestore
+end
+} dup 0 3 dict put def
+
+/patternproc {
+0 begin
+/patternByteLength patternString length def
+/patternHeight patternByteLength 8 mul sqrt cvi def
+/patternWidth patternHeight def
+/patternByteWidth patternWidth 8 idiv def
+/imageByteMaxLength imageByteWidth imageHeight mul
+stringLimit patternByteWidth sub min def
+/imageMaxHeight imageByteMaxLength imageByteWidth idiv patternHeight idiv
+patternHeight mul patternHeight max def
+/imageHeight imageHeight imageMaxHeight sub store
+/imageString imageByteWidth imageMaxHeight mul patternByteWidth add string def
+0 1 imageMaxHeight 1 sub {
+/y exch def
+/patternRow y patternByteWidth mul patternByteLength mod def
+/patternRowString patternString patternRow patternByteWidth getinterval def
+/imageRow y imageByteWidth mul def
+0 patternByteWidth imageByteWidth 1 sub {
+/x exch def
+imageString imageRow x add patternRowString putinterval
+} for
+} for
+imageString
+end
+} dup 0 12 dict put def
+
+/min {
+dup 3 2 roll dup 4 3 roll lt { exch } if pop
+} def
+
+/max {
+dup 3 2 roll dup 4 3 roll gt { exch } if pop
+} def
+
+/midpoint {
+0 begin
+/y1 exch def
+/x1 exch def
+/y0 exch def
+/x0 exch def
+x0 x1 add 2 div
+y0 y1 add 2 div
+end
+} dup 0 4 dict put def
+
+/thirdpoint {
+0 begin
+/y1 exch def
+/x1 exch def
+/y0 exch def
+/x0 exch def
+x0 2 mul x1 add 3 div
+y0 2 mul y1 add 3 div
+end
+} dup 0 4 dict put def
+
+/subspline {
+0 begin
+/movetoNeeded exch def
+y exch get /y3 exch def
+x exch get /x3 exch def
+y exch get /y2 exch def
+x exch get /x2 exch def
+y exch get /y1 exch def
+x exch get /x1 exch def
+y exch get /y0 exch def
+x exch get /x0 exch def
+x1 y1 x2 y2 thirdpoint
+/p1y exch def
+/p1x exch def
+x2 y2 x1 y1 thirdpoint
+/p2y exch def
+/p2x exch def
+x1 y1 x0 y0 thirdpoint
+p1x p1y midpoint
+/p0y exch def
+/p0x exch def
+x2 y2 x3 y3 thirdpoint
+p2x p2y midpoint
+/p3y exch def
+/p3x exch def
+movetoNeeded { p0x p0y moveto } if
+p1x p1y p2x p2y p3x p3y curveto
+end
+} dup 0 17 dict put def
+
+/storexyn {
+/n exch def
+/y n array def
+/x n array def
+n 1 sub -1 0 {
+/i exch def
+y i 3 2 roll put
+x i 3 2 roll put
+} for
+} def
+
+/arrowhead {
+0 begin
+transform originalCTM itransform
+/taily exch def
+/tailx exch def
+transform originalCTM itransform
+/tipy exch def
+/tipx exch def
+/dy tipy taily sub def
+/dx tipx tailx sub def
+/angle dx 0 ne dy 0 ne or { dy dx atan } { 90 } ifelse def
+gsave
+originalCTM setmatrix
+tipx tipy translate
+angle rotate
+newpath
+arrowHeight neg arrowWidth 2 div moveto
+0 0 lineto
+arrowHeight neg arrowWidth 2 div neg lineto
+patternNone not {
+originalCTM setmatrix
+/padtip arrowHeight 2 exp 0.25 arrowWidth 2 exp mul add sqrt brushWidth mul
+arrowWidth div def
+/padtail brushWidth 2 div def
+tipx tipy translate
+angle rotate
+padtip 0 translate
+arrowHeight padtip add padtail add arrowHeight div dup scale
+arrowheadpath
+ifill
+} if
+brushNone not {
+originalCTM setmatrix
+tipx tipy translate
+angle rotate
+arrowheadpath
+istroke
+} if
+grestore
+end
+} dup 0 9 dict put def
+
+/arrowheadpath {
+newpath
+arrowHeight neg arrowWidth 2 div moveto
+0 0 lineto
+arrowHeight neg arrowWidth 2 div neg lineto
+} def
+
+/leftarrow {
+0 begin
+y exch get /taily exch def
+x exch get /tailx exch def
+y exch get /tipy exch def
+x exch get /tipx exch def
+brushLeftArrow { tipx tipy tailx taily arrowhead } if
+end
+} dup 0 4 dict put def
+
+/rightarrow {
+0 begin
+y exch get /tipy exch def
+x exch get /tipx exch def
+y exch get /taily exch def
+x exch get /tailx exch def
+brushRightArrow { tipx tipy tailx taily arrowhead } if
+end
+} dup 0 4 dict put def
+%%EndResource
+%%EndSetup
+
+%%Page: 1 1
+%%PageResources: font Helvetica
+%%PageBoundingBox: 112 210 487 402
+%%BeginPageSetup
+%I Idraw 8
+
+Begin
+%I b u
+%I cfg u
+%I cbg u
+%I f u
+%I p u
+%I t
+[ 1 0 0 1 0 0 ] concat
+/originalCTM matrix currentmatrix def
+/trueoriginalCTM matrix currentmatrix def
+%%EndPageSetup
+
+Begin %I Rect
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+2304 2304 9216 5760 Rect
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-9-*-*-*-*-*-*-*
+/Helvetica 9.072000 SetF
+%I t
+[ 1 0 0 1 130.678 218.1928 ] concat
+%I
+[
+(0)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5760
+2304 5691
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2304 2373
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-9-*-*-*-*-*-*-*
+/Helvetica 9.072000 SetF
+%I t
+[ 1 0 0 1 171.356 218.1928 ] concat
+%I
+[
+(32)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3168 5760
+3168 5691
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3168 2304
+3168 2373
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-9-*-*-*-*-*-*-*
+/Helvetica 9.072000 SetF
+%I t
+[ 1 0 0 1 214.556 218.1928 ] concat
+%I
+[
+(64)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4032 5760
+4032 5691
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4032 2304
+4032 2373
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-9-*-*-*-*-*-*-*
+/Helvetica 9.072000 SetF
+%I t
+[ 1 0 0 1 257.756 218.1928 ] concat
+%I
+[
+(96)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4896 5760
+4896 5691
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4896 2304
+4896 2373
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-9-*-*-*-*-*-*-*
+/Helvetica 9.072000 SetF
+%I t
+[ 1 0 0 1 298.434 218.1928 ] concat
+%I
+[
+(128)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5760 5760
+5760 5691
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5760 2304
+5760 2373
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-9-*-*-*-*-*-*-*
+/Helvetica 9.072000 SetF
+%I t
+[ 1 0 0 1 341.634 218.1928 ] concat
+%I
+[
+(160)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6624 5760
+6624 5691
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6624 2304
+6624 2373
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-9-*-*-*-*-*-*-*
+/Helvetica 9.072000 SetF
+%I t
+[ 1 0 0 1 384.834 218.1928 ] concat
+%I
+[
+(192)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7488 5760
+7488 5691
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7488 2304
+7488 2373
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-9-*-*-*-*-*-*-*
+/Helvetica 9.072000 SetF
+%I t
+[ 1 0 0 1 428.034 218.1928 ] concat
+%I
+[
+(224)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8352 5760
+8352 5691
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8352 2304
+8352 2373
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-9-*-*-*-*-*-*-*
+/Helvetica 9.072000 SetF
+%I t
+[ 1 0 0 1 471.234 218.1928 ] concat
+%I
+[
+(256)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5760
+9216 5691
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2304
+9216 2373
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-9-*-*-*-*-*-*-*
+/Helvetica 9.072000 SetF
+%I t
+[ 1 0 0 1 112.6999 226.0284 ] concat
+%I
+[
+(-0.4)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2304
+9147 2304
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2373 2304
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-9-*-*-*-*-*-*-*
+/Helvetica 9.072000 SetF
+%I t
+[ 1 0 0 1 112.6999 245.2284 ] concat
+%I
+[
+(-0.2)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2688
+9147 2688
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2688
+2373 2688
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-9-*-*-*-*-*-*-*
+/Helvetica 9.072000 SetF
+%I t
+[ 1 0 0 1 117.9979 264.4284 ] concat
+%I
+[
+(0.0)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 3072
+9147 3072
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3072
+2373 3072
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-9-*-*-*-*-*-*-*
+/Helvetica 9.072000 SetF
+%I t
+[ 1 0 0 1 117.9979 283.6284 ] concat
+%I
+[
+(0.2)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 3456
+9147 3456
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3456
+2373 3456
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-9-*-*-*-*-*-*-*
+/Helvetica 9.072000 SetF
+%I t
+[ 1 0 0 1 117.9979 302.8284 ] concat
+%I
+[
+(0.4)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 3840
+9147 3840
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3840
+2373 3840
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-9-*-*-*-*-*-*-*
+/Helvetica 9.072000 SetF
+%I t
+[ 1 0 0 1 117.9979 322.0284 ] concat
+%I
+[
+(0.6)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4224
+9147 4224
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4224
+2373 4224
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-9-*-*-*-*-*-*-*
+/Helvetica 9.072000 SetF
+%I t
+[ 1 0 0 1 117.9979 341.2284 ] concat
+%I
+[
+(0.8)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4608
+9147 4608
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4608
+2373 4608
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-9-*-*-*-*-*-*-*
+/Helvetica 9.072000 SetF
+%I t
+[ 1 0 0 1 117.9979 360.4284 ] concat
+%I
+[
+(1.0)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4992
+9147 4992
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4992
+2373 4992
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-9-*-*-*-*-*-*-*
+/Helvetica 9.072000 SetF
+%I t
+[ 1 0 0 1 117.9979 379.6284 ] concat
+%I
+[
+(1.2)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5376
+9147 5376
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5376
+2373 5376
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-9-*-*-*-*-*-*-*
+/Helvetica 9.072000 SetF
+%I t
+[ 1 0 0 1 117.9979 398.8284 ] concat
+%I
+[
+(1.4)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5760
+9147 5760
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5760
+2373 5760
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2304
+9188 2304
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2332 2304
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2496
+9188 2496
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2496
+2332 2496
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2688
+9188 2688
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2688
+2332 2688
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2880
+9188 2880
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2880
+2332 2880
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 3072
+9188 3072
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3072
+2332 3072
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 3264
+9188 3264
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3264
+2332 3264
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 3456
+9188 3456
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3456
+2332 3456
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 3648
+9188 3648
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3648
+2332 3648
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 3840
+9188 3840
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3840
+2332 3840
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4032
+9188 4032
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4032
+2332 4032
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4224
+9188 4224
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4224
+2332 4224
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4416
+9188 4416
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4416
+2332 4416
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4608
+9188 4608
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4608
+2332 4608
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4800
+9188 4800
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4800
+2332 4800
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4992
+9188 4992
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4992
+2332 4992
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5184
+9188 5184
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5184
+2332 5184
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5376
+9188 5376
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5376
+2332 5376
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5568
+9188 5568
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5568
+2332 5568
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5760
+9188 5760
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5760
+2332 5760
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 34952
+1 0 0 [ 1.48 4.43 ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3072
+9216 3072
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 256
+2304 3161
+2331 3161
+2358 3170
+2385 3209
+2412 3209
+2439 3199
+2466 3257
+2493 3266
+2520 3295
+2547 3305
+2574 3295
+2601 3276
+2628 3247
+2655 3266
+2682 3257
+2709 3257
+2736 3257
+2763 3247
+2790 3238
+2817 3228
+2844 3238
+2871 3266
+2898 3286
+2925 3295
+2952 3218
+2979 3142
+3006 3142
+3033 3113
+3060 3094
+3087 3055
+3114 3055
+3141 3065
+3168 3084
+3195 3074
+3222 3084
+3249 3065
+3276 3036
+3303 3026
+3330 3036
+3357 3036
+3384 3017
+3411 3026
+3438 3007
+3465 3055
+3492 3046
+3519 3055
+3546 3074
+3573 3026
+3600 3007
+3627 3036
+3654 3055
+3681 3065
+3708 3055
+3735 3017
+3762 2988
+3789 2998
+3816 2959
+3843 2873
+3870 2834
+3897 2777
+3924 2710
+3951 2662
+3978 2719
+4005 2892
+4032 3113
+4059 3382
+4086 3660
+4113 4140
+4140 4630
+4167 5071
+4194 5369
+4221 5494
+4248 5426
+4275 5138
+4302 4630
+4329 4006
+4356 3478
+4383 3170
+4410 2940
+4437 2825
+4464 2777
+4491 2815
+4518 2873
+4545 2940
+4572 2940
+4599 2950
+4626 2940
+4653 2959
+4680 2959
+4707 2959
+4734 2930
+4761 2950
+4788 2950
+4815 2950
+4842 2969
+4869 2930
+4896 2902
+4923 2902
+4950 2921
+4977 2930
+5004 2940
+5031 2911
+5058 2930
+5085 2950
+5112 2969
+5139 2940
+5166 2940
+5193 2911
+5220 2902
+5247 2902
+5274 2940
+5301 2940
+5328 2930
+5355 2911
+5382 2892
+5409 2921
+5436 2902
+5463 2911
+5490 2902
+5517 2892
+5544 2902
+5571 2921
+5598 2921
+5625 2930
+5652 2940
+5679 2911
+5706 2902
+5733 2940
+5760 2940
+5787 2950
+5814 2950
+5841 2902
+5868 2911
+5895 2930
+5922 2940
+5949 2969
+5976 2940
+6003 2930
+6030 2902
+6057 2921
+6084 2940
+6111 2940
+6138 2950
+6165 2911
+6192 2892
+6219 2892
+6246 2921
+6273 2930
+6300 2911
+6327 2892
+6354 2882
+6381 2882
+6408 2902
+6435 2892
+6462 2873
+6489 2882
+6516 2854
+6543 2863
+6570 2863
+6597 2882
+6624 2863
+6651 2825
+6678 2815
+6705 2825
+6732 2854
+6759 2834
+6786 2825
+6813 2815
+6840 2786
+6867 2806
+6894 2815
+6921 2825
+6948 2815
+6975 2786
+7002 2777
+7029 2806
+7056 2825
+7083 2834
+7110 2844
+7137 2854
+7164 2844
+7191 2902
+7218 2930
+7245 2978
+7272 2988
+7299 2998
+7326 2988
+7353 3036
+7380 3065
+7407 3084
+7434 3074
+7461 3055
+7488 3055
+7515 3074
+7542 3094
+7569 3113
+7596 3113
+7623 3074
+7650 3074
+7677 3084
+7704 3103
+7731 3103
+7758 3122
+7785 3074
+7812 3055
+7839 3103
+7866 3094
+7893 3113
+7920 3113
+7947 3074
+7974 3065
+8001 3094
+8028 3103
+8055 3084
+8082 3103
+8109 3084
+8136 3084
+8163 3094
+8190 3122
+8217 3132
+8244 3103
+8271 3094
+8298 3074
+8325 3084
+8352 3113
+8379 3084
+8406 3084
+8433 3084
+8460 3055
+8487 3084
+8514 3074
+8541 3084
+8568 3065
+8595 3046
+8622 3036
+8649 3046
+8676 3046
+8703 3055
+8730 3065
+8757 3026
+8784 3017
+8811 3026
+8838 3046
+8865 3055
+8892 3055
+8919 3026
+8946 3026
+8973 3026
+9000 3074
+9027 3055
+9054 3046
+9081 3036
+9108 3007
+9135 3046
+9162 3055
+9189 3055
+256 MLine
+End
+
+%%PageTrailer
+End %I eop
+showpage
+
+%%Trailer
+end
+%%EOF
diff --git a/gsl-1.9/doc/dwt-samp.eps b/gsl-1.9/doc/dwt-samp.eps
new file mode 100644
index 0000000..14fd3a8
--- /dev/null
+++ b/gsl-1.9/doc/dwt-samp.eps
@@ -0,0 +1,2657 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: GNU libplot drawing library 4.1
+%%Title: PostScript plot
+%%CreationDate: Thu Jul 22 17:12:13 2004
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 1
+%%Pages: 1
+%%PageOrder: Ascend
+%%Orientation: Portrait
+%%BoundingBox: 112 210 487 402
+%%DocumentNeededResources: font Helvetica
+%%DocumentSuppliedResources: procset GNU_libplot 1.0 0
+%%EndComments
+
+%%BeginDefaults
+%%PageResources: font Helvetica
+%%EndDefaults
+
+%%BeginProlog
+%%EndProlog
+
+%%BeginSetup
+%%IncludeResource: font Helvetica
+/DrawDict 50 dict def
+DrawDict begin
+/ISOLatin1Encoding [
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright
+/parenleft/parenright/asterisk/plus/comma/minus/period/slash
+/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon
+/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N
+/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright
+/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m
+/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/dotlessi/grave/acute/circumflex/tilde/macron/breve
+/dotaccent/dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut
+/ogonek/caron/space/exclamdown/cent/sterling/currency/yen/brokenbar
+/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot
+/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior
+/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine
+/guillemotright/onequarter/onehalf/threequarters/questiondown
+/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla
+/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex
+/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis
+/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute
+/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis
+/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave
+/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex
+/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis
+/yacute/thorn/ydieresis
+] def
+/reencodeISO {
+dup dup findfont dup length dict begin
+{ 1 index /FID ne { def }{ pop pop } ifelse } forall
+/Encoding ISOLatin1Encoding def
+currentdict end definefont
+} def
+/Helvetica reencodeISO def
+%%BeginResource procset GNU_libplot 1.0 0
+/none null def
+/numGraphicParameters 17 def
+/stringLimit 65535 def
+/arrowHeight 8 def
+/eoFillRule true def
+
+/Begin { save numGraphicParameters dict begin } def
+/End { end restore } def
+
+/SetB {
+dup type /nulltype eq {
+pop
+false /brushRightArrow idef
+false /brushLeftArrow idef
+true /brushNone idef
+} {
+/brushDashOffset idef
+/brushDashArray idef
+0 ne /brushRightArrow idef
+0 ne /brushLeftArrow idef
+/brushWidth idef
+false /brushNone idef
+} ifelse
+} def
+
+/SetCFg {
+/fgblue idef
+/fggreen idef
+/fgred idef
+} def
+
+/SetCBg {
+/bgblue idef
+/bggreen idef
+/bgred idef
+} def
+
+/SetF {
+/printSize idef
+/printFont idef
+} def
+
+/SetP {
+dup type /nulltype eq {
+pop true /patternNone idef
+} {
+/patternGrayLevel idef
+patternGrayLevel -1 eq {
+/patternString idef
+} if
+false /patternNone idef
+} ifelse
+} def
+
+/BSpl {
+0 begin
+storexyn
+newpath
+n 1 gt {
+0 0 0 0 0 0 1 1 true subspline
+n 2 gt {
+0 0 0 0 1 1 2 2 false subspline
+1 1 n 3 sub {
+/i exch def
+i 1 sub dup i dup i 1 add dup i 2 add dup false subspline
+} for
+n 3 sub dup n 2 sub dup n 1 sub dup 2 copy false subspline
+} if
+n 2 sub dup n 1 sub dup 2 copy 2 copy false subspline
+patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if
+brushNone not { istroke } if
+0 0 1 1 leftarrow
+n 2 sub dup 1 sub dup rightarrow
+} if
+end
+} dup 0 4 dict put def
+
+/Circ {
+newpath
+0 360 arc
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+} def
+
+/CBSpl {
+0 begin
+dup 2 gt {
+storexyn
+newpath
+n 1 sub dup 0 0 1 1 2 2 true subspline
+1 1 n 3 sub {
+/i exch def
+i 1 sub dup i dup i 1 add dup i 2 add dup false subspline
+} for
+n 3 sub dup n 2 sub dup n 1 sub dup 0 0 false subspline
+n 2 sub dup n 1 sub dup 0 0 1 1 false subspline
+patternNone not { ifill } if
+brushNone not { istroke } if
+} {
+Poly
+} ifelse
+end
+} dup 0 4 dict put def
+
+/Elli {
+0 begin
+newpath
+4 2 roll
+translate
+scale
+0 0 1 0 360 arc
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+end
+} dup 0 1 dict put def
+
+/Line {
+0 begin
+2 storexyn
+newpath
+x 0 get y 0 get moveto
+x 1 get y 1 get lineto
+brushNone not { istroke } if
+0 0 1 1 leftarrow
+0 0 1 1 rightarrow
+end
+} dup 0 4 dict put def
+
+/MLine {
+0 begin
+storexyn
+newpath
+n 1 gt {
+x 0 get y 0 get moveto
+1 1 n 1 sub {
+/i exch def
+x i get y i get lineto
+} for
+patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if
+brushNone not { istroke } if
+0 0 1 1 leftarrow
+n 2 sub dup n 1 sub dup rightarrow
+} if
+end
+} dup 0 4 dict put def
+
+/Poly {
+3 1 roll
+newpath
+moveto
+-1 add
+{ lineto } repeat
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+} def
+
+/Rect {
+0 begin
+/t exch def
+/r exch def
+/b exch def
+/l exch def
+newpath
+l b moveto
+l t lineto
+r t lineto
+r b lineto
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+end
+} dup 0 4 dict put def
+
+/Text {
+ishow
+} def
+
+/idef {
+dup where { pop pop pop } { exch def } ifelse
+} def
+
+/ifill {
+0 begin
+gsave
+patternGrayLevel -1 ne {
+fgred bgred fgred sub patternGrayLevel mul add
+fggreen bggreen fggreen sub patternGrayLevel mul add
+fgblue bgblue fgblue sub patternGrayLevel mul add setrgbcolor
+eoFillRule { eofill } { fill } ifelse
+} {
+eoFillRule { eoclip } { clip } ifelse
+originalCTM setmatrix
+pathbbox /t exch def /r exch def /b exch def /l exch def
+/w r l sub ceiling cvi def
+/h t b sub ceiling cvi def
+/imageByteWidth w 8 div ceiling cvi def
+/imageHeight h def
+bgred bggreen bgblue setrgbcolor
+eoFillRule { eofill } { fill } ifelse
+fgred fggreen fgblue setrgbcolor
+w 0 gt h 0 gt and {
+l b translate w h scale
+w h true [w 0 0 h neg 0 h] { patternproc } imagemask
+} if
+} ifelse
+grestore
+end
+} dup 0 8 dict put def
+
+/istroke {
+gsave
+brushDashOffset -1 eq {
+[] 0 setdash
+1 setgray
+} {
+brushDashArray brushDashOffset setdash
+fgred fggreen fgblue setrgbcolor
+} ifelse
+brushWidth setlinewidth
+originalCTM setmatrix
+stroke
+grestore
+} def
+
+/ishow {
+0 begin
+gsave
+fgred fggreen fgblue setrgbcolor
+/fontDict printFont findfont printSize scalefont dup setfont def
+/descender fontDict begin 0 /FontBBox load 1 get FontMatrix end
+transform exch pop def
+/vertoffset 1 printSize sub descender sub def {
+0 vertoffset moveto show
+/vertoffset vertoffset printSize sub def
+} forall
+grestore
+end
+} dup 0 3 dict put def
+
+/patternproc {
+0 begin
+/patternByteLength patternString length def
+/patternHeight patternByteLength 8 mul sqrt cvi def
+/patternWidth patternHeight def
+/patternByteWidth patternWidth 8 idiv def
+/imageByteMaxLength imageByteWidth imageHeight mul
+stringLimit patternByteWidth sub min def
+/imageMaxHeight imageByteMaxLength imageByteWidth idiv patternHeight idiv
+patternHeight mul patternHeight max def
+/imageHeight imageHeight imageMaxHeight sub store
+/imageString imageByteWidth imageMaxHeight mul patternByteWidth add string def
+0 1 imageMaxHeight 1 sub {
+/y exch def
+/patternRow y patternByteWidth mul patternByteLength mod def
+/patternRowString patternString patternRow patternByteWidth getinterval def
+/imageRow y imageByteWidth mul def
+0 patternByteWidth imageByteWidth 1 sub {
+/x exch def
+imageString imageRow x add patternRowString putinterval
+} for
+} for
+imageString
+end
+} dup 0 12 dict put def
+
+/min {
+dup 3 2 roll dup 4 3 roll lt { exch } if pop
+} def
+
+/max {
+dup 3 2 roll dup 4 3 roll gt { exch } if pop
+} def
+
+/midpoint {
+0 begin
+/y1 exch def
+/x1 exch def
+/y0 exch def
+/x0 exch def
+x0 x1 add 2 div
+y0 y1 add 2 div
+end
+} dup 0 4 dict put def
+
+/thirdpoint {
+0 begin
+/y1 exch def
+/x1 exch def
+/y0 exch def
+/x0 exch def
+x0 2 mul x1 add 3 div
+y0 2 mul y1 add 3 div
+end
+} dup 0 4 dict put def
+
+/subspline {
+0 begin
+/movetoNeeded exch def
+y exch get /y3 exch def
+x exch get /x3 exch def
+y exch get /y2 exch def
+x exch get /x2 exch def
+y exch get /y1 exch def
+x exch get /x1 exch def
+y exch get /y0 exch def
+x exch get /x0 exch def
+x1 y1 x2 y2 thirdpoint
+/p1y exch def
+/p1x exch def
+x2 y2 x1 y1 thirdpoint
+/p2y exch def
+/p2x exch def
+x1 y1 x0 y0 thirdpoint
+p1x p1y midpoint
+/p0y exch def
+/p0x exch def
+x2 y2 x3 y3 thirdpoint
+p2x p2y midpoint
+/p3y exch def
+/p3x exch def
+movetoNeeded { p0x p0y moveto } if
+p1x p1y p2x p2y p3x p3y curveto
+end
+} dup 0 17 dict put def
+
+/storexyn {
+/n exch def
+/y n array def
+/x n array def
+n 1 sub -1 0 {
+/i exch def
+y i 3 2 roll put
+x i 3 2 roll put
+} for
+} def
+
+/arrowhead {
+0 begin
+transform originalCTM itransform
+/taily exch def
+/tailx exch def
+transform originalCTM itransform
+/tipy exch def
+/tipx exch def
+/dy tipy taily sub def
+/dx tipx tailx sub def
+/angle dx 0 ne dy 0 ne or { dy dx atan } { 90 } ifelse def
+gsave
+originalCTM setmatrix
+tipx tipy translate
+angle rotate
+newpath
+arrowHeight neg arrowWidth 2 div moveto
+0 0 lineto
+arrowHeight neg arrowWidth 2 div neg lineto
+patternNone not {
+originalCTM setmatrix
+/padtip arrowHeight 2 exp 0.25 arrowWidth 2 exp mul add sqrt brushWidth mul
+arrowWidth div def
+/padtail brushWidth 2 div def
+tipx tipy translate
+angle rotate
+padtip 0 translate
+arrowHeight padtip add padtail add arrowHeight div dup scale
+arrowheadpath
+ifill
+} if
+brushNone not {
+originalCTM setmatrix
+tipx tipy translate
+angle rotate
+arrowheadpath
+istroke
+} if
+grestore
+end
+} dup 0 9 dict put def
+
+/arrowheadpath {
+newpath
+arrowHeight neg arrowWidth 2 div moveto
+0 0 lineto
+arrowHeight neg arrowWidth 2 div neg lineto
+} def
+
+/leftarrow {
+0 begin
+y exch get /taily exch def
+x exch get /tailx exch def
+y exch get /tipy exch def
+x exch get /tipx exch def
+brushLeftArrow { tipx tipy tailx taily arrowhead } if
+end
+} dup 0 4 dict put def
+
+/rightarrow {
+0 begin
+y exch get /tipy exch def
+x exch get /tipx exch def
+y exch get /taily exch def
+x exch get /tailx exch def
+brushRightArrow { tipx tipy tailx taily arrowhead } if
+end
+} dup 0 4 dict put def
+%%EndResource
+%%EndSetup
+
+%%Page: 1 1
+%%PageResources: font Helvetica
+%%PageBoundingBox: 112 210 487 402
+%%BeginPageSetup
+%I Idraw 8
+
+Begin
+%I b u
+%I cfg u
+%I cbg u
+%I f u
+%I p u
+%I t
+[ 1 0 0 1 0 0 ] concat
+/originalCTM matrix currentmatrix def
+/trueoriginalCTM matrix currentmatrix def
+%%EndPageSetup
+
+Begin %I Rect
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+2304 2304 9216 5760 Rect
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-9-*-*-*-*-*-*-*
+/Helvetica 9.072000 SetF
+%I t
+[ 1 0 0 1 130.678 218.1928 ] concat
+%I
+[
+(0)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5760
+2304 5691
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2304 2373
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-9-*-*-*-*-*-*-*
+/Helvetica 9.072000 SetF
+%I t
+[ 1 0 0 1 171.356 218.1928 ] concat
+%I
+[
+(32)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3168 5760
+3168 5691
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3168 2304
+3168 2373
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-9-*-*-*-*-*-*-*
+/Helvetica 9.072000 SetF
+%I t
+[ 1 0 0 1 214.556 218.1928 ] concat
+%I
+[
+(64)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4032 5760
+4032 5691
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4032 2304
+4032 2373
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-9-*-*-*-*-*-*-*
+/Helvetica 9.072000 SetF
+%I t
+[ 1 0 0 1 257.756 218.1928 ] concat
+%I
+[
+(96)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4896 5760
+4896 5691
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4896 2304
+4896 2373
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-9-*-*-*-*-*-*-*
+/Helvetica 9.072000 SetF
+%I t
+[ 1 0 0 1 298.434 218.1928 ] concat
+%I
+[
+(128)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5760 5760
+5760 5691
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5760 2304
+5760 2373
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-9-*-*-*-*-*-*-*
+/Helvetica 9.072000 SetF
+%I t
+[ 1 0 0 1 341.634 218.1928 ] concat
+%I
+[
+(160)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6624 5760
+6624 5691
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6624 2304
+6624 2373
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-9-*-*-*-*-*-*-*
+/Helvetica 9.072000 SetF
+%I t
+[ 1 0 0 1 384.834 218.1928 ] concat
+%I
+[
+(192)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7488 5760
+7488 5691
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7488 2304
+7488 2373
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-9-*-*-*-*-*-*-*
+/Helvetica 9.072000 SetF
+%I t
+[ 1 0 0 1 428.034 218.1928 ] concat
+%I
+[
+(224)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8352 5760
+8352 5691
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8352 2304
+8352 2373
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-9-*-*-*-*-*-*-*
+/Helvetica 9.072000 SetF
+%I t
+[ 1 0 0 1 471.234 218.1928 ] concat
+%I
+[
+(256)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5760
+9216 5691
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2304
+9216 2373
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-9-*-*-*-*-*-*-*
+/Helvetica 9.072000 SetF
+%I t
+[ 1 0 0 1 112.6999 226.0284 ] concat
+%I
+[
+(-0.4)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2304
+9147 2304
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2373 2304
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-9-*-*-*-*-*-*-*
+/Helvetica 9.072000 SetF
+%I t
+[ 1 0 0 1 112.6999 245.2284 ] concat
+%I
+[
+(-0.2)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2688
+9147 2688
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2688
+2373 2688
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-9-*-*-*-*-*-*-*
+/Helvetica 9.072000 SetF
+%I t
+[ 1 0 0 1 117.9979 264.4284 ] concat
+%I
+[
+(0.0)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 3072
+9147 3072
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3072
+2373 3072
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-9-*-*-*-*-*-*-*
+/Helvetica 9.072000 SetF
+%I t
+[ 1 0 0 1 117.9979 283.6284 ] concat
+%I
+[
+(0.2)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 3456
+9147 3456
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3456
+2373 3456
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-9-*-*-*-*-*-*-*
+/Helvetica 9.072000 SetF
+%I t
+[ 1 0 0 1 117.9979 302.8284 ] concat
+%I
+[
+(0.4)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 3840
+9147 3840
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3840
+2373 3840
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-9-*-*-*-*-*-*-*
+/Helvetica 9.072000 SetF
+%I t
+[ 1 0 0 1 117.9979 322.0284 ] concat
+%I
+[
+(0.6)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4224
+9147 4224
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4224
+2373 4224
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-9-*-*-*-*-*-*-*
+/Helvetica 9.072000 SetF
+%I t
+[ 1 0 0 1 117.9979 341.2284 ] concat
+%I
+[
+(0.8)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4608
+9147 4608
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4608
+2373 4608
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-9-*-*-*-*-*-*-*
+/Helvetica 9.072000 SetF
+%I t
+[ 1 0 0 1 117.9979 360.4284 ] concat
+%I
+[
+(1.0)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4992
+9147 4992
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4992
+2373 4992
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-9-*-*-*-*-*-*-*
+/Helvetica 9.072000 SetF
+%I t
+[ 1 0 0 1 117.9979 379.6284 ] concat
+%I
+[
+(1.2)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5376
+9147 5376
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5376
+2373 5376
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-9-*-*-*-*-*-*-*
+/Helvetica 9.072000 SetF
+%I t
+[ 1 0 0 1 117.9979 398.8284 ] concat
+%I
+[
+(1.4)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5760
+9147 5760
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5760
+2373 5760
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2304
+9188 2304
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2332 2304
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2496
+9188 2496
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2496
+2332 2496
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2688
+9188 2688
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2688
+2332 2688
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2880
+9188 2880
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2880
+2332 2880
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 3072
+9188 3072
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3072
+2332 3072
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 3264
+9188 3264
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3264
+2332 3264
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 3456
+9188 3456
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3456
+2332 3456
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 3648
+9188 3648
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3648
+2332 3648
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 3840
+9188 3840
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3840
+2332 3840
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4032
+9188 4032
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4032
+2332 4032
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4224
+9188 4224
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4224
+2332 4224
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4416
+9188 4416
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4416
+2332 4416
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4608
+9188 4608
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4608
+2332 4608
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4800
+9188 4800
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4800
+2332 4800
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4992
+9188 4992
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4992
+2332 4992
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5184
+9188 5184
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5184
+2332 5184
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5376
+9188 5376
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5376
+2332 5376
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5568
+9188 5568
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5568
+2332 5568
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5760
+9188 5760
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5760
+2332 5760
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 34952
+1 0 0 [ 1.48 4.43 ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3072
+9216 3072
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 256
+2304 3104
+2331 3133
+2358 3151
+2385 3172
+2412 3182
+2439 3195
+2466 3211
+2493 3226
+2520 3230
+2547 3238
+2574 3248
+2601 3257
+2628 3269
+2655 3280
+2682 3291
+2709 3302
+2736 3272
+2763 3253
+2790 3244
+2817 3233
+2844 3233
+2871 3230
+2898 3224
+2925 3219
+2952 3170
+2979 3133
+3006 3107
+3033 3079
+3060 3062
+3087 3042
+3114 3018
+3141 2996
+3168 3041
+3195 3068
+3222 3077
+3249 3091
+3276 3087
+3303 3088
+3330 3093
+3357 3097
+3384 3083
+3411 3074
+3438 3070
+3465 3064
+3492 3064
+3519 3062
+3546 3059
+3573 3056
+3600 3044
+3627 3036
+3654 3029
+3681 3022
+3708 3016
+3735 3011
+3762 3004
+3789 2998
+3816 2918
+3843 2858
+3870 2817
+3897 2771
+3924 2760
+3951 2739
+3978 2709
+4005 2681
+4032 3062
+4059 3334
+4086 3727
+4113 4088
+4140 4611
+4167 5091
+4194 5289
+4221 5563
+4248 5317
+4275 5210
+4302 4533
+4329 4009
+4356 3548
+4383 3070
+4410 2955
+4437 2743
+4464 2875
+4491 2915
+4518 2863
+4545 2836
+4572 2893
+4599 2928
+4626 2940
+4653 2958
+4680 2933
+4707 2920
+4734 2918
+4761 2913
+4788 2920
+4815 2924
+4842 2924
+4869 2925
+4896 2920
+4923 2917
+4950 2916
+4977 2913
+5004 2913
+5031 2912
+5058 2911
+5085 2910
+5112 2910
+5139 2910
+5166 2910
+5193 2910
+5220 2909
+5247 2908
+5274 2908
+5301 2907
+5328 2907
+5355 2907
+5382 2907
+5409 2906
+5436 2906
+5463 2905
+5490 2905
+5517 2905
+5544 2904
+5571 2904
+5598 2903
+5625 2903
+5652 2902
+5679 2902
+5706 2902
+5733 2901
+5760 2901
+5787 2901
+5814 2900
+5841 2900
+5868 2900
+5895 2900
+5922 2899
+5949 2899
+5976 2899
+6003 2898
+6030 2898
+6057 2898
+6084 2897
+6111 2897
+6138 2897
+6165 2896
+6192 2896
+6219 2895
+6246 2895
+6273 2895
+6300 2894
+6327 2894
+6354 2894
+6381 2893
+6408 2893
+6435 2892
+6462 2892
+6489 2892
+6516 2891
+6543 2891
+6570 2891
+6597 2890
+6624 2873
+6651 2860
+6678 2852
+6705 2843
+6732 2838
+6759 2832
+6786 2824
+6813 2817
+6840 2815
+6867 2811
+6894 2806
+6921 2802
+6948 2796
+6975 2791
+7002 2785
+7029 2780
+7056 2839
+7083 2881
+7110 2906
+7137 2935
+7164 2947
+7191 2964
+7218 2985
+7245 3005
+7272 3008
+7299 3015
+7326 3027
+7353 3038
+7380 3053
+7407 3067
+7434 3080
+7461 3093
+7488 3068
+7515 3052
+7542 3048
+7569 3040
+7596 3043
+7623 3043
+7650 3040
+7677 3038
+7704 3046
+7731 3052
+7758 3055
+7785 3058
+7812 3059
+7839 3061
+7866 3063
+7893 3065
+7920 3077
+7947 3087
+7974 3094
+8001 3102
+8028 3106
+8055 3112
+8082 3118
+8109 3125
+8136 3128
+8163 3132
+8190 3137
+8217 3142
+8244 3147
+8271 3152
+8298 3157
+8325 3162
+8352 3139
+8379 3123
+8406 3115
+8433 3105
+8460 3102
+8487 3097
+8514 3091
+8541 3085
+8568 3086
+8595 3086
+8622 3083
+8649 3081
+8676 3077
+8703 3073
+8730 3070
+8757 3067
+8784 3072
+8811 3074
+8838 3075
+8865 3076
+8892 3074
+8919 3074
+8946 3074
+8973 3074
+9000 3072
+9027 3070
+9054 3069
+9081 3068
+9108 3067
+9135 3066
+9162 3065
+9189 3064
+256 MLine
+End
+
+%%PageTrailer
+End %I eop
+showpage
+
+%%Trailer
+end
+%%EOF
diff --git a/gsl-1.9/doc/dwt.texi b/gsl-1.9/doc/dwt.texi
new file mode 100644
index 0000000..fa80b19
--- /dev/null
+++ b/gsl-1.9/doc/dwt.texi
@@ -0,0 +1,449 @@
+@cindex DWT, see wavelet transforms
+@cindex wavelet transforms
+@cindex transforms, wavelet
+
+This chapter describes functions for performing Discrete Wavelet
+Transforms (DWTs). The library includes wavelets for real data in both
+one and two dimensions. The wavelet functions are declared in the header
+files @file{gsl_wavelet.h} and @file{gsl_wavelet2d.h}.
+
+@menu
+* DWT Definitions::
+* DWT Initialization::
+* DWT Transform Functions::
+* DWT Examples::
+* DWT References::
+@end menu
+
+@node DWT Definitions
+@section Definitions
+@cindex DWT, mathematical definition
+
+The continuous wavelet transform and its inverse are defined by
+the relations,
+@iftex
+@tex
+\beforedisplay
+$$
+w(s, \tau) = \int_{-\infty}^\infty f(t) * \psi^*_{s,\tau}(t) dt
+$$
+\afterdisplay
+@end tex
+@end iftex
+@ifinfo
+
+@example
+w(s,\tau) = \int f(t) * \psi^*_@{s,\tau@}(t) dt
+@end example
+
+@end ifinfo
+@noindent
+and,
+@tex
+\beforedisplay
+$$
+f(t) = \int_0^\infty ds \int_{-\infty}^\infty w(s, \tau) * \psi_{s,\tau}(t) d\tau
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+f(t) = \int \int_@{-\infty@}^\infty w(s, \tau) * \psi_@{s,\tau@}(t) d\tau ds
+@end example
+
+@end ifinfo
+@noindent
+where the basis functions @c{$\psi_{s,\tau}$}
+@math{\psi_@{s,\tau@}} are obtained by scaling
+and translation from a single function, referred to as the @dfn{mother
+wavelet}.
+
+The discrete version of the wavelet transform acts on equally-spaced
+samples, with fixed scaling and translation steps (@math{s},
+@math{\tau}). The frequency and time axes are sampled @dfn{dyadically}
+on scales of @math{2^j} through a level parameter @math{j}.
+@c The wavelet @math{\psi}
+@c can be expressed in terms of a scaling function @math{\varphi},
+@c
+@c @tex
+@c \beforedisplay
+@c $$
+@c \psi(2^{j-1},t) = \sum_{k=0}^{2^j-1} g_j(k) * \bar{\varphi}(2^j t-k)
+@c $$
+@c \afterdisplay
+@c @end tex
+@c @ifinfo
+@c @example
+@c \psi(2^@{j-1@},t) = \sum_@{k=0@}^@{2^j-1@} g_j(k) * \bar@{\varphi@}(2^j t-k)
+@c @end example
+@c @end ifinfo
+@c @noindent
+@c and
+@c
+@c @tex
+@c \beforedisplay
+@c $$
+@c \varphi(2^{j-1},t) = \sum_{k=0}^{2^j-1} h_j(k) * \bar{\varphi}(2^j t-k)
+@c $$
+@c \afterdisplay
+@c @end tex
+@c @ifinfo
+@c @example
+@c \varphi(2^@{j-1@},t) = \sum_@{k=0@}^@{2^j-1@} h_j(k) * \bar@{\varphi@}(2^j t-k)
+@c @end example
+@c @end ifinfo
+@c @noindent
+@c The functions @math{\psi} and @math{\varphi} are related through the
+@c coefficients
+@c @c{$g_{n} = (-1)^n h_{L-1-n}$}
+@c @math{g_@{n@} = (-1)^n h_@{L-1-n@}}
+@c for @c{$n=0 \dots L-1$}
+@c @math{n=0 ... L-1},
+@c where @math{L} is the total number of coefficients. The two sets of
+@c coefficients @math{h_j} and @math{g_i} define the scaling function and
+@c the wavelet.
+The resulting family of functions @c{$\{\psi_{j,n}\}$}
+@math{@{\psi_@{j,n@}@}}
+constitutes an orthonormal
+basis for square-integrable signals.
+
+The discrete wavelet transform is an @math{O(N)} algorithm, and is also
+referred to as the @dfn{fast wavelet transform}.
+
+@node DWT Initialization
+@section Initialization
+@cindex DWT initialization
+
+The @code{gsl_wavelet} structure contains the filter coefficients
+defining the wavelet and any associated offset parameters.
+
+@deftypefun {gsl_wavelet *} gsl_wavelet_alloc (const gsl_wavelet_type * @var{T}, size_t @var{k})
+This function allocates and initializes a wavelet object of type
+@var{T}. The parameter @var{k} selects the specific member of the
+wavelet family. A null pointer is returned if insufficient memory is
+available or if a unsupported member is selected.
+@end deftypefun
+
+The following wavelet types are implemented:
+
+@deffn {Wavelet} gsl_wavelet_daubechies
+@deffnx {Wavelet} gsl_wavelet_daubechies_centered
+@cindex Daubechies wavelets
+@cindex maximal phase, Daubechies wavelets
+The is the Daubechies wavelet family of maximum phase with @math{k/2}
+vanishing moments. The implemented wavelets are
+@c{$k=4, 6, \dots, 20$}
+@math{k=4, 6, @dots{}, 20}, with @var{k} even.
+@end deffn
+
+@deffn {Wavelet} gsl_wavelet_haar
+@deffnx {Wavelet} gsl_wavelet_haar_centered
+@cindex Haar wavelets
+This is the Haar wavelet. The only valid choice of @math{k} for the
+Haar wavelet is @math{k=2}.
+@end deffn
+
+@deffn {Wavelet} gsl_wavelet_bspline
+@deffnx {Wavelet} gsl_wavelet_bspline_centered
+@cindex biorthogonal wavelets
+@cindex B-spline wavelets
+This is the biorthogonal B-spline wavelet family of order @math{(i,j)}.
+The implemented values of @math{k = 100*i + j} are 103, 105, 202, 204,
+206, 208, 301, 303, 305 307, 309.
+@end deffn
+
+@noindent
+The centered forms of the wavelets align the coefficients of the various
+sub-bands on edges. Thus the resulting visualization of the
+coefficients of the wavelet transform in the phase plane is easier to
+understand.
+
+@deftypefun {const char *} gsl_wavelet_name (const gsl_wavelet * @var{w})
+This function returns a pointer to the name of the wavelet family for
+@var{w}.
+@end deftypefun
+
+@c @deftypefun {void} gsl_wavelet_print (const gsl_wavelet * @var{w})
+@c This function prints the filter coefficients (@code{**h1}, @code{**g1}, @code{**h2}, @code{**g2}) of the wavelet object @var{w}.
+@c @end deftypefun
+
+@deftypefun {void} gsl_wavelet_free (gsl_wavelet * @var{w})
+This function frees the wavelet object @var{w}.
+@end deftypefun
+
+The @code{gsl_wavelet_workspace} structure contains scratch space of the
+same size as the input data and is used to hold intermediate results
+during the transform.
+
+@deftypefun {gsl_wavelet_workspace *} gsl_wavelet_workspace_alloc (size_t @var{n})
+This function allocates a workspace for the discrete wavelet transform.
+To perform a one-dimensional transform on @var{n} elements, a workspace
+of size @var{n} must be provided. For two-dimensional transforms of
+@var{n}-by-@var{n} matrices it is sufficient to allocate a workspace of
+size @var{n}, since the transform operates on individual rows and
+columns.
+@end deftypefun
+
+@deftypefun {void} gsl_wavelet_workspace_free (gsl_wavelet_workspace * @var{work})
+This function frees the allocated workspace @var{work}.
+@end deftypefun
+
+@node DWT Transform Functions
+@section Transform Functions
+
+This sections describes the actual functions performing the discrete
+wavelet transform. Note that the transforms use periodic boundary
+conditions. If the signal is not periodic in the sample length then
+spurious coefficients will appear at the beginning and end of each level
+of the transform.
+
+@menu
+* DWT in one dimension::
+* DWT in two dimension::
+@end menu
+
+@node DWT in one dimension
+@subsection Wavelet transforms in one dimension
+@cindex DWT, one dimensional
+
+@deftypefun int gsl_wavelet_transform (const gsl_wavelet * @var{w}, double * @var{data}, size_t @var{stride}, size_t @var{n}, gsl_wavelet_direction @var{dir}, gsl_wavelet_workspace * @var{work})
+@deftypefunx int gsl_wavelet_transform_forward (const gsl_wavelet * @var{w}, double * @var{data}, size_t @var{stride}, size_t @var{n}, gsl_wavelet_workspace * @var{work})
+@deftypefunx int gsl_wavelet_transform_inverse (const gsl_wavelet * @var{w}, double * @var{data}, size_t @var{stride}, size_t @var{n}, gsl_wavelet_workspace * @var{work})
+
+These functions compute in-place forward and inverse discrete wavelet
+transforms of length @var{n} with stride @var{stride} on the array
+@var{data}. The length of the transform @var{n} is restricted to powers
+of two. For the @code{transform} version of the function the argument
+@var{dir} can be either @code{forward} (@math{+1}) or @code{backward}
+(@math{-1}). A workspace @var{work} of length @var{n} must be provided.
+
+For the forward transform, the elements of the original array are
+replaced by the discrete wavelet
+transform @c{$f_i \rightarrow w_{j,k}$}
+@math{f_i -> w_@{j,k@}}
+in a packed triangular storage layout,
+where @var{j} is the index of the level
+@c{$j = 0 \dots J-1$}
+@math{j = 0 ... J-1}
+and
+@var{k} is the index of the coefficient within each level,
+@c{$k = 0 \dots 2^j - 1$}
+@math{k = 0 ... (2^j)-1}.
+The total number of levels is @math{J = \log_2(n)}. The output data
+has the following form,
+@tex
+\beforedisplay
+$$
+(s_{-1,0}, d_{0,0}, d_{1,0}, d_{1,1}, d_{2,0},\cdots, d_{j,k},\cdots, d_{J-1,2^{J-1} - 1})
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+(s_@{-1,0@}, d_@{0,0@}, d_@{1,0@}, d_@{1,1@}, d_@{2,0@}, ...,
+ d_@{j,k@}, ..., d_@{J-1,2^@{J-1@}-1@})
+@end example
+
+@end ifinfo
+@noindent
+where the first element is the smoothing coefficient @c{$s_{-1,0}$}
+@math{s_@{-1,0@}}, followed by the detail coefficients @c{$d_{j,k}$}
+@math{d_@{j,k@}} for each level
+@math{j}. The backward transform inverts these coefficients to obtain
+the original data.
+
+These functions return a status of @code{GSL_SUCCESS} upon successful
+completion. @code{GSL_EINVAL} is returned if @var{n} is not an integer
+power of 2 or if insufficient workspace is provided.
+@end deftypefun
+
+@node DWT in two dimension
+@subsection Wavelet transforms in two dimension
+@cindex DWT, two dimensional
+
+The library provides functions to perform two-dimensional discrete
+wavelet transforms on square matrices. The matrix dimensions must be an
+integer power of two. There are two possible orderings of the rows and
+columns in the two-dimensional wavelet transform, referred to as the
+``standard'' and ``non-standard'' forms.
+
+The ``standard'' transform performs a complete discrete wavelet
+transform on the rows of the matrix, followed by a separate complete
+discrete wavelet transform on the columns of the resulting
+row-transformed matrix. This procedure uses the same ordering as a
+two-dimensional fourier transform.
+
+The ``non-standard'' transform is performed in interleaved passes on the
+rows and columns of the matrix for each level of the transform. The
+first level of the transform is applied to the matrix rows, and then to
+the matrix columns. This procedure is then repeated across the rows and
+columns of the data for the subsequent levels of the transform, until
+the full discrete wavelet transform is complete. The non-standard form
+of the discrete wavelet transform is typically used in image analysis.
+
+The functions described in this section are declared in the header file
+@file{gsl_wavelet2d.h}.
+
+@deftypefun {int} gsl_wavelet2d_transform (const gsl_wavelet * @var{w}, double * @var{data}, size_t @var{tda}, size_t @var{size1}, size_t @var{size2}, gsl_wavelet_direction @var{dir}, gsl_wavelet_workspace * @var{work})
+@deftypefunx {int} gsl_wavelet2d_transform_forward (const gsl_wavelet * @var{w}, double * @var{data}, size_t @var{tda}, size_t @var{size1}, size_t @var{size2}, gsl_wavelet_workspace * @var{work})
+@deftypefunx {int} gsl_wavelet2d_transform_inverse (const gsl_wavelet * @var{w}, double * @var{data}, size_t @var{tda}, size_t @var{size1}, size_t @var{size2}, gsl_wavelet_workspace * @var{work})
+
+These functions compute two-dimensional in-place forward and inverse
+discrete wavelet transforms in standard and non-standard forms on the
+array @var{data} stored in row-major form with dimensions @var{size1}
+and @var{size2} and physical row length @var{tda}. The dimensions must
+be equal (square matrix) and are restricted to powers of two. For the
+@code{transform} version of the function the argument @var{dir} can be
+either @code{forward} (@math{+1}) or @code{backward} (@math{-1}). A
+workspace @var{work} of the appropriate size must be provided. On exit,
+the appropriate elements of the array @var{data} are replaced by their
+two-dimensional wavelet transform.
+
+The functions return a status of @code{GSL_SUCCESS} upon successful
+completion. @code{GSL_EINVAL} is returned if @var{size1} and
+@var{size2} are not equal and integer powers of 2, or if insufficient
+workspace is provided.
+@end deftypefun
+
+@deftypefun {int} gsl_wavelet2d_transform_matrix (const gsl_wavelet * @var{w}, gsl_matrix * @var{m}, gsl_wavelet_direction @var{dir}, gsl_wavelet_workspace * @var{work})
+@deftypefunx {int} gsl_wavelet2d_transform_matrix_forward (const gsl_wavelet * @var{w}, gsl_matrix * @var{m}, gsl_wavelet_workspace * @var{work})
+@deftypefunx {int} gsl_wavelet2d_transform_matrix_inverse (const gsl_wavelet * @var{w}, gsl_matrix * @var{m}, gsl_wavelet_workspace * @var{work})
+These functions compute the two-dimensional in-place wavelet transform
+on a matrix @var{a}.
+@end deftypefun
+
+@deftypefun {int} gsl_wavelet2d_nstransform (const gsl_wavelet * @var{w}, double * @var{data}, size_t @var{tda}, size_t @var{size1}, size_t @var{size2}, gsl_wavelet_direction @var{dir}, gsl_wavelet_workspace * @var{work})
+@deftypefunx {int} gsl_wavelet2d_nstransform_forward (const gsl_wavelet * @var{w}, double * @var{data}, size_t @var{tda}, size_t @var{size1}, size_t @var{size2}, gsl_wavelet_workspace * @var{work})
+@deftypefunx {int} gsl_wavelet2d_nstransform_inverse (const gsl_wavelet * @var{w}, double * @var{data}, size_t @var{tda}, size_t @var{size1}, size_t @var{size2}, gsl_wavelet_workspace * @var{work})
+These functions compute the two-dimensional wavelet transform in
+non-standard form.
+@end deftypefun
+
+@deftypefun {int} gsl_wavelet2d_nstransform_matrix (const gsl_wavelet * @var{w}, gsl_matrix * @var{m}, gsl_wavelet_direction @var{dir}, gsl_wavelet_workspace * @var{work})
+@deftypefunx {int} gsl_wavelet2d_nstransform_matrix_forward (const gsl_wavelet * @var{w}, gsl_matrix * @var{m}, gsl_wavelet_workspace * @var{work})
+@deftypefunx {int} gsl_wavelet2d_nstransform_matrix_inverse (const gsl_wavelet * @var{w}, gsl_matrix * @var{m}, gsl_wavelet_workspace * @var{work})
+These functions compute the non-standard form of the two-dimensional
+in-place wavelet transform on a matrix @var{a}.
+@end deftypefun
+
+@node DWT Examples
+@section Examples
+
+The following program demonstrates the use of the one-dimensional
+wavelet transform functions. It computes an approximation to an input
+signal (of length 256) using the 20 largest components of the wavelet
+transform, while setting the others to zero.
+
+@example
+@verbatiminclude examples/dwt.c
+@end example
+
+@noindent
+The output can be used with the @sc{gnu} plotutils @code{graph} program,
+
+@example
+$ ./a.out ecg.dat > dwt.dat
+$ graph -T ps -x 0 256 32 -h 0.3 -a dwt.dat > dwt.ps
+@end example
+
+@iftex
+The graphs below show an original and compressed version of a sample ECG
+recording from the MIT-BIH Arrhythmia Database, part of the PhysioNet
+archive of public-domain of medical datasets.
+
+@sp 1
+@center @image{dwt-orig,3.4in}
+@center @image{dwt-samp,3.4in}
+@quotation
+Original (upper) and wavelet-compressed (lower) ECG signals, using the
+20 largest components of the Daubechies(4) discrete wavelet transform.
+@end quotation
+@end iftex
+
+@node DWT References
+@section References and Further Reading
+
+The mathematical background to wavelet transforms is covered in the
+original lectures by Daubechies,
+
+@itemize @asis
+@item
+Ingrid Daubechies.
+Ten Lectures on Wavelets.
+@cite{CBMS-NSF Regional Conference Series in Applied Mathematics} (1992),
+SIAM, ISBN 0898712742.
+@end itemize
+
+@noindent
+An easy to read introduction to the subject with an emphasis on the
+application of the wavelet transform in various branches of science is,
+
+@itemize @asis
+@item
+Paul S. Addison. @cite{The Illustrated Wavelet Transform Handbook}.
+Institute of Physics Publishing (2002), ISBN 0750306920.
+@end itemize
+
+@noindent
+For extensive coverage of signal analysis by wavelets, wavelet packets
+and local cosine bases see,
+
+@itemize @asis
+@item
+S. G. Mallat. @cite{A wavelet tour of signal processing} (Second
+edition). Academic Press (1999), ISBN 012466606X.
+@end itemize
+
+@noindent
+The concept of multiresolution analysis underlying the wavelet transform
+is described in,
+
+@itemize @asis
+@item
+S. G. Mallat.
+Multiresolution Approximations and Wavelet Orthonormal Bases of L@math{^2}(R).
+@cite{Transactions of the American Mathematical Society}, 315(1), 1989, 69--87.
+@end itemize
+
+@itemize @asis
+@item
+S. G. Mallat.
+A Theory for Multiresolution Signal Decomposition---The Wavelet Representation.
+@cite{IEEE Transactions on Pattern Analysis and Machine Intelligence}, 11, 1989,
+674--693.
+@end itemize
+
+@noindent
+The coefficients for the individual wavelet families implemented by the
+library can be found in the following papers,
+
+@itemize @asis
+@item
+I. Daubechies.
+Orthonormal Bases of Compactly Supported Wavelets.
+@cite{Communications on Pure and Applied Mathematics}, 41 (1988) 909--996.
+@end itemize
+
+@itemize @asis
+@item
+A. Cohen, I. Daubechies, and J.-C. Feauveau.
+Biorthogonal Bases of Compactly Supported Wavelets.
+@cite{Communications on Pure and Applied Mathematics}, 45 (1992)
+485--560.
+@end itemize
+
+@noindent
+The PhysioNet archive of physiological datasets can be found online at
+@uref{http://www.physionet.org/} and is described in the following
+paper,
+
+@itemize @asis
+@item
+Goldberger et al.
+PhysioBank, PhysioToolkit, and PhysioNet: Components
+of a New Research Resource for Complex Physiologic
+Signals.
+@cite{Circulation} 101(23):e215-e220 2000.
+@end itemize
diff --git a/gsl-1.9/doc/eigen.texi b/gsl-1.9/doc/eigen.texi
new file mode 100644
index 0000000..e2c291a
--- /dev/null
+++ b/gsl-1.9/doc/eigen.texi
@@ -0,0 +1,462 @@
+@cindex eigenvalues and eigenvectors
+This chapter describes functions for computing eigenvalues and
+eigenvectors of matrices. There are routines for real symmetric,
+real nonsymmetric, and complex hermitian matrices. Eigenvalues can
+be computed with or without eigenvectors. The hermitian matrix algorithms
+used are symmetric bidiagonalization followed by QR reduction. The
+nonsymmetric algorithm is the Francis QR double-shift.
+
+@cindex LAPACK, recommended for linear algebra
+These routines are intended for ``small'' systems where simple algorithms are
+acceptable. Anyone interested in finding eigenvalues and eigenvectors of
+large matrices will want to use the sophisticated routines found in
+@sc{lapack}. The Fortran version of @sc{lapack} is recommended as the
+standard package for large-scale linear algebra.
+
+The functions described in this chapter are declared in the header file
+@file{gsl_eigen.h}.
+
+@menu
+* Real Symmetric Matrices::
+* Complex Hermitian Matrices::
+* Real Nonsymmetric Matrices::
+* Sorting Eigenvalues and Eigenvectors::
+* Eigenvalue and Eigenvector Examples::
+* Eigenvalue and Eigenvector References::
+@end menu
+
+@node Real Symmetric Matrices
+@section Real Symmetric Matrices
+@cindex symmetric matrix, real, eigensystem
+@cindex real symmetric matrix, eigensystem
+
+@deftypefun {gsl_eigen_symm_workspace *} gsl_eigen_symm_alloc (const size_t @var{n})
+This function allocates a workspace for computing eigenvalues of
+@var{n}-by-@var{n} real symmetric matrices. The size of the workspace
+is @math{O(2n)}.
+@end deftypefun
+
+@deftypefun void gsl_eigen_symm_free (gsl_eigen_symm_workspace * @var{w})
+This function frees the memory associated with the workspace @var{w}.
+@end deftypefun
+
+@deftypefun int gsl_eigen_symm (gsl_matrix * @var{A}, gsl_vector * @var{eval}, gsl_eigen_symm_workspace * @var{w})
+This function computes the eigenvalues of the real symmetric matrix
+@var{A}. Additional workspace of the appropriate size must be provided
+in @var{w}. The diagonal and lower triangular part of @var{A} are
+destroyed during the computation, but the strict upper triangular part
+is not referenced. The eigenvalues are stored in the vector @var{eval}
+and are unordered.
+@end deftypefun
+
+@deftypefun {gsl_eigen_symmv_workspace *} gsl_eigen_symmv_alloc (const size_t @var{n})
+This function allocates a workspace for computing eigenvalues and
+eigenvectors of @var{n}-by-@var{n} real symmetric matrices. The size of
+the workspace is @math{O(4n)}.
+@end deftypefun
+
+@deftypefun void gsl_eigen_symmv_free (gsl_eigen_symmv_workspace * @var{w})
+This function frees the memory associated with the workspace @var{w}.
+@end deftypefun
+
+@deftypefun int gsl_eigen_symmv (gsl_matrix * @var{A}, gsl_vector * @var{eval}, gsl_matrix * @var{evec}, gsl_eigen_symmv_workspace * @var{w})
+This function computes the eigenvalues and eigenvectors of the real
+symmetric matrix @var{A}. Additional workspace of the appropriate size
+must be provided in @var{w}. The diagonal and lower triangular part of
+@var{A} are destroyed during the computation, but the strict upper
+triangular part is not referenced. The eigenvalues are stored in the
+vector @var{eval} and are unordered. The corresponding eigenvectors are
+stored in the columns of the matrix @var{evec}. For example, the
+eigenvector in the first column corresponds to the first eigenvalue.
+The eigenvectors are guaranteed to be mutually orthogonal and normalised
+to unit magnitude.
+@end deftypefun
+
+@node Complex Hermitian Matrices
+@section Complex Hermitian Matrices
+
+@cindex hermitian matrix, complex, eigensystem
+@cindex complex hermitian matrix, eigensystem
+
+@deftypefun {gsl_eigen_herm_workspace *} gsl_eigen_herm_alloc (const size_t @var{n})
+This function allocates a workspace for computing eigenvalues of
+@var{n}-by-@var{n} complex hermitian matrices. The size of the workspace
+is @math{O(3n)}.
+@end deftypefun
+
+@deftypefun void gsl_eigen_herm_free (gsl_eigen_herm_workspace * @var{w})
+This function frees the memory associated with the workspace @var{w}.
+@end deftypefun
+
+@deftypefun int gsl_eigen_herm (gsl_matrix_complex * @var{A}, gsl_vector * @var{eval}, gsl_eigen_herm_workspace * @var{w})
+This function computes the eigenvalues of the complex hermitian matrix
+@var{A}. Additional workspace of the appropriate size must be provided
+in @var{w}. The diagonal and lower triangular part of @var{A} are
+destroyed during the computation, but the strict upper triangular part
+is not referenced. The imaginary parts of the diagonal are assumed to be
+zero and are not referenced. The eigenvalues are stored in the vector
+@var{eval} and are unordered.
+@end deftypefun
+
+@deftypefun {gsl_eigen_hermv_workspace *} gsl_eigen_hermv_alloc (const size_t @var{n})
+This function allocates a workspace for computing eigenvalues and
+eigenvectors of @var{n}-by-@var{n} complex hermitian matrices. The size of
+the workspace is @math{O(5n)}.
+@end deftypefun
+
+@deftypefun void gsl_eigen_hermv_free (gsl_eigen_hermv_workspace * @var{w})
+This function frees the memory associated with the workspace @var{w}.
+@end deftypefun
+
+@deftypefun int gsl_eigen_hermv (gsl_matrix_complex * @var{A}, gsl_vector * @var{eval}, gsl_matrix_complex * @var{evec}, gsl_eigen_hermv_workspace * @var{w})
+This function computes the eigenvalues and eigenvectors of the complex
+hermitian matrix @var{A}. Additional workspace of the appropriate size
+must be provided in @var{w}. The diagonal and lower triangular part of
+@var{A} are destroyed during the computation, but the strict upper
+triangular part is not referenced. The imaginary parts of the diagonal
+are assumed to be zero and are not referenced. The eigenvalues are
+stored in the vector @var{eval} and are unordered. The corresponding
+complex eigenvectors are stored in the columns of the matrix @var{evec}.
+For example, the eigenvector in the first column corresponds to the
+first eigenvalue. The eigenvectors are guaranteed to be mutually
+orthogonal and normalised to unit magnitude.
+@end deftypefun
+
+@node Real Nonsymmetric Matrices
+@section Real Nonsymmetric Matrices
+@cindex nonsymmetric matrix, real, eigensystem
+@cindex real nonsymmetric matrix, eigensystem
+
+The solution of the real nonsymmetric eigensystem problem for a
+matrix @math{A} involves computing the Schur decomposition
+@tex
+\beforedisplay
+$$
+A = Z T Z^T
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+A = Z T Z^T
+@end example
+
+@end ifinfo
+where @math{Z} is an orthogonal matrix of Schur vectors and @math{T},
+the Schur form, is quasi upper triangular with diagonal
+@math{1}-by-@math{1} blocks which are real eigenvalues of @math{A}, and
+diagonal @math{2}-by-@math{2} blocks whose eigenvalues are complex
+conjugate eigenvalues of @math{A}. The algorithm used is the double
+shift Francis method.
+
+@deftypefun {gsl_eigen_nonsymm_workspace *} gsl_eigen_nonsymm_alloc (const size_t @var{n})
+This function allocates a workspace for computing eigenvalues of
+@var{n}-by-@var{n} real nonsymmetric matrices. The size of the workspace
+is @math{O(2n)}.
+@end deftypefun
+
+@deftypefun void gsl_eigen_nonsymm_free (gsl_eigen_nonsymm_workspace * @var{w})
+This function frees the memory associated with the workspace @var{w}.
+@end deftypefun
+
+@deftypefun void gsl_eigen_nonsymm_params (const int @var{compute_t}, const int @var{balance}, gsl_eigen_nonsymm_workspace * @var{w})
+This function sets some parameters which determine how the eigenvalue
+problem is solved in subsequent calls to @code{gsl_eigen_nonsymm}.
+
+If @var{compute_t} is set to 1, the full Schur form @math{T} will be
+computed by @code{gsl_eigen_nonsymm}. If it is set to 0,
+@math{T} will not be computed (this is the default setting). Computing
+the full Schur form @math{T} requires approximately 1.5-2 times the
+number of flops.
+
+If @var{balance} is set to 1, a balancing transformation is applied
+to the matrix prior to computing eigenvalues. This transformation is
+designed to make the rows and columns of the matrix have comparable
+norms, and can result in more accurate eigenvalues for matrices
+whose entries vary widely in magnitude. See @ref{Balancing} for more
+information. Note that the balancing transformation does not preserve
+the orthogonality of the Schur vectors, so if you wish to compute the
+Schur vectors with @code{gsl_eigen_nonsymm_Z} you will obtain the Schur
+vectors of the balanced matrix instead of the original matrix. The
+relationship will be
+@tex
+\beforedisplay
+$$
+T = Q^t D^{-1} A D Q
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+T = Q^t D^(-1) A D Q
+@end example
+
+@end ifinfo
+@noindent
+where @var{Q} is the matrix of Schur vectors for the balanced matrix, and
+@var{D} is the balancing transformation. Then @code{gsl_eigen_nonsymm_Z}
+will compute a matrix @var{Z} which satisfies
+@tex
+\beforedisplay
+$$
+T = Z^{-1} A Z
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+T = Z^(-1) A Z
+@end example
+
+@end ifinfo
+@noindent
+with @math{Z = D Q}. Note that @var{Z} will not be orthogonal. For
+this reason, balancing is not performed by default.
+@end deftypefun
+
+@deftypefun int gsl_eigen_nonsymm (gsl_matrix * @var{A}, gsl_vector_complex * @var{eval}, gsl_eigen_nonsymm_workspace * @var{w})
+This function computes the eigenvalues of the real nonsymmetric matrix
+@var{A} and stores them in the vector @var{eval}. If @math{T} is
+desired, it is stored in the upper portion of @var{A} on output.
+Otherwise, on output, the diagonal of @var{A} will contain the
+@math{1}-by-@math{1} real eigenvalues and @math{2}-by-@math{2}
+complex conjugate eigenvalue systems, and the rest of @var{A} is
+destroyed. In rare cases, this function will fail to find all
+eigenvalues. If this happens, an error code is returned
+and the number of converged eigenvalues is stored in @code{w->n_evals}.
+The converged eigenvalues are stored in the beginning of @var{eval}.
+@end deftypefun
+
+@deftypefun int gsl_eigen_nonsymm_Z (gsl_matrix * @var{A}, gsl_vector_complex * @var{eval}, gsl_matrix * @var{Z}, gsl_eigen_nonsymm_workspace * @var{w})
+This function is identical to @code{gsl_eigen_nonsymm} except it also
+computes the Schur vectors and stores them into @var{Z}.
+@end deftypefun
+
+@deftypefun {gsl_eigen_nonsymmv_workspace *} gsl_eigen_nonsymmv_alloc (const size_t @var{n})
+This function allocates a workspace for computing eigenvalues and
+eigenvectors of @var{n}-by-@var{n} real nonsymmetric matrices. The
+size of the workspace is @math{O(5n)}.
+@end deftypefun
+
+@deftypefun void gsl_eigen_nonsymmv_free (gsl_eigen_nonsymmv_workspace * @var{w})
+This function frees the memory associated with the workspace @var{w}.
+@end deftypefun
+
+@deftypefun int gsl_eigen_nonsymmv (gsl_matrix * @var{A}, gsl_vector_complex * @var{eval}, gsl_matrix_complex * @var{evec}, gsl_eigen_nonsymmv_workspace * @var{w})
+This function computes eigenvalues and right eigenvectors of the
+@var{n}-by-@var{n} real nonsymmetric matrix @var{A}. It first calls
+@code{gsl_eigen_nonsymm} to compute the eigenvalues, Schur form @math{T}, and
+Schur vectors. Then it finds eigenvectors of @math{T} and backtransforms
+them using the Schur vectors. The Schur vectors are destroyed in the
+process, but can be saved by using @code{gsl_eigen_nonsymmv_Z}. The
+computed eigenvectors are normalized to have Euclidean norm 1. On
+output, the upper portion of @var{A} contains the Schur form
+@math{T}. If @code{gsl_eigen_nonsymm} fails, no eigenvectors are
+computed, and an error code is returned.
+@end deftypefun
+
+@deftypefun int gsl_eigen_nonsymmv_Z (gsl_matrix * @var{A}, gsl_vector_complex * @var{eval}, gsl_matrix_complex * @var{evec}, gsl_matrix * @var{Z}, gsl_eigen_nonsymmv_workspace * @var{w})
+This function is identical to @code{gsl_eigen_nonsymmv} except it also saves
+the Schur vectors into @var{Z}.
+@end deftypefun
+
+@node Sorting Eigenvalues and Eigenvectors
+@section Sorting Eigenvalues and Eigenvectors
+@cindex sorting eigenvalues and eigenvectors
+
+@deftypefun int gsl_eigen_symmv_sort (gsl_vector * @var{eval}, gsl_matrix * @var{evec}, gsl_eigen_sort_t @var{sort_type})
+This function simultaneously sorts the eigenvalues stored in the vector
+@var{eval} and the corresponding real eigenvectors stored in the columns
+of the matrix @var{evec} into ascending or descending order according to
+the value of the parameter @var{sort_type},
+
+@table @code
+@item GSL_EIGEN_SORT_VAL_ASC
+ascending order in numerical value
+@item GSL_EIGEN_SORT_VAL_DESC
+descending order in numerical value
+@item GSL_EIGEN_SORT_ABS_ASC
+ascending order in magnitude
+@item GSL_EIGEN_SORT_ABS_DESC
+descending order in magnitude
+@end table
+
+@end deftypefun
+
+@deftypefun int gsl_eigen_hermv_sort (gsl_vector * @var{eval}, gsl_matrix_complex * @var{evec}, gsl_eigen_sort_t @var{sort_type})
+This function simultaneously sorts the eigenvalues stored in the vector
+@var{eval} and the corresponding complex eigenvectors stored in the
+columns of the matrix @var{evec} into ascending or descending order
+according to the value of the parameter @var{sort_type} as shown above.
+@end deftypefun
+
+@deftypefun int gsl_eigen_nonsymmv_sort (gsl_vector_complex * @var{eval}, gsl_matrix_complex * @var{evec}, gsl_eigen_sort_t @var{sort_type})
+This function simultaneously sorts the eigenvalues stored in the vector
+@var{eval} and the corresponding complex eigenvectors stored in the
+columns of the matrix @var{evec} into ascending or descending order
+according to the value of the parameter @var{sort_type} as shown above.
+Only GSL_EIGEN_SORT_ABS_ASC and GSL_EIGEN_SORT_ABS_DESC are supported
+due to the eigenvalues being complex.
+@end deftypefun
+
+
+@comment @deftypefun int gsl_eigen_jacobi (gsl_matrix * @var{matrix}, gsl_vector * @var{eval}, gsl_matrix * @var{evec}, unsigned int @var{max_rot}, unsigned int * @var{nrot})
+@comment This function finds the eigenvectors and eigenvalues of a real symmetric
+@comment matrix by Jacobi iteration. The data in the input matrix is destroyed.
+@comment @end deftypefun
+
+@comment @deftypefun int gsl_la_invert_jacobi (const gsl_matrix * @var{matrix}, gsl_matrix * @var{ainv}, unsigned int @var{max_rot})
+@comment Invert a matrix by Jacobi iteration.
+@comment @end deftypefun
+
+@comment @deftypefun int gsl_eigen_sort (gsl_vector * @var{eval}, gsl_matrix * @var{evec}, gsl_eigen_sort_t @var{sort_type})
+@comment This functions sorts the eigensystem results based on eigenvalues.
+@comment Sorts in order of increasing value or increasing
+@comment absolute value, depending on the value of
+@comment @var{sort_type}, which can be @code{GSL_EIGEN_SORT_VALUE}
+@comment or @code{GSL_EIGEN_SORT_ABSVALUE}.
+@comment @end deftypefun
+
+@node Eigenvalue and Eigenvector Examples
+@section Examples
+
+The following program computes the eigenvalues and eigenvectors of the 4-th order Hilbert matrix, @math{H(i,j) = 1/(i + j + 1)}.
+
+@example
+@verbatiminclude examples/eigen.c
+@end example
+
+@noindent
+Here is the beginning of the output from the program,
+
+@example
+$ ./a.out
+eigenvalue = 9.67023e-05
+eigenvector =
+-0.0291933
+0.328712
+-0.791411
+0.514553
+...
+@end example
+
+@noindent
+This can be compared with the corresponding output from @sc{gnu octave},
+
+@example
+octave> [v,d] = eig(hilb(4));
+octave> diag(d)
+ans =
+
+ 9.6702e-05
+ 6.7383e-03
+ 1.6914e-01
+ 1.5002e+00
+
+octave> v
+v =
+
+ 0.029193 0.179186 -0.582076 0.792608
+ -0.328712 -0.741918 0.370502 0.451923
+ 0.791411 0.100228 0.509579 0.322416
+ -0.514553 0.638283 0.514048 0.252161
+@end example
+
+@noindent
+Note that the eigenvectors can differ by a change of sign, since the
+sign of an eigenvector is arbitrary.
+
+The following program illustrates the use of the nonsymmetric
+eigensolver, by computing the eigenvalues and eigenvectors of
+the Vandermonde matrix @math{V(x;i,j) = x_i^{n - j}} with
+@math{x = (-1,-2,3,4)}.
+
+@example
+@verbatiminclude examples/eigen_nonsymm.c
+@end example
+
+@noindent
+Here is the beginning of the output from the program,
+
+@example
+$ ./a.out
+eigenvalue = -6.41391 + 0i
+eigenvector =
+-0.0998822 + 0i
+-0.111251 + 0i
+0.292501 + 0i
+0.944505 + 0i
+eigenvalue = 5.54555 + 3.08545i
+eigenvector =
+-0.043487 + -0.0076308i
+0.0642377 + -0.142127i
+-0.515253 + 0.0405118i
+-0.840592 + -0.00148565i
+...
+@end example
+
+@noindent
+This can be compared with the corresponding output from @sc{gnu octave},
+
+@example
+octave> [v,d] = eig(vander([-1 -2 3 4]));
+octave> diag(d)
+ans =
+
+ -6.4139 + 0.0000i
+ 5.5456 + 3.0854i
+ 5.5456 - 3.0854i
+ 2.3228 + 0.0000i
+
+octave> v
+v =
+
+ Columns 1 through 3:
+
+ -0.09988 + 0.00000i -0.04350 - 0.00755i -0.04350 + 0.00755i
+ -0.11125 + 0.00000i 0.06399 - 0.14224i 0.06399 + 0.14224i
+ 0.29250 + 0.00000i -0.51518 + 0.04142i -0.51518 - 0.04142i
+ 0.94451 + 0.00000i -0.84059 + 0.00000i -0.84059 - 0.00000i
+
+ Column 4:
+
+ -0.14493 + 0.00000i
+ 0.35660 + 0.00000i
+ 0.91937 + 0.00000i
+ 0.08118 + 0.00000i
+
+@end example
+Note that the eigenvectors corresponding to the eigenvalue
+@math{5.54555 + 3.08545i} are slightly different. This is because
+they differ by the multiplicative constant
+@math{0.9999984 + 0.0017674i} which has magnitude 1.
+
+@node Eigenvalue and Eigenvector References
+@section References and Further Reading
+
+Further information on the algorithms described in this section can be
+found in the following book,
+
+@itemize @asis
+@item
+G. H. Golub, C. F. Van Loan, @cite{Matrix Computations} (3rd Ed, 1996),
+Johns Hopkins University Press, ISBN 0-8018-5414-8.
+@end itemize
+
+@noindent
+The @sc{lapack} library is described in,
+
+@itemize @asis
+@item
+@cite{LAPACK Users' Guide} (Third Edition, 1999), Published by SIAM,
+ISBN 0-89871-447-8.
+
+@uref{http://www.netlib.org/lapack}
+@end itemize
+
+@noindent
+The @sc{lapack} source code can be found at the website above along with
+an online copy of the users guide.
diff --git a/gsl-1.9/doc/err.texi b/gsl-1.9/doc/err.texi
new file mode 100644
index 0000000..a687120
--- /dev/null
+++ b/gsl-1.9/doc/err.texi
@@ -0,0 +1,306 @@
+@cindex error handling
+This chapter describes the way that GSL functions report and handle
+errors. By examining the status information returned by every function
+you can determine whether it succeeded or failed, and if it failed you
+can find out what the precise cause of failure was. You can also define
+your own error handling functions to modify the default behavior of the
+library.
+
+The functions described in this section are declared in the header file
+@file{gsl_errno.h}.
+
+@menu
+* Error Reporting::
+* Error Codes::
+* Error Handlers::
+* Using GSL error reporting in your own functions::
+* Error Reporting Examples::
+@end menu
+
+@node Error Reporting
+@section Error Reporting
+
+The library follows the thread-safe error reporting conventions of the
+@sc{posix} Threads library. Functions return a non-zero error code to
+indicate an error and @code{0} to indicate success.
+
+@example
+int status = gsl_function (...)
+
+if (status) @{ /* an error occurred */
+ .....
+ /* status value specifies the type of error */
+@}
+@end example
+
+The routines report an error whenever they cannot perform the task
+requested of them. For example, a root-finding function would return a
+non-zero error code if could not converge to the requested accuracy, or
+exceeded a limit on the number of iterations. Situations like this are
+a normal occurrence when using any mathematical library and you should
+check the return status of the functions that you call.
+
+Whenever a routine reports an error the return value specifies the type
+of error. The return value is analogous to the value of the variable
+@code{errno} in the C library. The caller can examine the return code
+and decide what action to take, including ignoring the error if it is
+not considered serious.
+
+In addition to reporting errors by return codes the library also has an
+error handler function @code{gsl_error}. This function is called by
+other library functions when they report an error, just before they
+return to the caller. The default behavior of the error handler is to
+print a message and abort the program,
+
+@example
+gsl: file.c:67: ERROR: invalid argument supplied by user
+Default GSL error handler invoked.
+Aborted
+@end example
+
+The purpose of the @code{gsl_error} handler is to provide a function
+where a breakpoint can be set that will catch library errors when
+running under the debugger. It is not intended for use in production
+programs, which should handle any errors using the return codes.
+
+@node Error Codes
+@section Error Codes
+@cindex error codes, reserved
+The error code numbers returned by library functions are defined in
+the file @file{gsl_errno.h}. They all have the prefix @code{GSL_} and
+expand to non-zero constant integer values. Error codes above 1024 are
+reserved for applications, and are not used by the library. Many of
+the error codes use the same base name as the corresponding error code
+in the C library. Here are some of the most common error codes,
+
+@cindex error codes
+@deftypefn {Macro} int GSL_EDOM
+Domain error; used by mathematical functions when an argument value does
+not fall into the domain over which the function is defined (like
+EDOM in the C library)
+@end deftypefn
+
+@deftypefn {Macro} int GSL_ERANGE
+Range error; used by mathematical functions when the result value is not
+representable because of overflow or underflow (like ERANGE in the C
+library)
+@end deftypefn
+
+@deftypefn {Macro} int GSL_ENOMEM
+No memory available. The system cannot allocate more virtual memory
+because its capacity is full (like ENOMEM in the C library). This error
+is reported when a GSL routine encounters problems when trying to
+allocate memory with @code{malloc}.
+@end deftypefn
+
+@deftypefn {Macro} int GSL_EINVAL
+Invalid argument. This is used to indicate various kinds of problems
+with passing the wrong argument to a library function (like EINVAL in the C
+library).
+@end deftypefn
+
+The error codes can be converted into an error message using the
+function @code{gsl_strerror}.
+
+@deftypefun {const char *} gsl_strerror (const int @var{gsl_errno})
+This function returns a pointer to a string describing the error code
+@var{gsl_errno}. For example,
+
+@example
+printf ("error: %s\n", gsl_strerror (status));
+@end example
+
+@noindent
+would print an error message like @code{error: output range error} for a
+status value of @code{GSL_ERANGE}.
+@end deftypefun
+
+@node Error Handlers
+@section Error Handlers
+@cindex Error handlers
+
+The default behavior of the GSL error handler is to print a short
+message and call @code{abort}. When this default is in use programs
+will stop with a core-dump whenever a library routine reports an error.
+This is intended as a fail-safe default for programs which do not check
+the return status of library routines (we don't encourage you to write
+programs this way).
+
+If you turn off the default error handler it is your responsibility to
+check the return values of routines and handle them yourself. You can
+also customize the error behavior by providing a new error handler. For
+example, an alternative error handler could log all errors to a file,
+ignore certain error conditions (such as underflows), or start the
+debugger and attach it to the current process when an error occurs.
+
+All GSL error handlers have the type @code{gsl_error_handler_t}, which is
+defined in @file{gsl_errno.h},
+
+@deftp {Data Type} gsl_error_handler_t
+
+This is the type of GSL error handler functions. An error handler will
+be passed four arguments which specify the reason for the error (a
+string), the name of the source file in which it occurred (also a
+string), the line number in that file (an integer) and the error number
+(an integer). The source file and line number are set at compile time
+using the @code{__FILE__} and @code{__LINE__} directives in the
+preprocessor. An error handler function returns type @code{void}.
+Error handler functions should be defined like this,
+
+@example
+void handler (const char * reason,
+ const char * file,
+ int line,
+ int gsl_errno)
+@end example
+@end deftp
+@comment
+
+@noindent
+To request the use of your own error handler you need to call the
+function @code{gsl_set_error_handler} which is also declared in
+@file{gsl_errno.h},
+
+@deftypefun {gsl_error_handler_t *} gsl_set_error_handler (gsl_error_handler_t @var{new_handler})
+
+This function sets a new error handler, @var{new_handler}, for the GSL
+library routines. The previous handler is returned (so that you can
+restore it later). Note that the pointer to a user defined error
+handler function is stored in a static variable, so there can be only
+one error handler per program. This function should be not be used in
+multi-threaded programs except to set up a program-wide error handler
+from a master thread. The following example shows how to set and
+restore a new error handler,
+
+@example
+/* save original handler, install new handler */
+old_handler = gsl_set_error_handler (&my_handler);
+
+/* code uses new handler */
+.....
+
+/* restore original handler */
+gsl_set_error_handler (old_handler);
+@end example
+
+@noindent
+To use the default behavior (@code{abort} on error) set the error
+handler to @code{NULL},
+
+@example
+old_handler = gsl_set_error_handler (NULL);
+@end example
+@end deftypefun
+
+@deftypefun {gsl_error_handler_t *} gsl_set_error_handler_off ()
+This function turns off the error handler by defining an error handler
+which does nothing. This will cause the program to continue after any
+error, so the return values from any library routines must be checked.
+This is the recommended behavior for production programs. The previous
+handler is returned (so that you can restore it later).
+@end deftypefun
+
+The error behavior can be changed for specific applications by
+recompiling the library with a customized definition of the
+@code{GSL_ERROR} macro in the file @file{gsl_errno.h}.
+
+@node Using GSL error reporting in your own functions
+@section Using GSL error reporting in your own functions
+@cindex error handling macros
+If you are writing numerical functions in a program which also uses GSL
+code you may find it convenient to adopt the same error reporting
+conventions as in the library.
+
+To report an error you need to call the function @code{gsl_error} with a
+string describing the error and then return an appropriate error code
+from @code{gsl_errno.h}, or a special value, such as @code{NaN}. For
+convenience the file @file{gsl_errno.h} defines two macros which carry
+out these steps:
+
+@deffn {Macro} GSL_ERROR (@var{reason}, @var{gsl_errno})
+
+This macro reports an error using the GSL conventions and returns a
+status value of @code{gsl_errno}. It expands to the following code fragment,
+
+@example
+gsl_error (reason, __FILE__, __LINE__, gsl_errno);
+return gsl_errno;
+@end example
+
+@noindent
+The macro definition in @file{gsl_errno.h} actually wraps the code
+in a @code{do @{ ... @} while (0)} block to prevent possible
+parsing problems.
+@end deffn
+
+Here is an example of how the macro could be used to report that a
+routine did not achieve a requested tolerance. To report the error the
+routine needs to return the error code @code{GSL_ETOL}.
+
+@example
+if (residual > tolerance)
+ @{
+ GSL_ERROR("residual exceeds tolerance", GSL_ETOL);
+ @}
+@end example
+
+@deffn {Macro} GSL_ERROR_VAL (@var{reason}, @var{gsl_errno}, @var{value})
+
+This macro is the same as @code{GSL_ERROR} but returns a user-defined
+value of @var{value} instead of an error code. It can be used for
+mathematical functions that return a floating point value.
+@end deffn
+
+The following example shows how to return a @code{NaN} at a mathematical
+singularity using the @code{GSL_ERROR_VAL} macro,
+
+@example
+if (x == 0)
+ @{
+ GSL_ERROR_VAL("argument lies on singularity",
+ GSL_ERANGE, GSL_NAN);
+ @}
+@end example
+
+
+@node Error Reporting Examples
+@section Examples
+
+Here is an example of some code which checks the return value of a
+function where an error might be reported,
+
+@example
+#include <stdio.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_fft_complex.h>
+
+...
+ int status;
+ size_t n = 37;
+
+ gsl_set_error_handler_off();
+
+ status = gsl_fft_complex_radix2_forward (data, n);
+
+ if (status) @{
+ if (status == GSL_EINVAL) @{
+ fprintf (stderr, "invalid argument, n=%d\n", n);
+ @} else @{
+ fprintf (stderr, "failed, gsl_errno=%d\n",
+ status);
+ @}
+ exit (-1);
+ @}
+...
+@end example
+@comment
+
+@noindent
+The function @code{gsl_fft_complex_radix2} only accepts integer lengths
+which are a power of two. If the variable @code{n} is not a power of
+two then the call to the library function will return @code{GSL_EINVAL},
+indicating that the length argument is invalid. The function call to
+@code{gsl_set_error_handler_off} stops the default error handler from
+aborting the program. The @code{else} clause catches any other possible
+errors.
+
diff --git a/gsl-1.9/doc/examples/blas.c b/gsl-1.9/doc/examples/blas.c
new file mode 100644
index 0000000..ab4b39b
--- /dev/null
+++ b/gsl-1.9/doc/examples/blas.c
@@ -0,0 +1,31 @@
+#include <stdio.h>
+#include <gsl/gsl_blas.h>
+
+int
+main (void)
+{
+ double a[] = { 0.11, 0.12, 0.13,
+ 0.21, 0.22, 0.23 };
+
+ double b[] = { 1011, 1012,
+ 1021, 1022,
+ 1031, 1032 };
+
+ double c[] = { 0.00, 0.00,
+ 0.00, 0.00 };
+
+ gsl_matrix_view A = gsl_matrix_view_array(a, 2, 3);
+ gsl_matrix_view B = gsl_matrix_view_array(b, 3, 2);
+ gsl_matrix_view C = gsl_matrix_view_array(c, 2, 2);
+
+ /* Compute C = A B */
+
+ gsl_blas_dgemm (CblasNoTrans, CblasNoTrans,
+ 1.0, &A.matrix, &B.matrix,
+ 0.0, &C.matrix);
+
+ printf ("[ %g, %g\n", c[0], c[1]);
+ printf (" %g, %g ]\n", c[2], c[3]);
+
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/blas.out b/gsl-1.9/doc/examples/blas.out
new file mode 100644
index 0000000..e8ec960
--- /dev/null
+++ b/gsl-1.9/doc/examples/blas.out
@@ -0,0 +1,2 @@
+[ 367.76, 368.12
+ 674.06, 674.72 ] \ No newline at end of file
diff --git a/gsl-1.9/doc/examples/block.c b/gsl-1.9/doc/examples/block.c
new file mode 100644
index 0000000..53f62a1
--- /dev/null
+++ b/gsl-1.9/doc/examples/block.c
@@ -0,0 +1,14 @@
+#include <stdio.h>
+#include <gsl/gsl_block.h>
+
+int
+main (void)
+{
+ gsl_block * b = gsl_block_alloc (100);
+
+ printf ("length of block = %u\n", b->size);
+ printf ("block data address = %#x\n", b->data);
+
+ gsl_block_free (b);
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/block.out b/gsl-1.9/doc/examples/block.out
new file mode 100644
index 0000000..1f84cd0
--- /dev/null
+++ b/gsl-1.9/doc/examples/block.out
@@ -0,0 +1,2 @@
+length of block = 100
+block data address = 0x804b0d8
diff --git a/gsl-1.9/doc/examples/bspline.c b/gsl-1.9/doc/examples/bspline.c
new file mode 100644
index 0000000..0d6a584
--- /dev/null
+++ b/gsl-1.9/doc/examples/bspline.c
@@ -0,0 +1,116 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <gsl/gsl_bspline.h>
+#include <gsl/gsl_multifit.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+
+/* number of data points to fit */
+#define N 200
+
+/* number of fit coefficients */
+#define NCOEFFS 8
+
+/* nbreak = ncoeffs + 2 - k = ncoeffs - 2 since k = 4 */
+#define NBREAK (NCOEFFS - 2)
+
+int
+main (void)
+{
+ const size_t n = N;
+ const size_t ncoeffs = NCOEFFS;
+ const size_t nbreak = NBREAK;
+ size_t i, j;
+ gsl_bspline_workspace *bw;
+ gsl_vector *B;
+ double dy;
+ gsl_rng *r;
+ gsl_vector *c, *w;
+ gsl_vector *x, *y;
+ gsl_matrix *X, *cov;
+ gsl_multifit_linear_workspace *mw;
+ double chisq;
+
+ gsl_rng_env_setup();
+ r = gsl_rng_alloc(gsl_rng_default);
+
+ /* allocate a cubic bspline workspace (k = 4) */
+ bw = gsl_bspline_alloc(4, nbreak);
+ B = gsl_vector_alloc(ncoeffs);
+
+ x = gsl_vector_alloc(n);
+ y = gsl_vector_alloc(n);
+ X = gsl_matrix_alloc(n, ncoeffs);
+ c = gsl_vector_alloc(ncoeffs);
+ w = gsl_vector_alloc(n);
+ cov = gsl_matrix_alloc(ncoeffs, ncoeffs);
+ mw = gsl_multifit_linear_alloc(n, ncoeffs);
+
+ printf("#m=0,S=0\n");
+ /* this is the data to be fitted */
+ for (i = 0; i < n; ++i)
+ {
+ double sigma;
+ double xi = (15.0/(N-1)) * i;
+ double yi = cos(xi) * exp(-0.1 * xi);
+
+ sigma = 0.1;
+ dy = gsl_ran_gaussian(r, sigma);
+ yi += dy;
+
+ gsl_vector_set(x, i, xi);
+ gsl_vector_set(y, i, yi);
+ gsl_vector_set(w, i, 1.0 / (sigma*sigma));
+
+ printf("%f %f\n", xi, yi);
+ }
+
+ /* use uniform breakpoints on [0, 15] */
+ gsl_bspline_knots_uniform(0.0, 15.0, bw);
+
+ /* construct the fit matrix X */
+ for (i = 0; i < n; ++i)
+ {
+ double xi = gsl_vector_get(x, i);
+
+ /* compute B_j(xi) for all j */
+ gsl_bspline_eval(xi, B, bw);
+
+ /* fill in row i of X */
+ for (j = 0; j < ncoeffs; ++j)
+ {
+ double Bj = gsl_vector_get(B, j);
+ gsl_matrix_set(X, i, j, Bj);
+ }
+ }
+
+ /* do the fit */
+ gsl_multifit_wlinear(X, w, y, c, cov, &chisq, mw);
+
+ /* output the smoothed curve */
+ {
+ double xi, yi, yerr;
+
+ printf("#m=1,S=0\n");
+ for (xi = 0.0; xi < 15.0; xi += 0.1)
+ {
+ gsl_bspline_eval(xi, B, bw);
+ gsl_multifit_linear_est(B, c, cov, &yi, &yerr);
+ printf("%f %f\n", xi, yi);
+ }
+ }
+
+ gsl_rng_free(r);
+ gsl_bspline_free(bw);
+ gsl_vector_free(B);
+ gsl_vector_free(x);
+ gsl_vector_free(y);
+ gsl_matrix_free(X);
+ gsl_vector_free(c);
+ gsl_vector_free(w);
+ gsl_matrix_free(cov);
+ gsl_multifit_linear_free(mw);
+
+ return 0;
+} /* main() */
diff --git a/gsl-1.9/doc/examples/cblas.c b/gsl-1.9/doc/examples/cblas.c
new file mode 100644
index 0000000..cb6b31a
--- /dev/null
+++ b/gsl-1.9/doc/examples/cblas.c
@@ -0,0 +1,33 @@
+#include <stdio.h>
+#include <gsl/gsl_cblas.h>
+
+int
+main (void)
+{
+ int lda = 3;
+
+ float A[] = { 0.11, 0.12, 0.13,
+ 0.21, 0.22, 0.23 };
+
+ int ldb = 2;
+
+ float B[] = { 1011, 1012,
+ 1021, 1022,
+ 1031, 1032 };
+
+ int ldc = 2;
+
+ float C[] = { 0.00, 0.00,
+ 0.00, 0.00 };
+
+ /* Compute C = A B */
+
+ cblas_sgemm (CblasRowMajor,
+ CblasNoTrans, CblasNoTrans, 2, 2, 3,
+ 1.0, A, lda, B, ldb, 0.0, C, ldc);
+
+ printf ("[ %g, %g\n", C[0], C[1]);
+ printf (" %g, %g ]\n", C[2], C[3]);
+
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/cblas.out b/gsl-1.9/doc/examples/cblas.out
new file mode 100644
index 0000000..a0f51d7
--- /dev/null
+++ b/gsl-1.9/doc/examples/cblas.out
@@ -0,0 +1,2 @@
+[ 367.76, 368.12
+ 674.06, 674.72 ]
diff --git a/gsl-1.9/doc/examples/cdf.c b/gsl-1.9/doc/examples/cdf.c
new file mode 100644
index 0000000..968eb96
--- /dev/null
+++ b/gsl-1.9/doc/examples/cdf.c
@@ -0,0 +1,23 @@
+#include <stdio.h>
+#include <gsl/gsl_cdf.h>
+
+int
+main (void)
+{
+ double P, Q;
+ double x = 2.0;
+
+ P = gsl_cdf_ugaussian_P (x);
+ printf ("prob(x < %f) = %f\n", x, P);
+
+ Q = gsl_cdf_ugaussian_Q (x);
+ printf ("prob(x > %f) = %f\n", x, Q);
+
+ x = gsl_cdf_ugaussian_Pinv (P);
+ printf ("Pinv(%f) = %f\n", P, x);
+
+ x = gsl_cdf_ugaussian_Qinv (Q);
+ printf ("Qinv(%f) = %f\n", Q, x);
+
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/cdf.out b/gsl-1.9/doc/examples/cdf.out
new file mode 100644
index 0000000..f04b75b
--- /dev/null
+++ b/gsl-1.9/doc/examples/cdf.out
@@ -0,0 +1,4 @@
+prob(x < 2.000000) = 0.977250
+prob(x > 2.000000) = 0.022750
+Pinv(0.977250) = 2.000000
+Qinv(0.022750) = 2.000000
diff --git a/gsl-1.9/doc/examples/cheb.c b/gsl-1.9/doc/examples/cheb.c
new file mode 100644
index 0000000..58a0c54
--- /dev/null
+++ b/gsl-1.9/doc/examples/cheb.c
@@ -0,0 +1,40 @@
+#include <stdio.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_chebyshev.h>
+
+double
+f (double x, void *p)
+{
+ if (x < 0.5)
+ return 0.25;
+ else
+ return 0.75;
+}
+
+int
+main (void)
+{
+ int i, n = 10000;
+
+ gsl_cheb_series *cs = gsl_cheb_alloc (40);
+
+ gsl_function F;
+
+ F.function = f;
+ F.params = 0;
+
+ gsl_cheb_init (cs, &F, 0.0, 1.0);
+
+ for (i = 0; i < n; i++)
+ {
+ double x = i / (double)n;
+ double r10 = gsl_cheb_eval_n (cs, 10, x);
+ double r40 = gsl_cheb_eval (cs, x);
+ printf ("%g %g %g %g\n",
+ x, GSL_FN_EVAL (&F, x), r10, r40);
+ }
+
+ gsl_cheb_free (cs);
+
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/combination.c b/gsl-1.9/doc/examples/combination.c
new file mode 100644
index 0000000..708174f
--- /dev/null
+++ b/gsl-1.9/doc/examples/combination.c
@@ -0,0 +1,25 @@
+#include <stdio.h>
+#include <gsl/gsl_combination.h>
+
+int
+main (void)
+{
+ gsl_combination * c;
+ size_t i;
+
+ printf ("All subsets of {0,1,2,3} by size:\n") ;
+ for (i = 0; i <= 4; i++)
+ {
+ c = gsl_combination_calloc (4, i);
+ do
+ {
+ printf ("{");
+ gsl_combination_fprintf (stdout, c, " %u");
+ printf (" }\n");
+ }
+ while (gsl_combination_next (c) == GSL_SUCCESS);
+ gsl_combination_free (c);
+ }
+
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/combination.out b/gsl-1.9/doc/examples/combination.out
new file mode 100644
index 0000000..a9050ab
--- /dev/null
+++ b/gsl-1.9/doc/examples/combination.out
@@ -0,0 +1,17 @@
+All subsets of {0,1,2,3} by size:
+{ }
+{ 0 }
+{ 1 }
+{ 2 }
+{ 3 }
+{ 0 1 }
+{ 0 2 }
+{ 0 3 }
+{ 1 2 }
+{ 1 3 }
+{ 2 3 }
+{ 0 1 2 }
+{ 0 1 3 }
+{ 0 2 3 }
+{ 1 2 3 }
+{ 0 1 2 3 }
diff --git a/gsl-1.9/doc/examples/const.c b/gsl-1.9/doc/examples/const.c
new file mode 100644
index 0000000..47718c5
--- /dev/null
+++ b/gsl-1.9/doc/examples/const.c
@@ -0,0 +1,25 @@
+#include <stdio.h>
+#include <gsl/gsl_const_mksa.h>
+
+int
+main (void)
+{
+ double c = GSL_CONST_MKSA_SPEED_OF_LIGHT;
+ double au = GSL_CONST_MKSA_ASTRONOMICAL_UNIT;
+ double minutes = GSL_CONST_MKSA_MINUTE;
+
+ /* distance stored in meters */
+ double r_earth = 1.00 * au;
+ double r_mars = 1.52 * au;
+
+ double t_min, t_max;
+
+ t_min = (r_mars - r_earth) / c;
+ t_max = (r_mars + r_earth) / c;
+
+ printf ("light travel time from Earth to Mars:\n");
+ printf ("minimum = %.1f minutes\n", t_min / minutes);
+ printf ("maximum = %.1f minutes\n", t_max / minutes);
+
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/const.out b/gsl-1.9/doc/examples/const.out
new file mode 100644
index 0000000..6552a3d
--- /dev/null
+++ b/gsl-1.9/doc/examples/const.out
@@ -0,0 +1,3 @@
+light travel time from Earth to Mars:
+minimum = 4.3 minutes
+maximum = 21.0 minutes
diff --git a/gsl-1.9/doc/examples/demo_fn.c b/gsl-1.9/doc/examples/demo_fn.c
new file mode 100644
index 0000000..4d8a552
--- /dev/null
+++ b/gsl-1.9/doc/examples/demo_fn.c
@@ -0,0 +1,40 @@
+double
+quadratic (double x, void *params)
+{
+ struct quadratic_params *p
+ = (struct quadratic_params *) params;
+
+ double a = p->a;
+ double b = p->b;
+ double c = p->c;
+
+ return (a * x + b) * x + c;
+}
+
+double
+quadratic_deriv (double x, void *params)
+{
+ struct quadratic_params *p
+ = (struct quadratic_params *) params;
+
+ double a = p->a;
+ double b = p->b;
+ double c = p->c;
+
+ return 2.0 * a * x + b;
+}
+
+void
+quadratic_fdf (double x, void *params,
+ double *y, double *dy)
+{
+ struct quadratic_params *p
+ = (struct quadratic_params *) params;
+
+ double a = p->a;
+ double b = p->b;
+ double c = p->c;
+
+ *y = (a * x + b) * x + c;
+ *dy = 2.0 * a * x + b;
+}
diff --git a/gsl-1.9/doc/examples/demo_fn.h b/gsl-1.9/doc/examples/demo_fn.h
new file mode 100644
index 0000000..77aeea1
--- /dev/null
+++ b/gsl-1.9/doc/examples/demo_fn.h
@@ -0,0 +1,9 @@
+struct quadratic_params
+ {
+ double a, b, c;
+ };
+
+double quadratic (double x, void *params);
+double quadratic_deriv (double x, void *params);
+void quadratic_fdf (double x, void *params,
+ double *y, double *dy);
diff --git a/gsl-1.9/doc/examples/diff.c b/gsl-1.9/doc/examples/diff.c
new file mode 100644
index 0000000..b32e193
--- /dev/null
+++ b/gsl-1.9/doc/examples/diff.c
@@ -0,0 +1,32 @@
+#include <stdio.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_deriv.h>
+
+double f (double x, void * params)
+{
+ return pow (x, 1.5);
+}
+
+int
+main (void)
+{
+ gsl_function F;
+ double result, abserr;
+
+ F.function = &f;
+ F.params = 0;
+
+ printf ("f(x) = x^(3/2)\n");
+
+ gsl_deriv_central (&F, 2.0, 1e-8, &result, &abserr);
+ printf ("x = 2.0\n");
+ printf ("f'(x) = %.10f +/- %.10f\n", result, abserr);
+ printf ("exact = %.10f\n\n", 1.5 * sqrt(2.0));
+
+ gsl_deriv_forward (&F, 0.0, 1e-8, &result, &abserr);
+ printf ("x = 0.0\n");
+ printf ("f'(x) = %.10f +/- %.10f\n", result, abserr);
+ printf ("exact = %.10f\n", 0.0);
+
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/diff.out b/gsl-1.9/doc/examples/diff.out
new file mode 100644
index 0000000..dab42d5
--- /dev/null
+++ b/gsl-1.9/doc/examples/diff.out
@@ -0,0 +1,8 @@
+f(x) = x^(3/2)
+x = 2.0
+f'(x) = 2.1213203120 +/- 0.0000004064
+exact = 2.1213203436
+
+x = 0.0
+f'(x) = 0.0000000160 +/- 0.0000000339
+exact = 0.0000000000
diff --git a/gsl-1.9/doc/examples/dwt.c b/gsl-1.9/doc/examples/dwt.c
new file mode 100644
index 0000000..062b2c6
--- /dev/null
+++ b/gsl-1.9/doc/examples/dwt.c
@@ -0,0 +1,54 @@
+#include <stdio.h>
+#include <math.h>
+#include <gsl/gsl_sort.h>
+#include <gsl/gsl_wavelet.h>
+
+int
+main (int argc, char **argv)
+{
+ int i, n = 256, nc = 20;
+ double *data = malloc (n * sizeof (double));
+ double *abscoeff = malloc (n * sizeof (double));
+ size_t *p = malloc (n * sizeof (size_t));
+
+ FILE * f;
+ gsl_wavelet *w;
+ gsl_wavelet_workspace *work;
+
+ w = gsl_wavelet_alloc (gsl_wavelet_daubechies, 4);
+ work = gsl_wavelet_workspace_alloc (n);
+
+ f = fopen (argv[1], "r");
+ for (i = 0; i < n; i++)
+ {
+ fscanf (f, "%lg", &data[i]);
+ }
+ fclose (f);
+
+ gsl_wavelet_transform_forward (w, data, 1, n, work);
+
+ for (i = 0; i < n; i++)
+ {
+ abscoeff[i] = fabs (data[i]);
+ }
+
+ gsl_sort_index (p, abscoeff, 1, n);
+
+ for (i = 0; (i + nc) < n; i++)
+ data[p[i]] = 0;
+
+ gsl_wavelet_transform_inverse (w, data, 1, n, work);
+
+ for (i = 0; i < n; i++)
+ {
+ printf ("%g\n", data[i]);
+ }
+
+ gsl_wavelet_free (w);
+ gsl_wavelet_workspace_free (work);
+
+ free (data);
+ free (abscoeff);
+ free (p);
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/dwt.dat b/gsl-1.9/doc/examples/dwt.dat
new file mode 100644
index 0000000..e7ff47b
--- /dev/null
+++ b/gsl-1.9/doc/examples/dwt.dat
@@ -0,0 +1,256 @@
+0.0167729
+0.031888
+0.0412921
+0.0522264
+0.0574496
+0.0642031
+0.0724869
+0.0803607
+0.0825233
+0.0862162
+0.0914394
+0.0962525
+0.102596
+0.108529
+0.114053
+0.119686
+0.104007
+0.094039
+0.0897813
+0.0839935
+0.0839162
+0.0823088
+0.0791713
+0.0764437
+0.0509741
+0.0315983
+0.0183161
+0.00340114
+-0.00542012
+-0.0158742
+-0.0279611
+-0.0396104
+-0.0160286
+-0.00188697
+0.00281451
+0.0100455
+0.00783627
+0.00815656
+0.0110063
+0.0131783
+0.00591016
+0.00117148
+-0.00103772
+-0.00392469
+-0.00428218
+-0.00531744
+-0.00703047
+-0.0085619
+-0.014332
+-0.0189663
+-0.0224649
+-0.0262678
+-0.0289349
+-0.0319064
+-0.0351822
+-0.0383765
+-0.0801973
+-0.111668
+-0.132789
+-0.156683
+-0.162696
+-0.1735
+-0.189095
+-0.203407
+-0.00510083
+0.136235
+0.341101
+0.528945
+0.801527
+1.0514
+1.15485
+1.29754
+1.16912
+1.11335
+0.760921
+0.487984
+0.24772
+-0.00129903
+-0.0610099
+-0.171446
+-0.102442
+-0.081519
+-0.108677
+-0.122951
+-0.0931296
+-0.0751235
+-0.0689329
+-0.0595764
+-0.0723311
+-0.0791611
+-0.0800665
+-0.0825593
+-0.0791275
+-0.0772832
+-0.0770263
+-0.0763442
+-0.078946
+-0.080668
+-0.0815099
+-0.0825877
+-0.0827855
+-0.083219
+-0.0838884
+-0.0844945
+-0.0842208
+-0.0841828
+-0.0843805
+-0.0845151
+-0.0848855
+-0.0851927
+-0.0854368
+-0.0856977
+-0.0858204
+-0.0859801
+-0.0861769
+-0.0863638
+-0.0865877
+-0.0868017
+-0.0870057
+-0.0872124
+-0.0874562
+-0.08769
+-0.0879139
+-0.0881405
+-0.0883571
+-0.0885764
+-0.0887984
+-0.0890196
+-0.0890797
+-0.0891829
+-0.0893293
+-0.0894642
+-0.0896423
+-0.0898087
+-0.0899636
+-0.0901216
+-0.0903228
+-0.0905125
+-0.0906905
+-0.0908717
+-0.0910413
+-0.0912139
+-0.0913897
+-0.0915647
+-0.0917828
+-0.0919894
+-0.0921844
+-0.0923825
+-0.092569
+-0.0927586
+-0.0929514
+-0.0931433
+-0.0933236
+-0.093507
+-0.0936935
+-0.0938792
+-0.094068
+-0.094256
+-0.0944431
+-0.0946305
+-0.103627
+-0.110264
+-0.11454
+-0.119448
+-0.121996
+-0.125177
+-0.12899
+-0.132633
+-0.133916
+-0.135831
+-0.138379
+-0.140758
+-0.143768
+-0.14661
+-0.149282
+-0.151999
+-0.121242
+-0.0994544
+-0.0866362
+-0.0714146
+-0.0651625
+-0.056507
+-0.0454482
+-0.0350333
+-0.033588
+-0.0297392
+-0.0234871
+-0.017879
+-0.00986753
+-0.00250002
+0.00422351
+0.0111196
+-0.00226639
+-0.0102178
+-0.0127347
+-0.0167077
+-0.0152462
+-0.0152409
+-0.0166917
+-0.0177524
+-0.0133785
+-0.0104608
+-0.00899926
+-0.00714755
+-0.00675204
+-0.00596633
+-0.00479045
+-0.00371911
+0.00278678
+0.00783649
+0.01143
+0.0154137
+0.0179412
+0.0208589
+0.0241668
+0.0273702
+0.0291173
+0.0312547
+0.0337822
+0.0362052
+0.0390183
+0.0417269
+0.044331
+0.0469631
+0.0347545
+0.0265225
+0.0222671
+0.0169461
+0.0156016
+0.0131917
+0.00971622
+0.00652626
+0.00731282
+0.00703387
+0.00568942
+0.00463047
+0.00250601
+0.000667052
+-0.000886403
+-0.00251636
+-0.000169788
+0.00111128
+0.00132683
+0.00182789
+0.00126344
+0.000984496
+0.000991051
+0.000921107
+-0.000214344
+-0.00106429
+-0.00162874
+-0.00226969
+-0.00262514
+-0.00305708
+-0.00356553
+-0.00405348
diff --git a/gsl-1.9/doc/examples/ecg.dat b/gsl-1.9/doc/examples/ecg.dat
new file mode 100644
index 0000000..5ea824a
--- /dev/null
+++ b/gsl-1.9/doc/examples/ecg.dat
@@ -0,0 +1,256 @@
+ 0.0462458471760794
+ 0.0462458471760794
+ 0.0512458471760794
+ 0.0712458471760795
+ 0.0712458471760795
+ 0.0662458471760795
+ 0.0962458471760795
+ 0.101245847176079
+ 0.116245847176079
+ 0.121245847176079
+ 0.116245847176079
+ 0.106245847176079
+ 0.0912458471760794
+ 0.101245847176079
+ 0.0962458471760795
+ 0.0962458471760795
+ 0.0962458471760795
+ 0.0912458471760794
+ 0.0862458471760795
+ 0.0812458471760795
+ 0.0862458471760795
+ 0.101245847176079
+ 0.111245847176079
+ 0.116245847176079
+ 0.0762458471760795
+ 0.0362458471760795
+ 0.0362458471760795
+ 0.0212458471760795
+ 0.0112458471760795
+ -0.00875415282392056
+ -0.00875415282392056
+ -0.00375415282392055
+ 0.00624584717607946
+ 0.00124584717607945
+ 0.00624584717607946
+ -0.00375415282392055
+ -0.0187541528239206
+ -0.0237541528239205
+ -0.0187541528239206
+ -0.0187541528239206
+ -0.0287541528239205
+ -0.0237541528239205
+ -0.0337541528239205
+ -0.00875415282392056
+ -0.0137541528239206
+ -0.00875415282392056
+ 0.00124584717607945
+ -0.0237541528239205
+ -0.0337541528239205
+ -0.0187541528239206
+ -0.00875415282392056
+ -0.00375415282392055
+ -0.00875415282392056
+ -0.0287541528239205
+ -0.0437541528239205
+ -0.0387541528239205
+ -0.0587541528239205
+ -0.103754152823921
+ -0.123754152823921
+ -0.153754152823921
+ -0.188754152823921
+ -0.213754152823921
+ -0.183754152823921
+ -0.0937541528239205
+ 0.0212458471760795
+ 0.161245847176079
+ 0.306245847176079
+ 0.556245847176079
+ 0.81124584717608
+ 1.04124584717608
+ 1.19624584717608
+ 1.26124584717608
+ 1.22624584717608
+ 1.07624584717608
+ 0.81124584717608
+ 0.486245847176079
+ 0.211245847176079
+ 0.0512458471760794
+ -0.0687541528239206
+ -0.128754152823921
+ -0.153754152823921
+ -0.133754152823921
+ -0.103754152823921
+ -0.0687541528239206
+ -0.0687541528239206
+ -0.0637541528239206
+ -0.0687541528239206
+ -0.0587541528239205
+ -0.0587541528239205
+ -0.0587541528239205
+ -0.0737541528239206
+ -0.0637541528239206
+ -0.0637541528239206
+ -0.0637541528239206
+ -0.0537541528239205
+ -0.0737541528239206
+ -0.0887541528239205
+ -0.0887541528239205
+ -0.0787541528239206
+ -0.0737541528239206
+ -0.0687541528239206
+ -0.0837541528239206
+ -0.0737541528239206
+ -0.0637541528239206
+ -0.0537541528239205
+ -0.0687541528239206
+ -0.0687541528239206
+ -0.0837541528239206
+ -0.0887541528239205
+ -0.0887541528239205
+ -0.0687541528239206
+ -0.0687541528239206
+ -0.0737541528239206
+ -0.0837541528239206
+ -0.0937541528239205
+ -0.0787541528239206
+ -0.0887541528239205
+ -0.0837541528239206
+ -0.0887541528239205
+ -0.0937541528239205
+ -0.0887541528239205
+ -0.0787541528239206
+ -0.0787541528239206
+ -0.0737541528239206
+ -0.0687541528239206
+ -0.0837541528239206
+ -0.0887541528239205
+ -0.0687541528239206
+ -0.0687541528239206
+ -0.0637541528239206
+ -0.0637541528239206
+ -0.0887541528239205
+ -0.0837541528239206
+ -0.0737541528239206
+ -0.0687541528239206
+ -0.0537541528239205
+ -0.0687541528239206
+ -0.0737541528239206
+ -0.0887541528239205
+ -0.0787541528239206
+ -0.0687541528239206
+ -0.0687541528239206
+ -0.0637541528239206
+ -0.0837541528239206
+ -0.0937541528239205
+ -0.0937541528239205
+ -0.0787541528239206
+ -0.0737541528239206
+ -0.0837541528239206
+ -0.0937541528239205
+ -0.0987541528239205
+ -0.0987541528239205
+ -0.0887541528239205
+ -0.0937541528239205
+ -0.103754152823921
+ -0.0987541528239205
+ -0.113754152823921
+ -0.108754152823921
+ -0.108754152823921
+ -0.0987541528239205
+ -0.108754152823921
+ -0.128754152823921
+ -0.133754152823921
+ -0.128754152823921
+ -0.113754152823921
+ -0.123754152823921
+ -0.128754152823921
+ -0.133754152823921
+ -0.148754152823921
+ -0.138754152823921
+ -0.133754152823921
+ -0.128754152823921
+ -0.133754152823921
+ -0.148754152823921
+ -0.153754152823921
+ -0.138754152823921
+ -0.128754152823921
+ -0.123754152823921
+ -0.118754152823921
+ -0.113754152823921
+ -0.118754152823921
+ -0.0887541528239205
+ -0.0737541528239206
+ -0.0487541528239205
+ -0.0437541528239205
+ -0.0387541528239205
+ -0.0437541528239205
+ -0.0187541528239206
+ -0.00375415282392055
+ 0.00624584717607946
+ 0.00124584717607945
+ -0.00875415282392056
+ -0.00875415282392056
+ 0.00124584717607945
+ 0.0112458471760795
+ 0.0212458471760795
+ 0.0212458471760795
+ 0.00124584717607945
+ 0.00124584717607945
+ 0.00624584717607946
+ 0.0162458471760795
+ 0.0162458471760795
+ 0.0262458471760795
+ 0.00124584717607945
+ -0.00875415282392056
+ 0.0162458471760795
+ 0.0112458471760795
+ 0.0212458471760795
+ 0.0212458471760795
+ 0.00124584717607945
+ -0.00375415282392055
+ 0.0112458471760795
+ 0.0162458471760795
+ 0.00624584717607946
+ 0.0162458471760795
+ 0.00624584717607946
+ 0.00624584717607946
+ 0.0112458471760795
+ 0.0262458471760795
+ 0.0312458471760795
+ 0.0162458471760795
+ 0.0112458471760795
+ 0.00124584717607945
+ 0.00624584717607946
+ 0.0212458471760795
+ 0.00624584717607946
+ 0.00624584717607946
+ 0.00624584717607946
+ -0.00875415282392056
+ 0.00624584717607946
+ 0.00124584717607945
+ 0.00624584717607946
+ -0.00375415282392055
+ -0.0137541528239206
+ -0.0187541528239206
+ -0.0137541528239206
+ -0.0137541528239206
+ -0.00875415282392056
+ -0.00375415282392055
+ -0.0237541528239205
+ -0.0287541528239205
+ -0.0237541528239205
+ -0.0137541528239206
+ -0.00875415282392056
+ -0.00875415282392056
+ -0.0237541528239205
+ -0.0237541528239205
+ -0.0237541528239205
+ 0.00124584717607945
+ -0.00875415282392056
+ -0.0137541528239206
+ -0.0187541528239206
+ -0.0337541528239205
+ -0.0137541528239206
+ -0.00875415282392056
+ -0.00875415282392056
diff --git a/gsl-1.9/doc/examples/eigen.c b/gsl-1.9/doc/examples/eigen.c
new file mode 100644
index 0000000..a24c912
--- /dev/null
+++ b/gsl-1.9/doc/examples/eigen.c
@@ -0,0 +1,50 @@
+#include <stdio.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_eigen.h>
+
+int
+main (void)
+{
+ double data[] = { 1.0 , 1/2.0, 1/3.0, 1/4.0,
+ 1/2.0, 1/3.0, 1/4.0, 1/5.0,
+ 1/3.0, 1/4.0, 1/5.0, 1/6.0,
+ 1/4.0, 1/5.0, 1/6.0, 1/7.0 };
+
+ gsl_matrix_view m
+ = gsl_matrix_view_array (data, 4, 4);
+
+ gsl_vector *eval = gsl_vector_alloc (4);
+ gsl_matrix *evec = gsl_matrix_alloc (4, 4);
+
+ gsl_eigen_symmv_workspace * w =
+ gsl_eigen_symmv_alloc (4);
+
+ gsl_eigen_symmv (&m.matrix, eval, evec, w);
+
+ gsl_eigen_symmv_free (w);
+
+ gsl_eigen_symmv_sort (eval, evec,
+ GSL_EIGEN_SORT_ABS_ASC);
+
+ {
+ int i;
+
+ for (i = 0; i < 4; i++)
+ {
+ double eval_i
+ = gsl_vector_get (eval, i);
+ gsl_vector_view evec_i
+ = gsl_matrix_column (evec, i);
+
+ printf ("eigenvalue = %g\n", eval_i);
+ printf ("eigenvector = \n");
+ gsl_vector_fprintf (stdout,
+ &evec_i.vector, "%g");
+ }
+ }
+
+ gsl_vector_free (eval);
+ gsl_matrix_free (evec);
+
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/eigen_nonsymm.c b/gsl-1.9/doc/examples/eigen_nonsymm.c
new file mode 100644
index 0000000..ccbef2d
--- /dev/null
+++ b/gsl-1.9/doc/examples/eigen_nonsymm.c
@@ -0,0 +1,54 @@
+#include <stdio.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_eigen.h>
+
+int
+main (void)
+{
+ double data[] = { -1.0, 1.0, -1.0, 1.0,
+ -8.0, 4.0, -2.0, 1.0,
+ 27.0, 9.0, 3.0, 1.0,
+ 64.0, 16.0, 4.0, 1.0 };
+
+ gsl_matrix_view m
+ = gsl_matrix_view_array (data, 4, 4);
+
+ gsl_vector_complex *eval = gsl_vector_complex_alloc (4);
+ gsl_matrix_complex *evec = gsl_matrix_complex_alloc (4, 4);
+
+ gsl_eigen_nonsymmv_workspace * w =
+ gsl_eigen_nonsymmv_alloc (4);
+
+ gsl_eigen_nonsymmv (&m.matrix, eval, evec, w);
+
+ gsl_eigen_nonsymmv_free (w);
+
+ gsl_eigen_nonsymmv_sort (eval, evec,
+ GSL_EIGEN_SORT_ABS_DESC);
+
+ {
+ int i, j;
+
+ for (i = 0; i < 4; i++)
+ {
+ gsl_complex eval_i
+ = gsl_vector_complex_get (eval, i);
+ gsl_vector_complex_view evec_i
+ = gsl_matrix_complex_column (evec, i);
+
+ printf ("eigenvalue = %g + %gi\n",
+ GSL_REAL(eval_i), GSL_IMAG(eval_i));
+ printf ("eigenvector = \n");
+ for (j = 0; j < 4; ++j)
+ {
+ gsl_complex z = gsl_vector_complex_get(&evec_i.vector, j);
+ printf("%g + %gi\n", GSL_REAL(z), GSL_IMAG(z));
+ }
+ }
+ }
+
+ gsl_vector_complex_free(eval);
+ gsl_matrix_complex_free(evec);
+
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/expfit.c b/gsl-1.9/doc/examples/expfit.c
new file mode 100644
index 0000000..f94cf2b
--- /dev/null
+++ b/gsl-1.9/doc/examples/expfit.c
@@ -0,0 +1,70 @@
+/* expfit.c -- model functions for exponential + background */
+
+struct data {
+ size_t n;
+ double * y;
+ double * sigma;
+};
+
+int
+expb_f (const gsl_vector * x, void *data,
+ gsl_vector * f)
+{
+ size_t n = ((struct data *)data)->n;
+ double *y = ((struct data *)data)->y;
+ double *sigma = ((struct data *) data)->sigma;
+
+ double A = gsl_vector_get (x, 0);
+ double lambda = gsl_vector_get (x, 1);
+ double b = gsl_vector_get (x, 2);
+
+ size_t i;
+
+ for (i = 0; i < n; i++)
+ {
+ /* Model Yi = A * exp(-lambda * i) + b */
+ double t = i;
+ double Yi = A * exp (-lambda * t) + b;
+ gsl_vector_set (f, i, (Yi - y[i])/sigma[i]);
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+expb_df (const gsl_vector * x, void *data,
+ gsl_matrix * J)
+{
+ size_t n = ((struct data *)data)->n;
+ double *sigma = ((struct data *) data)->sigma;
+
+ double A = gsl_vector_get (x, 0);
+ double lambda = gsl_vector_get (x, 1);
+
+ size_t i;
+
+ for (i = 0; i < n; i++)
+ {
+ /* Jacobian matrix J(i,j) = dfi / dxj, */
+ /* where fi = (Yi - yi)/sigma[i], */
+ /* Yi = A * exp(-lambda * i) + b */
+ /* and the xj are the parameters (A,lambda,b) */
+ double t = i;
+ double s = sigma[i];
+ double e = exp(-lambda * t);
+ gsl_matrix_set (J, i, 0, e/s);
+ gsl_matrix_set (J, i, 1, -t * A * e/s);
+ gsl_matrix_set (J, i, 2, 1/s);
+ }
+ return GSL_SUCCESS;
+}
+
+int
+expb_fdf (const gsl_vector * x, void *data,
+ gsl_vector * f, gsl_matrix * J)
+{
+ expb_f (x, data, f);
+ expb_df (x, data, J);
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/doc/examples/fft.c b/gsl-1.9/doc/examples/fft.c
new file mode 100644
index 0000000..aa00242
--- /dev/null
+++ b/gsl-1.9/doc/examples/fft.c
@@ -0,0 +1,43 @@
+#include <stdio.h>
+#include <math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_fft_complex.h>
+
+#define REAL(z,i) ((z)[2*(i)])
+#define IMAG(z,i) ((z)[2*(i)+1])
+
+int
+main (void)
+{
+ int i; double data[2*128];
+
+ for (i = 0; i < 128; i++)
+ {
+ REAL(data,i) = 0.0; IMAG(data,i) = 0.0;
+ }
+
+ REAL(data,0) = 1.0;
+
+ for (i = 1; i <= 10; i++)
+ {
+ REAL(data,i) = REAL(data,128-i) = 1.0;
+ }
+
+ for (i = 0; i < 128; i++)
+ {
+ printf ("%d %e %e\n", i,
+ REAL(data,i), IMAG(data,i));
+ }
+ printf ("\n");
+
+ gsl_fft_complex_radix2_forward (data, 1, 128);
+
+ for (i = 0; i < 128; i++)
+ {
+ printf ("%d %e %e\n", i,
+ REAL(data,i)/sqrt(128),
+ IMAG(data,i)/sqrt(128));
+ }
+
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/fftmr.c b/gsl-1.9/doc/examples/fftmr.c
new file mode 100644
index 0000000..0a43e0a
--- /dev/null
+++ b/gsl-1.9/doc/examples/fftmr.c
@@ -0,0 +1,60 @@
+#include <stdio.h>
+#include <math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_fft_complex.h>
+
+#define REAL(z,i) ((z)[2*(i)])
+#define IMAG(z,i) ((z)[2*(i)+1])
+
+int
+main (void)
+{
+ int i;
+ const int n = 630;
+ double data[2*n];
+
+ gsl_fft_complex_wavetable * wavetable;
+ gsl_fft_complex_workspace * workspace;
+
+ for (i = 0; i < n; i++)
+ {
+ REAL(data,i) = 0.0;
+ IMAG(data,i) = 0.0;
+ }
+
+ data[0] = 1.0;
+
+ for (i = 1; i <= 10; i++)
+ {
+ REAL(data,i) = REAL(data,n-i) = 1.0;
+ }
+
+ for (i = 0; i < n; i++)
+ {
+ printf ("%d: %e %e\n", i, REAL(data,i),
+ IMAG(data,i));
+ }
+ printf ("\n");
+
+ wavetable = gsl_fft_complex_wavetable_alloc (n);
+ workspace = gsl_fft_complex_workspace_alloc (n);
+
+ for (i = 0; i < wavetable->nf; i++)
+ {
+ printf ("# factor %d: %d\n", i,
+ wavetable->factor[i]);
+ }
+
+ gsl_fft_complex_forward (data, 1, n,
+ wavetable, workspace);
+
+ for (i = 0; i < n; i++)
+ {
+ printf ("%d: %e %e\n", i, REAL(data,i),
+ IMAG(data,i));
+ }
+
+ gsl_fft_complex_wavetable_free (wavetable);
+ gsl_fft_complex_workspace_free (workspace);
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/fftreal.c b/gsl-1.9/doc/examples/fftreal.c
new file mode 100644
index 0000000..ec34458
--- /dev/null
+++ b/gsl-1.9/doc/examples/fftreal.c
@@ -0,0 +1,59 @@
+#include <stdio.h>
+#include <math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_fft_real.h>
+#include <gsl/gsl_fft_halfcomplex.h>
+
+int
+main (void)
+{
+ int i, n = 100;
+ double data[n];
+
+ gsl_fft_real_wavetable * real;
+ gsl_fft_halfcomplex_wavetable * hc;
+ gsl_fft_real_workspace * work;
+
+ for (i = 0; i < n; i++)
+ {
+ data[i] = 0.0;
+ }
+
+ for (i = n / 3; i < 2 * n / 3; i++)
+ {
+ data[i] = 1.0;
+ }
+
+ for (i = 0; i < n; i++)
+ {
+ printf ("%d: %e\n", i, data[i]);
+ }
+ printf ("\n");
+
+ work = gsl_fft_real_workspace_alloc (n);
+ real = gsl_fft_real_wavetable_alloc (n);
+
+ gsl_fft_real_transform (data, 1, n,
+ real, work);
+
+ gsl_fft_real_wavetable_free (real);
+
+ for (i = 11; i < n; i++)
+ {
+ data[i] = 0;
+ }
+
+ hc = gsl_fft_halfcomplex_wavetable_alloc (n);
+
+ gsl_fft_halfcomplex_inverse (data, 1, n,
+ hc, work);
+ gsl_fft_halfcomplex_wavetable_free (hc);
+
+ for (i = 0; i < n; i++)
+ {
+ printf ("%d: %e\n", i, data[i]);
+ }
+
+ gsl_fft_real_workspace_free (work);
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/fitting.c b/gsl-1.9/doc/examples/fitting.c
new file mode 100644
index 0000000..5c36969
--- /dev/null
+++ b/gsl-1.9/doc/examples/fitting.c
@@ -0,0 +1,45 @@
+#include <stdio.h>
+#include <gsl/gsl_fit.h>
+
+int
+main (void)
+{
+ int i, n = 4;
+ double x[4] = { 1970, 1980, 1990, 2000 };
+ double y[4] = { 12, 11, 14, 13 };
+ double w[4] = { 0.1, 0.2, 0.3, 0.4 };
+
+ double c0, c1, cov00, cov01, cov11, chisq;
+
+ gsl_fit_wlinear (x, 1, w, 1, y, 1, n,
+ &c0, &c1, &cov00, &cov01, &cov11,
+ &chisq);
+
+ printf ("# best fit: Y = %g + %g X\n", c0, c1);
+ printf ("# covariance matrix:\n");
+ printf ("# [ %g, %g\n# %g, %g]\n",
+ cov00, cov01, cov01, cov11);
+ printf ("# chisq = %g\n", chisq);
+
+ for (i = 0; i < n; i++)
+ printf ("data: %g %g %g\n",
+ x[i], y[i], 1/sqrt(w[i]));
+
+ printf ("\n");
+
+ for (i = -30; i < 130; i++)
+ {
+ double xf = x[0] + (i/100.0) * (x[n-1] - x[0]);
+ double yf, yf_err;
+
+ gsl_fit_linear_est (xf,
+ c0, c1,
+ cov00, cov01, cov11,
+ &yf, &yf_err);
+
+ printf ("fit: %g %g\n", xf, yf);
+ printf ("hi : %g %g\n", xf, yf + yf_err);
+ printf ("lo : %g %g\n", xf, yf - yf_err);
+ }
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/fitting2.c b/gsl-1.9/doc/examples/fitting2.c
new file mode 100644
index 0000000..43f8c06
--- /dev/null
+++ b/gsl-1.9/doc/examples/fitting2.c
@@ -0,0 +1,80 @@
+#include <stdio.h>
+#include <gsl/gsl_multifit.h>
+
+int
+main (int argc, char **argv)
+{
+ int i, n;
+ double xi, yi, ei, chisq;
+ gsl_matrix *X, *cov;
+ gsl_vector *y, *w, *c;
+
+ if (argc != 2)
+ {
+ fprintf (stderr,"usage: fit n < data\n");
+ exit (-1);
+ }
+
+ n = atoi (argv[1]);
+
+ X = gsl_matrix_alloc (n, 3);
+ y = gsl_vector_alloc (n);
+ w = gsl_vector_alloc (n);
+
+ c = gsl_vector_alloc (3);
+ cov = gsl_matrix_alloc (3, 3);
+
+ for (i = 0; i < n; i++)
+ {
+ int count = fscanf (stdin, "%lg %lg %lg",
+ &xi, &yi, &ei);
+
+ if (count != 3)
+ {
+ fprintf (stderr, "error reading file\n");
+ exit (-1);
+ }
+
+ printf ("%g %g +/- %g\n", xi, yi, ei);
+
+ gsl_matrix_set (X, i, 0, 1.0);
+ gsl_matrix_set (X, i, 1, xi);
+ gsl_matrix_set (X, i, 2, xi*xi);
+
+ gsl_vector_set (y, i, yi);
+ gsl_vector_set (w, i, 1.0/(ei*ei));
+ }
+
+ {
+ gsl_multifit_linear_workspace * work
+ = gsl_multifit_linear_alloc (n, 3);
+ gsl_multifit_wlinear (X, w, y, c, cov,
+ &chisq, work);
+ gsl_multifit_linear_free (work);
+ }
+
+#define C(i) (gsl_vector_get(c,(i)))
+#define COV(i,j) (gsl_matrix_get(cov,(i),(j)))
+
+ {
+ printf ("# best fit: Y = %g + %g X + %g X^2\n",
+ C(0), C(1), C(2));
+
+ printf ("# covariance matrix:\n");
+ printf ("[ %+.5e, %+.5e, %+.5e \n",
+ COV(0,0), COV(0,1), COV(0,2));
+ printf (" %+.5e, %+.5e, %+.5e \n",
+ COV(1,0), COV(1,1), COV(1,2));
+ printf (" %+.5e, %+.5e, %+.5e ]\n",
+ COV(2,0), COV(2,1), COV(2,2));
+ printf ("# chisq = %g\n", chisq);
+ }
+
+ gsl_matrix_free (X);
+ gsl_vector_free (y);
+ gsl_vector_free (w);
+ gsl_vector_free (c);
+ gsl_matrix_free (cov);
+
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/fitting3.c b/gsl-1.9/doc/examples/fitting3.c
new file mode 100644
index 0000000..a3f1e32
--- /dev/null
+++ b/gsl-1.9/doc/examples/fitting3.c
@@ -0,0 +1,29 @@
+#include <stdio.h>
+#include <math.h>
+#include <gsl/gsl_randist.h>
+
+int
+main (void)
+{
+ double x;
+ const gsl_rng_type * T;
+ gsl_rng * r;
+
+ gsl_rng_env_setup ();
+
+ T = gsl_rng_default;
+ r = gsl_rng_alloc (T);
+
+ for (x = 0.1; x < 2; x+= 0.1)
+ {
+ double y0 = exp (x);
+ double sigma = 0.1 * y0;
+ double dy = gsl_ran_gaussian (r, sigma);
+
+ printf ("%g %g %g\n", x, y0 + dy, sigma);
+ }
+
+ gsl_rng_free(r);
+
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/histogram.c b/gsl-1.9/doc/examples/histogram.c
new file mode 100644
index 0000000..a3c5150
--- /dev/null
+++ b/gsl-1.9/doc/examples/histogram.c
@@ -0,0 +1,37 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <gsl/gsl_histogram.h>
+
+int
+main (int argc, char **argv)
+{
+ double a, b;
+ size_t n;
+
+ if (argc != 4)
+ {
+ printf ("Usage: gsl-histogram xmin xmax n\n"
+ "Computes a histogram of the data "
+ "on stdin using n bins from xmin "
+ "to xmax\n");
+ exit (0);
+ }
+
+ a = atof (argv[1]);
+ b = atof (argv[2]);
+ n = atoi (argv[3]);
+
+ {
+ double x;
+ gsl_histogram * h = gsl_histogram_alloc (n);
+ gsl_histogram_set_ranges_uniform (h, a, b);
+
+ while (fscanf (stdin, "%lg", &x) == 1)
+ {
+ gsl_histogram_increment (h, x);
+ }
+ gsl_histogram_fprintf (stdout, h, "%g", "%g");
+ gsl_histogram_free (h);
+ }
+ exit (0);
+}
diff --git a/gsl-1.9/doc/examples/histogram2d.c b/gsl-1.9/doc/examples/histogram2d.c
new file mode 100644
index 0000000..3fcabb4
--- /dev/null
+++ b/gsl-1.9/doc/examples/histogram2d.c
@@ -0,0 +1,50 @@
+#include <stdio.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_histogram2d.h>
+
+int
+main (void)
+{
+ const gsl_rng_type * T;
+ gsl_rng * r;
+
+ gsl_histogram2d * h = gsl_histogram2d_alloc (10, 10);
+
+ gsl_histogram2d_set_ranges_uniform (h,
+ 0.0, 1.0,
+ 0.0, 1.0);
+
+ gsl_histogram2d_accumulate (h, 0.3, 0.3, 1);
+ gsl_histogram2d_accumulate (h, 0.8, 0.1, 5);
+ gsl_histogram2d_accumulate (h, 0.7, 0.9, 0.5);
+
+ gsl_rng_env_setup ();
+
+ T = gsl_rng_default;
+ r = gsl_rng_alloc (T);
+
+ {
+ int i;
+ gsl_histogram2d_pdf * p
+ = gsl_histogram2d_pdf_alloc (h->nx, h->ny);
+
+ gsl_histogram2d_pdf_init (p, h);
+
+ for (i = 0; i < 1000; i++) {
+ double x, y;
+ double u = gsl_rng_uniform (r);
+ double v = gsl_rng_uniform (r);
+
+ gsl_histogram2d_pdf_sample (p, u, v, &x, &y);
+
+ printf ("%g %g\n", x, y);
+ }
+
+ gsl_histogram2d_pdf_free (p);
+ }
+
+ gsl_histogram2d_free (h);
+ gsl_rng_free (r);
+
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/ieee.c b/gsl-1.9/doc/examples/ieee.c
new file mode 100644
index 0000000..c7f1110
--- /dev/null
+++ b/gsl-1.9/doc/examples/ieee.c
@@ -0,0 +1,22 @@
+#include <stdio.h>
+#include <gsl/gsl_ieee_utils.h>
+
+int
+main (void)
+{
+ float f = 1.0/3.0;
+ double d = 1.0/3.0;
+
+ double fd = f; /* promote from float to double */
+
+ printf (" f="); gsl_ieee_printf_float(&f);
+ printf ("\n");
+
+ printf ("fd="); gsl_ieee_printf_double(&fd);
+ printf ("\n");
+
+ printf (" d="); gsl_ieee_printf_double(&d);
+ printf ("\n");
+
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/ieeeround.c b/gsl-1.9/doc/examples/ieeeround.c
new file mode 100644
index 0000000..04f837d
--- /dev/null
+++ b/gsl-1.9/doc/examples/ieeeround.c
@@ -0,0 +1,30 @@
+#include <stdio.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_ieee_utils.h>
+
+int
+main (void)
+{
+ double x = 1, oldsum = 0, sum = 0;
+ int i = 0;
+
+ gsl_ieee_env_setup (); /* read GSL_IEEE_MODE */
+
+ do
+ {
+ i++;
+
+ oldsum = sum;
+ sum += x;
+ x = x / i;
+
+ printf ("i=%2d sum=%.18f error=%g\n",
+ i, sum, sum - M_E);
+
+ if (i > 30)
+ break;
+ }
+ while (sum != oldsum);
+
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/integration.c b/gsl-1.9/doc/examples/integration.c
new file mode 100644
index 0000000..a8f2450
--- /dev/null
+++ b/gsl-1.9/doc/examples/integration.c
@@ -0,0 +1,37 @@
+#include <stdio.h>
+#include <math.h>
+#include <gsl/gsl_integration.h>
+
+double f (double x, void * params) {
+ double alpha = *(double *) params;
+ double f = log(alpha*x) / sqrt(x);
+ return f;
+}
+
+int
+main (void)
+{
+ gsl_integration_workspace * w
+ = gsl_integration_workspace_alloc (1000);
+
+ double result, error;
+ double expected = -4.0;
+ double alpha = 1.0;
+
+ gsl_function F;
+ F.function = &f;
+ F.params = &alpha;
+
+ gsl_integration_qags (&F, 0, 1, 0, 1e-7, 1000,
+ w, &result, &error);
+
+ printf ("result = % .18f\n", result);
+ printf ("exact result = % .18f\n", expected);
+ printf ("estimated error = % .18f\n", error);
+ printf ("actual error = % .18f\n", result - expected);
+ printf ("intervals = %d\n", w->size);
+
+ gsl_integration_workspace_free (w);
+
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/integration.out b/gsl-1.9/doc/examples/integration.out
new file mode 100644
index 0000000..4758ebf
--- /dev/null
+++ b/gsl-1.9/doc/examples/integration.out
@@ -0,0 +1,5 @@
+result = -3.999999999999973799
+exact result = -4.000000000000000000
+estimated error = 0.000000000000246025
+actual error = 0.000000000000026201
+intervals = 8
diff --git a/gsl-1.9/doc/examples/interp.c b/gsl-1.9/doc/examples/interp.c
new file mode 100644
index 0000000..5c6e8fc
--- /dev/null
+++ b/gsl-1.9/doc/examples/interp.c
@@ -0,0 +1,41 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_spline.h>
+
+int
+main (void)
+{
+ int i;
+ double xi, yi, x[10], y[10];
+
+ printf ("#m=0,S=2\n");
+
+ for (i = 0; i < 10; i++)
+ {
+ x[i] = i + 0.5 * sin (i);
+ y[i] = i + cos (i * i);
+ printf ("%g %g\n", x[i], y[i]);
+ }
+
+ printf ("#m=1,S=0\n");
+
+ {
+ gsl_interp_accel *acc
+ = gsl_interp_accel_alloc ();
+ gsl_spline *spline
+ = gsl_spline_alloc (gsl_interp_cspline, 10);
+
+ gsl_spline_init (spline, x, y, 10);
+
+ for (xi = x[0]; xi < x[9]; xi += 0.01)
+ {
+ yi = gsl_spline_eval (spline, xi, acc);
+ printf ("%g %g\n", xi, yi);
+ }
+ gsl_spline_free (spline);
+ gsl_interp_accel_free (acc);
+ }
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/interpp.c b/gsl-1.9/doc/examples/interpp.c
new file mode 100644
index 0000000..8ffdbcc
--- /dev/null
+++ b/gsl-1.9/doc/examples/interpp.c
@@ -0,0 +1,40 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_spline.h>
+
+int
+main (void)
+{
+ int N = 4;
+ double x[4] = {0.00, 0.10, 0.27, 0.30};
+ double y[4] = {0.15, 0.70, -0.10, 0.15}; /* Note: first = last
+ for periodic data */
+
+ gsl_interp_accel *acc = gsl_interp_accel_alloc ();
+ const gsl_interp_type *t = gsl_interp_cspline_periodic;
+ gsl_spline *spline = gsl_spline_alloc (t, N);
+
+ int i; double xi, yi;
+
+ printf ("#m=0,S=5\n");
+ for (i = 0; i < N; i++)
+ {
+ printf ("%g %g\n", x[i], y[i]);
+ }
+
+ printf ("#m=1,S=0\n");
+ gsl_spline_init (spline, x, y, N);
+
+ for (i = 0; i <= 100; i++)
+ {
+ xi = (1 - i / 100.0) * x[0] + (i / 100.0) * x[N-1];
+ yi = gsl_spline_eval (spline, xi, acc);
+ printf ("%g %g\n", xi, yi);
+ }
+
+ gsl_spline_free (spline);
+ gsl_interp_accel_free (acc);
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/intro.c b/gsl-1.9/doc/examples/intro.c
new file mode 100644
index 0000000..bd28482
--- /dev/null
+++ b/gsl-1.9/doc/examples/intro.c
@@ -0,0 +1,11 @@
+#include <stdio.h>
+#include <gsl/gsl_sf_bessel.h>
+
+int
+main (void)
+{
+ double x = 5.0;
+ double y = gsl_sf_bessel_J0 (x);
+ printf ("J0(%g) = %.18e\n", x, y);
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/intro.out b/gsl-1.9/doc/examples/intro.out
new file mode 100644
index 0000000..ca264dd
--- /dev/null
+++ b/gsl-1.9/doc/examples/intro.out
@@ -0,0 +1 @@
+J0(5) = -1.775967713143382920e-01
diff --git a/gsl-1.9/doc/examples/linalglu.c b/gsl-1.9/doc/examples/linalglu.c
new file mode 100644
index 0000000..61b5293
--- /dev/null
+++ b/gsl-1.9/doc/examples/linalglu.c
@@ -0,0 +1,36 @@
+#include <stdio.h>
+#include <gsl/gsl_linalg.h>
+
+int
+main (void)
+{
+ double a_data[] = { 0.18, 0.60, 0.57, 0.96,
+ 0.41, 0.24, 0.99, 0.58,
+ 0.14, 0.30, 0.97, 0.66,
+ 0.51, 0.13, 0.19, 0.85 };
+
+ double b_data[] = { 1.0, 2.0, 3.0, 4.0 };
+
+ gsl_matrix_view m
+ = gsl_matrix_view_array (a_data, 4, 4);
+
+ gsl_vector_view b
+ = gsl_vector_view_array (b_data, 4);
+
+ gsl_vector *x = gsl_vector_alloc (4);
+
+ int s;
+
+ gsl_permutation * p = gsl_permutation_alloc (4);
+
+ gsl_linalg_LU_decomp (&m.matrix, p, &s);
+
+ gsl_linalg_LU_solve (&m.matrix, p, &b.vector, x);
+
+ printf ("x = \n");
+ gsl_vector_fprintf (stdout, x, "%g");
+
+ gsl_permutation_free (p);
+ gsl_vector_free (x);
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/linalglu.out b/gsl-1.9/doc/examples/linalglu.out
new file mode 100644
index 0000000..406f59a
--- /dev/null
+++ b/gsl-1.9/doc/examples/linalglu.out
@@ -0,0 +1,4 @@
+x = -4.05205
+-12.6056
+1.66091
+8.69377
diff --git a/gsl-1.9/doc/examples/matrix.c b/gsl-1.9/doc/examples/matrix.c
new file mode 100644
index 0000000..7704687
--- /dev/null
+++ b/gsl-1.9/doc/examples/matrix.c
@@ -0,0 +1,22 @@
+#include <stdio.h>
+#include <gsl/gsl_matrix.h>
+
+int
+main (void)
+{
+ int i, j;
+ gsl_matrix * m = gsl_matrix_alloc (10, 3);
+
+ for (i = 0; i < 10; i++)
+ for (j = 0; j < 3; j++)
+ gsl_matrix_set (m, i, j, 0.23 + 100*i + j);
+
+ for (i = 0; i < 100; i++) /* OUT OF RANGE ERROR */
+ for (j = 0; j < 3; j++)
+ printf ("m(%d,%d) = %g\n", i, j,
+ gsl_matrix_get (m, i, j));
+
+ gsl_matrix_free (m);
+
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/matrixw.c b/gsl-1.9/doc/examples/matrixw.c
new file mode 100644
index 0000000..b05ffbd
--- /dev/null
+++ b/gsl-1.9/doc/examples/matrixw.c
@@ -0,0 +1,40 @@
+#include <stdio.h>
+#include <gsl/gsl_matrix.h>
+
+int
+main (void)
+{
+ int i, j, k = 0;
+ gsl_matrix * m = gsl_matrix_alloc (100, 100);
+ gsl_matrix * a = gsl_matrix_alloc (100, 100);
+
+ for (i = 0; i < 100; i++)
+ for (j = 0; j < 100; j++)
+ gsl_matrix_set (m, i, j, 0.23 + i + j);
+
+ {
+ FILE * f = fopen ("test.dat", "wb");
+ gsl_matrix_fwrite (f, m);
+ fclose (f);
+ }
+
+ {
+ FILE * f = fopen ("test.dat", "rb");
+ gsl_matrix_fread (f, a);
+ fclose (f);
+ }
+
+ for (i = 0; i < 100; i++)
+ for (j = 0; j < 100; j++)
+ {
+ double mij = gsl_matrix_get (m, i, j);
+ double aij = gsl_matrix_get (a, i, j);
+ if (mij != aij) k++;
+ }
+
+ gsl_matrix_free (m);
+ gsl_matrix_free (a);
+
+ printf ("differences = %d (should be zero)\n", k);
+ return (k > 0);
+}
diff --git a/gsl-1.9/doc/examples/min.c b/gsl-1.9/doc/examples/min.c
new file mode 100644
index 0000000..ebba625
--- /dev/null
+++ b/gsl-1.9/doc/examples/min.c
@@ -0,0 +1,65 @@
+#include <stdio.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_min.h>
+
+double fn1 (double x, void * params)
+{
+ return cos(x) + 1.0;
+}
+
+int
+main (void)
+{
+ int status;
+ int iter = 0, max_iter = 100;
+ const gsl_min_fminimizer_type *T;
+ gsl_min_fminimizer *s;
+ double m = 2.0, m_expected = M_PI;
+ double a = 0.0, b = 6.0;
+ gsl_function F;
+
+ F.function = &fn1;
+ F.params = 0;
+
+ T = gsl_min_fminimizer_brent;
+ s = gsl_min_fminimizer_alloc (T);
+ gsl_min_fminimizer_set (s, &F, m, a, b);
+
+ printf ("using %s method\n",
+ gsl_min_fminimizer_name (s));
+
+ printf ("%5s [%9s, %9s] %9s %10s %9s\n",
+ "iter", "lower", "upper", "min",
+ "err", "err(est)");
+
+ printf ("%5d [%.7f, %.7f] %.7f %+.7f %.7f\n",
+ iter, a, b,
+ m, m - m_expected, b - a);
+
+ do
+ {
+ iter++;
+ status = gsl_min_fminimizer_iterate (s);
+
+ m = gsl_min_fminimizer_x_minimum (s);
+ a = gsl_min_fminimizer_x_lower (s);
+ b = gsl_min_fminimizer_x_upper (s);
+
+ status
+ = gsl_min_test_interval (a, b, 0.001, 0.0);
+
+ if (status == GSL_SUCCESS)
+ printf ("Converged:\n");
+
+ printf ("%5d [%.7f, %.7f] "
+ "%.7f %.7f %+.7f %.7f\n",
+ iter, a, b,
+ m, m_expected, m - m_expected, b - a);
+ }
+ while (status == GSL_CONTINUE && iter < max_iter);
+
+ gsl_min_fminimizer_free (s);
+
+ return status;
+}
diff --git a/gsl-1.9/doc/examples/min.out b/gsl-1.9/doc/examples/min.out
new file mode 100644
index 0000000..93d02fc
--- /dev/null
+++ b/gsl-1.9/doc/examples/min.out
@@ -0,0 +1,13 @@
+ 0 [0.0000000, 6.0000000] 2.0000000 -1.1415927 6.0000000
+ 1 [2.0000000, 6.0000000] 3.2758640 +0.1342713 4.0000000
+ 2 [2.0000000, 3.2831929] 3.2758640 +0.1342713 1.2831929
+ 3 [2.8689068, 3.2831929] 3.2758640 +0.1342713 0.4142862
+ 4 [2.8689068, 3.2831929] 3.2758640 +0.1342713 0.4142862
+ 5 [2.8689068, 3.2758640] 3.1460585 +0.0044658 0.4069572
+ 6 [3.1346075, 3.2758640] 3.1460585 +0.0044658 0.1412565
+ 7 [3.1346075, 3.1874620] 3.1460585 +0.0044658 0.0528545
+ 8 [3.1346075, 3.1460585] 3.1460585 +0.0044658 0.0114510
+ 9 [3.1346075, 3.1460585] 3.1424060 +0.0008133 0.0114510
+ 10 [3.1346075, 3.1424060] 3.1415885 -0.0000041 0.0077985
+Converged:
+ 11 [3.1415885, 3.1424060] 3.1415927 -0.0000000 0.0008175
diff --git a/gsl-1.9/doc/examples/monte.c b/gsl-1.9/doc/examples/monte.c
new file mode 100644
index 0000000..2c23747
--- /dev/null
+++ b/gsl-1.9/doc/examples/monte.c
@@ -0,0 +1,106 @@
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_monte.h>
+#include <gsl/gsl_monte_plain.h>
+#include <gsl/gsl_monte_miser.h>
+#include <gsl/gsl_monte_vegas.h>
+
+/* Computation of the integral,
+
+ I = int (dx dy dz)/(2pi)^3 1/(1-cos(x)cos(y)cos(z))
+
+ over (-pi,-pi,-pi) to (+pi, +pi, +pi). The exact answer
+ is Gamma(1/4)^4/(4 pi^3). This example is taken from
+ C.Itzykson, J.M.Drouffe, "Statistical Field Theory -
+ Volume 1", Section 1.1, p21, which cites the original
+ paper M.L.Glasser, I.J.Zucker, Proc.Natl.Acad.Sci.USA 74
+ 1800 (1977) */
+
+/* For simplicity we compute the integral over the region
+ (0,0,0) -> (pi,pi,pi) and multiply by 8 */
+
+double exact = 1.3932039296856768591842462603255;
+
+double
+g (double *k, size_t dim, void *params)
+{
+ double A = 1.0 / (M_PI * M_PI * M_PI);
+ return A / (1.0 - cos (k[0]) * cos (k[1]) * cos (k[2]));
+}
+
+void
+display_results (char *title, double result, double error)
+{
+ printf ("%s ==================\n", title);
+ printf ("result = % .6f\n", result);
+ printf ("sigma = % .6f\n", error);
+ printf ("exact = % .6f\n", exact);
+ printf ("error = % .6f = %.1g sigma\n", result - exact,
+ fabs (result - exact) / error);
+}
+
+int
+main (void)
+{
+ double res, err;
+
+ double xl[3] = { 0, 0, 0 };
+ double xu[3] = { M_PI, M_PI, M_PI };
+
+ const gsl_rng_type *T;
+ gsl_rng *r;
+
+ gsl_monte_function G = { &g, 3, 0 };
+
+ size_t calls = 500000;
+
+ gsl_rng_env_setup ();
+
+ T = gsl_rng_default;
+ r = gsl_rng_alloc (T);
+
+ {
+ gsl_monte_plain_state *s = gsl_monte_plain_alloc (3);
+ gsl_monte_plain_integrate (&G, xl, xu, 3, calls, r, s,
+ &res, &err);
+ gsl_monte_plain_free (s);
+
+ display_results ("plain", res, err);
+ }
+
+ {
+ gsl_monte_miser_state *s = gsl_monte_miser_alloc (3);
+ gsl_monte_miser_integrate (&G, xl, xu, 3, calls, r, s,
+ &res, &err);
+ gsl_monte_miser_free (s);
+
+ display_results ("miser", res, err);
+ }
+
+ {
+ gsl_monte_vegas_state *s = gsl_monte_vegas_alloc (3);
+
+ gsl_monte_vegas_integrate (&G, xl, xu, 3, 10000, r, s,
+ &res, &err);
+ display_results ("vegas warm-up", res, err);
+
+ printf ("converging...\n");
+
+ do
+ {
+ gsl_monte_vegas_integrate (&G, xl, xu, 3, calls/5, r, s,
+ &res, &err);
+ printf ("result = % .6f sigma = % .6f "
+ "chisq/dof = %.1f\n", res, err, s->chisq);
+ }
+ while (fabs (s->chisq - 1.0) > 0.5);
+
+ display_results ("vegas final", res, err);
+
+ gsl_monte_vegas_free (s);
+ }
+
+ gsl_rng_free (r);
+
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/nlfit.c b/gsl-1.9/doc/examples/nlfit.c
new file mode 100644
index 0000000..49b4137
--- /dev/null
+++ b/gsl-1.9/doc/examples/nlfit.c
@@ -0,0 +1,115 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_blas.h>
+#include <gsl/gsl_multifit_nlin.h>
+
+#include "expfit.c"
+
+#define N 40
+
+void print_state (size_t iter, gsl_multifit_fdfsolver * s);
+
+int
+main (void)
+{
+ const gsl_multifit_fdfsolver_type *T;
+ gsl_multifit_fdfsolver *s;
+ int status;
+ unsigned int i, iter = 0;
+ const size_t n = N;
+ const size_t p = 3;
+
+ gsl_matrix *covar = gsl_matrix_alloc (p, p);
+ double y[N], sigma[N];
+ struct data d = { n, y, sigma};
+ gsl_multifit_function_fdf f;
+ double x_init[3] = { 1.0, 0.0, 0.0 };
+ gsl_vector_view x = gsl_vector_view_array (x_init, p);
+ const gsl_rng_type * type;
+ gsl_rng * r;
+
+ gsl_rng_env_setup();
+
+ type = gsl_rng_default;
+ r = gsl_rng_alloc (type);
+
+ f.f = &expb_f;
+ f.df = &expb_df;
+ f.fdf = &expb_fdf;
+ f.n = n;
+ f.p = p;
+ f.params = &d;
+
+ /* This is the data to be fitted */
+
+ for (i = 0; i < n; i++)
+ {
+ double t = i;
+ y[i] = 1.0 + 5 * exp (-0.1 * t)
+ + gsl_ran_gaussian (r, 0.1);
+ sigma[i] = 0.1;
+ printf ("data: %u %g %g\n", i, y[i], sigma[i]);
+ };
+
+ T = gsl_multifit_fdfsolver_lmsder;
+ s = gsl_multifit_fdfsolver_alloc (T, n, p);
+ gsl_multifit_fdfsolver_set (s, &f, &x.vector);
+
+ print_state (iter, s);
+
+ do
+ {
+ iter++;
+ status = gsl_multifit_fdfsolver_iterate (s);
+
+ printf ("status = %s\n", gsl_strerror (status));
+
+ print_state (iter, s);
+
+ if (status)
+ break;
+
+ status = gsl_multifit_test_delta (s->dx, s->x,
+ 1e-4, 1e-4);
+ }
+ while (status == GSL_CONTINUE && iter < 500);
+
+ gsl_multifit_covar (s->J, 0.0, covar);
+
+#define FIT(i) gsl_vector_get(s->x, i)
+#define ERR(i) sqrt(gsl_matrix_get(covar,i,i))
+
+ {
+ double chi = gsl_blas_dnrm2(s->f);
+ double dof = n - p;
+ double c = GSL_MAX_DBL(1, chi / sqrt(dof));
+
+ printf("chisq/dof = %g\n", pow(chi, 2.0) / dof);
+
+ printf ("A = %.5f +/- %.5f\n", FIT(0), c*ERR(0));
+ printf ("lambda = %.5f +/- %.5f\n", FIT(1), c*ERR(1));
+ printf ("b = %.5f +/- %.5f\n", FIT(2), c*ERR(2));
+ }
+
+ printf ("status = %s\n", gsl_strerror (status));
+
+ gsl_multifit_fdfsolver_free (s);
+ gsl_matrix_free (covar);
+ gsl_rng_free (r);
+ return 0;
+}
+
+void
+print_state (size_t iter, gsl_multifit_fdfsolver * s)
+{
+ printf ("iter: %3u x = % 15.8f % 15.8f % 15.8f "
+ "|f(x)| = %g\n",
+ iter,
+ gsl_vector_get (s->x, 0),
+ gsl_vector_get (s->x, 1),
+ gsl_vector_get (s->x, 2),
+ gsl_blas_dnrm2 (s->f));
+}
diff --git a/gsl-1.9/doc/examples/ntupler.c b/gsl-1.9/doc/examples/ntupler.c
new file mode 100644
index 0000000..a926522
--- /dev/null
+++ b/gsl-1.9/doc/examples/ntupler.c
@@ -0,0 +1,72 @@
+#include <math.h>
+#include <gsl/gsl_ntuple.h>
+#include <gsl/gsl_histogram.h>
+
+struct data
+{
+ double x;
+ double y;
+ double z;
+};
+
+int sel_func (void *ntuple_data, void *params);
+double val_func (void *ntuple_data, void *params);
+
+int
+main (void)
+{
+ struct data ntuple_row;
+
+ gsl_ntuple *ntuple
+ = gsl_ntuple_open ("test.dat", &ntuple_row,
+ sizeof (ntuple_row));
+ double lower = 1.5;
+
+ gsl_ntuple_select_fn S;
+ gsl_ntuple_value_fn V;
+
+ gsl_histogram *h = gsl_histogram_alloc (100);
+ gsl_histogram_set_ranges_uniform(h, 0.0, 10.0);
+
+ S.function = &sel_func;
+ S.params = &lower;
+
+ V.function = &val_func;
+ V.params = 0;
+
+ gsl_ntuple_project (h, ntuple, &V, &S);
+ gsl_histogram_fprintf (stdout, h, "%f", "%f");
+ gsl_histogram_free (h);
+ gsl_ntuple_close (ntuple);
+
+ return 0;
+}
+
+int
+sel_func (void *ntuple_data, void *params)
+{
+ struct data * data = (struct data *) ntuple_data;
+ double x, y, z, E2, scale;
+ scale = *(double *) params;
+
+ x = data->x;
+ y = data->y;
+ z = data->z;
+
+ E2 = x * x + y * y + z * z;
+
+ return E2 > scale;
+}
+
+double
+val_func (void *ntuple_data, void *params)
+{
+ struct data * data = (struct data *) ntuple_data;
+ double x, y, z;
+
+ x = data->x;
+ y = data->y;
+ z = data->z;
+
+ return x * x + y * y + z * z;
+}
diff --git a/gsl-1.9/doc/examples/ntuplew.c b/gsl-1.9/doc/examples/ntuplew.c
new file mode 100644
index 0000000..82f6fa4
--- /dev/null
+++ b/gsl-1.9/doc/examples/ntuplew.c
@@ -0,0 +1,43 @@
+#include <gsl/gsl_ntuple.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+
+struct data
+{
+ double x;
+ double y;
+ double z;
+};
+
+int
+main (void)
+{
+ const gsl_rng_type * T;
+ gsl_rng * r;
+
+ struct data ntuple_row;
+ int i;
+
+ gsl_ntuple *ntuple
+ = gsl_ntuple_create ("test.dat", &ntuple_row,
+ sizeof (ntuple_row));
+
+ gsl_rng_env_setup ();
+
+ T = gsl_rng_default;
+ r = gsl_rng_alloc (T);
+
+ for (i = 0; i < 10000; i++)
+ {
+ ntuple_row.x = gsl_ran_ugaussian (r);
+ ntuple_row.y = gsl_ran_ugaussian (r);
+ ntuple_row.z = gsl_ran_ugaussian (r);
+
+ gsl_ntuple_write (ntuple);
+ }
+
+ gsl_ntuple_close (ntuple);
+ gsl_rng_free (r);
+
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/ode-initval.c b/gsl-1.9/doc/examples/ode-initval.c
new file mode 100644
index 0000000..8a8f794
--- /dev/null
+++ b/gsl-1.9/doc/examples/ode-initval.c
@@ -0,0 +1,70 @@
+#include <stdio.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_odeiv.h>
+
+int
+func (double t, const double y[], double f[],
+ void *params)
+{
+ double mu = *(double *)params;
+ f[0] = y[1];
+ f[1] = -y[0] - mu*y[1]*(y[0]*y[0] - 1);
+ return GSL_SUCCESS;
+}
+
+int
+jac (double t, const double y[], double *dfdy,
+ double dfdt[], void *params)
+{
+ double mu = *(double *)params;
+ gsl_matrix_view dfdy_mat
+ = gsl_matrix_view_array (dfdy, 2, 2);
+ gsl_matrix * m = &dfdy_mat.matrix;
+ gsl_matrix_set (m, 0, 0, 0.0);
+ gsl_matrix_set (m, 0, 1, 1.0);
+ gsl_matrix_set (m, 1, 0, -2.0*mu*y[0]*y[1] - 1.0);
+ gsl_matrix_set (m, 1, 1, -mu*(y[0]*y[0] - 1.0));
+ dfdt[0] = 0.0;
+ dfdt[1] = 0.0;
+ return GSL_SUCCESS;
+}
+
+int
+main (void)
+{
+ const gsl_odeiv_step_type * T
+ = gsl_odeiv_step_rk8pd;
+
+ gsl_odeiv_step * s
+ = gsl_odeiv_step_alloc (T, 2);
+ gsl_odeiv_control * c
+ = gsl_odeiv_control_y_new (1e-6, 0.0);
+ gsl_odeiv_evolve * e
+ = gsl_odeiv_evolve_alloc (2);
+
+ double mu = 10;
+ gsl_odeiv_system sys = {func, jac, 2, &mu};
+
+ double t = 0.0, t1 = 100.0;
+ double h = 1e-6;
+ double y[2] = { 1.0, 0.0 };
+
+ while (t < t1)
+ {
+ int status = gsl_odeiv_evolve_apply (e, c, s,
+ &sys,
+ &t, t1,
+ &h, y);
+
+ if (status != GSL_SUCCESS)
+ break;
+
+ printf ("%.5e %.5e %.5e\n", t, y[0], y[1]);
+ }
+
+ gsl_odeiv_evolve_free (e);
+ gsl_odeiv_control_free (c);
+ gsl_odeiv_step_free (s);
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/odefixed.c b/gsl-1.9/doc/examples/odefixed.c
new file mode 100644
index 0000000..3c81bf3
--- /dev/null
+++ b/gsl-1.9/doc/examples/odefixed.c
@@ -0,0 +1,42 @@
+int
+main (void)
+{
+ const gsl_odeiv_step_type * T
+ = gsl_odeiv_step_rk4;
+
+ gsl_odeiv_step * s
+ = gsl_odeiv_step_alloc (T, 2);
+
+ double mu = 10;
+ gsl_odeiv_system sys = {func, jac, 2, &mu};
+
+ double t = 0.0, t1 = 100.0;
+ double h = 1e-2;
+ double y[2] = { 1.0, 0.0 }, y_err[2];
+ double dydt_in[2], dydt_out[2];
+
+ /* initialise dydt_in from system parameters */
+ GSL_ODEIV_FN_EVAL(&sys, t, y, dydt_in);
+
+ while (t < t1)
+ {
+ int status = gsl_odeiv_step_apply (s, t, h,
+ y, y_err,
+ dydt_in,
+ dydt_out,
+ &sys);
+
+ if (status != GSL_SUCCESS)
+ break;
+
+ dydt_in[0] = dydt_out[0];
+ dydt_in[1] = dydt_out[1];
+
+ t += h;
+
+ printf ("%.5e %.5e %.5e\n", t, y[0], y[1]);
+ }
+
+ gsl_odeiv_step_free (s);
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/permseq.c b/gsl-1.9/doc/examples/permseq.c
new file mode 100644
index 0000000..08ebf63
--- /dev/null
+++ b/gsl-1.9/doc/examples/permseq.c
@@ -0,0 +1,21 @@
+#include <stdio.h>
+#include <gsl/gsl_permutation.h>
+
+int
+main (void)
+{
+ gsl_permutation * p = gsl_permutation_alloc (3);
+
+ gsl_permutation_init (p);
+
+ do
+ {
+ gsl_permutation_fprintf (stdout, p, " %u");
+ printf ("\n");
+ }
+ while (gsl_permutation_next(p) == GSL_SUCCESS);
+
+ gsl_permutation_free (p);
+
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/permshuffle.c b/gsl-1.9/doc/examples/permshuffle.c
new file mode 100644
index 0000000..7247864
--- /dev/null
+++ b/gsl-1.9/doc/examples/permshuffle.c
@@ -0,0 +1,40 @@
+#include <stdio.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+#include <gsl/gsl_permutation.h>
+
+int
+main (void)
+{
+ const size_t N = 10;
+ const gsl_rng_type * T;
+ gsl_rng * r;
+
+ gsl_permutation * p = gsl_permutation_alloc (N);
+ gsl_permutation * q = gsl_permutation_alloc (N);
+
+ gsl_rng_env_setup();
+ T = gsl_rng_default;
+ r = gsl_rng_alloc (T);
+
+ printf ("initial permutation:");
+ gsl_permutation_init (p);
+ gsl_permutation_fprintf (stdout, p, " %u");
+ printf ("\n");
+
+ printf (" random permutation:");
+ gsl_ran_shuffle (r, p->data, N, sizeof(size_t));
+ gsl_permutation_fprintf (stdout, p, " %u");
+ printf ("\n");
+
+ printf ("inverse permutation:");
+ gsl_permutation_inverse (q, p);
+ gsl_permutation_fprintf (stdout, q, " %u");
+ printf ("\n");
+
+ gsl_permutation_free (p);
+ gsl_permutation_free (q);
+ gsl_rng_free (r);
+
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/polyroots.c b/gsl-1.9/doc/examples/polyroots.c
new file mode 100644
index 0000000..6debbd5
--- /dev/null
+++ b/gsl-1.9/doc/examples/polyroots.c
@@ -0,0 +1,26 @@
+#include <stdio.h>
+#include <gsl/gsl_poly.h>
+
+int
+main (void)
+{
+ int i;
+ /* coefficients of P(x) = -1 + x^5 */
+ double a[6] = { -1, 0, 0, 0, 0, 1 };
+ double z[10];
+
+ gsl_poly_complex_workspace * w
+ = gsl_poly_complex_workspace_alloc (6);
+
+ gsl_poly_complex_solve (a, 6, w, z);
+
+ gsl_poly_complex_workspace_free (w);
+
+ for (i = 0; i < 5; i++)
+ {
+ printf ("z%d = %+.18f %+.18f\n",
+ i, z[2*i], z[2*i+1]);
+ }
+
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/polyroots.out b/gsl-1.9/doc/examples/polyroots.out
new file mode 100644
index 0000000..253fe11
--- /dev/null
+++ b/gsl-1.9/doc/examples/polyroots.out
@@ -0,0 +1,5 @@
+z0 = -0.809016994374947451 +0.587785252292473137
+z1 = -0.809016994374947451 -0.587785252292473137
+z2 = +0.309016994374947451 +0.951056516295153642
+z3 = +0.309016994374947451 -0.951056516295153642
+z4 = +1.000000000000000000 +0.000000000000000000
diff --git a/gsl-1.9/doc/examples/qrng.c b/gsl-1.9/doc/examples/qrng.c
new file mode 100644
index 0000000..5275209
--- /dev/null
+++ b/gsl-1.9/doc/examples/qrng.c
@@ -0,0 +1,19 @@
+#include <stdio.h>
+#include <gsl/gsl_qrng.h>
+
+int
+main (void)
+{
+ int i;
+ gsl_qrng * q = gsl_qrng_alloc (gsl_qrng_sobol, 2);
+
+ for (i = 0; i < 1024; i++)
+ {
+ double v[2];
+ gsl_qrng_get (q, v);
+ printf ("%.5f %.5f\n", v[0], v[1]);
+ }
+
+ gsl_qrng_free (q);
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/randpoisson.2.out b/gsl-1.9/doc/examples/randpoisson.2.out
new file mode 100644
index 0000000..fbe36a2
--- /dev/null
+++ b/gsl-1.9/doc/examples/randpoisson.2.out
@@ -0,0 +1,2 @@
+GSL_RNG_SEED=123
+ 4 5 6 3 3 1 4 2 5 5
diff --git a/gsl-1.9/doc/examples/randpoisson.c b/gsl-1.9/doc/examples/randpoisson.c
new file mode 100644
index 0000000..ef69b72
--- /dev/null
+++ b/gsl-1.9/doc/examples/randpoisson.c
@@ -0,0 +1,35 @@
+#include <stdio.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+
+int
+main (void)
+{
+ const gsl_rng_type * T;
+ gsl_rng * r;
+
+ int i, n = 10;
+ double mu = 3.0;
+
+ /* create a generator chosen by the
+ environment variable GSL_RNG_TYPE */
+
+ gsl_rng_env_setup();
+
+ T = gsl_rng_default;
+ r = gsl_rng_alloc (T);
+
+ /* print n random variates chosen from
+ the poisson distribution with mean
+ parameter mu */
+
+ for (i = 0; i < n; i++)
+ {
+ unsigned int k = gsl_ran_poisson (r, mu);
+ printf (" %u", k);
+ }
+
+ printf ("\n");
+ gsl_rng_free (r);
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/randpoisson.out b/gsl-1.9/doc/examples/randpoisson.out
new file mode 100644
index 0000000..1639cca
--- /dev/null
+++ b/gsl-1.9/doc/examples/randpoisson.out
@@ -0,0 +1 @@
+ 2 5 5 2 1 0 3 4 1 1
diff --git a/gsl-1.9/doc/examples/randwalk.c b/gsl-1.9/doc/examples/randwalk.c
new file mode 100644
index 0000000..588aa50
--- /dev/null
+++ b/gsl-1.9/doc/examples/randwalk.c
@@ -0,0 +1,29 @@
+#include <stdio.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+
+int
+main (void)
+{
+ int i;
+ double x = 0, y = 0, dx, dy;
+
+ const gsl_rng_type * T;
+ gsl_rng * r;
+
+ gsl_rng_env_setup();
+ T = gsl_rng_default;
+ r = gsl_rng_alloc (T);
+
+ printf ("%g %g\n", x, y);
+
+ for (i = 0; i < 10; i++)
+ {
+ gsl_ran_dir_2d (r, &dx, &dy);
+ x += dx; y += dy;
+ printf ("%g %g\n", x, y);
+ }
+
+ gsl_rng_free (r);
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/rng.c b/gsl-1.9/doc/examples/rng.c
new file mode 100644
index 0000000..6330264
--- /dev/null
+++ b/gsl-1.9/doc/examples/rng.c
@@ -0,0 +1,22 @@
+#include <stdio.h>
+#include <gsl/gsl_rng.h>
+
+gsl_rng * r; /* global generator */
+
+int
+main (void)
+{
+ const gsl_rng_type * T;
+
+ gsl_rng_env_setup();
+
+ T = gsl_rng_default;
+ r = gsl_rng_alloc (T);
+
+ printf ("generator type: %s\n", gsl_rng_name (r));
+ printf ("seed = %lu\n", gsl_rng_default_seed);
+ printf ("first value = %lu\n", gsl_rng_get (r));
+
+ gsl_rng_free (r);
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/rng.out b/gsl-1.9/doc/examples/rng.out
new file mode 100644
index 0000000..00f33a3
--- /dev/null
+++ b/gsl-1.9/doc/examples/rng.out
@@ -0,0 +1,3 @@
+generator type: mt19937
+seed = 0
+first value = 4293858116
diff --git a/gsl-1.9/doc/examples/rngunif.2.out b/gsl-1.9/doc/examples/rngunif.2.out
new file mode 100644
index 0000000..d04fccd
--- /dev/null
+++ b/gsl-1.9/doc/examples/rngunif.2.out
@@ -0,0 +1,12 @@
+GSL_RNG_TYPE=mrg
+GSL_RNG_SEED=123
+0.33050
+0.86631
+0.32982
+0.67620
+0.53391
+0.06457
+0.16847
+0.70229
+0.04371
+0.86374
diff --git a/gsl-1.9/doc/examples/rngunif.c b/gsl-1.9/doc/examples/rngunif.c
new file mode 100644
index 0000000..ca4b2db
--- /dev/null
+++ b/gsl-1.9/doc/examples/rngunif.c
@@ -0,0 +1,26 @@
+#include <stdio.h>
+#include <gsl/gsl_rng.h>
+
+int
+main (void)
+{
+ const gsl_rng_type * T;
+ gsl_rng * r;
+
+ int i, n = 10;
+
+ gsl_rng_env_setup();
+
+ T = gsl_rng_default;
+ r = gsl_rng_alloc (T);
+
+ for (i = 0; i < n; i++)
+ {
+ double u = gsl_rng_uniform (r);
+ printf ("%.5f\n", u);
+ }
+
+ gsl_rng_free (r);
+
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/rngunif.out b/gsl-1.9/doc/examples/rngunif.out
new file mode 100644
index 0000000..b4049ef
--- /dev/null
+++ b/gsl-1.9/doc/examples/rngunif.out
@@ -0,0 +1,10 @@
+0.99974
+0.16291
+0.28262
+0.94720
+0.23166
+0.48497
+0.95748
+0.74431
+0.54004
+0.73995
diff --git a/gsl-1.9/doc/examples/rootnewt.c b/gsl-1.9/doc/examples/rootnewt.c
new file mode 100644
index 0000000..fea5f11
--- /dev/null
+++ b/gsl-1.9/doc/examples/rootnewt.c
@@ -0,0 +1,52 @@
+#include <stdio.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_roots.h>
+
+#include "demo_fn.h"
+#include "demo_fn.c"
+
+int
+main (void)
+{
+ int status;
+ int iter = 0, max_iter = 100;
+ const gsl_root_fdfsolver_type *T;
+ gsl_root_fdfsolver *s;
+ double x0, x = 5.0, r_expected = sqrt (5.0);
+ gsl_function_fdf FDF;
+ struct quadratic_params params = {1.0, 0.0, -5.0};
+
+ FDF.f = &quadratic;
+ FDF.df = &quadratic_deriv;
+ FDF.fdf = &quadratic_fdf;
+ FDF.params = &params;
+
+ T = gsl_root_fdfsolver_newton;
+ s = gsl_root_fdfsolver_alloc (T);
+ gsl_root_fdfsolver_set (s, &FDF, x);
+
+ printf ("using %s method\n",
+ gsl_root_fdfsolver_name (s));
+
+ printf ("%-5s %10s %10s %10s\n",
+ "iter", "root", "err", "err(est)");
+ do
+ {
+ iter++;
+ status = gsl_root_fdfsolver_iterate (s);
+ x0 = x;
+ x = gsl_root_fdfsolver_root (s);
+ status = gsl_root_test_delta (x, x0, 0, 1e-3);
+
+ if (status == GSL_SUCCESS)
+ printf ("Converged:\n");
+
+ printf ("%5d %10.7f %+10.7f %10.7f\n",
+ iter, x, x - r_expected, x - x0);
+ }
+ while (status == GSL_CONTINUE && iter < max_iter);
+
+ gsl_root_fdfsolver_free (s);
+ return status;
+}
diff --git a/gsl-1.9/doc/examples/roots.c b/gsl-1.9/doc/examples/roots.c
new file mode 100644
index 0000000..7854fbc
--- /dev/null
+++ b/gsl-1.9/doc/examples/roots.c
@@ -0,0 +1,58 @@
+#include <stdio.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_roots.h>
+
+#include "demo_fn.h"
+#include "demo_fn.c"
+
+int
+main (void)
+{
+ int status;
+ int iter = 0, max_iter = 100;
+ const gsl_root_fsolver_type *T;
+ gsl_root_fsolver *s;
+ double r = 0, r_expected = sqrt (5.0);
+ double x_lo = 0.0, x_hi = 5.0;
+ gsl_function F;
+ struct quadratic_params params = {1.0, 0.0, -5.0};
+
+ F.function = &quadratic;
+ F.params = &params;
+
+ T = gsl_root_fsolver_brent;
+ s = gsl_root_fsolver_alloc (T);
+ gsl_root_fsolver_set (s, &F, x_lo, x_hi);
+
+ printf ("using %s method\n",
+ gsl_root_fsolver_name (s));
+
+ printf ("%5s [%9s, %9s] %9s %10s %9s\n",
+ "iter", "lower", "upper", "root",
+ "err", "err(est)");
+
+ do
+ {
+ iter++;
+ status = gsl_root_fsolver_iterate (s);
+ r = gsl_root_fsolver_root (s);
+ x_lo = gsl_root_fsolver_x_lower (s);
+ x_hi = gsl_root_fsolver_x_upper (s);
+ status = gsl_root_test_interval (x_lo, x_hi,
+ 0, 0.001);
+
+ if (status == GSL_SUCCESS)
+ printf ("Converged:\n");
+
+ printf ("%5d [%.7f, %.7f] %.7f %+.7f %.7f\n",
+ iter, x_lo, x_hi,
+ r, r - r_expected,
+ x_hi - x_lo);
+ }
+ while (status == GSL_CONTINUE && iter < max_iter);
+
+ gsl_root_fsolver_free (s);
+
+ return status;
+}
diff --git a/gsl-1.9/doc/examples/siman.c b/gsl-1.9/doc/examples/siman.c
new file mode 100644
index 0000000..50f08e0
--- /dev/null
+++ b/gsl-1.9/doc/examples/siman.c
@@ -0,0 +1,82 @@
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gsl/gsl_siman.h>
+
+/* set up parameters for this simulated annealing run */
+
+/* how many points do we try before stepping */
+#define N_TRIES 200
+
+/* how many iterations for each T? */
+#define ITERS_FIXED_T 1000
+
+/* max step size in random walk */
+#define STEP_SIZE 1.0
+
+/* Boltzmann constant */
+#define K 1.0
+
+/* initial temperature */
+#define T_INITIAL 0.008
+
+/* damping factor for temperature */
+#define MU_T 1.003
+#define T_MIN 2.0e-6
+
+gsl_siman_params_t params
+ = {N_TRIES, ITERS_FIXED_T, STEP_SIZE,
+ K, T_INITIAL, MU_T, T_MIN};
+
+/* now some functions to test in one dimension */
+double E1(void *xp)
+{
+ double x = * ((double *) xp);
+
+ return exp(-pow((x-1.0),2.0))*sin(8*x);
+}
+
+double M1(void *xp, void *yp)
+{
+ double x = *((double *) xp);
+ double y = *((double *) yp);
+
+ return fabs(x - y);
+}
+
+void S1(const gsl_rng * r, void *xp, double step_size)
+{
+ double old_x = *((double *) xp);
+ double new_x;
+
+ double u = gsl_rng_uniform(r);
+ new_x = u * 2 * step_size - step_size + old_x;
+
+ memcpy(xp, &new_x, sizeof(new_x));
+}
+
+void P1(void *xp)
+{
+ printf ("%12g", *((double *) xp));
+}
+
+int
+main(int argc, char *argv[])
+{
+ const gsl_rng_type * T;
+ gsl_rng * r;
+
+ double x_initial = 15.5;
+
+ gsl_rng_env_setup();
+
+ T = gsl_rng_default;
+ r = gsl_rng_alloc(T);
+
+ gsl_siman_solve(r, &x_initial, E1, S1, M1, P1,
+ NULL, NULL, NULL,
+ sizeof(double), params);
+
+ gsl_rng_free (r);
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/sortsmall.c b/gsl-1.9/doc/examples/sortsmall.c
new file mode 100644
index 0000000..5b72517
--- /dev/null
+++ b/gsl-1.9/doc/examples/sortsmall.c
@@ -0,0 +1,38 @@
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_sort_double.h>
+
+int
+main (void)
+{
+ const gsl_rng_type * T;
+ gsl_rng * r;
+
+ size_t i, k = 5, N = 100000;
+
+ double * x = malloc (N * sizeof(double));
+ double * small = malloc (k * sizeof(double));
+
+ gsl_rng_env_setup();
+
+ T = gsl_rng_default;
+ r = gsl_rng_alloc (T);
+
+ for (i = 0; i < N; i++)
+ {
+ x[i] = gsl_rng_uniform(r);
+ }
+
+ gsl_sort_smallest (small, k, x, 1, N);
+
+ printf ("%d smallest values from %d\n", k, N);
+
+ for (i = 0; i < k; i++)
+ {
+ printf ("%d: %.18f\n", i, small[i]);
+ }
+
+ free (x);
+ free (small);
+ gsl_rng_free (r);
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/sortsmall.out b/gsl-1.9/doc/examples/sortsmall.out
new file mode 100644
index 0000000..b8c7c93
--- /dev/null
+++ b/gsl-1.9/doc/examples/sortsmall.out
@@ -0,0 +1,6 @@
+5 smallest values from 100000
+0: 0.000003489200025797
+1: 0.000008199829608202
+2: 0.000008953968062997
+3: 0.000010712770745158
+4: 0.000033531803637743
diff --git a/gsl-1.9/doc/examples/specfun.c b/gsl-1.9/doc/examples/specfun.c
new file mode 100644
index 0000000..7c1a9b0
--- /dev/null
+++ b/gsl-1.9/doc/examples/specfun.c
@@ -0,0 +1,15 @@
+#include <stdio.h>
+#include <gsl/gsl_sf_bessel.h>
+
+int
+main (void)
+{
+ double x = 5.0;
+ double expected = -0.17759677131433830434739701;
+
+ double y = gsl_sf_bessel_J0 (x);
+
+ printf ("J0(5.0) = %.18f\n", y);
+ printf ("exact = %.18f\n", expected);
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/specfun.out b/gsl-1.9/doc/examples/specfun.out
new file mode 100644
index 0000000..dbe2443
--- /dev/null
+++ b/gsl-1.9/doc/examples/specfun.out
@@ -0,0 +1,2 @@
+J0(5.0) = -0.177596771314338292
+exact = -0.177596771314338292
diff --git a/gsl-1.9/doc/examples/specfun_e.c b/gsl-1.9/doc/examples/specfun_e.c
new file mode 100644
index 0000000..4f41f2a
--- /dev/null
+++ b/gsl-1.9/doc/examples/specfun_e.c
@@ -0,0 +1,21 @@
+#include <stdio.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_bessel.h>
+
+int
+main (void)
+{
+ double x = 5.0;
+ gsl_sf_result result;
+
+ double expected = -0.17759677131433830434739701;
+
+ int status = gsl_sf_bessel_J0_e (x, &result);
+
+ printf ("status = %s\n", gsl_strerror(status));
+ printf ("J0(5.0) = %.18f\n"
+ " +/- % .18f\n",
+ result.val, result.err);
+ printf ("exact = %.18f\n", expected);
+ return status;
+}
diff --git a/gsl-1.9/doc/examples/specfun_e.out b/gsl-1.9/doc/examples/specfun_e.out
new file mode 100644
index 0000000..61e1314
--- /dev/null
+++ b/gsl-1.9/doc/examples/specfun_e.out
@@ -0,0 +1,4 @@
+status = success
+J0(5.0) = -0.177596771314338292
+ +/- 0.000000000000000193
+exact = -0.177596771314338292
diff --git a/gsl-1.9/doc/examples/stat.c b/gsl-1.9/doc/examples/stat.c
new file mode 100644
index 0000000..253f704
--- /dev/null
+++ b/gsl-1.9/doc/examples/stat.c
@@ -0,0 +1,23 @@
+#include <stdio.h>
+#include <gsl/gsl_statistics.h>
+
+int
+main(void)
+{
+ double data[5] = {17.2, 18.1, 16.5, 18.3, 12.6};
+ double mean, variance, largest, smallest;
+
+ mean = gsl_stats_mean(data, 1, 5);
+ variance = gsl_stats_variance(data, 1, 5);
+ largest = gsl_stats_max(data, 1, 5);
+ smallest = gsl_stats_min(data, 1, 5);
+
+ printf ("The dataset is %g, %g, %g, %g, %g\n",
+ data[0], data[1], data[2], data[3], data[4]);
+
+ printf ("The sample mean is %g\n", mean);
+ printf ("The estimated variance is %g\n", variance);
+ printf ("The largest value is %g\n", largest);
+ printf ("The smallest value is %g\n", smallest);
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/stat.out b/gsl-1.9/doc/examples/stat.out
new file mode 100644
index 0000000..232081d
--- /dev/null
+++ b/gsl-1.9/doc/examples/stat.out
@@ -0,0 +1,5 @@
+The dataset is 17.2, 18.1, 16.5, 18.3, 12.6
+The sample mean is 16.54
+The estimated variance is 4.2984
+The largest value is 18.3
+The smallest value is 12.6
diff --git a/gsl-1.9/doc/examples/statsort.c b/gsl-1.9/doc/examples/statsort.c
new file mode 100644
index 0000000..2780f67
--- /dev/null
+++ b/gsl-1.9/doc/examples/statsort.c
@@ -0,0 +1,36 @@
+#include <stdio.h>
+#include <gsl/gsl_sort.h>
+#include <gsl/gsl_statistics.h>
+
+int
+main(void)
+{
+ double data[5] = {17.2, 18.1, 16.5, 18.3, 12.6};
+ double median, upperq, lowerq;
+
+ printf ("Original dataset: %g, %g, %g, %g, %g\n",
+ data[0], data[1], data[2], data[3], data[4]);
+
+ gsl_sort (data, 1, 5);
+
+ printf ("Sorted dataset: %g, %g, %g, %g, %g\n",
+ data[0], data[1], data[2], data[3], data[4]);
+
+ median
+ = gsl_stats_median_from_sorted_data (data,
+ 1, 5);
+
+ upperq
+ = gsl_stats_quantile_from_sorted_data (data,
+ 1, 5,
+ 0.75);
+ lowerq
+ = gsl_stats_quantile_from_sorted_data (data,
+ 1, 5,
+ 0.25);
+
+ printf ("The median is %g\n", median);
+ printf ("The upper quartile is %g\n", upperq);
+ printf ("The lower quartile is %g\n", lowerq);
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/statsort.out b/gsl-1.9/doc/examples/statsort.out
new file mode 100644
index 0000000..628522c
--- /dev/null
+++ b/gsl-1.9/doc/examples/statsort.out
@@ -0,0 +1,5 @@
+Original dataset: 17.2, 18.1, 16.5, 18.3, 12.6
+Sorted dataset: 12.6, 16.5, 17.2, 18.1, 18.3
+The median is 17.2
+The upper quartile is 18.1
+The lower quartile is 16.5
diff --git a/gsl-1.9/doc/examples/sum.c b/gsl-1.9/doc/examples/sum.c
new file mode 100644
index 0000000..c0237ea
--- /dev/null
+++ b/gsl-1.9/doc/examples/sum.c
@@ -0,0 +1,47 @@
+#include <stdio.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_sum.h>
+
+#define N 20
+
+int
+main (void)
+{
+ double t[N];
+ double sum_accel, err;
+ double sum = 0;
+ int n;
+
+ gsl_sum_levin_u_workspace * w
+ = gsl_sum_levin_u_alloc (N);
+
+ const double zeta_2 = M_PI * M_PI / 6.0;
+
+ /* terms for zeta(2) = \sum_{n=1}^{\infty} 1/n^2 */
+
+ for (n = 0; n < N; n++)
+ {
+ double np1 = n + 1.0;
+ t[n] = 1.0 / (np1 * np1);
+ sum += t[n];
+ }
+
+ gsl_sum_levin_u_accel (t, N, w, &sum_accel, &err);
+
+ printf ("term-by-term sum = % .16f using %d terms\n",
+ sum, N);
+
+ printf ("term-by-term sum = % .16f using %d terms\n",
+ w->sum_plain, w->terms_used);
+
+ printf ("exact value = % .16f\n", zeta_2);
+ printf ("accelerated sum = % .16f using %d terms\n",
+ sum_accel, w->terms_used);
+
+ printf ("estimated error = % .16f\n", err);
+ printf ("actual error = % .16f\n",
+ sum_accel - zeta_2);
+
+ gsl_sum_levin_u_free (w);
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/sum.out b/gsl-1.9/doc/examples/sum.out
new file mode 100644
index 0000000..28089e9
--- /dev/null
+++ b/gsl-1.9/doc/examples/sum.out
@@ -0,0 +1,6 @@
+term-by-term sum = 1.5961632439130233 using 20 terms
+term-by-term sum = 1.5759958390005426 using 13 terms
+exact value = 1.6449340668482264
+accelerated sum = 1.6449340668166479 using 13 terms
+estimated error = 0.0000000000508580
+actual error = -0.0000000000315785
diff --git a/gsl-1.9/doc/examples/vector.c b/gsl-1.9/doc/examples/vector.c
new file mode 100644
index 0000000..27462b0
--- /dev/null
+++ b/gsl-1.9/doc/examples/vector.c
@@ -0,0 +1,22 @@
+#include <stdio.h>
+#include <gsl/gsl_vector.h>
+
+int
+main (void)
+{
+ int i;
+ gsl_vector * v = gsl_vector_alloc (3);
+
+ for (i = 0; i < 3; i++)
+ {
+ gsl_vector_set (v, i, 1.23 + i);
+ }
+
+ for (i = 0; i < 100; i++) /* OUT OF RANGE ERROR */
+ {
+ printf ("v_%d = %g\n", i, gsl_vector_get (v, i));
+ }
+
+ gsl_vector_free (v);
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/vectorr.c b/gsl-1.9/doc/examples/vectorr.c
new file mode 100644
index 0000000..203986b
--- /dev/null
+++ b/gsl-1.9/doc/examples/vectorr.c
@@ -0,0 +1,23 @@
+#include <stdio.h>
+#include <gsl/gsl_vector.h>
+
+int
+main (void)
+{
+ int i;
+ gsl_vector * v = gsl_vector_alloc (10);
+
+ {
+ FILE * f = fopen ("test.dat", "r");
+ gsl_vector_fscanf (f, v);
+ fclose (f);
+ }
+
+ for (i = 0; i < 10; i++)
+ {
+ printf ("%g\n", gsl_vector_get(v, i));
+ }
+
+ gsl_vector_free (v);
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/vectorview.c b/gsl-1.9/doc/examples/vectorview.c
new file mode 100644
index 0000000..9225c28
--- /dev/null
+++ b/gsl-1.9/doc/examples/vectorview.c
@@ -0,0 +1,30 @@
+#include <math.h>
+#include <stdio.h>
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_blas.h>
+
+int
+main (void)
+{
+ size_t i,j;
+
+ gsl_matrix *m = gsl_matrix_alloc (10, 10);
+
+ for (i = 0; i < 10; i++)
+ for (j = 0; j < 10; j++)
+ gsl_matrix_set (m, i, j, sin (i) + cos (j));
+
+ for (j = 0; j < 10; j++)
+ {
+ gsl_vector_view column = gsl_matrix_column (m, j);
+ double d;
+
+ d = gsl_blas_dnrm2 (&column.vector);
+
+ printf ("matrix column %d, norm = %g\n", j, d);
+ }
+
+ gsl_matrix_free (m);
+
+ return 0;
+}
diff --git a/gsl-1.9/doc/examples/vectorview.out b/gsl-1.9/doc/examples/vectorview.out
new file mode 100644
index 0000000..0138c24
--- /dev/null
+++ b/gsl-1.9/doc/examples/vectorview.out
@@ -0,0 +1,10 @@
+matrix column 0, norm = 4.31461
+matrix column 1, norm = 3.1205
+matrix column 2, norm = 2.19316
+matrix column 3, norm = 3.26114
+matrix column 4, norm = 2.53416
+matrix column 5, norm = 2.57281
+matrix column 6, norm = 4.20469
+matrix column 7, norm = 3.65202
+matrix column 8, norm = 2.08524
+matrix column 9, norm = 3.07313
diff --git a/gsl-1.9/doc/examples/vectorw.c b/gsl-1.9/doc/examples/vectorw.c
new file mode 100644
index 0000000..f25468b
--- /dev/null
+++ b/gsl-1.9/doc/examples/vectorw.c
@@ -0,0 +1,23 @@
+#include <stdio.h>
+#include <gsl/gsl_vector.h>
+
+int
+main (void)
+{
+ int i;
+ gsl_vector * v = gsl_vector_alloc (100);
+
+ for (i = 0; i < 100; i++)
+ {
+ gsl_vector_set (v, i, 1.23 + i);
+ }
+
+ {
+ FILE * f = fopen ("test.dat", "w");
+ gsl_vector_fprintf (f, v, "%.5g");
+ fclose (f);
+ }
+
+ gsl_vector_free (v);
+ return 0;
+}
diff --git a/gsl-1.9/doc/fdl.texi b/gsl-1.9/doc/fdl.texi
new file mode 100644
index 0000000..f63a200
--- /dev/null
+++ b/gsl-1.9/doc/fdl.texi
@@ -0,0 +1,455 @@
+@cindex FDL, GNU Free Documentation License
+@center Version 1.2, November 2002
+@iftex
+@smallerfonts @rm
+@end iftex
+
+@display
+Copyright @copyright{} 2000,2001,2002 Free Software Foundation, Inc.
+51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+
+Everyone is permitted to copy and distribute verbatim copies of this license
+document, but changing it is not allowed.
+@end display
+
+@enumerate 0
+@item
+PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document @dfn{free} in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of ``copyleft'', which means that derivative
+works of the document must themselves be free in the same sense. It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does. But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book. We recommend this License
+principally for works whose purpose is instruction or reference.
+
+@item
+APPLICABILITY AND DEFINITIONS
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License. Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein. The ``Document'', below,
+refers to any such manual or work. Any member of the public is a
+licensee, and is addressed as ``you''. You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A ``Modified Version'' of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A ``Secondary Section'' is a named appendix or a front-matter section
+of the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall
+subject (or to related matters) and contains nothing that could fall
+directly within that overall subject. (Thus, if the Document is in
+part a textbook of mathematics, a Secondary Section may not explain
+any mathematics.) The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The ``Invariant Sections'' are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License. If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant. The Document may contain zero
+Invariant Sections. If the Document does not identify any Invariant
+Sections then there are none.
+
+The ``Cover Texts'' are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License. A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A ``Transparent'' copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters. A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text. A copy that is not ``Transparent'' is called ``Opaque''.
+
+Examples of suitable formats for Transparent copies include plain
+@sc{ascii} without markup, Texinfo input format, La@TeX{} input
+format, @acronym{SGML} or @acronym{XML} using a publicly available
+@acronym{DTD}, and standard-conforming simple @acronym{HTML},
+PostScript or @acronym{PDF} designed for human modification. Examples
+of transparent image formats include @acronym{PNG}, @acronym{XCF} and
+@acronym{JPG}. Opaque formats include proprietary formats that can be
+read and edited only by proprietary word processors, @acronym{SGML} or
+@acronym{XML} for which the @acronym{DTD} and/or processing tools are
+not generally available, and the machine-generated @acronym{HTML},
+PostScript or @acronym{PDF} produced by some word processors for
+output purposes only.
+
+The ``Title Page'' means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page. For works in
+formats which do not have any title page as such, ``Title Page'' means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+A section ``Entitled XYZ'' means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language. (Here XYZ stands for a
+specific section name mentioned below, such as ``Acknowledgements'',
+``Dedications'', ``Endorsements'', or ``History''.) To ``Preserve the Title''
+of such a section when you modify the Document means that it remains a
+section ``Entitled XYZ'' according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document. These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+
+@item
+VERBATIM COPYING
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License. You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute. However, you may accept
+compensation in exchange for copies. If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+@item
+COPYING IN QUANTITY
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover. Both covers must also clearly and legibly identify
+you as the publisher of these copies. The front cover must present
+the full title with all words of the title equally prominent and
+visible. You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+
+@item
+MODIFICATIONS
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it. In addition, you must do these things in the Modified Version:
+
+@enumerate A
+@item
+Use in the Title Page (and on the covers, if any) a title distinct
+from that of the Document, and from those of previous versions
+(which should, if there were any, be listed in the History section
+of the Document). You may use the same title as a previous version
+if the original publisher of that version gives permission.
+
+@item
+List on the Title Page, as authors, one or more persons or entities
+responsible for authorship of the modifications in the Modified
+Version, together with at least five of the principal authors of the
+Document (all of its principal authors, if it has fewer than five),
+unless they release you from this requirement.
+
+@item
+State on the Title page the name of the publisher of the
+Modified Version, as the publisher.
+
+@item
+Preserve all the copyright notices of the Document.
+
+@item
+Add an appropriate copyright notice for your modifications
+adjacent to the other copyright notices.
+
+@item
+Include, immediately after the copyright notices, a license notice
+giving the public permission to use the Modified Version under the
+terms of this License, in the form shown in the Addendum below.
+
+@item
+Preserve in that license notice the full lists of Invariant Sections
+and required Cover Texts given in the Document's license notice.
+
+@item
+Include an unaltered copy of this License.
+
+@item
+Preserve the section Entitled ``History'', Preserve its Title, and add
+to it an item stating at least the title, year, new authors, and
+publisher of the Modified Version as given on the Title Page. If
+there is no section Entitled ``History'' in the Document, create one
+stating the title, year, authors, and publisher of the Document as
+given on its Title Page, then add an item describing the Modified
+Version as stated in the previous sentence.
+
+@item
+Preserve the network location, if any, given in the Document for
+public access to a Transparent copy of the Document, and likewise
+the network locations given in the Document for previous versions
+it was based on. These may be placed in the ``History'' section.
+You may omit a network location for a work that was published at
+least four years before the Document itself, or if the original
+publisher of the version it refers to gives permission.
+
+@item
+For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve
+the Title of the section, and preserve in the section all the
+substance and tone of each of the contributor acknowledgements and/or
+dedications given therein.
+
+@item
+Preserve all the Invariant Sections of the Document,
+unaltered in their text and in their titles. Section numbers
+or the equivalent are not considered part of the section titles.
+
+@item
+Delete any section Entitled ``Endorsements''. Such a section
+may not be included in the Modified Version.
+
+@item
+Do not retitle any existing section to be Entitled ``Endorsements'' or
+to conflict in title with any Invariant Section.
+
+@item
+Preserve any Warranty Disclaimers.
+@end enumerate
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant. To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled ``Endorsements'', provided it contains
+nothing but endorsements of your Modified Version by various
+parties---for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version. Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity. If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+@item
+COMBINING DOCUMENTS
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy. If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled ``History''
+in the various original documents, forming one section Entitled
+``History''; likewise combine any sections Entitled ``Acknowledgements'',
+and any sections Entitled ``Dedications''. You must delete all
+sections Entitled ``Endorsements.''
+
+@item
+COLLECTIONS OF DOCUMENTS
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+
+@item
+AGGREGATION WITH INDEPENDENT WORKS
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an ``aggregate'' if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+
+@item
+TRANSLATION
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections. You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers. In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled ``Acknowledgements'',
+``Dedications'', or ``History'', the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+
+@item
+TERMINATION
+
+You may not copy, modify, sublicense, or distribute the Document except
+as expressly provided for under this License. Any other attempt to
+copy, modify, sublicense or distribute the Document is void, and will
+automatically terminate your rights under this License. However,
+parties who have received copies, or rights, from you under this
+License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+@item
+FUTURE REVISIONS OF THIS LICENSE
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns. See
+@uref{http://www.gnu.org/copyleft/}.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License ``or any later version'' applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation. If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.
+@end enumerate
+
+@page
+@heading ADDENDUM: How to use this License for your documents
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+@smallexample
+@group
+ Copyright (C) @var{year} @var{your name}.
+ Permission is granted to copy, distribute and/or modify
+ this document under the terms of the GNU Free
+ Documentation License, Version 1.2 or any later version
+ published by the Free Software Foundation; with no
+ Invariant Sections, no Front-Cover Texts, and no
+ Back-Cover Texts. A copy of the license is included in
+ the section entitled ``GNU Free Documentation License''.
+@end group
+@end smallexample
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the ``with...Texts.'' line with this:
+
+@smallexample
+@group
+ with the Invariant Sections being @var{list their
+ titles}, with the Front-Cover Texts being @var{list}, and
+ with the Back-Cover Texts being @var{list}.
+@end group
+@end smallexample
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+
+@iftex
+@textfonts @rm
+@end iftex
+@c Local Variables:
+@c ispell-local-pdict: "ispell-dict"
+@c End:
+
diff --git a/gsl-1.9/doc/fft-complex-radix2-f.eps b/gsl-1.9/doc/fft-complex-radix2-f.eps
new file mode 100644
index 0000000..7ce3367
--- /dev/null
+++ b/gsl-1.9/doc/fft-complex-radix2-f.eps
@@ -0,0 +1,298 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Creator: gnuplot
+%%DocumentFonts: Helvetica
+%%BoundingBox: 50 50 410 302
+%%EndComments
+/gnudict 40 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/vshift -46 def
+/dl {10 mul} def
+/hpt 31.5 def
+/vpt 31.5 def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke gnulinewidth 2 mul setlinewidth } def
+/AL { stroke gnulinewidth 2 div setlinewidth } def
+/PL { stroke gnulinewidth setlinewidth } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 dl 2 dl] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 0 1 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 0 1 DL } def
+/LT2 { PL [2 dl 3 dl] 1 0 0 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/P { stroke [] 0 setdash
+ currentlinewidth 2 div sub M
+ 0 currentlinewidth V stroke } def
+/D { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ P } def
+/A { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/B { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ P } def
+/C { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/T { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ P } def
+/S { 2 copy A C} def
+end
+%%EndProlog
+gnudict begin
+gsave
+50 50 translate
+0.050 0.050 scale
+0 setgray
+/Helvetica findfont 140 scalefont setfont
+newpath
+LTa
+672 1163 M
+6297 0 V
+672 211 M
+0 4758 V
+LTb
+672 211 M
+63 0 V
+6234 0 R
+-63 0 V
+588 211 M
+(-0.5) Rshow
+672 1163 M
+63 0 V
+6234 0 R
+-63 0 V
+-6318 0 R
+(0) Rshow
+672 2114 M
+63 0 V
+6234 0 R
+-63 0 V
+-6318 0 R
+(0.5) Rshow
+672 3066 M
+63 0 V
+6234 0 R
+-63 0 V
+-6318 0 R
+(1) Rshow
+672 4017 M
+63 0 V
+6234 0 R
+-63 0 V
+-6318 0 R
+(1.5) Rshow
+672 4969 M
+63 0 V
+6234 0 R
+-63 0 V
+-6318 0 R
+(2) Rshow
+672 211 M
+0 63 V
+0 4695 R
+0 -63 V
+672 71 M
+(0) Cshow
+1664 211 M
+0 63 V
+0 4695 R
+0 -63 V
+1664 71 M
+(20) Cshow
+2655 211 M
+0 63 V
+0 4695 R
+0 -63 V
+2655 71 M
+(40) Cshow
+3647 211 M
+0 63 V
+0 4695 R
+0 -63 V
+3647 71 M
+(60) Cshow
+4639 211 M
+0 63 V
+0 4695 R
+0 -63 V
+4639 71 M
+(80) Cshow
+5630 211 M
+0 63 V
+0 4695 R
+0 -63 V
+5630 71 M
+(100) Cshow
+6622 211 M
+0 63 V
+0 4695 R
+0 -63 V
+6622 71 M
+(120) Cshow
+672 211 M
+6297 0 V
+0 4758 V
+-6297 0 V
+672 211 L
+LT0
+672 4695 D
+722 4541 D
+771 4103 D
+821 3449 D
+870 2676 D
+920 1898 D
+969 1219 D
+1019 720 D
+1069 446 D
+1118 397 D
+1168 537 D
+1217 799 D
+1267 1106 D
+1317 1380 D
+1366 1564 D
+1416 1627 D
+1465 1569 D
+1515 1418 D
+1564 1220 D
+1614 1028 D
+1664 887 D
+1713 826 D
+1763 855 D
+1812 957 D
+1862 1104 D
+1912 1254 D
+1961 1372 D
+2011 1429 D
+2060 1416 D
+2110 1340 D
+2159 1223 D
+2209 1098 D
+2259 994 D
+2308 939 D
+2358 942 D
+2407 1002 D
+2457 1099 D
+2507 1209 D
+2556 1303 D
+2606 1358 D
+2655 1361 D
+2705 1313 D
+2754 1229 D
+2804 1130 D
+2854 1042 D
+2903 987 D
+2953 979 D
+3002 1018 D
+3052 1093 D
+3102 1185 D
+3151 1269 D
+3201 1325 D
+3250 1338 D
+3300 1305 D
+3349 1237 D
+3399 1150 D
+3449 1067 D
+3498 1010 D
+3548 993 D
+3597 1019 D
+3647 1083 D
+3697 1167 D
+3746 1249 D
+3796 1309 D
+3845 1331 D
+3895 1309 D
+3944 1249 D
+3994 1167 D
+4044 1083 D
+4093 1019 D
+4143 993 D
+4192 1010 D
+4242 1067 D
+4292 1150 D
+4341 1237 D
+4391 1305 D
+4440 1338 D
+4490 1325 D
+4539 1269 D
+4589 1185 D
+4639 1093 D
+4688 1018 D
+4738 979 D
+4787 987 D
+4837 1042 D
+4887 1130 D
+4936 1229 D
+4986 1313 D
+5035 1361 D
+5085 1358 D
+5134 1303 D
+5184 1209 D
+5234 1099 D
+5283 1002 D
+5333 942 D
+5382 939 D
+5432 994 D
+5482 1098 D
+5531 1223 D
+5581 1340 D
+5630 1416 D
+5680 1429 D
+5729 1372 D
+5779 1254 D
+5829 1104 D
+5878 957 D
+5928 855 D
+5977 826 D
+6027 887 D
+6077 1028 D
+6126 1220 D
+6176 1418 D
+6225 1569 D
+6275 1627 D
+6324 1564 D
+6374 1380 D
+6424 1106 D
+6473 799 D
+6523 537 D
+6572 397 D
+6622 446 D
+6672 720 D
+6721 1219 D
+6771 1898 D
+6820 2676 D
+6870 3449 D
+6919 4103 D
+6969 4541 D
+stroke
+grestore
+end
+showpage
+%%Trailer
diff --git a/gsl-1.9/doc/fft-complex-radix2-t.eps b/gsl-1.9/doc/fft-complex-radix2-t.eps
new file mode 100644
index 0000000..775fe8c
--- /dev/null
+++ b/gsl-1.9/doc/fft-complex-radix2-t.eps
@@ -0,0 +1,426 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Creator: gnuplot
+%%DocumentFonts: Helvetica
+%%BoundingBox: 50 50 410 302
+%%EndComments
+/gnudict 40 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/vshift -46 def
+/dl {10 mul} def
+/hpt 31.5 def
+/vpt 31.5 def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke gnulinewidth 2 mul setlinewidth } def
+/AL { stroke gnulinewidth 2 div setlinewidth } def
+/PL { stroke gnulinewidth setlinewidth } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 dl 2 dl] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 0 1 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 0 1 DL } def
+/LT2 { PL [2 dl 3 dl] 1 0 0 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/P { stroke [] 0 setdash
+ currentlinewidth 2 div sub M
+ 0 currentlinewidth V stroke } def
+/D { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ P } def
+/A { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/B { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ P } def
+/C { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/T { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ P } def
+/S { 2 copy A C} def
+end
+%%EndProlog
+gnudict begin
+gsave
+50 50 translate
+0.050 0.050 scale
+0 setgray
+/Helvetica findfont 140 scalefont setfont
+newpath
+LTa
+672 1163 M
+6297 0 V
+672 211 M
+0 4758 V
+LTb
+672 211 M
+63 0 V
+6234 0 R
+-63 0 V
+588 211 M
+(-0.5) Rshow
+672 1163 M
+63 0 V
+6234 0 R
+-63 0 V
+-6318 0 R
+(0) Rshow
+672 2114 M
+63 0 V
+6234 0 R
+-63 0 V
+-6318 0 R
+(0.5) Rshow
+672 3066 M
+63 0 V
+6234 0 R
+-63 0 V
+-6318 0 R
+(1) Rshow
+672 4017 M
+63 0 V
+6234 0 R
+-63 0 V
+-6318 0 R
+(1.5) Rshow
+672 4969 M
+63 0 V
+6234 0 R
+-63 0 V
+-6318 0 R
+(2) Rshow
+672 211 M
+0 63 V
+0 4695 R
+0 -63 V
+672 71 M
+(0) Cshow
+1664 211 M
+0 63 V
+0 4695 R
+0 -63 V
+1664 71 M
+(20) Cshow
+2655 211 M
+0 63 V
+0 4695 R
+0 -63 V
+2655 71 M
+(40) Cshow
+3647 211 M
+0 63 V
+0 4695 R
+0 -63 V
+3647 71 M
+(60) Cshow
+4639 211 M
+0 63 V
+0 4695 R
+0 -63 V
+4639 71 M
+(80) Cshow
+5630 211 M
+0 63 V
+0 4695 R
+0 -63 V
+5630 71 M
+(100) Cshow
+6622 211 M
+0 63 V
+0 4695 R
+0 -63 V
+6622 71 M
+(120) Cshow
+672 211 M
+6297 0 V
+0 4758 V
+-6297 0 V
+672 211 L
+LT0
+672 3066 M
+50 0 V
+49 0 V
+50 0 V
+49 0 V
+50 0 V
+49 0 V
+50 0 V
+50 0 V
+49 0 V
+50 0 V
+49 -1903 V
+50 0 V
+50 0 V
+49 0 V
+50 0 V
+49 0 V
+50 0 V
+49 0 V
+50 0 V
+50 0 V
+49 0 V
+50 0 V
+49 0 V
+50 0 V
+50 0 V
+49 0 V
+50 0 V
+49 0 V
+50 0 V
+49 0 V
+50 0 V
+50 0 V
+49 0 V
+50 0 V
+49 0 V
+50 0 V
+50 0 V
+49 0 V
+50 0 V
+49 0 V
+50 0 V
+49 0 V
+50 0 V
+50 0 V
+49 0 V
+50 0 V
+49 0 V
+50 0 V
+50 0 V
+49 0 V
+50 0 V
+49 0 V
+50 0 V
+49 0 V
+50 0 V
+50 0 V
+49 0 V
+50 0 V
+49 0 V
+50 0 V
+50 0 V
+49 0 V
+50 0 V
+49 0 V
+50 0 V
+49 0 V
+50 0 V
+50 0 V
+49 0 V
+50 0 V
+49 0 V
+50 0 V
+50 0 V
+49 0 V
+50 0 V
+49 0 V
+50 0 V
+49 0 V
+50 0 V
+50 0 V
+49 0 V
+50 0 V
+49 0 V
+50 0 V
+50 0 V
+49 0 V
+50 0 V
+49 0 V
+50 0 V
+49 0 V
+50 0 V
+50 0 V
+49 0 V
+50 0 V
+49 0 V
+50 0 V
+50 0 V
+49 0 V
+50 0 V
+49 0 V
+50 0 V
+49 0 V
+50 0 V
+50 0 V
+49 0 V
+50 0 V
+49 0 V
+50 0 V
+50 0 V
+49 0 V
+50 0 V
+49 0 V
+50 0 V
+49 0 V
+50 0 V
+50 0 V
+49 0 V
+50 1903 V
+49 0 V
+50 0 V
+50 0 V
+49 0 V
+50 0 V
+49 0 V
+50 0 V
+49 0 V
+50 0 V
+672 3066 D
+722 3066 D
+771 3066 D
+821 3066 D
+870 3066 D
+920 3066 D
+969 3066 D
+1019 3066 D
+1069 3066 D
+1118 3066 D
+1168 3066 D
+1217 1163 D
+1267 1163 D
+1317 1163 D
+1366 1163 D
+1416 1163 D
+1465 1163 D
+1515 1163 D
+1564 1163 D
+1614 1163 D
+1664 1163 D
+1713 1163 D
+1763 1163 D
+1812 1163 D
+1862 1163 D
+1912 1163 D
+1961 1163 D
+2011 1163 D
+2060 1163 D
+2110 1163 D
+2159 1163 D
+2209 1163 D
+2259 1163 D
+2308 1163 D
+2358 1163 D
+2407 1163 D
+2457 1163 D
+2507 1163 D
+2556 1163 D
+2606 1163 D
+2655 1163 D
+2705 1163 D
+2754 1163 D
+2804 1163 D
+2854 1163 D
+2903 1163 D
+2953 1163 D
+3002 1163 D
+3052 1163 D
+3102 1163 D
+3151 1163 D
+3201 1163 D
+3250 1163 D
+3300 1163 D
+3349 1163 D
+3399 1163 D
+3449 1163 D
+3498 1163 D
+3548 1163 D
+3597 1163 D
+3647 1163 D
+3697 1163 D
+3746 1163 D
+3796 1163 D
+3845 1163 D
+3895 1163 D
+3944 1163 D
+3994 1163 D
+4044 1163 D
+4093 1163 D
+4143 1163 D
+4192 1163 D
+4242 1163 D
+4292 1163 D
+4341 1163 D
+4391 1163 D
+4440 1163 D
+4490 1163 D
+4539 1163 D
+4589 1163 D
+4639 1163 D
+4688 1163 D
+4738 1163 D
+4787 1163 D
+4837 1163 D
+4887 1163 D
+4936 1163 D
+4986 1163 D
+5035 1163 D
+5085 1163 D
+5134 1163 D
+5184 1163 D
+5234 1163 D
+5283 1163 D
+5333 1163 D
+5382 1163 D
+5432 1163 D
+5482 1163 D
+5531 1163 D
+5581 1163 D
+5630 1163 D
+5680 1163 D
+5729 1163 D
+5779 1163 D
+5829 1163 D
+5878 1163 D
+5928 1163 D
+5977 1163 D
+6027 1163 D
+6077 1163 D
+6126 1163 D
+6176 1163 D
+6225 1163 D
+6275 1163 D
+6324 1163 D
+6374 1163 D
+6424 1163 D
+6473 1163 D
+6523 3066 D
+6572 3066 D
+6622 3066 D
+6672 3066 D
+6721 3066 D
+6771 3066 D
+6820 3066 D
+6870 3066 D
+6919 3066 D
+6969 3066 D
+stroke
+grestore
+end
+showpage
+%%Trailer
diff --git a/gsl-1.9/doc/fft-complex-radix2.eps b/gsl-1.9/doc/fft-complex-radix2.eps
new file mode 100644
index 0000000..b653132
--- /dev/null
+++ b/gsl-1.9/doc/fft-complex-radix2.eps
@@ -0,0 +1,682 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Creator: gnuplot
+%%DocumentFonts: Helvetica
+%%BoundingBox: 50 50 410 302
+%%EndComments
+/gnudict 40 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/vshift -46 def
+/dl {10 mul} def
+/hpt 31.5 def
+/vpt 31.5 def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke gnulinewidth 2 mul setlinewidth } def
+/AL { stroke gnulinewidth 2 div setlinewidth } def
+/PL { stroke gnulinewidth setlinewidth } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 dl 2 dl] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 0 1 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 0 1 DL } def
+/LT2 { PL [2 dl 3 dl] 1 0 0 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/P { stroke [] 0 setdash
+ currentlinewidth 2 div sub M
+ 0 currentlinewidth V stroke } def
+/D { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ P } def
+/A { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/B { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ P } def
+/C { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/T { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ P } def
+/S { 2 copy A C} def
+end
+%%EndProlog
+gnudict begin
+gsave
+50 50 translate
+0.050 0.050 scale
+0 setgray
+/Helvetica findfont 140 scalefont setfont
+newpath
+LTa
+672 1163 M
+6297 0 V
+672 211 M
+0 4758 V
+LTb
+672 211 M
+63 0 V
+6234 0 R
+-63 0 V
+588 211 M
+(-0.5) Rshow
+672 1163 M
+63 0 V
+6234 0 R
+-63 0 V
+-6318 0 R
+(0) Rshow
+672 2114 M
+63 0 V
+6234 0 R
+-63 0 V
+-6318 0 R
+(0.5) Rshow
+672 3066 M
+63 0 V
+6234 0 R
+-63 0 V
+-6318 0 R
+(1) Rshow
+672 4017 M
+63 0 V
+6234 0 R
+-63 0 V
+-6318 0 R
+(1.5) Rshow
+672 4969 M
+63 0 V
+6234 0 R
+-63 0 V
+-6318 0 R
+(2) Rshow
+672 211 M
+0 63 V
+0 4695 R
+0 -63 V
+672 71 M
+(0) Cshow
+1656 211 M
+0 63 V
+0 4695 R
+0 -63 V
+1656 71 M
+(20) Cshow
+2640 211 M
+0 63 V
+0 4695 R
+0 -63 V
+2640 71 M
+(40) Cshow
+3624 211 M
+0 63 V
+0 4695 R
+0 -63 V
+3624 71 M
+(60) Cshow
+4608 211 M
+0 63 V
+0 4695 R
+0 -63 V
+4608 71 M
+(80) Cshow
+5592 211 M
+0 63 V
+0 4695 R
+0 -63 V
+5592 71 M
+(100) Cshow
+6575 211 M
+0 63 V
+0 4695 R
+0 -63 V
+6575 71 M
+(120) Cshow
+672 211 M
+6297 0 V
+0 4758 V
+-6297 0 V
+672 211 L
+LT0
+672 3066 M
+49 0 V
+49 0 V
+50 0 V
+49 0 V
+49 0 V
+49 0 V
+49 0 V
+50 0 V
+49 0 V
+49 0 V
+49 -1903 V
+49 0 V
+50 0 V
+49 0 V
+49 0 V
+49 0 V
+49 0 V
+50 0 V
+49 0 V
+49 0 V
+49 0 V
+49 0 V
+49 0 V
+50 0 V
+49 0 V
+49 0 V
+49 0 V
+49 0 V
+50 0 V
+49 0 V
+49 0 V
+49 0 V
+49 0 V
+50 0 V
+49 0 V
+49 0 V
+49 0 V
+49 0 V
+50 0 V
+49 0 V
+49 0 V
+49 0 V
+49 0 V
+50 0 V
+49 0 V
+49 0 V
+49 0 V
+49 0 V
+50 0 V
+49 0 V
+49 0 V
+49 0 V
+49 0 V
+50 0 V
+49 0 V
+49 0 V
+49 0 V
+49 0 V
+50 0 V
+49 0 V
+49 0 V
+49 0 V
+49 0 V
+50 0 V
+49 0 V
+49 0 V
+49 0 V
+49 0 V
+49 0 V
+50 0 V
+49 0 V
+49 0 V
+49 0 V
+49 0 V
+50 0 V
+49 0 V
+49 0 V
+49 0 V
+49 0 V
+50 0 V
+49 0 V
+49 0 V
+49 0 V
+49 0 V
+50 0 V
+49 0 V
+49 0 V
+49 0 V
+49 0 V
+50 0 V
+49 0 V
+49 0 V
+49 0 V
+49 0 V
+50 0 V
+49 0 V
+49 0 V
+49 0 V
+49 0 V
+50 0 V
+49 0 V
+49 0 V
+49 0 V
+49 0 V
+50 0 V
+49 0 V
+49 0 V
+49 0 V
+49 0 V
+49 0 V
+50 0 V
+49 0 V
+49 0 V
+49 0 V
+49 0 V
+50 0 V
+49 0 V
+49 1903 V
+49 0 V
+49 0 V
+50 0 V
+49 0 V
+49 0 V
+49 0 V
+49 0 V
+50 0 V
+49 0 V
+672 4695 M
+49 -154 V
+49 -438 V
+50 -654 V
+49 -773 V
+49 -778 V
+49 -679 V
+49 -499 V
+50 -274 V
+49 -49 V
+49 140 V
+49 262 V
+49 307 V
+50 274 V
+49 184 V
+49 63 V
+49 -58 V
+49 -151 V
+50 -198 V
+49 -192 V
+49 -141 V
+49 -61 V
+49 29 V
+49 102 V
+50 147 V
+49 150 V
+49 118 V
+49 57 V
+49 -13 V
+50 -76 V
+49 -117 V
+49 -125 V
+49 -104 V
+49 -55 V
+50 3 V
+49 60 V
+49 97 V
+49 110 V
+49 94 V
+50 55 V
+49 3 V
+49 -48 V
+49 -84 V
+49 -99 V
+50 -88 V
+49 -55 V
+49 -8 V
+49 39 V
+49 75 V
+50 92 V
+49 84 V
+49 56 V
+49 13 V
+49 -33 V
+50 -68 V
+49 -87 V
+49 -83 V
+49 -57 V
+49 -17 V
+50 26 V
+49 64 V
+49 84 V
+49 82 V
+49 60 V
+50 22 V
+49 -22 V
+49 -60 V
+49 -82 V
+49 -84 V
+49 -64 V
+50 -26 V
+49 17 V
+49 57 V
+49 83 V
+49 87 V
+50 68 V
+49 33 V
+49 -13 V
+49 -56 V
+49 -84 V
+50 -92 V
+49 -75 V
+49 -39 V
+49 8 V
+49 55 V
+50 88 V
+49 99 V
+49 84 V
+49 48 V
+49 -3 V
+50 -55 V
+49 -94 V
+49 -110 V
+49 -97 V
+49 -60 V
+50 -3 V
+49 55 V
+49 104 V
+49 125 V
+49 117 V
+50 76 V
+49 13 V
+49 -57 V
+49 -118 V
+49 -150 V
+50 -147 V
+49 -102 V
+49 -29 V
+49 61 V
+49 141 V
+49 192 V
+50 198 V
+49 151 V
+49 58 V
+49 -63 V
+49 -184 V
+50 -274 V
+49 -307 V
+49 -262 V
+49 -140 V
+49 49 V
+50 274 V
+49 499 V
+49 679 V
+49 778 V
+49 773 V
+50 654 V
+49 438 V
+672 3066 D
+721 3066 D
+770 3066 D
+820 3066 D
+869 3066 D
+918 3066 D
+967 3066 D
+1016 3066 D
+1066 3066 D
+1115 3066 D
+1164 3066 D
+1213 1163 D
+1262 1163 D
+1312 1163 D
+1361 1163 D
+1410 1163 D
+1459 1163 D
+1508 1163 D
+1558 1163 D
+1607 1163 D
+1656 1163 D
+1705 1163 D
+1754 1163 D
+1803 1163 D
+1853 1163 D
+1902 1163 D
+1951 1163 D
+2000 1163 D
+2049 1163 D
+2099 1163 D
+2148 1163 D
+2197 1163 D
+2246 1163 D
+2295 1163 D
+2345 1163 D
+2394 1163 D
+2443 1163 D
+2492 1163 D
+2541 1163 D
+2591 1163 D
+2640 1163 D
+2689 1163 D
+2738 1163 D
+2787 1163 D
+2837 1163 D
+2886 1163 D
+2935 1163 D
+2984 1163 D
+3033 1163 D
+3083 1163 D
+3132 1163 D
+3181 1163 D
+3230 1163 D
+3279 1163 D
+3329 1163 D
+3378 1163 D
+3427 1163 D
+3476 1163 D
+3525 1163 D
+3575 1163 D
+3624 1163 D
+3673 1163 D
+3722 1163 D
+3771 1163 D
+3821 1163 D
+3870 1163 D
+3919 1163 D
+3968 1163 D
+4017 1163 D
+4066 1163 D
+4116 1163 D
+4165 1163 D
+4214 1163 D
+4263 1163 D
+4312 1163 D
+4362 1163 D
+4411 1163 D
+4460 1163 D
+4509 1163 D
+4558 1163 D
+4608 1163 D
+4657 1163 D
+4706 1163 D
+4755 1163 D
+4804 1163 D
+4854 1163 D
+4903 1163 D
+4952 1163 D
+5001 1163 D
+5050 1163 D
+5100 1163 D
+5149 1163 D
+5198 1163 D
+5247 1163 D
+5296 1163 D
+5346 1163 D
+5395 1163 D
+5444 1163 D
+5493 1163 D
+5542 1163 D
+5592 1163 D
+5641 1163 D
+5690 1163 D
+5739 1163 D
+5788 1163 D
+5838 1163 D
+5887 1163 D
+5936 1163 D
+5985 1163 D
+6034 1163 D
+6083 1163 D
+6133 1163 D
+6182 1163 D
+6231 1163 D
+6280 1163 D
+6329 1163 D
+6379 1163 D
+6428 1163 D
+6477 3066 D
+6526 3066 D
+6575 3066 D
+6625 3066 D
+6674 3066 D
+6723 3066 D
+6772 3066 D
+6821 3066 D
+6871 3066 D
+6920 3066 D
+672 4695 D
+721 4541 D
+770 4103 D
+820 3449 D
+869 2676 D
+918 1898 D
+967 1219 D
+1016 720 D
+1066 446 D
+1115 397 D
+1164 537 D
+1213 799 D
+1262 1106 D
+1312 1380 D
+1361 1564 D
+1410 1627 D
+1459 1569 D
+1508 1418 D
+1558 1220 D
+1607 1028 D
+1656 887 D
+1705 826 D
+1754 855 D
+1803 957 D
+1853 1104 D
+1902 1254 D
+1951 1372 D
+2000 1429 D
+2049 1416 D
+2099 1340 D
+2148 1223 D
+2197 1098 D
+2246 994 D
+2295 939 D
+2345 942 D
+2394 1002 D
+2443 1099 D
+2492 1209 D
+2541 1303 D
+2591 1358 D
+2640 1361 D
+2689 1313 D
+2738 1229 D
+2787 1130 D
+2837 1042 D
+2886 987 D
+2935 979 D
+2984 1018 D
+3033 1093 D
+3083 1185 D
+3132 1269 D
+3181 1325 D
+3230 1338 D
+3279 1305 D
+3329 1237 D
+3378 1150 D
+3427 1067 D
+3476 1010 D
+3525 993 D
+3575 1019 D
+3624 1083 D
+3673 1167 D
+3722 1249 D
+3771 1309 D
+3821 1331 D
+3870 1309 D
+3919 1249 D
+3968 1167 D
+4017 1083 D
+4066 1019 D
+4116 993 D
+4165 1010 D
+4214 1067 D
+4263 1150 D
+4312 1237 D
+4362 1305 D
+4411 1338 D
+4460 1325 D
+4509 1269 D
+4558 1185 D
+4608 1093 D
+4657 1018 D
+4706 979 D
+4755 987 D
+4804 1042 D
+4854 1130 D
+4903 1229 D
+4952 1313 D
+5001 1361 D
+5050 1358 D
+5100 1303 D
+5149 1209 D
+5198 1099 D
+5247 1002 D
+5296 942 D
+5346 939 D
+5395 994 D
+5444 1098 D
+5493 1223 D
+5542 1340 D
+5592 1416 D
+5641 1429 D
+5690 1372 D
+5739 1254 D
+5788 1104 D
+5838 957 D
+5887 855 D
+5936 826 D
+5985 887 D
+6034 1028 D
+6083 1220 D
+6133 1418 D
+6182 1569 D
+6231 1627 D
+6280 1564 D
+6329 1380 D
+6379 1106 D
+6428 799 D
+6477 537 D
+6526 397 D
+6575 446 D
+6625 720 D
+6674 1219 D
+6723 1898 D
+6772 2676 D
+6821 3449 D
+6871 4103 D
+6920 4541 D
+stroke
+grestore
+end
+showpage
+%%Trailer
diff --git a/gsl-1.9/doc/fft-real-mixedradix.eps b/gsl-1.9/doc/fft-real-mixedradix.eps
new file mode 100644
index 0000000..b629018
--- /dev/null
+++ b/gsl-1.9/doc/fft-real-mixedradix.eps
@@ -0,0 +1,606 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Creator: gnuplot
+%%DocumentFonts: Helvetica
+%%BoundingBox: 50 50 410 302
+%%EndComments
+/gnudict 40 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/vshift -46 def
+/dl {10 mul} def
+/hpt 31.5 def
+/vpt 31.5 def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke gnulinewidth 2 mul setlinewidth } def
+/AL { stroke gnulinewidth 2 div setlinewidth } def
+/PL { stroke gnulinewidth setlinewidth } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 dl 2 dl] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 0 1 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 0 1 DL } def
+/LT2 { PL [2 dl 3 dl] 1 0 0 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/P { stroke [] 0 setdash
+ currentlinewidth 2 div sub M
+ 0 currentlinewidth V stroke } def
+/D { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ P } def
+/A { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/B { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ P } def
+/C { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/T { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ P } def
+/S { 2 copy A C} def
+end
+%%EndProlog
+gnudict begin
+gsave
+50 50 translate
+0.050 0.050 scale
+0 setgray
+/Helvetica findfont 140 scalefont setfont
+newpath
+LTa
+672 891 M
+6297 0 V
+672 211 M
+0 4758 V
+LTb
+672 211 M
+63 0 V
+6234 0 R
+-63 0 V
+588 211 M
+(-0.2) Rshow
+672 891 M
+63 0 V
+6234 0 R
+-63 0 V
+588 891 M
+(0) Rshow
+672 1570 M
+63 0 V
+6234 0 R
+-63 0 V
+-6318 0 R
+(0.2) Rshow
+672 2250 M
+63 0 V
+6234 0 R
+-63 0 V
+-6318 0 R
+(0.4) Rshow
+672 2930 M
+63 0 V
+6234 0 R
+-63 0 V
+-6318 0 R
+(0.6) Rshow
+672 3610 M
+63 0 V
+6234 0 R
+-63 0 V
+-6318 0 R
+(0.8) Rshow
+672 4289 M
+63 0 V
+6234 0 R
+-63 0 V
+-6318 0 R
+(1) Rshow
+672 4969 M
+63 0 V
+6234 0 R
+-63 0 V
+-6318 0 R
+(1.2) Rshow
+672 211 M
+0 63 V
+0 4695 R
+0 -63 V
+672 71 M
+(0) Cshow
+1302 211 M
+0 63 V
+0 4695 R
+0 -63 V
+1302 71 M
+(10) Cshow
+1931 211 M
+0 63 V
+0 4695 R
+0 -63 V
+1931 71 M
+(20) Cshow
+2561 211 M
+0 63 V
+0 4695 R
+0 -63 V
+2561 71 M
+(30) Cshow
+3191 211 M
+0 63 V
+0 4695 R
+0 -63 V
+3191 71 M
+(40) Cshow
+3820 211 M
+0 63 V
+0 4695 R
+0 -63 V
+3820 71 M
+(50) Cshow
+4450 211 M
+0 63 V
+0 4695 R
+0 -63 V
+4450 71 M
+(60) Cshow
+5080 211 M
+0 63 V
+0 4695 R
+0 -63 V
+5080 71 M
+(70) Cshow
+5710 211 M
+0 63 V
+0 4695 R
+0 -63 V
+5710 71 M
+(80) Cshow
+6339 211 M
+0 63 V
+0 4695 R
+0 -63 V
+6339 71 M
+(90) Cshow
+6969 211 M
+0 63 V
+0 4695 R
+0 -63 V
+6969 71 M
+(100) Cshow
+672 211 M
+6297 0 V
+0 4758 V
+-6297 0 V
+672 211 L
+LT0
+672 891 M
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+62 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 3398 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+62 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+4828 891 L
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+62 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+63 0 V
+672 997 M
+63 -23 V
+63 -35 V
+63 -42 V
+63 -44 V
+63 -39 V
+63 -30 V
+63 -15 V
+63 1 V
+63 19 V
+63 34 V
+63 47 V
+63 52 V
+63 51 V
+63 43 V
+63 28 V
+63 8 V
+62 -16 V
+63 -41 V
+63 -62 V
+63 -77 V
+63 -83 V
+63 -78 V
+63 -60 V
+63 -29 V
+63 15 V
+63 69 V
+63 130 V
+63 195 V
+63 258 V
+63 316 V
+63 362 V
+63 395 V
+63 410 V
+63 407 V
+63 384 V
+63 345 V
+63 291 V
+63 225 V
+63 155 V
+63 83 V
+63 16 V
+63 -41 V
+63 -85 V
+63 -113 V
+63 -124 V
+63 -117 V
+63 -96 V
+63 -63 V
+63 -22 V
+62 22 V
+63 63 V
+63 96 V
+63 117 V
+63 124 V
+63 113 V
+63 85 V
+63 41 V
+63 -16 V
+63 -83 V
+63 -155 V
+63 -225 V
+63 -291 V
+63 -345 V
+63 -384 V
+63 -407 V
+63 -410 V
+63 -395 V
+63 -362 V
+63 -316 V
+63 -258 V
+63 -195 V
+63 -130 V
+63 -69 V
+63 -15 V
+63 29 V
+63 60 V
+63 78 V
+63 83 V
+63 77 V
+63 62 V
+63 41 V
+63 16 V
+63 -8 V
+62 -28 V
+63 -43 V
+63 -51 V
+63 -52 V
+63 -47 V
+63 -34 V
+63 -19 V
+63 -1 V
+63 15 V
+63 30 V
+63 39 V
+63 44 V
+63 42 V
+63 35 V
+63 23 V
+63 8 V
+672 891 D
+735 891 D
+798 891 D
+861 891 D
+924 891 D
+987 891 D
+1050 891 D
+1113 891 D
+1176 891 D
+1239 891 D
+1302 891 D
+1365 891 D
+1428 891 D
+1491 891 D
+1554 891 D
+1617 891 D
+1680 891 D
+1742 891 D
+1805 891 D
+1868 891 D
+1931 891 D
+1994 891 D
+2057 891 D
+2120 891 D
+2183 891 D
+2246 891 D
+2309 891 D
+2372 891 D
+2435 891 D
+2498 891 D
+2561 891 D
+2624 891 D
+2687 891 D
+2750 4289 D
+2813 4289 D
+2876 4289 D
+2939 4289 D
+3002 4289 D
+3065 4289 D
+3128 4289 D
+3191 4289 D
+3254 4289 D
+3317 4289 D
+3380 4289 D
+3443 4289 D
+3506 4289 D
+3569 4289 D
+3632 4289 D
+3695 4289 D
+3758 4289 D
+3820 4289 D
+3883 4289 D
+3946 4289 D
+4009 4289 D
+4072 4289 D
+4135 4289 D
+4198 4289 D
+4261 4289 D
+4324 4289 D
+4387 4289 D
+4450 4289 D
+4513 4289 D
+4576 4289 D
+4639 4289 D
+4702 4289 D
+4765 4289 D
+4828 891 D
+4891 891 D
+4954 891 D
+5017 891 D
+5080 891 D
+5143 891 D
+5206 891 D
+5269 891 D
+5332 891 D
+5395 891 D
+5458 891 D
+5521 891 D
+5584 891 D
+5647 891 D
+5710 891 D
+5773 891 D
+5836 891 D
+5899 891 D
+5961 891 D
+6024 891 D
+6087 891 D
+6150 891 D
+6213 891 D
+6276 891 D
+6339 891 D
+6402 891 D
+6465 891 D
+6528 891 D
+6591 891 D
+6654 891 D
+6717 891 D
+6780 891 D
+6843 891 D
+6906 891 D
+672 997 D
+735 974 D
+798 939 D
+861 897 D
+924 853 D
+987 814 D
+1050 784 D
+1113 769 D
+1176 770 D
+1239 789 D
+1302 823 D
+1365 870 D
+1428 922 D
+1491 973 D
+1554 1016 D
+1617 1044 D
+1680 1052 D
+1742 1036 D
+1805 995 D
+1868 933 D
+1931 856 D
+1994 773 D
+2057 695 D
+2120 635 D
+2183 606 D
+2246 621 D
+2309 690 D
+2372 820 D
+2435 1015 D
+2498 1273 D
+2561 1589 D
+2624 1951 D
+2687 2346 D
+2750 2756 D
+2813 3163 D
+2876 3547 D
+2939 3892 D
+3002 4183 D
+3065 4408 D
+3128 4563 D
+3191 4646 D
+3254 4662 D
+3317 4621 D
+3380 4536 D
+3443 4423 D
+3506 4299 D
+3569 4182 D
+3632 4086 D
+3695 4023 D
+3758 4001 D
+3820 4023 D
+3883 4086 D
+3946 4182 D
+4009 4299 D
+4072 4423 D
+4135 4536 D
+4198 4621 D
+4261 4662 D
+4324 4646 D
+4387 4563 D
+4450 4408 D
+4513 4183 D
+4576 3892 D
+4639 3547 D
+4702 3163 D
+4765 2756 D
+4828 2346 D
+4891 1951 D
+4954 1589 D
+5017 1273 D
+5080 1015 D
+5143 820 D
+5206 690 D
+5269 621 D
+5332 606 D
+5395 635 D
+5458 695 D
+5521 773 D
+5584 856 D
+5647 933 D
+5710 995 D
+5773 1036 D
+5836 1052 D
+5899 1044 D
+5961 1016 D
+6024 973 D
+6087 922 D
+6150 870 D
+6213 823 D
+6276 789 D
+6339 770 D
+6402 769 D
+6465 784 D
+6528 814 D
+6591 853 D
+6654 897 D
+6717 939 D
+6780 974 D
+6843 997 D
+6906 1005 D
+stroke
+grestore
+end
+showpage
+%%Trailer
diff --git a/gsl-1.9/doc/fft.texi b/gsl-1.9/doc/fft.texi
new file mode 100644
index 0000000..16cc5a9
--- /dev/null
+++ b/gsl-1.9/doc/fft.texi
@@ -0,0 +1,1001 @@
+@cindex FFT
+@cindex Fast Fourier Transforms, see FFT
+@cindex Fourier Transforms, see FFT
+@cindex Discrete Fourier Transforms, see FFT
+@cindex DFTs, see FFT
+
+This chapter describes functions for performing Fast Fourier Transforms
+(FFTs). The library includes radix-2 routines (for lengths which are a
+power of two) and mixed-radix routines (which work for any length). For
+efficiency there are separate versions of the routines for real data and
+for complex data. The mixed-radix routines are a reimplementation of the
+@sc{fftpack} library of Paul Swarztrauber. Fortran code for @sc{fftpack} is
+available on Netlib (@sc{fftpack} also includes some routines for sine and
+cosine transforms but these are currently not available in GSL). For
+details and derivations of the underlying algorithms consult the
+document @cite{GSL FFT Algorithms} (@pxref{FFT References and Further Reading})
+
+@menu
+* Mathematical Definitions::
+* Overview of complex data FFTs::
+* Radix-2 FFT routines for complex data::
+* Mixed-radix FFT routines for complex data::
+* Overview of real data FFTs::
+* Radix-2 FFT routines for real data::
+* Mixed-radix FFT routines for real data::
+* FFT References and Further Reading::
+@end menu
+
+@node Mathematical Definitions
+@section Mathematical Definitions
+@cindex FFT mathematical definition
+
+Fast Fourier Transforms are efficient algorithms for
+calculating the discrete fourier transform (DFT),
+@tex
+\beforedisplay
+$$
+x_j = \sum_{k=0}^{N-1} z_k \exp(-2\pi i j k / N)
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+x_j = \sum_@{k=0@}^@{N-1@} z_k \exp(-2\pi i j k / N)
+@end example
+@end ifinfo
+
+The DFT usually arises as an approximation to the continuous fourier
+transform when functions are sampled at discrete intervals in space or
+time. The naive evaluation of the discrete fourier transform is a
+matrix-vector multiplication
+@c{$W\vec{z}$}
+@math{W\vec@{z@}}. A general matrix-vector multiplication takes
+@math{O(N^2)} operations for @math{N} data-points. Fast fourier
+transform algorithms use a divide-and-conquer strategy to factorize the
+matrix @math{W} into smaller sub-matrices, corresponding to the integer
+factors of the length @math{N}. If @math{N} can be factorized into a
+product of integers
+@c{$f_1 f_2 \ldots f_n$}
+@math{f_1 f_2 ... f_n} then the DFT can be computed in @math{O(N \sum
+f_i)} operations. For a radix-2 FFT this gives an operation count of
+@math{O(N \log_2 N)}.
+
+All the FFT functions offer three types of transform: forwards, inverse
+and backwards, based on the same mathematical definitions. The
+definition of the @dfn{forward fourier transform},
+@c{$x = \hbox{FFT}(z)$}
+@math{x = FFT(z)}, is,
+@tex
+\beforedisplay
+$$
+x_j = \sum_{k=0}^{N-1} z_k \exp(-2\pi i j k / N)
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+x_j = \sum_@{k=0@}^@{N-1@} z_k \exp(-2\pi i j k / N)
+@end example
+
+@end ifinfo
+@noindent
+and the definition of the @dfn{inverse fourier transform},
+@c{$x = \hbox{IFFT}(z)$}
+@math{x = IFFT(z)}, is,
+@tex
+\beforedisplay
+$$
+z_j = {1 \over N} \sum_{k=0}^{N-1} x_k \exp(2\pi i j k / N).
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+z_j = @{1 \over N@} \sum_@{k=0@}^@{N-1@} x_k \exp(2\pi i j k / N).
+@end example
+
+@end ifinfo
+@noindent
+The factor of @math{1/N} makes this a true inverse. For example, a call
+to @code{gsl_fft_complex_forward} followed by a call to
+@code{gsl_fft_complex_inverse} should return the original data (within
+numerical errors).
+
+In general there are two possible choices for the sign of the
+exponential in the transform/ inverse-transform pair. GSL follows the
+same convention as @sc{fftpack}, using a negative exponential for the forward
+transform. The advantage of this convention is that the inverse
+transform recreates the original function with simple fourier
+synthesis. Numerical Recipes uses the opposite convention, a positive
+exponential in the forward transform.
+
+The @dfn{backwards FFT} is simply our terminology for an unscaled
+version of the inverse FFT,
+@tex
+\beforedisplay
+$$
+z^{backwards}_j = \sum_{k=0}^{N-1} x_k \exp(2\pi i j k / N).
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+z^@{backwards@}_j = \sum_@{k=0@}^@{N-1@} x_k \exp(2\pi i j k / N).
+@end example
+
+@end ifinfo
+@noindent
+When the overall scale of the result is unimportant it is often
+convenient to use the backwards FFT instead of the inverse to save
+unnecessary divisions.
+
+@node Overview of complex data FFTs
+@section Overview of complex data FFTs
+@cindex FFT, complex data
+
+The inputs and outputs for the complex FFT routines are @dfn{packed
+arrays} of floating point numbers. In a packed array the real and
+imaginary parts of each complex number are placed in alternate
+neighboring elements. For example, the following definition of a packed
+array of length 6,
+
+@example
+double x[3*2];
+gsl_complex_packed_array data = x;
+@end example
+
+@noindent
+can be used to hold an array of three complex numbers, @code{z[3]}, in
+the following way,
+
+@example
+data[0] = Re(z[0])
+data[1] = Im(z[0])
+data[2] = Re(z[1])
+data[3] = Im(z[1])
+data[4] = Re(z[2])
+data[5] = Im(z[2])
+@end example
+
+@noindent
+The array indices for the data have the same ordering as those
+in the definition of the DFT---i.e. there are no index transformations
+or permutations of the data.
+
+A @dfn{stride} parameter allows the user to perform transforms on the
+elements @code{z[stride*i]} instead of @code{z[i]}. A stride greater
+than 1 can be used to take an in-place FFT of the column of a matrix. A
+stride of 1 accesses the array without any additional spacing between
+elements.
+
+To perform an FFT on a vector argument, such as @code{gsl_vector_complex
+* v}, use the following definitions (or their equivalents) when calling
+the functions described in this chapter:
+
+@example
+gsl_complex_packed_array data = v->data;
+size_t stride = v->stride;
+size_t n = v->size;
+@end example
+
+For physical applications it is important to remember that the index
+appearing in the DFT does not correspond directly to a physical
+frequency. If the time-step of the DFT is @math{\Delta} then the
+frequency-domain includes both positive and negative frequencies,
+ranging from @math{-1/(2\Delta)} through 0 to @math{+1/(2\Delta)}. The
+positive frequencies are stored from the beginning of the array up to
+the middle, and the negative frequencies are stored backwards from the
+end of the array.
+
+Here is a table which shows the layout of the array @var{data}, and the
+correspondence between the time-domain data @math{z}, and the
+frequency-domain data @math{x}.
+
+@example
+index z x = FFT(z)
+
+0 z(t = 0) x(f = 0)
+1 z(t = 1) x(f = 1/(N Delta))
+2 z(t = 2) x(f = 2/(N Delta))
+. ........ ..................
+N/2 z(t = N/2) x(f = +1/(2 Delta),
+ -1/(2 Delta))
+. ........ ..................
+N-3 z(t = N-3) x(f = -3/(N Delta))
+N-2 z(t = N-2) x(f = -2/(N Delta))
+N-1 z(t = N-1) x(f = -1/(N Delta))
+@end example
+
+@noindent
+When @math{N} is even the location @math{N/2} contains the most positive
+and negative frequencies (@math{+1/(2 \Delta)}, @math{-1/(2 \Delta)})
+which are equivalent. If @math{N} is odd then general structure of the
+table above still applies, but @math{N/2} does not appear.
+
+
+@node Radix-2 FFT routines for complex data
+@section Radix-2 FFT routines for complex data
+@cindex FFT of complex data, radix-2 algorithm
+@cindex Radix-2 FFT, complex data
+
+The radix-2 algorithms described in this section are simple and compact,
+although not necessarily the most efficient. They use the Cooley-Tukey
+algorithm to compute in-place complex FFTs for lengths which are a power
+of 2---no additional storage is required. The corresponding
+self-sorting mixed-radix routines offer better performance at the
+expense of requiring additional working space.
+
+All the functions described in this section are declared in the header file @file{gsl_fft_complex.h}.
+
+@deftypefun int gsl_fft_complex_radix2_forward (gsl_complex_packed_array @var{data}, size_t @var{stride}, size_t @var{n})
+
+@deftypefunx int gsl_fft_complex_radix2_transform (gsl_complex_packed_array @var{data}, size_t @var{stride}, size_t @var{n}, gsl_fft_direction @var{sign})
+
+@deftypefunx int gsl_fft_complex_radix2_backward (gsl_complex_packed_array @var{data}, size_t @var{stride}, size_t @var{n})
+
+@deftypefunx int gsl_fft_complex_radix2_inverse (gsl_complex_packed_array @var{data}, size_t @var{stride}, size_t @var{n})
+
+These functions compute forward, backward and inverse FFTs of length
+@var{n} with stride @var{stride}, on the packed complex array @var{data}
+using an in-place radix-2 decimation-in-time algorithm. The length of
+the transform @var{n} is restricted to powers of two. For the
+@code{transform} version of the function the @var{sign} argument can be
+either @code{forward} (@math{-1}) or @code{backward} (@math{+1}).
+
+The functions return a value of @code{GSL_SUCCESS} if no errors were
+detected, or @code{GSL_EDOM} if the length of the data @var{n} is not a
+power of two.
+@end deftypefun
+
+@deftypefun int gsl_fft_complex_radix2_dif_forward (gsl_complex_packed_array @var{data}, size_t @var{stride}, size_t @var{n})
+
+@deftypefunx int gsl_fft_complex_radix2_dif_transform (gsl_complex_packed_array @var{data}, size_t @var{stride}, size_t @var{n}, gsl_fft_direction @var{sign})
+
+@deftypefunx int gsl_fft_complex_radix2_dif_backward (gsl_complex_packed_array @var{data}, size_t @var{stride}, size_t @var{n})
+
+@deftypefunx int gsl_fft_complex_radix2_dif_inverse (gsl_complex_packed_array @var{data}, size_t @var{stride}, size_t @var{n})
+
+These are decimation-in-frequency versions of the radix-2 FFT functions.
+
+@end deftypefun
+
+
+@comment @node Example of using radix-2 FFT routines for complex data
+@comment @subsection Example of using radix-2 FFT routines for complex data
+
+Here is an example program which computes the FFT of a short pulse in a
+sample of length 128. To make the resulting fourier transform real the
+pulse is defined for equal positive and negative times (@math{-10}
+@dots{} @math{10}), where the negative times wrap around the end of the
+array.
+
+@example
+@verbatiminclude examples/fft.c
+@end example
+
+@noindent
+Note that we have assumed that the program is using the default error
+handler (which calls @code{abort} for any errors). If you are not using
+a safe error handler you would need to check the return status of
+@code{gsl_fft_complex_radix2_forward}.
+
+The transformed data is rescaled by @math{1/\sqrt N} so that it fits on
+the same plot as the input. Only the real part is shown, by the choice
+of the input data the imaginary part is zero. Allowing for the
+wrap-around of negative times at @math{t=128}, and working in units of
+@math{k/N}, the DFT approximates the continuum fourier transform, giving
+a modulated sine function.
+@iftex
+@tex
+\beforedisplay
+$$
+\int_{-a}^{+a} e^{-2 \pi i k x} dx = {\sin(2\pi k a) \over\pi k}
+$$
+\afterdisplay
+@end tex
+
+@sp 1
+@center @image{fft-complex-radix2-t,2.8in}
+@center @image{fft-complex-radix2-f,2.8in}
+@quotation
+A pulse and its discrete fourier transform, output from
+the example program.
+@end quotation
+@end iftex
+
+@node Mixed-radix FFT routines for complex data
+@section Mixed-radix FFT routines for complex data
+@cindex FFT of complex data, mixed-radix algorithm
+@cindex Mixed-radix FFT, complex data
+
+This section describes mixed-radix FFT algorithms for complex data. The
+mixed-radix functions work for FFTs of any length. They are a
+reimplementation of Paul Swarztrauber's Fortran @sc{fftpack} library.
+The theory is explained in the review article @cite{Self-sorting
+Mixed-radix FFTs} by Clive Temperton. The routines here use the same
+indexing scheme and basic algorithms as @sc{fftpack}.
+
+The mixed-radix algorithm is based on sub-transform modules---highly
+optimized small length FFTs which are combined to create larger FFTs.
+There are efficient modules for factors of 2, 3, 4, 5, 6 and 7. The
+modules for the composite factors of 4 and 6 are faster than combining
+the modules for @math{2*2} and @math{2*3}.
+
+For factors which are not implemented as modules there is a fall-back to
+a general length-@math{n} module which uses Singleton's method for
+efficiently computing a DFT. This module is @math{O(n^2)}, and slower
+than a dedicated module would be but works for any length @math{n}. Of
+course, lengths which use the general length-@math{n} module will still
+be factorized as much as possible. For example, a length of 143 will be
+factorized into @math{11*13}. Large prime factors are the worst case
+scenario, e.g. as found in @math{n=2*3*99991}, and should be avoided
+because their @math{O(n^2)} scaling will dominate the run-time (consult
+the document @cite{GSL FFT Algorithms} included in the GSL distribution
+if you encounter this problem).
+
+The mixed-radix initialization function @code{gsl_fft_complex_wavetable_alloc}
+returns the list of factors chosen by the library for a given length
+@math{N}. It can be used to check how well the length has been
+factorized, and estimate the run-time. To a first approximation the
+run-time scales as @math{N \sum f_i}, where the @math{f_i} are the
+factors of @math{N}. For programs under user control you may wish to
+issue a warning that the transform will be slow when the length is
+poorly factorized. If you frequently encounter data lengths which
+cannot be factorized using the existing small-prime modules consult
+@cite{GSL FFT Algorithms} for details on adding support for other
+factors.
+
+@comment First, the space for the trigonometric lookup tables and scratch area is
+@comment allocated by a call to one of the @code{alloc} functions. We
+@comment call the combination of factorization, scratch space and trigonometric
+@comment lookup arrays a @dfn{wavetable}. It contains the sine and cosine
+@comment waveforms for the all the frequencies that will be used in the FFT.
+
+@comment The wavetable is initialized by a call to the corresponding @code{init}
+@comment function. It factorizes the data length, using the implemented
+@comment subtransforms as preferred factors wherever possible. The trigonometric
+@comment lookup table for the chosen factorization is also computed.
+
+@comment An FFT is computed by a call to one of the @code{forward},
+@comment @code{backward} or @code{inverse} functions, with the data, length and
+@comment wavetable as arguments.
+
+All the functions described in this section are declared in the header
+file @file{gsl_fft_complex.h}.
+
+@deftypefun {gsl_fft_complex_wavetable *} gsl_fft_complex_wavetable_alloc (size_t @var{n})
+This function prepares a trigonometric lookup table for a complex FFT of
+length @var{n}. The function returns a pointer to the newly allocated
+@code{gsl_fft_complex_wavetable} if no errors were detected, and a null
+pointer in the case of error. The length @var{n} is factorized into a
+product of subtransforms, and the factors and their trigonometric
+coefficients are stored in the wavetable. The trigonometric coefficients
+are computed using direct calls to @code{sin} and @code{cos}, for
+accuracy. Recursion relations could be used to compute the lookup table
+faster, but if an application performs many FFTs of the same length then
+this computation is a one-off overhead which does not affect the final
+throughput.
+
+The wavetable structure can be used repeatedly for any transform of the
+same length. The table is not modified by calls to any of the other FFT
+functions. The same wavetable can be used for both forward and backward
+(or inverse) transforms of a given length.
+@end deftypefun
+
+@deftypefun void gsl_fft_complex_wavetable_free (gsl_fft_complex_wavetable * @var{wavetable})
+This function frees the memory associated with the wavetable
+@var{wavetable}. The wavetable can be freed if no further FFTs of the
+same length will be needed.
+@end deftypefun
+
+@noindent
+These functions operate on a @code{gsl_fft_complex_wavetable} structure
+which contains internal parameters for the FFT. It is not necessary to
+set any of the components directly but it can sometimes be useful to
+examine them. For example, the chosen factorization of the FFT length
+is given and can be used to provide an estimate of the run-time or
+numerical error. The wavetable structure is declared in the header file
+@file{gsl_fft_complex.h}.
+
+@deftp {Data Type} gsl_fft_complex_wavetable
+This is a structure that holds the factorization and trigonometric
+lookup tables for the mixed radix fft algorithm. It has the following
+components:
+
+@table @code
+@item size_t n
+This is the number of complex data points
+
+@item size_t nf
+This is the number of factors that the length @code{n} was decomposed into.
+
+@item size_t factor[64]
+This is the array of factors. Only the first @code{nf} elements are
+used.
+
+@comment (FIXME: This is a fixed length array and therefore probably in
+@comment violation of the GNU Coding Standards).
+
+@item gsl_complex * trig
+This is a pointer to a preallocated trigonometric lookup table of
+@code{n} complex elements.
+
+@item gsl_complex * twiddle[64]
+This is an array of pointers into @code{trig}, giving the twiddle
+factors for each pass.
+@end table
+@end deftp
+
+@noindent
+The mixed radix algorithms require additional working space to hold
+the intermediate steps of the transform.
+
+@deftypefun {gsl_fft_complex_workspace *} gsl_fft_complex_workspace_alloc (size_t @var{n})
+This function allocates a workspace for a complex transform of length
+@var{n}.
+@end deftypefun
+
+@deftypefun void gsl_fft_complex_workspace_free (gsl_fft_complex_workspace * @var{workspace})
+This function frees the memory associated with the workspace
+@var{workspace}. The workspace can be freed if no further FFTs of the
+same length will be needed.
+@end deftypefun
+
+@comment @deftp {Data Type} gsl_fft_complex_workspace
+@comment This is a structure that holds the workspace for the mixed radix fft
+@comment algorithm. It has the following components:
+@comment
+@comment @table @code
+@comment @item gsl_complex * scratch
+@comment This is a pointer to a workspace of @code{n} complex elements,
+@comment capable of holding intermediate copies of the original data set.
+@comment @end table
+@comment @end deftp
+
+@noindent
+The following functions compute the transform,
+
+@deftypefun int gsl_fft_complex_forward (gsl_complex_packed_array @var{data}, size_t @var{stride}, size_t @var{n}, const gsl_fft_complex_wavetable * @var{wavetable}, gsl_fft_complex_workspace * @var{work})
+@deftypefunx int gsl_fft_complex_transform (gsl_complex_packed_array @var{data}, size_t @var{stride}, size_t @var{n}, const gsl_fft_complex_wavetable * @var{wavetable}, gsl_fft_complex_workspace * @var{work}, gsl_fft_direction @var{sign})
+@deftypefunx int gsl_fft_complex_backward (gsl_complex_packed_array @var{data}, size_t @var{stride}, size_t @var{n}, const gsl_fft_complex_wavetable * @var{wavetable}, gsl_fft_complex_workspace * @var{work})
+@deftypefunx int gsl_fft_complex_inverse (gsl_complex_packed_array @var{data}, size_t @var{stride}, size_t @var{n}, const gsl_fft_complex_wavetable * @var{wavetable}, gsl_fft_complex_workspace * @var{work})
+
+These functions compute forward, backward and inverse FFTs of length
+@var{n} with stride @var{stride}, on the packed complex array
+@var{data}, using a mixed radix decimation-in-frequency algorithm.
+There is no restriction on the length @var{n}. Efficient modules are
+provided for subtransforms of length 2, 3, 4, 5, 6 and 7. Any remaining
+factors are computed with a slow, @math{O(n^2)}, general-@math{n}
+module. The caller must supply a @var{wavetable} containing the
+trigonometric lookup tables and a workspace @var{work}. For the
+@code{transform} version of the function the @var{sign} argument can be
+either @code{forward} (@math{-1}) or @code{backward} (@math{+1}).
+
+The functions return a value of @code{0} if no errors were detected. The
+following @code{gsl_errno} conditions are defined for these functions:
+
+@table @code
+@item GSL_EDOM
+The length of the data @var{n} is not a positive integer (i.e. @var{n}
+is zero).
+
+@item GSL_EINVAL
+The length of the data @var{n} and the length used to compute the given
+@var{wavetable} do not match.
+@end table
+@end deftypefun
+
+@comment @node Example of using mixed-radix FFT routines for complex data
+@comment @subsection Example of using mixed-radix FFT routines for complex data
+
+Here is an example program which computes the FFT of a short pulse in a
+sample of length 630 (@math{=2*3*3*5*7}) using the mixed-radix
+algorithm.
+
+@example
+@verbatiminclude examples/fftmr.c
+@end example
+
+@noindent
+Note that we have assumed that the program is using the default
+@code{gsl} error handler (which calls @code{abort} for any errors). If
+you are not using a safe error handler you would need to check the
+return status of all the @code{gsl} routines.
+
+@node Overview of real data FFTs
+@section Overview of real data FFTs
+@cindex FFT of real data
+The functions for real data are similar to those for complex data.
+However, there is an important difference between forward and inverse
+transforms. The fourier transform of a real sequence is not real. It is
+a complex sequence with a special symmetry:
+@tex
+\beforedisplay
+$$
+z_k = z_{N-k}^*
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+z_k = z_@{N-k@}^*
+@end example
+
+@end ifinfo
+@noindent
+A sequence with this symmetry is called @dfn{conjugate-complex} or
+@dfn{half-complex}. This different structure requires different
+storage layouts for the forward transform (from real to half-complex)
+and inverse transform (from half-complex back to real). As a
+consequence the routines are divided into two sets: functions in
+@code{gsl_fft_real} which operate on real sequences and functions in
+@code{gsl_fft_halfcomplex} which operate on half-complex sequences.
+
+Functions in @code{gsl_fft_real} compute the frequency coefficients of a
+real sequence. The half-complex coefficients @math{c} of a real sequence
+@math{x} are given by fourier analysis,
+@tex
+\beforedisplay
+$$
+c_k = \sum_{j=0}^{N-1} x_j \exp(-2 \pi i j k /N)
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+c_k = \sum_@{j=0@}^@{N-1@} x_j \exp(-2 \pi i j k /N)
+@end example
+
+@end ifinfo
+@noindent
+Functions in @code{gsl_fft_halfcomplex} compute inverse or backwards
+transforms. They reconstruct real sequences by fourier synthesis from
+their half-complex frequency coefficients, @math{c},
+@tex
+\beforedisplay
+$$
+x_j = {1 \over N} \sum_{k=0}^{N-1} c_k \exp(2 \pi i j k /N)
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+x_j = @{1 \over N@} \sum_@{k=0@}^@{N-1@} c_k \exp(2 \pi i j k /N)
+@end example
+
+@end ifinfo
+@noindent
+The symmetry of the half-complex sequence implies that only half of the
+complex numbers in the output need to be stored. The remaining half can
+be reconstructed using the half-complex symmetry condition. This works
+for all lengths, even and odd---when the length is even the middle value
+where @math{k=N/2} is also real. Thus only @var{N} real numbers are
+required to store the half-complex sequence, and the transform of a real
+sequence can be stored in the same size array as the original data.
+
+The precise storage arrangements depend on the algorithm, and are
+different for radix-2 and mixed-radix routines. The radix-2 function
+operates in-place, which constrains the locations where each element can
+be stored. The restriction forces real and imaginary parts to be stored
+far apart. The mixed-radix algorithm does not have this restriction, and
+it stores the real and imaginary parts of a given term in neighboring
+locations (which is desirable for better locality of memory accesses).
+
+@node Radix-2 FFT routines for real data
+@section Radix-2 FFT routines for real data
+@cindex FFT of real data, radix-2 algorithm
+@cindex Radix-2 FFT for real data
+
+This section describes radix-2 FFT algorithms for real data. They use
+the Cooley-Tukey algorithm to compute in-place FFTs for lengths which
+are a power of 2.
+
+The radix-2 FFT functions for real data are declared in the header files
+@file{gsl_fft_real.h}
+
+@deftypefun int gsl_fft_real_radix2_transform (double @var{data}[], size_t @var{stride}, size_t @var{n})
+
+This function computes an in-place radix-2 FFT of length @var{n} and
+stride @var{stride} on the real array @var{data}. The output is a
+half-complex sequence, which is stored in-place. The arrangement of the
+half-complex terms uses the following scheme: for @math{k < N/2} the
+real part of the @math{k}-th term is stored in location @math{k}, and
+the corresponding imaginary part is stored in location @math{N-k}. Terms
+with @math{k > N/2} can be reconstructed using the symmetry
+@c{$z_k = z^*_{N-k}$}
+@math{z_k = z^*_@{N-k@}}.
+The terms for @math{k=0} and @math{k=N/2} are both purely
+real, and count as a special case. Their real parts are stored in
+locations @math{0} and @math{N/2} respectively, while their imaginary
+parts which are zero are not stored.
+
+The following table shows the correspondence between the output
+@var{data} and the equivalent results obtained by considering the input
+data as a complex sequence with zero imaginary part,
+
+@example
+complex[0].real = data[0]
+complex[0].imag = 0
+complex[1].real = data[1]
+complex[1].imag = data[N-1]
+............... ................
+complex[k].real = data[k]
+complex[k].imag = data[N-k]
+............... ................
+complex[N/2].real = data[N/2]
+complex[N/2].imag = 0
+............... ................
+complex[k'].real = data[k] k' = N - k
+complex[k'].imag = -data[N-k]
+............... ................
+complex[N-1].real = data[1]
+complex[N-1].imag = -data[N-1]
+@end example
+@noindent
+Note that the output data can be converted into the full complex
+sequence using the function @code{gsl_fft_halfcomplex_unpack}
+described in the next section.
+
+@end deftypefun
+The radix-2 FFT functions for halfcomplex data are declared in the
+header file @file{gsl_fft_halfcomplex.h}.
+
+@deftypefun int gsl_fft_halfcomplex_radix2_inverse (double @var{data}[], size_t @var{stride}, size_t @var{n})
+@deftypefunx int gsl_fft_halfcomplex_radix2_backward (double @var{data}[], size_t @var{stride}, size_t @var{n})
+
+These functions compute the inverse or backwards in-place radix-2 FFT of
+length @var{n} and stride @var{stride} on the half-complex sequence
+@var{data} stored according the output scheme used by
+@code{gsl_fft_real_radix2}. The result is a real array stored in natural
+order.
+
+@end deftypefun
+
+
+
+@node Mixed-radix FFT routines for real data
+@section Mixed-radix FFT routines for real data
+@cindex FFT of real data, mixed-radix algorithm
+@cindex Mixed-radix FFT, real data
+
+This section describes mixed-radix FFT algorithms for real data. The
+mixed-radix functions work for FFTs of any length. They are a
+reimplementation of the real-FFT routines in the Fortran @sc{fftpack} library
+by Paul Swarztrauber. The theory behind the algorithm is explained in
+the article @cite{Fast Mixed-Radix Real Fourier Transforms} by Clive
+Temperton. The routines here use the same indexing scheme and basic
+algorithms as @sc{fftpack}.
+
+The functions use the @sc{fftpack} storage convention for half-complex
+sequences. In this convention the half-complex transform of a real
+sequence is stored with frequencies in increasing order, starting at
+zero, with the real and imaginary parts of each frequency in neighboring
+locations. When a value is known to be real the imaginary part is not
+stored. The imaginary part of the zero-frequency component is never
+stored. It is known to be zero (since the zero frequency component is
+simply the sum of the input data (all real)). For a sequence of even
+length the imaginary part of the frequency @math{n/2} is not stored
+either, since the symmetry
+@c{$z_k = z_{N-k}^*$}
+@math{z_k = z_@{N-k@}^*} implies that this is
+purely real too.
+
+The storage scheme is best shown by some examples. The table below
+shows the output for an odd-length sequence, @math{n=5}. The two columns
+give the correspondence between the 5 values in the half-complex
+sequence returned by @code{gsl_fft_real_transform}, @var{halfcomplex}[] and the
+values @var{complex}[] that would be returned if the same real input
+sequence were passed to @code{gsl_fft_complex_backward} as a complex
+sequence (with imaginary parts set to @code{0}),
+
+@example
+complex[0].real = halfcomplex[0]
+complex[0].imag = 0
+complex[1].real = halfcomplex[1]
+complex[1].imag = halfcomplex[2]
+complex[2].real = halfcomplex[3]
+complex[2].imag = halfcomplex[4]
+complex[3].real = halfcomplex[3]
+complex[3].imag = -halfcomplex[4]
+complex[4].real = halfcomplex[1]
+complex[4].imag = -halfcomplex[2]
+@end example
+
+@noindent
+The upper elements of the @var{complex} array, @code{complex[3]} and
+@code{complex[4]} are filled in using the symmetry condition. The
+imaginary part of the zero-frequency term @code{complex[0].imag} is
+known to be zero by the symmetry.
+
+The next table shows the output for an even-length sequence, @math{n=6}
+In the even case there are two values which are purely real,
+
+@example
+complex[0].real = halfcomplex[0]
+complex[0].imag = 0
+complex[1].real = halfcomplex[1]
+complex[1].imag = halfcomplex[2]
+complex[2].real = halfcomplex[3]
+complex[2].imag = halfcomplex[4]
+complex[3].real = halfcomplex[5]
+complex[3].imag = 0
+complex[4].real = halfcomplex[3]
+complex[4].imag = -halfcomplex[4]
+complex[5].real = halfcomplex[1]
+complex[5].imag = -halfcomplex[2]
+@end example
+
+@noindent
+The upper elements of the @var{complex} array, @code{complex[4]} and
+@code{complex[5]} are filled in using the symmetry condition. Both
+@code{complex[0].imag} and @code{complex[3].imag} are known to be zero.
+
+All these functions are declared in the header files
+@file{gsl_fft_real.h} and @file{gsl_fft_halfcomplex.h}.
+
+@deftypefun {gsl_fft_real_wavetable *} gsl_fft_real_wavetable_alloc (size_t @var{n})
+@deftypefunx {gsl_fft_halfcomplex_wavetable *} gsl_fft_halfcomplex_wavetable_alloc (size_t @var{n})
+These functions prepare trigonometric lookup tables for an FFT of size
+@math{n} real elements. The functions return a pointer to the newly
+allocated struct if no errors were detected, and a null pointer in the
+case of error. The length @var{n} is factorized into a product of
+subtransforms, and the factors and their trigonometric coefficients are
+stored in the wavetable. The trigonometric coefficients are computed
+using direct calls to @code{sin} and @code{cos}, for accuracy.
+Recursion relations could be used to compute the lookup table faster,
+but if an application performs many FFTs of the same length then
+computing the wavetable is a one-off overhead which does not affect the
+final throughput.
+
+The wavetable structure can be used repeatedly for any transform of the
+same length. The table is not modified by calls to any of the other FFT
+functions. The appropriate type of wavetable must be used for forward
+real or inverse half-complex transforms.
+@end deftypefun
+
+@deftypefun void gsl_fft_real_wavetable_free (gsl_fft_real_wavetable * @var{wavetable})
+@deftypefunx void gsl_fft_halfcomplex_wavetable_free (gsl_fft_halfcomplex_wavetable * @var{wavetable})
+These functions free the memory associated with the wavetable
+@var{wavetable}. The wavetable can be freed if no further FFTs of the
+same length will be needed.
+@end deftypefun
+
+@noindent
+The mixed radix algorithms require additional working space to hold
+the intermediate steps of the transform,
+
+@deftypefun {gsl_fft_real_workspace *} gsl_fft_real_workspace_alloc (size_t @var{n})
+This function allocates a workspace for a real transform of length
+@var{n}. The same workspace can be used for both forward real and inverse
+halfcomplex transforms.
+@end deftypefun
+
+@deftypefun void gsl_fft_real_workspace_free (gsl_fft_real_workspace * @var{workspace})
+This function frees the memory associated with the workspace
+@var{workspace}. The workspace can be freed if no further FFTs of the
+same length will be needed.
+@end deftypefun
+
+@noindent
+The following functions compute the transforms of real and half-complex
+data,
+
+@deftypefun int gsl_fft_real_transform (double @var{data}[], size_t @var{stride}, size_t @var{n}, const gsl_fft_real_wavetable * @var{wavetable}, gsl_fft_real_workspace * @var{work})
+@deftypefunx int gsl_fft_halfcomplex_transform (double @var{data}[], size_t @var{stride}, size_t @var{n}, const gsl_fft_halfcomplex_wavetable * @var{wavetable}, gsl_fft_real_workspace * @var{work})
+These functions compute the FFT of @var{data}, a real or half-complex
+array of length @var{n}, using a mixed radix decimation-in-frequency
+algorithm. For @code{gsl_fft_real_transform} @var{data} is an array of
+time-ordered real data. For @code{gsl_fft_halfcomplex_transform}
+@var{data} contains fourier coefficients in the half-complex ordering
+described above. There is no restriction on the length @var{n}.
+Efficient modules are provided for subtransforms of length 2, 3, 4 and
+5. Any remaining factors are computed with a slow, @math{O(n^2)},
+general-n module. The caller must supply a @var{wavetable} containing
+trigonometric lookup tables and a workspace @var{work}.
+@end deftypefun
+
+@deftypefun int gsl_fft_real_unpack (const double @var{real_coefficient}[], gsl_complex_packed_array @var{complex_coefficient}, size_t @var{stride}, size_t @var{n})
+
+This function converts a single real array, @var{real_coefficient} into
+an equivalent complex array, @var{complex_coefficient}, (with imaginary
+part set to zero), suitable for @code{gsl_fft_complex} routines. The
+algorithm for the conversion is simply,
+
+@example
+for (i = 0; i < n; i++)
+ @{
+ complex_coefficient[i].real
+ = real_coefficient[i];
+ complex_coefficient[i].imag
+ = 0.0;
+ @}
+@end example
+@end deftypefun
+
+@deftypefun int gsl_fft_halfcomplex_unpack (const double @var{halfcomplex_coefficient}[], gsl_complex_packed_array @var{complex_coefficient}, size_t @var{stride}, size_t @var{n})
+
+This function converts @var{halfcomplex_coefficient}, an array of
+half-complex coefficients as returned by @code{gsl_fft_real_transform}, into an
+ordinary complex array, @var{complex_coefficient}. It fills in the
+complex array using the symmetry
+@c{$z_k = z_{N-k}^*$}
+@math{z_k = z_@{N-k@}^*}
+to reconstruct the redundant elements. The algorithm for the conversion
+is,
+
+@example
+complex_coefficient[0].real
+ = halfcomplex_coefficient[0];
+complex_coefficient[0].imag
+ = 0.0;
+
+for (i = 1; i < n - i; i++)
+ @{
+ double hc_real
+ = halfcomplex_coefficient[2 * i - 1];
+ double hc_imag
+ = halfcomplex_coefficient[2 * i];
+ complex_coefficient[i].real = hc_real;
+ complex_coefficient[i].imag = hc_imag;
+ complex_coefficient[n - i].real = hc_real;
+ complex_coefficient[n - i].imag = -hc_imag;
+ @}
+
+if (i == n - i)
+ @{
+ complex_coefficient[i].real
+ = halfcomplex_coefficient[n - 1];
+ complex_coefficient[i].imag
+ = 0.0;
+ @}
+@end example
+@end deftypefun
+
+@comment @node Example of using mixed-radix FFT routines for real data
+@comment @subsection Example of using mixed-radix FFT routines for real data
+
+Here is an example program using @code{gsl_fft_real_transform} and
+@code{gsl_fft_halfcomplex_inverse}. It generates a real signal in the
+shape of a square pulse. The pulse is fourier transformed to frequency
+space, and all but the lowest ten frequency components are removed from
+the array of fourier coefficients returned by
+@code{gsl_fft_real_transform}.
+
+The remaining fourier coefficients are transformed back to the
+time-domain, to give a filtered version of the square pulse. Since
+fourier coefficients are stored using the half-complex symmetry both
+positive and negative frequencies are removed and the final filtered
+signal is also real.
+
+@example
+@verbatiminclude examples/fftreal.c
+@end example
+
+@iftex
+@sp 1
+@center @image{fft-real-mixedradix,3.4in}
+
+@center Low-pass filtered version of a real pulse,
+@center output from the example program.
+@end iftex
+
+@node FFT References and Further Reading
+@section References and Further Reading
+
+A good starting point for learning more about the FFT is the review
+article @cite{Fast Fourier Transforms: A Tutorial Review and A State of
+the Art} by Duhamel and Vetterli,
+
+@itemize @asis
+@item
+P. Duhamel and M. Vetterli.
+Fast fourier transforms: A tutorial review and a state of the art.
+@cite{Signal Processing}, 19:259--299, 1990.
+@end itemize
+
+@noindent
+To find out about the algorithms used in the GSL routines you may want
+to consult the document @cite{GSL FFT Algorithms} (it is included
+in GSL, as @file{doc/fftalgorithms.tex}). This has general information
+on FFTs and explicit derivations of the implementation for each
+routine. There are also references to the relevant literature. For
+convenience some of the more important references are reproduced below.
+
+@noindent
+There are several introductory books on the FFT with example programs,
+such as @cite{The Fast Fourier Transform} by Brigham and @cite{DFT/FFT
+and Convolution Algorithms} by Burrus and Parks,
+
+@itemize @asis
+@item
+E. Oran Brigham.
+@cite{The Fast Fourier Transform}.
+Prentice Hall, 1974.
+
+@item
+C. S. Burrus and T. W. Parks.
+@cite{DFT/FFT and Convolution Algorithms}.
+Wiley, 1984.
+@end itemize
+
+@noindent
+Both these introductory books cover the radix-2 FFT in some detail.
+The mixed-radix algorithm at the heart of the @sc{fftpack} routines is
+reviewed in Clive Temperton's paper,
+
+@itemize @asis
+@item
+Clive Temperton.
+Self-sorting mixed-radix fast fourier transforms.
+@cite{Journal of Computational Physics}, 52(1):1--23, 1983.
+@end itemize
+
+@noindent
+The derivation of FFTs for real-valued data is explained in the
+following two articles,
+
+@itemize @asis
+@item
+Henrik V. Sorenson, Douglas L. Jones, Michael T. Heideman, and C. Sidney
+Burrus.
+Real-valued fast fourier transform algorithms.
+@cite{IEEE Transactions on Acoustics, Speech, and Signal Processing},
+ASSP-35(6):849--863, 1987.
+
+@item
+Clive Temperton.
+Fast mixed-radix real fourier transforms.
+@cite{Journal of Computational Physics}, 52:340--350, 1983.
+@end itemize
+
+@noindent
+In 1979 the IEEE published a compendium of carefully-reviewed Fortran
+FFT programs in @cite{Programs for Digital Signal Processing}. It is a
+useful reference for implementations of many different FFT
+algorithms,
+
+@itemize @asis
+@item
+Digital Signal Processing Committee and IEEE Acoustics, Speech, and Signal
+Processing Committee, editors.
+@cite{Programs for Digital Signal Processing}.
+IEEE Press, 1979.
+@end itemize
+@comment @noindent
+@comment There is also an annotated bibliography of papers on the FFT and related
+@comment topics by Burrus,
+
+@comment @itemize @asis
+@comment @item C. S. Burrus. Notes on the FFT.
+@comment @end itemize
+@comment @noindent
+@comment The notes are available from @url{http://www-dsp.rice.edu/res/fft/fftnote.asc}.
+
+@noindent
+For large-scale FFT work we recommend the use of the dedicated FFTW library
+by Frigo and Johnson. The FFTW library is self-optimizing---it
+automatically tunes itself for each hardware platform in order to
+achieve maximum performance. It is available under the GNU GPL.
+
+@itemize @asis
+@item
+FFTW Website, @uref{http://www.fftw.org/}
+@end itemize
+
+@noindent
+The source code for @sc{fftpack} is available from Netlib,
+
+@itemize @asis
+@item
+FFTPACK, @uref{http://www.netlib.org/fftpack/}
+@end itemize
+
+
diff --git a/gsl-1.9/doc/fftalgorithms.bib b/gsl-1.9/doc/fftalgorithms.bib
new file mode 100644
index 0000000..1a8506e
--- /dev/null
+++ b/gsl-1.9/doc/fftalgorithms.bib
@@ -0,0 +1,240 @@
+@string{jcp = {Journal of Computational Physics}}
+@string{assp = {IEEE Transactions on Acoustics, Speech, and Signal Processing}}
+
+
+@Article{mehalic85,
+ author = {Mehalic and Rustan and Route},
+ title = {Effects of Architecture Implementation on {DFT} Algorithm
+Performance},
+ journal = assp,
+ year = 1985,
+ volume = {ASP-33},
+ pages = {684-693}
+}
+
+@Article{temperton83,
+ author = {Clive Temperton},
+ title = {Self-Sorting Mixed-Radix Fast Fourier Transforms},
+ journal = {Journal of Computational Physics},
+ year = 1983,
+ volume = 52,
+ number = 1,
+ pages = {1-23}
+}
+
+@Article{symfft,
+ title= {Symmetric {FFT}s},
+ author= {Paul N. Swarztrauber},
+ journal= {Mathematics of Computation},
+ volume= {47},
+ number= {185},
+ pages = {323-346},
+ year = {1986}
+}
+
+@Article{temperton83real,
+ author = {Clive Temperton},
+ title = {Fast Mixed-Radix Real Fourier Transforms},
+ journal = {Journal of Computational Physics},
+ year = 1983,
+ volume = 52,
+ pages = {340-350}
+}
+
+@Article{temperton85,
+ author = {Clive Temperton},
+ title = {Implementation of a Self-Sorting In-Place Prime Factor {FFT}
+ Algorithm},
+ journal = {Journal of Computational Physics},
+ year = 1985,
+ volume = 58,
+ pages = {283-299}
+}
+
+@Article{temperton83pfa,
+ author = {Clive Temperton},
+ title = {A Note on Prime Factor {FFT} Algorithms},
+ journal = {Journal of Computational Physics},
+ year = 1983,
+ volume = 58,
+ pages = {198-204}
+}
+
+@Article{burrus87real,
+ author = {Henrik V. Sorenson and Douglas L. Jones and Michael T. Heideman and C. Sidney Burrus},
+ title = {Real-Valued Fast Fourier Transform Algorithms},
+ journal = assp,
+ year = 1987,
+ volume = {ASSP-35},
+ number = 6,
+ pages = {849-863}
+}
+
+@Article{sorenson86,
+ author = {Henrik V. Sorenson and Michael T. Heideman and C. Sidney Burrus},
+ title = {On Computing the Split-Radix {FFT} },
+ journal = assp,
+ year = 1986,
+ volume = {ASSP-34},
+ number = 1,
+ pages = {152-156}
+}
+
+@Article{duhamel86,
+ author = {Pierre Duhamel},
+ title = {Implementation of Split-Radix {FFT} Algorithms for Complex, Real, and Real-Symmetric Data},
+ journal = assp,
+ year = 1986,
+ volume = {ASSP-34},
+ number = 2,
+ pages = {285-295}
+}
+
+@Article{visscher96,
+ author = {P. B. Visscher},
+ title = {The {FFT}: Fourier Transforming One Bit at a Time},
+ journal = {Computers in Physics},
+ year = 1996,
+ volume = 10,
+ number = 5,
+ month = {Sep/Oct},
+ pages = {438-443}
+}
+
+@Article{uniyal94:_trans_real_value_sequen,
+ author = {P. R. Uniyal},
+ title = {Transforming Real-Value Sequences: Fast Fourier versus Fast Hartley Tranform Algorithms},
+ journal = {IEEE Transactions on Signal Processing},
+ year = 1994,
+ volume = 42,
+ number = 11,
+ pages = {3249-3254 }
+}
+
+
+
+@Article{duhamel90,
+ author = {P. Duhamel and M. Vetterli},
+ title = {Fast Fourier Transforms: A Tutorial Review and A State of the Art},
+ journal = {Signal Processing},
+ year = 1990,
+ volume = 19,
+ pages = {259-299}
+}
+
+@Article{rodriguez89,
+ author = {Jeffrey J. Rodriguez},
+ title = {An Improved {FFT} Digit-Reversal Algorithm},
+ journal = assp,
+ year = 1989,
+ volume = 37,
+ number = 8,
+ pages = {1298-1300}
+}
+
+@Article{rosel89,
+ author = {Petr R\"osel},
+ title = {Timing of some bit reversal algorithms},
+ journal = {Signal Processing},
+ year = 1989,
+ volume = 18,
+ pages = {425-433}
+}
+
+
+@Book{brigham74,
+ author = {E. Oran Brigham},
+ title = {The Fast Fourier Transform},
+ publisher = {Prentice Hall},
+ year = 1974,
+ isbn = {0-13-307496-X}
+}
+
+
+
+
+@Book{elliott82,
+ author = {Douglas F. Elliott and K. Ramamohan Rao},
+ title = {Fast transforms: algorithms, analyses, applications},
+ publisher = {Academic Press},
+ year = 1982,
+ note = {This book does not contain actual code, but covers the
+more advanced mathematics and number theory needed in the derivation
+of fast transforms.},
+ isbn = {0-12-237080-5}
+}
+
+@Article{raderprimes,
+ author = {Charles M. Rader},
+ title = {Discrete Fourier Transform when the number of data
+ samples is prime},
+ journal = {IEEE Proceedings},
+ year = 1968,
+ volume = 56,
+ number = 6,
+ pages = {1107-1108}
+}
+
+@Book{mcclellan79,
+ author = {James H. McClellan and Charles M. Rader},
+ title = {Number Theory in Digital Signal Processing},
+ publisher = {Prentice-Hall},
+ year = 1979,
+ isbn = {ISBN 0-13-627349-1}
+}
+
+@Book{burrus84,
+ author = {C. S. Burrus and T. W. Parks},
+ title = {DFT/FFT and Convolution Algorithms},
+ publisher = {Wiley},
+ year = 1984,
+ isbn = {0-471-81932-8}
+}
+
+
+
+@Book{smith95,
+ author = {Winthrop W. Smith and Joanne M. Smith},
+ title = {Handbook of Real-Time Fast Fourier Transforms},
+ publisher = {IEEE Press},
+ year = 1995,
+ isbn = {0-7803-1091-8}
+}
+
+
+@Book{committee79,
+ title = {Programs for Digital Signal Processing},
+ publisher = {IEEE Press},
+ year = 1979,
+ editor = {Digital Signal Processing Committee and {IEEE Acoustics,
+Speech, and Signal Processing Committee}},
+ isbn = {0-87942-127-4 (pb) 0-87942-128-2 (hb)}
+}
+
+@Book{blahut,
+ author = {Richard E. Blahut},
+ title = {Fast Algorithms for Digital Signal Processing},
+ publisher = {Addison-Wesley},
+ year = 1984,
+ isbn = {0-201-10155-6}
+}
+
+@Unpublished{burrus-note,
+ author = {C. S. Burrus},
+ title = {Notes on the {FFT}},
+ note = {Available from http://www-dsp.rice.edu/res/fft/fftnote.asc}
+}
+
+
+@Article{singleton,
+ author = {Richard C. Singleton},
+ title = {An Algorithm for Computing the Mixed Radix Fast
+ Fourier Transform},
+ journal = {IEEE Transactions on Audio and Electroacoustics},
+ year = 1969,
+ volume = {AU-17},
+ number = 2,
+ month = {June},
+ pages = {93-103}
+}
+
diff --git a/gsl-1.9/doc/fftalgorithms.tex b/gsl-1.9/doc/fftalgorithms.tex
new file mode 100644
index 0000000..4f4a725
--- /dev/null
+++ b/gsl-1.9/doc/fftalgorithms.tex
@@ -0,0 +1,3296 @@
+\documentclass[fleqn,12pt]{article}
+%
+\setlength{\oddsidemargin}{-0.25in}
+\setlength{\textwidth}{7.0in}
+\setlength{\topmargin}{-0.25in}
+\setlength{\textheight}{9.5in}
+%
+\usepackage{algorithmic}
+\newenvironment{algorithm}{\begin{quote} %\vspace{1em}
+\begin{algorithmic}\samepage}{\end{algorithmic} %\vspace{1em}
+\end{quote}}
+\newcommand{\Real}{\mathop{\mathrm{Re}}}
+\newcommand{\Imag}{\mathop{\mathrm{Im}}}
+
+\begin{document}
+\title{FFT Algorithms}
+\author{Brian Gough, {\tt bjg@network-theory.co.uk}}
+\date{May 1997}
+\maketitle
+
+\section{Introduction}
+
+Fast Fourier Transforms (FFTs) are efficient algorithms for
+calculating the discrete fourier transform (DFT),
+%
+\begin{eqnarray}
+h_a &=& \mathrm{DFT}(g_b) \\
+ &=& \sum_{b=0}^{N-1} g_b \exp(-2\pi i a b /N) \qquad 0 \leq a \leq N-1\\
+ &=& \sum_{b=0}^{N-1} g_b W_N^{ab} \qquad W_N= \exp(-2\pi i/N)
+\end{eqnarray}
+%
+The DFT usually arises as an approximation to the continuous fourier
+transform when functions are sampled at discrete intervals in space or
+time. The naive evaluation of the discrete fourier transform is a
+matrix-vector multiplication ${\mathbf W}\vec{g}$, and would take
+$O(N^2)$ operations for $N$ data-points. The general principle of the
+Fast Fourier Transform algorithms is to use a divide-and-conquer
+strategy to factorize the matrix $W$ into smaller sub-matrices,
+typically reducing the operation count to $O(N \sum f_i)$ if $N$ can
+be factorized into smaller integers, $N=f_1 f_2 \dots f_n$.
+
+This chapter explains the algorithms used in the GSL FFT routines
+and provides some information on how to extend them. To learn more about
+the FFT you should read the review article {\em Fast Fourier
+Transforms: A Tutorial Review and A State of the Art} by Duhamel and
+Vetterli~\cite{duhamel90}. There are several introductory books on the
+FFT with example programs, such as {\em The Fast Fourier Transform} by
+Brigham~\cite{brigham74} and {\em DFT/FFT and Convolution Algorithms}
+by Burrus and Parks~\cite{burrus84}. In 1979 the IEEE published a
+compendium of carefully-reviewed Fortran FFT programs in {\em Programs
+for Digital Signal Processing}~\cite{committee79} which is a useful
+reference for implementations of many different FFT algorithms. If you
+are interested in using DSPs then the {\em Handbook of Real-Time Fast
+Fourier Transforms}~\cite{smith95} provides detailed information on
+the algorithms and hardware needed to design, build and test DSP
+applications. Many FFT algorithms rely on results from number theory.
+These results are covered in the books {\em Fast transforms:
+algorithms, analyses, applications}, by Elliott and
+Rao~\cite{elliott82}, {\em Fast Algorithms for Digital Signal
+Processing} by Blahut~\cite{blahut} and {\em Number Theory in Digital
+Signal Processing} by McClellan and Rader~\cite{mcclellan79}. There is
+also an annotated bibliography of papers on the FFT and related topics
+by Burrus~\cite{burrus-note}.
+
+\section{Families of FFT algorithms}
+%
+There are two main families of FFT algorithms: the Cooley-Tukey
+algorithm and the Prime Factor algorithm. These differ in the way they
+map the full FFT into smaller sub-transforms. Of the Cooley-Tukey
+algorithms there are two types of routine in common use: mixed-radix
+(general-$N$) algorithms and radix-2 (power of 2) algorithms. Each
+type of algorithm can be further classified by additional characteristics,
+such as whether it operates in-place or uses additional scratch space,
+whether its output is in a sorted or scrambled order, and whether it
+uses decimation-in-time or -frequency iterations.
+
+Mixed-radix algorithms work by factorizing the data vector into
+shorter lengths. These can then be transformed by small-$N$ FFTs.
+Typical programs include FFTs for small prime factors, such as 2, 3,
+5, \dots which are highly optimized. The small-$N$ FFT modules act as
+building blocks and can be multiplied together to make longer
+transforms. By combining a reasonable set of modules it is possible to
+compute FFTs of many different lengths. If the small-$N$ modules are
+supplemented by an $O(N^2)$ general-$N$ module then an FFT of any
+length can be computed, in principle. Of course, any lengths which
+contain large prime factors would perform only as $O(N^2)$.
+
+Radix-2 algorithms, or ``power of two'' algorithms, are simplified
+versions of the mixed-radix algorithm. They are restricted to lengths
+which are a power of two. The basic radix-2 FFT module only involves
+addition and subtraction, so the algorithms are very simple. Radix-2
+algorithms have been the subject of much research into optimizing the
+FFT. Many of the most efficient radix-2 routines are based on the
+``split-radix'' algorithm. This is actually a hybrid which combines
+the best parts of both radix-2 and radix-4 (``power of 4'')
+algorithms~\cite{sorenson86,duhamel86}.
+
+The prime factor algorithm (PFA) is an alternative form of general-$N$
+algorithm based on a different way of recombining small-$N$ FFT
+modules~\cite{temperton83pfa,temperton85}. It has a very simple indexing
+scheme which makes it attractive. However it only works in the case
+where all factors are mutually prime. This requirement makes it more
+suitable as a specialized algorithm for given lengths.
+
+
+\begin{subsection}{FFTs of prime lengths}
+%
+ Large prime lengths cannot be handled efficiently by any of these
+algorithms. However it may still possible to compute a DFT, by using
+results from number theory. Rader showed that it is possible to
+convert a length-$p$ FFT (where $p$ is prime) into a convolution of
+length-($p-1$). There is a simple identity between the convolution of
+length $N$ and the FFT of the same length, so if $p-1$ is easily
+factorizable this allows the convolution to be computed efficiently
+via the FFT. The idea is presented in the original paper by
+Rader~\cite{raderprimes} (also reprinted in~\cite{mcclellan79}), but
+for more details see the theoretical books mentioned earlier.
+\end{subsection}
+
+%\subsection{In-place algorithms vs algorithms using scratch space}
+%%
+%For simple algorithms, such as the Radix-2 algorithms, the FFT can be
+%performed in-place, without additional memory. For this to be possible
+%the index calculations must be simple enough that the calculation of
+%the result to be stored in index $k$ can be carried out at the same
+%time as the data in $k$ is used, so that no temporary storage is
+%needed.
+
+%The mixed-radix algorithm is too complicated for this. It requires an
+%area of scratch space sufficient to hold intermediate copies of the
+%input data.
+
+%\subsection{Self-sorting algorithms vs scrambling algorithms}
+%%
+%A self-sorting algorithm At each iteration of the FFT internal permutations are included
+%which leave the final iteration in its natural order.
+
+
+%The mixed-radix algorithm can be made self-sorting. The additional
+%scratch space helps here, although it is in fact possible to design
+%self-sorting algorithms which do not require scratch
+%space.
+
+
+%The in-place radix-2 algorithm is not self-sorting. The data is
+%permuted, and transformed into bit-reversed order. Note that
+%bit-reversal only refers to the order of the array, not the values for
+%each index which are of course not changed. More precisely, the data
+%stored in location $[b_n \dots b_2 b_1 b_0]$ is moved to location
+%$[b_0 b_1 b_2 \dots b_n]$, where $b_0 \dots b_n$ are the raw bits of a
+%given index. Placing the data in bit reversed order is easily done,
+%using right shifts to extract the least significant bits of the index
+%and left-shifts to feed them into a register for the bit-reversed
+%location. Simple radix-2 FFT usually recompute the bit reverse
+%ordering in the naive way for every call. For repeated calls it might
+%be worthwhile to precompute the permutation and cache it. There are
+%also more sophisticated algorithms which reduce the number of
+%operations needed to perform bit-reversal~\cite{bit-reversal}.
+
+
+%\begin{subsection}{Decimation-in-time (DIT) vs Decimation-in-Frequency (DIF)}
+
+%\end{subsection}
+
+
+\subsection{Optimization}
+%
+There is no such thing as the single fastest FFT {\em algorithm}. FFT
+algorithms involve a mixture of floating point calculations, integer
+arithmetic and memory access. Each of these operations will have
+different relative speeds on different platforms. The performance of
+an algorithm is a function of the hardware it is implemented on. The
+goal of optimization is thus to choose the algorithm best suited to
+the characteristics of a given hardware platform.
+
+For example, the Winograd Fourier Transform (WFTA) is an algorithm
+which is designed to reduce the number of floating point
+multiplications in the FFT. However, it does this at the expense of
+using many more additions and data transfers than other algorithms.
+As a consequence the WFTA might be a good candidate algorithm for
+machines where data transfers occupy a negligible time relative to
+floating point arithmetic. However on most modern machines, where the
+speed of data transfers is comparable to or slower than floating point
+operations, it would be outperformed by an algorithm which used a
+better mix of operations (i.e. more floating point operations but
+fewer data transfers).
+
+For a study of this sort of effect in detail, comparing the different
+algorithms on different platforms consult the paper {\it Effects of
+Architecture Implementation on DFT Algorithm Performance} by Mehalic,
+Rustan and Route~\cite{mehalic85}. The paper was written in the early
+1980's and has data for super- and mini-computers which you are
+unlikely to see today, except in a museum. However, the methodology is
+still valid and it would be interesting to see similar results for
+present day computers.
+
+
+\section{FFT Concepts}
+%
+Factorization is the key principle of the mixed-radix FFT divide-and-conquer
+strategy. If $N$ can be factorized into a product of $n_f$ integers,
+%
+\begin{equation}
+N = f_1 f_2 ... f_{n_f} ,
+\end{equation}
+%
+then the FFT itself can be divided into smaller FFTs for each factor.
+More precisely, an FFT of length $N$ can be broken up into,
+%
+\begin{quote}
+\begin{tabular}{l}
+$(N/f_1)$ FFTs of length $f_1$, \\
+$(N/f_2)$ FFTs of length $f_2$, \\
+\dots \\
+$(N/f_{n_f})$ FFTs of length $f_{n_f}$.
+\end{tabular}
+\end{quote}
+%
+The total number of operations for these sub-operations will be $O(
+N(f_1 + f_2 + ... + f_{n_f}))$. When the factors of $N$ are all small
+integers this will be substantially less than $O(N^2)$. For example,
+when $N$ is a power of 2 an FFT of length $N=2^m$ can be reduced to $m
+N/2$ FFTs of length 2, or $O(N\log_2 N)$ operations. Here is a
+demonstration which shows this:
+
+We start with the full DFT,
+%
+\begin{eqnarray}
+h_a &=& \sum_{b=0}^{N-1} g_b W_N^{ab} \qquad W_N=\exp(-2\pi i/N)
+\end{eqnarray}
+%
+and split the sum into even and odd terms,
+%
+\begin{eqnarray}
+\phantom{h_a}
+% &=& \left(\sum_{b=0,2,4,\dots} + \sum_{b=1,3,5,\dots}\right) g_b W_N^{ab}\\
+ &=& \sum_{b=0}^{N/2-1} g_{2b} W_N^{a(2b)} +
+ \sum_{b=0}^{N/2-1} g_{2b+1} W_N^{a(2b+1)}.
+\end{eqnarray}
+%
+This converts the original DFT of length $N$ into two DFTs of length
+$N/2$,
+%
+\begin{equation}
+h_a = \sum_{b=0}^{N/2-1} g_{2b} W_{(N/2)}^{ab} +
+ W_N^a \sum_{b=0}^{N/2-1} g_{2b+1} W_{(N/2)}^{ab}
+\end{equation}
+%
+The first term is a DFT of the even elements of $g$. The second term
+is a DFT of the odd elements of $g$, premultiplied by an exponential
+factor $W_N^k$ (known as a {\em twiddle factor}).
+%
+\begin{equation}
+\mathrm{DFT}(h) = \mathrm{DFT}(g_{even}) + W_N^k \mathrm{DFT}(g_{odd})
+\end{equation}
+%
+By splitting the DFT into its even and odd parts we have reduced the
+operation count from $N^2$ (for a DFT of length $N$) to $2 (N/2)^2$
+(for two DFTs of length $N/2$). The cost of the splitting is that we
+need an additional $O(N)$ operations to multiply by the twiddle factor
+$W_N^k$ and recombine the two sums.
+
+We can repeat the splitting procedure recursively $\log_2 N$ times
+until the full DFT is reduced to DFTs of single terms. The DFT of a
+single value is just the identity operation, which costs nothing.
+However since $O(N)$ operations were needed at each stage to recombine
+the even and odd parts the total number of operations to obtain the
+full DFT is $O(N \log_2 N)$. If we had used a length which was a
+product of factors $f_1$, $f_2$, $\dots$ we could have split the sum
+in a similar way. First we would split terms corresponding to the
+factor $f_1$, instead of the even and odd terms corresponding to a
+factor of two. Then we would repeat this procedure for the subsequent
+factors. This would lead to a final operation count of $O(N \sum
+f_i)$.
+
+This procedure gives some motivation for why the number of operations
+in a DFT can in principle be reduced from $O(N^2)$ to $O(N \sum f_i)$.
+It does not give a good explanation of how to implement the algorithm
+in practice which is what we shall do in the next section.
+
+\section{Radix-2 Algorithms}
+%
+For radix-2 FFTs it is natural to write array indices in binary form
+because the length of the data is a power of two. This is nicely
+explained in the article {\em The FFT: Fourier Transforming One Bit at
+a Time} by P.B. Visscher~\cite{visscher96}. A binary representation
+for indices is the key to deriving the simplest efficient radix-2
+algorithms.
+
+We can write an index $b$ ($0 \leq b < 2^{n-1}$) in binary
+representation like this,
+%
+\begin{equation}
+b = [b_{n-1} \dots b_1 b_0] = 2^{n-1}b_{n-1} + \dots + 2 b_1 + b_0 .
+\end{equation}
+%
+Each of the $b_0, b_1, \dots, b_{n-1}$ are the bits (either 0 or 1) of
+$b$.
+
+Using this notation the original definition of the DFT
+can be rewritten as a sum over the bits of $b$,
+%
+\begin{equation}
+h(a) = \sum_{b=0}^{N-1} g_b \exp(-2\pi i a b /N)
+\end{equation}
+%
+to give an equivalent summation like this,
+%
+\begin{equation}
+h([a_{n-1} \dots a_1 a_0]) =
+\sum_{b_0=0}^{1}
+\sum_{b_1=0}^{1}
+\dots
+\sum_{b_{n-1}=0}^{1}
+ g([b_{n-1} \dots b_1 b_0]) W_N^{ab}
+\end{equation}
+%
+where the bits of $a$ are $a=[a_{n-1} \dots a_1 a_0]$.
+
+To reduce the number of operations in the sum we will use the
+periodicity of the exponential term,
+%
+\begin{equation}
+W_N^{x+N} = W_N^{x}.
+\end{equation}
+%
+Most of the products $ab$ in $W_N^{ab}$ are greater than $N$. By
+making use of this periodicity they can all be collapsed down into the
+range $0\dots N-1$. This allows us to reduce the number of operations
+by combining common terms, modulo $N$. Using this idea we can derive
+decimation-in-time or decimation-in-frequency algorithms, depending on
+how we break the DFT summation down into common terms. We'll first
+consider the decimation-in-time algorithm.
+
+\subsection{Radix-2 Decimation-in-Time (DIT)}
+%
+To derive the the decimation-in-time algorithm we start by separating
+out the most significant bit of the index $b$,
+%
+\begin{equation}
+[b_{n-1} \dots b_1 b_0] = 2^{n-1}b_{n-1} + [b_{n-2} \dots b_1 b_0]
+\end{equation}
+%
+Now we can evaluate the innermost sum of the DFT without any
+dependence on the remaining bits of $b$ in the exponential,
+%
+\begin{eqnarray}
+h([a_{n-1} \dots a_1 a_0]) &=&
+\sum_{b_0=0}^{1}
+\sum_{b_1=0}^{1}
+\dots
+\sum_{b_{n-1}=0}^{1}
+ g(b)
+W_N^{a(2^{n-1}b_{n-1}+[b_{n-2} \dots b_1 b_0])} \\
+ &=&
+\sum_{b_0=0}^{1}
+\sum_{b_1=0}^{1}
+\dots
+\sum_{b_{n-2}=0}^{1}
+W_N^{a[b_{n-2} \dots b_1 b_0]}
+\sum_{b_{n-1}=0}^{1}
+ g(b)
+W_N^{a(2^{n-1}b_{n-1})}
+\end{eqnarray}
+%
+Looking at the term $W_N^{a(2^{n-1}b_{n-1})}$ we see that we can also
+remove most of the dependence on $a$ as well, by using the periodicity of the
+exponential,
+%
+\begin{eqnarray}
+W_N^{a(2^{n-1}b_{n-1})} &=&
+\exp(-2\pi i [a_{n-1} \dots a_1 a_0] 2^{n-1} b_{n-1}/ 2^n )\\
+&=& \exp(-2\pi i [a_{n-1} \dots a_1 a_0] b_{n-1}/ 2 )\\
+&=& \exp(-2\pi i ( 2^{n-2}a_{n-1} + \dots + a_1 + (a_0/2)) b_{n-1} )\\
+&=& \exp(-2\pi i a_0 b_{n-1}/2 ) \\
+&=& W_2^{a_0 b_{n-1}}
+\end{eqnarray}
+%
+Thus the innermost exponential term simplifies so that it only
+involves the highest order bit of $b$ and the lowest order bit of $a$,
+and the sum can be reduced to,
+%
+\begin{equation}
+h([a_{n-1} \dots a_1 a_0])
+=
+\sum_{b_0=0}^{1}
+\sum_{b_1=0}^{1}
+\dots
+\sum_{b_{n-2}=0}^{1}
+W_N^{a[b_{n-2} \dots b_1 b_0]}
+\sum_{b_{n-1}=0}^{1}
+ g(b)
+W_2^{a_0 b_{n-1}}.
+\end{equation}
+%
+We can repeat this this procedure for the next most significant bit of
+$b$, $b_{n-2}$, using a similar identity,
+%
+\begin{eqnarray}
+W_N^{a(2^{n-2}b_{n-2})}
+&=& \exp(-2\pi i [a_{n-1} \dots a_1 a_0] 2^{n-2} b_{n-2}/ 2^n )\\
+&=& W_4^{ [a_1 a_0] b_{n-2}}.
+\end{eqnarray}
+%
+to give a formula with even less dependence on the bits of $a$,
+%
+\begin{equation}
+h([a_{n-1} \dots a_1 a_0])
+=
+\sum_{b_0=0}^{1}
+\sum_{b_1=0}^{1}
+\dots
+\sum_{b_{n-3}=0}^{1}
+W_N^{a[b_{n-3} \dots b_1 b_0]}
+\sum_{b_{n-2}=0}^{1}
+W_4^{[a_1 a_0] b_{n-2}}
+\sum_{b_{n-1}=0}^{1}
+ g(b)
+W_2^{a_0 b_{n-1}}.
+\end{equation}
+%
+If we repeat the process for all the remaining bits we obtain a
+simplified DFT formula which is the basis of the radix-2
+decimation-in-time algorithm,
+%
+\begin{eqnarray}
+h([a_{n-1} \dots a_1 a_0]) &=&
+\sum_{b_0=0}^{1}
+W_{N}^{[a_{n-1} \dots a_1 a_0]b_0}
+%\sum_{b_1=0}^{1}
+%W_{N/2}^{[a_{n-1} \dots a_1 a_0]b_1}
+\dots
+\sum_{b_{n-2}=0}^{1}
+W_4^{ [a_1 a_0] b_{n-2}}
+\sum_{b_{n-1}=0}^{1}
+W_2^{a_0 b_{n-1}}
+g(b)
+\end{eqnarray}
+%
+To convert the formula to an algorithm we expand out the sum
+recursively, evaluating each of the intermediate summations, which we
+denote by $g_1$, $g_2$, \dots, $g_n$,
+%
+\begin{eqnarray}
+g_1(a_0, b_{n-2}, b_{n-3}, \dots, b_1, b_0)
+&=&
+\sum_{b_{n-1}=0}^{1}
+W_2^{a_0 b_{n-1}}
+g([b_{n-1} b_{n-2} b_{n-3} \dots b_1 b_0]) \\
+g_2(a_0, {}_{\phantom{-2}} a_{1}, b_{n-3}, \dots, b_1, b_0)
+&=&
+\sum_{b_{n-2}=0}^{1}
+W_4^{[a_1 a_0] b_{n-2}}
+g_1(a_0, b_{n-2}, b_{n-3}, \dots, b_1, b_0) \\
+g_3(a_0, {}_{\phantom{-2}} a_{1}, {}_{\phantom{-3}} a_{2}, \dots, b_1, b_0)
+&=&
+\sum_{b_{n-3}=0}^{1}
+W_8^{[a_2 a_1 a_0] b_{n-2}}
+g_2(a_0, a_1, b_{n-3}, \dots, b_1, b_0) \\
+\dots &=& \dots \\
+g_n(a_0, a_{1}, a_{2}, \dots, a_{n-2}, a_{n-1})
+&=&
+\sum_{b_{0}=0}^{1}
+W_N^{[a_{n-1} \dots a_1 a_0]b_0}
+g_{n-1}(a_0, a_1, a_2, \dots, a_{n-2}, b_0)
+\end{eqnarray}
+%
+After the final sum, we can obtain the transform $h$ from $g_n$,
+%
+\begin{equation}
+h([a_{n-1} \dots a_1 a_0])
+=
+g_n(a_0, a_1, \dots, a_{n-1})
+\end{equation}
+%
+Note that we left the storage arrangements of the intermediate sums
+unspecified by using the bits as function arguments and not as an
+index. The storage of intermediate sums is different for the
+decimation-in-time and decimation-in-frequency algorithms.
+
+Before deciding on the best storage scheme we'll show that the results
+of each stage, $g_1$, $g_2$, \dots, can be carried out {\em
+in-place}. For example, in the case of $g_1$, the inputs are,
+%
+\begin{equation}
+g([\underline{b_{n-1}} b_{n-2} b_{n-3} \dots b_1 b_0])
+\end{equation}
+%
+for $b_{n-1}=(0,1)$, and the corresponding outputs are,
+%
+\begin{equation}
+g_1(\underline{a_0},b_{n-2}, b_{n-3}, \dots, b_1, b_0)
+\end{equation}
+%
+for $a_0=(0,1)$. It's clear that if we hold $b_{n-2}, b_{n-3}, \dots,
+b_1, b_0$ fixed and compute the sum over $b_{n-1}$ in memory for both
+values of $a_0 = 0,1$ then we can store the result for $a_0=0$ in the
+location which originally had $b_0=0$ and the result for $a_0=1$ in
+the location which originally had $b_0=1$. The two inputs and two
+outputs are known as {\em dual node pairs}. At each stage of the
+calculation the sums for each dual node pair are independent of the
+others. It is this property which allows an in-place calculation.
+
+So for an in-place pass our storage has to be arranged so that the two
+outputs $g_1(a_0,\dots)$ overwrite the two input terms
+$g([b_{n-1},\dots])$. Note that the order of $a$ is reversed from the
+natural order of $b$. i.e. the least significant bit of $a$
+replaces the most significant bit of $b$. This is inconvenient
+because $a$ occurs in its natural order in all the exponentials,
+$W^{ab}$. We could keep track of both $a$ and its bit-reverse,
+$a^{\mathit bit-reversed}$ at all times but there is a neat trick
+which avoids this: if we bit-reverse the order of the input data $g$
+before we start the calculation we can also bit-reverse the order of
+$a$ when storing intermediate results. Since the storage involving $a$
+was originally in bit-reversed order the switch in the input $g$ now
+allows us to use normal ordered storage for $a$, the same ordering
+that occurs in the exponential factors.
+
+This is complicated to explain, so here is an example of the 4 passes
+needed for an $N=16$ decimation-in-time FFT, with the initial data
+stored in bit-reversed order,
+%
+\begin{eqnarray}
+g_1([b_0 b_1 b_2 a_0])
+&=&
+\sum_{b_3=0}^{1} W_2^{a_0 b_3} g([b_0 b_1 b_2 b_3])
+\\
+g_2([b_0 b_1 a_1 a_0])
+&=&
+\sum_{b_2=0}^{1} W_4^{[a_1 a_0] b_2} g_1([b_0 b_1 b_2 a_0])
+\\
+g_3([b_0 a_2 a_1 a_0])
+&=&
+\sum_{b_1=0}^{1} W_8^{[a_2 a_1 a_0] b_1} g_2([b_0 b_1 a_1 a_0])
+\\
+h(a) = g_4([a_3 a_2 a_1 a_0])
+&=&
+\sum_{b_0=0}^{1} W_{16}^{[a_3 a_2 a_1 a_0] b_0} g_3([b_0 a_2 a_1 a_0])
+\end{eqnarray}
+%
+We compensate for the bit reversal of the input data by accessing $g$
+with the bit-reversed form of $b$ in the first stage. This ensures
+that we are still carrying out the same calculation, using the same
+data, and not accessing different values. Only single bits of $b$ ever
+occur in the exponential so we never need the bit-reversed form of
+$b$.
+
+Let's examine the third pass in detail,
+%
+\begin{equation}
+g_3([b_0 a_2 a_1 a_0])
+=
+\sum_{b_1=0}^{1} W_8^{[a_2 a_1 a_0] b_1} g_2([b_0 b_1 a_1 a_0])
+\end{equation}
+%
+First note that only one bit, $b_1$, varies in each summation. The
+other bits of $b$ ($b_0$) and of $a$ ($a_1 a_0$) are essentially
+``spectators'' -- we must loop over all combinations of these bits and
+carry out the same basic calculation for each, remembering to update
+the exponentials involving $W_8$ appropriately. If we are storing the
+results in-place (with $g_3$ overwriting $g_2$ we will need to compute
+the sums involving $b_1=0,1$ and $a_2=0,1$ simultaneously.
+%
+\begin{equation}
+\left(
+\begin{array}{c}
+g_3([b_0 0 a_1 a_0]) \vphantom{W_8^{[]}} \\
+g_3([b_0 1 a_1 a_0]) \vphantom{W_8^{[]}}
+\end{array}
+\right)
+=
+\left(
+\begin{array}{c}
+g_2([b_0 0 a_1 a_0]) + W_8^{[0 a_1 a_0]} g_2([b_2 1 a_1 a_0]) \\
+g_2([b_0 0 a_1 a_0]) + W_8^{[1 a_1 a_0]} g_2([b_2 1 a_1 a_0])
+\end{array}
+\right)
+\end{equation}
+%
+We can write this in a more symmetric form by simplifying the exponential,
+%
+\begin{equation}
+W_8^{[a_2 a_1 a_0]}
+= W_8^{4 a_2 + [a_1 a_0]}
+= (-1)^{a_2} W_8^{[a_1 a_0]}
+\end{equation}
+%
+\begin{equation}
+\left(
+\begin{array}{c}
+g_3([b_0 0 a_1 a_0]) \vphantom{W_8^{[]}} \\
+g_3([b_0 1 a_1 a_0]) \vphantom{W_8^{[]}}
+\end{array}
+\right)
+=
+\left(
+\begin{array}{c}
+g_2([b_0 0 a_1 a_0]) + W_8^{[a_1 a_0]} g_2([b_2 1 a_1 a_0]) \\
+g_2([b_0 0 a_1 a_0]) - W_8^{[a_1 a_0]} g_2([b_2 1 a_1 a_0])
+\end{array}
+\right)
+\end{equation}
+%
+The exponentials $W_8^{[a_1 a_0]}$ are referred to as {\em twiddle
+factors}. The form of this calculation, a symmetrical sum and
+difference involving a twiddle factor is called {\em a butterfly}.
+It is often shown diagrammatically, and in the case $b_0=a_0=a_1=0$
+would be drawn like this,
+%
+\begin{center}
+\setlength{\unitlength}{1cm}
+\begin{picture}(9,4)
+%
+%\put(0,0){\line(1,0){8}}
+%\put(0,0){\line(0,1){4}}
+%\put(8,4){\line(0,-1){4}}
+%\put(8,4){\line(-1,0){8}}
+%
+\put(0,1){$g_2(4)$} \put(4.5,1){$g_3(4)=g_2(0) - W^a_8 g_2(4)$}
+\put(0,3){$g_2(0)$} \put(4.5,3){$g_3(0)=g_2(0) + W^a_8 g_2(4)$}
+\put(1,1){\vector(1,0){0.5}}
+\put(1.5,1){\line(1,0){0.5}}
+\put(1.5,0.5){$W^a_8$}
+\put(1,3){\vector(1,0){0.5}}\put(1.5,3){\line(1,0){0.5}}
+\put(2,1){\circle*{0.1}}
+\put(2,3){\circle*{0.1}}
+\put(2,1){\vector(1,1){2}}
+\put(2,1){\vector(1,0){1}}
+\put(3,1){\line(1,0){1}}
+\put(3,0.5){$-1$}
+\put(2,3){\vector(1,-1){2}}
+\put(2,3){\vector(1,0){1}}
+\put(3,3){\line(1,0){1}}
+\put(4,1){\circle*{0.1}}
+\put(4,3){\circle*{0.1}}
+\end{picture}
+\end{center}
+%
+The inputs are shown on the left and the outputs on the right. The
+outputs are computed by multiplying the incoming lines by their
+accompanying factors (shown next to the lines) and summing the results
+at each node.
+
+In general, denoting the bit for dual-node pairs by $\Delta$ and the
+remaining bits of $a$ and $b$ by ${\hat a}$ and ${\hat b}$, the
+butterfly is,
+%
+\begin{equation}
+\left(
+\begin{array}{c}
+g({\hat b} + {\hat a}) \\
+g({\hat b} + \Delta + {\hat a}) \\
+\end{array}
+\right)
+\leftarrow
+\left(
+\begin{array}{c}
+g({\hat b} + {\hat a}) + W_{2\Delta}^{\hat a} g({\hat b} + \Delta + {\hat a})\\
+g({\hat b} + {\hat a}) - W_{2\Delta}^{\hat a} g({\hat b} + \Delta + {\hat a})
+\end{array}
+\right)
+\end{equation}
+%
+where ${\hat a}$ runs from $0 \dots \Delta-1$ and ${\hat b}$ runs
+through $0 \times 2\Delta$, $1\times 2\Delta$, $\dots$, $(N/\Delta -
+1)2\Delta$. The value of $\Delta$ is 1 on the first pass, 2 on the
+second pass and $2^{n-1}$ on the $n$-th pass. Each pass requires
+$N/2$ in-place computations, each involving two input locations and
+two output locations.
+
+In the example above $\Delta = [100] = 4$, ${\hat a} = [a_1 a_0]$ and
+${\hat b} = [b_0 0 0 0]$.
+
+This leads to the canonical radix-2 decimation-in-time FFT algorithm
+for $2^n$ data points stored in the array $g(0) \dots g(2^n-1)$.
+%
+\begin{algorithm}
+\STATE bit-reverse ordering of $g$
+\STATE {$\Delta \Leftarrow 1$}
+\FOR {$\mbox{pass} = 1 \dots n$}
+ \STATE {$W \Leftarrow \exp(-2 \pi i / 2\Delta)$}
+ \FOR {$(a = 0 ; a < \Delta ; a{++})$}
+ \FOR{$(b = 0 ; b < N ; b {+=} 2*\Delta)$}
+ \STATE{$t_0 \Leftarrow g(b+a) + W^a g(b+\Delta+a)$}
+ \STATE{$t_1 \Leftarrow g(b+a) - W^a g(b+\Delta+a)$}
+ \STATE{$g(b+a) \Leftarrow t_0$}
+ \STATE{$g(b+\Delta+a) \Leftarrow t_1$}
+ \ENDFOR
+ \ENDFOR
+ \STATE{$\Delta \Leftarrow 2\Delta$}
+\ENDFOR
+\end{algorithm}
+%
+%This algorithm appears in Numerical Recipes as the routine {\tt
+%four1}, where the implementation is attributed to N.M. Brenner.
+%
+\subsection{Details of the Implementation}
+It is straightforward to implement a simple radix-2 decimation-in-time
+routine from the algorithm above. Some optimizations can be made by
+pulling the special case of $a=0$ out of the loop over $a$, to avoid
+unnecessary multiplications when $W^a=1$,
+%
+\begin{algorithm}
+ \FOR{$(b = 0 ; b < N ; b {+=} 2*\Delta)$}
+ \STATE{$t_0 \Leftarrow g(b) + g(b+\Delta)$}
+ \STATE{$t_1 \Leftarrow g(b) - g(b+\Delta)$}
+ \STATE{$g(b) \Leftarrow t_0$}
+ \STATE{$g(b+\Delta) \Leftarrow t_1$}
+ \ENDFOR
+\end{algorithm}
+%
+There are several algorithms for doing fast bit-reversal. We use the
+Gold-Rader algorithm, which is simple and does not require any working
+space,
+%
+\begin{algorithm}
+\FOR{$i = 0 \dots n - 2$}
+ \STATE {$ k = n / 2 $}
+ \IF {$i < j$}
+ \STATE {swap $g(i)$ and $g(j)$}
+ \ENDIF
+
+ \WHILE {$k \leq j$}
+ \STATE{$j \Leftarrow j - k$}
+ \STATE{$k \Leftarrow k / 2$}
+ \ENDWHILE
+
+ \STATE{$j \Leftarrow j + k$}
+\ENDFOR
+\end{algorithm}
+%
+The Gold-Rader algorithm is typically twice as fast as a naive
+bit-reversal algorithm (where the bit reversal is carried out by
+left-shifts and right-shifts on the index). The library also has a
+routine for the Rodriguez bit reversal algorithm, which also does not
+require any working space~\cite{rodriguez89}. There are faster bit
+reversal algorithms, but they all use additional scratch
+space~\cite{rosel89}.
+
+Within the loop for $a$ we can compute $W^a$ using a trigonometric
+recursion relation,
+%
+\begin{eqnarray}
+W^{a+1} &=& W W^a \\
+ &=& (\cos(2\pi/2\Delta) + i \sin(2\pi/2\Delta)) W^a
+\end{eqnarray}
+%
+This requires only $2 \log_2 N$ trigonometric calls, to compute the
+initial values of $\exp(2\pi i /2\Delta)$ for each pass.
+
+\subsection{Radix-2 Decimation-in-Frequency (DIF)}
+%
+To derive the decimation-in-frequency algorithm we start by separating
+out the lowest order bit of the index $a$. Here is an example for the
+decimation-in-frequency $N=16$ DFT.
+%
+\begin{eqnarray}
+W_{16}^{[a_3 a_2 a_1 a_0][b_3 b_2 b_1 b_0]}
+&=&
+W_{16}^{[a_3 a_2 a_1 a_0][b_2 b_1 b_0]} W_{16}^{[a_3 a_2 a_1 a_0] [b_3
+0 0 0]} \\
+&=&
+W_8^{[a_3 a_2 a_1][b_2 b_1 b_0]} W_{16}^{a_0 [b_2 b_1 b_0]} W_2^{a_0
+b_3} \\
+&=&
+W_8^{[a_3 a_2 a_1][b_2 b_1 b_0]} W_{16}^{a_0 [b_2 b_1 b_0]} (-1)^{a_0 b_3}
+\end{eqnarray}
+%
+By repeating the same type of the expansion on the term,
+%
+\begin{equation}
+W_8^{[a_3 a_2 a_1][b_2 b_1 b_0]}
+\end{equation}
+%
+we can reduce the transform to an alternative simple form,
+%
+\begin{equation}
+h(a) =
+\sum_{b_0=0}^1 (-1)^{a_3 b_0} W_4^{a_2 b_0}
+\sum_{b_1=0}^1 (-1)^{a_2 b_1} W_8^{a_1 [b_1 b_0]}
+\sum_{b_2=0}^1 (-1)^{a_1 b_2} W_{16}^{a_0 [b_2 b_1 b_0]}
+\sum_{b_3=0}^1 (-1)^{a_0 b_3} g(b)
+\end{equation}
+%
+To implement this we can again write the sum recursively. In this case
+we do not have the problem of the order of $a$ being bit reversed --
+the calculation can be done in-place using the natural ordering of
+$a$ and $b$,
+%
+\begin{eqnarray}
+g_1([a_0 b_2 b_1 b_0])
+&=&
+W_{16}^{a_0 [b_2 b_1 b_0]}
+\sum_{b_3=0}^1 (-1)^{a_0 b_3} g([b_3 b_2 b_1 b_0]) \\
+g_2([a_0 a_1 b_1 b_0])
+&=&
+W_{8}^{a_1 [b_1 b_0]}
+\sum_{b_2=0}^1 (-1)^{a_1 b_2} g_1([a_0 b_2 b_1 b_0]) \\
+g_3([a_0 a_1 a_2 b_0])
+&=&
+W_{4}^{a_2 b_0}
+\sum_{b_1=0}^1 (-1)^{a_2 b_1} g_2([a_0 a_1 b_1 b_0]) \\
+h(a)
+=
+g_4([a_0 a_1 a_2 a_3])
+&=&
+\sum_{b_0=0}^1 (-1)^{a_3 b_0} g_3([a_0 a_1 a_2 b_0])
+\end{eqnarray}
+%
+The final pass leaves the data for $h(a)$ in bit-reversed order, but
+this is easily fixed by a final bit-reversal of the ordering.
+
+The basic in-place calculation or butterfly for each pass is slightly
+different from the decimation-in-time version,
+%
+\begin{equation}
+\left(
+\begin{array}{c}
+g({\hat a} + {\hat b}) \\
+g({\hat a} + \Delta + {\hat b}) \\
+\end{array}
+\right)
+\leftarrow
+\left(
+\begin{array}{c}
+g({\hat a} + {\hat b}) + g({\hat a} + \Delta + {\hat b})\\
+W_{\Delta}^{\hat b}
+\left( g({\hat a} + {\hat b}) - g({\hat a} + \Delta + {\hat b}) \right)
+\end{array}
+\right)
+\end{equation}
+%
+In each pass ${\hat b}$ runs from $0 \dots \Delta-1$ and ${\hat
+a}$ runs from $0, 2\Delta, \dots, (N/\Delta -1) \Delta$. On the first
+pass we start with $\Delta=16$, and on subsequent passes $\Delta$ takes
+the values $8, 4, \dots, 1$.
+
+This leads to the canonical radix-2 decimation-in-frequency FFT
+algorithm for $2^n$ data points stored in the array $g(0) \dots
+g(2^n-1)$.
+%
+\begin{algorithm}
+\STATE {$\Delta \Leftarrow 2^{n-1}$}
+\FOR {$\mbox{pass} = 1 \dots n$}
+ \STATE {$W \Leftarrow \exp(-2 \pi i / 2\Delta)$}
+ \FOR {$(b = 0 ; b < \Delta ; b++)$}
+ \FOR{$(a = 0 ; a < N ; a += 2*\Delta)$}
+ \STATE{$t_0 \Leftarrow g(b+a) + g(a+\Delta+b)$}
+ \STATE{$t_1 \Leftarrow W^b \left( g(a+b) - g(a+\Delta+b) \right)$}
+ \STATE{$g(a+b) \Leftarrow t_0$}
+ \STATE{$g(a+\Delta+b) \Leftarrow t_1$}
+ \ENDFOR
+ \ENDFOR
+ \STATE{$\Delta \Leftarrow \Delta/2$}
+\ENDFOR
+\STATE bit-reverse ordering of $g$
+\end{algorithm}
+%
+
+\section{Self-Sorting Mixed-Radix Complex FFTs}
+%
+This section is based on the review article {\em Self-sorting
+Mixed-Radix Fast Fourier Transforms} by Clive
+Temperton~\cite{temperton83}. You should consult his article for full
+details of all the possible algorithms (there are many
+variations). Here I have annotated the derivation of the simplest
+mixed-radix decimation-in-frequency algorithm.
+
+For general-$N$ FFT algorithms the simple binary-notation of radix-2
+algorithms is no longer useful. The mixed-radix FFT has to be built
+up using products of matrices acting on a data vector. The aim is to
+take the full DFT matrix $W_N$ and factor it into a set of small,
+sparse matrices corresponding to each factor of $N$.
+
+
+We'll denote the components of matrices using either subscripts or
+function notation,
+%
+\begin{equation}
+M_{ij} = M(i,j)
+\end{equation}
+%
+with (C-like) indices running from 0 to $N-1$. Matrix products will be
+denoted using square brackets,
+%
+\begin{equation}
+[AB]_{ij} = \sum_{k} A_{ik} B_{kj}
+\end{equation}
+%
+%
+Three special matrices will be needed in the mixed-radix factorization
+of the DFT: the identity matrix, $I$, a permutation matrix, $P$ and a
+matrix of twiddle factors, $D$, as well as the normal DFT matrices
+$W_n$.
+
+We write the identity matrix of order $r$ as $I_r(n,m)$,
+%
+\begin{equation}
+I_r(n,m) = \delta_{nm}
+\end{equation}
+%
+for $0 \leq n,m \leq r-1$.
+
+We also need to define a permutation matrix $P^a_b$ that performs
+digit reversal of the ordering of a vector. If the index of a vector
+$j= 0\dots N-1$ is factorized into $j = la +m$, with $0 \leq l \leq
+b-1$ and $0 \leq m \leq a-1$ then the operation of the matrix $P$ will
+exchange positions $la+m$ and $mb+l$ in the vector (this sort of
+digit-reversal is the generalization of bit-reversal to a number
+system with exponents $a$ and $b$).
+
+In mathematical terms $P$ is a square matrix of size $ab \times ab$
+with the property,
+%
+\begin{eqnarray}
+P^a_b(j,k) &=& 1 ~\mbox{if}~ j=ra+s ~\mbox{and}~ k=sb+r \\
+ &=& 0 ~\mbox{otherwise}
+\end{eqnarray}
+%
+
+Finally the FFT algorithm needs a matrix of twiddle factors, $D^a_b$,
+for the trigonometric sums. $D^a_b$ is a diagonal square matrix of
+size $ab \times ab$ with the definition,
+%
+\begin{eqnarray}
+D^a_b(j,k) &=& \omega^{sr}_{ab} ~\mbox{if}~ j=k=sb+r \\
+ &=& 0 ~\mbox{otherwise}
+\end{eqnarray}
+%
+where $\omega_{ab} = e^{-2\pi i/ab}$.
+
+
+\subsection{The Kronecker Product}
+The Kronecker matrix product plays an important role in all the
+algorithms for combining operations on different subspaces. The
+Kronecker product $A \otimes B$ of two square matrices $A$ and $B$, of
+sizes $a \times a$ and $b \times b$ respectively, is a square matrix
+of size $a b \times a b$, defined as,
+%
+\begin{equation}
+[A \otimes B] (tb+u, rb+s) = A(t,r) B(u,s)
+\end{equation}
+%
+where $0 \leq u,s < b$ and $0 \leq t,r < a$. Let's examine a specific
+example. If we take a $2 \times 2$ matrix and a $3
+\times 3$ matrix,
+%
+\begin{equation}
+\begin{array}{ll}
+A =
+\left(
+\begin{array}{cc}
+a_{11} & a_{12} \\
+a_{21} & a_{22}
+\end{array}
+\right)
+&
+B =
+\left(
+\begin{array}{ccc}
+b_{11} & b_{12} & b_{13} \\
+b_{21} & b_{22} & b_{23} \\
+b_{31} & b_{32} & b_{33}
+\end{array}
+\right)
+\end{array}
+\end{equation}
+%
+then the Kronecker product $A \otimes B$ is,
+%
+\begin{eqnarray}
+A \otimes B &= &
+\left(
+\begin{array}{cc}
+a_{11} B & a_{12} B \\
+a_{12} B & a_{22} B
+\end{array}
+\right) \\
+ &=&
+\left(
+\begin{array}{cccccc}
+a_{11} b_{11} & a_{11} b_{12} & a_{11} b_{13} &
+ a_{12} b_{11} & a_{12} b_{12} & a_{12} b_{13} \\
+a_{11} b_{21} & a_{11} b_{22} & a_{11} b_{23} &
+ a_{12} b_{21} & a_{12} b_{22} & a_{12} b_{23} \\
+a_{11} b_{31} & a_{11} b_{32} & a_{11} b_{33} &
+ a_{12} b_{31} & a_{12} b_{32} & a_{12} b_{33} \\
+a_{21} b_{11} & a_{21} b_{12} & a_{21} b_{13} &
+ a_{22} b_{11} & a_{22} b_{12} & a_{22} b_{13} \\
+a_{21} b_{21} & a_{21} b_{22} & a_{21} b_{23} &
+ a_{22} b_{21} & a_{22} b_{22} & a_{22} b_{23} \\
+a_{21} b_{31} & a_{21} b_{32} & a_{21} b_{33} &
+ a_{22} b_{31} & a_{22} b_{32} & a_{22} b_{33}
+\end{array}
+\right)
+\end{eqnarray}
+%
+When the Kronecker product $A \otimes B$ acts on a vector of length
+$ab$, each matrix operates on a different subspace of the vector.
+Writing the index $i$ as $i=t b + u$, with $0\leq u \leq b-1$
+and $0\leq t\leq a$, we can see this explicitly by looking at components,
+%
+\begin{eqnarray}
+[(A \otimes B) v]_{(tb+u)}
+& = & \sum_{t'=0}^{a-1} \sum_{u'=0}^{b-1}
+ [A \otimes B]_{(tb+u,t'b+u')} v_{t'b+u'} \\
+& = & \sum_{t'u'} A_{tt'} B_{uu'} v_{t'b+u'}
+\end{eqnarray}
+%
+The matrix $B$ operates on the ``index'' $u'$, for all values of $t'$, and
+the matrix $A$ operates on the ``index'' $t'$, for all values of $u'$.
+%
+The most important property needed for deriving the FFT factorization
+is that the matrix product of two Kronecker products is the Kronecker
+product of the two matrix products,
+%
+\begin{equation}
+(A \otimes B)(C \otimes D) = (AC \otimes BD)
+\end{equation}
+%
+This follows straightforwardly from the original definition of the
+Kronecker product.
+
+\subsection{Two factor case, $N=ab$}
+%
+First consider the simplest possibility, where the data length $N$ can
+be divided into two factors, $N=ab$. The aim is to reduce the DFT
+matrix $W_N$ into simpler matrices corresponding to each factor. To
+make the derivation easier we will start from the known factorization
+and verify it (the initial factorization can be guessed by
+generalizing from simple cases). Here is the factorization we are
+going to prove,
+%
+\begin{equation}
+W_{ab} = (W_b \otimes I_a) P^a_b D^a_b (W_a \otimes I_b).
+\end{equation}
+%
+We can check it by expanding the product into components,
+%
+\begin{eqnarray}
+\lefteqn{[(W_b \otimes I_a) P^a_b D^a_b (W_a \otimes I_b)](la+m,rb+s)} \\
+& = &
+\sum_{u=0}^{b-1} \sum_{t=0}^{a-1}
+[(W_b \otimes I_a)](la+m,ua+t) [P^a_b D^a_b (W_a \otimes I_b)](ua+t,rb+s)
+\end{eqnarray}
+%
+where we have split the indices to match the Kronecker product $0 \leq
+m, r \leq a$, $0 \leq l, s \leq b$. The first term in the sum can
+easily be reduced to its component form,
+%
+\begin{eqnarray}
+[(W_b \otimes I_a)](la+m,ua+t)
+&=& W_b(l,u) I_a(m,t) \\
+&=& \omega_b^{lu} \delta_{mt}
+\end{eqnarray}
+%
+The second term is more complicated. We can expand the Kronecker
+product like this,
+\begin{eqnarray}
+(W_a \otimes I_b)(tb+u,rb+s)
+&=& W_a(t,r) I_a(u,s) \\
+&=& \omega_a^{tr} \delta_{us}
+\end{eqnarray}
+%
+and use this term to build up the product, $P^a_b D^a_b (W_a \otimes
+I_b)$. We first multiply by $D^a_b$,
+%
+\begin{equation}
+[D^a_b (W_a \otimes I_b)](tb+u,rb+s)
+=
+\omega^{tu}_{ab} \omega^{tr}_{a} \delta_{su}
+\end{equation}
+%
+and then apply the permutation matrix, $P^a_b$, which digit-reverses
+the ordering of the first index, to obtain,
+%
+\begin{equation}
+[P^a_b D^a_b (W_a \otimes I_b)](ua+t,rb+s)
+=
+\omega^{tu}_{ab} \omega^{tr}_{a} \delta_{su}
+\end{equation}
+%
+Combining the two terms in the matrix product we can obtain the full
+expansion in terms of the exponential $\omega$,
+%
+\begin{eqnarray}
+[(W_b \otimes I_a) P^a_b D^a_b (W_a \otimes I_b)](la+m,rb+s)
+&=&
+\sum_{u=0}^{b-1} \sum_{t=0}^{a-1}
+\omega_b^{lu} \delta_{mt} \omega^{tu}_{ab} \omega^{tr}_{a} \delta_{su}
+\end{eqnarray}
+%
+If we evaluate this sum explicitly we can make the connection between
+the product involving $W_a$ and $W_b$ (above) and the expansion of the
+full DFT matrix $W_{ab}$,
+%
+\begin{eqnarray}
+\sum_{u=0}^{b-1} \sum_{t=0}^{a-1}
+\omega_b^{lu} \delta_{mt} \omega^{tu}_{ab} \omega^{tr}_{a} \delta_{su}
+&=& \omega^{ls}_b \omega^{ms}_{ab} \omega^{mr}_a \\
+&=& \omega^{als + ms +bmr}_{ab} \\
+&=& \omega^{als + ms +bmr}_{ab} \omega^{lrab}_{ab} \quad\mbox{using~} \omega^{ab}_{ab} =1\\
+&=& \omega^{(la+m)(rb+s)}_{ab} \\
+&=& W_{ab}(la+m,rb+s)
+\end{eqnarray}
+%
+The final line shows that matrix product given above is identical to
+the full two-factor DFT matrix, $W_{ab}$.
+%
+Thus the full DFT matrix $W_{ab}$ for two factors $a$, $b$ can be
+broken down into a product of sub-transforms, $W_a$ and $W_b$, plus
+permutations, $P$, and twiddle factors, $D$, according to the formula,
+%
+\begin{equation}
+W_{ab} = (W_b \otimes I_a) P^a_b D^a_b (W_a \otimes I_b).
+\end{equation}
+%
+This relation is the foundation of the general-$N$ mixed-radix FFT algorithm.
+
+\subsection{Three factor case, $N=abc$}
+%
+The result for the two-factor expansion can easily be generalized to
+three factors. We first consider $abc$ as being a product of two
+factors $a$ and $(bc)$, and then further expand the product $(bc)$ into
+$b$ and $c$. The first step of the expansion looks like this,
+%
+\begin{eqnarray}
+W_{abc} &=& W_{a(bc)}\\
+&=& (W_{bc} \otimes I_a) P^a_{bc} D^a_{bc} (W_a \otimes I_{bc}) .
+\end{eqnarray}
+%
+And after using the two-factor result to expand out $W_{bc}$ we obtain
+the factorization of $W_{abc}$,
+%
+\begin{eqnarray}
+W_{abc} &=& (((W_c \otimes I_b) P^b_c D^b_c (W_b \otimes I_c)) \otimes I_a )
+P^a_{bc} D^a_{bc} (W_a \otimes I_{bc}) \\
+&=& (W_c \otimes I_{ab}) (P^b_c D^b_c \otimes I_a) (W_b \otimes I_{ac}) P^a_{bc} D^a_{bc} (W_a \otimes I_c)
+\end{eqnarray}
+%
+We can write this factorization in a product form, with one term for
+each factor,
+%
+\begin{equation}
+W_{abc} = T_3 T_2 T_1
+\end{equation}
+%
+where we read off $T_1$, $T_2$ and $T_3$,
+%
+\begin{eqnarray}
+T_1 &=& P^a_{bc} D^a_{bc} (W_a \otimes I_{bc}) \\
+T_2 &=& (P^b_c D^b_c \otimes I_a) (W_b \otimes I_{ac}) \\
+T_3 &=& (W_c \otimes I_{ab} )
+\end{eqnarray}
+%
+
+
+\subsection{General case, $N=f_1 f_2 \dots f_{n_f}$}
+%
+If we continue the procedure that we have used for two- and
+three-factors then a general pattern begins to emerge in the
+factorization of $W_{f_1 f_2 \dots f_{n_f}}$. To see the beginning of
+the pattern we can rewrite the three factor case as,
+%
+\begin{eqnarray}
+T_1 &=& (P^a_{bc} D^a_{bc} \otimes I_1) (W_a \otimes I_{bc}) \\
+T_2 &=& (P^b_c D^b_c \otimes I_a) (W_b \otimes I_{ac}) \\
+T_3 &=& (P^c_1 D^c_1 \otimes I_{ab}) (W_c \otimes I_{ab} )
+\end{eqnarray}
+%
+using the special cases $P^c_1 = D^c_1 = I_c$.
+%
+In general, we can write the factorization of $W_N$ for $N= f_1 f_2
+\dots f_{n_f}$ as,
+%
+\begin{equation}
+W_N = T_{n_f} \dots T_2 T_1
+\end{equation}
+%
+where the matrix factors $T_i$ are,
+%
+\begin{equation}
+T_i = (P^{f_i}_{q_i} D^{f_i}_{q_i} \otimes I_{p_{i-1}}) ( W_{f_i}
+\otimes I_{m_i})
+\end{equation}
+%
+We have defined the following three additional variables $p$, $q$ and
+$m$ to denote different partial products of the factors,
+%
+\begin{eqnarray}
+p_i &=& f_1 f_2 \dots f_i \quad (p_0 = 1) \\
+q_i &=& N / p_i \\
+m_i &=& N / f_i
+\end{eqnarray}
+%
+Note that the FFT modules $W$ are applied before the permutations $P$,
+which makes this a decimation-in-frequency algorithm.
+
+\subsection{Implementation}
+%
+Now to the implementation of the algorithm. We start with a vector of
+data, $z$, as input and want to apply the transform,
+%
+\begin{eqnarray}
+x &=& W_N z \\
+ &=& T_{n_f} \dots T_2 T_1 z
+\end{eqnarray}
+%
+where $T_i = (P^{f_i}_{q_i} D^{f_i}_{q_i} \otimes I_{p_{i-1}}) (
+W_{f_i} \otimes I_{m_i})$.
+
+The outer structure of the implementation will be a loop over the
+$n_f$ factors, applying each matrix $T_i$ to the vector in turn to
+build up the complete transform.
+%
+\begin{algorithm}
+\FOR{$(i = 1 \dots n_f)$}
+ \STATE{$v \Leftarrow T_i v $}
+\ENDFOR
+\end{algorithm}
+%
+The order of the factors is not important. Now we examine the iteration
+$v \Leftarrow T_i v$, which we'll write as,
+%
+\begin{equation}
+v' =
+(P^{f_i}_{q_i} D^{f_i}_{q_i} \otimes I_{p_{i-1}}) ~
+( W_{f_i} \otimes I_{m_i}) v
+\end{equation}
+%
+There are two Kronecker product matrices in this iteration. The
+rightmost matrix, which is the first to be applied, is a DFT of length
+$f_i$ applied to $N/f_i$ subsets of the data. We'll call this $t$,
+since it will be a temporary array,
+%
+\begin{equation}
+t = (W_{f_i} \otimes I_{m_i}) v
+\end{equation}
+%
+The second matrix applies a permutation and the exponential
+twiddle-factors. We'll call this $v'$, since it is the result of the
+full iteration on $v$,
+%
+\begin{equation}
+v' = (P^{f_i}_{q_i} D^{f_i}_{q_i} \otimes I_{p_{i-1}}) t
+\end{equation}
+
+The effect of the matrix $(W_{f_i} \otimes I_{m_i})$ is best seen by
+an example. Suppose the factor is $f_i = 3$, and the length of the FFT
+is $N=6$, then the relevant Kronecker product is,
+%
+\begin{equation}
+t = (W_3 \otimes I_2) v
+\end{equation}
+%
+which expands out to,
+%
+\begin{equation}
+\left(
+\begin{array}{c}
+t_0 \\
+t_1 \\
+t_2 \\
+t_3 \\
+t_4 \\
+t_5
+\end{array}
+\right)
+=
+\left(
+\begin{array}{cccccc}
+W_3(1,1) & 0 & W_3(1,2) & 0 & W_3(1,3) & 0 \\
+0 & W_3(1,1) & 0 & W_3(1,2) & 0 & W_3(1,3) \\
+W_3(2,1) & 0 & W_3(2,2) & 0 & W_3(2,3) & 0 \\
+0 & W_3(2,1) & 0 & W_3(2,2) & 0 & W_3(2,3) \\
+W_3(3,1) & 0 & W_3(3,2) & 0 & W_3(3,3) & 0 \\
+0 & W_3(3,1) & 0 & W_3(3,2) & 0 & W_3(3,3)
+\end{array}
+\right)
+\left(
+\begin{array}{c}
+v_0 \\
+v_1 \\
+v_2 \\
+v_3 \\
+v_4 \\
+v_5
+\end{array}
+\right)
+\end{equation}
+%
+We can rearrange the components in a computationally convenient form,
+\begin{equation}
+\left(
+\begin{array}{c}
+t_0 \\
+t_2 \\
+t_4 \\
+t_1 \\
+t_3 \\
+t_5
+\end{array}
+\right)
+=
+\left(
+\begin{array}{cccccc}
+W_3(1,1) & W_3(1,2) & W_3(1,3) & 0 & 0 & 0 \\
+W_3(2,1) & W_3(2,2) & W_3(2,3) & 0 & 0 & 0 \\
+W_3(3,1) & W_3(3,2) & W_3(3,3) & 0 & 0 & 0 \\
+0 & 0 & 0 & W_3(1,1) & W_3(1,2) & W_3(1,3) \\
+0 & 0 & 0 & W_3(2,1) & W_3(2,2) & W_3(2,3) \\
+0 & 0 & 0 & W_3(3,1) & W_3(3,2) & W_3(3,3)
+\end{array}
+\right)
+\left(
+\begin{array}{c}
+v_0 \\
+v_2 \\
+v_4 \\
+v_1 \\
+v_3 \\
+v_5
+\end{array}
+\right)
+\end{equation}
+%
+which clearly shows that we just need to apply the $3\times 3$ DFT
+matrix $W_3$ twice, once to the sub-vector of elements $(v_0, v_2, v_4)$,
+and independently to the remaining sub-vector $(v_1, v_3, v_5)$.
+
+In the general case, if we index $t$ as $t_k = t(\lambda,\mu) =
+t_{\lambda m + \mu}$ then $\lambda = 0 \dots f-1$ is an index within
+each transform of length $f$ and $\mu = 0 \dots m-1$ labels the
+independent subsets of data. We can see this by showing the
+calculation with all indices present,
+%
+\begin{equation}
+t = (W_f \otimes I_m) z
+\end{equation}
+%
+becomes,
+%
+\begin{eqnarray}
+t_{\lambda m + \mu} &=& \sum_{\lambda'=0}^{f-1} \sum_{\mu'=0}^{m-1}
+ (W_f \otimes I_m)_{(\lambda m + \mu)(\lambda' m + \mu')}
+ z_{\lambda'm + \mu} \\
+&=& \sum_{\lambda'\mu'} (W_f)_{\lambda\lambda'} \delta_{\mu\mu'}
+ z_{\lambda'm+\mu'} \\
+&=& \sum_{\lambda'} (W_f)_{\lambda\lambda'} z_{\lambda'm+\mu}
+\end{eqnarray}
+%
+The DFTs on the index $\lambda$ will be computed using
+special optimized modules for each $f$.
+
+To calculate the next stage,
+%
+\begin{equation}
+v'=(P^f_q D^f_q \otimes I_{p_{i-1}}) t
+\end{equation}
+%
+we note that the Kronecker product has the property of performing
+$p_{i-1}$ independent multiplications of $PD$ on $q_{i-1}$ different
+subsets of $t$. The index $\mu$ of $t(\lambda,\mu)$ which runs from 0
+to $m$ will include $q_i$ copies of each $PD$ operation because
+$m=p_{i-1}q$. i.e. we can split the index $\mu$ further into $\mu = a
+p_{i-1} + b$, where $a = 0 \dots q-1$ and $b=0 \dots p_{i-1}$,
+%
+\begin{eqnarray}
+\lambda m + \mu &=& \lambda m + a p_{i-1} + b \\
+ &=& (\lambda q + a) p_{i-1} + b.
+\end{eqnarray}
+%
+Now we can expand the second stage,
+%
+\begin{eqnarray}
+v'&=& (P^f_q D^f_q \otimes I_{p_{i-1}}) t \\
+v'_{\lambda m + \mu} &=& \sum_{\lambda' \mu'}
+ (P^f_q D^f_q \otimes I_{p_{i-1}})_{(\lambda m + \mu)(\lambda' m + \mu')}
+ t_{\lambda' m + \mu'} \\
+v'_{(\lambda q + a) p_{i-1} + b} &=& \sum_{\lambda' a' b'}
+(
+P^f_q D^f_q \otimes I_{p_{i-1}}
+)_{((\lambda q+ a)p_{i-1} + b)((\lambda' q+ a')p_{i-1} + b')}
+t_{(\lambda' q + a')p_{i-1} +b'}
+\end{eqnarray}
+%
+The first step in removing redundant indices is to take advantage of
+the identity matrix $I$ and separate the subspaces of the Kronecker
+product,
+%
+\begin{equation}
+(
+P^f_q D^f_q \otimes I_{p_{i-1}}
+)_{((\lambda q+ a)p_{i-1} + b)((\lambda' q+ a')p_{i-1} + b')}
+=
+(P^f_q D^f_q)_{(\lambda q + a)(\lambda' q + a')}
+\delta_{bb'}
+\end{equation}
+%
+This eliminates one sum, leaving us with,
+%
+\begin{equation}
+v'_{(\lambda q + a) p_{i-1} + b}
+=
+\sum_{\lambda' a' }
+(P^f_q D^f_q)_{(\lambda q + a)(\lambda' q + a')} t_{(\lambda'q+a')p_{i-1} + b}
+\end{equation}
+%
+We can insert the definition of $D^f_q$ to give,
+%
+\begin{equation}
+\phantom{v'_{(\lambda q + a) p_{i-1} + b}}
+= \sum_{\lambda'a'} (P^f_q)_{(\lambda q + a)(\lambda'q + a')}
+\omega^{\lambda'a'}_{q_{i-1}} t_{(\lambda'q+a')p_{i-1}+b}
+\end{equation}
+%
+Using the definition of $P^f_q$, which exchanges an index of $\lambda
+q + a$ with $a f + \lambda$, we get a final result with no matrix
+multiplication,
+%
+\begin{equation}
+v'_{(a f + \lambda) p_{i-1} + b}
+= \omega^{\lambda a}_{q_{i-1}} t_{(\lambda q + a)p_{i-1} + b}
+\end{equation}
+%
+All we have to do is premultiply each element of the temporary vector
+$t$ by an exponential twiddle factor and store the result in another
+index location, according to the digit reversal permutation of $P$.
+
+Here is the algorithm to implement the mixed-radix FFT,
+%
+\begin{algorithm}
+\FOR{$i = 1 \dots n_f$}
+\FOR{$a = 0 \dots q-1$}
+\FOR{$b = 0 \dots p_{i-1} - 1$}
+\FOR{$\lambda = 0 \dots f-1$}
+\STATE{$t_\lambda \Leftarrow
+ \sum_{\lambda'=0}^{f-1} W_f(\lambda,\lambda') v_{b+\lambda'm+ap_{i-1}}$}
+ \COMMENT{DFT matrix-multiply module}
+\ENDFOR
+\FOR{$\lambda = 0 \dots f-1$}
+\STATE{$v'_{(af+\lambda)p_{i-1}+b}
+ \Leftarrow \omega^{\lambda a}_{q_{i-1}} t_\lambda$}
+\ENDFOR
+\ENDFOR
+\ENDFOR
+\STATE{$v \Leftarrow v'$}
+\ENDFOR
+\end{algorithm}
+%
+\subsection{Details of the implementation}
+%
+First the function {\tt gsl\_fft\_complex\_wavetable\_alloc} allocates
+$n$ elements of scratch space (to hold the vector $v'$ for each
+iteration) and $n$ elements for a trigonometric lookup table of
+twiddle factors.
+
+Then the length $n$ must be factorized. There is a general
+factorization function {\tt gsl\_fft\_factorize} which takes a list of
+preferred factors. It first factors out the preferred factors and then
+removes general remaining prime factors.
+
+The algorithm used to generate the trigonometric lookup table is
+%
+\begin{algorithm}
+\FOR {$a = 1 \dots n_f$}
+\FOR {$b = 1 \dots f_i - 1$}
+\FOR {$c = 1 \dots q_i$}
+\STATE $\mbox{trig[k++]} = \exp(- 2\pi i b c p_{a-1}/N)$
+\ENDFOR
+\ENDFOR
+\ENDFOR
+\end{algorithm}
+%
+Note that $\sum_{1}^{n_f} \sum_{0}^{f_i-1} \sum_{1}^{q_i} =
+\sum_{1}^{n_f} (f_i-1)q_i = n - 1$ so $n$ elements are always
+sufficient to store the lookup table. This is chosen because we need
+to compute $\omega_{q_i-1}^{\lambda a} t_\lambda$ in
+the FFT. In terms of the lookup table we can write this as,
+%
+\begin{eqnarray}
+\omega_{q_{i-1}}^{\lambda a} t_\lambda
+&=& \exp(-2\pi i \lambda a/q_{i-1}) t_\lambda \\
+&=& \exp(-2\pi i \lambda a p_{i-1}/N) t_\lambda \\
+&=& \left\{
+ \begin{array}{ll}
+ t_\lambda & a=0 \\
+ \mbox{trig}[\mbox{twiddle[i]}+\lambda q+(a-1)] t_\lambda & a\not=0
+\end{array}
+\right.
+\end{eqnarray}
+%
+\begin{sloppypar}
+\noindent
+The array {\tt twiddle[i]} maintains a set of pointers into {\tt trig}
+for the starting points for the outer loop. The core of the
+implementation is {\tt gsl\_fft\_complex}. This function loops over
+the chosen factors of $N$, computing the iteration $v'=T_i v$ for each
+pass. When the DFT for a factor is implemented the iteration is
+handed-off to a dedicated small-$N$ module, such as {\tt
+gsl\_fft\_complex\_pass\_3} or {\tt
+gsl\_fft\_complex\_pass\_5}. Unimplemented factors are handled
+by the general-$N$ routine {\tt gsl\_fft\_complex\_pass\_n}. The
+structure of one of the small-$N$ modules is a simple transcription of
+the basic algorithm given above. Here is an example for {\tt
+gsl\_fft\_complex\_pass\_3}. For a pass with a factor of 3 we have to
+calculate the following expression,
+\end{sloppypar}%
+\begin{equation}
+v'_{(a f + \lambda) p_{i-1} + b}
+=
+\sum_{\lambda' = 0,1,2}
+\omega^{\lambda a}_{q_{i-1}} W^{\lambda \lambda'}_{3}
+v_{b + \lambda' m + a p_{i-1}}
+\end{equation}
+%
+for $b = 0 \dots p_{i-1} - 1$, $a = 0 \dots q_{i} - 1$ and $\lambda =
+0, 1, 2$. This is implemented as,
+%
+\begin{algorithm}
+\FOR {$a = 0 \dots q-1$}
+\FOR {$b = 0 \dots p_{i-1} - 1$}
+\STATE {$
+ \left(
+ \begin{array}{c}
+ t_0 \\ t_1 \\ t_2
+ \end{array}
+ \right)
+ =
+ \left(
+ \begin{array}{ccc}
+ W^{0}_3 & W^{0}_3 & W^{0}_3 \\
+ W^{0}_3 & W^{1}_3 & W^{2}_3 \\
+ W^{0}_3 & W^{2}_3 & W^{4}_3
+ \end{array}
+ \right)
+ \left(
+ \begin{array}{l}
+ v_{b + a p_{i-1}} \\
+ v_{b + a p_{i-1} + m} \\
+ v_{b + a p_{i-1} +2m}
+ \end{array}
+ \right)$}
+ \STATE {$ v'_{a p_{i} + b} = t_0$}
+ \STATE {$ v'_{a p_{i} + b + p_{i-1}} = \omega^{a}_{q_{i-1}} t_1$}
+ \STATE {$ v'_{a p_{i} + b + 2 p_{i-1}} = \omega^{2a}_{q_{i-1}} t_2$}
+\ENDFOR
+\ENDFOR
+\end{algorithm}
+%
+In the code we use the variables {\tt from0}, {\tt from1}, {\tt from2}
+to index the input locations,
+%
+\begin{eqnarray}
+\mbox{\tt from0} &=& b + a p_{i-1} \\
+\mbox{\tt from1} &=& b + a p_{i-1} + m \\
+\mbox{\tt from2} &=& b + a p_{i-1} + 2m
+\end{eqnarray}
+%
+and the variables {\tt to0}, {\tt to1}, {\tt to2} to index the output
+locations in the scratch vector $v'$,
+%
+\begin{eqnarray}
+\mbox{\tt to0} &=& b + a p_{i} \\
+\mbox{\tt to1} &=& b + a p_{i} + p_{i-1} \\
+\mbox{\tt to2} &=& b + a p_{i} + 2 p_{i-1}
+\end{eqnarray}
+%
+The DFT matrix multiplication is computed using the optimized
+sub-transform modules given in the next section. The twiddle factors
+$\omega^a_{q_{i-1}}$ are taken out of the {\tt trig} array.
+
+To compute the inverse transform we go back to the definition of the
+fourier transform and note that the inverse matrix is just the complex
+conjugate of the forward matrix (with a factor of $1/N$),
+%
+\begin{equation}
+W^{-1}_N = W^*_N / N
+\end{equation}
+%
+Therefore we can easily compute the inverse transform by conjugating
+all the complex elements of the DFT matrices and twiddle factors that
+we apply. (An alternative strategy is to conjugate the input data,
+take a forward transform, and then conjugate the output data).
+
+\section{Fast Sub-transform Modules}
+%
+To implement the mixed-radix FFT we still need to compute the
+small-$N$ DFTs for each factor. Fortunately many highly-optimized
+small-$N$ modules are available, following the work of Winograd who
+showed how to derive efficient small-$N$ sub-transforms by number
+theoretic techniques.
+
+The algorithms in this section all compute,
+%
+\begin{equation}
+x_a = \sum_{b=0}^{N-1} W_N^{ab} z_b
+\end{equation}
+%
+The sub-transforms given here are the ones recommended by Temperton
+and differ slightly from the canonical Winograd modules. According to
+Temperton~\cite{temperton83} they are slightly more robust against
+rounding errors and trade off some additions for multiplications.
+%
+For the $N=2$ DFT,
+%
+\begin{equation}
+\begin{array}{ll}
+x_0 = z_0 + z_1, &
+x_1 = z_0 - z_1.
+\end{array}
+\end{equation}
+%
+For the $N=3$ DFT,
+%
+\begin{equation}
+\begin{array}{lll}
+t_1 = z_1 + z_2, &
+t_2 = z_0 - t_1/2, &
+t_3 = \sin(\pi/3) (z_1 - z_2),
+\end{array}
+\end{equation}
+\begin{equation}
+\begin{array}{lll}
+x_0 = z_0 + t_1, &
+x_1 = t_2 + i t_3, &
+x_2 = t_2 - i t_3.
+\end{array}
+\end{equation}
+%
+The $N=4$ transform involves only additions and subtractions,
+%
+\begin{equation}
+\begin{array}{llll}
+t_1 = z_0 + z_2, &
+t_2 = z_1 + z_3, &
+t_3 = z_0 - z_2, &
+t_4 = z_1 - z_3,
+\end{array}
+\end{equation}
+\begin{equation}
+\begin{array}{llll}
+x_0 = t_1 + t_2, &
+x_1 = t_3 + i t_4, &
+x_2 = t_1 - t_2, &
+x_3 = t_3 - i t_4.
+\end{array}
+\end{equation}
+%
+For the $N=5$ DFT,
+%
+\begin{equation}
+\begin{array}{llll}
+t_1 = z_1 + z_4, &
+t_2 = z_2 + z_3, &
+t_3 = z_1 - z_4, &
+t_4 = z_2 - z_3,
+\end{array}
+\end{equation}
+\begin{equation}
+\begin{array}{llll}
+t_5 = t_1 + t_2, &
+t_6 = (\sqrt{5}/4) (t_1 - t_2), &
+t_7 = z_0 - t_5/4, \\
+\end{array}
+\end{equation}
+\begin{equation}
+\begin{array}{llll}
+t_8 = t_7 + t_6, &
+t_9 = t_7 - t_6, \\
+\end{array}
+\end{equation}
+\begin{equation}
+\begin{array}{llll}
+t_{10} = \sin(2\pi/5) t_3 + \sin(2\pi/10) t_4, &
+t_{11} = \sin(2\pi/10) t_3 - \sin(2\pi/5) t_4,
+\end{array}
+\end{equation}
+\begin{equation}
+\begin{array}{llll}
+x_0 = z_0 + t_5,
+\end{array}
+\end{equation}
+\begin{equation}
+\begin{array}{llll}
+x_1 = t_8 + i t_{10}, &
+x_2 = t_9 + i t_{11},
+\end{array}
+\end{equation}
+\begin{equation}
+\begin{array}{llll}
+x_3 = t_9 - i t_{11}, &
+x_4 = t_8 - i t_{10}.
+\end{array}
+\end{equation}
+%
+The DFT matrix for $N=6$ can be written as a combination of $N=3$ and
+$N=2$ transforms with index permutations,
+%
+\begin{equation}
+\left(
+\begin{array}{c}
+x_0 \\
+x_4 \\
+x_2 \\
+\hline x_3 \\
+x_1 \\
+x_5
+\end{array}
+\right)
+=
+\left(
+\begin{array}{ccc|ccc}
+ & & & & & \\
+ &W_3& & &W_3& \\
+ & & & & & \\
+\hline & & & & & \\
+ &W_3& & &-W_3& \\
+ & & & & &
+\end{array}
+\right)
+\left(
+\begin{array}{c}
+z_0 \\
+z_2 \\
+z_4 \\
+\hline z_3 \\
+z_5 \\
+z_1
+\end{array}
+\right)
+\end{equation}
+%
+This simplification is an example of the Prime Factor Algorithm, which
+can be used because the factors 2 and 3 are mutually prime. For more
+details consult one of the books on number theory for
+FFTs~\cite{elliott82,blahut}. We can take advantage of the simple
+indexing scheme of the PFA to write the $N=6$ DFT as,
+%
+\begin{equation}
+\begin{array}{lll}
+t_1 = z_2 + z_4, &
+t_2 = z_0 - t_1/2, &
+t_3 = \sin(\pi/3) (z_2 - z_4),
+\end{array}
+\end{equation}
+\begin{equation}
+\begin{array}{lll}
+t_4 = z_5 + z_1, &
+t_5 = z_3 - t_4/2, &
+t_6 = \sin(\pi/3) (z_5 - z_1),
+\end{array}
+\end{equation}
+\begin{equation}
+\begin{array}{lll}
+t_7 = z_0 + t_1, &
+t_8 = t_2 + i t_3, &
+t_9 = t_2 - i t_3,
+\end{array}
+\end{equation}
+\begin{equation}
+\begin{array}{lll}
+t_{10} = z_3 + t_4, &
+t_{11} = t_5 + i t_6, &
+t_{12} = t_5 - i t_6,
+\end{array}
+\end{equation}
+\begin{equation}
+\begin{array}{lll}
+x_0 = t_7 + t_{10}, &
+x_4 = t_8 + t_{11}, &
+x_2 = t_9 + t_{12},
+\end{array}
+\end{equation}
+\begin{equation}
+\begin{array}{lll}
+x_3 = t_7 - t_{10}, &
+x_1 = t_8 - t_{11}, &
+x_5 = t_9 - t_{12}.
+\end{array}
+\end{equation}
+
+For any remaining general factors we use Singleton's efficient method
+for computing a DFT~\cite{singleton}. Although it is an $O(N^2)$
+algorithm it does reduce the number of multiplications by a factor of
+4 compared with a naive evaluation of the DFT. If we look at the
+general stucture of a DFT matrix, shown schematically below,
+%
+\begin{equation}
+\left(
+\begin{array}{c}
+h_0 \\
+h_1 \\
+h_2 \\
+\vdots \\
+h_{N-2} \\
+h_{N-1}
+\end{array}
+\right)
+=
+\left(
+\begin{array}{cccccc}
+1 & 1 & 1 & \cdots & 1 & 1 \\
+1 & W & W & \cdots & W & W \\
+1 & W & W & \cdots & W & W \\
+\vdots & \vdots & \vdots & \cdots & \vdots & \vdots \\
+1 & W & W & \cdots & W & W \\
+1 & W & W & \cdots & W & W
+\end{array}
+\right)
+\left(
+\begin{array}{c}
+g_0 \\
+g_1 \\
+g_2 \\
+\vdots \\
+g_{N-2} \\
+g_{N-1}
+\end{array}
+\right)
+\end{equation}
+%
+we see that the outer elements of the DFT matrix are all unity. We can
+remove these trivial multiplications but we will still be left with an
+$(N-1) \times (N-1)$ sub-matrix of complex entries, which would appear
+to require $(N-1)^2$ complex multiplications. Singleton's method,
+uses symmetries of the DFT matrix to convert the complex
+multiplications to an equivalent number of real multiplications. We
+start with the definition of the DFT in component form,
+%
+\begin{equation}
+a_k + i b_k = \sum_{j=0} (x_j+iy_j)(\cos(2\pi jk/f) - i\sin(2\pi jk/f))
+\end{equation}
+%
+The zeroth component can be computed using only additions,
+%
+\begin{equation}
+a_0 + i b_0 = \sum_{j=0}^{(f-1)} x_j + i y_j
+\end{equation}
+%
+We can rewrite the remaining components as,
+%
+\begin{eqnarray}
+a_k + i b_k & = x_0 + i y_0 & +
+ \sum_{j=1}^{(f-1)/2} (x_j + x_{f-j}) \cos(2\pi jk/f)
+ + (y_j - y_{f-j}) \sin(2\pi jk/f) \\
+& & + i\sum_{j=1}^{(f-1)/2} (y_j + y_{f-j}) \cos(2\pi jk/f)
+ - (x_j - x_{f-j}) \sin(2\pi jk/f)
+\end{eqnarray}
+%
+by using the following trigonometric identities,
+%
+\begin{eqnarray}
+ \cos(2\pi(f-j)k/f) &=& \phantom{-}\cos(2\pi jk/f) \\
+ \sin(2\pi(f-j)k/f) &=& -\sin(2\pi jk/f)
+\end{eqnarray}
+%
+These remaining components can all be computed using four partial
+sums,
+%
+\begin{eqnarray}
+a_k + i b_k & = & (a^+_k - a^-_k) + i (b^+_k + b^-_k) \\
+a_{f-k} + i b_{f-k} & = & (a^+_k + a^-_k) + i (b^+_k - b^-_k)
+\end{eqnarray}
+%
+for $k = 1, 2, \dots, (f-1)/2$, where,
+%
+\begin{eqnarray}
+a^+_k &=& x_0 + \sum_{j=1}^{(f-1)/2} (x_j + x_{f-j}) \cos(2\pi jk/f) \\
+a^-_k &=& \phantom{x_0} - \sum_{j=1}^{(f-1)/2} (y_j - y_{f-j}) \sin(2\pi jk/f) \\
+b^+_k &=& y_0 + \sum_{j=1}^{(f-1)/2} (y_j + y_{f-j}) \cos(2\pi jk/f) \\
+b^-_k &=& \phantom{y_0} - \sum_{j=1}^{(f-1)/2} (x_j - x_{f-j}) \sin(2\pi jk/f)
+\end{eqnarray}
+%
+Note that the higher components $k'=f-k$ can be obtained directly
+without further computation once $a^+$, $a^-$, $b^+$ and $b^-$ are
+known. There are $4 \times (f-1)/2$ different sums, each involving
+$(f-1)/2$ real multiplications, giving a total of $(f-1)^2$ real
+multiplications instead of $(f-1)^2$ complex multiplications.
+
+To implement Singleton's method we make use of the input and output
+vectors $v$ and $v'$ as scratch space, copying data back and forth
+between them to obtain the final result. First we use $v'$ to store
+the terms of the symmetrized and anti-symmetrized vectors of the form
+$x_j + x_{f-j}$ and $x_j - y_{f-j}$. Then we multiply these by the
+appropriate trigonometric factors to compute the partial sums $a^+$,
+$a^-$, $b^+$ and $b^-$, storing the results $a_k + i b_k$ and $a_{f-k}
++ i b_{f-k}$ back in $v$. Finally we multiply the DFT output by any
+necessary twiddle factors and place the results in $v'$.
+
+\section{FFTs for real data}
+%
+This section is based on the articles {\em Fast Mixed-Radix Real
+ Fourier Transforms} by Clive Temperton~\cite{temperton83real} and
+{\em Real-Valued Fast Fourier Transform Algorithms} by Sorensen,
+Jones, Heideman and Burrus~\cite{burrus87real}. The DFT of a real
+sequence has a special symmetry, called a {\em conjugate-complex} or
+{\em half-complex} symmetry,
+%
+\begin{equation}
+h(a) = h(N-a)^*
+\end{equation}
+%
+The element $h(0)$ is real, and when $N$ is even $h(N/2)$ is also
+real. It is straightforward to prove the symmetry,
+%
+\begin{eqnarray}
+h(a) &=& \sum W^{ab}_N g(b) \\
+h(N-a)^* &=& \sum W^{-(N-a)b}_N g(b)^* \\
+ &=& \sum W^{-Nb}_N W^{ab}_N g(b) \qquad{(W^N_N=1)} \\
+ &=& \sum W^{ab}_N g(b)
+\end{eqnarray}
+%
+Real-valued data is very common in practice (perhaps more common that
+complex data) so it is worth having efficient FFT routines for real
+data. In principle an FFT for real data should need half the
+operations of an FFT on the equivalent complex data (where the
+imaginary parts are set to zero). There are two different strategies
+for computing FFTs of real-valued data:
+
+One strategy is to ``pack'' the real data (of length $N$) into a
+complex array (of length $N/2$) by index transformations. A complex
+FFT routine can then be used to compute the transform of that array.
+By further index transformations the result can actually by
+``unpacked'' to the FFT of the original real data. It is also possible
+to do two real FFTs simultaneously by packing one in the real part and
+the other in the imaginary part of the complex array. These
+techniques have some disadvantages. The packing and unpacking
+procedures always add $O(N)$ operations, and packing a real array of
+length $N$ into a complex array of length $N/2$ is only possible if
+$N$ is even. In addition, if two unconnected datasets with very
+different magnitudes are packed together in the same FFT there could
+be ``cross-talk'' between them due to a loss of precision.
+
+A more straightforward strategy is to start with an FFT algorithm,
+such as the complex mixed-radix algorithm, and prune out all the
+operations involving the zero imaginary parts of the initial data. The
+FFT is linear so the imaginary part of the data can be decoupled from
+the real part. This procedure leads to a dedicated FFT for real-valued
+data which works for any length and does not perform any unnecessary
+operations. It also allows us to derive a corresponding inverse FFT
+routine which transforms a half-complex sequence back into real data.
+
+\subsection{Radix-2 FFTs for real data}
+%
+Before embarking on the full mixed-radix real FFT we'll start with the
+radix-2 case. It contains all the essential features of the
+general-$N$ algorithm. To make it easier to see the analogy between
+the two we will use the mixed-radix notation to describe the
+factors. The factors are all 2,
+%
+\begin{equation}
+f_1 = 2, f_2 = 2, \dots, f_{n_f} = 2
+\end{equation}
+%
+and the products $p_i$ are powers of 2,
+%
+\begin{eqnarray}
+p_0 & = & 1 \\
+p_1 & = & f_1 = 2 \\
+p_2 & = & f_1 f_2 = 4 \\
+\dots &=& \dots \\
+p_i & = & f_1 f_2 \dots f_i = 2^i
+\end{eqnarray}
+%
+Using this notation we can rewrite the radix-2 decimation-in-time
+algorithm as,
+%
+\begin{algorithm}
+\STATE bit-reverse ordering of $g$
+\FOR {$i = 1 \dots n$}
+ \FOR {$a = 0 \dots p_{i-1} - 1$}
+ \FOR{$b = 0 \dots q_i - 1$}
+ \STATE{$
+ \left(
+ \begin{array}{c}
+ g(b p_i + a) \\
+ g(b p_i + p_{i-1} + a)
+ \end{array}
+ \right)
+ =
+ \left(
+ \begin{array}{c}
+ g(b p_i + a) + W^a_{p_i} g(b p_i + p_{i-1} + a) \\
+ g(b p_i + a) - W^a_{p_i} g(b p_i + p_{i-1} + a)
+ \end{array}
+ \right) $}
+ \ENDFOR
+ \ENDFOR
+\ENDFOR
+\end{algorithm}
+%
+where we have used $p_i = 2 \Delta$, and factored $2 \Delta$ out of
+the original definition of $b$ ($b \to b p_i$).
+
+If we go back to the original recurrence relations we can see how to
+write the intermediate results in a way which make the
+real/half-complex symmetries explicit at each step. The first pass is
+just a set of FFTs of length-2 on real values,
+%
+\begin{equation}
+g_1([b_0 b_1 b_2 a_0]) = \sum_{b_3} W^{a_0 b_3}_2 g([b_0 b_1 b_2 b_3])
+\end{equation}
+%
+Using the symmetry $FFT(x)_k = FFT(x)^*_{N-k}$ we have the reality
+condition,
+%
+\begin{eqnarray}
+g_1([b_0 b_1 b_2 0]) &=& \mbox{real} \\
+g_1([b_0 b_1 b_2 1]) &=& \mbox{real'}
+\end{eqnarray}
+%
+In the next pass we have a set of length-4 FFTs on the original data,
+%
+\begin{eqnarray}
+g_2([b_0 b_1 b_1 a_0])
+&=&
+\sum_{b_2}\sum_{b_3}
+W^{[a_1 a_0]b_2}_4 W^{a_0 b_3}_2
+g([b_0 b_1 b_2 b_3]) \\
+&=&
+\sum_{b_2}\sum_{b_3}
+W^{[a_1 a_0][b_3 b_2]}_4
+g([b_0 b_1 b_2 b_3])
+\end{eqnarray}
+%
+This time symmetry gives us the following conditions on the
+transformed data,
+%
+\begin{eqnarray}
+g_2([b_0 b_1 0 0]) &=& \mbox{real} \\
+g_2([b_0 b_1 0 1]) &=& x + i y \\
+g_2([b_0 b_1 1 0]) &=& \mbox{real'} \\
+g_2([b_0 b_1 1 1]) &=& x - i y
+\end{eqnarray}
+%
+We can see a pattern emerging here: the $i$-th pass computes a set of
+independent length-$2^i$ FFTs on the original real data,
+%
+\begin{eqnarray}
+g_i ( b p_i + a ) = \sum_{a' = 0}^{p_i-1} W_{p_i}^{aa'} g(b p_i + a')
+\quad
+\mbox{for $b = 0 \dots q_i - 1$}
+\end{eqnarray}
+%
+As a consequence the we can apply the symmetry for an FFT of real data
+to all the intermediate results -- not just the final result.
+In general after the $i$-th pass we will
+have the symmetry,
+%
+\begin{eqnarray}
+g_i(b p_i) &=& \mbox{real} \\
+g_i(b p_i + a) &=& g_i(b p_i + p_i - a)^* \qquad a = 1 \dots p_{i}/2 - 1 \\
+g_i(b p_i + p_{i}/2) &=& \mbox{real'}
+\end{eqnarray}
+%
+In the next section we'll show that this is a general property of
+decimation-in-time algorithms. The same is not true for the
+decimation-in-frequency algorithm, which does not have any simple
+symmetries in the intermediate results.
+
+Since we can obtain the values of $g_i(b p_i + a)$ for $a > p_i/2$
+from the values for $a < p_i/2$ we can cut our computation and
+storage in half compared with the full-complex case.
+%
+We can easily rewrite the algorithm to show how the computation can be
+halved, simply by limiting all terms to involve only values for $a
+\leq p_{i}/2$. Whenever we encounter a term $g_i(b p_i + a)$ with $a >
+p_{i}/2$ we rewrite it in terms of its complex symmetry partner,
+$g_i(b p_i + a')^*$, where $a' = p_i - a$. The butterfly computes two
+values for each value of $a$, $b p_i + a$ and $b p_i + p_{i-1} - a$,
+so we actually only need to compute from $a = 0$ to $p_{i-1}/2$. This
+gives the following algorithm,
+%
+\begin{algorithm}
+\FOR {$a = 0 \dots p_{i-1}/2$}
+ \FOR{$b = 0 \dots q_i - 1$}
+ \STATE{$
+ \left(
+ \begin{array}{c}
+ g(b p_i + a) \\
+ g(b p_i + p_{i-1} - a)^*
+ \end{array}
+ \right)
+ =
+ \left(
+ \begin{array}{c}
+ g(b p_{i} + a) + W^a_{p_i} g(b p_i + p_{i-1} + a) \\
+ g(b p_{i} + a) - W^a_{p_i} g(b p_i + p_{i-1} + a)
+ \end{array}
+ \right) $}
+ \ENDFOR
+ \ENDFOR
+\end{algorithm}
+%
+Although we have halved the number of operations we also need a
+storage arrangement which will halve the memory requirement. The
+algorithm above is still formulated in terms of a complex array $g$,
+but the input to our routine will naturally be an array of $N$ real
+values which we want to use in-place.
+
+Therefore we need a storage scheme which lays out the real and
+imaginary parts within the real array, in a natural way so that there
+is no need for complicated index calculations. In the radix-2
+algorithm we do not have any additional scratch space. The storage
+scheme has to be designed to accommodate the in-place calculation
+taking account of dual node pairs.
+
+Here is a scheme which takes these restrictions into account: On the
+$i$-th pass we store the real part of $g(b p_i + a)$ in location $b
+p_i + a$. We store the imaginary part in location $b p_i + p_i -
+a$. This is the redundant location which corresponds to the conjugate
+term $g(b p_i + a)^* = g(b p_i + p_i -a)$, so it is not needed. When
+the results are purely real (as in the case $a = 0$ and $a = p_i/2$ we
+store only the real part and drop the zero imaginary part).
+
+This storage scheme has to work in-place, because the radix-2 routines
+should not use any scratch space. We will now check the in-place
+property for each butterfly. A crucial point is that the scheme is
+pass-dependent. Namely, when we are computing the result for pass $i$
+we are reading the results of pass $i-1$, and we must access them
+using the scheme from the previous pass, i.e. we have to remember that
+the results from the previous pass were stored using $b p_{i-1} + a$,
+not $b p_i + a$, and the symmetry for these results will be $g_{i-1}(b
+p_{i-1} + a) = g_{i-1}(b p_{i-1} + p_{i-1} - a)^*$. To take this into
+account we'll write the right hand side of the iteration, $g_{i-1}$,
+in terms of $p_{i-1}$. For example, instead of $b p_i$, which occurs
+naturally in $g_i(b p_i + a)$ we will use $2 b p_{i-1}$, since $p_i =
+2 p_{i-1}$.
+
+Let's start with the butterfly for $a = 0$,
+%
+\begin{equation}
+\left(
+\begin{array}{c}
+g(b p_i) \\
+g(b p_i + p_{i-1})^*
+\end{array}
+\right)
+=
+\left(
+\begin{array}{c}
+g(2 b p_{i-1}) + g((2 b + 1) p_{i-1}) \\
+g(2 b p_{i-1}) - g((2 b + 1) p_{i-1})
+\end{array}
+\right)
+\end{equation}
+%
+By the symmetry $g_{i-1}(b p_{i-1} + a) = g_{i-1}(b p_{i-1} + p_{i-1}
+- a)^*$ all the inputs are purely real. The input $g(2 b p_{i-1})$ is
+read from location $2 b p_{i-1}$ and $g((2 b + 1) p_{i-1})$ is read
+from the location $(2 b + 1) p_{i-1}$. Here is the full breakdown,
+%
+\begin{center}
+\renewcommand{\arraystretch}{1.5}
+\begin{tabular}{|l|lll|}
+\hline Term & & Location & \\
+\hline
+$g(2 b p_{i-1})$
+ & real part & $2 b p_{i-1} $ &$= b p_i$ \\
+ & imag part & --- & \\
+$g((2 b+1) p_{i-1})$
+ & real part & $(2 b + 1) p_{i-1} $&$= b p_i + p_{i-1} $ \\
+ & imag part & --- & \\
+\hline
+$g(b p_{i})$
+ & real part & $b p_i$ &\\
+ & imag part & --- & \\
+$g(b p_{i} + p_{i-1})$
+ & real part & $b p_i + p_{i-1}$& \\
+ & imag part & --- & \\
+\hline
+\end{tabular}
+\end{center}
+%
+The conjugation of the output term $g(b p_i + p_{i-1})^*$ is
+irrelevant here since the results are purely real. The real results
+are stored in locations $b p_i$ and $b p_i + p_{i-1}$, which
+overwrites the inputs in-place.
+
+The general butterfly for $a = 1 \dots p_{i-1}/2 - 1$ is,
+%
+\begin{equation}
+\left(
+\begin{array}{c}
+g(b p_i + a) \\
+g(b p_i + p_{i-1} - a)^*
+\end{array}
+\right)
+=
+\left(
+\begin{array}{c}
+g(2 b p_{i-1} + a) + W^a_{p_i} g((2 b + 1) p_{i-1} + a) \\
+g(2 b p_{i-1} + a) - W^a_{p_i} g((2 b + 1) p_{i-1} + a)
+\end{array}
+\right)
+\end{equation}
+%
+All the terms are complex. To store a conjugated term like $g(b' p_i +
+a')^*$ where $a > p_i/2$ we take the real part and store it in
+location $b' p_i + a'$ and then take imaginary part, negate it, and
+store the result in location $b' p_i + p_i - a'$.
+
+Here is the full breakdown of the inputs and outputs from the
+butterfly,
+%
+\begin{center}
+\renewcommand{\arraystretch}{1.5}
+\begin{tabular}{|l|lll|}
+\hline Term & & Location & \\
+\hline
+$g(2 b p_{i-1} + a)$
+ & real part & $2 b p_{i-1} + a $ &$= b p_i + a$ \\
+ & imag part & $2 b p_{i-1} + p_{i-1} - a$ &$= b p_i + p_{i-1} - a$ \\
+$g((2 b+1) p_{i-1} + a)$
+ & real part & $(2 b+1) p_{i-1} + a $&$= b p_i + p_{i-1} + a $ \\
+ & imag part & $(2 b+1) p_{i-1} + p_{i-1} - a $&$= b p_i + p_i - a$\\
+\hline
+$g(b p_{i} + a)$
+ & real part & $b p_i + a$ &\\
+ & imag part & $b p_i + p_i - a$& \\
+$g(b p_{i} + p_{i-1} - a)$
+ & real part & $b p_i + p_{i-1} - a$& \\
+ & imag part & $b p_i + p_{i-1} + a$& \\
+\hline
+\end{tabular}
+\end{center}
+%
+By comparing the input locations and output locations we can see
+that the calculation is done in place.
+
+The final butterfly for $a = p_{i-1}/2$ is,
+%
+\begin{equation}
+\left(
+\begin{array}{c}
+g(b p_i + p_{i-1}/2) \\
+g(b p_i + p_{i-1} - p_{i-1}/2)^*
+\end{array}
+\right)
+=
+\left(
+\begin{array}{c}
+g(2 b p_{i-1} + p_{i-1}/2) - i g((2 b + 1) p_{i-1} + p_{i-1}/2) \\
+g(2 b p_{i-1} + p_{i-1}/2) + i g((2 b + 1) p_{i-1} + p_{i-1}/2)
+\end{array}
+\right)
+\end{equation}
+%
+where we have substituted for the twiddle factor, $W^a_{p_i} = -i$,
+%
+\begin{eqnarray}
+W^{p_{i-1}/2}_{p_i} &=& \exp(-2\pi i p_{i-1}/2 p_i) \\
+ &=& \exp(-2\pi i /4) \\
+ &=& -i
+\end{eqnarray}
+%
+For this butterfly the second line is just the conjugate of the first,
+because $p_{i-1} - p_{i-1}/2 = p_{i-1}/2$. Therefore we only need to
+consider the first line. The breakdown of the inputs and outputs is,
+%
+\begin{center}
+\renewcommand{\arraystretch}{1.5}
+\begin{tabular}{|l|lll|}
+\hline Term & & Location & \\
+\hline
+$g(2 b p_{i-1} + p_{i-1}/2)$
+ & real part & $2 b p_{i-1} + p_{i-1}/2 $ &$= b p_i + p_{i-1}/2$ \\
+ & imag part & --- & \\
+$g((2 b + 1) p_{i-1} + p_{i-1}/2)$
+ & real part & $(2 b + 1) p_{i-1} + p_{i-1}/2 $&$= b p_i + p_{i} - p_{i-1}/2 $ \\
+ & imag part & --- & \\
+\hline
+$g(b p_{i} + p_{i-1}/2)$
+ & real part & $b p_i + p_{i-1}/2$ &\\
+ & imag part & $b p_i + p_i - p_{i-1}/2$& \\
+\hline
+\end{tabular}
+\end{center}
+%
+By comparing the locations of the inputs and outputs with the
+operations in the butterfly we find that this computation is very
+simple: the effect of the butterfly is to negate the location $b p_i +
+p_i - p_{i-1}/2$ and leave other locations unchanged. This is clearly
+an in-place operation.
+
+Here is the radix-2 algorithm for real data, in full, with the cases
+of $a=0$, $a=1\dots p_{i-1}/2 - 1$ and $a = p_{i-1}/2$ in separate
+blocks,
+%
+\begin{algorithm}
+\STATE bit-reverse ordering of $g$
+\FOR {$i = 1 \dots n$}
+ \FOR{$b = 0 \dots q_i - 1$}
+ \STATE{$\left(
+ \begin{array}{c}
+ g(b p_i) \\
+ g(b p_i + p_{i-1})
+ \end{array}
+ \right)
+ \Leftarrow
+ \left(
+ \begin{array}{c}
+ g(b p_{i}) + g(b p_{i} + p_{i-1}) \\
+ g(b p_{i}) - g(b p_{i} + p_{i-1})
+ \end{array}
+ \right)$}
+ \ENDFOR
+
+ \FOR {$a = 1 \dots p_{i-1}/2 - 1$}
+ \FOR{$b = 0 \dots q_i - 1$}
+ \STATE{$(\Real z_0, \Imag z_0) \Leftarrow
+ (g(b p_i + a), g(b p_i + p_{i-1} - a))$}
+ \STATE{$(\Real z_1, \Imag z_1) \Leftarrow
+ (g(b p_i + p_{i-1} + a), g(b p_i + p_{i} - a))$}
+ \STATE{$t_0 \Leftarrow z_0 + W^a_{p_i} z_1$}
+ \STATE{$t_1 \Leftarrow z_0 - W^a_{p_i} z_1$}
+ \STATE{$(g(b p_{i} + a),g(b p_{i} + p_i - a) \Leftarrow
+ (\Real t_0, \Imag t_0)$}
+ \STATE{$(g(b p_{i} + p_{i-1} - a), g(b p_{i} + p_{i-1} + a))
+ \Leftarrow
+ (\Real t_1, -\Imag t_1)$}
+ \ENDFOR
+ \ENDFOR
+
+ \FOR{$b = 0 \dots q_i - 1$}
+ \STATE{$g(b p_{i} - p_{i-1}/2) \Leftarrow -g(b p_{i} - p_{i-1}/2)$}
+ \ENDFOR
+
+\ENDFOR
+\end{algorithm}
+%
+We split the loop over $a$ into three parts, $a=0$, $a=1\dots
+p_{i-1}/2-1$ and $a = p_{i-1}/2$ for efficiency. When $a=0$ we have
+$W^a_{p_i}=1$ so we can eliminate a complex multiplication within the
+loop over $b$. When $a=p_{i-1}/2$ we have $W^a_{p_i} = -i$ which does
+not require a full complex multiplication either.
+
+
+\subsubsection{Calculating the Inverse}
+%
+The inverse FFT of complex data was easy to calculate, simply by
+taking the complex conjugate of the DFT matrix. The input data and
+output data were both complex and did not have any special
+symmetry. For real data the inverse FFT is more complicated because
+the half-complex symmetry of the transformed data is
+different from the purely real input data.
+
+We can compute an inverse by stepping backwards through the forward
+transform. To simplify the inversion it's convenient to write the
+forward algorithm with the butterfly in matrix form,
+%
+\begin{algorithm}
+\FOR {$i = 1 \dots n$}
+ \FOR {$a = 0 \dots p_{i-1}/2$}
+ \FOR{$b = 0 \dots q_i - 1$}
+ \STATE{$
+ \left(
+ \begin{array}{c}
+ g(b p_i + a) \\
+ g(b p_i + p_{i-1} + a)
+ \end{array}
+ \right)
+ =
+ \left(
+ \begin{array}{cc}
+ 1 & W^a_{p_{i}} \\
+ 1 & -W^a_{p_{i}}
+ \end{array}
+ \right)
+ \left(
+ \begin{array}{c}
+ g(2 b p_{i-1} + a) \\
+ g((2 b + 1) p_{i-1} + a)
+ \end{array}
+ \right) $}
+ \ENDFOR
+ \ENDFOR
+\ENDFOR
+\end{algorithm}
+%
+To invert the algorithm we run the iterations backwards and invert the
+matrix multiplication in the innermost loop,
+%
+\begin{algorithm}
+\FOR {$i = n \dots 1$}
+ \FOR {$a = 0 \dots p_{i-1}/2$}
+ \FOR{$b = 0 \dots q_i - 1$}
+ \STATE{$
+ \left(
+ \begin{array}{c}
+ g(2 b p_{i-1} + a) \\
+ g((2 b + 1) p_{i-1} + a)
+ \end{array}
+ \right)
+ =
+ \left(
+ \begin{array}{cc}
+ 1 & W^a_{p_{i}} \\
+ 1 & -W^a_{p_{i}}
+ \end{array}
+ \right)^{-1}
+ \left(
+ \begin{array}{c}
+ g(b p_i + a) \\
+ g(b p_i + p_{i-1} + a)
+ \end{array}
+ \right) $}
+ \ENDFOR
+ \ENDFOR
+\ENDFOR
+\end{algorithm}
+%
+There is no need to reverse the loops over $a$ and $b$ because the
+result is independent of their order. The inverse of the matrix that
+appears is,
+%
+\begin{equation}
+\left(
+\begin{array}{cc}
+1 & W^a_{p_{i}} \\
+1 & -W^a_{p_{i}}
+\end{array}
+\right)^{-1}
+=
+{1 \over 2}
+\left(
+\begin{array}{cc}
+1 & 1 \\
+W^{-a}_{p_{i}} & -W^{-a}_{p_{i}}
+\end{array}
+\right)
+\end{equation}
+%
+To save divisions we remove the factor of $1/2$ inside the loop. This
+computes the unnormalized inverse, and the normalized inverse can be
+retrieved by dividing the final result by $N = 2^n$.
+
+Here is the radix-2 half-complex to real inverse FFT algorithm, taking
+into account the radix-2 storage scheme,
+%
+\begin{algorithm}
+\FOR {$i = n \dots 1$}
+ \FOR{$b = 0 \dots q_i - 1$}
+ \STATE{$\left(
+ \begin{array}{c}
+ g(b p_i) \\
+ g(b p_i + p_{i-1})
+ \end{array}
+ \right)
+ \Leftarrow
+ \left(
+ \begin{array}{c}
+ g(b p_{i}) + g(b p_{i} + p_{i-1}) \\
+ g(b p_{i}) - g(b p_{i} + p_{i-1})
+ \end{array}
+ \right)$}
+ \ENDFOR
+
+ \FOR {$a = 1 \dots p_{i-1}/2 - 1$}
+ \FOR{$b = 0 \dots q_i - 1$}
+ \STATE{$(\Real z_0, \Imag z_0)
+ \Leftarrow
+ (g(b p_i + a), g(b p_i + p_{i} - a))$}
+ \STATE{$(\Real z_1, \Imag z_1)
+ \Leftarrow
+ (g(b p_i + p_{i-1} - a), -g(b p_i + p_{i-1} + a))$}
+ \STATE{$t_0 \Leftarrow z_0 + z_1$}
+ \STATE{$t_1 \Leftarrow z_0 - z_1$}
+ \STATE{$(g(b p_{i} + a), g(b p_{i} + p_{i-1} - a))
+ \Leftarrow
+ (\Real t_0, \Imag t_0) $}
+ \STATE{$(g(b p_{i} + p_{i-1} + a),g(b p_{i} + p_{i} - a))
+ \Leftarrow
+ (\Real(W^a_{p_i}t_1), \Imag(W^a_{p_i}t_1))$}
+ \ENDFOR
+ \ENDFOR
+
+ \FOR{$b = 0 \dots q_i - 1$}
+ \STATE{$g(b p_{i} + p_{i-1}/2) \Leftarrow 2 g(b p_{i} + p_{i-1}/2)$}
+ \STATE{$g(b p_{i} + p_{i-1} + p_{i-1}/2) \Leftarrow -2 g(b p_{i} + p_{i-1} + p_{i-1}/2)$}
+ \ENDFOR
+
+\ENDFOR
+\STATE bit-reverse ordering of $g$
+\end{algorithm}
+
+
+
+\subsection{Mixed-Radix FFTs for real data}
+%
+As discussed earlier the radix-2 decimation-in-time algorithm had the
+special property that its intermediate passes are interleaved fourier
+transforms of the original data, and this generalizes to the
+mixed-radix algorithm. The complex mixed-radix algorithm that we
+derived earlier was a decimation-in-frequency algorithm, but we can
+obtain a decimation-in-time version by taking the transpose of the
+decimation-in-frequency DFT matrix like this,
+%
+\begin{eqnarray}
+W_N &=& W_N^T \\
+&=& (T_{n_f} \dots T_2 T_1)^T \\
+&=& T_1^T T_2^T \dots T_{n_f}^T
+\end{eqnarray}
+%
+with,
+%
+\begin{eqnarray}
+T_i^T &=& \left( (P^{f_i}_{q_i} D^{f_i}_{q_i} \otimes I_{p_{i-1}})
+ (W_{f_i} \otimes I_{m_i}) \right)^T \\
+ &=& (W_{f_i} \otimes I_{m_i})
+ ( D^{f_i}_{q_i} (P^{f_i}_{q_i})^T \otimes I_{p_{i-1}}).
+\end{eqnarray}
+%
+We have used the fact that $W$, $D$ and $I$ are symmetric and that the
+permutation matrix $P$ obeys,
+%
+\begin{equation}
+(P^a_b)^T = P^b_a.
+\end{equation}
+%
+From the definitions of $D$ and $P$ we can derive the following identity,
+%
+\begin{equation}
+D^a_b P^b_a = P^b_a D^b_a.
+\end{equation}
+%
+This allows us to put the transpose into a simple form,
+%
+\begin{equation}
+T_i^T = (W_{f_i} \otimes I_{m_i})
+ (P^{q_i}_{f_i} D^{q_i}_{f_i} \otimes I_{p_{i-1}}).
+\end{equation}
+%
+The transposed matrix, $T^T$ applies the digit-reversal $P$ before the
+DFT $W$, giving the required decimation-in-time algorithm. The
+transpose reverses the order of the factors --- $T_{n_f}$ is applied
+first and $T_1$ is applied last. For convenience we can reverse the
+order of the factors, $f_1 \leftrightarrow f_{n_f}$, $f_2
+\leftrightarrow f_{n_f-1}$, \dots and make the corresponding
+substitution $p_{i-1} \leftrightarrow q_i$. These substitutions give
+us a decimation-in-time algorithm with the same ordering as the
+decimation-in-frequency algorithm,
+%
+\begin{equation}
+W_N = T_{n_f} \dots T_2 T_1
+\end{equation}
+%
+\begin{equation}
+T_i = (W_{f_i} \otimes I_{m_i})
+ (P^{p_{i-1}}_{f_i} D^{p_{i-1}}_{f_i} \otimes I_{q_i})
+\end{equation}
+%
+where $p_i$, $q_i$ and $m_i$ now have the same meanings as before,
+namely,
+%
+\begin{eqnarray}
+p_i &=& f_1 f_2 \dots f_i \quad (p_0 = 1) \\
+q_i &=& N / p_i \\
+m_i &=& N / f_i
+\end{eqnarray}
+%
+Now we would like to prove that the iteration for computing $x = W z =
+T_{n_f} \dots T_2 T_1 z$ has the special property interleaving
+property. If we write the result of each intermediate pass as
+$v^{(i)}$,
+%
+\begin{eqnarray}
+v^{(0)} &=& z \\
+v^{(1)} &=& T_1 v^{(0)} \\
+v^{(2)} &=& T_2 v^{(1)} \\
+\dots &=& \dots \\
+v^{(i)} &=& T_i v^{(i-1)}
+\end{eqnarray}
+%
+then we will show that the intermediate results $v^{(i)}$ on any pass
+can be written as,
+%
+\begin{equation}
+v^{(i)} = (W_{p_i} \otimes I_{q_i}) z
+\end{equation}
+%
+Each intermediate stage will be a set of $q_i$ interleaved fourier
+transforms, each of length $p_i$. We can prove this result by
+induction. First we assume that the result is true for $v^{(i-1)}$,
+%
+\begin{equation}
+v^{(i-1)} = (W_{p_{i-1}} \otimes I_{q_{i-1}}) z \qquad \mbox{(assumption)}
+\end{equation}
+%
+And then we examine the next iteration using this assumption,
+%
+\begin{eqnarray}
+v^{(i)} &=& T_i v^{(i-1)} \\
+ &=& T_i (W_{p_{i-1}} \otimes I_{q_{i-1}}) z \\
+ &=& (W_{f_i} \otimes I_{m_i})
+ (P^{p_{i-1}}_{f_i} D^{p_{i-1}}_{f_i} \otimes I_{q_i})
+ (W_{p_{i-1}} \otimes I_{q_{i-1}}) z \label{dit-induction}
+\end{eqnarray}
+%
+Using the relation $m_i = p_{i-1} q_i$, we can write $I_{m_i}$ as
+$I_{p_{i-1} q_i}$ and $I_{q_{i-1}}$ as $I_{f_i q_i}$. By combining these
+with the basic matrix identity,
+%
+\begin{equation}
+I_{ab} = I_a \otimes I_b
+\end{equation}
+%
+we can rewrite $v^{(i)}$ in the following form,
+%
+\begin{equation}
+v^{(i)} = (((W_{f_i} \otimes I_{p_{i-1}})
+ (P^{p_{i-1}}_{f_i} D^{p_{i-1}}_{f_i})
+ (W_{p_{i-1}} \otimes I_{f_i})) \otimes I_{q_i}) z .
+\end{equation}
+%
+The first part of this matrix product is the two-factor expansion of
+$W_{ab}$, for $a = p_{i-1}$ and $b = f_i$,
+%
+\begin{equation}
+W_{p_{i-1} f_i} = ((W_{f_i} \otimes I_{p_{i-1}})
+ (P^{p_{i-1}}_{f_i} D^{p_{i-1}}_{f_i})
+ (W_{p_{i-1}} \otimes I_{f_i})).
+\end{equation}
+%
+If we substitute this result, remembering that $p_i = p_{i-1} f_i$, we
+obtain,
+%
+\begin{equation}
+v^{(i)} = (W_{p_i} \otimes I_{q_i}) z
+\end{equation}
+%
+which is the desired result. The case $i=1$ can be verified
+explicitly, and induction then shows that the result is true for all
+$i$. As discussed for the radix-2 algorithm this result is important
+because if the initial data $z$ is real then each intermediate pass is
+a set of interleaved fourier transforms of $z$, having half-complex
+symmetries (appropriately applied in the subspaces of the Kronecker
+product). Consequently only $N$ real numbers are needed to store the
+intermediate and final results.
+
+\subsection{Implementation}
+%
+The implementation of the mixed-radix real FFT algorithm follows the
+same principles as the full complex transform. Some of the steps are
+applied in the opposite order because we are dealing with a decimation
+in time algorithm instead of a decimation in frequency algorithm, but
+the basic outer structure of the algorithm is the same. We want to
+apply the factorized version of the DFT matrix $W_N$ to the input
+vector $z$,
+%
+\begin{eqnarray}
+x &=& W_N z \\
+ &=& T_{n_f} \dots T_2 T_1 z
+\end{eqnarray}
+%
+We loop over the $n_f$ factors, applying each matrix $T_i$ to the
+vector in turn to build up the complete transform,
+%
+\begin{algorithm}
+\FOR{$(i = 1 \dots n_f)$}
+ \STATE{$v \Leftarrow T_i v $}
+\ENDFOR
+\end{algorithm}
+%
+In this case the definition of $T_i$ is different because we have
+taken the transpose,
+%
+\begin{equation}
+T_i =
+ (W_{f_i} \otimes I_{m_i})
+ (P^{p_{i-1}}_{f_i} D^{p_{i-1}}_{f_i} \otimes I_{q_i}).
+\end{equation}
+%
+We'll define a temporary vector $t$ to denote the results of applying the
+rightmost matrix,
+%
+\begin{equation}
+t = (P^{p_{i-1}}_{f_i} D^{p_{i-1}}_{f_i} \otimes I_{q_i}) v
+\end{equation}
+%
+If we expand this out into individual components, as before, we find a
+similar simplification,
+%
+\begin{eqnarray}
+t_{aq+b}
+&=&
+\sum_{a'b'}
+(P^{p_{i-1}}_{f_i} D^{p_{i-1}}_{f_i} \otimes I_{q_i})_{(aq+b)(a'q+b')}
+v_{a'q+b'} \\
+&=&
+\sum_{a'}
+(P^{p_{i-1}}_{f_i} D^{p_{i-1}}_{f_i})_{a a'}
+v_{a'q+b}
+\end{eqnarray}
+%
+We have factorized the indices into the form $aq+b$, with $0 \leq a <
+p_{i}$ and $0 \leq b < q$. Just as in the decimation in frequency
+algorithm we can split the index $a$ to remove the matrix
+multiplication completely. We have to write $a$ as $\mu f + \lambda$,
+where $0 \leq \mu < p_{i-1}$ and $0 \leq \lambda < f$,
+%
+\begin{eqnarray}
+t_{(\mu f + \lambda)q+b}
+&=&
+\sum_{\mu'\lambda'}
+(P^{p_{i-1}}_{f_i} D^{p_{i-1}}_{f_i})_{(\mu f + \lambda)(\mu' f + \lambda')}
+v_{(\mu' f + \lambda')q+b}
+\\
+&=&
+\sum_{\mu'\lambda'}
+(P^{p_{i-1}}_{f_i})_{(\mu f + \lambda)(\mu' f + \lambda')}
+\omega^{\mu'\lambda'}_{p_{i}}
+v_{(\mu' f + \lambda')q+b}
+\end{eqnarray}
+%
+The matrix $P^{p_{i-1}}_{f_i}$ exchanges an index of $(\mu f +
+\lambda) q + b$ with $(\lambda p_{i-1} + \mu) q + b$, giving a final
+result of,
+%
+\begin{eqnarray}
+t_{(\lambda p_{i-1} + \mu) q + b}
+=
+w^{\mu\lambda}_{p_i} v_{(\mu f + \lambda)q +b}
+\end{eqnarray}
+%
+To calculate the next stage,
+%
+\begin{equation}
+v' = (W_{f_i} \otimes I_{m_i}) t,
+\end{equation}
+%
+we temporarily rearrange the index of $t$ to separate the $m_{i}$
+independent DFTs in the Kronecker product,
+%
+\begin{equation}
+v'_{(\lambda p_{i-1} + \mu) q + b}
+=
+\sum_{\lambda' \mu' b'}
+(W_{f_i} \otimes I_{m_i})_{
+((\lambda p_{i-1} + \mu) q + b)
+((\lambda' p_{i-1} + \mu') q + b')}
+t_{(\lambda' p_{i-1} + \mu') q + b'}
+\end{equation}
+%
+If we use the identity $m = p_{i-1} q$ to rewrite the index of $t$
+like this,
+%
+\begin{equation}
+t_{(\lambda p_{i-1} + \mu) q + b} = t_{\lambda m + (\mu q + b)}
+\end{equation}
+%
+we can split the Kronecker product,
+%
+\begin{eqnarray}
+v'_{(\lambda p_{i-1} + \mu) q + b}
+&=&
+\sum_{\lambda' \mu' b'}
+(W_{f_i} \otimes I_{m_i})_{
+((\lambda p_{i-1} + \mu) q + b)
+((\lambda' p_{i-1} + \mu') q + b')}
+t_{(\lambda' p_{i-1} + \mu') q + b'}\\
+&=&
+\sum_{\lambda'}
+(W_{f_i})_{\lambda \lambda'}
+t_{\lambda' m_i + (\mu q + b)}
+\end{eqnarray}
+%
+If we switch back to the original form of the index in the last line we obtain,
+%
+\begin{eqnarray}
+\phantom{v'_{(\lambda p_{i-1} + \mu) q + b}}
+&=&
+\sum_{\lambda'}
+(W_{f_i})_{\lambda \lambda'}
+t_{(\lambda p_{i-1} + \mu) q + b}
+\end{eqnarray}
+%
+which allows us to substitute our previous result for $t$,
+%
+\begin{equation}
+v'_{(\lambda p_{i-1} + \mu) q + b}
+=
+\sum_{\lambda'}
+(W_{f_i})_{\lambda \lambda'}
+w^{\mu\lambda'}_{p_i} v_{(\mu f + \lambda')q + b}
+\end{equation}
+%
+This gives us the basic decimation-in-time mixed-radix algorithm for
+complex data which we will be able to specialize to real data,
+%
+\begin{algorithm}
+\FOR{$i = 1 \dots n_f$}
+\FOR{$\mu = 0 \dots p_{i-1} - 1$}
+\FOR{$b = 0 \dots q-1$}
+\FOR{$\lambda = 0 \dots f-1$}
+\STATE{$t_\lambda \Leftarrow
+ \omega^{\mu\lambda'}_{p_{i}} v_{(\mu f + \lambda')q + b}$}
+\ENDFOR
+\FOR{$\lambda = 0 \dots f-1$}
+\STATE{$v'_{(\lambda p_{i-1} + \mu)q + b} =
+ \sum_{\lambda'=0}^{f-1} W_f(\lambda,\lambda') t_{\lambda'}$}
+ \COMMENT{DFT matrix-multiply module}
+\ENDFOR
+\ENDFOR
+\ENDFOR
+\STATE{$v \Leftarrow v'$}
+\ENDFOR
+\end{algorithm}
+%
+We are now at the point where we can convert an algorithm formulated
+in terms of complex variables to one in terms of real variables by
+choosing a suitable storage scheme. We will adopt the FFTPACK storage
+convention. FFTPACK uses a scheme where individual FFTs are
+contiguous, not interleaved, and real-imaginary pairs are stored in
+neighboring locations. This has better locality than was possible for
+the radix-2 case.
+
+The interleaving of the intermediate FFTs results from the Kronecker
+product, $W_p \otimes I_q$. The FFTs can be made contiguous if we
+reorder the Kronecker product on the intermediate passes,
+%
+\begin{equation}
+W_p \otimes I_q \Rightarrow I_q \otimes W_p
+\end{equation}
+%
+This can be implemented by a simple change in indexing. On pass-$i$
+we store element $v_{a q_i + b}$ in location $v_{b p_i+a}$. We
+compensate for this change by making the same transposition when
+reading the data. Note that this only affects the indices of the
+intermediate passes. On the zeroth iteration the transposition has no
+effect because $p_0 = 1$. Similarly there is no effect on the last
+iteration, which has $q_{n_f} = 1$. This is how the algorithm above
+looks after this index transformation,
+%
+\begin{algorithm}
+\FOR{$i = 1 \dots n_f$}
+\FOR{$\mu = 0 \dots p_{i-1} - 1$}
+\FOR{$b = 0 \dots q-1$}
+\FOR{$\lambda = 0 \dots f-1$}
+\STATE{$t_\lambda \Leftarrow
+ \omega^{\mu\lambda'}_{p_{i}} v_{(\lambda'q + b)p_{i-1} + \mu}$}
+\ENDFOR
+\FOR{$\lambda = 0 \dots f-1$}
+\STATE{$v'_{b p + (\lambda p_{i-1} + \mu)} =
+ \sum_{\lambda'=0}^{f-1} W_f(\lambda,\lambda') t_{\lambda'}$}
+ \COMMENT{DFT matrix-multiply module}
+\ENDFOR
+\ENDFOR
+\ENDFOR
+\STATE{$v \Leftarrow v'$}
+\ENDFOR
+\end{algorithm}
+%
+We transpose the input terms by writing the index in the form $a
+q_{i-1} + b$, to take account of the pass-dependence of the scheme,
+%
+\begin{equation}
+v_{(\mu f + \lambda')q + b} = v_{\mu q_{i-1} + \lambda'q + b}
+\end{equation}
+%
+We used the identity $q_{i-1} = f q$ to split the index. Note that in
+this form $\lambda'q + b$ runs from 0 to $q_{i-1} - 1$ as $b$ runs
+from 0 to $q-1$ and $\lambda'$ runs from 0 to $f-1$. The transposition
+for the input terms then gives,
+%
+\begin{equation}
+v_{\mu q_{i-1} + \lambda'q + b} \Rightarrow v_{(\lambda'q + b) p_{i-1} + \mu}
+\end{equation}
+%
+In the FFTPACK scheme the intermediate output data have the same
+half-complex symmetry as the radix-2 example, namely,
+%
+\begin{equation}
+v^{(i)}_{b p + a} = v^{(i)*}_{b p + (p - a)}
+\end{equation}
+%
+and on the input data from the previous pass have the symmetry,
+%
+\begin{equation}
+v^{(i-1)}_{(\lambda' q + b) p_{i-1} + \mu} = v^{(i-1)*}_{(\lambda' q +
+b) p_{i-1} + (p_{i-1} - \mu)}
+\end{equation}
+%
+Using these symmetries we can halve the storage and computation
+requirements for each pass. Compared with the radix-2 algorithm we
+have more freedom because the computation does not have to be done in
+place. The storage scheme adopted by FFTPACK places elements
+sequentially with real and imaginary parts in neighboring
+locations. Imaginary parts which are known to be zero are not
+stored. Here are the full details of the scheme,
+%
+\begin{center}
+\renewcommand{\arraystretch}{1.5}
+\begin{tabular}{|l|lll|}
+\hline Term & & Location & \\
+\hline
+$g(b p_i)$
+ & real part & $b p_{i} $ & \\
+ & imag part & --- & \\
+\hline
+$g(b p_i + a)$
+ & real part & $b p_{i} + 2a - 1 $& for $a = 1 \dots p_i/2 - 1$ \\
+ & imag part & $b p_{i} + 2a$ & \\
+\hline
+$g(b p_{i} + p_{i}/2)$
+ & real part & $b p_i + p_{i} - 1$ & if $p_i$ is even\\
+ & imag part & --- & \\
+\hline
+\end{tabular}
+\end{center}
+%
+The real element for $a=0$ is stored in location $bp$. The real parts
+for $a = 1 \dots p/2 - 1$ are stored in locations $bp + 2a -1$ and the
+imaginary parts are stored in locations $b p + 2 a$. When $p$ is even
+the term for $a = p/2$ is purely real and we store it in location $bp
++ p - 1$. The zero imaginary part is not stored.
+
+When we compute the basic iteration,
+%
+\begin{equation}
+v^{(i)}_{b p + (\lambda p_{i-1} + \mu)} = \sum_{\lambda'}
+W^{\lambda \lambda'}_f
+\omega^{\mu\lambda'}_{p_i} v^{(i-1)}_{(\lambda' q + b)p_{i-1} + \mu}
+\end{equation}
+%
+we eliminate the redundant conjugate terms with $a > p_{i}/2$ as we
+did in the radix-2 algorithm. Whenever we need to store a term with $a
+> p_{i}/2$ we consider instead the corresponding conjugate term with
+$a' = p - a$. Similarly when reading data we replace terms with $\mu >
+p_{i-1}/2$ with the corresponding conjugate term for $\mu' = p_{i-1} -
+\mu$.
+
+Since the input data on each stage has half-complex symmetry we only
+need to consider the range $\mu=0 \dots p_{i-1}/2$. We can consider
+the best ways to implement the basic iteration for each pass, $\mu = 0
+\dots p_{i-1}/2$.
+
+On the first pass where $\mu=0$ we will be accessing elements which
+are the zeroth components of the independent transforms $W_{p_{i-1}}
+\otimes I_{q_{i-1}}$, and are purely real.
+%
+We can code the pass with $\mu=0$ as a special case for real input
+data, and conjugate-complex output. When $\mu=0$ the twiddle factors
+$\omega^{\mu\lambda'}_{p_i}$ are all unity, giving a further saving.
+We can obtain small-$N$ real-data DFT modules by removing the
+redundant operations from the complex modules.
+%
+For example the $N=3$ module was,
+%
+\begin{equation}
+\begin{array}{lll}
+t_1 = z_1 + z_2, &
+t_2 = z_0 - t_1/2, &
+t_3 = \sin(\pi/3) (z_1 - z_2),
+\end{array}
+\end{equation}
+\begin{equation}
+\begin{array}{lll}
+x_0 = z_0 + t_1, &
+x_1 = t_2 + i t_3, &
+x_2 = t_2 - i t_3.
+\end{array}
+\end{equation}
+%
+In the complex case all the operations were complex, for complex input
+data $z_0$, $z_1$, $z_2$. In the real case $z_0$, $z_1$ and $z_2$ are
+all real. Consequently $t_1$, $t_2$ and $t_3$ are also real, and the
+symmetry $x_1 = t_1 + i t_2 = x^*_2$ means that we do not have to
+compute $x_2$ once we have computed $x_1$.
+
+For subsequent passes $\mu = 1 \dots p_{i-1}/2 - 1$ the input data is
+complex and we have to compute full complex DFTs using the same
+modules as in the complex case. Note that the inputs are all of the
+form $v_{(\lambda q + b) p_{i-1} + \mu}$ with $\mu < p_{i-1}/2$ so we
+never need to use the symmetry to access the conjugate elements with
+$\mu > p_{i-1}/2$.
+
+If $p_{i-1}$ is even then we reach the halfway point $\mu=p_{i-1}/2$,
+which is another special case. The input data in this case is purely
+real because $\mu = p_{i-1} - \mu$ for $\mu = p_{i-1}/2$. We can code
+this as a special case, using real inputs and real-data DFT modules as
+we did for $\mu=0$. However, for $\mu = p_{i-1}/2$ the twiddle factors
+are not unity,
+%
+\begin{eqnarray}
+\omega^{\mu\lambda'}_{p_i} &=& \omega^{(p_{i-1}/2)\lambda'}_{p_i} \\
+&=& \exp(-i\pi\lambda'/f_i)
+\end{eqnarray}
+%
+These twiddle factors introduce an additional phase which modifies the
+symmetry of the outputs. Instead of the conjugate-complex symmetry
+which applied for $\mu=0$ there is a shifted conjugate-complex
+symmetry,
+%
+\begin{equation}
+t_\lambda = t^*_{f-(\lambda+1)}
+\end{equation}
+%
+This is easily proved,
+%
+\begin{eqnarray}
+t_\lambda
+&=&
+\sum e^{-2\pi i \lambda\lambda'/f_i} e^{-i\pi \lambda'/f_i} r_{\lambda'} \\
+t_{f - (\lambda + 1)}
+&=&
+\sum e^{-2\pi i (f-\lambda-1)\lambda'/f_i} e^{-i\pi \lambda'/f_i} r_{\lambda'} \\
+&=&
+\sum e^{2\pi i \lambda\lambda'/f_i} e^{i\pi \lambda'/f_i} r_{\lambda'} \\
+&=& t^*_\lambda
+\end{eqnarray}
+%
+The symmetry of the output means that we only need to compute half of
+the output terms, the remaining terms being conjugates or zero
+imaginary parts. For example, when $f=4$ the outputs are $(x_0 + i
+y_0, x_1 + i y_1, x_1 - i y_1, x_0 - i y_0)$. For $f=5$ the outputs
+are $(x_0 + i y_0, x_1 + i y_1, x_2, x_1 - i y_1, x_0 - i y_0)$. By
+combining the twiddle factors and DFT matrix we can make a combined
+module which applies both at the same time. By starting from the
+complex DFT modules and bringing in twiddle factors we can derive
+optimized modules. Here are the modules given by Temperton for $z = W
+\Omega x$ where $x$ is real and $z$ has the shifted conjugate-complex
+symmetry. The matrix of twiddle factors, $\Omega$, is given by,
+%
+\begin{equation}
+\Omega = \mathrm{diag}(1, e^{-i\pi/f}, e^{-2\pi i/f}, \dots, e^{-i\pi(f-1)/f})
+\end{equation}
+%
+We write $z$ in terms of two real vectors $z = a + i b$.
+%
+For $N=2$,
+%
+\begin{equation}
+\begin{array}{ll}
+a_0 = x_0, &
+b_0 = - x_1.
+\end{array}
+\end{equation}
+%
+For $N=3$,
+%
+\begin{equation}
+\begin{array}{l}
+t_1 = x_1 - x_2,
+\end{array}
+\end{equation}
+\begin{equation}
+\begin{array}{ll}
+a_0 = x_0 + t_1/2, & b_0 = x_0 - t_1,
+\end{array}
+\end{equation}
+\begin{equation}
+\begin{array}{l}
+a_1 = - \sin(\pi/3) (x_1 + x_2)
+\end{array}
+\end{equation}
+%
+For $N=4$,
+%
+\begin{equation}
+\begin{array}{ll}
+t_1 = (x_1 - x_3)/\sqrt{2}, & t_2 = (x_1 + x_3)/\sqrt{2},
+\end{array}
+\end{equation}
+\begin{equation}
+\begin{array}{ll}
+a_0 = x_0 + t_1, & b_0 = -x_2 - t_2,
+\end{array}
+\end{equation}
+\begin{equation}
+\begin{array}{ll}
+a_1 = x_0 - t_1, & b_1 = x_2 - t_2.
+\end{array}
+\end{equation}
+%
+For $N=5$,
+%
+\begin{equation}
+\begin{array}{ll}
+t_1 = x_1 - x_4, & t_2 = x_1 + x_4,
+\end{array}
+\end{equation}
+\begin{equation}
+\begin{array}{ll}
+t_3 = x_2 - x_3, & t_4 = x_2 + x_3,
+\end{array}
+\end{equation}
+\begin{equation}
+\begin{array}{ll}
+t_5 = t_1 - t_3, & t_6 = x_0 + t_5 / 4,
+\end{array}
+\end{equation}
+\begin{equation}
+\begin{array}{ll}
+t_7 = (\sqrt{5}/4)(t_1 + t_3) &
+\end{array}
+\end{equation}
+\begin{equation}
+\begin{array}{ll}
+a_0 = t_6 + t_7, & b_0 = -\sin(2\pi/10) t_2 - \sin(2\pi/5) t_4,
+\end{array}
+\end{equation}
+\begin{equation}
+\begin{array}{ll}
+a_1 = t_6 - t_7, & b_1 = -\sin(2\pi/5) t_2 + \sin(2\pi/10) t_4,
+\end{array}
+\end{equation}
+\begin{equation}
+\begin{array}{ll}
+a_2 = x_0 - t_5 &
+\end{array}
+\end{equation}
+%
+For $N=6$,
+%
+\begin{equation}
+\begin{array}{ll}
+t_1 = \sin(\pi/3)(x_5 - x_1), & t_2 = \sin(\pi/3) (x_2 + x_4),
+\end{array}
+\end{equation}
+\begin{equation}
+\begin{array}{ll}
+t_3 = x_2 - x_4, & t_4 = x_1 + x_5,
+\end{array}
+\end{equation}
+\begin{equation}
+\begin{array}{ll}
+t_5 = x_0 + t_3 / 2, & t_6 = -x_3 - t_4 / 2,
+\end{array}
+\end{equation}
+\begin{equation}
+\begin{array}{ll}
+a_0 = t_5 - t_1, & b_0 = t_6 - t_2,
+\end{array}
+\end{equation}
+\begin{equation}
+\begin{array}{ll}
+a_1 = x_0 - t_3, & b_1 = x_3 - t_4,
+\end{array}
+\end{equation}
+\begin{equation}
+\begin{array}{ll}
+a_2 = t_5 + t_1, & b_2 = t_6 + t_2
+\end{array}
+\end{equation}
+
+\section{Computing the mixed-radix inverse for real data}
+%
+To compute the inverse of the mixed-radix FFT on real data we step
+through the algorithm in reverse and invert each operation.
+
+This gives the following algorithm using FFTPACK indexing,
+%
+\begin{algorithm}
+\FOR{$i = n_f \dots 1$}
+\FOR{$\mu = 0 \dots p_{i-1} - 1$}
+\FOR{$b = 0 \dots q-1$}
+\FOR{$\lambda = 0 \dots f-1$}
+\STATE{$t_{\lambda'} =
+ \sum_{\lambda'=0}^{f-1} W_f(\lambda,\lambda')
+ v_{b p + (\lambda p_{i-1} + \mu)}$}
+ \COMMENT{DFT matrix-multiply module}
+\ENDFOR
+\FOR{$\lambda = 0 \dots f-1$}
+\STATE{$v'_{(\lambda'q + b)p_{i-1} + \mu} \Leftarrow
+ \omega^{-\mu\lambda'}_{p_{i}} t_\lambda$}
+\ENDFOR
+
+\ENDFOR
+\ENDFOR
+\STATE{$v \Leftarrow v'$}
+\ENDFOR
+\end{algorithm}
+%
+When $\mu=0$ we are applying an inverse DFT to half-complex data,
+giving a real result. The twiddle factors are all unity. We can code
+this as a special case, just as we did for the forward routine. We
+start with complex module and eliminate the redundant terms. In this
+case it is the final result which has the zero imaginary part, and we
+eliminate redundant terms by using the half-complex symmetry of the
+input data.
+
+When $\mu=1 \dots p_{i-1}/2 - 1$ we have full complex transforms on
+complex data, so no simplification is possible.
+
+When $\mu = p_{i-1}/2$ (which occurs only when $p_{i-1}$ is even) we
+have a combination of twiddle factors and DFTs on data with the
+shifted half-complex symmetry which give a real result. We implement
+this as a special module, essentially by inverting the system of
+equations given for the forward case. We use the modules given by
+Temperton, appropriately modified for our version of the algorithm. He
+uses a slightly different convention which differs by factors of two
+for some terms (consult his paper for details~\cite{temperton83real}).
+
+For $N=2$,
+%
+\begin{equation}
+\begin{array}{ll}
+x_0 = 2 a_0, & x_1 = - 2 b_0 .
+\end{array}
+\end{equation}
+%
+For $N=3$,
+%
+\begin{equation}
+\begin{array}{ll}
+t_1 = a_0 - a_1, & t_2 = \sqrt{3} b_1, \\
+\end{array}
+\end{equation}
+\begin{equation}
+\begin{array}{lll}
+x_0 = 2 a_0 + a_1, & x_1 = t_1 - t_2, & x_2 = - t_1 - t_2
+\end{array}
+\end{equation}
+%
+For $N=4$,
+\begin{equation}
+\begin{array}{ll}
+t_1 = \sqrt{2} (b_0 + b_1), & t_2 = \sqrt{2} (a_0 - a_1),
+\end{array}
+\end{equation}
+\begin{equation}
+\begin{array}{ll}
+x_0 = 2(a_0 + a_1), & x_1 = t_2 - t_1 ,
+\end{array}
+\end{equation}
+\begin{equation}
+\begin{array}{ll}
+x_2 = 2(b_1 - b_0), & x_3 = -(t_2 + t_1).
+\end{array}
+\end{equation}
+%
+For $N=5$,
+%
+\begin{equation}
+\begin{array}{ll}
+t_1 = 2 (a_0 + a_1), & t_2 = t_1 / 4 - a_2,
+\end{array}
+\end{equation}
+\begin{equation}
+\begin{array}{ll}
+t_3 = (\sqrt{5}/2) (a_0 - a_1),
+\end{array}
+\end{equation}
+\begin{equation}
+\begin{array}{l}
+t_4 = 2(\sin(2\pi/10) b_0 + \sin(2\pi/5) b_1),
+\end{array}
+\end{equation}
+\begin{equation}
+\begin{array}{l}
+t_5 = 2(\sin(2\pi/10) b_0 - \sin(2\pi/5) b_1),
+\end{array}
+\end{equation}
+\begin{equation}
+\begin{array}{ll}
+t_6 = t_3 + t_2, & t_7 = t_3 - t_2,
+\end{array}
+\end{equation}
+\begin{equation}
+\begin{array}{ll}
+x_0 = t_1 + a_2, & x_1 = t_6 - t_4 ,
+\end{array}
+\end{equation}
+\begin{equation}
+\begin{array}{ll}
+x_2 = t_7 - t_5, & x_3 = - t_7 - t_5,
+\end{array}
+\end{equation}
+\begin{equation}
+\begin{array}{ll}
+x_4 = -t_6 - t_4.
+\end{array}
+\end{equation}
+
+\section{Conclusions}
+%
+We have described the basic algorithms for one-dimensional radix-2 and
+mixed-radix FFTs. It would be nice to have a pedagogical explanation
+of the split-radix FFT algorithm, which is faster than the simple
+radix-2 algorithm we used. We could also have a whole chapter on
+multidimensional FFTs.
+%
+%\section{Multidimensional FFTs}
+%\section{Testing FFTs, Numerical Analysis}
+
+%\nocite{*}
+\bibliographystyle{unsrt}
+\bibliography{fftalgorithms}
+
+\end{document}
+
+
+
+
diff --git a/gsl-1.9/doc/final-route.eps b/gsl-1.9/doc/final-route.eps
new file mode 100644
index 0000000..c2df8d1
--- /dev/null
+++ b/gsl-1.9/doc/final-route.eps
@@ -0,0 +1,11635 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: GNU libplot drawing library 4.1
+%%Title: PostScript plot
+%%CreationDate: Thu Jan 4 10:56:46 2007
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 1
+%%Pages: 1
+%%PageOrder: Ascend
+%%Orientation: Portrait
+%%BoundingBox: 101 194 489 610
+%%DocumentNeededResources:
+%%DocumentSuppliedResources: procset GNU_libplot 1.0 0
+%%EndComments
+
+%%BeginDefaults
+%%PageResources:
+%%EndDefaults
+
+%%BeginProlog
+%%EndProlog
+
+%%BeginSetup
+/DrawDict 50 dict def
+DrawDict begin
+%%BeginResource procset GNU_libplot 1.0 0
+/none null def
+/numGraphicParameters 17 def
+/stringLimit 65535 def
+/arrowHeight 8 def
+/eoFillRule true def
+
+/Begin { save numGraphicParameters dict begin } def
+/End { end restore } def
+
+/SetB {
+dup type /nulltype eq {
+pop
+false /brushRightArrow idef
+false /brushLeftArrow idef
+true /brushNone idef
+} {
+/brushDashOffset idef
+/brushDashArray idef
+0 ne /brushRightArrow idef
+0 ne /brushLeftArrow idef
+/brushWidth idef
+false /brushNone idef
+} ifelse
+} def
+
+/SetCFg {
+/fgblue idef
+/fggreen idef
+/fgred idef
+} def
+
+/SetCBg {
+/bgblue idef
+/bggreen idef
+/bgred idef
+} def
+
+/SetF {
+/printSize idef
+/printFont idef
+} def
+
+/SetP {
+dup type /nulltype eq {
+pop true /patternNone idef
+} {
+/patternGrayLevel idef
+patternGrayLevel -1 eq {
+/patternString idef
+} if
+false /patternNone idef
+} ifelse
+} def
+
+/BSpl {
+0 begin
+storexyn
+newpath
+n 1 gt {
+0 0 0 0 0 0 1 1 true subspline
+n 2 gt {
+0 0 0 0 1 1 2 2 false subspline
+1 1 n 3 sub {
+/i exch def
+i 1 sub dup i dup i 1 add dup i 2 add dup false subspline
+} for
+n 3 sub dup n 2 sub dup n 1 sub dup 2 copy false subspline
+} if
+n 2 sub dup n 1 sub dup 2 copy 2 copy false subspline
+patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if
+brushNone not { istroke } if
+0 0 1 1 leftarrow
+n 2 sub dup 1 sub dup rightarrow
+} if
+end
+} dup 0 4 dict put def
+
+/Circ {
+newpath
+0 360 arc
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+} def
+
+/CBSpl {
+0 begin
+dup 2 gt {
+storexyn
+newpath
+n 1 sub dup 0 0 1 1 2 2 true subspline
+1 1 n 3 sub {
+/i exch def
+i 1 sub dup i dup i 1 add dup i 2 add dup false subspline
+} for
+n 3 sub dup n 2 sub dup n 1 sub dup 0 0 false subspline
+n 2 sub dup n 1 sub dup 0 0 1 1 false subspline
+patternNone not { ifill } if
+brushNone not { istroke } if
+} {
+Poly
+} ifelse
+end
+} dup 0 4 dict put def
+
+/Elli {
+0 begin
+newpath
+4 2 roll
+translate
+scale
+0 0 1 0 360 arc
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+end
+} dup 0 1 dict put def
+
+/Line {
+0 begin
+2 storexyn
+newpath
+x 0 get y 0 get moveto
+x 1 get y 1 get lineto
+brushNone not { istroke } if
+0 0 1 1 leftarrow
+0 0 1 1 rightarrow
+end
+} dup 0 4 dict put def
+
+/MLine {
+0 begin
+storexyn
+newpath
+n 1 gt {
+x 0 get y 0 get moveto
+1 1 n 1 sub {
+/i exch def
+x i get y i get lineto
+} for
+patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if
+brushNone not { istroke } if
+0 0 1 1 leftarrow
+n 2 sub dup n 1 sub dup rightarrow
+} if
+end
+} dup 0 4 dict put def
+
+/Poly {
+3 1 roll
+newpath
+moveto
+-1 add
+{ lineto } repeat
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+} def
+
+/Rect {
+0 begin
+/t exch def
+/r exch def
+/b exch def
+/l exch def
+newpath
+l b moveto
+l t lineto
+r t lineto
+r b lineto
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+end
+} dup 0 4 dict put def
+
+/Text {
+ishow
+} def
+
+/idef {
+dup where { pop pop pop } { exch def } ifelse
+} def
+
+/ifill {
+0 begin
+gsave
+patternGrayLevel -1 ne {
+fgred bgred fgred sub patternGrayLevel mul add
+fggreen bggreen fggreen sub patternGrayLevel mul add
+fgblue bgblue fgblue sub patternGrayLevel mul add setrgbcolor
+eoFillRule { eofill } { fill } ifelse
+} {
+eoFillRule { eoclip } { clip } ifelse
+originalCTM setmatrix
+pathbbox /t exch def /r exch def /b exch def /l exch def
+/w r l sub ceiling cvi def
+/h t b sub ceiling cvi def
+/imageByteWidth w 8 div ceiling cvi def
+/imageHeight h def
+bgred bggreen bgblue setrgbcolor
+eoFillRule { eofill } { fill } ifelse
+fgred fggreen fgblue setrgbcolor
+w 0 gt h 0 gt and {
+l b translate w h scale
+w h true [w 0 0 h neg 0 h] { patternproc } imagemask
+} if
+} ifelse
+grestore
+end
+} dup 0 8 dict put def
+
+/istroke {
+gsave
+brushDashOffset -1 eq {
+[] 0 setdash
+1 setgray
+} {
+brushDashArray brushDashOffset setdash
+fgred fggreen fgblue setrgbcolor
+} ifelse
+brushWidth setlinewidth
+originalCTM setmatrix
+stroke
+grestore
+} def
+
+/ishow {
+0 begin
+gsave
+fgred fggreen fgblue setrgbcolor
+/fontDict printFont findfont printSize scalefont dup setfont def
+/descender fontDict begin 0 /FontBBox load 1 get FontMatrix end
+transform exch pop def
+/vertoffset 1 printSize sub descender sub def {
+0 vertoffset moveto show
+/vertoffset vertoffset printSize sub def
+} forall
+grestore
+end
+} dup 0 3 dict put def
+
+/patternproc {
+0 begin
+/patternByteLength patternString length def
+/patternHeight patternByteLength 8 mul sqrt cvi def
+/patternWidth patternHeight def
+/patternByteWidth patternWidth 8 idiv def
+/imageByteMaxLength imageByteWidth imageHeight mul
+stringLimit patternByteWidth sub min def
+/imageMaxHeight imageByteMaxLength imageByteWidth idiv patternHeight idiv
+patternHeight mul patternHeight max def
+/imageHeight imageHeight imageMaxHeight sub store
+/imageString imageByteWidth imageMaxHeight mul patternByteWidth add string def
+0 1 imageMaxHeight 1 sub {
+/y exch def
+/patternRow y patternByteWidth mul patternByteLength mod def
+/patternRowString patternString patternRow patternByteWidth getinterval def
+/imageRow y imageByteWidth mul def
+0 patternByteWidth imageByteWidth 1 sub {
+/x exch def
+imageString imageRow x add patternRowString putinterval
+} for
+} for
+imageString
+end
+} dup 0 12 dict put def
+
+/min {
+dup 3 2 roll dup 4 3 roll lt { exch } if pop
+} def
+
+/max {
+dup 3 2 roll dup 4 3 roll gt { exch } if pop
+} def
+
+/midpoint {
+0 begin
+/y1 exch def
+/x1 exch def
+/y0 exch def
+/x0 exch def
+x0 x1 add 2 div
+y0 y1 add 2 div
+end
+} dup 0 4 dict put def
+
+/thirdpoint {
+0 begin
+/y1 exch def
+/x1 exch def
+/y0 exch def
+/x0 exch def
+x0 2 mul x1 add 3 div
+y0 2 mul y1 add 3 div
+end
+} dup 0 4 dict put def
+
+/subspline {
+0 begin
+/movetoNeeded exch def
+y exch get /y3 exch def
+x exch get /x3 exch def
+y exch get /y2 exch def
+x exch get /x2 exch def
+y exch get /y1 exch def
+x exch get /x1 exch def
+y exch get /y0 exch def
+x exch get /x0 exch def
+x1 y1 x2 y2 thirdpoint
+/p1y exch def
+/p1x exch def
+x2 y2 x1 y1 thirdpoint
+/p2y exch def
+/p2x exch def
+x1 y1 x0 y0 thirdpoint
+p1x p1y midpoint
+/p0y exch def
+/p0x exch def
+x2 y2 x3 y3 thirdpoint
+p2x p2y midpoint
+/p3y exch def
+/p3x exch def
+movetoNeeded { p0x p0y moveto } if
+p1x p1y p2x p2y p3x p3y curveto
+end
+} dup 0 17 dict put def
+
+/storexyn {
+/n exch def
+/y n array def
+/x n array def
+n 1 sub -1 0 {
+/i exch def
+y i 3 2 roll put
+x i 3 2 roll put
+} for
+} def
+
+/arrowhead {
+0 begin
+transform originalCTM itransform
+/taily exch def
+/tailx exch def
+transform originalCTM itransform
+/tipy exch def
+/tipx exch def
+/dy tipy taily sub def
+/dx tipx tailx sub def
+/angle dx 0 ne dy 0 ne or { dy dx atan } { 90 } ifelse def
+gsave
+originalCTM setmatrix
+tipx tipy translate
+angle rotate
+newpath
+arrowHeight neg arrowWidth 2 div moveto
+0 0 lineto
+arrowHeight neg arrowWidth 2 div neg lineto
+patternNone not {
+originalCTM setmatrix
+/padtip arrowHeight 2 exp 0.25 arrowWidth 2 exp mul add sqrt brushWidth mul
+arrowWidth div def
+/padtail brushWidth 2 div def
+tipx tipy translate
+angle rotate
+padtip 0 translate
+arrowHeight padtip add padtail add arrowHeight div dup scale
+arrowheadpath
+ifill
+} if
+brushNone not {
+originalCTM setmatrix
+tipx tipy translate
+angle rotate
+arrowheadpath
+istroke
+} if
+grestore
+end
+} dup 0 9 dict put def
+
+/arrowheadpath {
+newpath
+arrowHeight neg arrowWidth 2 div moveto
+0 0 lineto
+arrowHeight neg arrowWidth 2 div neg lineto
+} def
+
+/leftarrow {
+0 begin
+y exch get /taily exch def
+x exch get /tailx exch def
+y exch get /tipy exch def
+x exch get /tipx exch def
+brushLeftArrow { tipx tipy tailx taily arrowhead } if
+end
+} dup 0 4 dict put def
+
+/rightarrow {
+0 begin
+y exch get /tipy exch def
+x exch get /tipx exch def
+y exch get /taily exch def
+x exch get /tailx exch def
+brushRightArrow { tipx tipy tailx taily arrowhead } if
+end
+} dup 0 4 dict put def
+%%EndResource
+%%EndSetup
+
+%%Page: 1 1
+%%PageResources:
+%%PageBoundingBox: 101 194 489 610
+%%BeginPageSetup
+%I Idraw 8
+
+Begin
+%I b u
+%I cfg u
+%I cbg u
+%I f u
+%I p u
+%I t
+[ 1 0 0 1 0 0 ] concat
+/originalCTM matrix currentmatrix def
+/trueoriginalCTM matrix currentmatrix def
+%%EndPageSetup
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3590 10017
+3590 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3605 10017
+3605 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+3502 10017
+3487 9930
+3487 10017
+3707 10017
+3707 9930
+3693 10017
+6 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3546 9710
+3649 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+3971 9973
+3986 10017
+3986 9930
+3971 9973
+3942 10003
+3898 10017
+3854 10017
+3810 10003
+3781 9973
+3781 9944
+3795 9915
+3810 9900
+3839 9886
+3927 9856
+3957 9842
+3986 9812
+16 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+3781 9944
+3810 9915
+3839 9900
+3927 9871
+3957 9856
+3971 9842
+3986 9812
+3986 9754
+3957 9724
+3913 9710
+3869 9710
+3825 9724
+3795 9754
+3781 9798
+3781 9710
+3795 9754
+16 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4103 10017
+4103 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4118 10017
+4118 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+4059 10017
+4235 10017
+4279 10003
+4294 9988
+4308 9959
+4308 9915
+4294 9886
+4279 9871
+4235 9856
+4118 9856
+10 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+4235 10017
+4264 10003
+4279 9988
+4294 9959
+4294 9915
+4279 9886
+4264 9871
+4235 9856
+8 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4059 9710
+4162 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4646 9842
+4910 9842
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 11
+5437 10003
+5423 9988
+5437 9973
+5452 9988
+5437 10003
+5408 10017
+5364 10017
+5320 10003
+5291 9973
+5276 9930
+5276 9710
+11 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 5
+5364 10017
+5335 10003
+5305 9973
+5291 9930
+5291 9710
+5 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5437 9915
+5437 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5452 9915
+5452 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5232 9915
+5452 9915
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5232 9710
+5335 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5393 9710
+5496 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5599 9915
+5599 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5613 9915
+5613 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+5613 9871
+5643 9900
+5687 9915
+5716 9915
+5760 9900
+5775 9871
+5775 9710
+7 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+5716 9915
+5745 9900
+5760 9871
+5760 9710
+4 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5555 9915
+5613 9915
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5555 9710
+5657 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5716 9710
+5819 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 13
+5921 9886
+5921 9871
+5907 9871
+5907 9886
+5921 9900
+5951 9915
+6009 9915
+6039 9900
+6053 9886
+6068 9856
+6068 9754
+6083 9724
+6097 9710
+13 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 5
+6053 9886
+6053 9754
+6068 9724
+6097 9710
+6112 9710
+5 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 11
+6053 9856
+6039 9842
+5951 9827
+5907 9812
+5892 9783
+5892 9754
+5907 9724
+5951 9710
+5995 9710
+6024 9724
+6053 9754
+11 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+5951 9827
+5921 9812
+5907 9783
+5907 9754
+5921 9724
+5951 9710
+6 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6215 10017
+6215 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6229 10017
+6229 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6171 10017
+6229 10017
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6171 9710
+6273 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6361 9842
+6625 9842
+2 MLine
+End
+
+Begin %I Poly
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+6845 9915
+6889 9900
+6918 9871
+6933 9827
+6933 9798
+6918 9754
+6889 9724
+6845 9710
+6816 9710
+6772 9724
+6742 9754
+6728 9798
+6728 9827
+6742 9871
+6772 9900
+6816 9915
+16 Poly
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+6816 9915
+6786 9900
+6757 9871
+6742 9827
+6742 9798
+6757 9754
+6786 9724
+6816 9710
+8 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+6845 9710
+6874 9724
+6904 9754
+6918 9798
+6918 9827
+6904 9871
+6874 9900
+6845 9915
+8 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7050 9915
+7050 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7065 9915
+7065 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+7065 9827
+7080 9871
+7109 9900
+7138 9915
+7182 9915
+7197 9900
+7197 9886
+7182 9871
+7168 9886
+7182 9900
+10 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7006 9915
+7065 9915
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7006 9710
+7109 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7446 10017
+7446 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7461 10017
+7461 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 14
+7446 9871
+7417 9900
+7387 9915
+7358 9915
+7314 9900
+7285 9871
+7270 9827
+7270 9798
+7285 9754
+7314 9724
+7358 9710
+7387 9710
+7417 9724
+7446 9754
+14 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+7358 9915
+7329 9900
+7299 9871
+7285 9827
+7285 9798
+7299 9754
+7329 9724
+7358 9710
+8 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7402 10017
+7461 10017
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7446 9710
+7505 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 17
+7593 9827
+7769 9827
+7769 9856
+7754 9886
+7739 9900
+7710 9915
+7666 9915
+7622 9900
+7593 9871
+7578 9827
+7578 9798
+7593 9754
+7622 9724
+7666 9710
+7695 9710
+7739 9724
+7769 9754
+17 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+7754 9827
+7754 9871
+7739 9900
+3 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+7666 9915
+7637 9900
+7607 9871
+7593 9827
+7593 9798
+7607 9754
+7637 9724
+7666 9710
+8 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7886 9915
+7886 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7901 9915
+7901 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+7901 9827
+7915 9871
+7945 9900
+7974 9915
+8018 9915
+8033 9900
+8033 9886
+8018 9871
+8003 9886
+8018 9900
+10 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7842 9915
+7901 9915
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7842 9710
+7945 9710
+2 MLine
+End
+
+Begin %I Rect
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+2304 2304 9216 9216 Rect
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2059 2097
+2172 2097
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+2235 2147
+2247 2153
+2266 2172
+2266 2040
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2260 2166
+2260 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2235 2040
+2291 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+2361 2147
+2373 2153
+2392 2172
+2392 2040
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2386 2166
+2386 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2361 2040
+2417 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2524 2159
+2524 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2530 2172
+2530 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+2530 2172
+2461 2078
+2562 2078
+3 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2505 2040
+2549 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 9216
+2304 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2304 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2827 2097
+2940 2097
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+3003 2147
+3015 2153
+3034 2172
+3034 2040
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3028 2166
+3028 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3003 2040
+3059 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+3129 2147
+3141 2153
+3160 2172
+3160 2040
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3154 2166
+3154 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3129 2040
+3185 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 20
+3242 2147
+3248 2141
+3242 2134
+3235 2141
+3235 2147
+3242 2159
+3248 2166
+3267 2172
+3292 2172
+3311 2166
+3317 2159
+3323 2147
+3323 2134
+3317 2122
+3298 2109
+3267 2097
+3254 2090
+3242 2078
+3235 2059
+3235 2040
+20 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+3292 2172
+3304 2166
+3311 2159
+3317 2147
+3317 2134
+3311 2122
+3292 2109
+3267 2097
+8 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+3235 2053
+3242 2059
+3254 2059
+3286 2046
+3304 2046
+3317 2053
+3323 2059
+7 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+3254 2059
+3286 2040
+3311 2040
+3317 2046
+3323 2059
+3323 2072
+6 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3072 9216
+3072 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3072 2304
+3072 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3595 2097
+3708 2097
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+3771 2147
+3783 2153
+3802 2172
+3802 2040
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3796 2166
+3796 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3771 2040
+3827 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+3897 2147
+3909 2153
+3928 2172
+3928 2040
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3922 2166
+3922 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3897 2040
+3953 2040
+2 MLine
+End
+
+Begin %I Poly
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+4054 2172
+4072 2166
+4085 2147
+4091 2115
+4091 2097
+4085 2065
+4072 2046
+4054 2040
+4041 2040
+4022 2046
+4010 2065
+4003 2097
+4003 2115
+4010 2147
+4022 2166
+4041 2172
+16 Poly
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+4041 2172
+4029 2166
+4022 2159
+4016 2147
+4010 2115
+4010 2097
+4016 2065
+4022 2053
+4029 2046
+4041 2040
+10 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+4054 2040
+4066 2046
+4072 2053
+4079 2065
+4085 2097
+4085 2115
+4079 2147
+4072 2159
+4066 2166
+4054 2172
+10 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3840 9216
+3840 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3840 2304
+3840 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4363 2097
+4476 2097
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+4539 2147
+4551 2153
+4570 2172
+4570 2040
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4564 2166
+4564 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4539 2040
+4595 2040
+2 MLine
+End
+
+Begin %I Poly
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+4696 2172
+4715 2166
+4727 2147
+4734 2115
+4734 2097
+4727 2065
+4715 2046
+4696 2040
+4683 2040
+4665 2046
+4652 2065
+4646 2097
+4646 2115
+4652 2147
+4665 2166
+4683 2172
+16 Poly
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+4683 2172
+4671 2166
+4665 2159
+4658 2147
+4652 2115
+4652 2097
+4658 2065
+4665 2053
+4671 2046
+4683 2040
+10 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+4696 2040
+4709 2046
+4715 2053
+4721 2065
+4727 2097
+4727 2115
+4721 2147
+4715 2159
+4709 2166
+4696 2172
+10 MLine
+End
+
+Begin %I Poly
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 12
+4828 2172
+4847 2166
+4853 2153
+4853 2134
+4847 2122
+4828 2115
+4803 2115
+4784 2122
+4778 2134
+4778 2153
+4784 2166
+4803 2172
+12 Poly
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+4803 2172
+4790 2166
+4784 2153
+4784 2134
+4790 2122
+4803 2115
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+4828 2115
+4840 2122
+4847 2134
+4847 2153
+4840 2166
+4828 2172
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+4803 2115
+4784 2109
+4778 2103
+4771 2090
+4771 2065
+4778 2053
+4784 2046
+4803 2040
+4828 2040
+4847 2046
+4853 2053
+4859 2065
+4859 2090
+4853 2103
+4847 2109
+4828 2115
+16 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+4803 2115
+4790 2109
+4784 2103
+4778 2090
+4778 2065
+4784 2053
+4790 2046
+4803 2040
+8 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+4828 2040
+4840 2046
+4847 2053
+4853 2065
+4853 2090
+4847 2103
+4840 2109
+4828 2115
+8 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4608 9216
+4608 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4608 2304
+4608 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5131 2097
+5244 2097
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+5307 2147
+5319 2153
+5338 2172
+5338 2040
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5332 2166
+5332 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5307 2040
+5363 2040
+2 MLine
+End
+
+Begin %I Poly
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+5464 2172
+5483 2166
+5495 2147
+5502 2115
+5502 2097
+5495 2065
+5483 2046
+5464 2040
+5451 2040
+5433 2046
+5420 2065
+5414 2097
+5414 2115
+5420 2147
+5433 2166
+5451 2172
+16 Poly
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+5451 2172
+5439 2166
+5433 2159
+5426 2147
+5420 2115
+5420 2097
+5426 2065
+5433 2053
+5439 2046
+5451 2040
+10 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+5464 2040
+5477 2046
+5483 2053
+5489 2065
+5495 2097
+5495 2115
+5489 2147
+5483 2159
+5477 2166
+5464 2172
+10 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 28
+5615 2153
+5608 2147
+5615 2141
+5621 2147
+5621 2153
+5615 2166
+5602 2172
+5583 2172
+5565 2166
+5552 2153
+5546 2141
+5539 2115
+5539 2078
+5546 2059
+5558 2046
+5577 2040
+5590 2040
+5608 2046
+5621 2059
+5627 2078
+5627 2084
+5621 2103
+5608 2115
+5590 2122
+5583 2122
+5565 2115
+5552 2103
+5546 2084
+28 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 9
+5583 2172
+5571 2166
+5558 2153
+5552 2141
+5546 2115
+5546 2078
+5552 2059
+5565 2046
+5577 2040
+9 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+5590 2040
+5602 2046
+5615 2059
+5621 2078
+5621 2084
+5615 2103
+5602 2115
+5590 2122
+8 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5376 9216
+5376 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5376 2304
+5376 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5899 2097
+6012 2097
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+6075 2147
+6087 2153
+6106 2172
+6106 2040
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6100 2166
+6100 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6075 2040
+6131 2040
+2 MLine
+End
+
+Begin %I Poly
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+6232 2172
+6251 2166
+6263 2147
+6270 2115
+6270 2097
+6263 2065
+6251 2046
+6232 2040
+6219 2040
+6201 2046
+6188 2065
+6182 2097
+6182 2115
+6188 2147
+6201 2166
+6219 2172
+16 Poly
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+6219 2172
+6207 2166
+6201 2159
+6194 2147
+6188 2115
+6188 2097
+6194 2065
+6201 2053
+6207 2046
+6219 2040
+10 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+6232 2040
+6245 2046
+6251 2053
+6257 2065
+6263 2097
+6263 2115
+6257 2147
+6251 2159
+6245 2166
+6232 2172
+10 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6364 2159
+6364 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6370 2172
+6370 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+6370 2172
+6301 2078
+6402 2078
+3 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6345 2040
+6389 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6144 9216
+6144 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6144 2304
+6144 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6667 2097
+6780 2097
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+6843 2147
+6855 2153
+6874 2172
+6874 2040
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6868 2166
+6868 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6843 2040
+6899 2040
+2 MLine
+End
+
+Begin %I Poly
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+7000 2172
+7019 2166
+7031 2147
+7038 2115
+7038 2097
+7031 2065
+7019 2046
+7000 2040
+6987 2040
+6969 2046
+6956 2065
+6950 2097
+6950 2115
+6956 2147
+6969 2166
+6987 2172
+16 Poly
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+6987 2172
+6975 2166
+6969 2159
+6962 2147
+6956 2115
+6956 2097
+6962 2065
+6969 2053
+6975 2046
+6987 2040
+10 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+7000 2040
+7013 2046
+7019 2053
+7025 2065
+7031 2097
+7031 2115
+7025 2147
+7019 2159
+7013 2166
+7000 2172
+10 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 20
+7082 2147
+7088 2141
+7082 2134
+7075 2141
+7075 2147
+7082 2159
+7088 2166
+7107 2172
+7132 2172
+7151 2166
+7157 2159
+7163 2147
+7163 2134
+7157 2122
+7138 2109
+7107 2097
+7094 2090
+7082 2078
+7075 2059
+7075 2040
+20 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+7132 2172
+7144 2166
+7151 2159
+7157 2147
+7157 2134
+7151 2122
+7132 2109
+7107 2097
+8 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+7075 2053
+7082 2059
+7094 2059
+7126 2046
+7144 2046
+7157 2053
+7163 2059
+7 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+7094 2059
+7126 2040
+7151 2040
+7157 2046
+7163 2059
+7163 2072
+6 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6912 9216
+6912 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6912 2304
+6912 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7435 2097
+7548 2097
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+7611 2147
+7623 2153
+7642 2172
+7642 2040
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7636 2166
+7636 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7611 2040
+7667 2040
+2 MLine
+End
+
+Begin %I Poly
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+7768 2172
+7787 2166
+7799 2147
+7806 2115
+7806 2097
+7799 2065
+7787 2046
+7768 2040
+7755 2040
+7737 2046
+7724 2065
+7718 2097
+7718 2115
+7724 2147
+7737 2166
+7755 2172
+16 Poly
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+7755 2172
+7743 2166
+7737 2159
+7730 2147
+7724 2115
+7724 2097
+7730 2065
+7737 2053
+7743 2046
+7755 2040
+10 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+7768 2040
+7781 2046
+7787 2053
+7793 2065
+7799 2097
+7799 2115
+7793 2147
+7787 2159
+7781 2166
+7768 2172
+10 MLine
+End
+
+Begin %I Poly
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+7894 2172
+7912 2166
+7925 2147
+7931 2115
+7931 2097
+7925 2065
+7912 2046
+7894 2040
+7881 2040
+7862 2046
+7850 2065
+7843 2097
+7843 2115
+7850 2147
+7862 2166
+7881 2172
+16 Poly
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+7881 2172
+7869 2166
+7862 2159
+7856 2147
+7850 2115
+7850 2097
+7856 2065
+7862 2053
+7869 2046
+7881 2040
+10 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+7894 2040
+7906 2046
+7912 2053
+7919 2065
+7925 2097
+7925 2115
+7919 2147
+7912 2159
+7906 2166
+7894 2172
+10 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7680 9216
+7680 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7680 2304
+7680 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8266 2097
+8379 2097
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 28
+8505 2128
+8498 2109
+8486 2097
+8467 2090
+8461 2090
+8442 2097
+8429 2109
+8423 2128
+8423 2134
+8429 2153
+8442 2166
+8461 2172
+8473 2172
+8492 2166
+8505 2153
+8511 2134
+8511 2097
+8505 2072
+8498 2059
+8486 2046
+8467 2040
+8448 2040
+8435 2046
+8429 2059
+8429 2065
+8435 2072
+8442 2065
+8435 2059
+28 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+8461 2090
+8448 2097
+8435 2109
+8429 2128
+8429 2134
+8435 2153
+8448 2166
+8461 2172
+8 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 9
+8473 2172
+8486 2166
+8498 2153
+8505 2134
+8505 2097
+8498 2072
+8492 2059
+8479 2046
+8467 2040
+9 MLine
+End
+
+Begin %I Poly
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 12
+8605 2172
+8624 2166
+8630 2153
+8630 2134
+8624 2122
+8605 2115
+8580 2115
+8561 2122
+8555 2134
+8555 2153
+8561 2166
+8580 2172
+12 Poly
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+8580 2172
+8567 2166
+8561 2153
+8561 2134
+8567 2122
+8580 2115
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+8605 2115
+8618 2122
+8624 2134
+8624 2153
+8618 2166
+8605 2172
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+8580 2115
+8561 2109
+8555 2103
+8549 2090
+8549 2065
+8555 2053
+8561 2046
+8580 2040
+8605 2040
+8624 2046
+8630 2053
+8637 2065
+8637 2090
+8630 2103
+8624 2109
+8605 2115
+16 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+8580 2115
+8567 2109
+8561 2103
+8555 2090
+8555 2065
+8561 2053
+8567 2046
+8580 2040
+8 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+8605 2040
+8618 2046
+8624 2053
+8630 2065
+8630 2090
+8624 2103
+8618 2109
+8605 2115
+8 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8448 9216
+8448 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8448 2304
+8448 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9034 2097
+9147 2097
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 28
+9273 2128
+9266 2109
+9254 2097
+9235 2090
+9229 2090
+9210 2097
+9197 2109
+9191 2128
+9191 2134
+9197 2153
+9210 2166
+9229 2172
+9241 2172
+9260 2166
+9273 2153
+9279 2134
+9279 2097
+9273 2072
+9266 2059
+9254 2046
+9235 2040
+9216 2040
+9203 2046
+9197 2059
+9197 2065
+9203 2072
+9210 2065
+9203 2059
+28 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+9229 2090
+9216 2097
+9203 2109
+9197 2128
+9197 2134
+9203 2153
+9216 2166
+9229 2172
+8 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 9
+9241 2172
+9254 2166
+9266 2153
+9273 2134
+9273 2097
+9266 2072
+9260 2059
+9247 2046
+9235 2040
+9 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 28
+9392 2153
+9386 2147
+9392 2141
+9398 2147
+9398 2153
+9392 2166
+9379 2172
+9361 2172
+9342 2166
+9329 2153
+9323 2141
+9317 2115
+9317 2078
+9323 2059
+9335 2046
+9354 2040
+9367 2040
+9386 2046
+9398 2059
+9405 2078
+9405 2084
+9398 2103
+9386 2115
+9367 2122
+9361 2122
+9342 2115
+9329 2103
+9323 2084
+28 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 9
+9361 2172
+9348 2166
+9335 2153
+9329 2141
+9323 2115
+9323 2078
+9329 2059
+9342 2046
+9354 2040
+9 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+9367 2040
+9379 2046
+9392 2059
+9398 2078
+9398 2084
+9392 2103
+9379 2115
+9367 2122
+8 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 9216
+9216 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2304
+9216 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 9216
+2304 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2304 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2688 9216
+2688 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2688 2304
+2688 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3072 9216
+3072 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3072 2304
+3072 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3456 9216
+3456 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3456 2304
+3456 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3840 9216
+3840 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3840 2304
+3840 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4224 9216
+4224 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4224 2304
+4224 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4608 9216
+4608 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4608 2304
+4608 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4992 9216
+4992 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4992 2304
+4992 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5376 9216
+5376 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5376 2304
+5376 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5760 9216
+5760 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5760 2304
+5760 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6144 9216
+6144 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6144 2304
+6144 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6528 9216
+6528 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6528 2304
+6528 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6912 9216
+6912 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6912 2304
+6912 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7296 9216
+7296 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7296 2304
+7296 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7680 9216
+7680 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7680 2304
+7680 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8064 9216
+8064 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8064 2304
+8064 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8448 9216
+8448 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8448 2304
+8448 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8832 9216
+8832 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8832 2304
+8832 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 9216
+9216 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2304
+9216 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+1974 2354
+1980 2348
+1974 2342
+1968 2348
+1968 2354
+1974 2367
+1980 2373
+1999 2379
+2024 2379
+2043 2373
+2050 2361
+2050 2342
+2043 2329
+2024 2323
+2006 2323
+15 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2024 2379
+2037 2373
+2043 2361
+2043 2342
+2037 2329
+2024 2323
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+2024 2323
+2037 2317
+2050 2304
+2056 2291
+2056 2273
+2050 2260
+2043 2254
+2024 2247
+1999 2247
+1980 2254
+1974 2260
+1968 2273
+1968 2279
+1974 2285
+1980 2279
+1974 2273
+16 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2043 2310
+2050 2291
+2050 2273
+2043 2260
+2037 2254
+2024 2247
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 20
+2100 2354
+2106 2348
+2100 2342
+2093 2348
+2093 2354
+2100 2367
+2106 2373
+2125 2379
+2150 2379
+2169 2373
+2175 2367
+2181 2354
+2181 2342
+2175 2329
+2156 2317
+2125 2304
+2112 2298
+2100 2285
+2093 2266
+2093 2247
+20 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+2150 2379
+2163 2373
+2169 2367
+2175 2354
+2175 2342
+2169 2329
+2150 2317
+2125 2304
+8 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+2093 2260
+2100 2266
+2112 2266
+2144 2254
+2163 2254
+2175 2260
+2181 2266
+7 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2112 2266
+2144 2247
+2169 2247
+2175 2254
+2181 2266
+2181 2279
+6 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2304
+9078 2304
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2442 2304
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+1974 3506
+1980 3500
+1974 3494
+1968 3500
+1968 3506
+1974 3519
+1980 3525
+1999 3531
+2024 3531
+2043 3525
+2050 3513
+2050 3494
+2043 3481
+2024 3475
+2006 3475
+15 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2024 3531
+2037 3525
+2043 3513
+2043 3494
+2037 3481
+2024 3475
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+2024 3475
+2037 3469
+2050 3456
+2056 3443
+2056 3425
+2050 3412
+2043 3406
+2024 3399
+1999 3399
+1980 3406
+1974 3412
+1968 3425
+1968 3431
+1974 3437
+1980 3431
+1974 3425
+16 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2043 3462
+2050 3443
+2050 3425
+2043 3412
+2037 3406
+2024 3399
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+2100 3506
+2106 3500
+2100 3494
+2093 3500
+2093 3506
+2100 3519
+2106 3525
+2125 3531
+2150 3531
+2169 3525
+2175 3513
+2175 3494
+2169 3481
+2150 3475
+2131 3475
+15 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2150 3531
+2163 3525
+2169 3513
+2169 3494
+2163 3481
+2150 3475
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+2150 3475
+2163 3469
+2175 3456
+2181 3443
+2181 3425
+2175 3412
+2169 3406
+2150 3399
+2125 3399
+2106 3406
+2100 3412
+2093 3425
+2093 3431
+2100 3437
+2106 3431
+2100 3425
+16 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2169 3462
+2175 3443
+2175 3425
+2169 3412
+2163 3406
+2150 3399
+6 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 3456
+9078 3456
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3456
+2442 3456
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+1974 4658
+1980 4652
+1974 4646
+1968 4652
+1968 4658
+1974 4671
+1980 4677
+1999 4683
+2024 4683
+2043 4677
+2050 4665
+2050 4646
+2043 4633
+2024 4627
+2006 4627
+15 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2024 4683
+2037 4677
+2043 4665
+2043 4646
+2037 4633
+2024 4627
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+2024 4627
+2037 4621
+2050 4608
+2056 4595
+2056 4577
+2050 4564
+2043 4558
+2024 4551
+1999 4551
+1980 4558
+1974 4564
+1968 4577
+1968 4583
+1974 4589
+1980 4583
+1974 4577
+16 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2043 4614
+2050 4595
+2050 4577
+2043 4564
+2037 4558
+2024 4551
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2150 4671
+2150 4551
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2156 4683
+2156 4551
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+2156 4683
+2087 4589
+2188 4589
+3 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2131 4551
+2175 4551
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4608
+9078 4608
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4608
+2442 4608
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+1974 5810
+1980 5804
+1974 5798
+1968 5804
+1968 5810
+1974 5823
+1980 5829
+1999 5835
+2024 5835
+2043 5829
+2050 5817
+2050 5798
+2043 5785
+2024 5779
+2006 5779
+15 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2024 5835
+2037 5829
+2043 5817
+2043 5798
+2037 5785
+2024 5779
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+2024 5779
+2037 5773
+2050 5760
+2056 5747
+2056 5729
+2050 5716
+2043 5710
+2024 5703
+1999 5703
+1980 5710
+1974 5716
+1968 5729
+1968 5735
+1974 5741
+1980 5735
+1974 5729
+16 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2043 5766
+2050 5747
+2050 5729
+2043 5716
+2037 5710
+2024 5703
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2106 5835
+2093 5773
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 19
+2093 5773
+2106 5785
+2125 5791
+2144 5791
+2163 5785
+2175 5773
+2181 5754
+2181 5741
+2175 5722
+2163 5710
+2144 5703
+2125 5703
+2106 5710
+2100 5716
+2093 5729
+2093 5735
+2100 5741
+2106 5735
+2100 5729
+19 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+2144 5791
+2156 5785
+2169 5773
+2175 5754
+2175 5741
+2169 5722
+2156 5710
+2144 5703
+8 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2106 5835
+2169 5835
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+2106 5829
+2137 5829
+2169 5835
+3 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5760
+9078 5760
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5760
+2442 5760
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+1974 6962
+1980 6956
+1974 6950
+1968 6956
+1968 6962
+1974 6975
+1980 6981
+1999 6987
+2024 6987
+2043 6981
+2050 6969
+2050 6950
+2043 6937
+2024 6931
+2006 6931
+15 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2024 6987
+2037 6981
+2043 6969
+2043 6950
+2037 6937
+2024 6931
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+2024 6931
+2037 6925
+2050 6912
+2056 6899
+2056 6881
+2050 6868
+2043 6862
+2024 6855
+1999 6855
+1980 6862
+1974 6868
+1968 6881
+1968 6887
+1974 6893
+1980 6887
+1974 6881
+16 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2043 6918
+2050 6899
+2050 6881
+2043 6868
+2037 6862
+2024 6855
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 28
+2169 6969
+2163 6962
+2169 6956
+2175 6962
+2175 6969
+2169 6981
+2156 6987
+2137 6987
+2119 6981
+2106 6969
+2100 6956
+2093 6931
+2093 6893
+2100 6874
+2112 6862
+2131 6855
+2144 6855
+2163 6862
+2175 6874
+2181 6893
+2181 6899
+2175 6918
+2163 6931
+2144 6937
+2137 6937
+2119 6931
+2106 6918
+2100 6899
+28 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 9
+2137 6987
+2125 6981
+2112 6969
+2106 6956
+2100 6931
+2100 6893
+2106 6874
+2119 6862
+2131 6855
+9 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+2144 6855
+2156 6862
+2169 6874
+2175 6893
+2175 6899
+2169 6918
+2156 6931
+2144 6937
+8 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 6912
+9078 6912
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 6912
+2442 6912
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+1974 8114
+1980 8108
+1974 8102
+1968 8108
+1968 8114
+1974 8127
+1980 8133
+1999 8139
+2024 8139
+2043 8133
+2050 8121
+2050 8102
+2043 8089
+2024 8083
+2006 8083
+15 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2024 8139
+2037 8133
+2043 8121
+2043 8102
+2037 8089
+2024 8083
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+2024 8083
+2037 8077
+2050 8064
+2056 8051
+2056 8033
+2050 8020
+2043 8014
+2024 8007
+1999 8007
+1980 8014
+1974 8020
+1968 8033
+1968 8039
+1974 8045
+1980 8039
+1974 8033
+16 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2043 8070
+2050 8051
+2050 8033
+2043 8020
+2037 8014
+2024 8007
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2093 8139
+2093 8102
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+2093 8114
+2100 8127
+2112 8139
+2125 8139
+2156 8121
+2169 8121
+2175 8127
+2181 8139
+8 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+2100 8127
+2112 8133
+2125 8133
+2156 8121
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+2181 8139
+2181 8121
+2175 8102
+2150 8070
+2144 8058
+2137 8039
+2137 8007
+7 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 5
+2175 8102
+2144 8070
+2137 8058
+2131 8039
+2131 8007
+5 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 8064
+9078 8064
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 8064
+2442 8064
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+1974 9266
+1980 9260
+1974 9254
+1968 9260
+1968 9266
+1974 9279
+1980 9285
+1999 9291
+2024 9291
+2043 9285
+2050 9273
+2050 9254
+2043 9241
+2024 9235
+2006 9235
+15 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2024 9291
+2037 9285
+2043 9273
+2043 9254
+2037 9241
+2024 9235
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+2024 9235
+2037 9229
+2050 9216
+2056 9203
+2056 9185
+2050 9172
+2043 9166
+2024 9159
+1999 9159
+1980 9166
+1974 9172
+1968 9185
+1968 9191
+1974 9197
+1980 9191
+1974 9185
+16 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2043 9222
+2050 9203
+2050 9185
+2043 9172
+2037 9166
+2024 9159
+6 MLine
+End
+
+Begin %I Poly
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 12
+2150 9291
+2169 9285
+2175 9273
+2175 9254
+2169 9241
+2150 9235
+2125 9235
+2106 9241
+2100 9254
+2100 9273
+2106 9285
+2125 9291
+12 Poly
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2125 9291
+2112 9285
+2106 9273
+2106 9254
+2112 9241
+2125 9235
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2150 9235
+2163 9241
+2169 9254
+2169 9273
+2163 9285
+2150 9291
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+2125 9235
+2106 9229
+2100 9222
+2093 9210
+2093 9185
+2100 9172
+2106 9166
+2125 9159
+2150 9159
+2169 9166
+2175 9172
+2181 9185
+2181 9210
+2175 9222
+2169 9229
+2150 9235
+16 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+2125 9235
+2112 9229
+2106 9222
+2100 9210
+2100 9185
+2106 9172
+2112 9166
+2125 9159
+8 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+2150 9159
+2163 9166
+2169 9172
+2175 9185
+2175 9210
+2169 9222
+2163 9229
+2150 9235
+8 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 9216
+9078 9216
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 9216
+2442 9216
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2304
+9161 2304
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2359 2304
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2880
+9161 2880
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2880
+2359 2880
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 3456
+9161 3456
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3456
+2359 3456
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4032
+9161 4032
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4032
+2359 4032
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4608
+9161 4608
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4608
+2359 4608
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5184
+9161 5184
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5184
+2359 5184
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5760
+9161 5760
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5760
+2359 5760
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 6336
+9161 6336
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 6336
+2359 6336
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 6912
+9161 6912
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 6912
+2359 6912
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 7488
+9161 7488
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 7488
+2359 7488
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 8064
+9161 8064
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 8064
+2359 8064
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 8640
+9161 8640
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 8640
+2359 8640
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 9216
+9161 9216
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 9216
+2359 9216
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4384 1906
+4384 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4390 1906
+4390 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4365 1906
+4390 1906
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4365 1774
+4409 1774
+2 MLine
+End
+
+Begin %I Poly
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+4491 1862
+4510 1856
+4522 1843
+4528 1824
+4528 1812
+4522 1793
+4510 1780
+4491 1774
+4478 1774
+4459 1780
+4447 1793
+4440 1812
+4440 1824
+4447 1843
+4459 1856
+4478 1862
+16 Poly
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+4478 1862
+4466 1856
+4453 1843
+4447 1824
+4447 1812
+4453 1793
+4466 1780
+4478 1774
+8 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+4491 1774
+4503 1780
+4516 1793
+4522 1812
+4522 1824
+4516 1843
+4503 1856
+4491 1862
+8 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4579 1862
+4579 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4585 1862
+4585 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+4585 1843
+4598 1856
+4616 1862
+4629 1862
+4648 1856
+4654 1843
+4654 1774
+7 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+4629 1862
+4642 1856
+4648 1843
+4648 1774
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4560 1862
+4585 1862
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4560 1774
+4604 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4629 1774
+4673 1774
+2 MLine
+End
+
+Begin %I Poly
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+4748 1862
+4761 1856
+4767 1849
+4773 1837
+4773 1824
+4767 1812
+4761 1805
+4748 1799
+4736 1799
+4723 1805
+4717 1812
+4711 1824
+4711 1837
+4717 1849
+4723 1856
+4736 1862
+16 Poly
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+4723 1856
+4717 1843
+4717 1818
+4723 1805
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+4761 1805
+4767 1818
+4767 1843
+4761 1856
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 5
+4767 1849
+4773 1856
+4786 1862
+4786 1856
+4773 1856
+5 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 9
+4717 1812
+4711 1805
+4704 1793
+4704 1787
+4711 1774
+4729 1768
+4761 1768
+4780 1761
+4786 1755
+9 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+4704 1787
+4711 1780
+4729 1774
+4761 1774
+4780 1768
+4786 1755
+4786 1749
+4780 1736
+4761 1730
+4723 1730
+4704 1736
+4698 1749
+4698 1755
+4704 1768
+4723 1774
+15 MLine
+End
+
+Begin %I Poly
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+4843 1900
+4836 1893
+4830 1900
+4836 1906
+4 Poly
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4836 1862
+4836 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4843 1862
+4843 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4817 1862
+4843 1862
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4817 1774
+4861 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+4905 1906
+4905 1799
+4912 1780
+4924 1774
+4937 1774
+4949 1780
+4956 1793
+7 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+4912 1906
+4912 1799
+4918 1780
+4924 1774
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4887 1862
+4937 1862
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+5000 1862
+5000 1793
+5006 1780
+5025 1774
+5037 1774
+5056 1780
+5069 1793
+7 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+5006 1862
+5006 1793
+5012 1780
+5025 1774
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5069 1862
+5069 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5075 1862
+5075 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4981 1862
+5006 1862
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5050 1862
+5075 1862
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5069 1774
+5094 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5201 1906
+5201 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5207 1906
+5207 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 14
+5201 1843
+5188 1856
+5176 1862
+5163 1862
+5144 1856
+5132 1843
+5125 1824
+5125 1812
+5132 1793
+5144 1780
+5163 1774
+5176 1774
+5188 1780
+5201 1793
+14 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+5163 1862
+5150 1856
+5138 1843
+5132 1824
+5132 1812
+5138 1793
+5150 1780
+5163 1774
+8 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5182 1906
+5207 1906
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5201 1774
+5226 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 17
+5264 1824
+5339 1824
+5339 1837
+5333 1849
+5326 1856
+5314 1862
+5295 1862
+5276 1856
+5264 1843
+5257 1824
+5257 1812
+5264 1793
+5276 1780
+5295 1774
+5308 1774
+5326 1780
+5339 1793
+17 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+5333 1824
+5333 1843
+5326 1856
+3 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+5295 1862
+5282 1856
+5270 1843
+5264 1824
+5264 1812
+5270 1793
+5282 1780
+5295 1774
+8 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+5528 1931
+5515 1918
+5502 1900
+5490 1875
+5484 1843
+5484 1818
+5490 1787
+5502 1761
+5515 1743
+5528 1730
+10 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+5515 1918
+5502 1893
+5496 1875
+5490 1843
+5490 1818
+5496 1787
+5502 1768
+5515 1743
+8 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5571 1831
+5685 1831
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5842 1862
+5842 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5848 1862
+5848 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+5848 1843
+5861 1856
+5879 1862
+5892 1862
+5911 1856
+5917 1843
+5917 1774
+7 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+5892 1862
+5905 1856
+5911 1843
+5911 1774
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+5917 1843
+5930 1856
+5949 1862
+5961 1862
+5980 1856
+5986 1843
+5986 1774
+7 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+5961 1862
+5974 1856
+5980 1843
+5980 1774
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5823 1862
+5848 1862
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5823 1774
+5867 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5892 1774
+5936 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5961 1774
+6005 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 17
+6043 1824
+6118 1824
+6118 1837
+6112 1849
+6106 1856
+6093 1862
+6074 1862
+6055 1856
+6043 1843
+6036 1824
+6036 1812
+6043 1793
+6055 1780
+6074 1774
+6087 1774
+6106 1780
+6118 1793
+17 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+6112 1824
+6112 1843
+6106 1856
+3 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+6074 1862
+6062 1856
+6049 1843
+6043 1824
+6043 1812
+6049 1793
+6062 1780
+6074 1774
+8 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 13
+6168 1849
+6168 1843
+6162 1843
+6162 1849
+6168 1856
+6181 1862
+6206 1862
+6219 1856
+6225 1849
+6231 1837
+6231 1793
+6238 1780
+6244 1774
+13 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 5
+6225 1849
+6225 1793
+6231 1780
+6244 1774
+6250 1774
+5 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 11
+6225 1837
+6219 1831
+6181 1824
+6162 1818
+6156 1805
+6156 1793
+6162 1780
+6181 1774
+6200 1774
+6212 1780
+6225 1793
+11 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+6181 1824
+6168 1818
+6162 1805
+6162 1793
+6168 1780
+6181 1774
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6294 1862
+6294 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6300 1862
+6300 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+6300 1843
+6313 1856
+6332 1862
+6344 1862
+6363 1856
+6370 1843
+6370 1774
+7 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+6344 1862
+6357 1856
+6363 1843
+6363 1774
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6275 1862
+6300 1862
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6275 1774
+6319 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6344 1774
+6388 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+6483 1849
+6489 1862
+6489 1837
+6483 1849
+6476 1856
+6464 1862
+6439 1862
+6426 1856
+6420 1849
+6420 1837
+6426 1831
+6439 1824
+6470 1812
+6483 1805
+6489 1799
+15 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+6420 1843
+6426 1837
+6439 1831
+6470 1818
+6483 1812
+6489 1805
+6489 1787
+6483 1780
+6470 1774
+6445 1774
+6432 1780
+6426 1787
+6420 1799
+6420 1774
+6426 1787
+15 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6633 1862
+6659 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6640 1862
+6659 1793
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6684 1862
+6659 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6684 1862
+6709 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6690 1862
+6709 1793
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6734 1862
+6709 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6615 1862
+6659 1862
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6715 1862
+6753 1862
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 17
+6784 1824
+6860 1824
+6860 1837
+6853 1849
+6847 1856
+6835 1862
+6816 1862
+6797 1856
+6784 1843
+6778 1824
+6778 1812
+6784 1793
+6797 1780
+6816 1774
+6828 1774
+6847 1780
+6860 1793
+17 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+6853 1824
+6853 1843
+6847 1856
+3 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+6816 1862
+6803 1856
+6791 1843
+6784 1824
+6784 1812
+6791 1793
+6803 1780
+6816 1774
+8 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+6960 1849
+6966 1862
+6966 1837
+6960 1849
+6954 1856
+6941 1862
+6916 1862
+6904 1856
+6897 1849
+6897 1837
+6904 1831
+6916 1824
+6948 1812
+6960 1805
+6966 1799
+15 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+6897 1843
+6904 1837
+6916 1831
+6948 1818
+6960 1812
+6966 1805
+6966 1787
+6960 1780
+6948 1774
+6922 1774
+6910 1780
+6904 1787
+6897 1799
+6897 1774
+6904 1787
+15 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+7017 1906
+7017 1799
+7023 1780
+7036 1774
+7048 1774
+7061 1780
+7067 1793
+7 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+7023 1906
+7023 1799
+7029 1780
+7036 1774
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6998 1862
+7048 1862
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+7098 1931
+7111 1918
+7124 1900
+7136 1875
+7142 1843
+7142 1818
+7136 1787
+7124 1761
+7111 1743
+7098 1730
+10 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+7111 1918
+7124 1893
+7130 1875
+7136 1843
+7136 1818
+7130 1787
+7124 1768
+7111 1743
+8 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1672 5370
+1804 5370
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1672 5377
+1804 5377
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1672 5352
+1672 5377
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1804 5352
+1804 5396
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 13
+1729 5440
+1735 5440
+1735 5433
+1729 5433
+1723 5440
+1716 5452
+1716 5477
+1723 5490
+1729 5496
+1742 5502
+1786 5502
+1798 5509
+1804 5515
+13 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 5
+1729 5496
+1786 5496
+1798 5502
+1804 5515
+1804 5521
+5 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 11
+1742 5496
+1748 5490
+1754 5452
+1760 5433
+1773 5427
+1786 5427
+1798 5433
+1804 5452
+1804 5471
+1798 5484
+1786 5496
+11 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+1754 5452
+1760 5440
+1773 5433
+1786 5433
+1798 5440
+1804 5452
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+1672 5565
+1779 5565
+1798 5571
+1804 5584
+1804 5597
+1798 5609
+1786 5615
+7 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+1672 5571
+1779 5571
+1798 5578
+1804 5584
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1716 5546
+1716 5597
+2 MLine
+End
+
+Begin %I Poly
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+1679 5666
+1685 5659
+1679 5653
+1672 5659
+4 Poly
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1716 5659
+1804 5659
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1716 5666
+1804 5666
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1716 5641
+1716 5666
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1804 5641
+1804 5685
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+1672 5729
+1779 5729
+1798 5735
+1804 5747
+1804 5760
+1798 5773
+1786 5779
+7 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+1672 5735
+1779 5735
+1798 5741
+1804 5747
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1716 5710
+1716 5760
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+1716 5823
+1786 5823
+1798 5829
+1804 5848
+1804 5861
+1798 5879
+1786 5892
+7 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+1716 5829
+1786 5829
+1798 5835
+1804 5848
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1716 5892
+1804 5892
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1716 5898
+1804 5898
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1716 5804
+1716 5829
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1716 5873
+1716 5898
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1804 5892
+1804 5917
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1672 6024
+1804 6024
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1672 6030
+1804 6030
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 14
+1735 6024
+1723 6011
+1716 5999
+1716 5986
+1723 5967
+1735 5955
+1754 5949
+1767 5949
+1786 5955
+1798 5967
+1804 5986
+1804 5999
+1798 6011
+1786 6024
+14 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+1716 5986
+1723 5974
+1735 5961
+1754 5955
+1767 5955
+1786 5961
+1798 5974
+1804 5986
+8 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1672 6005
+1672 6030
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1804 6024
+1804 6049
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 17
+1754 6087
+1754 6162
+1742 6162
+1729 6156
+1723 6150
+1716 6137
+1716 6118
+1723 6099
+1735 6087
+1754 6080
+1767 6080
+1786 6087
+1798 6099
+1804 6118
+1804 6131
+1798 6150
+1786 6162
+17 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+1754 6156
+1735 6156
+1723 6150
+3 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+1716 6118
+1723 6106
+1735 6093
+1754 6087
+1767 6087
+1786 6093
+1798 6106
+1804 6118
+8 MLine
+End
+
+Begin %I Circ
+[1.08 0 0 1.08 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+5395 6543 32 Circ
+End
+
+Begin %I Circ
+[1.08 0 0 1.08 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+6451 5080 32 Circ
+End
+
+Begin %I Circ
+[1.08 0 0 1.08 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+8920 3214 32 Circ
+End
+
+Begin %I Circ
+[1.08 0 0 1.08 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+5084 2696 32 Circ
+End
+
+Begin %I Circ
+[1.08 0 0 1.08 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+3045 4078 32 Circ
+End
+
+Begin %I Circ
+[1.08 0 0 1.08 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+4324 6359 32 Circ
+End
+
+Begin %I Circ
+[1.08 0 0 1.08 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+4385 8467 32 Circ
+End
+
+Begin %I Circ
+[1.08 0 0 1.08 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+4658 8398 32 Circ
+End
+
+Begin %I Circ
+[1.08 0 0 1.08 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+4669 5933 32 Circ
+End
+
+Begin %I Circ
+[1.08 0 0 1.08 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+5138 5898 32 Circ
+End
+
+Begin %I Circ
+[1.08 0 0 1.08 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+5268 6785 32 Circ
+End
+
+Begin %I Circ
+[1.08 0 0 1.08 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+5407 6647 32 Circ
+End
+
+Begin %I Circ
+[1.08 0 0 1.08 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+5395 6543 32 Circ
+End
+
+Begin %I Poly
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 12
+5407 6647
+5268 6785
+5138 5898
+4669 5933
+4658 8398
+4385 8467
+4324 6359
+3045 4078
+5084 2696
+8920 3214
+6451 5080
+5395 6543
+12 Poly
+End
+
+%%PageTrailer
+End %I eop
+showpage
+
+%%Trailer
+end
+%%EOF
diff --git a/gsl-1.9/doc/fit-exp.eps b/gsl-1.9/doc/fit-exp.eps
new file mode 100644
index 0000000..da25ffe
--- /dev/null
+++ b/gsl-1.9/doc/fit-exp.eps
@@ -0,0 +1,767 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: tmp.eps
+%%Creator: gnuplot 3.5 (pre 3.6) patchlevel beta 347
+%%CreationDate: Sun Sep 24 21:06:38 2000
+%%DocumentFonts: (atend)
+%%BoundingBox: 50 50 410 302
+%%Orientation: Portrait
+%%EndComments
+/gnudict 120 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+/vshift -46 def
+/dl {10 mul} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke gnulinewidth 2 mul setlinewidth } def
+/AL { stroke gnulinewidth 2 div setlinewidth } def
+/UL { gnulinewidth mul /userlinewidth exch def } def
+/PL { stroke userlinewidth setlinewidth } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 dl 2 dl] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 1 0 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
+/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/Pnt { stroke [] 0 setdash
+ gsave 1 setlinecap M 0 0 V stroke grestore } def
+/Dia { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt } def
+/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt } def
+/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt } def
+/Star { 2 copy Pls Crs } def
+/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill } def
+/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill } def
+/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt } def
+/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill } def
+/Pent { stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt } def
+/PentF { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore } def
+/Circle { stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt } def
+/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
+/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def
+/C1 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C2 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C3 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C4 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C5 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc } bind def
+/C6 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C7 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C8 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C9 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C11 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C12 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C13 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C14 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc } bind def
+/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath } bind def
+/Square { dup Rec } bind def
+/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
+/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
+/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
+/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
+/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill
+ Bsquare } bind def
+/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
+/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare } bind def
+/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare } bind def
+/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
+/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare } bind def
+/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
+/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
+/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
+/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
+/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
+/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
+/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
+/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
+/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
+/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
+/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
+/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
+/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
+/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
+/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
+/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
+/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
+/DiaE { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke } def
+/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke } def
+/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke } def
+/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke } def
+/PentE { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore } def
+/CircE { stroke [] 0 setdash
+ hpt 0 360 arc stroke } def
+/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def
+/DiaW { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke } def
+/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke } def
+/TriUW { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke } def
+/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke } def
+/PentW { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore } def
+/CircW { stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke } def
+/BoxFill { gsave Rec 1 setgray fill grestore } def
+end
+%%EndProlog
+gnudict begin
+gsave
+50 50 translate
+0.050 0.050 scale
+0 setgray
+newpath
+(Helvetica) findfont 140 scalefont setfont
+1.000 UL
+LTb
+392 420 M
+63 0 V
+6577 0 R
+-63 0 V
+308 420 M
+(0) Rshow
+392 1056 M
+63 0 V
+6577 0 R
+-63 0 V
+-6661 0 R
+(1) Rshow
+392 1692 M
+63 0 V
+6577 0 R
+-63 0 V
+-6661 0 R
+(2) Rshow
+392 2328 M
+63 0 V
+6577 0 R
+-63 0 V
+-6661 0 R
+(3) Rshow
+392 2964 M
+63 0 V
+6577 0 R
+-63 0 V
+-6661 0 R
+(4) Rshow
+392 3600 M
+63 0 V
+6577 0 R
+-63 0 V
+-6661 0 R
+(5) Rshow
+392 4236 M
+63 0 V
+6577 0 R
+-63 0 V
+-6661 0 R
+(6) Rshow
+392 4872 M
+63 0 V
+6577 0 R
+-63 0 V
+-6661 0 R
+(7) Rshow
+392 420 M
+0 63 V
+0 4389 R
+0 -63 V
+392 280 M
+(0) Cshow
+1222 420 M
+0 63 V
+0 4389 R
+0 -63 V
+0 -4529 R
+(5) Cshow
+2052 420 M
+0 63 V
+0 4389 R
+0 -63 V
+0 -4529 R
+(10) Cshow
+2882 420 M
+0 63 V
+0 4389 R
+0 -63 V
+0 -4529 R
+(15) Cshow
+3712 420 M
+0 63 V
+0 4389 R
+0 -63 V
+0 -4529 R
+(20) Cshow
+4542 420 M
+0 63 V
+0 4389 R
+0 -63 V
+0 -4529 R
+(25) Cshow
+5372 420 M
+0 63 V
+0 4389 R
+0 -63 V
+0 -4529 R
+(30) Cshow
+6202 420 M
+0 63 V
+0 4389 R
+0 -63 V
+0 -4529 R
+(35) Cshow
+7032 420 M
+0 63 V
+0 4389 R
+0 -63 V
+0 -4529 R
+(40) Cshow
+1.000 UL
+LTb
+392 420 M
+6640 0 V
+0 4452 V
+-6640 0 V
+392 420 L
+0 2646 M
+currentpoint gsave translate 90 rotate 0 0 M
+(y) Cshow
+grestore
+3712 140 M
+(t) Cshow
+1.000 UP
+1.000 UL
+LT0
+6381 4739 M
+('data' using 2:3:4) Rshow
+6465 4739 M
+399 0 V
+-399 31 R
+0 -62 V
+399 62 R
+0 -62 V
+392 4100 M
+0 127 V
+361 4100 M
+62 0 V
+-62 127 R
+62 0 V
+558 3929 M
+0 128 V
+527 3929 M
+62 0 V
+-62 128 R
+62 0 V
+724 3679 M
+0 127 V
+693 3679 M
+62 0 V
+-62 127 R
+62 0 V
+890 3396 M
+0 127 V
+859 3396 M
+62 0 V
+-62 127 R
+62 0 V
+135 -334 R
+0 127 V
+-31 -127 R
+62 0 V
+-62 127 R
+62 0 V
+135 -359 R
+0 127 V
+-31 -127 R
+62 0 V
+-62 127 R
+62 0 V
+135 -372 R
+0 127 V
+-31 -127 R
+62 0 V
+-62 127 R
+62 0 V
+135 -186 R
+0 127 V
+-31 -127 R
+62 0 V
+-62 127 R
+62 0 V
+135 -361 R
+0 127 V
+-31 -127 R
+62 0 V
+-62 127 R
+62 0 V
+135 -370 R
+0 127 V
+-31 -127 R
+62 0 V
+-62 127 R
+62 0 V
+135 -123 R
+0 128 V
+-31 -128 R
+62 0 V
+-62 128 R
+62 0 V
+135 -161 R
+0 127 V
+-31 -127 R
+62 0 V
+-62 127 R
+62 0 V
+135 -220 R
+0 127 V
+-31 -127 R
+62 0 V
+-62 127 R
+62 0 V
+135 -447 R
+0 127 V
+-31 -127 R
+62 0 V
+-62 127 R
+62 0 V
+135 -12 R
+0 127 V
+-31 -127 R
+62 0 V
+-62 127 R
+62 0 V
+135 -378 R
+0 127 V
+-31 -127 R
+62 0 V
+-62 127 R
+62 0 V
+135 -120 R
+0 128 V
+-31 -128 R
+62 0 V
+-62 128 R
+62 0 V
+135 -125 R
+0 128 V
+-31 -128 R
+62 0 V
+-62 128 R
+62 0 V
+135 -283 R
+0 127 V
+-31 -127 R
+62 0 V
+-62 127 R
+62 0 V
+135 -69 R
+0 127 V
+-31 -127 R
+62 0 V
+-62 127 R
+62 0 V
+135 -272 R
+0 127 V
+-31 -127 R
+62 0 V
+-62 127 R
+62 0 V
+135 -173 R
+0 127 V
+-31 -127 R
+62 0 V
+-62 127 R
+62 0 V
+135 -48 R
+0 128 V
+-31 -128 R
+62 0 V
+-62 128 R
+62 0 V
+135 -249 R
+0 127 V
+-31 -127 R
+62 0 V
+-62 127 R
+62 0 V
+135 -57 R
+0 127 V
+-31 -127 R
+62 0 V
+-62 127 R
+62 0 V
+135 -278 R
+0 128 V
+-31 -128 R
+62 0 V
+-62 128 R
+62 0 V
+135 -88 R
+0 127 V
+-31 -127 R
+62 0 V
+-62 127 R
+62 0 V
+135 -155 R
+0 127 V
+-31 -127 R
+62 0 V
+-62 127 R
+62 0 V
+135 -73 R
+0 127 V
+-31 -127 R
+62 0 V
+-62 127 R
+62 0 V
+135 -349 R
+0 127 V
+-31 -127 R
+62 0 V
+-62 127 R
+62 0 V
+135 59 R
+0 127 V
+-31 -127 R
+62 0 V
+-62 127 R
+62 0 V
+135 -260 R
+0 127 V
+-31 -127 R
+62 0 V
+-62 127 R
+62 0 V
+135 -146 R
+0 128 V
+-31 -128 R
+62 0 V
+-62 128 R
+62 0 V
+135 -39 R
+0 127 V
+-31 -127 R
+62 0 V
+-62 127 R
+62 0 V
+135 -218 R
+0 127 V
+-31 -127 R
+62 0 V
+-62 127 R
+62 0 V
+135 -135 R
+0 128 V
+-31 -128 R
+62 0 V
+-62 128 R
+62 0 V
+135 -156 R
+0 127 V
+-31 -127 R
+62 0 V
+-62 127 R
+62 0 V
+135 -72 R
+0 127 V
+-31 -127 R
+62 0 V
+-62 127 R
+62 0 V
+135 -86 R
+0 128 V
+-31 -128 R
+62 0 V
+-62 128 R
+62 0 V
+135 -159 R
+0 128 V
+-31 -128 R
+62 0 V
+-62 128 R
+62 0 V
+392 4164 Pls
+558 3993 Pls
+724 3742 Pls
+890 3459 Pls
+1056 3253 Pls
+1222 3021 Pls
+1388 2776 Pls
+1554 2717 Pls
+1720 2483 Pls
+1886 2239 Pls
+2052 2244 Pls
+2218 2211 Pls
+2384 2118 Pls
+2550 1798 Pls
+2716 1912 Pls
+2882 1662 Pls
+3048 1669 Pls
+3214 1672 Pls
+3380 1517 Pls
+3546 1575 Pls
+3712 1429 Pls
+3878 1384 Pls
+4044 1463 Pls
+4210 1342 Pls
+4376 1411 Pls
+4542 1261 Pls
+4708 1301 Pls
+4874 1273 Pls
+5040 1327 Pls
+5206 1104 Pls
+5372 1290 Pls
+5538 1158 Pls
+5704 1139 Pls
+5870 1228 Pls
+6036 1136 Pls
+6202 1129 Pls
+6368 1100 Pls
+6534 1156 Pls
+6700 1197 Pls
+6866 1166 Pls
+6664 4739 Pls
+1.000 UL
+LT1
+6381 4599 M
+(f\(x\)) Rshow
+6465 4599 M
+399 0 V
+392 4251 M
+67 -127 V
+67 -122 V
+67 -117 V
+67 -112 V
+67 -108 V
+67 -104 V
+67 -99 V
+68 -96 V
+67 -92 V
+67 -88 V
+67 -84 V
+67 -81 V
+67 -78 V
+67 -75 V
+67 -72 V
+67 -69 V
+67 -66 V
+67 -64 V
+67 -61 V
+67 -59 V
+67 -56 V
+68 -54 V
+67 -52 V
+67 -50 V
+67 -48 V
+67 -46 V
+67 -44 V
+67 -42 V
+67 -41 V
+67 -39 V
+67 -38 V
+67 -36 V
+67 -34 V
+67 -33 V
+67 -32 V
+68 -31 V
+67 -29 V
+67 -29 V
+67 -27 V
+67 -26 V
+67 -25 V
+67 -24 V
+67 -23 V
+67 -22 V
+67 -21 V
+67 -20 V
+67 -20 V
+67 -19 V
+67 -18 V
+68 -17 V
+67 -17 V
+67 -16 V
+67 -15 V
+67 -15 V
+67 -14 V
+67 -14 V
+67 -13 V
+67 -12 V
+67 -12 V
+67 -12 V
+67 -11 V
+67 -11 V
+67 -10 V
+68 -10 V
+67 -9 V
+67 -9 V
+67 -9 V
+67 -8 V
+67 -8 V
+67 -8 V
+67 -7 V
+67 -7 V
+67 -7 V
+67 -7 V
+67 -6 V
+67 -6 V
+67 -6 V
+68 -5 V
+67 -6 V
+67 -5 V
+67 -5 V
+67 -4 V
+67 -5 V
+67 -4 V
+67 -4 V
+67 -4 V
+67 -4 V
+67 -4 V
+67 -4 V
+67 -3 V
+67 -3 V
+68 -3 V
+67 -3 V
+67 -3 V
+67 -3 V
+67 -3 V
+67 -2 V
+67 -3 V
+67 -2 V
+stroke
+grestore
+end
+showpage
+%%Trailer
+%%DocumentFonts: Helvetica
diff --git a/gsl-1.9/doc/fit-wlinear.eps b/gsl-1.9/doc/fit-wlinear.eps
new file mode 100644
index 0000000..2b2737b
--- /dev/null
+++ b/gsl-1.9/doc/fit-wlinear.eps
@@ -0,0 +1,6958 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: GNU libplot drawing library 1.6
+%%Title: PostScript plot
+%%CreationDate: Sun Aug 6 11:26:34 2000
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 1
+%%Pages: 1
+%%PageOrder: Ascend
+%%Orientation: Portrait
+%%BoundingBox: 85 180 500 576
+%%DocumentNeededResources:
+%%DocumentSuppliedResources: procset GNU_libplot 1.0 0
+%%EndComments
+
+%%BeginDefaults
+%%PageResources:
+%%EndDefaults
+
+%%BeginProlog
+%%EndProlog
+
+%%BeginSetup
+/DrawDict 50 dict def
+DrawDict begin
+%%BeginResource procset GNU_libplot 1.0 0
+/none null def
+/numGraphicParameters 17 def
+/stringLimit 65535 def
+/arrowHeight 8 def
+/arrowWidth 4 def
+
+/Begin { save numGraphicParameters dict begin } def
+/End { end restore } def
+
+/SetB {
+dup type /nulltype eq {
+pop
+false /brushRightArrow idef
+false /brushLeftArrow idef
+true /brushNone idef
+} {
+/brushDashOffset idef
+/brushDashArray idef
+0 ne /brushRightArrow idef
+0 ne /brushLeftArrow idef
+/brushWidth idef
+false /brushNone idef
+} ifelse
+} def
+
+/SetCFg {
+/fgblue idef
+/fggreen idef
+/fgred idef
+} def
+
+/SetCBg {
+/bgblue idef
+/bggreen idef
+/bgred idef
+} def
+
+/SetF {
+/printSize idef
+/printFont idef
+} def
+
+/SetP {
+dup type /nulltype eq {
+pop true /patternNone idef
+} {
+/patternGrayLevel idef
+patternGrayLevel -1 eq {
+/patternString idef
+} if
+false /patternNone idef
+} ifelse
+} def
+
+/BSpl {
+0 begin
+storexyn
+newpath
+n 1 gt {
+0 0 0 0 0 0 1 1 true subspline
+n 2 gt {
+0 0 0 0 1 1 2 2 false subspline
+1 1 n 3 sub {
+/i exch def
+i 1 sub dup i dup i 1 add dup i 2 add dup false subspline
+} for
+n 3 sub dup n 2 sub dup n 1 sub dup 2 copy false subspline
+} if
+n 2 sub dup n 1 sub dup 2 copy 2 copy false subspline
+patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if
+brushNone not { istroke } if
+0 0 1 1 leftarrow
+n 2 sub dup 1 sub dup rightarrow
+} if
+end
+} dup 0 4 dict put def
+
+/Circ {
+newpath
+0 360 arc
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+} def
+
+/CBSpl {
+0 begin
+dup 2 gt {
+storexyn
+newpath
+n 1 sub dup 0 0 1 1 2 2 true subspline
+1 1 n 3 sub {
+/i exch def
+i 1 sub dup i dup i 1 add dup i 2 add dup false subspline
+} for
+n 3 sub dup n 2 sub dup n 1 sub dup 0 0 false subspline
+n 2 sub dup n 1 sub dup 0 0 1 1 false subspline
+patternNone not { ifill } if
+brushNone not { istroke } if
+} {
+Poly
+} ifelse
+end
+} dup 0 4 dict put def
+
+/Elli {
+0 begin
+newpath
+4 2 roll
+translate
+scale
+0 0 1 0 360 arc
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+end
+} dup 0 1 dict put def
+
+/Line {
+0 begin
+2 storexyn
+newpath
+x 0 get y 0 get moveto
+x 1 get y 1 get lineto
+brushNone not { istroke } if
+0 0 1 1 leftarrow
+0 0 1 1 rightarrow
+end
+} dup 0 4 dict put def
+
+/MLine {
+0 begin
+storexyn
+newpath
+n 1 gt {
+x 0 get y 0 get moveto
+1 1 n 1 sub {
+/i exch def
+x i get y i get lineto
+} for
+patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if
+brushNone not { istroke } if
+0 0 1 1 leftarrow
+n 2 sub dup n 1 sub dup rightarrow
+} if
+end
+} dup 0 4 dict put def
+
+/Poly {
+3 1 roll
+newpath
+moveto
+-1 add
+{ lineto } repeat
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+} def
+
+/Rect {
+0 begin
+/t exch def
+/r exch def
+/b exch def
+/l exch def
+newpath
+l b moveto
+l t lineto
+r t lineto
+r b lineto
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+end
+} dup 0 4 dict put def
+
+/Text {
+ishow
+} def
+
+/idef {
+dup where { pop pop pop } { exch def } ifelse
+} def
+
+/ifill {
+0 begin
+gsave
+patternGrayLevel -1 ne {
+fgred bgred fgred sub patternGrayLevel mul add
+fggreen bggreen fggreen sub patternGrayLevel mul add
+fgblue bgblue fgblue sub patternGrayLevel mul add setrgbcolor
+eofill
+} {
+eoclip
+originalCTM setmatrix
+pathbbox /t exch def /r exch def /b exch def /l exch def
+/w r l sub ceiling cvi def
+/h t b sub ceiling cvi def
+/imageByteWidth w 8 div ceiling cvi def
+/imageHeight h def
+bgred bggreen bgblue setrgbcolor
+eofill
+fgred fggreen fgblue setrgbcolor
+w 0 gt h 0 gt and {
+l b translate w h scale
+w h true [w 0 0 h neg 0 h] { patternproc } imagemask
+} if
+} ifelse
+grestore
+end
+} dup 0 8 dict put def
+
+/istroke {
+gsave
+brushDashOffset -1 eq {
+[] 0 setdash
+1 setgray
+} {
+brushDashArray brushDashOffset setdash
+fgred fggreen fgblue setrgbcolor
+} ifelse
+brushWidth setlinewidth
+originalCTM setmatrix
+stroke
+grestore
+} def
+
+/ishow {
+0 begin
+gsave
+fgred fggreen fgblue setrgbcolor
+/fontDict printFont findfont printSize scalefont dup setfont def
+/descender fontDict begin 0 /FontBBox load 1 get FontMatrix end
+transform exch pop def
+/vertoffset 1 printSize sub descender sub def {
+0 vertoffset moveto show
+/vertoffset vertoffset printSize sub def
+} forall
+grestore
+end
+} dup 0 3 dict put def
+
+/patternproc {
+0 begin
+/patternByteLength patternString length def
+/patternHeight patternByteLength 8 mul sqrt cvi def
+/patternWidth patternHeight def
+/patternByteWidth patternWidth 8 idiv def
+/imageByteMaxLength imageByteWidth imageHeight mul
+stringLimit patternByteWidth sub min def
+/imageMaxHeight imageByteMaxLength imageByteWidth idiv patternHeight idiv
+patternHeight mul patternHeight max def
+/imageHeight imageHeight imageMaxHeight sub store
+/imageString imageByteWidth imageMaxHeight mul patternByteWidth add string def
+0 1 imageMaxHeight 1 sub {
+/y exch def
+/patternRow y patternByteWidth mul patternByteLength mod def
+/patternRowString patternString patternRow patternByteWidth getinterval def
+/imageRow y imageByteWidth mul def
+0 patternByteWidth imageByteWidth 1 sub {
+/x exch def
+imageString imageRow x add patternRowString putinterval
+} for
+} for
+imageString
+end
+} dup 0 12 dict put def
+
+/min {
+dup 3 2 roll dup 4 3 roll lt { exch } if pop
+} def
+
+/max {
+dup 3 2 roll dup 4 3 roll gt { exch } if pop
+} def
+
+/midpoint {
+0 begin
+/y1 exch def
+/x1 exch def
+/y0 exch def
+/x0 exch def
+x0 x1 add 2 div
+y0 y1 add 2 div
+end
+} dup 0 4 dict put def
+
+/thirdpoint {
+0 begin
+/y1 exch def
+/x1 exch def
+/y0 exch def
+/x0 exch def
+x0 2 mul x1 add 3 div
+y0 2 mul y1 add 3 div
+end
+} dup 0 4 dict put def
+
+/subspline {
+0 begin
+/movetoNeeded exch def
+y exch get /y3 exch def
+x exch get /x3 exch def
+y exch get /y2 exch def
+x exch get /x2 exch def
+y exch get /y1 exch def
+x exch get /x1 exch def
+y exch get /y0 exch def
+x exch get /x0 exch def
+x1 y1 x2 y2 thirdpoint
+/p1y exch def
+/p1x exch def
+x2 y2 x1 y1 thirdpoint
+/p2y exch def
+/p2x exch def
+x1 y1 x0 y0 thirdpoint
+p1x p1y midpoint
+/p0y exch def
+/p0x exch def
+x2 y2 x3 y3 thirdpoint
+p2x p2y midpoint
+/p3y exch def
+/p3x exch def
+movetoNeeded { p0x p0y moveto } if
+p1x p1y p2x p2y p3x p3y curveto
+end
+} dup 0 17 dict put def
+
+/storexyn {
+/n exch def
+/y n array def
+/x n array def
+n 1 sub -1 0 {
+/i exch def
+y i 3 2 roll put
+x i 3 2 roll put
+} for
+} def
+
+/arrowhead {
+0 begin
+transform originalCTM itransform
+/taily exch def
+/tailx exch def
+transform originalCTM itransform
+/tipy exch def
+/tipx exch def
+/dy tipy taily sub def
+/dx tipx tailx sub def
+/angle dx 0 ne dy 0 ne or { dy dx atan } { 90 } ifelse def
+gsave
+originalCTM setmatrix
+tipx tipy translate
+angle rotate
+newpath
+arrowHeight neg arrowWidth 2 div moveto
+0 0 lineto
+arrowHeight neg arrowWidth 2 div neg lineto
+patternNone not {
+originalCTM setmatrix
+/padtip arrowHeight 2 exp 0.25 arrowWidth 2 exp mul add sqrt brushWidth mul
+arrowWidth div def
+/padtail brushWidth 2 div def
+tipx tipy translate
+angle rotate
+padtip 0 translate
+arrowHeight padtip add padtail add arrowHeight div dup scale
+arrowheadpath
+ifill
+} if
+brushNone not {
+originalCTM setmatrix
+tipx tipy translate
+angle rotate
+arrowheadpath
+istroke
+} if
+grestore
+end
+} dup 0 9 dict put def
+
+/arrowheadpath {
+newpath
+arrowHeight neg arrowWidth 2 div moveto
+0 0 lineto
+arrowHeight neg arrowWidth 2 div neg lineto
+} def
+
+/leftarrow {
+0 begin
+y exch get /taily exch def
+x exch get /tailx exch def
+y exch get /tipy exch def
+x exch get /tipx exch def
+brushLeftArrow { tipx tipy tailx taily arrowhead } if
+end
+} dup 0 4 dict put def
+
+/rightarrow {
+0 begin
+y exch get /tipy exch def
+x exch get /tipx exch def
+y exch get /taily exch def
+x exch get /tailx exch def
+brushRightArrow { tipx tipy tailx taily arrowhead } if
+end
+} dup 0 4 dict put def
+%%EndResource
+%%EndSetup
+
+%%Page: 1 1
+%%PageResources:
+%%PageBoundingBox: 85 180 500 576
+%%BeginPageSetup
+%I Idraw 8
+
+Begin
+%I b u
+%I cfg u
+%I cbg u
+%I f u
+%I p u
+%I t
+[ 1 0 0 1 0 0 ] concat
+/originalCTM matrix currentmatrix def
+/trueoriginalCTM matrix currentmatrix def
+%%EndPageSetup
+
+Begin %I Poly
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+2304 2304
+2304 9216
+9216 9216
+9216 2304
+4 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+1930 2107
+1952 2118
+1985 2151
+1985 1920
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1974 2140
+1974 1920
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1930 1920
+2029 1920
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 28
+2260 2074
+2249 2041
+2227 2019
+2194 2008
+2183 2008
+2150 2019
+2128 2041
+2117 2074
+2117 2085
+2128 2118
+2150 2140
+2183 2151
+2205 2151
+2238 2140
+2260 2118
+2271 2085
+2271 2019
+2260 1975
+2249 1953
+2227 1931
+2194 1920
+2161 1920
+2139 1931
+2128 1953
+2128 1964
+2139 1975
+2150 1964
+2139 1953
+28 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+2183 2008
+2161 2019
+2139 2041
+2128 2074
+2128 2085
+2139 2118
+2161 2140
+2183 2151
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 9
+2205 2151
+2227 2140
+2249 2118
+2260 2085
+2260 2019
+2249 1975
+2238 1953
+2216 1931
+2194 1920
+9 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 28
+2469 2118
+2458 2107
+2469 2096
+2480 2107
+2480 2118
+2469 2140
+2447 2151
+2414 2151
+2381 2140
+2359 2118
+2348 2096
+2337 2052
+2337 1986
+2348 1953
+2370 1931
+2403 1920
+2425 1920
+2458 1931
+2480 1953
+2491 1986
+2491 1997
+2480 2030
+2458 2052
+2425 2063
+2414 2063
+2381 2052
+2359 2030
+2348 1997
+28 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 9
+2414 2151
+2392 2140
+2370 2118
+2359 2096
+2348 2052
+2348 1986
+2359 1953
+2381 1931
+2403 1920
+9 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+2425 1920
+2447 1931
+2469 1953
+2480 1986
+2480 1997
+2469 2030
+2447 2052
+2425 2063
+8 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+2623 2151
+2590 2140
+2568 2107
+2557 2052
+2557 2019
+2568 1964
+2590 1931
+2623 1920
+2645 1920
+2678 1931
+2700 1964
+2711 2019
+2711 2052
+2700 2107
+2678 2140
+2645 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+2623 2151
+2601 2140
+2590 2129
+2579 2107
+2568 2052
+2568 2019
+2579 1964
+2590 1942
+2601 1931
+2623 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+2645 1920
+2667 1931
+2678 1942
+2689 1964
+2700 2019
+2700 2052
+2689 2107
+2678 2129
+2667 2140
+2645 2151
+10 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 9216
+2304 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2304 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+3313 2107
+3335 2118
+3368 2151
+3368 1920
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3357 2140
+3357 1920
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3313 1920
+3411 1920
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 28
+3642 2074
+3631 2041
+3609 2019
+3576 2008
+3565 2008
+3532 2019
+3510 2041
+3499 2074
+3499 2085
+3510 2118
+3532 2140
+3565 2151
+3587 2151
+3620 2140
+3642 2118
+3653 2085
+3653 2019
+3642 1975
+3631 1953
+3609 1931
+3576 1920
+3543 1920
+3521 1931
+3510 1953
+3510 1964
+3521 1975
+3532 1964
+3521 1953
+28 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+3565 2008
+3543 2019
+3521 2041
+3510 2074
+3510 2085
+3521 2118
+3543 2140
+3565 2151
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 9
+3587 2151
+3609 2140
+3631 2118
+3642 2085
+3642 2019
+3631 1975
+3620 1953
+3598 1931
+3576 1920
+9 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3719 2151
+3719 2085
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+3719 2107
+3730 2129
+3752 2151
+3774 2151
+3829 2118
+3851 2118
+3862 2129
+3873 2151
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+3730 2129
+3752 2140
+3774 2140
+3829 2118
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+3873 2151
+3873 2118
+3862 2085
+3818 2030
+3807 2008
+3796 1975
+3796 1920
+7 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 5
+3862 2085
+3807 2030
+3796 2008
+3785 1975
+3785 1920
+5 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+4005 2151
+3972 2140
+3950 2107
+3939 2052
+3939 2019
+3950 1964
+3972 1931
+4005 1920
+4027 1920
+4060 1931
+4082 1964
+4093 2019
+4093 2052
+4082 2107
+4060 2140
+4027 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+4005 2151
+3983 2140
+3972 2129
+3961 2107
+3950 2052
+3950 2019
+3961 1964
+3972 1942
+3983 1931
+4005 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+4027 1920
+4049 1931
+4060 1942
+4071 1964
+4082 2019
+4082 2052
+4071 2107
+4060 2129
+4049 2140
+4027 2151
+10 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3686 9216
+3686 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3686 2304
+3686 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+4695 2107
+4717 2118
+4750 2151
+4750 1920
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4739 2140
+4739 1920
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4695 1920
+4794 1920
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 28
+5025 2074
+5014 2041
+4992 2019
+4959 2008
+4948 2008
+4915 2019
+4893 2041
+4882 2074
+4882 2085
+4893 2118
+4915 2140
+4948 2151
+4970 2151
+5003 2140
+5025 2118
+5036 2085
+5036 2019
+5025 1975
+5014 1953
+4992 1931
+4959 1920
+4926 1920
+4904 1931
+4893 1953
+4893 1964
+4904 1975
+4915 1964
+4904 1953
+28 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+4948 2008
+4926 2019
+4904 2041
+4893 2074
+4893 2085
+4904 2118
+4926 2140
+4948 2151
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 9
+4970 2151
+4992 2140
+5014 2118
+5025 2085
+5025 2019
+5014 1975
+5003 1953
+4981 1931
+4959 1920
+9 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 12
+5157 2151
+5124 2140
+5113 2118
+5113 2085
+5124 2063
+5157 2052
+5201 2052
+5234 2063
+5245 2085
+5245 2118
+5234 2140
+5201 2151
+12 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+5157 2151
+5135 2140
+5124 2118
+5124 2085
+5135 2063
+5157 2052
+6 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+5201 2052
+5223 2063
+5234 2085
+5234 2118
+5223 2140
+5201 2151
+6 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+5157 2052
+5124 2041
+5113 2030
+5102 2008
+5102 1964
+5113 1942
+5124 1931
+5157 1920
+5201 1920
+5234 1931
+5245 1942
+5256 1964
+5256 2008
+5245 2030
+5234 2041
+5201 2052
+16 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+5157 2052
+5135 2041
+5124 2030
+5113 2008
+5113 1964
+5124 1942
+5135 1931
+5157 1920
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+5201 1920
+5223 1931
+5234 1942
+5245 1964
+5245 2008
+5234 2030
+5223 2041
+5201 2052
+8 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+5388 2151
+5355 2140
+5333 2107
+5322 2052
+5322 2019
+5333 1964
+5355 1931
+5388 1920
+5410 1920
+5443 1931
+5465 1964
+5476 2019
+5476 2052
+5465 2107
+5443 2140
+5410 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+5388 2151
+5366 2140
+5355 2129
+5344 2107
+5333 2052
+5333 2019
+5344 1964
+5355 1942
+5366 1931
+5388 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+5410 1920
+5432 1931
+5443 1942
+5454 1964
+5465 2019
+5465 2052
+5454 2107
+5443 2129
+5432 2140
+5410 2151
+10 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5069 9216
+5069 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5069 2304
+5069 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+6077 2107
+6099 2118
+6132 2151
+6132 1920
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6121 2140
+6121 1920
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6077 1920
+6176 1920
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 28
+6407 2074
+6396 2041
+6374 2019
+6341 2008
+6330 2008
+6297 2019
+6275 2041
+6264 2074
+6264 2085
+6275 2118
+6297 2140
+6330 2151
+6352 2151
+6385 2140
+6407 2118
+6418 2085
+6418 2019
+6407 1975
+6396 1953
+6374 1931
+6341 1920
+6308 1920
+6286 1931
+6275 1953
+6275 1964
+6286 1975
+6297 1964
+6286 1953
+28 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+6330 2008
+6308 2019
+6286 2041
+6275 2074
+6275 2085
+6286 2118
+6308 2140
+6330 2151
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 9
+6352 2151
+6374 2140
+6396 2118
+6407 2085
+6407 2019
+6396 1975
+6385 1953
+6363 1931
+6341 1920
+9 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 28
+6627 2074
+6616 2041
+6594 2019
+6561 2008
+6550 2008
+6517 2019
+6495 2041
+6484 2074
+6484 2085
+6495 2118
+6517 2140
+6550 2151
+6572 2151
+6605 2140
+6627 2118
+6638 2085
+6638 2019
+6627 1975
+6616 1953
+6594 1931
+6561 1920
+6528 1920
+6506 1931
+6495 1953
+6495 1964
+6506 1975
+6517 1964
+6506 1953
+28 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+6550 2008
+6528 2019
+6506 2041
+6495 2074
+6495 2085
+6506 2118
+6528 2140
+6550 2151
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 9
+6572 2151
+6594 2140
+6616 2118
+6627 2085
+6627 2019
+6616 1975
+6605 1953
+6583 1931
+6561 1920
+9 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+6770 2151
+6737 2140
+6715 2107
+6704 2052
+6704 2019
+6715 1964
+6737 1931
+6770 1920
+6792 1920
+6825 1931
+6847 1964
+6858 2019
+6858 2052
+6847 2107
+6825 2140
+6792 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+6770 2151
+6748 2140
+6737 2129
+6726 2107
+6715 2052
+6715 2019
+6726 1964
+6737 1942
+6748 1931
+6770 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+6792 1920
+6814 1931
+6825 1942
+6836 1964
+6847 2019
+6847 2052
+6836 2107
+6825 2129
+6814 2140
+6792 2151
+10 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6451 9216
+6451 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6451 2304
+6451 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 20
+7438 2107
+7449 2096
+7438 2085
+7427 2096
+7427 2107
+7438 2129
+7449 2140
+7482 2151
+7526 2151
+7559 2140
+7570 2129
+7581 2107
+7581 2085
+7570 2063
+7537 2041
+7482 2019
+7460 2008
+7438 1986
+7427 1953
+7427 1920
+20 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+7526 2151
+7548 2140
+7559 2129
+7570 2107
+7570 2085
+7559 2063
+7526 2041
+7482 2019
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+7427 1942
+7438 1953
+7460 1953
+7515 1931
+7548 1931
+7570 1942
+7581 1953
+7 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+7460 1953
+7515 1920
+7559 1920
+7570 1931
+7581 1953
+7581 1975
+6 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+7713 2151
+7680 2140
+7658 2107
+7647 2052
+7647 2019
+7658 1964
+7680 1931
+7713 1920
+7735 1920
+7768 1931
+7790 1964
+7801 2019
+7801 2052
+7790 2107
+7768 2140
+7735 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+7713 2151
+7691 2140
+7680 2129
+7669 2107
+7658 2052
+7658 2019
+7669 1964
+7680 1942
+7691 1931
+7713 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+7735 1920
+7757 1931
+7768 1942
+7779 1964
+7790 2019
+7790 2052
+7779 2107
+7768 2129
+7757 2140
+7735 2151
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+7933 2151
+7900 2140
+7878 2107
+7867 2052
+7867 2019
+7878 1964
+7900 1931
+7933 1920
+7955 1920
+7988 1931
+8010 1964
+8021 2019
+8021 2052
+8010 2107
+7988 2140
+7955 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+7933 2151
+7911 2140
+7900 2129
+7889 2107
+7878 2052
+7878 2019
+7889 1964
+7900 1942
+7911 1931
+7933 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+7955 1920
+7977 1931
+7988 1942
+7999 1964
+8010 2019
+8010 2052
+7999 2107
+7988 2129
+7977 2140
+7955 2151
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+8152 2151
+8120 2140
+8098 2107
+8087 2052
+8087 2019
+8098 1964
+8120 1931
+8152 1920
+8174 1920
+8207 1931
+8229 1964
+8240 2019
+8240 2052
+8229 2107
+8207 2140
+8174 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+8152 2151
+8131 2140
+8120 2129
+8109 2107
+8098 2052
+8098 2019
+8109 1964
+8120 1942
+8131 1931
+8152 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+8174 1920
+8196 1931
+8207 1942
+8218 1964
+8229 2019
+8229 2052
+8218 2107
+8207 2129
+8196 2140
+8174 2151
+10 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7834 9216
+7834 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7834 2304
+7834 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 20
+8820 2107
+8831 2096
+8820 2085
+8809 2096
+8809 2107
+8820 2129
+8831 2140
+8864 2151
+8908 2151
+8941 2140
+8952 2129
+8963 2107
+8963 2085
+8952 2063
+8919 2041
+8864 2019
+8842 2008
+8820 1986
+8809 1953
+8809 1920
+20 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+8908 2151
+8930 2140
+8941 2129
+8952 2107
+8952 2085
+8941 2063
+8908 2041
+8864 2019
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+8809 1942
+8820 1953
+8842 1953
+8897 1931
+8930 1931
+8952 1942
+8963 1953
+7 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+8842 1953
+8897 1920
+8941 1920
+8952 1931
+8963 1953
+8963 1975
+6 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+9095 2151
+9062 2140
+9040 2107
+9029 2052
+9029 2019
+9040 1964
+9062 1931
+9095 1920
+9117 1920
+9150 1931
+9172 1964
+9183 2019
+9183 2052
+9172 2107
+9150 2140
+9117 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+9095 2151
+9073 2140
+9062 2129
+9051 2107
+9040 2052
+9040 2019
+9051 1964
+9062 1942
+9073 1931
+9095 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+9117 1920
+9139 1931
+9150 1942
+9161 1964
+9172 2019
+9172 2052
+9161 2107
+9150 2129
+9139 2140
+9117 2151
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+9282 2107
+9304 2118
+9337 2151
+9337 1920
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9326 2140
+9326 1920
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9282 1920
+9381 1920
+2 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+9535 2151
+9502 2140
+9480 2107
+9469 2052
+9469 2019
+9480 1964
+9502 1931
+9535 1920
+9557 1920
+9590 1931
+9612 1964
+9623 2019
+9623 2052
+9612 2107
+9590 2140
+9557 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+9535 2151
+9513 2140
+9502 2129
+9491 2107
+9480 2052
+9480 2019
+9491 1964
+9502 1942
+9513 1931
+9535 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+9557 1920
+9579 1931
+9590 1942
+9601 1964
+9612 2019
+9612 2052
+9601 2107
+9590 2129
+9579 2140
+9557 2151
+10 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 9216
+9216 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2304
+9216 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 9216
+2304 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2304 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2580 9216
+2580 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2580 2304
+2580 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2857 9216
+2857 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2857 2304
+2857 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3133 9216
+3133 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3133 2304
+3133 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3410 9216
+3410 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3410 2304
+3410 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3686 9216
+3686 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3686 2304
+3686 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3963 9216
+3963 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3963 2304
+3963 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4239 9216
+4239 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4239 2304
+4239 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4516 9216
+4516 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4516 2304
+4516 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4792 9216
+4792 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4792 2304
+4792 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5069 9216
+5069 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5069 2304
+5069 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5345 9216
+5345 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5345 2304
+5345 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5622 9216
+5622 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5622 2304
+5622 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5898 9216
+5898 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5898 2304
+5898 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6175 9216
+6175 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6175 2304
+6175 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6451 9216
+6451 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6451 2304
+6451 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6728 9216
+6728 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6728 2304
+6728 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7004 9216
+7004 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7004 2304
+7004 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7281 9216
+7281 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7281 2304
+7281 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7557 9216
+7557 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7557 2304
+7557 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7834 9216
+7834 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7834 2304
+7834 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8110 9216
+8110 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8110 2304
+8110 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8387 9216
+8387 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8387 2304
+8387 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8663 9216
+8663 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8663 2304
+8663 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8940 9216
+8940 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8940 2304
+8940 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 9216
+9216 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2304
+9216 2359
+2 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+2079 2436
+2046 2425
+2024 2392
+2013 2337
+2013 2304
+2024 2249
+2046 2216
+2079 2205
+2101 2205
+2134 2216
+2156 2249
+2167 2304
+2167 2337
+2156 2392
+2134 2425
+2101 2436
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+2079 2436
+2057 2425
+2046 2414
+2035 2392
+2024 2337
+2024 2304
+2035 2249
+2046 2227
+2057 2216
+2079 2205
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+2101 2205
+2123 2216
+2134 2227
+2145 2249
+2156 2304
+2156 2337
+2145 2392
+2134 2414
+2123 2425
+2101 2436
+10 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2304
+9078 2304
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2442 2304
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2035 4164
+2013 4054
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 19
+2013 4054
+2035 4076
+2068 4087
+2101 4087
+2134 4076
+2156 4054
+2167 4021
+2167 3999
+2156 3966
+2134 3944
+2101 3933
+2068 3933
+2035 3944
+2024 3955
+2013 3977
+2013 3988
+2024 3999
+2035 3988
+2024 3977
+19 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+2101 4087
+2123 4076
+2145 4054
+2156 4021
+2156 3999
+2145 3966
+2123 3944
+2101 3933
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2035 4164
+2145 4164
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+2035 4153
+2090 4153
+2145 4164
+3 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4032
+9078 4032
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4032
+2442 4032
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+1826 5848
+1848 5859
+1881 5892
+1881 5661
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1870 5881
+1870 5661
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1826 5661
+1925 5661
+2 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+2079 5892
+2046 5881
+2024 5848
+2013 5793
+2013 5760
+2024 5705
+2046 5672
+2079 5661
+2101 5661
+2134 5672
+2156 5705
+2167 5760
+2167 5793
+2156 5848
+2134 5881
+2101 5892
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+2079 5892
+2057 5881
+2046 5870
+2035 5848
+2024 5793
+2024 5760
+2035 5705
+2046 5683
+2057 5672
+2079 5661
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+2101 5661
+2123 5672
+2134 5683
+2145 5705
+2156 5760
+2156 5793
+2145 5848
+2134 5870
+2123 5881
+2101 5892
+10 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5760
+9078 5760
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5760
+2442 5760
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+1826 7576
+1848 7587
+1881 7620
+1881 7389
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1870 7609
+1870 7389
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1826 7389
+1925 7389
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2035 7620
+2013 7510
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 19
+2013 7510
+2035 7532
+2068 7543
+2101 7543
+2134 7532
+2156 7510
+2167 7477
+2167 7455
+2156 7422
+2134 7400
+2101 7389
+2068 7389
+2035 7400
+2024 7411
+2013 7433
+2013 7444
+2024 7455
+2035 7444
+2024 7433
+19 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+2101 7543
+2123 7532
+2145 7510
+2156 7477
+2156 7455
+2145 7422
+2123 7400
+2101 7389
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2035 7620
+2145 7620
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+2035 7609
+2090 7609
+2145 7620
+3 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 7488
+9078 7488
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 7488
+2442 7488
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 20
+1804 9304
+1815 9293
+1804 9282
+1793 9293
+1793 9304
+1804 9326
+1815 9337
+1848 9348
+1892 9348
+1925 9337
+1936 9326
+1947 9304
+1947 9282
+1936 9260
+1903 9238
+1848 9216
+1826 9205
+1804 9183
+1793 9150
+1793 9117
+20 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+1892 9348
+1914 9337
+1925 9326
+1936 9304
+1936 9282
+1925 9260
+1892 9238
+1848 9216
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+1793 9139
+1804 9150
+1826 9150
+1881 9128
+1914 9128
+1936 9139
+1947 9150
+7 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+1826 9150
+1881 9117
+1925 9117
+1936 9128
+1947 9150
+1947 9172
+6 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+2079 9348
+2046 9337
+2024 9304
+2013 9249
+2013 9216
+2024 9161
+2046 9128
+2079 9117
+2101 9117
+2134 9128
+2156 9161
+2167 9216
+2167 9249
+2156 9304
+2134 9337
+2101 9348
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+2079 9348
+2057 9337
+2046 9326
+2035 9304
+2024 9249
+2024 9216
+2035 9161
+2046 9139
+2057 9128
+2079 9117
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+2101 9117
+2123 9128
+2134 9139
+2145 9161
+2156 9216
+2156 9249
+2145 9304
+2134 9326
+2123 9337
+2101 9348
+10 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 9216
+9078 9216
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 9216
+2442 9216
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2304
+9161 2304
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2359 2304
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2650
+9161 2650
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2650
+2359 2650
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2995
+9161 2995
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2995
+2359 2995
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 3341
+9161 3341
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3341
+2359 3341
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 3686
+9161 3686
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3686
+2359 3686
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4032
+9161 4032
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4032
+2359 4032
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4378
+9161 4378
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4378
+2359 4378
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4723
+9161 4723
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4723
+2359 4723
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5069
+9161 5069
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5069
+2359 5069
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5414
+9161 5414
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5414
+2359 5414
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5760
+9161 5760
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5760
+2359 5760
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 6106
+9161 6106
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 6106
+2359 6106
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 6451
+9161 6451
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 6451
+2359 6451
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 6797
+9161 6797
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 6797
+2359 6797
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 7142
+9161 7142
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 7142
+2359 7142
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 7488
+9161 7488
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 7488
+2359 7488
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 7834
+9161 7834
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 7834
+2359 7834
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 8179
+9161 8179
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 8179
+2359 8179
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 8525
+9161 8525
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 8525
+2359 8525
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 8870
+9161 8870
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 8870
+2359 8870
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 9216
+9161 9216
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 9216
+2359 9216
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5694 1621
+5815 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5705 1621
+5826 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5826 1621
+5694 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5672 1621
+5738 1621
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5782 1621
+5848 1621
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5672 1467
+5738 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5782 1467
+5848 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1354 5700
+1508 5765
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1354 5711
+1486 5765
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 9
+1354 5831
+1508 5765
+1552 5744
+1574 5722
+1585 5700
+1585 5689
+1574 5678
+1563 5689
+1574 5700
+9 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1354 5678
+1354 5744
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1354 5787
+1354 5853
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3583 5358
+3790 5358
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3686 5358
+3686 7544
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3583 7544
+3790 7544
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3622 6451
+3751 6451
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3686 6386
+3686 6516
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4965 5333
+5172 5333
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5069 5333
+5069 6878
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4965 6878
+5172 6878
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5004 6106
+5134 6106
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5069 6041
+5069 6170
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6348 6511
+6555 6511
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6451 6511
+6451 7773
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6348 7773
+6555 7773
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6386 7142
+6516 7142
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6451 7078
+6451 7207
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7730 6250
+7937 6250
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7834 6250
+7834 7343
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7730 7343
+7937 7343
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7769 6797
+7898 6797
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7834 6732
+7834 6862
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 160
+2442 6126
+2484 6133
+2525 6139
+2567 6145
+2608 6151
+2650 6157
+2691 6164
+2733 6170
+2774 6176
+2815 6182
+2857 6189
+2898 6195
+2940 6201
+2981 6207
+3023 6213
+3064 6220
+3106 6226
+3147 6232
+3189 6238
+3230 6245
+3272 6251
+3313 6257
+3355 6263
+3396 6269
+3438 6276
+3479 6282
+3521 6288
+3562 6294
+3603 6301
+3645 6307
+3686 6313
+3728 6319
+3769 6325
+3811 6332
+3852 6338
+3894 6344
+3935 6350
+3977 6357
+4018 6363
+4060 6369
+4101 6375
+4143 6381
+4184 6388
+4226 6394
+4267 6400
+4308 6406
+4350 6412
+4391 6419
+4433 6425
+4474 6431
+4516 6437
+4557 6444
+4599 6450
+4640 6456
+4682 6462
+4723 6468
+4765 6475
+4806 6481
+4848 6487
+4889 6493
+4931 6500
+4972 6506
+5014 6512
+5055 6518
+5096 6524
+5138 6531
+5179 6537
+5221 6543
+5262 6549
+5304 6556
+5345 6562
+5387 6568
+5428 6574
+5470 6580
+5511 6587
+5553 6593
+5594 6599
+5636 6605
+5677 6612
+5719 6618
+5760 6624
+5801 6630
+5843 6636
+5884 6643
+5926 6649
+5967 6655
+6009 6661
+6050 6668
+6092 6674
+6133 6680
+6175 6686
+6216 6692
+6258 6699
+6299 6705
+6341 6711
+6382 6717
+6424 6724
+6465 6730
+6506 6736
+6548 6742
+6589 6748
+6631 6755
+6672 6761
+6714 6767
+6755 6773
+6797 6780
+6838 6786
+6880 6792
+6921 6798
+6963 6804
+7004 6811
+7046 6817
+7087 6823
+7129 6829
+7170 6836
+7212 6842
+7253 6848
+7294 6854
+7336 6860
+7377 6867
+7419 6873
+7460 6879
+7502 6885
+7543 6891
+7585 6898
+7626 6904
+7668 6910
+7709 6916
+7751 6923
+7792 6929
+7834 6935
+7875 6941
+7917 6947
+7958 6954
+7999 6960
+8041 6966
+8082 6972
+8124 6979
+8165 6985
+8207 6991
+8248 6997
+8290 7003
+8331 7010
+8373 7016
+8414 7022
+8456 7028
+8497 7035
+8539 7041
+8580 7047
+8622 7053
+8663 7059
+8705 7066
+8746 7072
+8787 7078
+8829 7084
+8870 7091
+8912 7097
+8953 7103
+8995 7109
+9036 7115
+160 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 34952
+1 0 0 [ 1 3 1 3 ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 160
+2442 7186
+2484 7183
+2525 7179
+2567 7176
+2608 7172
+2650 7169
+2691 7165
+2733 7162
+2774 7158
+2815 7155
+2857 7151
+2898 7148
+2940 7144
+2981 7141
+3023 7138
+3064 7134
+3106 7131
+3147 7127
+3189 7124
+3230 7121
+3272 7118
+3313 7114
+3355 7111
+3396 7108
+3438 7105
+3479 7101
+3521 7098
+3562 7095
+3603 7092
+3645 7089
+3686 7086
+3728 7083
+3769 7080
+3811 7077
+3852 7074
+3894 7071
+3935 7068
+3977 7065
+4018 7062
+4060 7060
+4101 7057
+4143 7054
+4184 7051
+4226 7049
+4267 7046
+4308 7044
+4350 7041
+4391 7039
+4433 7037
+4474 7034
+4516 7032
+4557 7030
+4599 7028
+4640 7026
+4682 7024
+4723 7022
+4765 7020
+4806 7018
+4848 7016
+4889 7015
+4931 7013
+4972 7012
+5014 7011
+5055 7009
+5096 7008
+5138 7007
+5179 7007
+5221 7006
+5262 7005
+5304 7005
+5345 7004
+5387 7004
+5428 7004
+5470 7004
+5511 7005
+5553 7005
+5594 7006
+5636 7007
+5677 7008
+5719 7009
+5760 7010
+5801 7012
+5843 7014
+5884 7016
+5926 7019
+5967 7021
+6009 7024
+6050 7027
+6092 7031
+6133 7035
+6175 7039
+6216 7043
+6258 7048
+6299 7053
+6341 7058
+6382 7063
+6424 7069
+6465 7075
+6506 7082
+6548 7089
+6589 7096
+6631 7103
+6672 7111
+6714 7119
+6755 7127
+6797 7136
+6838 7145
+6880 7154
+6921 7163
+6963 7173
+7004 7183
+7046 7193
+7087 7203
+7129 7214
+7170 7225
+7212 7236
+7253 7247
+7294 7259
+7336 7271
+7377 7283
+7419 7295
+7460 7307
+7502 7319
+7543 7332
+7585 7345
+7626 7358
+7668 7371
+7709 7384
+7751 7397
+7792 7410
+7834 7424
+7875 7437
+7917 7451
+7958 7465
+7999 7479
+8041 7493
+8082 7507
+8124 7521
+8165 7535
+8207 7550
+8248 7564
+8290 7579
+8331 7593
+8373 7608
+8414 7622
+8456 7637
+8497 7652
+8539 7667
+8580 7682
+8622 7697
+8663 7712
+8705 7727
+8746 7742
+8787 7757
+8829 7772
+8870 7787
+8912 7802
+8953 7818
+8995 7833
+9036 7848
+160 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 34952
+1 0 0 [ 1 3 1 3 ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 160
+2442 5066
+2484 5082
+2525 5098
+2567 5114
+2608 5130
+2650 5146
+2691 5162
+2733 5178
+2774 5194
+2815 5210
+2857 5226
+2898 5242
+2940 5258
+2981 5273
+3023 5289
+3064 5305
+3106 5321
+3147 5337
+3189 5352
+3230 5368
+3272 5384
+3313 5400
+3355 5415
+3396 5431
+3438 5447
+3479 5462
+3521 5478
+3562 5494
+3603 5509
+3645 5525
+3686 5540
+3728 5556
+3769 5571
+3811 5587
+3852 5602
+3894 5617
+3935 5633
+3977 5648
+4018 5663
+4060 5678
+4101 5694
+4143 5709
+4184 5724
+4226 5739
+4267 5754
+4308 5769
+4350 5784
+4391 5799
+4433 5813
+4474 5828
+4516 5843
+4557 5857
+4599 5872
+4640 5886
+4682 5901
+4723 5915
+4765 5930
+4806 5944
+4848 5958
+4889 5972
+4931 5986
+4972 6000
+5014 6013
+5055 6027
+5096 6041
+5138 6054
+5179 6067
+5221 6080
+5262 6094
+5304 6106
+5345 6119
+5387 6132
+5428 6144
+5470 6157
+5511 6169
+5553 6181
+5594 6192
+5636 6204
+5677 6215
+5719 6227
+5760 6238
+5801 6248
+5843 6259
+5884 6269
+5926 6279
+5967 6289
+6009 6298
+6050 6308
+6092 6317
+6133 6325
+6175 6334
+6216 6342
+6258 6350
+6299 6357
+6341 6364
+6382 6371
+6424 6378
+6465 6384
+6506 6390
+6548 6396
+6589 6401
+6631 6406
+6672 6411
+6714 6415
+6755 6419
+6797 6423
+6838 6427
+6880 6430
+6921 6433
+6963 6436
+7004 6438
+7046 6441
+7087 6443
+7129 6444
+7170 6446
+7212 6447
+7253 6448
+7294 6449
+7336 6450
+7377 6451
+7419 6451
+7460 6451
+7502 6451
+7543 6451
+7585 6451
+7626 6450
+7668 6450
+7709 6449
+7751 6448
+7792 6447
+7834 6446
+7875 6445
+7917 6444
+7958 6442
+7999 6441
+8041 6439
+8082 6438
+8124 6436
+8165 6434
+8207 6432
+8248 6430
+8290 6428
+8331 6426
+8373 6424
+8414 6422
+8456 6420
+8497 6417
+8539 6415
+8580 6412
+8622 6410
+8663 6407
+8705 6405
+8746 6402
+8787 6399
+8829 6397
+8870 6394
+8912 6391
+8953 6388
+8995 6385
+9036 6383
+160 MLine
+End
+
+%%PageTrailer
+End %I eop
+showpage
+
+%%Trailer
+end
+%%EOF
diff --git a/gsl-1.9/doc/fit-wlinear2.eps b/gsl-1.9/doc/fit-wlinear2.eps
new file mode 100644
index 0000000..a59a809
--- /dev/null
+++ b/gsl-1.9/doc/fit-wlinear2.eps
@@ -0,0 +1,5908 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: GNU libplot drawing library 1.6
+%%Title: PostScript plot
+%%CreationDate: Sun Jul 29 14:10:38 2001
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 1
+%%Pages: 1
+%%PageOrder: Ascend
+%%Orientation: Portrait
+%%BoundingBox: 117 195 492 580
+%%DocumentNeededResources: font Helvetica
+%%DocumentSuppliedResources: procset GNU_libplot 1.0 0
+%%EndComments
+
+%%BeginDefaults
+%%PageResources: font Helvetica
+%%EndDefaults
+
+%%BeginProlog
+%%EndProlog
+
+%%BeginSetup
+%%IncludeResource: font Helvetica
+/DrawDict 50 dict def
+DrawDict begin
+/ISOLatin1Encoding [
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright
+/parenleft/parenright/asterisk/plus/comma/minus/period/slash
+/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon
+/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N
+/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright
+/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m
+/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/dotlessi/grave/acute/circumflex/tilde/macron/breve
+/dotaccent/dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut
+/ogonek/caron/space/exclamdown/cent/sterling/currency/yen/brokenbar
+/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot
+/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior
+/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine
+/guillemotright/onequarter/onehalf/threequarters/questiondown
+/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla
+/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex
+/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis
+/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute
+/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis
+/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave
+/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex
+/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis
+/yacute/thorn/ydieresis
+] def
+/reencodeISO {
+dup dup findfont dup length dict begin
+{ 1 index /FID ne { def }{ pop pop } ifelse } forall
+/Encoding ISOLatin1Encoding def
+currentdict end definefont
+} def
+/Helvetica reencodeISO def
+%%BeginResource procset GNU_libplot 1.0 0
+/none null def
+/numGraphicParameters 17 def
+/stringLimit 65535 def
+/arrowHeight 8 def
+/arrowWidth 4 def
+
+/Begin { save numGraphicParameters dict begin } def
+/End { end restore } def
+
+/SetB {
+dup type /nulltype eq {
+pop
+false /brushRightArrow idef
+false /brushLeftArrow idef
+true /brushNone idef
+} {
+/brushDashOffset idef
+/brushDashArray idef
+0 ne /brushRightArrow idef
+0 ne /brushLeftArrow idef
+/brushWidth idef
+false /brushNone idef
+} ifelse
+} def
+
+/SetCFg {
+/fgblue idef
+/fggreen idef
+/fgred idef
+} def
+
+/SetCBg {
+/bgblue idef
+/bggreen idef
+/bgred idef
+} def
+
+/SetF {
+/printSize idef
+/printFont idef
+} def
+
+/SetP {
+dup type /nulltype eq {
+pop true /patternNone idef
+} {
+/patternGrayLevel idef
+patternGrayLevel -1 eq {
+/patternString idef
+} if
+false /patternNone idef
+} ifelse
+} def
+
+/BSpl {
+0 begin
+storexyn
+newpath
+n 1 gt {
+0 0 0 0 0 0 1 1 true subspline
+n 2 gt {
+0 0 0 0 1 1 2 2 false subspline
+1 1 n 3 sub {
+/i exch def
+i 1 sub dup i dup i 1 add dup i 2 add dup false subspline
+} for
+n 3 sub dup n 2 sub dup n 1 sub dup 2 copy false subspline
+} if
+n 2 sub dup n 1 sub dup 2 copy 2 copy false subspline
+patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if
+brushNone not { istroke } if
+0 0 1 1 leftarrow
+n 2 sub dup 1 sub dup rightarrow
+} if
+end
+} dup 0 4 dict put def
+
+/Circ {
+newpath
+0 360 arc
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+} def
+
+/CBSpl {
+0 begin
+dup 2 gt {
+storexyn
+newpath
+n 1 sub dup 0 0 1 1 2 2 true subspline
+1 1 n 3 sub {
+/i exch def
+i 1 sub dup i dup i 1 add dup i 2 add dup false subspline
+} for
+n 3 sub dup n 2 sub dup n 1 sub dup 0 0 false subspline
+n 2 sub dup n 1 sub dup 0 0 1 1 false subspline
+patternNone not { ifill } if
+brushNone not { istroke } if
+} {
+Poly
+} ifelse
+end
+} dup 0 4 dict put def
+
+/Elli {
+0 begin
+newpath
+4 2 roll
+translate
+scale
+0 0 1 0 360 arc
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+end
+} dup 0 1 dict put def
+
+/Line {
+0 begin
+2 storexyn
+newpath
+x 0 get y 0 get moveto
+x 1 get y 1 get lineto
+brushNone not { istroke } if
+0 0 1 1 leftarrow
+0 0 1 1 rightarrow
+end
+} dup 0 4 dict put def
+
+/MLine {
+0 begin
+storexyn
+newpath
+n 1 gt {
+x 0 get y 0 get moveto
+1 1 n 1 sub {
+/i exch def
+x i get y i get lineto
+} for
+patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if
+brushNone not { istroke } if
+0 0 1 1 leftarrow
+n 2 sub dup n 1 sub dup rightarrow
+} if
+end
+} dup 0 4 dict put def
+
+/Poly {
+3 1 roll
+newpath
+moveto
+-1 add
+{ lineto } repeat
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+} def
+
+/Rect {
+0 begin
+/t exch def
+/r exch def
+/b exch def
+/l exch def
+newpath
+l b moveto
+l t lineto
+r t lineto
+r b lineto
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+end
+} dup 0 4 dict put def
+
+/Text {
+ishow
+} def
+
+/idef {
+dup where { pop pop pop } { exch def } ifelse
+} def
+
+/ifill {
+0 begin
+gsave
+patternGrayLevel -1 ne {
+fgred bgred fgred sub patternGrayLevel mul add
+fggreen bggreen fggreen sub patternGrayLevel mul add
+fgblue bgblue fgblue sub patternGrayLevel mul add setrgbcolor
+eofill
+} {
+eoclip
+originalCTM setmatrix
+pathbbox /t exch def /r exch def /b exch def /l exch def
+/w r l sub ceiling cvi def
+/h t b sub ceiling cvi def
+/imageByteWidth w 8 div ceiling cvi def
+/imageHeight h def
+bgred bggreen bgblue setrgbcolor
+eofill
+fgred fggreen fgblue setrgbcolor
+w 0 gt h 0 gt and {
+l b translate w h scale
+w h true [w 0 0 h neg 0 h] { patternproc } imagemask
+} if
+} ifelse
+grestore
+end
+} dup 0 8 dict put def
+
+/istroke {
+gsave
+brushDashOffset -1 eq {
+[] 0 setdash
+1 setgray
+} {
+brushDashArray brushDashOffset setdash
+fgred fggreen fgblue setrgbcolor
+} ifelse
+brushWidth setlinewidth
+originalCTM setmatrix
+stroke
+grestore
+} def
+
+/ishow {
+0 begin
+gsave
+fgred fggreen fgblue setrgbcolor
+/fontDict printFont findfont printSize scalefont dup setfont def
+/descender fontDict begin 0 /FontBBox load 1 get FontMatrix end
+transform exch pop def
+/vertoffset 1 printSize sub descender sub def {
+0 vertoffset moveto show
+/vertoffset vertoffset printSize sub def
+} forall
+grestore
+end
+} dup 0 3 dict put def
+
+/patternproc {
+0 begin
+/patternByteLength patternString length def
+/patternHeight patternByteLength 8 mul sqrt cvi def
+/patternWidth patternHeight def
+/patternByteWidth patternWidth 8 idiv def
+/imageByteMaxLength imageByteWidth imageHeight mul
+stringLimit patternByteWidth sub min def
+/imageMaxHeight imageByteMaxLength imageByteWidth idiv patternHeight idiv
+patternHeight mul patternHeight max def
+/imageHeight imageHeight imageMaxHeight sub store
+/imageString imageByteWidth imageMaxHeight mul patternByteWidth add string def
+0 1 imageMaxHeight 1 sub {
+/y exch def
+/patternRow y patternByteWidth mul patternByteLength mod def
+/patternRowString patternString patternRow patternByteWidth getinterval def
+/imageRow y imageByteWidth mul def
+0 patternByteWidth imageByteWidth 1 sub {
+/x exch def
+imageString imageRow x add patternRowString putinterval
+} for
+} for
+imageString
+end
+} dup 0 12 dict put def
+
+/min {
+dup 3 2 roll dup 4 3 roll lt { exch } if pop
+} def
+
+/max {
+dup 3 2 roll dup 4 3 roll gt { exch } if pop
+} def
+
+/midpoint {
+0 begin
+/y1 exch def
+/x1 exch def
+/y0 exch def
+/x0 exch def
+x0 x1 add 2 div
+y0 y1 add 2 div
+end
+} dup 0 4 dict put def
+
+/thirdpoint {
+0 begin
+/y1 exch def
+/x1 exch def
+/y0 exch def
+/x0 exch def
+x0 2 mul x1 add 3 div
+y0 2 mul y1 add 3 div
+end
+} dup 0 4 dict put def
+
+/subspline {
+0 begin
+/movetoNeeded exch def
+y exch get /y3 exch def
+x exch get /x3 exch def
+y exch get /y2 exch def
+x exch get /x2 exch def
+y exch get /y1 exch def
+x exch get /x1 exch def
+y exch get /y0 exch def
+x exch get /x0 exch def
+x1 y1 x2 y2 thirdpoint
+/p1y exch def
+/p1x exch def
+x2 y2 x1 y1 thirdpoint
+/p2y exch def
+/p2x exch def
+x1 y1 x0 y0 thirdpoint
+p1x p1y midpoint
+/p0y exch def
+/p0x exch def
+x2 y2 x3 y3 thirdpoint
+p2x p2y midpoint
+/p3y exch def
+/p3x exch def
+movetoNeeded { p0x p0y moveto } if
+p1x p1y p2x p2y p3x p3y curveto
+end
+} dup 0 17 dict put def
+
+/storexyn {
+/n exch def
+/y n array def
+/x n array def
+n 1 sub -1 0 {
+/i exch def
+y i 3 2 roll put
+x i 3 2 roll put
+} for
+} def
+
+/arrowhead {
+0 begin
+transform originalCTM itransform
+/taily exch def
+/tailx exch def
+transform originalCTM itransform
+/tipy exch def
+/tipx exch def
+/dy tipy taily sub def
+/dx tipx tailx sub def
+/angle dx 0 ne dy 0 ne or { dy dx atan } { 90 } ifelse def
+gsave
+originalCTM setmatrix
+tipx tipy translate
+angle rotate
+newpath
+arrowHeight neg arrowWidth 2 div moveto
+0 0 lineto
+arrowHeight neg arrowWidth 2 div neg lineto
+patternNone not {
+originalCTM setmatrix
+/padtip arrowHeight 2 exp 0.25 arrowWidth 2 exp mul add sqrt brushWidth mul
+arrowWidth div def
+/padtail brushWidth 2 div def
+tipx tipy translate
+angle rotate
+padtip 0 translate
+arrowHeight padtip add padtail add arrowHeight div dup scale
+arrowheadpath
+ifill
+} if
+brushNone not {
+originalCTM setmatrix
+tipx tipy translate
+angle rotate
+arrowheadpath
+istroke
+} if
+grestore
+end
+} dup 0 9 dict put def
+
+/arrowheadpath {
+newpath
+arrowHeight neg arrowWidth 2 div moveto
+0 0 lineto
+arrowHeight neg arrowWidth 2 div neg lineto
+} def
+
+/leftarrow {
+0 begin
+y exch get /taily exch def
+x exch get /tailx exch def
+y exch get /tipy exch def
+x exch get /tipx exch def
+brushLeftArrow { tipx tipy tailx taily arrowhead } if
+end
+} dup 0 4 dict put def
+
+/rightarrow {
+0 begin
+y exch get /tipy exch def
+x exch get /tipx exch def
+y exch get /taily exch def
+x exch get /tailx exch def
+brushRightArrow { tipx tipy tailx taily arrowhead } if
+end
+} dup 0 4 dict put def
+%%EndResource
+%%EndSetup
+
+%%Page: 1 1
+%%PageResources: font Helvetica
+%%PageBoundingBox: 117 195 492 580
+%%BeginPageSetup
+%I Idraw 8
+
+Begin
+%I b u
+%I cfg u
+%I cbg u
+%I f u
+%I p u
+%I t
+[ 1 0 0 1 0 0 ] concat
+/originalCTM matrix currentmatrix def
+/trueoriginalCTM matrix currentmatrix def
+%%EndPageSetup
+
+Begin %I Poly
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+2304 2304
+2304 9216
+9216 9216
+9216 2304
+4 Poly
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 120.5899 213.1332 ] concat
+%I
+[
+(0.0)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 9216
+2304 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2304 2442
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 206.9899 213.1332 ] concat
+%I
+[
+(0.5)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4032 9216
+4032 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4032 2304
+4032 2442
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 293.3899 213.1332 ] concat
+%I
+[
+(1.0)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5760 9216
+5760 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5760 2304
+5760 2442
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 379.7899 213.1332 ] concat
+%I
+[
+(1.5)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7488 9216
+7488 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7488 2304
+7488 2442
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 466.1899 213.1332 ] concat
+%I
+[
+(2.0)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 9216
+9216 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2304
+9216 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 9216
+2304 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2304 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2650 9216
+2650 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2650 2304
+2650 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2995 9216
+2995 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2995 2304
+2995 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3341 9216
+3341 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3341 2304
+3341 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3686 9216
+3686 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3686 2304
+3686 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4032 9216
+4032 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4032 2304
+4032 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4378 9216
+4378 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4378 2304
+4378 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4723 9216
+4723 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4723 2304
+4723 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5069 9216
+5069 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5069 2304
+5069 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5414 9216
+5414 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5414 2304
+5414 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5760 9216
+5760 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5760 2304
+5760 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6106 9216
+6106 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6106 2304
+6106 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6451 9216
+6451 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6451 2304
+6451 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6797 9216
+6797 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6797 2304
+6797 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7142 9216
+7142 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7142 2304
+7142 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7488 9216
+7488 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7488 2304
+7488 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7834 9216
+7834 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7834 2304
+7834 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8179 9216
+8179 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8179 2304
+8179 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8525 9216
+8525 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8525 2304
+8525 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8870 9216
+8870 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8870 2304
+8870 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 9216
+9216 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2304
+9216 2359
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 117.9279 229.3306 ] concat
+%I
+[
+(0)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2304
+9078 2304
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2442 2304
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 117.9279 278.702 ] concat
+%I
+[
+(1)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 3291
+9078 3291
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3291
+2442 3291
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 117.9279 328.0734 ] concat
+%I
+[
+(2)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4279
+9078 4279
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4279
+2442 4279
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 117.9279 377.4449 ] concat
+%I
+[
+(3)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5266
+9078 5266
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5266
+2442 5266
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 117.9279 426.8163 ] concat
+%I
+[
+(4)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 6254
+9078 6254
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 6254
+2442 6254
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 117.9279 476.1877 ] concat
+%I
+[
+(5)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 7241
+9078 7241
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 7241
+2442 7241
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 117.9279 525.5592 ] concat
+%I
+[
+(6)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 8229
+9078 8229
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 8229
+2442 8229
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 117.9279 574.9306 ] concat
+%I
+[
+(7)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 9216
+9078 9216
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 9216
+2442 9216
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2304
+9161 2304
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2359 2304
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2798
+9161 2798
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2798
+2359 2798
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 3291
+9161 3291
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3291
+2359 3291
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 3785
+9161 3785
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3785
+2359 3785
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4279
+9161 4279
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4279
+2359 4279
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4773
+9161 4773
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4773
+2359 4773
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5266
+9161 5266
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5266
+2359 5266
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5760
+9161 5760
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5760
+2359 5760
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 6254
+9161 6254
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 6254
+2359 6254
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 6747
+9161 6747
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 6747
+2359 6747
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 7241
+9161 7241
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 7241
+2359 7241
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 7735
+9161 7735
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 7735
+2359 7735
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 8229
+9161 8229
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 8229
+2359 8229
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 8722
+9161 8722
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 8722
+2359 8722
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 9216
+9161 9216
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 9216
+2359 9216
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2546 3162
+2753 3162
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2650 3162
+2650 3380
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2546 3380
+2753 3380
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2650 3206
+2650 3336
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2650 3271
+2706 3303
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2650 3271
+2593 3239
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2650 3271
+2706 3239
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2650 3271
+2593 3303
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2892 3503
+3099 3503
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2995 3503
+2995 3744
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2892 3744
+3099 3744
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2995 3558
+2995 3688
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2995 3623
+3051 3656
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2995 3623
+2939 3591
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2995 3623
+3051 3591
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2995 3623
+2939 3656
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3237 3677
+3444 3677
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3341 3677
+3341 3944
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3237 3944
+3444 3944
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3341 3746
+3341 3875
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3341 3811
+3397 3843
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3341 3811
+3285 3778
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3341 3811
+3397 3778
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3341 3811
+3285 3843
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3583 3740
+3790 3740
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3686 3740
+3686 4034
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3583 4034
+3790 4034
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3686 3822
+3686 3952
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3686 3887
+3743 3919
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3686 3887
+3630 3855
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3686 3887
+3743 3855
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3686 3887
+3630 3919
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3928 3936
+4136 3936
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4032 3936
+4032 4261
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3928 4261
+4136 4261
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4032 4034
+4032 4163
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4032 4098
+4088 4131
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4032 4098
+3976 4066
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4032 4098
+4088 4066
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4032 4098
+3976 4131
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4274 4025
+4481 4025
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4378 4025
+4378 4384
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4274 4384
+4481 4384
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4378 4140
+4378 4269
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4378 4205
+4434 4237
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4378 4205
+4321 4172
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4378 4205
+4434 4172
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4378 4205
+4321 4237
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4620 4013
+4827 4013
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4723 4013
+4723 4411
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4620 4411
+4827 4411
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4723 4147
+4723 4277
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4723 4212
+4779 4245
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4723 4212
+4667 4180
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4723 4212
+4779 4180
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4723 4212
+4667 4245
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4965 4563
+5172 4563
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5069 4563
+5069 5003
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4965 5003
+5172 5003
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5069 4718
+5069 4848
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5069 4783
+5125 4816
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5069 4783
+5013 4751
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5069 4783
+5125 4751
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5069 4783
+5013 4816
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5311 4481
+5518 4481
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5414 4481
+5414 4967
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5311 4967
+5518 4967
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5414 4659
+5414 4789
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5414 4724
+5471 4756
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5414 4724
+5358 4692
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5414 4724
+5471 4692
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5414 4724
+5358 4756
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5656 4257
+5864 4257
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5760 4257
+5760 4794
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5656 4794
+5864 4794
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5760 4460
+5760 4590
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5760 4525
+5816 4558
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5760 4525
+5704 4493
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5760 4525
+5816 4493
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5760 4525
+5704 4558
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6002 5058
+6209 5058
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6106 5058
+6106 5651
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6002 5651
+6209 5651
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6106 5290
+6106 5420
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6106 5355
+6162 5387
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6106 5355
+6049 5322
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6106 5355
+6162 5322
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6106 5355
+6049 5387
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6348 5751
+6555 5751
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6451 5751
+6451 6407
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6348 6407
+6555 6407
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6451 6014
+6451 6144
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6451 6079
+6507 6111
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6451 6079
+6395 6047
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6451 6079
+6507 6047
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6451 6079
+6395 6111
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6693 6156
+6900 6156
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6797 6156
+6797 6880
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6693 6880
+6900 6880
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6797 6453
+6797 6583
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6797 6518
+6853 6550
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6797 6518
+6741 6486
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6797 6518
+6853 6486
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6797 6518
+6741 6550
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7039 5122
+7246 5122
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7142 5122
+7142 5923
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7039 5923
+7246 5923
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7142 5458
+7142 5588
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7142 5523
+7199 5555
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7142 5523
+7086 5490
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7142 5523
+7199 5490
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7142 5523
+7086 5555
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7384 6788
+7592 6788
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7488 6788
+7488 7673
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7384 7673
+7592 7673
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7488 7166
+7488 7295
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7488 7230
+7544 7263
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7488 7230
+7432 7198
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7488 7230
+7544 7198
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7488 7230
+7432 7263
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7730 5908
+7937 5908
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7834 5908
+7834 6886
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7730 6886
+7937 6886
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7834 6332
+7834 6462
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7834 6397
+7890 6430
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7834 6397
+7777 6365
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7834 6397
+7890 6365
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7834 6397
+7777 6430
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8076 6922
+8283 6922
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8179 6922
+8179 8003
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8076 8003
+8283 8003
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8179 7397
+8179 7527
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8179 7462
+8235 7495
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8179 7462
+8123 7430
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8179 7462
+8235 7430
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8179 7462
+8123 7495
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8421 8010
+8628 8010
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8525 8010
+8525 9205
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8421 9205
+8628 9205
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8525 8543
+8525 8672
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8525 8608
+8581 8640
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8525 8608
+8469 8575
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8525 8608
+8581 8575
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8525 8608
+8469 8640
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8767 7571
+8974 7571
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8870 7571
+8870 8891
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8767 8891
+8974 8891
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8870 8167
+8870 8296
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8870 8231
+8927 8264
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8870 8231
+8814 8199
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8870 8231
+8927 8199
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8870 8231
+8814 8264
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 200
+2304 3314
+2339 3324
+2373 3334
+2408 3343
+2442 3353
+2477 3364
+2511 3374
+2546 3385
+2580 3395
+2615 3406
+2650 3417
+2684 3429
+2719 3440
+2753 3452
+2788 3463
+2822 3475
+2857 3488
+2892 3500
+2926 3512
+2961 3525
+2995 3538
+3030 3551
+3064 3564
+3099 3577
+3133 3591
+3168 3604
+3203 3618
+3237 3632
+3272 3647
+3306 3661
+3341 3675
+3375 3690
+3410 3705
+3444 3720
+3479 3735
+3514 3751
+3548 3766
+3583 3782
+3617 3798
+3652 3814
+3686 3831
+3721 3847
+3756 3864
+3790 3880
+3825 3897
+3859 3915
+3894 3932
+3928 3949
+3963 3967
+3997 3985
+4032 4003
+4067 4021
+4101 4039
+4136 4058
+4170 4077
+4205 4096
+4239 4115
+4274 4134
+4308 4153
+4343 4173
+4378 4193
+4412 4212
+4447 4233
+4481 4253
+4516 4273
+4550 4294
+4585 4315
+4620 4336
+4654 4357
+4689 4378
+4723 4399
+4758 4421
+4792 4443
+4827 4465
+4861 4487
+4896 4509
+4931 4532
+4965 4555
+5000 4578
+5034 4601
+5069 4624
+5103 4647
+5138 4671
+5172 4694
+5207 4718
+5242 4742
+5276 4767
+5311 4791
+5345 4816
+5380 4840
+5414 4865
+5449 4890
+5484 4916
+5518 4941
+5553 4967
+5587 4993
+5622 5019
+5656 5045
+5691 5071
+5725 5098
+5760 5124
+5795 5151
+5829 5178
+5864 5205
+5898 5233
+5933 5260
+5967 5288
+6002 5316
+6036 5344
+6071 5372
+6106 5401
+6140 5429
+6175 5458
+6209 5487
+6244 5516
+6278 5545
+6313 5575
+6348 5604
+6382 5634
+6417 5664
+6451 5694
+6486 5724
+6520 5755
+6555 5785
+6589 5816
+6624 5847
+6659 5878
+6693 5910
+6728 5941
+6762 5973
+6797 6005
+6831 6037
+6866 6069
+6900 6102
+6935 6134
+6970 6167
+7004 6200
+7039 6233
+7073 6266
+7108 6299
+7142 6333
+7177 6367
+7212 6401
+7246 6435
+7281 6469
+7315 6504
+7350 6538
+7384 6573
+7419 6608
+7453 6643
+7488 6679
+7523 6714
+7557 6750
+7592 6786
+7626 6822
+7661 6858
+7695 6894
+7730 6931
+7764 6967
+7799 7004
+7834 7041
+7868 7079
+7903 7116
+7937 7154
+7972 7191
+8006 7229
+8041 7267
+8076 7306
+8110 7344
+8145 7383
+8179 7422
+8214 7460
+8248 7500
+8283 7539
+8317 7578
+8352 7618
+8387 7658
+8421 7698
+8456 7738
+8490 7778
+8525 7819
+8559 7860
+8594 7901
+8628 7942
+8663 7983
+8698 8024
+8732 8066
+8767 8107
+8801 8149
+8836 8191
+8870 8234
+8905 8276
+8940 8319
+8974 8362
+9009 8404
+9043 8448
+9078 8491
+9112 8534
+9147 8578
+9181 8622
+200 MLine
+End
+
+%%PageTrailer
+End %I eop
+showpage
+
+%%Trailer
+end
+%%EOF
diff --git a/gsl-1.9/doc/fitting.texi b/gsl-1.9/doc/fitting.texi
new file mode 100644
index 0000000..f407e3b
--- /dev/null
+++ b/gsl-1.9/doc/fitting.texi
@@ -0,0 +1,501 @@
+@cindex fitting
+@cindex least squares fit
+@cindex regression, least squares
+@cindex weighted linear fits
+@cindex unweighted linear fits
+This chapter describes routines for performing least squares fits to
+experimental data using linear combinations of functions. The data
+may be weighted or unweighted, i.e. with known or unknown errors. For
+weighted data the functions compute the best fit parameters and their
+associated covariance matrix. For unweighted data the covariance
+matrix is estimated from the scatter of the points, giving a
+variance-covariance matrix.
+
+The functions are divided into separate versions for simple one- or
+two-parameter regression and multiple-parameter fits. The functions
+are declared in the header file @file{gsl_fit.h}.
+
+@menu
+* Fitting Overview::
+* Linear regression::
+* Linear fitting without a constant term::
+* Multi-parameter fitting::
+* Fitting Examples::
+* Fitting References and Further Reading::
+@end menu
+
+@node Fitting Overview
+@section Overview
+
+Least-squares fits are found by minimizing @math{\chi^2}
+(chi-squared), the weighted sum of squared residuals over @math{n}
+experimental datapoints @math{(x_i, y_i)} for the model @math{Y(c,x)},
+@tex
+\beforedisplay
+$$
+\chi^2 = \sum_i w_i (y_i - Y(c, x_i))^2
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+\chi^2 = \sum_i w_i (y_i - Y(c, x_i))^2
+@end example
+
+@end ifinfo
+@noindent
+The @math{p} parameters of the model are @c{$c = \{c_0, c_1, \dots\}$}
+@math{c = @{c_0, c_1, @dots{}@}}. The
+weight factors @math{w_i} are given by @math{w_i = 1/\sigma_i^2},
+where @math{\sigma_i} is the experimental error on the data-point
+@math{y_i}. The errors are assumed to be
+gaussian and uncorrelated.
+For unweighted data the chi-squared sum is computed without any weight factors.
+
+The fitting routines return the best-fit parameters @math{c} and their
+@math{p \times p} covariance matrix. The covariance matrix measures the
+statistical errors on the best-fit parameters resulting from the
+errors on the data, @math{\sigma_i}, and is defined
+@cindex covariance matrix, linear fits
+as @c{$C_{ab} = \langle \delta c_a \delta c_b \rangle$}
+@math{C_@{ab@} = <\delta c_a \delta c_b>} where @c{$\langle \, \rangle$}
+@math{< >} denotes an average over the gaussian error distributions of the underlying datapoints.
+
+The covariance matrix is calculated by error propagation from the data
+errors @math{\sigma_i}. The change in a fitted parameter @math{\delta
+c_a} caused by a small change in the data @math{\delta y_i} is given
+by
+@tex
+\beforedisplay
+$$
+\delta c_a = \sum_i {\partial c_a \over \partial y_i} \delta y_i
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+\delta c_a = \sum_i (dc_a/dy_i) \delta y_i
+@end example
+
+@end ifinfo
+@noindent
+allowing the covariance matrix to be written in terms of the errors on the data,
+@tex
+\beforedisplay
+$$
+C_{ab} = \sum_{i,j} {\partial c_a \over \partial y_i}
+ {\partial c_b \over \partial y_j}
+ \langle \delta y_i \delta y_j \rangle
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+C_@{ab@} = \sum_@{i,j@} (dc_a/dy_i) (dc_b/dy_j) <\delta y_i \delta y_j>
+@end example
+
+@end ifinfo
+@noindent
+For uncorrelated data the fluctuations of the underlying datapoints satisfy
+@c{$\langle \delta y_i \delta y_j \rangle = \sigma_i^2 \delta_{ij}$}
+@math{<\delta y_i \delta y_j> = \sigma_i^2 \delta_@{ij@}}, giving a
+corresponding parameter covariance matrix of
+@tex
+\beforedisplay
+$$
+C_{ab} = \sum_{i} {1 \over w_i} {\partial c_a \over \partial y_i} {\partial c_b \over \partial y_i}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+C_@{ab@} = \sum_i (1/w_i) (dc_a/dy_i) (dc_b/dy_i)
+@end example
+
+@end ifinfo
+@noindent
+When computing the covariance matrix for unweighted data, i.e. data with unknown errors,
+the weight factors @math{w_i} in this sum are replaced by the single estimate @math{w =
+1/\sigma^2}, where @math{\sigma^2} is the computed variance of the
+residuals about the best-fit model, @math{\sigma^2 = \sum (y_i - Y(c,x_i))^2 / (n-p)}.
+This is referred to as the @dfn{variance-covariance matrix}.
+@cindex variance-covariance matrix, linear fits
+
+The standard deviations of the best-fit parameters are given by the
+square root of the corresponding diagonal elements of
+the covariance matrix, @c{$\sigma_{c_a} = \sqrt{C_{aa}}$}
+@math{\sigma_@{c_a@} = \sqrt@{C_@{aa@}@}}.
+
+@node Linear regression
+@section Linear regression
+@cindex linear regression
+The functions described in this section can be used to perform
+least-squares fits to a straight line model, @math{Y(c,x) = c_0 + c_1 x}.
+
+@cindex covariance matrix, from linear regression
+@deftypefun int gsl_fit_linear (const double * @var{x}, const size_t @var{xstride}, const double * @var{y}, const size_t @var{ystride}, size_t @var{n}, double * @var{c0}, double * @var{c1}, double * @var{cov00}, double * @var{cov01}, double * @var{cov11}, double * @var{sumsq})
+This function computes the best-fit linear regression coefficients
+(@var{c0},@var{c1}) of the model @math{Y = c_0 + c_1 X} for the dataset
+(@var{x}, @var{y}), two vectors of length @var{n} with strides
+@var{xstride} and @var{ystride}. The errors on @var{y} are assumed unknown so
+the variance-covariance matrix for the
+parameters (@var{c0}, @var{c1}) is estimated from the scatter of the
+points around the best-fit line and returned via the parameters
+(@var{cov00}, @var{cov01}, @var{cov11}).
+The sum of squares of the residuals from the best-fit line is returned
+in @var{sumsq}.
+@end deftypefun
+
+@deftypefun int gsl_fit_wlinear (const double * @var{x}, const size_t @var{xstride}, const double * @var{w}, const size_t @var{wstride}, const double * @var{y}, const size_t @var{ystride}, size_t @var{n}, double * @var{c0}, double * @var{c1}, double * @var{cov00}, double * @var{cov01}, double * @var{cov11}, double * @var{chisq})
+This function computes the best-fit linear regression coefficients
+(@var{c0},@var{c1}) of the model @math{Y = c_0 + c_1 X} for the weighted
+dataset (@var{x}, @var{y}), two vectors of length @var{n} with strides
+@var{xstride} and @var{ystride}. The vector @var{w}, of length @var{n}
+and stride @var{wstride}, specifies the weight of each datapoint. The
+weight is the reciprocal of the variance for each datapoint in @var{y}.
+
+The covariance matrix for the parameters (@var{c0}, @var{c1}) is
+computed using the weights and returned via the parameters
+(@var{cov00}, @var{cov01}, @var{cov11}). The weighted sum of squares
+of the residuals from the best-fit line, @math{\chi^2}, is returned in
+@var{chisq}.
+@end deftypefun
+
+@deftypefun int gsl_fit_linear_est (double @var{x}, double @var{c0}, double @var{c1}, double @var{c00}, double @var{c01}, double @var{c11}, double * @var{y}, double * @var{y_err})
+This function uses the best-fit linear regression coefficients
+@var{c0},@var{c1} and their covariance
+@var{cov00},@var{cov01},@var{cov11} to compute the fitted function
+@var{y} and its standard deviation @var{y_err} for the model @math{Y =
+c_0 + c_1 X} at the point @var{x}.
+@end deftypefun
+
+@node Linear fitting without a constant term
+@section Linear fitting without a constant term
+
+The functions described in this section can be used to perform
+least-squares fits to a straight line model without a constant term,
+@math{Y = c_1 X}.
+
+@deftypefun int gsl_fit_mul (const double * @var{x}, const size_t @var{xstride}, const double * @var{y}, const size_t @var{ystride}, size_t @var{n}, double * @var{c1}, double * @var{cov11}, double * @var{sumsq})
+This function computes the best-fit linear regression coefficient
+@var{c1} of the model @math{Y = c_1 X} for the datasets (@var{x},
+@var{y}), two vectors of length @var{n} with strides @var{xstride} and
+@var{ystride}. The errors on @var{y} are assumed unknown so the
+variance of the parameter @var{c1} is estimated from
+the scatter of the points around the best-fit line and returned via the
+parameter @var{cov11}. The sum of squares of the residuals from the
+best-fit line is returned in @var{sumsq}.
+@end deftypefun
+
+@deftypefun int gsl_fit_wmul (const double * @var{x}, const size_t @var{xstride}, const double * @var{w}, const size_t @var{wstride}, const double * @var{y}, const size_t @var{ystride}, size_t @var{n}, double * @var{c1}, double * @var{cov11}, double * @var{sumsq})
+This function computes the best-fit linear regression coefficient
+@var{c1} of the model @math{Y = c_1 X} for the weighted datasets
+(@var{x}, @var{y}), two vectors of length @var{n} with strides
+@var{xstride} and @var{ystride}. The vector @var{w}, of length @var{n}
+and stride @var{wstride}, specifies the weight of each datapoint. The
+weight is the reciprocal of the variance for each datapoint in @var{y}.
+
+The variance of the parameter @var{c1} is computed using the weights
+and returned via the parameter @var{cov11}. The weighted sum of
+squares of the residuals from the best-fit line, @math{\chi^2}, is
+returned in @var{chisq}.
+@end deftypefun
+
+@deftypefun int gsl_fit_mul_est (double @var{x}, double @var{c1}, double @var{c11}, double * @var{y}, double * @var{y_err})
+This function uses the best-fit linear regression coefficient @var{c1}
+and its covariance @var{cov11} to compute the fitted function
+@var{y} and its standard deviation @var{y_err} for the model @math{Y =
+c_1 X} at the point @var{x}.
+@end deftypefun
+
+@node Multi-parameter fitting
+@section Multi-parameter fitting
+@cindex multi-parameter regression
+@cindex fits, multi-parameter linear
+The functions described in this section perform least-squares fits to a
+general linear model, @math{y = X c} where @math{y} is a vector of
+@math{n} observations, @math{X} is an @math{n} by @math{p} matrix of
+predictor variables, and the elements of the vector @math{c} are the @math{p} unknown best-fit parameters which are to be estimated. The chi-squared value is given by @c{$\chi^2 = \sum_i w_i (y_i - \sum_j X_{ij} c_j)^2$}
+@math{\chi^2 = \sum_i w_i (y_i - \sum_j X_@{ij@} c_j)^2}.
+
+This formulation can be used for fits to any number of functions and/or
+variables by preparing the @math{n}-by-@math{p} matrix @math{X}
+appropriately. For example, to fit to a @math{p}-th order polynomial in
+@var{x}, use the following matrix,
+@tex
+\beforedisplay
+$$
+X_{ij} = x_i^j
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+X_@{ij@} = x_i^j
+@end example
+
+@end ifinfo
+@noindent
+where the index @math{i} runs over the observations and the index
+@math{j} runs from 0 to @math{p-1}.
+
+To fit to a set of @math{p} sinusoidal functions with fixed frequencies
+@math{\omega_1}, @math{\omega_2}, @dots{}, @math{\omega_p}, use,
+@tex
+\beforedisplay
+$$
+X_{ij} = \sin(\omega_j x_i)
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+X_@{ij@} = sin(\omega_j x_i)
+@end example
+
+@end ifinfo
+@noindent
+To fit to @math{p} independent variables @math{x_1}, @math{x_2}, @dots{},
+@math{x_p}, use,
+@tex
+\beforedisplay
+$$
+X_{ij} = x_j(i)
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+X_@{ij@} = x_j(i)
+@end example
+
+@end ifinfo
+@noindent
+where @math{x_j(i)} is the @math{i}-th value of the predictor variable
+@math{x_j}.
+
+The functions described in this section are declared in the header file
+@file{gsl_multifit.h}.
+
+The solution of the general linear least-squares system requires an
+additional working space for intermediate results, such as the singular
+value decomposition of the matrix @math{X}.
+
+@deftypefun {gsl_multifit_linear_workspace *} gsl_multifit_linear_alloc (size_t @var{n}, size_t @var{p})
+This function allocates a workspace for fitting a model to @var{n}
+observations using @var{p} parameters.
+@end deftypefun
+
+@deftypefun void gsl_multifit_linear_free (gsl_multifit_linear_workspace * @var{work})
+This function frees the memory associated with the workspace @var{w}.
+@end deftypefun
+
+@deftypefun int gsl_multifit_linear (const gsl_matrix * @var{X}, const gsl_vector * @var{y}, gsl_vector * @var{c}, gsl_matrix * @var{cov}, double * @var{chisq}, gsl_multifit_linear_workspace * @var{work})
+@deftypefunx int gsl_multifit_linear_svd (const gsl_matrix * @var{X}, const gsl_vector * @var{y}, double @var{tol}, size_t * @var{rank}, gsl_vector * @var{c}, gsl_matrix * @var{cov}, double * @var{chisq}, gsl_multifit_linear_workspace * @var{work})
+These functions compute the best-fit parameters @var{c} of the model
+@math{y = X c} for the observations @var{y} and the matrix of predictor
+variables @var{X}. The variance-covariance matrix of the model
+parameters @var{cov} is estimated from the scatter of the observations
+about the best-fit. The sum of squares of the residuals from the
+best-fit, @math{\chi^2}, is returned in @var{chisq}.
+
+The best-fit is found by singular value decomposition of the matrix
+@var{X} using the preallocated workspace provided in @var{work}. The
+modified Golub-Reinsch SVD algorithm is used, with column scaling to
+improve the accuracy of the singular values. Any components which have
+zero singular value (to machine precision) are discarded from the fit.
+In the second form of the function the components are discarded if the
+ratio of singular values @math{s_i/s_0} falls below the user-specified
+tolerance @var{tol}, and the effective rank is returned in @var{rank}.
+@end deftypefun
+
+@deftypefun int gsl_multifit_wlinear (const gsl_matrix * @var{X}, const gsl_vector * @var{w}, const gsl_vector * @var{y}, gsl_vector * @var{c}, gsl_matrix * @var{cov}, double * @var{chisq}, gsl_multifit_linear_workspace * @var{work})
+@deftypefunx int gsl_multifit_wlinear_svd (const gsl_matrix * @var{X}, const gsl_vector * @var{w}, const gsl_vector * @var{y}, double @var{tol}, size_t * @var{rank}, gsl_vector * @var{c}, gsl_matrix * @var{cov}, double * @var{chisq}, gsl_multifit_linear_workspace * @var{work})
+
+This function computes the best-fit parameters @var{c} of the weighted
+model @math{y = X c} for the observations @var{y} with weights @var{w}
+and the matrix of predictor variables @var{X}. The covariance matrix of
+the model parameters @var{cov} is computed with the given weights. The
+weighted sum of squares of the residuals from the best-fit,
+@math{\chi^2}, is returned in @var{chisq}.
+
+The best-fit is found by singular value decomposition of the matrix
+@var{X} using the preallocated workspace provided in @var{work}. Any
+components which have zero singular value (to machine precision) are
+discarded from the fit. In the second form of the function the
+components are discarded if the ratio of singular values @math{s_i/s_0}
+falls below the user-specified tolerance @var{tol}, and the effective
+rank is returned in @var{rank}.
+@end deftypefun
+
+@deftypefun int gsl_multifit_linear_est (const gsl_vector * @var{x}, const gsl_vector * @var{c}, const gsl_matrix * @var{cov}, double * @var{y}, double * @var{y_err})
+This function uses the best-fit multilinear regression coefficients
+@var{c} and their covariance matrix
+@var{cov} to compute the fitted function value
+@var{y} and its standard deviation @var{y_err} for the model @math{y = x.c}
+at the point @var{x}.
+@end deftypefun
+
+@node Fitting Examples
+@section Examples
+
+The following program computes a least squares straight-line fit to a
+simple dataset, and outputs the best-fit line and its
+associated one standard-deviation error bars.
+
+@example
+@verbatiminclude examples/fitting.c
+@end example
+
+@noindent
+The following commands extract the data from the output of the program
+and display it using the @sc{gnu} plotutils @code{graph} utility,
+
+@example
+$ ./demo > tmp
+$ more tmp
+# best fit: Y = -106.6 + 0.06 X
+# covariance matrix:
+# [ 39602, -19.9
+# -19.9, 0.01]
+# chisq = 0.8
+
+$ for n in data fit hi lo ;
+ do
+ grep "^$n" tmp | cut -d: -f2 > $n ;
+ done
+$ graph -T X -X x -Y y -y 0 20 -m 0 -S 2 -Ie data
+ -S 0 -I a -m 1 fit -m 2 hi -m 2 lo
+@end example
+
+@iftex
+@sp 1
+@center @image{fit-wlinear,3.0in}
+@end iftex
+
+The next program performs a quadratic fit @math{y = c_0 + c_1 x + c_2
+x^2} to a weighted dataset using the generalised linear fitting function
+@code{gsl_multifit_wlinear}. The model matrix @math{X} for a quadratic
+fit is given by,
+@tex
+\beforedisplay
+$$
+X=\pmatrix{1&x_0&x_0^2\cr
+1&x_1&x_1^2\cr
+1&x_2&x_2^2\cr
+\dots&\dots&\dots\cr}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+X = [ 1 , x_0 , x_0^2 ;
+ 1 , x_1 , x_1^2 ;
+ 1 , x_2 , x_2^2 ;
+ ... , ... , ... ]
+@end example
+
+@end ifinfo
+@noindent
+where the column of ones corresponds to the constant term @math{c_0}.
+The two remaining columns corresponds to the terms @math{c_1 x} and
+@math{c_2 x^2}.
+
+The program reads @var{n} lines of data in the format (@var{x}, @var{y},
+@var{err}) where @var{err} is the error (standard deviation) in the
+value @var{y}.
+
+@example
+@verbatiminclude examples/fitting2.c
+@end example
+
+@noindent
+A suitable set of data for fitting can be generated using the following
+program. It outputs a set of points with gaussian errors from the curve
+@math{y = e^x} in the region @math{0 < x < 2}.
+
+@example
+@verbatiminclude examples/fitting3.c
+@end example
+
+@noindent
+The data can be prepared by running the resulting executable program,
+
+@example
+$ ./generate > exp.dat
+$ more exp.dat
+0.1 0.97935 0.110517
+0.2 1.3359 0.12214
+0.3 1.52573 0.134986
+0.4 1.60318 0.149182
+0.5 1.81731 0.164872
+0.6 1.92475 0.182212
+....
+@end example
+
+@noindent
+To fit the data use the previous program, with the number of data points
+given as the first argument. In this case there are 19 data points.
+
+@example
+$ ./fit 19 < exp.dat
+0.1 0.97935 +/- 0.110517
+0.2 1.3359 +/- 0.12214
+...
+# best fit: Y = 1.02318 + 0.956201 X + 0.876796 X^2
+# covariance matrix:
+[ +1.25612e-02, -3.64387e-02, +1.94389e-02
+ -3.64387e-02, +1.42339e-01, -8.48761e-02
+ +1.94389e-02, -8.48761e-02, +5.60243e-02 ]
+# chisq = 23.0987
+@end example
+
+@noindent
+The parameters of the quadratic fit match the coefficients of the
+expansion of @math{e^x}, taking into account the errors on the
+parameters and the @math{O(x^3)} difference between the exponential and
+quadratic functions for the larger values of @math{x}. The errors on
+the parameters are given by the square-root of the corresponding
+diagonal elements of the covariance matrix. The chi-squared per degree
+of freedom is 1.4, indicating a reasonable fit to the data.
+
+@iftex
+@sp 1
+@center @image{fit-wlinear2,3.0in}
+@end iftex
+
+@node Fitting References and Further Reading
+@section References and Further Reading
+
+A summary of formulas and techniques for least squares fitting can be
+found in the ``Statistics'' chapter of the Annual Review of Particle
+Physics prepared by the Particle Data Group,
+
+@itemize @asis
+@item
+@cite{Review of Particle Properties},
+R.M. Barnett et al., Physical Review D54, 1 (1996)
+@uref{http://pdg.lbl.gov/}
+@end itemize
+
+@noindent
+The Review of Particle Physics is available online at the website given
+above.
+
+@cindex NIST Statistical Reference Datasets
+@cindex Statistical Reference Datasets (StRD)
+The tests used to prepare these routines are based on the NIST
+Statistical Reference Datasets. The datasets and their documentation are
+available from NIST at the following website,
+
+@center @uref{http://www.nist.gov/itl/div898/strd/index.html}.
+
+
diff --git a/gsl-1.9/doc/freemanuals.texi b/gsl-1.9/doc/freemanuals.texi
new file mode 100644
index 0000000..0223f8c
--- /dev/null
+++ b/gsl-1.9/doc/freemanuals.texi
@@ -0,0 +1,99 @@
+@cindex free documentation
+
+@quotation
+@i{The following article was written by Richard Stallman, founder of the
+GNU Project.}
+@end quotation
+
+
+The biggest deficiency in the free software community today is not in
+the software---it is the lack of good free documentation that we can
+include with the free software. Many of our most important
+programs do not come with free reference manuals and free introductory
+texts. Documentation is an essential part of any software package;
+when an important free software package does not come with a free
+manual and a free tutorial, that is a major gap. We have many such
+gaps today.
+
+Consider Perl, for instance. The tutorial manuals that people
+normally use are non-free. How did this come about? Because the
+authors of those manuals published them with restrictive terms---no
+copying, no modification, source files not available---which exclude
+them from the free software world.
+
+That wasn't the first time this sort of thing happened, and it was far
+from the last. Many times we have heard a GNU user eagerly describe a
+manual that he is writing, his intended contribution to the community,
+only to learn that he had ruined everything by signing a publication
+contract to make it non-free.
+
+Free documentation, like free software, is a matter of freedom, not
+price. The problem with the non-free manual is not that publishers
+charge a price for printed copies---that in itself is fine. (The Free
+Software Foundation sells printed copies of manuals, too.) The
+problem is the restrictions on the use of the manual. Free manuals
+are available in source code form, and give you permission to copy and
+modify. Non-free manuals do not allow this.
+
+The criteria of freedom for a free manual are roughly the same as for
+free software. Redistribution (including the normal kinds of
+commercial redistribution) must be permitted, so that the manual can
+accompany every copy of the program, both on-line and on paper.
+
+Permission for modification of the technical content is crucial too.
+When people modify the software, adding or changing features, if they
+are conscientious they will change the manual too---so they can
+provide accurate and clear documentation for the modified program. A
+manual that leaves you no choice but to write a new manual to document
+a changed version of the program is not really available to our
+community.
+
+Some kinds of limits on the way modification is handled are
+acceptable. For example, requirements to preserve the original
+author's copyright notice, the distribution terms, or the list of
+authors, are ok. It is also no problem to require modified versions
+to include notice that they were modified. Even entire sections that
+may not be deleted or changed are acceptable, as long as they deal
+with nontechnical topics (like this one). These kinds of restrictions
+are acceptable because they don't obstruct the community's normal use
+of the manual.
+
+However, it must be possible to modify all the @emph{technical}
+content of the manual, and then distribute the result in all the usual
+media, through all the usual channels. Otherwise, the restrictions
+obstruct the use of the manual, it is not free, and we need another
+manual to replace it.
+
+Please spread the word about this issue. Our community continues to
+lose manuals to proprietary publishing. If we spread the word that
+free software needs free reference manuals and free tutorials, perhaps
+the next person who wants to contribute by writing documentation will
+realize, before it is too late, that only free manuals contribute to
+the free software community.
+
+If you are writing documentation, please insist on publishing it under
+the GNU Free Documentation License or another free documentation
+license. Remember that this decision requires your approval---you
+don't have to let the publisher decide. Some commercial publishers
+will use a free license if you insist, but they will not propose the
+option; it is up to you to raise the issue and say firmly that this is
+what you want. If the publisher you are dealing with refuses, please
+try other publishers. If you're not sure whether a proposed license
+is free, write to @email{licensing@@gnu.org}.
+
+You can encourage commercial publishers to sell more free, copylefted
+manuals and tutorials by buying them, and particularly by buying
+copies from the publishers that paid for their writing or for major
+improvements. Meanwhile, try to avoid buying non-free documentation
+at all. Check the distribution terms of a manual before you buy it,
+and insist that whoever seeks your business must respect your freedom.
+Check the history of the book, and try reward the publishers that have
+paid or pay the authors to work on it.
+
+The Free Software Foundation maintains a list of free documentation
+published by other publishers:
+
+@itemize @asis
+@item
+@uref{http://www.fsf.org/doc/other-free-books.html}
+@end itemize
diff --git a/gsl-1.9/doc/gpl.texi b/gsl-1.9/doc/gpl.texi
new file mode 100644
index 0000000..28f738f
--- /dev/null
+++ b/gsl-1.9/doc/gpl.texi
@@ -0,0 +1,407 @@
+@center Version 2, June 1991
+@iftex
+@smallerfonts @rm
+@end iftex
+
+@c This file is intended to be included in another file.
+
+@display
+Copyright @copyright{} 1989, 1991 Free Software Foundation, Inc.
+59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+
+Everyone is permitted to copy and distribute verbatim copies of this
+license document, but changing it is not allowed.
+@end display
+
+@heading Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software---to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+@iftex
+@heading TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+@end iftex
+@ifinfo
+@center TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+@end ifinfo
+
+@enumerate 0
+@item
+This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The ``Program'', below,
+refers to any such program or work, and a ``work based on the Program''
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term ``modification''.) Each licensee is addressed as ``you''.
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+@item
+You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+@item
+You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+@enumerate a
+@item
+You must cause the modified files to carry prominent notices
+stating that you changed the files and the date of any change.
+
+@item
+You must cause any work that you distribute or publish, that in
+whole or in part contains or is derived from the Program or any
+part thereof, to be licensed as a whole at no charge to all third
+parties under the terms of this License.
+
+@item
+If the modified program normally reads commands interactively
+when run, you must cause it, when started running for such
+interactive use in the most ordinary way, to print or display an
+announcement including an appropriate copyright notice and a
+notice that there is no warranty (or else, saying that you provide
+a warranty) and that users may redistribute the program under
+these conditions, and telling the user how to view a copy of this
+License. (Exception: if the Program itself is interactive but
+does not normally print such an announcement, your work based on
+the Program is not required to print an announcement.)
+@end enumerate
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+@item
+You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+@enumerate a
+@item
+Accompany it with the complete corresponding machine-readable
+source code, which must be distributed under the terms of Sections
+1 and 2 above on a medium customarily used for software interchange; or,
+
+@item
+Accompany it with a written offer, valid for at least three
+years, to give any third party, for a charge no more than your
+cost of physically performing source distribution, a complete
+machine-readable copy of the corresponding source code, to be
+distributed under the terms of Sections 1 and 2 above on a medium
+customarily used for software interchange; or,
+
+@item
+Accompany it with the information you received as to the offer
+to distribute corresponding source code. (This alternative is
+allowed only for noncommercial distribution and only if you
+received the program in object code or executable form with such
+an offer, in accord with Subsection b above.)
+@end enumerate
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+@item
+You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+@item
+You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+@item
+Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+@item
+If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+@item
+If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+@item
+The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and ``any
+later version'', you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+@item
+If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+@iftex
+@heading NO WARRANTY
+@end iftex
+@ifinfo
+@center NO WARRANTY
+@end ifinfo
+
+@item
+BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM ``AS IS'' WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+@item
+IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+@end enumerate
+
+@iftex
+@heading END OF TERMS AND CONDITIONS
+@end iftex
+@ifinfo
+@center END OF TERMS AND CONDITIONS
+@end ifinfo
+
+@page
+@heading Appendix: How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the ``copyright'' line and a pointer to where the full notice is found.
+
+@smallexample
+@var{one line to give the program's name and a brief idea @*of what it does.}
+Copyright (C) @var{yyyy} @var{name of author}
+
+This program is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later
+version.
+
+This program is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied
+warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. See the GNU General Public License for more
+details.
+
+You should have received a copy of the GNU General Public
+License along with this program; if not, write to the Free
+Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.
+@end smallexample
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+@smallexample
+Gnomovision version 69, Copyright (C) 19@var{yy} @var{name of author}
+Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
+type `show w'. This is free software, and you are welcome
+to redistribute it under certain conditions; type `show c'
+for details.
+@end smallexample
+
+The hypothetical commands @samp{show w} and @samp{show c} should show
+the appropriate parts of the General Public License. Of course, the
+commands you use may be called something other than @samp{show w} and
+@samp{show c}; they could even be mouse-clicks or menu items---whatever
+suits your program.
+
+@need 1500
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a ``copyright disclaimer'' for the program, if
+necessary. Here is a sample; alter the names:
+
+@smallexample
+Yoyodyne, Inc., hereby disclaims all copyright interest in
+the program `Gnomovision' (which makes passes at compilers)
+written by James Hacker.
+
+@var{signature of Ty Coon}, 1 April 1989
+Ty Coon, President of Vice
+@end smallexample
+
+@iftex
+@smallerfonts @rm
+@end iftex
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
+
+@iftex
+@*
+@textfonts @rm
+@end iftex
diff --git a/gsl-1.9/doc/gsl-config.1 b/gsl-1.9/doc/gsl-config.1
new file mode 100644
index 0000000..e8c1ebc
--- /dev/null
+++ b/gsl-1.9/doc/gsl-config.1
@@ -0,0 +1,42 @@
+.TH GSL 1 "22 May 2001"
+.SH NAME
+gsl-config - script to get version number and compiler flags of the installed GSL library
+.SH SYNOPSIS
+.B gsl-config
+[\-\-prefix] [\-\-version] [\-\-libs] [\-\-libs\-without\-cblas] [\-\-cflags]
+.SH DESCRIPTION
+.PP
+\fIgsl-config\fP is a tool that is used to configure to determine
+the compiler and linker flags that should be used to compile
+and link programs that use \fIGSL\fP. It is also used internally
+to the .m4 macros for GNU autoconf that are included with \fIGSL\fP.
+.
+.SH OPTIONS
+.l
+\fIgsl-config\fP accepts the following options:
+.TP 8
+.B \-\-version
+Print the currently installed version of \fIGSL\fP on the standard output.
+.TP 8
+.B \-\-libs
+Print the linker flags that are necessary to link a \fIGSL\fP program, with cblas
+.TP 8
+.B \-\-libs\-without\-cblas
+Print the linker flags that are necessary to link a \fIGSL\fP program, without cblas
+.TP 8
+.B \-\-cflags
+Print the compiler flags that are necessary to compile a \fIGSL\fP program.
+.TP 8
+.B \-\-prefix
+Show the GSL installation prefix.
+.SH SEE ALSO
+.BR gtk-config (1),
+.BR gnome-config (1)
+.SH COPYRIGHT
+Copyright \(co 2001 Christopher R. Gabriel
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation.
diff --git a/gsl-1.9/doc/gsl-design.texi b/gsl-1.9/doc/gsl-design.texi
new file mode 100644
index 0000000..7e513ef
--- /dev/null
+++ b/gsl-1.9/doc/gsl-design.texi
@@ -0,0 +1,1610 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename gsl-design.info
+@settitle GNU Scientific Library
+@finalout
+@c -@setchapternewpage odd
+@c %**end of header
+
+@dircategory Scientific software
+@direntry
+* GSL-design: (GSL-design). GNU Scientific Library -- Design
+@end direntry
+
+@comment @include version-design.texi
+@set GSL @i{GNU Scientific Library}
+
+@ifinfo
+This file documents the @value{GSL}.
+
+Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2004 The GSL Project.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A
+copy of the license is included in the section entitled ``GNU Free
+Documentation License''.
+@end ifinfo
+
+@titlepage
+@title GNU Scientific Library -- Design document
+@comment @subtitle Edition @value{EDITION}, for gsl Version @value{VERSION}
+@comment @subtitle @value{UPDATED}
+@author Mark Galassi
+Los Alamos National Laboratory
+
+@author James Theiler
+Astrophysics and Radiation Measurements Group, Los Alamos National Laboratory
+
+@author Brian Gough
+Network Theory Limited
+
+@page
+@vskip 0pt plus 1filll
+Copyright @copyright{} 1996,1997,1998,1999,2000,2001,2004 The GSL Project.
+
+Permission is granted to make and distribute verbatim copies of
+this manual provided the copyright notice and this permission notice
+are preserved on all copies.
+
+Permission is granted to copy and distribute modified versions of this
+manual under the conditions for verbatim copying, provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+Permission is granted to copy and distribute translations of this manual
+into another language, under the above conditions for modified versions,
+except that this permission notice may be stated in a translation approved
+by the Foundation.
+@end titlepage
+
+@contents
+
+@node Top, Motivation, (dir), (dir)
+@top About GSL
+
+@ifinfo
+This file documents the design of @value{GSL}, a collection of numerical
+routines for scientific computing.
+
+More information about GSL can be found at the project homepage,
+@uref{http://www.gnu.org/software/gsl/}.
+@end ifinfo
+
+The @value{GSL} is a library of scientific subroutines. It aims to
+provide a convenient interface to routines that do standard (and not so
+standard) tasks that arise in scientific research. More than that, it
+also provides the source code. Users are welcome to alter, adjust,
+modify, and improve the interfaces and/or implementations of whichever
+routines might be needed for a particular purpose.
+
+GSL is intended to provide a free equivalent to existing proprietary
+numerical libraries written in C or Fortran, such as NAG, IMSL's CNL,
+IBM's ESSL, and SGI's SCSL.
+
+The target platform is a low-end desktop workstation. The goal is to
+provide something which is generally useful, and the library is aimed at
+general users rather than specialists.
+
+@menu
+* Motivation::
+* Contributing::
+* Design::
+* Bibliography::
+* Copying::
+* GNU Free Documentation License::
+@end menu
+
+@node Motivation, Contributing, Top, Top
+@chapter Motivation
+@cindex numerical analysis
+@cindex free software
+
+There is a need for scientists and engineers to have a numerical library
+that:
+@itemize @bullet
+@item
+is free (in the sense of freedom, not in the sense of gratis; see the
+GNU General Public License), so that people can use that library,
+redistribute it, modify it @dots{}
+@item
+is written in C using modern coding conventions, calling conventions,
+scoping @dots{}
+@item
+is clearly and pedagogically documented; preferably with TeXinfo, so as
+to allow online info, WWW and TeX output.
+@item
+uses top quality state-of-the-art algorithms.
+@item
+is portable and configurable using @emph{autoconf} and @emph{automake}.
+@item
+basically, is GNUlitically correct.
+@end itemize
+
+There are strengths and weaknesses with existing libraries:
+
+@emph{Netlib} (http://www.netlib.org/) is probably the most advanced set
+of numerical algorithms available on the net, maintained by AT&T.
+Unfortunately most of the software is written in Fortran, with strange
+calling conventions in many places. It is also not very well collected,
+so it is a lot of work to get started with netlib.
+
+@emph{GAMS} (http://gams.nist.gov/) is an extremely well organized set
+of pointers to scientific software, but like netlib, the individual
+routines vary in their quality and their level of documentation.
+
+@emph{Numerical Recipes} (http://www.nr.com,
+http://cfata2.harvard.edu/nr/) is an excellent book: it explains the
+algorithms in a very clear way. Unfortunately the authors released the
+source code under a license which allows you to use it, but prevents you
+from re-distributing it. Thus Numerical Recipes is not @emph{free} in
+the sense of @emph{freedom}. On top of that, the implementation suffers
+from @emph{fortranitis} and other
+limitations. [http://www.lysator.liu.se/c/num-recipes-in-c.html]
+
+@emph{SLATEC} is a large public domain collection of numerical routines
+in Fortran written under a Department of Energy program in the
+1970's. The routines are well tested and have a reasonable overall
+design (given the limitations of that era). GSL should aim to be a
+modern version of SLATEC.
+
+@emph{NSWC} is the Naval Surface Warfare Center numerical library. It
+is a large public-domain Fortran library, containing a lot of
+high-quality code. Documentation for the library is hard to find, only
+a few photocopies of the printed manual are still in circulation.
+
+@emph{NAG} and @emph{IMSL} both sell high-quality libraries which are
+proprietary. The NAG library is more advanced and has wider scope than
+IMSL. The IMSL library leans more towards ease-of-use and makes
+extensive use of variable length argument lists to emulate "default
+arguments".
+
+@emph{ESSL} and @emph{SCSL} are proprietary libraries from IBM and SGI.
+
+@emph{Forth Scientific Library} [see the URL
+http://www.taygeta.com/fsl/sciforth.html]. Mainly of interest to Forth
+users.
+
+@emph{Numerical Algorithms with C} G. Engeln-Mullges, F. Uhlig. A nice
+numerical library written in ANSI C with an accompanying
+textbook. Source code is available but the library is not free software.
+
+@emph{NUMAL} A C version of the NUMAL library has been written by
+H.T. Lau and is published as a book and disk with the title "A Numerical
+Library in C for Scientists and Engineers". Source code is available but
+the library is not free software.
+
+@emph{C Mathematical Function Handbook} by Louis Baker. A library of
+function approximations and methods corresponding to those in the
+"Handbook of Mathematical Functions" by Abramowitz and Stegun. Source
+code is available but the library is not free software.
+
+@emph{CCMATH} by Daniel A. Atkinson. A C numerical library covering
+similar areas to GSL. The code is quite terse. Earlier versions were
+under the GPL but unfortunately it has changed to the LGPL in recent
+versions.
+
+@emph{CEPHES} A useful collection of high-quality special functions
+written in C. Not GPL'ed.
+
+@emph{WNLIB} A small collection of numerical routines written in C by
+Will Naylor. Public domain.
+
+@emph{MESHACH} A comprehensive matrix-vector linear algebra library
+written in C. Freely available but not GPL'ed (non-commercial license).
+
+@emph{CERNLIB} is a large high-quality Fortran library developed at CERN
+over many years. It was originally non-free software but has recently
+been released under the GPL.
+
+@emph{COLT} is a free numerical library in Java developed at CERN by
+Wolfgang Hoschek. It is under a BSD-style license.
+
+The long-term goal will be to provide a framework to which the real
+numerical experts (or their graduate students) will contribute.
+
+@node Contributing, Design, Motivation, Top
+@chapter Contributing
+
+This design document was originally written in 1996. As of 2004, GSL
+itself is essentially feature complete, the developers are not actively
+working on any major new functionality.
+
+The main emphasis is now on ensuring the stability of the existing
+functions, improving consistency, tidying up a few problem areas and
+fixing any bugs that are reported. Potential contributors are
+encouraged to gain familiarity with the library by investigating and
+fixing known problems listed in the @file{BUGS} file in the CVS
+repository.
+
+Adding large amounts of new code is difficult because it leads to
+differences in the maturity of different parts of the library. To
+maintain stability, any new functionality is encouraged as
+@dfn{packages}, built on top of GSL and maintained independently by the
+author, as in other free software projects (such as the Perl CPAN
+archive and TeX CTAN archive, etc).
+
+@menu
+* Packages::
+@end menu
+
+@node Packages, , Contributing, Contributing
+@section Packages
+
+The design of GSL permits extensions to be used alongside the existing
+library easily by simple linking. For example, additional random number
+generators can be provided in a separate library:
+
+@example
+$ tar xvfz rngextra-0.1.tar.gz
+$ cd rngextra-0.1
+$ ./configure; make; make check; make install
+$ ...
+$ gcc -Wall main.c -lrngextra -lgsl -lgslcblas -lm
+@end example
+
+The points below summarise the package design guidelines. These are
+intended to ensure that packages are consistent with GSL itself, to make
+life easier for the end-user and make it possible to distribute popular
+well-tested packages as part of the core GSL in future.
+
+@itemize @bullet
+@item Follow the GSL and GNU coding standards described in this document
+
+This means using the standard GNU packaging tools, such as Automake,
+providing documentation in Texinfo format, and a test suite. The test
+suite should run using @samp{make check}, and use the test functions
+provided in GSL to produce the output with @code{PASS:}/@code{FAIL:}
+lines. It is not essential to use libtool since packages are likely to
+be small, a static library is sufficient and simpler to build.
+
+@item Use a new unique prefix for the package (do not use @samp{gsl_} -- this is reserved for internal use).
+
+For example, a package of additional random number generators might use
+the prefix @code{rngextra}.
+
+@example
+#include <rngextra.h>
+
+gsl_rng * r = gsl_rng_alloc (rngextra_lsfr32);
+@end example
+
+@item Use a meaningful version number which reflects the state of development
+
+Generally, @code{0.x} are alpha versions, which provide no guarantees.
+Following that, @code{0.9.x} are beta versions, which should be essentially
+complete, subject only to minor changes and bug fixes. The first major
+release is @code{1.0}. Any version number of @code{1.0} or higher
+should be suitable for production use with a well-defined API.
+
+The API must not change in a major release and should be
+backwards-compatible in its behavior (excluding actual bug-fixes), so
+that existing code do not have to be modified. Note that the API
+includes all exported definitions, including data-structures defined
+with @code{struct}. If you need to change the API in a package, it
+requires a new major release (e.g. @code{2.0}).
+
+@item Use the GNU General Public License (GPL)
+
+Follow the normal procedures of obtaining a copyright disclaimer if you
+would like to have the package considered for inclusion in GSL itself in
+the future (@pxref{Legal issues}).
+@end itemize
+
+Post announcements of your package releases to
+@email{gsl-discuss@@sources.redhat.com} so that information about them
+can be added to the GSL webpages.
+
+For security, sign your package with GPG (@code{gpg --detach-sign
+@var{file}}).
+
+An example package @samp{rngextra} containing two additional random
+number generators can be found at
+@url{http://www.network-theory.co.uk/download/rngextra/}.
+
+@node Design, Bibliography, Contributing, Top
+@chapter Design
+
+@menu
+* Language for implementation::
+* Interface to other languages::
+* What routines are implemented::
+* What routines are not implemented::
+* Design of Numerical Libraries::
+* Code Reuse::
+* Standards and conventions::
+* Background and Preparation::
+* Choice of Algorithms::
+* Documentation::
+* Namespace::
+* Header files::
+* Target system::
+* Function Names::
+* Object-orientation::
+* Comments::
+* Minimal structs::
+* Algorithm decomposition::
+* Memory allocation and ownership::
+* Memory layout::
+* Linear Algebra Levels::
+* Error estimates::
+* Exceptions and Error handling::
+* Persistence::
+* Using Return Values::
+* Variable Names::
+* Datatype widths::
+* size_t::
+* Arrays vs Pointers::
+* Pointers::
+* Constness::
+* Pseudo-templates::
+* Arbitrary Constants::
+* Test suites::
+* Compilation::
+* Thread-safety::
+* Legal issues::
+* Non-UNIX portability::
+* Compatibility with other libraries::
+* Parallelism::
+* Precision::
+* Miscellaneous::
+@end menu
+
+@node Language for implementation, Interface to other languages, Design, Design
+@section Language for implementation
+
+@strong{One language only (C)}
+
+Advantages: simpler, compiler available and quite universal.
+
+@node Interface to other languages, What routines are implemented, Language for implementation, Design
+@section Interface to other languages
+
+Wrapper packages are supplied as "extra" packages; not as part of the
+"core". They are maintained separately by independent contributors.
+
+Use standard tools to make wrappers: swig, g-wrap
+
+@node What routines are implemented, What routines are not implemented, Interface to other languages, Design
+@section What routines are implemented
+
+Anything which is in any of the existing libraries. Obviously it makes
+sense to prioritize and write code for the most important areas first.
+
+@c @itemize @bullet
+@c @item Random number generators
+
+@c Includes both random number generators and routines to give various
+@c interesting distributions.
+
+@c @item Statistics
+
+@c @item Special Functions
+
+@c What I (jt) envision for this section is a collection of routines for
+@c reliable and accurate (but not necessarily fast or efficient) estimation
+@c of values for special functions, explicitly using Taylor series, asymptotic
+@c expansions, continued fraction expansions, etc. As well as these routines,
+@c fast approximations will also be provided, primarily based on Chebyschev
+@c polynomials and ratios of polynomials. In this vision, the approximations
+@c will be the "standard" routines for the users, and the exact (so-called)
+@c routines will be used for verification of the approximations. It may also
+@c be useful to provide various identity-checking routines as part of the
+@c verification suite.
+
+@c @item Curve fitting
+
+@c polynomial, special functions, spline
+
+@c @item Ordinary differential equations
+
+@c @item Partial differential equations
+
+@c @item Fourier Analysis
+
+@c @item Wavelets
+
+@c @item Matrix operations: linear equations
+
+@c @item Matrix operations: eigenvalues and spectral analysis
+
+@c @item Matrix operations: any others?
+
+@c @item Direct integration
+
+@c @item Monte carlo methods
+
+@c @item Simulated annealing
+
+@c @item Genetic algorithms
+
+@c We need to think about what kinds of algorithms are basic generally
+@c useful numerical algorithms, and which ones are special purpose
+@c research projects. We should concentrate on supplying the former.
+
+@c @item Cellular automata
+
+@c @end itemize
+
+@node What routines are not implemented, Design of Numerical Libraries, What routines are implemented, Design
+@section What routines are not implemented
+
+@itemize @bullet
+@item anything which already exists as a high-quality GPL'ed package.
+
+@item anything which is too big
+ -- i.e. an application in its own right rather than a subroutine
+
+For example, partial differential equation solvers are often huge and
+very specialized applications (since there are so many types of PDEs,
+types of solution, types of grid, etc). This sort of thing should
+remain separate. It is better to point people to the good applications
+which exist.
+
+@item anything which is independent and useful separately.
+
+Arguably functions for manipulating date and time, or financial
+functions might be included in a "scientific" library. However, these
+sorts of modules could equally well be used independently in other
+programs, so it makes sense for them to be separate libraries.
+@end itemize
+
+@node Design of Numerical Libraries, Code Reuse, What routines are not implemented, Design
+@section Design of Numerical Libraries
+
+In writing a numerical library there is a unavoidable conflict between
+completeness and simplicity. Completeness refers to the ability to
+perform operations on different objects so that the group is
+"closed". In mathematics objects can be combined and operated on in an
+infinite number of ways. For example, I can take the derivative of a
+scalar field with respect to a vector and the derivative of a vector
+field wrt a scalar (along a path).
+
+There is a definite tendency to unconsciously try to reproduce all these
+possibilities in a numerical library, by adding new features one by
+one. After all, it is always easy enough to support just one more
+feature.... so why not?
+
+Looking at the big picture, no-one would start out by saying "I want to
+be able to represent every possible mathematical object and operation
+using C structs" -- this is a strategy which is doomed to fail. There
+is a limited amount of complexity which can be represented in a
+programming language like C. Attempts to reproduce the complexity of
+mathematics within such a language would just lead to a morass of
+unmaintainable code. However, it's easy to go down that road if you
+don't think about it ahead of time.
+
+It is better to choose simplicity over completeness. In designing new
+parts of the library keep modules independent where possible. If
+interdependencies between modules are introduced be sure about where you
+are going to draw the line.
+
+@node Code Reuse, Standards and conventions, Design of Numerical Libraries, Design
+@section Code Reuse
+
+It is useful if people can grab a single source file and include it in
+their own programs without needing the whole library. Try to allow
+standalone files like this whenever it is reasonable. Obviously the
+user might need to define a few macros, such as GSL_ERROR, to compile
+the file but that is ok. Examples where this can be done: grabbing a
+single random number generator.
+
+@node Standards and conventions, Background and Preparation, Code Reuse, Design
+@section Standards and conventions
+
+The people who kick off this project should set the coding standards and
+conventions. In order of precedence the standards that we follow are,
+
+@itemize @bullet
+@item We follow the GNU Coding Standards.
+@item We follow the conventions of the ANSI Standard C Library.
+@item We follow the conventions of the GNU C Library.
+@item We follow the conventions of the glib GTK support Library.
+@end itemize
+
+The references for these standards are the @cite{GNU Coding Standards}
+document, Harbison and Steele @cite{C: A Reference Manual}, the
+@cite{GNU C Library Manual} (version 2), and the Glib source code.
+
+For mathematical formulas, always follow the conventions in Abramowitz &
+Stegun, the @cite{Handbook of Mathematical Functions}, since it is the
+definitive reference and also in the public domain.
+
+If the project has a philosophy it is to "Think in C". Since we are
+working in C we should only do what is natural in C, rather than trying
+to simulate features of other languages. If there is something which is
+unnatural in C and has to be simulated then we avoid using it. If this
+means leaving something out of the library, or only offering a limited
+version then so be it. It is not worthwhile making the library
+over-complicated. There are numerical libraries in other languages, and
+if people need the features of those languages it would be sensible for
+them to use the corresponding libraries, rather than coercing a C
+library into doing that job.
+
+It should be borne in mind at all time that C is a macro-assembler. If
+you are in doubt about something being too complicated ask yourself the
+question "Would I try to write this in macro-assembler?" If the answer
+is obviously "No" then do not try to include it in GSL. [BJG]
+
+It will be useful to read the following papers,
+
+@itemize @asis
+@item
+Kiem-Phong Vo, ``The Discipline and Method Architecture for Reusable
+Libraries'', Software - Practice & Experience, v.30, pp.107-128, 2000.
+@end itemize
+
+@noindent
+It is available from
+@uref{http://www.research.att.com/sw/tools/sfio/dm-spe.ps} or the earlier
+technical report Kiem-Phong Vo, "An Architecture for Reusable Libraries"
+@uref{http://citeseer.nj.nec.com/48973.html}.
+
+There are associated papers on Vmalloc, SFIO, and CDT which are also
+relevant to the design of portable C libraries.
+
+@itemize @asis
+@item
+Kiem-Phong Vo, ``Vmalloc: A General and Efficient Memory
+Allocator''. Software Practice & Experience, 26:1--18, 1996.
+
+@uref{http://www.research.att.com/sw/tools/vmalloc/vmalloc.ps}
+@item
+Kiem-Phong Vo. ``Cdt: A Container Data Type Library''. Soft. Prac. &
+Exp., 27:1177--1197, 1997
+
+@uref{http://www.research.att.com/sw/tools/cdt/cdt.ps}
+@item
+David G. Korn and Kiem-Phong Vo, ``Sfio: Safe/Fast String/File IO'',
+Proceedings of the Summer '91 Usenix Conference, pp. 235-256, 1991.
+
+@uref{http://citeseer.nj.nec.com/korn91sfio.html}
+@end itemize
+
+Source code should be indented according to the GNU Coding Standards,
+with spaces not tabs. For example, by using the @code{indent} command:
+
+@example
+indent -gnu -nut *.c *.h
+@end example
+
+@noindent
+The @code{-nut} option converts tabs into spaces.
+
+@node Background and Preparation, Choice of Algorithms, Standards and conventions, Design
+@section Background and Preparation
+
+Before implementing something be sure to research the subject
+thoroughly! This will save a lot of time in the long-run. The two most
+important steps are,
+
+@enumerate
+@item
+to determine whether there is already a free library (GPL or
+GPL-compatible) which does the job. If so, there is no need to
+reimplement it. Carry out a search on Netlib, GAMs, na-net,
+sci.math.num-analysis and the web in general. This should also provide
+you with a list of existing proprietary libraries which are relevant,
+keep a note of these for future reference in step 2.
+
+@item
+make a comparative survey of existing implementations in the
+commercial/free libraries. Examine the typical APIs, methods of
+communication between program and subroutine, and classify them so that
+you are familiar with the key concepts or features that an
+implementation may or may not have, depending on the relevant tradeoffs
+chosen. Be sure to review the documentation of existing libraries for
+useful references.
+
+@item
+read up on the subject and determine the state-of-the-art. Find the
+latest review papers. A search of the following journals should be
+undertaken.
+
+@itemize @asis
+@item ACM Transactions on Mathematical Software
+@item Numerische Mathematik
+@item Journal of Computation and Applied Mathematics
+@item Computer Physics Communications
+@item SIAM Journal of Numerical Analysis
+@item SIAM Journal of Scientific Computing
+@end itemize
+@end enumerate
+
+@noindent
+Keep in mind that GSL is not a research project. Making a good
+implementation is difficult enough, without also needing to invent new
+algorithms. We want to implement existing algorithms whenever
+possible. Making minor improvements is ok, but don't let it be a
+time-sink.
+
+@node Choice of Algorithms, Documentation, Background and Preparation, Design
+@section Choice of Algorithms
+
+Whenever possible choose algorithms which scale well and always remember
+to handle asymptotic cases. This is particularly relevant for functions
+with integer arguments. It is tempting to implement these using the
+simple @math{O(n)} algorithms used to define the functions, such as the
+many recurrence relations found in Abramowitz and Stegun. While such
+methods might be acceptable for @math{n=O(10-100)} they will not be
+satisfactory for a user who needs to compute the same function for
+@math{n=1000000}.
+
+Similarly, do not make the implicit assumption that multivariate data
+has been scaled to have components of the same size or O(1). Algorithms
+should take care of any necessary scaling or balancing internally, and
+use appropriate norms (e.g. |Dx| where D is a diagonal scaling matrix,
+rather than |x|).
+
+@node Documentation, Namespace, Choice of Algorithms, Design
+@section Documentation
+Documentation: the project leaders should give examples of how things
+are to be documented. High quality documentation is absolutely
+mandatory, so documentation should introduce the topic, and give careful
+reference for the provided functions. The priority is to provide
+reference documentation for each function. It is not necessary to
+provide tutorial documentation.
+
+Use free software, such as GNU Plotutils, to produce the graphs in the
+manual.
+
+Some of the graphs have been made with gnuplot which is not truly free
+(or GNU) software, and some have been made with proprietary
+programs. These should be replaced with output from GNU plotutils.
+
+When citing references be sure to use the standard, definitive and
+best reference books in the field, rather than lesser known text-books
+or introductory books which happen to be available (e.g. from
+undergraduate studies). For example, references concerning algorithms
+should be to Knuth, references concerning statistics should be to
+Kendall & Stuart, references concerning special functions should be to
+Abramowitz & Stegun (Handbook of Mathematical Functions AMS-55), etc.
+Whereever possible refer to Abramowitz & Stegun rather than other
+reference books because it is a public domain work, so it is
+inexpensive and freely redistributable.
+
+The standard references have a better chance of being available in an
+accessible library for the user. If they are not available and the user
+decides to buy a copy in order to look up the reference then this also
+gives them the best quality book which should also cover the largest
+number of other references in the GSL Manual. If many different books
+were to be referenced this would be an expensive and inefficient use of
+resources for a user who needs to look up the details of the algorithms.
+Reference books also stay in print much longer than text books, which
+are often out-of-print after a few years.
+
+Similarly, cite original papers wherever possible. Be sure to keep
+copies of these for your own reference (e.g. when dealing with bug
+reports) or to pass on to future maintainers.
+
+If you need help in tracking down references, ask on the
+@code{gsl-discuss} mailing list. There is a group of volunteers with
+access to good libraries who have offered to help GSL developers get
+copies of papers.
+
+@c [JT section: written by James Theiler
+
+@c And we furthermore promise to try as hard as possible to document
+@c the software: this will ideally involve discussion of why you might want
+@c to use it, what precisely it does, how precisely to invoke it,
+@c how more-or-less it works, and where we learned about the algorithm,
+@c and (unless we wrote it from scratch) where we got the code.
+@c We do not plan to write this entire package from scratch, but to cannibalize
+@c existing mathematical freeware, just as we expect our own software to
+@c be cannibalized.]
+
+To write mathematics in the texinfo file you can use the @code{@@math}
+command with @emph{simple} TeX commands. These are automatically
+surrounded by @code{$...$} for math mode. For example,
+
+@example
+to calculate the coefficient @@math@{\alpha@} use the function...
+@end example
+
+@noindent
+will be correctly formatted in both online and TeX versions of the
+documentation.
+
+Note that you cannot use the special characters @{ and @}
+inside the @code{@@math} command because these conflict between TeX
+and Texinfo. This is a problem if you want to write something like
+@code{\sqrt@{x+y@}}.
+
+To work around it you can preceed the math command with a special
+macro @code{@@c} which contains the explicit TeX commands you want to
+use (no restrictions), and put an ASCII approximation into the
+@code{@@math} command (you can write @code{@@@{} and
+@code{@@@}} there for the left and right braces). The explicit TeX
+commands are used in the TeX ouput and the argument of @code{@@math}
+in the plain info output.
+
+Note that the @code{@@c@{@}} macro must go at the end of the
+preceeding line, because everything else after it is ignored---as far
+as texinfo is concerned it's actually a 'comment'. The comment
+command @@c has been modified to capture a TeX expression which is
+output by the next @@math command. For ordinary comments use the @@comment
+command.
+
+For example,
+
+@example
+this is a test @@c@{$\sqrt@{x+y@}$@}
+@@math@{\sqrt@@@{x+y@@@}@}
+@end example
+
+@noindent
+is equivalent to @code{this is a test $\sqrt@{x+y@}$} in plain TeX
+and @code{this is a test @@math@{\sqrt@@@{x+y@@@}@}} in Info.
+
+It looks nicer if some of the more cryptic TeX commands are given
+a C-style ascii version, e.g.
+
+@example
+for @@c@{$x \ge y$@}
+@@math@{x >= y@}
+@end example
+
+@noindent
+will be appropriately displayed in both TeX and Info.
+
+
+@node Namespace, Header files, Documentation, Design
+@section Namespace
+
+Use @code{gsl_} as a prefix for all exported functions and variables.
+
+Use @code{GSL_} as a prefix for all exported macros.
+
+All exported header files should have a filename with the prefix @code{gsl_}.
+
+All installed libraries should have a name like libgslhistogram.a
+
+Any installed executables (utility programs etc) should have the prefix
+@code{gsl-} (with a hyphen, not an underscore).
+
+All function names, variables, etc should be in lower case. Macros and
+preprocessor variables should be in upper case.
+
+Some common conventions in variable and function names:
+
+@table @code
+@item p1
+plus 1, e.g. function @code{log1p(x)} or a variable like @code{kp1}, @math{=k+1}.
+
+@item m1
+minus 1, e.g. function @code{expm1(x)} or a variable like @code{km1}, @math{=k-1}.
+@end table
+
+@node Header files, Target system, Namespace, Design
+@section Header files
+
+Installed header files should be idempotent, i.e. surround them by the
+preprocessor conditionals like the following,
+
+@example
+#ifndef __GSL_HISTOGRAM_H__
+#define __GSL_HISTOGRAM_H__
+...
+#endif /* __GSL_HISTOGRAM_H__ */
+@end example
+
+@node Target system, Function Names, Header files, Design
+@section Target system
+
+The target system is ANSI C, with a full Standard C Library, and IEEE
+arithmetic.
+
+@node Function Names, Object-orientation, Target system, Design
+@section Function Names
+
+Each module has a name, which prefixes any function names in that
+module, e.g. the module gsl_fft has function names like
+gsl_fft_init. The modules correspond to subdirectories of the library
+source tree.
+
+@node Object-orientation, Comments, Function Names, Design
+@section Object-orientation
+
+The algorithms should be object oriented, but only to the extent that is
+easy in portable ANSI C. The use of casting or other tricks to simulate
+inheritance is not desirable, and the user should not have to be aware
+of anything like that. This means many types of patterns are ruled
+out. However, this is not considered a problem -- they are too
+complicated for the library.
+
+Note: it is possible to define an abstract base class easily in C, using
+function pointers. See the rng directory for an example.
+
+When reimplementing public domain fortran code, please try to introduce
+the appropriate object concepts as structs, rather than translating the
+code literally in terms of arrays. The structs can be useful just
+within the file, you don't need to export them to the user.
+
+For example, if a fortran program repeatedly uses a subroutine like,
+
+@example
+SUBROUTINE RESIZE (X, K, ND, K1)
+@end example
+
+@noindent
+where X(K,D) represents a grid to be resized to X(K1,D) you can make
+this more readable by introducing a struct,
+
+@smallexample
+struct grid @{
+ int nd; /* number of dimensions */
+ int k; /* number of bins */
+ double * x; /* partition of axes, array of size x[k][nd] */
+@}
+
+void
+resize_grid (struct grid * g, int k_new)
+@{
+...
+@}
+@end smallexample
+
+@noindent
+Similarly, if you have a frequently recurring code fragment within a
+single file you can define a static or static inline function for it.
+This is typesafe and saves writing out everything in full.
+
+
+@node Comments, Minimal structs, Object-orientation, Design
+@section Comments
+
+Follow the GNU Coding Standards. A relevant quote is,
+
+``Please write complete sentences and capitalize the first word. If a
+lower-case identifier comes at the beginning of a sentence, don't
+capitalize it! Changing the spelling makes it a different identifier.
+If you don't like starting a sentence with a lower case letter, write
+the sentence differently (e.g., "The identifier lower-case is ...").''
+
+@node Minimal structs, Algorithm decomposition, Comments, Design
+@section Minimal structs
+
+We prefer to make structs which are @dfn{minimal}. For example, if a
+certain type of problem can be solved by several classes of algorithm
+(e.g. with and without derivative information) it is better to make
+separate types of struct to handle those cases. i.e. run time type
+identification is not desirable.
+
+@node Algorithm decomposition, Memory allocation and ownership, Minimal structs, Design
+@section Algorithm decomposition
+
+Iterative algorithms should be decomposed into an INITIALIZE, ITERATE,
+TEST form, so that the user can control the progress of the iteration
+and print out intermediate results. This is better than using
+call-backs or using flags to control whether the function prints out
+intermediate results. In fact, call-backs should not be used -- if they
+seem necessary then it's a sign that the algorithm should be broken down
+further into individual components so that the user has complete control
+over them.
+
+For example, when solving a differential equation the user may need to
+be able to advance the solution by individual steps, while tracking a
+realtime process. This is only possible if the algorithm is broken down
+into step-level components. Higher level decompositions would not give
+sufficient flexibility.
+
+@node Memory allocation and ownership, Memory layout, Algorithm decomposition, Design
+@section Memory allocation and ownership
+
+Functions which allocate memory on the heap should end in _alloc
+(e.g. gsl_foo_alloc) and be deallocated by a corresponding _free function
+(gsl_foo_free).
+
+Be sure to free any memory allocated by your function if you have to
+return an error in a partially initialized object.
+
+Don't allocate memory 'temporarily' inside a function and then free it
+before the function returns. This prevents the user from controlling
+memory allocation. All memory should be allocated and freed through
+separate functions and passed around as a "workspace" argument. This
+allows memory allocation to be factored out of tight loops.
+
+@node Memory layout, Linear Algebra Levels, Memory allocation and ownership, Design
+@section Memory layout
+
+We use flat blocks of memory to store matrices and vectors, not C-style
+pointer-to-pointer arrays. The matrices are stored in row-major order
+-- i.e. the column index (second index) moves continuously through memory.
+
+@node Linear Algebra Levels, Error estimates, Memory layout, Design
+@section Linear Algebra Levels
+
+Functions using linear algebra are divided into two levels:
+
+For purely "1d" functions we use the C-style arguments (double *,
+stride, size) so that it is simpler to use the functions in a normal C
+program, without needing to invoke all the gsl_vector machinery.
+
+The philosophy here is to minimize the learning curve. If someone only
+needs to use one function, like an fft, they can do so without having
+to learn about gsl_vector.
+
+This leads to the question of why we don't do the same for matrices.
+In that case the argument list gets too long and confusing, with
+(size1, size2, tda) for each matrix and potential ambiguities over row
+vs column ordering. In this case, it makes sense to use gsl_vector and
+gsl_matrix, which take care of this for the user.
+
+So really the library has two levels -- a lower level based on C types
+for 1d operations, and a higher level based on gsl_matrix and
+gsl_vector for general linear algebra.
+
+Of course, it would be possible to define a vector version of the
+lower level functions too. So far we have not done that because it was
+not essential -- it could be done but it is easy enough to get by
+using the C arguments, by typing v->data, v->stride, v->size instead.
+A gsl_vector version of low-level functions would mainly be a
+convenience.
+
+Please use BLAS routines internally within the library whenever possible
+for efficiency.
+
+@node Error estimates, Exceptions and Error handling, Linear Algebra Levels, Design
+@section Error estimates
+
+In the special functions error bounds are given as twice the expected
+``gaussian'' error. i.e. 2-sigma, so the result is inside the error
+98% of the time. People expect the true value to be within +/- the
+quoted error (this wouldn't be the case 32% of the time for 1 sigma).
+Obviously the errors are not gaussian but a factor of two works well
+in practice.
+
+@node Exceptions and Error handling, Persistence, Error estimates, Design
+@section Exceptions and Error handling
+
+The basic error handling procedure is the return code (see gsl_errno.h
+for a list of allowed values). Use the GSL_ERROR macro to mark an
+error. The current definition of this macro is not ideal but it can be
+changed at compile time.
+
+You should always use the GSL_ERROR macro to indicate an error, rather
+than just returning an error code. The macro allows the user to trap
+errors using the debugger (by setting a breakpoint on the function
+gsl_error).
+
+The only circumstances where GSL_ERROR should not be used are where the
+return value is "indicative" rather than an error -- for example, the
+iterative routines use the return code to indicate the success or
+failure of an iteration. By the nature of an iterative algorithm
+"failure" (a return code of GSL_CONTINUE) is a normal occurrence and
+there is no need to use GSL_ERROR there.
+
+Be sure to free any memory allocated by your function if you return an
+error (in particular for errors in partially initialized objects).
+
+@node Persistence, Using Return Values, Exceptions and Error handling, Design
+@section Persistence
+
+If you make an object foo which uses blocks of memory (e.g. vector,
+matrix, histogram) you can provide functions for reading and writing
+those blocks,
+
+@smallexample
+int gsl_foo_fread (FILE * stream, gsl_foo * v);
+int gsl_foo_fwrite (FILE * stream, const gsl_foo * v);
+int gsl_foo_fscanf (FILE * stream, gsl_foo * v);
+int gsl_foo_fprintf (FILE * stream, const gsl_foo * v, const char *format);
+@end smallexample
+
+@noindent
+Only dump out the blocks of memory, not any associated parameters such
+as lengths. The idea is for the user to build higher level input/output
+facilities using the functions the library provides. The fprintf/fscanf
+versions should be portable between architectures, while the binary
+versions should be the "raw" version of the data. Use the functions
+
+@smallexample
+int gsl_block_fread (FILE * stream, gsl_block * b);
+int gsl_block_fwrite (FILE * stream, const gsl_block * b);
+int gsl_block_fscanf (FILE * stream, gsl_block * b);
+int gsl_block_fprintf (FILE * stream, const gsl_block * b, const char *format);
+@end smallexample
+
+@noindent
+or
+
+@smallexample
+int gsl_block_raw_fread (FILE * stream, double * b, size_t n, size_t stride);
+int gsl_block_raw_fwrite (FILE * stream, const double * b, size_t n, size_t stri
+de);
+int gsl_block_raw_fscanf (FILE * stream, double * b, size_t n, size_t stride);
+int gsl_block_raw_fprintf (FILE * stream, const double * b, size_t n, size_t str
+ide, const char *format);
+@end smallexample
+
+@noindent
+to do the actual reading and writing.
+
+@node Using Return Values, Variable Names, Persistence, Design
+@section Using Return Values
+
+Always assign a return value to a variable before using it. This allows
+easier debugging of the function, and inspection and modification of the
+return value. If the variable is only needed temporarily then enclose
+it in a suitable scope.
+
+For example, instead of writing,
+
+@example
+a = f(g(h(x,y)))
+@end example
+
+@noindent
+use temporary variables to store the intermediate values,
+@example
+@{
+ double u = h(x,y);
+ double v = g(u);
+ a = f(v);
+@}
+@end example
+
+@noindent
+These can then be inspected more easily in the debugger, and breakpoints
+can be placed more precisely. The compiler will eliminate the temporary
+variables automatically when the program is compiled with optimization.
+
+@node Variable Names, Datatype widths, Using Return Values, Design
+@section Variable Names
+
+Try to follow existing conventions for variable names,
+
+@table @code
+@item dim
+number of dimensions
+@item w
+pointer to workspace
+@item state
+pointer to state variable (use @code{s} if you need to save characters)
+@item result
+pointer to result (output variable)
+@item abserr
+absolute error
+@item relerr
+relative error
+@item epsabs
+absolute tolerance
+@item epsrel
+relative tolerance
+@item size
+the size of an array or vector e.g. double array[size]
+@item stride
+the stride of a vector
+@item size1
+the number of rows in a matrix
+@item size2
+the number of columns in a matrix
+@item n
+general integer number, e.g. number of elements of array, in fft, etc
+@item r
+random number generator (gsl_rng)
+@end table
+
+@node Datatype widths, size_t, Variable Names, Design
+@section Datatype widths
+
+Be aware that in ANSI C the type @code{int} is only guaranteed to
+provide 16-bits. It may provide more, but is not guaranteed to.
+Therefore if you require 32 bits you must use @code{long int}, which
+will have 32 bits or more. Of course, on many platforms the type
+@code{int} does have 32 bits instead of 16 bits but we have to code to
+the ANSI standard rather than a specific platform.
+
+@node size_t, Arrays vs Pointers, Datatype widths, Design
+@section size_t
+
+All objects (blocks of memory, etc) should be measured in terms of a
+@code{size_t} type. Therefore any iterations (e.g. @code{for(i=0; i<N;
+i++)}) should also use an index of type @code{size_t}.
+
+Don't mix @code{int} and @code{size_t}. They are @emph{not}
+interchangeable.
+
+If you need to write a descending loop you have to be careful because
+@code{size_t} is unsigned, so instead of
+
+@example
+for (i = N - 1; i >= 0; i--) @{ ... @} /* DOESN'T WORK */
+@end example
+
+@noindent
+use something like
+
+@example
+for (i = N; i > 0 && i--;) @{ ... @}
+@end example
+
+@noindent
+to avoid problems with wrap-around at @code{i=0}.
+
+If you really want to avoid confusion use a separate variable to invert
+the loop order,
+@example
+for (i = 0; i < N; i++) @{ j = N - i; ... @}
+@end example
+
+@node Arrays vs Pointers, Pointers, size_t, Design
+@section Arrays vs Pointers
+
+A function can be declared with either pointer arguments or array
+arguments. The C standard considers these to be equivalent. However, it
+is useful to distinguish between the case of a pointer, representing a
+single object which is being modified, and an array which represents a
+set of objects with unit stride (that are modified or not depending on
+the presence of @code{const}). For vectors, where the stride is not
+required to be unity, the pointer form is preferred.
+
+@smallexample
+/* real value, set on output */
+int foo (double * x);
+
+/* real vector, modified */
+int foo (double * x, size_t stride, size_t n);
+
+/* constant real vector */
+int foo (const double * x, size_t stride, size_t n);
+
+/* real array, modified */
+int bar (double x[], size_t n);
+
+/* real array, not modified */
+int baz (const double x[], size_t n);
+@end smallexample
+
+@node Pointers, Constness, Arrays vs Pointers, Design
+@section Pointers
+
+Avoid dereferencing pointers on the right-hand side of an expression where
+possible. It's better to introduce a temporary variable. This is
+easier for the compiler to optimise and also more readable since it
+avoids confusion between the use of @code{*} for multiplication and
+dereferencing.
+
+@example
+while (fabs (f) < 0.5)
+@{
+ *e = *e - 1;
+ f *= 2;
+@}
+@end example
+
+@noindent
+is better written as,
+
+@example
+@{
+ int p = *e;
+
+ while (fabs(f) < 0.5)
+ @{
+ p--;
+ f *= 2;
+ @}
+
+ *e = p;
+@}
+@end example
+
+@node Constness, Pseudo-templates, Pointers, Design
+@section Constness
+
+Use @code{const} in function prototypes wherever an object pointed to by
+a pointer is constant (obviously). For variables which are meaningfully
+constant within a function/scope use @code{const} also. This prevents
+you from accidentally modifying a variable which should be constant
+(e.g. length of an array, etc). It can also help the compiler do
+optimization. These comments also apply to arguments passed by value
+which should be made @code{const} when that is meaningful.
+
+@node Pseudo-templates, Arbitrary Constants, Constness, Design
+@section Pseudo-templates
+
+There are some pseudo-template macros available in @file{templates_on.h}
+and @file{templates_off.h}. See a directory link @file{block} for
+details on how to use them. Use sparingly, they are a bit of a
+nightmare, but unavoidable in places.
+
+In particular, the convention is: templates are used for operations on
+"data" only (vectors, matrices, statistics, sorting). This is intended
+to cover the case where the program must interface with an external
+data-source which produces a fixed type. e.g. a big array of char's
+produced by an 8-bit counter.
+
+All other functions can use double, for floating point, or the
+appropriate integer type for integers (e.g. unsigned long int for random
+numbers). It is not the intention to provide a fully templated version
+of the library.
+
+That would be "putting a quart into a pint pot". To summarize, almost
+everything should be in a "natural type" which is appropriate for
+typical usage, and templates are there to handle a few cases where it is
+unavoidable that other data-types will be encountered.
+
+For floating point work "double" is considered a "natural type". This
+sort of idea is a part of the C language.
+
+@node Arbitrary Constants, Test suites, Pseudo-templates, Design
+@section Arbitrary Constants
+
+Avoid arbitrary constants.
+
+For example, don't hard code "small" values like '1e-30', '1e-100' or
+@code{10*GSL_DBL_EPSILON} into the routines. This is not appropriate
+for a general purpose library.
+
+Compute values accurately using IEEE arithmetic. If errors are
+potentially significant then error terms should be estimated reliably
+and returned to the user, by analytically deriving an error propagation
+formula, not using guesswork.
+
+A careful consideration of the algorithm usually shows that arbitrary
+constants are unnecessary, and represent an important parameter which
+should be accessible to the user.
+
+For example, consider the following code:
+
+@example
+if (residual < 1e-30) @{
+ return 0.0; /* residual is zero within round-off error */
+@}
+@end example
+
+@noindent
+This should be rewritten as,
+
+@example
+ return residual;
+@end example
+
+@noindent
+in order to allow the user to determine whether the residual is
+significant or not.
+
+The only place where it is acceptable to use constants like
+@code{GSL_DBL_EPSILON} is in function approximations, (e.g. taylor
+series, asymptotic expansions, etc). In these cases it is not an
+arbitrary constant, but an inherent part of the algorithm.
+
+@node Test suites, Compilation, Arbitrary Constants, Design
+@section Test suites
+
+The implementor of each module should provide a reasonable test suite
+for the routines.
+
+The test suite should be a program that uses the library and checks the
+result against known results, or invokes the library several times and
+does a statistical analysis on the results (for example in the case of
+random number generators).
+
+Ideally the one test program per directory should aim for 100% path
+coverage of the code. Obviously it would be a lot of work to really
+achieve this, so prioritize testing on the critical parts and use
+inspection for the rest. Test all the error conditions by explicitly
+provoking them, because we consider it a serious defect if the function
+does not return an error for an invalid parameter. N.B. Don't bother to
+test for null pointers -- it's sufficient for the library to segfault if
+the user provides an invalid pointer.
+
+The tests should be deterministic. Use the @code{gsl_test} functions
+provided to perform separate tests for each feature with a separate
+output PASS/FAIL line, so that any failure can be uniquely identified.
+
+Use realistic test cases with 'high entropy'. Tests on simple values
+such as 1 or 0 may not reveal bugs. For example, a test using a value
+of @math{x=1} will not pick up a missing factor of @math{x} in the code.
+Similarly, a test using a value of @math{x=0} will not pick any missing
+terms involving @math{x} in the code. Use values like @math{2.385} to
+avoid silent failures.
+
+If your test uses multiple values make sure there are no simple
+relations between them that could allow bugs to be missed through silent
+cancellations.
+
+If you need some random floats to put in the test programs use @code{od -f
+/dev/random} as a source of inspiration.
+
+Don't use @code{sprintf} to create output strings in the tests. It can
+cause hard to find bugs in the test programs themselves. The functions
+@code{gsl_test_...} support format string arguments so use these
+instead.
+
+@node Compilation, Thread-safety, Test suites, Design
+@section Compilation
+
+Make sure everything compiles cleanly. Use the strict compilation
+options for extra checking.
+
+@smallexample
+make CFLAGS="-ansi -pedantic -Werror -W -Wall -Wtraditional -Wconversion
+ -Wshadow -Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings
+ -Wstrict-prototypes -fshort-enums -fno-common -Wmissing-prototypes
+ -Wnested-externs -Dinline= -g -O4"
+@end smallexample
+
+@noindent
+Also use @code{checkergcc} to check for memory problems on the stack and
+the heap. It's the best memory checking tool. If checkergcc isn't
+available then Electric Fence will check the heap, which is better than
+no checking.
+
+There is a new tool @code{valgrind} for checking memory access. Test
+the code with this as well.
+
+Make sure that the library will also compile with C++ compilers
+(g++). This should not be too much of a problem if you have been writing
+in ANSI C.
+
+@node Thread-safety, Legal issues, Compilation, Design
+@section Thread-safety
+
+The library should be usable in thread-safe programs. All the functions
+should be thread-safe, in the sense that they shouldn't use static
+variables.
+
+We don't require everything to be completely thread safe, but anything
+that isn't should be obvious. For example, some global variables are
+used to control the overall behavior of the library (range-checking
+on/off, function to call on fatal error, etc). Since these are accessed
+directly by the user it is obvious to the multi-threaded programmer that
+they shouldn't be modified by different threads.
+
+There is no need to provide any explicit support for threads
+(e.g. locking mechanisms etc), just to avoid anything which would make
+it impossible for someone to call a GSL routine from a multithreaded
+program.
+
+
+@node Legal issues, Non-UNIX portability, Thread-safety, Design
+@section Legal issues
+
+@itemize @bullet
+@item
+Each contributor must make sure her code is under the GNU General Public
+License (GPL). This means getting a disclaimer from your employer.
+@item
+We must clearly understand ownership of existing code and algorithms.
+@item
+Each contributor can retain ownership of their code, or sign it over to
+FSF as they prefer.
+
+There is a standard disclaimer in the GPL (take a look at it). The more
+specific you make your disclaimer the more likely it is that it will be
+accepted by an employer. For example,
+
+@smallexample
+Yoyodyne, Inc., hereby disclaims all copyright interest in the software
+`GNU Scientific Library - Legendre Functions' (routines for computing
+legendre functions numerically in C) written by James Hacker.
+
+<signature of Ty Coon>, 1 April 1989
+Ty Coon, President of Vice
+@end smallexample
+
+@item
+Obviously: don't use or translate non-free code.
+
+In particular don't copy or translate code from @cite{Numerical Recipes}
+or @cite{ACM TOMS}.
+
+Numerical Recipes is under a strict license and is not free software.
+The publishers Cambridge University Press claim copyright on all aspects
+of the book and the code, including function names, variable names and
+ordering of mathematical subexpressions. Routines in GSL should not
+refer to Numerical Recipes or be based on it in any way.
+
+The ACM algorithms published in TOMS (Transactions on Mathematical
+Software) are not public domain, even though they are distributed on the
+internet -- the ACM uses a special non-commercial license which is not
+compatible with the GPL. The details of this license can be found on the
+cover page of ACM Transactions on Mathematical Software or on the ACM
+Website.
+
+Only use code which is explicitly under a free license: GPL or Public
+Domain. If there is no license on the code then this does not mean it
+is public domain -- an explicit statement is required. If in doubt check
+with the author.
+
+@item
+I @strong{think} one can reference algorithms from classic books on
+numerical analysis (BJG: yes, provided the code is an independent
+implementation and not copied from any existing software. For
+example, it would be ok to read the papers in ACM TOMS and make an
+independent implementation from their description).
+@end itemize
+
+@node Non-UNIX portability, Compatibility with other libraries, Legal issues, Design
+@section Non-UNIX portability
+
+There is good reason to make this library work on non-UNIX systems. It
+is probably safe to ignore DOS and only worry about windows95/windowsNT
+portability (so filenames can be long, I think).
+
+On the other hand, nobody should be forced to use non-UNIX systems for
+development.
+
+The best solution is probably to issue guidelines for portability, like
+saying "don't use XYZ unless you absolutely have to". Then the Windows
+people will be able to do their porting.
+
+@node Compatibility with other libraries, Parallelism, Non-UNIX portability, Design
+@section Compatibility with other libraries
+
+We do not regard compatibility with other numerical libraries as a
+priority.
+
+However, other libraries, such as Numerical Recipes, are widely used.
+If somebody writes the code to allow drop-in replacement of these
+libraries it would be useful to people. If it is done, it would be as a
+separate wrapper that can be maintained and shipped separately.
+
+There is a separate issue of system libraries, such as BSD math library
+and functions like @code{expm1}, @code{log1p}, @code{hypot}. The
+functions in this library are available on nearly every platform (but
+not all).
+
+In this case, it is best to write code in terms of these native
+functions to take advantage of the vendor-supplied system library (for
+example log1p is a machine instruction on the Intel x86). The library
+also provides portable implementations e.g. @code{gsl_hypot} which are
+used as an automatic fall back via autoconf when necessary. See the
+usage of @code{hypot} in @file{gsl/complex/math.c}, the implementation
+of @code{gsl_hypot} and the corresponding parts of files
+@file{configure.in} and @file{config.h.in} as an example.
+
+@node Parallelism, Precision, Compatibility with other libraries, Design
+@section Parallelism
+
+We don't intend to provide support for parallelism within the library
+itself. A parallel library would require a completely different design
+and would carry overhead that other applications do not need.
+
+@node Precision, Miscellaneous, Parallelism, Design
+@section Precision
+
+For algorithms which use cutoffs or other precision-related terms please
+express these in terms of @code{GSL_DBL_EPSILON} and @code{GSL_DBL_MIN}, or powers or
+combinations of these. This makes it easier to port the routines to
+different precisions.
+
+@node Miscellaneous, , Precision, Design
+@section Miscellaneous
+
+Don't use the letter @code{l} as a variable name --- it is difficult to
+distinguish from the number @code{1}. (This seems to be a favorite in
+old Fortran programs).
+
+Final tip: one perfect routine is better than any number of routines
+containing errors.
+
+@node Bibliography, Copying, Design, Top
+@chapter Bibliography
+
+@section General numerics
+
+@itemize
+
+@item
+@cite{Numerical Computation} (2 Volumes) by C.W. Ueberhuber,
+Springer 1997, ISBN 3540620583 (Vol 1) and ISBN 3540620575 (Vol 2).
+
+@item
+@cite{Accuracy and Stability of Numerical Algorithms} by N.J. Higham,
+SIAM, ISBN 0898715210.
+
+@item
+@cite{Sources and Development of Mathematical Software} edited by W.R. Cowell,
+Prentice Hall, ISBN 0138235015.
+
+@item
+@cite{A Survey of Numerical Mathematics (2 vols)} by D.M. Young and R.T. Gregory,
+ ISBN 0486656918, ISBN 0486656926.
+
+@item
+@cite{Methods and Programs for Mathematical Functions} by Stephen L. Moshier,
+Hard to find (ISBN 13578980X or 0135789982, possibly others).
+
+@item
+@cite{Numerical Methods That Work} by Forman S. Acton,
+ ISBN 0883854503.
+
+@item
+@cite{Real Computing Made Real: Preventing Errors in Scientific and Engineering Calculations} by Forman S. Acton,
+ ISBN 0486442217.
+@end itemize
+
+@section Reference
+
+@itemize
+@item
+@cite{Handbook of Mathematical Functions} edited by Abramowitz & Stegun,
+Dover, ISBN 0486612724.
+
+@item
+@cite{The Art of Computer Programming} (3rd Edition, 3 Volumes) by D. Knuth,
+Addison Wesley, ISBN 0201485419.
+@end itemize
+
+@section Subject specific
+
+@itemize
+@item
+@cite{Matrix Computations} (3rd Ed) by G.H. Golub, C.F. Van Loan,
+Johns Hopkins University Press 1996, ISBN 0801854148.
+
+@item
+@cite{LAPACK Users' Guide} (3rd Edition),
+SIAM 1999, ISBN 0898714478.
+
+@item
+@cite{Treatise on the Theory of Bessel Functions 2ND Edition} by G N Watson,
+ ISBN 0521483913.
+
+@item
+@cite{Higher Transcendental Functions satisfying nonhomogenous linear differential equations} by A W Babister,
+ ISBN 1114401773.
+
+@end itemize
+
+@node Copying, GNU Free Documentation License, Bibliography, Top
+@unnumbered Copying
+
+ The subroutines and source code in the @value{GSL} package are "free";
+this means that everyone is free to use them and free to redistribute
+them on a free basis. The @value{GSL}-related programs are not in the
+public domain; they are copyrighted and there are restrictions on their
+distribution, but these restrictions are designed to permit everything
+that a good cooperating citizen would want to do. What is not allowed
+is to try to prevent others from further sharing any version of these
+programs that they might get from you.
+
+ Specifically, we want to make sure that you have the right to give
+away copies of the programs that relate to @value{GSL}, that you receive
+source code or else can get it if you want it, that you can change these
+programs or use pieces of them in new free programs, and that you know
+you can do these things.
+
+ To make sure that everyone has such rights, we have to forbid you to
+deprive anyone else of these rights. For example, if you distribute
+copies of the @value{GSL}-related code, you must give the recipients all
+the rights that you have. You must make sure that they, too, receive or
+can get the source code. And you must tell them their rights.
+
+ Also, for our own protection, we must make certain that everyone
+finds out that there is no warranty for the programs that relate to
+@value{GSL}. If these programs are modified by someone else and passed
+on, we want their recipients to know that what they have is not what we
+distributed, so that any problems introduced by others will not reflect
+on our reputation.
+
+ The precise conditions of the licenses for the programs currently
+being distributed that relate to @value{GSL} are found in the General
+Public Licenses that accompany them.
+
+@node GNU Free Documentation License, , Copying, Top
+@unnumbered GNU Free Documentation License
+@include fdl.texi
+
+@c @printindex cp
+
+@c @node Function Index
+@c @unnumbered Function Index
+
+@c @printindex fn
+
+@c @node Variable Index
+@c @unnumbered Variable Index
+
+@c @printindex vr
+
+@c @node Type Index
+@c @unnumbered Type Index
+
+@c @printindex tp
+
+@bye
diff --git a/gsl-1.9/doc/gsl-histogram.1 b/gsl-1.9/doc/gsl-histogram.1
new file mode 100644
index 0000000..66f9b5a
--- /dev/null
+++ b/gsl-1.9/doc/gsl-histogram.1
@@ -0,0 +1,42 @@
+.\" Man page contributed by Dirk Eddelbuettel <edd@debian.org>
+.\" and released under the GNU General Public License
+.TH GSL-HISTOGRAM 1 "" GNU
+.SH NAME
+gsl-histogram - compute histogram of data on stdin
+.SH SYNOPSYS
+.B gsl-histogram xmin xmax [n]
+.SH DESCRIPTION
+.B gsl-histogram
+is a demonstration program for the GNU Scientific Library.
+It takes three arguments, specifying the upper and lower bounds of the
+histogram and the number of bins. It then reads numbers from `stdin',
+one line at a time, and adds them to the histogram. When there is no
+more data to read it prints out the accumulated histogram using
+gsl_histogram_fprintf. If n is unspecified then bins of integer width
+are used.
+.SH EXAMPLE
+Here is an example. We generate 10000 random samples from a Cauchy
+distribution with a width of 30 and histogram them over the range -100 to
+100, using 200 bins.
+
+ gsl-randist 0 10000 cauchy 30 | gsl-histogram -100 100 200 > histogram.dat
+
+A plot of the resulting histogram will show the familiar shape of the
+Cauchy distribution with fluctuations caused by the finite sample
+size.
+
+ awk '{print $1, $3 ; print $2, $3}' histogram.dat | graph -T X
+
+.SH SEE ALSO
+.BR gsl(3) ,
+.BR gsl-randist(1) .
+
+.SH AUTHOR
+.B gsl-histogram
+was written by Brian Gough.
+Copyright 1996-2000; for copying conditions see the GNU General
+Public Licence.
+
+This manual page was added by the Dirk Eddelbuettel
+<edd@debian.org>, the Debian GNU/Linux maintainer for
+.BR GSL .
diff --git a/gsl-1.9/doc/gsl-randist.1 b/gsl-1.9/doc/gsl-randist.1
new file mode 100644
index 0000000..4a06169
--- /dev/null
+++ b/gsl-1.9/doc/gsl-randist.1
@@ -0,0 +1,38 @@
+.\" Man page contributed by Dirk Eddelbuettel <edd@debian.org>
+.\" and released under the GNU General Public License
+.TH GSL-RANDIST 1 "" GNU
+.SH NAME
+gsl-randist - generate random samples from various distributions
+.SH SYNOPSYS
+.B gsl-randist seed n DIST param1 param2 [..]
+.SH DESCRIPTION
+.B gsl-randist
+is a demonstration program for the GNU Scientific Library.
+It generates n random samples from the distribution DIST using the distribution
+parameters param1, param2, ...
+.SH EXAMPLE
+Here is an example. We generate 10000 random samples from a Cauchy
+distribution with a width of 30 and histogram them over the range -100 to
+100, using 200 bins.
+
+ gsl-randist 0 10000 cauchy 30 | gsl-histogram -100 100 200 > histogram.dat
+
+A plot of the resulting histogram will show the familiar shape of the
+Cauchy distribution with fluctuations caused by the finite sample
+size.
+
+ awk '{print $1, $3 ; print $2, $3}' histogram.dat | graph -T X
+
+.SH SEE ALSO
+.BR gsl(3) ,
+.BR gsl-histogram(1) .
+
+.SH AUTHOR
+.B gsl-randist
+was written by James Theiler and Brian Gough.
+Copyright 1996-2000; for copying conditions see the GNU General
+Public Licence.
+
+This manual page was added by the Dirk Eddelbuettel
+<edd@debian.org>, the Debian GNU/Linux maintainer for
+.BR GSL .
diff --git a/gsl-1.9/doc/gsl-ref.info b/gsl-1.9/doc/gsl-ref.info
new file mode 100644
index 0000000..0423ca6
--- /dev/null
+++ b/gsl-1.9/doc/gsl-ref.info
@@ -0,0 +1,596 @@
+This is gsl-ref.info, produced by makeinfo version 4.8 from
+gsl-ref.texi.
+
+INFO-DIR-SECTION Scientific software
+START-INFO-DIR-ENTRY
+* gsl-ref: (gsl-ref). GNU Scientific Library - Reference
+END-INFO-DIR-ENTRY
+
+ Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+2005, 2006, 2007 The GSL Team.
+
+ Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2 or
+any later version published by the Free Software Foundation; with the
+Invariant Sections being "GNU General Public License" and "Free Software
+Needs Free Documentation", the Front-Cover text being "A GNU Manual",
+and with the Back-Cover Text being (a) (see below). A copy of the
+license is included in the section entitled "GNU Free Documentation
+License".
+
+ (a) The Back-Cover Text is: "You have freedom to copy and modify this
+GNU Manual, like GNU software."
+
+
+Indirect:
+gsl-ref.info-1: 939
+gsl-ref.info-2: 298842
+gsl-ref.info-3: 596860
+gsl-ref.info-4: 895867
+gsl-ref.info-5: 1072596
+gsl-ref.info-6: 1311271
+
+Tag Table:
+(Indirect)
+Node: Top939
+Node: Introduction3646
+Node: Routines available in GSL4298
+Node: GSL is Free Software6213
+Node: Obtaining GSL8605
+Node: No Warranty9746
+Node: Reporting Bugs10252
+Node: Further Information11136
+Node: Conventions used in this manual12149
+Node: Using the library12913
+Node: An Example Program13499
+Node: Compiling and Linking14203
+Node: Linking programs with the library15273
+Node: Linking with an alternative BLAS library16418
+Node: Shared Libraries17348
+Node: ANSI C Compliance18764
+Node: Inline functions19857
+Node: Long double20900
+Node: Portability functions22298
+Node: Alternative optimized functions23695
+Node: Support for different numeric types25153
+Node: Compatibility with C++28216
+Node: Aliasing of arrays28788
+Node: Thread-safety29539
+Node: Deprecated Functions30626
+Node: Code Reuse31251
+Node: Error Handling31895
+Node: Error Reporting32645
+Node: Error Codes34537
+Node: Error Handlers36393
+Node: Using GSL error reporting in your own functions40028
+Node: Error Reporting Examples41986
+Node: Mathematical Functions43190
+Node: Mathematical Constants43951
+Node: Infinities and Not-a-number45081
+Node: Elementary Functions46149
+Node: Small integer powers48404
+Node: Testing the Sign of Numbers49966
+Node: Testing for Odd and Even Numbers50397
+Node: Maximum and Minimum functions50953
+Node: Approximate Comparison of Floating Point Numbers53035
+Node: Complex Numbers54241
+Ref: Complex Numbers-Footnote-155549
+Node: Complex numbers55613
+Node: Properties of complex numbers57416
+Node: Complex arithmetic operators58403
+Node: Elementary Complex Functions61149
+Node: Complex Trigonometric Functions62969
+Node: Inverse Complex Trigonometric Functions64190
+Node: Complex Hyperbolic Functions66796
+Node: Inverse Complex Hyperbolic Functions68092
+Node: Complex Number References and Further Reading70080
+Node: Polynomials71476
+Node: Polynomial Evaluation72243
+Node: Divided Difference Representation of Polynomials72703
+Node: Quadratic Equations74372
+Node: Cubic Equations76312
+Node: General Polynomial Equations77683
+Node: Roots of Polynomials Examples80028
+Node: Roots of Polynomials References and Further Reading81417
+Node: Special Functions82362
+Node: Special Function Usage84356
+Node: The gsl_sf_result struct85539
+Node: Special Function Modes86803
+Node: Airy Functions and Derivatives87739
+Node: Airy Functions88435
+Node: Derivatives of Airy Functions89795
+Node: Zeros of Airy Functions91307
+Node: Zeros of Derivatives of Airy Functions92026
+Node: Bessel Functions92785
+Node: Regular Cylindrical Bessel Functions93977
+Node: Irregular Cylindrical Bessel Functions95301
+Node: Regular Modified Cylindrical Bessel Functions96757
+Node: Irregular Modified Cylindrical Bessel Functions99584
+Node: Regular Spherical Bessel Functions102552
+Node: Irregular Spherical Bessel Functions104764
+Node: Regular Modified Spherical Bessel Functions106451
+Node: Irregular Modified Spherical Bessel Functions108454
+Node: Regular Bessel Function - Fractional Order110517
+Node: Irregular Bessel Functions - Fractional Order111515
+Node: Regular Modified Bessel Functions - Fractional Order112097
+Node: Irregular Modified Bessel Functions - Fractional Order113022
+Node: Zeros of Regular Bessel Functions114258
+Node: Clausen Functions115361
+Node: Coulomb Functions115965
+Node: Normalized Hydrogenic Bound States116414
+Node: Coulomb Wave Functions117527
+Node: Coulomb Wave Function Normalization Constant120937
+Node: Coupling Coefficients121690
+Node: 3-j Symbols122413
+Node: 6-j Symbols123017
+Node: 9-j Symbols123641
+Node: Dawson Function124347
+Node: Debye Functions124914
+Node: Dilogarithm126688
+Node: Real Argument126983
+Node: Complex Argument127552
+Node: Elementary Operations128021
+Node: Elliptic Integrals128845
+Node: Definition of Legendre Forms129417
+Node: Definition of Carlson Forms130237
+Node: Legendre Form of Complete Elliptic Integrals130934
+Node: Legendre Form of Incomplete Elliptic Integrals132502
+Node: Carlson Forms134690
+Node: Elliptic Functions (Jacobi)136237
+Node: Error Functions136818
+Node: Error Function137269
+Node: Complementary Error Function137642
+Node: Log Complementary Error Function138102
+Node: Probability functions138554
+Node: Exponential Functions139807
+Node: Exponential Function140190
+Node: Relative Exponential Functions141413
+Node: Exponentiation With Error Estimate143084
+Node: Exponential Integrals144293
+Node: Exponential Integral144775
+Node: Ei(x)145425
+Node: Hyperbolic Integrals145873
+Node: Ei_3(x)146529
+Node: Trigonometric Integrals146921
+Node: Arctangent Integral147520
+Node: Fermi-Dirac Function147920
+Node: Complete Fermi-Dirac Integrals148290
+Node: Incomplete Fermi-Dirac Integrals150751
+Node: Gamma and Beta Functions151394
+Node: Gamma Functions151830
+Node: Factorials154951
+Node: Pochhammer Symbol157504
+Node: Incomplete Gamma Functions159016
+Node: Beta Functions160265
+Node: Incomplete Beta Function161017
+Node: Gegenbauer Functions161548
+Node: Hypergeometric Functions163198
+Node: Laguerre Functions167465
+Node: Lambert W Functions169028
+Node: Legendre Functions and Spherical Harmonics170066
+Node: Legendre Polynomials170655
+Node: Associated Legendre Polynomials and Spherical Harmonics172735
+Node: Conical Functions175536
+Node: Radial Functions for Hyperbolic Space177659
+Node: Logarithm and Related Functions179836
+Node: Mathieu Functions181460
+Node: Mathieu Function Workspace182809
+Node: Mathieu Function Characteristic Values183622
+Node: Angular Mathieu Functions184690
+Node: Radial Mathieu Functions185722
+Node: Power Function186960
+Node: Psi (Digamma) Function187887
+Node: Digamma Function188407
+Node: Trigamma Function189237
+Node: Polygamma Function189814
+Node: Synchrotron Functions190198
+Node: Transport Functions190961
+Node: Trigonometric Functions192108
+Node: Circular Trigonometric Functions192731
+Node: Trigonometric Functions for Complex Arguments193740
+Node: Hyperbolic Trigonometric Functions194774
+Node: Conversion Functions195377
+Node: Restriction Functions196160
+Node: Trigonometric Functions With Error Estimates197092
+Node: Zeta Functions198002
+Node: Riemann Zeta Function198460
+Node: Riemann Zeta Function Minus One199139
+Node: Hurwitz Zeta Function199910
+Node: Eta Function200415
+Node: Special Functions Examples200974
+Node: Special Functions References and Further Reading202668
+Node: Vectors and Matrices203775
+Node: Data types204534
+Node: Blocks205737
+Node: Block allocation206653
+Node: Reading and writing blocks208137
+Node: Example programs for blocks210201
+Node: Vectors210828
+Node: Vector allocation212714
+Node: Accessing vector elements214332
+Node: Initializing vector elements216574
+Node: Reading and writing vectors217268
+Node: Vector views219358
+Node: Copying vectors226800
+Node: Exchanging elements227660
+Node: Vector operations228218
+Node: Finding maximum and minimum elements of vectors229732
+Node: Vector properties231257
+Node: Example programs for vectors231880
+Node: Matrices234169
+Node: Matrix allocation237027
+Node: Accessing matrix elements238694
+Node: Initializing matrix elements240402
+Node: Reading and writing matrices241198
+Node: Matrix views243301
+Node: Creating row and column views250441
+Node: Copying matrices253612
+Node: Copying rows and columns254208
+Node: Exchanging rows and columns255885
+Node: Matrix operations257363
+Node: Finding maximum and minimum elements of matrices259003
+Node: Matrix properties260907
+Node: Example programs for matrices261655
+Node: Vector and Matrix References and Further Reading265726
+Node: Permutations266212
+Node: The Permutation struct267500
+Node: Permutation allocation268004
+Node: Accessing permutation elements269438
+Node: Permutation properties270201
+Node: Permutation functions270900
+Node: Applying Permutations272157
+Node: Reading and writing permutations274082
+Node: Permutations in cyclic form276264
+Node: Permutation Examples279689
+Node: Permutation References and Further Reading282232
+Node: Combinations282906
+Node: The Combination struct283751
+Node: Combination allocation284303
+Node: Accessing combination elements286088
+Node: Combination properties286667
+Node: Combination functions287553
+Node: Reading and writing combinations288493
+Node: Combination Examples290693
+Node: Combination References and Further Reading292001
+Node: Sorting292405
+Node: Sorting objects293355
+Node: Sorting vectors296266
+Node: Selecting the k smallest or largest elements298842
+Node: Computing the rank302176
+Node: Sorting Examples303377
+Node: Sorting References and Further Reading305021
+Node: BLAS Support305567
+Node: GSL BLAS Interface308542
+Node: Level 1 GSL BLAS Interface309029
+Node: Level 2 GSL BLAS Interface315772
+Node: Level 3 GSL BLAS Interface325066
+Node: BLAS Examples336202
+Node: BLAS References and Further Reading337623
+Node: Linear Algebra338982
+Node: LU Decomposition340164
+Node: QR Decomposition345372
+Node: QR Decomposition with Column Pivoting351174
+Node: Singular Value Decomposition355584
+Node: Cholesky Decomposition359174
+Node: Tridiagonal Decomposition of Real Symmetric Matrices361181
+Node: Tridiagonal Decomposition of Hermitian Matrices363029
+Node: Hessenberg Decomposition of Real Matrices364984
+Node: Bidiagonalization367329
+Node: Householder Transformations369739
+Node: Householder solver for linear systems371587
+Node: Tridiagonal Systems372492
+Node: Balancing375145
+Node: Linear Algebra Examples375946
+Node: Linear Algebra References and Further Reading377934
+Node: Eigensystems379424
+Node: Real Symmetric Matrices380603
+Node: Complex Hermitian Matrices382835
+Node: Real Nonsymmetric Matrices385343
+Node: Sorting Eigenvalues and Eigenvectors390537
+Node: Eigenvalue and Eigenvector Examples392404
+Node: Eigenvalue and Eigenvector References397790
+Node: Fast Fourier Transforms398498
+Node: Mathematical Definitions399707
+Node: Overview of complex data FFTs402112
+Node: Radix-2 FFT routines for complex data405055
+Node: Mixed-radix FFT routines for complex data409267
+Node: Overview of real data FFTs418596
+Node: Radix-2 FFT routines for real data421030
+Node: Mixed-radix FFT routines for real data424037
+Node: FFT References and Further Reading434617
+Node: Numerical Integration437486
+Node: Numerical Integration Introduction439031
+Node: Integrands without weight functions440965
+Node: Integrands with weight functions441794
+Node: Integrands with singular weight functions442505
+Node: QNG non-adaptive Gauss-Kronrod integration443423
+Node: QAG adaptive integration444694
+Node: QAGS adaptive integration with singularities447325
+Node: QAGP adaptive integration with known singular points449125
+Node: QAGI adaptive integration on infinite intervals450439
+Node: QAWC adaptive integration for Cauchy principal values452732
+Node: QAWS adaptive integration for singular functions453907
+Node: QAWO adaptive integration for oscillatory functions457129
+Node: QAWF adaptive integration for Fourier integrals460908
+Node: Numerical integration error codes463533
+Node: Numerical integration examples464301
+Node: Numerical integration References and Further Reading466346
+Node: Random Number Generation467075
+Node: General comments on random numbers468577
+Node: The Random Number Generator Interface470527
+Node: Random number generator initialization471885
+Node: Sampling from a random number generator473901
+Node: Auxiliary random number generator functions477066
+Node: Random number environment variables479386
+Node: Copying random number generator state481912
+Node: Reading and writing random number generator state482887
+Node: Random number generator algorithms484299
+Node: Unix random number generators494108
+Node: Other random number generators497826
+Node: Random Number Generator Performance506459
+Node: Random Number Generator Examples507777
+Node: Random Number References and Further Reading509333
+Node: Random Number Acknowledgements510630
+Node: Quasi-Random Sequences511116
+Node: Quasi-random number generator initialization512223
+Node: Sampling from a quasi-random number generator513238
+Node: Auxiliary quasi-random number generator functions513855
+Node: Saving and resorting quasi-random number generator state514801
+Node: Quasi-random number generator algorithms515609
+Node: Quasi-random number generator examples516384
+Node: Quasi-random number references517369
+Node: Random Number Distributions517895
+Node: Random Number Distribution Introduction521094
+Node: The Gaussian Distribution522889
+Node: The Gaussian Tail Distribution525551
+Node: The Bivariate Gaussian Distribution527220
+Node: The Exponential Distribution528543
+Node: The Laplace Distribution529682
+Node: The Exponential Power Distribution530779
+Node: The Cauchy Distribution532047
+Node: The Rayleigh Distribution533296
+Node: The Rayleigh Tail Distribution534468
+Node: The Landau Distribution535340
+Node: The Levy alpha-Stable Distributions536295
+Node: The Levy skew alpha-Stable Distribution537353
+Node: The Gamma Distribution538965
+Node: The Flat (Uniform) Distribution540622
+Node: The Lognormal Distribution541774
+Node: The Chi-squared Distribution543122
+Node: The F-distribution544526
+Node: The t-distribution546162
+Node: The Beta Distribution547556
+Node: The Logistic Distribution548715
+Node: The Pareto Distribution549844
+Node: Spherical Vector Distributions551014
+Node: The Weibull Distribution553848
+Node: The Type-1 Gumbel Distribution555042
+Node: The Type-2 Gumbel Distribution556279
+Node: The Dirichlet Distribution557510
+Node: General Discrete Distributions559178
+Node: The Poisson Distribution563043
+Node: The Bernoulli Distribution564051
+Node: The Binomial Distribution564802
+Node: The Multinomial Distribution566007
+Node: The Negative Binomial Distribution567776
+Node: The Pascal Distribution569141
+Node: The Geometric Distribution570299
+Node: The Hypergeometric Distribution571547
+Node: The Logarithmic Distribution573200
+Node: Shuffling and Sampling573991
+Node: Random Number Distribution Examples576810
+Node: Random Number Distribution References and Further Reading580006
+Node: Statistics582072
+Node: Mean and standard deviation and variance583351
+Node: Absolute deviation586396
+Node: Higher moments (skewness and kurtosis)587688
+Node: Autocorrelation589821
+Node: Covariance590635
+Node: Weighted Samples591616
+Node: Maximum and Minimum values596860
+Node: Median and Percentiles599599
+Node: Example statistical programs602014
+Node: Statistics References and Further Reading604673
+Node: Histograms605881
+Node: The histogram struct607641
+Node: Histogram allocation609444
+Node: Copying Histograms612405
+Node: Updating and accessing histogram elements613081
+Node: Searching histogram ranges616348
+Node: Histogram Statistics617347
+Node: Histogram Operations619207
+Node: Reading and writing histograms621279
+Node: Resampling from histograms624321
+Node: The histogram probability distribution struct625119
+Node: Example programs for histograms628150
+Node: Two dimensional histograms630213
+Node: The 2D histogram struct630934
+Node: 2D Histogram allocation632742
+Node: Copying 2D Histograms634813
+Node: Updating and accessing 2D histogram elements635518
+Node: Searching 2D histogram ranges639173
+Node: 2D Histogram Statistics640192
+Node: 2D Histogram Operations643051
+Node: Reading and writing 2D histograms645225
+Node: Resampling from 2D histograms648852
+Node: Example programs for 2D histograms651871
+Node: N-tuples653699
+Node: The ntuple struct654955
+Node: Creating ntuples655433
+Node: Opening an existing ntuple file656100
+Node: Writing ntuples656728
+Node: Reading ntuples657189
+Node: Closing an ntuple file657520
+Node: Histogramming ntuple values657860
+Node: Example ntuple programs659866
+Node: Ntuple References and Further Reading663195
+Node: Monte Carlo Integration663516
+Node: Monte Carlo Interface664761
+Node: PLAIN Monte Carlo667384
+Node: MISER669822
+Node: VEGAS675660
+Node: Monte Carlo Examples683995
+Node: Monte Carlo Integration References and Further Reading689938
+Node: Simulated Annealing690720
+Node: Simulated Annealing algorithm691927
+Node: Simulated Annealing functions693081
+Node: Examples with Simulated Annealing697607
+Node: Trivial example698161
+Node: Traveling Salesman Problem700812
+Node: Simulated Annealing References and Further Reading704125
+Node: Ordinary Differential Equations704536
+Node: Defining the ODE System705357
+Node: Stepping Functions707549
+Node: Adaptive Step-size Control711728
+Node: Evolution717186
+Node: ODE Example programs719864
+Node: ODE References and Further Reading724934
+Node: Interpolation725573
+Node: Introduction to Interpolation726586
+Node: Interpolation Functions727027
+Node: Interpolation Types728203
+Node: Index Look-up and Acceleration730813
+Node: Evaluation of Interpolating Functions732443
+Node: Higher-level Interface734827
+Node: Interpolation Example programs736866
+Node: Interpolation References and Further Reading740113
+Node: Numerical Differentiation740686
+Node: Numerical Differentiation functions741275
+Node: Numerical Differentiation Examples744133
+Node: Numerical Differentiation References745546
+Node: Chebyshev Approximations746097
+Node: Chebyshev Definitions747113
+Node: Creation and Calculation of Chebyshev Series747903
+Node: Chebyshev Series Evaluation748875
+Node: Derivatives and Integrals750259
+Node: Chebyshev Approximation examples751501
+Node: Chebyshev Approximation References and Further Reading752997
+Node: Series Acceleration753446
+Node: Acceleration functions754211
+Node: Acceleration functions without error estimation756536
+Node: Example of accelerating a series759146
+Node: Series Acceleration References761492
+Node: Wavelet Transforms762380
+Node: DWT Definitions762921
+Node: DWT Initialization763873
+Node: DWT Transform Functions766452
+Node: DWT in one dimension766987
+Node: DWT in two dimension769006
+Node: DWT Examples773607
+Node: DWT References775424
+Node: Discrete Hankel Transforms777587
+Node: Discrete Hankel Transform Definition778055
+Node: Discrete Hankel Transform Functions780194
+Node: Discrete Hankel Transform References781725
+Node: One dimensional Root-Finding782129
+Node: Root Finding Overview783389
+Node: Root Finding Caveats785247
+Node: Initializing the Solver787014
+Node: Providing the function to solve789647
+Node: Search Bounds and Guesses793413
+Node: Root Finding Iteration794274
+Node: Search Stopping Parameters796123
+Node: Root Bracketing Algorithms798637
+Node: Root Finding Algorithms using Derivatives801935
+Node: Root Finding Examples805438
+Node: Root Finding References and Further Reading812726
+Node: One dimensional Minimization813365
+Node: Minimization Overview814667
+Node: Minimization Caveats816373
+Node: Initializing the Minimizer817710
+Node: Providing the function to minimize819951
+Node: Minimization Iteration820429
+Node: Minimization Stopping Parameters822565
+Node: Minimization Algorithms824174
+Node: Minimization Examples826613
+Node: Minimization References and Further Reading829557
+Node: Multidimensional Root-Finding830013
+Node: Overview of Multidimensional Root Finding831502
+Node: Initializing the Multidimensional Solver833689
+Node: Providing the multidimensional system of equations to solve836887
+Node: Iteration of the multidimensional solver841792
+Node: Search Stopping Parameters for the multidimensional solver843977
+Node: Algorithms using Derivatives845714
+Node: Algorithms without Derivatives850460
+Node: Example programs for Multidimensional Root finding853548
+Node: References and Further Reading for Multidimensional Root Finding862161
+Node: Multidimensional Minimization863400
+Node: Multimin Overview864692
+Node: Multimin Caveats866664
+Node: Initializing the Multidimensional Minimizer867413
+Node: Providing a function to minimize870574
+Node: Multimin Iteration874239
+Node: Multimin Stopping Criteria876230
+Node: Multimin Algorithms877782
+Node: Multimin Examples882741
+Node: Multimin References and Further Reading889358
+Node: Least-Squares Fitting890221
+Node: Fitting Overview891220
+Node: Linear regression893436
+Node: Linear fitting without a constant term895867
+Node: Multi-parameter fitting898058
+Node: Fitting Examples902963
+Node: Fitting References and Further Reading909788
+Node: Nonlinear Least-Squares Fitting910610
+Node: Overview of Nonlinear Least-Squares Fitting912060
+Node: Initializing the Nonlinear Least-Squares Solver913527
+Node: Providing the Function to be Minimized916380
+Node: Iteration of the Minimization Algorithm919317
+Node: Search Stopping Parameters for Minimization Algorithms921167
+Node: Minimization Algorithms using Derivatives923262
+Node: Minimization Algorithms without Derivatives926510
+Node: Computing the covariance matrix of best fit parameters926902
+Node: Example programs for Nonlinear Least-Squares Fitting928936
+Node: References and Further Reading for Nonlinear Least-Squares Fitting936664
+Node: Basis Splines937400
+Node: Overview of B-splines937975
+Node: Initializing the B-splines solver939260
+Node: Constructing the knots vector940003
+Node: Evaluation of B-spline basis functions940790
+Node: Example programs for B-splines941523
+Node: References and Further Reading945220
+Node: Physical Constants945734
+Node: Fundamental Constants947144
+Node: Astronomy and Astrophysics948283
+Node: Atomic and Nuclear Physics948948
+Node: Measurement of Time950585
+Node: Imperial Units951015
+Node: Speed and Nautical Units951457
+Node: Printers Units951961
+Node: Volume Area and Length952284
+Node: Mass and Weight952970
+Node: Thermal Energy and Power953789
+Node: Pressure954212
+Node: Viscosity954825
+Node: Light and Illumination955101
+Node: Radioactivity955693
+Node: Force and Energy956028
+Node: Prefixes956432
+Node: Physical Constant Examples957175
+Node: Physical Constant References and Further Reading958964
+Node: IEEE floating-point arithmetic959675
+Node: Representation of floating point numbers960261
+Node: Setting up your IEEE environment964742
+Node: IEEE References and Further Reading971351
+Node: Debugging Numerical Programs972506
+Node: Using gdb972990
+Node: Examining floating point registers976333
+Node: Handling floating point exceptions977618
+Node: GCC warning options for numerical programs979030
+Node: Debugging References983223
+Node: Contributors to GSL983935
+Node: Autoconf Macros988118
+Node: GSL CBLAS Library992103
+Node: Level 1 CBLAS Functions992630
+Node: Level 2 CBLAS Functions997932
+Node: Level 3 CBLAS Functions1014602
+Node: GSL CBLAS Examples1024264
+Node: Free Software Needs Free Documentation1025826
+Node: GNU General Public License1030895
+Node: GNU Free Documentation License1050165
+Node: Function Index1072596
+Node: Variable Index1306453
+Node: Type Index1307625
+Node: Concept Index1311271
+
+End Tag Table
diff --git a/gsl-1.9/doc/gsl-ref.info-1 b/gsl-1.9/doc/gsl-ref.info-1
new file mode 100644
index 0000000..2d4e483
--- /dev/null
+++ b/gsl-1.9/doc/gsl-ref.info-1
@@ -0,0 +1,7392 @@
+This is gsl-ref.info, produced by makeinfo version 4.8 from
+gsl-ref.texi.
+
+INFO-DIR-SECTION Scientific software
+START-INFO-DIR-ENTRY
+* gsl-ref: (gsl-ref). GNU Scientific Library - Reference
+END-INFO-DIR-ENTRY
+
+ Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+2005, 2006, 2007 The GSL Team.
+
+ Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2 or
+any later version published by the Free Software Foundation; with the
+Invariant Sections being "GNU General Public License" and "Free Software
+Needs Free Documentation", the Front-Cover text being "A GNU Manual",
+and with the Back-Cover Text being (a) (see below). A copy of the
+license is included in the section entitled "GNU Free Documentation
+License".
+
+ (a) The Back-Cover Text is: "You have freedom to copy and modify this
+GNU Manual, like GNU software."
+
+
+File: gsl-ref.info, Node: Top, Next: Introduction, Prev: (dir), Up: (dir)
+
+GSL
+***
+
+This file documents the GNU Scientific Library (GSL), a collection of
+numerical routines for scientific computing. It corresponds to release
+1.9 of the library. Please report any errors in this manual to
+<bug-gsl@gnu.org>.
+
+ More information about GSL can be found at the project homepage,
+`http://www.gnu.org/software/gsl/'.
+
+ Printed copies of this manual can be purchased from Network Theory
+Ltd at `http://www.network-theory.co.uk/gsl/manual/'. The money raised
+from sales of the manual helps support the development of GSL.
+
+ A Japanese translation of this manual is available from the GSL
+project homepage thanks to Daisuke Tominaga.
+
+ Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+2005, 2006, 2007 The GSL Team.
+
+ Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2 or
+any later version published by the Free Software Foundation; with the
+Invariant Sections being "GNU General Public License" and "Free Software
+Needs Free Documentation", the Front-Cover text being "A GNU Manual",
+and with the Back-Cover Text being (a) (see below). A copy of the
+license is included in the section entitled "GNU Free Documentation
+License".
+
+ (a) The Back-Cover Text is: "You have freedom to copy and modify this
+GNU Manual, like GNU software."
+
+
+* Menu:
+
+* Introduction::
+* Using the library::
+* Error Handling::
+* Mathematical Functions::
+* Complex Numbers::
+* Polynomials::
+* Special Functions::
+* Vectors and Matrices::
+* Permutations::
+* Combinations::
+* Sorting::
+* BLAS Support::
+* Linear Algebra::
+* Eigensystems::
+* Fast Fourier Transforms::
+* Numerical Integration::
+* Random Number Generation::
+* Quasi-Random Sequences::
+* Random Number Distributions::
+* Statistics::
+* Histograms::
+* N-tuples::
+* Monte Carlo Integration::
+* Simulated Annealing::
+* Ordinary Differential Equations::
+* Interpolation::
+* Numerical Differentiation::
+* Chebyshev Approximations::
+* Series Acceleration::
+* Wavelet Transforms::
+* Discrete Hankel Transforms::
+* One dimensional Root-Finding::
+* One dimensional Minimization::
+* Multidimensional Root-Finding::
+* Multidimensional Minimization::
+* Least-Squares Fitting::
+* Nonlinear Least-Squares Fitting::
+* Basis Splines::
+* Physical Constants::
+* IEEE floating-point arithmetic::
+* Debugging Numerical Programs::
+* Contributors to GSL::
+* Autoconf Macros::
+* GSL CBLAS Library::
+* Free Software Needs Free Documentation::
+* GNU General Public License::
+* GNU Free Documentation License::
+* Function Index::
+* Variable Index::
+* Type Index::
+* Concept Index::
+
+
+File: gsl-ref.info, Node: Introduction, Next: Using the library, Prev: Top, Up: Top
+
+1 Introduction
+**************
+
+The GNU Scientific Library (GSL) is a collection of routines for
+numerical computing. The routines have been written from scratch in C,
+and present a modern Applications Programming Interface (API) for C
+programmers, allowing wrappers to be written for very high level
+languages. The source code is distributed under the GNU General Public
+License.
+
+* Menu:
+
+* Routines available in GSL::
+* GSL is Free Software::
+* Obtaining GSL::
+* No Warranty::
+* Reporting Bugs::
+* Further Information::
+* Conventions used in this manual::
+
+
+File: gsl-ref.info, Node: Routines available in GSL, Next: GSL is Free Software, Up: Introduction
+
+1.1 Routines available in GSL
+=============================
+
+The library covers a wide range of topics in numerical computing.
+Routines are available for the following areas,
+
+ Complex Numbers Roots of Polynomials
+ Special Functions Vectors and Matrices
+ Permutations Combinations
+ Sorting BLAS Support
+ Linear Algebra CBLAS Library
+ Fast Fourier Transforms Eigensystems
+ Random Numbers Quadrature
+ Random Distributions Quasi-Random Sequences
+ Histograms Statistics
+ Monte Carlo Integration N-Tuples
+ Differential Equations Simulated Annealing
+ Numerical Differentiation Interpolation
+ Series Acceleration Chebyshev Approximations
+ Root-Finding Discrete Hankel Transforms
+ Least-Squares Fitting Minimization
+ IEEE Floating-Point Physical Constants
+ Wavelets
+
+The use of these routines is described in this manual. Each chapter
+provides detailed definitions of the functions, followed by example
+programs and references to the articles on which the algorithms are
+based.
+
+ Where possible the routines have been based on reliable public-domain
+packages such as FFTPACK and QUADPACK, which the developers of GSL have
+reimplemented in C with modern coding conventions.
+
+
+File: gsl-ref.info, Node: GSL is Free Software, Next: Obtaining GSL, Prev: Routines available in GSL, Up: Introduction
+
+1.2 GSL is Free Software
+========================
+
+The subroutines in the GNU Scientific Library are "free software"; this
+means that everyone is free to use them, and to redistribute them in
+other free programs. The library is not in the public domain; it is
+copyrighted and there are conditions on its distribution. These
+conditions are designed to permit everything that a good cooperating
+citizen would want to do. What is not allowed is to try to prevent
+others from further sharing any version of the software that they might
+get from you.
+
+ Specifically, we want to make sure that you have the right to share
+copies of programs that you are given which use the GNU Scientific
+Library, that you receive their source code or else can get it if you
+want it, that you can change these programs or use pieces of them in new
+free programs, and that you know you can do these things.
+
+ To make sure that everyone has such rights, we have to forbid you to
+deprive anyone else of these rights. For example, if you distribute
+copies of any code which uses the GNU Scientific Library, you must give
+the recipients all the rights that you have received. You must make
+sure that they, too, receive or can get the source code, both to the
+library and the code which uses it. And you must tell them their
+rights. This means that the library should not be redistributed in
+proprietary programs.
+
+ Also, for our own protection, we must make certain that everyone
+finds out that there is no warranty for the GNU Scientific Library. If
+these programs are modified by someone else and passed on, we want their
+recipients to know that what they have is not what we distributed, so
+that any problems introduced by others will not reflect on our
+reputation.
+
+ The precise conditions for the distribution of software related to
+the GNU Scientific Library are found in the GNU General Public License
+(*note GNU General Public License::). Further information about this
+license is available from the GNU Project webpage `Frequently Asked
+Questions about the GNU GPL',
+
+ `http://www.gnu.org/copyleft/gpl-faq.html'
+
+The Free Software Foundation also operates a license consulting service
+for commercial users (contact details available from
+`http://www.fsf.org/').
+
+
+File: gsl-ref.info, Node: Obtaining GSL, Next: No Warranty, Prev: GSL is Free Software, Up: Introduction
+
+1.3 Obtaining GSL
+=================
+
+The source code for the library can be obtained in different ways, by
+copying it from a friend, purchasing it on CDROM or downloading it from
+the internet. A list of public ftp servers which carry the source code
+can be found on the GNU website,
+
+ `http://www.gnu.org/software/gsl/'
+
+The preferred platform for the library is a GNU system, which allows it
+to take advantage of additional features in the GNU C compiler and GNU C
+library. However, the library is fully portable and should compile on
+most systems with a C compiler. Precompiled versions of the library
+can be purchased from commercial redistributors listed on the website
+above.
+
+ Announcements of new releases, updates and other relevant events are
+made on the `info-gsl@gnu.org' mailing list. To subscribe to this
+low-volume list, send an email of the following form:
+
+ To: info-gsl-request@gnu.org
+ Subject: subscribe
+
+You will receive a response asking you to reply in order to confirm
+your subscription.
+
+
+File: gsl-ref.info, Node: No Warranty, Next: Reporting Bugs, Prev: Obtaining GSL, Up: Introduction
+
+1.4 No Warranty
+===============
+
+The software described in this manual has no warranty, it is provided
+"as is". It is your responsibility to validate the behavior of the
+routines and their accuracy using the source code provided, or to
+purchase support and warranties from commercial redistributors. Consult
+the GNU General Public license for further details (*note GNU General
+Public License::).
+
+
+File: gsl-ref.info, Node: Reporting Bugs, Next: Further Information, Prev: No Warranty, Up: Introduction
+
+1.5 Reporting Bugs
+==================
+
+A list of known bugs can be found in the `BUGS' file included in the
+GSL distribution. Details of compilation problems can be found in the
+`INSTALL' file.
+
+ If you find a bug which is not listed in these files, please report
+it to <bug-gsl@gnu.org>.
+
+ All bug reports should include:
+
+ * The version number of GSL
+
+ * The hardware and operating system
+
+ * The compiler used, including version number and compilation options
+
+ * A description of the bug behavior
+
+ * A short program which exercises the bug
+
+It is useful if you can check whether the same problem occurs when the
+library is compiled without optimization. Thank you.
+
+ Any errors or omissions in this manual can also be reported to the
+same address.
+
+
+File: gsl-ref.info, Node: Further Information, Next: Conventions used in this manual, Prev: Reporting Bugs, Up: Introduction
+
+1.6 Further Information
+=======================
+
+Additional information, including online copies of this manual, links to
+related projects, and mailing list archives are available from the
+website mentioned above.
+
+ Any questions about the use and installation of the library can be
+asked on the mailing list `help-gsl@gnu.org'. To subscribe to this
+list, send an email of the following form:
+
+ To: help-gsl-request@gnu.org
+ Subject: subscribe
+
+This mailing list can be used to ask questions not covered by this
+manual, and to contact the developers of the library.
+
+ If you would like to refer to the GNU Scientific Library in a journal
+article, the recommended way is to cite this reference manual, e.g. `M.
+Galassi et al, GNU Scientific Library Reference Manual (2nd Ed.), ISBN
+0954161734'.
+
+ If you want to give a url, use "`http://www.gnu.org/software/gsl/'".
+
+
+File: gsl-ref.info, Node: Conventions used in this manual, Prev: Further Information, Up: Introduction
+
+1.7 Conventions used in this manual
+===================================
+
+This manual contains many examples which can be typed at the keyboard.
+A command entered at the terminal is shown like this,
+
+ $ command
+
+The first character on the line is the terminal prompt, and should not
+be typed. The dollar sign `$' is used as the standard prompt in this
+manual, although some systems may use a different character.
+
+ The examples assume the use of the GNU operating system. There may
+be minor differences in the output on other systems. The commands for
+setting environment variables use the Bourne shell syntax of the
+standard GNU shell (`bash').
+
+
+File: gsl-ref.info, Node: Using the library, Next: Error Handling, Prev: Introduction, Up: Top
+
+2 Using the library
+*******************
+
+This chapter describes how to compile programs that use GSL, and
+introduces its conventions.
+
+* Menu:
+
+* An Example Program::
+* Compiling and Linking::
+* Shared Libraries::
+* ANSI C Compliance::
+* Inline functions::
+* Long double::
+* Portability functions::
+* Alternative optimized functions::
+* Support for different numeric types::
+* Compatibility with C++::
+* Aliasing of arrays::
+* Thread-safety::
+* Deprecated Functions::
+* Code Reuse::
+
+
+File: gsl-ref.info, Node: An Example Program, Next: Compiling and Linking, Up: Using the library
+
+2.1 An Example Program
+======================
+
+The following short program demonstrates the use of the library by
+computing the value of the Bessel function J_0(x) for x=5,
+
+ #include <stdio.h>
+ #include <gsl/gsl_sf_bessel.h>
+
+ int
+ main (void)
+ {
+ double x = 5.0;
+ double y = gsl_sf_bessel_J0 (x);
+ printf ("J0(%g) = %.18e\n", x, y);
+ return 0;
+ }
+
+The output is shown below, and should be correct to double-precision
+accuracy,
+
+ J0(5) = -1.775967713143382920e-01
+
+The steps needed to compile this program are described in the following
+sections.
+
+
+File: gsl-ref.info, Node: Compiling and Linking, Next: Shared Libraries, Prev: An Example Program, Up: Using the library
+
+2.2 Compiling and Linking
+=========================
+
+The library header files are installed in their own `gsl' directory.
+You should write any preprocessor include statements with a `gsl/'
+directory prefix thus,
+
+ #include <gsl/gsl_math.h>
+
+If the directory is not installed on the standard search path of your
+compiler you will also need to provide its location to the preprocessor
+as a command line flag. The default location of the `gsl' directory is
+`/usr/local/include/gsl'. A typical compilation command for a source
+file `example.c' with the GNU C compiler `gcc' is,
+
+ $ gcc -Wall -I/usr/local/include -c example.c
+
+This results in an object file `example.o'. The default include path
+for `gcc' searches `/usr/local/include' automatically so the `-I'
+option can actually be omitted when GSL is installed in its default
+location.
+
+* Menu:
+
+* Linking programs with the library::
+* Linking with an alternative BLAS library::
+
+
+File: gsl-ref.info, Node: Linking programs with the library, Next: Linking with an alternative BLAS library, Up: Compiling and Linking
+
+2.2.1 Linking programs with the library
+---------------------------------------
+
+The library is installed as a single file, `libgsl.a'. A shared
+version of the library `libgsl.so' is also installed on systems that
+support shared libraries. The default location of these files is
+`/usr/local/lib'. If this directory is not on the standard search path
+of your linker you will also need to provide its location as a command
+line flag.
+
+ To link against the library you need to specify both the main
+library and a supporting CBLAS library, which provides standard basic
+linear algebra subroutines. A suitable CBLAS implementation is
+provided in the library `libgslcblas.a' if your system does not provide
+one. The following example shows how to link an application with the
+library,
+
+ $ gcc -L/usr/local/lib example.o -lgsl -lgslcblas -lm
+
+The default library path for `gcc' searches `/usr/local/lib'
+automatically so the `-L' option can be omitted when GSL is installed
+in its default location.
+
+
+File: gsl-ref.info, Node: Linking with an alternative BLAS library, Prev: Linking programs with the library, Up: Compiling and Linking
+
+2.2.2 Linking with an alternative BLAS library
+----------------------------------------------
+
+The following command line shows how you would link the same application
+with an alternative CBLAS library called `libcblas',
+
+ $ gcc example.o -lgsl -lcblas -lm
+
+For the best performance an optimized platform-specific CBLAS library
+should be used for `-lcblas'. The library must conform to the CBLAS
+standard. The ATLAS package provides a portable high-performance BLAS
+library with a CBLAS interface. It is free software and should be
+installed for any work requiring fast vector and matrix operations.
+The following command line will link with the ATLAS library and its
+CBLAS interface,
+
+ $ gcc example.o -lgsl -lcblas -latlas -lm
+
+For more information see *Note BLAS Support::.
+
+
+File: gsl-ref.info, Node: Shared Libraries, Next: ANSI C Compliance, Prev: Compiling and Linking, Up: Using the library
+
+2.3 Shared Libraries
+====================
+
+To run a program linked with the shared version of the library the
+operating system must be able to locate the corresponding `.so' file at
+runtime. If the library cannot be found, the following error will
+occur:
+
+ $ ./a.out
+ ./a.out: error while loading shared libraries:
+ libgsl.so.0: cannot open shared object file: No such
+ file or directory
+
+To avoid this error, define the shell variable `LD_LIBRARY_PATH' to
+include the directory where the library is installed.
+
+ For example, in the Bourne shell (`/bin/sh' or `/bin/bash'), the
+library search path can be set with the following commands:
+
+ $ LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
+ $ export LD_LIBRARY_PATH
+ $ ./example
+
+In the C-shell (`/bin/csh' or `/bin/tcsh') the equivalent command is,
+
+ % setenv LD_LIBRARY_PATH /usr/local/lib:$LD_LIBRARY_PATH
+
+The standard prompt for the C-shell in the example above is the percent
+character `%', and should not be typed as part of the command.
+
+ To save retyping these commands each session they should be placed
+in an individual or system-wide login file.
+
+ To compile a statically linked version of the program, use the
+`-static' flag in `gcc',
+
+ $ gcc -static example.o -lgsl -lgslcblas -lm
+
+
+File: gsl-ref.info, Node: ANSI C Compliance, Next: Inline functions, Prev: Shared Libraries, Up: Using the library
+
+2.4 ANSI C Compliance
+=====================
+
+The library is written in ANSI C and is intended to conform to the ANSI
+C standard (C89). It should be portable to any system with a working
+ANSI C compiler.
+
+ The library does not rely on any non-ANSI extensions in the
+interface it exports to the user. Programs you write using GSL can be
+ANSI compliant. Extensions which can be used in a way compatible with
+pure ANSI C are supported, however, via conditional compilation. This
+allows the library to take advantage of compiler extensions on those
+platforms which support them.
+
+ When an ANSI C feature is known to be broken on a particular system
+the library will exclude any related functions at compile-time. This
+should make it impossible to link a program that would use these
+functions and give incorrect results.
+
+ To avoid namespace conflicts all exported function names and
+variables have the prefix `gsl_', while exported macros have the prefix
+`GSL_'.
+
+
+File: gsl-ref.info, Node: Inline functions, Next: Long double, Prev: ANSI C Compliance, Up: Using the library
+
+2.5 Inline functions
+====================
+
+The `inline' keyword is not part of the original ANSI C standard (C89)
+and the library does not export any inline function definitions by
+default. However, the library provides optional inline versions of
+performance-critical functions by conditional compilation. The inline
+versions of these functions can be included by defining the macro
+`HAVE_INLINE' when compiling an application,
+
+ $ gcc -Wall -c -DHAVE_INLINE example.c
+
+If you use `autoconf' this macro can be defined automatically. If you
+do not define the macro `HAVE_INLINE' then the slower non-inlined
+versions of the functions will be used instead.
+
+ Note that the actual usage of the inline keyword is `extern inline',
+which eliminates unnecessary function definitions in GCC. If the form
+`extern inline' causes problems with other compilers a stricter
+autoconf test can be used, see *Note Autoconf Macros::.
+
+
+File: gsl-ref.info, Node: Long double, Next: Portability functions, Prev: Inline functions, Up: Using the library
+
+2.6 Long double
+===============
+
+The extended numerical type `long double' is part of the ANSI C
+standard and should be available in every modern compiler. However, the
+precision of `long double' is platform dependent, and this should be
+considered when using it. The IEEE standard only specifies the minimum
+precision of extended precision numbers, while the precision of
+`double' is the same on all platforms.
+
+ In some system libraries the `stdio.h' formatted input/output
+functions `printf' and `scanf' are not implemented correctly for `long
+double'. Undefined or incorrect results are avoided by testing these
+functions during the `configure' stage of library compilation and
+eliminating certain GSL functions which depend on them if necessary.
+The corresponding line in the `configure' output looks like this,
+
+ checking whether printf works with long double... no
+
+Consequently when `long double' formatted input/output does not work on
+a given system it should be impossible to link a program which uses GSL
+functions dependent on this.
+
+ If it is necessary to work on a system which does not support
+formatted `long double' input/output then the options are to use binary
+formats or to convert `long double' results into `double' for reading
+and writing.
+
+
+File: gsl-ref.info, Node: Portability functions, Next: Alternative optimized functions, Prev: Long double, Up: Using the library
+
+2.7 Portability functions
+=========================
+
+To help in writing portable applications GSL provides some
+implementations of functions that are found in other libraries, such as
+the BSD math library. You can write your application to use the native
+versions of these functions, and substitute the GSL versions via a
+preprocessor macro if they are unavailable on another platform.
+
+ For example, after determining whether the BSD function `hypot' is
+available you can include the following macro definitions in a file
+`config.h' with your application,
+
+ /* Substitute gsl_hypot for missing system hypot */
+
+ #ifndef HAVE_HYPOT
+ #define hypot gsl_hypot
+ #endif
+
+The application source files can then use the include command `#include
+<config.h>' to replace each occurrence of `hypot' by `gsl_hypot' when
+`hypot' is not available. This substitution can be made automatically
+if you use `autoconf', see *Note Autoconf Macros::.
+
+ In most circumstances the best strategy is to use the native
+versions of these functions when available, and fall back to GSL
+versions otherwise, since this allows your application to take
+advantage of any platform-specific optimizations in the system library.
+This is the strategy used within GSL itself.
+
+
+File: gsl-ref.info, Node: Alternative optimized functions, Next: Support for different numeric types, Prev: Portability functions, Up: Using the library
+
+2.8 Alternative optimized functions
+===================================
+
+The main implementation of some functions in the library will not be
+optimal on all architectures. For example, there are several ways to
+compute a Gaussian random variate and their relative speeds are
+platform-dependent. In cases like this the library provides alternative
+implementations of these functions with the same interface. If you
+write your application using calls to the standard implementation you
+can select an alternative version later via a preprocessor definition.
+It is also possible to introduce your own optimized functions this way
+while retaining portability. The following lines demonstrate the use of
+a platform-dependent choice of methods for sampling from the Gaussian
+distribution,
+
+ #ifdef SPARC
+ #define gsl_ran_gaussian gsl_ran_gaussian_ratio_method
+ #endif
+ #ifdef INTEL
+ #define gsl_ran_gaussian my_gaussian
+ #endif
+
+These lines would be placed in the configuration header file `config.h'
+of the application, which should then be included by all the source
+files. Note that the alternative implementations will not produce
+bit-for-bit identical results, and in the case of random number
+distributions will produce an entirely different stream of random
+variates.
+
+
+File: gsl-ref.info, Node: Support for different numeric types, Next: Compatibility with C++, Prev: Alternative optimized functions, Up: Using the library
+
+2.9 Support for different numeric types
+=======================================
+
+Many functions in the library are defined for different numeric types.
+This feature is implemented by varying the name of the function with a
+type-related modifier--a primitive form of C++ templates. The modifier
+is inserted into the function name after the initial module prefix.
+The following table shows the function names defined for all the
+numeric types of an imaginary module `gsl_foo' with function `fn',
+
+ gsl_foo_fn double
+ gsl_foo_long_double_fn long double
+ gsl_foo_float_fn float
+ gsl_foo_long_fn long
+ gsl_foo_ulong_fn unsigned long
+ gsl_foo_int_fn int
+ gsl_foo_uint_fn unsigned int
+ gsl_foo_short_fn short
+ gsl_foo_ushort_fn unsigned short
+ gsl_foo_char_fn char
+ gsl_foo_uchar_fn unsigned char
+
+The normal numeric precision `double' is considered the default and
+does not require a suffix. For example, the function `gsl_stats_mean'
+computes the mean of double precision numbers, while the function
+`gsl_stats_int_mean' computes the mean of integers.
+
+ A corresponding scheme is used for library defined types, such as
+`gsl_vector' and `gsl_matrix'. In this case the modifier is appended
+to the type name. For example, if a module defines a new
+type-dependent struct or typedef `gsl_foo' it is modified for other
+types in the following way,
+
+ gsl_foo double
+ gsl_foo_long_double long double
+ gsl_foo_float float
+ gsl_foo_long long
+ gsl_foo_ulong unsigned long
+ gsl_foo_int int
+ gsl_foo_uint unsigned int
+ gsl_foo_short short
+ gsl_foo_ushort unsigned short
+ gsl_foo_char char
+ gsl_foo_uchar unsigned char
+
+When a module contains type-dependent definitions the library provides
+individual header files for each type. The filenames are modified as
+shown in the below. For convenience the default header includes the
+definitions for all the types. To include only the double precision
+header file, or any other specific type, use its individual filename.
+
+ #include <gsl/gsl_foo.h> All types
+ #include <gsl/gsl_foo_double.h> double
+ #include <gsl/gsl_foo_long_double.h> long double
+ #include <gsl/gsl_foo_float.h> float
+ #include <gsl/gsl_foo_long.h> long
+ #include <gsl/gsl_foo_ulong.h> unsigned long
+ #include <gsl/gsl_foo_int.h> int
+ #include <gsl/gsl_foo_uint.h> unsigned int
+ #include <gsl/gsl_foo_short.h> short
+ #include <gsl/gsl_foo_ushort.h> unsigned short
+ #include <gsl/gsl_foo_char.h> char
+ #include <gsl/gsl_foo_uchar.h> unsigned char
+
+
+File: gsl-ref.info, Node: Compatibility with C++, Next: Aliasing of arrays, Prev: Support for different numeric types, Up: Using the library
+
+2.10 Compatibility with C++
+===========================
+
+The library header files automatically define functions to have `extern
+"C"' linkage when included in C++ programs. This allows the functions
+to be called directly from C++.
+
+ To use C++ exception handling within user-defined functions passed to
+the library as parameters, the library must be built with the
+additional `CFLAGS' compilation option `-fexceptions'.
+
+
+File: gsl-ref.info, Node: Aliasing of arrays, Next: Thread-safety, Prev: Compatibility with C++, Up: Using the library
+
+2.11 Aliasing of arrays
+=======================
+
+The library assumes that arrays, vectors and matrices passed as
+modifiable arguments are not aliased and do not overlap with each other.
+This removes the need for the library to handle overlapping memory
+regions as a special case, and allows additional optimizations to be
+used. If overlapping memory regions are passed as modifiable arguments
+then the results of such functions will be undefined. If the arguments
+will not be modified (for example, if a function prototype declares them
+as `const' arguments) then overlapping or aliased memory regions can be
+safely used.
+
+
+File: gsl-ref.info, Node: Thread-safety, Next: Deprecated Functions, Prev: Aliasing of arrays, Up: Using the library
+
+2.12 Thread-safety
+==================
+
+The library can be used in multi-threaded programs. All the functions
+are thread-safe, in the sense that they do not use static variables.
+Memory is always associated with objects and not with functions. For
+functions which use "workspace" objects as temporary storage the
+workspaces should be allocated on a per-thread basis. For functions
+which use "table" objects as read-only memory the tables can be used by
+multiple threads simultaneously. Table arguments are always declared
+`const' in function prototypes, to indicate that they may be safely
+accessed by different threads.
+
+ There are a small number of static global variables which are used to
+control the overall behavior of the library (e.g. whether to use
+range-checking, the function to call on fatal error, etc). These
+variables are set directly by the user, so they should be initialized
+once at program startup and not modified by different threads.
+
+
+File: gsl-ref.info, Node: Deprecated Functions, Next: Code Reuse, Prev: Thread-safety, Up: Using the library
+
+2.13 Deprecated Functions
+=========================
+
+From time to time, it may be necessary for the definitions of some
+functions to be altered or removed from the library. In these
+circumstances the functions will first be declared "deprecated" and
+then removed from subsequent versions of the library. Functions that
+are deprecated can be disabled in the current release by setting the
+preprocessor definition `GSL_DISABLE_DEPRECATED'. This allows existing
+code to be tested for forwards compatibility.
+
+
+File: gsl-ref.info, Node: Code Reuse, Prev: Deprecated Functions, Up: Using the library
+
+2.14 Code Reuse
+===============
+
+Where possible the routines in the library have been written to avoid
+dependencies between modules and files. This should make it possible to
+extract individual functions for use in your own applications, without
+needing to have the whole library installed. You may need to define
+certain macros such as `GSL_ERROR' and remove some `#include'
+statements in order to compile the files as standalone units. Reuse of
+the library code in this way is encouraged, subject to the terms of the
+GNU General Public License.
+
+
+File: gsl-ref.info, Node: Error Handling, Next: Mathematical Functions, Prev: Using the library, Up: Top
+
+3 Error Handling
+****************
+
+This chapter describes the way that GSL functions report and handle
+errors. By examining the status information returned by every function
+you can determine whether it succeeded or failed, and if it failed you
+can find out what the precise cause of failure was. You can also define
+your own error handling functions to modify the default behavior of the
+library.
+
+ The functions described in this section are declared in the header
+file `gsl_errno.h'.
+
+* Menu:
+
+* Error Reporting::
+* Error Codes::
+* Error Handlers::
+* Using GSL error reporting in your own functions::
+* Error Reporting Examples::
+
+
+File: gsl-ref.info, Node: Error Reporting, Next: Error Codes, Up: Error Handling
+
+3.1 Error Reporting
+===================
+
+The library follows the thread-safe error reporting conventions of the
+POSIX Threads library. Functions return a non-zero error code to
+indicate an error and `0' to indicate success.
+
+ int status = gsl_function (...)
+
+ if (status) { /* an error occurred */
+ .....
+ /* status value specifies the type of error */
+ }
+
+ The routines report an error whenever they cannot perform the task
+requested of them. For example, a root-finding function would return a
+non-zero error code if could not converge to the requested accuracy, or
+exceeded a limit on the number of iterations. Situations like this are
+a normal occurrence when using any mathematical library and you should
+check the return status of the functions that you call.
+
+ Whenever a routine reports an error the return value specifies the
+type of error. The return value is analogous to the value of the
+variable `errno' in the C library. The caller can examine the return
+code and decide what action to take, including ignoring the error if it
+is not considered serious.
+
+ In addition to reporting errors by return codes the library also has
+an error handler function `gsl_error'. This function is called by
+other library functions when they report an error, just before they
+return to the caller. The default behavior of the error handler is to
+print a message and abort the program,
+
+ gsl: file.c:67: ERROR: invalid argument supplied by user
+ Default GSL error handler invoked.
+ Aborted
+
+ The purpose of the `gsl_error' handler is to provide a function
+where a breakpoint can be set that will catch library errors when
+running under the debugger. It is not intended for use in production
+programs, which should handle any errors using the return codes.
+
+
+File: gsl-ref.info, Node: Error Codes, Next: Error Handlers, Prev: Error Reporting, Up: Error Handling
+
+3.2 Error Codes
+===============
+
+The error code numbers returned by library functions are defined in the
+file `gsl_errno.h'. They all have the prefix `GSL_' and expand to
+non-zero constant integer values. Error codes above 1024 are reserved
+for applications, and are not used by the library. Many of the error
+codes use the same base name as the corresponding error code in the C
+library. Here are some of the most common error codes,
+
+ -- Macro: int GSL_EDOM
+ Domain error; used by mathematical functions when an argument
+ value does not fall into the domain over which the function is
+ defined (like EDOM in the C library)
+
+ -- Macro: int GSL_ERANGE
+ Range error; used by mathematical functions when the result value
+ is not representable because of overflow or underflow (like ERANGE
+ in the C library)
+
+ -- Macro: int GSL_ENOMEM
+ No memory available. The system cannot allocate more virtual
+ memory because its capacity is full (like ENOMEM in the C
+ library). This error is reported when a GSL routine encounters
+ problems when trying to allocate memory with `malloc'.
+
+ -- Macro: int GSL_EINVAL
+ Invalid argument. This is used to indicate various kinds of
+ problems with passing the wrong argument to a library function
+ (like EINVAL in the C library).
+
+ The error codes can be converted into an error message using the
+function `gsl_strerror'.
+
+ -- Function: const char * gsl_strerror (const int GSL_ERRNO)
+ This function returns a pointer to a string describing the error
+ code GSL_ERRNO. For example,
+
+ printf ("error: %s\n", gsl_strerror (status));
+
+ would print an error message like `error: output range error' for a
+ status value of `GSL_ERANGE'.
+
+
+File: gsl-ref.info, Node: Error Handlers, Next: Using GSL error reporting in your own functions, Prev: Error Codes, Up: Error Handling
+
+3.3 Error Handlers
+==================
+
+The default behavior of the GSL error handler is to print a short
+message and call `abort'. When this default is in use programs will
+stop with a core-dump whenever a library routine reports an error.
+This is intended as a fail-safe default for programs which do not check
+the return status of library routines (we don't encourage you to write
+programs this way).
+
+ If you turn off the default error handler it is your responsibility
+to check the return values of routines and handle them yourself. You
+can also customize the error behavior by providing a new error handler.
+For example, an alternative error handler could log all errors to a
+file, ignore certain error conditions (such as underflows), or start the
+debugger and attach it to the current process when an error occurs.
+
+ All GSL error handlers have the type `gsl_error_handler_t', which is
+defined in `gsl_errno.h',
+
+ -- Data Type: gsl_error_handler_t
+ This is the type of GSL error handler functions. An error handler
+ will be passed four arguments which specify the reason for the
+ error (a string), the name of the source file in which it occurred
+ (also a string), the line number in that file (an integer) and the
+ error number (an integer). The source file and line number are
+ set at compile time using the `__FILE__' and `__LINE__' directives
+ in the preprocessor. An error handler function returns type
+ `void'. Error handler functions should be defined like this,
+
+ void handler (const char * reason,
+ const char * file,
+ int line,
+ int gsl_errno)
+
+To request the use of your own error handler you need to call the
+function `gsl_set_error_handler' which is also declared in
+`gsl_errno.h',
+
+ -- Function: gsl_error_handler_t * gsl_set_error_handler
+ (gsl_error_handler_t NEW_HANDLER)
+ This function sets a new error handler, NEW_HANDLER, for the GSL
+ library routines. The previous handler is returned (so that you
+ can restore it later). Note that the pointer to a user defined
+ error handler function is stored in a static variable, so there
+ can be only one error handler per program. This function should
+ be not be used in multi-threaded programs except to set up a
+ program-wide error handler from a master thread. The following
+ example shows how to set and restore a new error handler,
+
+ /* save original handler, install new handler */
+ old_handler = gsl_set_error_handler (&my_handler);
+
+ /* code uses new handler */
+ .....
+
+ /* restore original handler */
+ gsl_set_error_handler (old_handler);
+
+ To use the default behavior (`abort' on error) set the error
+ handler to `NULL',
+
+ old_handler = gsl_set_error_handler (NULL);
+
+ -- Function: gsl_error_handler_t * gsl_set_error_handler_off ()
+ This function turns off the error handler by defining an error
+ handler which does nothing. This will cause the program to
+ continue after any error, so the return values from any library
+ routines must be checked. This is the recommended behavior for
+ production programs. The previous handler is returned (so that
+ you can restore it later).
+
+ The error behavior can be changed for specific applications by
+recompiling the library with a customized definition of the `GSL_ERROR'
+macro in the file `gsl_errno.h'.
+
+
+File: gsl-ref.info, Node: Using GSL error reporting in your own functions, Next: Error Reporting Examples, Prev: Error Handlers, Up: Error Handling
+
+3.4 Using GSL error reporting in your own functions
+===================================================
+
+If you are writing numerical functions in a program which also uses GSL
+code you may find it convenient to adopt the same error reporting
+conventions as in the library.
+
+ To report an error you need to call the function `gsl_error' with a
+string describing the error and then return an appropriate error code
+from `gsl_errno.h', or a special value, such as `NaN'. For convenience
+the file `gsl_errno.h' defines two macros which carry out these steps:
+
+ -- Macro: GSL_ERROR (REASON, GSL_ERRNO)
+ This macro reports an error using the GSL conventions and returns a
+ status value of `gsl_errno'. It expands to the following code
+ fragment,
+
+ gsl_error (reason, __FILE__, __LINE__, gsl_errno);
+ return gsl_errno;
+
+ The macro definition in `gsl_errno.h' actually wraps the code in a
+ `do { ... } while (0)' block to prevent possible parsing problems.
+
+ Here is an example of how the macro could be used to report that a
+routine did not achieve a requested tolerance. To report the error the
+routine needs to return the error code `GSL_ETOL'.
+
+ if (residual > tolerance)
+ {
+ GSL_ERROR("residual exceeds tolerance", GSL_ETOL);
+ }
+
+ -- Macro: GSL_ERROR_VAL (REASON, GSL_ERRNO, VALUE)
+ This macro is the same as `GSL_ERROR' but returns a user-defined
+ value of VALUE instead of an error code. It can be used for
+ mathematical functions that return a floating point value.
+
+ The following example shows how to return a `NaN' at a mathematical
+singularity using the `GSL_ERROR_VAL' macro,
+
+ if (x == 0)
+ {
+ GSL_ERROR_VAL("argument lies on singularity",
+ GSL_ERANGE, GSL_NAN);
+ }
+
+
+File: gsl-ref.info, Node: Error Reporting Examples, Prev: Using GSL error reporting in your own functions, Up: Error Handling
+
+3.5 Examples
+============
+
+Here is an example of some code which checks the return value of a
+function where an error might be reported,
+
+ #include <stdio.h>
+ #include <gsl/gsl_errno.h>
+ #include <gsl/gsl_fft_complex.h>
+
+ ...
+ int status;
+ size_t n = 37;
+
+ gsl_set_error_handler_off();
+
+ status = gsl_fft_complex_radix2_forward (data, n);
+
+ if (status) {
+ if (status == GSL_EINVAL) {
+ fprintf (stderr, "invalid argument, n=%d\n", n);
+ } else {
+ fprintf (stderr, "failed, gsl_errno=%d\n",
+ status);
+ }
+ exit (-1);
+ }
+ ...
+
+The function `gsl_fft_complex_radix2' only accepts integer lengths
+which are a power of two. If the variable `n' is not a power of two
+then the call to the library function will return `GSL_EINVAL',
+indicating that the length argument is invalid. The function call to
+`gsl_set_error_handler_off' stops the default error handler from
+aborting the program. The `else' clause catches any other possible
+errors.
+
+
+File: gsl-ref.info, Node: Mathematical Functions, Next: Complex Numbers, Prev: Error Handling, Up: Top
+
+4 Mathematical Functions
+************************
+
+This chapter describes basic mathematical functions. Some of these
+functions are present in system libraries, but the alternative versions
+given here can be used as a substitute when the system functions are not
+available.
+
+ The functions and macros described in this chapter are defined in the
+header file `gsl_math.h'.
+
+* Menu:
+
+* Mathematical Constants::
+* Infinities and Not-a-number::
+* Elementary Functions::
+* Small integer powers::
+* Testing the Sign of Numbers::
+* Testing for Odd and Even Numbers::
+* Maximum and Minimum functions::
+* Approximate Comparison of Floating Point Numbers::
+
+
+File: gsl-ref.info, Node: Mathematical Constants, Next: Infinities and Not-a-number, Up: Mathematical Functions
+
+4.1 Mathematical Constants
+==========================
+
+The library ensures that the standard BSD mathematical constants are
+defined. For reference, here is a list of the constants:
+
+`M_E'
+ The base of exponentials, e
+
+`M_LOG2E'
+ The base-2 logarithm of e, \log_2 (e)
+
+`M_LOG10E'
+ The base-10 logarithm of e, \log_10 (e)
+
+`M_SQRT2'
+ The square root of two, \sqrt 2
+
+`M_SQRT1_2'
+ The square root of one-half, \sqrt{1/2}
+
+`M_SQRT3'
+ The square root of three, \sqrt 3
+
+`M_PI'
+ The constant pi, \pi
+
+`M_PI_2'
+ Pi divided by two, \pi/2
+
+`M_PI_4'
+ Pi divided by four, \pi/4
+
+`M_SQRTPI'
+ The square root of pi, \sqrt\pi
+
+`M_2_SQRTPI'
+ Two divided by the square root of pi, 2/\sqrt\pi
+
+`M_1_PI'
+ The reciprocal of pi, 1/\pi
+
+`M_2_PI'
+ Twice the reciprocal of pi, 2/\pi
+
+`M_LN10'
+ The natural logarithm of ten, \ln(10)
+
+`M_LN2'
+ The natural logarithm of two, \ln(2)
+
+`M_LNPI'
+ The natural logarithm of pi, \ln(\pi)
+
+`M_EULER'
+ Euler's constant, \gamma
+
+
+
+File: gsl-ref.info, Node: Infinities and Not-a-number, Next: Elementary Functions, Prev: Mathematical Constants, Up: Mathematical Functions
+
+4.2 Infinities and Not-a-number
+===============================
+
+ -- Macro: GSL_POSINF
+ This macro contains the IEEE representation of positive infinity,
+ +\infty. It is computed from the expression `+1.0/0.0'.
+
+ -- Macro: GSL_NEGINF
+ This macro contains the IEEE representation of negative infinity,
+ -\infty. It is computed from the expression `-1.0/0.0'.
+
+ -- Macro: GSL_NAN
+ This macro contains the IEEE representation of the Not-a-Number
+ symbol, `NaN'. It is computed from the ratio `0.0/0.0'.
+
+ -- Function: int gsl_isnan (const double X)
+ This function returns 1 if X is not-a-number.
+
+ -- Function: int gsl_isinf (const double X)
+ This function returns +1 if X is positive infinity, -1 if X is
+ negative infinity and 0 otherwise.
+
+ -- Function: int gsl_finite (const double X)
+ This function returns 1 if X is a real number, and 0 if it is
+ infinite or not-a-number.
+
+
+File: gsl-ref.info, Node: Elementary Functions, Next: Small integer powers, Prev: Infinities and Not-a-number, Up: Mathematical Functions
+
+4.3 Elementary Functions
+========================
+
+The following routines provide portable implementations of functions
+found in the BSD math library. When native versions are not available
+the functions described here can be used instead. The substitution can
+be made automatically if you use `autoconf' to compile your application
+(*note Portability functions::).
+
+ -- Function: double gsl_log1p (const double X)
+ This function computes the value of \log(1+x) in a way that is
+ accurate for small X. It provides an alternative to the BSD math
+ function `log1p(x)'.
+
+ -- Function: double gsl_expm1 (const double X)
+ This function computes the value of \exp(x)-1 in a way that is
+ accurate for small X. It provides an alternative to the BSD math
+ function `expm1(x)'.
+
+ -- Function: double gsl_hypot (const double X, const double Y)
+ This function computes the value of \sqrt{x^2 + y^2} in a way that
+ avoids overflow. It provides an alternative to the BSD math
+ function `hypot(x,y)'.
+
+ -- Function: double gsl_acosh (const double X)
+ This function computes the value of \arccosh(x). It provides an
+ alternative to the standard math function `acosh(x)'.
+
+ -- Function: double gsl_asinh (const double X)
+ This function computes the value of \arcsinh(x). It provides an
+ alternative to the standard math function `asinh(x)'.
+
+ -- Function: double gsl_atanh (const double X)
+ This function computes the value of \arctanh(x). It provides an
+ alternative to the standard math function `atanh(x)'.
+
+ -- Function: double gsl_ldexp (double X, int E)
+ This function computes the value of x * 2^e. It provides an
+ alternative to the standard math function `ldexp(x,e)'.
+
+ -- Function: double gsl_frexp (double X, int * E)
+ This function splits the number x into its normalized fraction f
+ and exponent e, such that x = f * 2^e and 0.5 <= f < 1. The
+ function returns f and stores the exponent in e. If x is zero,
+ both f and e are set to zero. This function provides an
+ alternative to the standard math function `frexp(x, e)'.
+
+
+File: gsl-ref.info, Node: Small integer powers, Next: Testing the Sign of Numbers, Prev: Elementary Functions, Up: Mathematical Functions
+
+4.4 Small integer powers
+========================
+
+A common complaint about the standard C library is its lack of a
+function for calculating (small) integer powers. GSL provides some
+simple functions to fill this gap. For reasons of efficiency, these
+functions do not check for overflow or underflow conditions.
+
+ -- Function: double gsl_pow_int (double X, int N)
+ This routine computes the power x^n for integer N. The power is
+ computed efficiently--for example, x^8 is computed as ((x^2)^2)^2,
+ requiring only 3 multiplications. A version of this function
+ which also computes the numerical error in the result is available
+ as `gsl_sf_pow_int_e'.
+
+ -- Function: double gsl_pow_2 (const double X)
+ -- Function: double gsl_pow_3 (const double X)
+ -- Function: double gsl_pow_4 (const double X)
+ -- Function: double gsl_pow_5 (const double X)
+ -- Function: double gsl_pow_6 (const double X)
+ -- Function: double gsl_pow_7 (const double X)
+ -- Function: double gsl_pow_8 (const double X)
+ -- Function: double gsl_pow_9 (const double X)
+ These functions can be used to compute small integer powers x^2,
+ x^3, etc. efficiently. The functions will be inlined when possible
+ so that use of these functions should be as efficient as
+ explicitly writing the corresponding product expression.
+
+ #include <gsl/gsl_math.h>
+ double y = gsl_pow_4 (3.141) /* compute 3.141**4 */
+
+
+File: gsl-ref.info, Node: Testing the Sign of Numbers, Next: Testing for Odd and Even Numbers, Prev: Small integer powers, Up: Mathematical Functions
+
+4.5 Testing the Sign of Numbers
+===============================
+
+ -- Macro: GSL_SIGN (x)
+ This macro returns the sign of X. It is defined as `((x) >= 0 ? 1
+ : -1)'. Note that with this definition the sign of zero is positive
+ (regardless of its IEEE sign bit).
+
+
+File: gsl-ref.info, Node: Testing for Odd and Even Numbers, Next: Maximum and Minimum functions, Prev: Testing the Sign of Numbers, Up: Mathematical Functions
+
+4.6 Testing for Odd and Even Numbers
+====================================
+
+ -- Macro: GSL_IS_ODD (n)
+ This macro evaluates to 1 if N is odd and 0 if N is even. The
+ argument N must be of integer type.
+
+ -- Macro: GSL_IS_EVEN (n)
+ This macro is the opposite of `GSL_IS_ODD(n)'. It evaluates to 1 if
+ N is even and 0 if N is odd. The argument N must be of integer
+ type.
+
+
+File: gsl-ref.info, Node: Maximum and Minimum functions, Next: Approximate Comparison of Floating Point Numbers, Prev: Testing for Odd and Even Numbers, Up: Mathematical Functions
+
+4.7 Maximum and Minimum functions
+=================================
+
+ -- Macro: GSL_MAX (a, b)
+ This macro returns the maximum of A and B. It is defined as `((a)
+ > (b) ? (a):(b))'.
+
+ -- Macro: GSL_MIN (a, b)
+ This macro returns the minimum of A and B. It is defined as `((a)
+ < (b) ? (a):(b))'.
+
+ -- Function: extern inline double GSL_MAX_DBL (double A, double B)
+ This function returns the maximum of the double precision numbers
+ A and B using an inline function. The use of a function allows for
+ type checking of the arguments as an extra safety feature. On
+ platforms where inline functions are not available the macro
+ `GSL_MAX' will be automatically substituted.
+
+ -- Function: extern inline double GSL_MIN_DBL (double A, double B)
+ This function returns the minimum of the double precision numbers
+ A and B using an inline function. The use of a function allows for
+ type checking of the arguments as an extra safety feature. On
+ platforms where inline functions are not available the macro
+ `GSL_MIN' will be automatically substituted.
+
+ -- Function: extern inline int GSL_MAX_INT (int A, int B)
+ -- Function: extern inline int GSL_MIN_INT (int A, int B)
+ These functions return the maximum or minimum of the integers A
+ and B using an inline function. On platforms where inline
+ functions are not available the macros `GSL_MAX' or `GSL_MIN' will
+ be automatically substituted.
+
+ -- Function: extern inline long double GSL_MAX_LDBL (long double A,
+ long double B)
+ -- Function: extern inline long double GSL_MIN_LDBL (long double A,
+ long double B)
+ These functions return the maximum or minimum of the long doubles A
+ and B using an inline function. On platforms where inline
+ functions are not available the macros `GSL_MAX' or `GSL_MIN' will
+ be automatically substituted.
+
+
+File: gsl-ref.info, Node: Approximate Comparison of Floating Point Numbers, Prev: Maximum and Minimum functions, Up: Mathematical Functions
+
+4.8 Approximate Comparison of Floating Point Numbers
+====================================================
+
+It is sometimes useful to be able to compare two floating point numbers
+approximately, to allow for rounding and truncation errors. The
+following function implements the approximate floating-point comparison
+algorithm proposed by D.E. Knuth in Section 4.2.2 of `Seminumerical
+Algorithms' (3rd edition).
+
+ -- Function: int gsl_fcmp (double X, double Y, double EPSILON)
+ This function determines whether x and y are approximately equal
+ to a relative accuracy EPSILON.
+
+ The relative accuracy is measured using an interval of size 2
+ \delta, where \delta = 2^k \epsilon and k is the maximum base-2
+ exponent of x and y as computed by the function `frexp'.
+
+ If x and y lie within this interval, they are considered
+ approximately equal and the function returns 0. Otherwise if x <
+ y, the function returns -1, or if x > y, the function returns +1.
+
+ The implementation is based on the package `fcmp' by T.C. Belding.
+
+
+File: gsl-ref.info, Node: Complex Numbers, Next: Polynomials, Prev: Mathematical Functions, Up: Top
+
+5 Complex Numbers
+*****************
+
+The functions described in this chapter provide support for complex
+numbers. The algorithms take care to avoid unnecessary intermediate
+underflows and overflows, allowing the functions to be evaluated over
+as much of the complex plane as possible.
+
+ For multiple-valued functions the branch cuts have been chosen to
+follow the conventions of Abramowitz and Stegun in the `Handbook of
+Mathematical Functions'. The functions return principal values which are
+the same as those in GNU Calc, which in turn are the same as those in
+`Common Lisp, The Language (Second Edition)'(1) and the HP-28/48 series
+of calculators.
+
+ The complex types are defined in the header file `gsl_complex.h',
+while the corresponding complex functions and arithmetic operations are
+defined in `gsl_complex_math.h'.
+
+* Menu:
+
+* Complex numbers::
+* Properties of complex numbers::
+* Complex arithmetic operators::
+* Elementary Complex Functions::
+* Complex Trigonometric Functions::
+* Inverse Complex Trigonometric Functions::
+* Complex Hyperbolic Functions::
+* Inverse Complex Hyperbolic Functions::
+* Complex Number References and Further Reading::
+
+ ---------- Footnotes ----------
+
+ (1) Note that the first edition uses different definitions.
+
+
+File: gsl-ref.info, Node: Complex numbers, Next: Properties of complex numbers, Up: Complex Numbers
+
+5.1 Complex numbers
+===================
+
+Complex numbers are represented using the type `gsl_complex'. The
+internal representation of this type may vary across platforms and
+should not be accessed directly. The functions and macros described
+below allow complex numbers to be manipulated in a portable way.
+
+ For reference, the default form of the `gsl_complex' type is given
+by the following struct,
+
+ typedef struct
+ {
+ double dat[2];
+ } gsl_complex;
+
+The real and imaginary part are stored in contiguous elements of a two
+element array. This eliminates any padding between the real and
+imaginary parts, `dat[0]' and `dat[1]', allowing the struct to be
+mapped correctly onto packed complex arrays.
+
+ -- Function: gsl_complex gsl_complex_rect (double X, double Y)
+ This function uses the rectangular cartesian components (X,Y) to
+ return the complex number z = x + i y.
+
+ -- Function: gsl_complex gsl_complex_polar (double R, double THETA)
+ This function returns the complex number z = r \exp(i \theta) = r
+ (\cos(\theta) + i \sin(\theta)) from the polar representation
+ (R,THETA).
+
+ -- Macro: GSL_REAL (Z)
+ -- Macro: GSL_IMAG (Z)
+ These macros return the real and imaginary parts of the complex
+ number Z.
+
+ -- Macro: GSL_SET_COMPLEX (ZP, X, Y)
+ This macro uses the cartesian components (X,Y) to set the real and
+ imaginary parts of the complex number pointed to by ZP. For
+ example,
+
+ GSL_SET_COMPLEX(&z, 3, 4)
+
+ sets Z to be 3 + 4i.
+
+ -- Macro: GSL_SET_REAL (ZP,X)
+ -- Macro: GSL_SET_IMAG (ZP,Y)
+ These macros allow the real and imaginary parts of the complex
+ number pointed to by ZP to be set independently.
+
+
+File: gsl-ref.info, Node: Properties of complex numbers, Next: Complex arithmetic operators, Prev: Complex numbers, Up: Complex Numbers
+
+5.2 Properties of complex numbers
+=================================
+
+ -- Function: double gsl_complex_arg (gsl_complex Z)
+ This function returns the argument of the complex number Z,
+ \arg(z), where -\pi < \arg(z) <= \pi.
+
+ -- Function: double gsl_complex_abs (gsl_complex Z)
+ This function returns the magnitude of the complex number Z, |z|.
+
+ -- Function: double gsl_complex_abs2 (gsl_complex Z)
+ This function returns the squared magnitude of the complex number
+ Z, |z|^2.
+
+ -- Function: double gsl_complex_logabs (gsl_complex Z)
+ This function returns the natural logarithm of the magnitude of the
+ complex number Z, \log|z|. It allows an accurate evaluation of
+ \log|z| when |z| is close to one. The direct evaluation of
+ `log(gsl_complex_abs(z))' would lead to a loss of precision in
+ this case.
+
+
+File: gsl-ref.info, Node: Complex arithmetic operators, Next: Elementary Complex Functions, Prev: Properties of complex numbers, Up: Complex Numbers
+
+5.3 Complex arithmetic operators
+================================
+
+ -- Function: gsl_complex gsl_complex_add (gsl_complex A, gsl_complex B)
+ This function returns the sum of the complex numbers A and B,
+ z=a+b.
+
+ -- Function: gsl_complex gsl_complex_sub (gsl_complex A, gsl_complex B)
+ This function returns the difference of the complex numbers A and
+ B, z=a-b.
+
+ -- Function: gsl_complex gsl_complex_mul (gsl_complex A, gsl_complex B)
+ This function returns the product of the complex numbers A and B,
+ z=ab.
+
+ -- Function: gsl_complex gsl_complex_div (gsl_complex A, gsl_complex B)
+ This function returns the quotient of the complex numbers A and B,
+ z=a/b.
+
+ -- Function: gsl_complex gsl_complex_add_real (gsl_complex A, double X)
+ This function returns the sum of the complex number A and the real
+ number X, z=a+x.
+
+ -- Function: gsl_complex gsl_complex_sub_real (gsl_complex A, double X)
+ This function returns the difference of the complex number A and
+ the real number X, z=a-x.
+
+ -- Function: gsl_complex gsl_complex_mul_real (gsl_complex A, double X)
+ This function returns the product of the complex number A and the
+ real number X, z=ax.
+
+ -- Function: gsl_complex gsl_complex_div_real (gsl_complex A, double X)
+ This function returns the quotient of the complex number A and the
+ real number X, z=a/x.
+
+ -- Function: gsl_complex gsl_complex_add_imag (gsl_complex A, double Y)
+ This function returns the sum of the complex number A and the
+ imaginary number iY, z=a+iy.
+
+ -- Function: gsl_complex gsl_complex_sub_imag (gsl_complex A, double Y)
+ This function returns the difference of the complex number A and
+ the imaginary number iY, z=a-iy.
+
+ -- Function: gsl_complex gsl_complex_mul_imag (gsl_complex A, double Y)
+ This function returns the product of the complex number A and the
+ imaginary number iY, z=a*(iy).
+
+ -- Function: gsl_complex gsl_complex_div_imag (gsl_complex A, double Y)
+ This function returns the quotient of the complex number A and the
+ imaginary number iY, z=a/(iy).
+
+ -- Function: gsl_complex gsl_complex_conjugate (gsl_complex Z)
+ This function returns the complex conjugate of the complex number
+ Z, z^* = x - i y.
+
+ -- Function: gsl_complex gsl_complex_inverse (gsl_complex Z)
+ This function returns the inverse, or reciprocal, of the complex
+ number Z, 1/z = (x - i y)/(x^2 + y^2).
+
+ -- Function: gsl_complex gsl_complex_negative (gsl_complex Z)
+ This function returns the negative of the complex number Z, -z =
+ (-x) + i(-y).
+
+
+File: gsl-ref.info, Node: Elementary Complex Functions, Next: Complex Trigonometric Functions, Prev: Complex arithmetic operators, Up: Complex Numbers
+
+5.4 Elementary Complex Functions
+================================
+
+ -- Function: gsl_complex gsl_complex_sqrt (gsl_complex Z)
+ This function returns the square root of the complex number Z,
+ \sqrt z. The branch cut is the negative real axis. The result
+ always lies in the right half of the complex plane.
+
+ -- Function: gsl_complex gsl_complex_sqrt_real (double X)
+ This function returns the complex square root of the real number
+ X, where X may be negative.
+
+ -- Function: gsl_complex gsl_complex_pow (gsl_complex Z, gsl_complex A)
+ The function returns the complex number Z raised to the complex
+ power A, z^a. This is computed as \exp(\log(z)*a) using complex
+ logarithms and complex exponentials.
+
+ -- Function: gsl_complex gsl_complex_pow_real (gsl_complex Z, double X)
+ This function returns the complex number Z raised to the real
+ power X, z^x.
+
+ -- Function: gsl_complex gsl_complex_exp (gsl_complex Z)
+ This function returns the complex exponential of the complex number
+ Z, \exp(z).
+
+ -- Function: gsl_complex gsl_complex_log (gsl_complex Z)
+ This function returns the complex natural logarithm (base e) of
+ the complex number Z, \log(z). The branch cut is the negative
+ real axis.
+
+ -- Function: gsl_complex gsl_complex_log10 (gsl_complex Z)
+ This function returns the complex base-10 logarithm of the complex
+ number Z, \log_10 (z).
+
+ -- Function: gsl_complex gsl_complex_log_b (gsl_complex Z, gsl_complex
+ B)
+ This function returns the complex base-B logarithm of the complex
+ number Z, \log_b(z). This quantity is computed as the ratio
+ \log(z)/\log(b).
+
+
+File: gsl-ref.info, Node: Complex Trigonometric Functions, Next: Inverse Complex Trigonometric Functions, Prev: Elementary Complex Functions, Up: Complex Numbers
+
+5.5 Complex Trigonometric Functions
+===================================
+
+ -- Function: gsl_complex gsl_complex_sin (gsl_complex Z)
+ This function returns the complex sine of the complex number Z,
+ \sin(z) = (\exp(iz) - \exp(-iz))/(2i).
+
+ -- Function: gsl_complex gsl_complex_cos (gsl_complex Z)
+ This function returns the complex cosine of the complex number Z,
+ \cos(z) = (\exp(iz) + \exp(-iz))/2.
+
+ -- Function: gsl_complex gsl_complex_tan (gsl_complex Z)
+ This function returns the complex tangent of the complex number Z,
+ \tan(z) = \sin(z)/\cos(z).
+
+ -- Function: gsl_complex gsl_complex_sec (gsl_complex Z)
+ This function returns the complex secant of the complex number Z,
+ \sec(z) = 1/\cos(z).
+
+ -- Function: gsl_complex gsl_complex_csc (gsl_complex Z)
+ This function returns the complex cosecant of the complex number Z,
+ \csc(z) = 1/\sin(z).
+
+ -- Function: gsl_complex gsl_complex_cot (gsl_complex Z)
+ This function returns the complex cotangent of the complex number
+ Z, \cot(z) = 1/\tan(z).
+
+
+File: gsl-ref.info, Node: Inverse Complex Trigonometric Functions, Next: Complex Hyperbolic Functions, Prev: Complex Trigonometric Functions, Up: Complex Numbers
+
+5.6 Inverse Complex Trigonometric Functions
+===========================================
+
+ -- Function: gsl_complex gsl_complex_arcsin (gsl_complex Z)
+ This function returns the complex arcsine of the complex number Z,
+ \arcsin(z). The branch cuts are on the real axis, less than -1 and
+ greater than 1.
+
+ -- Function: gsl_complex gsl_complex_arcsin_real (double Z)
+ This function returns the complex arcsine of the real number Z,
+ \arcsin(z). For z between -1 and 1, the function returns a real
+ value in the range [-\pi/2,\pi/2]. For z less than -1 the result
+ has a real part of -\pi/2 and a positive imaginary part. For z
+ greater than 1 the result has a real part of \pi/2 and a negative
+ imaginary part.
+
+ -- Function: gsl_complex gsl_complex_arccos (gsl_complex Z)
+ This function returns the complex arccosine of the complex number
+ Z, \arccos(z). The branch cuts are on the real axis, less than -1
+ and greater than 1.
+
+ -- Function: gsl_complex gsl_complex_arccos_real (double Z)
+ This function returns the complex arccosine of the real number Z,
+ \arccos(z). For z between -1 and 1, the function returns a real
+ value in the range [0,\pi]. For z less than -1 the result has a
+ real part of \pi and a negative imaginary part. For z greater
+ than 1 the result is purely imaginary and positive.
+
+ -- Function: gsl_complex gsl_complex_arctan (gsl_complex Z)
+ This function returns the complex arctangent of the complex number
+ Z, \arctan(z). The branch cuts are on the imaginary axis, below -i
+ and above i.
+
+ -- Function: gsl_complex gsl_complex_arcsec (gsl_complex Z)
+ This function returns the complex arcsecant of the complex number
+ Z, \arcsec(z) = \arccos(1/z).
+
+ -- Function: gsl_complex gsl_complex_arcsec_real (double Z)
+ This function returns the complex arcsecant of the real number Z,
+ \arcsec(z) = \arccos(1/z).
+
+ -- Function: gsl_complex gsl_complex_arccsc (gsl_complex Z)
+ This function returns the complex arccosecant of the complex
+ number Z, \arccsc(z) = \arcsin(1/z).
+
+ -- Function: gsl_complex gsl_complex_arccsc_real (double Z)
+ This function returns the complex arccosecant of the real number Z,
+ \arccsc(z) = \arcsin(1/z).
+
+ -- Function: gsl_complex gsl_complex_arccot (gsl_complex Z)
+ This function returns the complex arccotangent of the complex
+ number Z, \arccot(z) = \arctan(1/z).
+
+
+File: gsl-ref.info, Node: Complex Hyperbolic Functions, Next: Inverse Complex Hyperbolic Functions, Prev: Inverse Complex Trigonometric Functions, Up: Complex Numbers
+
+5.7 Complex Hyperbolic Functions
+================================
+
+ -- Function: gsl_complex gsl_complex_sinh (gsl_complex Z)
+ This function returns the complex hyperbolic sine of the complex
+ number Z, \sinh(z) = (\exp(z) - \exp(-z))/2.
+
+ -- Function: gsl_complex gsl_complex_cosh (gsl_complex Z)
+ This function returns the complex hyperbolic cosine of the complex
+ number Z, \cosh(z) = (\exp(z) + \exp(-z))/2.
+
+ -- Function: gsl_complex gsl_complex_tanh (gsl_complex Z)
+ This function returns the complex hyperbolic tangent of the
+ complex number Z, \tanh(z) = \sinh(z)/\cosh(z).
+
+ -- Function: gsl_complex gsl_complex_sech (gsl_complex Z)
+ This function returns the complex hyperbolic secant of the complex
+ number Z, \sech(z) = 1/\cosh(z).
+
+ -- Function: gsl_complex gsl_complex_csch (gsl_complex Z)
+ This function returns the complex hyperbolic cosecant of the
+ complex number Z, \csch(z) = 1/\sinh(z).
+
+ -- Function: gsl_complex gsl_complex_coth (gsl_complex Z)
+ This function returns the complex hyperbolic cotangent of the
+ complex number Z, \coth(z) = 1/\tanh(z).
+
+
+File: gsl-ref.info, Node: Inverse Complex Hyperbolic Functions, Next: Complex Number References and Further Reading, Prev: Complex Hyperbolic Functions, Up: Complex Numbers
+
+5.8 Inverse Complex Hyperbolic Functions
+========================================
+
+ -- Function: gsl_complex gsl_complex_arcsinh (gsl_complex Z)
+ This function returns the complex hyperbolic arcsine of the
+ complex number Z, \arcsinh(z). The branch cuts are on the
+ imaginary axis, below -i and above i.
+
+ -- Function: gsl_complex gsl_complex_arccosh (gsl_complex Z)
+ This function returns the complex hyperbolic arccosine of the
+ complex number Z, \arccosh(z). The branch cut is on the real
+ axis, less than 1. Note that in this case we use the negative
+ square root in formula 4.6.21 of Abramowitz & Stegun giving
+ \arccosh(z)=\log(z-\sqrt{z^2-1}).
+
+ -- Function: gsl_complex gsl_complex_arccosh_real (double Z)
+ This function returns the complex hyperbolic arccosine of the real
+ number Z, \arccosh(z).
+
+ -- Function: gsl_complex gsl_complex_arctanh (gsl_complex Z)
+ This function returns the complex hyperbolic arctangent of the
+ complex number Z, \arctanh(z). The branch cuts are on the real
+ axis, less than -1 and greater than 1.
+
+ -- Function: gsl_complex gsl_complex_arctanh_real (double Z)
+ This function returns the complex hyperbolic arctangent of the real
+ number Z, \arctanh(z).
+
+ -- Function: gsl_complex gsl_complex_arcsech (gsl_complex Z)
+ This function returns the complex hyperbolic arcsecant of the
+ complex number Z, \arcsech(z) = \arccosh(1/z).
+
+ -- Function: gsl_complex gsl_complex_arccsch (gsl_complex Z)
+ This function returns the complex hyperbolic arccosecant of the
+ complex number Z, \arccsch(z) = \arcsin(1/z).
+
+ -- Function: gsl_complex gsl_complex_arccoth (gsl_complex Z)
+ This function returns the complex hyperbolic arccotangent of the
+ complex number Z, \arccoth(z) = \arctanh(1/z).
+
+
+File: gsl-ref.info, Node: Complex Number References and Further Reading, Prev: Inverse Complex Hyperbolic Functions, Up: Complex Numbers
+
+5.9 References and Further Reading
+==================================
+
+The implementations of the elementary and trigonometric functions are
+based on the following papers,
+
+ T. E. Hull, Thomas F. Fairgrieve, Ping Tak Peter Tang,
+ "Implementing Complex Elementary Functions Using Exception
+ Handling", `ACM Transactions on Mathematical Software', Volume 20
+ (1994), pp 215-244, Corrigenda, p553
+
+ T. E. Hull, Thomas F. Fairgrieve, Ping Tak Peter Tang,
+ "Implementing the complex arcsin and arccosine functions using
+ exception handling", `ACM Transactions on Mathematical Software',
+ Volume 23 (1997) pp 299-335
+
+The general formulas and details of branch cuts can be found in the
+following books,
+
+ Abramowitz and Stegun, `Handbook of Mathematical Functions',
+ "Circular Functions in Terms of Real and Imaginary Parts", Formulas
+ 4.3.55-58, "Inverse Circular Functions in Terms of Real and
+ Imaginary Parts", Formulas 4.4.37-39, "Hyperbolic Functions in
+ Terms of Real and Imaginary Parts", Formulas 4.5.49-52, "Inverse
+ Hyperbolic Functions--relation to Inverse Circular Functions",
+ Formulas 4.6.14-19.
+
+ Dave Gillespie, `Calc Manual', Free Software Foundation, ISBN
+ 1-882114-18-3
+
+
+File: gsl-ref.info, Node: Polynomials, Next: Special Functions, Prev: Complex Numbers, Up: Top
+
+6 Polynomials
+*************
+
+This chapter describes functions for evaluating and solving polynomials.
+There are routines for finding real and complex roots of quadratic and
+cubic equations using analytic methods. An iterative polynomial solver
+is also available for finding the roots of general polynomials with real
+coefficients (of any order). The functions are declared in the header
+file `gsl_poly.h'.
+
+* Menu:
+
+* Polynomial Evaluation::
+* Divided Difference Representation of Polynomials::
+* Quadratic Equations::
+* Cubic Equations::
+* General Polynomial Equations::
+* Roots of Polynomials Examples::
+* Roots of Polynomials References and Further Reading::
+
+
+File: gsl-ref.info, Node: Polynomial Evaluation, Next: Divided Difference Representation of Polynomials, Up: Polynomials
+
+6.1 Polynomial Evaluation
+=========================
+
+ -- Function: double gsl_poly_eval (const double C[], const int LEN,
+ const double X)
+ This function evaluates the polynomial c[0] + c[1] x + c[2] x^2 +
+ \dots + c[len-1] x^{len-1} using Horner's method for stability.
+ The function is inlined when possible.
+
+
+File: gsl-ref.info, Node: Divided Difference Representation of Polynomials, Next: Quadratic Equations, Prev: Polynomial Evaluation, Up: Polynomials
+
+6.2 Divided Difference Representation of Polynomials
+====================================================
+
+The functions described here manipulate polynomials stored in Newton's
+divided-difference representation. The use of divided-differences is
+described in Abramowitz & Stegun sections 25.1.4 and 25.2.26.
+
+ -- Function: int gsl_poly_dd_init (double DD[], const double XA[],
+ const double YA[], size_t SIZE)
+ This function computes a divided-difference representation of the
+ interpolating polynomial for the points (XA, YA) stored in the
+ arrays XA and YA of length SIZE. On output the
+ divided-differences of (XA,YA) are stored in the array DD, also of
+ length SIZE.
+
+ -- Function: double gsl_poly_dd_eval (const double DD[], const double
+ XA[], const size_t SIZE, const double X)
+ This function evaluates the polynomial stored in
+ divided-difference form in the arrays DD and XA of length SIZE at
+ the point X.
+
+ -- Function: int gsl_poly_dd_taylor (double C[], double XP, const
+ double DD[], const double XA[], size_t SIZE, double W[])
+ This function converts the divided-difference representation of a
+ polynomial to a Taylor expansion. The divided-difference
+ representation is supplied in the arrays DD and XA of length SIZE.
+ On output the Taylor coefficients of the polynomial expanded about
+ the point XP are stored in the array C also of length SIZE. A
+ workspace of length SIZE must be provided in the array W.
+
+
+File: gsl-ref.info, Node: Quadratic Equations, Next: Cubic Equations, Prev: Divided Difference Representation of Polynomials, Up: Polynomials
+
+6.3 Quadratic Equations
+=======================
+
+ -- Function: int gsl_poly_solve_quadratic (double A, double B, double
+ C, double * X0, double * X1)
+ This function finds the real roots of the quadratic equation,
+
+ a x^2 + b x + c = 0
+
+ The number of real roots (either zero, one or two) is returned, and
+ their locations are stored in X0 and X1. If no real roots are
+ found then X0 and X1 are not modified. If one real root is found
+ (i.e. if a=0) then it is stored in X0. When two real roots are
+ found they are stored in X0 and X1 in ascending order. The case
+ of coincident roots is not considered special. For example
+ (x-1)^2=0 will have two roots, which happen to have exactly equal
+ values.
+
+ The number of roots found depends on the sign of the discriminant
+ b^2 - 4 a c. This will be subject to rounding and cancellation
+ errors when computed in double precision, and will also be subject
+ to errors if the coefficients of the polynomial are inexact.
+ These errors may cause a discrete change in the number of roots.
+ However, for polynomials with small integer coefficients the
+ discriminant can always be computed exactly.
+
+
+ -- Function: int gsl_poly_complex_solve_quadratic (double A, double B,
+ double C, gsl_complex * Z0, gsl_complex * Z1)
+ This function finds the complex roots of the quadratic equation,
+
+ a z^2 + b z + c = 0
+
+ The number of complex roots is returned (either one or two) and the
+ locations of the roots are stored in Z0 and Z1. The roots are
+ returned in ascending order, sorted first by their real components
+ and then by their imaginary components. If only one real root is
+ found (i.e. if a=0) then it is stored in Z0.
+
+
+
+File: gsl-ref.info, Node: Cubic Equations, Next: General Polynomial Equations, Prev: Quadratic Equations, Up: Polynomials
+
+6.4 Cubic Equations
+===================
+
+ -- Function: int gsl_poly_solve_cubic (double A, double B, double C,
+ double * X0, double * X1, double * X2)
+ This function finds the real roots of the cubic equation,
+
+ x^3 + a x^2 + b x + c = 0
+
+ with a leading coefficient of unity. The number of real roots
+ (either one or three) is returned, and their locations are stored
+ in X0, X1 and X2. If one real root is found then only X0 is
+ modified. When three real roots are found they are stored in X0,
+ X1 and X2 in ascending order. The case of coincident roots is not
+ considered special. For example, the equation (x-1)^3=0 will have
+ three roots with exactly equal values.
+
+
+ -- Function: int gsl_poly_complex_solve_cubic (double A, double B,
+ double C, gsl_complex * Z0, gsl_complex * Z1, gsl_complex *
+ Z2)
+ This function finds the complex roots of the cubic equation,
+
+ z^3 + a z^2 + b z + c = 0
+
+ The number of complex roots is returned (always three) and the
+ locations of the roots are stored in Z0, Z1 and Z2. The roots are
+ returned in ascending order, sorted first by their real components
+ and then by their imaginary components.
+
+
+
+File: gsl-ref.info, Node: General Polynomial Equations, Next: Roots of Polynomials Examples, Prev: Cubic Equations, Up: Polynomials
+
+6.5 General Polynomial Equations
+================================
+
+The roots of polynomial equations cannot be found analytically beyond
+the special cases of the quadratic, cubic and quartic equation. The
+algorithm described in this section uses an iterative method to find the
+approximate locations of roots of higher order polynomials.
+
+ -- Function: gsl_poly_complex_workspace *
+gsl_poly_complex_workspace_alloc (size_t N)
+ This function allocates space for a `gsl_poly_complex_workspace'
+ struct and a workspace suitable for solving a polynomial with N
+ coefficients using the routine `gsl_poly_complex_solve'.
+
+ The function returns a pointer to the newly allocated
+ `gsl_poly_complex_workspace' if no errors were detected, and a null
+ pointer in the case of error.
+
+ -- Function: void gsl_poly_complex_workspace_free
+ (gsl_poly_complex_workspace * W)
+ This function frees all the memory associated with the workspace W.
+
+ -- Function: int gsl_poly_complex_solve (const double * A, size_t N,
+ gsl_poly_complex_workspace * W, gsl_complex_packed_ptr Z)
+ This function computes the roots of the general polynomial P(x) =
+ a_0 + a_1 x + a_2 x^2 + ... + a_{n-1} x^{n-1} using balanced-QR
+ reduction of the companion matrix. The parameter N specifies the
+ length of the coefficient array. The coefficient of the highest
+ order term must be non-zero. The function requires a workspace W
+ of the appropriate size. The n-1 roots are returned in the packed
+ complex array Z of length 2(n-1), alternating real and imaginary
+ parts.
+
+ The function returns `GSL_SUCCESS' if all the roots are found. If
+ the QR reduction does not converge, the error handler is invoked
+ with an error code of `GSL_EFAILED'. Note that due to finite
+ precision, roots of higher multiplicity are returned as a cluster
+ of simple roots with reduced accuracy. The solution of
+ polynomials with higher-order roots requires specialized
+ algorithms that take the multiplicity structure into account (see
+ e.g. Z. Zeng, Algorithm 835, ACM Transactions on Mathematical
+ Software, Volume 30, Issue 2 (2004), pp 218-236).
+
+
+File: gsl-ref.info, Node: Roots of Polynomials Examples, Next: Roots of Polynomials References and Further Reading, Prev: General Polynomial Equations, Up: Polynomials
+
+6.6 Examples
+============
+
+To demonstrate the use of the general polynomial solver we will take the
+polynomial P(x) = x^5 - 1 which has the following roots,
+
+ 1, e^{2\pi i /5}, e^{4\pi i /5}, e^{6\pi i /5}, e^{8\pi i /5}
+
+The following program will find these roots.
+
+ #include <stdio.h>
+ #include <gsl/gsl_poly.h>
+
+ int
+ main (void)
+ {
+ int i;
+ /* coefficients of P(x) = -1 + x^5 */
+ double a[6] = { -1, 0, 0, 0, 0, 1 };
+ double z[10];
+
+ gsl_poly_complex_workspace * w
+ = gsl_poly_complex_workspace_alloc (6);
+
+ gsl_poly_complex_solve (a, 6, w, z);
+
+ gsl_poly_complex_workspace_free (w);
+
+ for (i = 0; i < 5; i++)
+ {
+ printf ("z%d = %+.18f %+.18f\n",
+ i, z[2*i], z[2*i+1]);
+ }
+
+ return 0;
+ }
+
+The output of the program is,
+
+ $ ./a.out
+ z0 = -0.809016994374947451 +0.587785252292473137
+ z1 = -0.809016994374947451 -0.587785252292473137
+ z2 = +0.309016994374947451 +0.951056516295153642
+ z3 = +0.309016994374947451 -0.951056516295153642
+ z4 = +1.000000000000000000 +0.000000000000000000
+
+which agrees with the analytic result, z_n = \exp(2 \pi n i/5).
+
+
+File: gsl-ref.info, Node: Roots of Polynomials References and Further Reading, Prev: Roots of Polynomials Examples, Up: Polynomials
+
+6.7 References and Further Reading
+==================================
+
+The balanced-QR method and its error analysis are described in the
+following papers,
+
+ R.S. Martin, G. Peters and J.H. Wilkinson, "The QR Algorithm for
+ Real Hessenberg Matrices", `Numerische Mathematik', 14 (1970),
+ 219-231.
+
+ B.N. Parlett and C. Reinsch, "Balancing a Matrix for Calculation of
+ Eigenvalues and Eigenvectors", `Numerische Mathematik', 13 (1969),
+ 293-304.
+
+ A. Edelman and H. Murakami, "Polynomial roots from companion matrix
+ eigenvalues", `Mathematics of Computation', Vol. 64, No. 210
+ (1995), 763-776.
+
+The formulas for divided differences are given in Abramowitz and Stegun,
+
+ Abramowitz and Stegun, `Handbook of Mathematical Functions',
+ Sections 25.1.4 and 25.2.26.
+
+
+File: gsl-ref.info, Node: Special Functions, Next: Vectors and Matrices, Prev: Polynomials, Up: Top
+
+7 Special Functions
+*******************
+
+This chapter describes the GSL special function library. The library
+includes routines for calculating the values of Airy functions, Bessel
+functions, Clausen functions, Coulomb wave functions, Coupling
+coefficients, the Dawson function, Debye functions, Dilogarithms,
+Elliptic integrals, Jacobi elliptic functions, Error functions,
+Exponential integrals, Fermi-Dirac functions, Gamma functions,
+Gegenbauer functions, Hypergeometric functions, Laguerre functions,
+Legendre functions and Spherical Harmonics, the Psi (Digamma) Function,
+Synchrotron functions, Transport functions, Trigonometric functions and
+Zeta functions. Each routine also computes an estimate of the numerical
+error in the calculated value of the function.
+
+ The functions in this chapter are declared in individual header
+files, such as `gsl_sf_airy.h', `gsl_sf_bessel.h', etc. The complete
+set of header files can be included using the file `gsl_sf.h'.
+
+* Menu:
+
+* Special Function Usage::
+* The gsl_sf_result struct::
+* Special Function Modes::
+* Airy Functions and Derivatives::
+* Bessel Functions::
+* Clausen Functions::
+* Coulomb Functions::
+* Coupling Coefficients::
+* Dawson Function::
+* Debye Functions::
+* Dilogarithm::
+* Elementary Operations::
+* Elliptic Integrals::
+* Elliptic Functions (Jacobi)::
+* Error Functions::
+* Exponential Functions::
+* Exponential Integrals::
+* Fermi-Dirac Function::
+* Gamma and Beta Functions::
+* Gegenbauer Functions::
+* Hypergeometric Functions::
+* Laguerre Functions::
+* Lambert W Functions::
+* Legendre Functions and Spherical Harmonics::
+* Logarithm and Related Functions::
+* Mathieu Functions::
+* Power Function::
+* Psi (Digamma) Function::
+* Synchrotron Functions::
+* Transport Functions::
+* Trigonometric Functions::
+* Zeta Functions::
+* Special Functions Examples::
+* Special Functions References and Further Reading::
+
+
+File: gsl-ref.info, Node: Special Function Usage, Next: The gsl_sf_result struct, Up: Special Functions
+
+7.1 Usage
+=========
+
+The special functions are available in two calling conventions, a
+"natural form" which returns the numerical value of the function and an
+"error-handling form" which returns an error code. The two types of
+function provide alternative ways of accessing the same underlying code.
+
+ The "natural form" returns only the value of the function and can be
+used directly in mathematical expressions. For example, the following
+function call will compute the value of the Bessel function J_0(x),
+
+ double y = gsl_sf_bessel_J0 (x);
+
+There is no way to access an error code or to estimate the error using
+this method. To allow access to this information the alternative
+error-handling form stores the value and error in a modifiable argument,
+
+ gsl_sf_result result;
+ int status = gsl_sf_bessel_J0_e (x, &result);
+
+The error-handling functions have the suffix `_e'. The returned status
+value indicates error conditions such as overflow, underflow or loss of
+precision. If there are no errors the error-handling functions return
+`GSL_SUCCESS'.
+
+
+File: gsl-ref.info, Node: The gsl_sf_result struct, Next: Special Function Modes, Prev: Special Function Usage, Up: Special Functions
+
+7.2 The gsl_sf_result struct
+============================
+
+The error handling form of the special functions always calculate an
+error estimate along with the value of the result. Therefore,
+structures are provided for amalgamating a value and error estimate.
+These structures are declared in the header file `gsl_sf_result.h'.
+
+ The `gsl_sf_result' struct contains value and error fields.
+
+ typedef struct
+ {
+ double val;
+ double err;
+ } gsl_sf_result;
+
+The field VAL contains the value and the field ERR contains an estimate
+of the absolute error in the value.
+
+ In some cases, an overflow or underflow can be detected and handled
+by a function. In this case, it may be possible to return a scaling
+exponent as well as an error/value pair in order to save the result from
+exceeding the dynamic range of the built-in types. The
+`gsl_sf_result_e10' struct contains value and error fields as well as
+an exponent field such that the actual result is obtained as `result *
+10^(e10)'.
+
+ typedef struct
+ {
+ double val;
+ double err;
+ int e10;
+ } gsl_sf_result_e10;
+
+
+File: gsl-ref.info, Node: Special Function Modes, Next: Airy Functions and Derivatives, Prev: The gsl_sf_result struct, Up: Special Functions
+
+7.3 Modes
+=========
+
+The goal of the library is to achieve double precision accuracy wherever
+possible. However the cost of evaluating some special functions to
+double precision can be significant, particularly where very high order
+terms are required. In these cases a `mode' argument allows the
+accuracy of the function to be reduced in order to improve performance.
+The following precision levels are available for the mode argument,
+
+`GSL_PREC_DOUBLE'
+ Double-precision, a relative accuracy of approximately 2 * 10^-16.
+
+`GSL_PREC_SINGLE'
+ Single-precision, a relative accuracy of approximately 10^-7.
+
+`GSL_PREC_APPROX'
+ Approximate values, a relative accuracy of approximately 5 * 10^-4.
+
+The approximate mode provides the fastest evaluation at the lowest
+accuracy.
+
+
+File: gsl-ref.info, Node: Airy Functions and Derivatives, Next: Bessel Functions, Prev: Special Function Modes, Up: Special Functions
+
+7.4 Airy Functions and Derivatives
+==================================
+
+The Airy functions Ai(x) and Bi(x) are defined by the integral
+representations,
+
+ Ai(x) = (1/\pi) \int_0^\infty \cos((1/3) t^3 + xt) dt
+ Bi(x) = (1/\pi) \int_0^\infty (e^(-(1/3) t^3) + \sin((1/3) t^3 + xt)) dt
+
+For further information see Abramowitz & Stegun, Section 10.4. The Airy
+functions are defined in the header file `gsl_sf_airy.h'.
+
+* Menu:
+
+* Airy Functions::
+* Derivatives of Airy Functions::
+* Zeros of Airy Functions::
+* Zeros of Derivatives of Airy Functions::
+
+
+File: gsl-ref.info, Node: Airy Functions, Next: Derivatives of Airy Functions, Up: Airy Functions and Derivatives
+
+7.4.1 Airy Functions
+--------------------
+
+ -- Function: double gsl_sf_airy_Ai (double X, gsl_mode_t MODE)
+ -- Function: int gsl_sf_airy_Ai_e (double X, gsl_mode_t MODE,
+ gsl_sf_result * RESULT)
+ These routines compute the Airy function Ai(x) with an accuracy
+ specified by MODE.
+
+ -- Function: double gsl_sf_airy_Bi (double X, gsl_mode_t MODE)
+ -- Function: int gsl_sf_airy_Bi_e (double X, gsl_mode_t MODE,
+ gsl_sf_result * RESULT)
+ These routines compute the Airy function Bi(x) with an accuracy
+ specified by MODE.
+
+ -- Function: double gsl_sf_airy_Ai_scaled (double X, gsl_mode_t MODE)
+ -- Function: int gsl_sf_airy_Ai_scaled_e (double X, gsl_mode_t MODE,
+ gsl_sf_result * RESULT)
+ These routines compute a scaled version of the Airy function
+ S_A(x) Ai(x). For x>0 the scaling factor S_A(x) is \exp(+(2/3)
+ x^(3/2)), and is 1 for x<0.
+
+ -- Function: double gsl_sf_airy_Bi_scaled (double X, gsl_mode_t MODE)
+ -- Function: int gsl_sf_airy_Bi_scaled_e (double X, gsl_mode_t MODE,
+ gsl_sf_result * RESULT)
+ These routines compute a scaled version of the Airy function
+ S_B(x) Bi(x). For x>0 the scaling factor S_B(x) is exp(-(2/3)
+ x^(3/2)), and is 1 for x<0.
+
+
+File: gsl-ref.info, Node: Derivatives of Airy Functions, Next: Zeros of Airy Functions, Prev: Airy Functions, Up: Airy Functions and Derivatives
+
+7.4.2 Derivatives of Airy Functions
+-----------------------------------
+
+ -- Function: double gsl_sf_airy_Ai_deriv (double X, gsl_mode_t MODE)
+ -- Function: int gsl_sf_airy_Ai_deriv_e (double X, gsl_mode_t MODE,
+ gsl_sf_result * RESULT)
+ These routines compute the Airy function derivative Ai'(x) with an
+ accuracy specified by MODE.
+
+ -- Function: double gsl_sf_airy_Bi_deriv (double X, gsl_mode_t MODE)
+ -- Function: int gsl_sf_airy_Bi_deriv_e (double X, gsl_mode_t MODE,
+ gsl_sf_result * RESULT)
+ These routines compute the Airy function derivative Bi'(x) with an
+ accuracy specified by MODE.
+
+ -- Function: double gsl_sf_airy_Ai_deriv_scaled (double X, gsl_mode_t
+ MODE)
+ -- Function: int gsl_sf_airy_Ai_deriv_scaled_e (double X, gsl_mode_t
+ MODE, gsl_sf_result * RESULT)
+ These routines compute the scaled Airy function derivative S_A(x)
+ Ai'(x). For x>0 the scaling factor S_A(x) is \exp(+(2/3)
+ x^(3/2)), and is 1 for x<0.
+
+ -- Function: double gsl_sf_airy_Bi_deriv_scaled (double X, gsl_mode_t
+ MODE)
+ -- Function: int gsl_sf_airy_Bi_deriv_scaled_e (double X, gsl_mode_t
+ MODE, gsl_sf_result * RESULT)
+ These routines compute the scaled Airy function derivative S_B(x)
+ Bi'(x). For x>0 the scaling factor S_B(x) is exp(-(2/3) x^(3/2)),
+ and is 1 for x<0.
+
+
+File: gsl-ref.info, Node: Zeros of Airy Functions, Next: Zeros of Derivatives of Airy Functions, Prev: Derivatives of Airy Functions, Up: Airy Functions and Derivatives
+
+7.4.3 Zeros of Airy Functions
+-----------------------------
+
+ -- Function: double gsl_sf_airy_zero_Ai (unsigned int S)
+ -- Function: int gsl_sf_airy_zero_Ai_e (unsigned int S, gsl_sf_result
+ * RESULT)
+ These routines compute the location of the S-th zero of the Airy
+ function Ai(x).
+
+ -- Function: double gsl_sf_airy_zero_Bi (unsigned int S)
+ -- Function: int gsl_sf_airy_zero_Bi_e (unsigned int S, gsl_sf_result
+ * RESULT)
+ These routines compute the location of the S-th zero of the Airy
+ function Bi(x).
+
+
+File: gsl-ref.info, Node: Zeros of Derivatives of Airy Functions, Prev: Zeros of Airy Functions, Up: Airy Functions and Derivatives
+
+7.4.4 Zeros of Derivatives of Airy Functions
+--------------------------------------------
+
+ -- Function: double gsl_sf_airy_zero_Ai_deriv (unsigned int S)
+ -- Function: int gsl_sf_airy_zero_Ai_deriv_e (unsigned int S,
+ gsl_sf_result * RESULT)
+ These routines compute the location of the S-th zero of the Airy
+ function derivative Ai'(x).
+
+ -- Function: double gsl_sf_airy_zero_Bi_deriv (unsigned int S)
+ -- Function: int gsl_sf_airy_zero_Bi_deriv_e (unsigned int S,
+ gsl_sf_result * RESULT)
+ These routines compute the location of the S-th zero of the Airy
+ function derivative Bi'(x).
+
+
+File: gsl-ref.info, Node: Bessel Functions, Next: Clausen Functions, Prev: Airy Functions and Derivatives, Up: Special Functions
+
+7.5 Bessel Functions
+====================
+
+The routines described in this section compute the Cylindrical Bessel
+functions J_n(x), Y_n(x), Modified cylindrical Bessel functions I_n(x),
+K_n(x), Spherical Bessel functions j_l(x), y_l(x), and Modified
+Spherical Bessel functions i_l(x), k_l(x). For more information see
+Abramowitz & Stegun, Chapters 9 and 10. The Bessel functions are
+defined in the header file `gsl_sf_bessel.h'.
+
+* Menu:
+
+* Regular Cylindrical Bessel Functions::
+* Irregular Cylindrical Bessel Functions::
+* Regular Modified Cylindrical Bessel Functions::
+* Irregular Modified Cylindrical Bessel Functions::
+* Regular Spherical Bessel Functions::
+* Irregular Spherical Bessel Functions::
+* Regular Modified Spherical Bessel Functions::
+* Irregular Modified Spherical Bessel Functions::
+* Regular Bessel Function - Fractional Order::
+* Irregular Bessel Functions - Fractional Order::
+* Regular Modified Bessel Functions - Fractional Order::
+* Irregular Modified Bessel Functions - Fractional Order::
+* Zeros of Regular Bessel Functions::
+
+
+File: gsl-ref.info, Node: Regular Cylindrical Bessel Functions, Next: Irregular Cylindrical Bessel Functions, Up: Bessel Functions
+
+7.5.1 Regular Cylindrical Bessel Functions
+------------------------------------------
+
+ -- Function: double gsl_sf_bessel_J0 (double X)
+ -- Function: int gsl_sf_bessel_J0_e (double X, gsl_sf_result * RESULT)
+ These routines compute the regular cylindrical Bessel function of
+ zeroth order, J_0(x).
+
+ -- Function: double gsl_sf_bessel_J1 (double X)
+ -- Function: int gsl_sf_bessel_J1_e (double X, gsl_sf_result * RESULT)
+ These routines compute the regular cylindrical Bessel function of
+ first order, J_1(x).
+
+ -- Function: double gsl_sf_bessel_Jn (int N, double X)
+ -- Function: int gsl_sf_bessel_Jn_e (int N, double X, gsl_sf_result *
+ RESULT)
+ These routines compute the regular cylindrical Bessel function of
+ order N, J_n(x).
+
+ -- Function: int gsl_sf_bessel_Jn_array (int NMIN, int NMAX, double X,
+ double RESULT_ARRAY[])
+ This routine computes the values of the regular cylindrical Bessel
+ functions J_n(x) for n from NMIN to NMAX inclusive, storing the
+ results in the array RESULT_ARRAY. The values are computed using
+ recurrence relations for efficiency, and therefore may differ
+ slightly from the exact values.
+
+
+File: gsl-ref.info, Node: Irregular Cylindrical Bessel Functions, Next: Regular Modified Cylindrical Bessel Functions, Prev: Regular Cylindrical Bessel Functions, Up: Bessel Functions
+
+7.5.2 Irregular Cylindrical Bessel Functions
+--------------------------------------------
+
+ -- Function: double gsl_sf_bessel_Y0 (double X)
+ -- Function: int gsl_sf_bessel_Y0_e (double X, gsl_sf_result * RESULT)
+ These routines compute the irregular cylindrical Bessel function
+ of zeroth order, Y_0(x), for x>0.
+
+ -- Function: double gsl_sf_bessel_Y1 (double X)
+ -- Function: int gsl_sf_bessel_Y1_e (double X, gsl_sf_result * RESULT)
+ These routines compute the irregular cylindrical Bessel function
+ of first order, Y_1(x), for x>0.
+
+ -- Function: double gsl_sf_bessel_Yn (int N,double X)
+ -- Function: int gsl_sf_bessel_Yn_e (int N,double X, gsl_sf_result *
+ RESULT)
+ These routines compute the irregular cylindrical Bessel function of
+ order N, Y_n(x), for x>0.
+
+ -- Function: int gsl_sf_bessel_Yn_array (int NMIN, int NMAX, double X,
+ double RESULT_ARRAY[])
+ This routine computes the values of the irregular cylindrical
+ Bessel functions Y_n(x) for n from NMIN to NMAX inclusive, storing
+ the results in the array RESULT_ARRAY. The domain of the function
+ is x>0. The values are computed using recurrence relations for
+ efficiency, and therefore may differ slightly from the exact
+ values.
+
+
+File: gsl-ref.info, Node: Regular Modified Cylindrical Bessel Functions, Next: Irregular Modified Cylindrical Bessel Functions, Prev: Irregular Cylindrical Bessel Functions, Up: Bessel Functions
+
+7.5.3 Regular Modified Cylindrical Bessel Functions
+---------------------------------------------------
+
+ -- Function: double gsl_sf_bessel_I0 (double X)
+ -- Function: int gsl_sf_bessel_I0_e (double X, gsl_sf_result * RESULT)
+ These routines compute the regular modified cylindrical Bessel
+ function of zeroth order, I_0(x).
+
+ -- Function: double gsl_sf_bessel_I1 (double X)
+ -- Function: int gsl_sf_bessel_I1_e (double X, gsl_sf_result * RESULT)
+ These routines compute the regular modified cylindrical Bessel
+ function of first order, I_1(x).
+
+ -- Function: double gsl_sf_bessel_In (int N, double X)
+ -- Function: int gsl_sf_bessel_In_e (int N, double X, gsl_sf_result *
+ RESULT)
+ These routines compute the regular modified cylindrical Bessel
+ function of order N, I_n(x).
+
+ -- Function: int gsl_sf_bessel_In_array (int NMIN, int NMAX, double X,
+ double RESULT_ARRAY[])
+ This routine computes the values of the regular modified
+ cylindrical Bessel functions I_n(x) for n from NMIN to NMAX
+ inclusive, storing the results in the array RESULT_ARRAY. The
+ start of the range NMIN must be positive or zero. The values are
+ computed using recurrence relations for efficiency, and therefore
+ may differ slightly from the exact values.
+
+ -- Function: double gsl_sf_bessel_I0_scaled (double X)
+ -- Function: int gsl_sf_bessel_I0_scaled_e (double X, gsl_sf_result *
+ RESULT)
+ These routines compute the scaled regular modified cylindrical
+ Bessel function of zeroth order \exp(-|x|) I_0(x).
+
+ -- Function: double gsl_sf_bessel_I1_scaled (double X)
+ -- Function: int gsl_sf_bessel_I1_scaled_e (double X, gsl_sf_result *
+ RESULT)
+ These routines compute the scaled regular modified cylindrical
+ Bessel function of first order \exp(-|x|) I_1(x).
+
+ -- Function: double gsl_sf_bessel_In_scaled (int N, double X)
+ -- Function: int gsl_sf_bessel_In_scaled_e (int N, double X,
+ gsl_sf_result * RESULT)
+ These routines compute the scaled regular modified cylindrical
+ Bessel function of order N, \exp(-|x|) I_n(x)
+
+ -- Function: int gsl_sf_bessel_In_scaled_array (int NMIN, int NMAX,
+ double X, double RESULT_ARRAY[])
+ This routine computes the values of the scaled regular cylindrical
+ Bessel functions \exp(-|x|) I_n(x) for n from NMIN to NMAX
+ inclusive, storing the results in the array RESULT_ARRAY. The
+ start of the range NMIN must be positive or zero. The values are
+ computed using recurrence relations for efficiency, and therefore
+ may differ slightly from the exact values.
+
+
+File: gsl-ref.info, Node: Irregular Modified Cylindrical Bessel Functions, Next: Regular Spherical Bessel Functions, Prev: Regular Modified Cylindrical Bessel Functions, Up: Bessel Functions
+
+7.5.4 Irregular Modified Cylindrical Bessel Functions
+-----------------------------------------------------
+
+ -- Function: double gsl_sf_bessel_K0 (double X)
+ -- Function: int gsl_sf_bessel_K0_e (double X, gsl_sf_result * RESULT)
+ These routines compute the irregular modified cylindrical Bessel
+ function of zeroth order, K_0(x), for x > 0.
+
+ -- Function: double gsl_sf_bessel_K1 (double X)
+ -- Function: int gsl_sf_bessel_K1_e (double X, gsl_sf_result * RESULT)
+ These routines compute the irregular modified cylindrical Bessel
+ function of first order, K_1(x), for x > 0.
+
+ -- Function: double gsl_sf_bessel_Kn (int N, double X)
+ -- Function: int gsl_sf_bessel_Kn_e (int N, double X, gsl_sf_result *
+ RESULT)
+ These routines compute the irregular modified cylindrical Bessel
+ function of order N, K_n(x), for x > 0.
+
+ -- Function: int gsl_sf_bessel_Kn_array (int NMIN, int NMAX, double X,
+ double RESULT_ARRAY[])
+ This routine computes the values of the irregular modified
+ cylindrical Bessel functions K_n(x) for n from NMIN to NMAX
+ inclusive, storing the results in the array RESULT_ARRAY. The
+ start of the range NMIN must be positive or zero. The domain of
+ the function is x>0. The values are computed using recurrence
+ relations for efficiency, and therefore may differ slightly from
+ the exact values.
+
+ -- Function: double gsl_sf_bessel_K0_scaled (double X)
+ -- Function: int gsl_sf_bessel_K0_scaled_e (double X, gsl_sf_result *
+ RESULT)
+ These routines compute the scaled irregular modified cylindrical
+ Bessel function of zeroth order \exp(x) K_0(x) for x>0.
+
+ -- Function: double gsl_sf_bessel_K1_scaled (double X)
+ -- Function: int gsl_sf_bessel_K1_scaled_e (double X, gsl_sf_result *
+ RESULT)
+ These routines compute the scaled irregular modified cylindrical
+ Bessel function of first order \exp(x) K_1(x) for x>0.
+
+ -- Function: double gsl_sf_bessel_Kn_scaled (int N, double X)
+ -- Function: int gsl_sf_bessel_Kn_scaled_e (int N, double X,
+ gsl_sf_result * RESULT)
+ These routines compute the scaled irregular modified cylindrical
+ Bessel function of order N, \exp(x) K_n(x), for x>0.
+
+ -- Function: int gsl_sf_bessel_Kn_scaled_array (int NMIN, int NMAX,
+ double X, double RESULT_ARRAY[])
+ This routine computes the values of the scaled irregular
+ cylindrical Bessel functions \exp(x) K_n(x) for n from NMIN to
+ NMAX inclusive, storing the results in the array RESULT_ARRAY. The
+ start of the range NMIN must be positive or zero. The domain of
+ the function is x>0. The values are computed using recurrence
+ relations for efficiency, and therefore may differ slightly from
+ the exact values.
+
+
+File: gsl-ref.info, Node: Regular Spherical Bessel Functions, Next: Irregular Spherical Bessel Functions, Prev: Irregular Modified Cylindrical Bessel Functions, Up: Bessel Functions
+
+7.5.5 Regular Spherical Bessel Functions
+----------------------------------------
+
+ -- Function: double gsl_sf_bessel_j0 (double X)
+ -- Function: int gsl_sf_bessel_j0_e (double X, gsl_sf_result * RESULT)
+ These routines compute the regular spherical Bessel function of
+ zeroth order, j_0(x) = \sin(x)/x.
+
+ -- Function: double gsl_sf_bessel_j1 (double X)
+ -- Function: int gsl_sf_bessel_j1_e (double X, gsl_sf_result * RESULT)
+ These routines compute the regular spherical Bessel function of
+ first order, j_1(x) = (\sin(x)/x - \cos(x))/x.
+
+ -- Function: double gsl_sf_bessel_j2 (double X)
+ -- Function: int gsl_sf_bessel_j2_e (double X, gsl_sf_result * RESULT)
+ These routines compute the regular spherical Bessel function of
+ second order, j_2(x) = ((3/x^2 - 1)\sin(x) - 3\cos(x)/x)/x.
+
+ -- Function: double gsl_sf_bessel_jl (int L, double X)
+ -- Function: int gsl_sf_bessel_jl_e (int L, double X, gsl_sf_result *
+ RESULT)
+ These routines compute the regular spherical Bessel function of
+ order L, j_l(x), for l >= 0 and x >= 0.
+
+ -- Function: int gsl_sf_bessel_jl_array (int LMAX, double X, double
+ RESULT_ARRAY[])
+ This routine computes the values of the regular spherical Bessel
+ functions j_l(x) for l from 0 to LMAX inclusive for lmax >= 0 and
+ x >= 0, storing the results in the array RESULT_ARRAY. The values
+ are computed using recurrence relations for efficiency, and
+ therefore may differ slightly from the exact values.
+
+ -- Function: int gsl_sf_bessel_jl_steed_array (int LMAX, double X,
+ double * JL_X_ARRAY)
+ This routine uses Steed's method to compute the values of the
+ regular spherical Bessel functions j_l(x) for l from 0 to LMAX
+ inclusive for lmax >= 0 and x >= 0, storing the results in the
+ array RESULT_ARRAY. The Steed/Barnett algorithm is described in
+ `Comp. Phys. Comm.' 21, 297 (1981). Steed's method is more stable
+ than the recurrence used in the other functions but is also slower.
+
+
+File: gsl-ref.info, Node: Irregular Spherical Bessel Functions, Next: Regular Modified Spherical Bessel Functions, Prev: Regular Spherical Bessel Functions, Up: Bessel Functions
+
+7.5.6 Irregular Spherical Bessel Functions
+------------------------------------------
+
+ -- Function: double gsl_sf_bessel_y0 (double X)
+ -- Function: int gsl_sf_bessel_y0_e (double X, gsl_sf_result * RESULT)
+ These routines compute the irregular spherical Bessel function of
+ zeroth order, y_0(x) = -\cos(x)/x.
+
+ -- Function: double gsl_sf_bessel_y1 (double X)
+ -- Function: int gsl_sf_bessel_y1_e (double X, gsl_sf_result * RESULT)
+ These routines compute the irregular spherical Bessel function of
+ first order, y_1(x) = -(\cos(x)/x + \sin(x))/x.
+
+ -- Function: double gsl_sf_bessel_y2 (double X)
+ -- Function: int gsl_sf_bessel_y2_e (double X, gsl_sf_result * RESULT)
+ These routines compute the irregular spherical Bessel function of
+ second order, y_2(x) = (-3/x^3 + 1/x)\cos(x) - (3/x^2)\sin(x).
+
+ -- Function: double gsl_sf_bessel_yl (int L, double X)
+ -- Function: int gsl_sf_bessel_yl_e (int L, double X, gsl_sf_result *
+ RESULT)
+ These routines compute the irregular spherical Bessel function of
+ order L, y_l(x), for l >= 0.
+
+ -- Function: int gsl_sf_bessel_yl_array (int LMAX, double X, double
+ RESULT_ARRAY[])
+ This routine computes the values of the irregular spherical Bessel
+ functions y_l(x) for l from 0 to LMAX inclusive for lmax >= 0,
+ storing the results in the array RESULT_ARRAY. The values are
+ computed using recurrence relations for efficiency, and therefore
+ may differ slightly from the exact values.
+
+
+File: gsl-ref.info, Node: Regular Modified Spherical Bessel Functions, Next: Irregular Modified Spherical Bessel Functions, Prev: Irregular Spherical Bessel Functions, Up: Bessel Functions
+
+7.5.7 Regular Modified Spherical Bessel Functions
+-------------------------------------------------
+
+The regular modified spherical Bessel functions i_l(x) are related to
+the modified Bessel functions of fractional order, i_l(x) =
+\sqrt{\pi/(2x)} I_{l+1/2}(x)
+
+ -- Function: double gsl_sf_bessel_i0_scaled (double X)
+ -- Function: int gsl_sf_bessel_i0_scaled_e (double X, gsl_sf_result *
+ RESULT)
+ These routines compute the scaled regular modified spherical Bessel
+ function of zeroth order, \exp(-|x|) i_0(x).
+
+ -- Function: double gsl_sf_bessel_i1_scaled (double X)
+ -- Function: int gsl_sf_bessel_i1_scaled_e (double X, gsl_sf_result *
+ RESULT)
+ These routines compute the scaled regular modified spherical Bessel
+ function of first order, \exp(-|x|) i_1(x).
+
+ -- Function: double gsl_sf_bessel_i2_scaled (double X)
+ -- Function: int gsl_sf_bessel_i2_scaled_e (double X, gsl_sf_result *
+ RESULT)
+ These routines compute the scaled regular modified spherical Bessel
+ function of second order, \exp(-|x|) i_2(x)
+
+ -- Function: double gsl_sf_bessel_il_scaled (int L, double X)
+ -- Function: int gsl_sf_bessel_il_scaled_e (int L, double X,
+ gsl_sf_result * RESULT)
+ These routines compute the scaled regular modified spherical Bessel
+ function of order L, \exp(-|x|) i_l(x)
+
+ -- Function: int gsl_sf_bessel_il_scaled_array (int LMAX, double X,
+ double RESULT_ARRAY[])
+ This routine computes the values of the scaled regular modified
+ cylindrical Bessel functions \exp(-|x|) i_l(x) for l from 0 to
+ LMAX inclusive for lmax >= 0, storing the results in the array
+ RESULT_ARRAY. The values are computed using recurrence relations
+ for efficiency, and therefore may differ slightly from the exact
+ values.
+
+
+File: gsl-ref.info, Node: Irregular Modified Spherical Bessel Functions, Next: Regular Bessel Function - Fractional Order, Prev: Regular Modified Spherical Bessel Functions, Up: Bessel Functions
+
+7.5.8 Irregular Modified Spherical Bessel Functions
+---------------------------------------------------
+
+The irregular modified spherical Bessel functions k_l(x) are related to
+the irregular modified Bessel functions of fractional order, k_l(x) =
+\sqrt{\pi/(2x)} K_{l+1/2}(x).
+
+ -- Function: double gsl_sf_bessel_k0_scaled (double X)
+ -- Function: int gsl_sf_bessel_k0_scaled_e (double X, gsl_sf_result *
+ RESULT)
+ These routines compute the scaled irregular modified spherical
+ Bessel function of zeroth order, \exp(x) k_0(x), for x>0.
+
+ -- Function: double gsl_sf_bessel_k1_scaled (double X)
+ -- Function: int gsl_sf_bessel_k1_scaled_e (double X, gsl_sf_result *
+ RESULT)
+ These routines compute the scaled irregular modified spherical
+ Bessel function of first order, \exp(x) k_1(x), for x>0.
+
+ -- Function: double gsl_sf_bessel_k2_scaled (double X)
+ -- Function: int gsl_sf_bessel_k2_scaled_e (double X, gsl_sf_result *
+ RESULT)
+ These routines compute the scaled irregular modified spherical
+ Bessel function of second order, \exp(x) k_2(x), for x>0.
+
+ -- Function: double gsl_sf_bessel_kl_scaled (int L, double X)
+ -- Function: int gsl_sf_bessel_kl_scaled_e (int L, double X,
+ gsl_sf_result * RESULT)
+ These routines compute the scaled irregular modified spherical
+ Bessel function of order L, \exp(x) k_l(x), for x>0.
+
+ -- Function: int gsl_sf_bessel_kl_scaled_array (int LMAX, double X,
+ double RESULT_ARRAY[])
+ This routine computes the values of the scaled irregular modified
+ spherical Bessel functions \exp(x) k_l(x) for l from 0 to LMAX
+ inclusive for lmax >= 0 and x>0, storing the results in the array
+ RESULT_ARRAY. The values are computed using recurrence relations
+ for efficiency, and therefore may differ slightly from the exact
+ values.
+
+
+File: gsl-ref.info, Node: Regular Bessel Function - Fractional Order, Next: Irregular Bessel Functions - Fractional Order, Prev: Irregular Modified Spherical Bessel Functions, Up: Bessel Functions
+
+7.5.9 Regular Bessel Function--Fractional Order
+-----------------------------------------------
+
+ -- Function: double gsl_sf_bessel_Jnu (double NU, double X)
+ -- Function: int gsl_sf_bessel_Jnu_e (double NU, double X,
+ gsl_sf_result * RESULT)
+ These routines compute the regular cylindrical Bessel function of
+ fractional order \nu, J_\nu(x).
+
+ -- Function: int gsl_sf_bessel_sequence_Jnu_e (double NU, gsl_mode_t
+ MODE, size_t SIZE, double V[])
+ This function computes the regular cylindrical Bessel function of
+ fractional order \nu, J_\nu(x), evaluated at a series of x values.
+ The array V of length SIZE contains the x values. They are
+ assumed to be strictly ordered and positive. The array is
+ over-written with the values of J_\nu(x_i).
+
+
+File: gsl-ref.info, Node: Irregular Bessel Functions - Fractional Order, Next: Regular Modified Bessel Functions - Fractional Order, Prev: Regular Bessel Function - Fractional Order, Up: Bessel Functions
+
+7.5.10 Irregular Bessel Functions--Fractional Order
+---------------------------------------------------
+
+ -- Function: double gsl_sf_bessel_Ynu (double NU, double X)
+ -- Function: int gsl_sf_bessel_Ynu_e (double NU, double X,
+ gsl_sf_result * RESULT)
+ These routines compute the irregular cylindrical Bessel function of
+ fractional order \nu, Y_\nu(x).
+
+
+File: gsl-ref.info, Node: Regular Modified Bessel Functions - Fractional Order, Next: Irregular Modified Bessel Functions - Fractional Order, Prev: Irregular Bessel Functions - Fractional Order, Up: Bessel Functions
+
+7.5.11 Regular Modified Bessel Functions--Fractional Order
+----------------------------------------------------------
+
+ -- Function: double gsl_sf_bessel_Inu (double NU, double X)
+ -- Function: int gsl_sf_bessel_Inu_e (double NU, double X,
+ gsl_sf_result * RESULT)
+ These routines compute the regular modified Bessel function of
+ fractional order \nu, I_\nu(x) for x>0, \nu>0.
+
+ -- Function: double gsl_sf_bessel_Inu_scaled (double NU, double X)
+ -- Function: int gsl_sf_bessel_Inu_scaled_e (double NU, double X,
+ gsl_sf_result * RESULT)
+ These routines compute the scaled regular modified Bessel function
+ of fractional order \nu, \exp(-|x|)I_\nu(x) for x>0, \nu>0.
+
+
+File: gsl-ref.info, Node: Irregular Modified Bessel Functions - Fractional Order, Next: Zeros of Regular Bessel Functions, Prev: Regular Modified Bessel Functions - Fractional Order, Up: Bessel Functions
+
+7.5.12 Irregular Modified Bessel Functions--Fractional Order
+------------------------------------------------------------
+
+ -- Function: double gsl_sf_bessel_Knu (double NU, double X)
+ -- Function: int gsl_sf_bessel_Knu_e (double NU, double X,
+ gsl_sf_result * RESULT)
+ These routines compute the irregular modified Bessel function of
+ fractional order \nu, K_\nu(x) for x>0, \nu>0.
+
+ -- Function: double gsl_sf_bessel_lnKnu (double NU, double X)
+ -- Function: int gsl_sf_bessel_lnKnu_e (double NU, double X,
+ gsl_sf_result * RESULT)
+ These routines compute the logarithm of the irregular modified
+ Bessel function of fractional order \nu, \ln(K_\nu(x)) for x>0,
+ \nu>0.
+
+ -- Function: double gsl_sf_bessel_Knu_scaled (double NU, double X)
+ -- Function: int gsl_sf_bessel_Knu_scaled_e (double NU, double X,
+ gsl_sf_result * RESULT)
+ These routines compute the scaled irregular modified Bessel
+ function of fractional order \nu, \exp(+|x|) K_\nu(x) for x>0,
+ \nu>0.
+
+
+File: gsl-ref.info, Node: Zeros of Regular Bessel Functions, Prev: Irregular Modified Bessel Functions - Fractional Order, Up: Bessel Functions
+
+7.5.13 Zeros of Regular Bessel Functions
+----------------------------------------
+
+ -- Function: double gsl_sf_bessel_zero_J0 (unsigned int S)
+ -- Function: int gsl_sf_bessel_zero_J0_e (unsigned int S,
+ gsl_sf_result * RESULT)
+ These routines compute the location of the S-th positive zero of
+ the Bessel function J_0(x).
+
+ -- Function: double gsl_sf_bessel_zero_J1 (unsigned int S)
+ -- Function: int gsl_sf_bessel_zero_J1_e (unsigned int S,
+ gsl_sf_result * RESULT)
+ These routines compute the location of the S-th positive zero of
+ the Bessel function J_1(x).
+
+ -- Function: double gsl_sf_bessel_zero_Jnu (double NU, unsigned int S)
+ -- Function: int gsl_sf_bessel_zero_Jnu_e (double NU, unsigned int S,
+ gsl_sf_result * RESULT)
+ These routines compute the location of the S-th positive zero of
+ the Bessel function J_\nu(x). The current implementation does not
+ support negative values of NU.
+
+
+File: gsl-ref.info, Node: Clausen Functions, Next: Coulomb Functions, Prev: Bessel Functions, Up: Special Functions
+
+7.6 Clausen Functions
+=====================
+
+The Clausen function is defined by the following integral,
+
+ Cl_2(x) = - \int_0^x dt \log(2 \sin(t/2))
+
+It is related to the dilogarithm by Cl_2(\theta) = \Im
+Li_2(\exp(i\theta)). The Clausen functions are declared in the header
+file `gsl_sf_clausen.h'.
+
+ -- Function: double gsl_sf_clausen (double X)
+ -- Function: int gsl_sf_clausen_e (double X, gsl_sf_result * RESULT)
+ These routines compute the Clausen integral Cl_2(x).
+
+
+File: gsl-ref.info, Node: Coulomb Functions, Next: Coupling Coefficients, Prev: Clausen Functions, Up: Special Functions
+
+7.7 Coulomb Functions
+=====================
+
+The prototypes of the Coulomb functions are declared in the header file
+`gsl_sf_coulomb.h'. Both bound state and scattering solutions are
+available.
+
+* Menu:
+
+* Normalized Hydrogenic Bound States::
+* Coulomb Wave Functions::
+* Coulomb Wave Function Normalization Constant::
+
+
+File: gsl-ref.info, Node: Normalized Hydrogenic Bound States, Next: Coulomb Wave Functions, Up: Coulomb Functions
+
+7.7.1 Normalized Hydrogenic Bound States
+----------------------------------------
+
+ -- Function: double gsl_sf_hydrogenicR_1 (double Z, double R)
+ -- Function: int gsl_sf_hydrogenicR_1_e (double Z, double R,
+ gsl_sf_result * RESULT)
+ These routines compute the lowest-order normalized hydrogenic bound
+ state radial wavefunction R_1 := 2Z \sqrt{Z} \exp(-Z r).
+
+ -- Function: double gsl_sf_hydrogenicR (int N, int L, double Z, double
+ R)
+ -- Function: int gsl_sf_hydrogenicR_e (int N, int L, double Z, double
+ R, gsl_sf_result * RESULT)
+ These routines compute the N-th normalized hydrogenic bound state
+ radial wavefunction,
+
+ R_n := 2 (Z^{3/2}/n^2) \sqrt{(n-l-1)!/(n+l)!} \exp(-Z r/n) (2Zr/n)^l
+ L^{2l+1}_{n-l-1}(2Zr/n).
+
+ where L^a_b(x) is the generalized Laguerre polynomial (*note
+ Laguerre Functions::). The normalization is chosen such that the
+ wavefunction \psi is given by \psi(n,l,r) = R_n Y_{lm}.
+
+
+File: gsl-ref.info, Node: Coulomb Wave Functions, Next: Coulomb Wave Function Normalization Constant, Prev: Normalized Hydrogenic Bound States, Up: Coulomb Functions
+
+7.7.2 Coulomb Wave Functions
+----------------------------
+
+The Coulomb wave functions F_L(\eta,x), G_L(\eta,x) are described in
+Abramowitz & Stegun, Chapter 14. Because there can be a large dynamic
+range of values for these functions, overflows are handled gracefully.
+If an overflow occurs, `GSL_EOVRFLW' is signalled and exponent(s) are
+returned through the modifiable parameters EXP_F, EXP_G. The full
+solution can be reconstructed from the following relations,
+
+ F_L(eta,x) = fc[k_L] * exp(exp_F)
+ G_L(eta,x) = gc[k_L] * exp(exp_G)
+
+ F_L'(eta,x) = fcp[k_L] * exp(exp_F)
+ G_L'(eta,x) = gcp[k_L] * exp(exp_G)
+
+
+ -- Function: int gsl_sf_coulomb_wave_FG_e (double ETA, double X,
+ double L_F, int K, gsl_sf_result * F, gsl_sf_result * FP,
+ gsl_sf_result * G, gsl_sf_result * GP, double * EXP_F, double
+ * EXP_G)
+ This function computes the Coulomb wave functions F_L(\eta,x),
+ G_{L-k}(\eta,x) and their derivatives F'_L(\eta,x),
+ G'_{L-k}(\eta,x) with respect to x. The parameters are restricted
+ to L, L-k > -1/2, x > 0 and integer k. Note that L itself is not
+ restricted to being an integer. The results are stored in the
+ parameters F, G for the function values and FP, GP for the
+ derivative values. If an overflow occurs, `GSL_EOVRFLW' is
+ returned and scaling exponents are stored in the modifiable
+ parameters EXP_F, EXP_G.
+
+ -- Function: int gsl_sf_coulomb_wave_F_array (double L_MIN, int KMAX,
+ double ETA, double X, double FC_ARRAY[], double * F_EXPONENT)
+ This function computes the Coulomb wave function F_L(\eta,x) for L
+ = Lmin \dots Lmin + kmax, storing the results in FC_ARRAY. In the
+ case of overflow the exponent is stored in F_EXPONENT.
+
+ -- Function: int gsl_sf_coulomb_wave_FG_array (double L_MIN, int KMAX,
+ double ETA, double X, double FC_ARRAY[], double GC_ARRAY[],
+ double * F_EXPONENT, double * G_EXPONENT)
+ This function computes the functions F_L(\eta,x), G_L(\eta,x) for
+ L = Lmin \dots Lmin + kmax storing the results in FC_ARRAY and
+ GC_ARRAY. In the case of overflow the exponents are stored in
+ F_EXPONENT and G_EXPONENT.
+
+ -- Function: int gsl_sf_coulomb_wave_FGp_array (double L_MIN, int
+ KMAX, double ETA, double X, double FC_ARRAY[], double
+ FCP_ARRAY[], double GC_ARRAY[], double GCP_ARRAY[], double *
+ F_EXPONENT, double * G_EXPONENT)
+ This function computes the functions F_L(\eta,x), G_L(\eta,x) and
+ their derivatives F'_L(\eta,x), G'_L(\eta,x) for L = Lmin \dots
+ Lmin + kmax storing the results in FC_ARRAY, GC_ARRAY, FCP_ARRAY
+ and GCP_ARRAY. In the case of overflow the exponents are stored
+ in F_EXPONENT and G_EXPONENT.
+
+ -- Function: int gsl_sf_coulomb_wave_sphF_array (double L_MIN, int
+ KMAX, double ETA, double X, double FC_ARRAY[], double
+ F_EXPONENT[])
+ This function computes the Coulomb wave function divided by the
+ argument F_L(\eta, x)/x for L = Lmin \dots Lmin + kmax, storing the
+ results in FC_ARRAY. In the case of overflow the exponent is
+ stored in F_EXPONENT. This function reduces to spherical Bessel
+ functions in the limit \eta \to 0.
+
+
+File: gsl-ref.info, Node: Coulomb Wave Function Normalization Constant, Prev: Coulomb Wave Functions, Up: Coulomb Functions
+
+7.7.3 Coulomb Wave Function Normalization Constant
+--------------------------------------------------
+
+The Coulomb wave function normalization constant is defined in
+Abramowitz 14.1.7.
+
+ -- Function: int gsl_sf_coulomb_CL_e (double L, double ETA,
+ gsl_sf_result * RESULT)
+ This function computes the Coulomb wave function normalization
+ constant C_L(\eta) for L > -1.
+
+ -- Function: int gsl_sf_coulomb_CL_array (double LMIN, int KMAX,
+ double ETA, double CL[])
+ This function computes the Coulomb wave function normalization
+ constant C_L(\eta) for L = Lmin \dots Lmin + kmax, Lmin > -1.
+
+
+File: gsl-ref.info, Node: Coupling Coefficients, Next: Dawson Function, Prev: Coulomb Functions, Up: Special Functions
+
+7.8 Coupling Coefficients
+=========================
+
+The Wigner 3-j, 6-j and 9-j symbols give the coupling coefficients for
+combined angular momentum vectors. Since the arguments of the standard
+coupling coefficient functions are integer or half-integer, the
+arguments of the following functions are, by convention, integers equal
+to twice the actual spin value. For information on the 3-j coefficients
+see Abramowitz & Stegun, Section 27.9. The functions described in this
+section are declared in the header file `gsl_sf_coupling.h'.
+
+* Menu:
+
+* 3-j Symbols::
+* 6-j Symbols::
+* 9-j Symbols::
+
+
+File: gsl-ref.info, Node: 3-j Symbols, Next: 6-j Symbols, Up: Coupling Coefficients
+
+7.8.1 3-j Symbols
+-----------------
+
+ -- Function: double gsl_sf_coupling_3j (int TWO_JA, int TWO_JB, int
+ TWO_JC, int TWO_MA, int TWO_MB, int TWO_MC)
+ -- Function: int gsl_sf_coupling_3j_e (int TWO_JA, int TWO_JB, int
+ TWO_JC, int TWO_MA, int TWO_MB, int TWO_MC, gsl_sf_result *
+ RESULT)
+ These routines compute the Wigner 3-j coefficient,
+
+ (ja jb jc
+ ma mb mc)
+
+ where the arguments are given in half-integer units, ja =
+ TWO_JA/2, ma = TWO_MA/2, etc.
+
+
+File: gsl-ref.info, Node: 6-j Symbols, Next: 9-j Symbols, Prev: 3-j Symbols, Up: Coupling Coefficients
+
+7.8.2 6-j Symbols
+-----------------
+
+ -- Function: double gsl_sf_coupling_6j (int TWO_JA, int TWO_JB, int
+ TWO_JC, int TWO_JD, int TWO_JE, int TWO_JF)
+ -- Function: int gsl_sf_coupling_6j_e (int TWO_JA, int TWO_JB, int
+ TWO_JC, int TWO_JD, int TWO_JE, int TWO_JF, gsl_sf_result *
+ RESULT)
+ These routines compute the Wigner 6-j coefficient,
+
+ {ja jb jc
+ jd je jf}
+
+ where the arguments are given in half-integer units, ja =
+ TWO_JA/2, ma = TWO_MA/2, etc.
+
+
+File: gsl-ref.info, Node: 9-j Symbols, Prev: 6-j Symbols, Up: Coupling Coefficients
+
+7.8.3 9-j Symbols
+-----------------
+
+ -- Function: double gsl_sf_coupling_9j (int TWO_JA, int TWO_JB, int
+ TWO_JC, int TWO_JD, int TWO_JE, int TWO_JF, int TWO_JG, int
+ TWO_JH, int TWO_JI)
+ -- Function: int gsl_sf_coupling_9j_e (int TWO_JA, int TWO_JB, int
+ TWO_JC, int TWO_JD, int TWO_JE, int TWO_JF, int TWO_JG, int
+ TWO_JH, int TWO_JI, gsl_sf_result * RESULT)
+ These routines compute the Wigner 9-j coefficient,
+
+ {ja jb jc
+ jd je jf
+ jg jh ji}
+
+ where the arguments are given in half-integer units, ja =
+ TWO_JA/2, ma = TWO_MA/2, etc.
+
+
+File: gsl-ref.info, Node: Dawson Function, Next: Debye Functions, Prev: Coupling Coefficients, Up: Special Functions
+
+7.9 Dawson Function
+===================
+
+The Dawson integral is defined by \exp(-x^2) \int_0^x dt \exp(t^2). A
+table of Dawson's integral can be found in Abramowitz & Stegun, Table
+7.5. The Dawson functions are declared in the header file
+`gsl_sf_dawson.h'.
+
+ -- Function: double gsl_sf_dawson (double X)
+ -- Function: int gsl_sf_dawson_e (double X, gsl_sf_result * RESULT)
+ These routines compute the value of Dawson's integral for X.
+
+
+File: gsl-ref.info, Node: Debye Functions, Next: Dilogarithm, Prev: Dawson Function, Up: Special Functions
+
+7.10 Debye Functions
+====================
+
+The Debye functions D_n(x) are defined by the following integral,
+
+ D_n(x) = n/x^n \int_0^x dt (t^n/(e^t - 1))
+
+For further information see Abramowitz & Stegun, Section 27.1. The
+Debye functions are declared in the header file `gsl_sf_debye.h'.
+
+ -- Function: double gsl_sf_debye_1 (double X)
+ -- Function: int gsl_sf_debye_1_e (double X, gsl_sf_result * RESULT)
+ These routines compute the first-order Debye function D_1(x) =
+ (1/x) \int_0^x dt (t/(e^t - 1)).
+
+ -- Function: double gsl_sf_debye_2 (double X)
+ -- Function: int gsl_sf_debye_2_e (double X, gsl_sf_result * RESULT)
+ These routines compute the second-order Debye function D_2(x) =
+ (2/x^2) \int_0^x dt (t^2/(e^t - 1)).
+
+ -- Function: double gsl_sf_debye_3 (double X)
+ -- Function: int gsl_sf_debye_3_e (double X, gsl_sf_result * RESULT)
+ These routines compute the third-order Debye function D_3(x) =
+ (3/x^3) \int_0^x dt (t^3/(e^t - 1)).
+
+ -- Function: double gsl_sf_debye_4 (double X)
+ -- Function: int gsl_sf_debye_4_e (double X, gsl_sf_result * RESULT)
+ These routines compute the fourth-order Debye function D_4(x) =
+ (4/x^4) \int_0^x dt (t^4/(e^t - 1)).
+
+ -- Function: double gsl_sf_debye_5 (double X)
+ -- Function: int gsl_sf_debye_5_e (double X, gsl_sf_result * RESULT)
+ These routines compute the fifth-order Debye function D_5(x) =
+ (5/x^5) \int_0^x dt (t^5/(e^t - 1)).
+
+ -- Function: double gsl_sf_debye_6 (double X)
+ -- Function: int gsl_sf_debye_6_e (double X, gsl_sf_result * RESULT)
+ These routines compute the sixth-order Debye function D_6(x) =
+ (6/x^6) \int_0^x dt (t^6/(e^t - 1)).
+
+
+File: gsl-ref.info, Node: Dilogarithm, Next: Elementary Operations, Prev: Debye Functions, Up: Special Functions
+
+7.11 Dilogarithm
+================
+
+The functions described in this section are declared in the header file
+`gsl_sf_dilog.h'.
+
+* Menu:
+
+* Real Argument::
+* Complex Argument::
+
+
+File: gsl-ref.info, Node: Real Argument, Next: Complex Argument, Up: Dilogarithm
+
+7.11.1 Real Argument
+--------------------
+
+ -- Function: double gsl_sf_dilog (double X)
+ -- Function: int gsl_sf_dilog_e (double X, gsl_sf_result * RESULT)
+ These routines compute the dilogarithm for a real argument. In
+ Lewin's notation this is Li_2(x), the real part of the dilogarithm
+ of a real x. It is defined by the integral representation Li_2(x)
+ = - \Re \int_0^x ds \log(1-s) / s. Note that \Im(Li_2(x)) = 0 for
+ x <= 1, and -\pi\log(x) for x > 1.
+
+
+
+File: gsl-ref.info, Node: Complex Argument, Prev: Real Argument, Up: Dilogarithm
+
+7.11.2 Complex Argument
+-----------------------
+
+ -- Function: int gsl_sf_complex_dilog_e (double R, double THETA,
+ gsl_sf_result * RESULT_RE, gsl_sf_result * RESULT_IM)
+ This function computes the full complex-valued dilogarithm for the
+ complex argument z = r \exp(i \theta). The real and imaginary
+ parts of the result are returned in RESULT_RE, RESULT_IM.
+
+
+File: gsl-ref.info, Node: Elementary Operations, Next: Elliptic Integrals, Prev: Dilogarithm, Up: Special Functions
+
+7.12 Elementary Operations
+==========================
+
+The following functions allow for the propagation of errors when
+combining quantities by multiplication. The functions are declared in
+the header file `gsl_sf_elementary.h'.
+
+ -- Function: int gsl_sf_multiply_e (double X, double Y, gsl_sf_result
+ * RESULT)
+ This function multiplies X and Y storing the product and its
+ associated error in RESULT.
+
+ -- Function: int gsl_sf_multiply_err_e (double X, double DX, double Y,
+ double DY, gsl_sf_result * RESULT)
+ This function multiplies X and Y with associated absolute errors
+ DX and DY. The product xy +/- xy \sqrt((dx/x)^2 +(dy/y)^2) is
+ stored in RESULT.
+
+
+File: gsl-ref.info, Node: Elliptic Integrals, Next: Elliptic Functions (Jacobi), Prev: Elementary Operations, Up: Special Functions
+
+7.13 Elliptic Integrals
+=======================
+
+The functions described in this section are declared in the header file
+`gsl_sf_ellint.h'. Further information about the elliptic integrals
+can be found in Abramowitz & Stegun, Chapter 17.
+
+* Menu:
+
+* Definition of Legendre Forms::
+* Definition of Carlson Forms::
+* Legendre Form of Complete Elliptic Integrals::
+* Legendre Form of Incomplete Elliptic Integrals::
+* Carlson Forms::
+
+
+File: gsl-ref.info, Node: Definition of Legendre Forms, Next: Definition of Carlson Forms, Up: Elliptic Integrals
+
+7.13.1 Definition of Legendre Forms
+-----------------------------------
+
+The Legendre forms of elliptic integrals F(\phi,k), E(\phi,k) and
+\Pi(\phi,k,n) are defined by,
+
+ F(\phi,k) = \int_0^\phi dt 1/\sqrt((1 - k^2 \sin^2(t)))
+
+ E(\phi,k) = \int_0^\phi dt \sqrt((1 - k^2 \sin^2(t)))
+
+ Pi(\phi,k,n) = \int_0^\phi dt 1/((1 + n \sin^2(t))\sqrt(1 - k^2 \sin^2(t)))
+
+The complete Legendre forms are denoted by K(k) = F(\pi/2, k) and E(k)
+= E(\pi/2, k).
+
+ The notation used here is based on Carlson, `Numerische Mathematik'
+33 (1979) 1 and differs slightly from that used by Abramowitz & Stegun,
+where the functions are given in terms of the parameter m = k^2 and n
+is replaced by -n.
+
+
+File: gsl-ref.info, Node: Definition of Carlson Forms, Next: Legendre Form of Complete Elliptic Integrals, Prev: Definition of Legendre Forms, Up: Elliptic Integrals
+
+7.13.2 Definition of Carlson Forms
+----------------------------------
+
+The Carlson symmetric forms of elliptical integrals RC(x,y), RD(x,y,z),
+RF(x,y,z) and RJ(x,y,z,p) are defined by,
+
+ RC(x,y) = 1/2 \int_0^\infty dt (t+x)^(-1/2) (t+y)^(-1)
+
+ RD(x,y,z) = 3/2 \int_0^\infty dt (t+x)^(-1/2) (t+y)^(-1/2) (t+z)^(-3/2)
+
+ RF(x,y,z) = 1/2 \int_0^\infty dt (t+x)^(-1/2) (t+y)^(-1/2) (t+z)^(-1/2)
+
+ RJ(x,y,z,p) = 3/2 \int_0^\infty dt
+ (t+x)^(-1/2) (t+y)^(-1/2) (t+z)^(-1/2) (t+p)^(-1)
+
+
+File: gsl-ref.info, Node: Legendre Form of Complete Elliptic Integrals, Next: Legendre Form of Incomplete Elliptic Integrals, Prev: Definition of Carlson Forms, Up: Elliptic Integrals
+
+7.13.3 Legendre Form of Complete Elliptic Integrals
+---------------------------------------------------
+
+ -- Function: double gsl_sf_ellint_Kcomp (double K, gsl_mode_t MODE)
+ -- Function: int gsl_sf_ellint_Kcomp_e (double K, gsl_mode_t MODE,
+ gsl_sf_result * RESULT)
+ These routines compute the complete elliptic integral K(k) to the
+ accuracy specified by the mode variable MODE. Note that
+ Abramowitz & Stegun define this function in terms of the parameter
+ m = k^2.
+
+ -- Function: double gsl_sf_ellint_Ecomp (double K, gsl_mode_t MODE)
+ -- Function: int gsl_sf_ellint_Ecomp_e (double K, gsl_mode_t MODE,
+ gsl_sf_result * RESULT)
+ These routines compute the complete elliptic integral E(k) to the
+ accuracy specified by the mode variable MODE. Note that
+ Abramowitz & Stegun define this function in terms of the parameter
+ m = k^2.
+
+ -- Function: double gsl_sf_ellint_Pcomp (double K, double N,
+ gsl_mode_t MODE)
+ -- Function: int gsl_sf_ellint_Pcomp_e (double K, double N, gsl_mode_t
+ MODE, gsl_sf_result * RESULT)
+ These routines compute the complete elliptic integral \Pi(k,n) to
+ the accuracy specified by the mode variable MODE. Note that
+ Abramowitz & Stegun define this function in terms of the
+ parameters m = k^2 and \sin^2(\alpha) = k^2, with the change of
+ sign n \to -n.
+
+
+File: gsl-ref.info, Node: Legendre Form of Incomplete Elliptic Integrals, Next: Carlson Forms, Prev: Legendre Form of Complete Elliptic Integrals, Up: Elliptic Integrals
+
+7.13.4 Legendre Form of Incomplete Elliptic Integrals
+-----------------------------------------------------
+
+ -- Function: double gsl_sf_ellint_F (double PHI, double K, gsl_mode_t
+ MODE)
+ -- Function: int gsl_sf_ellint_F_e (double PHI, double K, gsl_mode_t
+ MODE, gsl_sf_result * RESULT)
+ These routines compute the incomplete elliptic integral F(\phi,k)
+ to the accuracy specified by the mode variable MODE. Note that
+ Abramowitz & Stegun define this function in terms of the parameter
+ m = k^2.
+
+ -- Function: double gsl_sf_ellint_E (double PHI, double K, gsl_mode_t
+ MODE)
+ -- Function: int gsl_sf_ellint_E_e (double PHI, double K, gsl_mode_t
+ MODE, gsl_sf_result * RESULT)
+ These routines compute the incomplete elliptic integral E(\phi,k)
+ to the accuracy specified by the mode variable MODE. Note that
+ Abramowitz & Stegun define this function in terms of the parameter
+ m = k^2.
+
+ -- Function: double gsl_sf_ellint_P (double PHI, double K, double N,
+ gsl_mode_t MODE)
+ -- Function: int gsl_sf_ellint_P_e (double PHI, double K, double N,
+ gsl_mode_t MODE, gsl_sf_result * RESULT)
+ These routines compute the incomplete elliptic integral
+ \Pi(\phi,k,n) to the accuracy specified by the mode variable MODE.
+ Note that Abramowitz & Stegun define this function in terms of the
+ parameters m = k^2 and \sin^2(\alpha) = k^2, with the change of
+ sign n \to -n.
+
+ -- Function: double gsl_sf_ellint_D (double PHI, double K, double N,
+ gsl_mode_t MODE)
+ -- Function: int gsl_sf_ellint_D_e (double PHI, double K, double N,
+ gsl_mode_t MODE, gsl_sf_result * RESULT)
+ These functions compute the incomplete elliptic integral D(\phi,k)
+ which is defined through the Carlson form RD(x,y,z) by the
+ following relation,
+
+ D(\phi,k,n) = (1/3)(\sin(\phi))^3 RD (1-\sin^2(\phi), 1-k^2 \sin^2(\phi), 1).
+ The argument N is not used and will be removed in a future release.
+
+
+
+File: gsl-ref.info, Node: Carlson Forms, Prev: Legendre Form of Incomplete Elliptic Integrals, Up: Elliptic Integrals
+
+7.13.5 Carlson Forms
+--------------------
+
+ -- Function: double gsl_sf_ellint_RC (double X, double Y, gsl_mode_t
+ MODE)
+ -- Function: int gsl_sf_ellint_RC_e (double X, double Y, gsl_mode_t
+ MODE, gsl_sf_result * RESULT)
+ These routines compute the incomplete elliptic integral RC(x,y) to
+ the accuracy specified by the mode variable MODE.
+
+ -- Function: double gsl_sf_ellint_RD (double X, double Y, double Z,
+ gsl_mode_t MODE)
+ -- Function: int gsl_sf_ellint_RD_e (double X, double Y, double Z,
+ gsl_mode_t MODE, gsl_sf_result * RESULT)
+ These routines compute the incomplete elliptic integral RD(x,y,z)
+ to the accuracy specified by the mode variable MODE.
+
+ -- Function: double gsl_sf_ellint_RF (double X, double Y, double Z,
+ gsl_mode_t MODE)
+ -- Function: int gsl_sf_ellint_RF_e (double X, double Y, double Z,
+ gsl_mode_t MODE, gsl_sf_result * RESULT)
+ These routines compute the incomplete elliptic integral RF(x,y,z)
+ to the accuracy specified by the mode variable MODE.
+
+ -- Function: double gsl_sf_ellint_RJ (double X, double Y, double Z,
+ double P, gsl_mode_t MODE)
+ -- Function: int gsl_sf_ellint_RJ_e (double X, double Y, double Z,
+ double P, gsl_mode_t MODE, gsl_sf_result * RESULT)
+ These routines compute the incomplete elliptic integral RJ(x,y,z,p)
+ to the accuracy specified by the mode variable MODE.
+
+
+File: gsl-ref.info, Node: Elliptic Functions (Jacobi), Next: Error Functions, Prev: Elliptic Integrals, Up: Special Functions
+
+7.14 Elliptic Functions (Jacobi)
+================================
+
+The Jacobian Elliptic functions are defined in Abramowitz & Stegun,
+Chapter 16. The functions are declared in the header file
+`gsl_sf_elljac.h'.
+
+ -- Function: int gsl_sf_elljac_e (double U, double M, double * SN,
+ double * CN, double * DN)
+ This function computes the Jacobian elliptic functions sn(u|m),
+ cn(u|m), dn(u|m) by descending Landen transformations.
+
+
+File: gsl-ref.info, Node: Error Functions, Next: Exponential Functions, Prev: Elliptic Functions (Jacobi), Up: Special Functions
+
+7.15 Error Functions
+====================
+
+The error function is described in Abramowitz & Stegun, Chapter 7. The
+functions in this section are declared in the header file
+`gsl_sf_erf.h'.
+
+* Menu:
+
+* Error Function::
+* Complementary Error Function::
+* Log Complementary Error Function::
+* Probability functions::
+
+
+File: gsl-ref.info, Node: Error Function, Next: Complementary Error Function, Up: Error Functions
+
+7.15.1 Error Function
+---------------------
+
+ -- Function: double gsl_sf_erf (double X)
+ -- Function: int gsl_sf_erf_e (double X, gsl_sf_result * RESULT)
+ These routines compute the error function erf(x), where erf(x) =
+ (2/\sqrt(\pi)) \int_0^x dt \exp(-t^2).
+
+
+File: gsl-ref.info, Node: Complementary Error Function, Next: Log Complementary Error Function, Prev: Error Function, Up: Error Functions
+
+7.15.2 Complementary Error Function
+-----------------------------------
+
+ -- Function: double gsl_sf_erfc (double X)
+ -- Function: int gsl_sf_erfc_e (double X, gsl_sf_result * RESULT)
+ These routines compute the complementary error function erfc(x) =
+ 1 - erf(x) = (2/\sqrt(\pi)) \int_x^\infty \exp(-t^2).
+
+
+File: gsl-ref.info, Node: Log Complementary Error Function, Next: Probability functions, Prev: Complementary Error Function, Up: Error Functions
+
+7.15.3 Log Complementary Error Function
+---------------------------------------
+
+ -- Function: double gsl_sf_log_erfc (double X)
+ -- Function: int gsl_sf_log_erfc_e (double X, gsl_sf_result * RESULT)
+ These routines compute the logarithm of the complementary error
+ function \log(\erfc(x)).
+
+
+File: gsl-ref.info, Node: Probability functions, Prev: Log Complementary Error Function, Up: Error Functions
+
+7.15.4 Probability functions
+----------------------------
+
+The probability functions for the Normal or Gaussian distribution are
+described in Abramowitz & Stegun, Section 26.2.
+
+ -- Function: double gsl_sf_erf_Z (double X)
+ -- Function: int gsl_sf_erf_Z_e (double X, gsl_sf_result * RESULT)
+ These routines compute the Gaussian probability density function
+ Z(x) = (1/\sqrt{2\pi}) \exp(-x^2/2).
+
+ -- Function: double gsl_sf_erf_Q (double X)
+ -- Function: int gsl_sf_erf_Q_e (double X, gsl_sf_result * RESULT)
+ These routines compute the upper tail of the Gaussian probability
+ function Q(x) = (1/\sqrt{2\pi}) \int_x^\infty dt \exp(-t^2/2).
+
+ The "hazard function" for the normal distribution, also known as the
+inverse Mill's ratio, is defined as,
+
+ h(x) = Z(x)/Q(x) = \sqrt{2/\pi} \exp(-x^2 / 2) / \erfc(x/\sqrt 2)
+
+It decreases rapidly as x approaches -\infty and asymptotes to h(x)
+\sim x as x approaches +\infty.
+
+ -- Function: double gsl_sf_hazard (double X)
+ -- Function: int gsl_sf_hazard_e (double X, gsl_sf_result * RESULT)
+ These routines compute the hazard function for the normal
+ distribution.
+
+
+File: gsl-ref.info, Node: Exponential Functions, Next: Exponential Integrals, Prev: Error Functions, Up: Special Functions
+
+7.16 Exponential Functions
+==========================
+
+The functions described in this section are declared in the header file
+`gsl_sf_exp.h'.
+
+* Menu:
+
+* Exponential Function::
+* Relative Exponential Functions::
+* Exponentiation With Error Estimate::
+
+
+File: gsl-ref.info, Node: Exponential Function, Next: Relative Exponential Functions, Up: Exponential Functions
+
+7.16.1 Exponential Function
+---------------------------
+
+ -- Function: double gsl_sf_exp (double X)
+ -- Function: int gsl_sf_exp_e (double X, gsl_sf_result * RESULT)
+ These routines provide an exponential function \exp(x) using GSL
+ semantics and error checking.
+
+ -- Function: int gsl_sf_exp_e10_e (double X, gsl_sf_result_e10 *
+ RESULT)
+ This function computes the exponential \exp(x) using the
+ `gsl_sf_result_e10' type to return a result with extended range.
+ This function may be useful if the value of \exp(x) would overflow
+ the numeric range of `double'.
+
+ -- Function: double gsl_sf_exp_mult (double X, double Y)
+ -- Function: int gsl_sf_exp_mult_e (double X, double Y, gsl_sf_result
+ * RESULT)
+ These routines exponentiate X and multiply by the factor Y to
+ return the product y \exp(x).
+
+ -- Function: int gsl_sf_exp_mult_e10_e (const double X, const double
+ Y, gsl_sf_result_e10 * RESULT)
+ This function computes the product y \exp(x) using the
+ `gsl_sf_result_e10' type to return a result with extended numeric
+ range.
+
+
+File: gsl-ref.info, Node: Relative Exponential Functions, Next: Exponentiation With Error Estimate, Prev: Exponential Function, Up: Exponential Functions
+
+7.16.2 Relative Exponential Functions
+-------------------------------------
+
+ -- Function: double gsl_sf_expm1 (double X)
+ -- Function: int gsl_sf_expm1_e (double X, gsl_sf_result * RESULT)
+ These routines compute the quantity \exp(x)-1 using an algorithm
+ that is accurate for small x.
+
+ -- Function: double gsl_sf_exprel (double X)
+ -- Function: int gsl_sf_exprel_e (double X, gsl_sf_result * RESULT)
+ These routines compute the quantity (\exp(x)-1)/x using an
+ algorithm that is accurate for small x. For small x the algorithm
+ is based on the expansion (\exp(x)-1)/x = 1 + x/2 + x^2/(2*3) +
+ x^3/(2*3*4) + \dots.
+
+ -- Function: double gsl_sf_exprel_2 (double X)
+ -- Function: int gsl_sf_exprel_2_e (double X, gsl_sf_result * RESULT)
+ These routines compute the quantity 2(\exp(x)-1-x)/x^2 using an
+ algorithm that is accurate for small x. For small x the algorithm
+ is based on the expansion 2(\exp(x)-1-x)/x^2 = 1 + x/3 + x^2/(3*4)
+ + x^3/(3*4*5) + \dots.
+
+ -- Function: double gsl_sf_exprel_n (int N, double X)
+ -- Function: int gsl_sf_exprel_n_e (int N, double X, gsl_sf_result *
+ RESULT)
+ These routines compute the N-relative exponential, which is the
+ N-th generalization of the functions `gsl_sf_exprel' and
+ `gsl_sf_exprel2'. The N-relative exponential is given by,
+
+ exprel_N(x) = N!/x^N (\exp(x) - \sum_{k=0}^{N-1} x^k/k!)
+ = 1 + x/(N+1) + x^2/((N+1)(N+2)) + ...
+ = 1F1 (1,1+N,x)
+
+
+File: gsl-ref.info, Node: Exponentiation With Error Estimate, Prev: Relative Exponential Functions, Up: Exponential Functions
+
+7.16.3 Exponentiation With Error Estimate
+-----------------------------------------
+
+ -- Function: int gsl_sf_exp_err_e (double X, double DX, gsl_sf_result
+ * RESULT)
+ This function exponentiates X with an associated absolute error DX.
+
+ -- Function: int gsl_sf_exp_err_e10_e (double X, double DX,
+ gsl_sf_result_e10 * RESULT)
+ This function exponentiates a quantity X with an associated
+ absolute error DX using the `gsl_sf_result_e10' type to return a
+ result with extended range.
+
+ -- Function: int gsl_sf_exp_mult_err_e (double X, double DX, double Y,
+ double DY, gsl_sf_result * RESULT)
+ This routine computes the product y \exp(x) for the quantities X,
+ Y with associated absolute errors DX, DY.
+
+ -- Function: int gsl_sf_exp_mult_err_e10_e (double X, double DX,
+ double Y, double DY, gsl_sf_result_e10 * RESULT)
+ This routine computes the product y \exp(x) for the quantities X,
+ Y with associated absolute errors DX, DY using the
+ `gsl_sf_result_e10' type to return a result with extended range.
+
+
+File: gsl-ref.info, Node: Exponential Integrals, Next: Fermi-Dirac Function, Prev: Exponential Functions, Up: Special Functions
+
+7.17 Exponential Integrals
+==========================
+
+Information on the exponential integrals can be found in Abramowitz &
+Stegun, Chapter 5. These functions are declared in the header file
+`gsl_sf_expint.h'.
+
+* Menu:
+
+* Exponential Integral::
+* Ei(x)::
+* Hyperbolic Integrals::
+* Ei_3(x)::
+* Trigonometric Integrals::
+* Arctangent Integral::
+
+
+File: gsl-ref.info, Node: Exponential Integral, Next: Ei(x), Up: Exponential Integrals
+
+7.17.1 Exponential Integral
+---------------------------
+
+ -- Function: double gsl_sf_expint_E1 (double X)
+ -- Function: int gsl_sf_expint_E1_e (double X, gsl_sf_result * RESULT)
+ These routines compute the exponential integral E_1(x),
+
+ E_1(x) := \Re \int_1^\infty dt \exp(-xt)/t.
+
+
+
+ -- Function: double gsl_sf_expint_E2 (double X)
+ -- Function: int gsl_sf_expint_E2_e (double X, gsl_sf_result * RESULT)
+ These routines compute the second-order exponential integral
+ E_2(x),
+
+ E_2(x) := \Re \int_1^\infty dt \exp(-xt)/t^2.
+
+
+
+
+File: gsl-ref.info, Node: Ei(x), Next: Hyperbolic Integrals, Prev: Exponential Integral, Up: Exponential Integrals
+
+7.17.2 Ei(x)
+------------
+
+ -- Function: double gsl_sf_expint_Ei (double X)
+ -- Function: int gsl_sf_expint_Ei_e (double X, gsl_sf_result * RESULT)
+ These routines compute the exponential integral Ei(x),
+
+ Ei(x) := - PV(\int_{-x}^\infty dt \exp(-t)/t)
+
+ where PV denotes the principal value of the integral.
+
+
+File: gsl-ref.info, Node: Hyperbolic Integrals, Next: Ei_3(x), Prev: Ei(x), Up: Exponential Integrals
+
+7.17.3 Hyperbolic Integrals
+---------------------------
+
+ -- Function: double gsl_sf_Shi (double X)
+ -- Function: int gsl_sf_Shi_e (double X, gsl_sf_result * RESULT)
+ These routines compute the integral Shi(x) = \int_0^x dt
+ \sinh(t)/t.
+
+ -- Function: double gsl_sf_Chi (double X)
+ -- Function: int gsl_sf_Chi_e (double X, gsl_sf_result * RESULT)
+ These routines compute the integral Chi(x) := \Re[ \gamma_E +
+ \log(x) + \int_0^x dt (\cosh[t]-1)/t] , where \gamma_E is the
+ Euler constant (available as the macro `M_EULER').
+
+
+File: gsl-ref.info, Node: Ei_3(x), Next: Trigonometric Integrals, Prev: Hyperbolic Integrals, Up: Exponential Integrals
+
+7.17.4 Ei_3(x)
+--------------
+
+ -- Function: double gsl_sf_expint_3 (double X)
+ -- Function: int gsl_sf_expint_3_e (double X, gsl_sf_result * RESULT)
+ These routines compute the third-order exponential integral
+ Ei_3(x) = \int_0^xdt \exp(-t^3) for x >= 0.
+
+
+File: gsl-ref.info, Node: Trigonometric Integrals, Next: Arctangent Integral, Prev: Ei_3(x), Up: Exponential Integrals
+
+7.17.5 Trigonometric Integrals
+------------------------------
+
+ -- Function: double gsl_sf_Si (const double X)
+ -- Function: int gsl_sf_Si_e (double X, gsl_sf_result * RESULT)
+ These routines compute the Sine integral Si(x) = \int_0^x dt
+ \sin(t)/t.
+
+ -- Function: double gsl_sf_Ci (const double X)
+ -- Function: int gsl_sf_Ci_e (double X, gsl_sf_result * RESULT)
+ These routines compute the Cosine integral Ci(x) = -\int_x^\infty
+ dt \cos(t)/t for x > 0.
+
+
+File: gsl-ref.info, Node: Arctangent Integral, Prev: Trigonometric Integrals, Up: Exponential Integrals
+
+7.17.6 Arctangent Integral
+--------------------------
+
+ -- Function: double gsl_sf_atanint (double X)
+ -- Function: int gsl_sf_atanint_e (double X, gsl_sf_result * RESULT)
+ These routines compute the Arctangent integral, which is defined
+ as AtanInt(x) = \int_0^x dt \arctan(t)/t.
+
+
+File: gsl-ref.info, Node: Fermi-Dirac Function, Next: Gamma and Beta Functions, Prev: Exponential Integrals, Up: Special Functions
+
+7.18 Fermi-Dirac Function
+=========================
+
+The functions described in this section are declared in the header file
+`gsl_sf_fermi_dirac.h'.
+
+* Menu:
+
+* Complete Fermi-Dirac Integrals::
+* Incomplete Fermi-Dirac Integrals::
+
+
+File: gsl-ref.info, Node: Complete Fermi-Dirac Integrals, Next: Incomplete Fermi-Dirac Integrals, Up: Fermi-Dirac Function
+
+7.18.1 Complete Fermi-Dirac Integrals
+-------------------------------------
+
+The complete Fermi-Dirac integral F_j(x) is given by,
+
+ F_j(x) := (1/r\Gamma(j+1)) \int_0^\infty dt (t^j / (\exp(t-x) + 1))
+
+ -- Function: double gsl_sf_fermi_dirac_m1 (double X)
+ -- Function: int gsl_sf_fermi_dirac_m1_e (double X, gsl_sf_result *
+ RESULT)
+ These routines compute the complete Fermi-Dirac integral with an
+ index of -1. This integral is given by F_{-1}(x) = e^x / (1 +
+ e^x).
+
+ -- Function: double gsl_sf_fermi_dirac_0 (double X)
+ -- Function: int gsl_sf_fermi_dirac_0_e (double X, gsl_sf_result *
+ RESULT)
+ These routines compute the complete Fermi-Dirac integral with an
+ index of 0. This integral is given by F_0(x) = \ln(1 + e^x).
+
+ -- Function: double gsl_sf_fermi_dirac_1 (double X)
+ -- Function: int gsl_sf_fermi_dirac_1_e (double X, gsl_sf_result *
+ RESULT)
+ These routines compute the complete Fermi-Dirac integral with an
+ index of 1, F_1(x) = \int_0^\infty dt (t /(\exp(t-x)+1)).
+
+ -- Function: double gsl_sf_fermi_dirac_2 (double X)
+ -- Function: int gsl_sf_fermi_dirac_2_e (double X, gsl_sf_result *
+ RESULT)
+ These routines compute the complete Fermi-Dirac integral with an
+ index of 2, F_2(x) = (1/2) \int_0^\infty dt (t^2 /(\exp(t-x)+1)).
+
+ -- Function: double gsl_sf_fermi_dirac_int (int J, double X)
+ -- Function: int gsl_sf_fermi_dirac_int_e (int J, double X,
+ gsl_sf_result * RESULT)
+ These routines compute the complete Fermi-Dirac integral with an
+ integer index of j, F_j(x) = (1/\Gamma(j+1)) \int_0^\infty dt (t^j
+ /(\exp(t-x)+1)).
+
+ -- Function: double gsl_sf_fermi_dirac_mhalf (double X)
+ -- Function: int gsl_sf_fermi_dirac_mhalf_e (double X, gsl_sf_result *
+ RESULT)
+ These routines compute the complete Fermi-Dirac integral
+ F_{-1/2}(x).
+
+ -- Function: double gsl_sf_fermi_dirac_half (double X)
+ -- Function: int gsl_sf_fermi_dirac_half_e (double X, gsl_sf_result *
+ RESULT)
+ These routines compute the complete Fermi-Dirac integral
+ F_{1/2}(x).
+
+ -- Function: double gsl_sf_fermi_dirac_3half (double X)
+ -- Function: int gsl_sf_fermi_dirac_3half_e (double X, gsl_sf_result *
+ RESULT)
+ These routines compute the complete Fermi-Dirac integral
+ F_{3/2}(x).
+
+
+File: gsl-ref.info, Node: Incomplete Fermi-Dirac Integrals, Prev: Complete Fermi-Dirac Integrals, Up: Fermi-Dirac Function
+
+7.18.2 Incomplete Fermi-Dirac Integrals
+---------------------------------------
+
+The incomplete Fermi-Dirac integral F_j(x,b) is given by,
+
+ F_j(x,b) := (1/\Gamma(j+1)) \int_b^\infty dt (t^j / (\Exp(t-x) + 1))
+
+ -- Function: double gsl_sf_fermi_dirac_inc_0 (double X, double B)
+ -- Function: int gsl_sf_fermi_dirac_inc_0_e (double X, double B,
+ gsl_sf_result * RESULT)
+ These routines compute the incomplete Fermi-Dirac integral with an
+ index of zero, F_0(x,b) = \ln(1 + e^{b-x}) - (b-x).
+
+
+File: gsl-ref.info, Node: Gamma and Beta Functions, Next: Gegenbauer Functions, Prev: Fermi-Dirac Function, Up: Special Functions
+
+7.19 Gamma and Beta Functions
+=============================
+
+The functions described in this section are declared in the header
+file `gsl_sf_gamma.h'.
+
+* Menu:
+
+* Gamma Functions::
+* Factorials::
+* Pochhammer Symbol::
+* Incomplete Gamma Functions::
+* Beta Functions::
+* Incomplete Beta Function::
+
+
+File: gsl-ref.info, Node: Gamma Functions, Next: Factorials, Up: Gamma and Beta Functions
+
+7.19.1 Gamma Functions
+----------------------
+
+The Gamma function is defined by the following integral,
+
+ \Gamma(x) = \int_0^\infty dt t^{x-1} \exp(-t)
+
+It is related to the factorial function by \Gamma(n)=(n-1)! for
+positive integer n. Further information on the Gamma function can be
+found in Abramowitz & Stegun, Chapter 6. The functions described in
+this section are declared in the header file `gsl_sf_gamma.h'.
+
+ -- Function: double gsl_sf_gamma (double X)
+ -- Function: int gsl_sf_gamma_e (double X, gsl_sf_result * RESULT)
+ These routines compute the Gamma function \Gamma(x), subject to x
+ not being a negative integer or zero. The function is computed
+ using the real Lanczos method. The maximum value of x such that
+ \Gamma(x) is not considered an overflow is given by the macro
+ `GSL_SF_GAMMA_XMAX' and is 171.0.
+
+ -- Function: double gsl_sf_lngamma (double X)
+ -- Function: int gsl_sf_lngamma_e (double X, gsl_sf_result * RESULT)
+ These routines compute the logarithm of the Gamma function,
+ \log(\Gamma(x)), subject to x not being a negative integer or
+ zero. For x<0 the real part of \log(\Gamma(x)) is returned, which
+ is equivalent to \log(|\Gamma(x)|). The function is computed
+ using the real Lanczos method.
+
+ -- Function: int gsl_sf_lngamma_sgn_e (double X, gsl_sf_result *
+ RESULT_LG, double * SGN)
+ This routine computes the sign of the gamma function and the
+ logarithm of its magnitude, subject to x not being a negative
+ integer or zero. The function is computed using the real Lanczos
+ method. The value of the gamma function can be reconstructed
+ using the relation \Gamma(x) = sgn * \exp(resultlg).
+
+ -- Function: double gsl_sf_gammastar (double X)
+ -- Function: int gsl_sf_gammastar_e (double X, gsl_sf_result * RESULT)
+ These routines compute the regulated Gamma Function \Gamma^*(x)
+ for x > 0. The regulated gamma function is given by,
+
+ \Gamma^*(x) = \Gamma(x)/(\sqrt{2\pi} x^{(x-1/2)} \exp(-x))
+ = (1 + (1/12x) + ...) for x \to \infty
+ and is a useful suggestion of Temme.
+
+ -- Function: double gsl_sf_gammainv (double X)
+ -- Function: int gsl_sf_gammainv_e (double X, gsl_sf_result * RESULT)
+ These routines compute the reciprocal of the gamma function,
+ 1/\Gamma(x) using the real Lanczos method.
+
+ -- Function: int gsl_sf_lngamma_complex_e (double ZR, double ZI,
+ gsl_sf_result * LNR, gsl_sf_result * ARG)
+ This routine computes \log(\Gamma(z)) for complex z=z_r+i z_i and
+ z not a negative integer or zero, using the complex Lanczos
+ method. The returned parameters are lnr = \log|\Gamma(z)| and arg
+ = \arg(\Gamma(z)) in (-\pi,\pi]. Note that the phase part (ARG)
+ is not well-determined when |z| is very large, due to inevitable
+ roundoff in restricting to (-\pi,\pi]. This will result in a
+ `GSL_ELOSS' error when it occurs. The absolute value part (LNR),
+ however, never suffers from loss of precision.
+
+
+File: gsl-ref.info, Node: Factorials, Next: Pochhammer Symbol, Prev: Gamma Functions, Up: Gamma and Beta Functions
+
+7.19.2 Factorials
+-----------------
+
+Although factorials can be computed from the Gamma function, using the
+relation n! = \Gamma(n+1) for non-negative integer n, it is usually
+more efficient to call the functions in this section, particularly for
+small values of n, whose factorial values are maintained in hardcoded
+tables.
+
+ -- Function: double gsl_sf_fact (unsigned int N)
+ -- Function: int gsl_sf_fact_e (unsigned int N, gsl_sf_result * RESULT)
+ These routines compute the factorial n!. The factorial is related
+ to the Gamma function by n! = \Gamma(n+1). The maximum value of n
+ such that n! is not considered an overflow is given by the macro
+ `GSL_SF_FACT_NMAX' and is 170.
+
+ -- Function: double gsl_sf_doublefact (unsigned int N)
+ -- Function: int gsl_sf_doublefact_e (unsigned int N, gsl_sf_result *
+ RESULT)
+ These routines compute the double factorial n!! = n(n-2)(n-4)
+ \dots. The maximum value of n such that n!! is not considered an
+ overflow is given by the macro `GSL_SF_DOUBLEFACT_NMAX' and is 297.
+
+ -- Function: double gsl_sf_lnfact (unsigned int N)
+ -- Function: int gsl_sf_lnfact_e (unsigned int N, gsl_sf_result *
+ RESULT)
+ These routines compute the logarithm of the factorial of N,
+ \log(n!). The algorithm is faster than computing \ln(\Gamma(n+1))
+ via `gsl_sf_lngamma' for n < 170, but defers for larger N.
+
+ -- Function: double gsl_sf_lndoublefact (unsigned int N)
+ -- Function: int gsl_sf_lndoublefact_e (unsigned int N, gsl_sf_result
+ * RESULT)
+ These routines compute the logarithm of the double factorial of N,
+ \log(n!!).
+
+ -- Function: double gsl_sf_choose (unsigned int N, unsigned int M)
+ -- Function: int gsl_sf_choose_e (unsigned int N, unsigned int M,
+ gsl_sf_result * RESULT)
+ These routines compute the combinatorial factor `n choose m' =
+ n!/(m!(n-m)!)
+
+ -- Function: double gsl_sf_lnchoose (unsigned int N, unsigned int M)
+ -- Function: int gsl_sf_lnchoose_e (unsigned int N, unsigned int M,
+ gsl_sf_result * RESULT)
+ These routines compute the logarithm of `n choose m'. This is
+ equivalent to the sum \log(n!) - \log(m!) - \log((n-m)!).
+
+ -- Function: double gsl_sf_taylorcoeff (int N, double X)
+ -- Function: int gsl_sf_taylorcoeff_e (int N, double X, gsl_sf_result
+ * RESULT)
+ These routines compute the Taylor coefficient x^n / n! for x >= 0,
+ n >= 0.
+
+
+File: gsl-ref.info, Node: Pochhammer Symbol, Next: Incomplete Gamma Functions, Prev: Factorials, Up: Gamma and Beta Functions
+
+7.19.3 Pochhammer Symbol
+------------------------
+
+ -- Function: double gsl_sf_poch (double A, double X)
+ -- Function: int gsl_sf_poch_e (double A, double X, gsl_sf_result *
+ RESULT)
+ These routines compute the Pochhammer symbol (a)_x = \Gamma(a +
+ x)/\Gamma(a), subject to a and a+x not being negative integers or
+ zero. The Pochhammer symbol is also known as the Apell symbol and
+ sometimes written as (a,x).
+
+ -- Function: double gsl_sf_lnpoch (double A, double X)
+ -- Function: int gsl_sf_lnpoch_e (double A, double X, gsl_sf_result *
+ RESULT)
+ These routines compute the logarithm of the Pochhammer symbol,
+ \log((a)_x) = \log(\Gamma(a + x)/\Gamma(a)) for a > 0, a+x > 0.
+
+ -- Function: int gsl_sf_lnpoch_sgn_e (double A, double X,
+ gsl_sf_result * RESULT, double * SGN)
+ These routines compute the sign of the Pochhammer symbol and the
+ logarithm of its magnitude. The computed parameters are result =
+ \log(|(a)_x|) and sgn = \sgn((a)_x) where (a)_x = \Gamma(a +
+ x)/\Gamma(a), subject to a, a+x not being negative integers or
+ zero.
+
+ -- Function: double gsl_sf_pochrel (double A, double X)
+ -- Function: int gsl_sf_pochrel_e (double A, double X, gsl_sf_result *
+ RESULT)
+ These routines compute the relative Pochhammer symbol ((a)_x -
+ 1)/x where (a)_x = \Gamma(a + x)/\Gamma(a).
+
+
+File: gsl-ref.info, Node: Incomplete Gamma Functions, Next: Beta Functions, Prev: Pochhammer Symbol, Up: Gamma and Beta Functions
+
+7.19.4 Incomplete Gamma Functions
+---------------------------------
+
+ -- Function: double gsl_sf_gamma_inc (double A, double X)
+ -- Function: int gsl_sf_gamma_inc_e (double A, double X, gsl_sf_result
+ * RESULT)
+ These functions compute the unnormalized incomplete Gamma Function
+ \Gamma(a,x) = \int_x^\infty dt t^{a-1} \exp(-t) for a real and x
+ >= 0.
+
+ -- Function: double gsl_sf_gamma_inc_Q (double A, double X)
+ -- Function: int gsl_sf_gamma_inc_Q_e (double A, double X,
+ gsl_sf_result * RESULT)
+ These routines compute the normalized incomplete Gamma Function
+ Q(a,x) = 1/\Gamma(a) \int_x^\infty dt t^{a-1} \exp(-t) for a > 0,
+ x >= 0.
+
+ -- Function: double gsl_sf_gamma_inc_P (double A, double X)
+ -- Function: int gsl_sf_gamma_inc_P_e (double A, double X,
+ gsl_sf_result * RESULT)
+ These routines compute the complementary normalized incomplete
+ Gamma Function P(a,x) = 1 - Q(a,x) = 1/\Gamma(a) \int_0^x dt
+ t^{a-1} \exp(-t) for a > 0, x >= 0.
+
+ Note that Abramowitz & Stegun call P(a,x) the incomplete gamma
+ function (section 6.5).
+
+
+File: gsl-ref.info, Node: Beta Functions, Next: Incomplete Beta Function, Prev: Incomplete Gamma Functions, Up: Gamma and Beta Functions
+
+7.19.5 Beta Functions
+---------------------
+
+ -- Function: double gsl_sf_beta (double A, double B)
+ -- Function: int gsl_sf_beta_e (double A, double B, gsl_sf_result *
+ RESULT)
+ These routines compute the Beta Function, B(a,b) =
+ \Gamma(a)\Gamma(b)/\Gamma(a+b) subject to a and b not being
+ negative integers.
+
+ -- Function: double gsl_sf_lnbeta (double A, double B)
+ -- Function: int gsl_sf_lnbeta_e (double A, double B, gsl_sf_result *
+ RESULT)
+ These routines compute the logarithm of the Beta Function,
+ \log(B(a,b)) subject to a and b not being negative integers.
+
+
+File: gsl-ref.info, Node: Incomplete Beta Function, Prev: Beta Functions, Up: Gamma and Beta Functions
+
+7.19.6 Incomplete Beta Function
+-------------------------------
+
+ -- Function: double gsl_sf_beta_inc (double A, double B, double X)
+ -- Function: int gsl_sf_beta_inc_e (double A, double B, double X,
+ gsl_sf_result * RESULT)
+ These routines compute the normalized incomplete Beta function
+ I_x(a,b)=B_x(a,b)/B(a,b) where B_x(a,b) = \int_0^x t^{a-1}
+ (1-t)^{b-1} dt for a > 0, b > 0, and 0 <= x <= 1.
+
+
+File: gsl-ref.info, Node: Gegenbauer Functions, Next: Hypergeometric Functions, Prev: Gamma and Beta Functions, Up: Special Functions
+
+7.20 Gegenbauer Functions
+=========================
+
+The Gegenbauer polynomials are defined in Abramowitz & Stegun, Chapter
+22, where they are known as Ultraspherical polynomials. The functions
+described in this section are declared in the header file
+`gsl_sf_gegenbauer.h'.
+
+ -- Function: double gsl_sf_gegenpoly_1 (double LAMBDA, double X)
+ -- Function: double gsl_sf_gegenpoly_2 (double LAMBDA, double X)
+ -- Function: double gsl_sf_gegenpoly_3 (double LAMBDA, double X)
+ -- Function: int gsl_sf_gegenpoly_1_e (double LAMBDA, double X,
+ gsl_sf_result * RESULT)
+ -- Function: int gsl_sf_gegenpoly_2_e (double LAMBDA, double X,
+ gsl_sf_result * RESULT)
+ -- Function: int gsl_sf_gegenpoly_3_e (double LAMBDA, double X,
+ gsl_sf_result * RESULT)
+ These functions evaluate the Gegenbauer polynomials
+ C^{(\lambda)}_n(x) using explicit representations for n =1, 2, 3.
+
+ -- Function: double gsl_sf_gegenpoly_n (int N, double LAMBDA, double X)
+ -- Function: int gsl_sf_gegenpoly_n_e (int N, double LAMBDA, double X,
+ gsl_sf_result * RESULT)
+ These functions evaluate the Gegenbauer polynomial
+ C^{(\lambda)}_n(x) for a specific value of N, LAMBDA, X subject to
+ \lambda > -1/2, n >= 0.
+
+ -- Function: int gsl_sf_gegenpoly_array (int NMAX, double LAMBDA,
+ double X, double RESULT_ARRAY[])
+ This function computes an array of Gegenbauer polynomials
+ C^{(\lambda)}_n(x) for n = 0, 1, 2, \dots, nmax, subject to
+ \lambda > -1/2, nmax >= 0.
+
+
+File: gsl-ref.info, Node: Hypergeometric Functions, Next: Laguerre Functions, Prev: Gegenbauer Functions, Up: Special Functions
+
+7.21 Hypergeometric Functions
+=============================
+
+Hypergeometric functions are described in Abramowitz & Stegun, Chapters
+13 and 15. These functions are declared in the header file
+`gsl_sf_hyperg.h'.
+
+ -- Function: double gsl_sf_hyperg_0F1 (double C, double X)
+ -- Function: int gsl_sf_hyperg_0F1_e (double C, double X,
+ gsl_sf_result * RESULT)
+ These routines compute the hypergeometric function 0F1(c,x).
+
+ -- Function: double gsl_sf_hyperg_1F1_int (int M, int N, double X)
+ -- Function: int gsl_sf_hyperg_1F1_int_e (int M, int N, double X,
+ gsl_sf_result * RESULT)
+ These routines compute the confluent hypergeometric function
+ 1F1(m,n,x) = M(m,n,x) for integer parameters M, N.
+
+ -- Function: double gsl_sf_hyperg_1F1 (double A, double B, double X)
+ -- Function: int gsl_sf_hyperg_1F1_e (double A, double B, double X,
+ gsl_sf_result * RESULT)
+ These routines compute the confluent hypergeometric function
+ 1F1(a,b,x) = M(a,b,x) for general parameters A, B.
+
+ -- Function: double gsl_sf_hyperg_U_int (int M, int N, double X)
+ -- Function: int gsl_sf_hyperg_U_int_e (int M, int N, double X,
+ gsl_sf_result * RESULT)
+ These routines compute the confluent hypergeometric function
+ U(m,n,x) for integer parameters M, N.
+
+ -- Function: int gsl_sf_hyperg_U_int_e10_e (int M, int N, double X,
+ gsl_sf_result_e10 * RESULT)
+ This routine computes the confluent hypergeometric function
+ U(m,n,x) for integer parameters M, N using the `gsl_sf_result_e10'
+ type to return a result with extended range.
+
+ -- Function: double gsl_sf_hyperg_U (double A, double B, double X)
+ -- Function: int gsl_sf_hyperg_U_e (double A, double B, double X,
+ gsl_sf_result * RESULT)
+ These routines compute the confluent hypergeometric function
+ U(a,b,x).
+
+ -- Function: int gsl_sf_hyperg_U_e10_e (double A, double B, double X,
+ gsl_sf_result_e10 * RESULT)
+ This routine computes the confluent hypergeometric function
+ U(a,b,x) using the `gsl_sf_result_e10' type to return a result
+ with extended range.
+
+ -- Function: double gsl_sf_hyperg_2F1 (double A, double B, double C,
+ double X)
+ -- Function: int gsl_sf_hyperg_2F1_e (double A, double B, double C,
+ double X, gsl_sf_result * RESULT)
+ These routines compute the Gauss hypergeometric function
+ 2F1(a,b,c,x) for |x| < 1.
+
+ If the arguments (a,b,c,x) are too close to a singularity then the
+ function can return the error code `GSL_EMAXITER' when the series
+ approximation converges too slowly. This occurs in the region of
+ x=1, c - a - b = m for integer m.
+
+ -- Function: double gsl_sf_hyperg_2F1_conj (double AR, double AI,
+ double C, double X)
+ -- Function: int gsl_sf_hyperg_2F1_conj_e (double AR, double AI,
+ double C, double X, gsl_sf_result * RESULT)
+ These routines compute the Gauss hypergeometric function 2F1(a_R +
+ i a_I, a_R - i a_I, c, x) with complex parameters for |x| < 1.
+ exceptions:
+
+ -- Function: double gsl_sf_hyperg_2F1_renorm (double A, double B,
+ double C, double X)
+ -- Function: int gsl_sf_hyperg_2F1_renorm_e (double A, double B,
+ double C, double X, gsl_sf_result * RESULT)
+ These routines compute the renormalized Gauss hypergeometric
+ function 2F1(a,b,c,x) / \Gamma(c) for |x| < 1.
+
+ -- Function: double gsl_sf_hyperg_2F1_conj_renorm (double AR, double
+ AI, double C, double X)
+ -- Function: int gsl_sf_hyperg_2F1_conj_renorm_e (double AR, double
+ AI, double C, double X, gsl_sf_result * RESULT)
+ These routines compute the renormalized Gauss hypergeometric
+ function 2F1(a_R + i a_I, a_R - i a_I, c, x) / \Gamma(c) for |x| <
+ 1.
+
+ -- Function: double gsl_sf_hyperg_2F0 (double A, double B, double X)
+ -- Function: int gsl_sf_hyperg_2F0_e (double A, double B, double X,
+ gsl_sf_result * RESULT)
+ These routines compute the hypergeometric function 2F0(a,b,x).
+ The series representation is a divergent hypergeometric series.
+ However, for x < 0 we have 2F0(a,b,x) = (-1/x)^a U(a,1+a-b,-1/x)
+
+
+File: gsl-ref.info, Node: Laguerre Functions, Next: Lambert W Functions, Prev: Hypergeometric Functions, Up: Special Functions
+
+7.22 Laguerre Functions
+=======================
+
+The generalized Laguerre polynomials are defined in terms of confluent
+hypergeometric functions as L^a_n(x) = ((a+1)_n / n!) 1F1(-n,a+1,x),
+and are sometimes referred to as the associated Laguerre polynomials.
+They are related to the plain Laguerre polynomials L_n(x) by L^0_n(x) =
+L_n(x) and L^k_n(x) = (-1)^k (d^k/dx^k) L_(n+k)(x). For more
+information see Abramowitz & Stegun, Chapter 22.
+
+ The functions described in this section are declared in the header
+file `gsl_sf_laguerre.h'.
+
+ -- Function: double gsl_sf_laguerre_1 (double A, double X)
+ -- Function: double gsl_sf_laguerre_2 (double A, double X)
+ -- Function: double gsl_sf_laguerre_3 (double A, double X)
+ -- Function: int gsl_sf_laguerre_1_e (double A, double X,
+ gsl_sf_result * RESULT)
+ -- Function: int gsl_sf_laguerre_2_e (double A, double X,
+ gsl_sf_result * RESULT)
+ -- Function: int gsl_sf_laguerre_3_e (double A, double X,
+ gsl_sf_result * RESULT)
+ These routines evaluate the generalized Laguerre polynomials
+ L^a_1(x), L^a_2(x), L^a_3(x) using explicit representations.
+
+ -- Function: double gsl_sf_laguerre_n (const int N, const double A,
+ const double X)
+ -- Function: int gsl_sf_laguerre_n_e (int N, double A, double X,
+ gsl_sf_result * RESULT)
+ These routines evaluate the generalized Laguerre polynomials
+ L^a_n(x) for a > -1, n >= 0.
+
+
+
+File: gsl-ref.info, Node: Lambert W Functions, Next: Legendre Functions and Spherical Harmonics, Prev: Laguerre Functions, Up: Special Functions
+
+7.23 Lambert W Functions
+========================
+
+Lambert's W functions, W(x), are defined to be solutions of the
+equation W(x) \exp(W(x)) = x. This function has multiple branches for x
+< 0; however, it has only two real-valued branches. We define W_0(x) to
+be the principal branch, where W > -1 for x < 0, and W_{-1}(x) to be
+the other real branch, where W < -1 for x < 0. The Lambert functions
+are declared in the header file `gsl_sf_lambert.h'.
+
+ -- Function: double gsl_sf_lambert_W0 (double X)
+ -- Function: int gsl_sf_lambert_W0_e (double X, gsl_sf_result * RESULT)
+ These compute the principal branch of the Lambert W function,
+ W_0(x).
+
+ -- Function: double gsl_sf_lambert_Wm1 (double X)
+ -- Function: int gsl_sf_lambert_Wm1_e (double X, gsl_sf_result *
+ RESULT)
+ These compute the secondary real-valued branch of the Lambert W
+ function, W_{-1}(x).
+
+
+File: gsl-ref.info, Node: Legendre Functions and Spherical Harmonics, Next: Logarithm and Related Functions, Prev: Lambert W Functions, Up: Special Functions
+
+7.24 Legendre Functions and Spherical Harmonics
+===============================================
+
+The Legendre Functions and Legendre Polynomials are described in
+Abramowitz & Stegun, Chapter 8. These functions are declared in the
+header file `gsl_sf_legendre.h'.
+
+* Menu:
+
+* Legendre Polynomials::
+* Associated Legendre Polynomials and Spherical Harmonics::
+* Conical Functions::
+* Radial Functions for Hyperbolic Space::
+
+
+File: gsl-ref.info, Node: Legendre Polynomials, Next: Associated Legendre Polynomials and Spherical Harmonics, Up: Legendre Functions and Spherical Harmonics
+
+7.24.1 Legendre Polynomials
+---------------------------
+
+ -- Function: double gsl_sf_legendre_P1 (double X)
+ -- Function: double gsl_sf_legendre_P2 (double X)
+ -- Function: double gsl_sf_legendre_P3 (double X)
+ -- Function: int gsl_sf_legendre_P1_e (double X, gsl_sf_result *
+ RESULT)
+ -- Function: int gsl_sf_legendre_P2_e (double X, gsl_sf_result *
+ RESULT)
+ -- Function: int gsl_sf_legendre_P3_e (double X, gsl_sf_result *
+ RESULT)
+ These functions evaluate the Legendre polynomials P_l(x) using
+ explicit representations for l=1, 2, 3.
+
+ -- Function: double gsl_sf_legendre_Pl (int L, double X)
+ -- Function: int gsl_sf_legendre_Pl_e (int L, double X, gsl_sf_result
+ * RESULT)
+ These functions evaluate the Legendre polynomial P_l(x) for a
+ specific value of L, X subject to l >= 0, |x| <= 1
+
+ -- Function: int gsl_sf_legendre_Pl_array (int LMAX, double X, double
+ RESULT_ARRAY[])
+ -- Function: int gsl_sf_legendre_Pl_deriv_array (int LMAX, double X,
+ double RESULT_ARRAY[], double RESULT_DERIV_ARRAY[])
+ These functions compute an array of Legendre polynomials P_l(x),
+ and optionally their derivatives dP_l(x)/dx, for l = 0, \dots,
+ lmax, |x| <= 1
+
+ -- Function: double gsl_sf_legendre_Q0 (double X)
+ -- Function: int gsl_sf_legendre_Q0_e (double X, gsl_sf_result *
+ RESULT)
+ These routines compute the Legendre function Q_0(x) for x > -1, x
+ != 1.
+
+ -- Function: double gsl_sf_legendre_Q1 (double X)
+ -- Function: int gsl_sf_legendre_Q1_e (double X, gsl_sf_result *
+ RESULT)
+ These routines compute the Legendre function Q_1(x) for x > -1, x
+ != 1.
+
+ -- Function: double gsl_sf_legendre_Ql (int L, double X)
+ -- Function: int gsl_sf_legendre_Ql_e (int L, double X, gsl_sf_result
+ * RESULT)
+ These routines compute the Legendre function Q_l(x) for x > -1, x
+ != 1 and l >= 0.
+
+
+File: gsl-ref.info, Node: Associated Legendre Polynomials and Spherical Harmonics, Next: Conical Functions, Prev: Legendre Polynomials, Up: Legendre Functions and Spherical Harmonics
+
+7.24.2 Associated Legendre Polynomials and Spherical Harmonics
+--------------------------------------------------------------
+
+The following functions compute the associated Legendre Polynomials
+P_l^m(x). Note that this function grows combinatorially with l and can
+overflow for l larger than about 150. There is no trouble for small m,
+but overflow occurs when m and l are both large. Rather than allow
+overflows, these functions refuse to calculate P_l^m(x) and return
+`GSL_EOVRFLW' when they can sense that l and m are too big.
+
+ If you want to calculate a spherical harmonic, then _do not_ use
+these functions. Instead use `gsl_sf_legendre_sphPlm' below, which
+uses a similar recursion, but with the normalized functions.
+
+ -- Function: double gsl_sf_legendre_Plm (int L, int M, double X)
+ -- Function: int gsl_sf_legendre_Plm_e (int L, int M, double X,
+ gsl_sf_result * RESULT)
+ These routines compute the associated Legendre polynomial P_l^m(x)
+ for m >= 0, l >= m, |x| <= 1.
+
+ -- Function: int gsl_sf_legendre_Plm_array (int LMAX, int M, double X,
+ double RESULT_ARRAY[])
+ -- Function: int gsl_sf_legendre_Plm_deriv_array (int LMAX, int M,
+ double X, double RESULT_ARRAY[], double RESULT_DERIV_ARRAY[])
+ These functions compute an array of Legendre polynomials P_l^m(x),
+ and optionally their derivatives dP_l^m(x)/dx, for m >= 0, l =
+ |m|, ..., lmax, |x| <= 1.
+
+ -- Function: double gsl_sf_legendre_sphPlm (int L, int M, double X)
+ -- Function: int gsl_sf_legendre_sphPlm_e (int L, int M, double X,
+ gsl_sf_result * RESULT)
+ These routines compute the normalized associated Legendre
+ polynomial $\sqrt{(2l+1)/(4\pi)} \sqrt{(l-m)!/(l+m)!} P_l^m(x)$
+ suitable for use in spherical harmonics. The parameters must
+ satisfy m >= 0, l >= m, |x| <= 1. Theses routines avoid the
+ overflows that occur for the standard normalization of P_l^m(x).
+
+ -- Function: int gsl_sf_legendre_sphPlm_array (int LMAX, int M, double
+ X, double RESULT_ARRAY[])
+ -- Function: int gsl_sf_legendre_sphPlm_deriv_array (int LMAX, int M,
+ double X, double RESULT_ARRAY[], double RESULT_DERIV_ARRAY[])
+ These functions compute an array of normalized associated Legendre
+ functions $\sqrt{(2l+1)/(4\pi)} \sqrt{(l-m)!/(l+m)!} P_l^m(x)$,
+ and optionally their derivatives, for m >= 0, l = |m|, ..., lmax,
+ |x| <= 1.0
+
+ -- Function: int gsl_sf_legendre_array_size (const int LMAX, const int
+ M)
+ This function returns the size of RESULT_ARRAY[] needed for the
+ array versions of P_l^m(x), LMAX - M + 1.
+
+
+File: gsl-ref.info, Node: Conical Functions, Next: Radial Functions for Hyperbolic Space, Prev: Associated Legendre Polynomials and Spherical Harmonics, Up: Legendre Functions and Spherical Harmonics
+
+7.24.3 Conical Functions
+------------------------
+
+The Conical Functions P^\mu_{-(1/2)+i\lambda}(x) and
+Q^\mu_{-(1/2)+i\lambda} are described in Abramowitz & Stegun, Section
+8.12.
+
+ -- Function: double gsl_sf_conicalP_half (double LAMBDA, double X)
+ -- Function: int gsl_sf_conicalP_half_e (double LAMBDA, double X,
+ gsl_sf_result * RESULT)
+ These routines compute the irregular Spherical Conical Function
+ P^{1/2}_{-1/2 + i \lambda}(x) for x > -1.
+
+ -- Function: double gsl_sf_conicalP_mhalf (double LAMBDA, double X)
+ -- Function: int gsl_sf_conicalP_mhalf_e (double LAMBDA, double X,
+ gsl_sf_result * RESULT)
+ These routines compute the regular Spherical Conical Function
+ P^{-1/2}_{-1/2 + i \lambda}(x) for x > -1.
+
+ -- Function: double gsl_sf_conicalP_0 (double LAMBDA, double X)
+ -- Function: int gsl_sf_conicalP_0_e (double LAMBDA, double X,
+ gsl_sf_result * RESULT)
+ These routines compute the conical function P^0_{-1/2 + i
+ \lambda}(x) for x > -1.
+
+ -- Function: double gsl_sf_conicalP_1 (double LAMBDA, double X)
+ -- Function: int gsl_sf_conicalP_1_e (double LAMBDA, double X,
+ gsl_sf_result * RESULT)
+ These routines compute the conical function P^1_{-1/2 + i
+ \lambda}(x) for x > -1.
+
+ -- Function: double gsl_sf_conicalP_sph_reg (int L, double LAMBDA,
+ double X)
+ -- Function: int gsl_sf_conicalP_sph_reg_e (int L, double LAMBDA,
+ double X, gsl_sf_result * RESULT)
+ These routines compute the Regular Spherical Conical Function
+ P^{-1/2-l}_{-1/2 + i \lambda}(x) for x > -1, l >= -1.
+
+ -- Function: double gsl_sf_conicalP_cyl_reg (int M, double LAMBDA,
+ double X)
+ -- Function: int gsl_sf_conicalP_cyl_reg_e (int M, double LAMBDA,
+ double X, gsl_sf_result * RESULT)
+ These routines compute the Regular Cylindrical Conical Function
+ P^{-m}_{-1/2 + i \lambda}(x) for x > -1, m >= -1.
+
+
+File: gsl-ref.info, Node: Radial Functions for Hyperbolic Space, Prev: Conical Functions, Up: Legendre Functions and Spherical Harmonics
+
+7.24.4 Radial Functions for Hyperbolic Space
+--------------------------------------------
+
+The following spherical functions are specializations of Legendre
+functions which give the regular eigenfunctions of the Laplacian on a
+3-dimensional hyperbolic space H3d. Of particular interest is the flat
+limit, \lambda \to \infty, \eta \to 0, \lambda\eta fixed.
+
+ -- Function: double gsl_sf_legendre_H3d_0 (double LAMBDA, double ETA)
+ -- Function: int gsl_sf_legendre_H3d_0_e (double LAMBDA, double ETA,
+ gsl_sf_result * RESULT)
+ These routines compute the zeroth radial eigenfunction of the
+ Laplacian on the 3-dimensional hyperbolic space,
+ L^{H3d}_0(\lambda,\eta) := \sin(\lambda\eta)/(\lambda\sinh(\eta))
+ for \eta >= 0. In the flat limit this takes the form
+ L^{H3d}_0(\lambda,\eta) = j_0(\lambda\eta).
+
+ -- Function: double gsl_sf_legendre_H3d_1 (double LAMBDA, double ETA)
+ -- Function: int gsl_sf_legendre_H3d_1_e (double LAMBDA, double ETA,
+ gsl_sf_result * RESULT)
+ These routines compute the first radial eigenfunction of the
+ Laplacian on the 3-dimensional hyperbolic space,
+ L^{H3d}_1(\lambda,\eta) := 1/\sqrt{\lambda^2 + 1} \sin(\lambda
+ \eta)/(\lambda \sinh(\eta)) (\coth(\eta) - \lambda
+ \cot(\lambda\eta)) for \eta >= 0. In the flat limit this takes
+ the form L^{H3d}_1(\lambda,\eta) = j_1(\lambda\eta).
+
+ -- Function: double gsl_sf_legendre_H3d (int L, double LAMBDA, double
+ ETA)
+ -- Function: int gsl_sf_legendre_H3d_e (int L, double LAMBDA, double
+ ETA, gsl_sf_result * RESULT)
+ These routines compute the L-th radial eigenfunction of the
+ Laplacian on the 3-dimensional hyperbolic space \eta >= 0, l >= 0.
+ In the flat limit this takes the form L^{H3d}_l(\lambda,\eta) =
+ j_l(\lambda\eta).
+
+ -- Function: int gsl_sf_legendre_H3d_array (int LMAX, double LAMBDA,
+ double ETA, double RESULT_ARRAY[])
+ This function computes an array of radial eigenfunctions
+ L^{H3d}_l(\lambda, \eta) for 0 <= l <= lmax.
+
+
+File: gsl-ref.info, Node: Logarithm and Related Functions, Next: Mathieu Functions, Prev: Legendre Functions and Spherical Harmonics, Up: Special Functions
+
+7.25 Logarithm and Related Functions
+====================================
+
+Information on the properties of the Logarithm function can be found in
+Abramowitz & Stegun, Chapter 4. The functions described in this section
+are declared in the header file `gsl_sf_log.h'.
+
+ -- Function: double gsl_sf_log (double X)
+ -- Function: int gsl_sf_log_e (double X, gsl_sf_result * RESULT)
+ These routines compute the logarithm of X, \log(x), for x > 0.
+
+ -- Function: double gsl_sf_log_abs (double X)
+ -- Function: int gsl_sf_log_abs_e (double X, gsl_sf_result * RESULT)
+ These routines compute the logarithm of the magnitude of X,
+ \log(|x|), for x \ne 0.
+
+ -- Function: int gsl_sf_complex_log_e (double ZR, double ZI,
+ gsl_sf_result * LNR, gsl_sf_result * THETA)
+ This routine computes the complex logarithm of z = z_r + i z_i.
+ The results are returned as LNR, THETA such that \exp(lnr + i
+ \theta) = z_r + i z_i, where \theta lies in the range [-\pi,\pi].
+
+ -- Function: double gsl_sf_log_1plusx (double X)
+ -- Function: int gsl_sf_log_1plusx_e (double X, gsl_sf_result * RESULT)
+ These routines compute \log(1 + x) for x > -1 using an algorithm
+ that is accurate for small x.
+
+ -- Function: double gsl_sf_log_1plusx_mx (double X)
+ -- Function: int gsl_sf_log_1plusx_mx_e (double X, gsl_sf_result *
+ RESULT)
+ These routines compute \log(1 + x) - x for x > -1 using an
+ algorithm that is accurate for small x.
+
+
+File: gsl-ref.info, Node: Mathieu Functions, Next: Power Function, Prev: Logarithm and Related Functions, Up: Special Functions
+
+7.26 Mathieu Functions
+======================
+
+The routines described in this section compute the angular and radial
+Mathieu functions, and their characteristic values. Mathieu functions
+are the solutions of the following two differential equations:
+
+ d^2y/dv^2 + (a - 2q\cos 2v)y = 0
+ d^2f/du^2 - (a - 2q\cosh 2u)f = 0
+
+The angular Mathieu functions ce_r(x,q), se_r(x,q) are the even and odd
+periodic solutions of the first equation, which is known as Mathieu's
+equation. These exist only for the discrete sequence of characteristic
+values a=a_r(q) (even-periodic) and a=b_r(q) (odd-periodic).
+
+ The radial Mathieu functions Mc^{(j)}_{r}(z,q), Ms^{(j)}_{r}(z,q)
+are the solutions of the second equation, which is referred to as
+Mathieu's modified equation. The radial Mathieu functions of the
+first, second, third and fourth kind are denoted by the parameter j,
+which takes the value 1, 2, 3 or 4.
+
+ For more information on the Mathieu functions, see Abramowitz and
+Stegun, Chapter 20. These functions are defined in the header file
+`gsl_sf_mathieu.h'.
+
+* Menu:
+
+* Mathieu Function Workspace::
+* Mathieu Function Characteristic Values::
+* Angular Mathieu Functions::
+* Radial Mathieu Functions::
+
+
+File: gsl-ref.info, Node: Mathieu Function Workspace, Next: Mathieu Function Characteristic Values, Up: Mathieu Functions
+
+7.26.1 Mathieu Function Workspace
+---------------------------------
+
+The Mathieu functions can be computed for a single order or for
+multiple orders, using array-based routines. The array-based routines
+require a preallocated workspace.
+
+ -- Function: gsl_sf_mathieu_workspace * gsl_sf_mathieu_alloc (size_t
+ N, double QMAX)
+ This function returns a workspace for the array versions of the
+ Mathieu routines. The arguments N and QMAX specify the maximum
+ order and q-value of Mathieu functions which can be computed with
+ this workspace.
+
+
+ -- Function: void gsl_sf_mathieu_free (gsl_sf_mathieu_workspace *WORK)
+ This function frees the workspace WORK.
+
+
+File: gsl-ref.info, Node: Mathieu Function Characteristic Values, Next: Angular Mathieu Functions, Prev: Mathieu Function Workspace, Up: Mathieu Functions
+
+7.26.2 Mathieu Function Characteristic Values
+---------------------------------------------
+
+ -- Function: int gsl_sf_mathieu_a (int N, double Q, gsl_sf_result
+ *RESULT)
+ -- Function: int gsl_sf_mathieu_b (int N, double Q, gsl_sf_result
+ *RESULT)
+ These routines compute the characteristic values a_n(q), b_n(q) of
+ the Mathieu functions ce_n(q,x) and se_n(q,x), respectively.
+
+ -- Function: int gsl_sf_mathieu_a_array (int ORDER_MIN, int ORDER_MAX,
+ double Q, gsl_sf_mathieu_workspace *WORK, double
+ RESULT_ARRAY[])
+ -- Function: int gsl_sf_mathieu_b_array (int ORDER_MIN, int ORDER_MAX,
+ double Q, gsl_sf_mathieu_workspace *WORK, double
+ RESULT_ARRAY[])
+ These routines compute a series of Mathieu characteristic values
+ a_n(q), b_n(q) for n from ORDER_MIN to ORDER_MAX inclusive,
+ storing the results in the array RESULT_ARRAY.
+
+
+File: gsl-ref.info, Node: Angular Mathieu Functions, Next: Radial Mathieu Functions, Prev: Mathieu Function Characteristic Values, Up: Mathieu Functions
+
+7.26.3 Angular Mathieu Functions
+--------------------------------
+
+ -- Function: int gsl_sf_mathieu_ce (int N, double Q, double X,
+ gsl_sf_result *RESULT)
+ -- Function: int gsl_sf_mathieu_se (int N, double Q, double X,
+ gsl_sf_result *RESULT)
+ These routines compute the angular Mathieu functions ce_n(q,x) and
+ se_n(q,x), respectively.
+
+ -- Function: int gsl_sf_mathieu_ce_array (int NMIN, int NMAX, double
+ Q, double X, gsl_sf_mathieu_workspace *WORK, double
+ RESULT_ARRAY[])
+ -- Function: int gsl_sf_mathieu_se_array (int NMIN, int NMAX, double
+ Q, double X, gsl_sf_mathieu_workspace *WORK, double
+ RESULT_ARRAY[])
+ These routines compute a series of the angular Mathieu functions
+ ce_n(q,x) and se_n(q,x) of order n from NMIN to NMAX inclusive,
+ storing the results in the array RESULT_ARRAY.
+
+
+File: gsl-ref.info, Node: Radial Mathieu Functions, Prev: Angular Mathieu Functions, Up: Mathieu Functions
+
+7.26.4 Radial Mathieu Functions
+-------------------------------
+
+ -- Function: int gsl_sf_mathieu_Mc (int J, int N, double Q, double X,
+ gsl_sf_result *RESULT)
+ -- Function: int gsl_sf_mathieu_Ms (int J, int N, double Q, double X,
+ gsl_sf_result *RESULT)
+ These routines compute the radial J-th kind Mathieu functions
+ Mc_n^{(j)}(q,x) and Ms_n^{(j)}(q,x) of order N.
+
+ The allowed values of J are 1 and 2. The functions for j = 3,4
+ can be computed as M_n^{(3)} = M_n^{(1)} + iM_n^{(2)} and
+ M_n^{(4)} = M_n^{(1)} - iM_n^{(2)}, where M_n^{(j)} = Mc_n^{(j)} or
+ Ms_n^{(j)}.
+
+ -- Function: int gsl_sf_mathieu_Mc_array (int J, int NMIN, int NMAX,
+ double Q, double X, gsl_sf_mathieu_workspace *WORK, double
+ RESULT_ARRAY[])
+ -- Function: int gsl_sf_mathieu_Ms_array (int J, int NMIN, int NMAX,
+ double Q, double X, gsl_sf_mathieu_workspace *WORK, double
+ RESULT_ARRAY[])
+ These routines compute a series of the radial Mathieu functions of
+ kind J, with order from NMIN to NMAX inclusive, storing the
+ results in the array RESULT_ARRAY.
+
+
+File: gsl-ref.info, Node: Power Function, Next: Psi (Digamma) Function, Prev: Mathieu Functions, Up: Special Functions
+
+7.27 Power Function
+===================
+
+The following functions are equivalent to the function `gsl_pow_int'
+(*note Small integer powers::) with an error estimate. These functions
+are declared in the header file `gsl_sf_pow_int.h'.
+
+ -- Function: double gsl_sf_pow_int (double X, int N)
+ -- Function: int gsl_sf_pow_int_e (double X, int N, gsl_sf_result *
+ RESULT)
+ These routines compute the power x^n for integer N. The power is
+ computed using the minimum number of multiplications. For example,
+ x^8 is computed as ((x^2)^2)^2, requiring only 3 multiplications.
+ For reasons of efficiency, these functions do not check for
+ overflow or underflow conditions.
+
+ #include <gsl/gsl_sf_pow_int.h>
+ /* compute 3.0**12 */
+ double y = gsl_sf_pow_int(3.0, 12);
+
+
+File: gsl-ref.info, Node: Psi (Digamma) Function, Next: Synchrotron Functions, Prev: Power Function, Up: Special Functions
+
+7.28 Psi (Digamma) Function
+===========================
+
+The polygamma functions of order n are defined by
+
+ \psi^{(n)}(x) = (d/dx)^n \psi(x) = (d/dx)^{n+1} \log(\Gamma(x))
+
+where \psi(x) = \Gamma'(x)/\Gamma(x) is known as the digamma function.
+These functions are declared in the header file `gsl_sf_psi.h'.
+
+* Menu:
+
+* Digamma Function::
+* Trigamma Function::
+* Polygamma Function::
+
+
+File: gsl-ref.info, Node: Digamma Function, Next: Trigamma Function, Up: Psi (Digamma) Function
+
+7.28.1 Digamma Function
+-----------------------
+
+ -- Function: double gsl_sf_psi_int (int N)
+ -- Function: int gsl_sf_psi_int_e (int N, gsl_sf_result * RESULT)
+ These routines compute the digamma function \psi(n) for positive
+ integer N. The digamma function is also called the Psi function.
+
+ -- Function: double gsl_sf_psi (double X)
+ -- Function: int gsl_sf_psi_e (double X, gsl_sf_result * RESULT)
+ These routines compute the digamma function \psi(x) for general x,
+ x \ne 0.
+
+ -- Function: double gsl_sf_psi_1piy (double Y)
+ -- Function: int gsl_sf_psi_1piy_e (double Y, gsl_sf_result * RESULT)
+ These routines compute the real part of the digamma function on
+ the line 1+i y, \Re[\psi(1 + i y)].
+
+
+File: gsl-ref.info, Node: Trigamma Function, Next: Polygamma Function, Prev: Digamma Function, Up: Psi (Digamma) Function
+
+7.28.2 Trigamma Function
+------------------------
+
+ -- Function: double gsl_sf_psi_1_int (int N)
+ -- Function: int gsl_sf_psi_1_int_e (int N, gsl_sf_result * RESULT)
+ These routines compute the Trigamma function \psi'(n) for positive
+ integer n.
+
+ -- Function: double gsl_sf_psi_1 (double X)
+ -- Function: int gsl_sf_psi_1_e (double X, gsl_sf_result * RESULT)
+ These routines compute the Trigamma function \psi'(x) for general
+ x.
+
+
+File: gsl-ref.info, Node: Polygamma Function, Prev: Trigamma Function, Up: Psi (Digamma) Function
+
+7.28.3 Polygamma Function
+-------------------------
+
+ -- Function: double gsl_sf_psi_n (int N, double X)
+ -- Function: int gsl_sf_psi_n_e (int N, double X, gsl_sf_result *
+ RESULT)
+ These routines compute the polygamma function \psi^{(n)}(x) for n
+ >= 0, x > 0.
+
+
+File: gsl-ref.info, Node: Synchrotron Functions, Next: Transport Functions, Prev: Psi (Digamma) Function, Up: Special Functions
+
+7.29 Synchrotron Functions
+==========================
+
+The functions described in this section are declared in the header file
+`gsl_sf_synchrotron.h'.
+
+ -- Function: double gsl_sf_synchrotron_1 (double X)
+ -- Function: int gsl_sf_synchrotron_1_e (double X, gsl_sf_result *
+ RESULT)
+ These routines compute the first synchrotron function x
+ \int_x^\infty dt K_{5/3}(t) for x >= 0.
+
+ -- Function: double gsl_sf_synchrotron_2 (double X)
+ -- Function: int gsl_sf_synchrotron_2_e (double X, gsl_sf_result *
+ RESULT)
+ These routines compute the second synchrotron function x
+ K_{2/3}(x) for x >= 0.
+
+
+File: gsl-ref.info, Node: Transport Functions, Next: Trigonometric Functions, Prev: Synchrotron Functions, Up: Special Functions
+
+7.30 Transport Functions
+========================
+
+The transport functions J(n,x) are defined by the integral
+representations J(n,x) := \int_0^x dt t^n e^t /(e^t - 1)^2. They are
+declared in the header file `gsl_sf_transport.h'.
+
+ -- Function: double gsl_sf_transport_2 (double X)
+ -- Function: int gsl_sf_transport_2_e (double X, gsl_sf_result *
+ RESULT)
+ These routines compute the transport function J(2,x).
+
+ -- Function: double gsl_sf_transport_3 (double X)
+ -- Function: int gsl_sf_transport_3_e (double X, gsl_sf_result *
+ RESULT)
+ These routines compute the transport function J(3,x).
+
+ -- Function: double gsl_sf_transport_4 (double X)
+ -- Function: int gsl_sf_transport_4_e (double X, gsl_sf_result *
+ RESULT)
+ These routines compute the transport function J(4,x).
+
+ -- Function: double gsl_sf_transport_5 (double X)
+ -- Function: int gsl_sf_transport_5_e (double X, gsl_sf_result *
+ RESULT)
+ These routines compute the transport function J(5,x).
+
+
+File: gsl-ref.info, Node: Trigonometric Functions, Next: Zeta Functions, Prev: Transport Functions, Up: Special Functions
+
+7.31 Trigonometric Functions
+============================
+
+The library includes its own trigonometric functions in order to provide
+consistency across platforms and reliable error estimates. These
+functions are declared in the header file `gsl_sf_trig.h'.
+
+* Menu:
+
+* Circular Trigonometric Functions::
+* Trigonometric Functions for Complex Arguments::
+* Hyperbolic Trigonometric Functions::
+* Conversion Functions::
+* Restriction Functions::
+* Trigonometric Functions With Error Estimates::
+
+
+File: gsl-ref.info, Node: Circular Trigonometric Functions, Next: Trigonometric Functions for Complex Arguments, Up: Trigonometric Functions
+
+7.31.1 Circular Trigonometric Functions
+---------------------------------------
+
+ -- Function: double gsl_sf_sin (double X)
+ -- Function: int gsl_sf_sin_e (double X, gsl_sf_result * RESULT)
+ These routines compute the sine function \sin(x).
+
+ -- Function: double gsl_sf_cos (double X)
+ -- Function: int gsl_sf_cos_e (double X, gsl_sf_result * RESULT)
+ These routines compute the cosine function \cos(x).
+
+ -- Function: double gsl_sf_hypot (double X, double Y)
+ -- Function: int gsl_sf_hypot_e (double X, double Y, gsl_sf_result *
+ RESULT)
+ These routines compute the hypotenuse function \sqrt{x^2 + y^2}
+ avoiding overflow and underflow.
+
+ -- Function: double gsl_sf_sinc (double X)
+ -- Function: int gsl_sf_sinc_e (double X, gsl_sf_result * RESULT)
+ These routines compute \sinc(x) = \sin(\pi x) / (\pi x) for any
+ value of X.
+
+
+File: gsl-ref.info, Node: Trigonometric Functions for Complex Arguments, Next: Hyperbolic Trigonometric Functions, Prev: Circular Trigonometric Functions, Up: Trigonometric Functions
+
+7.31.2 Trigonometric Functions for Complex Arguments
+----------------------------------------------------
+
+ -- Function: int gsl_sf_complex_sin_e (double ZR, double ZI,
+ gsl_sf_result * SZR, gsl_sf_result * SZI)
+ This function computes the complex sine, \sin(z_r + i z_i) storing
+ the real and imaginary parts in SZR, SZI.
+
+ -- Function: int gsl_sf_complex_cos_e (double ZR, double ZI,
+ gsl_sf_result * CZR, gsl_sf_result * CZI)
+ This function computes the complex cosine, \cos(z_r + i z_i)
+ storing the real and imaginary parts in SZR, SZI.
+
+ -- Function: int gsl_sf_complex_logsin_e (double ZR, double ZI,
+ gsl_sf_result * LSZR, gsl_sf_result * LSZI)
+ This function computes the logarithm of the complex sine,
+ \log(\sin(z_r + i z_i)) storing the real and imaginary parts in
+ SZR, SZI.
+
+
+File: gsl-ref.info, Node: Hyperbolic Trigonometric Functions, Next: Conversion Functions, Prev: Trigonometric Functions for Complex Arguments, Up: Trigonometric Functions
+
+7.31.3 Hyperbolic Trigonometric Functions
+-----------------------------------------
+
+ -- Function: double gsl_sf_lnsinh (double X)
+ -- Function: int gsl_sf_lnsinh_e (double X, gsl_sf_result * RESULT)
+ These routines compute \log(\sinh(x)) for x > 0.
+
+ -- Function: double gsl_sf_lncosh (double X)
+ -- Function: int gsl_sf_lncosh_e (double X, gsl_sf_result * RESULT)
+ These routines compute \log(\cosh(x)) for any X.
+
+
+File: gsl-ref.info, Node: Conversion Functions, Next: Restriction Functions, Prev: Hyperbolic Trigonometric Functions, Up: Trigonometric Functions
+
+7.31.4 Conversion Functions
+---------------------------
+
+ -- Function: int gsl_sf_polar_to_rect (double R, double THETA,
+ gsl_sf_result * X, gsl_sf_result * Y);
+ This function converts the polar coordinates (R,THETA) to
+ rectilinear coordinates (X,Y), x = r\cos(\theta), y =
+ r\sin(\theta).
+
+ -- Function: int gsl_sf_rect_to_polar (double X, double Y,
+ gsl_sf_result * R, gsl_sf_result * THETA)
+ This function converts the rectilinear coordinates (X,Y) to polar
+ coordinates (R,THETA), such that x = r\cos(\theta), y =
+ r\sin(\theta). The argument THETA lies in the range [-\pi, \pi].
+
+
+File: gsl-ref.info, Node: Restriction Functions, Next: Trigonometric Functions With Error Estimates, Prev: Conversion Functions, Up: Trigonometric Functions
+
+7.31.5 Restriction Functions
+----------------------------
+
+ -- Function: double gsl_sf_angle_restrict_symm (double THETA)
+ -- Function: int gsl_sf_angle_restrict_symm_e (double * THETA)
+ These routines force the angle THETA to lie in the range
+ (-\pi,\pi].
+
+ Note that the mathematical value of \pi is slightly greater than
+ `M_PI', so the machine numbers `M_PI' and `-M_PI' are included in
+ the range.
+
+ -- Function: double gsl_sf_angle_restrict_pos (double THETA)
+ -- Function: int gsl_sf_angle_restrict_pos_e (double * THETA)
+ These routines force the angle THETA to lie in the range [0, 2\pi).
+
+ Note that the mathematical value of 2\pi is slightly greater than
+ `2*M_PI', so the machine number `2*M_PI' is included in the range.
+
+
+
+File: gsl-ref.info, Node: Trigonometric Functions With Error Estimates, Prev: Restriction Functions, Up: Trigonometric Functions
+
+7.31.6 Trigonometric Functions With Error Estimates
+---------------------------------------------------
+
+ -- Function: int gsl_sf_sin_err_e (double X, double DX, gsl_sf_result
+ * RESULT)
+ This routine computes the sine of an angle X with an associated
+ absolute error DX, \sin(x \pm dx). Note that this function is
+ provided in the error-handling form only since its purpose is to
+ compute the propagated error.
+
+ -- Function: int gsl_sf_cos_err_e (double X, double DX, gsl_sf_result
+ * RESULT)
+ This routine computes the cosine of an angle X with an associated
+ absolute error DX, \cos(x \pm dx). Note that this function is
+ provided in the error-handling form only since its purpose is to
+ compute the propagated error.
+
+
+File: gsl-ref.info, Node: Zeta Functions, Next: Special Functions Examples, Prev: Trigonometric Functions, Up: Special Functions
+
+7.32 Zeta Functions
+===================
+
+The Riemann zeta function is defined in Abramowitz & Stegun, Section
+23.2. The functions described in this section are declared in the
+header file `gsl_sf_zeta.h'.
+
+* Menu:
+
+* Riemann Zeta Function::
+* Riemann Zeta Function Minus One::
+* Hurwitz Zeta Function::
+* Eta Function::
+
+
+File: gsl-ref.info, Node: Riemann Zeta Function, Next: Riemann Zeta Function Minus One, Up: Zeta Functions
+
+7.32.1 Riemann Zeta Function
+----------------------------
+
+The Riemann zeta function is defined by the infinite sum \zeta(s) =
+\sum_{k=1}^\infty k^{-s}.
+
+ -- Function: double gsl_sf_zeta_int (int N)
+ -- Function: int gsl_sf_zeta_int_e (int N, gsl_sf_result * RESULT)
+ These routines compute the Riemann zeta function \zeta(n) for
+ integer N, n \ne 1.
+
+ -- Function: double gsl_sf_zeta (double S)
+ -- Function: int gsl_sf_zeta_e (double S, gsl_sf_result * RESULT)
+ These routines compute the Riemann zeta function \zeta(s) for
+ arbitrary S, s \ne 1.
+
+
+File: gsl-ref.info, Node: Riemann Zeta Function Minus One, Next: Hurwitz Zeta Function, Prev: Riemann Zeta Function, Up: Zeta Functions
+
+7.32.2 Riemann Zeta Function Minus One
+--------------------------------------
+
+For large positive argument, the Riemann zeta function approaches one.
+In this region the fractional part is interesting, and therefore we
+need a function to evaluate it explicitly.
+
+ -- Function: double gsl_sf_zetam1_int (int N)
+ -- Function: int gsl_sf_zetam1_int_e (int N, gsl_sf_result * RESULT)
+ These routines compute \zeta(n) - 1 for integer N, n \ne 1.
+
+ -- Function: double gsl_sf_zetam1 (double S)
+ -- Function: int gsl_sf_zetam1_e (double S, gsl_sf_result * RESULT)
+ These routines compute \zeta(s) - 1 for arbitrary S, s \ne 1.
+
+
+File: gsl-ref.info, Node: Hurwitz Zeta Function, Next: Eta Function, Prev: Riemann Zeta Function Minus One, Up: Zeta Functions
+
+7.32.3 Hurwitz Zeta Function
+----------------------------
+
+The Hurwitz zeta function is defined by \zeta(s,q) = \sum_0^\infty
+(k+q)^{-s}.
+
+ -- Function: double gsl_sf_hzeta (double S, double Q)
+ -- Function: int gsl_sf_hzeta_e (double S, double Q, gsl_sf_result *
+ RESULT)
+ These routines compute the Hurwitz zeta function \zeta(s,q) for s
+ > 1, q > 0.
+
+
+File: gsl-ref.info, Node: Eta Function, Prev: Hurwitz Zeta Function, Up: Zeta Functions
+
+7.32.4 Eta Function
+-------------------
+
+The eta function is defined by \eta(s) = (1-2^{1-s}) \zeta(s).
+
+ -- Function: double gsl_sf_eta_int (int N)
+ -- Function: int gsl_sf_eta_int_e (int N, gsl_sf_result * RESULT)
+ These routines compute the eta function \eta(n) for integer N.
+
+ -- Function: double gsl_sf_eta (double S)
+ -- Function: int gsl_sf_eta_e (double S, gsl_sf_result * RESULT)
+ These routines compute the eta function \eta(s) for arbitrary S.
+
+
+File: gsl-ref.info, Node: Special Functions Examples, Next: Special Functions References and Further Reading, Prev: Zeta Functions, Up: Special Functions
+
+7.33 Examples
+=============
+
+The following example demonstrates the use of the error handling form of
+the special functions, in this case to compute the Bessel function
+J_0(5.0),
+
+ #include <stdio.h>
+ #include <gsl/gsl_errno.h>
+ #include <gsl/gsl_sf_bessel.h>
+
+ int
+ main (void)
+ {
+ double x = 5.0;
+ gsl_sf_result result;
+
+ double expected = -0.17759677131433830434739701;
+
+ int status = gsl_sf_bessel_J0_e (x, &result);
+
+ printf ("status = %s\n", gsl_strerror(status));
+ printf ("J0(5.0) = %.18f\n"
+ " +/- % .18f\n",
+ result.val, result.err);
+ printf ("exact = %.18f\n", expected);
+ return status;
+ }
+
+Here are the results of running the program,
+
+ $ ./a.out
+ status = success
+ J0(5.0) = -0.177596771314338292
+ +/- 0.000000000000000193
+ exact = -0.177596771314338292
+
+The next program computes the same quantity using the natural form of
+the function. In this case the error term RESULT.ERR and return status
+are not accessible.
+
+ #include <stdio.h>
+ #include <gsl/gsl_sf_bessel.h>
+
+ int
+ main (void)
+ {
+ double x = 5.0;
+ double expected = -0.17759677131433830434739701;
+
+ double y = gsl_sf_bessel_J0 (x);
+
+ printf ("J0(5.0) = %.18f\n", y);
+ printf ("exact = %.18f\n", expected);
+ return 0;
+ }
+
+The results of the function are the same,
+
+ $ ./a.out
+ J0(5.0) = -0.177596771314338292
+ exact = -0.177596771314338292
+
+
+File: gsl-ref.info, Node: Special Functions References and Further Reading, Prev: Special Functions Examples, Up: Special Functions
+
+7.34 References and Further Reading
+===================================
+
+The library follows the conventions of `Abramowitz & Stegun' where
+possible,
+ Abramowitz & Stegun (eds.), `Handbook of Mathematical Functions'
+
+The following papers contain information on the algorithms used to
+compute the special functions,
+ MISCFUN: A software package to compute uncommon special functions.
+ `ACM Trans. Math. Soft.', vol. 22, 1996, 288-301
+
+ G.N. Watson, A Treatise on the Theory of Bessel Functions, 2nd
+ Edition (Cambridge University Press, 1944).
+
+ G. Nemeth, Mathematical Approximations of Special Functions, Nova
+ Science Publishers, ISBN 1-56072-052-2
+
+ B.C. Carlson, Special Functions of Applied Mathematics (1977)
+
+ W.J. Thompson, Atlas for Computing Mathematical Functions, John
+ Wiley & Sons, New York (1997).
+
+ Y.Y. Luke, Algorithms for the Computation of Mathematical
+ Functions, Academic Press, New York (1977).
+
+
+
+File: gsl-ref.info, Node: Vectors and Matrices, Next: Permutations, Prev: Special Functions, Up: Top
+
+8 Vectors and Matrices
+**********************
+
+The functions described in this chapter provide a simple vector and
+matrix interface to ordinary C arrays. The memory management of these
+arrays is implemented using a single underlying type, known as a block.
+By writing your functions in terms of vectors and matrices you can pass
+a single structure containing both data and dimensions as an argument
+without needing additional function parameters. The structures are
+compatible with the vector and matrix formats used by BLAS routines.
+
+* Menu:
+
+* Data types::
+* Blocks::
+* Vectors::
+* Matrices::
+* Vector and Matrix References and Further Reading::
+
+
+File: gsl-ref.info, Node: Data types, Next: Blocks, Up: Vectors and Matrices
+
+8.1 Data types
+==============
+
+All the functions are available for each of the standard data-types.
+The versions for `double' have the prefix `gsl_block', `gsl_vector' and
+`gsl_matrix'. Similarly the versions for single-precision `float'
+arrays have the prefix `gsl_block_float', `gsl_vector_float' and
+`gsl_matrix_float'. The full list of available types is given below,
+
+ gsl_block double
+ gsl_block_float float
+ gsl_block_long_double long double
+ gsl_block_int int
+ gsl_block_uint unsigned int
+ gsl_block_long long
+ gsl_block_ulong unsigned long
+ gsl_block_short short
+ gsl_block_ushort unsigned short
+ gsl_block_char char
+ gsl_block_uchar unsigned char
+ gsl_block_complex complex double
+ gsl_block_complex_float complex float
+ gsl_block_complex_long_double complex long double
+
+Corresponding types exist for the `gsl_vector' and `gsl_matrix'
+functions.
+
+
+File: gsl-ref.info, Node: Blocks, Next: Vectors, Prev: Data types, Up: Vectors and Matrices
+
+8.2 Blocks
+==========
+
+For consistency all memory is allocated through a `gsl_block'
+structure. The structure contains two components, the size of an area
+of memory and a pointer to the memory. The `gsl_block' structure looks
+like this,
+
+ typedef struct
+ {
+ size_t size;
+ double * data;
+ } gsl_block;
+
+Vectors and matrices are made by "slicing" an underlying block. A slice
+is a set of elements formed from an initial offset and a combination of
+indices and step-sizes. In the case of a matrix the step-size for the
+column index represents the row-length. The step-size for a vector is
+known as the "stride".
+
+ The functions for allocating and deallocating blocks are defined in
+`gsl_block.h'
+
+* Menu:
+
+* Block allocation::
+* Reading and writing blocks::
+* Example programs for blocks::
+
+
+File: gsl-ref.info, Node: Block allocation, Next: Reading and writing blocks, Up: Blocks
+
+8.2.1 Block allocation
+----------------------
+
+The functions for allocating memory to a block follow the style of
+`malloc' and `free'. In addition they also perform their own error
+checking. If there is insufficient memory available to allocate a
+block then the functions call the GSL error handler (with an error
+number of `GSL_ENOMEM') in addition to returning a null pointer. Thus
+if you use the library error handler to abort your program then it
+isn't necessary to check every `alloc'.
+
+ -- Function: gsl_block * gsl_block_alloc (size_t N)
+ This function allocates memory for a block of N double-precision
+ elements, returning a pointer to the block struct. The block is
+ not initialized and so the values of its elements are undefined.
+ Use the function `gsl_block_calloc' if you want to ensure that all
+ the elements are initialized to zero.
+
+ A null pointer is returned if insufficient memory is available to
+ create the block.
+
+ -- Function: gsl_block * gsl_block_calloc (size_t N)
+ This function allocates memory for a block and initializes all the
+ elements of the block to zero.
+
+ -- Function: void gsl_block_free (gsl_block * B)
+ This function frees the memory used by a block B previously
+ allocated with `gsl_block_alloc' or `gsl_block_calloc'. The block
+ B must be a valid block object (a null pointer is not allowed).
+
+
+File: gsl-ref.info, Node: Reading and writing blocks, Next: Example programs for blocks, Prev: Block allocation, Up: Blocks
+
+8.2.2 Reading and writing blocks
+--------------------------------
+
+The library provides functions for reading and writing blocks to a file
+as binary data or formatted text.
+
+ -- Function: int gsl_block_fwrite (FILE * STREAM, const gsl_block * B)
+ This function writes the elements of the block B to the stream
+ STREAM in binary format. The return value is 0 for success and
+ `GSL_EFAILED' if there was a problem writing to the file. Since
+ the data is written in the native binary format it may not be
+ portable between different architectures.
+
+ -- Function: int gsl_block_fread (FILE * STREAM, gsl_block * B)
+ This function reads into the block B from the open stream STREAM
+ in binary format. The block B must be preallocated with the
+ correct length since the function uses the size of B to determine
+ how many bytes to read. The return value is 0 for success and
+ `GSL_EFAILED' if there was a problem reading from the file. The
+ data is assumed to have been written in the native binary format
+ on the same architecture.
+
+ -- Function: int gsl_block_fprintf (FILE * STREAM, const gsl_block *
+ B, const char * FORMAT)
+ This function writes the elements of the block B line-by-line to
+ the stream STREAM using the format specifier FORMAT, which should
+ be one of the `%g', `%e' or `%f' formats for floating point
+ numbers and `%d' for integers. The function returns 0 for success
+ and `GSL_EFAILED' if there was a problem writing to the file.
+
+ -- Function: int gsl_block_fscanf (FILE * STREAM, gsl_block * B)
+ This function reads formatted data from the stream STREAM into the
+ block B. The block B must be preallocated with the correct length
+ since the function uses the size of B to determine how many
+ numbers to read. The function returns 0 for success and
+ `GSL_EFAILED' if there was a problem reading from the file.
+
+
+File: gsl-ref.info, Node: Example programs for blocks, Prev: Reading and writing blocks, Up: Blocks
+
+8.2.3 Example programs for blocks
+---------------------------------
+
+The following program shows how to allocate a block,
+
+ #include <stdio.h>
+ #include <gsl/gsl_block.h>
+
+ int
+ main (void)
+ {
+ gsl_block * b = gsl_block_alloc (100);
+
+ printf ("length of block = %u\n", b->size);
+ printf ("block data address = %#x\n", b->data);
+
+ gsl_block_free (b);
+ return 0;
+ }
+
+Here is the output from the program,
+
+ length of block = 100
+ block data address = 0x804b0d8
+
+
+File: gsl-ref.info, Node: Vectors, Next: Matrices, Prev: Blocks, Up: Vectors and Matrices
+
+8.3 Vectors
+===========
+
+Vectors are defined by a `gsl_vector' structure which describes a slice
+of a block. Different vectors can be created which point to the same
+block. A vector slice is a set of equally-spaced elements of an area
+of memory.
+
+ The `gsl_vector' structure contains five components, the "size", the
+"stride", a pointer to the memory where the elements are stored, DATA,
+a pointer to the block owned by the vector, BLOCK, if any, and an
+ownership flag, OWNER. The structure is very simple and looks like
+this,
+
+ typedef struct
+ {
+ size_t size;
+ size_t stride;
+ double * data;
+ gsl_block * block;
+ int owner;
+ } gsl_vector;
+
+The SIZE is simply the number of vector elements. The range of valid
+indices runs from 0 to `size-1'. The STRIDE is the step-size from one
+element to the next in physical memory, measured in units of the
+appropriate datatype. The pointer DATA gives the location of the first
+element of the vector in memory. The pointer BLOCK stores the location
+of the memory block in which the vector elements are located (if any).
+If the vector owns this block then the OWNER field is set to one and
+the block will be deallocated when the vector is freed. If the vector
+points to a block owned by another object then the OWNER field is zero
+and any underlying block will not be deallocated with the vector.
+
+ The functions for allocating and accessing vectors are defined in
+`gsl_vector.h'
+
+* Menu:
+
+* Vector allocation::
+* Accessing vector elements::
+* Initializing vector elements::
+* Reading and writing vectors::
+* Vector views::
+* Copying vectors::
+* Exchanging elements::
+* Vector operations::
+* Finding maximum and minimum elements of vectors::
+* Vector properties::
+* Example programs for vectors::
+
+
+File: gsl-ref.info, Node: Vector allocation, Next: Accessing vector elements, Up: Vectors
+
+8.3.1 Vector allocation
+-----------------------
+
+The functions for allocating memory to a vector follow the style of
+`malloc' and `free'. In addition they also perform their own error
+checking. If there is insufficient memory available to allocate a
+vector then the functions call the GSL error handler (with an error
+number of `GSL_ENOMEM') in addition to returning a null pointer. Thus
+if you use the library error handler to abort your program then it
+isn't necessary to check every `alloc'.
+
+ -- Function: gsl_vector * gsl_vector_alloc (size_t N)
+ This function creates a vector of length N, returning a pointer to
+ a newly initialized vector struct. A new block is allocated for the
+ elements of the vector, and stored in the BLOCK component of the
+ vector struct. The block is "owned" by the vector, and will be
+ deallocated when the vector is deallocated.
+
+ -- Function: gsl_vector * gsl_vector_calloc (size_t N)
+ This function allocates memory for a vector of length N and
+ initializes all the elements of the vector to zero.
+
+ -- Function: void gsl_vector_free (gsl_vector * V)
+ This function frees a previously allocated vector V. If the
+ vector was created using `gsl_vector_alloc' then the block
+ underlying the vector will also be deallocated. If the vector has
+ been created from another object then the memory is still owned by
+ that object and will not be deallocated. The vector V must be a
+ valid vector object (a null pointer is not allowed).
+
+
+File: gsl-ref.info, Node: Accessing vector elements, Next: Initializing vector elements, Prev: Vector allocation, Up: Vectors
+
+8.3.2 Accessing vector elements
+-------------------------------
+
+Unlike FORTRAN compilers, C compilers do not usually provide support
+for range checking of vectors and matrices. Range checking is
+available in the GNU C Compiler bounds-checking extension, but it is not
+part of the default installation of GCC. The functions
+`gsl_vector_get' and `gsl_vector_set' can perform portable range
+checking for you and report an error if you attempt to access elements
+outside the allowed range.
+
+ The functions for accessing the elements of a vector or matrix are
+defined in `gsl_vector.h' and declared `extern inline' to eliminate
+function-call overhead. You must compile your program with the macro
+`HAVE_INLINE' defined to use these functions.
+
+ If necessary you can turn off range checking completely without
+modifying any source files by recompiling your program with the
+preprocessor definition `GSL_RANGE_CHECK_OFF'. Provided your compiler
+supports inline functions the effect of turning off range checking is
+to replace calls to `gsl_vector_get(v,i)' by `v->data[i*v->stride]' and
+calls to `gsl_vector_set(v,i,x)' by `v->data[i*v->stride]=x'. Thus
+there should be no performance penalty for using the range checking
+functions when range checking is turned off.
+
+ -- Function: double gsl_vector_get (const gsl_vector * V, size_t I)
+ This function returns the I-th element of a vector V. If I lies
+ outside the allowed range of 0 to N-1 then the error handler is
+ invoked and 0 is returned.
+
+ -- Function: void gsl_vector_set (gsl_vector * V, size_t I, double X)
+ This function sets the value of the I-th element of a vector V to
+ X. If I lies outside the allowed range of 0 to N-1 then the error
+ handler is invoked.
+
+ -- Function: double * gsl_vector_ptr (gsl_vector * V, size_t I)
+ -- Function: const double * gsl_vector_const_ptr (const gsl_vector *
+ V, size_t I)
+ These functions return a pointer to the I-th element of a vector
+ V. If I lies outside the allowed range of 0 to N-1 then the error
+ handler is invoked and a null pointer is returned.
+
+
+File: gsl-ref.info, Node: Initializing vector elements, Next: Reading and writing vectors, Prev: Accessing vector elements, Up: Vectors
+
+8.3.3 Initializing vector elements
+----------------------------------
+
+ -- Function: void gsl_vector_set_all (gsl_vector * V, double X)
+ This function sets all the elements of the vector V to the value X.
+
+ -- Function: void gsl_vector_set_zero (gsl_vector * V)
+ This function sets all the elements of the vector V to zero.
+
+ -- Function: int gsl_vector_set_basis (gsl_vector * V, size_t I)
+ This function makes a basis vector by setting all the elements of
+ the vector V to zero except for the I-th element which is set to
+ one.
+
+
+File: gsl-ref.info, Node: Reading and writing vectors, Next: Vector views, Prev: Initializing vector elements, Up: Vectors
+
+8.3.4 Reading and writing vectors
+---------------------------------
+
+The library provides functions for reading and writing vectors to a file
+as binary data or formatted text.
+
+ -- Function: int gsl_vector_fwrite (FILE * STREAM, const gsl_vector *
+ V)
+ This function writes the elements of the vector V to the stream
+ STREAM in binary format. The return value is 0 for success and
+ `GSL_EFAILED' if there was a problem writing to the file. Since
+ the data is written in the native binary format it may not be
+ portable between different architectures.
+
+ -- Function: int gsl_vector_fread (FILE * STREAM, gsl_vector * V)
+ This function reads into the vector V from the open stream STREAM
+ in binary format. The vector V must be preallocated with the
+ correct length since the function uses the size of V to determine
+ how many bytes to read. The return value is 0 for success and
+ `GSL_EFAILED' if there was a problem reading from the file. The
+ data is assumed to have been written in the native binary format
+ on the same architecture.
+
+ -- Function: int gsl_vector_fprintf (FILE * STREAM, const gsl_vector *
+ V, const char * FORMAT)
+ This function writes the elements of the vector V line-by-line to
+ the stream STREAM using the format specifier FORMAT, which should
+ be one of the `%g', `%e' or `%f' formats for floating point
+ numbers and `%d' for integers. The function returns 0 for success
+ and `GSL_EFAILED' if there was a problem writing to the file.
+
+ -- Function: int gsl_vector_fscanf (FILE * STREAM, gsl_vector * V)
+ This function reads formatted data from the stream STREAM into the
+ vector V. The vector V must be preallocated with the correct
+ length since the function uses the size of V to determine how many
+ numbers to read. The function returns 0 for success and
+ `GSL_EFAILED' if there was a problem reading from the file.
+
+
+File: gsl-ref.info, Node: Vector views, Next: Copying vectors, Prev: Reading and writing vectors, Up: Vectors
+
+8.3.5 Vector views
+------------------
+
+In addition to creating vectors from slices of blocks it is also
+possible to slice vectors and create vector views. For example, a
+subvector of another vector can be described with a view, or two views
+can be made which provide access to the even and odd elements of a
+vector.
+
+ A vector view is a temporary object, stored on the stack, which can
+be used to operate on a subset of vector elements. Vector views can be
+defined for both constant and non-constant vectors, using separate types
+that preserve constness. A vector view has the type `gsl_vector_view'
+and a constant vector view has the type `gsl_vector_const_view'. In
+both cases the elements of the view can be accessed as a `gsl_vector'
+using the `vector' component of the view object. A pointer to a vector
+of type `gsl_vector *' or `const gsl_vector *' can be obtained by
+taking the address of this component with the `&' operator.
+
+ When using this pointer it is important to ensure that the view
+itself remains in scope--the simplest way to do so is by always writing
+the pointer as `&'VIEW`.vector', and never storing this value in
+another variable.
+
+ -- Function: gsl_vector_view gsl_vector_subvector (gsl_vector * V,
+ size_t OFFSET, size_t N)
+ -- Function: gsl_vector_const_view gsl_vector_const_subvector (const
+ gsl_vector * V, size_t OFFSET, size_t N)
+ These functions return a vector view of a subvector of another
+ vector V. The start of the new vector is offset by OFFSET elements
+ from the start of the original vector. The new vector has N
+ elements. Mathematically, the I-th element of the new vector V'
+ is given by,
+
+ v'(i) = v->data[(offset + i)*v->stride]
+
+ where the index I runs from 0 to `n-1'.
+
+ The `data' pointer of the returned vector struct is set to null if
+ the combined parameters (OFFSET,N) overrun the end of the original
+ vector.
+
+ The new vector is only a view of the block underlying the original
+ vector, V. The block containing the elements of V is not owned by
+ the new vector. When the view goes out of scope the original
+ vector V and its block will continue to exist. The original
+ memory can only be deallocated by freeing the original vector. Of
+ course, the original vector should not be deallocated while the
+ view is still in use.
+
+ The function `gsl_vector_const_subvector' is equivalent to
+ `gsl_vector_subvector' but can be used for vectors which are
+ declared `const'.
+
+ -- Function: gsl_vector_view gsl_vector_subvector_with_stride
+ (gsl_vector * V, size_t OFFSET, size_t STRIDE, size_t N)
+ -- Function: gsl_vector_const_view
+gsl_vector_const_subvector_with_stride (const gsl_vector * V, size_t
+ OFFSET, size_t STRIDE, size_t N)
+ These functions return a vector view of a subvector of another
+ vector V with an additional stride argument. The subvector is
+ formed in the same way as for `gsl_vector_subvector' but the new
+ vector has N elements with a step-size of STRIDE from one element
+ to the next in the original vector. Mathematically, the I-th
+ element of the new vector V' is given by,
+
+ v'(i) = v->data[(offset + i*stride)*v->stride]
+
+ where the index I runs from 0 to `n-1'.
+
+ Note that subvector views give direct access to the underlying
+ elements of the original vector. For example, the following code
+ will zero the even elements of the vector `v' of length `n', while
+ leaving the odd elements untouched,
+
+ gsl_vector_view v_even
+ = gsl_vector_subvector_with_stride (v, 0, 2, n/2);
+ gsl_vector_set_zero (&v_even.vector);
+
+ A vector view can be passed to any subroutine which takes a vector
+ argument just as a directly allocated vector would be, using
+ `&'VIEW`.vector'. For example, the following code computes the
+ norm of the odd elements of `v' using the BLAS routine DNRM2,
+
+ gsl_vector_view v_odd
+ = gsl_vector_subvector_with_stride (v, 1, 2, n/2);
+ double r = gsl_blas_dnrm2 (&v_odd.vector);
+
+ The function `gsl_vector_const_subvector_with_stride' is equivalent
+ to `gsl_vector_subvector_with_stride' but can be used for vectors
+ which are declared `const'.
+
+ -- Function: gsl_vector_view gsl_vector_complex_real
+ (gsl_vector_complex * V)
+ -- Function: gsl_vector_const_view gsl_vector_complex_const_real
+ (const gsl_vector_complex * V)
+ These functions return a vector view of the real parts of the
+ complex vector V.
+
+ The function `gsl_vector_complex_const_real' is equivalent to
+ `gsl_vector_complex_real' but can be used for vectors which are
+ declared `const'.
+
+ -- Function: gsl_vector_view gsl_vector_complex_imag
+ (gsl_vector_complex * V)
+ -- Function: gsl_vector_const_view gsl_vector_complex_const_imag
+ (const gsl_vector_complex * V)
+ These functions return a vector view of the imaginary parts of the
+ complex vector V.
+
+ The function `gsl_vector_complex_const_imag' is equivalent to
+ `gsl_vector_complex_imag' but can be used for vectors which are
+ declared `const'.
+
+ -- Function: gsl_vector_view gsl_vector_view_array (double * BASE,
+ size_t N)
+ -- Function: gsl_vector_const_view gsl_vector_const_view_array (const
+ double * BASE, size_t N)
+ These functions return a vector view of an array. The start of
+ the new vector is given by BASE and has N elements.
+ Mathematically, the I-th element of the new vector V' is given by,
+
+ v'(i) = base[i]
+
+ where the index I runs from 0 to `n-1'.
+
+ The array containing the elements of V is not owned by the new
+ vector view. When the view goes out of scope the original array
+ will continue to exist. The original memory can only be
+ deallocated by freeing the original pointer BASE. Of course, the
+ original array should not be deallocated while the view is still
+ in use.
+
+ The function `gsl_vector_const_view_array' is equivalent to
+ `gsl_vector_view_array' but can be used for arrays which are
+ declared `const'.
+
+ -- Function: gsl_vector_view gsl_vector_view_array_with_stride (double
+ * BASE, size_t STRIDE, size_t N)
+ -- Function: gsl_vector_const_view
+gsl_vector_const_view_array_with_stride (const double * BASE, size_t
+ STRIDE, size_t N)
+ These functions return a vector view of an array BASE with an
+ additional stride argument. The subvector is formed in the same
+ way as for `gsl_vector_view_array' but the new vector has N
+ elements with a step-size of STRIDE from one element to the next
+ in the original array. Mathematically, the I-th element of the new
+ vector V' is given by,
+
+ v'(i) = base[i*stride]
+
+ where the index I runs from 0 to `n-1'.
+
+ Note that the view gives direct access to the underlying elements
+ of the original array. A vector view can be passed to any
+ subroutine which takes a vector argument just as a directly
+ allocated vector would be, using `&'VIEW`.vector'.
+
+ The function `gsl_vector_const_view_array_with_stride' is
+ equivalent to `gsl_vector_view_array_with_stride' but can be used
+ for arrays which are declared `const'.
+
+
+File: gsl-ref.info, Node: Copying vectors, Next: Exchanging elements, Prev: Vector views, Up: Vectors
+
+8.3.6 Copying vectors
+---------------------
+
+Common operations on vectors such as addition and multiplication are
+available in the BLAS part of the library (*note BLAS Support::).
+However, it is useful to have a small number of utility functions which
+do not require the full BLAS code. The following functions fall into
+this category.
+
+ -- Function: int gsl_vector_memcpy (gsl_vector * DEST, const
+ gsl_vector * SRC)
+ This function copies the elements of the vector SRC into the
+ vector DEST. The two vectors must have the same length.
+
+ -- Function: int gsl_vector_swap (gsl_vector * V, gsl_vector * W)
+ This function exchanges the elements of the vectors V and W by
+ copying. The two vectors must have the same length.
+
+
+File: gsl-ref.info, Node: Exchanging elements, Next: Vector operations, Prev: Copying vectors, Up: Vectors
+
+8.3.7 Exchanging elements
+-------------------------
+
+The following function can be used to exchange, or permute, the elements
+of a vector.
+
+ -- Function: int gsl_vector_swap_elements (gsl_vector * V, size_t I,
+ size_t J)
+ This function exchanges the I-th and J-th elements of the vector V
+ in-place.
+
+ -- Function: int gsl_vector_reverse (gsl_vector * V)
+ This function reverses the order of the elements of the vector V.
+
+
+File: gsl-ref.info, Node: Vector operations, Next: Finding maximum and minimum elements of vectors, Prev: Exchanging elements, Up: Vectors
+
+8.3.8 Vector operations
+-----------------------
+
+The following operations are only defined for real vectors.
+
+ -- Function: int gsl_vector_add (gsl_vector * A, const gsl_vector * B)
+ This function adds the elements of vector B to the elements of
+ vector A, a'_i = a_i + b_i. The two vectors must have the same
+ length.
+
+ -- Function: int gsl_vector_sub (gsl_vector * A, const gsl_vector * B)
+ This function subtracts the elements of vector B from the elements
+ of vector A, a'_i = a_i - b_i. The two vectors must have the same
+ length.
+
+ -- Function: int gsl_vector_mul (gsl_vector * A, const gsl_vector * B)
+ This function multiplies the elements of vector A by the elements
+ of vector B, a'_i = a_i * b_i. The two vectors must have the same
+ length.
+
+ -- Function: int gsl_vector_div (gsl_vector * A, const gsl_vector * B)
+ This function divides the elements of vector A by the elements of
+ vector B, a'_i = a_i / b_i. The two vectors must have the same
+ length.
+
+ -- Function: int gsl_vector_scale (gsl_vector * A, const double X)
+ This function multiplies the elements of vector A by the constant
+ factor X, a'_i = x a_i.
+
+ -- Function: int gsl_vector_add_constant (gsl_vector * A, const double
+ X)
+ This function adds the constant value X to the elements of the
+ vector A, a'_i = a_i + x.
+
+
+File: gsl-ref.info, Node: Finding maximum and minimum elements of vectors, Next: Vector properties, Prev: Vector operations, Up: Vectors
+
+8.3.9 Finding maximum and minimum elements of vectors
+-----------------------------------------------------
+
+ -- Function: double gsl_vector_max (const gsl_vector * V)
+ This function returns the maximum value in the vector V.
+
+ -- Function: double gsl_vector_min (const gsl_vector * V)
+ This function returns the minimum value in the vector V.
+
+ -- Function: void gsl_vector_minmax (const gsl_vector * V, double *
+ MIN_OUT, double * MAX_OUT)
+ This function returns the minimum and maximum values in the vector
+ V, storing them in MIN_OUT and MAX_OUT.
+
+ -- Function: size_t gsl_vector_max_index (const gsl_vector * V)
+ This function returns the index of the maximum value in the vector
+ V. When there are several equal maximum elements then the lowest
+ index is returned.
+
+ -- Function: size_t gsl_vector_min_index (const gsl_vector * V)
+ This function returns the index of the minimum value in the vector
+ V. When there are several equal minimum elements then the lowest
+ index is returned.
+
+ -- Function: void gsl_vector_minmax_index (const gsl_vector * V,
+ size_t * IMIN, size_t * IMAX)
+ This function returns the indices of the minimum and maximum
+ values in the vector V, storing them in IMIN and IMAX. When there
+ are several equal minimum or maximum elements then the lowest
+ indices are returned.
+
+
+File: gsl-ref.info, Node: Vector properties, Next: Example programs for vectors, Prev: Finding maximum and minimum elements of vectors, Up: Vectors
+
+8.3.10 Vector properties
+------------------------
+
+ -- Function: int gsl_vector_isnull (const gsl_vector * V)
+ -- Function: int gsl_vector_ispos (const gsl_vector * V)
+ -- Function: int gsl_vector_isneg (const gsl_vector * V)
+ These functions return 1 if all the elements of the vector V are
+ zero, strictly positive, or strictly negative respectively, and 0
+ otherwise. To test for a non-negative vector, use the expression
+ `!gsl_vector_isneg(v)'.
+
+
+File: gsl-ref.info, Node: Example programs for vectors, Prev: Vector properties, Up: Vectors
+
+8.3.11 Example programs for vectors
+-----------------------------------
+
+This program shows how to allocate, initialize and read from a vector
+using the functions `gsl_vector_alloc', `gsl_vector_set' and
+`gsl_vector_get'.
+
+ #include <stdio.h>
+ #include <gsl/gsl_vector.h>
+
+ int
+ main (void)
+ {
+ int i;
+ gsl_vector * v = gsl_vector_alloc (3);
+
+ for (i = 0; i < 3; i++)
+ {
+ gsl_vector_set (v, i, 1.23 + i);
+ }
+
+ for (i = 0; i < 100; i++) /* OUT OF RANGE ERROR */
+ {
+ printf ("v_%d = %g\n", i, gsl_vector_get (v, i));
+ }
+
+ gsl_vector_free (v);
+ return 0;
+ }
+
+Here is the output from the program. The final loop attempts to read
+outside the range of the vector `v', and the error is trapped by the
+range-checking code in `gsl_vector_get'.
+
+ $ ./a.out
+ v_0 = 1.23
+ v_1 = 2.23
+ v_2 = 3.23
+ gsl: vector_source.c:12: ERROR: index out of range
+ Default GSL error handler invoked.
+ Aborted (core dumped)
+
+The next program shows how to write a vector to a file.
+
+ #include <stdio.h>
+ #include <gsl/gsl_vector.h>
+
+ int
+ main (void)
+ {
+ int i;
+ gsl_vector * v = gsl_vector_alloc (100);
+
+ for (i = 0; i < 100; i++)
+ {
+ gsl_vector_set (v, i, 1.23 + i);
+ }
+
+ {
+ FILE * f = fopen ("test.dat", "w");
+ gsl_vector_fprintf (f, v, "%.5g");
+ fclose (f);
+ }
+
+ gsl_vector_free (v);
+ return 0;
+ }
+
+After running this program the file `test.dat' should contain the
+elements of `v', written using the format specifier `%.5g'. The vector
+could then be read back in using the function `gsl_vector_fscanf (f,
+v)' as follows:
+
+ #include <stdio.h>
+ #include <gsl/gsl_vector.h>
+
+ int
+ main (void)
+ {
+ int i;
+ gsl_vector * v = gsl_vector_alloc (10);
+
+ {
+ FILE * f = fopen ("test.dat", "r");
+ gsl_vector_fscanf (f, v);
+ fclose (f);
+ }
+
+ for (i = 0; i < 10; i++)
+ {
+ printf ("%g\n", gsl_vector_get(v, i));
+ }
+
+ gsl_vector_free (v);
+ return 0;
+ }
+
+
+File: gsl-ref.info, Node: Matrices, Next: Vector and Matrix References and Further Reading, Prev: Vectors, Up: Vectors and Matrices
+
+8.4 Matrices
+============
+
+Matrices are defined by a `gsl_matrix' structure which describes a
+generalized slice of a block. Like a vector it represents a set of
+elements in an area of memory, but uses two indices instead of one.
+
+ The `gsl_matrix' structure contains six components, the two
+dimensions of the matrix, a physical dimension, a pointer to the memory
+where the elements of the matrix are stored, DATA, a pointer to the
+block owned by the matrix BLOCK, if any, and an ownership flag, OWNER.
+The physical dimension determines the memory layout and can differ from
+the matrix dimension to allow the use of submatrices. The `gsl_matrix'
+structure is very simple and looks like this,
+
+ typedef struct
+ {
+ size_t size1;
+ size_t size2;
+ size_t tda;
+ double * data;
+ gsl_block * block;
+ int owner;
+ } gsl_matrix;
+
+Matrices are stored in row-major order, meaning that each row of
+elements forms a contiguous block in memory. This is the standard
+"C-language ordering" of two-dimensional arrays. Note that FORTRAN
+stores arrays in column-major order. The number of rows is SIZE1. The
+range of valid row indices runs from 0 to `size1-1'. Similarly SIZE2
+is the number of columns. The range of valid column indices runs from
+0 to `size2-1'. The physical row dimension TDA, or "trailing
+dimension", specifies the size of a row of the matrix as laid out in
+memory.
+
+ For example, in the following matrix SIZE1 is 3, SIZE2 is 4, and TDA
+is 8. The physical memory layout of the matrix begins in the top left
+hand-corner and proceeds from left to right along each row in turn.
+
+ 00 01 02 03 XX XX XX XX
+ 10 11 12 13 XX XX XX XX
+ 20 21 22 23 XX XX XX XX
+
+Each unused memory location is represented by "`XX'". The pointer DATA
+gives the location of the first element of the matrix in memory. The
+pointer BLOCK stores the location of the memory block in which the
+elements of the matrix are located (if any). If the matrix owns this
+block then the OWNER field is set to one and the block will be
+deallocated when the matrix is freed. If the matrix is only a slice of
+a block owned by another object then the OWNER field is zero and any
+underlying block will not be freed.
+
+ The functions for allocating and accessing matrices are defined in
+`gsl_matrix.h'
+
+* Menu:
+
+* Matrix allocation::
+* Accessing matrix elements::
+* Initializing matrix elements::
+* Reading and writing matrices::
+* Matrix views::
+* Creating row and column views::
+* Copying matrices::
+* Copying rows and columns::
+* Exchanging rows and columns::
+* Matrix operations::
+* Finding maximum and minimum elements of matrices::
+* Matrix properties::
+* Example programs for matrices::
+
+
+File: gsl-ref.info, Node: Matrix allocation, Next: Accessing matrix elements, Up: Matrices
+
+8.4.1 Matrix allocation
+-----------------------
+
+The functions for allocating memory to a matrix follow the style of
+`malloc' and `free'. They also perform their own error checking. If
+there is insufficient memory available to allocate a vector then the
+functions call the GSL error handler (with an error number of
+`GSL_ENOMEM') in addition to returning a null pointer. Thus if you use
+the library error handler to abort your program then it isn't necessary
+to check every `alloc'.
+
+ -- Function: gsl_matrix * gsl_matrix_alloc (size_t N1, size_t N2)
+ This function creates a matrix of size N1 rows by N2 columns,
+ returning a pointer to a newly initialized matrix struct. A new
+ block is allocated for the elements of the matrix, and stored in
+ the BLOCK component of the matrix struct. The block is "owned" by
+ the matrix, and will be deallocated when the matrix is deallocated.
+
+ -- Function: gsl_matrix * gsl_matrix_calloc (size_t N1, size_t N2)
+ This function allocates memory for a matrix of size N1 rows by N2
+ columns and initializes all the elements of the matrix to zero.
+
+ -- Function: void gsl_matrix_free (gsl_matrix * M)
+ This function frees a previously allocated matrix M. If the
+ matrix was created using `gsl_matrix_alloc' then the block
+ underlying the matrix will also be deallocated. If the matrix has
+ been created from another object then the memory is still owned by
+ that object and will not be deallocated. The matrix M must be a
+ valid matrix object (a null pointer is not allowed).
+
+
+File: gsl-ref.info, Node: Accessing matrix elements, Next: Initializing matrix elements, Prev: Matrix allocation, Up: Matrices
+
+8.4.2 Accessing matrix elements
+-------------------------------
+
+The functions for accessing the elements of a matrix use the same range
+checking system as vectors. You can turn off range checking by
+recompiling your program with the preprocessor definition
+`GSL_RANGE_CHECK_OFF'.
+
+ The elements of the matrix are stored in "C-order", where the second
+index moves continuously through memory. More precisely, the element
+accessed by the function `gsl_matrix_get(m,i,j)' and
+`gsl_matrix_set(m,i,j,x)' is
+
+ m->data[i * m->tda + j]
+
+where TDA is the physical row-length of the matrix.
+
+ -- Function: double gsl_matrix_get (const gsl_matrix * M, size_t I,
+ size_t J)
+ This function returns the (i,j)-th element of a matrix M. If I or
+ J lie outside the allowed range of 0 to N1-1 and 0 to N2-1 then
+ the error handler is invoked and 0 is returned.
+
+ -- Function: void gsl_matrix_set (gsl_matrix * M, size_t I, size_t J,
+ double X)
+ This function sets the value of the (i,j)-th element of a matrix M
+ to X. If I or J lies outside the allowed range of 0 to N1-1 and 0
+ to N2-1 then the error handler is invoked.
+
+ -- Function: double * gsl_matrix_ptr (gsl_matrix * M, size_t I, size_t
+ J)
+ -- Function: const double * gsl_matrix_const_ptr (const gsl_matrix *
+ M, size_t I, size_t J)
+ These functions return a pointer to the (i,j)-th element of a
+ matrix M. If I or J lie outside the allowed range of 0 to N1-1
+ and 0 to N2-1 then the error handler is invoked and a null pointer
+ is returned.
+
+
+File: gsl-ref.info, Node: Initializing matrix elements, Next: Reading and writing matrices, Prev: Accessing matrix elements, Up: Matrices
+
+8.4.3 Initializing matrix elements
+----------------------------------
+
+ -- Function: void gsl_matrix_set_all (gsl_matrix * M, double X)
+ This function sets all the elements of the matrix M to the value X.
+
+ -- Function: void gsl_matrix_set_zero (gsl_matrix * M)
+ This function sets all the elements of the matrix M to zero.
+
+ -- Function: void gsl_matrix_set_identity (gsl_matrix * M)
+ This function sets the elements of the matrix M to the
+ corresponding elements of the identity matrix, m(i,j) =
+ \delta(i,j), i.e. a unit diagonal with all off-diagonal elements
+ zero. This applies to both square and rectangular matrices.
+
+
+File: gsl-ref.info, Node: Reading and writing matrices, Next: Matrix views, Prev: Initializing matrix elements, Up: Matrices
+
+8.4.4 Reading and writing matrices
+----------------------------------
+
+The library provides functions for reading and writing matrices to a
+file as binary data or formatted text.
+
+ -- Function: int gsl_matrix_fwrite (FILE * STREAM, const gsl_matrix *
+ M)
+ This function writes the elements of the matrix M to the stream
+ STREAM in binary format. The return value is 0 for success and
+ `GSL_EFAILED' if there was a problem writing to the file. Since
+ the data is written in the native binary format it may not be
+ portable between different architectures.
+
+ -- Function: int gsl_matrix_fread (FILE * STREAM, gsl_matrix * M)
+ This function reads into the matrix M from the open stream STREAM
+ in binary format. The matrix M must be preallocated with the
+ correct dimensions since the function uses the size of M to
+ determine how many bytes to read. The return value is 0 for
+ success and `GSL_EFAILED' if there was a problem reading from the
+ file. The data is assumed to have been written in the native
+ binary format on the same architecture.
+
+ -- Function: int gsl_matrix_fprintf (FILE * STREAM, const gsl_matrix *
+ M, const char * FORMAT)
+ This function writes the elements of the matrix M line-by-line to
+ the stream STREAM using the format specifier FORMAT, which should
+ be one of the `%g', `%e' or `%f' formats for floating point
+ numbers and `%d' for integers. The function returns 0 for success
+ and `GSL_EFAILED' if there was a problem writing to the file.
+
+ -- Function: int gsl_matrix_fscanf (FILE * STREAM, gsl_matrix * M)
+ This function reads formatted data from the stream STREAM into the
+ matrix M. The matrix M must be preallocated with the correct
+ dimensions since the function uses the size of M to determine how
+ many numbers to read. The function returns 0 for success and
+ `GSL_EFAILED' if there was a problem reading from the file.
+
+
+File: gsl-ref.info, Node: Matrix views, Next: Creating row and column views, Prev: Reading and writing matrices, Up: Matrices
+
+8.4.5 Matrix views
+------------------
+
+A matrix view is a temporary object, stored on the stack, which can be
+used to operate on a subset of matrix elements. Matrix views can be
+defined for both constant and non-constant matrices using separate types
+that preserve constness. A matrix view has the type `gsl_matrix_view'
+and a constant matrix view has the type `gsl_matrix_const_view'. In
+both cases the elements of the view can by accessed using the `matrix'
+component of the view object. A pointer `gsl_matrix *' or `const
+gsl_matrix *' can be obtained by taking the address of the `matrix'
+component with the `&' operator. In addition to matrix views it is
+also possible to create vector views of a matrix, such as row or column
+views.
+
+ -- Function: gsl_matrix_view gsl_matrix_submatrix (gsl_matrix * M,
+ size_t K1, size_t K2, size_t N1, size_t N2)
+ -- Function: gsl_matrix_const_view gsl_matrix_const_submatrix (const
+ gsl_matrix * M, size_t K1, size_t K2, size_t N1, size_t N2)
+ These functions return a matrix view of a submatrix of the matrix
+ M. The upper-left element of the submatrix is the element (K1,K2)
+ of the original matrix. The submatrix has N1 rows and N2 columns.
+ The physical number of columns in memory given by TDA is
+ unchanged. Mathematically, the (i,j)-th element of the new matrix
+ is given by,
+
+ m'(i,j) = m->data[(k1*m->tda + k2) + i*m->tda + j]
+
+ where the index I runs from 0 to `n1-1' and the index J runs from
+ 0 to `n2-1'.
+
+ The `data' pointer of the returned matrix struct is set to null if
+ the combined parameters (I,J,N1,N2,TDA) overrun the ends of the
+ original matrix.
+
+ The new matrix view is only a view of the block underlying the
+ existing matrix, M. The block containing the elements of M is not
+ owned by the new matrix view. When the view goes out of scope the
+ original matrix M and its block will continue to exist. The
+ original memory can only be deallocated by freeing the original
+ matrix. Of course, the original matrix should not be deallocated
+ while the view is still in use.
+
+ The function `gsl_matrix_const_submatrix' is equivalent to
+ `gsl_matrix_submatrix' but can be used for matrices which are
+ declared `const'.
+
+ -- Function: gsl_matrix_view gsl_matrix_view_array (double * BASE,
+ size_t N1, size_t N2)
+ -- Function: gsl_matrix_const_view gsl_matrix_const_view_array (const
+ double * BASE, size_t N1, size_t N2)
+ These functions return a matrix view of the array BASE. The
+ matrix has N1 rows and N2 columns. The physical number of columns
+ in memory is also given by N2. Mathematically, the (i,j)-th
+ element of the new matrix is given by,
+
+ m'(i,j) = base[i*n2 + j]
+
+ where the index I runs from 0 to `n1-1' and the index J runs from
+ 0 to `n2-1'.
+
+ The new matrix is only a view of the array BASE. When the view
+ goes out of scope the original array BASE will continue to exist.
+ The original memory can only be deallocated by freeing the original
+ array. Of course, the original array should not be deallocated
+ while the view is still in use.
+
+ The function `gsl_matrix_const_view_array' is equivalent to
+ `gsl_matrix_view_array' but can be used for matrices which are
+ declared `const'.
+
+ -- Function: gsl_matrix_view gsl_matrix_view_array_with_tda (double *
+ BASE, size_t N1, size_t N2, size_t TDA)
+ -- Function: gsl_matrix_const_view
+ gsl_matrix_const_view_array_with_tda (const double * BASE,
+ size_t N1, size_t N2, size_t TDA)
+ These functions return a matrix view of the array BASE with a
+ physical number of columns TDA which may differ from the
+ corresponding dimension of the matrix. The matrix has N1 rows and
+ N2 columns, and the physical number of columns in memory is given
+ by TDA. Mathematically, the (i,j)-th element of the new matrix is
+ given by,
+
+ m'(i,j) = base[i*tda + j]
+
+ where the index I runs from 0 to `n1-1' and the index J runs from
+ 0 to `n2-1'.
+
+ The new matrix is only a view of the array BASE. When the view
+ goes out of scope the original array BASE will continue to exist.
+ The original memory can only be deallocated by freeing the original
+ array. Of course, the original array should not be deallocated
+ while the view is still in use.
+
+ The function `gsl_matrix_const_view_array_with_tda' is equivalent
+ to `gsl_matrix_view_array_with_tda' but can be used for matrices
+ which are declared `const'.
+
+ -- Function: gsl_matrix_view gsl_matrix_view_vector (gsl_vector * V,
+ size_t N1, size_t N2)
+ -- Function: gsl_matrix_const_view gsl_matrix_const_view_vector (const
+ gsl_vector * V, size_t N1, size_t N2)
+ These functions return a matrix view of the vector V. The matrix
+ has N1 rows and N2 columns. The vector must have unit stride. The
+ physical number of columns in memory is also given by N2.
+ Mathematically, the (i,j)-th element of the new matrix is given by,
+
+ m'(i,j) = v->data[i*n2 + j]
+
+ where the index I runs from 0 to `n1-1' and the index J runs from
+ 0 to `n2-1'.
+
+ The new matrix is only a view of the vector V. When the view goes
+ out of scope the original vector V will continue to exist. The
+ original memory can only be deallocated by freeing the original
+ vector. Of course, the original vector should not be deallocated
+ while the view is still in use.
+
+ The function `gsl_matrix_const_view_vector' is equivalent to
+ `gsl_matrix_view_vector' but can be used for matrices which are
+ declared `const'.
+
+ -- Function: gsl_matrix_view gsl_matrix_view_vector_with_tda
+ (gsl_vector * V, size_t N1, size_t N2, size_t TDA)
+ -- Function: gsl_matrix_const_view
+gsl_matrix_const_view_vector_with_tda (const gsl_vector * V, size_t N1,
+ size_t N2, size_t TDA)
+ These functions return a matrix view of the vector V with a
+ physical number of columns TDA which may differ from the
+ corresponding matrix dimension. The vector must have unit stride.
+ The matrix has N1 rows and N2 columns, and the physical number of
+ columns in memory is given by TDA. Mathematically, the (i,j)-th
+ element of the new matrix is given by,
+
+ m'(i,j) = v->data[i*tda + j]
+
+ where the index I runs from 0 to `n1-1' and the index J runs from
+ 0 to `n2-1'.
+
+ The new matrix is only a view of the vector V. When the view goes
+ out of scope the original vector V will continue to exist. The
+ original memory can only be deallocated by freeing the original
+ vector. Of course, the original vector should not be deallocated
+ while the view is still in use.
+
+ The function `gsl_matrix_const_view_vector_with_tda' is equivalent
+ to `gsl_matrix_view_vector_with_tda' but can be used for matrices
+ which are declared `const'.
+
+
+File: gsl-ref.info, Node: Creating row and column views, Next: Copying matrices, Prev: Matrix views, Up: Matrices
+
+8.4.6 Creating row and column views
+-----------------------------------
+
+In general there are two ways to access an object, by reference or by
+copying. The functions described in this section create vector views
+which allow access to a row or column of a matrix by reference.
+Modifying elements of the view is equivalent to modifying the matrix,
+since both the vector view and the matrix point to the same memory
+block.
+
+ -- Function: gsl_vector_view gsl_matrix_row (gsl_matrix * M, size_t I)
+ -- Function: gsl_vector_const_view gsl_matrix_const_row (const
+ gsl_matrix * M, size_t I)
+ These functions return a vector view of the I-th row of the matrix
+ M. The `data' pointer of the new vector is set to null if I is
+ out of range.
+
+ The function `gsl_vector_const_row' is equivalent to
+ `gsl_matrix_row' but can be used for matrices which are declared
+ `const'.
+
+ -- Function: gsl_vector_view gsl_matrix_column (gsl_matrix * M, size_t
+ J)
+ -- Function: gsl_vector_const_view gsl_matrix_const_column (const
+ gsl_matrix * M, size_t J)
+ These functions return a vector view of the J-th column of the
+ matrix M. The `data' pointer of the new vector is set to null if
+ J is out of range.
+
+ The function `gsl_vector_const_column' is equivalent to
+ `gsl_matrix_column' but can be used for matrices which are declared
+ `const'.
+
+ -- Function: gsl_vector_view gsl_matrix_diagonal (gsl_matrix * M)
+ -- Function: gsl_vector_const_view gsl_matrix_const_diagonal (const
+ gsl_matrix * M)
+ These functions returns a vector view of the diagonal of the matrix
+ M. The matrix M is not required to be square. For a rectangular
+ matrix the length of the diagonal is the same as the smaller
+ dimension of the matrix.
+
+ The function `gsl_matrix_const_diagonal' is equivalent to
+ `gsl_matrix_diagonal' but can be used for matrices which are
+ declared `const'.
+
+ -- Function: gsl_vector_view gsl_matrix_subdiagonal (gsl_matrix * M,
+ size_t K)
+ -- Function: gsl_vector_const_view gsl_matrix_const_subdiagonal (const
+ gsl_matrix * M, size_t K)
+ These functions return a vector view of the K-th subdiagonal of
+ the matrix M. The matrix M is not required to be square. The
+ diagonal of the matrix corresponds to k = 0.
+
+ The function `gsl_matrix_const_subdiagonal' is equivalent to
+ `gsl_matrix_subdiagonal' but can be used for matrices which are
+ declared `const'.
+
+ -- Function: gsl_vector_view gsl_matrix_superdiagonal (gsl_matrix * M,
+ size_t K)
+ -- Function: gsl_vector_const_view gsl_matrix_const_superdiagonal
+ (const gsl_matrix * M, size_t K)
+ These functions return a vector view of the K-th superdiagonal of
+ the matrix M. The matrix M is not required to be square. The
+ diagonal of the matrix corresponds to k = 0.
+
+ The function `gsl_matrix_const_superdiagonal' is equivalent to
+ `gsl_matrix_superdiagonal' but can be used for matrices which are
+ declared `const'.
+
+
+File: gsl-ref.info, Node: Copying matrices, Next: Copying rows and columns, Prev: Creating row and column views, Up: Matrices
+
+8.4.7 Copying matrices
+----------------------
+
+ -- Function: int gsl_matrix_memcpy (gsl_matrix * DEST, const
+ gsl_matrix * SRC)
+ This function copies the elements of the matrix SRC into the
+ matrix DEST. The two matrices must have the same size.
+
+ -- Function: int gsl_matrix_swap (gsl_matrix * M1, gsl_matrix * M2)
+ This function exchanges the elements of the matrices M1 and M2 by
+ copying. The two matrices must have the same size.
+
+
+File: gsl-ref.info, Node: Copying rows and columns, Next: Exchanging rows and columns, Prev: Copying matrices, Up: Matrices
+
+8.4.8 Copying rows and columns
+------------------------------
+
+The functions described in this section copy a row or column of a matrix
+into a vector. This allows the elements of the vector and the matrix to
+be modified independently. Note that if the matrix and the vector point
+to overlapping regions of memory then the result will be undefined. The
+same effect can be achieved with more generality using
+`gsl_vector_memcpy' with vector views of rows and columns.
+
+ -- Function: int gsl_matrix_get_row (gsl_vector * V, const gsl_matrix
+ * M, size_t I)
+ This function copies the elements of the I-th row of the matrix M
+ into the vector V. The length of the vector must be the same as
+ the length of the row.
+
+ -- Function: int gsl_matrix_get_col (gsl_vector * V, const gsl_matrix
+ * M, size_t J)
+ This function copies the elements of the J-th column of the matrix
+ M into the vector V. The length of the vector must be the same as
+ the length of the column.
+
+ -- Function: int gsl_matrix_set_row (gsl_matrix * M, size_t I, const
+ gsl_vector * V)
+ This function copies the elements of the vector V into the I-th
+ row of the matrix M. The length of the vector must be the same as
+ the length of the row.
+
+ -- Function: int gsl_matrix_set_col (gsl_matrix * M, size_t J, const
+ gsl_vector * V)
+ This function copies the elements of the vector V into the J-th
+ column of the matrix M. The length of the vector must be the same
+ as the length of the column.
+
+
+File: gsl-ref.info, Node: Exchanging rows and columns, Next: Matrix operations, Prev: Copying rows and columns, Up: Matrices
+
+8.4.9 Exchanging rows and columns
+---------------------------------
+
+The following functions can be used to exchange the rows and columns of
+a matrix.
+
+ -- Function: int gsl_matrix_swap_rows (gsl_matrix * M, size_t I,
+ size_t J)
+ This function exchanges the I-th and J-th rows of the matrix M
+ in-place.
+
+ -- Function: int gsl_matrix_swap_columns (gsl_matrix * M, size_t I,
+ size_t J)
+ This function exchanges the I-th and J-th columns of the matrix M
+ in-place.
+
+ -- Function: int gsl_matrix_swap_rowcol (gsl_matrix * M, size_t I,
+ size_t J)
+ This function exchanges the I-th row and J-th column of the matrix
+ M in-place. The matrix must be square for this operation to be
+ possible.
+
+ -- Function: int gsl_matrix_transpose_memcpy (gsl_matrix * DEST, const
+ gsl_matrix * SRC)
+ This function makes the matrix DEST the transpose of the matrix
+ SRC by copying the elements of SRC into DEST. This function works
+ for all matrices provided that the dimensions of the matrix DEST
+ match the transposed dimensions of the matrix SRC.
+
+ -- Function: int gsl_matrix_transpose (gsl_matrix * M)
+ This function replaces the matrix M by its transpose by copying
+ the elements of the matrix in-place. The matrix must be square
+ for this operation to be possible.
+
+
+File: gsl-ref.info, Node: Matrix operations, Next: Finding maximum and minimum elements of matrices, Prev: Exchanging rows and columns, Up: Matrices
+
+8.4.10 Matrix operations
+------------------------
+
+The following operations are defined for real and complex matrices.
+
+ -- Function: int gsl_matrix_add (gsl_matrix * A, const gsl_matrix * B)
+ This function adds the elements of matrix B to the elements of
+ matrix A, a'(i,j) = a(i,j) + b(i,j). The two matrices must have the
+ same dimensions.
+
+ -- Function: int gsl_matrix_sub (gsl_matrix * A, const gsl_matrix * B)
+ This function subtracts the elements of matrix B from the elements
+ of matrix A, a'(i,j) = a(i,j) - b(i,j). The two matrices must have
+ the same dimensions.
+
+ -- Function: int gsl_matrix_mul_elements (gsl_matrix * A, const
+ gsl_matrix * B)
+ This function multiplies the elements of matrix A by the elements
+ of matrix B, a'(i,j) = a(i,j) * b(i,j). The two matrices must have
+ the same dimensions.
+
+ -- Function: int gsl_matrix_div_elements (gsl_matrix * A, const
+ gsl_matrix * B)
+ This function divides the elements of matrix A by the elements of
+ matrix B, a'(i,j) = a(i,j) / b(i,j). The two matrices must have the
+ same dimensions.
+
+ -- Function: int gsl_matrix_scale (gsl_matrix * A, const double X)
+ This function multiplies the elements of matrix A by the constant
+ factor X, a'(i,j) = x a(i,j).
+
+ -- Function: int gsl_matrix_add_constant (gsl_matrix * A, const double
+ X)
+ This function adds the constant value X to the elements of the
+ matrix A, a'(i,j) = a(i,j) + x.
+
+
+File: gsl-ref.info, Node: Finding maximum and minimum elements of matrices, Next: Matrix properties, Prev: Matrix operations, Up: Matrices
+
+8.4.11 Finding maximum and minimum elements of matrices
+-------------------------------------------------------
+
+The following operations are only defined for real matrices.
+
+ -- Function: double gsl_matrix_max (const gsl_matrix * M)
+ This function returns the maximum value in the matrix M.
+
+ -- Function: double gsl_matrix_min (const gsl_matrix * M)
+ This function returns the minimum value in the matrix M.
+
+ -- Function: void gsl_matrix_minmax (const gsl_matrix * M, double *
+ MIN_OUT, double * MAX_OUT)
+ This function returns the minimum and maximum values in the matrix
+ M, storing them in MIN_OUT and MAX_OUT.
+
+ -- Function: void gsl_matrix_max_index (const gsl_matrix * M, size_t *
+ IMAX, size_t * JMAX)
+ This function returns the indices of the maximum value in the
+ matrix M, storing them in IMAX and JMAX. When there are several
+ equal maximum elements then the first element found is returned,
+ searching in row-major order.
+
+ -- Function: void gsl_matrix_min_index (const gsl_matrix * M, size_t *
+ IMIN, size_t * JMIN)
+ This function returns the indices of the minimum value in the
+ matrix M, storing them in IMIN and JMIN. When there are several
+ equal minimum elements then the first element found is returned,
+ searching in row-major order.
+
+ -- Function: void gsl_matrix_minmax_index (const gsl_matrix * M,
+ size_t * IMIN, size_t * JMIN, size_t * IMAX, size_t * JMAX)
+ This function returns the indices of the minimum and maximum
+ values in the matrix M, storing them in (IMIN,JMIN) and
+ (IMAX,JMAX). When there are several equal minimum or maximum
+ elements then the first elements found are returned, searching in
+ row-major order.
+
+
+File: gsl-ref.info, Node: Matrix properties, Next: Example programs for matrices, Prev: Finding maximum and minimum elements of matrices, Up: Matrices
+
+8.4.12 Matrix properties
+------------------------
+
+ -- Function: int gsl_matrix_isnull (const gsl_matrix * M)
+ -- Function: int gsl_matrix_ispos (const gsl_matrix * M)
+ -- Function: int gsl_matrix_isneg (const gsl_matrix * M)
+ These functions return 1 if all the elements of the matrix M are
+ zero, strictly positive, or strictly negative respectively, and 0
+ otherwise. To test for a non-negative matrix, use the expression
+ `!gsl_matrix_isneg(m)'. To test whether a matrix is
+ positive-definite, use the Cholesky decomposition (*note Cholesky
+ Decomposition::).
+
+
+File: gsl-ref.info, Node: Example programs for matrices, Prev: Matrix properties, Up: Matrices
+
+8.4.13 Example programs for matrices
+------------------------------------
+
+The program below shows how to allocate, initialize and read from a
+matrix using the functions `gsl_matrix_alloc', `gsl_matrix_set' and
+`gsl_matrix_get'.
+
+ #include <stdio.h>
+ #include <gsl/gsl_matrix.h>
+
+ int
+ main (void)
+ {
+ int i, j;
+ gsl_matrix * m = gsl_matrix_alloc (10, 3);
+
+ for (i = 0; i < 10; i++)
+ for (j = 0; j < 3; j++)
+ gsl_matrix_set (m, i, j, 0.23 + 100*i + j);
+
+ for (i = 0; i < 100; i++) /* OUT OF RANGE ERROR */
+ for (j = 0; j < 3; j++)
+ printf ("m(%d,%d) = %g\n", i, j,
+ gsl_matrix_get (m, i, j));
+
+ gsl_matrix_free (m);
+
+ return 0;
+ }
+
+Here is the output from the program. The final loop attempts to read
+outside the range of the matrix `m', and the error is trapped by the
+range-checking code in `gsl_matrix_get'.
+
+ $ ./a.out
+ m(0,0) = 0.23
+ m(0,1) = 1.23
+ m(0,2) = 2.23
+ m(1,0) = 100.23
+ m(1,1) = 101.23
+ m(1,2) = 102.23
+ ...
+ m(9,2) = 902.23
+ gsl: matrix_source.c:13: ERROR: first index out of range
+ Default GSL error handler invoked.
+ Aborted (core dumped)
+
+The next program shows how to write a matrix to a file.
+
+ #include <stdio.h>
+ #include <gsl/gsl_matrix.h>
+
+ int
+ main (void)
+ {
+ int i, j, k = 0;
+ gsl_matrix * m = gsl_matrix_alloc (100, 100);
+ gsl_matrix * a = gsl_matrix_alloc (100, 100);
+
+ for (i = 0; i < 100; i++)
+ for (j = 0; j < 100; j++)
+ gsl_matrix_set (m, i, j, 0.23 + i + j);
+
+ {
+ FILE * f = fopen ("test.dat", "wb");
+ gsl_matrix_fwrite (f, m);
+ fclose (f);
+ }
+
+ {
+ FILE * f = fopen ("test.dat", "rb");
+ gsl_matrix_fread (f, a);
+ fclose (f);
+ }
+
+ for (i = 0; i < 100; i++)
+ for (j = 0; j < 100; j++)
+ {
+ double mij = gsl_matrix_get (m, i, j);
+ double aij = gsl_matrix_get (a, i, j);
+ if (mij != aij) k++;
+ }
+
+ gsl_matrix_free (m);
+ gsl_matrix_free (a);
+
+ printf ("differences = %d (should be zero)\n", k);
+ return (k > 0);
+ }
+
+After running this program the file `test.dat' should contain the
+elements of `m', written in binary format. The matrix which is read
+back in using the function `gsl_matrix_fread' should be exactly equal
+to the original matrix.
+
+ The following program demonstrates the use of vector views. The
+program computes the column norms of a matrix.
+
+ #include <math.h>
+ #include <stdio.h>
+ #include <gsl/gsl_matrix.h>
+ #include <gsl/gsl_blas.h>
+
+ int
+ main (void)
+ {
+ size_t i,j;
+
+ gsl_matrix *m = gsl_matrix_alloc (10, 10);
+
+ for (i = 0; i < 10; i++)
+ for (j = 0; j < 10; j++)
+ gsl_matrix_set (m, i, j, sin (i) + cos (j));
+
+ for (j = 0; j < 10; j++)
+ {
+ gsl_vector_view column = gsl_matrix_column (m, j);
+ double d;
+
+ d = gsl_blas_dnrm2 (&column.vector);
+
+ printf ("matrix column %d, norm = %g\n", j, d);
+ }
+
+ gsl_matrix_free (m);
+
+ return 0;
+ }
+
+Here is the output of the program,
+
+ $ ./a.out
+ matrix column 0, norm = 4.31461
+ matrix column 1, norm = 3.1205
+ matrix column 2, norm = 2.19316
+ matrix column 3, norm = 3.26114
+ matrix column 4, norm = 2.53416
+ matrix column 5, norm = 2.57281
+ matrix column 6, norm = 4.20469
+ matrix column 7, norm = 3.65202
+ matrix column 8, norm = 2.08524
+ matrix column 9, norm = 3.07313
+
+The results can be confirmed using GNU OCTAVE,
+
+ $ octave
+ GNU Octave, version 2.0.16.92
+ octave> m = sin(0:9)' * ones(1,10)
+ + ones(10,1) * cos(0:9);
+ octave> sqrt(sum(m.^2))
+ ans =
+ 4.3146 3.1205 2.1932 3.2611 2.5342 2.5728
+ 4.2047 3.6520 2.0852 3.0731
+
+
+File: gsl-ref.info, Node: Vector and Matrix References and Further Reading, Prev: Matrices, Up: Vectors and Matrices
+
+8.5 References and Further Reading
+==================================
+
+The block, vector and matrix objects in GSL follow the `valarray' model
+of C++. A description of this model can be found in the following
+reference,
+
+ B. Stroustrup, `The C++ Programming Language' (3rd Ed), Section
+ 22.4 Vector Arithmetic. Addison-Wesley 1997, ISBN 0-201-88954-4.
+
+
+File: gsl-ref.info, Node: Permutations, Next: Combinations, Prev: Vectors and Matrices, Up: Top
+
+9 Permutations
+**************
+
+This chapter describes functions for creating and manipulating
+permutations. A permutation p is represented by an array of n integers
+in the range 0 to n-1, where each value p_i occurs once and only once.
+The application of a permutation p to a vector v yields a new vector v'
+where v'_i = v_{p_i}. For example, the array (0,1,3,2) represents a
+permutation which exchanges the last two elements of a four element
+vector. The corresponding identity permutation is (0,1,2,3).
+
+ Note that the permutations produced by the linear algebra routines
+correspond to the exchange of matrix columns, and so should be
+considered as applying to row-vectors in the form v' = v P rather than
+column-vectors, when permuting the elements of a vector.
+
+ The functions described in this chapter are defined in the header
+file `gsl_permutation.h'.
+
+* Menu:
+
+* The Permutation struct::
+* Permutation allocation::
+* Accessing permutation elements::
+* Permutation properties::
+* Permutation functions::
+* Applying Permutations::
+* Reading and writing permutations::
+* Permutations in cyclic form::
+* Permutation Examples::
+* Permutation References and Further Reading::
+
+
+File: gsl-ref.info, Node: The Permutation struct, Next: Permutation allocation, Up: Permutations
+
+9.1 The Permutation struct
+==========================
+
+A permutation is defined by a structure containing two components, the
+size of the permutation and a pointer to the permutation array. The
+elements of the permutation array are all of type `size_t'. The
+`gsl_permutation' structure looks like this,
+
+ typedef struct
+ {
+ size_t size;
+ size_t * data;
+ } gsl_permutation;
+
+
+
+File: gsl-ref.info, Node: Permutation allocation, Next: Accessing permutation elements, Prev: The Permutation struct, Up: Permutations
+
+9.2 Permutation allocation
+==========================
+
+ -- Function: gsl_permutation * gsl_permutation_alloc (size_t N)
+ This function allocates memory for a new permutation of size N.
+ The permutation is not initialized and its elements are undefined.
+ Use the function `gsl_permutation_calloc' if you want to create a
+ permutation which is initialized to the identity. A null pointer is
+ returned if insufficient memory is available to create the
+ permutation.
+
+ -- Function: gsl_permutation * gsl_permutation_calloc (size_t N)
+ This function allocates memory for a new permutation of size N and
+ initializes it to the identity. A null pointer is returned if
+ insufficient memory is available to create the permutation.
+
+ -- Function: void gsl_permutation_init (gsl_permutation * P)
+ This function initializes the permutation P to the identity, i.e.
+ (0,1,2,...,n-1).
+
+ -- Function: void gsl_permutation_free (gsl_permutation * P)
+ This function frees all the memory used by the permutation P.
+
+ -- Function: int gsl_permutation_memcpy (gsl_permutation * DEST, const
+ gsl_permutation * SRC)
+ This function copies the elements of the permutation SRC into the
+ permutation DEST. The two permutations must have the same size.
+
+
+File: gsl-ref.info, Node: Accessing permutation elements, Next: Permutation properties, Prev: Permutation allocation, Up: Permutations
+
+9.3 Accessing permutation elements
+==================================
+
+The following functions can be used to access and manipulate
+permutations.
+
+ -- Function: size_t gsl_permutation_get (const gsl_permutation * P,
+ const size_t I)
+ This function returns the value of the I-th element of the
+ permutation P. If I lies outside the allowed range of 0 to N-1
+ then the error handler is invoked and 0 is returned.
+
+ -- Function: int gsl_permutation_swap (gsl_permutation * P, const
+ size_t I, const size_t J)
+ This function exchanges the I-th and J-th elements of the
+ permutation P.
+
+
+File: gsl-ref.info, Node: Permutation properties, Next: Permutation functions, Prev: Accessing permutation elements, Up: Permutations
+
+9.4 Permutation properties
+==========================
+
+ -- Function: size_t gsl_permutation_size (const gsl_permutation * P)
+ This function returns the size of the permutation P.
+
+ -- Function: size_t * gsl_permutation_data (const gsl_permutation * P)
+ This function returns a pointer to the array of elements in the
+ permutation P.
+
+ -- Function: int gsl_permutation_valid (gsl_permutation * P)
+ This function checks that the permutation P is valid. The N
+ elements should contain each of the numbers 0 to N-1 once and only
+ once.
+
+
+File: gsl-ref.info, Node: Permutation functions, Next: Applying Permutations, Prev: Permutation properties, Up: Permutations
+
+9.5 Permutation functions
+=========================
+
+ -- Function: void gsl_permutation_reverse (gsl_permutation * P)
+ This function reverses the elements of the permutation P.
+
+ -- Function: int gsl_permutation_inverse (gsl_permutation * INV, const
+ gsl_permutation * P)
+ This function computes the inverse of the permutation P, storing
+ the result in INV.
+
+ -- Function: int gsl_permutation_next (gsl_permutation * P)
+ This function advances the permutation P to the next permutation
+ in lexicographic order and returns `GSL_SUCCESS'. If no further
+ permutations are available it returns `GSL_FAILURE' and leaves P
+ unmodified. Starting with the identity permutation and repeatedly
+ applying this function will iterate through all possible
+ permutations of a given order.
+
+ -- Function: int gsl_permutation_prev (gsl_permutation * P)
+ This function steps backwards from the permutation P to the
+ previous permutation in lexicographic order, returning
+ `GSL_SUCCESS'. If no previous permutation is available it returns
+ `GSL_FAILURE' and leaves P unmodified.
+
+
+File: gsl-ref.info, Node: Applying Permutations, Next: Reading and writing permutations, Prev: Permutation functions, Up: Permutations
+
+9.6 Applying Permutations
+=========================
+
+ -- Function: int gsl_permute (const size_t * P, double * DATA, size_t
+ STRIDE, size_t N)
+ This function applies the permutation P to the array DATA of size
+ N with stride STRIDE.
+
+ -- Function: int gsl_permute_inverse (const size_t * P, double * DATA,
+ size_t STRIDE, size_t N)
+ This function applies the inverse of the permutation P to the
+ array DATA of size N with stride STRIDE.
+
+ -- Function: int gsl_permute_vector (const gsl_permutation * P,
+ gsl_vector * V)
+ This function applies the permutation P to the elements of the
+ vector V, considered as a row-vector acted on by a permutation
+ matrix from the right, v' = v P. The j-th column of the
+ permutation matrix P is given by the p_j-th column of the identity
+ matrix. The permutation P and the vector V must have the same
+ length.
+
+ -- Function: int gsl_permute_vector_inverse (const gsl_permutation *
+ P, gsl_vector * V)
+ This function applies the inverse of the permutation P to the
+ elements of the vector V, considered as a row-vector acted on by
+ an inverse permutation matrix from the right, v' = v P^T. Note
+ that for permutation matrices the inverse is the same as the
+ transpose. The j-th column of the permutation matrix P is given by
+ the p_j-th column of the identity matrix. The permutation P and
+ the vector V must have the same length.
+
+ -- Function: int gsl_permutation_mul (gsl_permutation * P, const
+ gsl_permutation * PA, const gsl_permutation * PB)
+ This function combines the two permutations PA and PB into a
+ single permutation P, where p = pa . pb. The permutation P is
+ equivalent to applying pb first and then PA.
+
+
+File: gsl-ref.info, Node: Reading and writing permutations, Next: Permutations in cyclic form, Prev: Applying Permutations, Up: Permutations
+
+9.7 Reading and writing permutations
+====================================
+
+The library provides functions for reading and writing permutations to a
+file as binary data or formatted text.
+
+ -- Function: int gsl_permutation_fwrite (FILE * STREAM, const
+ gsl_permutation * P)
+ This function writes the elements of the permutation P to the
+ stream STREAM in binary format. The function returns
+ `GSL_EFAILED' if there was a problem writing to the file. Since
+ the data is written in the native binary format it may not be
+ portable between different architectures.
+
+ -- Function: int gsl_permutation_fread (FILE * STREAM, gsl_permutation
+ * P)
+ This function reads into the permutation P from the open stream
+ STREAM in binary format. The permutation P must be preallocated
+ with the correct length since the function uses the size of P to
+ determine how many bytes to read. The function returns
+ `GSL_EFAILED' if there was a problem reading from the file. The
+ data is assumed to have been written in the native binary format
+ on the same architecture.
+
+ -- Function: int gsl_permutation_fprintf (FILE * STREAM, const
+ gsl_permutation * P, const char * FORMAT)
+ This function writes the elements of the permutation P
+ line-by-line to the stream STREAM using the format specifier
+ FORMAT, which should be suitable for a type of SIZE_T. On a GNU
+ system the type modifier `Z' represents `size_t', so `"%Zu\n"' is
+ a suitable format. The function returns `GSL_EFAILED' if there
+ was a problem writing to the file.
+
+ -- Function: int gsl_permutation_fscanf (FILE * STREAM,
+ gsl_permutation * P)
+ This function reads formatted data from the stream STREAM into the
+ permutation P. The permutation P must be preallocated with the
+ correct length since the function uses the size of P to determine
+ how many numbers to read. The function returns `GSL_EFAILED' if
+ there was a problem reading from the file.
+
+
+File: gsl-ref.info, Node: Permutations in cyclic form, Next: Permutation Examples, Prev: Reading and writing permutations, Up: Permutations
+
+9.8 Permutations in cyclic form
+===============================
+
+A permutation can be represented in both "linear" and "cyclic"
+notations. The functions described in this section convert between the
+two forms. The linear notation is an index mapping, and has already
+been described above. The cyclic notation expresses a permutation as a
+series of circular rearrangements of groups of elements, or "cycles".
+
+ For example, under the cycle (1 2 3), 1 is replaced by 2, 2 is
+replaced by 3 and 3 is replaced by 1 in a circular fashion. Cycles of
+different sets of elements can be combined independently, for example
+(1 2 3) (4 5) combines the cycle (1 2 3) with the cycle (4 5), which is
+an exchange of elements 4 and 5. A cycle of length one represents an
+element which is unchanged by the permutation and is referred to as a
+"singleton".
+
+ It can be shown that every permutation can be decomposed into
+combinations of cycles. The decomposition is not unique, but can always
+be rearranged into a standard "canonical form" by a reordering of
+elements. The library uses the canonical form defined in Knuth's `Art
+of Computer Programming' (Vol 1, 3rd Ed, 1997) Section 1.3.3, p.178.
+
+ The procedure for obtaining the canonical form given by Knuth is,
+
+ 1. Write all singleton cycles explicitly
+
+ 2. Within each cycle, put the smallest number first
+
+ 3. Order the cycles in decreasing order of the first number in the
+ cycle.
+
+For example, the linear representation (2 4 3 0 1) is represented as (1
+4) (0 2 3) in canonical form. The permutation corresponds to an
+exchange of elements 1 and 4, and rotation of elements 0, 2 and 3.
+
+ The important property of the canonical form is that it can be
+reconstructed from the contents of each cycle without the brackets. In
+addition, by removing the brackets it can be considered as a linear
+representation of a different permutation. In the example given above
+the permutation (2 4 3 0 1) would become (1 4 0 2 3). This mapping has
+many applications in the theory of permutations.
+
+ -- Function: int gsl_permutation_linear_to_canonical (gsl_permutation
+ * Q, const gsl_permutation * P)
+ This function computes the canonical form of the permutation P and
+ stores it in the output argument Q.
+
+ -- Function: int gsl_permutation_canonical_to_linear (gsl_permutation
+ * P, const gsl_permutation * Q)
+ This function converts a permutation Q in canonical form back into
+ linear form storing it in the output argument P.
+
+ -- Function: size_t gsl_permutation_inversions (const gsl_permutation
+ * P)
+ This function counts the number of inversions in the permutation
+ P. An inversion is any pair of elements that are not in order.
+ For example, the permutation 2031 has three inversions,
+ corresponding to the pairs (2,0) (2,1) and (3,1). The identity
+ permutation has no inversions.
+
+ -- Function: size_t gsl_permutation_linear_cycles (const
+ gsl_permutation * P)
+ This function counts the number of cycles in the permutation P,
+ given in linear form.
+
+ -- Function: size_t gsl_permutation_canonical_cycles (const
+ gsl_permutation * Q)
+ This function counts the number of cycles in the permutation Q,
+ given in canonical form.
+
+
+File: gsl-ref.info, Node: Permutation Examples, Next: Permutation References and Further Reading, Prev: Permutations in cyclic form, Up: Permutations
+
+9.9 Examples
+============
+
+The example program below creates a random permutation (by shuffling the
+elements of the identity) and finds its inverse.
+
+ #include <stdio.h>
+ #include <gsl/gsl_rng.h>
+ #include <gsl/gsl_randist.h>
+ #include <gsl/gsl_permutation.h>
+
+ int
+ main (void)
+ {
+ const size_t N = 10;
+ const gsl_rng_type * T;
+ gsl_rng * r;
+
+ gsl_permutation * p = gsl_permutation_alloc (N);
+ gsl_permutation * q = gsl_permutation_alloc (N);
+
+ gsl_rng_env_setup();
+ T = gsl_rng_default;
+ r = gsl_rng_alloc (T);
+
+ printf ("initial permutation:");
+ gsl_permutation_init (p);
+ gsl_permutation_fprintf (stdout, p, " %u");
+ printf ("\n");
+
+ printf (" random permutation:");
+ gsl_ran_shuffle (r, p->data, N, sizeof(size_t));
+ gsl_permutation_fprintf (stdout, p, " %u");
+ printf ("\n");
+
+ printf ("inverse permutation:");
+ gsl_permutation_inverse (q, p);
+ gsl_permutation_fprintf (stdout, q, " %u");
+ printf ("\n");
+
+ gsl_permutation_free (p);
+ gsl_permutation_free (q);
+ gsl_rng_free (r);
+
+ return 0;
+ }
+
+Here is the output from the program,
+
+ $ ./a.out
+ initial permutation: 0 1 2 3 4 5 6 7 8 9
+ random permutation: 1 3 5 2 7 6 0 4 9 8
+ inverse permutation: 6 0 3 1 7 2 5 4 9 8
+
+The random permutation `p[i]' and its inverse `q[i]' are related
+through the identity `p[q[i]] = i', which can be verified from the
+output.
+
+ The next example program steps forwards through all possible third
+order permutations, starting from the identity,
+
+ #include <stdio.h>
+ #include <gsl/gsl_permutation.h>
+
+ int
+ main (void)
+ {
+ gsl_permutation * p = gsl_permutation_alloc (3);
+
+ gsl_permutation_init (p);
+
+ do
+ {
+ gsl_permutation_fprintf (stdout, p, " %u");
+ printf ("\n");
+ }
+ while (gsl_permutation_next(p) == GSL_SUCCESS);
+
+ gsl_permutation_free (p);
+
+ return 0;
+ }
+
+Here is the output from the program,
+
+ $ ./a.out
+ 0 1 2
+ 0 2 1
+ 1 0 2
+ 1 2 0
+ 2 0 1
+ 2 1 0
+
+The permutations are generated in lexicographic order. To reverse the
+sequence, begin with the final permutation (which is the reverse of the
+identity) and replace `gsl_permutation_next' with
+`gsl_permutation_prev'.
+
+
+File: gsl-ref.info, Node: Permutation References and Further Reading, Prev: Permutation Examples, Up: Permutations
+
+9.10 References and Further Reading
+===================================
+
+The subject of permutations is covered extensively in Knuth's `Sorting
+and Searching',
+
+ Donald E. Knuth, `The Art of Computer Programming: Sorting and
+ Searching' (Vol 3, 3rd Ed, 1997), Addison-Wesley, ISBN 0201896850.
+
+For the definition of the "canonical form" see,
+
+ Donald E. Knuth, `The Art of Computer Programming: Fundamental
+ Algorithms' (Vol 1, 3rd Ed, 1997), Addison-Wesley, ISBN 0201896850.
+ Section 1.3.3, `An Unusual Correspondence', p.178-179.
+
+
+File: gsl-ref.info, Node: Combinations, Next: Sorting, Prev: Permutations, Up: Top
+
+10 Combinations
+***************
+
+This chapter describes functions for creating and manipulating
+combinations. A combination c is represented by an array of k integers
+in the range 0 to n-1, where each value c_i occurs at most once. The
+combination c corresponds to indices of k elements chosen from an n
+element vector. Combinations are useful for iterating over all
+k-element subsets of a set.
+
+ The functions described in this chapter are defined in the header
+file `gsl_combination.h'.
+
+* Menu:
+
+* The Combination struct::
+* Combination allocation::
+* Accessing combination elements::
+* Combination properties::
+* Combination functions::
+* Reading and writing combinations::
+* Combination Examples::
+* Combination References and Further Reading::
+
+
+File: gsl-ref.info, Node: The Combination struct, Next: Combination allocation, Up: Combinations
+
+10.1 The Combination struct
+===========================
+
+A combination is defined by a structure containing three components, the
+values of n and k, and a pointer to the combination array. The
+elements of the combination array are all of type `size_t', and are
+stored in increasing order. The `gsl_combination' structure looks like
+this,
+
+ typedef struct
+ {
+ size_t n;
+ size_t k;
+ size_t *data;
+ } gsl_combination;
+
+
+
+File: gsl-ref.info, Node: Combination allocation, Next: Accessing combination elements, Prev: The Combination struct, Up: Combinations
+
+10.2 Combination allocation
+===========================
+
+ -- Function: gsl_combination * gsl_combination_alloc (size_t N, size_t
+ K)
+ This function allocates memory for a new combination with
+ parameters N, K. The combination is not initialized and its
+ elements are undefined. Use the function `gsl_combination_calloc'
+ if you want to create a combination which is initialized to the
+ lexicographically first combination. A null pointer is returned if
+ insufficient memory is available to create the combination.
+
+ -- Function: gsl_combination * gsl_combination_calloc (size_t N,
+ size_t K)
+ This function allocates memory for a new combination with
+ parameters N, K and initializes it to the lexicographically first
+ combination. A null pointer is returned if insufficient memory is
+ available to create the combination.
+
+ -- Function: void gsl_combination_init_first (gsl_combination * C)
+ This function initializes the combination C to the
+ lexicographically first combination, i.e. (0,1,2,...,k-1).
+
+ -- Function: void gsl_combination_init_last (gsl_combination * C)
+ This function initializes the combination C to the
+ lexicographically last combination, i.e. (n-k,n-k+1,...,n-1).
+
+ -- Function: void gsl_combination_free (gsl_combination * C)
+ This function frees all the memory used by the combination C.
+
+ -- Function: int gsl_combination_memcpy (gsl_combination * DEST, const
+ gsl_combination * SRC)
+ This function copies the elements of the combination SRC into the
+ combination DEST. The two combinations must have the same size.
+
+
+File: gsl-ref.info, Node: Accessing combination elements, Next: Combination properties, Prev: Combination allocation, Up: Combinations
+
+10.3 Accessing combination elements
+===================================
+
+The following function can be used to access the elements of a
+combination.
+
+ -- Function: size_t gsl_combination_get (const gsl_combination * C,
+ const size_t I)
+ This function returns the value of the I-th element of the
+ combination C. If I lies outside the allowed range of 0 to K-1
+ then the error handler is invoked and 0 is returned.
+
+
+File: gsl-ref.info, Node: Combination properties, Next: Combination functions, Prev: Accessing combination elements, Up: Combinations
+
+10.4 Combination properties
+===========================
+
+ -- Function: size_t gsl_combination_n (const gsl_combination * C)
+ This function returns the range (n) of the combination C.
+
+ -- Function: size_t gsl_combination_k (const gsl_combination * C)
+ This function returns the number of elements (k) in the
+ combination C.
+
+ -- Function: size_t * gsl_combination_data (const gsl_combination * C)
+ This function returns a pointer to the array of elements in the
+ combination C.
+
+ -- Function: int gsl_combination_valid (gsl_combination * C)
+ This function checks that the combination C is valid. The K
+ elements should lie in the range 0 to N-1, with each value
+ occurring once at most and in increasing order.
+
+
+File: gsl-ref.info, Node: Combination functions, Next: Reading and writing combinations, Prev: Combination properties, Up: Combinations
+
+10.5 Combination functions
+==========================
+
+ -- Function: int gsl_combination_next (gsl_combination * C)
+ This function advances the combination C to the next combination
+ in lexicographic order and returns `GSL_SUCCESS'. If no further
+ combinations are available it returns `GSL_FAILURE' and leaves C
+ unmodified. Starting with the first combination and repeatedly
+ applying this function will iterate through all possible
+ combinations of a given order.
+
+ -- Function: int gsl_combination_prev (gsl_combination * C)
+ This function steps backwards from the combination C to the
+ previous combination in lexicographic order, returning
+ `GSL_SUCCESS'. If no previous combination is available it returns
+ `GSL_FAILURE' and leaves C unmodified.
+
+
+File: gsl-ref.info, Node: Reading and writing combinations, Next: Combination Examples, Prev: Combination functions, Up: Combinations
+
+10.6 Reading and writing combinations
+=====================================
+
+The library provides functions for reading and writing combinations to a
+file as binary data or formatted text.
+
+ -- Function: int gsl_combination_fwrite (FILE * STREAM, const
+ gsl_combination * C)
+ This function writes the elements of the combination C to the
+ stream STREAM in binary format. The function returns
+ `GSL_EFAILED' if there was a problem writing to the file. Since
+ the data is written in the native binary format it may not be
+ portable between different architectures.
+
+ -- Function: int gsl_combination_fread (FILE * STREAM, gsl_combination
+ * C)
+ This function reads elements from the open stream STREAM into the
+ combination C in binary format. The combination C must be
+ preallocated with correct values of n and k since the function
+ uses the size of C to determine how many bytes to read. The
+ function returns `GSL_EFAILED' if there was a problem reading from
+ the file. The data is assumed to have been written in the native
+ binary format on the same architecture.
+
+ -- Function: int gsl_combination_fprintf (FILE * STREAM, const
+ gsl_combination * C, const char * FORMAT)
+ This function writes the elements of the combination C
+ line-by-line to the stream STREAM using the format specifier
+ FORMAT, which should be suitable for a type of SIZE_T. On a GNU
+ system the type modifier `Z' represents `size_t', so `"%Zu\n"' is
+ a suitable format. The function returns `GSL_EFAILED' if there
+ was a problem writing to the file.
+
+ -- Function: int gsl_combination_fscanf (FILE * STREAM,
+ gsl_combination * C)
+ This function reads formatted data from the stream STREAM into the
+ combination C. The combination C must be preallocated with
+ correct values of n and k since the function uses the size of C to
+ determine how many numbers to read. The function returns
+ `GSL_EFAILED' if there was a problem reading from the file.
+
+
+File: gsl-ref.info, Node: Combination Examples, Next: Combination References and Further Reading, Prev: Reading and writing combinations, Up: Combinations
+
+10.7 Examples
+=============
+
+The example program below prints all subsets of the set {0,1,2,3}
+ordered by size. Subsets of the same size are ordered
+lexicographically.
+
+ #include <stdio.h>
+ #include <gsl/gsl_combination.h>
+
+ int
+ main (void)
+ {
+ gsl_combination * c;
+ size_t i;
+
+ printf ("All subsets of {0,1,2,3} by size:\n") ;
+ for (i = 0; i <= 4; i++)
+ {
+ c = gsl_combination_calloc (4, i);
+ do
+ {
+ printf ("{");
+ gsl_combination_fprintf (stdout, c, " %u");
+ printf (" }\n");
+ }
+ while (gsl_combination_next (c) == GSL_SUCCESS);
+ gsl_combination_free (c);
+ }
+
+ return 0;
+ }
+
+Here is the output from the program,
+
+ $ ./a.out
+ All subsets of {0,1,2,3} by size:
+ { }
+ { 0 }
+ { 1 }
+ { 2 }
+ { 3 }
+ { 0 1 }
+ { 0 2 }
+ { 0 3 }
+ { 1 2 }
+ { 1 3 }
+ { 2 3 }
+ { 0 1 2 }
+ { 0 1 3 }
+ { 0 2 3 }
+ { 1 2 3 }
+ { 0 1 2 3 }
+
+All 16 subsets are generated, and the subsets of each size are sorted
+lexicographically.
+
+
+File: gsl-ref.info, Node: Combination References and Further Reading, Prev: Combination Examples, Up: Combinations
+
+10.8 References and Further Reading
+===================================
+
+Further information on combinations can be found in,
+
+ Donald L. Kreher, Douglas R. Stinson, `Combinatorial Algorithms:
+ Generation, Enumeration and Search', 1998, CRC Press LLC, ISBN
+ 084933988X
+
+
+
+File: gsl-ref.info, Node: Sorting, Next: BLAS Support, Prev: Combinations, Up: Top
+
+11 Sorting
+**********
+
+This chapter describes functions for sorting data, both directly and
+indirectly (using an index). All the functions use the "heapsort"
+algorithm. Heapsort is an O(N \log N) algorithm which operates
+in-place and does not require any additional storage. It also provides
+consistent performance, the running time for its worst-case (ordered
+data) being not significantly longer than the average and best cases.
+Note that the heapsort algorithm does not preserve the relative ordering
+of equal elements--it is an "unstable" sort. However the resulting
+order of equal elements will be consistent across different platforms
+when using these functions.
+
+* Menu:
+
+* Sorting objects::
+* Sorting vectors::
+* Selecting the k smallest or largest elements::
+* Computing the rank::
+* Sorting Examples::
+* Sorting References and Further Reading::
+
+
+File: gsl-ref.info, Node: Sorting objects, Next: Sorting vectors, Up: Sorting
+
+11.1 Sorting objects
+====================
+
+The following function provides a simple alternative to the standard
+library function `qsort'. It is intended for systems lacking `qsort',
+not as a replacement for it. The function `qsort' should be used
+whenever possible, as it will be faster and can provide stable ordering
+of equal elements. Documentation for `qsort' is available in the `GNU
+C Library Reference Manual'.
+
+ The functions described in this section are defined in the header
+file `gsl_heapsort.h'.
+
+ -- Function: void gsl_heapsort (void * ARRAY, size_t COUNT, size_t
+ SIZE, gsl_comparison_fn_t COMPARE)
+ This function sorts the COUNT elements of the array ARRAY, each of
+ size SIZE, into ascending order using the comparison function
+ COMPARE. The type of the comparison function is defined by,
+
+ int (*gsl_comparison_fn_t) (const void * a,
+ const void * b)
+
+ A comparison function should return a negative integer if the first
+ argument is less than the second argument, `0' if the two arguments
+ are equal and a positive integer if the first argument is greater
+ than the second argument.
+
+ For example, the following function can be used to sort doubles
+ into ascending numerical order.
+
+ int
+ compare_doubles (const double * a,
+ const double * b)
+ {
+ if (*a > *b)
+ return 1;
+ else if (*a < *b)
+ return -1;
+ else
+ return 0;
+ }
+
+ The appropriate function call to perform the sort is,
+
+ gsl_heapsort (array, count, sizeof(double),
+ compare_doubles);
+
+ Note that unlike `qsort' the heapsort algorithm cannot be made into
+ a stable sort by pointer arithmetic. The trick of comparing
+ pointers for equal elements in the comparison function does not
+ work for the heapsort algorithm. The heapsort algorithm performs
+ an internal rearrangement of the data which destroys its initial
+ ordering.
+
+ -- Function: int gsl_heapsort_index (size_t * P, const void * ARRAY,
+ size_t COUNT, size_t SIZE, gsl_comparison_fn_t COMPARE)
+ This function indirectly sorts the COUNT elements of the array
+ ARRAY, each of size SIZE, into ascending order using the
+ comparison function COMPARE. The resulting permutation is stored
+ in P, an array of length N. The elements of P give the index of
+ the array element which would have been stored in that position if
+ the array had been sorted in place. The first element of P gives
+ the index of the least element in ARRAY, and the last element of P
+ gives the index of the greatest element in ARRAY. The array
+ itself is not changed.
+
+
+File: gsl-ref.info, Node: Sorting vectors, Next: Selecting the k smallest or largest elements, Prev: Sorting objects, Up: Sorting
+
+11.2 Sorting vectors
+====================
+
+The following functions will sort the elements of an array or vector,
+either directly or indirectly. They are defined for all real and
+integer types using the normal suffix rules. For example, the `float'
+versions of the array functions are `gsl_sort_float' and
+`gsl_sort_float_index'. The corresponding vector functions are
+`gsl_sort_vector_float' and `gsl_sort_vector_float_index'. The
+prototypes are available in the header files `gsl_sort_float.h'
+`gsl_sort_vector_float.h'. The complete set of prototypes can be
+included using the header files `gsl_sort.h' and `gsl_sort_vector.h'.
+
+ There are no functions for sorting complex arrays or vectors, since
+the ordering of complex numbers is not uniquely defined. To sort a
+complex vector by magnitude compute a real vector containing the
+magnitudes of the complex elements, and sort this vector indirectly.
+The resulting index gives the appropriate ordering of the original
+complex vector.
+
+ -- Function: void gsl_sort (double * DATA, size_t STRIDE, size_t N)
+ This function sorts the N elements of the array DATA with stride
+ STRIDE into ascending numerical order.
+
+ -- Function: void gsl_sort_vector (gsl_vector * V)
+ This function sorts the elements of the vector V into ascending
+ numerical order.
+
+ -- Function: void gsl_sort_index (size_t * P, const double * DATA,
+ size_t STRIDE, size_t N)
+ This function indirectly sorts the N elements of the array DATA
+ with stride STRIDE into ascending order, storing the resulting
+ permutation in P. The array P must be allocated with a sufficient
+ length to store the N elements of the permutation. The elements
+ of P give the index of the array element which would have been
+ stored in that position if the array had been sorted in place.
+ The array DATA is not changed.
+
+ -- Function: int gsl_sort_vector_index (gsl_permutation * P, const
+ gsl_vector * V)
+ This function indirectly sorts the elements of the vector V into
+ ascending order, storing the resulting permutation in P. The
+ elements of P give the index of the vector element which would
+ have been stored in that position if the vector had been sorted in
+ place. The first element of P gives the index of the least element
+ in V, and the last element of P gives the index of the greatest
+ element in V. The vector V is not changed.
+
diff --git a/gsl-1.9/doc/gsl-ref.info-2 b/gsl-1.9/doc/gsl-ref.info-2
new file mode 100644
index 0000000..3fd15e9
--- /dev/null
+++ b/gsl-1.9/doc/gsl-ref.info-2
@@ -0,0 +1,7071 @@
+This is gsl-ref.info, produced by makeinfo version 4.8 from
+gsl-ref.texi.
+
+INFO-DIR-SECTION Scientific software
+START-INFO-DIR-ENTRY
+* gsl-ref: (gsl-ref). GNU Scientific Library - Reference
+END-INFO-DIR-ENTRY
+
+ Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+2005, 2006, 2007 The GSL Team.
+
+ Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2 or
+any later version published by the Free Software Foundation; with the
+Invariant Sections being "GNU General Public License" and "Free Software
+Needs Free Documentation", the Front-Cover text being "A GNU Manual",
+and with the Back-Cover Text being (a) (see below). A copy of the
+license is included in the section entitled "GNU Free Documentation
+License".
+
+ (a) The Back-Cover Text is: "You have freedom to copy and modify this
+GNU Manual, like GNU software."
+
+
+File: gsl-ref.info, Node: Selecting the k smallest or largest elements, Next: Computing the rank, Prev: Sorting vectors, Up: Sorting
+
+11.3 Selecting the k smallest or largest elements
+=================================================
+
+The functions described in this section select the k smallest or
+largest elements of a data set of size N. The routines use an O(kN)
+direct insertion algorithm which is suited to subsets that are small
+compared with the total size of the dataset. For example, the routines
+are useful for selecting the 10 largest values from one million data
+points, but not for selecting the largest 100,000 values. If the
+subset is a significant part of the total dataset it may be faster to
+sort all the elements of the dataset directly with an O(N \log N)
+algorithm and obtain the smallest or largest values that way.
+
+ -- Function: int gsl_sort_smallest (double * DEST, size_t K, const
+ double * SRC, size_t STRIDE, size_t N)
+ This function copies the K smallest elements of the array SRC, of
+ size N and stride STRIDE, in ascending numerical order into the
+ array DEST. The size K of the subset must be less than or equal
+ to N. The data SRC is not modified by this operation.
+
+ -- Function: int gsl_sort_largest (double * DEST, size_t K, const
+ double * SRC, size_t STRIDE, size_t N)
+ This function copies the K largest elements of the array SRC, of
+ size N and stride STRIDE, in descending numerical order into the
+ array DEST. K must be less than or equal to N. The data SRC is not
+ modified by this operation.
+
+ -- Function: int gsl_sort_vector_smallest (double * DEST, size_t K,
+ const gsl_vector * V)
+ -- Function: int gsl_sort_vector_largest (double * DEST, size_t K,
+ const gsl_vector * V)
+ These functions copy the K smallest or largest elements of the
+ vector V into the array DEST. K must be less than or equal to the
+ length of the vector V.
+
+ The following functions find the indices of the k smallest or
+largest elements of a dataset,
+
+ -- Function: int gsl_sort_smallest_index (size_t * P, size_t K, const
+ double * SRC, size_t STRIDE, size_t N)
+ This function stores the indices of the K smallest elements of the
+ array SRC, of size N and stride STRIDE, in the array P. The
+ indices are chosen so that the corresponding data is in ascending
+ numerical order. K must be less than or equal to N. The data SRC
+ is not modified by this operation.
+
+ -- Function: int gsl_sort_largest_index (size_t * P, size_t K, const
+ double * SRC, size_t STRIDE, size_t N)
+ This function stores the indices of the K largest elements of the
+ array SRC, of size N and stride STRIDE, in the array P. The
+ indices are chosen so that the corresponding data is in descending
+ numerical order. K must be less than or equal to N. The data SRC
+ is not modified by this operation.
+
+ -- Function: int gsl_sort_vector_smallest_index (size_t * P, size_t K,
+ const gsl_vector * V)
+ -- Function: int gsl_sort_vector_largest_index (size_t * P, size_t K,
+ const gsl_vector * V)
+ These functions store the indices of the K smallest or largest
+ elements of the vector V in the array P. K must be less than or
+ equal to the length of the vector V.
+
+
+File: gsl-ref.info, Node: Computing the rank, Next: Sorting Examples, Prev: Selecting the k smallest or largest elements, Up: Sorting
+
+11.4 Computing the rank
+=======================
+
+The "rank" of an element is its order in the sorted data. The rank is
+the inverse of the index permutation, P. It can be computed using the
+following algorithm,
+
+ for (i = 0; i < p->size; i++)
+ {
+ size_t pi = p->data[i];
+ rank->data[pi] = i;
+ }
+
+This can be computed directly from the function
+`gsl_permutation_inverse(rank,p)'.
+
+ The following function will print the rank of each element of the
+vector V,
+
+ void
+ print_rank (gsl_vector * v)
+ {
+ size_t i;
+ size_t n = v->size;
+ gsl_permutation * perm = gsl_permutation_alloc(n);
+ gsl_permutation * rank = gsl_permutation_alloc(n);
+
+ gsl_sort_vector_index (perm, v);
+ gsl_permutation_inverse (rank, perm);
+
+ for (i = 0; i < n; i++)
+ {
+ double vi = gsl_vector_get(v, i);
+ printf ("element = %d, value = %g, rank = %d\n",
+ i, vi, rank->data[i]);
+ }
+
+ gsl_permutation_free (perm);
+ gsl_permutation_free (rank);
+ }
+
+
+File: gsl-ref.info, Node: Sorting Examples, Next: Sorting References and Further Reading, Prev: Computing the rank, Up: Sorting
+
+11.5 Examples
+=============
+
+The following example shows how to use the permutation P to print the
+elements of the vector V in ascending order,
+
+ gsl_sort_vector_index (p, v);
+
+ for (i = 0; i < v->size; i++)
+ {
+ double vpi = gsl_vector_get (v, p->data[i]);
+ printf ("order = %d, value = %g\n", i, vpi);
+ }
+
+The next example uses the function `gsl_sort_smallest' to select the 5
+smallest numbers from 100000 uniform random variates stored in an array,
+
+ #include <gsl/gsl_rng.h>
+ #include <gsl/gsl_sort_double.h>
+
+ int
+ main (void)
+ {
+ const gsl_rng_type * T;
+ gsl_rng * r;
+
+ size_t i, k = 5, N = 100000;
+
+ double * x = malloc (N * sizeof(double));
+ double * small = malloc (k * sizeof(double));
+
+ gsl_rng_env_setup();
+
+ T = gsl_rng_default;
+ r = gsl_rng_alloc (T);
+
+ for (i = 0; i < N; i++)
+ {
+ x[i] = gsl_rng_uniform(r);
+ }
+
+ gsl_sort_smallest (small, k, x, 1, N);
+
+ printf ("%d smallest values from %d\n", k, N);
+
+ for (i = 0; i < k; i++)
+ {
+ printf ("%d: %.18f\n", i, small[i]);
+ }
+
+ free (x);
+ free (small);
+ gsl_rng_free (r);
+ return 0;
+ }
+ The output lists the 5 smallest values, in ascending order,
+
+ $ ./a.out
+ 5 smallest values from 100000
+ 0: 0.000003489200025797
+ 1: 0.000008199829608202
+ 2: 0.000008953968062997
+ 3: 0.000010712770745158
+ 4: 0.000033531803637743
+
+
+File: gsl-ref.info, Node: Sorting References and Further Reading, Prev: Sorting Examples, Up: Sorting
+
+11.6 References and Further Reading
+===================================
+
+The subject of sorting is covered extensively in Knuth's `Sorting and
+Searching',
+
+ Donald E. Knuth, `The Art of Computer Programming: Sorting and
+ Searching' (Vol 3, 3rd Ed, 1997), Addison-Wesley, ISBN 0201896850.
+
+The Heapsort algorithm is described in the following book,
+
+ Robert Sedgewick, `Algorithms in C', Addison-Wesley, ISBN
+ 0201514257.
+
+
+File: gsl-ref.info, Node: BLAS Support, Next: Linear Algebra, Prev: Sorting, Up: Top
+
+12 BLAS Support
+***************
+
+The Basic Linear Algebra Subprograms (BLAS) define a set of fundamental
+operations on vectors and matrices which can be used to create optimized
+higher-level linear algebra functionality.
+
+ The library provides a low-level layer which corresponds directly to
+the C-language BLAS standard, referred to here as "CBLAS", and a
+higher-level interface for operations on GSL vectors and matrices.
+Users who are interested in simple operations on GSL vector and matrix
+objects should use the high-level layer, which is declared in the file
+`gsl_blas.h'. This should satisfy the needs of most users. Note that
+GSL matrices are implemented using dense-storage so the interface only
+includes the corresponding dense-storage BLAS functions. The full BLAS
+functionality for band-format and packed-format matrices is available
+through the low-level CBLAS interface.
+
+ The interface for the `gsl_cblas' layer is specified in the file
+`gsl_cblas.h'. This interface corresponds to the BLAS Technical
+Forum's draft standard for the C interface to legacy BLAS
+implementations. Users who have access to other conforming CBLAS
+implementations can use these in place of the version provided by the
+library. Note that users who have only a Fortran BLAS library can use
+a CBLAS conformant wrapper to convert it into a CBLAS library. A
+reference CBLAS wrapper for legacy Fortran implementations exists as
+part of the draft CBLAS standard and can be obtained from Netlib. The
+complete set of CBLAS functions is listed in an appendix (*note GSL
+CBLAS Library::).
+
+ There are three levels of BLAS operations,
+
+Level 1
+ Vector operations, e.g. y = \alpha x + y
+
+Level 2
+ Matrix-vector operations, e.g. y = \alpha A x + \beta y
+
+Level 3
+ Matrix-matrix operations, e.g. C = \alpha A B + C
+
+Each routine has a name which specifies the operation, the type of
+matrices involved and their precisions. Some of the most common
+operations and their names are given below,
+
+DOT
+ scalar product, x^T y
+
+AXPY
+ vector sum, \alpha x + y
+
+MV
+ matrix-vector product, A x
+
+SV
+ matrix-vector solve, inv(A) x
+
+MM
+ matrix-matrix product, A B
+
+SM
+ matrix-matrix solve, inv(A) B
+
+The types of matrices are,
+
+GE
+ general
+
+GB
+ general band
+
+SY
+ symmetric
+
+SB
+ symmetric band
+
+SP
+ symmetric packed
+
+HE
+ hermitian
+
+HB
+ hermitian band
+
+HP
+ hermitian packed
+
+TR
+ triangular
+
+TB
+ triangular band
+
+TP
+ triangular packed
+
+Each operation is defined for four precisions,
+
+S
+ single real
+
+D
+ double real
+
+C
+ single complex
+
+Z
+ double complex
+
+Thus, for example, the name SGEMM stands for "single-precision general
+matrix-matrix multiply" and ZGEMM stands for "double-precision complex
+matrix-matrix multiply".
+
+* Menu:
+
+* GSL BLAS Interface::
+* BLAS Examples::
+* BLAS References and Further Reading::
+
+
+File: gsl-ref.info, Node: GSL BLAS Interface, Next: BLAS Examples, Up: BLAS Support
+
+12.1 GSL BLAS Interface
+=======================
+
+GSL provides dense vector and matrix objects, based on the relevant
+built-in types. The library provides an interface to the BLAS
+operations which apply to these objects. The interface to this
+functionality is given in the file `gsl_blas.h'.
+
+* Menu:
+
+* Level 1 GSL BLAS Interface::
+* Level 2 GSL BLAS Interface::
+* Level 3 GSL BLAS Interface::
+
+
+File: gsl-ref.info, Node: Level 1 GSL BLAS Interface, Next: Level 2 GSL BLAS Interface, Up: GSL BLAS Interface
+
+12.1.1 Level 1
+--------------
+
+ -- Function: int gsl_blas_sdsdot (float ALPHA, const gsl_vector_float
+ * X, const gsl_vector_float * Y, float * RESULT)
+ This function computes the sum \alpha + x^T y for the vectors X
+ and Y, returning the result in RESULT.
+
+ -- Function: int gsl_blas_sdot (const gsl_vector_float * X, const
+ gsl_vector_float * Y, float * RESULT)
+ -- Function: int gsl_blas_dsdot (const gsl_vector_float * X, const
+ gsl_vector_float * Y, double * RESULT)
+ -- Function: int gsl_blas_ddot (const gsl_vector * X, const gsl_vector
+ * Y, double * RESULT)
+ These functions compute the scalar product x^T y for the vectors X
+ and Y, returning the result in RESULT.
+
+ -- Function: int gsl_blas_cdotu (const gsl_vector_complex_float * X,
+ const gsl_vector_complex_float * Y, gsl_complex_float * DOTU)
+ -- Function: int gsl_blas_zdotu (const gsl_vector_complex * X, const
+ gsl_vector_complex * Y, gsl_complex * DOTU)
+ These functions compute the complex scalar product x^T y for the
+ vectors X and Y, returning the result in RESULT
+
+ -- Function: int gsl_blas_cdotc (const gsl_vector_complex_float * X,
+ const gsl_vector_complex_float * Y, gsl_complex_float * DOTC)
+ -- Function: int gsl_blas_zdotc (const gsl_vector_complex * X, const
+ gsl_vector_complex * Y, gsl_complex * DOTC)
+ These functions compute the complex conjugate scalar product x^H y
+ for the vectors X and Y, returning the result in RESULT
+
+ -- Function: float gsl_blas_snrm2 (const gsl_vector_float * X)
+ -- Function: double gsl_blas_dnrm2 (const gsl_vector * X)
+ These functions compute the Euclidean norm ||x||_2 = \sqrt {\sum
+ x_i^2} of the vector X.
+
+ -- Function: float gsl_blas_scnrm2 (const gsl_vector_complex_float * X)
+ -- Function: double gsl_blas_dznrm2 (const gsl_vector_complex * X)
+ These functions compute the Euclidean norm of the complex vector X,
+
+ ||x||_2 = \sqrt {\sum (\Re(x_i)^2 + \Im(x_i)^2)}.
+
+ -- Function: float gsl_blas_sasum (const gsl_vector_float * X)
+ -- Function: double gsl_blas_dasum (const gsl_vector * X)
+ These functions compute the absolute sum \sum |x_i| of the
+ elements of the vector X.
+
+ -- Function: float gsl_blas_scasum (const gsl_vector_complex_float * X)
+ -- Function: double gsl_blas_dzasum (const gsl_vector_complex * X)
+ These functions compute the sum of the magnitudes of the real and
+ imaginary parts of the complex vector X, \sum |\Re(x_i)| +
+ |\Im(x_i)|.
+
+ -- Function: CBLAS_INDEX_t gsl_blas_isamax (const gsl_vector_float * X)
+ -- Function: CBLAS_INDEX_t gsl_blas_idamax (const gsl_vector * X)
+ -- Function: CBLAS_INDEX_t gsl_blas_icamax (const
+ gsl_vector_complex_float * X)
+ -- Function: CBLAS_INDEX_t gsl_blas_izamax (const gsl_vector_complex *
+ X)
+ These functions return the index of the largest element of the
+ vector X. The largest element is determined by its absolute
+ magnitude for real vectors and by the sum of the magnitudes of the
+ real and imaginary parts |\Re(x_i)| + |\Im(x_i)| for complex
+ vectors. If the largest value occurs several times then the index
+ of the first occurrence is returned.
+
+ -- Function: int gsl_blas_sswap (gsl_vector_float * X,
+ gsl_vector_float * Y)
+ -- Function: int gsl_blas_dswap (gsl_vector * X, gsl_vector * Y)
+ -- Function: int gsl_blas_cswap (gsl_vector_complex_float * X,
+ gsl_vector_complex_float * Y)
+ -- Function: int gsl_blas_zswap (gsl_vector_complex * X,
+ gsl_vector_complex * Y)
+ These functions exchange the elements of the vectors X and Y.
+
+ -- Function: int gsl_blas_scopy (const gsl_vector_float * X,
+ gsl_vector_float * Y)
+ -- Function: int gsl_blas_dcopy (const gsl_vector * X, gsl_vector * Y)
+ -- Function: int gsl_blas_ccopy (const gsl_vector_complex_float * X,
+ gsl_vector_complex_float * Y)
+ -- Function: int gsl_blas_zcopy (const gsl_vector_complex * X,
+ gsl_vector_complex * Y)
+ These functions copy the elements of the vector X into the vector
+ Y.
+
+ -- Function: int gsl_blas_saxpy (float ALPHA, const gsl_vector_float *
+ X, gsl_vector_float * Y)
+ -- Function: int gsl_blas_daxpy (double ALPHA, const gsl_vector * X,
+ gsl_vector * Y)
+ -- Function: int gsl_blas_caxpy (const gsl_complex_float ALPHA, const
+ gsl_vector_complex_float * X, gsl_vector_complex_float * Y)
+ -- Function: int gsl_blas_zaxpy (const gsl_complex ALPHA, const
+ gsl_vector_complex * X, gsl_vector_complex * Y)
+ These functions compute the sum y = \alpha x + y for the vectors X
+ and Y.
+
+ -- Function: void gsl_blas_sscal (float ALPHA, gsl_vector_float * X)
+ -- Function: void gsl_blas_dscal (double ALPHA, gsl_vector * X)
+ -- Function: void gsl_blas_cscal (const gsl_complex_float ALPHA,
+ gsl_vector_complex_float * X)
+ -- Function: void gsl_blas_zscal (const gsl_complex ALPHA,
+ gsl_vector_complex * X)
+ -- Function: void gsl_blas_csscal (float ALPHA,
+ gsl_vector_complex_float * X)
+ -- Function: void gsl_blas_zdscal (double ALPHA, gsl_vector_complex *
+ X)
+ These functions rescale the vector X by the multiplicative factor
+ ALPHA.
+
+ -- Function: int gsl_blas_srotg (float A[], float B[], float C[],
+ float S[])
+ -- Function: int gsl_blas_drotg (double A[], double B[], double C[],
+ double S[])
+ These functions compute a Givens rotation (c,s) which zeroes the
+ vector (a,b),
+
+ [ c s ] [ a ] = [ r ]
+ [ -s c ] [ b ] [ 0 ]
+
+ The variables A and B are overwritten by the routine.
+
+ -- Function: int gsl_blas_srot (gsl_vector_float * X, gsl_vector_float
+ * Y, float C, float S)
+ -- Function: int gsl_blas_drot (gsl_vector * X, gsl_vector * Y, const
+ double C, const double S)
+ These functions apply a Givens rotation (x', y') = (c x + s y, -s
+ x + c y) to the vectors X, Y.
+
+ -- Function: int gsl_blas_srotmg (float D1[], float D2[], float B1[],
+ float B2, float P[])
+ -- Function: int gsl_blas_drotmg (double D1[], double D2[], double
+ B1[], double B2, double P[])
+ These functions compute a modified Givens transformation. The
+ modified Givens transformation is defined in the original Level-1
+ BLAS specification, given in the references.
+
+ -- Function: int gsl_blas_srotm (gsl_vector_float * X,
+ gsl_vector_float * Y, const float P[])
+ -- Function: int gsl_blas_drotm (gsl_vector * X, gsl_vector * Y, const
+ double P[])
+ These functions apply a modified Givens transformation.
+
+
+File: gsl-ref.info, Node: Level 2 GSL BLAS Interface, Next: Level 3 GSL BLAS Interface, Prev: Level 1 GSL BLAS Interface, Up: GSL BLAS Interface
+
+12.1.2 Level 2
+--------------
+
+ -- Function: int gsl_blas_sgemv (CBLAS_TRANSPOSE_t TRANSA, float
+ ALPHA, const gsl_matrix_float * A, const gsl_vector_float *
+ X, float BETA, gsl_vector_float * Y)
+ -- Function: int gsl_blas_dgemv (CBLAS_TRANSPOSE_t TRANSA, double
+ ALPHA, const gsl_matrix * A, const gsl_vector * X, double
+ BETA, gsl_vector * Y)
+ -- Function: int gsl_blas_cgemv (CBLAS_TRANSPOSE_t TRANSA, const
+ gsl_complex_float ALPHA, const gsl_matrix_complex_float * A,
+ const gsl_vector_complex_float * X, const gsl_complex_float
+ BETA, gsl_vector_complex_float * Y)
+ -- Function: int gsl_blas_zgemv (CBLAS_TRANSPOSE_t TRANSA, const
+ gsl_complex ALPHA, const gsl_matrix_complex * A, const
+ gsl_vector_complex * X, const gsl_complex BETA,
+ gsl_vector_complex * Y)
+ These functions compute the matrix-vector product and sum y =
+ \alpha op(A) x + \beta y, where op(A) = A, A^T, A^H for TRANSA =
+ `CblasNoTrans', `CblasTrans', `CblasConjTrans'.
+
+ -- Function: int gsl_blas_strmv (CBLAS_UPLO_t UPLO, CBLAS_TRANSPOSE_t
+ TRANSA, CBLAS_DIAG_t DIAG, const gsl_matrix_float * A,
+ gsl_vector_float * X)
+ -- Function: int gsl_blas_dtrmv (CBLAS_UPLO_t UPLO, CBLAS_TRANSPOSE_t
+ TRANSA, CBLAS_DIAG_t DIAG, const gsl_matrix * A, gsl_vector *
+ X)
+ -- Function: int gsl_blas_ctrmv (CBLAS_UPLO_t UPLO, CBLAS_TRANSPOSE_t
+ TRANSA, CBLAS_DIAG_t DIAG, const gsl_matrix_complex_float *
+ A, gsl_vector_complex_float * X)
+ -- Function: int gsl_blas_ztrmv (CBLAS_UPLO_t UPLO, CBLAS_TRANSPOSE_t
+ TRANSA, CBLAS_DIAG_t DIAG, const gsl_matrix_complex * A,
+ gsl_vector_complex * X)
+ These functions compute the matrix-vector product x = op(A) x for
+ the triangular matrix A, where op(A) = A, A^T, A^H for TRANSA =
+ `CblasNoTrans', `CblasTrans', `CblasConjTrans'. When UPLO is
+ `CblasUpper' then the upper triangle of A is used, and when UPLO
+ is `CblasLower' then the lower triangle of A is used. If DIAG is
+ `CblasNonUnit' then the diagonal of the matrix is used, but if
+ DIAG is `CblasUnit' then the diagonal elements of the matrix A are
+ taken as unity and are not referenced.
+
+ -- Function: int gsl_blas_strsv (CBLAS_UPLO_t UPLO, CBLAS_TRANSPOSE_t
+ TRANSA, CBLAS_DIAG_t DIAG, const gsl_matrix_float * A,
+ gsl_vector_float * X)
+ -- Function: int gsl_blas_dtrsv (CBLAS_UPLO_t UPLO, CBLAS_TRANSPOSE_t
+ TRANSA, CBLAS_DIAG_t DIAG, const gsl_matrix * A, gsl_vector *
+ X)
+ -- Function: int gsl_blas_ctrsv (CBLAS_UPLO_t UPLO, CBLAS_TRANSPOSE_t
+ TRANSA, CBLAS_DIAG_t DIAG, const gsl_matrix_complex_float *
+ A, gsl_vector_complex_float * X)
+ -- Function: int gsl_blas_ztrsv (CBLAS_UPLO_t UPLO, CBLAS_TRANSPOSE_t
+ TRANSA, CBLAS_DIAG_t DIAG, const gsl_matrix_complex * A,
+ gsl_vector_complex * X)
+ These functions compute inv(op(A)) x for X, where op(A) = A, A^T,
+ A^H for TRANSA = `CblasNoTrans', `CblasTrans', `CblasConjTrans'.
+ When UPLO is `CblasUpper' then the upper triangle of A is used,
+ and when UPLO is `CblasLower' then the lower triangle of A is
+ used. If DIAG is `CblasNonUnit' then the diagonal of the matrix
+ is used, but if DIAG is `CblasUnit' then the diagonal elements of
+ the matrix A are taken as unity and are not referenced.
+
+ -- Function: int gsl_blas_ssymv (CBLAS_UPLO_t UPLO, float ALPHA, const
+ gsl_matrix_float * A, const gsl_vector_float * X, float BETA,
+ gsl_vector_float * Y)
+ -- Function: int gsl_blas_dsymv (CBLAS_UPLO_t UPLO, double ALPHA,
+ const gsl_matrix * A, const gsl_vector * X, double BETA,
+ gsl_vector * Y)
+ These functions compute the matrix-vector product and sum y =
+ \alpha A x + \beta y for the symmetric matrix A. Since the matrix
+ A is symmetric only its upper half or lower half need to be
+ stored. When UPLO is `CblasUpper' then the upper triangle and
+ diagonal of A are used, and when UPLO is `CblasLower' then the
+ lower triangle and diagonal of A are used.
+
+ -- Function: int gsl_blas_chemv (CBLAS_UPLO_t UPLO, const
+ gsl_complex_float ALPHA, const gsl_matrix_complex_float * A,
+ const gsl_vector_complex_float * X, const gsl_complex_float
+ BETA, gsl_vector_complex_float * Y)
+ -- Function: int gsl_blas_zhemv (CBLAS_UPLO_t UPLO, const gsl_complex
+ ALPHA, const gsl_matrix_complex * A, const gsl_vector_complex
+ * X, const gsl_complex BETA, gsl_vector_complex * Y)
+ These functions compute the matrix-vector product and sum y =
+ \alpha A x + \beta y for the hermitian matrix A. Since the matrix
+ A is hermitian only its upper half or lower half need to be
+ stored. When UPLO is `CblasUpper' then the upper triangle and
+ diagonal of A are used, and when UPLO is `CblasLower' then the
+ lower triangle and diagonal of A are used. The imaginary elements
+ of the diagonal are automatically assumed to be zero and are not
+ referenced.
+
+ -- Function: int gsl_blas_sger (float ALPHA, const gsl_vector_float *
+ X, const gsl_vector_float * Y, gsl_matrix_float * A)
+ -- Function: int gsl_blas_dger (double ALPHA, const gsl_vector * X,
+ const gsl_vector * Y, gsl_matrix * A)
+ -- Function: int gsl_blas_cgeru (const gsl_complex_float ALPHA, const
+ gsl_vector_complex_float * X, const gsl_vector_complex_float
+ * Y, gsl_matrix_complex_float * A)
+ -- Function: int gsl_blas_zgeru (const gsl_complex ALPHA, const
+ gsl_vector_complex * X, const gsl_vector_complex * Y,
+ gsl_matrix_complex * A)
+ These functions compute the rank-1 update A = \alpha x y^T + A of
+ the matrix A.
+
+ -- Function: int gsl_blas_cgerc (const gsl_complex_float ALPHA, const
+ gsl_vector_complex_float * X, const gsl_vector_complex_float
+ * Y, gsl_matrix_complex_float * A)
+ -- Function: int gsl_blas_zgerc (const gsl_complex ALPHA, const
+ gsl_vector_complex * X, const gsl_vector_complex * Y,
+ gsl_matrix_complex * A)
+ These functions compute the conjugate rank-1 update A = \alpha x
+ y^H + A of the matrix A.
+
+ -- Function: int gsl_blas_ssyr (CBLAS_UPLO_t UPLO, float ALPHA, const
+ gsl_vector_float * X, gsl_matrix_float * A)
+ -- Function: int gsl_blas_dsyr (CBLAS_UPLO_t UPLO, double ALPHA, const
+ gsl_vector * X, gsl_matrix * A)
+ These functions compute the symmetric rank-1 update A = \alpha x
+ x^T + A of the symmetric matrix A. Since the matrix A is
+ symmetric only its upper half or lower half need to be stored.
+ When UPLO is `CblasUpper' then the upper triangle and diagonal of
+ A are used, and when UPLO is `CblasLower' then the lower triangle
+ and diagonal of A are used.
+
+ -- Function: int gsl_blas_cher (CBLAS_UPLO_t UPLO, float ALPHA, const
+ gsl_vector_complex_float * X, gsl_matrix_complex_float * A)
+ -- Function: int gsl_blas_zher (CBLAS_UPLO_t UPLO, double ALPHA, const
+ gsl_vector_complex * X, gsl_matrix_complex * A)
+ These functions compute the hermitian rank-1 update A = \alpha x
+ x^H + A of the hermitian matrix A. Since the matrix A is
+ hermitian only its upper half or lower half need to be stored.
+ When UPLO is `CblasUpper' then the upper triangle and diagonal of
+ A are used, and when UPLO is `CblasLower' then the lower triangle
+ and diagonal of A are used. The imaginary elements of the
+ diagonal are automatically set to zero.
+
+ -- Function: int gsl_blas_ssyr2 (CBLAS_UPLO_t UPLO, float ALPHA, const
+ gsl_vector_float * X, const gsl_vector_float * Y,
+ gsl_matrix_float * A)
+ -- Function: int gsl_blas_dsyr2 (CBLAS_UPLO_t UPLO, double ALPHA,
+ const gsl_vector * X, const gsl_vector * Y, gsl_matrix * A)
+ These functions compute the symmetric rank-2 update A = \alpha x
+ y^T + \alpha y x^T + A of the symmetric matrix A. Since the
+ matrix A is symmetric only its upper half or lower half need to be
+ stored. When UPLO is `CblasUpper' then the upper triangle and
+ diagonal of A are used, and when UPLO is `CblasLower' then the
+ lower triangle and diagonal of A are used.
+
+ -- Function: int gsl_blas_cher2 (CBLAS_UPLO_t UPLO, const
+ gsl_complex_float ALPHA, const gsl_vector_complex_float * X,
+ const gsl_vector_complex_float * Y, gsl_matrix_complex_float
+ * A)
+ -- Function: int gsl_blas_zher2 (CBLAS_UPLO_t UPLO, const gsl_complex
+ ALPHA, const gsl_vector_complex * X, const gsl_vector_complex
+ * Y, gsl_matrix_complex * A)
+ These functions compute the hermitian rank-2 update A = \alpha x
+ y^H + \alpha^* y x^H A of the hermitian matrix A. Since the
+ matrix A is hermitian only its upper half or lower half need to be
+ stored. When UPLO is `CblasUpper' then the upper triangle and
+ diagonal of A are used, and when UPLO is `CblasLower' then the
+ lower triangle and diagonal of A are used. The imaginary elements
+ of the diagonal are automatically set to zero.
+
+
+File: gsl-ref.info, Node: Level 3 GSL BLAS Interface, Prev: Level 2 GSL BLAS Interface, Up: GSL BLAS Interface
+
+12.1.3 Level 3
+--------------
+
+ -- Function: int gsl_blas_sgemm (CBLAS_TRANSPOSE_t TRANSA,
+ CBLAS_TRANSPOSE_t TRANSB, float ALPHA, const gsl_matrix_float
+ * A, const gsl_matrix_float * B, float BETA, gsl_matrix_float
+ * C)
+ -- Function: int gsl_blas_dgemm (CBLAS_TRANSPOSE_t TRANSA,
+ CBLAS_TRANSPOSE_t TRANSB, double ALPHA, const gsl_matrix * A,
+ const gsl_matrix * B, double BETA, gsl_matrix * C)
+ -- Function: int gsl_blas_cgemm (CBLAS_TRANSPOSE_t TRANSA,
+ CBLAS_TRANSPOSE_t TRANSB, const gsl_complex_float ALPHA,
+ const gsl_matrix_complex_float * A, const
+ gsl_matrix_complex_float * B, const gsl_complex_float BETA,
+ gsl_matrix_complex_float * C)
+ -- Function: int gsl_blas_zgemm (CBLAS_TRANSPOSE_t TRANSA,
+ CBLAS_TRANSPOSE_t TRANSB, const gsl_complex ALPHA, const
+ gsl_matrix_complex * A, const gsl_matrix_complex * B, const
+ gsl_complex BETA, gsl_matrix_complex * C)
+ These functions compute the matrix-matrix product and sum C =
+ \alpha op(A) op(B) + \beta C where op(A) = A, A^T, A^H for TRANSA
+ = `CblasNoTrans', `CblasTrans', `CblasConjTrans' and similarly for
+ the parameter TRANSB.
+
+ -- Function: int gsl_blas_ssymm (CBLAS_SIDE_t SIDE, CBLAS_UPLO_t UPLO,
+ float ALPHA, const gsl_matrix_float * A, const
+ gsl_matrix_float * B, float BETA, gsl_matrix_float * C)
+ -- Function: int gsl_blas_dsymm (CBLAS_SIDE_t SIDE, CBLAS_UPLO_t UPLO,
+ double ALPHA, const gsl_matrix * A, const gsl_matrix * B,
+ double BETA, gsl_matrix * C)
+ -- Function: int gsl_blas_csymm (CBLAS_SIDE_t SIDE, CBLAS_UPLO_t UPLO,
+ const gsl_complex_float ALPHA, const gsl_matrix_complex_float
+ * A, const gsl_matrix_complex_float * B, const
+ gsl_complex_float BETA, gsl_matrix_complex_float * C)
+ -- Function: int gsl_blas_zsymm (CBLAS_SIDE_t SIDE, CBLAS_UPLO_t UPLO,
+ const gsl_complex ALPHA, const gsl_matrix_complex * A, const
+ gsl_matrix_complex * B, const gsl_complex BETA,
+ gsl_matrix_complex * C)
+ These functions compute the matrix-matrix product and sum C =
+ \alpha A B + \beta C for SIDE is `CblasLeft' and C = \alpha B A +
+ \beta C for SIDE is `CblasRight', where the matrix A is symmetric.
+ When UPLO is `CblasUpper' then the upper triangle and diagonal of
+ A are used, and when UPLO is `CblasLower' then the lower triangle
+ and diagonal of A are used.
+
+ -- Function: int gsl_blas_chemm (CBLAS_SIDE_t SIDE, CBLAS_UPLO_t UPLO,
+ const gsl_complex_float ALPHA, const gsl_matrix_complex_float
+ * A, const gsl_matrix_complex_float * B, const
+ gsl_complex_float BETA, gsl_matrix_complex_float * C)
+ -- Function: int gsl_blas_zhemm (CBLAS_SIDE_t SIDE, CBLAS_UPLO_t UPLO,
+ const gsl_complex ALPHA, const gsl_matrix_complex * A, const
+ gsl_matrix_complex * B, const gsl_complex BETA,
+ gsl_matrix_complex * C)
+ These functions compute the matrix-matrix product and sum C =
+ \alpha A B + \beta C for SIDE is `CblasLeft' and C = \alpha B A +
+ \beta C for SIDE is `CblasRight', where the matrix A is hermitian.
+ When UPLO is `CblasUpper' then the upper triangle and diagonal of
+ A are used, and when UPLO is `CblasLower' then the lower triangle
+ and diagonal of A are used. The imaginary elements of the
+ diagonal are automatically set to zero.
+
+ -- Function: int gsl_blas_strmm (CBLAS_SIDE_t SIDE, CBLAS_UPLO_t UPLO,
+ CBLAS_TRANSPOSE_t TRANSA, CBLAS_DIAG_t DIAG, float ALPHA,
+ const gsl_matrix_float * A, gsl_matrix_float * B)
+ -- Function: int gsl_blas_dtrmm (CBLAS_SIDE_t SIDE, CBLAS_UPLO_t UPLO,
+ CBLAS_TRANSPOSE_t TRANSA, CBLAS_DIAG_t DIAG, double ALPHA,
+ const gsl_matrix * A, gsl_matrix * B)
+ -- Function: int gsl_blas_ctrmm (CBLAS_SIDE_t SIDE, CBLAS_UPLO_t UPLO,
+ CBLAS_TRANSPOSE_t TRANSA, CBLAS_DIAG_t DIAG, const
+ gsl_complex_float ALPHA, const gsl_matrix_complex_float * A,
+ gsl_matrix_complex_float * B)
+ -- Function: int gsl_blas_ztrmm (CBLAS_SIDE_t SIDE, CBLAS_UPLO_t UPLO,
+ CBLAS_TRANSPOSE_t TRANSA, CBLAS_DIAG_t DIAG, const
+ gsl_complex ALPHA, const gsl_matrix_complex * A,
+ gsl_matrix_complex * B)
+ These functions compute the matrix-matrix product B = \alpha op(A)
+ B for SIDE is `CblasLeft' and B = \alpha B op(A) for SIDE is
+ `CblasRight'. The matrix A is triangular and op(A) = A, A^T, A^H
+ for TRANSA = `CblasNoTrans', `CblasTrans', `CblasConjTrans'. When
+ UPLO is `CblasUpper' then the upper triangle of A is used, and
+ when UPLO is `CblasLower' then the lower triangle of A is used.
+ If DIAG is `CblasNonUnit' then the diagonal of A is used, but if
+ DIAG is `CblasUnit' then the diagonal elements of the matrix A are
+ taken as unity and are not referenced.
+
+ -- Function: int gsl_blas_strsm (CBLAS_SIDE_t SIDE, CBLAS_UPLO_t UPLO,
+ CBLAS_TRANSPOSE_t TRANSA, CBLAS_DIAG_t DIAG, float ALPHA,
+ const gsl_matrix_float * A, gsl_matrix_float * B)
+ -- Function: int gsl_blas_dtrsm (CBLAS_SIDE_t SIDE, CBLAS_UPLO_t UPLO,
+ CBLAS_TRANSPOSE_t TRANSA, CBLAS_DIAG_t DIAG, double ALPHA,
+ const gsl_matrix * A, gsl_matrix * B)
+ -- Function: int gsl_blas_ctrsm (CBLAS_SIDE_t SIDE, CBLAS_UPLO_t UPLO,
+ CBLAS_TRANSPOSE_t TRANSA, CBLAS_DIAG_t DIAG, const
+ gsl_complex_float ALPHA, const gsl_matrix_complex_float * A,
+ gsl_matrix_complex_float * B)
+ -- Function: int gsl_blas_ztrsm (CBLAS_SIDE_t SIDE, CBLAS_UPLO_t UPLO,
+ CBLAS_TRANSPOSE_t TRANSA, CBLAS_DIAG_t DIAG, const
+ gsl_complex ALPHA, const gsl_matrix_complex * A,
+ gsl_matrix_complex * B)
+ These functions compute the inverse-matrix matrix product B =
+ \alpha op(inv(A))B for SIDE is `CblasLeft' and B = \alpha B
+ op(inv(A)) for SIDE is `CblasRight'. The matrix A is triangular
+ and op(A) = A, A^T, A^H for TRANSA = `CblasNoTrans', `CblasTrans',
+ `CblasConjTrans'. When UPLO is `CblasUpper' then the upper
+ triangle of A is used, and when UPLO is `CblasLower' then the
+ lower triangle of A is used. If DIAG is `CblasNonUnit' then the
+ diagonal of A is used, but if DIAG is `CblasUnit' then the
+ diagonal elements of the matrix A are taken as unity and are not
+ referenced.
+
+ -- Function: int gsl_blas_ssyrk (CBLAS_UPLO_t UPLO, CBLAS_TRANSPOSE_t
+ TRANS, float ALPHA, const gsl_matrix_float * A, float BETA,
+ gsl_matrix_float * C)
+ -- Function: int gsl_blas_dsyrk (CBLAS_UPLO_t UPLO, CBLAS_TRANSPOSE_t
+ TRANS, double ALPHA, const gsl_matrix * A, double BETA,
+ gsl_matrix * C)
+ -- Function: int gsl_blas_csyrk (CBLAS_UPLO_t UPLO, CBLAS_TRANSPOSE_t
+ TRANS, const gsl_complex_float ALPHA, const
+ gsl_matrix_complex_float * A, const gsl_complex_float BETA,
+ gsl_matrix_complex_float * C)
+ -- Function: int gsl_blas_zsyrk (CBLAS_UPLO_t UPLO, CBLAS_TRANSPOSE_t
+ TRANS, const gsl_complex ALPHA, const gsl_matrix_complex * A,
+ const gsl_complex BETA, gsl_matrix_complex * C)
+ These functions compute a rank-k update of the symmetric matrix C,
+ C = \alpha A A^T + \beta C when TRANS is `CblasNoTrans' and C =
+ \alpha A^T A + \beta C when TRANS is `CblasTrans'. Since the
+ matrix C is symmetric only its upper half or lower half need to be
+ stored. When UPLO is `CblasUpper' then the upper triangle and
+ diagonal of C are used, and when UPLO is `CblasLower' then the
+ lower triangle and diagonal of C are used.
+
+ -- Function: int gsl_blas_cherk (CBLAS_UPLO_t UPLO, CBLAS_TRANSPOSE_t
+ TRANS, float ALPHA, const gsl_matrix_complex_float * A, float
+ BETA, gsl_matrix_complex_float * C)
+ -- Function: int gsl_blas_zherk (CBLAS_UPLO_t UPLO, CBLAS_TRANSPOSE_t
+ TRANS, double ALPHA, const gsl_matrix_complex * A, double
+ BETA, gsl_matrix_complex * C)
+ These functions compute a rank-k update of the hermitian matrix C,
+ C = \alpha A A^H + \beta C when TRANS is `CblasNoTrans' and C =
+ \alpha A^H A + \beta C when TRANS is `CblasTrans'. Since the
+ matrix C is hermitian only its upper half or lower half need to be
+ stored. When UPLO is `CblasUpper' then the upper triangle and
+ diagonal of C are used, and when UPLO is `CblasLower' then the
+ lower triangle and diagonal of C are used. The imaginary elements
+ of the diagonal are automatically set to zero.
+
+ -- Function: int gsl_blas_ssyr2k (CBLAS_UPLO_t UPLO, CBLAS_TRANSPOSE_t
+ TRANS, float ALPHA, const gsl_matrix_float * A, const
+ gsl_matrix_float * B, float BETA, gsl_matrix_float * C)
+ -- Function: int gsl_blas_dsyr2k (CBLAS_UPLO_t UPLO, CBLAS_TRANSPOSE_t
+ TRANS, double ALPHA, const gsl_matrix * A, const gsl_matrix *
+ B, double BETA, gsl_matrix * C)
+ -- Function: int gsl_blas_csyr2k (CBLAS_UPLO_t UPLO, CBLAS_TRANSPOSE_t
+ TRANS, const gsl_complex_float ALPHA, const
+ gsl_matrix_complex_float * A, const gsl_matrix_complex_float
+ * B, const gsl_complex_float BETA, gsl_matrix_complex_float *
+ C)
+ -- Function: int gsl_blas_zsyr2k (CBLAS_UPLO_t UPLO, CBLAS_TRANSPOSE_t
+ TRANS, const gsl_complex ALPHA, const gsl_matrix_complex * A,
+ const gsl_matrix_complex * B, const gsl_complex BETA,
+ gsl_matrix_complex * C)
+ These functions compute a rank-2k update of the symmetric matrix C,
+ C = \alpha A B^T + \alpha B A^T + \beta C when TRANS is
+ `CblasNoTrans' and C = \alpha A^T B + \alpha B^T A + \beta C when
+ TRANS is `CblasTrans'. Since the matrix C is symmetric only its
+ upper half or lower half need to be stored. When UPLO is
+ `CblasUpper' then the upper triangle and diagonal of C are used,
+ and when UPLO is `CblasLower' then the lower triangle and diagonal
+ of C are used.
+
+ -- Function: int gsl_blas_cher2k (CBLAS_UPLO_t UPLO, CBLAS_TRANSPOSE_t
+ TRANS, const gsl_complex_float ALPHA, const
+ gsl_matrix_complex_float * A, const gsl_matrix_complex_float
+ * B, float BETA, gsl_matrix_complex_float * C)
+ -- Function: int gsl_blas_zher2k (CBLAS_UPLO_t UPLO, CBLAS_TRANSPOSE_t
+ TRANS, const gsl_complex ALPHA, const gsl_matrix_complex * A,
+ const gsl_matrix_complex * B, double BETA, gsl_matrix_complex
+ * C)
+ These functions compute a rank-2k update of the hermitian matrix C,
+ C = \alpha A B^H + \alpha^* B A^H + \beta C when TRANS is
+ `CblasNoTrans' and C = \alpha A^H B + \alpha^* B^H A + \beta C when
+ TRANS is `CblasConjTrans'. Since the matrix C is hermitian only
+ its upper half or lower half need to be stored. When UPLO is
+ `CblasUpper' then the upper triangle and diagonal of C are used,
+ and when UPLO is `CblasLower' then the lower triangle and diagonal
+ of C are used. The imaginary elements of the diagonal are
+ automatically set to zero.
+
+
+File: gsl-ref.info, Node: BLAS Examples, Next: BLAS References and Further Reading, Prev: GSL BLAS Interface, Up: BLAS Support
+
+12.2 Examples
+=============
+
+The following program computes the product of two matrices using the
+Level-3 BLAS function DGEMM,
+
+ [ 0.11 0.12 0.13 ] [ 1011 1012 ] [ 367.76 368.12 ]
+ [ 0.21 0.22 0.23 ] [ 1021 1022 ] = [ 674.06 674.72 ]
+ [ 1031 1032 ]
+
+The matrices are stored in row major order, according to the C
+convention for arrays.
+
+ #include <stdio.h>
+ #include <gsl/gsl_blas.h>
+
+ int
+ main (void)
+ {
+ double a[] = { 0.11, 0.12, 0.13,
+ 0.21, 0.22, 0.23 };
+
+ double b[] = { 1011, 1012,
+ 1021, 1022,
+ 1031, 1032 };
+
+ double c[] = { 0.00, 0.00,
+ 0.00, 0.00 };
+
+ gsl_matrix_view A = gsl_matrix_view_array(a, 2, 3);
+ gsl_matrix_view B = gsl_matrix_view_array(b, 3, 2);
+ gsl_matrix_view C = gsl_matrix_view_array(c, 2, 2);
+
+ /* Compute C = A B */
+
+ gsl_blas_dgemm (CblasNoTrans, CblasNoTrans,
+ 1.0, &A.matrix, &B.matrix,
+ 0.0, &C.matrix);
+
+ printf ("[ %g, %g\n", c[0], c[1]);
+ printf (" %g, %g ]\n", c[2], c[3]);
+
+ return 0;
+ }
+
+Here is the output from the program,
+
+ $ ./a.out
+ [ 367.76, 368.12
+ 674.06, 674.72 ]
+
+
+File: gsl-ref.info, Node: BLAS References and Further Reading, Prev: BLAS Examples, Up: BLAS Support
+
+12.3 References and Further Reading
+===================================
+
+Information on the BLAS standards, including both the legacy and draft
+interface standards, is available online from the BLAS Homepage and
+BLAS Technical Forum web-site.
+
+ `BLAS Homepage'
+ `http://www.netlib.org/blas/'
+
+ `BLAS Technical Forum'
+ `http://www.netlib.org/cgi-bin/checkout/blast/blast.pl'
+
+The following papers contain the specifications for Level 1, Level 2 and
+Level 3 BLAS.
+
+ C. Lawson, R. Hanson, D. Kincaid, F. Krogh, "Basic Linear Algebra
+ Subprograms for Fortran Usage", `ACM Transactions on Mathematical
+ Software', Vol. 5 (1979), Pages 308-325.
+
+ J.J. Dongarra, J. DuCroz, S. Hammarling, R. Hanson, "An Extended
+ Set of Fortran Basic Linear Algebra Subprograms", `ACM
+ Transactions on Mathematical Software', Vol. 14, No. 1 (1988),
+ Pages 1-32.
+
+ J.J. Dongarra, I. Duff, J. DuCroz, S. Hammarling, "A Set of Level
+ 3 Basic Linear Algebra Subprograms", `ACM Transactions on
+ Mathematical Software', Vol. 16 (1990), Pages 1-28.
+
+Postscript versions of the latter two papers are available from
+`http://www.netlib.org/blas/'. A CBLAS wrapper for Fortran BLAS
+libraries is available from the same location.
+
+
+File: gsl-ref.info, Node: Linear Algebra, Next: Eigensystems, Prev: BLAS Support, Up: Top
+
+13 Linear Algebra
+*****************
+
+This chapter describes functions for solving linear systems. The
+library provides linear algebra operations which operate directly on
+the `gsl_vector' and `gsl_matrix' objects. These routines use the
+standard algorithms from Golub & Van Loan's `Matrix Computations'.
+
+ When dealing with very large systems the routines found in LAPACK
+should be considered. These support specialized data representations
+and other optimizations.
+
+ The functions described in this chapter are declared in the header
+file `gsl_linalg.h'.
+
+* Menu:
+
+* LU Decomposition::
+* QR Decomposition::
+* QR Decomposition with Column Pivoting::
+* Singular Value Decomposition::
+* Cholesky Decomposition::
+* Tridiagonal Decomposition of Real Symmetric Matrices::
+* Tridiagonal Decomposition of Hermitian Matrices::
+* Hessenberg Decomposition of Real Matrices::
+* Bidiagonalization::
+* Householder Transformations::
+* Householder solver for linear systems::
+* Tridiagonal Systems::
+* Balancing::
+* Linear Algebra Examples::
+* Linear Algebra References and Further Reading::
+
+
+File: gsl-ref.info, Node: LU Decomposition, Next: QR Decomposition, Up: Linear Algebra
+
+13.1 LU Decomposition
+=====================
+
+A general square matrix A has an LU decomposition into upper and lower
+triangular matrices,
+
+ P A = L U
+
+where P is a permutation matrix, L is unit lower triangular matrix and
+U is upper triangular matrix. For square matrices this decomposition
+can be used to convert the linear system A x = b into a pair of
+triangular systems (L y = P b, U x = y), which can be solved by forward
+and back-substitution. Note that the LU decomposition is valid for
+singular matrices.
+
+ -- Function: int gsl_linalg_LU_decomp (gsl_matrix * A, gsl_permutation
+ * P, int * SIGNUM)
+ -- Function: int gsl_linalg_complex_LU_decomp (gsl_matrix_complex * A,
+ gsl_permutation * P, int * SIGNUM)
+ These functions factorize the square matrix A into the LU
+ decomposition PA = LU. On output the diagonal and upper
+ triangular part of the input matrix A contain the matrix U. The
+ lower triangular part of the input matrix (excluding the diagonal)
+ contains L. The diagonal elements of L are unity, and are not
+ stored.
+
+ The permutation matrix P is encoded in the permutation P. The j-th
+ column of the matrix P is given by the k-th column of the identity
+ matrix, where k = p_j the j-th element of the permutation vector.
+ The sign of the permutation is given by SIGNUM. It has the value
+ (-1)^n, where n is the number of interchanges in the permutation.
+
+ The algorithm used in the decomposition is Gaussian Elimination
+ with partial pivoting (Golub & Van Loan, `Matrix Computations',
+ Algorithm 3.4.1).
+
+ -- Function: int gsl_linalg_LU_solve (const gsl_matrix * LU, const
+ gsl_permutation * P, const gsl_vector * B, gsl_vector * X)
+ -- Function: int gsl_linalg_complex_LU_solve (const gsl_matrix_complex
+ * LU, const gsl_permutation * P, const gsl_vector_complex *
+ B, gsl_vector_complex * X)
+ These functions solve the square system A x = b using the LU
+ decomposition of A into (LU, P) given by `gsl_linalg_LU_decomp' or
+ `gsl_linalg_complex_LU_decomp'.
+
+ -- Function: int gsl_linalg_LU_svx (const gsl_matrix * LU, const
+ gsl_permutation * P, gsl_vector * X)
+ -- Function: int gsl_linalg_complex_LU_svx (const gsl_matrix_complex *
+ LU, const gsl_permutation * P, gsl_vector_complex * X)
+ These functions solve the square system A x = b in-place using the
+ LU decomposition of A into (LU,P). On input X should contain the
+ right-hand side b, which is replaced by the solution on output.
+
+ -- Function: int gsl_linalg_LU_refine (const gsl_matrix * A, const
+ gsl_matrix * LU, const gsl_permutation * P, const gsl_vector
+ * B, gsl_vector * X, gsl_vector * RESIDUAL)
+ -- Function: int gsl_linalg_complex_LU_refine (const
+ gsl_matrix_complex * A, const gsl_matrix_complex * LU, const
+ gsl_permutation * P, const gsl_vector_complex * B,
+ gsl_vector_complex * X, gsl_vector_complex * RESIDUAL)
+ These functions apply an iterative improvement to X, the solution
+ of A x = b, using the LU decomposition of A into (LU,P). The
+ initial residual r = A x - b is also computed and stored in
+ RESIDUAL.
+
+ -- Function: int gsl_linalg_LU_invert (const gsl_matrix * LU, const
+ gsl_permutation * P, gsl_matrix * INVERSE)
+ -- Function: int gsl_linalg_complex_LU_invert (const
+ gsl_matrix_complex * LU, const gsl_permutation * P,
+ gsl_matrix_complex * INVERSE)
+ These functions compute the inverse of a matrix A from its LU
+ decomposition (LU,P), storing the result in the matrix INVERSE.
+ The inverse is computed by solving the system A x = b for each
+ column of the identity matrix. It is preferable to avoid direct
+ use of the inverse whenever possible, as the linear solver
+ functions can obtain the same result more efficiently and reliably
+ (consult any introductory textbook on numerical linear algebra for
+ details).
+
+ -- Function: double gsl_linalg_LU_det (gsl_matrix * LU, int SIGNUM)
+ -- Function: gsl_complex gsl_linalg_complex_LU_det (gsl_matrix_complex
+ * LU, int SIGNUM)
+ These functions compute the determinant of a matrix A from its LU
+ decomposition, LU. The determinant is computed as the product of
+ the diagonal elements of U and the sign of the row permutation
+ SIGNUM.
+
+ -- Function: double gsl_linalg_LU_lndet (gsl_matrix * LU)
+ -- Function: double gsl_linalg_complex_LU_lndet (gsl_matrix_complex *
+ LU)
+ These functions compute the logarithm of the absolute value of the
+ determinant of a matrix A, \ln|\det(A)|, from its LU
+ decomposition, LU. This function may be useful if the direct
+ computation of the determinant would overflow or underflow.
+
+ -- Function: int gsl_linalg_LU_sgndet (gsl_matrix * LU, int SIGNUM)
+ -- Function: gsl_complex gsl_linalg_complex_LU_sgndet
+ (gsl_matrix_complex * LU, int SIGNUM)
+ These functions compute the sign or phase factor of the
+ determinant of a matrix A, \det(A)/|\det(A)|, from its LU
+ decomposition, LU.
+
+
+File: gsl-ref.info, Node: QR Decomposition, Next: QR Decomposition with Column Pivoting, Prev: LU Decomposition, Up: Linear Algebra
+
+13.2 QR Decomposition
+=====================
+
+A general rectangular M-by-N matrix A has a QR decomposition into the
+product of an orthogonal M-by-M square matrix Q (where Q^T Q = I) and
+an M-by-N right-triangular matrix R,
+
+ A = Q R
+
+This decomposition can be used to convert the linear system A x = b
+into the triangular system R x = Q^T b, which can be solved by
+back-substitution. Another use of the QR decomposition is to compute an
+orthonormal basis for a set of vectors. The first N columns of Q form
+an orthonormal basis for the range of A, ran(A), when A has full column
+rank.
+
+ -- Function: int gsl_linalg_QR_decomp (gsl_matrix * A, gsl_vector *
+ TAU)
+ This function factorizes the M-by-N matrix A into the QR
+ decomposition A = Q R. On output the diagonal and upper
+ triangular part of the input matrix contain the matrix R. The
+ vector TAU and the columns of the lower triangular part of the
+ matrix A contain the Householder coefficients and Householder
+ vectors which encode the orthogonal matrix Q. The vector TAU must
+ be of length k=\min(M,N). The matrix Q is related to these
+ components by, Q = Q_k ... Q_2 Q_1 where Q_i = I - \tau_i v_i
+ v_i^T and v_i is the Householder vector v_i =
+ (0,...,1,A(i+1,i),A(i+2,i),...,A(m,i)). This is the same storage
+ scheme as used by LAPACK.
+
+ The algorithm used to perform the decomposition is Householder QR
+ (Golub & Van Loan, `Matrix Computations', Algorithm 5.2.1).
+
+ -- Function: int gsl_linalg_QR_solve (const gsl_matrix * QR, const
+ gsl_vector * TAU, const gsl_vector * B, gsl_vector * X)
+ This function solves the square system A x = b using the QR
+ decomposition of A into (QR, TAU) given by `gsl_linalg_QR_decomp'.
+ The least-squares solution for rectangular systems can be found
+ using `gsl_linalg_QR_lssolve'.
+
+ -- Function: int gsl_linalg_QR_svx (const gsl_matrix * QR, const
+ gsl_vector * TAU, gsl_vector * X)
+ This function solves the square system A x = b in-place using the
+ QR decomposition of A into (QR,TAU) given by
+ `gsl_linalg_QR_decomp'. On input X should contain the right-hand
+ side b, which is replaced by the solution on output.
+
+ -- Function: int gsl_linalg_QR_lssolve (const gsl_matrix * QR, const
+ gsl_vector * TAU, const gsl_vector * B, gsl_vector * X,
+ gsl_vector * RESIDUAL)
+ This function finds the least squares solution to the
+ overdetermined system A x = b where the matrix A has more rows than
+ columns. The least squares solution minimizes the Euclidean norm
+ of the residual, ||Ax - b||.The routine uses the QR decomposition
+ of A into (QR, TAU) given by `gsl_linalg_QR_decomp'. The solution
+ is returned in X. The residual is computed as a by-product and
+ stored in RESIDUAL.
+
+ -- Function: int gsl_linalg_QR_QTvec (const gsl_matrix * QR, const
+ gsl_vector * TAU, gsl_vector * V)
+ This function applies the matrix Q^T encoded in the decomposition
+ (QR,TAU) to the vector V, storing the result Q^T v in V. The
+ matrix multiplication is carried out directly using the encoding
+ of the Householder vectors without needing to form the full matrix
+ Q^T.
+
+ -- Function: int gsl_linalg_QR_Qvec (const gsl_matrix * QR, const
+ gsl_vector * TAU, gsl_vector * V)
+ This function applies the matrix Q encoded in the decomposition
+ (QR,TAU) to the vector V, storing the result Q v in V. The matrix
+ multiplication is carried out directly using the encoding of the
+ Householder vectors without needing to form the full matrix Q.
+
+ -- Function: int gsl_linalg_QR_Rsolve (const gsl_matrix * QR, const
+ gsl_vector * B, gsl_vector * X)
+ This function solves the triangular system R x = b for X. It may
+ be useful if the product b' = Q^T b has already been computed
+ using `gsl_linalg_QR_QTvec'.
+
+ -- Function: int gsl_linalg_QR_Rsvx (const gsl_matrix * QR, gsl_vector
+ * X)
+ This function solves the triangular system R x = b for X in-place.
+ On input X should contain the right-hand side b and is replaced by
+ the solution on output. This function may be useful if the product
+ b' = Q^T b has already been computed using `gsl_linalg_QR_QTvec'.
+
+ -- Function: int gsl_linalg_QR_unpack (const gsl_matrix * QR, const
+ gsl_vector * TAU, gsl_matrix * Q, gsl_matrix * R)
+ This function unpacks the encoded QR decomposition (QR,TAU) into
+ the matrices Q and R, where Q is M-by-M and R is M-by-N.
+
+ -- Function: int gsl_linalg_QR_QRsolve (gsl_matrix * Q, gsl_matrix *
+ R, const gsl_vector * B, gsl_vector * X)
+ This function solves the system R x = Q^T b for X. It can be used
+ when the QR decomposition of a matrix is available in unpacked
+ form as (Q, R).
+
+ -- Function: int gsl_linalg_QR_update (gsl_matrix * Q, gsl_matrix * R,
+ gsl_vector * W, const gsl_vector * V)
+ This function performs a rank-1 update w v^T of the QR
+ decomposition (Q, R). The update is given by Q'R' = Q R + w v^T
+ where the output matrices Q' and R' are also orthogonal and right
+ triangular. Note that W is destroyed by the update.
+
+ -- Function: int gsl_linalg_R_solve (const gsl_matrix * R, const
+ gsl_vector * B, gsl_vector * X)
+ This function solves the triangular system R x = b for the N-by-N
+ matrix R.
+
+ -- Function: int gsl_linalg_R_svx (const gsl_matrix * R, gsl_vector *
+ X)
+ This function solves the triangular system R x = b in-place. On
+ input X should contain the right-hand side b, which is replaced by
+ the solution on output.
+
+
+File: gsl-ref.info, Node: QR Decomposition with Column Pivoting, Next: Singular Value Decomposition, Prev: QR Decomposition, Up: Linear Algebra
+
+13.3 QR Decomposition with Column Pivoting
+==========================================
+
+The QR decomposition can be extended to the rank deficient case by
+introducing a column permutation P,
+
+ A P = Q R
+
+The first r columns of Q form an orthonormal basis for the range of A
+for a matrix with column rank r. This decomposition can also be used
+to convert the linear system A x = b into the triangular system R y =
+Q^T b, x = P y, which can be solved by back-substitution and
+permutation. We denote the QR decomposition with column pivoting by
+QRP^T since A = Q R P^T.
+
+ -- Function: int gsl_linalg_QRPT_decomp (gsl_matrix * A, gsl_vector *
+ TAU, gsl_permutation * P, int * SIGNUM, gsl_vector * NORM)
+ This function factorizes the M-by-N matrix A into the QRP^T
+ decomposition A = Q R P^T. On output the diagonal and upper
+ triangular part of the input matrix contain the matrix R. The
+ permutation matrix P is stored in the permutation P. The sign of
+ the permutation is given by SIGNUM. It has the value (-1)^n, where
+ n is the number of interchanges in the permutation. The vector TAU
+ and the columns of the lower triangular part of the matrix A
+ contain the Householder coefficients and vectors which encode the
+ orthogonal matrix Q. The vector TAU must be of length
+ k=\min(M,N). The matrix Q is related to these components by, Q =
+ Q_k ... Q_2 Q_1 where Q_i = I - \tau_i v_i v_i^T and v_i is the
+ Householder vector v_i = (0,...,1,A(i+1,i),A(i+2,i),...,A(m,i)).
+ This is the same storage scheme as used by LAPACK. The vector
+ NORM is a workspace of length N used for column pivoting.
+
+ The algorithm used to perform the decomposition is Householder QR
+ with column pivoting (Golub & Van Loan, `Matrix Computations',
+ Algorithm 5.4.1).
+
+ -- Function: int gsl_linalg_QRPT_decomp2 (const gsl_matrix * A,
+ gsl_matrix * Q, gsl_matrix * R, gsl_vector * TAU,
+ gsl_permutation * P, int * SIGNUM, gsl_vector * NORM)
+ This function factorizes the matrix A into the decomposition A = Q
+ R P^T without modifying A itself and storing the output in the
+ separate matrices Q and R.
+
+ -- Function: int gsl_linalg_QRPT_solve (const gsl_matrix * QR, const
+ gsl_vector * TAU, const gsl_permutation * P, const gsl_vector
+ * B, gsl_vector * X)
+ This function solves the square system A x = b using the QRP^T
+ decomposition of A into (QR, TAU, P) given by
+ `gsl_linalg_QRPT_decomp'.
+
+ -- Function: int gsl_linalg_QRPT_svx (const gsl_matrix * QR, const
+ gsl_vector * TAU, const gsl_permutation * P, gsl_vector * X)
+ This function solves the square system A x = b in-place using the
+ QRP^T decomposition of A into (QR,TAU,P). On input X should
+ contain the right-hand side b, which is replaced by the solution
+ on output.
+
+ -- Function: int gsl_linalg_QRPT_QRsolve (const gsl_matrix * Q, const
+ gsl_matrix * R, const gsl_permutation * P, const gsl_vector *
+ B, gsl_vector * X)
+ This function solves the square system R P^T x = Q^T b for X. It
+ can be used when the QR decomposition of a matrix is available in
+ unpacked form as (Q, R).
+
+ -- Function: int gsl_linalg_QRPT_update (gsl_matrix * Q, gsl_matrix *
+ R, const gsl_permutation * P, gsl_vector * U, const
+ gsl_vector * V)
+ This function performs a rank-1 update w v^T of the QRP^T
+ decomposition (Q, R, P). The update is given by Q'R' = Q R + w v^T
+ where the output matrices Q' and R' are also orthogonal and right
+ triangular. Note that W is destroyed by the update. The
+ permutation P is not changed.
+
+ -- Function: int gsl_linalg_QRPT_Rsolve (const gsl_matrix * QR, const
+ gsl_permutation * P, const gsl_vector * B, gsl_vector * X)
+ This function solves the triangular system R P^T x = b for the
+ N-by-N matrix R contained in QR.
+
+ -- Function: int gsl_linalg_QRPT_Rsvx (const gsl_matrix * QR, const
+ gsl_permutation * P, gsl_vector * X)
+ This function solves the triangular system R P^T x = b in-place
+ for the N-by-N matrix R contained in QR. On input X should contain
+ the right-hand side b, which is replaced by the solution on output.
+
+
+File: gsl-ref.info, Node: Singular Value Decomposition, Next: Cholesky Decomposition, Prev: QR Decomposition with Column Pivoting, Up: Linear Algebra
+
+13.4 Singular Value Decomposition
+=================================
+
+A general rectangular M-by-N matrix A has a singular value
+decomposition (SVD) into the product of an M-by-N orthogonal matrix U,
+an N-by-N diagonal matrix of singular values S and the transpose of an
+N-by-N orthogonal square matrix V,
+
+ A = U S V^T
+
+The singular values \sigma_i = S_{ii} are all non-negative and are
+generally chosen to form a non-increasing sequence \sigma_1 >= \sigma_2
+>= ... >= \sigma_N >= 0.
+
+ The singular value decomposition of a matrix has many practical uses.
+The condition number of the matrix is given by the ratio of the largest
+singular value to the smallest singular value. The presence of a zero
+singular value indicates that the matrix is singular. The number of
+non-zero singular values indicates the rank of the matrix. In practice
+singular value decomposition of a rank-deficient matrix will not produce
+exact zeroes for singular values, due to finite numerical precision.
+Small singular values should be edited by choosing a suitable tolerance.
+
+ For a rank-deficient matrix, the null space of A is given by the
+columns of V corresponding to the zero singular values. Similarly, the
+range of A is given by columns of U corresponding to the non-zero
+singular values.
+
+ -- Function: int gsl_linalg_SV_decomp (gsl_matrix * A, gsl_matrix * V,
+ gsl_vector * S, gsl_vector * WORK)
+ This function factorizes the M-by-N matrix A into the singular
+ value decomposition A = U S V^T for M >= N. On output the matrix
+ A is replaced by U. The diagonal elements of the singular value
+ matrix S are stored in the vector S. The singular values are
+ non-negative and form a non-increasing sequence from S_1 to S_N.
+ The matrix V contains the elements of V in untransposed form. To
+ form the product U S V^T it is necessary to take the transpose of
+ V. A workspace of length N is required in WORK.
+
+ This routine uses the Golub-Reinsch SVD algorithm.
+
+ -- Function: int gsl_linalg_SV_decomp_mod (gsl_matrix * A, gsl_matrix
+ * X, gsl_matrix * V, gsl_vector * S, gsl_vector * WORK)
+ This function computes the SVD using the modified Golub-Reinsch
+ algorithm, which is faster for M>>N. It requires the vector WORK
+ of length N and the N-by-N matrix X as additional working space.
+
+ -- Function: int gsl_linalg_SV_decomp_jacobi (gsl_matrix * A,
+ gsl_matrix * V, gsl_vector * S)
+ This function computes the SVD of the M-by-N matrix A using
+ one-sided Jacobi orthogonalization for M >= N. The Jacobi method
+ can compute singular values to higher relative accuracy than
+ Golub-Reinsch algorithms (see references for details).
+
+ -- Function: int gsl_linalg_SV_solve (gsl_matrix * U, gsl_matrix * V,
+ gsl_vector * S, const gsl_vector * B, gsl_vector * X)
+ This function solves the system A x = b using the singular value
+ decomposition (U, S, V) of A given by `gsl_linalg_SV_decomp'.
+
+ Only non-zero singular values are used in computing the solution.
+ The parts of the solution corresponding to singular values of zero
+ are ignored. Other singular values can be edited out by setting
+ them to zero before calling this function.
+
+ In the over-determined case where A has more rows than columns the
+ system is solved in the least squares sense, returning the solution
+ X which minimizes ||A x - b||_2.
+
+
+File: gsl-ref.info, Node: Cholesky Decomposition, Next: Tridiagonal Decomposition of Real Symmetric Matrices, Prev: Singular Value Decomposition, Up: Linear Algebra
+
+13.5 Cholesky Decomposition
+===========================
+
+A symmetric, positive definite square matrix A has a Cholesky
+decomposition into a product of a lower triangular matrix L and its
+transpose L^T,
+
+ A = L L^T
+
+This is sometimes referred to as taking the square-root of a matrix. The
+Cholesky decomposition can only be carried out when all the eigenvalues
+of the matrix are positive. This decomposition can be used to convert
+the linear system A x = b into a pair of triangular systems (L y = b,
+L^T x = y), which can be solved by forward and back-substitution.
+
+ -- Function: int gsl_linalg_cholesky_decomp (gsl_matrix * A)
+ This function factorizes the positive-definite symmetric square
+ matrix A into the Cholesky decomposition A = L L^T. On input only
+ the diagonal and lower-triangular part of the matrix A are needed.
+ On output the diagonal and lower triangular part of the input
+ matrix A contain the matrix L. The upper triangular part of the
+ input matrix contains L^T, the diagonal terms being identical for
+ both L and L^T. If the matrix is not positive-definite then the
+ decomposition will fail, returning the error code `GSL_EDOM'.
+
+ -- Function: int gsl_linalg_cholesky_solve (const gsl_matrix *
+ CHOLESKY, const gsl_vector * B, gsl_vector * X)
+ This function solves the system A x = b using the Cholesky
+ decomposition of A into the matrix CHOLESKY given by
+ `gsl_linalg_cholesky_decomp'.
+
+ -- Function: int gsl_linalg_cholesky_svx (const gsl_matrix * CHOLESKY,
+ gsl_vector * X)
+ This function solves the system A x = b in-place using the
+ Cholesky decomposition of A into the matrix CHOLESKY given by
+ `gsl_linalg_cholesky_decomp'. On input X should contain the
+ right-hand side b, which is replaced by the solution on output.
+
+
+File: gsl-ref.info, Node: Tridiagonal Decomposition of Real Symmetric Matrices, Next: Tridiagonal Decomposition of Hermitian Matrices, Prev: Cholesky Decomposition, Up: Linear Algebra
+
+13.6 Tridiagonal Decomposition of Real Symmetric Matrices
+=========================================================
+
+A symmetric matrix A can be factorized by similarity transformations
+into the form,
+
+ A = Q T Q^T
+
+where Q is an orthogonal matrix and T is a symmetric tridiagonal matrix.
+
+ -- Function: int gsl_linalg_symmtd_decomp (gsl_matrix * A, gsl_vector
+ * TAU)
+ This function factorizes the symmetric square matrix A into the
+ symmetric tridiagonal decomposition Q T Q^T. On output the
+ diagonal and subdiagonal part of the input matrix A contain the
+ tridiagonal matrix T. The remaining lower triangular part of the
+ input matrix contains the Householder vectors which, together with
+ the Householder coefficients TAU, encode the orthogonal matrix Q.
+ This storage scheme is the same as used by LAPACK. The upper
+ triangular part of A is not referenced.
+
+ -- Function: int gsl_linalg_symmtd_unpack (const gsl_matrix * A, const
+ gsl_vector * TAU, gsl_matrix * Q, gsl_vector * DIAG,
+ gsl_vector * SUBDIAG)
+ This function unpacks the encoded symmetric tridiagonal
+ decomposition (A, TAU) obtained from `gsl_linalg_symmtd_decomp'
+ into the orthogonal matrix Q, the vector of diagonal elements DIAG
+ and the vector of subdiagonal elements SUBDIAG.
+
+ -- Function: int gsl_linalg_symmtd_unpack_T (const gsl_matrix * A,
+ gsl_vector * DIAG, gsl_vector * SUBDIAG)
+ This function unpacks the diagonal and subdiagonal of the encoded
+ symmetric tridiagonal decomposition (A, TAU) obtained from
+ `gsl_linalg_symmtd_decomp' into the vectors DIAG and SUBDIAG.
+
+
+File: gsl-ref.info, Node: Tridiagonal Decomposition of Hermitian Matrices, Next: Hessenberg Decomposition of Real Matrices, Prev: Tridiagonal Decomposition of Real Symmetric Matrices, Up: Linear Algebra
+
+13.7 Tridiagonal Decomposition of Hermitian Matrices
+====================================================
+
+A hermitian matrix A can be factorized by similarity transformations
+into the form,
+
+ A = U T U^T
+
+where U is a unitary matrix and T is a real symmetric tridiagonal
+matrix.
+
+ -- Function: int gsl_linalg_hermtd_decomp (gsl_matrix_complex * A,
+ gsl_vector_complex * TAU)
+ This function factorizes the hermitian matrix A into the symmetric
+ tridiagonal decomposition U T U^T. On output the real parts of
+ the diagonal and subdiagonal part of the input matrix A contain
+ the tridiagonal matrix T. The remaining lower triangular part of
+ the input matrix contains the Householder vectors which, together
+ with the Householder coefficients TAU, encode the orthogonal matrix
+ Q. This storage scheme is the same as used by LAPACK. The upper
+ triangular part of A and imaginary parts of the diagonal are not
+ referenced.
+
+ -- Function: int gsl_linalg_hermtd_unpack (const gsl_matrix_complex *
+ A, const gsl_vector_complex * TAU, gsl_matrix_complex * Q,
+ gsl_vector * DIAG, gsl_vector * SUBDIAG)
+ This function unpacks the encoded tridiagonal decomposition (A,
+ TAU) obtained from `gsl_linalg_hermtd_decomp' into the unitary
+ matrix U, the real vector of diagonal elements DIAG and the real
+ vector of subdiagonal elements SUBDIAG.
+
+ -- Function: int gsl_linalg_hermtd_unpack_T (const gsl_matrix_complex
+ * A, gsl_vector * DIAG, gsl_vector * SUBDIAG)
+ This function unpacks the diagonal and subdiagonal of the encoded
+ tridiagonal decomposition (A, TAU) obtained from the
+ `gsl_linalg_hermtd_decomp' into the real vectors DIAG and SUBDIAG.
+
+
+File: gsl-ref.info, Node: Hessenberg Decomposition of Real Matrices, Next: Bidiagonalization, Prev: Tridiagonal Decomposition of Hermitian Matrices, Up: Linear Algebra
+
+13.8 Hessenberg Decomposition of Real Matrices
+==============================================
+
+A general matrix A can be decomposed by orthogonal similarity
+transformations into the form
+
+ A = U H U^T
+
+ where U is orthogonal and H is an upper Hessenberg matrix, meaning
+that it has zeros below the first subdiagonal. The Hessenberg reduction
+is the first step in the Schur decomposition for the nonsymmetric
+eigenvalue problem, but has applications in other areas as well.
+
+ -- Function: int gsl_linalg_hessenberg (gsl_matrix * A, gsl_vector *
+ TAU)
+ This function computes the Hessenberg decomposition of the matrix
+ A by applying the similarity transformation H = U^T A U. On
+ output, H is stored in the upper portion of A. The information
+ required to construct the matrix U is stored in the lower
+ triangular portion of A. U is a product of N - 2 Householder
+ matrices. The Householder vectors are stored in the lower portion
+ of A (below the subdiagonal) and the Householder coefficients are
+ stored in the vector TAU. TAU must be of length N.
+
+ -- Function: int gsl_linalg_hessenberg_unpack (gsl_matrix * H,
+ gsl_vector * TAU, gsl_matrix * U)
+ This function constructs the orthogonal matrix U from the
+ information stored in the Hessenberg matrix H along with the
+ vector TAU. H and TAU are outputs from `gsl_linalg_hessenberg'.
+
+ -- Function: int gsl_linalg_hessenberg_unpack_accum (gsl_matrix * H,
+ gsl_vector * TAU, gsl_matrix * V)
+ This function is similar to `gsl_linalg_hessenberg_unpack', except
+ it accumulates the matrix U into V, so that V' = VU. The matrix V
+ must be initialized prior to calling this function. Setting V to
+ the identity matrix provides the same result as
+ `gsl_linalg_hessenberg_unpack'. If H is order N, then V must have
+ N columns but may have any number of rows.
+
+ -- Function: void gsl_linalg_hessenberg_set_zero (gsl_matrix * H)
+ This function sets the lower triangular portion of H, below the
+ subdiagonal, to zero. It is useful for clearing out the
+ Householder vectors after calling `gsl_linalg_hessenberg'.
+
+
+File: gsl-ref.info, Node: Bidiagonalization, Next: Householder Transformations, Prev: Hessenberg Decomposition of Real Matrices, Up: Linear Algebra
+
+13.9 Bidiagonalization
+======================
+
+A general matrix A can be factorized by similarity transformations into
+the form,
+
+ A = U B V^T
+
+where U and V are orthogonal matrices and B is a N-by-N bidiagonal
+matrix with non-zero entries only on the diagonal and superdiagonal.
+The size of U is M-by-N and the size of V is N-by-N.
+
+ -- Function: int gsl_linalg_bidiag_decomp (gsl_matrix * A, gsl_vector
+ * TAU_U, gsl_vector * TAU_V)
+ This function factorizes the M-by-N matrix A into bidiagonal form
+ U B V^T. The diagonal and superdiagonal of the matrix B are
+ stored in the diagonal and superdiagonal of A. The orthogonal
+ matrices U and V are stored as compressed Householder vectors in
+ the remaining elements of A. The Householder coefficients are
+ stored in the vectors TAU_U and TAU_V. The length of TAU_U must
+ equal the number of elements in the diagonal of A and the length
+ of TAU_V should be one element shorter.
+
+ -- Function: int gsl_linalg_bidiag_unpack (const gsl_matrix * A, const
+ gsl_vector * TAU_U, gsl_matrix * U, const gsl_vector * TAU_V,
+ gsl_matrix * V, gsl_vector * DIAG, gsl_vector * SUPERDIAG)
+ This function unpacks the bidiagonal decomposition of A given by
+ `gsl_linalg_bidiag_decomp', (A, TAU_U, TAU_V) into the separate
+ orthogonal matrices U, V and the diagonal vector DIAG and
+ superdiagonal SUPERDIAG. Note that U is stored as a compact
+ M-by-N orthogonal matrix satisfying U^T U = I for efficiency.
+
+ -- Function: int gsl_linalg_bidiag_unpack2 (gsl_matrix * A, gsl_vector
+ * TAU_U, gsl_vector * TAU_V, gsl_matrix * V)
+ This function unpacks the bidiagonal decomposition of A given by
+ `gsl_linalg_bidiag_decomp', (A, TAU_U, TAU_V) into the separate
+ orthogonal matrices U, V and the diagonal vector DIAG and
+ superdiagonal SUPERDIAG. The matrix U is stored in-place in A.
+
+ -- Function: int gsl_linalg_bidiag_unpack_B (const gsl_matrix * A,
+ gsl_vector * DIAG, gsl_vector * SUPERDIAG)
+ This function unpacks the diagonal and superdiagonal of the
+ bidiagonal decomposition of A given by `gsl_linalg_bidiag_decomp',
+ into the diagonal vector DIAG and superdiagonal vector SUPERDIAG.
+
+
+File: gsl-ref.info, Node: Householder Transformations, Next: Householder solver for linear systems, Prev: Bidiagonalization, Up: Linear Algebra
+
+13.10 Householder Transformations
+=================================
+
+A Householder transformation is a rank-1 modification of the identity
+matrix which can be used to zero out selected elements of a vector. A
+Householder matrix P takes the form,
+
+ P = I - \tau v v^T
+
+where v is a vector (called the "Householder vector") and \tau = 2/(v^T
+v). The functions described in this section use the rank-1 structure
+of the Householder matrix to create and apply Householder
+transformations efficiently.
+
+ -- Function: double gsl_linalg_householder_transform (gsl_vector * V)
+ This function prepares a Householder transformation P = I - \tau v
+ v^T which can be used to zero all the elements of the input vector
+ except the first. On output the transformation is stored in the
+ vector V and the scalar \tau is returned.
+
+ -- Function: int gsl_linalg_householder_hm (double tau, const
+ gsl_vector * v, gsl_matrix * A)
+ This function applies the Householder matrix P defined by the
+ scalar TAU and the vector V to the left-hand side of the matrix A.
+ On output the result P A is stored in A.
+
+ -- Function: int gsl_linalg_householder_mh (double tau, const
+ gsl_vector * v, gsl_matrix * A)
+ This function applies the Householder matrix P defined by the
+ scalar TAU and the vector V to the right-hand side of the matrix
+ A. On output the result A P is stored in A.
+
+ -- Function: int gsl_linalg_householder_hv (double tau, const
+ gsl_vector * v, gsl_vector * w)
+ This function applies the Householder transformation P defined by
+ the scalar TAU and the vector V to the vector W. On output the
+ result P w is stored in W.
+
+
+File: gsl-ref.info, Node: Householder solver for linear systems, Next: Tridiagonal Systems, Prev: Householder Transformations, Up: Linear Algebra
+
+13.11 Householder solver for linear systems
+===========================================
+
+ -- Function: int gsl_linalg_HH_solve (gsl_matrix * A, const gsl_vector
+ * B, gsl_vector * X)
+ This function solves the system A x = b directly using Householder
+ transformations. On output the solution is stored in X and B is
+ not modified. The matrix A is destroyed by the Householder
+ transformations.
+
+ -- Function: int gsl_linalg_HH_svx (gsl_matrix * A, gsl_vector * X)
+ This function solves the system A x = b in-place using Householder
+ transformations. On input X should contain the right-hand side b,
+ which is replaced by the solution on output. The matrix A is
+ destroyed by the Householder transformations.
+
+
+File: gsl-ref.info, Node: Tridiagonal Systems, Next: Balancing, Prev: Householder solver for linear systems, Up: Linear Algebra
+
+13.12 Tridiagonal Systems
+=========================
+
+ -- Function: int gsl_linalg_solve_tridiag (const gsl_vector * DIAG,
+ const gsl_vector * E, const gsl_vector * F, const gsl_vector
+ * B, gsl_vector * X)
+ This function solves the general N-by-N system A x = b where A is
+ tridiagonal (N >= 2). The super-diagonal and sub-diagonal vectors
+ E and F must be one element shorter than the diagonal vector DIAG.
+ The form of A for the 4-by-4 case is shown below,
+
+ A = ( d_0 e_0 0 0 )
+ ( f_0 d_1 e_1 0 )
+ ( 0 f_1 d_2 e_2 )
+ ( 0 0 f_2 d_3 )
+
+ -- Function: int gsl_linalg_solve_symm_tridiag (const gsl_vector *
+ DIAG, const gsl_vector * E, const gsl_vector * B, gsl_vector
+ * X)
+ This function solves the general N-by-N system A x = b where A is
+ symmetric tridiagonal (N >= 2). The off-diagonal vector E must be
+ one element shorter than the diagonal vector DIAG. The form of A
+ for the 4-by-4 case is shown below,
+
+ A = ( d_0 e_0 0 0 )
+ ( e_0 d_1 e_1 0 )
+ ( 0 e_1 d_2 e_2 )
+ ( 0 0 e_2 d_3 )
+ The current implementation uses a variant of Cholesky decomposition
+ which can cause division by zero if the matrix is not positive
+ definite.
+
+ -- Function: int gsl_linalg_solve_cyc_tridiag (const gsl_vector *
+ DIAG, const gsl_vector * E, const gsl_vector * F, const
+ gsl_vector * B, gsl_vector * X)
+ This function solves the general N-by-N system A x = b where A is
+ cyclic tridiagonal (N >= 3). The cyclic super-diagonal and
+ sub-diagonal vectors E and F must have the same number of elements
+ as the diagonal vector DIAG. The form of A for the 4-by-4 case is
+ shown below,
+
+ A = ( d_0 e_0 0 f_3 )
+ ( f_0 d_1 e_1 0 )
+ ( 0 f_1 d_2 e_2 )
+ ( e_3 0 f_2 d_3 )
+
+ -- Function: int gsl_linalg_solve_symm_cyc_tridiag (const gsl_vector *
+ DIAG, const gsl_vector * E, const gsl_vector * B, gsl_vector
+ * X)
+ This function solves the general N-by-N system A x = b where A is
+ symmetric cyclic tridiagonal (N >= 3). The cyclic off-diagonal
+ vector E must have the same number of elements as the diagonal
+ vector DIAG. The form of A for the 4-by-4 case is shown below,
+
+ A = ( d_0 e_0 0 e_3 )
+ ( e_0 d_1 e_1 0 )
+ ( 0 e_1 d_2 e_2 )
+ ( e_3 0 e_2 d_3 )
+
+
+File: gsl-ref.info, Node: Balancing, Next: Linear Algebra Examples, Prev: Tridiagonal Systems, Up: Linear Algebra
+
+13.13 Balancing
+===============
+
+The process of balancing a matrix applies similarity transformations to
+make the rows and columns have comparable norms. This is useful, for
+example, to reduce roundoff errors in the solution of eigenvalue
+problems. Balancing a matrix A consists of replacing A with a similar
+matrix
+
+ A' = D^(-1) A D
+
+ where D is a diagonal matrix whose entries are powers of the
+floating point radix.
+
+ -- Function: int gsl_linalg_balance_matrix (gsl_matrix * A, gsl_vector
+ * D)
+ This function replaces the matrix A with its balanced counterpart
+ and stores the diagonal elements of the similarity transformation
+ into the vector D.
+
+
+File: gsl-ref.info, Node: Linear Algebra Examples, Next: Linear Algebra References and Further Reading, Prev: Balancing, Up: Linear Algebra
+
+13.14 Examples
+==============
+
+The following program solves the linear system A x = b. The system to
+be solved is,
+
+ [ 0.18 0.60 0.57 0.96 ] [x0] [1.0]
+ [ 0.41 0.24 0.99 0.58 ] [x1] = [2.0]
+ [ 0.14 0.30 0.97 0.66 ] [x2] [3.0]
+ [ 0.51 0.13 0.19 0.85 ] [x3] [4.0]
+
+and the solution is found using LU decomposition of the matrix A.
+
+ #include <stdio.h>
+ #include <gsl/gsl_linalg.h>
+
+ int
+ main (void)
+ {
+ double a_data[] = { 0.18, 0.60, 0.57, 0.96,
+ 0.41, 0.24, 0.99, 0.58,
+ 0.14, 0.30, 0.97, 0.66,
+ 0.51, 0.13, 0.19, 0.85 };
+
+ double b_data[] = { 1.0, 2.0, 3.0, 4.0 };
+
+ gsl_matrix_view m
+ = gsl_matrix_view_array (a_data, 4, 4);
+
+ gsl_vector_view b
+ = gsl_vector_view_array (b_data, 4);
+
+ gsl_vector *x = gsl_vector_alloc (4);
+
+ int s;
+
+ gsl_permutation * p = gsl_permutation_alloc (4);
+
+ gsl_linalg_LU_decomp (&m.matrix, p, &s);
+
+ gsl_linalg_LU_solve (&m.matrix, p, &b.vector, x);
+
+ printf ("x = \n");
+ gsl_vector_fprintf (stdout, x, "%g");
+
+ gsl_permutation_free (p);
+ gsl_vector_free (x);
+ return 0;
+ }
+
+Here is the output from the program,
+
+ x = -4.05205
+ -12.6056
+ 1.66091
+ 8.69377
+
+This can be verified by multiplying the solution x by the original
+matrix A using GNU OCTAVE,
+
+ octave> A = [ 0.18, 0.60, 0.57, 0.96;
+ 0.41, 0.24, 0.99, 0.58;
+ 0.14, 0.30, 0.97, 0.66;
+ 0.51, 0.13, 0.19, 0.85 ];
+
+ octave> x = [ -4.05205; -12.6056; 1.66091; 8.69377];
+
+ octave> A * x
+ ans =
+ 1.0000
+ 2.0000
+ 3.0000
+ 4.0000
+
+This reproduces the original right-hand side vector, b, in accordance
+with the equation A x = b.
+
+
+File: gsl-ref.info, Node: Linear Algebra References and Further Reading, Prev: Linear Algebra Examples, Up: Linear Algebra
+
+13.15 References and Further Reading
+====================================
+
+Further information on the algorithms described in this section can be
+found in the following book,
+
+ G. H. Golub, C. F. Van Loan, `Matrix Computations' (3rd Ed, 1996),
+ Johns Hopkins University Press, ISBN 0-8018-5414-8.
+
+The LAPACK library is described in the following manual,
+
+ `LAPACK Users' Guide' (Third Edition, 1999), Published by SIAM,
+ ISBN 0-89871-447-8.
+
+ `http://www.netlib.org/lapack'
+
+The LAPACK source code can be found at the website above, along with an
+online copy of the users guide.
+
+The Modified Golub-Reinsch algorithm is described in the following
+paper,
+
+ T.F. Chan, "An Improved Algorithm for Computing the Singular Value
+ Decomposition", `ACM Transactions on Mathematical Software', 8
+ (1982), pp 72-83.
+
+The Jacobi algorithm for singular value decomposition is described in
+the following papers,
+
+ J.C. Nash, "A one-sided transformation method for the singular
+ value decomposition and algebraic eigenproblem", `Computer
+ Journal', Volume 18, Number 1 (1973), p 74-76
+
+ James Demmel, Kresimir Veselic, "Jacobi's Method is more accurate
+ than QR", `Lapack Working Note 15' (LAWN-15), October 1989.
+ Available from netlib, `http://www.netlib.org/lapack/' in the
+ `lawns' or `lawnspdf' directories.
+
+
+File: gsl-ref.info, Node: Eigensystems, Next: Fast Fourier Transforms, Prev: Linear Algebra, Up: Top
+
+14 Eigensystems
+***************
+
+This chapter describes functions for computing eigenvalues and
+eigenvectors of matrices. There are routines for real symmetric, real
+nonsymmetric, and complex hermitian matrices. Eigenvalues can be
+computed with or without eigenvectors. The hermitian matrix algorithms
+used are symmetric bidiagonalization followed by QR reduction. The
+nonsymmetric algorithm is the Francis QR double-shift.
+
+ These routines are intended for "small" systems where simple
+algorithms are acceptable. Anyone interested in finding eigenvalues
+and eigenvectors of large matrices will want to use the sophisticated
+routines found in LAPACK. The Fortran version of LAPACK is recommended
+as the standard package for large-scale linear algebra.
+
+ The functions described in this chapter are declared in the header
+file `gsl_eigen.h'.
+
+* Menu:
+
+* Real Symmetric Matrices::
+* Complex Hermitian Matrices::
+* Real Nonsymmetric Matrices::
+* Sorting Eigenvalues and Eigenvectors::
+* Eigenvalue and Eigenvector Examples::
+* Eigenvalue and Eigenvector References::
+
+
+File: gsl-ref.info, Node: Real Symmetric Matrices, Next: Complex Hermitian Matrices, Up: Eigensystems
+
+14.1 Real Symmetric Matrices
+============================
+
+ -- Function: gsl_eigen_symm_workspace * gsl_eigen_symm_alloc (const
+ size_t N)
+ This function allocates a workspace for computing eigenvalues of
+ N-by-N real symmetric matrices. The size of the workspace is
+ O(2n).
+
+ -- Function: void gsl_eigen_symm_free (gsl_eigen_symm_workspace * W)
+ This function frees the memory associated with the workspace W.
+
+ -- Function: int gsl_eigen_symm (gsl_matrix * A, gsl_vector * EVAL,
+ gsl_eigen_symm_workspace * W)
+ This function computes the eigenvalues of the real symmetric matrix
+ A. Additional workspace of the appropriate size must be provided
+ in W. The diagonal and lower triangular part of A are destroyed
+ during the computation, but the strict upper triangular part is
+ not referenced. The eigenvalues are stored in the vector EVAL and
+ are unordered.
+
+ -- Function: gsl_eigen_symmv_workspace * gsl_eigen_symmv_alloc (const
+ size_t N)
+ This function allocates a workspace for computing eigenvalues and
+ eigenvectors of N-by-N real symmetric matrices. The size of the
+ workspace is O(4n).
+
+ -- Function: void gsl_eigen_symmv_free (gsl_eigen_symmv_workspace * W)
+ This function frees the memory associated with the workspace W.
+
+ -- Function: int gsl_eigen_symmv (gsl_matrix * A, gsl_vector * EVAL,
+ gsl_matrix * EVEC, gsl_eigen_symmv_workspace * W)
+ This function computes the eigenvalues and eigenvectors of the real
+ symmetric matrix A. Additional workspace of the appropriate size
+ must be provided in W. The diagonal and lower triangular part of
+ A are destroyed during the computation, but the strict upper
+ triangular part is not referenced. The eigenvalues are stored in
+ the vector EVAL and are unordered. The corresponding eigenvectors
+ are stored in the columns of the matrix EVEC. For example, the
+ eigenvector in the first column corresponds to the first
+ eigenvalue. The eigenvectors are guaranteed to be mutually
+ orthogonal and normalised to unit magnitude.
+
+
+File: gsl-ref.info, Node: Complex Hermitian Matrices, Next: Real Nonsymmetric Matrices, Prev: Real Symmetric Matrices, Up: Eigensystems
+
+14.2 Complex Hermitian Matrices
+===============================
+
+ -- Function: gsl_eigen_herm_workspace * gsl_eigen_herm_alloc (const
+ size_t N)
+ This function allocates a workspace for computing eigenvalues of
+ N-by-N complex hermitian matrices. The size of the workspace is
+ O(3n).
+
+ -- Function: void gsl_eigen_herm_free (gsl_eigen_herm_workspace * W)
+ This function frees the memory associated with the workspace W.
+
+ -- Function: int gsl_eigen_herm (gsl_matrix_complex * A, gsl_vector *
+ EVAL, gsl_eigen_herm_workspace * W)
+ This function computes the eigenvalues of the complex hermitian
+ matrix A. Additional workspace of the appropriate size must be
+ provided in W. The diagonal and lower triangular part of A are
+ destroyed during the computation, but the strict upper triangular
+ part is not referenced. The imaginary parts of the diagonal are
+ assumed to be zero and are not referenced. The eigenvalues are
+ stored in the vector EVAL and are unordered.
+
+ -- Function: gsl_eigen_hermv_workspace * gsl_eigen_hermv_alloc (const
+ size_t N)
+ This function allocates a workspace for computing eigenvalues and
+ eigenvectors of N-by-N complex hermitian matrices. The size of
+ the workspace is O(5n).
+
+ -- Function: void gsl_eigen_hermv_free (gsl_eigen_hermv_workspace * W)
+ This function frees the memory associated with the workspace W.
+
+ -- Function: int gsl_eigen_hermv (gsl_matrix_complex * A, gsl_vector *
+ EVAL, gsl_matrix_complex * EVEC, gsl_eigen_hermv_workspace *
+ W)
+ This function computes the eigenvalues and eigenvectors of the
+ complex hermitian matrix A. Additional workspace of the
+ appropriate size must be provided in W. The diagonal and lower
+ triangular part of A are destroyed during the computation, but the
+ strict upper triangular part is not referenced. The imaginary
+ parts of the diagonal are assumed to be zero and are not
+ referenced. The eigenvalues are stored in the vector EVAL and are
+ unordered. The corresponding complex eigenvectors are stored in
+ the columns of the matrix EVEC. For example, the eigenvector in
+ the first column corresponds to the first eigenvalue. The
+ eigenvectors are guaranteed to be mutually orthogonal and
+ normalised to unit magnitude.
+
+
+File: gsl-ref.info, Node: Real Nonsymmetric Matrices, Next: Sorting Eigenvalues and Eigenvectors, Prev: Complex Hermitian Matrices, Up: Eigensystems
+
+14.3 Real Nonsymmetric Matrices
+===============================
+
+The solution of the real nonsymmetric eigensystem problem for a matrix
+A involves computing the Schur decomposition
+
+ A = Z T Z^T
+
+ where Z is an orthogonal matrix of Schur vectors and T, the Schur
+form, is quasi upper triangular with diagonal 1-by-1 blocks which are
+real eigenvalues of A, and diagonal 2-by-2 blocks whose eigenvalues are
+complex conjugate eigenvalues of A. The algorithm used is the double
+shift Francis method.
+
+ -- Function: gsl_eigen_nonsymm_workspace * gsl_eigen_nonsymm_alloc
+ (const size_t N)
+ This function allocates a workspace for computing eigenvalues of
+ N-by-N real nonsymmetric matrices. The size of the workspace is
+ O(2n).
+
+ -- Function: void gsl_eigen_nonsymm_free (gsl_eigen_nonsymm_workspace
+ * W)
+ This function frees the memory associated with the workspace W.
+
+ -- Function: void gsl_eigen_nonsymm_params (const int COMPUTE_T, const
+ int BALANCE, gsl_eigen_nonsymm_workspace * W)
+ This function sets some parameters which determine how the
+ eigenvalue problem is solved in subsequent calls to
+ `gsl_eigen_nonsymm'.
+
+ If COMPUTE_T is set to 1, the full Schur form T will be computed
+ by `gsl_eigen_nonsymm'. If it is set to 0, T will not be computed
+ (this is the default setting). Computing the full Schur form T
+ requires approximately 1.5-2 times the number of flops.
+
+ If BALANCE is set to 1, a balancing transformation is applied to
+ the matrix prior to computing eigenvalues. This transformation is
+ designed to make the rows and columns of the matrix have comparable
+ norms, and can result in more accurate eigenvalues for matrices
+ whose entries vary widely in magnitude. See *Note Balancing:: for
+ more information. Note that the balancing transformation does not
+ preserve the orthogonality of the Schur vectors, so if you wish to
+ compute the Schur vectors with `gsl_eigen_nonsymm_Z' you will
+ obtain the Schur vectors of the balanced matrix instead of the
+ original matrix. The relationship will be
+
+ T = Q^t D^(-1) A D Q
+
+ where Q is the matrix of Schur vectors for the balanced matrix, and
+ D is the balancing transformation. Then `gsl_eigen_nonsymm_Z' will
+ compute a matrix Z which satisfies
+
+ T = Z^(-1) A Z
+
+ with Z = D Q. Note that Z will not be orthogonal. For this reason,
+ balancing is not performed by default.
+
+ -- Function: int gsl_eigen_nonsymm (gsl_matrix * A, gsl_vector_complex
+ * EVAL, gsl_eigen_nonsymm_workspace * W)
+ This function computes the eigenvalues of the real nonsymmetric
+ matrix A and stores them in the vector EVAL. If T is desired, it
+ is stored in the upper portion of A on output. Otherwise, on
+ output, the diagonal of A will contain the 1-by-1 real eigenvalues
+ and 2-by-2 complex conjugate eigenvalue systems, and the rest of A
+ is destroyed. In rare cases, this function will fail to find all
+ eigenvalues. If this happens, an error code is returned and the
+ number of converged eigenvalues is stored in `w->n_evals'. The
+ converged eigenvalues are stored in the beginning of EVAL.
+
+ -- Function: int gsl_eigen_nonsymm_Z (gsl_matrix * A,
+ gsl_vector_complex * EVAL, gsl_matrix * Z,
+ gsl_eigen_nonsymm_workspace * W)
+ This function is identical to `gsl_eigen_nonsymm' except it also
+ computes the Schur vectors and stores them into Z.
+
+ -- Function: gsl_eigen_nonsymmv_workspace * gsl_eigen_nonsymmv_alloc
+ (const size_t N)
+ This function allocates a workspace for computing eigenvalues and
+ eigenvectors of N-by-N real nonsymmetric matrices. The size of the
+ workspace is O(5n).
+
+ -- Function: void gsl_eigen_nonsymmv_free
+ (gsl_eigen_nonsymmv_workspace * W)
+ This function frees the memory associated with the workspace W.
+
+ -- Function: int gsl_eigen_nonsymmv (gsl_matrix * A,
+ gsl_vector_complex * EVAL, gsl_matrix_complex * EVEC,
+ gsl_eigen_nonsymmv_workspace * W)
+ This function computes eigenvalues and right eigenvectors of the
+ N-by-N real nonsymmetric matrix A. It first calls
+ `gsl_eigen_nonsymm' to compute the eigenvalues, Schur form T, and
+ Schur vectors. Then it finds eigenvectors of T and backtransforms
+ them using the Schur vectors. The Schur vectors are destroyed in
+ the process, but can be saved by using `gsl_eigen_nonsymmv_Z'. The
+ computed eigenvectors are normalized to have Euclidean norm 1. On
+ output, the upper portion of A contains the Schur form T. If
+ `gsl_eigen_nonsymm' fails, no eigenvectors are computed, and an
+ error code is returned.
+
+ -- Function: int gsl_eigen_nonsymmv_Z (gsl_matrix * A,
+ gsl_vector_complex * EVAL, gsl_matrix_complex * EVEC,
+ gsl_matrix * Z, gsl_eigen_nonsymmv_workspace * W)
+ This function is identical to `gsl_eigen_nonsymmv' except it also
+ saves the Schur vectors into Z.
+
+
+File: gsl-ref.info, Node: Sorting Eigenvalues and Eigenvectors, Next: Eigenvalue and Eigenvector Examples, Prev: Real Nonsymmetric Matrices, Up: Eigensystems
+
+14.4 Sorting Eigenvalues and Eigenvectors
+=========================================
+
+ -- Function: int gsl_eigen_symmv_sort (gsl_vector * EVAL, gsl_matrix *
+ EVEC, gsl_eigen_sort_t SORT_TYPE)
+ This function simultaneously sorts the eigenvalues stored in the
+ vector EVAL and the corresponding real eigenvectors stored in the
+ columns of the matrix EVEC into ascending or descending order
+ according to the value of the parameter SORT_TYPE,
+
+ `GSL_EIGEN_SORT_VAL_ASC'
+ ascending order in numerical value
+
+ `GSL_EIGEN_SORT_VAL_DESC'
+ descending order in numerical value
+
+ `GSL_EIGEN_SORT_ABS_ASC'
+ ascending order in magnitude
+
+ `GSL_EIGEN_SORT_ABS_DESC'
+ descending order in magnitude
+
+
+ -- Function: int gsl_eigen_hermv_sort (gsl_vector * EVAL,
+ gsl_matrix_complex * EVEC, gsl_eigen_sort_t SORT_TYPE)
+ This function simultaneously sorts the eigenvalues stored in the
+ vector EVAL and the corresponding complex eigenvectors stored in
+ the columns of the matrix EVEC into ascending or descending order
+ according to the value of the parameter SORT_TYPE as shown above.
+
+ -- Function: int gsl_eigen_nonsymmv_sort (gsl_vector_complex * EVAL,
+ gsl_matrix_complex * EVEC, gsl_eigen_sort_t SORT_TYPE)
+ This function simultaneously sorts the eigenvalues stored in the
+ vector EVAL and the corresponding complex eigenvectors stored in
+ the columns of the matrix EVEC into ascending or descending order
+ according to the value of the parameter SORT_TYPE as shown above.
+ Only GSL_EIGEN_SORT_ABS_ASC and GSL_EIGEN_SORT_ABS_DESC are
+ supported due to the eigenvalues being complex.
+
+
+File: gsl-ref.info, Node: Eigenvalue and Eigenvector Examples, Next: Eigenvalue and Eigenvector References, Prev: Sorting Eigenvalues and Eigenvectors, Up: Eigensystems
+
+14.5 Examples
+=============
+
+The following program computes the eigenvalues and eigenvectors of the
+4-th order Hilbert matrix, H(i,j) = 1/(i + j + 1).
+
+ #include <stdio.h>
+ #include <gsl/gsl_math.h>
+ #include <gsl/gsl_eigen.h>
+
+ int
+ main (void)
+ {
+ double data[] = { 1.0 , 1/2.0, 1/3.0, 1/4.0,
+ 1/2.0, 1/3.0, 1/4.0, 1/5.0,
+ 1/3.0, 1/4.0, 1/5.0, 1/6.0,
+ 1/4.0, 1/5.0, 1/6.0, 1/7.0 };
+
+ gsl_matrix_view m
+ = gsl_matrix_view_array (data, 4, 4);
+
+ gsl_vector *eval = gsl_vector_alloc (4);
+ gsl_matrix *evec = gsl_matrix_alloc (4, 4);
+
+ gsl_eigen_symmv_workspace * w =
+ gsl_eigen_symmv_alloc (4);
+
+ gsl_eigen_symmv (&m.matrix, eval, evec, w);
+
+ gsl_eigen_symmv_free (w);
+
+ gsl_eigen_symmv_sort (eval, evec,
+ GSL_EIGEN_SORT_ABS_ASC);
+
+ {
+ int i;
+
+ for (i = 0; i < 4; i++)
+ {
+ double eval_i
+ = gsl_vector_get (eval, i);
+ gsl_vector_view evec_i
+ = gsl_matrix_column (evec, i);
+
+ printf ("eigenvalue = %g\n", eval_i);
+ printf ("eigenvector = \n");
+ gsl_vector_fprintf (stdout,
+ &evec_i.vector, "%g");
+ }
+ }
+
+ gsl_vector_free (eval);
+ gsl_matrix_free (evec);
+
+ return 0;
+ }
+
+Here is the beginning of the output from the program,
+
+ $ ./a.out
+ eigenvalue = 9.67023e-05
+ eigenvector =
+ -0.0291933
+ 0.328712
+ -0.791411
+ 0.514553
+ ...
+
+This can be compared with the corresponding output from GNU OCTAVE,
+
+ octave> [v,d] = eig(hilb(4));
+ octave> diag(d)
+ ans =
+
+ 9.6702e-05
+ 6.7383e-03
+ 1.6914e-01
+ 1.5002e+00
+
+ octave> v
+ v =
+
+ 0.029193 0.179186 -0.582076 0.792608
+ -0.328712 -0.741918 0.370502 0.451923
+ 0.791411 0.100228 0.509579 0.322416
+ -0.514553 0.638283 0.514048 0.252161
+
+Note that the eigenvectors can differ by a change of sign, since the
+sign of an eigenvector is arbitrary.
+
+ The following program illustrates the use of the nonsymmetric
+eigensolver, by computing the eigenvalues and eigenvectors of the
+Vandermonde matrix V(x;i,j) = x_i^n - j with x = (-1,-2,3,4).
+
+ #include <stdio.h>
+ #include <gsl/gsl_math.h>
+ #include <gsl/gsl_eigen.h>
+
+ int
+ main (void)
+ {
+ double data[] = { -1.0, 1.0, -1.0, 1.0,
+ -8.0, 4.0, -2.0, 1.0,
+ 27.0, 9.0, 3.0, 1.0,
+ 64.0, 16.0, 4.0, 1.0 };
+
+ gsl_matrix_view m
+ = gsl_matrix_view_array (data, 4, 4);
+
+ gsl_vector_complex *eval = gsl_vector_complex_alloc (4);
+ gsl_matrix_complex *evec = gsl_matrix_complex_alloc (4, 4);
+
+ gsl_eigen_nonsymmv_workspace * w =
+ gsl_eigen_nonsymmv_alloc (4);
+
+ gsl_eigen_nonsymmv (&m.matrix, eval, evec, w);
+
+ gsl_eigen_nonsymmv_free (w);
+
+ gsl_eigen_nonsymmv_sort (eval, evec,
+ GSL_EIGEN_SORT_ABS_DESC);
+
+ {
+ int i, j;
+
+ for (i = 0; i < 4; i++)
+ {
+ gsl_complex eval_i
+ = gsl_vector_complex_get (eval, i);
+ gsl_vector_complex_view evec_i
+ = gsl_matrix_complex_column (evec, i);
+
+ printf ("eigenvalue = %g + %gi\n",
+ GSL_REAL(eval_i), GSL_IMAG(eval_i));
+ printf ("eigenvector = \n");
+ for (j = 0; j < 4; ++j)
+ {
+ gsl_complex z = gsl_vector_complex_get(&evec_i.vector, j);
+ printf("%g + %gi\n", GSL_REAL(z), GSL_IMAG(z));
+ }
+ }
+ }
+
+ gsl_vector_complex_free(eval);
+ gsl_matrix_complex_free(evec);
+
+ return 0;
+ }
+
+Here is the beginning of the output from the program,
+
+ $ ./a.out
+ eigenvalue = -6.41391 + 0i
+ eigenvector =
+ -0.0998822 + 0i
+ -0.111251 + 0i
+ 0.292501 + 0i
+ 0.944505 + 0i
+ eigenvalue = 5.54555 + 3.08545i
+ eigenvector =
+ -0.043487 + -0.0076308i
+ 0.0642377 + -0.142127i
+ -0.515253 + 0.0405118i
+ -0.840592 + -0.00148565i
+ ...
+
+This can be compared with the corresponding output from GNU OCTAVE,
+
+ octave> [v,d] = eig(vander([-1 -2 3 4]));
+ octave> diag(d)
+ ans =
+
+ -6.4139 + 0.0000i
+ 5.5456 + 3.0854i
+ 5.5456 - 3.0854i
+ 2.3228 + 0.0000i
+
+ octave> v
+ v =
+
+ Columns 1 through 3:
+
+ -0.09988 + 0.00000i -0.04350 - 0.00755i -0.04350 + 0.00755i
+ -0.11125 + 0.00000i 0.06399 - 0.14224i 0.06399 + 0.14224i
+ 0.29250 + 0.00000i -0.51518 + 0.04142i -0.51518 - 0.04142i
+ 0.94451 + 0.00000i -0.84059 + 0.00000i -0.84059 - 0.00000i
+
+ Column 4:
+
+ -0.14493 + 0.00000i
+ 0.35660 + 0.00000i
+ 0.91937 + 0.00000i
+ 0.08118 + 0.00000i
+ Note that the eigenvectors corresponding to the eigenvalue 5.54555 +
+3.08545i are slightly different. This is because they differ by the
+multiplicative constant 0.9999984 + 0.0017674i which has magnitude 1.
+
+
+File: gsl-ref.info, Node: Eigenvalue and Eigenvector References, Prev: Eigenvalue and Eigenvector Examples, Up: Eigensystems
+
+14.6 References and Further Reading
+===================================
+
+Further information on the algorithms described in this section can be
+found in the following book,
+
+ G. H. Golub, C. F. Van Loan, `Matrix Computations' (3rd Ed, 1996),
+ Johns Hopkins University Press, ISBN 0-8018-5414-8.
+
+The LAPACK library is described in,
+
+ `LAPACK Users' Guide' (Third Edition, 1999), Published by SIAM,
+ ISBN 0-89871-447-8.
+
+ `http://www.netlib.org/lapack'
+
+The LAPACK source code can be found at the website above along with an
+online copy of the users guide.
+
+
+File: gsl-ref.info, Node: Fast Fourier Transforms, Next: Numerical Integration, Prev: Eigensystems, Up: Top
+
+15 Fast Fourier Transforms (FFTs)
+*********************************
+
+This chapter describes functions for performing Fast Fourier Transforms
+(FFTs). The library includes radix-2 routines (for lengths which are a
+power of two) and mixed-radix routines (which work for any length). For
+efficiency there are separate versions of the routines for real data and
+for complex data. The mixed-radix routines are a reimplementation of
+the FFTPACK library of Paul Swarztrauber. Fortran code for FFTPACK is
+available on Netlib (FFTPACK also includes some routines for sine and
+cosine transforms but these are currently not available in GSL). For
+details and derivations of the underlying algorithms consult the
+document `GSL FFT Algorithms' (*note FFT References and Further
+Reading::)
+
+* Menu:
+
+* Mathematical Definitions::
+* Overview of complex data FFTs::
+* Radix-2 FFT routines for complex data::
+* Mixed-radix FFT routines for complex data::
+* Overview of real data FFTs::
+* Radix-2 FFT routines for real data::
+* Mixed-radix FFT routines for real data::
+* FFT References and Further Reading::
+
+
+File: gsl-ref.info, Node: Mathematical Definitions, Next: Overview of complex data FFTs, Up: Fast Fourier Transforms
+
+15.1 Mathematical Definitions
+=============================
+
+Fast Fourier Transforms are efficient algorithms for calculating the
+discrete fourier transform (DFT),
+
+ x_j = \sum_{k=0}^{N-1} z_k \exp(-2\pi i j k / N)
+
+ The DFT usually arises as an approximation to the continuous fourier
+transform when functions are sampled at discrete intervals in space or
+time. The naive evaluation of the discrete fourier transform is a
+matrix-vector multiplication W\vec{z}. A general matrix-vector
+multiplication takes O(N^2) operations for N data-points. Fast fourier
+transform algorithms use a divide-and-conquer strategy to factorize the
+matrix W into smaller sub-matrices, corresponding to the integer
+factors of the length N. If N can be factorized into a product of
+integers f_1 f_2 ... f_n then the DFT can be computed in O(N \sum f_i)
+operations. For a radix-2 FFT this gives an operation count of O(N
+\log_2 N).
+
+ All the FFT functions offer three types of transform: forwards,
+inverse and backwards, based on the same mathematical definitions. The
+definition of the "forward fourier transform", x = FFT(z), is,
+
+ x_j = \sum_{k=0}^{N-1} z_k \exp(-2\pi i j k / N)
+
+and the definition of the "inverse fourier transform", x = IFFT(z), is,
+
+ z_j = {1 \over N} \sum_{k=0}^{N-1} x_k \exp(2\pi i j k / N).
+
+The factor of 1/N makes this a true inverse. For example, a call to
+`gsl_fft_complex_forward' followed by a call to
+`gsl_fft_complex_inverse' should return the original data (within
+numerical errors).
+
+ In general there are two possible choices for the sign of the
+exponential in the transform/ inverse-transform pair. GSL follows the
+same convention as FFTPACK, using a negative exponential for the forward
+transform. The advantage of this convention is that the inverse
+transform recreates the original function with simple fourier
+synthesis. Numerical Recipes uses the opposite convention, a positive
+exponential in the forward transform.
+
+ The "backwards FFT" is simply our terminology for an unscaled
+version of the inverse FFT,
+
+ z^{backwards}_j = \sum_{k=0}^{N-1} x_k \exp(2\pi i j k / N).
+
+When the overall scale of the result is unimportant it is often
+convenient to use the backwards FFT instead of the inverse to save
+unnecessary divisions.
+
+
+File: gsl-ref.info, Node: Overview of complex data FFTs, Next: Radix-2 FFT routines for complex data, Prev: Mathematical Definitions, Up: Fast Fourier Transforms
+
+15.2 Overview of complex data FFTs
+==================================
+
+The inputs and outputs for the complex FFT routines are "packed arrays"
+of floating point numbers. In a packed array the real and imaginary
+parts of each complex number are placed in alternate neighboring
+elements. For example, the following definition of a packed array of
+length 6,
+
+ double x[3*2];
+ gsl_complex_packed_array data = x;
+
+can be used to hold an array of three complex numbers, `z[3]', in the
+following way,
+
+ data[0] = Re(z[0])
+ data[1] = Im(z[0])
+ data[2] = Re(z[1])
+ data[3] = Im(z[1])
+ data[4] = Re(z[2])
+ data[5] = Im(z[2])
+
+The array indices for the data have the same ordering as those in the
+definition of the DFT--i.e. there are no index transformations or
+permutations of the data.
+
+ A "stride" parameter allows the user to perform transforms on the
+elements `z[stride*i]' instead of `z[i]'. A stride greater than 1 can
+be used to take an in-place FFT of the column of a matrix. A stride of
+1 accesses the array without any additional spacing between elements.
+
+ To perform an FFT on a vector argument, such as `gsl_vector_complex
+* v', use the following definitions (or their equivalents) when calling
+the functions described in this chapter:
+
+ gsl_complex_packed_array data = v->data;
+ size_t stride = v->stride;
+ size_t n = v->size;
+
+ For physical applications it is important to remember that the index
+appearing in the DFT does not correspond directly to a physical
+frequency. If the time-step of the DFT is \Delta then the
+frequency-domain includes both positive and negative frequencies,
+ranging from -1/(2\Delta) through 0 to +1/(2\Delta). The positive
+frequencies are stored from the beginning of the array up to the
+middle, and the negative frequencies are stored backwards from the end
+of the array.
+
+ Here is a table which shows the layout of the array DATA, and the
+correspondence between the time-domain data z, and the frequency-domain
+data x.
+
+ index z x = FFT(z)
+
+ 0 z(t = 0) x(f = 0)
+ 1 z(t = 1) x(f = 1/(N Delta))
+ 2 z(t = 2) x(f = 2/(N Delta))
+ . ........ ..................
+ N/2 z(t = N/2) x(f = +1/(2 Delta),
+ -1/(2 Delta))
+ . ........ ..................
+ N-3 z(t = N-3) x(f = -3/(N Delta))
+ N-2 z(t = N-2) x(f = -2/(N Delta))
+ N-1 z(t = N-1) x(f = -1/(N Delta))
+
+When N is even the location N/2 contains the most positive and negative
+frequencies (+1/(2 \Delta), -1/(2 \Delta)) which are equivalent. If N
+is odd then general structure of the table above still applies, but N/2
+does not appear.
+
+
+File: gsl-ref.info, Node: Radix-2 FFT routines for complex data, Next: Mixed-radix FFT routines for complex data, Prev: Overview of complex data FFTs, Up: Fast Fourier Transforms
+
+15.3 Radix-2 FFT routines for complex data
+==========================================
+
+The radix-2 algorithms described in this section are simple and compact,
+although not necessarily the most efficient. They use the Cooley-Tukey
+algorithm to compute in-place complex FFTs for lengths which are a power
+of 2--no additional storage is required. The corresponding
+self-sorting mixed-radix routines offer better performance at the
+expense of requiring additional working space.
+
+ All the functions described in this section are declared in the
+header file `gsl_fft_complex.h'.
+
+ -- Function: int gsl_fft_complex_radix2_forward
+ (gsl_complex_packed_array DATA, size_t STRIDE, size_t N)
+ -- Function: int gsl_fft_complex_radix2_transform
+ (gsl_complex_packed_array DATA, size_t STRIDE, size_t N,
+ gsl_fft_direction SIGN)
+ -- Function: int gsl_fft_complex_radix2_backward
+ (gsl_complex_packed_array DATA, size_t STRIDE, size_t N)
+ -- Function: int gsl_fft_complex_radix2_inverse
+ (gsl_complex_packed_array DATA, size_t STRIDE, size_t N)
+ These functions compute forward, backward and inverse FFTs of
+ length N with stride STRIDE, on the packed complex array DATA
+ using an in-place radix-2 decimation-in-time algorithm. The
+ length of the transform N is restricted to powers of two. For the
+ `transform' version of the function the SIGN argument can be
+ either `forward' (-1) or `backward' (+1).
+
+ The functions return a value of `GSL_SUCCESS' if no errors were
+ detected, or `GSL_EDOM' if the length of the data N is not a power
+ of two.
+
+ -- Function: int gsl_fft_complex_radix2_dif_forward
+ (gsl_complex_packed_array DATA, size_t STRIDE, size_t N)
+ -- Function: int gsl_fft_complex_radix2_dif_transform
+ (gsl_complex_packed_array DATA, size_t STRIDE, size_t N,
+ gsl_fft_direction SIGN)
+ -- Function: int gsl_fft_complex_radix2_dif_backward
+ (gsl_complex_packed_array DATA, size_t STRIDE, size_t N)
+ -- Function: int gsl_fft_complex_radix2_dif_inverse
+ (gsl_complex_packed_array DATA, size_t STRIDE, size_t N)
+ These are decimation-in-frequency versions of the radix-2 FFT
+ functions.
+
+
+ Here is an example program which computes the FFT of a short pulse
+in a sample of length 128. To make the resulting fourier transform
+real the pulse is defined for equal positive and negative times (-10
+... 10), where the negative times wrap around the end of the array.
+
+ #include <stdio.h>
+ #include <math.h>
+ #include <gsl/gsl_errno.h>
+ #include <gsl/gsl_fft_complex.h>
+
+ #define REAL(z,i) ((z)[2*(i)])
+ #define IMAG(z,i) ((z)[2*(i)+1])
+
+ int
+ main (void)
+ {
+ int i; double data[2*128];
+
+ for (i = 0; i < 128; i++)
+ {
+ REAL(data,i) = 0.0; IMAG(data,i) = 0.0;
+ }
+
+ REAL(data,0) = 1.0;
+
+ for (i = 1; i <= 10; i++)
+ {
+ REAL(data,i) = REAL(data,128-i) = 1.0;
+ }
+
+ for (i = 0; i < 128; i++)
+ {
+ printf ("%d %e %e\n", i,
+ REAL(data,i), IMAG(data,i));
+ }
+ printf ("\n");
+
+ gsl_fft_complex_radix2_forward (data, 1, 128);
+
+ for (i = 0; i < 128; i++)
+ {
+ printf ("%d %e %e\n", i,
+ REAL(data,i)/sqrt(128),
+ IMAG(data,i)/sqrt(128));
+ }
+
+ return 0;
+ }
+
+Note that we have assumed that the program is using the default error
+handler (which calls `abort' for any errors). If you are not using a
+safe error handler you would need to check the return status of
+`gsl_fft_complex_radix2_forward'.
+
+ The transformed data is rescaled by 1/\sqrt N so that it fits on the
+same plot as the input. Only the real part is shown, by the choice of
+the input data the imaginary part is zero. Allowing for the
+wrap-around of negative times at t=128, and working in units of k/N,
+the DFT approximates the continuum fourier transform, giving a
+modulated sine function.
+
+
+File: gsl-ref.info, Node: Mixed-radix FFT routines for complex data, Next: Overview of real data FFTs, Prev: Radix-2 FFT routines for complex data, Up: Fast Fourier Transforms
+
+15.4 Mixed-radix FFT routines for complex data
+==============================================
+
+This section describes mixed-radix FFT algorithms for complex data. The
+mixed-radix functions work for FFTs of any length. They are a
+reimplementation of Paul Swarztrauber's Fortran FFTPACK library. The
+theory is explained in the review article `Self-sorting Mixed-radix
+FFTs' by Clive Temperton. The routines here use the same indexing
+scheme and basic algorithms as FFTPACK.
+
+ The mixed-radix algorithm is based on sub-transform modules--highly
+optimized small length FFTs which are combined to create larger FFTs.
+There are efficient modules for factors of 2, 3, 4, 5, 6 and 7. The
+modules for the composite factors of 4 and 6 are faster than combining
+the modules for 2*2 and 2*3.
+
+ For factors which are not implemented as modules there is a
+fall-back to a general length-n module which uses Singleton's method for
+efficiently computing a DFT. This module is O(n^2), and slower than a
+dedicated module would be but works for any length n. Of course,
+lengths which use the general length-n module will still be factorized
+as much as possible. For example, a length of 143 will be factorized
+into 11*13. Large prime factors are the worst case scenario, e.g. as
+found in n=2*3*99991, and should be avoided because their O(n^2)
+scaling will dominate the run-time (consult the document `GSL FFT
+Algorithms' included in the GSL distribution if you encounter this
+problem).
+
+ The mixed-radix initialization function
+`gsl_fft_complex_wavetable_alloc' returns the list of factors chosen by
+the library for a given length N. It can be used to check how well the
+length has been factorized, and estimate the run-time. To a first
+approximation the run-time scales as N \sum f_i, where the f_i are the
+factors of N. For programs under user control you may wish to issue a
+warning that the transform will be slow when the length is poorly
+factorized. If you frequently encounter data lengths which cannot be
+factorized using the existing small-prime modules consult `GSL FFT
+Algorithms' for details on adding support for other factors.
+
+ All the functions described in this section are declared in the
+header file `gsl_fft_complex.h'.
+
+ -- Function: gsl_fft_complex_wavetable *
+gsl_fft_complex_wavetable_alloc (size_t N)
+ This function prepares a trigonometric lookup table for a complex
+ FFT of length N. The function returns a pointer to the newly
+ allocated `gsl_fft_complex_wavetable' if no errors were detected,
+ and a null pointer in the case of error. The length N is
+ factorized into a product of subtransforms, and the factors and
+ their trigonometric coefficients are stored in the wavetable. The
+ trigonometric coefficients are computed using direct calls to
+ `sin' and `cos', for accuracy. Recursion relations could be used
+ to compute the lookup table faster, but if an application performs
+ many FFTs of the same length then this computation is a one-off
+ overhead which does not affect the final throughput.
+
+ The wavetable structure can be used repeatedly for any transform
+ of the same length. The table is not modified by calls to any of
+ the other FFT functions. The same wavetable can be used for both
+ forward and backward (or inverse) transforms of a given length.
+
+ -- Function: void gsl_fft_complex_wavetable_free
+ (gsl_fft_complex_wavetable * WAVETABLE)
+ This function frees the memory associated with the wavetable
+ WAVETABLE. The wavetable can be freed if no further FFTs of the
+ same length will be needed.
+
+These functions operate on a `gsl_fft_complex_wavetable' structure
+which contains internal parameters for the FFT. It is not necessary to
+set any of the components directly but it can sometimes be useful to
+examine them. For example, the chosen factorization of the FFT length
+is given and can be used to provide an estimate of the run-time or
+numerical error. The wavetable structure is declared in the header file
+`gsl_fft_complex.h'.
+
+ -- Data Type: gsl_fft_complex_wavetable
+ This is a structure that holds the factorization and trigonometric
+ lookup tables for the mixed radix fft algorithm. It has the
+ following components:
+
+ `size_t n'
+ This is the number of complex data points
+
+ `size_t nf'
+ This is the number of factors that the length `n' was
+ decomposed into.
+
+ `size_t factor[64]'
+ This is the array of factors. Only the first `nf' elements
+ are used.
+
+ `gsl_complex * trig'
+ This is a pointer to a preallocated trigonometric lookup
+ table of `n' complex elements.
+
+ `gsl_complex * twiddle[64]'
+ This is an array of pointers into `trig', giving the twiddle
+ factors for each pass.
+
+The mixed radix algorithms require additional working space to hold the
+intermediate steps of the transform.
+
+ -- Function: gsl_fft_complex_workspace *
+gsl_fft_complex_workspace_alloc (size_t N)
+ This function allocates a workspace for a complex transform of
+ length N.
+
+ -- Function: void gsl_fft_complex_workspace_free
+ (gsl_fft_complex_workspace * WORKSPACE)
+ This function frees the memory associated with the workspace
+ WORKSPACE. The workspace can be freed if no further FFTs of the
+ same length will be needed.
+
+The following functions compute the transform,
+
+ -- Function: int gsl_fft_complex_forward (gsl_complex_packed_array
+ DATA, size_t STRIDE, size_t N, const
+ gsl_fft_complex_wavetable * WAVETABLE,
+ gsl_fft_complex_workspace * WORK)
+ -- Function: int gsl_fft_complex_transform (gsl_complex_packed_array
+ DATA, size_t STRIDE, size_t N, const
+ gsl_fft_complex_wavetable * WAVETABLE,
+ gsl_fft_complex_workspace * WORK, gsl_fft_direction SIGN)
+ -- Function: int gsl_fft_complex_backward (gsl_complex_packed_array
+ DATA, size_t STRIDE, size_t N, const
+ gsl_fft_complex_wavetable * WAVETABLE,
+ gsl_fft_complex_workspace * WORK)
+ -- Function: int gsl_fft_complex_inverse (gsl_complex_packed_array
+ DATA, size_t STRIDE, size_t N, const
+ gsl_fft_complex_wavetable * WAVETABLE,
+ gsl_fft_complex_workspace * WORK)
+ These functions compute forward, backward and inverse FFTs of
+ length N with stride STRIDE, on the packed complex array DATA,
+ using a mixed radix decimation-in-frequency algorithm. There is
+ no restriction on the length N. Efficient modules are provided
+ for subtransforms of length 2, 3, 4, 5, 6 and 7. Any remaining
+ factors are computed with a slow, O(n^2), general-n module. The
+ caller must supply a WAVETABLE containing the trigonometric lookup
+ tables and a workspace WORK. For the `transform' version of the
+ function the SIGN argument can be either `forward' (-1) or
+ `backward' (+1).
+
+ The functions return a value of `0' if no errors were detected. The
+ following `gsl_errno' conditions are defined for these functions:
+
+ `GSL_EDOM'
+ The length of the data N is not a positive integer (i.e. N is
+ zero).
+
+ `GSL_EINVAL'
+ The length of the data N and the length used to compute the
+ given WAVETABLE do not match.
+
+ Here is an example program which computes the FFT of a short pulse
+in a sample of length 630 (=2*3*3*5*7) using the mixed-radix algorithm.
+
+ #include <stdio.h>
+ #include <math.h>
+ #include <gsl/gsl_errno.h>
+ #include <gsl/gsl_fft_complex.h>
+
+ #define REAL(z,i) ((z)[2*(i)])
+ #define IMAG(z,i) ((z)[2*(i)+1])
+
+ int
+ main (void)
+ {
+ int i;
+ const int n = 630;
+ double data[2*n];
+
+ gsl_fft_complex_wavetable * wavetable;
+ gsl_fft_complex_workspace * workspace;
+
+ for (i = 0; i < n; i++)
+ {
+ REAL(data,i) = 0.0;
+ IMAG(data,i) = 0.0;
+ }
+
+ data[0] = 1.0;
+
+ for (i = 1; i <= 10; i++)
+ {
+ REAL(data,i) = REAL(data,n-i) = 1.0;
+ }
+
+ for (i = 0; i < n; i++)
+ {
+ printf ("%d: %e %e\n", i, REAL(data,i),
+ IMAG(data,i));
+ }
+ printf ("\n");
+
+ wavetable = gsl_fft_complex_wavetable_alloc (n);
+ workspace = gsl_fft_complex_workspace_alloc (n);
+
+ for (i = 0; i < wavetable->nf; i++)
+ {
+ printf ("# factor %d: %d\n", i,
+ wavetable->factor[i]);
+ }
+
+ gsl_fft_complex_forward (data, 1, n,
+ wavetable, workspace);
+
+ for (i = 0; i < n; i++)
+ {
+ printf ("%d: %e %e\n", i, REAL(data,i),
+ IMAG(data,i));
+ }
+
+ gsl_fft_complex_wavetable_free (wavetable);
+ gsl_fft_complex_workspace_free (workspace);
+ return 0;
+ }
+
+Note that we have assumed that the program is using the default `gsl'
+error handler (which calls `abort' for any errors). If you are not
+using a safe error handler you would need to check the return status of
+all the `gsl' routines.
+
+
+File: gsl-ref.info, Node: Overview of real data FFTs, Next: Radix-2 FFT routines for real data, Prev: Mixed-radix FFT routines for complex data, Up: Fast Fourier Transforms
+
+15.5 Overview of real data FFTs
+===============================
+
+The functions for real data are similar to those for complex data.
+However, there is an important difference between forward and inverse
+transforms. The fourier transform of a real sequence is not real. It
+is a complex sequence with a special symmetry:
+
+ z_k = z_{N-k}^*
+
+A sequence with this symmetry is called "conjugate-complex" or
+"half-complex". This different structure requires different storage
+layouts for the forward transform (from real to half-complex) and
+inverse transform (from half-complex back to real). As a consequence
+the routines are divided into two sets: functions in `gsl_fft_real'
+which operate on real sequences and functions in `gsl_fft_halfcomplex'
+which operate on half-complex sequences.
+
+ Functions in `gsl_fft_real' compute the frequency coefficients of a
+real sequence. The half-complex coefficients c of a real sequence x
+are given by fourier analysis,
+
+ c_k = \sum_{j=0}^{N-1} x_j \exp(-2 \pi i j k /N)
+
+Functions in `gsl_fft_halfcomplex' compute inverse or backwards
+transforms. They reconstruct real sequences by fourier synthesis from
+their half-complex frequency coefficients, c,
+
+ x_j = {1 \over N} \sum_{k=0}^{N-1} c_k \exp(2 \pi i j k /N)
+
+The symmetry of the half-complex sequence implies that only half of the
+complex numbers in the output need to be stored. The remaining half can
+be reconstructed using the half-complex symmetry condition. This works
+for all lengths, even and odd--when the length is even the middle value
+where k=N/2 is also real. Thus only N real numbers are required to
+store the half-complex sequence, and the transform of a real sequence
+can be stored in the same size array as the original data.
+
+ The precise storage arrangements depend on the algorithm, and are
+different for radix-2 and mixed-radix routines. The radix-2 function
+operates in-place, which constrains the locations where each element can
+be stored. The restriction forces real and imaginary parts to be stored
+far apart. The mixed-radix algorithm does not have this restriction,
+and it stores the real and imaginary parts of a given term in
+neighboring locations (which is desirable for better locality of memory
+accesses).
+
+
+File: gsl-ref.info, Node: Radix-2 FFT routines for real data, Next: Mixed-radix FFT routines for real data, Prev: Overview of real data FFTs, Up: Fast Fourier Transforms
+
+15.6 Radix-2 FFT routines for real data
+=======================================
+
+This section describes radix-2 FFT algorithms for real data. They use
+the Cooley-Tukey algorithm to compute in-place FFTs for lengths which
+are a power of 2.
+
+ The radix-2 FFT functions for real data are declared in the header
+files `gsl_fft_real.h'
+
+ -- Function: int gsl_fft_real_radix2_transform (double DATA[], size_t
+ STRIDE, size_t N)
+ This function computes an in-place radix-2 FFT of length N and
+ stride STRIDE on the real array DATA. The output is a
+ half-complex sequence, which is stored in-place. The arrangement
+ of the half-complex terms uses the following scheme: for k < N/2
+ the real part of the k-th term is stored in location k, and the
+ corresponding imaginary part is stored in location N-k. Terms
+ with k > N/2 can be reconstructed using the symmetry z_k =
+ z^*_{N-k}. The terms for k=0 and k=N/2 are both purely real, and
+ count as a special case. Their real parts are stored in locations
+ 0 and N/2 respectively, while their imaginary parts which are zero
+ are not stored.
+
+ The following table shows the correspondence between the output
+ DATA and the equivalent results obtained by considering the input
+ data as a complex sequence with zero imaginary part,
+
+ complex[0].real = data[0]
+ complex[0].imag = 0
+ complex[1].real = data[1]
+ complex[1].imag = data[N-1]
+ ............... ................
+ complex[k].real = data[k]
+ complex[k].imag = data[N-k]
+ ............... ................
+ complex[N/2].real = data[N/2]
+ complex[N/2].imag = 0
+ ............... ................
+ complex[k'].real = data[k] k' = N - k
+ complex[k'].imag = -data[N-k]
+ ............... ................
+ complex[N-1].real = data[1]
+ complex[N-1].imag = -data[N-1]
+ Note that the output data can be converted into the full complex
+ sequence using the function `gsl_fft_halfcomplex_unpack' described
+ in the next section.
+
+ The radix-2 FFT functions for halfcomplex data are declared in the
+header file `gsl_fft_halfcomplex.h'.
+
+ -- Function: int gsl_fft_halfcomplex_radix2_inverse (double DATA[],
+ size_t STRIDE, size_t N)
+ -- Function: int gsl_fft_halfcomplex_radix2_backward (double DATA[],
+ size_t STRIDE, size_t N)
+ These functions compute the inverse or backwards in-place radix-2
+ FFT of length N and stride STRIDE on the half-complex sequence
+ DATA stored according the output scheme used by
+ `gsl_fft_real_radix2'. The result is a real array stored in
+ natural order.
+
+
+
+File: gsl-ref.info, Node: Mixed-radix FFT routines for real data, Next: FFT References and Further Reading, Prev: Radix-2 FFT routines for real data, Up: Fast Fourier Transforms
+
+15.7 Mixed-radix FFT routines for real data
+===========================================
+
+This section describes mixed-radix FFT algorithms for real data. The
+mixed-radix functions work for FFTs of any length. They are a
+reimplementation of the real-FFT routines in the Fortran FFTPACK library
+by Paul Swarztrauber. The theory behind the algorithm is explained in
+the article `Fast Mixed-Radix Real Fourier Transforms' by Clive
+Temperton. The routines here use the same indexing scheme and basic
+algorithms as FFTPACK.
+
+ The functions use the FFTPACK storage convention for half-complex
+sequences. In this convention the half-complex transform of a real
+sequence is stored with frequencies in increasing order, starting at
+zero, with the real and imaginary parts of each frequency in neighboring
+locations. When a value is known to be real the imaginary part is not
+stored. The imaginary part of the zero-frequency component is never
+stored. It is known to be zero (since the zero frequency component is
+simply the sum of the input data (all real)). For a sequence of even
+length the imaginary part of the frequency n/2 is not stored either,
+since the symmetry z_k = z_{N-k}^* implies that this is purely real too.
+
+ The storage scheme is best shown by some examples. The table below
+shows the output for an odd-length sequence, n=5. The two columns give
+the correspondence between the 5 values in the half-complex sequence
+returned by `gsl_fft_real_transform', HALFCOMPLEX[] and the values
+COMPLEX[] that would be returned if the same real input sequence were
+passed to `gsl_fft_complex_backward' as a complex sequence (with
+imaginary parts set to `0'),
+
+ complex[0].real = halfcomplex[0]
+ complex[0].imag = 0
+ complex[1].real = halfcomplex[1]
+ complex[1].imag = halfcomplex[2]
+ complex[2].real = halfcomplex[3]
+ complex[2].imag = halfcomplex[4]
+ complex[3].real = halfcomplex[3]
+ complex[3].imag = -halfcomplex[4]
+ complex[4].real = halfcomplex[1]
+ complex[4].imag = -halfcomplex[2]
+
+The upper elements of the COMPLEX array, `complex[3]' and `complex[4]'
+are filled in using the symmetry condition. The imaginary part of the
+zero-frequency term `complex[0].imag' is known to be zero by the
+symmetry.
+
+ The next table shows the output for an even-length sequence, n=6 In
+the even case there are two values which are purely real,
+
+ complex[0].real = halfcomplex[0]
+ complex[0].imag = 0
+ complex[1].real = halfcomplex[1]
+ complex[1].imag = halfcomplex[2]
+ complex[2].real = halfcomplex[3]
+ complex[2].imag = halfcomplex[4]
+ complex[3].real = halfcomplex[5]
+ complex[3].imag = 0
+ complex[4].real = halfcomplex[3]
+ complex[4].imag = -halfcomplex[4]
+ complex[5].real = halfcomplex[1]
+ complex[5].imag = -halfcomplex[2]
+
+The upper elements of the COMPLEX array, `complex[4]' and `complex[5]'
+are filled in using the symmetry condition. Both `complex[0].imag' and
+`complex[3].imag' are known to be zero.
+
+ All these functions are declared in the header files
+`gsl_fft_real.h' and `gsl_fft_halfcomplex.h'.
+
+ -- Function: gsl_fft_real_wavetable * gsl_fft_real_wavetable_alloc
+ (size_t N)
+ -- Function: gsl_fft_halfcomplex_wavetable *
+gsl_fft_halfcomplex_wavetable_alloc (size_t N)
+ These functions prepare trigonometric lookup tables for an FFT of
+ size n real elements. The functions return a pointer to the newly
+ allocated struct if no errors were detected, and a null pointer in
+ the case of error. The length N is factorized into a product of
+ subtransforms, and the factors and their trigonometric
+ coefficients are stored in the wavetable. The trigonometric
+ coefficients are computed using direct calls to `sin' and `cos',
+ for accuracy. Recursion relations could be used to compute the
+ lookup table faster, but if an application performs many FFTs of
+ the same length then computing the wavetable is a one-off overhead
+ which does not affect the final throughput.
+
+ The wavetable structure can be used repeatedly for any transform
+ of the same length. The table is not modified by calls to any of
+ the other FFT functions. The appropriate type of wavetable must
+ be used for forward real or inverse half-complex transforms.
+
+ -- Function: void gsl_fft_real_wavetable_free (gsl_fft_real_wavetable
+ * WAVETABLE)
+ -- Function: void gsl_fft_halfcomplex_wavetable_free
+ (gsl_fft_halfcomplex_wavetable * WAVETABLE)
+ These functions free the memory associated with the wavetable
+ WAVETABLE. The wavetable can be freed if no further FFTs of the
+ same length will be needed.
+
+The mixed radix algorithms require additional working space to hold the
+intermediate steps of the transform,
+
+ -- Function: gsl_fft_real_workspace * gsl_fft_real_workspace_alloc
+ (size_t N)
+ This function allocates a workspace for a real transform of length
+ N. The same workspace can be used for both forward real and
+ inverse halfcomplex transforms.
+
+ -- Function: void gsl_fft_real_workspace_free (gsl_fft_real_workspace
+ * WORKSPACE)
+ This function frees the memory associated with the workspace
+ WORKSPACE. The workspace can be freed if no further FFTs of the
+ same length will be needed.
+
+The following functions compute the transforms of real and half-complex
+data,
+
+ -- Function: int gsl_fft_real_transform (double DATA[], size_t STRIDE,
+ size_t N, const gsl_fft_real_wavetable * WAVETABLE,
+ gsl_fft_real_workspace * WORK)
+ -- Function: int gsl_fft_halfcomplex_transform (double DATA[], size_t
+ STRIDE, size_t N, const gsl_fft_halfcomplex_wavetable *
+ WAVETABLE, gsl_fft_real_workspace * WORK)
+ These functions compute the FFT of DATA, a real or half-complex
+ array of length N, using a mixed radix decimation-in-frequency
+ algorithm. For `gsl_fft_real_transform' DATA is an array of
+ time-ordered real data. For `gsl_fft_halfcomplex_transform' DATA
+ contains fourier coefficients in the half-complex ordering
+ described above. There is no restriction on the length N.
+ Efficient modules are provided for subtransforms of length 2, 3, 4
+ and 5. Any remaining factors are computed with a slow, O(n^2),
+ general-n module. The caller must supply a WAVETABLE containing
+ trigonometric lookup tables and a workspace WORK.
+
+ -- Function: int gsl_fft_real_unpack (const double REAL_COEFFICIENT[],
+ gsl_complex_packed_array COMPLEX_COEFFICIENT, size_t STRIDE,
+ size_t N)
+ This function converts a single real array, REAL_COEFFICIENT into
+ an equivalent complex array, COMPLEX_COEFFICIENT, (with imaginary
+ part set to zero), suitable for `gsl_fft_complex' routines. The
+ algorithm for the conversion is simply,
+
+ for (i = 0; i < n; i++)
+ {
+ complex_coefficient[i].real
+ = real_coefficient[i];
+ complex_coefficient[i].imag
+ = 0.0;
+ }
+
+ -- Function: int gsl_fft_halfcomplex_unpack (const double
+ HALFCOMPLEX_COEFFICIENT[], gsl_complex_packed_array
+ COMPLEX_COEFFICIENT, size_t STRIDE, size_t N)
+ This function converts HALFCOMPLEX_COEFFICIENT, an array of
+ half-complex coefficients as returned by `gsl_fft_real_transform',
+ into an ordinary complex array, COMPLEX_COEFFICIENT. It fills in
+ the complex array using the symmetry z_k = z_{N-k}^* to
+ reconstruct the redundant elements. The algorithm for the
+ conversion is,
+
+ complex_coefficient[0].real
+ = halfcomplex_coefficient[0];
+ complex_coefficient[0].imag
+ = 0.0;
+
+ for (i = 1; i < n - i; i++)
+ {
+ double hc_real
+ = halfcomplex_coefficient[2 * i - 1];
+ double hc_imag
+ = halfcomplex_coefficient[2 * i];
+ complex_coefficient[i].real = hc_real;
+ complex_coefficient[i].imag = hc_imag;
+ complex_coefficient[n - i].real = hc_real;
+ complex_coefficient[n - i].imag = -hc_imag;
+ }
+
+ if (i == n - i)
+ {
+ complex_coefficient[i].real
+ = halfcomplex_coefficient[n - 1];
+ complex_coefficient[i].imag
+ = 0.0;
+ }
+
+ Here is an example program using `gsl_fft_real_transform' and
+`gsl_fft_halfcomplex_inverse'. It generates a real signal in the shape
+of a square pulse. The pulse is fourier transformed to frequency
+space, and all but the lowest ten frequency components are removed from
+the array of fourier coefficients returned by `gsl_fft_real_transform'.
+
+ The remaining fourier coefficients are transformed back to the
+time-domain, to give a filtered version of the square pulse. Since
+fourier coefficients are stored using the half-complex symmetry both
+positive and negative frequencies are removed and the final filtered
+signal is also real.
+
+ #include <stdio.h>
+ #include <math.h>
+ #include <gsl/gsl_errno.h>
+ #include <gsl/gsl_fft_real.h>
+ #include <gsl/gsl_fft_halfcomplex.h>
+
+ int
+ main (void)
+ {
+ int i, n = 100;
+ double data[n];
+
+ gsl_fft_real_wavetable * real;
+ gsl_fft_halfcomplex_wavetable * hc;
+ gsl_fft_real_workspace * work;
+
+ for (i = 0; i < n; i++)
+ {
+ data[i] = 0.0;
+ }
+
+ for (i = n / 3; i < 2 * n / 3; i++)
+ {
+ data[i] = 1.0;
+ }
+
+ for (i = 0; i < n; i++)
+ {
+ printf ("%d: %e\n", i, data[i]);
+ }
+ printf ("\n");
+
+ work = gsl_fft_real_workspace_alloc (n);
+ real = gsl_fft_real_wavetable_alloc (n);
+
+ gsl_fft_real_transform (data, 1, n,
+ real, work);
+
+ gsl_fft_real_wavetable_free (real);
+
+ for (i = 11; i < n; i++)
+ {
+ data[i] = 0;
+ }
+
+ hc = gsl_fft_halfcomplex_wavetable_alloc (n);
+
+ gsl_fft_halfcomplex_inverse (data, 1, n,
+ hc, work);
+ gsl_fft_halfcomplex_wavetable_free (hc);
+
+ for (i = 0; i < n; i++)
+ {
+ printf ("%d: %e\n", i, data[i]);
+ }
+
+ gsl_fft_real_workspace_free (work);
+ return 0;
+ }
+
+
+File: gsl-ref.info, Node: FFT References and Further Reading, Prev: Mixed-radix FFT routines for real data, Up: Fast Fourier Transforms
+
+15.8 References and Further Reading
+===================================
+
+A good starting point for learning more about the FFT is the review
+article `Fast Fourier Transforms: A Tutorial Review and A State of the
+Art' by Duhamel and Vetterli,
+
+ P. Duhamel and M. Vetterli. Fast fourier transforms: A tutorial
+ review and a state of the art. `Signal Processing', 19:259-299,
+ 1990.
+
+To find out about the algorithms used in the GSL routines you may want
+to consult the document `GSL FFT Algorithms' (it is included in GSL, as
+`doc/fftalgorithms.tex'). This has general information on FFTs and
+explicit derivations of the implementation for each routine. There are
+also references to the relevant literature. For convenience some of
+the more important references are reproduced below.
+
+There are several introductory books on the FFT with example programs,
+such as `The Fast Fourier Transform' by Brigham and `DFT/FFT and
+Convolution Algorithms' by Burrus and Parks,
+
+ E. Oran Brigham. `The Fast Fourier Transform'. Prentice Hall,
+ 1974.
+
+ C. S. Burrus and T. W. Parks. `DFT/FFT and Convolution
+ Algorithms'. Wiley, 1984.
+
+Both these introductory books cover the radix-2 FFT in some detail.
+The mixed-radix algorithm at the heart of the FFTPACK routines is
+reviewed in Clive Temperton's paper,
+
+ Clive Temperton. Self-sorting mixed-radix fast fourier transforms.
+ `Journal of Computational Physics', 52(1):1-23, 1983.
+
+The derivation of FFTs for real-valued data is explained in the
+following two articles,
+
+ Henrik V. Sorenson, Douglas L. Jones, Michael T. Heideman, and C.
+ Sidney Burrus. Real-valued fast fourier transform algorithms.
+ `IEEE Transactions on Acoustics, Speech, and Signal Processing',
+ ASSP-35(6):849-863, 1987.
+
+ Clive Temperton. Fast mixed-radix real fourier transforms.
+ `Journal of Computational Physics', 52:340-350, 1983.
+
+In 1979 the IEEE published a compendium of carefully-reviewed Fortran
+FFT programs in `Programs for Digital Signal Processing'. It is a
+useful reference for implementations of many different FFT algorithms,
+
+ Digital Signal Processing Committee and IEEE Acoustics, Speech,
+ and Signal Processing Committee, editors. `Programs for Digital
+ Signal Processing'. IEEE Press, 1979.
+
+For large-scale FFT work we recommend the use of the dedicated FFTW
+library by Frigo and Johnson. The FFTW library is self-optimizing--it
+automatically tunes itself for each hardware platform in order to
+achieve maximum performance. It is available under the GNU GPL.
+
+ FFTW Website, `http://www.fftw.org/'
+
+The source code for FFTPACK is available from Netlib,
+
+ FFTPACK, `http://www.netlib.org/fftpack/'
+
+
+File: gsl-ref.info, Node: Numerical Integration, Next: Random Number Generation, Prev: Fast Fourier Transforms, Up: Top
+
+16 Numerical Integration
+************************
+
+This chapter describes routines for performing numerical integration
+(quadrature) of a function in one dimension. There are routines for
+adaptive and non-adaptive integration of general functions, with
+specialised routines for specific cases. These include integration over
+infinite and semi-infinite ranges, singular integrals, including
+logarithmic singularities, computation of Cauchy principal values and
+oscillatory integrals. The library reimplements the algorithms used in
+QUADPACK, a numerical integration package written by Piessens,
+Doncker-Kapenga, Uberhuber and Kahaner. Fortran code for QUADPACK is
+available on Netlib.
+
+ The functions described in this chapter are declared in the header
+file `gsl_integration.h'.
+
+* Menu:
+
+* Numerical Integration Introduction::
+* QNG non-adaptive Gauss-Kronrod integration::
+* QAG adaptive integration::
+* QAGS adaptive integration with singularities::
+* QAGP adaptive integration with known singular points::
+* QAGI adaptive integration on infinite intervals::
+* QAWC adaptive integration for Cauchy principal values::
+* QAWS adaptive integration for singular functions::
+* QAWO adaptive integration for oscillatory functions::
+* QAWF adaptive integration for Fourier integrals::
+* Numerical integration error codes::
+* Numerical integration examples::
+* Numerical integration References and Further Reading::
+
+
+File: gsl-ref.info, Node: Numerical Integration Introduction, Next: QNG non-adaptive Gauss-Kronrod integration, Up: Numerical Integration
+
+16.1 Introduction
+=================
+
+Each algorithm computes an approximation to a definite integral of the
+form,
+
+ I = \int_a^b f(x) w(x) dx
+
+where w(x) is a weight function (for general integrands w(x)=1). The
+user provides absolute and relative error bounds (epsabs, epsrel) which
+specify the following accuracy requirement,
+
+ |RESULT - I| <= max(epsabs, epsrel |I|)
+
+where RESULT is the numerical approximation obtained by the algorithm.
+The algorithms attempt to estimate the absolute error ABSERR = |RESULT
+- I| in such a way that the following inequality holds,
+
+ |RESULT - I| <= ABSERR <= max(epsabs, epsrel |I|)
+
+The routines will fail to converge if the error bounds are too
+stringent, but always return the best approximation obtained up to that
+stage.
+
+ The algorithms in QUADPACK use a naming convention based on the
+following letters,
+
+ `Q' - quadrature routine
+
+ `N' - non-adaptive integrator
+ `A' - adaptive integrator
+
+ `G' - general integrand (user-defined)
+ `W' - weight function with integrand
+
+ `S' - singularities can be more readily integrated
+ `P' - points of special difficulty can be supplied
+ `I' - infinite range of integration
+ `O' - oscillatory weight function, cos or sin
+ `F' - Fourier integral
+ `C' - Cauchy principal value
+
+The algorithms are built on pairs of quadrature rules, a higher order
+rule and a lower order rule. The higher order rule is used to compute
+the best approximation to an integral over a small range. The
+difference between the results of the higher order rule and the lower
+order rule gives an estimate of the error in the approximation.
+
+* Menu:
+
+* Integrands without weight functions::
+* Integrands with weight functions::
+* Integrands with singular weight functions::
+
+
+File: gsl-ref.info, Node: Integrands without weight functions, Next: Integrands with weight functions, Up: Numerical Integration Introduction
+
+16.1.1 Integrands without weight functions
+------------------------------------------
+
+The algorithms for general functions (without a weight function) are
+based on Gauss-Kronrod rules.
+
+ A Gauss-Kronrod rule begins with a classical Gaussian quadrature
+rule of order m. This is extended with additional points between each
+of the abscissae to give a higher order Kronrod rule of order 2m+1.
+The Kronrod rule is efficient because it reuses existing function
+evaluations from the Gaussian rule.
+
+ The higher order Kronrod rule is used as the best approximation to
+the integral, and the difference between the two rules is used as an
+estimate of the error in the approximation.
+
+
+File: gsl-ref.info, Node: Integrands with weight functions, Next: Integrands with singular weight functions, Prev: Integrands without weight functions, Up: Numerical Integration Introduction
+
+16.1.2 Integrands with weight functions
+---------------------------------------
+
+For integrands with weight functions the algorithms use Clenshaw-Curtis
+quadrature rules.
+
+ A Clenshaw-Curtis rule begins with an n-th order Chebyshev
+polynomial approximation to the integrand. This polynomial can be
+integrated exactly to give an approximation to the integral of the
+original function. The Chebyshev expansion can be extended to higher
+orders to improve the approximation and provide an estimate of the
+error.
+
+
+File: gsl-ref.info, Node: Integrands with singular weight functions, Prev: Integrands with weight functions, Up: Numerical Integration Introduction
+
+16.1.3 Integrands with singular weight functions
+------------------------------------------------
+
+The presence of singularities (or other behavior) in the integrand can
+cause slow convergence in the Chebyshev approximation. The modified
+Clenshaw-Curtis rules used in QUADPACK separate out several common
+weight functions which cause slow convergence.
+
+ These weight functions are integrated analytically against the
+Chebyshev polynomials to precompute "modified Chebyshev moments".
+Combining the moments with the Chebyshev approximation to the function
+gives the desired integral. The use of analytic integration for the
+singular part of the function allows exact cancellations and
+substantially improves the overall convergence behavior of the
+integration.
+
+
+File: gsl-ref.info, Node: QNG non-adaptive Gauss-Kronrod integration, Next: QAG adaptive integration, Prev: Numerical Integration Introduction, Up: Numerical Integration
+
+16.2 QNG non-adaptive Gauss-Kronrod integration
+===============================================
+
+The QNG algorithm is a non-adaptive procedure which uses fixed
+Gauss-Kronrod abscissae to sample the integrand at a maximum of 87
+points. It is provided for fast integration of smooth functions.
+
+ -- Function: int gsl_integration_qng (const gsl_function * F, double
+ A, double B, double EPSABS, double EPSREL, double * RESULT,
+ double * ABSERR, size_t * NEVAL)
+ This function applies the Gauss-Kronrod 10-point, 21-point,
+ 43-point and 87-point integration rules in succession until an
+ estimate of the integral of f over (a,b) is achieved within the
+ desired absolute and relative error limits, EPSABS and EPSREL. The
+ function returns the final approximation, RESULT, an estimate of
+ the absolute error, ABSERR and the number of function evaluations
+ used, NEVAL. The Gauss-Kronrod rules are designed in such a way
+ that each rule uses all the results of its predecessors, in order
+ to minimize the total number of function evaluations.
+
+
+File: gsl-ref.info, Node: QAG adaptive integration, Next: QAGS adaptive integration with singularities, Prev: QNG non-adaptive Gauss-Kronrod integration, Up: Numerical Integration
+
+16.3 QAG adaptive integration
+=============================
+
+The QAG algorithm is a simple adaptive integration procedure. The
+integration region is divided into subintervals, and on each iteration
+the subinterval with the largest estimated error is bisected. This
+reduces the overall error rapidly, as the subintervals become
+concentrated around local difficulties in the integrand. These
+subintervals are managed by a `gsl_integration_workspace' struct, which
+handles the memory for the subinterval ranges, results and error
+estimates.
+
+ -- Function: gsl_integration_workspace *
+gsl_integration_workspace_alloc (size_t N)
+ This function allocates a workspace sufficient to hold N double
+ precision intervals, their integration results and error estimates.
+
+ -- Function: void gsl_integration_workspace_free
+ (gsl_integration_workspace * W)
+ This function frees the memory associated with the workspace W.
+
+ -- Function: int gsl_integration_qag (const gsl_function * F, double
+ A, double B, double EPSABS, double EPSREL, size_t LIMIT, int
+ KEY, gsl_integration_workspace * WORKSPACE, double * RESULT,
+ double * ABSERR)
+ This function applies an integration rule adaptively until an
+ estimate of the integral of f over (a,b) is achieved within the
+ desired absolute and relative error limits, EPSABS and EPSREL.
+ The function returns the final approximation, RESULT, and an
+ estimate of the absolute error, ABSERR. The integration rule is
+ determined by the value of KEY, which should be chosen from the
+ following symbolic names,
+
+ GSL_INTEG_GAUSS15 (key = 1)
+ GSL_INTEG_GAUSS21 (key = 2)
+ GSL_INTEG_GAUSS31 (key = 3)
+ GSL_INTEG_GAUSS41 (key = 4)
+ GSL_INTEG_GAUSS51 (key = 5)
+ GSL_INTEG_GAUSS61 (key = 6)
+
+ corresponding to the 15, 21, 31, 41, 51 and 61 point Gauss-Kronrod
+ rules. The higher-order rules give better accuracy for smooth
+ functions, while lower-order rules save time when the function
+ contains local difficulties, such as discontinuities.
+
+ On each iteration the adaptive integration strategy bisects the
+ interval with the largest error estimate. The subintervals and
+ their results are stored in the memory provided by WORKSPACE. The
+ maximum number of subintervals is given by LIMIT, which may not
+ exceed the allocated size of the workspace.
+
+
+File: gsl-ref.info, Node: QAGS adaptive integration with singularities, Next: QAGP adaptive integration with known singular points, Prev: QAG adaptive integration, Up: Numerical Integration
+
+16.4 QAGS adaptive integration with singularities
+=================================================
+
+The presence of an integrable singularity in the integration region
+causes an adaptive routine to concentrate new subintervals around the
+singularity. As the subintervals decrease in size the successive
+approximations to the integral converge in a limiting fashion. This
+approach to the limit can be accelerated using an extrapolation
+procedure. The QAGS algorithm combines adaptive bisection with the Wynn
+epsilon-algorithm to speed up the integration of many types of
+integrable singularities.
+
+ -- Function: int gsl_integration_qags (const gsl_function * F, double
+ A, double B, double EPSABS, double EPSREL, size_t LIMIT,
+ gsl_integration_workspace * WORKSPACE, double * RESULT,
+ double * ABSERR)
+ This function applies the Gauss-Kronrod 21-point integration rule
+ adaptively until an estimate of the integral of f over (a,b) is
+ achieved within the desired absolute and relative error limits,
+ EPSABS and EPSREL. The results are extrapolated using the
+ epsilon-algorithm, which accelerates the convergence of the
+ integral in the presence of discontinuities and integrable
+ singularities. The function returns the final approximation from
+ the extrapolation, RESULT, and an estimate of the absolute error,
+ ABSERR. The subintervals and their results are stored in the
+ memory provided by WORKSPACE. The maximum number of subintervals
+ is given by LIMIT, which may not exceed the allocated size of the
+ workspace.
+
+
+
+File: gsl-ref.info, Node: QAGP adaptive integration with known singular points, Next: QAGI adaptive integration on infinite intervals, Prev: QAGS adaptive integration with singularities, Up: Numerical Integration
+
+16.5 QAGP adaptive integration with known singular points
+=========================================================
+
+ -- Function: int gsl_integration_qagp (const gsl_function * F, double
+ * PTS, size_t NPTS, double EPSABS, double EPSREL, size_t
+ LIMIT, gsl_integration_workspace * WORKSPACE, double *
+ RESULT, double * ABSERR)
+ This function applies the adaptive integration algorithm QAGS
+ taking account of the user-supplied locations of singular points.
+ The array PTS of length NPTS should contain the endpoints of the
+ integration ranges defined by the integration region and locations
+ of the singularities. For example, to integrate over the region
+ (a,b) with break-points at x_1, x_2, x_3 (where a < x_1 < x_2 <
+ x_3 < b) the following PTS array should be used
+
+ pts[0] = a
+ pts[1] = x_1
+ pts[2] = x_2
+ pts[3] = x_3
+ pts[4] = b
+
+ with NPTS = 5.
+
+ If you know the locations of the singular points in the integration
+ region then this routine will be faster than `QAGS'.
+
+
+
+File: gsl-ref.info, Node: QAGI adaptive integration on infinite intervals, Next: QAWC adaptive integration for Cauchy principal values, Prev: QAGP adaptive integration with known singular points, Up: Numerical Integration
+
+16.6 QAGI adaptive integration on infinite intervals
+====================================================
+
+ -- Function: int gsl_integration_qagi (gsl_function * F, double
+ EPSABS, double EPSREL, size_t LIMIT,
+ gsl_integration_workspace * WORKSPACE, double * RESULT,
+ double * ABSERR)
+ This function computes the integral of the function F over the
+ infinite interval (-\infty,+\infty). The integral is mapped onto
+ the semi-open interval (0,1] using the transformation x = (1-t)/t,
+
+ \int_{-\infty}^{+\infty} dx f(x) =
+ \int_0^1 dt (f((1-t)/t) + f((-1+t)/t))/t^2.
+
+ It is then integrated using the QAGS algorithm. The normal
+ 21-point Gauss-Kronrod rule of QAGS is replaced by a 15-point
+ rule, because the transformation can generate an integrable
+ singularity at the origin. In this case a lower-order rule is
+ more efficient.
+
+ -- Function: int gsl_integration_qagiu (gsl_function * F, double A,
+ double EPSABS, double EPSREL, size_t LIMIT,
+ gsl_integration_workspace * WORKSPACE, double * RESULT,
+ double * ABSERR)
+ This function computes the integral of the function F over the
+ semi-infinite interval (a,+\infty). The integral is mapped onto
+ the semi-open interval (0,1] using the transformation x = a +
+ (1-t)/t,
+
+ \int_{a}^{+\infty} dx f(x) =
+ \int_0^1 dt f(a + (1-t)/t)/t^2
+
+ and then integrated using the QAGS algorithm.
+
+ -- Function: int gsl_integration_qagil (gsl_function * F, double B,
+ double EPSABS, double EPSREL, size_t LIMIT,
+ gsl_integration_workspace * WORKSPACE, double * RESULT,
+ double * ABSERR)
+ This function computes the integral of the function F over the
+ semi-infinite interval (-\infty,b). The integral is mapped onto
+ the semi-open interval (0,1] using the transformation x = b -
+ (1-t)/t,
+
+ \int_{+\infty}^{b} dx f(x) =
+ \int_0^1 dt f(b - (1-t)/t)/t^2
+
+ and then integrated using the QAGS algorithm.
+
+
+File: gsl-ref.info, Node: QAWC adaptive integration for Cauchy principal values, Next: QAWS adaptive integration for singular functions, Prev: QAGI adaptive integration on infinite intervals, Up: Numerical Integration
+
+16.7 QAWC adaptive integration for Cauchy principal values
+==========================================================
+
+ -- Function: int gsl_integration_qawc (gsl_function * F, double A,
+ double B, double C, double EPSABS, double EPSREL, size_t
+ LIMIT, gsl_integration_workspace * WORKSPACE, double *
+ RESULT, double * ABSERR)
+ This function computes the Cauchy principal value of the integral
+ of f over (a,b), with a singularity at C,
+
+ I = \int_a^b dx f(x) / (x - c)
+
+ The adaptive bisection algorithm of QAG is used, with
+ modifications to ensure that subdivisions do not occur at the
+ singular point x = c. When a subinterval contains the point x = c
+ or is close to it then a special 25-point modified Clenshaw-Curtis
+ rule is used to control the singularity. Further away from the
+ singularity the algorithm uses an ordinary 15-point Gauss-Kronrod
+ integration rule.
+
+
+
+File: gsl-ref.info, Node: QAWS adaptive integration for singular functions, Next: QAWO adaptive integration for oscillatory functions, Prev: QAWC adaptive integration for Cauchy principal values, Up: Numerical Integration
+
+16.8 QAWS adaptive integration for singular functions
+=====================================================
+
+The QAWS algorithm is designed for integrands with algebraic-logarithmic
+singularities at the end-points of an integration region. In order to
+work efficiently the algorithm requires a precomputed table of
+Chebyshev moments.
+
+ -- Function: gsl_integration_qaws_table *
+gsl_integration_qaws_table_alloc (double ALPHA, double BETA, int MU,
+ int NU)
+ This function allocates space for a `gsl_integration_qaws_table'
+ struct describing a singular weight function W(x) with the
+ parameters (\alpha, \beta, \mu, \nu),
+
+ W(x) = (x-a)^alpha (b-x)^beta log^mu (x-a) log^nu (b-x)
+
+ where \alpha > -1, \beta > -1, and \mu = 0, 1, \nu = 0, 1. The
+ weight function can take four different forms depending on the
+ values of \mu and \nu,
+
+ W(x) = (x-a)^alpha (b-x)^beta (mu = 0, nu = 0)
+ W(x) = (x-a)^alpha (b-x)^beta log(x-a) (mu = 1, nu = 0)
+ W(x) = (x-a)^alpha (b-x)^beta log(b-x) (mu = 0, nu = 1)
+ W(x) = (x-a)^alpha (b-x)^beta log(x-a) log(b-x) (mu = 1, nu = 1)
+
+ The singular points (a,b) do not have to be specified until the
+ integral is computed, where they are the endpoints of the
+ integration range.
+
+ The function returns a pointer to the newly allocated table
+ `gsl_integration_qaws_table' if no errors were detected, and 0 in
+ the case of error.
+
+ -- Function: int gsl_integration_qaws_table_set
+ (gsl_integration_qaws_table * T, double ALPHA, double BETA,
+ int MU, int NU)
+ This function modifies the parameters (\alpha, \beta, \mu, \nu) of
+ an existing `gsl_integration_qaws_table' struct T.
+
+ -- Function: void gsl_integration_qaws_table_free
+ (gsl_integration_qaws_table * T)
+ This function frees all the memory associated with the
+ `gsl_integration_qaws_table' struct T.
+
+ -- Function: int gsl_integration_qaws (gsl_function * F, const double
+ A, const double B, gsl_integration_qaws_table * T, const
+ double EPSABS, const double EPSREL, const size_t LIMIT,
+ gsl_integration_workspace * WORKSPACE, double * RESULT,
+ double * ABSERR)
+ This function computes the integral of the function f(x) over the
+ interval (a,b) with the singular weight function (x-a)^\alpha
+ (b-x)^\beta \log^\mu (x-a) \log^\nu (b-x). The parameters of the
+ weight function (\alpha, \beta, \mu, \nu) are taken from the table
+ T. The integral is,
+
+ I = \int_a^b dx f(x) (x-a)^alpha (b-x)^beta log^mu (x-a) log^nu (b-x).
+
+ The adaptive bisection algorithm of QAG is used. When a
+ subinterval contains one of the endpoints then a special 25-point
+ modified Clenshaw-Curtis rule is used to control the
+ singularities. For subintervals which do not include the
+ endpoints an ordinary 15-point Gauss-Kronrod integration rule is
+ used.
+
+
+
+File: gsl-ref.info, Node: QAWO adaptive integration for oscillatory functions, Next: QAWF adaptive integration for Fourier integrals, Prev: QAWS adaptive integration for singular functions, Up: Numerical Integration
+
+16.9 QAWO adaptive integration for oscillatory functions
+========================================================
+
+The QAWO algorithm is designed for integrands with an oscillatory
+factor, \sin(\omega x) or \cos(\omega x). In order to work efficiently
+the algorithm requires a table of Chebyshev moments which must be
+pre-computed with calls to the functions below.
+
+ -- Function: gsl_integration_qawo_table *
+gsl_integration_qawo_table_alloc (double OMEGA, double L, enum
+ gsl_integration_qawo_enum SINE, size_t N)
+ This function allocates space for a `gsl_integration_qawo_table'
+ struct and its associated workspace describing a sine or cosine
+ weight function W(x) with the parameters (\omega, L),
+
+ W(x) = sin(omega x)
+ W(x) = cos(omega x)
+
+ The parameter L must be the length of the interval over which the
+ function will be integrated L = b - a. The choice of sine or
+ cosine is made with the parameter SINE which should be chosen from
+ one of the two following symbolic values:
+
+ GSL_INTEG_COSINE
+ GSL_INTEG_SINE
+
+ The `gsl_integration_qawo_table' is a table of the trigonometric
+ coefficients required in the integration process. The parameter N
+ determines the number of levels of coefficients that are computed.
+ Each level corresponds to one bisection of the interval L, so that
+ N levels are sufficient for subintervals down to the length L/2^n.
+ The integration routine `gsl_integration_qawo' returns the error
+ `GSL_ETABLE' if the number of levels is insufficient for the
+ requested accuracy.
+
+
+ -- Function: int gsl_integration_qawo_table_set
+ (gsl_integration_qawo_table * T, double OMEGA, double L, enum
+ gsl_integration_qawo_enum SINE)
+ This function changes the parameters OMEGA, L and SINE of the
+ existing workspace T.
+
+ -- Function: int gsl_integration_qawo_table_set_length
+ (gsl_integration_qawo_table * T, double L)
+ This function allows the length parameter L of the workspace T to
+ be changed.
+
+ -- Function: void gsl_integration_qawo_table_free
+ (gsl_integration_qawo_table * T)
+ This function frees all the memory associated with the workspace T.
+
+ -- Function: int gsl_integration_qawo (gsl_function * F, const double
+ A, const double EPSABS, const double EPSREL, const size_t
+ LIMIT, gsl_integration_workspace * WORKSPACE,
+ gsl_integration_qawo_table * WF, double * RESULT, double *
+ ABSERR)
+ This function uses an adaptive algorithm to compute the integral of
+ f over (a,b) with the weight function \sin(\omega x) or
+ \cos(\omega x) defined by the table WF,
+
+ I = \int_a^b dx f(x) sin(omega x)
+ I = \int_a^b dx f(x) cos(omega x)
+
+ The results are extrapolated using the epsilon-algorithm to
+ accelerate the convergence of the integral. The function returns
+ the final approximation from the extrapolation, RESULT, and an
+ estimate of the absolute error, ABSERR. The subintervals and
+ their results are stored in the memory provided by WORKSPACE. The
+ maximum number of subintervals is given by LIMIT, which may not
+ exceed the allocated size of the workspace.
+
+ Those subintervals with "large" widths d where d\omega > 4 are
+ computed using a 25-point Clenshaw-Curtis integration rule, which
+ handles the oscillatory behavior. Subintervals with a "small"
+ widths where d\omega < 4 are computed using a 15-point
+ Gauss-Kronrod integration.
+
+
+
+File: gsl-ref.info, Node: QAWF adaptive integration for Fourier integrals, Next: Numerical integration error codes, Prev: QAWO adaptive integration for oscillatory functions, Up: Numerical Integration
+
+16.10 QAWF adaptive integration for Fourier integrals
+=====================================================
+
+ -- Function: int gsl_integration_qawf (gsl_function * F, const double
+ A, const double EPSABS, const size_t LIMIT,
+ gsl_integration_workspace * WORKSPACE,
+ gsl_integration_workspace * CYCLE_WORKSPACE,
+ gsl_integration_qawo_table * WF, double * RESULT, double *
+ ABSERR)
+ This function attempts to compute a Fourier integral of the
+ function F over the semi-infinite interval [a,+\infty).
+
+ I = \int_a^{+\infty} dx f(x) sin(omega x)
+ I = \int_a^{+\infty} dx f(x) cos(omega x)
+
+ The parameter \omega and choice of \sin or \cos is taken from the
+ table WF (the length L can take any value, since it is overridden
+ by this function to a value appropriate for the fourier
+ integration). The integral is computed using the QAWO algorithm
+ over each of the subintervals,
+
+ C_1 = [a, a + c]
+ C_2 = [a + c, a + 2 c]
+ ... = ...
+ C_k = [a + (k-1) c, a + k c]
+
+ where c = (2 floor(|\omega|) + 1) \pi/|\omega|. The width c is
+ chosen to cover an odd number of periods so that the contributions
+ from the intervals alternate in sign and are monotonically
+ decreasing when F is positive and monotonically decreasing. The
+ sum of this sequence of contributions is accelerated using the
+ epsilon-algorithm.
+
+ This function works to an overall absolute tolerance of ABSERR.
+ The following strategy is used: on each interval C_k the algorithm
+ tries to achieve the tolerance
+
+ TOL_k = u_k abserr
+
+ where u_k = (1 - p)p^{k-1} and p = 9/10. The sum of the geometric
+ series of contributions from each interval gives an overall
+ tolerance of ABSERR.
+
+ If the integration of a subinterval leads to difficulties then the
+ accuracy requirement for subsequent intervals is relaxed,
+
+ TOL_k = u_k max(abserr, max_{i<k}{E_i})
+
+ where E_k is the estimated error on the interval C_k.
+
+ The subintervals and their results are stored in the memory
+ provided by WORKSPACE. The maximum number of subintervals is
+ given by LIMIT, which may not exceed the allocated size of the
+ workspace. The integration over each subinterval uses the memory
+ provided by CYCLE_WORKSPACE as workspace for the QAWO algorithm.
+
+
+
+File: gsl-ref.info, Node: Numerical integration error codes, Next: Numerical integration examples, Prev: QAWF adaptive integration for Fourier integrals, Up: Numerical Integration
+
+16.11 Error codes
+=================
+
+In addition to the standard error codes for invalid arguments the
+functions can return the following values,
+
+`GSL_EMAXITER'
+ the maximum number of subdivisions was exceeded.
+
+`GSL_EROUND'
+ cannot reach tolerance because of roundoff error, or roundoff
+ error was detected in the extrapolation table.
+
+`GSL_ESING'
+ a non-integrable singularity or other bad integrand behavior was
+ found in the integration interval.
+
+`GSL_EDIVERGE'
+ the integral is divergent, or too slowly convergent to be
+ integrated numerically.
+
+
+File: gsl-ref.info, Node: Numerical integration examples, Next: Numerical integration References and Further Reading, Prev: Numerical integration error codes, Up: Numerical Integration
+
+16.12 Examples
+==============
+
+The integrator `QAGS' will handle a large class of definite integrals.
+For example, consider the following integral, which has a
+algebraic-logarithmic singularity at the origin,
+
+ \int_0^1 x^{-1/2} log(x) dx = -4
+
+The program below computes this integral to a relative accuracy bound of
+`1e-7'.
+
+ #include <stdio.h>
+ #include <math.h>
+ #include <gsl/gsl_integration.h>
+
+ double f (double x, void * params) {
+ double alpha = *(double *) params;
+ double f = log(alpha*x) / sqrt(x);
+ return f;
+ }
+
+ int
+ main (void)
+ {
+ gsl_integration_workspace * w
+ = gsl_integration_workspace_alloc (1000);
+
+ double result, error;
+ double expected = -4.0;
+ double alpha = 1.0;
+
+ gsl_function F;
+ F.function = &f;
+ F.params = &alpha;
+
+ gsl_integration_qags (&F, 0, 1, 0, 1e-7, 1000,
+ w, &result, &error);
+
+ printf ("result = % .18f\n", result);
+ printf ("exact result = % .18f\n", expected);
+ printf ("estimated error = % .18f\n", error);
+ printf ("actual error = % .18f\n", result - expected);
+ printf ("intervals = %d\n", w->size);
+
+ gsl_integration_workspace_free (w);
+
+ return 0;
+ }
+
+The results below show that the desired accuracy is achieved after 8
+subdivisions.
+
+ $ ./a.out
+ result = -3.999999999999973799
+ exact result = -4.000000000000000000
+ estimated error = 0.000000000000246025
+ actual error = 0.000000000000026201
+ intervals = 8
+
+In fact, the extrapolation procedure used by `QAGS' produces an
+accuracy of almost twice as many digits. The error estimate returned by
+the extrapolation procedure is larger than the actual error, giving a
+margin of safety of one order of magnitude.
+
+
+File: gsl-ref.info, Node: Numerical integration References and Further Reading, Prev: Numerical integration examples, Up: Numerical Integration
+
+16.13 References and Further Reading
+====================================
+
+The following book is the definitive reference for QUADPACK, and was
+written by the original authors. It provides descriptions of the
+algorithms, program listings, test programs and examples. It also
+includes useful advice on numerical integration and many references to
+the numerical integration literature used in developing QUADPACK.
+
+ R. Piessens, E. de Doncker-Kapenga, C.W. Uberhuber, D.K. Kahaner.
+ `QUADPACK A subroutine package for automatic integration' Springer
+ Verlag, 1983.
+
+
+
+File: gsl-ref.info, Node: Random Number Generation, Next: Quasi-Random Sequences, Prev: Numerical Integration, Up: Top
+
+17 Random Number Generation
+***************************
+
+The library provides a large collection of random number generators
+which can be accessed through a uniform interface. Environment
+variables allow you to select different generators and seeds at runtime,
+so that you can easily switch between generators without needing to
+recompile your program. Each instance of a generator keeps track of its
+own state, allowing the generators to be used in multi-threaded
+programs. Additional functions are available for transforming uniform
+random numbers into samples from continuous or discrete probability
+distributions such as the Gaussian, log-normal or Poisson distributions.
+
+ These functions are declared in the header file `gsl_rng.h'.
+
+* Menu:
+
+* General comments on random numbers::
+* The Random Number Generator Interface::
+* Random number generator initialization::
+* Sampling from a random number generator::
+* Auxiliary random number generator functions::
+* Random number environment variables::
+* Copying random number generator state::
+* Reading and writing random number generator state::
+* Random number generator algorithms::
+* Unix random number generators::
+* Other random number generators::
+* Random Number Generator Performance::
+* Random Number Generator Examples::
+* Random Number References and Further Reading::
+* Random Number Acknowledgements::
+
+
+File: gsl-ref.info, Node: General comments on random numbers, Next: The Random Number Generator Interface, Up: Random Number Generation
+
+17.1 General comments on random numbers
+=======================================
+
+In 1988, Park and Miller wrote a paper entitled "Random number
+generators: good ones are hard to find." [Commun. ACM, 31, 1192-1201].
+Fortunately, some excellent random number generators are available,
+though poor ones are still in common use. You may be happy with the
+system-supplied random number generator on your computer, but you should
+be aware that as computers get faster, requirements on random number
+generators increase. Nowadays, a simulation that calls a random number
+generator millions of times can often finish before you can make it down
+the hall to the coffee machine and back.
+
+ A very nice review of random number generators was written by Pierre
+L'Ecuyer, as Chapter 4 of the book: Handbook on Simulation, Jerry Banks,
+ed. (Wiley, 1997). The chapter is available in postscript from
+L'Ecuyer's ftp site (see references). Knuth's volume on Seminumerical
+Algorithms (originally published in 1968) devotes 170 pages to random
+number generators, and has recently been updated in its 3rd edition
+(1997). It is brilliant, a classic. If you don't own it, you should
+stop reading right now, run to the nearest bookstore, and buy it.
+
+ A good random number generator will satisfy both theoretical and
+statistical properties. Theoretical properties are often hard to obtain
+(they require real math!), but one prefers a random number generator
+with a long period, low serial correlation, and a tendency _not_ to
+"fall mainly on the planes." Statistical tests are performed with
+numerical simulations. Generally, a random number generator is used to
+estimate some quantity for which the theory of probability provides an
+exact answer. Comparison to this exact answer provides a measure of
+"randomness".
+
+
+File: gsl-ref.info, Node: The Random Number Generator Interface, Next: Random number generator initialization, Prev: General comments on random numbers, Up: Random Number Generation
+
+17.2 The Random Number Generator Interface
+==========================================
+
+It is important to remember that a random number generator is not a
+"real" function like sine or cosine. Unlike real functions, successive
+calls to a random number generator yield different return values. Of
+course that is just what you want for a random number generator, but to
+achieve this effect, the generator must keep track of some kind of
+"state" variable. Sometimes this state is just an integer (sometimes
+just the value of the previously generated random number), but often it
+is more complicated than that and may involve a whole array of numbers,
+possibly with some indices thrown in. To use the random number
+generators, you do not need to know the details of what comprises the
+state, and besides that varies from algorithm to algorithm.
+
+ The random number generator library uses two special structs,
+`gsl_rng_type' which holds static information about each type of
+generator and `gsl_rng' which describes an instance of a generator
+created from a given `gsl_rng_type'.
+
+ The functions described in this section are declared in the header
+file `gsl_rng.h'.
+
+
+File: gsl-ref.info, Node: Random number generator initialization, Next: Sampling from a random number generator, Prev: The Random Number Generator Interface, Up: Random Number Generation
+
+17.3 Random number generator initialization
+===========================================
+
+ -- Function: gsl_rng * gsl_rng_alloc (const gsl_rng_type * T)
+ This function returns a pointer to a newly-created instance of a
+ random number generator of type T. For example, the following
+ code creates an instance of the Tausworthe generator,
+
+ gsl_rng * r = gsl_rng_alloc (gsl_rng_taus);
+
+ If there is insufficient memory to create the generator then the
+ function returns a null pointer and the error handler is invoked
+ with an error code of `GSL_ENOMEM'.
+
+ The generator is automatically initialized with the default seed,
+ `gsl_rng_default_seed'. This is zero by default but can be changed
+ either directly or by using the environment variable `GSL_RNG_SEED'
+ (*note Random number environment variables::).
+
+ The details of the available generator types are described later
+ in this chapter.
+
+ -- Function: void gsl_rng_set (const gsl_rng * R, unsigned long int S)
+ This function initializes (or `seeds') the random number
+ generator. If the generator is seeded with the same value of S on
+ two different runs, the same stream of random numbers will be
+ generated by successive calls to the routines below. If different
+ values of S are supplied, then the generated streams of random
+ numbers should be completely different. If the seed S is zero
+ then the standard seed from the original implementation is used
+ instead. For example, the original Fortran source code for the
+ `ranlux' generator used a seed of 314159265, and so choosing S
+ equal to zero reproduces this when using `gsl_rng_ranlux'.
+
+ -- Function: void gsl_rng_free (gsl_rng * R)
+ This function frees all the memory associated with the generator R.
+
+
+File: gsl-ref.info, Node: Sampling from a random number generator, Next: Auxiliary random number generator functions, Prev: Random number generator initialization, Up: Random Number Generation
+
+17.4 Sampling from a random number generator
+============================================
+
+The following functions return uniformly distributed random numbers,
+either as integers or double precision floating point numbers. To
+obtain non-uniform distributions *note Random Number Distributions::.
+
+ -- Function: unsigned long int gsl_rng_get (const gsl_rng * R)
+ This function returns a random integer from the generator R. The
+ minimum and maximum values depend on the algorithm used, but all
+ integers in the range [MIN,MAX] are equally likely. The values of
+ MIN and MAX can determined using the auxiliary functions
+ `gsl_rng_max (r)' and `gsl_rng_min (r)'.
+
+ -- Function: double gsl_rng_uniform (const gsl_rng * R)
+ This function returns a double precision floating point number
+ uniformly distributed in the range [0,1). The range includes 0.0
+ but excludes 1.0. The value is typically obtained by dividing the
+ result of `gsl_rng_get(r)' by `gsl_rng_max(r) + 1.0' in double
+ precision. Some generators compute this ratio internally so that
+ they can provide floating point numbers with more than 32 bits of
+ randomness (the maximum number of bits that can be portably
+ represented in a single `unsigned long int').
+
+ -- Function: double gsl_rng_uniform_pos (const gsl_rng * R)
+ This function returns a positive double precision floating point
+ number uniformly distributed in the range (0,1), excluding both
+ 0.0 and 1.0. The number is obtained by sampling the generator
+ with the algorithm of `gsl_rng_uniform' until a non-zero value is
+ obtained. You can use this function if you need to avoid a
+ singularity at 0.0.
+
+ -- Function: unsigned long int gsl_rng_uniform_int (const gsl_rng * R,
+ unsigned long int N)
+ This function returns a random integer from 0 to n-1 inclusive by
+ scaling down and/or discarding samples from the generator R. All
+ integers in the range [0,n-1] are produced with equal probability.
+ For generators with a non-zero minimum value an offset is applied
+ so that zero is returned with the correct probability.
+
+ Note that this function is designed for sampling from ranges
+ smaller than the range of the underlying generator. The parameter
+ N must be less than or equal to the range of the generator R. If
+ N is larger than the range of the generator then the function
+ calls the error handler with an error code of `GSL_EINVAL' and
+ returns zero.
+
+ In particular, this function is not intended for generating the
+ full range of unsigned integer values [0,2^32-1]. Instead choose a
+ generator with the maximal integer range and zero mimimum value,
+ such as `gsl_rng_ranlxd1', `gsl_rng_mt19937' or `gsl_rng_taus',
+ and sample it directly using `gsl_rng_get'. The range of each
+ generator can be found using the auxiliary functions described in
+ the next section.
+
+
+File: gsl-ref.info, Node: Auxiliary random number generator functions, Next: Random number environment variables, Prev: Sampling from a random number generator, Up: Random Number Generation
+
+17.5 Auxiliary random number generator functions
+================================================
+
+The following functions provide information about an existing
+generator. You should use them in preference to hard-coding the
+generator parameters into your own code.
+
+ -- Function: const char * gsl_rng_name (const gsl_rng * R)
+ This function returns a pointer to the name of the generator. For
+ example,
+
+ printf ("r is a '%s' generator\n",
+ gsl_rng_name (r));
+
+ would print something like `r is a 'taus' generator'.
+
+ -- Function: unsigned long int gsl_rng_max (const gsl_rng * R)
+ `gsl_rng_max' returns the largest value that `gsl_rng_get' can
+ return.
+
+ -- Function: unsigned long int gsl_rng_min (const gsl_rng * R)
+ `gsl_rng_min' returns the smallest value that `gsl_rng_get' can
+ return. Usually this value is zero. There are some generators
+ with algorithms that cannot return zero, and for these generators
+ the minimum value is 1.
+
+ -- Function: void * gsl_rng_state (const gsl_rng * R)
+ -- Function: size_t gsl_rng_size (const gsl_rng * R)
+ These functions return a pointer to the state of generator R and
+ its size. You can use this information to access the state
+ directly. For example, the following code will write the state of
+ a generator to a stream,
+
+ void * state = gsl_rng_state (r);
+ size_t n = gsl_rng_size (r);
+ fwrite (state, n, 1, stream);
+
+ -- Function: const gsl_rng_type ** gsl_rng_types_setup (void)
+ This function returns a pointer to an array of all the available
+ generator types, terminated by a null pointer. The function should
+ be called once at the start of the program, if needed. The
+ following code fragment shows how to iterate over the array of
+ generator types to print the names of the available algorithms,
+
+ const gsl_rng_type **t, **t0;
+
+ t0 = gsl_rng_types_setup ();
+
+ printf ("Available generators:\n");
+
+ for (t = t0; *t != 0; t++)
+ {
+ printf ("%s\n", (*t)->name);
+ }
+
+
+File: gsl-ref.info, Node: Random number environment variables, Next: Copying random number generator state, Prev: Auxiliary random number generator functions, Up: Random Number Generation
+
+17.6 Random number environment variables
+========================================
+
+The library allows you to choose a default generator and seed from the
+environment variables `GSL_RNG_TYPE' and `GSL_RNG_SEED' and the
+function `gsl_rng_env_setup'. This makes it easy try out different
+generators and seeds without having to recompile your program.
+
+ -- Function: const gsl_rng_type * gsl_rng_env_setup (void)
+ This function reads the environment variables `GSL_RNG_TYPE' and
+ `GSL_RNG_SEED' and uses their values to set the corresponding
+ library variables `gsl_rng_default' and `gsl_rng_default_seed'.
+ These global variables are defined as follows,
+
+ extern const gsl_rng_type *gsl_rng_default
+ extern unsigned long int gsl_rng_default_seed
+
+ The environment variable `GSL_RNG_TYPE' should be the name of a
+ generator, such as `taus' or `mt19937'. The environment variable
+ `GSL_RNG_SEED' should contain the desired seed value. It is
+ converted to an `unsigned long int' using the C library function
+ `strtoul'.
+
+ If you don't specify a generator for `GSL_RNG_TYPE' then
+ `gsl_rng_mt19937' is used as the default. The initial value of
+ `gsl_rng_default_seed' is zero.
+
+
+Here is a short program which shows how to create a global generator
+using the environment variables `GSL_RNG_TYPE' and `GSL_RNG_SEED',
+
+ #include <stdio.h>
+ #include <gsl/gsl_rng.h>
+
+ gsl_rng * r; /* global generator */
+
+ int
+ main (void)
+ {
+ const gsl_rng_type * T;
+
+ gsl_rng_env_setup();
+
+ T = gsl_rng_default;
+ r = gsl_rng_alloc (T);
+
+ printf ("generator type: %s\n", gsl_rng_name (r));
+ printf ("seed = %lu\n", gsl_rng_default_seed);
+ printf ("first value = %lu\n", gsl_rng_get (r));
+
+ gsl_rng_free (r);
+ return 0;
+ }
+
+Running the program without any environment variables uses the initial
+defaults, an `mt19937' generator with a seed of 0,
+
+ $ ./a.out
+ generator type: mt19937
+ seed = 0
+ first value = 4293858116
+
+By setting the two variables on the command line we can change the
+default generator and the seed,
+
+ $ GSL_RNG_TYPE="taus" GSL_RNG_SEED=123 ./a.out
+ GSL_RNG_TYPE=taus
+ GSL_RNG_SEED=123
+ generator type: taus
+ seed = 123
+ first value = 2720986350
+
+
+File: gsl-ref.info, Node: Copying random number generator state, Next: Reading and writing random number generator state, Prev: Random number environment variables, Up: Random Number Generation
+
+17.7 Copying random number generator state
+==========================================
+
+The above methods do not expose the random number `state' which changes
+from call to call. It is often useful to be able to save and restore
+the state. To permit these practices, a few somewhat more advanced
+functions are supplied. These include:
+
+ -- Function: int gsl_rng_memcpy (gsl_rng * DEST, const gsl_rng * SRC)
+ This function copies the random number generator SRC into the
+ pre-existing generator DEST, making DEST into an exact copy of
+ SRC. The two generators must be of the same type.
+
+ -- Function: gsl_rng * gsl_rng_clone (const gsl_rng * R)
+ This function returns a pointer to a newly created generator which
+ is an exact copy of the generator R.
+
+
+File: gsl-ref.info, Node: Reading and writing random number generator state, Next: Random number generator algorithms, Prev: Copying random number generator state, Up: Random Number Generation
+
+17.8 Reading and writing random number generator state
+======================================================
+
+The library provides functions for reading and writing the random
+number state to a file as binary data or formatted text.
+
+ -- Function: int gsl_rng_fwrite (FILE * STREAM, const gsl_rng * R)
+ This function writes the random number state of the random number
+ generator R to the stream STREAM in binary format. The return
+ value is 0 for success and `GSL_EFAILED' if there was a problem
+ writing to the file. Since the data is written in the native
+ binary format it may not be portable between different
+ architectures.
+
+ -- Function: int gsl_rng_fread (FILE * STREAM, gsl_rng * R)
+ This function reads the random number state into the random number
+ generator R from the open stream STREAM in binary format. The
+ random number generator R must be preinitialized with the correct
+ random number generator type since type information is not saved.
+ The return value is 0 for success and `GSL_EFAILED' if there was a
+ problem reading from the file. The data is assumed to have been
+ written in the native binary format on the same architecture.
+
+
+File: gsl-ref.info, Node: Random number generator algorithms, Next: Unix random number generators, Prev: Reading and writing random number generator state, Up: Random Number Generation
+
+17.9 Random number generator algorithms
+=======================================
+
+The functions described above make no reference to the actual algorithm
+used. This is deliberate so that you can switch algorithms without
+having to change any of your application source code. The library
+provides a large number of generators of different types, including
+simulation quality generators, generators provided for compatibility
+with other libraries and historical generators from the past.
+
+ The following generators are recommended for use in simulation. They
+have extremely long periods, low correlation and pass most statistical
+tests. For the most reliable source of uncorrelated numbers, the
+second-generation RANLUX generators have the strongest proof of
+randomness.
+
+ -- Generator: gsl_rng_mt19937
+ The MT19937 generator of Makoto Matsumoto and Takuji Nishimura is a
+ variant of the twisted generalized feedback shift-register
+ algorithm, and is known as the "Mersenne Twister" generator. It
+ has a Mersenne prime period of 2^19937 - 1 (about 10^6000) and is
+ equi-distributed in 623 dimensions. It has passed the DIEHARD
+ statistical tests. It uses 624 words of state per generator and is
+ comparable in speed to the other generators. The original
+ generator used a default seed of 4357 and choosing S equal to zero
+ in `gsl_rng_set' reproduces this. Later versions switched to 5489
+ as the default seed, you can choose this explicitly via
+ `gsl_rng_set' instead if you require it.
+
+ For more information see,
+ Makoto Matsumoto and Takuji Nishimura, "Mersenne Twister: A
+ 623-dimensionally equidistributed uniform pseudorandom number
+ generator". `ACM Transactions on Modeling and Computer
+ Simulation', Vol. 8, No. 1 (Jan. 1998), Pages 3-30
+
+ The generator `gsl_rng_mt19937' uses the second revision of the
+ seeding procedure published by the two authors above in 2002. The
+ original seeding procedures could cause spurious artifacts for
+ some seed values. They are still available through the alternative
+ generators `gsl_rng_mt19937_1999' and `gsl_rng_mt19937_1998'.
+
+ -- Generator: gsl_rng_ranlxs0
+ -- Generator: gsl_rng_ranlxs1
+ -- Generator: gsl_rng_ranlxs2
+ The generator `ranlxs0' is a second-generation version of the
+ RANLUX algorithm of Lu"scher, which produces "luxury random
+ numbers". This generator provides single precision output (24
+ bits) at three luxury levels `ranlxs0', `ranlxs1' and `ranlxs2',
+ in increasing order of strength. It uses double-precision
+ floating point arithmetic internally and can be significantly
+ faster than the integer version of `ranlux', particularly on
+ 64-bit architectures. The period of the generator is about
+ 10^171. The algorithm has mathematically proven properties and
+ can provide truly decorrelated numbers at a known level of
+ randomness. The higher luxury levels provide increased
+ decorrelation between samples as an additional safety margin.
+
+ -- Generator: gsl_rng_ranlxd1
+ -- Generator: gsl_rng_ranlxd2
+ These generators produce double precision output (48 bits) from the
+ RANLXS generator. The library provides two luxury levels
+ `ranlxd1' and `ranlxd2', in increasing order of strength.
+
+ -- Generator: gsl_rng_ranlux
+ -- Generator: gsl_rng_ranlux389
+ The `ranlux' generator is an implementation of the original
+ algorithm developed by Lu"scher. It uses a
+ lagged-fibonacci-with-skipping algorithm to produce "luxury random
+ numbers". It is a 24-bit generator, originally designed for
+ single-precision IEEE floating point numbers. This implementation
+ is based on integer arithmetic, while the second-generation
+ versions RANLXS and RANLXD described above provide floating-point
+ implementations which will be faster on many platforms. The
+ period of the generator is about 10^171. The algorithm has
+ mathematically proven properties and it can provide truly
+ decorrelated numbers at a known level of randomness. The default
+ level of decorrelation recommended by Lu"scher is provided by
+ `gsl_rng_ranlux', while `gsl_rng_ranlux389' gives the highest
+ level of randomness, with all 24 bits decorrelated. Both types of
+ generator use 24 words of state per generator.
+
+ For more information see,
+ M. Lu"scher, "A portable high-quality random number generator
+ for lattice field theory calculations", `Computer Physics
+ Communications', 79 (1994) 100-110.
+
+ F. James, "RANLUX: A Fortran implementation of the
+ high-quality pseudo-random number generator of Lu"scher",
+ `Computer Physics Communications', 79 (1994) 111-114
+
+ -- Generator: gsl_rng_cmrg
+ This is a combined multiple recursive generator by L'Ecuyer. Its
+ sequence is,
+
+ z_n = (x_n - y_n) mod m_1
+
+ where the two underlying generators x_n and y_n are,
+
+ x_n = (a_1 x_{n-1} + a_2 x_{n-2} + a_3 x_{n-3}) mod m_1
+ y_n = (b_1 y_{n-1} + b_2 y_{n-2} + b_3 y_{n-3}) mod m_2
+
+ with coefficients a_1 = 0, a_2 = 63308, a_3 = -183326, b_1 = 86098,
+ b_2 = 0, b_3 = -539608, and moduli m_1 = 2^31 - 1 = 2147483647 and
+ m_2 = 2145483479.
+
+ The period of this generator is lcm(m_1^3-1, m_2^3-1), which is
+ approximately 2^185 (about 10^56). It uses 6 words of state per
+ generator. For more information see,
+
+ P. L'Ecuyer, "Combined Multiple Recursive Random Number
+ Generators", `Operations Research', 44, 5 (1996), 816-822.
+
+ -- Generator: gsl_rng_mrg
+ This is a fifth-order multiple recursive generator by L'Ecuyer,
+ Blouin and Coutre. Its sequence is,
+
+ x_n = (a_1 x_{n-1} + a_5 x_{n-5}) mod m
+
+ with a_1 = 107374182, a_2 = a_3 = a_4 = 0, a_5 = 104480 and m =
+ 2^31 - 1.
+
+ The period of this generator is about 10^46. It uses 5 words of
+ state per generator. More information can be found in the
+ following paper,
+ P. L'Ecuyer, F. Blouin, and R. Coutre, "A search for good
+ multiple recursive random number generators", `ACM
+ Transactions on Modeling and Computer Simulation' 3, 87-98
+ (1993).
+
+ -- Generator: gsl_rng_taus
+ -- Generator: gsl_rng_taus2
+ This is a maximally equidistributed combined Tausworthe generator
+ by L'Ecuyer. The sequence is,
+
+ x_n = (s1_n ^^ s2_n ^^ s3_n)
+
+ where,
+
+ s1_{n+1} = (((s1_n&4294967294)<<12)^^(((s1_n<<13)^^s1_n)>>19))
+ s2_{n+1} = (((s2_n&4294967288)<< 4)^^(((s2_n<< 2)^^s2_n)>>25))
+ s3_{n+1} = (((s3_n&4294967280)<<17)^^(((s3_n<< 3)^^s3_n)>>11))
+
+ computed modulo 2^32. In the formulas above ^^ denotes
+ "exclusive-or". Note that the algorithm relies on the properties
+ of 32-bit unsigned integers and has been implemented using a
+ bitmask of `0xFFFFFFFF' to make it work on 64 bit machines.
+
+ The period of this generator is 2^88 (about 10^26). It uses 3
+ words of state per generator. For more information see,
+
+ P. L'Ecuyer, "Maximally Equidistributed Combined Tausworthe
+ Generators", `Mathematics of Computation', 65, 213 (1996),
+ 203-213.
+
+ The generator `gsl_rng_taus2' uses the same algorithm as
+ `gsl_rng_taus' but with an improved seeding procedure described in
+ the paper,
+
+ P. L'Ecuyer, "Tables of Maximally Equidistributed Combined
+ LFSR Generators", `Mathematics of Computation', 68, 225
+ (1999), 261-269
+
+ The generator `gsl_rng_taus2' should now be used in preference to
+ `gsl_rng_taus'.
+
+ -- Generator: gsl_rng_gfsr4
+ The `gfsr4' generator is like a lagged-fibonacci generator, and
+ produces each number as an `xor''d sum of four previous values.
+
+ r_n = r_{n-A} ^^ r_{n-B} ^^ r_{n-C} ^^ r_{n-D}
+
+ Ziff (ref below) notes that "it is now widely known" that two-tap
+ registers (such as R250, which is described below) have serious
+ flaws, the most obvious one being the three-point correlation that
+ comes from the definition of the generator. Nice mathematical
+ properties can be derived for GFSR's, and numerics bears out the
+ claim that 4-tap GFSR's with appropriately chosen offsets are as
+ random as can be measured, using the author's test.
+
+ This implementation uses the values suggested the example on p392
+ of Ziff's article: A=471, B=1586, C=6988, D=9689.
+
+ If the offsets are appropriately chosen (such as the one ones in
+ this implementation), then the sequence is said to be maximal;
+ that means that the period is 2^D - 1, where D is the longest lag.
+ (It is one less than 2^D because it is not permitted to have all
+ zeros in the `ra[]' array.) For this implementation with D=9689
+ that works out to about 10^2917.
+
+ Note that the implementation of this generator using a 32-bit
+ integer amounts to 32 parallel implementations of one-bit
+ generators. One consequence of this is that the period of this
+ 32-bit generator is the same as for the one-bit generator.
+ Moreover, this independence means that all 32-bit patterns are
+ equally likely, and in particular that 0 is an allowed random
+ value. (We are grateful to Heiko Bauke for clarifying for us these
+ properties of GFSR random number generators.)
+
+ For more information see,
+ Robert M. Ziff, "Four-tap shift-register-sequence
+ random-number generators", `Computers in Physics', 12(4),
+ Jul/Aug 1998, pp 385-392.
+
+
+File: gsl-ref.info, Node: Unix random number generators, Next: Other random number generators, Prev: Random number generator algorithms, Up: Random Number Generation
+
+17.10 Unix random number generators
+===================================
+
+The standard Unix random number generators `rand', `random' and
+`rand48' are provided as part of GSL. Although these generators are
+widely available individually often they aren't all available on the
+same platform. This makes it difficult to write portable code using
+them and so we have included the complete set of Unix generators in GSL
+for convenience. Note that these generators don't produce high-quality
+randomness and aren't suitable for work requiring accurate statistics.
+However, if you won't be measuring statistical quantities and just want
+to introduce some variation into your program then these generators are
+quite acceptable.
+
+ -- Generator: gsl_rng_rand
+ This is the BSD `rand' generator. Its sequence is
+
+ x_{n+1} = (a x_n + c) mod m
+
+ with a = 1103515245, c = 12345 and m = 2^31. The seed specifies
+ the initial value, x_1. The period of this generator is 2^31, and
+ it uses 1 word of storage per generator.
+
+ -- Generator: gsl_rng_random_bsd
+ -- Generator: gsl_rng_random_libc5
+ -- Generator: gsl_rng_random_glibc2
+ These generators implement the `random' family of functions, a set
+ of linear feedback shift register generators originally used in BSD
+ Unix. There are several versions of `random' in use today: the
+ original BSD version (e.g. on SunOS4), a libc5 version (found on
+ older GNU/Linux systems) and a glibc2 version. Each version uses a
+ different seeding procedure, and thus produces different sequences.
+
+ The original BSD routines accepted a variable length buffer for the
+ generator state, with longer buffers providing higher-quality
+ randomness. The `random' function implemented algorithms for
+ buffer lengths of 8, 32, 64, 128 and 256 bytes, and the algorithm
+ with the largest length that would fit into the user-supplied
+ buffer was used. To support these algorithms additional
+ generators are available with the following names,
+
+ gsl_rng_random8_bsd
+ gsl_rng_random32_bsd
+ gsl_rng_random64_bsd
+ gsl_rng_random128_bsd
+ gsl_rng_random256_bsd
+
+ where the numeric suffix indicates the buffer length. The
+ original BSD `random' function used a 128-byte default buffer and
+ so `gsl_rng_random_bsd' has been made equivalent to
+ `gsl_rng_random128_bsd'. Corresponding versions of the `libc5'
+ and `glibc2' generators are also available, with the names
+ `gsl_rng_random8_libc5', `gsl_rng_random8_glibc2', etc.
+
+ -- Generator: gsl_rng_rand48
+ This is the Unix `rand48' generator. Its sequence is
+
+ x_{n+1} = (a x_n + c) mod m
+
+ defined on 48-bit unsigned integers with a = 25214903917, c = 11
+ and m = 2^48. The seed specifies the upper 32 bits of the initial
+ value, x_1, with the lower 16 bits set to `0x330E'. The function
+ `gsl_rng_get' returns the upper 32 bits from each term of the
+ sequence. This does not have a direct parallel in the original
+ `rand48' functions, but forcing the result to type `long int'
+ reproduces the output of `mrand48'. The function
+ `gsl_rng_uniform' uses the full 48 bits of internal state to return
+ the double precision number x_n/m, which is equivalent to the
+ function `drand48'. Note that some versions of the GNU C Library
+ contained a bug in `mrand48' function which caused it to produce
+ different results (only the lower 16-bits of the return value were
+ set).
+
+
+File: gsl-ref.info, Node: Other random number generators, Next: Random Number Generator Performance, Prev: Unix random number generators, Up: Random Number Generation
+
+17.11 Other random number generators
+====================================
+
+The generators in this section are provided for compatibility with
+existing libraries. If you are converting an existing program to use
+GSL then you can select these generators to check your new
+implementation against the original one, using the same random number
+generator. After verifying that your new program reproduces the
+original results you can then switch to a higher-quality generator.
+
+ Note that most of the generators in this section are based on single
+linear congruence relations, which are the least sophisticated type of
+generator. In particular, linear congruences have poor properties when
+used with a non-prime modulus, as several of these routines do (e.g.
+with a power of two modulus, 2^31 or 2^32). This leads to periodicity
+in the least significant bits of each number, with only the higher bits
+having any randomness. Thus if you want to produce a random bitstream
+it is best to avoid using the least significant bits.
+
+ -- Generator: gsl_rng_ranf
+ This is the CRAY random number generator `RANF'. Its sequence is
+
+ x_{n+1} = (a x_n) mod m
+
+ defined on 48-bit unsigned integers with a = 44485709377909 and m
+ = 2^48. The seed specifies the lower 32 bits of the initial value,
+ x_1, with the lowest bit set to prevent the seed taking an even
+ value. The upper 16 bits of x_1 are set to 0. A consequence of
+ this procedure is that the pairs of seeds 2 and 3, 4 and 5, etc
+ produce the same sequences.
+
+ The generator compatible with the CRAY MATHLIB routine RANF. It
+ produces double precision floating point numbers which should be
+ identical to those from the original RANF.
+
+ There is a subtlety in the implementation of the seeding. The
+ initial state is reversed through one step, by multiplying by the
+ modular inverse of a mod m. This is done for compatibility with
+ the original CRAY implementation.
+
+ Note that you can only seed the generator with integers up to
+ 2^32, while the original CRAY implementation uses non-portable
+ wide integers which can cover all 2^48 states of the generator.
+
+ The function `gsl_rng_get' returns the upper 32 bits from each term
+ of the sequence. The function `gsl_rng_uniform' uses the full 48
+ bits to return the double precision number x_n/m.
+
+ The period of this generator is 2^46.
+
+ -- Generator: gsl_rng_ranmar
+ This is the RANMAR lagged-fibonacci generator of Marsaglia, Zaman
+ and Tsang. It is a 24-bit generator, originally designed for
+ single-precision IEEE floating point numbers. It was included in
+ the CERNLIB high-energy physics library.
+
+ -- Generator: gsl_rng_r250
+ This is the shift-register generator of Kirkpatrick and Stoll. The
+ sequence is based on the recurrence
+
+ x_n = x_{n-103} ^^ x_{n-250}
+
+ where ^^ denotes "exclusive-or", defined on 32-bit words. The
+ period of this generator is about 2^250 and it uses 250 words of
+ state per generator.
+
+ For more information see,
+ S. Kirkpatrick and E. Stoll, "A very fast shift-register
+ sequence random number generator", `Journal of Computational
+ Physics', 40, 517-526 (1981)
+
+ -- Generator: gsl_rng_tt800
+ This is an earlier version of the twisted generalized feedback
+ shift-register generator, and has been superseded by the
+ development of MT19937. However, it is still an acceptable
+ generator in its own right. It has a period of 2^800 and uses 33
+ words of storage per generator.
+
+ For more information see,
+ Makoto Matsumoto and Yoshiharu Kurita, "Twisted GFSR
+ Generators II", `ACM Transactions on Modelling and Computer
+ Simulation', Vol. 4, No. 3, 1994, pages 254-266.
+
+ -- Generator: gsl_rng_vax
+ This is the VAX generator `MTH$RANDOM'. Its sequence is,
+
+ x_{n+1} = (a x_n + c) mod m
+
+ with a = 69069, c = 1 and m = 2^32. The seed specifies the
+ initial value, x_1. The period of this generator is 2^32 and it
+ uses 1 word of storage per generator.
+
+ -- Generator: gsl_rng_transputer
+ This is the random number generator from the INMOS Transputer
+ Development system. Its sequence is,
+
+ x_{n+1} = (a x_n) mod m
+
+ with a = 1664525 and m = 2^32. The seed specifies the initial
+ value, x_1.
+
+ -- Generator: gsl_rng_randu
+ This is the IBM `RANDU' generator. Its sequence is
+
+ x_{n+1} = (a x_n) mod m
+
+ with a = 65539 and m = 2^31. The seed specifies the initial value,
+ x_1. The period of this generator was only 2^29. It has become a
+ textbook example of a poor generator.
+
+ -- Generator: gsl_rng_minstd
+ This is Park and Miller's "minimal standard" MINSTD generator, a
+ simple linear congruence which takes care to avoid the major
+ pitfalls of such algorithms. Its sequence is,
+
+ x_{n+1} = (a x_n) mod m
+
+ with a = 16807 and m = 2^31 - 1 = 2147483647. The seed specifies
+ the initial value, x_1. The period of this generator is about
+ 2^31.
+
+ This generator is used in the IMSL Library (subroutine RNUN) and in
+ MATLAB (the RAND function). It is also sometimes known by the
+ acronym "GGL" (I'm not sure what that stands for).
+
+ For more information see,
+ Park and Miller, "Random Number Generators: Good ones are
+ hard to find", `Communications of the ACM', October 1988,
+ Volume 31, No 10, pages 1192-1201.
+
+ -- Generator: gsl_rng_uni
+ -- Generator: gsl_rng_uni32
+ This is a reimplementation of the 16-bit SLATEC random number
+ generator RUNIF. A generalization of the generator to 32 bits is
+ provided by `gsl_rng_uni32'. The original source code is
+ available from NETLIB.
+
+ -- Generator: gsl_rng_slatec
+ This is the SLATEC random number generator RAND. It is ancient.
+ The original source code is available from NETLIB.
+
+ -- Generator: gsl_rng_zuf
+ This is the ZUFALL lagged Fibonacci series generator of Peterson.
+ Its sequence is,
+
+ t = u_{n-273} + u_{n-607}
+ u_n = t - floor(t)
+
+ The original source code is available from NETLIB. For more
+ information see,
+ W. Petersen, "Lagged Fibonacci Random Number Generators for
+ the NEC SX-3", `International Journal of High Speed
+ Computing' (1994).
+
+ -- Generator: gsl_rng_knuthran2
+ This is a second-order multiple recursive generator described by
+ Knuth in `Seminumerical Algorithms', 3rd Ed., page 108. Its
+ sequence is,
+
+ x_n = (a_1 x_{n-1} + a_2 x_{n-2}) mod m
+
+ with a_1 = 271828183, a_2 = 314159269, and m = 2^31 - 1.
+
+ -- Generator: gsl_rng_knuthran2002
+ -- Generator: gsl_rng_knuthran
+ This is a second-order multiple recursive generator described by
+ Knuth in `Seminumerical Algorithms', 3rd Ed., Section 3.6. Knuth
+ provides its C code. The updated routine `gsl_rng_knuthran2002'
+ is from the revised 9th printing and corrects some weaknesses in
+ the earlier version, which is implemented as `gsl_rng_knuthran'.
+
+ -- Generator: gsl_rng_borosh13
+ -- Generator: gsl_rng_fishman18
+ -- Generator: gsl_rng_fishman20
+ -- Generator: gsl_rng_lecuyer21
+ -- Generator: gsl_rng_waterman14
+ These multiplicative generators are taken from Knuth's
+ `Seminumerical Algorithms', 3rd Ed., pages 106-108. Their sequence
+ is,
+
+ x_{n+1} = (a x_n) mod m
+
+ where the seed specifies the initial value, x_1. The parameters a
+ and m are as follows, Borosh-Niederreiter: a = 1812433253, m =
+ 2^32, Fishman18: a = 62089911, m = 2^31 - 1, Fishman20: a = 48271,
+ m = 2^31 - 1, L'Ecuyer: a = 40692, m = 2^31 - 249, Waterman: a =
+ 1566083941, m = 2^32.
+
+ -- Generator: gsl_rng_fishman2x
+ This is the L'Ecuyer-Fishman random number generator. It is taken
+ from Knuth's `Seminumerical Algorithms', 3rd Ed., page 108. Its
+ sequence is,
+
+ z_{n+1} = (x_n - y_n) mod m
+
+ with m = 2^31 - 1. x_n and y_n are given by the `fishman20' and
+ `lecuyer21' algorithms. The seed specifies the initial value, x_1.
+
+
+ -- Generator: gsl_rng_coveyou
+ This is the Coveyou random number generator. It is taken from
+ Knuth's `Seminumerical Algorithms', 3rd Ed., Section 3.2.2. Its
+ sequence is,
+
+ x_{n+1} = (x_n (x_n + 1)) mod m
+
+ with m = 2^32. The seed specifies the initial value, x_1.
+
+
+File: gsl-ref.info, Node: Random Number Generator Performance, Next: Random Number Generator Examples, Prev: Other random number generators, Up: Random Number Generation
+
+17.12 Performance
+=================
+
+The following table shows the relative performance of a selection the
+available random number generators. The fastest simulation quality
+generators are `taus', `gfsr4' and `mt19937'. The generators which
+offer the best mathematically-proven quality are those based on the
+RANLUX algorithm.
+
+ 1754 k ints/sec, 870 k doubles/sec, taus
+ 1613 k ints/sec, 855 k doubles/sec, gfsr4
+ 1370 k ints/sec, 769 k doubles/sec, mt19937
+ 565 k ints/sec, 571 k doubles/sec, ranlxs0
+ 400 k ints/sec, 405 k doubles/sec, ranlxs1
+ 490 k ints/sec, 389 k doubles/sec, mrg
+ 407 k ints/sec, 297 k doubles/sec, ranlux
+ 243 k ints/sec, 254 k doubles/sec, ranlxd1
+ 251 k ints/sec, 253 k doubles/sec, ranlxs2
+ 238 k ints/sec, 215 k doubles/sec, cmrg
+ 247 k ints/sec, 198 k doubles/sec, ranlux389
+ 141 k ints/sec, 140 k doubles/sec, ranlxd2
+
+ 1852 k ints/sec, 935 k doubles/sec, ran3
+ 813 k ints/sec, 575 k doubles/sec, ran0
+ 787 k ints/sec, 476 k doubles/sec, ran1
+ 379 k ints/sec, 292 k doubles/sec, ran2
+
+
+File: gsl-ref.info, Node: Random Number Generator Examples, Next: Random Number References and Further Reading, Prev: Random Number Generator Performance, Up: Random Number Generation
+
+17.13 Examples
+==============
+
+The following program demonstrates the use of a random number generator
+to produce uniform random numbers in the range [0.0, 1.0),
+
+ #include <stdio.h>
+ #include <gsl/gsl_rng.h>
+
+ int
+ main (void)
+ {
+ const gsl_rng_type * T;
+ gsl_rng * r;
+
+ int i, n = 10;
+
+ gsl_rng_env_setup();
+
+ T = gsl_rng_default;
+ r = gsl_rng_alloc (T);
+
+ for (i = 0; i < n; i++)
+ {
+ double u = gsl_rng_uniform (r);
+ printf ("%.5f\n", u);
+ }
+
+ gsl_rng_free (r);
+
+ return 0;
+ }
+
+Here is the output of the program,
+
+ $ ./a.out
+ 0.99974
+ 0.16291
+ 0.28262
+ 0.94720
+ 0.23166
+ 0.48497
+ 0.95748
+ 0.74431
+ 0.54004
+ 0.73995
+
+The numbers depend on the seed used by the generator. The default seed
+can be changed with the `GSL_RNG_SEED' environment variable to produce
+a different stream of numbers. The generator itself can be changed
+using the environment variable `GSL_RNG_TYPE'. Here is the output of
+the program using a seed value of 123 and the multiple-recursive
+generator `mrg',
+
+ $ GSL_RNG_SEED=123 GSL_RNG_TYPE=mrg ./a.out
+ GSL_RNG_TYPE=mrg
+ GSL_RNG_SEED=123
+ 0.33050
+ 0.86631
+ 0.32982
+ 0.67620
+ 0.53391
+ 0.06457
+ 0.16847
+ 0.70229
+ 0.04371
+ 0.86374
+
+
+File: gsl-ref.info, Node: Random Number References and Further Reading, Next: Random Number Acknowledgements, Prev: Random Number Generator Examples, Up: Random Number Generation
+
+17.14 References and Further Reading
+====================================
+
+The subject of random number generation and testing is reviewed
+extensively in Knuth's `Seminumerical Algorithms'.
+
+ Donald E. Knuth, `The Art of Computer Programming: Seminumerical
+ Algorithms' (Vol 2, 3rd Ed, 1997), Addison-Wesley, ISBN 0201896842.
+
+Further information is available in the review paper written by Pierre
+L'Ecuyer,
+
+ P. L'Ecuyer, "Random Number Generation", Chapter 4 of the Handbook
+ on Simulation, Jerry Banks Ed., Wiley, 1998, 93-137.
+
+ `http://www.iro.umontreal.ca/~lecuyer/papers.html' in the file
+ `handsim.ps'.
+
+The source code for the DIEHARD random number generator tests is also
+available online,
+
+ `DIEHARD source code' G. Marsaglia,
+
+ `http://stat.fsu.edu/pub/diehard/'
+
+A comprehensive set of random number generator tests is available from
+NIST,
+
+ NIST Special Publication 800-22, "A Statistical Test Suite for the
+ Validation of Random Number Generators and Pseudo Random Number
+ Generators for Cryptographic Applications".
+
+ `http://csrc.nist.gov/rng/'
+
+
+File: gsl-ref.info, Node: Random Number Acknowledgements, Prev: Random Number References and Further Reading, Up: Random Number Generation
+
+17.15 Acknowledgements
+======================
+
+Thanks to Makoto Matsumoto, Takuji Nishimura and Yoshiharu Kurita for
+making the source code to their generators (MT19937, MM&TN; TT800,
+MM&YK) available under the GNU General Public License. Thanks to Martin
+Lu"scher for providing notes and source code for the RANLXS and RANLXD
+generators.
+
+
+File: gsl-ref.info, Node: Quasi-Random Sequences, Next: Random Number Distributions, Prev: Random Number Generation, Up: Top
+
+18 Quasi-Random Sequences
+*************************
+
+This chapter describes functions for generating quasi-random sequences
+in arbitrary dimensions. A quasi-random sequence progressively covers a
+d-dimensional space with a set of points that are uniformly
+distributed. Quasi-random sequences are also known as low-discrepancy
+sequences. The quasi-random sequence generators use an interface that
+is similar to the interface for random number generators, except that
+seeding is not required--each generator produces a single sequence.
+
+ The functions described in this section are declared in the header
+file `gsl_qrng.h'.
+
+* Menu:
+
+* Quasi-random number generator initialization::
+* Sampling from a quasi-random number generator::
+* Auxiliary quasi-random number generator functions::
+* Saving and resorting quasi-random number generator state::
+* Quasi-random number generator algorithms::
+* Quasi-random number generator examples::
+* Quasi-random number references::
+
+
+File: gsl-ref.info, Node: Quasi-random number generator initialization, Next: Sampling from a quasi-random number generator, Up: Quasi-Random Sequences
+
+18.1 Quasi-random number generator initialization
+=================================================
+
+ -- Function: gsl_qrng * gsl_qrng_alloc (const gsl_qrng_type * T,
+ unsigned int D)
+ This function returns a pointer to a newly-created instance of a
+ quasi-random sequence generator of type T and dimension D. If
+ there is insufficient memory to create the generator then the
+ function returns a null pointer and the error handler is invoked
+ with an error code of `GSL_ENOMEM'.
+
+ -- Function: void gsl_qrng_free (gsl_qrng * Q)
+ This function frees all the memory associated with the generator Q.
+
+ -- Function: void gsl_qrng_init (gsl_qrng * Q)
+ This function reinitializes the generator Q to its starting point.
+ Note that quasi-random sequences do not use a seed and always
+ produce the same set of values.
+
+
+File: gsl-ref.info, Node: Sampling from a quasi-random number generator, Next: Auxiliary quasi-random number generator functions, Prev: Quasi-random number generator initialization, Up: Quasi-Random Sequences
+
+18.2 Sampling from a quasi-random number generator
+==================================================
+
+ -- Function: int gsl_qrng_get (const gsl_qrng * Q, double X[])
+ This function stores the next point from the sequence generator Q
+ in the array X. The space available for X must match the
+ dimension of the generator. The point X will lie in the range 0 <
+ x_i < 1 for each x_i.
+
+
+File: gsl-ref.info, Node: Auxiliary quasi-random number generator functions, Next: Saving and resorting quasi-random number generator state, Prev: Sampling from a quasi-random number generator, Up: Quasi-Random Sequences
+
+18.3 Auxiliary quasi-random number generator functions
+======================================================
+
+ -- Function: const char * gsl_qrng_name (const gsl_qrng * Q)
+ This function returns a pointer to the name of the generator.
+
+ -- Function: size_t gsl_qrng_size (const gsl_qrng * Q)
+ -- Function: void * gsl_qrng_state (const gsl_qrng * Q)
+ These functions return a pointer to the state of generator R and
+ its size. You can use this information to access the state
+ directly. For example, the following code will write the state of
+ a generator to a stream,
+
+ void * state = gsl_qrng_state (q);
+ size_t n = gsl_qrng_size (q);
+ fwrite (state, n, 1, stream);
+
+
+File: gsl-ref.info, Node: Saving and resorting quasi-random number generator state, Next: Quasi-random number generator algorithms, Prev: Auxiliary quasi-random number generator functions, Up: Quasi-Random Sequences
+
+18.4 Saving and resorting quasi-random number generator state
+=============================================================
+
+ -- Function: int gsl_qrng_memcpy (gsl_qrng * DEST, const gsl_qrng *
+ SRC)
+ This function copies the quasi-random sequence generator SRC into
+ the pre-existing generator DEST, making DEST into an exact copy of
+ SRC. The two generators must be of the same type.
+
+ -- Function: gsl_qrng * gsl_qrng_clone (const gsl_qrng * Q)
+ This function returns a pointer to a newly created generator which
+ is an exact copy of the generator Q.
+
+
+File: gsl-ref.info, Node: Quasi-random number generator algorithms, Next: Quasi-random number generator examples, Prev: Saving and resorting quasi-random number generator state, Up: Quasi-Random Sequences
+
+18.5 Quasi-random number generator algorithms
+=============================================
+
+The following quasi-random sequence algorithms are available,
+
+ -- Generator: gsl_qrng_niederreiter_2
+ This generator uses the algorithm described in Bratley, Fox,
+ Niederreiter, `ACM Trans. Model. Comp. Sim.' 2, 195 (1992). It is
+ valid up to 12 dimensions.
+
+ -- Generator: gsl_qrng_sobol
+ This generator uses the Sobol sequence described in Antonov,
+ Saleev, `USSR Comput. Maths. Math. Phys.' 19, 252 (1980). It is
+ valid up to 40 dimensions.
+
+
+File: gsl-ref.info, Node: Quasi-random number generator examples, Next: Quasi-random number references, Prev: Quasi-random number generator algorithms, Up: Quasi-Random Sequences
+
+18.6 Examples
+=============
+
+The following program prints the first 1024 points of the 2-dimensional
+Sobol sequence.
+
+ #include <stdio.h>
+ #include <gsl/gsl_qrng.h>
+
+ int
+ main (void)
+ {
+ int i;
+ gsl_qrng * q = gsl_qrng_alloc (gsl_qrng_sobol, 2);
+
+ for (i = 0; i < 1024; i++)
+ {
+ double v[2];
+ gsl_qrng_get (q, v);
+ printf ("%.5f %.5f\n", v[0], v[1]);
+ }
+
+ gsl_qrng_free (q);
+ return 0;
+ }
+
+Here is the output from the program,
+
+ $ ./a.out
+ 0.50000 0.50000
+ 0.75000 0.25000
+ 0.25000 0.75000
+ 0.37500 0.37500
+ 0.87500 0.87500
+ 0.62500 0.12500
+ 0.12500 0.62500
+ ....
+
+It can be seen that successive points progressively fill-in the spaces
+between previous points.
+
+
+File: gsl-ref.info, Node: Quasi-random number references, Prev: Quasi-random number generator examples, Up: Quasi-Random Sequences
+
+18.7 References
+===============
+
+The implementations of the quasi-random sequence routines are based on
+the algorithms described in the following paper,
+
+ P. Bratley and B.L. Fox and H. Niederreiter, "Algorithm 738:
+ Programs to Generate Niederreiter's Low-discrepancy Sequences",
+ `ACM Transactions on Mathematical Software', Vol. 20, No. 4,
+ December, 1994, p. 494-495.
+
+
+File: gsl-ref.info, Node: Random Number Distributions, Next: Statistics, Prev: Quasi-Random Sequences, Up: Top
+
+19 Random Number Distributions
+******************************
+
+This chapter describes functions for generating random variates and
+computing their probability distributions. Samples from the
+distributions described in this chapter can be obtained using any of the
+random number generators in the library as an underlying source of
+randomness.
+
+ In the simplest cases a non-uniform distribution can be obtained
+analytically from the uniform distribution of a random number generator
+by applying an appropriate transformation. This method uses one call to
+the random number generator. More complicated distributions are created
+by the "acceptance-rejection" method, which compares the desired
+distribution against a distribution which is similar and known
+analytically. This usually requires several samples from the generator.
+
+ The library also provides cumulative distribution functions and
+inverse cumulative distribution functions, sometimes referred to as
+quantile functions. The cumulative distribution functions and their
+inverses are computed separately for the upper and lower tails of the
+distribution, allowing full accuracy to be retained for small results.
+
+ The functions for random variates and probability density functions
+described in this section are declared in `gsl_randist.h'. The
+corresponding cumulative distribution functions are declared in
+`gsl_cdf.h'.
+
+ Note that the discrete random variate functions always return a
+value of type `unsigned int', and on most platforms this has a maximum
+value of 2^32-1 ~=~ 4.29e9. They should only be called with a safe
+range of parameters (where there is a negligible probability of a
+variate exceeding this limit) to prevent incorrect results due to
+overflow.
+
+* Menu:
+
+* Random Number Distribution Introduction::
+* The Gaussian Distribution::
+* The Gaussian Tail Distribution::
+* The Bivariate Gaussian Distribution::
+* The Exponential Distribution::
+* The Laplace Distribution::
+* The Exponential Power Distribution::
+* The Cauchy Distribution::
+* The Rayleigh Distribution::
+* The Rayleigh Tail Distribution::
+* The Landau Distribution::
+* The Levy alpha-Stable Distributions::
+* The Levy skew alpha-Stable Distribution::
+* The Gamma Distribution::
+* The Flat (Uniform) Distribution::
+* The Lognormal Distribution::
+* The Chi-squared Distribution::
+* The F-distribution::
+* The t-distribution::
+* The Beta Distribution::
+* The Logistic Distribution::
+* The Pareto Distribution::
+* Spherical Vector Distributions::
+* The Weibull Distribution::
+* The Type-1 Gumbel Distribution::
+* The Type-2 Gumbel Distribution::
+* The Dirichlet Distribution::
+* General Discrete Distributions::
+* The Poisson Distribution::
+* The Bernoulli Distribution::
+* The Binomial Distribution::
+* The Multinomial Distribution::
+* The Negative Binomial Distribution::
+* The Pascal Distribution::
+* The Geometric Distribution::
+* The Hypergeometric Distribution::
+* The Logarithmic Distribution::
+* Shuffling and Sampling::
+* Random Number Distribution Examples::
+* Random Number Distribution References and Further Reading::
+
+
+File: gsl-ref.info, Node: Random Number Distribution Introduction, Next: The Gaussian Distribution, Up: Random Number Distributions
+
+19.1 Introduction
+=================
+
+Continuous random number distributions are defined by a probability
+density function, p(x), such that the probability of x occurring in the
+infinitesimal range x to x+dx is p dx.
+
+ The cumulative distribution function for the lower tail P(x) is
+defined by the integral,
+
+ P(x) = \int_{-\infty}^{x} dx' p(x')
+
+and gives the probability of a variate taking a value less than x.
+
+ The cumulative distribution function for the upper tail Q(x) is
+defined by the integral,
+
+ Q(x) = \int_{x}^{+\infty} dx' p(x')
+
+and gives the probability of a variate taking a value greater than x.
+
+ The upper and lower cumulative distribution functions are related by
+P(x) + Q(x) = 1 and satisfy 0 <= P(x) <= 1, 0 <= Q(x) <= 1.
+
+ The inverse cumulative distributions, x=P^{-1}(P) and x=Q^{-1}(Q)
+give the values of x which correspond to a specific value of P or Q.
+They can be used to find confidence limits from probability values.
+
+ For discrete distributions the probability of sampling the integer
+value k is given by p(k), where \sum_k p(k) = 1. The cumulative
+distribution for the lower tail P(k) of a discrete distribution is
+defined as,
+
+ P(k) = \sum_{i <= k} p(i)
+
+where the sum is over the allowed range of the distribution less than
+or equal to k.
+
+ The cumulative distribution for the upper tail of a discrete
+distribution Q(k) is defined as
+
+ Q(k) = \sum_{i > k} p(i)
+
+giving the sum of probabilities for all values greater than k. These
+two definitions satisfy the identity P(k)+Q(k)=1.
+
+ If the range of the distribution is 1 to n inclusive then P(n)=1,
+Q(n)=0 while P(1) = p(1), Q(1)=1-p(1).
+
+
+File: gsl-ref.info, Node: The Gaussian Distribution, Next: The Gaussian Tail Distribution, Prev: Random Number Distribution Introduction, Up: Random Number Distributions
+
+19.2 The Gaussian Distribution
+==============================
+
+ -- Function: double gsl_ran_gaussian (const gsl_rng * R, double SIGMA)
+ This function returns a Gaussian random variate, with mean zero and
+ standard deviation SIGMA. The probability distribution for
+ Gaussian random variates is,
+
+ p(x) dx = {1 \over \sqrt{2 \pi \sigma^2}} \exp (-x^2 / 2\sigma^2) dx
+
+ for x in the range -\infty to +\infty. Use the transformation z =
+ \mu + x on the numbers returned by `gsl_ran_gaussian' to obtain a
+ Gaussian distribution with mean \mu. This function uses the
+ Box-Mueller algorithm which requires two calls to the random
+ number generator R.
+
+ -- Function: double gsl_ran_gaussian_pdf (double X, double SIGMA)
+ This function computes the probability density p(x) at X for a
+ Gaussian distribution with standard deviation SIGMA, using the
+ formula given above.
+
+
+ -- Function: double gsl_ran_gaussian_ziggurat (const gsl_rng * R,
+ double SIGMA)
+ -- Function: double gsl_ran_gaussian_ratio_method (const gsl_rng * R,
+ double SIGMA)
+ This function computes a Gaussian random variate using the
+ alternative Marsaglia-Tsang ziggurat and Kinderman-Monahan-Leva
+ ratio methods. The Ziggurat algorithm is the fastest available
+ algorithm in most cases.
+
+ -- Function: double gsl_ran_ugaussian (const gsl_rng * R)
+ -- Function: double gsl_ran_ugaussian_pdf (double X)
+ -- Function: double gsl_ran_ugaussian_ratio_method (const gsl_rng * R)
+ These functions compute results for the unit Gaussian
+ distribution. They are equivalent to the functions above with a
+ standard deviation of one, SIGMA = 1.
+
+ -- Function: double gsl_cdf_gaussian_P (double X, double SIGMA)
+ -- Function: double gsl_cdf_gaussian_Q (double X, double SIGMA)
+ -- Function: double gsl_cdf_gaussian_Pinv (double P, double SIGMA)
+ -- Function: double gsl_cdf_gaussian_Qinv (double Q, double SIGMA)
+ These functions compute the cumulative distribution functions
+ P(x), Q(x) and their inverses for the Gaussian distribution with
+ standard deviation SIGMA.
+
+ -- Function: double gsl_cdf_ugaussian_P (double X)
+ -- Function: double gsl_cdf_ugaussian_Q (double X)
+ -- Function: double gsl_cdf_ugaussian_Pinv (double P)
+ -- Function: double gsl_cdf_ugaussian_Qinv (double Q)
+ These functions compute the cumulative distribution functions
+ P(x), Q(x) and their inverses for the unit Gaussian distribution.
+
+
+File: gsl-ref.info, Node: The Gaussian Tail Distribution, Next: The Bivariate Gaussian Distribution, Prev: The Gaussian Distribution, Up: Random Number Distributions
+
+19.3 The Gaussian Tail Distribution
+===================================
+
+ -- Function: double gsl_ran_gaussian_tail (const gsl_rng * R, double
+ A, double SIGMA)
+ This function provides random variates from the upper tail of a
+ Gaussian distribution with standard deviation SIGMA. The values
+ returned are larger than the lower limit A, which must be
+ positive. The method is based on Marsaglia's famous
+ rectangle-wedge-tail algorithm (Ann. Math. Stat. 32, 894-899
+ (1961)), with this aspect explained in Knuth, v2, 3rd ed, p139,586
+ (exercise 11).
+
+ The probability distribution for Gaussian tail random variates is,
+
+ p(x) dx = {1 \over N(a;\sigma) \sqrt{2 \pi \sigma^2}} \exp (- x^2/(2 \sigma^2)) dx
+
+ for x > a where N(a;\sigma) is the normalization constant,
+
+ N(a;\sigma) = (1/2) erfc(a / sqrt(2 sigma^2)).
+
+
+ -- Function: double gsl_ran_gaussian_tail_pdf (double X, double A,
+ double SIGMA)
+ This function computes the probability density p(x) at X for a
+ Gaussian tail distribution with standard deviation SIGMA and lower
+ limit A, using the formula given above.
+
+
+ -- Function: double gsl_ran_ugaussian_tail (const gsl_rng * R, double
+ A)
+ -- Function: double gsl_ran_ugaussian_tail_pdf (double X, double A)
+ These functions compute results for the tail of a unit Gaussian
+ distribution. They are equivalent to the functions above with a
+ standard deviation of one, SIGMA = 1.
+
+
+File: gsl-ref.info, Node: The Bivariate Gaussian Distribution, Next: The Exponential Distribution, Prev: The Gaussian Tail Distribution, Up: Random Number Distributions
+
+19.4 The Bivariate Gaussian Distribution
+========================================
+
+ -- Function: void gsl_ran_bivariate_gaussian (const gsl_rng * R,
+ double SIGMA_X, double SIGMA_Y, double RHO, double * X,
+ double * Y)
+ This function generates a pair of correlated Gaussian variates,
+ with mean zero, correlation coefficient RHO and standard deviations
+ SIGMA_X and SIGMA_Y in the x and y directions. The probability
+ distribution for bivariate Gaussian random variates is,
+
+ p(x,y) dx dy = {1 \over 2 \pi \sigma_x \sigma_y \sqrt{1-\rho^2}} \exp (-(x^2/\sigma_x^2 + y^2/\sigma_y^2 - 2 \rho x y/(\sigma_x\sigma_y))/2(1-\rho^2)) dx dy
+
+ for x,y in the range -\infty to +\infty. The correlation
+ coefficient RHO should lie between 1 and -1.
+
+ -- Function: double gsl_ran_bivariate_gaussian_pdf (double X, double
+ Y, double SIGMA_X, double SIGMA_Y, double RHO)
+ This function computes the probability density p(x,y) at (X,Y) for
+ a bivariate Gaussian distribution with standard deviations
+ SIGMA_X, SIGMA_Y and correlation coefficient RHO, using the
+ formula given above.
+
+
+
+File: gsl-ref.info, Node: The Exponential Distribution, Next: The Laplace Distribution, Prev: The Bivariate Gaussian Distribution, Up: Random Number Distributions
+
+19.5 The Exponential Distribution
+=================================
+
+ -- Function: double gsl_ran_exponential (const gsl_rng * R, double MU)
+ This function returns a random variate from the exponential
+ distribution with mean MU. The distribution is,
+
+ p(x) dx = {1 \over \mu} \exp(-x/\mu) dx
+
+ for x >= 0.
+
+ -- Function: double gsl_ran_exponential_pdf (double X, double MU)
+ This function computes the probability density p(x) at X for an
+ exponential distribution with mean MU, using the formula given
+ above.
+
+
+ -- Function: double gsl_cdf_exponential_P (double X, double MU)
+ -- Function: double gsl_cdf_exponential_Q (double X, double MU)
+ -- Function: double gsl_cdf_exponential_Pinv (double P, double MU)
+ -- Function: double gsl_cdf_exponential_Qinv (double Q, double MU)
+ These functions compute the cumulative distribution functions
+ P(x), Q(x) and their inverses for the exponential distribution
+ with mean MU.
+
+
+File: gsl-ref.info, Node: The Laplace Distribution, Next: The Exponential Power Distribution, Prev: The Exponential Distribution, Up: Random Number Distributions
+
+19.6 The Laplace Distribution
+=============================
+
+ -- Function: double gsl_ran_laplace (const gsl_rng * R, double A)
+ This function returns a random variate from the Laplace
+ distribution with width A. The distribution is,
+
+ p(x) dx = {1 \over 2 a} \exp(-|x/a|) dx
+
+ for -\infty < x < \infty.
+
+ -- Function: double gsl_ran_laplace_pdf (double X, double A)
+ This function computes the probability density p(x) at X for a
+ Laplace distribution with width A, using the formula given above.
+
+
+ -- Function: double gsl_cdf_laplace_P (double X, double A)
+ -- Function: double gsl_cdf_laplace_Q (double X, double A)
+ -- Function: double gsl_cdf_laplace_Pinv (double P, double A)
+ -- Function: double gsl_cdf_laplace_Qinv (double Q, double A)
+ These functions compute the cumulative distribution functions
+ P(x), Q(x) and their inverses for the Laplace distribution with
+ width A.
+
+
+File: gsl-ref.info, Node: The Exponential Power Distribution, Next: The Cauchy Distribution, Prev: The Laplace Distribution, Up: Random Number Distributions
+
+19.7 The Exponential Power Distribution
+=======================================
+
+ -- Function: double gsl_ran_exppow (const gsl_rng * R, double A,
+ double B)
+ This function returns a random variate from the exponential power
+ distribution with scale parameter A and exponent B. The
+ distribution is,
+
+ p(x) dx = {1 \over 2 a \Gamma(1+1/b)} \exp(-|x/a|^b) dx
+
+ for x >= 0. For b = 1 this reduces to the Laplace distribution.
+ For b = 2 it has the same form as a gaussian distribution, but
+ with a = \sqrt{2} \sigma.
+
+ -- Function: double gsl_ran_exppow_pdf (double X, double A, double B)
+ This function computes the probability density p(x) at X for an
+ exponential power distribution with scale parameter A and exponent
+ B, using the formula given above.
+
+
+ -- Function: double gsl_cdf_exppow_P (double X, double A, double B)
+ -- Function: double gsl_cdf_exppow_Q (double X, double A, double B)
+ These functions compute the cumulative distribution functions
+ P(x), Q(x) for the exponential power distribution with parameters
+ A and B.
+
+
+File: gsl-ref.info, Node: The Cauchy Distribution, Next: The Rayleigh Distribution, Prev: The Exponential Power Distribution, Up: Random Number Distributions
+
+19.8 The Cauchy Distribution
+============================
+
+ -- Function: double gsl_ran_cauchy (const gsl_rng * R, double A)
+ This function returns a random variate from the Cauchy
+ distribution with scale parameter A. The probability distribution
+ for Cauchy random variates is,
+
+ p(x) dx = {1 \over a\pi (1 + (x/a)^2) } dx
+
+ for x in the range -\infty to +\infty. The Cauchy distribution is
+ also known as the Lorentz distribution.
+
+ -- Function: double gsl_ran_cauchy_pdf (double X, double A)
+ This function computes the probability density p(x) at X for a
+ Cauchy distribution with scale parameter A, using the formula
+ given above.
+
+
+ -- Function: double gsl_cdf_cauchy_P (double X, double A)
+ -- Function: double gsl_cdf_cauchy_Q (double X, double A)
+ -- Function: double gsl_cdf_cauchy_Pinv (double P, double A)
+ -- Function: double gsl_cdf_cauchy_Qinv (double Q, double A)
+ These functions compute the cumulative distribution functions
+ P(x), Q(x) and their inverses for the Cauchy distribution with
+ scale parameter A.
+
+
+File: gsl-ref.info, Node: The Rayleigh Distribution, Next: The Rayleigh Tail Distribution, Prev: The Cauchy Distribution, Up: Random Number Distributions
+
+19.9 The Rayleigh Distribution
+==============================
+
+ -- Function: double gsl_ran_rayleigh (const gsl_rng * R, double SIGMA)
+ This function returns a random variate from the Rayleigh
+ distribution with scale parameter SIGMA. The distribution is,
+
+ p(x) dx = {x \over \sigma^2} \exp(- x^2/(2 \sigma^2)) dx
+
+ for x > 0.
+
+ -- Function: double gsl_ran_rayleigh_pdf (double X, double SIGMA)
+ This function computes the probability density p(x) at X for a
+ Rayleigh distribution with scale parameter SIGMA, using the
+ formula given above.
+
+
+ -- Function: double gsl_cdf_rayleigh_P (double X, double SIGMA)
+ -- Function: double gsl_cdf_rayleigh_Q (double X, double SIGMA)
+ -- Function: double gsl_cdf_rayleigh_Pinv (double P, double SIGMA)
+ -- Function: double gsl_cdf_rayleigh_Qinv (double Q, double SIGMA)
+ These functions compute the cumulative distribution functions
+ P(x), Q(x) and their inverses for the Rayleigh distribution with
+ scale parameter SIGMA.
+
+
+File: gsl-ref.info, Node: The Rayleigh Tail Distribution, Next: The Landau Distribution, Prev: The Rayleigh Distribution, Up: Random Number Distributions
+
+19.10 The Rayleigh Tail Distribution
+====================================
+
+ -- Function: double gsl_ran_rayleigh_tail (const gsl_rng * R, double
+ A, double SIGMA)
+ This function returns a random variate from the tail of the
+ Rayleigh distribution with scale parameter SIGMA and a lower limit
+ of A. The distribution is,
+
+ p(x) dx = {x \over \sigma^2} \exp ((a^2 - x^2) /(2 \sigma^2)) dx
+
+ for x > a.
+
+ -- Function: double gsl_ran_rayleigh_tail_pdf (double X, double A,
+ double SIGMA)
+ This function computes the probability density p(x) at X for a
+ Rayleigh tail distribution with scale parameter SIGMA and lower
+ limit A, using the formula given above.
+
+
+
+File: gsl-ref.info, Node: The Landau Distribution, Next: The Levy alpha-Stable Distributions, Prev: The Rayleigh Tail Distribution, Up: Random Number Distributions
+
+19.11 The Landau Distribution
+=============================
+
+ -- Function: double gsl_ran_landau (const gsl_rng * R)
+ This function returns a random variate from the Landau
+ distribution. The probability distribution for Landau random
+ variates is defined analytically by the complex integral,
+
+ p(x) = (1/(2 \pi i)) \int_{c-i\infty}^{c+i\infty} ds exp(s log(s) + x s)
+ For numerical purposes it is more convenient to use the following
+ equivalent form of the integral,
+
+ p(x) = (1/\pi) \int_0^\infty dt \exp(-t \log(t) - x t) \sin(\pi t).
+
+ -- Function: double gsl_ran_landau_pdf (double X)
+ This function computes the probability density p(x) at X for the
+ Landau distribution using an approximation to the formula given
+ above.
+
+
+
+File: gsl-ref.info, Node: The Levy alpha-Stable Distributions, Next: The Levy skew alpha-Stable Distribution, Prev: The Landau Distribution, Up: Random Number Distributions
+
+19.12 The Levy alpha-Stable Distributions
+=========================================
+
+ -- Function: double gsl_ran_levy (const gsl_rng * R, double C, double
+ ALPHA)
+ This function returns a random variate from the Levy symmetric
+ stable distribution with scale C and exponent ALPHA. The symmetric
+ stable probability distribution is defined by a fourier transform,
+
+ p(x) = {1 \over 2 \pi} \int_{-\infty}^{+\infty} dt \exp(-it x - |c t|^alpha)
+
+ There is no explicit solution for the form of p(x) and the library
+ does not define a corresponding `pdf' function. For \alpha = 1
+ the distribution reduces to the Cauchy distribution. For \alpha =
+ 2 it is a Gaussian distribution with \sigma = \sqrt{2} c. For
+ \alpha < 1 the tails of the distribution become extremely wide.
+
+ The algorithm only works for 0 < alpha <= 2.
+
+
+
+File: gsl-ref.info, Node: The Levy skew alpha-Stable Distribution, Next: The Gamma Distribution, Prev: The Levy alpha-Stable Distributions, Up: Random Number Distributions
+
+19.13 The Levy skew alpha-Stable Distribution
+=============================================
+
+ -- Function: double gsl_ran_levy_skew (const gsl_rng * R, double C,
+ double ALPHA, double BETA)
+ This function returns a random variate from the Levy skew stable
+ distribution with scale C, exponent ALPHA and skewness parameter
+ BETA. The skewness parameter must lie in the range [-1,1]. The
+ Levy skew stable probability distribution is defined by a fourier
+ transform,
+
+ p(x) = {1 \over 2 \pi} \int_{-\infty}^{+\infty} dt \exp(-it x - |c t|^alpha (1-i beta sign(t) tan(pi alpha/2)))
+
+ When \alpha = 1 the term \tan(\pi \alpha/2) is replaced by
+ -(2/\pi)\log|t|. There is no explicit solution for the form of
+ p(x) and the library does not define a corresponding `pdf'
+ function. For \alpha = 2 the distribution reduces to a Gaussian
+ distribution with \sigma = \sqrt{2} c and the skewness parameter
+ has no effect. For \alpha < 1 the tails of the distribution
+ become extremely wide. The symmetric distribution corresponds to
+ \beta = 0.
+
+ The algorithm only works for 0 < alpha <= 2.
+
+ The Levy alpha-stable distributions have the property that if N
+alpha-stable variates are drawn from the distribution p(c, \alpha,
+\beta) then the sum Y = X_1 + X_2 + \dots + X_N will also be
+distributed as an alpha-stable variate, p(N^(1/\alpha) c, \alpha,
+\beta).
+
+
+
+File: gsl-ref.info, Node: The Gamma Distribution, Next: The Flat (Uniform) Distribution, Prev: The Levy skew alpha-Stable Distribution, Up: Random Number Distributions
+
+19.14 The Gamma Distribution
+============================
+
+ -- Function: double gsl_ran_gamma (const gsl_rng * R, double A, double
+ B)
+ This function returns a random variate from the gamma
+ distribution. The distribution function is,
+
+ p(x) dx = {1 \over \Gamma(a) b^a} x^{a-1} e^{-x/b} dx
+
+ for x > 0.
+
+ The gamma distribution with an integer parameter A is known as the
+ Erlang distribution.
+
+ The variates are computed using the Marsaglia-Tsang fast gamma
+ method. This function for this method was previously called
+ `gsl_ran_gamma_mt' and can still be accessed using this name.
+
+ -- Function: double gsl_ran_gamma_knuth (const gsl_rng * R, double A,
+ double B)
+ This function returns a gamma variate using the algorithms from
+ Knuth (vol 2).
+
+ -- Function: double gsl_ran_gamma_pdf (double X, double A, double B)
+ This function computes the probability density p(x) at X for a
+ gamma distribution with parameters A and B, using the formula
+ given above.
+
+
+ -- Function: double gsl_cdf_gamma_P (double X, double A, double B)
+ -- Function: double gsl_cdf_gamma_Q (double X, double A, double B)
+ -- Function: double gsl_cdf_gamma_Pinv (double P, double A, double B)
+ -- Function: double gsl_cdf_gamma_Qinv (double Q, double A, double B)
+ These functions compute the cumulative distribution functions
+ P(x), Q(x) and their inverses for the gamma distribution with
+ parameters A and B.
+
+
+File: gsl-ref.info, Node: The Flat (Uniform) Distribution, Next: The Lognormal Distribution, Prev: The Gamma Distribution, Up: Random Number Distributions
+
+19.15 The Flat (Uniform) Distribution
+=====================================
+
+ -- Function: double gsl_ran_flat (const gsl_rng * R, double A, double
+ B)
+ This function returns a random variate from the flat (uniform)
+ distribution from A to B. The distribution is,
+
+ p(x) dx = {1 \over (b-a)} dx
+
+ if a <= x < b and 0 otherwise.
+
+ -- Function: double gsl_ran_flat_pdf (double X, double A, double B)
+ This function computes the probability density p(x) at X for a
+ uniform distribution from A to B, using the formula given above.
+
+
+ -- Function: double gsl_cdf_flat_P (double X, double A, double B)
+ -- Function: double gsl_cdf_flat_Q (double X, double A, double B)
+ -- Function: double gsl_cdf_flat_Pinv (double P, double A, double B)
+ -- Function: double gsl_cdf_flat_Qinv (double Q, double A, double B)
+ These functions compute the cumulative distribution functions
+ P(x), Q(x) and their inverses for a uniform distribution from A to
+ B.
+
+
+File: gsl-ref.info, Node: The Lognormal Distribution, Next: The Chi-squared Distribution, Prev: The Flat (Uniform) Distribution, Up: Random Number Distributions
+
+19.16 The Lognormal Distribution
+================================
+
+ -- Function: double gsl_ran_lognormal (const gsl_rng * R, double ZETA,
+ double SIGMA)
+ This function returns a random variate from the lognormal
+ distribution. The distribution function is,
+
+ p(x) dx = {1 \over x \sqrt{2 \pi \sigma^2} } \exp(-(\ln(x) - \zeta)^2/2 \sigma^2) dx
+
+ for x > 0.
+
+ -- Function: double gsl_ran_lognormal_pdf (double X, double ZETA,
+ double SIGMA)
+ This function computes the probability density p(x) at X for a
+ lognormal distribution with parameters ZETA and SIGMA, using the
+ formula given above.
+
+
+ -- Function: double gsl_cdf_lognormal_P (double X, double ZETA, double
+ SIGMA)
+ -- Function: double gsl_cdf_lognormal_Q (double X, double ZETA, double
+ SIGMA)
+ -- Function: double gsl_cdf_lognormal_Pinv (double P, double ZETA,
+ double SIGMA)
+ -- Function: double gsl_cdf_lognormal_Qinv (double Q, double ZETA,
+ double SIGMA)
+ These functions compute the cumulative distribution functions
+ P(x), Q(x) and their inverses for the lognormal distribution with
+ parameters ZETA and SIGMA.
+
+
+File: gsl-ref.info, Node: The Chi-squared Distribution, Next: The F-distribution, Prev: The Lognormal Distribution, Up: Random Number Distributions
+
+19.17 The Chi-squared Distribution
+==================================
+
+The chi-squared distribution arises in statistics. If Y_i are n
+independent gaussian random variates with unit variance then the
+sum-of-squares,
+
+ X_i = \sum_i Y_i^2
+
+has a chi-squared distribution with n degrees of freedom.
+
+ -- Function: double gsl_ran_chisq (const gsl_rng * R, double NU)
+ This function returns a random variate from the chi-squared
+ distribution with NU degrees of freedom. The distribution function
+ is,
+
+ p(x) dx = {1 \over 2 \Gamma(\nu/2) } (x/2)^{\nu/2 - 1} \exp(-x/2) dx
+
+ for x >= 0.
+
+ -- Function: double gsl_ran_chisq_pdf (double X, double NU)
+ This function computes the probability density p(x) at X for a
+ chi-squared distribution with NU degrees of freedom, using the
+ formula given above.
+
+
+ -- Function: double gsl_cdf_chisq_P (double X, double NU)
+ -- Function: double gsl_cdf_chisq_Q (double X, double NU)
+ -- Function: double gsl_cdf_chisq_Pinv (double P, double NU)
+ -- Function: double gsl_cdf_chisq_Qinv (double Q, double NU)
+ These functions compute the cumulative distribution functions
+ P(x), Q(x) and their inverses for the chi-squared distribution
+ with NU degrees of freedom.
+
+
+File: gsl-ref.info, Node: The F-distribution, Next: The t-distribution, Prev: The Chi-squared Distribution, Up: Random Number Distributions
+
+19.18 The F-distribution
+========================
+
+The F-distribution arises in statistics. If Y_1 and Y_2 are
+chi-squared deviates with \nu_1 and \nu_2 degrees of freedom then the
+ratio,
+
+ X = { (Y_1 / \nu_1) \over (Y_2 / \nu_2) }
+
+has an F-distribution F(x;\nu_1,\nu_2).
+
+ -- Function: double gsl_ran_fdist (const gsl_rng * R, double NU1,
+ double NU2)
+ This function returns a random variate from the F-distribution
+ with degrees of freedom NU1 and NU2. The distribution function is,
+
+ p(x) dx =
+ { \Gamma((\nu_1 + \nu_2)/2)
+ \over \Gamma(\nu_1/2) \Gamma(\nu_2/2) }
+ \nu_1^{\nu_1/2} \nu_2^{\nu_2/2}
+ x^{\nu_1/2 - 1} (\nu_2 + \nu_1 x)^{-\nu_1/2 -\nu_2/2}
+
+ for x >= 0.
+
+ -- Function: double gsl_ran_fdist_pdf (double X, double NU1, double
+ NU2)
+ This function computes the probability density p(x) at X for an
+ F-distribution with NU1 and NU2 degrees of freedom, using the
+ formula given above.
+
+
+ -- Function: double gsl_cdf_fdist_P (double X, double NU1, double NU2)
+ -- Function: double gsl_cdf_fdist_Q (double X, double NU1, double NU2)
+ -- Function: double gsl_cdf_fdist_Pinv (double P, double NU1, double
+ NU2)
+ -- Function: double gsl_cdf_fdist_Qinv (double Q, double NU1, double
+ NU2)
+ These functions compute the cumulative distribution functions
+ P(x), Q(x) and their inverses for the F-distribution with NU1 and
+ NU2 degrees of freedom.
+
+
+File: gsl-ref.info, Node: The t-distribution, Next: The Beta Distribution, Prev: The F-distribution, Up: Random Number Distributions
+
+19.19 The t-distribution
+========================
+
+The t-distribution arises in statistics. If Y_1 has a normal
+distribution and Y_2 has a chi-squared distribution with \nu degrees of
+freedom then the ratio,
+
+ X = { Y_1 \over \sqrt{Y_2 / \nu} }
+
+has a t-distribution t(x;\nu) with \nu degrees of freedom.
+
+ -- Function: double gsl_ran_tdist (const gsl_rng * R, double NU)
+ This function returns a random variate from the t-distribution.
+ The distribution function is,
+
+ p(x) dx = {\Gamma((\nu + 1)/2) \over \sqrt{\pi \nu} \Gamma(\nu/2)}
+ (1 + x^2/\nu)^{-(\nu + 1)/2} dx
+
+ for -\infty < x < +\infty.
+
+ -- Function: double gsl_ran_tdist_pdf (double X, double NU)
+ This function computes the probability density p(x) at X for a
+ t-distribution with NU degrees of freedom, using the formula given
+ above.
+
+
+ -- Function: double gsl_cdf_tdist_P (double X, double NU)
+ -- Function: double gsl_cdf_tdist_Q (double X, double NU)
+ -- Function: double gsl_cdf_tdist_Pinv (double P, double NU)
+ -- Function: double gsl_cdf_tdist_Qinv (double Q, double NU)
+ These functions compute the cumulative distribution functions
+ P(x), Q(x) and their inverses for the t-distribution with NU
+ degrees of freedom.
+
+
+File: gsl-ref.info, Node: The Beta Distribution, Next: The Logistic Distribution, Prev: The t-distribution, Up: Random Number Distributions
+
+19.20 The Beta Distribution
+===========================
+
+ -- Function: double gsl_ran_beta (const gsl_rng * R, double A, double
+ B)
+ This function returns a random variate from the beta distribution.
+ The distribution function is,
+
+ p(x) dx = {\Gamma(a+b) \over \Gamma(a) \Gamma(b)} x^{a-1} (1-x)^{b-1} dx
+
+ for 0 <= x <= 1.
+
+ -- Function: double gsl_ran_beta_pdf (double X, double A, double B)
+ This function computes the probability density p(x) at X for a
+ beta distribution with parameters A and B, using the formula given
+ above.
+
+
+ -- Function: double gsl_cdf_beta_P (double X, double A, double B)
+ -- Function: double gsl_cdf_beta_Q (double X, double A, double B)
+ -- Function: double gsl_cdf_beta_Pinv (double P, double A, double B)
+ -- Function: double gsl_cdf_beta_Qinv (double Q, double A, double B)
+ These functions compute the cumulative distribution functions
+ P(x), Q(x) and their inverses for the beta distribution with
+ parameters A and B.
+
+
+File: gsl-ref.info, Node: The Logistic Distribution, Next: The Pareto Distribution, Prev: The Beta Distribution, Up: Random Number Distributions
+
+19.21 The Logistic Distribution
+===============================
+
+ -- Function: double gsl_ran_logistic (const gsl_rng * R, double A)
+ This function returns a random variate from the logistic
+ distribution. The distribution function is,
+
+ p(x) dx = { \exp(-x/a) \over a (1 + \exp(-x/a))^2 } dx
+
+ for -\infty < x < +\infty.
+
+ -- Function: double gsl_ran_logistic_pdf (double X, double A)
+ This function computes the probability density p(x) at X for a
+ logistic distribution with scale parameter A, using the formula
+ given above.
+
+
+ -- Function: double gsl_cdf_logistic_P (double X, double A)
+ -- Function: double gsl_cdf_logistic_Q (double X, double A)
+ -- Function: double gsl_cdf_logistic_Pinv (double P, double A)
+ -- Function: double gsl_cdf_logistic_Qinv (double Q, double A)
+ These functions compute the cumulative distribution functions
+ P(x), Q(x) and their inverses for the logistic distribution with
+ scale parameter A.
+
+
+File: gsl-ref.info, Node: The Pareto Distribution, Next: Spherical Vector Distributions, Prev: The Logistic Distribution, Up: Random Number Distributions
+
+19.22 The Pareto Distribution
+=============================
+
+ -- Function: double gsl_ran_pareto (const gsl_rng * R, double A,
+ double B)
+ This function returns a random variate from the Pareto
+ distribution of order A. The distribution function is,
+
+ p(x) dx = (a/b) / (x/b)^{a+1} dx
+
+ for x >= b.
+
+ -- Function: double gsl_ran_pareto_pdf (double X, double A, double B)
+ This function computes the probability density p(x) at X for a
+ Pareto distribution with exponent A and scale B, using the formula
+ given above.
+
+
+ -- Function: double gsl_cdf_pareto_P (double X, double A, double B)
+ -- Function: double gsl_cdf_pareto_Q (double X, double A, double B)
+ -- Function: double gsl_cdf_pareto_Pinv (double P, double A, double B)
+ -- Function: double gsl_cdf_pareto_Qinv (double Q, double A, double B)
+ These functions compute the cumulative distribution functions
+ P(x), Q(x) and their inverses for the Pareto distribution with
+ exponent A and scale B.
+
+
+File: gsl-ref.info, Node: Spherical Vector Distributions, Next: The Weibull Distribution, Prev: The Pareto Distribution, Up: Random Number Distributions
+
+19.23 Spherical Vector Distributions
+====================================
+
+The spherical distributions generate random vectors, located on a
+spherical surface. They can be used as random directions, for example
+in the steps of a random walk.
+
+ -- Function: void gsl_ran_dir_2d (const gsl_rng * R, double * X,
+ double * Y)
+ -- Function: void gsl_ran_dir_2d_trig_method (const gsl_rng * R,
+ double * X, double * Y)
+ This function returns a random direction vector v = (X,Y) in two
+ dimensions. The vector is normalized such that |v|^2 = x^2 + y^2
+ = 1. The obvious way to do this is to take a uniform random
+ number between 0 and 2\pi and let X and Y be the sine and cosine
+ respectively. Two trig functions would have been expensive in the
+ old days, but with modern hardware implementations, this is
+ sometimes the fastest way to go. This is the case for the Pentium
+ (but not the case for the Sun Sparcstation). One can avoid the
+ trig evaluations by choosing X and Y in the interior of a unit
+ circle (choose them at random from the interior of the enclosing
+ square, and then reject those that are outside the unit circle),
+ and then dividing by \sqrt{x^2 + y^2}. A much cleverer approach,
+ attributed to von Neumann (See Knuth, v2, 3rd ed, p140, exercise
+ 23), requires neither trig nor a square root. In this approach, U
+ and V are chosen at random from the interior of a unit circle, and
+ then x=(u^2-v^2)/(u^2+v^2) and y=2uv/(u^2+v^2).
+
+ -- Function: void gsl_ran_dir_3d (const gsl_rng * R, double * X,
+ double * Y, double * Z)
+ This function returns a random direction vector v = (X,Y,Z) in
+ three dimensions. The vector is normalized such that |v|^2 = x^2
+ + y^2 + z^2 = 1. The method employed is due to Robert E. Knop
+ (CACM 13, 326 (1970)), and explained in Knuth, v2, 3rd ed, p136.
+ It uses the surprising fact that the distribution projected along
+ any axis is actually uniform (this is only true for 3 dimensions).
+
+ -- Function: void gsl_ran_dir_nd (const gsl_rng * R, size_t N, double
+ * X)
+ This function returns a random direction vector v =
+ (x_1,x_2,...,x_n) in N dimensions. The vector is normalized such
+ that |v|^2 = x_1^2 + x_2^2 + ... + x_n^2 = 1. The method uses the
+ fact that a multivariate gaussian distribution is spherically
+ symmetric. Each component is generated to have a gaussian
+ distribution, and then the components are normalized. The method
+ is described by Knuth, v2, 3rd ed, p135-136, and attributed to G.
+ W. Brown, Modern Mathematics for the Engineer (1956).
+
+
+File: gsl-ref.info, Node: The Weibull Distribution, Next: The Type-1 Gumbel Distribution, Prev: Spherical Vector Distributions, Up: Random Number Distributions
+
+19.24 The Weibull Distribution
+==============================
+
+ -- Function: double gsl_ran_weibull (const gsl_rng * R, double A,
+ double B)
+ This function returns a random variate from the Weibull
+ distribution. The distribution function is,
+
+ p(x) dx = {b \over a^b} x^{b-1} \exp(-(x/a)^b) dx
+
+ for x >= 0.
+
+ -- Function: double gsl_ran_weibull_pdf (double X, double A, double B)
+ This function computes the probability density p(x) at X for a
+ Weibull distribution with scale A and exponent B, using the
+ formula given above.
+
+
+ -- Function: double gsl_cdf_weibull_P (double X, double A, double B)
+ -- Function: double gsl_cdf_weibull_Q (double X, double A, double B)
+ -- Function: double gsl_cdf_weibull_Pinv (double P, double A, double B)
+ -- Function: double gsl_cdf_weibull_Qinv (double Q, double A, double B)
+ These functions compute the cumulative distribution functions
+ P(x), Q(x) and their inverses for the Weibull distribution with
+ scale A and exponent B.
+
+
+File: gsl-ref.info, Node: The Type-1 Gumbel Distribution, Next: The Type-2 Gumbel Distribution, Prev: The Weibull Distribution, Up: Random Number Distributions
+
+19.25 The Type-1 Gumbel Distribution
+====================================
+
+ -- Function: double gsl_ran_gumbel1 (const gsl_rng * R, double A,
+ double B)
+ This function returns a random variate from the Type-1 Gumbel
+ distribution. The Type-1 Gumbel distribution function is,
+
+ p(x) dx = a b \exp(-(b \exp(-ax) + ax)) dx
+
+ for -\infty < x < \infty.
+
+ -- Function: double gsl_ran_gumbel1_pdf (double X, double A, double B)
+ This function computes the probability density p(x) at X for a
+ Type-1 Gumbel distribution with parameters A and B, using the
+ formula given above.
+
+
+ -- Function: double gsl_cdf_gumbel1_P (double X, double A, double B)
+ -- Function: double gsl_cdf_gumbel1_Q (double X, double A, double B)
+ -- Function: double gsl_cdf_gumbel1_Pinv (double P, double A, double B)
+ -- Function: double gsl_cdf_gumbel1_Qinv (double Q, double A, double B)
+ These functions compute the cumulative distribution functions
+ P(x), Q(x) and their inverses for the Type-1 Gumbel distribution
+ with parameters A and B.
+
+
+File: gsl-ref.info, Node: The Type-2 Gumbel Distribution, Next: The Dirichlet Distribution, Prev: The Type-1 Gumbel Distribution, Up: Random Number Distributions
+
+19.26 The Type-2 Gumbel Distribution
+====================================
+
+ -- Function: double gsl_ran_gumbel2 (const gsl_rng * R, double A,
+ double B)
+ This function returns a random variate from the Type-2 Gumbel
+ distribution. The Type-2 Gumbel distribution function is,
+
+ p(x) dx = a b x^{-a-1} \exp(-b x^{-a}) dx
+
+ for 0 < x < \infty.
+
+ -- Function: double gsl_ran_gumbel2_pdf (double X, double A, double B)
+ This function computes the probability density p(x) at X for a
+ Type-2 Gumbel distribution with parameters A and B, using the
+ formula given above.
+
+
+ -- Function: double gsl_cdf_gumbel2_P (double X, double A, double B)
+ -- Function: double gsl_cdf_gumbel2_Q (double X, double A, double B)
+ -- Function: double gsl_cdf_gumbel2_Pinv (double P, double A, double B)
+ -- Function: double gsl_cdf_gumbel2_Qinv (double Q, double A, double B)
+ These functions compute the cumulative distribution functions
+ P(x), Q(x) and their inverses for the Type-2 Gumbel distribution
+ with parameters A and B.
+
+
+File: gsl-ref.info, Node: The Dirichlet Distribution, Next: General Discrete Distributions, Prev: The Type-2 Gumbel Distribution, Up: Random Number Distributions
+
+19.27 The Dirichlet Distribution
+================================
+
+ -- Function: void gsl_ran_dirichlet (const gsl_rng * R, size_t K,
+ const double ALPHA[], double THETA[])
+ This function returns an array of K random variates from a
+ Dirichlet distribution of order K-1. The distribution function is
+
+ p(\theta_1, ..., \theta_K) d\theta_1 ... d\theta_K =
+ (1/Z) \prod_{i=1}^K \theta_i^{\alpha_i - 1} \delta(1 -\sum_{i=1}^K \theta_i) d\theta_1 ... d\theta_K
+
+ for theta_i >= 0 and alpha_i >= 0. The delta function ensures
+ that \sum \theta_i = 1. The normalization factor Z is
+
+ Z = {\prod_{i=1}^K \Gamma(\alpha_i)} / {\Gamma( \sum_{i=1}^K \alpha_i)}
+
+ The random variates are generated by sampling K values from gamma
+ distributions with parameters a=alpha_i, b=1, and renormalizing.
+ See A.M. Law, W.D. Kelton, `Simulation Modeling and Analysis'
+ (1991).
+
+ -- Function: double gsl_ran_dirichlet_pdf (size_t K, const double
+ ALPHA[], const double THETA[])
+ This function computes the probability density p(\theta_1, ... ,
+ \theta_K) at THETA[K] for a Dirichlet distribution with parameters
+ ALPHA[K], using the formula given above.
+
+ -- Function: double gsl_ran_dirichlet_lnpdf (size_t K, const double
+ ALPHA[], const double THETA[])
+ This function computes the logarithm of the probability density
+ p(\theta_1, ... , \theta_K) for a Dirichlet distribution with
+ parameters ALPHA[K].
+
+
+File: gsl-ref.info, Node: General Discrete Distributions, Next: The Poisson Distribution, Prev: The Dirichlet Distribution, Up: Random Number Distributions
+
+19.28 General Discrete Distributions
+====================================
+
+Given K discrete events with different probabilities P[k], produce a
+random value k consistent with its probability.
+
+ The obvious way to do this is to preprocess the probability list by
+generating a cumulative probability array with K+1 elements:
+
+ C[0] = 0
+ C[k+1] = C[k]+P[k].
+
+Note that this construction produces C[K]=1. Now choose a uniform
+deviate u between 0 and 1, and find the value of k such that C[k] <= u
+< C[k+1]. Although this in principle requires of order \log K steps per
+random number generation, they are fast steps, and if you use something
+like \lfloor uK \rfloor as a starting point, you can often do pretty
+well.
+
+ But faster methods have been devised. Again, the idea is to
+preprocess the probability list, and save the result in some form of
+lookup table; then the individual calls for a random discrete event can
+go rapidly. An approach invented by G. Marsaglia (Generating discrete
+random numbers in a computer, Comm ACM 6, 37-38 (1963)) is very clever,
+and readers interested in examples of good algorithm design are
+directed to this short and well-written paper. Unfortunately, for
+large K, Marsaglia's lookup table can be quite large.
+
+ A much better approach is due to Alastair J. Walker (An efficient
+method for generating discrete random variables with general
+distributions, ACM Trans on Mathematical Software 3, 253-256 (1977);
+see also Knuth, v2, 3rd ed, p120-121,139). This requires two lookup
+tables, one floating point and one integer, but both only of size K.
+After preprocessing, the random numbers are generated in O(1) time,
+even for large K. The preprocessing suggested by Walker requires
+O(K^2) effort, but that is not actually necessary, and the
+implementation provided here only takes O(K) effort. In general, more
+preprocessing leads to faster generation of the individual random
+numbers, but a diminishing return is reached pretty early. Knuth points
+out that the optimal preprocessing is combinatorially difficult for
+large K.
+
+ This method can be used to speed up some of the discrete random
+number generators below, such as the binomial distribution. To use it
+for something like the Poisson Distribution, a modification would have
+to be made, since it only takes a finite set of K outcomes.
+
+ -- Function: gsl_ran_discrete_t * gsl_ran_discrete_preproc (size_t K,
+ const double * P)
+ This function returns a pointer to a structure that contains the
+ lookup table for the discrete random number generator. The array
+ P[] contains the probabilities of the discrete events; these array
+ elements must all be positive, but they needn't add up to one (so
+ you can think of them more generally as "weights")--the
+ preprocessor will normalize appropriately. This return value is
+ used as an argument for the `gsl_ran_discrete' function below.
+
+ -- Function: size_t gsl_ran_discrete (const gsl_rng * R, const
+ gsl_ran_discrete_t * G)
+ After the preprocessor, above, has been called, you use this
+ function to get the discrete random numbers.
+
+ -- Function: double gsl_ran_discrete_pdf (size_t K, const
+ gsl_ran_discrete_t * G)
+ Returns the probability P[k] of observing the variable K. Since
+ P[k] is not stored as part of the lookup table, it must be
+ recomputed; this computation takes O(K), so if K is large and you
+ care about the original array P[k] used to create the lookup
+ table, then you should just keep this original array P[k] around.
+
+ -- Function: void gsl_ran_discrete_free (gsl_ran_discrete_t * G)
+ De-allocates the lookup table pointed to by G.
+
+
+File: gsl-ref.info, Node: The Poisson Distribution, Next: The Bernoulli Distribution, Prev: General Discrete Distributions, Up: Random Number Distributions
+
+19.29 The Poisson Distribution
+==============================
+
+ -- Function: unsigned int gsl_ran_poisson (const gsl_rng * R, double
+ MU)
+ This function returns a random integer from the Poisson
+ distribution with mean MU. The probability distribution for
+ Poisson variates is,
+
+ p(k) = {\mu^k \over k!} \exp(-\mu)
+
+ for k >= 0.
+
+ -- Function: double gsl_ran_poisson_pdf (unsigned int K, double MU)
+ This function computes the probability p(k) of obtaining K from a
+ Poisson distribution with mean MU, using the formula given above.
+
+
+ -- Function: double gsl_cdf_poisson_P (unsigned int K, double MU)
+ -- Function: double gsl_cdf_poisson_Q (unsigned int K, double MU)
+ These functions compute the cumulative distribution functions
+ P(k), Q(k) for the Poisson distribution with parameter MU.
+
+
+File: gsl-ref.info, Node: The Bernoulli Distribution, Next: The Binomial Distribution, Prev: The Poisson Distribution, Up: Random Number Distributions
+
+19.30 The Bernoulli Distribution
+================================
+
+ -- Function: unsigned int gsl_ran_bernoulli (const gsl_rng * R, double
+ P)
+ This function returns either 0 or 1, the result of a Bernoulli
+ trial with probability P. The probability distribution for a
+ Bernoulli trial is,
+
+ p(0) = 1 - p
+ p(1) = p
+
+
+ -- Function: double gsl_ran_bernoulli_pdf (unsigned int K, double P)
+ This function computes the probability p(k) of obtaining K from a
+ Bernoulli distribution with probability parameter P, using the
+ formula given above.
+
+
+
+File: gsl-ref.info, Node: The Binomial Distribution, Next: The Multinomial Distribution, Prev: The Bernoulli Distribution, Up: Random Number Distributions
+
+19.31 The Binomial Distribution
+===============================
+
+ -- Function: unsigned int gsl_ran_binomial (const gsl_rng * R, double
+ P, unsigned int N)
+ This function returns a random integer from the binomial
+ distribution, the number of successes in N independent trials with
+ probability P. The probability distribution for binomial variates
+ is,
+
+ p(k) = {n! \over k! (n-k)! } p^k (1-p)^{n-k}
+
+ for 0 <= k <= n.
+
+ -- Function: double gsl_ran_binomial_pdf (unsigned int K, double P,
+ unsigned int N)
+ This function computes the probability p(k) of obtaining K from a
+ binomial distribution with parameters P and N, using the formula
+ given above.
+
+
+ -- Function: double gsl_cdf_binomial_P (unsigned int K, double P,
+ unsigned int N)
+ -- Function: double gsl_cdf_binomial_Q (unsigned int K, double P,
+ unsigned int N)
+ These functions compute the cumulative distribution functions
+ P(k), Q(k) for the binomial distribution with parameters P and N.
+
+
+File: gsl-ref.info, Node: The Multinomial Distribution, Next: The Negative Binomial Distribution, Prev: The Binomial Distribution, Up: Random Number Distributions
+
+19.32 The Multinomial Distribution
+==================================
+
+ -- Function: void gsl_ran_multinomial (const gsl_rng * R, size_t K,
+ unsigned int N, const double P[], unsigned int N[])
+ This function computes a random sample N[] from the multinomial
+ distribution formed by N trials from an underlying distribution
+ P[K]. The distribution function for N[] is,
+
+ P(n_1, n_2, ..., n_K) =
+ (N!/(n_1! n_2! ... n_K!)) p_1^n_1 p_2^n_2 ... p_K^n_K
+
+ where (n_1, n_2, ..., n_K) are nonnegative integers with
+ sum_{k=1}^K n_k = N, and (p_1, p_2, ..., p_K) is a probability
+ distribution with \sum p_i = 1. If the array P[K] is not
+ normalized then its entries will be treated as weights and
+ normalized appropriately. The arrays N[] and P[] must both be of
+ length K.
+
+ Random variates are generated using the conditional binomial
+ method (see C.S. David, `The computer generation of multinomial
+ random variates', Comp. Stat. Data Anal. 16 (1993) 205-217 for
+ details).
+
+ -- Function: double gsl_ran_multinomial_pdf (size_t K, const double
+ P[], const unsigned int N[])
+ This function computes the probability P(n_1, n_2, ..., n_K) of
+ sampling N[K] from a multinomial distribution with parameters
+ P[K], using the formula given above.
+
+ -- Function: double gsl_ran_multinomial_lnpdf (size_t K, const double
+ P[], const unsigned int N[])
+ This function returns the logarithm of the probability for the
+ multinomial distribution P(n_1, n_2, ..., n_K) with parameters
+ P[K].
+
+
+File: gsl-ref.info, Node: The Negative Binomial Distribution, Next: The Pascal Distribution, Prev: The Multinomial Distribution, Up: Random Number Distributions
+
+19.33 The Negative Binomial Distribution
+========================================
+
+ -- Function: unsigned int gsl_ran_negative_binomial (const gsl_rng *
+ R, double P, double N)
+ This function returns a random integer from the negative binomial
+ distribution, the number of failures occurring before N successes
+ in independent trials with probability P of success. The
+ probability distribution for negative binomial variates is,
+
+ p(k) = {\Gamma(n + k) \over \Gamma(k+1) \Gamma(n) } p^n (1-p)^k
+
+ Note that n is not required to be an integer.
+
+ -- Function: double gsl_ran_negative_binomial_pdf (unsigned int K,
+ double P, double N)
+ This function computes the probability p(k) of obtaining K from a
+ negative binomial distribution with parameters P and N, using the
+ formula given above.
+
+
+ -- Function: double gsl_cdf_negative_binomial_P (unsigned int K,
+ double P, double N)
+ -- Function: double gsl_cdf_negative_binomial_Q (unsigned int K,
+ double P, double N)
+ These functions compute the cumulative distribution functions
+ P(k), Q(k) for the negative binomial distribution with parameters
+ P and N.
+
+
+File: gsl-ref.info, Node: The Pascal Distribution, Next: The Geometric Distribution, Prev: The Negative Binomial Distribution, Up: Random Number Distributions
+
+19.34 The Pascal Distribution
+=============================
+
+ -- Function: unsigned int gsl_ran_pascal (const gsl_rng * R, double P,
+ unsigned int N)
+ This function returns a random integer from the Pascal
+ distribution. The Pascal distribution is simply a negative
+ binomial distribution with an integer value of n.
+
+ p(k) = {(n + k - 1)! \over k! (n - 1)! } p^n (1-p)^k
+
+ for k >= 0
+
+ -- Function: double gsl_ran_pascal_pdf (unsigned int K, double P,
+ unsigned int N)
+ This function computes the probability p(k) of obtaining K from a
+ Pascal distribution with parameters P and N, using the formula
+ given above.
+
+
+ -- Function: double gsl_cdf_pascal_P (unsigned int K, double P,
+ unsigned int N)
+ -- Function: double gsl_cdf_pascal_Q (unsigned int K, double P,
+ unsigned int N)
+ These functions compute the cumulative distribution functions
+ P(k), Q(k) for the Pascal distribution with parameters P and N.
+
+
+File: gsl-ref.info, Node: The Geometric Distribution, Next: The Hypergeometric Distribution, Prev: The Pascal Distribution, Up: Random Number Distributions
+
+19.35 The Geometric Distribution
+================================
+
+ -- Function: unsigned int gsl_ran_geometric (const gsl_rng * R, double
+ P)
+ This function returns a random integer from the geometric
+ distribution, the number of independent trials with probability P
+ until the first success. The probability distribution for
+ geometric variates is,
+
+ p(k) = p (1-p)^(k-1)
+
+ for k >= 1. Note that the distribution begins with k=1 with this
+ definition. There is another convention in which the exponent k-1
+ is replaced by k.
+
+ -- Function: double gsl_ran_geometric_pdf (unsigned int K, double P)
+ This function computes the probability p(k) of obtaining K from a
+ geometric distribution with probability parameter P, using the
+ formula given above.
+
+
+ -- Function: double gsl_cdf_geometric_P (unsigned int K, double P)
+ -- Function: double gsl_cdf_geometric_Q (unsigned int K, double P)
+ These functions compute the cumulative distribution functions
+ P(k), Q(k) for the geometric distribution with parameter P.
+
+
+File: gsl-ref.info, Node: The Hypergeometric Distribution, Next: The Logarithmic Distribution, Prev: The Geometric Distribution, Up: Random Number Distributions
+
+19.36 The Hypergeometric Distribution
+=====================================
+
+ -- Function: unsigned int gsl_ran_hypergeometric (const gsl_rng * R,
+ unsigned int N1, unsigned int N2, unsigned int T)
+ This function returns a random integer from the hypergeometric
+ distribution. The probability distribution for hypergeometric
+ random variates is,
+
+ p(k) = C(n_1, k) C(n_2, t - k) / C(n_1 + n_2, t)
+
+ where C(a,b) = a!/(b!(a-b)!) and t <= n_1 + n_2. The domain of k
+ is max(0,t-n_2), ..., min(t,n_1).
+
+ If a population contains n_1 elements of "type 1" and n_2 elements
+ of "type 2" then the hypergeometric distribution gives the
+ probability of obtaining k elements of "type 1" in t samples from
+ the population without replacement.
+
+ -- Function: double gsl_ran_hypergeometric_pdf (unsigned int K,
+ unsigned int N1, unsigned int N2, unsigned int T)
+ This function computes the probability p(k) of obtaining K from a
+ hypergeometric distribution with parameters N1, N2, T, using the
+ formula given above.
+
+
+ -- Function: double gsl_cdf_hypergeometric_P (unsigned int K, unsigned
+ int N1, unsigned int N2, unsigned int T)
+ -- Function: double gsl_cdf_hypergeometric_Q (unsigned int K, unsigned
+ int N1, unsigned int N2, unsigned int T)
+ These functions compute the cumulative distribution functions
+ P(k), Q(k) for the hypergeometric distribution with parameters N1,
+ N2 and T.
+
+
+File: gsl-ref.info, Node: The Logarithmic Distribution, Next: Shuffling and Sampling, Prev: The Hypergeometric Distribution, Up: Random Number Distributions
+
+19.37 The Logarithmic Distribution
+==================================
+
+ -- Function: unsigned int gsl_ran_logarithmic (const gsl_rng * R,
+ double P)
+ This function returns a random integer from the logarithmic
+ distribution. The probability distribution for logarithmic random
+ variates is,
+
+ p(k) = {-1 \over \log(1-p)} {(p^k \over k)}
+
+ for k >= 1.
+
+ -- Function: double gsl_ran_logarithmic_pdf (unsigned int K, double P)
+ This function computes the probability p(k) of obtaining K from a
+ logarithmic distribution with probability parameter P, using the
+ formula given above.
+
+
+
+File: gsl-ref.info, Node: Shuffling and Sampling, Next: Random Number Distribution Examples, Prev: The Logarithmic Distribution, Up: Random Number Distributions
+
+19.38 Shuffling and Sampling
+============================
+
+The following functions allow the shuffling and sampling of a set of
+objects. The algorithms rely on a random number generator as a source
+of randomness and a poor quality generator can lead to correlations in
+the output. In particular it is important to avoid generators with a
+short period. For more information see Knuth, v2, 3rd ed, Section
+3.4.2, "Random Sampling and Shuffling".
+
+ -- Function: void gsl_ran_shuffle (const gsl_rng * R, void * BASE,
+ size_t N, size_t SIZE)
+ This function randomly shuffles the order of N objects, each of
+ size SIZE, stored in the array BASE[0..N-1]. The output of the
+ random number generator R is used to produce the permutation. The
+ algorithm generates all possible n! permutations with equal
+ probability, assuming a perfect source of random numbers.
+
+ The following code shows how to shuffle the numbers from 0 to 51,
+
+ int a[52];
+
+ for (i = 0; i < 52; i++)
+ {
+ a[i] = i;
+ }
+
+ gsl_ran_shuffle (r, a, 52, sizeof (int));
+
+
+ -- Function: int gsl_ran_choose (const gsl_rng * R, void * DEST,
+ size_t K, void * SRC, size_t N, size_t SIZE)
+ This function fills the array DEST[k] with K objects taken
+ randomly from the N elements of the array SRC[0..N-1]. The
+ objects are each of size SIZE. The output of the random number
+ generator R is used to make the selection. The algorithm ensures
+ all possible samples are equally likely, assuming a perfect source
+ of randomness.
+
+ The objects are sampled _without_ replacement, thus each object can
+ only appear once in DEST[k]. It is required that K be less than
+ or equal to `n'. The objects in DEST will be in the same relative
+ order as those in SRC. You will need to call `gsl_ran_shuffle(r,
+ dest, n, size)' if you want to randomize the order.
+
+ The following code shows how to select a random sample of three
+ unique numbers from the set 0 to 99,
+
+ double a[3], b[100];
+
+ for (i = 0; i < 100; i++)
+ {
+ b[i] = (double) i;
+ }
+
+ gsl_ran_choose (r, a, 3, b, 100, sizeof (double));
+
+
+ -- Function: void gsl_ran_sample (const gsl_rng * R, void * DEST,
+ size_t K, void * SRC, size_t N, size_t SIZE)
+ This function is like `gsl_ran_choose' but samples K items from
+ the original array of N items SRC with replacement, so the same
+ object can appear more than once in the output sequence DEST.
+ There is no requirement that K be less than N in this case.
+
+
+File: gsl-ref.info, Node: Random Number Distribution Examples, Next: Random Number Distribution References and Further Reading, Prev: Shuffling and Sampling, Up: Random Number Distributions
+
+19.39 Examples
+==============
+
+The following program demonstrates the use of a random number generator
+to produce variates from a distribution. It prints 10 samples from the
+Poisson distribution with a mean of 3.
+
+ #include <stdio.h>
+ #include <gsl/gsl_rng.h>
+ #include <gsl/gsl_randist.h>
+
+ int
+ main (void)
+ {
+ const gsl_rng_type * T;
+ gsl_rng * r;
+
+ int i, n = 10;
+ double mu = 3.0;
+
+ /* create a generator chosen by the
+ environment variable GSL_RNG_TYPE */
+
+ gsl_rng_env_setup();
+
+ T = gsl_rng_default;
+ r = gsl_rng_alloc (T);
+
+ /* print n random variates chosen from
+ the poisson distribution with mean
+ parameter mu */
+
+ for (i = 0; i < n; i++)
+ {
+ unsigned int k = gsl_ran_poisson (r, mu);
+ printf (" %u", k);
+ }
+
+ printf ("\n");
+ gsl_rng_free (r);
+ return 0;
+ }
+
+If the library and header files are installed under `/usr/local' (the
+default location) then the program can be compiled with these options,
+
+ $ gcc -Wall demo.c -lgsl -lgslcblas -lm
+
+Here is the output of the program,
+
+ $ ./a.out
+ 2 5 5 2 1 0 3 4 1 1
+
+The variates depend on the seed used by the generator. The seed for the
+default generator type `gsl_rng_default' can be changed with the
+`GSL_RNG_SEED' environment variable to produce a different stream of
+variates,
+
+ $ GSL_RNG_SEED=123 ./a.out
+ GSL_RNG_SEED=123
+ 4 5 6 3 3 1 4 2 5 5
+
+The following program generates a random walk in two dimensions.
+
+ #include <stdio.h>
+ #include <gsl/gsl_rng.h>
+ #include <gsl/gsl_randist.h>
+
+ int
+ main (void)
+ {
+ int i;
+ double x = 0, y = 0, dx, dy;
+
+ const gsl_rng_type * T;
+ gsl_rng * r;
+
+ gsl_rng_env_setup();
+ T = gsl_rng_default;
+ r = gsl_rng_alloc (T);
+
+ printf ("%g %g\n", x, y);
+
+ for (i = 0; i < 10; i++)
+ {
+ gsl_ran_dir_2d (r, &dx, &dy);
+ x += dx; y += dy;
+ printf ("%g %g\n", x, y);
+ }
+
+ gsl_rng_free (r);
+ return 0;
+ }
+
+Here is the output from the program, three 10-step random walks from
+the origin,
+
+ The following program computes the upper and lower cumulative
+distribution functions for the standard normal distribution at x=2.
+
+ #include <stdio.h>
+ #include <gsl/gsl_cdf.h>
+
+ int
+ main (void)
+ {
+ double P, Q;
+ double x = 2.0;
+
+ P = gsl_cdf_ugaussian_P (x);
+ printf ("prob(x < %f) = %f\n", x, P);
+
+ Q = gsl_cdf_ugaussian_Q (x);
+ printf ("prob(x > %f) = %f\n", x, Q);
+
+ x = gsl_cdf_ugaussian_Pinv (P);
+ printf ("Pinv(%f) = %f\n", P, x);
+
+ x = gsl_cdf_ugaussian_Qinv (Q);
+ printf ("Qinv(%f) = %f\n", Q, x);
+
+ return 0;
+ }
+
+Here is the output of the program,
+
+ prob(x < 2.000000) = 0.977250
+ prob(x > 2.000000) = 0.022750
+ Pinv(0.977250) = 2.000000
+ Qinv(0.022750) = 2.000000
+
+
+File: gsl-ref.info, Node: Random Number Distribution References and Further Reading, Prev: Random Number Distribution Examples, Up: Random Number Distributions
+
+19.40 References and Further Reading
+====================================
+
+For an encyclopaedic coverage of the subject readers are advised to
+consult the book `Non-Uniform Random Variate Generation' by Luc
+Devroye. It covers every imaginable distribution and provides hundreds
+of algorithms.
+
+ Luc Devroye, `Non-Uniform Random Variate Generation',
+ Springer-Verlag, ISBN 0-387-96305-7.
+
+The subject of random variate generation is also reviewed by Knuth, who
+describes algorithms for all the major distributions.
+
+ Donald E. Knuth, `The Art of Computer Programming: Seminumerical
+ Algorithms' (Vol 2, 3rd Ed, 1997), Addison-Wesley, ISBN 0201896842.
+
+The Particle Data Group provides a short review of techniques for
+generating distributions of random numbers in the "Monte Carlo" section
+of its Annual Review of Particle Physics.
+
+ `Review of Particle Properties' R.M. Barnett et al., Physical
+ Review D54, 1 (1996) `http://pdg.lbl.gov/'.
+
+The Review of Particle Physics is available online in postscript and pdf
+format.
+
+An overview of methods used to compute cumulative distribution functions
+can be found in `Statistical Computing' by W.J. Kennedy and J.E.
+Gentle. Another general reference is `Elements of Statistical
+Computing' by R.A. Thisted.
+
+ William E. Kennedy and James E. Gentle, `Statistical Computing'
+ (1980), Marcel Dekker, ISBN 0-8247-6898-1.
+
+ Ronald A. Thisted, `Elements of Statistical Computing' (1988),
+ Chapman & Hall, ISBN 0-412-01371-1.
+
+The cumulative distribution functions for the Gaussian distribution are
+based on the following papers,
+
+ `Rational Chebyshev Approximations Using Linear Equations', W.J.
+ Cody, W. Fraser, J.F. Hart. Numerische Mathematik 12, 242-251
+ (1968).
+
+ `Rational Chebyshev Approximations for the Error Function', W.J.
+ Cody. Mathematics of Computation 23, n107, 631-637 (July 1969).
+
+
+File: gsl-ref.info, Node: Statistics, Next: Histograms, Prev: Random Number Distributions, Up: Top
+
+20 Statistics
+*************
+
+This chapter describes the statistical functions in the library. The
+basic statistical functions include routines to compute the mean,
+variance and standard deviation. More advanced functions allow you to
+calculate absolute deviations, skewness, and kurtosis as well as the
+median and arbitrary percentiles. The algorithms use recurrence
+relations to compute average quantities in a stable way, without large
+intermediate values that might overflow.
+
+ The functions are available in versions for datasets in the standard
+floating-point and integer types. The versions for double precision
+floating-point data have the prefix `gsl_stats' and are declared in the
+header file `gsl_statistics_double.h'. The versions for integer data
+have the prefix `gsl_stats_int' and are declared in the header file
+`gsl_statistics_int.h'.
+
+* Menu:
+
+* Mean and standard deviation and variance::
+* Absolute deviation::
+* Higher moments (skewness and kurtosis)::
+* Autocorrelation::
+* Covariance::
+* Weighted Samples::
+* Maximum and Minimum values::
+* Median and Percentiles::
+* Example statistical programs::
+* Statistics References and Further Reading::
+
+
+File: gsl-ref.info, Node: Mean and standard deviation and variance, Next: Absolute deviation, Up: Statistics
+
+20.1 Mean, Standard Deviation and Variance
+==========================================
+
+ -- Function: double gsl_stats_mean (const double DATA[], size_t
+ STRIDE, size_t N)
+ This function returns the arithmetic mean of DATA, a dataset of
+ length N with stride STRIDE. The arithmetic mean, or "sample
+ mean", is denoted by \Hat\mu and defined as,
+
+ \Hat\mu = (1/N) \sum x_i
+
+ where x_i are the elements of the dataset DATA. For samples drawn
+ from a gaussian distribution the variance of \Hat\mu is \sigma^2 /
+ N.
+
+ -- Function: double gsl_stats_variance (const double DATA[], size_t
+ STRIDE, size_t N)
+ This function returns the estimated, or "sample", variance of
+ DATA, a dataset of length N with stride STRIDE. The estimated
+ variance is denoted by \Hat\sigma^2 and is defined by,
+
+ \Hat\sigma^2 = (1/(N-1)) \sum (x_i - \Hat\mu)^2
+
+ where x_i are the elements of the dataset DATA. Note that the
+ normalization factor of 1/(N-1) results from the derivation of
+ \Hat\sigma^2 as an unbiased estimator of the population variance
+ \sigma^2. For samples drawn from a gaussian distribution the
+ variance of \Hat\sigma^2 itself is 2 \sigma^4 / N.
+
+ This function computes the mean via a call to `gsl_stats_mean'. If
+ you have already computed the mean then you can pass it directly to
+ `gsl_stats_variance_m'.
+
+ -- Function: double gsl_stats_variance_m (const double DATA[], size_t
+ STRIDE, size_t N, double MEAN)
+ This function returns the sample variance of DATA relative to the
+ given value of MEAN. The function is computed with \Hat\mu
+ replaced by the value of MEAN that you supply,
+
+ \Hat\sigma^2 = (1/(N-1)) \sum (x_i - mean)^2
+
+ -- Function: double gsl_stats_sd (const double DATA[], size_t STRIDE,
+ size_t N)
+ -- Function: double gsl_stats_sd_m (const double DATA[], size_t
+ STRIDE, size_t N, double MEAN)
+ The standard deviation is defined as the square root of the
+ variance. These functions return the square root of the
+ corresponding variance functions above.
+
+ -- Function: double gsl_stats_variance_with_fixed_mean (const double
+ DATA[], size_t STRIDE, size_t N, double MEAN)
+ This function computes an unbiased estimate of the variance of
+ DATA when the population mean MEAN of the underlying distribution
+ is known _a priori_. In this case the estimator for the variance
+ uses the factor 1/N and the sample mean \Hat\mu is replaced by the
+ known population mean \mu,
+
+ \Hat\sigma^2 = (1/N) \sum (x_i - \mu)^2
+
+ -- Function: double gsl_stats_sd_with_fixed_mean (const double DATA[],
+ size_t STRIDE, size_t N, double MEAN)
+ This function calculates the standard deviation of DATA for a
+ fixed population mean MEAN. The result is the square root of the
+ corresponding variance function.
+
+
+File: gsl-ref.info, Node: Absolute deviation, Next: Higher moments (skewness and kurtosis), Prev: Mean and standard deviation and variance, Up: Statistics
+
+20.2 Absolute deviation
+=======================
+
+ -- Function: double gsl_stats_absdev (const double DATA[], size_t
+ STRIDE, size_t N)
+ This function computes the absolute deviation from the mean of
+ DATA, a dataset of length N with stride STRIDE. The absolute
+ deviation from the mean is defined as,
+
+ absdev = (1/N) \sum |x_i - \Hat\mu|
+
+ where x_i are the elements of the dataset DATA. The absolute
+ deviation from the mean provides a more robust measure of the
+ width of a distribution than the variance. This function computes
+ the mean of DATA via a call to `gsl_stats_mean'.
+
+ -- Function: double gsl_stats_absdev_m (const double DATA[], size_t
+ STRIDE, size_t N, double MEAN)
+ This function computes the absolute deviation of the dataset DATA
+ relative to the given value of MEAN,
+
+ absdev = (1/N) \sum |x_i - mean|
+
+ This function is useful if you have already computed the mean of
+ DATA (and want to avoid recomputing it), or wish to calculate the
+ absolute deviation relative to another value (such as zero, or the
+ median).
+
+
+File: gsl-ref.info, Node: Higher moments (skewness and kurtosis), Next: Autocorrelation, Prev: Absolute deviation, Up: Statistics
+
+20.3 Higher moments (skewness and kurtosis)
+===========================================
+
+ -- Function: double gsl_stats_skew (const double DATA[], size_t
+ STRIDE, size_t N)
+ This function computes the skewness of DATA, a dataset of length N
+ with stride STRIDE. The skewness is defined as,
+
+ skew = (1/N) \sum ((x_i - \Hat\mu)/\Hat\sigma)^3
+
+ where x_i are the elements of the dataset DATA. The skewness
+ measures the asymmetry of the tails of a distribution.
+
+ The function computes the mean and estimated standard deviation of
+ DATA via calls to `gsl_stats_mean' and `gsl_stats_sd'.
+
+ -- Function: double gsl_stats_skew_m_sd (const double DATA[], size_t
+ STRIDE, size_t N, double MEAN, double SD)
+ This function computes the skewness of the dataset DATA using the
+ given values of the mean MEAN and standard deviation SD,
+
+ skew = (1/N) \sum ((x_i - mean)/sd)^3
+
+ These functions are useful if you have already computed the mean
+ and standard deviation of DATA and want to avoid recomputing them.
+
+ -- Function: double gsl_stats_kurtosis (const double DATA[], size_t
+ STRIDE, size_t N)
+ This function computes the kurtosis of DATA, a dataset of length N
+ with stride STRIDE. The kurtosis is defined as,
+
+ kurtosis = ((1/N) \sum ((x_i - \Hat\mu)/\Hat\sigma)^4) - 3
+
+ The kurtosis measures how sharply peaked a distribution is,
+ relative to its width. The kurtosis is normalized to zero for a
+ gaussian distribution.
+
+ -- Function: double gsl_stats_kurtosis_m_sd (const double DATA[],
+ size_t STRIDE, size_t N, double MEAN, double SD)
+ This function computes the kurtosis of the dataset DATA using the
+ given values of the mean MEAN and standard deviation SD,
+
+ kurtosis = ((1/N) \sum ((x_i - mean)/sd)^4) - 3
+
+ This function is useful if you have already computed the mean and
+ standard deviation of DATA and want to avoid recomputing them.
+
+
+File: gsl-ref.info, Node: Autocorrelation, Next: Covariance, Prev: Higher moments (skewness and kurtosis), Up: Statistics
+
+20.4 Autocorrelation
+====================
+
+ -- Function: double gsl_stats_lag1_autocorrelation (const double
+ DATA[], const size_t STRIDE, const size_t N)
+ This function computes the lag-1 autocorrelation of the dataset
+ DATA.
+
+ a_1 = {\sum_{i = 1}^{n} (x_{i} - \Hat\mu) (x_{i-1} - \Hat\mu)
+ \over
+ \sum_{i = 1}^{n} (x_{i} - \Hat\mu) (x_{i} - \Hat\mu)}
+
+ -- Function: double gsl_stats_lag1_autocorrelation_m (const double
+ DATA[], const size_t STRIDE, const size_t N, const double
+ MEAN)
+ This function computes the lag-1 autocorrelation of the dataset
+ DATA using the given value of the mean MEAN.
+
+
+
+File: gsl-ref.info, Node: Covariance, Next: Weighted Samples, Prev: Autocorrelation, Up: Statistics
+
+20.5 Covariance
+===============
+
+ -- Function: double gsl_stats_covariance (const double DATA1[], const
+ size_t STRIDE1, const double DATA2[], const size_t STRIDE2,
+ const size_t N)
+ This function computes the covariance of the datasets DATA1 and
+ DATA2 which must both be of the same length N.
+
+ covar = (1/(n - 1)) \sum_{i = 1}^{n} (x_i - \Hat x) (y_i - \Hat y)
+
+ -- Function: double gsl_stats_covariance_m (const double DATA1[],
+ const size_t STRIDE1, const double DATA2[], const size_t
+ STRIDE2, const size_t N, const double MEAN1, const double
+ MEAN2)
+ This function computes the covariance of the datasets DATA1 and
+ DATA2 using the given values of the means, MEAN1 and MEAN2. This
+ is useful if you have already computed the means of DATA1 and
+ DATA2 and want to avoid recomputing them.
+
+
+File: gsl-ref.info, Node: Weighted Samples, Next: Maximum and Minimum values, Prev: Covariance, Up: Statistics
+
+20.6 Weighted Samples
+=====================
+
+The functions described in this section allow the computation of
+statistics for weighted samples. The functions accept an array of
+samples, x_i, with associated weights, w_i. Each sample x_i is
+considered as having been drawn from a Gaussian distribution with
+variance \sigma_i^2. The sample weight w_i is defined as the
+reciprocal of this variance, w_i = 1/\sigma_i^2. Setting a weight to
+zero corresponds to removing a sample from a dataset.
+
+ -- Function: double gsl_stats_wmean (const double W[], size_t WSTRIDE,
+ const double DATA[], size_t STRIDE, size_t N)
+ This function returns the weighted mean of the dataset DATA with
+ stride STRIDE and length N, using the set of weights W with stride
+ WSTRIDE and length N. The weighted mean is defined as,
+
+ \Hat\mu = (\sum w_i x_i) / (\sum w_i)
+
+ -- Function: double gsl_stats_wvariance (const double W[], size_t
+ WSTRIDE, const double DATA[], size_t STRIDE, size_t N)
+ This function returns the estimated variance of the dataset DATA
+ with stride STRIDE and length N, using the set of weights W with
+ stride WSTRIDE and length N. The estimated variance of a weighted
+ dataset is defined as,
+
+ \Hat\sigma^2 = ((\sum w_i)/((\sum w_i)^2 - \sum (w_i^2)))
+ \sum w_i (x_i - \Hat\mu)^2
+
+ Note that this expression reduces to an unweighted variance with
+ the familiar 1/(N-1) factor when there are N equal non-zero
+ weights.
+
+ -- Function: double gsl_stats_wvariance_m (const double W[], size_t
+ WSTRIDE, const double DATA[], size_t STRIDE, size_t N, double
+ WMEAN)
+ This function returns the estimated variance of the weighted
+ dataset DATA using the given weighted mean WMEAN.
+
+ -- Function: double gsl_stats_wsd (const double W[], size_t WSTRIDE,
+ const double DATA[], size_t STRIDE, size_t N)
+ The standard deviation is defined as the square root of the
+ variance. This function returns the square root of the
+ corresponding variance function `gsl_stats_wvariance' above.
+
+ -- Function: double gsl_stats_wsd_m (const double W[], size_t WSTRIDE,
+ const double DATA[], size_t STRIDE, size_t N, double WMEAN)
+ This function returns the square root of the corresponding variance
+ function `gsl_stats_wvariance_m' above.
+
+ -- Function: double gsl_stats_wvariance_with_fixed_mean (const double
+ W[], size_t WSTRIDE, const double DATA[], size_t STRIDE,
+ size_t N, const double MEAN)
+ This function computes an unbiased estimate of the variance of
+ weighted dataset DATA when the population mean MEAN of the
+ underlying distribution is known _a priori_. In this case the
+ estimator for the variance replaces the sample mean \Hat\mu by the
+ known population mean \mu,
+
+ \Hat\sigma^2 = (\sum w_i (x_i - \mu)^2) / (\sum w_i)
+
+ -- Function: double gsl_stats_wsd_with_fixed_mean (const double W[],
+ size_t WSTRIDE, const double DATA[], size_t STRIDE, size_t N,
+ const double MEAN)
+ The standard deviation is defined as the square root of the
+ variance. This function returns the square root of the
+ corresponding variance function above.
+
+ -- Function: double gsl_stats_wabsdev (const double W[], size_t
+ WSTRIDE, const double DATA[], size_t STRIDE, size_t N)
+ This function computes the weighted absolute deviation from the
+ weighted mean of DATA. The absolute deviation from the mean is
+ defined as,
+
+ absdev = (\sum w_i |x_i - \Hat\mu|) / (\sum w_i)
+
+ -- Function: double gsl_stats_wabsdev_m (const double W[], size_t
+ WSTRIDE, const double DATA[], size_t STRIDE, size_t N, double
+ WMEAN)
+ This function computes the absolute deviation of the weighted
+ dataset DATA about the given weighted mean WMEAN.
+
+ -- Function: double gsl_stats_wskew (const double W[], size_t WSTRIDE,
+ const double DATA[], size_t STRIDE, size_t N)
+ This function computes the weighted skewness of the dataset DATA.
+
+ skew = (\sum w_i ((x_i - xbar)/\sigma)^3) / (\sum w_i)
+
+ -- Function: double gsl_stats_wskew_m_sd (const double W[], size_t
+ WSTRIDE, const double DATA[], size_t STRIDE, size_t N, double
+ WMEAN, double WSD)
+ This function computes the weighted skewness of the dataset DATA
+ using the given values of the weighted mean and weighted standard
+ deviation, WMEAN and WSD.
+
+ -- Function: double gsl_stats_wkurtosis (const double W[], size_t
+ WSTRIDE, const double DATA[], size_t STRIDE, size_t N)
+ This function computes the weighted kurtosis of the dataset DATA.
+
+ kurtosis = ((\sum w_i ((x_i - xbar)/sigma)^4) / (\sum w_i)) - 3
+
+ -- Function: double gsl_stats_wkurtosis_m_sd (const double W[], size_t
+ WSTRIDE, const double DATA[], size_t STRIDE, size_t N, double
+ WMEAN, double WSD)
+ This function computes the weighted kurtosis of the dataset DATA
+ using the given values of the weighted mean and weighted standard
+ deviation, WMEAN and WSD.
+
diff --git a/gsl-1.9/doc/gsl-ref.info-3 b/gsl-1.9/doc/gsl-ref.info-3
new file mode 100644
index 0000000..d30fefa
--- /dev/null
+++ b/gsl-1.9/doc/gsl-ref.info-3
@@ -0,0 +1,7520 @@
+This is gsl-ref.info, produced by makeinfo version 4.8 from
+gsl-ref.texi.
+
+INFO-DIR-SECTION Scientific software
+START-INFO-DIR-ENTRY
+* gsl-ref: (gsl-ref). GNU Scientific Library - Reference
+END-INFO-DIR-ENTRY
+
+ Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+2005, 2006, 2007 The GSL Team.
+
+ Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2 or
+any later version published by the Free Software Foundation; with the
+Invariant Sections being "GNU General Public License" and "Free Software
+Needs Free Documentation", the Front-Cover text being "A GNU Manual",
+and with the Back-Cover Text being (a) (see below). A copy of the
+license is included in the section entitled "GNU Free Documentation
+License".
+
+ (a) The Back-Cover Text is: "You have freedom to copy and modify this
+GNU Manual, like GNU software."
+
+
+File: gsl-ref.info, Node: Maximum and Minimum values, Next: Median and Percentiles, Prev: Weighted Samples, Up: Statistics
+
+20.7 Maximum and Minimum values
+===============================
+
+The following functions find the maximum and minimum values of a
+dataset (or their indices). If the data contains `NaN's then a `NaN'
+will be returned, since the maximum or minimum value is undefined. For
+functions which return an index, the location of the first `NaN' in the
+array is returned.
+
+ -- Function: double gsl_stats_max (const double DATA[], size_t STRIDE,
+ size_t N)
+ This function returns the maximum value in DATA, a dataset of
+ length N with stride STRIDE. The maximum value is defined as the
+ value of the element x_i which satisfies x_i >= x_j for all j.
+
+ If you want instead to find the element with the largest absolute
+ magnitude you will need to apply `fabs' or `abs' to your data
+ before calling this function.
+
+ -- Function: double gsl_stats_min (const double DATA[], size_t STRIDE,
+ size_t N)
+ This function returns the minimum value in DATA, a dataset of
+ length N with stride STRIDE. The minimum value is defined as the
+ value of the element x_i which satisfies x_i <= x_j for all j.
+
+ If you want instead to find the element with the smallest absolute
+ magnitude you will need to apply `fabs' or `abs' to your data
+ before calling this function.
+
+ -- Function: void gsl_stats_minmax (double * MIN, double * MAX, const
+ double DATA[], size_t STRIDE, size_t N)
+ This function finds both the minimum and maximum values MIN, MAX
+ in DATA in a single pass.
+
+ -- Function: size_t gsl_stats_max_index (const double DATA[], size_t
+ STRIDE, size_t N)
+ This function returns the index of the maximum value in DATA, a
+ dataset of length N with stride STRIDE. The maximum value is
+ defined as the value of the element x_i which satisfies x_i >= x_j
+ for all j. When there are several equal maximum elements then the
+ first one is chosen.
+
+ -- Function: size_t gsl_stats_min_index (const double DATA[], size_t
+ STRIDE, size_t N)
+ This function returns the index of the minimum value in DATA, a
+ dataset of length N with stride STRIDE. The minimum value is
+ defined as the value of the element x_i which satisfies x_i >= x_j
+ for all j. When there are several equal minimum elements then the
+ first one is chosen.
+
+ -- Function: void gsl_stats_minmax_index (size_t * MIN_INDEX, size_t *
+ MAX_INDEX, const double DATA[], size_t STRIDE, size_t N)
+ This function returns the indexes MIN_INDEX, MAX_INDEX of the
+ minimum and maximum values in DATA in a single pass.
+
+
+File: gsl-ref.info, Node: Median and Percentiles, Next: Example statistical programs, Prev: Maximum and Minimum values, Up: Statistics
+
+20.8 Median and Percentiles
+===========================
+
+The median and percentile functions described in this section operate on
+sorted data. For convenience we use "quantiles", measured on a scale
+of 0 to 1, instead of percentiles (which use a scale of 0 to 100).
+
+ -- Function: double gsl_stats_median_from_sorted_data (const double
+ SORTED_DATA[], size_t STRIDE, size_t N)
+ This function returns the median value of SORTED_DATA, a dataset
+ of length N with stride STRIDE. The elements of the array must be
+ in ascending numerical order. There are no checks to see whether
+ the data are sorted, so the function `gsl_sort' should always be
+ used first.
+
+ When the dataset has an odd number of elements the median is the
+ value of element (n-1)/2. When the dataset has an even number of
+ elements the median is the mean of the two nearest middle values,
+ elements (n-1)/2 and n/2. Since the algorithm for computing the
+ median involves interpolation this function always returns a
+ floating-point number, even for integer data types.
+
+ -- Function: double gsl_stats_quantile_from_sorted_data (const double
+ SORTED_DATA[], size_t STRIDE, size_t N, double F)
+ This function returns a quantile value of SORTED_DATA, a
+ double-precision array of length N with stride STRIDE. The
+ elements of the array must be in ascending numerical order. The
+ quantile is determined by the F, a fraction between 0 and 1. For
+ example, to compute the value of the 75th percentile F should have
+ the value 0.75.
+
+ There are no checks to see whether the data are sorted, so the
+ function `gsl_sort' should always be used first.
+
+ The quantile is found by interpolation, using the formula
+
+ quantile = (1 - \delta) x_i + \delta x_{i+1}
+
+ where i is `floor'((n - 1)f) and \delta is (n-1)f - i.
+
+ Thus the minimum value of the array (`data[0*stride]') is given by
+ F equal to zero, the maximum value (`data[(n-1)*stride]') is given
+ by F equal to one and the median value is given by F equal to 0.5.
+ Since the algorithm for computing quantiles involves
+ interpolation this function always returns a floating-point
+ number, even for integer data types.
+
+
+File: gsl-ref.info, Node: Example statistical programs, Next: Statistics References and Further Reading, Prev: Median and Percentiles, Up: Statistics
+
+20.9 Examples
+=============
+
+Here is a basic example of how to use the statistical functions:
+
+ #include <stdio.h>
+ #include <gsl/gsl_statistics.h>
+
+ int
+ main(void)
+ {
+ double data[5] = {17.2, 18.1, 16.5, 18.3, 12.6};
+ double mean, variance, largest, smallest;
+
+ mean = gsl_stats_mean(data, 1, 5);
+ variance = gsl_stats_variance(data, 1, 5);
+ largest = gsl_stats_max(data, 1, 5);
+ smallest = gsl_stats_min(data, 1, 5);
+
+ printf ("The dataset is %g, %g, %g, %g, %g\n",
+ data[0], data[1], data[2], data[3], data[4]);
+
+ printf ("The sample mean is %g\n", mean);
+ printf ("The estimated variance is %g\n", variance);
+ printf ("The largest value is %g\n", largest);
+ printf ("The smallest value is %g\n", smallest);
+ return 0;
+ }
+
+ The program should produce the following output,
+
+ The dataset is 17.2, 18.1, 16.5, 18.3, 12.6
+ The sample mean is 16.54
+ The estimated variance is 4.2984
+ The largest value is 18.3
+ The smallest value is 12.6
+
+ Here is an example using sorted data,
+
+ #include <stdio.h>
+ #include <gsl/gsl_sort.h>
+ #include <gsl/gsl_statistics.h>
+
+ int
+ main(void)
+ {
+ double data[5] = {17.2, 18.1, 16.5, 18.3, 12.6};
+ double median, upperq, lowerq;
+
+ printf ("Original dataset: %g, %g, %g, %g, %g\n",
+ data[0], data[1], data[2], data[3], data[4]);
+
+ gsl_sort (data, 1, 5);
+
+ printf ("Sorted dataset: %g, %g, %g, %g, %g\n",
+ data[0], data[1], data[2], data[3], data[4]);
+
+ median
+ = gsl_stats_median_from_sorted_data (data,
+ 1, 5);
+
+ upperq
+ = gsl_stats_quantile_from_sorted_data (data,
+ 1, 5,
+ 0.75);
+ lowerq
+ = gsl_stats_quantile_from_sorted_data (data,
+ 1, 5,
+ 0.25);
+
+ printf ("The median is %g\n", median);
+ printf ("The upper quartile is %g\n", upperq);
+ printf ("The lower quartile is %g\n", lowerq);
+ return 0;
+ }
+
+ This program should produce the following output,
+
+ Original dataset: 17.2, 18.1, 16.5, 18.3, 12.6
+ Sorted dataset: 12.6, 16.5, 17.2, 18.1, 18.3
+ The median is 17.2
+ The upper quartile is 18.1
+ The lower quartile is 16.5
+
+
+File: gsl-ref.info, Node: Statistics References and Further Reading, Prev: Example statistical programs, Up: Statistics
+
+20.10 References and Further Reading
+====================================
+
+The standard reference for almost any topic in statistics is the
+multi-volume `Advanced Theory of Statistics' by Kendall and Stuart.
+
+ Maurice Kendall, Alan Stuart, and J. Keith Ord. `The Advanced
+ Theory of Statistics' (multiple volumes) reprinted as `Kendall's
+ Advanced Theory of Statistics'. Wiley, ISBN 047023380X.
+
+Many statistical concepts can be more easily understood by a Bayesian
+approach. The following book by Gelman, Carlin, Stern and Rubin gives a
+comprehensive coverage of the subject.
+
+ Andrew Gelman, John B. Carlin, Hal S. Stern, Donald B. Rubin.
+ `Bayesian Data Analysis'. Chapman & Hall, ISBN 0412039915.
+
+For physicists the Particle Data Group provides useful reviews of
+Probability and Statistics in the "Mathematical Tools" section of its
+Annual Review of Particle Physics.
+
+ `Review of Particle Properties' R.M. Barnett et al., Physical
+ Review D54, 1 (1996)
+
+The Review of Particle Physics is available online at the website
+`http://pdg.lbl.gov/'.
+
+
+File: gsl-ref.info, Node: Histograms, Next: N-tuples, Prev: Statistics, Up: Top
+
+21 Histograms
+*************
+
+This chapter describes functions for creating histograms. Histograms
+provide a convenient way of summarizing the distribution of a set of
+data. A histogram consists of a set of "bins" which count the number of
+events falling into a given range of a continuous variable x. In GSL
+the bins of a histogram contain floating-point numbers, so they can be
+used to record both integer and non-integer distributions. The bins
+can use arbitrary sets of ranges (uniformly spaced bins are the
+default). Both one and two-dimensional histograms are supported.
+
+ Once a histogram has been created it can also be converted into a
+probability distribution function. The library provides efficient
+routines for selecting random samples from probability distributions.
+This can be useful for generating simulations based on real data.
+
+ The functions are declared in the header files `gsl_histogram.h' and
+`gsl_histogram2d.h'.
+
+* Menu:
+
+* The histogram struct::
+* Histogram allocation::
+* Copying Histograms::
+* Updating and accessing histogram elements::
+* Searching histogram ranges::
+* Histogram Statistics::
+* Histogram Operations::
+* Reading and writing histograms::
+* Resampling from histograms::
+* The histogram probability distribution struct::
+* Example programs for histograms::
+* Two dimensional histograms::
+* The 2D histogram struct::
+* 2D Histogram allocation::
+* Copying 2D Histograms::
+* Updating and accessing 2D histogram elements::
+* Searching 2D histogram ranges::
+* 2D Histogram Statistics::
+* 2D Histogram Operations::
+* Reading and writing 2D histograms::
+* Resampling from 2D histograms::
+* Example programs for 2D histograms::
+
+
+File: gsl-ref.info, Node: The histogram struct, Next: Histogram allocation, Up: Histograms
+
+21.1 The histogram struct
+=========================
+
+A histogram is defined by the following struct,
+
+ -- Data Type: gsl_histogram
+ `size_t n'
+ This is the number of histogram bins
+
+ `double * range'
+ The ranges of the bins are stored in an array of N+1 elements
+ pointed to by RANGE.
+
+ `double * bin'
+ The counts for each bin are stored in an array of N elements
+ pointed to by BIN. The bins are floating-point numbers, so
+ you can increment them by non-integer values if necessary.
+
+The range for BIN[i] is given by RANGE[i] to RANGE[i+1]. For n bins
+there are n+1 entries in the array RANGE. Each bin is inclusive at the
+lower end and exclusive at the upper end. Mathematically this means
+that the bins are defined by the following inequality,
+ bin[i] corresponds to range[i] <= x < range[i+1]
+
+Here is a diagram of the correspondence between ranges and bins on the
+number-line for x,
+
+
+ [ bin[0] )[ bin[1] )[ bin[2] )[ bin[3] )[ bin[4] )
+ ---|---------|---------|---------|---------|---------|--- x
+ r[0] r[1] r[2] r[3] r[4] r[5]
+
+In this picture the values of the RANGE array are denoted by r. On the
+left-hand side of each bin the square bracket `[' denotes an inclusive
+lower bound (r <= x), and the round parentheses `)' on the right-hand
+side denote an exclusive upper bound (x < r). Thus any samples which
+fall on the upper end of the histogram are excluded. If you want to
+include this value for the last bin you will need to add an extra bin
+to your histogram.
+
+ The `gsl_histogram' struct and its associated functions are defined
+in the header file `gsl_histogram.h'.
+
+
+File: gsl-ref.info, Node: Histogram allocation, Next: Copying Histograms, Prev: The histogram struct, Up: Histograms
+
+21.2 Histogram allocation
+=========================
+
+The functions for allocating memory to a histogram follow the style of
+`malloc' and `free'. In addition they also perform their own error
+checking. If there is insufficient memory available to allocate a
+histogram then the functions call the error handler (with an error
+number of `GSL_ENOMEM') in addition to returning a null pointer. Thus
+if you use the library error handler to abort your program then it
+isn't necessary to check every histogram `alloc'.
+
+ -- Function: gsl_histogram * gsl_histogram_alloc (size_t N)
+ This function allocates memory for a histogram with N bins, and
+ returns a pointer to a newly created `gsl_histogram' struct. If
+ insufficient memory is available a null pointer is returned and the
+ error handler is invoked with an error code of `GSL_ENOMEM'. The
+ bins and ranges are not initialized, and should be prepared using
+ one of the range-setting functions below in order to make the
+ histogram ready for use.
+
+ -- Function: int gsl_histogram_set_ranges (gsl_histogram * H, const
+ double RANGE[], size_t SIZE)
+ This function sets the ranges of the existing histogram H using
+ the array RANGE of size SIZE. The values of the histogram bins
+ are reset to zero. The `range' array should contain the desired
+ bin limits. The ranges can be arbitrary, subject to the
+ restriction that they are monotonically increasing.
+
+ The following example shows how to create a histogram with
+ logarithmic bins with ranges [1,10), [10,100) and [100,1000).
+
+ gsl_histogram * h = gsl_histogram_alloc (3);
+
+ /* bin[0] covers the range 1 <= x < 10 */
+ /* bin[1] covers the range 10 <= x < 100 */
+ /* bin[2] covers the range 100 <= x < 1000 */
+
+ double range[4] = { 1.0, 10.0, 100.0, 1000.0 };
+
+ gsl_histogram_set_ranges (h, range, 4);
+
+ Note that the size of the RANGE array should be defined to be one
+ element bigger than the number of bins. The additional element is
+ required for the upper value of the final bin.
+
+ -- Function: int gsl_histogram_set_ranges_uniform (gsl_histogram * H,
+ double XMIN, double XMAX)
+ This function sets the ranges of the existing histogram H to cover
+ the range XMIN to XMAX uniformly. The values of the histogram
+ bins are reset to zero. The bin ranges are shown in the table
+ below,
+ bin[0] corresponds to xmin <= x < xmin + d
+ bin[1] corresponds to xmin + d <= x < xmin + 2 d
+ ......
+ bin[n-1] corresponds to xmin + (n-1)d <= x < xmax
+
+ where d is the bin spacing, d = (xmax-xmin)/n.
+
+ -- Function: void gsl_histogram_free (gsl_histogram * H)
+ This function frees the histogram H and all of the memory
+ associated with it.
+
+
+File: gsl-ref.info, Node: Copying Histograms, Next: Updating and accessing histogram elements, Prev: Histogram allocation, Up: Histograms
+
+21.3 Copying Histograms
+=======================
+
+ -- Function: int gsl_histogram_memcpy (gsl_histogram * DEST, const
+ gsl_histogram * SRC)
+ This function copies the histogram SRC into the pre-existing
+ histogram DEST, making DEST into an exact copy of SRC. The two
+ histograms must be of the same size.
+
+ -- Function: gsl_histogram * gsl_histogram_clone (const gsl_histogram
+ * SRC)
+ This function returns a pointer to a newly created histogram which
+ is an exact copy of the histogram SRC.
+
+
+File: gsl-ref.info, Node: Updating and accessing histogram elements, Next: Searching histogram ranges, Prev: Copying Histograms, Up: Histograms
+
+21.4 Updating and accessing histogram elements
+==============================================
+
+There are two ways to access histogram bins, either by specifying an x
+coordinate or by using the bin-index directly. The functions for
+accessing the histogram through x coordinates use a binary search to
+identify the bin which covers the appropriate range.
+
+ -- Function: int gsl_histogram_increment (gsl_histogram * H, double X)
+ This function updates the histogram H by adding one (1.0) to the
+ bin whose range contains the coordinate X.
+
+ If X lies in the valid range of the histogram then the function
+ returns zero to indicate success. If X is less than the lower
+ limit of the histogram then the function returns `GSL_EDOM', and
+ none of bins are modified. Similarly, if the value of X is greater
+ than or equal to the upper limit of the histogram then the function
+ returns `GSL_EDOM', and none of the bins are modified. The error
+ handler is not called, however, since it is often necessary to
+ compute histograms for a small range of a larger dataset, ignoring
+ the values outside the range of interest.
+
+ -- Function: int gsl_histogram_accumulate (gsl_histogram * H, double
+ X, double WEIGHT)
+ This function is similar to `gsl_histogram_increment' but increases
+ the value of the appropriate bin in the histogram H by the
+ floating-point number WEIGHT.
+
+ -- Function: double gsl_histogram_get (const gsl_histogram * H, size_t
+ I)
+ This function returns the contents of the I-th bin of the histogram
+ H. If I lies outside the valid range of indices for the histogram
+ then the error handler is called with an error code of `GSL_EDOM'
+ and the function returns 0.
+
+ -- Function: int gsl_histogram_get_range (const gsl_histogram * H,
+ size_t I, double * LOWER, double * UPPER)
+ This function finds the upper and lower range limits of the I-th
+ bin of the histogram H. If the index I is valid then the
+ corresponding range limits are stored in LOWER and UPPER. The
+ lower limit is inclusive (i.e. events with this coordinate are
+ included in the bin) and the upper limit is exclusive (i.e. events
+ with the coordinate of the upper limit are excluded and fall in the
+ neighboring higher bin, if it exists). The function returns 0 to
+ indicate success. If I lies outside the valid range of indices for
+ the histogram then the error handler is called and the function
+ returns an error code of `GSL_EDOM'.
+
+ -- Function: double gsl_histogram_max (const gsl_histogram * H)
+ -- Function: double gsl_histogram_min (const gsl_histogram * H)
+ -- Function: size_t gsl_histogram_bins (const gsl_histogram * H)
+ These functions return the maximum upper and minimum lower range
+ limits and the number of bins of the histogram H. They provide a
+ way of determining these values without accessing the
+ `gsl_histogram' struct directly.
+
+ -- Function: void gsl_histogram_reset (gsl_histogram * H)
+ This function resets all the bins in the histogram H to zero.
+
+
+File: gsl-ref.info, Node: Searching histogram ranges, Next: Histogram Statistics, Prev: Updating and accessing histogram elements, Up: Histograms
+
+21.5 Searching histogram ranges
+===============================
+
+The following functions are used by the access and update routines to
+locate the bin which corresponds to a given x coordinate.
+
+ -- Function: int gsl_histogram_find (const gsl_histogram * H, double
+ X, size_t * I)
+ This function finds and sets the index I to the bin number which
+ covers the coordinate X in the histogram H. The bin is located
+ using a binary search. The search includes an optimization for
+ histograms with uniform range, and will return the correct bin
+ immediately in this case. If X is found in the range of the
+ histogram then the function sets the index I and returns
+ `GSL_SUCCESS'. If X lies outside the valid range of the histogram
+ then the function returns `GSL_EDOM' and the error handler is
+ invoked.
+
+
+File: gsl-ref.info, Node: Histogram Statistics, Next: Histogram Operations, Prev: Searching histogram ranges, Up: Histograms
+
+21.6 Histogram Statistics
+=========================
+
+ -- Function: double gsl_histogram_max_val (const gsl_histogram * H)
+ This function returns the maximum value contained in the histogram
+ bins.
+
+ -- Function: size_t gsl_histogram_max_bin (const gsl_histogram * H)
+ This function returns the index of the bin containing the maximum
+ value. In the case where several bins contain the same maximum
+ value the smallest index is returned.
+
+ -- Function: double gsl_histogram_min_val (const gsl_histogram * H)
+ This function returns the minimum value contained in the histogram
+ bins.
+
+ -- Function: size_t gsl_histogram_min_bin (const gsl_histogram * H)
+ This function returns the index of the bin containing the minimum
+ value. In the case where several bins contain the same maximum
+ value the smallest index is returned.
+
+ -- Function: double gsl_histogram_mean (const gsl_histogram * H)
+ This function returns the mean of the histogrammed variable, where
+ the histogram is regarded as a probability distribution. Negative
+ bin values are ignored for the purposes of this calculation. The
+ accuracy of the result is limited by the bin width.
+
+ -- Function: double gsl_histogram_sigma (const gsl_histogram * H)
+ This function returns the standard deviation of the histogrammed
+ variable, where the histogram is regarded as a probability
+ distribution. Negative bin values are ignored for the purposes of
+ this calculation. The accuracy of the result is limited by the bin
+ width.
+
+ -- Function: double gsl_histogram_sum (const gsl_histogram * H)
+ This function returns the sum of all bin values. Negative bin
+ values are included in the sum.
+
+
+File: gsl-ref.info, Node: Histogram Operations, Next: Reading and writing histograms, Prev: Histogram Statistics, Up: Histograms
+
+21.7 Histogram Operations
+=========================
+
+ -- Function: int gsl_histogram_equal_bins_p (const gsl_histogram * H1,
+ const gsl_histogram * H2)
+ This function returns 1 if the all of the individual bin ranges of
+ the two histograms are identical, and 0 otherwise.
+
+ -- Function: int gsl_histogram_add (gsl_histogram * H1, const
+ gsl_histogram * H2)
+ This function adds the contents of the bins in histogram H2 to the
+ corresponding bins of histogram H1, i.e. h'_1(i) = h_1(i) +
+ h_2(i). The two histograms must have identical bin ranges.
+
+ -- Function: int gsl_histogram_sub (gsl_histogram * H1, const
+ gsl_histogram * H2)
+ This function subtracts the contents of the bins in histogram H2
+ from the corresponding bins of histogram H1, i.e. h'_1(i) = h_1(i)
+ - h_2(i). The two histograms must have identical bin ranges.
+
+ -- Function: int gsl_histogram_mul (gsl_histogram * H1, const
+ gsl_histogram * H2)
+ This function multiplies the contents of the bins of histogram H1
+ by the contents of the corresponding bins in histogram H2, i.e.
+ h'_1(i) = h_1(i) * h_2(i). The two histograms must have identical
+ bin ranges.
+
+ -- Function: int gsl_histogram_div (gsl_histogram * H1, const
+ gsl_histogram * H2)
+ This function divides the contents of the bins of histogram H1 by
+ the contents of the corresponding bins in histogram H2, i.e.
+ h'_1(i) = h_1(i) / h_2(i). The two histograms must have identical
+ bin ranges.
+
+ -- Function: int gsl_histogram_scale (gsl_histogram * H, double SCALE)
+ This function multiplies the contents of the bins of histogram H
+ by the constant SCALE, i.e. h'_1(i) = h_1(i) * scale.
+
+ -- Function: int gsl_histogram_shift (gsl_histogram * H, double OFFSET)
+ This function shifts the contents of the bins of histogram H by
+ the constant OFFSET, i.e. h'_1(i) = h_1(i) + offset.
+
+
+File: gsl-ref.info, Node: Reading and writing histograms, Next: Resampling from histograms, Prev: Histogram Operations, Up: Histograms
+
+21.8 Reading and writing histograms
+===================================
+
+The library provides functions for reading and writing histograms to a
+file as binary data or formatted text.
+
+ -- Function: int gsl_histogram_fwrite (FILE * STREAM, const
+ gsl_histogram * H)
+ This function writes the ranges and bins of the histogram H to the
+ stream STREAM in binary format. The return value is 0 for success
+ and `GSL_EFAILED' if there was a problem writing to the file.
+ Since the data is written in the native binary format it may not
+ be portable between different architectures.
+
+ -- Function: int gsl_histogram_fread (FILE * STREAM, gsl_histogram * H)
+ This function reads into the histogram H from the open stream
+ STREAM in binary format. The histogram H must be preallocated
+ with the correct size since the function uses the number of bins
+ in H to determine how many bytes to read. The return value is 0
+ for success and `GSL_EFAILED' if there was a problem reading from
+ the file. The data is assumed to have been written in the native
+ binary format on the same architecture.
+
+ -- Function: int gsl_histogram_fprintf (FILE * STREAM, const
+ gsl_histogram * H, const char * RANGE_FORMAT, const char *
+ BIN_FORMAT)
+ This function writes the ranges and bins of the histogram H
+ line-by-line to the stream STREAM using the format specifiers
+ RANGE_FORMAT and BIN_FORMAT. These should be one of the `%g',
+ `%e' or `%f' formats for floating point numbers. The function
+ returns 0 for success and `GSL_EFAILED' if there was a problem
+ writing to the file. The histogram output is formatted in three
+ columns, and the columns are separated by spaces, like this,
+
+ range[0] range[1] bin[0]
+ range[1] range[2] bin[1]
+ range[2] range[3] bin[2]
+ ....
+ range[n-1] range[n] bin[n-1]
+
+ The values of the ranges are formatted using RANGE_FORMAT and the
+ value of the bins are formatted using BIN_FORMAT. Each line
+ contains the lower and upper limit of the range of the bins and the
+ value of the bin itself. Since the upper limit of one bin is the
+ lower limit of the next there is duplication of these values
+ between lines but this allows the histogram to be manipulated with
+ line-oriented tools.
+
+ -- Function: int gsl_histogram_fscanf (FILE * STREAM, gsl_histogram *
+ H)
+ This function reads formatted data from the stream STREAM into the
+ histogram H. The data is assumed to be in the three-column format
+ used by `gsl_histogram_fprintf'. The histogram H must be
+ preallocated with the correct length since the function uses the
+ size of H to determine how many numbers to read. The function
+ returns 0 for success and `GSL_EFAILED' if there was a problem
+ reading from the file.
+
+
+File: gsl-ref.info, Node: Resampling from histograms, Next: The histogram probability distribution struct, Prev: Reading and writing histograms, Up: Histograms
+
+21.9 Resampling from histograms
+===============================
+
+A histogram made by counting events can be regarded as a measurement of
+a probability distribution. Allowing for statistical error, the height
+of each bin represents the probability of an event where the value of x
+falls in the range of that bin. The probability distribution function
+has the one-dimensional form p(x)dx where,
+
+ p(x) = n_i/ (N w_i)
+
+In this equation n_i is the number of events in the bin which contains
+x, w_i is the width of the bin and N is the total number of events.
+The distribution of events within each bin is assumed to be uniform.
+
+
+File: gsl-ref.info, Node: The histogram probability distribution struct, Next: Example programs for histograms, Prev: Resampling from histograms, Up: Histograms
+
+21.10 The histogram probability distribution struct
+===================================================
+
+The probability distribution function for a histogram consists of a set
+of "bins" which measure the probability of an event falling into a
+given range of a continuous variable x. A probability distribution
+function is defined by the following struct, which actually stores the
+cumulative probability distribution function. This is the natural
+quantity for generating samples via the inverse transform method,
+because there is a one-to-one mapping between the cumulative
+probability distribution and the range [0,1]. It can be shown that by
+taking a uniform random number in this range and finding its
+corresponding coordinate in the cumulative probability distribution we
+obtain samples with the desired probability distribution.
+
+ -- Data Type: gsl_histogram_pdf
+ `size_t n'
+ This is the number of bins used to approximate the probability
+ distribution function.
+
+ `double * range'
+ The ranges of the bins are stored in an array of N+1 elements
+ pointed to by RANGE.
+
+ `double * sum'
+ The cumulative probability for the bins is stored in an array
+ of N elements pointed to by SUM.
+
+The following functions allow you to create a `gsl_histogram_pdf'
+struct which represents this probability distribution and generate
+random samples from it.
+
+ -- Function: gsl_histogram_pdf * gsl_histogram_pdf_alloc (size_t N)
+ This function allocates memory for a probability distribution with
+ N bins and returns a pointer to a newly initialized
+ `gsl_histogram_pdf' struct. If insufficient memory is available a
+ null pointer is returned and the error handler is invoked with an
+ error code of `GSL_ENOMEM'.
+
+ -- Function: int gsl_histogram_pdf_init (gsl_histogram_pdf * P, const
+ gsl_histogram * H)
+ This function initializes the probability distribution P with the
+ contents of the histogram H. If any of the bins of H are negative
+ then the error handler is invoked with an error code of `GSL_EDOM'
+ because a probability distribution cannot contain negative values.
+
+ -- Function: void gsl_histogram_pdf_free (gsl_histogram_pdf * P)
+ This function frees the probability distribution function P and
+ all of the memory associated with it.
+
+ -- Function: double gsl_histogram_pdf_sample (const gsl_histogram_pdf
+ * P, double R)
+ This function uses R, a uniform random number between zero and
+ one, to compute a single random sample from the probability
+ distribution P. The algorithm used to compute the sample s is
+ given by the following formula,
+
+ s = range[i] + delta * (range[i+1] - range[i])
+
+ where i is the index which satisfies sum[i] <= r < sum[i+1] and
+ delta is (r - sum[i])/(sum[i+1] - sum[i]).
+
+
+File: gsl-ref.info, Node: Example programs for histograms, Next: Two dimensional histograms, Prev: The histogram probability distribution struct, Up: Histograms
+
+21.11 Example programs for histograms
+=====================================
+
+The following program shows how to make a simple histogram of a column
+of numerical data supplied on `stdin'. The program takes three
+arguments, specifying the upper and lower bounds of the histogram and
+the number of bins. It then reads numbers from `stdin', one line at a
+time, and adds them to the histogram. When there is no more data to
+read it prints out the accumulated histogram using
+`gsl_histogram_fprintf'.
+
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <gsl/gsl_histogram.h>
+
+ int
+ main (int argc, char **argv)
+ {
+ double a, b;
+ size_t n;
+
+ if (argc != 4)
+ {
+ printf ("Usage: gsl-histogram xmin xmax n\n"
+ "Computes a histogram of the data "
+ "on stdin using n bins from xmin "
+ "to xmax\n");
+ exit (0);
+ }
+
+ a = atof (argv[1]);
+ b = atof (argv[2]);
+ n = atoi (argv[3]);
+
+ {
+ double x;
+ gsl_histogram * h = gsl_histogram_alloc (n);
+ gsl_histogram_set_ranges_uniform (h, a, b);
+
+ while (fscanf (stdin, "%lg", &x) == 1)
+ {
+ gsl_histogram_increment (h, x);
+ }
+ gsl_histogram_fprintf (stdout, h, "%g", "%g");
+ gsl_histogram_free (h);
+ }
+ exit (0);
+ }
+
+Here is an example of the program in use. We generate 10000 random
+samples from a Cauchy distribution with a width of 30 and histogram
+them over the range -100 to 100, using 200 bins.
+
+ $ gsl-randist 0 10000 cauchy 30
+ | gsl-histogram -100 100 200 > histogram.dat
+
+A plot of the resulting histogram shows the familiar shape of the
+Cauchy distribution and the fluctuations caused by the finite sample
+size.
+
+ $ awk '{print $1, $3 ; print $2, $3}' histogram.dat
+ | graph -T X
+
+
+File: gsl-ref.info, Node: Two dimensional histograms, Next: The 2D histogram struct, Prev: Example programs for histograms, Up: Histograms
+
+21.12 Two dimensional histograms
+================================
+
+A two dimensional histogram consists of a set of "bins" which count the
+number of events falling in a given area of the (x,y) plane. The
+simplest way to use a two dimensional histogram is to record
+two-dimensional position information, n(x,y). Another possibility is
+to form a "joint distribution" by recording related variables. For
+example a detector might record both the position of an event (x) and
+the amount of energy it deposited E. These could be histogrammed as
+the joint distribution n(x,E).
+
+
+File: gsl-ref.info, Node: The 2D histogram struct, Next: 2D Histogram allocation, Prev: Two dimensional histograms, Up: Histograms
+
+21.13 The 2D histogram struct
+=============================
+
+Two dimensional histograms are defined by the following struct,
+
+ -- Data Type: gsl_histogram2d
+ `size_t nx, ny'
+ This is the number of histogram bins in the x and y
+ directions.
+
+ `double * xrange'
+ The ranges of the bins in the x-direction are stored in an
+ array of NX + 1 elements pointed to by XRANGE.
+
+ `double * yrange'
+ The ranges of the bins in the y-direction are stored in an
+ array of NY + 1 elements pointed to by YRANGE.
+
+ `double * bin'
+ The counts for each bin are stored in an array pointed to by
+ BIN. The bins are floating-point numbers, so you can
+ increment them by non-integer values if necessary. The array
+ BIN stores the two dimensional array of bins in a single
+ block of memory according to the mapping `bin(i,j)' = `bin[i
+ * ny + j]'.
+
+The range for `bin(i,j)' is given by `xrange[i]' to `xrange[i+1]' in
+the x-direction and `yrange[j]' to `yrange[j+1]' in the y-direction.
+Each bin is inclusive at the lower end and exclusive at the upper end.
+Mathematically this means that the bins are defined by the following
+inequality,
+ bin(i,j) corresponds to xrange[i] <= x < xrange[i+1]
+ and yrange[j] <= y < yrange[j+1]
+
+Note that any samples which fall on the upper sides of the histogram are
+excluded. If you want to include these values for the side bins you
+will need to add an extra row or column to your histogram.
+
+ The `gsl_histogram2d' struct and its associated functions are
+defined in the header file `gsl_histogram2d.h'.
+
+
+File: gsl-ref.info, Node: 2D Histogram allocation, Next: Copying 2D Histograms, Prev: The 2D histogram struct, Up: Histograms
+
+21.14 2D Histogram allocation
+=============================
+
+The functions for allocating memory to a 2D histogram follow the style
+of `malloc' and `free'. In addition they also perform their own error
+checking. If there is insufficient memory available to allocate a
+histogram then the functions call the error handler (with an error
+number of `GSL_ENOMEM') in addition to returning a null pointer. Thus
+if you use the library error handler to abort your program then it
+isn't necessary to check every 2D histogram `alloc'.
+
+ -- Function: gsl_histogram2d * gsl_histogram2d_alloc (size_t NX,
+ size_t NY)
+ This function allocates memory for a two-dimensional histogram with
+ NX bins in the x direction and NY bins in the y direction. The
+ function returns a pointer to a newly created `gsl_histogram2d'
+ struct. If insufficient memory is available a null pointer is
+ returned and the error handler is invoked with an error code of
+ `GSL_ENOMEM'. The bins and ranges must be initialized with one of
+ the functions below before the histogram is ready for use.
+
+ -- Function: int gsl_histogram2d_set_ranges (gsl_histogram2d * H,
+ const double XRANGE[], size_t XSIZE, const double YRANGE[],
+ size_t YSIZE)
+ This function sets the ranges of the existing histogram H using
+ the arrays XRANGE and YRANGE of size XSIZE and YSIZE respectively.
+ The values of the histogram bins are reset to zero.
+
+ -- Function: int gsl_histogram2d_set_ranges_uniform (gsl_histogram2d *
+ H, double XMIN, double XMAX, double YMIN, double YMAX)
+ This function sets the ranges of the existing histogram H to cover
+ the ranges XMIN to XMAX and YMIN to YMAX uniformly. The values of
+ the histogram bins are reset to zero.
+
+ -- Function: void gsl_histogram2d_free (gsl_histogram2d * H)
+ This function frees the 2D histogram H and all of the memory
+ associated with it.
+
+
+File: gsl-ref.info, Node: Copying 2D Histograms, Next: Updating and accessing 2D histogram elements, Prev: 2D Histogram allocation, Up: Histograms
+
+21.15 Copying 2D Histograms
+===========================
+
+ -- Function: int gsl_histogram2d_memcpy (gsl_histogram2d * DEST, const
+ gsl_histogram2d * SRC)
+ This function copies the histogram SRC into the pre-existing
+ histogram DEST, making DEST into an exact copy of SRC. The two
+ histograms must be of the same size.
+
+ -- Function: gsl_histogram2d * gsl_histogram2d_clone (const
+ gsl_histogram2d * SRC)
+ This function returns a pointer to a newly created histogram which
+ is an exact copy of the histogram SRC.
+
+
+File: gsl-ref.info, Node: Updating and accessing 2D histogram elements, Next: Searching 2D histogram ranges, Prev: Copying 2D Histograms, Up: Histograms
+
+21.16 Updating and accessing 2D histogram elements
+==================================================
+
+You can access the bins of a two-dimensional histogram either by
+specifying a pair of (x,y) coordinates or by using the bin indices
+(i,j) directly. The functions for accessing the histogram through
+(x,y) coordinates use binary searches in the x and y directions to
+identify the bin which covers the appropriate range.
+
+ -- Function: int gsl_histogram2d_increment (gsl_histogram2d * H,
+ double X, double Y)
+ This function updates the histogram H by adding one (1.0) to the
+ bin whose x and y ranges contain the coordinates (X,Y).
+
+ If the point (x,y) lies inside the valid ranges of the histogram
+ then the function returns zero to indicate success. If (x,y) lies
+ outside the limits of the histogram then the function returns
+ `GSL_EDOM', and none of the bins are modified. The error handler
+ is not called, since it is often necessary to compute histograms
+ for a small range of a larger dataset, ignoring any coordinates
+ outside the range of interest.
+
+ -- Function: int gsl_histogram2d_accumulate (gsl_histogram2d * H,
+ double X, double Y, double WEIGHT)
+ This function is similar to `gsl_histogram2d_increment' but
+ increases the value of the appropriate bin in the histogram H by
+ the floating-point number WEIGHT.
+
+ -- Function: double gsl_histogram2d_get (const gsl_histogram2d * H,
+ size_t I, size_t J)
+ This function returns the contents of the (I,J)-th bin of the
+ histogram H. If (I,J) lies outside the valid range of indices for
+ the histogram then the error handler is called with an error code
+ of `GSL_EDOM' and the function returns 0.
+
+ -- Function: int gsl_histogram2d_get_xrange (const gsl_histogram2d *
+ H, size_t I, double * XLOWER, double * XUPPER)
+ -- Function: int gsl_histogram2d_get_yrange (const gsl_histogram2d *
+ H, size_t J, double * YLOWER, double * YUPPER)
+ These functions find the upper and lower range limits of the I-th
+ and J-th bins in the x and y directions of the histogram H. The
+ range limits are stored in XLOWER and XUPPER or YLOWER and YUPPER.
+ The lower limits are inclusive (i.e. events with these
+ coordinates are included in the bin) and the upper limits are
+ exclusive (i.e. events with the value of the upper limit are not
+ included and fall in the neighboring higher bin, if it exists).
+ The functions return 0 to indicate success. If I or J lies
+ outside the valid range of indices for the histogram then the
+ error handler is called with an error code of `GSL_EDOM'.
+
+ -- Function: double gsl_histogram2d_xmax (const gsl_histogram2d * H)
+ -- Function: double gsl_histogram2d_xmin (const gsl_histogram2d * H)
+ -- Function: size_t gsl_histogram2d_nx (const gsl_histogram2d * H)
+ -- Function: double gsl_histogram2d_ymax (const gsl_histogram2d * H)
+ -- Function: double gsl_histogram2d_ymin (const gsl_histogram2d * H)
+ -- Function: size_t gsl_histogram2d_ny (const gsl_histogram2d * H)
+ These functions return the maximum upper and minimum lower range
+ limits and the number of bins for the x and y directions of the
+ histogram H. They provide a way of determining these values
+ without accessing the `gsl_histogram2d' struct directly.
+
+ -- Function: void gsl_histogram2d_reset (gsl_histogram2d * H)
+ This function resets all the bins of the histogram H to zero.
+
+
+File: gsl-ref.info, Node: Searching 2D histogram ranges, Next: 2D Histogram Statistics, Prev: Updating and accessing 2D histogram elements, Up: Histograms
+
+21.17 Searching 2D histogram ranges
+===================================
+
+The following functions are used by the access and update routines to
+locate the bin which corresponds to a given (x,y) coordinate.
+
+ -- Function: int gsl_histogram2d_find (const gsl_histogram2d * H,
+ double X, double Y, size_t * I, size_t * J)
+ This function finds and sets the indices I and J to the to the bin
+ which covers the coordinates (X,Y). The bin is located using a
+ binary search. The search includes an optimization for histograms
+ with uniform ranges, and will return the correct bin immediately
+ in this case. If (x,y) is found then the function sets the indices
+ (I,J) and returns `GSL_SUCCESS'. If (x,y) lies outside the valid
+ range of the histogram then the function returns `GSL_EDOM' and
+ the error handler is invoked.
+
+
+File: gsl-ref.info, Node: 2D Histogram Statistics, Next: 2D Histogram Operations, Prev: Searching 2D histogram ranges, Up: Histograms
+
+21.18 2D Histogram Statistics
+=============================
+
+ -- Function: double gsl_histogram2d_max_val (const gsl_histogram2d * H)
+ This function returns the maximum value contained in the histogram
+ bins.
+
+ -- Function: void gsl_histogram2d_max_bin (const gsl_histogram2d * H,
+ size_t * I, size_t * J)
+ This function finds the indices of the bin containing the maximum
+ value in the histogram H and stores the result in (I,J). In the
+ case where several bins contain the same maximum value the first
+ bin found is returned.
+
+ -- Function: double gsl_histogram2d_min_val (const gsl_histogram2d * H)
+ This function returns the minimum value contained in the histogram
+ bins.
+
+ -- Function: void gsl_histogram2d_min_bin (const gsl_histogram2d * H,
+ size_t * I, size_t * J)
+ This function finds the indices of the bin containing the minimum
+ value in the histogram H and stores the result in (I,J). In the
+ case where several bins contain the same maximum value the first
+ bin found is returned.
+
+ -- Function: double gsl_histogram2d_xmean (const gsl_histogram2d * H)
+ This function returns the mean of the histogrammed x variable,
+ where the histogram is regarded as a probability distribution.
+ Negative bin values are ignored for the purposes of this
+ calculation.
+
+ -- Function: double gsl_histogram2d_ymean (const gsl_histogram2d * H)
+ This function returns the mean of the histogrammed y variable,
+ where the histogram is regarded as a probability distribution.
+ Negative bin values are ignored for the purposes of this
+ calculation.
+
+ -- Function: double gsl_histogram2d_xsigma (const gsl_histogram2d * H)
+ This function returns the standard deviation of the histogrammed x
+ variable, where the histogram is regarded as a probability
+ distribution. Negative bin values are ignored for the purposes of
+ this calculation.
+
+ -- Function: double gsl_histogram2d_ysigma (const gsl_histogram2d * H)
+ This function returns the standard deviation of the histogrammed y
+ variable, where the histogram is regarded as a probability
+ distribution. Negative bin values are ignored for the purposes of
+ this calculation.
+
+ -- Function: double gsl_histogram2d_cov (const gsl_histogram2d * H)
+ This function returns the covariance of the histogrammed x and y
+ variables, where the histogram is regarded as a probability
+ distribution. Negative bin values are ignored for the purposes of
+ this calculation.
+
+ -- Function: double gsl_histogram2d_sum (const gsl_histogram2d * H)
+ This function returns the sum of all bin values. Negative bin
+ values are included in the sum.
+
+
+File: gsl-ref.info, Node: 2D Histogram Operations, Next: Reading and writing 2D histograms, Prev: 2D Histogram Statistics, Up: Histograms
+
+21.19 2D Histogram Operations
+=============================
+
+ -- Function: int gsl_histogram2d_equal_bins_p (const gsl_histogram2d *
+ H1, const gsl_histogram2d * H2)
+ This function returns 1 if all the individual bin ranges of the two
+ histograms are identical, and 0 otherwise.
+
+ -- Function: int gsl_histogram2d_add (gsl_histogram2d * H1, const
+ gsl_histogram2d * H2)
+ This function adds the contents of the bins in histogram H2 to the
+ corresponding bins of histogram H1, i.e. h'_1(i,j) = h_1(i,j) +
+ h_2(i,j). The two histograms must have identical bin ranges.
+
+ -- Function: int gsl_histogram2d_sub (gsl_histogram2d * H1, const
+ gsl_histogram2d * H2)
+ This function subtracts the contents of the bins in histogram H2
+ from the corresponding bins of histogram H1, i.e. h'_1(i,j) =
+ h_1(i,j) - h_2(i,j). The two histograms must have identical bin
+ ranges.
+
+ -- Function: int gsl_histogram2d_mul (gsl_histogram2d * H1, const
+ gsl_histogram2d * H2)
+ This function multiplies the contents of the bins of histogram H1
+ by the contents of the corresponding bins in histogram H2, i.e.
+ h'_1(i,j) = h_1(i,j) * h_2(i,j). The two histograms must have
+ identical bin ranges.
+
+ -- Function: int gsl_histogram2d_div (gsl_histogram2d * H1, const
+ gsl_histogram2d * H2)
+ This function divides the contents of the bins of histogram H1 by
+ the contents of the corresponding bins in histogram H2, i.e.
+ h'_1(i,j) = h_1(i,j) / h_2(i,j). The two histograms must have
+ identical bin ranges.
+
+ -- Function: int gsl_histogram2d_scale (gsl_histogram2d * H, double
+ SCALE)
+ This function multiplies the contents of the bins of histogram H
+ by the constant SCALE, i.e. h'_1(i,j) = h_1(i,j) scale.
+
+ -- Function: int gsl_histogram2d_shift (gsl_histogram2d * H, double
+ OFFSET)
+ This function shifts the contents of the bins of histogram H by
+ the constant OFFSET, i.e. h'_1(i,j) = h_1(i,j) + offset.
+
+
+File: gsl-ref.info, Node: Reading and writing 2D histograms, Next: Resampling from 2D histograms, Prev: 2D Histogram Operations, Up: Histograms
+
+21.20 Reading and writing 2D histograms
+=======================================
+
+The library provides functions for reading and writing two dimensional
+histograms to a file as binary data or formatted text.
+
+ -- Function: int gsl_histogram2d_fwrite (FILE * STREAM, const
+ gsl_histogram2d * H)
+ This function writes the ranges and bins of the histogram H to the
+ stream STREAM in binary format. The return value is 0 for success
+ and `GSL_EFAILED' if there was a problem writing to the file.
+ Since the data is written in the native binary format it may not
+ be portable between different architectures.
+
+ -- Function: int gsl_histogram2d_fread (FILE * STREAM, gsl_histogram2d
+ * H)
+ This function reads into the histogram H from the stream STREAM in
+ binary format. The histogram H must be preallocated with the
+ correct size since the function uses the number of x and y bins in
+ H to determine how many bytes to read. The return value is 0 for
+ success and `GSL_EFAILED' if there was a problem reading from the
+ file. The data is assumed to have been written in the native
+ binary format on the same architecture.
+
+ -- Function: int gsl_histogram2d_fprintf (FILE * STREAM, const
+ gsl_histogram2d * H, const char * RANGE_FORMAT, const char *
+ BIN_FORMAT)
+ This function writes the ranges and bins of the histogram H
+ line-by-line to the stream STREAM using the format specifiers
+ RANGE_FORMAT and BIN_FORMAT. These should be one of the `%g',
+ `%e' or `%f' formats for floating point numbers. The function
+ returns 0 for success and `GSL_EFAILED' if there was a problem
+ writing to the file. The histogram output is formatted in five
+ columns, and the columns are separated by spaces, like this,
+
+ xrange[0] xrange[1] yrange[0] yrange[1] bin(0,0)
+ xrange[0] xrange[1] yrange[1] yrange[2] bin(0,1)
+ xrange[0] xrange[1] yrange[2] yrange[3] bin(0,2)
+ ....
+ xrange[0] xrange[1] yrange[ny-1] yrange[ny] bin(0,ny-1)
+
+ xrange[1] xrange[2] yrange[0] yrange[1] bin(1,0)
+ xrange[1] xrange[2] yrange[1] yrange[2] bin(1,1)
+ xrange[1] xrange[2] yrange[1] yrange[2] bin(1,2)
+ ....
+ xrange[1] xrange[2] yrange[ny-1] yrange[ny] bin(1,ny-1)
+
+ ....
+
+ xrange[nx-1] xrange[nx] yrange[0] yrange[1] bin(nx-1,0)
+ xrange[nx-1] xrange[nx] yrange[1] yrange[2] bin(nx-1,1)
+ xrange[nx-1] xrange[nx] yrange[1] yrange[2] bin(nx-1,2)
+ ....
+ xrange[nx-1] xrange[nx] yrange[ny-1] yrange[ny] bin(nx-1,ny-1)
+
+ Each line contains the lower and upper limits of the bin and the
+ contents of the bin. Since the upper limits of the each bin are
+ the lower limits of the neighboring bins there is duplication of
+ these values but this allows the histogram to be manipulated with
+ line-oriented tools.
+
+ -- Function: int gsl_histogram2d_fscanf (FILE * STREAM,
+ gsl_histogram2d * H)
+ This function reads formatted data from the stream STREAM into the
+ histogram H. The data is assumed to be in the five-column format
+ used by `gsl_histogram_fprintf'. The histogram H must be
+ preallocated with the correct lengths since the function uses the
+ sizes of H to determine how many numbers to read. The function
+ returns 0 for success and `GSL_EFAILED' if there was a problem
+ reading from the file.
+
+
+File: gsl-ref.info, Node: Resampling from 2D histograms, Next: Example programs for 2D histograms, Prev: Reading and writing 2D histograms, Up: Histograms
+
+21.21 Resampling from 2D histograms
+===================================
+
+As in the one-dimensional case, a two-dimensional histogram made by
+counting events can be regarded as a measurement of a probability
+distribution. Allowing for statistical error, the height of each bin
+represents the probability of an event where (x,y) falls in the range
+of that bin. For a two-dimensional histogram the probability
+distribution takes the form p(x,y) dx dy where,
+
+ p(x,y) = n_{ij}/ (N A_{ij})
+
+In this equation n_{ij} is the number of events in the bin which
+contains (x,y), A_{ij} is the area of the bin and N is the total number
+of events. The distribution of events within each bin is assumed to be
+uniform.
+
+ -- Data Type: gsl_histogram2d_pdf
+ `size_t nx, ny'
+ This is the number of histogram bins used to approximate the
+ probability distribution function in the x and y directions.
+
+ `double * xrange'
+ The ranges of the bins in the x-direction are stored in an
+ array of NX + 1 elements pointed to by XRANGE.
+
+ `double * yrange'
+ The ranges of the bins in the y-direction are stored in an
+ array of NY + 1 pointed to by YRANGE.
+
+ `double * sum'
+ The cumulative probability for the bins is stored in an array
+ of NX*NY elements pointed to by SUM.
+
+The following functions allow you to create a `gsl_histogram2d_pdf'
+struct which represents a two dimensional probability distribution and
+generate random samples from it.
+
+ -- Function: gsl_histogram2d_pdf * gsl_histogram2d_pdf_alloc (size_t
+ NX, size_t NY)
+ This function allocates memory for a two-dimensional probability
+ distribution of size NX-by-NY and returns a pointer to a newly
+ initialized `gsl_histogram2d_pdf' struct. If insufficient memory
+ is available a null pointer is returned and the error handler is
+ invoked with an error code of `GSL_ENOMEM'.
+
+ -- Function: int gsl_histogram2d_pdf_init (gsl_histogram2d_pdf * P,
+ const gsl_histogram2d * H)
+ This function initializes the two-dimensional probability
+ distribution calculated P from the histogram H. If any of the
+ bins of H are negative then the error handler is invoked with an
+ error code of `GSL_EDOM' because a probability distribution cannot
+ contain negative values.
+
+ -- Function: void gsl_histogram2d_pdf_free (gsl_histogram2d_pdf * P)
+ This function frees the two-dimensional probability distribution
+ function P and all of the memory associated with it.
+
+ -- Function: int gsl_histogram2d_pdf_sample (const gsl_histogram2d_pdf
+ * P, double R1, double R2, double * X, double * Y)
+ This function uses two uniform random numbers between zero and one,
+ R1 and R2, to compute a single random sample from the
+ two-dimensional probability distribution P.
+
+
+File: gsl-ref.info, Node: Example programs for 2D histograms, Prev: Resampling from 2D histograms, Up: Histograms
+
+21.22 Example programs for 2D histograms
+========================================
+
+This program demonstrates two features of two-dimensional histograms.
+First a 10-by-10 two-dimensional histogram is created with x and y
+running from 0 to 1. Then a few sample points are added to the
+histogram, at (0.3,0.3) with a height of 1, at (0.8,0.1) with a height
+of 5 and at (0.7,0.9) with a height of 0.5. This histogram with three
+events is used to generate a random sample of 1000 simulated events,
+which are printed out.
+
+ #include <stdio.h>
+ #include <gsl/gsl_rng.h>
+ #include <gsl/gsl_histogram2d.h>
+
+ int
+ main (void)
+ {
+ const gsl_rng_type * T;
+ gsl_rng * r;
+
+ gsl_histogram2d * h = gsl_histogram2d_alloc (10, 10);
+
+ gsl_histogram2d_set_ranges_uniform (h,
+ 0.0, 1.0,
+ 0.0, 1.0);
+
+ gsl_histogram2d_accumulate (h, 0.3, 0.3, 1);
+ gsl_histogram2d_accumulate (h, 0.8, 0.1, 5);
+ gsl_histogram2d_accumulate (h, 0.7, 0.9, 0.5);
+
+ gsl_rng_env_setup ();
+
+ T = gsl_rng_default;
+ r = gsl_rng_alloc (T);
+
+ {
+ int i;
+ gsl_histogram2d_pdf * p
+ = gsl_histogram2d_pdf_alloc (h->nx, h->ny);
+
+ gsl_histogram2d_pdf_init (p, h);
+
+ for (i = 0; i < 1000; i++) {
+ double x, y;
+ double u = gsl_rng_uniform (r);
+ double v = gsl_rng_uniform (r);
+
+ gsl_histogram2d_pdf_sample (p, u, v, &x, &y);
+
+ printf ("%g %g\n", x, y);
+ }
+
+ gsl_histogram2d_pdf_free (p);
+ }
+
+ gsl_histogram2d_free (h);
+ gsl_rng_free (r);
+
+ return 0;
+ }
+
+
+
+File: gsl-ref.info, Node: N-tuples, Next: Monte Carlo Integration, Prev: Histograms, Up: Top
+
+22 N-tuples
+***********
+
+This chapter describes functions for creating and manipulating
+"ntuples", sets of values associated with events. The ntuples are
+stored in files. Their values can be extracted in any combination and
+"booked" in a histogram using a selection function.
+
+ The values to be stored are held in a user-defined data structure,
+and an ntuple is created associating this data structure with a file.
+The values are then written to the file (normally inside a loop) using
+the ntuple functions described below.
+
+ A histogram can be created from ntuple data by providing a selection
+function and a value function. The selection function specifies whether
+an event should be included in the subset to be analyzed or not. The
+value function computes the entry to be added to the histogram for each
+event.
+
+ All the ntuple functions are defined in the header file
+`gsl_ntuple.h'
+
+* Menu:
+
+* The ntuple struct::
+* Creating ntuples::
+* Opening an existing ntuple file::
+* Writing ntuples::
+* Reading ntuples ::
+* Closing an ntuple file::
+* Histogramming ntuple values::
+* Example ntuple programs::
+* Ntuple References and Further Reading::
+
+
+File: gsl-ref.info, Node: The ntuple struct, Next: Creating ntuples, Up: N-tuples
+
+22.1 The ntuple struct
+======================
+
+Ntuples are manipulated using the `gsl_ntuple' struct. This struct
+contains information on the file where the ntuple data is stored, a
+pointer to the current ntuple data row and the size of the user-defined
+ntuple data struct.
+
+ typedef struct {
+ FILE * file;
+ void * ntuple_data;
+ size_t size;
+ } gsl_ntuple;
+
+
+File: gsl-ref.info, Node: Creating ntuples, Next: Opening an existing ntuple file, Prev: The ntuple struct, Up: N-tuples
+
+22.2 Creating ntuples
+=====================
+
+ -- Function: gsl_ntuple * gsl_ntuple_create (char * FILENAME, void *
+ NTUPLE_DATA, size_t SIZE)
+ This function creates a new write-only ntuple file FILENAME for
+ ntuples of size SIZE and returns a pointer to the newly created
+ ntuple struct. Any existing file with the same name is truncated
+ to zero length and overwritten. A pointer to memory for the
+ current ntuple row NTUPLE_DATA must be supplied--this is used to
+ copy ntuples in and out of the file.
+
+
+File: gsl-ref.info, Node: Opening an existing ntuple file, Next: Writing ntuples, Prev: Creating ntuples, Up: N-tuples
+
+22.3 Opening an existing ntuple file
+====================================
+
+ -- Function: gsl_ntuple * gsl_ntuple_open (char * FILENAME, void *
+ NTUPLE_DATA, size_t SIZE)
+ This function opens an existing ntuple file FILENAME for reading
+ and returns a pointer to a corresponding ntuple struct. The
+ ntuples in the file must have size SIZE. A pointer to memory for
+ the current ntuple row NTUPLE_DATA must be supplied--this is used
+ to copy ntuples in and out of the file.
+
+
+File: gsl-ref.info, Node: Writing ntuples, Next: Reading ntuples, Prev: Opening an existing ntuple file, Up: N-tuples
+
+22.4 Writing ntuples
+====================
+
+ -- Function: int gsl_ntuple_write (gsl_ntuple * NTUPLE)
+ This function writes the current ntuple NTUPLE->NTUPLE_DATA of
+ size NTUPLE->SIZE to the corresponding file.
+
+ -- Function: int gsl_ntuple_bookdata (gsl_ntuple * NTUPLE)
+ This function is a synonym for `gsl_ntuple_write'.
+
+
+File: gsl-ref.info, Node: Reading ntuples, Next: Closing an ntuple file, Prev: Writing ntuples, Up: N-tuples
+
+22.5 Reading ntuples
+====================
+
+ -- Function: int gsl_ntuple_read (gsl_ntuple * NTUPLE)
+ This function reads the current row of the ntuple file for NTUPLE
+ and stores the values in NTUPLE->DATA.
+
+
+File: gsl-ref.info, Node: Closing an ntuple file, Next: Histogramming ntuple values, Prev: Reading ntuples, Up: N-tuples
+
+22.6 Closing an ntuple file
+===========================
+
+ -- Function: int gsl_ntuple_close (gsl_ntuple * NTUPLE)
+ This function closes the ntuple file NTUPLE and frees its
+ associated allocated memory.
+
+
+File: gsl-ref.info, Node: Histogramming ntuple values, Next: Example ntuple programs, Prev: Closing an ntuple file, Up: N-tuples
+
+22.7 Histogramming ntuple values
+================================
+
+Once an ntuple has been created its contents can be histogrammed in
+various ways using the function `gsl_ntuple_project'. Two user-defined
+functions must be provided, a function to select events and a function
+to compute scalar values. The selection function and the value function
+both accept the ntuple row as a first argument and other parameters as
+a second argument.
+
+ The "selection function" determines which ntuple rows are selected
+for histogramming. It is defined by the following struct,
+ typedef struct {
+ int (* function) (void * ntuple_data, void * params);
+ void * params;
+ } gsl_ntuple_select_fn;
+
+The struct component FUNCTION should return a non-zero value for each
+ntuple row that is to be included in the histogram.
+
+ The "value function" computes scalar values for those ntuple rows
+selected by the selection function,
+ typedef struct {
+ double (* function) (void * ntuple_data, void * params);
+ void * params;
+ } gsl_ntuple_value_fn;
+
+In this case the struct component FUNCTION should return the value to
+be added to the histogram for the ntuple row.
+
+ -- Function: int gsl_ntuple_project (gsl_histogram * H, gsl_ntuple *
+ NTUPLE, gsl_ntuple_value_fn * VALUE_FUNC,
+ gsl_ntuple_select_fn * SELECT_FUNC)
+ This function updates the histogram H from the ntuple NTUPLE using
+ the functions VALUE_FUNC and SELECT_FUNC. For each ntuple row
+ where the selection function SELECT_FUNC is non-zero the
+ corresponding value of that row is computed using the function
+ VALUE_FUNC and added to the histogram. Those ntuple rows where
+ SELECT_FUNC returns zero are ignored. New entries are added to
+ the histogram, so subsequent calls can be used to accumulate
+ further data in the same histogram.
+
+
+File: gsl-ref.info, Node: Example ntuple programs, Next: Ntuple References and Further Reading, Prev: Histogramming ntuple values, Up: N-tuples
+
+22.8 Examples
+=============
+
+The following example programs demonstrate the use of ntuples in
+managing a large dataset. The first program creates a set of 10,000
+simulated "events", each with 3 associated values (x,y,z). These are
+generated from a gaussian distribution with unit variance, for
+demonstration purposes, and written to the ntuple file `test.dat'.
+
+ #include <gsl/gsl_ntuple.h>
+ #include <gsl/gsl_rng.h>
+ #include <gsl/gsl_randist.h>
+
+ struct data
+ {
+ double x;
+ double y;
+ double z;
+ };
+
+ int
+ main (void)
+ {
+ const gsl_rng_type * T;
+ gsl_rng * r;
+
+ struct data ntuple_row;
+ int i;
+
+ gsl_ntuple *ntuple
+ = gsl_ntuple_create ("test.dat", &ntuple_row,
+ sizeof (ntuple_row));
+
+ gsl_rng_env_setup ();
+
+ T = gsl_rng_default;
+ r = gsl_rng_alloc (T);
+
+ for (i = 0; i < 10000; i++)
+ {
+ ntuple_row.x = gsl_ran_ugaussian (r);
+ ntuple_row.y = gsl_ran_ugaussian (r);
+ ntuple_row.z = gsl_ran_ugaussian (r);
+
+ gsl_ntuple_write (ntuple);
+ }
+
+ gsl_ntuple_close (ntuple);
+ gsl_rng_free (r);
+
+ return 0;
+ }
+
+The next program analyses the ntuple data in the file `test.dat'. The
+analysis procedure is to compute the squared-magnitude of each event,
+E^2=x^2+y^2+z^2, and select only those which exceed a lower limit of
+1.5. The selected events are then histogrammed using their E^2 values.
+
+ #include <math.h>
+ #include <gsl/gsl_ntuple.h>
+ #include <gsl/gsl_histogram.h>
+
+ struct data
+ {
+ double x;
+ double y;
+ double z;
+ };
+
+ int sel_func (void *ntuple_data, void *params);
+ double val_func (void *ntuple_data, void *params);
+
+ int
+ main (void)
+ {
+ struct data ntuple_row;
+
+ gsl_ntuple *ntuple
+ = gsl_ntuple_open ("test.dat", &ntuple_row,
+ sizeof (ntuple_row));
+ double lower = 1.5;
+
+ gsl_ntuple_select_fn S;
+ gsl_ntuple_value_fn V;
+
+ gsl_histogram *h = gsl_histogram_alloc (100);
+ gsl_histogram_set_ranges_uniform(h, 0.0, 10.0);
+
+ S.function = &sel_func;
+ S.params = &lower;
+
+ V.function = &val_func;
+ V.params = 0;
+
+ gsl_ntuple_project (h, ntuple, &V, &S);
+ gsl_histogram_fprintf (stdout, h, "%f", "%f");
+ gsl_histogram_free (h);
+ gsl_ntuple_close (ntuple);
+
+ return 0;
+ }
+
+ int
+ sel_func (void *ntuple_data, void *params)
+ {
+ struct data * data = (struct data *) ntuple_data;
+ double x, y, z, E2, scale;
+ scale = *(double *) params;
+
+ x = data->x;
+ y = data->y;
+ z = data->z;
+
+ E2 = x * x + y * y + z * z;
+
+ return E2 > scale;
+ }
+
+ double
+ val_func (void *ntuple_data, void *params)
+ {
+ struct data * data = (struct data *) ntuple_data;
+ double x, y, z;
+
+ x = data->x;
+ y = data->y;
+ z = data->z;
+
+ return x * x + y * y + z * z;
+ }
+
+ The following plot shows the distribution of the selected events.
+Note the cut-off at the lower bound.
+
+
+File: gsl-ref.info, Node: Ntuple References and Further Reading, Prev: Example ntuple programs, Up: N-tuples
+
+22.9 References and Further Reading
+===================================
+
+Further information on the use of ntuples can be found in the
+documentation for the CERN packages PAW and HBOOK (available online).
+
+
+File: gsl-ref.info, Node: Monte Carlo Integration, Next: Simulated Annealing, Prev: N-tuples, Up: Top
+
+23 Monte Carlo Integration
+**************************
+
+This chapter describes routines for multidimensional Monte Carlo
+integration. These include the traditional Monte Carlo method and
+adaptive algorithms such as VEGAS and MISER which use importance
+sampling and stratified sampling techniques. Each algorithm computes an
+estimate of a multidimensional definite integral of the form,
+
+ I = \int_xl^xu dx \int_yl^yu dy ... f(x, y, ...)
+
+over a hypercubic region ((x_l,x_u), (y_l,y_u), ...) using a fixed
+number of function calls. The routines also provide a statistical
+estimate of the error on the result. This error estimate should be
+taken as a guide rather than as a strict error bound--random sampling
+of the region may not uncover all the important features of the
+function, resulting in an underestimate of the error.
+
+ The functions are defined in separate header files for each routine,
+`gsl_monte_plain.h', `gsl_monte_miser.h' and `gsl_monte_vegas.h'.
+
+* Menu:
+
+* Monte Carlo Interface::
+* PLAIN Monte Carlo::
+* MISER::
+* VEGAS::
+* Monte Carlo Examples::
+* Monte Carlo Integration References and Further Reading::
+
+
+File: gsl-ref.info, Node: Monte Carlo Interface, Next: PLAIN Monte Carlo, Up: Monte Carlo Integration
+
+23.1 Interface
+==============
+
+All of the Monte Carlo integration routines use the same general form of
+interface. There is an allocator to allocate memory for control
+variables and workspace, a routine to initialize those control
+variables, the integrator itself, and a function to free the space when
+done.
+
+ Each integration function requires a random number generator to be
+supplied, and returns an estimate of the integral and its standard
+deviation. The accuracy of the result is determined by the number of
+function calls specified by the user. If a known level of accuracy is
+required this can be achieved by calling the integrator several times
+and averaging the individual results until the desired accuracy is
+obtained.
+
+ Random sample points used within the Monte Carlo routines are always
+chosen strictly within the integration region, so that endpoint
+singularities are automatically avoided.
+
+ The function to be integrated has its own datatype, defined in the
+header file `gsl_monte.h'.
+
+ -- Data Type: gsl_monte_function
+ This data type defines a general function with parameters for Monte
+ Carlo integration.
+
+ `double (* f) (double * X, size_t DIM, void * PARAMS)'
+ this function should return the value f(x,params) for the
+ argument X and parameters PARAMS, where X is an array of size
+ DIM giving the coordinates of the point where the function is
+ to be evaluated.
+
+ `size_t dim'
+ the number of dimensions for X.
+
+ `void * params'
+ a pointer to the parameters of the function.
+
+Here is an example for a quadratic function in two dimensions,
+
+ f(x,y) = a x^2 + b x y + c y^2
+
+with a = 3, b = 2, c = 1. The following code defines a
+`gsl_monte_function' `F' which you could pass to an integrator:
+
+ struct my_f_params { double a; double b; double c; };
+
+ double
+ my_f (double x[], size_t dim, void * p) {
+ struct my_f_params * fp = (struct my_f_params *)p;
+
+ if (dim != 2)
+ {
+ fprintf (stderr, "error: dim != 2");
+ abort ();
+ }
+
+ return fp->a * x[0] * x[0]
+ + fp->b * x[0] * x[1]
+ + fp->c * x[1] * x[1];
+ }
+
+ gsl_monte_function F;
+ struct my_f_params params = { 3.0, 2.0, 1.0 };
+
+ F.f = &my_f;
+ F.dim = 2;
+ F.params = &params;
+
+The function f(x) can be evaluated using the following macro,
+
+ #define GSL_MONTE_FN_EVAL(F,x)
+ (*((F)->f))(x,(F)->dim,(F)->params)
+
+
+File: gsl-ref.info, Node: PLAIN Monte Carlo, Next: MISER, Prev: Monte Carlo Interface, Up: Monte Carlo Integration
+
+23.2 PLAIN Monte Carlo
+======================
+
+The plain Monte Carlo algorithm samples points randomly from the
+integration region to estimate the integral and its error. Using this
+algorithm the estimate of the integral E(f; N) for N randomly
+distributed points x_i is given by,
+
+ E(f; N) = = V <f> = (V / N) \sum_i^N f(x_i)
+
+where V is the volume of the integration region. The error on this
+estimate \sigma(E;N) is calculated from the estimated variance of the
+mean,
+
+ \sigma^2 (E; N) = (V / N) \sum_i^N (f(x_i) - <f>)^2.
+
+For large N this variance decreases asymptotically as \Var(f)/N, where
+\Var(f) is the true variance of the function over the integration
+region. The error estimate itself should decrease as
+\sigma(f)/\sqrt{N}. The familiar law of errors decreasing as
+1/\sqrt{N} applies--to reduce the error by a factor of 10 requires a
+100-fold increase in the number of sample points.
+
+ The functions described in this section are declared in the header
+file `gsl_monte_plain.h'.
+
+ -- Function: gsl_monte_plain_state * gsl_monte_plain_alloc (size_t DIM)
+ This function allocates and initializes a workspace for Monte Carlo
+ integration in DIM dimensions.
+
+ -- Function: int gsl_monte_plain_init (gsl_monte_plain_state* S)
+ This function initializes a previously allocated integration state.
+ This allows an existing workspace to be reused for different
+ integrations.
+
+ -- Function: int gsl_monte_plain_integrate (gsl_monte_function * F,
+ double * XL, double * XU, size_t DIM, size_t CALLS, gsl_rng *
+ R, gsl_monte_plain_state * S, double * RESULT, double *
+ ABSERR)
+ This routines uses the plain Monte Carlo algorithm to integrate the
+ function F over the DIM-dimensional hypercubic region defined by
+ the lower and upper limits in the arrays XL and XU, each of size
+ DIM. The integration uses a fixed number of function calls CALLS,
+ and obtains random sampling points using the random number
+ generator R. A previously allocated workspace S must be supplied.
+ The result of the integration is returned in RESULT, with an
+ estimated absolute error ABSERR.
+
+ -- Function: void gsl_monte_plain_free (gsl_monte_plain_state * S)
+ This function frees the memory associated with the integrator state
+ S.
+
+
+File: gsl-ref.info, Node: MISER, Next: VEGAS, Prev: PLAIN Monte Carlo, Up: Monte Carlo Integration
+
+23.3 MISER
+==========
+
+The MISER algorithm of Press and Farrar is based on recursive
+stratified sampling. This technique aims to reduce the overall
+integration error by concentrating integration points in the regions of
+highest variance.
+
+ The idea of stratified sampling begins with the observation that for
+two disjoint regions a and b with Monte Carlo estimates of the integral
+E_a(f) and E_b(f) and variances \sigma_a^2(f) and \sigma_b^2(f), the
+variance \Var(f) of the combined estimate E(f) = (1/2) (E_a(f) + E_b(f))
+is given by,
+
+ \Var(f) = (\sigma_a^2(f) / 4 N_a) + (\sigma_b^2(f) / 4 N_b).
+
+It can be shown that this variance is minimized by distributing the
+points such that,
+
+ N_a / (N_a + N_b) = \sigma_a / (\sigma_a + \sigma_b).
+
+Hence the smallest error estimate is obtained by allocating sample
+points in proportion to the standard deviation of the function in each
+sub-region.
+
+ The MISER algorithm proceeds by bisecting the integration region
+along one coordinate axis to give two sub-regions at each step. The
+direction is chosen by examining all d possible bisections and
+selecting the one which will minimize the combined variance of the two
+sub-regions. The variance in the sub-regions is estimated by sampling
+with a fraction of the total number of points available to the current
+step. The same procedure is then repeated recursively for each of the
+two half-spaces from the best bisection. The remaining sample points are
+allocated to the sub-regions using the formula for N_a and N_b. This
+recursive allocation of integration points continues down to a
+user-specified depth where each sub-region is integrated using a plain
+Monte Carlo estimate. These individual values and their error
+estimates are then combined upwards to give an overall result and an
+estimate of its error.
+
+ The functions described in this section are declared in the header
+file `gsl_monte_miser.h'.
+
+ -- Function: gsl_monte_miser_state * gsl_monte_miser_alloc (size_t DIM)
+ This function allocates and initializes a workspace for Monte Carlo
+ integration in DIM dimensions. The workspace is used to maintain
+ the state of the integration.
+
+ -- Function: int gsl_monte_miser_init (gsl_monte_miser_state* S)
+ This function initializes a previously allocated integration state.
+ This allows an existing workspace to be reused for different
+ integrations.
+
+ -- Function: int gsl_monte_miser_integrate (gsl_monte_function * F,
+ double * XL, double * XU, size_t DIM, size_t CALLS, gsl_rng *
+ R, gsl_monte_miser_state * S, double * RESULT, double *
+ ABSERR)
+ This routines uses the MISER Monte Carlo algorithm to integrate the
+ function F over the DIM-dimensional hypercubic region defined by
+ the lower and upper limits in the arrays XL and XU, each of size
+ DIM. The integration uses a fixed number of function calls CALLS,
+ and obtains random sampling points using the random number
+ generator R. A previously allocated workspace S must be supplied.
+ The result of the integration is returned in RESULT, with an
+ estimated absolute error ABSERR.
+
+ -- Function: void gsl_monte_miser_free (gsl_monte_miser_state * S)
+ This function frees the memory associated with the integrator state
+ S.
+
+ The MISER algorithm has several configurable parameters. The
+following variables can be accessed through the `gsl_monte_miser_state'
+struct,
+
+ -- Variable: double estimate_frac
+ This parameter specifies the fraction of the currently available
+ number of function calls which are allocated to estimating the
+ variance at each recursive step. The default value is 0.1.
+
+ -- Variable: size_t min_calls
+ This parameter specifies the minimum number of function calls
+ required for each estimate of the variance. If the number of
+ function calls allocated to the estimate using ESTIMATE_FRAC falls
+ below MIN_CALLS then MIN_CALLS are used instead. This ensures
+ that each estimate maintains a reasonable level of accuracy. The
+ default value of MIN_CALLS is `16 * dim'.
+
+ -- Variable: size_t min_calls_per_bisection
+ This parameter specifies the minimum number of function calls
+ required to proceed with a bisection step. When a recursive step
+ has fewer calls available than MIN_CALLS_PER_BISECTION it performs
+ a plain Monte Carlo estimate of the current sub-region and
+ terminates its branch of the recursion. The default value of this
+ parameter is `32 * min_calls'.
+
+ -- Variable: double alpha
+ This parameter controls how the estimated variances for the two
+ sub-regions of a bisection are combined when allocating points.
+ With recursive sampling the overall variance should scale better
+ than 1/N, since the values from the sub-regions will be obtained
+ using a procedure which explicitly minimizes their variance. To
+ accommodate this behavior the MISER algorithm allows the total
+ variance to depend on a scaling parameter \alpha,
+
+ \Var(f) = {\sigma_a \over N_a^\alpha} + {\sigma_b \over N_b^\alpha}.
+
+ The authors of the original paper describing MISER recommend the
+ value \alpha = 2 as a good choice, obtained from numerical
+ experiments, and this is used as the default value in this
+ implementation.
+
+ -- Variable: double dither
+ This parameter introduces a random fractional variation of size
+ DITHER into each bisection, which can be used to break the
+ symmetry of integrands which are concentrated near the exact
+ center of the hypercubic integration region. The default value of
+ dither is zero, so no variation is introduced. If needed, a
+ typical value of DITHER is 0.1.
+
+
+File: gsl-ref.info, Node: VEGAS, Next: Monte Carlo Examples, Prev: MISER, Up: Monte Carlo Integration
+
+23.4 VEGAS
+==========
+
+The VEGAS algorithm of Lepage is based on importance sampling. It
+samples points from the probability distribution described by the
+function |f|, so that the points are concentrated in the regions that
+make the largest contribution to the integral.
+
+ In general, if the Monte Carlo integral of f is sampled with points
+distributed according to a probability distribution described by the
+function g, we obtain an estimate E_g(f; N),
+
+ E_g(f; N) = E(f/g; N)
+
+with a corresponding variance,
+
+ \Var_g(f; N) = \Var(f/g; N).
+
+If the probability distribution is chosen as g = |f|/I(|f|) then it can
+be shown that the variance V_g(f; N) vanishes, and the error in the
+estimate will be zero. In practice it is not possible to sample from
+the exact distribution g for an arbitrary function, so importance
+sampling algorithms aim to produce efficient approximations to the
+desired distribution.
+
+ The VEGAS algorithm approximates the exact distribution by making a
+number of passes over the integration region while histogramming the
+function f. Each histogram is used to define a sampling distribution
+for the next pass. Asymptotically this procedure converges to the
+desired distribution. In order to avoid the number of histogram bins
+growing like K^d the probability distribution is approximated by a
+separable function: g(x_1, x_2, ...) = g_1(x_1) g_2(x_2) ... so that
+the number of bins required is only Kd. This is equivalent to locating
+the peaks of the function from the projections of the integrand onto
+the coordinate axes. The efficiency of VEGAS depends on the validity
+of this assumption. It is most efficient when the peaks of the
+integrand are well-localized. If an integrand can be rewritten in a
+form which is approximately separable this will increase the efficiency
+of integration with VEGAS.
+
+ VEGAS incorporates a number of additional features, and combines both
+stratified sampling and importance sampling. The integration region is
+divided into a number of "boxes", with each box getting a fixed number
+of points (the goal is 2). Each box can then have a fractional number
+of bins, but if the ratio of bins-per-box is less than two, Vegas
+switches to a kind variance reduction (rather than importance sampling).
+
+ -- Function: gsl_monte_vegas_state * gsl_monte_vegas_alloc (size_t DIM)
+ This function allocates and initializes a workspace for Monte Carlo
+ integration in DIM dimensions. The workspace is used to maintain
+ the state of the integration.
+
+ -- Function: int gsl_monte_vegas_init (gsl_monte_vegas_state* S)
+ This function initializes a previously allocated integration state.
+ This allows an existing workspace to be reused for different
+ integrations.
+
+ -- Function: int gsl_monte_vegas_integrate (gsl_monte_function * F,
+ double * XL, double * XU, size_t DIM, size_t CALLS, gsl_rng *
+ R, gsl_monte_vegas_state * S, double * RESULT, double *
+ ABSERR)
+ This routines uses the VEGAS Monte Carlo algorithm to integrate the
+ function F over the DIM-dimensional hypercubic region defined by
+ the lower and upper limits in the arrays XL and XU, each of size
+ DIM. The integration uses a fixed number of function calls CALLS,
+ and obtains random sampling points using the random number
+ generator R. A previously allocated workspace S must be supplied.
+ The result of the integration is returned in RESULT, with an
+ estimated absolute error ABSERR. The result and its error
+ estimate are based on a weighted average of independent samples.
+ The chi-squared per degree of freedom for the weighted average is
+ returned via the state struct component, S->CHISQ, and must be
+ consistent with 1 for the weighted average to be reliable.
+
+ -- Function: void gsl_monte_vegas_free (gsl_monte_vegas_state * S)
+ This function frees the memory associated with the integrator state
+ S.
+
+ The VEGAS algorithm computes a number of independent estimates of the
+integral internally, according to the `iterations' parameter described
+below, and returns their weighted average. Random sampling of the
+integrand can occasionally produce an estimate where the error is zero,
+particularly if the function is constant in some regions. An estimate
+with zero error causes the weighted average to break down and must be
+handled separately. In the original Fortran implementations of VEGAS
+the error estimate is made non-zero by substituting a small value
+(typically `1e-30'). The implementation in GSL differs from this and
+avoids the use of an arbitrary constant--it either assigns the value a
+weight which is the average weight of the preceding estimates or
+discards it according to the following procedure,
+
+current estimate has zero error, weighted average has finite error
+ The current estimate is assigned a weight which is the average
+ weight of the preceding estimates.
+
+current estimate has finite error, previous estimates had zero error
+ The previous estimates are discarded and the weighted averaging
+ procedure begins with the current estimate.
+
+current estimate has zero error, previous estimates had zero error
+ The estimates are averaged using the arithmetic mean, but no error
+ is computed.
+
+ The VEGAS algorithm is highly configurable. The following variables
+can be accessed through the `gsl_monte_vegas_state' struct,
+
+ -- Variable: double result
+ -- Variable: double sigma
+ These parameters contain the raw value of the integral RESULT and
+ its error SIGMA from the last iteration of the algorithm.
+
+ -- Variable: double chisq
+ This parameter gives the chi-squared per degree of freedom for the
+ weighted estimate of the integral. The value of CHISQ should be
+ close to 1. A value of CHISQ which differs significantly from 1
+ indicates that the values from different iterations are
+ inconsistent. In this case the weighted error will be
+ under-estimated, and further iterations of the algorithm are
+ needed to obtain reliable results.
+
+ -- Variable: double alpha
+ The parameter `alpha' controls the stiffness of the rebinning
+ algorithm. It is typically set between one and two. A value of
+ zero prevents rebinning of the grid. The default value is 1.5.
+
+ -- Variable: size_t iterations
+ The number of iterations to perform for each call to the routine.
+ The default value is 5 iterations.
+
+ -- Variable: int stage
+ Setting this determines the "stage" of the calculation. Normally,
+ `stage = 0' which begins with a new uniform grid and empty weighted
+ average. Calling vegas with `stage = 1' retains the grid from the
+ previous run but discards the weighted average, so that one can
+ "tune" the grid using a relatively small number of points and then
+ do a large run with `stage = 1' on the optimized grid. Setting
+ `stage = 2' keeps the grid and the weighted average from the
+ previous run, but may increase (or decrease) the number of
+ histogram bins in the grid depending on the number of calls
+ available. Choosing `stage = 3' enters at the main loop, so that
+ nothing is changed, and is equivalent to performing additional
+ iterations in a previous call.
+
+ -- Variable: int mode
+ The possible choices are `GSL_VEGAS_MODE_IMPORTANCE',
+ `GSL_VEGAS_MODE_STRATIFIED', `GSL_VEGAS_MODE_IMPORTANCE_ONLY'.
+ This determines whether VEGAS will use importance sampling or
+ stratified sampling, or whether it can pick on its own. In low
+ dimensions VEGAS uses strict stratified sampling (more precisely,
+ stratified sampling is chosen if there are fewer than 2 bins per
+ box).
+
+ -- Variable: int verbose
+ -- Variable: FILE * ostream
+ These parameters set the level of information printed by VEGAS. All
+ information is written to the stream OSTREAM. The default setting
+ of VERBOSE is `-1', which turns off all output. A VERBOSE value
+ of `0' prints summary information about the weighted average and
+ final result, while a value of `1' also displays the grid
+ coordinates. A value of `2' prints information from the rebinning
+ procedure for each iteration.
+
+
+File: gsl-ref.info, Node: Monte Carlo Examples, Next: Monte Carlo Integration References and Further Reading, Prev: VEGAS, Up: Monte Carlo Integration
+
+23.5 Examples
+=============
+
+The example program below uses the Monte Carlo routines to estimate the
+value of the following 3-dimensional integral from the theory of random
+walks,
+
+ I = \int_{-pi}^{+pi} {dk_x/(2 pi)}
+ \int_{-pi}^{+pi} {dk_y/(2 pi)}
+ \int_{-pi}^{+pi} {dk_z/(2 pi)}
+ 1 / (1 - cos(k_x)cos(k_y)cos(k_z)).
+
+The analytic value of this integral can be shown to be I =
+\Gamma(1/4)^4/(4 \pi^3) = 1.393203929685676859.... The integral gives
+the mean time spent at the origin by a random walk on a body-centered
+cubic lattice in three dimensions.
+
+ For simplicity we will compute the integral over the region (0,0,0)
+to (\pi,\pi,\pi) and multiply by 8 to obtain the full result. The
+integral is slowly varying in the middle of the region but has
+integrable singularities at the corners (0,0,0), (0,\pi,\pi),
+(\pi,0,\pi) and (\pi,\pi,0). The Monte Carlo routines only select
+points which are strictly within the integration region and so no
+special measures are needed to avoid these singularities.
+
+ #include <stdlib.h>
+ #include <gsl/gsl_math.h>
+ #include <gsl/gsl_monte.h>
+ #include <gsl/gsl_monte_plain.h>
+ #include <gsl/gsl_monte_miser.h>
+ #include <gsl/gsl_monte_vegas.h>
+
+ /* Computation of the integral,
+
+ I = int (dx dy dz)/(2pi)^3 1/(1-cos(x)cos(y)cos(z))
+
+ over (-pi,-pi,-pi) to (+pi, +pi, +pi). The exact answer
+ is Gamma(1/4)^4/(4 pi^3). This example is taken from
+ C.Itzykson, J.M.Drouffe, "Statistical Field Theory -
+ Volume 1", Section 1.1, p21, which cites the original
+ paper M.L.Glasser, I.J.Zucker, Proc.Natl.Acad.Sci.USA 74
+ 1800 (1977) */
+
+ /* For simplicity we compute the integral over the region
+ (0,0,0) -> (pi,pi,pi) and multiply by 8 */
+
+ double exact = 1.3932039296856768591842462603255;
+
+ double
+ g (double *k, size_t dim, void *params)
+ {
+ double A = 1.0 / (M_PI * M_PI * M_PI);
+ return A / (1.0 - cos (k[0]) * cos (k[1]) * cos (k[2]));
+ }
+
+ void
+ display_results (char *title, double result, double error)
+ {
+ printf ("%s ==================\n", title);
+ printf ("result = % .6f\n", result);
+ printf ("sigma = % .6f\n", error);
+ printf ("exact = % .6f\n", exact);
+ printf ("error = % .6f = %.1g sigma\n", result - exact,
+ fabs (result - exact) / error);
+ }
+
+ int
+ main (void)
+ {
+ double res, err;
+
+ double xl[3] = { 0, 0, 0 };
+ double xu[3] = { M_PI, M_PI, M_PI };
+
+ const gsl_rng_type *T;
+ gsl_rng *r;
+
+ gsl_monte_function G = { &g, 3, 0 };
+
+ size_t calls = 500000;
+
+ gsl_rng_env_setup ();
+
+ T = gsl_rng_default;
+ r = gsl_rng_alloc (T);
+
+ {
+ gsl_monte_plain_state *s = gsl_monte_plain_alloc (3);
+ gsl_monte_plain_integrate (&G, xl, xu, 3, calls, r, s,
+ &res, &err);
+ gsl_monte_plain_free (s);
+
+ display_results ("plain", res, err);
+ }
+
+ {
+ gsl_monte_miser_state *s = gsl_monte_miser_alloc (3);
+ gsl_monte_miser_integrate (&G, xl, xu, 3, calls, r, s,
+ &res, &err);
+ gsl_monte_miser_free (s);
+
+ display_results ("miser", res, err);
+ }
+
+ {
+ gsl_monte_vegas_state *s = gsl_monte_vegas_alloc (3);
+
+ gsl_monte_vegas_integrate (&G, xl, xu, 3, 10000, r, s,
+ &res, &err);
+ display_results ("vegas warm-up", res, err);
+
+ printf ("converging...\n");
+
+ do
+ {
+ gsl_monte_vegas_integrate (&G, xl, xu, 3, calls/5, r, s,
+ &res, &err);
+ printf ("result = % .6f sigma = % .6f "
+ "chisq/dof = %.1f\n", res, err, s->chisq);
+ }
+ while (fabs (s->chisq - 1.0) > 0.5);
+
+ display_results ("vegas final", res, err);
+
+ gsl_monte_vegas_free (s);
+ }
+
+ gsl_rng_free (r);
+
+ return 0;
+ }
+
+With 500,000 function calls the plain Monte Carlo algorithm achieves a
+fractional error of 0.6%. The estimated error `sigma' is consistent
+with the actual error, and the computed result differs from the true
+result by about one standard deviation,
+
+ plain ==================
+ result = 1.385867
+ sigma = 0.007938
+ exact = 1.393204
+ error = -0.007337 = 0.9 sigma
+
+The MISER algorithm reduces the error by a factor of two, and also
+correctly estimates the error,
+
+ miser ==================
+ result = 1.390656
+ sigma = 0.003743
+ exact = 1.393204
+ error = -0.002548 = 0.7 sigma
+
+In the case of the VEGAS algorithm the program uses an initial warm-up
+run of 10,000 function calls to prepare, or "warm up", the grid. This
+is followed by a main run with five iterations of 100,000 function
+calls. The chi-squared per degree of freedom for the five iterations are
+checked for consistency with 1, and the run is repeated if the results
+have not converged. In this case the estimates are consistent on the
+first pass.
+
+ vegas warm-up ==================
+ result = 1.386925
+ sigma = 0.002651
+ exact = 1.393204
+ error = -0.006278 = 2 sigma
+ converging...
+ result = 1.392957 sigma = 0.000452 chisq/dof = 1.1
+ vegas final ==================
+ result = 1.392957
+ sigma = 0.000452
+ exact = 1.393204
+ error = -0.000247 = 0.5 sigma
+
+If the value of `chisq' had differed significantly from 1 it would
+indicate inconsistent results, with a correspondingly underestimated
+error. The final estimate from VEGAS (using a similar number of
+function calls) is significantly more accurate than the other two
+algorithms.
+
+
+File: gsl-ref.info, Node: Monte Carlo Integration References and Further Reading, Prev: Monte Carlo Examples, Up: Monte Carlo Integration
+
+23.6 References and Further Reading
+===================================
+
+The MISER algorithm is described in the following article by Press and
+Farrar,
+
+ W.H. Press, G.R. Farrar, `Recursive Stratified Sampling for
+ Multidimensional Monte Carlo Integration', Computers in Physics,
+ v4 (1990), pp190-195.
+
+The VEGAS algorithm is described in the following papers,
+
+ G.P. Lepage, `A New Algorithm for Adaptive Multidimensional
+ Integration', Journal of Computational Physics 27, 192-203, (1978)
+
+ G.P. Lepage, `VEGAS: An Adaptive Multi-dimensional Integration
+ Program', Cornell preprint CLNS 80-447, March 1980
+
+
+File: gsl-ref.info, Node: Simulated Annealing, Next: Ordinary Differential Equations, Prev: Monte Carlo Integration, Up: Top
+
+24 Simulated Annealing
+**********************
+
+Stochastic search techniques are used when the structure of a space is
+not well understood or is not smooth, so that techniques like Newton's
+method (which requires calculating Jacobian derivative matrices) cannot
+be used. In particular, these techniques are frequently used to solve
+combinatorial optimization problems, such as the traveling salesman
+problem.
+
+ The goal is to find a point in the space at which a real valued
+"energy function" (or "cost function") is minimized. Simulated
+annealing is a minimization technique which has given good results in
+avoiding local minima; it is based on the idea of taking a random walk
+through the space at successively lower temperatures, where the
+probability of taking a step is given by a Boltzmann distribution.
+
+ The functions described in this chapter are declared in the header
+file `gsl_siman.h'.
+
+* Menu:
+
+* Simulated Annealing algorithm::
+* Simulated Annealing functions::
+* Examples with Simulated Annealing::
+* Simulated Annealing References and Further Reading::
+
+
+File: gsl-ref.info, Node: Simulated Annealing algorithm, Next: Simulated Annealing functions, Up: Simulated Annealing
+
+24.1 Simulated Annealing algorithm
+==================================
+
+The simulated annealing algorithm takes random walks through the problem
+space, looking for points with low energies; in these random walks, the
+probability of taking a step is determined by the Boltzmann
+distribution,
+
+ p = e^{-(E_{i+1} - E_i)/(kT)}
+
+if E_{i+1} > E_i, and p = 1 when E_{i+1} <= E_i.
+
+ In other words, a step will occur if the new energy is lower. If
+the new energy is higher, the transition can still occur, and its
+likelihood is proportional to the temperature T and inversely
+proportional to the energy difference E_{i+1} - E_i.
+
+ The temperature T is initially set to a high value, and a random
+walk is carried out at that temperature. Then the temperature is
+lowered very slightly according to a "cooling schedule", for example: T
+-> T/mu_T where \mu_T is slightly greater than 1.
+
+ The slight probability of taking a step that gives higher energy is
+what allows simulated annealing to frequently get out of local minima.
+
+
+File: gsl-ref.info, Node: Simulated Annealing functions, Next: Examples with Simulated Annealing, Prev: Simulated Annealing algorithm, Up: Simulated Annealing
+
+24.2 Simulated Annealing functions
+==================================
+
+ -- Function: void gsl_siman_solve (const gsl_rng * R, void * X0_P,
+ gsl_siman_Efunc_t EF, gsl_siman_step_t TAKE_STEP,
+ gsl_siman_metric_t DISTANCE, gsl_siman_print_t
+ PRINT_POSITION, gsl_siman_copy_t COPYFUNC,
+ gsl_siman_copy_construct_t COPY_CONSTRUCTOR,
+ gsl_siman_destroy_t DESTRUCTOR, size_t ELEMENT_SIZE,
+ gsl_siman_params_t PARAMS)
+ This function performs a simulated annealing search through a given
+ space. The space is specified by providing the functions EF and
+ DISTANCE. The simulated annealing steps are generated using the
+ random number generator R and the function TAKE_STEP.
+
+ The starting configuration of the system should be given by X0_P.
+ The routine offers two modes for updating configurations, a
+ fixed-size mode and a variable-size mode. In the fixed-size mode
+ the configuration is stored as a single block of memory of size
+ ELEMENT_SIZE. Copies of this configuration are created, copied
+ and destroyed internally using the standard library functions
+ `malloc', `memcpy' and `free'. The function pointers COPYFUNC,
+ COPY_CONSTRUCTOR and DESTRUCTOR should be null pointers in
+ fixed-size mode. In the variable-size mode the functions
+ COPYFUNC, COPY_CONSTRUCTOR and DESTRUCTOR are used to create, copy
+ and destroy configurations internally. The variable ELEMENT_SIZE
+ should be zero in the variable-size mode.
+
+ The PARAMS structure (described below) controls the run by
+ providing the temperature schedule and other tunable parameters to
+ the algorithm.
+
+ On exit the best result achieved during the search is placed in
+ `*X0_P'. If the annealing process has been successful this should
+ be a good approximation to the optimal point in the space.
+
+ If the function pointer PRINT_POSITION is not null, a debugging
+ log will be printed to `stdout' with the following columns:
+
+ number_of_iterations temperature x x-(*x0_p) Ef(x)
+
+ and the output of the function PRINT_POSITION itself. If
+ PRINT_POSITION is null then no information is printed.
+
+The simulated annealing routines require several user-specified
+functions to define the configuration space and energy function. The
+prototypes for these functions are given below.
+
+ -- Data Type: gsl_siman_Efunc_t
+ This function type should return the energy of a configuration XP.
+
+ double (*gsl_siman_Efunc_t) (void *xp)
+
+ -- Data Type: gsl_siman_step_t
+ This function type should modify the configuration XP using a
+ random step taken from the generator R, up to a maximum distance of
+ STEP_SIZE.
+
+ void (*gsl_siman_step_t) (const gsl_rng *r, void *xp,
+ double step_size)
+
+ -- Data Type: gsl_siman_metric_t
+ This function type should return the distance between two
+ configurations XP and YP.
+
+ double (*gsl_siman_metric_t) (void *xp, void *yp)
+
+ -- Data Type: gsl_siman_print_t
+ This function type should print the contents of the configuration
+ XP.
+
+ void (*gsl_siman_print_t) (void *xp)
+
+ -- Data Type: gsl_siman_copy_t
+ This function type should copy the configuration SOURCE into DEST.
+
+ void (*gsl_siman_copy_t) (void *source, void *dest)
+
+ -- Data Type: gsl_siman_copy_construct_t
+ This function type should create a new copy of the configuration
+ XP.
+
+ void * (*gsl_siman_copy_construct_t) (void *xp)
+
+ -- Data Type: gsl_siman_destroy_t
+ This function type should destroy the configuration XP, freeing its
+ memory.
+
+ void (*gsl_siman_destroy_t) (void *xp)
+
+ -- Data Type: gsl_siman_params_t
+ These are the parameters that control a run of `gsl_siman_solve'.
+ This structure contains all the information needed to control the
+ search, beyond the energy function, the step function and the
+ initial guess.
+
+ `int n_tries'
+ The number of points to try for each step.
+
+ `int iters_fixed_T'
+ The number of iterations at each temperature.
+
+ `double step_size'
+ The maximum step size in the random walk.
+
+ `double k, t_initial, mu_t, t_min'
+ The parameters of the Boltzmann distribution and cooling
+ schedule.
+
+
+File: gsl-ref.info, Node: Examples with Simulated Annealing, Next: Simulated Annealing References and Further Reading, Prev: Simulated Annealing functions, Up: Simulated Annealing
+
+24.3 Examples
+=============
+
+The simulated annealing package is clumsy, and it has to be because it
+is written in C, for C callers, and tries to be polymorphic at the same
+time. But here we provide some examples which can be pasted into your
+application with little change and should make things easier.
+
+* Menu:
+
+* Trivial example::
+* Traveling Salesman Problem::
+
+
+File: gsl-ref.info, Node: Trivial example, Next: Traveling Salesman Problem, Up: Examples with Simulated Annealing
+
+24.3.1 Trivial example
+----------------------
+
+The first example, in one dimensional cartesian space, sets up an energy
+function which is a damped sine wave; this has many local minima, but
+only one global minimum, somewhere between 1.0 and 1.5. The initial
+guess given is 15.5, which is several local minima away from the global
+minimum.
+
+ #include <math.h>
+ #include <stdlib.h>
+ #include <string.h>
+ #include <gsl/gsl_siman.h>
+
+ /* set up parameters for this simulated annealing run */
+
+ /* how many points do we try before stepping */
+ #define N_TRIES 200
+
+ /* how many iterations for each T? */
+ #define ITERS_FIXED_T 1000
+
+ /* max step size in random walk */
+ #define STEP_SIZE 1.0
+
+ /* Boltzmann constant */
+ #define K 1.0
+
+ /* initial temperature */
+ #define T_INITIAL 0.008
+
+ /* damping factor for temperature */
+ #define MU_T 1.003
+ #define T_MIN 2.0e-6
+
+ gsl_siman_params_t params
+ = {N_TRIES, ITERS_FIXED_T, STEP_SIZE,
+ K, T_INITIAL, MU_T, T_MIN};
+
+ /* now some functions to test in one dimension */
+ double E1(void *xp)
+ {
+ double x = * ((double *) xp);
+
+ return exp(-pow((x-1.0),2.0))*sin(8*x);
+ }
+
+ double M1(void *xp, void *yp)
+ {
+ double x = *((double *) xp);
+ double y = *((double *) yp);
+
+ return fabs(x - y);
+ }
+
+ void S1(const gsl_rng * r, void *xp, double step_size)
+ {
+ double old_x = *((double *) xp);
+ double new_x;
+
+ double u = gsl_rng_uniform(r);
+ new_x = u * 2 * step_size - step_size + old_x;
+
+ memcpy(xp, &new_x, sizeof(new_x));
+ }
+
+ void P1(void *xp)
+ {
+ printf ("%12g", *((double *) xp));
+ }
+
+ int
+ main(int argc, char *argv[])
+ {
+ const gsl_rng_type * T;
+ gsl_rng * r;
+
+ double x_initial = 15.5;
+
+ gsl_rng_env_setup();
+
+ T = gsl_rng_default;
+ r = gsl_rng_alloc(T);
+
+ gsl_siman_solve(r, &x_initial, E1, S1, M1, P1,
+ NULL, NULL, NULL,
+ sizeof(double), params);
+
+ gsl_rng_free (r);
+ return 0;
+ }
+
+ Here are a couple of plots that are generated by running
+`siman_test' in the following way:
+
+ $ ./siman_test | awk '!/^#/ {print $1, $4}'
+ | graph -y 1.34 1.4 -W0 -X generation -Y position
+ | plot -Tps > siman-test.eps
+ $ ./siman_test | awk '!/^#/ {print $1, $4}'
+ | graph -y -0.88 -0.83 -W0 -X generation -Y energy
+ | plot -Tps > siman-energy.eps
+
+
+File: gsl-ref.info, Node: Traveling Salesman Problem, Prev: Trivial example, Up: Examples with Simulated Annealing
+
+24.3.2 Traveling Salesman Problem
+---------------------------------
+
+The TSP ("Traveling Salesman Problem") is the classic combinatorial
+optimization problem. I have provided a very simple version of it,
+based on the coordinates of twelve cities in the southwestern United
+States. This should maybe be called the "Flying Salesman Problem",
+since I am using the great-circle distance between cities, rather than
+the driving distance. Also: I assume the earth is a sphere, so I don't
+use geoid distances.
+
+ The `gsl_siman_solve' routine finds a route which is 3490.62
+Kilometers long; this is confirmed by an exhaustive search of all
+possible routes with the same initial city.
+
+ The full code can be found in `siman/siman_tsp.c', but I include
+here some plots generated in the following way:
+
+ $ ./siman_tsp > tsp.output
+ $ grep -v "^#" tsp.output
+ | awk '{print $1, $NF}'
+ | graph -y 3300 6500 -W0 -X generation -Y distance
+ -L "TSP - 12 southwest cities"
+ | plot -Tps > 12-cities.eps
+ $ grep initial_city_coord tsp.output
+ | awk '{print $2, $3}'
+ | graph -X "longitude (- means west)" -Y "latitude"
+ -L "TSP - initial-order" -f 0.03 -S 1 0.1
+ | plot -Tps > initial-route.eps
+ $ grep final_city_coord tsp.output
+ | awk '{print $2, $3}'
+ | graph -X "longitude (- means west)" -Y "latitude"
+ -L "TSP - final-order" -f 0.03 -S 1 0.1
+ | plot -Tps > final-route.eps
+
+This is the output showing the initial order of the cities; longitude is
+negative, since it is west and I want the plot to look like a map.
+
+ # initial coordinates of cities (longitude and latitude)
+ ###initial_city_coord: -105.95 35.68 Santa Fe
+ ###initial_city_coord: -112.07 33.54 Phoenix
+ ###initial_city_coord: -106.62 35.12 Albuquerque
+ ###initial_city_coord: -103.2 34.41 Clovis
+ ###initial_city_coord: -107.87 37.29 Durango
+ ###initial_city_coord: -96.77 32.79 Dallas
+ ###initial_city_coord: -105.92 35.77 Tesuque
+ ###initial_city_coord: -107.84 35.15 Grants
+ ###initial_city_coord: -106.28 35.89 Los Alamos
+ ###initial_city_coord: -106.76 32.34 Las Cruces
+ ###initial_city_coord: -108.58 37.35 Cortez
+ ###initial_city_coord: -108.74 35.52 Gallup
+ ###initial_city_coord: -105.95 35.68 Santa Fe
+
+ The optimal route turns out to be:
+
+ # final coordinates of cities (longitude and latitude)
+ ###final_city_coord: -105.95 35.68 Santa Fe
+ ###final_city_coord: -106.28 35.89 Los Alamos
+ ###final_city_coord: -106.62 35.12 Albuquerque
+ ###final_city_coord: -107.84 35.15 Grants
+ ###final_city_coord: -107.87 37.29 Durango
+ ###final_city_coord: -108.58 37.35 Cortez
+ ###final_city_coord: -108.74 35.52 Gallup
+ ###final_city_coord: -112.07 33.54 Phoenix
+ ###final_city_coord: -106.76 32.34 Las Cruces
+ ###final_city_coord: -96.77 32.79 Dallas
+ ###final_city_coord: -103.2 34.41 Clovis
+ ###final_city_coord: -105.92 35.77 Tesuque
+ ###final_city_coord: -105.95 35.68 Santa Fe
+
+Here's a plot of the cost function (energy) versus generation (point in
+the calculation at which a new temperature is set) for this problem:
+
+
+File: gsl-ref.info, Node: Simulated Annealing References and Further Reading, Prev: Examples with Simulated Annealing, Up: Simulated Annealing
+
+24.4 References and Further Reading
+===================================
+
+Further information is available in the following book,
+
+ `Modern Heuristic Techniques for Combinatorial Problems', Colin R.
+ Reeves (ed.), McGraw-Hill, 1995 (ISBN 0-07-709239-2).
+
+
+File: gsl-ref.info, Node: Ordinary Differential Equations, Next: Interpolation, Prev: Simulated Annealing, Up: Top
+
+25 Ordinary Differential Equations
+**********************************
+
+This chapter describes functions for solving ordinary differential
+equation (ODE) initial value problems. The library provides a variety
+of low-level methods, such as Runge-Kutta and Bulirsch-Stoer routines,
+and higher-level components for adaptive step-size control. The
+components can be combined by the user to achieve the desired solution,
+with full access to any intermediate steps.
+
+ These functions are declared in the header file `gsl_odeiv.h'.
+
+* Menu:
+
+* Defining the ODE System::
+* Stepping Functions::
+* Adaptive Step-size Control::
+* Evolution::
+* ODE Example programs::
+* ODE References and Further Reading::
+
+
+File: gsl-ref.info, Node: Defining the ODE System, Next: Stepping Functions, Up: Ordinary Differential Equations
+
+25.1 Defining the ODE System
+============================
+
+The routines solve the general n-dimensional first-order system,
+
+ dy_i(t)/dt = f_i(t, y_1(t), ..., y_n(t))
+
+for i = 1, \dots, n. The stepping functions rely on the vector of
+derivatives f_i and the Jacobian matrix, J_{ij} = df_i(t,y(t)) / dy_j.
+A system of equations is defined using the `gsl_odeiv_system' datatype.
+
+ -- Data Type: gsl_odeiv_system
+ This data type defines a general ODE system with arbitrary
+ parameters.
+
+ `int (* function) (double t, const double y[], double dydt[], void * params)'
+ This function should store the vector elements
+ f_i(t,y,params) in the array DYDT, for arguments (T,Y) and
+ parameters PARAMS. The function should return `GSL_SUCCESS'
+ if the calculation was completed successfully. Any other
+ return value indicates an error.
+
+ `int (* jacobian) (double t, const double y[], double * dfdy, double dfdt[], void * params);'
+ This function should store the vector of derivative elements
+ df_i(t,y,params)/dt in the array DFDT and the Jacobian matrix
+ J_{ij} in the array DFDY, regarded as a row-ordered matrix
+ `J(i,j) = dfdy[i * dimension + j]' where `dimension' is the
+ dimension of the system. The function should return
+ `GSL_SUCCESS' if the calculation was completed successfully.
+ Any other return value indicates an error.
+
+ Some of the simpler solver algorithms do not make use of the
+ Jacobian matrix, so it is not always strictly necessary to
+ provide it (the `jacobian' element of the struct can be
+ replaced by a null pointer for those algorithms). However,
+ it is useful to provide the Jacobian to allow the solver
+ algorithms to be interchanged--the best algorithms make use
+ of the Jacobian.
+
+ `size_t dimension;'
+ This is the dimension of the system of equations.
+
+ `void * params'
+ This is a pointer to the arbitrary parameters of the system.
+
+
+File: gsl-ref.info, Node: Stepping Functions, Next: Adaptive Step-size Control, Prev: Defining the ODE System, Up: Ordinary Differential Equations
+
+25.2 Stepping Functions
+=======================
+
+The lowest level components are the "stepping functions" which advance
+a solution from time t to t+h for a fixed step-size h and estimate the
+resulting local error.
+
+ -- Function: gsl_odeiv_step * gsl_odeiv_step_alloc (const
+ gsl_odeiv_step_type * T, size_t DIM)
+ This function returns a pointer to a newly allocated instance of a
+ stepping function of type T for a system of DIM dimensions.
+
+ -- Function: int gsl_odeiv_step_reset (gsl_odeiv_step * S)
+ This function resets the stepping function S. It should be used
+ whenever the next use of S will not be a continuation of a
+ previous step.
+
+ -- Function: void gsl_odeiv_step_free (gsl_odeiv_step * S)
+ This function frees all the memory associated with the stepping
+ function S.
+
+ -- Function: const char * gsl_odeiv_step_name (const gsl_odeiv_step *
+ S)
+ This function returns a pointer to the name of the stepping
+ function. For example,
+
+ printf ("step method is '%s'\n",
+ gsl_odeiv_step_name (s));
+
+ would print something like `step method is 'rk4''.
+
+ -- Function: unsigned int gsl_odeiv_step_order (const gsl_odeiv_step *
+ S)
+ This function returns the order of the stepping function on the
+ previous step. This order can vary if the stepping function
+ itself is adaptive.
+
+ -- Function: int gsl_odeiv_step_apply (gsl_odeiv_step * S, double T,
+ double H, double Y[], double YERR[], const double DYDT_IN[],
+ double DYDT_OUT[], const gsl_odeiv_system * DYDT)
+ This function applies the stepping function S to the system of
+ equations defined by DYDT, using the step size H to advance the
+ system from time T and state Y to time T+H. The new state of the
+ system is stored in Y on output, with an estimate of the absolute
+ error in each component stored in YERR. If the argument DYDT_IN
+ is not null it should point an array containing the derivatives
+ for the system at time T on input. This is optional as the
+ derivatives will be computed internally if they are not provided,
+ but allows the reuse of existing derivative information. On
+ output the new derivatives of the system at time T+H will be
+ stored in DYDT_OUT if it is not null.
+
+ If the user-supplied functions defined in the system DYDT return a
+ status other than `GSL_SUCCESS' the step will be aborted. In this
+ case, the elements of Y will be restored to their pre-step values
+ and the error code from the user-supplied function will be
+ returned. The step-size H will be set to the step-size which
+ caused the error. If the function is called again with a smaller
+ step-size, e.g. H/10, it should be possible to get closer to any
+ singularity. To distinguish between error codes from the
+ user-supplied functions and those from `gsl_odeiv_step_apply'
+ itself, any user-defined return values should be distinct from the
+ standard GSL error codes.
+
+ The following algorithms are available,
+
+ -- Step Type: gsl_odeiv_step_rk2
+ Embedded Runge-Kutta (2, 3) method.
+
+ -- Step Type: gsl_odeiv_step_rk4
+ 4th order (classical) Runge-Kutta.
+
+ -- Step Type: gsl_odeiv_step_rkf45
+ Embedded Runge-Kutta-Fehlberg (4, 5) method. This method is a good
+ general-purpose integrator.
+
+ -- Step Type: gsl_odeiv_step_rkck
+ Embedded Runge-Kutta Cash-Karp (4, 5) method.
+
+ -- Step Type: gsl_odeiv_step_rk8pd
+ Embedded Runge-Kutta Prince-Dormand (8,9) method.
+
+ -- Step Type: gsl_odeiv_step_rk2imp
+ Implicit 2nd order Runge-Kutta at Gaussian points.
+
+ -- Step Type: gsl_odeiv_step_rk4imp
+ Implicit 4th order Runge-Kutta at Gaussian points.
+
+ -- Step Type: gsl_odeiv_step_bsimp
+ Implicit Bulirsch-Stoer method of Bader and Deuflhard. This
+ algorithm requires the Jacobian.
+
+ -- Step Type: gsl_odeiv_step_gear1
+ M=1 implicit Gear method.
+
+ -- Step Type: gsl_odeiv_step_gear2
+ M=2 implicit Gear method.
+
+
+File: gsl-ref.info, Node: Adaptive Step-size Control, Next: Evolution, Prev: Stepping Functions, Up: Ordinary Differential Equations
+
+25.3 Adaptive Step-size Control
+===============================
+
+The control function examines the proposed change to the solution
+produced by a stepping function and attempts to determine the optimal
+step-size for a user-specified level of error.
+
+ -- Function: gsl_odeiv_control * gsl_odeiv_control_standard_new
+ (double EPS_ABS, double EPS_REL, double A_Y, double A_DYDT)
+ The standard control object is a four parameter heuristic based on
+ absolute and relative errors EPS_ABS and EPS_REL, and scaling
+ factors A_Y and A_DYDT for the system state y(t) and derivatives
+ y'(t) respectively.
+
+ The step-size adjustment procedure for this method begins by
+ computing the desired error level D_i for each component,
+
+ D_i = eps_abs + eps_rel * (a_y |y_i| + a_dydt h |y'_i|)
+
+ and comparing it with the observed error E_i = |yerr_i|. If the
+ observed error E exceeds the desired error level D by more than
+ 10% for any component then the method reduces the step-size by an
+ appropriate factor,
+
+ h_new = h_old * S * (E/D)^(-1/q)
+
+ where q is the consistency order of the method (e.g. q=4 for 4(5)
+ embedded RK), and S is a safety factor of 0.9. The ratio E/D is
+ taken to be the maximum of the ratios E_i/D_i.
+
+ If the observed error E is less than 50% of the desired error
+ level D for the maximum ratio E_i/D_i then the algorithm takes the
+ opportunity to increase the step-size to bring the error in line
+ with the desired level,
+
+ h_new = h_old * S * (E/D)^(-1/(q+1))
+
+ This encompasses all the standard error scaling methods. To avoid
+ uncontrolled changes in the stepsize, the overall scaling factor is
+ limited to the range 1/5 to 5.
+
+ -- Function: gsl_odeiv_control * gsl_odeiv_control_y_new (double
+ EPS_ABS, double EPS_REL)
+ This function creates a new control object which will keep the
+ local error on each step within an absolute error of EPS_ABS and
+ relative error of EPS_REL with respect to the solution y_i(t).
+ This is equivalent to the standard control object with A_Y=1 and
+ A_DYDT=0.
+
+ -- Function: gsl_odeiv_control * gsl_odeiv_control_yp_new (double
+ EPS_ABS, double EPS_REL)
+ This function creates a new control object which will keep the
+ local error on each step within an absolute error of EPS_ABS and
+ relative error of EPS_REL with respect to the derivatives of the
+ solution y'_i(t). This is equivalent to the standard control
+ object with A_Y=0 and A_DYDT=1.
+
+ -- Function: gsl_odeiv_control * gsl_odeiv_control_scaled_new (double
+ EPS_ABS, double EPS_REL, double A_Y, double A_DYDT, const
+ double SCALE_ABS[], size_t DIM)
+ This function creates a new control object which uses the same
+ algorithm as `gsl_odeiv_control_standard_new' but with an absolute
+ error which is scaled for each component by the array SCALE_ABS.
+ The formula for D_i for this control object is,
+
+ D_i = eps_abs * s_i + eps_rel * (a_y |y_i| + a_dydt h |y'_i|)
+
+ where s_i is the i-th component of the array SCALE_ABS. The same
+ error control heuristic is used by the Matlab ODE suite.
+
+ -- Function: gsl_odeiv_control * gsl_odeiv_control_alloc (const
+ gsl_odeiv_control_type * T)
+ This function returns a pointer to a newly allocated instance of a
+ control function of type T. This function is only needed for
+ defining new types of control functions. For most purposes the
+ standard control functions described above should be sufficient.
+
+ -- Function: int gsl_odeiv_control_init (gsl_odeiv_control * C, double
+ EPS_ABS, double EPS_REL, double A_Y, double A_DYDT)
+ This function initializes the control function C with the
+ parameters EPS_ABS (absolute error), EPS_REL (relative error), A_Y
+ (scaling factor for y) and A_DYDT (scaling factor for derivatives).
+
+ -- Function: void gsl_odeiv_control_free (gsl_odeiv_control * C)
+ This function frees all the memory associated with the control
+ function C.
+
+ -- Function: int gsl_odeiv_control_hadjust (gsl_odeiv_control * C,
+ gsl_odeiv_step * S, const double Y[], const double YERR[],
+ const double DYDT[], double * H)
+ This function adjusts the step-size H using the control function
+ C, and the current values of Y, YERR and DYDT. The stepping
+ function STEP is also needed to determine the order of the method.
+ If the error in the y-values YERR is found to be too large then
+ the step-size H is reduced and the function returns
+ `GSL_ODEIV_HADJ_DEC'. If the error is sufficiently small then H
+ may be increased and `GSL_ODEIV_HADJ_INC' is returned. The
+ function returns `GSL_ODEIV_HADJ_NIL' if the step-size is
+ unchanged. The goal of the function is to estimate the largest
+ step-size which satisfies the user-specified accuracy requirements
+ for the current point.
+
+ -- Function: const char * gsl_odeiv_control_name (const
+ gsl_odeiv_control * C)
+ This function returns a pointer to the name of the control
+ function. For example,
+
+ printf ("control method is '%s'\n",
+ gsl_odeiv_control_name (c));
+
+ would print something like `control method is 'standard''
+
+
+File: gsl-ref.info, Node: Evolution, Next: ODE Example programs, Prev: Adaptive Step-size Control, Up: Ordinary Differential Equations
+
+25.4 Evolution
+==============
+
+The highest level of the system is the evolution function which combines
+the results of a stepping function and control function to reliably
+advance the solution forward over an interval (t_0, t_1). If the
+control function signals that the step-size should be decreased the
+evolution function backs out of the current step and tries the proposed
+smaller step-size. This process is continued until an acceptable
+step-size is found.
+
+ -- Function: gsl_odeiv_evolve * gsl_odeiv_evolve_alloc (size_t DIM)
+ This function returns a pointer to a newly allocated instance of an
+ evolution function for a system of DIM dimensions.
+
+ -- Function: int gsl_odeiv_evolve_apply (gsl_odeiv_evolve * E,
+ gsl_odeiv_control * CON, gsl_odeiv_step * STEP, const
+ gsl_odeiv_system * DYDT, double * T, double T1, double * H,
+ double Y[])
+ This function advances the system (E, DYDT) from time T and
+ position Y using the stepping function STEP. The new time and
+ position are stored in T and Y on output. The initial step-size
+ is taken as H, but this will be modified using the control
+ function C to achieve the appropriate error bound if necessary.
+ The routine may make several calls to STEP in order to determine
+ the optimum step-size. An estimate of the local error for the step
+ can be obtained from the components of the array `E->yerr[]'. If
+ the step-size has been changed the value of H will be modified on
+ output. The maximum time T1 is guaranteed not to be exceeded by
+ the time-step. On the final time-step the value of T will be set
+ to T1 exactly.
+
+ If the user-supplied functions defined in the system DYDT return a
+ status other than `GSL_SUCCESS' the step will be aborted. In this
+ case, T and Y will be restored to their pre-step values and the
+ error code from the user-supplied function will be returned. To
+ distinguish between error codes from the user-supplied functions
+ and those from `gsl_odeiv_evolve_apply' itself, any user-defined
+ return values should be distinct from the standard GSL error codes.
+
+ -- Function: int gsl_odeiv_evolve_reset (gsl_odeiv_evolve * E)
+ This function resets the evolution function E. It should be used
+ whenever the next use of E will not be a continuation of a
+ previous step.
+
+ -- Function: void gsl_odeiv_evolve_free (gsl_odeiv_evolve * E)
+ This function frees all the memory associated with the evolution
+ function E.
+
+
+File: gsl-ref.info, Node: ODE Example programs, Next: ODE References and Further Reading, Prev: Evolution, Up: Ordinary Differential Equations
+
+25.5 Examples
+=============
+
+The following program solves the second-order nonlinear Van der Pol
+oscillator equation,
+
+ x''(t) + \mu x'(t) (x(t)^2 - 1) + x(t) = 0
+
+This can be converted into a first order system suitable for use with
+the routines described in this chapter by introducing a separate
+variable for the velocity, y = x'(t),
+
+ x' = y
+ y' = -x + \mu y (1-x^2)
+
+The program begins by defining functions for these derivatives and
+their Jacobian,
+
+ #include <stdio.h>
+ #include <gsl/gsl_errno.h>
+ #include <gsl/gsl_matrix.h>
+ #include <gsl/gsl_odeiv.h>
+
+ int
+ func (double t, const double y[], double f[],
+ void *params)
+ {
+ double mu = *(double *)params;
+ f[0] = y[1];
+ f[1] = -y[0] - mu*y[1]*(y[0]*y[0] - 1);
+ return GSL_SUCCESS;
+ }
+
+ int
+ jac (double t, const double y[], double *dfdy,
+ double dfdt[], void *params)
+ {
+ double mu = *(double *)params;
+ gsl_matrix_view dfdy_mat
+ = gsl_matrix_view_array (dfdy, 2, 2);
+ gsl_matrix * m = &dfdy_mat.matrix;
+ gsl_matrix_set (m, 0, 0, 0.0);
+ gsl_matrix_set (m, 0, 1, 1.0);
+ gsl_matrix_set (m, 1, 0, -2.0*mu*y[0]*y[1] - 1.0);
+ gsl_matrix_set (m, 1, 1, -mu*(y[0]*y[0] - 1.0));
+ dfdt[0] = 0.0;
+ dfdt[1] = 0.0;
+ return GSL_SUCCESS;
+ }
+
+ int
+ main (void)
+ {
+ const gsl_odeiv_step_type * T
+ = gsl_odeiv_step_rk8pd;
+
+ gsl_odeiv_step * s
+ = gsl_odeiv_step_alloc (T, 2);
+ gsl_odeiv_control * c
+ = gsl_odeiv_control_y_new (1e-6, 0.0);
+ gsl_odeiv_evolve * e
+ = gsl_odeiv_evolve_alloc (2);
+
+ double mu = 10;
+ gsl_odeiv_system sys = {func, jac, 2, &mu};
+
+ double t = 0.0, t1 = 100.0;
+ double h = 1e-6;
+ double y[2] = { 1.0, 0.0 };
+
+ while (t < t1)
+ {
+ int status = gsl_odeiv_evolve_apply (e, c, s,
+ &sys,
+ &t, t1,
+ &h, y);
+
+ if (status != GSL_SUCCESS)
+ break;
+
+ printf ("%.5e %.5e %.5e\n", t, y[0], y[1]);
+ }
+
+ gsl_odeiv_evolve_free (e);
+ gsl_odeiv_control_free (c);
+ gsl_odeiv_step_free (s);
+ return 0;
+ }
+
+For functions with multiple parameters, the appropriate information can
+be passed in through the PARAMS argument using a pointer to a struct.
+
+ The main loop of the program evolves the solution from (y, y') = (1,
+0) at t=0 to t=100. The step-size h is automatically adjusted by the
+controller to maintain an absolute accuracy of 10^{-6} in the function
+values Y.
+
+To obtain the values at regular intervals, rather than the variable
+spacings chosen by the control function, the main loop can be modified
+to advance the solution from one point to the next. For example, the
+following main loop prints the solution at the fixed points t = 0, 1,
+2, \dots, 100,
+
+ for (i = 1; i <= 100; i++)
+ {
+ double ti = i * t1 / 100.0;
+
+ while (t < ti)
+ {
+ gsl_odeiv_evolve_apply (e, c, s,
+ &sys,
+ &t, ti, &h,
+ y);
+ }
+
+ printf ("%.5e %.5e %.5e\n", t, y[0], y[1]);
+ }
+
+It is also possible to work with a non-adaptive integrator, using only
+the stepping function itself. The following program uses the `rk4'
+fourth-order Runge-Kutta stepping function with a fixed stepsize of
+0.01,
+
+ int
+ main (void)
+ {
+ const gsl_odeiv_step_type * T
+ = gsl_odeiv_step_rk4;
+
+ gsl_odeiv_step * s
+ = gsl_odeiv_step_alloc (T, 2);
+
+ double mu = 10;
+ gsl_odeiv_system sys = {func, jac, 2, &mu};
+
+ double t = 0.0, t1 = 100.0;
+ double h = 1e-2;
+ double y[2] = { 1.0, 0.0 }, y_err[2];
+ double dydt_in[2], dydt_out[2];
+
+ /* initialise dydt_in from system parameters */
+ GSL_ODEIV_FN_EVAL(&sys, t, y, dydt_in);
+
+ while (t < t1)
+ {
+ int status = gsl_odeiv_step_apply (s, t, h,
+ y, y_err,
+ dydt_in,
+ dydt_out,
+ &sys);
+
+ if (status != GSL_SUCCESS)
+ break;
+
+ dydt_in[0] = dydt_out[0];
+ dydt_in[1] = dydt_out[1];
+
+ t += h;
+
+ printf ("%.5e %.5e %.5e\n", t, y[0], y[1]);
+ }
+
+ gsl_odeiv_step_free (s);
+ return 0;
+ }
+
+The derivatives must be initialized for the starting point t=0 before
+the first step is taken. Subsequent steps use the output derivatives
+DYDT_OUT as inputs to the next step by copying their values into
+DYDT_IN.
+
+
+File: gsl-ref.info, Node: ODE References and Further Reading, Prev: ODE Example programs, Up: Ordinary Differential Equations
+
+25.6 References and Further Reading
+===================================
+
+Many of the basic Runge-Kutta formulas can be found in the Handbook of
+Mathematical Functions,
+
+ Abramowitz & Stegun (eds.), `Handbook of Mathematical Functions',
+ Section 25.5.
+
+The implicit Bulirsch-Stoer algorithm `bsimp' is described in the
+following paper,
+
+ G. Bader and P. Deuflhard, "A Semi-Implicit Mid-Point Rule for
+ Stiff Systems of Ordinary Differential Equations.", Numer. Math.
+ 41, 373-398, 1983.
+
+
+File: gsl-ref.info, Node: Interpolation, Next: Numerical Differentiation, Prev: Ordinary Differential Equations, Up: Top
+
+26 Interpolation
+****************
+
+This chapter describes functions for performing interpolation. The
+library provides a variety of interpolation methods, including Cubic
+splines and Akima splines. The interpolation types are interchangeable,
+allowing different methods to be used without recompiling.
+Interpolations can be defined for both normal and periodic boundary
+conditions. Additional functions are available for computing
+derivatives and integrals of interpolating functions.
+
+ The functions described in this section are declared in the header
+files `gsl_interp.h' and `gsl_spline.h'.
+
+* Menu:
+
+* Introduction to Interpolation::
+* Interpolation Functions::
+* Interpolation Types::
+* Index Look-up and Acceleration::
+* Evaluation of Interpolating Functions::
+* Higher-level Interface::
+* Interpolation Example programs::
+* Interpolation References and Further Reading::
+
+
+File: gsl-ref.info, Node: Introduction to Interpolation, Next: Interpolation Functions, Up: Interpolation
+
+26.1 Introduction
+=================
+
+Given a set of data points (x_1, y_1) \dots (x_n, y_n) the routines
+described in this section compute a continuous interpolating function
+y(x) such that y(x_i) = y_i. The interpolation is piecewise smooth,
+and its behavior at the end-points is determined by the type of
+interpolation used.
+
+
+File: gsl-ref.info, Node: Interpolation Functions, Next: Interpolation Types, Prev: Introduction to Interpolation, Up: Interpolation
+
+26.2 Interpolation Functions
+============================
+
+The interpolation function for a given dataset is stored in a
+`gsl_interp' object. These are created by the following functions.
+
+ -- Function: gsl_interp * gsl_interp_alloc (const gsl_interp_type * T,
+ size_t SIZE)
+ This function returns a pointer to a newly allocated interpolation
+ object of type T for SIZE data-points.
+
+ -- Function: int gsl_interp_init (gsl_interp * INTERP, const double
+ XA[], const double YA[], size_t SIZE)
+ This function initializes the interpolation object INTERP for the
+ data (XA,YA) where XA and YA are arrays of size SIZE. The
+ interpolation object (`gsl_interp') does not save the data arrays
+ XA and YA and only stores the static state computed from the data.
+ The XA data array is always assumed to be strictly ordered; the
+ behavior for other arrangements is not defined.
+
+ -- Function: void gsl_interp_free (gsl_interp * INTERP)
+ This function frees the interpolation object INTERP.
+
+
+File: gsl-ref.info, Node: Interpolation Types, Next: Index Look-up and Acceleration, Prev: Interpolation Functions, Up: Interpolation
+
+26.3 Interpolation Types
+========================
+
+The interpolation library provides five interpolation types:
+
+ -- Interpolation Type: gsl_interp_linear
+ Linear interpolation. This interpolation method does not require
+ any additional memory.
+
+ -- Interpolation Type: gsl_interp_polynomial
+ Polynomial interpolation. This method should only be used for
+ interpolating small numbers of points because polynomial
+ interpolation introduces large oscillations, even for well-behaved
+ datasets. The number of terms in the interpolating polynomial is
+ equal to the number of points.
+
+ -- Interpolation Type: gsl_interp_cspline
+ Cubic spline with natural boundary conditions. The resulting
+ curve is piecewise cubic on each interval, with matching first and
+ second derivatives at the supplied data-points. The second
+ derivative is chosen to be zero at the first point and last point.
+
+ -- Interpolation Type: gsl_interp_cspline_periodic
+ Cubic spline with periodic boundary conditions. The resulting
+ curve is piecewise cubic on each interval, with matching first and
+ second derivatives at the supplied data-points. The derivatives
+ at the first and last points are also matched. Note that the last
+ point in the data must have the same y-value as the first point,
+ otherwise the resulting periodic interpolation will have a
+ discontinuity at the boundary.
+
+
+ -- Interpolation Type: gsl_interp_akima
+ Non-rounded Akima spline with natural boundary conditions. This
+ method uses the non-rounded corner algorithm of Wodicka.
+
+ -- Interpolation Type: gsl_interp_akima_periodic
+ Non-rounded Akima spline with periodic boundary conditions. This
+ method uses the non-rounded corner algorithm of Wodicka.
+
+ The following related functions are available:
+
+ -- Function: const char * gsl_interp_name (const gsl_interp * INTERP)
+ This function returns the name of the interpolation type used by
+ INTERP. For example,
+
+ printf ("interp uses '%s' interpolation.\n",
+ gsl_interp_name (interp));
+
+ would print something like,
+
+ interp uses 'cspline' interpolation.
+
+ -- Function: unsigned int gsl_interp_min_size (const gsl_interp *
+ INTERP)
+ This function returns the minimum number of points required by the
+ interpolation type of INTERP. For example, Akima spline
+ interpolation requires a minimum of 5 points.
+
+
+File: gsl-ref.info, Node: Index Look-up and Acceleration, Next: Evaluation of Interpolating Functions, Prev: Interpolation Types, Up: Interpolation
+
+26.4 Index Look-up and Acceleration
+===================================
+
+The state of searches can be stored in a `gsl_interp_accel' object,
+which is a kind of iterator for interpolation lookups. It caches the
+previous value of an index lookup. When the subsequent interpolation
+point falls in the same interval its index value can be returned
+immediately.
+
+ -- Function: size_t gsl_interp_bsearch (const double X_ARRAY[], double
+ X, size_t INDEX_LO, size_t INDEX_HI)
+ This function returns the index i of the array X_ARRAY such that
+ `x_array[i] <= x < x_array[i+1]'. The index is searched for in
+ the range [INDEX_LO,INDEX_HI].
+
+ -- Function: gsl_interp_accel * gsl_interp_accel_alloc (void)
+ This function returns a pointer to an accelerator object, which is
+ a kind of iterator for interpolation lookups. It tracks the state
+ of lookups, thus allowing for application of various acceleration
+ strategies.
+
+ -- Function: size_t gsl_interp_accel_find (gsl_interp_accel * A, const
+ double X_ARRAY[], size_t SIZE, double X)
+ This function performs a lookup action on the data array X_ARRAY
+ of size SIZE, using the given accelerator A. This is how lookups
+ are performed during evaluation of an interpolation. The function
+ returns an index i such that `x_array[i] <= x < x_array[i+1]'.
+
+ -- Function: void gsl_interp_accel_free (gsl_interp_accel* ACC)
+ This function frees the accelerator object ACC.
+
+
+File: gsl-ref.info, Node: Evaluation of Interpolating Functions, Next: Higher-level Interface, Prev: Index Look-up and Acceleration, Up: Interpolation
+
+26.5 Evaluation of Interpolating Functions
+==========================================
+
+ -- Function: double gsl_interp_eval (const gsl_interp * INTERP, const
+ double XA[], const double YA[], double X, gsl_interp_accel *
+ ACC)
+ -- Function: int gsl_interp_eval_e (const gsl_interp * INTERP, const
+ double XA[], const double YA[], double X, gsl_interp_accel *
+ ACC, double * Y)
+ These functions return the interpolated value of Y for a given
+ point X, using the interpolation object INTERP, data arrays XA and
+ YA and the accelerator ACC.
+
+ -- Function: double gsl_interp_eval_deriv (const gsl_interp * INTERP,
+ const double XA[], const double YA[], double X,
+ gsl_interp_accel * ACC)
+ -- Function: int gsl_interp_eval_deriv_e (const gsl_interp * INTERP,
+ const double XA[], const double YA[], double X,
+ gsl_interp_accel * ACC, double * D)
+ These functions return the derivative D of an interpolated
+ function for a given point X, using the interpolation object
+ INTERP, data arrays XA and YA and the accelerator ACC.
+
+ -- Function: double gsl_interp_eval_deriv2 (const gsl_interp * INTERP,
+ const double XA[], const double YA[], double X,
+ gsl_interp_accel * ACC)
+ -- Function: int gsl_interp_eval_deriv2_e (const gsl_interp * INTERP,
+ const double XA[], const double YA[], double X,
+ gsl_interp_accel * ACC, double * D2)
+ These functions return the second derivative D2 of an interpolated
+ function for a given point X, using the interpolation object
+ INTERP, data arrays XA and YA and the accelerator ACC.
+
+ -- Function: double gsl_interp_eval_integ (const gsl_interp * INTERP,
+ const double XA[], const double YA[], double A, double B,
+ gsl_interp_accel * ACC)
+ -- Function: int gsl_interp_eval_integ_e (const gsl_interp * INTERP,
+ const double XA[], const double YA[], double A, double B,
+ gsl_interp_accel * ACC, double * RESULT)
+ These functions return the numerical integral RESULT of an
+ interpolated function over the range [A, B], using the
+ interpolation object INTERP, data arrays XA and YA and the
+ accelerator ACC.
+
+
+File: gsl-ref.info, Node: Higher-level Interface, Next: Interpolation Example programs, Prev: Evaluation of Interpolating Functions, Up: Interpolation
+
+26.6 Higher-level Interface
+===========================
+
+The functions described in the previous sections required the user to
+supply pointers to the x and y arrays on each call. The following
+functions are equivalent to the corresponding `gsl_interp' functions
+but maintain a copy of this data in the `gsl_spline' object. This
+removes the need to pass both XA and YA as arguments on each
+evaluation. These functions are defined in the header file
+`gsl_spline.h'.
+
+ -- Function: gsl_spline * gsl_spline_alloc (const gsl_interp_type * T,
+ size_t SIZE)
+
+ -- Function: int gsl_spline_init (gsl_spline * SPLINE, const double
+ XA[], const double YA[], size_t SIZE)
+
+ -- Function: void gsl_spline_free (gsl_spline * SPLINE)
+
+ -- Function: const char * gsl_spline_name (const gsl_spline * SPLINE)
+
+ -- Function: unsigned int gsl_spline_min_size (const gsl_spline *
+ SPLINE)
+
+ -- Function: double gsl_spline_eval (const gsl_spline * SPLINE, double
+ X, gsl_interp_accel * ACC)
+ -- Function: int gsl_spline_eval_e (const gsl_spline * SPLINE, double
+ X, gsl_interp_accel * ACC, double * Y)
+
+ -- Function: double gsl_spline_eval_deriv (const gsl_spline * SPLINE,
+ double X, gsl_interp_accel * ACC)
+ -- Function: int gsl_spline_eval_deriv_e (const gsl_spline * SPLINE,
+ double X, gsl_interp_accel * ACC, double * D)
+
+ -- Function: double gsl_spline_eval_deriv2 (const gsl_spline * SPLINE,
+ double X, gsl_interp_accel * ACC)
+ -- Function: int gsl_spline_eval_deriv2_e (const gsl_spline * SPLINE,
+ double X, gsl_interp_accel * ACC, double * D2)
+
+ -- Function: double gsl_spline_eval_integ (const gsl_spline * SPLINE,
+ double A, double B, gsl_interp_accel * ACC)
+ -- Function: int gsl_spline_eval_integ_e (const gsl_spline * SPLINE,
+ double A, double B, gsl_interp_accel * ACC, double * RESULT)
+
+
+File: gsl-ref.info, Node: Interpolation Example programs, Next: Interpolation References and Further Reading, Prev: Higher-level Interface, Up: Interpolation
+
+26.7 Examples
+=============
+
+The following program demonstrates the use of the interpolation and
+spline functions. It computes a cubic spline interpolation of the
+10-point dataset (x_i, y_i) where x_i = i + \sin(i)/2 and y_i = i +
+\cos(i^2) for i = 0 \dots 9.
+
+ #include <stdlib.h>
+ #include <stdio.h>
+ #include <math.h>
+ #include <gsl/gsl_errno.h>
+ #include <gsl/gsl_spline.h>
+
+ int
+ main (void)
+ {
+ int i;
+ double xi, yi, x[10], y[10];
+
+ printf ("#m=0,S=2\n");
+
+ for (i = 0; i < 10; i++)
+ {
+ x[i] = i + 0.5 * sin (i);
+ y[i] = i + cos (i * i);
+ printf ("%g %g\n", x[i], y[i]);
+ }
+
+ printf ("#m=1,S=0\n");
+
+ {
+ gsl_interp_accel *acc
+ = gsl_interp_accel_alloc ();
+ gsl_spline *spline
+ = gsl_spline_alloc (gsl_interp_cspline, 10);
+
+ gsl_spline_init (spline, x, y, 10);
+
+ for (xi = x[0]; xi < x[9]; xi += 0.01)
+ {
+ yi = gsl_spline_eval (spline, xi, acc);
+ printf ("%g %g\n", xi, yi);
+ }
+ gsl_spline_free (spline);
+ gsl_interp_accel_free (acc);
+ }
+ return 0;
+ }
+
+The output is designed to be used with the GNU plotutils `graph'
+program,
+
+ $ ./a.out > interp.dat
+ $ graph -T ps < interp.dat > interp.ps
+
+The result shows a smooth interpolation of the original points. The
+interpolation method can changed simply by varying the first argument of
+`gsl_spline_alloc'.
+
+ The next program demonstrates a periodic cubic spline with 4 data
+points. Note that the first and last points must be supplied with the
+same y-value for a periodic spline.
+
+ #include <stdlib.h>
+ #include <stdio.h>
+ #include <math.h>
+ #include <gsl/gsl_errno.h>
+ #include <gsl/gsl_spline.h>
+
+ int
+ main (void)
+ {
+ int N = 4;
+ double x[4] = {0.00, 0.10, 0.27, 0.30};
+ double y[4] = {0.15, 0.70, -0.10, 0.15}; /* Note: first = last
+ for periodic data */
+
+ gsl_interp_accel *acc = gsl_interp_accel_alloc ();
+ const gsl_interp_type *t = gsl_interp_cspline_periodic;
+ gsl_spline *spline = gsl_spline_alloc (t, N);
+
+ int i; double xi, yi;
+
+ printf ("#m=0,S=5\n");
+ for (i = 0; i < N; i++)
+ {
+ printf ("%g %g\n", x[i], y[i]);
+ }
+
+ printf ("#m=1,S=0\n");
+ gsl_spline_init (spline, x, y, N);
+
+ for (i = 0; i <= 100; i++)
+ {
+ xi = (1 - i / 100.0) * x[0] + (i / 100.0) * x[N-1];
+ yi = gsl_spline_eval (spline, xi, acc);
+ printf ("%g %g\n", xi, yi);
+ }
+
+ gsl_spline_free (spline);
+ gsl_interp_accel_free (acc);
+ return 0;
+ }
+
+The output can be plotted with GNU `graph'.
+
+ $ ./a.out > interp.dat
+ $ graph -T ps < interp.dat > interp.ps
+
+The result shows a periodic interpolation of the original points. The
+slope of the fitted curve is the same at the beginning and end of the
+data, and the second derivative is also.
+
+
+File: gsl-ref.info, Node: Interpolation References and Further Reading, Prev: Interpolation Example programs, Up: Interpolation
+
+26.8 References and Further Reading
+===================================
+
+Descriptions of the interpolation algorithms and further references can
+be found in the following books:
+
+ C.W. Ueberhuber, `Numerical Computation (Volume 1), Chapter 9
+ "Interpolation"', Springer (1997), ISBN 3-540-62058-3.
+
+ D.M. Young, R.T. Gregory `A Survey of Numerical Mathematics
+ (Volume 1), Chapter 6.8', Dover (1988), ISBN 0-486-65691-8.
+
+
+
+File: gsl-ref.info, Node: Numerical Differentiation, Next: Chebyshev Approximations, Prev: Interpolation, Up: Top
+
+27 Numerical Differentiation
+****************************
+
+The functions described in this chapter compute numerical derivatives by
+finite differencing. An adaptive algorithm is used to find the best
+choice of finite difference and to estimate the error in the derivative.
+These functions are declared in the header file `gsl_deriv.h'.
+
+* Menu:
+
+* Numerical Differentiation functions::
+* Numerical Differentiation Examples::
+* Numerical Differentiation References::
+
+
+File: gsl-ref.info, Node: Numerical Differentiation functions, Next: Numerical Differentiation Examples, Up: Numerical Differentiation
+
+27.1 Functions
+==============
+
+ -- Function: int gsl_deriv_central (const gsl_function * F, double X,
+ double H, double * RESULT, double * ABSERR)
+ This function computes the numerical derivative of the function F
+ at the point X using an adaptive central difference algorithm with
+ a step-size of H. The derivative is returned in RESULT and an
+ estimate of its absolute error is returned in ABSERR.
+
+ The initial value of H is used to estimate an optimal step-size,
+ based on the scaling of the truncation error and round-off error
+ in the derivative calculation. The derivative is computed using a
+ 5-point rule for equally spaced abscissae at x-h, x-h/2, x, x+h/2,
+ x+h, with an error estimate taken from the difference between the
+ 5-point rule and the corresponding 3-point rule x-h, x, x+h. Note
+ that the value of the function at x does not contribute to the
+ derivative calculation, so only 4-points are actually used.
+
+ -- Function: int gsl_deriv_forward (const gsl_function * F, double X,
+ double H, double * RESULT, double * ABSERR)
+ This function computes the numerical derivative of the function F
+ at the point X using an adaptive forward difference algorithm with
+ a step-size of H. The function is evaluated only at points greater
+ than X, and never at X itself. The derivative is returned in
+ RESULT and an estimate of its absolute error is returned in
+ ABSERR. This function should be used if f(x) has a discontinuity
+ at X, or is undefined for values less than X.
+
+ The initial value of H is used to estimate an optimal step-size,
+ based on the scaling of the truncation error and round-off error
+ in the derivative calculation. The derivative at x is computed
+ using an "open" 4-point rule for equally spaced abscissae at x+h/4,
+ x+h/2, x+3h/4, x+h, with an error estimate taken from the
+ difference between the 4-point rule and the corresponding 2-point
+ rule x+h/2, x+h.
+
+ -- Function: int gsl_deriv_backward (const gsl_function * F, double X,
+ double H, double * RESULT, double * ABSERR)
+ This function computes the numerical derivative of the function F
+ at the point X using an adaptive backward difference algorithm
+ with a step-size of H. The function is evaluated only at points
+ less than X, and never at X itself. The derivative is returned in
+ RESULT and an estimate of its absolute error is returned in
+ ABSERR. This function should be used if f(x) has a discontinuity
+ at X, or is undefined for values greater than X.
+
+ This function is equivalent to calling `gsl_deriv_forward' with a
+ negative step-size.
+
+
+File: gsl-ref.info, Node: Numerical Differentiation Examples, Next: Numerical Differentiation References, Prev: Numerical Differentiation functions, Up: Numerical Differentiation
+
+27.2 Examples
+=============
+
+The following code estimates the derivative of the function f(x) =
+x^{3/2} at x=2 and at x=0. The function f(x) is undefined for x<0 so
+the derivative at x=0 is computed using `gsl_deriv_forward'.
+
+ #include <stdio.h>
+ #include <gsl/gsl_math.h>
+ #include <gsl/gsl_deriv.h>
+
+ double f (double x, void * params)
+ {
+ return pow (x, 1.5);
+ }
+
+ int
+ main (void)
+ {
+ gsl_function F;
+ double result, abserr;
+
+ F.function = &f;
+ F.params = 0;
+
+ printf ("f(x) = x^(3/2)\n");
+
+ gsl_deriv_central (&F, 2.0, 1e-8, &result, &abserr);
+ printf ("x = 2.0\n");
+ printf ("f'(x) = %.10f +/- %.10f\n", result, abserr);
+ printf ("exact = %.10f\n\n", 1.5 * sqrt(2.0));
+
+ gsl_deriv_forward (&F, 0.0, 1e-8, &result, &abserr);
+ printf ("x = 0.0\n");
+ printf ("f'(x) = %.10f +/- %.10f\n", result, abserr);
+ printf ("exact = %.10f\n", 0.0);
+
+ return 0;
+ }
+
+Here is the output of the program,
+
+ $ ./a.out
+ f(x) = x^(3/2)
+ x = 2.0
+ f'(x) = 2.1213203120 +/- 0.0000004064
+ exact = 2.1213203436
+
+ x = 0.0
+ f'(x) = 0.0000000160 +/- 0.0000000339
+ exact = 0.0000000000
+
+
+File: gsl-ref.info, Node: Numerical Differentiation References, Prev: Numerical Differentiation Examples, Up: Numerical Differentiation
+
+27.3 References and Further Reading
+===================================
+
+The algorithms used by these functions are described in the following
+sources:
+
+ Abramowitz and Stegun, `Handbook of Mathematical Functions',
+ Section 25.3.4, and Table 25.5 (Coefficients for Differentiation).
+
+ S.D. Conte and Carl de Boor, `Elementary Numerical Analysis: An
+ Algorithmic Approach', McGraw-Hill, 1972.
+
+
+File: gsl-ref.info, Node: Chebyshev Approximations, Next: Series Acceleration, Prev: Numerical Differentiation, Up: Top
+
+28 Chebyshev Approximations
+***************************
+
+This chapter describes routines for computing Chebyshev approximations
+to univariate functions. A Chebyshev approximation is a truncation of
+the series f(x) = \sum c_n T_n(x), where the Chebyshev polynomials
+T_n(x) = \cos(n \arccos x) provide an orthogonal basis of polynomials
+on the interval [-1,1] with the weight function 1 / \sqrt{1-x^2}. The
+first few Chebyshev polynomials are, T_0(x) = 1, T_1(x) = x, T_2(x) = 2
+x^2 - 1. For further information see Abramowitz & Stegun, Chapter 22.
+
+ The functions described in this chapter are declared in the header
+file `gsl_chebyshev.h'.
+
+* Menu:
+
+* Chebyshev Definitions::
+* Creation and Calculation of Chebyshev Series::
+* Chebyshev Series Evaluation::
+* Derivatives and Integrals::
+* Chebyshev Approximation examples::
+* Chebyshev Approximation References and Further Reading::
+
+
+File: gsl-ref.info, Node: Chebyshev Definitions, Next: Creation and Calculation of Chebyshev Series, Up: Chebyshev Approximations
+
+28.1 Definitions
+================
+
+A Chebyshev series is stored using the following structure,
+
+ typedef struct
+ {
+ double * c; /* coefficients c[0] .. c[order] */
+ int order; /* order of expansion */
+ double a; /* lower interval point */
+ double b; /* upper interval point */
+ ...
+ } gsl_cheb_series
+
+The approximation is made over the range [a,b] using ORDER+1 terms,
+including the coefficient c[0]. The series is computed using the
+following convention,
+
+ f(x) = (c_0 / 2) + \sum_{n=1} c_n T_n(x)
+
+which is needed when accessing the coefficients directly.
+
+
+File: gsl-ref.info, Node: Creation and Calculation of Chebyshev Series, Next: Chebyshev Series Evaluation, Prev: Chebyshev Definitions, Up: Chebyshev Approximations
+
+28.2 Creation and Calculation of Chebyshev Series
+=================================================
+
+ -- Function: gsl_cheb_series * gsl_cheb_alloc (const size_t N)
+ This function allocates space for a Chebyshev series of order N
+ and returns a pointer to a new `gsl_cheb_series' struct.
+
+ -- Function: void gsl_cheb_free (gsl_cheb_series * CS)
+ This function frees a previously allocated Chebyshev series CS.
+
+ -- Function: int gsl_cheb_init (gsl_cheb_series * CS, const
+ gsl_function * F, const double A, const double B)
+ This function computes the Chebyshev approximation CS for the
+ function F over the range (a,b) to the previously specified order.
+ The computation of the Chebyshev approximation is an O(n^2)
+ process, and requires n function evaluations.
+
+
+File: gsl-ref.info, Node: Chebyshev Series Evaluation, Next: Derivatives and Integrals, Prev: Creation and Calculation of Chebyshev Series, Up: Chebyshev Approximations
+
+28.3 Chebyshev Series Evaluation
+================================
+
+ -- Function: double gsl_cheb_eval (const gsl_cheb_series * CS, double
+ X)
+ This function evaluates the Chebyshev series CS at a given point X.
+
+ -- Function: int gsl_cheb_eval_err (const gsl_cheb_series * CS, const
+ double X, double * RESULT, double * ABSERR)
+ This function computes the Chebyshev series CS at a given point X,
+ estimating both the series RESULT and its absolute error ABSERR.
+ The error estimate is made from the first neglected term in the
+ series.
+
+ -- Function: double gsl_cheb_eval_n (const gsl_cheb_series * CS,
+ size_t ORDER, double X)
+ This function evaluates the Chebyshev series CS at a given point
+ N, to (at most) the given order ORDER.
+
+ -- Function: int gsl_cheb_eval_n_err (const gsl_cheb_series * CS,
+ const size_t ORDER, const double X, double * RESULT, double *
+ ABSERR)
+ This function evaluates a Chebyshev series CS at a given point X,
+ estimating both the series RESULT and its absolute error ABSERR,
+ to (at most) the given order ORDER. The error estimate is made
+ from the first neglected term in the series.
+
+
+File: gsl-ref.info, Node: Derivatives and Integrals, Next: Chebyshev Approximation examples, Prev: Chebyshev Series Evaluation, Up: Chebyshev Approximations
+
+28.4 Derivatives and Integrals
+==============================
+
+The following functions allow a Chebyshev series to be differentiated or
+integrated, producing a new Chebyshev series. Note that the error
+estimate produced by evaluating the derivative series will be
+underestimated due to the contribution of higher order terms being
+neglected.
+
+ -- Function: int gsl_cheb_calc_deriv (gsl_cheb_series * DERIV, const
+ gsl_cheb_series * CS)
+ This function computes the derivative of the series CS, storing
+ the derivative coefficients in the previously allocated DERIV.
+ The two series CS and DERIV must have been allocated with the same
+ order.
+
+ -- Function: int gsl_cheb_calc_integ (gsl_cheb_series * INTEG, const
+ gsl_cheb_series * CS)
+ This function computes the integral of the series CS, storing the
+ integral coefficients in the previously allocated INTEG. The two
+ series CS and INTEG must have been allocated with the same order.
+ The lower limit of the integration is taken to be the left hand
+ end of the range A.
+
+
+File: gsl-ref.info, Node: Chebyshev Approximation examples, Next: Chebyshev Approximation References and Further Reading, Prev: Derivatives and Integrals, Up: Chebyshev Approximations
+
+28.5 Examples
+=============
+
+The following example program computes Chebyshev approximations to a
+step function. This is an extremely difficult approximation to make,
+due to the discontinuity, and was chosen as an example where
+approximation error is visible. For smooth functions the Chebyshev
+approximation converges extremely rapidly and errors would not be
+visible.
+
+ #include <stdio.h>
+ #include <gsl/gsl_math.h>
+ #include <gsl/gsl_chebyshev.h>
+
+ double
+ f (double x, void *p)
+ {
+ if (x < 0.5)
+ return 0.25;
+ else
+ return 0.75;
+ }
+
+ int
+ main (void)
+ {
+ int i, n = 10000;
+
+ gsl_cheb_series *cs = gsl_cheb_alloc (40);
+
+ gsl_function F;
+
+ F.function = f;
+ F.params = 0;
+
+ gsl_cheb_init (cs, &F, 0.0, 1.0);
+
+ for (i = 0; i < n; i++)
+ {
+ double x = i / (double)n;
+ double r10 = gsl_cheb_eval_n (cs, 10, x);
+ double r40 = gsl_cheb_eval (cs, x);
+ printf ("%g %g %g %g\n",
+ x, GSL_FN_EVAL (&F, x), r10, r40);
+ }
+
+ gsl_cheb_free (cs);
+
+ return 0;
+ }
+
+The output from the program gives the original function, 10-th order
+approximation and 40-th order approximation, all sampled at intervals of
+0.001 in x.
+
+
+File: gsl-ref.info, Node: Chebyshev Approximation References and Further Reading, Prev: Chebyshev Approximation examples, Up: Chebyshev Approximations
+
+28.6 References and Further Reading
+===================================
+
+The following paper describes the use of Chebyshev series,
+
+ R. Broucke, "Ten Subroutines for the Manipulation of Chebyshev
+ Series [C1] (Algorithm 446)". `Communications of the ACM' 16(4),
+ 254-256 (1973)
+
+
+File: gsl-ref.info, Node: Series Acceleration, Next: Wavelet Transforms, Prev: Chebyshev Approximations, Up: Top
+
+29 Series Acceleration
+**********************
+
+The functions described in this chapter accelerate the convergence of a
+series using the Levin u-transform. This method takes a small number of
+terms from the start of a series and uses a systematic approximation to
+compute an extrapolated value and an estimate of its error. The
+u-transform works for both convergent and divergent series, including
+asymptotic series.
+
+ These functions are declared in the header file `gsl_sum.h'.
+
+* Menu:
+
+* Acceleration functions::
+* Acceleration functions without error estimation::
+* Example of accelerating a series::
+* Series Acceleration References::
+
+
+File: gsl-ref.info, Node: Acceleration functions, Next: Acceleration functions without error estimation, Up: Series Acceleration
+
+29.1 Acceleration functions
+===========================
+
+The following functions compute the full Levin u-transform of a series
+with its error estimate. The error estimate is computed by propagating
+rounding errors from each term through to the final extrapolation.
+
+ These functions are intended for summing analytic series where each
+term is known to high accuracy, and the rounding errors are assumed to
+originate from finite precision. They are taken to be relative errors of
+order `GSL_DBL_EPSILON' for each term.
+
+ The calculation of the error in the extrapolated value is an O(N^2)
+process, which is expensive in time and memory. A faster but less
+reliable method which estimates the error from the convergence of the
+extrapolated value is described in the next section. For the method
+described here a full table of intermediate values and derivatives
+through to O(N) must be computed and stored, but this does give a
+reliable error estimate.
+
+ -- Function: gsl_sum_levin_u_workspace * gsl_sum_levin_u_alloc (size_t
+ N)
+ This function allocates a workspace for a Levin u-transform of N
+ terms. The size of the workspace is O(2n^2 + 3n).
+
+ -- Function: void gsl_sum_levin_u_free (gsl_sum_levin_u_workspace * W)
+ This function frees the memory associated with the workspace W.
+
+ -- Function: int gsl_sum_levin_u_accel (const double * ARRAY, size_t
+ ARRAY_SIZE, gsl_sum_levin_u_workspace * W, double *
+ SUM_ACCEL, double * ABSERR)
+ This function takes the terms of a series in ARRAY of size
+ ARRAY_SIZE and computes the extrapolated limit of the series using
+ a Levin u-transform. Additional working space must be provided in
+ W. The extrapolated sum is stored in SUM_ACCEL, with an estimate
+ of the absolute error stored in ABSERR. The actual term-by-term
+ sum is returned in `w->sum_plain'. The algorithm calculates the
+ truncation error (the difference between two successive
+ extrapolations) and round-off error (propagated from the individual
+ terms) to choose an optimal number of terms for the extrapolation.
+ All the terms of the series passed in through ARRAY should be
+ non-zero.
+
+
+File: gsl-ref.info, Node: Acceleration functions without error estimation, Next: Example of accelerating a series, Prev: Acceleration functions, Up: Series Acceleration
+
+29.2 Acceleration functions without error estimation
+====================================================
+
+The functions described in this section compute the Levin u-transform of
+series and attempt to estimate the error from the "truncation error" in
+the extrapolation, the difference between the final two approximations.
+Using this method avoids the need to compute an intermediate table of
+derivatives because the error is estimated from the behavior of the
+extrapolated value itself. Consequently this algorithm is an O(N)
+process and only requires O(N) terms of storage. If the series
+converges sufficiently fast then this procedure can be acceptable. It
+is appropriate to use this method when there is a need to compute many
+extrapolations of series with similar convergence properties at
+high-speed. For example, when numerically integrating a function
+defined by a parameterized series where the parameter varies only
+slightly. A reliable error estimate should be computed first using the
+full algorithm described above in order to verify the consistency of the
+results.
+
+ -- Function: gsl_sum_levin_utrunc_workspace *
+gsl_sum_levin_utrunc_alloc (size_t N)
+ This function allocates a workspace for a Levin u-transform of N
+ terms, without error estimation. The size of the workspace is
+ O(3n).
+
+ -- Function: void gsl_sum_levin_utrunc_free
+ (gsl_sum_levin_utrunc_workspace * W)
+ This function frees the memory associated with the workspace W.
+
+ -- Function: int gsl_sum_levin_utrunc_accel (const double * ARRAY,
+ size_t ARRAY_SIZE, gsl_sum_levin_utrunc_workspace * W, double
+ * SUM_ACCEL, double * ABSERR_TRUNC)
+ This function takes the terms of a series in ARRAY of size
+ ARRAY_SIZE and computes the extrapolated limit of the series using
+ a Levin u-transform. Additional working space must be provided in
+ W. The extrapolated sum is stored in SUM_ACCEL. The actual
+ term-by-term sum is returned in `w->sum_plain'. The algorithm
+ terminates when the difference between two successive
+ extrapolations reaches a minimum or is sufficiently small. The
+ difference between these two values is used as estimate of the
+ error and is stored in ABSERR_TRUNC. To improve the reliability
+ of the algorithm the extrapolated values are replaced by moving
+ averages when calculating the truncation error, smoothing out any
+ fluctuations.
+
+
+File: gsl-ref.info, Node: Example of accelerating a series, Next: Series Acceleration References, Prev: Acceleration functions without error estimation, Up: Series Acceleration
+
+29.3 Examples
+=============
+
+The following code calculates an estimate of \zeta(2) = \pi^2 / 6 using
+the series,
+
+ \zeta(2) = 1 + 1/2^2 + 1/3^2 + 1/4^2 + ...
+
+After N terms the error in the sum is O(1/N), making direct summation
+of the series converge slowly.
+
+ #include <stdio.h>
+ #include <gsl/gsl_math.h>
+ #include <gsl/gsl_sum.h>
+
+ #define N 20
+
+ int
+ main (void)
+ {
+ double t[N];
+ double sum_accel, err;
+ double sum = 0;
+ int n;
+
+ gsl_sum_levin_u_workspace * w
+ = gsl_sum_levin_u_alloc (N);
+
+ const double zeta_2 = M_PI * M_PI / 6.0;
+
+ /* terms for zeta(2) = \sum_{n=1}^{\infty} 1/n^2 */
+
+ for (n = 0; n < N; n++)
+ {
+ double np1 = n + 1.0;
+ t[n] = 1.0 / (np1 * np1);
+ sum += t[n];
+ }
+
+ gsl_sum_levin_u_accel (t, N, w, &sum_accel, &err);
+
+ printf ("term-by-term sum = % .16f using %d terms\n",
+ sum, N);
+
+ printf ("term-by-term sum = % .16f using %d terms\n",
+ w->sum_plain, w->terms_used);
+
+ printf ("exact value = % .16f\n", zeta_2);
+ printf ("accelerated sum = % .16f using %d terms\n",
+ sum_accel, w->terms_used);
+
+ printf ("estimated error = % .16f\n", err);
+ printf ("actual error = % .16f\n",
+ sum_accel - zeta_2);
+
+ gsl_sum_levin_u_free (w);
+ return 0;
+ }
+
+The output below shows that the Levin u-transform is able to obtain an
+estimate of the sum to 1 part in 10^10 using the first eleven terms of
+the series. The error estimate returned by the function is also
+accurate, giving the correct number of significant digits.
+
+ $ ./a.out
+ term-by-term sum = 1.5961632439130233 using 20 terms
+ term-by-term sum = 1.5759958390005426 using 13 terms
+ exact value = 1.6449340668482264
+ accelerated sum = 1.6449340668166479 using 13 terms
+ estimated error = 0.0000000000508580
+ actual error = -0.0000000000315785
+
+Note that a direct summation of this series would require 10^10 terms
+to achieve the same precision as the accelerated sum does in 13 terms.
+
+
+File: gsl-ref.info, Node: Series Acceleration References, Prev: Example of accelerating a series, Up: Series Acceleration
+
+29.4 References and Further Reading
+===================================
+
+The algorithms used by these functions are described in the following
+papers,
+
+ T. Fessler, W.F. Ford, D.A. Smith, HURRY: An acceleration
+ algorithm for scalar sequences and series `ACM Transactions on
+ Mathematical Software', 9(3):346-354, 1983. and Algorithm 602
+ 9(3):355-357, 1983.
+
+The theory of the u-transform was presented by Levin,
+
+ D. Levin, Development of Non-Linear Transformations for Improving
+ Convergence of Sequences, `Intern. J. Computer Math.' B3:371-388,
+ 1973.
+
+A review paper on the Levin Transform is available online,
+ Herbert H. H. Homeier, Scalar Levin-Type Sequence Transformations,
+ `http://arxiv.org/abs/math/0005209'.
+
+
+File: gsl-ref.info, Node: Wavelet Transforms, Next: Discrete Hankel Transforms, Prev: Series Acceleration, Up: Top
+
+30 Wavelet Transforms
+*********************
+
+This chapter describes functions for performing Discrete Wavelet
+Transforms (DWTs). The library includes wavelets for real data in both
+one and two dimensions. The wavelet functions are declared in the
+header files `gsl_wavelet.h' and `gsl_wavelet2d.h'.
+
+* Menu:
+
+* DWT Definitions::
+* DWT Initialization::
+* DWT Transform Functions::
+* DWT Examples::
+* DWT References::
+
+
+File: gsl-ref.info, Node: DWT Definitions, Next: DWT Initialization, Up: Wavelet Transforms
+
+30.1 Definitions
+================
+
+The continuous wavelet transform and its inverse are defined by the
+relations,
+
+ w(s,\tau) = \int f(t) * \psi^*_{s,\tau}(t) dt
+
+and,
+
+ f(t) = \int \int_{-\infty}^\infty w(s, \tau) * \psi_{s,\tau}(t) d\tau ds
+
+where the basis functions \psi_{s,\tau} are obtained by scaling and
+translation from a single function, referred to as the "mother wavelet".
+
+ The discrete version of the wavelet transform acts on equally-spaced
+samples, with fixed scaling and translation steps (s, \tau). The
+frequency and time axes are sampled "dyadically" on scales of 2^j
+through a level parameter j. The resulting family of functions
+{\psi_{j,n}} constitutes an orthonormal basis for square-integrable
+signals.
+
+ The discrete wavelet transform is an O(N) algorithm, and is also
+referred to as the "fast wavelet transform".
+
+
+File: gsl-ref.info, Node: DWT Initialization, Next: DWT Transform Functions, Prev: DWT Definitions, Up: Wavelet Transforms
+
+30.2 Initialization
+===================
+
+The `gsl_wavelet' structure contains the filter coefficients defining
+the wavelet and any associated offset parameters.
+
+ -- Function: gsl_wavelet * gsl_wavelet_alloc (const gsl_wavelet_type *
+ T, size_t K)
+ This function allocates and initializes a wavelet object of type
+ T. The parameter K selects the specific member of the wavelet
+ family. A null pointer is returned if insufficient memory is
+ available or if a unsupported member is selected.
+
+ The following wavelet types are implemented:
+
+ -- Wavelet: gsl_wavelet_daubechies
+ -- Wavelet: gsl_wavelet_daubechies_centered
+ The is the Daubechies wavelet family of maximum phase with k/2
+ vanishing moments. The implemented wavelets are k=4, 6, ..., 20,
+ with K even.
+
+ -- Wavelet: gsl_wavelet_haar
+ -- Wavelet: gsl_wavelet_haar_centered
+ This is the Haar wavelet. The only valid choice of k for the Haar
+ wavelet is k=2.
+
+ -- Wavelet: gsl_wavelet_bspline
+ -- Wavelet: gsl_wavelet_bspline_centered
+ This is the biorthogonal B-spline wavelet family of order (i,j).
+ The implemented values of k = 100*i + j are 103, 105, 202, 204,
+ 206, 208, 301, 303, 305 307, 309.
+
+The centered forms of the wavelets align the coefficients of the various
+sub-bands on edges. Thus the resulting visualization of the
+coefficients of the wavelet transform in the phase plane is easier to
+understand.
+
+ -- Function: const char * gsl_wavelet_name (const gsl_wavelet * W)
+ This function returns a pointer to the name of the wavelet family
+ for W.
+
+ -- Function: void gsl_wavelet_free (gsl_wavelet * W)
+ This function frees the wavelet object W.
+
+ The `gsl_wavelet_workspace' structure contains scratch space of the
+same size as the input data and is used to hold intermediate results
+during the transform.
+
+ -- Function: gsl_wavelet_workspace * gsl_wavelet_workspace_alloc
+ (size_t N)
+ This function allocates a workspace for the discrete wavelet
+ transform. To perform a one-dimensional transform on N elements,
+ a workspace of size N must be provided. For two-dimensional
+ transforms of N-by-N matrices it is sufficient to allocate a
+ workspace of size N, since the transform operates on individual
+ rows and columns.
+
+ -- Function: void gsl_wavelet_workspace_free (gsl_wavelet_workspace *
+ WORK)
+ This function frees the allocated workspace WORK.
+
+
+File: gsl-ref.info, Node: DWT Transform Functions, Next: DWT Examples, Prev: DWT Initialization, Up: Wavelet Transforms
+
+30.3 Transform Functions
+========================
+
+This sections describes the actual functions performing the discrete
+wavelet transform. Note that the transforms use periodic boundary
+conditions. If the signal is not periodic in the sample length then
+spurious coefficients will appear at the beginning and end of each level
+of the transform.
+
+* Menu:
+
+* DWT in one dimension::
+* DWT in two dimension::
+
+
+File: gsl-ref.info, Node: DWT in one dimension, Next: DWT in two dimension, Up: DWT Transform Functions
+
+30.3.1 Wavelet transforms in one dimension
+------------------------------------------
+
+ -- Function: int gsl_wavelet_transform (const gsl_wavelet * W, double
+ * DATA, size_t STRIDE, size_t N, gsl_wavelet_direction DIR,
+ gsl_wavelet_workspace * WORK)
+ -- Function: int gsl_wavelet_transform_forward (const gsl_wavelet * W,
+ double * DATA, size_t STRIDE, size_t N, gsl_wavelet_workspace
+ * WORK)
+ -- Function: int gsl_wavelet_transform_inverse (const gsl_wavelet * W,
+ double * DATA, size_t STRIDE, size_t N, gsl_wavelet_workspace
+ * WORK)
+ These functions compute in-place forward and inverse discrete
+ wavelet transforms of length N with stride STRIDE on the array
+ DATA. The length of the transform N is restricted to powers of
+ two. For the `transform' version of the function the argument DIR
+ can be either `forward' (+1) or `backward' (-1). A workspace WORK
+ of length N must be provided.
+
+ For the forward transform, the elements of the original array are
+ replaced by the discrete wavelet transform f_i -> w_{j,k} in a
+ packed triangular storage layout, where J is the index of the level
+ j = 0 ... J-1 and K is the index of the coefficient within each
+ level, k = 0 ... (2^j)-1. The total number of levels is J =
+ \log_2(n). The output data has the following form,
+
+ (s_{-1,0}, d_{0,0}, d_{1,0}, d_{1,1}, d_{2,0}, ...,
+ d_{j,k}, ..., d_{J-1,2^{J-1}-1})
+
+ where the first element is the smoothing coefficient s_{-1,0},
+ followed by the detail coefficients d_{j,k} for each level j. The
+ backward transform inverts these coefficients to obtain the
+ original data.
+
+ These functions return a status of `GSL_SUCCESS' upon successful
+ completion. `GSL_EINVAL' is returned if N is not an integer power
+ of 2 or if insufficient workspace is provided.
+
+
+File: gsl-ref.info, Node: DWT in two dimension, Prev: DWT in one dimension, Up: DWT Transform Functions
+
+30.3.2 Wavelet transforms in two dimension
+------------------------------------------
+
+The library provides functions to perform two-dimensional discrete
+wavelet transforms on square matrices. The matrix dimensions must be an
+integer power of two. There are two possible orderings of the rows and
+columns in the two-dimensional wavelet transform, referred to as the
+"standard" and "non-standard" forms.
+
+ The "standard" transform performs a complete discrete wavelet
+transform on the rows of the matrix, followed by a separate complete
+discrete wavelet transform on the columns of the resulting
+row-transformed matrix. This procedure uses the same ordering as a
+two-dimensional fourier transform.
+
+ The "non-standard" transform is performed in interleaved passes on
+the rows and columns of the matrix for each level of the transform. The
+first level of the transform is applied to the matrix rows, and then to
+the matrix columns. This procedure is then repeated across the rows and
+columns of the data for the subsequent levels of the transform, until
+the full discrete wavelet transform is complete. The non-standard form
+of the discrete wavelet transform is typically used in image analysis.
+
+ The functions described in this section are declared in the header
+file `gsl_wavelet2d.h'.
+
+ -- Function: int gsl_wavelet2d_transform (const gsl_wavelet * W,
+ double * DATA, size_t TDA, size_t SIZE1, size_t SIZE2,
+ gsl_wavelet_direction DIR, gsl_wavelet_workspace * WORK)
+ -- Function: int gsl_wavelet2d_transform_forward (const gsl_wavelet *
+ W, double * DATA, size_t TDA, size_t SIZE1, size_t SIZE2,
+ gsl_wavelet_workspace * WORK)
+ -- Function: int gsl_wavelet2d_transform_inverse (const gsl_wavelet *
+ W, double * DATA, size_t TDA, size_t SIZE1, size_t SIZE2,
+ gsl_wavelet_workspace * WORK)
+ These functions compute two-dimensional in-place forward and
+ inverse discrete wavelet transforms in standard and non-standard
+ forms on the array DATA stored in row-major form with dimensions
+ SIZE1 and SIZE2 and physical row length TDA. The dimensions must
+ be equal (square matrix) and are restricted to powers of two. For
+ the `transform' version of the function the argument DIR can be
+ either `forward' (+1) or `backward' (-1). A workspace WORK of the
+ appropriate size must be provided. On exit, the appropriate
+ elements of the array DATA are replaced by their two-dimensional
+ wavelet transform.
+
+ The functions return a status of `GSL_SUCCESS' upon successful
+ completion. `GSL_EINVAL' is returned if SIZE1 and SIZE2 are not
+ equal and integer powers of 2, or if insufficient workspace is
+ provided.
+
+ -- Function: int gsl_wavelet2d_transform_matrix (const gsl_wavelet *
+ W, gsl_matrix * M, gsl_wavelet_direction DIR,
+ gsl_wavelet_workspace * WORK)
+ -- Function: int gsl_wavelet2d_transform_matrix_forward (const
+ gsl_wavelet * W, gsl_matrix * M, gsl_wavelet_workspace * WORK)
+ -- Function: int gsl_wavelet2d_transform_matrix_inverse (const
+ gsl_wavelet * W, gsl_matrix * M, gsl_wavelet_workspace * WORK)
+ These functions compute the two-dimensional in-place wavelet
+ transform on a matrix A.
+
+ -- Function: int gsl_wavelet2d_nstransform (const gsl_wavelet * W,
+ double * DATA, size_t TDA, size_t SIZE1, size_t SIZE2,
+ gsl_wavelet_direction DIR, gsl_wavelet_workspace * WORK)
+ -- Function: int gsl_wavelet2d_nstransform_forward (const gsl_wavelet
+ * W, double * DATA, size_t TDA, size_t SIZE1, size_t SIZE2,
+ gsl_wavelet_workspace * WORK)
+ -- Function: int gsl_wavelet2d_nstransform_inverse (const gsl_wavelet
+ * W, double * DATA, size_t TDA, size_t SIZE1, size_t SIZE2,
+ gsl_wavelet_workspace * WORK)
+ These functions compute the two-dimensional wavelet transform in
+ non-standard form.
+
+ -- Function: int gsl_wavelet2d_nstransform_matrix (const gsl_wavelet *
+ W, gsl_matrix * M, gsl_wavelet_direction DIR,
+ gsl_wavelet_workspace * WORK)
+ -- Function: int gsl_wavelet2d_nstransform_matrix_forward (const
+ gsl_wavelet * W, gsl_matrix * M, gsl_wavelet_workspace * WORK)
+ -- Function: int gsl_wavelet2d_nstransform_matrix_inverse (const
+ gsl_wavelet * W, gsl_matrix * M, gsl_wavelet_workspace * WORK)
+ These functions compute the non-standard form of the
+ two-dimensional in-place wavelet transform on a matrix A.
+
+
+File: gsl-ref.info, Node: DWT Examples, Next: DWT References, Prev: DWT Transform Functions, Up: Wavelet Transforms
+
+30.4 Examples
+=============
+
+The following program demonstrates the use of the one-dimensional
+wavelet transform functions. It computes an approximation to an input
+signal (of length 256) using the 20 largest components of the wavelet
+transform, while setting the others to zero.
+
+ #include <stdio.h>
+ #include <math.h>
+ #include <gsl/gsl_sort.h>
+ #include <gsl/gsl_wavelet.h>
+
+ int
+ main (int argc, char **argv)
+ {
+ int i, n = 256, nc = 20;
+ double *data = malloc (n * sizeof (double));
+ double *abscoeff = malloc (n * sizeof (double));
+ size_t *p = malloc (n * sizeof (size_t));
+
+ FILE * f;
+ gsl_wavelet *w;
+ gsl_wavelet_workspace *work;
+
+ w = gsl_wavelet_alloc (gsl_wavelet_daubechies, 4);
+ work = gsl_wavelet_workspace_alloc (n);
+
+ f = fopen (argv[1], "r");
+ for (i = 0; i < n; i++)
+ {
+ fscanf (f, "%lg", &data[i]);
+ }
+ fclose (f);
+
+ gsl_wavelet_transform_forward (w, data, 1, n, work);
+
+ for (i = 0; i < n; i++)
+ {
+ abscoeff[i] = fabs (data[i]);
+ }
+
+ gsl_sort_index (p, abscoeff, 1, n);
+
+ for (i = 0; (i + nc) < n; i++)
+ data[p[i]] = 0;
+
+ gsl_wavelet_transform_inverse (w, data, 1, n, work);
+
+ for (i = 0; i < n; i++)
+ {
+ printf ("%g\n", data[i]);
+ }
+
+ gsl_wavelet_free (w);
+ gsl_wavelet_workspace_free (work);
+
+ free (data);
+ free (abscoeff);
+ free (p);
+ return 0;
+ }
+
+The output can be used with the GNU plotutils `graph' program,
+
+ $ ./a.out ecg.dat > dwt.dat
+ $ graph -T ps -x 0 256 32 -h 0.3 -a dwt.dat > dwt.ps
+
+
+File: gsl-ref.info, Node: DWT References, Prev: DWT Examples, Up: Wavelet Transforms
+
+30.5 References and Further Reading
+===================================
+
+The mathematical background to wavelet transforms is covered in the
+original lectures by Daubechies,
+
+ Ingrid Daubechies. Ten Lectures on Wavelets. `CBMS-NSF Regional
+ Conference Series in Applied Mathematics' (1992), SIAM, ISBN
+ 0898712742.
+
+An easy to read introduction to the subject with an emphasis on the
+application of the wavelet transform in various branches of science is,
+
+ Paul S. Addison. `The Illustrated Wavelet Transform Handbook'.
+ Institute of Physics Publishing (2002), ISBN 0750306920.
+
+For extensive coverage of signal analysis by wavelets, wavelet packets
+and local cosine bases see,
+
+ S. G. Mallat. `A wavelet tour of signal processing' (Second
+ edition). Academic Press (1999), ISBN 012466606X.
+
+The concept of multiresolution analysis underlying the wavelet transform
+is described in,
+
+ S. G. Mallat. Multiresolution Approximations and Wavelet
+ Orthonormal Bases of L^2(R). `Transactions of the American
+ Mathematical Society', 315(1), 1989, 69-87.
+
+ S. G. Mallat. A Theory for Multiresolution Signal
+ Decomposition--The Wavelet Representation. `IEEE Transactions on
+ Pattern Analysis and Machine Intelligence', 11, 1989, 674-693.
+
+The coefficients for the individual wavelet families implemented by the
+library can be found in the following papers,
+
+ I. Daubechies. Orthonormal Bases of Compactly Supported Wavelets.
+ `Communications on Pure and Applied Mathematics', 41 (1988)
+ 909-996.
+
+ A. Cohen, I. Daubechies, and J.-C. Feauveau. Biorthogonal Bases
+ of Compactly Supported Wavelets. `Communications on Pure and
+ Applied Mathematics', 45 (1992) 485-560.
+
+The PhysioNet archive of physiological datasets can be found online at
+`http://www.physionet.org/' and is described in the following paper,
+
+ Goldberger et al. PhysioBank, PhysioToolkit, and PhysioNet:
+ Components of a New Research Resource for Complex Physiologic
+ Signals. `Circulation' 101(23):e215-e220 2000.
+
+
+File: gsl-ref.info, Node: Discrete Hankel Transforms, Next: One dimensional Root-Finding, Prev: Wavelet Transforms, Up: Top
+
+31 Discrete Hankel Transforms
+*****************************
+
+This chapter describes functions for performing Discrete Hankel
+Transforms (DHTs). The functions are declared in the header file
+`gsl_dht.h'.
+
+* Menu:
+
+* Discrete Hankel Transform Definition::
+* Discrete Hankel Transform Functions::
+* Discrete Hankel Transform References::
+
+
+File: gsl-ref.info, Node: Discrete Hankel Transform Definition, Next: Discrete Hankel Transform Functions, Up: Discrete Hankel Transforms
+
+31.1 Definitions
+================
+
+The discrete Hankel transform acts on a vector of sampled data, where
+the samples are assumed to have been taken at points related to the
+zeroes of a Bessel function of fixed order; compare this to the case of
+the discrete Fourier transform, where samples are taken at points
+related to the zeroes of the sine or cosine function.
+
+ Specifically, let f(t) be a function on the unit interval. Then the
+finite \nu-Hankel transform of f(t) is defined to be the set of numbers
+g_m given by,
+ g_m = \int_0^1 t dt J_\nu(j_(\nu,m)t) f(t),
+
+so that,
+ f(t) = \sum_{m=1}^\infty (2 J_\nu(j_(\nu,m)x) / J_(\nu+1)(j_(\nu,m))^2) g_m.
+
+Suppose that f is band-limited in the sense that g_m=0 for m > M. Then
+we have the following fundamental sampling theorem.
+ g_m = (2 / j_(\nu,M)^2)
+ \sum_{k=1}^{M-1} f(j_(\nu,k)/j_(\nu,M))
+ (J_\nu(j_(\nu,m) j_(\nu,k) / j_(\nu,M)) / J_(\nu+1)(j_(\nu,k))^2).
+
+It is this discrete expression which defines the discrete Hankel
+transform. The kernel in the summation above defines the matrix of the
+\nu-Hankel transform of size M-1. The coefficients of this matrix,
+being dependent on \nu and M, must be precomputed and stored; the
+`gsl_dht' object encapsulates this data. The allocation function
+`gsl_dht_alloc' returns a `gsl_dht' object which must be properly
+initialized with `gsl_dht_init' before it can be used to perform
+transforms on data sample vectors, for fixed \nu and M, using the
+`gsl_dht_apply' function. The implementation allows a scaling of the
+fundamental interval, for convenience, so that one can assume the
+function is defined on the interval [0,X], rather than the unit
+interval.
+
+ Notice that by assumption f(t) vanishes at the endpoints of the
+interval, consistent with the inversion formula and the sampling
+formula given above. Therefore, this transform corresponds to an
+orthogonal expansion in eigenfunctions of the Dirichlet problem for the
+Bessel differential equation.
+
+
+File: gsl-ref.info, Node: Discrete Hankel Transform Functions, Next: Discrete Hankel Transform References, Prev: Discrete Hankel Transform Definition, Up: Discrete Hankel Transforms
+
+31.2 Functions
+==============
+
+ -- Function: gsl_dht * gsl_dht_alloc (size_t SIZE)
+ This function allocates a Discrete Hankel transform object of size
+ SIZE.
+
+ -- Function: int gsl_dht_init (gsl_dht * T, double NU, double XMAX)
+ This function initializes the transform T for the given values of
+ NU and X.
+
+ -- Function: gsl_dht * gsl_dht_new (size_t SIZE, double NU, double
+ XMAX)
+ This function allocates a Discrete Hankel transform object of size
+ SIZE and initializes it for the given values of NU and X.
+
+ -- Function: void gsl_dht_free (gsl_dht * T)
+ This function frees the transform T.
+
+ -- Function: int gsl_dht_apply (const gsl_dht * T, double * F_IN,
+ double * F_OUT)
+ This function applies the transform T to the array F_IN whose size
+ is equal to the size of the transform. The result is stored in
+ the array F_OUT which must be of the same length.
+
+ -- Function: double gsl_dht_x_sample (const gsl_dht * T, int N)
+ This function returns the value of the N-th sample point in the
+ unit interval, (j_{\nu,n+1}/j_{\nu,M}) X. These are the points
+ where the function f(t) is assumed to be sampled.
+
+ -- Function: double gsl_dht_k_sample (const gsl_dht * T, int N)
+ This function returns the value of the N-th sample point in
+ "k-space", j_{\nu,n+1}/X.
+
+
+File: gsl-ref.info, Node: Discrete Hankel Transform References, Prev: Discrete Hankel Transform Functions, Up: Discrete Hankel Transforms
+
+31.3 References and Further Reading
+===================================
+
+The algorithms used by these functions are described in the following
+papers,
+
+ H. Fisk Johnson, Comp. Phys. Comm. 43, 181 (1987).
+
+ D. Lemoine, J. Chem. Phys. 101, 3936 (1994).
+
+
+File: gsl-ref.info, Node: One dimensional Root-Finding, Next: One dimensional Minimization, Prev: Discrete Hankel Transforms, Up: Top
+
+32 One dimensional Root-Finding
+*******************************
+
+This chapter describes routines for finding roots of arbitrary
+one-dimensional functions. The library provides low level components
+for a variety of iterative solvers and convergence tests. These can be
+combined by the user to achieve the desired solution, with full access
+to the intermediate steps of the iteration. Each class of methods uses
+the same framework, so that you can switch between solvers at runtime
+without needing to recompile your program. Each instance of a solver
+keeps track of its own state, allowing the solvers to be used in
+multi-threaded programs.
+
+ The header file `gsl_roots.h' contains prototypes for the root
+finding functions and related declarations.
+
+* Menu:
+
+* Root Finding Overview::
+* Root Finding Caveats::
+* Initializing the Solver::
+* Providing the function to solve::
+* Search Bounds and Guesses::
+* Root Finding Iteration::
+* Search Stopping Parameters::
+* Root Bracketing Algorithms::
+* Root Finding Algorithms using Derivatives::
+* Root Finding Examples::
+* Root Finding References and Further Reading::
+
+
+File: gsl-ref.info, Node: Root Finding Overview, Next: Root Finding Caveats, Up: One dimensional Root-Finding
+
+32.1 Overview
+=============
+
+One-dimensional root finding algorithms can be divided into two classes,
+"root bracketing" and "root polishing". Algorithms which proceed by
+bracketing a root are guaranteed to converge. Bracketing algorithms
+begin with a bounded region known to contain a root. The size of this
+bounded region is reduced, iteratively, until it encloses the root to a
+desired tolerance. This provides a rigorous error estimate for the
+location of the root.
+
+ The technique of "root polishing" attempts to improve an initial
+guess to the root. These algorithms converge only if started "close
+enough" to a root, and sacrifice a rigorous error bound for speed. By
+approximating the behavior of a function in the vicinity of a root they
+attempt to find a higher order improvement of an initial guess. When
+the behavior of the function is compatible with the algorithm and a good
+initial guess is available a polishing algorithm can provide rapid
+convergence.
+
+ In GSL both types of algorithm are available in similar frameworks.
+The user provides a high-level driver for the algorithms, and the
+library provides the individual functions necessary for each of the
+steps. There are three main phases of the iteration. The steps are,
+
+ * initialize solver state, S, for algorithm T
+
+ * update S using the iteration T
+
+ * test S for convergence, and repeat iteration if necessary
+
+The state for bracketing solvers is held in a `gsl_root_fsolver'
+struct. The updating procedure uses only function evaluations (not
+derivatives). The state for root polishing solvers is held in a
+`gsl_root_fdfsolver' struct. The updates require both the function and
+its derivative (hence the name `fdf') to be supplied by the user.
+
+
+File: gsl-ref.info, Node: Root Finding Caveats, Next: Initializing the Solver, Prev: Root Finding Overview, Up: One dimensional Root-Finding
+
+32.2 Caveats
+============
+
+Note that root finding functions can only search for one root at a time.
+When there are several roots in the search area, the first root to be
+found will be returned; however it is difficult to predict which of the
+roots this will be. _In most cases, no error will be reported if you
+try to find a root in an area where there is more than one._
+
+ Care must be taken when a function may have a multiple root (such as
+f(x) = (x-x_0)^2 or f(x) = (x-x_0)^3). It is not possible to use
+root-bracketing algorithms on even-multiplicity roots. For these
+algorithms the initial interval must contain a zero-crossing, where the
+function is negative at one end of the interval and positive at the
+other end. Roots with even-multiplicity do not cross zero, but only
+touch it instantaneously. Algorithms based on root bracketing will
+still work for odd-multiplicity roots (e.g. cubic, quintic, ...). Root
+polishing algorithms generally work with higher multiplicity roots, but
+at a reduced rate of convergence. In these cases the "Steffenson
+algorithm" can be used to accelerate the convergence of multiple roots.
+
+ While it is not absolutely required that f have a root within the
+search region, numerical root finding functions should not be used
+haphazardly to check for the _existence_ of roots. There are better
+ways to do this. Because it is easy to create situations where
+numerical root finders can fail, it is a bad idea to throw a root
+finder at a function you do not know much about. In general it is best
+to examine the function visually by plotting before searching for a
+root.
+
+
+File: gsl-ref.info, Node: Initializing the Solver, Next: Providing the function to solve, Prev: Root Finding Caveats, Up: One dimensional Root-Finding
+
+32.3 Initializing the Solver
+============================
+
+ -- Function: gsl_root_fsolver * gsl_root_fsolver_alloc (const
+ gsl_root_fsolver_type * T)
+ This function returns a pointer to a newly allocated instance of a
+ solver of type T. For example, the following code creates an
+ instance of a bisection solver,
+
+ const gsl_root_fsolver_type * T
+ = gsl_root_fsolver_bisection;
+ gsl_root_fsolver * s
+ = gsl_root_fsolver_alloc (T);
+
+ If there is insufficient memory to create the solver then the
+ function returns a null pointer and the error handler is invoked
+ with an error code of `GSL_ENOMEM'.
+
+ -- Function: gsl_root_fdfsolver * gsl_root_fdfsolver_alloc (const
+ gsl_root_fdfsolver_type * T)
+ This function returns a pointer to a newly allocated instance of a
+ derivative-based solver of type T. For example, the following
+ code creates an instance of a Newton-Raphson solver,
+
+ const gsl_root_fdfsolver_type * T
+ = gsl_root_fdfsolver_newton;
+ gsl_root_fdfsolver * s
+ = gsl_root_fdfsolver_alloc (T);
+
+ If there is insufficient memory to create the solver then the
+ function returns a null pointer and the error handler is invoked
+ with an error code of `GSL_ENOMEM'.
+
+ -- Function: int gsl_root_fsolver_set (gsl_root_fsolver * S,
+ gsl_function * F, double X_LOWER, double X_UPPER)
+ This function initializes, or reinitializes, an existing solver S
+ to use the function F and the initial search interval [X_LOWER,
+ X_UPPER].
+
+ -- Function: int gsl_root_fdfsolver_set (gsl_root_fdfsolver * S,
+ gsl_function_fdf * FDF, double ROOT)
+ This function initializes, or reinitializes, an existing solver S
+ to use the function and derivative FDF and the initial guess ROOT.
+
+ -- Function: void gsl_root_fsolver_free (gsl_root_fsolver * S)
+ -- Function: void gsl_root_fdfsolver_free (gsl_root_fdfsolver * S)
+ These functions free all the memory associated with the solver S.
+
+ -- Function: const char * gsl_root_fsolver_name (const
+ gsl_root_fsolver * S)
+ -- Function: const char * gsl_root_fdfsolver_name (const
+ gsl_root_fdfsolver * S)
+ These functions return a pointer to the name of the solver. For
+ example,
+
+ printf ("s is a '%s' solver\n",
+ gsl_root_fsolver_name (s));
+
+ would print something like `s is a 'bisection' solver'.
+
+
+File: gsl-ref.info, Node: Providing the function to solve, Next: Search Bounds and Guesses, Prev: Initializing the Solver, Up: One dimensional Root-Finding
+
+32.4 Providing the function to solve
+====================================
+
+You must provide a continuous function of one variable for the root
+finders to operate on, and, sometimes, its first derivative. In order
+to allow for general parameters the functions are defined by the
+following data types:
+
+ -- Data Type: gsl_function
+ This data type defines a general function with parameters.
+
+ `double (* function) (double X, void * PARAMS)'
+ this function should return the value f(x,params) for
+ argument X and parameters PARAMS
+
+ `void * params'
+ a pointer to the parameters of the function
+
+ Here is an example for the general quadratic function,
+
+ f(x) = a x^2 + b x + c
+
+with a = 3, b = 2, c = 1. The following code defines a `gsl_function'
+`F' which you could pass to a root finder:
+
+ struct my_f_params { double a; double b; double c; };
+
+ double
+ my_f (double x, void * p) {
+ struct my_f_params * params
+ = (struct my_f_params *)p;
+ double a = (params->a);
+ double b = (params->b);
+ double c = (params->c);
+
+ return (a * x + b) * x + c;
+ }
+
+ gsl_function F;
+ struct my_f_params params = { 3.0, 2.0, 1.0 };
+
+ F.function = &my_f;
+ F.params = &params;
+
+The function f(x) can be evaluated using the following macro,
+
+ #define GSL_FN_EVAL(F,x)
+ (*((F)->function))(x,(F)->params)
+
+ -- Data Type: gsl_function_fdf
+ This data type defines a general function with parameters and its
+ first derivative.
+
+ `double (* f) (double X, void * PARAMS)'
+ this function should return the value of f(x,params) for
+ argument X and parameters PARAMS
+
+ `double (* df) (double X, void * PARAMS)'
+ this function should return the value of the derivative of F
+ with respect to X, f'(x,params), for argument X and
+ parameters PARAMS
+
+ `void (* fdf) (double X, void * PARAMS, double * F, double * Df)'
+ this function should set the values of the function F to
+ f(x,params) and its derivative DF to f'(x,params) for
+ argument X and parameters PARAMS. This function provides an
+ optimization of the separate functions for f(x) and f'(x)--it
+ is always faster to compute the function and its derivative
+ at the same time.
+
+ `void * params'
+ a pointer to the parameters of the function
+
+ Here is an example where f(x) = 2\exp(2x):
+
+ double
+ my_f (double x, void * params)
+ {
+ return exp (2 * x);
+ }
+
+ double
+ my_df (double x, void * params)
+ {
+ return 2 * exp (2 * x);
+ }
+
+ void
+ my_fdf (double x, void * params,
+ double * f, double * df)
+ {
+ double t = exp (2 * x);
+
+ *f = t;
+ *df = 2 * t; /* uses existing value */
+ }
+
+ gsl_function_fdf FDF;
+
+ FDF.f = &my_f;
+ FDF.df = &my_df;
+ FDF.fdf = &my_fdf;
+ FDF.params = 0;
+
+The function f(x) can be evaluated using the following macro,
+
+ #define GSL_FN_FDF_EVAL_F(FDF,x)
+ (*((FDF)->f))(x,(FDF)->params)
+
+The derivative f'(x) can be evaluated using the following macro,
+
+ #define GSL_FN_FDF_EVAL_DF(FDF,x)
+ (*((FDF)->df))(x,(FDF)->params)
+
+and both the function y = f(x) and its derivative dy = f'(x) can be
+evaluated at the same time using the following macro,
+
+ #define GSL_FN_FDF_EVAL_F_DF(FDF,x,y,dy)
+ (*((FDF)->fdf))(x,(FDF)->params,(y),(dy))
+
+The macro stores f(x) in its Y argument and f'(x) in its DY
+argument--both of these should be pointers to `double'.
+
+
+File: gsl-ref.info, Node: Search Bounds and Guesses, Next: Root Finding Iteration, Prev: Providing the function to solve, Up: One dimensional Root-Finding
+
+32.5 Search Bounds and Guesses
+==============================
+
+You provide either search bounds or an initial guess; this section
+explains how search bounds and guesses work and how function arguments
+control them.
+
+ A guess is simply an x value which is iterated until it is within
+the desired precision of a root. It takes the form of a `double'.
+
+ Search bounds are the endpoints of a interval which is iterated until
+the length of the interval is smaller than the requested precision. The
+interval is defined by two values, the lower limit and the upper limit.
+Whether the endpoints are intended to be included in the interval or not
+depends on the context in which the interval is used.
+
+
+File: gsl-ref.info, Node: Root Finding Iteration, Next: Search Stopping Parameters, Prev: Search Bounds and Guesses, Up: One dimensional Root-Finding
+
+32.6 Iteration
+==============
+
+The following functions drive the iteration of each algorithm. Each
+function performs one iteration to update the state of any solver of the
+corresponding type. The same functions work for all solvers so that
+different methods can be substituted at runtime without modifications to
+the code.
+
+ -- Function: int gsl_root_fsolver_iterate (gsl_root_fsolver * S)
+ -- Function: int gsl_root_fdfsolver_iterate (gsl_root_fdfsolver * S)
+ These functions perform a single iteration of the solver S. If the
+ iteration encounters an unexpected problem then an error code will
+ be returned,
+
+ `GSL_EBADFUNC'
+ the iteration encountered a singular point where the function
+ or its derivative evaluated to `Inf' or `NaN'.
+
+ `GSL_EZERODIV'
+ the derivative of the function vanished at the iteration
+ point, preventing the algorithm from continuing without a
+ division by zero.
+
+ The solver maintains a current best estimate of the root at all
+times. The bracketing solvers also keep track of the current best
+interval bounding the root. This information can be accessed with the
+following auxiliary functions,
+
+ -- Function: double gsl_root_fsolver_root (const gsl_root_fsolver * S)
+ -- Function: double gsl_root_fdfsolver_root (const gsl_root_fdfsolver
+ * S)
+ These functions return the current estimate of the root for the
+ solver S.
+
+ -- Function: double gsl_root_fsolver_x_lower (const gsl_root_fsolver *
+ S)
+ -- Function: double gsl_root_fsolver_x_upper (const gsl_root_fsolver *
+ S)
+ These functions return the current bracketing interval for the
+ solver S.
+
+
+File: gsl-ref.info, Node: Search Stopping Parameters, Next: Root Bracketing Algorithms, Prev: Root Finding Iteration, Up: One dimensional Root-Finding
+
+32.7 Search Stopping Parameters
+===============================
+
+A root finding procedure should stop when one of the following
+conditions is true:
+
+ * A root has been found to within the user-specified precision.
+
+ * A user-specified maximum number of iterations has been reached.
+
+ * An error has occurred.
+
+The handling of these conditions is under user control. The functions
+below allow the user to test the precision of the current result in
+several standard ways.
+
+ -- Function: int gsl_root_test_interval (double X_LOWER, double
+ X_UPPER, double EPSABS, double EPSREL)
+ This function tests for the convergence of the interval [X_LOWER,
+ X_UPPER] with absolute error EPSABS and relative error EPSREL.
+ The test returns `GSL_SUCCESS' if the following condition is
+ achieved,
+
+ |a - b| < epsabs + epsrel min(|a|,|b|)
+
+ when the interval x = [a,b] does not include the origin. If the
+ interval includes the origin then \min(|a|,|b|) is replaced by
+ zero (which is the minimum value of |x| over the interval). This
+ ensures that the relative error is accurately estimated for roots
+ close to the origin.
+
+ This condition on the interval also implies that any estimate of
+ the root r in the interval satisfies the same condition with
+ respect to the true root r^*,
+
+ |r - r^*| < epsabs + epsrel r^*
+
+ assuming that the true root r^* is contained within the interval.
+
+ -- Function: int gsl_root_test_delta (double X1, double X0, double
+ EPSABS, double EPSREL)
+ This function tests for the convergence of the sequence ..., X0,
+ X1 with absolute error EPSABS and relative error EPSREL. The test
+ returns `GSL_SUCCESS' if the following condition is achieved,
+
+ |x_1 - x_0| < epsabs + epsrel |x_1|
+
+ and returns `GSL_CONTINUE' otherwise.
+
+ -- Function: int gsl_root_test_residual (double F, double EPSABS)
+ This function tests the residual value F against the absolute
+ error bound EPSABS. The test returns `GSL_SUCCESS' if the
+ following condition is achieved,
+
+ |f| < epsabs
+
+ and returns `GSL_CONTINUE' otherwise. This criterion is suitable
+ for situations where the precise location of the root, x, is
+ unimportant provided a value can be found where the residual,
+ |f(x)|, is small enough.
+
+
+File: gsl-ref.info, Node: Root Bracketing Algorithms, Next: Root Finding Algorithms using Derivatives, Prev: Search Stopping Parameters, Up: One dimensional Root-Finding
+
+32.8 Root Bracketing Algorithms
+===============================
+
+The root bracketing algorithms described in this section require an
+initial interval which is guaranteed to contain a root--if a and b are
+the endpoints of the interval then f(a) must differ in sign from f(b).
+This ensures that the function crosses zero at least once in the
+interval. If a valid initial interval is used then these algorithm
+cannot fail, provided the function is well-behaved.
+
+ Note that a bracketing algorithm cannot find roots of even degree,
+since these do not cross the x-axis.
+
+ -- Solver: gsl_root_fsolver_bisection
+ The "bisection algorithm" is the simplest method of bracketing the
+ roots of a function. It is the slowest algorithm provided by the
+ library, with linear convergence.
+
+ On each iteration, the interval is bisected and the value of the
+ function at the midpoint is calculated. The sign of this value is
+ used to determine which half of the interval does not contain a
+ root. That half is discarded to give a new, smaller interval
+ containing the root. This procedure can be continued indefinitely
+ until the interval is sufficiently small.
+
+ At any time the current estimate of the root is taken as the
+ midpoint of the interval.
+
+
+ -- Solver: gsl_root_fsolver_falsepos
+ The "false position algorithm" is a method of finding roots based
+ on linear interpolation. Its convergence is linear, but it is
+ usually faster than bisection.
+
+ On each iteration a line is drawn between the endpoints (a,f(a))
+ and (b,f(b)) and the point where this line crosses the x-axis
+ taken as a "midpoint". The value of the function at this point is
+ calculated and its sign is used to determine which side of the
+ interval does not contain a root. That side is discarded to give a
+ new, smaller interval containing the root. This procedure can be
+ continued indefinitely until the interval is sufficiently small.
+
+ The best estimate of the root is taken from the linear
+ interpolation of the interval on the current iteration.
+
+
+ -- Solver: gsl_root_fsolver_brent
+ The "Brent-Dekker method" (referred to here as "Brent's method")
+ combines an interpolation strategy with the bisection algorithm.
+ This produces a fast algorithm which is still robust.
+
+ On each iteration Brent's method approximates the function using an
+ interpolating curve. On the first iteration this is a linear
+ interpolation of the two endpoints. For subsequent iterations the
+ algorithm uses an inverse quadratic fit to the last three points,
+ for higher accuracy. The intercept of the interpolating curve
+ with the x-axis is taken as a guess for the root. If it lies
+ within the bounds of the current interval then the interpolating
+ point is accepted, and used to generate a smaller interval. If
+ the interpolating point is not accepted then the algorithm falls
+ back to an ordinary bisection step.
+
+ The best estimate of the root is taken from the most recent
+ interpolation or bisection.
+
+
+File: gsl-ref.info, Node: Root Finding Algorithms using Derivatives, Next: Root Finding Examples, Prev: Root Bracketing Algorithms, Up: One dimensional Root-Finding
+
+32.9 Root Finding Algorithms using Derivatives
+==============================================
+
+The root polishing algorithms described in this section require an
+initial guess for the location of the root. There is no absolute
+guarantee of convergence--the function must be suitable for this
+technique and the initial guess must be sufficiently close to the root
+for it to work. When these conditions are satisfied then convergence is
+quadratic.
+
+ These algorithms make use of both the function and its derivative.
+
+ -- Derivative Solver: gsl_root_fdfsolver_newton
+ Newton's Method is the standard root-polishing algorithm. The
+ algorithm begins with an initial guess for the location of the
+ root. On each iteration, a line tangent to the function f is
+ drawn at that position. The point where this line crosses the
+ x-axis becomes the new guess. The iteration is defined by the
+ following sequence,
+
+ x_{i+1} = x_i - f(x_i)/f'(x_i)
+
+ Newton's method converges quadratically for single roots, and
+ linearly for multiple roots.
+
+
+ -- Derivative Solver: gsl_root_fdfsolver_secant
+ The "secant method" is a simplified version of Newton's method
+ which does not require the computation of the derivative on every
+ step.
+
+ On its first iteration the algorithm begins with Newton's method,
+ using the derivative to compute a first step,
+
+ x_1 = x_0 - f(x_0)/f'(x_0)
+
+ Subsequent iterations avoid the evaluation of the derivative by
+ replacing it with a numerical estimate, the slope of the line
+ through the previous two points,
+
+ x_{i+1} = x_i f(x_i) / f'_{est} where
+ f'_{est} = (f(x_i) - f(x_{i-1})/(x_i - x_{i-1})
+
+ When the derivative does not change significantly in the vicinity
+ of the root the secant method gives a useful saving.
+ Asymptotically the secant method is faster than Newton's method
+ whenever the cost of evaluating the derivative is more than 0.44
+ times the cost of evaluating the function itself. As with all
+ methods of computing a numerical derivative the estimate can
+ suffer from cancellation errors if the separation of the points
+ becomes too small.
+
+ On single roots, the method has a convergence of order (1 + \sqrt
+ 5)/2 (approximately 1.62). It converges linearly for multiple
+ roots.
+
+
+ -- Derivative Solver: gsl_root_fdfsolver_steffenson
+ The "Steffenson Method" provides the fastest convergence of all the
+ routines. It combines the basic Newton algorithm with an Aitken
+ "delta-squared" acceleration. If the Newton iterates are x_i then
+ the acceleration procedure generates a new sequence R_i,
+
+ R_i = x_i - (x_{i+1} - x_i)^2 / (x_{i+2} - 2 x_{i+1} + x_{i})
+
+ which converges faster than the original sequence under reasonable
+ conditions. The new sequence requires three terms before it can
+ produce its first value so the method returns accelerated values
+ on the second and subsequent iterations. On the first iteration
+ it returns the ordinary Newton estimate. The Newton iterate is
+ also returned if the denominator of the acceleration term ever
+ becomes zero.
+
+ As with all acceleration procedures this method can become
+ unstable if the function is not well-behaved.
+
+
+File: gsl-ref.info, Node: Root Finding Examples, Next: Root Finding References and Further Reading, Prev: Root Finding Algorithms using Derivatives, Up: One dimensional Root-Finding
+
+32.10 Examples
+==============
+
+For any root finding algorithm we need to prepare the function to be
+solved. For this example we will use the general quadratic equation
+described earlier. We first need a header file (`demo_fn.h') to define
+the function parameters,
+
+ struct quadratic_params
+ {
+ double a, b, c;
+ };
+
+ double quadratic (double x, void *params);
+ double quadratic_deriv (double x, void *params);
+ void quadratic_fdf (double x, void *params,
+ double *y, double *dy);
+
+We place the function definitions in a separate file (`demo_fn.c'),
+
+ double
+ quadratic (double x, void *params)
+ {
+ struct quadratic_params *p
+ = (struct quadratic_params *) params;
+
+ double a = p->a;
+ double b = p->b;
+ double c = p->c;
+
+ return (a * x + b) * x + c;
+ }
+
+ double
+ quadratic_deriv (double x, void *params)
+ {
+ struct quadratic_params *p
+ = (struct quadratic_params *) params;
+
+ double a = p->a;
+ double b = p->b;
+ double c = p->c;
+
+ return 2.0 * a * x + b;
+ }
+
+ void
+ quadratic_fdf (double x, void *params,
+ double *y, double *dy)
+ {
+ struct quadratic_params *p
+ = (struct quadratic_params *) params;
+
+ double a = p->a;
+ double b = p->b;
+ double c = p->c;
+
+ *y = (a * x + b) * x + c;
+ *dy = 2.0 * a * x + b;
+ }
+
+The first program uses the function solver `gsl_root_fsolver_brent' for
+Brent's method and the general quadratic defined above to solve the
+following equation,
+
+ x^2 - 5 = 0
+
+with solution x = \sqrt 5 = 2.236068...
+
+ #include <stdio.h>
+ #include <gsl/gsl_errno.h>
+ #include <gsl/gsl_math.h>
+ #include <gsl/gsl_roots.h>
+
+ #include "demo_fn.h"
+ #include "demo_fn.c"
+
+ int
+ main (void)
+ {
+ int status;
+ int iter = 0, max_iter = 100;
+ const gsl_root_fsolver_type *T;
+ gsl_root_fsolver *s;
+ double r = 0, r_expected = sqrt (5.0);
+ double x_lo = 0.0, x_hi = 5.0;
+ gsl_function F;
+ struct quadratic_params params = {1.0, 0.0, -5.0};
+
+ F.function = &quadratic;
+ F.params = &params;
+
+ T = gsl_root_fsolver_brent;
+ s = gsl_root_fsolver_alloc (T);
+ gsl_root_fsolver_set (s, &F, x_lo, x_hi);
+
+ printf ("using %s method\n",
+ gsl_root_fsolver_name (s));
+
+ printf ("%5s [%9s, %9s] %9s %10s %9s\n",
+ "iter", "lower", "upper", "root",
+ "err", "err(est)");
+
+ do
+ {
+ iter++;
+ status = gsl_root_fsolver_iterate (s);
+ r = gsl_root_fsolver_root (s);
+ x_lo = gsl_root_fsolver_x_lower (s);
+ x_hi = gsl_root_fsolver_x_upper (s);
+ status = gsl_root_test_interval (x_lo, x_hi,
+ 0, 0.001);
+
+ if (status == GSL_SUCCESS)
+ printf ("Converged:\n");
+
+ printf ("%5d [%.7f, %.7f] %.7f %+.7f %.7f\n",
+ iter, x_lo, x_hi,
+ r, r - r_expected,
+ x_hi - x_lo);
+ }
+ while (status == GSL_CONTINUE && iter < max_iter);
+
+ gsl_root_fsolver_free (s);
+
+ return status;
+ }
+
+Here are the results of the iterations,
+
+ $ ./a.out
+ using brent method
+ iter [ lower, upper] root err err(est)
+ 1 [1.0000000, 5.0000000] 1.0000000 -1.2360680 4.0000000
+ 2 [1.0000000, 3.0000000] 3.0000000 +0.7639320 2.0000000
+ 3 [2.0000000, 3.0000000] 2.0000000 -0.2360680 1.0000000
+ 4 [2.2000000, 3.0000000] 2.2000000 -0.0360680 0.8000000
+ 5 [2.2000000, 2.2366300] 2.2366300 +0.0005621 0.0366300
+ Converged:
+ 6 [2.2360634, 2.2366300] 2.2360634 -0.0000046 0.0005666
+
+If the program is modified to use the bisection solver instead of
+Brent's method, by changing `gsl_root_fsolver_brent' to
+`gsl_root_fsolver_bisection' the slower convergence of the Bisection
+method can be observed,
+
+ $ ./a.out
+ using bisection method
+ iter [ lower, upper] root err err(est)
+ 1 [0.0000000, 2.5000000] 1.2500000 -0.9860680 2.5000000
+ 2 [1.2500000, 2.5000000] 1.8750000 -0.3610680 1.2500000
+ 3 [1.8750000, 2.5000000] 2.1875000 -0.0485680 0.6250000
+ 4 [2.1875000, 2.5000000] 2.3437500 +0.1076820 0.3125000
+ 5 [2.1875000, 2.3437500] 2.2656250 +0.0295570 0.1562500
+ 6 [2.1875000, 2.2656250] 2.2265625 -0.0095055 0.0781250
+ 7 [2.2265625, 2.2656250] 2.2460938 +0.0100258 0.0390625
+ 8 [2.2265625, 2.2460938] 2.2363281 +0.0002601 0.0195312
+ 9 [2.2265625, 2.2363281] 2.2314453 -0.0046227 0.0097656
+ 10 [2.2314453, 2.2363281] 2.2338867 -0.0021813 0.0048828
+ 11 [2.2338867, 2.2363281] 2.2351074 -0.0009606 0.0024414
+ Converged:
+ 12 [2.2351074, 2.2363281] 2.2357178 -0.0003502 0.0012207
+
+ The next program solves the same function using a derivative solver
+instead.
+
+ #include <stdio.h>
+ #include <gsl/gsl_errno.h>
+ #include <gsl/gsl_math.h>
+ #include <gsl/gsl_roots.h>
+
+ #include "demo_fn.h"
+ #include "demo_fn.c"
+
+ int
+ main (void)
+ {
+ int status;
+ int iter = 0, max_iter = 100;
+ const gsl_root_fdfsolver_type *T;
+ gsl_root_fdfsolver *s;
+ double x0, x = 5.0, r_expected = sqrt (5.0);
+ gsl_function_fdf FDF;
+ struct quadratic_params params = {1.0, 0.0, -5.0};
+
+ FDF.f = &quadratic;
+ FDF.df = &quadratic_deriv;
+ FDF.fdf = &quadratic_fdf;
+ FDF.params = &params;
+
+ T = gsl_root_fdfsolver_newton;
+ s = gsl_root_fdfsolver_alloc (T);
+ gsl_root_fdfsolver_set (s, &FDF, x);
+
+ printf ("using %s method\n",
+ gsl_root_fdfsolver_name (s));
+
+ printf ("%-5s %10s %10s %10s\n",
+ "iter", "root", "err", "err(est)");
+ do
+ {
+ iter++;
+ status = gsl_root_fdfsolver_iterate (s);
+ x0 = x;
+ x = gsl_root_fdfsolver_root (s);
+ status = gsl_root_test_delta (x, x0, 0, 1e-3);
+
+ if (status == GSL_SUCCESS)
+ printf ("Converged:\n");
+
+ printf ("%5d %10.7f %+10.7f %10.7f\n",
+ iter, x, x - r_expected, x - x0);
+ }
+ while (status == GSL_CONTINUE && iter < max_iter);
+
+ gsl_root_fdfsolver_free (s);
+ return status;
+ }
+
+Here are the results for Newton's method,
+
+ $ ./a.out
+ using newton method
+ iter root err err(est)
+ 1 3.0000000 +0.7639320 -2.0000000
+ 2 2.3333333 +0.0972654 -0.6666667
+ 3 2.2380952 +0.0020273 -0.0952381
+ Converged:
+ 4 2.2360689 +0.0000009 -0.0020263
+
+Note that the error can be estimated more accurately by taking the
+difference between the current iterate and next iterate rather than the
+previous iterate. The other derivative solvers can be investigated by
+changing `gsl_root_fdfsolver_newton' to `gsl_root_fdfsolver_secant' or
+`gsl_root_fdfsolver_steffenson'.
+
+
+File: gsl-ref.info, Node: Root Finding References and Further Reading, Prev: Root Finding Examples, Up: One dimensional Root-Finding
+
+32.11 References and Further Reading
+====================================
+
+For information on the Brent-Dekker algorithm see the following two
+papers,
+
+ R. P. Brent, "An algorithm with guaranteed convergence for finding
+ a zero of a function", `Computer Journal', 14 (1971) 422-425
+
+ J. C. P. Bus and T. J. Dekker, "Two Efficient Algorithms with
+ Guaranteed Convergence for Finding a Zero of a Function", `ACM
+ Transactions of Mathematical Software', Vol. 1 No. 4 (1975) 330-345
+
+
+File: gsl-ref.info, Node: One dimensional Minimization, Next: Multidimensional Root-Finding, Prev: One dimensional Root-Finding, Up: Top
+
+33 One dimensional Minimization
+*******************************
+
+This chapter describes routines for finding minima of arbitrary
+one-dimensional functions. The library provides low level components
+for a variety of iterative minimizers and convergence tests. These can
+be combined by the user to achieve the desired solution, with full
+access to the intermediate steps of the algorithms. Each class of
+methods uses the same framework, so that you can switch between
+minimizers at runtime without needing to recompile your program. Each
+instance of a minimizer keeps track of its own state, allowing the
+minimizers to be used in multi-threaded programs.
+
+ The header file `gsl_min.h' contains prototypes for the minimization
+functions and related declarations. To use the minimization algorithms
+to find the maximum of a function simply invert its sign.
+
+* Menu:
+
+* Minimization Overview::
+* Minimization Caveats::
+* Initializing the Minimizer::
+* Providing the function to minimize::
+* Minimization Iteration::
+* Minimization Stopping Parameters::
+* Minimization Algorithms::
+* Minimization Examples::
+* Minimization References and Further Reading::
+
+
+File: gsl-ref.info, Node: Minimization Overview, Next: Minimization Caveats, Up: One dimensional Minimization
+
+33.1 Overview
+=============
+
+The minimization algorithms begin with a bounded region known to contain
+a minimum. The region is described by a lower bound a and an upper
+bound b, with an estimate of the location of the minimum x.
+
+The value of the function at x must be less than the value of the
+function at the ends of the interval,
+
+ f(a) > f(x) < f(b)
+
+This condition guarantees that a minimum is contained somewhere within
+the interval. On each iteration a new point x' is selected using one
+of the available algorithms. If the new point is a better estimate of
+the minimum, i.e. where f(x') < f(x), then the current estimate of the
+minimum x is updated. The new point also allows the size of the
+bounded interval to be reduced, by choosing the most compact set of
+points which satisfies the constraint f(a) > f(x) < f(b). The interval
+is reduced until it encloses the true minimum to a desired tolerance.
+This provides a best estimate of the location of the minimum and a
+rigorous error estimate.
+
+ Several bracketing algorithms are available within a single
+framework. The user provides a high-level driver for the algorithm,
+and the library provides the individual functions necessary for each of
+the steps. There are three main phases of the iteration. The steps
+are,
+
+ * initialize minimizer state, S, for algorithm T
+
+ * update S using the iteration T
+
+ * test S for convergence, and repeat iteration if necessary
+
+The state for the minimizers is held in a `gsl_min_fminimizer' struct.
+The updating procedure uses only function evaluations (not derivatives).
+
+
+File: gsl-ref.info, Node: Minimization Caveats, Next: Initializing the Minimizer, Prev: Minimization Overview, Up: One dimensional Minimization
+
+33.2 Caveats
+============
+
+Note that minimization functions can only search for one minimum at a
+time. When there are several minima in the search area, the first
+minimum to be found will be returned; however it is difficult to predict
+which of the minima this will be. _In most cases, no error will be
+reported if you try to find a minimum in an area where there is more
+than one._
+
+ With all minimization algorithms it can be difficult to determine the
+location of the minimum to full numerical precision. The behavior of
+the function in the region of the minimum x^* can be approximated by a
+Taylor expansion,
+
+ y = f(x^*) + (1/2) f''(x^*) (x - x^*)^2
+
+and the second term of this expansion can be lost when added to the
+first term at finite precision. This magnifies the error in locating
+x^*, making it proportional to \sqrt \epsilon (where \epsilon is the
+relative accuracy of the floating point numbers). For functions with
+higher order minima, such as x^4, the magnification of the error is
+correspondingly worse. The best that can be achieved is to converge to
+the limit of numerical accuracy in the function values, rather than the
+location of the minimum itself.
+
+
+File: gsl-ref.info, Node: Initializing the Minimizer, Next: Providing the function to minimize, Prev: Minimization Caveats, Up: One dimensional Minimization
+
+33.3 Initializing the Minimizer
+===============================
+
+ -- Function: gsl_min_fminimizer * gsl_min_fminimizer_alloc (const
+ gsl_min_fminimizer_type * T)
+ This function returns a pointer to a newly allocated instance of a
+ minimizer of type T. For example, the following code creates an
+ instance of a golden section minimizer,
+
+ const gsl_min_fminimizer_type * T
+ = gsl_min_fminimizer_goldensection;
+ gsl_min_fminimizer * s
+ = gsl_min_fminimizer_alloc (T);
+
+ If there is insufficient memory to create the minimizer then the
+ function returns a null pointer and the error handler is invoked
+ with an error code of `GSL_ENOMEM'.
+
+ -- Function: int gsl_min_fminimizer_set (gsl_min_fminimizer * S,
+ gsl_function * F, double X_MINIMUM, double X_LOWER, double
+ X_UPPER)
+ This function sets, or resets, an existing minimizer S to use the
+ function F and the initial search interval [X_LOWER, X_UPPER],
+ with a guess for the location of the minimum X_MINIMUM.
+
+ If the interval given does not contain a minimum, then the function
+ returns an error code of `GSL_EINVAL'.
+
+ -- Function: int gsl_min_fminimizer_set_with_values
+ (gsl_min_fminimizer * S, gsl_function * F, double X_MINIMUM,
+ double F_MINIMUM, double X_LOWER, double F_LOWER, double
+ X_UPPER, double F_UPPER)
+ This function is equivalent to `gsl_min_fminimizer_set' but uses
+ the values F_MINIMUM, F_LOWER and F_UPPER instead of computing
+ `f(x_minimum)', `f(x_lower)' and `f(x_upper)'.
+
+ -- Function: void gsl_min_fminimizer_free (gsl_min_fminimizer * S)
+ This function frees all the memory associated with the minimizer S.
+
+ -- Function: const char * gsl_min_fminimizer_name (const
+ gsl_min_fminimizer * S)
+ This function returns a pointer to the name of the minimizer. For
+ example,
+
+ printf ("s is a '%s' minimizer\n",
+ gsl_min_fminimizer_name (s));
+
+ would print something like `s is a 'brent' minimizer'.
+
+
+File: gsl-ref.info, Node: Providing the function to minimize, Next: Minimization Iteration, Prev: Initializing the Minimizer, Up: One dimensional Minimization
+
+33.4 Providing the function to minimize
+=======================================
+
+You must provide a continuous function of one variable for the
+minimizers to operate on. In order to allow for general parameters the
+functions are defined by a `gsl_function' data type (*note Providing
+the function to solve::).
+
+
+File: gsl-ref.info, Node: Minimization Iteration, Next: Minimization Stopping Parameters, Prev: Providing the function to minimize, Up: One dimensional Minimization
+
+33.5 Iteration
+==============
+
+The following functions drive the iteration of each algorithm. Each
+function performs one iteration to update the state of any minimizer of
+the corresponding type. The same functions work for all minimizers so
+that different methods can be substituted at runtime without
+modifications to the code.
+
+ -- Function: int gsl_min_fminimizer_iterate (gsl_min_fminimizer * S)
+ This function performs a single iteration of the minimizer S. If
+ the iteration encounters an unexpected problem then an error code
+ will be returned,
+
+ `GSL_EBADFUNC'
+ the iteration encountered a singular point where the function
+ evaluated to `Inf' or `NaN'.
+
+ `GSL_FAILURE'
+ the algorithm could not improve the current best
+ approximation or bounding interval.
+
+ The minimizer maintains a current best estimate of the position of
+the minimum at all times, and the current interval bounding the minimum.
+This information can be accessed with the following auxiliary functions,
+
+ -- Function: double gsl_min_fminimizer_x_minimum (const
+ gsl_min_fminimizer * S)
+ This function returns the current estimate of the position of the
+ minimum for the minimizer S.
+
+ -- Function: double gsl_min_fminimizer_x_upper (const
+ gsl_min_fminimizer * S)
+ -- Function: double gsl_min_fminimizer_x_lower (const
+ gsl_min_fminimizer * S)
+ These functions return the current upper and lower bound of the
+ interval for the minimizer S.
+
+ -- Function: double gsl_min_fminimizer_f_minimum (const
+ gsl_min_fminimizer * S)
+ -- Function: double gsl_min_fminimizer_f_upper (const
+ gsl_min_fminimizer * S)
+ -- Function: double gsl_min_fminimizer_f_lower (const
+ gsl_min_fminimizer * S)
+ These functions return the value of the function at the current
+ estimate of the minimum and at the upper and lower bounds of the
+ interval for the minimizer S.
+
+
+File: gsl-ref.info, Node: Minimization Stopping Parameters, Next: Minimization Algorithms, Prev: Minimization Iteration, Up: One dimensional Minimization
+
+33.6 Stopping Parameters
+========================
+
+A minimization procedure should stop when one of the following
+conditions is true:
+
+ * A minimum has been found to within the user-specified precision.
+
+ * A user-specified maximum number of iterations has been reached.
+
+ * An error has occurred.
+
+The handling of these conditions is under user control. The function
+below allows the user to test the precision of the current result.
+
+ -- Function: int gsl_min_test_interval (double X_LOWER, double
+ X_UPPER, double EPSABS, double EPSREL)
+ This function tests for the convergence of the interval [X_LOWER,
+ X_UPPER] with absolute error EPSABS and relative error EPSREL.
+ The test returns `GSL_SUCCESS' if the following condition is
+ achieved,
+
+ |a - b| < epsabs + epsrel min(|a|,|b|)
+
+ when the interval x = [a,b] does not include the origin. If the
+ interval includes the origin then \min(|a|,|b|) is replaced by
+ zero (which is the minimum value of |x| over the interval). This
+ ensures that the relative error is accurately estimated for minima
+ close to the origin.
+
+ This condition on the interval also implies that any estimate of
+ the minimum x_m in the interval satisfies the same condition with
+ respect to the true minimum x_m^*,
+
+ |x_m - x_m^*| < epsabs + epsrel x_m^*
+
+ assuming that the true minimum x_m^* is contained within the
+ interval.
+
+
+File: gsl-ref.info, Node: Minimization Algorithms, Next: Minimization Examples, Prev: Minimization Stopping Parameters, Up: One dimensional Minimization
+
+33.7 Minimization Algorithms
+============================
+
+The minimization algorithms described in this section require an initial
+interval which is guaranteed to contain a minimum--if a and b are the
+endpoints of the interval and x is an estimate of the minimum then f(a)
+> f(x) < f(b). This ensures that the function has at least one minimum
+somewhere in the interval. If a valid initial interval is used then
+these algorithm cannot fail, provided the function is well-behaved.
+
+ -- Minimizer: gsl_min_fminimizer_goldensection
+ The "golden section algorithm" is the simplest method of bracketing
+ the minimum of a function. It is the slowest algorithm provided
+ by the library, with linear convergence.
+
+ On each iteration, the algorithm first compares the subintervals
+ from the endpoints to the current minimum. The larger subinterval
+ is divided in a golden section (using the famous ratio (3-\sqrt
+ 5)/2 = 0.3189660...) and the value of the function at this new
+ point is calculated. The new value is used with the constraint
+ f(a') > f(x') < f(b') to a select new interval containing the
+ minimum, by discarding the least useful point. This procedure can
+ be continued indefinitely until the interval is sufficiently
+ small. Choosing the golden section as the bisection ratio can be
+ shown to provide the fastest convergence for this type of
+ algorithm.
+
+
+ -- Minimizer: gsl_min_fminimizer_brent
+ The "Brent minimization algorithm" combines a parabolic
+ interpolation with the golden section algorithm. This produces a
+ fast algorithm which is still robust.
+
+ The outline of the algorithm can be summarized as follows: on each
+ iteration Brent's method approximates the function using an
+ interpolating parabola through three existing points. The minimum
+ of the parabola is taken as a guess for the minimum. If it lies
+ within the bounds of the current interval then the interpolating
+ point is accepted, and used to generate a smaller interval. If
+ the interpolating point is not accepted then the algorithm falls
+ back to an ordinary golden section step. The full details of
+ Brent's method include some additional checks to improve
+ convergence.
+
+
+File: gsl-ref.info, Node: Minimization Examples, Next: Minimization References and Further Reading, Prev: Minimization Algorithms, Up: One dimensional Minimization
+
+33.8 Examples
+=============
+
+The following program uses the Brent algorithm to find the minimum of
+the function f(x) = \cos(x) + 1, which occurs at x = \pi. The starting
+interval is (0,6), with an initial guess for the minimum of 2.
+
+ #include <stdio.h>
+ #include <gsl/gsl_errno.h>
+ #include <gsl/gsl_math.h>
+ #include <gsl/gsl_min.h>
+
+ double fn1 (double x, void * params)
+ {
+ return cos(x) + 1.0;
+ }
+
+ int
+ main (void)
+ {
+ int status;
+ int iter = 0, max_iter = 100;
+ const gsl_min_fminimizer_type *T;
+ gsl_min_fminimizer *s;
+ double m = 2.0, m_expected = M_PI;
+ double a = 0.0, b = 6.0;
+ gsl_function F;
+
+ F.function = &fn1;
+ F.params = 0;
+
+ T = gsl_min_fminimizer_brent;
+ s = gsl_min_fminimizer_alloc (T);
+ gsl_min_fminimizer_set (s, &F, m, a, b);
+
+ printf ("using %s method\n",
+ gsl_min_fminimizer_name (s));
+
+ printf ("%5s [%9s, %9s] %9s %10s %9s\n",
+ "iter", "lower", "upper", "min",
+ "err", "err(est)");
+
+ printf ("%5d [%.7f, %.7f] %.7f %+.7f %.7f\n",
+ iter, a, b,
+ m, m - m_expected, b - a);
+
+ do
+ {
+ iter++;
+ status = gsl_min_fminimizer_iterate (s);
+
+ m = gsl_min_fminimizer_x_minimum (s);
+ a = gsl_min_fminimizer_x_lower (s);
+ b = gsl_min_fminimizer_x_upper (s);
+
+ status
+ = gsl_min_test_interval (a, b, 0.001, 0.0);
+
+ if (status == GSL_SUCCESS)
+ printf ("Converged:\n");
+
+ printf ("%5d [%.7f, %.7f] "
+ "%.7f %.7f %+.7f %.7f\n",
+ iter, a, b,
+ m, m_expected, m - m_expected, b - a);
+ }
+ while (status == GSL_CONTINUE && iter < max_iter);
+
+ gsl_min_fminimizer_free (s);
+
+ return status;
+ }
+
+Here are the results of the minimization procedure.
+
+ $ ./a.out
+ 0 [0.0000000, 6.0000000] 2.0000000 -1.1415927 6.0000000
+ 1 [2.0000000, 6.0000000] 3.2758640 +0.1342713 4.0000000
+ 2 [2.0000000, 3.2831929] 3.2758640 +0.1342713 1.2831929
+ 3 [2.8689068, 3.2831929] 3.2758640 +0.1342713 0.4142862
+ 4 [2.8689068, 3.2831929] 3.2758640 +0.1342713 0.4142862
+ 5 [2.8689068, 3.2758640] 3.1460585 +0.0044658 0.4069572
+ 6 [3.1346075, 3.2758640] 3.1460585 +0.0044658 0.1412565
+ 7 [3.1346075, 3.1874620] 3.1460585 +0.0044658 0.0528545
+ 8 [3.1346075, 3.1460585] 3.1460585 +0.0044658 0.0114510
+ 9 [3.1346075, 3.1460585] 3.1424060 +0.0008133 0.0114510
+ 10 [3.1346075, 3.1424060] 3.1415885 -0.0000041 0.0077985
+ Converged:
+ 11 [3.1415885, 3.1424060] 3.1415927 -0.0000000 0.0008175
+
+
+File: gsl-ref.info, Node: Minimization References and Further Reading, Prev: Minimization Examples, Up: One dimensional Minimization
+
+33.9 References and Further Reading
+===================================
+
+Further information on Brent's algorithm is available in the following
+book,
+
+ Richard Brent, `Algorithms for minimization without derivatives',
+ Prentice-Hall (1973), republished by Dover in paperback (2002),
+ ISBN 0-486-41998-3.
+
+
+File: gsl-ref.info, Node: Multidimensional Root-Finding, Next: Multidimensional Minimization, Prev: One dimensional Minimization, Up: Top
+
+34 Multidimensional Root-Finding
+********************************
+
+This chapter describes functions for multidimensional root-finding
+(solving nonlinear systems with n equations in n unknowns). The
+library provides low level components for a variety of iterative
+solvers and convergence tests. These can be combined by the user to
+achieve the desired solution, with full access to the intermediate
+steps of the iteration. Each class of methods uses the same framework,
+so that you can switch between solvers at runtime without needing to
+recompile your program. Each instance of a solver keeps track of its
+own state, allowing the solvers to be used in multi-threaded programs.
+The solvers are based on the original Fortran library MINPACK.
+
+ The header file `gsl_multiroots.h' contains prototypes for the
+multidimensional root finding functions and related declarations.
+
+* Menu:
+
+* Overview of Multidimensional Root Finding::
+* Initializing the Multidimensional Solver::
+* Providing the multidimensional system of equations to solve::
+* Iteration of the multidimensional solver::
+* Search Stopping Parameters for the multidimensional solver::
+* Algorithms using Derivatives::
+* Algorithms without Derivatives::
+* Example programs for Multidimensional Root finding::
+* References and Further Reading for Multidimensional Root Finding::
+
+
+File: gsl-ref.info, Node: Overview of Multidimensional Root Finding, Next: Initializing the Multidimensional Solver, Up: Multidimensional Root-Finding
+
+34.1 Overview
+=============
+
+The problem of multidimensional root finding requires the simultaneous
+solution of n equations, f_i, in n variables, x_i,
+
+ f_i (x_1, ..., x_n) = 0 for i = 1 ... n.
+
+In general there are no bracketing methods available for n dimensional
+systems, and no way of knowing whether any solutions exist. All
+algorithms proceed from an initial guess using a variant of the Newton
+iteration,
+
+ x -> x' = x - J^{-1} f(x)
+
+where x, f are vector quantities and J is the Jacobian matrix J_{ij} =
+d f_i / d x_j. Additional strategies can be used to enlarge the region
+of convergence. These include requiring a decrease in the norm |f| on
+each step proposed by Newton's method, or taking steepest-descent steps
+in the direction of the negative gradient of |f|.
+
+ Several root-finding algorithms are available within a single
+framework. The user provides a high-level driver for the algorithms,
+and the library provides the individual functions necessary for each of
+the steps. There are three main phases of the iteration. The steps
+are,
+
+ * initialize solver state, S, for algorithm T
+
+ * update S using the iteration T
+
+ * test S for convergence, and repeat iteration if necessary
+
+The evaluation of the Jacobian matrix can be problematic, either because
+programming the derivatives is intractable or because computation of the
+n^2 terms of the matrix becomes too expensive. For these reasons the
+algorithms provided by the library are divided into two classes
+according to whether the derivatives are available or not.
+
+ The state for solvers with an analytic Jacobian matrix is held in a
+`gsl_multiroot_fdfsolver' struct. The updating procedure requires both
+the function and its derivatives to be supplied by the user.
+
+ The state for solvers which do not use an analytic Jacobian matrix is
+held in a `gsl_multiroot_fsolver' struct. The updating procedure uses
+only function evaluations (not derivatives). The algorithms estimate
+the matrix J or J^{-1} by approximate methods.
+
+
+File: gsl-ref.info, Node: Initializing the Multidimensional Solver, Next: Providing the multidimensional system of equations to solve, Prev: Overview of Multidimensional Root Finding, Up: Multidimensional Root-Finding
+
+34.2 Initializing the Solver
+============================
+
+The following functions initialize a multidimensional solver, either
+with or without derivatives. The solver itself depends only on the
+dimension of the problem and the algorithm and can be reused for
+different problems.
+
+ -- Function: gsl_multiroot_fsolver * gsl_multiroot_fsolver_alloc
+ (const gsl_multiroot_fsolver_type * T, size_t N)
+ This function returns a pointer to a newly allocated instance of a
+ solver of type T for a system of N dimensions. For example, the
+ following code creates an instance of a hybrid solver, to solve a
+ 3-dimensional system of equations.
+
+ const gsl_multiroot_fsolver_type * T
+ = gsl_multiroot_fsolver_hybrid;
+ gsl_multiroot_fsolver * s
+ = gsl_multiroot_fsolver_alloc (T, 3);
+
+ If there is insufficient memory to create the solver then the
+ function returns a null pointer and the error handler is invoked
+ with an error code of `GSL_ENOMEM'.
+
+ -- Function: gsl_multiroot_fdfsolver * gsl_multiroot_fdfsolver_alloc
+ (const gsl_multiroot_fdfsolver_type * T, size_t N)
+ This function returns a pointer to a newly allocated instance of a
+ derivative solver of type T for a system of N dimensions. For
+ example, the following code creates an instance of a
+ Newton-Raphson solver, for a 2-dimensional system of equations.
+
+ const gsl_multiroot_fdfsolver_type * T
+ = gsl_multiroot_fdfsolver_newton;
+ gsl_multiroot_fdfsolver * s =
+ gsl_multiroot_fdfsolver_alloc (T, 2);
+
+ If there is insufficient memory to create the solver then the
+ function returns a null pointer and the error handler is invoked
+ with an error code of `GSL_ENOMEM'.
+
+ -- Function: int gsl_multiroot_fsolver_set (gsl_multiroot_fsolver * S,
+ gsl_multiroot_function * F, gsl_vector * X)
+ This function sets, or resets, an existing solver S to use the
+ function F and the initial guess X.
+
+ -- Function: int gsl_multiroot_fdfsolver_set (gsl_multiroot_fdfsolver
+ * S, gsl_multiroot_function_fdf * FDF, gsl_vector * X)
+ This function sets, or resets, an existing solver S to use the
+ function and derivative FDF and the initial guess X.
+
+ -- Function: void gsl_multiroot_fsolver_free (gsl_multiroot_fsolver *
+ S)
+ -- Function: void gsl_multiroot_fdfsolver_free
+ (gsl_multiroot_fdfsolver * S)
+ These functions free all the memory associated with the solver S.
+
+ -- Function: const char * gsl_multiroot_fsolver_name (const
+ gsl_multiroot_fsolver * S)
+ -- Function: const char * gsl_multiroot_fdfsolver_name (const
+ gsl_multiroot_fdfsolver * S)
+ These functions return a pointer to the name of the solver. For
+ example,
+
+ printf ("s is a '%s' solver\n",
+ gsl_multiroot_fdfsolver_name (s));
+
+ would print something like `s is a 'newton' solver'.
+
+
+File: gsl-ref.info, Node: Providing the multidimensional system of equations to solve, Next: Iteration of the multidimensional solver, Prev: Initializing the Multidimensional Solver, Up: Multidimensional Root-Finding
+
+34.3 Providing the function to solve
+====================================
+
+You must provide n functions of n variables for the root finders to
+operate on. In order to allow for general parameters the functions are
+defined by the following data types:
+
+ -- Data Type: gsl_multiroot_function
+ This data type defines a general system of functions with
+ parameters.
+
+ `int (* f) (const gsl_vector * X, void * PARAMS, gsl_vector * F)'
+ this function should store the vector result f(x,params) in F
+ for argument X and parameters PARAMS, returning an
+ appropriate error code if the function cannot be computed.
+
+ `size_t n'
+ the dimension of the system, i.e. the number of components of
+ the vectors X and F.
+
+ `void * params'
+ a pointer to the parameters of the function.
+
+Here is an example using Powell's test function,
+
+ f_1(x) = A x_0 x_1 - 1,
+ f_2(x) = exp(-x_0) + exp(-x_1) - (1 + 1/A)
+
+with A = 10^4. The following code defines a `gsl_multiroot_function'
+system `F' which you could pass to a solver:
+
+ struct powell_params { double A; };
+
+ int
+ powell (gsl_vector * x, void * p, gsl_vector * f) {
+ struct powell_params * params
+ = *(struct powell_params *)p;
+ const double A = (params->A);
+ const double x0 = gsl_vector_get(x,0);
+ const double x1 = gsl_vector_get(x,1);
+
+ gsl_vector_set (f, 0, A * x0 * x1 - 1);
+ gsl_vector_set (f, 1, (exp(-x0) + exp(-x1)
+ - (1.0 + 1.0/A)));
+ return GSL_SUCCESS
+ }
+
+ gsl_multiroot_function F;
+ struct powell_params params = { 10000.0 };
+
+ F.f = &powell;
+ F.n = 2;
+ F.params = &params;
+
+ -- Data Type: gsl_multiroot_function_fdf
+ This data type defines a general system of functions with
+ parameters and the corresponding Jacobian matrix of derivatives,
+
+ `int (* f) (const gsl_vector * X, void * PARAMS, gsl_vector * F)'
+ this function should store the vector result f(x,params) in F
+ for argument X and parameters PARAMS, returning an
+ appropriate error code if the function cannot be computed.
+
+ `int (* df) (const gsl_vector * X, void * PARAMS, gsl_matrix * J)'
+ this function should store the N-by-N matrix result J_ij = d
+ f_i(x,params) / d x_j in J for argument X and parameters
+ PARAMS, returning an appropriate error code if the function
+ cannot be computed.
+
+ `int (* fdf) (const gsl_vector * X, void * PARAMS, gsl_vector * F, gsl_matrix * J)'
+ This function should set the values of the F and J as above,
+ for arguments X and parameters PARAMS. This function
+ provides an optimization of the separate functions for f(x)
+ and J(x)--it is always faster to compute the function and its
+ derivative at the same time.
+
+ `size_t n'
+ the dimension of the system, i.e. the number of components of
+ the vectors X and F.
+
+ `void * params'
+ a pointer to the parameters of the function.
+
+The example of Powell's test function defined above can be extended to
+include analytic derivatives using the following code,
+
+ int
+ powell_df (gsl_vector * x, void * p, gsl_matrix * J)
+ {
+ struct powell_params * params
+ = *(struct powell_params *)p;
+ const double A = (params->A);
+ const double x0 = gsl_vector_get(x,0);
+ const double x1 = gsl_vector_get(x,1);
+ gsl_matrix_set (J, 0, 0, A * x1);
+ gsl_matrix_set (J, 0, 1, A * x0);
+ gsl_matrix_set (J, 1, 0, -exp(-x0));
+ gsl_matrix_set (J, 1, 1, -exp(-x1));
+ return GSL_SUCCESS
+ }
+
+ int
+ powell_fdf (gsl_vector * x, void * p,
+ gsl_matrix * f, gsl_matrix * J) {
+ struct powell_params * params
+ = *(struct powell_params *)p;
+ const double A = (params->A);
+ const double x0 = gsl_vector_get(x,0);
+ const double x1 = gsl_vector_get(x,1);
+
+ const double u0 = exp(-x0);
+ const double u1 = exp(-x1);
+
+ gsl_vector_set (f, 0, A * x0 * x1 - 1);
+ gsl_vector_set (f, 1, u0 + u1 - (1 + 1/A));
+
+ gsl_matrix_set (J, 0, 0, A * x1);
+ gsl_matrix_set (J, 0, 1, A * x0);
+ gsl_matrix_set (J, 1, 0, -u0);
+ gsl_matrix_set (J, 1, 1, -u1);
+ return GSL_SUCCESS
+ }
+
+ gsl_multiroot_function_fdf FDF;
+
+ FDF.f = &powell_f;
+ FDF.df = &powell_df;
+ FDF.fdf = &powell_fdf;
+ FDF.n = 2;
+ FDF.params = 0;
+
+Note that the function `powell_fdf' is able to reuse existing terms
+from the function when calculating the Jacobian, thus saving time.
+
+
+File: gsl-ref.info, Node: Iteration of the multidimensional solver, Next: Search Stopping Parameters for the multidimensional solver, Prev: Providing the multidimensional system of equations to solve, Up: Multidimensional Root-Finding
+
+34.4 Iteration
+==============
+
+The following functions drive the iteration of each algorithm. Each
+function performs one iteration to update the state of any solver of the
+corresponding type. The same functions work for all solvers so that
+different methods can be substituted at runtime without modifications to
+the code.
+
+ -- Function: int gsl_multiroot_fsolver_iterate (gsl_multiroot_fsolver
+ * S)
+ -- Function: int gsl_multiroot_fdfsolver_iterate
+ (gsl_multiroot_fdfsolver * S)
+ These functions perform a single iteration of the solver S. If the
+ iteration encounters an unexpected problem then an error code will
+ be returned,
+
+ `GSL_EBADFUNC'
+ the iteration encountered a singular point where the function
+ or its derivative evaluated to `Inf' or `NaN'.
+
+ `GSL_ENOPROG'
+ the iteration is not making any progress, preventing the
+ algorithm from continuing.
+
+ The solver maintains a current best estimate of the root at all
+times. This information can be accessed with the following auxiliary
+functions,
+
+ -- Function: gsl_vector * gsl_multiroot_fsolver_root (const
+ gsl_multiroot_fsolver * S)
+ -- Function: gsl_vector * gsl_multiroot_fdfsolver_root (const
+ gsl_multiroot_fdfsolver * S)
+ These functions return the current estimate of the root for the
+ solver S.
+
+ -- Function: gsl_vector * gsl_multiroot_fsolver_f (const
+ gsl_multiroot_fsolver * S)
+ -- Function: gsl_vector * gsl_multiroot_fdfsolver_f (const
+ gsl_multiroot_fdfsolver * S)
+ These functions return the function value f(x) at the current
+ estimate of the root for the solver S.
+
+ -- Function: gsl_vector * gsl_multiroot_fsolver_dx (const
+ gsl_multiroot_fsolver * S)
+ -- Function: gsl_vector * gsl_multiroot_fdfsolver_dx (const
+ gsl_multiroot_fdfsolver * S)
+ These functions return the last step dx taken by the solver S.
+
+
+File: gsl-ref.info, Node: Search Stopping Parameters for the multidimensional solver, Next: Algorithms using Derivatives, Prev: Iteration of the multidimensional solver, Up: Multidimensional Root-Finding
+
+34.5 Search Stopping Parameters
+===============================
+
+A root finding procedure should stop when one of the following
+conditions is true:
+
+ * A multidimensional root has been found to within the
+ user-specified precision.
+
+ * A user-specified maximum number of iterations has been reached.
+
+ * An error has occurred.
+
+The handling of these conditions is under user control. The functions
+below allow the user to test the precision of the current result in
+several standard ways.
+
+ -- Function: int gsl_multiroot_test_delta (const gsl_vector * DX,
+ const gsl_vector * X, double EPSABS, double EPSREL)
+ This function tests for the convergence of the sequence by
+ comparing the last step DX with the absolute error EPSABS and
+ relative error EPSREL to the current position X. The test returns
+ `GSL_SUCCESS' if the following condition is achieved,
+
+ |dx_i| < epsabs + epsrel |x_i|
+
+ for each component of X and returns `GSL_CONTINUE' otherwise.
+
+ -- Function: int gsl_multiroot_test_residual (const gsl_vector * F,
+ double EPSABS)
+ This function tests the residual value F against the absolute
+ error bound EPSABS. The test returns `GSL_SUCCESS' if the
+ following condition is achieved,
+
+ \sum_i |f_i| < epsabs
+
+ and returns `GSL_CONTINUE' otherwise. This criterion is suitable
+ for situations where the precise location of the root, x, is
+ unimportant provided a value can be found where the residual is
+ small enough.
+
+
+File: gsl-ref.info, Node: Algorithms using Derivatives, Next: Algorithms without Derivatives, Prev: Search Stopping Parameters for the multidimensional solver, Up: Multidimensional Root-Finding
+
+34.6 Algorithms using Derivatives
+=================================
+
+The root finding algorithms described in this section make use of both
+the function and its derivative. They require an initial guess for the
+location of the root, but there is no absolute guarantee of
+convergence--the function must be suitable for this technique and the
+initial guess must be sufficiently close to the root for it to work.
+When the conditions are satisfied then convergence is quadratic.
+
+ -- Derivative Solver: gsl_multiroot_fdfsolver_hybridsj
+ This is a modified version of Powell's Hybrid method as
+ implemented in the HYBRJ algorithm in MINPACK. Minpack was
+ written by Jorge J. More', Burton S. Garbow and Kenneth E.
+ Hillstrom. The Hybrid algorithm retains the fast convergence of
+ Newton's method but will also reduce the residual when Newton's
+ method is unreliable.
+
+ The algorithm uses a generalized trust region to keep each step
+ under control. In order to be accepted a proposed new position x'
+ must satisfy the condition |D (x' - x)| < \delta, where D is a
+ diagonal scaling matrix and \delta is the size of the trust
+ region. The components of D are computed internally, using the
+ column norms of the Jacobian to estimate the sensitivity of the
+ residual to each component of x. This improves the behavior of the
+ algorithm for badly scaled functions.
+
+ On each iteration the algorithm first determines the standard
+ Newton step by solving the system J dx = - f. If this step falls
+ inside the trust region it is used as a trial step in the next
+ stage. If not, the algorithm uses the linear combination of the
+ Newton and gradient directions which is predicted to minimize the
+ norm of the function while staying inside the trust region,
+
+ dx = - \alpha J^{-1} f(x) - \beta \nabla |f(x)|^2.
+
+ This combination of Newton and gradient directions is referred to
+ as a "dogleg step".
+
+ The proposed step is now tested by evaluating the function at the
+ resulting point, x'. If the step reduces the norm of the function
+ sufficiently then it is accepted and size of the trust region is
+ increased. If the proposed step fails to improve the solution
+ then the size of the trust region is decreased and another trial
+ step is computed.
+
+ The speed of the algorithm is increased by computing the changes
+ to the Jacobian approximately, using a rank-1 update. If two
+ successive attempts fail to reduce the residual then the full
+ Jacobian is recomputed. The algorithm also monitors the progress
+ of the solution and returns an error if several steps fail to make
+ any improvement,
+
+ `GSL_ENOPROG'
+ the iteration is not making any progress, preventing the
+ algorithm from continuing.
+
+ `GSL_ENOPROGJ'
+ re-evaluations of the Jacobian indicate that the iteration is
+ not making any progress, preventing the algorithm from
+ continuing.
+
+
+ -- Derivative Solver: gsl_multiroot_fdfsolver_hybridj
+ This algorithm is an unscaled version of `hybridsj'. The steps are
+ controlled by a spherical trust region |x' - x| < \delta, instead
+ of a generalized region. This can be useful if the generalized
+ region estimated by `hybridsj' is inappropriate.
+
+ -- Derivative Solver: gsl_multiroot_fdfsolver_newton
+ Newton's Method is the standard root-polishing algorithm. The
+ algorithm begins with an initial guess for the location of the
+ solution. On each iteration a linear approximation to the
+ function F is used to estimate the step which will zero all the
+ components of the residual. The iteration is defined by the
+ following sequence,
+
+ x -> x' = x - J^{-1} f(x)
+
+ where the Jacobian matrix J is computed from the derivative
+ functions provided by F. The step dx is obtained by solving the
+ linear system,
+
+ J dx = - f(x)
+
+ using LU decomposition.
+
+ -- Derivative Solver: gsl_multiroot_fdfsolver_gnewton
+ This is a modified version of Newton's method which attempts to
+ improve global convergence by requiring every step to reduce the
+ Euclidean norm of the residual, |f(x)|. If the Newton step leads
+ to an increase in the norm then a reduced step of relative size,
+
+ t = (\sqrt(1 + 6 r) - 1) / (3 r)
+
+ is proposed, with r being the ratio of norms |f(x')|^2/|f(x)|^2.
+ This procedure is repeated until a suitable step size is found.
+
+
+File: gsl-ref.info, Node: Algorithms without Derivatives, Next: Example programs for Multidimensional Root finding, Prev: Algorithms using Derivatives, Up: Multidimensional Root-Finding
+
+34.7 Algorithms without Derivatives
+===================================
+
+The algorithms described in this section do not require any derivative
+information to be supplied by the user. Any derivatives needed are
+approximated by finite differences. Note that if the
+finite-differencing step size chosen by these routines is inappropriate,
+an explicit user-supplied numerical derivative can always be used with
+the algorithms described in the previous section.
+
+ -- Solver: gsl_multiroot_fsolver_hybrids
+ This is a version of the Hybrid algorithm which replaces calls to
+ the Jacobian function by its finite difference approximation. The
+ finite difference approximation is computed using
+ `gsl_multiroots_fdjac' with a relative step size of
+ `GSL_SQRT_DBL_EPSILON'. Note that this step size will not be
+ suitable for all problems.
+
+ -- Solver: gsl_multiroot_fsolver_hybrid
+ This is a finite difference version of the Hybrid algorithm without
+ internal scaling.
+
+ -- Solver: gsl_multiroot_fsolver_dnewton
+ The "discrete Newton algorithm" is the simplest method of solving a
+ multidimensional system. It uses the Newton iteration
+
+ x -> x - J^{-1} f(x)
+
+ where the Jacobian matrix J is approximated by taking finite
+ differences of the function F. The approximation scheme used by
+ this implementation is,
+
+ J_{ij} = (f_i(x + \delta_j) - f_i(x)) / \delta_j
+
+ where \delta_j is a step of size \sqrt\epsilon |x_j| with \epsilon
+ being the machine precision (\epsilon \approx 2.22 \times 10^-16).
+ The order of convergence of Newton's algorithm is quadratic, but
+ the finite differences require n^2 function evaluations on each
+ iteration. The algorithm may become unstable if the finite
+ differences are not a good approximation to the true derivatives.
+
+ -- Solver: gsl_multiroot_fsolver_broyden
+ The "Broyden algorithm" is a version of the discrete Newton
+ algorithm which attempts to avoids the expensive update of the
+ Jacobian matrix on each iteration. The changes to the Jacobian
+ are also approximated, using a rank-1 update,
+
+ J^{-1} \to J^{-1} - (J^{-1} df - dx) dx^T J^{-1} / dx^T J^{-1} df
+
+ where the vectors dx and df are the changes in x and f. On the
+ first iteration the inverse Jacobian is estimated using finite
+ differences, as in the discrete Newton algorithm.
+
+ This approximation gives a fast update but is unreliable if the
+ changes are not small, and the estimate of the inverse Jacobian
+ becomes worse as time passes. The algorithm has a tendency to
+ become unstable unless it starts close to the root. The Jacobian
+ is refreshed if this instability is detected (consult the source
+ for details).
+
+ This algorithm is included only for demonstration purposes, and is
+ not recommended for serious use.
+
+
+File: gsl-ref.info, Node: Example programs for Multidimensional Root finding, Next: References and Further Reading for Multidimensional Root Finding, Prev: Algorithms without Derivatives, Up: Multidimensional Root-Finding
+
+34.8 Examples
+=============
+
+The multidimensional solvers are used in a similar way to the
+one-dimensional root finding algorithms. This first example
+demonstrates the `hybrids' scaled-hybrid algorithm, which does not
+require derivatives. The program solves the Rosenbrock system of
+equations,
+
+ f_1 (x, y) = a (1 - x)
+ f_2 (x, y) = b (y - x^2)
+
+with a = 1, b = 10. The solution of this system lies at (x,y) = (1,1)
+in a narrow valley.
+
+ The first stage of the program is to define the system of equations,
+
+ #include <stdlib.h>
+ #include <stdio.h>
+ #include <gsl/gsl_vector.h>
+ #include <gsl/gsl_multiroots.h>
+
+ struct rparams
+ {
+ double a;
+ double b;
+ };
+
+ int
+ rosenbrock_f (const gsl_vector * x, void *params,
+ gsl_vector * f)
+ {
+ double a = ((struct rparams *) params)->a;
+ double b = ((struct rparams *) params)->b;
+
+ const double x0 = gsl_vector_get (x, 0);
+ const double x1 = gsl_vector_get (x, 1);
+
+ const double y0 = a * (1 - x0);
+ const double y1 = b * (x1 - x0 * x0);
+
+ gsl_vector_set (f, 0, y0);
+ gsl_vector_set (f, 1, y1);
+
+ return GSL_SUCCESS;
+ }
+
+The main program begins by creating the function object `f', with the
+arguments `(x,y)' and parameters `(a,b)'. The solver `s' is initialized
+to use this function, with the `hybrids' method.
+
+ int
+ main (void)
+ {
+ const gsl_multiroot_fsolver_type *T;
+ gsl_multiroot_fsolver *s;
+
+ int status;
+ size_t i, iter = 0;
+
+ const size_t n = 2;
+ struct rparams p = {1.0, 10.0};
+ gsl_multiroot_function f = {&rosenbrock_f, n, &p};
+
+ double x_init[2] = {-10.0, -5.0};
+ gsl_vector *x = gsl_vector_alloc (n);
+
+ gsl_vector_set (x, 0, x_init[0]);
+ gsl_vector_set (x, 1, x_init[1]);
+
+ T = gsl_multiroot_fsolver_hybrids;
+ s = gsl_multiroot_fsolver_alloc (T, 2);
+ gsl_multiroot_fsolver_set (s, &f, x);
+
+ print_state (iter, s);
+
+ do
+ {
+ iter++;
+ status = gsl_multiroot_fsolver_iterate (s);
+
+ print_state (iter, s);
+
+ if (status) /* check if solver is stuck */
+ break;
+
+ status =
+ gsl_multiroot_test_residual (s->f, 1e-7);
+ }
+ while (status == GSL_CONTINUE && iter < 1000);
+
+ printf ("status = %s\n", gsl_strerror (status));
+
+ gsl_multiroot_fsolver_free (s);
+ gsl_vector_free (x);
+ return 0;
+ }
+
+Note that it is important to check the return status of each solver
+step, in case the algorithm becomes stuck. If an error condition is
+detected, indicating that the algorithm cannot proceed, then the error
+can be reported to the user, a new starting point chosen or a different
+algorithm used.
+
+ The intermediate state of the solution is displayed by the following
+function. The solver state contains the vector `s->x' which is the
+current position, and the vector `s->f' with corresponding function
+values.
+
+ int
+ print_state (size_t iter, gsl_multiroot_fsolver * s)
+ {
+ printf ("iter = %3u x = % .3f % .3f "
+ "f(x) = % .3e % .3e\n",
+ iter,
+ gsl_vector_get (s->x, 0),
+ gsl_vector_get (s->x, 1),
+ gsl_vector_get (s->f, 0),
+ gsl_vector_get (s->f, 1));
+ }
+
+Here are the results of running the program. The algorithm is started at
+(-10,-5) far from the solution. Since the solution is hidden in a
+narrow valley the earliest steps follow the gradient of the function
+downhill, in an attempt to reduce the large value of the residual. Once
+the root has been approximately located, on iteration 8, the Newton
+behavior takes over and convergence is very rapid.
+
+ iter = 0 x = -10.000 -5.000 f(x) = 1.100e+01 -1.050e+03
+ iter = 1 x = -10.000 -5.000 f(x) = 1.100e+01 -1.050e+03
+ iter = 2 x = -3.976 24.827 f(x) = 4.976e+00 9.020e+01
+ iter = 3 x = -3.976 24.827 f(x) = 4.976e+00 9.020e+01
+ iter = 4 x = -3.976 24.827 f(x) = 4.976e+00 9.020e+01
+ iter = 5 x = -1.274 -5.680 f(x) = 2.274e+00 -7.302e+01
+ iter = 6 x = -1.274 -5.680 f(x) = 2.274e+00 -7.302e+01
+ iter = 7 x = 0.249 0.298 f(x) = 7.511e-01 2.359e+00
+ iter = 8 x = 0.249 0.298 f(x) = 7.511e-01 2.359e+00
+ iter = 9 x = 1.000 0.878 f(x) = 1.268e-10 -1.218e+00
+ iter = 10 x = 1.000 0.989 f(x) = 1.124e-11 -1.080e-01
+ iter = 11 x = 1.000 1.000 f(x) = 0.000e+00 0.000e+00
+ status = success
+
+Note that the algorithm does not update the location on every
+iteration. Some iterations are used to adjust the trust-region
+parameter, after trying a step which was found to be divergent, or to
+recompute the Jacobian, when poor convergence behavior is detected.
+
+ The next example program adds derivative information, in order to
+accelerate the solution. There are two derivative functions
+`rosenbrock_df' and `rosenbrock_fdf'. The latter computes both the
+function and its derivative simultaneously. This allows the
+optimization of any common terms. For simplicity we substitute calls to
+the separate `f' and `df' functions at this point in the code below.
+
+ int
+ rosenbrock_df (const gsl_vector * x, void *params,
+ gsl_matrix * J)
+ {
+ const double a = ((struct rparams *) params)->a;
+ const double b = ((struct rparams *) params)->b;
+
+ const double x0 = gsl_vector_get (x, 0);
+
+ const double df00 = -a;
+ const double df01 = 0;
+ const double df10 = -2 * b * x0;
+ const double df11 = b;
+
+ gsl_matrix_set (J, 0, 0, df00);
+ gsl_matrix_set (J, 0, 1, df01);
+ gsl_matrix_set (J, 1, 0, df10);
+ gsl_matrix_set (J, 1, 1, df11);
+
+ return GSL_SUCCESS;
+ }
+
+ int
+ rosenbrock_fdf (const gsl_vector * x, void *params,
+ gsl_vector * f, gsl_matrix * J)
+ {
+ rosenbrock_f (x, params, f);
+ rosenbrock_df (x, params, J);
+
+ return GSL_SUCCESS;
+ }
+
+The main program now makes calls to the corresponding `fdfsolver'
+versions of the functions,
+
+ int
+ main (void)
+ {
+ const gsl_multiroot_fdfsolver_type *T;
+ gsl_multiroot_fdfsolver *s;
+
+ int status;
+ size_t i, iter = 0;
+
+ const size_t n = 2;
+ struct rparams p = {1.0, 10.0};
+ gsl_multiroot_function_fdf f = {&rosenbrock_f,
+ &rosenbrock_df,
+ &rosenbrock_fdf,
+ n, &p};
+
+ double x_init[2] = {-10.0, -5.0};
+ gsl_vector *x = gsl_vector_alloc (n);
+
+ gsl_vector_set (x, 0, x_init[0]);
+ gsl_vector_set (x, 1, x_init[1]);
+
+ T = gsl_multiroot_fdfsolver_gnewton;
+ s = gsl_multiroot_fdfsolver_alloc (T, n);
+ gsl_multiroot_fdfsolver_set (s, &f, x);
+
+ print_state (iter, s);
+
+ do
+ {
+ iter++;
+
+ status = gsl_multiroot_fdfsolver_iterate (s);
+
+ print_state (iter, s);
+
+ if (status)
+ break;
+
+ status = gsl_multiroot_test_residual (s->f, 1e-7);
+ }
+ while (status == GSL_CONTINUE && iter < 1000);
+
+ printf ("status = %s\n", gsl_strerror (status));
+
+ gsl_multiroot_fdfsolver_free (s);
+ gsl_vector_free (x);
+ return 0;
+ }
+
+The addition of derivative information to the `hybrids' solver does not
+make any significant difference to its behavior, since it able to
+approximate the Jacobian numerically with sufficient accuracy. To
+illustrate the behavior of a different derivative solver we switch to
+`gnewton'. This is a traditional Newton solver with the constraint that
+it scales back its step if the full step would lead "uphill". Here is
+the output for the `gnewton' algorithm,
+
+ iter = 0 x = -10.000 -5.000 f(x) = 1.100e+01 -1.050e+03
+ iter = 1 x = -4.231 -65.317 f(x) = 5.231e+00 -8.321e+02
+ iter = 2 x = 1.000 -26.358 f(x) = -8.882e-16 -2.736e+02
+ iter = 3 x = 1.000 1.000 f(x) = -2.220e-16 -4.441e-15
+ status = success
+
+The convergence is much more rapid, but takes a wide excursion out to
+the point (-4.23,-65.3). This could cause the algorithm to go astray in
+a realistic application. The hybrid algorithm follows the downhill
+path to the solution more reliably.
+
+
+File: gsl-ref.info, Node: References and Further Reading for Multidimensional Root Finding, Prev: Example programs for Multidimensional Root finding, Up: Multidimensional Root-Finding
+
+34.9 References and Further Reading
+===================================
+
+The original version of the Hybrid method is described in the following
+articles by Powell,
+
+ M.J.D. Powell, "A Hybrid Method for Nonlinear Equations" (Chap 6, p
+ 87-114) and "A Fortran Subroutine for Solving systems of Nonlinear
+ Algebraic Equations" (Chap 7, p 115-161), in `Numerical Methods for
+ Nonlinear Algebraic Equations', P. Rabinowitz, editor. Gordon and
+ Breach, 1970.
+
+The following papers are also relevant to the algorithms described in
+this section,
+
+ J.J. More', M.Y. Cosnard, "Numerical Solution of Nonlinear
+ Equations", `ACM Transactions on Mathematical Software', Vol 5, No
+ 1, (1979), p 64-85
+
+ C.G. Broyden, "A Class of Methods for Solving Nonlinear
+ Simultaneous Equations", `Mathematics of Computation', Vol 19
+ (1965), p 577-593
+
+ J.J. More', B.S. Garbow, K.E. Hillstrom, "Testing Unconstrained
+ Optimization Software", ACM Transactions on Mathematical Software,
+ Vol 7, No 1 (1981), p 17-41
+
+
+File: gsl-ref.info, Node: Multidimensional Minimization, Next: Least-Squares Fitting, Prev: Multidimensional Root-Finding, Up: Top
+
+35 Multidimensional Minimization
+********************************
+
+This chapter describes routines for finding minima of arbitrary
+multidimensional functions. The library provides low level components
+for a variety of iterative minimizers and convergence tests. These can
+be combined by the user to achieve the desired solution, while providing
+full access to the intermediate steps of the algorithms. Each class of
+methods uses the same framework, so that you can switch between
+minimizers at runtime without needing to recompile your program. Each
+instance of a minimizer keeps track of its own state, allowing the
+minimizers to be used in multi-threaded programs. The minimization
+algorithms can be used to maximize a function by inverting its sign.
+
+ The header file `gsl_multimin.h' contains prototypes for the
+minimization functions and related declarations.
+
+* Menu:
+
+* Multimin Overview::
+* Multimin Caveats::
+* Initializing the Multidimensional Minimizer::
+* Providing a function to minimize::
+* Multimin Iteration::
+* Multimin Stopping Criteria::
+* Multimin Algorithms::
+* Multimin Examples::
+* Multimin References and Further Reading::
+
+
+File: gsl-ref.info, Node: Multimin Overview, Next: Multimin Caveats, Up: Multidimensional Minimization
+
+35.1 Overview
+=============
+
+The problem of multidimensional minimization requires finding a point x
+such that the scalar function,
+
+ f(x_1, ..., x_n)
+
+takes a value which is lower than at any neighboring point. For smooth
+functions the gradient g = \nabla f vanishes at the minimum. In general
+there are no bracketing methods available for the minimization of
+n-dimensional functions. The algorithms proceed from an initial guess
+using a search algorithm which attempts to move in a downhill direction.
+
+ Algorithms making use of the gradient of the function perform a
+one-dimensional line minimisation along this direction until the lowest
+point is found to a suitable tolerance. The search direction is then
+updated with local information from the function and its derivatives,
+and the whole process repeated until the true n-dimensional minimum is
+found.
+
+ The Nelder-Mead Simplex algorithm applies a different strategy. It
+maintains n+1 trial parameter vectors as the vertices of a
+n-dimensional simplex. In each iteration step it tries to improve the
+worst vertex by a simple geometrical transformation until the size of
+the simplex falls below a given tolerance.
+
+ Both types of algorithms use a standard framework. The user provides
+a high-level driver for the algorithms, and the library provides the
+individual functions necessary for each of the steps. There are three
+main phases of the iteration. The steps are,
+
+ * initialize minimizer state, S, for algorithm T
+
+ * update S using the iteration T
+
+ * test S for convergence, and repeat iteration if necessary
+
+Each iteration step consists either of an improvement to the
+line-minimisation in the current direction or an update to the search
+direction itself. The state for the minimizers is held in a
+`gsl_multimin_fdfminimizer' struct or a `gsl_multimin_fminimizer'
+struct.
+
+
+File: gsl-ref.info, Node: Multimin Caveats, Next: Initializing the Multidimensional Minimizer, Prev: Multimin Overview, Up: Multidimensional Minimization
+
+35.2 Caveats
+============
+
+Note that the minimization algorithms can only search for one local
+minimum at a time. When there are several local minima in the search
+area, the first minimum to be found will be returned; however it is
+difficult to predict which of the minima this will be. In most cases,
+no error will be reported if you try to find a local minimum in an area
+where there is more than one.
+
+ It is also important to note that the minimization algorithms find
+local minima; there is no way to determine whether a minimum is a global
+minimum of the function in question.
+
+
+File: gsl-ref.info, Node: Initializing the Multidimensional Minimizer, Next: Providing a function to minimize, Prev: Multimin Caveats, Up: Multidimensional Minimization
+
+35.3 Initializing the Multidimensional Minimizer
+================================================
+
+The following function initializes a multidimensional minimizer. The
+minimizer itself depends only on the dimension of the problem and the
+algorithm and can be reused for different problems.
+
+ -- Function: gsl_multimin_fdfminimizer *
+gsl_multimin_fdfminimizer_alloc (const gsl_multimin_fdfminimizer_type *
+ T, size_t N)
+ -- Function: gsl_multimin_fminimizer * gsl_multimin_fminimizer_alloc
+ (const gsl_multimin_fminimizer_type * T, size_t N)
+ This function returns a pointer to a newly allocated instance of a
+ minimizer of type T for an N-dimension function. If there is
+ insufficient memory to create the minimizer then the function
+ returns a null pointer and the error handler is invoked with an
+ error code of `GSL_ENOMEM'.
+
+ -- Function: int gsl_multimin_fdfminimizer_set
+ (gsl_multimin_fdfminimizer * S, gsl_multimin_function_fdf *
+ FDF, const gsl_vector * X, double STEP_SIZE, double TOL)
+ This function initializes the minimizer S to minimize the function
+ FDF starting from the initial point X. The size of the first
+ trial step is given by STEP_SIZE. The accuracy of the line
+ minimization is specified by TOL. The precise meaning of this
+ parameter depends on the method used. Typically the line
+ minimization is considered successful if the gradient of the
+ function g is orthogonal to the current search direction p to a
+ relative accuracy of TOL, where dot(p,g) < tol |p| |g|. A TOL
+ value of 0.1 is suitable for most purposes, since line
+ minimization only needs to be carried out approximately. Note
+ that setting TOL to zero will force the use of "exact"
+ line-searches, which are extremely expensive.
+
+ -- Function: int gsl_multimin_fminimizer_set (gsl_multimin_fminimizer
+ * S, gsl_multimin_function * F, const gsl_vector * X, const
+ gsl_vector * STEP_SIZE)
+ This function initializes the minimizer S to minimize the function
+ F, starting from the initial point X. The size of the initial
+ trial steps is given in vector STEP_SIZE. The precise meaning of
+ this parameter depends on the method used.
+
+ -- Function: void gsl_multimin_fdfminimizer_free
+ (gsl_multimin_fdfminimizer * S)
+ -- Function: void gsl_multimin_fminimizer_free
+ (gsl_multimin_fminimizer * S)
+ This function frees all the memory associated with the minimizer S.
+
+ -- Function: const char * gsl_multimin_fdfminimizer_name (const
+ gsl_multimin_fdfminimizer * S)
+ -- Function: const char * gsl_multimin_fminimizer_name (const
+ gsl_multimin_fminimizer * S)
+ This function returns a pointer to the name of the minimizer. For
+ example,
+
+ printf ("s is a '%s' minimizer\n",
+ gsl_multimin_fdfminimizer_name (s));
+
+ would print something like `s is a 'conjugate_pr' minimizer'.
+
+
+File: gsl-ref.info, Node: Providing a function to minimize, Next: Multimin Iteration, Prev: Initializing the Multidimensional Minimizer, Up: Multidimensional Minimization
+
+35.4 Providing a function to minimize
+=====================================
+
+You must provide a parametric function of n variables for the
+minimizers to operate on. You may also need to provide a routine which
+calculates the gradient of the function and a third routine which
+calculates both the function value and the gradient together. In order
+to allow for general parameters the functions are defined by the
+following data types:
+
+ -- Data Type: gsl_multimin_function_fdf
+ This data type defines a general function of n variables with
+ parameters and the corresponding gradient vector of derivatives,
+
+ `double (* f) (const gsl_vector * X, void * PARAMS)'
+ this function should return the result f(x,params) for
+ argument X and parameters PARAMS.
+
+ `void (* df) (const gsl_vector * X, void * PARAMS, gsl_vector * G)'
+ this function should store the N-dimensional gradient g_i = d
+ f(x,params) / d x_i in the vector G for argument X and
+ parameters PARAMS, returning an appropriate error code if the
+ function cannot be computed.
+
+ `void (* fdf) (const gsl_vector * X, void * PARAMS, double * f, gsl_vector * G)'
+ This function should set the values of the F and G as above,
+ for arguments X and parameters PARAMS. This function
+ provides an optimization of the separate functions for f(x)
+ and g(x)--it is always faster to compute the function and its
+ derivative at the same time.
+
+ `size_t n'
+ the dimension of the system, i.e. the number of components of
+ the vectors X.
+
+ `void * params'
+ a pointer to the parameters of the function.
+
+ -- Data Type: gsl_multimin_function
+ This data type defines a general function of n variables with
+ parameters,
+
+ `double (* f) (const gsl_vector * X, void * PARAMS)'
+ this function should return the result f(x,params) for
+ argument X and parameters PARAMS.
+
+ `size_t n'
+ the dimension of the system, i.e. the number of components of
+ the vectors X.
+
+ `void * params'
+ a pointer to the parameters of the function.
+
+The following example function defines a simple paraboloid with two
+parameters,
+
+ /* Paraboloid centered on (dp[0],dp[1]) */
+
+ double
+ my_f (const gsl_vector *v, void *params)
+ {
+ double x, y;
+ double *dp = (double *)params;
+
+ x = gsl_vector_get(v, 0);
+ y = gsl_vector_get(v, 1);
+
+ return 10.0 * (x - dp[0]) * (x - dp[0]) +
+ 20.0 * (y - dp[1]) * (y - dp[1]) + 30.0;
+ }
+
+ /* The gradient of f, df = (df/dx, df/dy). */
+ void
+ my_df (const gsl_vector *v, void *params,
+ gsl_vector *df)
+ {
+ double x, y;
+ double *dp = (double *)params;
+
+ x = gsl_vector_get(v, 0);
+ y = gsl_vector_get(v, 1);
+
+ gsl_vector_set(df, 0, 20.0 * (x - dp[0]));
+ gsl_vector_set(df, 1, 40.0 * (y - dp[1]));
+ }
+
+ /* Compute both f and df together. */
+ void
+ my_fdf (const gsl_vector *x, void *params,
+ double *f, gsl_vector *df)
+ {
+ *f = my_f(x, params);
+ my_df(x, params, df);
+ }
+
+The function can be initialized using the following code,
+
+ gsl_multimin_function_fdf my_func;
+
+ double p[2] = { 1.0, 2.0 }; /* center at (1,2) */
+
+ my_func.f = &my_f;
+ my_func.df = &my_df;
+ my_func.fdf = &my_fdf;
+ my_func.n = 2;
+ my_func.params = (void *)p;
+
+
+File: gsl-ref.info, Node: Multimin Iteration, Next: Multimin Stopping Criteria, Prev: Providing a function to minimize, Up: Multidimensional Minimization
+
+35.5 Iteration
+==============
+
+The following function drives the iteration of each algorithm. The
+function performs one iteration to update the state of the minimizer.
+The same function works for all minimizers so that different methods can
+be substituted at runtime without modifications to the code.
+
+ -- Function: int gsl_multimin_fdfminimizer_iterate
+ (gsl_multimin_fdfminimizer * S)
+ -- Function: int gsl_multimin_fminimizer_iterate
+ (gsl_multimin_fminimizer * S)
+ These functions perform a single iteration of the minimizer S. If
+ the iteration encounters an unexpected problem then an error code
+ will be returned.
+
+The minimizer maintains a current best estimate of the minimum at all
+times. This information can be accessed with the following auxiliary
+functions,
+
+ -- Function: gsl_vector * gsl_multimin_fdfminimizer_x (const
+ gsl_multimin_fdfminimizer * S)
+ -- Function: gsl_vector * gsl_multimin_fminimizer_x (const
+ gsl_multimin_fminimizer * S)
+ -- Function: double gsl_multimin_fdfminimizer_minimum (const
+ gsl_multimin_fdfminimizer * S)
+ -- Function: double gsl_multimin_fminimizer_minimum (const
+ gsl_multimin_fminimizer * S)
+ -- Function: gsl_vector * gsl_multimin_fdfminimizer_gradient (const
+ gsl_multimin_fdfminimizer * S)
+ -- Function: double gsl_multimin_fminimizer_size (const
+ gsl_multimin_fminimizer * S)
+ These functions return the current best estimate of the location
+ of the minimum, the value of the function at that point, its
+ gradient, and minimizer specific characteristic size for the
+ minimizer S.
+
+ -- Function: int gsl_multimin_fdfminimizer_restart
+ (gsl_multimin_fdfminimizer * S)
+ This function resets the minimizer S to use the current point as a
+ new starting point.
+
+
+File: gsl-ref.info, Node: Multimin Stopping Criteria, Next: Multimin Algorithms, Prev: Multimin Iteration, Up: Multidimensional Minimization
+
+35.6 Stopping Criteria
+======================
+
+A minimization procedure should stop when one of the following
+conditions is true:
+
+ * A minimum has been found to within the user-specified precision.
+
+ * A user-specified maximum number of iterations has been reached.
+
+ * An error has occurred.
+
+The handling of these conditions is under user control. The functions
+below allow the user to test the precision of the current result.
+
+ -- Function: int gsl_multimin_test_gradient (const gsl_vector * G,
+ double EPSABS)
+ This function tests the norm of the gradient G against the
+ absolute tolerance EPSABS. The gradient of a multidimensional
+ function goes to zero at a minimum. The test returns `GSL_SUCCESS'
+ if the following condition is achieved,
+
+ |g| < epsabs
+
+ and returns `GSL_CONTINUE' otherwise. A suitable choice of EPSABS
+ can be made from the desired accuracy in the function for small
+ variations in x. The relationship between these quantities is
+ given by \delta f = g \delta x.
+
+ -- Function: int gsl_multimin_test_size (const double SIZE, double
+ EPSABS)
+ This function tests the minimizer specific characteristic size (if
+ applicable to the used minimizer) against absolute tolerance
+ EPSABS. The test returns `GSL_SUCCESS' if the size is smaller
+ than tolerance, otherwise `GSL_CONTINUE' is returned.
+
+
+File: gsl-ref.info, Node: Multimin Algorithms, Next: Multimin Examples, Prev: Multimin Stopping Criteria, Up: Multidimensional Minimization
+
+35.7 Algorithms
+===============
+
+There are several minimization methods available. The best choice of
+algorithm depends on the problem. All of the algorithms use the value
+of the function and its gradient at each evaluation point, except for
+the Simplex algorithm which uses function values only.
+
+ -- Minimizer: gsl_multimin_fdfminimizer_conjugate_fr
+ This is the Fletcher-Reeves conjugate gradient algorithm. The
+ conjugate gradient algorithm proceeds as a succession of line
+ minimizations. The sequence of search directions is used to build
+ up an approximation to the curvature of the function in the
+ neighborhood of the minimum.
+
+ An initial search direction P is chosen using the gradient, and
+ line minimization is carried out in that direction. The accuracy
+ of the line minimization is specified by the parameter TOL. The
+ minimum along this line occurs when the function gradient G and
+ the search direction P are orthogonal. The line minimization
+ terminates when dot(p,g) < tol |p| |g|. The search direction is
+ updated using the Fletcher-Reeves formula p' = g' - \beta g where
+ \beta=-|g'|^2/|g|^2, and the line minimization is then repeated
+ for the new search direction.
+
+ -- Minimizer: gsl_multimin_fdfminimizer_conjugate_pr
+ This is the Polak-Ribiere conjugate gradient algorithm. It is
+ similar to the Fletcher-Reeves method, differing only in the
+ choice of the coefficient \beta. Both methods work well when the
+ evaluation point is close enough to the minimum of the objective
+ function that it is well approximated by a quadratic hypersurface.
+
+ -- Minimizer: gsl_multimin_fdfminimizer_vector_bfgs2
+ -- Minimizer: gsl_multimin_fdfminimizer_vector_bfgs
+ These methods use the vector Broyden-Fletcher-Goldfarb-Shanno
+ (BFGS) algorithm. This is a quasi-Newton method which builds up
+ an approximation to the second derivatives of the function f using
+ the difference between successive gradient vectors. By combining
+ the first and second derivatives the algorithm is able to take
+ Newton-type steps towards the function minimum, assuming quadratic
+ behavior in that region.
+
+ The `bfgs2' version of this minimizer is the most efficient
+ version available, and is a faithful implementation of the line
+ minimization scheme described in Fletcher's `Practical Methods of
+ Optimization', Algorithms 2.6.2 and 2.6.4. It supercedes the
+ original `bfgs' routine and requires substantially fewer function
+ and gradient evaluations. The user-supplied tolerance TOL
+ corresponds to the parameter \sigma used by Fletcher. A value of
+ 0.1 is recommended for typical use (larger values correspond to
+ less accurate line searches).
+
+
+ -- Minimizer: gsl_multimin_fdfminimizer_steepest_descent
+ The steepest descent algorithm follows the downhill gradient of the
+ function at each step. When a downhill step is successful the
+ step-size is increased by a factor of two. If the downhill step
+ leads to a higher function value then the algorithm backtracks and
+ the step size is decreased using the parameter TOL. A suitable
+ value of TOL for most applications is 0.1. The steepest descent
+ method is inefficient and is included only for demonstration
+ purposes.
+
+ -- Minimizer: gsl_multimin_fminimizer_nmsimplex
+ This is the Simplex algorithm of Nelder and Mead. It constructs n
+ vectors p_i from the starting vector X and the vector STEP_SIZE as
+ follows:
+
+ p_0 = (x_0, x_1, ... , x_n)
+ p_1 = (x_0 + step_size_0, x_1, ... , x_n)
+ p_2 = (x_0, x_1 + step_size_1, ... , x_n)
+ ... = ...
+ p_n = (x_0, x_1, ... , x_n+step_size_n)
+
+ These vectors form the n+1 vertices of a simplex in n dimensions.
+ On each iteration the algorithm tries to improve the parameter
+ vector p_i corresponding to the highest function value by simple
+ geometrical transformations. These are reflection, reflection
+ followed by expansion, contraction and multiple contraction. Using
+ these transformations the simplex moves through the parameter
+ space towards the minimum, where it contracts itself.
+
+ After each iteration, the best vertex is returned. Note, that due
+ to the nature of the algorithm not every step improves the current
+ best parameter vector. Usually several iterations are required.
+
+ The routine calculates the minimizer specific characteristic size
+ as the average distance from the geometrical center of the simplex
+ to all its vertices. This size can be used as a stopping
+ criteria, as the simplex contracts itself near the minimum. The
+ size is returned by the function `gsl_multimin_fminimizer_size'.
+
+
+File: gsl-ref.info, Node: Multimin Examples, Next: Multimin References and Further Reading, Prev: Multimin Algorithms, Up: Multidimensional Minimization
+
+35.8 Examples
+=============
+
+This example program finds the minimum of the paraboloid function
+defined earlier. The location of the minimum is offset from the origin
+in x and y, and the function value at the minimum is non-zero. The main
+program is given below, it requires the example function given earlier
+in this chapter.
+
+ int
+ main (void)
+ {
+ size_t iter = 0;
+ int status;
+
+ const gsl_multimin_fdfminimizer_type *T;
+ gsl_multimin_fdfminimizer *s;
+
+ /* Position of the minimum (1,2). */
+ double par[2] = { 1.0, 2.0 };
+
+ gsl_vector *x;
+ gsl_multimin_function_fdf my_func;
+
+ my_func.f = &my_f;
+ my_func.df = &my_df;
+ my_func.fdf = &my_fdf;
+ my_func.n = 2;
+ my_func.params = &par;
+
+ /* Starting point, x = (5,7) */
+ x = gsl_vector_alloc (2);
+ gsl_vector_set (x, 0, 5.0);
+ gsl_vector_set (x, 1, 7.0);
+
+ T = gsl_multimin_fdfminimizer_conjugate_fr;
+ s = gsl_multimin_fdfminimizer_alloc (T, 2);
+
+ gsl_multimin_fdfminimizer_set (s, &my_func, x, 0.01, 1e-4);
+
+ do
+ {
+ iter++;
+ status = gsl_multimin_fdfminimizer_iterate (s);
+
+ if (status)
+ break;
+
+ status = gsl_multimin_test_gradient (s->gradient, 1e-3);
+
+ if (status == GSL_SUCCESS)
+ printf ("Minimum found at:\n");
+
+ printf ("%5d %.5f %.5f %10.5f\n", iter,
+ gsl_vector_get (s->x, 0),
+ gsl_vector_get (s->x, 1),
+ s->f);
+
+ }
+ while (status == GSL_CONTINUE && iter < 100);
+
+ gsl_multimin_fdfminimizer_free (s);
+ gsl_vector_free (x);
+
+ return 0;
+ }
+
+The initial step-size is chosen as 0.01, a conservative estimate in this
+case, and the line minimization parameter is set at 0.0001. The program
+terminates when the norm of the gradient has been reduced below 0.001.
+The output of the program is shown below,
+
+ x y f
+ 1 4.99629 6.99072 687.84780
+ 2 4.98886 6.97215 683.55456
+ 3 4.97400 6.93501 675.01278
+ 4 4.94429 6.86073 658.10798
+ 5 4.88487 6.71217 625.01340
+ 6 4.76602 6.41506 561.68440
+ 7 4.52833 5.82083 446.46694
+ 8 4.05295 4.63238 261.79422
+ 9 3.10219 2.25548 75.49762
+ 10 2.85185 1.62963 67.03704
+ 11 2.19088 1.76182 45.31640
+ 12 0.86892 2.02622 30.18555
+ Minimum found at:
+ 13 1.00000 2.00000 30.00000
+
+Note that the algorithm gradually increases the step size as it
+successfully moves downhill, as can be seen by plotting the successive
+points.
+
+The conjugate gradient algorithm finds the minimum on its second
+direction because the function is purely quadratic. Additional
+iterations would be needed for a more complicated function.
+
+ Here is another example using the Nelder-Mead Simplex algorithm to
+minimize the same example object function, as above.
+
+ int
+ main(void)
+ {
+ size_t np = 2;
+ double par[2] = {1.0, 2.0};
+
+ const gsl_multimin_fminimizer_type *T =
+ gsl_multimin_fminimizer_nmsimplex;
+ gsl_multimin_fminimizer *s = NULL;
+ gsl_vector *ss, *x;
+ gsl_multimin_function minex_func;
+
+ size_t iter = 0, i;
+ int status;
+ double size;
+
+ /* Initial vertex size vector */
+ ss = gsl_vector_alloc (np);
+
+ /* Set all step sizes to 1 */
+ gsl_vector_set_all (ss, 1.0);
+
+ /* Starting point */
+ x = gsl_vector_alloc (np);
+
+ gsl_vector_set (x, 0, 5.0);
+ gsl_vector_set (x, 1, 7.0);
+
+ /* Initialize method and iterate */
+ minex_func.f = &my_f;
+ minex_func.n = np;
+ minex_func.params = (void *)&par;
+
+ s = gsl_multimin_fminimizer_alloc (T, np);
+ gsl_multimin_fminimizer_set (s, &minex_func, x, ss);
+
+ do
+ {
+ iter++;
+ status = gsl_multimin_fminimizer_iterate(s);
+
+ if (status)
+ break;
+
+ size = gsl_multimin_fminimizer_size (s);
+ status = gsl_multimin_test_size (size, 1e-2);
+
+ if (status == GSL_SUCCESS)
+ {
+ printf ("converged to minimum at\n");
+ }
+
+ printf ("%5d ", iter);
+ for (i = 0; i < np; i++)
+ {
+ printf ("%10.3e ", gsl_vector_get (s->x, i));
+ }
+ printf ("f() = %7.3f size = %.3f\n", s->fval, size);
+ }
+ while (status == GSL_CONTINUE && iter < 100);
+
+ gsl_vector_free(x);
+ gsl_vector_free(ss);
+ gsl_multimin_fminimizer_free (s);
+
+ return status;
+ }
+
+The minimum search stops when the Simplex size drops to 0.01. The
+output is shown below.
+
+ 1 6.500e+00 5.000e+00 f() = 512.500 size = 1.082
+ 2 5.250e+00 4.000e+00 f() = 290.625 size = 1.372
+ 3 5.250e+00 4.000e+00 f() = 290.625 size = 1.372
+ 4 5.500e+00 1.000e+00 f() = 252.500 size = 1.372
+ 5 2.625e+00 3.500e+00 f() = 101.406 size = 1.823
+ 6 3.469e+00 1.375e+00 f() = 98.760 size = 1.526
+ 7 1.820e+00 3.156e+00 f() = 63.467 size = 1.105
+ 8 1.820e+00 3.156e+00 f() = 63.467 size = 1.105
+ 9 1.016e+00 2.812e+00 f() = 43.206 size = 1.105
+ 10 2.041e+00 2.008e+00 f() = 40.838 size = 0.645
+ 11 1.236e+00 1.664e+00 f() = 32.816 size = 0.645
+ 12 1.236e+00 1.664e+00 f() = 32.816 size = 0.447
+ 13 5.225e-01 1.980e+00 f() = 32.288 size = 0.447
+ 14 1.103e+00 2.073e+00 f() = 30.214 size = 0.345
+ 15 1.103e+00 2.073e+00 f() = 30.214 size = 0.264
+ 16 1.103e+00 2.073e+00 f() = 30.214 size = 0.160
+ 17 9.864e-01 1.934e+00 f() = 30.090 size = 0.132
+ 18 9.190e-01 1.987e+00 f() = 30.069 size = 0.092
+ 19 1.028e+00 2.017e+00 f() = 30.013 size = 0.056
+ 20 1.028e+00 2.017e+00 f() = 30.013 size = 0.046
+ 21 1.028e+00 2.017e+00 f() = 30.013 size = 0.033
+ 22 9.874e-01 1.985e+00 f() = 30.006 size = 0.028
+ 23 9.846e-01 1.995e+00 f() = 30.003 size = 0.023
+ 24 1.007e+00 2.003e+00 f() = 30.001 size = 0.012
+ converged to minimum at
+ 25 1.007e+00 2.003e+00 f() = 30.001 size = 0.010
+
+The simplex size first increases, while the simplex moves towards the
+minimum. After a while the size begins to decrease as the simplex
+contracts around the minimum.
+
+
+File: gsl-ref.info, Node: Multimin References and Further Reading, Prev: Multimin Examples, Up: Multidimensional Minimization
+
+35.9 References and Further Reading
+===================================
+
+The conjugate gradient and BFGS methods are described in detail in the
+following book,
+
+ R. Fletcher, `Practical Methods of Optimization (Second Edition)'
+ Wiley (1987), ISBN 0471915475.
+
+ A brief description of multidimensional minimization algorithms and
+more recent references can be found in,
+
+ C.W. Ueberhuber, `Numerical Computation (Volume 2)', Chapter 14,
+ Section 4.4 "Minimization Methods", p. 325-335, Springer (1997),
+ ISBN 3-540-62057-5.
+
+The simplex algorithm is described in the following paper,
+
+ J.A. Nelder and R. Mead, `A simplex method for function
+ minimization', Computer Journal vol. 7 (1965), 308-315.
+
+
+
+File: gsl-ref.info, Node: Least-Squares Fitting, Next: Nonlinear Least-Squares Fitting, Prev: Multidimensional Minimization, Up: Top
+
+36 Least-Squares Fitting
+************************
+
+This chapter describes routines for performing least squares fits to
+experimental data using linear combinations of functions. The data may
+be weighted or unweighted, i.e. with known or unknown errors. For
+weighted data the functions compute the best fit parameters and their
+associated covariance matrix. For unweighted data the covariance
+matrix is estimated from the scatter of the points, giving a
+variance-covariance matrix.
+
+ The functions are divided into separate versions for simple one- or
+two-parameter regression and multiple-parameter fits. The functions
+are declared in the header file `gsl_fit.h'.
+
+* Menu:
+
+* Fitting Overview::
+* Linear regression::
+* Linear fitting without a constant term::
+* Multi-parameter fitting::
+* Fitting Examples::
+* Fitting References and Further Reading::
+
+
+File: gsl-ref.info, Node: Fitting Overview, Next: Linear regression, Up: Least-Squares Fitting
+
+36.1 Overview
+=============
+
+Least-squares fits are found by minimizing \chi^2 (chi-squared), the
+weighted sum of squared residuals over n experimental datapoints (x_i,
+y_i) for the model Y(c,x),
+
+ \chi^2 = \sum_i w_i (y_i - Y(c, x_i))^2
+
+The p parameters of the model are c = {c_0, c_1, ...}. The weight
+factors w_i are given by w_i = 1/\sigma_i^2, where \sigma_i is the
+experimental error on the data-point y_i. The errors are assumed to be
+gaussian and uncorrelated. For unweighted data the chi-squared sum is
+computed without any weight factors.
+
+ The fitting routines return the best-fit parameters c and their p
+\times p covariance matrix. The covariance matrix measures the
+statistical errors on the best-fit parameters resulting from the errors
+on the data, \sigma_i, and is defined as C_{ab} = <\delta c_a \delta
+c_b> where < > denotes an average over the gaussian error distributions
+of the underlying datapoints.
+
+ The covariance matrix is calculated by error propagation from the
+data errors \sigma_i. The change in a fitted parameter \delta c_a
+caused by a small change in the data \delta y_i is given by
+
+ \delta c_a = \sum_i (dc_a/dy_i) \delta y_i
+
+allowing the covariance matrix to be written in terms of the errors on
+the data,
+
+ C_{ab} = \sum_{i,j} (dc_a/dy_i) (dc_b/dy_j) <\delta y_i \delta y_j>
+
+For uncorrelated data the fluctuations of the underlying datapoints
+satisfy <\delta y_i \delta y_j> = \sigma_i^2 \delta_{ij}, giving a
+corresponding parameter covariance matrix of
+
+ C_{ab} = \sum_i (1/w_i) (dc_a/dy_i) (dc_b/dy_i)
+
+When computing the covariance matrix for unweighted data, i.e. data
+with unknown errors, the weight factors w_i in this sum are replaced by
+the single estimate w = 1/\sigma^2, where \sigma^2 is the computed
+variance of the residuals about the best-fit model, \sigma^2 = \sum
+(y_i - Y(c,x_i))^2 / (n-p). This is referred to as the
+"variance-covariance matrix".
+
+ The standard deviations of the best-fit parameters are given by the
+square root of the corresponding diagonal elements of the covariance
+matrix, \sigma_{c_a} = \sqrt{C_{aa}}.
+
+
+File: gsl-ref.info, Node: Linear regression, Next: Linear fitting without a constant term, Prev: Fitting Overview, Up: Least-Squares Fitting
+
+36.2 Linear regression
+======================
+
+The functions described in this section can be used to perform
+least-squares fits to a straight line model, Y(c,x) = c_0 + c_1 x.
+
+ -- Function: int gsl_fit_linear (const double * X, const size_t
+ XSTRIDE, const double * Y, const size_t YSTRIDE, size_t N,
+ double * C0, double * C1, double * COV00, double * COV01,
+ double * COV11, double * SUMSQ)
+ This function computes the best-fit linear regression coefficients
+ (C0,C1) of the model Y = c_0 + c_1 X for the dataset (X, Y), two
+ vectors of length N with strides XSTRIDE and YSTRIDE. The errors
+ on Y are assumed unknown so the variance-covariance matrix for the
+ parameters (C0, C1) is estimated from the scatter of the points
+ around the best-fit line and returned via the parameters (COV00,
+ COV01, COV11). The sum of squares of the residuals from the
+ best-fit line is returned in SUMSQ.
+
+ -- Function: int gsl_fit_wlinear (const double * X, const size_t
+ XSTRIDE, const double * W, const size_t WSTRIDE, const double
+ * Y, const size_t YSTRIDE, size_t N, double * C0, double *
+ C1, double * COV00, double * COV01, double * COV11, double *
+ CHISQ)
+ This function computes the best-fit linear regression coefficients
+ (C0,C1) of the model Y = c_0 + c_1 X for the weighted dataset (X,
+ Y), two vectors of length N with strides XSTRIDE and YSTRIDE. The
+ vector W, of length N and stride WSTRIDE, specifies the weight of
+ each datapoint. The weight is the reciprocal of the variance for
+ each datapoint in Y.
+
+ The covariance matrix for the parameters (C0, C1) is computed
+ using the weights and returned via the parameters (COV00, COV01,
+ COV11). The weighted sum of squares of the residuals from the
+ best-fit line, \chi^2, is returned in CHISQ.
+
+ -- Function: int gsl_fit_linear_est (double X, double C0, double C1,
+ double C00, double C01, double C11, double * Y, double *
+ Y_ERR)
+ This function uses the best-fit linear regression coefficients
+ C0,C1 and their covariance COV00,COV01,COV11 to compute the fitted
+ function Y and its standard deviation Y_ERR for the model Y = c_0
+ + c_1 X at the point X.
+
diff --git a/gsl-1.9/doc/gsl-ref.info-4 b/gsl-1.9/doc/gsl-ref.info-4
new file mode 100644
index 0000000..cedfd25
--- /dev/null
+++ b/gsl-1.9/doc/gsl-ref.info-4
@@ -0,0 +1,4426 @@
+This is gsl-ref.info, produced by makeinfo version 4.8 from
+gsl-ref.texi.
+
+INFO-DIR-SECTION Scientific software
+START-INFO-DIR-ENTRY
+* gsl-ref: (gsl-ref). GNU Scientific Library - Reference
+END-INFO-DIR-ENTRY
+
+ Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+2005, 2006, 2007 The GSL Team.
+
+ Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2 or
+any later version published by the Free Software Foundation; with the
+Invariant Sections being "GNU General Public License" and "Free Software
+Needs Free Documentation", the Front-Cover text being "A GNU Manual",
+and with the Back-Cover Text being (a) (see below). A copy of the
+license is included in the section entitled "GNU Free Documentation
+License".
+
+ (a) The Back-Cover Text is: "You have freedom to copy and modify this
+GNU Manual, like GNU software."
+
+
+File: gsl-ref.info, Node: Linear fitting without a constant term, Next: Multi-parameter fitting, Prev: Linear regression, Up: Least-Squares Fitting
+
+36.3 Linear fitting without a constant term
+===========================================
+
+The functions described in this section can be used to perform
+least-squares fits to a straight line model without a constant term, Y
+= c_1 X.
+
+ -- Function: int gsl_fit_mul (const double * X, const size_t XSTRIDE,
+ const double * Y, const size_t YSTRIDE, size_t N, double *
+ C1, double * COV11, double * SUMSQ)
+ This function computes the best-fit linear regression coefficient
+ C1 of the model Y = c_1 X for the datasets (X, Y), two vectors of
+ length N with strides XSTRIDE and YSTRIDE. The errors on Y are
+ assumed unknown so the variance of the parameter C1 is estimated
+ from the scatter of the points around the best-fit line and
+ returned via the parameter COV11. The sum of squares of the
+ residuals from the best-fit line is returned in SUMSQ.
+
+ -- Function: int gsl_fit_wmul (const double * X, const size_t XSTRIDE,
+ const double * W, const size_t WSTRIDE, const double * Y,
+ const size_t YSTRIDE, size_t N, double * C1, double * COV11,
+ double * SUMSQ)
+ This function computes the best-fit linear regression coefficient
+ C1 of the model Y = c_1 X for the weighted datasets (X, Y), two
+ vectors of length N with strides XSTRIDE and YSTRIDE. The vector
+ W, of length N and stride WSTRIDE, specifies the weight of each
+ datapoint. The weight is the reciprocal of the variance for each
+ datapoint in Y.
+
+ The variance of the parameter C1 is computed using the weights and
+ returned via the parameter COV11. The weighted sum of squares of
+ the residuals from the best-fit line, \chi^2, is returned in CHISQ.
+
+ -- Function: int gsl_fit_mul_est (double X, double C1, double C11,
+ double * Y, double * Y_ERR)
+ This function uses the best-fit linear regression coefficient C1
+ and its covariance COV11 to compute the fitted function Y and its
+ standard deviation Y_ERR for the model Y = c_1 X at the point X.
+
+
+File: gsl-ref.info, Node: Multi-parameter fitting, Next: Fitting Examples, Prev: Linear fitting without a constant term, Up: Least-Squares Fitting
+
+36.4 Multi-parameter fitting
+============================
+
+The functions described in this section perform least-squares fits to a
+general linear model, y = X c where y is a vector of n observations, X
+is an n by p matrix of predictor variables, and the elements of the
+vector c are the p unknown best-fit parameters which are to be
+estimated. The chi-squared value is given by \chi^2 = \sum_i w_i (y_i
+- \sum_j X_{ij} c_j)^2.
+
+ This formulation can be used for fits to any number of functions
+and/or variables by preparing the n-by-p matrix X appropriately. For
+example, to fit to a p-th order polynomial in X, use the following
+matrix,
+
+ X_{ij} = x_i^j
+
+where the index i runs over the observations and the index j runs from
+0 to p-1.
+
+ To fit to a set of p sinusoidal functions with fixed frequencies
+\omega_1, \omega_2, ..., \omega_p, use,
+
+ X_{ij} = sin(\omega_j x_i)
+
+To fit to p independent variables x_1, x_2, ..., x_p, use,
+
+ X_{ij} = x_j(i)
+
+where x_j(i) is the i-th value of the predictor variable x_j.
+
+ The functions described in this section are declared in the header
+file `gsl_multifit.h'.
+
+ The solution of the general linear least-squares system requires an
+additional working space for intermediate results, such as the singular
+value decomposition of the matrix X.
+
+ -- Function: gsl_multifit_linear_workspace * gsl_multifit_linear_alloc
+ (size_t N, size_t P)
+ This function allocates a workspace for fitting a model to N
+ observations using P parameters.
+
+ -- Function: void gsl_multifit_linear_free
+ (gsl_multifit_linear_workspace * WORK)
+ This function frees the memory associated with the workspace W.
+
+ -- Function: int gsl_multifit_linear (const gsl_matrix * X, const
+ gsl_vector * Y, gsl_vector * C, gsl_matrix * COV, double *
+ CHISQ, gsl_multifit_linear_workspace * WORK)
+ -- Function: int gsl_multifit_linear_svd (const gsl_matrix * X, const
+ gsl_vector * Y, double TOL, size_t * RANK, gsl_vector * C,
+ gsl_matrix * COV, double * CHISQ,
+ gsl_multifit_linear_workspace * WORK)
+ These functions compute the best-fit parameters C of the model y =
+ X c for the observations Y and the matrix of predictor variables
+ X. The variance-covariance matrix of the model parameters COV is
+ estimated from the scatter of the observations about the best-fit.
+ The sum of squares of the residuals from the best-fit, \chi^2, is
+ returned in CHISQ.
+
+ The best-fit is found by singular value decomposition of the matrix
+ X using the preallocated workspace provided in WORK. The modified
+ Golub-Reinsch SVD algorithm is used, with column scaling to
+ improve the accuracy of the singular values. Any components which
+ have zero singular value (to machine precision) are discarded from
+ the fit. In the second form of the function the components are
+ discarded if the ratio of singular values s_i/s_0 falls below the
+ user-specified tolerance TOL, and the effective rank is returned
+ in RANK.
+
+ -- Function: int gsl_multifit_wlinear (const gsl_matrix * X, const
+ gsl_vector * W, const gsl_vector * Y, gsl_vector * C,
+ gsl_matrix * COV, double * CHISQ,
+ gsl_multifit_linear_workspace * WORK)
+ -- Function: int gsl_multifit_wlinear_svd (const gsl_matrix * X, const
+ gsl_vector * W, const gsl_vector * Y, double TOL, size_t *
+ RANK, gsl_vector * C, gsl_matrix * COV, double * CHISQ,
+ gsl_multifit_linear_workspace * WORK)
+ This function computes the best-fit parameters C of the weighted
+ model y = X c for the observations Y with weights W and the matrix
+ of predictor variables X. The covariance matrix of the model
+ parameters COV is computed with the given weights. The weighted
+ sum of squares of the residuals from the best-fit, \chi^2, is
+ returned in CHISQ.
+
+ The best-fit is found by singular value decomposition of the matrix
+ X using the preallocated workspace provided in WORK. Any
+ components which have zero singular value (to machine precision)
+ are discarded from the fit. In the second form of the function the
+ components are discarded if the ratio of singular values s_i/s_0
+ falls below the user-specified tolerance TOL, and the effective
+ rank is returned in RANK.
+
+ -- Function: int gsl_multifit_linear_est (const gsl_vector * X, const
+ gsl_vector * C, const gsl_matrix * COV, double * Y, double *
+ Y_ERR)
+ This function uses the best-fit multilinear regression coefficients
+ C and their covariance matrix COV to compute the fitted function
+ value Y and its standard deviation Y_ERR for the model y = x.c at
+ the point X.
+
+
+File: gsl-ref.info, Node: Fitting Examples, Next: Fitting References and Further Reading, Prev: Multi-parameter fitting, Up: Least-Squares Fitting
+
+36.5 Examples
+=============
+
+The following program computes a least squares straight-line fit to a
+simple dataset, and outputs the best-fit line and its associated one
+standard-deviation error bars.
+
+ #include <stdio.h>
+ #include <gsl/gsl_fit.h>
+
+ int
+ main (void)
+ {
+ int i, n = 4;
+ double x[4] = { 1970, 1980, 1990, 2000 };
+ double y[4] = { 12, 11, 14, 13 };
+ double w[4] = { 0.1, 0.2, 0.3, 0.4 };
+
+ double c0, c1, cov00, cov01, cov11, chisq;
+
+ gsl_fit_wlinear (x, 1, w, 1, y, 1, n,
+ &c0, &c1, &cov00, &cov01, &cov11,
+ &chisq);
+
+ printf ("# best fit: Y = %g + %g X\n", c0, c1);
+ printf ("# covariance matrix:\n");
+ printf ("# [ %g, %g\n# %g, %g]\n",
+ cov00, cov01, cov01, cov11);
+ printf ("# chisq = %g\n", chisq);
+
+ for (i = 0; i < n; i++)
+ printf ("data: %g %g %g\n",
+ x[i], y[i], 1/sqrt(w[i]));
+
+ printf ("\n");
+
+ for (i = -30; i < 130; i++)
+ {
+ double xf = x[0] + (i/100.0) * (x[n-1] - x[0]);
+ double yf, yf_err;
+
+ gsl_fit_linear_est (xf,
+ c0, c1,
+ cov00, cov01, cov11,
+ &yf, &yf_err);
+
+ printf ("fit: %g %g\n", xf, yf);
+ printf ("hi : %g %g\n", xf, yf + yf_err);
+ printf ("lo : %g %g\n", xf, yf - yf_err);
+ }
+ return 0;
+ }
+
+The following commands extract the data from the output of the program
+and display it using the GNU plotutils `graph' utility,
+
+ $ ./demo > tmp
+ $ more tmp
+ # best fit: Y = -106.6 + 0.06 X
+ # covariance matrix:
+ # [ 39602, -19.9
+ # -19.9, 0.01]
+ # chisq = 0.8
+
+ $ for n in data fit hi lo ;
+ do
+ grep "^$n" tmp | cut -d: -f2 > $n ;
+ done
+ $ graph -T X -X x -Y y -y 0 20 -m 0 -S 2 -Ie data
+ -S 0 -I a -m 1 fit -m 2 hi -m 2 lo
+
+ The next program performs a quadratic fit y = c_0 + c_1 x + c_2 x^2
+to a weighted dataset using the generalised linear fitting function
+`gsl_multifit_wlinear'. The model matrix X for a quadratic fit is
+given by,
+
+ X = [ 1 , x_0 , x_0^2 ;
+ 1 , x_1 , x_1^2 ;
+ 1 , x_2 , x_2^2 ;
+ ... , ... , ... ]
+
+where the column of ones corresponds to the constant term c_0. The two
+remaining columns corresponds to the terms c_1 x and c_2 x^2.
+
+ The program reads N lines of data in the format (X, Y, ERR) where
+ERR is the error (standard deviation) in the value Y.
+
+ #include <stdio.h>
+ #include <gsl/gsl_multifit.h>
+
+ int
+ main (int argc, char **argv)
+ {
+ int i, n;
+ double xi, yi, ei, chisq;
+ gsl_matrix *X, *cov;
+ gsl_vector *y, *w, *c;
+
+ if (argc != 2)
+ {
+ fprintf (stderr,"usage: fit n < data\n");
+ exit (-1);
+ }
+
+ n = atoi (argv[1]);
+
+ X = gsl_matrix_alloc (n, 3);
+ y = gsl_vector_alloc (n);
+ w = gsl_vector_alloc (n);
+
+ c = gsl_vector_alloc (3);
+ cov = gsl_matrix_alloc (3, 3);
+
+ for (i = 0; i < n; i++)
+ {
+ int count = fscanf (stdin, "%lg %lg %lg",
+ &xi, &yi, &ei);
+
+ if (count != 3)
+ {
+ fprintf (stderr, "error reading file\n");
+ exit (-1);
+ }
+
+ printf ("%g %g +/- %g\n", xi, yi, ei);
+
+ gsl_matrix_set (X, i, 0, 1.0);
+ gsl_matrix_set (X, i, 1, xi);
+ gsl_matrix_set (X, i, 2, xi*xi);
+
+ gsl_vector_set (y, i, yi);
+ gsl_vector_set (w, i, 1.0/(ei*ei));
+ }
+
+ {
+ gsl_multifit_linear_workspace * work
+ = gsl_multifit_linear_alloc (n, 3);
+ gsl_multifit_wlinear (X, w, y, c, cov,
+ &chisq, work);
+ gsl_multifit_linear_free (work);
+ }
+
+ #define C(i) (gsl_vector_get(c,(i)))
+ #define COV(i,j) (gsl_matrix_get(cov,(i),(j)))
+
+ {
+ printf ("# best fit: Y = %g + %g X + %g X^2\n",
+ C(0), C(1), C(2));
+
+ printf ("# covariance matrix:\n");
+ printf ("[ %+.5e, %+.5e, %+.5e \n",
+ COV(0,0), COV(0,1), COV(0,2));
+ printf (" %+.5e, %+.5e, %+.5e \n",
+ COV(1,0), COV(1,1), COV(1,2));
+ printf (" %+.5e, %+.5e, %+.5e ]\n",
+ COV(2,0), COV(2,1), COV(2,2));
+ printf ("# chisq = %g\n", chisq);
+ }
+
+ gsl_matrix_free (X);
+ gsl_vector_free (y);
+ gsl_vector_free (w);
+ gsl_vector_free (c);
+ gsl_matrix_free (cov);
+
+ return 0;
+ }
+
+A suitable set of data for fitting can be generated using the following
+program. It outputs a set of points with gaussian errors from the curve
+y = e^x in the region 0 < x < 2.
+
+ #include <stdio.h>
+ #include <math.h>
+ #include <gsl/gsl_randist.h>
+
+ int
+ main (void)
+ {
+ double x;
+ const gsl_rng_type * T;
+ gsl_rng * r;
+
+ gsl_rng_env_setup ();
+
+ T = gsl_rng_default;
+ r = gsl_rng_alloc (T);
+
+ for (x = 0.1; x < 2; x+= 0.1)
+ {
+ double y0 = exp (x);
+ double sigma = 0.1 * y0;
+ double dy = gsl_ran_gaussian (r, sigma);
+
+ printf ("%g %g %g\n", x, y0 + dy, sigma);
+ }
+
+ gsl_rng_free(r);
+
+ return 0;
+ }
+
+The data can be prepared by running the resulting executable program,
+
+ $ ./generate > exp.dat
+ $ more exp.dat
+ 0.1 0.97935 0.110517
+ 0.2 1.3359 0.12214
+ 0.3 1.52573 0.134986
+ 0.4 1.60318 0.149182
+ 0.5 1.81731 0.164872
+ 0.6 1.92475 0.182212
+ ....
+
+To fit the data use the previous program, with the number of data points
+given as the first argument. In this case there are 19 data points.
+
+ $ ./fit 19 < exp.dat
+ 0.1 0.97935 +/- 0.110517
+ 0.2 1.3359 +/- 0.12214
+ ...
+ # best fit: Y = 1.02318 + 0.956201 X + 0.876796 X^2
+ # covariance matrix:
+ [ +1.25612e-02, -3.64387e-02, +1.94389e-02
+ -3.64387e-02, +1.42339e-01, -8.48761e-02
+ +1.94389e-02, -8.48761e-02, +5.60243e-02 ]
+ # chisq = 23.0987
+
+The parameters of the quadratic fit match the coefficients of the
+expansion of e^x, taking into account the errors on the parameters and
+the O(x^3) difference between the exponential and quadratic functions
+for the larger values of x. The errors on the parameters are given by
+the square-root of the corresponding diagonal elements of the
+covariance matrix. The chi-squared per degree of freedom is 1.4,
+indicating a reasonable fit to the data.
+
+
+File: gsl-ref.info, Node: Fitting References and Further Reading, Prev: Fitting Examples, Up: Least-Squares Fitting
+
+36.6 References and Further Reading
+===================================
+
+A summary of formulas and techniques for least squares fitting can be
+found in the "Statistics" chapter of the Annual Review of Particle
+Physics prepared by the Particle Data Group,
+
+ `Review of Particle Properties', R.M. Barnett et al., Physical
+ Review D54, 1 (1996) `http://pdg.lbl.gov/'
+
+The Review of Particle Physics is available online at the website given
+above.
+
+ The tests used to prepare these routines are based on the NIST
+Statistical Reference Datasets. The datasets and their documentation are
+available from NIST at the following website,
+
+ `http://www.nist.gov/itl/div898/strd/index.html'.
+
+
+File: gsl-ref.info, Node: Nonlinear Least-Squares Fitting, Next: Basis Splines, Prev: Least-Squares Fitting, Up: Top
+
+37 Nonlinear Least-Squares Fitting
+**********************************
+
+This chapter describes functions for multidimensional nonlinear
+least-squares fitting. The library provides low level components for a
+variety of iterative solvers and convergence tests. These can be
+combined by the user to achieve the desired solution, with full access
+to the intermediate steps of the iteration. Each class of methods uses
+the same framework, so that you can switch between solvers at runtime
+without needing to recompile your program. Each instance of a solver
+keeps track of its own state, allowing the solvers to be used in
+multi-threaded programs.
+
+ The header file `gsl_multifit_nlin.h' contains prototypes for the
+multidimensional nonlinear fitting functions and related declarations.
+
+* Menu:
+
+* Overview of Nonlinear Least-Squares Fitting::
+* Initializing the Nonlinear Least-Squares Solver::
+* Providing the Function to be Minimized::
+* Iteration of the Minimization Algorithm::
+* Search Stopping Parameters for Minimization Algorithms::
+* Minimization Algorithms using Derivatives::
+* Minimization Algorithms without Derivatives::
+* Computing the covariance matrix of best fit parameters::
+* Example programs for Nonlinear Least-Squares Fitting::
+* References and Further Reading for Nonlinear Least-Squares Fitting::
+
+
+File: gsl-ref.info, Node: Overview of Nonlinear Least-Squares Fitting, Next: Initializing the Nonlinear Least-Squares Solver, Up: Nonlinear Least-Squares Fitting
+
+37.1 Overview
+=============
+
+The problem of multidimensional nonlinear least-squares fitting requires
+the minimization of the squared residuals of n functions, f_i, in p
+parameters, x_i,
+
+ \Phi(x) = (1/2) || F(x) ||^2
+ = (1/2) \sum_{i=1}^{n} f_i(x_1, ..., x_p)^2
+
+All algorithms proceed from an initial guess using the linearization,
+
+ \psi(p) = || F(x+p) || ~=~ || F(x) + J p ||
+
+where x is the initial point, p is the proposed step and J is the
+Jacobian matrix J_{ij} = d f_i / d x_j. Additional strategies are used
+to enlarge the region of convergence. These include requiring a
+decrease in the norm ||F|| on each step or using a trust region to
+avoid steps which fall outside the linear regime.
+
+ To perform a weighted least-squares fit of a nonlinear model Y(x,t)
+to data (t_i, y_i) with independent gaussian errors \sigma_i, use
+function components of the following form,
+
+ f_i = (Y(x, t_i) - y_i) / \sigma_i
+
+Note that the model parameters are denoted by x in this chapter since
+the non-linear least-squares algorithms are described geometrically
+(i.e. finding the minimum of a surface). The independent variable of
+any data to be fitted is denoted by t.
+
+ With the definition above the Jacobian is J_{ij} =(1 / \sigma_i) d
+Y_i / d x_j, where Y_i = Y(x,t_i).
+
+
+File: gsl-ref.info, Node: Initializing the Nonlinear Least-Squares Solver, Next: Providing the Function to be Minimized, Prev: Overview of Nonlinear Least-Squares Fitting, Up: Nonlinear Least-Squares Fitting
+
+37.2 Initializing the Solver
+============================
+
+ -- Function: gsl_multifit_fsolver * gsl_multifit_fsolver_alloc (const
+ gsl_multifit_fsolver_type * T, size_t N, size_t P)
+ This function returns a pointer to a newly allocated instance of a
+ solver of type T for N observations and P parameters. The number
+ of observations N must be greater than or equal to parameters P.
+
+ If there is insufficient memory to create the solver then the
+ function returns a null pointer and the error handler is invoked
+ with an error code of `GSL_ENOMEM'.
+
+ -- Function: gsl_multifit_fdfsolver * gsl_multifit_fdfsolver_alloc
+ (const gsl_multifit_fdfsolver_type * T, size_t N, size_t P)
+ This function returns a pointer to a newly allocated instance of a
+ derivative solver of type T for N observations and P parameters.
+ For example, the following code creates an instance of a
+ Levenberg-Marquardt solver for 100 data points and 3 parameters,
+
+ const gsl_multifit_fdfsolver_type * T
+ = gsl_multifit_fdfsolver_lmder;
+ gsl_multifit_fdfsolver * s
+ = gsl_multifit_fdfsolver_alloc (T, 100, 3);
+
+ The number of observations N must be greater than or equal to
+ parameters P.
+
+ If there is insufficient memory to create the solver then the
+ function returns a null pointer and the error handler is invoked
+ with an error code of `GSL_ENOMEM'.
+
+ -- Function: int gsl_multifit_fsolver_set (gsl_multifit_fsolver * S,
+ gsl_multifit_function * F, gsl_vector * X)
+ This function initializes, or reinitializes, an existing solver S
+ to use the function F and the initial guess X.
+
+ -- Function: int gsl_multifit_fdfsolver_set (gsl_multifit_fdfsolver *
+ S, gsl_multifit_function_fdf * FDF, gsl_vector * X)
+ This function initializes, or reinitializes, an existing solver S
+ to use the function and derivative FDF and the initial guess X.
+
+ -- Function: void gsl_multifit_fsolver_free (gsl_multifit_fsolver * S)
+ -- Function: void gsl_multifit_fdfsolver_free (gsl_multifit_fdfsolver
+ * S)
+ These functions free all the memory associated with the solver S.
+
+ -- Function: const char * gsl_multifit_fsolver_name (const
+ gsl_multifit_fsolver * S)
+ -- Function: const char * gsl_multifit_fdfsolver_name (const
+ gsl_multifit_fdfsolver * S)
+ These functions return a pointer to the name of the solver. For
+ example,
+
+ printf ("s is a '%s' solver\n",
+ gsl_multifit_fdfsolver_name (s));
+
+ would print something like `s is a 'lmder' solver'.
+
+
+File: gsl-ref.info, Node: Providing the Function to be Minimized, Next: Iteration of the Minimization Algorithm, Prev: Initializing the Nonlinear Least-Squares Solver, Up: Nonlinear Least-Squares Fitting
+
+37.3 Providing the Function to be Minimized
+===========================================
+
+You must provide n functions of p variables for the minimization
+algorithms to operate on. In order to allow for arbitrary parameters
+the functions are defined by the following data types:
+
+ -- Data Type: gsl_multifit_function
+ This data type defines a general system of functions with
+ arbitrary parameters.
+
+ `int (* f) (const gsl_vector * X, void * PARAMS, gsl_vector * F)'
+ this function should store the vector result f(x,params) in F
+ for argument X and arbitrary parameters PARAMS, returning an
+ appropriate error code if the function cannot be computed.
+
+ `size_t n'
+ the number of functions, i.e. the number of components of the
+ vector F.
+
+ `size_t p'
+ the number of independent variables, i.e. the number of
+ components of the vector X.
+
+ `void * params'
+ a pointer to the arbitrary parameters of the function.
+
+ -- Data Type: gsl_multifit_function_fdf
+ This data type defines a general system of functions with
+ arbitrary parameters and the corresponding Jacobian matrix of
+ derivatives,
+
+ `int (* f) (const gsl_vector * X, void * PARAMS, gsl_vector * F)'
+ this function should store the vector result f(x,params) in F
+ for argument X and arbitrary parameters PARAMS, returning an
+ appropriate error code if the function cannot be computed.
+
+ `int (* df) (const gsl_vector * X, void * PARAMS, gsl_matrix * J)'
+ this function should store the N-by-P matrix result J_ij = d
+ f_i(x,params) / d x_j in J for argument X and arbitrary
+ parameters PARAMS, returning an appropriate error code if the
+ function cannot be computed.
+
+ `int (* fdf) (const gsl_vector * X, void * PARAMS, gsl_vector * F, gsl_matrix * J)'
+ This function should set the values of the F and J as above,
+ for arguments X and arbitrary parameters PARAMS. This
+ function provides an optimization of the separate functions
+ for f(x) and J(x)--it is always faster to compute the
+ function and its derivative at the same time.
+
+ `size_t n'
+ the number of functions, i.e. the number of components of the
+ vector F.
+
+ `size_t p'
+ the number of independent variables, i.e. the number of
+ components of the vector X.
+
+ `void * params'
+ a pointer to the arbitrary parameters of the function.
+
+ Note that when fitting a non-linear model against experimental data,
+the data is passed to the functions above using the PARAMS argument and
+the trial best-fit parameters through the X argument.
+
+
+File: gsl-ref.info, Node: Iteration of the Minimization Algorithm, Next: Search Stopping Parameters for Minimization Algorithms, Prev: Providing the Function to be Minimized, Up: Nonlinear Least-Squares Fitting
+
+37.4 Iteration
+==============
+
+The following functions drive the iteration of each algorithm. Each
+function performs one iteration to update the state of any solver of the
+corresponding type. The same functions work for all solvers so that
+different methods can be substituted at runtime without modifications to
+the code.
+
+ -- Function: int gsl_multifit_fsolver_iterate (gsl_multifit_fsolver *
+ S)
+ -- Function: int gsl_multifit_fdfsolver_iterate
+ (gsl_multifit_fdfsolver * S)
+ These functions perform a single iteration of the solver S. If
+ the iteration encounters an unexpected problem then an error code
+ will be returned. The solver maintains a current estimate of the
+ best-fit parameters at all times.
+
+ The solver struct S contains the following entries, which can be
+used to track the progress of the solution:
+
+`gsl_vector * x'
+ The current position.
+
+`gsl_vector * f'
+ The function value at the current position.
+
+`gsl_vector * dx'
+ The difference between the current position and the previous
+ position, i.e. the last step, taken as a vector.
+
+`gsl_matrix * J'
+ The Jacobian matrix at the current position (for the
+ `gsl_multifit_fdfsolver' struct only)
+
+ The best-fit information also can be accessed with the following
+auxiliary functions,
+
+ -- Function: gsl_vector * gsl_multifit_fsolver_position (const
+ gsl_multifit_fsolver * S)
+ -- Function: gsl_vector * gsl_multifit_fdfsolver_position (const
+ gsl_multifit_fdfsolver * S)
+ These functions return the current position (i.e. best-fit
+ parameters) `s->x' of the solver S.
+
+
+File: gsl-ref.info, Node: Search Stopping Parameters for Minimization Algorithms, Next: Minimization Algorithms using Derivatives, Prev: Iteration of the Minimization Algorithm, Up: Nonlinear Least-Squares Fitting
+
+37.5 Search Stopping Parameters
+===============================
+
+A minimization procedure should stop when one of the following
+conditions is true:
+
+ * A minimum has been found to within the user-specified precision.
+
+ * A user-specified maximum number of iterations has been reached.
+
+ * An error has occurred.
+
+The handling of these conditions is under user control. The functions
+below allow the user to test the current estimate of the best-fit
+parameters in several standard ways.
+
+ -- Function: int gsl_multifit_test_delta (const gsl_vector * DX, const
+ gsl_vector * X, double EPSABS, double EPSREL)
+ This function tests for the convergence of the sequence by
+ comparing the last step DX with the absolute error EPSABS and
+ relative error EPSREL to the current position X. The test returns
+ `GSL_SUCCESS' if the following condition is achieved,
+
+ |dx_i| < epsabs + epsrel |x_i|
+
+ for each component of X and returns `GSL_CONTINUE' otherwise.
+
+ -- Function: int gsl_multifit_test_gradient (const gsl_vector * G,
+ double EPSABS)
+ This function tests the residual gradient G against the absolute
+ error bound EPSABS. Mathematically, the gradient should be
+ exactly zero at the minimum. The test returns `GSL_SUCCESS' if the
+ following condition is achieved,
+
+ \sum_i |g_i| < epsabs
+
+ and returns `GSL_CONTINUE' otherwise. This criterion is suitable
+ for situations where the precise location of the minimum, x, is
+ unimportant provided a value can be found where the gradient is
+ small enough.
+
+ -- Function: int gsl_multifit_gradient (const gsl_matrix * J, const
+ gsl_vector * F, gsl_vector * G)
+ This function computes the gradient G of \Phi(x) = (1/2)
+ ||F(x)||^2 from the Jacobian matrix J and the function values F,
+ using the formula g = J^T f.
+
+
+File: gsl-ref.info, Node: Minimization Algorithms using Derivatives, Next: Minimization Algorithms without Derivatives, Prev: Search Stopping Parameters for Minimization Algorithms, Up: Nonlinear Least-Squares Fitting
+
+37.6 Minimization Algorithms using Derivatives
+==============================================
+
+The minimization algorithms described in this section make use of both
+the function and its derivative. They require an initial guess for the
+location of the minimum. There is no absolute guarantee of
+convergence--the function must be suitable for this technique and the
+initial guess must be sufficiently close to the minimum for it to work.
+
+ -- Derivative Solver: gsl_multifit_fdfsolver_lmsder
+ This is a robust and efficient version of the Levenberg-Marquardt
+ algorithm as implemented in the scaled LMDER routine in MINPACK.
+ Minpack was written by Jorge J. More', Burton S. Garbow and
+ Kenneth E. Hillstrom.
+
+ The algorithm uses a generalized trust region to keep each step
+ under control. In order to be accepted a proposed new position x'
+ must satisfy the condition |D (x' - x)| < \delta, where D is a
+ diagonal scaling matrix and \delta is the size of the trust
+ region. The components of D are computed internally, using the
+ column norms of the Jacobian to estimate the sensitivity of the
+ residual to each component of x. This improves the behavior of the
+ algorithm for badly scaled functions.
+
+ On each iteration the algorithm attempts to minimize the linear
+ system |F + J p| subject to the constraint |D p| < \Delta. The
+ solution to this constrained linear system is found using the
+ Levenberg-Marquardt method.
+
+ The proposed step is now tested by evaluating the function at the
+ resulting point, x'. If the step reduces the norm of the function
+ sufficiently, and follows the predicted behavior of the function
+ within the trust region, then it is accepted and the size of the
+ trust region is increased. If the proposed step fails to improve
+ the solution, or differs significantly from the expected behavior
+ within the trust region, then the size of the trust region is
+ decreased and another trial step is computed.
+
+ The algorithm also monitors the progress of the solution and
+ returns an error if the changes in the solution are smaller than
+ the machine precision. The possible error codes are,
+
+ `GSL_ETOLF'
+ the decrease in the function falls below machine precision
+
+ `GSL_ETOLX'
+ the change in the position vector falls below machine
+ precision
+
+ `GSL_ETOLG'
+ the norm of the gradient, relative to the norm of the
+ function, falls below machine precision
+
+ These error codes indicate that further iterations will be
+ unlikely to change the solution from its current value.
+
+
+ -- Derivative Solver: gsl_multifit_fdfsolver_lmder
+ This is an unscaled version of the LMDER algorithm. The elements
+ of the diagonal scaling matrix D are set to 1. This algorithm may
+ be useful in circumstances where the scaled version of LMDER
+ converges too slowly, or the function is already scaled
+ appropriately.
+
+
+File: gsl-ref.info, Node: Minimization Algorithms without Derivatives, Next: Computing the covariance matrix of best fit parameters, Prev: Minimization Algorithms using Derivatives, Up: Nonlinear Least-Squares Fitting
+
+37.7 Minimization Algorithms without Derivatives
+================================================
+
+There are no algorithms implemented in this section at the moment.
+
+
+File: gsl-ref.info, Node: Computing the covariance matrix of best fit parameters, Next: Example programs for Nonlinear Least-Squares Fitting, Prev: Minimization Algorithms without Derivatives, Up: Nonlinear Least-Squares Fitting
+
+37.8 Computing the covariance matrix of best fit parameters
+===========================================================
+
+ -- Function: int gsl_multifit_covar (const gsl_matrix * J, double
+ EPSREL, gsl_matrix * COVAR)
+ This function uses the Jacobian matrix J to compute the covariance
+ matrix of the best-fit parameters, COVAR. The parameter EPSREL is
+ used to remove linear-dependent columns when J is rank deficient.
+
+ The covariance matrix is given by,
+
+ covar = (J^T J)^{-1}
+
+ and is computed by QR decomposition of J with column-pivoting. Any
+ columns of R which satisfy
+
+ |R_{kk}| <= epsrel |R_{11}|
+
+ are considered linearly-dependent and are excluded from the
+ covariance matrix (the corresponding rows and columns of the
+ covariance matrix are set to zero).
+
+ If the minimisation uses the weighted least-squares function f_i =
+ (Y(x, t_i) - y_i) / \sigma_i then the covariance matrix above
+ gives the statistical error on the best-fit parameters resulting
+ from the gaussian errors \sigma_i on the underlying data y_i.
+ This can be verified from the relation \delta f = J \delta c and
+ the fact that the fluctuations in f from the data y_i are
+ normalised by \sigma_i and so satisfy <\delta f \delta f^T> = I.
+
+ For an unweighted least-squares function f_i = (Y(x, t_i) - y_i)
+ the covariance matrix above should be multiplied by the variance
+ of the residuals about the best-fit \sigma^2 = \sum (y_i -
+ Y(x,t_i))^2 / (n-p) to give the variance-covariance matrix
+ \sigma^2 C. This estimates the statistical error on the best-fit
+ parameters from the scatter of the underlying data.
+
+ For more information about covariance matrices see *Note Fitting
+ Overview::.
+
+
+File: gsl-ref.info, Node: Example programs for Nonlinear Least-Squares Fitting, Next: References and Further Reading for Nonlinear Least-Squares Fitting, Prev: Computing the covariance matrix of best fit parameters, Up: Nonlinear Least-Squares Fitting
+
+37.9 Examples
+=============
+
+The following example program fits a weighted exponential model with
+background to experimental data, Y = A \exp(-\lambda t) + b. The first
+part of the program sets up the functions `expb_f' and `expb_df' to
+calculate the model and its Jacobian. The appropriate fitting function
+is given by,
+
+ f_i = ((A \exp(-\lambda t_i) + b) - y_i)/\sigma_i
+
+where we have chosen t_i = i. The Jacobian matrix J is the derivative
+of these functions with respect to the three parameters (A, \lambda,
+b). It is given by,
+
+ J_{ij} = d f_i / d x_j
+
+where x_0 = A, x_1 = \lambda and x_2 = b.
+
+ /* expfit.c -- model functions for exponential + background */
+
+ struct data {
+ size_t n;
+ double * y;
+ double * sigma;
+ };
+
+ int
+ expb_f (const gsl_vector * x, void *data,
+ gsl_vector * f)
+ {
+ size_t n = ((struct data *)data)->n;
+ double *y = ((struct data *)data)->y;
+ double *sigma = ((struct data *) data)->sigma;
+
+ double A = gsl_vector_get (x, 0);
+ double lambda = gsl_vector_get (x, 1);
+ double b = gsl_vector_get (x, 2);
+
+ size_t i;
+
+ for (i = 0; i < n; i++)
+ {
+ /* Model Yi = A * exp(-lambda * i) + b */
+ double t = i;
+ double Yi = A * exp (-lambda * t) + b;
+ gsl_vector_set (f, i, (Yi - y[i])/sigma[i]);
+ }
+
+ return GSL_SUCCESS;
+ }
+
+ int
+ expb_df (const gsl_vector * x, void *data,
+ gsl_matrix * J)
+ {
+ size_t n = ((struct data *)data)->n;
+ double *sigma = ((struct data *) data)->sigma;
+
+ double A = gsl_vector_get (x, 0);
+ double lambda = gsl_vector_get (x, 1);
+
+ size_t i;
+
+ for (i = 0; i < n; i++)
+ {
+ /* Jacobian matrix J(i,j) = dfi / dxj, */
+ /* where fi = (Yi - yi)/sigma[i], */
+ /* Yi = A * exp(-lambda * i) + b */
+ /* and the xj are the parameters (A,lambda,b) */
+ double t = i;
+ double s = sigma[i];
+ double e = exp(-lambda * t);
+ gsl_matrix_set (J, i, 0, e/s);
+ gsl_matrix_set (J, i, 1, -t * A * e/s);
+ gsl_matrix_set (J, i, 2, 1/s);
+ }
+ return GSL_SUCCESS;
+ }
+
+ int
+ expb_fdf (const gsl_vector * x, void *data,
+ gsl_vector * f, gsl_matrix * J)
+ {
+ expb_f (x, data, f);
+ expb_df (x, data, J);
+
+ return GSL_SUCCESS;
+ }
+
+The main part of the program sets up a Levenberg-Marquardt solver and
+some simulated random data. The data uses the known parameters
+(1.0,5.0,0.1) combined with gaussian noise (standard deviation = 0.1)
+over a range of 40 timesteps. The initial guess for the parameters is
+chosen as (0.0, 1.0, 0.0).
+
+ #include <stdlib.h>
+ #include <stdio.h>
+ #include <gsl/gsl_rng.h>
+ #include <gsl/gsl_randist.h>
+ #include <gsl/gsl_vector.h>
+ #include <gsl/gsl_blas.h>
+ #include <gsl/gsl_multifit_nlin.h>
+
+ #include "expfit.c"
+
+ #define N 40
+
+ void print_state (size_t iter, gsl_multifit_fdfsolver * s);
+
+ int
+ main (void)
+ {
+ const gsl_multifit_fdfsolver_type *T;
+ gsl_multifit_fdfsolver *s;
+ int status;
+ unsigned int i, iter = 0;
+ const size_t n = N;
+ const size_t p = 3;
+
+ gsl_matrix *covar = gsl_matrix_alloc (p, p);
+ double y[N], sigma[N];
+ struct data d = { n, y, sigma};
+ gsl_multifit_function_fdf f;
+ double x_init[3] = { 1.0, 0.0, 0.0 };
+ gsl_vector_view x = gsl_vector_view_array (x_init, p);
+ const gsl_rng_type * type;
+ gsl_rng * r;
+
+ gsl_rng_env_setup();
+
+ type = gsl_rng_default;
+ r = gsl_rng_alloc (type);
+
+ f.f = &expb_f;
+ f.df = &expb_df;
+ f.fdf = &expb_fdf;
+ f.n = n;
+ f.p = p;
+ f.params = &d;
+
+ /* This is the data to be fitted */
+
+ for (i = 0; i < n; i++)
+ {
+ double t = i;
+ y[i] = 1.0 + 5 * exp (-0.1 * t)
+ + gsl_ran_gaussian (r, 0.1);
+ sigma[i] = 0.1;
+ printf ("data: %u %g %g\n", i, y[i], sigma[i]);
+ };
+
+ T = gsl_multifit_fdfsolver_lmsder;
+ s = gsl_multifit_fdfsolver_alloc (T, n, p);
+ gsl_multifit_fdfsolver_set (s, &f, &x.vector);
+
+ print_state (iter, s);
+
+ do
+ {
+ iter++;
+ status = gsl_multifit_fdfsolver_iterate (s);
+
+ printf ("status = %s\n", gsl_strerror (status));
+
+ print_state (iter, s);
+
+ if (status)
+ break;
+
+ status = gsl_multifit_test_delta (s->dx, s->x,
+ 1e-4, 1e-4);
+ }
+ while (status == GSL_CONTINUE && iter < 500);
+
+ gsl_multifit_covar (s->J, 0.0, covar);
+
+ #define FIT(i) gsl_vector_get(s->x, i)
+ #define ERR(i) sqrt(gsl_matrix_get(covar,i,i))
+
+ {
+ double chi = gsl_blas_dnrm2(s->f);
+ double dof = n - p;
+ double c = GSL_MAX_DBL(1, chi / sqrt(dof));
+
+ printf("chisq/dof = %g\n", pow(chi, 2.0) / dof);
+
+ printf ("A = %.5f +/- %.5f\n", FIT(0), c*ERR(0));
+ printf ("lambda = %.5f +/- %.5f\n", FIT(1), c*ERR(1));
+ printf ("b = %.5f +/- %.5f\n", FIT(2), c*ERR(2));
+ }
+
+ printf ("status = %s\n", gsl_strerror (status));
+
+ gsl_multifit_fdfsolver_free (s);
+ gsl_matrix_free (covar);
+ gsl_rng_free (r);
+ return 0;
+ }
+
+ void
+ print_state (size_t iter, gsl_multifit_fdfsolver * s)
+ {
+ printf ("iter: %3u x = % 15.8f % 15.8f % 15.8f "
+ "|f(x)| = %g\n",
+ iter,
+ gsl_vector_get (s->x, 0),
+ gsl_vector_get (s->x, 1),
+ gsl_vector_get (s->x, 2),
+ gsl_blas_dnrm2 (s->f));
+ }
+
+The iteration terminates when the change in x is smaller than 0.0001, as
+both an absolute and relative change. Here are the results of running
+the program:
+
+ iter: 0 x=1.00000000 0.00000000 0.00000000 |f(x)|=117.349
+ status=success
+ iter: 1 x=1.64659312 0.01814772 0.64659312 |f(x)|=76.4578
+ status=success
+ iter: 2 x=2.85876037 0.08092095 1.44796363 |f(x)|=37.6838
+ status=success
+ iter: 3 x=4.94899512 0.11942928 1.09457665 |f(x)|=9.58079
+ status=success
+ iter: 4 x=5.02175572 0.10287787 1.03388354 |f(x)|=5.63049
+ status=success
+ iter: 5 x=5.04520433 0.10405523 1.01941607 |f(x)|=5.44398
+ status=success
+ iter: 6 x=5.04535782 0.10404906 1.01924871 |f(x)|=5.44397
+ chisq/dof = 0.800996
+ A = 5.04536 +/- 0.06028
+ lambda = 0.10405 +/- 0.00316
+ b = 1.01925 +/- 0.03782
+ status = success
+
+The approximate values of the parameters are found correctly, and the
+chi-squared value indicates a good fit (the chi-squared per degree of
+freedom is approximately 1). In this case the errors on the parameters
+can be estimated from the square roots of the diagonal elements of the
+covariance matrix.
+
+ If the chi-squared value shows a poor fit (i.e. chi^2/dof >> 1) then
+the error estimates obtained from the covariance matrix will be too
+small. In the example program the error estimates are multiplied by
+\sqrt{\chi^2/dof} in this case, a common way of increasing the errors
+for a poor fit. Note that a poor fit will result from the use an
+inappropriate model, and the scaled error estimates may then be outside
+the range of validity for gaussian errors.
+
+
+File: gsl-ref.info, Node: References and Further Reading for Nonlinear Least-Squares Fitting, Prev: Example programs for Nonlinear Least-Squares Fitting, Up: Nonlinear Least-Squares Fitting
+
+37.10 References and Further Reading
+====================================
+
+The MINPACK algorithm is described in the following article,
+
+ J.J. More', `The Levenberg-Marquardt Algorithm: Implementation and
+ Theory', Lecture Notes in Mathematics, v630 (1978), ed G. Watson.
+
+The following paper is also relevant to the algorithms described in this
+section,
+
+ J.J. More', B.S. Garbow, K.E. Hillstrom, "Testing Unconstrained
+ Optimization Software", ACM Transactions on Mathematical Software,
+ Vol 7, No 1 (1981), p 17-41.
+
+
+File: gsl-ref.info, Node: Basis Splines, Next: Physical Constants, Prev: Nonlinear Least-Squares Fitting, Up: Top
+
+38 Basis Splines
+****************
+
+This chapter describes functions for the computation of smoothing basis
+splines (B-splines). The header file `gsl_bspline.h' contains
+prototypes for the bspline functions and related declarations.
+
+* Menu:
+
+* Overview of B-splines::
+* Initializing the B-splines solver::
+* Constructing the knots vector::
+* Evaluation of B-spline basis functions::
+* Example programs for B-splines::
+* References and Further Reading::
+
+
+File: gsl-ref.info, Node: Overview of B-splines, Next: Initializing the B-splines solver, Up: Basis Splines
+
+38.1 Overview
+=============
+
+B-splines are commonly used as basis functions to fit smoothing curves
+to large data sets. To do this, the abscissa axis is broken up into
+some number of intervals, where the endpoints of each interval are
+called "breakpoints". These breakpoints are then converted to "knots"
+by imposing various continuity and smoothness conditions at each
+interface. Given a nondecreasing knot vector t = \t_0, t_1, \dots,
+t_n+k-1\, the n basis splines of order k are defined by
+
+ B_(i,1)(x) = (1, t_i <= x < t_(i+1)
+ (0, else
+ B_(i,k)(x) = [(x - t_i)/(t_(i+k-1) - t_i)] B_(i,k-1)(x) + [(t_(i+k) - x)/(t_(i+k) - t_(i+1))] B_(i+1,k-1)(x)
+
+ for i = 0, \dots, n-1. The common case of cubic B-splines is given
+by k = 4. The above recurrence relation can be evaluated in a
+numerically stable way by the de Boor algorithm.
+
+ If we define appropriate knots on an interval [a,b] then the
+B-spline basis functions form a complete set on that interval.
+Therefore we can expand a smoothing function as
+
+ f(x) = \sum_i c_i B_(i,k)(x)
+
+ given enough (x_j, f(x_j)) data pairs. The c_i can be readily
+obtained from a least-squares fit.
+
+
+File: gsl-ref.info, Node: Initializing the B-splines solver, Next: Constructing the knots vector, Prev: Overview of B-splines, Up: Basis Splines
+
+38.2 Initializing the B-splines solver
+======================================
+
+ -- Function: gsl_bspline_workspace * gsl_bspline_alloc (const size_t
+ K, const size_t NBREAK)
+ This function allocates a workspace for computing B-splines of
+ order K. The number of breakpoints is given by NBREAK. This leads
+ to n = nbreak + k - 2 basis functions. Cubic B-splines are
+ specified by k = 4. The size of the workspace is O(5k + nbreak).
+
+ -- Function: void gsl_bspline_free (gsl_bspline_workspace * W)
+ This function frees the memory associated with the workspace W.
+
+
+File: gsl-ref.info, Node: Constructing the knots vector, Next: Evaluation of B-spline basis functions, Prev: Initializing the B-splines solver, Up: Basis Splines
+
+38.3 Constructing the knots vector
+==================================
+
+ -- Function: int gsl_bspline_knots (const gsl_vector * BREAKPTS,
+ gsl_bspline_workspace * W)
+ This function computes the knots associated with the given
+ breakpoints and stores them internally in `w->knots'.
+
+ -- Function: int gsl_bspline_knots_uniform (const double a, const
+ double b, gsl_bspline_workspace * W)
+ This function assumes uniformly spaced breakpoints on [a,b] and
+ constructs the corresponding knot vector using the previously
+ specified NBREAK parameter. The knots are stored in `w->knots'.
+
+
+File: gsl-ref.info, Node: Evaluation of B-spline basis functions, Next: Example programs for B-splines, Prev: Constructing the knots vector, Up: Basis Splines
+
+38.4 Evaluation of B-splines
+============================
+
+ -- Function: int gsl_bspline_eval (const double X, gsl_vector * B,
+ gsl_bspline_workspace * W)
+ This function evaluates all B-spline basis functions at the
+ position X and stores them in B, so that the ith element of B is
+ B_i(x). B must be of length n = nbreak + k - 2. This value is also
+ stored in `w->n'. It is far more efficient to compute all of the
+ basis functions at once than to compute them individually, due to
+ the nature of the defining recurrence relation.
+
+
+File: gsl-ref.info, Node: Example programs for B-splines, Next: References and Further Reading, Prev: Evaluation of B-spline basis functions, Up: Basis Splines
+
+38.5 Example programs for B-splines
+===================================
+
+The following program computes a linear least squares fit to data using
+cubic B-spline basis functions with uniform breakpoints. The data is
+generated from the curve y(x) = \cos(x) \exp(-0.1 x) on [0, 15] with
+gaussian noise added.
+
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <math.h>
+ #include <gsl/gsl_bspline.h>
+ #include <gsl/gsl_multifit.h>
+ #include <gsl/gsl_rng.h>
+ #include <gsl/gsl_randist.h>
+
+ /* number of data points to fit */
+ #define N 200
+
+ /* number of fit coefficients */
+ #define NCOEFFS 8
+
+ /* nbreak = ncoeffs + 2 - k = ncoeffs - 2 since k = 4 */
+ #define NBREAK (NCOEFFS - 2)
+
+ int
+ main (void)
+ {
+ const size_t n = N;
+ const size_t ncoeffs = NCOEFFS;
+ const size_t nbreak = NBREAK;
+ size_t i, j;
+ gsl_bspline_workspace *bw;
+ gsl_vector *B;
+ double dy;
+ gsl_rng *r;
+ gsl_vector *c, *w;
+ gsl_vector *x, *y;
+ gsl_matrix *X, *cov;
+ gsl_multifit_linear_workspace *mw;
+ double chisq;
+
+ gsl_rng_env_setup();
+ r = gsl_rng_alloc(gsl_rng_default);
+
+ /* allocate a cubic bspline workspace (k = 4) */
+ bw = gsl_bspline_alloc(4, nbreak);
+ B = gsl_vector_alloc(ncoeffs);
+
+ x = gsl_vector_alloc(n);
+ y = gsl_vector_alloc(n);
+ X = gsl_matrix_alloc(n, ncoeffs);
+ c = gsl_vector_alloc(ncoeffs);
+ w = gsl_vector_alloc(n);
+ cov = gsl_matrix_alloc(ncoeffs, ncoeffs);
+ mw = gsl_multifit_linear_alloc(n, ncoeffs);
+
+ printf("#m=0,S=0\n");
+ /* this is the data to be fitted */
+ for (i = 0; i < n; ++i)
+ {
+ double sigma;
+ double xi = (15.0/(N-1)) * i;
+ double yi = cos(xi) * exp(-0.1 * xi);
+
+ sigma = 0.1;
+ dy = gsl_ran_gaussian(r, sigma);
+ yi += dy;
+
+ gsl_vector_set(x, i, xi);
+ gsl_vector_set(y, i, yi);
+ gsl_vector_set(w, i, 1.0 / (sigma*sigma));
+
+ printf("%f %f\n", xi, yi);
+ }
+
+ /* use uniform breakpoints on [0, 15] */
+ gsl_bspline_knots_uniform(0.0, 15.0, bw);
+
+ /* construct the fit matrix X */
+ for (i = 0; i < n; ++i)
+ {
+ double xi = gsl_vector_get(x, i);
+
+ /* compute B_j(xi) for all j */
+ gsl_bspline_eval(xi, B, bw);
+
+ /* fill in row i of X */
+ for (j = 0; j < ncoeffs; ++j)
+ {
+ double Bj = gsl_vector_get(B, j);
+ gsl_matrix_set(X, i, j, Bj);
+ }
+ }
+
+ /* do the fit */
+ gsl_multifit_wlinear(X, w, y, c, cov, &chisq, mw);
+
+ /* output the smoothed curve */
+ {
+ double xi, yi, yerr;
+
+ printf("#m=1,S=0\n");
+ for (xi = 0.0; xi < 15.0; xi += 0.1)
+ {
+ gsl_bspline_eval(xi, B, bw);
+ gsl_multifit_linear_est(B, c, cov, &yi, &yerr);
+ printf("%f %f\n", xi, yi);
+ }
+ }
+
+ gsl_rng_free(r);
+ gsl_bspline_free(bw);
+ gsl_vector_free(B);
+ gsl_vector_free(x);
+ gsl_vector_free(y);
+ gsl_matrix_free(X);
+ gsl_vector_free(c);
+ gsl_vector_free(w);
+ gsl_matrix_free(cov);
+ gsl_multifit_linear_free(mw);
+
+ return 0;
+ } /* main() */
+
+ The output can be plotted with GNU `graph'.
+
+ $ ./a.out > bspline.dat
+ $ graph -T ps -X x -Y y -x 0 15 -y -1 1.3 < bspline.dat > bspline.ps
+
+
+File: gsl-ref.info, Node: References and Further Reading, Prev: Example programs for B-splines, Up: Basis Splines
+
+38.6 References and Further Reading
+===================================
+
+Further information on the algorithms described in this section can be
+found in the following book,
+
+ C. de Boor, `A Practical Guide to Splines' (1978), Springer-Verlag,
+ ISBN 0-387-90356-9.
+
+A large collection of B-spline routines is available in the PPPACK
+library available at `http://www.netlib.org/pppack'.
+
+
+File: gsl-ref.info, Node: Physical Constants, Next: IEEE floating-point arithmetic, Prev: Basis Splines, Up: Top
+
+39 Physical Constants
+*********************
+
+This chapter describes macros for the values of physical constants, such
+as the speed of light, c, and gravitational constant, G. The values
+are available in different unit systems, including the standard MKSA
+system (meters, kilograms, seconds, amperes) and the CGSM system
+(centimeters, grams, seconds, gauss), which is commonly used in
+Astronomy.
+
+ The definitions of constants in the MKSA system are available in the
+file `gsl_const_mksa.h'. The constants in the CGSM system are defined
+in `gsl_const_cgsm.h'. Dimensionless constants, such as the fine
+structure constant, which are pure numbers are defined in
+`gsl_const_num.h'.
+
+* Menu:
+
+* Fundamental Constants::
+* Astronomy and Astrophysics::
+* Atomic and Nuclear Physics::
+* Measurement of Time::
+* Imperial Units ::
+* Speed and Nautical Units::
+* Printers Units::
+* Volume Area and Length::
+* Mass and Weight ::
+* Thermal Energy and Power::
+* Pressure::
+* Viscosity::
+* Light and Illumination::
+* Radioactivity::
+* Force and Energy::
+* Prefixes::
+* Physical Constant Examples::
+* Physical Constant References and Further Reading::
+
+ The full list of constants is described briefly below. Consult the
+header files themselves for the values of the constants used in the
+library.
+
+
+File: gsl-ref.info, Node: Fundamental Constants, Next: Astronomy and Astrophysics, Up: Physical Constants
+
+39.1 Fundamental Constants
+==========================
+
+`GSL_CONST_MKSA_SPEED_OF_LIGHT'
+ The speed of light in vacuum, c.
+
+`GSL_CONST_MKSA_VACUUM_PERMEABILITY'
+ The permeability of free space, \mu_0. This constant is defined in
+ the MKSA system only.
+
+`GSL_CONST_MKSA_VACUUM_PERMITTIVITY'
+ The permittivity of free space, \epsilon_0. This constant is
+ defined in the MKSA system only.
+
+`GSL_CONST_MKSA_PLANCKS_CONSTANT_H'
+ Planck's constant, h.
+
+`GSL_CONST_MKSA_PLANCKS_CONSTANT_HBAR'
+ Planck's constant divided by 2\pi, \hbar.
+
+`GSL_CONST_NUM_AVOGADRO'
+ Avogadro's number, N_a.
+
+`GSL_CONST_MKSA_FARADAY'
+ The molar charge of 1 Faraday.
+
+`GSL_CONST_MKSA_BOLTZMANN'
+ The Boltzmann constant, k.
+
+`GSL_CONST_MKSA_MOLAR_GAS'
+ The molar gas constant, R_0.
+
+`GSL_CONST_MKSA_STANDARD_GAS_VOLUME'
+ The standard gas volume, V_0.
+
+`GSL_CONST_MKSA_STEFAN_BOLTZMANN_CONSTANT'
+ The Stefan-Boltzmann radiation constant, \sigma.
+
+`GSL_CONST_MKSA_GAUSS'
+ The magnetic field of 1 Gauss.
+
+
+File: gsl-ref.info, Node: Astronomy and Astrophysics, Next: Atomic and Nuclear Physics, Prev: Fundamental Constants, Up: Physical Constants
+
+39.2 Astronomy and Astrophysics
+===============================
+
+`GSL_CONST_MKSA_ASTRONOMICAL_UNIT'
+ The length of 1 astronomical unit (mean earth-sun distance), au.
+
+`GSL_CONST_MKSA_GRAVITATIONAL_CONSTANT'
+ The gravitational constant, G.
+
+`GSL_CONST_MKSA_LIGHT_YEAR'
+ The distance of 1 light-year, ly.
+
+`GSL_CONST_MKSA_PARSEC'
+ The distance of 1 parsec, pc.
+
+`GSL_CONST_MKSA_GRAV_ACCEL'
+ The standard gravitational acceleration on Earth, g.
+
+`GSL_CONST_MKSA_SOLAR_MASS'
+ The mass of the Sun.
+
+
+File: gsl-ref.info, Node: Atomic and Nuclear Physics, Next: Measurement of Time, Prev: Astronomy and Astrophysics, Up: Physical Constants
+
+39.3 Atomic and Nuclear Physics
+===============================
+
+`GSL_CONST_MKSA_ELECTRON_CHARGE'
+ The charge of the electron, e.
+
+`GSL_CONST_MKSA_ELECTRON_VOLT'
+ The energy of 1 electron volt, eV.
+
+`GSL_CONST_MKSA_UNIFIED_ATOMIC_MASS'
+ The unified atomic mass, amu.
+
+`GSL_CONST_MKSA_MASS_ELECTRON'
+ The mass of the electron, m_e.
+
+`GSL_CONST_MKSA_MASS_MUON'
+ The mass of the muon, m_\mu.
+
+`GSL_CONST_MKSA_MASS_PROTON'
+ The mass of the proton, m_p.
+
+`GSL_CONST_MKSA_MASS_NEUTRON'
+ The mass of the neutron, m_n.
+
+`GSL_CONST_NUM_FINE_STRUCTURE'
+ The electromagnetic fine structure constant \alpha.
+
+`GSL_CONST_MKSA_RYDBERG'
+ The Rydberg constant, Ry, in units of energy. This is related to
+ the Rydberg inverse wavelength R by Ry = h c R.
+
+`GSL_CONST_MKSA_BOHR_RADIUS'
+ The Bohr radius, a_0.
+
+`GSL_CONST_MKSA_ANGSTROM'
+ The length of 1 angstrom.
+
+`GSL_CONST_MKSA_BARN'
+ The area of 1 barn.
+
+`GSL_CONST_MKSA_BOHR_MAGNETON'
+ The Bohr Magneton, \mu_B.
+
+`GSL_CONST_MKSA_NUCLEAR_MAGNETON'
+ The Nuclear Magneton, \mu_N.
+
+`GSL_CONST_MKSA_ELECTRON_MAGNETIC_MOMENT'
+ The absolute value of the magnetic moment of the electron, \mu_e.
+ The physical magnetic moment of the electron is negative.
+
+`GSL_CONST_MKSA_PROTON_MAGNETIC_MOMENT'
+ The magnetic moment of the proton, \mu_p.
+
+`GSL_CONST_MKSA_THOMSON_CROSS_SECTION'
+ The Thomson cross section, \sigma_T.
+
+`GSL_CONST_MKSA_DEBYE'
+ The electric dipole moment of 1 Debye, D.
+
+
+File: gsl-ref.info, Node: Measurement of Time, Next: Imperial Units, Prev: Atomic and Nuclear Physics, Up: Physical Constants
+
+39.4 Measurement of Time
+========================
+
+`GSL_CONST_MKSA_MINUTE'
+ The number of seconds in 1 minute.
+
+`GSL_CONST_MKSA_HOUR'
+ The number of seconds in 1 hour.
+
+`GSL_CONST_MKSA_DAY'
+ The number of seconds in 1 day.
+
+`GSL_CONST_MKSA_WEEK'
+ The number of seconds in 1 week.
+
+
+File: gsl-ref.info, Node: Imperial Units, Next: Speed and Nautical Units, Prev: Measurement of Time, Up: Physical Constants
+
+39.5 Imperial Units
+===================
+
+`GSL_CONST_MKSA_INCH'
+ The length of 1 inch.
+
+`GSL_CONST_MKSA_FOOT'
+ The length of 1 foot.
+
+`GSL_CONST_MKSA_YARD'
+ The length of 1 yard.
+
+`GSL_CONST_MKSA_MILE'
+ The length of 1 mile.
+
+`GSL_CONST_MKSA_MIL'
+ The length of 1 mil (1/1000th of an inch).
+
+
+File: gsl-ref.info, Node: Speed and Nautical Units, Next: Printers Units, Prev: Imperial Units, Up: Physical Constants
+
+39.6 Speed and Nautical Units
+=============================
+
+`GSL_CONST_MKSA_KILOMETERS_PER_HOUR'
+ The speed of 1 kilometer per hour.
+
+`GSL_CONST_MKSA_MILES_PER_HOUR'
+ The speed of 1 mile per hour.
+
+`GSL_CONST_MKSA_NAUTICAL_MILE'
+ The length of 1 nautical mile.
+
+`GSL_CONST_MKSA_FATHOM'
+ The length of 1 fathom.
+
+`GSL_CONST_MKSA_KNOT'
+ The speed of 1 knot.
+
+
+File: gsl-ref.info, Node: Printers Units, Next: Volume Area and Length, Prev: Speed and Nautical Units, Up: Physical Constants
+
+39.7 Printers Units
+===================
+
+`GSL_CONST_MKSA_POINT'
+ The length of 1 printer's point (1/72 inch).
+
+`GSL_CONST_MKSA_TEXPOINT'
+ The length of 1 TeX point (1/72.27 inch).
+
+
+File: gsl-ref.info, Node: Volume Area and Length, Next: Mass and Weight, Prev: Printers Units, Up: Physical Constants
+
+39.8 Volume, Area and Length
+============================
+
+`GSL_CONST_MKSA_MICRON'
+ The length of 1 micron.
+
+`GSL_CONST_MKSA_HECTARE'
+ The area of 1 hectare.
+
+`GSL_CONST_MKSA_ACRE'
+ The area of 1 acre.
+
+`GSL_CONST_MKSA_LITER'
+ The volume of 1 liter.
+
+`GSL_CONST_MKSA_US_GALLON'
+ The volume of 1 US gallon.
+
+`GSL_CONST_MKSA_CANADIAN_GALLON'
+ The volume of 1 Canadian gallon.
+
+`GSL_CONST_MKSA_UK_GALLON'
+ The volume of 1 UK gallon.
+
+`GSL_CONST_MKSA_QUART'
+ The volume of 1 quart.
+
+`GSL_CONST_MKSA_PINT'
+ The volume of 1 pint.
+
+
+File: gsl-ref.info, Node: Mass and Weight, Next: Thermal Energy and Power, Prev: Volume Area and Length, Up: Physical Constants
+
+39.9 Mass and Weight
+====================
+
+`GSL_CONST_MKSA_POUND_MASS'
+ The mass of 1 pound.
+
+`GSL_CONST_MKSA_OUNCE_MASS'
+ The mass of 1 ounce.
+
+`GSL_CONST_MKSA_TON'
+ The mass of 1 ton.
+
+`GSL_CONST_MKSA_METRIC_TON'
+ The mass of 1 metric ton (1000 kg).
+
+`GSL_CONST_MKSA_UK_TON'
+ The mass of 1 UK ton.
+
+`GSL_CONST_MKSA_TROY_OUNCE'
+ The mass of 1 troy ounce.
+
+`GSL_CONST_MKSA_CARAT'
+ The mass of 1 carat.
+
+`GSL_CONST_MKSA_GRAM_FORCE'
+ The force of 1 gram weight.
+
+`GSL_CONST_MKSA_POUND_FORCE'
+ The force of 1 pound weight.
+
+`GSL_CONST_MKSA_KILOPOUND_FORCE'
+ The force of 1 kilopound weight.
+
+`GSL_CONST_MKSA_POUNDAL'
+ The force of 1 poundal.
+
+
+File: gsl-ref.info, Node: Thermal Energy and Power, Next: Pressure, Prev: Mass and Weight, Up: Physical Constants
+
+39.10 Thermal Energy and Power
+==============================
+
+`GSL_CONST_MKSA_CALORIE'
+ The energy of 1 calorie.
+
+`GSL_CONST_MKSA_BTU'
+ The energy of 1 British Thermal Unit, btu.
+
+`GSL_CONST_MKSA_THERM'
+ The energy of 1 Therm.
+
+`GSL_CONST_MKSA_HORSEPOWER'
+ The power of 1 horsepower.
+
+
+File: gsl-ref.info, Node: Pressure, Next: Viscosity, Prev: Thermal Energy and Power, Up: Physical Constants
+
+39.11 Pressure
+==============
+
+`GSL_CONST_MKSA_BAR'
+ The pressure of 1 bar.
+
+`GSL_CONST_MKSA_STD_ATMOSPHERE'
+ The pressure of 1 standard atmosphere.
+
+`GSL_CONST_MKSA_TORR'
+ The pressure of 1 torr.
+
+`GSL_CONST_MKSA_METER_OF_MERCURY'
+ The pressure of 1 meter of mercury.
+
+`GSL_CONST_MKSA_INCH_OF_MERCURY'
+ The pressure of 1 inch of mercury.
+
+`GSL_CONST_MKSA_INCH_OF_WATER'
+ The pressure of 1 inch of water.
+
+`GSL_CONST_MKSA_PSI'
+ The pressure of 1 pound per square inch.
+
+
+File: gsl-ref.info, Node: Viscosity, Next: Light and Illumination, Prev: Pressure, Up: Physical Constants
+
+39.12 Viscosity
+===============
+
+`GSL_CONST_MKSA_POISE'
+ The dynamic viscosity of 1 poise.
+
+`GSL_CONST_MKSA_STOKES'
+ The kinematic viscosity of 1 stokes.
+
+
+File: gsl-ref.info, Node: Light and Illumination, Next: Radioactivity, Prev: Viscosity, Up: Physical Constants
+
+39.13 Light and Illumination
+============================
+
+`GSL_CONST_MKSA_STILB'
+ The luminance of 1 stilb.
+
+`GSL_CONST_MKSA_LUMEN'
+ The luminous flux of 1 lumen.
+
+`GSL_CONST_MKSA_LUX'
+ The illuminance of 1 lux.
+
+`GSL_CONST_MKSA_PHOT'
+ The illuminance of 1 phot.
+
+`GSL_CONST_MKSA_FOOTCANDLE'
+ The illuminance of 1 footcandle.
+
+`GSL_CONST_MKSA_LAMBERT'
+ The luminance of 1 lambert.
+
+`GSL_CONST_MKSA_FOOTLAMBERT'
+ The luminance of 1 footlambert.
+
+
+File: gsl-ref.info, Node: Radioactivity, Next: Force and Energy, Prev: Light and Illumination, Up: Physical Constants
+
+39.14 Radioactivity
+===================
+
+`GSL_CONST_MKSA_CURIE'
+ The activity of 1 curie.
+
+`GSL_CONST_MKSA_ROENTGEN'
+ The exposure of 1 roentgen.
+
+`GSL_CONST_MKSA_RAD'
+ The absorbed dose of 1 rad.
+
+
+File: gsl-ref.info, Node: Force and Energy, Next: Prefixes, Prev: Radioactivity, Up: Physical Constants
+
+39.15 Force and Energy
+======================
+
+`GSL_CONST_MKSA_NEWTON'
+ The SI unit of force, 1 Newton.
+
+`GSL_CONST_MKSA_DYNE'
+ The force of 1 Dyne = 10^-5 Newton.
+
+`GSL_CONST_MKSA_JOULE'
+ The SI unit of energy, 1 Joule.
+
+`GSL_CONST_MKSA_ERG'
+ The energy 1 erg = 10^-7 Joule.
+
+
+File: gsl-ref.info, Node: Prefixes, Next: Physical Constant Examples, Prev: Force and Energy, Up: Physical Constants
+
+39.16 Prefixes
+==============
+
+These constants are dimensionless scaling factors.
+
+`GSL_CONST_NUM_YOTTA'
+ 10^24
+
+`GSL_CONST_NUM_ZETTA'
+ 10^21
+
+`GSL_CONST_NUM_EXA'
+ 10^18
+
+`GSL_CONST_NUM_PETA'
+ 10^15
+
+`GSL_CONST_NUM_TERA'
+ 10^12
+
+`GSL_CONST_NUM_GIGA'
+ 10^9
+
+`GSL_CONST_NUM_MEGA'
+ 10^6
+
+`GSL_CONST_NUM_KILO'
+ 10^3
+
+`GSL_CONST_NUM_MILLI'
+ 10^-3
+
+`GSL_CONST_NUM_MICRO'
+ 10^-6
+
+`GSL_CONST_NUM_NANO'
+ 10^-9
+
+`GSL_CONST_NUM_PICO'
+ 10^-12
+
+`GSL_CONST_NUM_FEMTO'
+ 10^-15
+
+`GSL_CONST_NUM_ATTO'
+ 10^-18
+
+`GSL_CONST_NUM_ZEPTO'
+ 10^-21
+
+`GSL_CONST_NUM_YOCTO'
+ 10^-24
+
+
+File: gsl-ref.info, Node: Physical Constant Examples, Next: Physical Constant References and Further Reading, Prev: Prefixes, Up: Physical Constants
+
+39.17 Examples
+==============
+
+The following program demonstrates the use of the physical constants in
+a calculation. In this case, the goal is to calculate the range of
+light-travel times from Earth to Mars.
+
+ The required data is the average distance of each planet from the
+Sun in astronomical units (the eccentricities and inclinations of the
+orbits will be neglected for the purposes of this calculation). The
+average radius of the orbit of Mars is 1.52 astronomical units, and for
+the orbit of Earth it is 1 astronomical unit (by definition). These
+values are combined with the MKSA values of the constants for the speed
+of light and the length of an astronomical unit to produce a result for
+the shortest and longest light-travel times in seconds. The figures are
+converted into minutes before being displayed.
+
+ #include <stdio.h>
+ #include <gsl/gsl_const_mksa.h>
+
+ int
+ main (void)
+ {
+ double c = GSL_CONST_MKSA_SPEED_OF_LIGHT;
+ double au = GSL_CONST_MKSA_ASTRONOMICAL_UNIT;
+ double minutes = GSL_CONST_MKSA_MINUTE;
+
+ /* distance stored in meters */
+ double r_earth = 1.00 * au;
+ double r_mars = 1.52 * au;
+
+ double t_min, t_max;
+
+ t_min = (r_mars - r_earth) / c;
+ t_max = (r_mars + r_earth) / c;
+
+ printf ("light travel time from Earth to Mars:\n");
+ printf ("minimum = %.1f minutes\n", t_min / minutes);
+ printf ("maximum = %.1f minutes\n", t_max / minutes);
+
+ return 0;
+ }
+
+Here is the output from the program,
+
+ light travel time from Earth to Mars:
+ minimum = 4.3 minutes
+ maximum = 21.0 minutes
+
+
+File: gsl-ref.info, Node: Physical Constant References and Further Reading, Prev: Physical Constant Examples, Up: Physical Constants
+
+39.18 References and Further Reading
+====================================
+
+The authoritative sources for physical constants are the 2002 CODATA
+recommended values, published in the articles below. Further information
+on the values of physical constants is also available from the cited
+articles and the NIST website.
+
+ Journal of Physical and Chemical Reference Data, 28(6), 1713-1852,
+ 1999
+
+ Reviews of Modern Physics, 72(2), 351-495, 2000
+
+ `http://www.physics.nist.gov/cuu/Constants/index.html'
+
+ `http://physics.nist.gov/Pubs/SP811/appenB9.html'
+
+
+File: gsl-ref.info, Node: IEEE floating-point arithmetic, Next: Debugging Numerical Programs, Prev: Physical Constants, Up: Top
+
+40 IEEE floating-point arithmetic
+*********************************
+
+This chapter describes functions for examining the representation of
+floating point numbers and controlling the floating point environment of
+your program. The functions described in this chapter are declared in
+the header file `gsl_ieee_utils.h'.
+
+* Menu:
+
+* Representation of floating point numbers::
+* Setting up your IEEE environment::
+* IEEE References and Further Reading::
+
+
+File: gsl-ref.info, Node: Representation of floating point numbers, Next: Setting up your IEEE environment, Up: IEEE floating-point arithmetic
+
+40.1 Representation of floating point numbers
+=============================================
+
+The IEEE Standard for Binary Floating-Point Arithmetic defines binary
+formats for single and double precision numbers. Each number is
+composed of three parts: a "sign bit" (s), an "exponent" (E) and a
+"fraction" (f). The numerical value of the combination (s,E,f) is
+given by the following formula,
+
+ (-1)^s (1.fffff...) 2^E
+
+The sign bit is either zero or one. The exponent ranges from a minimum
+value E_min to a maximum value E_max depending on the precision. The
+exponent is converted to an unsigned number e, known as the "biased
+exponent", for storage by adding a "bias" parameter, e = E + bias. The
+sequence fffff... represents the digits of the binary fraction f. The
+binary digits are stored in "normalized form", by adjusting the
+exponent to give a leading digit of 1. Since the leading digit is
+always 1 for normalized numbers it is assumed implicitly and does not
+have to be stored. Numbers smaller than 2^(E_min) are be stored in
+"denormalized form" with a leading zero,
+
+ (-1)^s (0.fffff...) 2^(E_min)
+
+This allows gradual underflow down to 2^(E_min - p) for p bits of
+precision. A zero is encoded with the special exponent of 2^(E_min -
+1) and infinities with the exponent of 2^(E_max + 1).
+
+The format for single precision numbers uses 32 bits divided in the
+following way,
+
+ seeeeeeeefffffffffffffffffffffff
+
+ s = sign bit, 1 bit
+ e = exponent, 8 bits (E_min=-126, E_max=127, bias=127)
+ f = fraction, 23 bits
+
+The format for double precision numbers uses 64 bits divided in the
+following way,
+
+ seeeeeeeeeeeffffffffffffffffffffffffffffffffffffffffffffffffffff
+
+ s = sign bit, 1 bit
+ e = exponent, 11 bits (E_min=-1022, E_max=1023, bias=1023)
+ f = fraction, 52 bits
+
+It is often useful to be able to investigate the behavior of a
+calculation at the bit-level and the library provides functions for
+printing the IEEE representations in a human-readable form.
+
+ -- Function: void gsl_ieee_fprintf_float (FILE * STREAM, const float *
+ X)
+ -- Function: void gsl_ieee_fprintf_double (FILE * STREAM, const double
+ * X)
+ These functions output a formatted version of the IEEE
+ floating-point number pointed to by X to the stream STREAM. A
+ pointer is used to pass the number indirectly, to avoid any
+ undesired promotion from `float' to `double'. The output takes
+ one of the following forms,
+
+ `NaN'
+ the Not-a-Number symbol
+
+ `Inf, -Inf'
+ positive or negative infinity
+
+ `1.fffff...*2^E, -1.fffff...*2^E'
+ a normalized floating point number
+
+ `0.fffff...*2^E, -0.fffff...*2^E'
+ a denormalized floating point number
+
+ `0, -0'
+ positive or negative zero
+
+
+ The output can be used directly in GNU Emacs Calc mode by
+ preceding it with `2#' to indicate binary.
+
+ -- Function: void gsl_ieee_printf_float (const float * X)
+ -- Function: void gsl_ieee_printf_double (const double * X)
+ These functions output a formatted version of the IEEE
+ floating-point number pointed to by X to the stream `stdout'.
+
+The following program demonstrates the use of the functions by printing
+the single and double precision representations of the fraction 1/3.
+For comparison the representation of the value promoted from single to
+double precision is also printed.
+
+ #include <stdio.h>
+ #include <gsl/gsl_ieee_utils.h>
+
+ int
+ main (void)
+ {
+ float f = 1.0/3.0;
+ double d = 1.0/3.0;
+
+ double fd = f; /* promote from float to double */
+
+ printf (" f="); gsl_ieee_printf_float(&f);
+ printf ("\n");
+
+ printf ("fd="); gsl_ieee_printf_double(&fd);
+ printf ("\n");
+
+ printf (" d="); gsl_ieee_printf_double(&d);
+ printf ("\n");
+
+ return 0;
+ }
+
+The binary representation of 1/3 is 0.01010101... . The output below
+shows that the IEEE format normalizes this fraction to give a leading
+digit of 1,
+
+ f= 1.01010101010101010101011*2^-2
+ fd= 1.0101010101010101010101100000000000000000000000000000*2^-2
+ d= 1.0101010101010101010101010101010101010101010101010101*2^-2
+
+The output also shows that a single-precision number is promoted to
+double-precision by adding zeros in the binary representation.
+
+
+File: gsl-ref.info, Node: Setting up your IEEE environment, Next: IEEE References and Further Reading, Prev: Representation of floating point numbers, Up: IEEE floating-point arithmetic
+
+40.2 Setting up your IEEE environment
+=====================================
+
+The IEEE standard defines several "modes" for controlling the behavior
+of floating point operations. These modes specify the important
+properties of computer arithmetic: the direction used for rounding (e.g.
+whether numbers should be rounded up, down or to the nearest number),
+the rounding precision and how the program should handle arithmetic
+exceptions, such as division by zero.
+
+ Many of these features can now be controlled via standard functions
+such as `fpsetround', which should be used whenever they are available.
+Unfortunately in the past there has been no universal API for
+controlling their behavior--each system has had its own low-level way
+of accessing them. To help you write portable programs GSL allows you
+to specify modes in a platform-independent way using the environment
+variable `GSL_IEEE_MODE'. The library then takes care of all the
+necessary machine-specific initializations for you when you call the
+function `gsl_ieee_env_setup'.
+
+ -- Function: void gsl_ieee_env_setup ()
+ This function reads the environment variable `GSL_IEEE_MODE' and
+ attempts to set up the corresponding specified IEEE modes. The
+ environment variable should be a list of keywords, separated by
+ commas, like this,
+
+ `GSL_IEEE_MODE' = "KEYWORD,KEYWORD,..."
+
+ where KEYWORD is one of the following mode-names,
+
+ `single-precision'
+
+ `double-precision'
+
+ `extended-precision'
+
+ `round-to-nearest'
+
+ `round-down'
+
+ `round-up'
+
+ `round-to-zero'
+
+ `mask-all'
+
+ `mask-invalid'
+
+ `mask-denormalized'
+
+ `mask-division-by-zero'
+
+ `mask-overflow'
+
+ `mask-underflow'
+
+ `trap-inexact'
+
+ `trap-common'
+
+ If `GSL_IEEE_MODE' is empty or undefined then the function returns
+ immediately and no attempt is made to change the system's IEEE
+ mode. When the modes from `GSL_IEEE_MODE' are turned on the
+ function prints a short message showing the new settings to remind
+ you that the results of the program will be affected.
+
+ If the requested modes are not supported by the platform being
+ used then the function calls the error handler and returns an
+ error code of `GSL_EUNSUP'.
+
+ When options are specified using this method, the resulting mode is
+ based on a default setting of the highest available precision
+ (double precision or extended precision, depending on the
+ platform) in round-to-nearest mode, with all exceptions enabled
+ apart from the INEXACT exception. The INEXACT exception is
+ generated whenever rounding occurs, so it must generally be
+ disabled in typical scientific calculations. All other
+ floating-point exceptions are enabled by default, including
+ underflows and the use of denormalized numbers, for safety. They
+ can be disabled with the individual `mask-' settings or together
+ using `mask-all'.
+
+ The following adjusted combination of modes is convenient for many
+ purposes,
+
+ GSL_IEEE_MODE="double-precision,"\
+ "mask-underflow,"\
+ "mask-denormalized"
+
+ This choice ignores any errors relating to small numbers (either
+ denormalized, or underflowing to zero) but traps overflows,
+ division by zero and invalid operations.
+
+To demonstrate the effects of different rounding modes consider the
+following program which computes e, the base of natural logarithms, by
+summing a rapidly-decreasing series,
+
+ e = 1 + 1/2! + 1/3! + 1/4! + ...
+ = 2.71828182846...
+
+ #include <stdio.h>
+ #include <gsl/gsl_math.h>
+ #include <gsl/gsl_ieee_utils.h>
+
+ int
+ main (void)
+ {
+ double x = 1, oldsum = 0, sum = 0;
+ int i = 0;
+
+ gsl_ieee_env_setup (); /* read GSL_IEEE_MODE */
+
+ do
+ {
+ i++;
+
+ oldsum = sum;
+ sum += x;
+ x = x / i;
+
+ printf ("i=%2d sum=%.18f error=%g\n",
+ i, sum, sum - M_E);
+
+ if (i > 30)
+ break;
+ }
+ while (sum != oldsum);
+
+ return 0;
+ }
+
+Here are the results of running the program in `round-to-nearest' mode.
+This is the IEEE default so it isn't really necessary to specify it
+here,
+
+ $ GSL_IEEE_MODE="round-to-nearest" ./a.out
+ i= 1 sum=1.000000000000000000 error=-1.71828
+ i= 2 sum=2.000000000000000000 error=-0.718282
+ ....
+ i=18 sum=2.718281828459045535 error=4.44089e-16
+ i=19 sum=2.718281828459045535 error=4.44089e-16
+
+After nineteen terms the sum converges to within 4 \times 10^-16 of the
+correct value. If we now change the rounding mode to `round-down' the
+final result is less accurate,
+
+ $ GSL_IEEE_MODE="round-down" ./a.out
+ i= 1 sum=1.000000000000000000 error=-1.71828
+ ....
+ i=19 sum=2.718281828459041094 error=-3.9968e-15
+
+The result is about 4 \times 10^-15 below the correct value, an order
+of magnitude worse than the result obtained in the `round-to-nearest'
+mode.
+
+ If we change to rounding mode to `round-up' then the series no
+longer converges (the reason is that when we add each term to the sum
+the final result is always rounded up. This is guaranteed to increase
+the sum by at least one tick on each iteration). To avoid this problem
+we would need to use a safer converge criterion, such as `while
+(fabs(sum - oldsum) > epsilon)', with a suitably chosen value of
+epsilon.
+
+ Finally we can see the effect of computing the sum using
+single-precision rounding, in the default `round-to-nearest' mode. In
+this case the program thinks it is still using double precision numbers
+but the CPU rounds the result of each floating point operation to
+single-precision accuracy. This simulates the effect of writing the
+program using single-precision `float' variables instead of `double'
+variables. The iteration stops after about half the number of
+iterations and the final result is much less accurate,
+
+ $ GSL_IEEE_MODE="single-precision" ./a.out
+ ....
+ i=12 sum=2.718281984329223633 error=1.5587e-07
+
+with an error of O(10^-7), which corresponds to single precision
+accuracy (about 1 part in 10^7). Continuing the iterations further
+does not decrease the error because all the subsequent results are
+rounded to the same value.
+
+
+File: gsl-ref.info, Node: IEEE References and Further Reading, Prev: Setting up your IEEE environment, Up: IEEE floating-point arithmetic
+
+40.3 References and Further Reading
+===================================
+
+The reference for the IEEE standard is,
+
+ ANSI/IEEE Std 754-1985, IEEE Standard for Binary Floating-Point
+ Arithmetic.
+
+A more pedagogical introduction to the standard can be found in the
+following paper,
+
+ David Goldberg: What Every Computer Scientist Should Know About
+ Floating-Point Arithmetic. `ACM Computing Surveys', Vol. 23, No. 1
+ (March 1991), pages 5-48.
+
+ Corrigendum: `ACM Computing Surveys', Vol. 23, No. 3 (September
+ 1991), page 413. and see also the sections by B. A. Wichmann and
+ Charles B. Dunham in Surveyor's Forum: "What Every Computer
+ Scientist Should Know About Floating-Point Arithmetic". `ACM
+ Computing Surveys', Vol. 24, No. 3 (September 1992), page 319.
+
+A detailed textbook on IEEE arithmetic and its practical use is
+available from SIAM Press,
+
+ Michael L. Overton, `Numerical Computing with IEEE Floating Point
+ Arithmetic', SIAM Press, ISBN 0898715717.
+
+
+
+File: gsl-ref.info, Node: Debugging Numerical Programs, Next: Contributors to GSL, Prev: IEEE floating-point arithmetic, Up: Top
+
+Appendix A Debugging Numerical Programs
+***************************************
+
+This chapter describes some tips and tricks for debugging numerical
+programs which use GSL.
+
+* Menu:
+
+* Using gdb::
+* Examining floating point registers::
+* Handling floating point exceptions::
+* GCC warning options for numerical programs::
+* Debugging References::
+
+
+File: gsl-ref.info, Node: Using gdb, Next: Examining floating point registers, Up: Debugging Numerical Programs
+
+A.1 Using gdb
+=============
+
+Any errors reported by the library are passed to the function
+`gsl_error'. By running your programs under gdb and setting a
+breakpoint in this function you can automatically catch any library
+errors. You can add a breakpoint for every session by putting
+
+ break gsl_error
+
+into your `.gdbinit' file in the directory where your program is
+started.
+
+ If the breakpoint catches an error then you can use a backtrace
+(`bt') to see the call-tree, and the arguments which possibly caused
+the error. By moving up into the calling function you can investigate
+the values of variables at that point. Here is an example from the
+program `fft/test_trap', which contains the following line,
+
+ status = gsl_fft_complex_wavetable_alloc (0, &complex_wavetable);
+
+The function `gsl_fft_complex_wavetable_alloc' takes the length of an
+FFT as its first argument. When this line is executed an error will be
+generated because the length of an FFT is not allowed to be zero.
+
+ To debug this problem we start `gdb', using the file `.gdbinit' to
+define a breakpoint in `gsl_error',
+
+ $ gdb test_trap
+
+ GDB is free software and you are welcome to distribute copies
+ of it under certain conditions; type "show copying" to see
+ the conditions. There is absolutely no warranty for GDB;
+ type "show warranty" for details. GDB 4.16 (i586-debian-linux),
+ Copyright 1996 Free Software Foundation, Inc.
+
+ Breakpoint 1 at 0x8050b1e: file error.c, line 14.
+
+When we run the program this breakpoint catches the error and shows the
+reason for it.
+
+ (gdb) run
+ Starting program: test_trap
+
+ Breakpoint 1, gsl_error (reason=0x8052b0d
+ "length n must be positive integer",
+ file=0x8052b04 "c_init.c", line=108, gsl_errno=1)
+ at error.c:14
+ 14 if (gsl_error_handler)
+
+The first argument of `gsl_error' is always a string describing the
+error. Now we can look at the backtrace to see what caused the problem,
+
+ (gdb) bt
+ #0 gsl_error (reason=0x8052b0d
+ "length n must be positive integer",
+ file=0x8052b04 "c_init.c", line=108, gsl_errno=1)
+ at error.c:14
+ #1 0x8049376 in gsl_fft_complex_wavetable_alloc (n=0,
+ wavetable=0xbffff778) at c_init.c:108
+ #2 0x8048a00 in main (argc=1, argv=0xbffff9bc)
+ at test_trap.c:94
+ #3 0x80488be in ___crt_dummy__ ()
+
+We can see that the error was generated in the function
+`gsl_fft_complex_wavetable_alloc' when it was called with an argument
+of N=0. The original call came from line 94 in the file `test_trap.c'.
+
+ By moving up to the level of the original call we can find the line
+that caused the error,
+
+ (gdb) up
+ #1 0x8049376 in gsl_fft_complex_wavetable_alloc (n=0,
+ wavetable=0xbffff778) at c_init.c:108
+ 108 GSL_ERROR ("length n must be positive integer", GSL_EDOM);
+ (gdb) up
+ #2 0x8048a00 in main (argc=1, argv=0xbffff9bc)
+ at test_trap.c:94
+ 94 status = gsl_fft_complex_wavetable_alloc (0,
+ &complex_wavetable);
+
+Thus we have found the line that caused the problem. From this point we
+could also print out the values of other variables such as
+`complex_wavetable'.
+
+
+File: gsl-ref.info, Node: Examining floating point registers, Next: Handling floating point exceptions, Prev: Using gdb, Up: Debugging Numerical Programs
+
+A.2 Examining floating point registers
+======================================
+
+The contents of floating point registers can be examined using the
+command `info float' (on supported platforms).
+
+ (gdb) info float
+ st0: 0xc4018b895aa17a945000 Valid Normal -7.838871e+308
+ st1: 0x3ff9ea3f50e4d7275000 Valid Normal 0.0285946
+ st2: 0x3fe790c64ce27dad4800 Valid Normal 6.7415931e-08
+ st3: 0x3ffaa3ef0df6607d7800 Spec Normal 0.0400229
+ st4: 0x3c028000000000000000 Valid Normal 4.4501477e-308
+ st5: 0x3ffef5412c22219d9000 Zero Normal 0.9580257
+ st6: 0x3fff8000000000000000 Valid Normal 1
+ st7: 0xc4028b65a1f6d243c800 Valid Normal -1.566206e+309
+ fctrl: 0x0272 53 bit; NEAR; mask DENOR UNDER LOS;
+ fstat: 0xb9ba flags 0001; top 7; excep DENOR OVERF UNDER LOS
+ ftag: 0x3fff
+ fip: 0x08048b5c
+ fcs: 0x051a0023
+ fopoff: 0x08086820
+ fopsel: 0x002b
+
+Individual registers can be examined using the variables $REG, where
+REG is the register name.
+
+ (gdb) p $st1
+ $1 = 0.02859464454261210347719
+
+
+File: gsl-ref.info, Node: Handling floating point exceptions, Next: GCC warning options for numerical programs, Prev: Examining floating point registers, Up: Debugging Numerical Programs
+
+A.3 Handling floating point exceptions
+======================================
+
+It is possible to stop the program whenever a `SIGFPE' floating point
+exception occurs. This can be useful for finding the cause of an
+unexpected infinity or `NaN'. The current handler settings can be
+shown with the command `info signal SIGFPE'.
+
+ (gdb) info signal SIGFPE
+ Signal Stop Print Pass to program Description
+ SIGFPE Yes Yes Yes Arithmetic exception
+
+Unless the program uses a signal handler the default setting should be
+changed so that SIGFPE is not passed to the program, as this would cause
+it to exit. The command `handle SIGFPE stop nopass' prevents this.
+
+ (gdb) handle SIGFPE stop nopass
+ Signal Stop Print Pass to program Description
+ SIGFPE Yes Yes No Arithmetic exception
+
+Depending on the platform it may be necessary to instruct the kernel to
+generate signals for floating point exceptions. For programs using GSL
+this can be achieved using the `GSL_IEEE_MODE' environment variable in
+conjunction with the function `gsl_ieee_env_setup' as described in
+*note IEEE floating-point arithmetic::.
+
+ (gdb) set env GSL_IEEE_MODE=double-precision
+
+
+File: gsl-ref.info, Node: GCC warning options for numerical programs, Next: Debugging References, Prev: Handling floating point exceptions, Up: Debugging Numerical Programs
+
+A.4 GCC warning options for numerical programs
+==============================================
+
+Writing reliable numerical programs in C requires great care. The
+following GCC warning options are recommended when compiling numerical
+programs:
+
+ gcc -ansi -pedantic -Werror -Wall -W
+ -Wmissing-prototypes -Wstrict-prototypes
+ -Wtraditional -Wconversion -Wshadow
+ -Wpointer-arith -Wcast-qual -Wcast-align
+ -Wwrite-strings -Wnested-externs
+ -fshort-enums -fno-common -Dinline= -g -O2
+
+For details of each option consult the manual `Using and Porting GCC'.
+The following table gives a brief explanation of what types of errors
+these options catch.
+
+`-ansi -pedantic'
+ Use ANSI C, and reject any non-ANSI extensions. These flags help
+ in writing portable programs that will compile on other systems.
+
+`-Werror'
+ Consider warnings to be errors, so that compilation stops. This
+ prevents warnings from scrolling off the top of the screen and
+ being lost. You won't be able to compile the program until it is
+ completely warning-free.
+
+`-Wall'
+ This turns on a set of warnings for common programming problems.
+ You need `-Wall', but it is not enough on its own.
+
+`-O2'
+ Turn on optimization. The warnings for uninitialized variables in
+ `-Wall' rely on the optimizer to analyze the code. If there is no
+ optimization then these warnings aren't generated.
+
+`-W'
+ This turns on some extra warnings not included in `-Wall', such as
+ missing return values and comparisons between signed and unsigned
+ integers.
+
+`-Wmissing-prototypes -Wstrict-prototypes'
+ Warn if there are any missing or inconsistent prototypes. Without
+ prototypes it is harder to detect problems with incorrect
+ arguments.
+
+`-Wtraditional'
+ This warns about certain constructs that behave differently in
+ traditional and ANSI C. Whether the traditional or ANSI
+ interpretation is used might be unpredictable on other compilers.
+
+`-Wconversion'
+ The main use of this option is to warn about conversions from
+ signed to unsigned integers. For example, `unsigned int x = -1'.
+ If you need to perform such a conversion you can use an explicit
+ cast.
+
+`-Wshadow'
+ This warns whenever a local variable shadows another local
+ variable. If two variables have the same name then it is a
+ potential source of confusion.
+
+`-Wpointer-arith -Wcast-qual -Wcast-align'
+ These options warn if you try to do pointer arithmetic for types
+ which don't have a size, such as `void', if you remove a `const'
+ cast from a pointer, or if you cast a pointer to a type which has a
+ different size, causing an invalid alignment.
+
+`-Wwrite-strings'
+ This option gives string constants a `const' qualifier so that it
+ will be a compile-time error to attempt to overwrite them.
+
+`-fshort-enums'
+ This option makes the type of `enum' as short as possible.
+ Normally this makes an `enum' different from an `int'.
+ Consequently any attempts to assign a pointer-to-int to a
+ pointer-to-enum will generate a cast-alignment warning.
+
+`-fno-common'
+ This option prevents global variables being simultaneously defined
+ in different object files (you get an error at link time). Such a
+ variable should be defined in one file and referred to in other
+ files with an `extern' declaration.
+
+`-Wnested-externs'
+ This warns if an `extern' declaration is encountered within a
+ function.
+
+`-Dinline='
+ The `inline' keyword is not part of ANSI C. Thus if you want to use
+ `-ansi' with a program which uses inline functions you can use this
+ preprocessor definition to remove the `inline' keywords.
+
+`-g'
+ It always makes sense to put debugging symbols in the executable
+ so that you can debug it using `gdb'. The only effect of
+ debugging symbols is to increase the size of the file, and you can
+ use the `strip' command to remove them later if necessary.
+
+
+File: gsl-ref.info, Node: Debugging References, Prev: GCC warning options for numerical programs, Up: Debugging Numerical Programs
+
+A.5 References and Further Reading
+==================================
+
+The following books are essential reading for anyone writing and
+debugging numerical programs with GCC and GDB.
+
+ R.M. Stallman, `Using and Porting GNU CC', Free Software
+ Foundation, ISBN 1882114388
+
+ R.M. Stallman, R.H. Pesch, `Debugging with GDB: The GNU
+ Source-Level Debugger', Free Software Foundation, ISBN 1882114779
+
+For a tutorial introduction to the GNU C Compiler and related programs,
+see
+
+ B.J. Gough, `An Introduction to GCC', Network Theory Ltd, ISBN
+ 0954161793
+
+
+File: gsl-ref.info, Node: Contributors to GSL, Next: Autoconf Macros, Prev: Debugging Numerical Programs, Up: Top
+
+Appendix B Contributors to GSL
+******************************
+
+(See the AUTHORS file in the distribution for up-to-date information.)
+
+*Mark Galassi*
+ Conceived GSL (with James Theiler) and wrote the design document.
+ Wrote the simulated annealing package and the relevant chapter in
+ the manual.
+
+*James Theiler*
+ Conceived GSL (with Mark Galassi). Wrote the random number
+ generators and the relevant chapter in this manual.
+
+*Jim Davies*
+ Wrote the statistical routines and the relevant chapter in this
+ manual.
+
+*Brian Gough*
+ FFTs, numerical integration, random number generators and
+ distributions, root finding, minimization and fitting, polynomial
+ solvers, complex numbers, physical constants, permutations, vector
+ and matrix functions, histograms, statistics, ieee-utils, revised
+ CBLAS Level 2 & 3, matrix decompositions, eigensystems, cumulative
+ distribution functions, testing, documentation and releases.
+
+*Reid Priedhorsky*
+ Wrote and documented the initial version of the root finding
+ routines while at Los Alamos National Laboratory, Mathematical
+ Modeling and Analysis Group.
+
+*Gerard Jungman*
+ Special Functions, Series acceleration, ODEs, BLAS, Linear Algebra,
+ Eigensystems, Hankel Transforms.
+
+*Mike Booth*
+ Wrote the Monte Carlo library.
+
+*Jorma Olavi Ta"htinen*
+ Wrote the initial complex arithmetic functions.
+
+*Thomas Walter*
+ Wrote the initial heapsort routines and cholesky decomposition.
+
+*Fabrice Rossi*
+ Multidimensional minimization.
+
+*Carlo Perassi*
+ Implementation of the random number generators in Knuth's
+ `Seminumerical Algorithms', 3rd Ed.
+
+*Szymon Jaroszewicz*
+ Wrote the routines for generating combinations.
+
+*Nicolas Darnis*
+ Wrote the initial routines for canonical permutations.
+
+*Jason H. Stover*
+ Wrote the major cumulative distribution functions.
+
+*Ivo Alxneit*
+ Wrote the routines for wavelet transforms.
+
+*Tuomo Keskitalo*
+ Improved the implementation of the ODE solvers.
+
+*Lowell Johnson*
+ Implementation of the Mathieu functions.
+
+*Patrick Alken*
+ Implementation of non-symmetric eigensystems and B-splines.
+
+
+ Thanks to Nigel Lowry for help in proofreading the manual.
+
+ The non-symmetric eigensystems routines contain code based on the
+LAPACK linear algebra library. LAPACK is distributed under the
+following license:
+
+
+ Copyright (c) 1992-2006 The University of Tennessee. All rights
+ reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer listed
+ in this license in the documentation and/or other materials
+ provided with the distribution.
+
+ * Neither the name of the copyright holders nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+File: gsl-ref.info, Node: Autoconf Macros, Next: GSL CBLAS Library, Prev: Contributors to GSL, Up: Top
+
+Appendix C Autoconf Macros
+**************************
+
+For applications using `autoconf' the standard macro `AC_CHECK_LIB' can
+be used to link with GSL automatically from a `configure' script. The
+library itself depends on the presence of a CBLAS and math library as
+well, so these must also be located before linking with the main
+`libgsl' file. The following commands should be placed in the
+`configure.ac' file to perform these tests,
+
+ AC_CHECK_LIB(m,main)
+ AC_CHECK_LIB(gslcblas,main)
+ AC_CHECK_LIB(gsl,main)
+
+It is important to check for `libm' and `libgslcblas' before `libgsl',
+otherwise the tests will fail. Assuming the libraries are found the
+output during the configure stage looks like this,
+
+ checking for main in -lm... yes
+ checking for main in -lgslcblas... yes
+ checking for main in -lgsl... yes
+
+If the library is found then the tests will define the macros
+`HAVE_LIBGSL', `HAVE_LIBGSLCBLAS', `HAVE_LIBM' and add the options
+`-lgsl -lgslcblas -lm' to the variable `LIBS'.
+
+ The tests above will find any version of the library. They are
+suitable for general use, where the versions of the functions are not
+important. An alternative macro is available in the file `gsl.m4' to
+test for a specific version of the library. To use this macro simply
+add the following line to your `configure.in' file instead of the tests
+above:
+
+ AM_PATH_GSL(GSL_VERSION,
+ [action-if-found],
+ [action-if-not-found])
+
+The argument `GSL_VERSION' should be the two or three digit MAJOR.MINOR
+or MAJOR.MINOR.MICRO version number of the release you require. A
+suitable choice for `action-if-not-found' is,
+
+ AC_MSG_ERROR(could not find required version of GSL)
+
+Then you can add the variables `GSL_LIBS' and `GSL_CFLAGS' to your
+Makefile.am files to obtain the correct compiler flags. `GSL_LIBS' is
+equal to the output of the `gsl-config --libs' command and `GSL_CFLAGS'
+is equal to `gsl-config --cflags' command. For example,
+
+ libfoo_la_LDFLAGS = -lfoo $(GSL_LIBS) -lgslcblas
+
+Note that the macro `AM_PATH_GSL' needs to use the C compiler so it
+should appear in the `configure.in' file before the macro
+`AC_LANG_CPLUSPLUS' for programs that use C++.
+
+ To test for `inline' the following test should be placed in your
+`configure.in' file,
+
+ AC_C_INLINE
+
+ if test "$ac_cv_c_inline" != no ; then
+ AC_DEFINE(HAVE_INLINE,1)
+ AC_SUBST(HAVE_INLINE)
+ fi
+
+and the macro will then be defined in the compilation flags or by
+including the file `config.h' before any library headers.
+
+ The following autoconf test will check for `extern inline',
+
+ dnl Check for "extern inline", using a modified version
+ dnl of the test for AC_C_INLINE from acspecific.mt
+ dnl
+ AC_CACHE_CHECK([for extern inline], ac_cv_c_extern_inline,
+ [ac_cv_c_extern_inline=no
+ AC_TRY_COMPILE([extern $ac_cv_c_inline double foo(double x);
+ extern $ac_cv_c_inline double foo(double x) { return x+1.0; };
+ double foo (double x) { return x + 1.0; };],
+ [ foo(1.0) ],
+ [ac_cv_c_extern_inline="yes"])
+ ])
+
+ if test "$ac_cv_c_extern_inline" != no ; then
+ AC_DEFINE(HAVE_INLINE,1)
+ AC_SUBST(HAVE_INLINE)
+ fi
+
+ The substitution of portability functions can be made automatically
+if you use `autoconf'. For example, to test whether the BSD function
+`hypot' is available you can include the following line in the
+configure file `configure.in' for your application,
+
+ AC_CHECK_FUNCS(hypot)
+
+and place the following macro definitions in the file `config.h.in',
+
+ /* Substitute gsl_hypot for missing system hypot */
+
+ #ifndef HAVE_HYPOT
+ #define hypot gsl_hypot
+ #endif
+
+The application source files can then use the include command `#include
+<config.h>' to substitute `gsl_hypot' for each occurrence of `hypot'
+when `hypot' is not available.
+
+
+File: gsl-ref.info, Node: GSL CBLAS Library, Next: Free Software Needs Free Documentation, Prev: Autoconf Macros, Up: Top
+
+Appendix D GSL CBLAS Library
+****************************
+
+The prototypes for the low-level CBLAS functions are declared in the
+file `gsl_cblas.h'. For the definition of the functions consult the
+documentation available from Netlib (*note BLAS References and Further
+Reading::).
+
+* Menu:
+
+* Level 1 CBLAS Functions::
+* Level 2 CBLAS Functions::
+* Level 3 CBLAS Functions::
+* GSL CBLAS Examples::
+
+
+File: gsl-ref.info, Node: Level 1 CBLAS Functions, Next: Level 2 CBLAS Functions, Up: GSL CBLAS Library
+
+D.1 Level 1
+===========
+
+ -- Function: float cblas_sdsdot (const int N, const float ALPHA, const
+ float * X, const int INCX, const float * Y, const int INCY)
+
+ -- Function: double cblas_dsdot (const int N, const float * X, const
+ int INCX, const float * Y, const int INCY)
+
+ -- Function: float cblas_sdot (const int N, const float * X, const int
+ INCX, const float * Y, const int INCY)
+
+ -- Function: double cblas_ddot (const int N, const double * X, const
+ int INCX, const double * Y, const int INCY)
+
+ -- Function: void cblas_cdotu_sub (const int N, const void * X, const
+ int INCX, const void * Y, const int INCY, void * DOTU)
+
+ -- Function: void cblas_cdotc_sub (const int N, const void * X, const
+ int INCX, const void * Y, const int INCY, void * DOTC)
+
+ -- Function: void cblas_zdotu_sub (const int N, const void * X, const
+ int INCX, const void * Y, const int INCY, void * DOTU)
+
+ -- Function: void cblas_zdotc_sub (const int N, const void * X, const
+ int INCX, const void * Y, const int INCY, void * DOTC)
+
+ -- Function: float cblas_snrm2 (const int N, const float * X, const
+ int INCX)
+
+ -- Function: float cblas_sasum (const int N, const float * X, const
+ int INCX)
+
+ -- Function: double cblas_dnrm2 (const int N, const double * X, const
+ int INCX)
+
+ -- Function: double cblas_dasum (const int N, const double * X, const
+ int INCX)
+
+ -- Function: float cblas_scnrm2 (const int N, const void * X, const
+ int INCX)
+
+ -- Function: float cblas_scasum (const int N, const void * X, const
+ int INCX)
+
+ -- Function: double cblas_dznrm2 (const int N, const void * X, const
+ int INCX)
+
+ -- Function: double cblas_dzasum (const int N, const void * X, const
+ int INCX)
+
+ -- Function: CBLAS_INDEX cblas_isamax (const int N, const float * X,
+ const int INCX)
+
+ -- Function: CBLAS_INDEX cblas_idamax (const int N, const double * X,
+ const int INCX)
+
+ -- Function: CBLAS_INDEX cblas_icamax (const int N, const void * X,
+ const int INCX)
+
+ -- Function: CBLAS_INDEX cblas_izamax (const int N, const void * X,
+ const int INCX)
+
+ -- Function: void cblas_sswap (const int N, float * X, const int INCX,
+ float * Y, const int INCY)
+
+ -- Function: void cblas_scopy (const int N, const float * X, const int
+ INCX, float * Y, const int INCY)
+
+ -- Function: void cblas_saxpy (const int N, const float ALPHA, const
+ float * X, const int INCX, float * Y, const int INCY)
+
+ -- Function: void cblas_dswap (const int N, double * X, const int
+ INCX, double * Y, const int INCY)
+
+ -- Function: void cblas_dcopy (const int N, const double * X, const
+ int INCX, double * Y, const int INCY)
+
+ -- Function: void cblas_daxpy (const int N, const double ALPHA, const
+ double * X, const int INCX, double * Y, const int INCY)
+
+ -- Function: void cblas_cswap (const int N, void * X, const int INCX,
+ void * Y, const int INCY)
+
+ -- Function: void cblas_ccopy (const int N, const void * X, const int
+ INCX, void * Y, const int INCY)
+
+ -- Function: void cblas_caxpy (const int N, const void * ALPHA, const
+ void * X, const int INCX, void * Y, const int INCY)
+
+ -- Function: void cblas_zswap (const int N, void * X, const int INCX,
+ void * Y, const int INCY)
+
+ -- Function: void cblas_zcopy (const int N, const void * X, const int
+ INCX, void * Y, const int INCY)
+
+ -- Function: void cblas_zaxpy (const int N, const void * ALPHA, const
+ void * X, const int INCX, void * Y, const int INCY)
+
+ -- Function: void cblas_srotg (float * A, float * B, float * C, float
+ * S)
+
+ -- Function: void cblas_srotmg (float * D1, float * D2, float * B1,
+ const float B2, float * P)
+
+ -- Function: void cblas_srot (const int N, float * X, const int INCX,
+ float * Y, const int INCY, const float C, const float S)
+
+ -- Function: void cblas_srotm (const int N, float * X, const int INCX,
+ float * Y, const int INCY, const float * P)
+
+ -- Function: void cblas_drotg (double * A, double * B, double * C,
+ double * S)
+
+ -- Function: void cblas_drotmg (double * D1, double * D2, double * B1,
+ const double B2, double * P)
+
+ -- Function: void cblas_drot (const int N, double * X, const int INCX,
+ double * Y, const int INCY, const double C, const double S)
+
+ -- Function: void cblas_drotm (const int N, double * X, const int
+ INCX, double * Y, const int INCY, const double * P)
+
+ -- Function: void cblas_sscal (const int N, const float ALPHA, float *
+ X, const int INCX)
+
+ -- Function: void cblas_dscal (const int N, const double ALPHA, double
+ * X, const int INCX)
+
+ -- Function: void cblas_cscal (const int N, const void * ALPHA, void *
+ X, const int INCX)
+
+ -- Function: void cblas_zscal (const int N, const void * ALPHA, void *
+ X, const int INCX)
+
+ -- Function: void cblas_csscal (const int N, const float ALPHA, void *
+ X, const int INCX)
+
+ -- Function: void cblas_zdscal (const int N, const double ALPHA, void
+ * X, const int INCX)
+
+
+File: gsl-ref.info, Node: Level 2 CBLAS Functions, Next: Level 3 CBLAS Functions, Prev: Level 1 CBLAS Functions, Up: GSL CBLAS Library
+
+D.2 Level 2
+===========
+
+ -- Function: void cblas_sgemv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_TRANSPOSE TRANSA, const int M, const int N, const
+ float ALPHA, const float * A, const int LDA, const float * X,
+ const int INCX, const float BETA, float * Y, const int INCY)
+
+ -- Function: void cblas_sgbmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_TRANSPOSE TRANSA, const int M, const int N, const
+ int KL, const int KU, const float ALPHA, const float * A,
+ const int LDA, const float * X, const int INCX, const float
+ BETA, float * Y, const int INCY)
+
+ -- Function: void cblas_strmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const float * A,
+ const int LDA, float * X, const int INCX)
+
+ -- Function: void cblas_stbmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const int K, const
+ float * A, const int LDA, float * X, const int INCX)
+
+ -- Function: void cblas_stpmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const float * AP,
+ float * X, const int INCX)
+
+ -- Function: void cblas_strsv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const float * A,
+ const int LDA, float * X, const int INCX)
+
+ -- Function: void cblas_stbsv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const int K, const
+ float * A, const int LDA, float * X, const int INCX)
+
+ -- Function: void cblas_stpsv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const float * AP,
+ float * X, const int INCX)
+
+ -- Function: void cblas_dgemv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_TRANSPOSE TRANSA, const int M, const int N, const
+ double ALPHA, const double * A, const int LDA, const double *
+ X, const int INCX, const double BETA, double * Y, const int
+ INCY)
+
+ -- Function: void cblas_dgbmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_TRANSPOSE TRANSA, const int M, const int N, const
+ int KL, const int KU, const double ALPHA, const double * A,
+ const int LDA, const double * X, const int INCX, const double
+ BETA, double * Y, const int INCY)
+
+ -- Function: void cblas_dtrmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const double * A,
+ const int LDA, double * X, const int INCX)
+
+ -- Function: void cblas_dtbmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const int K, const
+ double * A, const int LDA, double * X, const int INCX)
+
+ -- Function: void cblas_dtpmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const double * AP,
+ double * X, const int INCX)
+
+ -- Function: void cblas_dtrsv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const double * A,
+ const int LDA, double * X, const int INCX)
+
+ -- Function: void cblas_dtbsv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const int K, const
+ double * A, const int LDA, double * X, const int INCX)
+
+ -- Function: void cblas_dtpsv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const double * AP,
+ double * X, const int INCX)
+
+ -- Function: void cblas_cgemv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_TRANSPOSE TRANSA, const int M, const int N, const
+ void * ALPHA, const void * A, const int LDA, const void * X,
+ const int INCX, const void * BETA, void * Y, const int INCY)
+
+ -- Function: void cblas_cgbmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_TRANSPOSE TRANSA, const int M, const int N, const
+ int KL, const int KU, const void * ALPHA, const void * A,
+ const int LDA, const void * X, const int INCX, const void *
+ BETA, void * Y, const int INCY)
+
+ -- Function: void cblas_ctrmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const void * A,
+ const int LDA, void * X, const int INCX)
+
+ -- Function: void cblas_ctbmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const int K, const
+ void * A, const int LDA, void * X, const int INCX)
+
+ -- Function: void cblas_ctpmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const void * AP,
+ void * X, const int INCX)
+
+ -- Function: void cblas_ctrsv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const void * A,
+ const int LDA, void * X, const int INCX)
+
+ -- Function: void cblas_ctbsv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const int K, const
+ void * A, const int LDA, void * X, const int INCX)
+
+ -- Function: void cblas_ctpsv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const void * AP,
+ void * X, const int INCX)
+
+ -- Function: void cblas_zgemv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_TRANSPOSE TRANSA, const int M, const int N, const
+ void * ALPHA, const void * A, const int LDA, const void * X,
+ const int INCX, const void * BETA, void * Y, const int INCY)
+
+ -- Function: void cblas_zgbmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_TRANSPOSE TRANSA, const int M, const int N, const
+ int KL, const int KU, const void * ALPHA, const void * A,
+ const int LDA, const void * X, const int INCX, const void *
+ BETA, void * Y, const int INCY)
+
+ -- Function: void cblas_ztrmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const void * A,
+ const int LDA, void * X, const int INCX)
+
+ -- Function: void cblas_ztbmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const int K, const
+ void * A, const int LDA, void * X, const int INCX)
+
+ -- Function: void cblas_ztpmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const void * AP,
+ void * X, const int INCX)
+
+ -- Function: void cblas_ztrsv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const void * A,
+ const int LDA, void * X, const int INCX)
+
+ -- Function: void cblas_ztbsv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const int K, const
+ void * A, const int LDA, void * X, const int INCX)
+
+ -- Function: void cblas_ztpsv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANSA,
+ const enum CBLAS_DIAG DIAG, const int N, const void * AP,
+ void * X, const int INCX)
+
+ -- Function: void cblas_ssymv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const int N, const float ALPHA, const
+ float * A, const int LDA, const float * X, const int INCX,
+ const float BETA, float * Y, const int INCY)
+
+ -- Function: void cblas_ssbmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const int N, const int K, const float
+ ALPHA, const float * A, const int LDA, const float * X, const
+ int INCX, const float BETA, float * Y, const int INCY)
+
+ -- Function: void cblas_sspmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const int N, const float ALPHA, const
+ float * AP, const float * X, const int INCX, const float
+ BETA, float * Y, const int INCY)
+
+ -- Function: void cblas_sger (const enum CBLAS_ORDER ORDER, const int
+ M, const int N, const float ALPHA, const float * X, const int
+ INCX, const float * Y, const int INCY, float * A, const int
+ LDA)
+
+ -- Function: void cblas_ssyr (const enum CBLAS_ORDER ORDER, const enum
+ CBLAS_UPLO UPLO, const int N, const float ALPHA, const float
+ * X, const int INCX, float * A, const int LDA)
+
+ -- Function: void cblas_sspr (const enum CBLAS_ORDER ORDER, const enum
+ CBLAS_UPLO UPLO, const int N, const float ALPHA, const float
+ * X, const int INCX, float * AP)
+
+ -- Function: void cblas_ssyr2 (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const int N, const float ALPHA, const
+ float * X, const int INCX, const float * Y, const int INCY,
+ float * A, const int LDA)
+
+ -- Function: void cblas_sspr2 (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const int N, const float ALPHA, const
+ float * X, const int INCX, const float * Y, const int INCY,
+ float * A)
+
+ -- Function: void cblas_dsymv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const int N, const double ALPHA, const
+ double * A, const int LDA, const double * X, const int INCX,
+ const double BETA, double * Y, const int INCY)
+
+ -- Function: void cblas_dsbmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const int N, const int K, const double
+ ALPHA, const double * A, const int LDA, const double * X,
+ const int INCX, const double BETA, double * Y, const int INCY)
+
+ -- Function: void cblas_dspmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const int N, const double ALPHA, const
+ double * AP, const double * X, const int INCX, const double
+ BETA, double * Y, const int INCY)
+
+ -- Function: void cblas_dger (const enum CBLAS_ORDER ORDER, const int
+ M, const int N, const double ALPHA, const double * X, const
+ int INCX, const double * Y, const int INCY, double * A, const
+ int LDA)
+
+ -- Function: void cblas_dsyr (const enum CBLAS_ORDER ORDER, const enum
+ CBLAS_UPLO UPLO, const int N, const double ALPHA, const
+ double * X, const int INCX, double * A, const int LDA)
+
+ -- Function: void cblas_dspr (const enum CBLAS_ORDER ORDER, const enum
+ CBLAS_UPLO UPLO, const int N, const double ALPHA, const
+ double * X, const int INCX, double * AP)
+
+ -- Function: void cblas_dsyr2 (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const int N, const double ALPHA, const
+ double * X, const int INCX, const double * Y, const int INCY,
+ double * A, const int LDA)
+
+ -- Function: void cblas_dspr2 (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const int N, const double ALPHA, const
+ double * X, const int INCX, const double * Y, const int INCY,
+ double * A)
+
+ -- Function: void cblas_chemv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const int N, const void * ALPHA, const
+ void * A, const int LDA, const void * X, const int INCX,
+ const void * BETA, void * Y, const int INCY)
+
+ -- Function: void cblas_chbmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const int N, const int K, const void *
+ ALPHA, const void * A, const int LDA, const void * X, const
+ int INCX, const void * BETA, void * Y, const int INCY)
+
+ -- Function: void cblas_chpmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const int N, const void * ALPHA, const
+ void * AP, const void * X, const int INCX, const void * BETA,
+ void * Y, const int INCY)
+
+ -- Function: void cblas_cgeru (const enum CBLAS_ORDER ORDER, const int
+ M, const int N, const void * ALPHA, const void * X, const int
+ INCX, const void * Y, const int INCY, void * A, const int LDA)
+
+ -- Function: void cblas_cgerc (const enum CBLAS_ORDER ORDER, const int
+ M, const int N, const void * ALPHA, const void * X, const int
+ INCX, const void * Y, const int INCY, void * A, const int LDA)
+
+ -- Function: void cblas_cher (const enum CBLAS_ORDER ORDER, const enum
+ CBLAS_UPLO UPLO, const int N, const float ALPHA, const void *
+ X, const int INCX, void * A, const int LDA)
+
+ -- Function: void cblas_chpr (const enum CBLAS_ORDER ORDER, const enum
+ CBLAS_UPLO UPLO, const int N, const float ALPHA, const void *
+ X, const int INCX, void * A)
+
+ -- Function: void cblas_cher2 (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const int N, const void * ALPHA, const
+ void * X, const int INCX, const void * Y, const int INCY,
+ void * A, const int LDA)
+
+ -- Function: void cblas_chpr2 (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const int N, const void * ALPHA, const
+ void * X, const int INCX, const void * Y, const int INCY,
+ void * AP)
+
+ -- Function: void cblas_zhemv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const int N, const void * ALPHA, const
+ void * A, const int LDA, const void * X, const int INCX,
+ const void * BETA, void * Y, const int INCY)
+
+ -- Function: void cblas_zhbmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const int N, const int K, const void *
+ ALPHA, const void * A, const int LDA, const void * X, const
+ int INCX, const void * BETA, void * Y, const int INCY)
+
+ -- Function: void cblas_zhpmv (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const int N, const void * ALPHA, const
+ void * AP, const void * X, const int INCX, const void * BETA,
+ void * Y, const int INCY)
+
+ -- Function: void cblas_zgeru (const enum CBLAS_ORDER ORDER, const int
+ M, const int N, const void * ALPHA, const void * X, const int
+ INCX, const void * Y, const int INCY, void * A, const int LDA)
+
+ -- Function: void cblas_zgerc (const enum CBLAS_ORDER ORDER, const int
+ M, const int N, const void * ALPHA, const void * X, const int
+ INCX, const void * Y, const int INCY, void * A, const int LDA)
+
+ -- Function: void cblas_zher (const enum CBLAS_ORDER ORDER, const enum
+ CBLAS_UPLO UPLO, const int N, const double ALPHA, const void
+ * X, const int INCX, void * A, const int LDA)
+
+ -- Function: void cblas_zhpr (const enum CBLAS_ORDER ORDER, const enum
+ CBLAS_UPLO UPLO, const int N, const double ALPHA, const void
+ * X, const int INCX, void * A)
+
+ -- Function: void cblas_zher2 (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const int N, const void * ALPHA, const
+ void * X, const int INCX, const void * Y, const int INCY,
+ void * A, const int LDA)
+
+ -- Function: void cblas_zhpr2 (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const int N, const void * ALPHA, const
+ void * X, const int INCX, const void * Y, const int INCY,
+ void * AP)
+
+
+File: gsl-ref.info, Node: Level 3 CBLAS Functions, Next: GSL CBLAS Examples, Prev: Level 2 CBLAS Functions, Up: GSL CBLAS Library
+
+D.3 Level 3
+===========
+
+ -- Function: void cblas_sgemm (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_TRANSPOSE TRANSA, const enum CBLAS_TRANSPOSE
+ TRANSB, const int M, const int N, const int K, const float
+ ALPHA, const float * A, const int LDA, const float * B, const
+ int LDB, const float BETA, float * C, const int LDC)
+
+ -- Function: void cblas_ssymm (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_SIDE SIDE, const enum CBLAS_UPLO UPLO, const int
+ M, const int N, const float ALPHA, const float * A, const int
+ LDA, const float * B, const int LDB, const float BETA, float
+ * C, const int LDC)
+
+ -- Function: void cblas_ssyrk (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANS, const
+ int N, const int K, const float ALPHA, const float * A, const
+ int LDA, const float BETA, float * C, const int LDC)
+
+ -- Function: void cblas_ssyr2k (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANS, const
+ int N, const int K, const float ALPHA, const float * A, const
+ int LDA, const float * B, const int LDB, const float BETA,
+ float * C, const int LDC)
+
+ -- Function: void cblas_strmm (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_SIDE SIDE, const enum CBLAS_UPLO UPLO, const enum
+ CBLAS_TRANSPOSE TRANSA, const enum CBLAS_DIAG DIAG, const int
+ M, const int N, const float ALPHA, const float * A, const int
+ LDA, float * B, const int LDB)
+
+ -- Function: void cblas_strsm (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_SIDE SIDE, const enum CBLAS_UPLO UPLO, const enum
+ CBLAS_TRANSPOSE TRANSA, const enum CBLAS_DIAG DIAG, const int
+ M, const int N, const float ALPHA, const float * A, const int
+ LDA, float * B, const int LDB)
+
+ -- Function: void cblas_dgemm (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_TRANSPOSE TRANSA, const enum CBLAS_TRANSPOSE
+ TRANSB, const int M, const int N, const int K, const double
+ ALPHA, const double * A, const int LDA, const double * B,
+ const int LDB, const double BETA, double * C, const int LDC)
+
+ -- Function: void cblas_dsymm (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_SIDE SIDE, const enum CBLAS_UPLO UPLO, const int
+ M, const int N, const double ALPHA, const double * A, const
+ int LDA, const double * B, const int LDB, const double BETA,
+ double * C, const int LDC)
+
+ -- Function: void cblas_dsyrk (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANS, const
+ int N, const int K, const double ALPHA, const double * A,
+ const int LDA, const double BETA, double * C, const int LDC)
+
+ -- Function: void cblas_dsyr2k (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANS, const
+ int N, const int K, const double ALPHA, const double * A,
+ const int LDA, const double * B, const int LDB, const double
+ BETA, double * C, const int LDC)
+
+ -- Function: void cblas_dtrmm (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_SIDE SIDE, const enum CBLAS_UPLO UPLO, const enum
+ CBLAS_TRANSPOSE TRANSA, const enum CBLAS_DIAG DIAG, const int
+ M, const int N, const double ALPHA, const double * A, const
+ int LDA, double * B, const int LDB)
+
+ -- Function: void cblas_dtrsm (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_SIDE SIDE, const enum CBLAS_UPLO UPLO, const enum
+ CBLAS_TRANSPOSE TRANSA, const enum CBLAS_DIAG DIAG, const int
+ M, const int N, const double ALPHA, const double * A, const
+ int LDA, double * B, const int LDB)
+
+ -- Function: void cblas_cgemm (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_TRANSPOSE TRANSA, const enum CBLAS_TRANSPOSE
+ TRANSB, const int M, const int N, const int K, const void *
+ ALPHA, const void * A, const int LDA, const void * B, const
+ int LDB, const void * BETA, void * C, const int LDC)
+
+ -- Function: void cblas_csymm (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_SIDE SIDE, const enum CBLAS_UPLO UPLO, const int
+ M, const int N, const void * ALPHA, const void * A, const int
+ LDA, const void * B, const int LDB, const void * BETA, void *
+ C, const int LDC)
+
+ -- Function: void cblas_csyrk (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANS, const
+ int N, const int K, const void * ALPHA, const void * A, const
+ int LDA, const void * BETA, void * C, const int LDC)
+
+ -- Function: void cblas_csyr2k (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANS, const
+ int N, const int K, const void * ALPHA, const void * A, const
+ int LDA, const void * B, const int LDB, const void * BETA,
+ void * C, const int LDC)
+
+ -- Function: void cblas_ctrmm (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_SIDE SIDE, const enum CBLAS_UPLO UPLO, const enum
+ CBLAS_TRANSPOSE TRANSA, const enum CBLAS_DIAG DIAG, const int
+ M, const int N, const void * ALPHA, const void * A, const int
+ LDA, void * B, const int LDB)
+
+ -- Function: void cblas_ctrsm (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_SIDE SIDE, const enum CBLAS_UPLO UPLO, const enum
+ CBLAS_TRANSPOSE TRANSA, const enum CBLAS_DIAG DIAG, const int
+ M, const int N, const void * ALPHA, const void * A, const int
+ LDA, void * B, const int LDB)
+
+ -- Function: void cblas_zgemm (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_TRANSPOSE TRANSA, const enum CBLAS_TRANSPOSE
+ TRANSB, const int M, const int N, const int K, const void *
+ ALPHA, const void * A, const int LDA, const void * B, const
+ int LDB, const void * BETA, void * C, const int LDC)
+
+ -- Function: void cblas_zsymm (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_SIDE SIDE, const enum CBLAS_UPLO UPLO, const int
+ M, const int N, const void * ALPHA, const void * A, const int
+ LDA, const void * B, const int LDB, const void * BETA, void *
+ C, const int LDC)
+
+ -- Function: void cblas_zsyrk (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANS, const
+ int N, const int K, const void * ALPHA, const void * A, const
+ int LDA, const void * BETA, void * C, const int LDC)
+
+ -- Function: void cblas_zsyr2k (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANS, const
+ int N, const int K, const void * ALPHA, const void * A, const
+ int LDA, const void * B, const int LDB, const void * BETA,
+ void * C, const int LDC)
+
+ -- Function: void cblas_ztrmm (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_SIDE SIDE, const enum CBLAS_UPLO UPLO, const enum
+ CBLAS_TRANSPOSE TRANSA, const enum CBLAS_DIAG DIAG, const int
+ M, const int N, const void * ALPHA, const void * A, const int
+ LDA, void * B, const int LDB)
+
+ -- Function: void cblas_ztrsm (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_SIDE SIDE, const enum CBLAS_UPLO UPLO, const enum
+ CBLAS_TRANSPOSE TRANSA, const enum CBLAS_DIAG DIAG, const int
+ M, const int N, const void * ALPHA, const void * A, const int
+ LDA, void * B, const int LDB)
+
+ -- Function: void cblas_chemm (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_SIDE SIDE, const enum CBLAS_UPLO UPLO, const int
+ M, const int N, const void * ALPHA, const void * A, const int
+ LDA, const void * B, const int LDB, const void * BETA, void *
+ C, const int LDC)
+
+ -- Function: void cblas_cherk (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANS, const
+ int N, const int K, const float ALPHA, const void * A, const
+ int LDA, const float BETA, void * C, const int LDC)
+
+ -- Function: void cblas_cher2k (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANS, const
+ int N, const int K, const void * ALPHA, const void * A, const
+ int LDA, const void * B, const int LDB, const float BETA,
+ void * C, const int LDC)
+
+ -- Function: void cblas_zhemm (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_SIDE SIDE, const enum CBLAS_UPLO UPLO, const int
+ M, const int N, const void * ALPHA, const void * A, const int
+ LDA, const void * B, const int LDB, const void * BETA, void *
+ C, const int LDC)
+
+ -- Function: void cblas_zherk (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANS, const
+ int N, const int K, const double ALPHA, const void * A, const
+ int LDA, const double BETA, void * C, const int LDC)
+
+ -- Function: void cblas_zher2k (const enum CBLAS_ORDER ORDER, const
+ enum CBLAS_UPLO UPLO, const enum CBLAS_TRANSPOSE TRANS, const
+ int N, const int K, const void * ALPHA, const void * A, const
+ int LDA, const void * B, const int LDB, const double BETA,
+ void * C, const int LDC)
+
+ -- Function: void cblas_xerbla (int P, const char * ROUT, const char *
+ FORM, ...)
+
+
+File: gsl-ref.info, Node: GSL CBLAS Examples, Prev: Level 3 CBLAS Functions, Up: GSL CBLAS Library
+
+D.4 Examples
+============
+
+The following program computes the product of two matrices using the
+Level-3 BLAS function SGEMM,
+
+ [ 0.11 0.12 0.13 ] [ 1011 1012 ] [ 367.76 368.12 ]
+ [ 0.21 0.22 0.23 ] [ 1021 1022 ] = [ 674.06 674.72 ]
+ [ 1031 1032 ]
+
+The matrices are stored in row major order but could be stored in column
+major order if the first argument of the call to `cblas_sgemm' was
+changed to `CblasColMajor'.
+
+ #include <stdio.h>
+ #include <gsl/gsl_cblas.h>
+
+ int
+ main (void)
+ {
+ int lda = 3;
+
+ float A[] = { 0.11, 0.12, 0.13,
+ 0.21, 0.22, 0.23 };
+
+ int ldb = 2;
+
+ float B[] = { 1011, 1012,
+ 1021, 1022,
+ 1031, 1032 };
+
+ int ldc = 2;
+
+ float C[] = { 0.00, 0.00,
+ 0.00, 0.00 };
+
+ /* Compute C = A B */
+
+ cblas_sgemm (CblasRowMajor,
+ CblasNoTrans, CblasNoTrans, 2, 2, 3,
+ 1.0, A, lda, B, ldb, 0.0, C, ldc);
+
+ printf ("[ %g, %g\n", C[0], C[1]);
+ printf (" %g, %g ]\n", C[2], C[3]);
+
+ return 0;
+ }
+
+To compile the program use the following command line,
+
+ $ gcc -Wall demo.c -lgslcblas
+
+There is no need to link with the main library `-lgsl' in this case as
+the CBLAS library is an independent unit. Here is the output from the
+program,
+
+ $ ./a.out
+ [ 367.76, 368.12
+ 674.06, 674.72 ]
+
+
+File: gsl-ref.info, Node: Free Software Needs Free Documentation, Next: GNU General Public License, Prev: GSL CBLAS Library, Up: Top
+
+Free Software Needs Free Documentation
+**************************************
+
+ The following article was written by Richard Stallman, founder of
+ the GNU Project.
+
+ The biggest deficiency in the free software community today is not in
+the software--it is the lack of good free documentation that we can
+include with the free software. Many of our most important programs do
+not come with free reference manuals and free introductory texts.
+Documentation is an essential part of any software package; when an
+important free software package does not come with a free manual and a
+free tutorial, that is a major gap. We have many such gaps today.
+
+ Consider Perl, for instance. The tutorial manuals that people
+normally use are non-free. How did this come about? Because the
+authors of those manuals published them with restrictive terms--no
+copying, no modification, source files not available--which exclude
+them from the free software world.
+
+ That wasn't the first time this sort of thing happened, and it was
+far from the last. Many times we have heard a GNU user eagerly
+describe a manual that he is writing, his intended contribution to the
+community, only to learn that he had ruined everything by signing a
+publication contract to make it non-free.
+
+ Free documentation, like free software, is a matter of freedom, not
+price. The problem with the non-free manual is not that publishers
+charge a price for printed copies--that in itself is fine. (The Free
+Software Foundation sells printed copies of manuals, too.) The problem
+is the restrictions on the use of the manual. Free manuals are
+available in source code form, and give you permission to copy and
+modify. Non-free manuals do not allow this.
+
+ The criteria of freedom for a free manual are roughly the same as for
+free software. Redistribution (including the normal kinds of
+commercial redistribution) must be permitted, so that the manual can
+accompany every copy of the program, both on-line and on paper.
+
+ Permission for modification of the technical content is crucial too.
+When people modify the software, adding or changing features, if they
+are conscientious they will change the manual too--so they can provide
+accurate and clear documentation for the modified program. A manual
+that leaves you no choice but to write a new manual to document a
+changed version of the program is not really available to our community.
+
+ Some kinds of limits on the way modification is handled are
+acceptable. For example, requirements to preserve the original
+author's copyright notice, the distribution terms, or the list of
+authors, are ok. It is also no problem to require modified versions to
+include notice that they were modified. Even entire sections that may
+not be deleted or changed are acceptable, as long as they deal with
+nontechnical topics (like this one). These kinds of restrictions are
+acceptable because they don't obstruct the community's normal use of
+the manual.
+
+ However, it must be possible to modify all the _technical_ content
+of the manual, and then distribute the result in all the usual media,
+through all the usual channels. Otherwise, the restrictions obstruct
+the use of the manual, it is not free, and we need another manual to
+replace it.
+
+ Please spread the word about this issue. Our community continues to
+lose manuals to proprietary publishing. If we spread the word that
+free software needs free reference manuals and free tutorials, perhaps
+the next person who wants to contribute by writing documentation will
+realize, before it is too late, that only free manuals contribute to
+the free software community.
+
+ If you are writing documentation, please insist on publishing it
+under the GNU Free Documentation License or another free documentation
+license. Remember that this decision requires your approval--you don't
+have to let the publisher decide. Some commercial publishers will use
+a free license if you insist, but they will not propose the option; it
+is up to you to raise the issue and say firmly that this is what you
+want. If the publisher you are dealing with refuses, please try other
+publishers. If you're not sure whether a proposed license is free,
+write to <licensing@gnu.org>.
+
+ You can encourage commercial publishers to sell more free, copylefted
+manuals and tutorials by buying them, and particularly by buying copies
+from the publishers that paid for their writing or for major
+improvements. Meanwhile, try to avoid buying non-free documentation at
+all. Check the distribution terms of a manual before you buy it, and
+insist that whoever seeks your business must respect your freedom.
+Check the history of the book, and try reward the publishers that have
+paid or pay the authors to work on it.
+
+ The Free Software Foundation maintains a list of free documentation
+published by other publishers:
+
+ `http://www.fsf.org/doc/other-free-books.html'
+
+
+File: gsl-ref.info, Node: GNU General Public License, Next: GNU Free Documentation License, Prev: Free Software Needs Free Documentation, Up: Top
+
+GNU General Public License
+**************************
+
+ Version 2, June 1991
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+
+ Everyone is permitted to copy and distribute verbatim copies of this
+ license document, but changing it is not allowed.
+
+Preamble
+========
+
+The licenses for most software are designed to take away your freedom
+to share and change it. By contrast, the GNU General Public License is
+intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it in
+new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software,
+and (2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+ 0. This License applies to any program or other work which contains a
+ notice placed by the copyright holder saying it may be distributed
+ under the terms of this General Public License. The "Program",
+ below, refers to any such program or work, and a "work based on
+ the Program" means either the Program or any derivative work under
+ copyright law: that is to say, a work containing the Program or a
+ portion of it, either verbatim or with modifications and/or
+ translated into another language. (Hereinafter, translation is
+ included without limitation in the term "modification".) Each
+ licensee is addressed as "you".
+
+ Activities other than copying, distribution and modification are
+ not covered by this License; they are outside its scope. The act
+ of running the Program is not restricted, and the output from the
+ Program is covered only if its contents constitute a work based on
+ the Program (independent of having been made by running the
+ Program). Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+ source code as you receive it, in any medium, provided that you
+ conspicuously and appropriately publish on each copy an appropriate
+ copyright notice and disclaimer of warranty; keep intact all the
+ notices that refer to this License and to the absence of any
+ warranty; and give any other recipients of the Program a copy of
+ this License along with the Program.
+
+ You may charge a fee for the physical act of transferring a copy,
+ and you may at your option offer warranty protection in exchange
+ for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+ of it, thus forming a work based on the Program, and copy and
+ distribute such modifications or work under the terms of Section 1
+ above, provided that you also meet all of these conditions:
+
+ a. You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b. You must cause any work that you distribute or publish, that
+ in whole or in part contains or is derived from the Program
+ or any part thereof, to be licensed as a whole at no charge
+ to all third parties under the terms of this License.
+
+ c. If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display
+ an announcement including an appropriate copyright notice and
+ a notice that there is no warranty (or else, saying that you
+ provide a warranty) and that users may redistribute the
+ program under these conditions, and telling the user how to
+ view a copy of this License. (Exception: if the Program
+ itself is interactive but does not normally print such an
+ announcement, your work based on the Program is not required
+ to print an announcement.)
+
+ These requirements apply to the modified work as a whole. If
+ identifiable sections of that work are not derived from the
+ Program, and can be reasonably considered independent and separate
+ works in themselves, then this License, and its terms, do not
+ apply to those sections when you distribute them as separate
+ works. But when you distribute the same sections as part of a
+ whole which is a work based on the Program, the distribution of
+ the whole must be on the terms of this License, whose permissions
+ for other licensees extend to the entire whole, and thus to each
+ and every part regardless of who wrote it.
+
+ Thus, it is not the intent of this section to claim rights or
+ contest your rights to work written entirely by you; rather, the
+ intent is to exercise the right to control the distribution of
+ derivative or collective works based on the Program.
+
+ In addition, mere aggregation of another work not based on the
+ Program with the Program (or with a work based on the Program) on
+ a volume of a storage or distribution medium does not bring the
+ other work under the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+ under Section 2) in object code or executable form under the terms
+ of Sections 1 and 2 above provided that you also do one of the
+ following:
+
+ a. Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of
+ Sections 1 and 2 above on a medium customarily used for
+ software interchange; or,
+
+ b. Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a
+ medium customarily used for software interchange; or,
+
+ c. Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with
+ such an offer, in accord with Subsection b above.)
+
+ The source code for a work means the preferred form of the work for
+ making modifications to it. For an executable work, complete
+ source code means all the source code for all modules it contains,
+ plus any associated interface definition files, plus the scripts
+ used to control compilation and installation of the executable.
+ However, as a special exception, the source code distributed need
+ not include anything that is normally distributed (in either
+ source or binary form) with the major components (compiler,
+ kernel, and so on) of the operating system on which the executable
+ runs, unless that component itself accompanies the executable.
+
+ If distribution of executable or object code is made by offering
+ access to copy from a designated place, then offering equivalent
+ access to copy the source code from the same place counts as
+ distribution of the source code, even though third parties are not
+ compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+ except as expressly provided under this License. Any attempt
+ otherwise to copy, modify, sublicense or distribute the Program is
+ void, and will automatically terminate your rights under this
+ License. However, parties who have received copies, or rights,
+ from you under this License will not have their licenses
+ terminated so long as such parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+ signed it. However, nothing else grants you permission to modify
+ or distribute the Program or its derivative works. These actions
+ are prohibited by law if you do not accept this License.
+ Therefore, by modifying or distributing the Program (or any work
+ based on the Program), you indicate your acceptance of this
+ License to do so, and all its terms and conditions for copying,
+ distributing or modifying the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+ Program), the recipient automatically receives a license from the
+ original licensor to copy, distribute or modify the Program
+ subject to these terms and conditions. You may not impose any
+ further restrictions on the recipients' exercise of the rights
+ granted herein. You are not responsible for enforcing compliance
+ by third parties to this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+ infringement or for any other reason (not limited to patent
+ issues), conditions are imposed on you (whether by court order,
+ agreement or otherwise) that contradict the conditions of this
+ License, they do not excuse you from the conditions of this
+ License. If you cannot distribute so as to satisfy simultaneously
+ your obligations under this License and any other pertinent
+ obligations, then as a consequence you may not distribute the
+ Program at all. For example, if a patent license would not permit
+ royalty-free redistribution of the Program by all those who
+ receive copies directly or indirectly through you, then the only
+ way you could satisfy both it and this License would be to refrain
+ entirely from distribution of the Program.
+
+ If any portion of this section is held invalid or unenforceable
+ under any particular circumstance, the balance of the section is
+ intended to apply and the section as a whole is intended to apply
+ in other circumstances.
+
+ It is not the purpose of this section to induce you to infringe any
+ patents or other property right claims or to contest validity of
+ any such claims; this section has the sole purpose of protecting
+ the integrity of the free software distribution system, which is
+ implemented by public license practices. Many people have made
+ generous contributions to the wide range of software distributed
+ through that system in reliance on consistent application of that
+ system; it is up to the author/donor to decide if he or she is
+ willing to distribute software through any other system and a
+ licensee cannot impose that choice.
+
+ This section is intended to make thoroughly clear what is believed
+ to be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+ certain countries either by patents or by copyrighted interfaces,
+ the original copyright holder who places the Program under this
+ License may add an explicit geographical distribution limitation
+ excluding those countries, so that distribution is permitted only
+ in or among countries not thus excluded. In such case, this
+ License incorporates the limitation as if written in the body of
+ this License.
+
+ 9. The Free Software Foundation may publish revised and/or new
+ versions of the General Public License from time to time. Such
+ new versions will be similar in spirit to the present version, but
+ may differ in detail to address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+ Program specifies a version number of this License which applies
+ to it and "any later version", you have the option of following
+ the terms and conditions either of that version or of any later
+ version published by the Free Software Foundation. If the Program
+ does not specify a version number of this License, you may choose
+ any version ever published by the Free Software Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+ programs whose distribution conditions are different, write to the
+ author to ask for permission. For software which is copyrighted
+ by the Free Software Foundation, write to the Free Software
+ Foundation; we sometimes make exceptions for this. Our decision
+ will be guided by the two goals of preserving the free status of
+ all derivatives of our free software and of promoting the sharing
+ and reuse of software generally.
+
+ NO WARRANTY
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO
+ WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE
+ LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+ HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT
+ WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT
+ NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE
+ QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+ PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY
+ SERVICING, REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+ WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY
+ MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE
+ LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL,
+ INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
+ INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+ DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU
+ OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY
+ OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+Appendix: How to Apply These Terms to Your New Programs
+=======================================================
+
+If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these
+terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ one line to give the program's name and a brief idea
+ of whAT IT DOES.
+ Copyright (C) YYYY NAME OF AUTHOR
+
+ This program is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later
+ version.
+
+ This program is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied
+ warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ PURPOSE. See the GNU General Public License for more
+ details.
+
+ You should have received a copy of the GNU General Public
+ License along with this program; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+
+ Also add information on how to contact you by electronic and paper
+mail.
+
+ If the program is interactive, make it output a short notice like
+this when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19YY NAME OF AUTHOR
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
+ type `show w'. This is free software, and you are welcome
+ to redistribute it under certain conditions; type `show c'
+ for details.
+
+ The hypothetical commands `show w' and `show c' should show the
+appropriate parts of the General Public License. Of course, the
+commands you use may be called something other than `show w' and `show
+c'; they could even be mouse-clicks or menu items--whatever suits your
+program.
+
+ You should also get your employer (if you work as a programmer) or
+your school, if any, to sign a "copyright disclaimer" for the program,
+if necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in
+ the program `Gnomovision' (which makes passes at compilers)
+ written by James Hacker.
+
+ SIGNATURE OF TY COON, 1 April 1989
+ Ty Coon, President of Vice
+
+ This General Public License does not permit incorporating your
+program into proprietary programs. If your program is a subroutine
+library, you may consider it more useful to permit linking proprietary
+applications with the library. If this is what you want to do, use the
+GNU Library General Public License instead of this License.
+
+
+File: gsl-ref.info, Node: GNU Free Documentation License, Next: Function Index, Prev: GNU General Public License, Up: Top
+
+GNU Free Documentation License
+******************************
+
+ Version 1.2, November 2002
+ Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
+ 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+
+ Everyone is permitted to copy and distribute verbatim copies of this license
+ document, but changing it is not allowed.
+
+ 0. PREAMBLE
+
+ The purpose of this License is to make a manual, textbook, or other
+ functional and useful document "free" in the sense of freedom: to
+ assure everyone the effective freedom to copy and redistribute it,
+ with or without modifying it, either commercially or
+ noncommercially. Secondarily, this License preserves for the
+ author and publisher a way to get credit for their work, while not
+ being considered responsible for modifications made by others.
+
+ This License is a kind of "copyleft", which means that derivative
+ works of the document must themselves be free in the same sense.
+ It complements the GNU General Public License, which is a copyleft
+ license designed for free software.
+
+ We have designed this License in order to use it for manuals for
+ free software, because free software needs free documentation: a
+ free program should come with manuals providing the same freedoms
+ that the software does. But this License is not limited to
+ software manuals; it can be used for any textual work, regardless
+ of subject matter or whether it is published as a printed book.
+ We recommend this License principally for works whose purpose is
+ instruction or reference.
+
+ 1. APPLICABILITY AND DEFINITIONS
+
+ This License applies to any manual or other work, in any medium,
+ that contains a notice placed by the copyright holder saying it
+ can be distributed under the terms of this License. Such a notice
+ grants a world-wide, royalty-free license, unlimited in duration,
+ to use that work under the conditions stated herein. The
+ "Document", below, refers to any such manual or work. Any member
+ of the public is a licensee, and is addressed as "you". You
+ accept the license if you copy, modify or distribute the work in a
+ way requiring permission under copyright law.
+
+ A "Modified Version" of the Document means any work containing the
+ Document or a portion of it, either copied verbatim, or with
+ modifications and/or translated into another language.
+
+ A "Secondary Section" is a named appendix or a front-matter section
+ of the Document that deals exclusively with the relationship of the
+ publishers or authors of the Document to the Document's overall
+ subject (or to related matters) and contains nothing that could
+ fall directly within that overall subject. (Thus, if the Document
+ is in part a textbook of mathematics, a Secondary Section may not
+ explain any mathematics.) The relationship could be a matter of
+ historical connection with the subject or with related matters, or
+ of legal, commercial, philosophical, ethical or political position
+ regarding them.
+
+ The "Invariant Sections" are certain Secondary Sections whose
+ titles are designated, as being those of Invariant Sections, in
+ the notice that says that the Document is released under this
+ License. If a section does not fit the above definition of
+ Secondary then it is not allowed to be designated as Invariant.
+ The Document may contain zero Invariant Sections. If the Document
+ does not identify any Invariant Sections then there are none.
+
+ The "Cover Texts" are certain short passages of text that are
+ listed, as Front-Cover Texts or Back-Cover Texts, in the notice
+ that says that the Document is released under this License. A
+ Front-Cover Text may be at most 5 words, and a Back-Cover Text may
+ be at most 25 words.
+
+ A "Transparent" copy of the Document means a machine-readable copy,
+ represented in a format whose specification is available to the
+ general public, that is suitable for revising the document
+ straightforwardly with generic text editors or (for images
+ composed of pixels) generic paint programs or (for drawings) some
+ widely available drawing editor, and that is suitable for input to
+ text formatters or for automatic translation to a variety of
+ formats suitable for input to text formatters. A copy made in an
+ otherwise Transparent file format whose markup, or absence of
+ markup, has been arranged to thwart or discourage subsequent
+ modification by readers is not Transparent. An image format is
+ not Transparent if used for any substantial amount of text. A
+ copy that is not "Transparent" is called "Opaque".
+
+ Examples of suitable formats for Transparent copies include plain
+ ASCII without markup, Texinfo input format, LaTeX input format,
+ SGML or XML using a publicly available DTD, and
+ standard-conforming simple HTML, PostScript or PDF designed for
+ human modification. Examples of transparent image formats include
+ PNG, XCF and JPG. Opaque formats include proprietary formats that
+ can be read and edited only by proprietary word processors, SGML or
+ XML for which the DTD and/or processing tools are not generally
+ available, and the machine-generated HTML, PostScript or PDF
+ produced by some word processors for output purposes only.
+
+ The "Title Page" means, for a printed book, the title page itself,
+ plus such following pages as are needed to hold, legibly, the
+ material this License requires to appear in the title page. For
+ works in formats which do not have any title page as such, "Title
+ Page" means the text near the most prominent appearance of the
+ work's title, preceding the beginning of the body of the text.
+
+ A section "Entitled XYZ" means a named subunit of the Document
+ whose title either is precisely XYZ or contains XYZ in parentheses
+ following text that translates XYZ in another language. (Here XYZ
+ stands for a specific section name mentioned below, such as
+ "Acknowledgements", "Dedications", "Endorsements", or "History".)
+ To "Preserve the Title" of such a section when you modify the
+ Document means that it remains a section "Entitled XYZ" according
+ to this definition.
+
+ The Document may include Warranty Disclaimers next to the notice
+ which states that this License applies to the Document. These
+ Warranty Disclaimers are considered to be included by reference in
+ this License, but only as regards disclaiming warranties: any other
+ implication that these Warranty Disclaimers may have is void and
+ has no effect on the meaning of this License.
+
+ 2. VERBATIM COPYING
+
+ You may copy and distribute the Document in any medium, either
+ commercially or noncommercially, provided that this License, the
+ copyright notices, and the license notice saying this License
+ applies to the Document are reproduced in all copies, and that you
+ add no other conditions whatsoever to those of this License. You
+ may not use technical measures to obstruct or control the reading
+ or further copying of the copies you make or distribute. However,
+ you may accept compensation in exchange for copies. If you
+ distribute a large enough number of copies you must also follow
+ the conditions in section 3.
+
+ You may also lend copies, under the same conditions stated above,
+ and you may publicly display copies.
+
+ 3. COPYING IN QUANTITY
+
+ If you publish printed copies (or copies in media that commonly
+ have printed covers) of the Document, numbering more than 100, and
+ the Document's license notice requires Cover Texts, you must
+ enclose the copies in covers that carry, clearly and legibly, all
+ these Cover Texts: Front-Cover Texts on the front cover, and
+ Back-Cover Texts on the back cover. Both covers must also clearly
+ and legibly identify you as the publisher of these copies. The
+ front cover must present the full title with all words of the
+ title equally prominent and visible. You may add other material
+ on the covers in addition. Copying with changes limited to the
+ covers, as long as they preserve the title of the Document and
+ satisfy these conditions, can be treated as verbatim copying in
+ other respects.
+
+ If the required texts for either cover are too voluminous to fit
+ legibly, you should put the first ones listed (as many as fit
+ reasonably) on the actual cover, and continue the rest onto
+ adjacent pages.
+
+ If you publish or distribute Opaque copies of the Document
+ numbering more than 100, you must either include a
+ machine-readable Transparent copy along with each Opaque copy, or
+ state in or with each Opaque copy a computer-network location from
+ which the general network-using public has access to download
+ using public-standard network protocols a complete Transparent
+ copy of the Document, free of added material. If you use the
+ latter option, you must take reasonably prudent steps, when you
+ begin distribution of Opaque copies in quantity, to ensure that
+ this Transparent copy will remain thus accessible at the stated
+ location until at least one year after the last time you
+ distribute an Opaque copy (directly or through your agents or
+ retailers) of that edition to the public.
+
+ It is requested, but not required, that you contact the authors of
+ the Document well before redistributing any large number of
+ copies, to give them a chance to provide you with an updated
+ version of the Document.
+
+ 4. MODIFICATIONS
+
+ You may copy and distribute a Modified Version of the Document
+ under the conditions of sections 2 and 3 above, provided that you
+ release the Modified Version under precisely this License, with
+ the Modified Version filling the role of the Document, thus
+ licensing distribution and modification of the Modified Version to
+ whoever possesses a copy of it. In addition, you must do these
+ things in the Modified Version:
+
+ A. Use in the Title Page (and on the covers, if any) a title
+ distinct from that of the Document, and from those of
+ previous versions (which should, if there were any, be listed
+ in the History section of the Document). You may use the
+ same title as a previous version if the original publisher of
+ that version gives permission.
+
+ B. List on the Title Page, as authors, one or more persons or
+ entities responsible for authorship of the modifications in
+ the Modified Version, together with at least five of the
+ principal authors of the Document (all of its principal
+ authors, if it has fewer than five), unless they release you
+ from this requirement.
+
+ C. State on the Title page the name of the publisher of the
+ Modified Version, as the publisher.
+
+ D. Preserve all the copyright notices of the Document.
+
+ E. Add an appropriate copyright notice for your modifications
+ adjacent to the other copyright notices.
+
+ F. Include, immediately after the copyright notices, a license
+ notice giving the public permission to use the Modified
+ Version under the terms of this License, in the form shown in
+ the Addendum below.
+
+ G. Preserve in that license notice the full lists of Invariant
+ Sections and required Cover Texts given in the Document's
+ license notice.
+
+ H. Include an unaltered copy of this License.
+
+ I. Preserve the section Entitled "History", Preserve its Title,
+ and add to it an item stating at least the title, year, new
+ authors, and publisher of the Modified Version as given on
+ the Title Page. If there is no section Entitled "History" in
+ the Document, create one stating the title, year, authors,
+ and publisher of the Document as given on its Title Page,
+ then add an item describing the Modified Version as stated in
+ the previous sentence.
+
+ J. Preserve the network location, if any, given in the Document
+ for public access to a Transparent copy of the Document, and
+ likewise the network locations given in the Document for
+ previous versions it was based on. These may be placed in
+ the "History" section. You may omit a network location for a
+ work that was published at least four years before the
+ Document itself, or if the original publisher of the version
+ it refers to gives permission.
+
+ K. For any section Entitled "Acknowledgements" or "Dedications",
+ Preserve the Title of the section, and preserve in the
+ section all the substance and tone of each of the contributor
+ acknowledgements and/or dedications given therein.
+
+ L. Preserve all the Invariant Sections of the Document,
+ unaltered in their text and in their titles. Section numbers
+ or the equivalent are not considered part of the section
+ titles.
+
+ M. Delete any section Entitled "Endorsements". Such a section
+ may not be included in the Modified Version.
+
+ N. Do not retitle any existing section to be Entitled
+ "Endorsements" or to conflict in title with any Invariant
+ Section.
+
+ O. Preserve any Warranty Disclaimers.
+
+ If the Modified Version includes new front-matter sections or
+ appendices that qualify as Secondary Sections and contain no
+ material copied from the Document, you may at your option
+ designate some or all of these sections as invariant. To do this,
+ add their titles to the list of Invariant Sections in the Modified
+ Version's license notice. These titles must be distinct from any
+ other section titles.
+
+ You may add a section Entitled "Endorsements", provided it contains
+ nothing but endorsements of your Modified Version by various
+ parties--for example, statements of peer review or that the text
+ has been approved by an organization as the authoritative
+ definition of a standard.
+
+ You may add a passage of up to five words as a Front-Cover Text,
+ and a passage of up to 25 words as a Back-Cover Text, to the end
+ of the list of Cover Texts in the Modified Version. Only one
+ passage of Front-Cover Text and one of Back-Cover Text may be
+ added by (or through arrangements made by) any one entity. If the
+ Document already includes a cover text for the same cover,
+ previously added by you or by arrangement made by the same entity
+ you are acting on behalf of, you may not add another; but you may
+ replace the old one, on explicit permission from the previous
+ publisher that added the old one.
+
+ The author(s) and publisher(s) of the Document do not by this
+ License give permission to use their names for publicity for or to
+ assert or imply endorsement of any Modified Version.
+
+ 5. COMBINING DOCUMENTS
+
+ You may combine the Document with other documents released under
+ this License, under the terms defined in section 4 above for
+ modified versions, provided that you include in the combination
+ all of the Invariant Sections of all of the original documents,
+ unmodified, and list them all as Invariant Sections of your
+ combined work in its license notice, and that you preserve all
+ their Warranty Disclaimers.
+
+ The combined work need only contain one copy of this License, and
+ multiple identical Invariant Sections may be replaced with a single
+ copy. If there are multiple Invariant Sections with the same name
+ but different contents, make the title of each such section unique
+ by adding at the end of it, in parentheses, the name of the
+ original author or publisher of that section if known, or else a
+ unique number. Make the same adjustment to the section titles in
+ the list of Invariant Sections in the license notice of the
+ combined work.
+
+ In the combination, you must combine any sections Entitled
+ "History" in the various original documents, forming one section
+ Entitled "History"; likewise combine any sections Entitled
+ "Acknowledgements", and any sections Entitled "Dedications". You
+ must delete all sections Entitled "Endorsements."
+
+ 6. COLLECTIONS OF DOCUMENTS
+
+ You may make a collection consisting of the Document and other
+ documents released under this License, and replace the individual
+ copies of this License in the various documents with a single copy
+ that is included in the collection, provided that you follow the
+ rules of this License for verbatim copying of each of the
+ documents in all other respects.
+
+ You may extract a single document from such a collection, and
+ distribute it individually under this License, provided you insert
+ a copy of this License into the extracted document, and follow
+ this License in all other respects regarding verbatim copying of
+ that document.
+
+ 7. AGGREGATION WITH INDEPENDENT WORKS
+
+ A compilation of the Document or its derivatives with other
+ separate and independent documents or works, in or on a volume of
+ a storage or distribution medium, is called an "aggregate" if the
+ copyright resulting from the compilation is not used to limit the
+ legal rights of the compilation's users beyond what the individual
+ works permit. When the Document is included in an aggregate, this
+ License does not apply to the other works in the aggregate which
+ are not themselves derivative works of the Document.
+
+ If the Cover Text requirement of section 3 is applicable to these
+ copies of the Document, then if the Document is less than one half
+ of the entire aggregate, the Document's Cover Texts may be placed
+ on covers that bracket the Document within the aggregate, or the
+ electronic equivalent of covers if the Document is in electronic
+ form. Otherwise they must appear on printed covers that bracket
+ the whole aggregate.
+
+ 8. TRANSLATION
+
+ Translation is considered a kind of modification, so you may
+ distribute translations of the Document under the terms of section
+ 4. Replacing Invariant Sections with translations requires special
+ permission from their copyright holders, but you may include
+ translations of some or all Invariant Sections in addition to the
+ original versions of these Invariant Sections. You may include a
+ translation of this License, and all the license notices in the
+ Document, and any Warranty Disclaimers, provided that you also
+ include the original English version of this License and the
+ original versions of those notices and disclaimers. In case of a
+ disagreement between the translation and the original version of
+ this License or a notice or disclaimer, the original version will
+ prevail.
+
+ If a section in the Document is Entitled "Acknowledgements",
+ "Dedications", or "History", the requirement (section 4) to
+ Preserve its Title (section 1) will typically require changing the
+ actual title.
+
+ 9. TERMINATION
+
+ You may not copy, modify, sublicense, or distribute the Document
+ except as expressly provided for under this License. Any other
+ attempt to copy, modify, sublicense or distribute the Document is
+ void, and will automatically terminate your rights under this
+ License. However, parties who have received copies, or rights,
+ from you under this License will not have their licenses
+ terminated so long as such parties remain in full compliance.
+
+ 10. FUTURE REVISIONS OF THIS LICENSE
+
+ The Free Software Foundation may publish new, revised versions of
+ the GNU Free Documentation License from time to time. Such new
+ versions will be similar in spirit to the present version, but may
+ differ in detail to address new problems or concerns. See
+ `http://www.gnu.org/copyleft/'.
+
+ Each version of the License is given a distinguishing version
+ number. If the Document specifies that a particular numbered
+ version of this License "or any later version" applies to it, you
+ have the option of following the terms and conditions either of
+ that specified version or of any later version that has been
+ published (not as a draft) by the Free Software Foundation. If
+ the Document does not specify a version number of this License,
+ you may choose any version ever published (not as a draft) by the
+ Free Software Foundation.
+
+ADDENDUM: How to use this License for your documents
+====================================================
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and license
+notices just after the title page:
+
+ Copyright (C) YEAR YOUR NAME.
+ Permission is granted to copy, distribute and/or modify
+ this document under the terms of the GNU Free
+ Documentation License, Version 1.2 or any later version
+ published by the Free Software Foundation; with no
+ Invariant Sections, no Front-Cover Texts, and no
+ Back-Cover Texts. A copy of the license is included in
+ the section entitled ``GNU Free Documentation License''.
+
+ If you have Invariant Sections, Front-Cover Texts and Back-Cover
+Texts, replace the "with...Texts." line with this:
+
+ with the Invariant Sections being LIST THEIR
+ TITLES, with the Front-Cover Texts being LIST, and
+ with the Back-Cover Texts being LIST.
+
+ If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+ If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License, to
+permit their use in free software.
+
diff --git a/gsl-1.9/doc/gsl-ref.info-5 b/gsl-1.9/doc/gsl-ref.info-5
new file mode 100644
index 0000000..1b76f5e
--- /dev/null
+++ b/gsl-1.9/doc/gsl-ref.info-5
Binary files differ
diff --git a/gsl-1.9/doc/gsl-ref.info-6 b/gsl-1.9/doc/gsl-ref.info-6
new file mode 100644
index 0000000..243ca4d
--- /dev/null
+++ b/gsl-1.9/doc/gsl-ref.info-6
Binary files differ
diff --git a/gsl-1.9/doc/gsl-ref.texi b/gsl-1.9/doc/gsl-ref.texi
new file mode 100644
index 0000000..c2ba564
--- /dev/null
+++ b/gsl-1.9/doc/gsl-ref.texi
@@ -0,0 +1,647 @@
+\input texinfo @c -*-texinfo-*-
+@c This will be for the printing version of the manual
+@c @input config-local.texi
+@c %**start of header
+@setfilename gsl-ref.info
+@settitle GNU Scientific Library -- Reference Manual
+@finalout
+@set frontcontents
+@ifset publish
+@setchapternewpage odd
+@end ifset
+@c %**end of header
+
+@dircategory Scientific software
+@direntry
+* gsl-ref: (gsl-ref). GNU Scientific Library -- Reference
+@end direntry
+
+@c How to use the math macros
+@c ==========================
+@c
+@c For simple expressions, simply use the @math{} command, e.g.
+@c
+@c @math{\exp(x)/(1+x^2)}
+@c
+@c but if the expression includes characters that need to be 'escaped'
+@c in texinfo, like '{' or '}', or needs different output for TeX and info,
+@c then use the following form,
+@c
+@c blah blah blah @c{$y^{1+b} \le \pi$}
+@c @math{y^@{1+b@} <= \pi}
+@c
+@c The first part using @c{} must appear at the end of a line (it reads
+@c up to the line end -- as far as texinfo is concerned it's actually
+@c a 'comment'). The comment command @c has been modified to capture
+@c a TeX expression which is output by the next @math.
+@c
+@c For ordinary comments use the @comment command.
+
+@tex
+% Mathematical macros taken from the GNU Calc Manual
+% ==================================================
+%
+% Some special kludges to make TeX formatting prettier.
+% Because makeinfo.c exists, we can't just define new commands.
+% So instead, we take over little-used existing commands.
+%
+% Redefine @cite{text} to act like $text$ in regular TeX.
+% Info will typeset this same as @samp{text}.
+\gdef\goodtex{\tex \let\rm\goodrm \let\t\ttfont \turnoffactive}
+\gdef\goodrm{\fam0\tenrm}
+\gdef\math{\goodtex$\mathxxx}
+\gdef\mathxxx#1{#1$\endgroup}
+\global\let\oldxrefX=\xrefX
+\gdef\xrefX[#1]{\begingroup\let\math=\dfn\oldxrefX[#1]\endgroup}
+%
+% Redefine @i{text} to be equivalent to @cite{text}, i.e., to use math mode.
+% This looks the same in TeX but omits the surrounding ` ' in Info.
+%\global\let\i=\cite
+%\global\let\math=\cite
+%
+% Redefine @c{tex-stuff} \n @whatever{info-stuff}.
+\gdef\c{\futurelet\next\mycxxx}
+\gdef\mycxxx{%
+ \ifx\next\bgroup \goodtex\let\next\mycxxy
+ \else\ifx\next\mindex \let\next\relax
+ \else\ifx\next\kindex \let\next\relax
+ \else\ifx\next\starindex \let\next\relax \else \let\next\comment
+ \fi\fi\fi\fi \next
+}
+\gdef\mycxxy#1#2{#1\endgroup\mycxxz}
+\gdef\mycxxz#1{}
+%
+% Define \Hat to take over from \hat as an accent
+\gdef\Hat{\mathaccent "705E}
+%
+%\gdef\beforedisplay{\vskip-10pt}
+%\gdef\afterdisplay{\vskip-5pt}
+\gdef\beforedisplay{}
+\gdef\afterdisplay{}
+{\globaldefs = 1
+\abovedisplayskip=7pt plus 2pt minus 1pt
+\belowdisplayskip=7pt plus 2pt minus 1pt
+\abovedisplayshortskip=7pt plus 2pt minus 1pt
+\belowdisplayshortskip=7pt plus 2pt minus 1pt}
+%\abovedisplayskip=12pt plus 3pt minus 3pt
+%\belowdisplayskip=12pt plus 3pt minus 3pt
+%\abovedisplayshortskip=7pt plus 1pt minus 1pt
+%\belowdisplayshortskip=7pt plus 1pt minus 1pt
+%\gdef\beforedisplayh{\vskip-25pt}
+%\gdef\afterdisplayh{\vskip-10pt}
+%
+\gdef\arcsec{\hbox{\rm arcsec}}
+\gdef\arccsc{\hbox{\rm arccsc}}
+\gdef\arccot{\hbox{\rm arccot}}
+\gdef\sech{\hbox{\rm sech}}
+\gdef\csch{\hbox{\rm csch}}
+\gdef\coth{\hbox{\rm coth}}
+\gdef\arcsinh{\hbox{\rm arcsinh}}
+\gdef\arccosh{\hbox{\rm arccosh}}
+\gdef\arctanh{\hbox{\rm arctanh}}
+\gdef\arcsech{\hbox{\rm arcsech}}
+\gdef\arccsch{\hbox{\rm arccsch}}
+\gdef\arccoth{\hbox{\rm arccoth}}
+%
+\gdef\Re{\hbox{\rm Re}}
+\gdef\Im{\hbox{\rm Im}}
+\gdef\Sin{\hbox{\rm Sin}}
+\gdef\Cos{\hbox{\rm Cos}}
+\gdef\Log{\hbox{\rm Log}}
+%
+\gdef\erf{\hbox{\rm erf}}
+\gdef\erfc{\hbox{\rm erfc}}
+\gdef\sinc{\hbox{\rm sinc}}
+\gdef\sgn{\hbox{\rm sgn}}
+\gdef\sign{\hbox{\rm sign}}
+\gdef\det{\hbox{\rm det}}
+\gdef\Var{\hbox{\rm Var}}
+\gdef\arg{\hbox{\rm arg}} % avoid temporary clobbering of arg in texinfo-4.8
+@end tex
+
+@include version-ref.texi
+@set GSL @i{GNU Scientific Library}
+
+@copying
+Copyright @copyright{} 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 The GSL Team.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2 or
+any later version published by the Free Software Foundation; with the
+Invariant Sections being ``GNU General Public License'' and ``Free Software
+Needs Free Documentation'', the Front-Cover text being ``A GNU Manual'',
+and with the Back-Cover Text being (a) (see below). A copy of the
+license is included in the section entitled ``GNU Free Documentation
+License''.
+
+(a) The Back-Cover Text is: ``You have freedom to copy and modify this
+GNU Manual, like GNU software.''
+@end copying
+
+@titlepage
+@title GNU Scientific Library
+@subtitle Reference Manual
+@subtitle Edition @value{EDITION}, for GSL Version @value{VERSION}
+@subtitle @value{UPDATED}
+
+@author Mark Galassi
+Los Alamos National Laboratory
+@comment @email{rosalia@@lanl.gov}
+@sp 1
+
+@author Jim Davies
+Department of Computer Science, Georgia Institute of Technology
+@comment @email{jimmyd@@nis.lanl.gov}
+@sp 1
+
+@author James Theiler
+Astrophysics and Radiation Measurements Group, Los Alamos National Laboratory
+@comment @email{jt@@nis.lanl.gov}
+@sp 1
+
+@author Brian Gough
+Network Theory Limited
+@comment @email{bjg@@network-theory.co.uk}
+@sp 1
+
+@comment Asked to be moved to 'contributors' appendix
+@comment @author Reid Priedhorsky
+@comment Mathematical Modeling and Analysis Group, Los Alamos National Laboratory
+@comment @email{rp@@lanl.gov}
+@comment @sp 1
+
+@author Gerard Jungman
+Theoretical Astrophysics Group, Los Alamos National Laboratory
+@comment @email{jungman@@lanl.gov}
+@sp 1
+
+@author Michael Booth
+Department of Physics and Astronomy, The Johns Hopkins University
+@comment @email{booth@@planck.pha.jhu.edu} or @email{booth@@debian.org}
+@sp 1
+
+@author Fabrice Rossi
+University of Paris-Dauphine
+@comment @email{rossi@@ufrmd.dauphine.fr}
+@sp 1
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+@ifclear publish
+Printed copies of this manual can be purchased from Network Theory Ltd
+at @uref{http://www.network-theory.co.uk/gsl/manual/}.
+
+The money raised from sales of the manual helps support the
+development of GSL.
+@end ifclear
+@end titlepage
+
+@iftex
+@ifset frontcontents
+@contents
+@end ifset
+@end iftex
+
+@ifnottex
+@node Top, Introduction, (dir), (dir)
+@top GSL
+
+This file documents the @value{GSL} (GSL), a collection of numerical
+routines for scientific computing. It corresponds to release
+@value{VERSION} of the library. Please report any errors in this
+manual to @email{bug-gsl@@gnu.org}.
+
+More information about GSL can be found at the project homepage,
+@uref{http://www.gnu.org/software/gsl/}.
+
+Printed copies of this manual can be purchased from Network Theory Ltd
+at @uref{http://www.network-theory.co.uk/gsl/manual/}. The money
+raised from sales of the manual helps support the development of GSL.
+
+A Japanese translation of this manual is available from the GSL
+project homepage thanks to Daisuke Tominaga.
+
+@insertcopying
+@sp 1
+@end ifnottex
+
+@menu
+* Introduction::
+* Using the library::
+* Error Handling::
+* Mathematical Functions::
+* Complex Numbers::
+* Polynomials::
+* Special Functions::
+* Vectors and Matrices::
+* Permutations::
+* Combinations::
+* Sorting::
+* BLAS Support::
+* Linear Algebra::
+* Eigensystems::
+* Fast Fourier Transforms::
+* Numerical Integration::
+* Random Number Generation::
+* Quasi-Random Sequences::
+* Random Number Distributions::
+* Statistics::
+* Histograms::
+* N-tuples::
+* Monte Carlo Integration::
+* Simulated Annealing::
+* Ordinary Differential Equations::
+* Interpolation::
+* Numerical Differentiation::
+* Chebyshev Approximations::
+* Series Acceleration::
+* Wavelet Transforms::
+* Discrete Hankel Transforms::
+* One dimensional Root-Finding::
+* One dimensional Minimization::
+* Multidimensional Root-Finding::
+* Multidimensional Minimization::
+* Least-Squares Fitting::
+* Nonlinear Least-Squares Fitting::
+* Basis Splines::
+* Physical Constants::
+* IEEE floating-point arithmetic::
+* Debugging Numerical Programs::
+* Contributors to GSL::
+* Autoconf Macros::
+* GSL CBLAS Library::
+* Free Software Needs Free Documentation::
+* GNU General Public License::
+* GNU Free Documentation License::
+* Function Index::
+* Variable Index::
+* Type Index::
+* Concept Index::
+@end menu
+
+@node Introduction, Using the library, Top, Top
+@chapter Introduction
+@include intro.texi
+
+@node Using the library, Error Handling, Introduction, Top
+@chapter Using the library
+@cindex usage, compiling application programs
+@include usage.texi
+
+@node Error Handling, Mathematical Functions, Using the library, Top
+@chapter Error Handling
+@cindex Errors
+@include err.texi
+
+@node Mathematical Functions, Complex Numbers, Error Handling, Top
+@chapter Mathematical Functions
+@include math.texi
+
+@node Complex Numbers, Polynomials, Mathematical Functions, Top
+@chapter Complex Numbers
+@include complex.texi
+
+@node Polynomials, Special Functions, Complex Numbers, Top
+@chapter Polynomials
+@include poly.texi
+
+@node Special Functions, Vectors and Matrices, Polynomials, Top
+@chapter Special Functions
+@include specfunc.texi
+
+@node Vectors and Matrices, Permutations, Special Functions, Top
+@chapter Vectors and Matrices
+@include vectors.texi
+
+@node Permutations, Combinations, Vectors and Matrices, Top
+@chapter Permutations
+@include permutation.texi
+
+@node Combinations, Sorting, Permutations, Top
+@chapter Combinations
+@include combination.texi
+
+@node Sorting, BLAS Support, Combinations, Top
+@chapter Sorting
+@include sort.texi
+
+@node BLAS Support, Linear Algebra, Sorting, Top
+@chapter BLAS Support
+@include blas.texi
+
+@node Linear Algebra, Eigensystems, BLAS Support, Top
+@chapter Linear Algebra
+@include linalg.texi
+
+@node Eigensystems, Fast Fourier Transforms, Linear Algebra, Top
+@chapter Eigensystems
+@include eigen.texi
+
+@node Fast Fourier Transforms, Numerical Integration, Eigensystems, Top
+@chapter Fast Fourier Transforms (FFTs)
+@include fft.texi
+
+@node Numerical Integration, Random Number Generation, Fast Fourier Transforms, Top
+@chapter Numerical Integration
+@include integration.texi
+
+@node Random Number Generation, Quasi-Random Sequences, Numerical Integration, Top
+@chapter Random Number Generation
+@include rng.texi
+
+@node Quasi-Random Sequences, Random Number Distributions, Random Number Generation, Top
+@chapter Quasi-Random Sequences
+@include qrng.texi
+
+@node Random Number Distributions, Statistics, Quasi-Random Sequences, Top
+@chapter Random Number Distributions
+@include randist.texi
+
+@node Statistics, Histograms, Random Number Distributions, Top
+@chapter Statistics
+@include statistics.texi
+
+@node Histograms, N-tuples, Statistics, Top
+@chapter Histograms
+@include histogram.texi
+
+@node N-tuples, Monte Carlo Integration, Histograms, Top
+@chapter N-tuples
+@include ntuple.texi
+
+@node Monte Carlo Integration, Simulated Annealing, N-tuples, Top
+@chapter Monte Carlo Integration
+@include montecarlo.texi
+
+@node Simulated Annealing, Ordinary Differential Equations, Monte Carlo Integration, Top
+@chapter Simulated Annealing
+@include siman.texi
+
+@node Ordinary Differential Equations, Interpolation, Simulated Annealing, Top
+@chapter Ordinary Differential Equations
+@include ode-initval.texi
+
+@node Interpolation, Numerical Differentiation, Ordinary Differential Equations, Top
+@chapter Interpolation
+@include interp.texi
+
+@node Numerical Differentiation, Chebyshev Approximations, Interpolation, Top
+@chapter Numerical Differentiation
+@include diff.texi
+
+@node Chebyshev Approximations, Series Acceleration, Numerical Differentiation, Top
+@chapter Chebyshev Approximations
+@include cheb.texi
+
+@node Series Acceleration, Wavelet Transforms, Chebyshev Approximations, Top
+@chapter Series Acceleration
+@include sum.texi
+
+@node Wavelet Transforms, Discrete Hankel Transforms, Series Acceleration, Top
+@chapter Wavelet Transforms
+@include dwt.texi
+
+@node Discrete Hankel Transforms, One dimensional Root-Finding, Wavelet Transforms, Top
+@chapter Discrete Hankel Transforms
+@include dht.texi
+
+@node One dimensional Root-Finding, One dimensional Minimization, Discrete Hankel Transforms, Top
+@chapter One dimensional Root-Finding
+@include roots.texi
+
+@node One dimensional Minimization, Multidimensional Root-Finding, One dimensional Root-Finding, Top
+@chapter One dimensional Minimization
+@include min.texi
+
+@node Multidimensional Root-Finding, Multidimensional Minimization, One dimensional Minimization, Top
+@chapter Multidimensional Root-Finding
+@include multiroots.texi
+
+@node Multidimensional Minimization, Least-Squares Fitting, Multidimensional Root-Finding, Top
+@chapter Multidimensional Minimization
+@include multimin.texi
+
+@node Least-Squares Fitting, Nonlinear Least-Squares Fitting, Multidimensional Minimization, Top
+@chapter Least-Squares Fitting
+@include fitting.texi
+
+@node Nonlinear Least-Squares Fitting, Basis Splines, Least-Squares Fitting, Top
+@chapter Nonlinear Least-Squares Fitting
+@include multifit.texi
+
+@node Basis Splines, Physical Constants, Nonlinear Least-Squares Fitting, Top
+@chapter Basis Splines
+@include bspline.texi
+
+@node Physical Constants, IEEE floating-point arithmetic, Basis Splines, Top
+@chapter Physical Constants
+@include const.texi
+
+@node IEEE floating-point arithmetic, Debugging Numerical Programs, Physical Constants, Top
+@chapter IEEE floating-point arithmetic
+@include ieee754.texi
+
+@node Debugging Numerical Programs, Contributors to GSL, IEEE floating-point arithmetic, Top
+@appendix Debugging Numerical Programs
+@include debug.texi
+
+@node Contributors to GSL, Autoconf Macros, Debugging Numerical Programs, Top
+@appendix Contributors to GSL
+
+(See the AUTHORS file in the distribution for up-to-date information.)
+
+@table @strong
+@item Mark Galassi
+Conceived GSL (with James Theiler) and wrote the design document. Wrote
+the simulated annealing package and the relevant chapter in the manual.
+
+@item James Theiler
+Conceived GSL (with Mark Galassi). Wrote the random number generators
+and the relevant chapter in this manual.
+
+@item Jim Davies
+Wrote the statistical routines and the relevant chapter in this
+manual.
+
+@item Brian Gough
+FFTs, numerical integration, random number generators and distributions,
+root finding, minimization and fitting, polynomial solvers, complex
+numbers, physical constants, permutations, vector and matrix functions,
+histograms, statistics, ieee-utils, revised @sc{cblas} Level 2 & 3,
+matrix decompositions, eigensystems, cumulative distribution functions,
+testing, documentation and releases.
+
+@item Reid Priedhorsky
+Wrote and documented the initial version of the root finding routines
+while at Los Alamos National Laboratory, Mathematical Modeling and
+Analysis Group.
+@comment email: reid@reidster.net
+
+@item Gerard Jungman
+Special Functions, Series acceleration, ODEs, BLAS, Linear Algebra,
+Eigensystems, Hankel Transforms.
+
+@item Mike Booth
+Wrote the Monte Carlo library.
+
+@item Jorma Olavi T@"ahtinen
+Wrote the initial complex arithmetic functions.
+
+@item Thomas Walter
+Wrote the initial heapsort routines and cholesky decomposition.
+
+@item Fabrice Rossi
+Multidimensional minimization.
+
+@item Carlo Perassi
+Implementation of the random number generators in Knuth's
+@cite{Seminumerical Algorithms}, 3rd Ed.
+
+@item Szymon Jaroszewicz
+@comment <sj@cs.umb.edu>
+Wrote the routines for generating combinations.
+
+@item Nicolas Darnis
+Wrote the initial routines for canonical permutations.
+
+@item Jason H. Stover
+@comment (jason@sakla.net)
+Wrote the major cumulative distribution functions.
+
+@item Ivo Alxneit
+Wrote the routines for wavelet transforms.
+
+@item Tuomo Keskitalo
+Improved the implementation of the ODE solvers.
+
+@item Lowell Johnson
+Implementation of the Mathieu functions.
+
+@item Patrick Alken
+Implementation of non-symmetric eigensystems and B-splines.
+
+@end table
+
+Thanks to Nigel Lowry for help in proofreading the manual.
+
+The non-symmetric eigensystems routines contain code based on the
+LAPACK linear algebra library. LAPACK is distributed under the
+following license:
+
+@iftex
+@smallerfonts @rm
+@end iftex
+@sp 1
+@quotation
+Copyright (c) 1992-2006 The University of Tennessee. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+@bullet{} Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+
+@bullet{} Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer listed
+in this license in the documentation and/or other materials
+provided with the distribution.
+
+@bullet{} Neither the name of the copyright holders nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+@end quotation
+
+@iftex
+@textfonts @rm
+@end iftex
+
+
+
+@node Autoconf Macros, GSL CBLAS Library, Contributors to GSL, Top
+@appendix Autoconf Macros
+@include autoconf.texi
+
+@node GSL CBLAS Library, Free Software Needs Free Documentation, Autoconf Macros, Top
+@appendix GSL CBLAS Library
+@include cblas.texi
+
+@comment @node Copyright, GNU General Public License, Contributors to GSL, Top
+@comment @unnumbered Copyright
+@comment @include science.texi
+
+@node Free Software Needs Free Documentation, GNU General Public License, GSL CBLAS Library, Top
+@unnumbered Free Software Needs Free Documentation
+@include freemanuals.texi
+
+@node GNU General Public License, GNU Free Documentation License, Free Software Needs Free Documentation, Top
+@unnumbered GNU General Public License
+@include gpl.texi
+
+@node GNU Free Documentation License, Function Index, GNU General Public License, Top
+@unnumbered GNU Free Documentation License
+@include fdl.texi
+
+@comment htmlhelp: @printindex fn
+@comment htmlhelp: @printindex vr
+@comment htmlhelp: @printindex tp
+@comment htmlhelp: @printindex cp
+@comment htmlhelp: @bye
+
+@iftex
+@normalbottom
+@end iftex
+
+@node Function Index, Variable Index, GNU Free Documentation License, Top
+@unnumbered Function Index
+
+@printindex fn
+
+@node Variable Index, Type Index, Function Index, Top
+@unnumbered Variable Index
+
+@printindex vr
+
+@node Type Index, Concept Index, Variable Index, Top
+@unnumbered Type Index
+
+@printindex tp
+
+@node Concept Index, , Type Index, Top
+@unnumbered Concept Index
+
+@printindex cp
+
+@ifclear frontcontents
+@comment Use @setchapternewpage odd to ensure that the contents starts
+@comment on an odd page so that it can always be moved to the front when
+@comment printing two-up.
+@setchapternewpage odd
+@contents
+@end ifclear
+
+@ifset extrablankpages
+@comment final page must be blank for printed version
+@page
+@headings off
+@*
+@page
+@*
+@comment @page
+@comment @*
+@comment @page
+@comment @*
+@end ifset
+@bye
diff --git a/gsl-1.9/doc/gsl.3 b/gsl-1.9/doc/gsl.3
new file mode 100644
index 0000000..1f82292
--- /dev/null
+++ b/gsl-1.9/doc/gsl.3
@@ -0,0 +1,58 @@
+.TH GSL 3 "GNU Scientific Library" "GSL Team" \" -*- nroff -*-
+.SH NAME
+gsl - GNU Scientific Library
+.SH SYNOPSIS
+#include <gsl/...>
+.SH DESCRIPTION
+The GNU Scientific Library (GSL) is a collection of routines for
+numerical computing. The routines are written from scratch by the GSL
+team in C, and present a modern Applications Programming Interface
+(API) for C programmers, allowing wrappers to be written for very high
+level languages.
+.PP
+The library covers the following areas,
+.TP
+.nf
+.BR
+Complex Numbers
+Roots of Polynomials
+Special Functions
+Vectors and Matrices
+Permutations
+Combinations
+Sorting
+BLAS Support
+Linear Algebra
+Eigensystems
+Fast Fourier Transforms
+Quadrature
+Random Numbers
+Quasi-Random Sequences
+Random Distributions
+Statistics
+Histograms
+N-Tuples
+Monte Carlo Integration
+Simulated Annealing
+Differential Equations
+Interpolation
+Numerical Differentiation
+Chebyshev Approximations
+Series Acceleration
+Discrete Hankel Transforms
+Root-Finding
+Minimization
+Least-Squares Fitting
+Physical Constants
+IEEE Floating-Point
+.fi
+.PP
+For more information please consult the GSL Reference Manual, which is
+available as an info file. You can read it online using the shell
+command
+.B info gsl-ref
+(if the library is installed).
+.PP
+Please report any bugs to
+.B bug-gsl@gnu.org.
+
diff --git a/gsl-1.9/doc/histogram.eps b/gsl-1.9/doc/histogram.eps
new file mode 100644
index 0000000..93505f3
--- /dev/null
+++ b/gsl-1.9/doc/histogram.eps
@@ -0,0 +1,3088 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: GNU libplot drawing library 1.6
+%%Title: PostScript plot
+%%CreationDate: Sat Aug 18 20:49:32 2001
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 1
+%%Pages: 1
+%%PageOrder: Ascend
+%%Orientation: Portrait
+%%BoundingBox: 97 195 494 580
+%%DocumentNeededResources: font Helvetica
+%%DocumentSuppliedResources: procset GNU_libplot 1.0 0
+%%EndComments
+
+%%BeginDefaults
+%%PageResources: font Helvetica
+%%EndDefaults
+
+%%BeginProlog
+%%EndProlog
+
+%%BeginSetup
+%%IncludeResource: font Helvetica
+/DrawDict 50 dict def
+DrawDict begin
+/ISOLatin1Encoding [
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright
+/parenleft/parenright/asterisk/plus/comma/minus/period/slash
+/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon
+/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N
+/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright
+/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m
+/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/dotlessi/grave/acute/circumflex/tilde/macron/breve
+/dotaccent/dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut
+/ogonek/caron/space/exclamdown/cent/sterling/currency/yen/brokenbar
+/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot
+/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior
+/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine
+/guillemotright/onequarter/onehalf/threequarters/questiondown
+/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla
+/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex
+/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis
+/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute
+/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis
+/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave
+/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex
+/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis
+/yacute/thorn/ydieresis
+] def
+/reencodeISO {
+dup dup findfont dup length dict begin
+{ 1 index /FID ne { def }{ pop pop } ifelse } forall
+/Encoding ISOLatin1Encoding def
+currentdict end definefont
+} def
+/Helvetica reencodeISO def
+%%BeginResource procset GNU_libplot 1.0 0
+/none null def
+/numGraphicParameters 17 def
+/stringLimit 65535 def
+/arrowHeight 8 def
+/arrowWidth 4 def
+
+/Begin { save numGraphicParameters dict begin } def
+/End { end restore } def
+
+/SetB {
+dup type /nulltype eq {
+pop
+false /brushRightArrow idef
+false /brushLeftArrow idef
+true /brushNone idef
+} {
+/brushDashOffset idef
+/brushDashArray idef
+0 ne /brushRightArrow idef
+0 ne /brushLeftArrow idef
+/brushWidth idef
+false /brushNone idef
+} ifelse
+} def
+
+/SetCFg {
+/fgblue idef
+/fggreen idef
+/fgred idef
+} def
+
+/SetCBg {
+/bgblue idef
+/bggreen idef
+/bgred idef
+} def
+
+/SetF {
+/printSize idef
+/printFont idef
+} def
+
+/SetP {
+dup type /nulltype eq {
+pop true /patternNone idef
+} {
+/patternGrayLevel idef
+patternGrayLevel -1 eq {
+/patternString idef
+} if
+false /patternNone idef
+} ifelse
+} def
+
+/BSpl {
+0 begin
+storexyn
+newpath
+n 1 gt {
+0 0 0 0 0 0 1 1 true subspline
+n 2 gt {
+0 0 0 0 1 1 2 2 false subspline
+1 1 n 3 sub {
+/i exch def
+i 1 sub dup i dup i 1 add dup i 2 add dup false subspline
+} for
+n 3 sub dup n 2 sub dup n 1 sub dup 2 copy false subspline
+} if
+n 2 sub dup n 1 sub dup 2 copy 2 copy false subspline
+patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if
+brushNone not { istroke } if
+0 0 1 1 leftarrow
+n 2 sub dup 1 sub dup rightarrow
+} if
+end
+} dup 0 4 dict put def
+
+/Circ {
+newpath
+0 360 arc
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+} def
+
+/CBSpl {
+0 begin
+dup 2 gt {
+storexyn
+newpath
+n 1 sub dup 0 0 1 1 2 2 true subspline
+1 1 n 3 sub {
+/i exch def
+i 1 sub dup i dup i 1 add dup i 2 add dup false subspline
+} for
+n 3 sub dup n 2 sub dup n 1 sub dup 0 0 false subspline
+n 2 sub dup n 1 sub dup 0 0 1 1 false subspline
+patternNone not { ifill } if
+brushNone not { istroke } if
+} {
+Poly
+} ifelse
+end
+} dup 0 4 dict put def
+
+/Elli {
+0 begin
+newpath
+4 2 roll
+translate
+scale
+0 0 1 0 360 arc
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+end
+} dup 0 1 dict put def
+
+/Line {
+0 begin
+2 storexyn
+newpath
+x 0 get y 0 get moveto
+x 1 get y 1 get lineto
+brushNone not { istroke } if
+0 0 1 1 leftarrow
+0 0 1 1 rightarrow
+end
+} dup 0 4 dict put def
+
+/MLine {
+0 begin
+storexyn
+newpath
+n 1 gt {
+x 0 get y 0 get moveto
+1 1 n 1 sub {
+/i exch def
+x i get y i get lineto
+} for
+patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if
+brushNone not { istroke } if
+0 0 1 1 leftarrow
+n 2 sub dup n 1 sub dup rightarrow
+} if
+end
+} dup 0 4 dict put def
+
+/Poly {
+3 1 roll
+newpath
+moveto
+-1 add
+{ lineto } repeat
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+} def
+
+/Rect {
+0 begin
+/t exch def
+/r exch def
+/b exch def
+/l exch def
+newpath
+l b moveto
+l t lineto
+r t lineto
+r b lineto
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+end
+} dup 0 4 dict put def
+
+/Text {
+ishow
+} def
+
+/idef {
+dup where { pop pop pop } { exch def } ifelse
+} def
+
+/ifill {
+0 begin
+gsave
+patternGrayLevel -1 ne {
+fgred bgred fgred sub patternGrayLevel mul add
+fggreen bggreen fggreen sub patternGrayLevel mul add
+fgblue bgblue fgblue sub patternGrayLevel mul add setrgbcolor
+eofill
+} {
+eoclip
+originalCTM setmatrix
+pathbbox /t exch def /r exch def /b exch def /l exch def
+/w r l sub ceiling cvi def
+/h t b sub ceiling cvi def
+/imageByteWidth w 8 div ceiling cvi def
+/imageHeight h def
+bgred bggreen bgblue setrgbcolor
+eofill
+fgred fggreen fgblue setrgbcolor
+w 0 gt h 0 gt and {
+l b translate w h scale
+w h true [w 0 0 h neg 0 h] { patternproc } imagemask
+} if
+} ifelse
+grestore
+end
+} dup 0 8 dict put def
+
+/istroke {
+gsave
+brushDashOffset -1 eq {
+[] 0 setdash
+1 setgray
+} {
+brushDashArray brushDashOffset setdash
+fgred fggreen fgblue setrgbcolor
+} ifelse
+brushWidth setlinewidth
+originalCTM setmatrix
+stroke
+grestore
+} def
+
+/ishow {
+0 begin
+gsave
+fgred fggreen fgblue setrgbcolor
+/fontDict printFont findfont printSize scalefont dup setfont def
+/descender fontDict begin 0 /FontBBox load 1 get FontMatrix end
+transform exch pop def
+/vertoffset 1 printSize sub descender sub def {
+0 vertoffset moveto show
+/vertoffset vertoffset printSize sub def
+} forall
+grestore
+end
+} dup 0 3 dict put def
+
+/patternproc {
+0 begin
+/patternByteLength patternString length def
+/patternHeight patternByteLength 8 mul sqrt cvi def
+/patternWidth patternHeight def
+/patternByteWidth patternWidth 8 idiv def
+/imageByteMaxLength imageByteWidth imageHeight mul
+stringLimit patternByteWidth sub min def
+/imageMaxHeight imageByteMaxLength imageByteWidth idiv patternHeight idiv
+patternHeight mul patternHeight max def
+/imageHeight imageHeight imageMaxHeight sub store
+/imageString imageByteWidth imageMaxHeight mul patternByteWidth add string def
+0 1 imageMaxHeight 1 sub {
+/y exch def
+/patternRow y patternByteWidth mul patternByteLength mod def
+/patternRowString patternString patternRow patternByteWidth getinterval def
+/imageRow y imageByteWidth mul def
+0 patternByteWidth imageByteWidth 1 sub {
+/x exch def
+imageString imageRow x add patternRowString putinterval
+} for
+} for
+imageString
+end
+} dup 0 12 dict put def
+
+/min {
+dup 3 2 roll dup 4 3 roll lt { exch } if pop
+} def
+
+/max {
+dup 3 2 roll dup 4 3 roll gt { exch } if pop
+} def
+
+/midpoint {
+0 begin
+/y1 exch def
+/x1 exch def
+/y0 exch def
+/x0 exch def
+x0 x1 add 2 div
+y0 y1 add 2 div
+end
+} dup 0 4 dict put def
+
+/thirdpoint {
+0 begin
+/y1 exch def
+/x1 exch def
+/y0 exch def
+/x0 exch def
+x0 2 mul x1 add 3 div
+y0 2 mul y1 add 3 div
+end
+} dup 0 4 dict put def
+
+/subspline {
+0 begin
+/movetoNeeded exch def
+y exch get /y3 exch def
+x exch get /x3 exch def
+y exch get /y2 exch def
+x exch get /x2 exch def
+y exch get /y1 exch def
+x exch get /x1 exch def
+y exch get /y0 exch def
+x exch get /x0 exch def
+x1 y1 x2 y2 thirdpoint
+/p1y exch def
+/p1x exch def
+x2 y2 x1 y1 thirdpoint
+/p2y exch def
+/p2x exch def
+x1 y1 x0 y0 thirdpoint
+p1x p1y midpoint
+/p0y exch def
+/p0x exch def
+x2 y2 x3 y3 thirdpoint
+p2x p2y midpoint
+/p3y exch def
+/p3x exch def
+movetoNeeded { p0x p0y moveto } if
+p1x p1y p2x p2y p3x p3y curveto
+end
+} dup 0 17 dict put def
+
+/storexyn {
+/n exch def
+/y n array def
+/x n array def
+n 1 sub -1 0 {
+/i exch def
+y i 3 2 roll put
+x i 3 2 roll put
+} for
+} def
+
+/arrowhead {
+0 begin
+transform originalCTM itransform
+/taily exch def
+/tailx exch def
+transform originalCTM itransform
+/tipy exch def
+/tipx exch def
+/dy tipy taily sub def
+/dx tipx tailx sub def
+/angle dx 0 ne dy 0 ne or { dy dx atan } { 90 } ifelse def
+gsave
+originalCTM setmatrix
+tipx tipy translate
+angle rotate
+newpath
+arrowHeight neg arrowWidth 2 div moveto
+0 0 lineto
+arrowHeight neg arrowWidth 2 div neg lineto
+patternNone not {
+originalCTM setmatrix
+/padtip arrowHeight 2 exp 0.25 arrowWidth 2 exp mul add sqrt brushWidth mul
+arrowWidth div def
+/padtail brushWidth 2 div def
+tipx tipy translate
+angle rotate
+padtip 0 translate
+arrowHeight padtip add padtail add arrowHeight div dup scale
+arrowheadpath
+ifill
+} if
+brushNone not {
+originalCTM setmatrix
+tipx tipy translate
+angle rotate
+arrowheadpath
+istroke
+} if
+grestore
+end
+} dup 0 9 dict put def
+
+/arrowheadpath {
+newpath
+arrowHeight neg arrowWidth 2 div moveto
+0 0 lineto
+arrowHeight neg arrowWidth 2 div neg lineto
+} def
+
+/leftarrow {
+0 begin
+y exch get /taily exch def
+x exch get /tailx exch def
+y exch get /tipy exch def
+x exch get /tipx exch def
+brushLeftArrow { tipx tipy tailx taily arrowhead } if
+end
+} dup 0 4 dict put def
+
+/rightarrow {
+0 begin
+y exch get /tipy exch def
+x exch get /tipx exch def
+y exch get /taily exch def
+x exch get /tailx exch def
+brushRightArrow { tipx tipy tailx taily arrowhead } if
+end
+} dup 0 4 dict put def
+%%EndResource
+%%EndSetup
+
+%%Page: 1 1
+%%PageResources: font Helvetica
+%%PageBoundingBox: 97 195 494 580
+%%BeginPageSetup
+%I Idraw 8
+
+Begin
+%I b u
+%I cfg u
+%I cbg u
+%I f u
+%I p u
+%I t
+[ 1 0 0 1 0 0 ] concat
+/originalCTM matrix currentmatrix def
+/trueoriginalCTM matrix currentmatrix def
+%%EndPageSetup
+
+Begin %I Poly
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+2304 2304
+2304 9216
+9216 9216
+9216 2304
+4 Poly
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 112.7699 213.1332 ] concat
+%I
+[
+(-100)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 9216
+2304 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2304 2442
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 204.2139 213.1332 ] concat
+%I
+[
+(-50)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4032 9216
+4032 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4032 2304
+4032 2442
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 300.956 213.1332 ] concat
+%I
+[
+(0)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5760 9216
+5760 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5760 2304
+5760 2442
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 382.3119 213.1332 ] concat
+%I
+[
+(50)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7488 9216
+7488 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7488 2304
+7488 2442
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 463.6679 213.1332 ] concat
+%I
+[
+(100)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 9216
+9216 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2304
+9216 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 9216
+2304 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2304 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2650 9216
+2650 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2650 2304
+2650 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2995 9216
+2995 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2995 2304
+2995 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3341 9216
+3341 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3341 2304
+3341 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3686 9216
+3686 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3686 2304
+3686 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4032 9216
+4032 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4032 2304
+4032 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4378 9216
+4378 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4378 2304
+4378 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4723 9216
+4723 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4723 2304
+4723 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5069 9216
+5069 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5069 2304
+5069 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5414 9216
+5414 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5414 2304
+5414 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5760 9216
+5760 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5760 2304
+5760 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6106 9216
+6106 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6106 2304
+6106 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6451 9216
+6451 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6451 2304
+6451 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6797 9216
+6797 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6797 2304
+6797 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7142 9216
+7142 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7142 2304
+7142 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7488 9216
+7488 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7488 2304
+7488 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7834 9216
+7834 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7834 2304
+7834 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8179 9216
+8179 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8179 2304
+8179 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8525 9216
+8525 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8525 2304
+8525 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8870 9216
+8870 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8870 2304
+8870 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 9216
+9216 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2304
+9216 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 34952
+1 0 0 [ 1 3 1 3 ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5760 2304
+5760 9216
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 117.9279 229.3306 ] concat
+%I
+[
+(0)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2304
+9078 2304
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2442 2304
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 107.8399 278.702 ] concat
+%I
+[
+(20)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 3291
+9078 3291
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3291
+2442 3291
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 107.8399 328.0734 ] concat
+%I
+[
+(40)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4279
+9078 4279
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4279
+2442 4279
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 107.8399 377.4449 ] concat
+%I
+[
+(60)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5266
+9078 5266
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5266
+2442 5266
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 107.8399 426.8163 ] concat
+%I
+[
+(80)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 6254
+9078 6254
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 6254
+2442 6254
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 97.75181 476.1877 ] concat
+%I
+[
+(100)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 7241
+9078 7241
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 7241
+2442 7241
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 97.75181 525.5592 ] concat
+%I
+[
+(120)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 8229
+9078 8229
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 8229
+2442 8229
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 97.75181 574.9306 ] concat
+%I
+[
+(140)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 9216
+9078 9216
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 9216
+2442 9216
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2304
+9161 2304
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2359 2304
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2798
+9161 2798
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2798
+2359 2798
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 3291
+9161 3291
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3291
+2359 3291
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 3785
+9161 3785
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3785
+2359 3785
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4279
+9161 4279
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4279
+2359 4279
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4773
+9161 4773
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4773
+2359 4773
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5266
+9161 5266
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5266
+2359 5266
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5760
+9161 5760
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5760
+2359 5760
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 6254
+9161 6254
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 6254
+2359 6254
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 6747
+9161 6747
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 6747
+2359 6747
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 7241
+9161 7241
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 7241
+2359 7241
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 7735
+9161 7735
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 7735
+2359 7735
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 8229
+9161 8229
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 8229
+2359 8229
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 8722
+9161 8722
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 8722
+2359 8722
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 9216
+9161 9216
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 9216
+2359 9216
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 400
+2304 2748
+2339 2748
+2339 2501
+2373 2501
+2373 2896
+2408 2896
+2408 2896
+2442 2896
+2442 2896
+2477 2896
+2477 2650
+2511 2650
+2511 2650
+2546 2650
+2546 2896
+2580 2896
+2580 2896
+2615 2896
+2615 2650
+2650 2650
+2650 2551
+2684 2551
+2684 2847
+2719 2847
+2719 2650
+2753 2650
+2753 2847
+2788 2847
+2788 2995
+2822 2995
+2822 2896
+2857 2896
+2857 3291
+2892 3291
+2892 2650
+2926 2650
+2926 3291
+2961 3291
+2961 3094
+2995 3094
+2995 2798
+3030 2798
+3030 3045
+3064 3045
+3064 2896
+3099 2896
+3099 2847
+3133 2847
+3133 3143
+3168 3143
+3168 3193
+3203 3193
+3203 2748
+3237 2748
+3237 3193
+3272 3193
+3272 2896
+3306 2896
+3306 3390
+3341 3390
+3341 2995
+3375 2995
+3375 3143
+3410 3143
+3410 3242
+3444 3242
+3444 3440
+3479 3440
+3479 3291
+3514 3291
+3514 2995
+3548 2995
+3548 2748
+3583 2748
+3583 3193
+3617 3193
+3617 3094
+3652 3094
+3652 3291
+3686 3291
+3686 3143
+3721 3143
+3721 3785
+3756 3785
+3756 3341
+3790 3341
+3790 3637
+3825 3637
+3825 3983
+3859 3983
+3859 3440
+3894 3440
+3894 3538
+3928 3538
+3928 3538
+3963 3538
+3963 3736
+3997 3736
+3997 3588
+4032 3588
+4032 3538
+4067 3538
+4067 3390
+4101 3390
+4101 4279
+4136 4279
+4136 3686
+4170 3686
+4170 4476
+4205 4476
+4205 4032
+4239 4032
+4239 4328
+4274 4328
+4274 4081
+4308 4081
+4308 4773
+4343 4773
+4343 5168
+4378 5168
+4378 4032
+4412 4032
+4412 4229
+4447 4229
+4447 4476
+4481 4476
+4481 4921
+4516 4921
+4516 4180
+4550 4180
+4550 4378
+4585 4378
+4585 4871
+4620 4871
+4620 4921
+4654 4921
+4654 4180
+4689 4180
+4689 4526
+4723 4526
+4723 5464
+4758 5464
+4758 5711
+4792 5711
+4792 5563
+4827 5563
+4827 5316
+4861 5316
+4861 5217
+4896 5217
+4896 5908
+4931 5908
+4931 4921
+4965 4921
+4965 6106
+5000 6106
+5000 5612
+5034 5612
+5034 6056
+5069 6056
+5069 5908
+5103 5908
+5103 6204
+5138 6204
+5138 6698
+5172 6698
+5172 6994
+5207 6994
+5207 7044
+5242 7044
+5242 6994
+5276 6994
+5276 6599
+5311 6599
+5311 6846
+5345 6846
+5345 7093
+5380 7093
+5380 7636
+5414 7636
+5414 6056
+5449 6056
+5449 7340
+5484 7340
+5484 6994
+5518 6994
+5518 7439
+5553 7439
+5553 7241
+5587 7241
+5587 7192
+5622 7192
+5622 7932
+5656 7932
+5656 7389
+5691 7389
+5691 7192
+5725 7192
+5725 7340
+5760 7340
+5760 6550
+5795 6550
+5795 8278
+5829 8278
+5829 6994
+5864 6994
+5864 7291
+5898 7291
+5898 7636
+5933 7636
+5933 7241
+5967 7241
+5967 6945
+6002 6945
+6002 7537
+6036 7537
+6036 7587
+6071 7587
+6071 7241
+6106 7241
+6106 6599
+6140 6599
+6140 7587
+6175 7587
+6175 7932
+6209 7932
+6209 5859
+6244 5859
+6244 7340
+6278 7340
+6278 5661
+6313 5661
+6313 6352
+6348 6352
+6348 6303
+6382 6303
+6382 6254
+6417 6254
+6417 5957
+6451 5957
+6451 6106
+6486 6106
+6486 5414
+6520 5414
+6520 4773
+6555 4773
+6555 5019
+6589 5019
+6589 5563
+6624 5563
+6624 5661
+6659 5661
+6659 4822
+6693 4822
+6693 5266
+6728 5266
+6728 5266
+6762 5266
+6762 5069
+6797 5069
+6797 5168
+6831 5168
+6831 4229
+6866 4229
+6866 4526
+6900 4526
+6900 4674
+6935 4674
+6935 4921
+6970 4921
+6970 3835
+7004 3835
+7004 4229
+7039 4229
+7039 3983
+7073 3983
+7073 3835
+7108 3835
+7108 4279
+7142 4279
+7142 4229
+7177 4229
+7177 3884
+7212 3884
+7212 4427
+7246 4427
+7246 3637
+7281 3637
+7281 3983
+7315 3983
+7315 3637
+7350 3637
+7350 3686
+7384 3686
+7384 3884
+7419 3884
+7419 3538
+7453 3538
+7453 3637
+7488 3637
+7488 3785
+7523 3785
+7523 3291
+7557 3291
+7557 3835
+7592 3835
+7592 3045
+7626 3045
+7626 3390
+7661 3390
+7661 3736
+7695 3736
+7695 3785
+7730 3785
+7730 3440
+7764 3440
+7764 2946
+7799 2946
+7799 3094
+7834 3094
+7834 3045
+7868 3045
+7868 3094
+7903 3094
+7903 3686
+7937 3686
+7937 3242
+7972 3242
+7972 3686
+8006 3686
+8006 3242
+8041 3242
+8041 3637
+8076 3637
+8076 3242
+8110 3242
+8110 3143
+8145 3143
+8145 3143
+8179 3143
+8179 3291
+8214 3291
+8214 3094
+8248 3094
+8248 3045
+8283 3045
+8283 2896
+8317 2896
+8317 2748
+8352 2748
+8352 3440
+8387 3440
+8387 3045
+8421 3045
+8421 2798
+8456 2798
+8456 3143
+8490 3143
+8490 2798
+8525 2798
+8525 3045
+8559 3045
+8559 2551
+8594 2551
+8594 2798
+8628 2798
+8628 2995
+8663 2995
+8663 2946
+8698 2946
+8698 2699
+8732 2699
+8732 3045
+8767 3045
+8767 3094
+8801 3094
+8801 2650
+8836 2650
+8836 2798
+8870 2798
+8870 3045
+8905 3045
+8905 3045
+8940 3045
+8940 2798
+8974 2798
+8974 2748
+9009 2748
+9009 2798
+9043 2798
+9043 2650
+9078 2650
+9078 2650
+9112 2650
+9112 2995
+9147 2995
+9147 2847
+9181 2847
+9181 2748
+9216 2748
+400 MLine
+End
+
+%%PageTrailer
+End %I eop
+showpage
+
+%%Trailer
+end
+%%EOF
diff --git a/gsl-1.9/doc/histogram.texi b/gsl-1.9/doc/histogram.texi
new file mode 100644
index 0000000..f2fe423
--- /dev/null
+++ b/gsl-1.9/doc/histogram.texi
@@ -0,0 +1,1173 @@
+@cindex histograms
+@cindex binning data
+This chapter describes functions for creating histograms. Histograms
+provide a convenient way of summarizing the distribution of a set of
+data. A histogram consists of a set of @dfn{bins} which count the number
+of events falling into a given range of a continuous variable @math{x}.
+In GSL the bins of a histogram contain floating-point numbers, so they
+can be used to record both integer and non-integer distributions. The
+bins can use arbitrary sets of ranges (uniformly spaced bins are the
+default). Both one and two-dimensional histograms are supported.
+
+Once a histogram has been created it can also be converted into a
+probability distribution function. The library provides efficient
+routines for selecting random samples from probability distributions.
+This can be useful for generating simulations based on real data.
+
+The functions are declared in the header files @file{gsl_histogram.h}
+and @file{gsl_histogram2d.h}.
+
+@menu
+* The histogram struct::
+* Histogram allocation::
+* Copying Histograms::
+* Updating and accessing histogram elements::
+* Searching histogram ranges::
+* Histogram Statistics::
+* Histogram Operations::
+* Reading and writing histograms::
+* Resampling from histograms::
+* The histogram probability distribution struct::
+* Example programs for histograms::
+* Two dimensional histograms::
+* The 2D histogram struct::
+* 2D Histogram allocation::
+* Copying 2D Histograms::
+* Updating and accessing 2D histogram elements::
+* Searching 2D histogram ranges::
+* 2D Histogram Statistics::
+* 2D Histogram Operations::
+* Reading and writing 2D histograms::
+* Resampling from 2D histograms::
+* Example programs for 2D histograms::
+@end menu
+
+@node The histogram struct
+@section The histogram struct
+
+A histogram is defined by the following struct,
+
+@deftp {Data Type} {gsl_histogram}
+@table @code
+@item size_t n
+This is the number of histogram bins
+@item double * range
+The ranges of the bins are stored in an array of @math{@var{n}+1} elements
+pointed to by @var{range}.
+@item double * bin
+The counts for each bin are stored in an array of @var{n} elements
+pointed to by @var{bin}. The bins are floating-point numbers, so you can
+increment them by non-integer values if necessary.
+@end table
+@end deftp
+@comment
+
+@noindent
+The range for @var{bin}[i] is given by @var{range}[i] to
+@var{range}[i+1]. For @math{n} bins there are @math{n+1} entries in the
+array @var{range}. Each bin is inclusive at the lower end and exclusive
+at the upper end. Mathematically this means that the bins are defined by
+the following inequality,
+@tex
+\beforedisplay
+$$
+\hbox{bin[i] corresponds to range[i]} \le x < \hbox{range[i+1]}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+@display
+bin[i] corresponds to range[i] <= x < range[i+1]
+@end display
+
+@end ifinfo
+@noindent
+Here is a diagram of the correspondence between ranges and bins on the
+number-line for @math{x},
+
+@smallexample
+
+ [ bin[0] )[ bin[1] )[ bin[2] )[ bin[3] )[ bin[4] )
+ ---|---------|---------|---------|---------|---------|--- x
+ r[0] r[1] r[2] r[3] r[4] r[5]
+
+@end smallexample
+
+@noindent
+In this picture the values of the @var{range} array are denoted by
+@math{r}. On the left-hand side of each bin the square bracket
+@samp{[} denotes an inclusive lower bound
+(@c{$r \le x$}
+@math{r <= x}), and the round parentheses @samp{)} on the right-hand
+side denote an exclusive upper bound (@math{x < r}). Thus any samples
+which fall on the upper end of the histogram are excluded. If you want
+to include this value for the last bin you will need to add an extra bin
+to your histogram.
+
+The @code{gsl_histogram} struct and its associated functions are defined
+in the header file @file{gsl_histogram.h}.
+
+@node Histogram allocation
+@section Histogram allocation
+The functions for allocating memory to a histogram follow the style of
+@code{malloc} and @code{free}. In addition they also perform their own
+error checking. If there is insufficient memory available to allocate a
+histogram then the functions call the error handler (with an error
+number of @code{GSL_ENOMEM}) in addition to returning a null pointer.
+Thus if you use the library error handler to abort your program then it
+isn't necessary to check every histogram @code{alloc}.
+
+@deftypefun {gsl_histogram *} gsl_histogram_alloc (size_t @var{n})
+This function allocates memory for a histogram with @var{n} bins, and
+returns a pointer to a newly created @code{gsl_histogram} struct. If
+insufficient memory is available a null pointer is returned and the
+error handler is invoked with an error code of @code{GSL_ENOMEM}. The
+bins and ranges are not initialized, and should be prepared using one of
+the range-setting functions below in order to make the histogram ready
+for use.
+@end deftypefun
+
+@comment @deftypefun {gsl_histogram *} gsl_histogram_calloc (size_t @var{n})
+@comment This function allocates memory for a histogram with @var{n} bins, and
+@comment returns a pointer to its newly initialized @code{gsl_histogram} struct.
+@comment The bins are uniformly spaced with a total range of
+@comment @c{$0 \le x < n$}
+@comment @math{0 <= x < n},
+@comment as shown in the table below.
+
+@comment @tex
+@comment \beforedisplay
+@comment $$
+@comment \matrix{
+@comment \hbox{bin[0]}&\hbox{corresponds to}& 0 \le x < 1\cr
+@comment \hbox{bin[1]}&\hbox{corresponds to}& 1 \le x < 2\cr
+@comment \dots&\dots&\dots\cr
+@comment \hbox{bin[n-1]}&\hbox{corresponds to}&n-1 \le x < n}
+@comment $$
+@comment \afterdisplay
+@comment @end tex
+@comment @ifinfo
+@comment @display
+@comment bin[0] corresponds to 0 <= x < 1
+@comment bin[1] corresponds to 1 <= x < 2
+@comment @dots{}
+@comment bin[n-1] corresponds to n-1 <= x < n
+@comment @end display
+@comment @end ifinfo
+@comment @noindent
+@comment The bins are initialized to zero so the histogram is ready for use.
+
+@comment If insufficient memory is available a null pointer is returned and the
+@comment error handler is invoked with an error code of @code{GSL_ENOMEM}.
+@comment @end deftypefun
+
+@comment @deftypefun {gsl_histogram *} gsl_histogram_calloc_uniform (size_t @var{n}, double @var{xmin}, double @var{xmax})
+@comment This function allocates memory for a histogram with @var{n} uniformly
+@comment spaced bins from @var{xmin} to @var{xmax}, and returns a pointer to the
+@comment newly initialized @code{gsl_histogram} struct.
+@comment If insufficient memory is available a null pointer is returned and the
+@comment error handler is invoked with an error code of @code{GSL_ENOMEM}.
+@comment @end deftypefun
+
+@comment @deftypefun {gsl_histogram *} gsl_histogram_calloc_range (size_t @var{n}, double * @var{range})
+@comment This function allocates a histogram of size @var{n} using the @math{n+1}
+@comment bin ranges specified by the array @var{range}.
+@comment @end deftypefun
+
+@deftypefun int gsl_histogram_set_ranges (gsl_histogram * @var{h}, const double @var{range}[], size_t @var{size})
+This function sets the ranges of the existing histogram @var{h} using
+the array @var{range} of size @var{size}. The values of the histogram
+bins are reset to zero. The @code{range} array should contain the
+desired bin limits. The ranges can be arbitrary, subject to the
+restriction that they are monotonically increasing.
+
+The following example shows how to create a histogram with logarithmic
+bins with ranges [1,10), [10,100) and [100,1000).
+
+@example
+gsl_histogram * h = gsl_histogram_alloc (3);
+
+/* bin[0] covers the range 1 <= x < 10 */
+/* bin[1] covers the range 10 <= x < 100 */
+/* bin[2] covers the range 100 <= x < 1000 */
+
+double range[4] = @{ 1.0, 10.0, 100.0, 1000.0 @};
+
+gsl_histogram_set_ranges (h, range, 4);
+@end example
+
+@noindent
+Note that the size of the @var{range} array should be defined to be one
+element bigger than the number of bins. The additional element is
+required for the upper value of the final bin.
+@end deftypefun
+
+@deftypefun int gsl_histogram_set_ranges_uniform (gsl_histogram * @var{h}, double @var{xmin}, double @var{xmax})
+This function sets the ranges of the existing histogram @var{h} to cover
+the range @var{xmin} to @var{xmax} uniformly. The values of the
+histogram bins are reset to zero. The bin ranges are shown in the table
+below,
+@tex
+\beforedisplay
+$$
+\matrix{\hbox{bin[0]}&\hbox{corresponds to}& xmin \le x < xmin + d\cr
+\hbox{bin[1]} &\hbox{corresponds to}& xmin + d \le x < xmin + 2 d\cr
+\dots&\dots&\dots\cr
+\hbox{bin[n-1]} & \hbox{corresponds to}& xmin + (n-1)d \le x < xmax}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+@display
+bin[0] corresponds to xmin <= x < xmin + d
+bin[1] corresponds to xmin + d <= x < xmin + 2 d
+......
+bin[n-1] corresponds to xmin + (n-1)d <= x < xmax
+@end display
+
+@end ifinfo
+@noindent
+where @math{d} is the bin spacing, @math{d = (xmax-xmin)/n}.
+@end deftypefun
+
+@deftypefun void gsl_histogram_free (gsl_histogram * @var{h})
+This function frees the histogram @var{h} and all of the memory
+associated with it.
+@end deftypefun
+
+@node Copying Histograms
+@section Copying Histograms
+
+@deftypefun int gsl_histogram_memcpy (gsl_histogram * @var{dest}, const gsl_histogram * @var{src})
+This function copies the histogram @var{src} into the pre-existing
+histogram @var{dest}, making @var{dest} into an exact copy of @var{src}.
+The two histograms must be of the same size.
+@end deftypefun
+
+@deftypefun {gsl_histogram *} gsl_histogram_clone (const gsl_histogram * @var{src})
+This function returns a pointer to a newly created histogram which is an
+exact copy of the histogram @var{src}.
+@end deftypefun
+
+@node Updating and accessing histogram elements
+@section Updating and accessing histogram elements
+
+There are two ways to access histogram bins, either by specifying an
+@math{x} coordinate or by using the bin-index directly. The functions
+for accessing the histogram through @math{x} coordinates use a binary
+search to identify the bin which covers the appropriate range.
+
+@deftypefun int gsl_histogram_increment (gsl_histogram * @var{h}, double @var{x})
+This function updates the histogram @var{h} by adding one (1.0) to the
+bin whose range contains the coordinate @var{x}.
+
+If @var{x} lies in the valid range of the histogram then the function
+returns zero to indicate success. If @var{x} is less than the lower
+limit of the histogram then the function returns @code{GSL_EDOM}, and
+none of bins are modified. Similarly, if the value of @var{x} is greater
+than or equal to the upper limit of the histogram then the function
+returns @code{GSL_EDOM}, and none of the bins are modified. The error
+handler is not called, however, since it is often necessary to compute
+histograms for a small range of a larger dataset, ignoring the values
+outside the range of interest.
+@end deftypefun
+
+@deftypefun int gsl_histogram_accumulate (gsl_histogram * @var{h}, double @var{x}, double @var{weight})
+This function is similar to @code{gsl_histogram_increment} but increases
+the value of the appropriate bin in the histogram @var{h} by the
+floating-point number @var{weight}.
+@end deftypefun
+
+@deftypefun double gsl_histogram_get (const gsl_histogram * @var{h}, size_t @var{i})
+This function returns the contents of the @var{i}-th bin of the histogram
+@var{h}. If @var{i} lies outside the valid range of indices for the
+histogram then the error handler is called with an error code of
+@code{GSL_EDOM} and the function returns 0.
+@end deftypefun
+
+@deftypefun int gsl_histogram_get_range (const gsl_histogram * @var{h}, size_t @var{i}, double * @var{lower}, double * @var{upper})
+This function finds the upper and lower range limits of the @var{i}-th
+bin of the histogram @var{h}. If the index @var{i} is valid then the
+corresponding range limits are stored in @var{lower} and @var{upper}.
+The lower limit is inclusive (i.e. events with this coordinate are
+included in the bin) and the upper limit is exclusive (i.e. events with
+the coordinate of the upper limit are excluded and fall in the
+neighboring higher bin, if it exists). The function returns 0 to
+indicate success. If @var{i} lies outside the valid range of indices for
+the histogram then the error handler is called and the function returns
+an error code of @code{GSL_EDOM}.
+@end deftypefun
+
+@deftypefun double gsl_histogram_max (const gsl_histogram * @var{h})
+@deftypefunx double gsl_histogram_min (const gsl_histogram * @var{h})
+@deftypefunx size_t gsl_histogram_bins (const gsl_histogram * @var{h})
+These functions return the maximum upper and minimum lower range limits
+and the number of bins of the histogram @var{h}. They provide a way of
+determining these values without accessing the @code{gsl_histogram}
+struct directly.
+@end deftypefun
+
+@deftypefun void gsl_histogram_reset (gsl_histogram * @var{h})
+This function resets all the bins in the histogram @var{h} to zero.
+@end deftypefun
+
+@node Searching histogram ranges
+@section Searching histogram ranges
+
+The following functions are used by the access and update routines to
+locate the bin which corresponds to a given @math{x} coordinate.
+
+@deftypefun int gsl_histogram_find (const gsl_histogram * @var{h}, double @var{x}, size_t * @var{i})
+This function finds and sets the index @var{i} to the bin number which
+covers the coordinate @var{x} in the histogram @var{h}. The bin is
+located using a binary search. The search includes an optimization for
+histograms with uniform range, and will return the correct bin
+immediately in this case. If @var{x} is found in the range of the
+histogram then the function sets the index @var{i} and returns
+@code{GSL_SUCCESS}. If @var{x} lies outside the valid range of the
+histogram then the function returns @code{GSL_EDOM} and the error
+handler is invoked.
+@end deftypefun
+
+@node Histogram Statistics
+@section Histogram Statistics
+@cindex histogram statistics
+@cindex statistics, from histogram
+@cindex maximum value, from histogram
+@cindex minimum value, from histogram
+@deftypefun double gsl_histogram_max_val (const gsl_histogram * @var{h})
+This function returns the maximum value contained in the histogram bins.
+@end deftypefun
+
+@deftypefun size_t gsl_histogram_max_bin (const gsl_histogram * @var{h})
+This function returns the index of the bin containing the maximum
+value. In the case where several bins contain the same maximum value the
+smallest index is returned.
+@end deftypefun
+
+@deftypefun double gsl_histogram_min_val (const gsl_histogram * @var{h})
+This function returns the minimum value contained in the histogram bins.
+@end deftypefun
+
+@deftypefun size_t gsl_histogram_min_bin (const gsl_histogram * @var{h})
+This function returns the index of the bin containing the minimum
+value. In the case where several bins contain the same maximum value the
+smallest index is returned.
+@end deftypefun
+
+@cindex mean value, from histogram
+@deftypefun double gsl_histogram_mean (const gsl_histogram * @var{h})
+This function returns the mean of the histogrammed variable, where the
+histogram is regarded as a probability distribution. Negative bin values
+are ignored for the purposes of this calculation. The accuracy of the
+result is limited by the bin width.
+@end deftypefun
+
+@cindex standard deviation, from histogram
+@cindex variance, from histogram
+@deftypefun double gsl_histogram_sigma (const gsl_histogram * @var{h})
+This function returns the standard deviation of the histogrammed
+variable, where the histogram is regarded as a probability
+distribution. Negative bin values are ignored for the purposes of this
+calculation. The accuracy of the result is limited by the bin width.
+@end deftypefun
+
+@deftypefun double gsl_histogram_sum (const gsl_histogram * @var{h})
+This function returns the sum of all bin values. Negative bin values
+are included in the sum.
+@end deftypefun
+
+@node Histogram Operations
+@section Histogram Operations
+
+@deftypefun int gsl_histogram_equal_bins_p (const gsl_histogram * @var{h1}, const gsl_histogram * @var{h2})
+This function returns 1 if the all of the individual bin
+ranges of the two histograms are identical, and 0
+otherwise.
+@end deftypefun
+
+@deftypefun int gsl_histogram_add (gsl_histogram * @var{h1}, const gsl_histogram * @var{h2})
+This function adds the contents of the bins in histogram @var{h2} to the
+corresponding bins of histogram @var{h1}, i.e. @math{h'_1(i) = h_1(i) +
+h_2(i)}. The two histograms must have identical bin ranges.
+@end deftypefun
+
+@deftypefun int gsl_histogram_sub (gsl_histogram * @var{h1}, const gsl_histogram * @var{h2})
+This function subtracts the contents of the bins in histogram @var{h2}
+from the corresponding bins of histogram @var{h1}, i.e. @math{h'_1(i) =
+h_1(i) - h_2(i)}. The two histograms must have identical bin ranges.
+@end deftypefun
+
+@deftypefun int gsl_histogram_mul (gsl_histogram * @var{h1}, const gsl_histogram * @var{h2})
+This function multiplies the contents of the bins of histogram @var{h1}
+by the contents of the corresponding bins in histogram @var{h2},
+i.e. @math{h'_1(i) = h_1(i) * h_2(i)}. The two histograms must have
+identical bin ranges.
+@end deftypefun
+
+@deftypefun int gsl_histogram_div (gsl_histogram * @var{h1}, const gsl_histogram * @var{h2})
+This function divides the contents of the bins of histogram @var{h1} by
+the contents of the corresponding bins in histogram @var{h2},
+i.e. @math{h'_1(i) = h_1(i) / h_2(i)}. The two histograms must have
+identical bin ranges.
+@end deftypefun
+
+@deftypefun int gsl_histogram_scale (gsl_histogram * @var{h}, double @var{scale})
+This function multiplies the contents of the bins of histogram @var{h}
+by the constant @var{scale}, i.e. @c{$h'_1(i) = h_1(i) * \hbox{\it scale}$}
+@math{h'_1(i) = h_1(i) * scale}.
+@end deftypefun
+
+@deftypefun int gsl_histogram_shift (gsl_histogram * @var{h}, double @var{offset})
+This function shifts the contents of the bins of histogram @var{h} by
+the constant @var{offset}, i.e. @c{$h'_1(i) = h_1(i) + \hbox{\it offset}$}
+@math{h'_1(i) = h_1(i) + offset}.
+@end deftypefun
+
+@node Reading and writing histograms
+@section Reading and writing histograms
+
+The library provides functions for reading and writing histograms to a file
+as binary data or formatted text.
+
+@deftypefun int gsl_histogram_fwrite (FILE * @var{stream}, const gsl_histogram * @var{h})
+This function writes the ranges and bins of the histogram @var{h} to the
+stream @var{stream} in binary format. The return value is 0 for success
+and @code{GSL_EFAILED} if there was a problem writing to the file. Since
+the data is written in the native binary format it may not be portable
+between different architectures.
+@end deftypefun
+
+@deftypefun int gsl_histogram_fread (FILE * @var{stream}, gsl_histogram * @var{h})
+This function reads into the histogram @var{h} from the open stream
+@var{stream} in binary format. The histogram @var{h} must be
+preallocated with the correct size since the function uses the number of
+bins in @var{h} to determine how many bytes to read. The return value is
+0 for success and @code{GSL_EFAILED} if there was a problem reading from
+the file. The data is assumed to have been written in the native binary
+format on the same architecture.
+@end deftypefun
+
+@deftypefun int gsl_histogram_fprintf (FILE * @var{stream}, const gsl_histogram * @var{h}, const char * @var{range_format}, const char * @var{bin_format})
+This function writes the ranges and bins of the histogram @var{h}
+line-by-line to the stream @var{stream} using the format specifiers
+@var{range_format} and @var{bin_format}. These should be one of the
+@code{%g}, @code{%e} or @code{%f} formats for floating point
+numbers. The function returns 0 for success and @code{GSL_EFAILED} if
+there was a problem writing to the file. The histogram output is
+formatted in three columns, and the columns are separated by spaces,
+like this,
+
+@example
+range[0] range[1] bin[0]
+range[1] range[2] bin[1]
+range[2] range[3] bin[2]
+....
+range[n-1] range[n] bin[n-1]
+@end example
+
+@noindent
+The values of the ranges are formatted using @var{range_format} and the
+value of the bins are formatted using @var{bin_format}. Each line
+contains the lower and upper limit of the range of the bins and the
+value of the bin itself. Since the upper limit of one bin is the lower
+limit of the next there is duplication of these values between lines but
+this allows the histogram to be manipulated with line-oriented tools.
+@end deftypefun
+
+@deftypefun int gsl_histogram_fscanf (FILE * @var{stream}, gsl_histogram * @var{h})
+This function reads formatted data from the stream @var{stream} into the
+histogram @var{h}. The data is assumed to be in the three-column format
+used by @code{gsl_histogram_fprintf}. The histogram @var{h} must be
+preallocated with the correct length since the function uses the size of
+@var{h} to determine how many numbers to read. The function returns 0
+for success and @code{GSL_EFAILED} if there was a problem reading from
+the file.
+@end deftypefun
+
+@node Resampling from histograms
+@section Resampling from histograms
+@cindex resampling from histograms
+@cindex sampling from histograms
+@cindex probability distributions, from histograms
+
+A histogram made by counting events can be regarded as a measurement of
+a probability distribution. Allowing for statistical error, the height
+of each bin represents the probability of an event where the value of
+@math{x} falls in the range of that bin. The probability distribution
+function has the one-dimensional form @math{p(x)dx} where,
+@tex
+\beforedisplay
+$$
+p(x) = n_i/ (N w_i)
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+p(x) = n_i/ (N w_i)
+@end example
+
+@end ifinfo
+@noindent
+In this equation @math{n_i} is the number of events in the bin which
+contains @math{x}, @math{w_i} is the width of the bin and @math{N} is
+the total number of events. The distribution of events within each bin
+is assumed to be uniform.
+
+@node The histogram probability distribution struct
+@section The histogram probability distribution struct
+@cindex probability distribution, from histogram
+@cindex sampling from histograms
+@cindex random sampling from histograms
+@cindex histograms, random sampling from
+The probability distribution function for a histogram consists of a set
+of @dfn{bins} which measure the probability of an event falling into a
+given range of a continuous variable @math{x}. A probability
+distribution function is defined by the following struct, which actually
+stores the cumulative probability distribution function. This is the
+natural quantity for generating samples via the inverse transform
+method, because there is a one-to-one mapping between the cumulative
+probability distribution and the range [0,1]. It can be shown that by
+taking a uniform random number in this range and finding its
+corresponding coordinate in the cumulative probability distribution we
+obtain samples with the desired probability distribution.
+
+@deftp {Data Type} {gsl_histogram_pdf}
+@table @code
+@item size_t n
+This is the number of bins used to approximate the probability
+distribution function.
+@item double * range
+The ranges of the bins are stored in an array of @math{@var{n}+1} elements
+pointed to by @var{range}.
+@item double * sum
+The cumulative probability for the bins is stored in an array of
+@var{n} elements pointed to by @var{sum}.
+@end table
+@end deftp
+@comment
+
+@noindent
+The following functions allow you to create a @code{gsl_histogram_pdf}
+struct which represents this probability distribution and generate
+random samples from it.
+
+@deftypefun {gsl_histogram_pdf *} gsl_histogram_pdf_alloc (size_t @var{n})
+This function allocates memory for a probability distribution with
+@var{n} bins and returns a pointer to a newly initialized
+@code{gsl_histogram_pdf} struct. If insufficient memory is available a
+null pointer is returned and the error handler is invoked with an error
+code of @code{GSL_ENOMEM}.
+@end deftypefun
+
+@deftypefun int gsl_histogram_pdf_init (gsl_histogram_pdf * @var{p}, const gsl_histogram * @var{h})
+This function initializes the probability distribution @var{p} with
+the contents of the histogram @var{h}. If any of the bins of @var{h} are
+negative then the error handler is invoked with an error code of
+@code{GSL_EDOM} because a probability distribution cannot contain
+negative values.
+@end deftypefun
+
+@deftypefun void gsl_histogram_pdf_free (gsl_histogram_pdf * @var{p})
+This function frees the probability distribution function @var{p} and
+all of the memory associated with it.
+@end deftypefun
+
+@deftypefun double gsl_histogram_pdf_sample (const gsl_histogram_pdf * @var{p}, double @var{r})
+This function uses @var{r}, a uniform random number between zero and
+one, to compute a single random sample from the probability distribution
+@var{p}. The algorithm used to compute the sample @math{s} is given by
+the following formula,
+@tex
+\beforedisplay
+$$
+s = \hbox{range}[i] + \delta * (\hbox{range}[i+1] - \hbox{range}[i])
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+s = range[i] + delta * (range[i+1] - range[i])
+@end example
+
+@end ifinfo
+@noindent
+where @math{i} is the index which satisfies
+@c{$sum[i] \le r < sum[i+1]$}
+@math{sum[i] <= r < sum[i+1]} and
+@math{delta} is
+@c{$(r - sum[i])/(sum[i+1] - sum[i])$}
+@math{(r - sum[i])/(sum[i+1] - sum[i])}.
+@end deftypefun
+
+@node Example programs for histograms
+@section Example programs for histograms
+
+The following program shows how to make a simple histogram of a column
+of numerical data supplied on @code{stdin}. The program takes three
+arguments, specifying the upper and lower bounds of the histogram and
+the number of bins. It then reads numbers from @code{stdin}, one line at
+a time, and adds them to the histogram. When there is no more data to
+read it prints out the accumulated histogram using
+@code{gsl_histogram_fprintf}.
+
+@example
+@verbatiminclude examples/histogram.c
+@end example
+
+@noindent
+Here is an example of the program in use. We generate 10000 random
+samples from a Cauchy distribution with a width of 30 and histogram
+them over the range -100 to 100, using 200 bins.
+
+@example
+$ gsl-randist 0 10000 cauchy 30
+ | gsl-histogram -100 100 200 > histogram.dat
+@end example
+
+@noindent
+A plot of the resulting histogram shows the familiar shape of the
+Cauchy distribution and the fluctuations caused by the finite sample
+size.
+
+@example
+$ awk '@{print $1, $3 ; print $2, $3@}' histogram.dat
+ | graph -T X
+@end example
+
+@iftex
+@sp 1
+@center @image{histogram,3.0in,2.8in}
+@end iftex
+
+@node Two dimensional histograms
+@section Two dimensional histograms
+@cindex two dimensional histograms
+@cindex 2D histograms
+
+A two dimensional histogram consists of a set of @dfn{bins} which count
+the number of events falling in a given area of the @math{(x,y)}
+plane. The simplest way to use a two dimensional histogram is to record
+two-dimensional position information, @math{n(x,y)}. Another possibility
+is to form a @dfn{joint distribution} by recording related
+variables. For example a detector might record both the position of an
+event (@math{x}) and the amount of energy it deposited @math{E}. These
+could be histogrammed as the joint distribution @math{n(x,E)}.
+
+@node The 2D histogram struct
+@section The 2D histogram struct
+
+Two dimensional histograms are defined by the following struct,
+
+@deftp {Data Type} {gsl_histogram2d}
+@table @code
+@item size_t nx, ny
+This is the number of histogram bins in the x and y directions.
+@item double * xrange
+The ranges of the bins in the x-direction are stored in an array of
+@math{@var{nx} + 1} elements pointed to by @var{xrange}.
+@item double * yrange
+The ranges of the bins in the y-direction are stored in an array of
+@math{@var{ny} + 1} elements pointed to by @var{yrange}.
+@item double * bin
+The counts for each bin are stored in an array pointed to by @var{bin}.
+The bins are floating-point numbers, so you can increment them by
+non-integer values if necessary. The array @var{bin} stores the two
+dimensional array of bins in a single block of memory according to the
+mapping @code{bin(i,j)} = @code{bin[i * ny + j]}.
+@end table
+@end deftp
+@comment
+
+@noindent
+The range for @code{bin(i,j)} is given by @code{xrange[i]} to
+@code{xrange[i+1]} in the x-direction and @code{yrange[j]} to
+@code{yrange[j+1]} in the y-direction. Each bin is inclusive at the lower
+end and exclusive at the upper end. Mathematically this means that the
+bins are defined by the following inequality,
+@tex
+\beforedisplay
+$$
+\matrix{
+\hbox{bin(i,j) corresponds to} &
+ \hbox{\it xrange}[i] \le x < \hbox{\it xrange}[i+1] \cr
+ \hbox{and} & \hbox{\it yrange}[j] \le y < \hbox{\it yrange}[j+1]}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+@display
+bin(i,j) corresponds to xrange[i] <= x < xrange[i+1]
+ and yrange[j] <= y < yrange[j+1]
+@end display
+
+@end ifinfo
+@noindent
+Note that any samples which fall on the upper sides of the histogram are
+excluded. If you want to include these values for the side bins you will
+need to add an extra row or column to your histogram.
+
+The @code{gsl_histogram2d} struct and its associated functions are
+defined in the header file @file{gsl_histogram2d.h}.
+
+@node 2D Histogram allocation
+@section 2D Histogram allocation
+
+The functions for allocating memory to a 2D histogram follow the style
+of @code{malloc} and @code{free}. In addition they also perform their
+own error checking. If there is insufficient memory available to
+allocate a histogram then the functions call the error handler (with
+an error number of @code{GSL_ENOMEM}) in addition to returning a null
+pointer. Thus if you use the library error handler to abort your program
+then it isn't necessary to check every 2D histogram @code{alloc}.
+
+@deftypefun {gsl_histogram2d *} gsl_histogram2d_alloc (size_t @var{nx}, size_t @var{ny})
+This function allocates memory for a two-dimensional histogram with
+@var{nx} bins in the x direction and @var{ny} bins in the y direction.
+The function returns a pointer to a newly created @code{gsl_histogram2d}
+struct. If insufficient memory is available a null pointer is returned
+and the error handler is invoked with an error code of
+@code{GSL_ENOMEM}. The bins and ranges must be initialized with one of
+the functions below before the histogram is ready for use.
+@end deftypefun
+
+@comment @deftypefun {gsl_histogram2d *} gsl_histogram2d_calloc (size_t @var{nx}, size_t @var{ny})
+@comment This function allocates memory for a two-dimensional histogram with
+@comment @var{nx} bins in the x direction and @var{ny} bins in the y
+@comment direction. The function returns a pointer to a newly initialized
+@comment @code{gsl_histogram2d} struct. The bins are uniformly spaced with a
+@comment total range of
+@comment @c{$0 \le x < nx$}
+@comment @math{0 <= x < nx} in the x-direction and
+@comment @c{$0 \le y < ny$}
+@comment @math{0 <= y < ny} in the y-direction, as shown in the table below.
+@comment
+@comment The bins are initialized to zero so the histogram is ready for use.
+@comment
+@comment If insufficient memory is available a null pointer is returned and the
+@comment error handler is invoked with an error code of @code{GSL_ENOMEM}.
+@comment @end deftypefun
+@comment
+@comment @deftypefun {gsl_histogram2d *} gsl_histogram2d_calloc_uniform (size_t @var{nx}, size_t @var{ny}, double @var{xmin}, double @var{xmax}, double @var{ymin}, double @var{ymax})
+@comment This function allocates a histogram of size @var{nx}-by-@var{ny} which
+@comment uniformly covers the ranges @var{xmin} to @var{xmax} and @var{ymin} to
+@comment @var{ymax} in the @math{x} and @math{y} directions respectively.
+@comment @end deftypefun
+@comment
+@comment @deftypefun {gsl_histogram2d *} gsl_histogram2d_calloc_range (size_t @var{nx}, size_t @var{ny}, double * @var{xrange}, double * @var{yrange})
+@comment This function allocates a histogram of size @var{nx}-by-@var{ny} using
+@comment the @math{nx+1} and @math{ny+1} bin ranges specified by the arrays
+@comment @var{xrange} and @var{xyrange}.
+@comment @end deftypefun
+
+@deftypefun int gsl_histogram2d_set_ranges (gsl_histogram2d * @var{h}, const double @var{xrange}[], size_t @var{xsize}, const double @var{yrange}[], size_t @var{ysize})
+This function sets the ranges of the existing histogram @var{h} using
+the arrays @var{xrange} and @var{yrange} of size @var{xsize} and
+@var{ysize} respectively. The values of the histogram bins are reset to
+zero.
+@end deftypefun
+
+@deftypefun int gsl_histogram2d_set_ranges_uniform (gsl_histogram2d * @var{h}, double @var{xmin}, double @var{xmax}, double @var{ymin}, double @var{ymax})
+This function sets the ranges of the existing histogram @var{h} to cover
+the ranges @var{xmin} to @var{xmax} and @var{ymin} to @var{ymax}
+uniformly. The values of the histogram bins are reset to zero.
+@end deftypefun
+
+@deftypefun void gsl_histogram2d_free (gsl_histogram2d * @var{h})
+This function frees the 2D histogram @var{h} and all of the memory
+associated with it.
+@end deftypefun
+
+@node Copying 2D Histograms
+@section Copying 2D Histograms
+
+@deftypefun int gsl_histogram2d_memcpy (gsl_histogram2d * @var{dest}, const gsl_histogram2d * @var{src})
+This function copies the histogram @var{src} into the pre-existing
+histogram @var{dest}, making @var{dest} into an exact copy of @var{src}.
+The two histograms must be of the same size.
+@end deftypefun
+
+@deftypefun {gsl_histogram2d *} gsl_histogram2d_clone (const gsl_histogram2d * @var{src})
+This function returns a pointer to a newly created histogram which is an
+exact copy of the histogram @var{src}.
+@end deftypefun
+
+@node Updating and accessing 2D histogram elements
+@section Updating and accessing 2D histogram elements
+
+You can access the bins of a two-dimensional histogram either by
+specifying a pair of @math{(x,y)} coordinates or by using the bin
+indices @math{(i,j)} directly. The functions for accessing the histogram
+through @math{(x,y)} coordinates use binary searches in the x and y
+directions to identify the bin which covers the appropriate range.
+
+@deftypefun int gsl_histogram2d_increment (gsl_histogram2d * @var{h}, double @var{x}, double @var{y})
+This function updates the histogram @var{h} by adding one (1.0) to the
+bin whose x and y ranges contain the coordinates (@var{x},@var{y}).
+
+If the point @math{(x,y)} lies inside the valid ranges of the
+histogram then the function returns zero to indicate success. If
+@math{(x,y)} lies outside the limits of the histogram then the
+function returns @code{GSL_EDOM}, and none of the bins are modified. The
+error handler is not called, since it is often necessary to compute
+histograms for a small range of a larger dataset, ignoring any
+coordinates outside the range of interest.
+@end deftypefun
+
+@deftypefun int gsl_histogram2d_accumulate (gsl_histogram2d * @var{h}, double @var{x}, double @var{y}, double @var{weight})
+This function is similar to @code{gsl_histogram2d_increment} but increases
+the value of the appropriate bin in the histogram @var{h} by the
+floating-point number @var{weight}.
+@end deftypefun
+
+@deftypefun double gsl_histogram2d_get (const gsl_histogram2d * @var{h}, size_t @var{i}, size_t @var{j})
+This function returns the contents of the (@var{i},@var{j})-th bin of the
+histogram @var{h}. If (@var{i},@var{j}) lies outside the valid range of
+indices for the histogram then the error handler is called with an error
+code of @code{GSL_EDOM} and the function returns 0.
+@end deftypefun
+
+@deftypefun int gsl_histogram2d_get_xrange (const gsl_histogram2d * @var{h}, size_t @var{i}, double * @var{xlower}, double * @var{xupper})
+@deftypefunx int gsl_histogram2d_get_yrange (const gsl_histogram2d * @var{h}, size_t @var{j}, double * @var{ylower}, double * @var{yupper})
+These functions find the upper and lower range limits of the @var{i}-th
+and @var{j}-th bins in the x and y directions of the histogram @var{h}.
+The range limits are stored in @var{xlower} and @var{xupper} or
+@var{ylower} and @var{yupper}. The lower limits are inclusive
+(i.e. events with these coordinates are included in the bin) and the
+upper limits are exclusive (i.e. events with the value of the upper
+limit are not included and fall in the neighboring higher bin, if it
+exists). The functions return 0 to indicate success. If @var{i} or
+@var{j} lies outside the valid range of indices for the histogram then
+the error handler is called with an error code of @code{GSL_EDOM}.
+@end deftypefun
+
+@deftypefun double gsl_histogram2d_xmax (const gsl_histogram2d * @var{h})
+@deftypefunx double gsl_histogram2d_xmin (const gsl_histogram2d * @var{h})
+@deftypefunx size_t gsl_histogram2d_nx (const gsl_histogram2d * @var{h})
+@deftypefunx double gsl_histogram2d_ymax (const gsl_histogram2d * @var{h})
+@deftypefunx double gsl_histogram2d_ymin (const gsl_histogram2d * @var{h})
+@deftypefunx size_t gsl_histogram2d_ny (const gsl_histogram2d * @var{h})
+These functions return the maximum upper and minimum lower range limits
+and the number of bins for the x and y directions of the histogram
+@var{h}. They provide a way of determining these values without
+accessing the @code{gsl_histogram2d} struct directly.
+@end deftypefun
+
+@deftypefun void gsl_histogram2d_reset (gsl_histogram2d * @var{h})
+This function resets all the bins of the histogram @var{h} to zero.
+@end deftypefun
+
+@node Searching 2D histogram ranges
+@section Searching 2D histogram ranges
+
+The following functions are used by the access and update routines to
+locate the bin which corresponds to a given @math{(x,y)} coordinate.
+
+@deftypefun int gsl_histogram2d_find (const gsl_histogram2d * @var{h}, double @var{x}, double @var{y}, size_t * @var{i}, size_t * @var{j})
+This function finds and sets the indices @var{i} and @var{j} to the to
+the bin which covers the coordinates (@var{x},@var{y}). The bin is
+located using a binary search. The search includes an optimization for
+histograms with uniform ranges, and will return the correct bin immediately
+in this case. If @math{(x,y)} is found then the function sets the
+indices (@var{i},@var{j}) and returns @code{GSL_SUCCESS}. If
+@math{(x,y)} lies outside the valid range of the histogram then the
+function returns @code{GSL_EDOM} and the error handler is invoked.
+@end deftypefun
+
+@node 2D Histogram Statistics
+@section 2D Histogram Statistics
+
+@deftypefun double gsl_histogram2d_max_val (const gsl_histogram2d * @var{h})
+This function returns the maximum value contained in the histogram bins.
+@end deftypefun
+
+@deftypefun void gsl_histogram2d_max_bin (const gsl_histogram2d * @var{h}, size_t * @var{i}, size_t * @var{j})
+This function finds the indices of the bin containing the maximum value
+in the histogram @var{h} and stores the result in (@var{i},@var{j}). In
+the case where several bins contain the same maximum value the first bin
+found is returned.
+@end deftypefun
+
+@deftypefun double gsl_histogram2d_min_val (const gsl_histogram2d * @var{h})
+This function returns the minimum value contained in the histogram bins.
+@end deftypefun
+
+@deftypefun void gsl_histogram2d_min_bin (const gsl_histogram2d * @var{h}, size_t * @var{i}, size_t * @var{j})
+This function finds the indices of the bin containing the minimum value
+in the histogram @var{h} and stores the result in (@var{i},@var{j}). In
+the case where several bins contain the same maximum value the first bin
+found is returned.
+@end deftypefun
+
+@deftypefun double gsl_histogram2d_xmean (const gsl_histogram2d * @var{h})
+This function returns the mean of the histogrammed x variable, where the
+histogram is regarded as a probability distribution. Negative bin values
+are ignored for the purposes of this calculation.
+@end deftypefun
+
+@deftypefun double gsl_histogram2d_ymean (const gsl_histogram2d * @var{h})
+This function returns the mean of the histogrammed y variable, where the
+histogram is regarded as a probability distribution. Negative bin values
+are ignored for the purposes of this calculation.
+@end deftypefun
+
+@deftypefun double gsl_histogram2d_xsigma (const gsl_histogram2d * @var{h})
+This function returns the standard deviation of the histogrammed
+x variable, where the histogram is regarded as a probability
+distribution. Negative bin values are ignored for the purposes of this
+calculation.
+@end deftypefun
+
+@deftypefun double gsl_histogram2d_ysigma (const gsl_histogram2d * @var{h})
+This function returns the standard deviation of the histogrammed
+y variable, where the histogram is regarded as a probability
+distribution. Negative bin values are ignored for the purposes of this
+calculation.
+@end deftypefun
+
+@deftypefun double gsl_histogram2d_cov (const gsl_histogram2d * @var{h})
+This function returns the covariance of the histogrammed x and y
+variables, where the histogram is regarded as a probability
+distribution. Negative bin values are ignored for the purposes of this
+calculation.
+@end deftypefun
+
+@deftypefun double gsl_histogram2d_sum (const gsl_histogram2d * @var{h})
+This function returns the sum of all bin values. Negative bin values
+are included in the sum.
+@end deftypefun
+
+@node 2D Histogram Operations
+@section 2D Histogram Operations
+
+@deftypefun int gsl_histogram2d_equal_bins_p (const gsl_histogram2d * @var{h1}, const gsl_histogram2d * @var{h2})
+This function returns 1 if all the individual bin ranges of the two
+histograms are identical, and 0 otherwise.
+@end deftypefun
+
+@deftypefun int gsl_histogram2d_add (gsl_histogram2d * @var{h1}, const gsl_histogram2d * @var{h2})
+This function adds the contents of the bins in histogram @var{h2} to the
+corresponding bins of histogram @var{h1},
+i.e. @math{h'_1(i,j) = h_1(i,j) + h_2(i,j)}.
+The two histograms must have identical bin ranges.
+@end deftypefun
+
+@deftypefun int gsl_histogram2d_sub (gsl_histogram2d * @var{h1}, const gsl_histogram2d * @var{h2})
+This function subtracts the contents of the bins in histogram @var{h2} from the
+corresponding bins of histogram @var{h1},
+i.e. @math{h'_1(i,j) = h_1(i,j) - h_2(i,j)}.
+The two histograms must have identical bin ranges.
+@end deftypefun
+
+@deftypefun int gsl_histogram2d_mul (gsl_histogram2d * @var{h1}, const gsl_histogram2d * @var{h2})
+This function multiplies the contents of the bins of histogram @var{h1}
+by the contents of the corresponding bins in histogram @var{h2},
+i.e. @math{h'_1(i,j) = h_1(i,j) * h_2(i,j)}.
+The two histograms must have identical bin ranges.
+@end deftypefun
+
+@deftypefun int gsl_histogram2d_div (gsl_histogram2d * @var{h1}, const gsl_histogram2d * @var{h2})
+This function divides the contents of the bins of histogram @var{h1}
+by the contents of the corresponding bins in histogram @var{h2},
+i.e. @math{h'_1(i,j) = h_1(i,j) / h_2(i,j)}.
+The two histograms must have identical bin ranges.
+@end deftypefun
+
+@deftypefun int gsl_histogram2d_scale (gsl_histogram2d * @var{h}, double @var{scale})
+This function multiplies the contents of the bins of histogram @var{h}
+by the constant @var{scale}, i.e. @c{$h'_1(i,j) = h_1(i,j) * \hbox{\it scale}$}
+@math{h'_1(i,j) = h_1(i,j) scale}.
+@end deftypefun
+
+@deftypefun int gsl_histogram2d_shift (gsl_histogram2d * @var{h}, double @var{offset})
+This function shifts the contents of the bins of histogram @var{h}
+by the constant @var{offset}, i.e. @c{$h'_1(i,j) = h_1(i,j) + \hbox{\it offset}$}
+@math{h'_1(i,j) = h_1(i,j) + offset}.
+@end deftypefun
+
+@node Reading and writing 2D histograms
+@section Reading and writing 2D histograms
+
+The library provides functions for reading and writing two dimensional
+histograms to a file as binary data or formatted text.
+
+@deftypefun int gsl_histogram2d_fwrite (FILE * @var{stream}, const gsl_histogram2d * @var{h})
+This function writes the ranges and bins of the histogram @var{h} to the
+stream @var{stream} in binary format. The return value is 0 for success
+and @code{GSL_EFAILED} if there was a problem writing to the file. Since
+the data is written in the native binary format it may not be portable
+between different architectures.
+@end deftypefun
+
+@deftypefun int gsl_histogram2d_fread (FILE * @var{stream}, gsl_histogram2d * @var{h})
+This function reads into the histogram @var{h} from the stream
+@var{stream} in binary format. The histogram @var{h} must be
+preallocated with the correct size since the function uses the number of
+x and y bins in @var{h} to determine how many bytes to read. The return
+value is 0 for success and @code{GSL_EFAILED} if there was a problem
+reading from the file. The data is assumed to have been written in the
+native binary format on the same architecture.
+@end deftypefun
+
+@deftypefun int gsl_histogram2d_fprintf (FILE * @var{stream}, const gsl_histogram2d * @var{h}, const char * @var{range_format}, const char * @var{bin_format})
+This function writes the ranges and bins of the histogram @var{h}
+line-by-line to the stream @var{stream} using the format specifiers
+@var{range_format} and @var{bin_format}. These should be one of the
+@code{%g}, @code{%e} or @code{%f} formats for floating point
+numbers. The function returns 0 for success and @code{GSL_EFAILED} if
+there was a problem writing to the file. The histogram output is
+formatted in five columns, and the columns are separated by spaces,
+like this,
+
+@smallexample
+xrange[0] xrange[1] yrange[0] yrange[1] bin(0,0)
+xrange[0] xrange[1] yrange[1] yrange[2] bin(0,1)
+xrange[0] xrange[1] yrange[2] yrange[3] bin(0,2)
+....
+xrange[0] xrange[1] yrange[ny-1] yrange[ny] bin(0,ny-1)
+
+xrange[1] xrange[2] yrange[0] yrange[1] bin(1,0)
+xrange[1] xrange[2] yrange[1] yrange[2] bin(1,1)
+xrange[1] xrange[2] yrange[1] yrange[2] bin(1,2)
+....
+xrange[1] xrange[2] yrange[ny-1] yrange[ny] bin(1,ny-1)
+
+....
+
+xrange[nx-1] xrange[nx] yrange[0] yrange[1] bin(nx-1,0)
+xrange[nx-1] xrange[nx] yrange[1] yrange[2] bin(nx-1,1)
+xrange[nx-1] xrange[nx] yrange[1] yrange[2] bin(nx-1,2)
+....
+xrange[nx-1] xrange[nx] yrange[ny-1] yrange[ny] bin(nx-1,ny-1)
+@end smallexample
+
+@noindent
+Each line contains the lower and upper limits of the bin and the
+contents of the bin. Since the upper limits of the each bin are the
+lower limits of the neighboring bins there is duplication of these
+values but this allows the histogram to be manipulated with
+line-oriented tools.
+@end deftypefun
+
+@deftypefun int gsl_histogram2d_fscanf (FILE * @var{stream}, gsl_histogram2d * @var{h})
+This function reads formatted data from the stream @var{stream} into the
+histogram @var{h}. The data is assumed to be in the five-column format
+used by @code{gsl_histogram_fprintf}. The histogram @var{h} must be
+preallocated with the correct lengths since the function uses the sizes
+of @var{h} to determine how many numbers to read. The function returns 0
+for success and @code{GSL_EFAILED} if there was a problem reading from
+the file.
+@end deftypefun
+
+@node Resampling from 2D histograms
+@section Resampling from 2D histograms
+
+As in the one-dimensional case, a two-dimensional histogram made by
+counting events can be regarded as a measurement of a probability
+distribution. Allowing for statistical error, the height of each bin
+represents the probability of an event where (@math{x},@math{y}) falls in
+the range of that bin. For a two-dimensional histogram the probability
+distribution takes the form @math{p(x,y) dx dy} where,
+@tex
+\beforedisplay
+$$
+p(x,y) = n_{ij}/ (N A_{ij})
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+p(x,y) = n_@{ij@}/ (N A_@{ij@})
+@end example
+
+@end ifinfo
+@noindent
+In this equation
+@c{$n_{ij}$}
+@math{n_@{ij@}} is the number of events in the bin which
+contains @math{(x,y)},
+@c{$A_{ij}$}
+@math{A_@{ij@}} is the area of the bin and @math{N} is
+the total number of events. The distribution of events within each bin
+is assumed to be uniform.
+
+@deftp {Data Type} {gsl_histogram2d_pdf}
+@table @code
+@item size_t nx, ny
+This is the number of histogram bins used to approximate the probability
+distribution function in the x and y directions.
+@item double * xrange
+The ranges of the bins in the x-direction are stored in an array of
+@math{@var{nx} + 1} elements pointed to by @var{xrange}.
+@item double * yrange
+The ranges of the bins in the y-direction are stored in an array of
+@math{@var{ny} + 1} pointed to by @var{yrange}.
+@item double * sum
+The cumulative probability for the bins is stored in an array of
+@var{nx}*@var{ny} elements pointed to by @var{sum}.
+@end table
+@end deftp
+@comment
+
+@noindent
+The following functions allow you to create a @code{gsl_histogram2d_pdf}
+struct which represents a two dimensional probability distribution and
+generate random samples from it.
+
+@deftypefun {gsl_histogram2d_pdf *} gsl_histogram2d_pdf_alloc (size_t @var{nx}, size_t @var{ny})
+This function allocates memory for a two-dimensional probability
+distribution of size @var{nx}-by-@var{ny} and returns a pointer to a
+newly initialized @code{gsl_histogram2d_pdf} struct. If insufficient
+memory is available a null pointer is returned and the error handler is
+invoked with an error code of @code{GSL_ENOMEM}.
+@end deftypefun
+
+@deftypefun int gsl_histogram2d_pdf_init (gsl_histogram2d_pdf * @var{p}, const gsl_histogram2d * @var{h})
+This function initializes the two-dimensional probability distribution
+calculated @var{p} from the histogram @var{h}. If any of the bins of
+@var{h} are negative then the error handler is invoked with an error
+code of @code{GSL_EDOM} because a probability distribution cannot
+contain negative values.
+@end deftypefun
+
+@deftypefun void gsl_histogram2d_pdf_free (gsl_histogram2d_pdf * @var{p})
+This function frees the two-dimensional probability distribution
+function @var{p} and all of the memory associated with it.
+@end deftypefun
+
+@deftypefun int gsl_histogram2d_pdf_sample (const gsl_histogram2d_pdf * @var{p}, double @var{r1}, double @var{r2}, double * @var{x}, double * @var{y})
+This function uses two uniform random numbers between zero and one,
+@var{r1} and @var{r2}, to compute a single random sample from the
+two-dimensional probability distribution @var{p}.
+@end deftypefun
+
+@page
+@node Example programs for 2D histograms
+@section Example programs for 2D histograms
+This program demonstrates two features of two-dimensional histograms.
+First a 10-by-10 two-dimensional histogram is created with x and y running
+from 0 to 1. Then a few sample points are added to the histogram, at
+(0.3,0.3) with a height of 1, at (0.8,0.1) with a height of 5 and at
+(0.7,0.9) with a height of 0.5. This histogram with three events is
+used to generate a random sample of 1000 simulated events, which are
+printed out.
+
+@example
+@verbatiminclude examples/histogram2d.c
+@end example
+
+@noindent
+@iftex
+The following plot shows the distribution of the simulated events. Using
+a higher resolution grid we can see the original underlying histogram
+and also the statistical fluctuations caused by the events being
+uniformly distributed over the area of the original bins.
+
+@sp 1
+@center @image{histogram2d,3.4in}
+@end iftex
+
diff --git a/gsl-1.9/doc/histogram2d.eps b/gsl-1.9/doc/histogram2d.eps
new file mode 100644
index 0000000..a26062a
--- /dev/null
+++ b/gsl-1.9/doc/histogram2d.eps
@@ -0,0 +1,776 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%BoundingBox: 0 0 567 567
+%%Title: paw.eps
+%%Creator: HIGZ Version 1.23/07
+%%CreationDate: 98/05/04 19.25
+%%EndComments
+%%BeginProlog
+80 dict begin
+/s {stroke} def /l {lineto} def /m {moveto} def /t {translate} def
+/sw {stringwidth} def /r {rotate} def /rl {roll} def /R {repeat} def
+/d {rlineto} def /rm {rmoveto} def /gr {grestore} def /f {eofill} def
+/c {setrgbcolor} def /lw {setlinewidth} def /sd {setdash} def
+/cl {closepath} def /sf {scalefont setfont} def /black {0 setgray} def
+/box {m dup 0 exch d exch 0 d 0 exch neg d cl} def
+/NC{systemdict begin initclip end}def/C{NC box clip newpath}def
+/bl {box s} def /bf {box f} def /Y { 0 exch d} def /X { 0 d} def
+/mp {newpath /y exch def /x exch def} def
+/side {[w .77 mul w .23 mul] .385 w mul sd w 0 l currentpoint t -144 r} def
+/mr {mp x y w2 0 360 arc} def /m24 {mr s} def /m20 {mr f} def
+/mb {mp x y w2 add m w2 neg 0 d 0 w neg d w 0 d 0 w d cl} def
+/mt {mp x y w2 add m w2 neg w neg d w 0 d cl} def
+/m21 {mb f} def /m25 {mb s} def /m22 {mt f} def /m26 {mt s} def
+/m23 {mp x y w2 sub m w2 w d w neg 0 d cl f} def
+/m27 {mp x y w2 add m w3 neg w2 neg d w3 w2 neg d w3 w2 d cl s} def
+/m28 {mp x w2 sub y w2 sub w3 add m w3 0 d 0 w3 neg d w3 0 d 0 w3 d w3 0 d
+ 0 w3 d w3 neg 0 d 0 w3 d w3 neg 0 d
+ 0 w3 neg d w3 neg 0 d cl s } def
+/m29 {mp gsave x w2 sub y w2 add w3 sub m currentpoint t
+ 4 {side} repeat cl fill gr} def
+/m30 {mp gsave x w2 sub y w2 add w3 sub m currentpoint t
+ 5 {side} repeat s gr} def
+/m31 {mp x y w2 sub m 0 w d x w2 sub y m w 0 d
+ x w2 sub y w2 add m w w neg d x w2 sub y w2
+ sub m w w d s} def
+/m2 {mp x y w2 sub m 0 w d x w2 sub y m w 0 d s} def
+/m5 {mp x w2 sub y w2 sub m w w d x w2 sub y w2 add m w w neg d s} def
+/DP {/PT exch def gsave 47.2 47.2 scale PT 1 eq { 16 16 1 [ 16 0 0 16 neg 0 16
+] { < AA AA 55 55 AA AA 55 55 AA AA 55 55 AA AA 55 55 AA AA 55 55 AA AA 55 55
+AA AA 55 55 AA AA 55 55 > } image } if PT 2 eq { 16 16 1 [ 16 0 0 16 neg 0 16
+] { < BB BB EE EE BB BB EE EE BB BB EE EE BB BB EE EE BB BB EE EE BB BB EE EE
+BB BB EE EE BB BB EE EE > } image } if PT 3 eq { 16 16 1 [ 16 0 0 16 neg 0 16
+] { < FF FF BB BB FF FF EE EE FF FF BB BB FF FF EE EE FF FF BB BB FF FF EE EE
+FF FF BB BB FF FF EE EE > } image } if PT 4 eq { 16 16 1 [ 16 0 0 16 neg 0 16
+] { < DF DF BF BF 7F 7F FE FE FD FD FB FB F7 F7 EF EF DF DF BF BF 7F 7F FE FE
+FD FD FB FB F7 F7 EF EF > } image } if PT 5 eq { 16 16 1 [ 16 0 0 16 neg 0 16
+] { < 7F 7F BF B F DF DF EF EF F7 F7 FB FB FD FD FE FE 7F 7F BF BF DF DF EF
+EF F7 F7 FB FB FD FD FE FE > } image } if PT 6 eq { 16 16 1 [ 16 0 0 16 neg 0
+16 ] { < BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB
+BB BB BB BB BB BB BB BB BB > } image } if PT 7 eq { 16 16 1 [ 16 0 0 16 neg 0
+16 ] { < FF FF FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 FF FF FF FF FF FF 00
+00 FF FF FF FF FF FF 00 00 > } image } if PT 8 eq { 16 16 1 [ 16 0 0 16 neg 0
+16 ] { < EE EE 47 47 83 83 C5 C5 EE EE 5C 5C 38 38 74 74 EE EE 47 47 83 83 C5
+C5 EE EE 5C 5C 38 38 74 74 > } image } if PT 9 eq { 16 16 1 [ 16 0 0 16 neg 0
+16 ] { < EF EF EF EF D7 D7 38 38 FE FE FE FE 7D 7D 83 83 EF EF EF EF D7 D7 38
+38 FE FE FE FE 7D 7D 83 83 > } image } if PT 10 eq { 16 16 1 [ 16 0 0 16 neg
+0 16 ] { < EF EF EF EF EF EF 00 00 FE FE FE FE FE FE 00 00 EF EF EF EF EF EF
+00 00 FE FE FE FE FE FE 00 00 > } image } if PT 11 eq { 16 16 1 [ 16 0 0 16
+neg 0 16 ] { < F7 F7 B6 B6 D5 D5 E3 E3 D5 D5 B6 B6 F7 F7 FF FF 7F 7F 6B 6B 5D
+5D 3E 3E 5D 5D 6B 6B 7F 7F FF FF > } image } if PT 12 eq { 16 16 1 [ 16 0 0
+16 neg 0 16 ] { < E3 E3 DD DD BE BE BE BE BE BE DD DD E3 E3 FF FF 3E 3E DD DD
+EB EB EB EB EB EB DD DD 3E 3E FF FF > } image } if PT 13 eq { 16 16 1 [ 16 0
+0 16 neg 0 16 ] { < FE FE 7D 7D BB BB D7 D7 EF EF D7 D7 BB BB 7D 7D FE FE 7D
+7D BB BB D7 D7 EF EF D7 D7 BB BB 7D 7D > } image } if PT 14 eq { 16 16 1 [ 16
+0 0 16 neg 0 16 ] { < 00 00 EE EF EE EF EE EF 0E E0 EE EE EE EE EE EE 00 EE
+FE EE FE EE FE EE 00 00 FE EF FE EF FE EF > } image } if PT 15 eq { 16 16 1 [
+16 0 0 16 neg 0 16 ] { < DD DD AA AA DD DD FF FF 77 77 AA AA 77 77 FF FF DD
+DD AA AA DD DD FF FF 77 77 AA AA 77 77 FF FF > } image } if PT 16 eq { 16 16
+1 [ 16 0 0 16 neg 0 16 ] { < F1 F1 EE EE 1F 1F FF FF F1 F1 EE EE 1F 1F FF FF
+F1 F1 EE EE 1F 1F FF FF F1 F1 EE EE 1F 1F FF FF > } image } if PT 17 eq { 16
+16 1 [ 16 0 0 16 neg 0 16 ] { < EE EE DD DD BB BB FF FF EE EE DD DD BB BB FF
+ FF EE EE DD DD BB BB FF FF EE EE DD DD BB BB FF FF > } image } if PT 18 eq {
+16 16 1 [ 16 0 0 16 neg 0 16 ] { < BB BB DD DD EE EE FF FF BB BB DD DD EE EE
+FF FF BB BB DD DD EE EE FF FF BB BB DD DD EE EE FF FF > } image } if PT 19 eq
+{ 16 16 1 [ 16 0 0 16 neg 0 16 ] { < 1F FC 67 F3 7B EF BD DE BD DE DE BD E6
+B3 F8 0F E6 B3 DE BD BD DE BD DE 7B EF 67 F3 1F FC 7F FF > } image } if PT
+20 eq { 16 16 1 [ 16 0 0 16 neg 0 16 ] { < DD DD EE EE EE EE EE EE DD DD BB
+BB BB BB BB BB DD DD EE EE EE EE EE EE DD DD BB BB BB BB BB BB > } image }
+if PT 21 eq { 16 16 1 [ 16 0 0 16 neg 0 16 ] { < 0E 0E EF EF EF EF EF EF E0
+E0 FE FE FE FE FE FE 0E 0E EF EF EF EF EF EF E0 E0 FE FE FE FE FE FE > }
+image } if PT 22 eq { 16 16 1 [ 16 0 0 16 neg 0 16 ] { < 70 70 F7 F7 F7 F7 F7
+F7 07 07 7F 7F 7F 7F 7F 7F 70 70 F7 F7 F7 F7 F7 F7 07 07 7F 7F 7F 7F 7F 7F >
+} image } if PT 23 eq { 16 16 1 [ 16 0 0 16 neg 0 16 ] { < AA AA 55 55 A9 A9
+D1 D1 E1 E1 D1 D1 A9 A9 55 55 AA AA 55 55 A9 A9 D1 D1 E1 E1 D1 D1 A9 A9 55 55
+> } image } if PT 24 eq { 16 16 1 [ 16 0 0 16 neg 0 16 ] { < FF FE FF FC EA
+A8 D5 54 EA A8 D5 54 E8 28 D4 54 E8 E8 D4 D4 E8 EA 54 D5 A8 EA 54 D5 00 C0 00
+80 > } image } if PT 25 eq { 16 16 1 [ 16 0 0 16 neg 0 16 ] { < FF FE FF FC
+FF F8 FF F0 F0 00 F0 00 F0 20 F0 60 F0 E0 F1 E0 F3 E0 F0 00 E0 00 C0 00 80 00
+00 00 > } image } if gr } def /FA { /PT exch def gsave clip 0 0 translate 1 1
+54 { 1 sub 47.2 mul /Xcurr exch def 1 1 74 { 1 sub 47.2 mul /Ycurr exch def
+gsave Xcurr Ycurr translate PT DP gr } for } for gr newpath } def
+/reencdict 24 dict def /ReEncode {reencdict begin /nco&na exch def
+/nfnam exch def /basefontname exch def /basefontdict basefontname findfont def
+/newfont basefontdict maxlength dict def basefontdict {exch dup /FID ne
+{dup /Encoding eq {exch dup length array copy newfont 3 1 roll put} {exch
+newfont 3 1 roll put} ifelse} {pop pop} ifelse } forall newfont
+/FontName nfnam put nco&na aload pop nco&na length 2 idiv {newfont
+/Encoding get 3 1 roll put} repeat nfnam newfont definefont pop end } def
+/accvec [ 176 /agrave 181 /Agrave 190 /acircumflex 192 /Acircumflex
+201 /adieresis 204 /Adieresis 209 /ccedilla 210 /Ccedilla 211 /eacute
+212 /Eacute 213 /egrave 214 /Egrave 215 /ecircumflex 216 /Ecircumflex
+217 /edieresis 218 /Edieresis 219 /icircumflex 220 /Icircumflex
+221 /idieresis 222 /Idieresis 223 /ntilde 224 /Ntilde 226 /ocircumflex
+228 /Ocircumflex 229 /odieresis 230 /Odieresis 231 /ucircumflex 236 /Ucircumflex
+237 /udieresis 238 /Udieresis 239 /aring 242 /Aring 243 /ydieresis
+244 /Ydieresis 246 /aacute 247 /Aacute 252 /ugrave 253 /Ugrave] def
+/Times-Roman /Times-Roman accvec ReEncode
+/Times-Italic /Times-Italic accvec ReEncode
+/Times-Bold /Times-Bold accvec ReEncode
+/Times-BoldItalic /Times-BoldItalic accvec ReEncode
+/Helvetica /Helvetica accvec ReEncode
+/Helvetica-Oblique /Helvetica-Oblique accvec ReEncode
+/Helvetica-Bold /Helvetica-Bold accvec ReEncode
+/Helvetica-BoldOblique /Helvetica-BoldOblique accvec ReEncode
+/Courier /Courier accvec ReEncode
+/Courier-Oblique /Courier-Oblique accvec ReEncode
+/Courier-Bold /Courier-Bold accvec ReEncode
+/Courier-BoldOblique /Courier-BoldOblique accvec ReEncode
+/oshow {gsave [] 0 sd true charpath stroke gr} def
+/stwn { /fs exch def /fn exch def /text exch def fn findfont fs sf
+ text sw pop xs add /xs exch def} def
+/stwb { /fs exch def /fn exch def /nbas exch def /textf exch def
+textf length /tlen exch def nbas tlen gt {/nbas tlen def} if
+fn findfont fs sf textf dup length nbas sub nbas getinterval sw
+pop neg xs add /xs exch def} def
+/accspe [ 65 /plusminus 66 /bar 67 /existential 68 /universal
+69 /exclam 70 /numbersign 71 /greater 72 /question 73 /integral
+74 /colon 75 /semicolon 76 /less 77 /bracketleft 78 /bracketright
+79 /greaterequal 80 /braceleft 81 /braceright 82 /radical
+83 /spade 84 /heart 85 /diamond 86 /club 87 /lessequal
+88 /multiply 89 /percent 90 /infinity 48 /circlemultiply 49 /circleplus
+50 /emptyset 51 /lozenge 52 /bullet 53 /arrowright 54 /arrowup
+55 /arrowleft 56 /arrowdown 57 /arrowboth 48 /degree 44 /comma 43 /plus
+ 45 /angle 42 /angleleft 47 /divide 61 /notequal 40 /equivalence 41 /second
+ 97 /approxequal 98 /congruent 99 /perpendicular 100 /partialdiff 101 /florin
+ 102 /intersection 103 /union 104 /propersuperset 105 /reflexsuperset
+ 106 /notsubset 107 /propersubset 108 /reflexsubset 109 /element 110 /notelement
+ 111 /gradient 112 /logicaland 113 /logicalor 114 /arrowdblboth
+ 115 /arrowdblleft 116 /arrowdblup 117 /arrowdblright 118 /arrowdbldown
+ 119 /ampersand 120 /omega1 121 /similar 122 /aleph ] def
+/Symbol /Special accspe ReEncode
+%%EndProlog
+ gsave .25 .25 scale gsave 0 0 t black [] 0 sd 1 lw 2268 2268 0 0 bl 2268 2268
+ 0 0 C 1814 1814 227 227 C NC 891 227 m 38 10 d s 907 253 m 22 -16 d s 869 244 m
+ 38 9 d s 869 244 m 22 -17 d s 929 237 m 39 9 d s 945 263 m 23 -17 d s 907 253 m
+ 38 10 d s 968 246 m 38 10 d s 984 273 m 22 -17 d s 945 263 m 39 10 d s 1006 256
+ m 38 10 d s 1022 283 m 22 -17 d s 984 273 m 38 10 d s 1044 266 m 39 10 d s 1060
+ 293 m 23 -17 d s 1022 283 m 38 10 d s 1083 276 m 38 9 d s 1099 302 m 22 -17 d s
+ 1060 293 m 39 9 d s 1121 285 m 38 10 d s 1137 312 m 22 -17 d s 1099 302 m 38 10
+ d s 1159 295 m 39 10 d s 1176 322 m 22 -17 d s 1137 312 m 39 10 d s 1198 305 m
+ 38 10 d s 1214 332 m 22 -17 d s 1176 322 m 38 10 d s 1236 315 m 38 9 d s 1252
+ 341 m 22 -17 d s 1214 332 m 38 9 d s 1274 324 m 39 10 d s 1291 351 m 22 -17 d s
+ 1252 341 m 39 10 d s 1313 334 m 38 10 d s 1329 361 m 22 -17 d s 1291 351 m 38
+ 10 d s 1351 344 m 38 10 d s 1367 371 m 22 -17 d s 1329 361 m 38 10 d s 1329 361
+ m 12 -10 d s 1389 354 m 39 9 d s 1406 380 m 22 -17 d s 1367 371 m 39 9 d s 1428
+ 363 m 38 10 d s 1444 390 m 22 -17 d s 1406 380 m 38 10 d s 1466 373 m 38 10 d s
+ 1482 400 m 22 -17 d s 1444 390 m 38 10 d s 1504 383 m 39 10 d s 1521 410 m 22
+ -17 d s 1482 400 m 39 10 d s 1543 393 m 38 9 d s 1559 419 m 22 -17 d s 1521 410
+ m 38 9 d s 1581 402 m 38 10 d s 1597 429 m 22 -17 d s 1559 419 m 38 10 d s 1619
+ 412 m 39 10 d s 1636 439 m 22 -17 d s 1597 429 m 39 10 d s 1658 422 m 38 10 d s
+ 1674 449 m 22 -17 d s 1636 439 m 38 10 d s 1696 432 m 38 10 d s 1712 458 m 22
+ -16 d s 1674 449 m 38 9 d s 1734 442 m 39 9 d s 1751 468 m 22 -17 d s 1712 458
+ m 39 10 d s 1773 451 m 38 10 d s 1789 478 m 22 -17 d s 1751 468 m 38 10 d s
+ 1811 461 m 38 10 d s 1827 488 m 22 -17 d s 1789 478 m 38 10 d s 1849 471 m 39
+ 10 d s 1866 497 m 22 -16 d s 1827 488 m 39 9 d s 1888 481 m 38 9 d s 1904 507 m
+ 22 -17 d s 1866 497 m 38 10 d s 1926 490 m 39 10 d s 1942 517 m 23 -17 d s 1904
+ 507 m 38 10 d s 1965 500 m 38 10 d s 1981 527 m 22 -17 d s 1942 517 m 39 10 d s
+ 2003 510 m 38 10 d s 2019 537 m 22 -17 d s 1981 527 m 38 10 d s 885 270 m 22
+ -17 d s 847 261 m 38 9 d s 847 261 m 22 -17 d s 923 280 m 22 -17 d s 885 270 m
+ 38 10 d s 962 290 m 22 -17 d s 923 280 m 39 10 d s 1000 300 m 22 -17 d s 962
+ 290 m 38 10 d s 1038 309 m 22 -16 d s 1000 300 m 38 9 d s 1077 319 m 22 -17 d s
+ 1038 309 m 39 10 d s 1115 329 m 22 -17 d s 1077 319 m 38 10 d s 1153 339 m 23
+ -17 d s 1115 329 m 38 10 d s 1192 348 m 22 -16 d s 1153 339 m 39 9 d s 1230 358
+ m 22 -17 d s 1192 348 m 38 10 d s 1268 368 m 23 -17 d s 1230 358 m 38 10 d s
+ 1307 378 m 22 -17 d s 1268 368 m 39 10 d s 1345 388 m 22 -17 d s 1307 378 m 38
+ 10 d s 1319 368 m 10 -7 d s 1383 397 m 23 -17 d s 1345 388 m 38 9 d s 1422 407
+ m 22 -17 d s 1383 397 m 39 10 d s 1460 417 m 22 -17 d s 1422 407 m 38 10 d s
+ 1498 427 m 23 -17 d s 1460 417 m 38 10 d s 1537 436 m 22 -17 d s 1498 427 m 39
+ 9 d s 1575 446 m 22 -17 d s 1537 436 m 38 10 d s 1613 456 m 23 -17 d s 1575 446
+ m 38 10 d s 1652 466 m 22 -17 d s 1613 456 m 39 10 d s 1690 475 m 22 -17 d s
+ 1652 466 m 38 9 d s 1729 485 m 22 -17 d s 1690 475 m 39 10 d s 1767 495 m 22
+ -17 d s 1729 485 m 38 10 d s 1805 505 m 22 -17 d s 1767 495 m 38 10 d s 1844
+ 514 m 22 -17 d s 1805 505 m 39 9 d s 1882 524 m 22 -17 d s 1844 514 m 38 10 d s
+ 1920 534 m 22 -17 d s 1882 524 m 38 10 d s 1959 544 m 22 -17 d s 1920 534 m 39
+ 10 d s 1997 553 m 22 -16 d s 1959 544 m 38 9 d s 863 287 m 22 -17 d s 825 278 m
+ 38 9 d s 825 278 m 22 -17 d s 901 297 m 22 -17 d s 863 287 m 38 10 d s 940 307
+ m 22 -17 d s 901 297 m 39 10 d s 978 317 m 22 -17 d s 940 307 m 38 10 d s 1016
+ 326 m 22 -17 d s 978 317 m 38 9 d s 1055 336 m 22 -17 d s 1016 326 m 39 10 d s
+ 1093 346 m 22 -17 d s 1055 336 m 38 10 d s 1131 356 m 22 -17 d s 1093 346 m 38
+ 10 d s 1170 365 m 22 -17 d s 1131 356 m 39 9 d s 1208 375 m 22 -17 d s 1170 365
+ m 38 10 d s 1246 385 m 22 -17 d s 1208 375 m 38 10 d s 1285 395 m 22 -17 d s
+ 1246 385 m 39 10 d s 1323 404 m 22 -16 d s 1285 395 m 38 9 d s 1361 414 m 22
+ -17 d s 1323 404 m 38 10 d s 1400 424 m 22 -17 d s 1361 414 m 39 10 d s 1438
+ 434 m 22 -17 d s 1400 424 m 38 10 d s 1476 443 m 22 -16 d s 1438 434 m 38 9 d s
+ 1515 453 m 22 -17 d s 1476 443 m 39 10 d s 1553 463 m 22 -17 d s 1515 453 m 38
+ 10 d s 1591 473 m 22 -17 d s 1553 463 m 38 10 d s 1630 482 m 22 -16 d s 1591
+ 473 m 39 9 d s 1594 471 m 3 -2 d s 1602 464 m 3 -2 d s 1605 462 m 3 -2 d s 1668
+ 492 m 22 -17 d s 1630 482 m 38 10 d s 1706 502 m 23 -17 d s 1668 492 m 38 10 d
+ s 1745 512 m 22 -17 d s 1706 502 m 39 10 d s 1783 522 m 22 -17 d s 1745 512 m
+ 38 10 d s 1821 531 m 23 -17 d s 1783 522 m 38 9 d s 1860 541 m 22 -17 d s 1821
+ 531 m 39 10 d s 1898 551 m 22 -17 d s 1860 541 m 38 10 d s 1936 561 m 23 -17 d
+ s 1898 551 m 38 10 d s 1975 570 m 22 -17 d s 1936 561 m 39 9 d s 841 304 m 22
+ -17 d s 802 294 m 39 10 d s 802 294 m 23 -16 d s 879 314 m 22 -17 d s 841 304 m
+ 38 10 d s 917 324 m 23 -17 d s 879 314 m 38 10 d s 956 333 m 22 -16 d s 917 324
+ m 39 9 d s 994 343 m 22 -17 d s 956 333 m 38 10 d s 1032 353 m 23 -17 d s 994
+ 343 m 38 10 d s 1071 363 m 22 -17 d s 1032 353 m 39 10 d s 1109 373 m 22 -17 d
+ s 1071 363 m 38 10 d s 1147 382 m 23 -17 d s 1109 373 m 38 9 d s 1186 392 m 22
+ -17 d s 1147 382 m 39 10 d s 1224 402 m 22 -17 d s 1186 392 m 38 10 d s 1262
+ 412 m 23 -17 d s 1224 402 m 38 10 d s 1301 421 m 22 -17 d s 1262 412 m 39 9 d s
+ 1339 431 m 22 -17 d s 1301 421 m 38 10 d s 1378 441 m 22 -17 d s 1339 431 m 39
+ 10 d s 1416 451 m 22 -17 d s 1378 441 m 38 10 d s 1454 460 m 22 -17 d s 1416
+ 451 m 38 9 d s 1493 470 m 22 -17 d s 1454 460 m 39 10 d s 1531 480 m 22 -17 d s
+ 1493 470 m 38 10 d s 1501 464 m 3 -2 d s 1509 457 m 3 -2 d s 1512 455 m 3 -2 d
+ s 1569 490 m 22 -17 d s 1531 480 m 38 10 d s 1608 499 m 22 -17 d s 1569 490 m
+ 39 9 d s 1646 509 m 22 -17 d s 1608 499 m 38 10 d s 1684 519 m 22 -17 d s 1646
+ 509 m 38 10 d s 1723 529 m 22 -17 d s 1684 519 m 39 10 d s 1761 538 m 22 -16 d
+ s 1723 529 m 38 9 d s 1799 548 m 22 -17 d s 1761 538 m 38 10 d s 1838 558 m 22
+ -17 d s 1799 548 m 39 10 d s 1876 568 m 22 -17 d s 1838 558 m 38 10 d s 1914
+ 577 m 22 -16 d s 1876 568 m 38 9 d s 1953 587 m 22 -17 d s 1914 577 m 39 10 d s
+ 819 321 m 22 -17 d s 780 311 m 39 10 d s 780 311 m 22 -17 d s 857 331 m 22 -17
+ d s 819 321 m 38 10 d s 895 341 m 22 -17 d s 857 331 m 38 10 d s 934 350 m 22
+ -17 d s 895 341 m 39 9 d s 972 360 m 22 -17 d s 934 350 m 38 10 d s 1010 370 m
+ 22 -17 d s 972 360 m 38 10 d s 1049 380 m 22 -17 d s 1010 370 m 39 10 d s 1087
+ 389 m 22 -16 d s 1049 380 m 38 9 d s 1125 399 m 22 -17 d s 1087 389 m 38 10 d s
+ 1164 409 m 22 -17 d s 1125 399 m 39 10 d s 1202 419 m 22 -17 d s 1164 409 m 38
+ 10 d s 1240 428 m 22 -16 d s 1202 419 m 38 9 d s 1279 438 m 22 -17 d s 1240 428
+ m 39 10 d s 1317 448 m 22 -17 d s 1279 438 m 38 10 d s 1355 458 m 23 -17 d s
+ 1317 448 m 38 10 d s 1394 468 m 22 -17 d s 1355 458 m 39 10 d s 1432 477 m 22
+ -17 d s 1394 468 m 38 9 d s 1470 487 m 23 -17 d s 1432 477 m 38 10 d s 1509 497
+ m 22 -17 d s 1470 487 m 39 10 d s 1547 507 m 22 -17 d s 1509 497 m 38 10 d s
+ 1585 516 m 23 -17 d s 1547 507 m 38 9 d s 1624 526 m 22 -17 d s 1585 516 m 39
+ 10 d s 1662 536 m 22 -17 d s 1624 526 m 38 10 d s 1700 546 m 23 -17 d s 1662
+ 536 m 38 10 d s 1739 555 m 22 -17 d s 1700 546 m 39 9 d s 1777 565 m 22 -17 d s
+ 1739 555 m 38 10 d s 1815 575 m 23 -17 d s 1777 565 m 38 10 d s 1854 585 m 22
+ -17 d s 1815 575 m 39 10 d s 1892 594 m 22 -17 d s 1854 585 m 38 9 d s 1931 604
+ m 22 -17 d s 1892 594 m 39 10 d s 796 338 m 23 -17 d s 758 328 m 38 10 d s 758
+ 328 m 22 -17 d s 835 348 m 22 -17 d s 796 338 m 39 10 d s 873 358 m 22 -17 d s
+ 835 348 m 38 10 d s 911 367 m 23 -17 d s 873 358 m 38 9 d s 950 377 m 22 -17 d
+ s 911 367 m 39 10 d s 988 387 m 22 -17 d s 950 377 m 38 10 d s 1026 397 m 23
+ -17 d s 988 387 m 38 10 d s 1065 406 m 22 -17 d s 1026 397 m 39 9 d s 1103 416
+ m 22 -17 d s 1065 406 m 38 10 d s 1142 426 m 22 -17 d s 1103 416 m 39 10 d s
+ 1180 436 m 22 -17 d s 1142 426 m 38 10 d s 1218 445 m 22 -17 d s 1180 436 m 38
+ 9 d s 1257 455 m 22 -17 d s 1218 445 m 39 10 d s 1295 465 m 22 -17 d s 1257 455
+ m 38 10 d s 1333 475 m 22 -17 d s 1295 465 m 38 10 d s 1372 484 m 22 -16 d s
+ 1333 475 m 39 9 d s 1410 494 m 22 -17 d s 1372 484 m 38 10 d s 1448 504 m 22
+ -17 d s 1410 494 m 38 10 d s 1487 514 m 22 -17 d s 1448 504 m 39 10 d s 1525
+ 523 m 22 -16 d s 1487 514 m 38 9 d s 1563 533 m 22 -17 d s 1525 523 m 38 10 d s
+ 1602 543 m 22 -17 d s 1563 533 m 39 10 d s 1640 553 m 22 -17 d s 1602 543 m 38
+ 10 d s 1678 562 m 22 -16 d s 1640 553 m 38 9 d s 1717 572 m 22 -17 d s 1678 562
+ m 39 10 d s 1755 582 m 22 -17 d s 1717 572 m 38 10 d s 1793 592 m 22 -17 d s
+ 1755 582 m 38 10 d s 1832 602 m 22 -17 d s 1793 592 m 39 10 d s 1870 611 m 22
+ -17 d s 1832 602 m 38 9 d s 1908 621 m 23 -17 d s 1870 611 m 38 10 d s 774 355
+ m 22 -17 d s 736 345 m 38 10 d s 736 345 m 22 -17 d s 813 365 m 22 -17 d s 774
+ 355 m 39 10 d s 851 374 m 22 -16 d s 813 365 m 38 9 d s 889 384 m 22 -17 d s
+ 851 374 m 38 10 d s 927 371 m 2 1 d s 932 372 m 2 1 d s 937 374 m 13 3 d s 928
+ 394 m 22 -17 d s 889 384 m 39 10 d s 950 377 m 10 3 d s 963 380 m 5 2 d s 970
+ 382 m 3 1 d s 978 384 m 2 1 d s 966 404 m 22 -17 d s 928 394 m 38 10 d s 1004
+ 413 m 22 -16 d s 966 404 m 38 9 d s 1043 423 m 22 -17 d s 1004 413 m 39 10 d s
+ 1081 433 m 22 -17 d s 1043 423 m 38 10 d s 1119 443 m 23 -17 d s 1081 433 m 38
+ 10 d s 1158 453 m 22 -17 d s 1119 443 m 39 10 d s 1196 462 m 22 -17 d s 1158
+ 453 m 38 9 d s 1228 448 m 3 1 d s 1236 450 m 3 1 d s 1241 451 m 5 2 d s 1249
+ 453 m 8 2 d s 1234 472 m 23 -17 d s 1196 462 m 38 10 d s 1257 455 m 12 3 d s
+ 1276 460 m 9 2 d s 1273 482 m 22 -17 d s 1234 472 m 39 10 d s 1311 492 m 22 -17
+ d s 1273 482 m 38 10 d s 1349 501 m 23 -17 d s 1311 492 m 38 9 d s 1388 511 m
+ 22 -17 d s 1349 501 m 39 10 d s 1426 521 m 22 -17 d s 1388 511 m 38 10 d s 1448
+ 504 m 16 4 d s 1466 508 m 3 1 d s 1471 510 m 3 X s 1464 531 m 23 -17 d s 1426
+ 521 m 38 10 d s 1497 516 m 2 1 d s 1504 518 m 3 1 d s 1510 520 m 5 1 d s 1517
+ 522 m 8 1 d s 1503 540 m 22 -17 d s 1464 531 m 39 9 d s 1541 550 m 22 -17 d s
+ 1503 540 m 38 10 d s 1579 560 m 23 -17 d s 1541 550 m 38 10 d s 1618 570 m 22
+ -17 d s 1579 560 m 39 10 d s 1656 579 m 22 -17 d s 1618 570 m 38 9 d s 1695 589
+ m 22 -17 d s 1656 579 m 39 10 d s 1717 572 m 15 4 d s 1735 577 m 2 X s 1740 578
+ m 2 1 d s 1733 599 m 22 -17 d s 1695 589 m 38 10 d s 1771 609 m 22 -17 d s 1733
+ 599 m 38 10 d s 1810 618 m 22 -16 d s 1771 609 m 39 9 d s 1848 628 m 22 -17 d s
+ 1810 618 m 38 10 d s 1886 638 m 22 -17 d s 1848 628 m 38 10 d s 752 372 m 22
+ -17 d s 714 362 m 38 10 d s 714 362 m 22 -17 d s 791 382 m 22 -17 d s 752 372 m
+ 39 10 d s 829 391 m 22 -17 d s 791 382 m 38 9 d s 867 401 m 22 -17 d s 829 391
+ m 38 10 d s 906 411 m 22 -17 d s 867 401 m 39 10 d s 944 421 m 22 -17 d s 906
+ 411 m 38 10 d s 982 430 m 22 -17 d s 944 421 m 38 9 d s 1021 440 m 22 -17 d s
+ 982 430 m 39 10 d s 1059 450 m 22 -17 d s 1021 440 m 38 10 d s 1097 460 m 22
+ -17 d s 1059 450 m 38 10 d s 1136 469 m 22 -16 d s 1097 460 m 39 9 d s 1174 479
+ m 22 -17 d s 1136 469 m 38 10 d s 1212 489 m 22 -17 d s 1174 479 m 38 10 d s
+ 1251 499 m 22 -17 d s 1212 489 m 39 10 d s 1289 508 m 22 -16 d s 1251 499 m 38
+ 9 d s 1327 518 m 22 -17 d s 1289 508 m 38 10 d s 1366 528 m 22 -17 d s 1327 518
+ m 39 10 d s 1404 538 m 22 -17 d s 1366 528 m 38 10 d s 1442 548 m 22 -17 d s
+ 1404 538 m 38 10 d s 1481 557 m 22 -17 d s 1442 548 m 39 9 d s 1519 567 m 22
+ -17 d s 1481 557 m 38 10 d s 1557 577 m 22 -17 d s 1519 567 m 38 10 d s 1596
+ 587 m 22 -17 d s 1557 577 m 39 10 d s 1634 596 m 22 -17 d s 1596 587 m 38 9 d s
+ 1672 606 m 23 -17 d s 1634 596 m 38 10 d s 1711 616 m 22 -17 d s 1672 606 m 39
+ 10 d s 1749 626 m 22 -17 d s 1711 616 m 38 10 d s 1787 635 m 23 -17 d s 1749
+ 626 m 38 9 d s 1826 645 m 22 -17 d s 1787 635 m 39 10 d s 1864 655 m 22 -17 d s
+ 1826 645 m 38 10 d s 730 389 m 22 -17 d s 692 379 m 38 10 d s 692 379 m 22 -17
+ d s 768 398 m 23 -16 d s 730 389 m 38 9 d s 807 408 m 22 -17 d s 768 398 m 39
+ 10 d s 845 418 m 22 -17 d s 807 408 m 38 10 d s 883 428 m 23 -17 d s 845 418 m
+ 38 10 d s 922 438 m 22 -17 d s 883 428 m 39 10 d s 960 447 m 22 -17 d s 922 438
+ m 38 9 d s 998 457 m 23 -17 d s 960 447 m 38 10 d s 1037 467 m 22 -17 d s 998
+ 457 m 39 10 d s 1075 477 m 22 -17 d s 1037 467 m 38 10 d s 1113 486 m 23 -17 d
+ s 1075 477 m 38 9 d s 1152 496 m 22 -17 d s 1113 486 m 39 10 d s 1190 506 m 22
+ -17 d s 1152 496 m 38 10 d s 1228 516 m 23 -17 d s 1190 506 m 38 10 d s 1267
+ 525 m 22 -17 d s 1228 516 m 39 9 d s 1305 535 m 22 -17 d s 1267 525 m 38 10 d s
+ 1344 545 m 22 -17 d s 1305 535 m 39 10 d s 1382 555 m 22 -17 d s 1344 545 m 38
+ 10 d s 1420 564 m 22 -16 d s 1382 555 m 38 9 d s 1459 574 m 22 -17 d s 1420 564
+ m 39 10 d s 1497 584 m 22 -17 d s 1459 574 m 38 10 d s 1535 594 m 22 -17 d s
+ 1497 584 m 38 10 d s 1574 603 m 22 -16 d s 1535 594 m 39 9 d s 1612 613 m 22
+ -17 d s 1574 603 m 38 10 d s 1650 623 m 22 -17 d s 1612 613 m 38 10 d s 1689
+ 633 m 22 -17 d s 1650 623 m 39 10 d s 1727 643 m 22 -17 d s 1689 633 m 38 10 d
+ s 1765 652 m 22 -17 d s 1727 643 m 38 9 d s 1804 662 m 22 -17 d s 1765 652 m 39
+ 10 d s 1842 672 m 22 -17 d s 1804 662 m 38 10 d s 708 406 m 22 -17 d s 670 396
+ m 38 10 d s 670 396 m 22 -17 d s 746 415 m 22 -17 d s 708 406 m 38 9 d s 785
+ 425 m 22 -17 d s 746 415 m 39 10 d s 823 435 m 22 -17 d s 785 425 m 38 10 d s
+ 861 445 m 22 -17 d s 823 435 m 38 10 d s 900 454 m 22 -16 d s 861 445 m 39 9 d
+ s 938 464 m 22 -17 d s 900 454 m 38 10 d s 976 474 m 22 -17 d s 938 464 m 38 10
+ d s 1015 484 m 22 -17 d s 976 474 m 39 10 d s 1075 477 m 206 Y s 1037 674 m 38
+ 9 d s 1037 467 m 207 Y s 1015 691 m 22 -17 d s 1015 484 m 207 Y s 1053 700 m 22
+ -17 d s 1015 691 m 38 9 d s 1113 486 m 148 Y s 1075 624 m 38 10 d s 1091 651 m
+ 22 -17 d s 1076 647 m 15 4 d s 1152 496 m 187 Y s 1113 673 m 39 10 d s 1113 634
+ m 39 Y s 1091 690 m 22 -17 d s 1091 651 m 39 Y s 1130 700 m 22 -17 d s 1091 690
+ m 39 10 d s 1168 523 m 22 -17 d s 1153 519 m 15 4 d s 1206 533 m 22 -17 d s
+ 1168 523 m 38 10 d s 1245 542 m 22 -17 d s 1206 533 m 39 9 d s 1283 552 m 22
+ -17 d s 1245 542 m 38 10 d s 1321 562 m 23 -17 d s 1283 552 m 38 10 d s 1360
+ 572 m 22 -17 d s 1321 562 m 39 10 d s 1398 581 m 22 -17 d s 1360 572 m 38 9 d s
+ 1436 591 m 23 -17 d s 1398 581 m 38 10 d s 1475 601 m 22 -17 d s 1436 591 m 39
+ 10 d s 1513 611 m 22 -17 d s 1475 601 m 38 10 d s 1551 620 m 23 -17 d s 1513
+ 611 m 38 9 d s 1590 630 m 22 -17 d s 1551 620 m 39 10 d s 1628 640 m 22 -17 d s
+ 1590 630 m 38 10 d s 1666 650 m 23 -17 d s 1628 640 m 38 10 d s 1705 659 m 22
+ -16 d s 1666 650 m 39 9 d s 1743 669 m 22 -17 d s 1705 659 m 38 10 d s 1781 679
+ m 23 -17 d s 1743 669 m 38 10 d s 1820 689 m 22 -17 d s 1781 679 m 39 10 d s
+ 686 423 m 22 -17 d s 647 413 m 39 10 d s 647 413 m 23 -17 d s 724 432 m 22 -17
+ d s 686 423 m 38 9 d s 762 442 m 23 -17 d s 724 432 m 38 10 d s 801 452 m 22
+ -17 d s 762 442 m 39 10 d s 839 462 m 22 -17 d s 801 452 m 38 10 d s 877 471 m
+ 23 -17 d s 839 462 m 38 9 d s 916 481 m 22 -17 d s 877 471 m 39 10 d s 954 491
+ m 22 -17 d s 916 481 m 38 10 d s 992 501 m 23 -17 d s 954 491 m 38 10 d s 992
+ 629 m 23 -17 d s 992 501 m 128 Y s 992 629 m 23 6 d s 1076 657 m 15 4 d s 1077
+ 672 m 14 -11 d s 1151 535 m 17 -12 d s 1184 549 m 22 -16 d s 1151 541 m 33 8 d
+ s 1223 559 m 22 -17 d s 1184 549 m 39 10 d s 1261 569 m 22 -17 d s 1223 559 m
+ 38 10 d s 1299 579 m 22 -17 d s 1261 569 m 38 10 d s 1338 588 m 22 -16 d s 1299
+ 579 m 39 9 d s 1376 598 m 22 -17 d s 1338 588 m 38 10 d s 1414 608 m 22 -17 d s
+ 1376 598 m 38 10 d s 1453 618 m 22 -17 d s 1414 608 m 39 10 d s 1491 628 m 22
+ -17 d s 1453 618 m 38 10 d s 1529 637 m 22 -17 d s 1491 628 m 38 9 d s 1568 647
+ m 22 -17 d s 1529 637 m 39 10 d s 1606 657 m 22 -17 d s 1568 647 m 38 10 d s
+ 1644 667 m 22 -17 d s 1606 657 m 38 10 d s 1683 676 m 22 -17 d s 1644 667 m 39
+ 9 d s 1721 686 m 22 -17 d s 1683 676 m 38 10 d s 1759 696 m 22 -17 d s 1721 686
+ m 38 10 d s 1798 706 m 22 -17 d s 1759 696 m 39 10 d s 664 439 m 22 -16 d s 625
+ 430 m 39 9 d s 625 430 m 22 -17 d s 702 449 m 22 -17 d s 664 439 m 38 10 d s
+ 740 459 m 22 -17 d s 702 449 m 38 10 d s 779 469 m 22 -17 d s 740 459 m 39 10 d
+ s 817 478 m 22 -16 d s 779 469 m 38 9 d s 855 488 m 22 -17 d s 817 478 m 38 10
+ d s 894 498 m 22 -17 d s 855 488 m 39 10 d s 932 508 m 22 -17 d s 894 498 m 38
+ 10 d s 970 518 m 22 -17 d s 932 508 m 38 10 d s 1031 694 m 23 Y s 992 707 m 39
+ 10 d s 992 629 m 78 Y s 970 724 m 22 -17 d s 970 518 m 206 Y s 1009 734 m 22
+ -17 d s 970 724 m 39 10 d s 1069 689 m 18 Y s 1031 697 m 38 10 d s 1047 724 m
+ 22 -17 d s 1028 719 m 19 5 d s 1162 566 m 22 -17 d s 1152 564 m 10 2 d s 1200
+ 576 m 23 -17 d s 1162 566 m 38 10 d s 1239 586 m 22 -17 d s 1200 576 m 39 10 d
+ s 1277 596 m 22 -17 d s 1239 586 m 38 10 d s 1315 605 m 23 -17 d s 1277 596 m
+ 38 9 d s 1354 615 m 22 -17 d s 1315 605 m 39 10 d s 1392 625 m 22 -17 d s 1354
+ 615 m 38 10 d s 1430 635 m 23 -17 d s 1392 625 m 38 10 d s 1469 644 m 22 -16 d
+ s 1430 635 m 39 9 d s 1507 654 m 22 -17 d s 1469 644 m 38 10 d s 1545 664 m 23
+ -17 d s 1507 654 m 38 10 d s 1584 674 m 22 -17 d s 1545 664 m 39 10 d s 1622
+ 683 m 22 -16 d s 1584 674 m 38 9 d s 1661 693 m 22 -17 d s 1622 683 m 39 10 d s
+ 1699 703 m 22 -17 d s 1661 693 m 38 10 d s 1737 713 m 22 -17 d s 1699 703 m 38
+ 10 d s 1776 723 m 22 -17 d s 1737 713 m 39 10 d s 641 434 m 2 X s 646 435 m 2 1
+ d s 651 436 m 13 3 d s 641 456 m 23 -17 d s 603 447 m 38 9 d s 603 447 m 22 -17
+ d s 664 439 m 38 10 d s 680 466 m 22 -17 d s 641 456 m 39 10 d s 702 449 m 15 4
+ d s 720 454 m 2 X s 725 455 m 3 1 d s 718 476 m 22 -17 d s 680 466 m 38 10 d s
+ 757 486 m 22 -17 d s 718 476 m 39 10 d s 795 495 m 22 -17 d s 757 486 m 38 9 d
+ s 833 505 m 22 -17 d s 795 495 m 38 10 d s 872 515 m 22 -17 d s 833 505 m 39 10
+ d s 909 502 m 3 1 d s 914 503 m 3 1 d s 919 505 m 13 3 d s 910 525 m 22 -17 d s
+ 872 515 m 38 10 d s 932 508 m 38 10 d s 948 534 m 22 -16 d s 910 525 m 38 9 d s
+ 948 534 m 21 6 d s 1152 574 m 10 -8 d s 1177 570 m 3 1 d s 1183 572 m 2 X s
+ 1188 573 m 12 3 d s 1178 593 m 22 -17 d s 1153 586 m 25 7 d s 1211 579 m 2 X s
+ 1218 581 m 3 X s 1223 582 m 6 1 d s 1231 584 m 8 2 d s 1217 603 m 22 -17 d s
+ 1178 593 m 39 10 d s 1239 586 m 12 3 d s 1258 591 m 10 2 d s 1255 613 m 22 -17
+ d s 1217 603 m 38 10 d s 1293 622 m 22 -17 d s 1255 613 m 38 9 d s 1332 632 m
+ 22 -17 d s 1293 622 m 39 10 d s 1370 642 m 22 -17 d s 1332 632 m 38 10 d s 1392
+ 625 m 38 10 d s 1408 652 m 22 -17 d s 1370 642 m 38 10 d s 1430 635 m 39 9 d s
+ 1447 661 m 22 -17 d s 1408 652 m 39 9 d s 1485 671 m 22 -17 d s 1447 661 m 38
+ 10 d s 1523 681 m 22 -17 d s 1485 671 m 38 10 d s 1562 691 m 22 -17 d s 1523
+ 681 m 39 10 d s 1592 676 m 2 X s 1604 679 m 11 3 d s 1617 682 m 5 1 d s 1600
+ 700 m 22 -17 d s 1562 691 m 38 9 d s 1622 683 m 39 10 d s 1638 710 m 23 -17 d s
+ 1600 700 m 38 10 d s 1661 693 m 38 10 d s 1677 720 m 22 -17 d s 1638 710 m 39
+ 10 d s 1699 703 m 38 10 d s 1715 730 m 22 -17 d s 1677 720 m 38 10 d s 1744 715
+ m 5 1 d s 1756 718 m 10 2 d s 1771 721 m 5 2 d s 1753 739 m 23 -16 d s 1715 730
+ m 38 9 d s 619 473 m 22 -17 d s 581 463 m 38 10 d s 581 463 m 22 -16 d s 658
+ 483 m 22 -17 d s 619 473 m 39 10 d s 696 493 m 22 -17 d s 658 483 m 38 10 d s
+ 734 503 m 23 -17 d s 696 493 m 38 10 d s 773 512 m 22 -17 d s 734 503 m 39 9 d
+ s 811 522 m 22 -17 d s 773 512 m 38 10 d s 849 532 m 23 -17 d s 811 522 m 38 10
+ d s 888 542 m 22 -17 d s 849 532 m 39 10 d s 926 551 m 22 -17 d s 888 542 m 38
+ 9 d s 964 561 m 5 -4 d s 926 551 m 38 10 d s 964 561 m 6 1 d s 1156 610 m 22
+ -17 d s 1151 609 m 5 1 d s 1194 620 m 23 -17 d s 1156 610 m 38 10 d s 1233 629
+ m 22 -16 d s 1194 620 m 39 9 d s 1271 639 m 22 -17 d s 1233 629 m 38 10 d s
+ 1310 649 m 22 -17 d s 1271 639 m 39 10 d s 1348 659 m 22 -17 d s 1310 649 m 38
+ 10 d s 1386 668 m 22 -16 d s 1348 659 m 38 9 d s 1425 678 m 22 -17 d s 1386 668
+ m 39 10 d s 1463 688 m 22 -17 d s 1425 678 m 38 10 d s 1501 698 m 22 -17 d s
+ 1463 688 m 38 10 d s 1540 708 m 22 -17 d s 1501 698 m 39 10 d s 1578 717 m 22
+ -17 d s 1540 708 m 38 9 d s 1616 727 m 22 -17 d s 1578 717 m 38 10 d s 1655 737
+ m 22 -17 d s 1616 727 m 39 10 d s 1693 747 m 22 -17 d s 1655 737 m 38 10 d s
+ 1731 756 m 22 -17 d s 1693 747 m 38 9 d s 597 490 m 22 -17 d s 559 480 m 38 10
+ d s 559 480 m 22 -17 d s 636 500 m 22 -17 d s 597 490 m 39 10 d s 674 510 m 22
+ -17 d s 636 500 m 38 10 d s 712 519 m 22 -16 d s 674 510 m 38 9 d s 751 529 m
+ 22 -17 d s 712 519 m 39 10 d s 789 539 m 22 -17 d s 751 529 m 38 10 d s 827 549
+ m 22 -17 d s 789 539 m 38 10 d s 866 558 m 22 -16 d s 827 549 m 39 9 d s 904
+ 568 m 22 -17 d s 866 558 m 38 10 d s 942 578 m 22 -17 d s 904 568 m 38 10 d s
+ 942 578 m 28 7 d s 1151 614 m 5 -4 d s 1172 637 m 22 -17 d s 1152 631 m 20 6 d
+ s 1211 646 m 22 -17 d s 1172 637 m 39 9 d s 1249 656 m 22 -17 d s 1211 646 m 38
+ 10 d s 1287 666 m 23 -17 d s 1249 656 m 38 10 d s 1326 676 m 22 -17 d s 1287
+ 666 m 39 10 d s 1364 685 m 22 -17 d s 1326 676 m 38 9 d s 1402 695 m 23 -17 d s
+ 1364 685 m 38 10 d s 1441 705 m 22 -17 d s 1402 695 m 39 10 d s 1479 715 m 22
+ -17 d s 1441 705 m 38 10 d s 1517 724 m 23 -16 d s 1479 715 m 38 9 d s 1556 734
+ m 22 -17 d s 1517 724 m 39 10 d s 1594 744 m 22 -17 d s 1556 734 m 38 10 d s
+ 1632 754 m 23 -17 d s 1594 744 m 38 10 d s 1671 763 m 22 -16 d s 1632 754 m 39
+ 9 d s 1709 773 m 22 -17 d s 1671 763 m 38 10 d s 575 507 m 22 -17 d s 537 497 m
+ 38 10 d s 537 497 m 22 -17 d s 613 517 m 23 -17 d s 575 507 m 38 10 d s 652 527
+ m 22 -17 d s 613 517 m 39 10 d s 690 536 m 22 -17 d s 652 527 m 38 9 d s 728
+ 546 m 23 -17 d s 690 536 m 38 10 d s 767 556 m 22 -17 d s 728 546 m 39 10 d s
+ 805 566 m 22 -17 d s 767 556 m 38 10 d s 843 575 m 23 -17 d s 805 566 m 38 9 d
+ s 882 585 m 22 -17 d s 843 575 m 39 10 d s 920 595 m 22 -17 d s 882 585 m 38 10
+ d s 958 605 m 12 -9 d s 920 595 m 38 10 d s 958 605 m 11 2 d s 1153 652 m 19
+ -15 d s 1189 663 m 22 -17 d s 1153 654 m 36 9 d s 1227 673 m 22 -17 d s 1189
+ 663 m 38 10 d s 1265 683 m 22 -17 d s 1227 673 m 38 10 d s 1304 693 m 22 -17 d
+ s 1265 683 m 39 10 d s 1342 702 m 22 -17 d s 1304 693 m 38 9 d s 1380 712 m 22
+ -17 d s 1342 702 m 38 10 d s 1419 722 m 22 -17 d s 1380 712 m 39 10 d s 1457
+ 732 m 22 -17 d s 1419 722 m 38 10 d s 1495 741 m 22 -17 d s 1457 732 m 38 9 d s
+ 1534 751 m 22 -17 d s 1495 741 m 39 10 d s 1572 761 m 22 -17 d s 1534 751 m 38
+ 10 d s 1610 771 m 22 -17 d s 1572 761 m 38 10 d s 1649 780 m 22 -17 d s 1610
+ 771 m 39 9 d s 1687 790 m 22 -17 d s 1649 780 m 38 10 d s 553 524 m 22 -17 d s
+ 515 514 m 38 10 d s 515 514 m 22 -17 d s 591 534 m 22 -17 d s 553 524 m 38 10 d
+ s 630 543 m 22 -16 d s 591 534 m 39 9 d s 668 553 m 22 -17 d s 630 543 m 38 10
+ d s 706 563 m 22 -17 d s 668 553 m 38 10 d s 745 573 m 22 -17 d s 706 563 m 39
+ 10 d s 783 583 m 22 -17 d s 745 573 m 38 10 d s 821 592 m 22 -17 d s 783 583 m
+ 38 9 d s 860 602 m 22 -17 d s 821 592 m 39 10 d s 898 612 m 22 -17 d s 860 602
+ m 38 10 d s 936 622 m 22 -17 d s 898 612 m 38 10 d s 936 622 m 34 8 d s 1166
+ 680 m 23 -17 d s 1151 676 m 15 4 d s 1205 690 m 22 -17 d s 1166 680 m 39 10 d s
+ 1243 700 m 22 -17 d s 1205 690 m 38 10 d s 1281 709 m 23 -16 d s 1243 700 m 38
+ 9 d s 1320 719 m 22 -17 d s 1281 709 m 39 10 d s 1358 729 m 22 -17 d s 1320 719
+ m 38 10 d s 1396 739 m 23 -17 d s 1358 729 m 38 10 d s 1435 748 m 22 -16 d s
+ 1396 739 m 39 9 d s 1473 758 m 22 -17 d s 1435 748 m 38 10 d s 1511 768 m 23
+ -17 d s 1473 758 m 38 10 d s 1550 778 m 22 -17 d s 1511 768 m 39 10 d s 1588
+ 788 m 22 -17 d s 1550 778 m 38 10 d s 1627 797 m 22 -17 d s 1588 788 m 39 9 d s
+ 1665 807 m 22 -17 d s 1627 797 m 38 10 d s 531 541 m 22 -17 d s 492 531 m 39 10
+ d s 492 531 m 23 -17 d s 569 551 m 22 -17 d s 531 541 m 38 10 d s 607 560 m 23
+ -17 d s 569 551 m 38 9 d s 646 570 m 22 -17 d s 607 560 m 39 10 d s 684 580 m
+ 22 -17 d s 646 570 m 38 10 d s 723 590 m 22 -17 d s 684 580 m 39 10 d s 761 599
+ m 22 -16 d s 723 590 m 38 9 d s 799 609 m 22 -17 d s 761 599 m 38 10 d s 838
+ 619 m 22 -17 d s 799 609 m 39 10 d s 876 629 m 22 -17 d s 838 619 m 38 10 d s
+ 914 638 m 22 -16 d s 876 629 m 38 9 d s 953 648 m 17 -13 d s 914 638 m 39 10 d
+ s 953 648 m 17 5 d s 953 648 m 12 -9 d s 1075 679 m 16 4 d s 1144 697 m 22 -17
+ d s 1136 695 m 8 2 d s 1183 707 m 22 -17 d s 1144 697 m 39 10 d s 1221 717 m 22
+ -17 d s 1183 707 m 38 10 d s 1259 726 m 22 -17 d s 1221 717 m 38 9 d s 1298 736
+ m 22 -17 d s 1259 726 m 39 10 d s 1336 746 m 22 -17 d s 1298 736 m 38 10 d s
+ 1374 756 m 22 -17 d s 1336 746 m 38 10 d s 1413 765 m 22 -17 d s 1374 756 m 39
+ 9 d s 1451 775 m 22 -17 d s 1413 765 m 38 10 d s 1489 785 m 22 -17 d s 1451 775
+ m 38 10 d s 1528 795 m 22 -17 d s 1489 785 m 39 10 d s 1566 804 m 22 -16 d s
+ 1528 795 m 38 9 d s 1604 814 m 23 -17 d s 1566 804 m 38 10 d s 1643 824 m 22
+ -17 d s 1604 814 m 39 10 d s 492 531 m s 509 558 m 22 -17 d s 470 548 m 39 10 d
+ s 470 548 m 22 -17 d s 547 568 m 22 -17 d s 509 558 m 38 10 d s 585 577 m 22
+ -17 d s 547 568 m 38 9 d s 624 587 m 22 -17 d s 585 577 m 39 10 d s 662 597 m
+ 22 -17 d s 624 587 m 38 10 d s 700 607 m 23 -17 d s 662 597 m 38 10 d s 739 616
+ m 22 -17 d s 700 607 m 39 9 d s 777 626 m 22 -17 d s 739 616 m 38 10 d s 815
+ 636 m 23 -17 d s 777 626 m 38 10 d s 854 646 m 22 -17 d s 815 636 m 39 10 d s
+ 892 655 m 22 -17 d s 854 646 m 38 9 d s 930 665 m 23 -17 d s 892 655 m 38 10 d
+ s 930 665 m 39 10 d s 930 665 m 9 -6 d s 941 657 m 6 -5 d s 1084 704 m 15 -12 d
+ s 1068 700 m 16 4 d s 1122 714 m 22 -17 d s 1084 704 m 38 10 d s 1160 724 m 23
+ -17 d s 1122 714 m 38 10 d s 1199 733 m 22 -16 d s 1160 724 m 39 9 d s 1237 743
+ m 22 -17 d s 1199 733 m 38 10 d s 1276 753 m 22 -17 d s 1237 743 m 39 10 d s
+ 1314 763 m 22 -17 d s 1276 753 m 38 10 d s 1352 773 m 22 -17 d s 1314 763 m 38
+ 10 d s 1391 782 m 22 -17 d s 1352 773 m 39 9 d s 1429 792 m 22 -17 d s 1391 782
+ m 38 10 d s 1467 802 m 22 -17 d s 1429 792 m 38 10 d s 1506 812 m 22 -17 d s
+ 1467 802 m 39 10 d s 1544 821 m 22 -17 d s 1506 812 m 38 9 d s 1582 831 m 22
+ -17 d s 1544 821 m 38 10 d s 1621 841 m 22 -17 d s 1582 831 m 39 10 d s 487 575
+ m 22 -17 d s 448 565 m 39 10 d s 448 565 m 22 -17 d s 525 584 m 22 -16 d s 487
+ 575 m 38 9 d s 563 594 m 22 -17 d s 525 584 m 38 10 d s 602 604 m 22 -17 d s
+ 563 594 m 39 10 d s 640 614 m 22 -17 d s 602 604 m 38 10 d s 678 623 m 22 -16 d
+ s 640 614 m 38 9 d s 717 633 m 22 -17 d s 678 623 m 39 10 d s 755 643 m 22 -17
+ d s 717 633 m 38 10 d s 793 653 m 22 -17 d s 755 643 m 38 10 d s 832 663 m 22
+ -17 d s 793 653 m 39 10 d s 870 672 m 22 -17 d s 832 663 m 38 9 d s 908 682 m
+ 22 -17 d s 870 672 m 38 10 d s 947 692 m 22 -17 d s 908 682 m 39 10 d s 916 676
+ m 5 -3 d s 926 669 m 4 -4 d s 947 692 m 23 6 d s 1062 721 m 22 -17 d s 1055 719
+ m 7 2 d s 1100 731 m 22 -17 d s 1062 721 m 38 10 d s 1138 741 m 22 -17 d s 1100
+ 731 m 38 10 d s 1177 750 m 22 -17 d s 1138 741 m 39 9 d s 1215 760 m 22 -17 d s
+ 1177 750 m 38 10 d s 1253 770 m 23 -17 d s 1215 760 m 38 10 d s 1292 780 m 22
+ -17 d s 1253 770 m 39 10 d s 1330 789 m 22 -16 d s 1292 780 m 38 9 d s 1368 799
+ m 23 -17 d s 1330 789 m 38 10 d s 1407 809 m 22 -17 d s 1368 799 m 39 10 d s
+ 1445 819 m 22 -17 d s 1407 809 m 38 10 d s 1483 828 m 23 -16 d s 1445 819 m 38
+ 9 d s 1522 838 m 22 -17 d s 1483 828 m 39 10 d s 1560 848 m 22 -17 d s 1522 838
+ m 38 10 d s 1598 858 m 23 -17 d s 1560 848 m 38 10 d s 464 592 m 23 -17 d s 426
+ 582 m 38 10 d s 426 582 m 22 -17 d s 503 601 m 22 -17 d s 464 592 m 39 9 d s
+ 541 611 m 22 -17 d s 503 601 m 38 10 d s 579 621 m 23 -17 d s 541 611 m 38 10 d
+ s 618 631 m 22 -17 d s 579 621 m 39 10 d s 656 640 m 22 -17 d s 618 631 m 38 9
+ d s 694 650 m 23 -17 d s 656 640 m 38 10 d s 733 660 m 22 -17 d s 694 650 m 39
+ 10 d s 771 670 m 22 -17 d s 733 660 m 38 10 d s 809 679 m 23 -16 d s 771 670 m
+ 38 9 d s 848 689 m 22 -17 d s 809 679 m 39 10 d s 886 699 m 22 -17 d s 848 689
+ m 38 10 d s 924 709 m 23 -17 d s 886 699 m 38 10 d s 963 718 m 7 -5 d s 924 709
+ m 39 9 d s 963 718 m 7 2 d s 1040 738 m 22 -17 d s 1011 731 m 29 7 d s 1078 748
+ m 22 -17 d s 1040 738 m 38 10 d s 1116 758 m 22 -17 d s 1078 748 m 38 10 d s
+ 1155 767 m 22 -17 d s 1116 758 m 39 9 d s 1193 777 m 22 -17 d s 1155 767 m 38
+ 10 d s 1231 787 m 22 -17 d s 1193 777 m 38 10 d s 1270 797 m 22 -17 d s 1231
+ 787 m 39 10 d s 1308 806 m 22 -17 d s 1270 797 m 38 9 d s 1346 816 m 22 -17 d s
+ 1308 806 m 38 10 d s 1385 826 m 22 -17 d s 1346 816 m 39 10 d s 1423 836 m 22
+ -17 d s 1385 826 m 38 10 d s 1461 845 m 22 -17 d s 1423 836 m 38 9 d s 1500 855
+ m 22 -17 d s 1461 845 m 39 10 d s 1538 865 m 22 -17 d s 1500 855 m 38 10 d s
+ 1576 875 m 22 -17 d s 1538 865 m 38 10 d s 442 609 m 22 -17 d s 404 599 m 38 10
+ d s 404 599 m 22 -17 d s 481 618 m 22 -17 d s 442 609 m 39 9 d s 519 628 m 22
+ -17 d s 481 618 m 38 10 d s 557 638 m 22 -17 d s 519 628 m 38 10 d s 596 648 m
+ 22 -17 d s 557 638 m 39 10 d s 634 657 m 22 -17 d s 596 648 m 38 9 d s 672 667
+ m 22 -17 d s 634 657 m 38 10 d s 711 677 m 22 -17 d s 672 667 m 39 10 d s 749
+ 687 m 22 -17 d s 711 677 m 38 10 d s 787 696 m 22 -17 d s 749 687 m 38 9 d s
+ 826 706 m 22 -17 d s 787 696 m 39 10 d s 864 716 m 22 -17 d s 826 706 m 38 10 d
+ s 902 726 m 22 -17 d s 864 716 m 38 10 d s 941 735 m 22 -17 d s 902 726 m 39 9
+ d s 979 745 m 18 -13 d s 941 735 m 38 10 d s 1017 755 m 23 -17 d s 979 745 m 38
+ 10 d s 1056 765 m 22 -17 d s 1017 755 m 39 10 d s 1094 774 m 22 -16 d s 1056
+ 765 m 38 9 d s 1132 784 m 23 -17 d s 1094 774 m 38 10 d s 1171 794 m 22 -17 d s
+ 1132 784 m 39 10 d s 1209 804 m 22 -17 d s 1171 794 m 38 10 d s 1247 813 m 23
+ -16 d s 1209 804 m 38 9 d s 1286 823 m 22 -17 d s 1247 813 m 39 10 d s 1324 833
+ m 22 -17 d s 1286 823 m 38 10 d s 1362 843 m 23 -17 d s 1324 833 m 38 10 d s
+ 1401 853 m 22 -17 d s 1362 843 m 39 10 d s 1439 862 m 22 -17 d s 1401 853 m 38
+ 9 d s 1500 855 m 158 Y s 1461 1003 m 39 10 d s 1461 845 m 158 Y s 1439 1020 m
+ 22 -17 d s 1439 862 m 158 Y s 1477 1030 m 23 -17 d s 1439 1020 m 38 10 d s 1538
+ 865 m 79 Y s 1500 934 m 38 10 d s 1516 961 m 22 -17 d s 1498 956 m 18 5 d s
+ 1576 875 m 108 Y s 1538 973 m 38 10 d s 1538 944 m 29 Y s 1516 990 m 22 -17 d s
+ 1516 961 m 29 Y s 1554 1000 m 22 -17 d s 1516 990 m 38 10 d s 420 625 m 22 -16
+ d s 382 616 m 38 9 d s 382 616 m 22 -17 d s 458 635 m 23 -17 d s 420 625 m 38
+ 10 d s 497 645 m 22 -17 d s 458 635 m 39 10 d s 535 655 m 22 -17 d s 497 645 m
+ 38 10 d s 573 664 m 23 -16 d s 535 655 m 38 9 d s 612 674 m 22 -17 d s 573 664
+ m 39 10 d s 650 684 m 22 -17 d s 612 674 m 38 10 d s 689 694 m 22 -17 d s 650
+ 684 m 39 10 d s 727 703 m 22 -16 d s 689 694 m 38 9 d s 765 713 m 22 -17 d s
+ 727 703 m 38 10 d s 804 723 m 22 -17 d s 765 713 m 39 10 d s 842 733 m 22 -17 d
+ s 804 723 m 38 10 d s 880 743 m 22 -17 d s 842 733 m 38 10 d s 919 752 m 22 -17
+ d s 880 743 m 39 9 d s 957 762 m 22 -17 d s 919 752 m 38 10 d s 995 772 m 22
+ -17 d s 957 762 m 38 10 d s 1034 782 m 22 -17 d s 995 772 m 39 10 d s 1072 791
+ m 22 -17 d s 1034 782 m 38 9 d s 1110 801 m 22 -17 d s 1072 791 m 38 10 d s
+ 1149 811 m 22 -17 d s 1110 801 m 39 10 d s 1187 821 m 22 -17 d s 1149 811 m 38
+ 10 d s 1225 830 m 22 -17 d s 1187 821 m 38 9 d s 1264 840 m 22 -17 d s 1225 830
+ m 39 10 d s 1302 850 m 22 -17 d s 1264 840 m 38 10 d s 1340 860 m 22 -17 d s
+ 1302 850 m 38 10 d s 1379 869 m 22 -16 d s 1340 860 m 39 9 d s 1417 879 m 22
+ -17 d s 1379 869 m 38 10 d s 1417 958 m 22 -17 d s 1417 879 m 79 Y s 1417 958 m
+ 23 6 d s 1498 966 m 18 4 d s 1499 984 m 17 -14 d s 1554 1000 m 20 Y s 1516 1010
+ m 38 10 d s 1516 990 m 20 Y s 1494 1027 m 22 -17 d s 1494 1017 m 10 Y s 1532
+ 1037 m 22 -17 d s 1494 1027 m 38 10 d s 398 642 m 22 -17 d s 360 633 m 38 9 d s
+ 360 633 m 22 -17 d s 436 652 m 22 -17 d s 398 642 m 38 10 d s 475 662 m 22 -17
+ d s 436 652 m 39 10 d s 513 672 m 22 -17 d s 475 662 m 38 10 d s 551 681 m 22
+ -17 d s 513 672 m 38 9 d s 590 691 m 22 -17 d s 551 681 m 39 10 d s 628 701 m
+ 22 -17 d s 590 691 m 38 10 d s 666 711 m 23 -17 d s 628 701 m 38 10 d s 705 720
+ m 22 -17 d s 666 711 m 39 9 d s 743 730 m 22 -17 d s 705 720 m 38 10 d s 781
+ 740 m 23 -17 d s 743 730 m 38 10 d s 820 750 m 22 -17 d s 781 740 m 39 10 d s
+ 858 759 m 22 -16 d s 820 750 m 38 9 d s 896 769 m 23 -17 d s 858 759 m 38 10 d
+ s 935 779 m 22 -17 d s 896 769 m 39 10 d s 973 789 m 22 -17 d s 935 779 m 38 10
+ d s 1011 798 m 23 -16 d s 973 789 m 38 9 d s 1050 808 m 22 -17 d s 1011 798 m
+ 39 10 d s 1088 818 m 22 -17 d s 1050 808 m 38 10 d s 1126 828 m 23 -17 d s 1088
+ 818 m 38 10 d s 1165 838 m 22 -17 d s 1126 828 m 39 10 d s 1203 847 m 22 -17 d
+ s 1165 838 m 38 9 d s 1242 857 m 22 -17 d s 1203 847 m 39 10 d s 1280 867 m 22
+ -17 d s 1242 857 m 38 10 d s 1318 877 m 22 -17 d s 1280 867 m 38 10 d s 1357
+ 886 m 22 -17 d s 1318 877 m 39 9 d s 1395 896 m 22 -17 d s 1357 886 m 38 10 d s
+ 1395 955 m 22 -17 d s 1395 896 m 59 Y s 1433 965 m 3 -2 d s 1395 955 m 38 10 d
+ s 376 659 m 22 -17 d s 337 649 m 39 10 d s 337 649 m 23 -16 d s 414 669 m 22
+ -17 d s 376 659 m 38 10 d s 453 679 m 22 -17 d s 414 669 m 39 10 d s 513 672 m
+ 787 Y s 475 1450 m 38 9 d s 475 662 m 788 Y s 453 1467 m 22 -17 d s 453 679 m
+ 788 Y s 491 1476 m 22 -17 d s 453 1467 m 38 9 d s 551 681 m 867 Y s 513 1538 m
+ 38 10 d s 513 1459 m 79 Y s 491 1555 m 22 -17 d s 491 1476 m 79 Y s 529 1565 m
+ 22 -17 d s 491 1555 m 38 10 d s 590 691 m 788 Y s 551 1469 m 39 10 d s 568 1496
+ m 22 -17 d s 552 1492 m 16 4 d s 606 718 m 22 -17 d s 591 714 m 15 4 d s 644
+ 728 m 22 -17 d s 606 718 m 38 10 d s 683 737 m 22 -17 d s 644 728 m 39 9 d s
+ 721 747 m 22 -17 d s 683 737 m 38 10 d s 759 757 m 22 -17 d s 721 747 m 38 10 d
+ s 798 767 m 22 -17 d s 759 757 m 39 10 d s 836 776 m 22 -17 d s 798 767 m 38 9
+ d s 874 786 m 22 -17 d s 836 776 m 38 10 d s 913 796 m 22 -17 d s 874 786 m 39
+ 10 d s 951 806 m 22 -17 d s 913 796 m 38 10 d s 989 815 m 22 -17 d s 951 806 m
+ 38 9 d s 1028 825 m 22 -17 d s 989 815 m 39 10 d s 1066 835 m 22 -17 d s 1028
+ 825 m 38 10 d s 1104 845 m 22 -17 d s 1066 835 m 38 10 d s 1143 854 m 22 -16 d
+ s 1104 845 m 39 9 d s 1181 864 m 22 -17 d s 1143 854 m 38 10 d s 1219 874 m 23
+ -17 d s 1181 864 m 38 10 d s 1258 884 m 22 -17 d s 1219 874 m 39 10 d s 1296
+ 893 m 22 -16 d s 1258 884 m 38 9 d s 1334 903 m 23 -17 d s 1296 893 m 38 10 d s
+ 1373 913 m 22 -17 d s 1334 903 m 39 10 d s 1373 913 m 23 6 d s 337 649 m cl s
+ 354 676 m 22 -17 d s 315 666 m 39 10 d s 315 666 m 22 -17 d s 392 686 m 22 -17
+ d s 354 676 m 38 10 d s 430 696 m 23 -17 d s 392 686 m 38 10 d s 453 1536 m 38
+ 9 d s 453 1467 m 69 Y s 430 1552 m 23 -16 d s 430 696 m 856 Y s 469 1562 m 22
+ -17 d s 430 1552 m 39 10 d s 568 1496 m 226 Y s 529 1713 m 39 9 d s 529 1565 m
+ 148 Y s 507 1730 m 22 -17 d s 507 1559 m 171 Y s 545 1739 m 23 -17 d s 507 1730
+ m 38 9 d s 589 730 m 17 -12 d s 622 744 m 22 -16 d s 589 736 m 33 8 d s 660 754
+ m 23 -17 d s 622 744 m 38 10 d s 699 764 m 22 -17 d s 660 754 m 39 10 d s 737
+ 774 m 22 -17 d s 699 764 m 38 10 d s 775 783 m 23 -16 d s 737 774 m 38 9 d s
+ 814 793 m 22 -17 d s 775 783 m 39 10 d s 852 803 m 22 -17 d s 814 793 m 38 10 d
+ s 890 813 m 23 -17 d s 852 803 m 38 10 d s 929 823 m 22 -17 d s 890 813 m 39 10
+ d s 967 832 m 22 -17 d s 929 823 m 38 9 d s 1006 842 m 22 -17 d s 967 832 m 39
+ 10 d s 1044 852 m 22 -17 d s 1006 842 m 38 10 d s 1082 862 m 22 -17 d s 1044
+ 852 m 38 10 d s 1121 871 m 22 -17 d s 1082 862 m 39 9 d s 1159 881 m 22 -17 d s
+ 1121 871 m 38 10 d s 1197 891 m 22 -17 d s 1159 881 m 38 10 d s 1236 901 m 22
+ -17 d s 1197 891 m 39 10 d s 1274 910 m 22 -17 d s 1236 901 m 38 9 d s 1312 920
+ m 22 -17 d s 1274 910 m 38 10 d s 1351 930 m 22 -17 d s 1312 920 m 39 10 d s
+ 1389 940 m 5 -5 d s 1351 930 m 38 10 d s 1389 940 m 5 1 d s 332 693 m 22 -17 d
+ s 293 683 m 39 10 d s 293 683 m 22 -17 d s 370 703 m 22 -17 d s 332 693 m 38 10
+ d s 408 713 m 22 -17 d s 370 703 m 38 10 d s 408 1530 m 22 -17 d s 408 713 m
+ 817 Y s 408 1530 m 23 6 d s 485 1658 m 22 -17 d s 485 1549 m 109 Y s 485 1658 m
+ 20 5 d s 600 761 m 22 -17 d s 590 759 m 10 2 d s 638 771 m 22 -17 d s 600 761 m
+ 38 10 d s 677 781 m 22 -17 d s 638 771 m 39 10 d s 715 791 m 22 -17 d s 677 781
+ m 38 10 d s 753 800 m 22 -17 d s 715 791 m 38 9 d s 792 810 m 22 -17 d s 753
+ 800 m 39 10 d s 830 820 m 22 -17 d s 792 810 m 38 10 d s 868 830 m 22 -17 d s
+ 830 820 m 38 10 d s 907 839 m 22 -16 d s 868 830 m 39 9 d s 945 849 m 22 -17 d
+ s 907 839 m 38 10 d s 983 859 m 23 -17 d s 945 849 m 38 10 d s 1022 869 m 22
+ -17 d s 983 859 m 39 10 d s 1060 878 m 22 -16 d s 1022 869 m 38 9 d s 1098 888
+ m 23 -17 d s 1060 878 m 38 10 d s 1137 898 m 22 -17 d s 1098 888 m 39 10 d s
+ 1175 908 m 22 -17 d s 1137 898 m 38 10 d s 1213 918 m 23 -17 d s 1175 908 m 38
+ 10 d s 1252 927 m 22 -17 d s 1213 918 m 39 9 d s 1290 937 m 22 -17 d s 1252 927
+ m 38 10 d s 1328 947 m 23 -17 d s 1290 937 m 38 10 d s 1367 957 m 22 -17 d s
+ 1328 947 m 39 10 d s 1405 966 m 8 -6 d s 1367 957 m 38 9 d s 1405 966 m 36 9 d
+ s 293 683 m cl s 309 710 m 23 -17 d s 271 700 m 38 10 d s 271 700 m 22 -17 d s
+ 348 720 m 22 -17 d s 309 710 m 39 10 d s 386 729 m 22 -16 d s 348 720 m 38 9 d
+ s 386 729 m 22 6 d s 590 769 m 10 -8 d s 616 788 m 22 -17 d s 591 782 m 25 6 d
+ s 655 798 m 22 -17 d s 616 788 m 39 10 d s 693 808 m 22 -17 d s 655 798 m 38 10
+ d s 731 817 m 22 -17 d s 693 808 m 38 9 d s 770 827 m 22 -17 d s 731 817 m 39
+ 10 d s 808 837 m 22 -17 d s 770 827 m 38 10 d s 846 847 m 22 -17 d s 808 837 m
+ 38 10 d s 885 856 m 22 -17 d s 846 847 m 39 9 d s 923 866 m 22 -17 d s 885 856
+ m 38 10 d s 961 876 m 22 -17 d s 923 866 m 38 10 d s 1000 886 m 22 -17 d s 961
+ 876 m 39 10 d s 1038 895 m 22 -17 d s 1000 886 m 38 9 d s 1076 905 m 22 -17 d s
+ 1038 895 m 38 10 d s 1115 915 m 22 -17 d s 1076 905 m 39 10 d s 1153 925 m 22
+ -17 d s 1115 915 m 38 10 d s 1191 934 m 22 -16 d s 1153 925 m 38 9 d s 1230 944
+ m 22 -17 d s 1191 934 m 39 10 d s 1268 954 m 22 -17 d s 1230 944 m 38 10 d s
+ 1323 946 m 3 X s 1306 964 m 22 -17 d s 1268 954 m 38 10 d s 1345 973 m 22 -16 d
+ s 1306 964 m 39 9 d s 1383 983 m 22 -17 d s 1345 973 m 38 10 d s 1438 975 m 3 X
+ s 1421 993 m 20 -15 d s 1383 983 m 38 10 d s 287 727 m 22 -17 d s 249 717 m 38
+ 10 d s 249 717 m 22 -17 d s 326 737 m 22 -17 d s 287 727 m 39 10 d s 364 746 m
+ 22 -17 d s 326 737 m 38 9 d s 402 756 m 5 -4 d s 364 746 m 38 10 d s 402 756 m
+ 5 1 d s 594 805 m 22 -17 d s 589 804 m 5 1 d s 632 815 m 23 -17 d s 594 805 m
+ 38 10 d s 671 824 m 22 -16 d s 632 815 m 39 9 d s 709 834 m 22 -17 d s 671 824
+ m 38 10 d s 747 844 m 23 -17 d s 709 834 m 38 10 d s 709 834 m 17 -13 d s 786
+ 854 m 22 -17 d s 747 844 m 39 10 d s 824 863 m 22 -16 d s 786 854 m 38 9 d s
+ 862 873 m 23 -17 d s 824 863 m 38 10 d s 901 883 m 22 -17 d s 862 873 m 39 10 d
+ s 939 893 m 22 -17 d s 901 883 m 38 10 d s 977 903 m 23 -17 d s 939 893 m 38 10
+ d s 1016 912 m 22 -17 d s 977 903 m 39 9 d s 1054 922 m 22 -17 d s 1016 912 m
+ 38 10 d s 1092 932 m 23 -17 d s 1054 922 m 38 10 d s 1131 942 m 22 -17 d s 1092
+ 932 m 39 10 d s 1169 951 m 22 -17 d s 1131 942 m 38 9 d s 1208 961 m 22 -17 d s
+ 1169 951 m 39 10 d s 1246 971 m 22 -17 d s 1208 961 m 38 10 d s 1284 981 m 22
+ -17 d s 1246 971 m 38 10 d s 1323 990 m 22 -17 d s 1284 981 m 39 9 d s 1361
+ 1000 m 22 -17 d s 1323 990 m 38 10 d s 1399 1010 m 22 -17 d s 1361 1000 m 38 10
+ d s 249 717 m cl s 265 744 m 22 -17 d s 227 734 m 38 10 d s 227 734 m 22 -17 d
+ s 303 754 m 23 -17 d s 265 744 m 38 10 d s 342 763 m 22 -17 d s 303 754 m 39 9
+ d s 380 773 m 22 -17 d s 342 763 m 38 10 d s 380 773 m 28 7 d s 589 809 m 5 -4
+ d s 610 832 m 22 -17 d s 590 826 m 20 6 d s 649 841 m 22 -17 d s 610 832 m 39 9
+ d s 687 851 m 22 -17 d s 649 841 m 38 10 d s 725 861 m 22 -17 d s 687 851 m 38
+ 10 d s 764 871 m 22 -17 d s 725 861 m 39 10 d s 802 880 m 22 -17 d s 764 871 m
+ 38 9 d s 840 890 m 22 -17 d s 802 880 m 38 10 d s 879 900 m 22 -17 d s 840 890
+ m 39 10 d s 917 910 m 22 -17 d s 879 900 m 38 10 d s 955 919 m 22 -16 d s 917
+ 910 m 38 9 d s 994 929 m 22 -17 d s 955 919 m 39 10 d s 1032 939 m 22 -17 d s
+ 994 929 m 38 10 d s 1070 949 m 22 -17 d s 1032 939 m 38 10 d s 1109 958 m 22
+ -16 d s 1070 949 m 39 9 d s 1147 968 m 22 -17 d s 1109 958 m 38 10 d s 1185 978
+ m 23 -17 d s 1147 968 m 38 10 d s 1224 988 m 22 -17 d s 1185 978 m 39 10 d s
+ 1279 979 m 3 1 d s 1262 998 m 22 -17 d s 1224 988 m 38 10 d s 1300 1007 m 23
+ -17 d s 1262 998 m 38 9 d s 1339 1017 m 22 -17 d s 1300 1007 m 39 10 d s 1377
+ 1027 m 22 -17 d s 1339 1017 m 38 10 d s [4 8] 0 sd 227 931 m 180 46 d s 589
+ 1023 m 788 201 d s 227 1128 m 180 46 d s 589 1220 m 788 201 d s 227 1325 m 180
+ 46 d s 589 1417 m 788 201 d s 227 1522 m 258 66 d s 566 1608 m 811 207 d s 227
+ 1719 m 1150 293 d s [] 0 sd 227 734 m s 758 869 m 44 11 d s 979 925 m 111 29 d
+ s 1244 993 m 133 34 d s 1377 1027 m 1014 Y s 227 1748 m 1150 293 d s 227 734 m
+ 1014 Y s [4 8] 0 sd 1377 1224 m 664 -507 d s 1377 1421 m 664 -507 d s 1377 1618
+ m 664 -507 d s 1377 1815 m 664 -508 d s 1377 2012 m 664 -508 d s [] 0 sd 1377
+ 1027 m s 1437 981 m 3 -3 d s 1619 842 m 7 -5 d s 1709 773 m s 1951 589 m 7 -6 d
+ s 2041 520 m 1014 Y s 1377 2041 m 664 -507 d s 227 734 m 664 -507 d s 891 227 m
+ 1014 Y s 227 1748 m 664 -507 d s 227 734 m 1014 Y s 891 227 m 1150 293 d s 2041
+ 520 m 1014 Y s 891 1241 m 1150 293 d s 891 1241 m cl s 891 227 m 1150 293 d s
+ 891 193 m 34 Y s 914 216 m 17 Y s 937 222 m 17 Y s 960 227 m 17 Y s 983 233 m
+ 17 Y s 1006 222 m 34 Y s 1029 245 m 17 Y s 1052 251 m 17 Y s 1075 257 m 17 Y s
+ 1098 262 m 18 Y s 1121 251 m 34 Y s 1144 274 m 17 Y s 1167 280 m 17 Y s 1190
+ 286 m 17 Y s 1213 292 m 17 Y s 1236 281 m 34 Y s 1259 303 m 18 Y s 1282 309 m
+ 17 Y s 1305 315 m 17 Y s 1328 321 m 17 Y s 1351 310 m 34 Y s 1374 333 m 17 Y s
+ 1397 339 m 17 Y s 1420 344 m 18 Y s 1443 350 m 17 Y s 1466 339 m 34 Y s 1489
+ 362 m 17 Y s 1512 368 m 17 Y s 1535 374 m 17 Y s 1558 380 m 17 Y s 1581 368 m
+ 34 Y s 1604 391 m 17 Y s 1627 397 m 17 Y s 1650 403 m 17 Y s 1673 409 m 17 Y s
+ 1696 398 m 34 Y s 1719 421 m 17 Y s 1742 426 m 17 Y s 1765 432 m 17 Y s 1788
+ 438 m 17 Y s 1811 427 m 34 Y s 1834 450 m 17 Y s 1857 456 m 17 Y s 1880 462 m
+ 17 Y s 1903 467 m 17 Y s 1926 456 m 34 Y s 1949 479 m 17 Y s 1972 485 m 17 Y s
+ 1995 491 m 17 Y s 2018 497 m 17 Y s 2041 486 m 34 Y s 893 174 m -4 -2 d -3 -5 d
+ -2 -7 d -5 Y 2 -7 d 3 -5 d 4 -1 d 3 X 5 1 d 3 5 d 1 7 d 5 Y -1 7 d -3 5 d -5 2
+ d -3 X cl s 994 203 m -5 -2 d -3 -4 d -2 -8 d -4 Y 2 -8 d 3 -4 d 5 -2 d 3 X 4 2
+ d 3 4 d 2 8 d 4 Y -2 8 d -3 4 d -4 2 d -3 X cl s 1018 174 m -2 -1 d 2 -2 d 1 2
+ d -1 1 d cl s 1034 197 m 3 1 d 5 5 d -32 Y s 1109 232 m -5 -1 d -3 -5 d -2 -8 d
+ -4 Y 2 -8 d 3 -4 d 5 -2 d 3 X 4 2 d 3 4 d 2 8 d 4 Y -2 8 d -3 5 d -4 1 d -3 X
+ cl s 1133 203 m -2 -1 d 2 -2 d 1 2 d -1 1 d cl s 1146 225 m 1 Y 2 3 d 1 2 d 3 1
+ d 6 X 3 -1 d 2 -2 d 1 -3 d -3 Y -1 -3 d -3 -5 d -15 -15 d 21 X s 1224 261 m -5
+ -1 d -3 -5 d -2 -7 d -5 Y 2 -7 d 3 -5 d 5 -1 d 3 X 4 1 d 3 5 d 2 7 d 5 Y -2 7 d
+ -3 5 d -4 1 d -3 X cl s 1248 233 m -2 -2 d 2 -1 d 1 1 d -1 2 d cl s 1263 261 m
+ 17 X -10 -12 d 5 X 3 -1 d 2 -2 d 1 -4 d -3 Y -1 -5 d -4 -3 d -4 -1 d -5 X -4 1
+ d -2 2 d -1 3 d s 1339 291 m -5 -2 d -3 -4 d -1 -8 d -5 Y 1 -7 d 3 -5 d 5 -1 d
+ 3 X 4 1 d 3 5 d 2 7 d 5 Y -2 8 d -3 4 d -4 2 d -3 X cl s 1363 262 m -2 -2 d 2
+ -1 d 1 1 d -1 2 d cl s 1390 291 m -15 -22 d 23 X s 1390 291 m -32 Y s 1454 320
+ m -5 -2 d -3 -4 d -1 -8 d -4 Y 1 -8 d 3 -4 d 5 -2 d 3 X 4 2 d 3 4 d 2 8 d 4 Y
+ -2 8 d -3 4 d -4 2 d -3 X cl s 1478 291 m -2 -1 d 2 -2 d 1 2 d -1 1 d cl s 1508
+ 320 m -15 X -2 -14 d 2 2 d 4 1 d 5 X 5 -1 d 3 -3 d 1 -5 d -3 Y -1 -4 d -3 -3 d
+ -5 -2 d -5 X -4 2 d -2 1 d -1 3 d s 1569 349 m -5 -1 d -3 -5 d -1 -7 d -5 Y 1
+ -8 d 3 -4 d 5 -2 d 3 X 4 2 d 3 4 d 2 8 d 5 Y -2 7 d -3 5 d -4 1 d -3 X cl s
+ 1593 320 m -2 -1 d 2 -2 d 1 2 d -1 1 d cl s 1625 345 m -2 3 d -4 1 d -3 X -5 -1
+ d -3 -5 d -2 -7 d -8 Y 2 -6 d 3 -3 d 5 -2 d 1 X 5 2 d 3 3 d 1 5 d 1 Y -1 5 d -3
+ 3 d -5 1 d -1 X -5 -1 d -3 -3 d -2 -5 d s 1684 378 m -5 -1 d -3 -5 d -1 -7 d -5
+ Y 1 -7 d 3 -5 d 5 -1 d 3 X 4 1 d 3 5 d 2 7 d 5 Y -2 7 d -3 5 d -4 1 d -3 X cl s
+ 1708 350 m -2 -2 d 2 -1 d 1 1 d -1 2 d cl s 1741 378 m -15 -31 d s 1720 378 m
+ 21 X s 1799 408 m -5 -2 d -3 -4 d -1 -8 d -4 Y 1 -8 d 3 -4 d 5 -2 d 3 X 4 2 d 3
+ 4 d 2 8 d 4 Y -2 8 d -3 4 d -4 2 d -3 X cl s 1823 379 m -2 -1 d 2 -2 d 1 2 d -1
+ 1 d cl s 1843 408 m -5 -2 d -1 -3 d -3 Y 1 -3 d 3 -1 d 6 -2 d 5 -1 d 3 -3 d 1
+ -3 d -5 Y -1 -3 d -2 -1 d -4 -2 d -6 X -5 2 d -1 1 d -2 3 d 5 Y 2 3 d 3 3 d 4 1
+ d 6 2 d 3 1 d 2 3 d 3 Y -2 3 d -4 2 d -6 X cl s 1914 437 m -5 -1 d -3 -5 d -1
+ -8 d -4 Y 1 -8 d 3 -4 d 5 -2 d 3 X 4 2 d 3 4 d 2 8 d 4 Y -2 8 d -3 5 d -4 1 d
+ -3 X cl s 1938 408 m -2 -1 d 2 -2 d 1 2 d -1 1 d cl s 1970 426 m -2 -4 d -3 -3
+ d -4 -2 d -2 X -4 2 d -3 3 d -2 4 d 2 Y 2 5 d 3 3 d 4 1 d 2 X 4 -1 d 3 -3 d 2
+ -7 d -7 Y -2 -8 d -3 -4 d -4 -2 d -3 X -5 2 d -1 3 d s 2039 460 m 3 2 d 5 4 d
+ -31 Y s 891 227 m -664 507 d s 891 193 m 34 Y s 878 220 m 17 Y s 864 230 m 17 Y
+ s 851 240 m 17 Y s 838 250 m 17 Y s 825 243 m 35 Y s 811 271 m 17 Y s 798 281 m
+ 17 Y s 785 291 m 17 Y s 771 301 m 17 Y s 758 294 m 34 Y s 745 321 m 17 Y s 732
+ 332 m 17 Y s 718 342 m 17 Y s 705 352 m 17 Y s 692 345 m 34 Y s 678 372 m 17 Y
+ s 665 382 m 17 Y s 652 392 m 17 Y s 639 403 m 17 Y s 625 396 m 34 Y s 612 423 m
+ 17 Y s 599 433 m 17 Y s 585 443 m 17 Y s 572 453 m 17 Y s 559 446 m 34 Y s 546
+ 474 m 17 Y s 532 484 m 17 Y s 519 494 m 17 Y s 506 504 m 17 Y s 492 497 m 34 Y
+ s 479 524 m 17 Y s 466 534 m 17 Y s 453 545 m 17 Y s 439 555 m 17 Y s 426 548 m
+ 34 Y s 413 575 m 17 Y s 399 585 m 17 Y s 386 595 m 17 Y s 373 605 m 17 Y s 360
+ 599 m 34 Y s 346 626 m 17 Y s 333 636 m 17 Y s 320 646 m 17 Y s 306 656 m 17 Y
+ s 293 649 m 34 Y s 280 676 m 17 Y s 267 687 m 17 Y s 253 697 m 17 Y s 240 707 m
+ 17 Y s 227 700 m 34 Y s 891 193 m 34 Y s 880 133 m -5 -2 d -3 -4 d -1 -8 d -4 Y
+ 1 -8 d 3 -5 d 5 -1 d 3 X 4 1 d 3 5 d 2 8 d 4 Y -2 8 d -3 4 d -4 2 d -3 X cl s
+ 771 183 m -4 -1 d -3 -5 d -2 -7 d -5 Y 2 -7 d 3 -5 d 4 -1 d 3 X 5 1 d 3 5 d 2 7
+ d 5 Y -2 7 d -3 5 d -5 1 d -3 X cl s 796 155 m -2 -2 d 2 -1 d 1 1 d -1 2 d cl s
+ 812 177 m 3 2 d 5 4 d -31 Y s 705 234 m -5 -1 d -3 -5 d -1 -7 d -5 Y 1 -8 d 3
+ -4 d 5 -2 d 3 X 5 2 d 3 4 d 1 8 d 5 Y -1 7 d -3 5 d -5 1 d -3 X cl s 729 205 m
+ -1 -1 d 1 -2 d 2 2 d -2 1 d cl s 743 227 m 1 Y 1 3 d 2 2 d 3 1 d 6 X 3 -1 d 1
+ -2 d 2 -3 d -3 Y -2 -3 d -3 -5 d -15 -15 d 21 X s 639 285 m -5 -2 d -3 -4 d -1
+ -8 d -4 Y 1 -8 d 3 -4 d 5 -2 d 3 X 4 2 d 3 4 d 2 8 d 4 Y -2 8 d -3 4 d -4 2 d
+ -3 X cl s 663 256 m -2 -1 d 2 -2 d 1 2 d -1 1 d cl s 678 285 m 17 X -10 -12 d 5
+ X 3 -2 d 2 -1 d 1 -5 d -3 Y -1 -4 d -3 -3 d -5 -2 d -5 X -4 2 d -2 1 d -1 3 d s
+ 572 336 m -4 -2 d -3 -4 d -2 -8 d -5 Y 2 -7 d 3 -5 d 4 -1 d 3 X 5 1 d 3 5 d 1 7
+ d 5 Y -1 8 d -3 4 d -5 2 d -3 X cl s 596 307 m -1 -2 d 1 -1 d 2 1 d -2 2 d cl s
+ 624 336 m -16 -22 d 23 X s 624 336 m -32 Y s 506 386 m -5 -1 d -3 -5 d -1 -7 d
+ -5 Y 1 -7 d 3 -5 d 5 -1 d 3 X 4 1 d 3 5 d 2 7 d 5 Y -2 7 d -3 5 d -4 1 d -3 X
+ cl s 530 358 m -2 -2 d 2 -1 d 1 1 d -1 2 d cl s 560 386 m -15 X -1 -13 d 1 1 d
+ 5 2 d 4 X 5 -2 d 3 -3 d 1 -4 d -3 Y -1 -5 d -3 -3 d -5 -1 d -4 X -5 1 d -1 2 d
+ -2 3 d s 439 437 m -4 -2 d -3 -4 d -2 -8 d -4 Y 2 -8 d 3 -4 d 4 -2 d 3 X 5 2 d
+ 3 4 d 1 8 d 4 Y -1 8 d -3 4 d -5 2 d -3 X cl s 464 408 m -2 -1 d 2 -2 d 1 2 d
+ -1 1 d cl s 495 432 m -1 3 d -5 2 d -3 X -4 -2 d -3 -4 d -2 -8 d -7 Y 2 -6 d 3
+ -3 d 4 -2 d 2 X 4 2 d 3 3 d 2 4 d 2 Y -2 4 d -3 3 d -4 2 d -2 X -4 -2 d -3 -3 d
+ -2 -4 d s 373 488 m -5 -2 d -3 -4 d -1 -8 d -4 Y 1 -8 d 3 -5 d 5 -1 d 3 X 4 1 d
+ 4 5 d 1 8 d 4 Y -1 8 d -4 4 d -4 2 d -3 X cl s 397 459 m -1 -2 d 1 -1 d 2 1 d
+ -2 2 d cl s 430 488 m -15 -32 d s 409 488 m 21 X s 307 538 m -5 -1 d -3 -5 d -2
+ -7 d -5 Y 2 -7 d 3 -5 d 5 -1 d 3 X 4 1 d 3 5 d 2 7 d 5 Y -2 7 d -3 5 d -4 1 d
+ -3 X cl s 331 510 m -2 -2 d 2 -1 d 1 1 d -1 2 d cl s 350 538 m -4 -1 d -2 -3 d
+ -3 Y 2 -3 d 3 -2 d 6 -1 d 4 -2 d 3 -3 d 2 -3 d -4 Y -2 -3 d -1 -2 d -5 -1 d -6
+ X -4 1 d -2 2 d -1 3 d 4 Y 1 3 d 3 3 d 5 2 d 6 1 d 3 2 d 1 3 d 3 Y -1 3 d -5 1
+ d -6 X cl s 240 589 m -4 -1 d -3 -5 d -2 -7 d -5 Y 2 -8 d 3 -4 d 4 -2 d 3 X 5 2
+ d 3 4 d 1 8 d 5 Y -1 7 d -3 5 d -5 1 d -3 X cl s 264 560 m -1 -1 d 1 -2 d 2 2 d
+ -2 1 d cl s 296 579 m -1 -5 d -3 -3 d -5 -2 d -2 X -4 2 d -3 3 d -2 5 d 1 Y 2 5
+ d 3 3 d 4 1 d 2 X 5 -1 d 3 -3 d 1 -6 d -8 Y -1 -8 d -3 -4 d -5 -2 d -3 X -5 2 d
+ -1 3 d s 211 634 m 3 1 d 5 5 d -32 Y s 227 734 m 1014 Y s 193 734 m 34 X s 210
+ 783 m 17 X s 210 832 m 17 X s 210 882 m 17 X s 193 931 m 34 X s 210 980 m 17 X
+ s 210 1029 m 17 X s 210 1079 m 17 X s 193 1128 m 34 X s 210 1177 m 17 X s 210
+ 1226 m 17 X s 210 1276 m 17 X s 193 1325 m 34 X s 210 1374 m 17 X s 210 1423 m
+ 17 X s 210 1473 m 17 X s 193 1522 m 34 X s 210 1571 m 17 X s 210 1620 m 17 X s
+ 210 1670 m 17 X s 193 1719 m 34 X s 193 1719 m 34 X s 153 750 m -4 -2 d -3 -4 d
+ -2 -8 d -4 Y 2 -8 d 3 -4 d 4 -2 d 3 X 5 2 d 3 4 d 2 8 d 4 Y -2 8 d -3 4 d -5 2
+ d -3 X cl s 116 939 m 2 Y 1 3 d 2 1 d 3 2 d 6 X 3 -2 d 1 -1 d 2 -3 d -3 Y -2 -3
+ d -3 -5 d -15 -15 d 21 X s 153 947 m -4 -2 d -3 -4 d -2 -8 d -4 Y 2 -8 d 3 -4 d
+ 4 -2 d 3 X 5 2 d 3 4 d 2 8 d 4 Y -2 8 d -3 4 d -5 2 d -3 X cl s 129 1144 m -15
+ -21 d 23 X s 129 1144 m -32 Y s 153 1144 m -4 -2 d -3 -4 d -2 -8 d -4 Y 2 -8 d
+ 3 -4 d 4 -2 d 3 X 5 2 d 3 4 d 2 8 d 4 Y -2 8 d -3 4 d -5 2 d -3 X cl s 134 1336
+ m -2 3 d -4 2 d -3 X -5 -2 d -3 -4 d -1 -8 d -7 Y 1 -6 d 3 -3 d 5 -2 d 1 X 5 2
+ d 3 3 d 1 4 d 2 Y -1 4 d -3 3 d -5 2 d -1 X -5 -2 d -3 -3 d -1 -4 d s 153 1341
+ m -4 -2 d -3 -4 d -2 -8 d -4 Y 2 -8 d 3 -4 d 4 -2 d 3 X 5 2 d 3 4 d 2 8 d 4 Y
+ -2 8 d -3 4 d -5 2 d -3 X cl s 122 1538 m -5 -2 d -1 -3 d -3 Y 1 -3 d 3 -1 d 6
+ -2 d 5 -1 d 3 -3 d 1 -3 d -5 Y -1 -3 d -2 -2 d -4 -1 d -6 X -5 1 d -1 2 d -2 3
+ d 5 Y 2 3 d 3 3 d 4 1 d 6 2 d 3 1 d 2 3 d 3 Y -2 3 d -4 2 d -6 X cl s 153 1538
+ m -4 -2 d -3 -4 d -2 -8 d -4 Y 2 -8 d 3 -5 d 4 -1 d 3 X 5 1 d 3 5 d 2 8 d 4 Y
+ -2 8 d -3 4 d -5 2 d -3 X cl s 88 1729 m 3 1 d 5 5 d -32 Y s 123 1735 m -4 -2 d
+ -3 -4 d -2 -8 d -4 Y 2 -8 d 3 -5 d 4 -1 d 3 X 5 1 d 3 5 d 1 8 d 4 Y -1 8 d -3 4
+ d -5 2 d -3 X cl s 153 1735 m -4 -2 d -3 -4 d -2 -8 d -4 Y 2 -8 d 3 -5 d 4 -1 d
+ 3 X 5 1 d 3 5 d 2 8 d 4 Y -2 8 d -3 4 d -5 2 d -3 X cl s 1041 71 m 18 X 3 Y -1
+ 3 d -2 2 d -3 1 d -4 X -3 -1 d -3 -3 d -2 -5 d -3 Y 2 -4 d 3 -4 d 3 -1 d 4 X 3
+ 1 d 3 4 d s 1068 80 m 17 -21 d s 1085 80 m -17 -21 d s 1112 80 m -21 Y s 1112
+ 76 m -3 3 d -3 1 d -5 X -3 -1 d -3 -3 d -1 -5 d -3 Y 1 -4 d 3 -4 d 3 -1 d 5 X 3
+ 1 d 3 4 d s 1124 80 m -21 Y s 1124 74 m 5 5 d 3 1 d 4 X 3 -1 d 2 -5 d -15 Y s
+ 1141 74 m 4 5 d 3 1 d 5 X 3 -1 d 1 -5 d -15 Y s 1170 80 m -32 Y s 1170 76 m 3 3
+ d 3 1 d 4 X 3 -1 d 3 -3 d 2 -5 d -3 Y -2 -4 d -3 -4 d -3 -1 d -4 X -3 1 d -3 4
+ d s 1198 91 m -32 Y s 1209 71 m 18 X 3 Y -2 3 d -1 2 d -3 1 d -5 X -3 -1 d -3
+ -3 d -1 -5 d -3 Y 1 -4 d 3 -4 d 3 -1 d 5 X 3 1 d 3 4 d s
+ gr gr
+showpage
+end
+%%EOF
diff --git a/gsl-1.9/doc/ieee754.texi b/gsl-1.9/doc/ieee754.texi
new file mode 100644
index 0000000..4cfecda
--- /dev/null
+++ b/gsl-1.9/doc/ieee754.texi
@@ -0,0 +1,461 @@
+@cindex IEEE floating point
+
+This chapter describes functions for examining the representation of
+floating point numbers and controlling the floating point environment of
+your program. The functions described in this chapter are declared in
+the header file @file{gsl_ieee_utils.h}.
+
+@menu
+* Representation of floating point numbers::
+* Setting up your IEEE environment::
+* IEEE References and Further Reading::
+@end menu
+
+@node Representation of floating point numbers
+@section Representation of floating point numbers
+@cindex IEEE format for floating point numbers
+@cindex bias, IEEE format
+@cindex exponent, IEEE format
+@cindex sign bit, IEEE format
+@cindex mantissa, IEEE format
+The IEEE Standard for Binary Floating-Point Arithmetic defines binary
+formats for single and double precision numbers. Each number is composed
+of three parts: a @dfn{sign bit} (@math{s}), an @dfn{exponent}
+(@math{E}) and a @dfn{fraction} (@math{f}). The numerical value of the
+combination @math{(s,E,f)} is given by the following formula,
+@tex
+\beforedisplay
+$$
+(-1)^s (1 \cdot fffff\dots) 2^E
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+(-1)^s (1.fffff...) 2^E
+@end example
+
+@end ifinfo
+@noindent
+@cindex normalized form, IEEE format
+@cindex denormalized form, IEEE format
+The sign bit is either zero or one. The exponent ranges from a minimum value
+@c{$E_{min}$}
+@math{E_min}
+to a maximum value
+@c{$E_{max}$}
+@math{E_max} depending on the precision. The exponent is converted to an
+unsigned number
+@math{e}, known as the @dfn{biased exponent}, for storage by adding a
+@dfn{bias} parameter,
+@c{$e = E + \hbox{\it bias}$}
+@math{e = E + bias}.
+The sequence @math{fffff...} represents the digits of the binary
+fraction @math{f}. The binary digits are stored in @dfn{normalized
+form}, by adjusting the exponent to give a leading digit of @math{1}.
+Since the leading digit is always 1 for normalized numbers it is
+assumed implicitly and does not have to be stored.
+Numbers smaller than
+@c{$2^{E_{min}}$}
+@math{2^(E_min)}
+are be stored in @dfn{denormalized form} with a leading zero,
+@tex
+\beforedisplay
+$$
+(-1)^s (0 \cdot fffff\dots) 2^{E_{min}}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+(-1)^s (0.fffff...) 2^(E_min)
+@end example
+
+@end ifinfo
+@noindent
+@cindex zero, IEEE format
+@cindex infinity, IEEE format
+This allows gradual underflow down to
+@c{$2^{E_{min} - p}$}
+@math{2^(E_min - p)} for @math{p} bits of precision.
+A zero is encoded with the special exponent of
+@c{$2^{E_{min}-1}$}
+@math{2^(E_min - 1)} and infinities with the exponent of
+@c{$2^{E_{max}+1}$}
+@math{2^(E_max + 1)}.
+
+@noindent
+@cindex single precision, IEEE format
+The format for single precision numbers uses 32 bits divided in the
+following way,
+
+@smallexample
+seeeeeeeefffffffffffffffffffffff
+
+s = sign bit, 1 bit
+e = exponent, 8 bits (E_min=-126, E_max=127, bias=127)
+f = fraction, 23 bits
+@end smallexample
+
+@noindent
+@cindex double precision, IEEE format
+The format for double precision numbers uses 64 bits divided in the
+following way,
+
+@smallexample
+seeeeeeeeeeeffffffffffffffffffffffffffffffffffffffffffffffffffff
+
+s = sign bit, 1 bit
+e = exponent, 11 bits (E_min=-1022, E_max=1023, bias=1023)
+f = fraction, 52 bits
+@end smallexample
+
+@noindent
+It is often useful to be able to investigate the behavior of a
+calculation at the bit-level and the library provides functions for
+printing the IEEE representations in a human-readable form.
+
+@comment float vs double vs long double
+@comment (how many digits are available for each)
+
+@deftypefun void gsl_ieee_fprintf_float (FILE * @var{stream}, const float * @var{x})
+@deftypefunx void gsl_ieee_fprintf_double (FILE * @var{stream}, const double * @var{x})
+These functions output a formatted version of the IEEE floating-point
+number pointed to by @var{x} to the stream @var{stream}. A pointer is
+used to pass the number indirectly, to avoid any undesired promotion
+from @code{float} to @code{double}. The output takes one of the
+following forms,
+
+@table @code
+@item NaN
+the Not-a-Number symbol
+
+@item Inf, -Inf
+positive or negative infinity
+
+@item 1.fffff...*2^E, -1.fffff...*2^E
+a normalized floating point number
+
+@item 0.fffff...*2^E, -0.fffff...*2^E
+a denormalized floating point number
+
+@item 0, -0
+positive or negative zero
+
+@comment @item [non-standard IEEE float], [non-standard IEEE double]
+@comment an unrecognized encoding
+@end table
+
+The output can be used directly in GNU Emacs Calc mode by preceding it
+with @code{2#} to indicate binary.
+@end deftypefun
+
+@deftypefun void gsl_ieee_printf_float (const float * @var{x})
+@deftypefunx void gsl_ieee_printf_double (const double * @var{x})
+These functions output a formatted version of the IEEE floating-point
+number pointed to by @var{x} to the stream @code{stdout}.
+@end deftypefun
+
+@noindent
+The following program demonstrates the use of the functions by printing
+the single and double precision representations of the fraction
+@math{1/3}. For comparison the representation of the value promoted from
+single to double precision is also printed.
+
+@example
+@verbatiminclude examples/ieee.c
+@end example
+
+@noindent
+The binary representation of @math{1/3} is @math{0.01010101... }. The
+output below shows that the IEEE format normalizes this fraction to give
+a leading digit of 1,
+
+@smallexample
+ f= 1.01010101010101010101011*2^-2
+fd= 1.0101010101010101010101100000000000000000000000000000*2^-2
+ d= 1.0101010101010101010101010101010101010101010101010101*2^-2
+@end smallexample
+
+@noindent
+The output also shows that a single-precision number is promoted to
+double-precision by adding zeros in the binary representation.
+
+@comment importance of using 1.234L in long double calculations
+
+@comment @example
+@comment int main (void)
+@comment @{
+@comment long double x = 1.0, y = 1.0;
+
+@comment x = x + 0.2;
+@comment y = y + 0.2L;
+
+@comment printf(" d %.20Lf\n",x);
+@comment printf("ld %.20Lf\n",y);
+
+@comment return 1;
+@comment @}
+
+@comment d 1.20000000000000001110
+@comment ld 1.20000000000000000004
+@comment @end example
+
+
+@node Setting up your IEEE environment
+@section Setting up your IEEE environment
+@cindex IEEE exceptions
+@cindex precision, IEEE arithmetic
+@cindex rounding mode
+@cindex arithmetic exceptions
+@cindex exceptions, IEEE arithmetic
+@cindex division by zero, IEEE exceptions
+@cindex underflow, IEEE exceptions
+@cindex overflow, IEEE exceptions
+The IEEE standard defines several @dfn{modes} for controlling the
+behavior of floating point operations. These modes specify the important
+properties of computer arithmetic: the direction used for rounding (e.g.
+whether numbers should be rounded up, down or to the nearest number),
+the rounding precision and how the program should handle arithmetic
+exceptions, such as division by zero.
+
+Many of these features can now be controlled via standard functions such
+as @code{fpsetround}, which should be used whenever they are available.
+Unfortunately in the past there has been no universal API for
+controlling their behavior---each system has had its own low-level way
+of accessing them. To help you write portable programs GSL allows you
+to specify modes in a platform-independent way using the environment
+variable @code{GSL_IEEE_MODE}. The library then takes care of all the
+necessary machine-specific initializations for you when you call the
+function @code{gsl_ieee_env_setup}.
+
+@deftypefun void gsl_ieee_env_setup ()
+This function reads the environment variable @code{GSL_IEEE_MODE} and
+attempts to set up the corresponding specified IEEE modes. The
+environment variable should be a list of keywords, separated by
+commas, like this,
+
+@display
+@code{GSL_IEEE_MODE} = "@var{keyword},@var{keyword},..."
+@end display
+
+@noindent
+where @var{keyword} is one of the following mode-names,
+
+@itemize @asis
+@item
+@code{single-precision}
+@item
+@code{double-precision}
+@item
+@code{extended-precision}
+@item
+@code{round-to-nearest}
+@item
+@code{round-down}
+@item
+@code{round-up}
+@item
+@code{round-to-zero}
+@item
+@code{mask-all}
+@item
+@code{mask-invalid}
+@item
+@code{mask-denormalized}
+@item
+@code{mask-division-by-zero}
+@item
+@code{mask-overflow}
+@item
+@code{mask-underflow}
+@item
+@code{trap-inexact}
+@item
+@code{trap-common}
+@end itemize
+
+If @code{GSL_IEEE_MODE} is empty or undefined then the function returns
+immediately and no attempt is made to change the system's IEEE
+mode. When the modes from @code{GSL_IEEE_MODE} are turned on the
+function prints a short message showing the new settings to remind you
+that the results of the program will be affected.
+
+If the requested modes are not supported by the platform being used then
+the function calls the error handler and returns an error code of
+@code{GSL_EUNSUP}.
+
+When options are specified using this method, the resulting mode is
+based on a default setting of the highest available precision (double
+precision or extended precision, depending on the platform) in
+round-to-nearest mode, with all exceptions enabled apart from the
+@sc{inexact} exception. The @sc{inexact} exception is generated
+whenever rounding occurs, so it must generally be disabled in typical
+scientific calculations. All other floating-point exceptions are
+enabled by default, including underflows and the use of denormalized
+numbers, for safety. They can be disabled with the individual
+@code{mask-} settings or together using @code{mask-all}.
+
+The following adjusted combination of modes is convenient for many
+purposes,
+
+@example
+GSL_IEEE_MODE="double-precision,"\
+ "mask-underflow,"\
+ "mask-denormalized"
+@end example
+
+@noindent
+This choice ignores any errors relating to small numbers (either
+denormalized, or underflowing to zero) but traps overflows, division by
+zero and invalid operations.
+@end deftypefun
+
+@noindent
+To demonstrate the effects of different rounding modes consider the
+following program which computes @math{e}, the base of natural
+logarithms, by summing a rapidly-decreasing series,
+@tex
+\beforedisplay
+$$
+e = 1 + {1 \over 2!} + {1 \over 3!} + {1 \over 4!} + \dots
+ = 2.71828182846...
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+e = 1 + 1/2! + 1/3! + 1/4! + ...
+ = 2.71828182846...
+@end example
+@end ifinfo
+
+@example
+@verbatiminclude examples/ieeeround.c
+@end example
+
+@noindent
+Here are the results of running the program in @code{round-to-nearest}
+mode. This is the IEEE default so it isn't really necessary to specify
+it here,
+
+@example
+$ GSL_IEEE_MODE="round-to-nearest" ./a.out
+i= 1 sum=1.000000000000000000 error=-1.71828
+i= 2 sum=2.000000000000000000 error=-0.718282
+....
+i=18 sum=2.718281828459045535 error=4.44089e-16
+i=19 sum=2.718281828459045535 error=4.44089e-16
+@end example
+
+@noindent
+After nineteen terms the sum converges to within @c{$4 \times 10^{-16}$}
+@math{4 \times 10^-16} of the correct value.
+If we now change the rounding mode to
+@code{round-down} the final result is less accurate,
+
+@example
+$ GSL_IEEE_MODE="round-down" ./a.out
+i= 1 sum=1.000000000000000000 error=-1.71828
+....
+i=19 sum=2.718281828459041094 error=-3.9968e-15
+@end example
+
+@noindent
+The result is about
+@c{$4 \times 10^{-15}$}
+@math{4 \times 10^-15}
+below the correct value, an order of magnitude worse than the result
+obtained in the @code{round-to-nearest} mode.
+
+If we change to rounding mode to @code{round-up} then the series no
+longer converges (the reason is that when we add each term to the sum
+the final result is always rounded up. This is guaranteed to increase the sum
+by at least one tick on each iteration). To avoid this problem we would
+need to use a safer converge criterion, such as @code{while (fabs(sum -
+oldsum) > epsilon)}, with a suitably chosen value of epsilon.
+
+Finally we can see the effect of computing the sum using
+single-precision rounding, in the default @code{round-to-nearest}
+mode. In this case the program thinks it is still using double precision
+numbers but the CPU rounds the result of each floating point operation
+to single-precision accuracy. This simulates the effect of writing the
+program using single-precision @code{float} variables instead of
+@code{double} variables. The iteration stops after about half the number
+of iterations and the final result is much less accurate,
+
+@example
+$ GSL_IEEE_MODE="single-precision" ./a.out
+....
+i=12 sum=2.718281984329223633 error=1.5587e-07
+@end example
+
+@noindent
+with an error of
+@c{$O(10^{-7})$}
+@math{O(10^-7)}, which corresponds to single
+precision accuracy (about 1 part in @math{10^7}). Continuing the
+iterations further does not decrease the error because all the
+subsequent results are rounded to the same value.
+
+@node IEEE References and Further Reading
+@section References and Further Reading
+
+The reference for the IEEE standard is,
+
+@itemize @asis
+@item
+ANSI/IEEE Std 754-1985, IEEE Standard for Binary Floating-Point Arithmetic.
+@end itemize
+
+@noindent
+A more pedagogical introduction to the standard can be found in the
+following paper,
+
+@itemize @asis
+@item
+David Goldberg: What Every Computer Scientist Should Know About
+Floating-Point Arithmetic. @cite{ACM Computing Surveys}, Vol.@: 23, No.@: 1
+(March 1991), pages 5--48.
+
+Corrigendum: @cite{ACM Computing Surveys}, Vol.@: 23, No.@: 3 (September
+1991), page 413. and see also the sections by B. A. Wichmann and Charles
+B. Dunham in Surveyor's Forum: ``What Every Computer Scientist Should
+Know About Floating-Point Arithmetic''. @cite{ACM Computing Surveys},
+Vol.@: 24, No.@: 3 (September 1992), page 319.
+@end itemize
+
+@noindent
+
+A detailed textbook on IEEE arithmetic and its practical use is
+available from SIAM Press,
+
+@itemize @asis
+@item
+Michael L. Overton, @cite{Numerical Computing with IEEE Floating Point Arithmetic},
+SIAM Press, ISBN 0898715717.
+@end itemize
+
+@noindent
+
+@comment to turn on math exception handling use __setfpucw, see
+@comment /usr/include/i386/fpu_control.h
+@comment e.g.
+@comment #include <math.h>
+@comment #include <stdio.h>
+@comment #include <fpu_control.h>
+@comment double f (double x);
+@comment int main ()
+@comment {
+@comment double a = 0;
+@comment double y, z;
+@comment __setfpucw(0x1372);
+@comment mention extended vs double precision on Pentium, and how to get around
+@comment it (-ffloat-store, or selective use of volatile)
+
+@comment On the alpha the option -mieee is needed with gcc
+@comment In Digital's compiler the equivalent is -ieee, -ieee-with-no-inexact
+@comment and -ieee-with-inexact, or -fpe1 or -fpe2
diff --git a/gsl-1.9/doc/initial-route.eps b/gsl-1.9/doc/initial-route.eps
new file mode 100644
index 0000000..0f7e864
--- /dev/null
+++ b/gsl-1.9/doc/initial-route.eps
@@ -0,0 +1,11867 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: GNU libplot drawing library 4.1
+%%Title: PostScript plot
+%%CreationDate: Thu Jan 4 10:56:26 2007
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 1
+%%Pages: 1
+%%PageOrder: Ascend
+%%Orientation: Portrait
+%%BoundingBox: 101 194 489 610
+%%DocumentNeededResources:
+%%DocumentSuppliedResources: procset GNU_libplot 1.0 0
+%%EndComments
+
+%%BeginDefaults
+%%PageResources:
+%%EndDefaults
+
+%%BeginProlog
+%%EndProlog
+
+%%BeginSetup
+/DrawDict 50 dict def
+DrawDict begin
+%%BeginResource procset GNU_libplot 1.0 0
+/none null def
+/numGraphicParameters 17 def
+/stringLimit 65535 def
+/arrowHeight 8 def
+/eoFillRule true def
+
+/Begin { save numGraphicParameters dict begin } def
+/End { end restore } def
+
+/SetB {
+dup type /nulltype eq {
+pop
+false /brushRightArrow idef
+false /brushLeftArrow idef
+true /brushNone idef
+} {
+/brushDashOffset idef
+/brushDashArray idef
+0 ne /brushRightArrow idef
+0 ne /brushLeftArrow idef
+/brushWidth idef
+false /brushNone idef
+} ifelse
+} def
+
+/SetCFg {
+/fgblue idef
+/fggreen idef
+/fgred idef
+} def
+
+/SetCBg {
+/bgblue idef
+/bggreen idef
+/bgred idef
+} def
+
+/SetF {
+/printSize idef
+/printFont idef
+} def
+
+/SetP {
+dup type /nulltype eq {
+pop true /patternNone idef
+} {
+/patternGrayLevel idef
+patternGrayLevel -1 eq {
+/patternString idef
+} if
+false /patternNone idef
+} ifelse
+} def
+
+/BSpl {
+0 begin
+storexyn
+newpath
+n 1 gt {
+0 0 0 0 0 0 1 1 true subspline
+n 2 gt {
+0 0 0 0 1 1 2 2 false subspline
+1 1 n 3 sub {
+/i exch def
+i 1 sub dup i dup i 1 add dup i 2 add dup false subspline
+} for
+n 3 sub dup n 2 sub dup n 1 sub dup 2 copy false subspline
+} if
+n 2 sub dup n 1 sub dup 2 copy 2 copy false subspline
+patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if
+brushNone not { istroke } if
+0 0 1 1 leftarrow
+n 2 sub dup 1 sub dup rightarrow
+} if
+end
+} dup 0 4 dict put def
+
+/Circ {
+newpath
+0 360 arc
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+} def
+
+/CBSpl {
+0 begin
+dup 2 gt {
+storexyn
+newpath
+n 1 sub dup 0 0 1 1 2 2 true subspline
+1 1 n 3 sub {
+/i exch def
+i 1 sub dup i dup i 1 add dup i 2 add dup false subspline
+} for
+n 3 sub dup n 2 sub dup n 1 sub dup 0 0 false subspline
+n 2 sub dup n 1 sub dup 0 0 1 1 false subspline
+patternNone not { ifill } if
+brushNone not { istroke } if
+} {
+Poly
+} ifelse
+end
+} dup 0 4 dict put def
+
+/Elli {
+0 begin
+newpath
+4 2 roll
+translate
+scale
+0 0 1 0 360 arc
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+end
+} dup 0 1 dict put def
+
+/Line {
+0 begin
+2 storexyn
+newpath
+x 0 get y 0 get moveto
+x 1 get y 1 get lineto
+brushNone not { istroke } if
+0 0 1 1 leftarrow
+0 0 1 1 rightarrow
+end
+} dup 0 4 dict put def
+
+/MLine {
+0 begin
+storexyn
+newpath
+n 1 gt {
+x 0 get y 0 get moveto
+1 1 n 1 sub {
+/i exch def
+x i get y i get lineto
+} for
+patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if
+brushNone not { istroke } if
+0 0 1 1 leftarrow
+n 2 sub dup n 1 sub dup rightarrow
+} if
+end
+} dup 0 4 dict put def
+
+/Poly {
+3 1 roll
+newpath
+moveto
+-1 add
+{ lineto } repeat
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+} def
+
+/Rect {
+0 begin
+/t exch def
+/r exch def
+/b exch def
+/l exch def
+newpath
+l b moveto
+l t lineto
+r t lineto
+r b lineto
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+end
+} dup 0 4 dict put def
+
+/Text {
+ishow
+} def
+
+/idef {
+dup where { pop pop pop } { exch def } ifelse
+} def
+
+/ifill {
+0 begin
+gsave
+patternGrayLevel -1 ne {
+fgred bgred fgred sub patternGrayLevel mul add
+fggreen bggreen fggreen sub patternGrayLevel mul add
+fgblue bgblue fgblue sub patternGrayLevel mul add setrgbcolor
+eoFillRule { eofill } { fill } ifelse
+} {
+eoFillRule { eoclip } { clip } ifelse
+originalCTM setmatrix
+pathbbox /t exch def /r exch def /b exch def /l exch def
+/w r l sub ceiling cvi def
+/h t b sub ceiling cvi def
+/imageByteWidth w 8 div ceiling cvi def
+/imageHeight h def
+bgred bggreen bgblue setrgbcolor
+eoFillRule { eofill } { fill } ifelse
+fgred fggreen fgblue setrgbcolor
+w 0 gt h 0 gt and {
+l b translate w h scale
+w h true [w 0 0 h neg 0 h] { patternproc } imagemask
+} if
+} ifelse
+grestore
+end
+} dup 0 8 dict put def
+
+/istroke {
+gsave
+brushDashOffset -1 eq {
+[] 0 setdash
+1 setgray
+} {
+brushDashArray brushDashOffset setdash
+fgred fggreen fgblue setrgbcolor
+} ifelse
+brushWidth setlinewidth
+originalCTM setmatrix
+stroke
+grestore
+} def
+
+/ishow {
+0 begin
+gsave
+fgred fggreen fgblue setrgbcolor
+/fontDict printFont findfont printSize scalefont dup setfont def
+/descender fontDict begin 0 /FontBBox load 1 get FontMatrix end
+transform exch pop def
+/vertoffset 1 printSize sub descender sub def {
+0 vertoffset moveto show
+/vertoffset vertoffset printSize sub def
+} forall
+grestore
+end
+} dup 0 3 dict put def
+
+/patternproc {
+0 begin
+/patternByteLength patternString length def
+/patternHeight patternByteLength 8 mul sqrt cvi def
+/patternWidth patternHeight def
+/patternByteWidth patternWidth 8 idiv def
+/imageByteMaxLength imageByteWidth imageHeight mul
+stringLimit patternByteWidth sub min def
+/imageMaxHeight imageByteMaxLength imageByteWidth idiv patternHeight idiv
+patternHeight mul patternHeight max def
+/imageHeight imageHeight imageMaxHeight sub store
+/imageString imageByteWidth imageMaxHeight mul patternByteWidth add string def
+0 1 imageMaxHeight 1 sub {
+/y exch def
+/patternRow y patternByteWidth mul patternByteLength mod def
+/patternRowString patternString patternRow patternByteWidth getinterval def
+/imageRow y imageByteWidth mul def
+0 patternByteWidth imageByteWidth 1 sub {
+/x exch def
+imageString imageRow x add patternRowString putinterval
+} for
+} for
+imageString
+end
+} dup 0 12 dict put def
+
+/min {
+dup 3 2 roll dup 4 3 roll lt { exch } if pop
+} def
+
+/max {
+dup 3 2 roll dup 4 3 roll gt { exch } if pop
+} def
+
+/midpoint {
+0 begin
+/y1 exch def
+/x1 exch def
+/y0 exch def
+/x0 exch def
+x0 x1 add 2 div
+y0 y1 add 2 div
+end
+} dup 0 4 dict put def
+
+/thirdpoint {
+0 begin
+/y1 exch def
+/x1 exch def
+/y0 exch def
+/x0 exch def
+x0 2 mul x1 add 3 div
+y0 2 mul y1 add 3 div
+end
+} dup 0 4 dict put def
+
+/subspline {
+0 begin
+/movetoNeeded exch def
+y exch get /y3 exch def
+x exch get /x3 exch def
+y exch get /y2 exch def
+x exch get /x2 exch def
+y exch get /y1 exch def
+x exch get /x1 exch def
+y exch get /y0 exch def
+x exch get /x0 exch def
+x1 y1 x2 y2 thirdpoint
+/p1y exch def
+/p1x exch def
+x2 y2 x1 y1 thirdpoint
+/p2y exch def
+/p2x exch def
+x1 y1 x0 y0 thirdpoint
+p1x p1y midpoint
+/p0y exch def
+/p0x exch def
+x2 y2 x3 y3 thirdpoint
+p2x p2y midpoint
+/p3y exch def
+/p3x exch def
+movetoNeeded { p0x p0y moveto } if
+p1x p1y p2x p2y p3x p3y curveto
+end
+} dup 0 17 dict put def
+
+/storexyn {
+/n exch def
+/y n array def
+/x n array def
+n 1 sub -1 0 {
+/i exch def
+y i 3 2 roll put
+x i 3 2 roll put
+} for
+} def
+
+/arrowhead {
+0 begin
+transform originalCTM itransform
+/taily exch def
+/tailx exch def
+transform originalCTM itransform
+/tipy exch def
+/tipx exch def
+/dy tipy taily sub def
+/dx tipx tailx sub def
+/angle dx 0 ne dy 0 ne or { dy dx atan } { 90 } ifelse def
+gsave
+originalCTM setmatrix
+tipx tipy translate
+angle rotate
+newpath
+arrowHeight neg arrowWidth 2 div moveto
+0 0 lineto
+arrowHeight neg arrowWidth 2 div neg lineto
+patternNone not {
+originalCTM setmatrix
+/padtip arrowHeight 2 exp 0.25 arrowWidth 2 exp mul add sqrt brushWidth mul
+arrowWidth div def
+/padtail brushWidth 2 div def
+tipx tipy translate
+angle rotate
+padtip 0 translate
+arrowHeight padtip add padtail add arrowHeight div dup scale
+arrowheadpath
+ifill
+} if
+brushNone not {
+originalCTM setmatrix
+tipx tipy translate
+angle rotate
+arrowheadpath
+istroke
+} if
+grestore
+end
+} dup 0 9 dict put def
+
+/arrowheadpath {
+newpath
+arrowHeight neg arrowWidth 2 div moveto
+0 0 lineto
+arrowHeight neg arrowWidth 2 div neg lineto
+} def
+
+/leftarrow {
+0 begin
+y exch get /taily exch def
+x exch get /tailx exch def
+y exch get /tipy exch def
+x exch get /tipx exch def
+brushLeftArrow { tipx tipy tailx taily arrowhead } if
+end
+} dup 0 4 dict put def
+
+/rightarrow {
+0 begin
+y exch get /tipy exch def
+x exch get /tipx exch def
+y exch get /taily exch def
+x exch get /tailx exch def
+brushRightArrow { tipx tipy tailx taily arrowhead } if
+end
+} dup 0 4 dict put def
+%%EndResource
+%%EndSetup
+
+%%Page: 1 1
+%%PageResources:
+%%PageBoundingBox: 101 194 489 610
+%%BeginPageSetup
+%I Idraw 8
+
+Begin
+%I b u
+%I cfg u
+%I cbg u
+%I f u
+%I p u
+%I t
+[ 1 0 0 1 0 0 ] concat
+/originalCTM matrix currentmatrix def
+/trueoriginalCTM matrix currentmatrix def
+%%EndPageSetup
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3399 10017
+3399 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3414 10017
+3414 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+3311 10017
+3297 9930
+3297 10017
+3517 10017
+3517 9930
+3502 10017
+6 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3355 9710
+3458 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+3781 9973
+3795 10017
+3795 9930
+3781 9973
+3751 10003
+3707 10017
+3663 10017
+3619 10003
+3590 9973
+3590 9944
+3605 9915
+3619 9900
+3649 9886
+3737 9856
+3766 9842
+3795 9812
+16 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+3590 9944
+3619 9915
+3649 9900
+3737 9871
+3766 9856
+3781 9842
+3795 9812
+3795 9754
+3766 9724
+3722 9710
+3678 9710
+3634 9724
+3605 9754
+3590 9798
+3590 9710
+3605 9754
+16 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3913 10017
+3913 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3927 10017
+3927 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+3869 10017
+4045 10017
+4089 10003
+4103 9988
+4118 9959
+4118 9915
+4103 9886
+4089 9871
+4045 9856
+3927 9856
+10 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+4045 10017
+4074 10003
+4089 9988
+4103 9959
+4103 9915
+4089 9886
+4074 9871
+4045 9856
+8 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3869 9710
+3971 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4455 9842
+4719 9842
+2 MLine
+End
+
+Begin %I Poly
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+5100 10003
+5086 9988
+5071 10003
+5086 10017
+4 Poly
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5086 9915
+5086 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5100 9915
+5100 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5042 9915
+5100 9915
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5042 9710
+5144 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5247 9915
+5247 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5261 9915
+5261 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+5261 9871
+5291 9900
+5335 9915
+5364 9915
+5408 9900
+5423 9871
+5423 9710
+7 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+5364 9915
+5393 9900
+5408 9871
+5408 9710
+4 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5203 9915
+5261 9915
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5203 9710
+5305 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5364 9710
+5467 9710
+2 MLine
+End
+
+Begin %I Poly
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+5584 10003
+5569 9988
+5555 10003
+5569 10017
+4 Poly
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5569 9915
+5569 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5584 9915
+5584 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5525 9915
+5584 9915
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5525 9710
+5628 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+5731 10017
+5731 9768
+5745 9724
+5775 9710
+5804 9710
+5833 9724
+5848 9754
+7 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+5745 10017
+5745 9768
+5760 9724
+5775 9710
+4 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5687 9915
+5804 9915
+2 MLine
+End
+
+Begin %I Poly
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+5965 10003
+5951 9988
+5936 10003
+5951 10017
+4 Poly
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5951 9915
+5951 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5965 9915
+5965 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5907 9915
+5965 9915
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5907 9710
+6009 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 13
+6112 9886
+6112 9871
+6097 9871
+6097 9886
+6112 9900
+6141 9915
+6200 9915
+6229 9900
+6244 9886
+6259 9856
+6259 9754
+6273 9724
+6288 9710
+13 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 5
+6244 9886
+6244 9754
+6259 9724
+6288 9710
+6302 9710
+5 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 11
+6244 9856
+6229 9842
+6141 9827
+6097 9812
+6083 9783
+6083 9754
+6097 9724
+6141 9710
+6185 9710
+6215 9724
+6244 9754
+11 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+6141 9827
+6112 9812
+6097 9783
+6097 9754
+6112 9724
+6141 9710
+6 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6405 10017
+6405 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6420 10017
+6420 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6361 10017
+6420 10017
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6361 9710
+6464 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6552 9842
+6816 9842
+2 MLine
+End
+
+Begin %I Poly
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+7036 9915
+7080 9900
+7109 9871
+7124 9827
+7124 9798
+7109 9754
+7080 9724
+7036 9710
+7006 9710
+6962 9724
+6933 9754
+6918 9798
+6918 9827
+6933 9871
+6962 9900
+7006 9915
+16 Poly
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+7006 9915
+6977 9900
+6948 9871
+6933 9827
+6933 9798
+6948 9754
+6977 9724
+7006 9710
+8 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+7036 9710
+7065 9724
+7094 9754
+7109 9798
+7109 9827
+7094 9871
+7065 9900
+7036 9915
+8 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7241 9915
+7241 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7256 9915
+7256 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+7256 9827
+7270 9871
+7299 9900
+7329 9915
+7373 9915
+7387 9900
+7387 9886
+7373 9871
+7358 9886
+7373 9900
+10 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7197 9915
+7256 9915
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7197 9710
+7299 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7637 10017
+7637 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7651 10017
+7651 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 14
+7637 9871
+7607 9900
+7578 9915
+7549 9915
+7505 9900
+7475 9871
+7461 9827
+7461 9798
+7475 9754
+7505 9724
+7549 9710
+7578 9710
+7607 9724
+7637 9754
+14 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+7549 9915
+7519 9900
+7490 9871
+7475 9827
+7475 9798
+7490 9754
+7519 9724
+7549 9710
+8 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7593 10017
+7651 10017
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7637 9710
+7695 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 17
+7783 9827
+7959 9827
+7959 9856
+7945 9886
+7930 9900
+7901 9915
+7857 9915
+7813 9900
+7783 9871
+7769 9827
+7769 9798
+7783 9754
+7813 9724
+7857 9710
+7886 9710
+7930 9724
+7959 9754
+17 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+7945 9827
+7945 9871
+7930 9900
+3 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+7857 9915
+7827 9900
+7798 9871
+7783 9827
+7783 9798
+7798 9754
+7827 9724
+7857 9710
+8 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8077 9915
+8077 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8091 9915
+8091 9710
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+8091 9827
+8106 9871
+8135 9900
+8165 9915
+8209 9915
+8223 9900
+8223 9886
+8209 9871
+8194 9886
+8209 9900
+10 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8033 9915
+8091 9915
+2 MLine
+End
+
+Begin %I MLine
+[1.040989 0 0 1.040989 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8033 9710
+8135 9710
+2 MLine
+End
+
+Begin %I Rect
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+2304 2304 9216 9216 Rect
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2059 2097
+2172 2097
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+2235 2147
+2247 2153
+2266 2172
+2266 2040
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2260 2166
+2260 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2235 2040
+2291 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+2361 2147
+2373 2153
+2392 2172
+2392 2040
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2386 2166
+2386 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2361 2040
+2417 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2524 2159
+2524 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2530 2172
+2530 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+2530 2172
+2461 2078
+2562 2078
+3 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2505 2040
+2549 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 9216
+2304 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2304 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2827 2097
+2940 2097
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+3003 2147
+3015 2153
+3034 2172
+3034 2040
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3028 2166
+3028 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3003 2040
+3059 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+3129 2147
+3141 2153
+3160 2172
+3160 2040
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3154 2166
+3154 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3129 2040
+3185 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 20
+3242 2147
+3248 2141
+3242 2134
+3235 2141
+3235 2147
+3242 2159
+3248 2166
+3267 2172
+3292 2172
+3311 2166
+3317 2159
+3323 2147
+3323 2134
+3317 2122
+3298 2109
+3267 2097
+3254 2090
+3242 2078
+3235 2059
+3235 2040
+20 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+3292 2172
+3304 2166
+3311 2159
+3317 2147
+3317 2134
+3311 2122
+3292 2109
+3267 2097
+8 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+3235 2053
+3242 2059
+3254 2059
+3286 2046
+3304 2046
+3317 2053
+3323 2059
+7 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+3254 2059
+3286 2040
+3311 2040
+3317 2046
+3323 2059
+3323 2072
+6 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3072 9216
+3072 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3072 2304
+3072 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3595 2097
+3708 2097
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+3771 2147
+3783 2153
+3802 2172
+3802 2040
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3796 2166
+3796 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3771 2040
+3827 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+3897 2147
+3909 2153
+3928 2172
+3928 2040
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3922 2166
+3922 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3897 2040
+3953 2040
+2 MLine
+End
+
+Begin %I Poly
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+4054 2172
+4072 2166
+4085 2147
+4091 2115
+4091 2097
+4085 2065
+4072 2046
+4054 2040
+4041 2040
+4022 2046
+4010 2065
+4003 2097
+4003 2115
+4010 2147
+4022 2166
+4041 2172
+16 Poly
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+4041 2172
+4029 2166
+4022 2159
+4016 2147
+4010 2115
+4010 2097
+4016 2065
+4022 2053
+4029 2046
+4041 2040
+10 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+4054 2040
+4066 2046
+4072 2053
+4079 2065
+4085 2097
+4085 2115
+4079 2147
+4072 2159
+4066 2166
+4054 2172
+10 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3840 9216
+3840 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3840 2304
+3840 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4363 2097
+4476 2097
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+4539 2147
+4551 2153
+4570 2172
+4570 2040
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4564 2166
+4564 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4539 2040
+4595 2040
+2 MLine
+End
+
+Begin %I Poly
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+4696 2172
+4715 2166
+4727 2147
+4734 2115
+4734 2097
+4727 2065
+4715 2046
+4696 2040
+4683 2040
+4665 2046
+4652 2065
+4646 2097
+4646 2115
+4652 2147
+4665 2166
+4683 2172
+16 Poly
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+4683 2172
+4671 2166
+4665 2159
+4658 2147
+4652 2115
+4652 2097
+4658 2065
+4665 2053
+4671 2046
+4683 2040
+10 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+4696 2040
+4709 2046
+4715 2053
+4721 2065
+4727 2097
+4727 2115
+4721 2147
+4715 2159
+4709 2166
+4696 2172
+10 MLine
+End
+
+Begin %I Poly
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 12
+4828 2172
+4847 2166
+4853 2153
+4853 2134
+4847 2122
+4828 2115
+4803 2115
+4784 2122
+4778 2134
+4778 2153
+4784 2166
+4803 2172
+12 Poly
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+4803 2172
+4790 2166
+4784 2153
+4784 2134
+4790 2122
+4803 2115
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+4828 2115
+4840 2122
+4847 2134
+4847 2153
+4840 2166
+4828 2172
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+4803 2115
+4784 2109
+4778 2103
+4771 2090
+4771 2065
+4778 2053
+4784 2046
+4803 2040
+4828 2040
+4847 2046
+4853 2053
+4859 2065
+4859 2090
+4853 2103
+4847 2109
+4828 2115
+16 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+4803 2115
+4790 2109
+4784 2103
+4778 2090
+4778 2065
+4784 2053
+4790 2046
+4803 2040
+8 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+4828 2040
+4840 2046
+4847 2053
+4853 2065
+4853 2090
+4847 2103
+4840 2109
+4828 2115
+8 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4608 9216
+4608 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4608 2304
+4608 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5131 2097
+5244 2097
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+5307 2147
+5319 2153
+5338 2172
+5338 2040
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5332 2166
+5332 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5307 2040
+5363 2040
+2 MLine
+End
+
+Begin %I Poly
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+5464 2172
+5483 2166
+5495 2147
+5502 2115
+5502 2097
+5495 2065
+5483 2046
+5464 2040
+5451 2040
+5433 2046
+5420 2065
+5414 2097
+5414 2115
+5420 2147
+5433 2166
+5451 2172
+16 Poly
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+5451 2172
+5439 2166
+5433 2159
+5426 2147
+5420 2115
+5420 2097
+5426 2065
+5433 2053
+5439 2046
+5451 2040
+10 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+5464 2040
+5477 2046
+5483 2053
+5489 2065
+5495 2097
+5495 2115
+5489 2147
+5483 2159
+5477 2166
+5464 2172
+10 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 28
+5615 2153
+5608 2147
+5615 2141
+5621 2147
+5621 2153
+5615 2166
+5602 2172
+5583 2172
+5565 2166
+5552 2153
+5546 2141
+5539 2115
+5539 2078
+5546 2059
+5558 2046
+5577 2040
+5590 2040
+5608 2046
+5621 2059
+5627 2078
+5627 2084
+5621 2103
+5608 2115
+5590 2122
+5583 2122
+5565 2115
+5552 2103
+5546 2084
+28 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 9
+5583 2172
+5571 2166
+5558 2153
+5552 2141
+5546 2115
+5546 2078
+5552 2059
+5565 2046
+5577 2040
+9 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+5590 2040
+5602 2046
+5615 2059
+5621 2078
+5621 2084
+5615 2103
+5602 2115
+5590 2122
+8 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5376 9216
+5376 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5376 2304
+5376 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5899 2097
+6012 2097
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+6075 2147
+6087 2153
+6106 2172
+6106 2040
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6100 2166
+6100 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6075 2040
+6131 2040
+2 MLine
+End
+
+Begin %I Poly
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+6232 2172
+6251 2166
+6263 2147
+6270 2115
+6270 2097
+6263 2065
+6251 2046
+6232 2040
+6219 2040
+6201 2046
+6188 2065
+6182 2097
+6182 2115
+6188 2147
+6201 2166
+6219 2172
+16 Poly
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+6219 2172
+6207 2166
+6201 2159
+6194 2147
+6188 2115
+6188 2097
+6194 2065
+6201 2053
+6207 2046
+6219 2040
+10 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+6232 2040
+6245 2046
+6251 2053
+6257 2065
+6263 2097
+6263 2115
+6257 2147
+6251 2159
+6245 2166
+6232 2172
+10 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6364 2159
+6364 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6370 2172
+6370 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+6370 2172
+6301 2078
+6402 2078
+3 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6345 2040
+6389 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6144 9216
+6144 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6144 2304
+6144 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6667 2097
+6780 2097
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+6843 2147
+6855 2153
+6874 2172
+6874 2040
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6868 2166
+6868 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6843 2040
+6899 2040
+2 MLine
+End
+
+Begin %I Poly
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+7000 2172
+7019 2166
+7031 2147
+7038 2115
+7038 2097
+7031 2065
+7019 2046
+7000 2040
+6987 2040
+6969 2046
+6956 2065
+6950 2097
+6950 2115
+6956 2147
+6969 2166
+6987 2172
+16 Poly
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+6987 2172
+6975 2166
+6969 2159
+6962 2147
+6956 2115
+6956 2097
+6962 2065
+6969 2053
+6975 2046
+6987 2040
+10 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+7000 2040
+7013 2046
+7019 2053
+7025 2065
+7031 2097
+7031 2115
+7025 2147
+7019 2159
+7013 2166
+7000 2172
+10 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 20
+7082 2147
+7088 2141
+7082 2134
+7075 2141
+7075 2147
+7082 2159
+7088 2166
+7107 2172
+7132 2172
+7151 2166
+7157 2159
+7163 2147
+7163 2134
+7157 2122
+7138 2109
+7107 2097
+7094 2090
+7082 2078
+7075 2059
+7075 2040
+20 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+7132 2172
+7144 2166
+7151 2159
+7157 2147
+7157 2134
+7151 2122
+7132 2109
+7107 2097
+8 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+7075 2053
+7082 2059
+7094 2059
+7126 2046
+7144 2046
+7157 2053
+7163 2059
+7 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+7094 2059
+7126 2040
+7151 2040
+7157 2046
+7163 2059
+7163 2072
+6 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6912 9216
+6912 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6912 2304
+6912 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7435 2097
+7548 2097
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+7611 2147
+7623 2153
+7642 2172
+7642 2040
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7636 2166
+7636 2040
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7611 2040
+7667 2040
+2 MLine
+End
+
+Begin %I Poly
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+7768 2172
+7787 2166
+7799 2147
+7806 2115
+7806 2097
+7799 2065
+7787 2046
+7768 2040
+7755 2040
+7737 2046
+7724 2065
+7718 2097
+7718 2115
+7724 2147
+7737 2166
+7755 2172
+16 Poly
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+7755 2172
+7743 2166
+7737 2159
+7730 2147
+7724 2115
+7724 2097
+7730 2065
+7737 2053
+7743 2046
+7755 2040
+10 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+7768 2040
+7781 2046
+7787 2053
+7793 2065
+7799 2097
+7799 2115
+7793 2147
+7787 2159
+7781 2166
+7768 2172
+10 MLine
+End
+
+Begin %I Poly
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+7894 2172
+7912 2166
+7925 2147
+7931 2115
+7931 2097
+7925 2065
+7912 2046
+7894 2040
+7881 2040
+7862 2046
+7850 2065
+7843 2097
+7843 2115
+7850 2147
+7862 2166
+7881 2172
+16 Poly
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+7881 2172
+7869 2166
+7862 2159
+7856 2147
+7850 2115
+7850 2097
+7856 2065
+7862 2053
+7869 2046
+7881 2040
+10 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+7894 2040
+7906 2046
+7912 2053
+7919 2065
+7925 2097
+7925 2115
+7919 2147
+7912 2159
+7906 2166
+7894 2172
+10 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7680 9216
+7680 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7680 2304
+7680 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8266 2097
+8379 2097
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 28
+8505 2128
+8498 2109
+8486 2097
+8467 2090
+8461 2090
+8442 2097
+8429 2109
+8423 2128
+8423 2134
+8429 2153
+8442 2166
+8461 2172
+8473 2172
+8492 2166
+8505 2153
+8511 2134
+8511 2097
+8505 2072
+8498 2059
+8486 2046
+8467 2040
+8448 2040
+8435 2046
+8429 2059
+8429 2065
+8435 2072
+8442 2065
+8435 2059
+28 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+8461 2090
+8448 2097
+8435 2109
+8429 2128
+8429 2134
+8435 2153
+8448 2166
+8461 2172
+8 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 9
+8473 2172
+8486 2166
+8498 2153
+8505 2134
+8505 2097
+8498 2072
+8492 2059
+8479 2046
+8467 2040
+9 MLine
+End
+
+Begin %I Poly
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 12
+8605 2172
+8624 2166
+8630 2153
+8630 2134
+8624 2122
+8605 2115
+8580 2115
+8561 2122
+8555 2134
+8555 2153
+8561 2166
+8580 2172
+12 Poly
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+8580 2172
+8567 2166
+8561 2153
+8561 2134
+8567 2122
+8580 2115
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+8605 2115
+8618 2122
+8624 2134
+8624 2153
+8618 2166
+8605 2172
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+8580 2115
+8561 2109
+8555 2103
+8549 2090
+8549 2065
+8555 2053
+8561 2046
+8580 2040
+8605 2040
+8624 2046
+8630 2053
+8637 2065
+8637 2090
+8630 2103
+8624 2109
+8605 2115
+16 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+8580 2115
+8567 2109
+8561 2103
+8555 2090
+8555 2065
+8561 2053
+8567 2046
+8580 2040
+8 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+8605 2040
+8618 2046
+8624 2053
+8630 2065
+8630 2090
+8624 2103
+8618 2109
+8605 2115
+8 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8448 9216
+8448 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8448 2304
+8448 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9034 2097
+9147 2097
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 28
+9273 2128
+9266 2109
+9254 2097
+9235 2090
+9229 2090
+9210 2097
+9197 2109
+9191 2128
+9191 2134
+9197 2153
+9210 2166
+9229 2172
+9241 2172
+9260 2166
+9273 2153
+9279 2134
+9279 2097
+9273 2072
+9266 2059
+9254 2046
+9235 2040
+9216 2040
+9203 2046
+9197 2059
+9197 2065
+9203 2072
+9210 2065
+9203 2059
+28 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+9229 2090
+9216 2097
+9203 2109
+9197 2128
+9197 2134
+9203 2153
+9216 2166
+9229 2172
+8 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 9
+9241 2172
+9254 2166
+9266 2153
+9273 2134
+9273 2097
+9266 2072
+9260 2059
+9247 2046
+9235 2040
+9 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 28
+9392 2153
+9386 2147
+9392 2141
+9398 2147
+9398 2153
+9392 2166
+9379 2172
+9361 2172
+9342 2166
+9329 2153
+9323 2141
+9317 2115
+9317 2078
+9323 2059
+9335 2046
+9354 2040
+9367 2040
+9386 2046
+9398 2059
+9405 2078
+9405 2084
+9398 2103
+9386 2115
+9367 2122
+9361 2122
+9342 2115
+9329 2103
+9323 2084
+28 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 9
+9361 2172
+9348 2166
+9335 2153
+9329 2141
+9323 2115
+9323 2078
+9329 2059
+9342 2046
+9354 2040
+9 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+9367 2040
+9379 2046
+9392 2059
+9398 2078
+9398 2084
+9392 2103
+9379 2115
+9367 2122
+8 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 9216
+9216 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2304
+9216 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 9216
+2304 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2304 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2688 9216
+2688 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2688 2304
+2688 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3072 9216
+3072 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3072 2304
+3072 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3456 9216
+3456 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3456 2304
+3456 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3840 9216
+3840 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3840 2304
+3840 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4224 9216
+4224 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4224 2304
+4224 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4608 9216
+4608 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4608 2304
+4608 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4992 9216
+4992 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4992 2304
+4992 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5376 9216
+5376 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5376 2304
+5376 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5760 9216
+5760 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5760 2304
+5760 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6144 9216
+6144 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6144 2304
+6144 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6528 9216
+6528 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6528 2304
+6528 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6912 9216
+6912 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6912 2304
+6912 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7296 9216
+7296 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7296 2304
+7296 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7680 9216
+7680 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7680 2304
+7680 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8064 9216
+8064 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8064 2304
+8064 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8448 9216
+8448 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8448 2304
+8448 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8832 9216
+8832 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8832 2304
+8832 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 9216
+9216 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2304
+9216 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+1974 2354
+1980 2348
+1974 2342
+1968 2348
+1968 2354
+1974 2367
+1980 2373
+1999 2379
+2024 2379
+2043 2373
+2050 2361
+2050 2342
+2043 2329
+2024 2323
+2006 2323
+15 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2024 2379
+2037 2373
+2043 2361
+2043 2342
+2037 2329
+2024 2323
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+2024 2323
+2037 2317
+2050 2304
+2056 2291
+2056 2273
+2050 2260
+2043 2254
+2024 2247
+1999 2247
+1980 2254
+1974 2260
+1968 2273
+1968 2279
+1974 2285
+1980 2279
+1974 2273
+16 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2043 2310
+2050 2291
+2050 2273
+2043 2260
+2037 2254
+2024 2247
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 20
+2100 2354
+2106 2348
+2100 2342
+2093 2348
+2093 2354
+2100 2367
+2106 2373
+2125 2379
+2150 2379
+2169 2373
+2175 2367
+2181 2354
+2181 2342
+2175 2329
+2156 2317
+2125 2304
+2112 2298
+2100 2285
+2093 2266
+2093 2247
+20 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+2150 2379
+2163 2373
+2169 2367
+2175 2354
+2175 2342
+2169 2329
+2150 2317
+2125 2304
+8 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+2093 2260
+2100 2266
+2112 2266
+2144 2254
+2163 2254
+2175 2260
+2181 2266
+7 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2112 2266
+2144 2247
+2169 2247
+2175 2254
+2181 2266
+2181 2279
+6 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2304
+9078 2304
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2442 2304
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+1974 3506
+1980 3500
+1974 3494
+1968 3500
+1968 3506
+1974 3519
+1980 3525
+1999 3531
+2024 3531
+2043 3525
+2050 3513
+2050 3494
+2043 3481
+2024 3475
+2006 3475
+15 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2024 3531
+2037 3525
+2043 3513
+2043 3494
+2037 3481
+2024 3475
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+2024 3475
+2037 3469
+2050 3456
+2056 3443
+2056 3425
+2050 3412
+2043 3406
+2024 3399
+1999 3399
+1980 3406
+1974 3412
+1968 3425
+1968 3431
+1974 3437
+1980 3431
+1974 3425
+16 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2043 3462
+2050 3443
+2050 3425
+2043 3412
+2037 3406
+2024 3399
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+2100 3506
+2106 3500
+2100 3494
+2093 3500
+2093 3506
+2100 3519
+2106 3525
+2125 3531
+2150 3531
+2169 3525
+2175 3513
+2175 3494
+2169 3481
+2150 3475
+2131 3475
+15 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2150 3531
+2163 3525
+2169 3513
+2169 3494
+2163 3481
+2150 3475
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+2150 3475
+2163 3469
+2175 3456
+2181 3443
+2181 3425
+2175 3412
+2169 3406
+2150 3399
+2125 3399
+2106 3406
+2100 3412
+2093 3425
+2093 3431
+2100 3437
+2106 3431
+2100 3425
+16 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2169 3462
+2175 3443
+2175 3425
+2169 3412
+2163 3406
+2150 3399
+6 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 3456
+9078 3456
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3456
+2442 3456
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+1974 4658
+1980 4652
+1974 4646
+1968 4652
+1968 4658
+1974 4671
+1980 4677
+1999 4683
+2024 4683
+2043 4677
+2050 4665
+2050 4646
+2043 4633
+2024 4627
+2006 4627
+15 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2024 4683
+2037 4677
+2043 4665
+2043 4646
+2037 4633
+2024 4627
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+2024 4627
+2037 4621
+2050 4608
+2056 4595
+2056 4577
+2050 4564
+2043 4558
+2024 4551
+1999 4551
+1980 4558
+1974 4564
+1968 4577
+1968 4583
+1974 4589
+1980 4583
+1974 4577
+16 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2043 4614
+2050 4595
+2050 4577
+2043 4564
+2037 4558
+2024 4551
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2150 4671
+2150 4551
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2156 4683
+2156 4551
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+2156 4683
+2087 4589
+2188 4589
+3 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2131 4551
+2175 4551
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4608
+9078 4608
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4608
+2442 4608
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+1974 5810
+1980 5804
+1974 5798
+1968 5804
+1968 5810
+1974 5823
+1980 5829
+1999 5835
+2024 5835
+2043 5829
+2050 5817
+2050 5798
+2043 5785
+2024 5779
+2006 5779
+15 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2024 5835
+2037 5829
+2043 5817
+2043 5798
+2037 5785
+2024 5779
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+2024 5779
+2037 5773
+2050 5760
+2056 5747
+2056 5729
+2050 5716
+2043 5710
+2024 5703
+1999 5703
+1980 5710
+1974 5716
+1968 5729
+1968 5735
+1974 5741
+1980 5735
+1974 5729
+16 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2043 5766
+2050 5747
+2050 5729
+2043 5716
+2037 5710
+2024 5703
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2106 5835
+2093 5773
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 19
+2093 5773
+2106 5785
+2125 5791
+2144 5791
+2163 5785
+2175 5773
+2181 5754
+2181 5741
+2175 5722
+2163 5710
+2144 5703
+2125 5703
+2106 5710
+2100 5716
+2093 5729
+2093 5735
+2100 5741
+2106 5735
+2100 5729
+19 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+2144 5791
+2156 5785
+2169 5773
+2175 5754
+2175 5741
+2169 5722
+2156 5710
+2144 5703
+8 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2106 5835
+2169 5835
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+2106 5829
+2137 5829
+2169 5835
+3 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5760
+9078 5760
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5760
+2442 5760
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+1974 6962
+1980 6956
+1974 6950
+1968 6956
+1968 6962
+1974 6975
+1980 6981
+1999 6987
+2024 6987
+2043 6981
+2050 6969
+2050 6950
+2043 6937
+2024 6931
+2006 6931
+15 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2024 6987
+2037 6981
+2043 6969
+2043 6950
+2037 6937
+2024 6931
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+2024 6931
+2037 6925
+2050 6912
+2056 6899
+2056 6881
+2050 6868
+2043 6862
+2024 6855
+1999 6855
+1980 6862
+1974 6868
+1968 6881
+1968 6887
+1974 6893
+1980 6887
+1974 6881
+16 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2043 6918
+2050 6899
+2050 6881
+2043 6868
+2037 6862
+2024 6855
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 28
+2169 6969
+2163 6962
+2169 6956
+2175 6962
+2175 6969
+2169 6981
+2156 6987
+2137 6987
+2119 6981
+2106 6969
+2100 6956
+2093 6931
+2093 6893
+2100 6874
+2112 6862
+2131 6855
+2144 6855
+2163 6862
+2175 6874
+2181 6893
+2181 6899
+2175 6918
+2163 6931
+2144 6937
+2137 6937
+2119 6931
+2106 6918
+2100 6899
+28 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 9
+2137 6987
+2125 6981
+2112 6969
+2106 6956
+2100 6931
+2100 6893
+2106 6874
+2119 6862
+2131 6855
+9 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+2144 6855
+2156 6862
+2169 6874
+2175 6893
+2175 6899
+2169 6918
+2156 6931
+2144 6937
+8 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 6912
+9078 6912
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 6912
+2442 6912
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+1974 8114
+1980 8108
+1974 8102
+1968 8108
+1968 8114
+1974 8127
+1980 8133
+1999 8139
+2024 8139
+2043 8133
+2050 8121
+2050 8102
+2043 8089
+2024 8083
+2006 8083
+15 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2024 8139
+2037 8133
+2043 8121
+2043 8102
+2037 8089
+2024 8083
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+2024 8083
+2037 8077
+2050 8064
+2056 8051
+2056 8033
+2050 8020
+2043 8014
+2024 8007
+1999 8007
+1980 8014
+1974 8020
+1968 8033
+1968 8039
+1974 8045
+1980 8039
+1974 8033
+16 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2043 8070
+2050 8051
+2050 8033
+2043 8020
+2037 8014
+2024 8007
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2093 8139
+2093 8102
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+2093 8114
+2100 8127
+2112 8139
+2125 8139
+2156 8121
+2169 8121
+2175 8127
+2181 8139
+8 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+2100 8127
+2112 8133
+2125 8133
+2156 8121
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+2181 8139
+2181 8121
+2175 8102
+2150 8070
+2144 8058
+2137 8039
+2137 8007
+7 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 5
+2175 8102
+2144 8070
+2137 8058
+2131 8039
+2131 8007
+5 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 8064
+9078 8064
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 8064
+2442 8064
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+1974 9266
+1980 9260
+1974 9254
+1968 9260
+1968 9266
+1974 9279
+1980 9285
+1999 9291
+2024 9291
+2043 9285
+2050 9273
+2050 9254
+2043 9241
+2024 9235
+2006 9235
+15 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2024 9291
+2037 9285
+2043 9273
+2043 9254
+2037 9241
+2024 9235
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+2024 9235
+2037 9229
+2050 9216
+2056 9203
+2056 9185
+2050 9172
+2043 9166
+2024 9159
+1999 9159
+1980 9166
+1974 9172
+1968 9185
+1968 9191
+1974 9197
+1980 9191
+1974 9185
+16 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2043 9222
+2050 9203
+2050 9185
+2043 9172
+2037 9166
+2024 9159
+6 MLine
+End
+
+Begin %I Poly
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 12
+2150 9291
+2169 9285
+2175 9273
+2175 9254
+2169 9241
+2150 9235
+2125 9235
+2106 9241
+2100 9254
+2100 9273
+2106 9285
+2125 9291
+12 Poly
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2125 9291
+2112 9285
+2106 9273
+2106 9254
+2112 9241
+2125 9235
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2150 9235
+2163 9241
+2169 9254
+2169 9273
+2163 9285
+2150 9291
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+2125 9235
+2106 9229
+2100 9222
+2093 9210
+2093 9185
+2100 9172
+2106 9166
+2125 9159
+2150 9159
+2169 9166
+2175 9172
+2181 9185
+2181 9210
+2175 9222
+2169 9229
+2150 9235
+16 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+2125 9235
+2112 9229
+2106 9222
+2100 9210
+2100 9185
+2106 9172
+2112 9166
+2125 9159
+8 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+2150 9159
+2163 9166
+2169 9172
+2175 9185
+2175 9210
+2169 9222
+2163 9229
+2150 9235
+8 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 9216
+9078 9216
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 9216
+2442 9216
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2304
+9161 2304
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2359 2304
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2880
+9161 2880
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2880
+2359 2880
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 3456
+9161 3456
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3456
+2359 3456
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4032
+9161 4032
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4032
+2359 4032
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4608
+9161 4608
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4608
+2359 4608
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5184
+9161 5184
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5184
+2359 5184
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5760
+9161 5760
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5760
+2359 5760
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 6336
+9161 6336
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 6336
+2359 6336
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 6912
+9161 6912
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 6912
+2359 6912
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 7488
+9161 7488
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 7488
+2359 7488
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 8064
+9161 8064
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 8064
+2359 8064
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 8640
+9161 8640
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 8640
+2359 8640
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 9216
+9161 9216
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 9216
+2359 9216
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4384 1906
+4384 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4390 1906
+4390 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4365 1906
+4390 1906
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4365 1774
+4409 1774
+2 MLine
+End
+
+Begin %I Poly
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+4491 1862
+4510 1856
+4522 1843
+4528 1824
+4528 1812
+4522 1793
+4510 1780
+4491 1774
+4478 1774
+4459 1780
+4447 1793
+4440 1812
+4440 1824
+4447 1843
+4459 1856
+4478 1862
+16 Poly
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+4478 1862
+4466 1856
+4453 1843
+4447 1824
+4447 1812
+4453 1793
+4466 1780
+4478 1774
+8 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+4491 1774
+4503 1780
+4516 1793
+4522 1812
+4522 1824
+4516 1843
+4503 1856
+4491 1862
+8 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4579 1862
+4579 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4585 1862
+4585 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+4585 1843
+4598 1856
+4616 1862
+4629 1862
+4648 1856
+4654 1843
+4654 1774
+7 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+4629 1862
+4642 1856
+4648 1843
+4648 1774
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4560 1862
+4585 1862
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4560 1774
+4604 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4629 1774
+4673 1774
+2 MLine
+End
+
+Begin %I Poly
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+4748 1862
+4761 1856
+4767 1849
+4773 1837
+4773 1824
+4767 1812
+4761 1805
+4748 1799
+4736 1799
+4723 1805
+4717 1812
+4711 1824
+4711 1837
+4717 1849
+4723 1856
+4736 1862
+16 Poly
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+4723 1856
+4717 1843
+4717 1818
+4723 1805
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+4761 1805
+4767 1818
+4767 1843
+4761 1856
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 5
+4767 1849
+4773 1856
+4786 1862
+4786 1856
+4773 1856
+5 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 9
+4717 1812
+4711 1805
+4704 1793
+4704 1787
+4711 1774
+4729 1768
+4761 1768
+4780 1761
+4786 1755
+9 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+4704 1787
+4711 1780
+4729 1774
+4761 1774
+4780 1768
+4786 1755
+4786 1749
+4780 1736
+4761 1730
+4723 1730
+4704 1736
+4698 1749
+4698 1755
+4704 1768
+4723 1774
+15 MLine
+End
+
+Begin %I Poly
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+4843 1900
+4836 1893
+4830 1900
+4836 1906
+4 Poly
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4836 1862
+4836 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4843 1862
+4843 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4817 1862
+4843 1862
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4817 1774
+4861 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+4905 1906
+4905 1799
+4912 1780
+4924 1774
+4937 1774
+4949 1780
+4956 1793
+7 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+4912 1906
+4912 1799
+4918 1780
+4924 1774
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4887 1862
+4937 1862
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+5000 1862
+5000 1793
+5006 1780
+5025 1774
+5037 1774
+5056 1780
+5069 1793
+7 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+5006 1862
+5006 1793
+5012 1780
+5025 1774
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5069 1862
+5069 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5075 1862
+5075 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4981 1862
+5006 1862
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5050 1862
+5075 1862
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5069 1774
+5094 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5201 1906
+5201 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5207 1906
+5207 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 14
+5201 1843
+5188 1856
+5176 1862
+5163 1862
+5144 1856
+5132 1843
+5125 1824
+5125 1812
+5132 1793
+5144 1780
+5163 1774
+5176 1774
+5188 1780
+5201 1793
+14 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+5163 1862
+5150 1856
+5138 1843
+5132 1824
+5132 1812
+5138 1793
+5150 1780
+5163 1774
+8 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5182 1906
+5207 1906
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5201 1774
+5226 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 17
+5264 1824
+5339 1824
+5339 1837
+5333 1849
+5326 1856
+5314 1862
+5295 1862
+5276 1856
+5264 1843
+5257 1824
+5257 1812
+5264 1793
+5276 1780
+5295 1774
+5308 1774
+5326 1780
+5339 1793
+17 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+5333 1824
+5333 1843
+5326 1856
+3 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+5295 1862
+5282 1856
+5270 1843
+5264 1824
+5264 1812
+5270 1793
+5282 1780
+5295 1774
+8 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+5528 1931
+5515 1918
+5502 1900
+5490 1875
+5484 1843
+5484 1818
+5490 1787
+5502 1761
+5515 1743
+5528 1730
+10 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+5515 1918
+5502 1893
+5496 1875
+5490 1843
+5490 1818
+5496 1787
+5502 1768
+5515 1743
+8 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5571 1831
+5685 1831
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5842 1862
+5842 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5848 1862
+5848 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+5848 1843
+5861 1856
+5879 1862
+5892 1862
+5911 1856
+5917 1843
+5917 1774
+7 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+5892 1862
+5905 1856
+5911 1843
+5911 1774
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+5917 1843
+5930 1856
+5949 1862
+5961 1862
+5980 1856
+5986 1843
+5986 1774
+7 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+5961 1862
+5974 1856
+5980 1843
+5980 1774
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5823 1862
+5848 1862
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5823 1774
+5867 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5892 1774
+5936 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5961 1774
+6005 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 17
+6043 1824
+6118 1824
+6118 1837
+6112 1849
+6106 1856
+6093 1862
+6074 1862
+6055 1856
+6043 1843
+6036 1824
+6036 1812
+6043 1793
+6055 1780
+6074 1774
+6087 1774
+6106 1780
+6118 1793
+17 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+6112 1824
+6112 1843
+6106 1856
+3 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+6074 1862
+6062 1856
+6049 1843
+6043 1824
+6043 1812
+6049 1793
+6062 1780
+6074 1774
+8 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 13
+6168 1849
+6168 1843
+6162 1843
+6162 1849
+6168 1856
+6181 1862
+6206 1862
+6219 1856
+6225 1849
+6231 1837
+6231 1793
+6238 1780
+6244 1774
+13 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 5
+6225 1849
+6225 1793
+6231 1780
+6244 1774
+6250 1774
+5 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 11
+6225 1837
+6219 1831
+6181 1824
+6162 1818
+6156 1805
+6156 1793
+6162 1780
+6181 1774
+6200 1774
+6212 1780
+6225 1793
+11 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+6181 1824
+6168 1818
+6162 1805
+6162 1793
+6168 1780
+6181 1774
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6294 1862
+6294 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6300 1862
+6300 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+6300 1843
+6313 1856
+6332 1862
+6344 1862
+6363 1856
+6370 1843
+6370 1774
+7 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+6344 1862
+6357 1856
+6363 1843
+6363 1774
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6275 1862
+6300 1862
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6275 1774
+6319 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6344 1774
+6388 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+6483 1849
+6489 1862
+6489 1837
+6483 1849
+6476 1856
+6464 1862
+6439 1862
+6426 1856
+6420 1849
+6420 1837
+6426 1831
+6439 1824
+6470 1812
+6483 1805
+6489 1799
+15 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+6420 1843
+6426 1837
+6439 1831
+6470 1818
+6483 1812
+6489 1805
+6489 1787
+6483 1780
+6470 1774
+6445 1774
+6432 1780
+6426 1787
+6420 1799
+6420 1774
+6426 1787
+15 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6633 1862
+6659 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6640 1862
+6659 1793
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6684 1862
+6659 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6684 1862
+6709 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6690 1862
+6709 1793
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6734 1862
+6709 1774
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6615 1862
+6659 1862
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6715 1862
+6753 1862
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 17
+6784 1824
+6860 1824
+6860 1837
+6853 1849
+6847 1856
+6835 1862
+6816 1862
+6797 1856
+6784 1843
+6778 1824
+6778 1812
+6784 1793
+6797 1780
+6816 1774
+6828 1774
+6847 1780
+6860 1793
+17 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+6853 1824
+6853 1843
+6847 1856
+3 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+6816 1862
+6803 1856
+6791 1843
+6784 1824
+6784 1812
+6791 1793
+6803 1780
+6816 1774
+8 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+6960 1849
+6966 1862
+6966 1837
+6960 1849
+6954 1856
+6941 1862
+6916 1862
+6904 1856
+6897 1849
+6897 1837
+6904 1831
+6916 1824
+6948 1812
+6960 1805
+6966 1799
+15 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+6897 1843
+6904 1837
+6916 1831
+6948 1818
+6960 1812
+6966 1805
+6966 1787
+6960 1780
+6948 1774
+6922 1774
+6910 1780
+6904 1787
+6897 1799
+6897 1774
+6904 1787
+15 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+7017 1906
+7017 1799
+7023 1780
+7036 1774
+7048 1774
+7061 1780
+7067 1793
+7 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+7023 1906
+7023 1799
+7029 1780
+7036 1774
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6998 1862
+7048 1862
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+7098 1931
+7111 1918
+7124 1900
+7136 1875
+7142 1843
+7142 1818
+7136 1787
+7124 1761
+7111 1743
+7098 1730
+10 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+7111 1918
+7124 1893
+7130 1875
+7136 1843
+7136 1818
+7130 1787
+7124 1768
+7111 1743
+8 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1672 5370
+1804 5370
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1672 5377
+1804 5377
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1672 5352
+1672 5377
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1804 5352
+1804 5396
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 13
+1729 5440
+1735 5440
+1735 5433
+1729 5433
+1723 5440
+1716 5452
+1716 5477
+1723 5490
+1729 5496
+1742 5502
+1786 5502
+1798 5509
+1804 5515
+13 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 5
+1729 5496
+1786 5496
+1798 5502
+1804 5515
+1804 5521
+5 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 11
+1742 5496
+1748 5490
+1754 5452
+1760 5433
+1773 5427
+1786 5427
+1798 5433
+1804 5452
+1804 5471
+1798 5484
+1786 5496
+11 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+1754 5452
+1760 5440
+1773 5433
+1786 5433
+1798 5440
+1804 5452
+6 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+1672 5565
+1779 5565
+1798 5571
+1804 5584
+1804 5597
+1798 5609
+1786 5615
+7 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+1672 5571
+1779 5571
+1798 5578
+1804 5584
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1716 5546
+1716 5597
+2 MLine
+End
+
+Begin %I Poly
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+1679 5666
+1685 5659
+1679 5653
+1672 5659
+4 Poly
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1716 5659
+1804 5659
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1716 5666
+1804 5666
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1716 5641
+1716 5666
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1804 5641
+1804 5685
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+1672 5729
+1779 5729
+1798 5735
+1804 5747
+1804 5760
+1798 5773
+1786 5779
+7 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+1672 5735
+1779 5735
+1798 5741
+1804 5747
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1716 5710
+1716 5760
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+1716 5823
+1786 5823
+1798 5829
+1804 5848
+1804 5861
+1798 5879
+1786 5892
+7 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+1716 5829
+1786 5829
+1798 5835
+1804 5848
+4 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1716 5892
+1804 5892
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1716 5898
+1804 5898
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1716 5804
+1716 5829
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1716 5873
+1716 5898
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1804 5892
+1804 5917
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1672 6024
+1804 6024
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1672 6030
+1804 6030
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 14
+1735 6024
+1723 6011
+1716 5999
+1716 5986
+1723 5967
+1735 5955
+1754 5949
+1767 5949
+1786 5955
+1798 5967
+1804 5986
+1804 5999
+1798 6011
+1786 6024
+14 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+1716 5986
+1723 5974
+1735 5961
+1754 5955
+1767 5955
+1786 5961
+1798 5974
+1804 5986
+8 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1672 6005
+1672 6030
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1804 6024
+1804 6049
+2 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 17
+1754 6087
+1754 6162
+1742 6162
+1729 6156
+1723 6150
+1716 6137
+1716 6118
+1723 6099
+1735 6087
+1754 6080
+1767 6080
+1786 6087
+1798 6099
+1804 6118
+1804 6131
+1798 6150
+1786 6162
+17 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+1754 6156
+1735 6156
+1723 6150
+3 MLine
+End
+
+Begin %I MLine
+[0.4461382 0 0 0.4461382 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+1716 6118
+1723 6106
+1735 6093
+1754 6087
+1767 6087
+1786 6093
+1798 6106
+1804 6118
+8 MLine
+End
+
+Begin %I Circ
+[1.08 0 0 1.08 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+5395 6543 32 Circ
+End
+
+Begin %I Circ
+[1.08 0 0 1.08 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+3045 4078 32 Circ
+End
+
+Begin %I Circ
+[1.08 0 0 1.08 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+5138 5898 32 Circ
+End
+
+Begin %I Circ
+[1.08 0 0 1.08 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+6451 5080 32 Circ
+End
+
+Begin %I Circ
+[1.08 0 0 1.08 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+4658 8398 32 Circ
+End
+
+Begin %I Circ
+[1.08 0 0 1.08 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+8920 3214 32 Circ
+End
+
+Begin %I Circ
+[1.08 0 0 1.08 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+5407 6647 32 Circ
+End
+
+Begin %I Circ
+[1.08 0 0 1.08 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+4669 5933 32 Circ
+End
+
+Begin %I Circ
+[1.08 0 0 1.08 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+5268 6785 32 Circ
+End
+
+Begin %I Circ
+[1.08 0 0 1.08 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+5084 2696 32 Circ
+End
+
+Begin %I Circ
+[1.08 0 0 1.08 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+4385 8467 32 Circ
+End
+
+Begin %I Circ
+[1.08 0 0 1.08 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+4324 6359 32 Circ
+End
+
+Begin %I Circ
+[1.08 0 0 1.08 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+5395 6543 32 Circ
+End
+
+Begin %I Poly
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 12
+4324 6359
+4385 8467
+5084 2696
+5268 6785
+4669 5933
+5407 6647
+8920 3214
+4658 8398
+6451 5080
+5138 5898
+3045 4078
+5395 6543
+12 Poly
+End
+
+%%PageTrailer
+End %I eop
+showpage
+
+%%Trailer
+end
+%%EOF
diff --git a/gsl-1.9/doc/integration.texi b/gsl-1.9/doc/integration.texi
new file mode 100644
index 0000000..62afb3e
--- /dev/null
+++ b/gsl-1.9/doc/integration.texi
@@ -0,0 +1,854 @@
+@cindex quadrature
+@cindex numerical integration (quadrature)
+@cindex integration, numerical (quadrature)
+@cindex QUADPACK
+
+This chapter describes routines for performing numerical integration
+(quadrature) of a function in one dimension. There are routines for
+adaptive and non-adaptive integration of general functions, with
+specialised routines for specific cases. These include integration over
+infinite and semi-infinite ranges, singular integrals, including
+logarithmic singularities, computation of Cauchy principal values and
+oscillatory integrals. The library reimplements the algorithms used in
+@sc{quadpack}, a numerical integration package written by Piessens,
+Doncker-Kapenga, Uberhuber and Kahaner. Fortran code for @sc{quadpack} is
+available on Netlib.
+
+The functions described in this chapter are declared in the header file
+@file{gsl_integration.h}.
+
+@menu
+* Numerical Integration Introduction::
+* QNG non-adaptive Gauss-Kronrod integration::
+* QAG adaptive integration::
+* QAGS adaptive integration with singularities::
+* QAGP adaptive integration with known singular points::
+* QAGI adaptive integration on infinite intervals::
+* QAWC adaptive integration for Cauchy principal values::
+* QAWS adaptive integration for singular functions::
+* QAWO adaptive integration for oscillatory functions::
+* QAWF adaptive integration for Fourier integrals::
+* Numerical integration error codes::
+* Numerical integration examples::
+* Numerical integration References and Further Reading::
+@end menu
+
+@node Numerical Integration Introduction
+@section Introduction
+
+Each algorithm computes an approximation to a definite integral of the
+form,
+@tex
+\beforedisplay
+$$
+I = \int_a^b f(x) w(x) \,dx
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+I = \int_a^b f(x) w(x) dx
+@end example
+
+@end ifinfo
+@noindent
+where @math{w(x)} is a weight function (for general integrands @math{w(x)=1}).
+The user provides absolute and relative error bounds
+@c{$(\hbox{\it epsabs}, \hbox{\it epsrel}\,)$}
+@math{(epsabs, epsrel)} which specify the following accuracy requirement,
+@tex
+\beforedisplay
+$$
+|\hbox{\it RESULT} - I| \leq \max(\hbox{\it epsabs}, \hbox{\it epsrel}\, |I|)
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+|RESULT - I| <= max(epsabs, epsrel |I|)
+@end example
+
+@end ifinfo
+@noindent
+where
+@c{$\hbox{\it RESULT}$}
+@math{RESULT} is the numerical approximation obtained by the
+algorithm. The algorithms attempt to estimate the absolute error
+@c{$\hbox{\it ABSERR} = |\hbox{\it RESULT} - I|$}
+@math{ABSERR = |RESULT - I|} in such a way that the following inequality
+holds,
+@tex
+\beforedisplay
+$$
+|\hbox{\it RESULT} - I| \leq \hbox{\it ABSERR} \leq \max(\hbox{\it epsabs}, \hbox{\it epsrel}\,|I|)
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+|RESULT - I| <= ABSERR <= max(epsabs, epsrel |I|)
+@end example
+
+@end ifinfo
+@noindent
+The routines will fail to converge if the error bounds are too
+stringent, but always return the best approximation obtained up to that
+stage.
+
+The algorithms in @sc{quadpack} use a naming convention based on the
+following letters,
+
+@display
+@code{Q} - quadrature routine
+
+@code{N} - non-adaptive integrator
+@code{A} - adaptive integrator
+
+@code{G} - general integrand (user-defined)
+@code{W} - weight function with integrand
+
+@code{S} - singularities can be more readily integrated
+@code{P} - points of special difficulty can be supplied
+@code{I} - infinite range of integration
+@code{O} - oscillatory weight function, cos or sin
+@code{F} - Fourier integral
+@code{C} - Cauchy principal value
+@end display
+
+@noindent
+The algorithms are built on pairs of quadrature rules, a higher order
+rule and a lower order rule. The higher order rule is used to compute
+the best approximation to an integral over a small range. The
+difference between the results of the higher order rule and the lower
+order rule gives an estimate of the error in the approximation.
+
+@menu
+* Integrands without weight functions::
+* Integrands with weight functions::
+* Integrands with singular weight functions::
+@end menu
+
+@node Integrands without weight functions
+@subsection Integrands without weight functions
+@cindex Gauss-Kronrod quadrature
+The algorithms for general functions (without a weight function) are
+based on Gauss-Kronrod rules.
+
+A Gauss-Kronrod rule begins with a classical Gaussian quadrature rule of
+order @math{m}. This is extended with additional points between each of
+the abscissae to give a higher order Kronrod rule of order @math{2m+1}.
+The Kronrod rule is efficient because it reuses existing function
+evaluations from the Gaussian rule.
+
+The higher order Kronrod rule is used as the best approximation to the
+integral, and the difference between the two rules is used as an
+estimate of the error in the approximation.
+
+@node Integrands with weight functions
+@subsection Integrands with weight functions
+@cindex Clenshaw-Curtis quadrature
+@cindex Modified Clenshaw-Curtis quadrature
+For integrands with weight functions the algorithms use Clenshaw-Curtis
+quadrature rules.
+
+A Clenshaw-Curtis rule begins with an @math{n}-th order Chebyshev
+polynomial approximation to the integrand. This polynomial can be
+integrated exactly to give an approximation to the integral of the
+original function. The Chebyshev expansion can be extended to higher
+orders to improve the approximation and provide an estimate of the
+error.
+
+@node Integrands with singular weight functions
+@subsection Integrands with singular weight functions
+
+The presence of singularities (or other behavior) in the integrand can
+cause slow convergence in the Chebyshev approximation. The modified
+Clenshaw-Curtis rules used in @sc{quadpack} separate out several common
+weight functions which cause slow convergence.
+
+These weight functions are integrated analytically against the Chebyshev
+polynomials to precompute @dfn{modified Chebyshev moments}. Combining
+the moments with the Chebyshev approximation to the function gives the
+desired integral. The use of analytic integration for the singular part
+of the function allows exact cancellations and substantially improves
+the overall convergence behavior of the integration.
+
+
+@node QNG non-adaptive Gauss-Kronrod integration
+@section QNG non-adaptive Gauss-Kronrod integration
+@cindex QNG quadrature algorithm
+
+The QNG algorithm is a non-adaptive procedure which uses fixed
+Gauss-Kronrod abscissae to sample the integrand at a maximum of 87
+points. It is provided for fast integration of smooth functions.
+
+@deftypefun int gsl_integration_qng (const gsl_function * @var{f}, double @var{a}, double @var{b}, double @var{epsabs}, double @var{epsrel}, double * @var{result}, double * @var{abserr}, size_t * @var{neval})
+
+This function applies the Gauss-Kronrod 10-point, 21-point, 43-point and
+87-point integration rules in succession until an estimate of the
+integral of @math{f} over @math{(a,b)} is achieved within the desired
+absolute and relative error limits, @var{epsabs} and @var{epsrel}. The
+function returns the final approximation, @var{result}, an estimate of
+the absolute error, @var{abserr} and the number of function evaluations
+used, @var{neval}. The Gauss-Kronrod rules are designed in such a way
+that each rule uses all the results of its predecessors, in order to
+minimize the total number of function evaluations.
+@end deftypefun
+
+
+@node QAG adaptive integration
+@section QAG adaptive integration
+@cindex QAG quadrature algorithm
+
+The QAG algorithm is a simple adaptive integration procedure. The
+integration region is divided into subintervals, and on each iteration
+the subinterval with the largest estimated error is bisected. This
+reduces the overall error rapidly, as the subintervals become
+concentrated around local difficulties in the integrand. These
+subintervals are managed by a @code{gsl_integration_workspace} struct,
+which handles the memory for the subinterval ranges, results and error
+estimates.
+
+@deftypefun {gsl_integration_workspace *} gsl_integration_workspace_alloc (size_t @var{n})
+This function allocates a workspace sufficient to hold @var{n} double
+precision intervals, their integration results and error estimates.
+@end deftypefun
+
+@deftypefun void gsl_integration_workspace_free (gsl_integration_workspace * @var{w})
+This function frees the memory associated with the workspace @var{w}.
+@end deftypefun
+
+@deftypefun int gsl_integration_qag (const gsl_function * @var{f}, double @var{a}, double @var{b}, double @var{epsabs}, double @var{epsrel}, size_t @var{limit}, int @var{key}, gsl_integration_workspace * @var{workspace}, double * @var{result}, double * @var{abserr})
+
+This function applies an integration rule adaptively until an estimate
+of the integral of @math{f} over @math{(a,b)} is achieved within the
+desired absolute and relative error limits, @var{epsabs} and
+@var{epsrel}. The function returns the final approximation,
+@var{result}, and an estimate of the absolute error, @var{abserr}. The
+integration rule is determined by the value of @var{key}, which should
+be chosen from the following symbolic names,
+
+@example
+GSL_INTEG_GAUSS15 (key = 1)
+GSL_INTEG_GAUSS21 (key = 2)
+GSL_INTEG_GAUSS31 (key = 3)
+GSL_INTEG_GAUSS41 (key = 4)
+GSL_INTEG_GAUSS51 (key = 5)
+GSL_INTEG_GAUSS61 (key = 6)
+@end example
+
+@noindent
+corresponding to the 15, 21, 31, 41, 51 and 61 point Gauss-Kronrod
+rules. The higher-order rules give better accuracy for smooth functions,
+while lower-order rules save time when the function contains local
+difficulties, such as discontinuities.
+
+On each iteration the adaptive integration strategy bisects the interval
+with the largest error estimate. The subintervals and their results are
+stored in the memory provided by @var{workspace}. The maximum number of
+subintervals is given by @var{limit}, which may not exceed the allocated
+size of the workspace.
+@end deftypefun
+
+
+@node QAGS adaptive integration with singularities
+@section QAGS adaptive integration with singularities
+@cindex QAGS quadrature algorithm
+
+The presence of an integrable singularity in the integration region
+causes an adaptive routine to concentrate new subintervals around the
+singularity. As the subintervals decrease in size the successive
+approximations to the integral converge in a limiting fashion. This
+approach to the limit can be accelerated using an extrapolation
+procedure. The QAGS algorithm combines adaptive bisection with the Wynn
+epsilon-algorithm to speed up the integration of many types of
+integrable singularities.
+
+@deftypefun int gsl_integration_qags (const gsl_function * @var{f}, double @var{a}, double @var{b}, double @var{epsabs}, double @var{epsrel}, size_t @var{limit}, gsl_integration_workspace * @var{workspace}, double * @var{result}, double * @var{abserr})
+
+This function applies the Gauss-Kronrod 21-point integration rule
+adaptively until an estimate of the integral of @math{f} over
+@math{(a,b)} is achieved within the desired absolute and relative error
+limits, @var{epsabs} and @var{epsrel}. The results are extrapolated
+using the epsilon-algorithm, which accelerates the convergence of the
+integral in the presence of discontinuities and integrable
+singularities. The function returns the final approximation from the
+extrapolation, @var{result}, and an estimate of the absolute error,
+@var{abserr}. The subintervals and their results are stored in the
+memory provided by @var{workspace}. The maximum number of subintervals
+is given by @var{limit}, which may not exceed the allocated size of the
+workspace.
+
+@end deftypefun
+
+@node QAGP adaptive integration with known singular points
+@section QAGP adaptive integration with known singular points
+@cindex QAGP quadrature algorithm
+@cindex singular points, specifying positions in quadrature
+@deftypefun int gsl_integration_qagp (const gsl_function * @var{f}, double * @var{pts}, size_t @var{npts}, double @var{epsabs}, double @var{epsrel}, size_t @var{limit}, gsl_integration_workspace * @var{workspace}, double * @var{result}, double * @var{abserr})
+
+This function applies the adaptive integration algorithm QAGS taking
+account of the user-supplied locations of singular points. The array
+@var{pts} of length @var{npts} should contain the endpoints of the
+integration ranges defined by the integration region and locations of
+the singularities. For example, to integrate over the region
+@math{(a,b)} with break-points at @math{x_1, x_2, x_3} (where
+@math{a < x_1 < x_2 < x_3 < b}) the following @var{pts} array should be used
+
+@example
+pts[0] = a
+pts[1] = x_1
+pts[2] = x_2
+pts[3] = x_3
+pts[4] = b
+@end example
+
+@noindent
+with @var{npts} = 5.
+
+@noindent
+If you know the locations of the singular points in the integration
+region then this routine will be faster than @code{QAGS}.
+
+@end deftypefun
+
+@node QAGI adaptive integration on infinite intervals
+@section QAGI adaptive integration on infinite intervals
+@cindex QAGI quadrature algorithm
+
+@deftypefun int gsl_integration_qagi (gsl_function * @var{f}, double @var{epsabs}, double @var{epsrel}, size_t @var{limit}, gsl_integration_workspace * @var{workspace}, double * @var{result}, double * @var{abserr})
+
+This function computes the integral of the function @var{f} over the
+infinite interval @math{(-\infty,+\infty)}. The integral is mapped onto the
+semi-open interval @math{(0,1]} using the transformation @math{x = (1-t)/t},
+@tex
+\beforedisplay
+$$
+\int_{-\infty}^{+\infty} dx \, f(x)
+ = \int_0^1 dt \, (f((1-t)/t) + f(-(1-t)/t))/t^2.
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+\int_@{-\infty@}^@{+\infty@} dx f(x) =
+ \int_0^1 dt (f((1-t)/t) + f((-1+t)/t))/t^2.
+@end example
+
+@end ifinfo
+@noindent
+It is then integrated using the QAGS algorithm. The normal 21-point
+Gauss-Kronrod rule of QAGS is replaced by a 15-point rule, because the
+transformation can generate an integrable singularity at the origin. In
+this case a lower-order rule is more efficient.
+@end deftypefun
+
+@deftypefun int gsl_integration_qagiu (gsl_function * @var{f}, double @var{a}, double @var{epsabs}, double @var{epsrel}, size_t @var{limit}, gsl_integration_workspace * @var{workspace}, double * @var{result}, double * @var{abserr})
+
+This function computes the integral of the function @var{f} over the
+semi-infinite interval @math{(a,+\infty)}. The integral is mapped onto the
+semi-open interval @math{(0,1]} using the transformation @math{x = a + (1-t)/t},
+@tex
+\beforedisplay
+$$
+\int_{a}^{+\infty} dx \, f(x)
+ = \int_0^1 dt \, f(a + (1-t)/t)/t^2
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+\int_@{a@}^@{+\infty@} dx f(x) =
+ \int_0^1 dt f(a + (1-t)/t)/t^2
+@end example
+
+@end ifinfo
+@noindent
+and then integrated using the QAGS algorithm.
+@end deftypefun
+
+@deftypefun int gsl_integration_qagil (gsl_function * @var{f}, double @var{b}, double @var{epsabs}, double @var{epsrel}, size_t @var{limit}, gsl_integration_workspace * @var{workspace}, double * @var{result}, double * @var{abserr})
+This function computes the integral of the function @var{f} over the
+semi-infinite interval @math{(-\infty,b)}. The integral is mapped onto the
+semi-open interval @math{(0,1]} using the transformation @math{x = b - (1-t)/t},
+@tex
+\beforedisplay
+$$
+\int_{-\infty}^{b} dx \, f(x)
+ = \int_0^1 dt \, f(b - (1-t)/t)/t^2
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+\int_@{+\infty@}^@{b@} dx f(x) =
+ \int_0^1 dt f(b - (1-t)/t)/t^2
+@end example
+
+@end ifinfo
+@noindent
+and then integrated using the QAGS algorithm.
+@end deftypefun
+
+@node QAWC adaptive integration for Cauchy principal values
+@section QAWC adaptive integration for Cauchy principal values
+@cindex QAWC quadrature algorithm
+@cindex Cauchy principal value, by numerical quadrature
+@deftypefun int gsl_integration_qawc (gsl_function * @var{f}, double @var{a}, double @var{b}, double @var{c}, double @var{epsabs}, double @var{epsrel}, size_t @var{limit}, gsl_integration_workspace * @var{workspace}, double * @var{result}, double * @var{abserr})
+
+This function computes the Cauchy principal value of the integral of
+@math{f} over @math{(a,b)}, with a singularity at @var{c},
+@tex
+\beforedisplay
+$$
+I = \int_a^b dx\, {f(x) \over x - c}
+ = \lim_{\epsilon \to 0}
+\left\{
+\int_a^{c-\epsilon} dx\, {f(x) \over x - c}
++
+\int_{c+\epsilon}^b dx\, {f(x) \over x - c}
+\right\}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+I = \int_a^b dx f(x) / (x - c)
+@end example
+
+@end ifinfo
+@noindent
+The adaptive bisection algorithm of QAG is used, with modifications to
+ensure that subdivisions do not occur at the singular point @math{x = c}.
+When a subinterval contains the point @math{x = c} or is close to
+it then a special 25-point modified Clenshaw-Curtis rule is used to control
+the singularity. Further away from the
+singularity the algorithm uses an ordinary 15-point Gauss-Kronrod
+integration rule.
+
+@end deftypefun
+
+@node QAWS adaptive integration for singular functions
+@section QAWS adaptive integration for singular functions
+@cindex QAWS quadrature algorithm
+@cindex singular functions, numerical integration of
+The QAWS algorithm is designed for integrands with algebraic-logarithmic
+singularities at the end-points of an integration region. In order to
+work efficiently the algorithm requires a precomputed table of
+Chebyshev moments.
+
+@deftypefun {gsl_integration_qaws_table *} gsl_integration_qaws_table_alloc (double @var{alpha}, double @var{beta}, int @var{mu}, int @var{nu})
+
+This function allocates space for a @code{gsl_integration_qaws_table}
+struct describing a singular weight function
+@math{W(x)} with the parameters @math{(\alpha, \beta, \mu, \nu)},
+@tex
+\beforedisplay
+$$
+W(x) = (x - a)^\alpha (b - x)^\beta \log^\mu (x - a) \log^\nu (b - x)
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+W(x) = (x-a)^alpha (b-x)^beta log^mu (x-a) log^nu (b-x)
+@end example
+
+@end ifinfo
+@noindent
+where @math{\alpha > -1}, @math{\beta > -1}, and @math{\mu = 0, 1},
+@math{\nu = 0, 1}. The weight function can take four different forms
+depending on the values of @math{\mu} and @math{\nu},
+@tex
+\beforedisplay
+$$
+\matrix{
+W(x) = (x - a)^\alpha (b - x)^\beta
+ \hfill~ (\mu = 0, \nu = 0) \cr
+W(x) = (x - a)^\alpha (b - x)^\beta \log(x - a)
+ \hfill~ (\mu = 1, \nu = 0) \cr
+W(x) = (x - a)^\alpha (b - x)^\beta \log(b - x)
+ \hfill~ (\mu = 0, \nu = 1) \cr
+W(x) = (x - a)^\alpha (b - x)^\beta \log(x - a) \log(b - x)
+ \hfill~ (\mu = 1, \nu = 1)
+}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+W(x) = (x-a)^alpha (b-x)^beta (mu = 0, nu = 0)
+W(x) = (x-a)^alpha (b-x)^beta log(x-a) (mu = 1, nu = 0)
+W(x) = (x-a)^alpha (b-x)^beta log(b-x) (mu = 0, nu = 1)
+W(x) = (x-a)^alpha (b-x)^beta log(x-a) log(b-x) (mu = 1, nu = 1)
+@end example
+
+@end ifinfo
+@noindent
+The singular points @math{(a,b)} do not have to be specified until the
+integral is computed, where they are the endpoints of the integration
+range.
+
+The function returns a pointer to the newly allocated table
+@code{gsl_integration_qaws_table} if no errors were detected, and 0 in
+the case of error.
+@end deftypefun
+
+@deftypefun int gsl_integration_qaws_table_set (gsl_integration_qaws_table * @var{t}, double @var{alpha}, double @var{beta}, int @var{mu}, int @var{nu})
+This function modifies the parameters @math{(\alpha, \beta, \mu, \nu)} of
+an existing @code{gsl_integration_qaws_table} struct @var{t}.
+@end deftypefun
+
+@deftypefun void gsl_integration_qaws_table_free (gsl_integration_qaws_table * @var{t})
+This function frees all the memory associated with the
+@code{gsl_integration_qaws_table} struct @var{t}.
+@end deftypefun
+
+@deftypefun int gsl_integration_qaws (gsl_function * @var{f}, const double @var{a}, const double @var{b}, gsl_integration_qaws_table * @var{t}, const double @var{epsabs}, const double @var{epsrel}, const size_t @var{limit}, gsl_integration_workspace * @var{workspace}, double * @var{result}, double * @var{abserr})
+
+This function computes the integral of the function @math{f(x)} over the
+interval @math{(a,b)} with the singular weight function
+@math{(x-a)^\alpha (b-x)^\beta \log^\mu (x-a) \log^\nu (b-x)}. The parameters
+of the weight function @math{(\alpha, \beta, \mu, \nu)} are taken from the
+table @var{t}. The integral is,
+@tex
+\beforedisplay
+$$
+I = \int_a^b dx\, f(x) (x - a)^\alpha (b - x)^\beta
+ \log^\mu (x - a) \log^\nu (b - x).
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+I = \int_a^b dx f(x) (x-a)^alpha (b-x)^beta log^mu (x-a) log^nu (b-x).
+@end example
+
+@end ifinfo
+@noindent
+The adaptive bisection algorithm of QAG is used. When a subinterval
+contains one of the endpoints then a special 25-point modified
+Clenshaw-Curtis rule is used to control the singularities. For
+subintervals which do not include the endpoints an ordinary 15-point
+Gauss-Kronrod integration rule is used.
+
+@end deftypefun
+
+@node QAWO adaptive integration for oscillatory functions
+@section QAWO adaptive integration for oscillatory functions
+@cindex QAWO quadrature algorithm
+@cindex oscillatory functions, numerical integration of
+The QAWO algorithm is designed for integrands with an oscillatory
+factor, @math{\sin(\omega x)} or @math{\cos(\omega x)}. In order to
+work efficiently the algorithm requires a table of Chebyshev moments
+which must be pre-computed with calls to the functions below.
+
+@deftypefun {gsl_integration_qawo_table *} gsl_integration_qawo_table_alloc (double @var{omega}, double @var{L}, enum gsl_integration_qawo_enum @var{sine}, size_t @var{n})
+
+This function allocates space for a @code{gsl_integration_qawo_table}
+struct and its associated workspace describing a sine or cosine weight
+function @math{W(x)} with the parameters @math{(\omega, L)},
+@tex
+\beforedisplay
+$$
+\eqalign{
+W(x) & = \left\{\matrix{\sin(\omega x) \cr \cos(\omega x)} \right\}
+}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+W(x) = sin(omega x)
+W(x) = cos(omega x)
+@end example
+
+@end ifinfo
+@noindent
+The parameter @var{L} must be the length of the interval over which the
+function will be integrated @math{L = b - a}. The choice of sine or
+cosine is made with the parameter @var{sine} which should be chosen from
+one of the two following symbolic values:
+
+@example
+GSL_INTEG_COSINE
+GSL_INTEG_SINE
+@end example
+
+@noindent
+The @code{gsl_integration_qawo_table} is a table of the trigonometric
+coefficients required in the integration process. The parameter @var{n}
+determines the number of levels of coefficients that are computed. Each
+level corresponds to one bisection of the interval @math{L}, so that
+@var{n} levels are sufficient for subintervals down to the length
+@math{L/2^n}. The integration routine @code{gsl_integration_qawo}
+returns the error @code{GSL_ETABLE} if the number of levels is
+insufficient for the requested accuracy.
+
+@end deftypefun
+
+@deftypefun int gsl_integration_qawo_table_set (gsl_integration_qawo_table * @var{t}, double @var{omega}, double @var{L}, enum gsl_integration_qawo_enum @var{sine})
+This function changes the parameters @var{omega}, @var{L} and @var{sine}
+of the existing workspace @var{t}.
+@end deftypefun
+
+@deftypefun int gsl_integration_qawo_table_set_length (gsl_integration_qawo_table * @var{t}, double @var{L})
+This function allows the length parameter @var{L} of the workspace
+@var{t} to be changed.
+@end deftypefun
+
+@deftypefun void gsl_integration_qawo_table_free (gsl_integration_qawo_table * @var{t})
+This function frees all the memory associated with the workspace @var{t}.
+@end deftypefun
+
+@deftypefun int gsl_integration_qawo (gsl_function * @var{f}, const double @var{a}, const double @var{epsabs}, const double @var{epsrel}, const size_t @var{limit}, gsl_integration_workspace * @var{workspace}, gsl_integration_qawo_table * @var{wf}, double * @var{result}, double * @var{abserr})
+
+This function uses an adaptive algorithm to compute the integral of
+@math{f} over @math{(a,b)} with the weight function
+@math{\sin(\omega x)} or @math{\cos(\omega x)} defined
+by the table @var{wf},
+@tex
+\beforedisplay
+$$
+\eqalign{
+I & = \int_a^b dx\, f(x) \left\{ \matrix{\sin(\omega x) \cr \cos(\omega x)}\right\}
+}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+I = \int_a^b dx f(x) sin(omega x)
+I = \int_a^b dx f(x) cos(omega x)
+@end example
+
+@end ifinfo
+@noindent
+The results are extrapolated using the epsilon-algorithm to accelerate
+the convergence of the integral. The function returns the final
+approximation from the extrapolation, @var{result}, and an estimate of
+the absolute error, @var{abserr}. The subintervals and their results are
+stored in the memory provided by @var{workspace}. The maximum number of
+subintervals is given by @var{limit}, which may not exceed the allocated
+size of the workspace.
+
+Those subintervals with ``large'' widths @math{d} where @math{d\omega > 4} are
+computed using a 25-point Clenshaw-Curtis integration rule, which handles the
+oscillatory behavior. Subintervals with a ``small'' widths where
+@math{d\omega < 4} are computed using a 15-point Gauss-Kronrod integration.
+
+@end deftypefun
+
+@node QAWF adaptive integration for Fourier integrals
+@section QAWF adaptive integration for Fourier integrals
+@cindex QAWF quadrature algorithm
+@cindex Fourier integrals, numerical
+
+@deftypefun int gsl_integration_qawf (gsl_function * @var{f}, const double @var{a}, const double @var{epsabs}, const size_t @var{limit}, gsl_integration_workspace * @var{workspace}, gsl_integration_workspace * @var{cycle_workspace}, gsl_integration_qawo_table * @var{wf}, double * @var{result}, double * @var{abserr})
+
+This function attempts to compute a Fourier integral of the function
+@var{f} over the semi-infinite interval @math{[a,+\infty)}.
+@tex
+\beforedisplay
+$$
+\eqalign{
+I & = \int_a^{+\infty} dx\, f(x) \left\{ \matrix{ \sin(\omega x) \cr
+ \cos(\omega x) } \right\}
+}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+I = \int_a^@{+\infty@} dx f(x) sin(omega x)
+I = \int_a^@{+\infty@} dx f(x) cos(omega x)
+@end example
+@end ifinfo
+
+The parameter @math{\omega} and choice of @math{\sin} or @math{\cos} is
+taken from the table @var{wf} (the length @var{L} can take any value,
+since it is overridden by this function to a value appropriate for the
+fourier integration). The integral is computed using the QAWO algorithm
+over each of the subintervals,
+@tex
+\beforedisplay
+$$
+\eqalign{
+C_1 & = [a, a + c] \cr
+C_2 & = [a + c, a + 2c] \cr
+\dots & = \dots \cr
+C_k & = [a + (k-1) c, a + k c]
+}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+C_1 = [a, a + c]
+C_2 = [a + c, a + 2 c]
+... = ...
+C_k = [a + (k-1) c, a + k c]
+@end example
+
+@end ifinfo
+@noindent
+where
+@c{$c = (2 \,\hbox{floor}(|\omega|) + 1) \pi/|\omega|$}
+@math{c = (2 floor(|\omega|) + 1) \pi/|\omega|}. The width @math{c} is
+chosen to cover an odd number of periods so that the contributions from
+the intervals alternate in sign and are monotonically decreasing when
+@var{f} is positive and monotonically decreasing. The sum of this
+sequence of contributions is accelerated using the epsilon-algorithm.
+
+This function works to an overall absolute tolerance of
+@var{abserr}. The following strategy is used: on each interval
+@math{C_k} the algorithm tries to achieve the tolerance
+@tex
+\beforedisplay
+$$
+TOL_k = u_k \hbox{\it abserr}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+TOL_k = u_k abserr
+@end example
+
+@end ifinfo
+@noindent
+where
+@c{$u_k = (1 - p)p^{k-1}$}
+@math{u_k = (1 - p)p^@{k-1@}} and @math{p = 9/10}.
+The sum of the geometric series of contributions from each interval
+gives an overall tolerance of @var{abserr}.
+
+If the integration of a subinterval leads to difficulties then the
+accuracy requirement for subsequent intervals is relaxed,
+@tex
+\beforedisplay
+$$
+TOL_k = u_k \max(\hbox{\it abserr}, \max_{i<k}\{E_i\})
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+TOL_k = u_k max(abserr, max_@{i<k@}@{E_i@})
+@end example
+
+@end ifinfo
+@noindent
+where @math{E_k} is the estimated error on the interval @math{C_k}.
+
+The subintervals and their results are stored in the memory provided by
+@var{workspace}. The maximum number of subintervals is given by
+@var{limit}, which may not exceed the allocated size of the workspace.
+The integration over each subinterval uses the memory provided by
+@var{cycle_workspace} as workspace for the QAWO algorithm.
+
+@end deftypefun
+
+@node Numerical integration error codes
+@section Error codes
+
+In addition to the standard error codes for invalid arguments the
+functions can return the following values,
+
+@table @code
+@item GSL_EMAXITER
+the maximum number of subdivisions was exceeded.
+@item GSL_EROUND
+cannot reach tolerance because of roundoff error,
+or roundoff error was detected in the extrapolation table.
+@item GSL_ESING
+a non-integrable singularity or other bad integrand behavior was found
+in the integration interval.
+@item GSL_EDIVERGE
+the integral is divergent, or too slowly convergent to be integrated
+numerically.
+@end table
+
+@node Numerical integration examples
+@section Examples
+
+The integrator @code{QAGS} will handle a large class of definite
+integrals. For example, consider the following integral, which has a
+algebraic-logarithmic singularity at the origin,
+@tex
+\beforedisplay
+$$
+\int_0^1 x^{-1/2} \log(x) \,dx = -4
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+\int_0^1 x^@{-1/2@} log(x) dx = -4
+@end example
+
+@end ifinfo
+@noindent
+The program below computes this integral to a relative accuracy bound of
+@code{1e-7}.
+
+@example
+@verbatiminclude examples/integration.c
+@end example
+
+@noindent
+The results below show that the desired accuracy is achieved after 8
+subdivisions.
+
+@example
+$ ./a.out
+@verbatiminclude examples/integration.out
+@end example
+
+@noindent
+In fact, the extrapolation procedure used by @code{QAGS} produces an
+accuracy of almost twice as many digits. The error estimate returned by
+the extrapolation procedure is larger than the actual error, giving a
+margin of safety of one order of magnitude.
+
+
+@node Numerical integration References and Further Reading
+@section References and Further Reading
+
+The following book is the definitive reference for @sc{quadpack}, and was
+written by the original authors. It provides descriptions of the
+algorithms, program listings, test programs and examples. It also
+includes useful advice on numerical integration and many references to
+the numerical integration literature used in developing @sc{quadpack}.
+
+@itemize @asis
+@item
+R. Piessens, E. de Doncker-Kapenga, C.W. Uberhuber, D.K. Kahaner.
+@cite{@sc{quadpack} A subroutine package for automatic integration}
+Springer Verlag, 1983.
+@end itemize
+
+@noindent
+
+
+
+
+
+
diff --git a/gsl-1.9/doc/interp.texi b/gsl-1.9/doc/interp.texi
new file mode 100644
index 0000000..e1e6b1c
--- /dev/null
+++ b/gsl-1.9/doc/interp.texi
@@ -0,0 +1,318 @@
+@cindex interpolation
+@cindex spline
+
+This chapter describes functions for performing interpolation. The
+library provides a variety of interpolation methods, including Cubic
+splines and Akima splines. The interpolation types are interchangeable,
+allowing different methods to be used without recompiling.
+Interpolations can be defined for both normal and periodic boundary
+conditions. Additional functions are available for computing
+derivatives and integrals of interpolating functions.
+
+The functions described in this section are declared in the header files
+@file{gsl_interp.h} and @file{gsl_spline.h}.
+
+@menu
+* Introduction to Interpolation::
+* Interpolation Functions::
+* Interpolation Types::
+* Index Look-up and Acceleration::
+* Evaluation of Interpolating Functions::
+* Higher-level Interface::
+* Interpolation Example programs::
+* Interpolation References and Further Reading::
+@end menu
+
+@node Introduction to Interpolation
+@section Introduction
+
+Given a set of data points @math{(x_1, y_1) \dots (x_n, y_n)} the
+routines described in this section compute a continuous interpolating
+function @math{y(x)} such that @math{y(x_i) = y_i}. The interpolation
+is piecewise smooth, and its behavior at the end-points is determined by
+the type of interpolation used.
+
+@node Interpolation Functions
+@section Interpolation Functions
+
+The interpolation function for a given dataset is stored in a
+@code{gsl_interp} object. These are created by the following functions.
+
+@deftypefun {gsl_interp *} gsl_interp_alloc (const gsl_interp_type * @var{T}, size_t @var{size})
+This function returns a pointer to a newly allocated interpolation
+object of type @var{T} for @var{size} data-points.
+@end deftypefun
+
+@deftypefun int gsl_interp_init (gsl_interp * @var{interp}, const double @var{xa}[], const double @var{ya}[], size_t @var{size})
+This function initializes the interpolation object @var{interp} for the
+data (@var{xa},@var{ya}) where @var{xa} and @var{ya} are arrays of size
+@var{size}. The interpolation object (@code{gsl_interp}) does not save
+the data arrays @var{xa} and @var{ya} and only stores the static state
+computed from the data. The @var{xa} data array is always assumed to be
+strictly ordered; the behavior for other arrangements is not defined.
+@end deftypefun
+
+@deftypefun void gsl_interp_free (gsl_interp * @var{interp})
+This function frees the interpolation object @var{interp}.
+@end deftypefun
+
+@node Interpolation Types
+@section Interpolation Types
+
+The interpolation library provides five interpolation types:
+
+@deffn {Interpolation Type} gsl_interp_linear
+@cindex linear interpolation
+Linear interpolation. This interpolation method does not require any
+additional memory.
+@end deffn
+
+@deffn {Interpolation Type} gsl_interp_polynomial
+@cindex polynomial interpolation
+Polynomial interpolation. This method should only be used for
+interpolating small numbers of points because polynomial interpolation
+introduces large oscillations, even for well-behaved datasets. The
+number of terms in the interpolating polynomial is equal to the number
+of points.
+@end deffn
+
+@deffn {Interpolation Type} gsl_interp_cspline
+@cindex cubic splines
+Cubic spline with natural boundary conditions. The resulting curve is
+piecewise cubic on each interval, with matching first and second
+derivatives at the supplied data-points. The second derivative is
+chosen to be zero at the first point and last point.
+@end deffn
+
+@deffn {Interpolation Type} gsl_interp_cspline_periodic
+Cubic spline with periodic boundary conditions. The resulting curve
+is piecewise cubic on each interval, with matching first and second
+derivatives at the supplied data-points. The derivatives at the first
+and last points are also matched. Note that the last point in the
+data must have the same y-value as the first point, otherwise the
+resulting periodic interpolation will have a discontinuity at the
+boundary.
+
+@end deffn
+
+@deffn {Interpolation Type} gsl_interp_akima
+@cindex Akima splines
+Non-rounded Akima spline with natural boundary conditions. This method
+uses the non-rounded corner algorithm of Wodicka.
+@end deffn
+
+@deffn {Interpolation Type} gsl_interp_akima_periodic
+Non-rounded Akima spline with periodic boundary conditions. This method
+uses the non-rounded corner algorithm of Wodicka.
+@end deffn
+
+The following related functions are available:
+
+@deftypefun {const char *} gsl_interp_name (const gsl_interp * @var{interp})
+This function returns the name of the interpolation type used by @var{interp}.
+For example,
+
+@example
+printf ("interp uses '%s' interpolation.\n",
+ gsl_interp_name (interp));
+@end example
+
+@noindent
+would print something like,
+
+@example
+interp uses 'cspline' interpolation.
+@end example
+@end deftypefun
+
+@deftypefun {unsigned int} gsl_interp_min_size (const gsl_interp * @var{interp})
+This function returns the minimum number of points required by the
+interpolation type of @var{interp}. For example, Akima spline interpolation
+requires a minimum of 5 points.
+@end deftypefun
+
+@node Index Look-up and Acceleration
+@section Index Look-up and Acceleration
+
+The state of searches can be stored in a @code{gsl_interp_accel} object,
+which is a kind of iterator for interpolation lookups. It caches the
+previous value of an index lookup. When the subsequent interpolation
+point falls in the same interval its index value can be returned
+immediately.
+
+@deftypefun size_t gsl_interp_bsearch (const double @var{x_array}[], double @var{x}, size_t @var{index_lo}, size_t @var{index_hi})
+This function returns the index @math{i} of the array @var{x_array} such
+that @code{x_array[i] <= x < x_array[i+1]}. The index is searched for
+in the range [@var{index_lo},@var{index_hi}].
+@end deftypefun
+
+@deftypefun {gsl_interp_accel *} gsl_interp_accel_alloc (void)
+This function returns a pointer to an accelerator object, which is a
+kind of iterator for interpolation lookups. It tracks the state of
+lookups, thus allowing for application of various acceleration
+strategies.
+@end deftypefun
+
+@deftypefun size_t gsl_interp_accel_find (gsl_interp_accel * @var{a}, const double @var{x_array}[], size_t @var{size}, double @var{x})
+This function performs a lookup action on the data array @var{x_array}
+of size @var{size}, using the given accelerator @var{a}. This is how
+lookups are performed during evaluation of an interpolation. The
+function returns an index @math{i} such that @code{x_array[i] <= x <
+x_array[i+1]}.
+@end deftypefun
+
+@deftypefun void gsl_interp_accel_free (gsl_interp_accel* @var{acc})
+This function frees the accelerator object @var{acc}.
+@end deftypefun
+
+@node Evaluation of Interpolating Functions
+@section Evaluation of Interpolating Functions
+
+@deftypefun double gsl_interp_eval (const gsl_interp * @var{interp}, const double @var{xa}[], const double @var{ya}[], double @var{x}, gsl_interp_accel * @var{acc})
+@deftypefunx int gsl_interp_eval_e (const gsl_interp * @var{interp}, const double @var{xa}[], const double @var{ya}[], double @var{x}, gsl_interp_accel * @var{acc}, double * @var{y})
+These functions return the interpolated value of @var{y} for a given
+point @var{x}, using the interpolation object @var{interp}, data arrays
+@var{xa} and @var{ya} and the accelerator @var{acc}.
+@end deftypefun
+
+@deftypefun double gsl_interp_eval_deriv (const gsl_interp * @var{interp}, const double @var{xa}[], const double @var{ya}[], double @var{x}, gsl_interp_accel * @var{acc})
+@deftypefunx int gsl_interp_eval_deriv_e (const gsl_interp * @var{interp}, const double @var{xa}[], const double @var{ya}[], double @var{x}, gsl_interp_accel * @var{acc}, double * @var{d})
+These functions return the derivative @var{d} of an interpolated
+function for a given point @var{x}, using the interpolation object
+@var{interp}, data arrays @var{xa} and @var{ya} and the accelerator
+@var{acc}.
+@end deftypefun
+
+@deftypefun double gsl_interp_eval_deriv2 (const gsl_interp * @var{interp}, const double @var{xa}[], const double @var{ya}[], double @var{x}, gsl_interp_accel * @var{acc})
+@deftypefunx int gsl_interp_eval_deriv2_e (const gsl_interp * @var{interp}, const double @var{xa}[], const double @var{ya}[], double @var{x}, gsl_interp_accel * @var{acc}, double * @var{d2})
+These functions return the second derivative @var{d2} of an interpolated
+function for a given point @var{x}, using the interpolation object
+@var{interp}, data arrays @var{xa} and @var{ya} and the accelerator
+@var{acc}.
+@end deftypefun
+
+@deftypefun double gsl_interp_eval_integ (const gsl_interp * @var{interp}, const double @var{xa}[], const double @var{ya}[], double @var{a}, double @var{b}, gsl_interp_accel * @var{acc})
+@deftypefunx int gsl_interp_eval_integ_e (const gsl_interp * @var{interp}, const double @var{xa}[], const double @var{ya}[], double @var{a}, double @var{b}, gsl_interp_accel * @var{acc}, double * @var{result})
+These functions return the numerical integral @var{result} of an
+interpolated function over the range [@var{a}, @var{b}], using the
+interpolation object @var{interp}, data arrays @var{xa} and @var{ya} and
+the accelerator @var{acc}.
+@end deftypefun
+
+@node Higher-level Interface
+@section Higher-level Interface
+
+The functions described in the previous sections required the user to
+supply pointers to the @math{x} and @math{y} arrays on each call. The
+following functions are equivalent to the corresponding
+@code{gsl_interp} functions but maintain a copy of this data in the
+@code{gsl_spline} object. This removes the need to pass both @var{xa}
+and @var{ya} as arguments on each evaluation. These functions are
+defined in the header file @file{gsl_spline.h}.
+
+@deftypefun {gsl_spline *} gsl_spline_alloc (const gsl_interp_type * @var{T}, size_t @var{size})
+@end deftypefun
+
+@deftypefun int gsl_spline_init (gsl_spline * @var{spline}, const double @var{xa}[], const double @var{ya}[], size_t @var{size})
+@end deftypefun
+
+@deftypefun void gsl_spline_free (gsl_spline * @var{spline})
+@end deftypefun
+
+@deftypefun {const char *} gsl_spline_name (const gsl_spline * @var{spline})
+@end deftypefun
+
+@deftypefun {unsigned int} gsl_spline_min_size (const gsl_spline * @var{spline})
+@end deftypefun
+
+@deftypefun double gsl_spline_eval (const gsl_spline * @var{spline}, double @var{x}, gsl_interp_accel * @var{acc})
+@deftypefunx int gsl_spline_eval_e (const gsl_spline * @var{spline}, double @var{x}, gsl_interp_accel * @var{acc}, double * @var{y})
+@end deftypefun
+
+@deftypefun double gsl_spline_eval_deriv (const gsl_spline * @var{spline}, double @var{x}, gsl_interp_accel * @var{acc})
+@deftypefunx int gsl_spline_eval_deriv_e (const gsl_spline * @var{spline}, double @var{x}, gsl_interp_accel * @var{acc}, double * @var{d})
+@end deftypefun
+
+@deftypefun double gsl_spline_eval_deriv2 (const gsl_spline * @var{spline}, double @var{x}, gsl_interp_accel * @var{acc})
+@deftypefunx int gsl_spline_eval_deriv2_e (const gsl_spline * @var{spline}, double @var{x}, gsl_interp_accel * @var{acc}, double * @var{d2})
+@end deftypefun
+
+@deftypefun double gsl_spline_eval_integ (const gsl_spline * @var{spline}, double @var{a}, double @var{b}, gsl_interp_accel * @var{acc})
+@deftypefunx int gsl_spline_eval_integ_e (const gsl_spline * @var{spline}, double @var{a}, double @var{b}, gsl_interp_accel * @var{acc}, double * @var{result})
+@end deftypefun
+
+@node Interpolation Example programs
+@section Examples
+
+The following program demonstrates the use of the interpolation and
+spline functions. It computes a cubic spline interpolation of the
+10-point dataset @math{(x_i, y_i)} where @math{x_i = i + \sin(i)/2} and
+@math{y_i = i + \cos(i^2)} for @math{i = 0 \dots 9}.
+
+@example
+@verbatiminclude examples/interp.c
+@end example
+
+@noindent
+The output is designed to be used with the @sc{gnu} plotutils
+@code{graph} program,
+
+@example
+$ ./a.out > interp.dat
+$ graph -T ps < interp.dat > interp.ps
+@end example
+
+@iftex
+@sp 1
+@center @image{interp2,3.4in}
+@end iftex
+
+@noindent
+The result shows a smooth interpolation of the original points. The
+interpolation method can changed simply by varying the first argument of
+@code{gsl_spline_alloc}.
+
+The next program demonstrates a periodic cubic spline with 4 data
+points. Note that the first and last points must be supplied with
+the same y-value for a periodic spline.
+
+@example
+@verbatiminclude examples/interpp.c
+@end example
+
+@noindent
+
+The output can be plotted with @sc{gnu} @code{graph}.
+
+@example
+$ ./a.out > interp.dat
+$ graph -T ps < interp.dat > interp.ps
+@end example
+
+@iftex
+@sp 1
+@center @image{interpp2,3.4in}
+@end iftex
+
+@noindent
+The result shows a periodic interpolation of the original points. The
+slope of the fitted curve is the same at the beginning and end of the
+data, and the second derivative is also.
+
+@node Interpolation References and Further Reading
+@section References and Further Reading
+
+Descriptions of the interpolation algorithms and further references can
+be found in the following books:
+
+@itemize @asis
+@item C.W. Ueberhuber,
+@cite{Numerical Computation (Volume 1), Chapter 9 ``Interpolation''},
+Springer (1997), ISBN 3-540-62058-3.
+
+@item D.M. Young, R.T. Gregory
+@cite{A Survey of Numerical Mathematics (Volume 1), Chapter 6.8},
+Dover (1988), ISBN 0-486-65691-8.
+@end itemize
+
+@noindent
diff --git a/gsl-1.9/doc/interp2.eps b/gsl-1.9/doc/interp2.eps
new file mode 100644
index 0000000..522036a
--- /dev/null
+++ b/gsl-1.9/doc/interp2.eps
@@ -0,0 +1,3252 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: GNU libplot drawing library 4.1
+%%Title: PostScript plot
+%%CreationDate: Thu Mar 17 17:03:59 2005
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 1
+%%Pages: 1
+%%PageOrder: Ascend
+%%Orientation: Portrait
+%%BoundingBox: 107 197 835 580
+%%DocumentNeededResources: font Helvetica
+%%DocumentSuppliedResources: procset GNU_libplot 1.0 0
+%%EndComments
+
+%%BeginDefaults
+%%PageResources: font Helvetica
+%%EndDefaults
+
+%%BeginProlog
+%%EndProlog
+
+%%BeginSetup
+%%IncludeResource: font Helvetica
+/DrawDict 50 dict def
+DrawDict begin
+/ISOLatin1Encoding [
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright
+/parenleft/parenright/asterisk/plus/comma/minus/period/slash
+/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon
+/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N
+/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright
+/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m
+/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/dotlessi/grave/acute/circumflex/tilde/macron/breve
+/dotaccent/dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut
+/ogonek/caron/space/exclamdown/cent/sterling/currency/yen/brokenbar
+/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot
+/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior
+/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine
+/guillemotright/onequarter/onehalf/threequarters/questiondown
+/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla
+/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex
+/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis
+/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute
+/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis
+/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave
+/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex
+/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis
+/yacute/thorn/ydieresis
+] def
+/reencodeISO {
+dup dup findfont dup length dict begin
+{ 1 index /FID ne { def }{ pop pop } ifelse } forall
+/Encoding ISOLatin1Encoding def
+currentdict end definefont
+} def
+/Helvetica reencodeISO def
+%%BeginResource procset GNU_libplot 1.0 0
+/none null def
+/numGraphicParameters 17 def
+/stringLimit 65535 def
+/arrowHeight 8 def
+/eoFillRule true def
+
+/Begin { save numGraphicParameters dict begin } def
+/End { end restore } def
+
+/SetB {
+dup type /nulltype eq {
+pop
+false /brushRightArrow idef
+false /brushLeftArrow idef
+true /brushNone idef
+} {
+/brushDashOffset idef
+/brushDashArray idef
+0 ne /brushRightArrow idef
+0 ne /brushLeftArrow idef
+/brushWidth idef
+false /brushNone idef
+} ifelse
+} def
+
+/SetCFg {
+/fgblue idef
+/fggreen idef
+/fgred idef
+} def
+
+/SetCBg {
+/bgblue idef
+/bggreen idef
+/bgred idef
+} def
+
+/SetF {
+/printSize idef
+/printFont idef
+} def
+
+/SetP {
+dup type /nulltype eq {
+pop true /patternNone idef
+} {
+/patternGrayLevel idef
+patternGrayLevel -1 eq {
+/patternString idef
+} if
+false /patternNone idef
+} ifelse
+} def
+
+/BSpl {
+0 begin
+storexyn
+newpath
+n 1 gt {
+0 0 0 0 0 0 1 1 true subspline
+n 2 gt {
+0 0 0 0 1 1 2 2 false subspline
+1 1 n 3 sub {
+/i exch def
+i 1 sub dup i dup i 1 add dup i 2 add dup false subspline
+} for
+n 3 sub dup n 2 sub dup n 1 sub dup 2 copy false subspline
+} if
+n 2 sub dup n 1 sub dup 2 copy 2 copy false subspline
+patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if
+brushNone not { istroke } if
+0 0 1 1 leftarrow
+n 2 sub dup 1 sub dup rightarrow
+} if
+end
+} dup 0 4 dict put def
+
+/Circ {
+newpath
+0 360 arc
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+} def
+
+/CBSpl {
+0 begin
+dup 2 gt {
+storexyn
+newpath
+n 1 sub dup 0 0 1 1 2 2 true subspline
+1 1 n 3 sub {
+/i exch def
+i 1 sub dup i dup i 1 add dup i 2 add dup false subspline
+} for
+n 3 sub dup n 2 sub dup n 1 sub dup 0 0 false subspline
+n 2 sub dup n 1 sub dup 0 0 1 1 false subspline
+patternNone not { ifill } if
+brushNone not { istroke } if
+} {
+Poly
+} ifelse
+end
+} dup 0 4 dict put def
+
+/Elli {
+0 begin
+newpath
+4 2 roll
+translate
+scale
+0 0 1 0 360 arc
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+end
+} dup 0 1 dict put def
+
+/Line {
+0 begin
+2 storexyn
+newpath
+x 0 get y 0 get moveto
+x 1 get y 1 get lineto
+brushNone not { istroke } if
+0 0 1 1 leftarrow
+0 0 1 1 rightarrow
+end
+} dup 0 4 dict put def
+
+/MLine {
+0 begin
+storexyn
+newpath
+n 1 gt {
+x 0 get y 0 get moveto
+1 1 n 1 sub {
+/i exch def
+x i get y i get lineto
+} for
+patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if
+brushNone not { istroke } if
+0 0 1 1 leftarrow
+n 2 sub dup n 1 sub dup rightarrow
+} if
+end
+} dup 0 4 dict put def
+
+/Poly {
+3 1 roll
+newpath
+moveto
+-1 add
+{ lineto } repeat
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+} def
+
+/Rect {
+0 begin
+/t exch def
+/r exch def
+/b exch def
+/l exch def
+newpath
+l b moveto
+l t lineto
+r t lineto
+r b lineto
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+end
+} dup 0 4 dict put def
+
+/Text {
+ishow
+} def
+
+/idef {
+dup where { pop pop pop } { exch def } ifelse
+} def
+
+/ifill {
+0 begin
+gsave
+patternGrayLevel -1 ne {
+fgred bgred fgred sub patternGrayLevel mul add
+fggreen bggreen fggreen sub patternGrayLevel mul add
+fgblue bgblue fgblue sub patternGrayLevel mul add setrgbcolor
+eoFillRule { eofill } { fill } ifelse
+} {
+eoFillRule { eoclip } { clip } ifelse
+originalCTM setmatrix
+pathbbox /t exch def /r exch def /b exch def /l exch def
+/w r l sub ceiling cvi def
+/h t b sub ceiling cvi def
+/imageByteWidth w 8 div ceiling cvi def
+/imageHeight h def
+bgred bggreen bgblue setrgbcolor
+eoFillRule { eofill } { fill } ifelse
+fgred fggreen fgblue setrgbcolor
+w 0 gt h 0 gt and {
+l b translate w h scale
+w h true [w 0 0 h neg 0 h] { patternproc } imagemask
+} if
+} ifelse
+grestore
+end
+} dup 0 8 dict put def
+
+/istroke {
+gsave
+brushDashOffset -1 eq {
+[] 0 setdash
+1 setgray
+} {
+brushDashArray brushDashOffset setdash
+fgred fggreen fgblue setrgbcolor
+} ifelse
+brushWidth 2 mul setlinewidth
+originalCTM setmatrix
+stroke
+grestore
+} def
+
+/ishow {
+0 begin
+gsave
+fgred fggreen fgblue setrgbcolor
+/fontDict printFont findfont printSize scalefont dup setfont def
+/descender fontDict begin 0 /FontBBox load 1 get FontMatrix end
+transform exch pop def
+/vertoffset 1 printSize sub descender sub def {
+0 vertoffset moveto show
+/vertoffset vertoffset printSize sub def
+} forall
+grestore
+end
+} dup 0 3 dict put def
+
+/patternproc {
+0 begin
+/patternByteLength patternString length def
+/patternHeight patternByteLength 8 mul sqrt cvi def
+/patternWidth patternHeight def
+/patternByteWidth patternWidth 8 idiv def
+/imageByteMaxLength imageByteWidth imageHeight mul
+stringLimit patternByteWidth sub min def
+/imageMaxHeight imageByteMaxLength imageByteWidth idiv patternHeight idiv
+patternHeight mul patternHeight max def
+/imageHeight imageHeight imageMaxHeight sub store
+/imageString imageByteWidth imageMaxHeight mul patternByteWidth add string def
+0 1 imageMaxHeight 1 sub {
+/y exch def
+/patternRow y patternByteWidth mul patternByteLength mod def
+/patternRowString patternString patternRow patternByteWidth getinterval def
+/imageRow y imageByteWidth mul def
+0 patternByteWidth imageByteWidth 1 sub {
+/x exch def
+imageString imageRow x add patternRowString putinterval
+} for
+} for
+imageString
+end
+} dup 0 12 dict put def
+
+/min {
+dup 3 2 roll dup 4 3 roll lt { exch } if pop
+} def
+
+/max {
+dup 3 2 roll dup 4 3 roll gt { exch } if pop
+} def
+
+/midpoint {
+0 begin
+/y1 exch def
+/x1 exch def
+/y0 exch def
+/x0 exch def
+x0 x1 add 2 div
+y0 y1 add 2 div
+end
+} dup 0 4 dict put def
+
+/thirdpoint {
+0 begin
+/y1 exch def
+/x1 exch def
+/y0 exch def
+/x0 exch def
+x0 2 mul x1 add 3 div
+y0 2 mul y1 add 3 div
+end
+} dup 0 4 dict put def
+
+/subspline {
+0 begin
+/movetoNeeded exch def
+y exch get /y3 exch def
+x exch get /x3 exch def
+y exch get /y2 exch def
+x exch get /x2 exch def
+y exch get /y1 exch def
+x exch get /x1 exch def
+y exch get /y0 exch def
+x exch get /x0 exch def
+x1 y1 x2 y2 thirdpoint
+/p1y exch def
+/p1x exch def
+x2 y2 x1 y1 thirdpoint
+/p2y exch def
+/p2x exch def
+x1 y1 x0 y0 thirdpoint
+p1x p1y midpoint
+/p0y exch def
+/p0x exch def
+x2 y2 x3 y3 thirdpoint
+p2x p2y midpoint
+/p3y exch def
+/p3x exch def
+movetoNeeded { p0x p0y moveto } if
+p1x p1y p2x p2y p3x p3y curveto
+end
+} dup 0 17 dict put def
+
+/storexyn {
+/n exch def
+/y n array def
+/x n array def
+n 1 sub -1 0 {
+/i exch def
+y i 3 2 roll put
+x i 3 2 roll put
+} for
+} def
+
+/arrowhead {
+0 begin
+transform originalCTM itransform
+/taily exch def
+/tailx exch def
+transform originalCTM itransform
+/tipy exch def
+/tipx exch def
+/dy tipy taily sub def
+/dx tipx tailx sub def
+/angle dx 0 ne dy 0 ne or { dy dx atan } { 90 } ifelse def
+gsave
+originalCTM setmatrix
+tipx tipy translate
+angle rotate
+newpath
+arrowHeight neg arrowWidth 2 div moveto
+0 0 lineto
+arrowHeight neg arrowWidth 2 div neg lineto
+patternNone not {
+originalCTM setmatrix
+/padtip arrowHeight 2 exp 0.25 arrowWidth 2 exp mul add sqrt brushWidth mul
+arrowWidth div def
+/padtail brushWidth 2 div def
+tipx tipy translate
+angle rotate
+padtip 0 translate
+arrowHeight padtip add padtail add arrowHeight div dup scale
+arrowheadpath
+ifill
+} if
+brushNone not {
+originalCTM setmatrix
+tipx tipy translate
+angle rotate
+arrowheadpath
+istroke
+} if
+grestore
+end
+} dup 0 9 dict put def
+
+/arrowheadpath {
+newpath
+arrowHeight neg arrowWidth 2 div moveto
+0 0 lineto
+arrowHeight neg arrowWidth 2 div neg lineto
+} def
+
+/leftarrow {
+0 begin
+y exch get /taily exch def
+x exch get /tailx exch def
+y exch get /tipy exch def
+x exch get /tipx exch def
+brushLeftArrow { tipx tipy tailx taily arrowhead } if
+end
+} dup 0 4 dict put def
+
+/rightarrow {
+0 begin
+y exch get /tipy exch def
+x exch get /tipx exch def
+y exch get /taily exch def
+x exch get /tailx exch def
+brushRightArrow { tipx tipy tailx taily arrowhead } if
+end
+} dup 0 4 dict put def
+%%EndResource
+%%EndSetup
+
+%%Page: 1 1
+%%PageResources: font Helvetica
+%%PageBoundingBox: 107 197 835 580
+%%BeginPageSetup
+%I Idraw 8
+
+Begin
+%I b u
+%I cfg u
+%I cbg u
+%I f u
+%I p u
+%I t
+[ 1 0 0 1 0 0 ] concat
+/originalCTM matrix currentmatrix def
+/trueoriginalCTM matrix currentmatrix def
+%%EndPageSetup
+
+Begin %I Rect
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+2304 2304 16128 9216 Rect
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 128.156 214.1855 ] concat
+%I
+[
+(0)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 9216
+2304 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2304 2442
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 266.396 214.1855 ] concat
+%I
+[
+(2)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5069 9216
+5069 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5069 2304
+5069 2442
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 404.636 214.1855 ] concat
+%I
+[
+(4)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7834 9216
+7834 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7834 2304
+7834 2442
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 542.876 214.1855 ] concat
+%I
+[
+(6)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+10598 9216
+10598 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+10598 2304
+10598 2442
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 681.116 214.1855 ] concat
+%I
+[
+(8)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+13363 9216
+13363 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+13363 2304
+13363 2442
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 814.3119 214.1855 ] concat
+%I
+[
+(10)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+16128 9216
+16128 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+16128 2304
+16128 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 9216
+2304 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2304 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3686 9216
+3686 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3686 2304
+3686 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5069 9216
+5069 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5069 2304
+5069 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6451 9216
+6451 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6451 2304
+6451 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7834 9216
+7834 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7834 2304
+7834 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 9216
+9216 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2304
+9216 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+10598 9216
+10598 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+10598 2304
+10598 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+11981 9216
+11981 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+11981 2304
+11981 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+13363 9216
+13363 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+13363 2304
+13363 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+14746 9216
+14746 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+14746 2304
+14746 2359
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+16128 9216
+16128 9161
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+16128 2304
+16128 2359
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 117.9279 229.8568 ] concat
+%I
+[
+(0)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+16128 2304
+15990 2304
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2442 2304
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 117.9279 298.9768 ] concat
+%I
+[
+(2)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+16128 3686
+15990 3686
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3686
+2442 3686
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 117.9279 368.0968 ] concat
+%I
+[
+(4)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+16128 5069
+15990 5069
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5069
+2442 5069
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 117.9279 437.2168 ] concat
+%I
+[
+(6)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+16128 6451
+15990 6451
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 6451
+2442 6451
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 117.9279 506.3368 ] concat
+%I
+[
+(8)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+16128 7834
+15990 7834
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 7834
+2442 7834
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 107.8399 575.4568 ] concat
+%I
+[
+(10)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+16128 9216
+15990 9216
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 9216
+2442 9216
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+16128 2304
+16073 2304
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2359 2304
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+16128 2995
+16073 2995
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2995
+2359 2995
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+16128 3686
+16073 3686
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3686
+2359 3686
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+16128 4378
+16073 4378
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4378
+2359 4378
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+16128 5069
+16073 5069
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5069
+2359 5069
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+16128 5760
+16073 5760
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5760
+2359 5760
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+16128 6451
+16073 6451
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 6451
+2359 6451
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+16128 7142
+16073 7142
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 7142
+2359 7142
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+16128 7834
+16073 7834
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 7834
+2359 7834
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+16128 8525
+16073 8525
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 8525
+2359 8525
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+16128 9216
+16073 9216
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 9216
+2359 9216
+2 MLine
+End
+
+Begin %I Rect
+[0.54 0 0 0.54 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+2196 2887 2412 3103 Rect
+End
+
+Begin %I Rect
+[0.54 0 0 0.54 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+4160 3261 4376 3477 Rect
+End
+
+Begin %I Rect
+[0.54 0 0 0.54 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+5589 3127 5805 3343 Rect
+End
+
+Begin %I Rect
+[0.54 0 0 0.54 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+6441 3640 6657 3856 Rect
+End
+
+Begin %I Rect
+[0.54 0 0 0.54 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+7202 4299 7418 4515 Rect
+End
+
+Begin %I Rect
+[0.54 0 0 0.54 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+8445 6337 8661 6553 Rect
+End
+
+Begin %I Rect
+[0.54 0 0 0.54 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+10297 6255 10513 6471 Rect
+End
+
+Begin %I Rect
+[0.54 0 0 0.54 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+12327 7242 12543 7458 Rect
+End
+
+Begin %I Rect
+[0.54 0 0 0.54 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+13939 7996 14155 8212 Rect
+End
+
+Begin %I Rect
+[0.54 0 0 0.54 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg Black
+0 0 0 SetCBg
+%I p
+0.000000 SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+14922 8954 15138 9170 Rect
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 500
+2304 2995
+2318 3000
+2332 3005
+2345 3010
+2359 3015
+2373 3019
+2387 3024
+2401 3029
+2415 3034
+2428 3039
+2442 3043
+2456 3048
+2470 3053
+2484 3058
+2498 3063
+2511 3067
+2525 3072
+2539 3077
+2553 3082
+2567 3086
+2580 3091
+2594 3096
+2608 3100
+2622 3105
+2636 3110
+2650 3114
+2663 3119
+2677 3123
+2691 3128
+2705 3133
+2719 3137
+2733 3142
+2746 3146
+2760 3151
+2774 3155
+2788 3160
+2802 3164
+2815 3168
+2829 3173
+2843 3177
+2857 3181
+2871 3186
+2885 3190
+2898 3194
+2912 3198
+2926 3203
+2940 3207
+2954 3211
+2968 3215
+2981 3219
+2995 3223
+3009 3227
+3023 3231
+3037 3235
+3050 3239
+3064 3243
+3078 3247
+3092 3250
+3106 3254
+3120 3258
+3133 3261
+3147 3265
+3161 3269
+3175 3272
+3189 3276
+3203 3279
+3216 3283
+3230 3286
+3244 3289
+3258 3293
+3272 3296
+3286 3299
+3299 3302
+3313 3305
+3327 3308
+3341 3311
+3355 3314
+3368 3317
+3382 3320
+3396 3323
+3410 3326
+3424 3328
+3438 3331
+3451 3334
+3465 3336
+3479 3339
+3493 3341
+3507 3344
+3521 3346
+3534 3348
+3548 3350
+3562 3353
+3576 3355
+3590 3357
+3603 3359
+3617 3361
+3631 3362
+3645 3364
+3659 3366
+3673 3368
+3686 3369
+3700 3371
+3714 3372
+3728 3374
+3742 3375
+3756 3376
+3769 3377
+3783 3378
+3797 3379
+3811 3380
+3825 3381
+3838 3382
+3852 3383
+3866 3384
+3880 3384
+3894 3385
+3908 3385
+3921 3386
+3935 3386
+3949 3386
+3963 3386
+3977 3386
+3991 3386
+4004 3386
+4018 3386
+4032 3386
+4046 3386
+4060 3385
+4073 3385
+4087 3384
+4101 3383
+4115 3383
+4129 3382
+4143 3381
+4156 3380
+4170 3379
+4184 3378
+4198 3376
+4212 3375
+4226 3374
+4239 3372
+4253 3371
+4267 3369
+4281 3367
+4295 3365
+4308 3363
+4322 3361
+4336 3359
+4350 3357
+4364 3354
+4378 3352
+4391 3349
+4405 3347
+4419 3344
+4433 3342
+4447 3339
+4461 3336
+4474 3333
+4488 3331
+4502 3328
+4516 3325
+4530 3322
+4543 3319
+4557 3316
+4571 3313
+4585 3309
+4599 3306
+4613 3303
+4626 3300
+4640 3297
+4654 3294
+4668 3290
+4682 3287
+4696 3284
+4709 3281
+4723 3277
+4737 3274
+4751 3271
+4765 3268
+4778 3265
+4792 3261
+4806 3258
+4820 3255
+4834 3252
+4848 3249
+4861 3246
+4875 3243
+4889 3240
+4903 3237
+4917 3234
+4931 3231
+4944 3228
+4958 3226
+4972 3223
+4986 3220
+5000 3218
+5014 3215
+5027 3213
+5041 3210
+5055 3208
+5069 3206
+5083 3204
+5096 3202
+5110 3200
+5124 3198
+5138 3196
+5152 3194
+5166 3193
+5179 3191
+5193 3190
+5207 3189
+5221 3187
+5235 3186
+5249 3185
+5262 3184
+5276 3184
+5290 3183
+5304 3183
+5318 3182
+5331 3182
+5345 3182
+5359 3182
+5373 3182
+5387 3183
+5401 3183
+5414 3184
+5428 3185
+5442 3185
+5456 3187
+5470 3188
+5484 3189
+5497 3191
+5511 3193
+5525 3195
+5539 3197
+5553 3199
+5566 3201
+5580 3204
+5594 3207
+5608 3210
+5622 3213
+5636 3217
+5649 3220
+5663 3224
+5677 3228
+5691 3233
+5705 3237
+5719 3242
+5732 3247
+5746 3252
+5760 3257
+5774 3262
+5788 3268
+5801 3274
+5815 3280
+5829 3286
+5843 3293
+5857 3299
+5871 3306
+5884 3313
+5898 3320
+5912 3327
+5926 3334
+5940 3342
+5954 3350
+5967 3357
+5981 3365
+5995 3373
+6009 3381
+6023 3390
+6036 3398
+6050 3406
+6064 3415
+6078 3424
+6092 3432
+6106 3441
+6119 3450
+6133 3459
+6147 3468
+6161 3478
+6175 3487
+6189 3496
+6202 3505
+6216 3515
+6230 3524
+6244 3534
+6258 3544
+6271 3553
+6285 3563
+6299 3572
+6313 3582
+6327 3592
+6341 3602
+6354 3611
+6368 3621
+6382 3631
+6396 3641
+6410 3651
+6424 3660
+6437 3670
+6451 3680
+6465 3690
+6479 3699
+6493 3709
+6506 3719
+6520 3728
+6534 3738
+6548 3747
+6562 3757
+6576 3766
+6589 3776
+6603 3785
+6617 3794
+6631 3804
+6645 3813
+6659 3822
+6672 3832
+6686 3841
+6700 3850
+6714 3860
+6728 3869
+6742 3879
+6755 3888
+6769 3898
+6783 3908
+6797 3917
+6811 3927
+6824 3937
+6838 3947
+6852 3957
+6866 3968
+6880 3978
+6894 3988
+6907 3999
+6921 4010
+6935 4021
+6949 4032
+6963 4043
+6977 4055
+6990 4067
+7004 4078
+7018 4091
+7032 4103
+7046 4115
+7059 4128
+7073 4141
+7087 4154
+7101 4168
+7115 4181
+7129 4195
+7142 4209
+7156 4224
+7170 4239
+7184 4254
+7198 4269
+7212 4285
+7225 4301
+7239 4317
+7253 4334
+7267 4351
+7281 4368
+7294 4386
+7308 4404
+7322 4422
+7336 4441
+7350 4460
+7364 4480
+7377 4500
+7391 4520
+7405 4540
+7419 4561
+7433 4582
+7447 4603
+7460 4625
+7474 4647
+7488 4669
+7502 4692
+7516 4714
+7529 4737
+7543 4760
+7557 4784
+7571 4807
+7585 4831
+7599 4855
+7612 4879
+7626 4903
+7640 4928
+7654 4952
+7668 4977
+7682 5002
+7695 5027
+7709 5052
+7723 5078
+7737 5103
+7751 5128
+7764 5154
+7778 5179
+7792 5205
+7806 5231
+7820 5257
+7834 5282
+7847 5308
+7861 5334
+7875 5360
+7889 5386
+7903 5411
+7917 5437
+7930 5463
+7944 5489
+7958 5514
+7972 5540
+7986 5566
+7999 5591
+8013 5616
+8027 5642
+8041 5667
+8055 5692
+8069 5717
+8082 5742
+8096 5767
+8110 5791
+8124 5816
+8138 5840
+8152 5864
+8165 5888
+8179 5911
+8193 5935
+8207 5958
+8221 5981
+8234 6004
+8248 6027
+8262 6049
+8276 6071
+8290 6093
+8304 6114
+8317 6136
+8331 6156
+8345 6177
+8359 6197
+8373 6217
+8387 6237
+8400 6257
+8414 6276
+8428 6294
+8442 6312
+8456 6330
+8470 6348
+8483 6365
+8497 6382
+8511 6398
+8525 6414
+8539 6429
+8552 6444
+8566 6459
+8580 6473
+8594 6487
+8608 6500
+8622 6513
+8635 6525
+8649 6537
+8663 6549
+8677 6560
+8691 6571
+8705 6581
+8718 6591
+8732 6600
+8746 6610
+8760 6618
+8774 6627
+8787 6635
+8801 6642
+8815 6650
+8829 6657
+8843 6663
+8857 6670
+8870 6676
+8884 6681
+8898 6686
+8912 6691
+8926 6696
+8940 6700
+8953 6704
+8967 6708
+8981 6711
+8995 6714
+9009 6717
+9022 6720
+9036 6722
+9050 6724
+9064 6725
+9078 6727
+9092 6728
+9105 6729
+9119 6729
+9133 6730
+9147 6730
+9161 6730
+9175 6729
+9188 6729
+9202 6728
+500 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 422
+9202 6728
+9216 6727
+9230 6726
+9244 6724
+9257 6723
+9271 6721
+9285 6719
+9299 6717
+9313 6714
+9327 6712
+9340 6709
+9354 6706
+9368 6703
+9382 6700
+9396 6696
+9410 6693
+9423 6689
+9437 6685
+9451 6681
+9465 6677
+9479 6673
+9492 6668
+9506 6664
+9520 6659
+9534 6655
+9548 6650
+9562 6645
+9575 6640
+9589 6635
+9603 6630
+9617 6625
+9631 6619
+9645 6614
+9658 6609
+9672 6603
+9686 6598
+9700 6592
+9714 6587
+9727 6581
+9741 6575
+9755 6570
+9769 6564
+9783 6558
+9797 6552
+9810 6547
+9824 6541
+9838 6535
+9852 6529
+9866 6524
+9880 6518
+9893 6512
+9907 6507
+9921 6501
+9935 6495
+9949 6490
+9962 6484
+9976 6479
+9990 6474
+10004 6468
+10018 6463
+10032 6458
+10045 6453
+10059 6448
+10073 6443
+10087 6438
+10101 6433
+10115 6428
+10128 6424
+10142 6419
+10156 6415
+10170 6411
+10184 6407
+10198 6403
+10211 6399
+10225 6395
+10239 6392
+10253 6389
+10267 6385
+10280 6382
+10294 6379
+10308 6377
+10322 6374
+10336 6372
+10350 6370
+10363 6368
+10377 6366
+10391 6364
+10405 6363
+10419 6362
+10433 6361
+10446 6360
+10460 6359
+10474 6359
+10488 6359
+10502 6359
+10515 6359
+10529 6359
+10543 6360
+10557 6361
+10571 6362
+10585 6363
+10598 6364
+10612 6366
+10626 6368
+10640 6370
+10654 6372
+10668 6374
+10681 6376
+10695 6379
+10709 6382
+10723 6385
+10737 6388
+10750 6391
+10764 6394
+10778 6398
+10792 6402
+10806 6405
+10820 6409
+10833 6414
+10847 6418
+10861 6422
+10875 6427
+10889 6432
+10903 6437
+10916 6442
+10930 6447
+10944 6452
+10958 6457
+10972 6463
+10985 6468
+10999 6474
+11013 6480
+11027 6486
+11041 6492
+11055 6499
+11068 6505
+11082 6511
+11096 6518
+11110 6525
+11124 6531
+11138 6538
+11151 6545
+11165 6552
+11179 6560
+11193 6567
+11207 6574
+11220 6582
+11234 6589
+11248 6597
+11262 6605
+11276 6612
+11290 6620
+11303 6628
+11317 6636
+11331 6645
+11345 6653
+11359 6661
+11373 6669
+11386 6678
+11400 6686
+11414 6695
+11428 6703
+11442 6712
+11455 6721
+11469 6729
+11483 6738
+11497 6747
+11511 6756
+11525 6765
+11538 6774
+11552 6783
+11566 6792
+11580 6801
+11594 6810
+11608 6819
+11621 6828
+11635 6838
+11649 6847
+11663 6856
+11677 6865
+11690 6875
+11704 6884
+11718 6893
+11732 6903
+11746 6912
+11760 6922
+11773 6931
+11787 6940
+11801 6950
+11815 6959
+11829 6969
+11843 6978
+11856 6987
+11870 6997
+11884 7006
+11898 7016
+11912 7025
+11926 7034
+11939 7044
+11953 7053
+11967 7062
+11981 7072
+11995 7081
+12008 7090
+12022 7099
+12036 7108
+12050 7117
+12064 7127
+12078 7136
+12091 7145
+12105 7154
+12119 7163
+12133 7171
+12147 7180
+12161 7189
+12174 7198
+12188 7206
+12202 7215
+12216 7224
+12230 7232
+12243 7241
+12257 7249
+12271 7257
+12285 7266
+12299 7274
+12313 7282
+12326 7290
+12340 7298
+12354 7306
+12368 7314
+12382 7321
+12396 7329
+12409 7336
+12423 7344
+12437 7351
+12451 7359
+12465 7366
+12478 7373
+12492 7380
+12506 7387
+12520 7394
+12534 7400
+12548 7407
+12561 7414
+12575 7420
+12589 7427
+12603 7433
+12617 7439
+12631 7446
+12644 7452
+12658 7458
+12672 7464
+12686 7470
+12700 7476
+12713 7482
+12727 7488
+12741 7494
+12755 7499
+12769 7505
+12783 7511
+12796 7516
+12810 7522
+12824 7527
+12838 7533
+12852 7538
+12866 7544
+12879 7549
+12893 7555
+12907 7560
+12921 7565
+12935 7571
+12948 7576
+12962 7581
+12976 7586
+12990 7592
+13004 7597
+13018 7602
+13031 7607
+13045 7612
+13059 7618
+13073 7623
+13087 7628
+13101 7633
+13114 7638
+13128 7644
+13142 7649
+13156 7654
+13170 7659
+13183 7665
+13197 7670
+13211 7675
+13225 7680
+13239 7686
+13253 7691
+13266 7696
+13280 7702
+13294 7707
+13308 7713
+13322 7718
+13336 7724
+13349 7729
+13363 7735
+13377 7741
+13391 7746
+13405 7752
+13418 7758
+13432 7764
+13446 7770
+13460 7775
+13474 7781
+13488 7788
+13501 7794
+13515 7800
+13529 7806
+13543 7812
+13557 7819
+13571 7825
+13584 7832
+13598 7838
+13612 7845
+13626 7852
+13640 7858
+13654 7865
+13667 7872
+13681 7879
+13695 7887
+13709 7894
+13723 7901
+13736 7909
+13750 7916
+13764 7924
+13778 7931
+13792 7939
+13806 7947
+13819 7955
+13833 7963
+13847 7972
+13861 7980
+13875 7988
+13889 7997
+13902 8006
+13916 8015
+13930 8024
+13944 8033
+13958 8042
+13971 8051
+13985 8061
+13999 8070
+14013 8080
+14027 8090
+14041 8100
+14054 8110
+14068 8120
+14082 8131
+14096 8141
+14110 8152
+14124 8163
+14137 8174
+14151 8185
+14165 8196
+14179 8207
+14193 8219
+14206 8230
+14220 8242
+14234 8254
+14248 8265
+14262 8277
+14276 8290
+14289 8302
+14303 8314
+14317 8327
+14331 8339
+14345 8352
+14359 8365
+14372 8377
+14386 8390
+14400 8403
+14414 8416
+14428 8430
+14441 8443
+14455 8456
+14469 8470
+14483 8483
+14497 8497
+14511 8511
+14524 8524
+14538 8538
+14552 8552
+14566 8566
+14580 8580
+14594 8594
+14607 8608
+14621 8623
+14635 8637
+14649 8651
+14663 8666
+14676 8680
+14690 8695
+14704 8709
+14718 8724
+14732 8738
+14746 8753
+14759 8768
+14773 8782
+14787 8797
+14801 8812
+14815 8827
+14829 8842
+14842 8857
+14856 8872
+14870 8887
+14884 8902
+14898 8917
+14911 8932
+14925 8947
+14939 8962
+14953 8977
+14967 8992
+14981 9007
+14994 9022
+15008 9037
+15022 9052
+422 MLine
+End
+
+%%PageTrailer
+End %I eop
+showpage
+
+%%Trailer
+end
+%%EOF
diff --git a/gsl-1.9/doc/interpp2.eps b/gsl-1.9/doc/interpp2.eps
new file mode 100644
index 0000000..f153f0d
--- /dev/null
+++ b/gsl-1.9/doc/interpp2.eps
@@ -0,0 +1,2004 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: GNU libplot drawing library 4.1
+%%Title: PostScript plot
+%%CreationDate: Sat Dec 24 16:36:40 2005
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 1
+%%Pages: 1
+%%PageOrder: Ascend
+%%Orientation: Portrait
+%%BoundingBox: 92 197 497 580
+%%DocumentNeededResources: font Helvetica
+%%DocumentSuppliedResources: procset GNU_libplot 1.0 0
+%%EndComments
+
+%%BeginDefaults
+%%PageResources: font Helvetica
+%%EndDefaults
+
+%%BeginProlog
+%%EndProlog
+
+%%BeginSetup
+%%IncludeResource: font Helvetica
+/DrawDict 50 dict def
+DrawDict begin
+/ISOLatin1Encoding [
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright
+/parenleft/parenright/asterisk/plus/comma/minus/period/slash
+/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon
+/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N
+/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright
+/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m
+/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/dotlessi/grave/acute/circumflex/tilde/macron/breve
+/dotaccent/dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut
+/ogonek/caron/space/exclamdown/cent/sterling/currency/yen/brokenbar
+/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot
+/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior
+/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine
+/guillemotright/onequarter/onehalf/threequarters/questiondown
+/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla
+/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex
+/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis
+/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute
+/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis
+/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave
+/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex
+/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis
+/yacute/thorn/ydieresis
+] def
+/reencodeISO {
+dup dup findfont dup length dict begin
+{ 1 index /FID ne { def }{ pop pop } ifelse } forall
+/Encoding ISOLatin1Encoding def
+currentdict end definefont
+} def
+/Helvetica reencodeISO def
+%%BeginResource procset GNU_libplot 1.0 0
+/none null def
+/numGraphicParameters 17 def
+/stringLimit 65535 def
+/arrowHeight 8 def
+/eoFillRule true def
+
+/Begin { save numGraphicParameters dict begin } def
+/End { end restore } def
+
+/SetB {
+dup type /nulltype eq {
+pop
+false /brushRightArrow idef
+false /brushLeftArrow idef
+true /brushNone idef
+} {
+/brushDashOffset idef
+/brushDashArray idef
+0 ne /brushRightArrow idef
+0 ne /brushLeftArrow idef
+/brushWidth idef
+false /brushNone idef
+} ifelse
+} def
+
+/SetCFg {
+/fgblue idef
+/fggreen idef
+/fgred idef
+} def
+
+/SetCBg {
+/bgblue idef
+/bggreen idef
+/bgred idef
+} def
+
+/SetF {
+/printSize idef
+/printFont idef
+} def
+
+/SetP {
+dup type /nulltype eq {
+pop true /patternNone idef
+} {
+/patternGrayLevel idef
+patternGrayLevel -1 eq {
+/patternString idef
+} if
+false /patternNone idef
+} ifelse
+} def
+
+/BSpl {
+0 begin
+storexyn
+newpath
+n 1 gt {
+0 0 0 0 0 0 1 1 true subspline
+n 2 gt {
+0 0 0 0 1 1 2 2 false subspline
+1 1 n 3 sub {
+/i exch def
+i 1 sub dup i dup i 1 add dup i 2 add dup false subspline
+} for
+n 3 sub dup n 2 sub dup n 1 sub dup 2 copy false subspline
+} if
+n 2 sub dup n 1 sub dup 2 copy 2 copy false subspline
+patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if
+brushNone not { istroke } if
+0 0 1 1 leftarrow
+n 2 sub dup 1 sub dup rightarrow
+} if
+end
+} dup 0 4 dict put def
+
+/Circ {
+newpath
+0 360 arc
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+} def
+
+/CBSpl {
+0 begin
+dup 2 gt {
+storexyn
+newpath
+n 1 sub dup 0 0 1 1 2 2 true subspline
+1 1 n 3 sub {
+/i exch def
+i 1 sub dup i dup i 1 add dup i 2 add dup false subspline
+} for
+n 3 sub dup n 2 sub dup n 1 sub dup 0 0 false subspline
+n 2 sub dup n 1 sub dup 0 0 1 1 false subspline
+patternNone not { ifill } if
+brushNone not { istroke } if
+} {
+Poly
+} ifelse
+end
+} dup 0 4 dict put def
+
+/Elli {
+0 begin
+newpath
+4 2 roll
+translate
+scale
+0 0 1 0 360 arc
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+end
+} dup 0 1 dict put def
+
+/Line {
+0 begin
+2 storexyn
+newpath
+x 0 get y 0 get moveto
+x 1 get y 1 get lineto
+brushNone not { istroke } if
+0 0 1 1 leftarrow
+0 0 1 1 rightarrow
+end
+} dup 0 4 dict put def
+
+/MLine {
+0 begin
+storexyn
+newpath
+n 1 gt {
+x 0 get y 0 get moveto
+1 1 n 1 sub {
+/i exch def
+x i get y i get lineto
+} for
+patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if
+brushNone not { istroke } if
+0 0 1 1 leftarrow
+n 2 sub dup n 1 sub dup rightarrow
+} if
+end
+} dup 0 4 dict put def
+
+/Poly {
+3 1 roll
+newpath
+moveto
+-1 add
+{ lineto } repeat
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+} def
+
+/Rect {
+0 begin
+/t exch def
+/r exch def
+/b exch def
+/l exch def
+newpath
+l b moveto
+l t lineto
+r t lineto
+r b lineto
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+end
+} dup 0 4 dict put def
+
+/Text {
+ishow
+} def
+
+/idef {
+dup where { pop pop pop } { exch def } ifelse
+} def
+
+/ifill {
+0 begin
+gsave
+patternGrayLevel -1 ne {
+fgred bgred fgred sub patternGrayLevel mul add
+fggreen bggreen fggreen sub patternGrayLevel mul add
+fgblue bgblue fgblue sub patternGrayLevel mul add setrgbcolor
+eoFillRule { eofill } { fill } ifelse
+} {
+eoFillRule { eoclip } { clip } ifelse
+originalCTM setmatrix
+pathbbox /t exch def /r exch def /b exch def /l exch def
+/w r l sub ceiling cvi def
+/h t b sub ceiling cvi def
+/imageByteWidth w 8 div ceiling cvi def
+/imageHeight h def
+bgred bggreen bgblue setrgbcolor
+eoFillRule { eofill } { fill } ifelse
+fgred fggreen fgblue setrgbcolor
+w 0 gt h 0 gt and {
+l b translate w h scale
+w h true [w 0 0 h neg 0 h] { patternproc } imagemask
+} if
+} ifelse
+grestore
+end
+} dup 0 8 dict put def
+
+/istroke {
+gsave
+brushDashOffset -1 eq {
+[] 0 setdash
+1 setgray
+} {
+brushDashArray brushDashOffset setdash
+fgred fggreen fgblue setrgbcolor
+} ifelse
+brushWidth setlinewidth
+originalCTM setmatrix
+stroke
+grestore
+} def
+
+/ishow {
+0 begin
+gsave
+fgred fggreen fgblue setrgbcolor
+/fontDict printFont findfont printSize scalefont dup setfont def
+/descender fontDict begin 0 /FontBBox load 1 get FontMatrix end
+transform exch pop def
+/vertoffset 1 printSize sub descender sub def {
+0 vertoffset moveto show
+/vertoffset vertoffset printSize sub def
+} forall
+grestore
+end
+} dup 0 3 dict put def
+
+/patternproc {
+0 begin
+/patternByteLength patternString length def
+/patternHeight patternByteLength 8 mul sqrt cvi def
+/patternWidth patternHeight def
+/patternByteWidth patternWidth 8 idiv def
+/imageByteMaxLength imageByteWidth imageHeight mul
+stringLimit patternByteWidth sub min def
+/imageMaxHeight imageByteMaxLength imageByteWidth idiv patternHeight idiv
+patternHeight mul patternHeight max def
+/imageHeight imageHeight imageMaxHeight sub store
+/imageString imageByteWidth imageMaxHeight mul patternByteWidth add string def
+0 1 imageMaxHeight 1 sub {
+/y exch def
+/patternRow y patternByteWidth mul patternByteLength mod def
+/patternRowString patternString patternRow patternByteWidth getinterval def
+/imageRow y imageByteWidth mul def
+0 patternByteWidth imageByteWidth 1 sub {
+/x exch def
+imageString imageRow x add patternRowString putinterval
+} for
+} for
+imageString
+end
+} dup 0 12 dict put def
+
+/min {
+dup 3 2 roll dup 4 3 roll lt { exch } if pop
+} def
+
+/max {
+dup 3 2 roll dup 4 3 roll gt { exch } if pop
+} def
+
+/midpoint {
+0 begin
+/y1 exch def
+/x1 exch def
+/y0 exch def
+/x0 exch def
+x0 x1 add 2 div
+y0 y1 add 2 div
+end
+} dup 0 4 dict put def
+
+/thirdpoint {
+0 begin
+/y1 exch def
+/x1 exch def
+/y0 exch def
+/x0 exch def
+x0 2 mul x1 add 3 div
+y0 2 mul y1 add 3 div
+end
+} dup 0 4 dict put def
+
+/subspline {
+0 begin
+/movetoNeeded exch def
+y exch get /y3 exch def
+x exch get /x3 exch def
+y exch get /y2 exch def
+x exch get /x2 exch def
+y exch get /y1 exch def
+x exch get /x1 exch def
+y exch get /y0 exch def
+x exch get /x0 exch def
+x1 y1 x2 y2 thirdpoint
+/p1y exch def
+/p1x exch def
+x2 y2 x1 y1 thirdpoint
+/p2y exch def
+/p2x exch def
+x1 y1 x0 y0 thirdpoint
+p1x p1y midpoint
+/p0y exch def
+/p0x exch def
+x2 y2 x3 y3 thirdpoint
+p2x p2y midpoint
+/p3y exch def
+/p3x exch def
+movetoNeeded { p0x p0y moveto } if
+p1x p1y p2x p2y p3x p3y curveto
+end
+} dup 0 17 dict put def
+
+/storexyn {
+/n exch def
+/y n array def
+/x n array def
+n 1 sub -1 0 {
+/i exch def
+y i 3 2 roll put
+x i 3 2 roll put
+} for
+} def
+
+/arrowhead {
+0 begin
+transform originalCTM itransform
+/taily exch def
+/tailx exch def
+transform originalCTM itransform
+/tipy exch def
+/tipx exch def
+/dy tipy taily sub def
+/dx tipx tailx sub def
+/angle dx 0 ne dy 0 ne or { dy dx atan } { 90 } ifelse def
+gsave
+originalCTM setmatrix
+tipx tipy translate
+angle rotate
+newpath
+arrowHeight neg arrowWidth 2 div moveto
+0 0 lineto
+arrowHeight neg arrowWidth 2 div neg lineto
+patternNone not {
+originalCTM setmatrix
+/padtip arrowHeight 2 exp 0.25 arrowWidth 2 exp mul add sqrt brushWidth mul
+arrowWidth div def
+/padtail brushWidth 2 div def
+tipx tipy translate
+angle rotate
+padtip 0 translate
+arrowHeight padtip add padtail add arrowHeight div dup scale
+arrowheadpath
+ifill
+} if
+brushNone not {
+originalCTM setmatrix
+tipx tipy translate
+angle rotate
+arrowheadpath
+istroke
+} if
+grestore
+end
+} dup 0 9 dict put def
+
+/arrowheadpath {
+newpath
+arrowHeight neg arrowWidth 2 div moveto
+0 0 lineto
+arrowHeight neg arrowWidth 2 div neg lineto
+} def
+
+/leftarrow {
+0 begin
+y exch get /taily exch def
+x exch get /tailx exch def
+y exch get /tipy exch def
+x exch get /tipx exch def
+brushLeftArrow { tipx tipy tailx taily arrowhead } if
+end
+} dup 0 4 dict put def
+
+/rightarrow {
+0 begin
+y exch get /tipy exch def
+x exch get /tipx exch def
+y exch get /taily exch def
+x exch get /tailx exch def
+brushRightArrow { tipx tipy tailx taily arrowhead } if
+end
+} dup 0 4 dict put def
+%%EndResource
+%%EndSetup
+
+%%Page: 1 1
+%%PageResources: font Helvetica
+%%PageBoundingBox: 92 197 497 580
+%%BeginPageSetup
+%I Idraw 8
+
+Begin
+%I b u
+%I cfg u
+%I cbg u
+%I f u
+%I p u
+%I t
+[ 1 0 0 1 0 0 ] concat
+/originalCTM matrix currentmatrix def
+/trueoriginalCTM matrix currentmatrix def
+%%EndPageSetup
+
+Begin %I Rect
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+2304 2304 9216 9216 Rect
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 115.5459 214.1855 ] concat
+%I
+[
+(0.00)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 9216
+2304 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2304 2442
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 173.1459 214.1855 ] concat
+%I
+[
+(0.05)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3456 9216
+3456 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3456 2304
+3456 2442
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 230.7459 214.1855 ] concat
+%I
+[
+(0.10)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4608 9216
+4608 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4608 2304
+4608 2442
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 288.3459 214.1855 ] concat
+%I
+[
+(0.15)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5760 9216
+5760 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5760 2304
+5760 2442
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 345.9459 214.1855 ] concat
+%I
+[
+(0.20)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6912 9216
+6912 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6912 2304
+6912 2442
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 403.5459 214.1855 ] concat
+%I
+[
+(0.25)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8064 9216
+8064 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8064 2304
+8064 2442
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 461.1459 214.1855 ] concat
+%I
+[
+(0.30)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 9216
+9216 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2304
+9216 2442
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 92.19974 229.8568 ] concat
+%I
+[
+(-0.2)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2304
+9078 2304
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2442 2304
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 102.7958 298.9768 ] concat
+%I
+[
+(0.0)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 3686
+9078 3686
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3686
+2442 3686
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 102.7958 368.0968 ] concat
+%I
+[
+(0.2)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5069
+9078 5069
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5069
+2442 5069
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 102.7958 437.2168 ] concat
+%I
+[
+(0.4)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 6451
+9078 6451
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 6451
+2442 6451
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 102.7958 506.3368 ] concat
+%I
+[
+(0.6)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 7834
+9078 7834
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 7834
+2442 7834
+2 MLine
+End
+
+Begin %I Text
+%I cfg Black
+0 0 0 SetCFg
+%I f -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
+/Helvetica 18.144000 SetF
+%I t
+[ 1 0 0 1 102.7958 575.4568 ] concat
+%I
+[
+(0.8)
+] Text
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 9216
+9078 9216
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 9216
+2442 9216
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2304
+9161 2304
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2359 2304
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2995
+9161 2995
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2995
+2359 2995
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 3686
+9161 3686
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3686
+2359 3686
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4378
+9161 4378
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4378
+2359 4378
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5069
+9161 5069
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5069
+2359 5069
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5760
+9161 5760
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5760
+2359 5760
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 6451
+9161 6451
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 6451
+2359 6451
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 7142
+9161 7142
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 7142
+2359 7142
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 7834
+9161 7834
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 7834
+2359 7834
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 8525
+9161 8525
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 8525
+2359 8525
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 9216
+9161 9216
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 9216
+2359 9216
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 34952
+1 0 0 [ 1.48 4.43 ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3686
+9216 3686
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2239 4658
+2369 4788
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2369 4658
+2239 4788
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4543 8460
+4673 8590
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4673 8460
+4543 8590
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8460 2930
+8590 3060
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8590 2930
+8460 3060
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9151 4658
+9281 4788
+2 MLine
+End
+
+Begin %I MLine
+[0.324 0 0 0.324 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9281 4658
+9151 4788
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 101
+2304 4723
+2373 4920
+2442 5115
+2511 5308
+2580 5499
+2650 5687
+2719 5872
+2788 6054
+2857 6232
+2926 6406
+2995 6576
+3064 6741
+3133 6901
+3203 7056
+3272 7205
+3341 7348
+3410 7485
+3479 7616
+3548 7739
+3617 7855
+3686 7964
+3756 8065
+3825 8157
+3894 8241
+3963 8316
+4032 8381
+4101 8437
+4170 8484
+4239 8519
+4308 8545
+4378 8559
+4447 8563
+4516 8554
+4585 8534
+4654 8502
+4723 8458
+4792 8402
+4861 8335
+4931 8258
+5000 8171
+5069 8075
+5138 7970
+5207 7857
+5276 7736
+5345 7608
+5414 7473
+5484 7332
+5553 7185
+5622 7033
+5691 6876
+5760 6716
+5829 6552
+5898 6385
+5967 6215
+6036 6043
+6106 5870
+6175 5696
+6244 5522
+6313 5348
+6382 5174
+6451 5002
+6520 4831
+6589 4663
+6659 4497
+6728 4335
+6797 4177
+6866 4022
+6935 3873
+7004 3729
+7073 3591
+7142 3460
+7212 3335
+7281 3218
+7350 3109
+7419 3009
+7488 2918
+7557 2836
+7626 2764
+7695 2703
+7764 2654
+7834 2615
+7903 2590
+7972 2577
+8041 2577
+8110 2591
+8179 2619
+8248 2663
+8317 2721
+8387 2796
+8456 2887
+8525 2995
+8594 3120
+8663 3261
+8732 3416
+8801 3582
+8870 3758
+8940 3943
+9009 4133
+9078 4328
+9147 4525
+9216 4723
+101 MLine
+End
+
+%%PageTrailer
+End %I eop
+showpage
+
+%%Trailer
+end
+%%EOF
diff --git a/gsl-1.9/doc/intro.texi b/gsl-1.9/doc/intro.texi
new file mode 100644
index 0000000..dca7be9
--- /dev/null
+++ b/gsl-1.9/doc/intro.texi
@@ -0,0 +1,247 @@
+@cindex license of GSL
+@cindex GNU General Public License
+The GNU Scientific Library (GSL) is a collection of routines for
+numerical computing. The routines have been written from scratch in C,
+and present a modern Applications Programming Interface
+(API) for C programmers, allowing wrappers to be written for very
+high level languages. The source code is distributed under the GNU
+General Public License.
+
+
+@menu
+* Routines available in GSL::
+* GSL is Free Software::
+* Obtaining GSL::
+* No Warranty::
+* Reporting Bugs::
+* Further Information::
+* Conventions used in this manual::
+@end menu
+
+@node Routines available in GSL
+@section Routines available in GSL
+
+The library covers a wide range of topics in numerical computing.
+Routines are available for the following areas,
+
+@iftex
+@sp 1
+@end iftex
+@multitable @columnfractions 0.05 0.45 0.45 0.05
+@item @tab Complex Numbers @tab Roots of Polynomials
+@item @tab Special Functions @tab Vectors and Matrices
+@item @tab Permutations @tab Combinations
+@item @tab Sorting @tab BLAS Support
+@item @tab Linear Algebra @tab CBLAS Library
+@item @tab Fast Fourier Transforms @tab Eigensystems
+@item @tab Random Numbers @tab Quadrature
+@item @tab Random Distributions @tab Quasi-Random Sequences
+@item @tab Histograms @tab Statistics
+@item @tab Monte Carlo Integration @tab N-Tuples
+@item @tab Differential Equations @tab Simulated Annealing
+@item @tab Numerical Differentiation @tab Interpolation
+@item @tab Series Acceleration @tab Chebyshev Approximations
+@item @tab Root-Finding @tab Discrete Hankel Transforms
+@item @tab Least-Squares Fitting @tab Minimization
+@item @tab IEEE Floating-Point @tab Physical Constants
+@item @tab Wavelets
+@end multitable
+@iftex
+@sp 1
+@end iftex
+
+@noindent
+The use of these routines is described in this manual. Each chapter
+provides detailed definitions of the functions, followed by example
+programs and references to the articles on which the algorithms are
+based.
+
+Where possible the routines have been based on reliable public-domain
+packages such as FFTPACK and QUADPACK, which the developers of GSL
+have reimplemented in C with modern coding conventions.
+
+@node GSL is Free Software
+@section GSL is Free Software
+@cindex free software, explanation of
+The subroutines in the GNU Scientific Library are ``free software'';
+this means that everyone is free to use them, and to redistribute them
+in other free programs. The library is not in the public domain; it is
+copyrighted and there are conditions on its distribution. These
+conditions are designed to permit everything that a good cooperating
+citizen would want to do. What is not allowed is to try to prevent
+others from further sharing any version of the software that they might
+get from you.
+
+Specifically, we want to make sure that you have the right to share
+copies of programs that you are given which use the GNU Scientific
+Library, that you receive their source code or else can get it if you
+want it, that you can change these programs or use pieces of them in new
+free programs, and that you know you can do these things.
+
+To make sure that everyone has such rights, we have to forbid you to
+deprive anyone else of these rights. For example, if you distribute
+copies of any code which uses the GNU Scientific Library, you must give
+the recipients all the rights that you have received. You must make
+sure that they, too, receive or can get the source code, both to the
+library and the code which uses it. And you must tell them their
+rights. This means that the library should not be redistributed in
+proprietary programs.
+
+Also, for our own protection, we must make certain that everyone finds
+out that there is no warranty for the GNU Scientific Library. If these
+programs are modified by someone else and passed on, we want their
+recipients to know that what they have is not what we distributed, so
+that any problems introduced by others will not reflect on our
+reputation.
+
+The precise conditions for the distribution of software related to the
+GNU Scientific Library are found in the GNU General Public License
+(@pxref{GNU General Public License}). Further information about this
+license is available from the GNU Project webpage @cite{Frequently Asked
+Questions about the GNU GPL},
+
+@itemize @asis
+@item
+@uref{http://www.gnu.org/copyleft/gpl-faq.html}
+@end itemize
+
+@noindent
+The Free Software Foundation also operates a license consulting
+service for commercial users (contact details available from
+@uref{http://www.fsf.org/}).
+
+@node Obtaining GSL
+@section Obtaining GSL
+@cindex obtaining GSL
+@cindex downloading GSL
+@cindex mailing list for GSL announcements
+@cindex info-gsl mailing list
+The source code for the library can be obtained in different ways, by
+copying it from a friend, purchasing it on @sc{cdrom} or downloading it
+from the internet. A list of public ftp servers which carry the source
+code can be found on the GNU website,
+
+@itemize @asis
+@item
+@uref{http://www.gnu.org/software/gsl/}
+@end itemize
+
+@noindent
+The preferred platform for the library is a GNU system, which allows it
+to take advantage of additional features in the GNU C compiler and GNU C
+library. However, the library is fully portable and should compile on
+most systems with a C compiler. Precompiled versions of the library can be purchased from
+commercial redistributors listed on the website above.
+
+Announcements of new releases, updates and other relevant events are
+made on the @code{info-gsl@@gnu.org} mailing list. To subscribe to this
+low-volume list, send an email of the following form:
+
+@example
+To: info-gsl-request@@gnu.org
+Subject: subscribe
+@end example
+
+@noindent
+You will receive a response asking you to reply in order to confirm
+your subscription.
+
+@node No Warranty
+@section No Warranty
+@cindex warranty (none)
+The software described in this manual has no warranty, it is provided
+``as is''. It is your responsibility to validate the behavior of the
+routines and their accuracy using the source code provided, or to
+purchase support and warranties from commercial redistributors. Consult
+the GNU General Public license for further details (@pxref{GNU General
+Public License}).
+
+@node Reporting Bugs
+@section Reporting Bugs
+@cindex reporting bugs in GSL
+@cindex bugs, how to report
+@cindex bug-gsl mailing list
+@cindex mailing list, bug-gsl
+A list of known bugs can be found in the @file{BUGS} file included in
+the GSL distribution. Details of compilation problems can be found in
+the @file{INSTALL} file.
+
+If you find a bug which is not listed in these files, please report it to
+@email{bug-gsl@@gnu.org}.
+
+All bug reports should include:
+
+@itemize @bullet
+@item
+The version number of GSL
+@item
+The hardware and operating system
+@item
+The compiler used, including version number and compilation options
+@item
+A description of the bug behavior
+@item
+A short program which exercises the bug
+@end itemize
+
+@noindent
+It is useful if you can check whether the same problem occurs when the
+library is compiled without optimization. Thank you.
+
+Any errors or omissions in this manual can also be reported to the
+same address.
+
+@node Further Information
+@section Further Information
+@cindex mailing list archives
+@cindex website, developer information
+@cindex contacting the GSL developers
+Additional information, including online copies of this manual, links to
+related projects, and mailing list archives are available from the
+website mentioned above.
+
+Any questions about the use and installation of the library can be asked
+on the mailing list @code{help-gsl@@gnu.org}. To subscribe to this
+list, send an email of the following form:
+
+@example
+To: help-gsl-request@@gnu.org
+Subject: subscribe
+@end example
+
+@noindent
+This mailing list can be used to ask questions not covered by this
+manual, and to contact the developers of the library.
+
+If you would like to refer to the GNU Scientific Library in a journal
+article, the recommended way is to cite this reference manual,
+e.g. @cite{M. Galassi et al, GNU Scientific Library Reference Manual (2nd
+Ed.), ISBN 0954161734}.
+
+If you want to give a url, use ``@uref{http://www.gnu.org/software/gsl/}''.
+
+@node Conventions used in this manual
+@section Conventions used in this manual
+@cindex conventions, used in manual
+@cindex examples, conventions used in
+@cindex shell prompt
+@cindex @code{$}, shell prompt
+This manual contains many examples which can be typed at the keyboard.
+A command entered at the terminal is shown like this,
+
+@example
+$ @i{command}
+@end example
+
+@noindent
+@cindex dollar sign @code{$}, shell prompt
+The first character on the line is the terminal prompt, and should not
+be typed. The dollar sign @samp{$} is used as the standard prompt in
+this manual, although some systems may use a different character.
+
+The examples assume the use of the GNU operating system. There may be
+minor differences in the output on other systems. The commands for
+setting environment variables use the Bourne shell syntax of the
+standard GNU shell (@code{bash}).
+
+
diff --git a/gsl-1.9/doc/landau.dat b/gsl-1.9/doc/landau.dat
new file mode 100644
index 0000000..0c7d337
--- /dev/null
+++ b/gsl-1.9/doc/landau.dat
@@ -0,0 +1,201 @@
+-5.0000000e+00 5.7299683e-24
+-4.9000000e+00 9.8386598e-22
+-4.8000000e+00 1.0303677e-19
+-4.7000000e+00 6.8985179e-18
+-4.6000000e+00 3.0811780e-16
+-4.5000000e+00 9.5412629e-15
+-4.4000000e+00 2.1211024e-13
+-4.3000000e+00 3.4936723e-12
+-4.2000000e+00 4.3869439e-11
+-4.1000000e+00 4.3093980e-10
+-4.0000000e+00 3.3899539e-09
+-3.9000000e+00 2.1811027e-08
+-3.8000000e+00 1.1699636e-07
+-3.7000000e+00 5.3235423e-07
+-3.6000000e+00 2.0872004e-06
+-3.5000000e+00 7.1518499e-06
+-3.4000000e+00 2.1693693e-05
+-3.3000000e+00 5.8931800e-05
+-3.2000000e+00 1.4488646e-04
+-3.1000000e+00 3.2545783e-04
+-3.0000000e+00 6.7372862e-04
+-2.9000000e+00 1.2953225e-03
+-2.8000000e+00 2.3293325e-03
+-2.7000000e+00 3.9428747e-03
+-2.6000000e+00 6.3186831e-03
+-2.5000000e+00 9.6369248e-03
+-2.4000000e+00 1.4053985e-02
+-2.3000000e+00 1.9681837e-02
+-2.2000000e+00 2.6571531e-02
+-2.1000000e+00 3.4703439e-02
+-2.0000000e+00 4.3985478e-02
+-1.9000000e+00 5.4259062e-02
+-1.8000000e+00 6.5311333e-02
+-1.7000000e+00 7.6891507e-02
+-1.6000000e+00 8.8728939e-02
+-1.5000000e+00 1.0055075e-01
+-1.4000000e+00 1.1209734e-01
+-1.3000000e+00 1.2313470e-01
+-1.2000000e+00 1.3346307e-01
+-1.1000000e+00 1.4292196e-01
+-1.0000000e+00 1.5139191e-01
+-9.0000000e-01 1.5879352e-01
+-8.0000000e-01 1.6508452e-01
+-7.0000000e-01 1.7025552e-01
+-6.0000000e-01 1.7432489e-01
+-5.0000000e-01 1.7733355e-01
+-4.0000000e-01 1.7933968e-01
+-3.0000000e-01 1.8041398e-01
+-2.0000000e-01 1.8063532e-01
+-1.0000000e-01 1.8008710e-01
+-1.0269563e-15 1.7885416e-01
+1.0000000e-01 1.7702044e-01
+2.0000000e-01 1.7466703e-01
+3.0000000e-01 1.7187090e-01
+4.0000000e-01 1.6870392e-01
+5.0000000e-01 1.6523228e-01
+6.0000000e-01 1.6151625e-01
+7.0000000e-01 1.5761010e-01
+8.0000000e-01 1.5356220e-01
+9.0000000e-01 1.4941526e-01
+1.0000000e-00 1.4520664e-01
+1.1000000e+00 1.4096874e-01
+1.2000000e+00 1.3672939e-01
+1.3000000e+00 1.3251227e-01
+1.4000000e+00 1.2833731e-01
+1.5000000e+00 1.2422109e-01
+1.6000000e+00 1.2017724e-01
+1.7000000e+00 1.1621676e-01
+1.8000000e+00 1.1234837e-01
+1.9000000e+00 1.0857877e-01
+2.0000000e+00 1.0491299e-01
+2.1000000e+00 1.0135454e-01
+2.2000000e+00 9.7905675e-02
+2.3000000e+00 9.4567597e-02
+2.4000000e+00 9.1340593e-02
+2.5000000e+00 8.8224201e-02
+2.6000000e+00 8.5217338e-02
+2.7000000e+00 8.2318412e-02
+2.8000000e+00 7.9525419e-02
+2.9000000e+00 7.6836028e-02
+3.0000000e+00 7.4247655e-02
+3.1000000e+00 7.1757520e-02
+3.2000000e+00 6.9362706e-02
+3.3000000e+00 6.7060199e-02
+3.4000000e+00 6.4846927e-02
+3.5000000e+00 6.2719789e-02
+3.6000000e+00 6.0675685e-02
+3.7000000e+00 5.8711536e-02
+3.8000000e+00 5.6824298e-02
+3.9000000e+00 5.5010981e-02
+4.0000000e+00 5.3268657e-02
+4.1000000e+00 5.1594472e-02
+4.2000000e+00 4.9985647e-02
+4.3000000e+00 4.8439490e-02
+4.4000000e+00 4.6953393e-02
+4.5000000e+00 4.5524840e-02
+4.6000000e+00 4.4151403e-02
+4.7000000e+00 4.2830744e-02
+4.8000000e+00 4.1560618e-02
+4.9000000e+00 4.0338866e-02
+5.0000000e+00 3.9163420e-02
+5.1000000e+00 3.8032293e-02
+5.2000000e+00 3.6943588e-02
+5.3000000e+00 3.5895483e-02
+5.4000000e+00 3.4886240e-02
+5.5000000e+00 3.3914195e-02
+5.6000000e+00 3.2977757e-02
+5.7000000e+00 3.2075409e-02
+5.8000000e+00 3.1205698e-02
+5.9000000e+00 3.0367240e-02
+6.0000000e+00 2.9558712e-02
+6.1000000e+00 2.8778853e-02
+6.2000000e+00 2.8026456e-02
+6.3000000e+00 2.7300373e-02
+6.4000000e+00 2.6599507e-02
+6.5000000e+00 2.5922811e-02
+6.6000000e+00 2.5269286e-02
+6.7000000e+00 2.4637980e-02
+6.8000000e+00 2.4027982e-02
+6.9000000e+00 2.3438424e-02
+7.0000000e+00 2.2868480e-02
+7.1000000e+00 2.2317357e-02
+7.2000000e+00 2.1784301e-02
+7.3000000e+00 2.1268592e-02
+7.4000000e+00 2.0769543e-02
+7.5000000e+00 2.0286495e-02
+7.6000000e+00 1.9818822e-02
+7.7000000e+00 1.9365924e-02
+7.8000000e+00 1.8927229e-02
+7.9000000e+00 1.8502190e-02
+8.0000000e+00 1.8090284e-02
+8.1000000e+00 1.7691010e-02
+8.2000000e+00 1.7303892e-02
+8.3000000e+00 1.6928471e-02
+8.4000000e+00 1.6564312e-02
+8.5000000e+00 1.6210995e-02
+8.6000000e+00 1.5868120e-02
+8.7000000e+00 1.5535304e-02
+8.8000000e+00 1.5212181e-02
+8.9000000e+00 1.4898400e-02
+9.0000000e+00 1.4593624e-02
+9.1000000e+00 1.4297531e-02
+9.2000000e+00 1.4009812e-02
+9.3000000e+00 1.3730172e-02
+9.4000000e+00 1.3458328e-02
+9.5000000e+00 1.3194007e-02
+9.6000000e+00 1.2936948e-02
+9.7000000e+00 1.2686902e-02
+9.8000000e+00 1.2443629e-02
+9.9000000e+00 1.2206897e-02
+1.0000000e+01 1.1976487e-02
+1.0100000e+01 1.1752186e-02
+1.0200000e+01 1.1533791e-02
+1.0300000e+01 1.1321105e-02
+1.0400000e+01 1.1113940e-02
+1.0500000e+01 1.0912115e-02
+1.0600000e+01 1.0715458e-02
+1.0700000e+01 1.0523801e-02
+1.0800000e+01 1.0336983e-02
+1.0900000e+01 1.0154849e-02
+1.1000000e+01 9.9772519e-03
+1.1100000e+01 9.8040478e-03
+1.1200000e+01 9.6350992e-03
+1.1300000e+01 9.4702736e-03
+1.1400000e+01 9.3094433e-03
+1.1500000e+01 9.1524856e-03
+1.1600000e+01 8.9992820e-03
+1.1700000e+01 8.8497185e-03
+1.1800000e+01 8.7036852e-03
+1.1900000e+01 8.5610761e-03
+1.2000000e+01 8.4217891e-03
+1.2100000e+01 8.2857256e-03
+1.2200000e+01 8.1527907e-03
+1.2300000e+01 8.0228928e-03
+1.2400000e+01 7.8959433e-03
+1.2500000e+01 7.7718570e-03
+1.2600000e+01 7.6505515e-03
+1.2700000e+01 7.5319472e-03
+1.2800000e+01 7.4159673e-03
+1.2900000e+01 7.3025377e-03
+1.3000000e+01 7.1915866e-03
+1.3100000e+01 7.0830449e-03
+1.3200000e+01 6.9768457e-03
+1.3300000e+01 6.8729241e-03
+1.3400000e+01 6.7712178e-03
+1.3500000e+01 6.6716662e-03
+1.3600000e+01 6.5742109e-03
+1.3700000e+01 6.4787954e-03
+1.3800000e+01 6.3853647e-03
+1.3900000e+01 6.2938662e-03
+1.4000000e+01 6.2042484e-03
+1.4100000e+01 6.1164618e-03
+1.4200000e+01 6.0304583e-03
+1.4300000e+01 5.9461914e-03
+1.4400000e+01 5.8636161e-03
+1.4500000e+01 5.7826888e-03
+1.4600000e+01 5.7033672e-03
+1.4700000e+01 5.6256103e-03
+1.4800000e+01 5.5493784e-03
+1.4900000e+01 5.4746330e-03
+1.5000000e+01 5.4013369e-03
diff --git a/gsl-1.9/doc/linalg.texi b/gsl-1.9/doc/linalg.texi
new file mode 100644
index 0000000..839f4d5
--- /dev/null
+++ b/gsl-1.9/doc/linalg.texi
@@ -0,0 +1,1117 @@
+@cindex linear algebra
+@cindex solution of linear systems, Ax=b
+@cindex matrix factorization
+@cindex factorization of matrices
+
+This chapter describes functions for solving linear systems. The
+library provides linear algebra operations which operate directly on
+the @code{gsl_vector} and @code{gsl_matrix} objects. These routines
+use the standard algorithms from Golub & Van Loan's @cite{Matrix
+Computations}.
+
+@cindex LAPACK, recommended for linear algebra
+When dealing with very large systems the routines found in @sc{lapack}
+should be considered. These support specialized data representations
+and other optimizations.
+
+The functions described in this chapter are declared in the header file
+@file{gsl_linalg.h}.
+
+
+@menu
+* LU Decomposition::
+* QR Decomposition::
+* QR Decomposition with Column Pivoting::
+* Singular Value Decomposition::
+* Cholesky Decomposition::
+* Tridiagonal Decomposition of Real Symmetric Matrices::
+* Tridiagonal Decomposition of Hermitian Matrices::
+* Hessenberg Decomposition of Real Matrices::
+* Bidiagonalization::
+* Householder Transformations::
+* Householder solver for linear systems::
+* Tridiagonal Systems::
+* Balancing::
+* Linear Algebra Examples::
+* Linear Algebra References and Further Reading::
+@end menu
+
+@node LU Decomposition
+@section LU Decomposition
+@cindex LU decomposition
+
+A general square matrix @math{A} has an @math{LU} decomposition into
+upper and lower triangular matrices,
+@tex
+\beforedisplay
+$$
+P A = L U
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+P A = L U
+@end example
+
+@end ifinfo
+@noindent
+where @math{P} is a permutation matrix, @math{L} is unit lower
+triangular matrix and @math{U} is upper triangular matrix. For square
+matrices this decomposition can be used to convert the linear system
+@math{A x = b} into a pair of triangular systems (@math{L y = P b},
+@math{U x = y}), which can be solved by forward and back-substitution.
+Note that the @math{LU} decomposition is valid for singular matrices.
+
+@deftypefun int gsl_linalg_LU_decomp (gsl_matrix * @var{A}, gsl_permutation * @var{p}, int * @var{signum})
+@deftypefunx int gsl_linalg_complex_LU_decomp (gsl_matrix_complex * @var{A}, gsl_permutation * @var{p}, int * @var{signum})
+These functions factorize the square matrix @var{A} into the @math{LU}
+decomposition @math{PA = LU}. On output the diagonal and upper
+triangular part of the input matrix @var{A} contain the matrix
+@math{U}. The lower triangular part of the input matrix (excluding the
+diagonal) contains @math{L}. The diagonal elements of @math{L} are
+unity, and are not stored.
+
+The permutation matrix @math{P} is encoded in the permutation
+@var{p}. The @math{j}-th column of the matrix @math{P} is given by the
+@math{k}-th column of the identity matrix, where @math{k = p_j} the
+@math{j}-th element of the permutation vector. The sign of the
+permutation is given by @var{signum}. It has the value @math{(-1)^n},
+where @math{n} is the number of interchanges in the permutation.
+
+The algorithm used in the decomposition is Gaussian Elimination with
+partial pivoting (Golub & Van Loan, @cite{Matrix Computations},
+Algorithm 3.4.1).
+@end deftypefun
+
+@cindex linear systems, solution of
+@deftypefun int gsl_linalg_LU_solve (const gsl_matrix * @var{LU}, const gsl_permutation * @var{p}, const gsl_vector * @var{b}, gsl_vector * @var{x})
+@deftypefunx int gsl_linalg_complex_LU_solve (const gsl_matrix_complex * @var{LU}, const gsl_permutation * @var{p}, const gsl_vector_complex * @var{b}, gsl_vector_complex * @var{x})
+These functions solve the square system @math{A x = b} using the @math{LU}
+decomposition of @math{A} into (@var{LU}, @var{p}) given by
+@code{gsl_linalg_LU_decomp} or @code{gsl_linalg_complex_LU_decomp}.
+@end deftypefun
+
+@deftypefun int gsl_linalg_LU_svx (const gsl_matrix * @var{LU}, const gsl_permutation * @var{p}, gsl_vector * @var{x})
+@deftypefunx int gsl_linalg_complex_LU_svx (const gsl_matrix_complex * @var{LU}, const gsl_permutation * @var{p}, gsl_vector_complex * @var{x})
+These functions solve the square system @math{A x = b} in-place using the
+@math{LU} decomposition of @math{A} into (@var{LU},@var{p}). On input
+@var{x} should contain the right-hand side @math{b}, which is replaced
+by the solution on output.
+@end deftypefun
+
+@cindex refinement of solutions in linear systems
+@cindex iterative refinement of solutions in linear systems
+@cindex linear systems, refinement of solutions
+@deftypefun int gsl_linalg_LU_refine (const gsl_matrix * @var{A}, const gsl_matrix * @var{LU}, const gsl_permutation * @var{p}, const gsl_vector * @var{b}, gsl_vector * @var{x}, gsl_vector * @var{residual})
+@deftypefunx int gsl_linalg_complex_LU_refine (const gsl_matrix_complex * @var{A}, const gsl_matrix_complex * @var{LU}, const gsl_permutation * @var{p}, const gsl_vector_complex * @var{b}, gsl_vector_complex * @var{x}, gsl_vector_complex * @var{residual})
+These functions apply an iterative improvement to @var{x}, the solution
+of @math{A x = b}, using the @math{LU} decomposition of @math{A} into
+(@var{LU},@var{p}). The initial residual @math{r = A x - b} is also
+computed and stored in @var{residual}.
+@end deftypefun
+
+@cindex inverse of a matrix, by LU decomposition
+@cindex matrix inverse
+@deftypefun int gsl_linalg_LU_invert (const gsl_matrix * @var{LU}, const gsl_permutation * @var{p}, gsl_matrix * @var{inverse})
+@deftypefunx int gsl_linalg_complex_LU_invert (const gsl_matrix_complex * @var{LU}, const gsl_permutation * @var{p}, gsl_matrix_complex * @var{inverse})
+These functions compute the inverse of a matrix @math{A} from its
+@math{LU} decomposition (@var{LU},@var{p}), storing the result in the
+matrix @var{inverse}. The inverse is computed by solving the system
+@math{A x = b} for each column of the identity matrix. It is preferable
+to avoid direct use of the inverse whenever possible, as the linear
+solver functions can obtain the same result more efficiently and
+reliably (consult any introductory textbook on numerical linear algebra
+for details).
+@end deftypefun
+
+@cindex determinant of a matrix, by LU decomposition
+@cindex matrix determinant
+@deftypefun double gsl_linalg_LU_det (gsl_matrix * @var{LU}, int @var{signum})
+@deftypefunx gsl_complex gsl_linalg_complex_LU_det (gsl_matrix_complex * @var{LU}, int @var{signum})
+These functions compute the determinant of a matrix @math{A} from its
+@math{LU} decomposition, @var{LU}. The determinant is computed as the
+product of the diagonal elements of @math{U} and the sign of the row
+permutation @var{signum}.
+@end deftypefun
+
+@cindex logarithm of the determinant of a matrix
+@deftypefun double gsl_linalg_LU_lndet (gsl_matrix * @var{LU})
+@deftypefunx double gsl_linalg_complex_LU_lndet (gsl_matrix_complex * @var{LU})
+These functions compute the logarithm of the absolute value of the
+determinant of a matrix @math{A}, @math{\ln|\det(A)|}, from its @math{LU}
+decomposition, @var{LU}. This function may be useful if the direct
+computation of the determinant would overflow or underflow.
+@end deftypefun
+
+@cindex sign of the determinant of a matrix
+@deftypefun int gsl_linalg_LU_sgndet (gsl_matrix * @var{LU}, int @var{signum})
+@deftypefunx gsl_complex gsl_linalg_complex_LU_sgndet (gsl_matrix_complex * @var{LU}, int @var{signum})
+These functions compute the sign or phase factor of the determinant of a
+matrix @math{A}, @math{\det(A)/|\det(A)|}, from its @math{LU} decomposition,
+@var{LU}.
+@end deftypefun
+
+@node QR Decomposition
+@section QR Decomposition
+@cindex QR decomposition
+
+A general rectangular @math{M}-by-@math{N} matrix @math{A} has a
+@math{QR} decomposition into the product of an orthogonal
+@math{M}-by-@math{M} square matrix @math{Q} (where @math{Q^T Q = I}) and
+an @math{M}-by-@math{N} right-triangular matrix @math{R},
+@tex
+\beforedisplay
+$$
+A = Q R
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+A = Q R
+@end example
+
+@end ifinfo
+@noindent
+This decomposition can be used to convert the linear system @math{A x =
+b} into the triangular system @math{R x = Q^T b}, which can be solved by
+back-substitution. Another use of the @math{QR} decomposition is to
+compute an orthonormal basis for a set of vectors. The first @math{N}
+columns of @math{Q} form an orthonormal basis for the range of @math{A},
+@math{ran(A)}, when @math{A} has full column rank.
+
+@deftypefun int gsl_linalg_QR_decomp (gsl_matrix * @var{A}, gsl_vector * @var{tau})
+This function factorizes the @math{M}-by-@math{N} matrix @var{A} into
+the @math{QR} decomposition @math{A = Q R}. On output the diagonal and
+upper triangular part of the input matrix contain the matrix
+@math{R}. The vector @var{tau} and the columns of the lower triangular
+part of the matrix @var{A} contain the Householder coefficients and
+Householder vectors which encode the orthogonal matrix @var{Q}. The
+vector @var{tau} must be of length @math{k=\min(M,N)}. The matrix
+@math{Q} is related to these components by, @math{Q = Q_k ... Q_2 Q_1}
+where @math{Q_i = I - \tau_i v_i v_i^T} and @math{v_i} is the
+Householder vector @math{v_i =
+(0,...,1,A(i+1,i),A(i+2,i),...,A(m,i))}. This is the same storage scheme
+as used by @sc{lapack}.
+
+The algorithm used to perform the decomposition is Householder QR (Golub
+& Van Loan, @cite{Matrix Computations}, Algorithm 5.2.1).
+@end deftypefun
+
+@deftypefun int gsl_linalg_QR_solve (const gsl_matrix * @var{QR}, const gsl_vector * @var{tau}, const gsl_vector * @var{b}, gsl_vector * @var{x})
+This function solves the square system @math{A x = b} using the @math{QR}
+decomposition of @math{A} into (@var{QR}, @var{tau}) given by
+@code{gsl_linalg_QR_decomp}. The least-squares solution for rectangular systems can
+be found using @code{gsl_linalg_QR_lssolve}.
+@end deftypefun
+
+@deftypefun int gsl_linalg_QR_svx (const gsl_matrix * @var{QR}, const gsl_vector * @var{tau}, gsl_vector * @var{x})
+This function solves the square system @math{A x = b} in-place using the
+@math{QR} decomposition of @math{A} into (@var{QR},@var{tau}) given by
+@code{gsl_linalg_QR_decomp}. On input @var{x} should contain the
+right-hand side @math{b}, which is replaced by the solution on output.
+@end deftypefun
+
+@deftypefun int gsl_linalg_QR_lssolve (const gsl_matrix * @var{QR}, const gsl_vector * @var{tau}, const gsl_vector * @var{b}, gsl_vector * @var{x}, gsl_vector * @var{residual})
+This function finds the least squares solution to the overdetermined
+system @math{A x = b} where the matrix @var{A} has more rows than
+columns. The least squares solution minimizes the Euclidean norm of the
+residual, @math{||Ax - b||}.The routine uses the @math{QR} decomposition
+of @math{A} into (@var{QR}, @var{tau}) given by
+@code{gsl_linalg_QR_decomp}. The solution is returned in @var{x}. The
+residual is computed as a by-product and stored in @var{residual}.
+@end deftypefun
+
+@deftypefun int gsl_linalg_QR_QTvec (const gsl_matrix * @var{QR}, const gsl_vector * @var{tau}, gsl_vector * @var{v})
+This function applies the matrix @math{Q^T} encoded in the decomposition
+(@var{QR},@var{tau}) to the vector @var{v}, storing the result @math{Q^T
+v} in @var{v}. The matrix multiplication is carried out directly using
+the encoding of the Householder vectors without needing to form the full
+matrix @math{Q^T}.
+@end deftypefun
+
+@deftypefun int gsl_linalg_QR_Qvec (const gsl_matrix * @var{QR}, const gsl_vector * @var{tau}, gsl_vector * @var{v})
+This function applies the matrix @math{Q} encoded in the decomposition
+(@var{QR},@var{tau}) to the vector @var{v}, storing the result @math{Q
+v} in @var{v}. The matrix multiplication is carried out directly using
+the encoding of the Householder vectors without needing to form the full
+matrix @math{Q}.
+@end deftypefun
+
+@deftypefun int gsl_linalg_QR_Rsolve (const gsl_matrix * @var{QR}, const gsl_vector * @var{b}, gsl_vector * @var{x})
+This function solves the triangular system @math{R x = b} for
+@var{x}. It may be useful if the product @math{b' = Q^T b} has already
+been computed using @code{gsl_linalg_QR_QTvec}.
+@end deftypefun
+
+@deftypefun int gsl_linalg_QR_Rsvx (const gsl_matrix * @var{QR}, gsl_vector * @var{x})
+This function solves the triangular system @math{R x = b} for @var{x}
+in-place. On input @var{x} should contain the right-hand side @math{b}
+and is replaced by the solution on output. This function may be useful if
+the product @math{b' = Q^T b} has already been computed using
+@code{gsl_linalg_QR_QTvec}.
+@end deftypefun
+
+@deftypefun int gsl_linalg_QR_unpack (const gsl_matrix * @var{QR}, const gsl_vector * @var{tau}, gsl_matrix * @var{Q}, gsl_matrix * @var{R})
+This function unpacks the encoded @math{QR} decomposition
+(@var{QR},@var{tau}) into the matrices @var{Q} and @var{R}, where
+@var{Q} is @math{M}-by-@math{M} and @var{R} is @math{M}-by-@math{N}.
+@end deftypefun
+
+@deftypefun int gsl_linalg_QR_QRsolve (gsl_matrix * @var{Q}, gsl_matrix * @var{R}, const gsl_vector * @var{b}, gsl_vector * @var{x})
+This function solves the system @math{R x = Q^T b} for @var{x}. It can
+be used when the @math{QR} decomposition of a matrix is available in
+unpacked form as (@var{Q}, @var{R}).
+@end deftypefun
+
+@deftypefun int gsl_linalg_QR_update (gsl_matrix * @var{Q}, gsl_matrix * @var{R}, gsl_vector * @var{w}, const gsl_vector * @var{v})
+This function performs a rank-1 update @math{w v^T} of the @math{QR}
+decomposition (@var{Q}, @var{R}). The update is given by @math{Q'R' = Q
+R + w v^T} where the output matrices @math{Q'} and @math{R'} are also
+orthogonal and right triangular. Note that @var{w} is destroyed by the
+update.
+@end deftypefun
+
+@deftypefun int gsl_linalg_R_solve (const gsl_matrix * @var{R}, const gsl_vector * @var{b}, gsl_vector * @var{x})
+This function solves the triangular system @math{R x = b} for the
+@math{N}-by-@math{N} matrix @var{R}.
+@end deftypefun
+
+@deftypefun int gsl_linalg_R_svx (const gsl_matrix * @var{R}, gsl_vector * @var{x})
+This function solves the triangular system @math{R x = b} in-place. On
+input @var{x} should contain the right-hand side @math{b}, which is
+replaced by the solution on output.
+@end deftypefun
+
+@node QR Decomposition with Column Pivoting
+@section QR Decomposition with Column Pivoting
+@cindex QR decomposition with column pivoting
+
+The @math{QR} decomposition can be extended to the rank deficient case
+by introducing a column permutation @math{P},
+@tex
+\beforedisplay
+$$
+A P = Q R
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+A P = Q R
+@end example
+
+@end ifinfo
+@noindent
+The first @math{r} columns of @math{Q} form an orthonormal basis
+for the range of @math{A} for a matrix with column rank @math{r}. This
+decomposition can also be used to convert the linear system @math{A x =
+b} into the triangular system @math{R y = Q^T b, x = P y}, which can be
+solved by back-substitution and permutation. We denote the @math{QR}
+decomposition with column pivoting by @math{QRP^T} since @math{A = Q R
+P^T}.
+
+@deftypefun int gsl_linalg_QRPT_decomp (gsl_matrix * @var{A}, gsl_vector * @var{tau}, gsl_permutation * @var{p}, int * @var{signum}, gsl_vector * @var{norm})
+This function factorizes the @math{M}-by-@math{N} matrix @var{A} into
+the @math{QRP^T} decomposition @math{A = Q R P^T}. On output the
+diagonal and upper triangular part of the input matrix contain the
+matrix @math{R}. The permutation matrix @math{P} is stored in the
+permutation @var{p}. The sign of the permutation is given by
+@var{signum}. It has the value @math{(-1)^n}, where @math{n} is the
+number of interchanges in the permutation. The vector @var{tau} and the
+columns of the lower triangular part of the matrix @var{A} contain the
+Householder coefficients and vectors which encode the orthogonal matrix
+@var{Q}. The vector @var{tau} must be of length @math{k=\min(M,N)}. The
+matrix @math{Q} is related to these components by, @math{Q = Q_k ... Q_2
+Q_1} where @math{Q_i = I - \tau_i v_i v_i^T} and @math{v_i} is the
+Householder vector @math{v_i =
+(0,...,1,A(i+1,i),A(i+2,i),...,A(m,i))}. This is the same storage scheme
+as used by @sc{lapack}. The vector @var{norm} is a workspace of length
+@var{N} used for column pivoting.
+
+The algorithm used to perform the decomposition is Householder QR with
+column pivoting (Golub & Van Loan, @cite{Matrix Computations}, Algorithm
+5.4.1).
+@end deftypefun
+
+@deftypefun int gsl_linalg_QRPT_decomp2 (const gsl_matrix * @var{A}, gsl_matrix * @var{q}, gsl_matrix * @var{r}, gsl_vector * @var{tau}, gsl_permutation * @var{p}, int * @var{signum}, gsl_vector * @var{norm})
+This function factorizes the matrix @var{A} into the decomposition
+@math{A = Q R P^T} without modifying @var{A} itself and storing the
+output in the separate matrices @var{q} and @var{r}.
+@end deftypefun
+
+@deftypefun int gsl_linalg_QRPT_solve (const gsl_matrix * @var{QR}, const gsl_vector * @var{tau}, const gsl_permutation * @var{p}, const gsl_vector * @var{b}, gsl_vector * @var{x})
+This function solves the square system @math{A x = b} using the @math{QRP^T}
+decomposition of @math{A} into (@var{QR}, @var{tau}, @var{p}) given by
+@code{gsl_linalg_QRPT_decomp}.
+@end deftypefun
+
+@deftypefun int gsl_linalg_QRPT_svx (const gsl_matrix * @var{QR}, const gsl_vector * @var{tau}, const gsl_permutation * @var{p}, gsl_vector * @var{x})
+This function solves the square system @math{A x = b} in-place using the
+@math{QRP^T} decomposition of @math{A} into
+(@var{QR},@var{tau},@var{p}). On input @var{x} should contain the
+right-hand side @math{b}, which is replaced by the solution on output.
+@end deftypefun
+
+@deftypefun int gsl_linalg_QRPT_QRsolve (const gsl_matrix * @var{Q}, const gsl_matrix * @var{R}, const gsl_permutation * @var{p}, const gsl_vector * @var{b}, gsl_vector * @var{x})
+This function solves the square system @math{R P^T x = Q^T b} for
+@var{x}. It can be used when the @math{QR} decomposition of a matrix is
+available in unpacked form as (@var{Q}, @var{R}).
+@end deftypefun
+
+@deftypefun int gsl_linalg_QRPT_update (gsl_matrix * @var{Q}, gsl_matrix * @var{R}, const gsl_permutation * @var{p}, gsl_vector * @var{u}, const gsl_vector * @var{v})
+This function performs a rank-1 update @math{w v^T} of the @math{QRP^T}
+decomposition (@var{Q}, @var{R}, @var{p}). The update is given by
+@math{Q'R' = Q R + w v^T} where the output matrices @math{Q'} and
+@math{R'} are also orthogonal and right triangular. Note that @var{w} is
+destroyed by the update. The permutation @var{p} is not changed.
+@end deftypefun
+
+@deftypefun int gsl_linalg_QRPT_Rsolve (const gsl_matrix * @var{QR}, const gsl_permutation * @var{p}, const gsl_vector * @var{b}, gsl_vector * @var{x})
+This function solves the triangular system @math{R P^T x = b} for the
+@math{N}-by-@math{N} matrix @math{R} contained in @var{QR}.
+@end deftypefun
+
+@deftypefun int gsl_linalg_QRPT_Rsvx (const gsl_matrix * @var{QR}, const gsl_permutation * @var{p}, gsl_vector * @var{x})
+This function solves the triangular system @math{R P^T x = b} in-place
+for the @math{N}-by-@math{N} matrix @math{R} contained in @var{QR}. On
+input @var{x} should contain the right-hand side @math{b}, which is
+replaced by the solution on output.
+@end deftypefun
+
+@node Singular Value Decomposition
+@section Singular Value Decomposition
+@cindex SVD
+@cindex singular value decomposition
+
+A general rectangular @math{M}-by-@math{N} matrix @math{A} has a
+singular value decomposition (@sc{svd}) into the product of an
+@math{M}-by-@math{N} orthogonal matrix @math{U}, an @math{N}-by-@math{N}
+diagonal matrix of singular values @math{S} and the transpose of an
+@math{N}-by-@math{N} orthogonal square matrix @math{V},
+@tex
+\beforedisplay
+$$
+A = U S V^T
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+A = U S V^T
+@end example
+
+@end ifinfo
+@noindent
+The singular values
+@c{$\sigma_i = S_{ii}$}
+@math{\sigma_i = S_@{ii@}} are all non-negative and are
+generally chosen to form a non-increasing sequence
+@c{$\sigma_1 \ge \sigma_2 \ge ... \ge \sigma_N \ge 0$}
+@math{\sigma_1 >= \sigma_2 >= ... >= \sigma_N >= 0}.
+
+The singular value decomposition of a matrix has many practical uses.
+The condition number of the matrix is given by the ratio of the largest
+singular value to the smallest singular value. The presence of a zero
+singular value indicates that the matrix is singular. The number of
+non-zero singular values indicates the rank of the matrix. In practice
+singular value decomposition of a rank-deficient matrix will not produce
+exact zeroes for singular values, due to finite numerical
+precision. Small singular values should be edited by choosing a suitable
+tolerance.
+
+For a rank-deficient matrix, the null space of @math{A} is given by
+the columns of @math{V} corresponding to the zero singular values.
+Similarly, the range of @math{A} is given by columns of @math{U}
+corresponding to the non-zero singular values.
+
+@deftypefun int gsl_linalg_SV_decomp (gsl_matrix * @var{A}, gsl_matrix * @var{V}, gsl_vector * @var{S}, gsl_vector * @var{work})
+This function factorizes the @math{M}-by-@math{N} matrix @var{A} into
+the singular value decomposition @math{A = U S V^T} for @c{$M \ge N$}
+@math{M >= N}. On output the matrix @var{A} is replaced by
+@math{U}. The diagonal elements of the singular value matrix @math{S}
+are stored in the vector @var{S}. The singular values are non-negative
+and form a non-increasing sequence from @math{S_1} to @math{S_N}. The
+matrix @var{V} contains the elements of @math{V} in untransposed
+form. To form the product @math{U S V^T} it is necessary to take the
+transpose of @var{V}. A workspace of length @var{N} is required in
+@var{work}.
+
+This routine uses the Golub-Reinsch SVD algorithm.
+@end deftypefun
+
+@deftypefun int gsl_linalg_SV_decomp_mod (gsl_matrix * @var{A}, gsl_matrix * @var{X}, gsl_matrix * @var{V}, gsl_vector * @var{S}, gsl_vector * @var{work})
+This function computes the SVD using the modified Golub-Reinsch
+algorithm, which is faster for @c{$M \gg N$}
+@math{M>>N}. It requires the vector @var{work} of length @var{N} and the
+@math{N}-by-@math{N} matrix @var{X} as additional working space.
+@end deftypefun
+
+@deftypefun int gsl_linalg_SV_decomp_jacobi (gsl_matrix * @var{A}, gsl_matrix * @var{V}, gsl_vector * @var{S})
+This function computes the SVD of the @math{M}-by-@math{N} matrix @var{A}
+using one-sided Jacobi orthogonalization for @c{$M \ge N$}
+@math{M >= N}. The Jacobi method can compute singular values to higher
+relative accuracy than Golub-Reinsch algorithms (see references for
+details).
+@end deftypefun
+
+@deftypefun int gsl_linalg_SV_solve (gsl_matrix * @var{U}, gsl_matrix * @var{V}, gsl_vector * @var{S}, const gsl_vector * @var{b}, gsl_vector * @var{x})
+This function solves the system @math{A x = b} using the singular value
+decomposition (@var{U}, @var{S}, @var{V}) of @math{A} given by
+@code{gsl_linalg_SV_decomp}.
+
+Only non-zero singular values are used in computing the solution. The
+parts of the solution corresponding to singular values of zero are
+ignored. Other singular values can be edited out by setting them to
+zero before calling this function.
+
+In the over-determined case where @var{A} has more rows than columns the
+system is solved in the least squares sense, returning the solution
+@var{x} which minimizes @math{||A x - b||_2}.
+@end deftypefun
+
+@node Cholesky Decomposition
+@section Cholesky Decomposition
+@cindex Cholesky decomposition
+@cindex square root of a matrix, Cholesky decomposition
+@cindex matrix square root, Cholesky decomposition
+
+A symmetric, positive definite square matrix @math{A} has a Cholesky
+decomposition into a product of a lower triangular matrix @math{L} and
+its transpose @math{L^T},
+@tex
+\beforedisplay
+$$
+A = L L^T
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+A = L L^T
+@end example
+
+@end ifinfo
+@noindent
+This is sometimes referred to as taking the square-root of a matrix. The
+Cholesky decomposition can only be carried out when all the eigenvalues
+of the matrix are positive. This decomposition can be used to convert
+the linear system @math{A x = b} into a pair of triangular systems
+(@math{L y = b}, @math{L^T x = y}), which can be solved by forward and
+back-substitution.
+
+@deftypefun int gsl_linalg_cholesky_decomp (gsl_matrix * @var{A})
+This function factorizes the positive-definite symmetric square matrix
+@var{A} into the Cholesky decomposition @math{A = L L^T}. On input
+only the diagonal and lower-triangular part of the matrix @var{A} are
+needed. On output the diagonal and lower triangular part of the input
+matrix @var{A} contain the matrix @math{L}. The upper triangular part
+of the input matrix contains @math{L^T}, the diagonal terms being
+identical for both @math{L} and @math{L^T}. If the matrix is not
+positive-definite then the decomposition will fail, returning the
+error code @code{GSL_EDOM}.
+@end deftypefun
+
+@deftypefun int gsl_linalg_cholesky_solve (const gsl_matrix * @var{cholesky}, const gsl_vector * @var{b}, gsl_vector * @var{x})
+This function solves the system @math{A x = b} using the Cholesky
+decomposition of @math{A} into the matrix @var{cholesky} given by
+@code{gsl_linalg_cholesky_decomp}.
+@end deftypefun
+
+@deftypefun int gsl_linalg_cholesky_svx (const gsl_matrix * @var{cholesky}, gsl_vector * @var{x})
+This function solves the system @math{A x = b} in-place using the
+Cholesky decomposition of @math{A} into the matrix @var{cholesky} given
+by @code{gsl_linalg_cholesky_decomp}. On input @var{x} should contain
+the right-hand side @math{b}, which is replaced by the solution on
+output.
+@end deftypefun
+
+@node Tridiagonal Decomposition of Real Symmetric Matrices
+@section Tridiagonal Decomposition of Real Symmetric Matrices
+@cindex tridiagonal decomposition
+
+A symmetric matrix @math{A} can be factorized by similarity
+transformations into the form,
+@tex
+\beforedisplay
+$$
+A = Q T Q^T
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+A = Q T Q^T
+@end example
+
+@end ifinfo
+@noindent
+where @math{Q} is an orthogonal matrix and @math{T} is a symmetric
+tridiagonal matrix.
+
+@deftypefun int gsl_linalg_symmtd_decomp (gsl_matrix * @var{A}, gsl_vector * @var{tau})
+This function factorizes the symmetric square matrix @var{A} into the
+symmetric tridiagonal decomposition @math{Q T Q^T}. On output the
+diagonal and subdiagonal part of the input matrix @var{A} contain the
+tridiagonal matrix @math{T}. The remaining lower triangular part of the
+input matrix contains the Householder vectors which, together with the
+Householder coefficients @var{tau}, encode the orthogonal matrix
+@math{Q}. This storage scheme is the same as used by @sc{lapack}. The
+upper triangular part of @var{A} is not referenced.
+@end deftypefun
+
+@deftypefun int gsl_linalg_symmtd_unpack (const gsl_matrix * @var{A}, const gsl_vector * @var{tau}, gsl_matrix * @var{Q}, gsl_vector * @var{diag}, gsl_vector * @var{subdiag})
+This function unpacks the encoded symmetric tridiagonal decomposition
+(@var{A}, @var{tau}) obtained from @code{gsl_linalg_symmtd_decomp} into
+the orthogonal matrix @var{Q}, the vector of diagonal elements @var{diag}
+and the vector of subdiagonal elements @var{subdiag}.
+@end deftypefun
+
+@deftypefun int gsl_linalg_symmtd_unpack_T (const gsl_matrix * @var{A}, gsl_vector * @var{diag}, gsl_vector * @var{subdiag})
+This function unpacks the diagonal and subdiagonal of the encoded
+symmetric tridiagonal decomposition (@var{A}, @var{tau}) obtained from
+@code{gsl_linalg_symmtd_decomp} into the vectors @var{diag} and @var{subdiag}.
+@end deftypefun
+
+@node Tridiagonal Decomposition of Hermitian Matrices
+@section Tridiagonal Decomposition of Hermitian Matrices
+@cindex tridiagonal decomposition
+
+A hermitian matrix @math{A} can be factorized by similarity
+transformations into the form,
+@tex
+\beforedisplay
+$$
+A = U T U^T
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+A = U T U^T
+@end example
+
+@end ifinfo
+@noindent
+where @math{U} is a unitary matrix and @math{T} is a real symmetric
+tridiagonal matrix.
+
+
+@deftypefun int gsl_linalg_hermtd_decomp (gsl_matrix_complex * @var{A}, gsl_vector_complex * @var{tau})
+This function factorizes the hermitian matrix @var{A} into the symmetric
+tridiagonal decomposition @math{U T U^T}. On output the real parts of
+the diagonal and subdiagonal part of the input matrix @var{A} contain
+the tridiagonal matrix @math{T}. The remaining lower triangular part of
+the input matrix contains the Householder vectors which, together with
+the Householder coefficients @var{tau}, encode the orthogonal matrix
+@math{Q}. This storage scheme is the same as used by @sc{lapack}. The
+upper triangular part of @var{A} and imaginary parts of the diagonal are
+not referenced.
+@end deftypefun
+
+@deftypefun int gsl_linalg_hermtd_unpack (const gsl_matrix_complex * @var{A}, const gsl_vector_complex * @var{tau}, gsl_matrix_complex * @var{Q}, gsl_vector * @var{diag}, gsl_vector * @var{subdiag})
+This function unpacks the encoded tridiagonal decomposition (@var{A},
+@var{tau}) obtained from @code{gsl_linalg_hermtd_decomp} into the
+unitary matrix @var{U}, the real vector of diagonal elements @var{diag} and
+the real vector of subdiagonal elements @var{subdiag}.
+@end deftypefun
+
+@deftypefun int gsl_linalg_hermtd_unpack_T (const gsl_matrix_complex * @var{A}, gsl_vector * @var{diag}, gsl_vector * @var{subdiag})
+This function unpacks the diagonal and subdiagonal of the encoded
+tridiagonal decomposition (@var{A}, @var{tau}) obtained from the
+@code{gsl_linalg_hermtd_decomp} into the real vectors
+@var{diag} and @var{subdiag}.
+@end deftypefun
+
+@node Hessenberg Decomposition of Real Matrices
+@section Hessenberg Decomposition of Real Matrices
+@cindex hessenberg decomposition
+
+A general matrix @math{A} can be decomposed by orthogonal
+similarity transformations into the form
+@tex
+\beforedisplay
+$$
+A = U H U^T
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+A = U H U^T
+@end example
+
+@end ifinfo
+where @math{U} is orthogonal and @math{H} is an upper Hessenberg matrix,
+meaning that it has zeros below the first subdiagonal. The
+Hessenberg reduction is the first step in the Schur decomposition
+for the nonsymmetric eigenvalue problem, but has applications in
+other areas as well.
+
+@deftypefun int gsl_linalg_hessenberg (gsl_matrix * @var{A}, gsl_vector * @var{tau})
+This function computes the Hessenberg decomposition of the matrix
+@var{A} by applying the similarity transformation @math{H = U^T A U}.
+On output, @math{H} is stored in the upper portion of @var{A}. The
+information required to construct the matrix @math{U} is stored in
+the lower triangular portion of @var{A}. @math{U} is a product
+of @math{N - 2} Householder matrices. The Householder vectors
+are stored in the lower portion of @var{A} (below the subdiagonal)
+and the Householder coefficients are stored in the vector @var{tau}.
+@var{tau} must be of length @var{N}.
+@end deftypefun
+
+@deftypefun int gsl_linalg_hessenberg_unpack (gsl_matrix * @var{H}, gsl_vector * @var{tau}, gsl_matrix * @var{U})
+This function constructs the orthogonal matrix @math{U} from the
+information stored in the Hessenberg matrix @var{H} along with the
+vector @var{tau}. @var{H} and @var{tau} are outputs from
+@code{gsl_linalg_hessenberg}.
+@end deftypefun
+
+@deftypefun int gsl_linalg_hessenberg_unpack_accum (gsl_matrix * @var{H}, gsl_vector * @var{tau}, gsl_matrix * @var{V})
+This function is similar to @code{gsl_linalg_hessenberg_unpack}, except
+it accumulates the matrix @var{U} into @var{V}, so that @math{V' = VU}.
+The matrix @var{V} must be initialized prior to calling this function.
+Setting @var{V} to the identity matrix provides the same result as
+@code{gsl_linalg_hessenberg_unpack}. If @var{H} is order @var{N}, then
+@var{V} must have @var{N} columns but may have any number of rows.
+@end deftypefun
+
+@deftypefun void gsl_linalg_hessenberg_set_zero (gsl_matrix * @var{H})
+This function sets the lower triangular portion of @var{H}, below
+the subdiagonal, to zero. It is useful for clearing out the
+Householder vectors after calling @code{gsl_linalg_hessenberg}.
+@end deftypefun
+
+@node Bidiagonalization
+@section Bidiagonalization
+@cindex bidiagonalization of real matrices
+
+A general matrix @math{A} can be factorized by similarity
+transformations into the form,
+@tex
+\beforedisplay
+$$
+A = U B V^T
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+A = U B V^T
+@end example
+
+@end ifinfo
+@noindent
+where @math{U} and @math{V} are orthogonal matrices and @math{B} is a
+@math{N}-by-@math{N} bidiagonal matrix with non-zero entries only on the
+diagonal and superdiagonal. The size of @var{U} is @math{M}-by-@math{N}
+and the size of @var{V} is @math{N}-by-@math{N}.
+
+@deftypefun int gsl_linalg_bidiag_decomp (gsl_matrix * @var{A}, gsl_vector * @var{tau_U}, gsl_vector * @var{tau_V})
+This function factorizes the @math{M}-by-@math{N} matrix @var{A} into
+bidiagonal form @math{U B V^T}. The diagonal and superdiagonal of the
+matrix @math{B} are stored in the diagonal and superdiagonal of @var{A}.
+The orthogonal matrices @math{U} and @var{V} are stored as compressed
+Householder vectors in the remaining elements of @var{A}. The
+Householder coefficients are stored in the vectors @var{tau_U} and
+@var{tau_V}. The length of @var{tau_U} must equal the number of
+elements in the diagonal of @var{A} and the length of @var{tau_V} should
+be one element shorter.
+@end deftypefun
+
+@deftypefun int gsl_linalg_bidiag_unpack (const gsl_matrix * @var{A}, const gsl_vector * @var{tau_U}, gsl_matrix * @var{U}, const gsl_vector * @var{tau_V}, gsl_matrix * @var{V}, gsl_vector * @var{diag}, gsl_vector * @var{superdiag})
+This function unpacks the bidiagonal decomposition of @var{A} given by
+@code{gsl_linalg_bidiag_decomp}, (@var{A}, @var{tau_U}, @var{tau_V})
+into the separate orthogonal matrices @var{U}, @var{V} and the diagonal
+vector @var{diag} and superdiagonal @var{superdiag}. Note that @var{U}
+is stored as a compact @math{M}-by-@math{N} orthogonal matrix satisfying
+@math{U^T U = I} for efficiency.
+@end deftypefun
+
+@deftypefun int gsl_linalg_bidiag_unpack2 (gsl_matrix * @var{A}, gsl_vector * @var{tau_U}, gsl_vector * @var{tau_V}, gsl_matrix * @var{V})
+This function unpacks the bidiagonal decomposition of @var{A} given by
+@code{gsl_linalg_bidiag_decomp}, (@var{A}, @var{tau_U}, @var{tau_V})
+into the separate orthogonal matrices @var{U}, @var{V} and the diagonal
+vector @var{diag} and superdiagonal @var{superdiag}. The matrix @var{U}
+is stored in-place in @var{A}.
+@end deftypefun
+
+@deftypefun int gsl_linalg_bidiag_unpack_B (const gsl_matrix * @var{A}, gsl_vector * @var{diag}, gsl_vector * @var{superdiag})
+This function unpacks the diagonal and superdiagonal of the bidiagonal
+decomposition of @var{A} given by @code{gsl_linalg_bidiag_decomp}, into
+the diagonal vector @var{diag} and superdiagonal vector @var{superdiag}.
+@end deftypefun
+
+@node Householder Transformations
+@section Householder Transformations
+@cindex Householder matrix
+@cindex Householder transformation
+@cindex transformation, Householder
+
+A Householder transformation is a rank-1 modification of the identity
+matrix which can be used to zero out selected elements of a vector. A
+Householder matrix @math{P} takes the form,
+@tex
+\beforedisplay
+$$
+P = I - \tau v v^T
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+P = I - \tau v v^T
+@end example
+
+@end ifinfo
+@noindent
+where @math{v} is a vector (called the @dfn{Householder vector}) and
+@math{\tau = 2/(v^T v)}. The functions described in this section use the
+rank-1 structure of the Householder matrix to create and apply
+Householder transformations efficiently.
+
+@deftypefun double gsl_linalg_householder_transform (gsl_vector * @var{v})
+This function prepares a Householder transformation @math{P = I - \tau v
+v^T} which can be used to zero all the elements of the input vector except
+the first. On output the transformation is stored in the vector @var{v}
+and the scalar @math{\tau} is returned.
+@end deftypefun
+
+@deftypefun int gsl_linalg_householder_hm (double tau, const gsl_vector * v, gsl_matrix * A)
+This function applies the Householder matrix @math{P} defined by the
+scalar @var{tau} and the vector @var{v} to the left-hand side of the
+matrix @var{A}. On output the result @math{P A} is stored in @var{A}.
+@end deftypefun
+
+@deftypefun int gsl_linalg_householder_mh (double tau, const gsl_vector * v, gsl_matrix * A)
+This function applies the Householder matrix @math{P} defined by the
+scalar @var{tau} and the vector @var{v} to the right-hand side of the
+matrix @var{A}. On output the result @math{A P} is stored in @var{A}.
+@end deftypefun
+
+@deftypefun int gsl_linalg_householder_hv (double tau, const gsl_vector * v, gsl_vector * w)
+This function applies the Householder transformation @math{P} defined by
+the scalar @var{tau} and the vector @var{v} to the vector @var{w}. On
+output the result @math{P w} is stored in @var{w}.
+@end deftypefun
+
+@comment @deftypefun int gsl_linalg_householder_hm1 (double tau, gsl_matrix * A)
+@comment This function applies the Householder transform, defined by the scalar
+@comment @var{tau} and the vector @var{v}, to a matrix being build up from the
+@comment identity matrix, using the first column of @var{A} as a householder vector.
+@comment @end deftypefun
+
+@node Householder solver for linear systems
+@section Householder solver for linear systems
+@cindex solution of linear system by Householder transformations
+@cindex Householder linear solver
+
+@deftypefun int gsl_linalg_HH_solve (gsl_matrix * @var{A}, const gsl_vector * @var{b}, gsl_vector * @var{x})
+This function solves the system @math{A x = b} directly using
+Householder transformations. On output the solution is stored in @var{x}
+and @var{b} is not modified. The matrix @var{A} is destroyed by the
+Householder transformations.
+@end deftypefun
+
+@deftypefun int gsl_linalg_HH_svx (gsl_matrix * @var{A}, gsl_vector * @var{x})
+This function solves the system @math{A x = b} in-place using
+Householder transformations. On input @var{x} should contain the
+right-hand side @math{b}, which is replaced by the solution on output. The
+matrix @var{A} is destroyed by the Householder transformations.
+@end deftypefun
+
+@node Tridiagonal Systems
+@section Tridiagonal Systems
+@cindex tridiagonal systems
+
+@deftypefun int gsl_linalg_solve_tridiag (const gsl_vector * @var{diag}, const gsl_vector * @var{e}, const gsl_vector * @var{f}, const gsl_vector * @var{b}, gsl_vector * @var{x})
+This function solves the general @math{N}-by-@math{N} system @math{A x =
+b} where @var{A} is tridiagonal (@c{$N\geq 2$}
+@math{N >= 2}). The super-diagonal and
+sub-diagonal vectors @var{e} and @var{f} must be one element shorter
+than the diagonal vector @var{diag}. The form of @var{A} for the 4-by-4
+case is shown below,
+@tex
+\beforedisplay
+$$
+A = \pmatrix{d_0&e_0& 0& 0\cr
+ f_0&d_1&e_1& 0\cr
+ 0 &f_1&d_2&e_2\cr
+ 0 &0 &f_2&d_3\cr}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+A = ( d_0 e_0 0 0 )
+ ( f_0 d_1 e_1 0 )
+ ( 0 f_1 d_2 e_2 )
+ ( 0 0 f_2 d_3 )
+@end example
+@end ifinfo
+@end deftypefun
+
+@deftypefun int gsl_linalg_solve_symm_tridiag (const gsl_vector * @var{diag}, const gsl_vector * @var{e}, const gsl_vector * @var{b}, gsl_vector * @var{x})
+This function solves the general @math{N}-by-@math{N} system @math{A x =
+b} where @var{A} is symmetric tridiagonal (@c{$N\geq 2$}
+@math{N >= 2}). The off-diagonal vector
+@var{e} must be one element shorter than the diagonal vector @var{diag}.
+The form of @var{A} for the 4-by-4 case is shown below,
+@tex
+\beforedisplay
+$$
+A = \pmatrix{d_0&e_0& 0& 0\cr
+ e_0&d_1&e_1& 0\cr
+ 0 &e_1&d_2&e_2\cr
+ 0 &0 &e_2&d_3\cr}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+A = ( d_0 e_0 0 0 )
+ ( e_0 d_1 e_1 0 )
+ ( 0 e_1 d_2 e_2 )
+ ( 0 0 e_2 d_3 )
+@end example
+@end ifinfo
+The current implementation uses a variant of Cholesky decomposition
+which can cause division by zero if the matrix is not positive definite.
+@end deftypefun
+
+@deftypefun int gsl_linalg_solve_cyc_tridiag (const gsl_vector * @var{diag}, const gsl_vector * @var{e}, const gsl_vector * @var{f}, const gsl_vector * @var{b}, gsl_vector * @var{x})
+This function solves the general @math{N}-by-@math{N} system @math{A x =
+b} where @var{A} is cyclic tridiagonal (@c{$N\geq 3$}
+@math{N >= 3}). The cyclic super-diagonal and
+sub-diagonal vectors @var{e} and @var{f} must have the same number of
+elements as the diagonal vector @var{diag}. The form of @var{A} for the
+4-by-4 case is shown below,
+@tex
+\beforedisplay
+$$
+A = \pmatrix{d_0&e_0& 0 &f_3\cr
+ f_0&d_1&e_1& 0 \cr
+ 0 &f_1&d_2&e_2\cr
+ e_3& 0 &f_2&d_3\cr}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+A = ( d_0 e_0 0 f_3 )
+ ( f_0 d_1 e_1 0 )
+ ( 0 f_1 d_2 e_2 )
+ ( e_3 0 f_2 d_3 )
+@end example
+@end ifinfo
+@end deftypefun
+
+
+@deftypefun int gsl_linalg_solve_symm_cyc_tridiag (const gsl_vector * @var{diag}, const gsl_vector * @var{e}, const gsl_vector * @var{b}, gsl_vector * @var{x})
+This function solves the general @math{N}-by-@math{N} system @math{A x =
+b} where @var{A} is symmetric cyclic tridiagonal (@c{$N\geq 3$}
+@math{N >= 3}). The cyclic
+off-diagonal vector @var{e} must have the same number of elements as the
+diagonal vector @var{diag}. The form of @var{A} for the 4-by-4 case is
+shown below,
+@tex
+\beforedisplay
+$$
+A = \pmatrix{d_0&e_0& 0 &e_3\cr
+ e_0&d_1&e_1& 0 \cr
+ 0 &e_1&d_2&e_2\cr
+ e_3& 0 &e_2&d_3\cr}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+A = ( d_0 e_0 0 e_3 )
+ ( e_0 d_1 e_1 0 )
+ ( 0 e_1 d_2 e_2 )
+ ( e_3 0 e_2 d_3 )
+@end example
+@end ifinfo
+@end deftypefun
+
+@node Balancing
+@section Balancing
+@cindex balancing matrices
+
+The process of balancing a matrix applies similarity transformations
+to make the rows and columns have comparable norms. This is
+useful, for example, to reduce roundoff errors in the solution
+of eigenvalue problems. Balancing a matrix @math{A} consists
+of replacing @math{A} with a similar matrix
+@tex
+\beforedisplay
+$$
+A' = D^{-1} A D
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+A' = D^(-1) A D
+@end example
+
+@end ifinfo
+where @math{D} is a diagonal matrix whose entries are powers
+of the floating point radix.
+
+@deftypefun int gsl_linalg_balance_matrix (gsl_matrix * @var{A}, gsl_vector * @var{D})
+This function replaces the matrix @var{A} with its balanced counterpart
+and stores the diagonal elements of the similarity transformation
+into the vector @var{D}.
+@end deftypefun
+
+@node Linear Algebra Examples
+@section Examples
+
+The following program solves the linear system @math{A x = b}. The
+system to be solved is,
+@tex
+\beforedisplay
+$$
+\left(
+\matrix{0.18& 0.60& 0.57& 0.96\cr
+0.41& 0.24& 0.99& 0.58\cr
+0.14& 0.30& 0.97& 0.66\cr
+0.51& 0.13& 0.19& 0.85}
+\right)
+\left(
+\matrix{x_0\cr
+x_1\cr
+x_2\cr
+x_3}
+\right)
+=
+\left(
+\matrix{1.0\cr
+2.0\cr
+3.0\cr
+4.0}
+\right)
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+[ 0.18 0.60 0.57 0.96 ] [x0] [1.0]
+[ 0.41 0.24 0.99 0.58 ] [x1] = [2.0]
+[ 0.14 0.30 0.97 0.66 ] [x2] [3.0]
+[ 0.51 0.13 0.19 0.85 ] [x3] [4.0]
+@end example
+
+@end ifinfo
+@noindent
+and the solution is found using LU decomposition of the matrix @math{A}.
+
+@example
+@verbatiminclude examples/linalglu.c
+@end example
+
+@noindent
+Here is the output from the program,
+
+@example
+@verbatiminclude examples/linalglu.out
+@end example
+
+@noindent
+This can be verified by multiplying the solution @math{x} by the
+original matrix @math{A} using @sc{gnu octave},
+
+@example
+octave> A = [ 0.18, 0.60, 0.57, 0.96;
+ 0.41, 0.24, 0.99, 0.58;
+ 0.14, 0.30, 0.97, 0.66;
+ 0.51, 0.13, 0.19, 0.85 ];
+
+octave> x = [ -4.05205; -12.6056; 1.66091; 8.69377];
+
+octave> A * x
+ans =
+ 1.0000
+ 2.0000
+ 3.0000
+ 4.0000
+@end example
+
+@noindent
+This reproduces the original right-hand side vector, @math{b}, in
+accordance with the equation @math{A x = b}.
+
+@node Linear Algebra References and Further Reading
+@section References and Further Reading
+
+Further information on the algorithms described in this section can be
+found in the following book,
+
+@itemize @asis
+@item
+G. H. Golub, C. F. Van Loan, @cite{Matrix Computations} (3rd Ed, 1996),
+Johns Hopkins University Press, ISBN 0-8018-5414-8.
+@end itemize
+
+@noindent
+The @sc{lapack} library is described in the following manual,
+
+@itemize @asis
+@item
+@cite{LAPACK Users' Guide} (Third Edition, 1999), Published by SIAM,
+ISBN 0-89871-447-8.
+
+@uref{http://www.netlib.org/lapack}
+@end itemize
+
+@noindent
+The @sc{lapack} source code can be found at the website above, along
+with an online copy of the users guide.
+
+@noindent
+The Modified Golub-Reinsch algorithm is described in the following paper,
+
+@itemize @asis
+@item
+T.F. Chan, ``An Improved Algorithm for Computing the Singular Value
+Decomposition'', @cite{ACM Transactions on Mathematical Software}, 8
+(1982), pp 72--83.
+@end itemize
+
+@noindent
+The Jacobi algorithm for singular value decomposition is described in
+the following papers,
+
+@itemize @asis
+@item
+J.C. Nash, ``A one-sided transformation method for the singular value
+decomposition and algebraic eigenproblem'', @cite{Computer Journal},
+Volume 18, Number 1 (1973), p 74--76
+
+@item
+James Demmel, Kresimir Veselic, ``Jacobi's Method is more accurate than
+QR'', @cite{Lapack Working Note 15} (LAWN-15), October 1989. Available
+from netlib, @uref{http://www.netlib.org/lapack/} in the @code{lawns} or
+@code{lawnspdf} directories.
+@end itemize
+
+
+
diff --git a/gsl-1.9/doc/math.texi b/gsl-1.9/doc/math.texi
new file mode 100644
index 0000000..5f28d71
--- /dev/null
+++ b/gsl-1.9/doc/math.texi
@@ -0,0 +1,339 @@
+@cindex elementary functions
+@cindex mathematical functions, elementary
+
+This chapter describes basic mathematical functions. Some of these
+functions are present in system libraries, but the alternative versions
+given here can be used as a substitute when the system functions are not
+available.
+
+The functions and macros described in this chapter are defined in the
+header file @file{gsl_math.h}.
+
+@menu
+* Mathematical Constants::
+* Infinities and Not-a-number::
+* Elementary Functions::
+* Small integer powers::
+* Testing the Sign of Numbers::
+* Testing for Odd and Even Numbers::
+* Maximum and Minimum functions::
+* Approximate Comparison of Floating Point Numbers::
+@end menu
+
+@node Mathematical Constants
+@section Mathematical Constants
+@cindex mathematical constants, defined as macros
+@cindex numerical constants, defined as macros
+@cindex constants, mathematical---defined as macros
+@cindex macros for mathematical constants
+The library ensures that the standard @sc{bsd} mathematical constants
+are defined. For reference, here is a list of the constants:
+
+@table @code
+@item M_E
+@cindex e, defined as a macro
+The base of exponentials, @math{e}
+
+@item M_LOG2E
+The base-2 logarithm of @math{e}, @math{\log_2 (e)}
+
+@item M_LOG10E
+The base-10 logarithm of @math{e}, @c{$\log_{10}(e)$}
+@math{\log_10 (e)}
+
+@item M_SQRT2
+The square root of two, @math{\sqrt 2}
+
+@item M_SQRT1_2
+The square root of one-half, @c{$\sqrt{1/2}$}
+@math{\sqrt@{1/2@}}
+
+@item M_SQRT3
+The square root of three, @math{\sqrt 3}
+
+@item M_PI
+@cindex pi, defined as a macro
+The constant pi, @math{\pi}
+
+@item M_PI_2
+Pi divided by two, @math{\pi/2}
+
+@item M_PI_4
+Pi divided by four, @math{\pi/4}
+
+@item M_SQRTPI
+The square root of pi, @math{\sqrt\pi}
+
+@item M_2_SQRTPI
+Two divided by the square root of pi, @math{2/\sqrt\pi}
+
+@item M_1_PI
+The reciprocal of pi, @math{1/\pi}
+
+@item M_2_PI
+Twice the reciprocal of pi, @math{2/\pi}
+
+@item M_LN10
+The natural logarithm of ten, @math{\ln(10)}
+
+@item M_LN2
+The natural logarithm of two, @math{\ln(2)}
+
+@item M_LNPI
+The natural logarithm of pi, @math{\ln(\pi)}
+
+@item M_EULER
+@cindex Euler's constant, defined as a macro
+Euler's constant, @math{\gamma}
+
+@end table
+
+@node Infinities and Not-a-number
+@section Infinities and Not-a-number
+
+@cindex infinity, defined as a macro
+@cindex IEEE infinity, defined as a macro
+@cindex NaN, defined as a macro
+@cindex Not-a-number, defined as a macro
+@cindex IEEE NaN, defined as a macro
+
+@defmac GSL_POSINF
+This macro contains the IEEE representation of positive infinity,
+@math{+\infty}. It is computed from the expression @code{+1.0/0.0}.
+@end defmac
+
+@defmac GSL_NEGINF
+This macro contains the IEEE representation of negative infinity,
+@math{-\infty}. It is computed from the expression @code{-1.0/0.0}.
+@end defmac
+
+@defmac GSL_NAN
+This macro contains the IEEE representation of the Not-a-Number symbol,
+@code{NaN}. It is computed from the ratio @code{0.0/0.0}.
+@end defmac
+
+@deftypefun int gsl_isnan (const double @var{x})
+This function returns 1 if @var{x} is not-a-number.
+@end deftypefun
+
+@deftypefun int gsl_isinf (const double @var{x})
+This function returns @math{+1} if @var{x} is positive infinity,
+@math{-1} if @var{x} is negative infinity and 0 otherwise.
+@end deftypefun
+
+@deftypefun int gsl_finite (const double @var{x})
+This function returns 1 if @var{x} is a real number, and 0 if it is
+infinite or not-a-number.
+@end deftypefun
+
+
+@node Elementary Functions
+@section Elementary Functions
+
+The following routines provide portable implementations of functions
+found in the BSD math library. When native versions are not available
+the functions described here can be used instead. The substitution can
+be made automatically if you use @code{autoconf} to compile your
+application (@pxref{Portability functions}).
+
+@deftypefun double gsl_log1p (const double @var{x})
+@cindex log1p
+@cindex logarithm, computed accurately near 1
+This function computes the value of @math{\log(1+x)} in a way that is
+accurate for small @var{x}. It provides an alternative to the BSD math
+function @code{log1p(x)}.
+@end deftypefun
+
+@deftypefun double gsl_expm1 (const double @var{x})
+@cindex expm1
+@cindex exponential, difference from 1 computed accurately
+This function computes the value of @math{\exp(x)-1} in a way that is
+accurate for small @var{x}. It provides an alternative to the BSD math
+function @code{expm1(x)}.
+@end deftypefun
+
+@deftypefun double gsl_hypot (const double @var{x}, const double @var{y})
+@cindex hypot
+@cindex euclidean distance function, hypot
+@cindex length, computed accurately using hypot
+This function computes the value of
+@c{$\sqrt{x^2 + y^2}$}
+@math{\sqrt@{x^2 + y^2@}} in a way that avoids overflow. It provides an
+alternative to the BSD math function @code{hypot(x,y)}.
+@end deftypefun
+
+@deftypefun double gsl_acosh (const double @var{x})
+@cindex acosh
+@cindex hyperbolic cosine, inverse
+@cindex inverse hyperbolic cosine
+This function computes the value of @math{\arccosh(x)}. It provides an
+alternative to the standard math function @code{acosh(x)}.
+@end deftypefun
+
+@deftypefun double gsl_asinh (const double @var{x})
+@cindex asinh
+@cindex hyperbolic sine, inverse
+@cindex inverse hyperbolic sine
+This function computes the value of @math{\arcsinh(x)}. It provides an
+alternative to the standard math function @code{asinh(x)}.
+@end deftypefun
+
+@deftypefun double gsl_atanh (const double @var{x})
+@cindex atanh
+@cindex hyperbolic tangent, inverse
+@cindex inverse hyperbolic tangent
+This function computes the value of @math{\arctanh(x)}. It provides an
+alternative to the standard math function @code{atanh(x)}.
+@end deftypefun
+
+
+@deftypefun double gsl_ldexp (double @var{x}, int @var{e})
+@cindex ldexp
+This function computes the value of @math{x * 2^e}. It provides an
+alternative to the standard math function @code{ldexp(x,e)}.
+@end deftypefun
+
+@deftypefun double gsl_frexp (double @var{x}, int * @var{e})
+@cindex frexp
+This function splits the number @math{x} into its normalized fraction
+@math{f} and exponent @math{e}, such that @math{x = f * 2^e} and
+@c{$0.5 \le f < 1$}
+@math{0.5 <= f < 1}. The function returns @math{f} and stores the
+exponent in @math{e}. If @math{x} is zero, both @math{f} and @math{e}
+are set to zero. This function provides an alternative to the standard
+math function @code{frexp(x, e)}.
+@end deftypefun
+
+@node Small integer powers
+@section Small integer powers
+
+A common complaint about the standard C library is its lack of a
+function for calculating (small) integer powers. GSL provides some simple
+functions to fill this gap. For reasons of efficiency, these functions
+do not check for overflow or underflow conditions.
+
+@deftypefun double gsl_pow_int (double @var{x}, int @var{n})
+This routine computes the power @math{x^n} for integer @var{n}. The
+power is computed efficiently---for example, @math{x^8} is computed as
+@math{((x^2)^2)^2}, requiring only 3 multiplications. A version of this
+function which also computes the numerical error in the result is
+available as @code{gsl_sf_pow_int_e}.
+@end deftypefun
+
+@deftypefun double gsl_pow_2 (const double @var{x})
+@deftypefunx double gsl_pow_3 (const double @var{x})
+@deftypefunx double gsl_pow_4 (const double @var{x})
+@deftypefunx double gsl_pow_5 (const double @var{x})
+@deftypefunx double gsl_pow_6 (const double @var{x})
+@deftypefunx double gsl_pow_7 (const double @var{x})
+@deftypefunx double gsl_pow_8 (const double @var{x})
+@deftypefunx double gsl_pow_9 (const double @var{x})
+These functions can be used to compute small integer powers @math{x^2},
+@math{x^3}, etc. efficiently. The functions will be inlined when
+possible so that use of these functions should be as efficient as
+explicitly writing the corresponding product expression.
+@end deftypefun
+
+@example
+#include <gsl/gsl_math.h>
+double y = gsl_pow_4 (3.141) /* compute 3.141**4 */
+@end example
+
+@node Testing the Sign of Numbers
+@section Testing the Sign of Numbers
+
+@defmac GSL_SIGN (x)
+This macro returns the sign of @var{x}. It is defined as @code{((x) >= 0
+? 1 : -1)}. Note that with this definition the sign of zero is positive
+(regardless of its @sc{ieee} sign bit).
+@end defmac
+
+@node Testing for Odd and Even Numbers
+@section Testing for Odd and Even Numbers
+
+@defmac GSL_IS_ODD (n)
+This macro evaluates to 1 if @var{n} is odd and 0 if @var{n} is
+even. The argument @var{n} must be of integer type.
+@end defmac
+
+@defmac GSL_IS_EVEN (n)
+This macro is the opposite of @code{GSL_IS_ODD(n)}. It evaluates to 1 if
+@var{n} is even and 0 if @var{n} is odd. The argument @var{n} must be of
+integer type.
+@end defmac
+
+@node Maximum and Minimum functions
+@section Maximum and Minimum functions
+
+@defmac GSL_MAX (a, b)
+@cindex maximum of two numbers
+This macro returns the maximum of @var{a} and @var{b}. It is defined as
+@code{((a) > (b) ? (a):(b))}.
+@end defmac
+
+@defmac GSL_MIN (a, b)
+@cindex minimum of two numbers
+This macro returns the minimum of @var{a} and @var{b}. It is defined as
+@code{((a) < (b) ? (a):(b))}.
+@end defmac
+
+@deftypefun {extern inline double} GSL_MAX_DBL (double @var{a}, double @var{b})
+This function returns the maximum of the double precision numbers
+@var{a} and @var{b} using an inline function. The use of a function
+allows for type checking of the arguments as an extra safety feature. On
+platforms where inline functions are not available the macro
+@code{GSL_MAX} will be automatically substituted.
+@end deftypefun
+
+@deftypefun {extern inline double} GSL_MIN_DBL (double @var{a}, double @var{b})
+This function returns the minimum of the double precision numbers
+@var{a} and @var{b} using an inline function. The use of a function
+allows for type checking of the arguments as an extra safety feature. On
+platforms where inline functions are not available the macro
+@code{GSL_MIN} will be automatically substituted.
+@end deftypefun
+
+@deftypefun {extern inline int} GSL_MAX_INT (int @var{a}, int @var{b})
+@deftypefunx {extern inline int} GSL_MIN_INT (int @var{a}, int @var{b})
+These functions return the maximum or minimum of the integers @var{a}
+and @var{b} using an inline function. On platforms where inline
+functions are not available the macros @code{GSL_MAX} or @code{GSL_MIN}
+will be automatically substituted.
+@end deftypefun
+
+@deftypefun {extern inline long double} GSL_MAX_LDBL (long double @var{a}, long double @var{b})
+@deftypefunx {extern inline long double} GSL_MIN_LDBL (long double @var{a}, long double @var{b})
+These functions return the maximum or minimum of the long doubles @var{a}
+and @var{b} using an inline function. On platforms where inline
+functions are not available the macros @code{GSL_MAX} or @code{GSL_MIN}
+will be automatically substituted.
+@end deftypefun
+
+@node Approximate Comparison of Floating Point Numbers
+@section Approximate Comparison of Floating Point Numbers
+
+It is sometimes useful to be able to compare two floating point numbers
+approximately, to allow for rounding and truncation errors. The following
+function implements the approximate floating-point comparison algorithm
+proposed by D.E. Knuth in Section 4.2.2 of @cite{Seminumerical
+Algorithms} (3rd edition).
+
+@deftypefun int gsl_fcmp (double @var{x}, double @var{y}, double @var{epsilon})
+@cindex approximate comparison of floating point numbers
+@cindex safe comparison of floating point numbers
+@cindex floating point numbers, approximate comparison
+This function determines whether @math{x} and @math{y} are approximately
+equal to a relative accuracy @var{epsilon}.
+
+The relative accuracy is measured using an interval of size @math{2
+\delta}, where @math{\delta = 2^k \epsilon} and @math{k} is the
+maximum base-2 exponent of @math{x} and @math{y} as computed by the
+function @code{frexp}.
+
+If @math{x} and @math{y} lie within this interval, they are considered
+approximately equal and the function returns 0. Otherwise if @math{x <
+y}, the function returns @math{-1}, or if @math{x > y}, the function returns
+@math{+1}.
+
+The implementation is based on the package @code{fcmp} by T.C. Belding.
+@end deftypefun
diff --git a/gsl-1.9/doc/mdate-sh b/gsl-1.9/doc/mdate-sh
new file mode 100755
index 0000000..4b2efdf
--- /dev/null
+++ b/gsl-1.9/doc/mdate-sh
@@ -0,0 +1,193 @@
+#!/bin/sh
+# Get modification time of a file or directory and pretty-print it.
+
+scriptversion=2005-02-07.09
+
+# Copyright (C) 1995, 1996, 1997, 2003, 2004, 2005 Free Software
+# Foundation, Inc.
+# written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, June 1995
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+case $1 in
+ '')
+ echo "$0: No file. Try \`$0 --help' for more information." 1>&2
+ exit 1;
+ ;;
+ -h | --h*)
+ cat <<\EOF
+Usage: mdate-sh [--help] [--version] FILE
+
+Pretty-print the modification time of FILE.
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+ exit $?
+ ;;
+ -v | --v*)
+ echo "mdate-sh $scriptversion"
+ exit $?
+ ;;
+esac
+
+# Prevent date giving response in another language.
+LANG=C
+export LANG
+LC_ALL=C
+export LC_ALL
+LC_TIME=C
+export LC_TIME
+
+save_arg1="$1"
+
+# Find out how to get the extended ls output of a file or directory.
+if ls -L /dev/null 1>/dev/null 2>&1; then
+ ls_command='ls -L -l -d'
+else
+ ls_command='ls -l -d'
+fi
+
+# A `ls -l' line looks as follows on OS/2.
+# drwxrwx--- 0 Aug 11 2001 foo
+# This differs from Unix, which adds ownership information.
+# drwxrwx--- 2 root root 4096 Aug 11 2001 foo
+#
+# To find the date, we split the line on spaces and iterate on words
+# until we find a month. This cannot work with files whose owner is a
+# user named `Jan', or `Feb', etc. However, it's unlikely that `/'
+# will be owned by a user whose name is a month. So we first look at
+# the extended ls output of the root directory to decide how many
+# words should be skipped to get the date.
+
+# On HPUX /bin/sh, "set" interprets "-rw-r--r--" as options, so the "x" below.
+set x`ls -l -d /`
+
+# Find which argument is the month.
+month=
+command=
+until test $month
+do
+ shift
+ # Add another shift to the command.
+ command="$command shift;"
+ case $1 in
+ Jan) month=January; nummonth=1;;
+ Feb) month=February; nummonth=2;;
+ Mar) month=March; nummonth=3;;
+ Apr) month=April; nummonth=4;;
+ May) month=May; nummonth=5;;
+ Jun) month=June; nummonth=6;;
+ Jul) month=July; nummonth=7;;
+ Aug) month=August; nummonth=8;;
+ Sep) month=September; nummonth=9;;
+ Oct) month=October; nummonth=10;;
+ Nov) month=November; nummonth=11;;
+ Dec) month=December; nummonth=12;;
+ esac
+done
+
+# Get the extended ls output of the file or directory.
+set dummy x`eval "$ls_command \"\$save_arg1\""`
+
+# Remove all preceding arguments
+eval $command
+
+# Because of the dummy argument above, month is in $2.
+#
+# On a POSIX system, we should have
+#
+# $# = 5
+# $1 = file size
+# $2 = month
+# $3 = day
+# $4 = year or time
+# $5 = filename
+#
+# On Darwin 7.7.0 and 7.6.0, we have
+#
+# $# = 4
+# $1 = day
+# $2 = month
+# $3 = year or time
+# $4 = filename
+
+# Get the month.
+case $2 in
+ Jan) month=January; nummonth=1;;
+ Feb) month=February; nummonth=2;;
+ Mar) month=March; nummonth=3;;
+ Apr) month=April; nummonth=4;;
+ May) month=May; nummonth=5;;
+ Jun) month=June; nummonth=6;;
+ Jul) month=July; nummonth=7;;
+ Aug) month=August; nummonth=8;;
+ Sep) month=September; nummonth=9;;
+ Oct) month=October; nummonth=10;;
+ Nov) month=November; nummonth=11;;
+ Dec) month=December; nummonth=12;;
+esac
+
+case $3 in
+ ???*) day=$1;;
+ *) day=$3; shift;;
+esac
+
+# Here we have to deal with the problem that the ls output gives either
+# the time of day or the year.
+case $3 in
+ *:*) set `date`; eval year=\$$#
+ case $2 in
+ Jan) nummonthtod=1;;
+ Feb) nummonthtod=2;;
+ Mar) nummonthtod=3;;
+ Apr) nummonthtod=4;;
+ May) nummonthtod=5;;
+ Jun) nummonthtod=6;;
+ Jul) nummonthtod=7;;
+ Aug) nummonthtod=8;;
+ Sep) nummonthtod=9;;
+ Oct) nummonthtod=10;;
+ Nov) nummonthtod=11;;
+ Dec) nummonthtod=12;;
+ esac
+ # For the first six month of the year the time notation can also
+ # be used for files modified in the last year.
+ if (expr $nummonth \> $nummonthtod) > /dev/null;
+ then
+ year=`expr $year - 1`
+ fi;;
+ *) year=$3;;
+esac
+
+# The result.
+echo $day $month $year
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/gsl-1.9/doc/min-interval.eps b/gsl-1.9/doc/min-interval.eps
new file mode 100644
index 0000000..96b7913
--- /dev/null
+++ b/gsl-1.9/doc/min-interval.eps
@@ -0,0 +1,330 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: tmp.xfig.eps
+%%Creator: fig2dev Version 3.2 Patchlevel 1
+%%CreationDate: Mon Aug 16 15:21:28 1999
+%%For: bjg@netsci (Brian Gough,,,,)
+%%Orientation: Portrait
+%%BoundingBox: 0 0 346 205
+%%Pages: 0
+%%BeginSetup
+%%EndSetup
+%%Magnification: 1.0000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+/col32 {0.557 0.557 0.557 srgb} bind def
+/col33 {0.255 0.271 0.255 srgb} bind def
+/col34 {0.557 0.557 0.557 srgb} bind def
+/col35 {0.255 0.271 0.255 srgb} bind def
+/col36 {0.557 0.557 0.557 srgb} bind def
+/col37 {0.255 0.271 0.255 srgb} bind def
+/col38 {0.557 0.557 0.557 srgb} bind def
+/col39 {0.255 0.271 0.255 srgb} bind def
+/col40 {0.557 0.557 0.557 srgb} bind def
+/col41 {0.255 0.271 0.255 srgb} bind def
+/col42 {0.557 0.557 0.557 srgb} bind def
+/col43 {0.255 0.271 0.255 srgb} bind def
+/col44 {0.557 0.557 0.557 srgb} bind def
+/col45 {0.557 0.557 0.557 srgb} bind def
+/col46 {0.557 0.557 0.557 srgb} bind def
+/col47 {0.557 0.557 0.557 srgb} bind def
+/col48 {0.557 0.557 0.557 srgb} bind def
+/col49 {0.557 0.557 0.557 srgb} bind def
+/col50 {0.557 0.557 0.557 srgb} bind def
+/col51 {0.557 0.557 0.557 srgb} bind def
+/col52 {0.557 0.557 0.557 srgb} bind def
+/col53 {0.557 0.557 0.557 srgb} bind def
+/col54 {0.557 0.557 0.557 srgb} bind def
+/col55 {0.255 0.271 0.255 srgb} bind def
+/col56 {0.557 0.557 0.557 srgb} bind def
+/col57 {0.255 0.271 0.255 srgb} bind def
+/col58 {0.557 0.557 0.557 srgb} bind def
+/col59 {0.255 0.271 0.255 srgb} bind def
+/col60 {0.557 0.557 0.557 srgb} bind def
+/col61 {0.255 0.271 0.255 srgb} bind def
+/col62 {0.557 0.557 0.557 srgb} bind def
+/col63 {0.255 0.271 0.255 srgb} bind def
+/col64 {0.557 0.557 0.557 srgb} bind def
+/col65 {0.255 0.271 0.255 srgb} bind def
+/col66 {0.557 0.557 0.557 srgb} bind def
+/col67 {0.255 0.271 0.255 srgb} bind def
+/col68 {0.557 0.557 0.557 srgb} bind def
+/col69 {0.255 0.271 0.255 srgb} bind def
+/col70 {0.557 0.557 0.557 srgb} bind def
+/col71 {0.255 0.271 0.255 srgb} bind def
+/col72 {0.557 0.557 0.557 srgb} bind def
+
+end
+save
+-30.0 227.0 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+ 4 -2 roll dup 1 exch sub 3 -1 roll mul add
+ 4 -2 roll dup 1 exch sub 3 -1 roll mul add
+ 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+ bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+ 4 -2 roll mul srgb} bind def
+/reencdict 12 dict def /ReEncode { reencdict begin
+/newcodesandnames exch def /newfontname exch def /basefontname exch def
+/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def
+basefontdict { exch dup /FID ne { dup /Encoding eq
+{ exch dup length array copy newfont 3 1 roll put }
+{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall
+newfont /FontName newfontname put newcodesandnames aload pop
+128 1 255 { newfont /Encoding get exch /.notdef put } for
+newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat
+newfontname newfont definefont pop end } def
+/isovec [
+8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde
+8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis
+8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron
+8#220 /dotlessi 8#230 /oe 8#231 /OE
+8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling
+8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis
+8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot
+8#255 /endash 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus
+8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph
+8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine
+8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf
+8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute
+8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring
+8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute
+8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute
+8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve
+8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply
+8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex
+8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave
+8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring
+8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute
+8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute
+8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve
+8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide
+8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex
+8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def
+/Times-Roman /Times-Roman-iso isovec ReEncode
+ /DrawEllipse {
+ /endangle exch def
+ /startangle exch def
+ /yrad exch def
+ /xrad exch def
+ /y exch def
+ /x exch def
+ /savematrix mtrx currentmatrix def
+ x y tr xrad yrad sc 0 0 1 startangle endangle arc
+ closepath
+ savematrix setmatrix
+ } def
+
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+%%EndProlog
+
+$F2psBegin
+10 setmiterlimit
+n -1000 4776 m -1000 -1000 l 7264 -1000 l 7264 4776 l cp clip
+ 0.06000 0.06000 sc
+7.500 slw
+% Ellipse
+n 2175 2250 25 25 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
+
+% Ellipse
+n 4050 2700 25 25 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
+
+% Ellipse
+n 5475 1555 25 25 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
+
+/Times-Roman-iso ff 180.00 scf sf
+1950 2475 m
+gs 1 -1 sc (\(a\)) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+5500 1800 m
+gs 1 -1 sc (\(b\)) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+4200 2925 m
+gs 1 -1 sc (\(x\)) col0 sh gr
+% Polyline
+n 744 3590 m 819 3590 l gs col-1 s gr
+% Polyline
+n 6226 3590 m 6151 3590 l gs col-1 s gr
+% Polyline
+n 744 3062 m 819 3062 l gs col-1 s gr
+% Polyline
+n 6226 3062 m 6151 3062 l gs col-1 s gr
+% Polyline
+n 744 2535 m 819 2535 l gs col-1 s gr
+% Polyline
+n 6226 2535 m 6151 2535 l gs col-1 s gr
+% Polyline
+n 744 2007 m 819 2007 l gs col-1 s gr
+% Polyline
+n 6226 2007 m 6151 2007 l gs col-1 s gr
+% Polyline
+n 744 1479 m 819 1479 l gs col-1 s gr
+% Polyline
+n 6226 1479 m 6151 1479 l gs col-1 s gr
+% Polyline
+n 744 952 m 819 952 l gs col-1 s gr
+% Polyline
+n 6226 952 m 6151 952 l gs col-1 s gr
+% Polyline
+n 744 424 m 819 424 l gs col-1 s gr
+% Polyline
+n 6226 424 m 6151 424 l gs col-1 s gr
+% Polyline
+n 744 3590 m 744 3515 l gs col-1 s gr
+% Polyline
+n 744 424 m 744 499 l gs col-1 s gr
+% Polyline
+n 1658 3590 m 1658 3515 l gs col-1 s gr
+% Polyline
+n 1658 424 m 1658 499 l gs col-1 s gr
+% Polyline
+n 2571 3590 m 2571 3515 l gs col-1 s gr
+% Polyline
+n 2571 424 m 2571 499 l gs col-1 s gr
+% Polyline
+n 3485 3590 m 3485 3515 l gs col-1 s gr
+% Polyline
+n 3485 424 m 3485 499 l gs col-1 s gr
+% Polyline
+n 4399 3590 m 4399 3515 l gs col-1 s gr
+% Polyline
+n 4399 424 m 4399 499 l gs col-1 s gr
+% Polyline
+n 5312 3590 m 5312 3515 l gs col-1 s gr
+% Polyline
+n 5312 424 m 5312 499 l gs col-1 s gr
+% Polyline
+n 6226 3590 m 6226 3515 l gs col-1 s gr
+% Polyline
+n 6226 424 m 6226 499 l gs col-1 s gr
+% Polyline
+n 744 3590 m 6226 3590 l 6226 424 l 744 424 l 744 3590 l cp gs col-1 s gr
+% Polyline
+n 6074 561 m 6082 561 l gs col-1 s gr
+% Polyline
+n 744 424 m 799 519 l 855 612 l 910 703 l 965 792 l 1021 879 l
+ 1076 965 l 1132 1048 l 1187 1129 l 1242 1209 l 1298 1286 l
+ 1353 1362 l 1408 1436 l 1464 1507 l 1519 1577 l 1575 1645 l
+ 1630 1711 l 1685 1775 l 1741 1837 l 1796 1897 l 1851 1955 l
+ 1907 2011 l 1962 2066 l 2018 2118 l 2073 2168 l 2128 2217 l
+ 2184 2263 l 2239 2308 l 2294 2351 l 2350 2391 l 2405 2430 l
+ 2461 2467 l 2516 2502 l 2571 2535 l 2627 2566 l 2682 2595 l
+ 2737 2622 l 2793 2647 l 2848 2670 l 2904 2692 l 2959 2711 l
+ 3014 2728 l 3070 2744 l 3125 2758 l 3180 2769 l 3236 2779 l
+ 3291 2787 l 3347 2792 l 3402 2796 l 3457 2798 l 3513 2798 l
+ 3568 2796 l 3623 2792 l 3679 2787 l 3734 2779 l 3790 2769 l
+ 3845 2758 l 3900 2744 l 3956 2728 l 4011 2711 l 4066 2692 l
+ 4122 2670 l 4177 2647 l 4233 2622 l 4288 2595 l 4343 2566 l
+ 4399 2535 l 4454 2502 l 4509 2467 l 4565 2430 l 4620 2391 l
+ 4676 2351 l 4731 2308 l 4786 2263 l 4842 2217 l 4897 2168 l
+ 4952 2118 l 5008 2066 l 5063 2011 l 5119 1955 l 5174 1897 l
+ 5229 1837 l 5285 1775 l 5340 1711 l 5395 1645 l 5451 1577 l
+ 5506 1507 l 5562 1436 l 5617 1362 l 5672 1286 l 5728 1209 l
+ 5783 1129 l 5838 1048 l 5894 965 l 5949 879 l 6005 792 l
+ 6060 703 l 6115 612 l 6171 519 l 6226 424 l gs col-1 s gr
+/Times-Roman-iso ff 150.00 scf sf
+670 3652 m
+gs 1 -1 sc (0) dup sw pop neg 0 rm col-1 sh gr
+/Times-Roman-iso ff 150.00 scf sf
+670 3124 m
+gs 1 -1 sc (2) dup sw pop neg 0 rm col-1 sh gr
+/Times-Roman-iso ff 150.00 scf sf
+670 2597 m
+gs 1 -1 sc (4) dup sw pop neg 0 rm col-1 sh gr
+/Times-Roman-iso ff 150.00 scf sf
+670 2069 m
+gs 1 -1 sc (6) dup sw pop neg 0 rm col-1 sh gr
+/Times-Roman-iso ff 150.00 scf sf
+670 1541 m
+gs 1 -1 sc (8) dup sw pop neg 0 rm col-1 sh gr
+/Times-Roman-iso ff 150.00 scf sf
+670 1014 m
+gs 1 -1 sc (10) dup sw pop neg 0 rm col-1 sh gr
+/Times-Roman-iso ff 150.00 scf sf
+670 486 m
+gs 1 -1 sc (12) dup sw pop neg 0 rm col-1 sh gr
+/Times-Roman-iso ff 150.00 scf sf
+744 3776 m
+gs 1 -1 sc (-3) dup sw pop 2 div neg 0 rm col-1 sh gr
+/Times-Roman-iso ff 150.00 scf sf
+1658 3776 m
+gs 1 -1 sc (-2) dup sw pop 2 div neg 0 rm col-1 sh gr
+/Times-Roman-iso ff 150.00 scf sf
+2571 3776 m
+gs 1 -1 sc (-1) dup sw pop 2 div neg 0 rm col-1 sh gr
+/Times-Roman-iso ff 150.00 scf sf
+3485 3776 m
+gs 1 -1 sc (0) dup sw pop 2 div neg 0 rm col-1 sh gr
+/Times-Roman-iso ff 150.00 scf sf
+4399 3776 m
+gs 1 -1 sc (1) dup sw pop 2 div neg 0 rm col-1 sh gr
+/Times-Roman-iso ff 150.00 scf sf
+5312 3776 m
+gs 1 -1 sc (2) dup sw pop 2 div neg 0 rm col-1 sh gr
+/Times-Roman-iso ff 150.00 scf sf
+6226 3776 m
+gs 1 -1 sc (3) dup sw pop 2 div neg 0 rm col-1 sh gr
+$F2psEnd
+rs
+showpage
diff --git a/gsl-1.9/doc/min.texi b/gsl-1.9/doc/min.texi
new file mode 100644
index 0000000..9cd7962
--- /dev/null
+++ b/gsl-1.9/doc/min.texi
@@ -0,0 +1,400 @@
+@cindex optimization, see minimization
+@cindex maximization, see minimization
+@cindex minimization, one-dimensional
+@cindex finding minima
+@cindex nonlinear functions, minimization
+
+This chapter describes routines for finding minima of arbitrary
+one-dimensional functions. The library provides low level components
+for a variety of iterative minimizers and convergence tests. These can be
+combined by the user to achieve the desired solution, with full access
+to the intermediate steps of the algorithms. Each class of methods uses
+the same framework, so that you can switch between minimizers at runtime
+without needing to recompile your program. Each instance of a minimizer
+keeps track of its own state, allowing the minimizers to be used in
+multi-threaded programs.
+
+The header file @file{gsl_min.h} contains prototypes for the
+minimization functions and related declarations. To use the minimization
+algorithms to find the maximum of a function simply invert its sign.
+
+@menu
+* Minimization Overview::
+* Minimization Caveats::
+* Initializing the Minimizer::
+* Providing the function to minimize::
+* Minimization Iteration::
+* Minimization Stopping Parameters::
+* Minimization Algorithms::
+* Minimization Examples::
+* Minimization References and Further Reading::
+@end menu
+
+@node Minimization Overview
+@section Overview
+@cindex minimization, overview
+
+The minimization algorithms begin with a bounded region known to contain
+a minimum. The region is described by a lower bound @math{a} and an
+upper bound @math{b}, with an estimate of the location of the minimum
+@math{x}.
+
+@iftex
+@sp 1
+@center @image{min-interval,3.4in}
+@end iftex
+
+@noindent
+The value of the function at @math{x} must be less than the value of the
+function at the ends of the interval,
+@tex
+$$f(a) > f(x) < f(b)$$
+@end tex
+@ifinfo
+
+@example
+f(a) > f(x) < f(b)
+@end example
+
+@end ifinfo
+@noindent
+This condition guarantees that a minimum is contained somewhere within
+the interval. On each iteration a new point @math{x'} is selected using
+one of the available algorithms. If the new point is a better estimate
+of the minimum, i.e.@: where @math{f(x') < f(x)}, then the current
+estimate of the minimum @math{x} is updated. The new point also allows
+the size of the bounded interval to be reduced, by choosing the most
+compact set of points which satisfies the constraint @math{f(a) > f(x) <
+f(b)}. The interval is reduced until it encloses the true minimum to a
+desired tolerance. This provides a best estimate of the location of the
+minimum and a rigorous error estimate.
+
+Several bracketing algorithms are available within a single framework.
+The user provides a high-level driver for the algorithm, and the
+library provides the individual functions necessary for each of the
+steps. There are three main phases of the iteration. The steps are,
+
+@itemize @bullet
+@item
+initialize minimizer state, @var{s}, for algorithm @var{T}
+
+@item
+update @var{s} using the iteration @var{T}
+
+@item
+test @var{s} for convergence, and repeat iteration if necessary
+@end itemize
+
+@noindent
+The state for the minimizers is held in a @code{gsl_min_fminimizer}
+struct. The updating procedure uses only function evaluations (not
+derivatives).
+
+@node Minimization Caveats
+@section Caveats
+@cindex minimization, caveats
+
+Note that minimization functions can only search for one minimum at a
+time. When there are several minima in the search area, the first
+minimum to be found will be returned; however it is difficult to predict
+which of the minima this will be. @emph{In most cases, no error will be
+reported if you try to find a minimum in an area where there is more
+than one.}
+
+With all minimization algorithms it can be difficult to determine the
+location of the minimum to full numerical precision. The behavior of the
+function in the region of the minimum @math{x^*} can be approximated by
+a Taylor expansion,
+@tex
+$$
+y = f(x^*) + {1 \over 2} f''(x^*) (x - x^*)^2
+$$
+@end tex
+@ifinfo
+
+@example
+y = f(x^*) + (1/2) f''(x^*) (x - x^*)^2
+@end example
+
+@end ifinfo
+@noindent
+and the second term of this expansion can be lost when added to the
+first term at finite precision. This magnifies the error in locating
+@math{x^*}, making it proportional to @math{\sqrt \epsilon} (where
+@math{\epsilon} is the relative accuracy of the floating point numbers).
+For functions with higher order minima, such as @math{x^4}, the
+magnification of the error is correspondingly worse. The best that can
+be achieved is to converge to the limit of numerical accuracy in the
+function values, rather than the location of the minimum itself.
+
+@node Initializing the Minimizer
+@section Initializing the Minimizer
+
+@deftypefun {gsl_min_fminimizer *} gsl_min_fminimizer_alloc (const gsl_min_fminimizer_type * @var{T})
+This function returns a pointer to a newly allocated instance of a
+minimizer of type @var{T}. For example, the following code
+creates an instance of a golden section minimizer,
+
+@example
+const gsl_min_fminimizer_type * T
+ = gsl_min_fminimizer_goldensection;
+gsl_min_fminimizer * s
+ = gsl_min_fminimizer_alloc (T);
+@end example
+
+If there is insufficient memory to create the minimizer then the function
+returns a null pointer and the error handler is invoked with an error
+code of @code{GSL_ENOMEM}.
+@end deftypefun
+
+@deftypefun int gsl_min_fminimizer_set (gsl_min_fminimizer * @var{s}, gsl_function * @var{f}, double @var{x_minimum}, double @var{x_lower}, double @var{x_upper})
+This function sets, or resets, an existing minimizer @var{s} to use the
+function @var{f} and the initial search interval [@var{x_lower},
+@var{x_upper}], with a guess for the location of the minimum
+@var{x_minimum}.
+
+If the interval given does not contain a minimum, then the function
+returns an error code of @code{GSL_EINVAL}.
+@end deftypefun
+
+@deftypefun int gsl_min_fminimizer_set_with_values (gsl_min_fminimizer * @var{s}, gsl_function * @var{f}, double @var{x_minimum}, double @var{f_minimum}, double @var{x_lower}, double @var{f_lower}, double @var{x_upper}, double @var{f_upper})
+This function is equivalent to @code{gsl_min_fminimizer_set} but uses
+the values @var{f_minimum}, @var{f_lower} and @var{f_upper} instead of
+computing @code{f(x_minimum)}, @code{f(x_lower)} and @code{f(x_upper)}.
+@end deftypefun
+
+
+@deftypefun void gsl_min_fminimizer_free (gsl_min_fminimizer * @var{s})
+This function frees all the memory associated with the minimizer
+@var{s}.
+@end deftypefun
+
+@deftypefun {const char *} gsl_min_fminimizer_name (const gsl_min_fminimizer * @var{s})
+This function returns a pointer to the name of the minimizer. For example,
+
+@example
+printf ("s is a '%s' minimizer\n",
+ gsl_min_fminimizer_name (s));
+@end example
+
+@noindent
+would print something like @code{s is a 'brent' minimizer}.
+@end deftypefun
+
+@node Providing the function to minimize
+@section Providing the function to minimize
+@cindex minimization, providing a function to minimize
+
+You must provide a continuous function of one variable for the
+minimizers to operate on. In order to allow for general parameters the
+functions are defined by a @code{gsl_function} data type
+(@pxref{Providing the function to solve}).
+
+@node Minimization Iteration
+@section Iteration
+
+The following functions drive the iteration of each algorithm. Each
+function performs one iteration to update the state of any minimizer of the
+corresponding type. The same functions work for all minimizers so that
+different methods can be substituted at runtime without modifications to
+the code.
+
+@deftypefun int gsl_min_fminimizer_iterate (gsl_min_fminimizer * @var{s})
+This function performs a single iteration of the minimizer @var{s}. If the
+iteration encounters an unexpected problem then an error code will be
+returned,
+
+@table @code
+@item GSL_EBADFUNC
+the iteration encountered a singular point where the function evaluated
+to @code{Inf} or @code{NaN}.
+
+@item GSL_FAILURE
+the algorithm could not improve the current best approximation or
+bounding interval.
+@end table
+@end deftypefun
+
+The minimizer maintains a current best estimate of the position of the
+minimum at all times, and the current interval bounding the minimum.
+This information can be accessed with the following auxiliary functions,
+
+@deftypefun double gsl_min_fminimizer_x_minimum (const gsl_min_fminimizer * @var{s})
+This function returns the current estimate of the position of the
+minimum for the minimizer @var{s}.
+@end deftypefun
+
+@deftypefun double gsl_min_fminimizer_x_upper (const gsl_min_fminimizer * @var{s})
+@deftypefunx double gsl_min_fminimizer_x_lower (const gsl_min_fminimizer * @var{s})
+These functions return the current upper and lower bound of the interval
+for the minimizer @var{s}.
+@end deftypefun
+
+@deftypefun double gsl_min_fminimizer_f_minimum (const gsl_min_fminimizer * @var{s})
+@deftypefunx double gsl_min_fminimizer_f_upper (const gsl_min_fminimizer * @var{s})
+@deftypefunx double gsl_min_fminimizer_f_lower (const gsl_min_fminimizer * @var{s})
+These functions return the value of the function at the current estimate
+of the minimum and at the upper and lower bounds of the interval for the
+minimizer @var{s}.
+@end deftypefun
+
+@node Minimization Stopping Parameters
+@section Stopping Parameters
+@cindex minimization, stopping parameters
+
+A minimization procedure should stop when one of the following
+conditions is true:
+
+@itemize @bullet
+@item
+A minimum has been found to within the user-specified precision.
+
+@item
+A user-specified maximum number of iterations has been reached.
+
+@item
+An error has occurred.
+@end itemize
+
+@noindent
+The handling of these conditions is under user control. The function
+below allows the user to test the precision of the current result.
+
+@deftypefun int gsl_min_test_interval (double @var{x_lower}, double @var{x_upper}, double @var{epsabs}, double @var{epsrel})
+This function tests for the convergence of the interval [@var{x_lower},
+@var{x_upper}] with absolute error @var{epsabs} and relative error
+@var{epsrel}. The test returns @code{GSL_SUCCESS} if the following
+condition is achieved,
+@tex
+\beforedisplay
+$$
+|a - b| < \hbox{\it epsabs} + \hbox{\it epsrel\/}\, \min(|a|,|b|)
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+|a - b| < epsabs + epsrel min(|a|,|b|)
+@end example
+
+@end ifinfo
+@noindent
+when the interval @math{x = [a,b]} does not include the origin. If the
+interval includes the origin then @math{\min(|a|,|b|)} is replaced by
+zero (which is the minimum value of @math{|x|} over the interval). This
+ensures that the relative error is accurately estimated for minima close
+to the origin.
+
+This condition on the interval also implies that any estimate of the
+minimum @math{x_m} in the interval satisfies the same condition with respect
+to the true minimum @math{x_m^*},
+@tex
+\beforedisplay
+$$
+|x_m - x_m^*| < \hbox{\it epsabs} + \hbox{\it epsrel\/}\, x_m^*
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+|x_m - x_m^*| < epsabs + epsrel x_m^*
+@end example
+
+@end ifinfo
+@noindent
+assuming that the true minimum @math{x_m^*} is contained within the interval.
+@end deftypefun
+
+@comment ============================================================
+
+@node Minimization Algorithms
+@section Minimization Algorithms
+
+The minimization algorithms described in this section require an initial
+interval which is guaranteed to contain a minimum---if @math{a} and
+@math{b} are the endpoints of the interval and @math{x} is an estimate
+of the minimum then @math{f(a) > f(x) < f(b)}. This ensures that the
+function has at least one minimum somewhere in the interval. If a valid
+initial interval is used then these algorithm cannot fail, provided the
+function is well-behaved.
+
+@deffn {Minimizer} gsl_min_fminimizer_goldensection
+
+@cindex golden section algorithm for finding minima
+@cindex minimum finding, golden section algorithm
+
+The @dfn{golden section algorithm} is the simplest method of bracketing
+the minimum of a function. It is the slowest algorithm provided by the
+library, with linear convergence.
+
+On each iteration, the algorithm first compares the subintervals from
+the endpoints to the current minimum. The larger subinterval is divided
+in a golden section (using the famous ratio @math{(3-\sqrt 5)/2 =
+0.3189660}@dots{}) and the value of the function at this new point is
+calculated. The new value is used with the constraint @math{f(a') >
+f(x') < f(b')} to a select new interval containing the minimum, by
+discarding the least useful point. This procedure can be continued
+indefinitely until the interval is sufficiently small. Choosing the
+golden section as the bisection ratio can be shown to provide the
+fastest convergence for this type of algorithm.
+
+@end deffn
+
+@comment ============================================================
+
+@deffn {Minimizer} gsl_min_fminimizer_brent
+@cindex Brent's method for finding minima
+@cindex minimum finding, Brent's method
+
+The @dfn{Brent minimization algorithm} combines a parabolic
+interpolation with the golden section algorithm. This produces a fast
+algorithm which is still robust.
+
+The outline of the algorithm can be summarized as follows: on each
+iteration Brent's method approximates the function using an
+interpolating parabola through three existing points. The minimum of the
+parabola is taken as a guess for the minimum. If it lies within the
+bounds of the current interval then the interpolating point is accepted,
+and used to generate a smaller interval. If the interpolating point is
+not accepted then the algorithm falls back to an ordinary golden section
+step. The full details of Brent's method include some additional checks
+to improve convergence.
+@end deffn
+
+@comment ============================================================
+
+@node Minimization Examples
+@section Examples
+
+The following program uses the Brent algorithm to find the minimum of
+the function @math{f(x) = \cos(x) + 1}, which occurs at @math{x = \pi}.
+The starting interval is @math{(0,6)}, with an initial guess for the
+minimum of @math{2}.
+
+@example
+@verbatiminclude examples/min.c
+@end example
+
+@noindent
+Here are the results of the minimization procedure.
+
+@smallexample
+$ ./a.out
+@verbatiminclude examples/min.out
+@end smallexample
+
+@node Minimization References and Further Reading
+@section References and Further Reading
+
+Further information on Brent's algorithm is available in the following
+book,
+
+@itemize @asis
+@item
+Richard Brent, @cite{Algorithms for minimization without derivatives},
+Prentice-Hall (1973), republished by Dover in paperback (2002), ISBN
+0-486-41998-3.
+@end itemize
+
diff --git a/gsl-1.9/doc/montecarlo.texi b/gsl-1.9/doc/montecarlo.texi
new file mode 100644
index 0000000..0c3aabe
--- /dev/null
+++ b/gsl-1.9/doc/montecarlo.texi
@@ -0,0 +1,718 @@
+@cindex Monte Carlo integration
+@cindex stratified sampling in monte carlo integration
+This chapter describes routines for multidimensional Monte Carlo
+integration. These include the traditional Monte Carlo method and
+adaptive algorithms such as @sc{vegas} and @sc{miser} which use
+importance sampling and stratified sampling techniques. Each algorithm
+computes an estimate of a multidimensional definite integral of the
+form,
+@tex
+\beforedisplay
+$$
+I = \int_{x_l}^{x_u} dx\,\int_{y_l}^{y_u}dy\,... f(x,y,...)
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+I = \int_xl^xu dx \int_yl^yu dy ... f(x, y, ...)
+@end example
+
+@end ifinfo
+@noindent
+over a hypercubic region @math{((x_l,x_u)}, @math{(y_l,y_u), ...)} using
+a fixed number of function calls. The routines also provide a
+statistical estimate of the error on the result. This error estimate
+should be taken as a guide rather than as a strict error bound---random
+sampling of the region may not uncover all the important features
+of the function, resulting in an underestimate of the error.
+
+The functions are defined in separate header files for each routine,
+@code{gsl_monte_plain.h}, @file{gsl_monte_miser.h} and
+@file{gsl_monte_vegas.h}.
+
+@menu
+* Monte Carlo Interface::
+* PLAIN Monte Carlo::
+* MISER::
+* VEGAS::
+* Monte Carlo Examples::
+* Monte Carlo Integration References and Further Reading::
+@end menu
+
+@node Monte Carlo Interface
+@section Interface
+All of the Monte Carlo integration routines use the same general form of
+interface. There is an allocator to allocate memory for control
+variables and workspace, a routine to initialize those control
+variables, the integrator itself, and a function to free the space when
+done.
+
+Each integration function requires a random number generator to be
+supplied, and returns an estimate of the integral and its standard
+deviation. The accuracy of the result is determined by the number of
+function calls specified by the user. If a known level of accuracy is
+required this can be achieved by calling the integrator several times
+and averaging the individual results until the desired accuracy is
+obtained.
+
+Random sample points used within the Monte Carlo routines are always
+chosen strictly within the integration region, so that endpoint
+singularities are automatically avoided.
+
+The function to be integrated has its own datatype, defined in the
+header file @file{gsl_monte.h}.
+
+@deftp {Data Type} gsl_monte_function
+
+This data type defines a general function with parameters for Monte
+Carlo integration.
+
+@table @code
+@item double (* f) (double * @var{x}, size_t @var{dim}, void * @var{params})
+this function should return the value
+@c{$f(x,\hbox{\it params})$}
+@math{f(x,params)} for the argument @var{x} and parameters @var{params},
+where @var{x} is an array of size @var{dim} giving the coordinates of
+the point where the function is to be evaluated.
+
+@item size_t dim
+the number of dimensions for @var{x}.
+
+@item void * params
+a pointer to the parameters of the function.
+@end table
+@end deftp
+
+@noindent
+Here is an example for a quadratic function in two dimensions,
+@tex
+\beforedisplay
+$$
+f(x,y) = a x^2 + b x y + c y^2
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+f(x,y) = a x^2 + b x y + c y^2
+@end example
+
+@end ifinfo
+@noindent
+with @math{a = 3}, @math{b = 2}, @math{c = 1}. The following code
+defines a @code{gsl_monte_function} @code{F} which you could pass to an
+integrator:
+
+@example
+struct my_f_params @{ double a; double b; double c; @};
+
+double
+my_f (double x[], size_t dim, void * p) @{
+ struct my_f_params * fp = (struct my_f_params *)p;
+
+ if (dim != 2)
+ @{
+ fprintf (stderr, "error: dim != 2");
+ abort ();
+ @}
+
+ return fp->a * x[0] * x[0]
+ + fp->b * x[0] * x[1]
+ + fp->c * x[1] * x[1];
+@}
+
+gsl_monte_function F;
+struct my_f_params params = @{ 3.0, 2.0, 1.0 @};
+
+F.f = &my_f;
+F.dim = 2;
+F.params = &params;
+@end example
+
+@noindent
+The function @math{f(x)} can be evaluated using the following macro,
+
+@example
+#define GSL_MONTE_FN_EVAL(F,x)
+ (*((F)->f))(x,(F)->dim,(F)->params)
+@end example
+
+@node PLAIN Monte Carlo
+@section PLAIN Monte Carlo
+@cindex plain monte carlo
+The plain Monte Carlo algorithm samples points randomly from the
+integration region to estimate the integral and its error. Using this
+algorithm the estimate of the integral @math{E(f; N)} for @math{N}
+randomly distributed points @math{x_i} is given by,
+@tex
+\beforedisplay
+$$
+E(f; N) = V \langle f \rangle = {V \over N} \sum_i^N f(x_i)
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+E(f; N) = = V <f> = (V / N) \sum_i^N f(x_i)
+@end example
+
+@end ifinfo
+@noindent
+where @math{V} is the volume of the integration region. The error on
+this estimate @math{\sigma(E;N)} is calculated from the estimated
+variance of the mean,
+@tex
+\beforedisplay
+$$
+\sigma^2 (E; N) = {V \over N } \sum_i^N (f(x_i) - \langle f \rangle)^2.
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+\sigma^2 (E; N) = (V / N) \sum_i^N (f(x_i) - <f>)^2.
+@end example
+
+@end ifinfo
+@noindent
+For large @math{N} this variance decreases asymptotically as
+@math{\Var(f)/N}, where @math{\Var(f)} is the true variance of the
+function over the integration region. The error estimate itself should
+decrease as @c{$\sigma(f)/\sqrt{N}$}
+@math{\sigma(f)/\sqrt@{N@}}. The familiar law of errors
+decreasing as @c{$1/\sqrt{N}$}
+@math{1/\sqrt@{N@}} applies---to reduce the error by a
+factor of 10 requires a 100-fold increase in the number of sample
+points.
+
+The functions described in this section are declared in the header file
+@file{gsl_monte_plain.h}.
+
+@deftypefun {gsl_monte_plain_state *} gsl_monte_plain_alloc (size_t @var{dim})
+This function allocates and initializes a workspace for Monte Carlo
+integration in @var{dim} dimensions.
+@end deftypefun
+
+@deftypefun int gsl_monte_plain_init (gsl_monte_plain_state* @var{s})
+This function initializes a previously allocated integration state.
+This allows an existing workspace to be reused for different
+integrations.
+@end deftypefun
+
+@deftypefun int gsl_monte_plain_integrate (gsl_monte_function * @var{f}, double * @var{xl}, double * @var{xu}, size_t @var{dim}, size_t @var{calls}, gsl_rng * @var{r}, gsl_monte_plain_state * @var{s}, double * @var{result}, double * @var{abserr})
+This routines uses the plain Monte Carlo algorithm to integrate the
+function @var{f} over the @var{dim}-dimensional hypercubic region
+defined by the lower and upper limits in the arrays @var{xl} and
+@var{xu}, each of size @var{dim}. The integration uses a fixed number
+of function calls @var{calls}, and obtains random sampling points using
+the random number generator @var{r}. A previously allocated workspace
+@var{s} must be supplied. The result of the integration is returned in
+@var{result}, with an estimated absolute error @var{abserr}.
+@end deftypefun
+
+@deftypefun void gsl_monte_plain_free (gsl_monte_plain_state * @var{s})
+This function frees the memory associated with the integrator state
+@var{s}.
+@end deftypefun
+
+@node MISER
+@section MISER
+@cindex MISER monte carlo integration
+@cindex recursive stratified sampling, MISER
+
+The @sc{miser} algorithm of Press and Farrar is based on recursive
+stratified sampling. This technique aims to reduce the overall
+integration error by concentrating integration points in the regions of
+highest variance.
+
+The idea of stratified sampling begins with the observation that for two
+disjoint regions @math{a} and @math{b} with Monte Carlo estimates of the
+integral @math{E_a(f)} and @math{E_b(f)} and variances
+@math{\sigma_a^2(f)} and @math{\sigma_b^2(f)}, the variance
+@math{\Var(f)} of the combined estimate
+@c{$E(f) = {1\over 2} (E_a(f) + E_b(f))$}
+@math{E(f) = (1/2) (E_a(f) + E_b(f))}
+is given by,
+@tex
+\beforedisplay
+$$
+\Var(f) = {\sigma_a^2(f) \over 4 N_a} + {\sigma_b^2(f) \over 4 N_b}.
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+\Var(f) = (\sigma_a^2(f) / 4 N_a) + (\sigma_b^2(f) / 4 N_b).
+@end example
+
+@end ifinfo
+@noindent
+It can be shown that this variance is minimized by distributing the
+points such that,
+@tex
+\beforedisplay
+$$
+{N_a \over N_a+N_b} = {\sigma_a \over \sigma_a + \sigma_b}.
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+N_a / (N_a + N_b) = \sigma_a / (\sigma_a + \sigma_b).
+@end example
+
+@end ifinfo
+@noindent
+Hence the smallest error estimate is obtained by allocating sample
+points in proportion to the standard deviation of the function in each
+sub-region.
+
+The @sc{miser} algorithm proceeds by bisecting the integration region
+along one coordinate axis to give two sub-regions at each step. The
+direction is chosen by examining all @math{d} possible bisections and
+selecting the one which will minimize the combined variance of the two
+sub-regions. The variance in the sub-regions is estimated by sampling
+with a fraction of the total number of points available to the current
+step. The same procedure is then repeated recursively for each of the
+two half-spaces from the best bisection. The remaining sample points are
+allocated to the sub-regions using the formula for @math{N_a} and
+@math{N_b}. This recursive allocation of integration points continues
+down to a user-specified depth where each sub-region is integrated using
+a plain Monte Carlo estimate. These individual values and their error
+estimates are then combined upwards to give an overall result and an
+estimate of its error.
+
+The functions described in this section are declared in the header file
+@file{gsl_monte_miser.h}.
+
+@deftypefun {gsl_monte_miser_state *} gsl_monte_miser_alloc (size_t @var{dim})
+This function allocates and initializes a workspace for Monte Carlo
+integration in @var{dim} dimensions. The workspace is used to maintain
+the state of the integration.
+@end deftypefun
+
+@deftypefun int gsl_monte_miser_init (gsl_monte_miser_state* @var{s})
+This function initializes a previously allocated integration state.
+This allows an existing workspace to be reused for different
+integrations.
+@end deftypefun
+
+@deftypefun int gsl_monte_miser_integrate (gsl_monte_function * @var{f}, double * @var{xl}, double * @var{xu}, size_t @var{dim}, size_t @var{calls}, gsl_rng * @var{r}, gsl_monte_miser_state * @var{s}, double * @var{result}, double * @var{abserr})
+This routines uses the @sc{miser} Monte Carlo algorithm to integrate the
+function @var{f} over the @var{dim}-dimensional hypercubic region
+defined by the lower and upper limits in the arrays @var{xl} and
+@var{xu}, each of size @var{dim}. The integration uses a fixed number
+of function calls @var{calls}, and obtains random sampling points using
+the random number generator @var{r}. A previously allocated workspace
+@var{s} must be supplied. The result of the integration is returned in
+@var{result}, with an estimated absolute error @var{abserr}.
+@end deftypefun
+
+@deftypefun void gsl_monte_miser_free (gsl_monte_miser_state * @var{s})
+This function frees the memory associated with the integrator state
+@var{s}.
+@end deftypefun
+
+The @sc{miser} algorithm has several configurable parameters. The
+following variables can be accessed through the
+@code{gsl_monte_miser_state} struct,
+
+@deftypevar double estimate_frac
+This parameter specifies the fraction of the currently available number of
+function calls which are allocated to estimating the variance at each
+recursive step. The default value is 0.1.
+@end deftypevar
+
+@deftypevar size_t min_calls
+This parameter specifies the minimum number of function calls required
+for each estimate of the variance. If the number of function calls
+allocated to the estimate using @var{estimate_frac} falls below
+@var{min_calls} then @var{min_calls} are used instead. This ensures
+that each estimate maintains a reasonable level of accuracy. The
+default value of @var{min_calls} is @code{16 * dim}.
+@end deftypevar
+
+@deftypevar size_t min_calls_per_bisection
+This parameter specifies the minimum number of function calls required
+to proceed with a bisection step. When a recursive step has fewer calls
+available than @var{min_calls_per_bisection} it performs a plain Monte
+Carlo estimate of the current sub-region and terminates its branch of
+the recursion. The default value of this parameter is @code{32 *
+min_calls}.
+@end deftypevar
+
+@deftypevar double alpha
+This parameter controls how the estimated variances for the two
+sub-regions of a bisection are combined when allocating points. With
+recursive sampling the overall variance should scale better than
+@math{1/N}, since the values from the sub-regions will be obtained using
+a procedure which explicitly minimizes their variance. To accommodate
+this behavior the @sc{miser} algorithm allows the total variance to
+depend on a scaling parameter @math{\alpha},
+@tex
+\beforedisplay
+$$
+\Var(f) = {\sigma_a \over N_a^\alpha} + {\sigma_b \over N_b^\alpha}.
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+\Var(f) = @{\sigma_a \over N_a^\alpha@} + @{\sigma_b \over N_b^\alpha@}.
+@end example
+
+@end ifinfo
+@noindent
+The authors of the original paper describing @sc{miser} recommend the
+value @math{\alpha = 2} as a good choice, obtained from numerical
+experiments, and this is used as the default value in this
+implementation.
+@end deftypevar
+
+@deftypevar double dither
+This parameter introduces a random fractional variation of size
+@var{dither} into each bisection, which can be used to break the
+symmetry of integrands which are concentrated near the exact center of
+the hypercubic integration region. The default value of dither is zero,
+so no variation is introduced. If needed, a typical value of
+@var{dither} is 0.1.
+@end deftypevar
+
+@node VEGAS
+@section VEGAS
+@cindex VEGAS monte carlo integration
+@cindex importance sampling, VEGAS
+
+The @sc{vegas} algorithm of Lepage is based on importance sampling. It
+samples points from the probability distribution described by the
+function @math{|f|}, so that the points are concentrated in the regions
+that make the largest contribution to the integral.
+
+In general, if the Monte Carlo integral of @math{f} is sampled with
+points distributed according to a probability distribution described by
+the function @math{g}, we obtain an estimate @math{E_g(f; N)},
+@tex
+\beforedisplay
+$$
+E_g(f; N) = E(f/g; N)
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+E_g(f; N) = E(f/g; N)
+@end example
+
+@end ifinfo
+@noindent
+with a corresponding variance,
+@tex
+\beforedisplay
+$$
+\Var_g(f; N) = \Var(f/g; N).
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+\Var_g(f; N) = \Var(f/g; N).
+@end example
+
+@end ifinfo
+@noindent
+If the probability distribution is chosen as @math{g = |f|/I(|f|)} then
+it can be shown that the variance @math{V_g(f; N)} vanishes, and the
+error in the estimate will be zero. In practice it is not possible to
+sample from the exact distribution @math{g} for an arbitrary function, so
+importance sampling algorithms aim to produce efficient approximations
+to the desired distribution.
+
+The @sc{vegas} algorithm approximates the exact distribution by making a
+number of passes over the integration region while histogramming the
+function @math{f}. Each histogram is used to define a sampling
+distribution for the next pass. Asymptotically this procedure converges
+to the desired distribution. In order
+to avoid the number of histogram bins growing like @math{K^d} the
+probability distribution is approximated by a separable function:
+@c{$g(x_1, x_2,\ldots) = g_1(x_1) g_2(x_2)\ldots$}
+@math{g(x_1, x_2, ...) = g_1(x_1) g_2(x_2) ...}
+so that the number of bins required is only @math{Kd}.
+This is equivalent to locating the peaks of the function from the
+projections of the integrand onto the coordinate axes. The efficiency
+of @sc{vegas} depends on the validity of this assumption. It is most
+efficient when the peaks of the integrand are well-localized. If an
+integrand can be rewritten in a form which is approximately separable
+this will increase the efficiency of integration with @sc{vegas}.
+
+@sc{vegas} incorporates a number of additional features, and combines both
+stratified sampling and importance sampling. The integration region is
+divided into a number of ``boxes'', with each box getting a fixed
+number of points (the goal is 2). Each box can then have a fractional
+number of bins, but if the ratio of bins-per-box is less than two, Vegas switches to a
+kind variance reduction (rather than importance sampling).
+
+
+@deftypefun {gsl_monte_vegas_state *} gsl_monte_vegas_alloc (size_t @var{dim})
+This function allocates and initializes a workspace for Monte Carlo
+integration in @var{dim} dimensions. The workspace is used to maintain
+the state of the integration.
+@end deftypefun
+
+@deftypefun int gsl_monte_vegas_init (gsl_monte_vegas_state* @var{s})
+This function initializes a previously allocated integration state.
+This allows an existing workspace to be reused for different
+integrations.
+@end deftypefun
+
+@deftypefun int gsl_monte_vegas_integrate (gsl_monte_function * @var{f}, double * @var{xl}, double * @var{xu}, size_t @var{dim}, size_t @var{calls}, gsl_rng * @var{r}, gsl_monte_vegas_state * @var{s}, double * @var{result}, double * @var{abserr})
+This routines uses the @sc{vegas} Monte Carlo algorithm to integrate the
+function @var{f} over the @var{dim}-dimensional hypercubic region
+defined by the lower and upper limits in the arrays @var{xl} and
+@var{xu}, each of size @var{dim}. The integration uses a fixed number
+of function calls @var{calls}, and obtains random sampling points using
+the random number generator @var{r}. A previously allocated workspace
+@var{s} must be supplied. The result of the integration is returned in
+@var{result}, with an estimated absolute error @var{abserr}. The result
+and its error estimate are based on a weighted average of independent
+samples. The chi-squared per degree of freedom for the weighted average
+is returned via the state struct component, @var{s->chisq}, and must be
+consistent with 1 for the weighted average to be reliable.
+@end deftypefun
+
+@deftypefun void gsl_monte_vegas_free (gsl_monte_vegas_state * @var{s})
+This function frees the memory associated with the integrator state
+@var{s}.
+@end deftypefun
+
+The @sc{vegas} algorithm computes a number of independent estimates of the
+integral internally, according to the @code{iterations} parameter
+described below, and returns their weighted average. Random sampling of
+the integrand can occasionally produce an estimate where the error is
+zero, particularly if the function is constant in some regions. An
+estimate with zero error causes the weighted average to break down and
+must be handled separately. In the original Fortran implementations of
+@sc{vegas} the error estimate is made non-zero by substituting a small
+value (typically @code{1e-30}). The implementation in GSL differs from
+this and avoids the use of an arbitrary constant---it either assigns
+the value a weight which is the average weight of the preceding
+estimates or discards it according to the following procedure,
+
+@table @asis
+@item current estimate has zero error, weighted average has finite error
+
+The current estimate is assigned a weight which is the average weight of
+the preceding estimates.
+
+@item current estimate has finite error, previous estimates had zero error
+
+The previous estimates are discarded and the weighted averaging
+procedure begins with the current estimate.
+
+@item current estimate has zero error, previous estimates had zero error
+
+The estimates are averaged using the arithmetic mean, but no error is computed.
+@end table
+
+The @sc{vegas} algorithm is highly configurable. The following variables
+can be accessed through the @code{gsl_monte_vegas_state} struct,
+
+@deftypevar double result
+@deftypevarx double sigma
+These parameters contain the raw value of the integral @var{result} and
+its error @var{sigma} from the last iteration of the algorithm.
+@end deftypevar
+
+@deftypevar double chisq
+This parameter gives the chi-squared per degree of freedom for the
+weighted estimate of the integral. The value of @var{chisq} should be
+close to 1. A value of @var{chisq} which differs significantly from 1
+indicates that the values from different iterations are inconsistent.
+In this case the weighted error will be under-estimated, and further
+iterations of the algorithm are needed to obtain reliable results.
+@end deftypevar
+
+@deftypevar double alpha
+The parameter @code{alpha} controls the stiffness of the rebinning
+algorithm. It is typically set between one and two. A value of zero
+prevents rebinning of the grid. The default value is 1.5.
+@end deftypevar
+
+@deftypevar size_t iterations
+The number of iterations to perform for each call to the routine. The
+default value is 5 iterations.
+@end deftypevar
+
+@deftypevar int stage
+Setting this determines the @dfn{stage} of the calculation. Normally,
+@code{stage = 0} which begins with a new uniform grid and empty weighted
+average. Calling vegas with @code{stage = 1} retains the grid from the
+previous run but discards the weighted average, so that one can ``tune''
+the grid using a relatively small number of points and then do a large
+run with @code{stage = 1} on the optimized grid. Setting @code{stage =
+2} keeps the grid and the weighted average from the previous run, but
+may increase (or decrease) the number of histogram bins in the grid
+depending on the number of calls available. Choosing @code{stage = 3}
+enters at the main loop, so that nothing is changed, and is equivalent
+to performing additional iterations in a previous call.
+@end deftypevar
+
+@deftypevar int mode
+The possible choices are @code{GSL_VEGAS_MODE_IMPORTANCE},
+@code{GSL_VEGAS_MODE_STRATIFIED}, @code{GSL_VEGAS_MODE_IMPORTANCE_ONLY}.
+This determines whether @sc{vegas} will use importance sampling or
+stratified sampling, or whether it can pick on its own. In low
+dimensions @sc{vegas} uses strict stratified sampling (more precisely,
+stratified sampling is chosen if there are fewer than 2 bins per box).
+@end deftypevar
+
+@deftypevar int verbose
+@deftypevarx {FILE *} ostream
+These parameters set the level of information printed by @sc{vegas}. All
+information is written to the stream @var{ostream}. The default setting
+of @var{verbose} is @code{-1}, which turns off all output. A
+@var{verbose} value of @code{0} prints summary information about the
+weighted average and final result, while a value of @code{1} also
+displays the grid coordinates. A value of @code{2} prints information
+from the rebinning procedure for each iteration.
+@end deftypevar
+
+@node Monte Carlo Examples
+@section Examples
+
+The example program below uses the Monte Carlo routines to estimate the
+value of the following 3-dimensional integral from the theory of random
+walks,
+@tex
+\beforedisplay
+$$
+I = \int_{-\pi}^{+\pi} {dk_x \over 2\pi}
+ \int_{-\pi}^{+\pi} {dk_y \over 2\pi}
+ \int_{-\pi}^{+\pi} {dk_z \over 2\pi}
+ { 1 \over (1 - \cos(k_x)\cos(k_y)\cos(k_z))}.
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+I = \int_@{-pi@}^@{+pi@} @{dk_x/(2 pi)@}
+ \int_@{-pi@}^@{+pi@} @{dk_y/(2 pi)@}
+ \int_@{-pi@}^@{+pi@} @{dk_z/(2 pi)@}
+ 1 / (1 - cos(k_x)cos(k_y)cos(k_z)).
+@end example
+
+@end ifinfo
+@noindent
+The analytic value of this integral can be shown to be @math{I =
+\Gamma(1/4)^4/(4 \pi^3) = 1.393203929685676859...}. The integral gives
+the mean time spent at the origin by a random walk on a body-centered
+cubic lattice in three dimensions.
+
+For simplicity we will compute the integral over the region
+@math{(0,0,0)} to @math{(\pi,\pi,\pi)} and multiply by 8 to obtain the
+full result. The integral is slowly varying in the middle of the region
+but has integrable singularities at the corners @math{(0,0,0)},
+@math{(0,\pi,\pi)}, @math{(\pi,0,\pi)} and @math{(\pi,\pi,0)}. The
+Monte Carlo routines only select points which are strictly within the
+integration region and so no special measures are needed to avoid these
+singularities.
+
+@smallexample
+@verbatiminclude examples/monte.c
+@end smallexample
+
+@noindent
+With 500,000 function calls the plain Monte Carlo algorithm achieves a
+fractional error of 0.6%. The estimated error @code{sigma} is
+consistent with the actual error, and the computed result differs from
+the true result by about one standard deviation,
+
+@example
+plain ==================
+result = 1.385867
+sigma = 0.007938
+exact = 1.393204
+error = -0.007337 = 0.9 sigma
+@end example
+
+@noindent
+The @sc{miser} algorithm reduces the error by a factor of two, and also
+correctly estimates the error,
+
+@example
+miser ==================
+result = 1.390656
+sigma = 0.003743
+exact = 1.393204
+error = -0.002548 = 0.7 sigma
+@end example
+
+@noindent
+In the case of the @sc{vegas} algorithm the program uses an initial
+warm-up run of 10,000 function calls to prepare, or ``warm up'', the grid.
+This is followed by a main run with five iterations of 100,000 function
+calls. The chi-squared per degree of freedom for the five iterations are
+checked for consistency with 1, and the run is repeated if the results
+have not converged. In this case the estimates are consistent on the
+first pass.
+
+@example
+vegas warm-up ==================
+result = 1.386925
+sigma = 0.002651
+exact = 1.393204
+error = -0.006278 = 2 sigma
+converging...
+result = 1.392957 sigma = 0.000452 chisq/dof = 1.1
+vegas final ==================
+result = 1.392957
+sigma = 0.000452
+exact = 1.393204
+error = -0.000247 = 0.5 sigma
+@end example
+
+@noindent
+If the value of @code{chisq} had differed significantly from 1 it would
+indicate inconsistent results, with a correspondingly underestimated
+error. The final estimate from @sc{vegas} (using a similar number of
+function calls) is significantly more accurate than the other two
+algorithms.
+
+@node Monte Carlo Integration References and Further Reading
+@section References and Further Reading
+
+The @sc{miser} algorithm is described in the following article by Press
+and Farrar,
+
+@itemize @asis
+@item
+W.H. Press, G.R. Farrar, @cite{Recursive Stratified Sampling for
+Multidimensional Monte Carlo Integration},
+Computers in Physics, v4 (1990), pp190--195.
+@end itemize
+
+@noindent
+The @sc{vegas} algorithm is described in the following papers,
+
+@itemize @asis
+@item
+G.P. Lepage,
+@cite{A New Algorithm for Adaptive Multidimensional Integration},
+Journal of Computational Physics 27, 192--203, (1978)
+
+@item
+G.P. Lepage,
+@cite{VEGAS: An Adaptive Multi-dimensional Integration Program},
+Cornell preprint CLNS 80-447, March 1980
+@end itemize
+
diff --git a/gsl-1.9/doc/multifit.texi b/gsl-1.9/doc/multifit.texi
new file mode 100644
index 0000000..6467b67
--- /dev/null
+++ b/gsl-1.9/doc/multifit.texi
@@ -0,0 +1,645 @@
+@cindex nonlinear least squares fitting
+@cindex least squares fitting, nonlinear
+
+This chapter describes functions for multidimensional nonlinear
+least-squares fitting. The library provides low level components for a
+variety of iterative solvers and convergence tests. These can be
+combined by the user to achieve the desired solution, with full access
+to the intermediate steps of the iteration. Each class of methods uses
+the same framework, so that you can switch between solvers at runtime
+without needing to recompile your program. Each instance of a solver
+keeps track of its own state, allowing the solvers to be used in
+multi-threaded programs.
+
+The header file @file{gsl_multifit_nlin.h} contains prototypes for the
+multidimensional nonlinear fitting functions and related declarations.
+
+@menu
+* Overview of Nonlinear Least-Squares Fitting::
+* Initializing the Nonlinear Least-Squares Solver::
+* Providing the Function to be Minimized::
+* Iteration of the Minimization Algorithm::
+* Search Stopping Parameters for Minimization Algorithms::
+* Minimization Algorithms using Derivatives::
+* Minimization Algorithms without Derivatives::
+* Computing the covariance matrix of best fit parameters::
+* Example programs for Nonlinear Least-Squares Fitting::
+* References and Further Reading for Nonlinear Least-Squares Fitting::
+@end menu
+
+@node Overview of Nonlinear Least-Squares Fitting
+@section Overview
+@cindex nonlinear least squares fitting, overview
+
+The problem of multidimensional nonlinear least-squares fitting requires
+the minimization of the squared residuals of @math{n} functions,
+@math{f_i}, in @math{p} parameters, @math{x_i},
+@tex
+\beforedisplay
+$$
+\Phi(x) = {1 \over 2} || F(x) ||^2
+ = {1 \over 2} \sum_{i=1}^{n} f_i (x_1, \dots, x_p)^2
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+\Phi(x) = (1/2) || F(x) ||^2
+ = (1/2) \sum_@{i=1@}^@{n@} f_i(x_1, ..., x_p)^2
+@end example
+
+@end ifinfo
+@noindent
+All algorithms proceed from an initial guess using the linearization,
+@tex
+\beforedisplay
+$$
+\psi(p) = || F(x+p) || \approx || F(x) + J p\, ||
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+\psi(p) = || F(x+p) || ~=~ || F(x) + J p ||
+@end example
+
+@end ifinfo
+@noindent
+where @math{x} is the initial point, @math{p} is the proposed step
+and @math{J} is the
+Jacobian matrix @c{$J_{ij} = \partial f_i / \partial x_j$}
+@math{J_@{ij@} = d f_i / d x_j}.
+Additional strategies are used to enlarge the region of convergence.
+These include requiring a decrease in the norm @math{||F||} on each
+step or using a trust region to avoid steps which fall outside the linear
+regime.
+
+To perform a weighted least-squares fit of a nonlinear model
+@math{Y(x,t)} to data (@math{t_i}, @math{y_i}) with independent gaussian
+errors @math{\sigma_i}, use function components of the following form,
+@tex
+\beforedisplay
+$$
+f_i = {(Y(x, t_i) - y_i) \over \sigma_i}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+f_i = (Y(x, t_i) - y_i) / \sigma_i
+@end example
+
+@end ifinfo
+@noindent
+Note that the model parameters are denoted by @math{x} in this chapter
+since the non-linear least-squares algorithms are described
+geometrically (i.e. finding the minimum of a surface). The
+independent variable of any data to be fitted is denoted by @math{t}.
+
+With the definition above the Jacobian is
+@c{$J_{ij} = (1 / \sigma_i) \partial Y_i / \partial x_j$}
+@math{J_@{ij@} =(1 / \sigma_i) d Y_i / d x_j}, where @math{Y_i = Y(x,t_i)}.
+
+
+@node Initializing the Nonlinear Least-Squares Solver
+@section Initializing the Solver
+
+@deftypefun {gsl_multifit_fsolver *} gsl_multifit_fsolver_alloc (const gsl_multifit_fsolver_type * @var{T}, size_t @var{n}, size_t @var{p})
+This function returns a pointer to a newly allocated instance of a
+solver of type @var{T} for @var{n} observations and @var{p} parameters.
+The number of observations @var{n} must be greater than or equal to
+parameters @var{p}.
+
+If there is insufficient memory to create the solver then the function
+returns a null pointer and the error handler is invoked with an error
+code of @code{GSL_ENOMEM}.
+@end deftypefun
+
+@deftypefun {gsl_multifit_fdfsolver *} gsl_multifit_fdfsolver_alloc (const gsl_multifit_fdfsolver_type * @var{T}, size_t @var{n}, size_t @var{p})
+This function returns a pointer to a newly allocated instance of a
+derivative solver of type @var{T} for @var{n} observations and @var{p}
+parameters. For example, the following code creates an instance of a
+Levenberg-Marquardt solver for 100 data points and 3 parameters,
+
+@example
+const gsl_multifit_fdfsolver_type * T
+ = gsl_multifit_fdfsolver_lmder;
+gsl_multifit_fdfsolver * s
+ = gsl_multifit_fdfsolver_alloc (T, 100, 3);
+@end example
+
+@noindent
+The number of observations @var{n} must be greater than or equal to
+parameters @var{p}.
+
+If there is insufficient memory to create the solver then the function
+returns a null pointer and the error handler is invoked with an error
+code of @code{GSL_ENOMEM}.
+@end deftypefun
+
+@deftypefun int gsl_multifit_fsolver_set (gsl_multifit_fsolver * @var{s}, gsl_multifit_function * @var{f}, gsl_vector * @var{x})
+This function initializes, or reinitializes, an existing solver @var{s}
+to use the function @var{f} and the initial guess @var{x}.
+@end deftypefun
+
+@deftypefun int gsl_multifit_fdfsolver_set (gsl_multifit_fdfsolver * @var{s}, gsl_multifit_function_fdf * @var{fdf}, gsl_vector * @var{x})
+This function initializes, or reinitializes, an existing solver @var{s}
+to use the function and derivative @var{fdf} and the initial guess
+@var{x}.
+@end deftypefun
+
+@deftypefun void gsl_multifit_fsolver_free (gsl_multifit_fsolver * @var{s})
+@deftypefunx void gsl_multifit_fdfsolver_free (gsl_multifit_fdfsolver * @var{s})
+These functions free all the memory associated with the solver @var{s}.
+@end deftypefun
+
+@deftypefun {const char *} gsl_multifit_fsolver_name (const gsl_multifit_fsolver * @var{s})
+@deftypefunx {const char *} gsl_multifit_fdfsolver_name (const gsl_multifit_fdfsolver * @var{s})
+These functions return a pointer to the name of the solver. For example,
+
+@example
+printf ("s is a '%s' solver\n",
+ gsl_multifit_fdfsolver_name (s));
+@end example
+
+@noindent
+would print something like @code{s is a 'lmder' solver}.
+@end deftypefun
+
+@node Providing the Function to be Minimized
+@section Providing the Function to be Minimized
+
+You must provide @math{n} functions of @math{p} variables for the
+minimization algorithms to operate on. In order to allow for
+arbitrary parameters the functions are defined by the following data
+types:
+
+@deftp {Data Type} gsl_multifit_function
+This data type defines a general system of functions with arbitrary parameters.
+
+@table @code
+@item int (* f) (const gsl_vector * @var{x}, void * @var{params}, gsl_vector * @var{f})
+this function should store the vector result
+@c{$f(x,\hbox{\it params})$}
+@math{f(x,params)} in @var{f} for argument @var{x} and arbitrary parameters @var{params},
+returning an appropriate error code if the function cannot be computed.
+
+@item size_t n
+the number of functions, i.e. the number of components of the
+vector @var{f}.
+
+@item size_t p
+the number of independent variables, i.e. the number of components of
+the vector @var{x}.
+
+@item void * params
+a pointer to the arbitrary parameters of the function.
+@end table
+@end deftp
+
+@deftp {Data Type} gsl_multifit_function_fdf
+This data type defines a general system of functions with arbitrary parameters and
+the corresponding Jacobian matrix of derivatives,
+
+@table @code
+@item int (* f) (const gsl_vector * @var{x}, void * @var{params}, gsl_vector * @var{f})
+this function should store the vector result
+@c{$f(x,\hbox{\it params})$}
+@math{f(x,params)} in @var{f} for argument @var{x} and arbitrary parameters @var{params},
+returning an appropriate error code if the function cannot be computed.
+
+@item int (* df) (const gsl_vector * @var{x}, void * @var{params}, gsl_matrix * @var{J})
+this function should store the @var{n}-by-@var{p} matrix result
+@c{$J_{ij} = \partial f_i(x,\hbox{\it params}) / \partial x_j$}
+@math{J_ij = d f_i(x,params) / d x_j} in @var{J} for argument @var{x}
+and arbitrary parameters @var{params}, returning an appropriate error code if the
+function cannot be computed.
+
+@item int (* fdf) (const gsl_vector * @var{x}, void * @var{params}, gsl_vector * @var{f}, gsl_matrix * @var{J})
+This function should set the values of the @var{f} and @var{J} as above,
+for arguments @var{x} and arbitrary parameters @var{params}. This function
+provides an optimization of the separate functions for @math{f(x)} and
+@math{J(x)}---it is always faster to compute the function and its
+derivative at the same time.
+
+@item size_t n
+the number of functions, i.e. the number of components of the
+vector @var{f}.
+
+@item size_t p
+the number of independent variables, i.e. the number of components of
+the vector @var{x}.
+
+@item void * params
+a pointer to the arbitrary parameters of the function.
+@end table
+@end deftp
+
+Note that when fitting a non-linear model against experimental data,
+the data is passed to the functions above using the
+@var{params} argument and the trial best-fit parameters through the
+@var{x} argument.
+
+@node Iteration of the Minimization Algorithm
+@section Iteration
+
+The following functions drive the iteration of each algorithm. Each
+function performs one iteration to update the state of any solver of the
+corresponding type. The same functions work for all solvers so that
+different methods can be substituted at runtime without modifications to
+the code.
+
+@deftypefun int gsl_multifit_fsolver_iterate (gsl_multifit_fsolver * @var{s})
+@deftypefunx int gsl_multifit_fdfsolver_iterate (gsl_multifit_fdfsolver * @var{s})
+These functions perform a single iteration of the solver @var{s}. If
+the iteration encounters an unexpected problem then an error code will
+be returned. The solver maintains a current estimate of the best-fit
+parameters at all times.
+@end deftypefun
+
+The solver struct @var{s} contains the following entries, which can
+be used to track the progress of the solution:
+
+@table @code
+@item gsl_vector * x
+The current position.
+
+@item gsl_vector * f
+The function value at the current position.
+
+@item gsl_vector * dx
+The difference between the current position and the previous position,
+i.e. the last step, taken as a vector.
+
+@item gsl_matrix * J
+The Jacobian matrix at the current position (for the
+@code{gsl_multifit_fdfsolver} struct only)
+@end table
+
+The best-fit information also can be accessed with the following
+auxiliary functions,
+
+@deftypefun {gsl_vector *} gsl_multifit_fsolver_position (const gsl_multifit_fsolver * @var{s})
+@deftypefunx {gsl_vector *} gsl_multifit_fdfsolver_position (const gsl_multifit_fdfsolver * @var{s})
+These functions return the current position (i.e. best-fit parameters)
+@code{s->x} of the solver @var{s}.
+@end deftypefun
+
+@node Search Stopping Parameters for Minimization Algorithms
+@section Search Stopping Parameters
+@cindex nonlinear fitting, stopping parameters
+
+A minimization procedure should stop when one of the following conditions is
+true:
+
+@itemize @bullet
+@item
+A minimum has been found to within the user-specified precision.
+
+@item
+A user-specified maximum number of iterations has been reached.
+
+@item
+An error has occurred.
+@end itemize
+
+@noindent
+The handling of these conditions is under user control. The functions
+below allow the user to test the current estimate of the best-fit
+parameters in several standard ways.
+
+@deftypefun int gsl_multifit_test_delta (const gsl_vector * @var{dx}, const gsl_vector * @var{x}, double @var{epsabs}, double @var{epsrel})
+
+This function tests for the convergence of the sequence by comparing the
+last step @var{dx} with the absolute error @var{epsabs} and relative
+error @var{epsrel} to the current position @var{x}. The test returns
+@code{GSL_SUCCESS} if the following condition is achieved,
+@tex
+\beforedisplay
+$$
+|dx_i| < \hbox{\it epsabs} + \hbox{\it epsrel\/}\, |x_i|
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+|dx_i| < epsabs + epsrel |x_i|
+@end example
+
+@end ifinfo
+@noindent
+for each component of @var{x} and returns @code{GSL_CONTINUE} otherwise.
+@end deftypefun
+
+@cindex residual, in nonlinear systems of equations
+@deftypefun int gsl_multifit_test_gradient (const gsl_vector * @var{g}, double @var{epsabs})
+This function tests the residual gradient @var{g} against the absolute
+error bound @var{epsabs}. Mathematically, the gradient should be
+exactly zero at the minimum. The test returns @code{GSL_SUCCESS} if the
+following condition is achieved,
+@tex
+\beforedisplay
+$$
+\sum_i |g_i| < \hbox{\it epsabs}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+\sum_i |g_i| < epsabs
+@end example
+
+@end ifinfo
+@noindent
+and returns @code{GSL_CONTINUE} otherwise. This criterion is suitable
+for situations where the precise location of the minimum, @math{x},
+is unimportant provided a value can be found where the gradient is small
+enough.
+@end deftypefun
+
+
+@deftypefun int gsl_multifit_gradient (const gsl_matrix * @var{J}, const gsl_vector * @var{f}, gsl_vector * @var{g})
+This function computes the gradient @var{g} of @math{\Phi(x) = (1/2)
+||F(x)||^2} from the Jacobian matrix @math{J} and the function values
+@var{f}, using the formula @math{g = J^T f}.
+@end deftypefun
+
+@node Minimization Algorithms using Derivatives
+@section Minimization Algorithms using Derivatives
+
+The minimization algorithms described in this section make use of both
+the function and its derivative. They require an initial guess for the
+location of the minimum. There is no absolute guarantee of
+convergence---the function must be suitable for this technique and the
+initial guess must be sufficiently close to the minimum for it to work.
+
+@comment ============================================================
+@cindex Levenberg-Marquardt algorithms
+@deffn {Derivative Solver} gsl_multifit_fdfsolver_lmsder
+@cindex LMDER algorithm
+@cindex MINPACK, minimization algorithms
+This is a robust and efficient version of the Levenberg-Marquardt
+algorithm as implemented in the scaled @sc{lmder} routine in
+@sc{minpack}. Minpack was written by Jorge J. Mor@'e, Burton S. Garbow
+and Kenneth E. Hillstrom.
+
+The algorithm uses a generalized trust region to keep each step under
+control. In order to be accepted a proposed new position @math{x'} must
+satisfy the condition @math{|D (x' - x)| < \delta}, where @math{D} is a
+diagonal scaling matrix and @math{\delta} is the size of the trust
+region. The components of @math{D} are computed internally, using the
+column norms of the Jacobian to estimate the sensitivity of the residual
+to each component of @math{x}. This improves the behavior of the
+algorithm for badly scaled functions.
+
+On each iteration the algorithm attempts to minimize the linear system
+@math{|F + J p|} subject to the constraint @math{|D p| < \Delta}. The
+solution to this constrained linear system is found using the
+Levenberg-Marquardt method.
+
+The proposed step is now tested by evaluating the function at the
+resulting point, @math{x'}. If the step reduces the norm of the
+function sufficiently, and follows the predicted behavior of the
+function within the trust region, then it is accepted and the size of the
+trust region is increased. If the proposed step fails to improve the
+solution, or differs significantly from the expected behavior within
+the trust region, then the size of the trust region is decreased and
+another trial step is computed.
+
+The algorithm also monitors the progress of the solution and returns an
+error if the changes in the solution are smaller than the machine
+precision. The possible error codes are,
+
+@table @code
+@item GSL_ETOLF
+the decrease in the function falls below machine precision
+
+@item GSL_ETOLX
+the change in the position vector falls below machine precision
+
+@item GSL_ETOLG
+the norm of the gradient, relative to the norm of the function, falls
+below machine precision
+@end table
+
+@noindent
+These error codes indicate that further iterations will be unlikely to
+change the solution from its current value.
+
+@end deffn
+
+@deffn {Derivative Solver} gsl_multifit_fdfsolver_lmder
+This is an unscaled version of the @sc{lmder} algorithm. The elements of the
+diagonal scaling matrix @math{D} are set to 1. This algorithm may be
+useful in circumstances where the scaled version of @sc{lmder} converges too
+slowly, or the function is already scaled appropriately.
+@end deffn
+
+@node Minimization Algorithms without Derivatives
+@section Minimization Algorithms without Derivatives
+
+There are no algorithms implemented in this section at the moment.
+
+@node Computing the covariance matrix of best fit parameters
+@section Computing the covariance matrix of best fit parameters
+@cindex best-fit parameters, covariance
+@cindex least squares, covariance of best-fit parameters
+@cindex covariance matrix, nonlinear fits
+
+@deftypefun int gsl_multifit_covar (const gsl_matrix * @var{J}, double @var{epsrel}, gsl_matrix * @var{covar})
+This function uses the Jacobian matrix @var{J} to compute the covariance
+matrix of the best-fit parameters, @var{covar}. The parameter
+@var{epsrel} is used to remove linear-dependent columns when @var{J} is
+rank deficient.
+
+The covariance matrix is given by,
+@tex
+\beforedisplay
+$$
+C = (J^T J)^{-1}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+covar = (J^T J)^@{-1@}
+@end example
+
+@end ifinfo
+@noindent
+and is computed by QR decomposition of J with column-pivoting. Any
+columns of @math{R} which satisfy
+@tex
+\beforedisplay
+$$
+|R_{kk}| \leq epsrel |R_{11}|
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+|R_@{kk@}| <= epsrel |R_@{11@}|
+@end example
+
+@end ifinfo
+@noindent
+are considered linearly-dependent and are excluded from the covariance
+matrix (the corresponding rows and columns of the covariance matrix are
+set to zero).
+
+If the minimisation uses the weighted least-squares function
+@math{f_i = (Y(x, t_i) - y_i) / \sigma_i} then the covariance
+matrix above gives the statistical error on the best-fit parameters
+resulting from the gaussian errors @math{\sigma_i} on
+the underlying data @math{y_i}. This can be verified from the relation
+@math{\delta f = J \delta c} and the fact that the fluctuations in @math{f}
+from the data @math{y_i} are normalised by @math{\sigma_i} and
+so satisfy @c{$\langle \delta f \delta f^T \rangle = I$}
+@math{<\delta f \delta f^T> = I}.
+
+For an unweighted least-squares function @math{f_i = (Y(x, t_i) -
+y_i)} the covariance matrix above should be multiplied by the variance
+of the residuals about the best-fit @math{\sigma^2 = \sum (y_i - Y(x,t_i))^2 / (n-p)}
+to give the variance-covariance
+matrix @math{\sigma^2 C}. This estimates the statistical error on the
+best-fit parameters from the scatter of the underlying data.
+
+For more information about covariance matrices see @ref{Fitting Overview}.
+@end deftypefun
+
+@comment ============================================================
+
+@node Example programs for Nonlinear Least-Squares Fitting
+@section Examples
+
+The following example program fits a weighted exponential model with
+background to experimental data, @math{Y = A \exp(-\lambda t) + b}. The
+first part of the program sets up the functions @code{expb_f} and
+@code{expb_df} to calculate the model and its Jacobian. The appropriate
+fitting function is given by,
+@tex
+\beforedisplay
+$$
+f_i = ((A \exp(-\lambda t_i) + b) - y_i)/\sigma_i
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+f_i = ((A \exp(-\lambda t_i) + b) - y_i)/\sigma_i
+@end example
+
+@end ifinfo
+@noindent
+where we have chosen @math{t_i = i}. The Jacobian matrix @math{J} is
+the derivative of these functions with respect to the three parameters
+(@math{A}, @math{\lambda}, @math{b}). It is given by,
+@tex
+\beforedisplay
+$$
+J_{ij} = {\partial f_i \over \partial x_j}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+J_@{ij@} = d f_i / d x_j
+@end example
+
+@end ifinfo
+@noindent
+where @math{x_0 = A}, @math{x_1 = \lambda} and @math{x_2 = b}.
+
+@example
+@verbatiminclude examples/expfit.c
+@end example
+
+@noindent
+The main part of the program sets up a Levenberg-Marquardt solver and
+some simulated random data. The data uses the known parameters
+(1.0,5.0,0.1) combined with gaussian noise (standard deviation = 0.1)
+over a range of 40 timesteps. The initial guess for the parameters is
+chosen as (0.0, 1.0, 0.0).
+
+@example
+@verbatiminclude examples/nlfit.c
+@end example
+
+@noindent
+The iteration terminates when the change in x is smaller than 0.0001, as
+both an absolute and relative change. Here are the results of running
+the program:
+
+@smallexample
+iter: 0 x=1.00000000 0.00000000 0.00000000 |f(x)|=117.349
+status=success
+iter: 1 x=1.64659312 0.01814772 0.64659312 |f(x)|=76.4578
+status=success
+iter: 2 x=2.85876037 0.08092095 1.44796363 |f(x)|=37.6838
+status=success
+iter: 3 x=4.94899512 0.11942928 1.09457665 |f(x)|=9.58079
+status=success
+iter: 4 x=5.02175572 0.10287787 1.03388354 |f(x)|=5.63049
+status=success
+iter: 5 x=5.04520433 0.10405523 1.01941607 |f(x)|=5.44398
+status=success
+iter: 6 x=5.04535782 0.10404906 1.01924871 |f(x)|=5.44397
+chisq/dof = 0.800996
+A = 5.04536 +/- 0.06028
+lambda = 0.10405 +/- 0.00316
+b = 1.01925 +/- 0.03782
+status = success
+@end smallexample
+
+@noindent
+The approximate values of the parameters are found correctly, and the
+chi-squared value indicates a good fit (the chi-squared per degree of
+freedom is approximately 1). In this case the errors on the parameters
+can be estimated from the square roots of the diagonal elements of the
+covariance matrix.
+
+If the chi-squared value shows a poor fit (i.e. @c{$\chi^2/(n-p) \gg 1$}
+@math{chi^2/dof >> 1}) then the error estimates obtained from the
+covariance matrix will be too small. In the example program the error estimates
+are multiplied by @c{$\sqrt{\chi^2/(n-p)}$}
+@math{\sqrt@{\chi^2/dof@}} in this case, a common way of increasing the
+errors for a poor fit. Note that a poor fit will result from the use
+an inappropriate model, and the scaled error estimates may then
+be outside the range of validity for gaussian errors.
+
+@iftex
+@sp 1
+@center @image{fit-exp,3.4in}
+@end iftex
+
+@node References and Further Reading for Nonlinear Least-Squares Fitting
+@section References and Further Reading
+
+The @sc{minpack} algorithm is described in the following article,
+
+@itemize @asis
+@item
+J.J. Mor@'e, @cite{The Levenberg-Marquardt Algorithm: Implementation and
+Theory}, Lecture Notes in Mathematics, v630 (1978), ed G. Watson.
+@end itemize
+
+@noindent
+The following paper is also relevant to the algorithms described in this
+section,
+
+@itemize @asis
+@item
+J.J. Mor@'e, B.S. Garbow, K.E. Hillstrom, ``Testing Unconstrained
+Optimization Software'', ACM Transactions on Mathematical Software, Vol
+7, No 1 (1981), p 17--41.
+@end itemize
+
diff --git a/gsl-1.9/doc/multimin.eps b/gsl-1.9/doc/multimin.eps
new file mode 100644
index 0000000..9db3034
--- /dev/null
+++ b/gsl-1.9/doc/multimin.eps
@@ -0,0 +1,778 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: minplot.eps
+%%Creator: gnuplot 3.5 (pre 3.6) patchlevel beta 347
+%%CreationDate: Thu Oct 25 17:40:53 2001
+%%DocumentFonts: (atend)
+%%BoundingBox: 50 50 301 302
+%%Orientation: Portrait
+%%EndComments
+/gnudict 120 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+/vshift -46 def
+/dl {10 mul} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke gnulinewidth 2 mul setlinewidth } def
+/AL { stroke gnulinewidth 2 div setlinewidth } def
+/UL { gnulinewidth mul /userlinewidth exch def } def
+/PL { stroke userlinewidth setlinewidth } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 dl 2 dl] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 1 0 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
+/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/Pnt { stroke [] 0 setdash
+ gsave 1 setlinecap M 0 0 V stroke grestore } def
+/Dia { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt } def
+/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt } def
+/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt } def
+/Star { 2 copy Pls Crs } def
+/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill } def
+/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill } def
+/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt } def
+/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill } def
+/Pent { stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt } def
+/PentF { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore } def
+/Circle { stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt } def
+/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
+/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def
+/C1 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C2 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C3 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C4 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C5 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc } bind def
+/C6 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C7 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C8 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C9 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C11 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C12 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C13 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C14 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc } bind def
+/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath } bind def
+/Square { dup Rec } bind def
+/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
+/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
+/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
+/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
+/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill
+ Bsquare } bind def
+/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
+/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare } bind def
+/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare } bind def
+/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
+/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare } bind def
+/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
+/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
+/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
+/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
+/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
+/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
+/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
+/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
+/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
+/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
+/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
+/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
+/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
+/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
+/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
+/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
+/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
+/DiaE { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke } def
+/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke } def
+/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke } def
+/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke } def
+/PentE { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore } def
+/CircE { stroke [] 0 setdash
+ hpt 0 360 arc stroke } def
+/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def
+/DiaW { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke } def
+/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke } def
+/TriUW { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke } def
+/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke } def
+/PentW { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore } def
+/CircW { stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke } def
+/BoxFill { gsave Rec 1 setgray fill grestore } def
+end
+%%EndProlog
+gnudict begin
+gsave
+50 50 translate
+0.050 0.050 scale
+0 setgray
+newpath
+(Helvetica) findfont 140 scalefont setfont
+1.000 UL
+LTb
+252 280 M
+63 0 V
+4724 0 R
+-63 0 V
+168 280 M
+(0) Rshow
+252 854 M
+63 0 V
+4724 0 R
+-63 0 V
+168 854 M
+(1) Rshow
+252 1428 M
+63 0 V
+4724 0 R
+-63 0 V
+-4808 0 R
+(2) Rshow
+252 2002 M
+63 0 V
+4724 0 R
+-63 0 V
+-4808 0 R
+(3) Rshow
+252 2576 M
+63 0 V
+4724 0 R
+-63 0 V
+-4808 0 R
+(4) Rshow
+252 3150 M
+63 0 V
+4724 0 R
+-63 0 V
+-4808 0 R
+(5) Rshow
+252 3724 M
+63 0 V
+4724 0 R
+-63 0 V
+-4808 0 R
+(6) Rshow
+252 4298 M
+63 0 V
+4724 0 R
+-63 0 V
+-4808 0 R
+(7) Rshow
+252 4872 M
+63 0 V
+4724 0 R
+-63 0 V
+-4808 0 R
+(8) Rshow
+252 280 M
+0 63 V
+0 4529 R
+0 -63 V
+252 140 M
+(0) Cshow
+850 280 M
+0 63 V
+0 4529 R
+0 -63 V
+850 140 M
+(1) Cshow
+1449 280 M
+0 63 V
+0 4529 R
+0 -63 V
+0 -4669 R
+(2) Cshow
+2047 280 M
+0 63 V
+0 4529 R
+0 -63 V
+0 -4669 R
+(3) Cshow
+2646 280 M
+0 63 V
+0 4529 R
+0 -63 V
+0 -4669 R
+(4) Cshow
+3244 280 M
+0 63 V
+0 4529 R
+0 -63 V
+0 -4669 R
+(5) Cshow
+3842 280 M
+0 63 V
+0 4529 R
+0 -63 V
+0 -4669 R
+(6) Cshow
+4441 280 M
+0 63 V
+0 4529 R
+0 -63 V
+0 -4669 R
+(7) Cshow
+5039 280 M
+0 63 V
+0 4529 R
+0 -63 V
+0 -4669 R
+(8) Cshow
+1.000 UL
+LTb
+252 280 M
+4787 0 V
+0 4592 V
+-4787 0 V
+252 280 L
+1.000 UP
+1.000 UL
+LT0
+3242 4293 M
+-5 -11 V
+-9 -21 V
+-17 -43 V
+-36 -85 V
+-71 -171 V
+2962 3621 L
+2677 2939 L
+2108 1575 L
+1958 1215 L
+-395 76 V
+772 1443 L
+78 -15 V
+3242 4293 Pls
+3237 4282 Pls
+3228 4261 Pls
+3211 4218 Pls
+3175 4133 Pls
+3104 3962 Pls
+2962 3621 Pls
+2677 2939 Pls
+2108 1575 Pls
+1958 1215 Pls
+1563 1291 Pls
+772 1443 Pls
+850 1428 Pls
+1.000 UL
+LT1
+1020 1817 M
+-59 10 V
+-59 5 V
+-61 2 V
+-60 -3 V
+-60 -7 V
+-58 -11 V
+-56 -14 V
+-54 -19 V
+-51 -22 V
+-47 -26 V
+-44 -28 V
+-38 -32 V
+-34 -33 V
+-29 -37 V
+-23 -37 V
+-18 -40 V
+-11 -40 V
+-6 -41 V
+1 -41 V
+7 -40 V
+13 -40 V
+18 -39 V
+24 -38 V
+30 -36 V
+35 -33 V
+40 -31 V
+44 -28 V
+48 -25 V
+52 -21 V
+54 -18 V
+57 -14 V
+58 -10 V
+60 -6 V
+60 -2 V
+61 2 V
+59 7 V
+59 10 V
+56 15 V
+55 18 V
+51 22 V
+47 25 V
+44 28 V
+39 31 V
+35 34 V
+29 36 V
+24 37 V
+18 40 V
+12 40 V
+6 41 V
+0 40 V
+-6 41 V
+-12 40 V
+-18 40 V
+-24 37 V
+-29 36 V
+-35 34 V
+-39 31 V
+-44 28 V
+-47 25 V
+-51 22 V
+-55 18 V
+-56 15 V
+-59 10 V
+-59 7 V
+-61 2 V
+-60 -2 V
+-60 -6 V
+-58 -10 V
+-57 -14 V
+-54 -18 V
+-52 -21 V
+-48 -25 V
+-44 -28 V
+-40 -31 V
+-35 -33 V
+-30 -36 V
+-24 -38 V
+-18 -39 V
+-13 -40 V
+-7 -40 V
+-1 -41 V
+6 -41 V
+11 -40 V
+18 -40 V
+23 -37 V
+29 -37 V
+34 -33 V
+38 -32 V
+44 -28 V
+47 -26 V
+51 -22 V
+54 -19 V
+56 -14 V
+58 -11 V
+60 -7 V
+60 -3 V
+61 2 V
+59 5 V
+59 10 V
+1.000 UL
+LT2
+1096 1992 M
+-85 14 V
+-86 8 V
+-88 2 V
+-87 -4 V
+-87 -10 V
+-84 -15 V
+-82 -22 V
+-78 -27 V
+-74 -32 V
+-68 -37 V
+-25 -16 V
+0 -850 R
+38 -24 V
+70 -36 V
+75 -31 V
+79 -26 V
+82 -20 V
+85 -15 V
+86 -8 V
+88 -3 V
+87 3 V
+87 9 V
+84 16 V
+82 20 V
+79 27 V
+74 31 V
+69 37 V
+63 41 V
+57 45 V
+50 49 V
+42 52 V
+35 54 V
+26 57 V
+18 58 V
+8 59 V
+0 60 V
+-8 59 V
+-18 58 V
+-26 57 V
+-35 54 V
+-42 52 V
+-50 49 V
+-57 45 V
+-63 41 V
+-69 37 V
+-74 31 V
+-79 27 V
+-82 20 V
+-84 16 V
+-87 9 V
+-87 3 V
+-88 -3 V
+-86 -8 V
+-85 -15 V
+-82 -20 V
+-79 -26 V
+-75 -31 V
+-70 -36 V
+-38 -24 V
+0 -850 R
+25 -16 V
+68 -37 V
+74 -32 V
+78 -27 V
+82 -22 V
+84 -15 V
+87 -10 V
+87 -4 V
+88 2 V
+86 8 V
+85 14 V
+1.000 UL
+LT3
+1202 2235 M
+-121 20 V
+-125 12 V
+-125 3 V
+-125 -6 V
+583 2250 L
+462 2227 L
+345 2197 L
+-93 -32 V
+252 691 M
+4 -2 V
+368 652 L
+486 623 L
+608 603 L
+732 590 L
+125 -4 V
+125 5 V
+124 13 V
+121 22 V
+117 30 V
+112 38 V
+106 45 V
+99 52 V
+91 59 V
+81 64 V
+72 70 V
+60 74 V
+49 79 V
+38 81 V
+25 83 V
+13 85 V
+0 84 V
+-13 85 V
+-25 83 V
+-38 81 V
+-49 79 V
+-60 74 V
+-72 70 V
+-81 64 V
+-91 59 V
+-99 52 V
+-106 45 V
+-112 38 V
+-117 30 V
+-121 22 V
+-124 13 V
+-125 5 V
+-125 -4 V
+608 2253 L
+486 2233 L
+368 2204 L
+256 2167 L
+-4 -2 V
+252 691 M
+93 -32 V
+462 629 L
+583 606 L
+706 592 L
+125 -6 V
+125 3 V
+125 12 V
+121 20 V
+1.000 UL
+LT4
+1351 2576 M
+-173 28 V
+-177 17 V
+-178 4 V
+-178 -8 V
+470 2597 L
+298 2565 L
+-46 -12 V
+252 303 M
+80 -19 V
+21 -4 V
+992 0 R
+41 7 V
+167 43 V
+159 53 V
+151 65 V
+141 74 V
+129 83 V
+115 92 V
+102 100 V
+86 105 V
+70 112 V
+53 115 V
+36 118 V
+18 121 V
+0 120 V
+-18 121 V
+-36 118 V
+-53 115 V
+-70 112 V
+-86 105 V
+-102 100 V
+-115 92 V
+-129 83 V
+-141 74 V
+-151 65 V
+-159 53 V
+-167 43 V
+-173 31 V
+-176 18 V
+-178 7 V
+-178 -5 V
+505 2602 L
+332 2572 L
+-80 -19 V
+252 303 M
+46 -12 V
+59 -11 V
+994 0 R
+1.000 UL
+LT5
+1560 3056 M
+-245 40 V
+-251 24 V
+-252 6 V
+560 3114 L
+310 3086 L
+-58 -11 V
+2693 280 M
+140 112 V
+144 140 V
+122 151 V
+100 157 V
+75 164 V
+51 168 V
+25 170 V
+0 172 V
+-25 170 V
+-51 168 V
+-75 164 V
+-100 157 V
+-122 151 V
+-144 140 V
+-164 131 V
+-183 118 V
+-199 106 V
+-214 91 V
+-227 76 V
+-236 60 V
+-245 44 V
+-249 26 V
+-253 10 V
+-252 -8 V
+361 3093 L
+252 3074 L
+1.000 UL
+LT6
+1855 3731 M
+-348 57 V
+-354 32 V
+-357 9 V
+439 3813 L
+252 3792 L
+3955 280 M
+76 94 V
+140 223 V
+107 231 V
+72 238 V
+36 241 V
+0 242 V
+-36 241 V
+-72 238 V
+-107 231 V
+-140 223 V
+-173 212 V
+-204 200 V
+-232 184 V
+-258 168 V
+-282 148 V
+-303 129 V
+-320 108 V
+-335 85 V
+-346 62 V
+-353 38 V
+-356 13 V
+512 3818 L
+252 3792 L
+1.000 UL
+LT7
+2270 4684 M
+-491 81 V
+-501 46 V
+-505 12 V
+269 4801 L
+-17 -2 V
+5039 3282 M
+-223 219 V
+-328 260 V
+-366 237 V
+-399 211 V
+-428 182 V
+-453 152 V
+-473 121 V
+-489 87 V
+-499 54 V
+-505 19 V
+371 4808 L
+252 4796 L
+stroke
+grestore
+end
+showpage
+%%Trailer
+%%DocumentFonts: Helvetica
diff --git a/gsl-1.9/doc/multimin.texi b/gsl-1.9/doc/multimin.texi
new file mode 100644
index 0000000..4eb1ae8
--- /dev/null
+++ b/gsl-1.9/doc/multimin.texi
@@ -0,0 +1,752 @@
+@cindex minimization, multidimensional
+
+This chapter describes routines for finding minima of arbitrary
+multidimensional functions. The library provides low level components
+for a variety of iterative minimizers and convergence tests. These can
+be combined by the user to achieve the desired solution, while providing
+full access to the intermediate steps of the algorithms. Each class of
+methods uses the same framework, so that you can switch between
+minimizers at runtime without needing to recompile your program. Each
+instance of a minimizer keeps track of its own state, allowing the
+minimizers to be used in multi-threaded programs. The minimization
+algorithms can be used to maximize a function by inverting its sign.
+
+The header file @file{gsl_multimin.h} contains prototypes for the
+minimization functions and related declarations.
+
+@menu
+* Multimin Overview::
+* Multimin Caveats::
+* Initializing the Multidimensional Minimizer::
+* Providing a function to minimize::
+* Multimin Iteration::
+* Multimin Stopping Criteria::
+* Multimin Algorithms::
+* Multimin Examples::
+* Multimin References and Further Reading::
+@end menu
+
+@node Multimin Overview
+@section Overview
+
+The problem of multidimensional minimization requires finding a point
+@math{x} such that the scalar function,
+@tex
+\beforedisplay
+$$
+f(x_1, \dots, x_n)
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+f(x_1, @dots{}, x_n)
+@end example
+
+@end ifinfo
+@noindent
+takes a value which is lower than at any neighboring point. For smooth
+functions the gradient @math{g = \nabla f} vanishes at the minimum. In
+general there are no bracketing methods available for the
+minimization of @math{n}-dimensional functions. The algorithms
+proceed from an initial guess using a search algorithm which attempts
+to move in a downhill direction.
+
+Algorithms making use of the gradient of the function perform a
+one-dimensional line minimisation along this direction until the lowest
+point is found to a suitable tolerance. The search direction is then
+updated with local information from the function and its derivatives,
+and the whole process repeated until the true @math{n}-dimensional
+minimum is found.
+
+The Nelder-Mead Simplex algorithm applies a different strategy. It
+maintains @math{n+1} trial parameter vectors as the vertices of a
+@math{n}-dimensional simplex. In each iteration step it tries to
+improve the worst vertex by a simple geometrical transformation until
+the size of the simplex falls below a given tolerance.
+
+Both types of algorithms use a standard framework. The user provides a
+high-level driver for the algorithms, and the library provides the
+individual functions necessary for each of the steps. There are three
+main phases of the iteration. The steps are,
+
+@itemize @bullet
+@item
+initialize minimizer state, @var{s}, for algorithm @var{T}
+
+@item
+update @var{s} using the iteration @var{T}
+
+@item
+test @var{s} for convergence, and repeat iteration if necessary
+@end itemize
+
+@noindent
+Each iteration step consists either of an improvement to the
+line-minimisation in the current direction or an update to the search
+direction itself. The state for the minimizers is held in a
+@code{gsl_multimin_fdfminimizer} struct or a
+@code{gsl_multimin_fminimizer} struct.
+
+@node Multimin Caveats
+@section Caveats
+@cindex Multimin, caveats
+
+Note that the minimization algorithms can only search for one local
+minimum at a time. When there are several local minima in the search
+area, the first minimum to be found will be returned; however it is
+difficult to predict which of the minima this will be. In most cases,
+no error will be reported if you try to find a local minimum in an area
+where there is more than one.
+
+It is also important to note that the minimization algorithms find local
+minima; there is no way to determine whether a minimum is a global
+minimum of the function in question.
+
+@node Initializing the Multidimensional Minimizer
+@section Initializing the Multidimensional Minimizer
+
+The following function initializes a multidimensional minimizer. The
+minimizer itself depends only on the dimension of the problem and the
+algorithm and can be reused for different problems.
+
+@deftypefun {gsl_multimin_fdfminimizer *} gsl_multimin_fdfminimizer_alloc (const gsl_multimin_fdfminimizer_type * @var{T}, size_t @var{n})
+@deftypefunx {gsl_multimin_fminimizer *} gsl_multimin_fminimizer_alloc (const gsl_multimin_fminimizer_type * @var{T}, size_t @var{n})
+This function returns a pointer to a newly allocated instance of a
+minimizer of type @var{T} for an @var{n}-dimension function. If there
+is insufficient memory to create the minimizer then the function returns
+a null pointer and the error handler is invoked with an error code of
+@code{GSL_ENOMEM}.
+@end deftypefun
+
+@deftypefun int gsl_multimin_fdfminimizer_set (gsl_multimin_fdfminimizer * @var{s}, gsl_multimin_function_fdf * @var{fdf}, const gsl_vector * @var{x}, double @var{step_size}, double @var{tol})
+This function initializes the minimizer @var{s} to minimize the function
+@var{fdf} starting from the initial point @var{x}. The size of the
+first trial step is given by @var{step_size}. The accuracy of the line
+minimization is specified by @var{tol}. The precise meaning of this
+parameter depends on the method used. Typically the line minimization
+is considered successful if the gradient of the function @math{g} is
+orthogonal to the current search direction @math{p} to a relative
+accuracy of @var{tol}, where @c{$p\cdot g < tol |p| |g|$}
+@math{dot(p,g) < tol |p| |g|}. A @var{tol} value of 0.1 is
+suitable for most purposes, since line minimization only needs to
+be carried out approximately. Note that setting @var{tol} to zero will
+force the use of ``exact'' line-searches, which are extremely expensive.
+
+@deftypefunx int gsl_multimin_fminimizer_set (gsl_multimin_fminimizer * @var{s}, gsl_multimin_function * @var{f}, const gsl_vector * @var{x}, const gsl_vector * @var{step_size})
+This function initializes the minimizer @var{s} to minimize the function
+@var{f}, starting from the initial point
+@var{x}. The size of the initial trial steps is given in vector
+@var{step_size}. The precise meaning of this parameter depends on the
+method used.
+@end deftypefun
+
+@deftypefun void gsl_multimin_fdfminimizer_free (gsl_multimin_fdfminimizer * @var{s})
+@deftypefunx void gsl_multimin_fminimizer_free (gsl_multimin_fminimizer * @var{s})
+This function frees all the memory associated with the minimizer
+@var{s}.
+@end deftypefun
+
+@deftypefun {const char *} gsl_multimin_fdfminimizer_name (const gsl_multimin_fdfminimizer * @var{s})
+@deftypefunx {const char *} gsl_multimin_fminimizer_name (const gsl_multimin_fminimizer * @var{s})
+This function returns a pointer to the name of the minimizer. For example,
+
+@example
+printf ("s is a '%s' minimizer\n",
+ gsl_multimin_fdfminimizer_name (s));
+@end example
+
+@noindent
+would print something like @code{s is a 'conjugate_pr' minimizer}.
+@end deftypefun
+
+@node Providing a function to minimize
+@section Providing a function to minimize
+
+You must provide a parametric function of @math{n} variables for the
+minimizers to operate on. You may also need to provide a routine which
+calculates the gradient of the function and a third routine which
+calculates both the function value and the gradient together. In order
+to allow for general parameters the functions are defined by the
+following data types:
+
+@deftp {Data Type} gsl_multimin_function_fdf
+This data type defines a general function of @math{n} variables with
+parameters and the corresponding gradient vector of derivatives,
+
+@table @code
+@item double (* f) (const gsl_vector * @var{x}, void * @var{params})
+this function should return the result
+@c{$f(x,\hbox{\it params})$}
+@math{f(x,params)} for argument @var{x} and parameters @var{params}.
+
+@item void (* df) (const gsl_vector * @var{x}, void * @var{params}, gsl_vector * @var{g})
+this function should store the @var{n}-dimensional gradient
+@c{$g_i = \partial f(x,\hbox{\it params}) / \partial x_i$}
+@math{g_i = d f(x,params) / d x_i} in the vector @var{g} for argument @var{x}
+and parameters @var{params}, returning an appropriate error code if the
+function cannot be computed.
+
+@item void (* fdf) (const gsl_vector * @var{x}, void * @var{params}, double * f, gsl_vector * @var{g})
+This function should set the values of the @var{f} and @var{g} as above,
+for arguments @var{x} and parameters @var{params}. This function
+provides an optimization of the separate functions for @math{f(x)} and
+@math{g(x)}---it is always faster to compute the function and its
+derivative at the same time.
+
+@item size_t n
+the dimension of the system, i.e. the number of components of the
+vectors @var{x}.
+
+@item void * params
+a pointer to the parameters of the function.
+@end table
+@end deftp
+@deftp {Data Type} gsl_multimin_function
+This data type defines a general function of @math{n} variables with
+parameters,
+
+@table @code
+@item double (* f) (const gsl_vector * @var{x}, void * @var{params})
+this function should return the result
+@c{$f(x,\hbox{\it params})$}
+@math{f(x,params)} for argument @var{x} and parameters @var{params}.
+
+@item size_t n
+the dimension of the system, i.e. the number of components of the
+vectors @var{x}.
+
+@item void * params
+a pointer to the parameters of the function.
+@end table
+@end deftp
+
+@noindent
+The following example function defines a simple paraboloid with two
+parameters,
+
+@example
+/* Paraboloid centered on (dp[0],dp[1]) */
+
+double
+my_f (const gsl_vector *v, void *params)
+@{
+ double x, y;
+ double *dp = (double *)params;
+
+ x = gsl_vector_get(v, 0);
+ y = gsl_vector_get(v, 1);
+
+ return 10.0 * (x - dp[0]) * (x - dp[0]) +
+ 20.0 * (y - dp[1]) * (y - dp[1]) + 30.0;
+@}
+
+/* The gradient of f, df = (df/dx, df/dy). */
+void
+my_df (const gsl_vector *v, void *params,
+ gsl_vector *df)
+@{
+ double x, y;
+ double *dp = (double *)params;
+
+ x = gsl_vector_get(v, 0);
+ y = gsl_vector_get(v, 1);
+
+ gsl_vector_set(df, 0, 20.0 * (x - dp[0]));
+ gsl_vector_set(df, 1, 40.0 * (y - dp[1]));
+@}
+
+/* Compute both f and df together. */
+void
+my_fdf (const gsl_vector *x, void *params,
+ double *f, gsl_vector *df)
+@{
+ *f = my_f(x, params);
+ my_df(x, params, df);
+@}
+@end example
+
+@noindent
+The function can be initialized using the following code,
+
+@example
+gsl_multimin_function_fdf my_func;
+
+double p[2] = @{ 1.0, 2.0 @}; /* center at (1,2) */
+
+my_func.f = &my_f;
+my_func.df = &my_df;
+my_func.fdf = &my_fdf;
+my_func.n = 2;
+my_func.params = (void *)p;
+@end example
+
+@node Multimin Iteration
+@section Iteration
+
+The following function drives the iteration of each algorithm. The
+function performs one iteration to update the state of the minimizer.
+The same function works for all minimizers so that different methods can
+be substituted at runtime without modifications to the code.
+
+@deftypefun int gsl_multimin_fdfminimizer_iterate (gsl_multimin_fdfminimizer * @var{s})
+@deftypefunx int gsl_multimin_fminimizer_iterate (gsl_multimin_fminimizer * @var{s})
+These functions perform a single iteration of the minimizer @var{s}. If
+the iteration encounters an unexpected problem then an error code will
+be returned.
+@end deftypefun
+
+@noindent
+The minimizer maintains a current best estimate of the minimum at all
+times. This information can be accessed with the following auxiliary
+functions,
+
+@deftypefun {gsl_vector *} gsl_multimin_fdfminimizer_x (const gsl_multimin_fdfminimizer * @var{s})
+@deftypefunx {gsl_vector *} gsl_multimin_fminimizer_x (const gsl_multimin_fminimizer * @var{s})
+@deftypefunx double gsl_multimin_fdfminimizer_minimum (const gsl_multimin_fdfminimizer * @var{s})
+@deftypefunx double gsl_multimin_fminimizer_minimum (const gsl_multimin_fminimizer * @var{s})
+@deftypefunx {gsl_vector *} gsl_multimin_fdfminimizer_gradient (const gsl_multimin_fdfminimizer * @var{s})
+@deftypefunx double gsl_multimin_fminimizer_size (const gsl_multimin_fminimizer * @var{s})
+These functions return the current best estimate of the location of the
+minimum, the value of the function at that point, its gradient,
+and minimizer specific characteristic size for the minimizer @var{s}.
+@end deftypefun
+
+@deftypefun int gsl_multimin_fdfminimizer_restart (gsl_multimin_fdfminimizer * @var{s})
+This function resets the minimizer @var{s} to use the current point as a
+new starting point.
+@end deftypefun
+
+@node Multimin Stopping Criteria
+@section Stopping Criteria
+
+A minimization procedure should stop when one of the following
+conditions is true:
+
+@itemize @bullet
+@item
+A minimum has been found to within the user-specified precision.
+
+@item
+A user-specified maximum number of iterations has been reached.
+
+@item
+An error has occurred.
+@end itemize
+
+@noindent
+The handling of these conditions is under user control. The functions
+below allow the user to test the precision of the current result.
+
+@deftypefun int gsl_multimin_test_gradient (const gsl_vector * @var{g}, double @var{epsabs})
+This function tests the norm of the gradient @var{g} against the
+absolute tolerance @var{epsabs}. The gradient of a multidimensional
+function goes to zero at a minimum. The test returns @code{GSL_SUCCESS}
+if the following condition is achieved,
+@tex
+\beforedisplay
+$$
+|g| < \hbox{\it epsabs}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+|g| < epsabs
+@end example
+
+@end ifinfo
+@noindent
+and returns @code{GSL_CONTINUE} otherwise. A suitable choice of
+@var{epsabs} can be made from the desired accuracy in the function for
+small variations in @math{x}. The relationship between these quantities
+is given by @c{$\delta{f} = g\,\delta{x}$}
+@math{\delta f = g \delta x}.
+@end deftypefun
+
+@deftypefun int gsl_multimin_test_size (const double @var{size}, double @var{epsabs})
+This function tests the minimizer specific characteristic
+size (if applicable to the used minimizer) against absolute tolerance @var{epsabs}.
+The test returns @code{GSL_SUCCESS} if the size is smaller than tolerance,
+otherwise @code{GSL_CONTINUE} is returned.
+@end deftypefun
+
+@node Multimin Algorithms
+@section Algorithms
+
+There are several minimization methods available. The best choice of
+algorithm depends on the problem. All of the algorithms use the value
+of the function and its gradient at each evaluation point, except for
+the Simplex algorithm which uses function values only.
+
+@deffn {Minimizer} gsl_multimin_fdfminimizer_conjugate_fr
+@cindex Fletcher-Reeves conjugate gradient algorithm, minimization
+@cindex Conjugate gradient algorithm, minimization
+@cindex minimization, conjugate gradient algorithm
+This is the Fletcher-Reeves conjugate gradient algorithm. The conjugate
+gradient algorithm proceeds as a succession of line minimizations. The
+sequence of search directions is used to build up an approximation to the
+curvature of the function in the neighborhood of the minimum.
+
+An initial search direction @var{p} is chosen using the gradient, and line
+minimization is carried out in that direction. The accuracy of the line
+minimization is specified by the parameter @var{tol}. The minimum
+along this line occurs when the function gradient @var{g} and the search direction
+@var{p} are orthogonal. The line minimization terminates when
+@c{$p\cdot g < tol |p| |g|$}
+@math{dot(p,g) < tol |p| |g|}. The
+search direction is updated using the Fletcher-Reeves formula
+@math{p' = g' - \beta g} where @math{\beta=-|g'|^2/|g|^2}, and
+the line minimization is then repeated for the new search
+direction.
+@end deffn
+
+@deffn {Minimizer} gsl_multimin_fdfminimizer_conjugate_pr
+@cindex Polak-Ribiere algorithm, minimization
+@cindex minimization, Polak-Ribiere algorithm
+This is the Polak-Ribiere conjugate gradient algorithm. It is similar
+to the Fletcher-Reeves method, differing only in the choice of the
+coefficient @math{\beta}. Both methods work well when the evaluation
+point is close enough to the minimum of the objective function that it
+is well approximated by a quadratic hypersurface.
+@end deffn
+
+@deffn {Minimizer} gsl_multimin_fdfminimizer_vector_bfgs2
+@deffnx {Minimizer} gsl_multimin_fdfminimizer_vector_bfgs
+@cindex BFGS algorithm, minimization
+@cindex minimization, BFGS algorithm
+These methods use the vector Broyden-Fletcher-Goldfarb-Shanno (BFGS)
+algorithm. This is a quasi-Newton method which builds up an approximation
+to the second derivatives of the function @math{f} using the difference
+between successive gradient vectors. By combining the first and second
+derivatives the algorithm is able to take Newton-type steps towards the
+function minimum, assuming quadratic behavior in that region.
+
+The @code{bfgs2} version of this minimizer is the most efficient
+version available, and is a faithful implementation of the line
+minimization scheme described in Fletcher's @cite{Practical Methods of
+Optimization}, Algorithms 2.6.2 and 2.6.4. It supercedes the original
+@code{bfgs} routine and requires substantially fewer function and
+gradient evaluations. The user-supplied tolerance @var{tol}
+corresponds to the parameter @math{\sigma} used by Fletcher. A value
+of 0.1 is recommended for typical use (larger values correspond to
+less accurate line searches).
+
+@end deffn
+
+@deffn {Minimizer} gsl_multimin_fdfminimizer_steepest_descent
+@cindex steepest descent algorithm, minimization
+@cindex minimization, steepest descent algorithm
+The steepest descent algorithm follows the downhill gradient of the
+function at each step. When a downhill step is successful the step-size
+is increased by a factor of two. If the downhill step leads to a higher
+function value then the algorithm backtracks and the step size is
+decreased using the parameter @var{tol}. A suitable value of @var{tol}
+for most applications is 0.1. The steepest descent method is
+inefficient and is included only for demonstration purposes.
+@end deffn
+
+@deffn {Minimizer} gsl_multimin_fminimizer_nmsimplex
+@cindex Nelder-Mead simplex algorithm for minimization
+@cindex simplex algorithm, minimization
+@cindex minimization, simplex algorithm
+This is the Simplex algorithm of Nelder and Mead. It constructs
+@math{n} vectors @math{p_i} from the
+starting vector @var{x} and the vector @var{step_size} as follows:
+@tex
+\beforedisplay
+$$
+\eqalign{
+p_0 & = (x_0, x_1, \cdots , x_n) \cr
+p_1 & = (x_0 + step\_size_0, x_1, \cdots , x_n) \cr
+p_2 & = (x_0, x_1 + step\_size_1, \cdots , x_n) \cr
+\dots &= \dots \cr
+p_n & = (x_0, x_1, \cdots , x_n+step\_size_n) \cr
+}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+p_0 = (x_0, x_1, ... , x_n)
+p_1 = (x_0 + step_size_0, x_1, ... , x_n)
+p_2 = (x_0, x_1 + step_size_1, ... , x_n)
+... = ...
+p_n = (x_0, x_1, ... , x_n+step_size_n)
+@end example
+
+@end ifinfo
+@noindent
+These vectors form the @math{n+1} vertices of a simplex in @math{n}
+dimensions. On each iteration the algorithm tries to improve
+the parameter vector @math{p_i} corresponding to the highest
+function value by simple geometrical transformations. These
+are reflection, reflection followed by expansion, contraction and multiple
+contraction. Using these transformations the simplex moves through
+the parameter space towards the minimum, where it contracts itself.
+
+After each iteration, the best vertex is returned. Note, that due to
+the nature of the algorithm not every step improves the current
+best parameter vector. Usually several iterations are required.
+
+The routine calculates the minimizer specific characteristic size as the
+average distance from the geometrical center of the simplex to all its
+vertices. This size can be used as a stopping criteria, as the simplex
+contracts itself near the minimum. The size is returned by the function
+@code{gsl_multimin_fminimizer_size}.
+@end deffn
+
+@node Multimin Examples
+@section Examples
+
+This example program finds the minimum of the paraboloid function
+defined earlier. The location of the minimum is offset from the origin
+in @math{x} and @math{y}, and the function value at the minimum is
+non-zero. The main program is given below, it requires the example
+function given earlier in this chapter.
+
+@smallexample
+int
+main (void)
+@{
+ size_t iter = 0;
+ int status;
+
+ const gsl_multimin_fdfminimizer_type *T;
+ gsl_multimin_fdfminimizer *s;
+
+ /* Position of the minimum (1,2). */
+ double par[2] = @{ 1.0, 2.0 @};
+
+ gsl_vector *x;
+ gsl_multimin_function_fdf my_func;
+
+ my_func.f = &my_f;
+ my_func.df = &my_df;
+ my_func.fdf = &my_fdf;
+ my_func.n = 2;
+ my_func.params = &par;
+
+ /* Starting point, x = (5,7) */
+ x = gsl_vector_alloc (2);
+ gsl_vector_set (x, 0, 5.0);
+ gsl_vector_set (x, 1, 7.0);
+
+ T = gsl_multimin_fdfminimizer_conjugate_fr;
+ s = gsl_multimin_fdfminimizer_alloc (T, 2);
+
+ gsl_multimin_fdfminimizer_set (s, &my_func, x, 0.01, 1e-4);
+
+ do
+ @{
+ iter++;
+ status = gsl_multimin_fdfminimizer_iterate (s);
+
+ if (status)
+ break;
+
+ status = gsl_multimin_test_gradient (s->gradient, 1e-3);
+
+ if (status == GSL_SUCCESS)
+ printf ("Minimum found at:\n");
+
+ printf ("%5d %.5f %.5f %10.5f\n", iter,
+ gsl_vector_get (s->x, 0),
+ gsl_vector_get (s->x, 1),
+ s->f);
+
+ @}
+ while (status == GSL_CONTINUE && iter < 100);
+
+ gsl_multimin_fdfminimizer_free (s);
+ gsl_vector_free (x);
+
+ return 0;
+@}
+@end smallexample
+
+@noindent
+The initial step-size is chosen as 0.01, a conservative estimate in this
+case, and the line minimization parameter is set at 0.0001. The program
+terminates when the norm of the gradient has been reduced below
+0.001. The output of the program is shown below,
+
+@example
+ x y f
+ 1 4.99629 6.99072 687.84780
+ 2 4.98886 6.97215 683.55456
+ 3 4.97400 6.93501 675.01278
+ 4 4.94429 6.86073 658.10798
+ 5 4.88487 6.71217 625.01340
+ 6 4.76602 6.41506 561.68440
+ 7 4.52833 5.82083 446.46694
+ 8 4.05295 4.63238 261.79422
+ 9 3.10219 2.25548 75.49762
+ 10 2.85185 1.62963 67.03704
+ 11 2.19088 1.76182 45.31640
+ 12 0.86892 2.02622 30.18555
+Minimum found at:
+ 13 1.00000 2.00000 30.00000
+@end example
+
+@noindent
+Note that the algorithm gradually increases the step size as it
+successfully moves downhill, as can be seen by plotting the successive
+points.
+
+@iftex
+@sp 1
+@center @image{multimin,3.4in}
+@end iftex
+
+@noindent
+The conjugate gradient algorithm finds the minimum on its second
+direction because the function is purely quadratic. Additional
+iterations would be needed for a more complicated function.
+
+Here is another example using the Nelder-Mead Simplex algorithm to
+minimize the same example object function, as above.
+
+@smallexample
+int
+main(void)
+@{
+ size_t np = 2;
+ double par[2] = @{1.0, 2.0@};
+
+ const gsl_multimin_fminimizer_type *T =
+ gsl_multimin_fminimizer_nmsimplex;
+ gsl_multimin_fminimizer *s = NULL;
+ gsl_vector *ss, *x;
+ gsl_multimin_function minex_func;
+
+ size_t iter = 0, i;
+ int status;
+ double size;
+
+ /* Initial vertex size vector */
+ ss = gsl_vector_alloc (np);
+
+ /* Set all step sizes to 1 */
+ gsl_vector_set_all (ss, 1.0);
+
+ /* Starting point */
+ x = gsl_vector_alloc (np);
+
+ gsl_vector_set (x, 0, 5.0);
+ gsl_vector_set (x, 1, 7.0);
+
+ /* Initialize method and iterate */
+ minex_func.f = &my_f;
+ minex_func.n = np;
+ minex_func.params = (void *)&par;
+
+ s = gsl_multimin_fminimizer_alloc (T, np);
+ gsl_multimin_fminimizer_set (s, &minex_func, x, ss);
+
+ do
+ @{
+ iter++;
+ status = gsl_multimin_fminimizer_iterate(s);
+
+ if (status)
+ break;
+
+ size = gsl_multimin_fminimizer_size (s);
+ status = gsl_multimin_test_size (size, 1e-2);
+
+ if (status == GSL_SUCCESS)
+ @{
+ printf ("converged to minimum at\n");
+ @}
+
+ printf ("%5d ", iter);
+ for (i = 0; i < np; i++)
+ @{
+ printf ("%10.3e ", gsl_vector_get (s->x, i));
+ @}
+ printf ("f() = %7.3f size = %.3f\n", s->fval, size);
+ @}
+ while (status == GSL_CONTINUE && iter < 100);
+
+ gsl_vector_free(x);
+ gsl_vector_free(ss);
+ gsl_multimin_fminimizer_free (s);
+
+ return status;
+@}
+@end smallexample
+
+@noindent
+The minimum search stops when the Simplex size drops to 0.01. The output is
+shown below.
+
+@example
+ 1 6.500e+00 5.000e+00 f() = 512.500 size = 1.082
+ 2 5.250e+00 4.000e+00 f() = 290.625 size = 1.372
+ 3 5.250e+00 4.000e+00 f() = 290.625 size = 1.372
+ 4 5.500e+00 1.000e+00 f() = 252.500 size = 1.372
+ 5 2.625e+00 3.500e+00 f() = 101.406 size = 1.823
+ 6 3.469e+00 1.375e+00 f() = 98.760 size = 1.526
+ 7 1.820e+00 3.156e+00 f() = 63.467 size = 1.105
+ 8 1.820e+00 3.156e+00 f() = 63.467 size = 1.105
+ 9 1.016e+00 2.812e+00 f() = 43.206 size = 1.105
+ 10 2.041e+00 2.008e+00 f() = 40.838 size = 0.645
+ 11 1.236e+00 1.664e+00 f() = 32.816 size = 0.645
+ 12 1.236e+00 1.664e+00 f() = 32.816 size = 0.447
+ 13 5.225e-01 1.980e+00 f() = 32.288 size = 0.447
+ 14 1.103e+00 2.073e+00 f() = 30.214 size = 0.345
+ 15 1.103e+00 2.073e+00 f() = 30.214 size = 0.264
+ 16 1.103e+00 2.073e+00 f() = 30.214 size = 0.160
+ 17 9.864e-01 1.934e+00 f() = 30.090 size = 0.132
+ 18 9.190e-01 1.987e+00 f() = 30.069 size = 0.092
+ 19 1.028e+00 2.017e+00 f() = 30.013 size = 0.056
+ 20 1.028e+00 2.017e+00 f() = 30.013 size = 0.046
+ 21 1.028e+00 2.017e+00 f() = 30.013 size = 0.033
+ 22 9.874e-01 1.985e+00 f() = 30.006 size = 0.028
+ 23 9.846e-01 1.995e+00 f() = 30.003 size = 0.023
+ 24 1.007e+00 2.003e+00 f() = 30.001 size = 0.012
+converged to minimum at
+ 25 1.007e+00 2.003e+00 f() = 30.001 size = 0.010
+@end example
+
+@noindent
+The simplex size first increases, while the simplex moves towards the
+minimum. After a while the size begins to decrease as the simplex
+contracts around the minimum.
+
+@node Multimin References and Further Reading
+@section References and Further Reading
+
+The conjugate gradient and BFGS methods are described in detail in the
+following book,
+
+@itemize @asis
+@item R. Fletcher,
+@cite{Practical Methods of Optimization (Second Edition)} Wiley
+(1987), ISBN 0471915475.
+@end itemize
+
+A brief description of multidimensional minimization algorithms and
+more recent references can be found in,
+
+@itemize @asis
+@item C.W. Ueberhuber,
+@cite{Numerical Computation (Volume 2)}, Chapter 14, Section 4.4
+``Minimization Methods'', p.@: 325--335, Springer (1997), ISBN
+3-540-62057-5.
+@end itemize
+
+@noindent
+The simplex algorithm is described in the following paper,
+
+@itemize @asis
+@item J.A. Nelder and R. Mead,
+@cite{A simplex method for function minimization}, Computer Journal
+vol.@: 7 (1965), 308--315.
+@end itemize
+
+@noindent
diff --git a/gsl-1.9/doc/multiroots.texi b/gsl-1.9/doc/multiroots.texi
new file mode 100644
index 0000000..b0dc49c
--- /dev/null
+++ b/gsl-1.9/doc/multiroots.texi
@@ -0,0 +1,1083 @@
+@cindex solving nonlinear systems of equations
+@cindex nonlinear systems of equations, solution of
+@cindex systems of equations, nonlinear
+
+This chapter describes functions for multidimensional root-finding
+(solving nonlinear systems with @math{n} equations in @math{n}
+unknowns). The library provides low level components for a variety of
+iterative solvers and convergence tests. These can be combined by the
+user to achieve the desired solution, with full access to the
+intermediate steps of the iteration. Each class of methods uses the
+same framework, so that you can switch between solvers at runtime
+without needing to recompile your program. Each instance of a solver
+keeps track of its own state, allowing the solvers to be used in
+multi-threaded programs. The solvers are based on the original Fortran
+library @sc{minpack}.
+
+The header file @file{gsl_multiroots.h} contains prototypes for the
+multidimensional root finding functions and related declarations.
+
+@menu
+* Overview of Multidimensional Root Finding::
+* Initializing the Multidimensional Solver::
+* Providing the multidimensional system of equations to solve::
+* Iteration of the multidimensional solver::
+* Search Stopping Parameters for the multidimensional solver::
+* Algorithms using Derivatives::
+* Algorithms without Derivatives::
+* Example programs for Multidimensional Root finding::
+* References and Further Reading for Multidimensional Root Finding::
+@end menu
+
+@node Overview of Multidimensional Root Finding
+@section Overview
+@cindex multidimensional root finding, overview
+
+The problem of multidimensional root finding requires the simultaneous
+solution of @math{n} equations, @math{f_i}, in @math{n} variables,
+@math{x_i},
+@tex
+\beforedisplay
+$$
+f_i (x_1, \dots, x_n) = 0 \qquad\hbox{for}~i = 1 \dots n.
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+f_i (x_1, ..., x_n) = 0 for i = 1 ... n.
+@end example
+
+@end ifinfo
+@noindent
+In general there are no bracketing methods available for @math{n}
+dimensional systems, and no way of knowing whether any solutions
+exist. All algorithms proceed from an initial guess using a variant of
+the Newton iteration,
+@tex
+\beforedisplay
+$$
+x \to x' = x - J^{-1} f(x)
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+x -> x' = x - J^@{-1@} f(x)
+@end example
+
+@end ifinfo
+@noindent
+where @math{x}, @math{f} are vector quantities and @math{J} is the
+Jacobian matrix @c{$J_{ij} = \partial f_i / \partial x_j$}
+@math{J_@{ij@} = d f_i / d x_j}.
+Additional strategies can be used to enlarge the region of
+convergence. These include requiring a decrease in the norm @math{|f|} on
+each step proposed by Newton's method, or taking steepest-descent steps in
+the direction of the negative gradient of @math{|f|}.
+
+Several root-finding algorithms are available within a single framework.
+The user provides a high-level driver for the algorithms, and the
+library provides the individual functions necessary for each of the
+steps. There are three main phases of the iteration. The steps are,
+
+@itemize @bullet
+@item
+initialize solver state, @var{s}, for algorithm @var{T}
+
+@item
+update @var{s} using the iteration @var{T}
+
+@item
+test @var{s} for convergence, and repeat iteration if necessary
+@end itemize
+
+@noindent
+The evaluation of the Jacobian matrix can be problematic, either because
+programming the derivatives is intractable or because computation of the
+@math{n^2} terms of the matrix becomes too expensive. For these reasons
+the algorithms provided by the library are divided into two classes according
+to whether the derivatives are available or not.
+
+The state for solvers with an analytic Jacobian matrix is held in a
+@code{gsl_multiroot_fdfsolver} struct. The updating procedure requires
+both the function and its derivatives to be supplied by the user.
+
+The state for solvers which do not use an analytic Jacobian matrix is
+held in a @code{gsl_multiroot_fsolver} struct. The updating procedure
+uses only function evaluations (not derivatives). The algorithms
+estimate the matrix @math{J} or @c{$J^{-1}$}
+@math{J^@{-1@}} by approximate methods.
+
+@node Initializing the Multidimensional Solver
+@section Initializing the Solver
+
+The following functions initialize a multidimensional solver, either
+with or without derivatives. The solver itself depends only on the
+dimension of the problem and the algorithm and can be reused for
+different problems.
+
+@deftypefun {gsl_multiroot_fsolver *} gsl_multiroot_fsolver_alloc (const gsl_multiroot_fsolver_type * @var{T}, size_t @var{n})
+This function returns a pointer to a newly allocated instance of a
+solver of type @var{T} for a system of @var{n} dimensions.
+For example, the following code creates an instance of a hybrid solver,
+to solve a 3-dimensional system of equations.
+
+@example
+const gsl_multiroot_fsolver_type * T
+ = gsl_multiroot_fsolver_hybrid;
+gsl_multiroot_fsolver * s
+ = gsl_multiroot_fsolver_alloc (T, 3);
+@end example
+
+@noindent
+If there is insufficient memory to create the solver then the function
+returns a null pointer and the error handler is invoked with an error
+code of @code{GSL_ENOMEM}.
+@end deftypefun
+
+@deftypefun {gsl_multiroot_fdfsolver *} gsl_multiroot_fdfsolver_alloc (const gsl_multiroot_fdfsolver_type * @var{T}, size_t @var{n})
+This function returns a pointer to a newly allocated instance of a
+derivative solver of type @var{T} for a system of @var{n} dimensions.
+For example, the following code creates an instance of a Newton-Raphson solver,
+for a 2-dimensional system of equations.
+
+@example
+const gsl_multiroot_fdfsolver_type * T
+ = gsl_multiroot_fdfsolver_newton;
+gsl_multiroot_fdfsolver * s =
+ gsl_multiroot_fdfsolver_alloc (T, 2);
+@end example
+
+@noindent
+If there is insufficient memory to create the solver then the function
+returns a null pointer and the error handler is invoked with an error
+code of @code{GSL_ENOMEM}.
+@end deftypefun
+
+@deftypefun int gsl_multiroot_fsolver_set (gsl_multiroot_fsolver * @var{s}, gsl_multiroot_function * @var{f}, gsl_vector * @var{x})
+This function sets, or resets, an existing solver @var{s} to use the
+function @var{f} and the initial guess @var{x}.
+@end deftypefun
+
+@deftypefun int gsl_multiroot_fdfsolver_set (gsl_multiroot_fdfsolver * @var{s}, gsl_multiroot_function_fdf * @var{fdf}, gsl_vector * @var{x})
+This function sets, or resets, an existing solver @var{s} to use the
+function and derivative @var{fdf} and the initial guess @var{x}.
+@end deftypefun
+
+@deftypefun void gsl_multiroot_fsolver_free (gsl_multiroot_fsolver * @var{s})
+@deftypefunx void gsl_multiroot_fdfsolver_free (gsl_multiroot_fdfsolver * @var{s})
+These functions free all the memory associated with the solver @var{s}.
+@end deftypefun
+
+@deftypefun {const char *} gsl_multiroot_fsolver_name (const gsl_multiroot_fsolver * @var{s})
+@deftypefunx {const char *} gsl_multiroot_fdfsolver_name (const gsl_multiroot_fdfsolver * @var{s})
+These functions return a pointer to the name of the solver. For example,
+
+@example
+printf ("s is a '%s' solver\n",
+ gsl_multiroot_fdfsolver_name (s));
+@end example
+
+@noindent
+would print something like @code{s is a 'newton' solver}.
+@end deftypefun
+
+@node Providing the multidimensional system of equations to solve
+@section Providing the function to solve
+@cindex multidimensional root finding, providing a function to solve
+
+You must provide @math{n} functions of @math{n} variables for the root
+finders to operate on. In order to allow for general parameters the
+functions are defined by the following data types:
+
+@deftp {Data Type} gsl_multiroot_function
+This data type defines a general system of functions with parameters.
+
+@table @code
+@item int (* f) (const gsl_vector * @var{x}, void * @var{params}, gsl_vector * @var{f})
+this function should store the vector result
+@c{$f(x,\hbox{\it params})$}
+@math{f(x,params)} in @var{f} for argument @var{x} and parameters @var{params},
+returning an appropriate error code if the function cannot be computed.
+
+@item size_t n
+the dimension of the system, i.e. the number of components of the
+vectors @var{x} and @var{f}.
+
+@item void * params
+a pointer to the parameters of the function.
+@end table
+@end deftp
+
+@noindent
+Here is an example using Powell's test function,
+@tex
+\beforedisplay
+$$
+f_1(x) = A x_0 x_1 - 1,
+f_2(x) = \exp(-x_0) + \exp(-x_1) - (1 + 1/A)
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+f_1(x) = A x_0 x_1 - 1,
+f_2(x) = exp(-x_0) + exp(-x_1) - (1 + 1/A)
+@end example
+
+@end ifinfo
+@noindent
+with @math{A = 10^4}. The following code defines a
+@code{gsl_multiroot_function} system @code{F} which you could pass to a
+solver:
+
+@example
+struct powell_params @{ double A; @};
+
+int
+powell (gsl_vector * x, void * p, gsl_vector * f) @{
+ struct powell_params * params
+ = *(struct powell_params *)p;
+ const double A = (params->A);
+ const double x0 = gsl_vector_get(x,0);
+ const double x1 = gsl_vector_get(x,1);
+
+ gsl_vector_set (f, 0, A * x0 * x1 - 1);
+ gsl_vector_set (f, 1, (exp(-x0) + exp(-x1)
+ - (1.0 + 1.0/A)));
+ return GSL_SUCCESS
+@}
+
+gsl_multiroot_function F;
+struct powell_params params = @{ 10000.0 @};
+
+F.f = &powell;
+F.n = 2;
+F.params = &params;
+@end example
+
+@deftp {Data Type} gsl_multiroot_function_fdf
+This data type defines a general system of functions with parameters and
+the corresponding Jacobian matrix of derivatives,
+
+@table @code
+@item int (* f) (const gsl_vector * @var{x}, void * @var{params}, gsl_vector * @var{f})
+this function should store the vector result
+@c{$f(x,\hbox{\it params})$}
+@math{f(x,params)} in @var{f} for argument @var{x} and parameters @var{params},
+returning an appropriate error code if the function cannot be computed.
+
+@item int (* df) (const gsl_vector * @var{x}, void * @var{params}, gsl_matrix * @var{J})
+this function should store the @var{n}-by-@var{n} matrix result
+@c{$J_{ij} = \partial f_i(x,\hbox{\it params}) / \partial x_j$}
+@math{J_ij = d f_i(x,params) / d x_j} in @var{J} for argument @var{x}
+and parameters @var{params}, returning an appropriate error code if the
+function cannot be computed.
+
+@item int (* fdf) (const gsl_vector * @var{x}, void * @var{params}, gsl_vector * @var{f}, gsl_matrix * @var{J})
+This function should set the values of the @var{f} and @var{J} as above,
+for arguments @var{x} and parameters @var{params}. This function
+provides an optimization of the separate functions for @math{f(x)} and
+@math{J(x)}---it is always faster to compute the function and its
+derivative at the same time.
+
+@item size_t n
+the dimension of the system, i.e. the number of components of the
+vectors @var{x} and @var{f}.
+
+@item void * params
+a pointer to the parameters of the function.
+@end table
+@end deftp
+
+@noindent
+The example of Powell's test function defined above can be extended to
+include analytic derivatives using the following code,
+
+@example
+int
+powell_df (gsl_vector * x, void * p, gsl_matrix * J)
+@{
+ struct powell_params * params
+ = *(struct powell_params *)p;
+ const double A = (params->A);
+ const double x0 = gsl_vector_get(x,0);
+ const double x1 = gsl_vector_get(x,1);
+ gsl_matrix_set (J, 0, 0, A * x1);
+ gsl_matrix_set (J, 0, 1, A * x0);
+ gsl_matrix_set (J, 1, 0, -exp(-x0));
+ gsl_matrix_set (J, 1, 1, -exp(-x1));
+ return GSL_SUCCESS
+@}
+
+int
+powell_fdf (gsl_vector * x, void * p,
+ gsl_matrix * f, gsl_matrix * J) @{
+ struct powell_params * params
+ = *(struct powell_params *)p;
+ const double A = (params->A);
+ const double x0 = gsl_vector_get(x,0);
+ const double x1 = gsl_vector_get(x,1);
+
+ const double u0 = exp(-x0);
+ const double u1 = exp(-x1);
+
+ gsl_vector_set (f, 0, A * x0 * x1 - 1);
+ gsl_vector_set (f, 1, u0 + u1 - (1 + 1/A));
+
+ gsl_matrix_set (J, 0, 0, A * x1);
+ gsl_matrix_set (J, 0, 1, A * x0);
+ gsl_matrix_set (J, 1, 0, -u0);
+ gsl_matrix_set (J, 1, 1, -u1);
+ return GSL_SUCCESS
+@}
+
+gsl_multiroot_function_fdf FDF;
+
+FDF.f = &powell_f;
+FDF.df = &powell_df;
+FDF.fdf = &powell_fdf;
+FDF.n = 2;
+FDF.params = 0;
+@end example
+
+@noindent
+Note that the function @code{powell_fdf} is able to reuse existing terms
+from the function when calculating the Jacobian, thus saving time.
+
+@node Iteration of the multidimensional solver
+@section Iteration
+
+The following functions drive the iteration of each algorithm. Each
+function performs one iteration to update the state of any solver of the
+corresponding type. The same functions work for all solvers so that
+different methods can be substituted at runtime without modifications to
+the code.
+
+@deftypefun int gsl_multiroot_fsolver_iterate (gsl_multiroot_fsolver * @var{s})
+@deftypefunx int gsl_multiroot_fdfsolver_iterate (gsl_multiroot_fdfsolver * @var{s})
+These functions perform a single iteration of the solver @var{s}. If the
+iteration encounters an unexpected problem then an error code will be
+returned,
+
+@table @code
+@item GSL_EBADFUNC
+the iteration encountered a singular point where the function or its
+derivative evaluated to @code{Inf} or @code{NaN}.
+
+@item GSL_ENOPROG
+the iteration is not making any progress, preventing the algorithm from
+continuing.
+@end table
+@end deftypefun
+
+The solver maintains a current best estimate of the root at all times.
+This information can be accessed with the following auxiliary functions,
+
+@deftypefun {gsl_vector *} gsl_multiroot_fsolver_root (const gsl_multiroot_fsolver * @var{s})
+@deftypefunx {gsl_vector *} gsl_multiroot_fdfsolver_root (const gsl_multiroot_fdfsolver * @var{s})
+These functions return the current estimate of the root for the solver @var{s}.
+@end deftypefun
+
+@deftypefun {gsl_vector *} gsl_multiroot_fsolver_f (const gsl_multiroot_fsolver * @var{s})
+@deftypefunx {gsl_vector *} gsl_multiroot_fdfsolver_f (const gsl_multiroot_fdfsolver * @var{s})
+These functions return the function value @math{f(x)} at the current
+estimate of the root for the solver @var{s}.
+@end deftypefun
+
+@deftypefun {gsl_vector *} gsl_multiroot_fsolver_dx (const gsl_multiroot_fsolver * @var{s})
+@deftypefunx {gsl_vector *} gsl_multiroot_fdfsolver_dx (const gsl_multiroot_fdfsolver * @var{s})
+These functions return the last step @math{dx} taken by the solver
+@var{s}.
+@end deftypefun
+
+@node Search Stopping Parameters for the multidimensional solver
+@section Search Stopping Parameters
+@cindex root finding, stopping parameters
+
+A root finding procedure should stop when one of the following conditions is
+true:
+
+@itemize @bullet
+@item
+A multidimensional root has been found to within the user-specified precision.
+
+@item
+A user-specified maximum number of iterations has been reached.
+
+@item
+An error has occurred.
+@end itemize
+
+@noindent
+The handling of these conditions is under user control. The functions
+below allow the user to test the precision of the current result in
+several standard ways.
+
+@deftypefun int gsl_multiroot_test_delta (const gsl_vector * @var{dx}, const gsl_vector * @var{x}, double @var{epsabs}, double @var{epsrel})
+
+This function tests for the convergence of the sequence by comparing the
+last step @var{dx} with the absolute error @var{epsabs} and relative
+error @var{epsrel} to the current position @var{x}. The test returns
+@code{GSL_SUCCESS} if the following condition is achieved,
+@tex
+\beforedisplay
+$$
+|dx_i| < \hbox{\it epsabs} + \hbox{\it epsrel\/}\, |x_i|
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+|dx_i| < epsabs + epsrel |x_i|
+@end example
+
+@end ifinfo
+@noindent
+for each component of @var{x} and returns @code{GSL_CONTINUE} otherwise.
+@end deftypefun
+
+@cindex residual, in nonlinear systems of equations
+@deftypefun int gsl_multiroot_test_residual (const gsl_vector * @var{f}, double @var{epsabs})
+This function tests the residual value @var{f} against the absolute
+error bound @var{epsabs}. The test returns @code{GSL_SUCCESS} if the
+following condition is achieved,
+@tex
+\beforedisplay
+$$
+\sum_i |f_i| < \hbox{\it epsabs}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+\sum_i |f_i| < epsabs
+@end example
+
+@end ifinfo
+@noindent
+and returns @code{GSL_CONTINUE} otherwise. This criterion is suitable
+for situations where the precise location of the root, @math{x}, is
+unimportant provided a value can be found where the residual is small
+enough.
+@end deftypefun
+
+@comment ============================================================
+
+@node Algorithms using Derivatives
+@section Algorithms using Derivatives
+
+The root finding algorithms described in this section make use of both
+the function and its derivative. They require an initial guess for the
+location of the root, but there is no absolute guarantee of
+convergence---the function must be suitable for this technique and the
+initial guess must be sufficiently close to the root for it to work.
+When the conditions are satisfied then convergence is quadratic.
+
+
+@comment ============================================================
+@cindex HYBRID algorithms for nonlinear systems
+@deffn {Derivative Solver} gsl_multiroot_fdfsolver_hybridsj
+@cindex HYBRIDSJ algorithm
+@cindex MINPACK, minimization algorithms
+This is a modified version of Powell's Hybrid method as implemented in
+the @sc{hybrj} algorithm in @sc{minpack}. Minpack was written by Jorge
+J. Mor@'e, Burton S. Garbow and Kenneth E. Hillstrom. The Hybrid
+algorithm retains the fast convergence of Newton's method but will also
+reduce the residual when Newton's method is unreliable.
+
+The algorithm uses a generalized trust region to keep each step under
+control. In order to be accepted a proposed new position @math{x'} must
+satisfy the condition @math{|D (x' - x)| < \delta}, where @math{D} is a
+diagonal scaling matrix and @math{\delta} is the size of the trust
+region. The components of @math{D} are computed internally, using the
+column norms of the Jacobian to estimate the sensitivity of the residual
+to each component of @math{x}. This improves the behavior of the
+algorithm for badly scaled functions.
+
+On each iteration the algorithm first determines the standard Newton
+step by solving the system @math{J dx = - f}. If this step falls inside
+the trust region it is used as a trial step in the next stage. If not,
+the algorithm uses the linear combination of the Newton and gradient
+directions which is predicted to minimize the norm of the function while
+staying inside the trust region,
+@tex
+\beforedisplay
+$$
+dx = - \alpha J^{-1} f(x) - \beta \nabla |f(x)|^2.
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+dx = - \alpha J^@{-1@} f(x) - \beta \nabla |f(x)|^2.
+@end example
+
+@end ifinfo
+@noindent
+This combination of Newton and gradient directions is referred to as a
+@dfn{dogleg step}.
+
+The proposed step is now tested by evaluating the function at the
+resulting point, @math{x'}. If the step reduces the norm of the function
+sufficiently then it is accepted and size of the trust region is
+increased. If the proposed step fails to improve the solution then the
+size of the trust region is decreased and another trial step is
+computed.
+
+The speed of the algorithm is increased by computing the changes to the
+Jacobian approximately, using a rank-1 update. If two successive
+attempts fail to reduce the residual then the full Jacobian is
+recomputed. The algorithm also monitors the progress of the solution
+and returns an error if several steps fail to make any improvement,
+
+@table @code
+@item GSL_ENOPROG
+the iteration is not making any progress, preventing the algorithm from
+continuing.
+
+@item GSL_ENOPROGJ
+re-evaluations of the Jacobian indicate that the iteration is not
+making any progress, preventing the algorithm from continuing.
+@end table
+
+@end deffn
+
+@deffn {Derivative Solver} gsl_multiroot_fdfsolver_hybridj
+@cindex HYBRIDJ algorithm
+This algorithm is an unscaled version of @code{hybridsj}. The steps are
+controlled by a spherical trust region @math{|x' - x| < \delta}, instead
+of a generalized region. This can be useful if the generalized region
+estimated by @code{hybridsj} is inappropriate.
+@end deffn
+
+
+@deffn {Derivative Solver} gsl_multiroot_fdfsolver_newton
+@cindex Newton's method for systems of nonlinear equations
+
+Newton's Method is the standard root-polishing algorithm. The algorithm
+begins with an initial guess for the location of the solution. On each
+iteration a linear approximation to the function @math{F} is used to
+estimate the step which will zero all the components of the residual.
+The iteration is defined by the following sequence,
+@tex
+\beforedisplay
+$$
+x \to x' = x - J^{-1} f(x)
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+x -> x' = x - J^@{-1@} f(x)
+@end example
+
+@end ifinfo
+@noindent
+where the Jacobian matrix @math{J} is computed from the derivative
+functions provided by @var{f}. The step @math{dx} is obtained by solving
+the linear system,
+@tex
+\beforedisplay
+$$
+J \,dx = - f(x)
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+J dx = - f(x)
+@end example
+
+@end ifinfo
+@noindent
+using LU decomposition.
+@end deffn
+
+@comment ============================================================
+
+@deffn {Derivative Solver} gsl_multiroot_fdfsolver_gnewton
+@cindex Modified Newton's method for nonlinear systems
+@cindex Newton algorithm, globally convergent
+This is a modified version of Newton's method which attempts to improve
+global convergence by requiring every step to reduce the Euclidean norm
+of the residual, @math{|f(x)|}. If the Newton step leads to an increase
+in the norm then a reduced step of relative size,
+@tex
+\beforedisplay
+$$
+t = (\sqrt{1 + 6 r} - 1) / (3 r)
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+t = (\sqrt(1 + 6 r) - 1) / (3 r)
+@end example
+
+@end ifinfo
+@noindent
+is proposed, with @math{r} being the ratio of norms
+@math{|f(x')|^2/|f(x)|^2}. This procedure is repeated until a suitable step
+size is found.
+@end deffn
+
+@comment ============================================================
+
+@node Algorithms without Derivatives
+@section Algorithms without Derivatives
+
+The algorithms described in this section do not require any derivative
+information to be supplied by the user. Any derivatives needed are
+approximated by finite differences. Note that if the
+finite-differencing step size chosen by these routines is inappropriate,
+an explicit user-supplied numerical derivative can always be used with
+the algorithms described in the previous section.
+
+@deffn {Solver} gsl_multiroot_fsolver_hybrids
+@cindex HYBRIDS algorithm, scaled without derivatives
+This is a version of the Hybrid algorithm which replaces calls to the
+Jacobian function by its finite difference approximation. The finite
+difference approximation is computed using @code{gsl_multiroots_fdjac}
+with a relative step size of @code{GSL_SQRT_DBL_EPSILON}. Note that
+this step size will not be suitable for all problems.
+@end deffn
+
+@deffn {Solver} gsl_multiroot_fsolver_hybrid
+@cindex HYBRID algorithm, unscaled without derivatives
+This is a finite difference version of the Hybrid algorithm without
+internal scaling.
+@end deffn
+
+@comment ============================================================
+
+@deffn {Solver} gsl_multiroot_fsolver_dnewton
+
+@cindex Discrete Newton algorithm for multidimensional roots
+@cindex Newton algorithm, discrete
+
+The @dfn{discrete Newton algorithm} is the simplest method of solving a
+multidimensional system. It uses the Newton iteration
+@tex
+\beforedisplay
+$$
+x \to x - J^{-1} f(x)
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+x -> x - J^@{-1@} f(x)
+@end example
+
+@end ifinfo
+@noindent
+where the Jacobian matrix @math{J} is approximated by taking finite
+differences of the function @var{f}. The approximation scheme used by
+this implementation is,
+@tex
+\beforedisplay
+$$
+J_{ij} = (f_i(x + \delta_j) - f_i(x)) / \delta_j
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+J_@{ij@} = (f_i(x + \delta_j) - f_i(x)) / \delta_j
+@end example
+
+@end ifinfo
+@noindent
+where @math{\delta_j} is a step of size @math{\sqrt\epsilon |x_j|} with
+@math{\epsilon} being the machine precision
+(@c{$\epsilon \approx 2.22 \times 10^{-16}$}
+@math{\epsilon \approx 2.22 \times 10^-16}).
+The order of convergence of Newton's algorithm is quadratic, but the
+finite differences require @math{n^2} function evaluations on each
+iteration. The algorithm may become unstable if the finite differences
+are not a good approximation to the true derivatives.
+@end deffn
+
+@comment ============================================================
+
+@deffn {Solver} gsl_multiroot_fsolver_broyden
+@cindex Broyden algorithm for multidimensional roots
+@cindex multidimensional root finding, Broyden algorithm
+
+The @dfn{Broyden algorithm} is a version of the discrete Newton
+algorithm which attempts to avoids the expensive update of the Jacobian
+matrix on each iteration. The changes to the Jacobian are also
+approximated, using a rank-1 update,
+@tex
+\beforedisplay
+$$
+J^{-1} \to J^{-1} - (J^{-1} df - dx) dx^T J^{-1} / dx^T J^{-1} df
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+J^@{-1@} \to J^@{-1@} - (J^@{-1@} df - dx) dx^T J^@{-1@} / dx^T J^@{-1@} df
+@end example
+
+@end ifinfo
+@noindent
+where the vectors @math{dx} and @math{df} are the changes in @math{x}
+and @math{f}. On the first iteration the inverse Jacobian is estimated
+using finite differences, as in the discrete Newton algorithm.
+
+This approximation gives a fast update but is unreliable if the changes
+are not small, and the estimate of the inverse Jacobian becomes worse as
+time passes. The algorithm has a tendency to become unstable unless it
+starts close to the root. The Jacobian is refreshed if this instability
+is detected (consult the source for details).
+
+This algorithm is included only for demonstration purposes, and is not
+recommended for serious use.
+@end deffn
+
+@comment ============================================================
+
+
+@node Example programs for Multidimensional Root finding
+@section Examples
+
+The multidimensional solvers are used in a similar way to the
+one-dimensional root finding algorithms. This first example
+demonstrates the @code{hybrids} scaled-hybrid algorithm, which does not
+require derivatives. The program solves the Rosenbrock system of equations,
+@tex
+\beforedisplay
+$$
+f_1 (x, y) = a (1 - x),~
+f_2 (x, y) = b (y - x^2)
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+f_1 (x, y) = a (1 - x)
+f_2 (x, y) = b (y - x^2)
+@end example
+
+@end ifinfo
+@noindent
+with @math{a = 1, b = 10}. The solution of this system lies at
+@math{(x,y) = (1,1)} in a narrow valley.
+
+The first stage of the program is to define the system of equations,
+
+@example
+#include <stdlib.h>
+#include <stdio.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_multiroots.h>
+
+struct rparams
+ @{
+ double a;
+ double b;
+ @};
+
+int
+rosenbrock_f (const gsl_vector * x, void *params,
+ gsl_vector * f)
+@{
+ double a = ((struct rparams *) params)->a;
+ double b = ((struct rparams *) params)->b;
+
+ const double x0 = gsl_vector_get (x, 0);
+ const double x1 = gsl_vector_get (x, 1);
+
+ const double y0 = a * (1 - x0);
+ const double y1 = b * (x1 - x0 * x0);
+
+ gsl_vector_set (f, 0, y0);
+ gsl_vector_set (f, 1, y1);
+
+ return GSL_SUCCESS;
+@}
+@end example
+
+@noindent
+The main program begins by creating the function object @code{f}, with
+the arguments @code{(x,y)} and parameters @code{(a,b)}. The solver
+@code{s} is initialized to use this function, with the @code{hybrids}
+method.
+
+@example
+int
+main (void)
+@{
+ const gsl_multiroot_fsolver_type *T;
+ gsl_multiroot_fsolver *s;
+
+ int status;
+ size_t i, iter = 0;
+
+ const size_t n = 2;
+ struct rparams p = @{1.0, 10.0@};
+ gsl_multiroot_function f = @{&rosenbrock_f, n, &p@};
+
+ double x_init[2] = @{-10.0, -5.0@};
+ gsl_vector *x = gsl_vector_alloc (n);
+
+ gsl_vector_set (x, 0, x_init[0]);
+ gsl_vector_set (x, 1, x_init[1]);
+
+ T = gsl_multiroot_fsolver_hybrids;
+ s = gsl_multiroot_fsolver_alloc (T, 2);
+ gsl_multiroot_fsolver_set (s, &f, x);
+
+ print_state (iter, s);
+
+ do
+ @{
+ iter++;
+ status = gsl_multiroot_fsolver_iterate (s);
+
+ print_state (iter, s);
+
+ if (status) /* check if solver is stuck */
+ break;
+
+ status =
+ gsl_multiroot_test_residual (s->f, 1e-7);
+ @}
+ while (status == GSL_CONTINUE && iter < 1000);
+
+ printf ("status = %s\n", gsl_strerror (status));
+
+ gsl_multiroot_fsolver_free (s);
+ gsl_vector_free (x);
+ return 0;
+@}
+@end example
+
+@noindent
+Note that it is important to check the return status of each solver
+step, in case the algorithm becomes stuck. If an error condition is
+detected, indicating that the algorithm cannot proceed, then the error
+can be reported to the user, a new starting point chosen or a different
+algorithm used.
+
+The intermediate state of the solution is displayed by the following
+function. The solver state contains the vector @code{s->x} which is the
+current position, and the vector @code{s->f} with corresponding function
+values.
+
+@example
+int
+print_state (size_t iter, gsl_multiroot_fsolver * s)
+@{
+ printf ("iter = %3u x = % .3f % .3f "
+ "f(x) = % .3e % .3e\n",
+ iter,
+ gsl_vector_get (s->x, 0),
+ gsl_vector_get (s->x, 1),
+ gsl_vector_get (s->f, 0),
+ gsl_vector_get (s->f, 1));
+@}
+@end example
+
+@noindent
+Here are the results of running the program. The algorithm is started at
+@math{(-10,-5)} far from the solution. Since the solution is hidden in
+a narrow valley the earliest steps follow the gradient of the function
+downhill, in an attempt to reduce the large value of the residual. Once
+the root has been approximately located, on iteration 8, the Newton
+behavior takes over and convergence is very rapid.
+
+@smallexample
+iter = 0 x = -10.000 -5.000 f(x) = 1.100e+01 -1.050e+03
+iter = 1 x = -10.000 -5.000 f(x) = 1.100e+01 -1.050e+03
+iter = 2 x = -3.976 24.827 f(x) = 4.976e+00 9.020e+01
+iter = 3 x = -3.976 24.827 f(x) = 4.976e+00 9.020e+01
+iter = 4 x = -3.976 24.827 f(x) = 4.976e+00 9.020e+01
+iter = 5 x = -1.274 -5.680 f(x) = 2.274e+00 -7.302e+01
+iter = 6 x = -1.274 -5.680 f(x) = 2.274e+00 -7.302e+01
+iter = 7 x = 0.249 0.298 f(x) = 7.511e-01 2.359e+00
+iter = 8 x = 0.249 0.298 f(x) = 7.511e-01 2.359e+00
+iter = 9 x = 1.000 0.878 f(x) = 1.268e-10 -1.218e+00
+iter = 10 x = 1.000 0.989 f(x) = 1.124e-11 -1.080e-01
+iter = 11 x = 1.000 1.000 f(x) = 0.000e+00 0.000e+00
+status = success
+@end smallexample
+
+@noindent
+Note that the algorithm does not update the location on every
+iteration. Some iterations are used to adjust the trust-region
+parameter, after trying a step which was found to be divergent, or to
+recompute the Jacobian, when poor convergence behavior is detected.
+
+The next example program adds derivative information, in order to
+accelerate the solution. There are two derivative functions
+@code{rosenbrock_df} and @code{rosenbrock_fdf}. The latter computes both
+the function and its derivative simultaneously. This allows the
+optimization of any common terms. For simplicity we substitute calls to
+the separate @code{f} and @code{df} functions at this point in the code
+below.
+
+@example
+int
+rosenbrock_df (const gsl_vector * x, void *params,
+ gsl_matrix * J)
+@{
+ const double a = ((struct rparams *) params)->a;
+ const double b = ((struct rparams *) params)->b;
+
+ const double x0 = gsl_vector_get (x, 0);
+
+ const double df00 = -a;
+ const double df01 = 0;
+ const double df10 = -2 * b * x0;
+ const double df11 = b;
+
+ gsl_matrix_set (J, 0, 0, df00);
+ gsl_matrix_set (J, 0, 1, df01);
+ gsl_matrix_set (J, 1, 0, df10);
+ gsl_matrix_set (J, 1, 1, df11);
+
+ return GSL_SUCCESS;
+@}
+
+int
+rosenbrock_fdf (const gsl_vector * x, void *params,
+ gsl_vector * f, gsl_matrix * J)
+@{
+ rosenbrock_f (x, params, f);
+ rosenbrock_df (x, params, J);
+
+ return GSL_SUCCESS;
+@}
+@end example
+
+@noindent
+The main program now makes calls to the corresponding @code{fdfsolver}
+versions of the functions,
+
+@example
+int
+main (void)
+@{
+ const gsl_multiroot_fdfsolver_type *T;
+ gsl_multiroot_fdfsolver *s;
+
+ int status;
+ size_t i, iter = 0;
+
+ const size_t n = 2;
+ struct rparams p = @{1.0, 10.0@};
+ gsl_multiroot_function_fdf f = @{&rosenbrock_f,
+ &rosenbrock_df,
+ &rosenbrock_fdf,
+ n, &p@};
+
+ double x_init[2] = @{-10.0, -5.0@};
+ gsl_vector *x = gsl_vector_alloc (n);
+
+ gsl_vector_set (x, 0, x_init[0]);
+ gsl_vector_set (x, 1, x_init[1]);
+
+ T = gsl_multiroot_fdfsolver_gnewton;
+ s = gsl_multiroot_fdfsolver_alloc (T, n);
+ gsl_multiroot_fdfsolver_set (s, &f, x);
+
+ print_state (iter, s);
+
+ do
+ @{
+ iter++;
+
+ status = gsl_multiroot_fdfsolver_iterate (s);
+
+ print_state (iter, s);
+
+ if (status)
+ break;
+
+ status = gsl_multiroot_test_residual (s->f, 1e-7);
+ @}
+ while (status == GSL_CONTINUE && iter < 1000);
+
+ printf ("status = %s\n", gsl_strerror (status));
+
+ gsl_multiroot_fdfsolver_free (s);
+ gsl_vector_free (x);
+ return 0;
+@}
+@end example
+
+@noindent
+The addition of derivative information to the @code{hybrids} solver does
+not make any significant difference to its behavior, since it able to
+approximate the Jacobian numerically with sufficient accuracy. To
+illustrate the behavior of a different derivative solver we switch to
+@code{gnewton}. This is a traditional Newton solver with the constraint
+that it scales back its step if the full step would lead ``uphill''. Here
+is the output for the @code{gnewton} algorithm,
+
+@smallexample
+iter = 0 x = -10.000 -5.000 f(x) = 1.100e+01 -1.050e+03
+iter = 1 x = -4.231 -65.317 f(x) = 5.231e+00 -8.321e+02
+iter = 2 x = 1.000 -26.358 f(x) = -8.882e-16 -2.736e+02
+iter = 3 x = 1.000 1.000 f(x) = -2.220e-16 -4.441e-15
+status = success
+@end smallexample
+
+@noindent
+The convergence is much more rapid, but takes a wide excursion out to
+the point @math{(-4.23,-65.3)}. This could cause the algorithm to go
+astray in a realistic application. The hybrid algorithm follows the
+downhill path to the solution more reliably.
+
+@node References and Further Reading for Multidimensional Root Finding
+@section References and Further Reading
+
+The original version of the Hybrid method is described in the following
+articles by Powell,
+
+@itemize @asis
+@item
+M.J.D. Powell, ``A Hybrid Method for Nonlinear Equations'' (Chap 6, p
+87--114) and ``A Fortran Subroutine for Solving systems of Nonlinear
+Algebraic Equations'' (Chap 7, p 115--161), in @cite{Numerical Methods for
+Nonlinear Algebraic Equations}, P. Rabinowitz, editor. Gordon and
+Breach, 1970.
+@end itemize
+
+@noindent
+The following papers are also relevant to the algorithms described in
+this section,
+
+@itemize @asis
+@item
+J.J. Mor@'e, M.Y. Cosnard, ``Numerical Solution of Nonlinear Equations'',
+@cite{ACM Transactions on Mathematical Software}, Vol 5, No 1, (1979), p 64--85
+
+@item
+C.G. Broyden, ``A Class of Methods for Solving Nonlinear
+Simultaneous Equations'', @cite{Mathematics of Computation}, Vol 19 (1965),
+p 577--593
+
+@item
+J.J. Mor@'e, B.S. Garbow, K.E. Hillstrom, ``Testing Unconstrained
+Optimization Software'', ACM Transactions on Mathematical Software, Vol
+7, No 1 (1981), p 17--41
+@end itemize
+
diff --git a/gsl-1.9/doc/ntuple.eps b/gsl-1.9/doc/ntuple.eps
new file mode 100644
index 0000000..f066477
--- /dev/null
+++ b/gsl-1.9/doc/ntuple.eps
@@ -0,0 +1,555 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: tmp2.eps
+%%Creator: gnuplot 3.5 (pre 3.6) patchlevel beta 347
+%%CreationDate: Mon Jan 22 20:12:36 2001
+%%DocumentFonts: (atend)
+%%BoundingBox: 50 50 410 302
+%%Orientation: Portrait
+%%EndComments
+/gnudict 120 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+/vshift -46 def
+/dl {10 mul} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke gnulinewidth 2 mul setlinewidth } def
+/AL { stroke gnulinewidth 2 div setlinewidth } def
+/UL { gnulinewidth mul /userlinewidth exch def } def
+/PL { stroke userlinewidth setlinewidth } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 dl 2 dl] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 1 0 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
+/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/Pnt { stroke [] 0 setdash
+ gsave 1 setlinecap M 0 0 V stroke grestore } def
+/Dia { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt } def
+/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt } def
+/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt } def
+/Star { 2 copy Pls Crs } def
+/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill } def
+/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill } def
+/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt } def
+/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill } def
+/Pent { stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt } def
+/PentF { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore } def
+/Circle { stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt } def
+/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
+/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def
+/C1 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C2 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C3 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C4 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C5 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc } bind def
+/C6 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C7 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C8 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C9 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C11 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C12 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C13 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C14 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc } bind def
+/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath } bind def
+/Square { dup Rec } bind def
+/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
+/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
+/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
+/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
+/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill
+ Bsquare } bind def
+/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
+/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare } bind def
+/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare } bind def
+/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
+/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare } bind def
+/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
+/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
+/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
+/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
+/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
+/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
+/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
+/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
+/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
+/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
+/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
+/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
+/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
+/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
+/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
+/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
+/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
+/DiaE { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke } def
+/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke } def
+/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke } def
+/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke } def
+/PentE { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore } def
+/CircE { stroke [] 0 setdash
+ hpt 0 360 arc stroke } def
+/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def
+/DiaW { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke } def
+/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke } def
+/TriUW { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke } def
+/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke } def
+/PentW { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore } def
+/CircW { stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke } def
+/BoxFill { gsave Rec 1 setgray fill grestore } def
+end
+%%EndProlog
+gnudict begin
+gsave
+50 50 translate
+0.050 0.050 scale
+0 setgray
+newpath
+(Helvetica) findfont 140 scalefont setfont
+1.000 UL
+LTb
+560 420 M
+63 0 V
+6409 0 R
+-63 0 V
+476 420 M
+(0) Rshow
+560 1310 M
+63 0 V
+6409 0 R
+-63 0 V
+-6493 0 R
+(50) Rshow
+560 2201 M
+63 0 V
+6409 0 R
+-63 0 V
+-6493 0 R
+(100) Rshow
+560 3091 M
+63 0 V
+6409 0 R
+-63 0 V
+-6493 0 R
+(150) Rshow
+560 3982 M
+63 0 V
+6409 0 R
+-63 0 V
+-6493 0 R
+(200) Rshow
+560 4872 M
+63 0 V
+6409 0 R
+-63 0 V
+-6493 0 R
+(250) Rshow
+560 420 M
+0 63 V
+0 4389 R
+0 -63 V
+560 280 M
+(0) Cshow
+1207 420 M
+0 63 V
+0 4389 R
+0 -63 V
+0 -4529 R
+(1) Cshow
+1854 420 M
+0 63 V
+0 4389 R
+0 -63 V
+0 -4529 R
+(2) Cshow
+2502 420 M
+0 63 V
+0 4389 R
+0 -63 V
+0 -4529 R
+(3) Cshow
+3149 420 M
+0 63 V
+0 4389 R
+0 -63 V
+0 -4529 R
+(4) Cshow
+3796 420 M
+0 63 V
+0 4389 R
+0 -63 V
+0 -4529 R
+(5) Cshow
+4443 420 M
+0 63 V
+0 4389 R
+0 -63 V
+0 -4529 R
+(6) Cshow
+5090 420 M
+0 63 V
+0 4389 R
+0 -63 V
+0 -4529 R
+(7) Cshow
+5738 420 M
+0 63 V
+0 4389 R
+0 -63 V
+0 -4529 R
+(8) Cshow
+6385 420 M
+0 63 V
+0 4389 R
+0 -63 V
+0 -4529 R
+(9) Cshow
+7032 420 M
+0 63 V
+0 4389 R
+0 -63 V
+0 -4529 R
+(10) Cshow
+1.000 UL
+LTb
+560 420 M
+6472 0 V
+0 4452 V
+-6472 0 V
+560 420 L
+0 2646 M
+currentpoint gsave translate 90 rotate 0 0 M
+(n) Cshow
+grestore
+3796 140 M
+(E2) Cshow
+1.000 UL
+LT0
+560 420 M
+65 0 V
+64 0 V
+65 0 V
+65 0 V
+65 0 V
+64 0 V
+65 0 V
+65 0 V
+64 0 V
+65 0 V
+65 0 V
+65 0 V
+64 0 V
+65 0 V
+65 0 V
+0 4149 V
+65 0 V
+0 36 V
+64 0 V
+0 -766 V
+65 0 V
+0 623 V
+65 0 V
+0 -552 V
+64 0 V
+0 54 V
+65 0 V
+0 -143 V
+65 0 V
+0 -302 V
+65 0 V
+0 35 V
+64 0 V
+0 160 V
+65 0 V
+0 -195 V
+65 0 V
+0 -89 V
+64 0 V
+0 -161 V
+65 0 V
+0 -142 V
+65 0 V
+0 160 V
+65 0 V
+0 -516 V
+64 0 V
+0 71 V
+65 0 V
+0 214 V
+65 0 V
+0 -250 V
+64 0 V
+0 107 V
+65 0 V
+0 -267 V
+65 0 V
+0 -196 V
+65 0 V
+0 196 V
+64 0 V
+0 -374 V
+65 0 V
+0 516 V
+65 0 V
+0 -356 V
+65 0 V
+0 -463 V
+64 0 V
+0 -53 V
+65 0 V
+0 320 V
+65 0 V
+0 -231 V
+64 0 V
+0 36 V
+65 0 V
+0 -72 V
+65 0 V
+0 339 V
+65 0 V
+0 -196 V
+64 0 V
+65 0 V
+0 -303 V
+65 0 V
+0 -267 V
+64 0 V
+0 214 V
+65 0 V
+0 -178 V
+65 0 V
+0 -36 V
+65 0 V
+0 -54 V
+64 0 V
+0 -142 V
+65 0 V
+0 249 V
+65 0 V
+0 -374 V
+64 0 V
+0 -35 V
+65 0 V
+0 35 V
+65 0 V
+0 -17 V
+65 0 V
+0 17 V
+64 0 V
+0 -178 V
+65 0 V
+0 -35 V
+65 0 V
+0 89 V
+65 0 V
+0 35 V
+64 0 V
+0 -213 V
+65 0 V
+0 106 V
+65 0 V
+0 143 V
+64 0 V
+0 -249 V
+65 0 V
+0 142 V
+65 0 V
+0 -107 V
+65 0 V
+0 -142 V
+64 0 V
+0 142 V
+65 0 V
+0 -142 V
+65 0 V
+0 89 V
+64 0 V
+0 -71 V
+65 0 V
+0 89 V
+65 0 V
+0 -72 V
+65 0 V
+0 54 V
+64 0 V
+0 -160 V
+65 0 V
+0 71 V
+65 0 V
+0 -71 V
+64 0 V
+0 -143 V
+65 0 V
+0 125 V
+65 0 V
+0 89 V
+65 0 V
+0 -214 V
+64 0 V
+0 125 V
+65 0 V
+0 18 V
+65 0 V
+0 -214 V
+65 0 V
+0 160 V
+64 0 V
+0 36 V
+65 0 V
+0 -178 V
+65 0 V
+0 71 V
+64 0 V
+0 -18 V
+65 0 V
+0 -18 V
+65 0 V
+0 72 V
+65 0 V
+0 -54 V
+64 0 V
+0 54 V
+stroke
+grestore
+end
+showpage
+%%Trailer
+%%DocumentFonts: Helvetica
diff --git a/gsl-1.9/doc/ntuple.texi b/gsl-1.9/doc/ntuple.texi
new file mode 100644
index 0000000..ccbd156
--- /dev/null
+++ b/gsl-1.9/doc/ntuple.texi
@@ -0,0 +1,194 @@
+@cindex ntuples
+
+This chapter describes functions for creating and manipulating
+@dfn{ntuples}, sets of values associated with events. The ntuples
+are stored in files. Their values can be extracted in any combination
+and @dfn{booked} in a histogram using a selection function.
+
+The values to be stored are held in a user-defined data structure, and
+an ntuple is created associating this data structure with a file. The
+values are then written to the file (normally inside a loop) using
+the ntuple functions described below.
+
+A histogram can be created from ntuple data by providing a selection
+function and a value function. The selection function specifies whether
+an event should be included in the subset to be analyzed or not. The value
+function computes the entry to be added to the histogram for each
+event.
+
+All the ntuple functions are defined in the header file
+@file{gsl_ntuple.h}
+
+@menu
+* The ntuple struct::
+* Creating ntuples::
+* Opening an existing ntuple file::
+* Writing ntuples::
+* Reading ntuples ::
+* Closing an ntuple file::
+* Histogramming ntuple values::
+* Example ntuple programs::
+* Ntuple References and Further Reading::
+@end menu
+
+@node The ntuple struct
+@section The ntuple struct
+
+Ntuples are manipulated using the @code{gsl_ntuple} struct. This struct
+contains information on the file where the ntuple data is stored, a
+pointer to the current ntuple data row and the size of the user-defined
+ntuple data struct.
+
+@example
+typedef struct @{
+ FILE * file;
+ void * ntuple_data;
+ size_t size;
+@} gsl_ntuple;
+@end example
+
+@node Creating ntuples
+@section Creating ntuples
+
+@deftypefun {gsl_ntuple *} gsl_ntuple_create (char * @var{filename}, void * @var{ntuple_data}, size_t @var{size})
+This function creates a new write-only ntuple file @var{filename} for
+ntuples of size @var{size} and returns a pointer to the newly created
+ntuple struct. Any existing file with the same name is truncated to
+zero length and overwritten. A pointer to memory for the current ntuple
+row @var{ntuple_data} must be supplied---this is used to copy ntuples
+in and out of the file.
+@end deftypefun
+
+@node Opening an existing ntuple file
+@section Opening an existing ntuple file
+
+@deftypefun {gsl_ntuple *} gsl_ntuple_open (char * @var{filename}, void * @var{ntuple_data}, size_t @var{size})
+This function opens an existing ntuple file @var{filename} for reading
+and returns a pointer to a corresponding ntuple struct. The ntuples in
+the file must have size @var{size}. A pointer to memory for the current
+ntuple row @var{ntuple_data} must be supplied---this is used to copy
+ntuples in and out of the file.
+@end deftypefun
+
+@node Writing ntuples
+@section Writing ntuples
+
+@deftypefun int gsl_ntuple_write (gsl_ntuple * @var{ntuple})
+This function writes the current ntuple @var{ntuple->ntuple_data} of
+size @var{ntuple->size} to the corresponding file.
+@end deftypefun
+
+@deftypefun int gsl_ntuple_bookdata (gsl_ntuple * @var{ntuple})
+This function is a synonym for @code{gsl_ntuple_write}.
+@end deftypefun
+
+@node Reading ntuples
+@section Reading ntuples
+
+@deftypefun int gsl_ntuple_read (gsl_ntuple * @var{ntuple})
+This function reads the current row of the ntuple file for @var{ntuple}
+and stores the values in @var{ntuple->data}.
+@end deftypefun
+
+@node Closing an ntuple file
+@section Closing an ntuple file
+
+@deftypefun int gsl_ntuple_close (gsl_ntuple * @var{ntuple})
+This function closes the ntuple file @var{ntuple} and frees its
+associated allocated memory.
+@end deftypefun
+
+@node Histogramming ntuple values
+@section Histogramming ntuple values
+
+Once an ntuple has been created its contents can be histogrammed in
+various ways using the function @code{gsl_ntuple_project}. Two
+user-defined functions must be provided, a function to select events and
+a function to compute scalar values. The selection function and the
+value function both accept the ntuple row as a first argument and other
+parameters as a second argument.
+
+@cindex selection function, ntuples
+The @dfn{selection function} determines which ntuple rows are selected
+for histogramming. It is defined by the following struct,
+@smallexample
+typedef struct @{
+ int (* function) (void * ntuple_data, void * params);
+ void * params;
+@} gsl_ntuple_select_fn;
+@end smallexample
+
+@noindent
+The struct component @var{function} should return a non-zero value for
+each ntuple row that is to be included in the histogram.
+
+@cindex value function, ntuples
+The @dfn{value function} computes scalar values for those ntuple rows
+selected by the selection function,
+@smallexample
+typedef struct @{
+ double (* function) (void * ntuple_data, void * params);
+ void * params;
+@} gsl_ntuple_value_fn;
+@end smallexample
+
+@noindent
+In this case the struct component @var{function} should return the value
+to be added to the histogram for the ntuple row.
+
+@cindex histogram, from ntuple
+@cindex projection of ntuples
+@deftypefun int gsl_ntuple_project (gsl_histogram * @var{h}, gsl_ntuple * @var{ntuple}, gsl_ntuple_value_fn * @var{value_func}, gsl_ntuple_select_fn * @var{select_func})
+This function updates the histogram @var{h} from the ntuple @var{ntuple}
+using the functions @var{value_func} and @var{select_func}. For each
+ntuple row where the selection function @var{select_func} is non-zero the
+corresponding value of that row is computed using the function
+@var{value_func} and added to the histogram. Those ntuple rows where
+@var{select_func} returns zero are ignored. New entries are added to
+the histogram, so subsequent calls can be used to accumulate further
+data in the same histogram.
+@end deftypefun
+
+@node Example ntuple programs
+@section Examples
+
+The following example programs demonstrate the use of ntuples in
+managing a large dataset. The first program creates a set of 10,000
+simulated ``events'', each with 3 associated values @math{(x,y,z)}. These
+are generated from a gaussian distribution with unit variance, for
+demonstration purposes, and written to the ntuple file @file{test.dat}.
+
+@example
+@verbatiminclude examples/ntuplew.c
+@end example
+
+@noindent
+The next program analyses the ntuple data in the file @file{test.dat}.
+The analysis procedure is to compute the squared-magnitude of each
+event, @math{E^2=x^2+y^2+z^2}, and select only those which exceed a
+lower limit of 1.5. The selected events are then histogrammed using
+their @math{E^2} values.
+
+@example
+@verbatiminclude examples/ntupler.c
+@end example
+
+@need 3000
+The following plot shows the distribution of the selected events.
+Note the cut-off at the lower bound.
+
+@iftex
+@sp 1
+@center @image{ntuple,3.4in}
+@end iftex
+
+@node Ntuple References and Further Reading
+@section References and Further Reading
+@cindex PAW
+@cindex HBOOK
+
+Further information on the use of ntuples can be found in the
+documentation for the @sc{cern} packages @sc{paw} and @sc{hbook}
+(available online).
+
+
diff --git a/gsl-1.9/doc/ode-initval.texi b/gsl-1.9/doc/ode-initval.texi
new file mode 100644
index 0000000..ae8e68b
--- /dev/null
+++ b/gsl-1.9/doc/ode-initval.texi
@@ -0,0 +1,556 @@
+@cindex differential equations, initial value problems
+@cindex initial value problems, differential equations
+@cindex ordinary differential equations, initial value problem
+@cindex ODEs, initial value problems
+This chapter describes functions for solving ordinary differential
+equation (ODE) initial value problems. The library provides a variety
+of low-level methods, such as Runge-Kutta and Bulirsch-Stoer routines,
+and higher-level components for adaptive step-size control. The
+components can be combined by the user to achieve the desired solution,
+with full access to any intermediate steps.
+
+These functions are declared in the header file @file{gsl_odeiv.h}.
+
+@menu
+* Defining the ODE System::
+* Stepping Functions::
+* Adaptive Step-size Control::
+* Evolution::
+* ODE Example programs::
+* ODE References and Further Reading::
+@end menu
+
+@node Defining the ODE System
+@section Defining the ODE System
+
+The routines solve the general @math{n}-dimensional first-order system,
+@tex
+\beforedisplay
+$$
+{dy_i(t) \over dt} = f_i (t, y_1(t), \dots y_n(t))
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+dy_i(t)/dt = f_i(t, y_1(t), ..., y_n(t))
+@end example
+
+@end ifinfo
+@noindent
+for @math{i = 1, \dots, n}. The stepping functions rely on the vector
+of derivatives @math{f_i} and the Jacobian matrix,
+@c{$J_{ij} = \partial f_i(t, y(t)) / \partial y_j$}
+@math{J_@{ij@} = df_i(t,y(t)) / dy_j}.
+A system of equations is defined using the @code{gsl_odeiv_system}
+datatype.
+
+@deftp {Data Type} gsl_odeiv_system
+This data type defines a general ODE system with arbitrary parameters.
+
+@table @code
+@item int (* function) (double t, const double y[], double dydt[], void * params)
+This function should store the vector elements
+@c{$f_i(t,y,\hbox{\it params})$}
+@math{f_i(t,y,params)} in the array @var{dydt},
+for arguments (@var{t},@var{y}) and parameters @var{params}.
+The function should return @code{GSL_SUCCESS} if the calculation
+was completed successfully. Any other return value indicates
+an error.
+
+@item int (* jacobian) (double t, const double y[], double * dfdy, double dfdt[], void * params);
+This function should store the vector of derivative elements
+@c{$\partial f_i(t,y,params) / \partial t$}
+@math{df_i(t,y,params)/dt} in the array @var{dfdt} and the
+Jacobian matrix @c{$J_{ij}$}
+@math{J_@{ij@}} in the array
+@var{dfdy}, regarded as a row-ordered matrix @code{J(i,j) = dfdy[i * dimension + j]}
+where @code{dimension} is the dimension of the system.
+The function should return @code{GSL_SUCCESS} if the calculation
+was completed successfully. Any other return value indicates
+an error.
+
+Some of the simpler solver algorithms do not make use of the Jacobian
+matrix, so it is not always strictly necessary to provide it (the
+@code{jacobian} element of the struct can be replaced by a null pointer
+for those algorithms). However, it is useful to provide the Jacobian to allow
+the solver algorithms to be interchanged---the best algorithms make use
+of the Jacobian.
+
+@item size_t dimension;
+This is the dimension of the system of equations.
+
+@item void * params
+This is a pointer to the arbitrary parameters of the system.
+@end table
+@end deftp
+
+@node Stepping Functions
+@section Stepping Functions
+
+The lowest level components are the @dfn{stepping functions} which
+advance a solution from time @math{t} to @math{t+h} for a fixed
+step-size @math{h} and estimate the resulting local error.
+
+@deftypefun {gsl_odeiv_step *} gsl_odeiv_step_alloc (const gsl_odeiv_step_type * @var{T}, size_t @var{dim})
+This function returns a pointer to a newly allocated instance of a
+stepping function of type @var{T} for a system of @var{dim} dimensions.
+@end deftypefun
+
+@deftypefun int gsl_odeiv_step_reset (gsl_odeiv_step * @var{s})
+This function resets the stepping function @var{s}. It should be used
+whenever the next use of @var{s} will not be a continuation of a
+previous step.
+@end deftypefun
+
+@deftypefun void gsl_odeiv_step_free (gsl_odeiv_step * @var{s})
+This function frees all the memory associated with the stepping function
+@var{s}.
+@end deftypefun
+
+@deftypefun {const char *} gsl_odeiv_step_name (const gsl_odeiv_step * @var{s})
+This function returns a pointer to the name of the stepping function.
+For example,
+
+@example
+printf ("step method is '%s'\n",
+ gsl_odeiv_step_name (s));
+@end example
+
+@noindent
+would print something like @code{step method is 'rk4'}.
+@end deftypefun
+
+@deftypefun {unsigned int} gsl_odeiv_step_order (const gsl_odeiv_step * @var{s})
+This function returns the order of the stepping function on the previous
+step. This order can vary if the stepping function itself is adaptive.
+@end deftypefun
+
+@deftypefun int gsl_odeiv_step_apply (gsl_odeiv_step * @var{s}, double @var{t}, double @var{h}, double @var{y}[], double @var{yerr}[], const double @var{dydt_in}[], double @var{dydt_out}[], const gsl_odeiv_system * @var{dydt})
+This function applies the stepping function @var{s} to the system of
+equations defined by @var{dydt}, using the step size @var{h} to advance
+the system from time @var{t} and state @var{y} to time @var{t}+@var{h}.
+The new state of the system is stored in @var{y} on output, with an
+estimate of the absolute error in each component stored in @var{yerr}.
+If the argument @var{dydt_in} is not null it should point an array
+containing the derivatives for the system at time @var{t} on input. This
+is optional as the derivatives will be computed internally if they are
+not provided, but allows the reuse of existing derivative information.
+On output the new derivatives of the system at time @var{t}+@var{h} will
+be stored in @var{dydt_out} if it is not null.
+
+If the user-supplied functions defined in the system @var{dydt} return a
+status other than @code{GSL_SUCCESS} the step will be aborted. In this
+case, the elements of @var{y} will be restored to their pre-step values
+and the error code from the user-supplied function will be returned.
+The step-size @var{h} will be set to the step-size which caused the error.
+If the function is called again with a smaller step-size, e.g. @math{@var{h}/10},
+it should be possible to get closer to any singularity.
+To distinguish between error codes from the user-supplied functions and
+those from @code{gsl_odeiv_step_apply} itself, any user-defined return
+values should be distinct from the standard GSL error codes.
+@end deftypefun
+
+The following algorithms are available,
+
+@deffn {Step Type} gsl_odeiv_step_rk2
+@cindex RK2, Runge-Kutta method
+@cindex Runge-Kutta methods, ordinary differential equations
+Embedded Runge-Kutta (2, 3) method.
+@end deffn
+
+@deffn {Step Type} gsl_odeiv_step_rk4
+@cindex RK4, Runge-Kutta method
+4th order (classical) Runge-Kutta.
+@end deffn
+
+@deffn {Step Type} gsl_odeiv_step_rkf45
+@cindex Fehlberg method, differential equations
+@cindex RKF45, Runge-Kutta-Fehlberg method
+Embedded Runge-Kutta-Fehlberg (4, 5) method. This method is a good
+general-purpose integrator.
+@end deffn
+
+@deffn {Step Type} gsl_odeiv_step_rkck
+@cindex Runge-Kutta Cash-Karp method
+@cindex Cash-Karp, Runge-Kutta method
+Embedded Runge-Kutta Cash-Karp (4, 5) method.
+@end deffn
+
+@deffn {Step Type} gsl_odeiv_step_rk8pd
+@cindex Runge-Kutta Prince-Dormand method
+@cindex Prince-Dormand, Runge-Kutta method
+Embedded Runge-Kutta Prince-Dormand (8,9) method.
+@end deffn
+
+@deffn {Step Type} gsl_odeiv_step_rk2imp
+Implicit 2nd order Runge-Kutta at Gaussian points.
+@end deffn
+
+@deffn {Step Type} gsl_odeiv_step_rk4imp
+Implicit 4th order Runge-Kutta at Gaussian points.
+@end deffn
+
+@deffn {Step Type} gsl_odeiv_step_bsimp
+@cindex Bulirsch-Stoer method
+@cindex Bader and Deuflhard, Bulirsch-Stoer method.
+@cindex Deuflhard and Bader, Bulirsch-Stoer method.
+Implicit Bulirsch-Stoer method of Bader and Deuflhard. This algorithm
+requires the Jacobian.
+@end deffn
+
+@deffn {Step Type} gsl_odeiv_step_gear1
+@cindex Gear method, differential equations
+M=1 implicit Gear method.
+@end deffn
+
+@deffn {Step Type} gsl_odeiv_step_gear2
+M=2 implicit Gear method.
+@end deffn
+
+@node Adaptive Step-size Control
+@section Adaptive Step-size Control
+@cindex Adaptive step-size control, differential equations
+
+The control function examines the proposed change to the solution
+produced by a stepping function and attempts to determine the optimal
+step-size for a user-specified level of error.
+
+@deftypefun {gsl_odeiv_control *} gsl_odeiv_control_standard_new (double @var{eps_abs}, double @var{eps_rel}, double @var{a_y}, double @var{a_dydt})
+The standard control object is a four parameter heuristic based on
+absolute and relative errors @var{eps_abs} and @var{eps_rel}, and
+scaling factors @var{a_y} and @var{a_dydt} for the system state
+@math{y(t)} and derivatives @math{y'(t)} respectively.
+
+The step-size adjustment procedure for this method begins by computing
+the desired error level @math{D_i} for each component,
+@tex
+\beforedisplay
+$$
+D_i = \epsilon_{abs} + \epsilon_{rel} * (a_{y} |y_i| + a_{dydt} h |y'_i|)
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+D_i = eps_abs + eps_rel * (a_y |y_i| + a_dydt h |y'_i|)
+@end example
+
+@end ifinfo
+@noindent
+and comparing it with the observed error @math{E_i = |yerr_i|}. If the
+observed error @var{E} exceeds the desired error level @var{D} by more
+than 10% for any component then the method reduces the step-size by an
+appropriate factor,
+@tex
+\beforedisplay
+$$
+h_{new} = h_{old} * S * (E/D)^{-1/q}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+h_new = h_old * S * (E/D)^(-1/q)
+@end example
+
+@end ifinfo
+@noindent
+where @math{q} is the consistency order of the method (e.g. @math{q=4} for
+4(5) embedded RK), and @math{S} is a safety factor of 0.9. The ratio
+@math{E/D} is taken to be the maximum of the ratios
+@math{E_i/D_i}.
+
+If the observed error @math{E} is less than 50% of the desired error
+level @var{D} for the maximum ratio @math{E_i/D_i} then the algorithm
+takes the opportunity to increase the step-size to bring the error in
+line with the desired level,
+@tex
+\beforedisplay
+$$
+h_{new} = h_{old} * S * (E/D)^{-1/(q+1)}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+h_new = h_old * S * (E/D)^(-1/(q+1))
+@end example
+
+@end ifinfo
+@noindent
+This encompasses all the standard error scaling methods. To avoid
+uncontrolled changes in the stepsize, the overall scaling factor is
+limited to the range @math{1/5} to 5.
+@end deftypefun
+
+@deftypefun {gsl_odeiv_control *} gsl_odeiv_control_y_new (double @var{eps_abs}, double @var{eps_rel})
+This function creates a new control object which will keep the local
+error on each step within an absolute error of @var{eps_abs} and
+relative error of @var{eps_rel} with respect to the solution @math{y_i(t)}.
+This is equivalent to the standard control object with @var{a_y}=1 and
+@var{a_dydt}=0.
+@end deftypefun
+
+@deftypefun {gsl_odeiv_control *} gsl_odeiv_control_yp_new (double @var{eps_abs}, double @var{eps_rel})
+This function creates a new control object which will keep the local
+error on each step within an absolute error of @var{eps_abs} and
+relative error of @var{eps_rel} with respect to the derivatives of the
+solution @math{y'_i(t)}. This is equivalent to the standard control
+object with @var{a_y}=0 and @var{a_dydt}=1.
+@end deftypefun
+
+
+@deftypefun {gsl_odeiv_control *} gsl_odeiv_control_scaled_new (double @var{eps_abs}, double @var{eps_rel}, double @var{a_y}, double @var{a_dydt}, const double @var{scale_abs}[], size_t @var{dim})
+This function creates a new control object which uses the same algorithm
+as @code{gsl_odeiv_control_standard_new} but with an absolute error
+which is scaled for each component by the array @var{scale_abs}.
+The formula for @math{D_i} for this control object is,
+@tex
+\beforedisplay
+$$
+D_i = \epsilon_{abs} s_i + \epsilon_{rel} * (a_{y} |y_i| + a_{dydt} h |y'_i|)
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+D_i = eps_abs * s_i + eps_rel * (a_y |y_i| + a_dydt h |y'_i|)
+@end example
+
+@end ifinfo
+@noindent
+where @math{s_i} is the @math{i}-th component of the array @var{scale_abs}.
+The same error control heuristic is used by the Matlab @sc{ode} suite.
+@end deftypefun
+
+@deftypefun {gsl_odeiv_control *} gsl_odeiv_control_alloc (const gsl_odeiv_control_type * @var{T})
+This function returns a pointer to a newly allocated instance of a
+control function of type @var{T}. This function is only needed for
+defining new types of control functions. For most purposes the standard
+control functions described above should be sufficient.
+@end deftypefun
+
+@deftypefun int gsl_odeiv_control_init (gsl_odeiv_control * @var{c}, double @var{eps_abs}, double @var{eps_rel}, double @var{a_y}, double @var{a_dydt})
+This function initializes the control function @var{c} with the
+parameters @var{eps_abs} (absolute error), @var{eps_rel} (relative
+error), @var{a_y} (scaling factor for y) and @var{a_dydt} (scaling
+factor for derivatives).
+@end deftypefun
+
+@deftypefun void gsl_odeiv_control_free (gsl_odeiv_control * @var{c})
+This function frees all the memory associated with the control function
+@var{c}.
+@end deftypefun
+
+@deftypefun int gsl_odeiv_control_hadjust (gsl_odeiv_control * @var{c}, gsl_odeiv_step * @var{s}, const double @var{y}[], const double @var{yerr}[], const double @var{dydt}[], double * @var{h})
+This function adjusts the step-size @var{h} using the control function
+@var{c}, and the current values of @var{y}, @var{yerr} and @var{dydt}.
+The stepping function @var{step} is also needed to determine the order
+of the method. If the error in the y-values @var{yerr} is found to be
+too large then the step-size @var{h} is reduced and the function returns
+@code{GSL_ODEIV_HADJ_DEC}. If the error is sufficiently small then
+@var{h} may be increased and @code{GSL_ODEIV_HADJ_INC} is returned. The
+function returns @code{GSL_ODEIV_HADJ_NIL} if the step-size is
+unchanged. The goal of the function is to estimate the largest
+step-size which satisfies the user-specified accuracy requirements for
+the current point.
+@end deftypefun
+
+@deftypefun {const char *} gsl_odeiv_control_name (const gsl_odeiv_control * @var{c})
+This function returns a pointer to the name of the control function.
+For example,
+
+@example
+printf ("control method is '%s'\n",
+ gsl_odeiv_control_name (c));
+@end example
+
+@noindent
+would print something like @code{control method is 'standard'}
+@end deftypefun
+
+
+@node Evolution
+@section Evolution
+
+The highest level of the system is the evolution function which combines
+the results of a stepping function and control function to reliably
+advance the solution forward over an interval @math{(t_0, t_1)}. If the
+control function signals that the step-size should be decreased the
+evolution function backs out of the current step and tries the proposed
+smaller step-size. This process is continued until an acceptable
+step-size is found.
+
+@deftypefun {gsl_odeiv_evolve *} gsl_odeiv_evolve_alloc (size_t @var{dim})
+This function returns a pointer to a newly allocated instance of an
+evolution function for a system of @var{dim} dimensions.
+@end deftypefun
+
+@deftypefun int gsl_odeiv_evolve_apply (gsl_odeiv_evolve * @var{e}, gsl_odeiv_control * @var{con}, gsl_odeiv_step * @var{step}, const gsl_odeiv_system * @var{dydt}, double * @var{t}, double @var{t1}, double * @var{h}, double @var{y}[])
+This function advances the system (@var{e}, @var{dydt}) from time
+@var{t} and position @var{y} using the stepping function @var{step}.
+The new time and position are stored in @var{t} and @var{y} on output.
+The initial step-size is taken as @var{h}, but this will be modified
+using the control function @var{c} to achieve the appropriate error
+bound if necessary. The routine may make several calls to @var{step} in
+order to determine the optimum step-size. An estimate of
+the local error for the step can be obtained from the components of the array @code{@var{e}->yerr[]}.
+If the step-size has been changed the value of @var{h} will be modified on output.
+The maximum time @var{t1} is guaranteed not to be exceeded by the time-step. On the
+final time-step the value of @var{t} will be set to @var{t1} exactly.
+
+If the user-supplied functions defined in the system @var{dydt} return a
+status other than @code{GSL_SUCCESS} the step will be aborted. In this
+case, @var{t} and @var{y} will be restored to their pre-step values
+and the error code from the user-supplied function will be returned. To
+distinguish between error codes from the user-supplied functions and
+those from @code{gsl_odeiv_evolve_apply} itself, any user-defined return
+values should be distinct from the standard GSL error codes.
+@end deftypefun
+
+@deftypefun int gsl_odeiv_evolve_reset (gsl_odeiv_evolve * @var{e})
+This function resets the evolution function @var{e}. It should be used
+whenever the next use of @var{e} will not be a continuation of a
+previous step.
+@end deftypefun
+
+@deftypefun void gsl_odeiv_evolve_free (gsl_odeiv_evolve * @var{e})
+This function frees all the memory associated with the evolution function
+@var{e}.
+@end deftypefun
+
+@node ODE Example programs
+@section Examples
+@cindex Van der Pol oscillator, example
+The following program solves the second-order nonlinear Van der Pol
+oscillator equation,
+@tex
+\beforedisplay
+$$
+x''(t) + \mu x'(t) (x(t)^2 - 1) + x(t) = 0
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+x''(t) + \mu x'(t) (x(t)^2 - 1) + x(t) = 0
+@end example
+
+@end ifinfo
+@noindent
+This can be converted into a first order system suitable for use with
+the routines described in this chapter by introducing a separate
+variable for the velocity, @math{y = x'(t)},
+@tex
+\beforedisplay
+$$
+\eqalign{
+x' &= y\cr
+y' &= -x + \mu y (1-x^2)
+}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+x' = y
+y' = -x + \mu y (1-x^2)
+@end example
+
+@end ifinfo
+@noindent
+The program begins by defining functions for these derivatives and
+their Jacobian,
+
+@example
+@verbatiminclude examples/ode-initval.c
+@end example
+
+@noindent
+For functions with multiple parameters, the appropriate information
+can be passed in through the @var{params} argument using a pointer to
+a struct.
+
+The main loop of the program evolves the solution from @math{(y, y') =
+(1, 0)} at @math{t=0} to @math{t=100}. The step-size @math{h} is
+automatically adjusted by the controller to maintain an absolute
+accuracy of @c{$10^{-6}$}
+@math{10^@{-6@}} in the function values @var{y}.
+
+@iftex
+@sp 1
+@center @image{vdp,3.4in}
+@center Numerical solution of the Van der Pol oscillator equation
+@center using Prince-Dormand 8th order Runge-Kutta.
+@end iftex
+
+@noindent
+To obtain the values at regular intervals, rather than the variable
+spacings chosen by the control function, the main loop can be modified
+to advance the solution from one point to the next. For example, the
+following main loop prints the solution at the fixed points @math{t = 0,
+1, 2, \dots, 100},
+
+@example
+ for (i = 1; i <= 100; i++)
+ @{
+ double ti = i * t1 / 100.0;
+
+ while (t < ti)
+ @{
+ gsl_odeiv_evolve_apply (e, c, s,
+ &sys,
+ &t, ti, &h,
+ y);
+ @}
+
+ printf ("%.5e %.5e %.5e\n", t, y[0], y[1]);
+ @}
+@end example
+
+@noindent
+It is also possible to work with a non-adaptive integrator, using only
+the stepping function itself. The following program uses the @code{rk4}
+fourth-order Runge-Kutta stepping function with a fixed stepsize of
+0.01,
+
+@example
+@verbatiminclude examples/odefixed.c
+@end example
+
+@noindent
+The derivatives must be initialized for the starting point @math{t=0}
+before the first step is taken. Subsequent steps use the output
+derivatives @var{dydt_out} as inputs to the next step by copying their
+values into @var{dydt_in}.
+
+@node ODE References and Further Reading
+@section References and Further Reading
+
+Many of the basic Runge-Kutta formulas can be found in the Handbook of
+Mathematical Functions,
+
+@itemize @asis
+@item
+Abramowitz & Stegun (eds.), @cite{Handbook of Mathematical Functions},
+Section 25.5.
+@end itemize
+
+@noindent
+The implicit Bulirsch-Stoer algorithm @code{bsimp} is described in the
+following paper,
+
+@itemize @asis
+@item
+G. Bader and P. Deuflhard, ``A Semi-Implicit Mid-Point Rule for Stiff
+Systems of Ordinary Differential Equations.'', Numer.@: Math.@: 41, 373--398,
+1983.
+@end itemize
diff --git a/gsl-1.9/doc/permutation.texi b/gsl-1.9/doc/permutation.texi
new file mode 100644
index 0000000..4ae54b9
--- /dev/null
+++ b/gsl-1.9/doc/permutation.texi
@@ -0,0 +1,377 @@
+@cindex permutations
+
+This chapter describes functions for creating and manipulating
+permutations. A permutation @math{p} is represented by an array of
+@math{n} integers in the range 0 to @math{n-1}, where each value
+@math{p_i} occurs once and only once. The application of a permutation
+@math{p} to a vector @math{v} yields a new vector @math{v'} where
+@c{$v'_i = v_{p_i}$}
+@math{v'_i = v_@{p_i@}}.
+For example, the array @math{(0,1,3,2)} represents a permutation
+which exchanges the last two elements of a four element vector.
+The corresponding identity permutation is @math{(0,1,2,3)}.
+
+Note that the permutations produced by the linear algebra routines
+correspond to the exchange of matrix columns, and so should be considered
+as applying to row-vectors in the form @math{v' = v P} rather than
+column-vectors, when permuting the elements of a vector.
+
+The functions described in this chapter are defined in the header file
+@file{gsl_permutation.h}.
+
+@menu
+* The Permutation struct::
+* Permutation allocation::
+* Accessing permutation elements::
+* Permutation properties::
+* Permutation functions::
+* Applying Permutations::
+* Reading and writing permutations::
+* Permutations in cyclic form::
+* Permutation Examples::
+* Permutation References and Further Reading::
+@end menu
+
+@node The Permutation struct
+@section The Permutation struct
+
+A permutation is defined by a structure containing two components, the size
+of the permutation and a pointer to the permutation array. The elements
+of the permutation array are all of type @code{size_t}. The
+@code{gsl_permutation} structure looks like this,
+
+@example
+typedef struct
+@{
+ size_t size;
+ size_t * data;
+@} gsl_permutation;
+@end example
+@comment
+
+@noindent
+
+@node Permutation allocation
+@section Permutation allocation
+
+@deftypefun {gsl_permutation *} gsl_permutation_alloc (size_t @var{n})
+This function allocates memory for a new permutation of size @var{n}.
+The permutation is not initialized and its elements are undefined. Use
+the function @code{gsl_permutation_calloc} if you want to create a
+permutation which is initialized to the identity. A null pointer is
+returned if insufficient memory is available to create the permutation.
+@end deftypefun
+
+@deftypefun {gsl_permutation *} gsl_permutation_calloc (size_t @var{n})
+This function allocates memory for a new permutation of size @var{n} and
+initializes it to the identity. A null pointer is returned if
+insufficient memory is available to create the permutation.
+@end deftypefun
+
+@deftypefun void gsl_permutation_init (gsl_permutation * @var{p})
+@cindex identity permutation
+This function initializes the permutation @var{p} to the identity, i.e.
+@math{(0,1,2,@dots{},n-1)}.
+@end deftypefun
+
+@deftypefun void gsl_permutation_free (gsl_permutation * @var{p})
+This function frees all the memory used by the permutation @var{p}.
+@end deftypefun
+
+@deftypefun int gsl_permutation_memcpy (gsl_permutation * @var{dest}, const gsl_permutation * @var{src})
+This function copies the elements of the permutation @var{src} into the
+permutation @var{dest}. The two permutations must have the same size.
+@end deftypefun
+
+@node Accessing permutation elements
+@section Accessing permutation elements
+
+The following functions can be used to access and manipulate
+permutations.
+
+@deftypefun size_t gsl_permutation_get (const gsl_permutation * @var{p}, const size_t @var{i})
+This function returns the value of the @var{i}-th element of the
+permutation @var{p}. If @var{i} lies outside the allowed range of 0 to
+@math{@var{n}-1} then the error handler is invoked and 0 is returned.
+@end deftypefun
+
+@deftypefun int gsl_permutation_swap (gsl_permutation * @var{p}, const size_t @var{i}, const size_t @var{j})
+@cindex exchanging permutation elements
+@cindex swapping permutation elements
+This function exchanges the @var{i}-th and @var{j}-th elements of the
+permutation @var{p}.
+@end deftypefun
+
+@node Permutation properties
+@section Permutation properties
+
+@deftypefun size_t gsl_permutation_size (const gsl_permutation * @var{p})
+This function returns the size of the permutation @var{p}.
+@end deftypefun
+
+@deftypefun {size_t *} gsl_permutation_data (const gsl_permutation * @var{p})
+This function returns a pointer to the array of elements in the
+permutation @var{p}.
+@end deftypefun
+
+@deftypefun int gsl_permutation_valid (gsl_permutation * @var{p})
+@cindex checking permutation for validity
+@cindex testing permutation for validity
+This function checks that the permutation @var{p} is valid. The @var{n}
+elements should contain each of the numbers 0 to @math{@var{n}-1} once and only
+once.
+@end deftypefun
+
+@node Permutation functions
+@section Permutation functions
+
+@deftypefun void gsl_permutation_reverse (gsl_permutation * @var{p})
+@cindex reversing a permutation
+This function reverses the elements of the permutation @var{p}.
+@end deftypefun
+
+@deftypefun int gsl_permutation_inverse (gsl_permutation * @var{inv}, const gsl_permutation * @var{p})
+@cindex inverting a permutation
+This function computes the inverse of the permutation @var{p}, storing
+the result in @var{inv}.
+@end deftypefun
+
+@deftypefun int gsl_permutation_next (gsl_permutation * @var{p})
+@cindex iterating through permutations
+This function advances the permutation @var{p} to the next permutation
+in lexicographic order and returns @code{GSL_SUCCESS}. If no further
+permutations are available it returns @code{GSL_FAILURE} and leaves
+@var{p} unmodified. Starting with the identity permutation and
+repeatedly applying this function will iterate through all possible
+permutations of a given order.
+@end deftypefun
+
+@deftypefun int gsl_permutation_prev (gsl_permutation * @var{p})
+This function steps backwards from the permutation @var{p} to the
+previous permutation in lexicographic order, returning
+@code{GSL_SUCCESS}. If no previous permutation is available it returns
+@code{GSL_FAILURE} and leaves @var{p} unmodified.
+@end deftypefun
+
+@node Applying Permutations
+@section Applying Permutations
+
+@deftypefun int gsl_permute (const size_t * @var{p}, double * @var{data}, size_t @var{stride}, size_t @var{n})
+This function applies the permutation @var{p} to the array @var{data} of
+size @var{n} with stride @var{stride}.
+@end deftypefun
+
+@deftypefun int gsl_permute_inverse (const size_t * @var{p}, double * @var{data}, size_t @var{stride}, size_t @var{n})
+This function applies the inverse of the permutation @var{p} to the
+array @var{data} of size @var{n} with stride @var{stride}.
+@end deftypefun
+
+@deftypefun int gsl_permute_vector (const gsl_permutation * @var{p}, gsl_vector * @var{v})
+This function applies the permutation @var{p} to the elements of the
+vector @var{v}, considered as a row-vector acted on by a permutation
+matrix from the right, @math{v' = v P}. The @math{j}-th column of the
+permutation matrix @math{P} is given by the @math{p_j}-th column of the
+identity matrix. The permutation @var{p} and the vector @var{v} must
+have the same length.
+@end deftypefun
+
+@deftypefun int gsl_permute_vector_inverse (const gsl_permutation * @var{p}, gsl_vector * @var{v})
+This function applies the inverse of the permutation @var{p} to the
+elements of the vector @var{v}, considered as a row-vector acted on by
+an inverse permutation matrix from the right, @math{v' = v P^T}. Note
+that for permutation matrices the inverse is the same as the transpose.
+The @math{j}-th column of the permutation matrix @math{P} is given by
+the @math{p_j}-th column of the identity matrix. The permutation @var{p}
+and the vector @var{v} must have the same length.
+@end deftypefun
+
+@deftypefun int gsl_permutation_mul (gsl_permutation * @var{p}, const gsl_permutation * @var{pa}, const gsl_permutation * @var{pb})
+This function combines the two permutations @var{pa} and @var{pb} into a
+single permutation @var{p}, where @math{p = pa . pb}. The permutation
+@var{p} is equivalent to applying @math{pb} first and then @var{pa}.
+@end deftypefun
+
+@node Reading and writing permutations
+@section Reading and writing permutations
+
+The library provides functions for reading and writing permutations to a
+file as binary data or formatted text.
+
+@deftypefun int gsl_permutation_fwrite (FILE * @var{stream}, const gsl_permutation * @var{p})
+This function writes the elements of the permutation @var{p} to the
+stream @var{stream} in binary format. The function returns
+@code{GSL_EFAILED} if there was a problem writing to the file. Since the
+data is written in the native binary format it may not be portable
+between different architectures.
+@end deftypefun
+
+@deftypefun int gsl_permutation_fread (FILE * @var{stream}, gsl_permutation * @var{p})
+This function reads into the permutation @var{p} from the open stream
+@var{stream} in binary format. The permutation @var{p} must be
+preallocated with the correct length since the function uses the size of
+@var{p} to determine how many bytes to read. The function returns
+@code{GSL_EFAILED} if there was a problem reading from the file. The
+data is assumed to have been written in the native binary format on the
+same architecture.
+@end deftypefun
+
+@deftypefun int gsl_permutation_fprintf (FILE * @var{stream}, const gsl_permutation * @var{p}, const char * @var{format})
+This function writes the elements of the permutation @var{p}
+line-by-line to the stream @var{stream} using the format specifier
+@var{format}, which should be suitable for a type of @var{size_t}. On a
+GNU system the type modifier @code{Z} represents @code{size_t}, so
+@code{"%Zu\n"} is a suitable format. The function returns
+@code{GSL_EFAILED} if there was a problem writing to the file.
+@end deftypefun
+
+@deftypefun int gsl_permutation_fscanf (FILE * @var{stream}, gsl_permutation * @var{p})
+This function reads formatted data from the stream @var{stream} into the
+permutation @var{p}. The permutation @var{p} must be preallocated with
+the correct length since the function uses the size of @var{p} to
+determine how many numbers to read. The function returns
+@code{GSL_EFAILED} if there was a problem reading from the file.
+@end deftypefun
+
+@node Permutations in cyclic form
+@section Permutations in cyclic form
+
+A permutation can be represented in both @dfn{linear} and @dfn{cyclic}
+notations. The functions described in this section convert between the
+two forms. The linear notation is an index mapping, and has already
+been described above. The cyclic notation expresses a permutation as a
+series of circular rearrangements of groups of elements, or
+@dfn{cycles}.
+
+For example, under the cycle (1 2 3), 1 is replaced by 2, 2 is replaced
+by 3 and 3 is replaced by 1 in a circular fashion. Cycles of different
+sets of elements can be combined independently, for example (1 2 3) (4
+5) combines the cycle (1 2 3) with the cycle (4 5), which is an exchange
+of elements 4 and 5. A cycle of length one represents an element which
+is unchanged by the permutation and is referred to as a @dfn{singleton}.
+
+It can be shown that every permutation can be decomposed into
+combinations of cycles. The decomposition is not unique, but can always
+be rearranged into a standard @dfn{canonical form} by a reordering of
+elements. The library uses the canonical form defined in Knuth's
+@cite{Art of Computer Programming} (Vol 1, 3rd Ed, 1997) Section 1.3.3,
+p.178.
+
+The procedure for obtaining the canonical form given by Knuth is,
+
+@enumerate
+@item Write all singleton cycles explicitly
+@item Within each cycle, put the smallest number first
+@item Order the cycles in decreasing order of the first number in the cycle.
+@end enumerate
+
+@noindent
+For example, the linear representation (2 4 3 0 1) is represented as (1
+4) (0 2 3) in canonical form. The permutation corresponds to an
+exchange of elements 1 and 4, and rotation of elements 0, 2 and 3.
+
+The important property of the canonical form is that it can be
+reconstructed from the contents of each cycle without the brackets. In
+addition, by removing the brackets it can be considered as a linear
+representation of a different permutation. In the example given above
+the permutation (2 4 3 0 1) would become (1 4 0 2 3). This mapping has
+many applications in the theory of permutations.
+
+@deftypefun int gsl_permutation_linear_to_canonical (gsl_permutation * @var{q}, const gsl_permutation * @var{p})
+This function computes the canonical form of the permutation @var{p} and
+stores it in the output argument @var{q}.
+@end deftypefun
+
+@deftypefun int gsl_permutation_canonical_to_linear (gsl_permutation * @var{p}, const gsl_permutation * @var{q})
+This function converts a permutation @var{q} in canonical form back into
+linear form storing it in the output argument @var{p}.
+@end deftypefun
+
+@deftypefun size_t gsl_permutation_inversions (const gsl_permutation * @var{p})
+This function counts the number of inversions in the permutation
+@var{p}. An inversion is any pair of elements that are not in order.
+For example, the permutation 2031 has three inversions, corresponding to
+the pairs (2,0) (2,1) and (3,1). The identity permutation has no
+inversions.
+@end deftypefun
+
+@deftypefun size_t gsl_permutation_linear_cycles (const gsl_permutation * @var{p})
+This function counts the number of cycles in the permutation @var{p}, given in linear form.
+@end deftypefun
+
+@deftypefun size_t gsl_permutation_canonical_cycles (const gsl_permutation * @var{q})
+This function counts the number of cycles in the permutation @var{q}, given in canonical form.
+@end deftypefun
+
+
+@node Permutation Examples
+@section Examples
+The example program below creates a random permutation (by shuffling the
+elements of the identity) and finds its inverse.
+
+@example
+@verbatiminclude examples/permshuffle.c
+@end example
+
+@noindent
+Here is the output from the program,
+
+@example
+$ ./a.out
+initial permutation: 0 1 2 3 4 5 6 7 8 9
+ random permutation: 1 3 5 2 7 6 0 4 9 8
+inverse permutation: 6 0 3 1 7 2 5 4 9 8
+@end example
+
+@noindent
+The random permutation @code{p[i]} and its inverse @code{q[i]} are
+related through the identity @code{p[q[i]] = i}, which can be verified
+from the output.
+
+The next example program steps forwards through all possible third order
+permutations, starting from the identity,
+
+@example
+@verbatiminclude examples/permseq.c
+@end example
+
+@noindent
+Here is the output from the program,
+
+@example
+$ ./a.out
+ 0 1 2
+ 0 2 1
+ 1 0 2
+ 1 2 0
+ 2 0 1
+ 2 1 0
+@end example
+
+@noindent
+The permutations are generated in lexicographic order. To reverse the
+sequence, begin with the final permutation (which is the reverse of the
+identity) and replace @code{gsl_permutation_next} with
+@code{gsl_permutation_prev}.
+
+@node Permutation References and Further Reading
+@section References and Further Reading
+
+The subject of permutations is covered extensively in Knuth's
+@cite{Sorting and Searching},
+
+@itemize @asis
+@item
+Donald E. Knuth, @cite{The Art of Computer Programming: Sorting and
+Searching} (Vol 3, 3rd Ed, 1997), Addison-Wesley, ISBN 0201896850.
+@end itemize
+
+@noindent
+For the definition of the @dfn{canonical form} see,
+
+@itemize @asis
+@item
+Donald E. Knuth, @cite{The Art of Computer Programming: Fundamental
+Algorithms} (Vol 1, 3rd Ed, 1997), Addison-Wesley, ISBN 0201896850.
+Section 1.3.3, @cite{An Unusual Correspondence}, p.178--179.
+@end itemize
+
diff --git a/gsl-1.9/doc/poly.texi b/gsl-1.9/doc/poly.texi
new file mode 100644
index 0000000..531f77a
--- /dev/null
+++ b/gsl-1.9/doc/poly.texi
@@ -0,0 +1,302 @@
+@cindex polynomials, roots of
+
+This chapter describes functions for evaluating and solving polynomials.
+There are routines for finding real and complex roots of quadratic and
+cubic equations using analytic methods. An iterative polynomial solver
+is also available for finding the roots of general polynomials with real
+coefficients (of any order). The functions are declared in the header
+file @code{gsl_poly.h}.
+
+@menu
+* Polynomial Evaluation::
+* Divided Difference Representation of Polynomials::
+* Quadratic Equations::
+* Cubic Equations::
+* General Polynomial Equations::
+* Roots of Polynomials Examples::
+* Roots of Polynomials References and Further Reading::
+@end menu
+
+@node Polynomial Evaluation
+@section Polynomial Evaluation
+@cindex polynomial evaluation
+@cindex evaluation of polynomials
+
+@deftypefun double gsl_poly_eval (const double @var{c}[], const int @var{len}, const double @var{x})
+This function evaluates the polynomial
+@c{$c[0] + c[1] x + c[2] x^2 + \dots + c[len-1] x^{len-1}$}
+@math{c[0] + c[1] x + c[2] x^2 + \dots + c[len-1] x^@{len-1@}} using
+Horner's method for stability. The function is inlined when possible.
+@end deftypefun
+
+@node Divided Difference Representation of Polynomials
+@section Divided Difference Representation of Polynomials
+@cindex divided differences, polynomials
+@cindex evaluation of polynomials, in divided difference form
+
+The functions described here manipulate polynomials stored in Newton's
+divided-difference representation. The use of divided-differences is
+described in Abramowitz & Stegun sections 25.1.4 and 25.2.26.
+
+@deftypefun int gsl_poly_dd_init (double @var{dd}[], const double @var{xa}[], const double @var{ya}[], size_t @var{size})
+This function computes a divided-difference representation of the
+interpolating polynomial for the points (@var{xa}, @var{ya}) stored in
+the arrays @var{xa} and @var{ya} of length @var{size}. On output the
+divided-differences of (@var{xa},@var{ya}) are stored in the array
+@var{dd}, also of length @var{size}.
+@end deftypefun
+
+@deftypefun double gsl_poly_dd_eval (const double @var{dd}[], const double @var{xa}[], const size_t @var{size}, const double @var{x})
+This function evaluates the polynomial stored in divided-difference form
+in the arrays @var{dd} and @var{xa} of length @var{size} at the point
+@var{x}.
+@end deftypefun
+
+@deftypefun int gsl_poly_dd_taylor (double @var{c}[], double @var{xp}, const double @var{dd}[], const double @var{xa}[], size_t @var{size}, double @var{w}[])
+This function converts the divided-difference representation of a
+polynomial to a Taylor expansion. The divided-difference representation
+is supplied in the arrays @var{dd} and @var{xa} of length @var{size}.
+On output the Taylor coefficients of the polynomial expanded about the
+point @var{xp} are stored in the array @var{c} also of length
+@var{size}. A workspace of length @var{size} must be provided in the
+array @var{w}.
+@end deftypefun
+
+@node Quadratic Equations
+@section Quadratic Equations
+@cindex quadratic equation, solving
+
+@deftypefun int gsl_poly_solve_quadratic (double @var{a}, double @var{b}, double @var{c}, double * @var{x0}, double * @var{x1})
+This function finds the real roots of the quadratic equation,
+@tex
+\beforedisplay
+$$
+a x^2 + b x + c = 0
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+a x^2 + b x + c = 0
+@end example
+
+@end ifinfo
+@noindent
+The number of real roots (either zero, one or two) is returned, and
+their locations are stored in @var{x0} and @var{x1}. If no real roots
+are found then @var{x0} and @var{x1} are not modified. If one real root
+is found (i.e. if @math{a=0}) then it is stored in @var{x0}. When two
+real roots are found they are stored in @var{x0} and @var{x1} in
+ascending order. The case of coincident roots is not considered
+special. For example @math{(x-1)^2=0} will have two roots, which happen
+to have exactly equal values.
+
+The number of roots found depends on the sign of the discriminant
+@math{b^2 - 4 a c}. This will be subject to rounding and cancellation
+errors when computed in double precision, and will also be subject to
+errors if the coefficients of the polynomial are inexact. These errors
+may cause a discrete change in the number of roots. However, for
+polynomials with small integer coefficients the discriminant can always
+be computed exactly.
+
+@end deftypefun
+
+@deftypefun int gsl_poly_complex_solve_quadratic (double @var{a}, double @var{b}, double @var{c}, gsl_complex * @var{z0}, gsl_complex * @var{z1})
+
+This function finds the complex roots of the quadratic equation,
+@tex
+\beforedisplay
+$$
+a z^2 + b z + c = 0
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+a z^2 + b z + c = 0
+@end example
+
+@end ifinfo
+@noindent
+The number of complex roots is returned (either one or two) and the
+locations of the roots are stored in @var{z0} and @var{z1}. The roots
+are returned in ascending order, sorted first by their real components
+and then by their imaginary components. If only one real root is found
+(i.e. if @math{a=0}) then it is stored in @var{z0}.
+
+@end deftypefun
+
+
+@node Cubic Equations
+@section Cubic Equations
+@cindex cubic equation, solving
+
+@deftypefun int gsl_poly_solve_cubic (double @var{a}, double @var{b}, double @var{c}, double * @var{x0}, double * @var{x1}, double * @var{x2})
+
+This function finds the real roots of the cubic equation,
+@tex
+\beforedisplay
+$$
+x^3 + a x^2 + b x + c = 0
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+x^3 + a x^2 + b x + c = 0
+@end example
+
+@end ifinfo
+@noindent
+with a leading coefficient of unity. The number of real roots (either
+one or three) is returned, and their locations are stored in @var{x0},
+@var{x1} and @var{x2}. If one real root is found then only @var{x0} is
+modified. When three real roots are found they are stored in @var{x0},
+@var{x1} and @var{x2} in ascending order. The case of coincident roots
+is not considered special. For example, the equation @math{(x-1)^3=0}
+will have three roots with exactly equal values.
+
+@end deftypefun
+
+@deftypefun int gsl_poly_complex_solve_cubic (double @var{a}, double @var{b}, double @var{c}, gsl_complex * @var{z0}, gsl_complex * @var{z1}, gsl_complex * @var{z2})
+
+This function finds the complex roots of the cubic equation,
+@tex
+\beforedisplay
+$$
+z^3 + a z^2 + b z + c = 0
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+z^3 + a z^2 + b z + c = 0
+@end example
+
+@end ifinfo
+@noindent
+The number of complex roots is returned (always three) and the locations
+of the roots are stored in @var{z0}, @var{z1} and @var{z2}. The roots
+are returned in ascending order, sorted first by their real components
+and then by their imaginary components.
+
+@end deftypefun
+
+
+@node General Polynomial Equations
+@section General Polynomial Equations
+@cindex general polynomial equations, solving
+
+The roots of polynomial equations cannot be found analytically beyond
+the special cases of the quadratic, cubic and quartic equation. The
+algorithm described in this section uses an iterative method to find the
+approximate locations of roots of higher order polynomials.
+
+@deftypefun {gsl_poly_complex_workspace *} gsl_poly_complex_workspace_alloc (size_t @var{n})
+This function allocates space for a @code{gsl_poly_complex_workspace}
+struct and a workspace suitable for solving a polynomial with @var{n}
+coefficients using the routine @code{gsl_poly_complex_solve}.
+
+The function returns a pointer to the newly allocated
+@code{gsl_poly_complex_workspace} if no errors were detected, and a null
+pointer in the case of error.
+@end deftypefun
+
+@deftypefun void gsl_poly_complex_workspace_free (gsl_poly_complex_workspace * @var{w})
+This function frees all the memory associated with the workspace
+@var{w}.
+@end deftypefun
+
+@deftypefun int gsl_poly_complex_solve (const double * @var{a}, size_t @var{n}, gsl_poly_complex_workspace * @var{w}, gsl_complex_packed_ptr @var{z})
+This function computes the roots of the general polynomial
+@c{$P(x) = a_0 + a_1 x + a_2 x^2 + ... + a_{n-1} x^{n-1}$}
+@math{P(x) = a_0 + a_1 x + a_2 x^2 + ... + a_@{n-1@} x^@{n-1@}} using
+balanced-QR reduction of the companion matrix. The parameter @var{n}
+specifies the length of the coefficient array. The coefficient of the
+highest order term must be non-zero. The function requires a workspace
+@var{w} of the appropriate size. The @math{n-1} roots are returned in
+the packed complex array @var{z} of length @math{2(n-1)}, alternating
+real and imaginary parts.
+
+The function returns @code{GSL_SUCCESS} if all the roots are found. If
+the QR reduction does not converge, the error handler is invoked with
+an error code of @code{GSL_EFAILED}. Note that due to finite precision,
+roots of higher multiplicity are returned as a cluster of simple roots
+with reduced accuracy. The solution of polynomials with higher-order
+roots requires specialized algorithms that take the multiplicity
+structure into account (see e.g. Z. Zeng, Algorithm 835, ACM
+Transactions on Mathematical Software, Volume 30, Issue 2 (2004), pp
+218--236).
+@end deftypefun
+
+@node Roots of Polynomials Examples
+@section Examples
+
+To demonstrate the use of the general polynomial solver we will take the
+polynomial @math{P(x) = x^5 - 1} which has the following roots,
+@tex
+\beforedisplay
+$$
+1, e^{2\pi i /5}, e^{4\pi i /5}, e^{6\pi i /5}, e^{8\pi i /5}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+1, e^@{2\pi i /5@}, e^@{4\pi i /5@}, e^@{6\pi i /5@}, e^@{8\pi i /5@}
+@end example
+
+@end ifinfo
+@noindent
+The following program will find these roots.
+
+@example
+@verbatiminclude examples/polyroots.c
+@end example
+
+@noindent
+The output of the program is,
+
+@example
+$ ./a.out
+@verbatiminclude examples/polyroots.out
+@end example
+
+@noindent
+which agrees with the analytic result, @math{z_n = \exp(2 \pi n i/5)}.
+
+@node Roots of Polynomials References and Further Reading
+@section References and Further Reading
+
+The balanced-QR method and its error analysis are described in the
+following papers,
+
+@itemize @asis
+@item
+R.S. Martin, G. Peters and J.H. Wilkinson, ``The QR Algorithm for Real
+Hessenberg Matrices'', @cite{Numerische Mathematik}, 14 (1970), 219--231.
+
+@item
+B.N. Parlett and C. Reinsch, ``Balancing a Matrix for Calculation of
+Eigenvalues and Eigenvectors'', @cite{Numerische Mathematik}, 13 (1969),
+293--304.
+
+@item
+A. Edelman and H. Murakami, ``Polynomial roots from companion matrix
+eigenvalues'', @cite{Mathematics of Computation}, Vol.@: 64, No.@: 210
+(1995), 763--776.
+@end itemize
+
+@noindent
+The formulas for divided differences are given in Abramowitz and Stegun,
+
+@itemize @asis
+@item
+Abramowitz and Stegun, @cite{Handbook of Mathematical Functions},
+Sections 25.1.4 and 25.2.26.
+@end itemize
diff --git a/gsl-1.9/doc/qrng.eps b/gsl-1.9/doc/qrng.eps
new file mode 100644
index 0000000..2fa00f1
--- /dev/null
+++ b/gsl-1.9/doc/qrng.eps
@@ -0,0 +1,1420 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: tmp.ps
+%%Creator: gnuplot 3.5 (pre 3.6) patchlevel beta 347
+%%CreationDate: Tue Apr 17 17:18:33 2001
+%%DocumentFonts: (atend)
+%%BoundingBox: 50 50 302 302
+%%Orientation: Portrait
+%%EndComments
+/gnudict 120 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+/vshift -46 def
+/dl {10 mul} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke gnulinewidth 2 mul setlinewidth } def
+/AL { stroke gnulinewidth 2 div setlinewidth } def
+/UL { gnulinewidth mul /userlinewidth exch def } def
+/PL { stroke userlinewidth setlinewidth } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 dl 2 dl] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 1 0 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
+/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/Pnt { stroke [] 0 setdash
+ gsave 1 setlinecap M 0 0 V stroke grestore } def
+/Dia { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt } def
+/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt } def
+/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt } def
+/Star { 2 copy Pls Crs } def
+/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill } def
+/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill } def
+/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt } def
+/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill } def
+/Pent { stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt } def
+/PentF { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore } def
+/Circle { stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt } def
+/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
+/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def
+/C1 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C2 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C3 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C4 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C5 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc } bind def
+/C6 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C7 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C8 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C9 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C11 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C12 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C13 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C14 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc } bind def
+/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath } bind def
+/Square { dup Rec } bind def
+/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
+/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
+/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
+/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
+/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill
+ Bsquare } bind def
+/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
+/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare } bind def
+/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare } bind def
+/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
+/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare } bind def
+/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
+/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
+/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
+/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
+/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
+/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
+/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
+/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
+/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
+/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
+/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
+/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
+/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
+/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
+/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
+/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
+/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
+/DiaE { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke } def
+/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke } def
+/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke } def
+/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke } def
+/PentE { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore } def
+/CircE { stroke [] 0 setdash
+ hpt 0 360 arc stroke } def
+/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def
+/DiaW { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke } def
+/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke } def
+/TriUW { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke } def
+/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke } def
+/PentW { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore } def
+/CircW { stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke } def
+/BoxFill { gsave Rec 1 setgray fill grestore } def
+end
+%%EndProlog
+gnudict begin
+gsave
+50 50 translate
+0.050 0.050 scale
+0 setgray
+newpath
+(Helvetica) findfont 140 scalefont setfont
+1.000 UL
+LTb
+420 280 M
+63 0 V
+4529 0 R
+-63 0 V
+336 280 M
+(0) Rshow
+420 739 M
+63 0 V
+4529 0 R
+-63 0 V
+336 739 M
+(0.1) Rshow
+420 1198 M
+63 0 V
+4529 0 R
+-63 0 V
+-4613 0 R
+(0.2) Rshow
+420 1658 M
+63 0 V
+4529 0 R
+-63 0 V
+-4613 0 R
+(0.3) Rshow
+420 2117 M
+63 0 V
+4529 0 R
+-63 0 V
+-4613 0 R
+(0.4) Rshow
+420 2576 M
+63 0 V
+4529 0 R
+-63 0 V
+-4613 0 R
+(0.5) Rshow
+420 3035 M
+63 0 V
+4529 0 R
+-63 0 V
+-4613 0 R
+(0.6) Rshow
+420 3494 M
+63 0 V
+4529 0 R
+-63 0 V
+-4613 0 R
+(0.7) Rshow
+420 3954 M
+63 0 V
+4529 0 R
+-63 0 V
+-4613 0 R
+(0.8) Rshow
+420 4413 M
+63 0 V
+4529 0 R
+-63 0 V
+-4613 0 R
+(0.9) Rshow
+420 4872 M
+63 0 V
+4529 0 R
+-63 0 V
+-4613 0 R
+(1) Rshow
+420 280 M
+0 63 V
+0 4529 R
+0 -63 V
+420 140 M
+(0) Cshow
+879 280 M
+0 63 V
+0 4529 R
+0 -63 V
+879 140 M
+(0.1) Cshow
+1338 280 M
+0 63 V
+0 4529 R
+0 -63 V
+0 -4669 R
+(0.2) Cshow
+1798 280 M
+0 63 V
+0 4529 R
+0 -63 V
+0 -4669 R
+(0.3) Cshow
+2257 280 M
+0 63 V
+0 4529 R
+0 -63 V
+0 -4669 R
+(0.4) Cshow
+2716 280 M
+0 63 V
+0 4529 R
+0 -63 V
+0 -4669 R
+(0.5) Cshow
+3175 280 M
+0 63 V
+0 4529 R
+0 -63 V
+0 -4669 R
+(0.6) Cshow
+3634 280 M
+0 63 V
+0 4529 R
+0 -63 V
+0 -4669 R
+(0.7) Cshow
+4094 280 M
+0 63 V
+0 4529 R
+0 -63 V
+0 -4669 R
+(0.8) Cshow
+4553 280 M
+0 63 V
+0 4529 R
+0 -63 V
+0 -4669 R
+(0.9) Cshow
+5012 280 M
+0 63 V
+0 4529 R
+0 -63 V
+0 -4669 R
+(1) Cshow
+1.000 UL
+LTb
+420 280 M
+4592 0 V
+0 4592 V
+-4592 0 V
+420 280 L
+1.000 UP
+1.000 UL
+LT0
+2716 2576 Pls
+3864 1428 Pls
+1568 3724 Pls
+2142 2002 Pls
+4438 4298 Pls
+3290 854 Pls
+994 3150 Pls
+1281 1715 Pls
+3577 4011 Pls
+4725 567 Pls
+2429 2863 Pls
+1855 1141 Pls
+4151 3437 Pls
+3003 2289 Pls
+707 4585 Pls
+851 2433 Pls
+3147 4729 Pls
+4295 1285 Pls
+1999 3581 Pls
+2573 711 Pls
+4869 3007 Pls
+3721 1859 Pls
+1425 4155 Pls
+1138 998 Pls
+3434 3294 Pls
+4582 2146 Pls
+2286 4442 Pls
+1712 1572 Pls
+4008 3868 Pls
+2860 424 Pls
+564 2720 Pls
+635 1500 Pls
+2931 3796 Pls
+4079 352 Pls
+1783 2648 Pls
+2357 926 Pls
+4653 3222 Pls
+3505 2074 Pls
+1209 4370 Pls
+1496 639 Pls
+3792 2935 Pls
+4940 1787 Pls
+2644 4083 Pls
+2070 2361 Pls
+4366 4657 Pls
+3218 1213 Pls
+922 3509 Pls
+779 1356 Pls
+3075 3652 Pls
+4223 2504 Pls
+1927 4800 Pls
+2501 1930 Pls
+4797 4226 Pls
+3649 782 Pls
+1353 3078 Pls
+1066 2217 Pls
+3362 4513 Pls
+4510 1069 Pls
+2214 3365 Pls
+1640 495 Pls
+3936 2791 Pls
+2788 1643 Pls
+492 3939 Pls
+528 2110 Pls
+2824 4406 Pls
+3972 962 Pls
+1676 3258 Pls
+2250 388 Pls
+4546 2684 Pls
+3398 1536 Pls
+1102 3832 Pls
+1389 1249 Pls
+3685 3545 Pls
+4833 2397 Pls
+2537 4693 Pls
+1963 1823 Pls
+4259 4119 Pls
+3111 675 Pls
+815 2971 Pls
+958 818 Pls
+3254 3114 Pls
+4402 1966 Pls
+2106 4262 Pls
+2680 2540 Pls
+4976 4836 Pls
+3828 1392 Pls
+1532 3688 Pls
+1245 1679 Pls
+3541 3975 Pls
+4689 531 Pls
+2393 2827 Pls
+1819 1105 Pls
+4115 3401 Pls
+2967 2253 Pls
+671 4549 Pls
+599 890 Pls
+2895 3186 Pls
+4043 2038 Pls
+1747 4334 Pls
+2321 1464 Pls
+4617 3760 Pls
+3469 316 Pls
+1173 2612 Pls
+1460 2325 Pls
+3756 4621 Pls
+4904 1177 Pls
+2608 3473 Pls
+2034 603 Pls
+4330 2899 Pls
+3182 1751 Pls
+886 4047 Pls
+743 1894 Pls
+3039 4190 Pls
+4187 746 Pls
+1891 3042 Pls
+2465 1320 Pls
+4761 3616 Pls
+3613 2468 Pls
+1317 4764 Pls
+1030 459 Pls
+3326 2755 Pls
+4474 1607 Pls
+2178 3903 Pls
+1604 2181 Pls
+3900 4477 Pls
+2752 1033 Pls
+456 3329 Pls
+474 1805 Pls
+2770 4101 Pls
+3918 657 Pls
+1622 2953 Pls
+2196 1231 Pls
+4492 3527 Pls
+3344 2379 Pls
+1048 4675 Pls
+1335 370 Pls
+3631 2666 Pls
+4779 1518 Pls
+2483 3814 Pls
+1909 2092 Pls
+4205 4388 Pls
+3057 944 Pls
+761 3240 Pls
+904 1087 Pls
+3200 3383 Pls
+4348 2235 Pls
+2052 4531 Pls
+2626 1661 Pls
+4922 3957 Pls
+3774 513 Pls
+1478 2809 Pls
+1191 2522 Pls
+3487 4818 Pls
+4635 1374 Pls
+2339 3670 Pls
+1765 800 Pls
+4061 3096 Pls
+2913 1948 Pls
+617 4244 Pls
+689 585 Pls
+2985 2881 Pls
+4133 1733 Pls
+1837 4029 Pls
+2411 2307 Pls
+4707 4603 Pls
+3559 1159 Pls
+1263 3455 Pls
+1550 1446 Pls
+3846 3742 Pls
+4994 298 Pls
+2698 2594 Pls
+2124 872 Pls
+4420 3168 Pls
+3272 2020 Pls
+976 4316 Pls
+833 2163 Pls
+3129 4459 Pls
+4277 1015 Pls
+1981 3311 Pls
+2555 441 Pls
+4851 2737 Pls
+3703 1589 Pls
+1407 3885 Pls
+1120 1302 Pls
+3416 3598 Pls
+4564 2450 Pls
+2268 4746 Pls
+1694 1876 Pls
+3990 4172 Pls
+2842 728 Pls
+546 3024 Pls
+510 1195 Pls
+2806 3491 Pls
+3954 2343 Pls
+1658 4639 Pls
+2232 1769 Pls
+4528 4065 Pls
+3380 621 Pls
+1084 2917 Pls
+1371 2056 Pls
+3667 4352 Pls
+4815 908 Pls
+2519 3204 Pls
+1945 334 Pls
+4241 2630 Pls
+3093 1482 Pls
+797 3778 Pls
+940 1625 Pls
+3236 3921 Pls
+4384 477 Pls
+2088 2773 Pls
+2662 1051 Pls
+4958 3347 Pls
+3810 2199 Pls
+1514 4495 Pls
+1227 764 Pls
+3523 3060 Pls
+4671 1912 Pls
+2375 4208 Pls
+1801 2486 Pls
+4097 4782 Pls
+2949 1338 Pls
+653 3634 Pls
+581 2415 Pls
+2877 4711 Pls
+4025 1267 Pls
+1729 3563 Pls
+2303 693 Pls
+4599 2989 Pls
+3451 1841 Pls
+1155 4137 Pls
+1442 980 Pls
+3738 3276 Pls
+4886 2128 Pls
+2590 4424 Pls
+2016 1554 Pls
+4312 3850 Pls
+3164 406 Pls
+868 2702 Pls
+725 549 Pls
+3021 2845 Pls
+4169 1697 Pls
+1873 3993 Pls
+2447 2271 Pls
+4743 4567 Pls
+3595 1123 Pls
+1299 3419 Pls
+1012 1984 Pls
+3308 4280 Pls
+4456 836 Pls
+2160 3132 Pls
+1586 1410 Pls
+3882 3706 Pls
+2734 2558 Pls
+438 4854 Pls
+447 2567 Pls
+2743 4863 Pls
+3891 1419 Pls
+1595 3715 Pls
+2169 845 Pls
+4465 3141 Pls
+3317 1993 Pls
+1021 4289 Pls
+1308 1132 Pls
+3604 3428 Pls
+4752 2280 Pls
+2456 4576 Pls
+1882 1706 Pls
+4178 4002 Pls
+3030 558 Pls
+734 2854 Pls
+877 415 Pls
+3173 2711 Pls
+4321 1563 Pls
+2025 3859 Pls
+2599 2137 Pls
+4895 4433 Pls
+3747 989 Pls
+1451 3285 Pls
+1164 1850 Pls
+3460 4146 Pls
+4608 702 Pls
+2312 2998 Pls
+1738 1276 Pls
+4034 3572 Pls
+2886 2424 Pls
+590 4720 Pls
+662 1347 Pls
+2958 3643 Pls
+4106 2495 Pls
+1810 4791 Pls
+2384 1921 Pls
+4680 4217 Pls
+3532 773 Pls
+1236 3069 Pls
+1523 2208 Pls
+3819 4504 Pls
+4967 1060 Pls
+2671 3356 Pls
+2097 486 Pls
+4393 2782 Pls
+3245 1634 Pls
+949 3930 Pls
+806 1491 Pls
+3102 3787 Pls
+4250 343 Pls
+1954 2639 Pls
+2528 917 Pls
+4824 3213 Pls
+3676 2065 Pls
+1380 4361 Pls
+1093 630 Pls
+3389 2926 Pls
+4537 1778 Pls
+2241 4074 Pls
+1667 2352 Pls
+3963 4648 Pls
+2815 1204 Pls
+519 3500 Pls
+555 737 Pls
+2851 3033 Pls
+3999 1885 Pls
+1703 4181 Pls
+2277 2459 Pls
+4573 4755 Pls
+3425 1311 Pls
+1129 3607 Pls
+1416 1598 Pls
+3712 3894 Pls
+4860 450 Pls
+2564 2746 Pls
+1990 1024 Pls
+4286 3320 Pls
+3138 2172 Pls
+842 4468 Pls
+985 2029 Pls
+3281 4325 Pls
+4429 881 Pls
+2133 3177 Pls
+2707 307 Pls
+5003 2603 Pls
+3855 1455 Pls
+1559 3751 Pls
+1272 1168 Pls
+3568 3464 Pls
+4716 2316 Pls
+2420 4612 Pls
+1846 1742 Pls
+4142 4038 Pls
+2994 594 Pls
+698 2890 Pls
+626 1957 Pls
+2922 4253 Pls
+4070 809 Pls
+1774 3105 Pls
+2348 1383 Pls
+4644 3679 Pls
+3496 2531 Pls
+1200 4827 Pls
+1487 522 Pls
+3783 2818 Pls
+4931 1670 Pls
+2635 3966 Pls
+2061 2244 Pls
+4357 4540 Pls
+3209 1096 Pls
+913 3392 Pls
+770 953 Pls
+3066 3249 Pls
+4214 2101 Pls
+1918 4397 Pls
+2492 1527 Pls
+4788 3823 Pls
+3640 379 Pls
+1344 2675 Pls
+1057 2388 Pls
+3353 4684 Pls
+4501 1240 Pls
+2205 3536 Pls
+1631 666 Pls
+3927 2962 Pls
+2779 1814 Pls
+483 4110 Pls
+465 1042 Pls
+2761 3338 Pls
+3909 2190 Pls
+1613 4486 Pls
+2187 1616 Pls
+4483 3912 Pls
+3335 468 Pls
+1039 2764 Pls
+1326 2477 Pls
+3622 4773 Pls
+4770 1329 Pls
+2474 3625 Pls
+1900 755 Pls
+4196 3051 Pls
+3048 1903 Pls
+752 4199 Pls
+895 1760 Pls
+3191 4056 Pls
+4339 612 Pls
+2043 2908 Pls
+2617 1186 Pls
+4913 3482 Pls
+3765 2334 Pls
+1469 4630 Pls
+1182 325 Pls
+3478 2621 Pls
+4626 1473 Pls
+2330 3769 Pls
+1756 2047 Pls
+4052 4343 Pls
+2904 899 Pls
+608 3195 Pls
+680 2262 Pls
+2976 4558 Pls
+4124 1114 Pls
+1828 3410 Pls
+2402 540 Pls
+4698 2836 Pls
+3550 1688 Pls
+1254 3984 Pls
+1541 1401 Pls
+3837 3697 Pls
+4985 2549 Pls
+2689 4845 Pls
+2115 1975 Pls
+4411 4271 Pls
+3263 827 Pls
+967 3123 Pls
+824 684 Pls
+3120 2980 Pls
+4268 1832 Pls
+1972 4128 Pls
+2546 2406 Pls
+4842 4702 Pls
+3694 1258 Pls
+1398 3554 Pls
+1111 1545 Pls
+3407 3841 Pls
+4555 397 Pls
+2259 2693 Pls
+1685 971 Pls
+3981 3267 Pls
+2833 2119 Pls
+537 4415 Pls
+501 1652 Pls
+2797 3948 Pls
+3945 504 Pls
+1649 2800 Pls
+2223 1078 Pls
+4519 3374 Pls
+3371 2226 Pls
+1075 4522 Pls
+1362 791 Pls
+3658 3087 Pls
+4806 1939 Pls
+2510 4235 Pls
+1936 2513 Pls
+4232 4809 Pls
+3084 1365 Pls
+788 3661 Pls
+931 1222 Pls
+3227 3518 Pls
+4375 2370 Pls
+2079 4666 Pls
+2653 1796 Pls
+4949 4092 Pls
+3801 648 Pls
+1505 2944 Pls
+1218 2083 Pls
+3514 4379 Pls
+4662 935 Pls
+2366 3231 Pls
+1792 361 Pls
+4088 2657 Pls
+2940 1509 Pls
+644 3805 Pls
+572 432 Pls
+2868 2728 Pls
+4016 1580 Pls
+1720 3876 Pls
+2294 2154 Pls
+4590 4450 Pls
+3442 1006 Pls
+1146 3302 Pls
+1433 1867 Pls
+3729 4163 Pls
+4877 719 Pls
+2581 3015 Pls
+2007 1293 Pls
+4303 3589 Pls
+3155 2441 Pls
+859 4737 Pls
+716 2298 Pls
+3012 4594 Pls
+4160 1150 Pls
+1864 3446 Pls
+2438 576 Pls
+4734 2872 Pls
+3586 1724 Pls
+1290 4020 Pls
+1003 863 Pls
+3299 3159 Pls
+4447 2011 Pls
+2151 4307 Pls
+1577 1437 Pls
+3873 3733 Pls
+2725 289 Pls
+429 2585 Pls
+433 1433 Pls
+2729 3729 Pls
+3877 285 Pls
+1581 2581 Pls
+2155 859 Pls
+4451 3155 Pls
+3303 2007 Pls
+1007 4303 Pls
+1294 572 Pls
+3590 2868 Pls
+4738 1720 Pls
+2442 4016 Pls
+1868 2294 Pls
+4164 4590 Pls
+3016 1146 Pls
+720 3442 Pls
+864 1289 Pls
+3160 3585 Pls
+4308 2437 Pls
+2012 4733 Pls
+2586 1863 Pls
+4882 4159 Pls
+3734 715 Pls
+1438 3011 Pls
+1151 2150 Pls
+3447 4446 Pls
+4595 1002 Pls
+2299 3298 Pls
+1725 428 Pls
+4021 2724 Pls
+2873 1576 Pls
+577 3872 Pls
+649 356 Pls
+2945 2652 Pls
+4093 1504 Pls
+1797 3800 Pls
+2371 2078 Pls
+4667 4374 Pls
+3519 930 Pls
+1223 3226 Pls
+1510 1791 Pls
+3806 4087 Pls
+4954 643 Pls
+2658 2939 Pls
+2084 1217 Pls
+4380 3513 Pls
+3232 2365 Pls
+936 4661 Pls
+792 2509 Pls
+3088 4805 Pls
+4236 1361 Pls
+1940 3657 Pls
+2514 787 Pls
+4810 3083 Pls
+3662 1935 Pls
+1366 4231 Pls
+1079 1074 Pls
+3375 3370 Pls
+4523 2222 Pls
+2227 4518 Pls
+1653 1648 Pls
+3949 3944 Pls
+2801 500 Pls
+505 2796 Pls
+541 966 Pls
+2837 3262 Pls
+3985 2114 Pls
+1689 4410 Pls
+2263 1540 Pls
+4559 3836 Pls
+3411 392 Pls
+1115 2688 Pls
+1402 2401 Pls
+3698 4697 Pls
+4846 1253 Pls
+2550 3549 Pls
+1976 679 Pls
+4272 2975 Pls
+3124 1827 Pls
+828 4123 Pls
+972 1971 Pls
+3268 4267 Pls
+4416 823 Pls
+2120 3119 Pls
+2694 1397 Pls
+4990 3693 Pls
+3842 2545 Pls
+1546 4841 Pls
+1259 536 Pls
+3555 2832 Pls
+4703 1684 Pls
+2407 3980 Pls
+1833 2258 Pls
+4129 4554 Pls
+2981 1110 Pls
+685 3406 Pls
+613 2042 Pls
+2909 4338 Pls
+4057 894 Pls
+1761 3190 Pls
+2335 320 Pls
+4631 2616 Pls
+3483 1468 Pls
+1187 3764 Pls
+1474 1181 Pls
+3770 3477 Pls
+4918 2329 Pls
+2622 4625 Pls
+2048 1755 Pls
+4344 4051 Pls
+3196 607 Pls
+900 2903 Pls
+756 751 Pls
+3052 3047 Pls
+4200 1899 Pls
+1904 4195 Pls
+2478 2473 Pls
+4774 4769 Pls
+3626 1325 Pls
+1330 3621 Pls
+1043 1612 Pls
+3339 3908 Pls
+4487 464 Pls
+2191 2760 Pls
+1617 1038 Pls
+3913 3334 Pls
+2765 2186 Pls
+469 4482 Pls
+487 661 Pls
+2783 2957 Pls
+3931 1809 Pls
+1635 4105 Pls
+2209 2383 Pls
+4505 4679 Pls
+3357 1235 Pls
+1061 3531 Pls
+1348 1522 Pls
+3644 3818 Pls
+4792 374 Pls
+2496 2670 Pls
+1922 948 Pls
+4218 3244 Pls
+3070 2096 Pls
+774 4392 Pls
+918 2240 Pls
+3214 4536 Pls
+4362 1092 Pls
+2066 3388 Pls
+2640 518 Pls
+4936 2814 Pls
+3788 1666 Pls
+1492 3962 Pls
+1205 1379 Pls
+3501 3675 Pls
+4649 2527 Pls
+2353 4823 Pls
+1779 1953 Pls
+4075 4249 Pls
+2927 805 Pls
+631 3101 Pls
+702 1737 Pls
+2998 4033 Pls
+4146 589 Pls
+1850 2885 Pls
+2424 1163 Pls
+4720 3459 Pls
+3572 2311 Pls
+1276 4607 Pls
+1563 302 Pls
+3859 2598 Pls
+5007 1450 Pls
+2711 3746 Pls
+2137 2024 Pls
+4433 4320 Pls
+3285 876 Pls
+989 3172 Pls
+846 1020 Pls
+3142 3316 Pls
+4290 2168 Pls
+1994 4464 Pls
+2568 1594 Pls
+4864 3890 Pls
+3716 446 Pls
+1420 2742 Pls
+1133 2455 Pls
+3429 4751 Pls
+4577 1307 Pls
+2281 3603 Pls
+1707 733 Pls
+4003 3029 Pls
+2855 1881 Pls
+559 4177 Pls
+523 2347 Pls
+2819 4643 Pls
+3967 1199 Pls
+1671 3495 Pls
+2245 625 Pls
+4541 2921 Pls
+3393 1773 Pls
+1097 4069 Pls
+1384 912 Pls
+3680 3208 Pls
+4828 2060 Pls
+2532 4356 Pls
+1958 1486 Pls
+4254 3782 Pls
+3106 338 Pls
+810 2634 Pls
+954 482 Pls
+3250 2778 Pls
+4398 1630 Pls
+2102 3926 Pls
+2676 2204 Pls
+4972 4500 Pls
+3824 1056 Pls
+1528 3352 Pls
+1241 1917 Pls
+3537 4213 Pls
+4685 769 Pls
+2389 3065 Pls
+1815 1343 Pls
+4111 3639 Pls
+2963 2491 Pls
+667 4787 Pls
+595 1271 Pls
+2891 3567 Pls
+4039 2419 Pls
+1743 4715 Pls
+2317 1845 Pls
+4613 4141 Pls
+3465 697 Pls
+1169 2993 Pls
+1456 2132 Pls
+3752 4428 Pls
+4900 984 Pls
+2604 3280 Pls
+2030 410 Pls
+4326 2706 Pls
+3178 1558 Pls
+882 3854 Pls
+738 1702 Pls
+3034 3998 Pls
+4182 554 Pls
+1886 2850 Pls
+2460 1128 Pls
+4756 3424 Pls
+3608 2276 Pls
+1312 4572 Pls
+1025 841 Pls
+3321 3137 Pls
+4469 1989 Pls
+2173 4285 Pls
+1599 2563 Pls
+3895 4859 Pls
+2747 1415 Pls
+451 3711 Pls
+442 1423 Pls
+2738 3719 Pls
+3886 2571 Pls
+1590 4867 Pls
+2164 1997 Pls
+4460 4293 Pls
+3312 849 Pls
+1016 3145 Pls
+1303 2284 Pls
+3599 4580 Pls
+4747 1136 Pls
+2451 3432 Pls
+1877 562 Pls
+4173 2858 Pls
+3025 1710 Pls
+729 4006 Pls
+873 1567 Pls
+3169 3863 Pls
+4317 419 Pls
+2021 2715 Pls
+2595 993 Pls
+4891 3289 Pls
+3743 2141 Pls
+1447 4437 Pls
+1160 706 Pls
+3456 3002 Pls
+4604 1854 Pls
+2308 4150 Pls
+1734 2428 Pls
+4030 4724 Pls
+2882 1280 Pls
+586 3576 Pls
+658 2500 Pls
+2954 4796 Pls
+4102 1352 Pls
+1806 3648 Pls
+2380 778 Pls
+4676 3074 Pls
+3528 1926 Pls
+1232 4222 Pls
+1519 1065 Pls
+3815 3361 Pls
+4963 2213 Pls
+2667 4509 Pls
+2093 1639 Pls
+4389 3935 Pls
+3241 491 Pls
+945 2787 Pls
+801 347 Pls
+3097 2643 Pls
+4245 1495 Pls
+1949 3791 Pls
+2523 2069 Pls
+4819 4365 Pls
+3671 921 Pls
+1375 3217 Pls
+1088 1782 Pls
+3384 4078 Pls
+4532 634 Pls
+2236 2930 Pls
+1662 1208 Pls
+3958 3504 Pls
+2810 2356 Pls
+514 4652 Pls
+550 1890 Pls
+2846 4186 Pls
+3994 742 Pls
+1698 3038 Pls
+2272 1316 Pls
+4568 3612 Pls
+3420 2464 Pls
+1124 4760 Pls
+1411 455 Pls
+3707 2751 Pls
+4855 1603 Pls
+2559 3899 Pls
+1985 2177 Pls
+4281 4473 Pls
+3133 1029 Pls
+837 3325 Pls
+981 885 Pls
+3277 3181 Pls
+4425 2033 Pls
+2129 4329 Pls
+2703 1459 Pls
+4999 3755 Pls
+3851 311 Pls
+1555 2607 Pls
+1268 2320 Pls
+3564 4616 Pls
+4712 1172 Pls
+2416 3468 Pls
+1842 598 Pls
+4138 2894 Pls
+2990 1746 Pls
+694 4042 Pls
+622 814 Pls
+2918 3110 Pls
+4066 1962 Pls
+1770 4258 Pls
+2344 2536 Pls
+4640 4832 Pls
+3492 1388 Pls
+1196 3684 Pls
+1483 1675 Pls
+3779 3971 Pls
+4927 527 Pls
+2631 2823 Pls
+2057 1101 Pls
+4353 3397 Pls
+3205 2249 Pls
+909 4545 Pls
+765 2105 Pls
+3061 4401 Pls
+4209 957 Pls
+1913 3253 Pls
+2487 383 Pls
+4783 2679 Pls
+3635 1531 Pls
+1339 3827 Pls
+1052 1244 Pls
+3348 3540 Pls
+4496 2392 Pls
+2200 4688 Pls
+1626 1818 Pls
+3922 4114 Pls
+2774 670 Pls
+478 2966 Pls
+460 2195 Pls
+2756 4491 Pls
+3904 1047 Pls
+1608 3343 Pls
+2182 473 Pls
+4478 2769 Pls
+3330 1621 Pls
+1034 3917 Pls
+1321 1334 Pls
+3617 3630 Pls
+4765 2482 Pls
+2469 4778 Pls
+1895 1908 Pls
+4191 4204 Pls
+3043 760 Pls
+747 3056 Pls
+891 616 Pls
+3187 2912 Pls
+4335 1764 Pls
+2039 4060 Pls
+2613 2338 Pls
+4909 4634 Pls
+3761 1190 Pls
+1465 3486 Pls
+1178 1477 Pls
+3474 3773 Pls
+4622 329 Pls
+2326 2625 Pls
+1752 903 Pls
+4048 3199 Pls
+2900 2051 Pls
+604 4347 Pls
+676 1119 Pls
+2972 3415 Pls
+4120 2267 Pls
+1824 4563 Pls
+2398 1693 Pls
+4694 3989 Pls
+3546 545 Pls
+1250 2841 Pls
+1537 2554 Pls
+3833 4850 Pls
+4981 1406 Pls
+2685 3702 Pls
+2111 832 Pls
+4407 3128 Pls
+3259 1980 Pls
+963 4276 Pls
+819 1836 Pls
+3115 4132 Pls
+4263 688 Pls
+1967 2984 Pls
+2541 1262 Pls
+4837 3558 Pls
+3689 2410 Pls
+1393 4706 Pls
+1106 401 Pls
+3402 2697 Pls
+4550 1549 Pls
+2254 3845 Pls
+1680 2123 Pls
+3976 4419 Pls
+2828 975 Pls
+532 3271 Pls
+496 509 Pls
+2792 2805 Pls
+3940 1657 Pls
+1644 3953 Pls
+2218 2231 Pls
+4514 4527 Pls
+3366 1083 Pls
+1070 3379 Pls
+1357 1944 Pls
+3653 4240 Pls
+4801 796 Pls
+2505 3092 Pls
+1931 1370 Pls
+4227 3666 Pls
+3079 2518 Pls
+783 4814 Pls
+927 2374 Pls
+3223 4670 Pls
+4371 1226 Pls
+2075 3522 Pls
+2649 652 Pls
+4945 2948 Pls
+3797 1800 Pls
+1501 4096 Pls
+1214 939 Pls
+3510 3235 Pls
+4658 2087 Pls
+2362 4383 Pls
+1788 1513 Pls
+4084 3809 Pls
+2936 365 Pls
+640 2661 Pls
+568 1585 Pls
+2864 3881 Pls
+4012 437 Pls
+1716 2733 Pls
+2290 1011 Pls
+4586 3307 Pls
+3438 2159 Pls
+1142 4455 Pls
+1429 724 Pls
+3725 3020 Pls
+4873 1872 Pls
+2577 4168 Pls
+2003 2446 Pls
+4299 4742 Pls
+3151 1298 Pls
+855 3594 Pls
+712 1154 Pls
+3008 3450 Pls
+4156 2302 Pls
+1860 4598 Pls
+2434 1728 Pls
+4730 4024 Pls
+3582 580 Pls
+1286 2876 Pls
+999 2015 Pls
+3295 4311 Pls
+4443 867 Pls
+2147 3163 Pls
+1573 293 Pls
+3869 2589 Pls
+2721 1441 Pls
+425 3737 Pls
+427 2009 Pls
+stroke
+grestore
+end
+showpage
+%%Trailer
+%%DocumentFonts: Helvetica
diff --git a/gsl-1.9/doc/qrng.texi b/gsl-1.9/doc/qrng.texi
new file mode 100644
index 0000000..c9dc739
--- /dev/null
+++ b/gsl-1.9/doc/qrng.texi
@@ -0,0 +1,163 @@
+@cindex quasi-random sequences
+@cindex low discrepancy sequences
+@cindex Sobol sequence
+@cindex Niederreiter sequence
+This chapter describes functions for generating quasi-random sequences
+in arbitrary dimensions. A quasi-random sequence progressively covers a
+@math{d}-dimensional space with a set of points that are uniformly
+distributed. Quasi-random sequences are also known as low-discrepancy
+sequences. The quasi-random sequence generators use an interface that
+is similar to the interface for random number generators, except that
+seeding is not required---each generator produces a single sequence.
+
+The functions described in this section are declared in the header file
+@file{gsl_qrng.h}.
+
+@menu
+* Quasi-random number generator initialization::
+* Sampling from a quasi-random number generator::
+* Auxiliary quasi-random number generator functions::
+* Saving and resorting quasi-random number generator state::
+* Quasi-random number generator algorithms::
+* Quasi-random number generator examples::
+* Quasi-random number references::
+@end menu
+
+@node Quasi-random number generator initialization
+@section Quasi-random number generator initialization
+
+@deftypefun {gsl_qrng *} gsl_qrng_alloc (const gsl_qrng_type * @var{T}, unsigned int @var{d})
+This function returns a pointer to a newly-created instance of a
+quasi-random sequence generator of type @var{T} and dimension @var{d}.
+If there is insufficient memory to create the generator then the
+function returns a null pointer and the error handler is invoked with an
+error code of @code{GSL_ENOMEM}.
+@end deftypefun
+
+@deftypefun void gsl_qrng_free (gsl_qrng * @var{q})
+This function frees all the memory associated with the generator
+@var{q}.
+@end deftypefun
+
+@deftypefun void gsl_qrng_init (gsl_qrng * @var{q})
+This function reinitializes the generator @var{q} to its starting point.
+Note that quasi-random sequences do not use a seed and always produce
+the same set of values.
+@end deftypefun
+
+@node Sampling from a quasi-random number generator
+@section Sampling from a quasi-random number generator
+
+@deftypefun int gsl_qrng_get (const gsl_qrng * @var{q}, double @var{x}[])
+This function stores the next point from the sequence generator @var{q}
+in the array @var{x}. The space available for @var{x} must match the
+dimension of the generator. The point @var{x} will lie in the range
+@math{0 < x_i < 1} for each @math{x_i}.
+@end deftypefun
+
+@node Auxiliary quasi-random number generator functions
+@section Auxiliary quasi-random number generator functions
+
+@deftypefun {const char *} gsl_qrng_name (const gsl_qrng * @var{q})
+This function returns a pointer to the name of the generator.
+@end deftypefun
+
+@deftypefun size_t gsl_qrng_size (const gsl_qrng * @var{q})
+@deftypefunx {void *} gsl_qrng_state (const gsl_qrng * @var{q})
+These functions return a pointer to the state of generator @var{r} and
+its size. You can use this information to access the state directly. For
+example, the following code will write the state of a generator to a
+stream,
+
+@example
+void * state = gsl_qrng_state (q);
+size_t n = gsl_qrng_size (q);
+fwrite (state, n, 1, stream);
+@end example
+@end deftypefun
+
+
+@node Saving and resorting quasi-random number generator state
+@section Saving and resorting quasi-random number generator state
+
+@deftypefun int gsl_qrng_memcpy (gsl_qrng * @var{dest}, const gsl_qrng * @var{src})
+This function copies the quasi-random sequence generator @var{src} into the
+pre-existing generator @var{dest}, making @var{dest} into an exact copy
+of @var{src}. The two generators must be of the same type.
+@end deftypefun
+
+@deftypefun {gsl_qrng *} gsl_qrng_clone (const gsl_qrng * @var{q})
+This function returns a pointer to a newly created generator which is an
+exact copy of the generator @var{q}.
+@end deftypefun
+
+@node Quasi-random number generator algorithms
+@section Quasi-random number generator algorithms
+
+The following quasi-random sequence algorithms are available,
+
+@deffn {Generator} gsl_qrng_niederreiter_2
+This generator uses the algorithm described in Bratley, Fox,
+Niederreiter, @cite{ACM Trans. Model. Comp. Sim.} 2, 195 (1992). It is
+valid up to 12 dimensions.
+@end deffn
+
+@deffn {Generator} gsl_qrng_sobol
+This generator uses the Sobol sequence described in Antonov, Saleev,
+@cite{USSR Comput. Maths. Math. Phys.} 19, 252 (1980). It is valid up to
+40 dimensions.
+@end deffn
+
+@node Quasi-random number generator examples
+@section Examples
+
+The following program prints the first 1024 points of the 2-dimensional
+Sobol sequence.
+
+@example
+@verbatiminclude examples/qrng.c
+@end example
+
+@noindent
+Here is the output from the program,
+
+@example
+$ ./a.out
+0.50000 0.50000
+0.75000 0.25000
+0.25000 0.75000
+0.37500 0.37500
+0.87500 0.87500
+0.62500 0.12500
+0.12500 0.62500
+....
+@end example
+
+@noindent
+It can be seen that successive points progressively fill-in the spaces
+between previous points.
+
+@iftex
+@need 4000
+The following plot shows the distribution in the x-y plane of the first
+1024 points from the Sobol sequence,
+@sp 1
+@center @image{qrng,3.4in}
+@sp 1
+@center Distribution of the first 1024 points
+@center from the quasi-random Sobol sequence
+@end iftex
+
+@node Quasi-random number references
+@section References
+
+The implementations of the quasi-random sequence routines are based on
+the algorithms described in the following paper,
+
+@itemize @asis
+P. Bratley and B.L. Fox and H. Niederreiter, ``Algorithm 738: Programs
+to Generate Niederreiter's Low-discrepancy Sequences'', @cite{ACM
+Transactions on Mathematical Software}, Vol.@: 20, No.@: 4, December, 1994,
+p.@: 494--495.
+@end itemize
+
diff --git a/gsl-1.9/doc/rand-bernoulli.tex b/gsl-1.9/doc/rand-bernoulli.tex
new file mode 100644
index 0000000..6e086e7
--- /dev/null
+++ b/gsl-1.9/doc/rand-bernoulli.tex
@@ -0,0 +1,695 @@
+% GNUPLOT: plain TeX with Postscript
+\begingroup
+ \catcode`\@=11\relax
+ \def\GNUPLOTspecial{%
+ \def\do##1{\catcode`##1=12\relax}\dospecials
+ \catcode`\{=1\catcode`\}=2\catcode\%=14\relax\special}%
+%
+\expandafter\ifx\csname GNUPLOTpicture\endcsname\relax
+ \csname newdimen\endcsname\GNUPLOTunit
+ \gdef\GNUPLOTpicture(#1,#2){\vbox to#2\GNUPLOTunit\bgroup
+ \def\put(##1,##2)##3{\unskip\raise##2\GNUPLOTunit
+ \hbox to0pt{\kern##1\GNUPLOTunit ##3\hss}\ignorespaces}%
+ \def\ljust##1{\vbox to0pt{\vss\hbox to0pt{##1\hss}\vss}}%
+ \def\cjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1\hss}\vss}}%
+ \def\rjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1}\vss}}%
+ \def\stack##1{\let\\=\cr\tabskip=0pt\halign{\hfil ####\hfil\cr ##1\crcr}}%
+ \def\lstack##1{\hbox to0pt{\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\cstack##1{\hbox to0pt{\hss\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\rstack##1{\hbox to0pt{\vbox to0pt{\stack{##1}\vss}\hss}}%
+ \vss\hbox to#1\GNUPLOTunit\bgroup\ignorespaces}%
+ \gdef\endGNUPLOTpicture{\hss\egroup\egroup}%
+\fi
+\GNUPLOTunit=0.1bp
+\GNUPLOTpicture(3600,2376)
+{\GNUPLOTspecial{"
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: rand-bernoulli.tex
+%%Creator: gnuplot 4.0 patchlevel 0
+%%CreationDate: Wed Aug 31 12:38:29 2005
+%%DocumentFonts:
+%%BoundingBox: 0 0 360 237
+%%Orientation: Landscape
+%%EndComments
+/gnudict 256 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+/vshift -33 def
+/dl {10.0 mul} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+/Rounded false def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/N {newpath moveto} bind def
+/C {setrgbcolor} bind def
+/f {rlineto fill} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke userlinewidth 2 mul setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/AL { stroke userlinewidth 2 div setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/UL { dup gnulinewidth mul /userlinewidth exch def
+ dup 1 lt {pop 1} if 10 mul /udl exch def } def
+/PL { stroke userlinewidth setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/LTw { PL [] 1 setgray } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 1 0 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
+/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/Pnt { stroke [] 0 setdash
+ gsave 1 setlinecap M 0 0 V stroke grestore } def
+/Dia { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt } def
+/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt } def
+/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt } def
+/Star { 2 copy Pls Crs } def
+/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill } def
+/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill } def
+/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt } def
+/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill } def
+/Pent { stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt } def
+/PentF { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore } def
+/Circle { stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt } def
+/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
+/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def
+/C1 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C2 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C3 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C4 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C5 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc } bind def
+/C6 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C7 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C8 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C9 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C11 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C12 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C13 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C14 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc } bind def
+/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath } bind def
+/Square { dup Rec } bind def
+/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
+/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
+/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
+/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
+/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill
+ Bsquare } bind def
+/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
+/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare } bind def
+/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare } bind def
+/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
+/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare } bind def
+/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
+/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
+/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
+/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
+/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
+/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
+/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
+/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
+/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
+/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
+/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
+/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
+/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
+/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
+/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
+/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
+/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
+/DiaE { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke } def
+/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke } def
+/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke } def
+/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke } def
+/PentE { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore } def
+/CircE { stroke [] 0 setdash
+ hpt 0 360 arc stroke } def
+/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def
+/DiaW { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke } def
+/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke } def
+/TriUW { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke } def
+/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke } def
+/PentW { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore } def
+/CircW { stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke } def
+/BoxFill { gsave Rec 1 setgray fill grestore } def
+/BoxColFill {
+ gsave Rec
+ /Fillden exch def
+ currentrgbcolor
+ /ColB exch def /ColG exch def /ColR exch def
+ /ColR ColR Fillden mul Fillden sub 1 add def
+ /ColG ColG Fillden mul Fillden sub 1 add def
+ /ColB ColB Fillden mul Fillden sub 1 add def
+ ColR ColG ColB setrgbcolor
+ fill grestore } def
+%
+% PostScript Level 1 Pattern Fill routine
+% Usage: x y w h s a XX PatternFill
+% x,y = lower left corner of box to be filled
+% w,h = width and height of box
+% a = angle in degrees between lines and x-axis
+% XX = 0/1 for no/yes cross-hatch
+%
+/PatternFill { gsave /PFa [ 9 2 roll ] def
+ PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
+ PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
+ gsave 1 setgray fill grestore clip
+ currentlinewidth 0.5 mul setlinewidth
+ /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
+ 0 0 M PFa 5 get rotate PFs -2 div dup translate
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 M 0 PFs V } for
+ 0 PFa 6 get ne {
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 2 1 roll M PFs 0 V } for
+ } if
+ stroke grestore } def
+%
+/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
+dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
+currentdict end definefont pop
+end
+%%EndProlog
+gnudict begin
+gsave
+0 0 translate
+0.100 0.100 scale
+0 setgray
+newpath
+0.500 UL
+LTb
+481 331 M
+-31 0 V
+0.500 UL
+LTb
+481 1204 M
+-31 0 V
+0.500 UL
+LTb
+481 2076 M
+-31 0 V
+0.500 UL
+LTb
+481 331 M
+0 -63 V
+742 63 R
+0 -31 V
+0.500 UL
+LTb
+1966 331 M
+0 -63 V
+742 63 R
+0 -31 V
+0.500 UL
+LTb
+3450 331 M
+0 -63 V
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+LTb
+LTb
+LTb
+1.000 UP
+1.000 UL
+LT0
+LTb
+LT0
+3087 1963 M
+263 0 V
+481 855 M
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+stroke
+1494 855 M
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+0 697 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+stroke
+2517 1552 M
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+1.000 UP
+stroke
+grestore
+end
+showpage
+}}%
+\put(3037,1963){\rjust{$p=0.7$}}%
+\put(1965,2226){\cjust{Bernoulli Trial}}%
+\put(1965,50){\cjust{$k$}}%
+\put(100,1203){%
+\special{ps: gsave currentpoint currentpoint translate
+270 rotate neg exch neg exch translate}%
+\cstack{$p(k)$}%
+\special{ps: currentpoint grestore moveto}%
+}%
+\put(2708,200){\cjust{ 1}}%
+\put(1223,200){\cjust{ 0}}%
+\put(400,2076){\rjust{ 1}}%
+\put(400,1204){\rjust{ 0.5}}%
+\put(400,331){\rjust{ 0}}%
+\endGNUPLOTpicture
+\endgroup
+\endinput
diff --git a/gsl-1.9/doc/rand-beta.tex b/gsl-1.9/doc/rand-beta.tex
new file mode 100644
index 0000000..3104ef1
--- /dev/null
+++ b/gsl-1.9/doc/rand-beta.tex
@@ -0,0 +1,1335 @@
+% GNUPLOT: plain TeX with Postscript
+\begingroup
+ \catcode`\@=11\relax
+ \def\GNUPLOTspecial{%
+ \def\do##1{\catcode`##1=12\relax}\dospecials
+ \catcode`\{=1\catcode`\}=2\catcode\%=14\relax\special}%
+%
+\expandafter\ifx\csname GNUPLOTpicture\endcsname\relax
+ \csname newdimen\endcsname\GNUPLOTunit
+ \gdef\GNUPLOTpicture(#1,#2){\vbox to#2\GNUPLOTunit\bgroup
+ \def\put(##1,##2)##3{\unskip\raise##2\GNUPLOTunit
+ \hbox to0pt{\kern##1\GNUPLOTunit ##3\hss}\ignorespaces}%
+ \def\ljust##1{\vbox to0pt{\vss\hbox to0pt{##1\hss}\vss}}%
+ \def\cjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1\hss}\vss}}%
+ \def\rjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1}\vss}}%
+ \def\stack##1{\let\\=\cr\tabskip=0pt\halign{\hfil ####\hfil\cr ##1\crcr}}%
+ \def\lstack##1{\hbox to0pt{\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\cstack##1{\hbox to0pt{\hss\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\rstack##1{\hbox to0pt{\vbox to0pt{\stack{##1}\vss}\hss}}%
+ \vss\hbox to#1\GNUPLOTunit\bgroup\ignorespaces}%
+ \gdef\endGNUPLOTpicture{\hss\egroup\egroup}%
+\fi
+\GNUPLOTunit=0.1bp
+\GNUPLOTpicture(3600,2376)
+{\GNUPLOTspecial{"
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: rand-beta.tex
+%%Creator: gnuplot 4.0 patchlevel 0
+%%CreationDate: Wed Aug 31 12:38:29 2005
+%%DocumentFonts:
+%%BoundingBox: 0 0 360 237
+%%Orientation: Landscape
+%%EndComments
+/gnudict 256 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+/vshift -33 def
+/dl {10.0 mul} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+/Rounded false def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/N {newpath moveto} bind def
+/C {setrgbcolor} bind def
+/f {rlineto fill} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke userlinewidth 2 mul setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/AL { stroke userlinewidth 2 div setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/UL { dup gnulinewidth mul /userlinewidth exch def
+ dup 1 lt {pop 1} if 10 mul /udl exch def } def
+/PL { stroke userlinewidth setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/LTw { PL [] 1 setgray } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 1 0 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
+/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/Pnt { stroke [] 0 setdash
+ gsave 1 setlinecap M 0 0 V stroke grestore } def
+/Dia { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt } def
+/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt } def
+/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt } def
+/Star { 2 copy Pls Crs } def
+/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill } def
+/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill } def
+/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt } def
+/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill } def
+/Pent { stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt } def
+/PentF { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore } def
+/Circle { stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt } def
+/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
+/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def
+/C1 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C2 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C3 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C4 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C5 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc } bind def
+/C6 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C7 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C8 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C9 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C11 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C12 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C13 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C14 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc } bind def
+/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath } bind def
+/Square { dup Rec } bind def
+/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
+/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
+/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
+/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
+/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill
+ Bsquare } bind def
+/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
+/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare } bind def
+/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare } bind def
+/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
+/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare } bind def
+/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
+/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
+/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
+/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
+/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
+/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
+/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
+/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
+/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
+/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
+/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
+/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
+/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
+/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
+/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
+/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
+/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
+/DiaE { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke } def
+/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke } def
+/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke } def
+/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke } def
+/PentE { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore } def
+/CircE { stroke [] 0 setdash
+ hpt 0 360 arc stroke } def
+/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def
+/DiaW { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke } def
+/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke } def
+/TriUW { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke } def
+/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke } def
+/PentW { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore } def
+/CircW { stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke } def
+/BoxFill { gsave Rec 1 setgray fill grestore } def
+/BoxColFill {
+ gsave Rec
+ /Fillden exch def
+ currentrgbcolor
+ /ColB exch def /ColG exch def /ColR exch def
+ /ColR ColR Fillden mul Fillden sub 1 add def
+ /ColG ColG Fillden mul Fillden sub 1 add def
+ /ColB ColB Fillden mul Fillden sub 1 add def
+ ColR ColG ColB setrgbcolor
+ fill grestore } def
+%
+% PostScript Level 1 Pattern Fill routine
+% Usage: x y w h s a XX PatternFill
+% x,y = lower left corner of box to be filled
+% w,h = width and height of box
+% a = angle in degrees between lines and x-axis
+% XX = 0/1 for no/yes cross-hatch
+%
+/PatternFill { gsave /PFa [ 9 2 roll ] def
+ PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
+ PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
+ gsave 1 setgray fill grestore clip
+ currentlinewidth 0.5 mul setlinewidth
+ /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
+ 0 0 M PFa 5 get rotate PFs -2 div dup translate
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 M 0 PFs V } for
+ 0 PFa 6 get ne {
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 2 1 roll M PFs 0 V } for
+ } if
+ stroke grestore } def
+%
+/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
+dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
+currentdict end definefont pop
+end
+%%EndProlog
+gnudict begin
+gsave
+0 0 translate
+0.100 0.100 scale
+0 setgray
+newpath
+0.500 UL
+LTb
+381 331 M
+-31 0 V
+0.500 UL
+LTb
+381 767 M
+-31 0 V
+0.500 UL
+LTb
+381 1204 M
+-31 0 V
+0.500 UL
+LTb
+381 1640 M
+-31 0 V
+0.500 UL
+LTb
+381 2076 M
+-31 0 V
+0.500 UL
+LTb
+381 331 M
+0 -31 V
+0.500 UL
+LTb
+1148 331 M
+0 -31 V
+0.500 UL
+LTb
+1916 331 M
+0 -31 V
+0.500 UL
+LTb
+2683 331 M
+0 -31 V
+0.500 UL
+LTb
+3450 331 M
+0 -31 V
+0.500 UL
+LTb
+0.500 UL
+LTb
+381 331 M
+3069 0 V
+0 1745 V
+-3069 0 V
+381 331 L
+LTb
+LTb
+LTb
+1.000 UP
+1.000 UL
+LT0
+LTb
+LT0
+3087 1963 M
+263 0 V
+381 331 M
+10 9 V
+11 8 V
+10 9 V
+10 9 V
+10 8 V
+11 8 V
+10 9 V
+10 8 V
+10 8 V
+11 9 V
+10 8 V
+10 8 V
+10 8 V
+11 8 V
+10 8 V
+10 8 V
+10 7 V
+11 8 V
+10 8 V
+10 7 V
+11 8 V
+10 7 V
+10 8 V
+10 7 V
+11 8 V
+10 7 V
+10 7 V
+10 7 V
+11 7 V
+10 7 V
+10 7 V
+10 7 V
+11 7 V
+10 7 V
+10 7 V
+11 6 V
+10 7 V
+10 6 V
+10 7 V
+11 6 V
+10 7 V
+10 6 V
+10 6 V
+11 7 V
+10 6 V
+10 6 V
+10 6 V
+11 6 V
+10 6 V
+10 6 V
+10 5 V
+11 6 V
+10 6 V
+10 5 V
+11 6 V
+10 5 V
+10 6 V
+10 5 V
+11 6 V
+10 5 V
+10 5 V
+10 5 V
+11 5 V
+10 5 V
+10 5 V
+10 5 V
+11 5 V
+10 5 V
+10 5 V
+10 4 V
+11 5 V
+10 5 V
+10 4 V
+11 4 V
+10 5 V
+10 4 V
+10 4 V
+11 5 V
+10 4 V
+10 4 V
+10 4 V
+11 4 V
+10 4 V
+10 4 V
+10 4 V
+11 3 V
+10 4 V
+10 4 V
+11 3 V
+10 4 V
+10 3 V
+10 4 V
+11 3 V
+10 3 V
+10 3 V
+10 4 V
+11 3 V
+10 3 V
+10 3 V
+10 3 V
+11 3 V
+10 2 V
+stroke
+1428 919 M
+10 3 V
+10 3 V
+11 2 V
+10 3 V
+10 2 V
+11 3 V
+10 2 V
+10 3 V
+10 2 V
+11 2 V
+10 2 V
+10 2 V
+10 3 V
+11 2 V
+10 1 V
+10 2 V
+10 2 V
+11 2 V
+10 2 V
+10 1 V
+10 2 V
+11 1 V
+10 2 V
+10 1 V
+11 2 V
+10 1 V
+10 1 V
+10 1 V
+11 1 V
+10 1 V
+10 1 V
+10 1 V
+11 1 V
+10 1 V
+10 1 V
+10 1 V
+11 0 V
+10 1 V
+10 0 V
+11 1 V
+10 0 V
+10 0 V
+10 1 V
+11 0 V
+10 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+10 0 V
+11 0 V
+10 -1 V
+10 0 V
+10 0 V
+11 -1 V
+10 0 V
+10 -1 V
+11 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+11 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+11 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+11 -2 V
+10 -1 V
+10 -2 V
+11 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+11 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+11 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+11 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+11 -3 V
+10 -2 V
+10 -3 V
+11 -2 V
+10 -3 V
+10 -3 V
+10 -2 V
+11 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+11 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+stroke
+2495 892 M
+11 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+11 -3 V
+10 -4 V
+10 -4 V
+11 -3 V
+10 -4 V
+10 -4 V
+10 -4 V
+11 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+11 -5 V
+10 -4 V
+10 -4 V
+10 -5 V
+11 -4 V
+10 -4 V
+10 -5 V
+11 -5 V
+10 -4 V
+10 -5 V
+10 -5 V
+11 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+11 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+11 -6 V
+10 -5 V
+10 -6 V
+10 -5 V
+11 -6 V
+10 -5 V
+10 -6 V
+11 -6 V
+10 -5 V
+10 -6 V
+10 -6 V
+11 -6 V
+10 -6 V
+10 -6 V
+10 -6 V
+11 -7 V
+10 -6 V
+10 -6 V
+10 -7 V
+11 -6 V
+10 -7 V
+10 -6 V
+10 -7 V
+11 -6 V
+10 -7 V
+10 -7 V
+11 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+11 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+11 -8 V
+10 -7 V
+10 -8 V
+10 -7 V
+11 -8 V
+10 -7 V
+10 -8 V
+11 -8 V
+10 -7 V
+10 -8 V
+10 -8 V
+11 -8 V
+10 -8 V
+10 -8 V
+10 -8 V
+11 -9 V
+10 -8 V
+10 -8 V
+10 -9 V
+11 -8 V
+10 -8 V
+10 -9 V
+10 -9 V
+11 -8 V
+10 -9 V
+1.000 UL
+LT1
+LTb
+LT1
+3087 1863 M
+263 0 V
+381 331 M
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+10 1 V
+11 0 V
+10 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+10 0 V
+11 1 V
+10 0 V
+10 0 V
+10 0 V
+11 0 V
+10 1 V
+10 0 V
+11 0 V
+10 0 V
+10 1 V
+10 0 V
+11 0 V
+10 0 V
+10 1 V
+10 0 V
+11 1 V
+10 0 V
+10 0 V
+10 1 V
+11 0 V
+10 1 V
+10 0 V
+10 1 V
+11 0 V
+10 1 V
+10 0 V
+11 1 V
+10 0 V
+10 1 V
+10 1 V
+11 0 V
+10 1 V
+10 1 V
+10 1 V
+11 0 V
+10 1 V
+10 1 V
+10 1 V
+11 1 V
+10 1 V
+10 0 V
+10 1 V
+11 1 V
+10 1 V
+10 1 V
+11 1 V
+10 2 V
+10 1 V
+10 1 V
+11 1 V
+10 1 V
+10 1 V
+10 2 V
+11 1 V
+10 1 V
+10 2 V
+10 1 V
+11 2 V
+10 1 V
+10 1 V
+11 2 V
+10 2 V
+10 1 V
+10 2 V
+11 2 V
+10 1 V
+10 2 V
+10 2 V
+11 2 V
+10 1 V
+10 2 V
+10 2 V
+11 2 V
+10 2 V
+stroke
+1428 400 M
+10 2 V
+10 2 V
+11 3 V
+10 2 V
+10 2 V
+11 2 V
+10 3 V
+10 2 V
+10 2 V
+11 3 V
+10 2 V
+10 3 V
+10 2 V
+11 3 V
+10 3 V
+10 2 V
+10 3 V
+11 3 V
+10 3 V
+10 3 V
+10 2 V
+11 3 V
+10 4 V
+10 3 V
+11 3 V
+10 3 V
+10 3 V
+10 3 V
+11 4 V
+10 3 V
+10 4 V
+10 3 V
+11 4 V
+10 3 V
+10 4 V
+10 4 V
+11 3 V
+10 4 V
+10 4 V
+11 4 V
+10 4 V
+10 4 V
+10 4 V
+11 4 V
+10 4 V
+10 5 V
+10 4 V
+11 4 V
+10 5 V
+10 4 V
+10 5 V
+11 4 V
+10 5 V
+10 5 V
+10 5 V
+11 4 V
+10 5 V
+10 5 V
+11 5 V
+10 6 V
+10 5 V
+10 5 V
+11 5 V
+10 6 V
+10 5 V
+10 6 V
+11 5 V
+10 6 V
+10 5 V
+10 6 V
+11 6 V
+10 6 V
+10 6 V
+11 6 V
+10 6 V
+10 6 V
+10 6 V
+11 7 V
+10 6 V
+10 7 V
+10 6 V
+11 7 V
+10 6 V
+10 7 V
+10 7 V
+11 7 V
+10 7 V
+10 7 V
+10 7 V
+11 7 V
+10 7 V
+10 8 V
+11 7 V
+10 8 V
+10 7 V
+10 8 V
+11 7 V
+10 8 V
+10 8 V
+10 8 V
+11 8 V
+10 8 V
+10 8 V
+10 9 V
+stroke
+2495 902 M
+11 8 V
+10 8 V
+10 9 V
+10 9 V
+11 8 V
+10 9 V
+10 9 V
+11 9 V
+10 9 V
+10 9 V
+10 9 V
+11 9 V
+10 10 V
+10 9 V
+10 10 V
+11 9 V
+10 10 V
+10 10 V
+10 10 V
+11 10 V
+10 10 V
+10 10 V
+11 10 V
+10 10 V
+10 11 V
+10 10 V
+11 11 V
+10 10 V
+10 11 V
+10 11 V
+11 11 V
+10 11 V
+10 11 V
+10 11 V
+11 12 V
+10 11 V
+10 12 V
+10 11 V
+11 12 V
+10 12 V
+10 12 V
+11 12 V
+10 12 V
+10 12 V
+10 12 V
+11 13 V
+10 12 V
+10 13 V
+10 12 V
+11 13 V
+10 13 V
+10 13 V
+10 13 V
+11 13 V
+10 14 V
+10 13 V
+10 14 V
+11 13 V
+10 14 V
+10 14 V
+11 14 V
+10 14 V
+10 14 V
+10 14 V
+11 14 V
+10 15 V
+10 14 V
+10 15 V
+11 15 V
+10 14 V
+10 15 V
+10 16 V
+11 15 V
+10 15 V
+10 15 V
+11 16 V
+10 16 V
+10 15 V
+10 16 V
+11 16 V
+10 16 V
+10 16 V
+10 17 V
+11 16 V
+10 17 V
+10 16 V
+10 17 V
+11 17 V
+10 17 V
+10 17 V
+10 17 V
+11 18 V
+10 17 V
+1.000 UL
+LT2
+LTb
+LT2
+3087 1763 M
+263 0 V
+381 2076 M
+10 -17 V
+11 -18 V
+10 -17 V
+10 -17 V
+10 -17 V
+11 -17 V
+10 -17 V
+10 -16 V
+10 -17 V
+11 -16 V
+10 -17 V
+10 -16 V
+10 -16 V
+11 -16 V
+10 -16 V
+10 -15 V
+10 -16 V
+11 -16 V
+10 -15 V
+10 -15 V
+11 -15 V
+10 -16 V
+10 -15 V
+10 -14 V
+11 -15 V
+10 -15 V
+10 -14 V
+10 -15 V
+11 -14 V
+10 -14 V
+10 -14 V
+10 -14 V
+11 -14 V
+10 -14 V
+10 -14 V
+11 -13 V
+10 -14 V
+10 -13 V
+10 -14 V
+11 -13 V
+10 -13 V
+10 -13 V
+10 -13 V
+11 -13 V
+10 -12 V
+10 -13 V
+10 -12 V
+11 -13 V
+10 -12 V
+10 -12 V
+10 -12 V
+11 -12 V
+10 -12 V
+10 -12 V
+11 -12 V
+10 -11 V
+10 -12 V
+10 -11 V
+11 -12 V
+10 -11 V
+10 -11 V
+10 -11 V
+11 -11 V
+10 -11 V
+10 -11 V
+10 -10 V
+11 -11 V
+10 -10 V
+10 -11 V
+10 -10 V
+11 -10 V
+10 -10 V
+10 -10 V
+11 -10 V
+10 -10 V
+10 -10 V
+10 -10 V
+11 -9 V
+10 -10 V
+10 -9 V
+10 -10 V
+11 -9 V
+10 -9 V
+10 -9 V
+10 -9 V
+11 -9 V
+10 -9 V
+10 -9 V
+11 -8 V
+10 -9 V
+10 -9 V
+10 -8 V
+11 -8 V
+10 -9 V
+10 -8 V
+10 -8 V
+11 -8 V
+10 -8 V
+10 -8 V
+10 -8 V
+11 -7 V
+10 -8 V
+stroke
+1428 830 M
+10 -7 V
+10 -8 V
+11 -7 V
+10 -8 V
+10 -7 V
+11 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+11 -7 V
+10 -7 V
+10 -7 V
+10 -6 V
+11 -7 V
+10 -6 V
+10 -7 V
+10 -6 V
+11 -7 V
+10 -6 V
+10 -6 V
+10 -6 V
+11 -6 V
+10 -6 V
+10 -6 V
+11 -6 V
+10 -6 V
+10 -5 V
+10 -6 V
+11 -5 V
+10 -6 V
+10 -5 V
+10 -6 V
+11 -5 V
+10 -5 V
+10 -5 V
+10 -6 V
+11 -5 V
+10 -5 V
+10 -5 V
+11 -4 V
+10 -5 V
+10 -5 V
+10 -5 V
+11 -4 V
+10 -5 V
+10 -4 V
+10 -5 V
+11 -4 V
+10 -4 V
+10 -5 V
+10 -4 V
+11 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+11 -4 V
+10 -4 V
+10 -4 V
+11 -3 V
+10 -4 V
+10 -4 V
+10 -3 V
+11 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+11 -4 V
+10 -3 V
+10 -3 V
+10 -3 V
+11 -3 V
+10 -3 V
+10 -4 V
+11 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+11 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+11 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+11 -3 V
+10 -2 V
+10 -2 V
+10 -3 V
+11 -2 V
+10 -2 V
+10 -2 V
+11 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+11 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+11 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+stroke
+2495 384 M
+11 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+11 -2 V
+10 -1 V
+10 -1 V
+11 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+11 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+11 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+11 -1 V
+10 -1 V
+10 -1 V
+11 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+11 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+11 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+11 0 V
+10 -1 V
+10 -1 V
+10 0 V
+11 -1 V
+10 0 V
+10 -1 V
+11 0 V
+10 -1 V
+10 0 V
+10 -1 V
+11 0 V
+10 -1 V
+10 0 V
+10 0 V
+11 -1 V
+10 0 V
+10 -1 V
+10 0 V
+11 0 V
+10 0 V
+10 -1 V
+10 0 V
+11 0 V
+10 0 V
+10 -1 V
+11 0 V
+10 0 V
+10 0 V
+10 0 V
+11 -1 V
+10 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+10 0 V
+11 0 V
+10 -1 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+0.500 UL
+LTb
+381 331 M
+3069 0 V
+0 1745 V
+-3069 0 V
+381 331 L
+1.000 UP
+stroke
+grestore
+end
+showpage
+}}%
+\put(3037,1763){\rjust{$a=1,b=4$}}%
+\put(3037,1863){\rjust{$a=4,b=1$}}%
+\put(3037,1963){\rjust{$a=2,b=2$}}%
+\put(1915,2226){\cjust{Beta Distribution}}%
+\put(1915,50){\cjust{$x$}}%
+\put(100,1203){%
+\special{ps: gsave currentpoint currentpoint translate
+270 rotate neg exch neg exch translate}%
+\cstack{$p(x)$}%
+\special{ps: currentpoint grestore moveto}%
+}%
+\put(3450,200){\cjust{ 1}}%
+\put(2683,200){\cjust{ 0.75}}%
+\put(1916,200){\cjust{ 0.5}}%
+\put(1148,200){\cjust{ 0.25}}%
+\put(381,200){\cjust{ 0}}%
+\put(300,2076){\rjust{ 4}}%
+\put(300,1640){\rjust{ 3}}%
+\put(300,1204){\rjust{ 2}}%
+\put(300,767){\rjust{ 1}}%
+\put(300,331){\rjust{ 0}}%
+\endGNUPLOTpicture
+\endgroup
+\endinput
diff --git a/gsl-1.9/doc/rand-binomial.tex b/gsl-1.9/doc/rand-binomial.tex
new file mode 100644
index 0000000..09fde3e
--- /dev/null
+++ b/gsl-1.9/doc/rand-binomial.tex
@@ -0,0 +1,774 @@
+% GNUPLOT: plain TeX with Postscript
+\begingroup
+ \catcode`\@=11\relax
+ \def\GNUPLOTspecial{%
+ \def\do##1{\catcode`##1=12\relax}\dospecials
+ \catcode`\{=1\catcode`\}=2\catcode\%=14\relax\special}%
+%
+\expandafter\ifx\csname GNUPLOTpicture\endcsname\relax
+ \csname newdimen\endcsname\GNUPLOTunit
+ \gdef\GNUPLOTpicture(#1,#2){\vbox to#2\GNUPLOTunit\bgroup
+ \def\put(##1,##2)##3{\unskip\raise##2\GNUPLOTunit
+ \hbox to0pt{\kern##1\GNUPLOTunit ##3\hss}\ignorespaces}%
+ \def\ljust##1{\vbox to0pt{\vss\hbox to0pt{##1\hss}\vss}}%
+ \def\cjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1\hss}\vss}}%
+ \def\rjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1}\vss}}%
+ \def\stack##1{\let\\=\cr\tabskip=0pt\halign{\hfil ####\hfil\cr ##1\crcr}}%
+ \def\lstack##1{\hbox to0pt{\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\cstack##1{\hbox to0pt{\hss\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\rstack##1{\hbox to0pt{\vbox to0pt{\stack{##1}\vss}\hss}}%
+ \vss\hbox to#1\GNUPLOTunit\bgroup\ignorespaces}%
+ \gdef\endGNUPLOTpicture{\hss\egroup\egroup}%
+\fi
+\GNUPLOTunit=0.1bp
+\GNUPLOTpicture(3600,2376)
+{\GNUPLOTspecial{"
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: rand-binomial.tex
+%%Creator: gnuplot 4.0 patchlevel 0
+%%CreationDate: Wed Aug 31 12:38:29 2005
+%%DocumentFonts:
+%%BoundingBox: 0 0 360 237
+%%Orientation: Landscape
+%%EndComments
+/gnudict 256 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+/vshift -33 def
+/dl {10.0 mul} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+/Rounded false def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/N {newpath moveto} bind def
+/C {setrgbcolor} bind def
+/f {rlineto fill} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke userlinewidth 2 mul setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/AL { stroke userlinewidth 2 div setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/UL { dup gnulinewidth mul /userlinewidth exch def
+ dup 1 lt {pop 1} if 10 mul /udl exch def } def
+/PL { stroke userlinewidth setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/LTw { PL [] 1 setgray } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 1 0 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
+/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/Pnt { stroke [] 0 setdash
+ gsave 1 setlinecap M 0 0 V stroke grestore } def
+/Dia { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt } def
+/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt } def
+/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt } def
+/Star { 2 copy Pls Crs } def
+/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill } def
+/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill } def
+/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt } def
+/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill } def
+/Pent { stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt } def
+/PentF { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore } def
+/Circle { stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt } def
+/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
+/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def
+/C1 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C2 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C3 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C4 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C5 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc } bind def
+/C6 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C7 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C8 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C9 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C11 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C12 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C13 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C14 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc } bind def
+/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath } bind def
+/Square { dup Rec } bind def
+/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
+/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
+/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
+/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
+/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill
+ Bsquare } bind def
+/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
+/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare } bind def
+/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare } bind def
+/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
+/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare } bind def
+/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
+/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
+/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
+/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
+/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
+/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
+/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
+/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
+/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
+/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
+/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
+/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
+/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
+/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
+/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
+/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
+/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
+/DiaE { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke } def
+/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke } def
+/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke } def
+/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke } def
+/PentE { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore } def
+/CircE { stroke [] 0 setdash
+ hpt 0 360 arc stroke } def
+/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def
+/DiaW { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke } def
+/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke } def
+/TriUW { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke } def
+/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke } def
+/PentW { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore } def
+/CircW { stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke } def
+/BoxFill { gsave Rec 1 setgray fill grestore } def
+/BoxColFill {
+ gsave Rec
+ /Fillden exch def
+ currentrgbcolor
+ /ColB exch def /ColG exch def /ColR exch def
+ /ColR ColR Fillden mul Fillden sub 1 add def
+ /ColG ColG Fillden mul Fillden sub 1 add def
+ /ColB ColB Fillden mul Fillden sub 1 add def
+ ColR ColG ColB setrgbcolor
+ fill grestore } def
+%
+% PostScript Level 1 Pattern Fill routine
+% Usage: x y w h s a XX PatternFill
+% x,y = lower left corner of box to be filled
+% w,h = width and height of box
+% a = angle in degrees between lines and x-axis
+% XX = 0/1 for no/yes cross-hatch
+%
+/PatternFill { gsave /PFa [ 9 2 roll ] def
+ PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
+ PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
+ gsave 1 setgray fill grestore clip
+ currentlinewidth 0.5 mul setlinewidth
+ /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
+ 0 0 M PFa 5 get rotate PFs -2 div dup translate
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 M 0 PFs V } for
+ 0 PFa 6 get ne {
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 2 1 roll M PFs 0 V } for
+ } if
+ stroke grestore } def
+%
+/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
+dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
+currentdict end definefont pop
+end
+%%EndProlog
+gnudict begin
+gsave
+0 0 translate
+0.100 0.100 scale
+0 setgray
+newpath
+0.500 UL
+LTb
+481 331 M
+-31 0 V
+0.500 UL
+LTb
+481 913 M
+-31 0 V
+0.500 UL
+LTb
+481 1494 M
+-31 0 V
+0.500 UL
+LTb
+481 2076 M
+-31 0 V
+0.500 UL
+LTb
+481 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+751 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+1021 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+1291 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+1561 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+1831 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+2100 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+2370 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+2640 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+2910 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+3180 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+3450 331 M
+0 -63 V
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+LTb
+LTb
+LTb
+1.000 UP
+1.000 UL
+LT0
+LTb
+LT0
+3087 1963 M
+263 0 V
+481 337 M
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0 51 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0 199 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+0 426 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+stroke
+1464 1013 M
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+0 511 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+0 239 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+0 -239 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0 -511 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+stroke
+2457 1013 M
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0 -426 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0 -199 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0 -51 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0 -6 V
+stroke
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+1.000 UP
+stroke
+grestore
+end
+showpage
+}}%
+\put(3037,1963){\rjust{$p=0.5,n=9$}}%
+\put(1965,2226){\cjust{Binomial Distribution}}%
+\put(1965,50){\cjust{$k$}}%
+\put(100,1203){%
+\special{ps: gsave currentpoint currentpoint translate
+270 rotate neg exch neg exch translate}%
+\cstack{$p(k)$}%
+\special{ps: currentpoint grestore moveto}%
+}%
+\put(3315,200){\cjust{ 10}}%
+\put(3045,200){\cjust{ 9}}%
+\put(2775,200){\cjust{ 8}}%
+\put(2505,200){\cjust{ 7}}%
+\put(2235,200){\cjust{ 6}}%
+\put(1966,200){\cjust{ 5}}%
+\put(1696,200){\cjust{ 4}}%
+\put(1426,200){\cjust{ 3}}%
+\put(1156,200){\cjust{ 2}}%
+\put(886,200){\cjust{ 1}}%
+\put(616,200){\cjust{ 0}}%
+\put(400,2076){\rjust{ 0.3}}%
+\put(400,1494){\rjust{ 0.2}}%
+\put(400,913){\rjust{ 0.1}}%
+\put(400,331){\rjust{ 0}}%
+\endGNUPLOTpicture
+\endgroup
+\endinput
diff --git a/gsl-1.9/doc/rand-bivariate-gaussian.tex b/gsl-1.9/doc/rand-bivariate-gaussian.tex
new file mode 100644
index 0000000..45d2377
--- /dev/null
+++ b/gsl-1.9/doc/rand-bivariate-gaussian.tex
@@ -0,0 +1,1264 @@
+% GNUPLOT: plain TeX with Postscript
+\begingroup
+ \catcode`\@=11\relax
+ \def\GNUPLOTspecial{%
+ \def\do##1{\catcode`##1=12\relax}\dospecials
+ \catcode`\{=1\catcode`\}=2\catcode\%=14\relax\special}%
+%
+\expandafter\ifx\csname GNUPLOTpicture\endcsname\relax
+ \csname newdimen\endcsname\GNUPLOTunit
+ \gdef\GNUPLOTpicture(#1,#2){\vbox to#2\GNUPLOTunit\bgroup
+ \def\put(##1,##2)##3{\unskip\raise##2\GNUPLOTunit
+ \hbox to0pt{\kern##1\GNUPLOTunit ##3\hss}\ignorespaces}%
+ \def\ljust##1{\vbox to0pt{\vss\hbox to0pt{##1\hss}\vss}}%
+ \def\cjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1\hss}\vss}}%
+ \def\rjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1}\vss}}%
+ \def\stack##1{\let\\=\cr\tabskip=0pt\halign{\hfil ####\hfil\cr ##1\crcr}}%
+ \def\lstack##1{\hbox to0pt{\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\cstack##1{\hbox to0pt{\hss\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\rstack##1{\hbox to0pt{\vbox to0pt{\stack{##1}\vss}\hss}}%
+ \vss\hbox to#1\GNUPLOTunit\bgroup\ignorespaces}%
+ \gdef\endGNUPLOTpicture{\hss\egroup\egroup}%
+\fi
+\GNUPLOTunit=0.1bp
+\GNUPLOTpicture(2880,2468)
+{\GNUPLOTspecial{"
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: rand-bivariate-gaussian.tex
+%%Creator: gnuplot 4.0 patchlevel 0
+%%CreationDate: Wed Aug 31 12:38:29 2005
+%%DocumentFonts:
+%%BoundingBox: 0 0 288 246
+%%Orientation: Landscape
+%%EndComments
+/gnudict 256 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+/vshift -33 def
+/dl {10.0 mul} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+/Rounded false def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/N {newpath moveto} bind def
+/C {setrgbcolor} bind def
+/f {rlineto fill} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke userlinewidth 2 mul setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/AL { stroke userlinewidth 2 div setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/UL { dup gnulinewidth mul /userlinewidth exch def
+ dup 1 lt {pop 1} if 10 mul /udl exch def } def
+/PL { stroke userlinewidth setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/LTw { PL [] 1 setgray } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 1 0 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
+/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/Pnt { stroke [] 0 setdash
+ gsave 1 setlinecap M 0 0 V stroke grestore } def
+/Dia { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt } def
+/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt } def
+/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt } def
+/Star { 2 copy Pls Crs } def
+/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill } def
+/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill } def
+/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt } def
+/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill } def
+/Pent { stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt } def
+/PentF { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore } def
+/Circle { stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt } def
+/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
+/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def
+/C1 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C2 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C3 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C4 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C5 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc } bind def
+/C6 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C7 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C8 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C9 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C11 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C12 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C13 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C14 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc } bind def
+/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath } bind def
+/Square { dup Rec } bind def
+/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
+/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
+/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
+/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
+/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill
+ Bsquare } bind def
+/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
+/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare } bind def
+/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare } bind def
+/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
+/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare } bind def
+/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
+/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
+/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
+/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
+/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
+/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
+/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
+/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
+/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
+/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
+/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
+/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
+/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
+/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
+/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
+/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
+/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
+/DiaE { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke } def
+/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke } def
+/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke } def
+/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke } def
+/PentE { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore } def
+/CircE { stroke [] 0 setdash
+ hpt 0 360 arc stroke } def
+/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def
+/DiaW { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke } def
+/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke } def
+/TriUW { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke } def
+/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke } def
+/PentW { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore } def
+/CircW { stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke } def
+/BoxFill { gsave Rec 1 setgray fill grestore } def
+/BoxColFill {
+ gsave Rec
+ /Fillden exch def
+ currentrgbcolor
+ /ColB exch def /ColG exch def /ColR exch def
+ /ColR ColR Fillden mul Fillden sub 1 add def
+ /ColG ColG Fillden mul Fillden sub 1 add def
+ /ColB ColB Fillden mul Fillden sub 1 add def
+ ColR ColG ColB setrgbcolor
+ fill grestore } def
+%
+% PostScript Level 1 Pattern Fill routine
+% Usage: x y w h s a XX PatternFill
+% x,y = lower left corner of box to be filled
+% w,h = width and height of box
+% a = angle in degrees between lines and x-axis
+% XX = 0/1 for no/yes cross-hatch
+%
+/PatternFill { gsave /PFa [ 9 2 roll ] def
+ PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
+ PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
+ gsave 1 setgray fill grestore clip
+ currentlinewidth 0.5 mul setlinewidth
+ /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
+ 0 0 M PFa 5 get rotate PFs -2 div dup translate
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 M 0 PFs V } for
+ 0 PFa 6 get ne {
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 2 1 roll M PFs 0 V } for
+ } if
+ stroke grestore } def
+%
+/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
+dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
+currentdict end definefont pop
+end
+%%EndProlog
+gnudict begin
+gsave
+0 0 translate
+0.100 0.100 scale
+0 setgray
+newpath
+0.500 UL
+LTb
+0.500 UL
+LTb
+879 673 M
+0 1122 V
+0.500 UL
+LTb
+2001 1795 M
+-1122 0 V
+0.500 UL
+LTb
+879 673 M
+0 -32 V
+0.500 UL
+LTb
+0.500 UL
+LTb
+0.500 UL
+LTb
+1160 673 M
+0 -32 V
+0.500 UL
+LTb
+0.500 UL
+LTb
+0.500 UL
+LTb
+1440 673 M
+0 -32 V
+0.500 UL
+LTb
+0.500 UL
+LTb
+0.500 UL
+LTb
+1720 673 M
+0 -32 V
+0.500 UL
+LTb
+0.500 UL
+LTb
+0.500 UL
+LTb
+2001 673 M
+0 -32 V
+0.500 UL
+LTb
+0.500 UL
+LTb
+0.500 UL
+LTb
+2001 673 M
+32 0 V
+0.500 UL
+LTb
+0.500 UL
+LTb
+2001 954 M
+32 0 V
+0.500 UL
+LTb
+0.500 UL
+LTb
+2001 1234 M
+32 0 V
+0.500 UL
+LTb
+0.500 UL
+LTb
+2001 1514 M
+32 0 V
+0.500 UL
+LTb
+0.500 UL
+LTb
+2001 1795 M
+32 0 V
+0.500 UL
+LTb
+LTb
+1.000 UP
+1.000 UL
+LT0
+LTb
+1.000 UL
+LT0
+2404 2004 M
+263 0 V
+1445 1253 M
+4 1 V
+4 1 V
+3 1 V
+4 0 V
+4 0 V
+4 -2 V
+1 -1 V
+-1 -1 V
+-4 -1 V
+-4 -2 V
+-4 -1 V
+-3 0 V
+-4 0 V
+-4 5 V
+-33 -39 R
+-1 1 V
+1 1 V
+4 1 V
+4 2 V
+4 1 V
+3 0 V
+4 0 V
+4 -5 V
+-4 -1 V
+-4 -1 V
+-3 -1 V
+-4 0 V
+-4 0 V
+-4 2 V
+1206 981 M
+-4 0 V
+-4 1 V
+349 249 R
+-4 -5 V
+-4 -4 V
+-4 -4 V
+-2 -3 V
+-1 -1 V
+-4 -4 V
+-4 -4 V
+-4 -4 V
+-4 -4 V
+-3 -4 V
+-4 -3 V
+-4 -4 V
+-4 -4 V
+-3 -4 V
+-3 -3 V
+-1 -1 V
+-4 -4 V
+-4 -3 V
+-3 -4 V
+-4 -4 V
+-4 -3 V
+-4 -4 V
+-3 -3 V
+-4 -4 V
+-4 -3 V
+-4 -4 V
+-1 -1 V
+-2 -3 V
+-4 -3 V
+-4 -3 V
+-4 -4 V
+-2 -3 V
+-4 -3 V
+-4 -4 V
+-4 -3 V
+-3 -3 V
+-4 -4 V
+-4 -3 V
+-3 -3 V
+-1 0 V
+-3 -4 V
+-4 -3 V
+-4 -3 V
+-4 -3 V
+-3 -3 V
+-4 -3 V
+-4 -3 V
+-4 -3 V
+-3 -3 V
+-4 -3 V
+-4 -3 V
+-4 -3 V
+-2 -2 V
+-1 -1 V
+-4 -3 V
+-4 -2 V
+-4 -3 V
+-4 -3 V
+-3 -2 V
+-4 -3 V
+-4 -2 V
+-4 -3 V
+-3 -3 V
+-4 -2 V
+-4 -3 V
+-4 -2 V
+-3 -3 V
+-4 -3 V
+-1 0 V
+stroke
+1310 1022 M
+-3 -2 V
+-4 -2 V
+-3 -3 V
+-4 -2 V
+-4 -2 V
+-4 -2 V
+-3 -2 V
+-4 -2 V
+-4 -2 V
+-4 -2 V
+-3 -1 V
+-4 -2 V
+-4 -2 V
+-4 -2 V
+-3 -2 V
+-4 -1 V
+-4 -2 V
+-4 -2 V
+-3 -1 V
+-4 -2 V
+-4 -1 V
+-4 -1 V
+-3 -1 V
+-4 0 V
+-4 -1 V
+-4 0 V
+-3 0 V
+-4 1 V
+299 419 R
+4 3 V
+4 3 V
+2 2 V
+1 1 V
+4 3 V
+4 2 V
+4 3 V
+4 3 V
+3 2 V
+4 3 V
+4 2 V
+4 3 V
+3 3 V
+4 2 V
+4 3 V
+4 2 V
+3 3 V
+4 3 V
+1 0 V
+3 2 V
+4 2 V
+3 3 V
+4 2 V
+4 2 V
+4 2 V
+3 2 V
+4 2 V
+4 2 V
+4 2 V
+3 1 V
+4 2 V
+4 2 V
+4 2 V
+3 2 V
+4 1 V
+4 2 V
+4 2 V
+3 1 V
+4 2 V
+4 1 V
+4 1 V
+3 1 V
+4 0 V
+4 1 V
+4 0 V
+3 0 V
+4 -1 V
+4 0 V
+4 -1 V
+2 -1 V
+2 -3 V
+3 -11 V
+3 -25 V
+-3 -6 V
+-3 -8 V
+-4 -10 V
+-4 -12 V
+-1 -2 V
+-3 -5 V
+-4 -6 V
+-3 -6 V
+-4 -7 V
+-4 -7 V
+-3 -8 V
+-1 0 V
+-3 -5 V
+-4 -5 V
+-4 -6 V
+-4 -5 V
+-3 -6 V
+-4 -6 V
+-4 -6 V
+-4 -5 V
+-3 -4 V
+-4 -5 V
+stroke
+1618 1316 M
+-4 -5 V
+-4 -5 V
+-3 -5 V
+-4 -5 V
+-3 -4 V
+-1 -1 V
+-4 -5 V
+-3 -4 V
+-4 -5 V
+-4 -4 V
+-4 -4 V
+-3 -5 V
+-4 -5 V
+-4 -4 V
+-1 -2 V
+-3 -3 V
+-3 -4 V
+-4 -4 V
+-4 -4 V
+-4 -4 V
+-3 -3 V
+1198 982 M
+-2 1 V
+-2 3 V
+-3 11 V
+-3 25 V
+3 6 V
+3 8 V
+4 10 V
+4 12 V
+1 2 V
+3 5 V
+4 6 V
+3 6 V
+4 7 V
+4 7 V
+3 8 V
+1 0 V
+3 5 V
+4 5 V
+4 6 V
+4 5 V
+3 6 V
+4 6 V
+4 6 V
+4 5 V
+3 4 V
+4 5 V
+4 5 V
+4 5 V
+3 5 V
+4 5 V
+3 4 V
+1 1 V
+4 5 V
+3 4 V
+4 5 V
+4 4 V
+4 4 V
+3 5 V
+4 5 V
+4 4 V
+1 2 V
+3 3 V
+3 4 V
+4 4 V
+4 4 V
+4 4 V
+3 3 V
+4 5 V
+4 4 V
+4 4 V
+2 3 V
+1 1 V
+4 4 V
+4 4 V
+4 4 V
+4 4 V
+3 4 V
+4 3 V
+4 4 V
+4 4 V
+3 4 V
+3 3 V
+1 1 V
+4 4 V
+4 3 V
+3 4 V
+4 4 V
+4 3 V
+4 4 V
+3 3 V
+4 4 V
+4 3 V
+4 4 V
+1 1 V
+2 3 V
+4 3 V
+4 3 V
+4 4 V
+2 3 V
+4 3 V
+4 4 V
+4 3 V
+stroke
+1453 1356 M
+3 3 V
+4 4 V
+4 3 V
+3 3 V
+1 0 V
+3 4 V
+4 3 V
+4 3 V
+4 3 V
+3 3 V
+4 3 V
+4 3 V
+4 3 V
+3 3 V
+4 3 V
+1379 998 M
+-4 -3 V
+-4 -3 V
+-4 -3 V
+-3 -3 V
+-4 -3 V
+-1 0 V
+-3 -3 V
+-4 -3 V
+-4 -4 V
+-3 -3 V
+-4 -3 V
+-4 -3 V
+-4 -3 V
+-3 -3 V
+-4 -2 V
+-4 -3 V
+-4 -3 V
+-3 -3 V
+-4 -2 V
+-1 -1 V
+-3 -2 V
+-4 -3 V
+-3 -3 V
+-4 -3 V
+-4 -3 V
+-4 -3 V
+-3 -3 V
+-4 -2 V
+-4 -3 V
+-4 -2 V
+-3 -3 V
+-4 -2 V
+-4 -3 V
+-4 -2 V
+-2 -2 V
+-1 -1 V
+-4 -3 V
+-4 -2 V
+-4 -3 V
+-3 -3 V
+-4 -2 V
+-4 -3 V
+-4 -2 V
+-3 -2 V
+-4 -3 V
+-4 -2 V
+-4 -2 V
+-3 -2 V
+-4 -2 V
+-4 -3 V
+-4 -2 V
+-3 -1 V
+-1 -1 V
+-3 -2 V
+-4 -3 V
+-4 -2 V
+-4 -2 V
+-3 -2 V
+-4 -2 V
+-4 -2 V
+-4 -2 V
+-3 -2 V
+-4 -2 V
+-4 -1 V
+-4 -2 V
+-3 -2 V
+-4 -1 V
+-4 -2 V
+-4 -2 V
+-3 -1 V
+-4 -2 V
+-4 -1 V
+-4 -2 V
+-3 -1 V
+-4 -2 V
+-4 -1 V
+-4 -1 V
+-3 -1 V
+-4 -1 V
+-4 -1 V
+-4 -1 V
+-3 0 V
+-4 -1 V
+-4 0 V
+-4 -1 V
+-3 0 V
+-4 0 V
+-4 0 V
+stroke
+1063 818 M
+-4 0 V
+-3 1 V
+-4 0 V
+-4 1 V
+-4 2 V
+-3 1 V
+-4 3 V
+675 514 R
+-4 -4 V
+-4 -5 V
+0 -1 V
+-3 -4 V
+-4 -5 V
+-4 -4 V
+-4 -5 V
+-3 -5 V
+-4 -4 V
+-4 -4 V
+-4 -5 V
+-2 -2 V
+-2 -2 V
+-3 -5 V
+-4 -5 V
+-4 -4 V
+-4 -5 V
+-3 -4 V
+-4 -4 V
+-4 -4 V
+-4 -4 V
+-1 -2 V
+-2 -3 V
+-4 -4 V
+-4 -5 V
+-4 -4 V
+-3 -3 V
+-4 -4 V
+-4 -4 V
+-4 -4 V
+-3 -4 V
+-3 -3 V
+-1 -1 V
+-4 -5 V
+-4 -4 V
+-3 -4 V
+-4 -4 V
+-4 -4 V
+-4 -4 V
+-3 -4 V
+-4 -3 V
+-4 -4 V
+-2 -2 V
+-2 -2 V
+-3 -4 V
+-4 -4 V
+-4 -4 V
+-4 -4 V
+-3 -4 V
+-4 -4 V
+-4 -3 V
+-4 -4 V
+-3 -3 V
+-3 -2 V
+-1 -2 V
+-4 -4 V
+-4 -4 V
+-4 -4 V
+-3 -4 V
+-4 -4 V
+-4 -3 V
+-4 -4 V
+-3 -3 V
+-4 -3 V
+-4 -4 V
+-4 -3 V
+-3 -4 V
+-4 -4 V
+-4 -4 V
+-4 -3 V
+-3 -4 V
+-4 -3 V
+-4 -4 V
+-4 -3 V
+-3 -3 V
+-4 -3 V
+-1 -1 V
+-3 -3 V
+-4 -4 V
+-2 -3 V
+-4 -4 V
+-4 -3 V
+-4 -3 V
+-3 -4 V
+-4 -3 V
+-4 -3 V
+-4 -3 V
+-3 -3 V
+-4 -2 V
+0 -1 V
+-4 -4 V
+-4 -3 V
+-3 -4 V
+-4 -3 V
+-4 -3 V
+-4 -3 V
+stroke
+1382 1001 M
+-3 -3 V
+291 595 R
+4 2 V
+4 3 V
+4 2 V
+3 1 V
+1 1 V
+3 2 V
+4 3 V
+4 2 V
+4 2 V
+3 2 V
+4 2 V
+4 2 V
+4 2 V
+3 2 V
+4 2 V
+4 1 V
+4 2 V
+3 2 V
+4 1 V
+4 2 V
+4 2 V
+3 1 V
+4 2 V
+4 1 V
+4 2 V
+3 1 V
+4 2 V
+4 1 V
+4 1 V
+3 1 V
+4 1 V
+4 1 V
+4 1 V
+3 0 V
+4 1 V
+4 0 V
+4 1 V
+3 0 V
+4 0 V
+4 0 V
+4 0 V
+3 -1 V
+4 0 V
+4 -1 V
+4 -2 V
+3 -1 V
+4 -3 V
+4 -2 V
+4 -10 V
+4 -15 V
+2 -14 V
+-2 -7 V
+-4 -15 V
+-3 -16 V
+-1 -2 V
+-4 -8 V
+-4 -9 V
+-3 -9 V
+-4 -10 V
+0 -1 V
+-4 -6 V
+-4 -7 V
+-3 -7 V
+-4 -7 V
+-4 -8 V
+-2 -4 V
+-2 -3 V
+-3 -6 V
+-4 -6 V
+-4 -6 V
+-4 -6 V
+-3 -6 V
+-3 -6 V
+-1 -1 V
+-4 -5 V
+-4 -6 V
+-3 -6 V
+-4 -5 V
+-4 -6 V
+-4 -5 V
+-2 -4 V
+-1 -2 V
+-4 -5 V
+-4 -5 V
+-4 -6 V
+-3 -5 V
+-4 -5 V
+-4 -5 V
+-4 -5 V
+0 -1 V
+-3 -4 V
+-4 -5 V
+-4 -5 V
+-4 -5 V
+-3 -5 V
+-4 -5 V
+-382 -30 R
+3 4 V
+4 4 V
+4 3 V
+4 4 V
+3 3 V
+stroke
+1348 1328 M
+3 2 V
+1 2 V
+4 4 V
+4 4 V
+4 4 V
+3 4 V
+4 4 V
+4 3 V
+4 4 V
+3 3 V
+4 3 V
+4 4 V
+4 3 V
+3 4 V
+4 4 V
+4 4 V
+4 3 V
+3 4 V
+4 3 V
+4 4 V
+4 3 V
+3 3 V
+4 3 V
+1 1 V
+3 3 V
+4 4 V
+2 3 V
+4 4 V
+4 3 V
+4 3 V
+3 4 V
+4 3 V
+4 3 V
+4 3 V
+3 3 V
+4 2 V
+0 1 V
+4 4 V
+4 3 V
+3 4 V
+4 3 V
+4 3 V
+4 3 V
+3 3 V
+4 3 V
+4 3 V
+4 3 V
+3 3 V
+4 3 V
+1 0 V
+3 3 V
+4 3 V
+4 4 V
+3 3 V
+4 3 V
+4 3 V
+4 3 V
+3 3 V
+4 2 V
+4 3 V
+4 3 V
+3 3 V
+4 2 V
+1 1 V
+3 2 V
+4 3 V
+3 3 V
+4 3 V
+4 3 V
+4 3 V
+3 3 V
+4 2 V
+4 3 V
+4 2 V
+3 3 V
+4 2 V
+4 3 V
+4 2 V
+2 2 V
+1 1 V
+4 3 V
+4 2 V
+4 3 V
+3 3 V
+4 2 V
+4 3 V
+4 2 V
+3 2 V
+4 3 V
+4 2 V
+4 2 V
+3 2 V
+1037 826 M
+-4 2 V
+-4 10 V
+-4 15 V
+-2 14 V
+2 7 V
+4 15 V
+3 16 V
+1 2 V
+4 8 V
+4 9 V
+3 9 V
+stroke
+1044 933 M
+4 10 V
+0 1 V
+4 6 V
+4 7 V
+3 7 V
+4 7 V
+4 8 V
+2 4 V
+2 3 V
+3 6 V
+4 6 V
+4 6 V
+4 6 V
+3 6 V
+3 6 V
+1 1 V
+4 5 V
+4 6 V
+3 6 V
+4 5 V
+4 6 V
+4 5 V
+2 4 V
+1 2 V
+4 5 V
+4 5 V
+4 6 V
+3 5 V
+4 5 V
+4 5 V
+4 5 V
+0 1 V
+3 4 V
+4 5 V
+4 5 V
+4 5 V
+3 5 V
+4 5 V
+4 4 V
+4 5 V
+0 1 V
+3 4 V
+4 5 V
+4 4 V
+4 5 V
+3 5 V
+4 4 V
+4 4 V
+4 5 V
+2 2 V
+2 2 V
+3 5 V
+4 5 V
+4 4 V
+4 5 V
+3 4 V
+4 4 V
+4 4 V
+4 4 V
+1 2 V
+2 3 V
+4 4 V
+4 5 V
+4 4 V
+3 3 V
+4 4 V
+4 4 V
+4 4 V
+3 4 V
+3 3 V
+1 1 V
+4 5 V
+4 4 V
+3 4 V
+4 4 V
+4 4 V
+4 4 V
+3 4 V
+4 3 V
+4 4 V
+2 2 V
+2 2 V
+3 4 V
+4 4 V
+4 4 V
+4 4 V
+0.500 UL
+LTb
+2001 1795 M
+0 -1122 V
+0.500 UL
+LTb
+879 673 M
+1122 0 V
+LTb
+LTb
+1.000 UP
+stroke
+grestore
+end
+showpage
+}}%
+\put(2313,1234){\cjust{$y$}}%
+\put(1440,361){\cjust{$x$}}%
+\put(2354,2004){\rjust{$\sigma_x=1, \sigma_y=1, \rho=0.9$}}%
+\put(1440,2267){\cjust{Bivariate Gaussian Distribution}}%
+\put(2083,1795){\ljust{ 2}}%
+\put(2083,1514){\ljust{ 1}}%
+\put(2083,1234){\ljust{ 0}}%
+\put(2083,954){\ljust{-1}}%
+\put(2083,673){\ljust{-2}}%
+\put(2001,541){\cjust{ 2}}%
+\put(1720,541){\cjust{ 1}}%
+\put(1440,541){\cjust{ 0}}%
+\put(1160,541){\cjust{-1}}%
+\put(879,541){\cjust{-2}}%
+\endGNUPLOTpicture
+\endgroup
+\endinput
diff --git a/gsl-1.9/doc/rand-cauchy.tex b/gsl-1.9/doc/rand-cauchy.tex
new file mode 100644
index 0000000..74b973b
--- /dev/null
+++ b/gsl-1.9/doc/rand-cauchy.tex
@@ -0,0 +1,1054 @@
+% GNUPLOT: plain TeX with Postscript
+\begingroup
+ \catcode`\@=11\relax
+ \def\GNUPLOTspecial{%
+ \def\do##1{\catcode`##1=12\relax}\dospecials
+ \catcode`\{=1\catcode`\}=2\catcode\%=14\relax\special}%
+%
+\expandafter\ifx\csname GNUPLOTpicture\endcsname\relax
+ \csname newdimen\endcsname\GNUPLOTunit
+ \gdef\GNUPLOTpicture(#1,#2){\vbox to#2\GNUPLOTunit\bgroup
+ \def\put(##1,##2)##3{\unskip\raise##2\GNUPLOTunit
+ \hbox to0pt{\kern##1\GNUPLOTunit ##3\hss}\ignorespaces}%
+ \def\ljust##1{\vbox to0pt{\vss\hbox to0pt{##1\hss}\vss}}%
+ \def\cjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1\hss}\vss}}%
+ \def\rjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1}\vss}}%
+ \def\stack##1{\let\\=\cr\tabskip=0pt\halign{\hfil ####\hfil\cr ##1\crcr}}%
+ \def\lstack##1{\hbox to0pt{\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\cstack##1{\hbox to0pt{\hss\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\rstack##1{\hbox to0pt{\vbox to0pt{\stack{##1}\vss}\hss}}%
+ \vss\hbox to#1\GNUPLOTunit\bgroup\ignorespaces}%
+ \gdef\endGNUPLOTpicture{\hss\egroup\egroup}%
+\fi
+\GNUPLOTunit=0.1bp
+\GNUPLOTpicture(3600,2376)
+{\GNUPLOTspecial{"
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: rand-cauchy.tex
+%%Creator: gnuplot 4.0 patchlevel 0
+%%CreationDate: Wed Aug 31 12:38:29 2005
+%%DocumentFonts:
+%%BoundingBox: 0 0 360 237
+%%Orientation: Landscape
+%%EndComments
+/gnudict 256 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+/vshift -33 def
+/dl {10.0 mul} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+/Rounded false def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/N {newpath moveto} bind def
+/C {setrgbcolor} bind def
+/f {rlineto fill} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke userlinewidth 2 mul setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/AL { stroke userlinewidth 2 div setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/UL { dup gnulinewidth mul /userlinewidth exch def
+ dup 1 lt {pop 1} if 10 mul /udl exch def } def
+/PL { stroke userlinewidth setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/LTw { PL [] 1 setgray } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 1 0 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
+/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/Pnt { stroke [] 0 setdash
+ gsave 1 setlinecap M 0 0 V stroke grestore } def
+/Dia { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt } def
+/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt } def
+/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt } def
+/Star { 2 copy Pls Crs } def
+/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill } def
+/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill } def
+/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt } def
+/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill } def
+/Pent { stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt } def
+/PentF { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore } def
+/Circle { stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt } def
+/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
+/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def
+/C1 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C2 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C3 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C4 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C5 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc } bind def
+/C6 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C7 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C8 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C9 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C11 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C12 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C13 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C14 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc } bind def
+/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath } bind def
+/Square { dup Rec } bind def
+/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
+/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
+/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
+/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
+/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill
+ Bsquare } bind def
+/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
+/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare } bind def
+/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare } bind def
+/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
+/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare } bind def
+/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
+/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
+/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
+/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
+/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
+/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
+/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
+/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
+/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
+/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
+/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
+/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
+/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
+/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
+/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
+/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
+/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
+/DiaE { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke } def
+/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke } def
+/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke } def
+/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke } def
+/PentE { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore } def
+/CircE { stroke [] 0 setdash
+ hpt 0 360 arc stroke } def
+/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def
+/DiaW { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke } def
+/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke } def
+/TriUW { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke } def
+/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke } def
+/PentW { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore } def
+/CircW { stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke } def
+/BoxFill { gsave Rec 1 setgray fill grestore } def
+/BoxColFill {
+ gsave Rec
+ /Fillden exch def
+ currentrgbcolor
+ /ColB exch def /ColG exch def /ColR exch def
+ /ColR ColR Fillden mul Fillden sub 1 add def
+ /ColG ColG Fillden mul Fillden sub 1 add def
+ /ColB ColB Fillden mul Fillden sub 1 add def
+ ColR ColG ColB setrgbcolor
+ fill grestore } def
+%
+% PostScript Level 1 Pattern Fill routine
+% Usage: x y w h s a XX PatternFill
+% x,y = lower left corner of box to be filled
+% w,h = width and height of box
+% a = angle in degrees between lines and x-axis
+% XX = 0/1 for no/yes cross-hatch
+%
+/PatternFill { gsave /PFa [ 9 2 roll ] def
+ PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
+ PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
+ gsave 1 setgray fill grestore clip
+ currentlinewidth 0.5 mul setlinewidth
+ /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
+ 0 0 M PFa 5 get rotate PFs -2 div dup translate
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 M 0 PFs V } for
+ 0 PFa 6 get ne {
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 2 1 roll M PFs 0 V } for
+ } if
+ stroke grestore } def
+%
+/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
+dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
+currentdict end definefont pop
+end
+%%EndProlog
+gnudict begin
+gsave
+0 0 translate
+0.100 0.100 scale
+0 setgray
+newpath
+0.500 UL
+LTb
+481 331 M
+-31 0 V
+0.500 UL
+LTb
+481 767 M
+-31 0 V
+0.500 UL
+LTb
+481 1204 M
+-31 0 V
+0.500 UL
+LTb
+481 1640 M
+-31 0 V
+0.500 UL
+LTb
+481 2076 M
+-31 0 V
+0.500 UL
+LTb
+481 331 M
+0 -31 V
+0.500 UL
+LTb
+778 331 M
+0 -31 V
+0.500 UL
+LTb
+1075 331 M
+0 -31 V
+0.500 UL
+LTb
+1372 331 M
+0 -31 V
+0.500 UL
+LTb
+1669 331 M
+0 -31 V
+0.500 UL
+LTb
+1965 331 M
+0 -31 V
+0.500 UL
+LTb
+2262 331 M
+0 -31 V
+0.500 UL
+LTb
+2559 331 M
+0 -31 V
+0.500 UL
+LTb
+2856 331 M
+0 -31 V
+0.500 UL
+LTb
+3153 331 M
+0 -31 V
+0.500 UL
+LTb
+3450 331 M
+0 -31 V
+0.500 UL
+LTb
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+LTb
+LTb
+LTb
+1.000 UP
+1.000 UL
+LT0
+LTb
+LT0
+3087 1963 M
+263 0 V
+481 384 M
+10 1 V
+10 1 V
+10 1 V
+10 0 V
+10 1 V
+10 1 V
+10 1 V
+9 0 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 0 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+9 1 V
+10 1 V
+10 2 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 2 V
+10 1 V
+10 1 V
+10 1 V
+10 2 V
+10 1 V
+10 2 V
+9 1 V
+10 2 V
+10 1 V
+10 2 V
+10 1 V
+10 2 V
+10 2 V
+10 1 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+9 2 V
+10 2 V
+10 2 V
+10 3 V
+10 2 V
+10 2 V
+10 3 V
+10 2 V
+10 3 V
+10 3 V
+10 2 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+9 4 V
+10 3 V
+10 3 V
+10 4 V
+10 3 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 5 V
+10 4 V
+10 5 V
+10 5 V
+9 5 V
+10 5 V
+10 5 V
+10 6 V
+10 6 V
+10 5 V
+10 7 V
+10 6 V
+10 7 V
+10 6 V
+10 8 V
+10 7 V
+10 8 V
+10 8 V
+9 8 V
+10 8 V
+10 9 V
+10 10 V
+10 9 V
+10 10 V
+10 10 V
+10 11 V
+10 11 V
+10 12 V
+stroke
+1494 725 M
+10 12 V
+10 13 V
+10 13 V
+10 14 V
+9 14 V
+10 15 V
+10 15 V
+10 16 V
+10 16 V
+10 18 V
+10 18 V
+10 18 V
+10 20 V
+10 20 V
+10 21 V
+10 21 V
+10 23 V
+10 23 V
+10 24 V
+9 24 V
+10 26 V
+10 26 V
+10 27 V
+10 27 V
+10 29 V
+10 28 V
+10 30 V
+10 29 V
+10 30 V
+10 30 V
+10 30 V
+10 30 V
+10 30 V
+9 29 V
+10 29 V
+10 28 V
+10 26 V
+10 25 V
+10 24 V
+10 21 V
+10 20 V
+10 17 V
+10 15 V
+10 12 V
+10 9 V
+10 6 V
+10 3 V
+9 0 V
+10 -3 V
+10 -6 V
+10 -9 V
+10 -12 V
+10 -15 V
+10 -17 V
+10 -20 V
+10 -21 V
+10 -24 V
+10 -25 V
+10 -26 V
+10 -28 V
+10 -29 V
+9 -29 V
+10 -30 V
+10 -30 V
+10 -30 V
+10 -30 V
+10 -30 V
+10 -29 V
+10 -30 V
+10 -28 V
+10 -29 V
+10 -27 V
+10 -27 V
+10 -26 V
+10 -26 V
+9 -24 V
+10 -24 V
+10 -23 V
+10 -23 V
+10 -21 V
+10 -21 V
+10 -20 V
+10 -20 V
+10 -18 V
+10 -18 V
+10 -18 V
+10 -16 V
+10 -16 V
+10 -15 V
+10 -15 V
+9 -14 V
+10 -14 V
+10 -13 V
+10 -13 V
+10 -12 V
+10 -12 V
+10 -11 V
+10 -11 V
+10 -10 V
+10 -10 V
+10 -9 V
+10 -10 V
+10 -9 V
+10 -8 V
+stroke
+2527 635 M
+9 -8 V
+10 -8 V
+10 -8 V
+10 -7 V
+10 -8 V
+10 -6 V
+10 -7 V
+10 -6 V
+10 -7 V
+10 -5 V
+10 -6 V
+10 -6 V
+10 -5 V
+10 -5 V
+9 -5 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+9 -4 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+9 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+9 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+9 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+1.000 UL
+LT1
+LTb
+LT1
+3087 1863 M
+263 0 V
+481 427 M
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 2 V
+10 1 V
+10 1 V
+9 1 V
+10 1 V
+10 2 V
+10 1 V
+10 1 V
+10 2 V
+10 1 V
+10 2 V
+10 1 V
+10 1 V
+10 2 V
+10 1 V
+10 2 V
+10 2 V
+9 1 V
+10 2 V
+10 1 V
+10 2 V
+10 2 V
+10 2 V
+10 1 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+9 2 V
+10 2 V
+10 2 V
+10 2 V
+10 3 V
+10 2 V
+10 2 V
+10 2 V
+10 3 V
+10 2 V
+10 3 V
+10 2 V
+10 3 V
+10 3 V
+9 2 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+10 4 V
+10 3 V
+10 4 V
+10 3 V
+9 4 V
+10 3 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 5 V
+10 4 V
+10 5 V
+10 4 V
+10 5 V
+9 5 V
+10 4 V
+10 5 V
+10 5 V
+10 5 V
+10 6 V
+10 5 V
+10 5 V
+10 6 V
+10 5 V
+10 6 V
+10 6 V
+10 6 V
+10 6 V
+9 6 V
+10 6 V
+10 6 V
+10 7 V
+10 6 V
+10 7 V
+10 6 V
+10 7 V
+10 7 V
+10 7 V
+stroke
+1494 757 M
+10 7 V
+10 7 V
+10 7 V
+10 7 V
+9 7 V
+10 8 V
+10 7 V
+10 7 V
+10 8 V
+10 7 V
+10 8 V
+10 7 V
+10 8 V
+10 7 V
+10 8 V
+10 8 V
+10 7 V
+10 7 V
+10 8 V
+9 7 V
+10 7 V
+10 7 V
+10 8 V
+10 6 V
+10 7 V
+10 7 V
+10 6 V
+10 7 V
+10 6 V
+10 6 V
+10 5 V
+10 6 V
+10 5 V
+9 5 V
+10 4 V
+10 5 V
+10 4 V
+10 3 V
+10 4 V
+10 3 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 1 V
+10 1 V
+10 0 V
+9 0 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -5 V
+10 -4 V
+9 -5 V
+10 -5 V
+10 -6 V
+10 -5 V
+10 -6 V
+10 -6 V
+10 -7 V
+10 -6 V
+10 -7 V
+10 -7 V
+10 -6 V
+10 -8 V
+10 -7 V
+10 -7 V
+9 -7 V
+10 -8 V
+10 -7 V
+10 -7 V
+10 -8 V
+10 -8 V
+10 -7 V
+10 -8 V
+10 -7 V
+10 -8 V
+10 -7 V
+10 -8 V
+10 -7 V
+10 -7 V
+10 -8 V
+9 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -6 V
+10 -7 V
+10 -6 V
+10 -7 V
+10 -6 V
+10 -6 V
+stroke
+2527 698 M
+9 -6 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -5 V
+10 -6 V
+10 -5 V
+10 -5 V
+10 -6 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -4 V
+9 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+9 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+9 -2 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+9 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+9 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+1.000 UP
+stroke
+grestore
+end
+showpage
+}}%
+\put(3037,1863){\rjust{$a=2$}}%
+\put(3037,1963){\rjust{$a=1$}}%
+\put(1965,2226){\cjust{Cauchy Distribution}}%
+\put(1965,50){\cjust{$x$}}%
+\put(100,1203){%
+\special{ps: gsave currentpoint currentpoint translate
+270 rotate neg exch neg exch translate}%
+\cstack{$p(x)$}%
+\special{ps: currentpoint grestore moveto}%
+}%
+\put(3450,200){\cjust{ 5}}%
+\put(3153,200){\cjust{ 4}}%
+\put(2856,200){\cjust{ 3}}%
+\put(2559,200){\cjust{ 2}}%
+\put(2262,200){\cjust{ 1}}%
+\put(1965,200){\cjust{ 0}}%
+\put(1669,200){\cjust{-1}}%
+\put(1372,200){\cjust{-2}}%
+\put(1075,200){\cjust{-3}}%
+\put(778,200){\cjust{-4}}%
+\put(481,200){\cjust{-5}}%
+\put(400,2076){\rjust{ 0.4}}%
+\put(400,1640){\rjust{ 0.3}}%
+\put(400,1204){\rjust{ 0.2}}%
+\put(400,767){\rjust{ 0.1}}%
+\put(400,331){\rjust{ 0}}%
+\endGNUPLOTpicture
+\endgroup
+\endinput
diff --git a/gsl-1.9/doc/rand-chisq.tex b/gsl-1.9/doc/rand-chisq.tex
new file mode 100644
index 0000000..4bc65c4
--- /dev/null
+++ b/gsl-1.9/doc/rand-chisq.tex
@@ -0,0 +1,1307 @@
+% GNUPLOT: plain TeX with Postscript
+\begingroup
+ \catcode`\@=11\relax
+ \def\GNUPLOTspecial{%
+ \def\do##1{\catcode`##1=12\relax}\dospecials
+ \catcode`\{=1\catcode`\}=2\catcode\%=14\relax\special}%
+%
+\expandafter\ifx\csname GNUPLOTpicture\endcsname\relax
+ \csname newdimen\endcsname\GNUPLOTunit
+ \gdef\GNUPLOTpicture(#1,#2){\vbox to#2\GNUPLOTunit\bgroup
+ \def\put(##1,##2)##3{\unskip\raise##2\GNUPLOTunit
+ \hbox to0pt{\kern##1\GNUPLOTunit ##3\hss}\ignorespaces}%
+ \def\ljust##1{\vbox to0pt{\vss\hbox to0pt{##1\hss}\vss}}%
+ \def\cjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1\hss}\vss}}%
+ \def\rjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1}\vss}}%
+ \def\stack##1{\let\\=\cr\tabskip=0pt\halign{\hfil ####\hfil\cr ##1\crcr}}%
+ \def\lstack##1{\hbox to0pt{\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\cstack##1{\hbox to0pt{\hss\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\rstack##1{\hbox to0pt{\vbox to0pt{\stack{##1}\vss}\hss}}%
+ \vss\hbox to#1\GNUPLOTunit\bgroup\ignorespaces}%
+ \gdef\endGNUPLOTpicture{\hss\egroup\egroup}%
+\fi
+\GNUPLOTunit=0.1bp
+\GNUPLOTpicture(3600,2376)
+{\GNUPLOTspecial{"
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: rand-chisq.tex
+%%Creator: gnuplot 4.0 patchlevel 0
+%%CreationDate: Wed Aug 31 12:38:29 2005
+%%DocumentFonts:
+%%BoundingBox: 0 0 360 237
+%%Orientation: Landscape
+%%EndComments
+/gnudict 256 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+/vshift -33 def
+/dl {10.0 mul} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+/Rounded false def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/N {newpath moveto} bind def
+/C {setrgbcolor} bind def
+/f {rlineto fill} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke userlinewidth 2 mul setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/AL { stroke userlinewidth 2 div setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/UL { dup gnulinewidth mul /userlinewidth exch def
+ dup 1 lt {pop 1} if 10 mul /udl exch def } def
+/PL { stroke userlinewidth setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/LTw { PL [] 1 setgray } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 1 0 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
+/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/Pnt { stroke [] 0 setdash
+ gsave 1 setlinecap M 0 0 V stroke grestore } def
+/Dia { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt } def
+/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt } def
+/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt } def
+/Star { 2 copy Pls Crs } def
+/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill } def
+/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill } def
+/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt } def
+/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill } def
+/Pent { stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt } def
+/PentF { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore } def
+/Circle { stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt } def
+/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
+/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def
+/C1 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C2 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C3 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C4 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C5 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc } bind def
+/C6 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C7 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C8 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C9 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C11 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C12 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C13 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C14 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc } bind def
+/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath } bind def
+/Square { dup Rec } bind def
+/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
+/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
+/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
+/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
+/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill
+ Bsquare } bind def
+/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
+/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare } bind def
+/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare } bind def
+/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
+/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare } bind def
+/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
+/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
+/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
+/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
+/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
+/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
+/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
+/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
+/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
+/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
+/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
+/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
+/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
+/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
+/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
+/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
+/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
+/DiaE { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke } def
+/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke } def
+/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke } def
+/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke } def
+/PentE { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore } def
+/CircE { stroke [] 0 setdash
+ hpt 0 360 arc stroke } def
+/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def
+/DiaW { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke } def
+/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke } def
+/TriUW { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke } def
+/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke } def
+/PentW { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore } def
+/CircW { stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke } def
+/BoxFill { gsave Rec 1 setgray fill grestore } def
+/BoxColFill {
+ gsave Rec
+ /Fillden exch def
+ currentrgbcolor
+ /ColB exch def /ColG exch def /ColR exch def
+ /ColR ColR Fillden mul Fillden sub 1 add def
+ /ColG ColG Fillden mul Fillden sub 1 add def
+ /ColB ColB Fillden mul Fillden sub 1 add def
+ ColR ColG ColB setrgbcolor
+ fill grestore } def
+%
+% PostScript Level 1 Pattern Fill routine
+% Usage: x y w h s a XX PatternFill
+% x,y = lower left corner of box to be filled
+% w,h = width and height of box
+% a = angle in degrees between lines and x-axis
+% XX = 0/1 for no/yes cross-hatch
+%
+/PatternFill { gsave /PFa [ 9 2 roll ] def
+ PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
+ PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
+ gsave 1 setgray fill grestore clip
+ currentlinewidth 0.5 mul setlinewidth
+ /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
+ 0 0 M PFa 5 get rotate PFs -2 div dup translate
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 M 0 PFs V } for
+ 0 PFa 6 get ne {
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 2 1 roll M PFs 0 V } for
+ } if
+ stroke grestore } def
+%
+/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
+dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
+currentdict end definefont pop
+end
+%%EndProlog
+gnudict begin
+gsave
+0 0 translate
+0.100 0.100 scale
+0 setgray
+newpath
+0.500 UL
+LTb
+481 331 M
+-31 0 V
+0.500 UL
+LTb
+481 1204 M
+-31 0 V
+0.500 UL
+LTb
+481 2076 M
+-31 0 V
+0.500 UL
+LTb
+481 331 M
+0 -31 V
+0.500 UL
+LTb
+1471 331 M
+0 -31 V
+0.500 UL
+LTb
+2460 331 M
+0 -31 V
+0.500 UL
+LTb
+3450 331 M
+0 -31 V
+0.500 UL
+LTb
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+LTb
+LTb
+LTb
+1.000 UP
+1.000 UL
+LT0
+LTb
+LT0
+3087 1963 M
+263 0 V
+618 2076 M
+2 -14 V
+10 -67 V
+10 -61 V
+10 -55 V
+10 -51 V
+10 -48 V
+10 -43 V
+10 -41 V
+9 -38 V
+10 -36 V
+10 -33 V
+10 -32 V
+10 -30 V
+10 -28 V
+10 -27 V
+10 -25 V
+10 -24 V
+10 -24 V
+10 -22 V
+10 -21 V
+10 -20 V
+10 -19 V
+9 -19 V
+10 -18 V
+10 -17 V
+10 -17 V
+10 -16 V
+10 -15 V
+10 -15 V
+10 -15 V
+10 -14 V
+10 -13 V
+10 -13 V
+10 -13 V
+10 -13 V
+10 -12 V
+9 -11 V
+10 -12 V
+10 -11 V
+10 -10 V
+10 -11 V
+10 -10 V
+10 -10 V
+10 -9 V
+10 -10 V
+10 -9 V
+10 -9 V
+10 -9 V
+10 -8 V
+10 -9 V
+10 -8 V
+9 -8 V
+10 -8 V
+10 -7 V
+10 -8 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -6 V
+10 -7 V
+10 -6 V
+10 -6 V
+9 -6 V
+10 -6 V
+10 -6 V
+10 -5 V
+10 -6 V
+10 -5 V
+10 -6 V
+10 -5 V
+10 -5 V
+10 -6 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+9 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -3 V
+10 -4 V
+9 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+stroke
+1623 695 M
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -4 V
+10 -3 V
+9 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+9 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+9 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+9 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+9 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+9 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+9 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+stroke
+2656 488 M
+10 -2 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+9 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+9 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+9 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+1.000 UL
+LT1
+LTb
+LT1
+3087 1863 M
+263 0 V
+481 1204 M
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -5 V
+9 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+9 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+9 -4 V
+10 -3 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+9 -3 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -3 V
+9 -3 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+9 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+9 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+stroke
+1494 854 M
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+9 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+9 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+9 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+9 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+9 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+9 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+9 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+stroke
+2527 641 M
+9 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+9 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+9 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+9 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+1.000 UL
+LT2
+LTb
+LT2
+3087 1763 M
+263 0 V
+481 331 M
+10 69 V
+10 29 V
+10 21 V
+10 18 V
+10 15 V
+10 14 V
+10 12 V
+9 11 V
+10 11 V
+10 10 V
+10 9 V
+10 8 V
+10 9 V
+10 7 V
+10 7 V
+10 7 V
+10 7 V
+10 6 V
+10 6 V
+10 6 V
+10 6 V
+9 5 V
+10 5 V
+10 5 V
+10 5 V
+10 4 V
+10 4 V
+10 5 V
+10 4 V
+10 4 V
+10 3 V
+10 4 V
+10 3 V
+10 4 V
+10 3 V
+9 3 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+10 2 V
+10 3 V
+10 3 V
+10 2 V
+10 2 V
+10 2 V
+10 3 V
+10 2 V
+10 2 V
+9 2 V
+10 2 V
+10 1 V
+10 2 V
+10 2 V
+10 1 V
+10 2 V
+10 2 V
+10 1 V
+10 1 V
+10 2 V
+10 1 V
+10 1 V
+10 1 V
+10 2 V
+9 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 0 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 0 V
+10 1 V
+10 0 V
+9 1 V
+10 1 V
+10 0 V
+10 0 V
+10 1 V
+10 0 V
+10 1 V
+10 0 V
+10 0 V
+10 1 V
+10 0 V
+10 0 V
+10 0 V
+10 1 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+stroke
+1494 753 M
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+9 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+9 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+9 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+9 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+stroke
+2527 687 M
+9 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+9 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+1.000 UP
+stroke
+grestore
+end
+showpage
+}}%
+\put(3037,1763){\rjust{$\nu=3$}}%
+\put(3037,1863){\rjust{$\nu=2$}}%
+\put(3037,1963){\rjust{$\nu=1$}}%
+\put(1965,2226){\cjust{Chi-squared Distribution}}%
+\put(1965,50){\cjust{$x$}}%
+\put(100,1203){%
+\special{ps: gsave currentpoint currentpoint translate
+270 rotate neg exch neg exch translate}%
+\cstack{$p(x)$}%
+\special{ps: currentpoint grestore moveto}%
+}%
+\put(3450,200){\cjust{ 3}}%
+\put(2460,200){\cjust{ 2}}%
+\put(1471,200){\cjust{ 1}}%
+\put(481,200){\cjust{ 0}}%
+\put(400,2076){\rjust{ 1}}%
+\put(400,1204){\rjust{ 0.5}}%
+\put(400,331){\rjust{ 0}}%
+\endGNUPLOTpicture
+\endgroup
+\endinput
diff --git a/gsl-1.9/doc/rand-erlang.tex b/gsl-1.9/doc/rand-erlang.tex
new file mode 100644
index 0000000..e7ecaef
--- /dev/null
+++ b/gsl-1.9/doc/rand-erlang.tex
@@ -0,0 +1,1330 @@
+% GNUPLOT: plain TeX with Postscript
+\begingroup
+ \catcode`\@=11\relax
+ \def\GNUPLOTspecial{%
+ \def\do##1{\catcode`##1=12\relax}\dospecials
+ \catcode`\{=1\catcode`\}=2\catcode\%=14\relax\special}%
+%
+\expandafter\ifx\csname GNUPLOTpicture\endcsname\relax
+ \csname newdimen\endcsname\GNUPLOTunit
+ \gdef\GNUPLOTpicture(#1,#2){\vbox to#2\GNUPLOTunit\bgroup
+ \def\put(##1,##2)##3{\unskip\raise##2\GNUPLOTunit
+ \hbox to0pt{\kern##1\GNUPLOTunit ##3\hss}\ignorespaces}%
+ \def\ljust##1{\vbox to0pt{\vss\hbox to0pt{##1\hss}\vss}}%
+ \def\cjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1\hss}\vss}}%
+ \def\rjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1}\vss}}%
+ \def\stack##1{\let\\=\cr\tabskip=0pt\halign{\hfil ####\hfil\cr ##1\crcr}}%
+ \def\lstack##1{\hbox to0pt{\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\cstack##1{\hbox to0pt{\hss\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\rstack##1{\hbox to0pt{\vbox to0pt{\stack{##1}\vss}\hss}}%
+ \vss\hbox to#1\GNUPLOTunit\bgroup\ignorespaces}%
+ \gdef\endGNUPLOTpicture{\hss\egroup\egroup}%
+\fi
+\GNUPLOTunit=0.1bp
+\GNUPLOTpicture(3600,2376)
+{\GNUPLOTspecial{"
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: rand-erlang.tex
+%%Creator: gnuplot 4.0 patchlevel 0
+%%CreationDate: Wed Aug 31 12:38:29 2005
+%%DocumentFonts:
+%%BoundingBox: 0 0 360 237
+%%Orientation: Landscape
+%%EndComments
+/gnudict 256 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+/vshift -33 def
+/dl {10.0 mul} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+/Rounded false def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/N {newpath moveto} bind def
+/C {setrgbcolor} bind def
+/f {rlineto fill} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke userlinewidth 2 mul setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/AL { stroke userlinewidth 2 div setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/UL { dup gnulinewidth mul /userlinewidth exch def
+ dup 1 lt {pop 1} if 10 mul /udl exch def } def
+/PL { stroke userlinewidth setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/LTw { PL [] 1 setgray } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 1 0 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
+/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/Pnt { stroke [] 0 setdash
+ gsave 1 setlinecap M 0 0 V stroke grestore } def
+/Dia { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt } def
+/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt } def
+/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt } def
+/Star { 2 copy Pls Crs } def
+/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill } def
+/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill } def
+/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt } def
+/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill } def
+/Pent { stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt } def
+/PentF { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore } def
+/Circle { stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt } def
+/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
+/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def
+/C1 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C2 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C3 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C4 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C5 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc } bind def
+/C6 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C7 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C8 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C9 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C11 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C12 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C13 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C14 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc } bind def
+/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath } bind def
+/Square { dup Rec } bind def
+/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
+/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
+/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
+/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
+/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill
+ Bsquare } bind def
+/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
+/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare } bind def
+/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare } bind def
+/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
+/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare } bind def
+/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
+/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
+/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
+/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
+/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
+/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
+/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
+/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
+/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
+/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
+/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
+/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
+/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
+/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
+/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
+/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
+/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
+/DiaE { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke } def
+/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke } def
+/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke } def
+/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke } def
+/PentE { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore } def
+/CircE { stroke [] 0 setdash
+ hpt 0 360 arc stroke } def
+/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def
+/DiaW { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke } def
+/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke } def
+/TriUW { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke } def
+/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke } def
+/PentW { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore } def
+/CircW { stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke } def
+/BoxFill { gsave Rec 1 setgray fill grestore } def
+/BoxColFill {
+ gsave Rec
+ /Fillden exch def
+ currentrgbcolor
+ /ColB exch def /ColG exch def /ColR exch def
+ /ColR ColR Fillden mul Fillden sub 1 add def
+ /ColG ColG Fillden mul Fillden sub 1 add def
+ /ColB ColB Fillden mul Fillden sub 1 add def
+ ColR ColG ColB setrgbcolor
+ fill grestore } def
+%
+% PostScript Level 1 Pattern Fill routine
+% Usage: x y w h s a XX PatternFill
+% x,y = lower left corner of box to be filled
+% w,h = width and height of box
+% a = angle in degrees between lines and x-axis
+% XX = 0/1 for no/yes cross-hatch
+%
+/PatternFill { gsave /PFa [ 9 2 roll ] def
+ PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
+ PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
+ gsave 1 setgray fill grestore clip
+ currentlinewidth 0.5 mul setlinewidth
+ /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
+ 0 0 M PFa 5 get rotate PFs -2 div dup translate
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 M 0 PFs V } for
+ 0 PFa 6 get ne {
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 2 1 roll M PFs 0 V } for
+ } if
+ stroke grestore } def
+%
+/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
+dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
+currentdict end definefont pop
+end
+%%EndProlog
+gnudict begin
+gsave
+0 0 translate
+0.100 0.100 scale
+0 setgray
+newpath
+0.500 UL
+LTb
+481 331 M
+-31 0 V
+0.500 UL
+LTb
+481 1204 M
+-31 0 V
+0.500 UL
+LTb
+481 2076 M
+-31 0 V
+0.500 UL
+LTb
+481 331 M
+0 -31 V
+0.500 UL
+LTb
+1075 331 M
+0 -31 V
+0.500 UL
+LTb
+1669 331 M
+0 -31 V
+0.500 UL
+LTb
+2262 331 M
+0 -31 V
+0.500 UL
+LTb
+2856 331 M
+0 -31 V
+0.500 UL
+LTb
+3450 331 M
+0 -31 V
+0.500 UL
+LTb
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+LTb
+LTb
+LTb
+1.000 UP
+1.000 UL
+LT0
+LTb
+LT0
+3087 1963 M
+263 0 V
+481 2076 M
+10 -29 V
+10 -28 V
+10 -28 V
+10 -28 V
+10 -27 V
+10 -27 V
+10 -26 V
+9 -26 V
+10 -25 V
+10 -25 V
+10 -24 V
+10 -24 V
+10 -24 V
+10 -23 V
+10 -23 V
+10 -23 V
+10 -22 V
+10 -22 V
+10 -21 V
+10 -21 V
+10 -21 V
+9 -20 V
+10 -20 V
+10 -20 V
+10 -19 V
+10 -19 V
+10 -19 V
+10 -18 V
+10 -19 V
+10 -17 V
+10 -18 V
+10 -17 V
+10 -17 V
+10 -17 V
+10 -16 V
+9 -16 V
+10 -16 V
+10 -16 V
+10 -15 V
+10 -15 V
+10 -15 V
+10 -14 V
+10 -15 V
+10 -14 V
+10 -14 V
+10 -13 V
+10 -14 V
+10 -13 V
+10 -13 V
+9 -13 V
+10 -12 V
+10 -13 V
+10 -12 V
+10 -12 V
+10 -11 V
+10 -12 V
+10 -11 V
+10 -11 V
+10 -11 V
+10 -11 V
+10 -11 V
+10 -10 V
+10 -10 V
+10 -11 V
+9 -10 V
+10 -9 V
+10 -10 V
+10 -9 V
+10 -10 V
+10 -9 V
+10 -9 V
+10 -9 V
+10 -8 V
+10 -9 V
+10 -8 V
+10 -8 V
+10 -9 V
+10 -7 V
+9 -8 V
+10 -8 V
+10 -8 V
+10 -7 V
+10 -7 V
+10 -8 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -6 V
+10 -7 V
+10 -7 V
+10 -6 V
+10 -6 V
+9 -7 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -5 V
+10 -6 V
+10 -6 V
+10 -5 V
+10 -6 V
+10 -5 V
+stroke
+1494 648 M
+10 -5 V
+10 -5 V
+10 -6 V
+10 -5 V
+9 -4 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+9 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+9 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+9 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+9 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+9 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+stroke
+2527 387 M
+9 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+9 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+9 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+9 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+9 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+9 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 0 V
+10 -1 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 0 V
+1.000 UL
+LT1
+LTb
+LT1
+3087 1863 M
+263 0 V
+481 331 M
+10 29 V
+10 27 V
+10 27 V
+10 26 V
+10 25 V
+10 24 V
+10 24 V
+9 22 V
+10 22 V
+10 21 V
+10 20 V
+10 20 V
+10 18 V
+10 18 V
+10 18 V
+10 16 V
+10 16 V
+10 16 V
+10 15 V
+10 14 V
+10 13 V
+9 13 V
+10 13 V
+10 12 V
+10 11 V
+10 11 V
+10 11 V
+10 10 V
+10 9 V
+10 9 V
+10 9 V
+10 8 V
+10 8 V
+10 7 V
+10 7 V
+9 6 V
+10 7 V
+10 5 V
+10 6 V
+10 5 V
+10 5 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 3 V
+10 3 V
+10 3 V
+10 2 V
+9 2 V
+10 2 V
+10 2 V
+10 1 V
+10 2 V
+10 1 V
+10 1 V
+10 0 V
+10 1 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 -1 V
+10 -1 V
+9 0 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+9 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -4 V
+9 -3 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -4 V
+10 -3 V
+stroke
+1494 872 M
+10 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+9 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+9 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+9 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+9 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+9 -4 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+9 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+9 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+stroke
+2527 523 M
+9 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+9 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+9 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+9 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+9 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+1.000 UL
+LT2
+LTb
+LT2
+3087 1763 M
+263 0 V
+481 331 M
+10 0 V
+10 1 V
+10 1 V
+10 2 V
+10 2 V
+10 2 V
+10 3 V
+9 3 V
+10 3 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 5 V
+10 5 V
+10 5 V
+10 5 V
+10 6 V
+10 5 V
+10 6 V
+10 6 V
+9 6 V
+10 6 V
+10 6 V
+10 6 V
+10 7 V
+10 6 V
+10 7 V
+10 6 V
+10 7 V
+10 7 V
+10 6 V
+10 7 V
+10 7 V
+10 6 V
+9 7 V
+10 7 V
+10 7 V
+10 6 V
+10 7 V
+10 7 V
+10 6 V
+10 7 V
+10 6 V
+10 7 V
+10 6 V
+10 7 V
+10 6 V
+10 6 V
+9 6 V
+10 6 V
+10 7 V
+10 5 V
+10 6 V
+10 6 V
+10 6 V
+10 6 V
+10 5 V
+10 6 V
+10 5 V
+10 5 V
+10 6 V
+10 5 V
+10 5 V
+9 5 V
+10 4 V
+10 5 V
+10 5 V
+10 4 V
+10 5 V
+10 4 V
+10 4 V
+10 5 V
+10 4 V
+10 4 V
+10 3 V
+10 4 V
+10 4 V
+9 3 V
+10 4 V
+10 3 V
+10 3 V
+10 4 V
+10 3 V
+10 2 V
+10 3 V
+10 3 V
+10 3 V
+10 2 V
+10 3 V
+10 2 V
+10 2 V
+9 3 V
+10 2 V
+10 2 V
+10 2 V
+10 1 V
+10 2 V
+10 2 V
+10 1 V
+10 2 V
+10 1 V
+stroke
+1494 792 M
+10 1 V
+10 2 V
+10 1 V
+10 1 V
+9 1 V
+10 1 V
+10 0 V
+10 1 V
+10 1 V
+10 0 V
+10 1 V
+10 0 V
+10 1 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+9 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+9 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+9 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+9 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -3 V
+stroke
+2527 661 M
+9 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+9 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+9 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+9 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+9 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+9 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+9 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+1.000 UP
+stroke
+grestore
+end
+showpage
+}}%
+\put(3037,1763){\rjust{$n=3$}}%
+\put(3037,1863){\rjust{$n=2$}}%
+\put(3037,1963){\rjust{$n=1$}}%
+\put(1965,2226){\cjust{Erlang Distribution}}%
+\put(1965,50){\cjust{$x$}}%
+\put(100,1203){%
+\special{ps: gsave currentpoint currentpoint translate
+270 rotate neg exch neg exch translate}%
+\cstack{$p(x)$}%
+\special{ps: currentpoint grestore moveto}%
+}%
+\put(3450,200){\cjust{ 5}}%
+\put(2856,200){\cjust{ 4}}%
+\put(2262,200){\cjust{ 3}}%
+\put(1669,200){\cjust{ 2}}%
+\put(1075,200){\cjust{ 1}}%
+\put(481,200){\cjust{ 0}}%
+\put(400,2076){\rjust{ 1}}%
+\put(400,1204){\rjust{ 0.5}}%
+\put(400,331){\rjust{ 0}}%
+\endGNUPLOTpicture
+\endgroup
+\endinput
diff --git a/gsl-1.9/doc/rand-exponential.tex b/gsl-1.9/doc/rand-exponential.tex
new file mode 100644
index 0000000..18ebc42
--- /dev/null
+++ b/gsl-1.9/doc/rand-exponential.tex
@@ -0,0 +1,1009 @@
+% GNUPLOT: plain TeX with Postscript
+\begingroup
+ \catcode`\@=11\relax
+ \def\GNUPLOTspecial{%
+ \def\do##1{\catcode`##1=12\relax}\dospecials
+ \catcode`\{=1\catcode`\}=2\catcode\%=14\relax\special}%
+%
+\expandafter\ifx\csname GNUPLOTpicture\endcsname\relax
+ \csname newdimen\endcsname\GNUPLOTunit
+ \gdef\GNUPLOTpicture(#1,#2){\vbox to#2\GNUPLOTunit\bgroup
+ \def\put(##1,##2)##3{\unskip\raise##2\GNUPLOTunit
+ \hbox to0pt{\kern##1\GNUPLOTunit ##3\hss}\ignorespaces}%
+ \def\ljust##1{\vbox to0pt{\vss\hbox to0pt{##1\hss}\vss}}%
+ \def\cjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1\hss}\vss}}%
+ \def\rjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1}\vss}}%
+ \def\stack##1{\let\\=\cr\tabskip=0pt\halign{\hfil ####\hfil\cr ##1\crcr}}%
+ \def\lstack##1{\hbox to0pt{\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\cstack##1{\hbox to0pt{\hss\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\rstack##1{\hbox to0pt{\vbox to0pt{\stack{##1}\vss}\hss}}%
+ \vss\hbox to#1\GNUPLOTunit\bgroup\ignorespaces}%
+ \gdef\endGNUPLOTpicture{\hss\egroup\egroup}%
+\fi
+\GNUPLOTunit=0.1bp
+\GNUPLOTpicture(3600,2376)
+{\GNUPLOTspecial{"
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: rand-exponential.tex
+%%Creator: gnuplot 4.0 patchlevel 0
+%%CreationDate: Wed Aug 31 12:38:29 2005
+%%DocumentFonts:
+%%BoundingBox: 0 0 360 237
+%%Orientation: Landscape
+%%EndComments
+/gnudict 256 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+/vshift -33 def
+/dl {10.0 mul} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+/Rounded false def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/N {newpath moveto} bind def
+/C {setrgbcolor} bind def
+/f {rlineto fill} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke userlinewidth 2 mul setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/AL { stroke userlinewidth 2 div setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/UL { dup gnulinewidth mul /userlinewidth exch def
+ dup 1 lt {pop 1} if 10 mul /udl exch def } def
+/PL { stroke userlinewidth setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/LTw { PL [] 1 setgray } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 1 0 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
+/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/Pnt { stroke [] 0 setdash
+ gsave 1 setlinecap M 0 0 V stroke grestore } def
+/Dia { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt } def
+/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt } def
+/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt } def
+/Star { 2 copy Pls Crs } def
+/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill } def
+/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill } def
+/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt } def
+/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill } def
+/Pent { stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt } def
+/PentF { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore } def
+/Circle { stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt } def
+/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
+/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def
+/C1 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C2 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C3 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C4 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C5 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc } bind def
+/C6 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C7 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C8 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C9 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C11 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C12 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C13 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C14 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc } bind def
+/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath } bind def
+/Square { dup Rec } bind def
+/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
+/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
+/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
+/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
+/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill
+ Bsquare } bind def
+/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
+/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare } bind def
+/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare } bind def
+/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
+/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare } bind def
+/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
+/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
+/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
+/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
+/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
+/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
+/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
+/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
+/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
+/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
+/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
+/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
+/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
+/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
+/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
+/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
+/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
+/DiaE { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke } def
+/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke } def
+/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke } def
+/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke } def
+/PentE { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore } def
+/CircE { stroke [] 0 setdash
+ hpt 0 360 arc stroke } def
+/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def
+/DiaW { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke } def
+/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke } def
+/TriUW { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke } def
+/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke } def
+/PentW { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore } def
+/CircW { stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke } def
+/BoxFill { gsave Rec 1 setgray fill grestore } def
+/BoxColFill {
+ gsave Rec
+ /Fillden exch def
+ currentrgbcolor
+ /ColB exch def /ColG exch def /ColR exch def
+ /ColR ColR Fillden mul Fillden sub 1 add def
+ /ColG ColG Fillden mul Fillden sub 1 add def
+ /ColB ColB Fillden mul Fillden sub 1 add def
+ ColR ColG ColB setrgbcolor
+ fill grestore } def
+%
+% PostScript Level 1 Pattern Fill routine
+% Usage: x y w h s a XX PatternFill
+% x,y = lower left corner of box to be filled
+% w,h = width and height of box
+% a = angle in degrees between lines and x-axis
+% XX = 0/1 for no/yes cross-hatch
+%
+/PatternFill { gsave /PFa [ 9 2 roll ] def
+ PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
+ PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
+ gsave 1 setgray fill grestore clip
+ currentlinewidth 0.5 mul setlinewidth
+ /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
+ 0 0 M PFa 5 get rotate PFs -2 div dup translate
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 M 0 PFs V } for
+ 0 PFa 6 get ne {
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 2 1 roll M PFs 0 V } for
+ } if
+ stroke grestore } def
+%
+/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
+dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
+currentdict end definefont pop
+end
+%%EndProlog
+gnudict begin
+gsave
+0 0 translate
+0.100 0.100 scale
+0 setgray
+newpath
+0.500 UL
+LTb
+481 331 M
+-31 0 V
+0.500 UL
+LTb
+481 1204 M
+-31 0 V
+0.500 UL
+LTb
+481 2076 M
+-31 0 V
+0.500 UL
+LTb
+481 331 M
+0 -31 V
+0.500 UL
+LTb
+1471 331 M
+0 -31 V
+0.500 UL
+LTb
+2460 331 M
+0 -31 V
+0.500 UL
+LTb
+3450 331 M
+0 -31 V
+0.500 UL
+LTb
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+LTb
+LTb
+LTb
+1.000 UP
+1.000 UL
+LT0
+LTb
+LT0
+3087 1963 M
+263 0 V
+481 2076 M
+10 -17 V
+10 -18 V
+10 -17 V
+10 -17 V
+10 -16 V
+10 -17 V
+10 -16 V
+9 -17 V
+10 -16 V
+10 -16 V
+10 -15 V
+10 -16 V
+10 -15 V
+10 -16 V
+10 -15 V
+10 -15 V
+10 -15 V
+10 -14 V
+10 -15 V
+10 -14 V
+10 -15 V
+9 -14 V
+10 -14 V
+10 -13 V
+10 -14 V
+10 -14 V
+10 -13 V
+10 -13 V
+10 -14 V
+10 -13 V
+10 -12 V
+10 -13 V
+10 -13 V
+10 -12 V
+10 -13 V
+9 -12 V
+10 -12 V
+10 -12 V
+10 -12 V
+10 -12 V
+10 -12 V
+10 -11 V
+10 -11 V
+10 -12 V
+10 -11 V
+10 -11 V
+10 -11 V
+10 -11 V
+10 -11 V
+9 -10 V
+10 -11 V
+10 -10 V
+10 -11 V
+10 -10 V
+10 -10 V
+10 -10 V
+10 -10 V
+10 -10 V
+10 -10 V
+10 -9 V
+10 -10 V
+10 -9 V
+10 -10 V
+10 -9 V
+9 -9 V
+10 -9 V
+10 -9 V
+10 -9 V
+10 -9 V
+10 -8 V
+10 -9 V
+10 -9 V
+10 -8 V
+10 -8 V
+10 -9 V
+10 -8 V
+10 -8 V
+10 -8 V
+9 -8 V
+10 -8 V
+10 -8 V
+10 -8 V
+10 -7 V
+10 -8 V
+10 -7 V
+10 -8 V
+10 -7 V
+10 -7 V
+10 -8 V
+10 -7 V
+10 -7 V
+10 -7 V
+9 -7 V
+10 -6 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -6 V
+10 -7 V
+10 -6 V
+10 -7 V
+10 -6 V
+stroke
+1494 958 M
+10 -6 V
+10 -6 V
+10 -6 V
+10 -7 V
+9 -6 V
+10 -6 V
+10 -5 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -5 V
+10 -6 V
+10 -6 V
+10 -5 V
+10 -6 V
+10 -5 V
+10 -5 V
+10 -6 V
+10 -5 V
+9 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+9 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+9 -4 V
+10 -3 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+9 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+9 -2 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+9 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+stroke
+2527 552 M
+9 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+9 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+9 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+9 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+9 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+1.000 UL
+LT1
+LTb
+LT1
+3087 1863 M
+263 0 V
+481 1204 M
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -5 V
+9 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+9 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+9 -4 V
+10 -3 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+9 -3 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -3 V
+9 -3 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+9 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+9 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+stroke
+1494 854 M
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+9 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+9 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+9 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+9 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+9 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+9 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+9 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+stroke
+2527 641 M
+9 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+9 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+9 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+9 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+1.000 UP
+stroke
+grestore
+end
+showpage
+}}%
+\put(3037,1863){\rjust{$\mu=2$}}%
+\put(3037,1963){\rjust{$\mu=1$}}%
+\put(1965,2226){\cjust{Exponential Distribution}}%
+\put(1965,50){\cjust{$x$}}%
+\put(100,1203){%
+\special{ps: gsave currentpoint currentpoint translate
+270 rotate neg exch neg exch translate}%
+\cstack{$p(x)$}%
+\special{ps: currentpoint grestore moveto}%
+}%
+\put(3450,200){\cjust{ 3}}%
+\put(2460,200){\cjust{ 2}}%
+\put(1471,200){\cjust{ 1}}%
+\put(481,200){\cjust{ 0}}%
+\put(400,2076){\rjust{ 1}}%
+\put(400,1204){\rjust{ 0.5}}%
+\put(400,331){\rjust{ 0}}%
+\endGNUPLOTpicture
+\endgroup
+\endinput
diff --git a/gsl-1.9/doc/rand-exppow.tex b/gsl-1.9/doc/rand-exppow.tex
new file mode 100644
index 0000000..2f0bc76
--- /dev/null
+++ b/gsl-1.9/doc/rand-exppow.tex
@@ -0,0 +1,1054 @@
+% GNUPLOT: plain TeX with Postscript
+\begingroup
+ \catcode`\@=11\relax
+ \def\GNUPLOTspecial{%
+ \def\do##1{\catcode`##1=12\relax}\dospecials
+ \catcode`\{=1\catcode`\}=2\catcode\%=14\relax\special}%
+%
+\expandafter\ifx\csname GNUPLOTpicture\endcsname\relax
+ \csname newdimen\endcsname\GNUPLOTunit
+ \gdef\GNUPLOTpicture(#1,#2){\vbox to#2\GNUPLOTunit\bgroup
+ \def\put(##1,##2)##3{\unskip\raise##2\GNUPLOTunit
+ \hbox to0pt{\kern##1\GNUPLOTunit ##3\hss}\ignorespaces}%
+ \def\ljust##1{\vbox to0pt{\vss\hbox to0pt{##1\hss}\vss}}%
+ \def\cjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1\hss}\vss}}%
+ \def\rjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1}\vss}}%
+ \def\stack##1{\let\\=\cr\tabskip=0pt\halign{\hfil ####\hfil\cr ##1\crcr}}%
+ \def\lstack##1{\hbox to0pt{\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\cstack##1{\hbox to0pt{\hss\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\rstack##1{\hbox to0pt{\vbox to0pt{\stack{##1}\vss}\hss}}%
+ \vss\hbox to#1\GNUPLOTunit\bgroup\ignorespaces}%
+ \gdef\endGNUPLOTpicture{\hss\egroup\egroup}%
+\fi
+\GNUPLOTunit=0.1bp
+\GNUPLOTpicture(3600,2376)
+{\GNUPLOTspecial{"
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: rand-exppow.tex
+%%Creator: gnuplot 4.0 patchlevel 0
+%%CreationDate: Wed Aug 31 12:38:29 2005
+%%DocumentFonts:
+%%BoundingBox: 0 0 360 237
+%%Orientation: Landscape
+%%EndComments
+/gnudict 256 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+/vshift -33 def
+/dl {10.0 mul} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+/Rounded false def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/N {newpath moveto} bind def
+/C {setrgbcolor} bind def
+/f {rlineto fill} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke userlinewidth 2 mul setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/AL { stroke userlinewidth 2 div setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/UL { dup gnulinewidth mul /userlinewidth exch def
+ dup 1 lt {pop 1} if 10 mul /udl exch def } def
+/PL { stroke userlinewidth setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/LTw { PL [] 1 setgray } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 1 0 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
+/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/Pnt { stroke [] 0 setdash
+ gsave 1 setlinecap M 0 0 V stroke grestore } def
+/Dia { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt } def
+/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt } def
+/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt } def
+/Star { 2 copy Pls Crs } def
+/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill } def
+/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill } def
+/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt } def
+/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill } def
+/Pent { stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt } def
+/PentF { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore } def
+/Circle { stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt } def
+/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
+/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def
+/C1 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C2 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C3 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C4 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C5 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc } bind def
+/C6 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C7 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C8 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C9 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C11 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C12 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C13 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C14 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc } bind def
+/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath } bind def
+/Square { dup Rec } bind def
+/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
+/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
+/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
+/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
+/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill
+ Bsquare } bind def
+/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
+/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare } bind def
+/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare } bind def
+/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
+/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare } bind def
+/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
+/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
+/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
+/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
+/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
+/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
+/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
+/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
+/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
+/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
+/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
+/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
+/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
+/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
+/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
+/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
+/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
+/DiaE { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke } def
+/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke } def
+/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke } def
+/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke } def
+/PentE { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore } def
+/CircE { stroke [] 0 setdash
+ hpt 0 360 arc stroke } def
+/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def
+/DiaW { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke } def
+/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke } def
+/TriUW { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke } def
+/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke } def
+/PentW { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore } def
+/CircW { stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke } def
+/BoxFill { gsave Rec 1 setgray fill grestore } def
+/BoxColFill {
+ gsave Rec
+ /Fillden exch def
+ currentrgbcolor
+ /ColB exch def /ColG exch def /ColR exch def
+ /ColR ColR Fillden mul Fillden sub 1 add def
+ /ColG ColG Fillden mul Fillden sub 1 add def
+ /ColB ColB Fillden mul Fillden sub 1 add def
+ ColR ColG ColB setrgbcolor
+ fill grestore } def
+%
+% PostScript Level 1 Pattern Fill routine
+% Usage: x y w h s a XX PatternFill
+% x,y = lower left corner of box to be filled
+% w,h = width and height of box
+% a = angle in degrees between lines and x-axis
+% XX = 0/1 for no/yes cross-hatch
+%
+/PatternFill { gsave /PFa [ 9 2 roll ] def
+ PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
+ PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
+ gsave 1 setgray fill grestore clip
+ currentlinewidth 0.5 mul setlinewidth
+ /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
+ 0 0 M PFa 5 get rotate PFs -2 div dup translate
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 M 0 PFs V } for
+ 0 PFa 6 get ne {
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 2 1 roll M PFs 0 V } for
+ } if
+ stroke grestore } def
+%
+/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
+dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
+currentdict end definefont pop
+end
+%%EndProlog
+gnudict begin
+gsave
+0 0 translate
+0.100 0.100 scale
+0 setgray
+newpath
+0.500 UL
+LTb
+481 331 M
+-31 0 V
+0.500 UL
+LTb
+481 767 M
+-31 0 V
+0.500 UL
+LTb
+481 1204 M
+-31 0 V
+0.500 UL
+LTb
+481 1640 M
+-31 0 V
+0.500 UL
+LTb
+481 2076 M
+-31 0 V
+0.500 UL
+LTb
+481 331 M
+0 -31 V
+0.500 UL
+LTb
+778 331 M
+0 -31 V
+0.500 UL
+LTb
+1075 331 M
+0 -31 V
+0.500 UL
+LTb
+1372 331 M
+0 -31 V
+0.500 UL
+LTb
+1669 331 M
+0 -31 V
+0.500 UL
+LTb
+1965 331 M
+0 -31 V
+0.500 UL
+LTb
+2262 331 M
+0 -31 V
+0.500 UL
+LTb
+2559 331 M
+0 -31 V
+0.500 UL
+LTb
+2856 331 M
+0 -31 V
+0.500 UL
+LTb
+3153 331 M
+0 -31 V
+0.500 UL
+LTb
+3450 331 M
+0 -31 V
+0.500 UL
+LTb
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+LTb
+LTb
+LTb
+1.000 UP
+1.000 UL
+LT0
+LTb
+LT0
+3087 1963 M
+263 0 V
+481 331 M
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 1 V
+10 0 V
+10 0 V
+10 0 V
+10 1 V
+10 0 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+9 2 V
+10 2 V
+10 3 V
+10 3 V
+10 4 V
+10 4 V
+10 5 V
+10 6 V
+10 7 V
+10 8 V
+stroke
+1494 382 M
+10 9 V
+10 11 V
+10 11 V
+10 14 V
+9 15 V
+10 16 V
+10 18 V
+10 20 V
+10 22 V
+10 24 V
+10 26 V
+10 28 V
+10 29 V
+10 32 V
+10 33 V
+10 34 V
+10 37 V
+10 37 V
+10 39 V
+9 40 V
+10 41 V
+10 41 V
+10 41 V
+10 42 V
+10 41 V
+10 41 V
+10 40 V
+10 39 V
+10 38 V
+10 36 V
+10 34 V
+10 33 V
+10 31 V
+9 28 V
+10 26 V
+10 23 V
+10 22 V
+10 18 V
+10 16 V
+10 14 V
+10 11 V
+10 9 V
+10 7 V
+10 5 V
+10 4 V
+10 2 V
+10 0 V
+9 0 V
+10 0 V
+10 -2 V
+10 -4 V
+10 -5 V
+10 -7 V
+10 -9 V
+10 -11 V
+10 -14 V
+10 -16 V
+10 -18 V
+10 -22 V
+10 -23 V
+10 -26 V
+9 -28 V
+10 -31 V
+10 -33 V
+10 -34 V
+10 -36 V
+10 -38 V
+10 -39 V
+10 -40 V
+10 -41 V
+10 -41 V
+10 -42 V
+10 -41 V
+10 -41 V
+10 -41 V
+9 -40 V
+10 -39 V
+10 -37 V
+10 -37 V
+10 -34 V
+10 -33 V
+10 -32 V
+10 -29 V
+10 -28 V
+10 -26 V
+10 -24 V
+10 -22 V
+10 -20 V
+10 -18 V
+10 -16 V
+9 -15 V
+10 -14 V
+10 -11 V
+10 -11 V
+10 -9 V
+10 -8 V
+10 -7 V
+10 -6 V
+10 -5 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -2 V
+stroke
+2527 340 M
+9 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+1.000 UL
+LT1
+LTb
+LT1
+3087 1863 M
+263 0 V
+481 389 M
+10 1 V
+10 0 V
+10 1 V
+10 0 V
+10 1 V
+10 0 V
+10 0 V
+9 1 V
+10 0 V
+10 1 V
+10 0 V
+10 1 V
+10 0 V
+10 1 V
+10 0 V
+10 1 V
+10 0 V
+10 1 V
+10 1 V
+10 0 V
+10 1 V
+9 0 V
+10 1 V
+10 0 V
+10 1 V
+10 0 V
+10 1 V
+10 1 V
+10 0 V
+10 1 V
+10 0 V
+10 1 V
+10 1 V
+10 0 V
+10 1 V
+9 1 V
+10 0 V
+10 1 V
+10 1 V
+10 0 V
+10 1 V
+10 1 V
+10 1 V
+10 0 V
+10 1 V
+10 1 V
+10 1 V
+10 0 V
+10 1 V
+9 1 V
+10 1 V
+10 1 V
+10 0 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+9 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 2 V
+10 1 V
+10 1 V
+9 1 V
+10 2 V
+10 1 V
+10 1 V
+10 2 V
+10 1 V
+10 2 V
+10 1 V
+10 1 V
+10 2 V
+10 1 V
+10 2 V
+10 2 V
+10 1 V
+9 2 V
+10 2 V
+10 1 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+stroke
+1494 486 M
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+9 3 V
+10 2 V
+10 2 V
+10 3 V
+10 2 V
+10 3 V
+10 3 V
+10 2 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+10 4 V
+10 3 V
+10 3 V
+9 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 5 V
+10 4 V
+10 5 V
+10 5 V
+10 6 V
+10 5 V
+10 6 V
+10 7 V
+9 6 V
+10 8 V
+10 7 V
+10 8 V
+10 9 V
+10 10 V
+10 10 V
+10 12 V
+10 13 V
+10 15 V
+10 17 V
+10 21 V
+10 28 V
+10 43 V
+9 0 V
+10 -43 V
+10 -28 V
+10 -21 V
+10 -17 V
+10 -15 V
+10 -13 V
+10 -12 V
+10 -10 V
+10 -10 V
+10 -9 V
+10 -8 V
+10 -7 V
+10 -8 V
+9 -6 V
+10 -7 V
+10 -6 V
+10 -5 V
+10 -6 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+9 -4 V
+10 -3 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+9 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+stroke
+2527 469 M
+9 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+9 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+9 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+9 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+9 -1 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+1.000 UP
+stroke
+grestore
+end
+showpage
+}}%
+\put(3037,1863){\rjust{$a=1, b=0.5$}}%
+\put(3037,1963){\rjust{$a=1, b=2.5$}}%
+\put(1965,2226){\cjust{Exponential Power Distribution}}%
+\put(1965,50){\cjust{$x$}}%
+\put(100,1203){%
+\special{ps: gsave currentpoint currentpoint translate
+270 rotate neg exch neg exch translate}%
+\cstack{$p(x)$}%
+\special{ps: currentpoint grestore moveto}%
+}%
+\put(3450,200){\cjust{ 5}}%
+\put(3153,200){\cjust{ 4}}%
+\put(2856,200){\cjust{ 3}}%
+\put(2559,200){\cjust{ 2}}%
+\put(2262,200){\cjust{ 1}}%
+\put(1965,200){\cjust{ 0}}%
+\put(1669,200){\cjust{-1}}%
+\put(1372,200){\cjust{-2}}%
+\put(1075,200){\cjust{-3}}%
+\put(778,200){\cjust{-4}}%
+\put(481,200){\cjust{-5}}%
+\put(400,2076){\rjust{ 0.8}}%
+\put(400,1640){\rjust{ 0.6}}%
+\put(400,1204){\rjust{ 0.4}}%
+\put(400,767){\rjust{ 0.2}}%
+\put(400,331){\rjust{ 0}}%
+\endGNUPLOTpicture
+\endgroup
+\endinput
diff --git a/gsl-1.9/doc/rand-fdist.tex b/gsl-1.9/doc/rand-fdist.tex
new file mode 100644
index 0000000..4b6762a
--- /dev/null
+++ b/gsl-1.9/doc/rand-fdist.tex
@@ -0,0 +1,992 @@
+% GNUPLOT: plain TeX with Postscript
+\begingroup
+ \catcode`\@=11\relax
+ \def\GNUPLOTspecial{%
+ \def\do##1{\catcode`##1=12\relax}\dospecials
+ \catcode`\{=1\catcode`\}=2\catcode\%=14\relax\special}%
+%
+\expandafter\ifx\csname GNUPLOTpicture\endcsname\relax
+ \csname newdimen\endcsname\GNUPLOTunit
+ \gdef\GNUPLOTpicture(#1,#2){\vbox to#2\GNUPLOTunit\bgroup
+ \def\put(##1,##2)##3{\unskip\raise##2\GNUPLOTunit
+ \hbox to0pt{\kern##1\GNUPLOTunit ##3\hss}\ignorespaces}%
+ \def\ljust##1{\vbox to0pt{\vss\hbox to0pt{##1\hss}\vss}}%
+ \def\cjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1\hss}\vss}}%
+ \def\rjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1}\vss}}%
+ \def\stack##1{\let\\=\cr\tabskip=0pt\halign{\hfil ####\hfil\cr ##1\crcr}}%
+ \def\lstack##1{\hbox to0pt{\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\cstack##1{\hbox to0pt{\hss\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\rstack##1{\hbox to0pt{\vbox to0pt{\stack{##1}\vss}\hss}}%
+ \vss\hbox to#1\GNUPLOTunit\bgroup\ignorespaces}%
+ \gdef\endGNUPLOTpicture{\hss\egroup\egroup}%
+\fi
+\GNUPLOTunit=0.1bp
+\GNUPLOTpicture(3600,2376)
+{\GNUPLOTspecial{"
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: rand-fdist.tex
+%%Creator: gnuplot 4.0 patchlevel 0
+%%CreationDate: Wed Aug 31 12:38:29 2005
+%%DocumentFonts:
+%%BoundingBox: 0 0 360 237
+%%Orientation: Landscape
+%%EndComments
+/gnudict 256 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+/vshift -33 def
+/dl {10.0 mul} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+/Rounded false def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/N {newpath moveto} bind def
+/C {setrgbcolor} bind def
+/f {rlineto fill} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke userlinewidth 2 mul setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/AL { stroke userlinewidth 2 div setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/UL { dup gnulinewidth mul /userlinewidth exch def
+ dup 1 lt {pop 1} if 10 mul /udl exch def } def
+/PL { stroke userlinewidth setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/LTw { PL [] 1 setgray } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 1 0 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
+/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/Pnt { stroke [] 0 setdash
+ gsave 1 setlinecap M 0 0 V stroke grestore } def
+/Dia { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt } def
+/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt } def
+/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt } def
+/Star { 2 copy Pls Crs } def
+/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill } def
+/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill } def
+/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt } def
+/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill } def
+/Pent { stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt } def
+/PentF { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore } def
+/Circle { stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt } def
+/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
+/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def
+/C1 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C2 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C3 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C4 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C5 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc } bind def
+/C6 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C7 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C8 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C9 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C11 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C12 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C13 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C14 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc } bind def
+/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath } bind def
+/Square { dup Rec } bind def
+/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
+/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
+/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
+/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
+/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill
+ Bsquare } bind def
+/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
+/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare } bind def
+/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare } bind def
+/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
+/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare } bind def
+/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
+/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
+/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
+/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
+/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
+/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
+/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
+/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
+/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
+/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
+/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
+/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
+/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
+/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
+/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
+/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
+/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
+/DiaE { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke } def
+/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke } def
+/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke } def
+/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke } def
+/PentE { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore } def
+/CircE { stroke [] 0 setdash
+ hpt 0 360 arc stroke } def
+/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def
+/DiaW { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke } def
+/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke } def
+/TriUW { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke } def
+/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke } def
+/PentW { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore } def
+/CircW { stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke } def
+/BoxFill { gsave Rec 1 setgray fill grestore } def
+/BoxColFill {
+ gsave Rec
+ /Fillden exch def
+ currentrgbcolor
+ /ColB exch def /ColG exch def /ColR exch def
+ /ColR ColR Fillden mul Fillden sub 1 add def
+ /ColG ColG Fillden mul Fillden sub 1 add def
+ /ColB ColB Fillden mul Fillden sub 1 add def
+ ColR ColG ColB setrgbcolor
+ fill grestore } def
+%
+% PostScript Level 1 Pattern Fill routine
+% Usage: x y w h s a XX PatternFill
+% x,y = lower left corner of box to be filled
+% w,h = width and height of box
+% a = angle in degrees between lines and x-axis
+% XX = 0/1 for no/yes cross-hatch
+%
+/PatternFill { gsave /PFa [ 9 2 roll ] def
+ PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
+ PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
+ gsave 1 setgray fill grestore clip
+ currentlinewidth 0.5 mul setlinewidth
+ /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
+ 0 0 M PFa 5 get rotate PFs -2 div dup translate
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 M 0 PFs V } for
+ 0 PFa 6 get ne {
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 2 1 roll M PFs 0 V } for
+ } if
+ stroke grestore } def
+%
+/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
+dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
+currentdict end definefont pop
+end
+%%EndProlog
+gnudict begin
+gsave
+0 0 translate
+0.100 0.100 scale
+0 setgray
+newpath
+0.500 UL
+LTb
+481 331 M
+-31 0 V
+0.500 UL
+LTb
+481 1204 M
+-31 0 V
+0.500 UL
+LTb
+481 2076 M
+-31 0 V
+0.500 UL
+LTb
+481 331 M
+0 -31 V
+0.500 UL
+LTb
+1966 331 M
+0 -31 V
+0.500 UL
+LTb
+3450 331 M
+0 -31 V
+0.500 UL
+LTb
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+LTb
+LTb
+LTb
+1.000 UP
+1.000 UL
+LT0
+LTb
+LT0
+3087 1963 M
+263 0 V
+609 2076 M
+1 -12 V
+10 -73 V
+10 -66 V
+10 -60 V
+10 -55 V
+10 -50 V
+10 -47 V
+10 -43 V
+10 -40 V
+9 -37 V
+10 -35 V
+10 -32 V
+10 -31 V
+10 -29 V
+10 -28 V
+10 -26 V
+10 -25 V
+10 -23 V
+10 -23 V
+10 -21 V
+10 -21 V
+10 -19 V
+10 -19 V
+9 -18 V
+10 -17 V
+10 -17 V
+10 -15 V
+10 -16 V
+10 -15 V
+10 -14 V
+10 -14 V
+10 -13 V
+10 -13 V
+10 -12 V
+10 -12 V
+10 -12 V
+10 -11 V
+9 -11 V
+10 -11 V
+10 -10 V
+10 -10 V
+10 -10 V
+10 -10 V
+10 -9 V
+10 -9 V
+10 -8 V
+10 -9 V
+10 -8 V
+10 -8 V
+10 -8 V
+10 -8 V
+10 -8 V
+9 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -6 V
+10 -7 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -5 V
+10 -6 V
+9 -5 V
+10 -5 V
+10 -6 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+10 -5 V
+9 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+9 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+stroke
+1613 692 M
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+9 -2 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+9 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+9 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+9 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+9 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+9 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+stroke
+2646 518 M
+10 -1 V
+10 -1 V
+9 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+9 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+9 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+9 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+9 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+9 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+1.000 UL
+LT1
+LTb
+LT1
+3087 1863 M
+263 0 V
+481 331 M
+10 454 V
+10 163 V
+10 110 V
+10 82 V
+10 63 V
+10 49 V
+10 39 V
+9 31 V
+10 25 V
+10 20 V
+10 15 V
+10 11 V
+10 9 V
+10 6 V
+10 3 V
+10 2 V
+10 0 V
+10 -1 V
+10 -2 V
+10 -4 V
+10 -4 V
+9 -5 V
+10 -6 V
+10 -6 V
+10 -7 V
+10 -7 V
+10 -8 V
+10 -8 V
+10 -8 V
+10 -8 V
+10 -9 V
+10 -9 V
+10 -8 V
+10 -9 V
+10 -9 V
+9 -9 V
+10 -9 V
+10 -9 V
+10 -9 V
+10 -9 V
+10 -9 V
+10 -9 V
+10 -9 V
+10 -9 V
+10 -8 V
+10 -9 V
+10 -9 V
+10 -8 V
+10 -9 V
+9 -8 V
+10 -9 V
+10 -8 V
+10 -8 V
+10 -8 V
+10 -8 V
+10 -8 V
+10 -7 V
+10 -8 V
+10 -8 V
+10 -7 V
+10 -8 V
+10 -7 V
+10 -7 V
+10 -7 V
+9 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -6 V
+10 -7 V
+10 -6 V
+10 -7 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -7 V
+10 -5 V
+10 -6 V
+9 -6 V
+10 -6 V
+10 -6 V
+10 -5 V
+10 -6 V
+10 -5 V
+10 -5 V
+10 -6 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+9 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+stroke
+1494 845 M
+10 -5 V
+10 -4 V
+10 -4 V
+10 -4 V
+9 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+9 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+9 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+9 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+9 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+9 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+9 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+stroke
+2527 588 M
+9 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+9 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+9 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+9 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+9 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+1.000 UP
+stroke
+grestore
+end
+showpage
+}}%
+\put(3037,1863){\rjust{$\nu_1=3, \nu_2=2$}}%
+\put(3037,1963){\rjust{$\nu_1=1, \nu_2=1$}}%
+\put(1965,2226){\cjust{F-Distribution}}%
+\put(1965,50){\cjust{$x$}}%
+\put(100,1203){%
+\special{ps: gsave currentpoint currentpoint translate
+270 rotate neg exch neg exch translate}%
+\cstack{$p(x)$}%
+\special{ps: currentpoint grestore moveto}%
+}%
+\put(3450,200){\cjust{ 2}}%
+\put(1966,200){\cjust{ 1}}%
+\put(481,200){\cjust{ 0}}%
+\put(400,2076){\rjust{ 1}}%
+\put(400,1204){\rjust{ 0.5}}%
+\put(400,331){\rjust{ 0}}%
+\endGNUPLOTpicture
+\endgroup
+\endinput
diff --git a/gsl-1.9/doc/rand-flat.tex b/gsl-1.9/doc/rand-flat.tex
new file mode 100644
index 0000000..6979fc1
--- /dev/null
+++ b/gsl-1.9/doc/rand-flat.tex
@@ -0,0 +1,1023 @@
+% GNUPLOT: plain TeX with Postscript
+\begingroup
+ \catcode`\@=11\relax
+ \def\GNUPLOTspecial{%
+ \def\do##1{\catcode`##1=12\relax}\dospecials
+ \catcode`\{=1\catcode`\}=2\catcode\%=14\relax\special}%
+%
+\expandafter\ifx\csname GNUPLOTpicture\endcsname\relax
+ \csname newdimen\endcsname\GNUPLOTunit
+ \gdef\GNUPLOTpicture(#1,#2){\vbox to#2\GNUPLOTunit\bgroup
+ \def\put(##1,##2)##3{\unskip\raise##2\GNUPLOTunit
+ \hbox to0pt{\kern##1\GNUPLOTunit ##3\hss}\ignorespaces}%
+ \def\ljust##1{\vbox to0pt{\vss\hbox to0pt{##1\hss}\vss}}%
+ \def\cjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1\hss}\vss}}%
+ \def\rjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1}\vss}}%
+ \def\stack##1{\let\\=\cr\tabskip=0pt\halign{\hfil ####\hfil\cr ##1\crcr}}%
+ \def\lstack##1{\hbox to0pt{\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\cstack##1{\hbox to0pt{\hss\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\rstack##1{\hbox to0pt{\vbox to0pt{\stack{##1}\vss}\hss}}%
+ \vss\hbox to#1\GNUPLOTunit\bgroup\ignorespaces}%
+ \gdef\endGNUPLOTpicture{\hss\egroup\egroup}%
+\fi
+\GNUPLOTunit=0.1bp
+\GNUPLOTpicture(3600,2376)
+{\GNUPLOTspecial{"
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: rand-flat.tex
+%%Creator: gnuplot 4.0 patchlevel 0
+%%CreationDate: Wed Aug 31 12:38:29 2005
+%%DocumentFonts:
+%%BoundingBox: 0 0 360 237
+%%Orientation: Landscape
+%%EndComments
+/gnudict 256 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+/vshift -33 def
+/dl {10.0 mul} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+/Rounded false def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/N {newpath moveto} bind def
+/C {setrgbcolor} bind def
+/f {rlineto fill} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke userlinewidth 2 mul setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/AL { stroke userlinewidth 2 div setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/UL { dup gnulinewidth mul /userlinewidth exch def
+ dup 1 lt {pop 1} if 10 mul /udl exch def } def
+/PL { stroke userlinewidth setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/LTw { PL [] 1 setgray } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 1 0 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
+/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/Pnt { stroke [] 0 setdash
+ gsave 1 setlinecap M 0 0 V stroke grestore } def
+/Dia { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt } def
+/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt } def
+/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt } def
+/Star { 2 copy Pls Crs } def
+/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill } def
+/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill } def
+/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt } def
+/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill } def
+/Pent { stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt } def
+/PentF { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore } def
+/Circle { stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt } def
+/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
+/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def
+/C1 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C2 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C3 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C4 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C5 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc } bind def
+/C6 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C7 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C8 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C9 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C11 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C12 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C13 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C14 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc } bind def
+/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath } bind def
+/Square { dup Rec } bind def
+/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
+/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
+/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
+/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
+/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill
+ Bsquare } bind def
+/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
+/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare } bind def
+/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare } bind def
+/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
+/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare } bind def
+/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
+/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
+/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
+/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
+/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
+/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
+/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
+/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
+/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
+/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
+/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
+/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
+/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
+/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
+/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
+/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
+/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
+/DiaE { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke } def
+/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke } def
+/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke } def
+/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke } def
+/PentE { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore } def
+/CircE { stroke [] 0 setdash
+ hpt 0 360 arc stroke } def
+/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def
+/DiaW { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke } def
+/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke } def
+/TriUW { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke } def
+/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke } def
+/PentW { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore } def
+/CircW { stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke } def
+/BoxFill { gsave Rec 1 setgray fill grestore } def
+/BoxColFill {
+ gsave Rec
+ /Fillden exch def
+ currentrgbcolor
+ /ColB exch def /ColG exch def /ColR exch def
+ /ColR ColR Fillden mul Fillden sub 1 add def
+ /ColG ColG Fillden mul Fillden sub 1 add def
+ /ColB ColB Fillden mul Fillden sub 1 add def
+ ColR ColG ColB setrgbcolor
+ fill grestore } def
+%
+% PostScript Level 1 Pattern Fill routine
+% Usage: x y w h s a XX PatternFill
+% x,y = lower left corner of box to be filled
+% w,h = width and height of box
+% a = angle in degrees between lines and x-axis
+% XX = 0/1 for no/yes cross-hatch
+%
+/PatternFill { gsave /PFa [ 9 2 roll ] def
+ PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
+ PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
+ gsave 1 setgray fill grestore clip
+ currentlinewidth 0.5 mul setlinewidth
+ /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
+ 0 0 M PFa 5 get rotate PFs -2 div dup translate
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 M 0 PFs V } for
+ 0 PFa 6 get ne {
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 2 1 roll M PFs 0 V } for
+ } if
+ stroke grestore } def
+%
+/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
+dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
+currentdict end definefont pop
+end
+%%EndProlog
+gnudict begin
+gsave
+0 0 translate
+0.100 0.100 scale
+0 setgray
+newpath
+0.500 UL
+LTb
+481 331 M
+-31 0 V
+0.500 UL
+LTb
+481 1204 M
+-31 0 V
+0.500 UL
+LTb
+481 2076 M
+-31 0 V
+0.500 UL
+LTb
+481 331 M
+0 -31 V
+0.500 UL
+LTb
+1075 331 M
+0 -31 V
+0.500 UL
+LTb
+1669 331 M
+0 -31 V
+0.500 UL
+LTb
+2262 331 M
+0 -31 V
+0.500 UL
+LTb
+2856 331 M
+0 -31 V
+0.500 UL
+LTb
+3450 331 M
+0 -31 V
+0.500 UL
+LTb
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+LTb
+LTb
+LTb
+1.000 UP
+1.000 UL
+LT0
+LTb
+LT0
+3087 1963 M
+263 0 V
+481 331 M
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0 873 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+stroke
+1484 1204 M
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+0 -873 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+stroke
+2507 331 M
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+1.000 UL
+LT1
+LTb
+LT1
+3087 1863 M
+263 0 V
+481 331 M
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0 485 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+stroke
+1484 816 M
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+stroke
+2517 816 M
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0 -485 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+1.000 UP
+stroke
+grestore
+end
+showpage
+}}%
+\put(3037,1863){\rjust{$a=1.2,b=4.8$}}%
+\put(3037,1963){\rjust{$a=0.5,b=2.5$}}%
+\put(1965,2226){\cjust{Flat Distribution}}%
+\put(1965,50){\cjust{$x$}}%
+\put(100,1203){%
+\special{ps: gsave currentpoint currentpoint translate
+270 rotate neg exch neg exch translate}%
+\cstack{$p(x)$}%
+\special{ps: currentpoint grestore moveto}%
+}%
+\put(3450,200){\cjust{ 5}}%
+\put(2856,200){\cjust{ 4}}%
+\put(2262,200){\cjust{ 3}}%
+\put(1669,200){\cjust{ 2}}%
+\put(1075,200){\cjust{ 1}}%
+\put(481,200){\cjust{ 0}}%
+\put(400,2076){\rjust{ 1}}%
+\put(400,1204){\rjust{ 0.5}}%
+\put(400,331){\rjust{ 0}}%
+\endGNUPLOTpicture
+\endgroup
+\endinput
diff --git a/gsl-1.9/doc/rand-gamma.tex b/gsl-1.9/doc/rand-gamma.tex
new file mode 100644
index 0000000..8de0fad
--- /dev/null
+++ b/gsl-1.9/doc/rand-gamma.tex
@@ -0,0 +1,1330 @@
+% GNUPLOT: plain TeX with Postscript
+\begingroup
+ \catcode`\@=11\relax
+ \def\GNUPLOTspecial{%
+ \def\do##1{\catcode`##1=12\relax}\dospecials
+ \catcode`\{=1\catcode`\}=2\catcode\%=14\relax\special}%
+%
+\expandafter\ifx\csname GNUPLOTpicture\endcsname\relax
+ \csname newdimen\endcsname\GNUPLOTunit
+ \gdef\GNUPLOTpicture(#1,#2){\vbox to#2\GNUPLOTunit\bgroup
+ \def\put(##1,##2)##3{\unskip\raise##2\GNUPLOTunit
+ \hbox to0pt{\kern##1\GNUPLOTunit ##3\hss}\ignorespaces}%
+ \def\ljust##1{\vbox to0pt{\vss\hbox to0pt{##1\hss}\vss}}%
+ \def\cjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1\hss}\vss}}%
+ \def\rjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1}\vss}}%
+ \def\stack##1{\let\\=\cr\tabskip=0pt\halign{\hfil ####\hfil\cr ##1\crcr}}%
+ \def\lstack##1{\hbox to0pt{\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\cstack##1{\hbox to0pt{\hss\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\rstack##1{\hbox to0pt{\vbox to0pt{\stack{##1}\vss}\hss}}%
+ \vss\hbox to#1\GNUPLOTunit\bgroup\ignorespaces}%
+ \gdef\endGNUPLOTpicture{\hss\egroup\egroup}%
+\fi
+\GNUPLOTunit=0.1bp
+\GNUPLOTpicture(3600,2376)
+{\GNUPLOTspecial{"
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: rand-gamma.tex
+%%Creator: gnuplot 4.0 patchlevel 0
+%%CreationDate: Wed Aug 31 12:38:29 2005
+%%DocumentFonts:
+%%BoundingBox: 0 0 360 237
+%%Orientation: Landscape
+%%EndComments
+/gnudict 256 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+/vshift -33 def
+/dl {10.0 mul} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+/Rounded false def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/N {newpath moveto} bind def
+/C {setrgbcolor} bind def
+/f {rlineto fill} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke userlinewidth 2 mul setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/AL { stroke userlinewidth 2 div setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/UL { dup gnulinewidth mul /userlinewidth exch def
+ dup 1 lt {pop 1} if 10 mul /udl exch def } def
+/PL { stroke userlinewidth setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/LTw { PL [] 1 setgray } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 1 0 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
+/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/Pnt { stroke [] 0 setdash
+ gsave 1 setlinecap M 0 0 V stroke grestore } def
+/Dia { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt } def
+/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt } def
+/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt } def
+/Star { 2 copy Pls Crs } def
+/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill } def
+/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill } def
+/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt } def
+/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill } def
+/Pent { stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt } def
+/PentF { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore } def
+/Circle { stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt } def
+/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
+/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def
+/C1 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C2 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C3 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C4 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C5 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc } bind def
+/C6 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C7 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C8 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C9 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C11 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C12 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C13 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C14 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc } bind def
+/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath } bind def
+/Square { dup Rec } bind def
+/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
+/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
+/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
+/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
+/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill
+ Bsquare } bind def
+/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
+/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare } bind def
+/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare } bind def
+/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
+/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare } bind def
+/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
+/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
+/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
+/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
+/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
+/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
+/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
+/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
+/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
+/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
+/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
+/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
+/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
+/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
+/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
+/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
+/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
+/DiaE { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke } def
+/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke } def
+/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke } def
+/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke } def
+/PentE { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore } def
+/CircE { stroke [] 0 setdash
+ hpt 0 360 arc stroke } def
+/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def
+/DiaW { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke } def
+/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke } def
+/TriUW { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke } def
+/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke } def
+/PentW { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore } def
+/CircW { stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke } def
+/BoxFill { gsave Rec 1 setgray fill grestore } def
+/BoxColFill {
+ gsave Rec
+ /Fillden exch def
+ currentrgbcolor
+ /ColB exch def /ColG exch def /ColR exch def
+ /ColR ColR Fillden mul Fillden sub 1 add def
+ /ColG ColG Fillden mul Fillden sub 1 add def
+ /ColB ColB Fillden mul Fillden sub 1 add def
+ ColR ColG ColB setrgbcolor
+ fill grestore } def
+%
+% PostScript Level 1 Pattern Fill routine
+% Usage: x y w h s a XX PatternFill
+% x,y = lower left corner of box to be filled
+% w,h = width and height of box
+% a = angle in degrees between lines and x-axis
+% XX = 0/1 for no/yes cross-hatch
+%
+/PatternFill { gsave /PFa [ 9 2 roll ] def
+ PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
+ PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
+ gsave 1 setgray fill grestore clip
+ currentlinewidth 0.5 mul setlinewidth
+ /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
+ 0 0 M PFa 5 get rotate PFs -2 div dup translate
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 M 0 PFs V } for
+ 0 PFa 6 get ne {
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 2 1 roll M PFs 0 V } for
+ } if
+ stroke grestore } def
+%
+/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
+dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
+currentdict end definefont pop
+end
+%%EndProlog
+gnudict begin
+gsave
+0 0 translate
+0.100 0.100 scale
+0 setgray
+newpath
+0.500 UL
+LTb
+481 331 M
+-31 0 V
+0.500 UL
+LTb
+481 1204 M
+-31 0 V
+0.500 UL
+LTb
+481 2076 M
+-31 0 V
+0.500 UL
+LTb
+481 331 M
+0 -31 V
+0.500 UL
+LTb
+1075 331 M
+0 -31 V
+0.500 UL
+LTb
+1669 331 M
+0 -31 V
+0.500 UL
+LTb
+2262 331 M
+0 -31 V
+0.500 UL
+LTb
+2856 331 M
+0 -31 V
+0.500 UL
+LTb
+3450 331 M
+0 -31 V
+0.500 UL
+LTb
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+LTb
+LTb
+LTb
+1.000 UP
+1.000 UL
+LT0
+LTb
+LT0
+3087 1963 M
+263 0 V
+481 2076 M
+10 -29 V
+10 -28 V
+10 -28 V
+10 -28 V
+10 -27 V
+10 -27 V
+10 -26 V
+9 -26 V
+10 -25 V
+10 -25 V
+10 -24 V
+10 -24 V
+10 -24 V
+10 -23 V
+10 -23 V
+10 -23 V
+10 -22 V
+10 -22 V
+10 -21 V
+10 -21 V
+10 -21 V
+9 -20 V
+10 -20 V
+10 -20 V
+10 -19 V
+10 -19 V
+10 -19 V
+10 -18 V
+10 -19 V
+10 -17 V
+10 -18 V
+10 -17 V
+10 -17 V
+10 -17 V
+10 -16 V
+9 -16 V
+10 -16 V
+10 -16 V
+10 -15 V
+10 -15 V
+10 -15 V
+10 -14 V
+10 -15 V
+10 -14 V
+10 -14 V
+10 -13 V
+10 -14 V
+10 -13 V
+10 -13 V
+9 -13 V
+10 -12 V
+10 -13 V
+10 -12 V
+10 -12 V
+10 -11 V
+10 -12 V
+10 -11 V
+10 -11 V
+10 -11 V
+10 -11 V
+10 -11 V
+10 -10 V
+10 -10 V
+10 -11 V
+9 -10 V
+10 -9 V
+10 -10 V
+10 -9 V
+10 -10 V
+10 -9 V
+10 -9 V
+10 -9 V
+10 -8 V
+10 -9 V
+10 -8 V
+10 -8 V
+10 -9 V
+10 -7 V
+9 -8 V
+10 -8 V
+10 -8 V
+10 -7 V
+10 -7 V
+10 -8 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -6 V
+10 -7 V
+10 -7 V
+10 -6 V
+10 -6 V
+9 -7 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -5 V
+10 -6 V
+10 -6 V
+10 -5 V
+10 -6 V
+10 -5 V
+stroke
+1494 648 M
+10 -5 V
+10 -5 V
+10 -6 V
+10 -5 V
+9 -4 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+9 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+9 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+9 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+9 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+9 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+stroke
+2527 387 M
+9 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+9 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+9 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+9 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+9 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+9 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 0 V
+10 -1 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 0 V
+1.000 UL
+LT1
+LTb
+LT1
+3087 1863 M
+263 0 V
+481 331 M
+10 29 V
+10 27 V
+10 27 V
+10 26 V
+10 25 V
+10 24 V
+10 24 V
+9 22 V
+10 22 V
+10 21 V
+10 20 V
+10 20 V
+10 18 V
+10 18 V
+10 18 V
+10 16 V
+10 16 V
+10 16 V
+10 15 V
+10 14 V
+10 13 V
+9 13 V
+10 13 V
+10 12 V
+10 11 V
+10 11 V
+10 11 V
+10 10 V
+10 9 V
+10 9 V
+10 9 V
+10 8 V
+10 8 V
+10 7 V
+10 7 V
+9 6 V
+10 7 V
+10 5 V
+10 6 V
+10 5 V
+10 5 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 3 V
+10 3 V
+10 3 V
+10 2 V
+9 2 V
+10 2 V
+10 2 V
+10 1 V
+10 2 V
+10 1 V
+10 1 V
+10 0 V
+10 1 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 -1 V
+10 -1 V
+9 0 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+9 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -4 V
+9 -3 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -4 V
+10 -3 V
+stroke
+1494 872 M
+10 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+9 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+9 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+9 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+9 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+9 -4 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+9 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+9 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+stroke
+2527 523 M
+9 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+9 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+9 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+9 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+9 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+1.000 UL
+LT2
+LTb
+LT2
+3087 1763 M
+263 0 V
+481 331 M
+10 0 V
+10 1 V
+10 1 V
+10 2 V
+10 2 V
+10 2 V
+10 3 V
+9 3 V
+10 3 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 5 V
+10 5 V
+10 5 V
+10 5 V
+10 6 V
+10 5 V
+10 6 V
+10 6 V
+9 6 V
+10 6 V
+10 6 V
+10 6 V
+10 7 V
+10 6 V
+10 7 V
+10 6 V
+10 7 V
+10 7 V
+10 6 V
+10 7 V
+10 7 V
+10 6 V
+9 7 V
+10 7 V
+10 7 V
+10 6 V
+10 7 V
+10 7 V
+10 6 V
+10 7 V
+10 6 V
+10 7 V
+10 6 V
+10 7 V
+10 6 V
+10 6 V
+9 6 V
+10 6 V
+10 7 V
+10 5 V
+10 6 V
+10 6 V
+10 6 V
+10 6 V
+10 5 V
+10 6 V
+10 5 V
+10 5 V
+10 6 V
+10 5 V
+10 5 V
+9 5 V
+10 4 V
+10 5 V
+10 5 V
+10 4 V
+10 5 V
+10 4 V
+10 4 V
+10 5 V
+10 4 V
+10 4 V
+10 3 V
+10 4 V
+10 4 V
+9 3 V
+10 4 V
+10 3 V
+10 3 V
+10 4 V
+10 3 V
+10 2 V
+10 3 V
+10 3 V
+10 3 V
+10 2 V
+10 3 V
+10 2 V
+10 2 V
+9 3 V
+10 2 V
+10 2 V
+10 2 V
+10 1 V
+10 2 V
+10 2 V
+10 1 V
+10 2 V
+10 1 V
+stroke
+1494 792 M
+10 1 V
+10 2 V
+10 1 V
+10 1 V
+9 1 V
+10 1 V
+10 0 V
+10 1 V
+10 1 V
+10 0 V
+10 1 V
+10 0 V
+10 1 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+9 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+9 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+9 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+9 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -3 V
+stroke
+2527 661 M
+9 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+9 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+9 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+9 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+9 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+9 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+9 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+1.000 UP
+stroke
+grestore
+end
+showpage
+}}%
+\put(3037,1763){\rjust{$a=3$}}%
+\put(3037,1863){\rjust{$a=2$}}%
+\put(3037,1963){\rjust{$a=1$}}%
+\put(1965,2226){\cjust{Gamma Distribution}}%
+\put(1965,50){\cjust{$x$}}%
+\put(100,1203){%
+\special{ps: gsave currentpoint currentpoint translate
+270 rotate neg exch neg exch translate}%
+\cstack{$p(x)$}%
+\special{ps: currentpoint grestore moveto}%
+}%
+\put(3450,200){\cjust{ 5}}%
+\put(2856,200){\cjust{ 4}}%
+\put(2262,200){\cjust{ 3}}%
+\put(1669,200){\cjust{ 2}}%
+\put(1075,200){\cjust{ 1}}%
+\put(481,200){\cjust{ 0}}%
+\put(400,2076){\rjust{ 1}}%
+\put(400,1204){\rjust{ 0.5}}%
+\put(400,331){\rjust{ 0}}%
+\endGNUPLOTpicture
+\endgroup
+\endinput
diff --git a/gsl-1.9/doc/rand-gaussian-tail.tex b/gsl-1.9/doc/rand-gaussian-tail.tex
new file mode 100644
index 0000000..932f6be
--- /dev/null
+++ b/gsl-1.9/doc/rand-gaussian-tail.tex
@@ -0,0 +1,718 @@
+% GNUPLOT: plain TeX with Postscript
+\begingroup
+ \catcode`\@=11\relax
+ \def\GNUPLOTspecial{%
+ \def\do##1{\catcode`##1=12\relax}\dospecials
+ \catcode`\{=1\catcode`\}=2\catcode\%=14\relax\special}%
+%
+\expandafter\ifx\csname GNUPLOTpicture\endcsname\relax
+ \csname newdimen\endcsname\GNUPLOTunit
+ \gdef\GNUPLOTpicture(#1,#2){\vbox to#2\GNUPLOTunit\bgroup
+ \def\put(##1,##2)##3{\unskip\raise##2\GNUPLOTunit
+ \hbox to0pt{\kern##1\GNUPLOTunit ##3\hss}\ignorespaces}%
+ \def\ljust##1{\vbox to0pt{\vss\hbox to0pt{##1\hss}\vss}}%
+ \def\cjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1\hss}\vss}}%
+ \def\rjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1}\vss}}%
+ \def\stack##1{\let\\=\cr\tabskip=0pt\halign{\hfil ####\hfil\cr ##1\crcr}}%
+ \def\lstack##1{\hbox to0pt{\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\cstack##1{\hbox to0pt{\hss\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\rstack##1{\hbox to0pt{\vbox to0pt{\stack{##1}\vss}\hss}}%
+ \vss\hbox to#1\GNUPLOTunit\bgroup\ignorespaces}%
+ \gdef\endGNUPLOTpicture{\hss\egroup\egroup}%
+\fi
+\GNUPLOTunit=0.1bp
+\GNUPLOTpicture(3600,2376)
+{\GNUPLOTspecial{"
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: rand-gaussian-tail.tex
+%%Creator: gnuplot 4.0 patchlevel 0
+%%CreationDate: Wed Aug 31 12:38:28 2005
+%%DocumentFonts:
+%%BoundingBox: 0 0 360 237
+%%Orientation: Landscape
+%%EndComments
+/gnudict 256 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+/vshift -33 def
+/dl {10.0 mul} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+/Rounded false def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/N {newpath moveto} bind def
+/C {setrgbcolor} bind def
+/f {rlineto fill} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke userlinewidth 2 mul setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/AL { stroke userlinewidth 2 div setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/UL { dup gnulinewidth mul /userlinewidth exch def
+ dup 1 lt {pop 1} if 10 mul /udl exch def } def
+/PL { stroke userlinewidth setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/LTw { PL [] 1 setgray } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 1 0 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
+/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/Pnt { stroke [] 0 setdash
+ gsave 1 setlinecap M 0 0 V stroke grestore } def
+/Dia { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt } def
+/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt } def
+/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt } def
+/Star { 2 copy Pls Crs } def
+/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill } def
+/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill } def
+/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt } def
+/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill } def
+/Pent { stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt } def
+/PentF { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore } def
+/Circle { stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt } def
+/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
+/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def
+/C1 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C2 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C3 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C4 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C5 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc } bind def
+/C6 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C7 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C8 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C9 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C11 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C12 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C13 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C14 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc } bind def
+/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath } bind def
+/Square { dup Rec } bind def
+/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
+/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
+/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
+/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
+/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill
+ Bsquare } bind def
+/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
+/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare } bind def
+/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare } bind def
+/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
+/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare } bind def
+/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
+/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
+/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
+/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
+/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
+/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
+/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
+/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
+/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
+/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
+/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
+/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
+/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
+/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
+/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
+/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
+/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
+/DiaE { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke } def
+/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke } def
+/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke } def
+/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke } def
+/PentE { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore } def
+/CircE { stroke [] 0 setdash
+ hpt 0 360 arc stroke } def
+/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def
+/DiaW { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke } def
+/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke } def
+/TriUW { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke } def
+/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke } def
+/PentW { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore } def
+/CircW { stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke } def
+/BoxFill { gsave Rec 1 setgray fill grestore } def
+/BoxColFill {
+ gsave Rec
+ /Fillden exch def
+ currentrgbcolor
+ /ColB exch def /ColG exch def /ColR exch def
+ /ColR ColR Fillden mul Fillden sub 1 add def
+ /ColG ColG Fillden mul Fillden sub 1 add def
+ /ColB ColB Fillden mul Fillden sub 1 add def
+ ColR ColG ColB setrgbcolor
+ fill grestore } def
+%
+% PostScript Level 1 Pattern Fill routine
+% Usage: x y w h s a XX PatternFill
+% x,y = lower left corner of box to be filled
+% w,h = width and height of box
+% a = angle in degrees between lines and x-axis
+% XX = 0/1 for no/yes cross-hatch
+%
+/PatternFill { gsave /PFa [ 9 2 roll ] def
+ PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
+ PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
+ gsave 1 setgray fill grestore clip
+ currentlinewidth 0.5 mul setlinewidth
+ /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
+ 0 0 M PFa 5 get rotate PFs -2 div dup translate
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 M 0 PFs V } for
+ 0 PFa 6 get ne {
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 2 1 roll M PFs 0 V } for
+ } if
+ stroke grestore } def
+%
+/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
+dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
+currentdict end definefont pop
+end
+%%EndProlog
+gnudict begin
+gsave
+0 0 translate
+0.100 0.100 scale
+0 setgray
+newpath
+0.500 UL
+LTb
+481 331 M
+-31 0 V
+0.500 UL
+LTb
+481 767 M
+-31 0 V
+0.500 UL
+LTb
+481 1204 M
+-31 0 V
+0.500 UL
+LTb
+481 1640 M
+-31 0 V
+0.500 UL
+LTb
+481 2076 M
+-31 0 V
+0.500 UL
+LTb
+481 331 M
+0 -31 V
+0.500 UL
+LTb
+1075 331 M
+0 -31 V
+0.500 UL
+LTb
+1669 331 M
+0 -31 V
+0.500 UL
+LTb
+2262 331 M
+0 -31 V
+0.500 UL
+LTb
+2856 331 M
+0 -31 V
+0.500 UL
+LTb
+3450 331 M
+0 -31 V
+0.500 UL
+LTb
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+LTb
+LTb
+LTb
+1.000 UP
+1.000 UL
+LT0
+LTb
+LT0
+3087 1963 M
+263 0 V
+481 331 M
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 1679 V
+10 -42 V
+10 -42 V
+9 -40 V
+10 -40 V
+10 -40 V
+10 -39 V
+10 -38 V
+10 -38 V
+10 -37 V
+10 -36 V
+10 -36 V
+10 -35 V
+stroke
+1494 1547 M
+10 -34 V
+10 -34 V
+10 -33 V
+10 -32 V
+9 -32 V
+10 -31 V
+10 -31 V
+10 -29 V
+10 -30 V
+10 -28 V
+10 -28 V
+10 -27 V
+10 -27 V
+10 -26 V
+10 -26 V
+10 -24 V
+10 -25 V
+10 -23 V
+10 -23 V
+9 -23 V
+10 -22 V
+10 -21 V
+10 -21 V
+10 -20 V
+10 -20 V
+10 -19 V
+10 -18 V
+10 -19 V
+10 -17 V
+10 -17 V
+10 -17 V
+10 -16 V
+10 -15 V
+9 -16 V
+10 -14 V
+10 -15 V
+10 -13 V
+10 -14 V
+10 -13 V
+10 -12 V
+10 -12 V
+10 -12 V
+10 -11 V
+10 -11 V
+10 -11 V
+10 -10 V
+10 -10 V
+9 -10 V
+10 -9 V
+10 -9 V
+10 -9 V
+10 -8 V
+10 -8 V
+10 -8 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -6 V
+10 -6 V
+10 -6 V
+9 -6 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+9 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+9 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+stroke
+2527 345 M
+9 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+9 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 -1 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+1.000 UP
+stroke
+grestore
+end
+showpage
+}}%
+\put(3037,1963){\rjust{$\sigma=1,a=1.5$}}%
+\put(1965,2226){\cjust{Gaussian Tail Distribution}}%
+\put(1965,50){\cjust{$x$}}%
+\put(100,1203){%
+\special{ps: gsave currentpoint currentpoint translate
+270 rotate neg exch neg exch translate}%
+\cstack{$p(x)$}%
+\special{ps: currentpoint grestore moveto}%
+}%
+\put(3450,200){\cjust{ 5}}%
+\put(2856,200){\cjust{ 4}}%
+\put(2262,200){\cjust{ 3}}%
+\put(1669,200){\cjust{ 2}}%
+\put(1075,200){\cjust{ 1}}%
+\put(481,200){\cjust{ 0}}%
+\put(400,2076){\rjust{ 2}}%
+\put(400,1640){\rjust{ 1.5}}%
+\put(400,1204){\rjust{ 1}}%
+\put(400,767){\rjust{ 0.5}}%
+\put(400,331){\rjust{ 0}}%
+\endGNUPLOTpicture
+\endgroup
+\endinput
diff --git a/gsl-1.9/doc/rand-gaussian.tex b/gsl-1.9/doc/rand-gaussian.tex
new file mode 100644
index 0000000..589c122
--- /dev/null
+++ b/gsl-1.9/doc/rand-gaussian.tex
@@ -0,0 +1,1059 @@
+% GNUPLOT: plain TeX with Postscript
+\begingroup
+ \catcode`\@=11\relax
+ \def\GNUPLOTspecial{%
+ \def\do##1{\catcode`##1=12\relax}\dospecials
+ \catcode`\{=1\catcode`\}=2\catcode\%=14\relax\special}%
+%
+\expandafter\ifx\csname GNUPLOTpicture\endcsname\relax
+ \csname newdimen\endcsname\GNUPLOTunit
+ \gdef\GNUPLOTpicture(#1,#2){\vbox to#2\GNUPLOTunit\bgroup
+ \def\put(##1,##2)##3{\unskip\raise##2\GNUPLOTunit
+ \hbox to0pt{\kern##1\GNUPLOTunit ##3\hss}\ignorespaces}%
+ \def\ljust##1{\vbox to0pt{\vss\hbox to0pt{##1\hss}\vss}}%
+ \def\cjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1\hss}\vss}}%
+ \def\rjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1}\vss}}%
+ \def\stack##1{\let\\=\cr\tabskip=0pt\halign{\hfil ####\hfil\cr ##1\crcr}}%
+ \def\lstack##1{\hbox to0pt{\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\cstack##1{\hbox to0pt{\hss\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\rstack##1{\hbox to0pt{\vbox to0pt{\stack{##1}\vss}\hss}}%
+ \vss\hbox to#1\GNUPLOTunit\bgroup\ignorespaces}%
+ \gdef\endGNUPLOTpicture{\hss\egroup\egroup}%
+\fi
+\GNUPLOTunit=0.1bp
+\GNUPLOTpicture(3600,2376)
+{\GNUPLOTspecial{"
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: rand-gaussian.tex
+%%Creator: gnuplot 4.0 patchlevel 0
+%%CreationDate: Wed Aug 31 12:38:28 2005
+%%DocumentFonts:
+%%BoundingBox: 0 0 360 237
+%%Orientation: Landscape
+%%EndComments
+/gnudict 256 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+/vshift -33 def
+/dl {10.0 mul} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+/Rounded false def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/N {newpath moveto} bind def
+/C {setrgbcolor} bind def
+/f {rlineto fill} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke userlinewidth 2 mul setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/AL { stroke userlinewidth 2 div setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/UL { dup gnulinewidth mul /userlinewidth exch def
+ dup 1 lt {pop 1} if 10 mul /udl exch def } def
+/PL { stroke userlinewidth setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/LTw { PL [] 1 setgray } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 1 0 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
+/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/Pnt { stroke [] 0 setdash
+ gsave 1 setlinecap M 0 0 V stroke grestore } def
+/Dia { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt } def
+/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt } def
+/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt } def
+/Star { 2 copy Pls Crs } def
+/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill } def
+/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill } def
+/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt } def
+/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill } def
+/Pent { stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt } def
+/PentF { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore } def
+/Circle { stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt } def
+/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
+/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def
+/C1 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C2 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C3 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C4 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C5 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc } bind def
+/C6 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C7 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C8 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C9 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C11 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C12 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C13 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C14 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc } bind def
+/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath } bind def
+/Square { dup Rec } bind def
+/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
+/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
+/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
+/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
+/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill
+ Bsquare } bind def
+/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
+/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare } bind def
+/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare } bind def
+/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
+/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare } bind def
+/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
+/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
+/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
+/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
+/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
+/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
+/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
+/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
+/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
+/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
+/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
+/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
+/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
+/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
+/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
+/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
+/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
+/DiaE { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke } def
+/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke } def
+/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke } def
+/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke } def
+/PentE { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore } def
+/CircE { stroke [] 0 setdash
+ hpt 0 360 arc stroke } def
+/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def
+/DiaW { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke } def
+/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke } def
+/TriUW { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke } def
+/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke } def
+/PentW { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore } def
+/CircW { stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke } def
+/BoxFill { gsave Rec 1 setgray fill grestore } def
+/BoxColFill {
+ gsave Rec
+ /Fillden exch def
+ currentrgbcolor
+ /ColB exch def /ColG exch def /ColR exch def
+ /ColR ColR Fillden mul Fillden sub 1 add def
+ /ColG ColG Fillden mul Fillden sub 1 add def
+ /ColB ColB Fillden mul Fillden sub 1 add def
+ ColR ColG ColB setrgbcolor
+ fill grestore } def
+%
+% PostScript Level 1 Pattern Fill routine
+% Usage: x y w h s a XX PatternFill
+% x,y = lower left corner of box to be filled
+% w,h = width and height of box
+% a = angle in degrees between lines and x-axis
+% XX = 0/1 for no/yes cross-hatch
+%
+/PatternFill { gsave /PFa [ 9 2 roll ] def
+ PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
+ PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
+ gsave 1 setgray fill grestore clip
+ currentlinewidth 0.5 mul setlinewidth
+ /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
+ 0 0 M PFa 5 get rotate PFs -2 div dup translate
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 M 0 PFs V } for
+ 0 PFa 6 get ne {
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 2 1 roll M PFs 0 V } for
+ } if
+ stroke grestore } def
+%
+/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
+dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
+currentdict end definefont pop
+end
+%%EndProlog
+gnudict begin
+gsave
+0 0 translate
+0.100 0.100 scale
+0 setgray
+newpath
+0.500 UL
+LTb
+481 331 M
+-31 0 V
+0.500 UL
+LTb
+481 680 M
+-31 0 V
+0.500 UL
+LTb
+481 1029 M
+-31 0 V
+0.500 UL
+LTb
+481 1378 M
+-31 0 V
+0.500 UL
+LTb
+481 1727 M
+-31 0 V
+0.500 UL
+LTb
+481 2076 M
+-31 0 V
+0.500 UL
+LTb
+481 331 M
+0 -31 V
+0.500 UL
+LTb
+778 331 M
+0 -31 V
+0.500 UL
+LTb
+1075 331 M
+0 -31 V
+0.500 UL
+LTb
+1372 331 M
+0 -31 V
+0.500 UL
+LTb
+1669 331 M
+0 -31 V
+0.500 UL
+LTb
+1965 331 M
+0 -31 V
+0.500 UL
+LTb
+2262 331 M
+0 -31 V
+0.500 UL
+LTb
+2559 331 M
+0 -31 V
+0.500 UL
+LTb
+2856 331 M
+0 -31 V
+0.500 UL
+LTb
+3153 331 M
+0 -31 V
+0.500 UL
+LTb
+3450 331 M
+0 -31 V
+0.500 UL
+LTb
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+LTb
+LTb
+LTb
+1.000 UP
+1.000 UL
+LT0
+LTb
+LT0
+3087 1963 M
+263 0 V
+481 331 M
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 1 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 1 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 1 V
+10 0 V
+10 0 V
+10 1 V
+10 0 V
+10 1 V
+9 0 V
+10 1 V
+10 1 V
+10 1 V
+10 0 V
+10 1 V
+10 1 V
+10 2 V
+10 1 V
+10 1 V
+10 2 V
+10 1 V
+10 2 V
+10 2 V
+10 2 V
+9 3 V
+10 2 V
+10 3 V
+10 3 V
+10 3 V
+10 4 V
+10 3 V
+10 4 V
+10 5 V
+10 4 V
+10 5 V
+10 6 V
+10 6 V
+10 6 V
+9 6 V
+10 7 V
+10 8 V
+10 8 V
+10 8 V
+10 9 V
+10 10 V
+10 10 V
+10 11 V
+10 11 V
+10 12 V
+10 12 V
+10 13 V
+10 14 V
+9 15 V
+10 15 V
+10 15 V
+10 17 V
+10 17 V
+10 18 V
+10 18 V
+10 20 V
+10 20 V
+10 20 V
+stroke
+1494 725 M
+10 21 V
+10 22 V
+10 23 V
+10 23 V
+9 24 V
+10 24 V
+10 25 V
+10 26 V
+10 26 V
+10 26 V
+10 27 V
+10 27 V
+10 28 V
+10 27 V
+10 28 V
+10 28 V
+10 29 V
+10 28 V
+10 28 V
+9 28 V
+10 28 V
+10 28 V
+10 27 V
+10 27 V
+10 27 V
+10 26 V
+10 26 V
+10 25 V
+10 24 V
+10 23 V
+10 23 V
+10 21 V
+10 21 V
+9 19 V
+10 19 V
+10 17 V
+10 16 V
+10 15 V
+10 13 V
+10 12 V
+10 11 V
+10 9 V
+10 8 V
+10 6 V
+10 4 V
+10 4 V
+10 1 V
+9 0 V
+10 -1 V
+10 -4 V
+10 -4 V
+10 -6 V
+10 -8 V
+10 -9 V
+10 -11 V
+10 -12 V
+10 -13 V
+10 -15 V
+10 -16 V
+10 -17 V
+10 -19 V
+9 -19 V
+10 -21 V
+10 -21 V
+10 -23 V
+10 -23 V
+10 -24 V
+10 -25 V
+10 -26 V
+10 -26 V
+10 -27 V
+10 -27 V
+10 -27 V
+10 -28 V
+10 -28 V
+9 -28 V
+10 -28 V
+10 -28 V
+10 -29 V
+10 -28 V
+10 -28 V
+10 -27 V
+10 -28 V
+10 -27 V
+10 -27 V
+10 -26 V
+10 -26 V
+10 -26 V
+10 -25 V
+10 -24 V
+9 -24 V
+10 -23 V
+10 -23 V
+10 -22 V
+10 -21 V
+10 -20 V
+10 -20 V
+10 -20 V
+10 -18 V
+10 -18 V
+10 -17 V
+10 -17 V
+10 -15 V
+10 -15 V
+stroke
+2527 565 M
+9 -15 V
+10 -14 V
+10 -13 V
+10 -12 V
+10 -12 V
+10 -11 V
+10 -11 V
+10 -10 V
+10 -10 V
+10 -9 V
+10 -8 V
+10 -8 V
+10 -8 V
+10 -7 V
+9 -6 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+9 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+9 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+1.000 UL
+LT1
+LTb
+LT1
+3087 1863 M
+263 0 V
+481 362 M
+10 1 V
+10 1 V
+10 2 V
+10 1 V
+10 2 V
+10 1 V
+10 2 V
+9 1 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 1 V
+10 2 V
+10 2 V
+10 3 V
+10 2 V
+10 2 V
+10 2 V
+10 3 V
+10 2 V
+9 3 V
+10 2 V
+10 3 V
+10 3 V
+10 3 V
+10 2 V
+10 3 V
+10 3 V
+10 4 V
+10 3 V
+10 3 V
+10 3 V
+10 4 V
+10 3 V
+9 4 V
+10 4 V
+10 3 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 5 V
+10 4 V
+10 4 V
+10 5 V
+10 4 V
+10 5 V
+10 5 V
+9 4 V
+10 5 V
+10 5 V
+10 5 V
+10 5 V
+10 6 V
+10 5 V
+10 5 V
+10 6 V
+10 5 V
+10 6 V
+10 6 V
+10 6 V
+10 6 V
+10 5 V
+9 7 V
+10 6 V
+10 6 V
+10 6 V
+10 6 V
+10 7 V
+10 6 V
+10 7 V
+10 6 V
+10 7 V
+10 6 V
+10 7 V
+10 7 V
+10 7 V
+9 6 V
+10 7 V
+10 7 V
+10 7 V
+10 7 V
+10 7 V
+10 7 V
+10 7 V
+10 7 V
+10 7 V
+10 7 V
+10 7 V
+10 7 V
+10 7 V
+9 8 V
+10 7 V
+10 7 V
+10 7 V
+10 7 V
+10 6 V
+10 7 V
+10 7 V
+10 7 V
+10 7 V
+stroke
+1494 839 M
+10 7 V
+10 6 V
+10 7 V
+10 6 V
+9 7 V
+10 6 V
+10 6 V
+10 7 V
+10 6 V
+10 6 V
+10 6 V
+10 6 V
+10 5 V
+10 6 V
+10 6 V
+10 5 V
+10 5 V
+10 5 V
+10 5 V
+9 5 V
+10 5 V
+10 5 V
+10 4 V
+10 4 V
+10 5 V
+10 4 V
+10 3 V
+10 4 V
+10 4 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+9 3 V
+10 2 V
+10 2 V
+10 3 V
+10 1 V
+10 2 V
+10 2 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -3 V
+10 -2 V
+10 -2 V
+9 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+10 -5 V
+10 -5 V
+9 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -6 V
+10 -6 V
+10 -5 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -7 V
+10 -6 V
+10 -6 V
+9 -7 V
+10 -6 V
+10 -7 V
+10 -6 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -6 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+stroke
+2527 777 M
+9 -8 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+9 -6 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -6 V
+10 -7 V
+10 -6 V
+10 -7 V
+10 -6 V
+10 -7 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -6 V
+9 -7 V
+10 -5 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -5 V
+10 -6 V
+10 -5 V
+10 -5 V
+10 -6 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+9 -4 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+9 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+9 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+9 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+1.000 UP
+stroke
+grestore
+end
+showpage
+}}%
+\put(3037,1863){\rjust{$\sigma=2$}}%
+\put(3037,1963){\rjust{$\sigma=1$}}%
+\put(1965,2226){\cjust{Gaussian Distribution}}%
+\put(1965,50){\cjust{$x$}}%
+\put(100,1203){%
+\special{ps: gsave currentpoint currentpoint translate
+270 rotate neg exch neg exch translate}%
+\cstack{$p(x)$}%
+\special{ps: currentpoint grestore moveto}%
+}%
+\put(3450,200){\cjust{ 5}}%
+\put(3153,200){\cjust{ 4}}%
+\put(2856,200){\cjust{ 3}}%
+\put(2559,200){\cjust{ 2}}%
+\put(2262,200){\cjust{ 1}}%
+\put(1965,200){\cjust{ 0}}%
+\put(1669,200){\cjust{-1}}%
+\put(1372,200){\cjust{-2}}%
+\put(1075,200){\cjust{-3}}%
+\put(778,200){\cjust{-4}}%
+\put(481,200){\cjust{-5}}%
+\put(400,2076){\rjust{ 0.5}}%
+\put(400,1727){\rjust{ 0.4}}%
+\put(400,1378){\rjust{ 0.3}}%
+\put(400,1029){\rjust{ 0.2}}%
+\put(400,680){\rjust{ 0.1}}%
+\put(400,331){\rjust{ 0}}%
+\endGNUPLOTpicture
+\endgroup
+\endinput
diff --git a/gsl-1.9/doc/rand-geometric.tex b/gsl-1.9/doc/rand-geometric.tex
new file mode 100644
index 0000000..4010a86
--- /dev/null
+++ b/gsl-1.9/doc/rand-geometric.tex
@@ -0,0 +1,753 @@
+% GNUPLOT: plain TeX with Postscript
+\begingroup
+ \catcode`\@=11\relax
+ \def\GNUPLOTspecial{%
+ \def\do##1{\catcode`##1=12\relax}\dospecials
+ \catcode`\{=1\catcode`\}=2\catcode\%=14\relax\special}%
+%
+\expandafter\ifx\csname GNUPLOTpicture\endcsname\relax
+ \csname newdimen\endcsname\GNUPLOTunit
+ \gdef\GNUPLOTpicture(#1,#2){\vbox to#2\GNUPLOTunit\bgroup
+ \def\put(##1,##2)##3{\unskip\raise##2\GNUPLOTunit
+ \hbox to0pt{\kern##1\GNUPLOTunit ##3\hss}\ignorespaces}%
+ \def\ljust##1{\vbox to0pt{\vss\hbox to0pt{##1\hss}\vss}}%
+ \def\cjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1\hss}\vss}}%
+ \def\rjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1}\vss}}%
+ \def\stack##1{\let\\=\cr\tabskip=0pt\halign{\hfil ####\hfil\cr ##1\crcr}}%
+ \def\lstack##1{\hbox to0pt{\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\cstack##1{\hbox to0pt{\hss\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\rstack##1{\hbox to0pt{\vbox to0pt{\stack{##1}\vss}\hss}}%
+ \vss\hbox to#1\GNUPLOTunit\bgroup\ignorespaces}%
+ \gdef\endGNUPLOTpicture{\hss\egroup\egroup}%
+\fi
+\GNUPLOTunit=0.1bp
+\GNUPLOTpicture(3600,2376)
+{\GNUPLOTspecial{"
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: rand-geometric.tex
+%%Creator: gnuplot 4.0 patchlevel 0
+%%CreationDate: Wed Aug 31 12:38:29 2005
+%%DocumentFonts:
+%%BoundingBox: 0 0 360 237
+%%Orientation: Landscape
+%%EndComments
+/gnudict 256 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+/vshift -33 def
+/dl {10.0 mul} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+/Rounded false def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/N {newpath moveto} bind def
+/C {setrgbcolor} bind def
+/f {rlineto fill} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke userlinewidth 2 mul setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/AL { stroke userlinewidth 2 div setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/UL { dup gnulinewidth mul /userlinewidth exch def
+ dup 1 lt {pop 1} if 10 mul /udl exch def } def
+/PL { stroke userlinewidth setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/LTw { PL [] 1 setgray } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 1 0 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
+/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/Pnt { stroke [] 0 setdash
+ gsave 1 setlinecap M 0 0 V stroke grestore } def
+/Dia { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt } def
+/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt } def
+/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt } def
+/Star { 2 copy Pls Crs } def
+/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill } def
+/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill } def
+/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt } def
+/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill } def
+/Pent { stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt } def
+/PentF { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore } def
+/Circle { stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt } def
+/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
+/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def
+/C1 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C2 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C3 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C4 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C5 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc } bind def
+/C6 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C7 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C8 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C9 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C11 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C12 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C13 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C14 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc } bind def
+/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath } bind def
+/Square { dup Rec } bind def
+/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
+/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
+/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
+/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
+/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill
+ Bsquare } bind def
+/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
+/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare } bind def
+/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare } bind def
+/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
+/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare } bind def
+/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
+/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
+/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
+/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
+/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
+/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
+/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
+/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
+/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
+/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
+/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
+/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
+/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
+/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
+/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
+/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
+/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
+/DiaE { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke } def
+/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke } def
+/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke } def
+/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke } def
+/PentE { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore } def
+/CircE { stroke [] 0 setdash
+ hpt 0 360 arc stroke } def
+/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def
+/DiaW { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke } def
+/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke } def
+/TriUW { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke } def
+/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke } def
+/PentW { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore } def
+/CircW { stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke } def
+/BoxFill { gsave Rec 1 setgray fill grestore } def
+/BoxColFill {
+ gsave Rec
+ /Fillden exch def
+ currentrgbcolor
+ /ColB exch def /ColG exch def /ColR exch def
+ /ColR ColR Fillden mul Fillden sub 1 add def
+ /ColG ColG Fillden mul Fillden sub 1 add def
+ /ColB ColB Fillden mul Fillden sub 1 add def
+ ColR ColG ColB setrgbcolor
+ fill grestore } def
+%
+% PostScript Level 1 Pattern Fill routine
+% Usage: x y w h s a XX PatternFill
+% x,y = lower left corner of box to be filled
+% w,h = width and height of box
+% a = angle in degrees between lines and x-axis
+% XX = 0/1 for no/yes cross-hatch
+%
+/PatternFill { gsave /PFa [ 9 2 roll ] def
+ PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
+ PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
+ gsave 1 setgray fill grestore clip
+ currentlinewidth 0.5 mul setlinewidth
+ /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
+ 0 0 M PFa 5 get rotate PFs -2 div dup translate
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 M 0 PFs V } for
+ 0 PFa 6 get ne {
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 2 1 roll M PFs 0 V } for
+ } if
+ stroke grestore } def
+%
+/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
+dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
+currentdict end definefont pop
+end
+%%EndProlog
+gnudict begin
+gsave
+0 0 translate
+0.100 0.100 scale
+0 setgray
+newpath
+0.500 UL
+LTb
+481 331 M
+-31 0 V
+0.500 UL
+LTb
+481 580 M
+-31 0 V
+0.500 UL
+LTb
+481 830 M
+-31 0 V
+0.500 UL
+LTb
+481 1079 M
+-31 0 V
+0.500 UL
+LTb
+481 1328 M
+-31 0 V
+0.500 UL
+LTb
+481 1577 M
+-31 0 V
+0.500 UL
+LTb
+481 1827 M
+-31 0 V
+0.500 UL
+LTb
+481 2076 M
+-31 0 V
+0.500 UL
+LTb
+481 331 M
+0 -63 V
+247 63 R
+0 -31 V
+0.500 UL
+LTb
+976 331 M
+0 -63 V
+247 63 R
+0 -31 V
+0.500 UL
+LTb
+1471 331 M
+0 -63 V
+247 63 R
+0 -31 V
+0.500 UL
+LTb
+1965 331 M
+0 -63 V
+248 63 R
+0 -31 V
+0.500 UL
+LTb
+2460 331 M
+0 -63 V
+248 63 R
+0 -31 V
+0.500 UL
+LTb
+2955 331 M
+0 -63 V
+248 63 R
+0 -31 V
+0.500 UL
+LTb
+3450 331 M
+0 -63 V
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+LTb
+LTb
+LTb
+1.000 UP
+1.000 UL
+LT0
+LTb
+LT0
+3087 1963 M
+263 0 V
+481 331 M
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+0 1246 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0 -623 V
+stroke
+1474 954 M
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+0 -311 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0 -156 V
+10 0 V
+10 0 V
+stroke
+2487 487 M
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+0 -78 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0 -39 V
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+1.000 UP
+stroke
+grestore
+end
+showpage
+}}%
+\put(3037,1963){\rjust{$p=0.5$}}%
+\put(1965,2226){\cjust{Geometric Distribution}}%
+\put(1965,50){\cjust{$k$}}%
+\put(100,1203){%
+\special{ps: gsave currentpoint currentpoint translate
+270 rotate neg exch neg exch translate}%
+\cstack{$p(k)$}%
+\special{ps: currentpoint grestore moveto}%
+}%
+\put(3203,200){\cjust{ 5}}%
+\put(2708,200){\cjust{ 4}}%
+\put(2213,200){\cjust{ 3}}%
+\put(1718,200){\cjust{ 2}}%
+\put(1223,200){\cjust{ 1}}%
+\put(728,200){\cjust{ 0}}%
+\put(400,2076){\rjust{ 0.7}}%
+\put(400,1827){\rjust{ 0.6}}%
+\put(400,1577){\rjust{ 0.5}}%
+\put(400,1328){\rjust{ 0.4}}%
+\put(400,1079){\rjust{ 0.3}}%
+\put(400,830){\rjust{ 0.2}}%
+\put(400,580){\rjust{ 0.1}}%
+\put(400,331){\rjust{ 0}}%
+\endGNUPLOTpicture
+\endgroup
+\endinput
diff --git a/gsl-1.9/doc/rand-gumbel.tex b/gsl-1.9/doc/rand-gumbel.tex
new file mode 100644
index 0000000..0cf6108
--- /dev/null
+++ b/gsl-1.9/doc/rand-gumbel.tex
@@ -0,0 +1,966 @@
+% GNUPLOT: plain TeX with Postscript
+\expandafter\ifx\csname GNUPLOTpicture\endcsname\relax
+ \begingroup
+ % Inner version of \newdimen from btxmac.tex
+ \edef\innernewdimen{\expandafter\noexpand\csname newdimen\endcsname}%
+ \innernewdimen\GNUPLOTunit
+ \endgroup
+ \gdef\GNUPLOTpicture(#1,#2){\vbox to#2\GNUPLOTunit\bgroup
+ \def\put(##1,##2)##3{\unskip\raise##2\GNUPLOTunit
+ \hbox to0pt{\kern##1\GNUPLOTunit ##3\hss}\ignorespaces}%
+ \def\ljust##1{\vbox to0pt{\vss\hbox to0pt{##1\hss}\vss}}%
+ \def\cjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1\hss}\vss}}%
+ \def\rjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1}\vss}}%
+ \def\stack##1{\let\\=\cr\tabskip=0pt\halign{\hfil ####\hfil\cr ##1\crcr}}%
+ \def\lstack##1{\hbox to0pt{\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\cstack##1{\hbox to0pt{\hss\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\rstack##1{\hbox to0pt{\vbox to0pt{\stack{##1}\vss}\hss}}%
+ \vss\hbox to#1\GNUPLOTunit\bgroup\ignorespaces}%
+ \gdef\endGNUPLOTpicture{\hss\egroup\egroup}%
+\fi
+\GNUPLOTunit=0.1bp
+\special{!
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: rand-gumbel.tex
+%%Creator: gnuplot 3.5 (pre 3.6) patchlevel beta 340
+%%CreationDate: Wed Sep 16 16:35:38 1998
+%%DocumentFonts:
+%%BoundingBox: 0 0 360 237
+%%Orientation: Landscape
+%%EndComments
+/gnudict 120 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+/vshift -33 def
+/dl {10 mul} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke gnulinewidth 2 mul setlinewidth } def
+/AL { stroke gnulinewidth 2 div setlinewidth } def
+/UL { gnulinewidth mul /userlinewidth exch def } def
+/PL { stroke userlinewidth setlinewidth } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 dl 2 dl] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 0 1 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 0 1 DL } def
+/LT2 { PL [2 dl 3 dl] 1 0 0 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/Pnt { stroke [] 0 setdash
+ gsave 1 setlinecap M 0 0 V stroke grestore } def
+/Dia { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt } def
+/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt } def
+/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt } def
+/Star { 2 copy Pls Crs } def
+/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill } def
+/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill } def
+/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt } def
+/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill } def
+/Pent { stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt } def
+/PentF { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore } def
+/Circle { stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt } def
+/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
+/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def
+/C1 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C2 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C3 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C4 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C5 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc } bind def
+/C6 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C7 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C8 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C9 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C11 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C12 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C13 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C14 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc } bind def
+/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath } bind def
+/Square { dup Rec } bind def
+/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
+/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
+/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
+/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
+/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill
+ Bsquare } bind def
+/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
+/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare } bind def
+/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare } bind def
+/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
+/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare } bind def
+/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
+/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
+/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
+/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
+/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
+/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
+/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
+/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
+/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
+/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
+/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
+/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
+/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
+/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
+/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
+/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
+/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
+/DiaE { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke } def
+/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke } def
+/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke } def
+/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke } def
+/PentE { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore } def
+/CircE { stroke [] 0 setdash
+ hpt 0 360 arc stroke } def
+/BoxFill { gsave Rec 1 setgray fill grestore } def
+end
+%%EndProlog
+}
+\GNUPLOTpicture(3600,2376)
+\special{"
+gnudict begin
+gsave
+0 0 translate
+0.100 0.100 scale
+0 setgray
+newpath
+LTb
+450 400 M
+63 0 V
+3037 0 R
+-63 0 V
+450 647 M
+63 0 V
+3037 0 R
+-63 0 V
+450 893 M
+63 0 V
+3037 0 R
+-63 0 V
+450 1140 M
+63 0 V
+3037 0 R
+-63 0 V
+450 1386 M
+63 0 V
+3037 0 R
+-63 0 V
+450 1633 M
+63 0 V
+3037 0 R
+-63 0 V
+450 1879 M
+63 0 V
+3037 0 R
+-63 0 V
+450 2126 M
+63 0 V
+3037 0 R
+-63 0 V
+450 400 M
+0 63 V
+0 1663 R
+0 -63 V
+838 400 M
+0 63 V
+0 1663 R
+0 -63 V
+1225 400 M
+0 63 V
+0 1663 R
+0 -63 V
+1613 400 M
+0 63 V
+0 1663 R
+0 -63 V
+2000 400 M
+0 63 V
+0 1663 R
+0 -63 V
+2388 400 M
+0 63 V
+0 1663 R
+0 -63 V
+2775 400 M
+0 63 V
+0 1663 R
+0 -63 V
+3163 400 M
+0 63 V
+0 1663 R
+0 -63 V
+3550 400 M
+0 63 V
+0 1663 R
+0 -63 V
+LTb
+450 400 M
+3100 0 V
+0 1726 V
+-3100 0 V
+450 400 L
+1.000 UL
+LT0
+3187 2013 M
+263 0 V
+450 411 M
+10 1 V
+11 1 V
+10 1 V
+10 2 V
+11 1 V
+10 1 V
+11 2 V
+10 1 V
+10 2 V
+11 2 V
+10 2 V
+10 2 V
+11 2 V
+10 2 V
+11 2 V
+10 3 V
+10 2 V
+11 3 V
+10 3 V
+10 3 V
+11 3 V
+10 3 V
+10 4 V
+11 3 V
+10 4 V
+11 4 V
+10 4 V
+10 4 V
+11 4 V
+10 5 V
+10 4 V
+11 5 V
+10 5 V
+11 5 V
+10 6 V
+10 5 V
+11 6 V
+10 6 V
+10 6 V
+11 6 V
+10 6 V
+10 7 V
+11 6 V
+10 7 V
+11 7 V
+10 8 V
+10 7 V
+11 7 V
+10 8 V
+10 8 V
+11 8 V
+10 8 V
+10 8 V
+11 9 V
+10 8 V
+11 9 V
+10 9 V
+10 9 V
+11 9 V
+10 9 V
+10 9 V
+11 9 V
+10 10 V
+11 9 V
+10 10 V
+10 10 V
+11 10 V
+10 9 V
+10 10 V
+11 10 V
+10 10 V
+10 10 V
+11 11 V
+10 10 V
+11 10 V
+10 10 V
+10 10 V
+11 10 V
+10 11 V
+10 10 V
+11 10 V
+10 10 V
+11 10 V
+10 10 V
+10 10 V
+11 10 V
+10 10 V
+10 10 V
+11 10 V
+10 10 V
+10 9 V
+11 10 V
+10 9 V
+11 10 V
+10 9 V
+10 9 V
+11 9 V
+10 9 V
+10 9 V
+11 9 V
+10 8 V
+11 9 V
+10 8 V
+10 8 V
+11 8 V
+10 8 V
+10 8 V
+11 7 V
+10 8 V
+10 7 V
+11 7 V
+10 7 V
+11 7 V
+10 6 V
+10 7 V
+11 6 V
+10 6 V
+10 6 V
+11 5 V
+10 6 V
+11 5 V
+10 5 V
+10 5 V
+11 5 V
+10 4 V
+10 5 V
+11 4 V
+10 4 V
+10 3 V
+11 4 V
+10 3 V
+11 4 V
+10 3 V
+10 2 V
+11 3 V
+10 2 V
+10 3 V
+11 2 V
+10 2 V
+11 1 V
+10 2 V
+10 1 V
+11 2 V
+10 1 V
+10 0 V
+11 1 V
+10 1 V
+10 0 V
+11 0 V
+10 0 V
+11 0 V
+10 0 V
+10 -1 V
+11 -1 V
+10 0 V
+10 -1 V
+11 -1 V
+10 -2 V
+10 -1 V
+11 -1 V
+10 -2 V
+11 -2 V
+10 -2 V
+10 -2 V
+11 -2 V
+10 -2 V
+10 -3 V
+11 -2 V
+10 -3 V
+11 -3 V
+10 -2 V
+10 -3 V
+11 -4 V
+10 -3 V
+10 -3 V
+11 -3 V
+10 -4 V
+10 -3 V
+11 -4 V
+10 -4 V
+11 -4 V
+10 -3 V
+10 -4 V
+11 -5 V
+10 -4 V
+10 -4 V
+11 -4 V
+10 -4 V
+11 -5 V
+10 -4 V
+10 -5 V
+11 -4 V
+10 -5 V
+10 -5 V
+11 -4 V
+10 -5 V
+10 -5 V
+11 -5 V
+10 -5 V
+11 -5 V
+10 -5 V
+10 -5 V
+11 -5 V
+10 -5 V
+10 -5 V
+11 -5 V
+10 -5 V
+11 -5 V
+10 -6 V
+10 -5 V
+11 -5 V
+10 -5 V
+10 -5 V
+11 -6 V
+10 -5 V
+10 -5 V
+11 -6 V
+10 -5 V
+11 -5 V
+10 -6 V
+10 -5 V
+11 -5 V
+10 -5 V
+10 -6 V
+11 -5 V
+10 -5 V
+11 -6 V
+10 -5 V
+10 -5 V
+11 -6 V
+10 -5 V
+10 -5 V
+11 -5 V
+10 -6 V
+10 -5 V
+11 -5 V
+10 -5 V
+11 -5 V
+10 -5 V
+10 -6 V
+11 -5 V
+10 -5 V
+10 -5 V
+11 -5 V
+10 -5 V
+11 -5 V
+10 -5 V
+10 -5 V
+11 -5 V
+10 -5 V
+10 -5 V
+11 -4 V
+10 -5 V
+10 -5 V
+11 -5 V
+10 -5 V
+11 -4 V
+10 -5 V
+10 -5 V
+11 -4 V
+10 -5 V
+10 -5 V
+11 -4 V
+10 -5 V
+10 -4 V
+11 -5 V
+10 -4 V
+11 -4 V
+10 -5 V
+10 -4 V
+11 -4 V
+10 -5 V
+10 -4 V
+11 -4 V
+10 -4 V
+11 -4 V
+10 -5 V
+10 -4 V
+11 -4 V
+10 -4 V
+10 -4 V
+11 -4 V
+10 -3 V
+10 -4 V
+11 -4 V
+10 -4 V
+11 -4 V
+10 -4 V
+10 -3 V
+11 -4 V
+10 -4 V
+10 -3 V
+11 -4 V
+10 -3 V
+11 -4 V
+10 -3 V
+10 -4 V
+11 -3 V
+10 -4 V
+1.000 UL
+LT1
+3187 1913 M
+263 0 V
+450 400 M
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+11 0 V
+10 0 V
+11 0 V
+10 0 V
+10 0 V
+11 0 V
+10 1 V
+10 2 V
+11 8 V
+10 18 V
+10 29 V
+11 43 V
+10 56 V
+11 66 V
+10 75 V
+10 80 V
+11 83 V
+10 84 V
+10 83 V
+11 80 V
+10 76 V
+11 71 V
+10 66 V
+10 61 V
+11 55 V
+10 49 V
+10 44 V
+11 39 V
+10 33 V
+10 29 V
+11 25 V
+10 21 V
+11 17 V
+10 14 V
+10 10 V
+11 8 V
+10 5 V
+10 3 V
+11 1 V
+10 -1 V
+11 -3 V
+10 -5 V
+10 -5 V
+11 -7 V
+10 -8 V
+10 -9 V
+11 -10 V
+10 -10 V
+10 -11 V
+11 -12 V
+10 -12 V
+11 -12 V
+10 -13 V
+10 -13 V
+11 -14 V
+10 -13 V
+10 -14 V
+11 -14 V
+10 -13 V
+11 -14 V
+10 -14 V
+10 -14 V
+11 -14 V
+10 -13 V
+10 -14 V
+11 -14 V
+10 -13 V
+10 -14 V
+11 -13 V
+10 -13 V
+11 -13 V
+10 -13 V
+10 -13 V
+11 -12 V
+10 -13 V
+10 -12 V
+11 -12 V
+10 -12 V
+11 -12 V
+10 -11 V
+10 -12 V
+11 -11 V
+10 -11 V
+10 -11 V
+11 -11 V
+10 -10 V
+10 -11 V
+11 -10 V
+10 -10 V
+11 -10 V
+10 -10 V
+10 -10 V
+11 -9 V
+10 -9 V
+10 -10 V
+11 -9 V
+10 -8 V
+11 -9 V
+10 -9 V
+10 -8 V
+11 -8 V
+10 -9 V
+10 -8 V
+11 -8 V
+10 -7 V
+10 -8 V
+11 -8 V
+10 -7 V
+11 -7 V
+10 -7 V
+10 -7 V
+11 -7 V
+10 -7 V
+10 -7 V
+11 -6 V
+10 -7 V
+10 -6 V
+11 -7 V
+10 -6 V
+11 -6 V
+10 -6 V
+10 -6 V
+11 -6 V
+10 -5 V
+10 -6 V
+11 -5 V
+10 -6 V
+11 -5 V
+10 -5 V
+10 -6 V
+11 -5 V
+10 -5 V
+10 -5 V
+11 -5 V
+10 -4 V
+10 -5 V
+11 -5 V
+10 -4 V
+11 -5 V
+10 -4 V
+10 -5 V
+11 -4 V
+10 -4 V
+10 -4 V
+11 -5 V
+10 -4 V
+11 -4 V
+10 -4 V
+10 -4 V
+11 -3 V
+10 -4 V
+stroke
+grestore
+end
+showpage
+}
+\put(3137,1913){\rjust{Type 2, $a=1,b=1$}}
+\put(3137,2013){\rjust{Type 1, $a=1,b=1$}}
+\put(2000,2276){\cjust{Gumbel Distributions}}
+\put(2000,150){\cjust{$x$}}
+\put(100,1263){%
+\special{ps: gsave currentpoint currentpoint translate
+270 rotate neg exch neg exch translate}%
+\cstack{$p(x)$}%
+\special{ps: currentpoint grestore moveto}%
+}
+\put(3550,300){\cjust{2}}
+\put(3163,300){\cjust{1.5}}
+\put(2775,300){\cjust{1}}
+\put(2388,300){\cjust{0.5}}
+\put(2000,300){\cjust{0}}
+\put(1613,300){\cjust{-0.5}}
+\put(1225,300){\cjust{-1}}
+\put(838,300){\cjust{-1.5}}
+\put(450,300){\cjust{-2}}
+\put(400,2126){\rjust{0.7}}
+\put(400,1879){\rjust{0.6}}
+\put(400,1633){\rjust{0.5}}
+\put(400,1386){\rjust{0.4}}
+\put(400,1140){\rjust{0.3}}
+\put(400,893){\rjust{0.2}}
+\put(400,647){\rjust{0.1}}
+\put(400,400){\rjust{0}}
+\endGNUPLOTpicture
diff --git a/gsl-1.9/doc/rand-gumbel1.tex b/gsl-1.9/doc/rand-gumbel1.tex
new file mode 100644
index 0000000..8152e77
--- /dev/null
+++ b/gsl-1.9/doc/rand-gumbel1.tex
@@ -0,0 +1,733 @@
+% GNUPLOT: plain TeX with Postscript
+\begingroup
+ \catcode`\@=11\relax
+ \def\GNUPLOTspecial{%
+ \def\do##1{\catcode`##1=12\relax}\dospecials
+ \catcode`\{=1\catcode`\}=2\catcode\%=14\relax\special}%
+%
+\expandafter\ifx\csname GNUPLOTpicture\endcsname\relax
+ \csname newdimen\endcsname\GNUPLOTunit
+ \gdef\GNUPLOTpicture(#1,#2){\vbox to#2\GNUPLOTunit\bgroup
+ \def\put(##1,##2)##3{\unskip\raise##2\GNUPLOTunit
+ \hbox to0pt{\kern##1\GNUPLOTunit ##3\hss}\ignorespaces}%
+ \def\ljust##1{\vbox to0pt{\vss\hbox to0pt{##1\hss}\vss}}%
+ \def\cjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1\hss}\vss}}%
+ \def\rjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1}\vss}}%
+ \def\stack##1{\let\\=\cr\tabskip=0pt\halign{\hfil ####\hfil\cr ##1\crcr}}%
+ \def\lstack##1{\hbox to0pt{\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\cstack##1{\hbox to0pt{\hss\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\rstack##1{\hbox to0pt{\vbox to0pt{\stack{##1}\vss}\hss}}%
+ \vss\hbox to#1\GNUPLOTunit\bgroup\ignorespaces}%
+ \gdef\endGNUPLOTpicture{\hss\egroup\egroup}%
+\fi
+\GNUPLOTunit=0.1bp
+\GNUPLOTpicture(3600,2376)
+{\GNUPLOTspecial{"
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: rand-gumbel1.tex
+%%Creator: gnuplot 4.0 patchlevel 0
+%%CreationDate: Wed Aug 31 12:38:29 2005
+%%DocumentFonts:
+%%BoundingBox: 0 0 360 237
+%%Orientation: Landscape
+%%EndComments
+/gnudict 256 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+/vshift -33 def
+/dl {10.0 mul} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+/Rounded false def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/N {newpath moveto} bind def
+/C {setrgbcolor} bind def
+/f {rlineto fill} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke userlinewidth 2 mul setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/AL { stroke userlinewidth 2 div setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/UL { dup gnulinewidth mul /userlinewidth exch def
+ dup 1 lt {pop 1} if 10 mul /udl exch def } def
+/PL { stroke userlinewidth setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/LTw { PL [] 1 setgray } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 1 0 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
+/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/Pnt { stroke [] 0 setdash
+ gsave 1 setlinecap M 0 0 V stroke grestore } def
+/Dia { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt } def
+/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt } def
+/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt } def
+/Star { 2 copy Pls Crs } def
+/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill } def
+/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill } def
+/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt } def
+/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill } def
+/Pent { stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt } def
+/PentF { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore } def
+/Circle { stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt } def
+/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
+/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def
+/C1 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C2 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C3 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C4 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C5 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc } bind def
+/C6 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C7 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C8 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C9 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C11 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C12 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C13 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C14 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc } bind def
+/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath } bind def
+/Square { dup Rec } bind def
+/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
+/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
+/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
+/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
+/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill
+ Bsquare } bind def
+/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
+/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare } bind def
+/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare } bind def
+/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
+/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare } bind def
+/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
+/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
+/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
+/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
+/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
+/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
+/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
+/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
+/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
+/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
+/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
+/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
+/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
+/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
+/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
+/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
+/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
+/DiaE { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke } def
+/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke } def
+/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke } def
+/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke } def
+/PentE { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore } def
+/CircE { stroke [] 0 setdash
+ hpt 0 360 arc stroke } def
+/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def
+/DiaW { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke } def
+/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke } def
+/TriUW { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke } def
+/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke } def
+/PentW { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore } def
+/CircW { stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke } def
+/BoxFill { gsave Rec 1 setgray fill grestore } def
+/BoxColFill {
+ gsave Rec
+ /Fillden exch def
+ currentrgbcolor
+ /ColB exch def /ColG exch def /ColR exch def
+ /ColR ColR Fillden mul Fillden sub 1 add def
+ /ColG ColG Fillden mul Fillden sub 1 add def
+ /ColB ColB Fillden mul Fillden sub 1 add def
+ ColR ColG ColB setrgbcolor
+ fill grestore } def
+%
+% PostScript Level 1 Pattern Fill routine
+% Usage: x y w h s a XX PatternFill
+% x,y = lower left corner of box to be filled
+% w,h = width and height of box
+% a = angle in degrees between lines and x-axis
+% XX = 0/1 for no/yes cross-hatch
+%
+/PatternFill { gsave /PFa [ 9 2 roll ] def
+ PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
+ PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
+ gsave 1 setgray fill grestore clip
+ currentlinewidth 0.5 mul setlinewidth
+ /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
+ 0 0 M PFa 5 get rotate PFs -2 div dup translate
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 M 0 PFs V } for
+ 0 PFa 6 get ne {
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 2 1 roll M PFs 0 V } for
+ } if
+ stroke grestore } def
+%
+/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
+dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
+currentdict end definefont pop
+end
+%%EndProlog
+gnudict begin
+gsave
+0 0 translate
+0.100 0.100 scale
+0 setgray
+newpath
+0.500 UL
+LTb
+481 331 M
+-31 0 V
+0.500 UL
+LTb
+481 680 M
+-31 0 V
+0.500 UL
+LTb
+481 1029 M
+-31 0 V
+0.500 UL
+LTb
+481 1378 M
+-31 0 V
+0.500 UL
+LTb
+481 1727 M
+-31 0 V
+0.500 UL
+LTb
+481 2076 M
+-31 0 V
+0.500 UL
+LTb
+481 331 M
+0 -31 V
+0.500 UL
+LTb
+905 331 M
+0 -31 V
+0.500 UL
+LTb
+1329 331 M
+0 -31 V
+0.500 UL
+LTb
+1753 331 M
+0 -31 V
+0.500 UL
+LTb
+2178 331 M
+0 -31 V
+0.500 UL
+LTb
+2602 331 M
+0 -31 V
+0.500 UL
+LTb
+3026 331 M
+0 -31 V
+0.500 UL
+LTb
+3450 331 M
+0 -31 V
+0.500 UL
+LTb
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+LTb
+LTb
+LTb
+1.000 UP
+1.000 UL
+LT0
+LTb
+LT0
+3087 1963 M
+263 0 V
+481 347 M
+10 2 V
+10 3 V
+10 4 V
+10 3 V
+10 4 V
+10 4 V
+10 5 V
+9 6 V
+10 6 V
+10 6 V
+10 7 V
+10 8 V
+10 8 V
+10 9 V
+10 9 V
+10 10 V
+10 11 V
+10 12 V
+10 12 V
+10 13 V
+10 14 V
+9 14 V
+10 16 V
+10 16 V
+10 16 V
+10 18 V
+10 18 V
+10 19 V
+10 19 V
+10 21 V
+10 20 V
+10 22 V
+10 22 V
+10 22 V
+10 23 V
+9 23 V
+10 24 V
+10 24 V
+10 24 V
+10 25 V
+10 25 V
+10 25 V
+10 25 V
+10 25 V
+10 26 V
+10 25 V
+10 25 V
+10 25 V
+10 25 V
+9 24 V
+10 25 V
+10 24 V
+10 23 V
+10 24 V
+10 22 V
+10 23 V
+10 21 V
+10 22 V
+10 20 V
+10 20 V
+10 19 V
+10 19 V
+10 18 V
+10 17 V
+9 17 V
+10 15 V
+10 15 V
+10 15 V
+10 13 V
+10 12 V
+10 12 V
+10 11 V
+10 10 V
+10 10 V
+10 8 V
+10 8 V
+10 6 V
+10 6 V
+9 6 V
+10 4 V
+10 4 V
+10 3 V
+10 2 V
+10 1 V
+10 1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -3 V
+10 -4 V
+10 -3 V
+9 -5 V
+10 -5 V
+10 -6 V
+10 -6 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -8 V
+10 -9 V
+10 -9 V
+stroke
+1494 1532 M
+10 -9 V
+10 -9 V
+10 -10 V
+10 -11 V
+9 -10 V
+10 -11 V
+10 -11 V
+10 -11 V
+10 -12 V
+10 -12 V
+10 -12 V
+10 -12 V
+10 -12 V
+10 -13 V
+10 -12 V
+10 -13 V
+10 -13 V
+10 -13 V
+10 -13 V
+9 -13 V
+10 -13 V
+10 -13 V
+10 -13 V
+10 -13 V
+10 -13 V
+10 -13 V
+10 -14 V
+10 -13 V
+10 -13 V
+10 -13 V
+10 -13 V
+10 -13 V
+10 -13 V
+9 -12 V
+10 -13 V
+10 -13 V
+10 -12 V
+10 -13 V
+10 -12 V
+10 -13 V
+10 -12 V
+10 -12 V
+10 -12 V
+10 -12 V
+10 -11 V
+10 -12 V
+10 -11 V
+9 -12 V
+10 -11 V
+10 -11 V
+10 -11 V
+10 -11 V
+10 -10 V
+10 -11 V
+10 -10 V
+10 -10 V
+10 -11 V
+10 -10 V
+10 -9 V
+10 -10 V
+10 -10 V
+9 -9 V
+10 -9 V
+10 -9 V
+10 -9 V
+10 -9 V
+10 -9 V
+10 -8 V
+10 -9 V
+10 -8 V
+10 -8 V
+10 -8 V
+10 -8 V
+10 -8 V
+10 -7 V
+9 -8 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -6 V
+10 -7 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -6 V
+9 -6 V
+10 -5 V
+10 -5 V
+10 -6 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -5 V
+stroke
+2527 526 M
+9 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+9 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+9 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+9 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+9 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+9 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+1.000 UP
+stroke
+grestore
+end
+showpage
+}}%
+\put(3037,1963){\rjust{Type 1, $a=1,b=1$}}%
+\put(1965,2226){\cjust{Type 1 Gumbel Distribution}}%
+\put(1965,50){\cjust{$x$}}%
+\put(100,1203){%
+\special{ps: gsave currentpoint currentpoint translate
+270 rotate neg exch neg exch translate}%
+\cstack{$p(x)$}%
+\special{ps: currentpoint grestore moveto}%
+}%
+\put(3450,200){\cjust{ 5}}%
+\put(3026,200){\cjust{ 4}}%
+\put(2602,200){\cjust{ 3}}%
+\put(2178,200){\cjust{ 2}}%
+\put(1753,200){\cjust{ 1}}%
+\put(1329,200){\cjust{ 0}}%
+\put(905,200){\cjust{-1}}%
+\put(481,200){\cjust{-2}}%
+\put(400,2076){\rjust{ 0.5}}%
+\put(400,1727){\rjust{ 0.4}}%
+\put(400,1378){\rjust{ 0.3}}%
+\put(400,1029){\rjust{ 0.2}}%
+\put(400,680){\rjust{ 0.1}}%
+\put(400,331){\rjust{ 0}}%
+\endGNUPLOTpicture
+\endgroup
+\endinput
diff --git a/gsl-1.9/doc/rand-gumbel2.tex b/gsl-1.9/doc/rand-gumbel2.tex
new file mode 100644
index 0000000..03ae743
--- /dev/null
+++ b/gsl-1.9/doc/rand-gumbel2.tex
@@ -0,0 +1,728 @@
+% GNUPLOT: plain TeX with Postscript
+\begingroup
+ \catcode`\@=11\relax
+ \def\GNUPLOTspecial{%
+ \def\do##1{\catcode`##1=12\relax}\dospecials
+ \catcode`\{=1\catcode`\}=2\catcode\%=14\relax\special}%
+%
+\expandafter\ifx\csname GNUPLOTpicture\endcsname\relax
+ \csname newdimen\endcsname\GNUPLOTunit
+ \gdef\GNUPLOTpicture(#1,#2){\vbox to#2\GNUPLOTunit\bgroup
+ \def\put(##1,##2)##3{\unskip\raise##2\GNUPLOTunit
+ \hbox to0pt{\kern##1\GNUPLOTunit ##3\hss}\ignorespaces}%
+ \def\ljust##1{\vbox to0pt{\vss\hbox to0pt{##1\hss}\vss}}%
+ \def\cjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1\hss}\vss}}%
+ \def\rjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1}\vss}}%
+ \def\stack##1{\let\\=\cr\tabskip=0pt\halign{\hfil ####\hfil\cr ##1\crcr}}%
+ \def\lstack##1{\hbox to0pt{\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\cstack##1{\hbox to0pt{\hss\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\rstack##1{\hbox to0pt{\vbox to0pt{\stack{##1}\vss}\hss}}%
+ \vss\hbox to#1\GNUPLOTunit\bgroup\ignorespaces}%
+ \gdef\endGNUPLOTpicture{\hss\egroup\egroup}%
+\fi
+\GNUPLOTunit=0.1bp
+\GNUPLOTpicture(3600,2376)
+{\GNUPLOTspecial{"
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: rand-gumbel2.tex
+%%Creator: gnuplot 4.0 patchlevel 0
+%%CreationDate: Wed Aug 31 12:38:29 2005
+%%DocumentFonts:
+%%BoundingBox: 0 0 360 237
+%%Orientation: Landscape
+%%EndComments
+/gnudict 256 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+/vshift -33 def
+/dl {10.0 mul} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+/Rounded false def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/N {newpath moveto} bind def
+/C {setrgbcolor} bind def
+/f {rlineto fill} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke userlinewidth 2 mul setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/AL { stroke userlinewidth 2 div setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/UL { dup gnulinewidth mul /userlinewidth exch def
+ dup 1 lt {pop 1} if 10 mul /udl exch def } def
+/PL { stroke userlinewidth setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/LTw { PL [] 1 setgray } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 1 0 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
+/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/Pnt { stroke [] 0 setdash
+ gsave 1 setlinecap M 0 0 V stroke grestore } def
+/Dia { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt } def
+/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt } def
+/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt } def
+/Star { 2 copy Pls Crs } def
+/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill } def
+/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill } def
+/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt } def
+/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill } def
+/Pent { stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt } def
+/PentF { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore } def
+/Circle { stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt } def
+/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
+/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def
+/C1 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C2 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C3 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C4 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C5 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc } bind def
+/C6 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C7 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C8 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C9 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C11 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C12 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C13 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C14 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc } bind def
+/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath } bind def
+/Square { dup Rec } bind def
+/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
+/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
+/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
+/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
+/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill
+ Bsquare } bind def
+/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
+/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare } bind def
+/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare } bind def
+/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
+/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare } bind def
+/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
+/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
+/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
+/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
+/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
+/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
+/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
+/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
+/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
+/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
+/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
+/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
+/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
+/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
+/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
+/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
+/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
+/DiaE { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke } def
+/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke } def
+/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke } def
+/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke } def
+/PentE { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore } def
+/CircE { stroke [] 0 setdash
+ hpt 0 360 arc stroke } def
+/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def
+/DiaW { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke } def
+/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke } def
+/TriUW { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke } def
+/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke } def
+/PentW { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore } def
+/CircW { stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke } def
+/BoxFill { gsave Rec 1 setgray fill grestore } def
+/BoxColFill {
+ gsave Rec
+ /Fillden exch def
+ currentrgbcolor
+ /ColB exch def /ColG exch def /ColR exch def
+ /ColR ColR Fillden mul Fillden sub 1 add def
+ /ColG ColG Fillden mul Fillden sub 1 add def
+ /ColB ColB Fillden mul Fillden sub 1 add def
+ ColR ColG ColB setrgbcolor
+ fill grestore } def
+%
+% PostScript Level 1 Pattern Fill routine
+% Usage: x y w h s a XX PatternFill
+% x,y = lower left corner of box to be filled
+% w,h = width and height of box
+% a = angle in degrees between lines and x-axis
+% XX = 0/1 for no/yes cross-hatch
+%
+/PatternFill { gsave /PFa [ 9 2 roll ] def
+ PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
+ PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
+ gsave 1 setgray fill grestore clip
+ currentlinewidth 0.5 mul setlinewidth
+ /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
+ 0 0 M PFa 5 get rotate PFs -2 div dup translate
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 M 0 PFs V } for
+ 0 PFa 6 get ne {
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 2 1 roll M PFs 0 V } for
+ } if
+ stroke grestore } def
+%
+/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
+dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
+currentdict end definefont pop
+end
+%%EndProlog
+gnudict begin
+gsave
+0 0 translate
+0.100 0.100 scale
+0 setgray
+newpath
+0.500 UL
+LTb
+481 331 M
+-31 0 V
+0.500 UL
+LTb
+481 580 M
+-31 0 V
+0.500 UL
+LTb
+481 830 M
+-31 0 V
+0.500 UL
+LTb
+481 1079 M
+-31 0 V
+0.500 UL
+LTb
+481 1328 M
+-31 0 V
+0.500 UL
+LTb
+481 1577 M
+-31 0 V
+0.500 UL
+LTb
+481 1827 M
+-31 0 V
+0.500 UL
+LTb
+481 2076 M
+-31 0 V
+0.500 UL
+LTb
+481 331 M
+0 -31 V
+0.500 UL
+LTb
+1223 331 M
+0 -31 V
+0.500 UL
+LTb
+1966 331 M
+0 -31 V
+0.500 UL
+LTb
+2708 331 M
+0 -31 V
+0.500 UL
+LTb
+3450 331 M
+0 -31 V
+0.500 UL
+LTb
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+LTb
+LTb
+LTb
+1.000 UP
+1.000 UL
+LT0
+LTb
+LT0
+3087 1963 M
+263 0 V
+481 331 M
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 1 V
+10 1 V
+10 1 V
+10 4 V
+10 5 V
+10 7 V
+10 10 V
+10 13 V
+10 17 V
+10 20 V
+10 23 V
+9 27 V
+10 29 V
+10 33 V
+10 34 V
+10 37 V
+10 39 V
+10 40 V
+10 41 V
+10 42 V
+10 42 V
+10 43 V
+10 42 V
+10 42 V
+10 42 V
+9 41 V
+10 40 V
+10 39 V
+10 38 V
+10 36 V
+10 36 V
+10 34 V
+10 32 V
+10 32 V
+10 30 V
+10 28 V
+10 27 V
+10 26 V
+10 24 V
+9 23 V
+10 21 V
+10 20 V
+10 19 V
+10 18 V
+10 17 V
+10 15 V
+10 14 V
+10 13 V
+10 12 V
+10 11 V
+10 10 V
+10 9 V
+10 8 V
+10 8 V
+9 6 V
+10 6 V
+10 5 V
+10 4 V
+10 4 V
+10 3 V
+10 2 V
+10 2 V
+10 1 V
+10 0 V
+10 0 V
+10 0 V
+10 -1 V
+10 -1 V
+9 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+9 -5 V
+10 -6 V
+10 -5 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -7 V
+10 -6 V
+10 -6 V
+stroke
+1494 1568 M
+10 -7 V
+10 -6 V
+10 -7 V
+10 -7 V
+9 -7 V
+10 -6 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+9 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -6 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -6 V
+10 -7 V
+10 -7 V
+9 -7 V
+10 -6 V
+10 -7 V
+10 -6 V
+10 -7 V
+10 -6 V
+10 -7 V
+10 -6 V
+10 -7 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -7 V
+10 -6 V
+9 -6 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -5 V
+10 -6 V
+10 -6 V
+10 -5 V
+10 -6 V
+9 -5 V
+10 -6 V
+10 -5 V
+10 -6 V
+10 -5 V
+10 -6 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -6 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+9 -5 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+9 -5 V
+10 -4 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+stroke
+2527 966 M
+9 -3 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -4 V
+9 -3 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+9 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+9 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+9 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+9 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+9 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+1.000 UP
+stroke
+grestore
+end
+showpage
+}}%
+\put(3037,1963){\rjust{Type 2, $a=1,b=1$}}%
+\put(1965,2226){\cjust{Type 2 Gumbel Distribution}}%
+\put(1965,50){\cjust{$x$}}%
+\put(100,1203){%
+\special{ps: gsave currentpoint currentpoint translate
+270 rotate neg exch neg exch translate}%
+\cstack{$p(x)$}%
+\special{ps: currentpoint grestore moveto}%
+}%
+\put(3450,200){\cjust{ 2}}%
+\put(2708,200){\cjust{ 1.5}}%
+\put(1966,200){\cjust{ 1}}%
+\put(1223,200){\cjust{ 0.5}}%
+\put(481,200){\cjust{ 0}}%
+\put(400,2076){\rjust{ 0.7}}%
+\put(400,1827){\rjust{ 0.6}}%
+\put(400,1577){\rjust{ 0.5}}%
+\put(400,1328){\rjust{ 0.4}}%
+\put(400,1079){\rjust{ 0.3}}%
+\put(400,830){\rjust{ 0.2}}%
+\put(400,580){\rjust{ 0.1}}%
+\put(400,331){\rjust{ 0}}%
+\endGNUPLOTpicture
+\endgroup
+\endinput
diff --git a/gsl-1.9/doc/rand-hypergeometric.tex b/gsl-1.9/doc/rand-hypergeometric.tex
new file mode 100644
index 0000000..63ba8b2
--- /dev/null
+++ b/gsl-1.9/doc/rand-hypergeometric.tex
@@ -0,0 +1,592 @@
+% GNUPLOT: plain TeX with Postscript
+\begingroup
+ \catcode`\@=11\relax
+ \def\GNUPLOTspecial{%
+ \def\do##1{\catcode`##1=12\relax}\dospecials
+ \catcode`\{=1\catcode`\}=2\catcode\%=14\relax\special}%
+%
+\expandafter\ifx\csname GNUPLOTpicture\endcsname\relax
+ \csname newdimen\endcsname\GNUPLOTunit
+ \gdef\GNUPLOTpicture(#1,#2){\vbox to#2\GNUPLOTunit\bgroup
+ \def\put(##1,##2)##3{\unskip\raise##2\GNUPLOTunit
+ \hbox to0pt{\kern##1\GNUPLOTunit ##3\hss}\ignorespaces}%
+ \def\ljust##1{\vbox to0pt{\vss\hbox to0pt{##1\hss}\vss}}%
+ \def\cjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1\hss}\vss}}%
+ \def\rjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1}\vss}}%
+ \def\stack##1{\let\\=\cr\tabskip=0pt\halign{\hfil ####\hfil\cr ##1\crcr}}%
+ \def\lstack##1{\hbox to0pt{\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\cstack##1{\hbox to0pt{\hss\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\rstack##1{\hbox to0pt{\vbox to0pt{\stack{##1}\vss}\hss}}%
+ \vss\hbox to#1\GNUPLOTunit\bgroup\ignorespaces}%
+ \gdef\endGNUPLOTpicture{\hss\egroup\egroup}%
+\fi
+\GNUPLOTunit=0.1bp
+\GNUPLOTpicture(3600,2376)
+{\GNUPLOTspecial{"
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: rand-hypergeometric.tex
+%%Creator: gnuplot 4.0 patchlevel 0
+%%CreationDate: Wed Aug 31 12:38:29 2005
+%%DocumentFonts:
+%%BoundingBox: 0 0 360 237
+%%Orientation: Landscape
+%%EndComments
+/gnudict 256 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+/vshift -33 def
+/dl {10.0 mul} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+/Rounded false def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/N {newpath moveto} bind def
+/C {setrgbcolor} bind def
+/f {rlineto fill} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke userlinewidth 2 mul setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/AL { stroke userlinewidth 2 div setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/UL { dup gnulinewidth mul /userlinewidth exch def
+ dup 1 lt {pop 1} if 10 mul /udl exch def } def
+/PL { stroke userlinewidth setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/LTw { PL [] 1 setgray } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 1 0 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
+/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/Pnt { stroke [] 0 setdash
+ gsave 1 setlinecap M 0 0 V stroke grestore } def
+/Dia { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt } def
+/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt } def
+/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt } def
+/Star { 2 copy Pls Crs } def
+/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill } def
+/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill } def
+/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt } def
+/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill } def
+/Pent { stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt } def
+/PentF { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore } def
+/Circle { stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt } def
+/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
+/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def
+/C1 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C2 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C3 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C4 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C5 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc } bind def
+/C6 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C7 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C8 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C9 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C11 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C12 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C13 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C14 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc } bind def
+/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath } bind def
+/Square { dup Rec } bind def
+/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
+/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
+/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
+/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
+/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill
+ Bsquare } bind def
+/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
+/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare } bind def
+/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare } bind def
+/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
+/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare } bind def
+/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
+/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
+/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
+/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
+/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
+/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
+/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
+/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
+/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
+/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
+/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
+/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
+/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
+/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
+/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
+/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
+/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
+/DiaE { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke } def
+/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke } def
+/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke } def
+/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke } def
+/PentE { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore } def
+/CircE { stroke [] 0 setdash
+ hpt 0 360 arc stroke } def
+/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def
+/DiaW { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke } def
+/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke } def
+/TriUW { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke } def
+/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke } def
+/PentW { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore } def
+/CircW { stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke } def
+/BoxFill { gsave Rec 1 setgray fill grestore } def
+/BoxColFill {
+ gsave Rec
+ /Fillden exch def
+ currentrgbcolor
+ /ColB exch def /ColG exch def /ColR exch def
+ /ColR ColR Fillden mul Fillden sub 1 add def
+ /ColG ColG Fillden mul Fillden sub 1 add def
+ /ColB ColB Fillden mul Fillden sub 1 add def
+ ColR ColG ColB setrgbcolor
+ fill grestore } def
+%
+% PostScript Level 1 Pattern Fill routine
+% Usage: x y w h s a XX PatternFill
+% x,y = lower left corner of box to be filled
+% w,h = width and height of box
+% a = angle in degrees between lines and x-axis
+% XX = 0/1 for no/yes cross-hatch
+%
+/PatternFill { gsave /PFa [ 9 2 roll ] def
+ PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
+ PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
+ gsave 1 setgray fill grestore clip
+ currentlinewidth 0.5 mul setlinewidth
+ /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
+ 0 0 M PFa 5 get rotate PFs -2 div dup translate
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 M 0 PFs V } for
+ 0 PFa 6 get ne {
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 2 1 roll M PFs 0 V } for
+ } if
+ stroke grestore } def
+%
+/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
+dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
+currentdict end definefont pop
+end
+%%EndProlog
+gnudict begin
+gsave
+0 0 translate
+0.100 0.100 scale
+0 setgray
+newpath
+0.500 UL
+LTb
+481 331 M
+-31 0 V
+0.500 UL
+LTb
+481 580 M
+-31 0 V
+0.500 UL
+LTb
+481 830 M
+-31 0 V
+0.500 UL
+LTb
+481 1079 M
+-31 0 V
+0.500 UL
+LTb
+481 1328 M
+-31 0 V
+0.500 UL
+LTb
+481 1577 M
+-31 0 V
+0.500 UL
+LTb
+481 1827 M
+-31 0 V
+0.500 UL
+LTb
+481 2076 M
+-31 0 V
+0.500 UL
+LTb
+481 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+751 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+1021 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+1291 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+1561 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+1831 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+2100 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+2370 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+2640 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+2910 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+3180 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+3450 331 M
+0 -63 V
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+LTb
+LTb
+LTb
+1.000 UP
+1.000 UL
+LT0
+LTb
+LT0
+3087 1963 M
+263 0 V
+481 1567 M
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0 -206 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0 -813 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+0 -206 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+stroke
+1464 342 M
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+1.000 UP
+stroke
+grestore
+end
+showpage
+}}%
+\put(3037,1963){\rjust{$n1=5, n2=20, t=3$}}%
+\put(1965,2226){\cjust{Hypergeometric Distribution}}%
+\put(1965,50){\cjust{$k$}}%
+\put(100,1203){%
+\special{ps: gsave currentpoint currentpoint translate
+270 rotate neg exch neg exch translate}%
+\cstack{$p(k)$}%
+\special{ps: currentpoint grestore moveto}%
+}%
+\put(3315,200){\cjust{ 10}}%
+\put(3045,200){\cjust{ 9}}%
+\put(2775,200){\cjust{ 8}}%
+\put(2505,200){\cjust{ 7}}%
+\put(2235,200){\cjust{ 6}}%
+\put(1966,200){\cjust{ 5}}%
+\put(1696,200){\cjust{ 4}}%
+\put(1426,200){\cjust{ 3}}%
+\put(1156,200){\cjust{ 2}}%
+\put(886,200){\cjust{ 1}}%
+\put(616,200){\cjust{ 0}}%
+\put(400,2076){\rjust{ 0.7}}%
+\put(400,1827){\rjust{ 0.6}}%
+\put(400,1577){\rjust{ 0.5}}%
+\put(400,1328){\rjust{ 0.4}}%
+\put(400,1079){\rjust{ 0.3}}%
+\put(400,830){\rjust{ 0.2}}%
+\put(400,580){\rjust{ 0.1}}%
+\put(400,331){\rjust{ 0}}%
+\endGNUPLOTpicture
+\endgroup
+\endinput
diff --git a/gsl-1.9/doc/rand-landau.tex b/gsl-1.9/doc/rand-landau.tex
new file mode 100644
index 0000000..cb3a410
--- /dev/null
+++ b/gsl-1.9/doc/rand-landau.tex
@@ -0,0 +1,602 @@
+% GNUPLOT: plain TeX with Postscript
+\begingroup
+ \catcode`\@=11\relax
+ \def\GNUPLOTspecial{%
+ \def\do##1{\catcode`##1=12\relax}\dospecials
+ \catcode`\{=1\catcode`\}=2\catcode\%=14\relax\special}%
+%
+\expandafter\ifx\csname GNUPLOTpicture\endcsname\relax
+ \csname newdimen\endcsname\GNUPLOTunit
+ \gdef\GNUPLOTpicture(#1,#2){\vbox to#2\GNUPLOTunit\bgroup
+ \def\put(##1,##2)##3{\unskip\raise##2\GNUPLOTunit
+ \hbox to0pt{\kern##1\GNUPLOTunit ##3\hss}\ignorespaces}%
+ \def\ljust##1{\vbox to0pt{\vss\hbox to0pt{##1\hss}\vss}}%
+ \def\cjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1\hss}\vss}}%
+ \def\rjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1}\vss}}%
+ \def\stack##1{\let\\=\cr\tabskip=0pt\halign{\hfil ####\hfil\cr ##1\crcr}}%
+ \def\lstack##1{\hbox to0pt{\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\cstack##1{\hbox to0pt{\hss\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\rstack##1{\hbox to0pt{\vbox to0pt{\stack{##1}\vss}\hss}}%
+ \vss\hbox to#1\GNUPLOTunit\bgroup\ignorespaces}%
+ \gdef\endGNUPLOTpicture{\hss\egroup\egroup}%
+\fi
+\GNUPLOTunit=0.1bp
+\GNUPLOTpicture(3600,2376)
+{\GNUPLOTspecial{"
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: rand-landau.tex
+%%Creator: gnuplot 4.0 patchlevel 0
+%%CreationDate: Wed Aug 31 12:38:29 2005
+%%DocumentFonts:
+%%BoundingBox: 0 0 360 237
+%%Orientation: Landscape
+%%EndComments
+/gnudict 256 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+/vshift -33 def
+/dl {10.0 mul} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+/Rounded false def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/N {newpath moveto} bind def
+/C {setrgbcolor} bind def
+/f {rlineto fill} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke userlinewidth 2 mul setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/AL { stroke userlinewidth 2 div setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/UL { dup gnulinewidth mul /userlinewidth exch def
+ dup 1 lt {pop 1} if 10 mul /udl exch def } def
+/PL { stroke userlinewidth setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/LTw { PL [] 1 setgray } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 1 0 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
+/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/Pnt { stroke [] 0 setdash
+ gsave 1 setlinecap M 0 0 V stroke grestore } def
+/Dia { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt } def
+/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt } def
+/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt } def
+/Star { 2 copy Pls Crs } def
+/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill } def
+/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill } def
+/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt } def
+/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill } def
+/Pent { stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt } def
+/PentF { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore } def
+/Circle { stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt } def
+/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
+/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def
+/C1 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C2 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C3 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C4 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C5 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc } bind def
+/C6 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C7 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C8 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C9 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C11 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C12 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C13 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C14 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc } bind def
+/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath } bind def
+/Square { dup Rec } bind def
+/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
+/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
+/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
+/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
+/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill
+ Bsquare } bind def
+/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
+/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare } bind def
+/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare } bind def
+/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
+/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare } bind def
+/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
+/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
+/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
+/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
+/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
+/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
+/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
+/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
+/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
+/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
+/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
+/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
+/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
+/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
+/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
+/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
+/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
+/DiaE { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke } def
+/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke } def
+/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke } def
+/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke } def
+/PentE { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore } def
+/CircE { stroke [] 0 setdash
+ hpt 0 360 arc stroke } def
+/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def
+/DiaW { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke } def
+/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke } def
+/TriUW { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke } def
+/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke } def
+/PentW { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore } def
+/CircW { stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke } def
+/BoxFill { gsave Rec 1 setgray fill grestore } def
+/BoxColFill {
+ gsave Rec
+ /Fillden exch def
+ currentrgbcolor
+ /ColB exch def /ColG exch def /ColR exch def
+ /ColR ColR Fillden mul Fillden sub 1 add def
+ /ColG ColG Fillden mul Fillden sub 1 add def
+ /ColB ColB Fillden mul Fillden sub 1 add def
+ ColR ColG ColB setrgbcolor
+ fill grestore } def
+%
+% PostScript Level 1 Pattern Fill routine
+% Usage: x y w h s a XX PatternFill
+% x,y = lower left corner of box to be filled
+% w,h = width and height of box
+% a = angle in degrees between lines and x-axis
+% XX = 0/1 for no/yes cross-hatch
+%
+/PatternFill { gsave /PFa [ 9 2 roll ] def
+ PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
+ PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
+ gsave 1 setgray fill grestore clip
+ currentlinewidth 0.5 mul setlinewidth
+ /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
+ 0 0 M PFa 5 get rotate PFs -2 div dup translate
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 M 0 PFs V } for
+ 0 PFa 6 get ne {
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 2 1 roll M PFs 0 V } for
+ } if
+ stroke grestore } def
+%
+/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
+dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
+currentdict end definefont pop
+end
+%%EndProlog
+gnudict begin
+gsave
+0 0 translate
+0.100 0.100 scale
+0 setgray
+newpath
+0.500 UL
+LTb
+481 331 M
+-31 0 V
+0.500 UL
+LTb
+481 1204 M
+-31 0 V
+0.500 UL
+LTb
+481 2076 M
+-31 0 V
+0.500 UL
+LTb
+481 331 M
+0 -31 V
+0.500 UL
+LTb
+679 331 M
+0 -31 V
+0.500 UL
+LTb
+877 331 M
+0 -31 V
+0.500 UL
+LTb
+1075 331 M
+0 -31 V
+0.500 UL
+LTb
+1273 331 M
+0 -31 V
+0.500 UL
+LTb
+1471 331 M
+0 -31 V
+0.500 UL
+LTb
+1669 331 M
+0 -31 V
+0.500 UL
+LTb
+1867 331 M
+0 -31 V
+0.500 UL
+LTb
+2064 331 M
+0 -31 V
+0.500 UL
+LTb
+2262 331 M
+0 -31 V
+0.500 UL
+LTb
+2460 331 M
+0 -31 V
+0.500 UL
+LTb
+2658 331 M
+0 -31 V
+0.500 UL
+LTb
+2856 331 M
+0 -31 V
+0.500 UL
+LTb
+3054 331 M
+0 -31 V
+0.500 UL
+LTb
+3252 331 M
+0 -31 V
+0.500 UL
+LTb
+3450 331 M
+0 -31 V
+0.500 UL
+LTb
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+LTb
+LTb
+LTb
+1.000 UP
+1.000 UL
+LT0
+481 331 M
+20 0 V
+20 0 V
+19 0 V
+20 0 V
+20 0 V
+20 0 V
+20 0 V
+19 0 V
+20 0 V
+20 0 V
+20 0 V
+20 0 V
+19 0 V
+20 0 V
+20 0 V
+20 0 V
+19 1 V
+20 0 V
+20 2 V
+20 3 V
+20 5 V
+19 9 V
+20 14 V
+20 21 V
+20 29 V
+20 39 V
+19 49 V
+20 60 V
+20 71 V
+20 81 V
+20 89 V
+19 97 V
+20 101 V
+20 103 V
+20 103 V
+20 101 V
+19 96 V
+20 90 V
+20 83 V
+20 74 V
+20 64 V
+19 55 V
+20 45 V
+20 36 V
+20 26 V
+19 18 V
+20 9 V
+20 2 V
+20 -5 V
+20 -10 V
+19 -16 V
+20 -21 V
+20 -24 V
+20 -28 V
+20 -30 V
+19 -33 V
+20 -34 V
+20 -35 V
+20 -36 V
+20 -37 V
+19 -37 V
+20 -37 V
+20 -37 V
+20 -36 V
+20 -36 V
+19 -35 V
+20 -35 V
+20 -34 V
+20 -33 V
+20 -32 V
+19 -31 V
+20 -30 V
+20 -29 V
+20 -28 V
+20 -27 V
+19 -26 V
+20 -26 V
+20 -24 V
+20 -24 V
+19 -22 V
+20 -22 V
+20 -21 V
+20 -20 V
+20 -19 V
+19 -19 V
+20 -18 V
+20 -17 V
+20 -16 V
+20 -16 V
+19 -15 V
+20 -15 V
+20 -14 V
+20 -13 V
+20 -13 V
+19 -13 V
+20 -12 V
+20 -11 V
+20 -11 V
+20 -11 V
+19 -10 V
+20 -10 V
+20 -10 V
+20 -9 V
+20 -9 V
+stroke
+2540 635 M
+19 -8 V
+20 -8 V
+20 -8 V
+20 -8 V
+19 -7 V
+20 -7 V
+20 -7 V
+20 -6 V
+20 -7 V
+19 -6 V
+20 -6 V
+20 -6 V
+20 -5 V
+20 -5 V
+19 -5 V
+20 -5 V
+20 -5 V
+20 -5 V
+20 -4 V
+19 -5 V
+20 -4 V
+20 -4 V
+20 -4 V
+20 -4 V
+19 -4 V
+20 -3 V
+20 -4 V
+20 -3 V
+20 -3 V
+19 -3 V
+20 -4 V
+20 -3 V
+20 -2 V
+19 -3 V
+20 -3 V
+20 -3 V
+20 -2 V
+20 -3 V
+19 -2 V
+20 -3 V
+20 -2 V
+20 -2 V
+20 -2 V
+19 -2 V
+20 -2 V
+20 -3 V
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+1.000 UP
+stroke
+grestore
+end
+showpage
+}}%
+\put(1965,2226){\cjust{Landau Distribution}}%
+\put(1965,50){\cjust{$x$}}%
+\put(100,1203){%
+\special{ps: gsave currentpoint currentpoint translate
+270 rotate neg exch neg exch translate}%
+\cstack{$p(x)$}%
+\special{ps: currentpoint grestore moveto}%
+}%
+\put(3450,200){\cjust{ 10}}%
+\put(3252,200){\cjust{ 9}}%
+\put(3054,200){\cjust{ 8}}%
+\put(2856,200){\cjust{ 7}}%
+\put(2658,200){\cjust{ 6}}%
+\put(2460,200){\cjust{ 5}}%
+\put(2262,200){\cjust{ 4}}%
+\put(2064,200){\cjust{ 3}}%
+\put(1867,200){\cjust{ 2}}%
+\put(1669,200){\cjust{ 1}}%
+\put(1471,200){\cjust{ 0}}%
+\put(1273,200){\cjust{-1}}%
+\put(1075,200){\cjust{-2}}%
+\put(877,200){\cjust{-3}}%
+\put(679,200){\cjust{-4}}%
+\put(481,200){\cjust{-5}}%
+\put(400,2076){\rjust{ 0.2}}%
+\put(400,1204){\rjust{ 0.1}}%
+\put(400,331){\rjust{ 0}}%
+\endGNUPLOTpicture
+\endgroup
+\endinput
diff --git a/gsl-1.9/doc/rand-laplace.tex b/gsl-1.9/doc/rand-laplace.tex
new file mode 100644
index 0000000..ec0bf04
--- /dev/null
+++ b/gsl-1.9/doc/rand-laplace.tex
@@ -0,0 +1,1059 @@
+% GNUPLOT: plain TeX with Postscript
+\begingroup
+ \catcode`\@=11\relax
+ \def\GNUPLOTspecial{%
+ \def\do##1{\catcode`##1=12\relax}\dospecials
+ \catcode`\{=1\catcode`\}=2\catcode\%=14\relax\special}%
+%
+\expandafter\ifx\csname GNUPLOTpicture\endcsname\relax
+ \csname newdimen\endcsname\GNUPLOTunit
+ \gdef\GNUPLOTpicture(#1,#2){\vbox to#2\GNUPLOTunit\bgroup
+ \def\put(##1,##2)##3{\unskip\raise##2\GNUPLOTunit
+ \hbox to0pt{\kern##1\GNUPLOTunit ##3\hss}\ignorespaces}%
+ \def\ljust##1{\vbox to0pt{\vss\hbox to0pt{##1\hss}\vss}}%
+ \def\cjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1\hss}\vss}}%
+ \def\rjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1}\vss}}%
+ \def\stack##1{\let\\=\cr\tabskip=0pt\halign{\hfil ####\hfil\cr ##1\crcr}}%
+ \def\lstack##1{\hbox to0pt{\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\cstack##1{\hbox to0pt{\hss\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\rstack##1{\hbox to0pt{\vbox to0pt{\stack{##1}\vss}\hss}}%
+ \vss\hbox to#1\GNUPLOTunit\bgroup\ignorespaces}%
+ \gdef\endGNUPLOTpicture{\hss\egroup\egroup}%
+\fi
+\GNUPLOTunit=0.1bp
+\GNUPLOTpicture(3600,2376)
+{\GNUPLOTspecial{"
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: rand-laplace.tex
+%%Creator: gnuplot 4.0 patchlevel 0
+%%CreationDate: Wed Aug 31 12:38:29 2005
+%%DocumentFonts:
+%%BoundingBox: 0 0 360 237
+%%Orientation: Landscape
+%%EndComments
+/gnudict 256 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+/vshift -33 def
+/dl {10.0 mul} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+/Rounded false def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/N {newpath moveto} bind def
+/C {setrgbcolor} bind def
+/f {rlineto fill} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke userlinewidth 2 mul setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/AL { stroke userlinewidth 2 div setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/UL { dup gnulinewidth mul /userlinewidth exch def
+ dup 1 lt {pop 1} if 10 mul /udl exch def } def
+/PL { stroke userlinewidth setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/LTw { PL [] 1 setgray } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 1 0 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
+/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/Pnt { stroke [] 0 setdash
+ gsave 1 setlinecap M 0 0 V stroke grestore } def
+/Dia { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt } def
+/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt } def
+/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt } def
+/Star { 2 copy Pls Crs } def
+/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill } def
+/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill } def
+/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt } def
+/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill } def
+/Pent { stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt } def
+/PentF { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore } def
+/Circle { stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt } def
+/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
+/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def
+/C1 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C2 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C3 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C4 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C5 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc } bind def
+/C6 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C7 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C8 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C9 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C11 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C12 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C13 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C14 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc } bind def
+/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath } bind def
+/Square { dup Rec } bind def
+/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
+/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
+/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
+/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
+/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill
+ Bsquare } bind def
+/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
+/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare } bind def
+/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare } bind def
+/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
+/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare } bind def
+/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
+/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
+/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
+/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
+/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
+/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
+/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
+/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
+/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
+/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
+/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
+/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
+/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
+/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
+/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
+/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
+/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
+/DiaE { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke } def
+/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke } def
+/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke } def
+/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke } def
+/PentE { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore } def
+/CircE { stroke [] 0 setdash
+ hpt 0 360 arc stroke } def
+/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def
+/DiaW { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke } def
+/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke } def
+/TriUW { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke } def
+/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke } def
+/PentW { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore } def
+/CircW { stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke } def
+/BoxFill { gsave Rec 1 setgray fill grestore } def
+/BoxColFill {
+ gsave Rec
+ /Fillden exch def
+ currentrgbcolor
+ /ColB exch def /ColG exch def /ColR exch def
+ /ColR ColR Fillden mul Fillden sub 1 add def
+ /ColG ColG Fillden mul Fillden sub 1 add def
+ /ColB ColB Fillden mul Fillden sub 1 add def
+ ColR ColG ColB setrgbcolor
+ fill grestore } def
+%
+% PostScript Level 1 Pattern Fill routine
+% Usage: x y w h s a XX PatternFill
+% x,y = lower left corner of box to be filled
+% w,h = width and height of box
+% a = angle in degrees between lines and x-axis
+% XX = 0/1 for no/yes cross-hatch
+%
+/PatternFill { gsave /PFa [ 9 2 roll ] def
+ PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
+ PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
+ gsave 1 setgray fill grestore clip
+ currentlinewidth 0.5 mul setlinewidth
+ /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
+ 0 0 M PFa 5 get rotate PFs -2 div dup translate
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 M 0 PFs V } for
+ 0 PFa 6 get ne {
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 2 1 roll M PFs 0 V } for
+ } if
+ stroke grestore } def
+%
+/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
+dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
+currentdict end definefont pop
+end
+%%EndProlog
+gnudict begin
+gsave
+0 0 translate
+0.100 0.100 scale
+0 setgray
+newpath
+0.500 UL
+LTb
+481 331 M
+-31 0 V
+0.500 UL
+LTb
+481 648 M
+-31 0 V
+0.500 UL
+LTb
+481 966 M
+-31 0 V
+0.500 UL
+LTb
+481 1283 M
+-31 0 V
+0.500 UL
+LTb
+481 1600 M
+-31 0 V
+0.500 UL
+LTb
+481 1917 M
+-31 0 V
+0.500 UL
+LTb
+481 331 M
+0 -31 V
+0.500 UL
+LTb
+778 331 M
+0 -31 V
+0.500 UL
+LTb
+1075 331 M
+0 -31 V
+0.500 UL
+LTb
+1372 331 M
+0 -31 V
+0.500 UL
+LTb
+1669 331 M
+0 -31 V
+0.500 UL
+LTb
+1965 331 M
+0 -31 V
+0.500 UL
+LTb
+2262 331 M
+0 -31 V
+0.500 UL
+LTb
+2559 331 M
+0 -31 V
+0.500 UL
+LTb
+2856 331 M
+0 -31 V
+0.500 UL
+LTb
+3153 331 M
+0 -31 V
+0.500 UL
+LTb
+3450 331 M
+0 -31 V
+0.500 UL
+LTb
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+LTb
+LTb
+LTb
+1.000 UP
+1.000 UL
+LT0
+LTb
+LT0
+3087 1963 M
+263 0 V
+481 342 M
+10 0 V
+10 0 V
+10 1 V
+10 0 V
+10 1 V
+10 0 V
+10 1 V
+9 0 V
+10 0 V
+10 1 V
+10 0 V
+10 1 V
+10 1 V
+10 0 V
+10 1 V
+10 0 V
+10 1 V
+10 1 V
+10 0 V
+10 1 V
+10 1 V
+9 0 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 0 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+9 2 V
+10 1 V
+10 1 V
+10 1 V
+10 2 V
+10 1 V
+10 2 V
+10 1 V
+10 2 V
+10 1 V
+10 2 V
+10 1 V
+10 2 V
+10 2 V
+9 2 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 3 V
+10 2 V
+10 2 V
+10 3 V
+10 3 V
+10 2 V
+10 3 V
+10 3 V
+10 3 V
+9 3 V
+10 3 V
+10 3 V
+10 4 V
+10 3 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 5 V
+10 4 V
+10 5 V
+9 5 V
+10 5 V
+10 5 V
+10 6 V
+10 6 V
+10 5 V
+10 6 V
+10 7 V
+10 6 V
+10 7 V
+10 7 V
+10 7 V
+10 7 V
+10 8 V
+9 8 V
+10 8 V
+10 8 V
+10 9 V
+10 9 V
+10 9 V
+10 10 V
+10 10 V
+10 10 V
+10 11 V
+stroke
+1494 655 M
+10 11 V
+10 11 V
+10 12 V
+10 12 V
+9 13 V
+10 13 V
+10 13 V
+10 14 V
+10 15 V
+10 15 V
+10 15 V
+10 16 V
+10 16 V
+10 17 V
+10 18 V
+10 18 V
+10 19 V
+10 19 V
+10 21 V
+9 20 V
+10 22 V
+10 22 V
+10 23 V
+10 24 V
+10 24 V
+10 26 V
+10 26 V
+10 27 V
+10 28 V
+10 30 V
+10 30 V
+10 31 V
+10 32 V
+9 33 V
+10 34 V
+10 36 V
+10 37 V
+10 38 V
+10 39 V
+10 40 V
+10 42 V
+10 44 V
+10 45 V
+10 46 V
+10 48 V
+10 50 V
+10 51 V
+9 0 V
+10 -51 V
+10 -50 V
+10 -48 V
+10 -46 V
+10 -45 V
+10 -44 V
+10 -42 V
+10 -40 V
+10 -39 V
+10 -38 V
+10 -37 V
+10 -36 V
+10 -34 V
+9 -33 V
+10 -32 V
+10 -31 V
+10 -30 V
+10 -30 V
+10 -28 V
+10 -27 V
+10 -26 V
+10 -26 V
+10 -24 V
+10 -24 V
+10 -23 V
+10 -22 V
+10 -22 V
+9 -20 V
+10 -21 V
+10 -19 V
+10 -19 V
+10 -18 V
+10 -18 V
+10 -17 V
+10 -16 V
+10 -16 V
+10 -15 V
+10 -15 V
+10 -15 V
+10 -14 V
+10 -13 V
+10 -13 V
+9 -13 V
+10 -12 V
+10 -12 V
+10 -11 V
+10 -11 V
+10 -11 V
+10 -10 V
+10 -10 V
+10 -10 V
+10 -9 V
+10 -9 V
+10 -9 V
+10 -8 V
+10 -8 V
+stroke
+2527 571 M
+9 -8 V
+10 -8 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -6 V
+10 -7 V
+10 -6 V
+10 -5 V
+10 -6 V
+10 -6 V
+10 -5 V
+10 -5 V
+9 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+9 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+9 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+9 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+9 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+9 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+1.000 UL
+LT1
+LTb
+LT1
+3087 1863 M
+263 0 V
+481 396 M
+10 1 V
+10 1 V
+10 1 V
+10 2 V
+10 1 V
+10 1 V
+10 1 V
+9 1 V
+10 2 V
+10 1 V
+10 1 V
+10 2 V
+10 1 V
+10 1 V
+10 2 V
+10 1 V
+10 2 V
+10 1 V
+10 1 V
+10 2 V
+10 2 V
+9 1 V
+10 2 V
+10 1 V
+10 2 V
+10 2 V
+10 1 V
+10 2 V
+10 2 V
+10 2 V
+10 1 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+9 2 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 3 V
+10 2 V
+10 2 V
+10 3 V
+10 2 V
+10 2 V
+10 3 V
+9 2 V
+10 3 V
+10 2 V
+10 3 V
+10 3 V
+10 2 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+9 3 V
+10 3 V
+10 4 V
+10 3 V
+10 3 V
+10 4 V
+10 3 V
+10 4 V
+10 4 V
+10 3 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+9 4 V
+10 4 V
+10 4 V
+10 5 V
+10 4 V
+10 4 V
+10 5 V
+10 4 V
+10 5 V
+10 5 V
+10 4 V
+10 5 V
+10 5 V
+10 5 V
+9 5 V
+10 6 V
+10 5 V
+10 5 V
+10 6 V
+10 5 V
+10 6 V
+10 6 V
+10 5 V
+10 6 V
+stroke
+1494 689 M
+10 6 V
+10 7 V
+10 6 V
+10 6 V
+9 7 V
+10 6 V
+10 7 V
+10 7 V
+10 7 V
+10 7 V
+10 7 V
+10 7 V
+10 7 V
+10 8 V
+10 8 V
+10 7 V
+10 8 V
+10 8 V
+10 8 V
+9 9 V
+10 8 V
+10 9 V
+10 9 V
+10 8 V
+10 9 V
+10 10 V
+10 9 V
+10 9 V
+10 10 V
+10 10 V
+10 10 V
+10 10 V
+10 10 V
+9 11 V
+10 11 V
+10 10 V
+10 11 V
+10 12 V
+10 11 V
+10 12 V
+10 11 V
+10 12 V
+10 13 V
+10 12 V
+10 13 V
+10 13 V
+10 13 V
+9 0 V
+10 -13 V
+10 -13 V
+10 -13 V
+10 -12 V
+10 -13 V
+10 -12 V
+10 -11 V
+10 -12 V
+10 -11 V
+10 -12 V
+10 -11 V
+10 -10 V
+10 -11 V
+9 -11 V
+10 -10 V
+10 -10 V
+10 -10 V
+10 -10 V
+10 -10 V
+10 -9 V
+10 -9 V
+10 -10 V
+10 -9 V
+10 -8 V
+10 -9 V
+10 -9 V
+10 -8 V
+9 -9 V
+10 -8 V
+10 -8 V
+10 -8 V
+10 -7 V
+10 -8 V
+10 -8 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -6 V
+9 -7 V
+10 -6 V
+10 -6 V
+10 -7 V
+10 -6 V
+10 -6 V
+10 -5 V
+10 -6 V
+10 -6 V
+10 -5 V
+10 -6 V
+10 -5 V
+10 -5 V
+10 -6 V
+stroke
+2527 639 M
+9 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+9 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -4 V
+10 -3 V
+9 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+9 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+9 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+9 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+1.000 UP
+stroke
+grestore
+end
+showpage
+}}%
+\put(3037,1863){\rjust{$a=2$}}%
+\put(3037,1963){\rjust{$a=1$}}%
+\put(1965,2226){\cjust{Laplace Distribution (Two-sided Exponential)}}%
+\put(1965,50){\cjust{$x$}}%
+\put(100,1203){%
+\special{ps: gsave currentpoint currentpoint translate
+270 rotate neg exch neg exch translate}%
+\cstack{$p(x)$}%
+\special{ps: currentpoint grestore moveto}%
+}%
+\put(3450,200){\cjust{ 5}}%
+\put(3153,200){\cjust{ 4}}%
+\put(2856,200){\cjust{ 3}}%
+\put(2559,200){\cjust{ 2}}%
+\put(2262,200){\cjust{ 1}}%
+\put(1965,200){\cjust{ 0}}%
+\put(1669,200){\cjust{-1}}%
+\put(1372,200){\cjust{-2}}%
+\put(1075,200){\cjust{-3}}%
+\put(778,200){\cjust{-4}}%
+\put(481,200){\cjust{-5}}%
+\put(400,1917){\rjust{ 0.5}}%
+\put(400,1600){\rjust{ 0.4}}%
+\put(400,1283){\rjust{ 0.3}}%
+\put(400,966){\rjust{ 0.2}}%
+\put(400,648){\rjust{ 0.1}}%
+\put(400,331){\rjust{ 0}}%
+\endGNUPLOTpicture
+\endgroup
+\endinput
diff --git a/gsl-1.9/doc/rand-levy.tex b/gsl-1.9/doc/rand-levy.tex
new file mode 100644
index 0000000..7b1907f
--- /dev/null
+++ b/gsl-1.9/doc/rand-levy.tex
@@ -0,0 +1,1054 @@
+% GNUPLOT: plain TeX with Postscript
+\begingroup
+ \catcode`\@=11\relax
+ \def\GNUPLOTspecial{%
+ \def\do##1{\catcode`##1=12\relax}\dospecials
+ \catcode`\{=1\catcode`\}=2\catcode\%=14\relax\special}%
+%
+\expandafter\ifx\csname GNUPLOTpicture\endcsname\relax
+ \csname newdimen\endcsname\GNUPLOTunit
+ \gdef\GNUPLOTpicture(#1,#2){\vbox to#2\GNUPLOTunit\bgroup
+ \def\put(##1,##2)##3{\unskip\raise##2\GNUPLOTunit
+ \hbox to0pt{\kern##1\GNUPLOTunit ##3\hss}\ignorespaces}%
+ \def\ljust##1{\vbox to0pt{\vss\hbox to0pt{##1\hss}\vss}}%
+ \def\cjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1\hss}\vss}}%
+ \def\rjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1}\vss}}%
+ \def\stack##1{\let\\=\cr\tabskip=0pt\halign{\hfil ####\hfil\cr ##1\crcr}}%
+ \def\lstack##1{\hbox to0pt{\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\cstack##1{\hbox to0pt{\hss\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\rstack##1{\hbox to0pt{\vbox to0pt{\stack{##1}\vss}\hss}}%
+ \vss\hbox to#1\GNUPLOTunit\bgroup\ignorespaces}%
+ \gdef\endGNUPLOTpicture{\hss\egroup\egroup}%
+\fi
+\GNUPLOTunit=0.1bp
+\GNUPLOTpicture(3600,2376)
+{\GNUPLOTspecial{"
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: rand-levy.tex
+%%Creator: gnuplot 4.0 patchlevel 0
+%%CreationDate: Wed Aug 31 12:38:29 2005
+%%DocumentFonts:
+%%BoundingBox: 0 0 360 237
+%%Orientation: Landscape
+%%EndComments
+/gnudict 256 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+/vshift -33 def
+/dl {10.0 mul} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+/Rounded false def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/N {newpath moveto} bind def
+/C {setrgbcolor} bind def
+/f {rlineto fill} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke userlinewidth 2 mul setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/AL { stroke userlinewidth 2 div setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/UL { dup gnulinewidth mul /userlinewidth exch def
+ dup 1 lt {pop 1} if 10 mul /udl exch def } def
+/PL { stroke userlinewidth setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/LTw { PL [] 1 setgray } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 1 0 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
+/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/Pnt { stroke [] 0 setdash
+ gsave 1 setlinecap M 0 0 V stroke grestore } def
+/Dia { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt } def
+/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt } def
+/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt } def
+/Star { 2 copy Pls Crs } def
+/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill } def
+/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill } def
+/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt } def
+/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill } def
+/Pent { stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt } def
+/PentF { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore } def
+/Circle { stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt } def
+/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
+/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def
+/C1 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C2 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C3 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C4 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C5 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc } bind def
+/C6 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C7 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C8 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C9 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C11 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C12 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C13 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C14 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc } bind def
+/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath } bind def
+/Square { dup Rec } bind def
+/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
+/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
+/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
+/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
+/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill
+ Bsquare } bind def
+/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
+/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare } bind def
+/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare } bind def
+/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
+/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare } bind def
+/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
+/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
+/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
+/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
+/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
+/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
+/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
+/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
+/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
+/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
+/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
+/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
+/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
+/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
+/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
+/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
+/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
+/DiaE { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke } def
+/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke } def
+/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke } def
+/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke } def
+/PentE { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore } def
+/CircE { stroke [] 0 setdash
+ hpt 0 360 arc stroke } def
+/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def
+/DiaW { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke } def
+/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke } def
+/TriUW { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke } def
+/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke } def
+/PentW { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore } def
+/CircW { stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke } def
+/BoxFill { gsave Rec 1 setgray fill grestore } def
+/BoxColFill {
+ gsave Rec
+ /Fillden exch def
+ currentrgbcolor
+ /ColB exch def /ColG exch def /ColR exch def
+ /ColR ColR Fillden mul Fillden sub 1 add def
+ /ColG ColG Fillden mul Fillden sub 1 add def
+ /ColB ColB Fillden mul Fillden sub 1 add def
+ ColR ColG ColB setrgbcolor
+ fill grestore } def
+%
+% PostScript Level 1 Pattern Fill routine
+% Usage: x y w h s a XX PatternFill
+% x,y = lower left corner of box to be filled
+% w,h = width and height of box
+% a = angle in degrees between lines and x-axis
+% XX = 0/1 for no/yes cross-hatch
+%
+/PatternFill { gsave /PFa [ 9 2 roll ] def
+ PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
+ PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
+ gsave 1 setgray fill grestore clip
+ currentlinewidth 0.5 mul setlinewidth
+ /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
+ 0 0 M PFa 5 get rotate PFs -2 div dup translate
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 M 0 PFs V } for
+ 0 PFa 6 get ne {
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 2 1 roll M PFs 0 V } for
+ } if
+ stroke grestore } def
+%
+/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
+dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
+currentdict end definefont pop
+end
+%%EndProlog
+gnudict begin
+gsave
+0 0 translate
+0.100 0.100 scale
+0 setgray
+newpath
+0.500 UL
+LTb
+481 331 M
+-31 0 V
+0.500 UL
+LTb
+481 719 M
+-31 0 V
+0.500 UL
+LTb
+481 1107 M
+-31 0 V
+0.500 UL
+LTb
+481 1494 M
+-31 0 V
+0.500 UL
+LTb
+481 1882 M
+-31 0 V
+0.500 UL
+LTb
+481 331 M
+0 -31 V
+0.500 UL
+LTb
+778 331 M
+0 -31 V
+0.500 UL
+LTb
+1075 331 M
+0 -31 V
+0.500 UL
+LTb
+1372 331 M
+0 -31 V
+0.500 UL
+LTb
+1669 331 M
+0 -31 V
+0.500 UL
+LTb
+1965 331 M
+0 -31 V
+0.500 UL
+LTb
+2262 331 M
+0 -31 V
+0.500 UL
+LTb
+2559 331 M
+0 -31 V
+0.500 UL
+LTb
+2856 331 M
+0 -31 V
+0.500 UL
+LTb
+3153 331 M
+0 -31 V
+0.500 UL
+LTb
+3450 331 M
+0 -31 V
+0.500 UL
+LTb
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+LTb
+LTb
+LTb
+1.000 UP
+1.000 UL
+LT0
+LTb
+LT0
+3087 1963 M
+263 0 V
+481 378 M
+10 1 V
+10 1 V
+10 0 V
+10 1 V
+10 1 V
+10 0 V
+10 1 V
+9 1 V
+10 0 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 0 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 0 V
+10 1 V
+9 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 2 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 2 V
+10 1 V
+9 1 V
+10 1 V
+10 2 V
+10 1 V
+10 2 V
+10 1 V
+10 2 V
+10 1 V
+10 2 V
+10 1 V
+10 2 V
+10 2 V
+10 2 V
+10 1 V
+9 2 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 3 V
+10 2 V
+10 2 V
+10 2 V
+10 3 V
+10 2 V
+10 3 V
+10 3 V
+10 3 V
+9 2 V
+10 3 V
+10 3 V
+10 3 V
+10 4 V
+10 3 V
+10 3 V
+10 4 V
+10 4 V
+10 3 V
+10 4 V
+10 4 V
+10 4 V
+10 5 V
+9 4 V
+10 5 V
+10 5 V
+10 4 V
+10 6 V
+10 5 V
+10 5 V
+10 6 V
+10 6 V
+10 6 V
+10 6 V
+10 7 V
+10 7 V
+10 7 V
+9 7 V
+10 8 V
+10 8 V
+10 8 V
+10 8 V
+10 9 V
+10 9 V
+10 10 V
+10 10 V
+10 10 V
+stroke
+1494 681 M
+10 11 V
+10 11 V
+10 12 V
+10 12 V
+9 13 V
+10 13 V
+10 13 V
+10 15 V
+10 14 V
+10 16 V
+10 16 V
+10 16 V
+10 17 V
+10 18 V
+10 19 V
+10 19 V
+10 20 V
+10 20 V
+10 22 V
+9 22 V
+10 22 V
+10 24 V
+10 23 V
+10 25 V
+10 25 V
+10 26 V
+10 26 V
+10 26 V
+10 27 V
+10 26 V
+10 27 V
+10 27 V
+10 26 V
+9 26 V
+10 26 V
+10 24 V
+10 24 V
+10 22 V
+10 21 V
+10 19 V
+10 18 V
+10 15 V
+10 13 V
+10 11 V
+10 8 V
+10 5 V
+10 3 V
+9 0 V
+10 -3 V
+10 -5 V
+10 -8 V
+10 -11 V
+10 -13 V
+10 -15 V
+10 -18 V
+10 -19 V
+10 -21 V
+10 -22 V
+10 -24 V
+10 -24 V
+10 -26 V
+9 -26 V
+10 -26 V
+10 -27 V
+10 -27 V
+10 -26 V
+10 -27 V
+10 -26 V
+10 -26 V
+10 -26 V
+10 -25 V
+10 -25 V
+10 -23 V
+10 -24 V
+10 -22 V
+9 -22 V
+10 -22 V
+10 -20 V
+10 -20 V
+10 -19 V
+10 -19 V
+10 -18 V
+10 -17 V
+10 -16 V
+10 -16 V
+10 -16 V
+10 -14 V
+10 -15 V
+10 -13 V
+10 -13 V
+9 -13 V
+10 -12 V
+10 -12 V
+10 -11 V
+10 -11 V
+10 -10 V
+10 -10 V
+10 -10 V
+10 -9 V
+10 -9 V
+10 -8 V
+10 -8 V
+10 -8 V
+10 -8 V
+stroke
+2527 601 M
+9 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -5 V
+10 -5 V
+10 -6 V
+10 -4 V
+10 -5 V
+10 -5 V
+9 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -3 V
+9 -2 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+9 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+9 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+9 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+9 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+1.000 UL
+LT1
+LTb
+LT1
+3087 1863 M
+263 0 V
+481 333 M
+10 0 V
+10 0 V
+10 1 V
+10 0 V
+10 0 V
+10 0 V
+10 1 V
+9 0 V
+10 0 V
+10 1 V
+10 0 V
+10 1 V
+10 0 V
+10 0 V
+10 1 V
+10 0 V
+10 1 V
+10 1 V
+10 0 V
+10 1 V
+10 1 V
+9 1 V
+10 0 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 2 V
+10 1 V
+10 1 V
+10 2 V
+10 1 V
+10 2 V
+10 1 V
+10 2 V
+9 2 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 3 V
+10 2 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+10 4 V
+9 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 5 V
+10 5 V
+10 5 V
+10 5 V
+10 6 V
+10 5 V
+10 6 V
+10 7 V
+10 6 V
+10 7 V
+9 7 V
+10 7 V
+10 7 V
+10 8 V
+10 8 V
+10 8 V
+10 8 V
+10 9 V
+10 9 V
+10 9 V
+10 10 V
+10 9 V
+10 11 V
+10 10 V
+9 10 V
+10 11 V
+10 12 V
+10 11 V
+10 12 V
+10 12 V
+10 12 V
+10 12 V
+10 13 V
+10 13 V
+10 13 V
+10 13 V
+10 14 V
+10 14 V
+9 14 V
+10 14 V
+10 15 V
+10 14 V
+10 15 V
+10 15 V
+10 15 V
+10 15 V
+10 16 V
+10 15 V
+stroke
+1494 913 M
+10 16 V
+10 15 V
+10 16 V
+10 15 V
+9 16 V
+10 16 V
+10 15 V
+10 16 V
+10 16 V
+10 15 V
+10 16 V
+10 15 V
+10 15 V
+10 15 V
+10 15 V
+10 15 V
+10 14 V
+10 15 V
+10 14 V
+9 13 V
+10 14 V
+10 13 V
+10 13 V
+10 12 V
+10 13 V
+10 11 V
+10 12 V
+10 11 V
+10 10 V
+10 10 V
+10 10 V
+10 9 V
+10 8 V
+9 9 V
+10 7 V
+10 7 V
+10 7 V
+10 6 V
+10 5 V
+10 5 V
+10 4 V
+10 4 V
+10 3 V
+10 2 V
+10 2 V
+10 1 V
+10 1 V
+9 0 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -4 V
+10 -4 V
+10 -5 V
+10 -5 V
+10 -6 V
+10 -7 V
+10 -7 V
+10 -7 V
+9 -9 V
+10 -8 V
+10 -9 V
+10 -10 V
+10 -10 V
+10 -10 V
+10 -11 V
+10 -12 V
+10 -11 V
+10 -13 V
+10 -12 V
+10 -13 V
+10 -13 V
+10 -14 V
+9 -13 V
+10 -14 V
+10 -15 V
+10 -14 V
+10 -15 V
+10 -15 V
+10 -15 V
+10 -15 V
+10 -15 V
+10 -16 V
+10 -15 V
+10 -16 V
+10 -16 V
+10 -15 V
+10 -16 V
+9 -16 V
+10 -15 V
+10 -16 V
+10 -15 V
+10 -16 V
+10 -15 V
+10 -16 V
+10 -15 V
+10 -15 V
+10 -15 V
+10 -15 V
+10 -14 V
+10 -15 V
+10 -14 V
+stroke
+2527 779 M
+9 -14 V
+10 -14 V
+10 -14 V
+10 -13 V
+10 -13 V
+10 -13 V
+10 -13 V
+10 -12 V
+10 -12 V
+10 -12 V
+10 -12 V
+10 -11 V
+10 -12 V
+10 -11 V
+9 -10 V
+10 -10 V
+10 -11 V
+10 -9 V
+10 -10 V
+10 -9 V
+10 -9 V
+10 -9 V
+10 -8 V
+10 -8 V
+10 -8 V
+10 -8 V
+10 -7 V
+10 -7 V
+9 -7 V
+10 -7 V
+10 -6 V
+10 -7 V
+10 -6 V
+10 -5 V
+10 -6 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+9 -4 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+9 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+9 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+1.000 UP
+stroke
+grestore
+end
+showpage
+}}%
+\put(3037,1863){\rjust{$c=1, \alpha=2.0$}}%
+\put(3037,1963){\rjust{$c=1, \alpha=1.0$}}%
+\put(1965,2226){\cjust{Levy Distribution}}%
+\put(1965,50){\cjust{$x$}}%
+\put(100,1203){%
+\special{ps: gsave currentpoint currentpoint translate
+270 rotate neg exch neg exch translate}%
+\cstack{$p(x)$}%
+\special{ps: currentpoint grestore moveto}%
+}%
+\put(3450,200){\cjust{ 5}}%
+\put(3153,200){\cjust{ 4}}%
+\put(2856,200){\cjust{ 3}}%
+\put(2559,200){\cjust{ 2}}%
+\put(2262,200){\cjust{ 1}}%
+\put(1965,200){\cjust{ 0}}%
+\put(1669,200){\cjust{-1}}%
+\put(1372,200){\cjust{-2}}%
+\put(1075,200){\cjust{-3}}%
+\put(778,200){\cjust{-4}}%
+\put(481,200){\cjust{-5}}%
+\put(400,1882){\rjust{ 0.4}}%
+\put(400,1494){\rjust{ 0.3}}%
+\put(400,1107){\rjust{ 0.2}}%
+\put(400,719){\rjust{ 0.1}}%
+\put(400,331){\rjust{ 0}}%
+\endGNUPLOTpicture
+\endgroup
+\endinput
diff --git a/gsl-1.9/doc/rand-levyskew.tex b/gsl-1.9/doc/rand-levyskew.tex
new file mode 100644
index 0000000..07dafff
--- /dev/null
+++ b/gsl-1.9/doc/rand-levyskew.tex
@@ -0,0 +1,728 @@
+% GNUPLOT: plain TeX with Postscript
+\begingroup
+ \catcode`\@=11\relax
+ \def\GNUPLOTspecial{%
+ \def\do##1{\catcode`##1=12\relax}\dospecials
+ \catcode`\{=1\catcode`\}=2\catcode\%=14\relax\special}%
+%
+\expandafter\ifx\csname GNUPLOTpicture\endcsname\relax
+ \csname newdimen\endcsname\GNUPLOTunit
+ \gdef\GNUPLOTpicture(#1,#2){\vbox to#2\GNUPLOTunit\bgroup
+ \def\put(##1,##2)##3{\unskip\raise##2\GNUPLOTunit
+ \hbox to0pt{\kern##1\GNUPLOTunit ##3\hss}\ignorespaces}%
+ \def\ljust##1{\vbox to0pt{\vss\hbox to0pt{##1\hss}\vss}}%
+ \def\cjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1\hss}\vss}}%
+ \def\rjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1}\vss}}%
+ \def\stack##1{\let\\=\cr\tabskip=0pt\halign{\hfil ####\hfil\cr ##1\crcr}}%
+ \def\lstack##1{\hbox to0pt{\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\cstack##1{\hbox to0pt{\hss\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\rstack##1{\hbox to0pt{\vbox to0pt{\stack{##1}\vss}\hss}}%
+ \vss\hbox to#1\GNUPLOTunit\bgroup\ignorespaces}%
+ \gdef\endGNUPLOTpicture{\hss\egroup\egroup}%
+\fi
+\GNUPLOTunit=0.1bp
+\GNUPLOTpicture(3600,2376)
+{\GNUPLOTspecial{"
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: rand-levyskew.tex
+%%Creator: gnuplot 4.0 patchlevel 0
+%%CreationDate: Wed Aug 31 12:38:29 2005
+%%DocumentFonts:
+%%BoundingBox: 0 0 360 237
+%%Orientation: Landscape
+%%EndComments
+/gnudict 256 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+/vshift -33 def
+/dl {10.0 mul} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+/Rounded false def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/N {newpath moveto} bind def
+/C {setrgbcolor} bind def
+/f {rlineto fill} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke userlinewidth 2 mul setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/AL { stroke userlinewidth 2 div setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/UL { dup gnulinewidth mul /userlinewidth exch def
+ dup 1 lt {pop 1} if 10 mul /udl exch def } def
+/PL { stroke userlinewidth setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/LTw { PL [] 1 setgray } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 1 0 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
+/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/Pnt { stroke [] 0 setdash
+ gsave 1 setlinecap M 0 0 V stroke grestore } def
+/Dia { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt } def
+/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt } def
+/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt } def
+/Star { 2 copy Pls Crs } def
+/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill } def
+/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill } def
+/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt } def
+/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill } def
+/Pent { stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt } def
+/PentF { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore } def
+/Circle { stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt } def
+/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
+/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def
+/C1 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C2 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C3 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C4 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C5 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc } bind def
+/C6 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C7 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C8 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C9 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C11 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C12 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C13 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C14 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc } bind def
+/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath } bind def
+/Square { dup Rec } bind def
+/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
+/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
+/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
+/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
+/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill
+ Bsquare } bind def
+/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
+/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare } bind def
+/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare } bind def
+/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
+/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare } bind def
+/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
+/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
+/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
+/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
+/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
+/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
+/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
+/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
+/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
+/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
+/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
+/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
+/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
+/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
+/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
+/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
+/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
+/DiaE { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke } def
+/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke } def
+/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke } def
+/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke } def
+/PentE { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore } def
+/CircE { stroke [] 0 setdash
+ hpt 0 360 arc stroke } def
+/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def
+/DiaW { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke } def
+/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke } def
+/TriUW { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke } def
+/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke } def
+/PentW { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore } def
+/CircW { stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke } def
+/BoxFill { gsave Rec 1 setgray fill grestore } def
+/BoxColFill {
+ gsave Rec
+ /Fillden exch def
+ currentrgbcolor
+ /ColB exch def /ColG exch def /ColR exch def
+ /ColR ColR Fillden mul Fillden sub 1 add def
+ /ColG ColG Fillden mul Fillden sub 1 add def
+ /ColB ColB Fillden mul Fillden sub 1 add def
+ ColR ColG ColB setrgbcolor
+ fill grestore } def
+%
+% PostScript Level 1 Pattern Fill routine
+% Usage: x y w h s a XX PatternFill
+% x,y = lower left corner of box to be filled
+% w,h = width and height of box
+% a = angle in degrees between lines and x-axis
+% XX = 0/1 for no/yes cross-hatch
+%
+/PatternFill { gsave /PFa [ 9 2 roll ] def
+ PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
+ PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
+ gsave 1 setgray fill grestore clip
+ currentlinewidth 0.5 mul setlinewidth
+ /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
+ 0 0 M PFa 5 get rotate PFs -2 div dup translate
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 M 0 PFs V } for
+ 0 PFa 6 get ne {
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 2 1 roll M PFs 0 V } for
+ } if
+ stroke grestore } def
+%
+/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
+dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
+currentdict end definefont pop
+end
+%%EndProlog
+gnudict begin
+gsave
+0 0 translate
+0.100 0.100 scale
+0 setgray
+newpath
+0.500 UL
+LTb
+531 331 M
+-31 0 V
+0.500 UL
+LTb
+531 1300 M
+-31 0 V
+0.500 UL
+LTb
+531 331 M
+0 -31 V
+0.500 UL
+LTb
+823 331 M
+0 -31 V
+0.500 UL
+LTb
+1115 331 M
+0 -31 V
+0.500 UL
+LTb
+1407 331 M
+0 -31 V
+0.500 UL
+LTb
+1699 331 M
+0 -31 V
+0.500 UL
+LTb
+1990 331 M
+0 -31 V
+0.500 UL
+LTb
+2282 331 M
+0 -31 V
+0.500 UL
+LTb
+2574 331 M
+0 -31 V
+0.500 UL
+LTb
+2866 331 M
+0 -31 V
+0.500 UL
+LTb
+3158 331 M
+0 -31 V
+0.500 UL
+LTb
+3450 331 M
+0 -31 V
+0.500 UL
+LTb
+0.500 UL
+LTb
+531 331 M
+2919 0 V
+0 1745 V
+-2919 0 V
+531 331 L
+LTb
+LTb
+LTb
+1.000 UP
+1.000 UL
+LT0
+LTb
+LT0
+3087 1963 M
+263 0 V
+531 331 M
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+9 1 V
+10 0 V
+10 0 V
+10 0 V
+9 1 V
+10 0 V
+10 1 V
+10 1 V
+10 2 V
+9 1 V
+10 2 V
+10 2 V
+10 3 V
+9 4 V
+10 4 V
+10 5 V
+10 5 V
+9 7 V
+10 8 V
+10 9 V
+10 10 V
+9 11 V
+10 13 V
+10 14 V
+10 16 V
+9 18 V
+10 19 V
+10 22 V
+10 22 V
+stroke
+1527 532 M
+10 25 V
+9 26 V
+10 28 V
+10 30 V
+10 31 V
+9 33 V
+10 34 V
+10 35 V
+10 36 V
+9 37 V
+10 37 V
+10 38 V
+10 39 V
+9 38 V
+10 39 V
+10 38 V
+10 37 V
+10 37 V
+9 36 V
+10 35 V
+10 34 V
+10 32 V
+9 31 V
+10 29 V
+10 27 V
+10 26 V
+9 23 V
+10 22 V
+10 19 V
+10 18 V
+9 15 V
+10 13 V
+10 11 V
+10 9 V
+9 7 V
+10 5 V
+10 3 V
+10 1 V
+10 0 V
+9 -3 V
+10 -3 V
+10 -6 V
+10 -7 V
+9 -8 V
+10 -10 V
+10 -11 V
+10 -11 V
+9 -13 V
+10 -14 V
+10 -14 V
+10 -16 V
+9 -16 V
+10 -16 V
+10 -17 V
+10 -17 V
+9 -18 V
+10 -18 V
+10 -18 V
+10 -19 V
+10 -18 V
+9 -19 V
+10 -18 V
+10 -19 V
+10 -18 V
+9 -18 V
+10 -18 V
+10 -18 V
+10 -18 V
+9 -17 V
+10 -18 V
+10 -17 V
+10 -16 V
+9 -17 V
+10 -16 V
+10 -16 V
+10 -15 V
+9 -15 V
+10 -15 V
+10 -14 V
+10 -14 V
+10 -14 V
+9 -14 V
+10 -13 V
+10 -12 V
+10 -13 V
+9 -12 V
+10 -11 V
+10 -12 V
+10 -11 V
+9 -11 V
+10 -10 V
+10 -10 V
+10 -10 V
+9 -10 V
+10 -9 V
+10 -9 V
+10 -9 V
+10 -8 V
+9 -8 V
+10 -8 V
+10 -8 V
+10 -8 V
+9 -7 V
+10 -7 V
+stroke
+2542 693 M
+10 -7 V
+10 -6 V
+9 -7 V
+10 -6 V
+10 -6 V
+10 -6 V
+9 -5 V
+10 -6 V
+10 -5 V
+10 -5 V
+9 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -4 V
+9 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+9 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+9 -4 V
+10 -3 V
+10 -3 V
+10 -4 V
+9 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+9 -2 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+9 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+9 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+9 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+9 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+9 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+9 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+9 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+9 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+9 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+9 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+9 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+9 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+9 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+9 -2 V
+10 -1 V
+10 -1 V
+0.500 UL
+LTb
+531 331 M
+2919 0 V
+0 1745 V
+-2919 0 V
+531 331 L
+1.000 UP
+stroke
+grestore
+end
+showpage
+}}%
+\put(3037,1963){\rjust{$c=1, \alpha=1.0, \beta=1.0$}}%
+\put(1990,2226){\cjust{Levy Skew Distribution}}%
+\put(1990,50){\cjust{$x$}}%
+\put(100,1203){%
+\special{ps: gsave currentpoint currentpoint translate
+270 rotate neg exch neg exch translate}%
+\cstack{$p(x)$}%
+\special{ps: currentpoint grestore moveto}%
+}%
+\put(3450,200){\cjust{ 5}}%
+\put(3158,200){\cjust{ 4}}%
+\put(2866,200){\cjust{ 3}}%
+\put(2574,200){\cjust{ 2}}%
+\put(2282,200){\cjust{ 1}}%
+\put(1990,200){\cjust{ 0}}%
+\put(1699,200){\cjust{-1}}%
+\put(1407,200){\cjust{-2}}%
+\put(1115,200){\cjust{-3}}%
+\put(823,200){\cjust{-4}}%
+\put(531,200){\cjust{-5}}%
+\put(450,1300){\rjust{ 0.05}}%
+\put(450,331){\rjust{ 0}}%
+\endGNUPLOTpicture
+\endgroup
+\endinput
diff --git a/gsl-1.9/doc/rand-logarithmic.tex b/gsl-1.9/doc/rand-logarithmic.tex
new file mode 100644
index 0000000..33b0d89
--- /dev/null
+++ b/gsl-1.9/doc/rand-logarithmic.tex
@@ -0,0 +1,794 @@
+% GNUPLOT: plain TeX with Postscript
+\begingroup
+ \catcode`\@=11\relax
+ \def\GNUPLOTspecial{%
+ \def\do##1{\catcode`##1=12\relax}\dospecials
+ \catcode`\{=1\catcode`\}=2\catcode\%=14\relax\special}%
+%
+\expandafter\ifx\csname GNUPLOTpicture\endcsname\relax
+ \csname newdimen\endcsname\GNUPLOTunit
+ \gdef\GNUPLOTpicture(#1,#2){\vbox to#2\GNUPLOTunit\bgroup
+ \def\put(##1,##2)##3{\unskip\raise##2\GNUPLOTunit
+ \hbox to0pt{\kern##1\GNUPLOTunit ##3\hss}\ignorespaces}%
+ \def\ljust##1{\vbox to0pt{\vss\hbox to0pt{##1\hss}\vss}}%
+ \def\cjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1\hss}\vss}}%
+ \def\rjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1}\vss}}%
+ \def\stack##1{\let\\=\cr\tabskip=0pt\halign{\hfil ####\hfil\cr ##1\crcr}}%
+ \def\lstack##1{\hbox to0pt{\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\cstack##1{\hbox to0pt{\hss\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\rstack##1{\hbox to0pt{\vbox to0pt{\stack{##1}\vss}\hss}}%
+ \vss\hbox to#1\GNUPLOTunit\bgroup\ignorespaces}%
+ \gdef\endGNUPLOTpicture{\hss\egroup\egroup}%
+\fi
+\GNUPLOTunit=0.1bp
+\GNUPLOTpicture(3600,2376)
+{\GNUPLOTspecial{"
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: rand-logarithmic.tex
+%%Creator: gnuplot 4.0 patchlevel 0
+%%CreationDate: Wed Aug 31 12:38:29 2005
+%%DocumentFonts:
+%%BoundingBox: 0 0 360 237
+%%Orientation: Landscape
+%%EndComments
+/gnudict 256 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+/vshift -33 def
+/dl {10.0 mul} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+/Rounded false def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/N {newpath moveto} bind def
+/C {setrgbcolor} bind def
+/f {rlineto fill} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke userlinewidth 2 mul setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/AL { stroke userlinewidth 2 div setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/UL { dup gnulinewidth mul /userlinewidth exch def
+ dup 1 lt {pop 1} if 10 mul /udl exch def } def
+/PL { stroke userlinewidth setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/LTw { PL [] 1 setgray } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 1 0 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
+/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/Pnt { stroke [] 0 setdash
+ gsave 1 setlinecap M 0 0 V stroke grestore } def
+/Dia { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt } def
+/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt } def
+/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt } def
+/Star { 2 copy Pls Crs } def
+/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill } def
+/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill } def
+/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt } def
+/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill } def
+/Pent { stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt } def
+/PentF { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore } def
+/Circle { stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt } def
+/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
+/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def
+/C1 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C2 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C3 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C4 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C5 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc } bind def
+/C6 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C7 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C8 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C9 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C11 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C12 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C13 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C14 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc } bind def
+/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath } bind def
+/Square { dup Rec } bind def
+/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
+/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
+/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
+/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
+/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill
+ Bsquare } bind def
+/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
+/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare } bind def
+/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare } bind def
+/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
+/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare } bind def
+/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
+/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
+/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
+/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
+/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
+/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
+/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
+/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
+/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
+/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
+/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
+/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
+/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
+/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
+/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
+/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
+/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
+/DiaE { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke } def
+/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke } def
+/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke } def
+/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke } def
+/PentE { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore } def
+/CircE { stroke [] 0 setdash
+ hpt 0 360 arc stroke } def
+/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def
+/DiaW { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke } def
+/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke } def
+/TriUW { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke } def
+/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke } def
+/PentW { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore } def
+/CircW { stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke } def
+/BoxFill { gsave Rec 1 setgray fill grestore } def
+/BoxColFill {
+ gsave Rec
+ /Fillden exch def
+ currentrgbcolor
+ /ColB exch def /ColG exch def /ColR exch def
+ /ColR ColR Fillden mul Fillden sub 1 add def
+ /ColG ColG Fillden mul Fillden sub 1 add def
+ /ColB ColB Fillden mul Fillden sub 1 add def
+ ColR ColG ColB setrgbcolor
+ fill grestore } def
+%
+% PostScript Level 1 Pattern Fill routine
+% Usage: x y w h s a XX PatternFill
+% x,y = lower left corner of box to be filled
+% w,h = width and height of box
+% a = angle in degrees between lines and x-axis
+% XX = 0/1 for no/yes cross-hatch
+%
+/PatternFill { gsave /PFa [ 9 2 roll ] def
+ PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
+ PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
+ gsave 1 setgray fill grestore clip
+ currentlinewidth 0.5 mul setlinewidth
+ /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
+ 0 0 M PFa 5 get rotate PFs -2 div dup translate
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 M 0 PFs V } for
+ 0 PFa 6 get ne {
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 2 1 roll M PFs 0 V } for
+ } if
+ stroke grestore } def
+%
+/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
+dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
+currentdict end definefont pop
+end
+%%EndProlog
+gnudict begin
+gsave
+0 0 translate
+0.100 0.100 scale
+0 setgray
+newpath
+0.500 UL
+LTb
+481 331 M
+-31 0 V
+0.500 UL
+LTb
+481 580 M
+-31 0 V
+0.500 UL
+LTb
+481 830 M
+-31 0 V
+0.500 UL
+LTb
+481 1079 M
+-31 0 V
+0.500 UL
+LTb
+481 1328 M
+-31 0 V
+0.500 UL
+LTb
+481 1577 M
+-31 0 V
+0.500 UL
+LTb
+481 1827 M
+-31 0 V
+0.500 UL
+LTb
+481 2076 M
+-31 0 V
+0.500 UL
+LTb
+481 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+751 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+1021 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+1291 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+1561 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+1831 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+2100 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+2370 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+2640 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+2910 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+3180 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+3450 331 M
+0 -63 V
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+LTb
+LTb
+LTb
+1.000 UP
+1.000 UL
+LT0
+LTb
+LT0
+3087 1963 M
+263 0 V
+481 331 M
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0 1449 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0 -942 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+0 -270 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+stroke
+1464 568 M
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+0 -113 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+0 -54 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+0 -29 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0 -17 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+stroke
+2457 355 M
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0 -9 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0 -6 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0 -3 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0 -2 V
+stroke
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+1.000 UP
+stroke
+grestore
+end
+showpage
+}}%
+\put(3037,1963){\rjust{$p=0.7$}}%
+\put(1965,2226){\cjust{Logarithmic Distribution}}%
+\put(1965,50){\cjust{$k$}}%
+\put(100,1203){%
+\special{ps: gsave currentpoint currentpoint translate
+270 rotate neg exch neg exch translate}%
+\cstack{$p(k)$}%
+\special{ps: currentpoint grestore moveto}%
+}%
+\put(3315,200){\cjust{ 10}}%
+\put(3045,200){\cjust{ 9}}%
+\put(2775,200){\cjust{ 8}}%
+\put(2505,200){\cjust{ 7}}%
+\put(2235,200){\cjust{ 6}}%
+\put(1966,200){\cjust{ 5}}%
+\put(1696,200){\cjust{ 4}}%
+\put(1426,200){\cjust{ 3}}%
+\put(1156,200){\cjust{ 2}}%
+\put(886,200){\cjust{ 1}}%
+\put(616,200){\cjust{ 0}}%
+\put(400,2076){\rjust{ 0.7}}%
+\put(400,1827){\rjust{ 0.6}}%
+\put(400,1577){\rjust{ 0.5}}%
+\put(400,1328){\rjust{ 0.4}}%
+\put(400,1079){\rjust{ 0.3}}%
+\put(400,830){\rjust{ 0.2}}%
+\put(400,580){\rjust{ 0.1}}%
+\put(400,331){\rjust{ 0}}%
+\endGNUPLOTpicture
+\endgroup
+\endinput
diff --git a/gsl-1.9/doc/rand-logistic.tex b/gsl-1.9/doc/rand-logistic.tex
new file mode 100644
index 0000000..a56b79b
--- /dev/null
+++ b/gsl-1.9/doc/rand-logistic.tex
@@ -0,0 +1,1049 @@
+% GNUPLOT: plain TeX with Postscript
+\begingroup
+ \catcode`\@=11\relax
+ \def\GNUPLOTspecial{%
+ \def\do##1{\catcode`##1=12\relax}\dospecials
+ \catcode`\{=1\catcode`\}=2\catcode\%=14\relax\special}%
+%
+\expandafter\ifx\csname GNUPLOTpicture\endcsname\relax
+ \csname newdimen\endcsname\GNUPLOTunit
+ \gdef\GNUPLOTpicture(#1,#2){\vbox to#2\GNUPLOTunit\bgroup
+ \def\put(##1,##2)##3{\unskip\raise##2\GNUPLOTunit
+ \hbox to0pt{\kern##1\GNUPLOTunit ##3\hss}\ignorespaces}%
+ \def\ljust##1{\vbox to0pt{\vss\hbox to0pt{##1\hss}\vss}}%
+ \def\cjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1\hss}\vss}}%
+ \def\rjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1}\vss}}%
+ \def\stack##1{\let\\=\cr\tabskip=0pt\halign{\hfil ####\hfil\cr ##1\crcr}}%
+ \def\lstack##1{\hbox to0pt{\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\cstack##1{\hbox to0pt{\hss\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\rstack##1{\hbox to0pt{\vbox to0pt{\stack{##1}\vss}\hss}}%
+ \vss\hbox to#1\GNUPLOTunit\bgroup\ignorespaces}%
+ \gdef\endGNUPLOTpicture{\hss\egroup\egroup}%
+\fi
+\GNUPLOTunit=0.1bp
+\GNUPLOTpicture(3600,2376)
+{\GNUPLOTspecial{"
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: rand-logistic.tex
+%%Creator: gnuplot 4.0 patchlevel 0
+%%CreationDate: Wed Aug 31 12:38:29 2005
+%%DocumentFonts:
+%%BoundingBox: 0 0 360 237
+%%Orientation: Landscape
+%%EndComments
+/gnudict 256 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+/vshift -33 def
+/dl {10.0 mul} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+/Rounded false def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/N {newpath moveto} bind def
+/C {setrgbcolor} bind def
+/f {rlineto fill} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke userlinewidth 2 mul setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/AL { stroke userlinewidth 2 div setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/UL { dup gnulinewidth mul /userlinewidth exch def
+ dup 1 lt {pop 1} if 10 mul /udl exch def } def
+/PL { stroke userlinewidth setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/LTw { PL [] 1 setgray } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 1 0 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
+/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/Pnt { stroke [] 0 setdash
+ gsave 1 setlinecap M 0 0 V stroke grestore } def
+/Dia { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt } def
+/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt } def
+/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt } def
+/Star { 2 copy Pls Crs } def
+/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill } def
+/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill } def
+/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt } def
+/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill } def
+/Pent { stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt } def
+/PentF { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore } def
+/Circle { stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt } def
+/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
+/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def
+/C1 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C2 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C3 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C4 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C5 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc } bind def
+/C6 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C7 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C8 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C9 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C11 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C12 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C13 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C14 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc } bind def
+/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath } bind def
+/Square { dup Rec } bind def
+/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
+/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
+/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
+/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
+/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill
+ Bsquare } bind def
+/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
+/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare } bind def
+/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare } bind def
+/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
+/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare } bind def
+/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
+/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
+/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
+/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
+/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
+/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
+/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
+/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
+/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
+/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
+/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
+/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
+/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
+/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
+/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
+/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
+/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
+/DiaE { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke } def
+/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke } def
+/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke } def
+/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke } def
+/PentE { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore } def
+/CircE { stroke [] 0 setdash
+ hpt 0 360 arc stroke } def
+/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def
+/DiaW { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke } def
+/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke } def
+/TriUW { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke } def
+/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke } def
+/PentW { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore } def
+/CircW { stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke } def
+/BoxFill { gsave Rec 1 setgray fill grestore } def
+/BoxColFill {
+ gsave Rec
+ /Fillden exch def
+ currentrgbcolor
+ /ColB exch def /ColG exch def /ColR exch def
+ /ColR ColR Fillden mul Fillden sub 1 add def
+ /ColG ColG Fillden mul Fillden sub 1 add def
+ /ColB ColB Fillden mul Fillden sub 1 add def
+ ColR ColG ColB setrgbcolor
+ fill grestore } def
+%
+% PostScript Level 1 Pattern Fill routine
+% Usage: x y w h s a XX PatternFill
+% x,y = lower left corner of box to be filled
+% w,h = width and height of box
+% a = angle in degrees between lines and x-axis
+% XX = 0/1 for no/yes cross-hatch
+%
+/PatternFill { gsave /PFa [ 9 2 roll ] def
+ PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
+ PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
+ gsave 1 setgray fill grestore clip
+ currentlinewidth 0.5 mul setlinewidth
+ /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
+ 0 0 M PFa 5 get rotate PFs -2 div dup translate
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 M 0 PFs V } for
+ 0 PFa 6 get ne {
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 2 1 roll M PFs 0 V } for
+ } if
+ stroke grestore } def
+%
+/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
+dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
+currentdict end definefont pop
+end
+%%EndProlog
+gnudict begin
+gsave
+0 0 translate
+0.100 0.100 scale
+0 setgray
+newpath
+0.500 UL
+LTb
+481 331 M
+-31 0 V
+0.500 UL
+LTb
+481 913 M
+-31 0 V
+0.500 UL
+LTb
+481 1494 M
+-31 0 V
+0.500 UL
+LTb
+481 2076 M
+-31 0 V
+0.500 UL
+LTb
+481 331 M
+0 -31 V
+0.500 UL
+LTb
+778 331 M
+0 -31 V
+0.500 UL
+LTb
+1075 331 M
+0 -31 V
+0.500 UL
+LTb
+1372 331 M
+0 -31 V
+0.500 UL
+LTb
+1669 331 M
+0 -31 V
+0.500 UL
+LTb
+1965 331 M
+0 -31 V
+0.500 UL
+LTb
+2262 331 M
+0 -31 V
+0.500 UL
+LTb
+2559 331 M
+0 -31 V
+0.500 UL
+LTb
+2856 331 M
+0 -31 V
+0.500 UL
+LTb
+3153 331 M
+0 -31 V
+0.500 UL
+LTb
+3450 331 M
+0 -31 V
+0.500 UL
+LTb
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+LTb
+LTb
+LTb
+1.000 UP
+1.000 UL
+LT0
+LTb
+LT0
+3087 1963 M
+263 0 V
+481 370 M
+10 1 V
+10 1 V
+10 2 V
+10 1 V
+10 2 V
+10 1 V
+10 2 V
+9 1 V
+10 2 V
+10 2 V
+10 2 V
+10 1 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 3 V
+10 2 V
+10 2 V
+10 3 V
+10 2 V
+9 3 V
+10 2 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+10 4 V
+10 4 V
+10 3 V
+10 4 V
+9 4 V
+10 4 V
+10 4 V
+10 5 V
+10 4 V
+10 5 V
+10 4 V
+10 5 V
+10 5 V
+10 5 V
+10 6 V
+10 5 V
+10 6 V
+10 5 V
+9 6 V
+10 7 V
+10 6 V
+10 6 V
+10 7 V
+10 7 V
+10 7 V
+10 7 V
+10 8 V
+10 7 V
+10 8 V
+10 8 V
+10 9 V
+10 8 V
+10 9 V
+9 9 V
+10 9 V
+10 10 V
+10 10 V
+10 10 V
+10 10 V
+10 10 V
+10 11 V
+10 11 V
+10 11 V
+10 12 V
+10 11 V
+10 12 V
+10 13 V
+9 12 V
+10 13 V
+10 13 V
+10 14 V
+10 13 V
+10 14 V
+10 14 V
+10 15 V
+10 15 V
+10 15 V
+10 15 V
+10 15 V
+10 16 V
+10 16 V
+9 16 V
+10 17 V
+10 17 V
+10 16 V
+10 18 V
+10 17 V
+10 17 V
+10 18 V
+10 18 V
+10 18 V
+stroke
+1494 1150 M
+10 18 V
+10 19 V
+10 18 V
+10 18 V
+9 19 V
+10 19 V
+10 18 V
+10 19 V
+10 19 V
+10 19 V
+10 18 V
+10 19 V
+10 18 V
+10 19 V
+10 18 V
+10 18 V
+10 18 V
+10 18 V
+10 17 V
+9 17 V
+10 17 V
+10 17 V
+10 16 V
+10 16 V
+10 15 V
+10 15 V
+10 15 V
+10 14 V
+10 13 V
+10 13 V
+10 13 V
+10 12 V
+10 11 V
+9 11 V
+10 9 V
+10 10 V
+10 8 V
+10 8 V
+10 7 V
+10 7 V
+10 5 V
+10 5 V
+10 4 V
+10 3 V
+10 3 V
+10 1 V
+10 1 V
+9 0 V
+10 -1 V
+10 -1 V
+10 -3 V
+10 -3 V
+10 -4 V
+10 -5 V
+10 -5 V
+10 -7 V
+10 -7 V
+10 -8 V
+10 -8 V
+10 -10 V
+10 -9 V
+9 -11 V
+10 -11 V
+10 -12 V
+10 -13 V
+10 -13 V
+10 -13 V
+10 -14 V
+10 -15 V
+10 -15 V
+10 -15 V
+10 -16 V
+10 -16 V
+10 -17 V
+10 -17 V
+9 -17 V
+10 -17 V
+10 -18 V
+10 -18 V
+10 -18 V
+10 -18 V
+10 -19 V
+10 -18 V
+10 -19 V
+10 -18 V
+10 -19 V
+10 -19 V
+10 -19 V
+10 -18 V
+10 -19 V
+9 -19 V
+10 -18 V
+10 -18 V
+10 -19 V
+10 -18 V
+10 -18 V
+10 -18 V
+10 -18 V
+10 -17 V
+10 -17 V
+10 -18 V
+10 -16 V
+10 -17 V
+10 -17 V
+stroke
+2527 994 M
+9 -16 V
+10 -16 V
+10 -16 V
+10 -15 V
+10 -15 V
+10 -15 V
+10 -15 V
+10 -15 V
+10 -14 V
+10 -14 V
+10 -13 V
+10 -14 V
+10 -13 V
+10 -13 V
+9 -12 V
+10 -13 V
+10 -12 V
+10 -11 V
+10 -12 V
+10 -11 V
+10 -11 V
+10 -11 V
+10 -10 V
+10 -10 V
+10 -10 V
+10 -10 V
+10 -10 V
+10 -9 V
+9 -9 V
+10 -9 V
+10 -8 V
+10 -9 V
+10 -8 V
+10 -8 V
+10 -7 V
+10 -8 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -6 V
+10 -6 V
+10 -7 V
+9 -6 V
+10 -5 V
+10 -6 V
+10 -5 V
+10 -6 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+9 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+9 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+9 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+1.000 UL
+LT1
+LTb
+LT1
+3087 1863 M
+263 0 V
+481 535 M
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+9 3 V
+10 3 V
+10 3 V
+10 4 V
+10 3 V
+10 3 V
+10 4 V
+10 3 V
+10 3 V
+10 4 V
+10 3 V
+10 4 V
+10 3 V
+10 4 V
+9 4 V
+10 3 V
+10 4 V
+10 4 V
+10 3 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+9 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 5 V
+10 4 V
+10 4 V
+10 4 V
+10 5 V
+10 4 V
+10 5 V
+10 4 V
+9 4 V
+10 5 V
+10 4 V
+10 5 V
+10 4 V
+10 5 V
+10 4 V
+10 5 V
+10 4 V
+10 5 V
+10 5 V
+10 4 V
+10 5 V
+10 5 V
+10 4 V
+9 5 V
+10 5 V
+10 4 V
+10 5 V
+10 5 V
+10 4 V
+10 5 V
+10 5 V
+10 4 V
+10 5 V
+10 5 V
+10 4 V
+10 5 V
+10 5 V
+9 4 V
+10 5 V
+10 4 V
+10 5 V
+10 5 V
+10 4 V
+10 5 V
+10 4 V
+10 5 V
+10 4 V
+10 5 V
+10 4 V
+10 5 V
+10 4 V
+9 4 V
+10 5 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 5 V
+10 3 V
+stroke
+1494 954 M
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+9 3 V
+10 4 V
+10 4 V
+10 3 V
+10 4 V
+10 3 V
+10 3 V
+10 4 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+10 2 V
+9 3 V
+10 3 V
+10 2 V
+10 2 V
+10 3 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 1 V
+10 2 V
+10 2 V
+9 1 V
+10 1 V
+10 1 V
+10 2 V
+10 1 V
+10 0 V
+10 1 V
+10 1 V
+10 1 V
+10 0 V
+10 0 V
+10 1 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+9 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -3 V
+9 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -4 V
+9 -3 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -5 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -5 V
+stroke
+2527 917 M
+9 -4 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+9 -4 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+9 -5 V
+10 -4 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -5 V
+9 -4 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+9 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -4 V
+10 -3 V
+9 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+9 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+1.000 UP
+stroke
+grestore
+end
+showpage
+}}%
+\put(3037,1863){\rjust{$a=2$}}%
+\put(3037,1963){\rjust{$a=1$}}%
+\put(1965,2226){\cjust{Logistic Distribution}}%
+\put(1965,50){\cjust{$x$}}%
+\put(100,1203){%
+\special{ps: gsave currentpoint currentpoint translate
+270 rotate neg exch neg exch translate}%
+\cstack{$p(x)$}%
+\special{ps: currentpoint grestore moveto}%
+}%
+\put(3450,200){\cjust{ 5}}%
+\put(3153,200){\cjust{ 4}}%
+\put(2856,200){\cjust{ 3}}%
+\put(2559,200){\cjust{ 2}}%
+\put(2262,200){\cjust{ 1}}%
+\put(1965,200){\cjust{ 0}}%
+\put(1669,200){\cjust{-1}}%
+\put(1372,200){\cjust{-2}}%
+\put(1075,200){\cjust{-3}}%
+\put(778,200){\cjust{-4}}%
+\put(481,200){\cjust{-5}}%
+\put(400,2076){\rjust{ 0.3}}%
+\put(400,1494){\rjust{ 0.2}}%
+\put(400,913){\rjust{ 0.1}}%
+\put(400,331){\rjust{ 0}}%
+\endGNUPLOTpicture
+\endgroup
+\endinput
diff --git a/gsl-1.9/doc/rand-lognormal.tex b/gsl-1.9/doc/rand-lognormal.tex
new file mode 100644
index 0000000..1798e4b
--- /dev/null
+++ b/gsl-1.9/doc/rand-lognormal.tex
@@ -0,0 +1,1002 @@
+% GNUPLOT: plain TeX with Postscript
+\begingroup
+ \catcode`\@=11\relax
+ \def\GNUPLOTspecial{%
+ \def\do##1{\catcode`##1=12\relax}\dospecials
+ \catcode`\{=1\catcode`\}=2\catcode\%=14\relax\special}%
+%
+\expandafter\ifx\csname GNUPLOTpicture\endcsname\relax
+ \csname newdimen\endcsname\GNUPLOTunit
+ \gdef\GNUPLOTpicture(#1,#2){\vbox to#2\GNUPLOTunit\bgroup
+ \def\put(##1,##2)##3{\unskip\raise##2\GNUPLOTunit
+ \hbox to0pt{\kern##1\GNUPLOTunit ##3\hss}\ignorespaces}%
+ \def\ljust##1{\vbox to0pt{\vss\hbox to0pt{##1\hss}\vss}}%
+ \def\cjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1\hss}\vss}}%
+ \def\rjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1}\vss}}%
+ \def\stack##1{\let\\=\cr\tabskip=0pt\halign{\hfil ####\hfil\cr ##1\crcr}}%
+ \def\lstack##1{\hbox to0pt{\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\cstack##1{\hbox to0pt{\hss\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\rstack##1{\hbox to0pt{\vbox to0pt{\stack{##1}\vss}\hss}}%
+ \vss\hbox to#1\GNUPLOTunit\bgroup\ignorespaces}%
+ \gdef\endGNUPLOTpicture{\hss\egroup\egroup}%
+\fi
+\GNUPLOTunit=0.1bp
+\GNUPLOTpicture(3600,2376)
+{\GNUPLOTspecial{"
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: rand-lognormal.tex
+%%Creator: gnuplot 4.0 patchlevel 0
+%%CreationDate: Wed Aug 31 12:38:29 2005
+%%DocumentFonts:
+%%BoundingBox: 0 0 360 237
+%%Orientation: Landscape
+%%EndComments
+/gnudict 256 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+/vshift -33 def
+/dl {10.0 mul} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+/Rounded false def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/N {newpath moveto} bind def
+/C {setrgbcolor} bind def
+/f {rlineto fill} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke userlinewidth 2 mul setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/AL { stroke userlinewidth 2 div setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/UL { dup gnulinewidth mul /userlinewidth exch def
+ dup 1 lt {pop 1} if 10 mul /udl exch def } def
+/PL { stroke userlinewidth setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/LTw { PL [] 1 setgray } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 1 0 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
+/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/Pnt { stroke [] 0 setdash
+ gsave 1 setlinecap M 0 0 V stroke grestore } def
+/Dia { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt } def
+/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt } def
+/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt } def
+/Star { 2 copy Pls Crs } def
+/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill } def
+/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill } def
+/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt } def
+/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill } def
+/Pent { stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt } def
+/PentF { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore } def
+/Circle { stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt } def
+/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
+/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def
+/C1 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C2 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C3 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C4 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C5 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc } bind def
+/C6 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C7 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C8 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C9 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C11 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C12 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C13 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C14 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc } bind def
+/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath } bind def
+/Square { dup Rec } bind def
+/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
+/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
+/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
+/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
+/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill
+ Bsquare } bind def
+/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
+/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare } bind def
+/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare } bind def
+/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
+/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare } bind def
+/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
+/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
+/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
+/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
+/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
+/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
+/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
+/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
+/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
+/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
+/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
+/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
+/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
+/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
+/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
+/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
+/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
+/DiaE { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke } def
+/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke } def
+/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke } def
+/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke } def
+/PentE { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore } def
+/CircE { stroke [] 0 setdash
+ hpt 0 360 arc stroke } def
+/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def
+/DiaW { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke } def
+/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke } def
+/TriUW { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke } def
+/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke } def
+/PentW { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore } def
+/CircW { stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke } def
+/BoxFill { gsave Rec 1 setgray fill grestore } def
+/BoxColFill {
+ gsave Rec
+ /Fillden exch def
+ currentrgbcolor
+ /ColB exch def /ColG exch def /ColR exch def
+ /ColR ColR Fillden mul Fillden sub 1 add def
+ /ColG ColG Fillden mul Fillden sub 1 add def
+ /ColB ColB Fillden mul Fillden sub 1 add def
+ ColR ColG ColB setrgbcolor
+ fill grestore } def
+%
+% PostScript Level 1 Pattern Fill routine
+% Usage: x y w h s a XX PatternFill
+% x,y = lower left corner of box to be filled
+% w,h = width and height of box
+% a = angle in degrees between lines and x-axis
+% XX = 0/1 for no/yes cross-hatch
+%
+/PatternFill { gsave /PFa [ 9 2 roll ] def
+ PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
+ PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
+ gsave 1 setgray fill grestore clip
+ currentlinewidth 0.5 mul setlinewidth
+ /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
+ 0 0 M PFa 5 get rotate PFs -2 div dup translate
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 M 0 PFs V } for
+ 0 PFa 6 get ne {
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 2 1 roll M PFs 0 V } for
+ } if
+ stroke grestore } def
+%
+/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
+dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
+currentdict end definefont pop
+end
+%%EndProlog
+gnudict begin
+gsave
+0 0 translate
+0.100 0.100 scale
+0 setgray
+newpath
+0.500 UL
+LTb
+481 331 M
+-31 0 V
+0.500 UL
+LTb
+481 1577 M
+-31 0 V
+0.500 UL
+LTb
+481 331 M
+0 -31 V
+0.500 UL
+LTb
+1471 331 M
+0 -31 V
+0.500 UL
+LTb
+2460 331 M
+0 -31 V
+0.500 UL
+LTb
+3450 331 M
+0 -31 V
+0.500 UL
+LTb
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+LTb
+LTb
+LTb
+1.000 UP
+1.000 UL
+LT0
+LTb
+LT0
+3087 1963 M
+263 0 V
+491 333 M
+10 22 V
+10 47 V
+10 70 V
+10 84 V
+10 94 V
+10 97 V
+9 99 V
+10 96 V
+10 94 V
+10 89 V
+10 85 V
+10 79 V
+10 74 V
+10 68 V
+10 63 V
+10 57 V
+10 53 V
+10 48 V
+10 44 V
+10 39 V
+9 35 V
+10 32 V
+10 28 V
+10 25 V
+10 22 V
+10 19 V
+10 16 V
+10 14 V
+10 12 V
+10 10 V
+10 8 V
+10 6 V
+10 4 V
+10 3 V
+9 1 V
+10 1 V
+10 -1 V
+10 -2 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -6 V
+10 -6 V
+10 -7 V
+10 -8 V
+10 -8 V
+10 -9 V
+10 -9 V
+9 -9 V
+10 -10 V
+10 -10 V
+10 -11 V
+10 -11 V
+10 -11 V
+10 -11 V
+10 -11 V
+10 -12 V
+10 -12 V
+10 -12 V
+10 -12 V
+10 -12 V
+10 -12 V
+10 -12 V
+9 -12 V
+10 -12 V
+10 -13 V
+10 -12 V
+10 -12 V
+10 -13 V
+10 -12 V
+10 -12 V
+10 -12 V
+10 -13 V
+10 -12 V
+10 -12 V
+10 -12 V
+10 -12 V
+9 -12 V
+10 -12 V
+10 -11 V
+10 -12 V
+10 -12 V
+10 -11 V
+10 -12 V
+10 -11 V
+10 -11 V
+10 -11 V
+10 -11 V
+10 -11 V
+10 -11 V
+10 -11 V
+9 -11 V
+10 -10 V
+10 -11 V
+10 -10 V
+10 -11 V
+10 -10 V
+10 -10 V
+10 -10 V
+10 -10 V
+10 -10 V
+10 -9 V
+stroke
+1504 1293 M
+10 -10 V
+10 -9 V
+10 -10 V
+9 -9 V
+10 -9 V
+10 -9 V
+10 -9 V
+10 -9 V
+10 -9 V
+10 -9 V
+10 -8 V
+10 -9 V
+10 -8 V
+10 -9 V
+10 -8 V
+10 -8 V
+10 -8 V
+10 -8 V
+9 -8 V
+10 -8 V
+10 -7 V
+10 -8 V
+10 -8 V
+10 -7 V
+10 -7 V
+10 -8 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+9 -7 V
+10 -6 V
+10 -7 V
+10 -6 V
+10 -7 V
+10 -6 V
+10 -6 V
+10 -7 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -5 V
+9 -6 V
+10 -6 V
+10 -5 V
+10 -6 V
+10 -6 V
+10 -5 V
+10 -5 V
+10 -6 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+9 -5 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+9 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -4 V
+9 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+9 -3 V
+stroke
+2536 698 M
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+9 -2 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -3 V
+9 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+9 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+9 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+9 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+9 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+1.000 UL
+LT1
+LTb
+LT1
+3087 1863 M
+263 0 V
+491 331 M
+10 0 V
+10 1 V
+10 2 V
+10 4 V
+10 5 V
+10 6 V
+9 7 V
+10 8 V
+10 10 V
+10 10 V
+10 11 V
+10 12 V
+10 12 V
+10 12 V
+10 13 V
+10 13 V
+10 13 V
+10 14 V
+10 13 V
+10 13 V
+9 14 V
+10 13 V
+10 13 V
+10 13 V
+10 13 V
+10 12 V
+10 12 V
+10 13 V
+10 11 V
+10 12 V
+10 11 V
+10 11 V
+10 11 V
+10 11 V
+9 10 V
+10 10 V
+10 10 V
+10 9 V
+10 10 V
+10 9 V
+10 8 V
+10 9 V
+10 8 V
+10 8 V
+10 7 V
+10 8 V
+10 7 V
+10 7 V
+9 6 V
+10 7 V
+10 6 V
+10 6 V
+10 6 V
+10 5 V
+10 6 V
+10 5 V
+10 5 V
+10 5 V
+10 4 V
+10 5 V
+10 4 V
+10 4 V
+10 4 V
+9 4 V
+10 3 V
+10 3 V
+10 4 V
+10 3 V
+10 3 V
+10 2 V
+10 3 V
+10 3 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+9 2 V
+10 2 V
+10 1 V
+10 2 V
+10 1 V
+10 1 V
+10 2 V
+10 1 V
+10 1 V
+10 1 V
+10 0 V
+10 1 V
+10 1 V
+10 0 V
+9 1 V
+10 0 V
+10 1 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+stroke
+1504 934 M
+10 0 V
+10 -1 V
+10 0 V
+9 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+9 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+9 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+9 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+9 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+9 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+9 -1 V
+stroke
+2536 793 M
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+9 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+9 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+9 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+9 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+9 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+9 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+1.000 UP
+stroke
+grestore
+end
+showpage
+}}%
+\put(3037,1863){\rjust{$\zeta=1, \sigma=1$}}%
+\put(3037,1963){\rjust{$\zeta=0, \sigma=1$}}%
+\put(1965,2226){\cjust{Lognormal Distribution}}%
+\put(1965,50){\cjust{$x$}}%
+\put(100,1203){%
+\special{ps: gsave currentpoint currentpoint translate
+270 rotate neg exch neg exch translate}%
+\cstack{$p(x)$}%
+\special{ps: currentpoint grestore moveto}%
+}%
+\put(3450,200){\cjust{ 3}}%
+\put(2460,200){\cjust{ 2}}%
+\put(1471,200){\cjust{ 1}}%
+\put(481,200){\cjust{ 0}}%
+\put(400,1577){\rjust{ 0.5}}%
+\put(400,331){\rjust{ 0}}%
+\endGNUPLOTpicture
+\endgroup
+\endinput
diff --git a/gsl-1.9/doc/rand-nbinomial.tex b/gsl-1.9/doc/rand-nbinomial.tex
new file mode 100644
index 0000000..be87b1c
--- /dev/null
+++ b/gsl-1.9/doc/rand-nbinomial.tex
@@ -0,0 +1,774 @@
+% GNUPLOT: plain TeX with Postscript
+\begingroup
+ \catcode`\@=11\relax
+ \def\GNUPLOTspecial{%
+ \def\do##1{\catcode`##1=12\relax}\dospecials
+ \catcode`\{=1\catcode`\}=2\catcode\%=14\relax\special}%
+%
+\expandafter\ifx\csname GNUPLOTpicture\endcsname\relax
+ \csname newdimen\endcsname\GNUPLOTunit
+ \gdef\GNUPLOTpicture(#1,#2){\vbox to#2\GNUPLOTunit\bgroup
+ \def\put(##1,##2)##3{\unskip\raise##2\GNUPLOTunit
+ \hbox to0pt{\kern##1\GNUPLOTunit ##3\hss}\ignorespaces}%
+ \def\ljust##1{\vbox to0pt{\vss\hbox to0pt{##1\hss}\vss}}%
+ \def\cjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1\hss}\vss}}%
+ \def\rjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1}\vss}}%
+ \def\stack##1{\let\\=\cr\tabskip=0pt\halign{\hfil ####\hfil\cr ##1\crcr}}%
+ \def\lstack##1{\hbox to0pt{\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\cstack##1{\hbox to0pt{\hss\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\rstack##1{\hbox to0pt{\vbox to0pt{\stack{##1}\vss}\hss}}%
+ \vss\hbox to#1\GNUPLOTunit\bgroup\ignorespaces}%
+ \gdef\endGNUPLOTpicture{\hss\egroup\egroup}%
+\fi
+\GNUPLOTunit=0.1bp
+\GNUPLOTpicture(3600,2376)
+{\GNUPLOTspecial{"
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: rand-nbinomial.tex
+%%Creator: gnuplot 4.0 patchlevel 0
+%%CreationDate: Wed Aug 31 12:38:29 2005
+%%DocumentFonts:
+%%BoundingBox: 0 0 360 237
+%%Orientation: Landscape
+%%EndComments
+/gnudict 256 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+/vshift -33 def
+/dl {10.0 mul} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+/Rounded false def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/N {newpath moveto} bind def
+/C {setrgbcolor} bind def
+/f {rlineto fill} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke userlinewidth 2 mul setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/AL { stroke userlinewidth 2 div setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/UL { dup gnulinewidth mul /userlinewidth exch def
+ dup 1 lt {pop 1} if 10 mul /udl exch def } def
+/PL { stroke userlinewidth setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/LTw { PL [] 1 setgray } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 1 0 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
+/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/Pnt { stroke [] 0 setdash
+ gsave 1 setlinecap M 0 0 V stroke grestore } def
+/Dia { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt } def
+/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt } def
+/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt } def
+/Star { 2 copy Pls Crs } def
+/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill } def
+/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill } def
+/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt } def
+/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill } def
+/Pent { stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt } def
+/PentF { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore } def
+/Circle { stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt } def
+/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
+/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def
+/C1 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C2 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C3 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C4 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C5 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc } bind def
+/C6 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C7 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C8 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C9 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C11 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C12 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C13 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C14 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc } bind def
+/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath } bind def
+/Square { dup Rec } bind def
+/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
+/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
+/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
+/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
+/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill
+ Bsquare } bind def
+/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
+/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare } bind def
+/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare } bind def
+/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
+/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare } bind def
+/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
+/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
+/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
+/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
+/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
+/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
+/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
+/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
+/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
+/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
+/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
+/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
+/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
+/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
+/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
+/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
+/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
+/DiaE { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke } def
+/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke } def
+/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke } def
+/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke } def
+/PentE { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore } def
+/CircE { stroke [] 0 setdash
+ hpt 0 360 arc stroke } def
+/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def
+/DiaW { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke } def
+/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke } def
+/TriUW { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke } def
+/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke } def
+/PentW { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore } def
+/CircW { stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke } def
+/BoxFill { gsave Rec 1 setgray fill grestore } def
+/BoxColFill {
+ gsave Rec
+ /Fillden exch def
+ currentrgbcolor
+ /ColB exch def /ColG exch def /ColR exch def
+ /ColR ColR Fillden mul Fillden sub 1 add def
+ /ColG ColG Fillden mul Fillden sub 1 add def
+ /ColB ColB Fillden mul Fillden sub 1 add def
+ ColR ColG ColB setrgbcolor
+ fill grestore } def
+%
+% PostScript Level 1 Pattern Fill routine
+% Usage: x y w h s a XX PatternFill
+% x,y = lower left corner of box to be filled
+% w,h = width and height of box
+% a = angle in degrees between lines and x-axis
+% XX = 0/1 for no/yes cross-hatch
+%
+/PatternFill { gsave /PFa [ 9 2 roll ] def
+ PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
+ PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
+ gsave 1 setgray fill grestore clip
+ currentlinewidth 0.5 mul setlinewidth
+ /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
+ 0 0 M PFa 5 get rotate PFs -2 div dup translate
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 M 0 PFs V } for
+ 0 PFa 6 get ne {
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 2 1 roll M PFs 0 V } for
+ } if
+ stroke grestore } def
+%
+/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
+dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
+currentdict end definefont pop
+end
+%%EndProlog
+gnudict begin
+gsave
+0 0 translate
+0.100 0.100 scale
+0 setgray
+newpath
+0.500 UL
+LTb
+481 331 M
+-31 0 V
+0.500 UL
+LTb
+481 913 M
+-31 0 V
+0.500 UL
+LTb
+481 1494 M
+-31 0 V
+0.500 UL
+LTb
+481 2076 M
+-31 0 V
+0.500 UL
+LTb
+481 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+751 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+1021 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+1291 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+1561 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+1831 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+2100 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+2370 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+2640 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+2910 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+3180 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+3450 331 M
+0 -63 V
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+LTb
+LTb
+LTb
+1.000 UP
+1.000 UL
+LT0
+LTb
+LT0
+3087 1963 M
+263 0 V
+481 845 M
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0 386 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0 112 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+0 -84 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+stroke
+1464 1259 M
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+0 -174 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+0 -189 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+0 -164 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0 -129 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+stroke
+2457 603 M
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0 -94 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0 -64 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0 -43 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0 -27 V
+stroke
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+1.000 UP
+stroke
+grestore
+end
+showpage
+}}%
+\put(3037,1963){\rjust{$p=0.5,n=3.5$}}%
+\put(1965,2226){\cjust{Negative Binomial Distribution}}%
+\put(1965,50){\cjust{$k$}}%
+\put(100,1203){%
+\special{ps: gsave currentpoint currentpoint translate
+270 rotate neg exch neg exch translate}%
+\cstack{$p(k)$}%
+\special{ps: currentpoint grestore moveto}%
+}%
+\put(3315,200){\cjust{ 10}}%
+\put(3045,200){\cjust{ 9}}%
+\put(2775,200){\cjust{ 8}}%
+\put(2505,200){\cjust{ 7}}%
+\put(2235,200){\cjust{ 6}}%
+\put(1966,200){\cjust{ 5}}%
+\put(1696,200){\cjust{ 4}}%
+\put(1426,200){\cjust{ 3}}%
+\put(1156,200){\cjust{ 2}}%
+\put(886,200){\cjust{ 1}}%
+\put(616,200){\cjust{ 0}}%
+\put(400,2076){\rjust{ 0.3}}%
+\put(400,1494){\rjust{ 0.2}}%
+\put(400,913){\rjust{ 0.1}}%
+\put(400,331){\rjust{ 0}}%
+\endGNUPLOTpicture
+\endgroup
+\endinput
diff --git a/gsl-1.9/doc/rand-pareto.tex b/gsl-1.9/doc/rand-pareto.tex
new file mode 100644
index 0000000..a33c04f
--- /dev/null
+++ b/gsl-1.9/doc/rand-pareto.tex
@@ -0,0 +1,1029 @@
+% GNUPLOT: plain TeX with Postscript
+\begingroup
+ \catcode`\@=11\relax
+ \def\GNUPLOTspecial{%
+ \def\do##1{\catcode`##1=12\relax}\dospecials
+ \catcode`\{=1\catcode`\}=2\catcode\%=14\relax\special}%
+%
+\expandafter\ifx\csname GNUPLOTpicture\endcsname\relax
+ \csname newdimen\endcsname\GNUPLOTunit
+ \gdef\GNUPLOTpicture(#1,#2){\vbox to#2\GNUPLOTunit\bgroup
+ \def\put(##1,##2)##3{\unskip\raise##2\GNUPLOTunit
+ \hbox to0pt{\kern##1\GNUPLOTunit ##3\hss}\ignorespaces}%
+ \def\ljust##1{\vbox to0pt{\vss\hbox to0pt{##1\hss}\vss}}%
+ \def\cjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1\hss}\vss}}%
+ \def\rjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1}\vss}}%
+ \def\stack##1{\let\\=\cr\tabskip=0pt\halign{\hfil ####\hfil\cr ##1\crcr}}%
+ \def\lstack##1{\hbox to0pt{\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\cstack##1{\hbox to0pt{\hss\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\rstack##1{\hbox to0pt{\vbox to0pt{\stack{##1}\vss}\hss}}%
+ \vss\hbox to#1\GNUPLOTunit\bgroup\ignorespaces}%
+ \gdef\endGNUPLOTpicture{\hss\egroup\egroup}%
+\fi
+\GNUPLOTunit=0.1bp
+\GNUPLOTpicture(3600,2376)
+{\GNUPLOTspecial{"
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: rand-pareto.tex
+%%Creator: gnuplot 4.0 patchlevel 0
+%%CreationDate: Wed Aug 31 12:38:29 2005
+%%DocumentFonts:
+%%BoundingBox: 0 0 360 237
+%%Orientation: Landscape
+%%EndComments
+/gnudict 256 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+/vshift -33 def
+/dl {10.0 mul} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+/Rounded false def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/N {newpath moveto} bind def
+/C {setrgbcolor} bind def
+/f {rlineto fill} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke userlinewidth 2 mul setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/AL { stroke userlinewidth 2 div setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/UL { dup gnulinewidth mul /userlinewidth exch def
+ dup 1 lt {pop 1} if 10 mul /udl exch def } def
+/PL { stroke userlinewidth setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/LTw { PL [] 1 setgray } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 1 0 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
+/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/Pnt { stroke [] 0 setdash
+ gsave 1 setlinecap M 0 0 V stroke grestore } def
+/Dia { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt } def
+/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt } def
+/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt } def
+/Star { 2 copy Pls Crs } def
+/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill } def
+/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill } def
+/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt } def
+/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill } def
+/Pent { stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt } def
+/PentF { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore } def
+/Circle { stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt } def
+/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
+/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def
+/C1 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C2 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C3 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C4 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C5 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc } bind def
+/C6 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C7 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C8 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C9 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C11 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C12 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C13 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C14 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc } bind def
+/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath } bind def
+/Square { dup Rec } bind def
+/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
+/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
+/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
+/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
+/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill
+ Bsquare } bind def
+/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
+/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare } bind def
+/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare } bind def
+/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
+/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare } bind def
+/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
+/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
+/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
+/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
+/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
+/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
+/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
+/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
+/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
+/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
+/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
+/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
+/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
+/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
+/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
+/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
+/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
+/DiaE { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke } def
+/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke } def
+/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke } def
+/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke } def
+/PentE { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore } def
+/CircE { stroke [] 0 setdash
+ hpt 0 360 arc stroke } def
+/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def
+/DiaW { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke } def
+/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke } def
+/TriUW { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke } def
+/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke } def
+/PentW { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore } def
+/CircW { stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke } def
+/BoxFill { gsave Rec 1 setgray fill grestore } def
+/BoxColFill {
+ gsave Rec
+ /Fillden exch def
+ currentrgbcolor
+ /ColB exch def /ColG exch def /ColR exch def
+ /ColR ColR Fillden mul Fillden sub 1 add def
+ /ColG ColG Fillden mul Fillden sub 1 add def
+ /ColB ColB Fillden mul Fillden sub 1 add def
+ ColR ColG ColB setrgbcolor
+ fill grestore } def
+%
+% PostScript Level 1 Pattern Fill routine
+% Usage: x y w h s a XX PatternFill
+% x,y = lower left corner of box to be filled
+% w,h = width and height of box
+% a = angle in degrees between lines and x-axis
+% XX = 0/1 for no/yes cross-hatch
+%
+/PatternFill { gsave /PFa [ 9 2 roll ] def
+ PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
+ PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
+ gsave 1 setgray fill grestore clip
+ currentlinewidth 0.5 mul setlinewidth
+ /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
+ 0 0 M PFa 5 get rotate PFs -2 div dup translate
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 M 0 PFs V } for
+ 0 PFa 6 get ne {
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 2 1 roll M PFs 0 V } for
+ } if
+ stroke grestore } def
+%
+/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
+dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
+currentdict end definefont pop
+end
+%%EndProlog
+gnudict begin
+gsave
+0 0 translate
+0.100 0.100 scale
+0 setgray
+newpath
+0.500 UL
+LTb
+481 331 M
+-31 0 V
+0.500 UL
+LTb
+481 767 M
+-31 0 V
+0.500 UL
+LTb
+481 1204 M
+-31 0 V
+0.500 UL
+LTb
+481 1640 M
+-31 0 V
+0.500 UL
+LTb
+481 2076 M
+-31 0 V
+0.500 UL
+LTb
+481 331 M
+0 -31 V
+0.500 UL
+LTb
+1075 331 M
+0 -31 V
+0.500 UL
+LTb
+1669 331 M
+0 -31 V
+0.500 UL
+LTb
+2262 331 M
+0 -31 V
+0.500 UL
+LTb
+2856 331 M
+0 -31 V
+0.500 UL
+LTb
+3450 331 M
+0 -31 V
+0.500 UL
+LTb
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+LTb
+LTb
+LTb
+1.000 UP
+1.000 UL
+LT0
+LTb
+LT0
+3087 1963 M
+263 0 V
+481 331 M
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 867 V
+10 -28 V
+10 -27 V
+10 -26 V
+10 -24 V
+9 -24 V
+10 -22 V
+10 -21 V
+10 -20 V
+10 -20 V
+10 -18 V
+10 -18 V
+10 -17 V
+10 -17 V
+10 -15 V
+10 -15 V
+10 -15 V
+10 -14 V
+10 -13 V
+9 -13 V
+10 -12 V
+10 -12 V
+10 -12 V
+10 -11 V
+10 -11 V
+10 -10 V
+10 -10 V
+10 -10 V
+10 -9 V
+10 -9 V
+10 -9 V
+10 -8 V
+10 -8 V
+9 -8 V
+10 -8 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -6 V
+10 -6 V
+10 -6 V
+stroke
+1494 631 M
+10 -6 V
+10 -6 V
+10 -5 V
+10 -5 V
+9 -5 V
+10 -6 V
+10 -4 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+9 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+9 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+9 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+9 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+9 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+stroke
+2527 405 M
+9 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+9 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+9 -1 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+9 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+9 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+9 -1 V
+10 0 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+9 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+1.000 UL
+LT1
+LTb
+LT1
+3087 1863 M
+263 0 V
+481 331 M
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+stroke
+1494 331 M
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 1291 V
+10 -42 V
+9 -40 V
+10 -39 V
+10 -37 V
+10 -36 V
+10 -35 V
+10 -33 V
+10 -31 V
+10 -31 V
+10 -29 V
+10 -29 V
+10 -27 V
+10 -26 V
+10 -25 V
+10 -25 V
+9 -23 V
+10 -23 V
+10 -22 V
+10 -21 V
+10 -20 V
+10 -20 V
+10 -18 V
+10 -19 V
+10 -17 V
+10 -17 V
+10 -17 V
+10 -16 V
+10 -15 V
+10 -15 V
+9 -14 V
+10 -14 V
+10 -13 V
+10 -13 V
+10 -13 V
+10 -12 V
+10 -12 V
+10 -11 V
+10 -11 V
+10 -11 V
+10 -10 V
+10 -10 V
+10 -10 V
+10 -10 V
+9 -9 V
+10 -9 V
+10 -8 V
+10 -9 V
+10 -8 V
+10 -8 V
+10 -7 V
+10 -8 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -6 V
+10 -7 V
+10 -6 V
+9 -6 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+9 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+stroke
+2527 480 M
+9 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+9 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+9 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+9 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+9 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+9 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+1.000 UP
+stroke
+grestore
+end
+showpage
+}}%
+\put(3037,1863){\rjust{$a=3, b=2 $}}%
+\put(3037,1963){\rjust{$a=1, b=1$}}%
+\put(1965,2226){\cjust{Pareto Distribution}}%
+\put(1965,50){\cjust{$x$}}%
+\put(100,1203){%
+\special{ps: gsave currentpoint currentpoint translate
+270 rotate neg exch neg exch translate}%
+\cstack{$p(x)$}%
+\special{ps: currentpoint grestore moveto}%
+}%
+\put(3450,200){\cjust{ 5}}%
+\put(2856,200){\cjust{ 4}}%
+\put(2262,200){\cjust{ 3}}%
+\put(1669,200){\cjust{ 2}}%
+\put(1075,200){\cjust{ 1}}%
+\put(481,200){\cjust{ 0}}%
+\put(400,2076){\rjust{ 2}}%
+\put(400,1640){\rjust{ 1.5}}%
+\put(400,1204){\rjust{ 1}}%
+\put(400,767){\rjust{ 0.5}}%
+\put(400,331){\rjust{ 0}}%
+\endGNUPLOTpicture
+\endgroup
+\endinput
diff --git a/gsl-1.9/doc/rand-pascal.tex b/gsl-1.9/doc/rand-pascal.tex
new file mode 100644
index 0000000..bbef1cd
--- /dev/null
+++ b/gsl-1.9/doc/rand-pascal.tex
@@ -0,0 +1,772 @@
+% GNUPLOT: plain TeX with Postscript
+\begingroup
+ \catcode`\@=11\relax
+ \def\GNUPLOTspecial{%
+ \def\do##1{\catcode`##1=12\relax}\dospecials
+ \catcode`\{=1\catcode`\}=2\catcode\%=14\relax\special}%
+%
+\expandafter\ifx\csname GNUPLOTpicture\endcsname\relax
+ \csname newdimen\endcsname\GNUPLOTunit
+ \gdef\GNUPLOTpicture(#1,#2){\vbox to#2\GNUPLOTunit\bgroup
+ \def\put(##1,##2)##3{\unskip\raise##2\GNUPLOTunit
+ \hbox to0pt{\kern##1\GNUPLOTunit ##3\hss}\ignorespaces}%
+ \def\ljust##1{\vbox to0pt{\vss\hbox to0pt{##1\hss}\vss}}%
+ \def\cjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1\hss}\vss}}%
+ \def\rjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1}\vss}}%
+ \def\stack##1{\let\\=\cr\tabskip=0pt\halign{\hfil ####\hfil\cr ##1\crcr}}%
+ \def\lstack##1{\hbox to0pt{\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\cstack##1{\hbox to0pt{\hss\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\rstack##1{\hbox to0pt{\vbox to0pt{\stack{##1}\vss}\hss}}%
+ \vss\hbox to#1\GNUPLOTunit\bgroup\ignorespaces}%
+ \gdef\endGNUPLOTpicture{\hss\egroup\egroup}%
+\fi
+\GNUPLOTunit=0.1bp
+\GNUPLOTpicture(3600,2376)
+{\GNUPLOTspecial{"
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: rand-pascal.tex
+%%Creator: gnuplot 4.0 patchlevel 0
+%%CreationDate: Wed Aug 31 12:38:29 2005
+%%DocumentFonts:
+%%BoundingBox: 0 0 360 237
+%%Orientation: Landscape
+%%EndComments
+/gnudict 256 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+/vshift -33 def
+/dl {10.0 mul} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+/Rounded false def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/N {newpath moveto} bind def
+/C {setrgbcolor} bind def
+/f {rlineto fill} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke userlinewidth 2 mul setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/AL { stroke userlinewidth 2 div setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/UL { dup gnulinewidth mul /userlinewidth exch def
+ dup 1 lt {pop 1} if 10 mul /udl exch def } def
+/PL { stroke userlinewidth setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/LTw { PL [] 1 setgray } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 1 0 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
+/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/Pnt { stroke [] 0 setdash
+ gsave 1 setlinecap M 0 0 V stroke grestore } def
+/Dia { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt } def
+/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt } def
+/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt } def
+/Star { 2 copy Pls Crs } def
+/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill } def
+/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill } def
+/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt } def
+/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill } def
+/Pent { stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt } def
+/PentF { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore } def
+/Circle { stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt } def
+/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
+/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def
+/C1 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C2 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C3 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C4 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C5 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc } bind def
+/C6 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C7 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C8 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C9 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C11 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C12 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C13 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C14 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc } bind def
+/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath } bind def
+/Square { dup Rec } bind def
+/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
+/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
+/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
+/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
+/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill
+ Bsquare } bind def
+/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
+/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare } bind def
+/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare } bind def
+/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
+/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare } bind def
+/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
+/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
+/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
+/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
+/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
+/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
+/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
+/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
+/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
+/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
+/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
+/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
+/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
+/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
+/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
+/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
+/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
+/DiaE { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke } def
+/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke } def
+/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke } def
+/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke } def
+/PentE { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore } def
+/CircE { stroke [] 0 setdash
+ hpt 0 360 arc stroke } def
+/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def
+/DiaW { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke } def
+/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke } def
+/TriUW { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke } def
+/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke } def
+/PentW { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore } def
+/CircW { stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke } def
+/BoxFill { gsave Rec 1 setgray fill grestore } def
+/BoxColFill {
+ gsave Rec
+ /Fillden exch def
+ currentrgbcolor
+ /ColB exch def /ColG exch def /ColR exch def
+ /ColR ColR Fillden mul Fillden sub 1 add def
+ /ColG ColG Fillden mul Fillden sub 1 add def
+ /ColB ColB Fillden mul Fillden sub 1 add def
+ ColR ColG ColB setrgbcolor
+ fill grestore } def
+%
+% PostScript Level 1 Pattern Fill routine
+% Usage: x y w h s a XX PatternFill
+% x,y = lower left corner of box to be filled
+% w,h = width and height of box
+% a = angle in degrees between lines and x-axis
+% XX = 0/1 for no/yes cross-hatch
+%
+/PatternFill { gsave /PFa [ 9 2 roll ] def
+ PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
+ PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
+ gsave 1 setgray fill grestore clip
+ currentlinewidth 0.5 mul setlinewidth
+ /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
+ 0 0 M PFa 5 get rotate PFs -2 div dup translate
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 M 0 PFs V } for
+ 0 PFa 6 get ne {
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 2 1 roll M PFs 0 V } for
+ } if
+ stroke grestore } def
+%
+/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
+dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
+currentdict end definefont pop
+end
+%%EndProlog
+gnudict begin
+gsave
+0 0 translate
+0.100 0.100 scale
+0 setgray
+newpath
+0.500 UL
+LTb
+481 331 M
+-31 0 V
+0.500 UL
+LTb
+481 913 M
+-31 0 V
+0.500 UL
+LTb
+481 1494 M
+-31 0 V
+0.500 UL
+LTb
+481 2076 M
+-31 0 V
+0.500 UL
+LTb
+481 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+751 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+1021 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+1291 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+1561 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+1831 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+2100 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+2370 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+2640 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+2910 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+3180 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+3450 331 M
+0 -63 V
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+LTb
+LTb
+LTb
+1.000 UP
+1.000 UL
+LT0
+LTb
+LT0
+3087 1963 M
+263 0 V
+481 1058 M
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0 364 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+0 -182 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+stroke
+1474 1240 M
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+0 -227 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+0 -205 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+0 -159 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0 -113 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+stroke
+2467 536 M
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0 -77 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0 -50 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0 -31 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0 -19 V
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+1.000 UP
+stroke
+grestore
+end
+showpage
+}}%
+\put(3037,1963){\rjust{$p=0.5,n=3$}}%
+\put(1965,2226){\cjust{Pascal Distribution}}%
+\put(1965,50){\cjust{$k$}}%
+\put(100,1203){%
+\special{ps: gsave currentpoint currentpoint translate
+270 rotate neg exch neg exch translate}%
+\cstack{$p(k)$}%
+\special{ps: currentpoint grestore moveto}%
+}%
+\put(3315,200){\cjust{ 10}}%
+\put(3045,200){\cjust{ 9}}%
+\put(2775,200){\cjust{ 8}}%
+\put(2505,200){\cjust{ 7}}%
+\put(2235,200){\cjust{ 6}}%
+\put(1966,200){\cjust{ 5}}%
+\put(1696,200){\cjust{ 4}}%
+\put(1426,200){\cjust{ 3}}%
+\put(1156,200){\cjust{ 2}}%
+\put(886,200){\cjust{ 1}}%
+\put(616,200){\cjust{ 0}}%
+\put(400,2076){\rjust{ 0.3}}%
+\put(400,1494){\rjust{ 0.2}}%
+\put(400,913){\rjust{ 0.1}}%
+\put(400,331){\rjust{ 0}}%
+\endGNUPLOTpicture
+\endgroup
+\endinput
diff --git a/gsl-1.9/doc/rand-poisson.tex b/gsl-1.9/doc/rand-poisson.tex
new file mode 100644
index 0000000..32546cd
--- /dev/null
+++ b/gsl-1.9/doc/rand-poisson.tex
@@ -0,0 +1,774 @@
+% GNUPLOT: plain TeX with Postscript
+\begingroup
+ \catcode`\@=11\relax
+ \def\GNUPLOTspecial{%
+ \def\do##1{\catcode`##1=12\relax}\dospecials
+ \catcode`\{=1\catcode`\}=2\catcode\%=14\relax\special}%
+%
+\expandafter\ifx\csname GNUPLOTpicture\endcsname\relax
+ \csname newdimen\endcsname\GNUPLOTunit
+ \gdef\GNUPLOTpicture(#1,#2){\vbox to#2\GNUPLOTunit\bgroup
+ \def\put(##1,##2)##3{\unskip\raise##2\GNUPLOTunit
+ \hbox to0pt{\kern##1\GNUPLOTunit ##3\hss}\ignorespaces}%
+ \def\ljust##1{\vbox to0pt{\vss\hbox to0pt{##1\hss}\vss}}%
+ \def\cjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1\hss}\vss}}%
+ \def\rjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1}\vss}}%
+ \def\stack##1{\let\\=\cr\tabskip=0pt\halign{\hfil ####\hfil\cr ##1\crcr}}%
+ \def\lstack##1{\hbox to0pt{\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\cstack##1{\hbox to0pt{\hss\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\rstack##1{\hbox to0pt{\vbox to0pt{\stack{##1}\vss}\hss}}%
+ \vss\hbox to#1\GNUPLOTunit\bgroup\ignorespaces}%
+ \gdef\endGNUPLOTpicture{\hss\egroup\egroup}%
+\fi
+\GNUPLOTunit=0.1bp
+\GNUPLOTpicture(3600,2376)
+{\GNUPLOTspecial{"
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: rand-poisson.tex
+%%Creator: gnuplot 4.0 patchlevel 0
+%%CreationDate: Wed Aug 31 12:38:29 2005
+%%DocumentFonts:
+%%BoundingBox: 0 0 360 237
+%%Orientation: Landscape
+%%EndComments
+/gnudict 256 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+/vshift -33 def
+/dl {10.0 mul} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+/Rounded false def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/N {newpath moveto} bind def
+/C {setrgbcolor} bind def
+/f {rlineto fill} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke userlinewidth 2 mul setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/AL { stroke userlinewidth 2 div setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/UL { dup gnulinewidth mul /userlinewidth exch def
+ dup 1 lt {pop 1} if 10 mul /udl exch def } def
+/PL { stroke userlinewidth setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/LTw { PL [] 1 setgray } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 1 0 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
+/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/Pnt { stroke [] 0 setdash
+ gsave 1 setlinecap M 0 0 V stroke grestore } def
+/Dia { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt } def
+/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt } def
+/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt } def
+/Star { 2 copy Pls Crs } def
+/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill } def
+/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill } def
+/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt } def
+/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill } def
+/Pent { stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt } def
+/PentF { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore } def
+/Circle { stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt } def
+/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
+/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def
+/C1 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C2 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C3 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C4 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C5 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc } bind def
+/C6 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C7 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C8 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C9 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C11 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C12 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C13 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C14 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc } bind def
+/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath } bind def
+/Square { dup Rec } bind def
+/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
+/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
+/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
+/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
+/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill
+ Bsquare } bind def
+/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
+/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare } bind def
+/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare } bind def
+/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
+/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare } bind def
+/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
+/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
+/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
+/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
+/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
+/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
+/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
+/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
+/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
+/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
+/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
+/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
+/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
+/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
+/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
+/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
+/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
+/DiaE { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke } def
+/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke } def
+/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke } def
+/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke } def
+/PentE { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore } def
+/CircE { stroke [] 0 setdash
+ hpt 0 360 arc stroke } def
+/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def
+/DiaW { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke } def
+/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke } def
+/TriUW { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke } def
+/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke } def
+/PentW { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore } def
+/CircW { stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke } def
+/BoxFill { gsave Rec 1 setgray fill grestore } def
+/BoxColFill {
+ gsave Rec
+ /Fillden exch def
+ currentrgbcolor
+ /ColB exch def /ColG exch def /ColR exch def
+ /ColR ColR Fillden mul Fillden sub 1 add def
+ /ColG ColG Fillden mul Fillden sub 1 add def
+ /ColB ColB Fillden mul Fillden sub 1 add def
+ ColR ColG ColB setrgbcolor
+ fill grestore } def
+%
+% PostScript Level 1 Pattern Fill routine
+% Usage: x y w h s a XX PatternFill
+% x,y = lower left corner of box to be filled
+% w,h = width and height of box
+% a = angle in degrees between lines and x-axis
+% XX = 0/1 for no/yes cross-hatch
+%
+/PatternFill { gsave /PFa [ 9 2 roll ] def
+ PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
+ PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
+ gsave 1 setgray fill grestore clip
+ currentlinewidth 0.5 mul setlinewidth
+ /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
+ 0 0 M PFa 5 get rotate PFs -2 div dup translate
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 M 0 PFs V } for
+ 0 PFa 6 get ne {
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 2 1 roll M PFs 0 V } for
+ } if
+ stroke grestore } def
+%
+/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
+dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
+currentdict end definefont pop
+end
+%%EndProlog
+gnudict begin
+gsave
+0 0 translate
+0.100 0.100 scale
+0 setgray
+newpath
+0.500 UL
+LTb
+481 331 M
+-31 0 V
+0.500 UL
+LTb
+481 913 M
+-31 0 V
+0.500 UL
+LTb
+481 1494 M
+-31 0 V
+0.500 UL
+LTb
+481 2076 M
+-31 0 V
+0.500 UL
+LTb
+481 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+751 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+1021 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+1291 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+1561 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+1831 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+2100 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+2370 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+2640 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+2910 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+3180 331 M
+0 -63 V
+135 63 R
+0 -31 V
+0.500 UL
+LTb
+3450 331 M
+0 -63 V
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+LTb
+LTb
+LTb
+1.000 UP
+1.000 UL
+LT0
+LTb
+LT0
+3087 1963 M
+263 0 V
+481 808 M
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0 717 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0 298 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+0 -249 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+stroke
+1464 1574 M
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+0 -466 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+0 -388 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+0 -227 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0 -104 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+stroke
+2457 389 M
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0 -40 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0 -13 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0 -4 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+0 -1 V
+stroke
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+1.000 UP
+stroke
+grestore
+end
+showpage
+}}%
+\put(3037,1963){\rjust{$\mu=2.5$}}%
+\put(1965,2226){\cjust{Poisson Distribution}}%
+\put(1965,50){\cjust{$k$}}%
+\put(100,1203){%
+\special{ps: gsave currentpoint currentpoint translate
+270 rotate neg exch neg exch translate}%
+\cstack{$p(k)$}%
+\special{ps: currentpoint grestore moveto}%
+}%
+\put(3315,200){\cjust{10}}%
+\put(3045,200){\cjust{ 9}}%
+\put(2775,200){\cjust{ 8}}%
+\put(2505,200){\cjust{ 7}}%
+\put(2235,200){\cjust{ 6 }}%
+\put(1966,200){\cjust{5}}%
+\put(1696,200){\cjust{ 4}}%
+\put(1426,200){\cjust{ 3}}%
+\put(1156,200){\cjust{ 2}}%
+\put(886,200){\cjust{ 1}}%
+\put(616,200){\cjust{ 0}}%
+\put(400,2076){\rjust{ 0.3}}%
+\put(400,1494){\rjust{ 0.2}}%
+\put(400,913){\rjust{ 0.1}}%
+\put(400,331){\rjust{ 0}}%
+\endGNUPLOTpicture
+\endgroup
+\endinput
diff --git a/gsl-1.9/doc/rand-rayleigh-tail.tex b/gsl-1.9/doc/rand-rayleigh-tail.tex
new file mode 100644
index 0000000..b4593a3
--- /dev/null
+++ b/gsl-1.9/doc/rand-rayleigh-tail.tex
@@ -0,0 +1,1019 @@
+% GNUPLOT: plain TeX with Postscript
+\begingroup
+ \catcode`\@=11\relax
+ \def\GNUPLOTspecial{%
+ \def\do##1{\catcode`##1=12\relax}\dospecials
+ \catcode`\{=1\catcode`\}=2\catcode\%=14\relax\special}%
+%
+\expandafter\ifx\csname GNUPLOTpicture\endcsname\relax
+ \csname newdimen\endcsname\GNUPLOTunit
+ \gdef\GNUPLOTpicture(#1,#2){\vbox to#2\GNUPLOTunit\bgroup
+ \def\put(##1,##2)##3{\unskip\raise##2\GNUPLOTunit
+ \hbox to0pt{\kern##1\GNUPLOTunit ##3\hss}\ignorespaces}%
+ \def\ljust##1{\vbox to0pt{\vss\hbox to0pt{##1\hss}\vss}}%
+ \def\cjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1\hss}\vss}}%
+ \def\rjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1}\vss}}%
+ \def\stack##1{\let\\=\cr\tabskip=0pt\halign{\hfil ####\hfil\cr ##1\crcr}}%
+ \def\lstack##1{\hbox to0pt{\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\cstack##1{\hbox to0pt{\hss\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\rstack##1{\hbox to0pt{\vbox to0pt{\stack{##1}\vss}\hss}}%
+ \vss\hbox to#1\GNUPLOTunit\bgroup\ignorespaces}%
+ \gdef\endGNUPLOTpicture{\hss\egroup\egroup}%
+\fi
+\GNUPLOTunit=0.1bp
+\GNUPLOTpicture(3600,2376)
+{\GNUPLOTspecial{"
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: rand-rayleigh-tail.tex
+%%Creator: gnuplot 4.0 patchlevel 0
+%%CreationDate: Wed Aug 31 12:38:29 2005
+%%DocumentFonts:
+%%BoundingBox: 0 0 360 237
+%%Orientation: Landscape
+%%EndComments
+/gnudict 256 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+/vshift -33 def
+/dl {10.0 mul} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+/Rounded false def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/N {newpath moveto} bind def
+/C {setrgbcolor} bind def
+/f {rlineto fill} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke userlinewidth 2 mul setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/AL { stroke userlinewidth 2 div setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/UL { dup gnulinewidth mul /userlinewidth exch def
+ dup 1 lt {pop 1} if 10 mul /udl exch def } def
+/PL { stroke userlinewidth setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/LTw { PL [] 1 setgray } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 1 0 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
+/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/Pnt { stroke [] 0 setdash
+ gsave 1 setlinecap M 0 0 V stroke grestore } def
+/Dia { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt } def
+/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt } def
+/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt } def
+/Star { 2 copy Pls Crs } def
+/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill } def
+/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill } def
+/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt } def
+/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill } def
+/Pent { stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt } def
+/PentF { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore } def
+/Circle { stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt } def
+/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
+/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def
+/C1 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C2 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C3 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C4 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C5 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc } bind def
+/C6 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C7 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C8 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C9 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C11 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C12 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C13 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C14 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc } bind def
+/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath } bind def
+/Square { dup Rec } bind def
+/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
+/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
+/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
+/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
+/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill
+ Bsquare } bind def
+/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
+/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare } bind def
+/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare } bind def
+/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
+/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare } bind def
+/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
+/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
+/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
+/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
+/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
+/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
+/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
+/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
+/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
+/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
+/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
+/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
+/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
+/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
+/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
+/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
+/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
+/DiaE { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke } def
+/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke } def
+/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke } def
+/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke } def
+/PentE { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore } def
+/CircE { stroke [] 0 setdash
+ hpt 0 360 arc stroke } def
+/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def
+/DiaW { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke } def
+/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke } def
+/TriUW { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke } def
+/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke } def
+/PentW { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore } def
+/CircW { stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke } def
+/BoxFill { gsave Rec 1 setgray fill grestore } def
+/BoxColFill {
+ gsave Rec
+ /Fillden exch def
+ currentrgbcolor
+ /ColB exch def /ColG exch def /ColR exch def
+ /ColR ColR Fillden mul Fillden sub 1 add def
+ /ColG ColG Fillden mul Fillden sub 1 add def
+ /ColB ColB Fillden mul Fillden sub 1 add def
+ ColR ColG ColB setrgbcolor
+ fill grestore } def
+%
+% PostScript Level 1 Pattern Fill routine
+% Usage: x y w h s a XX PatternFill
+% x,y = lower left corner of box to be filled
+% w,h = width and height of box
+% a = angle in degrees between lines and x-axis
+% XX = 0/1 for no/yes cross-hatch
+%
+/PatternFill { gsave /PFa [ 9 2 roll ] def
+ PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
+ PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
+ gsave 1 setgray fill grestore clip
+ currentlinewidth 0.5 mul setlinewidth
+ /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
+ 0 0 M PFa 5 get rotate PFs -2 div dup translate
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 M 0 PFs V } for
+ 0 PFa 6 get ne {
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 2 1 roll M PFs 0 V } for
+ } if
+ stroke grestore } def
+%
+/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
+dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
+currentdict end definefont pop
+end
+%%EndProlog
+gnudict begin
+gsave
+0 0 translate
+0.100 0.100 scale
+0 setgray
+newpath
+0.500 UL
+LTb
+481 331 M
+-31 0 V
+0.500 UL
+LTb
+481 1131 M
+-31 0 V
+0.500 UL
+LTb
+481 1932 M
+-31 0 V
+0.500 UL
+LTb
+481 331 M
+0 -31 V
+0.500 UL
+LTb
+1075 331 M
+0 -31 V
+0.500 UL
+LTb
+1669 331 M
+0 -31 V
+0.500 UL
+LTb
+2262 331 M
+0 -31 V
+0.500 UL
+LTb
+2856 331 M
+0 -31 V
+0.500 UL
+LTb
+3450 331 M
+0 -31 V
+0.500 UL
+LTb
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+LTb
+LTb
+LTb
+1.000 UP
+1.000 UL
+LT0
+LTb
+LT0
+3087 1963 M
+263 0 V
+481 331 M
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 1601 V
+10 -1 V
+10 -1 V
+10 -3 V
+10 -3 V
+9 -4 V
+10 -5 V
+10 -5 V
+10 -7 V
+10 -7 V
+10 -8 V
+10 -8 V
+10 -10 V
+10 -10 V
+10 -10 V
+10 -11 V
+10 -12 V
+10 -13 V
+10 -12 V
+9 -14 V
+10 -14 V
+10 -14 V
+10 -15 V
+10 -16 V
+10 -16 V
+10 -16 V
+10 -16 V
+10 -17 V
+10 -18 V
+10 -17 V
+10 -18 V
+10 -18 V
+10 -19 V
+9 -18 V
+10 -19 V
+10 -19 V
+10 -19 V
+10 -19 V
+10 -20 V
+10 -19 V
+10 -20 V
+10 -19 V
+10 -20 V
+stroke
+1494 1382 M
+10 -20 V
+10 -19 V
+10 -20 V
+10 -20 V
+9 -19 V
+10 -20 V
+10 -19 V
+10 -20 V
+10 -19 V
+10 -19 V
+10 -19 V
+10 -19 V
+10 -19 V
+10 -19 V
+10 -18 V
+10 -19 V
+10 -18 V
+10 -18 V
+10 -17 V
+9 -18 V
+10 -17 V
+10 -17 V
+10 -17 V
+10 -17 V
+10 -16 V
+10 -16 V
+10 -16 V
+10 -16 V
+10 -15 V
+10 -15 V
+10 -15 V
+10 -15 V
+10 -14 V
+9 -14 V
+10 -14 V
+10 -13 V
+10 -13 V
+10 -13 V
+10 -13 V
+10 -12 V
+10 -12 V
+10 -12 V
+10 -12 V
+10 -11 V
+10 -11 V
+10 -11 V
+10 -10 V
+9 -10 V
+10 -10 V
+10 -10 V
+10 -9 V
+10 -9 V
+10 -9 V
+10 -9 V
+10 -8 V
+10 -8 V
+10 -8 V
+10 -8 V
+10 -7 V
+10 -8 V
+10 -7 V
+9 -7 V
+10 -6 V
+10 -7 V
+10 -6 V
+10 -6 V
+10 -5 V
+10 -6 V
+10 -5 V
+10 -6 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+9 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -2 V
+9 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+stroke
+2527 355 M
+9 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+9 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+9 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+1.000 UL
+LT1
+LTb
+LT1
+3087 1863 M
+263 0 V
+481 331 M
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 201 V
+10 6 V
+10 6 V
+10 6 V
+10 6 V
+10 7 V
+9 6 V
+10 6 V
+10 5 V
+10 6 V
+10 6 V
+10 6 V
+10 6 V
+10 5 V
+10 6 V
+10 6 V
+10 5 V
+10 5 V
+10 6 V
+10 5 V
+9 5 V
+10 6 V
+10 5 V
+10 5 V
+10 5 V
+10 5 V
+10 5 V
+10 4 V
+10 5 V
+10 5 V
+10 4 V
+10 5 V
+10 4 V
+10 5 V
+10 4 V
+9 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 3 V
+10 4 V
+10 3 V
+10 4 V
+10 3 V
+10 3 V
+9 4 V
+10 3 V
+10 3 V
+10 3 V
+10 2 V
+10 3 V
+10 3 V
+10 3 V
+10 2 V
+10 3 V
+10 2 V
+10 2 V
+10 2 V
+10 3 V
+9 2 V
+10 2 V
+10 2 V
+10 1 V
+10 2 V
+10 2 V
+10 1 V
+10 2 V
+10 1 V
+10 2 V
+stroke
+1494 821 M
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+9 1 V
+10 1 V
+10 1 V
+10 1 V
+10 0 V
+10 1 V
+10 0 V
+10 1 V
+10 0 V
+10 0 V
+10 1 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+9 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+9 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+9 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+9 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+stroke
+2527 654 M
+9 -3 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+9 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+9 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+9 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+9 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+9 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+9 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+1.000 UP
+stroke
+grestore
+end
+showpage
+}}%
+\put(3037,1863){\rjust{$a=0.5,\sigma=2$}}%
+\put(3037,1963){\rjust{$a=1,\sigma=1$}}%
+\put(1965,2226){\cjust{Rayleigh Tail Distribution}}%
+\put(1965,50){\cjust{$x$}}%
+\put(100,1203){%
+\special{ps: gsave currentpoint currentpoint translate
+270 rotate neg exch neg exch translate}%
+\cstack{$p(x)$}%
+\special{ps: currentpoint grestore moveto}%
+}%
+\put(3450,200){\cjust{ 5}}%
+\put(2856,200){\cjust{ 4}}%
+\put(2262,200){\cjust{ 3}}%
+\put(1669,200){\cjust{ 2}}%
+\put(1075,200){\cjust{ 1}}%
+\put(481,200){\cjust{ 0}}%
+\put(400,1932){\rjust{ 1}}%
+\put(400,1131){\rjust{ 0.5}}%
+\put(400,331){\rjust{ 0}}%
+\endGNUPLOTpicture
+\endgroup
+\endinput
diff --git a/gsl-1.9/doc/rand-rayleigh.tex b/gsl-1.9/doc/rand-rayleigh.tex
new file mode 100644
index 0000000..e4d02c3
--- /dev/null
+++ b/gsl-1.9/doc/rand-rayleigh.tex
@@ -0,0 +1,1044 @@
+% GNUPLOT: plain TeX with Postscript
+\begingroup
+ \catcode`\@=11\relax
+ \def\GNUPLOTspecial{%
+ \def\do##1{\catcode`##1=12\relax}\dospecials
+ \catcode`\{=1\catcode`\}=2\catcode\%=14\relax\special}%
+%
+\expandafter\ifx\csname GNUPLOTpicture\endcsname\relax
+ \csname newdimen\endcsname\GNUPLOTunit
+ \gdef\GNUPLOTpicture(#1,#2){\vbox to#2\GNUPLOTunit\bgroup
+ \def\put(##1,##2)##3{\unskip\raise##2\GNUPLOTunit
+ \hbox to0pt{\kern##1\GNUPLOTunit ##3\hss}\ignorespaces}%
+ \def\ljust##1{\vbox to0pt{\vss\hbox to0pt{##1\hss}\vss}}%
+ \def\cjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1\hss}\vss}}%
+ \def\rjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1}\vss}}%
+ \def\stack##1{\let\\=\cr\tabskip=0pt\halign{\hfil ####\hfil\cr ##1\crcr}}%
+ \def\lstack##1{\hbox to0pt{\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\cstack##1{\hbox to0pt{\hss\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\rstack##1{\hbox to0pt{\vbox to0pt{\stack{##1}\vss}\hss}}%
+ \vss\hbox to#1\GNUPLOTunit\bgroup\ignorespaces}%
+ \gdef\endGNUPLOTpicture{\hss\egroup\egroup}%
+\fi
+\GNUPLOTunit=0.1bp
+\GNUPLOTpicture(3600,2376)
+{\GNUPLOTspecial{"
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: rand-rayleigh.tex
+%%Creator: gnuplot 4.0 patchlevel 0
+%%CreationDate: Wed Aug 31 12:38:29 2005
+%%DocumentFonts:
+%%BoundingBox: 0 0 360 237
+%%Orientation: Landscape
+%%EndComments
+/gnudict 256 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+/vshift -33 def
+/dl {10.0 mul} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+/Rounded false def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/N {newpath moveto} bind def
+/C {setrgbcolor} bind def
+/f {rlineto fill} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke userlinewidth 2 mul setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/AL { stroke userlinewidth 2 div setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/UL { dup gnulinewidth mul /userlinewidth exch def
+ dup 1 lt {pop 1} if 10 mul /udl exch def } def
+/PL { stroke userlinewidth setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/LTw { PL [] 1 setgray } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 1 0 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
+/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/Pnt { stroke [] 0 setdash
+ gsave 1 setlinecap M 0 0 V stroke grestore } def
+/Dia { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt } def
+/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt } def
+/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt } def
+/Star { 2 copy Pls Crs } def
+/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill } def
+/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill } def
+/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt } def
+/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill } def
+/Pent { stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt } def
+/PentF { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore } def
+/Circle { stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt } def
+/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
+/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def
+/C1 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C2 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C3 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C4 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C5 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc } bind def
+/C6 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C7 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C8 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C9 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C11 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C12 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C13 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C14 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc } bind def
+/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath } bind def
+/Square { dup Rec } bind def
+/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
+/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
+/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
+/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
+/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill
+ Bsquare } bind def
+/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
+/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare } bind def
+/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare } bind def
+/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
+/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare } bind def
+/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
+/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
+/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
+/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
+/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
+/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
+/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
+/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
+/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
+/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
+/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
+/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
+/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
+/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
+/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
+/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
+/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
+/DiaE { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke } def
+/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke } def
+/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke } def
+/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke } def
+/PentE { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore } def
+/CircE { stroke [] 0 setdash
+ hpt 0 360 arc stroke } def
+/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def
+/DiaW { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke } def
+/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke } def
+/TriUW { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke } def
+/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke } def
+/PentW { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore } def
+/CircW { stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke } def
+/BoxFill { gsave Rec 1 setgray fill grestore } def
+/BoxColFill {
+ gsave Rec
+ /Fillden exch def
+ currentrgbcolor
+ /ColB exch def /ColG exch def /ColR exch def
+ /ColR ColR Fillden mul Fillden sub 1 add def
+ /ColG ColG Fillden mul Fillden sub 1 add def
+ /ColB ColB Fillden mul Fillden sub 1 add def
+ ColR ColG ColB setrgbcolor
+ fill grestore } def
+%
+% PostScript Level 1 Pattern Fill routine
+% Usage: x y w h s a XX PatternFill
+% x,y = lower left corner of box to be filled
+% w,h = width and height of box
+% a = angle in degrees between lines and x-axis
+% XX = 0/1 for no/yes cross-hatch
+%
+/PatternFill { gsave /PFa [ 9 2 roll ] def
+ PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
+ PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
+ gsave 1 setgray fill grestore clip
+ currentlinewidth 0.5 mul setlinewidth
+ /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
+ 0 0 M PFa 5 get rotate PFs -2 div dup translate
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 M 0 PFs V } for
+ 0 PFa 6 get ne {
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 2 1 roll M PFs 0 V } for
+ } if
+ stroke grestore } def
+%
+/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
+dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
+currentdict end definefont pop
+end
+%%EndProlog
+gnudict begin
+gsave
+0 0 translate
+0.100 0.100 scale
+0 setgray
+newpath
+0.500 UL
+LTb
+481 331 M
+-31 0 V
+0.500 UL
+LTb
+481 580 M
+-31 0 V
+0.500 UL
+LTb
+481 830 M
+-31 0 V
+0.500 UL
+LTb
+481 1079 M
+-31 0 V
+0.500 UL
+LTb
+481 1328 M
+-31 0 V
+0.500 UL
+LTb
+481 1577 M
+-31 0 V
+0.500 UL
+LTb
+481 1827 M
+-31 0 V
+0.500 UL
+LTb
+481 2076 M
+-31 0 V
+0.500 UL
+LTb
+481 331 M
+0 -31 V
+0.500 UL
+LTb
+1075 331 M
+0 -31 V
+0.500 UL
+LTb
+1669 331 M
+0 -31 V
+0.500 UL
+LTb
+2262 331 M
+0 -31 V
+0.500 UL
+LTb
+2856 331 M
+0 -31 V
+0.500 UL
+LTb
+3450 331 M
+0 -31 V
+0.500 UL
+LTb
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+LTb
+LTb
+LTb
+1.000 UP
+1.000 UL
+LT0
+LTb
+LT0
+3087 1963 M
+263 0 V
+481 331 M
+10 42 V
+10 41 V
+10 42 V
+10 41 V
+10 42 V
+10 41 V
+10 41 V
+9 41 V
+10 40 V
+10 40 V
+10 40 V
+10 39 V
+10 39 V
+10 39 V
+10 38 V
+10 38 V
+10 37 V
+10 36 V
+10 36 V
+10 35 V
+10 35 V
+9 34 V
+10 33 V
+10 33 V
+10 32 V
+10 31 V
+10 30 V
+10 30 V
+10 29 V
+10 28 V
+10 27 V
+10 26 V
+10 25 V
+10 25 V
+10 23 V
+9 23 V
+10 22 V
+10 20 V
+10 20 V
+10 19 V
+10 18 V
+10 17 V
+10 16 V
+10 15 V
+10 14 V
+10 13 V
+10 13 V
+10 11 V
+10 10 V
+9 9 V
+10 9 V
+10 7 V
+10 7 V
+10 5 V
+10 5 V
+10 4 V
+10 3 V
+10 2 V
+10 1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -3 V
+9 -4 V
+10 -5 V
+10 -5 V
+10 -6 V
+10 -7 V
+10 -7 V
+10 -8 V
+10 -9 V
+10 -9 V
+10 -10 V
+10 -11 V
+10 -11 V
+10 -12 V
+10 -12 V
+9 -13 V
+10 -13 V
+10 -14 V
+10 -14 V
+10 -14 V
+10 -15 V
+10 -16 V
+10 -15 V
+10 -16 V
+10 -17 V
+10 -16 V
+10 -17 V
+10 -17 V
+10 -18 V
+9 -17 V
+10 -18 V
+10 -18 V
+10 -18 V
+10 -18 V
+10 -18 V
+10 -19 V
+10 -18 V
+10 -19 V
+10 -18 V
+stroke
+1494 1324 M
+10 -19 V
+10 -18 V
+10 -19 V
+10 -19 V
+9 -18 V
+10 -19 V
+10 -18 V
+10 -18 V
+10 -19 V
+10 -18 V
+10 -18 V
+10 -18 V
+10 -18 V
+10 -17 V
+10 -18 V
+10 -17 V
+10 -17 V
+10 -17 V
+10 -17 V
+9 -16 V
+10 -17 V
+10 -16 V
+10 -16 V
+10 -15 V
+10 -16 V
+10 -15 V
+10 -15 V
+10 -15 V
+10 -14 V
+10 -15 V
+10 -14 V
+10 -13 V
+10 -14 V
+9 -13 V
+10 -13 V
+10 -13 V
+10 -12 V
+10 -12 V
+10 -12 V
+10 -12 V
+10 -11 V
+10 -11 V
+10 -11 V
+10 -11 V
+10 -10 V
+10 -10 V
+10 -10 V
+9 -10 V
+10 -9 V
+10 -9 V
+10 -9 V
+10 -9 V
+10 -8 V
+10 -9 V
+10 -7 V
+10 -8 V
+10 -8 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -6 V
+9 -7 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -4 V
+10 -5 V
+9 -4 V
+10 -3 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -3 V
+9 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+stroke
+2527 354 M
+9 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+9 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+9 -1 V
+10 0 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+1.000 UL
+LT1
+LTb
+LT1
+3087 1863 M
+263 0 V
+481 331 M
+10 10 V
+10 11 V
+10 10 V
+10 11 V
+10 10 V
+10 10 V
+10 11 V
+9 10 V
+10 11 V
+10 10 V
+10 10 V
+10 10 V
+10 11 V
+10 10 V
+10 10 V
+10 10 V
+10 10 V
+10 10 V
+10 11 V
+10 10 V
+10 10 V
+9 9 V
+10 10 V
+10 10 V
+10 10 V
+10 10 V
+10 9 V
+10 10 V
+10 9 V
+10 10 V
+10 9 V
+10 10 V
+10 9 V
+10 9 V
+10 9 V
+9 10 V
+10 9 V
+10 9 V
+10 8 V
+10 9 V
+10 9 V
+10 9 V
+10 8 V
+10 9 V
+10 8 V
+10 8 V
+10 8 V
+10 9 V
+10 8 V
+9 7 V
+10 8 V
+10 8 V
+10 8 V
+10 7 V
+10 8 V
+10 7 V
+10 7 V
+10 7 V
+10 7 V
+10 7 V
+10 7 V
+10 7 V
+10 7 V
+10 6 V
+9 6 V
+10 7 V
+10 6 V
+10 6 V
+10 6 V
+10 6 V
+10 5 V
+10 6 V
+10 5 V
+10 6 V
+10 5 V
+10 5 V
+10 5 V
+10 5 V
+9 5 V
+10 5 V
+10 4 V
+10 5 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 3 V
+10 4 V
+10 3 V
+10 3 V
+9 3 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+10 2 V
+10 2 V
+10 3 V
+10 2 V
+10 2 V
+stroke
+1494 1070 M
+10 2 V
+10 2 V
+10 1 V
+10 2 V
+9 1 V
+10 2 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 0 V
+10 1 V
+10 0 V
+10 1 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+9 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+9 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -4 V
+9 -3 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+9 -4 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+9 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+stroke
+2527 818 M
+9 -5 V
+10 -4 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+9 -4 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+9 -5 V
+10 -4 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+9 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+9 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+9 -4 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+9 -2 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+1.000 UP
+stroke
+grestore
+end
+showpage
+}}%
+\put(3037,1863){\rjust{$\sigma=2$}}%
+\put(3037,1963){\rjust{$\sigma=1$}}%
+\put(1965,2226){\cjust{Rayleigh Distribution}}%
+\put(1965,50){\cjust{$x$}}%
+\put(100,1203){%
+\special{ps: gsave currentpoint currentpoint translate
+270 rotate neg exch neg exch translate}%
+\cstack{$p(x)$}%
+\special{ps: currentpoint grestore moveto}%
+}%
+\put(3450,200){\cjust{ 5}}%
+\put(2856,200){\cjust{ 4}}%
+\put(2262,200){\cjust{ 3}}%
+\put(1669,200){\cjust{ 2}}%
+\put(1075,200){\cjust{ 1}}%
+\put(481,200){\cjust{ 0}}%
+\put(400,2076){\rjust{ 0.7}}%
+\put(400,1827){\rjust{ 0.6}}%
+\put(400,1577){\rjust{ 0.5}}%
+\put(400,1328){\rjust{ 0.4}}%
+\put(400,1079){\rjust{ 0.3}}%
+\put(400,830){\rjust{ 0.2}}%
+\put(400,580){\rjust{ 0.1}}%
+\put(400,331){\rjust{ 0}}%
+\endGNUPLOTpicture
+\endgroup
+\endinput
diff --git a/gsl-1.9/doc/rand-tdist.tex b/gsl-1.9/doc/rand-tdist.tex
new file mode 100644
index 0000000..c0ef6b0
--- /dev/null
+++ b/gsl-1.9/doc/rand-tdist.tex
@@ -0,0 +1,1049 @@
+% GNUPLOT: plain TeX with Postscript
+\begingroup
+ \catcode`\@=11\relax
+ \def\GNUPLOTspecial{%
+ \def\do##1{\catcode`##1=12\relax}\dospecials
+ \catcode`\{=1\catcode`\}=2\catcode\%=14\relax\special}%
+%
+\expandafter\ifx\csname GNUPLOTpicture\endcsname\relax
+ \csname newdimen\endcsname\GNUPLOTunit
+ \gdef\GNUPLOTpicture(#1,#2){\vbox to#2\GNUPLOTunit\bgroup
+ \def\put(##1,##2)##3{\unskip\raise##2\GNUPLOTunit
+ \hbox to0pt{\kern##1\GNUPLOTunit ##3\hss}\ignorespaces}%
+ \def\ljust##1{\vbox to0pt{\vss\hbox to0pt{##1\hss}\vss}}%
+ \def\cjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1\hss}\vss}}%
+ \def\rjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1}\vss}}%
+ \def\stack##1{\let\\=\cr\tabskip=0pt\halign{\hfil ####\hfil\cr ##1\crcr}}%
+ \def\lstack##1{\hbox to0pt{\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\cstack##1{\hbox to0pt{\hss\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\rstack##1{\hbox to0pt{\vbox to0pt{\stack{##1}\vss}\hss}}%
+ \vss\hbox to#1\GNUPLOTunit\bgroup\ignorespaces}%
+ \gdef\endGNUPLOTpicture{\hss\egroup\egroup}%
+\fi
+\GNUPLOTunit=0.1bp
+\GNUPLOTpicture(3600,2376)
+{\GNUPLOTspecial{"
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: rand-tdist.tex
+%%Creator: gnuplot 4.0 patchlevel 0
+%%CreationDate: Wed Aug 31 12:38:29 2005
+%%DocumentFonts:
+%%BoundingBox: 0 0 360 237
+%%Orientation: Landscape
+%%EndComments
+/gnudict 256 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+/vshift -33 def
+/dl {10.0 mul} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+/Rounded false def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/N {newpath moveto} bind def
+/C {setrgbcolor} bind def
+/f {rlineto fill} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke userlinewidth 2 mul setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/AL { stroke userlinewidth 2 div setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/UL { dup gnulinewidth mul /userlinewidth exch def
+ dup 1 lt {pop 1} if 10 mul /udl exch def } def
+/PL { stroke userlinewidth setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/LTw { PL [] 1 setgray } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 1 0 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
+/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/Pnt { stroke [] 0 setdash
+ gsave 1 setlinecap M 0 0 V stroke grestore } def
+/Dia { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt } def
+/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt } def
+/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt } def
+/Star { 2 copy Pls Crs } def
+/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill } def
+/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill } def
+/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt } def
+/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill } def
+/Pent { stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt } def
+/PentF { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore } def
+/Circle { stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt } def
+/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
+/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def
+/C1 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C2 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C3 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C4 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C5 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc } bind def
+/C6 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C7 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C8 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C9 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C11 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C12 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C13 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C14 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc } bind def
+/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath } bind def
+/Square { dup Rec } bind def
+/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
+/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
+/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
+/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
+/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill
+ Bsquare } bind def
+/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
+/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare } bind def
+/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare } bind def
+/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
+/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare } bind def
+/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
+/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
+/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
+/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
+/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
+/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
+/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
+/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
+/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
+/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
+/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
+/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
+/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
+/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
+/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
+/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
+/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
+/DiaE { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke } def
+/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke } def
+/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke } def
+/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke } def
+/PentE { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore } def
+/CircE { stroke [] 0 setdash
+ hpt 0 360 arc stroke } def
+/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def
+/DiaW { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke } def
+/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke } def
+/TriUW { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke } def
+/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke } def
+/PentW { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore } def
+/CircW { stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke } def
+/BoxFill { gsave Rec 1 setgray fill grestore } def
+/BoxColFill {
+ gsave Rec
+ /Fillden exch def
+ currentrgbcolor
+ /ColB exch def /ColG exch def /ColR exch def
+ /ColR ColR Fillden mul Fillden sub 1 add def
+ /ColG ColG Fillden mul Fillden sub 1 add def
+ /ColB ColB Fillden mul Fillden sub 1 add def
+ ColR ColG ColB setrgbcolor
+ fill grestore } def
+%
+% PostScript Level 1 Pattern Fill routine
+% Usage: x y w h s a XX PatternFill
+% x,y = lower left corner of box to be filled
+% w,h = width and height of box
+% a = angle in degrees between lines and x-axis
+% XX = 0/1 for no/yes cross-hatch
+%
+/PatternFill { gsave /PFa [ 9 2 roll ] def
+ PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
+ PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
+ gsave 1 setgray fill grestore clip
+ currentlinewidth 0.5 mul setlinewidth
+ /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
+ 0 0 M PFa 5 get rotate PFs -2 div dup translate
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 M 0 PFs V } for
+ 0 PFa 6 get ne {
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 2 1 roll M PFs 0 V } for
+ } if
+ stroke grestore } def
+%
+/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
+dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
+currentdict end definefont pop
+end
+%%EndProlog
+gnudict begin
+gsave
+0 0 translate
+0.100 0.100 scale
+0 setgray
+newpath
+0.500 UL
+LTb
+481 331 M
+-31 0 V
+0.500 UL
+LTb
+481 680 M
+-31 0 V
+0.500 UL
+LTb
+481 1029 M
+-31 0 V
+0.500 UL
+LTb
+481 1378 M
+-31 0 V
+0.500 UL
+LTb
+481 1727 M
+-31 0 V
+0.500 UL
+LTb
+481 2076 M
+-31 0 V
+0.500 UL
+LTb
+481 331 M
+0 -31 V
+0.500 UL
+LTb
+852 331 M
+0 -31 V
+0.500 UL
+LTb
+1223 331 M
+0 -31 V
+0.500 UL
+LTb
+1594 331 M
+0 -31 V
+0.500 UL
+LTb
+1966 331 M
+0 -31 V
+0.500 UL
+LTb
+2337 331 M
+0 -31 V
+0.500 UL
+LTb
+2708 331 M
+0 -31 V
+0.500 UL
+LTb
+3079 331 M
+0 -31 V
+0.500 UL
+LTb
+3450 331 M
+0 -31 V
+0.500 UL
+LTb
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+LTb
+LTb
+LTb
+1.000 UP
+1.000 UL
+LT0
+LTb
+LT0
+3087 1963 M
+263 0 V
+481 396 M
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+9 0 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 2 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 2 V
+9 1 V
+10 1 V
+10 1 V
+10 2 V
+10 1 V
+10 2 V
+10 1 V
+10 1 V
+10 2 V
+10 2 V
+10 1 V
+10 2 V
+10 1 V
+10 2 V
+9 2 V
+10 1 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 3 V
+10 2 V
+9 2 V
+10 3 V
+10 2 V
+10 3 V
+10 3 V
+10 2 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+10 4 V
+10 3 V
+9 4 V
+10 3 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 5 V
+10 4 V
+10 5 V
+10 4 V
+10 5 V
+10 5 V
+10 5 V
+9 6 V
+10 5 V
+10 6 V
+10 6 V
+10 6 V
+10 6 V
+10 6 V
+10 7 V
+10 7 V
+10 7 V
+10 7 V
+10 7 V
+10 8 V
+10 8 V
+9 8 V
+10 9 V
+10 8 V
+10 9 V
+10 10 V
+10 9 V
+10 10 V
+10 10 V
+10 11 V
+10 11 V
+stroke
+1494 756 M
+10 11 V
+10 12 V
+10 12 V
+10 12 V
+9 12 V
+10 14 V
+10 13 V
+10 14 V
+10 14 V
+10 15 V
+10 15 V
+10 15 V
+10 16 V
+10 16 V
+10 17 V
+10 17 V
+10 17 V
+10 17 V
+10 18 V
+9 19 V
+10 18 V
+10 19 V
+10 19 V
+10 19 V
+10 19 V
+10 20 V
+10 19 V
+10 19 V
+10 19 V
+10 19 V
+10 19 V
+10 18 V
+10 18 V
+9 17 V
+10 16 V
+10 16 V
+10 15 V
+10 13 V
+10 13 V
+10 12 V
+10 10 V
+10 9 V
+10 8 V
+10 6 V
+10 5 V
+10 3 V
+10 2 V
+9 0 V
+10 -2 V
+10 -3 V
+10 -5 V
+10 -6 V
+10 -8 V
+10 -9 V
+10 -10 V
+10 -12 V
+10 -13 V
+10 -13 V
+10 -15 V
+10 -16 V
+10 -16 V
+9 -17 V
+10 -18 V
+10 -18 V
+10 -19 V
+10 -19 V
+10 -19 V
+10 -19 V
+10 -19 V
+10 -20 V
+10 -19 V
+10 -19 V
+10 -19 V
+10 -19 V
+10 -18 V
+9 -19 V
+10 -18 V
+10 -17 V
+10 -17 V
+10 -17 V
+10 -17 V
+10 -16 V
+10 -16 V
+10 -15 V
+10 -15 V
+10 -15 V
+10 -14 V
+10 -14 V
+10 -13 V
+10 -14 V
+9 -12 V
+10 -12 V
+10 -12 V
+10 -12 V
+10 -11 V
+10 -11 V
+10 -11 V
+10 -10 V
+10 -10 V
+10 -9 V
+10 -10 V
+10 -9 V
+10 -8 V
+10 -9 V
+stroke
+2527 669 M
+9 -8 V
+10 -8 V
+10 -8 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -5 V
+9 -6 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+9 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+9 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+9 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+9 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+9 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+1.000 UL
+LT1
+LTb
+LT1
+3087 1863 M
+263 0 V
+481 349 M
+10 0 V
+10 1 V
+10 1 V
+10 0 V
+10 1 V
+10 1 V
+10 0 V
+9 1 V
+10 1 V
+10 0 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+9 1 V
+10 1 V
+10 1 V
+10 2 V
+10 1 V
+10 1 V
+10 2 V
+10 1 V
+10 2 V
+10 2 V
+10 1 V
+10 2 V
+10 2 V
+10 2 V
+9 2 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 3 V
+10 2 V
+10 3 V
+10 3 V
+10 2 V
+10 3 V
+10 3 V
+10 4 V
+9 3 V
+10 3 V
+10 4 V
+10 3 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 5 V
+10 4 V
+10 5 V
+10 5 V
+10 5 V
+10 5 V
+10 6 V
+9 5 V
+10 6 V
+10 6 V
+10 6 V
+10 7 V
+10 7 V
+10 7 V
+10 7 V
+10 7 V
+10 8 V
+10 8 V
+10 9 V
+10 8 V
+10 9 V
+9 9 V
+10 10 V
+10 10 V
+10 10 V
+10 10 V
+10 11 V
+10 11 V
+10 12 V
+10 11 V
+10 13 V
+10 12 V
+10 13 V
+10 14 V
+10 13 V
+9 14 V
+10 15 V
+10 15 V
+10 15 V
+10 15 V
+10 16 V
+10 17 V
+10 16 V
+10 18 V
+10 17 V
+stroke
+1494 903 M
+10 18 V
+10 18 V
+10 19 V
+10 18 V
+9 19 V
+10 20 V
+10 20 V
+10 20 V
+10 20 V
+10 20 V
+10 21 V
+10 20 V
+10 21 V
+10 21 V
+10 21 V
+10 21 V
+10 21 V
+10 21 V
+10 21 V
+9 21 V
+10 21 V
+10 20 V
+10 21 V
+10 19 V
+10 20 V
+10 19 V
+10 19 V
+10 18 V
+10 18 V
+10 17 V
+10 16 V
+10 16 V
+10 15 V
+9 14 V
+10 14 V
+10 12 V
+10 12 V
+10 11 V
+10 10 V
+10 8 V
+10 8 V
+10 7 V
+10 5 V
+10 5 V
+10 3 V
+10 3 V
+10 1 V
+9 0 V
+10 -1 V
+10 -3 V
+10 -3 V
+10 -5 V
+10 -5 V
+10 -7 V
+10 -8 V
+10 -8 V
+10 -10 V
+10 -11 V
+10 -12 V
+10 -12 V
+10 -14 V
+9 -14 V
+10 -15 V
+10 -16 V
+10 -16 V
+10 -17 V
+10 -18 V
+10 -18 V
+10 -19 V
+10 -19 V
+10 -20 V
+10 -19 V
+10 -21 V
+10 -20 V
+10 -21 V
+9 -21 V
+10 -21 V
+10 -21 V
+10 -21 V
+10 -21 V
+10 -21 V
+10 -21 V
+10 -21 V
+10 -20 V
+10 -21 V
+10 -20 V
+10 -20 V
+10 -20 V
+10 -20 V
+10 -20 V
+9 -19 V
+10 -18 V
+10 -19 V
+10 -18 V
+10 -18 V
+10 -17 V
+10 -18 V
+10 -16 V
+10 -17 V
+10 -16 V
+10 -15 V
+10 -15 V
+10 -15 V
+10 -15 V
+stroke
+2527 759 M
+9 -14 V
+10 -13 V
+10 -14 V
+10 -13 V
+10 -12 V
+10 -13 V
+10 -11 V
+10 -12 V
+10 -11 V
+10 -11 V
+10 -10 V
+10 -10 V
+10 -10 V
+10 -10 V
+9 -9 V
+10 -9 V
+10 -8 V
+10 -9 V
+10 -8 V
+10 -8 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -6 V
+10 -6 V
+10 -6 V
+9 -5 V
+10 -6 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+9 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+9 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+9 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 0 V
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+1.000 UP
+stroke
+grestore
+end
+showpage
+}}%
+\put(3037,1863){\rjust{$\nu_1=5$}}%
+\put(3037,1963){\rjust{$\nu_1=1$}}%
+\put(1965,2226){\cjust{Student's t distribution}}%
+\put(1965,50){\cjust{$x$}}%
+\put(100,1203){%
+\special{ps: gsave currentpoint currentpoint translate
+270 rotate neg exch neg exch translate}%
+\cstack{$p(x)$}%
+\special{ps: currentpoint grestore moveto}%
+}%
+\put(3450,200){\cjust{ 4}}%
+\put(3079,200){\cjust{ 3}}%
+\put(2708,200){\cjust{ 2}}%
+\put(2337,200){\cjust{ 1}}%
+\put(1966,200){\cjust{ 0}}%
+\put(1594,200){\cjust{-1}}%
+\put(1223,200){\cjust{-2}}%
+\put(852,200){\cjust{-3}}%
+\put(481,200){\cjust{-4}}%
+\put(400,2076){\rjust{ 0.5}}%
+\put(400,1727){\rjust{ 0.4}}%
+\put(400,1378){\rjust{ 0.3}}%
+\put(400,1029){\rjust{ 0.2}}%
+\put(400,680){\rjust{ 0.1}}%
+\put(400,331){\rjust{ 0}}%
+\endGNUPLOTpicture
+\endgroup
+\endinput
diff --git a/gsl-1.9/doc/rand-weibull.tex b/gsl-1.9/doc/rand-weibull.tex
new file mode 100644
index 0000000..92da0cc
--- /dev/null
+++ b/gsl-1.9/doc/rand-weibull.tex
@@ -0,0 +1,1330 @@
+% GNUPLOT: plain TeX with Postscript
+\begingroup
+ \catcode`\@=11\relax
+ \def\GNUPLOTspecial{%
+ \def\do##1{\catcode`##1=12\relax}\dospecials
+ \catcode`\{=1\catcode`\}=2\catcode\%=14\relax\special}%
+%
+\expandafter\ifx\csname GNUPLOTpicture\endcsname\relax
+ \csname newdimen\endcsname\GNUPLOTunit
+ \gdef\GNUPLOTpicture(#1,#2){\vbox to#2\GNUPLOTunit\bgroup
+ \def\put(##1,##2)##3{\unskip\raise##2\GNUPLOTunit
+ \hbox to0pt{\kern##1\GNUPLOTunit ##3\hss}\ignorespaces}%
+ \def\ljust##1{\vbox to0pt{\vss\hbox to0pt{##1\hss}\vss}}%
+ \def\cjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1\hss}\vss}}%
+ \def\rjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1}\vss}}%
+ \def\stack##1{\let\\=\cr\tabskip=0pt\halign{\hfil ####\hfil\cr ##1\crcr}}%
+ \def\lstack##1{\hbox to0pt{\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\cstack##1{\hbox to0pt{\hss\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\rstack##1{\hbox to0pt{\vbox to0pt{\stack{##1}\vss}\hss}}%
+ \vss\hbox to#1\GNUPLOTunit\bgroup\ignorespaces}%
+ \gdef\endGNUPLOTpicture{\hss\egroup\egroup}%
+\fi
+\GNUPLOTunit=0.1bp
+\GNUPLOTpicture(3600,2376)
+{\GNUPLOTspecial{"
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: rand-weibull.tex
+%%Creator: gnuplot 4.0 patchlevel 0
+%%CreationDate: Wed Aug 31 12:38:29 2005
+%%DocumentFonts:
+%%BoundingBox: 0 0 360 237
+%%Orientation: Landscape
+%%EndComments
+/gnudict 256 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+/vshift -33 def
+/dl {10.0 mul} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+/Rounded false def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/N {newpath moveto} bind def
+/C {setrgbcolor} bind def
+/f {rlineto fill} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke userlinewidth 2 mul setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/AL { stroke userlinewidth 2 div setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/UL { dup gnulinewidth mul /userlinewidth exch def
+ dup 1 lt {pop 1} if 10 mul /udl exch def } def
+/PL { stroke userlinewidth setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/LTw { PL [] 1 setgray } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 1 0 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
+/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/Pnt { stroke [] 0 setdash
+ gsave 1 setlinecap M 0 0 V stroke grestore } def
+/Dia { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt } def
+/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt } def
+/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt } def
+/Star { 2 copy Pls Crs } def
+/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill } def
+/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill } def
+/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt } def
+/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill } def
+/Pent { stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt } def
+/PentF { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore } def
+/Circle { stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt } def
+/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
+/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def
+/C1 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C2 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C3 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C4 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C5 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc } bind def
+/C6 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C7 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C8 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C9 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C11 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C12 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C13 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C14 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc } bind def
+/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath } bind def
+/Square { dup Rec } bind def
+/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
+/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
+/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
+/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
+/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill
+ Bsquare } bind def
+/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
+/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare } bind def
+/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare } bind def
+/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
+/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare } bind def
+/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
+/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
+/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
+/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
+/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
+/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
+/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
+/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
+/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
+/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
+/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
+/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
+/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
+/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
+/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
+/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
+/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
+/DiaE { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke } def
+/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke } def
+/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke } def
+/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke } def
+/PentE { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore } def
+/CircE { stroke [] 0 setdash
+ hpt 0 360 arc stroke } def
+/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def
+/DiaW { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke } def
+/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke } def
+/TriUW { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke } def
+/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke } def
+/PentW { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore } def
+/CircW { stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke } def
+/BoxFill { gsave Rec 1 setgray fill grestore } def
+/BoxColFill {
+ gsave Rec
+ /Fillden exch def
+ currentrgbcolor
+ /ColB exch def /ColG exch def /ColR exch def
+ /ColR ColR Fillden mul Fillden sub 1 add def
+ /ColG ColG Fillden mul Fillden sub 1 add def
+ /ColB ColB Fillden mul Fillden sub 1 add def
+ ColR ColG ColB setrgbcolor
+ fill grestore } def
+%
+% PostScript Level 1 Pattern Fill routine
+% Usage: x y w h s a XX PatternFill
+% x,y = lower left corner of box to be filled
+% w,h = width and height of box
+% a = angle in degrees between lines and x-axis
+% XX = 0/1 for no/yes cross-hatch
+%
+/PatternFill { gsave /PFa [ 9 2 roll ] def
+ PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
+ PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
+ gsave 1 setgray fill grestore clip
+ currentlinewidth 0.5 mul setlinewidth
+ /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
+ 0 0 M PFa 5 get rotate PFs -2 div dup translate
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 M 0 PFs V } for
+ 0 PFa 6 get ne {
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 2 1 roll M PFs 0 V } for
+ } if
+ stroke grestore } def
+%
+/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
+dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
+currentdict end definefont pop
+end
+%%EndProlog
+gnudict begin
+gsave
+0 0 translate
+0.100 0.100 scale
+0 setgray
+newpath
+0.500 UL
+LTb
+481 331 M
+-31 0 V
+0.500 UL
+LTb
+481 913 M
+-31 0 V
+0.500 UL
+LTb
+481 1494 M
+-31 0 V
+0.500 UL
+LTb
+481 2076 M
+-31 0 V
+0.500 UL
+LTb
+481 331 M
+0 -31 V
+0.500 UL
+LTb
+1223 331 M
+0 -31 V
+0.500 UL
+LTb
+1966 331 M
+0 -31 V
+0.500 UL
+LTb
+2708 331 M
+0 -31 V
+0.500 UL
+LTb
+3450 331 M
+0 -31 V
+0.500 UL
+LTb
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+LTb
+LTb
+LTb
+1.000 UP
+1.000 UL
+LT0
+LTb
+LT0
+3087 1963 M
+263 0 V
+481 1494 M
+10 -7 V
+10 -8 V
+10 -8 V
+10 -7 V
+10 -8 V
+10 -7 V
+10 -8 V
+9 -7 V
+10 -8 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -8 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -6 V
+10 -7 V
+9 -7 V
+10 -7 V
+10 -6 V
+10 -7 V
+10 -6 V
+10 -7 V
+10 -6 V
+10 -7 V
+10 -6 V
+10 -7 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -6 V
+9 -7 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -5 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -5 V
+10 -6 V
+10 -6 V
+9 -5 V
+10 -6 V
+10 -5 V
+10 -6 V
+10 -5 V
+10 -6 V
+10 -5 V
+10 -5 V
+10 -6 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -6 V
+10 -5 V
+10 -5 V
+9 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -5 V
+9 -4 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+10 -4 V
+9 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+stroke
+1494 919 M
+10 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+9 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+9 -4 V
+10 -3 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+9 -4 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+9 -2 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+9 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+9 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+9 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+stroke
+2527 624 M
+9 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+9 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+9 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+9 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+9 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -1 V
+10 -1 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+1.000 UL
+LT1
+LTb
+LT1
+3087 1863 M
+263 0 V
+481 331 M
+10 16 V
+10 15 V
+10 16 V
+10 15 V
+10 16 V
+10 15 V
+10 16 V
+9 15 V
+10 16 V
+10 15 V
+10 15 V
+10 16 V
+10 15 V
+10 15 V
+10 15 V
+10 15 V
+10 15 V
+10 15 V
+10 15 V
+10 15 V
+10 14 V
+9 15 V
+10 15 V
+10 14 V
+10 14 V
+10 15 V
+10 14 V
+10 14 V
+10 14 V
+10 13 V
+10 14 V
+10 14 V
+10 13 V
+10 13 V
+10 14 V
+9 13 V
+10 13 V
+10 12 V
+10 13 V
+10 13 V
+10 12 V
+10 12 V
+10 12 V
+10 12 V
+10 12 V
+10 11 V
+10 12 V
+10 11 V
+10 11 V
+9 11 V
+10 11 V
+10 10 V
+10 10 V
+10 11 V
+10 10 V
+10 9 V
+10 10 V
+10 10 V
+10 9 V
+10 9 V
+10 9 V
+10 8 V
+10 9 V
+10 8 V
+9 8 V
+10 8 V
+10 8 V
+10 8 V
+10 7 V
+10 7 V
+10 7 V
+10 7 V
+10 6 V
+10 6 V
+10 7 V
+10 5 V
+10 6 V
+10 6 V
+9 5 V
+10 5 V
+10 5 V
+10 5 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 3 V
+10 3 V
+10 3 V
+10 2 V
+9 3 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 1 V
+10 2 V
+10 1 V
+10 1 V
+10 1 V
+stroke
+1494 1328 M
+10 0 V
+10 1 V
+10 0 V
+10 0 V
+9 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+9 -2 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+9 -5 V
+10 -4 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -6 V
+10 -5 V
+10 -5 V
+10 -6 V
+10 -5 V
+10 -6 V
+10 -5 V
+9 -6 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -7 V
+10 -6 V
+10 -6 V
+10 -7 V
+10 -6 V
+9 -7 V
+10 -6 V
+10 -7 V
+10 -7 V
+10 -6 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -6 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+9 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -6 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+9 -7 V
+10 -6 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -6 V
+10 -7 V
+10 -7 V
+10 -7 V
+10 -6 V
+10 -7 V
+10 -6 V
+10 -7 V
+stroke
+2527 811 M
+9 -6 V
+10 -7 V
+10 -6 V
+10 -7 V
+10 -6 V
+10 -6 V
+10 -7 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -6 V
+9 -6 V
+10 -6 V
+10 -6 V
+10 -6 V
+10 -5 V
+10 -6 V
+10 -6 V
+10 -5 V
+10 -6 V
+10 -5 V
+10 -6 V
+10 -5 V
+10 -5 V
+10 -6 V
+9 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -5 V
+10 -4 V
+10 -5 V
+10 -4 V
+9 -5 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -5 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -4 V
+10 -4 V
+9 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -4 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -3 V
+9 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -3 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -3 V
+9 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -3 V
+10 -2 V
+10 -2 V
+10 -2 V
+1.000 UL
+LT2
+LTb
+LT2
+3087 1763 M
+263 0 V
+481 331 M
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+10 1 V
+10 0 V
+9 0 V
+10 1 V
+10 0 V
+10 0 V
+10 1 V
+10 0 V
+10 1 V
+10 0 V
+10 1 V
+10 1 V
+10 0 V
+10 1 V
+10 1 V
+10 1 V
+9 0 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 2 V
+10 1 V
+10 1 V
+10 1 V
+10 2 V
+10 1 V
+9 1 V
+10 2 V
+10 1 V
+10 2 V
+10 1 V
+10 2 V
+10 1 V
+10 2 V
+10 2 V
+10 1 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+9 2 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 3 V
+10 2 V
+10 2 V
+10 3 V
+10 2 V
+9 3 V
+10 2 V
+10 3 V
+10 2 V
+10 3 V
+10 2 V
+10 3 V
+10 3 V
+10 3 V
+10 2 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+9 3 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+10 4 V
+10 3 V
+10 3 V
+10 3 V
+9 4 V
+10 3 V
+10 4 V
+10 3 V
+10 3 V
+10 4 V
+10 3 V
+10 4 V
+10 4 V
+10 3 V
+stroke
+1494 526 M
+10 4 V
+10 3 V
+10 4 V
+10 4 V
+9 3 V
+10 4 V
+10 4 V
+10 4 V
+10 3 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 3 V
+10 4 V
+9 4 V
+10 4 V
+10 4 V
+10 4 V
+10 5 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+9 5 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 5 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 5 V
+10 4 V
+10 4 V
+9 4 V
+10 4 V
+10 4 V
+10 5 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 5 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+9 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+10 4 V
+9 4 V
+10 4 V
+10 3 V
+10 4 V
+10 4 V
+10 4 V
+10 3 V
+10 4 V
+10 4 V
+10 3 V
+10 4 V
+10 4 V
+10 3 V
+10 4 V
+10 3 V
+9 4 V
+10 3 V
+10 3 V
+10 4 V
+10 3 V
+10 3 V
+10 4 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+10 3 V
+stroke
+2527 928 M
+9 3 V
+10 3 V
+10 3 V
+10 3 V
+10 2 V
+10 3 V
+10 3 V
+10 3 V
+10 2 V
+10 3 V
+10 2 V
+10 3 V
+10 2 V
+10 2 V
+9 3 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 2 V
+10 1 V
+10 2 V
+10 2 V
+9 1 V
+10 2 V
+10 1 V
+10 2 V
+10 1 V
+10 1 V
+10 2 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 1 V
+10 0 V
+10 1 V
+9 1 V
+10 1 V
+10 0 V
+10 1 V
+10 0 V
+10 1 V
+10 0 V
+10 0 V
+10 0 V
+10 1 V
+10 0 V
+10 0 V
+10 0 V
+10 0 V
+9 -1 V
+10 0 V
+10 0 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 0 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+9 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -1 V
+10 -2 V
+10 -2 V
+9 -1 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+10 -2 V
+0.500 UL
+LTb
+481 331 M
+2969 0 V
+0 1745 V
+-2969 0 V
+481 331 L
+1.000 UP
+stroke
+grestore
+end
+showpage
+}}%
+\put(3037,1763){\rjust{$a=2,b=3$}}%
+\put(3037,1863){\rjust{$a=1,b=2$}}%
+\put(3037,1963){\rjust{$a=1,b=1$}}%
+\put(1965,2226){\cjust{Weibull Distribution}}%
+\put(1965,50){\cjust{$x$}}%
+\put(100,1203){%
+\special{ps: gsave currentpoint currentpoint translate
+270 rotate neg exch neg exch translate}%
+\cstack{$p(x)$}%
+\special{ps: currentpoint grestore moveto}%
+}%
+\put(3450,200){\cjust{ 2}}%
+\put(2708,200){\cjust{ 1.5}}%
+\put(1966,200){\cjust{ 1}}%
+\put(1223,200){\cjust{ 0.5}}%
+\put(481,200){\cjust{ 0}}%
+\put(400,2076){\rjust{ 1.5}}%
+\put(400,1494){\rjust{ 1}}%
+\put(400,913){\rjust{ 0.5}}%
+\put(400,331){\rjust{ 0}}%
+\endGNUPLOTpicture
+\endgroup
+\endinput
diff --git a/gsl-1.9/doc/randist.texi b/gsl-1.9/doc/randist.texi
new file mode 100644
index 0000000..e193a09
--- /dev/null
+++ b/gsl-1.9/doc/randist.texi
@@ -0,0 +1,2296 @@
+@cindex random number distributions
+@cindex cumulative distribution functions (CDFs)
+@cindex CDFs, cumulative distribution functions
+@cindex inverse cumulative distribution functions
+@cindex quantile functions
+This chapter describes functions for generating random variates and
+computing their probability distributions. Samples from the
+distributions described in this chapter can be obtained using any of the
+random number generators in the library as an underlying source of
+randomness.
+
+In the simplest cases a non-uniform distribution can be obtained
+analytically from the uniform distribution of a random number generator
+by applying an appropriate transformation. This method uses one call to
+the random number generator. More complicated distributions are created
+by the @dfn{acceptance-rejection} method, which compares the desired
+distribution against a distribution which is similar and known
+analytically. This usually requires several samples from the generator.
+
+The library also provides cumulative distribution functions and inverse
+cumulative distribution functions, sometimes referred to as quantile
+functions. The cumulative distribution functions and their inverses are
+computed separately for the upper and lower tails of the distribution,
+allowing full accuracy to be retained for small results.
+
+The functions for random variates and probability density functions
+described in this section are declared in @file{gsl_randist.h}. The
+corresponding cumulative distribution functions are declared in
+@file{gsl_cdf.h}.
+
+Note that the discrete random variate functions always
+return a value of type @code{unsigned int}, and on most platforms this
+has a maximum value of @c{$2^{32}-1 \approx 4.29\times10^9$}
+@math{2^32-1 ~=~ 4.29e9}. They should only be called with
+a safe range of parameters (where there is a negligible probability of
+a variate exceeding this limit) to prevent incorrect results due to
+overflow.
+
+@menu
+* Random Number Distribution Introduction::
+* The Gaussian Distribution::
+* The Gaussian Tail Distribution::
+* The Bivariate Gaussian Distribution::
+* The Exponential Distribution::
+* The Laplace Distribution::
+* The Exponential Power Distribution::
+* The Cauchy Distribution::
+* The Rayleigh Distribution::
+* The Rayleigh Tail Distribution::
+* The Landau Distribution::
+* The Levy alpha-Stable Distributions::
+* The Levy skew alpha-Stable Distribution::
+* The Gamma Distribution::
+* The Flat (Uniform) Distribution::
+* The Lognormal Distribution::
+* The Chi-squared Distribution::
+* The F-distribution::
+* The t-distribution::
+* The Beta Distribution::
+* The Logistic Distribution::
+* The Pareto Distribution::
+* Spherical Vector Distributions::
+* The Weibull Distribution::
+* The Type-1 Gumbel Distribution::
+* The Type-2 Gumbel Distribution::
+* The Dirichlet Distribution::
+* General Discrete Distributions::
+* The Poisson Distribution::
+* The Bernoulli Distribution::
+* The Binomial Distribution::
+* The Multinomial Distribution::
+* The Negative Binomial Distribution::
+* The Pascal Distribution::
+* The Geometric Distribution::
+* The Hypergeometric Distribution::
+* The Logarithmic Distribution::
+* Shuffling and Sampling::
+* Random Number Distribution Examples::
+* Random Number Distribution References and Further Reading::
+@end menu
+
+@node Random Number Distribution Introduction
+@section Introduction
+
+Continuous random number distributions are defined by a probability
+density function, @math{p(x)}, such that the probability of @math{x}
+occurring in the infinitesimal range @math{x} to @math{x+dx} is @c{$p\,dx$}
+@math{p dx}.
+
+The cumulative distribution function for the lower tail @math{P(x)} is
+defined by the integral,
+@tex
+\beforedisplay
+$$
+P(x) = \int_{-\infty}^{x} dx' p(x')
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+P(x) = \int_@{-\infty@}^@{x@} dx' p(x')
+@end example
+
+@end ifinfo
+@noindent
+and gives the probability of a variate taking a value less than @math{x}.
+
+The cumulative distribution function for the upper tail @math{Q(x)} is
+defined by the integral,
+@tex
+\beforedisplay
+$$
+Q(x) = \int_{x}^{+\infty} dx' p(x')
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+Q(x) = \int_@{x@}^@{+\infty@} dx' p(x')
+@end example
+
+@end ifinfo
+@noindent
+and gives the probability of a variate taking a value greater than @math{x}.
+
+The upper and lower cumulative distribution functions are related by
+@math{P(x) + Q(x) = 1} and satisfy @c{$0 \le P(x) \le 1$}
+@math{0 <= P(x) <= 1}, @c{$0 \le Q(x) \le 1$}
+@math{0 <= Q(x) <= 1}.
+
+The inverse cumulative distributions, @c{$x=P^{-1}(P)$}
+@math{x=P^@{-1@}(P)} and @c{$x=Q^{-1}(Q)$}
+@math{x=Q^@{-1@}(Q)} give the values of @math{x}
+which correspond to a specific value of @math{P} or @math{Q}.
+They can be used to find confidence limits from probability values.
+
+For discrete distributions the probability of sampling the integer
+value @math{k} is given by @math{p(k)}, where @math{\sum_k p(k) = 1}.
+The cumulative distribution for the lower tail @math{P(k)} of a
+discrete distribution is defined as,
+@tex
+\beforedisplay
+$$
+P(k) = \sum_{i \le k} p(i)
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+P(k) = \sum_@{i <= k@} p(i)
+@end example
+
+@end ifinfo
+@noindent
+where the sum is over the allowed range of the distribution less than
+or equal to @math{k}.
+
+The cumulative distribution for the upper tail of a discrete
+distribution @math{Q(k)} is defined as
+@tex
+\beforedisplay
+$$
+Q(k) = \sum_{i > k} p(i)
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+Q(k) = \sum_@{i > k@} p(i)
+@end example
+
+@end ifinfo
+@noindent
+giving the sum of probabilities for all values greater than @math{k}.
+These two definitions satisfy the identity @math{P(k)+Q(k)=1}.
+
+If the range of the distribution is 1 to @math{n} inclusive then
+@math{P(n)=1}, @math{Q(n)=0} while @math{P(1) = p(1)},
+@math{Q(1)=1-p(1)}.
+
+@page
+@node The Gaussian Distribution
+@section The Gaussian Distribution
+@deftypefun double gsl_ran_gaussian (const gsl_rng * @var{r}, double @var{sigma})
+@cindex Gaussian distribution
+This function returns a Gaussian random variate, with mean zero and
+standard deviation @var{sigma}. The probability distribution for
+Gaussian random variates is,
+@tex
+\beforedisplay
+$$
+p(x) dx = {1 \over \sqrt{2 \pi \sigma^2}} \exp (-x^2 / 2\sigma^2) dx
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+p(x) dx = @{1 \over \sqrt@{2 \pi \sigma^2@}@} \exp (-x^2 / 2\sigma^2) dx
+@end example
+
+@end ifinfo
+@noindent
+for @math{x} in the range @math{-\infty} to @math{+\infty}. Use the
+transformation @math{z = \mu + x} on the numbers returned by
+@code{gsl_ran_gaussian} to obtain a Gaussian distribution with mean
+@math{\mu}. This function uses the Box-Mueller algorithm which requires two
+calls to the random number generator @var{r}.
+@end deftypefun
+
+@deftypefun double gsl_ran_gaussian_pdf (double @var{x}, double @var{sigma})
+This function computes the probability density @math{p(x)} at @var{x}
+for a Gaussian distribution with standard deviation @var{sigma}, using
+the formula given above.
+@end deftypefun
+
+@sp 1
+@tex
+\centerline{\input rand-gaussian.tex}
+@end tex
+
+@deftypefun double gsl_ran_gaussian_ziggurat (const gsl_rng * @var{r}, double @var{sigma})
+@deftypefunx double gsl_ran_gaussian_ratio_method (const gsl_rng * @var{r}, double @var{sigma})
+This function computes a Gaussian random variate using the alternative
+Marsaglia-Tsang ziggurat and Kinderman-Monahan-Leva ratio methods. The
+Ziggurat algorithm is the fastest available algorithm in most cases.
+@end deftypefun
+
+@deftypefun double gsl_ran_ugaussian (const gsl_rng * @var{r})
+@deftypefunx double gsl_ran_ugaussian_pdf (double @var{x})
+@deftypefunx double gsl_ran_ugaussian_ratio_method (const gsl_rng * @var{r})
+These functions compute results for the unit Gaussian distribution. They
+are equivalent to the functions above with a standard deviation of one,
+@var{sigma} = 1.
+@end deftypefun
+
+@deftypefun double gsl_cdf_gaussian_P (double @var{x}, double @var{sigma})
+@deftypefunx double gsl_cdf_gaussian_Q (double @var{x}, double @var{sigma})
+@deftypefunx double gsl_cdf_gaussian_Pinv (double @var{P}, double @var{sigma})
+@deftypefunx double gsl_cdf_gaussian_Qinv (double @var{Q}, double @var{sigma})
+These functions compute the cumulative distribution functions
+@math{P(x)}, @math{Q(x)} and their inverses for the Gaussian
+distribution with standard deviation @var{sigma}.
+@end deftypefun
+
+@deftypefun double gsl_cdf_ugaussian_P (double @var{x})
+@deftypefunx double gsl_cdf_ugaussian_Q (double @var{x})
+@deftypefunx double gsl_cdf_ugaussian_Pinv (double @var{P})
+@deftypefunx double gsl_cdf_ugaussian_Qinv (double @var{Q})
+These functions compute the cumulative distribution functions
+@math{P(x)}, @math{Q(x)} and their inverses for the unit Gaussian
+distribution.
+@end deftypefun
+
+@page
+@node The Gaussian Tail Distribution
+@section The Gaussian Tail Distribution
+@deftypefun double gsl_ran_gaussian_tail (const gsl_rng * @var{r}, double @var{a}, double @var{sigma})
+@cindex Gaussian Tail distribution
+This function provides random variates from the upper tail of a Gaussian
+distribution with standard deviation @var{sigma}. The values returned
+are larger than the lower limit @var{a}, which must be positive. The
+method is based on Marsaglia's famous rectangle-wedge-tail algorithm (Ann.
+Math. Stat. 32, 894--899 (1961)), with this aspect explained in Knuth, v2,
+3rd ed, p139,586 (exercise 11).
+
+The probability distribution for Gaussian tail random variates is,
+@tex
+\beforedisplay
+$$
+p(x) dx = {1 \over N(a;\sigma) \sqrt{2 \pi \sigma^2}} \exp (- x^2 / 2\sigma^2) dx
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+p(x) dx = @{1 \over N(a;\sigma) \sqrt@{2 \pi \sigma^2@}@} \exp (- x^2/(2 \sigma^2)) dx
+@end example
+
+@end ifinfo
+@noindent
+for @math{x > a} where @math{N(a;\sigma)} is the normalization constant,
+@tex
+\beforedisplay
+$$
+N(a;\sigma) = {1 \over 2} \hbox{erfc}\left({a \over \sqrt{2 \sigma^2}}\right).
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+N(a;\sigma) = (1/2) erfc(a / sqrt(2 sigma^2)).
+@end example
+@end ifinfo
+
+@end deftypefun
+
+@deftypefun double gsl_ran_gaussian_tail_pdf (double @var{x}, double @var{a}, double @var{sigma})
+This function computes the probability density @math{p(x)} at @var{x}
+for a Gaussian tail distribution with standard deviation @var{sigma} and
+lower limit @var{a}, using the formula given above.
+@end deftypefun
+
+@sp 1
+@tex
+\centerline{\input rand-gaussian-tail.tex}
+@end tex
+
+@deftypefun double gsl_ran_ugaussian_tail (const gsl_rng * @var{r}, double @var{a})
+@deftypefunx double gsl_ran_ugaussian_tail_pdf (double @var{x}, double @var{a})
+These functions compute results for the tail of a unit Gaussian
+distribution. They are equivalent to the functions above with a standard
+deviation of one, @var{sigma} = 1.
+@end deftypefun
+
+
+@page
+@node The Bivariate Gaussian Distribution
+@section The Bivariate Gaussian Distribution
+
+@deftypefun void gsl_ran_bivariate_gaussian (const gsl_rng * @var{r}, double @var{sigma_x}, double @var{sigma_y}, double @var{rho}, double * @var{x}, double * @var{y})
+@cindex Bivariate Gaussian distribution
+@cindex two dimensional Gaussian distribution
+@cindex Gaussian distribution, bivariate
+This function generates a pair of correlated Gaussian variates, with
+mean zero, correlation coefficient @var{rho} and standard deviations
+@var{sigma_x} and @var{sigma_y} in the @math{x} and @math{y} directions.
+The probability distribution for bivariate Gaussian random variates is,
+@tex
+\beforedisplay
+$$
+p(x,y) dx dy = {1 \over 2 \pi \sigma_x \sigma_y \sqrt{1-\rho^2}} \exp \left(-{(x^2/\sigma_x^2 + y^2/\sigma_y^2 - 2 \rho x y/(\sigma_x\sigma_y)) \over 2(1-\rho^2)}\right) dx dy
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+p(x,y) dx dy = @{1 \over 2 \pi \sigma_x \sigma_y \sqrt@{1-\rho^2@}@} \exp (-(x^2/\sigma_x^2 + y^2/\sigma_y^2 - 2 \rho x y/(\sigma_x\sigma_y))/2(1-\rho^2)) dx dy
+@end example
+
+@end ifinfo
+@noindent
+for @math{x,y} in the range @math{-\infty} to @math{+\infty}. The
+correlation coefficient @var{rho} should lie between @math{1} and
+@math{-1}.
+@end deftypefun
+
+@deftypefun double gsl_ran_bivariate_gaussian_pdf (double @var{x}, double @var{y}, double @var{sigma_x}, double @var{sigma_y}, double @var{rho})
+This function computes the probability density @math{p(x,y)} at
+(@var{x},@var{y}) for a bivariate Gaussian distribution with standard
+deviations @var{sigma_x}, @var{sigma_y} and correlation coefficient
+@var{rho}, using the formula given above.
+@end deftypefun
+
+@sp 1
+@tex
+\centerline{\input rand-bivariate-gaussian.tex}
+@end tex
+
+@page
+@node The Exponential Distribution
+@section The Exponential Distribution
+@deftypefun double gsl_ran_exponential (const gsl_rng * @var{r}, double @var{mu})
+@cindex Exponential distribution
+This function returns a random variate from the exponential distribution
+with mean @var{mu}. The distribution is,
+@tex
+\beforedisplay
+$$
+p(x) dx = {1 \over \mu} \exp(-x/\mu) dx
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+p(x) dx = @{1 \over \mu@} \exp(-x/\mu) dx
+@end example
+
+@end ifinfo
+@noindent
+for @c{$x \ge 0$}
+@math{x >= 0}.
+@end deftypefun
+
+@deftypefun double gsl_ran_exponential_pdf (double @var{x}, double @var{mu})
+This function computes the probability density @math{p(x)} at @var{x}
+for an exponential distribution with mean @var{mu}, using the formula
+given above.
+@end deftypefun
+
+@sp 1
+@tex
+\centerline{\input rand-exponential.tex}
+@end tex
+
+@deftypefun double gsl_cdf_exponential_P (double @var{x}, double @var{mu})
+@deftypefunx double gsl_cdf_exponential_Q (double @var{x}, double @var{mu})
+@deftypefunx double gsl_cdf_exponential_Pinv (double @var{P}, double @var{mu})
+@deftypefunx double gsl_cdf_exponential_Qinv (double @var{Q}, double @var{mu})
+These functions compute the cumulative distribution functions
+@math{P(x)}, @math{Q(x)} and their inverses for the exponential
+distribution with mean @var{mu}.
+@end deftypefun
+
+@page
+@node The Laplace Distribution
+@section The Laplace Distribution
+@deftypefun double gsl_ran_laplace (const gsl_rng * @var{r}, double @var{a})
+@cindex two-sided exponential distribution
+@cindex Laplace distribution
+This function returns a random variate from the Laplace distribution
+with width @var{a}. The distribution is,
+@tex
+\beforedisplay
+$$
+p(x) dx = {1 \over 2 a} \exp(-|x/a|) dx
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+p(x) dx = @{1 \over 2 a@} \exp(-|x/a|) dx
+@end example
+
+@end ifinfo
+@noindent
+for @math{-\infty < x < \infty}.
+@end deftypefun
+
+@deftypefun double gsl_ran_laplace_pdf (double @var{x}, double @var{a})
+This function computes the probability density @math{p(x)} at @var{x}
+for a Laplace distribution with width @var{a}, using the formula
+given above.
+@end deftypefun
+
+@sp 1
+@tex
+\centerline{\input rand-laplace.tex}
+@end tex
+
+@deftypefun double gsl_cdf_laplace_P (double @var{x}, double @var{a})
+@deftypefunx double gsl_cdf_laplace_Q (double @var{x}, double @var{a})
+@deftypefunx double gsl_cdf_laplace_Pinv (double @var{P}, double @var{a})
+@deftypefunx double gsl_cdf_laplace_Qinv (double @var{Q}, double @var{a})
+These functions compute the cumulative distribution functions
+@math{P(x)}, @math{Q(x)} and their inverses for the Laplace
+distribution with width @var{a}.
+@end deftypefun
+
+
+@page
+@node The Exponential Power Distribution
+@section The Exponential Power Distribution
+@deftypefun double gsl_ran_exppow (const gsl_rng * @var{r}, double @var{a}, double @var{b})
+@cindex Exponential power distribution
+This function returns a random variate from the exponential power distribution
+with scale parameter @var{a} and exponent @var{b}. The distribution is,
+@tex
+\beforedisplay
+$$
+p(x) dx = {1 \over 2 a \Gamma(1+1/b)} \exp(-|x/a|^b) dx
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+p(x) dx = @{1 \over 2 a \Gamma(1+1/b)@} \exp(-|x/a|^b) dx
+@end example
+
+@end ifinfo
+@noindent
+for @c{$x \ge 0$}
+@math{x >= 0}. For @math{b = 1} this reduces to the Laplace
+distribution. For @math{b = 2} it has the same form as a gaussian
+distribution, but with @c{$a = \sqrt{2} \sigma$}
+@math{a = \sqrt@{2@} \sigma}.
+@end deftypefun
+
+@deftypefun double gsl_ran_exppow_pdf (double @var{x}, double @var{a}, double @var{b})
+This function computes the probability density @math{p(x)} at @var{x}
+for an exponential power distribution with scale parameter @var{a}
+and exponent @var{b}, using the formula given above.
+@end deftypefun
+
+@sp 1
+@tex
+\centerline{\input rand-exppow.tex}
+@end tex
+
+@deftypefun double gsl_cdf_exppow_P (double @var{x}, double @var{a}, double @var{b})
+@deftypefunx double gsl_cdf_exppow_Q (double @var{x}, double @var{a}, double @var{b})
+These functions compute the cumulative distribution functions
+@math{P(x)}, @math{Q(x)} for the exponential power distribution with
+parameters @var{a} and @var{b}.
+@end deftypefun
+
+
+@page
+@node The Cauchy Distribution
+@section The Cauchy Distribution
+@deftypefun double gsl_ran_cauchy (const gsl_rng * @var{r}, double @var{a})
+@cindex Cauchy distribution
+This function returns a random variate from the Cauchy distribution with
+scale parameter @var{a}. The probability distribution for Cauchy
+random variates is,
+@tex
+\beforedisplay
+$$
+p(x) dx = {1 \over a\pi (1 + (x/a)^2) } dx
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+p(x) dx = @{1 \over a\pi (1 + (x/a)^2) @} dx
+@end example
+
+@end ifinfo
+@noindent
+for @math{x} in the range @math{-\infty} to @math{+\infty}. The Cauchy
+distribution is also known as the Lorentz distribution.
+@end deftypefun
+
+@deftypefun double gsl_ran_cauchy_pdf (double @var{x}, double @var{a})
+This function computes the probability density @math{p(x)} at @var{x}
+for a Cauchy distribution with scale parameter @var{a}, using the formula
+given above.
+@end deftypefun
+
+@sp 1
+@tex
+\centerline{\input rand-cauchy.tex}
+@end tex
+
+@deftypefun double gsl_cdf_cauchy_P (double @var{x}, double @var{a})
+@deftypefunx double gsl_cdf_cauchy_Q (double @var{x}, double @var{a})
+@deftypefunx double gsl_cdf_cauchy_Pinv (double @var{P}, double @var{a})
+@deftypefunx double gsl_cdf_cauchy_Qinv (double @var{Q}, double @var{a})
+These functions compute the cumulative distribution functions
+@math{P(x)}, @math{Q(x)} and their inverses for the Cauchy
+distribution with scale parameter @var{a}.
+@end deftypefun
+
+
+@page
+@node The Rayleigh Distribution
+@section The Rayleigh Distribution
+@deftypefun double gsl_ran_rayleigh (const gsl_rng * @var{r}, double @var{sigma})
+@cindex Rayleigh distribution
+This function returns a random variate from the Rayleigh distribution with
+scale parameter @var{sigma}. The distribution is,
+@tex
+\beforedisplay
+$$
+p(x) dx = {x \over \sigma^2} \exp(- x^2/(2 \sigma^2)) dx
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+p(x) dx = @{x \over \sigma^2@} \exp(- x^2/(2 \sigma^2)) dx
+@end example
+
+@end ifinfo
+@noindent
+for @math{x > 0}.
+@end deftypefun
+
+@deftypefun double gsl_ran_rayleigh_pdf (double @var{x}, double @var{sigma})
+This function computes the probability density @math{p(x)} at @var{x}
+for a Rayleigh distribution with scale parameter @var{sigma}, using the
+formula given above.
+@end deftypefun
+
+@sp 1
+@tex
+\centerline{\input rand-rayleigh.tex}
+@end tex
+
+@deftypefun double gsl_cdf_rayleigh_P (double @var{x}, double @var{sigma})
+@deftypefunx double gsl_cdf_rayleigh_Q (double @var{x}, double @var{sigma})
+@deftypefunx double gsl_cdf_rayleigh_Pinv (double @var{P}, double @var{sigma})
+@deftypefunx double gsl_cdf_rayleigh_Qinv (double @var{Q}, double @var{sigma})
+These functions compute the cumulative distribution functions
+@math{P(x)}, @math{Q(x)} and their inverses for the Rayleigh
+distribution with scale parameter @var{sigma}.
+@end deftypefun
+
+
+@page
+@node The Rayleigh Tail Distribution
+@section The Rayleigh Tail Distribution
+@deftypefun double gsl_ran_rayleigh_tail (const gsl_rng * @var{r}, double @var{a}, double @var{sigma})
+@cindex Rayleigh Tail distribution
+This function returns a random variate from the tail of the Rayleigh
+distribution with scale parameter @var{sigma} and a lower limit of
+@var{a}. The distribution is,
+@tex
+\beforedisplay
+$$
+p(x) dx = {x \over \sigma^2} \exp ((a^2 - x^2) /(2 \sigma^2)) dx
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+p(x) dx = @{x \over \sigma^2@} \exp ((a^2 - x^2) /(2 \sigma^2)) dx
+@end example
+
+@end ifinfo
+@noindent
+for @math{x > a}.
+@end deftypefun
+
+@deftypefun double gsl_ran_rayleigh_tail_pdf (double @var{x}, double @var{a}, double @var{sigma})
+This function computes the probability density @math{p(x)} at @var{x}
+for a Rayleigh tail distribution with scale parameter @var{sigma} and
+lower limit @var{a}, using the formula given above.
+@end deftypefun
+
+@sp 1
+@tex
+\centerline{\input rand-rayleigh-tail.tex}
+@end tex
+
+@page
+@node The Landau Distribution
+@section The Landau Distribution
+@deftypefun double gsl_ran_landau (const gsl_rng * @var{r})
+@cindex Landau distribution
+This function returns a random variate from the Landau distribution. The
+probability distribution for Landau random variates is defined
+analytically by the complex integral,
+@tex
+\beforedisplay
+$$
+p(x) =
+{1 \over {2 \pi i}} \int_{c-i\infty}^{c+i\infty} ds\, \exp(s \log(s) + x s)
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+p(x) = (1/(2 \pi i)) \int_@{c-i\infty@}^@{c+i\infty@} ds exp(s log(s) + x s)
+@end example
+@end ifinfo
+For numerical purposes it is more convenient to use the following
+equivalent form of the integral,
+@tex
+\beforedisplay
+$$
+p(x) = (1/\pi) \int_0^\infty dt \exp(-t \log(t) - x t) \sin(\pi t).
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+p(x) = (1/\pi) \int_0^\infty dt \exp(-t \log(t) - x t) \sin(\pi t).
+@end example
+@end ifinfo
+@end deftypefun
+
+@deftypefun double gsl_ran_landau_pdf (double @var{x})
+This function computes the probability density @math{p(x)} at @var{x}
+for the Landau distribution using an approximation to the formula given
+above.
+@end deftypefun
+
+@sp 1
+@tex
+\centerline{\input rand-landau.tex}
+@end tex
+
+@page
+@node The Levy alpha-Stable Distributions
+@section The Levy alpha-Stable Distributions
+@deftypefun double gsl_ran_levy (const gsl_rng * @var{r}, double @var{c}, double @var{alpha})
+@cindex Levy distribution
+This function returns a random variate from the Levy symmetric stable
+distribution with scale @var{c} and exponent @var{alpha}. The symmetric
+stable probability distribution is defined by a fourier transform,
+@tex
+\beforedisplay
+$$
+p(x) = {1 \over 2 \pi} \int_{-\infty}^{+\infty} dt \exp(-it x - |c t|^\alpha)
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+p(x) = @{1 \over 2 \pi@} \int_@{-\infty@}^@{+\infty@} dt \exp(-it x - |c t|^alpha)
+@end example
+
+@end ifinfo
+@noindent
+There is no explicit solution for the form of @math{p(x)} and the
+library does not define a corresponding @code{pdf} function. For
+@math{\alpha = 1} the distribution reduces to the Cauchy distribution. For
+@math{\alpha = 2} it is a Gaussian distribution with @c{$\sigma = \sqrt{2} c$}
+@math{\sigma = \sqrt@{2@} c}. For @math{\alpha < 1} the tails of the
+distribution become extremely wide.
+
+The algorithm only works for @c{$0 < \alpha \le 2$}
+@math{0 < alpha <= 2}.
+@end deftypefun
+
+@sp 1
+@tex
+\centerline{\input rand-levy.tex}
+@end tex
+
+@page
+@node The Levy skew alpha-Stable Distribution
+@section The Levy skew alpha-Stable Distribution
+
+@deftypefun double gsl_ran_levy_skew (const gsl_rng * @var{r}, double @var{c}, double @var{alpha}, double @var{beta})
+@cindex Levy distribution, skew
+@cindex Skew Levy distribution
+This function returns a random variate from the Levy skew stable
+distribution with scale @var{c}, exponent @var{alpha} and skewness
+parameter @var{beta}. The skewness parameter must lie in the range
+@math{[-1,1]}. The Levy skew stable probability distribution is defined
+by a fourier transform,
+@tex
+\beforedisplay
+$$
+p(x) = {1 \over 2 \pi} \int_{-\infty}^{+\infty} dt \exp(-it x - |c t|^\alpha (1-i \beta \sign(t) \tan(\pi\alpha/2)))
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+p(x) = @{1 \over 2 \pi@} \int_@{-\infty@}^@{+\infty@} dt \exp(-it x - |c t|^alpha (1-i beta sign(t) tan(pi alpha/2)))
+@end example
+
+@end ifinfo
+@noindent
+When @math{\alpha = 1} the term @math{\tan(\pi \alpha/2)} is replaced by
+@math{-(2/\pi)\log|t|}. There is no explicit solution for the form of
+@math{p(x)} and the library does not define a corresponding @code{pdf}
+function. For @math{\alpha = 2} the distribution reduces to a Gaussian
+distribution with @c{$\sigma = \sqrt{2} c$}
+@math{\sigma = \sqrt@{2@} c} and the skewness parameter has no effect.
+For @math{\alpha < 1} the tails of the distribution become extremely
+wide. The symmetric distribution corresponds to @math{\beta =
+0}.
+
+The algorithm only works for @c{$0 < \alpha \le 2$}
+@math{0 < alpha <= 2}.
+@end deftypefun
+
+The Levy alpha-stable distributions have the property that if @math{N}
+alpha-stable variates are drawn from the distribution @math{p(c, \alpha,
+\beta)} then the sum @math{Y = X_1 + X_2 + \dots + X_N} will also be
+distributed as an alpha-stable variate,
+@c{$p(N^{1/\alpha} c, \alpha, \beta)$}
+@math{p(N^(1/\alpha) c, \alpha, \beta)}.
+
+@comment PDF not available because there is no analytic expression for it
+@comment
+@comment @deftypefun double gsl_ran_levy_pdf (double @var{x}, double @var{mu})
+@comment This function computes the probability density @math{p(x)} at @var{x}
+@comment for a symmetric Levy distribution with scale parameter @var{mu} and
+@comment exponent @var{a}, using the formula given above.
+@comment @end deftypefun
+
+@sp 1
+@tex
+\centerline{\input rand-levyskew.tex}
+@end tex
+
+@page
+@node The Gamma Distribution
+@section The Gamma Distribution
+@deftypefun double gsl_ran_gamma (const gsl_rng * @var{r}, double @var{a}, double @var{b})
+@cindex Gamma distribution
+This function returns a random variate from the gamma
+distribution. The distribution function is,
+@tex
+\beforedisplay
+$$
+p(x) dx = {1 \over \Gamma(a) b^a} x^{a-1} e^{-x/b} dx
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+p(x) dx = @{1 \over \Gamma(a) b^a@} x^@{a-1@} e^@{-x/b@} dx
+@end example
+
+@end ifinfo
+@noindent
+for @math{x > 0}.
+@comment If @xmath{X} and @xmath{Y} are independent gamma-distributed random
+@comment variables of order @xmath{a} and @xmath{b}, then @xmath{X+Y} has a gamma
+@comment distribution of order @xmath{a+b}.
+
+@cindex Erlang distribution
+The gamma distribution with an integer parameter @var{a} is known as the Erlang distribution.
+
+The variates are computed using the Marsaglia-Tsang fast gamma method.
+This function for this method was previously called
+@code{gsl_ran_gamma_mt} and can still be accessed using this name.
+@end deftypefun
+
+@deftypefun double gsl_ran_gamma_knuth (const gsl_rng * @var{r}, double @var{a}, double @var{b})
+This function returns a gamma variate using the algorithms from Knuth (vol 2).
+@end deftypefun
+
+@deftypefun double gsl_ran_gamma_pdf (double @var{x}, double @var{a}, double @var{b})
+This function computes the probability density @math{p(x)} at @var{x}
+for a gamma distribution with parameters @var{a} and @var{b}, using the
+formula given above.
+@end deftypefun
+
+@sp 1
+@tex
+\centerline{\input rand-gamma.tex}
+@end tex
+
+@deftypefun double gsl_cdf_gamma_P (double @var{x}, double @var{a}, double @var{b})
+@deftypefunx double gsl_cdf_gamma_Q (double @var{x}, double @var{a}, double @var{b})
+@deftypefunx double gsl_cdf_gamma_Pinv (double @var{P}, double @var{a}, double @var{b})
+@deftypefunx double gsl_cdf_gamma_Qinv (double @var{Q}, double @var{a}, double @var{b})
+These functions compute the cumulative distribution functions
+@math{P(x)}, @math{Q(x)} and their inverses for the gamma
+distribution with parameters @var{a} and @var{b}.
+@end deftypefun
+
+@page
+@node The Flat (Uniform) Distribution
+@section The Flat (Uniform) Distribution
+@deftypefun double gsl_ran_flat (const gsl_rng * @var{r}, double @var{a}, double @var{b})
+@cindex flat distribution
+@cindex uniform distribution
+This function returns a random variate from the flat (uniform)
+distribution from @var{a} to @var{b}. The distribution is,
+@tex
+\beforedisplay
+$$
+p(x) dx = {1 \over (b-a)} dx
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+p(x) dx = @{1 \over (b-a)@} dx
+@end example
+
+@end ifinfo
+@noindent
+if @c{$a \le x < b$}
+@math{a <= x < b} and 0 otherwise.
+@end deftypefun
+
+@deftypefun double gsl_ran_flat_pdf (double @var{x}, double @var{a}, double @var{b})
+This function computes the probability density @math{p(x)} at @var{x}
+for a uniform distribution from @var{a} to @var{b}, using the formula
+given above.
+@end deftypefun
+
+@sp 1
+@tex
+\centerline{\input rand-flat.tex}
+@end tex
+
+@deftypefun double gsl_cdf_flat_P (double @var{x}, double @var{a}, double @var{b})
+@deftypefunx double gsl_cdf_flat_Q (double @var{x}, double @var{a}, double @var{b})
+@deftypefunx double gsl_cdf_flat_Pinv (double @var{P}, double @var{a}, double @var{b})
+@deftypefunx double gsl_cdf_flat_Qinv (double @var{Q}, double @var{a}, double @var{b})
+These functions compute the cumulative distribution functions
+@math{P(x)}, @math{Q(x)} and their inverses for a uniform distribution
+from @var{a} to @var{b}.
+@end deftypefun
+
+
+@page
+@node The Lognormal Distribution
+@section The Lognormal Distribution
+@deftypefun double gsl_ran_lognormal (const gsl_rng * @var{r}, double @var{zeta}, double @var{sigma})
+@cindex Lognormal distribution
+This function returns a random variate from the lognormal
+distribution. The distribution function is,
+@tex
+\beforedisplay
+$$
+p(x) dx = {1 \over x \sqrt{2 \pi \sigma^2}} \exp(-(\ln(x) - \zeta)^2/2 \sigma^2) dx
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+p(x) dx = @{1 \over x \sqrt@{2 \pi \sigma^2@} @} \exp(-(\ln(x) - \zeta)^2/2 \sigma^2) dx
+@end example
+
+@end ifinfo
+@noindent
+for @math{x > 0}.
+@end deftypefun
+
+@deftypefun double gsl_ran_lognormal_pdf (double @var{x}, double @var{zeta}, double @var{sigma})
+This function computes the probability density @math{p(x)} at @var{x}
+for a lognormal distribution with parameters @var{zeta} and @var{sigma},
+using the formula given above.
+@end deftypefun
+
+@sp 1
+@tex
+\centerline{\input rand-lognormal.tex}
+@end tex
+
+@deftypefun double gsl_cdf_lognormal_P (double @var{x}, double @var{zeta}, double @var{sigma})
+@deftypefunx double gsl_cdf_lognormal_Q (double @var{x}, double @var{zeta}, double @var{sigma})
+@deftypefunx double gsl_cdf_lognormal_Pinv (double @var{P}, double @var{zeta}, double @var{sigma})
+@deftypefunx double gsl_cdf_lognormal_Qinv (double @var{Q}, double @var{zeta}, double @var{sigma})
+These functions compute the cumulative distribution functions
+@math{P(x)}, @math{Q(x)} and their inverses for the lognormal
+distribution with parameters @var{zeta} and @var{sigma}.
+@end deftypefun
+
+
+@page
+@node The Chi-squared Distribution
+@section The Chi-squared Distribution
+The chi-squared distribution arises in statistics. If @math{Y_i} are
+@math{n} independent gaussian random variates with unit variance then the
+sum-of-squares,
+@tex
+\beforedisplay
+$$
+X_i = \sum_i Y_i^2
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+X_i = \sum_i Y_i^2
+@end example
+
+@end ifinfo
+@noindent
+has a chi-squared distribution with @math{n} degrees of freedom.
+
+@deftypefun double gsl_ran_chisq (const gsl_rng * @var{r}, double @var{nu})
+@cindex Chi-squared distribution
+This function returns a random variate from the chi-squared distribution
+with @var{nu} degrees of freedom. The distribution function is,
+@tex
+\beforedisplay
+$$
+p(x) dx = {1 \over 2 \Gamma(\nu/2) } (x/2)^{\nu/2 - 1} \exp(-x/2) dx
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+p(x) dx = @{1 \over 2 \Gamma(\nu/2) @} (x/2)^@{\nu/2 - 1@} \exp(-x/2) dx
+@end example
+
+@end ifinfo
+@noindent
+for @c{$x \ge 0$}
+@math{x >= 0}.
+@end deftypefun
+
+@deftypefun double gsl_ran_chisq_pdf (double @var{x}, double @var{nu})
+This function computes the probability density @math{p(x)} at @var{x}
+for a chi-squared distribution with @var{nu} degrees of freedom, using
+the formula given above.
+@end deftypefun
+
+@sp 1
+@tex
+\centerline{\input rand-chisq.tex}
+@end tex
+
+@deftypefun double gsl_cdf_chisq_P (double @var{x}, double @var{nu})
+@deftypefunx double gsl_cdf_chisq_Q (double @var{x}, double @var{nu})
+@deftypefunx double gsl_cdf_chisq_Pinv (double @var{P}, double @var{nu})
+@deftypefunx double gsl_cdf_chisq_Qinv (double @var{Q}, double @var{nu})
+These functions compute the cumulative distribution functions
+@math{P(x)}, @math{Q(x)} and their inverses for the chi-squared
+distribution with @var{nu} degrees of freedom.
+@end deftypefun
+
+
+
+@page
+@node The F-distribution
+@section The F-distribution
+The F-distribution arises in statistics. If @math{Y_1} and @math{Y_2}
+are chi-squared deviates with @math{\nu_1} and @math{\nu_2} degrees of
+freedom then the ratio,
+@tex
+\beforedisplay
+$$
+X = { (Y_1 / \nu_1) \over (Y_2 / \nu_2) }
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+X = @{ (Y_1 / \nu_1) \over (Y_2 / \nu_2) @}
+@end example
+
+@end ifinfo
+@noindent
+has an F-distribution @math{F(x;\nu_1,\nu_2)}.
+
+@deftypefun double gsl_ran_fdist (const gsl_rng * @var{r}, double @var{nu1}, double @var{nu2})
+@cindex F-distribution
+This function returns a random variate from the F-distribution with degrees of freedom @var{nu1} and @var{nu2}. The distribution function is,
+@tex
+\beforedisplay
+$$
+p(x) dx =
+ { \Gamma((\nu_1 + \nu_2)/2)
+ \over \Gamma(\nu_1/2) \Gamma(\nu_2/2) }
+ \nu_1^{\nu_1/2} \nu_2^{\nu_2/2}
+ x^{\nu_1/2 - 1} (\nu_2 + \nu_1 x)^{-\nu_1/2 -\nu_2/2}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+p(x) dx =
+ @{ \Gamma((\nu_1 + \nu_2)/2)
+ \over \Gamma(\nu_1/2) \Gamma(\nu_2/2) @}
+ \nu_1^@{\nu_1/2@} \nu_2^@{\nu_2/2@}
+ x^@{\nu_1/2 - 1@} (\nu_2 + \nu_1 x)^@{-\nu_1/2 -\nu_2/2@}
+@end example
+
+@end ifinfo
+@noindent
+for @c{$x \ge 0$}
+@math{x >= 0}.
+@end deftypefun
+
+@deftypefun double gsl_ran_fdist_pdf (double @var{x}, double @var{nu1}, double @var{nu2})
+This function computes the probability density @math{p(x)} at @var{x}
+for an F-distribution with @var{nu1} and @var{nu2} degrees of freedom,
+using the formula given above.
+@end deftypefun
+
+@sp 1
+@tex
+\centerline{\input rand-fdist.tex}
+@end tex
+
+@deftypefun double gsl_cdf_fdist_P (double @var{x}, double @var{nu1}, double @var{nu2})
+@deftypefunx double gsl_cdf_fdist_Q (double @var{x}, double @var{nu1}, double @var{nu2})
+@deftypefunx double gsl_cdf_fdist_Pinv (double @var{P}, double @var{nu1}, double @var{nu2})
+@deftypefunx double gsl_cdf_fdist_Qinv (double @var{Q}, double @var{nu1}, double @var{nu2})
+These functions compute the cumulative distribution functions
+@math{P(x)}, @math{Q(x)} and their inverses for the F-distribution
+with @var{nu1} and @var{nu2} degrees of freedom.
+@end deftypefun
+
+@page
+@node The t-distribution
+@section The t-distribution
+The t-distribution arises in statistics. If @math{Y_1} has a normal
+distribution and @math{Y_2} has a chi-squared distribution with
+@math{\nu} degrees of freedom then the ratio,
+@tex
+\beforedisplay
+$$
+X = { Y_1 \over \sqrt{Y_2 / \nu} }
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+X = @{ Y_1 \over \sqrt@{Y_2 / \nu@} @}
+@end example
+
+@end ifinfo
+@noindent
+has a t-distribution @math{t(x;\nu)} with @math{\nu} degrees of freedom.
+
+@deftypefun double gsl_ran_tdist (const gsl_rng * @var{r}, double @var{nu})
+@cindex t-distribution
+@cindex Student t-distribution
+This function returns a random variate from the t-distribution. The
+distribution function is,
+@tex
+\beforedisplay
+$$
+p(x) dx = {\Gamma((\nu + 1)/2) \over \sqrt{\pi \nu} \Gamma(\nu/2)}
+ (1 + x^2/\nu)^{-(\nu + 1)/2} dx
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+p(x) dx = @{\Gamma((\nu + 1)/2) \over \sqrt@{\pi \nu@} \Gamma(\nu/2)@}
+ (1 + x^2/\nu)^@{-(\nu + 1)/2@} dx
+@end example
+
+@end ifinfo
+@noindent
+for @math{-\infty < x < +\infty}.
+@end deftypefun
+
+@deftypefun double gsl_ran_tdist_pdf (double @var{x}, double @var{nu})
+This function computes the probability density @math{p(x)} at @var{x}
+for a t-distribution with @var{nu} degrees of freedom, using the formula
+given above.
+@end deftypefun
+
+@sp 1
+@tex
+\centerline{\input rand-tdist.tex}
+@end tex
+
+@deftypefun double gsl_cdf_tdist_P (double @var{x}, double @var{nu})
+@deftypefunx double gsl_cdf_tdist_Q (double @var{x}, double @var{nu})
+@deftypefunx double gsl_cdf_tdist_Pinv (double @var{P}, double @var{nu})
+@deftypefunx double gsl_cdf_tdist_Qinv (double @var{Q}, double @var{nu})
+These functions compute the cumulative distribution functions
+@math{P(x)}, @math{Q(x)} and their inverses for the t-distribution
+with @var{nu} degrees of freedom.
+@end deftypefun
+
+@page
+@node The Beta Distribution
+@section The Beta Distribution
+@deftypefun double gsl_ran_beta (const gsl_rng * @var{r}, double @var{a}, double @var{b})
+@cindex Beta distribution
+This function returns a random variate from the beta
+distribution. The distribution function is,
+@tex
+\beforedisplay
+$$
+p(x) dx = {\Gamma(a+b) \over \Gamma(a) \Gamma(b)} x^{a-1} (1-x)^{b-1} dx
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+p(x) dx = @{\Gamma(a+b) \over \Gamma(a) \Gamma(b)@} x^@{a-1@} (1-x)^@{b-1@} dx
+@end example
+
+@end ifinfo
+@noindent
+for @c{$0 \le x \le 1$}
+@math{0 <= x <= 1}.
+@end deftypefun
+
+@deftypefun double gsl_ran_beta_pdf (double @var{x}, double @var{a}, double @var{b})
+This function computes the probability density @math{p(x)} at @var{x}
+for a beta distribution with parameters @var{a} and @var{b}, using the
+formula given above.
+@end deftypefun
+
+@sp 1
+@tex
+\centerline{\input rand-beta.tex}
+@end tex
+
+@deftypefun double gsl_cdf_beta_P (double @var{x}, double @var{a}, double @var{b})
+@deftypefunx double gsl_cdf_beta_Q (double @var{x}, double @var{a}, double @var{b})
+@deftypefunx double gsl_cdf_beta_Pinv (double @var{P}, double @var{a}, double @var{b})
+@deftypefunx double gsl_cdf_beta_Qinv (double @var{Q}, double @var{a}, double @var{b})
+These functions compute the cumulative distribution functions
+@math{P(x)}, @math{Q(x)} and their inverses for the beta
+distribution with parameters @var{a} and @var{b}.
+@end deftypefun
+
+@page
+@node The Logistic Distribution
+@section The Logistic Distribution
+
+@deftypefun double gsl_ran_logistic (const gsl_rng * @var{r}, double @var{a})
+@cindex Logistic distribution
+This function returns a random variate from the logistic
+distribution. The distribution function is,
+@tex
+\beforedisplay
+$$
+p(x) dx = { \exp(-x/a) \over a (1 + \exp(-x/a))^2 } dx
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+p(x) dx = @{ \exp(-x/a) \over a (1 + \exp(-x/a))^2 @} dx
+@end example
+
+@end ifinfo
+@noindent
+for @math{-\infty < x < +\infty}.
+@end deftypefun
+
+@deftypefun double gsl_ran_logistic_pdf (double @var{x}, double @var{a})
+This function computes the probability density @math{p(x)} at @var{x}
+for a logistic distribution with scale parameter @var{a}, using the
+formula given above.
+@end deftypefun
+
+@sp 1
+@tex
+\centerline{\input rand-logistic.tex}
+@end tex
+
+@deftypefun double gsl_cdf_logistic_P (double @var{x}, double @var{a})
+@deftypefunx double gsl_cdf_logistic_Q (double @var{x}, double @var{a})
+@deftypefunx double gsl_cdf_logistic_Pinv (double @var{P}, double @var{a})
+@deftypefunx double gsl_cdf_logistic_Qinv (double @var{Q}, double @var{a})
+These functions compute the cumulative distribution functions
+@math{P(x)}, @math{Q(x)} and their inverses for the logistic
+distribution with scale parameter @var{a}.
+@end deftypefun
+
+@page
+@node The Pareto Distribution
+@section The Pareto Distribution
+@deftypefun double gsl_ran_pareto (const gsl_rng * @var{r}, double @var{a}, double @var{b})
+@cindex Pareto distribution
+This function returns a random variate from the Pareto distribution of
+order @var{a}. The distribution function is,
+@tex
+\beforedisplay
+$$
+p(x) dx = (a/b) / (x/b)^{a+1} dx
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+p(x) dx = (a/b) / (x/b)^@{a+1@} dx
+@end example
+
+@end ifinfo
+@noindent
+for @c{$x \ge b$}
+@math{x >= b}.
+@end deftypefun
+
+@deftypefun double gsl_ran_pareto_pdf (double @var{x}, double @var{a}, double @var{b})
+This function computes the probability density @math{p(x)} at @var{x}
+for a Pareto distribution with exponent @var{a} and scale @var{b}, using
+the formula given above.
+@end deftypefun
+
+@sp 1
+@tex
+\centerline{\input rand-pareto.tex}
+@end tex
+
+@deftypefun double gsl_cdf_pareto_P (double @var{x}, double @var{a}, double @var{b})
+@deftypefunx double gsl_cdf_pareto_Q (double @var{x}, double @var{a}, double @var{b})
+@deftypefunx double gsl_cdf_pareto_Pinv (double @var{P}, double @var{a}, double @var{b})
+@deftypefunx double gsl_cdf_pareto_Qinv (double @var{Q}, double @var{a}, double @var{b})
+These functions compute the cumulative distribution functions
+@math{P(x)}, @math{Q(x)} and their inverses for the Pareto
+distribution with exponent @var{a} and scale @var{b}.
+@end deftypefun
+
+@page
+@node Spherical Vector Distributions
+@section Spherical Vector Distributions
+
+The spherical distributions generate random vectors, located on a
+spherical surface. They can be used as random directions, for example in
+the steps of a random walk.
+
+@deftypefun void gsl_ran_dir_2d (const gsl_rng * @var{r}, double * @var{x}, double * @var{y})
+@deftypefunx void gsl_ran_dir_2d_trig_method (const gsl_rng * @var{r}, double * @var{x}, double * @var{y})
+@cindex 2D random direction vector
+@cindex direction vector, random 2D
+@cindex spherical random variates, 2D
+This function returns a random direction vector @math{v} =
+(@var{x},@var{y}) in two dimensions. The vector is normalized such that
+@math{|v|^2 = x^2 + y^2 = 1}. The obvious way to do this is to take a
+uniform random number between 0 and @math{2\pi} and let @var{x} and
+@var{y} be the sine and cosine respectively. Two trig functions would
+have been expensive in the old days, but with modern hardware
+implementations, this is sometimes the fastest way to go. This is the
+case for the Pentium (but not the case for the Sun Sparcstation).
+One can avoid the trig evaluations by choosing @var{x} and
+@var{y} in the interior of a unit circle (choose them at random from the
+interior of the enclosing square, and then reject those that are outside
+the unit circle), and then dividing by @c{$\sqrt{x^2 + y^2}$}
+@math{\sqrt@{x^2 + y^2@}}.
+A much cleverer approach, attributed to von Neumann (See Knuth, v2, 3rd
+ed, p140, exercise 23), requires neither trig nor a square root. In
+this approach, @var{u} and @var{v} are chosen at random from the
+interior of a unit circle, and then @math{x=(u^2-v^2)/(u^2+v^2)} and
+@math{y=2uv/(u^2+v^2)}.
+@end deftypefun
+
+@deftypefun void gsl_ran_dir_3d (const gsl_rng * @var{r}, double * @var{x}, double * @var{y}, double * @var{z})
+@cindex 3D random direction vector
+@cindex direction vector, random 3D
+@cindex spherical random variates, 3D
+This function returns a random direction vector @math{v} =
+(@var{x},@var{y},@var{z}) in three dimensions. The vector is normalized
+such that @math{|v|^2 = x^2 + y^2 + z^2 = 1}. The method employed is
+due to Robert E. Knop (CACM 13, 326 (1970)), and explained in Knuth, v2,
+3rd ed, p136. It uses the surprising fact that the distribution
+projected along any axis is actually uniform (this is only true for 3
+dimensions).
+@end deftypefun
+
+@deftypefun void gsl_ran_dir_nd (const gsl_rng * @var{r}, size_t @var{n}, double * @var{x})
+@cindex N-dimensional random direction vector
+@cindex direction vector, random N-dimensional
+@cindex spherical random variates, N-dimensional
+
+This function returns a random direction vector
+@c{$v = (x_1,x_2,\ldots,x_n)$}
+@math{v = (x_1,x_2,...,x_n)} in @var{n} dimensions. The vector is normalized
+such that
+@c{$|v|^2 = x_1^2 + x_2^2 + \cdots + x_n^2 = 1$}
+@math{|v|^2 = x_1^2 + x_2^2 + ... + x_n^2 = 1}. The method
+uses the fact that a multivariate gaussian distribution is spherically
+symmetric. Each component is generated to have a gaussian distribution,
+and then the components are normalized. The method is described by
+Knuth, v2, 3rd ed, p135--136, and attributed to G. W. Brown, Modern
+Mathematics for the Engineer (1956).
+@end deftypefun
+
+@page
+@node The Weibull Distribution
+@section The Weibull Distribution
+@deftypefun double gsl_ran_weibull (const gsl_rng * @var{r}, double @var{a}, double @var{b})
+@cindex Weibull distribution
+This function returns a random variate from the Weibull distribution. The
+distribution function is,
+@tex
+\beforedisplay
+$$
+p(x) dx = {b \over a^b} x^{b-1} \exp(-(x/a)^b) dx
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+p(x) dx = @{b \over a^b@} x^@{b-1@} \exp(-(x/a)^b) dx
+@end example
+
+@end ifinfo
+@noindent
+for @c{$x \ge 0$}
+@math{x >= 0}.
+@end deftypefun
+
+@deftypefun double gsl_ran_weibull_pdf (double @var{x}, double @var{a}, double @var{b})
+This function computes the probability density @math{p(x)} at @var{x}
+for a Weibull distribution with scale @var{a} and exponent @var{b},
+using the formula given above.
+@end deftypefun
+
+@sp 1
+@tex
+\centerline{\input rand-weibull.tex}
+@end tex
+
+@deftypefun double gsl_cdf_weibull_P (double @var{x}, double @var{a}, double @var{b})
+@deftypefunx double gsl_cdf_weibull_Q (double @var{x}, double @var{a}, double @var{b})
+@deftypefunx double gsl_cdf_weibull_Pinv (double @var{P}, double @var{a}, double @var{b})
+@deftypefunx double gsl_cdf_weibull_Qinv (double @var{Q}, double @var{a}, double @var{b})
+These functions compute the cumulative distribution functions
+@math{P(x)}, @math{Q(x)} and their inverses for the Weibull
+distribution with scale @var{a} and exponent @var{b}.
+@end deftypefun
+
+
+@page
+@node The Type-1 Gumbel Distribution
+@section The Type-1 Gumbel Distribution
+@deftypefun double gsl_ran_gumbel1 (const gsl_rng * @var{r}, double @var{a}, double @var{b})
+@cindex Gumbel distribution (Type 1)
+@cindex Type 1 Gumbel distribution, random variates
+This function returns a random variate from the Type-1 Gumbel
+distribution. The Type-1 Gumbel distribution function is,
+@tex
+\beforedisplay
+$$
+p(x) dx = a b \exp(-(b \exp(-ax) + ax)) dx
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+p(x) dx = a b \exp(-(b \exp(-ax) + ax)) dx
+@end example
+
+@end ifinfo
+@noindent
+for @math{-\infty < x < \infty}.
+@end deftypefun
+
+@deftypefun double gsl_ran_gumbel1_pdf (double @var{x}, double @var{a}, double @var{b})
+This function computes the probability density @math{p(x)} at @var{x}
+for a Type-1 Gumbel distribution with parameters @var{a} and @var{b},
+using the formula given above.
+@end deftypefun
+
+@sp 1
+@tex
+\centerline{\input rand-gumbel1.tex}
+@end tex
+
+@deftypefun double gsl_cdf_gumbel1_P (double @var{x}, double @var{a}, double @var{b})
+@deftypefunx double gsl_cdf_gumbel1_Q (double @var{x}, double @var{a}, double @var{b})
+@deftypefunx double gsl_cdf_gumbel1_Pinv (double @var{P}, double @var{a}, double @var{b})
+@deftypefunx double gsl_cdf_gumbel1_Qinv (double @var{Q}, double @var{a}, double @var{b})
+These functions compute the cumulative distribution functions
+@math{P(x)}, @math{Q(x)} and their inverses for the Type-1 Gumbel
+distribution with parameters @var{a} and @var{b}.
+@end deftypefun
+
+
+@page
+@node The Type-2 Gumbel Distribution
+@section The Type-2 Gumbel Distribution
+@deftypefun double gsl_ran_gumbel2 (const gsl_rng * @var{r}, double @var{a}, double @var{b})
+@cindex Gumbel distribution (Type 2)
+@cindex Type 2 Gumbel distribution
+This function returns a random variate from the Type-2 Gumbel
+distribution. The Type-2 Gumbel distribution function is,
+@tex
+\beforedisplay
+$$
+p(x) dx = a b x^{-a-1} \exp(-b x^{-a}) dx
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+p(x) dx = a b x^@{-a-1@} \exp(-b x^@{-a@}) dx
+@end example
+
+@end ifinfo
+@noindent
+for @math{0 < x < \infty}.
+@end deftypefun
+
+@deftypefun double gsl_ran_gumbel2_pdf (double @var{x}, double @var{a}, double @var{b})
+This function computes the probability density @math{p(x)} at @var{x}
+for a Type-2 Gumbel distribution with parameters @var{a} and @var{b},
+using the formula given above.
+@end deftypefun
+
+@sp 1
+@tex
+\centerline{\input rand-gumbel2.tex}
+@end tex
+
+@deftypefun double gsl_cdf_gumbel2_P (double @var{x}, double @var{a}, double @var{b})
+@deftypefunx double gsl_cdf_gumbel2_Q (double @var{x}, double @var{a}, double @var{b})
+@deftypefunx double gsl_cdf_gumbel2_Pinv (double @var{P}, double @var{a}, double @var{b})
+@deftypefunx double gsl_cdf_gumbel2_Qinv (double @var{Q}, double @var{a}, double @var{b})
+These functions compute the cumulative distribution functions
+@math{P(x)}, @math{Q(x)} and their inverses for the Type-2 Gumbel
+distribution with parameters @var{a} and @var{b}.
+@end deftypefun
+
+
+@page
+@node The Dirichlet Distribution
+@section The Dirichlet Distribution
+@deftypefun void gsl_ran_dirichlet (const gsl_rng * @var{r}, size_t @var{K}, const double @var{alpha}[], double @var{theta}[])
+@cindex Dirichlet distribution
+This function returns an array of @var{K} random variates from a Dirichlet
+distribution of order @var{K}-1. The distribution function is
+@tex
+\beforedisplay
+$$
+p(\theta_1,\ldots,\theta_K) \, d\theta_1 \cdots d\theta_K =
+ {1 \over Z} \prod_{i=1}^{K} \theta_i^{\alpha_i - 1}
+ \; \delta(1 -\sum_{i=1}^K \theta_i) d\theta_1 \cdots d\theta_K
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+p(\theta_1, ..., \theta_K) d\theta_1 ... d\theta_K =
+ (1/Z) \prod_@{i=1@}^K \theta_i^@{\alpha_i - 1@} \delta(1 -\sum_@{i=1@}^K \theta_i) d\theta_1 ... d\theta_K
+@end example
+
+@end ifinfo
+@noindent
+for @c{$\theta_i \ge 0$}
+@math{theta_i >= 0}
+and @c{$\alpha_i \ge 0$}
+@math{alpha_i >= 0}. The delta function ensures that @math{\sum \theta_i = 1}.
+The normalization factor @math{Z} is
+@tex
+\beforedisplay
+$$
+Z = {\prod_{i=1}^K \Gamma(\alpha_i) \over \Gamma( \sum_{i=1}^K \alpha_i)}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+Z = @{\prod_@{i=1@}^K \Gamma(\alpha_i)@} / @{\Gamma( \sum_@{i=1@}^K \alpha_i)@}
+@end example
+@end ifinfo
+
+The random variates are generated by sampling @var{K} values
+from gamma distributions with parameters
+@c{$a=\alpha_i$, $b=1$}
+@math{a=alpha_i, b=1},
+and renormalizing.
+See A.M. Law, W.D. Kelton, @cite{Simulation Modeling and Analysis} (1991).
+@end deftypefun
+
+@deftypefun double gsl_ran_dirichlet_pdf (size_t @var{K}, const double @var{alpha}[], const double @var{theta}[])
+This function computes the probability density
+@c{$p(\theta_1, \ldots , \theta_K)$}
+@math{p(\theta_1, ... , \theta_K)}
+at @var{theta}[@var{K}] for a Dirichlet distribution with parameters
+@var{alpha}[@var{K}], using the formula given above.
+@end deftypefun
+
+@deftypefun double gsl_ran_dirichlet_lnpdf (size_t @var{K}, const double @var{alpha}[], const double @var{theta}[])
+This function computes the logarithm of the probability density
+@c{$p(\theta_1, \ldots , \theta_K)$}
+@math{p(\theta_1, ... , \theta_K)}
+for a Dirichlet distribution with parameters
+@var{alpha}[@var{K}].
+@end deftypefun
+
+@page
+@node General Discrete Distributions
+@section General Discrete Distributions
+
+Given @math{K} discrete events with different probabilities @math{P[k]},
+produce a random value @math{k} consistent with its probability.
+
+The obvious way to do this is to preprocess the probability list by
+generating a cumulative probability array with @math{K+1} elements:
+@tex
+\beforedisplay
+$$
+\eqalign{
+C[0] & = 0 \cr
+C[k+1] &= C[k]+P[k].
+}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+ C[0] = 0
+C[k+1] = C[k]+P[k].
+@end example
+
+@end ifinfo
+@noindent
+Note that this construction produces @math{C[K]=1}. Now choose a
+uniform deviate @math{u} between 0 and 1, and find the value of @math{k}
+such that @c{$C[k] \le u < C[k+1]$}
+@math{C[k] <= u < C[k+1]}.
+Although this in principle requires of order @math{\log K} steps per
+random number generation, they are fast steps, and if you use something
+like @math{\lfloor uK \rfloor} as a starting point, you can often do
+pretty well.
+
+But faster methods have been devised. Again, the idea is to preprocess
+the probability list, and save the result in some form of lookup table;
+then the individual calls for a random discrete event can go rapidly.
+An approach invented by G. Marsaglia (Generating discrete random numbers
+in a computer, Comm ACM 6, 37--38 (1963)) is very clever, and readers
+interested in examples of good algorithm design are directed to this
+short and well-written paper. Unfortunately, for large @math{K},
+Marsaglia's lookup table can be quite large.
+
+A much better approach is due to Alastair J. Walker (An efficient method
+for generating discrete random variables with general distributions, ACM
+Trans on Mathematical Software 3, 253--256 (1977); see also Knuth, v2,
+3rd ed, p120--121,139). This requires two lookup tables, one floating
+point and one integer, but both only of size @math{K}. After
+preprocessing, the random numbers are generated in O(1) time, even for
+large @math{K}. The preprocessing suggested by Walker requires
+@math{O(K^2)} effort, but that is not actually necessary, and the
+implementation provided here only takes @math{O(K)} effort. In general,
+more preprocessing leads to faster generation of the individual random
+numbers, but a diminishing return is reached pretty early. Knuth points
+out that the optimal preprocessing is combinatorially difficult for
+large @math{K}.
+
+This method can be used to speed up some of the discrete random number
+generators below, such as the binomial distribution. To use it for
+something like the Poisson Distribution, a modification would have to
+be made, since it only takes a finite set of @math{K} outcomes.
+
+@deftypefun {gsl_ran_discrete_t *} gsl_ran_discrete_preproc (size_t @var{K}, const double * @var{P})
+@cindex Discrete random numbers
+@cindex Discrete random numbers, preprocessing
+This function returns a pointer to a structure that contains the lookup
+table for the discrete random number generator. The array @var{P}[] contains
+the probabilities of the discrete events; these array elements must all be
+positive, but they needn't add up to one (so you can think of them more
+generally as ``weights'')---the preprocessor will normalize appropriately.
+This return value is used
+as an argument for the @code{gsl_ran_discrete} function below.
+@end deftypefun
+
+@deftypefun {size_t} gsl_ran_discrete (const gsl_rng * @var{r}, const gsl_ran_discrete_t * @var{g})
+@cindex Discrete random numbers
+After the preprocessor, above, has been called, you use this function to
+get the discrete random numbers.
+@end deftypefun
+
+@deftypefun {double} gsl_ran_discrete_pdf (size_t @var{k}, const gsl_ran_discrete_t * @var{g})
+@cindex Discrete random numbers
+Returns the probability @math{P[k]} of observing the variable @var{k}.
+Since @math{P[k]} is not stored as part of the lookup table, it must be
+recomputed; this computation takes @math{O(K)}, so if @var{K} is large
+and you care about the original array @math{P[k]} used to create the
+lookup table, then you should just keep this original array @math{P[k]}
+around.
+@end deftypefun
+
+@deftypefun {void} gsl_ran_discrete_free (gsl_ran_discrete_t * @var{g})
+@cindex Discrete random numbers
+De-allocates the lookup table pointed to by @var{g}.
+@end deftypefun
+
+@page
+@node The Poisson Distribution
+@section The Poisson Distribution
+@deftypefun {unsigned int} gsl_ran_poisson (const gsl_rng * @var{r}, double @var{mu})
+@cindex Poisson random numbers
+This function returns a random integer from the Poisson distribution
+with mean @var{mu}. The probability distribution for Poisson variates is,
+@tex
+\beforedisplay
+$$
+p(k) = {\mu^k \over k!} \exp(-\mu)
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+p(k) = @{\mu^k \over k!@} \exp(-\mu)
+@end example
+
+@end ifinfo
+@noindent
+for @c{$k \ge 0$}
+@math{k >= 0}.
+@end deftypefun
+
+@deftypefun double gsl_ran_poisson_pdf (unsigned int @var{k}, double @var{mu})
+This function computes the probability @math{p(k)} of obtaining @var{k}
+from a Poisson distribution with mean @var{mu}, using the formula
+given above.
+@end deftypefun
+
+@sp 1
+@tex
+\centerline{\input rand-poisson.tex}
+@end tex
+
+@deftypefun double gsl_cdf_poisson_P (unsigned int @var{k}, double @var{mu})
+@deftypefunx double gsl_cdf_poisson_Q (unsigned int @var{k}, double @var{mu})
+These functions compute the cumulative distribution functions
+@math{P(k)}, @math{Q(k)} for the Poisson distribution with parameter
+@var{mu}.
+@end deftypefun
+
+
+@page
+@node The Bernoulli Distribution
+@section The Bernoulli Distribution
+@deftypefun {unsigned int} gsl_ran_bernoulli (const gsl_rng * @var{r}, double @var{p})
+@cindex Bernoulli trial, random variates
+This function returns either 0 or 1, the result of a Bernoulli trial
+with probability @var{p}. The probability distribution for a Bernoulli
+trial is,
+@tex
+\beforedisplay
+$$
+\eqalign{
+p(0) & = 1 - p \cr
+p(1) & = p
+}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+p(0) = 1 - p
+p(1) = p
+@end example
+@end ifinfo
+
+@end deftypefun
+
+@deftypefun double gsl_ran_bernoulli_pdf (unsigned int @var{k}, double @var{p})
+This function computes the probability @math{p(k)} of obtaining
+@var{k} from a Bernoulli distribution with probability parameter
+@var{p}, using the formula given above.
+@end deftypefun
+
+@sp 1
+@tex
+\centerline{\input rand-bernoulli.tex}
+@end tex
+
+@page
+@node The Binomial Distribution
+@section The Binomial Distribution
+@deftypefun {unsigned int} gsl_ran_binomial (const gsl_rng * @var{r}, double @var{p}, unsigned int @var{n})
+@cindex Binomial random variates
+This function returns a random integer from the binomial distribution,
+the number of successes in @var{n} independent trials with probability
+@var{p}. The probability distribution for binomial variates is,
+@tex
+\beforedisplay
+$$
+p(k) = {n! \over k! (n-k)!} p^k (1-p)^{n-k}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+p(k) = @{n! \over k! (n-k)! @} p^k (1-p)^@{n-k@}
+@end example
+
+@end ifinfo
+@noindent
+for @c{$0 \le k \le n$}
+@math{0 <= k <= n}.
+@end deftypefun
+
+@deftypefun double gsl_ran_binomial_pdf (unsigned int @var{k}, double @var{p}, unsigned int @var{n})
+This function computes the probability @math{p(k)} of obtaining @var{k}
+from a binomial distribution with parameters @var{p} and @var{n}, using
+the formula given above.
+@end deftypefun
+
+@sp 1
+@tex
+\centerline{\input rand-binomial.tex}
+@end tex
+
+@deftypefun double gsl_cdf_binomial_P (unsigned int @var{k}, double @var{p}, unsigned int @var{n})
+@deftypefunx double gsl_cdf_binomial_Q (unsigned int @var{k}, double @var{p}, unsigned int @var{n})
+These functions compute the cumulative distribution functions
+@math{P(k)}, @math{Q(k)} for the binomial
+distribution with parameters @var{p} and @var{n}.
+@end deftypefun
+
+
+@page
+@node The Multinomial Distribution
+@section The Multinomial Distribution
+@deftypefun void gsl_ran_multinomial (const gsl_rng * @var{r}, size_t @var{K}, unsigned int @var{N}, const double @var{p}[], unsigned int @var{n}[])
+@cindex Multinomial distribution
+
+This function computes a random sample @var{n}[] from the multinomial
+distribution formed by @var{N} trials from an underlying distribution
+@var{p}[@var{K}]. The distribution function for @var{n}[] is,
+@tex
+\beforedisplay
+$$
+P(n_1, n_2,\cdots, n_K) = {{ N!}\over{n_1 ! n_2 ! \cdots n_K !}} \,
+ p_1^{n_1} p_2^{n_2} \cdots p_K^{n_K}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+P(n_1, n_2, ..., n_K) =
+ (N!/(n_1! n_2! ... n_K!)) p_1^n_1 p_2^n_2 ... p_K^n_K
+@end example
+
+@end ifinfo
+@noindent
+where @c{($n_1$, $n_2$, $\ldots$, $n_K$)}
+@math{(n_1, n_2, ..., n_K)}
+are nonnegative integers with
+@c{$\sum_{k=1}^{K} n_k =N$}
+@math{sum_@{k=1@}^K n_k = N},
+and
+@c{$(p_1, p_2, \ldots, p_K)$}
+@math{(p_1, p_2, ..., p_K)}
+is a probability distribution with @math{\sum p_i = 1}.
+If the array @var{p}[@var{K}] is not normalized then its entries will be
+treated as weights and normalized appropriately. The arrays @var{n}[]
+and @var{p}[] must both be of length @var{K}.
+
+Random variates are generated using the conditional binomial method (see
+C.S. David, @cite{The computer generation of multinomial random
+variates}, Comp. Stat. Data Anal. 16 (1993) 205--217 for details).
+@end deftypefun
+
+@deftypefun double gsl_ran_multinomial_pdf (size_t @var{K}, const double @var{p}[], const unsigned int @var{n}[])
+This function computes the probability
+@c{$P(n_1, n_2, \ldots, n_K)$}
+@math{P(n_1, n_2, ..., n_K)}
+of sampling @var{n}[@var{K}] from a multinomial distribution
+with parameters @var{p}[@var{K}], using the formula given above.
+@end deftypefun
+
+@deftypefun double gsl_ran_multinomial_lnpdf (size_t @var{K}, const double @var{p}[], const unsigned int @var{n}[])
+This function returns the logarithm of the probability for the
+multinomial distribution @c{$P(n_1, n_2, \ldots, n_K)$}
+@math{P(n_1, n_2, ..., n_K)} with parameters @var{p}[@var{K}].
+@end deftypefun
+
+@page
+@node The Negative Binomial Distribution
+@section The Negative Binomial Distribution
+@deftypefun {unsigned int} gsl_ran_negative_binomial (const gsl_rng * @var{r}, double @var{p}, double @var{n})
+@cindex Negative Binomial distribution, random variates
+This function returns a random integer from the negative binomial
+distribution, the number of failures occurring before @var{n} successes
+in independent trials with probability @var{p} of success. The
+probability distribution for negative binomial variates is,
+@tex
+\beforedisplay
+$$
+p(k) = {\Gamma(n + k) \over \Gamma(k+1) \Gamma(n) } p^n (1-p)^k
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+p(k) = @{\Gamma(n + k) \over \Gamma(k+1) \Gamma(n) @} p^n (1-p)^k
+@end example
+
+@end ifinfo
+@noindent
+Note that @math{n} is not required to be an integer.
+@end deftypefun
+
+@deftypefun double gsl_ran_negative_binomial_pdf (unsigned int @var{k}, double @var{p}, double @var{n})
+This function computes the probability @math{p(k)} of obtaining @var{k}
+from a negative binomial distribution with parameters @var{p} and
+@var{n}, using the formula given above.
+@end deftypefun
+
+@sp 1
+@tex
+\centerline{\input rand-nbinomial.tex}
+@end tex
+
+@deftypefun double gsl_cdf_negative_binomial_P (unsigned int @var{k}, double @var{p}, double @var{n})
+@deftypefunx double gsl_cdf_negative_binomial_Q (unsigned int @var{k}, double @var{p}, double @var{n})
+These functions compute the cumulative distribution functions
+@math{P(k)}, @math{Q(k)} for the negative binomial distribution with
+parameters @var{p} and @var{n}.
+@end deftypefun
+
+@page
+@node The Pascal Distribution
+@section The Pascal Distribution
+
+@deftypefun {unsigned int} gsl_ran_pascal (const gsl_rng * @var{r}, double @var{p}, unsigned int @var{n})
+This function returns a random integer from the Pascal distribution. The
+Pascal distribution is simply a negative binomial distribution with an
+integer value of @math{n}.
+@tex
+\beforedisplay
+$$
+p(k) = {(n + k - 1)! \over k! (n - 1)! } p^n (1-p)^k
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+p(k) = @{(n + k - 1)! \over k! (n - 1)! @} p^n (1-p)^k
+@end example
+
+@end ifinfo
+@noindent
+for @c{$k \ge 0$}
+@math{k >= 0}
+@end deftypefun
+
+@deftypefun double gsl_ran_pascal_pdf (unsigned int @var{k}, double @var{p}, unsigned int @var{n})
+This function computes the probability @math{p(k)} of obtaining @var{k}
+from a Pascal distribution with parameters @var{p} and
+@var{n}, using the formula given above.
+@end deftypefun
+
+@sp 1
+@tex
+\centerline{\input rand-pascal.tex}
+@end tex
+
+@deftypefun double gsl_cdf_pascal_P (unsigned int @var{k}, double @var{p}, unsigned int @var{n})
+@deftypefunx double gsl_cdf_pascal_Q (unsigned int @var{k}, double @var{p}, unsigned int @var{n})
+These functions compute the cumulative distribution functions
+@math{P(k)}, @math{Q(k)} for the Pascal distribution with
+parameters @var{p} and @var{n}.
+@end deftypefun
+
+@page
+@node The Geometric Distribution
+@section The Geometric Distribution
+@deftypefun {unsigned int} gsl_ran_geometric (const gsl_rng * @var{r}, double @var{p})
+@cindex Geometric random variates
+This function returns a random integer from the geometric distribution,
+the number of independent trials with probability @var{p} until the
+first success. The probability distribution for geometric variates
+is,
+@tex
+\beforedisplay
+$$
+p(k) = p (1-p)^{k-1}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+p(k) = p (1-p)^(k-1)
+@end example
+
+@end ifinfo
+@noindent
+for @c{$k \ge 1$}
+@math{k >= 1}. Note that the distribution begins with @math{k=1} with this
+definition. There is another convention in which the exponent @math{k-1}
+is replaced by @math{k}.
+@end deftypefun
+
+@deftypefun double gsl_ran_geometric_pdf (unsigned int @var{k}, double @var{p})
+This function computes the probability @math{p(k)} of obtaining @var{k}
+from a geometric distribution with probability parameter @var{p}, using
+the formula given above.
+@end deftypefun
+
+@sp 1
+@tex
+\centerline{\input rand-geometric.tex}
+@end tex
+
+@deftypefun double gsl_cdf_geometric_P (unsigned int @var{k}, double @var{p})
+@deftypefunx double gsl_cdf_geometric_Q (unsigned int @var{k}, double @var{p})
+These functions compute the cumulative distribution functions
+@math{P(k)}, @math{Q(k)} for the geometric distribution with parameter
+@var{p}.
+@end deftypefun
+
+
+@page
+@node The Hypergeometric Distribution
+@section The Hypergeometric Distribution
+@cindex hypergeometric random variates
+@deftypefun {unsigned int} gsl_ran_hypergeometric (const gsl_rng * @var{r}, unsigned int @var{n1}, unsigned int @var{n2}, unsigned int @var{t})
+@cindex Geometric random variates
+This function returns a random integer from the hypergeometric
+distribution. The probability distribution for hypergeometric
+random variates is,
+@tex
+\beforedisplay
+$$
+p(k) = C(n_1, k) C(n_2, t - k) / C(n_1 + n_2, t)
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+p(k) = C(n_1, k) C(n_2, t - k) / C(n_1 + n_2, t)
+@end example
+
+@end ifinfo
+@noindent
+where @math{C(a,b) = a!/(b!(a-b)!)} and
+@c{$t \leq n_1 + n_2$}
+@math{t <= n_1 + n_2}. The domain of @math{k} is
+@c{$\hbox{max}(0,t-n_2), \ldots, \hbox{min}(t,n_1)$}
+@math{max(0,t-n_2), ..., min(t,n_1)}.
+
+If a population contains @math{n_1} elements of ``type 1'' and
+@math{n_2} elements of ``type 2'' then the hypergeometric
+distribution gives the probability of obtaining @math{k} elements of
+``type 1'' in @math{t} samples from the population without
+replacement.
+@end deftypefun
+
+@deftypefun double gsl_ran_hypergeometric_pdf (unsigned int @var{k}, unsigned int @var{n1}, unsigned int @var{n2}, unsigned int @var{t})
+This function computes the probability @math{p(k)} of obtaining @var{k}
+from a hypergeometric distribution with parameters @var{n1}, @var{n2},
+@var{t}, using the formula given above.
+@end deftypefun
+
+@sp 1
+@tex
+\centerline{\input rand-hypergeometric.tex}
+@end tex
+
+@deftypefun double gsl_cdf_hypergeometric_P (unsigned int @var{k}, unsigned int @var{n1}, unsigned int @var{n2}, unsigned int @var{t})
+@deftypefunx double gsl_cdf_hypergeometric_Q (unsigned int @var{k}, unsigned int @var{n1}, unsigned int @var{n2}, unsigned int @var{t})
+These functions compute the cumulative distribution functions
+@math{P(k)}, @math{Q(k)} for the hypergeometric distribution with
+parameters @var{n1}, @var{n2} and @var{t}.
+@end deftypefun
+
+
+@page
+@node The Logarithmic Distribution
+@section The Logarithmic Distribution
+@deftypefun {unsigned int} gsl_ran_logarithmic (const gsl_rng * @var{r}, double @var{p})
+@cindex Logarithmic random variates
+This function returns a random integer from the logarithmic
+distribution. The probability distribution for logarithmic random variates
+is,
+@tex
+\beforedisplay
+$$
+p(k) = {-1 \over \log(1-p)} {\left( p^k \over k \right)}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+p(k) = @{-1 \over \log(1-p)@} @{(p^k \over k)@}
+@end example
+
+@end ifinfo
+@noindent
+for @c{$k \ge 1$}
+@math{k >= 1}.
+@end deftypefun
+
+@deftypefun double gsl_ran_logarithmic_pdf (unsigned int @var{k}, double @var{p})
+This function computes the probability @math{p(k)} of obtaining @var{k}
+from a logarithmic distribution with probability parameter @var{p},
+using the formula given above.
+@end deftypefun
+
+@sp 1
+@tex
+\centerline{\input rand-logarithmic.tex}
+@end tex
+
+@page
+@node Shuffling and Sampling
+@section Shuffling and Sampling
+
+The following functions allow the shuffling and sampling of a set of
+objects. The algorithms rely on a random number generator as a source of
+randomness and a poor quality generator can lead to correlations in the
+output. In particular it is important to avoid generators with a short
+period. For more information see Knuth, v2, 3rd ed, Section 3.4.2,
+``Random Sampling and Shuffling''.
+
+@deftypefun void gsl_ran_shuffle (const gsl_rng * @var{r}, void * @var{base}, size_t @var{n}, size_t @var{size})
+
+This function randomly shuffles the order of @var{n} objects, each of
+size @var{size}, stored in the array @var{base}[0..@var{n}-1]. The
+output of the random number generator @var{r} is used to produce the
+permutation. The algorithm generates all possible @math{n!}
+permutations with equal probability, assuming a perfect source of random
+numbers.
+
+The following code shows how to shuffle the numbers from 0 to 51,
+
+@example
+int a[52];
+
+for (i = 0; i < 52; i++)
+ @{
+ a[i] = i;
+ @}
+
+gsl_ran_shuffle (r, a, 52, sizeof (int));
+@end example
+
+@end deftypefun
+
+@deftypefun int gsl_ran_choose (const gsl_rng * @var{r}, void * @var{dest}, size_t @var{k}, void * @var{src}, size_t @var{n}, size_t @var{size})
+This function fills the array @var{dest}[k] with @var{k} objects taken
+randomly from the @var{n} elements of the array
+@var{src}[0..@var{n}-1]. The objects are each of size @var{size}. The
+output of the random number generator @var{r} is used to make the
+selection. The algorithm ensures all possible samples are equally
+likely, assuming a perfect source of randomness.
+
+The objects are sampled @emph{without} replacement, thus each object can
+only appear once in @var{dest}[k]. It is required that @var{k} be less
+than or equal to @code{n}. The objects in @var{dest} will be in the
+same relative order as those in @var{src}. You will need to call
+@code{gsl_ran_shuffle(r, dest, n, size)} if you want to randomize the
+order.
+
+The following code shows how to select a random sample of three unique
+numbers from the set 0 to 99,
+
+@example
+double a[3], b[100];
+
+for (i = 0; i < 100; i++)
+ @{
+ b[i] = (double) i;
+ @}
+
+gsl_ran_choose (r, a, 3, b, 100, sizeof (double));
+@end example
+
+@end deftypefun
+
+@deftypefun void gsl_ran_sample (const gsl_rng * @var{r}, void * @var{dest}, size_t @var{k}, void * @var{src}, size_t @var{n}, size_t @var{size})
+This function is like @code{gsl_ran_choose} but samples @var{k} items
+from the original array of @var{n} items @var{src} with replacement, so
+the same object can appear more than once in the output sequence
+@var{dest}. There is no requirement that @var{k} be less than @var{n}
+in this case.
+@end deftypefun
+
+
+@node Random Number Distribution Examples
+@section Examples
+
+The following program demonstrates the use of a random number generator
+to produce variates from a distribution. It prints 10 samples from the
+Poisson distribution with a mean of 3.
+
+@example
+@verbatiminclude examples/randpoisson.c
+@end example
+
+@noindent
+If the library and header files are installed under @file{/usr/local}
+(the default location) then the program can be compiled with these
+options,
+
+@example
+$ gcc -Wall demo.c -lgsl -lgslcblas -lm
+@end example
+
+@noindent
+Here is the output of the program,
+
+@example
+$ ./a.out
+@verbatiminclude examples/randpoisson.out
+@end example
+
+@noindent
+The variates depend on the seed used by the generator. The seed for the
+default generator type @code{gsl_rng_default} can be changed with the
+@code{GSL_RNG_SEED} environment variable to produce a different stream
+of variates,
+
+@example
+$ GSL_RNG_SEED=123 ./a.out
+@verbatiminclude examples/randpoisson.2.out
+@end example
+
+@noindent
+The following program generates a random walk in two dimensions.
+
+@example
+@verbatiminclude examples/randwalk.c
+@end example
+
+@noindent
+Here is the output from the program, three 10-step random walks from the origin,
+
+@tex
+\centerline{\input random-walk.tex}
+@end tex
+
+The following program computes the upper and lower cumulative
+distribution functions for the standard normal distribution at
+@math{x=2}.
+
+@example
+@verbatiminclude examples/cdf.c
+@end example
+
+@noindent
+Here is the output of the program,
+
+@example
+@verbatiminclude examples/cdf.out
+@end example
+
+@node Random Number Distribution References and Further Reading
+@section References and Further Reading
+
+For an encyclopaedic coverage of the subject readers are advised to
+consult the book @cite{Non-Uniform Random Variate Generation} by Luc
+Devroye. It covers every imaginable distribution and provides hundreds
+of algorithms.
+
+@itemize @asis
+@item
+Luc Devroye, @cite{Non-Uniform Random Variate Generation},
+Springer-Verlag, ISBN 0-387-96305-7.
+@end itemize
+
+@noindent
+The subject of random variate generation is also reviewed by Knuth, who
+describes algorithms for all the major distributions.
+
+@itemize @asis
+@item
+Donald E. Knuth, @cite{The Art of Computer Programming: Seminumerical
+Algorithms} (Vol 2, 3rd Ed, 1997), Addison-Wesley, ISBN 0201896842.
+@end itemize
+
+@noindent
+The Particle Data Group provides a short review of techniques for
+generating distributions of random numbers in the ``Monte Carlo''
+section of its Annual Review of Particle Physics.
+
+@itemize @asis
+@item
+@cite{Review of Particle Properties}
+R.M. Barnett et al., Physical Review D54, 1 (1996)
+@uref{http://pdg.lbl.gov/}.
+@end itemize
+
+@noindent
+The Review of Particle Physics is available online in postscript and pdf
+format.
+
+@noindent
+An overview of methods used to compute cumulative distribution functions
+can be found in @cite{Statistical Computing} by W.J. Kennedy and
+J.E. Gentle. Another general reference is @cite{Elements of Statistical
+Computing} by R.A. Thisted.
+
+@itemize @asis
+@item
+William E. Kennedy and James E. Gentle, @cite{Statistical Computing} (1980),
+Marcel Dekker, ISBN 0-8247-6898-1.
+@end itemize
+
+@itemize @asis
+@item
+Ronald A. Thisted, @cite{Elements of Statistical Computing} (1988),
+Chapman & Hall, ISBN 0-412-01371-1.
+@end itemize
+
+@noindent
+The cumulative distribution functions for the Gaussian distribution
+are based on the following papers,
+
+@itemize @asis
+@item
+@cite{Rational Chebyshev Approximations Using Linear Equations},
+W.J. Cody, W. Fraser, J.F. Hart. Numerische Mathematik 12, 242--251 (1968).
+@end itemize
+
+@itemize @asis
+@item
+@cite{Rational Chebyshev Approximations for the Error Function},
+W.J. Cody. Mathematics of Computation 23, n107, 631--637 (July 1969).
+@end itemize
diff --git a/gsl-1.9/doc/random-walk.tex b/gsl-1.9/doc/random-walk.tex
new file mode 100644
index 0000000..3305371
--- /dev/null
+++ b/gsl-1.9/doc/random-walk.tex
@@ -0,0 +1,571 @@
+% GNUPLOT: plain TeX with Postscript
+\begingroup
+ \catcode`\@=11\relax
+ \def\GNUPLOTspecial{%
+ \def\do##1{\catcode`##1=12\relax}\dospecials
+ \catcode`\{=1\catcode`\}=2\catcode\%=14\relax\special}%
+%
+\expandafter\ifx\csname GNUPLOTpicture\endcsname\relax
+ \csname newdimen\endcsname\GNUPLOTunit
+ \gdef\GNUPLOTpicture(#1,#2){\vbox to#2\GNUPLOTunit\bgroup
+ \def\put(##1,##2)##3{\unskip\raise##2\GNUPLOTunit
+ \hbox to0pt{\kern##1\GNUPLOTunit ##3\hss}\ignorespaces}%
+ \def\ljust##1{\vbox to0pt{\vss\hbox to0pt{##1\hss}\vss}}%
+ \def\cjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1\hss}\vss}}%
+ \def\rjust##1{\vbox to0pt{\vss\hbox to0pt{\hss ##1}\vss}}%
+ \def\stack##1{\let\\=\cr\tabskip=0pt\halign{\hfil ####\hfil\cr ##1\crcr}}%
+ \def\lstack##1{\hbox to0pt{\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\cstack##1{\hbox to0pt{\hss\vbox to0pt{\vss\stack{##1}}\hss}}%
+ \def\rstack##1{\hbox to0pt{\vbox to0pt{\stack{##1}\vss}\hss}}%
+ \vss\hbox to#1\GNUPLOTunit\bgroup\ignorespaces}%
+ \gdef\endGNUPLOTpicture{\hss\egroup\egroup}%
+\fi
+\GNUPLOTunit=0.1bp
+\GNUPLOTpicture(2880,2468)
+{\GNUPLOTspecial{"
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: random-walk.tex
+%%Creator: gnuplot 4.0 patchlevel 0
+%%CreationDate: Wed Aug 31 12:38:29 2005
+%%DocumentFonts:
+%%BoundingBox: 0 0 288 246
+%%Orientation: Landscape
+%%EndComments
+/gnudict 256 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+/vshift -33 def
+/dl {10.0 mul} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+/Rounded false def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/N {newpath moveto} bind def
+/C {setrgbcolor} bind def
+/f {rlineto fill} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke userlinewidth 2 mul setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/AL { stroke userlinewidth 2 div setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/UL { dup gnulinewidth mul /userlinewidth exch def
+ dup 1 lt {pop 1} if 10 mul /udl exch def } def
+/PL { stroke userlinewidth setlinewidth
+ Rounded { 1 setlinejoin 1 setlinecap } if } def
+/LTw { PL [] 1 setgray } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 1 0 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
+/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/Pnt { stroke [] 0 setdash
+ gsave 1 setlinecap M 0 0 V stroke grestore } def
+/Dia { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt } def
+/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt } def
+/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt } def
+/Star { 2 copy Pls Crs } def
+/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill } def
+/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill } def
+/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt } def
+/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill } def
+/Pent { stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt } def
+/PentF { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore } def
+/Circle { stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt } def
+/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
+/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def
+/C1 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C2 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C3 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C4 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C5 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc } bind def
+/C6 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C7 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C8 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C9 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C11 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C12 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C13 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C14 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc } bind def
+/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath } bind def
+/Square { dup Rec } bind def
+/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
+/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
+/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
+/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
+/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill
+ Bsquare } bind def
+/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
+/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare } bind def
+/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare } bind def
+/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
+/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare } bind def
+/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
+/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
+/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
+/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
+/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
+/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
+/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
+/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
+/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
+/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
+/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
+/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
+/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
+/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
+/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
+/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
+/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
+/DiaE { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke } def
+/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke } def
+/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke } def
+/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke } def
+/PentE { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore } def
+/CircE { stroke [] 0 setdash
+ hpt 0 360 arc stroke } def
+/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def
+/DiaW { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke } def
+/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke } def
+/TriUW { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke } def
+/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke } def
+/PentW { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore } def
+/CircW { stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke } def
+/BoxFill { gsave Rec 1 setgray fill grestore } def
+/BoxColFill {
+ gsave Rec
+ /Fillden exch def
+ currentrgbcolor
+ /ColB exch def /ColG exch def /ColR exch def
+ /ColR ColR Fillden mul Fillden sub 1 add def
+ /ColG ColG Fillden mul Fillden sub 1 add def
+ /ColB ColB Fillden mul Fillden sub 1 add def
+ ColR ColG ColB setrgbcolor
+ fill grestore } def
+%
+% PostScript Level 1 Pattern Fill routine
+% Usage: x y w h s a XX PatternFill
+% x,y = lower left corner of box to be filled
+% w,h = width and height of box
+% a = angle in degrees between lines and x-axis
+% XX = 0/1 for no/yes cross-hatch
+%
+/PatternFill { gsave /PFa [ 9 2 roll ] def
+ PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
+ PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
+ gsave 1 setgray fill grestore clip
+ currentlinewidth 0.5 mul setlinewidth
+ /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
+ 0 0 M PFa 5 get rotate PFs -2 div dup translate
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 M 0 PFs V } for
+ 0 PFa 6 get ne {
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ { PFa 4 get mul 0 2 1 roll M PFs 0 V } for
+ } if
+ stroke grestore } def
+%
+/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
+dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
+currentdict end definefont pop
+end
+%%EndProlog
+gnudict begin
+gsave
+0 0 translate
+0.100 0.100 scale
+0 setgray
+newpath
+0.500 UL
+LTb
+413 363 M
+-63 0 V
+0.500 UL
+LTb
+413 544 M
+-63 0 V
+0.500 UL
+LTb
+413 724 M
+-63 0 V
+0.500 UL
+LTb
+413 905 M
+-63 0 V
+0.500 UL
+LTb
+413 1085 M
+-63 0 V
+0.500 UL
+LTb
+413 1266 M
+-63 0 V
+0.500 UL
+LTb
+413 1447 M
+-63 0 V
+0.500 UL
+LTb
+413 1627 M
+-63 0 V
+0.500 UL
+LTb
+413 1808 M
+-63 0 V
+0.500 UL
+LTb
+413 1988 M
+-63 0 V
+0.500 UL
+LTb
+413 2169 M
+-63 0 V
+0.500 UL
+LTb
+413 363 M
+0 -63 V
+0.500 UL
+LTb
+503 363 M
+91 0 R
+0 -63 V
+0.500 UL
+LTb
+684 363 M
+90 0 R
+0 -63 V
+0.500 UL
+LTb
+864 363 M
+91 0 R
+0 -63 V
+0.500 UL
+LTb
+1045 363 M
+90 0 R
+0 -63 V
+0.500 UL
+LTb
+1226 363 M
+90 0 R
+0 -63 V
+0.500 UL
+LTb
+1406 363 M
+91 0 R
+0 -63 V
+0.500 UL
+LTb
+1587 363 M
+90 0 R
+0 -63 V
+0.500 UL
+LTb
+1767 363 M
+91 0 R
+0 -63 V
+0.500 UL
+LTb
+1948 363 M
+90 0 R
+0 -63 V
+0.500 UL
+LTb
+2129 363 M
+90 0 R
+0 -63 V
+0.500 UL
+LTb
+1.000 UL
+LTa
+413 1266 M
+1806 0 V
+1.000 UL
+LTa
+1316 363 M
+0 1806 V
+0.500 UL
+LTb
+413 363 M
+1806 0 V
+0 1806 V
+-1806 0 V
+413 363 L
+LTb
+LTb
+LTb
+1.000 UP
+1.000 UP
+1.000 UL
+LT0
+1316 1266 M
+-106 146 V
+51 173 V
+159 86 V
+139 115 V
+-17 -180 V
+-161 -81 V
+-176 40 V
+-124 132 V
+175 47 V
+168 66 V
+1316 1266 M
+-166 70 V
+-176 40 V
+161 81 V
+-121 134 V
+903 1734 L
+68 -168 V
+823 1463 L
+179 27 V
+92 -156 V
+959 1454 L
+357 -188 R
+-176 -42 V
+-82 161 V
+-96 153 V
+-172 55 V
+172 -57 V
+26 179 V
+838 1614 L
+-14 180 V
+721 1646 L
+71 166 V
+524 -546 R
+-173 -51 V
+106 146 V
+110 143 V
+-41 176 V
+-82 -161 V
+1125 1376 L
+161 -82 V
+135 -120 V
+165 74 V
+146 106 V
+1316 1266 Pls
+1210 1412 Pls
+1261 1585 Pls
+1420 1671 Pls
+1559 1786 Pls
+1542 1606 Pls
+1381 1525 Pls
+1205 1565 Pls
+1081 1697 Pls
+1256 1744 Pls
+1424 1810 Pls
+1316 1266 Pls
+1150 1336 Pls
+974 1376 Pls
+1135 1457 Pls
+1014 1591 Pls
+903 1734 Pls
+971 1566 Pls
+823 1463 Pls
+1002 1490 Pls
+1094 1334 Pls
+959 1454 Pls
+1316 1266 Pls
+1140 1224 Pls
+1058 1385 Pls
+962 1538 Pls
+790 1593 Pls
+962 1536 Pls
+988 1715 Pls
+838 1614 Pls
+824 1794 Pls
+721 1646 Pls
+792 1812 Pls
+1316 1266 Pls
+1143 1215 Pls
+1249 1361 Pls
+1359 1504 Pls
+1318 1680 Pls
+1236 1519 Pls
+1125 1376 Pls
+1286 1294 Pls
+1421 1174 Pls
+1586 1248 Pls
+1732 1354 Pls
+0.500 UL
+LTb
+413 363 M
+1806 0 V
+0 1806 V
+-1806 0 V
+413 363 L
+1.000 UP
+stroke
+grestore
+end
+showpage
+}}%
+\put(1316,2319){\cjust{Random walk}}%
+\put(1316,50){\cjust{$k$}}%
+\put(100,1266){%
+\special{ps: gsave currentpoint currentpoint translate
+270 rotate neg exch neg exch translate}%
+\cstack{$p(k)$}%
+\special{ps: currentpoint grestore moveto}%
+}%
+\put(2219,200){\cjust{ 5}}%
+\put(2038,200){\cjust{ 4}}%
+\put(1858,200){\cjust{ 3}}%
+\put(1677,200){\cjust{ 2}}%
+\put(1497,200){\cjust{ 1}}%
+\put(1316,200){\cjust{ 0}}%
+\put(1135,200){\cjust{-1}}%
+\put(955,200){\cjust{-2}}%
+\put(774,200){\cjust{-3}}%
+\put(594,200){\cjust{-4}}%
+\put(413,200){\cjust{-5}}%
+\put(300,2169){\rjust{ 5}}%
+\put(300,1988){\rjust{ 4}}%
+\put(300,1808){\rjust{ 3}}%
+\put(300,1627){\rjust{ 2}}%
+\put(300,1447){\rjust{ 1}}%
+\put(300,1266){\rjust{ 0}}%
+\put(300,1085){\rjust{-1}}%
+\put(300,905){\rjust{-2}}%
+\put(300,724){\rjust{-3}}%
+\put(300,544){\rjust{-4}}%
+\put(300,363){\rjust{-5}}%
+\endGNUPLOTpicture
+\endgroup
+\endinput
diff --git a/gsl-1.9/doc/randplots.gnp b/gsl-1.9/doc/randplots.gnp
new file mode 100644
index 0000000..88221b5
--- /dev/null
+++ b/gsl-1.9/doc/randplots.gnp
@@ -0,0 +1,374 @@
+#set term postscript eps enhanced
+set term pstex monochrome
+set samples 300
+#set size 0.8,0.88 # paperback 6x9 #CHANGE THESE LATER IN FILE ALSO
+set size 1,1.1 # us letter #IF MODIFIED
+set border 31 lw 0.5
+set tics out
+set ticscale 0.5 0.25
+set xtics border nomirror norotate
+set ytics border nomirror norotate
+set format x "%g"
+
+# Continuous distributions
+
+set xlabel "$x$"
+set ylabel "$p(x)$"
+
+set xrange [-5:5]
+set yrange [0:0.5]
+set ytics 0.1
+set xtics 1
+set output "rand-gaussian.tex"
+set title "Gaussian Distribution"
+p(x)=1/sqrt(2*pi*sigma**2)*exp(-x**2/(2*sigma**2))
+plot sigma=1.0, p(x) title "$\\sigma=1$", \
+ sigma=2.0, p(x) title "$\\sigma=2$"
+
+set xrange [0:5]
+set yrange [0:2]
+set ytics 0.5
+set xtics 1
+set output "rand-gaussian-tail.tex"
+set title "Gaussian Tail Distribution"
+p(x)= x > a ? 1/(0.5*erfc(a/sqrt(2*sigma**2))*sqrt(2*pi*sigma**2))*exp(-x**2/(2*sigma**2)) : 0
+plot a=1.5, sigma=1.0, p(x) title "$\\sigma=1,a=1.5$"
+
+set xrange [0:5]
+set yrange [0:1.09]
+set ytics 0.5
+set xtics 1
+set output "rand-rayleigh-tail.tex"
+set title "Rayleigh Tail Distribution"
+p(x)= x > a ? (x/sigma**2)*exp((a**2 - x**2)/(2*sigma**2)) : 0
+plot a=1.0, sigma=1.0, p(x) title "$a=1,\\sigma=1$", \
+ a=0.5, sigma=2.0, p(x) title "$a=0.5,\\sigma=2$"
+
+set size ratio -1 0.8,1.143
+set xlabel "$x$"
+set ylabel "$y$"
+set xrange [-2:2]
+set yrange [-2:2]
+set ytics 1
+set xtics 1
+set output "rand-bivariate-gaussian.tex"
+set title "Bivariate Gaussian Distribution"
+set isosamples 30
+p(x,y)=1/sqrt(2*pi*sqrt(1-rho**2))*exp(-(x**2 + y**2 - 2*rho*x*y)/(2*(1-rho**2)))
+#set cntrparam cspline
+set noclabel
+set contour
+set view 0,0
+set nosurface
+splot rho=0.9, p(x,y) title "$\\sigma_x=1, \\sigma_y=1, \\rho=0.9$"
+set size noratio 1,1.1 # us letter
+
+set xlabel "$x$"
+set ylabel "$p(x)$"
+set ytics 0.1
+set xrange [-5:5]
+set yrange [0:0.4]
+set output "rand-cauchy.tex"
+set title "Cauchy Distribution"
+p(x)=1/(pi*a*(1+(x/a)**2))
+plot a=1.0, p(x) title "$a=1$", \
+ a=2.0, p(x) title "$a=2$"
+
+set ytics 0.5
+set yrange [0:1]
+set xrange [0:3]
+set output "rand-exponential.tex"
+set title "Exponential Distribution"
+p(x)=exp(-x/mu)/mu
+plot mu=1.0, p(x) title "$\\mu=1$", \
+ mu=2.0, p(x) title "$\\mu=2$"
+
+set yrange [0:1]
+set xrange [0:3]
+set output "rand-chisq.tex"
+set title "Chi-squared Distribution"
+p(x)=(x/2)**(nu/2.0-1.0) *exp(-x/2)/ (2*gamma(nu/2.0))
+plot nu=1.0, p(x) title "$\\nu=1$", \
+ nu=2.0, p(x) title "$\\nu=2$", \
+ nu=3.0, p(x) title "$\\nu=3$"
+
+set yrange [0:1]
+set xrange [0:5]
+set output "rand-erlang.tex"
+set title "Erlang Distribution"
+p(x)=x**(n-1) *exp(-x/a)/ (gamma(n)*a**n)
+plot n=1.0, a=1, p(x) title "$n=1$", \
+ n=2.0, a=1.0, p(x) title "$n=2$", \
+ n=3.0, a=1.0, p(x) title "$n=3$"
+
+set xrange [0:2]
+set xtics 1
+set output "rand-fdist.tex"
+set title "F-Distribution"
+p(x)=gamma((v1+v2)/2.0)*v1**(v1/2.0)*v2**(v2/2.0)\
+ /gamma(v1/2.0)/gamma(v2/2.0) * \
+ x**(v1/2.0-1)*(v2+v1*x)**-(v1/2.0+v2/2.0)
+plot v1=1.0, v2=1.0, p(x) title "$\\nu_1=1, \\nu_2=1$", \
+ v1=3.0, v2=1.0, p(x) title "$\\nu_1=3, \\nu_2=2$"
+
+set xrange [0:5]
+set output "rand-flat.tex"
+set title "Flat Distribution"
+p(x)= (x<b && x>a) ? 1/(b-a) : 0
+plot a=0.5, b=2.5, p(x) title "$a=0.5,b=2.5$" with step, \
+ a=1.2, b=4.8, p(x) title "$a=1.2,b=4.8$" with step
+
+set xrange [0:5]
+set yrange [0:1]
+set ytics 0.5
+set output "rand-gamma.tex"
+set title "Gamma Distribution"
+p(x)= x**(a-1)* exp(-x) / gamma(a)
+plot a=1.0, p(x) title "$a=1$", \
+ a=2.0, p(x) title "$a=2$", \
+ a=3.0, p(x) title "$a=3$"
+
+set xrange [0:1]
+set yrange [0:4]
+set xtics 0.25
+set ytics 1
+set output "rand-beta.tex"
+set title "Beta Distribution"
+p(x)= gamma(a+b)/(gamma(a)*gamma(b))*x**(a-1)*(1-x)**(b-1)
+plot a=2.0, b=2.0, p(x) title "$a=2,b=2$", \
+ a=4.0, b=1.0, p(x) title "$a=4,b=1$", \
+ a=1.0, b=4.0, p(x) title "$a=1,b=4$"
+
+
+set xrange [-5:5]
+set yrange [0:0.3]
+set ytics 0.1
+set xtics 1
+set output "rand-logistic.tex"
+set title "Logistic Distribution"
+p(x)= exp(-x/a)/a/(1+exp(-x/a))**2
+plot a=1.0, p(x) title "$a=1$", \
+ a=2.0, p(x) title "$a=2$"
+
+set xrange [0:3]
+set yrange [0:0.7]
+set xtics 1
+set ytics 0.5
+set output "rand-lognormal.tex"
+set title "Lognormal Distribution"
+p(x)= exp(-(log(x)-zeta)**2/2/sigma**2)/sqrt(2*pi*sigma**2)/x
+plot zeta=0.0, sigma=1.0, p(x) title "$\\zeta=0, \\sigma=1$", \
+ zeta=1.0, sigma=1.0, p(x) title "$\\zeta=1, \\sigma=1$"
+
+set xrange [0:5]
+set yrange [0:2]
+set ytics 0.5
+set xtics 1
+set output "rand-pareto.tex"
+set title "Pareto Distribution"
+p(x)= x>b ? a*b**a/x**(a+1) : 0
+plot a=1.0, b=1, p(x) title "$a=1, b=1$", \
+ a=3.0, b=2, p(x) title "$a=3, b=2 $"
+
+set xrange [0:5]
+set yrange [0:0.7]
+set ytics 0.1
+set xtics 1
+set output "rand-rayleigh.tex"
+set title "Rayleigh Distribution"
+p(x)= (x/sigma**2)*exp(-x**2/(2*sigma**2))
+plot sigma=1.0, p(x) title "$\\sigma=1$", \
+ sigma=2.0, p(x) title "$\\sigma=2$"
+
+set xrange [0:5]
+set yrange [0:1.09]
+set ytics 0.5
+set xtics 1
+set output "rand-rayleigh-tail.tex"
+set title "Rayleigh Tail Distribution"
+p(x)= x > a ? (x/sigma**2)*exp((a**2 - x**2)/(2*sigma**2)) : 0
+plot a=1.0, sigma=1.0, p(x) title "$a=1,\\sigma=1$", \
+ a=0.5, sigma=2.0, p(x) title "$a=0.5,\\sigma=2$"
+
+set xrange [-4:4]
+set yrange [0:0.5]
+set ytics 0.1
+set output "rand-tdist.tex"
+set title "Student's t distribution"
+p(x)=gamma((v+1.0)/2)/sqrt(pi*v)/gamma(v/2)*(1+(x**2)/v)**-((v+1.0)/2)
+plot v=1.0, p(x) title "$\\nu_1=1$", \
+ v=5.0, p(x) title "$\\nu_1=5$"
+
+set xrange [-5:5]
+set yrange [0:0.55]
+set ytics 0.1
+set output "rand-laplace.tex"
+set title "Laplace Distribution (Two-sided Exponential)"
+p(x)=exp(-abs(x)/a)/2/a
+plot a=1.0, p(x) title "$a=1$", \
+ a=2.0, p(x) title "$a=2$"
+
+set xrange [-5:5]
+set yrange [0:0.8]
+set ytics 0.2
+set output "rand-exppow.tex"
+set title "Exponential Power Distribution"
+p(x)=exp(-(abs(x/a))**b)/2/a/gamma(1.0+1.0/b)
+plot a=1.0, b=2.5, p(x) title "$a=1, b=2.5$", \
+ a=1.0, b=0.5, p(x) title "$a=1, b=0.5$"
+
+set xrange [-5:10]
+set yrange [0:0.2]
+set ytics 0.1
+set output "rand-landau.tex"
+set title "Landau Distribution"
+plot 'landau.dat' notitle w lines
+
+set xrange [-5:5]
+set yrange [0:0.45]
+set ytics 0.1
+set output "rand-levy.tex"
+set title "Levy Distribution"
+p1(x)=1/(pi*mu*(1+(x/mu)**2))
+p2(x)=1/sqrt(2*pi*2*mu**2)*exp(-x**2/(4*mu**2))
+plot mu=1.0, a=1, p1(x) title "$c=1, \\alpha=1.0$", \
+ mu=1.0, a=2, p2(x) title "$c=1, \\alpha=2.0$"
+
+set xrange [-5:5]
+set yrange [0:0.09]
+set ytics 0.05
+set output "rand-levyskew.tex"
+set title "Levy Skew Distribution"
+logp(x)= 1.0990e+01+x*(-3.3388e-01+x*(-4.2372e-01+x*(2.1749e-01+x*(-4.4910e-02 + x*(4.1801e-03 - 1.4456e-04*x)))))
+p1(x)=exp(logp(x))/1000000
+plot mu=1.0, a=1, p1(x) title "$c=1, \\alpha=1.0, \\beta=1.0$"
+
+
+set xrange [0:2]
+set yrange [0:1.5]
+set ytics 0.5
+set xtics 0.5
+set output "rand-weibull.tex"
+set title "Weibull Distribution"
+p(x)=(b/a) * (x/a)**(b-1) * exp(-(x/a)**b)
+plot a=1.0, b=1.0, p(x) title "$a=1,b=1$", \
+ a=1.0, b=2.0, p(x) title "$a=1,b=2$", \
+ a=2.0, b=3.0, p(x) title "$a=2,b=3$"
+
+set xrange [-2:5]
+set yrange [0:0.5]
+set ytics 0.1
+set xtics 1.0
+set output "rand-gumbel1.tex"
+set title "Type 1 Gumbel Distribution"
+p1(x)=a*b*exp(-(b*exp(-a*x)+a*x))
+plot a=1.0, b=1.0, p1(x) title "Type 1, $a=1,b=1$"
+
+set xrange [0:2]
+set yrange [0:0.7]
+set ytics 0.1
+set xtics 0.5
+set output "rand-gumbel2.tex"
+set title "Type 2 Gumbel Distribution"
+p2(x)=x > 0 ? a*b*x**(-a-1)*exp(-b*x**-a) : 0
+plot a=1.0, b=1.0, p2(x) title "Type 2, $a=1,b=1$"
+
+# Discrete distributions
+
+set xlabel "$k$"
+set ylabel "$p(k)$"
+set ticscale 0.5 1
+set mxtics 2
+
+set xrange [-0.5:10.5]
+set yrange [0:0.3]
+set ytics 0.1
+set xtics 1
+set function style step
+set output "rand-poisson.tex"
+set title "Poisson Distribution"
+p(x)=mu**int(x)/(int(x)!) * exp(-mu)
+plot mu=2.5, p(x+0.5) title "$\\mu=2.5$"
+
+set xrange [:1.5]
+set yrange [0:1]
+set ytics 0.5
+set xtics 1
+set function style step
+set output "rand-bernoulli.tex"
+set title "Bernoulli Trial"
+p(x)= (int(x) == 0) ? 1-p : p
+plot p = 0.7, p(x+0.5) title "$p=0.7$"
+
+set xrange [:10.5]
+set yrange [0:0.3]
+set xtics 1
+set ytics 0.1
+set output "rand-binomial.tex"
+set title "Binomial Distribution"
+p(x)= P**int(x)*(1-P)**(n-int(x))*gamma(n+1.0)/gamma(int(x)+1.0)/gamma(n-int(x)+1.0) + 1e-5
+plot P=0.5,n=9.99999999, p(x+0.5) title "$p=0.5,n=9$"
+
+set xrange [:5.5]
+set yrange [0:0.7]
+set ytics 0.1
+set xtics 1
+set output "rand-geometric.tex"
+set title "Geometric Distribution"
+p(x)=int(x) ? P*(1-P)**int(x-1) : 0
+plot P=0.5, p(x+0.5) title "$p=0.5$"
+
+set xrange [:10.5]
+set yrange [0:0.7]
+set ytics 0.1
+set xtics 1
+set output "rand-logarithmic.tex"
+set title "Logarithmic Distribution"
+p(x)=int(x) ? (-1/log(1-P))*(P**int(x))/int(x) : 0
+plot P=0.7, p(x+0.5) title "$p=0.7$"
+
+set xrange [:10.5]
+set yrange [0:0.7]
+set ytics 0.1
+set xtics 1
+set output "rand-hypergeometric.tex"
+set title "Hypergeometric Distribution"
+choose(a,b)=gamma(a+1)/(gamma(b+1)*gamma(a-b+1))
+p(x)=choose(n1,int(x))*choose(n2,t-int(x))/choose(n1+n2,t)
+plot n1=5, n2=20, t=3, p(x+0.5) title "$n1=5, n2=20, t=3$"
+
+set xrange [:10.5]
+set yrange [0:0.3]
+set xtics 1
+set ytics 0.1
+set output "rand-nbinomial.tex"
+set title "Negative Binomial Distribution"
+p(x)= (P**n)*((1-P)**(int(x)))*gamma(n+int(x))/gamma(n)/gamma(int(x)+1.0) + 1e-5
+plot P=0.5,n=3.5, p(x+0.5) title "$p=0.5,n=3.5$"
+
+set xrange [:10.5]
+set yrange [0:0.3]
+set xtics 1
+set ytics 0.1
+set output "rand-pascal.tex"
+set title "Pascal Distribution"
+p(x)= (P**n)*((1-P)**(int(x)))*gamma(n+int(x))/gamma(n)/gamma(int(x)+1.0) + 1e-5
+plot P=0.5,n=3, p(x+0.5) title "$p=0.5,n=3$"
+
+######################################################################
+
+set ticscale 1 0
+set xrange [-5:5]
+set yrange [-5:5]
+set xtics 1
+set ytics 1
+set size 0.8,1.143
+set size square
+set output "random-walk.tex"
+set title "Random walk"
+set xzeroaxis
+set yzeroaxis
+set nokey
+plot "rand-walk.dat" using 1:2 with linesp
+
+
diff --git a/gsl-1.9/doc/rng.texi b/gsl-1.9/doc/rng.texi
new file mode 100644
index 0000000..a947f31
--- /dev/null
+++ b/gsl-1.9/doc/rng.texi
@@ -0,0 +1,1456 @@
+@cindex random number generators
+
+The library provides a large collection of random number generators
+which can be accessed through a uniform interface. Environment
+variables allow you to select different generators and seeds at runtime,
+so that you can easily switch between generators without needing to
+recompile your program. Each instance of a generator keeps track of its
+own state, allowing the generators to be used in multi-threaded
+programs. Additional functions are available for transforming uniform
+random numbers into samples from continuous or discrete probability
+distributions such as the Gaussian, log-normal or Poisson distributions.
+
+These functions are declared in the header file @file{gsl_rng.h}.
+
+@comment Need to explain the difference between SERIAL and PARALLEL random
+@comment number generators here
+
+@menu
+* General comments on random numbers::
+* The Random Number Generator Interface::
+* Random number generator initialization::
+* Sampling from a random number generator::
+* Auxiliary random number generator functions::
+* Random number environment variables::
+* Copying random number generator state::
+* Reading and writing random number generator state::
+* Random number generator algorithms::
+* Unix random number generators::
+* Other random number generators::
+* Random Number Generator Performance::
+* Random Number Generator Examples::
+* Random Number References and Further Reading::
+* Random Number Acknowledgements::
+@end menu
+
+@node General comments on random numbers
+@section General comments on random numbers
+
+In 1988, Park and Miller wrote a paper entitled ``Random number
+generators: good ones are hard to find.'' [Commun.@: ACM, 31, 1192--1201].
+Fortunately, some excellent random number generators are available,
+though poor ones are still in common use. You may be happy with the
+system-supplied random number generator on your computer, but you should
+be aware that as computers get faster, requirements on random number
+generators increase. Nowadays, a simulation that calls a random number
+generator millions of times can often finish before you can make it down
+the hall to the coffee machine and back.
+
+A very nice review of random number generators was written by Pierre
+L'Ecuyer, as Chapter 4 of the book: Handbook on Simulation, Jerry Banks,
+ed. (Wiley, 1997). The chapter is available in postscript from
+L'Ecuyer's ftp site (see references). Knuth's volume on Seminumerical
+Algorithms (originally published in 1968) devotes 170 pages to random
+number generators, and has recently been updated in its 3rd edition
+(1997).
+@comment is only now starting to show its age.
+@comment Nonetheless,
+It is brilliant, a classic. If you don't own it, you should stop reading
+right now, run to the nearest bookstore, and buy it.
+
+A good random number generator will satisfy both theoretical and
+statistical properties. Theoretical properties are often hard to obtain
+(they require real math!), but one prefers a random number generator
+with a long period, low serial correlation, and a tendency @emph{not} to
+``fall mainly on the planes.'' Statistical tests are performed with
+numerical simulations. Generally, a random number generator is used to
+estimate some quantity for which the theory of probability provides an
+exact answer. Comparison to this exact answer provides a measure of
+``randomness''.
+
+@node The Random Number Generator Interface
+@section The Random Number Generator Interface
+
+It is important to remember that a random number generator is not a
+``real'' function like sine or cosine. Unlike real functions, successive
+calls to a random number generator yield different return values. Of
+course that is just what you want for a random number generator, but to
+achieve this effect, the generator must keep track of some kind of
+``state'' variable. Sometimes this state is just an integer (sometimes
+just the value of the previously generated random number), but often it
+is more complicated than that and may involve a whole array of numbers,
+possibly with some indices thrown in. To use the random number
+generators, you do not need to know the details of what comprises the
+state, and besides that varies from algorithm to algorithm.
+
+The random number generator library uses two special structs,
+@code{gsl_rng_type} which holds static information about each type of
+generator and @code{gsl_rng} which describes an instance of a generator
+created from a given @code{gsl_rng_type}.
+
+The functions described in this section are declared in the header file
+@file{gsl_rng.h}.
+
+@node Random number generator initialization
+@section Random number generator initialization
+
+@deftypefun {gsl_rng *} gsl_rng_alloc (const gsl_rng_type * @var{T})
+This function returns a pointer to a newly-created
+instance of a random number generator of type @var{T}.
+For example, the following code creates an instance of the Tausworthe
+generator,
+
+@example
+gsl_rng * r = gsl_rng_alloc (gsl_rng_taus);
+@end example
+
+If there is insufficient memory to create the generator then the
+function returns a null pointer and the error handler is invoked with an
+error code of @code{GSL_ENOMEM}.
+
+The generator is automatically initialized with the default seed,
+@code{gsl_rng_default_seed}. This is zero by default but can be changed
+either directly or by using the environment variable @code{GSL_RNG_SEED}
+(@pxref{Random number environment variables}).
+
+The details of the available generator types are
+described later in this chapter.
+@end deftypefun
+
+@deftypefun void gsl_rng_set (const gsl_rng * @var{r}, unsigned long int @var{s})
+This function initializes (or `seeds') the random number generator. If
+the generator is seeded with the same value of @var{s} on two different
+runs, the same stream of random numbers will be generated by successive
+calls to the routines below. If different values of @var{s} are
+supplied, then the generated streams of random numbers should be
+completely different. If the seed @var{s} is zero then the standard seed
+from the original implementation is used instead. For example, the
+original Fortran source code for the @code{ranlux} generator used a seed
+of 314159265, and so choosing @var{s} equal to zero reproduces this when
+using @code{gsl_rng_ranlux}.
+@end deftypefun
+
+@deftypefun void gsl_rng_free (gsl_rng * @var{r})
+This function frees all the memory associated with the generator
+@var{r}.
+@end deftypefun
+
+@node Sampling from a random number generator
+@section Sampling from a random number generator
+
+The following functions return uniformly distributed random numbers,
+either as integers or double precision floating point numbers. To obtain
+non-uniform distributions @pxref{Random Number Distributions}.
+
+@deftypefun {unsigned long int} gsl_rng_get (const gsl_rng * @var{r})
+This function returns a random integer from the generator @var{r}. The
+minimum and maximum values depend on the algorithm used, but all
+integers in the range [@var{min},@var{max}] are equally likely. The
+values of @var{min} and @var{max} can determined using the auxiliary
+functions @code{gsl_rng_max (r)} and @code{gsl_rng_min (r)}.
+@end deftypefun
+
+@deftypefun double gsl_rng_uniform (const gsl_rng * @var{r})
+This function returns a double precision floating point number uniformly
+distributed in the range [0,1). The range includes 0.0 but excludes 1.0.
+The value is typically obtained by dividing the result of
+@code{gsl_rng_get(r)} by @code{gsl_rng_max(r) + 1.0} in double
+precision. Some generators compute this ratio internally so that they
+can provide floating point numbers with more than 32 bits of randomness
+(the maximum number of bits that can be portably represented in a single
+@code{unsigned long int}).
+@end deftypefun
+
+@deftypefun double gsl_rng_uniform_pos (const gsl_rng * @var{r})
+This function returns a positive double precision floating point number
+uniformly distributed in the range (0,1), excluding both 0.0 and 1.0.
+The number is obtained by sampling the generator with the algorithm of
+@code{gsl_rng_uniform} until a non-zero value is obtained. You can use
+this function if you need to avoid a singularity at 0.0.
+@end deftypefun
+
+@deftypefun {unsigned long int} gsl_rng_uniform_int (const gsl_rng * @var{r}, unsigned long int @var{n})
+This function returns a random integer from 0 to @math{n-1} inclusive
+by scaling down and/or discarding samples from the generator @var{r}.
+All integers in the range @math{[0,n-1]} are produced with equal
+probability. For generators with a non-zero minimum value an offset
+is applied so that zero is returned with the correct probability.
+
+Note that this function is designed for sampling from ranges smaller
+than the range of the underlying generator. The parameter @var{n}
+must be less than or equal to the range of the generator @var{r}.
+If @var{n} is larger than the range of the generator then the function
+calls the error handler with an error code of @code{GSL_EINVAL} and
+returns zero.
+
+In particular, this function is not intended for generating the full range of
+unsigned integer values @c{$[0,2^{32}-1]$}
+@math{[0,2^32-1]}. Instead
+choose a generator with the maximal integer range and zero mimimum
+value, such as @code{gsl_rng_ranlxd1}, @code{gsl_rng_mt19937} or
+@code{gsl_rng_taus}, and sample it directly using
+@code{gsl_rng_get}. The range of each generator can be found using
+the auxiliary functions described in the next section.
+@end deftypefun
+
+@node Auxiliary random number generator functions
+@section Auxiliary random number generator functions
+The following functions provide information about an existing
+generator. You should use them in preference to hard-coding the generator
+parameters into your own code.
+
+@deftypefun {const char *} gsl_rng_name (const gsl_rng * @var{r})
+This function returns a pointer to the name of the generator.
+For example,
+
+@example
+printf ("r is a '%s' generator\n",
+ gsl_rng_name (r));
+@end example
+
+@noindent
+would print something like @code{r is a 'taus' generator}.
+@end deftypefun
+
+@deftypefun {unsigned long int} gsl_rng_max (const gsl_rng * @var{r})
+@code{gsl_rng_max} returns the largest value that @code{gsl_rng_get}
+can return.
+@end deftypefun
+
+@deftypefun {unsigned long int} gsl_rng_min (const gsl_rng * @var{r})
+@code{gsl_rng_min} returns the smallest value that @code{gsl_rng_get}
+can return. Usually this value is zero. There are some generators with
+algorithms that cannot return zero, and for these generators the minimum
+value is 1.
+@end deftypefun
+
+@deftypefun {void *} gsl_rng_state (const gsl_rng * @var{r})
+@deftypefunx size_t gsl_rng_size (const gsl_rng * @var{r})
+These functions return a pointer to the state of generator @var{r} and
+its size. You can use this information to access the state directly. For
+example, the following code will write the state of a generator to a
+stream,
+
+@example
+void * state = gsl_rng_state (r);
+size_t n = gsl_rng_size (r);
+fwrite (state, n, 1, stream);
+@end example
+@end deftypefun
+
+@deftypefun {const gsl_rng_type **} gsl_rng_types_setup (void)
+This function returns a pointer to an array of all the available
+generator types, terminated by a null pointer. The function should be
+called once at the start of the program, if needed. The following code
+fragment shows how to iterate over the array of generator types to print
+the names of the available algorithms,
+
+@example
+const gsl_rng_type **t, **t0;
+
+t0 = gsl_rng_types_setup ();
+
+printf ("Available generators:\n");
+
+for (t = t0; *t != 0; t++)
+ @{
+ printf ("%s\n", (*t)->name);
+ @}
+@end example
+@end deftypefun
+
+@node Random number environment variables
+@section Random number environment variables
+
+The library allows you to choose a default generator and seed from the
+environment variables @code{GSL_RNG_TYPE} and @code{GSL_RNG_SEED} and
+the function @code{gsl_rng_env_setup}. This makes it easy try out
+different generators and seeds without having to recompile your program.
+
+@deftypefun {const gsl_rng_type *} gsl_rng_env_setup (void)
+This function reads the environment variables @code{GSL_RNG_TYPE} and
+@code{GSL_RNG_SEED} and uses their values to set the corresponding
+library variables @code{gsl_rng_default} and
+@code{gsl_rng_default_seed}. These global variables are defined as
+follows,
+
+@example
+extern const gsl_rng_type *gsl_rng_default
+extern unsigned long int gsl_rng_default_seed
+@end example
+
+The environment variable @code{GSL_RNG_TYPE} should be the name of a
+generator, such as @code{taus} or @code{mt19937}. The environment
+variable @code{GSL_RNG_SEED} should contain the desired seed value. It
+is converted to an @code{unsigned long int} using the C library function
+@code{strtoul}.
+
+If you don't specify a generator for @code{GSL_RNG_TYPE} then
+@code{gsl_rng_mt19937} is used as the default. The initial value of
+@code{gsl_rng_default_seed} is zero.
+
+@end deftypefun
+
+@noindent
+@need 2000
+Here is a short program which shows how to create a global
+generator using the environment variables @code{GSL_RNG_TYPE} and
+@code{GSL_RNG_SEED},
+
+@example
+@verbatiminclude examples/rng.c
+@end example
+
+@noindent
+Running the program without any environment variables uses the initial
+defaults, an @code{mt19937} generator with a seed of 0,
+
+@example
+$ ./a.out
+@verbatiminclude examples/rng.out
+@end example
+
+@noindent
+By setting the two variables on the command line we can
+change the default generator and the seed,
+
+@example
+$ GSL_RNG_TYPE="taus" GSL_RNG_SEED=123 ./a.out
+GSL_RNG_TYPE=taus
+GSL_RNG_SEED=123
+generator type: taus
+seed = 123
+first value = 2720986350
+@end example
+
+@node Copying random number generator state
+@section Copying random number generator state
+
+The above methods do not expose the random number `state' which changes
+from call to call. It is often useful to be able to save and restore
+the state. To permit these practices, a few somewhat more advanced
+functions are supplied. These include:
+
+@deftypefun int gsl_rng_memcpy (gsl_rng * @var{dest}, const gsl_rng * @var{src})
+This function copies the random number generator @var{src} into the
+pre-existing generator @var{dest}, making @var{dest} into an exact copy
+of @var{src}. The two generators must be of the same type.
+@end deftypefun
+
+@deftypefun {gsl_rng *} gsl_rng_clone (const gsl_rng * @var{r})
+This function returns a pointer to a newly created generator which is an
+exact copy of the generator @var{r}.
+@end deftypefun
+
+@node Reading and writing random number generator state
+@section Reading and writing random number generator state
+
+The library provides functions for reading and writing the random
+number state to a file as binary data or formatted text.
+
+@deftypefun int gsl_rng_fwrite (FILE * @var{stream}, const gsl_rng * @var{r})
+This function writes the random number state of the random number
+generator @var{r} to the stream @var{stream} in binary format. The
+return value is 0 for success and @code{GSL_EFAILED} if there was a
+problem writing to the file. Since the data is written in the native
+binary format it may not be portable between different architectures.
+@end deftypefun
+
+@deftypefun int gsl_rng_fread (FILE * @var{stream}, gsl_rng * @var{r})
+This function reads the random number state into the random number
+generator @var{r} from the open stream @var{stream} in binary format.
+The random number generator @var{r} must be preinitialized with the
+correct random number generator type since type information is not
+saved. The return value is 0 for success and @code{GSL_EFAILED} if
+there was a problem reading from the file. The data is assumed to
+have been written in the native binary format on the same
+architecture.
+@end deftypefun
+
+@node Random number generator algorithms
+@section Random number generator algorithms
+
+The functions described above make no reference to the actual algorithm
+used. This is deliberate so that you can switch algorithms without
+having to change any of your application source code. The library
+provides a large number of generators of different types, including
+simulation quality generators, generators provided for compatibility
+with other libraries and historical generators from the past.
+
+The following generators are recommended for use in simulation. They
+have extremely long periods, low correlation and pass most statistical
+tests. For the most reliable source of uncorrelated numbers, the
+second-generation @sc{ranlux} generators have the strongest proof of
+randomness.
+
+@deffn {Generator} gsl_rng_mt19937
+@cindex MT19937 random number generator
+The MT19937 generator of Makoto Matsumoto and Takuji Nishimura is a
+variant of the twisted generalized feedback shift-register algorithm,
+and is known as the ``Mersenne Twister'' generator. It has a Mersenne
+prime period of
+@comment
+@c{$2^{19937} - 1$}
+@math{2^19937 - 1} (about
+@c{$10^{6000}$}
+@math{10^6000}) and is
+equi-distributed in 623 dimensions. It has passed the @sc{diehard}
+statistical tests. It uses 624 words of state per generator and is
+comparable in speed to the other generators. The original generator used
+a default seed of 4357 and choosing @var{s} equal to zero in
+@code{gsl_rng_set} reproduces this. Later versions switched to 5489
+as the default seed, you can choose this explicitly via @code{gsl_rng_set}
+instead if you require it.
+
+For more information see,
+@itemize @asis
+@item
+Makoto Matsumoto and Takuji Nishimura, ``Mersenne Twister: A
+623-dimensionally equidistributed uniform pseudorandom number
+generator''. @cite{ACM Transactions on Modeling and Computer
+Simulation}, Vol.@: 8, No.@: 1 (Jan. 1998), Pages 3--30
+@end itemize
+
+@noindent
+The generator @code{gsl_rng_mt19937} uses the second revision of the
+seeding procedure published by the two authors above in 2002. The
+original seeding procedures could cause spurious artifacts for some seed
+values. They are still available through the alternative generators
+@code{gsl_rng_mt19937_1999} and @code{gsl_rng_mt19937_1998}.
+@end deffn
+
+@deffn {Generator} gsl_rng_ranlxs0
+@deffnx {Generator} gsl_rng_ranlxs1
+@deffnx {Generator} gsl_rng_ranlxs2
+@cindex RANLXS random number generator
+
+The generator @code{ranlxs0} is a second-generation version of the
+@sc{ranlux} algorithm of L@"uscher, which produces ``luxury random
+numbers''. This generator provides single precision output (24 bits) at
+three luxury levels @code{ranlxs0}, @code{ranlxs1} and @code{ranlxs2},
+in increasing order of strength.
+It uses double-precision floating point arithmetic internally and can be
+significantly faster than the integer version of @code{ranlux},
+particularly on 64-bit architectures. The period of the generator is
+about @c{$10^{171}$}
+@math{10^171}. The algorithm has mathematically proven properties and
+can provide truly decorrelated numbers at a known level of randomness.
+The higher luxury levels provide increased decorrelation between samples
+as an additional safety margin.
+@end deffn
+
+@deffn {Generator} gsl_rng_ranlxd1
+@deffnx {Generator} gsl_rng_ranlxd2
+@cindex RANLXD random number generator
+
+These generators produce double precision output (48 bits) from the
+@sc{ranlxs} generator. The library provides two luxury levels
+@code{ranlxd1} and @code{ranlxd2}, in increasing order of strength.
+@end deffn
+
+
+@deffn {Generator} gsl_rng_ranlux
+@deffnx {Generator} gsl_rng_ranlux389
+
+@cindex RANLUX random number generator
+The @code{ranlux} generator is an implementation of the original
+algorithm developed by L@"uscher. It uses a
+lagged-fibonacci-with-skipping algorithm to produce ``luxury random
+numbers''. It is a 24-bit generator, originally designed for
+single-precision IEEE floating point numbers. This implementation is
+based on integer arithmetic, while the second-generation versions
+@sc{ranlxs} and @sc{ranlxd} described above provide floating-point
+implementations which will be faster on many platforms.
+The period of the generator is about @c{$10^{171}$}
+@math{10^171}. The algorithm has mathematically proven properties and
+it can provide truly decorrelated numbers at a known level of
+randomness. The default level of decorrelation recommended by L@"uscher
+is provided by @code{gsl_rng_ranlux}, while @code{gsl_rng_ranlux389}
+gives the highest level of randomness, with all 24 bits decorrelated.
+Both types of generator use 24 words of state per generator.
+
+For more information see,
+@itemize @asis
+@item
+M. L@"uscher, ``A portable high-quality random number generator for
+lattice field theory calculations'', @cite{Computer Physics
+Communications}, 79 (1994) 100--110.
+@item
+F. James, ``RANLUX: A Fortran implementation of the high-quality
+pseudo-random number generator of L@"uscher'', @cite{Computer Physics
+Communications}, 79 (1994) 111--114
+@end itemize
+@end deffn
+
+
+@deffn {Generator} gsl_rng_cmrg
+@cindex CMRG, combined multiple recursive random number generator
+This is a combined multiple recursive generator by L'Ecuyer.
+Its sequence is,
+@tex
+\beforedisplay
+$$
+z_n = (x_n - y_n) \,\hbox{mod}\, m_1
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+z_n = (x_n - y_n) mod m_1
+@end example
+
+@end ifinfo
+@noindent
+where the two underlying generators @math{x_n} and @math{y_n} are,
+@tex
+\beforedisplay
+$$
+\eqalign{
+x_n & = (a_1 x_{n-1} + a_2 x_{n-2} + a_3 x_{n-3}) \,\hbox{mod}\, m_1 \cr
+y_n & = (b_1 y_{n-1} + b_2 y_{n-2} + b_3 y_{n-3}) \,\hbox{mod}\, m_2
+}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+x_n = (a_1 x_@{n-1@} + a_2 x_@{n-2@} + a_3 x_@{n-3@}) mod m_1
+y_n = (b_1 y_@{n-1@} + b_2 y_@{n-2@} + b_3 y_@{n-3@}) mod m_2
+@end example
+
+@end ifinfo
+@noindent
+with coefficients
+@math{a_1 = 0},
+@math{a_2 = 63308},
+@math{a_3 = -183326},
+@math{b_1 = 86098},
+@math{b_2 = 0},
+@math{b_3 = -539608},
+and moduli
+@c{$m_1 = 2^{31} - 1 = 2147483647$}
+@math{m_1 = 2^31 - 1 = 2147483647}
+and
+@c{$m_2 = 2145483479$}
+@math{m_2 = 2145483479}.
+
+The period of this generator is
+@c{$\hbox{lcm}(m_1^3-1, m_2^3-1)$}
+@math{lcm(m_1^3-1, m_2^3-1)},
+which is approximately
+@c{$2^{185}$}
+@math{2^185}
+(about
+@c{$10^{56}$}
+@math{10^56}). It uses
+6 words of state per generator. For more information see,
+
+@itemize @asis
+@item
+P. L'Ecuyer, ``Combined Multiple Recursive Random Number
+Generators'', @cite{Operations Research}, 44, 5 (1996), 816--822.
+@end itemize
+@end deffn
+
+@deffn {Generator} gsl_rng_mrg
+@cindex MRG, multiple recursive random number generator
+This is a fifth-order multiple recursive generator by L'Ecuyer, Blouin
+and Coutre. Its sequence is,
+@tex
+\beforedisplay
+$$
+x_n = (a_1 x_{n-1} + a_5 x_{n-5}) \,\hbox{mod}\, m
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+x_n = (a_1 x_@{n-1@} + a_5 x_@{n-5@}) mod m
+@end example
+
+@end ifinfo
+@noindent
+with
+@math{a_1 = 107374182},
+@math{a_2 = a_3 = a_4 = 0},
+@math{a_5 = 104480}
+and
+@c{$m = 2^{31}-1$}
+@math{m = 2^31 - 1}.
+
+The period of this generator is about
+@c{$10^{46}$}
+@math{10^46}. It uses 5 words
+of state per generator. More information can be found in the following
+paper,
+@itemize @asis
+@item
+P. L'Ecuyer, F. Blouin, and R. Coutre, ``A search for good multiple
+recursive random number generators'', @cite{ACM Transactions on Modeling and
+Computer Simulation} 3, 87--98 (1993).
+@end itemize
+@end deffn
+
+@deffn {Generator} gsl_rng_taus
+@deffnx {Generator} gsl_rng_taus2
+@cindex Tausworthe random number generator
+This is a maximally equidistributed combined Tausworthe generator by
+L'Ecuyer. The sequence is,
+@tex
+\beforedisplay
+$$
+x_n = (s^1_n \oplus s^2_n \oplus s^3_n)
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+x_n = (s1_n ^^ s2_n ^^ s3_n)
+@end example
+
+@end ifinfo
+@noindent
+where,
+@tex
+\beforedisplay
+$$
+\eqalign{
+s^1_{n+1} &= (((s^1_n \& 4294967294)\ll 12) \oplus (((s^1_n\ll 13) \oplus s^1_n)\gg 19)) \cr
+s^2_{n+1} &= (((s^2_n \& 4294967288)\ll 4) \oplus (((s^2_n\ll 2) \oplus s^2_n)\gg 25)) \cr
+s^3_{n+1} &= (((s^3_n \& 4294967280)\ll 17) \oplus (((s^3_n\ll 3) \oplus s^3_n)\gg 11))
+}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+s1_@{n+1@} = (((s1_n&4294967294)<<12)^^(((s1_n<<13)^^s1_n)>>19))
+s2_@{n+1@} = (((s2_n&4294967288)<< 4)^^(((s2_n<< 2)^^s2_n)>>25))
+s3_@{n+1@} = (((s3_n&4294967280)<<17)^^(((s3_n<< 3)^^s3_n)>>11))
+@end example
+
+@end ifinfo
+@noindent
+computed modulo
+@c{$2^{32}$}
+@math{2^32}. In the formulas above
+@c{$\oplus$}
+@math{^^}
+denotes ``exclusive-or''. Note that the algorithm relies on the properties
+of 32-bit unsigned integers and has been implemented using a bitmask
+of @code{0xFFFFFFFF} to make it work on 64 bit machines.
+
+The period of this generator is @c{$2^{88}$}
+@math{2^88} (about
+@c{$10^{26}$}
+@math{10^26}). It uses 3 words of state per generator. For more
+information see,
+
+@itemize @asis
+@item
+P. L'Ecuyer, ``Maximally Equidistributed Combined Tausworthe
+Generators'', @cite{Mathematics of Computation}, 65, 213 (1996), 203--213.
+@end itemize
+
+@noindent
+The generator @code{gsl_rng_taus2} uses the same algorithm as
+@code{gsl_rng_taus} but with an improved seeding procedure described in
+the paper,
+
+@itemize @asis
+@item
+P. L'Ecuyer, ``Tables of Maximally Equidistributed Combined LFSR
+Generators'', @cite{Mathematics of Computation}, 68, 225 (1999), 261--269
+@end itemize
+
+@noindent
+The generator @code{gsl_rng_taus2} should now be used in preference to
+@code{gsl_rng_taus}.
+@end deffn
+
+@deffn {Generator} gsl_rng_gfsr4
+@cindex Four-tap Generalized Feedback Shift Register
+The @code{gfsr4} generator is like a lagged-fibonacci generator, and
+produces each number as an @code{xor}'d sum of four previous values.
+@tex
+\beforedisplay
+$$
+r_n = r_{n-A} \oplus r_{n-B} \oplus r_{n-C} \oplus r_{n-D}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+r_n = r_@{n-A@} ^^ r_@{n-B@} ^^ r_@{n-C@} ^^ r_@{n-D@}
+@end example
+@end ifinfo
+
+Ziff (ref below) notes that ``it is now widely known'' that two-tap
+registers (such as R250, which is described below)
+have serious flaws, the most obvious one being the three-point
+correlation that comes from the definition of the generator. Nice
+mathematical properties can be derived for GFSR's, and numerics bears
+out the claim that 4-tap GFSR's with appropriately chosen offsets are as
+random as can be measured, using the author's test.
+
+This implementation uses the values suggested the example on p392 of
+Ziff's article: @math{A=471}, @math{B=1586}, @math{C=6988}, @math{D=9689}.
+
+
+If the offsets are appropriately chosen (such as the one ones in this
+implementation), then the sequence is said to be maximal; that means
+that the period is @math{2^D - 1}, where @math{D} is the longest lag.
+(It is one less than @math{2^D} because it is not permitted to have all
+zeros in the @code{ra[]} array.) For this implementation with
+@math{D=9689} that works out to about @c{$10^{2917}$}
+@math{10^2917}.
+
+Note that the implementation of this generator using a 32-bit
+integer amounts to 32 parallel implementations of one-bit
+generators. One consequence of this is that the period of this
+32-bit generator is the same as for the one-bit generator.
+Moreover, this independence means that all 32-bit patterns are
+equally likely, and in particular that 0 is an allowed random
+value. (We are grateful to Heiko Bauke for clarifying for us these
+properties of GFSR random number generators.)
+
+For more information see,
+@itemize @asis
+@item
+Robert M. Ziff, ``Four-tap shift-register-sequence random-number
+generators'', @cite{Computers in Physics}, 12(4), Jul/Aug
+1998, pp 385--392.
+@end itemize
+@end deffn
+
+@node Unix random number generators
+@section Unix random number generators
+
+The standard Unix random number generators @code{rand}, @code{random}
+and @code{rand48} are provided as part of GSL. Although these
+generators are widely available individually often they aren't all
+available on the same platform. This makes it difficult to write
+portable code using them and so we have included the complete set of
+Unix generators in GSL for convenience. Note that these generators
+don't produce high-quality randomness and aren't suitable for work
+requiring accurate statistics. However, if you won't be measuring
+statistical quantities and just want to introduce some variation into
+your program then these generators are quite acceptable.
+
+@cindex rand, BSD random number generator
+@cindex Unix random number generators, rand
+@cindex Unix random number generators, rand48
+
+@deffn {Generator} gsl_rng_rand
+@cindex BSD random number generator
+This is the BSD @code{rand} generator. Its sequence is
+@tex
+\beforedisplay
+$$
+x_{n+1} = (a x_n + c) \,\hbox{mod}\, m
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+x_@{n+1@} = (a x_n + c) mod m
+@end example
+
+@end ifinfo
+@noindent
+with
+@math{a = 1103515245},
+@math{c = 12345} and
+@c{$m = 2^{31}$}
+@math{m = 2^31}.
+The seed specifies the initial value,
+@math{x_1}. The period of this
+generator is
+@c{$2^{31}$}
+@math{2^31}, and it uses 1 word of storage per
+generator.
+@end deffn
+
+@deffn {Generator} gsl_rng_random_bsd
+@deffnx {Generator} gsl_rng_random_libc5
+@deffnx {Generator} gsl_rng_random_glibc2
+These generators implement the @code{random} family of functions, a
+set of linear feedback shift register generators originally used in BSD
+Unix. There are several versions of @code{random} in use today: the
+original BSD version (e.g. on SunOS4), a libc5 version (found on
+older GNU/Linux systems) and a glibc2 version. Each version uses a
+different seeding procedure, and thus produces different sequences.
+
+The original BSD routines accepted a variable length buffer for the
+generator state, with longer buffers providing higher-quality
+randomness. The @code{random} function implemented algorithms for
+buffer lengths of 8, 32, 64, 128 and 256 bytes, and the algorithm with
+the largest length that would fit into the user-supplied buffer was
+used. To support these algorithms additional generators are available
+with the following names,
+
+@example
+gsl_rng_random8_bsd
+gsl_rng_random32_bsd
+gsl_rng_random64_bsd
+gsl_rng_random128_bsd
+gsl_rng_random256_bsd
+@end example
+
+@noindent
+where the numeric suffix indicates the buffer length. The original BSD
+@code{random} function used a 128-byte default buffer and so
+@code{gsl_rng_random_bsd} has been made equivalent to
+@code{gsl_rng_random128_bsd}. Corresponding versions of the @code{libc5}
+and @code{glibc2} generators are also available, with the names
+@code{gsl_rng_random8_libc5}, @code{gsl_rng_random8_glibc2}, etc.
+@end deffn
+
+@deffn {Generator} gsl_rng_rand48
+@cindex rand48 random number generator
+This is the Unix @code{rand48} generator. Its sequence is
+@tex
+\beforedisplay
+$$
+x_{n+1} = (a x_n + c) \,\hbox{mod}\, m
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+x_@{n+1@} = (a x_n + c) mod m
+@end example
+
+@end ifinfo
+@noindent
+defined on 48-bit unsigned integers with
+@math{a = 25214903917},
+@math{c = 11} and
+@c{$m = 2^{48}$}
+@math{m = 2^48}.
+The seed specifies the upper 32 bits of the initial value, @math{x_1},
+with the lower 16 bits set to @code{0x330E}. The function
+@code{gsl_rng_get} returns the upper 32 bits from each term of the
+sequence. This does not have a direct parallel in the original
+@code{rand48} functions, but forcing the result to type @code{long int}
+reproduces the output of @code{mrand48}. The function
+@code{gsl_rng_uniform} uses the full 48 bits of internal state to return
+the double precision number @math{x_n/m}, which is equivalent to the
+function @code{drand48}. Note that some versions of the GNU C Library
+contained a bug in @code{mrand48} function which caused it to produce
+different results (only the lower 16-bits of the return value were set).
+@end deffn
+
+@node Other random number generators
+@section Other random number generators
+
+The generators in this section are provided for compatibility with
+existing libraries. If you are converting an existing program to use GSL
+then you can select these generators to check your new implementation
+against the original one, using the same random number generator. After
+verifying that your new program reproduces the original results you can
+then switch to a higher-quality generator.
+
+Note that most of the generators in this section are based on single
+linear congruence relations, which are the least sophisticated type of
+generator. In particular, linear congruences have poor properties when
+used with a non-prime modulus, as several of these routines do (e.g.
+with a power of two modulus,
+@c{$2^{31}$}
+@math{2^31} or
+@c{$2^{32}$}
+@math{2^32}). This
+leads to periodicity in the least significant bits of each number,
+with only the higher bits having any randomness. Thus if you want to
+produce a random bitstream it is best to avoid using the least
+significant bits.
+
+@deffn {Generator} gsl_rng_ranf
+@cindex RANF random number generator
+@cindex CRAY random number generator, RANF
+This is the CRAY random number generator @code{RANF}. Its sequence is
+@tex
+\beforedisplay
+$$
+x_{n+1} = (a x_n) \,\hbox{mod}\, m
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+x_@{n+1@} = (a x_n) mod m
+@end example
+
+@end ifinfo
+@noindent
+defined on 48-bit unsigned integers with @math{a = 44485709377909} and
+@c{$m = 2^{48}$}
+@math{m = 2^48}. The seed specifies the lower
+32 bits of the initial value,
+@math{x_1}, with the lowest bit set to
+prevent the seed taking an even value. The upper 16 bits of
+@math{x_1}
+are set to 0. A consequence of this procedure is that the pairs of seeds
+2 and 3, 4 and 5, etc produce the same sequences.
+
+The generator compatible with the CRAY MATHLIB routine RANF. It
+produces double precision floating point numbers which should be
+identical to those from the original RANF.
+
+There is a subtlety in the implementation of the seeding. The initial
+state is reversed through one step, by multiplying by the modular
+inverse of @math{a} mod @math{m}. This is done for compatibility with
+the original CRAY implementation.
+
+Note that you can only seed the generator with integers up to
+@c{$2^{32}$}
+@math{2^32}, while the original CRAY implementation uses
+non-portable wide integers which can cover all
+@c{$2^{48}$}
+@math{2^48} states of the generator.
+
+The function @code{gsl_rng_get} returns the upper 32 bits from each term
+of the sequence. The function @code{gsl_rng_uniform} uses the full 48
+bits to return the double precision number @math{x_n/m}.
+
+The period of this generator is @c{$2^{46}$}
+@math{2^46}.
+@end deffn
+
+@deffn {Generator} gsl_rng_ranmar
+@cindex RANMAR random number generator
+This is the RANMAR lagged-fibonacci generator of Marsaglia, Zaman and
+Tsang. It is a 24-bit generator, originally designed for
+single-precision IEEE floating point numbers. It was included in the
+CERNLIB high-energy physics library.
+@end deffn
+
+@deffn {Generator} gsl_rng_r250
+@cindex shift-register random number generator
+@cindex R250 shift-register random number generator
+This is the shift-register generator of Kirkpatrick and Stoll. The
+sequence is based on the recurrence
+@tex
+\beforedisplay
+$$
+x_n = x_{n-103} \oplus x_{n-250}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+x_n = x_@{n-103@} ^^ x_@{n-250@}
+@end example
+
+@end ifinfo
+@noindent
+where
+@c{$\oplus$}
+@math{^^} denotes ``exclusive-or'', defined on
+32-bit words. The period of this generator is about @c{$2^{250}$}
+@math{2^250} and it
+uses 250 words of state per generator.
+
+For more information see,
+@itemize @asis
+@item
+S. Kirkpatrick and E. Stoll, ``A very fast shift-register sequence random
+number generator'', @cite{Journal of Computational Physics}, 40, 517--526
+(1981)
+@end itemize
+@end deffn
+
+@deffn {Generator} gsl_rng_tt800
+@cindex TT800 random number generator
+This is an earlier version of the twisted generalized feedback
+shift-register generator, and has been superseded by the development of
+MT19937. However, it is still an acceptable generator in its own
+right. It has a period of
+@c{$2^{800}$}
+@math{2^800} and uses 33 words of storage
+per generator.
+
+For more information see,
+@itemize @asis
+@item
+Makoto Matsumoto and Yoshiharu Kurita, ``Twisted GFSR Generators
+II'', @cite{ACM Transactions on Modelling and Computer Simulation},
+Vol.@: 4, No.@: 3, 1994, pages 254--266.
+@end itemize
+@end deffn
+
+@comment The following generators are included only for historical reasons, so
+@comment that you can reproduce results from old programs which might have used
+@comment them. These generators should not be used for real simulations since
+@comment they have poor statistical properties by modern standards.
+
+@deffn {Generator} gsl_rng_vax
+@cindex VAX random number generator
+This is the VAX generator @code{MTH$RANDOM}. Its sequence is,
+@tex
+\beforedisplay
+$$
+x_{n+1} = (a x_n + c) \,\hbox{mod}\, m
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+x_@{n+1@} = (a x_n + c) mod m
+@end example
+
+@end ifinfo
+@noindent
+with
+@math{a = 69069}, @math{c = 1} and
+@c{$m = 2^{32}$}
+@math{m = 2^32}. The seed specifies the initial value,
+@math{x_1}. The
+period of this generator is
+@c{$2^{32}$}
+@math{2^32} and it uses 1 word of storage per
+generator.
+@end deffn
+
+@deffn {Generator} gsl_rng_transputer
+This is the random number generator from the INMOS Transputer
+Development system. Its sequence is,
+@tex
+\beforedisplay
+$$
+x_{n+1} = (a x_n) \,\hbox{mod}\, m
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+x_@{n+1@} = (a x_n) mod m
+@end example
+
+@end ifinfo
+@noindent
+with @math{a = 1664525} and
+@c{$m = 2^{32}$}
+@math{m = 2^32}.
+The seed specifies the initial value,
+@c{$x_1$}
+@math{x_1}.
+@end deffn
+
+@deffn {Generator} gsl_rng_randu
+@cindex RANDU random number generator
+This is the IBM @code{RANDU} generator. Its sequence is
+@tex
+\beforedisplay
+$$
+x_{n+1} = (a x_n) \,\hbox{mod}\, m
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+x_@{n+1@} = (a x_n) mod m
+@end example
+
+@end ifinfo
+@noindent
+with @math{a = 65539} and
+@c{$m = 2^{31}$}
+@math{m = 2^31}. The
+seed specifies the initial value,
+@math{x_1}. The period of this
+generator was only
+@c{$2^{29}$}
+@math{2^29}. It has become a textbook example of a
+poor generator.
+@end deffn
+
+@deffn {Generator} gsl_rng_minstd
+@cindex RANMAR random number generator
+This is Park and Miller's ``minimal standard'' @sc{minstd} generator, a
+simple linear congruence which takes care to avoid the major pitfalls of
+such algorithms. Its sequence is,
+@tex
+\beforedisplay
+$$
+x_{n+1} = (a x_n) \,\hbox{mod}\, m
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+x_@{n+1@} = (a x_n) mod m
+@end example
+
+@end ifinfo
+@noindent
+with @math{a = 16807} and
+@c{$m = 2^{31} - 1 = 2147483647$}
+@math{m = 2^31 - 1 = 2147483647}.
+The seed specifies the initial value,
+@c{$x_1$}
+@math{x_1}. The period of this
+generator is about
+@c{$2^{31}$}
+@math{2^31}.
+
+This generator is used in the IMSL Library (subroutine RNUN) and in
+MATLAB (the RAND function). It is also sometimes known by the acronym
+``GGL'' (I'm not sure what that stands for).
+
+For more information see,
+@itemize @asis
+@item
+Park and Miller, ``Random Number Generators: Good ones are hard to find'',
+@cite{Communications of the ACM}, October 1988, Volume 31, No 10, pages
+1192--1201.
+@end itemize
+@end deffn
+
+@deffn {Generator} gsl_rng_uni
+@deffnx {Generator} gsl_rng_uni32
+This is a reimplementation of the 16-bit SLATEC random number generator
+RUNIF. A generalization of the generator to 32 bits is provided by
+@code{gsl_rng_uni32}. The original source code is available from NETLIB.
+@end deffn
+
+@deffn {Generator} gsl_rng_slatec
+This is the SLATEC random number generator RAND. It is ancient. The
+original source code is available from NETLIB.
+@end deffn
+
+
+@deffn {Generator} gsl_rng_zuf
+This is the ZUFALL lagged Fibonacci series generator of Peterson. Its
+sequence is,
+@tex
+\beforedisplay
+$$
+\eqalign{
+t &= u_{n-273} + u_{n-607} \cr
+u_n &= t - \hbox{floor}(t)
+}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+t = u_@{n-273@} + u_@{n-607@}
+u_n = t - floor(t)
+@end example
+@end ifinfo
+
+The original source code is available from NETLIB. For more information
+see,
+@itemize @asis
+@item
+W. Petersen, ``Lagged Fibonacci Random Number Generators for the NEC
+SX-3'', @cite{International Journal of High Speed Computing} (1994).
+@end itemize
+@end deffn
+
+@deffn {Generator} gsl_rng_knuthran2
+This is a second-order multiple recursive generator described by Knuth
+in @cite{Seminumerical Algorithms}, 3rd Ed., page 108. Its sequence is,
+@tex
+\beforedisplay
+$$
+x_n = (a_1 x_{n-1} + a_2 x_{n-2}) \,\hbox{mod}\, m
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+x_n = (a_1 x_@{n-1@} + a_2 x_@{n-2@}) mod m
+@end example
+
+@end ifinfo
+@noindent
+with
+@math{a_1 = 271828183},
+@math{a_2 = 314159269},
+and
+@c{$m = 2^{31}-1$}
+@math{m = 2^31 - 1}.
+@end deffn
+
+@deffn {Generator} gsl_rng_knuthran2002
+@deffnx {Generator} gsl_rng_knuthran
+This is a second-order multiple recursive generator described by Knuth
+in @cite{Seminumerical Algorithms}, 3rd Ed., Section 3.6. Knuth
+provides its C code. The updated routine @code{gsl_rng_knuthran2002}
+is from the revised 9th printing and corrects some weaknesses in the
+earlier version, which is implemented as @code{gsl_rng_knuthran}.
+@end deffn
+
+@deffn {Generator} gsl_rng_borosh13
+@deffnx {Generator} gsl_rng_fishman18
+@deffnx {Generator} gsl_rng_fishman20
+@deffnx {Generator} gsl_rng_lecuyer21
+@deffnx {Generator} gsl_rng_waterman14
+These multiplicative generators are taken from Knuth's
+@cite{Seminumerical Algorithms}, 3rd Ed., pages 106--108. Their sequence
+is,
+@tex
+\beforedisplay
+$$
+x_{n+1} = (a x_n) \,\hbox{mod}\, m
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+x_@{n+1@} = (a x_n) mod m
+@end example
+
+@end ifinfo
+@noindent
+where the seed specifies the initial value, @c{$x_1$}
+@math{x_1}.
+The parameters @math{a} and @math{m} are as follows,
+Borosh-Niederreiter:
+@math{a = 1812433253}, @c{$m = 2^{32}$}
+@math{m = 2^32},
+Fishman18:
+@math{a = 62089911},
+@c{$m = 2^{31}-1$}
+@math{m = 2^31 - 1},
+Fishman20:
+@math{a = 48271},
+@c{$m = 2^{31}-1$}
+@math{m = 2^31 - 1},
+L'Ecuyer:
+@math{a = 40692},
+@c{$m = 2^{31}-249$}
+@math{m = 2^31 - 249},
+Waterman:
+@math{a = 1566083941},
+@c{$m = 2^{32}$}
+@math{m = 2^32}.
+@end deffn
+
+@deffn {Generator} gsl_rng_fishman2x
+This is the L'Ecuyer--Fishman random number generator. It is taken from
+Knuth's @cite{Seminumerical Algorithms}, 3rd Ed., page 108. Its sequence
+is,
+@tex
+\beforedisplay
+$$
+z_{n+1} = (x_n - y_n) \,\hbox{mod}\, m
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+z_@{n+1@} = (x_n - y_n) mod m
+@end example
+
+@end ifinfo
+@noindent
+with @c{$m = 2^{31}-1$}
+@math{m = 2^31 - 1}.
+@math{x_n} and @math{y_n} are given by the @code{fishman20}
+and @code{lecuyer21} algorithms.
+The seed specifies the initial value,
+@c{$x_1$}
+@math{x_1}.
+
+@end deffn
+
+
+@deffn {Generator} gsl_rng_coveyou
+This is the Coveyou random number generator. It is taken from Knuth's
+@cite{Seminumerical Algorithms}, 3rd Ed., Section 3.2.2. Its sequence
+is,
+@tex
+\beforedisplay
+$$
+x_{n+1} = (x_n (x_n + 1)) \,\hbox{mod}\, m
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+x_@{n+1@} = (x_n (x_n + 1)) mod m
+@end example
+
+@end ifinfo
+@noindent
+with @c{$m = 2^{32}$}
+@math{m = 2^32}.
+The seed specifies the initial value,
+@c{$x_1$}
+@math{x_1}.
+@end deffn
+
+
+
+
+
+@node Random Number Generator Performance
+@section Performance
+
+@comment
+@comment I made the original plot like this
+@comment ./benchmark > tmp; cat tmp | perl -n -e '($n,$s) = split(" ",$_); printf("%17s ",$n); print "-" x ($s/1e5), "\n";'
+@comment
+
+The following table shows the relative performance of a selection the
+available random number generators. The fastest simulation quality
+generators are @code{taus}, @code{gfsr4} and @code{mt19937}. The
+generators which offer the best mathematically-proven quality are those
+based on the @sc{ranlux} algorithm.
+
+@comment The large number of generators based on single linear congruences are
+@comment represented by the @code{random} generator below. These generators are
+@comment fast but have the lowest statistical quality.
+
+@example
+1754 k ints/sec, 870 k doubles/sec, taus
+1613 k ints/sec, 855 k doubles/sec, gfsr4
+1370 k ints/sec, 769 k doubles/sec, mt19937
+ 565 k ints/sec, 571 k doubles/sec, ranlxs0
+ 400 k ints/sec, 405 k doubles/sec, ranlxs1
+ 490 k ints/sec, 389 k doubles/sec, mrg
+ 407 k ints/sec, 297 k doubles/sec, ranlux
+ 243 k ints/sec, 254 k doubles/sec, ranlxd1
+ 251 k ints/sec, 253 k doubles/sec, ranlxs2
+ 238 k ints/sec, 215 k doubles/sec, cmrg
+ 247 k ints/sec, 198 k doubles/sec, ranlux389
+ 141 k ints/sec, 140 k doubles/sec, ranlxd2
+
+1852 k ints/sec, 935 k doubles/sec, ran3
+ 813 k ints/sec, 575 k doubles/sec, ran0
+ 787 k ints/sec, 476 k doubles/sec, ran1
+ 379 k ints/sec, 292 k doubles/sec, ran2
+@end example
+
+@node Random Number Generator Examples
+@section Examples
+
+The following program demonstrates the use of a random number generator
+to produce uniform random numbers in the range [0.0, 1.0),
+
+@example
+@verbatiminclude examples/rngunif.c
+@end example
+
+@noindent
+Here is the output of the program,
+
+@example
+$ ./a.out
+@verbatiminclude examples/rngunif.out
+@end example
+
+@noindent
+The numbers depend on the seed used by the generator. The default seed
+can be changed with the @code{GSL_RNG_SEED} environment variable to
+produce a different stream of numbers. The generator itself can be
+changed using the environment variable @code{GSL_RNG_TYPE}. Here is the
+output of the program using a seed value of 123 and the
+multiple-recursive generator @code{mrg},
+
+@example
+$ GSL_RNG_SEED=123 GSL_RNG_TYPE=mrg ./a.out
+@verbatiminclude examples/rngunif.2.out
+@end example
+
+@node Random Number References and Further Reading
+@section References and Further Reading
+
+The subject of random number generation and testing is reviewed
+extensively in Knuth's @cite{Seminumerical Algorithms}.
+
+@itemize @asis
+@item
+Donald E. Knuth, @cite{The Art of Computer Programming: Seminumerical
+Algorithms} (Vol 2, 3rd Ed, 1997), Addison-Wesley, ISBN 0201896842.
+@end itemize
+
+@noindent
+Further information is available in the review paper written by Pierre
+L'Ecuyer,
+
+@itemize @asis
+P. L'Ecuyer, ``Random Number Generation'', Chapter 4 of the
+Handbook on Simulation, Jerry Banks Ed., Wiley, 1998, 93--137.
+
+@uref{http://www.iro.umontreal.ca/~lecuyer/papers.html}
+in the file @file{handsim.ps}.
+@end itemize
+
+@noindent
+The source code for the @sc{diehard} random number generator tests is also
+available online,
+
+@itemize @asis
+@item
+@cite{DIEHARD source code} G. Marsaglia,
+@item
+@uref{http://stat.fsu.edu/pub/diehard/}
+@end itemize
+
+@noindent
+A comprehensive set of random number generator tests is available from
+@sc{nist},
+
+@itemize @asis
+@item
+NIST Special Publication 800-22, ``A Statistical Test Suite for the
+Validation of Random Number Generators and Pseudo Random Number
+Generators for Cryptographic Applications''.
+@item
+@uref{http://csrc.nist.gov/rng/}
+@end itemize
+
+@node Random Number Acknowledgements
+@section Acknowledgements
+
+Thanks to Makoto Matsumoto, Takuji Nishimura and Yoshiharu Kurita for
+making the source code to their generators (MT19937, MM&TN; TT800,
+MM&YK) available under the GNU General Public License. Thanks to Martin
+L@"uscher for providing notes and source code for the @sc{ranlxs} and
+@sc{ranlxd} generators.
+
+@comment lcg
+@comment [ LCG(n) := n * 69069 mod (2^32) ]
+@comment First 6: [69069, 475559465, 2801775573, 1790562961, 3104832285, 4238970681]
+@comment %2^31-1 69069, 475559465, 654291926, 1790562961, 957348638, 2091487034
+@comment mrg
+@comment [q([x1, x2, x3, x4, x5]) := [107374182 mod 2147483647 * x1 + 104480 mod 2147483647 * x5, x1, x2, x3, x4]]
+@comment
+@comment cmrg
+@comment [q1([x1,x2,x3]) := [63308 mod 2147483647 * x2 -183326 mod 2147483647 * x3, x1, x2],
+@comment q2([x1,x2,x3]) := [86098 mod 2145483479 * x1 -539608 mod 2145483479 * x3, x1, x2] ]
+@comment initial for q1 is [69069, 475559465, 654291926]
+@comment initial for q2 is [1790562961, 959348806, 2093487202]
+
+@comment tausworthe
+@comment [ b1(x) := rsh(xor(lsh(x, 13), x), 19),
+@comment q1(x) := xor(lsh(and(x, 4294967294), 12), b1(x)),
+@comment b2(x) := rsh(xor(lsh(x, 2), x), 25),
+@comment q2(x) := xor(lsh(and(x, 4294967288), 4), b2(x)),
+@comment b3(x) := rsh(xor(lsh(x, 3), x), 11),
+@comment q3(x) := xor(lsh(and(x, 4294967280), 17), b3(x)) ]
+@comment [s1, s2, s3] = [600098857, 1131373026, 1223067536]
+@comment [2948905028, 441213979, 394017882]
diff --git a/gsl-1.9/doc/roots-bisection.eps b/gsl-1.9/doc/roots-bisection.eps
new file mode 100644
index 0000000..9f8cc7b
--- /dev/null
+++ b/gsl-1.9/doc/roots-bisection.eps
@@ -0,0 +1,1784 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: Mathematica-PSRender
+%%BoundingBox: 0 82 432 350
+%%Pages: (atend)
+%%EndComments
+%%BeginProlog
+/setrgbcolor dup where
+{ pop pop }
+{ { .114 mul exch .587 mul add exch .299 mul add setgray } bind def }
+ifelse
+/C /curveto load def
+/f /fill load def
+/F { closepath fill } bind def
+/L /lineto load def
+/S /stroke load def
+/s { closepath stroke } bind def
+/d /setdash load def
+/g /setgray load def
+/m /moveto load def
+/r /setrgbcolor load def
+/w /setlinewidth load def
+/b { gsave gsave F grestore 0 g S grestore newpath } bind def
+/dot { newpath 0 360 arc fill } bind def
+%%EndProlog
+%%Page: 1 1
+gsave
+0 82.5055 m
+432. 82.5055 L
+432. 349.495 L
+0 349.495 L
+0 82.5055 L
+closepath clip newpath
+0 g
+0.25 w
+[ ] 0 d
+51.0828 105.864 m
+51.0828 106.865 L
+S
+48.0828 92.8629 m
+/F0 /Times-Roman findfont def
+F0 10. scalefont setfont
+(1) show
+87.3821 105.864 m
+87.3821 106.865 L
+S
+84.3821 92.8629 m
+(2) show
+123.683 105.864 m
+123.683 106.865 L
+S
+120.683 92.8629 m
+(3) show
+159.984 105.864 m
+159.984 106.865 L
+S
+156.984 92.8629 m
+(4) show
+196.283 105.864 m
+196.283 106.865 L
+S
+193.283 92.8629 m
+(5) show
+0.125 w
+58.3427 105.864 m
+58.3427 106.464 L
+S
+65.6025 105.864 m
+65.6025 106.464 L
+S
+72.8624 105.864 m
+72.8624 106.464 L
+S
+80.1222 105.864 m
+80.1222 106.464 L
+S
+94.6419 105.864 m
+94.6419 106.464 L
+S
+101.903 105.864 m
+101.903 106.464 L
+S
+109.163 105.864 m
+109.163 106.464 L
+S
+116.423 105.864 m
+116.423 106.464 L
+S
+130.943 105.864 m
+130.943 106.464 L
+S
+138.203 105.864 m
+138.203 106.464 L
+S
+145.462 105.864 m
+145.462 106.464 L
+S
+152.724 105.864 m
+152.724 106.464 L
+S
+167.244 105.864 m
+167.244 106.464 L
+S
+174.503 105.864 m
+174.503 106.464 L
+S
+181.763 105.864 m
+181.763 106.464 L
+S
+189.023 105.864 m
+189.023 106.464 L
+S
+43.8214 105.864 m
+43.8214 106.464 L
+S
+203.544 105.864 m
+203.544 106.464 L
+S
+0.25 w
+43.6405 105.864 m
+203.725 105.864 L
+S
+43.6405 108.22 m
+44.641 108.22 L
+S
+26.6394 104.72 m
+/F1 /Times-Roman findfont def
+F1 10. scalefont setfont
+(-) show
+33.2644 104.72 m
+F0 10. scalefont setfont
+(1) show
+43.6405 131.777 m
+44.641 131.777 L
+S
+14.6395 128.277 m
+F1 10. scalefont setfont
+(-) show
+21.2645 128.277 m
+F0 10. scalefont setfont
+(0.5) show
+43.6405 155.333 m
+44.641 155.333 L
+S
+33.6395 151.833 m
+(0) show
+43.6405 178.89 m
+44.641 178.89 L
+S
+21.6395 175.39 m
+(0.5) show
+43.6405 202.446 m
+44.641 202.446 L
+S
+33.6395 198.946 m
+(1) show
+0.125 w
+43.6405 112.932 m
+44.2408 112.932 L
+S
+43.6405 117.643 m
+44.2408 117.643 L
+S
+43.6405 122.354 m
+44.2408 122.354 L
+S
+43.6405 127.066 m
+44.2408 127.066 L
+S
+43.6405 136.488 m
+44.2408 136.488 L
+S
+43.6405 141.2 m
+44.2408 141.2 L
+S
+43.6405 145.911 m
+44.2408 145.911 L
+S
+43.6405 150.622 m
+44.2408 150.622 L
+S
+43.6405 160.045 m
+44.2408 160.045 L
+S
+43.6405 164.756 m
+44.2408 164.756 L
+S
+43.6405 169.467 m
+44.2408 169.467 L
+S
+43.6405 174.179 m
+44.2408 174.179 L
+S
+43.6405 183.601 m
+44.2408 183.601 L
+S
+43.6405 188.312 m
+44.2408 188.312 L
+S
+43.6405 193.024 m
+44.2408 193.024 L
+S
+43.6405 197.735 m
+44.2408 197.735 L
+S
+0.25 w
+43.6405 105.864 m
+43.6405 204.801 L
+S
+51.0828 203.801 m
+51.0828 204.801 L
+S
+87.3821 203.801 m
+87.3821 204.801 L
+S
+123.683 203.801 m
+123.683 204.801 L
+S
+159.984 203.801 m
+159.984 204.801 L
+S
+196.283 203.801 m
+196.283 204.801 L
+S
+0.125 w
+58.3427 204.201 m
+58.3427 204.801 L
+S
+65.6025 204.201 m
+65.6025 204.801 L
+S
+72.8624 204.201 m
+72.8624 204.801 L
+S
+80.1222 204.201 m
+80.1222 204.801 L
+S
+94.6419 204.201 m
+94.6419 204.801 L
+S
+101.903 204.201 m
+101.903 204.801 L
+S
+109.163 204.201 m
+109.163 204.801 L
+S
+116.423 204.201 m
+116.423 204.801 L
+S
+130.943 204.201 m
+130.943 204.801 L
+S
+138.203 204.201 m
+138.203 204.801 L
+S
+145.462 204.201 m
+145.462 204.801 L
+S
+152.724 204.201 m
+152.724 204.801 L
+S
+167.244 204.201 m
+167.244 204.801 L
+S
+174.503 204.201 m
+174.503 204.801 L
+S
+181.763 204.201 m
+181.763 204.801 L
+S
+189.023 204.201 m
+189.023 204.801 L
+S
+43.8214 204.201 m
+43.8214 204.801 L
+S
+203.544 204.201 m
+203.544 204.801 L
+S
+0.25 w
+43.6405 204.801 m
+203.725 204.801 L
+S
+202.725 108.22 m
+203.725 108.22 L
+S
+202.725 131.777 m
+203.725 131.777 L
+S
+202.725 155.333 m
+203.725 155.333 L
+S
+202.725 178.89 m
+203.725 178.89 L
+S
+202.725 202.446 m
+203.725 202.446 L
+S
+0.125 w
+203.125 112.932 m
+203.725 112.932 L
+S
+203.125 117.643 m
+203.725 117.643 L
+S
+203.125 122.354 m
+203.725 122.354 L
+S
+203.125 127.066 m
+203.725 127.066 L
+S
+203.125 136.488 m
+203.725 136.488 L
+S
+203.125 141.2 m
+203.725 141.2 L
+S
+203.125 145.911 m
+203.725 145.911 L
+S
+203.125 150.622 m
+203.725 150.622 L
+S
+203.125 160.045 m
+203.725 160.045 L
+S
+203.125 164.756 m
+203.725 164.756 L
+S
+203.125 169.467 m
+203.725 169.467 L
+S
+203.125 174.179 m
+203.725 174.179 L
+S
+203.125 183.601 m
+203.725 183.601 L
+S
+203.125 188.312 m
+203.725 188.312 L
+S
+203.125 193.024 m
+203.725 193.024 L
+S
+203.125 197.735 m
+203.725 197.735 L
+S
+0.25 w
+203.725 105.864 m
+203.725 204.801 L
+S
+43.6405 155.333 m
+203.725 155.333 L
+S
+gsave
+43.6405 105.864 m
+203.725 105.864 L
+203.725 204.801 L
+43.6405 204.801 L
+43.6405 105.864 L
+closepath clip newpath
+1.5 w
+47.4521 192.238 m
+53.6362 196.669 L
+56.8555 198.508 L
+60.3822 200.133 L
+61.967 200.727 L
+63.6623 201.267 L
+65.2503 201.681 L
+66.7167 201.985 L
+68.3528 202.233 L
+69.214 202.326 L
+69.6543 202.363 L
+70.1281 202.397 L
+70.5411 202.418 L
+70.9205 202.432 L
+71.1014 202.437 L
+71.2999 202.442 L
+71.4872 202.445 L
+71.6617 202.446 L
+71.7674 202.446 L
+71.8827 202.446 L
+72.0908 202.445 L
+72.2941 202.442 L
+72.4798 202.438 L
+72.6815 202.432 L
+72.904 202.424 L
+73.3522 202.403 L
+73.754 202.378 L
+74.1911 202.344 L
+74.9851 202.265 L
+76.4755 202.056 L
+78.214 201.713 L
+79.8229 201.3 L
+82.8116 200.296 L
+86.1094 198.835 L
+92.5448 194.961 L
+98.7385 190.061 L
+105.324 183.745 L
+111.667 176.778 L
+117.768 169.459 L
+124.261 161.237 L
+130.512 153.142 L
+137.154 144.614 L
+143.556 136.733 L
+149.713 129.693 L
+156.263 123.014 L
+162.571 117.574 L
+168.636 113.414 L
+172.011 111.598 L
+175.094 110.27 L
+176.62 109.732 L
+S
+176.62 109.732 m
+178.283 109.239 L
+179.842 108.862 L
+181.31 108.587 L
+182.106 108.469 L
+182.965 108.368 L
+183.346 108.331 L
+183.747 108.299 L
+184.123 108.273 L
+184.465 108.254 L
+184.866 108.236 L
+185.087 108.23 L
+185.295 108.225 L
+185.487 108.222 L
+185.664 108.22 L
+185.86 108.22 L
+186.068 108.22 L
+186.276 108.224 L
+186.393 108.225 L
+186.499 108.227 L
+186.695 108.233 L
+186.904 108.24 L
+187.344 108.26 L
+187.824 108.289 L
+188.674 108.363 L
+189.474 108.456 L
+190.97 108.69 L
+192.582 109.029 L
+194.327 109.5 L
+197.042 110.444 L
+199.914 111.715 L
+S
+0.5 g
+0.5 w
+123.683 155.333 m
+123.683 161.982 L
+S
+159.984 155.333 m
+159.984 119.678 L
+S
+141.833 155.333 m
+141.833 138.806 L
+S
+0 g
+123.683 161.982 2. dot
+159.984 119.678 2. dot
+126.683 163.482 m
+(a) show
+132.683 161.982 m
+F0 7.125 scalefont setfont
+(2) show
+162.984 121.178 m
+F0 10. scalefont setfont
+(b) show
+168.984 119.678 m
+F0 7.125 scalefont setfont
+(2) show
+grestore
+0 g
+0.25 w
+[ ] 0 d
+266.593 105.864 m
+266.593 106.865 L
+S
+263.593 92.8629 m
+F0 10. scalefont setfont
+(1) show
+302.892 105.864 m
+302.892 106.865 L
+S
+299.892 92.8629 m
+(2) show
+339.193 105.864 m
+339.193 106.865 L
+S
+336.193 92.8629 m
+(3) show
+375.494 105.864 m
+375.494 106.865 L
+S
+372.494 92.8629 m
+(4) show
+411.793 105.864 m
+411.793 106.865 L
+S
+408.793 92.8629 m
+(5) show
+0.125 w
+273.853 105.864 m
+273.853 106.464 L
+S
+281.113 105.864 m
+281.113 106.464 L
+S
+288.373 105.864 m
+288.373 106.464 L
+S
+295.632 105.864 m
+295.632 106.464 L
+S
+310.152 105.864 m
+310.152 106.464 L
+S
+317.414 105.864 m
+317.414 106.464 L
+S
+324.673 105.864 m
+324.673 106.464 L
+S
+331.933 105.864 m
+331.933 106.464 L
+S
+346.453 105.864 m
+346.453 106.464 L
+S
+353.713 105.864 m
+353.713 106.464 L
+S
+360.973 105.864 m
+360.973 106.464 L
+S
+368.234 105.864 m
+368.234 106.464 L
+S
+382.754 105.864 m
+382.754 106.464 L
+S
+390.014 105.864 m
+390.014 106.464 L
+S
+397.273 105.864 m
+397.273 106.464 L
+S
+404.533 105.864 m
+404.533 106.464 L
+S
+259.332 105.864 m
+259.332 106.464 L
+S
+419.055 105.864 m
+419.055 106.464 L
+S
+0.25 w
+259.151 105.864 m
+419.235 105.864 L
+S
+259.151 108.22 m
+260.151 108.22 L
+S
+242.15 104.72 m
+F1 10. scalefont setfont
+(-) show
+248.775 104.72 m
+F0 10. scalefont setfont
+(1) show
+259.151 131.777 m
+260.151 131.777 L
+S
+230.15 128.277 m
+F1 10. scalefont setfont
+(-) show
+236.775 128.277 m
+F0 10. scalefont setfont
+(0.5) show
+259.151 155.333 m
+260.151 155.333 L
+S
+249.15 151.833 m
+(0) show
+259.151 178.89 m
+260.151 178.89 L
+S
+237.15 175.39 m
+(0.5) show
+259.151 202.446 m
+260.151 202.446 L
+S
+249.15 198.946 m
+(1) show
+0.125 w
+259.151 112.932 m
+259.751 112.932 L
+S
+259.151 117.643 m
+259.751 117.643 L
+S
+259.151 122.354 m
+259.751 122.354 L
+S
+259.151 127.066 m
+259.751 127.066 L
+S
+259.151 136.488 m
+259.751 136.488 L
+S
+259.151 141.2 m
+259.751 141.2 L
+S
+259.151 145.911 m
+259.751 145.911 L
+S
+259.151 150.622 m
+259.751 150.622 L
+S
+259.151 160.045 m
+259.751 160.045 L
+S
+259.151 164.756 m
+259.751 164.756 L
+S
+259.151 169.467 m
+259.751 169.467 L
+S
+259.151 174.179 m
+259.751 174.179 L
+S
+259.151 183.601 m
+259.751 183.601 L
+S
+259.151 188.312 m
+259.751 188.312 L
+S
+259.151 193.024 m
+259.751 193.024 L
+S
+259.151 197.735 m
+259.751 197.735 L
+S
+0.25 w
+259.151 105.864 m
+259.151 204.801 L
+S
+266.593 203.801 m
+266.593 204.801 L
+S
+302.892 203.801 m
+302.892 204.801 L
+S
+339.193 203.801 m
+339.193 204.801 L
+S
+375.494 203.801 m
+375.494 204.801 L
+S
+411.793 203.801 m
+411.793 204.801 L
+S
+0.125 w
+273.853 204.201 m
+273.853 204.801 L
+S
+281.113 204.201 m
+281.113 204.801 L
+S
+288.373 204.201 m
+288.373 204.801 L
+S
+295.632 204.201 m
+295.632 204.801 L
+S
+310.152 204.201 m
+310.152 204.801 L
+S
+317.414 204.201 m
+317.414 204.801 L
+S
+324.673 204.201 m
+324.673 204.801 L
+S
+331.933 204.201 m
+331.933 204.801 L
+S
+346.453 204.201 m
+346.453 204.801 L
+S
+353.713 204.201 m
+353.713 204.801 L
+S
+360.973 204.201 m
+360.973 204.801 L
+S
+368.234 204.201 m
+368.234 204.801 L
+S
+382.754 204.201 m
+382.754 204.801 L
+S
+390.014 204.201 m
+390.014 204.801 L
+S
+397.273 204.201 m
+397.273 204.801 L
+S
+404.533 204.201 m
+404.533 204.801 L
+S
+259.332 204.201 m
+259.332 204.801 L
+S
+419.055 204.201 m
+419.055 204.801 L
+S
+0.25 w
+259.151 204.801 m
+419.235 204.801 L
+S
+418.235 108.22 m
+419.235 108.22 L
+S
+418.235 131.777 m
+419.235 131.777 L
+S
+418.235 155.333 m
+419.235 155.333 L
+S
+418.235 178.89 m
+419.235 178.89 L
+S
+418.235 202.446 m
+419.235 202.446 L
+S
+0.125 w
+418.635 112.932 m
+419.235 112.932 L
+S
+418.635 117.643 m
+419.235 117.643 L
+S
+418.635 122.354 m
+419.235 122.354 L
+S
+418.635 127.066 m
+419.235 127.066 L
+S
+418.635 136.488 m
+419.235 136.488 L
+S
+418.635 141.2 m
+419.235 141.2 L
+S
+418.635 145.911 m
+419.235 145.911 L
+S
+418.635 150.622 m
+419.235 150.622 L
+S
+418.635 160.045 m
+419.235 160.045 L
+S
+418.635 164.756 m
+419.235 164.756 L
+S
+418.635 169.467 m
+419.235 169.467 L
+S
+418.635 174.179 m
+419.235 174.179 L
+S
+418.635 183.601 m
+419.235 183.601 L
+S
+418.635 188.312 m
+419.235 188.312 L
+S
+418.635 193.024 m
+419.235 193.024 L
+S
+418.635 197.735 m
+419.235 197.735 L
+S
+0.25 w
+419.235 105.864 m
+419.235 204.801 L
+S
+259.151 155.333 m
+419.235 155.333 L
+S
+gsave
+259.151 105.864 m
+419.235 105.864 L
+419.235 204.801 L
+259.151 204.801 L
+259.151 105.864 L
+closepath clip newpath
+1.5 w
+262.962 192.238 m
+269.146 196.669 L
+272.366 198.508 L
+275.892 200.133 L
+277.477 200.727 L
+279.172 201.267 L
+280.761 201.681 L
+282.227 201.985 L
+283.863 202.233 L
+284.724 202.326 L
+285.164 202.363 L
+285.638 202.397 L
+286.051 202.418 L
+286.431 202.432 L
+286.612 202.437 L
+286.81 202.442 L
+286.997 202.445 L
+287.172 202.446 L
+287.278 202.446 L
+287.393 202.446 L
+287.601 202.445 L
+287.804 202.442 L
+287.99 202.438 L
+288.192 202.432 L
+288.414 202.424 L
+288.862 202.403 L
+289.264 202.378 L
+289.701 202.344 L
+290.495 202.265 L
+291.986 202.056 L
+293.724 201.713 L
+295.333 201.3 L
+298.322 200.296 L
+301.62 198.835 L
+308.055 194.961 L
+314.249 190.061 L
+320.835 183.745 L
+327.177 176.778 L
+333.278 169.459 L
+339.771 161.237 L
+346.022 153.142 L
+352.664 144.614 L
+359.066 136.733 L
+365.223 129.693 L
+371.773 123.014 L
+378.081 117.574 L
+384.146 113.414 L
+387.521 111.598 L
+390.604 110.27 L
+392.13 109.732 L
+S
+392.13 109.732 m
+393.793 109.239 L
+395.352 108.862 L
+396.82 108.587 L
+397.616 108.469 L
+398.476 108.368 L
+398.857 108.331 L
+399.257 108.299 L
+399.633 108.273 L
+399.976 108.254 L
+400.376 108.236 L
+400.597 108.23 L
+400.805 108.225 L
+400.997 108.222 L
+401.175 108.22 L
+401.37 108.22 L
+401.578 108.22 L
+401.786 108.224 L
+401.903 108.225 L
+402.009 108.227 L
+402.206 108.233 L
+402.414 108.24 L
+402.854 108.26 L
+403.334 108.289 L
+404.184 108.363 L
+404.985 108.456 L
+406.48 108.69 L
+408.092 109.029 L
+409.837 109.5 L
+412.552 110.444 L
+415.424 111.715 L
+S
+0.5 g
+0.5 w
+339.193 155.333 m
+339.193 161.982 L
+S
+357.343 155.333 m
+357.343 138.806 L
+S
+348.268 155.333 m
+348.268 150.236 L
+S
+0 g
+339.193 161.982 2. dot
+357.343 138.806 2. dot
+342.193 163.482 m
+(a) show
+348.193 161.982 m
+F0 7.125 scalefont setfont
+(3) show
+360.343 140.306 m
+F0 10. scalefont setfont
+(b) show
+366.343 138.806 m
+F0 7.125 scalefont setfont
+(3) show
+grestore
+0 g
+0.25 w
+[ ] 0 d
+51.0828 239.056 m
+51.0828 240.057 L
+S
+48.0828 226.055 m
+F0 10. scalefont setfont
+(1) show
+87.382 239.056 m
+87.382 240.057 L
+S
+84.382 226.055 m
+(2) show
+123.683 239.056 m
+123.683 240.057 L
+S
+120.683 226.055 m
+(3) show
+159.984 239.056 m
+159.984 240.057 L
+S
+156.984 226.055 m
+(4) show
+196.283 239.056 m
+196.283 240.057 L
+S
+193.283 226.055 m
+(5) show
+0.125 w
+58.3426 239.056 m
+58.3426 239.657 L
+S
+65.6025 239.056 m
+65.6025 239.657 L
+S
+72.8623 239.056 m
+72.8623 239.657 L
+S
+80.1222 239.056 m
+80.1222 239.657 L
+S
+94.6419 239.056 m
+94.6419 239.657 L
+S
+101.903 239.056 m
+101.903 239.657 L
+S
+109.163 239.056 m
+109.163 239.657 L
+S
+116.423 239.056 m
+116.423 239.657 L
+S
+130.943 239.056 m
+130.943 239.657 L
+S
+138.203 239.056 m
+138.203 239.657 L
+S
+145.462 239.056 m
+145.462 239.657 L
+S
+152.724 239.056 m
+152.724 239.657 L
+S
+167.244 239.056 m
+167.244 239.657 L
+S
+174.503 239.056 m
+174.503 239.657 L
+S
+181.763 239.056 m
+181.763 239.657 L
+S
+189.023 239.056 m
+189.023 239.657 L
+S
+43.8213 239.056 m
+43.8213 239.657 L
+S
+203.544 239.056 m
+203.544 239.657 L
+S
+0.25 w
+43.6404 239.056 m
+203.725 239.056 L
+S
+43.6404 241.413 m
+44.641 241.413 L
+S
+26.6394 237.913 m
+F1 10. scalefont setfont
+(-) show
+33.2644 237.913 m
+F0 10. scalefont setfont
+(1) show
+43.6404 264.969 m
+44.641 264.969 L
+S
+14.6394 261.469 m
+F1 10. scalefont setfont
+(-) show
+21.2644 261.469 m
+F0 10. scalefont setfont
+(0.5) show
+43.6404 288.526 m
+44.641 288.526 L
+S
+33.6394 285.026 m
+(0) show
+43.6404 312.082 m
+44.641 312.082 L
+S
+21.6394 308.582 m
+(0.5) show
+43.6404 335.639 m
+44.641 335.639 L
+S
+33.6394 332.139 m
+(1) show
+0.125 w
+43.6404 246.124 m
+44.2408 246.124 L
+S
+43.6404 250.835 m
+44.2408 250.835 L
+S
+43.6404 255.547 m
+44.2408 255.547 L
+S
+43.6404 260.258 m
+44.2408 260.258 L
+S
+43.6404 269.681 m
+44.2408 269.681 L
+S
+43.6404 274.392 m
+44.2408 274.392 L
+S
+43.6404 279.103 m
+44.2408 279.103 L
+S
+43.6404 283.815 m
+44.2408 283.815 L
+S
+43.6404 293.237 m
+44.2408 293.237 L
+S
+43.6404 297.948 m
+44.2408 297.948 L
+S
+43.6404 302.66 m
+44.2408 302.66 L
+S
+43.6404 307.371 m
+44.2408 307.371 L
+S
+43.6404 316.794 m
+44.2408 316.794 L
+S
+43.6404 321.505 m
+44.2408 321.505 L
+S
+43.6404 326.216 m
+44.2408 326.216 L
+S
+43.6404 330.928 m
+44.2408 330.928 L
+S
+0.25 w
+43.6404 239.056 m
+43.6404 337.994 L
+S
+51.0828 336.993 m
+51.0828 337.994 L
+S
+87.382 336.993 m
+87.382 337.994 L
+S
+123.683 336.993 m
+123.683 337.994 L
+S
+159.984 336.993 m
+159.984 337.994 L
+S
+196.283 336.993 m
+196.283 337.994 L
+S
+0.125 w
+58.3426 337.393 m
+58.3426 337.994 L
+S
+65.6025 337.393 m
+65.6025 337.994 L
+S
+72.8623 337.393 m
+72.8623 337.994 L
+S
+80.1222 337.393 m
+80.1222 337.994 L
+S
+94.6419 337.393 m
+94.6419 337.994 L
+S
+101.903 337.393 m
+101.903 337.994 L
+S
+109.163 337.393 m
+109.163 337.994 L
+S
+116.423 337.393 m
+116.423 337.994 L
+S
+130.943 337.393 m
+130.943 337.994 L
+S
+138.203 337.393 m
+138.203 337.994 L
+S
+145.462 337.393 m
+145.462 337.994 L
+S
+152.724 337.393 m
+152.724 337.994 L
+S
+167.244 337.393 m
+167.244 337.994 L
+S
+174.503 337.393 m
+174.503 337.994 L
+S
+181.763 337.393 m
+181.763 337.994 L
+S
+189.023 337.393 m
+189.023 337.994 L
+S
+43.8213 337.393 m
+43.8213 337.994 L
+S
+203.544 337.393 m
+203.544 337.994 L
+S
+0.25 w
+43.6404 337.994 m
+203.725 337.994 L
+S
+202.725 241.413 m
+203.725 241.413 L
+S
+202.725 264.969 m
+203.725 264.969 L
+S
+202.725 288.526 m
+203.725 288.526 L
+S
+202.725 312.082 m
+203.725 312.082 L
+S
+202.725 335.639 m
+203.725 335.639 L
+S
+0.125 w
+203.125 246.124 m
+203.725 246.124 L
+S
+203.125 250.835 m
+203.725 250.835 L
+S
+203.125 255.547 m
+203.725 255.547 L
+S
+203.125 260.258 m
+203.725 260.258 L
+S
+203.125 269.681 m
+203.725 269.681 L
+S
+203.125 274.392 m
+203.725 274.392 L
+S
+203.125 279.103 m
+203.725 279.103 L
+S
+203.125 283.815 m
+203.725 283.815 L
+S
+203.125 293.237 m
+203.725 293.237 L
+S
+203.125 297.948 m
+203.725 297.948 L
+S
+203.125 302.66 m
+203.725 302.66 L
+S
+203.125 307.371 m
+203.725 307.371 L
+S
+203.125 316.794 m
+203.725 316.794 L
+S
+203.125 321.505 m
+203.725 321.505 L
+S
+203.125 326.216 m
+203.725 326.216 L
+S
+203.125 330.928 m
+203.725 330.928 L
+S
+0.25 w
+203.725 239.056 m
+203.725 337.994 L
+S
+43.6404 288.526 m
+203.725 288.526 L
+S
+gsave
+43.6404 239.056 m
+203.725 239.056 L
+203.725 337.994 L
+43.6404 337.994 L
+43.6404 239.056 L
+closepath clip newpath
+1.5 w
+47.4521 325.43 m
+53.6361 329.861 L
+56.8555 331.701 L
+60.3821 333.326 L
+61.967 333.92 L
+63.6623 334.459 L
+65.2503 334.874 L
+66.7167 335.178 L
+68.3527 335.426 L
+69.214 335.519 L
+69.6542 335.556 L
+70.1281 335.589 L
+70.5411 335.61 L
+70.9205 335.624 L
+71.1014 335.629 L
+71.2999 335.634 L
+71.4872 335.637 L
+71.6617 335.639 L
+71.7674 335.639 L
+71.8826 335.639 L
+72.0907 335.637 L
+72.294 335.634 L
+72.4797 335.631 L
+72.6814 335.624 L
+72.904 335.616 L
+73.3522 335.596 L
+73.754 335.57 L
+74.191 335.536 L
+74.9851 335.458 L
+76.4754 335.248 L
+78.214 334.906 L
+79.8228 334.493 L
+82.8116 333.489 L
+86.1094 332.027 L
+92.5448 328.153 L
+98.7384 323.253 L
+105.324 316.938 L
+111.667 309.971 L
+117.768 302.652 L
+124.261 294.43 L
+130.512 286.334 L
+137.154 277.807 L
+143.556 269.926 L
+149.713 262.885 L
+156.263 256.206 L
+162.571 250.767 L
+168.636 246.606 L
+172.011 244.791 L
+175.094 243.462 L
+176.62 242.924 L
+S
+176.62 242.924 m
+178.283 242.431 L
+179.842 242.055 L
+181.31 241.779 L
+182.106 241.661 L
+182.965 241.56 L
+183.346 241.523 L
+183.747 241.491 L
+184.123 241.466 L
+184.465 241.447 L
+184.866 241.429 L
+185.087 241.423 L
+185.295 241.418 L
+185.487 241.415 L
+185.665 241.413 L
+185.86 241.413 L
+186.068 241.413 L
+186.276 241.416 L
+186.393 241.418 L
+186.499 241.419 L
+186.695 241.426 L
+186.904 241.432 L
+187.344 241.453 L
+187.824 241.482 L
+188.674 241.555 L
+189.475 241.648 L
+190.97 241.882 L
+192.582 242.221 L
+194.327 242.692 L
+197.042 243.636 L
+199.914 244.908 L
+S
+0.5 g
+0.5 w
+51.0828 288.526 m
+51.0828 328.169 L
+S
+196.283 288.526 m
+196.283 243.347 L
+S
+123.683 288.526 m
+123.683 295.174 L
+S
+0 g
+196.283 243.347 2. dot
+51.0828 328.169 2. dot
+53.0828 319.669 m
+(a) show
+59.0828 318.169 m
+F0 7.125 scalefont setfont
+(0) show
+184.283 245.847 m
+F0 10. scalefont setfont
+(b) show
+190.283 244.347 m
+F0 7.125 scalefont setfont
+(0) show
+grestore
+0 g
+0.25 w
+[ ] 0 d
+266.593 239.056 m
+266.593 240.057 L
+S
+263.593 226.055 m
+F0 10. scalefont setfont
+(1) show
+302.892 239.056 m
+302.892 240.057 L
+S
+299.892 226.055 m
+(2) show
+339.193 239.056 m
+339.193 240.057 L
+S
+336.193 226.055 m
+(3) show
+375.494 239.056 m
+375.494 240.057 L
+S
+372.494 226.055 m
+(4) show
+411.793 239.056 m
+411.793 240.057 L
+S
+408.793 226.055 m
+(5) show
+0.125 w
+273.853 239.056 m
+273.853 239.657 L
+S
+281.113 239.056 m
+281.113 239.657 L
+S
+288.373 239.056 m
+288.373 239.657 L
+S
+295.632 239.056 m
+295.632 239.657 L
+S
+310.152 239.056 m
+310.152 239.657 L
+S
+317.414 239.056 m
+317.414 239.657 L
+S
+324.673 239.056 m
+324.673 239.657 L
+S
+331.933 239.056 m
+331.933 239.657 L
+S
+346.453 239.056 m
+346.453 239.657 L
+S
+353.713 239.056 m
+353.713 239.657 L
+S
+360.973 239.056 m
+360.973 239.657 L
+S
+368.234 239.056 m
+368.234 239.657 L
+S
+382.754 239.056 m
+382.754 239.657 L
+S
+390.014 239.056 m
+390.014 239.657 L
+S
+397.273 239.056 m
+397.273 239.657 L
+S
+404.533 239.056 m
+404.533 239.657 L
+S
+259.332 239.056 m
+259.332 239.657 L
+S
+419.055 239.056 m
+419.055 239.657 L
+S
+0.25 w
+259.151 239.056 m
+419.236 239.056 L
+S
+259.151 241.413 m
+260.151 241.413 L
+S
+242.15 237.913 m
+F1 10. scalefont setfont
+(-) show
+248.775 237.913 m
+F0 10. scalefont setfont
+(1) show
+259.151 264.969 m
+260.151 264.969 L
+S
+230.15 261.469 m
+F1 10. scalefont setfont
+(-) show
+236.775 261.469 m
+F0 10. scalefont setfont
+(0.5) show
+259.151 288.526 m
+260.151 288.526 L
+S
+249.15 285.026 m
+(0) show
+259.151 312.082 m
+260.151 312.082 L
+S
+237.15 308.582 m
+(0.5) show
+259.151 335.639 m
+260.151 335.639 L
+S
+249.15 332.139 m
+(1) show
+0.125 w
+259.151 246.124 m
+259.751 246.124 L
+S
+259.151 250.835 m
+259.751 250.835 L
+S
+259.151 255.547 m
+259.751 255.547 L
+S
+259.151 260.258 m
+259.751 260.258 L
+S
+259.151 269.681 m
+259.751 269.681 L
+S
+259.151 274.392 m
+259.751 274.392 L
+S
+259.151 279.103 m
+259.751 279.103 L
+S
+259.151 283.815 m
+259.751 283.815 L
+S
+259.151 293.237 m
+259.751 293.237 L
+S
+259.151 297.948 m
+259.751 297.948 L
+S
+259.151 302.66 m
+259.751 302.66 L
+S
+259.151 307.371 m
+259.751 307.371 L
+S
+259.151 316.794 m
+259.751 316.794 L
+S
+259.151 321.505 m
+259.751 321.505 L
+S
+259.151 326.216 m
+259.751 326.216 L
+S
+259.151 330.928 m
+259.751 330.928 L
+S
+0.25 w
+259.151 239.056 m
+259.151 337.994 L
+S
+266.593 336.993 m
+266.593 337.994 L
+S
+302.892 336.993 m
+302.892 337.994 L
+S
+339.193 336.993 m
+339.193 337.994 L
+S
+375.494 336.993 m
+375.494 337.994 L
+S
+411.793 336.993 m
+411.793 337.994 L
+S
+0.125 w
+273.853 337.393 m
+273.853 337.994 L
+S
+281.113 337.393 m
+281.113 337.994 L
+S
+288.373 337.393 m
+288.373 337.994 L
+S
+295.632 337.393 m
+295.632 337.994 L
+S
+310.152 337.393 m
+310.152 337.994 L
+S
+317.414 337.393 m
+317.414 337.994 L
+S
+324.673 337.393 m
+324.673 337.994 L
+S
+331.933 337.393 m
+331.933 337.994 L
+S
+346.453 337.393 m
+346.453 337.994 L
+S
+353.713 337.393 m
+353.713 337.994 L
+S
+360.973 337.393 m
+360.973 337.994 L
+S
+368.234 337.393 m
+368.234 337.994 L
+S
+382.754 337.393 m
+382.754 337.994 L
+S
+390.014 337.393 m
+390.014 337.994 L
+S
+397.273 337.393 m
+397.273 337.994 L
+S
+404.533 337.393 m
+404.533 337.994 L
+S
+259.332 337.393 m
+259.332 337.994 L
+S
+419.055 337.393 m
+419.055 337.994 L
+S
+0.25 w
+259.151 337.994 m
+419.236 337.994 L
+S
+418.235 241.413 m
+419.236 241.413 L
+S
+418.235 264.969 m
+419.236 264.969 L
+S
+418.235 288.526 m
+419.236 288.526 L
+S
+418.235 312.082 m
+419.236 312.082 L
+S
+418.235 335.639 m
+419.236 335.639 L
+S
+0.125 w
+418.635 246.124 m
+419.236 246.124 L
+S
+418.635 250.835 m
+419.236 250.835 L
+S
+418.635 255.547 m
+419.236 255.547 L
+S
+418.635 260.258 m
+419.236 260.258 L
+S
+418.635 269.681 m
+419.236 269.681 L
+S
+418.635 274.392 m
+419.236 274.392 L
+S
+418.635 279.103 m
+419.236 279.103 L
+S
+418.635 283.815 m
+419.236 283.815 L
+S
+418.635 293.237 m
+419.236 293.237 L
+S
+418.635 297.948 m
+419.236 297.948 L
+S
+418.635 302.66 m
+419.236 302.66 L
+S
+418.635 307.371 m
+419.236 307.371 L
+S
+418.635 316.794 m
+419.236 316.794 L
+S
+418.635 321.505 m
+419.236 321.505 L
+S
+418.635 326.216 m
+419.236 326.216 L
+S
+418.635 330.928 m
+419.236 330.928 L
+S
+0.25 w
+419.236 239.056 m
+419.236 337.994 L
+S
+259.151 288.526 m
+419.236 288.526 L
+S
+gsave
+259.151 239.056 m
+419.236 239.056 L
+419.236 337.994 L
+259.151 337.994 L
+259.151 239.056 L
+closepath clip newpath
+1.5 w
+262.962 325.43 m
+269.146 329.861 L
+272.366 331.701 L
+275.892 333.326 L
+277.477 333.92 L
+279.172 334.459 L
+280.761 334.874 L
+282.227 335.178 L
+283.863 335.426 L
+284.724 335.519 L
+285.164 335.556 L
+285.638 335.589 L
+286.051 335.61 L
+286.431 335.624 L
+286.612 335.629 L
+286.81 335.634 L
+286.997 335.637 L
+287.172 335.639 L
+287.278 335.639 L
+287.393 335.639 L
+287.601 335.637 L
+287.804 335.634 L
+287.99 335.631 L
+288.192 335.624 L
+288.414 335.616 L
+288.862 335.596 L
+289.264 335.57 L
+289.701 335.536 L
+290.495 335.458 L
+291.986 335.248 L
+293.724 334.906 L
+295.333 334.493 L
+298.322 333.489 L
+301.62 332.027 L
+308.055 328.153 L
+314.249 323.253 L
+320.835 316.938 L
+327.177 309.971 L
+333.278 302.652 L
+339.771 294.43 L
+346.022 286.334 L
+352.664 277.807 L
+359.066 269.926 L
+365.223 262.885 L
+371.774 256.206 L
+378.081 250.767 L
+384.147 246.606 L
+387.521 244.791 L
+390.604 243.462 L
+392.13 242.924 L
+S
+392.13 242.924 m
+393.793 242.431 L
+395.352 242.055 L
+396.82 241.779 L
+397.616 241.661 L
+398.476 241.56 L
+398.857 241.523 L
+399.257 241.491 L
+399.633 241.466 L
+399.976 241.447 L
+400.376 241.429 L
+400.597 241.423 L
+400.805 241.418 L
+400.997 241.415 L
+401.175 241.413 L
+401.37 241.413 L
+401.578 241.413 L
+401.786 241.416 L
+401.903 241.418 L
+402.009 241.419 L
+402.206 241.426 L
+402.414 241.432 L
+402.854 241.453 L
+403.334 241.482 L
+404.184 241.555 L
+404.985 241.648 L
+406.48 241.882 L
+408.092 242.221 L
+409.837 242.692 L
+412.552 243.636 L
+415.424 244.908 L
+S
+0.5 g
+0.5 w
+411.793 288.526 m
+411.793 243.347 L
+S
+339.193 288.526 m
+339.193 295.174 L
+S
+375.494 288.526 m
+375.494 252.87 L
+S
+0 g
+339.193 295.174 2. dot
+411.793 243.347 2. dot
+342.193 296.674 m
+(a) show
+348.193 295.174 m
+F0 7.125 scalefont setfont
+(1) show
+399.793 245.847 m
+F0 10. scalefont setfont
+(b) show
+405.793 244.347 m
+F0 7.125 scalefont setfont
+(1) show
+grestore
+grestore
+showpage
+%%PageTrailer
+%%Trailer
+%%Pages: 1
+%%EOF
diff --git a/gsl-1.9/doc/roots-false-position.eps b/gsl-1.9/doc/roots-false-position.eps
new file mode 100644
index 0000000..4f6b47a
--- /dev/null
+++ b/gsl-1.9/doc/roots-false-position.eps
@@ -0,0 +1,633 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: Mathematica-PSRender
+%%BoundingBox: 0 79 432 353
+%%Pages: (atend)
+%%EndComments
+%%BeginProlog
+/setrgbcolor dup where
+{ pop pop }
+{ { .114 mul exch .587 mul add exch .299 mul add setgray } bind def }
+ifelse
+/C /curveto load def
+/f /fill load def
+/F { closepath fill } bind def
+/L /lineto load def
+/S /stroke load def
+/s { closepath stroke } bind def
+/d /setdash load def
+/g /setgray load def
+/m /moveto load def
+/r /setrgbcolor load def
+/w /setlinewidth load def
+/b { gsave gsave F grestore 0 g S grestore newpath } bind def
+/dot { newpath 0 360 arc fill } bind def
+%%EndProlog
+%%Page: 1 1
+0 g
+0.25 w
+[ ] 0 d
+31.8389 99.7849 m
+31.8389 102.339 L
+S
+25.3389 83.6772 m
+/F1 /Times-Roman findfont def
+F1 10. scalefont setfont
+(-) show
+31.9639 83.6772 m
+/F0 /Times-Roman findfont def
+F0 10. scalefont setfont
+(2) show
+87.4313 99.7849 m
+87.4313 102.339 L
+S
+74.9313 83.6772 m
+F1 10. scalefont setfont
+(-) show
+81.5563 83.6772 m
+F0 10. scalefont setfont
+(1.5) show
+143.028 99.7849 m
+143.028 102.339 L
+S
+136.528 83.6772 m
+F1 10. scalefont setfont
+(-) show
+143.153 83.6772 m
+F0 10. scalefont setfont
+(1) show
+198.62 99.7849 m
+198.62 102.339 L
+S
+186.12 83.6772 m
+F1 10. scalefont setfont
+(-) show
+192.745 83.6772 m
+F0 10. scalefont setfont
+(0.5) show
+254.217 99.7849 m
+254.217 102.339 L
+S
+251.217 83.6772 m
+(0) show
+309.809 99.7849 m
+309.809 102.339 L
+S
+300.809 83.6772 m
+(0.5) show
+365.406 99.7849 m
+365.406 102.339 L
+S
+362.406 83.6772 m
+(1) show
+420.998 99.7849 m
+420.998 102.339 L
+S
+411.998 83.6772 m
+(1.5) show
+0.125 w
+42.9574 99.7849 m
+42.9574 101.317 L
+S
+54.0759 99.7849 m
+54.0759 101.317 L
+S
+65.1944 99.7849 m
+65.1944 101.317 L
+S
+76.3128 99.7849 m
+76.3128 101.317 L
+S
+98.5498 99.7849 m
+98.5498 101.317 L
+S
+109.672 99.7849 m
+109.672 101.317 L
+S
+120.791 99.7849 m
+120.791 101.317 L
+S
+131.909 99.7849 m
+131.909 101.317 L
+S
+154.146 99.7849 m
+154.146 101.317 L
+S
+165.265 99.7849 m
+165.265 101.317 L
+S
+176.383 99.7849 m
+176.383 101.317 L
+S
+187.502 99.7849 m
+187.502 101.317 L
+S
+209.739 99.7849 m
+209.739 101.317 L
+S
+220.857 99.7849 m
+220.857 101.317 L
+S
+231.98 99.7849 m
+231.98 101.317 L
+S
+243.098 99.7849 m
+243.098 101.317 L
+S
+265.335 99.7849 m
+265.335 101.317 L
+S
+276.454 99.7849 m
+276.454 101.317 L
+S
+287.572 99.7849 m
+287.572 101.317 L
+S
+298.691 99.7849 m
+298.691 101.317 L
+S
+320.928 99.7849 m
+320.928 101.317 L
+S
+332.046 99.7849 m
+332.046 101.317 L
+S
+343.165 99.7849 m
+343.165 101.317 L
+S
+354.287 99.7849 m
+354.287 101.317 L
+S
+376.524 99.7849 m
+376.524 101.317 L
+S
+387.643 99.7849 m
+387.643 101.317 L
+S
+398.761 99.7849 m
+398.761 101.317 L
+S
+409.879 99.7849 m
+409.879 101.317 L
+S
+0.25 w
+22.1097 99.7849 m
+430.727 99.7849 L
+S
+22.1097 141.039 m
+24.6636 141.039 L
+S
+2.00202 137.539 m
+F1 10. scalefont setfont
+(-) show
+8.62702 137.539 m
+F0 10. scalefont setfont
+(4) show
+22.1097 183.327 m
+24.6636 183.327 L
+S
+2.00202 179.827 m
+F1 10. scalefont setfont
+(-) show
+8.62702 179.827 m
+F0 10. scalefont setfont
+(2) show
+22.1097 225.615 m
+24.6636 225.615 L
+S
+9.00202 222.115 m
+(0) show
+22.1097 267.902 m
+24.6636 267.902 L
+S
+9.00202 264.402 m
+(2) show
+22.1097 310.19 m
+24.6636 310.19 L
+S
+9.00202 306.69 m
+(4) show
+0.125 w
+22.1097 109.322 m
+23.6421 109.322 L
+S
+22.1097 119.893 m
+23.6421 119.893 L
+S
+22.1097 130.464 m
+23.6421 130.464 L
+S
+22.1097 151.61 m
+23.6421 151.61 L
+S
+22.1097 162.181 m
+23.6421 162.181 L
+S
+22.1097 172.756 m
+23.6421 172.756 L
+S
+22.1097 193.898 m
+23.6421 193.898 L
+S
+22.1097 204.469 m
+23.6421 204.469 L
+S
+22.1097 215.044 m
+23.6421 215.044 L
+S
+22.1097 236.186 m
+23.6421 236.186 L
+S
+22.1097 246.756 m
+23.6421 246.756 L
+S
+22.1097 257.331 m
+23.6421 257.331 L
+S
+22.1097 278.473 m
+23.6421 278.473 L
+S
+22.1097 289.048 m
+23.6421 289.048 L
+S
+22.1097 299.619 m
+23.6421 299.619 L
+S
+22.1097 320.761 m
+23.6421 320.761 L
+S
+22.1097 331.336 m
+23.6421 331.336 L
+S
+22.1097 341.907 m
+23.6421 341.907 L
+S
+0.25 w
+22.1097 99.7849 m
+22.1097 352.323 L
+S
+31.8389 349.769 m
+31.8389 352.323 L
+S
+87.4313 349.769 m
+87.4313 352.323 L
+S
+143.028 349.769 m
+143.028 352.323 L
+S
+198.62 349.769 m
+198.62 352.323 L
+S
+254.217 349.769 m
+254.217 352.323 L
+S
+309.809 349.769 m
+309.809 352.323 L
+S
+365.406 349.769 m
+365.406 352.323 L
+S
+420.998 349.769 m
+420.998 352.323 L
+S
+0.125 w
+42.9574 350.79 m
+42.9574 352.323 L
+S
+54.0759 350.79 m
+54.0759 352.323 L
+S
+65.1944 350.79 m
+65.1944 352.323 L
+S
+76.3128 350.79 m
+76.3128 352.323 L
+S
+98.5498 350.79 m
+98.5498 352.323 L
+S
+109.672 350.79 m
+109.672 352.323 L
+S
+120.791 350.79 m
+120.791 352.323 L
+S
+131.909 350.79 m
+131.909 352.323 L
+S
+154.146 350.79 m
+154.146 352.323 L
+S
+165.265 350.79 m
+165.265 352.323 L
+S
+176.383 350.79 m
+176.383 352.323 L
+S
+187.502 350.79 m
+187.502 352.323 L
+S
+209.739 350.79 m
+209.739 352.323 L
+S
+220.857 350.79 m
+220.857 352.323 L
+S
+231.98 350.79 m
+231.98 352.323 L
+S
+243.098 350.79 m
+243.098 352.323 L
+S
+265.335 350.79 m
+265.335 352.323 L
+S
+276.454 350.79 m
+276.454 352.323 L
+S
+287.572 350.79 m
+287.572 352.323 L
+S
+298.691 350.79 m
+298.691 352.323 L
+S
+320.928 350.79 m
+320.928 352.323 L
+S
+332.046 350.79 m
+332.046 352.323 L
+S
+343.165 350.79 m
+343.165 352.323 L
+S
+354.287 350.79 m
+354.287 352.323 L
+S
+376.524 350.79 m
+376.524 352.323 L
+S
+387.643 350.79 m
+387.643 352.323 L
+S
+398.761 350.79 m
+398.761 352.323 L
+S
+409.879 350.79 m
+409.879 352.323 L
+S
+0.25 w
+22.1097 352.323 m
+430.727 352.323 L
+S
+428.173 141.039 m
+430.727 141.039 L
+S
+428.173 183.327 m
+430.727 183.327 L
+S
+428.173 225.615 m
+430.727 225.615 L
+S
+428.173 267.902 m
+430.727 267.902 L
+S
+428.173 310.19 m
+430.727 310.19 L
+S
+0.125 w
+429.195 109.322 m
+430.727 109.322 L
+S
+429.195 119.893 m
+430.727 119.893 L
+S
+429.195 130.464 m
+430.727 130.464 L
+S
+429.195 151.61 m
+430.727 151.61 L
+S
+429.195 162.181 m
+430.727 162.181 L
+S
+429.195 172.756 m
+430.727 172.756 L
+S
+429.195 193.898 m
+430.727 193.898 L
+S
+429.195 204.469 m
+430.727 204.469 L
+S
+429.195 215.044 m
+430.727 215.044 L
+S
+429.195 236.186 m
+430.727 236.186 L
+S
+429.195 246.756 m
+430.727 246.756 L
+S
+429.195 257.331 m
+430.727 257.331 L
+S
+429.195 278.473 m
+430.727 278.473 L
+S
+429.195 289.048 m
+430.727 289.048 L
+S
+429.195 299.619 m
+430.727 299.619 L
+S
+429.195 320.761 m
+430.727 320.761 L
+S
+429.195 331.336 m
+430.727 331.336 L
+S
+429.195 341.907 m
+430.727 341.907 L
+S
+0.25 w
+430.727 99.7849 m
+430.727 352.323 L
+S
+22.1097 225.615 m
+430.727 225.615 L
+S
+1.5 w
+31.8389 105.8 m
+47.6238 139.327 L
+64.8429 170.488 L
+81.0119 195.025 L
+96.5639 214.68 L
+113.117 231.74 L
+129.049 244.787 L
+145.986 255.448 L
+162.302 263.007 L
+177.997 268.139 L
+186.104 270.089 L
+194.697 271.707 L
+202.678 272.847 L
+210.155 273.635 L
+214.397 273.979 L
+218.43 274.244 L
+222.398 274.457 L
+225.998 274.604 L
+229.916 274.73 L
+231.923 274.779 L
+234.092 274.824 L
+236.107 274.857 L
+237.962 274.886 L
+239.866 274.906 L
+241.607 274.918 L
+243.523 274.931 L
+244.581 274.935 L
+245.583 274.939 L
+246.445 274.943 L
+247.36 274.947 L
+248.365 274.947 L
+249.297 274.947 L
+249.816 274.951 L
+250.294 274.951 L
+250.817 274.951 L
+251.083 274.951 L
+251.369 274.951 L
+251.847 274.951 L
+252.296 274.951 L
+252.827 274.951 L
+253.31 274.951 L
+253.587 274.951 L
+253.878 274.951 L
+254.405 274.951 L
+254.695 274.951 L
+254.969 274.951 L
+255.267 274.951 L
+255.59 274.951 L
+255.863 274.951 L
+256.166 274.951 L
+S
+256.166 274.951 m
+256.448 274.951 L
+256.713 274.951 L
+257.212 274.951 L
+257.739 274.951 L
+258.25 274.951 L
+258.81 274.951 L
+259.394 274.951 L
+259.937 274.955 L
+260.91 274.955 L
+261.952 274.959 L
+263.178 274.963 L
+264.338 274.967 L
+266.508 274.98 L
+268.559 274.996 L
+270.459 275.016 L
+272.543 275.045 L
+274.754 275.082 L
+278.591 275.172 L
+282.726 275.307 L
+286.628 275.474 L
+290.2 275.666 L
+297.947 276.238 L
+302.335 276.663 L
+306.414 277.137 L
+314.786 278.367 L
+322.386 279.822 L
+330.906 281.889 L
+338.747 284.243 L
+354.487 290.458 L
+370.607 299.203 L
+386.11 310.243 L
+402.614 325.219 L
+418.501 343.153 L
+420.998 346.312 L
+S
+0.5 g
+0.5 w
+42.9574 129.925 m
+409.879 332.971 L
+S
+215.88 225.615 m
+215.88 274.085 L
+S
+42.9574 129.925 m
+215.88 274.085 L
+S
+157.738 225.615 m
+157.738 261.14 L
+S
+42.9574 129.925 m
+157.738 261.14 L
+S
+126.663 225.615 m
+126.663 243.03 L
+S
+42.9574 129.925 m
+126.663 243.03 L
+S
+113.775 225.615 m
+113.775 232.345 L
+S
+0 g
+42.9574 129.925 2. dot
+409.879 332.971 2. dot
+215.88 274.085 2. dot
+215.88 274.085 2. dot
+157.738 261.14 2. dot
+113.775 232.345 2. dot
+126.663 243.03 2. dot
+44.4574 121.425 m
+(a) show
+50.4574 119.925 m
+F0 7.125 scalefont setfont
+(0) show
+54.7074 119.925 m
+F1 7.125 scalefont setfont
+(-) show
+58.9574 119.925 m
+F0 7.125 scalefont setfont
+(4) show
+397.879 336.471 m
+F0 10. scalefont setfont
+(b) show
+403.879 334.971 m
+F0 7.125 scalefont setfont
+(0) show
+209.88 279.585 m
+F0 10. scalefont setfont
+(b) show
+215.88 278.085 m
+F0 7.125 scalefont setfont
+(1) show
+147.738 266.64 m
+F0 10. scalefont setfont
+(b) show
+153.738 265.14 m
+F0 7.125 scalefont setfont
+(2) show
+116.663 247.53 m
+F0 10. scalefont setfont
+(b) show
+122.663 246.03 m
+F0 7.125 scalefont setfont
+(3) show
+99.7749 232.845 m
+F0 10. scalefont setfont
+(b) show
+105.775 231.345 m
+F0 7.125 scalefont setfont
+(4) show
+gsave
+22.1097 99.7849 m
+430.727 99.7849 L
+430.727 352.323 L
+22.1097 352.323 L
+22.1097 99.7849 L
+closepath clip newpath
+grestore
+showpage
+%%PageTrailer
+%%Trailer
+%%Pages: 1
+%%EOF
diff --git a/gsl-1.9/doc/roots-newtons-method.eps b/gsl-1.9/doc/roots-newtons-method.eps
new file mode 100644
index 0000000..1effb85
--- /dev/null
+++ b/gsl-1.9/doc/roots-newtons-method.eps
@@ -0,0 +1,567 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: Mathematica-PSRender
+%%BoundingBox: 0 79 432 353
+%%Pages: (atend)
+%%EndComments
+%%BeginProlog
+/setrgbcolor dup where
+{ pop pop }
+{ { .114 mul exch .587 mul add exch .299 mul add setgray } bind def }
+ifelse
+/C /curveto load def
+/f /fill load def
+/F { closepath fill } bind def
+/L /lineto load def
+/S /stroke load def
+/s { closepath stroke } bind def
+/d /setdash load def
+/g /setgray load def
+/m /moveto load def
+/r /setrgbcolor load def
+/w /setlinewidth load def
+/b { gsave gsave F grestore 0 g S grestore newpath } bind def
+/dot { newpath 0 360 arc fill } bind def
+%%EndProlog
+%%Page: 1 1
+0 g
+0.25 w
+[ ] 0 d
+64.3977 99.4424 m
+64.3977 102.003 L
+S
+57.8977 83.3205 m
+/F1 /Times-Roman findfont def
+F1 10. scalefont setfont
+(-) show
+64.5227 83.3205 m
+/F0 /Times-Roman findfont def
+F0 10. scalefont setfont
+(3) show
+118.599 99.4424 m
+118.599 102.003 L
+S
+112.099 83.3205 m
+F1 10. scalefont setfont
+(-) show
+118.724 83.3205 m
+F0 10. scalefont setfont
+(2) show
+172.797 99.4424 m
+172.797 102.003 L
+S
+166.297 83.3205 m
+F1 10. scalefont setfont
+(-) show
+172.922 83.3205 m
+F0 10. scalefont setfont
+(1) show
+226.998 99.4424 m
+226.998 102.003 L
+S
+223.998 83.3205 m
+(0) show
+281.2 99.4424 m
+281.2 102.003 L
+S
+278.2 83.3205 m
+(1) show
+335.398 99.4424 m
+335.398 102.003 L
+S
+332.398 83.3205 m
+(2) show
+389.599 99.4424 m
+389.599 102.003 L
+S
+386.599 83.3205 m
+(3) show
+0.125 w
+75.2397 99.4424 m
+75.2397 100.979 L
+S
+86.0776 99.4424 m
+86.0776 100.979 L
+S
+96.9195 99.4424 m
+96.9195 100.979 L
+S
+107.757 99.4424 m
+107.757 100.979 L
+S
+129.437 99.4424 m
+129.437 100.979 L
+S
+140.279 99.4424 m
+140.279 100.979 L
+S
+151.117 99.4424 m
+151.117 100.979 L
+S
+161.959 99.4424 m
+161.959 100.979 L
+S
+183.639 99.4424 m
+183.639 100.979 L
+S
+194.477 99.4424 m
+194.477 100.979 L
+S
+205.319 99.4424 m
+205.319 100.979 L
+S
+216.156 99.4424 m
+216.156 100.979 L
+S
+237.84 99.4424 m
+237.84 100.979 L
+S
+248.678 99.4424 m
+248.678 100.979 L
+S
+259.52 99.4424 m
+259.52 100.979 L
+S
+270.358 99.4424 m
+270.358 100.979 L
+S
+292.038 99.4424 m
+292.038 100.979 L
+S
+302.88 99.4424 m
+302.88 100.979 L
+S
+313.718 99.4424 m
+313.718 100.979 L
+S
+324.56 99.4424 m
+324.56 100.979 L
+S
+346.24 99.4424 m
+346.24 100.979 L
+S
+357.077 99.4424 m
+357.077 100.979 L
+S
+367.919 99.4424 m
+367.919 100.979 L
+S
+378.757 99.4424 m
+378.757 100.979 L
+S
+53.5599 99.4424 m
+53.5599 100.979 L
+S
+42.7179 99.4424 m
+42.7179 100.979 L
+S
+31.8801 99.4424 m
+31.8801 100.979 L
+S
+400.437 99.4424 m
+400.437 100.979 L
+S
+411.279 99.4424 m
+411.279 100.979 L
+S
+422.117 99.4424 m
+422.117 100.979 L
+S
+0.25 w
+22.1239 99.4424 m
+431.873 99.4424 L
+S
+22.1239 121.122 m
+24.6849 121.122 L
+S
+2.00207 117.622 m
+F1 10. scalefont setfont
+(-) show
+8.62707 117.622 m
+F0 10. scalefont setfont
+(4) show
+22.1239 163.097 m
+24.6849 163.097 L
+S
+2.00207 159.597 m
+F1 10. scalefont setfont
+(-) show
+8.62707 159.597 m
+F0 10. scalefont setfont
+(2) show
+22.1239 205.072 m
+24.6849 205.072 L
+S
+9.00207 201.572 m
+(0) show
+22.1239 247.05 m
+24.6849 247.05 L
+S
+9.00207 243.55 m
+(2) show
+22.1239 289.025 m
+24.6849 289.025 L
+S
+9.00207 285.525 m
+(4) show
+22.1239 331.004 m
+24.6849 331.004 L
+S
+9.00207 327.504 m
+(6) show
+0.125 w
+22.1239 131.616 m
+23.6605 131.616 L
+S
+22.1239 142.11 m
+23.6605 142.11 L
+S
+22.1239 152.603 m
+23.6605 152.603 L
+S
+22.1239 173.591 m
+23.6605 173.591 L
+S
+22.1239 184.084 m
+23.6605 184.084 L
+S
+22.1239 194.578 m
+23.6605 194.578 L
+S
+22.1239 215.569 m
+23.6605 215.569 L
+S
+22.1239 226.063 m
+23.6605 226.063 L
+S
+22.1239 236.557 m
+23.6605 236.557 L
+S
+22.1239 257.544 m
+23.6605 257.544 L
+S
+22.1239 268.038 m
+23.6605 268.038 L
+S
+22.1239 278.531 m
+23.6605 278.531 L
+S
+22.1239 299.519 m
+23.6605 299.519 L
+S
+22.1239 310.016 m
+23.6605 310.016 L
+S
+22.1239 320.51 m
+23.6605 320.51 L
+S
+22.1239 110.629 m
+23.6605 110.629 L
+S
+22.1239 100.131 m
+23.6605 100.131 L
+S
+22.1239 341.497 m
+23.6605 341.497 L
+S
+22.1239 351.991 m
+23.6605 351.991 L
+S
+0.25 w
+22.1239 99.4424 m
+22.1239 352.68 L
+S
+64.3977 350.119 m
+64.3977 352.68 L
+S
+118.599 350.119 m
+118.599 352.68 L
+S
+172.797 350.119 m
+172.797 352.68 L
+S
+226.998 350.119 m
+226.998 352.68 L
+S
+281.2 350.119 m
+281.2 352.68 L
+S
+335.398 350.119 m
+335.398 352.68 L
+S
+389.599 350.119 m
+389.599 352.68 L
+S
+0.125 w
+75.2397 351.143 m
+75.2397 352.68 L
+S
+86.0776 351.143 m
+86.0776 352.68 L
+S
+96.9195 351.143 m
+96.9195 352.68 L
+S
+107.757 351.143 m
+107.757 352.68 L
+S
+129.437 351.143 m
+129.437 352.68 L
+S
+140.279 351.143 m
+140.279 352.68 L
+S
+151.117 351.143 m
+151.117 352.68 L
+S
+161.959 351.143 m
+161.959 352.68 L
+S
+183.639 351.143 m
+183.639 352.68 L
+S
+194.477 351.143 m
+194.477 352.68 L
+S
+205.319 351.143 m
+205.319 352.68 L
+S
+216.156 351.143 m
+216.156 352.68 L
+S
+237.84 351.143 m
+237.84 352.68 L
+S
+248.678 351.143 m
+248.678 352.68 L
+S
+259.52 351.143 m
+259.52 352.68 L
+S
+270.358 351.143 m
+270.358 352.68 L
+S
+292.038 351.143 m
+292.038 352.68 L
+S
+302.88 351.143 m
+302.88 352.68 L
+S
+313.718 351.143 m
+313.718 352.68 L
+S
+324.56 351.143 m
+324.56 352.68 L
+S
+346.24 351.143 m
+346.24 352.68 L
+S
+357.077 351.143 m
+357.077 352.68 L
+S
+367.919 351.143 m
+367.919 352.68 L
+S
+378.757 351.143 m
+378.757 352.68 L
+S
+53.5599 351.143 m
+53.5599 352.68 L
+S
+42.7179 351.143 m
+42.7179 352.68 L
+S
+31.8801 351.143 m
+31.8801 352.68 L
+S
+400.437 351.143 m
+400.437 352.68 L
+S
+411.279 351.143 m
+411.279 352.68 L
+S
+422.117 351.143 m
+422.117 352.68 L
+S
+0.25 w
+22.1239 352.68 m
+431.873 352.68 L
+S
+429.312 121.122 m
+431.873 121.122 L
+S
+429.312 163.097 m
+431.873 163.097 L
+S
+429.312 205.072 m
+431.873 205.072 L
+S
+429.312 247.05 m
+431.873 247.05 L
+S
+429.312 289.025 m
+431.873 289.025 L
+S
+429.312 331.004 m
+431.873 331.004 L
+S
+0.125 w
+430.336 131.616 m
+431.873 131.616 L
+S
+430.336 142.11 m
+431.873 142.11 L
+S
+430.336 152.603 m
+431.873 152.603 L
+S
+430.336 173.591 m
+431.873 173.591 L
+S
+430.336 184.084 m
+431.873 184.084 L
+S
+430.336 194.578 m
+431.873 194.578 L
+S
+430.336 215.569 m
+431.873 215.569 L
+S
+430.336 226.063 m
+431.873 226.063 L
+S
+430.336 236.557 m
+431.873 236.557 L
+S
+430.336 257.544 m
+431.873 257.544 L
+S
+430.336 268.038 m
+431.873 268.038 L
+S
+430.336 278.531 m
+431.873 278.531 L
+S
+430.336 299.519 m
+431.873 299.519 L
+S
+430.336 310.016 m
+431.873 310.016 L
+S
+430.336 320.51 m
+431.873 320.51 L
+S
+430.336 110.629 m
+431.873 110.629 L
+S
+430.336 100.131 m
+431.873 100.131 L
+S
+430.336 341.497 m
+431.873 341.497 L
+S
+430.336 351.991 m
+431.873 351.991 L
+S
+0.25 w
+431.873 99.4424 m
+431.873 352.68 L
+S
+22.1239 205.072 m
+431.873 205.072 L
+S
+gsave
+22.1239 99.4424 m
+431.873 99.4424 L
+431.873 352.68 L
+22.1239 352.68 L
+22.1239 99.4424 L
+closepath clip newpath
+1.5 w
+31.8801 105.474 m
+47.7087 129.264 L
+64.9755 151.169 L
+81.1892 168.26 L
+96.7843 181.831 L
+113.383 193.529 L
+129.359 202.449 L
+146.343 209.775 L
+162.705 215.09 L
+178.443 218.913 L
+195.19 221.941 L
+211.313 224.19 L
+226.814 226.038 L
+243.323 228.017 L
+259.209 230.242 L
+276.103 233.328 L
+292.37 237.339 L
+308.022 242.486 L
+324.674 249.693 L
+340.708 258.654 L
+357.745 270.717 L
+374.164 285.173 L
+389.96 302.043 L
+406.759 323.522 L
+422.117 346.652 L
+S
+0.5 g
+0.5 w
+389.599 301.621 m
+306.49 205.072 L
+306.49 241.92 L
+205.843 205.072 L
+205.843 223.477 L
+68.3559 205.072 L
+68.3559 155. L
+113.408 205.072 L
+113.408 193.545 L
+131.81 205.072 L
+131.81 203.633 L
+S
+0 g
+389.599 301.621 2. dot
+379.599 306.121 m
+(g) show
+385.599 304.621 m
+F0 7.125 scalefont setfont
+(0) show
+306.49 241.92 2. dot
+298.49 247.42 m
+F0 10. scalefont setfont
+(g) show
+304.49 245.92 m
+F0 7.125 scalefont setfont
+(1) show
+205.843 223.477 2. dot
+198.843 228.977 m
+F0 10. scalefont setfont
+(g) show
+204.843 227.477 m
+F0 7.125 scalefont setfont
+(2) show
+68.3559 155. 2. dot
+68.3559 146.5 m
+F0 10. scalefont setfont
+(g) show
+74.3559 145. m
+F0 7.125 scalefont setfont
+(3) show
+113.408 193.545 2. dot
+112.408 185.045 m
+F0 10. scalefont setfont
+(g) show
+118.408 183.545 m
+F0 7.125 scalefont setfont
+(4) show
+131.81 203.633 2. dot
+130.81 195.133 m
+F0 10. scalefont setfont
+(g) show
+136.81 193.633 m
+F0 7.125 scalefont setfont
+(5) show
+grestore
+showpage
+%%PageTrailer
+%%Trailer
+%%Pages: 1
+%%EOF
diff --git a/gsl-1.9/doc/roots-secant-method.eps b/gsl-1.9/doc/roots-secant-method.eps
new file mode 100644
index 0000000..79460d2
--- /dev/null
+++ b/gsl-1.9/doc/roots-secant-method.eps
@@ -0,0 +1,510 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: Mathematica-PSRender
+%%BoundingBox: 0 82 432 350
+%%Pages: (atend)
+%%EndComments
+%%BeginProlog
+/setrgbcolor dup where
+{ pop pop }
+{ { .114 mul exch .587 mul add exch .299 mul add setgray } bind def }
+ifelse
+/C /curveto load def
+/f /fill load def
+/F { closepath fill } bind def
+/L /lineto load def
+/S /stroke load def
+/s { closepath stroke } bind def
+/d /setdash load def
+/g /setgray load def
+/m /moveto load def
+/r /setrgbcolor load def
+/w /setlinewidth load def
+/b { gsave gsave F grestore 0 g S grestore newpath } bind def
+/dot { newpath 0 360 arc fill } bind def
+%%EndProlog
+%%Page: 1 1
+0 g
+0.25 w
+[ ] 0 d
+32.8442 96.7414 m
+32.8442 99.2961 L
+S
+29.9067 85.6943 m
+/F0 /Times-Roman findfont def
+F0 10. scalefont setfont
+(0) show
+88.4562 96.7414 m
+88.4562 99.2961 L
+S
+79.5187 85.6943 m
+(0.2) show
+144.072 96.7414 m
+144.072 99.2961 L
+S
+135.322 85.6943 m
+(0.4) show
+199.684 96.7414 m
+199.684 99.2961 L
+S
+190.747 85.6943 m
+(0.6) show
+255.3 96.7414 m
+255.3 99.2961 L
+S
+246.363 85.6943 m
+(0.8) show
+310.912 96.7414 m
+310.912 99.2961 L
+S
+307.537 85.6943 m
+(1) show
+366.528 96.7414 m
+366.528 99.2961 L
+S
+357.372 85.6943 m
+(1.2) show
+422.14 96.7414 m
+422.14 99.2961 L
+S
+413.172 85.6943 m
+(1.4) show
+0.125 w
+46.7462 96.7414 m
+46.7462 98.2742 L
+S
+60.6522 96.7414 m
+60.6522 98.2742 L
+S
+74.5542 96.7414 m
+74.5542 98.2742 L
+S
+102.362 96.7414 m
+102.362 98.2742 L
+S
+116.264 96.7414 m
+116.264 98.2742 L
+S
+130.166 96.7414 m
+130.166 98.2742 L
+S
+157.974 96.7414 m
+157.974 98.2742 L
+S
+171.88 96.7414 m
+171.88 98.2742 L
+S
+185.782 96.7414 m
+185.782 98.2742 L
+S
+213.59 96.7414 m
+213.59 98.2742 L
+S
+227.492 96.7414 m
+227.492 98.2742 L
+S
+241.394 96.7414 m
+241.394 98.2742 L
+S
+269.202 96.7414 m
+269.202 98.2742 L
+S
+283.104 96.7414 m
+283.104 98.2742 L
+S
+297.01 96.7414 m
+297.01 98.2742 L
+S
+324.818 96.7414 m
+324.818 98.2742 L
+S
+338.72 96.7414 m
+338.72 98.2742 L
+S
+352.622 96.7414 m
+352.622 98.2742 L
+S
+380.43 96.7414 m
+380.43 98.2742 L
+S
+394.332 96.7414 m
+394.332 98.2742 L
+S
+408.238 96.7414 m
+408.238 98.2742 L
+S
+0.25 w
+23.1116 96.7414 m
+431.873 96.7414 L
+S
+23.1116 137.389 m
+25.6663 137.389 L
+S
+1.18957 134.389 m
+(-10) show
+23.1116 188.88 m
+25.6663 188.88 L
+S
+13.1896 185.88 m
+(0) show
+23.1116 240.376 m
+25.6663 240.376 L
+S
+7.18957 237.376 m
+(10) show
+23.1116 291.868 m
+25.6663 291.868 L
+S
+7.18957 288.868 m
+(20) show
+23.1116 343.359 m
+25.6663 343.359 L
+S
+7.18957 340.359 m
+(30) show
+0.125 w
+23.1116 147.689 m
+24.6444 147.689 L
+S
+23.1116 157.986 m
+24.6444 157.986 L
+S
+23.1116 168.287 m
+24.6444 168.287 L
+S
+23.1116 178.584 m
+24.6444 178.584 L
+S
+23.1116 199.181 m
+24.6444 199.181 L
+S
+23.1116 209.478 m
+24.6444 209.478 L
+S
+23.1116 219.779 m
+24.6444 219.779 L
+S
+23.1116 230.075 m
+24.6444 230.075 L
+S
+23.1116 250.673 m
+24.6444 250.673 L
+S
+23.1116 260.974 m
+24.6444 260.974 L
+S
+23.1116 271.27 m
+24.6444 271.27 L
+S
+23.1116 281.571 m
+24.6444 281.571 L
+S
+23.1116 302.168 m
+24.6444 302.168 L
+S
+23.1116 312.465 m
+24.6444 312.465 L
+S
+23.1116 322.766 m
+24.6444 322.766 L
+S
+23.1116 333.063 m
+24.6444 333.063 L
+S
+23.1116 127.092 m
+24.6444 127.092 L
+S
+23.1116 116.791 m
+24.6444 116.791 L
+S
+23.1116 106.494 m
+24.6444 106.494 L
+S
+0.25 w
+23.1116 96.7414 m
+23.1116 349.368 L
+S
+32.8442 346.813 m
+32.8442 349.368 L
+S
+88.4562 346.813 m
+88.4562 349.368 L
+S
+144.072 346.813 m
+144.072 349.368 L
+S
+199.684 346.813 m
+199.684 349.368 L
+S
+255.3 346.813 m
+255.3 349.368 L
+S
+310.912 346.813 m
+310.912 349.368 L
+S
+366.528 346.813 m
+366.528 349.368 L
+S
+422.14 346.813 m
+422.14 349.368 L
+S
+0.125 w
+46.7462 347.835 m
+46.7462 349.368 L
+S
+60.6522 347.835 m
+60.6522 349.368 L
+S
+74.5542 347.835 m
+74.5542 349.368 L
+S
+102.362 347.835 m
+102.362 349.368 L
+S
+116.264 347.835 m
+116.264 349.368 L
+S
+130.166 347.835 m
+130.166 349.368 L
+S
+157.974 347.835 m
+157.974 349.368 L
+S
+171.88 347.835 m
+171.88 349.368 L
+S
+185.782 347.835 m
+185.782 349.368 L
+S
+213.59 347.835 m
+213.59 349.368 L
+S
+227.492 347.835 m
+227.492 349.368 L
+S
+241.394 347.835 m
+241.394 349.368 L
+S
+269.202 347.835 m
+269.202 349.368 L
+S
+283.104 347.835 m
+283.104 349.368 L
+S
+297.01 347.835 m
+297.01 349.368 L
+S
+324.818 347.835 m
+324.818 349.368 L
+S
+338.72 347.835 m
+338.72 349.368 L
+S
+352.622 347.835 m
+352.622 349.368 L
+S
+380.43 347.835 m
+380.43 349.368 L
+S
+394.332 347.835 m
+394.332 349.368 L
+S
+408.238 347.835 m
+408.238 349.368 L
+S
+0.25 w
+23.1116 349.368 m
+431.873 349.368 L
+S
+429.318 137.389 m
+431.873 137.389 L
+S
+429.318 188.88 m
+431.873 188.88 L
+S
+429.318 240.376 m
+431.873 240.376 L
+S
+429.318 291.868 m
+431.873 291.868 L
+S
+429.318 343.359 m
+431.873 343.359 L
+S
+0.125 w
+430.34 147.689 m
+431.873 147.689 L
+S
+430.34 157.986 m
+431.873 157.986 L
+S
+430.34 168.287 m
+431.873 168.287 L
+S
+430.34 178.584 m
+431.873 178.584 L
+S
+430.34 199.181 m
+431.873 199.181 L
+S
+430.34 209.478 m
+431.873 209.478 L
+S
+430.34 219.779 m
+431.873 219.779 L
+S
+430.34 230.075 m
+431.873 230.075 L
+S
+430.34 250.673 m
+431.873 250.673 L
+S
+430.34 260.974 m
+431.873 260.974 L
+S
+430.34 271.27 m
+431.873 271.27 L
+S
+430.34 281.571 m
+431.873 281.571 L
+S
+430.34 302.168 m
+431.873 302.168 L
+S
+430.34 312.465 m
+431.873 312.465 L
+S
+430.34 322.766 m
+431.873 322.766 L
+S
+430.34 333.063 m
+431.873 333.063 L
+S
+430.34 127.092 m
+431.873 127.092 L
+S
+430.34 116.791 m
+431.873 116.791 L
+S
+430.34 106.494 m
+431.873 106.494 L
+S
+0.25 w
+431.873 96.7414 m
+431.873 349.368 L
+S
+23.1116 188.88 m
+431.873 188.88 L
+S
+gsave
+23.1116 96.7414 m
+431.873 96.7414 L
+431.873 349.368 L
+23.1116 349.368 L
+23.1116 96.7414 L
+closepath clip newpath
+1.5 w
+46.7462 343.355 m
+48.5774 331.362 L
+50.286 322.459 L
+52.3135 313.896 L
+54.1611 307.523 L
+57.938 297.398 L
+61.9766 289.468 L
+66.0683 283.382 L
+70.5116 278.26 L
+78.5846 271.45 L
+86.4042 266.741 L
+94.6939 262.96 L
+109.605 257.945 L
+125.486 253.926 L
+140.769 250.632 L
+157.018 247.321 L
+172.669 244.067 L
+187.724 240.723 L
+203.743 236.799 L
+219.166 232.569 L
+235.557 227.488 L
+251.352 221.945 L
+266.545 215.932 L
+282.708 208.746 L
+298.273 200.984 L
+313.238 192.686 L
+329.172 182.888 L
+344.508 172.468 L
+360.81 160.255 L
+376.518 147.33 L
+391.626 133.759 L
+407.699 118.046 L
+422.14 102.758 L
+S
+0.5 g
+0.5 w
+60.6522 291.819 m
+170.286 188.88 L
+170.286 244.574 L
+S
+88.4562 265.711 m
+385.916 188.88 L
+385.916 139.02 L
+S
+170.286 244.574 m
+385.916 139.02 L
+S
+284.057 188.88 m
+284.057 208.108 L
+S
+385.916 139.02 m
+284.057 208.108 L
+S
+312.4 188.88 m
+312.4 193.172 L
+S
+0 g
+60.6522 291.819 2. dot
+62.6522 293.319 m
+F0 10. scalefont setfont
+(g) show
+68.6522 291.819 m
+F0 7.125 scalefont setfont
+(0) show
+88.4562 265.711 2. dot
+87.4562 270.211 m
+F0 10. scalefont setfont
+(g) show
+93.4562 268.711 m
+F0 7.125 scalefont setfont
+(1) show
+170.286 244.574 2. dot
+167.286 249.074 m
+F0 10. scalefont setfont
+(g) show
+173.286 247.574 m
+F0 7.125 scalefont setfont
+(2) show
+385.916 139.02 2. dot
+376.916 131.52 m
+F0 10. scalefont setfont
+(g) show
+382.916 130.02 m
+F0 7.125 scalefont setfont
+(3) show
+284.057 208.108 2. dot
+283.057 212.608 m
+F0 10. scalefont setfont
+(g) show
+289.057 211.108 m
+F0 7.125 scalefont setfont
+(4) show
+312.4 193.172 2. dot
+312.4 197.672 m
+F0 10. scalefont setfont
+(g) show
+318.4 196.172 m
+F0 7.125 scalefont setfont
+(5) show
+grestore
+showpage
+%%PageTrailer
+%%Trailer
+%%Pages: 1
+%%EOF
diff --git a/gsl-1.9/doc/roots.texi b/gsl-1.9/doc/roots.texi
new file mode 100644
index 0000000..fdcefe1
--- /dev/null
+++ b/gsl-1.9/doc/roots.texi
@@ -0,0 +1,928 @@
+@cindex root finding
+@cindex zero finding
+@cindex finding roots
+@cindex finding zeros
+@cindex roots
+@cindex solving a nonlinear equation
+@cindex nonlinear equation, solutions of
+
+This chapter describes routines for finding roots of arbitrary
+one-dimensional functions. The library provides low level components
+for a variety of iterative solvers and convergence tests. These can be
+combined by the user to achieve the desired solution, with full access
+to the intermediate steps of the iteration. Each class of methods uses
+the same framework, so that you can switch between solvers at runtime
+without needing to recompile your program. Each instance of a solver
+keeps track of its own state, allowing the solvers to be used in
+multi-threaded programs.
+
+The header file @file{gsl_roots.h} contains prototypes for the root
+finding functions and related declarations.
+
+@menu
+* Root Finding Overview::
+* Root Finding Caveats::
+* Initializing the Solver::
+* Providing the function to solve::
+* Search Bounds and Guesses::
+* Root Finding Iteration::
+* Search Stopping Parameters::
+* Root Bracketing Algorithms::
+* Root Finding Algorithms using Derivatives::
+* Root Finding Examples::
+* Root Finding References and Further Reading::
+@end menu
+
+@node Root Finding Overview
+@section Overview
+@cindex root finding, overview
+
+One-dimensional root finding algorithms can be divided into two classes,
+@dfn{root bracketing} and @dfn{root polishing}. Algorithms which proceed
+by bracketing a root are guaranteed to converge. Bracketing algorithms
+begin with a bounded region known to contain a root. The size of this
+bounded region is reduced, iteratively, until it encloses the root to a
+desired tolerance. This provides a rigorous error estimate for the
+location of the root.
+
+The technique of @dfn{root polishing} attempts to improve an initial
+guess to the root. These algorithms converge only if started ``close
+enough'' to a root, and sacrifice a rigorous error bound for speed. By
+approximating the behavior of a function in the vicinity of a root they
+attempt to find a higher order improvement of an initial guess. When the
+behavior of the function is compatible with the algorithm and a good
+initial guess is available a polishing algorithm can provide rapid
+convergence.
+
+In GSL both types of algorithm are available in similar frameworks. The
+user provides a high-level driver for the algorithms, and the library
+provides the individual functions necessary for each of the steps.
+There are three main phases of the iteration. The steps are,
+
+@itemize @bullet
+@item
+initialize solver state, @var{s}, for algorithm @var{T}
+
+@item
+update @var{s} using the iteration @var{T}
+
+@item
+test @var{s} for convergence, and repeat iteration if necessary
+@end itemize
+
+@noindent
+The state for bracketing solvers is held in a @code{gsl_root_fsolver}
+struct. The updating procedure uses only function evaluations (not
+derivatives). The state for root polishing solvers is held in a
+@code{gsl_root_fdfsolver} struct. The updates require both the function
+and its derivative (hence the name @code{fdf}) to be supplied by the
+user.
+
+@node Root Finding Caveats
+@section Caveats
+@cindex root finding, caveats
+
+Note that root finding functions can only search for one root at a time.
+When there are several roots in the search area, the first root to be
+found will be returned; however it is difficult to predict which of the
+roots this will be. @emph{In most cases, no error will be reported if
+you try to find a root in an area where there is more than one.}
+
+Care must be taken when a function may have a multiple root (such as
+@c{$f(x) = (x-x_0)^2$}
+@math{f(x) = (x-x_0)^2} or
+@c{$f(x) = (x-x_0)^3$}
+@math{f(x) = (x-x_0)^3}).
+It is not possible to use root-bracketing algorithms on
+even-multiplicity roots. For these algorithms the initial interval must
+contain a zero-crossing, where the function is negative at one end of
+the interval and positive at the other end. Roots with even-multiplicity
+do not cross zero, but only touch it instantaneously. Algorithms based
+on root bracketing will still work for odd-multiplicity roots
+(e.g. cubic, quintic, @dots{}).
+Root polishing algorithms generally work with higher multiplicity roots,
+but at a reduced rate of convergence. In these cases the @dfn{Steffenson
+algorithm} can be used to accelerate the convergence of multiple roots.
+
+While it is not absolutely required that @math{f} have a root within the
+search region, numerical root finding functions should not be used
+haphazardly to check for the @emph{existence} of roots. There are better
+ways to do this. Because it is easy to create situations where numerical
+root finders can fail, it is a bad idea to throw a root finder at a
+function you do not know much about. In general it is best to examine
+the function visually by plotting before searching for a root.
+
+@node Initializing the Solver
+@section Initializing the Solver
+
+@deftypefun {gsl_root_fsolver *} gsl_root_fsolver_alloc (const gsl_root_fsolver_type * @var{T})
+This function returns a pointer to a newly allocated instance of a
+solver of type @var{T}. For example, the following code creates an
+instance of a bisection solver,
+
+@example
+const gsl_root_fsolver_type * T
+ = gsl_root_fsolver_bisection;
+gsl_root_fsolver * s
+ = gsl_root_fsolver_alloc (T);
+@end example
+
+If there is insufficient memory to create the solver then the function
+returns a null pointer and the error handler is invoked with an error
+code of @code{GSL_ENOMEM}.
+@end deftypefun
+
+@deftypefun {gsl_root_fdfsolver *} gsl_root_fdfsolver_alloc (const gsl_root_fdfsolver_type * @var{T})
+This function returns a pointer to a newly allocated instance of a
+derivative-based solver of type @var{T}. For example, the following
+code creates an instance of a Newton-Raphson solver,
+
+@example
+const gsl_root_fdfsolver_type * T
+ = gsl_root_fdfsolver_newton;
+gsl_root_fdfsolver * s
+ = gsl_root_fdfsolver_alloc (T);
+@end example
+
+If there is insufficient memory to create the solver then the function
+returns a null pointer and the error handler is invoked with an error
+code of @code{GSL_ENOMEM}.
+@end deftypefun
+
+
+@deftypefun int gsl_root_fsolver_set (gsl_root_fsolver * @var{s}, gsl_function * @var{f}, double @var{x_lower}, double @var{x_upper})
+This function initializes, or reinitializes, an existing solver @var{s}
+to use the function @var{f} and the initial search interval
+[@var{x_lower}, @var{x_upper}].
+@end deftypefun
+
+@deftypefun int gsl_root_fdfsolver_set (gsl_root_fdfsolver * @var{s}, gsl_function_fdf * @var{fdf}, double @var{root})
+This function initializes, or reinitializes, an existing solver @var{s}
+to use the function and derivative @var{fdf} and the initial guess
+@var{root}.
+@end deftypefun
+
+@deftypefun void gsl_root_fsolver_free (gsl_root_fsolver * @var{s})
+@deftypefunx void gsl_root_fdfsolver_free (gsl_root_fdfsolver * @var{s})
+These functions free all the memory associated with the solver @var{s}.
+@end deftypefun
+
+@deftypefun {const char *} gsl_root_fsolver_name (const gsl_root_fsolver * @var{s})
+@deftypefunx {const char *} gsl_root_fdfsolver_name (const gsl_root_fdfsolver * @var{s})
+These functions return a pointer to the name of the solver. For example,
+
+@example
+printf ("s is a '%s' solver\n",
+ gsl_root_fsolver_name (s));
+@end example
+
+@noindent
+would print something like @code{s is a 'bisection' solver}.
+@end deftypefun
+
+@node Providing the function to solve
+@section Providing the function to solve
+@cindex root finding, providing a function to solve
+
+You must provide a continuous function of one variable for the root
+finders to operate on, and, sometimes, its first derivative. In order
+to allow for general parameters the functions are defined by the
+following data types:
+
+@deftp {Data Type} gsl_function
+This data type defines a general function with parameters.
+
+@table @code
+@item double (* function) (double @var{x}, void * @var{params})
+this function should return the value
+@c{$f(x,\hbox{\it params})$}
+@math{f(x,params)} for argument @var{x} and parameters @var{params}
+
+@item void * params
+a pointer to the parameters of the function
+@end table
+@end deftp
+
+Here is an example for the general quadratic function,
+@tex
+\beforedisplay
+$$
+f(x) = a x^2 + b x + c
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+f(x) = a x^2 + b x + c
+@end example
+
+@end ifinfo
+@noindent
+with @math{a = 3}, @math{b = 2}, @math{c = 1}. The following code
+defines a @code{gsl_function} @code{F} which you could pass to a root
+finder:
+
+@example
+struct my_f_params @{ double a; double b; double c; @};
+
+double
+my_f (double x, void * p) @{
+ struct my_f_params * params
+ = (struct my_f_params *)p;
+ double a = (params->a);
+ double b = (params->b);
+ double c = (params->c);
+
+ return (a * x + b) * x + c;
+@}
+
+gsl_function F;
+struct my_f_params params = @{ 3.0, 2.0, 1.0 @};
+
+F.function = &my_f;
+F.params = &params;
+@end example
+
+@noindent
+The function @math{f(x)} can be evaluated using the following macro,
+
+@example
+#define GSL_FN_EVAL(F,x)
+ (*((F)->function))(x,(F)->params)
+@end example
+
+@deftp {Data Type} gsl_function_fdf
+This data type defines a general function with parameters and its first
+derivative.
+
+@table @code
+@item double (* f) (double @var{x}, void * @var{params})
+this function should return the value of
+@c{$f(x,\hbox{\it params})$}
+@math{f(x,params)} for argument @var{x} and parameters @var{params}
+
+@item double (* df) (double @var{x}, void * @var{params})
+this function should return the value of the derivative of @var{f} with
+respect to @var{x},
+@c{$f'(x,\hbox{\it params})$}
+@math{f'(x,params)}, for argument @var{x} and parameters @var{params}
+
+@item void (* fdf) (double @var{x}, void * @var{params}, double * @var{f}, double * @var{d}f)
+this function should set the values of the function @var{f} to
+@c{$f(x,\hbox{\it params})$}
+@math{f(x,params)}
+and its derivative @var{df} to
+@c{$f'(x,\hbox{\it params})$}
+@math{f'(x,params)}
+for argument @var{x} and parameters @var{params}. This function
+provides an optimization of the separate functions for @math{f(x)} and
+@math{f'(x)}---it is always faster to compute the function and its
+derivative at the same time.
+
+@item void * params
+a pointer to the parameters of the function
+@end table
+@end deftp
+
+Here is an example where
+@c{$f(x) = \exp(2x)$}
+@math{f(x) = 2\exp(2x)}:
+
+@example
+double
+my_f (double x, void * params)
+@{
+ return exp (2 * x);
+@}
+
+double
+my_df (double x, void * params)
+@{
+ return 2 * exp (2 * x);
+@}
+
+void
+my_fdf (double x, void * params,
+ double * f, double * df)
+@{
+ double t = exp (2 * x);
+
+ *f = t;
+ *df = 2 * t; /* uses existing value */
+@}
+
+gsl_function_fdf FDF;
+
+FDF.f = &my_f;
+FDF.df = &my_df;
+FDF.fdf = &my_fdf;
+FDF.params = 0;
+@end example
+
+@noindent
+The function @math{f(x)} can be evaluated using the following macro,
+
+@example
+#define GSL_FN_FDF_EVAL_F(FDF,x)
+ (*((FDF)->f))(x,(FDF)->params)
+@end example
+
+@noindent
+The derivative @math{f'(x)} can be evaluated using the following macro,
+
+@example
+#define GSL_FN_FDF_EVAL_DF(FDF,x)
+ (*((FDF)->df))(x,(FDF)->params)
+@end example
+
+@noindent
+and both the function @math{y = f(x)} and its derivative @math{dy = f'(x)}
+can be evaluated at the same time using the following macro,
+
+@example
+#define GSL_FN_FDF_EVAL_F_DF(FDF,x,y,dy)
+ (*((FDF)->fdf))(x,(FDF)->params,(y),(dy))
+@end example
+
+@noindent
+The macro stores @math{f(x)} in its @var{y} argument and @math{f'(x)} in
+its @var{dy} argument---both of these should be pointers to
+@code{double}.
+
+@node Search Bounds and Guesses
+@section Search Bounds and Guesses
+@cindex root finding, search bounds
+@cindex root finding, initial guess
+
+You provide either search bounds or an initial guess; this section
+explains how search bounds and guesses work and how function arguments
+control them.
+
+A guess is simply an @math{x} value which is iterated until it is within
+the desired precision of a root. It takes the form of a @code{double}.
+
+Search bounds are the endpoints of a interval which is iterated until
+the length of the interval is smaller than the requested precision. The
+interval is defined by two values, the lower limit and the upper limit.
+Whether the endpoints are intended to be included in the interval or not
+depends on the context in which the interval is used.
+
+@node Root Finding Iteration
+@section Iteration
+
+The following functions drive the iteration of each algorithm. Each
+function performs one iteration to update the state of any solver of the
+corresponding type. The same functions work for all solvers so that
+different methods can be substituted at runtime without modifications to
+the code.
+
+@deftypefun int gsl_root_fsolver_iterate (gsl_root_fsolver * @var{s})
+@deftypefunx int gsl_root_fdfsolver_iterate (gsl_root_fdfsolver * @var{s})
+These functions perform a single iteration of the solver @var{s}. If the
+iteration encounters an unexpected problem then an error code will be
+returned,
+
+@table @code
+@item GSL_EBADFUNC
+the iteration encountered a singular point where the function or its
+derivative evaluated to @code{Inf} or @code{NaN}.
+
+@item GSL_EZERODIV
+the derivative of the function vanished at the iteration point,
+preventing the algorithm from continuing without a division by zero.
+@end table
+@end deftypefun
+
+The solver maintains a current best estimate of the root at all
+times. The bracketing solvers also keep track of the current best
+interval bounding the root. This information can be accessed with the
+following auxiliary functions,
+
+@deftypefun double gsl_root_fsolver_root (const gsl_root_fsolver * @var{s})
+@deftypefunx double gsl_root_fdfsolver_root (const gsl_root_fdfsolver * @var{s})
+These functions return the current estimate of the root for the solver @var{s}.
+@end deftypefun
+
+@deftypefun double gsl_root_fsolver_x_lower (const gsl_root_fsolver * @var{s})
+@deftypefunx double gsl_root_fsolver_x_upper (const gsl_root_fsolver * @var{s})
+These functions return the current bracketing interval for the solver @var{s}.
+@end deftypefun
+
+@node Search Stopping Parameters
+@section Search Stopping Parameters
+@cindex root finding, stopping parameters
+
+A root finding procedure should stop when one of the following conditions is
+true:
+
+@itemize @bullet
+@item
+A root has been found to within the user-specified precision.
+
+@item
+A user-specified maximum number of iterations has been reached.
+
+@item
+An error has occurred.
+@end itemize
+
+@noindent
+The handling of these conditions is under user control. The functions
+below allow the user to test the precision of the current result in
+several standard ways.
+
+@deftypefun int gsl_root_test_interval (double @var{x_lower}, double @var{x_upper}, double @var{epsabs}, double @var{epsrel})
+This function tests for the convergence of the interval [@var{x_lower},
+@var{x_upper}] with absolute error @var{epsabs} and relative error
+@var{epsrel}. The test returns @code{GSL_SUCCESS} if the following
+condition is achieved,
+@tex
+\beforedisplay
+$$
+|a - b| < \hbox{\it epsabs} + \hbox{\it epsrel\/}\, \min(|a|,|b|)
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+|a - b| < epsabs + epsrel min(|a|,|b|)
+@end example
+
+@end ifinfo
+@noindent
+when the interval @math{x = [a,b]} does not include the origin. If the
+interval includes the origin then @math{\min(|a|,|b|)} is replaced by
+zero (which is the minimum value of @math{|x|} over the interval). This
+ensures that the relative error is accurately estimated for roots close
+to the origin.
+
+This condition on the interval also implies that any estimate of the
+root @math{r} in the interval satisfies the same condition with respect
+to the true root @math{r^*},
+@tex
+\beforedisplay
+$$
+|r - r^*| < \hbox{\it epsabs} + \hbox{\it epsrel\/}\, r^*
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+|r - r^*| < epsabs + epsrel r^*
+@end example
+
+@end ifinfo
+@noindent
+assuming that the true root @math{r^*} is contained within the interval.
+@end deftypefun
+
+@deftypefun int gsl_root_test_delta (double @var{x1}, double @var{x0}, double @var{epsabs}, double @var{epsrel})
+
+This function tests for the convergence of the sequence @dots{}, @var{x0},
+@var{x1} with absolute error @var{epsabs} and relative error
+@var{epsrel}. The test returns @code{GSL_SUCCESS} if the following
+condition is achieved,
+@tex
+\beforedisplay
+$$
+|x_1 - x_0| < \hbox{\it epsabs} + \hbox{\it epsrel\/}\, |x_1|
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+|x_1 - x_0| < epsabs + epsrel |x_1|
+@end example
+
+@end ifinfo
+@noindent
+and returns @code{GSL_CONTINUE} otherwise.
+@end deftypefun
+
+
+@deftypefun int gsl_root_test_residual (double @var{f}, double @var{epsabs})
+This function tests the residual value @var{f} against the absolute
+error bound @var{epsabs}. The test returns @code{GSL_SUCCESS} if the
+following condition is achieved,
+@tex
+\beforedisplay
+$$
+|f| < \hbox{\it epsabs}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+|f| < epsabs
+@end example
+
+@end ifinfo
+@noindent
+and returns @code{GSL_CONTINUE} otherwise. This criterion is suitable
+for situations where the precise location of the root, @math{x}, is
+unimportant provided a value can be found where the residual,
+@math{|f(x)|}, is small enough.
+@end deftypefun
+
+@comment ============================================================
+
+@node Root Bracketing Algorithms
+@section Root Bracketing Algorithms
+
+The root bracketing algorithms described in this section require an
+initial interval which is guaranteed to contain a root---if @math{a}
+and @math{b} are the endpoints of the interval then @math{f(a)} must
+differ in sign from @math{f(b)}. This ensures that the function crosses
+zero at least once in the interval. If a valid initial interval is used
+then these algorithm cannot fail, provided the function is well-behaved.
+
+Note that a bracketing algorithm cannot find roots of even degree, since
+these do not cross the @math{x}-axis.
+
+@deffn {Solver} gsl_root_fsolver_bisection
+
+@cindex bisection algorithm for finding roots
+@cindex root finding, bisection algorithm
+
+The @dfn{bisection algorithm} is the simplest method of bracketing the
+roots of a function. It is the slowest algorithm provided by
+the library, with linear convergence.
+
+On each iteration, the interval is bisected and the value of the
+function at the midpoint is calculated. The sign of this value is used
+to determine which half of the interval does not contain a root. That
+half is discarded to give a new, smaller interval containing the
+root. This procedure can be continued indefinitely until the interval is
+sufficiently small.
+
+At any time the current estimate of the root is taken as the midpoint of
+the interval.
+
+@comment eps file "roots-bisection.eps"
+@comment @iftex
+@comment @sp 1
+@comment @center @image{roots-bisection,3.4in}
+
+@comment @quotation
+@comment Four iterations of bisection, where @math{a_n} is @math{n}th position of
+@comment the beginning of the interval and @math{b_n} is the @math{n}th position
+@comment of the end. The midpoint of each interval is also indicated.
+@comment @end quotation
+@comment @end iftex
+@end deffn
+
+@comment ============================================================
+
+@deffn {Solver} gsl_root_fsolver_falsepos
+@cindex false position algorithm for finding roots
+@cindex root finding, false position algorithm
+
+The @dfn{false position algorithm} is a method of finding roots based on
+linear interpolation. Its convergence is linear, but it is usually
+faster than bisection.
+
+On each iteration a line is drawn between the endpoints @math{(a,f(a))}
+and @math{(b,f(b))} and the point where this line crosses the
+@math{x}-axis taken as a ``midpoint''. The value of the function at
+this point is calculated and its sign is used to determine which side of
+the interval does not contain a root. That side is discarded to give a
+new, smaller interval containing the root. This procedure can be
+continued indefinitely until the interval is sufficiently small.
+
+The best estimate of the root is taken from the linear interpolation of
+the interval on the current iteration.
+
+@comment eps file "roots-false-position.eps"
+@comment @iftex
+@comment @image{roots-false-position,4in}
+@comment @quotation
+@comment Several iterations of false position, where @math{a_n} is @math{n}th
+@comment position of the beginning of the interval and @math{b_n} is the
+@comment @math{n}th position of the end.
+@comment @end quotation
+@comment @end iftex
+@end deffn
+
+@comment ============================================================
+
+@deffn {Solver} gsl_root_fsolver_brent
+@cindex Brent's method for finding roots
+@cindex root finding, Brent's method
+
+The @dfn{Brent-Dekker method} (referred to here as @dfn{Brent's method})
+combines an interpolation strategy with the bisection algorithm. This
+produces a fast algorithm which is still robust.
+
+On each iteration Brent's method approximates the function using an
+interpolating curve. On the first iteration this is a linear
+interpolation of the two endpoints. For subsequent iterations the
+algorithm uses an inverse quadratic fit to the last three points, for
+higher accuracy. The intercept of the interpolating curve with the
+@math{x}-axis is taken as a guess for the root. If it lies within the
+bounds of the current interval then the interpolating point is accepted,
+and used to generate a smaller interval. If the interpolating point is
+not accepted then the algorithm falls back to an ordinary bisection
+step.
+
+The best estimate of the root is taken from the most recent
+interpolation or bisection.
+@end deffn
+
+@comment ============================================================
+
+@node Root Finding Algorithms using Derivatives
+@section Root Finding Algorithms using Derivatives
+
+The root polishing algorithms described in this section require an
+initial guess for the location of the root. There is no absolute
+guarantee of convergence---the function must be suitable for this
+technique and the initial guess must be sufficiently close to the root
+for it to work. When these conditions are satisfied then convergence is
+quadratic.
+
+These algorithms make use of both the function and its derivative.
+
+@deffn {Derivative Solver} gsl_root_fdfsolver_newton
+@cindex Newton's method for finding roots
+@cindex root finding, Newton's method
+
+Newton's Method is the standard root-polishing algorithm. The algorithm
+begins with an initial guess for the location of the root. On each
+iteration, a line tangent to the function @math{f} is drawn at that
+position. The point where this line crosses the @math{x}-axis becomes
+the new guess. The iteration is defined by the following sequence,
+@tex
+\beforedisplay
+$$
+x_{i+1} = x_i - {f(x_i) \over f'(x_i)}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+x_@{i+1@} = x_i - f(x_i)/f'(x_i)
+@end example
+
+@end ifinfo
+@noindent
+Newton's method converges quadratically for single roots, and linearly
+for multiple roots.
+
+@comment eps file "roots-newtons-method.eps"
+@comment @iftex
+@comment @sp 1
+@comment @center @image{roots-newtons-method,3.4in}
+
+@comment @quotation
+@comment Several iterations of Newton's Method, where @math{g_n} is the
+@comment @math{n}th guess.
+@comment @end quotation
+@comment @end iftex
+@end deffn
+
+@comment ============================================================
+
+@deffn {Derivative Solver} gsl_root_fdfsolver_secant
+@cindex secant method for finding roots
+@cindex root finding, secant method
+
+The @dfn{secant method} is a simplified version of Newton's method which does
+not require the computation of the derivative on every step.
+
+On its first iteration the algorithm begins with Newton's method, using
+the derivative to compute a first step,
+@tex
+\beforedisplay
+$$
+x_1 = x_0 - {f(x_0) \over f'(x_0)}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+x_1 = x_0 - f(x_0)/f'(x_0)
+@end example
+
+@end ifinfo
+@noindent
+Subsequent iterations avoid the evaluation of the derivative by
+replacing it with a numerical estimate, the slope of the line through
+the previous two points,
+@tex
+\beforedisplay
+$$
+x_{i+1} = x_i - {f(x_i) \over f'_{est}}
+ ~\hbox{where}~
+ f'_{est} = {f(x_{i}) - f(x_{i-1}) \over x_i - x_{i-1}}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+x_@{i+1@} = x_i f(x_i) / f'_@{est@} where
+ f'_@{est@} = (f(x_i) - f(x_@{i-1@})/(x_i - x_@{i-1@})
+@end example
+
+@end ifinfo
+@noindent
+When the derivative does not change significantly in the vicinity of the
+root the secant method gives a useful saving. Asymptotically the secant
+method is faster than Newton's method whenever the cost of evaluating
+the derivative is more than 0.44 times the cost of evaluating the
+function itself. As with all methods of computing a numerical
+derivative the estimate can suffer from cancellation errors if the
+separation of the points becomes too small.
+
+On single roots, the method has a convergence of order @math{(1 + \sqrt
+5)/2} (approximately @math{1.62}). It converges linearly for multiple
+roots.
+
+@comment eps file "roots-secant-method.eps"
+@comment @iftex
+@comment @tex
+@comment \input epsf
+@comment \medskip
+@comment \centerline{\epsfxsize=5in\epsfbox{roots-secant-method.eps}}
+@comment @end tex
+@comment @quotation
+@comment Several iterations of Secant Method, where @math{g_n} is the @math{n}th
+@comment guess.
+@comment @end quotation
+@comment @end iftex
+@end deffn
+
+@comment ============================================================
+
+@deffn {Derivative Solver} gsl_root_fdfsolver_steffenson
+@cindex Steffenson's method for finding roots
+@cindex root finding, Steffenson's method
+
+The @dfn{Steffenson Method} provides the fastest convergence of all the
+routines. It combines the basic Newton algorithm with an Aitken
+``delta-squared'' acceleration. If the Newton iterates are @math{x_i}
+then the acceleration procedure generates a new sequence @math{R_i},
+@tex
+\beforedisplay
+$$
+R_i = x_i - {(x_{i+1} - x_i)^2 \over (x_{i+2} - 2 x_{i+1} + x_i)}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+R_i = x_i - (x_@{i+1@} - x_i)^2 / (x_@{i+2@} - 2 x_@{i+1@} + x_@{i@})
+@end example
+
+@end ifinfo
+@noindent
+which converges faster than the original sequence under reasonable
+conditions. The new sequence requires three terms before it can produce
+its first value so the method returns accelerated values on the second
+and subsequent iterations. On the first iteration it returns the
+ordinary Newton estimate. The Newton iterate is also returned if the
+denominator of the acceleration term ever becomes zero.
+
+As with all acceleration procedures this method can become unstable if
+the function is not well-behaved.
+@end deffn
+
+@node Root Finding Examples
+@section Examples
+
+For any root finding algorithm we need to prepare the function to be
+solved. For this example we will use the general quadratic equation
+described earlier. We first need a header file (@file{demo_fn.h}) to
+define the function parameters,
+
+@example
+@verbatiminclude examples/demo_fn.h
+@end example
+
+@noindent
+We place the function definitions in a separate file (@file{demo_fn.c}),
+
+@example
+@verbatiminclude examples/demo_fn.c
+@end example
+
+@noindent
+The first program uses the function solver @code{gsl_root_fsolver_brent}
+for Brent's method and the general quadratic defined above to solve the
+following equation,
+@tex
+\beforedisplay
+$$
+x^2 - 5 = 0
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+x^2 - 5 = 0
+@end example
+
+@end ifinfo
+@noindent
+with solution @math{x = \sqrt 5 = 2.236068...}
+
+@example
+@verbatiminclude examples/roots.c
+@end example
+
+@noindent
+Here are the results of the iterations,
+
+@smallexample
+$ ./a.out
+using brent method
+ iter [ lower, upper] root err err(est)
+ 1 [1.0000000, 5.0000000] 1.0000000 -1.2360680 4.0000000
+ 2 [1.0000000, 3.0000000] 3.0000000 +0.7639320 2.0000000
+ 3 [2.0000000, 3.0000000] 2.0000000 -0.2360680 1.0000000
+ 4 [2.2000000, 3.0000000] 2.2000000 -0.0360680 0.8000000
+ 5 [2.2000000, 2.2366300] 2.2366300 +0.0005621 0.0366300
+Converged:
+ 6 [2.2360634, 2.2366300] 2.2360634 -0.0000046 0.0005666
+@end smallexample
+
+@noindent
+If the program is modified to use the bisection solver instead of
+Brent's method, by changing @code{gsl_root_fsolver_brent} to
+@code{gsl_root_fsolver_bisection} the slower convergence of the
+Bisection method can be observed,
+
+@smallexample
+$ ./a.out
+using bisection method
+ iter [ lower, upper] root err err(est)
+ 1 [0.0000000, 2.5000000] 1.2500000 -0.9860680 2.5000000
+ 2 [1.2500000, 2.5000000] 1.8750000 -0.3610680 1.2500000
+ 3 [1.8750000, 2.5000000] 2.1875000 -0.0485680 0.6250000
+ 4 [2.1875000, 2.5000000] 2.3437500 +0.1076820 0.3125000
+ 5 [2.1875000, 2.3437500] 2.2656250 +0.0295570 0.1562500
+ 6 [2.1875000, 2.2656250] 2.2265625 -0.0095055 0.0781250
+ 7 [2.2265625, 2.2656250] 2.2460938 +0.0100258 0.0390625
+ 8 [2.2265625, 2.2460938] 2.2363281 +0.0002601 0.0195312
+ 9 [2.2265625, 2.2363281] 2.2314453 -0.0046227 0.0097656
+ 10 [2.2314453, 2.2363281] 2.2338867 -0.0021813 0.0048828
+ 11 [2.2338867, 2.2363281] 2.2351074 -0.0009606 0.0024414
+Converged:
+ 12 [2.2351074, 2.2363281] 2.2357178 -0.0003502 0.0012207
+@end smallexample
+
+The next program solves the same function using a derivative solver
+instead.
+
+@example
+@verbatiminclude examples/rootnewt.c
+@end example
+
+@noindent
+Here are the results for Newton's method,
+
+@example
+$ ./a.out
+using newton method
+iter root err err(est)
+ 1 3.0000000 +0.7639320 -2.0000000
+ 2 2.3333333 +0.0972654 -0.6666667
+ 3 2.2380952 +0.0020273 -0.0952381
+Converged:
+ 4 2.2360689 +0.0000009 -0.0020263
+@end example
+
+@noindent
+Note that the error can be estimated more accurately by taking the
+difference between the current iterate and next iterate rather than the
+previous iterate. The other derivative solvers can be investigated by
+changing @code{gsl_root_fdfsolver_newton} to
+@code{gsl_root_fdfsolver_secant} or
+@code{gsl_root_fdfsolver_steffenson}.
+
+@node Root Finding References and Further Reading
+@section References and Further Reading
+
+For information on the Brent-Dekker algorithm see the following two
+papers,
+
+@itemize @asis
+@item
+R. P. Brent, ``An algorithm with guaranteed convergence for finding a
+zero of a function'', @cite{Computer Journal}, 14 (1971) 422--425
+
+@item
+J. C. P. Bus and T. J. Dekker, ``Two Efficient Algorithms with Guaranteed
+Convergence for Finding a Zero of a Function'', @cite{ACM Transactions of
+Mathematical Software}, Vol.@: 1 No.@: 4 (1975) 330--345
+@end itemize
+
diff --git a/gsl-1.9/doc/siman-energy.eps b/gsl-1.9/doc/siman-energy.eps
new file mode 100644
index 0000000..82a3392
--- /dev/null
+++ b/gsl-1.9/doc/siman-energy.eps
@@ -0,0 +1,11782 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: GNU libplot drawing library 4.1
+%%Title: PostScript plot
+%%CreationDate: Wed Dec 20 22:05:31 2006
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 1
+%%Pages: 1
+%%PageOrder: Ascend
+%%Orientation: Portrait
+%%BoundingBox: 49 177 500 576
+%%DocumentNeededResources:
+%%DocumentSuppliedResources: procset GNU_libplot 1.0 0
+%%EndComments
+
+%%BeginDefaults
+%%PageResources:
+%%EndDefaults
+
+%%BeginProlog
+%%EndProlog
+
+%%BeginSetup
+/DrawDict 50 dict def
+DrawDict begin
+%%BeginResource procset GNU_libplot 1.0 0
+/none null def
+/numGraphicParameters 17 def
+/stringLimit 65535 def
+/arrowHeight 8 def
+/eoFillRule true def
+
+/Begin { save numGraphicParameters dict begin } def
+/End { end restore } def
+
+/SetB {
+dup type /nulltype eq {
+pop
+false /brushRightArrow idef
+false /brushLeftArrow idef
+true /brushNone idef
+} {
+/brushDashOffset idef
+/brushDashArray idef
+0 ne /brushRightArrow idef
+0 ne /brushLeftArrow idef
+/brushWidth idef
+false /brushNone idef
+} ifelse
+} def
+
+/SetCFg {
+/fgblue idef
+/fggreen idef
+/fgred idef
+} def
+
+/SetCBg {
+/bgblue idef
+/bggreen idef
+/bgred idef
+} def
+
+/SetF {
+/printSize idef
+/printFont idef
+} def
+
+/SetP {
+dup type /nulltype eq {
+pop true /patternNone idef
+} {
+/patternGrayLevel idef
+patternGrayLevel -1 eq {
+/patternString idef
+} if
+false /patternNone idef
+} ifelse
+} def
+
+/BSpl {
+0 begin
+storexyn
+newpath
+n 1 gt {
+0 0 0 0 0 0 1 1 true subspline
+n 2 gt {
+0 0 0 0 1 1 2 2 false subspline
+1 1 n 3 sub {
+/i exch def
+i 1 sub dup i dup i 1 add dup i 2 add dup false subspline
+} for
+n 3 sub dup n 2 sub dup n 1 sub dup 2 copy false subspline
+} if
+n 2 sub dup n 1 sub dup 2 copy 2 copy false subspline
+patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if
+brushNone not { istroke } if
+0 0 1 1 leftarrow
+n 2 sub dup 1 sub dup rightarrow
+} if
+end
+} dup 0 4 dict put def
+
+/Circ {
+newpath
+0 360 arc
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+} def
+
+/CBSpl {
+0 begin
+dup 2 gt {
+storexyn
+newpath
+n 1 sub dup 0 0 1 1 2 2 true subspline
+1 1 n 3 sub {
+/i exch def
+i 1 sub dup i dup i 1 add dup i 2 add dup false subspline
+} for
+n 3 sub dup n 2 sub dup n 1 sub dup 0 0 false subspline
+n 2 sub dup n 1 sub dup 0 0 1 1 false subspline
+patternNone not { ifill } if
+brushNone not { istroke } if
+} {
+Poly
+} ifelse
+end
+} dup 0 4 dict put def
+
+/Elli {
+0 begin
+newpath
+4 2 roll
+translate
+scale
+0 0 1 0 360 arc
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+end
+} dup 0 1 dict put def
+
+/Line {
+0 begin
+2 storexyn
+newpath
+x 0 get y 0 get moveto
+x 1 get y 1 get lineto
+brushNone not { istroke } if
+0 0 1 1 leftarrow
+0 0 1 1 rightarrow
+end
+} dup 0 4 dict put def
+
+/MLine {
+0 begin
+storexyn
+newpath
+n 1 gt {
+x 0 get y 0 get moveto
+1 1 n 1 sub {
+/i exch def
+x i get y i get lineto
+} for
+patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if
+brushNone not { istroke } if
+0 0 1 1 leftarrow
+n 2 sub dup n 1 sub dup rightarrow
+} if
+end
+} dup 0 4 dict put def
+
+/Poly {
+3 1 roll
+newpath
+moveto
+-1 add
+{ lineto } repeat
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+} def
+
+/Rect {
+0 begin
+/t exch def
+/r exch def
+/b exch def
+/l exch def
+newpath
+l b moveto
+l t lineto
+r t lineto
+r b lineto
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+end
+} dup 0 4 dict put def
+
+/Text {
+ishow
+} def
+
+/idef {
+dup where { pop pop pop } { exch def } ifelse
+} def
+
+/ifill {
+0 begin
+gsave
+patternGrayLevel -1 ne {
+fgred bgred fgred sub patternGrayLevel mul add
+fggreen bggreen fggreen sub patternGrayLevel mul add
+fgblue bgblue fgblue sub patternGrayLevel mul add setrgbcolor
+eoFillRule { eofill } { fill } ifelse
+} {
+eoFillRule { eoclip } { clip } ifelse
+originalCTM setmatrix
+pathbbox /t exch def /r exch def /b exch def /l exch def
+/w r l sub ceiling cvi def
+/h t b sub ceiling cvi def
+/imageByteWidth w 8 div ceiling cvi def
+/imageHeight h def
+bgred bggreen bgblue setrgbcolor
+eoFillRule { eofill } { fill } ifelse
+fgred fggreen fgblue setrgbcolor
+w 0 gt h 0 gt and {
+l b translate w h scale
+w h true [w 0 0 h neg 0 h] { patternproc } imagemask
+} if
+} ifelse
+grestore
+end
+} dup 0 8 dict put def
+
+/istroke {
+gsave
+brushDashOffset -1 eq {
+[] 0 setdash
+1 setgray
+} {
+brushDashArray brushDashOffset setdash
+fgred fggreen fgblue setrgbcolor
+} ifelse
+brushWidth setlinewidth
+originalCTM setmatrix
+stroke
+grestore
+} def
+
+/ishow {
+0 begin
+gsave
+fgred fggreen fgblue setrgbcolor
+/fontDict printFont findfont printSize scalefont dup setfont def
+/descender fontDict begin 0 /FontBBox load 1 get FontMatrix end
+transform exch pop def
+/vertoffset 1 printSize sub descender sub def {
+0 vertoffset moveto show
+/vertoffset vertoffset printSize sub def
+} forall
+grestore
+end
+} dup 0 3 dict put def
+
+/patternproc {
+0 begin
+/patternByteLength patternString length def
+/patternHeight patternByteLength 8 mul sqrt cvi def
+/patternWidth patternHeight def
+/patternByteWidth patternWidth 8 idiv def
+/imageByteMaxLength imageByteWidth imageHeight mul
+stringLimit patternByteWidth sub min def
+/imageMaxHeight imageByteMaxLength imageByteWidth idiv patternHeight idiv
+patternHeight mul patternHeight max def
+/imageHeight imageHeight imageMaxHeight sub store
+/imageString imageByteWidth imageMaxHeight mul patternByteWidth add string def
+0 1 imageMaxHeight 1 sub {
+/y exch def
+/patternRow y patternByteWidth mul patternByteLength mod def
+/patternRowString patternString patternRow patternByteWidth getinterval def
+/imageRow y imageByteWidth mul def
+0 patternByteWidth imageByteWidth 1 sub {
+/x exch def
+imageString imageRow x add patternRowString putinterval
+} for
+} for
+imageString
+end
+} dup 0 12 dict put def
+
+/min {
+dup 3 2 roll dup 4 3 roll lt { exch } if pop
+} def
+
+/max {
+dup 3 2 roll dup 4 3 roll gt { exch } if pop
+} def
+
+/midpoint {
+0 begin
+/y1 exch def
+/x1 exch def
+/y0 exch def
+/x0 exch def
+x0 x1 add 2 div
+y0 y1 add 2 div
+end
+} dup 0 4 dict put def
+
+/thirdpoint {
+0 begin
+/y1 exch def
+/x1 exch def
+/y0 exch def
+/x0 exch def
+x0 2 mul x1 add 3 div
+y0 2 mul y1 add 3 div
+end
+} dup 0 4 dict put def
+
+/subspline {
+0 begin
+/movetoNeeded exch def
+y exch get /y3 exch def
+x exch get /x3 exch def
+y exch get /y2 exch def
+x exch get /x2 exch def
+y exch get /y1 exch def
+x exch get /x1 exch def
+y exch get /y0 exch def
+x exch get /x0 exch def
+x1 y1 x2 y2 thirdpoint
+/p1y exch def
+/p1x exch def
+x2 y2 x1 y1 thirdpoint
+/p2y exch def
+/p2x exch def
+x1 y1 x0 y0 thirdpoint
+p1x p1y midpoint
+/p0y exch def
+/p0x exch def
+x2 y2 x3 y3 thirdpoint
+p2x p2y midpoint
+/p3y exch def
+/p3x exch def
+movetoNeeded { p0x p0y moveto } if
+p1x p1y p2x p2y p3x p3y curveto
+end
+} dup 0 17 dict put def
+
+/storexyn {
+/n exch def
+/y n array def
+/x n array def
+n 1 sub -1 0 {
+/i exch def
+y i 3 2 roll put
+x i 3 2 roll put
+} for
+} def
+
+/arrowhead {
+0 begin
+transform originalCTM itransform
+/taily exch def
+/tailx exch def
+transform originalCTM itransform
+/tipy exch def
+/tipx exch def
+/dy tipy taily sub def
+/dx tipx tailx sub def
+/angle dx 0 ne dy 0 ne or { dy dx atan } { 90 } ifelse def
+gsave
+originalCTM setmatrix
+tipx tipy translate
+angle rotate
+newpath
+arrowHeight neg arrowWidth 2 div moveto
+0 0 lineto
+arrowHeight neg arrowWidth 2 div neg lineto
+patternNone not {
+originalCTM setmatrix
+/padtip arrowHeight 2 exp 0.25 arrowWidth 2 exp mul add sqrt brushWidth mul
+arrowWidth div def
+/padtail brushWidth 2 div def
+tipx tipy translate
+angle rotate
+padtip 0 translate
+arrowHeight padtip add padtail add arrowHeight div dup scale
+arrowheadpath
+ifill
+} if
+brushNone not {
+originalCTM setmatrix
+tipx tipy translate
+angle rotate
+arrowheadpath
+istroke
+} if
+grestore
+end
+} dup 0 9 dict put def
+
+/arrowheadpath {
+newpath
+arrowHeight neg arrowWidth 2 div moveto
+0 0 lineto
+arrowHeight neg arrowWidth 2 div neg lineto
+} def
+
+/leftarrow {
+0 begin
+y exch get /taily exch def
+x exch get /tailx exch def
+y exch get /tipy exch def
+x exch get /tipx exch def
+brushLeftArrow { tipx tipy tailx taily arrowhead } if
+end
+} dup 0 4 dict put def
+
+/rightarrow {
+0 begin
+y exch get /tipy exch def
+x exch get /tipx exch def
+y exch get /taily exch def
+x exch get /tailx exch def
+brushRightArrow { tipx tipy tailx taily arrowhead } if
+end
+} dup 0 4 dict put def
+%%EndResource
+%%EndSetup
+
+%%Page: 1 1
+%%PageResources:
+%%PageBoundingBox: 49 177 500 576
+%%BeginPageSetup
+%I Idraw 8
+
+Begin
+%I b u
+%I cfg u
+%I cbg u
+%I f u
+%I p u
+%I t
+[ 1 0 0 1 0 0 ] concat
+/originalCTM matrix currentmatrix def
+/trueoriginalCTM matrix currentmatrix def
+%%EndPageSetup
+
+Begin %I Rect
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+2304 2304 9216 9216 Rect
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+2315 2151
+2348 2140
+2370 2107
+2381 2052
+2381 2019
+2370 1964
+2348 1931
+2315 1920
+2293 1920
+2260 1931
+2238 1964
+2227 2019
+2227 2052
+2238 2107
+2260 2140
+2293 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+2293 2151
+2271 2140
+2260 2129
+2249 2107
+2238 2052
+2238 2019
+2249 1964
+2260 1942
+2271 1931
+2293 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+2315 1920
+2337 1931
+2348 1942
+2359 1964
+2370 2019
+2370 2052
+2359 2107
+2348 2129
+2337 2140
+2315 2151
+10 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 9216
+2304 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2304 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3181 2151
+3159 2041
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 19
+3159 2041
+3181 2063
+3214 2074
+3247 2074
+3280 2063
+3302 2041
+3313 2008
+3313 1986
+3302 1953
+3280 1931
+3247 1920
+3214 1920
+3181 1931
+3170 1942
+3159 1964
+3159 1975
+3170 1986
+3181 1975
+3170 1964
+19 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+3247 2074
+3269 2063
+3291 2041
+3302 2008
+3302 1986
+3291 1953
+3269 1931
+3247 1920
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3181 2151
+3291 2151
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+3181 2140
+3236 2140
+3291 2151
+3 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+3467 2151
+3500 2140
+3522 2107
+3533 2052
+3533 2019
+3522 1964
+3500 1931
+3467 1920
+3445 1920
+3412 1931
+3390 1964
+3379 2019
+3379 2052
+3390 2107
+3412 2140
+3445 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+3445 2151
+3423 2140
+3412 2129
+3401 2107
+3390 2052
+3390 2019
+3401 1964
+3412 1942
+3423 1931
+3445 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+3467 1920
+3489 1931
+3500 1942
+3511 1964
+3522 2019
+3522 2052
+3511 2107
+3500 2129
+3489 2140
+3467 2151
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+3687 2151
+3720 2140
+3742 2107
+3753 2052
+3753 2019
+3742 1964
+3720 1931
+3687 1920
+3665 1920
+3632 1931
+3610 1964
+3599 2019
+3599 2052
+3610 2107
+3632 2140
+3665 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+3665 2151
+3643 2140
+3632 2129
+3621 2107
+3610 2052
+3610 2019
+3621 1964
+3632 1942
+3643 1931
+3665 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+3687 1920
+3709 1931
+3720 1942
+3731 1964
+3742 2019
+3742 2052
+3731 2107
+3720 2129
+3709 2140
+3687 2151
+10 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3456 9216
+3456 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3456 2304
+3456 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+4234 2107
+4256 2118
+4289 2151
+4289 1920
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4278 2140
+4278 1920
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4234 1920
+4333 1920
+2 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+4509 2151
+4542 2140
+4564 2107
+4575 2052
+4575 2019
+4564 1964
+4542 1931
+4509 1920
+4487 1920
+4454 1931
+4432 1964
+4421 2019
+4421 2052
+4432 2107
+4454 2140
+4487 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+4487 2151
+4465 2140
+4454 2129
+4443 2107
+4432 2052
+4432 2019
+4443 1964
+4454 1942
+4465 1931
+4487 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+4509 1920
+4531 1931
+4542 1942
+4553 1964
+4564 2019
+4564 2052
+4553 2107
+4542 2129
+4531 2140
+4509 2151
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+4729 2151
+4762 2140
+4784 2107
+4795 2052
+4795 2019
+4784 1964
+4762 1931
+4729 1920
+4707 1920
+4674 1931
+4652 1964
+4641 2019
+4641 2052
+4652 2107
+4674 2140
+4707 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+4707 2151
+4685 2140
+4674 2129
+4663 2107
+4652 2052
+4652 2019
+4663 1964
+4674 1942
+4685 1931
+4707 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+4729 1920
+4751 1931
+4762 1942
+4773 1964
+4784 2019
+4784 2052
+4773 2107
+4762 2129
+4751 2140
+4729 2151
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+4949 2151
+4982 2140
+5004 2107
+5015 2052
+5015 2019
+5004 1964
+4982 1931
+4949 1920
+4927 1920
+4894 1931
+4872 1964
+4861 2019
+4861 2052
+4872 2107
+4894 2140
+4927 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+4927 2151
+4905 2140
+4894 2129
+4883 2107
+4872 2052
+4872 2019
+4883 1964
+4894 1942
+4905 1931
+4927 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+4949 1920
+4971 1931
+4982 1942
+4993 1964
+5004 2019
+5004 2052
+4993 2107
+4982 2129
+4971 2140
+4949 2151
+10 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4608 9216
+4608 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4608 2304
+4608 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+5386 2107
+5408 2118
+5441 2151
+5441 1920
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5430 2140
+5430 1920
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5386 1920
+5485 1920
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5595 2151
+5573 2041
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 19
+5573 2041
+5595 2063
+5628 2074
+5661 2074
+5694 2063
+5716 2041
+5727 2008
+5727 1986
+5716 1953
+5694 1931
+5661 1920
+5628 1920
+5595 1931
+5584 1942
+5573 1964
+5573 1975
+5584 1986
+5595 1975
+5584 1964
+19 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+5661 2074
+5683 2063
+5705 2041
+5716 2008
+5716 1986
+5705 1953
+5683 1931
+5661 1920
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5595 2151
+5705 2151
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+5595 2140
+5650 2140
+5705 2151
+3 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+5881 2151
+5914 2140
+5936 2107
+5947 2052
+5947 2019
+5936 1964
+5914 1931
+5881 1920
+5859 1920
+5826 1931
+5804 1964
+5793 2019
+5793 2052
+5804 2107
+5826 2140
+5859 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+5859 2151
+5837 2140
+5826 2129
+5815 2107
+5804 2052
+5804 2019
+5815 1964
+5826 1942
+5837 1931
+5859 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+5881 1920
+5903 1931
+5914 1942
+5925 1964
+5936 2019
+5936 2052
+5925 2107
+5914 2129
+5903 2140
+5881 2151
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+6101 2151
+6134 2140
+6156 2107
+6167 2052
+6167 2019
+6156 1964
+6134 1931
+6101 1920
+6079 1920
+6046 1931
+6024 1964
+6013 2019
+6013 2052
+6024 2107
+6046 2140
+6079 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+6079 2151
+6057 2140
+6046 2129
+6035 2107
+6024 2052
+6024 2019
+6035 1964
+6046 1942
+6057 1931
+6079 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+6101 1920
+6123 1931
+6134 1942
+6145 1964
+6156 2019
+6156 2052
+6145 2107
+6134 2129
+6123 2140
+6101 2151
+10 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5760 9216
+5760 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5760 2304
+5760 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 20
+6516 2107
+6527 2096
+6516 2085
+6505 2096
+6505 2107
+6516 2129
+6527 2140
+6560 2151
+6604 2151
+6637 2140
+6648 2129
+6659 2107
+6659 2085
+6648 2063
+6615 2041
+6560 2019
+6538 2008
+6516 1986
+6505 1953
+6505 1920
+20 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+6604 2151
+6626 2140
+6637 2129
+6648 2107
+6648 2085
+6637 2063
+6604 2041
+6560 2019
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+6505 1942
+6516 1953
+6538 1953
+6593 1931
+6626 1931
+6648 1942
+6659 1953
+7 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+6538 1953
+6593 1920
+6637 1920
+6648 1931
+6659 1953
+6659 1975
+6 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+6813 2151
+6846 2140
+6868 2107
+6879 2052
+6879 2019
+6868 1964
+6846 1931
+6813 1920
+6791 1920
+6758 1931
+6736 1964
+6725 2019
+6725 2052
+6736 2107
+6758 2140
+6791 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+6791 2151
+6769 2140
+6758 2129
+6747 2107
+6736 2052
+6736 2019
+6747 1964
+6758 1942
+6769 1931
+6791 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+6813 1920
+6835 1931
+6846 1942
+6857 1964
+6868 2019
+6868 2052
+6857 2107
+6846 2129
+6835 2140
+6813 2151
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+7033 2151
+7066 2140
+7088 2107
+7099 2052
+7099 2019
+7088 1964
+7066 1931
+7033 1920
+7011 1920
+6978 1931
+6956 1964
+6945 2019
+6945 2052
+6956 2107
+6978 2140
+7011 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+7011 2151
+6989 2140
+6978 2129
+6967 2107
+6956 2052
+6956 2019
+6967 1964
+6978 1942
+6989 1931
+7011 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+7033 1920
+7055 1931
+7066 1942
+7077 1964
+7088 2019
+7088 2052
+7077 2107
+7066 2129
+7055 2140
+7033 2151
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+7253 2151
+7286 2140
+7308 2107
+7319 2052
+7319 2019
+7308 1964
+7286 1931
+7253 1920
+7231 1920
+7198 1931
+7176 1964
+7165 2019
+7165 2052
+7176 2107
+7198 2140
+7231 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+7231 2151
+7209 2140
+7198 2129
+7187 2107
+7176 2052
+7176 2019
+7187 1964
+7198 1942
+7209 1931
+7231 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+7253 1920
+7275 1931
+7286 1942
+7297 1964
+7308 2019
+7308 2052
+7297 2107
+7286 2129
+7275 2140
+7253 2151
+10 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6912 9216
+6912 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6912 2304
+6912 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 20
+7668 2107
+7679 2096
+7668 2085
+7657 2096
+7657 2107
+7668 2129
+7679 2140
+7712 2151
+7756 2151
+7789 2140
+7800 2129
+7811 2107
+7811 2085
+7800 2063
+7767 2041
+7712 2019
+7690 2008
+7668 1986
+7657 1953
+7657 1920
+20 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+7756 2151
+7778 2140
+7789 2129
+7800 2107
+7800 2085
+7789 2063
+7756 2041
+7712 2019
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+7657 1942
+7668 1953
+7690 1953
+7745 1931
+7778 1931
+7800 1942
+7811 1953
+7 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+7690 1953
+7745 1920
+7789 1920
+7800 1931
+7811 1953
+7811 1975
+6 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7899 2151
+7877 2041
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 19
+7877 2041
+7899 2063
+7932 2074
+7965 2074
+7998 2063
+8020 2041
+8031 2008
+8031 1986
+8020 1953
+7998 1931
+7965 1920
+7932 1920
+7899 1931
+7888 1942
+7877 1964
+7877 1975
+7888 1986
+7899 1975
+7888 1964
+19 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+7965 2074
+7987 2063
+8009 2041
+8020 2008
+8020 1986
+8009 1953
+7987 1931
+7965 1920
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7899 2151
+8009 2151
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+7899 2140
+7954 2140
+8009 2151
+3 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+8185 2151
+8218 2140
+8240 2107
+8251 2052
+8251 2019
+8240 1964
+8218 1931
+8185 1920
+8163 1920
+8130 1931
+8108 1964
+8097 2019
+8097 2052
+8108 2107
+8130 2140
+8163 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+8163 2151
+8141 2140
+8130 2129
+8119 2107
+8108 2052
+8108 2019
+8119 1964
+8130 1942
+8141 1931
+8163 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+8185 1920
+8207 1931
+8218 1942
+8229 1964
+8240 2019
+8240 2052
+8229 2107
+8218 2129
+8207 2140
+8185 2151
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+8405 2151
+8438 2140
+8460 2107
+8471 2052
+8471 2019
+8460 1964
+8438 1931
+8405 1920
+8383 1920
+8350 1931
+8328 1964
+8317 2019
+8317 2052
+8328 2107
+8350 2140
+8383 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+8383 2151
+8361 2140
+8350 2129
+8339 2107
+8328 2052
+8328 2019
+8339 1964
+8350 1942
+8361 1931
+8383 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+8405 1920
+8427 1931
+8438 1942
+8449 1964
+8460 2019
+8460 2052
+8449 2107
+8438 2129
+8427 2140
+8405 2151
+10 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8064 9216
+8064 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8064 2304
+8064 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+8820 2107
+8831 2096
+8820 2085
+8809 2096
+8809 2107
+8820 2129
+8831 2140
+8864 2151
+8908 2151
+8941 2140
+8952 2118
+8952 2085
+8941 2063
+8908 2052
+8875 2052
+15 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+8908 2151
+8930 2140
+8941 2118
+8941 2085
+8930 2063
+8908 2052
+6 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+8908 2052
+8930 2041
+8952 2019
+8963 1997
+8963 1964
+8952 1942
+8941 1931
+8908 1920
+8864 1920
+8831 1931
+8820 1942
+8809 1964
+8809 1975
+8820 1986
+8831 1975
+8820 1964
+16 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+8941 2030
+8952 1997
+8952 1964
+8941 1942
+8930 1931
+8908 1920
+6 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+9117 2151
+9150 2140
+9172 2107
+9183 2052
+9183 2019
+9172 1964
+9150 1931
+9117 1920
+9095 1920
+9062 1931
+9040 1964
+9029 2019
+9029 2052
+9040 2107
+9062 2140
+9095 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+9095 2151
+9073 2140
+9062 2129
+9051 2107
+9040 2052
+9040 2019
+9051 1964
+9062 1942
+9073 1931
+9095 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+9117 1920
+9139 1931
+9150 1942
+9161 1964
+9172 2019
+9172 2052
+9161 2107
+9150 2129
+9139 2140
+9117 2151
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+9337 2151
+9370 2140
+9392 2107
+9403 2052
+9403 2019
+9392 1964
+9370 1931
+9337 1920
+9315 1920
+9282 1931
+9260 1964
+9249 2019
+9249 2052
+9260 2107
+9282 2140
+9315 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+9315 2151
+9293 2140
+9282 2129
+9271 2107
+9260 2052
+9260 2019
+9271 1964
+9282 1942
+9293 1931
+9315 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+9337 1920
+9359 1931
+9370 1942
+9381 1964
+9392 2019
+9392 2052
+9381 2107
+9370 2129
+9359 2140
+9337 2151
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+9557 2151
+9590 2140
+9612 2107
+9623 2052
+9623 2019
+9612 1964
+9590 1931
+9557 1920
+9535 1920
+9502 1931
+9480 1964
+9469 2019
+9469 2052
+9480 2107
+9502 2140
+9535 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+9535 2151
+9513 2140
+9502 2129
+9491 2107
+9480 2052
+9480 2019
+9491 1964
+9502 1942
+9513 1931
+9535 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+9557 1920
+9579 1931
+9590 1942
+9601 1964
+9612 2019
+9612 2052
+9601 2107
+9590 2129
+9579 2140
+9557 2151
+10 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 9216
+9216 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2304
+9216 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1189 2304
+1387 2304
+2 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+1552 2436
+1585 2425
+1607 2392
+1618 2337
+1618 2304
+1607 2249
+1585 2216
+1552 2205
+1530 2205
+1497 2216
+1475 2249
+1464 2304
+1464 2337
+1475 2392
+1497 2425
+1530 2436
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+1530 2436
+1508 2425
+1497 2414
+1486 2392
+1475 2337
+1475 2304
+1486 2249
+1497 2227
+1508 2216
+1530 2205
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+1552 2205
+1574 2216
+1585 2227
+1596 2249
+1607 2304
+1607 2337
+1596 2392
+1585 2414
+1574 2425
+1552 2436
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+1716 2216
+1705 2205
+1694 2216
+1705 2227
+4 Poly
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 12
+1892 2436
+1925 2425
+1936 2403
+1936 2370
+1925 2348
+1892 2337
+1848 2337
+1815 2348
+1804 2370
+1804 2403
+1815 2425
+1848 2436
+12 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+1848 2436
+1826 2425
+1815 2403
+1815 2370
+1826 2348
+1848 2337
+6 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+1892 2337
+1914 2348
+1925 2370
+1925 2403
+1914 2425
+1892 2436
+6 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+1848 2337
+1815 2326
+1804 2315
+1793 2293
+1793 2249
+1804 2227
+1815 2216
+1848 2205
+1892 2205
+1925 2216
+1936 2227
+1947 2249
+1947 2293
+1936 2315
+1925 2326
+1892 2337
+16 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+1848 2337
+1826 2326
+1815 2315
+1804 2293
+1804 2249
+1815 2227
+1826 2216
+1848 2205
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+1892 2205
+1914 2216
+1925 2227
+1936 2249
+1936 2293
+1925 2315
+1914 2326
+1892 2337
+8 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 12
+2112 2436
+2145 2425
+2156 2403
+2156 2370
+2145 2348
+2112 2337
+2068 2337
+2035 2348
+2024 2370
+2024 2403
+2035 2425
+2068 2436
+12 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2068 2436
+2046 2425
+2035 2403
+2035 2370
+2046 2348
+2068 2337
+6 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2112 2337
+2134 2348
+2145 2370
+2145 2403
+2134 2425
+2112 2436
+6 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+2068 2337
+2035 2326
+2024 2315
+2013 2293
+2013 2249
+2024 2227
+2035 2216
+2068 2205
+2112 2205
+2145 2216
+2156 2227
+2167 2249
+2167 2293
+2156 2315
+2145 2326
+2112 2337
+16 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+2068 2337
+2046 2326
+2035 2315
+2024 2293
+2024 2249
+2035 2227
+2046 2216
+2068 2205
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+2112 2205
+2134 2216
+2145 2227
+2156 2249
+2156 2293
+2145 2315
+2134 2326
+2112 2337
+8 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2304
+9078 2304
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2442 2304
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1189 3686
+1387 3686
+2 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+1552 3818
+1585 3807
+1607 3774
+1618 3719
+1618 3686
+1607 3631
+1585 3598
+1552 3587
+1530 3587
+1497 3598
+1475 3631
+1464 3686
+1464 3719
+1475 3774
+1497 3807
+1530 3818
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+1530 3818
+1508 3807
+1497 3796
+1486 3774
+1475 3719
+1475 3686
+1486 3631
+1497 3609
+1508 3598
+1530 3587
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+1552 3587
+1574 3598
+1585 3609
+1596 3631
+1607 3686
+1607 3719
+1596 3774
+1585 3796
+1574 3807
+1552 3818
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+1716 3598
+1705 3587
+1694 3598
+1705 3609
+4 Poly
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 12
+1892 3818
+1925 3807
+1936 3785
+1936 3752
+1925 3730
+1892 3719
+1848 3719
+1815 3730
+1804 3752
+1804 3785
+1815 3807
+1848 3818
+12 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+1848 3818
+1826 3807
+1815 3785
+1815 3752
+1826 3730
+1848 3719
+6 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+1892 3719
+1914 3730
+1925 3752
+1925 3785
+1914 3807
+1892 3818
+6 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+1848 3719
+1815 3708
+1804 3697
+1793 3675
+1793 3631
+1804 3609
+1815 3598
+1848 3587
+1892 3587
+1925 3598
+1936 3609
+1947 3631
+1947 3675
+1936 3697
+1925 3708
+1892 3719
+16 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+1848 3719
+1826 3708
+1815 3697
+1804 3675
+1804 3631
+1815 3609
+1826 3598
+1848 3587
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+1892 3587
+1914 3598
+1925 3609
+1936 3631
+1936 3675
+1925 3697
+1914 3708
+1892 3719
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2013 3818
+2013 3752
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+2013 3774
+2024 3796
+2046 3818
+2068 3818
+2123 3785
+2145 3785
+2156 3796
+2167 3818
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+2024 3796
+2046 3807
+2068 3807
+2123 3785
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+2167 3818
+2167 3785
+2156 3752
+2112 3697
+2101 3675
+2090 3642
+2090 3587
+7 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 5
+2156 3752
+2101 3697
+2090 3675
+2079 3642
+2079 3587
+5 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 3686
+9078 3686
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3686
+2442 3686
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1189 5069
+1387 5069
+2 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+1552 5201
+1585 5190
+1607 5157
+1618 5102
+1618 5069
+1607 5014
+1585 4981
+1552 4970
+1530 4970
+1497 4981
+1475 5014
+1464 5069
+1464 5102
+1475 5157
+1497 5190
+1530 5201
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+1530 5201
+1508 5190
+1497 5179
+1486 5157
+1475 5102
+1475 5069
+1486 5014
+1497 4992
+1508 4981
+1530 4970
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+1552 4970
+1574 4981
+1585 4992
+1596 5014
+1607 5069
+1607 5102
+1596 5157
+1585 5179
+1574 5190
+1552 5201
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+1716 4981
+1705 4970
+1694 4981
+1705 4992
+4 Poly
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 12
+1892 5201
+1925 5190
+1936 5168
+1936 5135
+1925 5113
+1892 5102
+1848 5102
+1815 5113
+1804 5135
+1804 5168
+1815 5190
+1848 5201
+12 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+1848 5201
+1826 5190
+1815 5168
+1815 5135
+1826 5113
+1848 5102
+6 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+1892 5102
+1914 5113
+1925 5135
+1925 5168
+1914 5190
+1892 5201
+6 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+1848 5102
+1815 5091
+1804 5080
+1793 5058
+1793 5014
+1804 4992
+1815 4981
+1848 4970
+1892 4970
+1925 4981
+1936 4992
+1947 5014
+1947 5058
+1936 5080
+1925 5091
+1892 5102
+16 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+1848 5102
+1826 5091
+1815 5080
+1804 5058
+1804 5014
+1815 4992
+1826 4981
+1848 4970
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+1892 4970
+1914 4981
+1925 4992
+1936 5014
+1936 5058
+1925 5080
+1914 5091
+1892 5102
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 28
+2145 5168
+2134 5157
+2145 5146
+2156 5157
+2156 5168
+2145 5190
+2123 5201
+2090 5201
+2057 5190
+2035 5168
+2024 5146
+2013 5102
+2013 5036
+2024 5003
+2046 4981
+2079 4970
+2101 4970
+2134 4981
+2156 5003
+2167 5036
+2167 5047
+2156 5080
+2134 5102
+2101 5113
+2090 5113
+2057 5102
+2035 5080
+2024 5047
+28 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 9
+2090 5201
+2068 5190
+2046 5168
+2035 5146
+2024 5102
+2024 5036
+2035 5003
+2057 4981
+2079 4970
+9 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+2101 4970
+2123 4981
+2145 5003
+2156 5036
+2156 5047
+2145 5080
+2123 5102
+2101 5113
+8 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5069
+9078 5069
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5069
+2442 5069
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1189 6451
+1387 6451
+2 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+1552 6583
+1585 6572
+1607 6539
+1618 6484
+1618 6451
+1607 6396
+1585 6363
+1552 6352
+1530 6352
+1497 6363
+1475 6396
+1464 6451
+1464 6484
+1475 6539
+1497 6572
+1530 6583
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+1530 6583
+1508 6572
+1497 6561
+1486 6539
+1475 6484
+1475 6451
+1486 6396
+1497 6374
+1508 6363
+1530 6352
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+1552 6352
+1574 6363
+1585 6374
+1596 6396
+1607 6451
+1607 6484
+1596 6539
+1585 6561
+1574 6572
+1552 6583
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+1716 6363
+1705 6352
+1694 6363
+1705 6374
+4 Poly
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 12
+1892 6583
+1925 6572
+1936 6550
+1936 6517
+1925 6495
+1892 6484
+1848 6484
+1815 6495
+1804 6517
+1804 6550
+1815 6572
+1848 6583
+12 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+1848 6583
+1826 6572
+1815 6550
+1815 6517
+1826 6495
+1848 6484
+6 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+1892 6484
+1914 6495
+1925 6517
+1925 6550
+1914 6572
+1892 6583
+6 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+1848 6484
+1815 6473
+1804 6462
+1793 6440
+1793 6396
+1804 6374
+1815 6363
+1848 6352
+1892 6352
+1925 6363
+1936 6374
+1947 6396
+1947 6440
+1936 6462
+1925 6473
+1892 6484
+16 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+1848 6484
+1826 6473
+1815 6462
+1804 6440
+1804 6396
+1815 6374
+1826 6363
+1848 6352
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+1892 6352
+1914 6363
+1925 6374
+1936 6396
+1936 6440
+1925 6462
+1914 6473
+1892 6484
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2035 6583
+2013 6473
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 19
+2013 6473
+2035 6495
+2068 6506
+2101 6506
+2134 6495
+2156 6473
+2167 6440
+2167 6418
+2156 6385
+2134 6363
+2101 6352
+2068 6352
+2035 6363
+2024 6374
+2013 6396
+2013 6407
+2024 6418
+2035 6407
+2024 6396
+19 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+2101 6506
+2123 6495
+2145 6473
+2156 6440
+2156 6418
+2145 6385
+2123 6363
+2101 6352
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2035 6583
+2145 6583
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+2035 6572
+2090 6572
+2145 6583
+3 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 6451
+9078 6451
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 6451
+2442 6451
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1189 7834
+1387 7834
+2 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+1552 7966
+1585 7955
+1607 7922
+1618 7867
+1618 7834
+1607 7779
+1585 7746
+1552 7735
+1530 7735
+1497 7746
+1475 7779
+1464 7834
+1464 7867
+1475 7922
+1497 7955
+1530 7966
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+1530 7966
+1508 7955
+1497 7944
+1486 7922
+1475 7867
+1475 7834
+1486 7779
+1497 7757
+1508 7746
+1530 7735
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+1552 7735
+1574 7746
+1585 7757
+1596 7779
+1607 7834
+1607 7867
+1596 7922
+1585 7944
+1574 7955
+1552 7966
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+1716 7746
+1705 7735
+1694 7746
+1705 7757
+4 Poly
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 12
+1892 7966
+1925 7955
+1936 7933
+1936 7900
+1925 7878
+1892 7867
+1848 7867
+1815 7878
+1804 7900
+1804 7933
+1815 7955
+1848 7966
+12 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+1848 7966
+1826 7955
+1815 7933
+1815 7900
+1826 7878
+1848 7867
+6 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+1892 7867
+1914 7878
+1925 7900
+1925 7933
+1914 7955
+1892 7966
+6 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+1848 7867
+1815 7856
+1804 7845
+1793 7823
+1793 7779
+1804 7757
+1815 7746
+1848 7735
+1892 7735
+1925 7746
+1936 7757
+1947 7779
+1947 7823
+1936 7845
+1925 7856
+1892 7867
+16 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+1848 7867
+1826 7856
+1815 7845
+1804 7823
+1804 7779
+1815 7757
+1826 7746
+1848 7735
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+1892 7735
+1914 7746
+1925 7757
+1936 7779
+1936 7823
+1925 7845
+1914 7856
+1892 7867
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2112 7944
+2112 7735
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2123 7966
+2123 7735
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+2123 7966
+2002 7801
+2178 7801
+3 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2079 7735
+2156 7735
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 7834
+9078 7834
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 7834
+2442 7834
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1189 9216
+1387 9216
+2 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+1552 9348
+1585 9337
+1607 9304
+1618 9249
+1618 9216
+1607 9161
+1585 9128
+1552 9117
+1530 9117
+1497 9128
+1475 9161
+1464 9216
+1464 9249
+1475 9304
+1497 9337
+1530 9348
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+1530 9348
+1508 9337
+1497 9326
+1486 9304
+1475 9249
+1475 9216
+1486 9161
+1497 9139
+1508 9128
+1530 9117
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+1552 9117
+1574 9128
+1585 9139
+1596 9161
+1607 9216
+1607 9249
+1596 9304
+1585 9326
+1574 9337
+1552 9348
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+1716 9128
+1705 9117
+1694 9128
+1705 9139
+4 Poly
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 12
+1892 9348
+1925 9337
+1936 9315
+1936 9282
+1925 9260
+1892 9249
+1848 9249
+1815 9260
+1804 9282
+1804 9315
+1815 9337
+1848 9348
+12 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+1848 9348
+1826 9337
+1815 9315
+1815 9282
+1826 9260
+1848 9249
+6 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+1892 9249
+1914 9260
+1925 9282
+1925 9315
+1914 9337
+1892 9348
+6 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+1848 9249
+1815 9238
+1804 9227
+1793 9205
+1793 9161
+1804 9139
+1815 9128
+1848 9117
+1892 9117
+1925 9128
+1936 9139
+1947 9161
+1947 9205
+1936 9227
+1925 9238
+1892 9249
+16 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+1848 9249
+1826 9238
+1815 9227
+1804 9205
+1804 9161
+1815 9139
+1826 9128
+1848 9117
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+1892 9117
+1914 9128
+1925 9139
+1936 9161
+1936 9205
+1925 9227
+1914 9238
+1892 9249
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+2024 9304
+2035 9293
+2024 9282
+2013 9293
+2013 9304
+2024 9326
+2035 9337
+2068 9348
+2112 9348
+2145 9337
+2156 9315
+2156 9282
+2145 9260
+2112 9249
+2079 9249
+15 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2112 9348
+2134 9337
+2145 9315
+2145 9282
+2134 9260
+2112 9249
+6 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+2112 9249
+2134 9238
+2156 9216
+2167 9194
+2167 9161
+2156 9139
+2145 9128
+2112 9117
+2068 9117
+2035 9128
+2024 9139
+2013 9161
+2013 9172
+2024 9183
+2035 9172
+2024 9161
+16 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2145 9227
+2156 9194
+2156 9161
+2145 9139
+2134 9128
+2112 9117
+6 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 9216
+9078 9216
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 9216
+2442 9216
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2304
+9161 2304
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2359 2304
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2580
+9161 2580
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2580
+2359 2580
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2857
+9161 2857
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2857
+2359 2857
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 3133
+9161 3133
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3133
+2359 3133
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 3410
+9161 3410
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3410
+2359 3410
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 3686
+9161 3686
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3686
+2359 3686
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 3963
+9161 3963
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3963
+2359 3963
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4239
+9161 4239
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4239
+2359 4239
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4516
+9161 4516
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4516
+2359 4516
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4792
+9161 4792
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4792
+2359 4792
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5069
+9161 5069
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5069
+2359 5069
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5345
+9161 5345
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5345
+2359 5345
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5622
+9161 5622
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5622
+2359 5622
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5898
+9161 5898
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5898
+2359 5898
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 6175
+9161 6175
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 6175
+2359 6175
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 6451
+9161 6451
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 6451
+2359 6451
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 6728
+9161 6728
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 6728
+2359 6728
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 7004
+9161 7004
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 7004
+2359 7004
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 7281
+9161 7281
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 7281
+2359 7281
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 7557
+9161 7557
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 7557
+2359 7557
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 7834
+9161 7834
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 7834
+2359 7834
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 8110
+9161 8110
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 8110
+2359 8110
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 8387
+9161 8387
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 8387
+2359 8387
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 8663
+9161 8663
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 8663
+2359 8663
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 8940
+9161 8940
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 8940
+2359 8940
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 9216
+9161 9216
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 9216
+2359 9216
+2 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+4858 1621
+4880 1610
+4891 1599
+4902 1577
+4902 1555
+4891 1533
+4880 1522
+4858 1511
+4836 1511
+4814 1522
+4803 1533
+4792 1555
+4792 1577
+4803 1599
+4814 1610
+4836 1621
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+4814 1610
+4803 1588
+4803 1544
+4814 1522
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+4880 1522
+4891 1544
+4891 1588
+4880 1610
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 5
+4891 1599
+4902 1610
+4924 1621
+4924 1610
+4902 1610
+5 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 9
+4803 1533
+4792 1522
+4781 1500
+4781 1489
+4792 1467
+4825 1456
+4880 1456
+4913 1445
+4924 1434
+9 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+4781 1489
+4792 1478
+4825 1467
+4880 1467
+4913 1456
+4924 1434
+4924 1423
+4913 1401
+4880 1390
+4814 1390
+4781 1401
+4770 1423
+4770 1434
+4781 1456
+4814 1467
+15 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 17
+5001 1555
+5133 1555
+5133 1577
+5122 1599
+5111 1610
+5089 1621
+5056 1621
+5023 1610
+5001 1588
+4990 1555
+4990 1533
+5001 1500
+5023 1478
+5056 1467
+5078 1467
+5111 1478
+5133 1500
+17 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+5122 1555
+5122 1588
+5111 1610
+3 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+5056 1621
+5034 1610
+5012 1588
+5001 1555
+5001 1533
+5012 1500
+5034 1478
+5056 1467
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5221 1621
+5221 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5232 1621
+5232 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+5232 1588
+5254 1610
+5287 1621
+5309 1621
+5342 1610
+5353 1588
+5353 1467
+7 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+5309 1621
+5331 1610
+5342 1588
+5342 1467
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5188 1621
+5232 1621
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5188 1467
+5265 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5309 1467
+5386 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 17
+5452 1555
+5584 1555
+5584 1577
+5573 1599
+5562 1610
+5540 1621
+5507 1621
+5474 1610
+5452 1588
+5441 1555
+5441 1533
+5452 1500
+5474 1478
+5507 1467
+5529 1467
+5562 1478
+5584 1500
+17 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+5573 1555
+5573 1588
+5562 1610
+3 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+5507 1621
+5485 1610
+5463 1588
+5452 1555
+5452 1533
+5463 1500
+5485 1478
+5507 1467
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5672 1621
+5672 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5683 1621
+5683 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+5683 1555
+5694 1588
+5716 1610
+5738 1621
+5771 1621
+5782 1610
+5782 1599
+5771 1588
+5760 1599
+5771 1610
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5639 1621
+5683 1621
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5639 1467
+5716 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 13
+5859 1599
+5859 1588
+5848 1588
+5848 1599
+5859 1610
+5881 1621
+5925 1621
+5947 1610
+5958 1599
+5969 1577
+5969 1500
+5980 1478
+5991 1467
+13 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 5
+5958 1599
+5958 1500
+5969 1478
+5991 1467
+6002 1467
+5 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 11
+5958 1577
+5947 1566
+5881 1555
+5848 1544
+5837 1522
+5837 1500
+5848 1478
+5881 1467
+5914 1467
+5936 1478
+5958 1500
+11 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+5881 1555
+5859 1544
+5848 1522
+5848 1500
+5859 1478
+5881 1467
+6 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+6079 1698
+6079 1511
+6090 1478
+6112 1467
+6134 1467
+6156 1478
+6167 1500
+7 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+6090 1698
+6090 1511
+6101 1478
+6112 1467
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6046 1621
+6134 1621
+2 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+6255 1687
+6244 1676
+6233 1687
+6244 1698
+4 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6244 1621
+6244 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6255 1621
+6255 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6211 1621
+6255 1621
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6211 1467
+6288 1467
+2 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+6431 1621
+6464 1610
+6486 1588
+6497 1555
+6497 1533
+6486 1500
+6464 1478
+6431 1467
+6409 1467
+6376 1478
+6354 1500
+6343 1533
+6343 1555
+6354 1588
+6376 1610
+6409 1621
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+6409 1621
+6387 1610
+6365 1588
+6354 1555
+6354 1533
+6365 1500
+6387 1478
+6409 1467
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+6431 1467
+6453 1478
+6475 1500
+6486 1533
+6486 1555
+6475 1588
+6453 1610
+6431 1621
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6585 1621
+6585 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6596 1621
+6596 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+6596 1588
+6618 1610
+6651 1621
+6673 1621
+6706 1610
+6717 1588
+6717 1467
+7 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+6673 1621
+6695 1610
+6706 1588
+6706 1467
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6552 1621
+6596 1621
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6552 1467
+6629 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6673 1467
+6750 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 17
+711 5172
+711 5304
+689 5304
+667 5293
+656 5282
+645 5260
+645 5227
+656 5194
+678 5172
+711 5161
+733 5161
+766 5172
+788 5194
+799 5227
+799 5249
+788 5282
+766 5304
+17 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+711 5293
+678 5293
+656 5282
+3 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+645 5227
+656 5205
+678 5183
+711 5172
+733 5172
+766 5183
+788 5205
+799 5227
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+645 5392
+799 5392
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+645 5403
+799 5403
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+678 5403
+656 5425
+645 5458
+645 5480
+656 5513
+678 5524
+799 5524
+7 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+645 5480
+656 5502
+678 5513
+799 5513
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+645 5359
+645 5403
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+799 5359
+799 5436
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+799 5480
+799 5557
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 17
+711 5623
+711 5755
+689 5755
+667 5744
+656 5733
+645 5711
+645 5678
+656 5645
+678 5623
+711 5612
+733 5612
+766 5623
+788 5645
+799 5678
+799 5700
+788 5733
+766 5755
+17 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+711 5744
+678 5744
+656 5733
+3 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+645 5678
+656 5656
+678 5634
+711 5623
+733 5623
+766 5634
+788 5656
+799 5678
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+645 5842
+799 5842
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+645 5853
+799 5853
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+711 5853
+678 5864
+656 5886
+645 5908
+645 5941
+656 5952
+667 5952
+678 5941
+667 5930
+656 5941
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+645 5809
+645 5853
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+799 5809
+799 5886
+2 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+645 6084
+656 6106
+667 6117
+689 6128
+711 6128
+733 6117
+744 6106
+755 6084
+755 6062
+744 6040
+733 6029
+711 6018
+689 6018
+667 6029
+656 6040
+645 6062
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+656 6040
+678 6029
+722 6029
+744 6040
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+744 6106
+722 6117
+678 6117
+656 6106
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 5
+667 6117
+656 6128
+645 6150
+656 6150
+656 6128
+5 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 9
+733 6029
+744 6018
+766 6007
+777 6007
+799 6018
+810 6051
+810 6106
+821 6139
+832 6150
+9 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+777 6007
+788 6018
+799 6051
+799 6106
+810 6139
+832 6150
+843 6150
+865 6139
+876 6106
+876 6040
+865 6007
+843 5996
+832 5996
+810 6007
+799 6040
+15 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+645 6227
+799 6293
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+645 6238
+777 6293
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 9
+645 6359
+799 6293
+843 6271
+865 6249
+876 6227
+876 6216
+865 6205
+854 6216
+865 6227
+9 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+645 6205
+645 6271
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+645 6315
+645 6381
+2 MLine
+End
+
+Begin %I MLine
+[1 0 0 1 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+0 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 500
+2304 3913
+2306 3524
+2309 4474
+2311 3291
+2313 7013
+2316 9033
+2318 3717
+2320 3291
+2322 3448
+2325 5091
+2327 4710
+2329 6599
+2332 4035
+2334 3719
+2336 4855
+2339 4639
+2341 3552
+2343 3315
+2345 6618
+2348 4236
+2350 3461
+2352 3315
+2355 4468
+2357 3291
+2359 3290
+2362 7133
+2364 3407
+2366 3696
+2369 3303
+2371 3420
+2373 3547
+2375 4392
+2378 3882
+2380 4522
+2382 4110
+2385 3401
+2387 3305
+2389 4302
+2392 3348
+2394 3333
+2396 3612
+2398 6772
+2401 3641
+2403 3382
+2405 3291
+2408 3372
+2410 6432
+2412 4985
+2415 3597
+2417 3296
+2419 3333
+2422 4535
+2424 3727
+2426 3582
+2428 4334
+2431 4537
+2433 3596
+2435 3694
+2438 3670
+2440 3314
+2442 3422
+2445 3583
+2447 4524
+2449 6042
+2451 3508
+2454 5608
+2456 3589
+2458 4100
+2461 3564
+2463 3542
+2465 3358
+2468 3352
+2470 4227
+2472 3507
+2474 4068
+2477 3803
+2479 7461
+2481 3617
+2484 3290
+2486 3300
+2488 8524
+2491 4820
+2493 3837
+2495 3707
+2498 3437
+2500 3327
+2502 3611
+2504 3408
+2507 3612
+2509 3358
+2511 4195
+2514 4363
+2516 3475
+2518 4405
+2521 3567
+2523 4881
+2525 4280
+2527 3471
+2530 4632
+2532 3657
+2534 5213
+2537 3456
+2539 3871
+2541 3333
+2544 4181
+2546 3292
+2548 3431
+2551 3679
+2553 3438
+2555 3380
+2557 3949
+2560 4532
+2562 3297
+2564 3299
+2567 3928
+2569 3977
+2571 3713
+2574 3439
+2576 3399
+2578 3574
+2580 3476
+2583 3335
+2585 4452
+2587 4551
+2590 3425
+2592 4218
+2594 3802
+2597 5543
+2599 3419
+2601 3527
+2604 3591
+2606 4652
+2608 3292
+2610 3889
+2613 3290
+2615 3311
+2617 3466
+2620 3290
+2622 4131
+2624 3424
+2627 3579
+2629 3370
+2631 4303
+2633 3345
+2636 4516
+2638 3298
+2640 3295
+2643 3704
+2645 3527
+2647 3319
+2650 3422
+2652 3371
+2654 4250
+2657 3487
+2659 3350
+2661 3291
+2663 5719
+2666 3356
+2668 3791
+2670 3543
+2673 4164
+2675 3830
+2677 3444
+2680 3766
+2682 3478
+2684 3361
+2686 3699
+2689 6142
+2691 3290
+2693 4189
+2696 3300
+2698 4503
+2700 3360
+2703 4097
+2705 3483
+2707 4962
+2710 3476
+2712 4439
+2714 4188
+2716 5653
+2719 4309
+2721 3664
+2723 3400
+2726 4114
+2728 3937
+2730 3452
+2733 3402
+2735 4150
+2737 5020
+2739 3536
+2742 3608
+2744 3434
+2746 3295
+2749 3344
+2751 3983
+2753 3290
+2756 3329
+2758 3310
+2760 3415
+2762 3302
+2765 3848
+2767 3622
+2769 3606
+2772 3388
+2774 3577
+2776 3636
+2779 3513
+2781 3391
+2783 3715
+2786 3329
+2788 3290
+2790 4134
+2792 3314
+2795 3297
+2797 3290
+2799 3302
+2802 6602
+2804 3312
+2806 3412
+2809 3783
+2811 3685
+2813 6632
+2815 3365
+2818 3336
+2820 5241
+2822 3433
+2825 3311
+2827 3415
+2829 3297
+2832 4080
+2834 3578
+2836 3465
+2839 3290
+2841 4441
+2843 3290
+2845 3996
+2848 3377
+2850 3294
+2852 3465
+2855 3291
+2857 3408
+2859 3291
+2862 3319
+2864 3895
+2866 3833
+2868 3293
+2871 3323
+2873 3461
+2875 3294
+2878 3325
+2880 3295
+2882 3307
+2885 3317
+2887 3368
+2889 3378
+2892 3295
+2894 4232
+2896 3367
+2898 3290
+2901 3596
+2903 4308
+2905 3376
+2908 3510
+2910 3910
+2912 3295
+2915 3295
+2917 3335
+2919 3355
+2921 3365
+2924 3294
+2926 3405
+2928 3290
+2931 3308
+2933 3435
+2935 3355
+2938 3300
+2940 3404
+2942 3310
+2945 3294
+2947 3302
+2949 3291
+2951 4978
+2954 3340
+2956 3596
+2958 5354
+2961 3298
+2963 3772
+2965 3323
+2968 3370
+2970 3307
+2972 4018
+2974 3358
+2977 3868
+2979 3298
+2981 3297
+2984 3319
+2986 3293
+2988 3619
+2991 3410
+2993 3317
+2995 3414
+2998 3299
+3000 3347
+3002 3334
+3004 3313
+3007 3348
+3009 4841
+3011 3572
+3014 3489
+3016 3474
+3018 3386
+3021 4339
+3023 4032
+3025 3332
+3027 3309
+3030 3291
+3032 3290
+3034 3468
+3037 4515
+3039 3582
+3041 3292
+3044 3305
+3046 3649
+3048 3539
+3050 3689
+3053 3418
+3055 5165
+3057 3354
+3060 3372
+3062 3339
+3064 3438
+3067 3389
+3069 3505
+3071 3290
+3074 3363
+3076 3672
+3078 3394
+3080 3439
+3083 3311
+3085 3800
+3087 3378
+3090 3803
+3092 3518
+3094 3309
+3097 3290
+3099 4032
+3101 3295
+3103 3314
+3106 4187
+3108 3360
+3110 3539
+3113 3377
+3115 3460
+3117 3390
+3120 3290
+3122 3424
+3124 3417
+3127 3379
+3129 3355
+3131 3419
+3133 3618
+3136 3683
+3138 3338
+3140 3290
+3143 3825
+3145 3319
+3147 3369
+3150 3356
+3152 3760
+3154 3315
+3156 3290
+3159 3427
+3161 3373
+3163 3551
+3166 3394
+3168 3382
+3170 3567
+3173 3294
+3175 3290
+3177 3656
+3180 3349
+3182 3645
+3184 3290
+3186 3290
+3189 3313
+3191 3393
+3193 3290
+3196 3324
+3198 3330
+3200 3387
+3203 3435
+3205 3307
+3207 3475
+3209 3314
+3212 3589
+3214 3350
+3216 3309
+3219 3333
+3221 3304
+3223 3452
+3226 3291
+3228 3297
+3230 3290
+3233 3345
+3235 3375
+3237 3329
+3239 3461
+3242 3341
+3244 3477
+3246 3311
+3249 3580
+3251 3304
+3253 3334
+3256 3344
+3258 3342
+3260 3386
+3262 3449
+3265 3320
+3267 3300
+3269 3620
+3272 3420
+3274 3291
+3276 3430
+3279 3290
+3281 5045
+3283 3290
+3286 3364
+3288 3744
+3290 3315
+3292 3306
+3295 3330
+3297 3420
+3299 3292
+3302 3453
+3304 3437
+3306 3300
+3309 3361
+3311 3290
+3313 3906
+3315 3521
+3318 3426
+3320 3309
+3322 3450
+3325 3490
+3327 3693
+3329 3290
+3332 3435
+3334 4694
+3336 3654
+3338 3301
+3341 3770
+3343 3294
+3345 3317
+3348 3335
+3350 3451
+3352 3481
+3355 3303
+3357 3546
+3359 3430
+3362 3303
+3364 3466
+3366 3846
+3368 3461
+3371 3298
+3373 3304
+3375 3399
+3378 3350
+3380 3401
+3382 3291
+3385 3331
+3387 3706
+3389 3336
+3391 3450
+3394 3350
+3396 3539
+3398 3361
+3401 3695
+3403 3295
+3405 3565
+3408 3613
+3410 3325
+3412 3314
+3415 3575
+3417 3421
+3419 3330
+3421 3541
+3424 3477
+3426 3445
+3428 3294
+3431 3461
+3433 3332
+3435 3377
+3438 3429
+3440 3476
+3442 3311
+3444 3315
+3447 3372
+3449 3296
+3451 3383
+3454 3380
+500 MLine
+End
+
+Begin %I MLine
+[1 0 0 1 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+0 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 500
+3454 3380
+3456 3576
+3458 3292
+3461 3706
+3463 3489
+3465 3316
+3468 3292
+3470 3366
+3472 3365
+3474 3312
+3477 3534
+3479 3372
+3481 3304
+3484 3903
+3486 3300
+3488 3296
+3491 3533
+3493 3295
+3495 3352
+3497 3494
+3500 3291
+3502 3303
+3504 3484
+3507 3298
+3509 3293
+3511 3296
+3514 3421
+3516 3378
+3518 3939
+3521 3295
+3523 3304
+3525 3296
+3527 3633
+3530 3325
+3532 3495
+3534 3307
+3537 3307
+3539 3558
+3541 3297
+3544 3307
+3546 3844
+3548 3924
+3550 3301
+3553 3296
+3555 3352
+3557 3320
+3560 3380
+3562 3295
+3564 3317
+3567 3290
+3569 3553
+3571 3325
+3574 3397
+3576 3377
+3578 3506
+3580 3309
+3583 3299
+3585 3417
+3587 3310
+3590 3354
+3592 3299
+3594 3637
+3597 3329
+3599 3308
+3601 3290
+3603 3582
+3606 3290
+3608 3305
+3610 3309
+3613 3294
+3615 3320
+3617 3290
+3620 3298
+3622 3529
+3624 3293
+3626 3292
+3629 3291
+3631 3308
+3633 3291
+3636 3313
+3638 3299
+3640 3291
+3643 3306
+3645 3296
+3647 3563
+3650 3740
+3652 3290
+3654 3291
+3656 3493
+3659 3338
+3661 3362
+3663 3386
+3666 3377
+3668 3324
+3670 3304
+3673 3380
+3675 3291
+3677 3544
+3679 3291
+3682 3773
+3684 3357
+3686 3309
+3689 3693
+3691 3330
+3693 3448
+3696 3631
+3698 3587
+3700 3391
+3703 3391
+3705 3293
+3707 3290
+3709 3359
+3712 3304
+3714 3290
+3716 3355
+3719 3290
+3721 3519
+3723 3290
+3726 3290
+3728 3439
+3730 3465
+3732 3294
+3735 3371
+3737 3553
+3739 3290
+3742 3321
+3744 3309
+3746 3336
+3749 3298
+3751 3298
+3753 3320
+3756 3388
+3758 3527
+3760 3616
+3762 3346
+3765 3348
+3767 3363
+3769 3479
+3772 3369
+3774 3419
+3776 3364
+3779 3343
+3781 3404
+3783 3302
+3785 3360
+3788 3637
+3790 3295
+3792 3369
+3795 3312
+3797 3297
+3799 3352
+3802 3393
+3804 3290
+3806 3462
+3809 3296
+3811 3335
+3813 3293
+3815 3298
+3818 3290
+3820 3391
+3822 3423
+3825 3330
+3827 3292
+3829 3290
+3832 3348
+3834 3302
+3836 3319
+3838 3394
+3841 3291
+3843 3291
+3845 3298
+3848 3310
+3850 3343
+3852 3355
+3855 3314
+3857 3637
+3859 3291
+3862 3387
+3864 3290
+3866 3358
+3868 3293
+3871 3318
+3873 3314
+3875 3297
+3878 3331
+3880 3347
+3882 3291
+3885 3394
+3887 3415
+3889 3293
+3891 3292
+3894 3298
+3896 3534
+3898 3309
+3901 3299
+3903 3293
+3905 3388
+3908 3290
+3910 3296
+3912 3291
+3914 3301
+3917 3551
+3919 3307
+3921 3353
+3924 3304
+3926 3290
+3928 3307
+3931 3290
+3933 3660
+3935 3305
+3938 3291
+3940 3533
+3942 3476
+3944 3326
+3947 3314
+3949 3306
+3951 3537
+3954 3290
+3956 3420
+3958 3328
+3961 3298
+3963 3442
+3965 3325
+3967 3368
+3970 3291
+3972 3375
+3974 3432
+3977 3345
+3979 3696
+3981 3515
+3984 3333
+3986 3362
+3988 3293
+3991 3300
+3993 3383
+3995 3405
+3997 3317
+4000 3385
+4002 3390
+4004 3290
+4007 3398
+4009 3353
+4011 3343
+4014 3384
+4016 3290
+4018 3294
+4020 3300
+4023 3502
+4025 3296
+4027 3297
+4030 3307
+4032 3290
+4034 3291
+4037 3298
+4039 3300
+4041 3396
+4044 3307
+4046 3398
+4048 3290
+4050 3290
+4053 3301
+4055 3611
+4057 3329
+4060 3370
+4062 3402
+4064 3333
+4067 3302
+4069 3401
+4071 3339
+4073 3301
+4076 3291
+4078 3319
+4080 3300
+4083 3297
+4085 3291
+4087 3434
+4090 3508
+4092 3313
+4094 3295
+4097 3316
+4099 3299
+4101 3434
+4103 3354
+4106 3517
+4108 3290
+4110 3610
+4113 3290
+4115 3290
+4117 3328
+4120 3321
+4122 3290
+4124 3430
+4126 3376
+4129 3303
+4131 3355
+4133 3290
+4136 3448
+4138 3419
+4140 3372
+4143 3339
+4145 3434
+4147 3351
+4150 3311
+4152 3320
+4154 3356
+4156 3290
+4159 3323
+4161 3375
+4163 3290
+4166 3300
+4168 3294
+4170 3290
+4173 3290
+4175 3301
+4177 3335
+4179 3298
+4182 3307
+4184 3435
+4186 3290
+4189 3291
+4191 3368
+4193 3290
+4196 3341
+4198 3374
+4200 3329
+4202 3365
+4205 3333
+4207 3328
+4209 3294
+4212 3318
+4214 3461
+4216 3354
+4219 3331
+4221 3290
+4223 3360
+4226 3290
+4228 3290
+4230 3344
+4232 3324
+4235 3293
+4237 3291
+4239 3318
+4242 3367
+4244 3331
+4246 3290
+4249 3316
+4251 3418
+4253 3428
+4255 3291
+4258 3485
+4260 3368
+4262 3300
+4265 3303
+4267 3322
+4269 3434
+4272 3319
+4274 3387
+4276 3308
+4279 3556
+4281 3291
+4283 3418
+4285 3301
+4288 3340
+4290 3340
+4292 3294
+4295 3294
+4297 3342
+4299 3347
+4302 3291
+4304 3290
+4306 3311
+4308 3295
+4311 3314
+4313 3322
+4315 3486
+4318 3291
+4320 3309
+4322 3316
+4325 3329
+4327 3290
+4329 3338
+4332 3350
+4334 3290
+4336 3298
+4338 3290
+4341 3297
+4343 3363
+4345 3439
+4348 3304
+4350 3295
+4352 3307
+4355 3454
+4357 3290
+4359 3291
+4361 3301
+4364 3327
+4366 3295
+4368 3301
+4371 3296
+4373 3485
+4375 3380
+4378 3291
+4380 3290
+4382 3294
+4385 3371
+4387 3333
+4389 3295
+4391 3290
+4394 3399
+4396 3327
+4398 3407
+4401 3359
+4403 3290
+4405 3293
+4408 3305
+4410 3296
+4412 3319
+4414 3338
+4417 3290
+4419 3303
+4421 3290
+4424 3290
+4426 3381
+4428 3296
+4431 3290
+4433 3293
+4435 3293
+4438 3293
+4440 3376
+4442 3290
+4444 3291
+4447 3290
+4449 3351
+4451 3302
+4454 3304
+4456 3321
+4458 3320
+4461 3290
+4463 3291
+4465 3290
+4467 3321
+4470 3433
+4472 3290
+4474 3303
+4477 3347
+4479 3345
+4481 3346
+4484 3290
+4486 3301
+4488 3295
+4490 3311
+4493 3341
+4495 3295
+4497 3294
+4500 3303
+4502 3322
+4504 3302
+4507 3295
+4509 3290
+4511 3299
+4514 3337
+4516 3396
+4518 3290
+4520 3294
+4523 3294
+4525 3319
+4527 3359
+4530 3570
+4532 3309
+4534 3309
+4537 3290
+4539 3321
+4541 3290
+4543 3294
+4546 3291
+4548 3290
+4550 3426
+4553 3290
+4555 3290
+4557 3290
+4560 3305
+4562 3304
+4564 3299
+4567 3291
+4569 3347
+4571 3293
+4573 3303
+4576 3295
+4578 3324
+4580 3321
+4583 3330
+4585 3291
+4587 3294
+4590 3319
+4592 3331
+4594 3380
+4596 3291
+4599 3290
+4601 3290
+4603 3391
+500 MLine
+End
+
+Begin %I MLine
+[1 0 0 1 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+0 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 500
+4603 3391
+4606 3290
+4608 3326
+4610 3365
+4613 3359
+4615 3319
+4617 3290
+4620 3293
+4622 3295
+4624 3290
+4626 3292
+4629 3311
+4631 3292
+4633 3385
+4636 3309
+4638 3318
+4640 3290
+4643 3305
+4645 3309
+4647 3332
+4649 3294
+4652 3297
+4654 3331
+4656 3320
+4659 3294
+4661 3299
+4663 3352
+4666 3334
+4668 3290
+4670 3291
+4673 3307
+4675 3306
+4677 3326
+4679 3291
+4682 3312
+4684 3316
+4686 3322
+4689 3337
+4691 3307
+4693 3292
+4696 3376
+4698 3373
+4700 3291
+4702 3395
+4705 3290
+4707 3417
+4709 3306
+4712 3367
+4714 3300
+4716 3297
+4719 3299
+4721 3295
+4723 3304
+4726 3292
+4728 3305
+4730 3294
+4732 3293
+4735 3290
+4737 3294
+4739 3305
+4742 3290
+4744 3290
+4746 3290
+4749 3292
+4751 3307
+4753 3304
+4755 3290
+4758 3290
+4760 3290
+4762 3290
+4765 3290
+4767 3290
+4769 3290
+4772 3312
+4774 3296
+4776 3292
+4778 3350
+4781 3310
+4783 3301
+4785 3304
+4788 3338
+4790 3305
+4792 3306
+4795 3332
+4797 3290
+4799 3322
+4802 3295
+4804 3293
+4806 3291
+4808 3304
+4811 3290
+4813 3291
+4815 3302
+4818 3318
+4820 3310
+4822 3458
+4825 3317
+4827 3290
+4829 3290
+4831 3316
+4834 3305
+4836 3311
+4838 3290
+4841 3294
+4843 3294
+4845 3294
+4848 3292
+4850 3290
+4852 3290
+4855 3290
+4857 3293
+4859 3340
+4861 3295
+4864 3295
+4866 3296
+4868 3306
+4871 3344
+4873 3301
+4875 3292
+4878 3326
+4880 3290
+4882 3337
+4884 3301
+4887 3339
+4889 3295
+4891 3311
+4894 3300
+4896 3290
+4898 3290
+4901 3290
+4903 3311
+4905 3293
+4908 3316
+4910 3295
+4912 3302
+4914 3291
+4917 3301
+4919 3314
+4921 3306
+4924 3291
+4926 3292
+4928 3290
+4931 3293
+4933 3309
+4935 3290
+4937 3322
+4940 3316
+4942 3295
+4944 3290
+4947 3294
+4949 3403
+4951 3290
+4954 3322
+4956 3291
+4958 3307
+4961 3290
+4963 3295
+4965 3314
+4967 3367
+4970 3291
+4972 3294
+4974 3290
+4977 3290
+4979 3290
+4981 3294
+4984 3294
+4986 3314
+4988 3300
+4990 3294
+4993 3305
+4995 3299
+4997 3295
+5000 3342
+5002 3309
+5004 3328
+5007 3293
+5009 3295
+5011 3310
+5014 3310
+5016 3290
+5018 3290
+5020 3325
+5023 3292
+5025 3290
+5027 3291
+5030 3294
+5032 3312
+5034 3291
+5037 3293
+5039 3317
+5041 3290
+5043 3290
+5046 3294
+5048 3304
+5050 3290
+5053 3290
+5055 3290
+5057 3290
+5060 3290
+5062 3388
+5064 3308
+5066 3305
+5069 3290
+5071 3290
+5073 3292
+5076 3292
+5078 3290
+5080 3290
+5083 3297
+5085 3292
+5087 3406
+5090 3307
+5092 3317
+5094 3309
+5096 3313
+5099 3290
+5101 3290
+5103 3320
+5106 3292
+5108 3290
+5110 3304
+5113 3327
+5115 3290
+5117 3345
+5119 3291
+5122 3291
+5124 3290
+5126 3300
+5129 3292
+5131 3298
+5133 3298
+5136 3291
+5138 3310
+5140 3295
+5143 3297
+5145 3310
+5147 3353
+5149 3290
+5152 3307
+5154 3291
+5156 3297
+5159 3291
+5161 3295
+5163 3306
+5166 3291
+5168 3291
+5170 3290
+5172 3290
+5175 3303
+5177 3290
+5179 3291
+5182 3296
+5184 3317
+5186 3309
+5189 3306
+5191 3332
+5193 3320
+5196 3293
+5198 3292
+5200 3292
+5202 3296
+5205 3296
+5207 3309
+5209 3326
+5212 3299
+5214 3328
+5216 3303
+5219 3296
+5221 3314
+5223 3290
+5225 3292
+5228 3302
+5230 3307
+5232 3296
+5235 3318
+5237 3323
+5239 3313
+5242 3321
+5244 3292
+5246 3295
+5249 3290
+5251 3301
+5253 3301
+5255 3295
+5258 3292
+5260 3311
+5262 3290
+5265 3295
+5267 3290
+5269 3290
+5272 3291
+5274 3295
+5276 3306
+5278 3299
+5281 3290
+5283 3296
+5285 3302
+5288 3303
+5290 3328
+5292 3323
+5295 3300
+5297 3297
+5299 3290
+5302 3290
+5304 3290
+5306 3290
+5308 3290
+5311 3318
+5313 3292
+5315 3296
+5318 3324
+5320 3318
+5322 3299
+5325 3291
+5327 3291
+5329 3296
+5331 3296
+5334 3290
+5336 3312
+5338 3312
+5341 3310
+5343 3306
+5345 3290
+5348 3301
+5350 3294
+5352 3290
+5354 3311
+5357 3306
+5359 3312
+5361 3290
+5364 3295
+5366 3290
+5368 3290
+5371 3290
+5373 3319
+5375 3292
+5378 3297
+5380 3295
+5382 3295
+5384 3308
+5387 3292
+5389 3335
+5391 3290
+5394 3290
+5396 3290
+5398 3290
+5401 3290
+5403 3316
+5405 3294
+5407 3290
+5410 3290
+5412 3294
+5414 3320
+5417 3299
+5419 3307
+5421 3290
+5424 3290
+5426 3290
+5428 3294
+5431 3301
+5433 3290
+5435 3290
+5437 3290
+5440 3298
+5442 3296
+5444 3291
+5447 3306
+5449 3303
+5451 3303
+5454 3312
+5456 3312
+5458 3333
+5460 3318
+5463 3295
+5465 3308
+5467 3292
+5470 3293
+5472 3293
+5474 3292
+5477 3367
+5479 3306
+5481 3290
+5484 3290
+5486 3292
+5488 3295
+5490 3291
+5493 3291
+5495 3293
+5497 3290
+5500 3295
+5502 3290
+5504 3292
+5507 3290
+5509 3294
+5511 3344
+5513 3301
+5516 3290
+5518 3290
+5520 3297
+5523 3295
+5525 3290
+5527 3290
+5530 3294
+5532 3332
+5534 3290
+5537 3292
+5539 3342
+5541 3303
+5543 3290
+5546 3295
+5548 3292
+5550 3290
+5553 3290
+5555 3290
+5557 3290
+5560 3299
+5562 3332
+5564 3301
+5566 3301
+5569 3304
+5571 3300
+5573 3290
+5576 3290
+5578 3307
+5580 3302
+5583 3299
+5585 3299
+5587 3299
+5590 3290
+5592 3290
+5594 3290
+5596 3296
+5599 3296
+5601 3292
+5603 3290
+5606 3310
+5608 3290
+5610 3293
+5613 3292
+5615 3306
+5617 3297
+5619 3290
+5622 3296
+5624 3295
+5626 3292
+5629 3291
+5631 3305
+5633 3290
+5636 3293
+5638 3291
+5640 3295
+5642 3292
+5645 3295
+5647 3294
+5649 3298
+5652 3344
+5654 3298
+5656 3290
+5659 3290
+5661 3290
+5663 3290
+5666 3298
+5668 3291
+5670 3298
+5672 3292
+5675 3298
+5677 3294
+5679 3290
+5682 3294
+5684 3294
+5686 3294
+5689 3291
+5691 3291
+5693 3291
+5695 3290
+5698 3299
+5700 3298
+5702 3298
+5705 3292
+5707 3293
+5709 3290
+5712 3297
+5714 3295
+5716 3291
+5719 3290
+5721 3305
+5723 3300
+5725 3290
+5728 3290
+5730 3292
+5732 3291
+5735 3304
+5737 3311
+5739 3309
+5742 3291
+5744 3290
+5746 3290
+5748 3292
+5751 3294
+5753 3294
+500 MLine
+End
+
+Begin %I MLine
+[1 0 0 1 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+0 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 500
+5753 3294
+5755 3296
+5758 3346
+5760 3290
+5762 3292
+5765 3292
+5767 3291
+5769 3291
+5772 3290
+5774 3290
+5776 3290
+5778 3290
+5781 3291
+5783 3290
+5785 3293
+5788 3298
+5790 3312
+5792 3302
+5795 3296
+5797 3290
+5799 3291
+5801 3290
+5804 3293
+5806 3291
+5808 3290
+5811 3296
+5813 3296
+5815 3292
+5818 3296
+5820 3291
+5822 3290
+5825 3291
+5827 3301
+5829 3292
+5831 3312
+5834 3296
+5836 3290
+5838 3290
+5841 3290
+5843 3290
+5845 3294
+5848 3290
+5850 3290
+5852 3291
+5854 3294
+5857 3296
+5859 3290
+5861 3303
+5864 3293
+5866 3302
+5868 3290
+5871 3309
+5873 3305
+5875 3300
+5878 3303
+5880 3300
+5882 3295
+5884 3291
+5887 3291
+5889 3290
+5891 3290
+5894 3310
+5896 3314
+5898 3291
+5901 3291
+5903 3298
+5905 3293
+5907 3290
+5910 3294
+5912 3296
+5914 3290
+5917 3292
+5919 3291
+5921 3290
+5924 3290
+5926 3292
+5928 3295
+5930 3290
+5933 3298
+5935 3298
+5937 3291
+5940 3290
+5942 3290
+5944 3290
+5947 3305
+5949 3305
+5951 3305
+5954 3294
+5956 3290
+5958 3294
+5960 3298
+5963 3293
+5965 3305
+5967 3292
+5970 3292
+5972 3306
+5974 3293
+5977 3292
+5979 3295
+5981 3290
+5983 3290
+5986 3290
+5988 3305
+5990 3293
+5993 3298
+5995 3298
+5997 3290
+6000 3290
+6002 3296
+6004 3290
+6007 3307
+6009 3300
+6011 3300
+6013 3290
+6016 3300
+6018 3299
+6020 3294
+6023 3297
+6025 3292
+6027 3297
+6030 3290
+6032 3290
+6034 3301
+6036 3305
+6039 3295
+6041 3297
+6043 3297
+6046 3297
+6048 3290
+6050 3293
+6053 3293
+6055 3290
+6057 3292
+6060 3291
+6062 3314
+6064 3304
+6066 3290
+6069 3290
+6071 3302
+6073 3291
+6076 3291
+6078 3303
+6080 3303
+6083 3290
+6085 3292
+6087 3292
+6089 3290
+6092 3290
+6094 3291
+6096 3291
+6099 3290
+6101 3290
+6103 3290
+6106 3290
+6108 3290
+6110 3290
+6113 3292
+6115 3292
+6117 3291
+6119 3291
+6122 3296
+6124 3298
+6126 3307
+6129 3307
+6131 3291
+6133 3290
+6136 3294
+6138 3294
+6140 3290
+6142 3297
+6145 3293
+6147 3296
+6149 3290
+6152 3290
+6154 3292
+6156 3290
+6159 3290
+6161 3290
+6163 3299
+6166 3290
+6168 3290
+6170 3292
+6172 3290
+6175 3308
+6177 3290
+6179 3290
+6182 3290
+6184 3290
+6186 3290
+6189 3290
+6191 3290
+6193 3316
+6195 3293
+6198 3290
+6200 3295
+6202 3295
+6205 3297
+6207 3298
+6209 3294
+6212 3294
+6214 3294
+6216 3294
+6218 3294
+6221 3291
+6223 3290
+6225 3291
+6228 3299
+6230 3295
+6232 3290
+6235 3291
+6237 3290
+6239 3290
+6242 3291
+6244 3291
+6246 3292
+6248 3290
+6251 3290
+6253 3290
+6255 3290
+6258 3290
+6260 3290
+6262 3306
+6265 3295
+6267 3290
+6269 3298
+6271 3291
+6274 3290
+6276 3290
+6278 3290
+6281 3290
+6283 3291
+6285 3290
+6288 3290
+6290 3290
+6292 3290
+6295 3290
+6297 3291
+6299 3291
+6301 3301
+6304 3290
+6306 3296
+6308 3290
+6311 3290
+6313 3293
+6315 3293
+6318 3293
+6320 3294
+6322 3290
+6324 3290
+6327 3290
+6329 3290
+6331 3290
+6334 3290
+6336 3290
+6338 3290
+6341 3290
+6343 3290
+6345 3290
+6348 3294
+6350 3290
+6352 3290
+6354 3290
+6357 3292
+6359 3290
+6361 3290
+6364 3290
+6366 3290
+6368 3290
+6371 3298
+6373 3294
+6375 3293
+6377 3293
+6380 3295
+6382 3295
+6384 3290
+6387 3290
+6389 3291
+6391 3293
+6394 3290
+6396 3290
+6398 3308
+6401 3290
+6403 3292
+6405 3292
+6407 3292
+6410 3290
+6412 3292
+6414 3292
+6417 3292
+6419 3292
+6421 3293
+6424 3290
+6426 3290
+6428 3293
+6430 3293
+6433 3290
+6435 3290
+6437 3290
+6440 3290
+6442 3290
+6444 3290
+6447 3297
+6449 3290
+6451 3290
+6454 3294
+6456 3291
+6458 3290
+6460 3293
+6463 3294
+6465 3290
+6467 3290
+6470 3291
+6472 3291
+6474 3291
+6477 3294
+6479 3290
+6481 3291
+6483 3290
+6486 3291
+6488 3291
+6490 3291
+6493 3297
+6495 3291
+6497 3292
+6500 3292
+6502 3290
+6504 3290
+6506 3291
+6509 3290
+6511 3292
+6513 3292
+6516 3290
+6518 3290
+6520 3290
+6523 3290
+6525 3292
+6527 3290
+6530 3290
+6532 3291
+6534 3290
+6536 3290
+6539 3293
+6541 3290
+6543 3298
+6546 3294
+6548 3293
+6550 3294
+6553 3291
+6555 3290
+6557 3290
+6559 3290
+6562 3296
+6564 3296
+6566 3290
+6569 3290
+6571 3290
+6573 3290
+6576 3290
+6578 3291
+6580 3290
+6583 3295
+6585 3290
+6587 3290
+6589 3290
+6592 3290
+6594 3291
+6596 3290
+6599 3290
+6601 3290
+6603 3290
+6606 3301
+6608 3300
+6610 3300
+6612 3290
+6615 3290
+6617 3290
+6619 3290
+6622 3290
+6624 3292
+6626 3290
+6629 3298
+6631 3290
+6633 3293
+6636 3293
+6638 3293
+6640 3293
+6642 3290
+6645 3290
+6647 3290
+6649 3291
+6652 3291
+6654 3290
+6656 3290
+6659 3290
+6661 3290
+6663 3290
+6665 3290
+6668 3290
+6670 3290
+6672 3290
+6675 3297
+6677 3292
+6679 3292
+6682 3292
+6684 3290
+6686 3290
+6689 3291
+6691 3291
+6693 3295
+6695 3295
+6698 3290
+6700 3290
+6702 3290
+6705 3290
+6707 3290
+6709 3290
+6712 3298
+6714 3291
+6716 3290
+6718 3290
+6721 3290
+6723 3290
+6725 3290
+6728 3290
+6730 3291
+6732 3291
+6735 3291
+6737 3291
+6739 3290
+6742 3290
+6744 3290
+6746 3290
+6748 3290
+6751 3290
+6753 3290
+6755 3290
+6758 3290
+6760 3290
+6762 3291
+6765 3290
+6767 3290
+6769 3290
+6771 3290
+6774 3290
+6776 3290
+6778 3290
+6781 3290
+6783 3290
+6785 3293
+6788 3293
+6790 3294
+6792 3297
+6794 3297
+6797 3290
+6799 3290
+6801 3290
+6804 3290
+6806 3290
+6808 3292
+6811 3291
+6813 3291
+6815 3291
+6818 3291
+6820 3290
+6822 3290
+6824 3290
+6827 3291
+6829 3291
+6831 3290
+6834 3290
+6836 3290
+6838 3290
+6841 3290
+6843 3290
+6845 3295
+6847 3290
+6850 3290
+6852 3290
+6854 3290
+6857 3290
+6859 3291
+6861 3290
+6864 3290
+6866 3290
+6868 3290
+6871 3290
+6873 3290
+6875 3290
+6877 3291
+6880 3291
+6882 3291
+6884 3291
+6887 3291
+6889 3292
+6891 3290
+6894 3292
+6896 3290
+6898 3290
+6900 3290
+6903 3290
+500 MLine
+End
+
+Begin %I MLine
+[1 0 0 1 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+0 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 500
+6903 3290
+6905 3290
+6907 3293
+6910 3290
+6912 3290
+6914 3290
+6917 3290
+6919 3290
+6921 3290
+6924 3291
+6926 3290
+6928 3290
+6930 3290
+6933 3290
+6935 3290
+6937 3290
+6940 3290
+6942 3290
+6944 3290
+6947 3290
+6949 3292
+6951 3292
+6953 3290
+6956 3290
+6958 3290
+6960 3290
+6963 3290
+6965 3290
+6967 3295
+6970 3290
+6972 3292
+6974 3291
+6977 3293
+6979 3291
+6981 3290
+6983 3290
+6986 3291
+6988 3292
+6990 3292
+6993 3291
+6995 3291
+6997 3290
+7000 3290
+7002 3290
+7004 3290
+7006 3290
+7009 3290
+7011 3290
+7013 3290
+7016 3291
+7018 3291
+7020 3291
+7023 3291
+7025 3292
+7027 3291
+7030 3290
+7032 3290
+7034 3290
+7036 3290
+7039 3290
+7041 3290
+7043 3290
+7046 3290
+7048 3290
+7050 3290
+7053 3290
+7055 3290
+7057 3291
+7059 3292
+7062 3290
+7064 3290
+7066 3290
+7069 3290
+7071 3291
+7073 3290
+7076 3293
+7078 3290
+7080 3291
+7082 3290
+7085 3290
+7087 3290
+7089 3290
+7092 3294
+7094 3294
+7096 3291
+7099 3291
+7101 3291
+7103 3291
+7106 3291
+7108 3291
+7110 3290
+7112 3292
+7115 3292
+7117 3290
+7119 3290
+7122 3290
+7124 3290
+7126 3290
+7129 3290
+7131 3290
+7133 3290
+7135 3290
+7138 3291
+7140 3290
+7142 3290
+7145 3290
+7147 3290
+7149 3290
+7152 3290
+7154 3290
+7156 3290
+7159 3290
+7161 3290
+7163 3290
+7165 3290
+7168 3290
+7170 3292
+7172 3290
+7175 3290
+7177 3290
+7179 3290
+7182 3290
+7184 3291
+7186 3292
+7188 3292
+7191 3292
+7193 3292
+7195 3290
+7198 3290
+7200 3290
+7202 3292
+7205 3291
+7207 3290
+7209 3290
+7212 3290
+7214 3291
+7216 3291
+7218 3291
+7221 3291
+7223 3291
+7225 3290
+7228 3290
+7230 3290
+7232 3290
+7235 3292
+7237 3292
+7239 3290
+7241 3290
+7244 3290
+7246 3290
+7248 3290
+7251 3290
+7253 3290
+7255 3290
+7258 3290
+7260 3290
+7262 3290
+7265 3290
+7267 3290
+7269 3290
+7271 3290
+7274 3290
+7276 3292
+7278 3292
+7281 3291
+7283 3296
+7285 3292
+7288 3292
+7290 3292
+7292 3292
+7294 3290
+7297 3290
+7299 3290
+7301 3290
+7304 3290
+7306 3290
+7308 3290
+7311 3290
+7313 3292
+7315 3290
+7318 3290
+7320 3290
+7322 3290
+7324 3290
+7327 3290
+7329 3290
+7331 3290
+7334 3290
+7336 3290
+7338 3291
+7341 3291
+7343 3292
+7345 3290
+7347 3290
+7350 3290
+7352 3290
+7354 3290
+7357 3290
+7359 3290
+7361 3290
+7364 3290
+7366 3290
+7368 3290
+7370 3290
+7373 3290
+7375 3290
+7377 3290
+7380 3290
+7382 3290
+7384 3290
+7387 3290
+7389 3293
+7391 3294
+7394 3290
+7396 3290
+7398 3290
+7400 3290
+7403 3290
+7405 3290
+7407 3290
+7410 3290
+7412 3290
+7414 3291
+7417 3291
+7419 3291
+7421 3290
+7423 3290
+7426 3290
+7428 3291
+7430 3291
+7433 3291
+7435 3293
+7437 3291
+7440 3291
+7442 3291
+7444 3291
+7447 3291
+7449 3290
+7451 3290
+7453 3290
+7456 3290
+7458 3290
+7460 3290
+7463 3290
+7465 3290
+7467 3290
+7470 3290
+7472 3290
+7474 3290
+7476 3290
+7479 3290
+7481 3290
+7483 3290
+7486 3290
+7488 3290
+7490 3290
+7493 3290
+7495 3290
+7497 3292
+7500 3295
+7502 3292
+7504 3292
+7506 3292
+7509 3291
+7511 3291
+7513 3291
+7516 3290
+7518 3290
+7520 3290
+7523 3290
+7525 3290
+7527 3290
+7529 3290
+7532 3290
+7534 3290
+7536 3291
+7539 3291
+7541 3291
+7543 3290
+7546 3290
+7548 3290
+7550 3290
+7553 3291
+7555 3290
+7557 3290
+7559 3290
+7562 3290
+7564 3290
+7566 3290
+7569 3290
+7571 3290
+7573 3291
+7576 3291
+7578 3291
+7580 3291
+7582 3290
+7585 3290
+7587 3290
+7589 3291
+7592 3290
+7594 3290
+7596 3290
+7599 3290
+7601 3290
+7603 3290
+7606 3290
+7608 3290
+7610 3290
+7612 3290
+7615 3290
+7617 3290
+7619 3290
+7622 3290
+7624 3290
+7626 3290
+7629 3290
+7631 3290
+7633 3290
+7635 3290
+7638 3290
+7640 3290
+7642 3290
+7645 3290
+7647 3290
+7649 3290
+7652 3290
+7654 3290
+7656 3290
+7658 3290
+7661 3290
+7663 3290
+7665 3290
+7668 3290
+7670 3290
+7672 3290
+7675 3291
+7677 3291
+7679 3291
+7682 3290
+7684 3290
+7686 3290
+7688 3292
+7691 3294
+7693 3294
+7695 3290
+7698 3290
+7700 3290
+7702 3290
+7705 3290
+7707 3290
+7709 3290
+7711 3291
+7714 3290
+7716 3290
+7718 3290
+7721 3290
+7723 3290
+7725 3290
+7728 3290
+7730 3290
+7732 3290
+7735 3290
+7737 3290
+7739 3290
+7741 3290
+7744 3290
+7746 3290
+7748 3290
+7751 3290
+7753 3290
+7755 3290
+7758 3290
+7760 3290
+7762 3290
+7764 3290
+7767 3290
+7769 3290
+7771 3290
+7774 3290
+7776 3290
+7778 3290
+7781 3290
+7783 3290
+7785 3290
+7788 3290
+7790 3290
+7792 3290
+7794 3290
+7797 3290
+7799 3290
+7801 3290
+7804 3291
+7806 3291
+7808 3290
+7811 3290
+7813 3290
+7815 3290
+7817 3290
+7820 3290
+7822 3290
+7824 3290
+7827 3290
+7829 3290
+7831 3290
+7834 3290
+7836 3290
+7838 3290
+7841 3290
+7843 3290
+7845 3290
+7847 3290
+7850 3290
+7852 3290
+7854 3290
+7857 3290
+7859 3290
+7861 3290
+7864 3290
+7866 3290
+7868 3290
+7870 3290
+7873 3290
+7875 3290
+7877 3290
+7880 3291
+7882 3291
+7884 3291
+7887 3290
+7889 3290
+7891 3290
+7894 3290
+7896 3291
+7898 3290
+7900 3290
+7903 3290
+7905 3290
+7907 3290
+7910 3290
+7912 3291
+7914 3290
+7917 3290
+7919 3290
+7921 3291
+7923 3291
+7926 3291
+7928 3290
+7930 3290
+7933 3290
+7935 3290
+7937 3290
+7940 3290
+7942 3290
+7944 3290
+7946 3290
+7949 3290
+7951 3290
+7953 3290
+7956 3290
+7958 3290
+7960 3290
+7963 3290
+7965 3290
+7967 3290
+7970 3290
+7972 3290
+7974 3290
+7976 3290
+7979 3290
+7981 3290
+7983 3290
+7986 3290
+7988 3290
+7990 3290
+7993 3290
+7995 3290
+7997 3290
+7999 3290
+8002 3290
+8004 3290
+8006 3290
+8009 3290
+8011 3290
+8013 3290
+8016 3290
+8018 3290
+8020 3290
+8023 3290
+8025 3290
+8027 3290
+8029 3290
+8032 3290
+8034 3290
+8036 3290
+8039 3290
+8041 3290
+8043 3290
+8046 3290
+8048 3290
+8050 3290
+8052 3290
+500 MLine
+End
+
+Begin %I MLine
+[1 0 0 1 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+0 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 274
+8052 3290
+8055 3290
+8057 3290
+8059 3290
+8062 3290
+8064 3290
+8066 3290
+8069 3290
+8071 3290
+8073 3290
+8076 3290
+8078 3290
+8080 3290
+8082 3290
+8085 3290
+8087 3290
+8089 3290
+8092 3290
+8094 3290
+8096 3290
+8099 3290
+8101 3290
+8103 3290
+8105 3290
+8108 3290
+8110 3290
+8112 3290
+8115 3290
+8117 3290
+8119 3290
+8122 3290
+8124 3290
+8126 3290
+8129 3290
+8131 3290
+8133 3290
+8135 3290
+8138 3290
+8140 3290
+8142 3290
+8145 3290
+8147 3290
+8149 3290
+8152 3290
+8154 3290
+8156 3290
+8158 3290
+8161 3290
+8163 3290
+8165 3290
+8168 3290
+8170 3290
+8172 3290
+8175 3290
+8177 3290
+8179 3290
+8182 3290
+8184 3290
+8186 3290
+8188 3290
+8191 3290
+8193 3290
+8195 3290
+8198 3290
+8200 3290
+8202 3290
+8205 3290
+8207 3290
+8209 3290
+8211 3290
+8214 3290
+8216 3290
+8218 3290
+8221 3290
+8223 3290
+8225 3290
+8228 3290
+8230 3290
+8232 3290
+8234 3290
+8237 3290
+8239 3290
+8241 3290
+8244 3290
+8246 3290
+8248 3290
+8251 3290
+8253 3290
+8255 3290
+8258 3290
+8260 3290
+8262 3290
+8264 3290
+8267 3290
+8269 3290
+8271 3290
+8274 3290
+8276 3290
+8278 3290
+8281 3290
+8283 3290
+8285 3290
+8287 3290
+8290 3290
+8292 3290
+8294 3290
+8297 3290
+8299 3290
+8301 3290
+8304 3290
+8306 3290
+8308 3290
+8311 3290
+8313 3290
+8315 3290
+8317 3290
+8320 3290
+8322 3290
+8324 3290
+8327 3290
+8329 3290
+8331 3290
+8334 3290
+8336 3290
+8338 3290
+8340 3290
+8343 3290
+8345 3290
+8347 3290
+8350 3290
+8352 3290
+8354 3290
+8357 3290
+8359 3290
+8361 3290
+8364 3290
+8366 3290
+8368 3290
+8370 3290
+8373 3290
+8375 3290
+8377 3290
+8380 3290
+8382 3290
+8384 3290
+8387 3290
+8389 3290
+8391 3290
+8393 3290
+8396 3290
+8398 3290
+8400 3290
+8403 3290
+8405 3290
+8407 3290
+8410 3290
+8412 3290
+8414 3290
+8417 3290
+8419 3290
+8421 3290
+8423 3290
+8426 3290
+8428 3290
+8430 3290
+8433 3290
+8435 3290
+8437 3290
+8440 3290
+8442 3290
+8444 3290
+8446 3290
+8449 3290
+8451 3290
+8453 3290
+8456 3290
+8458 3290
+8460 3290
+8463 3290
+8465 3290
+8467 3290
+8470 3290
+8472 3290
+8474 3290
+8476 3290
+8479 3290
+8481 3290
+8483 3290
+8486 3290
+8488 3290
+8490 3290
+8493 3290
+8495 3290
+8497 3290
+8499 3290
+8502 3290
+8504 3290
+8506 3290
+8509 3290
+8511 3290
+8513 3290
+8516 3290
+8518 3290
+8520 3290
+8522 3290
+8525 3290
+8527 3290
+8529 3290
+8532 3290
+8534 3290
+8536 3290
+8539 3290
+8541 3290
+8543 3290
+8546 3290
+8548 3290
+8550 3290
+8552 3290
+8555 3290
+8557 3290
+8559 3290
+8562 3290
+8564 3290
+8566 3290
+8569 3290
+8571 3290
+8573 3290
+8575 3290
+8578 3290
+8580 3290
+8582 3290
+8585 3290
+8587 3290
+8589 3290
+8592 3290
+8594 3290
+8596 3290
+8599 3290
+8601 3290
+8603 3290
+8605 3290
+8608 3290
+8610 3290
+8612 3290
+8615 3290
+8617 3290
+8619 3290
+8622 3290
+8624 3290
+8626 3290
+8628 3290
+8631 3290
+8633 3290
+8635 3290
+8638 3290
+8640 3290
+8642 3290
+8645 3290
+8647 3290
+8649 3290
+8652 3290
+8654 3290
+8656 3290
+8658 3290
+8661 3290
+8663 3290
+8665 3290
+8668 3290
+8670 3290
+8672 3290
+8675 3290
+8677 3290
+8679 3290
+8681 3290
+274 MLine
+End
+
+%%PageTrailer
+End %I eop
+showpage
+
+%%Trailer
+end
+%%EOF
diff --git a/gsl-1.9/doc/siman-test.eps b/gsl-1.9/doc/siman-test.eps
new file mode 100644
index 0000000..0b12a31
--- /dev/null
+++ b/gsl-1.9/doc/siman-test.eps
@@ -0,0 +1,11278 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: GNU libplot drawing library 4.1
+%%Title: PostScript plot
+%%CreationDate: Wed Dec 20 22:05:02 2006
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 1
+%%Pages: 1
+%%PageOrder: Ascend
+%%Orientation: Portrait
+%%BoundingBox: 62 177 500 576
+%%DocumentNeededResources:
+%%DocumentSuppliedResources: procset GNU_libplot 1.0 0
+%%EndComments
+
+%%BeginDefaults
+%%PageResources:
+%%EndDefaults
+
+%%BeginProlog
+%%EndProlog
+
+%%BeginSetup
+/DrawDict 50 dict def
+DrawDict begin
+%%BeginResource procset GNU_libplot 1.0 0
+/none null def
+/numGraphicParameters 17 def
+/stringLimit 65535 def
+/arrowHeight 8 def
+/eoFillRule true def
+
+/Begin { save numGraphicParameters dict begin } def
+/End { end restore } def
+
+/SetB {
+dup type /nulltype eq {
+pop
+false /brushRightArrow idef
+false /brushLeftArrow idef
+true /brushNone idef
+} {
+/brushDashOffset idef
+/brushDashArray idef
+0 ne /brushRightArrow idef
+0 ne /brushLeftArrow idef
+/brushWidth idef
+false /brushNone idef
+} ifelse
+} def
+
+/SetCFg {
+/fgblue idef
+/fggreen idef
+/fgred idef
+} def
+
+/SetCBg {
+/bgblue idef
+/bggreen idef
+/bgred idef
+} def
+
+/SetF {
+/printSize idef
+/printFont idef
+} def
+
+/SetP {
+dup type /nulltype eq {
+pop true /patternNone idef
+} {
+/patternGrayLevel idef
+patternGrayLevel -1 eq {
+/patternString idef
+} if
+false /patternNone idef
+} ifelse
+} def
+
+/BSpl {
+0 begin
+storexyn
+newpath
+n 1 gt {
+0 0 0 0 0 0 1 1 true subspline
+n 2 gt {
+0 0 0 0 1 1 2 2 false subspline
+1 1 n 3 sub {
+/i exch def
+i 1 sub dup i dup i 1 add dup i 2 add dup false subspline
+} for
+n 3 sub dup n 2 sub dup n 1 sub dup 2 copy false subspline
+} if
+n 2 sub dup n 1 sub dup 2 copy 2 copy false subspline
+patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if
+brushNone not { istroke } if
+0 0 1 1 leftarrow
+n 2 sub dup 1 sub dup rightarrow
+} if
+end
+} dup 0 4 dict put def
+
+/Circ {
+newpath
+0 360 arc
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+} def
+
+/CBSpl {
+0 begin
+dup 2 gt {
+storexyn
+newpath
+n 1 sub dup 0 0 1 1 2 2 true subspline
+1 1 n 3 sub {
+/i exch def
+i 1 sub dup i dup i 1 add dup i 2 add dup false subspline
+} for
+n 3 sub dup n 2 sub dup n 1 sub dup 0 0 false subspline
+n 2 sub dup n 1 sub dup 0 0 1 1 false subspline
+patternNone not { ifill } if
+brushNone not { istroke } if
+} {
+Poly
+} ifelse
+end
+} dup 0 4 dict put def
+
+/Elli {
+0 begin
+newpath
+4 2 roll
+translate
+scale
+0 0 1 0 360 arc
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+end
+} dup 0 1 dict put def
+
+/Line {
+0 begin
+2 storexyn
+newpath
+x 0 get y 0 get moveto
+x 1 get y 1 get lineto
+brushNone not { istroke } if
+0 0 1 1 leftarrow
+0 0 1 1 rightarrow
+end
+} dup 0 4 dict put def
+
+/MLine {
+0 begin
+storexyn
+newpath
+n 1 gt {
+x 0 get y 0 get moveto
+1 1 n 1 sub {
+/i exch def
+x i get y i get lineto
+} for
+patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if
+brushNone not { istroke } if
+0 0 1 1 leftarrow
+n 2 sub dup n 1 sub dup rightarrow
+} if
+end
+} dup 0 4 dict put def
+
+/Poly {
+3 1 roll
+newpath
+moveto
+-1 add
+{ lineto } repeat
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+} def
+
+/Rect {
+0 begin
+/t exch def
+/r exch def
+/b exch def
+/l exch def
+newpath
+l b moveto
+l t lineto
+r t lineto
+r b lineto
+closepath
+patternNone not { ifill } if
+brushNone not { istroke } if
+end
+} dup 0 4 dict put def
+
+/Text {
+ishow
+} def
+
+/idef {
+dup where { pop pop pop } { exch def } ifelse
+} def
+
+/ifill {
+0 begin
+gsave
+patternGrayLevel -1 ne {
+fgred bgred fgred sub patternGrayLevel mul add
+fggreen bggreen fggreen sub patternGrayLevel mul add
+fgblue bgblue fgblue sub patternGrayLevel mul add setrgbcolor
+eoFillRule { eofill } { fill } ifelse
+} {
+eoFillRule { eoclip } { clip } ifelse
+originalCTM setmatrix
+pathbbox /t exch def /r exch def /b exch def /l exch def
+/w r l sub ceiling cvi def
+/h t b sub ceiling cvi def
+/imageByteWidth w 8 div ceiling cvi def
+/imageHeight h def
+bgred bggreen bgblue setrgbcolor
+eoFillRule { eofill } { fill } ifelse
+fgred fggreen fgblue setrgbcolor
+w 0 gt h 0 gt and {
+l b translate w h scale
+w h true [w 0 0 h neg 0 h] { patternproc } imagemask
+} if
+} ifelse
+grestore
+end
+} dup 0 8 dict put def
+
+/istroke {
+gsave
+brushDashOffset -1 eq {
+[] 0 setdash
+1 setgray
+} {
+brushDashArray brushDashOffset setdash
+fgred fggreen fgblue setrgbcolor
+} ifelse
+brushWidth setlinewidth
+originalCTM setmatrix
+stroke
+grestore
+} def
+
+/ishow {
+0 begin
+gsave
+fgred fggreen fgblue setrgbcolor
+/fontDict printFont findfont printSize scalefont dup setfont def
+/descender fontDict begin 0 /FontBBox load 1 get FontMatrix end
+transform exch pop def
+/vertoffset 1 printSize sub descender sub def {
+0 vertoffset moveto show
+/vertoffset vertoffset printSize sub def
+} forall
+grestore
+end
+} dup 0 3 dict put def
+
+/patternproc {
+0 begin
+/patternByteLength patternString length def
+/patternHeight patternByteLength 8 mul sqrt cvi def
+/patternWidth patternHeight def
+/patternByteWidth patternWidth 8 idiv def
+/imageByteMaxLength imageByteWidth imageHeight mul
+stringLimit patternByteWidth sub min def
+/imageMaxHeight imageByteMaxLength imageByteWidth idiv patternHeight idiv
+patternHeight mul patternHeight max def
+/imageHeight imageHeight imageMaxHeight sub store
+/imageString imageByteWidth imageMaxHeight mul patternByteWidth add string def
+0 1 imageMaxHeight 1 sub {
+/y exch def
+/patternRow y patternByteWidth mul patternByteLength mod def
+/patternRowString patternString patternRow patternByteWidth getinterval def
+/imageRow y imageByteWidth mul def
+0 patternByteWidth imageByteWidth 1 sub {
+/x exch def
+imageString imageRow x add patternRowString putinterval
+} for
+} for
+imageString
+end
+} dup 0 12 dict put def
+
+/min {
+dup 3 2 roll dup 4 3 roll lt { exch } if pop
+} def
+
+/max {
+dup 3 2 roll dup 4 3 roll gt { exch } if pop
+} def
+
+/midpoint {
+0 begin
+/y1 exch def
+/x1 exch def
+/y0 exch def
+/x0 exch def
+x0 x1 add 2 div
+y0 y1 add 2 div
+end
+} dup 0 4 dict put def
+
+/thirdpoint {
+0 begin
+/y1 exch def
+/x1 exch def
+/y0 exch def
+/x0 exch def
+x0 2 mul x1 add 3 div
+y0 2 mul y1 add 3 div
+end
+} dup 0 4 dict put def
+
+/subspline {
+0 begin
+/movetoNeeded exch def
+y exch get /y3 exch def
+x exch get /x3 exch def
+y exch get /y2 exch def
+x exch get /x2 exch def
+y exch get /y1 exch def
+x exch get /x1 exch def
+y exch get /y0 exch def
+x exch get /x0 exch def
+x1 y1 x2 y2 thirdpoint
+/p1y exch def
+/p1x exch def
+x2 y2 x1 y1 thirdpoint
+/p2y exch def
+/p2x exch def
+x1 y1 x0 y0 thirdpoint
+p1x p1y midpoint
+/p0y exch def
+/p0x exch def
+x2 y2 x3 y3 thirdpoint
+p2x p2y midpoint
+/p3y exch def
+/p3x exch def
+movetoNeeded { p0x p0y moveto } if
+p1x p1y p2x p2y p3x p3y curveto
+end
+} dup 0 17 dict put def
+
+/storexyn {
+/n exch def
+/y n array def
+/x n array def
+n 1 sub -1 0 {
+/i exch def
+y i 3 2 roll put
+x i 3 2 roll put
+} for
+} def
+
+/arrowhead {
+0 begin
+transform originalCTM itransform
+/taily exch def
+/tailx exch def
+transform originalCTM itransform
+/tipy exch def
+/tipx exch def
+/dy tipy taily sub def
+/dx tipx tailx sub def
+/angle dx 0 ne dy 0 ne or { dy dx atan } { 90 } ifelse def
+gsave
+originalCTM setmatrix
+tipx tipy translate
+angle rotate
+newpath
+arrowHeight neg arrowWidth 2 div moveto
+0 0 lineto
+arrowHeight neg arrowWidth 2 div neg lineto
+patternNone not {
+originalCTM setmatrix
+/padtip arrowHeight 2 exp 0.25 arrowWidth 2 exp mul add sqrt brushWidth mul
+arrowWidth div def
+/padtail brushWidth 2 div def
+tipx tipy translate
+angle rotate
+padtip 0 translate
+arrowHeight padtip add padtail add arrowHeight div dup scale
+arrowheadpath
+ifill
+} if
+brushNone not {
+originalCTM setmatrix
+tipx tipy translate
+angle rotate
+arrowheadpath
+istroke
+} if
+grestore
+end
+} dup 0 9 dict put def
+
+/arrowheadpath {
+newpath
+arrowHeight neg arrowWidth 2 div moveto
+0 0 lineto
+arrowHeight neg arrowWidth 2 div neg lineto
+} def
+
+/leftarrow {
+0 begin
+y exch get /taily exch def
+x exch get /tailx exch def
+y exch get /tipy exch def
+x exch get /tipx exch def
+brushLeftArrow { tipx tipy tailx taily arrowhead } if
+end
+} dup 0 4 dict put def
+
+/rightarrow {
+0 begin
+y exch get /tipy exch def
+x exch get /tipx exch def
+y exch get /taily exch def
+x exch get /tailx exch def
+brushRightArrow { tipx tipy tailx taily arrowhead } if
+end
+} dup 0 4 dict put def
+%%EndResource
+%%EndSetup
+
+%%Page: 1 1
+%%PageResources:
+%%PageBoundingBox: 62 177 500 576
+%%BeginPageSetup
+%I Idraw 8
+
+Begin
+%I b u
+%I cfg u
+%I cbg u
+%I f u
+%I p u
+%I t
+[ 1 0 0 1 0 0 ] concat
+/originalCTM matrix currentmatrix def
+/trueoriginalCTM matrix currentmatrix def
+%%EndPageSetup
+
+Begin %I Rect
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I
+2304 2304 9216 9216 Rect
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+2315 2151
+2348 2140
+2370 2107
+2381 2052
+2381 2019
+2370 1964
+2348 1931
+2315 1920
+2293 1920
+2260 1931
+2238 1964
+2227 2019
+2227 2052
+2238 2107
+2260 2140
+2293 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+2293 2151
+2271 2140
+2260 2129
+2249 2107
+2238 2052
+2238 2019
+2249 1964
+2260 1942
+2271 1931
+2293 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+2315 1920
+2337 1931
+2348 1942
+2359 1964
+2370 2019
+2370 2052
+2359 2107
+2348 2129
+2337 2140
+2315 2151
+10 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 9216
+2304 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2304 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3181 2151
+3159 2041
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 19
+3159 2041
+3181 2063
+3214 2074
+3247 2074
+3280 2063
+3302 2041
+3313 2008
+3313 1986
+3302 1953
+3280 1931
+3247 1920
+3214 1920
+3181 1931
+3170 1942
+3159 1964
+3159 1975
+3170 1986
+3181 1975
+3170 1964
+19 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+3247 2074
+3269 2063
+3291 2041
+3302 2008
+3302 1986
+3291 1953
+3269 1931
+3247 1920
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3181 2151
+3291 2151
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+3181 2140
+3236 2140
+3291 2151
+3 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+3467 2151
+3500 2140
+3522 2107
+3533 2052
+3533 2019
+3522 1964
+3500 1931
+3467 1920
+3445 1920
+3412 1931
+3390 1964
+3379 2019
+3379 2052
+3390 2107
+3412 2140
+3445 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+3445 2151
+3423 2140
+3412 2129
+3401 2107
+3390 2052
+3390 2019
+3401 1964
+3412 1942
+3423 1931
+3445 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+3467 1920
+3489 1931
+3500 1942
+3511 1964
+3522 2019
+3522 2052
+3511 2107
+3500 2129
+3489 2140
+3467 2151
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+3687 2151
+3720 2140
+3742 2107
+3753 2052
+3753 2019
+3742 1964
+3720 1931
+3687 1920
+3665 1920
+3632 1931
+3610 1964
+3599 2019
+3599 2052
+3610 2107
+3632 2140
+3665 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+3665 2151
+3643 2140
+3632 2129
+3621 2107
+3610 2052
+3610 2019
+3621 1964
+3632 1942
+3643 1931
+3665 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+3687 1920
+3709 1931
+3720 1942
+3731 1964
+3742 2019
+3742 2052
+3731 2107
+3720 2129
+3709 2140
+3687 2151
+10 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3456 9216
+3456 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+3456 2304
+3456 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+4234 2107
+4256 2118
+4289 2151
+4289 1920
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4278 2140
+4278 1920
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4234 1920
+4333 1920
+2 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+4509 2151
+4542 2140
+4564 2107
+4575 2052
+4575 2019
+4564 1964
+4542 1931
+4509 1920
+4487 1920
+4454 1931
+4432 1964
+4421 2019
+4421 2052
+4432 2107
+4454 2140
+4487 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+4487 2151
+4465 2140
+4454 2129
+4443 2107
+4432 2052
+4432 2019
+4443 1964
+4454 1942
+4465 1931
+4487 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+4509 1920
+4531 1931
+4542 1942
+4553 1964
+4564 2019
+4564 2052
+4553 2107
+4542 2129
+4531 2140
+4509 2151
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+4729 2151
+4762 2140
+4784 2107
+4795 2052
+4795 2019
+4784 1964
+4762 1931
+4729 1920
+4707 1920
+4674 1931
+4652 1964
+4641 2019
+4641 2052
+4652 2107
+4674 2140
+4707 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+4707 2151
+4685 2140
+4674 2129
+4663 2107
+4652 2052
+4652 2019
+4663 1964
+4674 1942
+4685 1931
+4707 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+4729 1920
+4751 1931
+4762 1942
+4773 1964
+4784 2019
+4784 2052
+4773 2107
+4762 2129
+4751 2140
+4729 2151
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+4949 2151
+4982 2140
+5004 2107
+5015 2052
+5015 2019
+5004 1964
+4982 1931
+4949 1920
+4927 1920
+4894 1931
+4872 1964
+4861 2019
+4861 2052
+4872 2107
+4894 2140
+4927 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+4927 2151
+4905 2140
+4894 2129
+4883 2107
+4872 2052
+4872 2019
+4883 1964
+4894 1942
+4905 1931
+4927 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+4949 1920
+4971 1931
+4982 1942
+4993 1964
+5004 2019
+5004 2052
+4993 2107
+4982 2129
+4971 2140
+4949 2151
+10 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4608 9216
+4608 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+4608 2304
+4608 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+5386 2107
+5408 2118
+5441 2151
+5441 1920
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5430 2140
+5430 1920
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5386 1920
+5485 1920
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5595 2151
+5573 2041
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 19
+5573 2041
+5595 2063
+5628 2074
+5661 2074
+5694 2063
+5716 2041
+5727 2008
+5727 1986
+5716 1953
+5694 1931
+5661 1920
+5628 1920
+5595 1931
+5584 1942
+5573 1964
+5573 1975
+5584 1986
+5595 1975
+5584 1964
+19 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+5661 2074
+5683 2063
+5705 2041
+5716 2008
+5716 1986
+5705 1953
+5683 1931
+5661 1920
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5595 2151
+5705 2151
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+5595 2140
+5650 2140
+5705 2151
+3 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+5881 2151
+5914 2140
+5936 2107
+5947 2052
+5947 2019
+5936 1964
+5914 1931
+5881 1920
+5859 1920
+5826 1931
+5804 1964
+5793 2019
+5793 2052
+5804 2107
+5826 2140
+5859 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+5859 2151
+5837 2140
+5826 2129
+5815 2107
+5804 2052
+5804 2019
+5815 1964
+5826 1942
+5837 1931
+5859 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+5881 1920
+5903 1931
+5914 1942
+5925 1964
+5936 2019
+5936 2052
+5925 2107
+5914 2129
+5903 2140
+5881 2151
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+6101 2151
+6134 2140
+6156 2107
+6167 2052
+6167 2019
+6156 1964
+6134 1931
+6101 1920
+6079 1920
+6046 1931
+6024 1964
+6013 2019
+6013 2052
+6024 2107
+6046 2140
+6079 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+6079 2151
+6057 2140
+6046 2129
+6035 2107
+6024 2052
+6024 2019
+6035 1964
+6046 1942
+6057 1931
+6079 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+6101 1920
+6123 1931
+6134 1942
+6145 1964
+6156 2019
+6156 2052
+6145 2107
+6134 2129
+6123 2140
+6101 2151
+10 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5760 9216
+5760 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5760 2304
+5760 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 20
+6516 2107
+6527 2096
+6516 2085
+6505 2096
+6505 2107
+6516 2129
+6527 2140
+6560 2151
+6604 2151
+6637 2140
+6648 2129
+6659 2107
+6659 2085
+6648 2063
+6615 2041
+6560 2019
+6538 2008
+6516 1986
+6505 1953
+6505 1920
+20 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+6604 2151
+6626 2140
+6637 2129
+6648 2107
+6648 2085
+6637 2063
+6604 2041
+6560 2019
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+6505 1942
+6516 1953
+6538 1953
+6593 1931
+6626 1931
+6648 1942
+6659 1953
+7 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+6538 1953
+6593 1920
+6637 1920
+6648 1931
+6659 1953
+6659 1975
+6 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+6813 2151
+6846 2140
+6868 2107
+6879 2052
+6879 2019
+6868 1964
+6846 1931
+6813 1920
+6791 1920
+6758 1931
+6736 1964
+6725 2019
+6725 2052
+6736 2107
+6758 2140
+6791 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+6791 2151
+6769 2140
+6758 2129
+6747 2107
+6736 2052
+6736 2019
+6747 1964
+6758 1942
+6769 1931
+6791 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+6813 1920
+6835 1931
+6846 1942
+6857 1964
+6868 2019
+6868 2052
+6857 2107
+6846 2129
+6835 2140
+6813 2151
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+7033 2151
+7066 2140
+7088 2107
+7099 2052
+7099 2019
+7088 1964
+7066 1931
+7033 1920
+7011 1920
+6978 1931
+6956 1964
+6945 2019
+6945 2052
+6956 2107
+6978 2140
+7011 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+7011 2151
+6989 2140
+6978 2129
+6967 2107
+6956 2052
+6956 2019
+6967 1964
+6978 1942
+6989 1931
+7011 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+7033 1920
+7055 1931
+7066 1942
+7077 1964
+7088 2019
+7088 2052
+7077 2107
+7066 2129
+7055 2140
+7033 2151
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+7253 2151
+7286 2140
+7308 2107
+7319 2052
+7319 2019
+7308 1964
+7286 1931
+7253 1920
+7231 1920
+7198 1931
+7176 1964
+7165 2019
+7165 2052
+7176 2107
+7198 2140
+7231 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+7231 2151
+7209 2140
+7198 2129
+7187 2107
+7176 2052
+7176 2019
+7187 1964
+7198 1942
+7209 1931
+7231 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+7253 1920
+7275 1931
+7286 1942
+7297 1964
+7308 2019
+7308 2052
+7297 2107
+7286 2129
+7275 2140
+7253 2151
+10 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6912 9216
+6912 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6912 2304
+6912 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 20
+7668 2107
+7679 2096
+7668 2085
+7657 2096
+7657 2107
+7668 2129
+7679 2140
+7712 2151
+7756 2151
+7789 2140
+7800 2129
+7811 2107
+7811 2085
+7800 2063
+7767 2041
+7712 2019
+7690 2008
+7668 1986
+7657 1953
+7657 1920
+20 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+7756 2151
+7778 2140
+7789 2129
+7800 2107
+7800 2085
+7789 2063
+7756 2041
+7712 2019
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+7657 1942
+7668 1953
+7690 1953
+7745 1931
+7778 1931
+7800 1942
+7811 1953
+7 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+7690 1953
+7745 1920
+7789 1920
+7800 1931
+7811 1953
+7811 1975
+6 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7899 2151
+7877 2041
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 19
+7877 2041
+7899 2063
+7932 2074
+7965 2074
+7998 2063
+8020 2041
+8031 2008
+8031 1986
+8020 1953
+7998 1931
+7965 1920
+7932 1920
+7899 1931
+7888 1942
+7877 1964
+7877 1975
+7888 1986
+7899 1975
+7888 1964
+19 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+7965 2074
+7987 2063
+8009 2041
+8020 2008
+8020 1986
+8009 1953
+7987 1931
+7965 1920
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+7899 2151
+8009 2151
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+7899 2140
+7954 2140
+8009 2151
+3 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+8185 2151
+8218 2140
+8240 2107
+8251 2052
+8251 2019
+8240 1964
+8218 1931
+8185 1920
+8163 1920
+8130 1931
+8108 1964
+8097 2019
+8097 2052
+8108 2107
+8130 2140
+8163 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+8163 2151
+8141 2140
+8130 2129
+8119 2107
+8108 2052
+8108 2019
+8119 1964
+8130 1942
+8141 1931
+8163 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+8185 1920
+8207 1931
+8218 1942
+8229 1964
+8240 2019
+8240 2052
+8229 2107
+8218 2129
+8207 2140
+8185 2151
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+8405 2151
+8438 2140
+8460 2107
+8471 2052
+8471 2019
+8460 1964
+8438 1931
+8405 1920
+8383 1920
+8350 1931
+8328 1964
+8317 2019
+8317 2052
+8328 2107
+8350 2140
+8383 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+8383 2151
+8361 2140
+8350 2129
+8339 2107
+8328 2052
+8328 2019
+8339 1964
+8350 1942
+8361 1931
+8383 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+8405 1920
+8427 1931
+8438 1942
+8449 1964
+8460 2019
+8460 2052
+8449 2107
+8438 2129
+8427 2140
+8405 2151
+10 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8064 9216
+8064 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+8064 2304
+8064 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+8820 2107
+8831 2096
+8820 2085
+8809 2096
+8809 2107
+8820 2129
+8831 2140
+8864 2151
+8908 2151
+8941 2140
+8952 2118
+8952 2085
+8941 2063
+8908 2052
+8875 2052
+15 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+8908 2151
+8930 2140
+8941 2118
+8941 2085
+8930 2063
+8908 2052
+6 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+8908 2052
+8930 2041
+8952 2019
+8963 1997
+8963 1964
+8952 1942
+8941 1931
+8908 1920
+8864 1920
+8831 1931
+8820 1942
+8809 1964
+8809 1975
+8820 1986
+8831 1975
+8820 1964
+16 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+8941 2030
+8952 1997
+8952 1964
+8941 1942
+8930 1931
+8908 1920
+6 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+9117 2151
+9150 2140
+9172 2107
+9183 2052
+9183 2019
+9172 1964
+9150 1931
+9117 1920
+9095 1920
+9062 1931
+9040 1964
+9029 2019
+9029 2052
+9040 2107
+9062 2140
+9095 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+9095 2151
+9073 2140
+9062 2129
+9051 2107
+9040 2052
+9040 2019
+9051 1964
+9062 1942
+9073 1931
+9095 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+9117 1920
+9139 1931
+9150 1942
+9161 1964
+9172 2019
+9172 2052
+9161 2107
+9150 2129
+9139 2140
+9117 2151
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+9337 2151
+9370 2140
+9392 2107
+9403 2052
+9403 2019
+9392 1964
+9370 1931
+9337 1920
+9315 1920
+9282 1931
+9260 1964
+9249 2019
+9249 2052
+9260 2107
+9282 2140
+9315 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+9315 2151
+9293 2140
+9282 2129
+9271 2107
+9260 2052
+9260 2019
+9271 1964
+9282 1942
+9293 1931
+9315 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+9337 1920
+9359 1931
+9370 1942
+9381 1964
+9392 2019
+9392 2052
+9381 2107
+9370 2129
+9359 2140
+9337 2151
+10 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+9557 2151
+9590 2140
+9612 2107
+9623 2052
+9623 2019
+9612 1964
+9590 1931
+9557 1920
+9535 1920
+9502 1931
+9480 1964
+9469 2019
+9469 2052
+9480 2107
+9502 2140
+9535 2151
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+9535 2151
+9513 2140
+9502 2129
+9491 2107
+9480 2052
+9480 2019
+9491 1964
+9502 1942
+9513 1931
+9535 1920
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+9557 1920
+9579 1931
+9590 1942
+9601 1964
+9612 2019
+9612 2052
+9601 2107
+9590 2129
+9579 2140
+9557 2151
+10 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 9216
+9216 9078
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2304
+9216 2442
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+1497 2392
+1519 2403
+1552 2436
+1552 2205
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1541 2425
+1541 2205
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1497 2205
+1596 2205
+2 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+1716 2216
+1705 2205
+1694 2216
+1705 2227
+4 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+1804 2392
+1815 2381
+1804 2370
+1793 2381
+1793 2392
+1804 2414
+1815 2425
+1848 2436
+1892 2436
+1925 2425
+1936 2403
+1936 2370
+1925 2348
+1892 2337
+1859 2337
+15 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+1892 2436
+1914 2425
+1925 2403
+1925 2370
+1914 2348
+1892 2337
+6 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+1892 2337
+1914 2326
+1936 2304
+1947 2282
+1947 2249
+1936 2227
+1925 2216
+1892 2205
+1848 2205
+1815 2216
+1804 2227
+1793 2249
+1793 2260
+1804 2271
+1815 2260
+1804 2249
+16 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+1925 2315
+1936 2282
+1936 2249
+1925 2227
+1914 2216
+1892 2205
+6 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2112 2414
+2112 2205
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2123 2436
+2123 2205
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+2123 2436
+2002 2271
+2178 2271
+3 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2079 2205
+2156 2205
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2304
+9078 2304
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2442 2304
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+1497 3544
+1519 3555
+1552 3588
+1552 3357
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1541 3577
+1541 3357
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1497 3357
+1596 3357
+2 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+1716 3368
+1705 3357
+1694 3368
+1705 3379
+4 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+1804 3544
+1815 3533
+1804 3522
+1793 3533
+1793 3544
+1804 3566
+1815 3577
+1848 3588
+1892 3588
+1925 3577
+1936 3555
+1936 3522
+1925 3500
+1892 3489
+1859 3489
+15 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+1892 3588
+1914 3577
+1925 3555
+1925 3522
+1914 3500
+1892 3489
+6 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+1892 3489
+1914 3478
+1936 3456
+1947 3434
+1947 3401
+1936 3379
+1925 3368
+1892 3357
+1848 3357
+1815 3368
+1804 3379
+1793 3401
+1793 3412
+1804 3423
+1815 3412
+1804 3401
+16 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+1925 3467
+1936 3434
+1936 3401
+1925 3379
+1914 3368
+1892 3357
+6 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2035 3588
+2013 3478
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 19
+2013 3478
+2035 3500
+2068 3511
+2101 3511
+2134 3500
+2156 3478
+2167 3445
+2167 3423
+2156 3390
+2134 3368
+2101 3357
+2068 3357
+2035 3368
+2024 3379
+2013 3401
+2013 3412
+2024 3423
+2035 3412
+2024 3401
+19 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+2101 3511
+2123 3500
+2145 3478
+2156 3445
+2156 3423
+2145 3390
+2123 3368
+2101 3357
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2035 3588
+2145 3588
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+2035 3577
+2090 3577
+2145 3588
+3 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 3456
+9078 3456
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3456
+2442 3456
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+1497 4696
+1519 4707
+1552 4740
+1552 4509
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1541 4729
+1541 4509
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1497 4509
+1596 4509
+2 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+1716 4520
+1705 4509
+1694 4520
+1705 4531
+4 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+1804 4696
+1815 4685
+1804 4674
+1793 4685
+1793 4696
+1804 4718
+1815 4729
+1848 4740
+1892 4740
+1925 4729
+1936 4707
+1936 4674
+1925 4652
+1892 4641
+1859 4641
+15 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+1892 4740
+1914 4729
+1925 4707
+1925 4674
+1914 4652
+1892 4641
+6 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+1892 4641
+1914 4630
+1936 4608
+1947 4586
+1947 4553
+1936 4531
+1925 4520
+1892 4509
+1848 4509
+1815 4520
+1804 4531
+1793 4553
+1793 4564
+1804 4575
+1815 4564
+1804 4553
+16 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+1925 4619
+1936 4586
+1936 4553
+1925 4531
+1914 4520
+1892 4509
+6 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 28
+2145 4707
+2134 4696
+2145 4685
+2156 4696
+2156 4707
+2145 4729
+2123 4740
+2090 4740
+2057 4729
+2035 4707
+2024 4685
+2013 4641
+2013 4575
+2024 4542
+2046 4520
+2079 4509
+2101 4509
+2134 4520
+2156 4542
+2167 4575
+2167 4586
+2156 4619
+2134 4641
+2101 4652
+2090 4652
+2057 4641
+2035 4619
+2024 4586
+28 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 9
+2090 4740
+2068 4729
+2046 4707
+2035 4685
+2024 4641
+2024 4575
+2035 4542
+2057 4520
+2079 4509
+9 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+2101 4509
+2123 4520
+2145 4542
+2156 4575
+2156 4586
+2145 4619
+2123 4641
+2101 4652
+8 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4608
+9078 4608
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4608
+2442 4608
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+1497 5848
+1519 5859
+1552 5892
+1552 5661
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1541 5881
+1541 5661
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1497 5661
+1596 5661
+2 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+1716 5672
+1705 5661
+1694 5672
+1705 5683
+4 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+1804 5848
+1815 5837
+1804 5826
+1793 5837
+1793 5848
+1804 5870
+1815 5881
+1848 5892
+1892 5892
+1925 5881
+1936 5859
+1936 5826
+1925 5804
+1892 5793
+1859 5793
+15 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+1892 5892
+1914 5881
+1925 5859
+1925 5826
+1914 5804
+1892 5793
+6 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+1892 5793
+1914 5782
+1936 5760
+1947 5738
+1947 5705
+1936 5683
+1925 5672
+1892 5661
+1848 5661
+1815 5672
+1804 5683
+1793 5705
+1793 5716
+1804 5727
+1815 5716
+1804 5705
+16 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+1925 5771
+1936 5738
+1936 5705
+1925 5683
+1914 5672
+1892 5661
+6 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2013 5892
+2013 5826
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+2013 5848
+2024 5870
+2046 5892
+2068 5892
+2123 5859
+2145 5859
+2156 5870
+2167 5892
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+2024 5870
+2046 5881
+2068 5881
+2123 5859
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+2167 5892
+2167 5859
+2156 5826
+2112 5771
+2101 5749
+2090 5716
+2090 5661
+7 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 5
+2156 5826
+2101 5771
+2090 5749
+2079 5716
+2079 5661
+5 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5760
+9078 5760
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5760
+2442 5760
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+1497 7000
+1519 7011
+1552 7044
+1552 6813
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1541 7033
+1541 6813
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1497 6813
+1596 6813
+2 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+1716 6824
+1705 6813
+1694 6824
+1705 6835
+4 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+1804 7000
+1815 6989
+1804 6978
+1793 6989
+1793 7000
+1804 7022
+1815 7033
+1848 7044
+1892 7044
+1925 7033
+1936 7011
+1936 6978
+1925 6956
+1892 6945
+1859 6945
+15 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+1892 7044
+1914 7033
+1925 7011
+1925 6978
+1914 6956
+1892 6945
+6 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+1892 6945
+1914 6934
+1936 6912
+1947 6890
+1947 6857
+1936 6835
+1925 6824
+1892 6813
+1848 6813
+1815 6824
+1804 6835
+1793 6857
+1793 6868
+1804 6879
+1815 6868
+1804 6857
+16 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+1925 6923
+1936 6890
+1936 6857
+1925 6835
+1914 6824
+1892 6813
+6 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 12
+2112 7044
+2145 7033
+2156 7011
+2156 6978
+2145 6956
+2112 6945
+2068 6945
+2035 6956
+2024 6978
+2024 7011
+2035 7033
+2068 7044
+12 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2068 7044
+2046 7033
+2035 7011
+2035 6978
+2046 6956
+2068 6945
+6 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2112 6945
+2134 6956
+2145 6978
+2145 7011
+2134 7033
+2112 7044
+6 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+2068 6945
+2035 6934
+2024 6923
+2013 6901
+2013 6857
+2024 6835
+2035 6824
+2068 6813
+2112 6813
+2145 6824
+2156 6835
+2167 6857
+2167 6901
+2156 6923
+2145 6934
+2112 6945
+16 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+2068 6945
+2046 6934
+2035 6923
+2024 6901
+2024 6857
+2035 6835
+2046 6824
+2068 6813
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+2112 6813
+2134 6824
+2145 6835
+2156 6857
+2156 6901
+2145 6923
+2134 6934
+2112 6945
+8 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 6912
+9078 6912
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 6912
+2442 6912
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+1497 8152
+1519 8163
+1552 8196
+1552 7965
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1541 8185
+1541 7965
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1497 7965
+1596 7965
+2 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+1716 7976
+1705 7965
+1694 7976
+1705 7987
+4 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+1804 8152
+1815 8141
+1804 8130
+1793 8141
+1793 8152
+1804 8174
+1815 8185
+1848 8196
+1892 8196
+1925 8185
+1936 8163
+1936 8130
+1925 8108
+1892 8097
+1859 8097
+15 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+1892 8196
+1914 8185
+1925 8163
+1925 8130
+1914 8108
+1892 8097
+6 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+1892 8097
+1914 8086
+1936 8064
+1947 8042
+1947 8009
+1936 7987
+1925 7976
+1892 7965
+1848 7965
+1815 7976
+1804 7987
+1793 8009
+1793 8020
+1804 8031
+1815 8020
+1804 8009
+16 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+1925 8075
+1936 8042
+1936 8009
+1925 7987
+1914 7976
+1892 7965
+6 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 28
+2156 8119
+2145 8086
+2123 8064
+2090 8053
+2079 8053
+2046 8064
+2024 8086
+2013 8119
+2013 8130
+2024 8163
+2046 8185
+2079 8196
+2101 8196
+2134 8185
+2156 8163
+2167 8130
+2167 8064
+2156 8020
+2145 7998
+2123 7976
+2090 7965
+2057 7965
+2035 7976
+2024 7998
+2024 8009
+2035 8020
+2046 8009
+2035 7998
+28 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+2079 8053
+2057 8064
+2035 8086
+2024 8119
+2024 8130
+2035 8163
+2057 8185
+2079 8196
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 9
+2101 8196
+2123 8185
+2145 8163
+2156 8130
+2156 8064
+2145 8020
+2134 7998
+2112 7976
+2090 7965
+9 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 8064
+9078 8064
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 8064
+2442 8064
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+1497 9304
+1519 9315
+1552 9348
+1552 9117
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1541 9337
+1541 9117
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1497 9117
+1596 9117
+2 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+1716 9128
+1705 9117
+1694 9128
+1705 9139
+4 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1892 9326
+1892 9117
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1903 9348
+1903 9117
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+1903 9348
+1782 9183
+1958 9183
+3 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1859 9117
+1936 9117
+2 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+2101 9348
+2134 9337
+2156 9304
+2167 9249
+2167 9216
+2156 9161
+2134 9128
+2101 9117
+2079 9117
+2046 9128
+2024 9161
+2013 9216
+2013 9249
+2024 9304
+2046 9337
+2079 9348
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+2079 9348
+2057 9337
+2046 9326
+2035 9304
+2024 9249
+2024 9216
+2035 9161
+2046 9139
+2057 9128
+2079 9117
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+2101 9117
+2123 9128
+2134 9139
+2145 9161
+2156 9216
+2156 9249
+2145 9304
+2134 9326
+2123 9337
+2101 9348
+10 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 9216
+9078 9216
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 9216
+2442 9216
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2304
+9161 2304
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2304
+2359 2304
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 2880
+9161 2880
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 2880
+2359 2880
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 3456
+9161 3456
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 3456
+2359 3456
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4032
+9161 4032
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4032
+2359 4032
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 4608
+9161 4608
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 4608
+2359 4608
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5184
+9161 5184
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5184
+2359 5184
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 5760
+9161 5760
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 5760
+2359 5760
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 6336
+9161 6336
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 6336
+2359 6336
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 6912
+9161 6912
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 6912
+2359 6912
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 7488
+9161 7488
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 7488
+2359 7488
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 8064
+9161 8064
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 8064
+2359 8064
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 8640
+9161 8640
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 8640
+2359 8640
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+9216 9216
+9161 9216
+2 MLine
+End
+
+Begin %I MLine
+[0.6776471 0 0 0.6776471 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+2304 9216
+2359 9216
+2 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+4858 1621
+4880 1610
+4891 1599
+4902 1577
+4902 1555
+4891 1533
+4880 1522
+4858 1511
+4836 1511
+4814 1522
+4803 1533
+4792 1555
+4792 1577
+4803 1599
+4814 1610
+4836 1621
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+4814 1610
+4803 1588
+4803 1544
+4814 1522
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+4880 1522
+4891 1544
+4891 1588
+4880 1610
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 5
+4891 1599
+4902 1610
+4924 1621
+4924 1610
+4902 1610
+5 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 9
+4803 1533
+4792 1522
+4781 1500
+4781 1489
+4792 1467
+4825 1456
+4880 1456
+4913 1445
+4924 1434
+9 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+4781 1489
+4792 1478
+4825 1467
+4880 1467
+4913 1456
+4924 1434
+4924 1423
+4913 1401
+4880 1390
+4814 1390
+4781 1401
+4770 1423
+4770 1434
+4781 1456
+4814 1467
+15 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 17
+5001 1555
+5133 1555
+5133 1577
+5122 1599
+5111 1610
+5089 1621
+5056 1621
+5023 1610
+5001 1588
+4990 1555
+4990 1533
+5001 1500
+5023 1478
+5056 1467
+5078 1467
+5111 1478
+5133 1500
+17 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+5122 1555
+5122 1588
+5111 1610
+3 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+5056 1621
+5034 1610
+5012 1588
+5001 1555
+5001 1533
+5012 1500
+5034 1478
+5056 1467
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5221 1621
+5221 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5232 1621
+5232 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+5232 1588
+5254 1610
+5287 1621
+5309 1621
+5342 1610
+5353 1588
+5353 1467
+7 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+5309 1621
+5331 1610
+5342 1588
+5342 1467
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5188 1621
+5232 1621
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5188 1467
+5265 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5309 1467
+5386 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 17
+5452 1555
+5584 1555
+5584 1577
+5573 1599
+5562 1610
+5540 1621
+5507 1621
+5474 1610
+5452 1588
+5441 1555
+5441 1533
+5452 1500
+5474 1478
+5507 1467
+5529 1467
+5562 1478
+5584 1500
+17 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 3
+5573 1555
+5573 1588
+5562 1610
+3 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+5507 1621
+5485 1610
+5463 1588
+5452 1555
+5452 1533
+5463 1500
+5485 1478
+5507 1467
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5672 1621
+5672 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5683 1621
+5683 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 10
+5683 1555
+5694 1588
+5716 1610
+5738 1621
+5771 1621
+5782 1610
+5782 1599
+5771 1588
+5760 1599
+5771 1610
+10 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5639 1621
+5683 1621
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+5639 1467
+5716 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 13
+5859 1599
+5859 1588
+5848 1588
+5848 1599
+5859 1610
+5881 1621
+5925 1621
+5947 1610
+5958 1599
+5969 1577
+5969 1500
+5980 1478
+5991 1467
+13 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 5
+5958 1599
+5958 1500
+5969 1478
+5991 1467
+6002 1467
+5 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 11
+5958 1577
+5947 1566
+5881 1555
+5848 1544
+5837 1522
+5837 1500
+5848 1478
+5881 1467
+5914 1467
+5936 1478
+5958 1500
+11 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+5881 1555
+5859 1544
+5848 1522
+5848 1500
+5859 1478
+5881 1467
+6 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+6079 1698
+6079 1511
+6090 1478
+6112 1467
+6134 1467
+6156 1478
+6167 1500
+7 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+6090 1698
+6090 1511
+6101 1478
+6112 1467
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6046 1621
+6134 1621
+2 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+6255 1687
+6244 1676
+6233 1687
+6244 1698
+4 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6244 1621
+6244 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6255 1621
+6255 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6211 1621
+6255 1621
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6211 1467
+6288 1467
+2 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+6431 1621
+6464 1610
+6486 1588
+6497 1555
+6497 1533
+6486 1500
+6464 1478
+6431 1467
+6409 1467
+6376 1478
+6354 1500
+6343 1533
+6343 1555
+6354 1588
+6376 1610
+6409 1621
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+6409 1621
+6387 1610
+6365 1588
+6354 1555
+6354 1533
+6365 1500
+6387 1478
+6409 1467
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+6431 1467
+6453 1478
+6475 1500
+6486 1533
+6486 1555
+6475 1588
+6453 1610
+6431 1621
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6585 1621
+6585 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6596 1621
+6596 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+6596 1588
+6618 1610
+6651 1621
+6673 1621
+6706 1610
+6717 1588
+6717 1467
+7 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+6673 1621
+6695 1610
+6706 1588
+6706 1467
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6552 1621
+6596 1621
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6552 1467
+6629 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+6673 1467
+6750 1467
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+974 5062
+1205 5062
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+974 5073
+1205 5073
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 14
+1007 5073
+985 5095
+974 5117
+974 5139
+985 5172
+1007 5194
+1040 5205
+1062 5205
+1095 5194
+1117 5172
+1128 5139
+1128 5117
+1117 5095
+1095 5073
+14 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+974 5139
+985 5161
+1007 5183
+1040 5194
+1062 5194
+1095 5183
+1117 5161
+1128 5139
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+974 5029
+974 5073
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1205 5029
+1205 5106
+2 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+974 5359
+985 5392
+1007 5414
+1040 5425
+1062 5425
+1095 5414
+1117 5392
+1128 5359
+1128 5337
+1117 5304
+1095 5282
+1062 5271
+1040 5271
+1007 5282
+985 5304
+974 5337
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+974 5337
+985 5315
+1007 5293
+1040 5282
+1062 5282
+1095 5293
+1117 5315
+1128 5337
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+1128 5359
+1117 5381
+1095 5403
+1062 5414
+1040 5414
+1007 5403
+985 5381
+974 5359
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+996 5601
+974 5612
+1018 5612
+996 5601
+985 5590
+974 5568
+974 5524
+985 5502
+996 5491
+1018 5491
+1029 5502
+1040 5524
+1062 5579
+1073 5601
+1084 5612
+15 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 15
+1007 5491
+1018 5502
+1029 5524
+1051 5579
+1062 5601
+1073 5612
+1106 5612
+1117 5601
+1128 5579
+1128 5535
+1117 5513
+1106 5502
+1084 5491
+1128 5491
+1106 5502
+15 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+908 5711
+919 5700
+908 5689
+897 5700
+4 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+974 5700
+1128 5700
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+974 5711
+1128 5711
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+974 5667
+974 5711
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1128 5667
+1128 5744
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+897 5820
+1084 5820
+1117 5831
+1128 5853
+1128 5875
+1117 5897
+1095 5908
+7 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+897 5831
+1084 5831
+1117 5842
+1128 5853
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+974 5787
+974 5875
+2 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+908 5996
+919 5985
+908 5974
+897 5985
+4 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+974 5985
+1128 5985
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+974 5996
+1128 5996
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+974 5952
+974 5996
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1128 5952
+1128 6029
+2 MLine
+End
+
+Begin %I Poly
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 16
+974 6172
+985 6205
+1007 6227
+1040 6238
+1062 6238
+1095 6227
+1117 6205
+1128 6172
+1128 6150
+1117 6117
+1095 6095
+1062 6084
+1040 6084
+1007 6095
+985 6117
+974 6150
+16 Poly
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+974 6150
+985 6128
+1007 6106
+1040 6095
+1062 6095
+1095 6106
+1117 6128
+1128 6150
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+1128 6172
+1117 6194
+1095 6216
+1062 6227
+1040 6227
+1007 6216
+985 6194
+974 6172
+8 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+974 6326
+1128 6326
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+974 6337
+1128 6337
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+1007 6337
+985 6359
+974 6392
+974 6414
+985 6447
+1007 6458
+1128 6458
+7 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 4
+974 6414
+985 6436
+1007 6447
+1128 6447
+4 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+974 6293
+974 6337
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1128 6293
+1128 6370
+2 MLine
+End
+
+Begin %I MLine
+[0.7807418 0 0 0.7807418 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+1 setlinecap 1 setlinejoin
+/eoFillRule true def
+%I b 65535
+1 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 2
+1128 6414
+1128 6491
+2 MLine
+End
+
+Begin %I MLine
+[1 0 0 1 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+0 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 5
+2304 3537
+2306 5851
+2309 6957
+2311 5040
+2311 2304
+5 MLine
+End
+
+Begin %I MLine
+[1 0 0 1 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+0 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 7
+2316 9216
+2318 3782
+2320 5046
+2322 5694
+2325 7425
+2327 2809
+2327 2304
+7 MLine
+End
+
+Begin %I MLine
+[1 0 0 1 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+0 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+2332 2304
+2332 6545
+2334 3779
+2336 2701
+2339 2863
+2341 4038
+2343 4677
+2343 2304
+8 MLine
+End
+
+Begin %I MLine
+[1 0 0 1 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+0 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 8
+2348 2304
+2348 6745
+2350 5723
+2352 4676
+2355 3001
+2357 5031
+2359 4958
+2359 2304
+8 MLine
+End
+
+Begin %I MLine
+[1 0 0 1 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+0 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 17
+2364 2304
+2364 5593
+2366 6131
+2369 5183
+2371 4312
+2373 4047
+2375 6887
+2378 3572
+2380 2957
+2382 6623
+2385 5578
+2387 5196
+2389 3144
+2392 5409
+2394 5349
+2396 3938
+2396 2304
+17 MLine
+End
+
+Begin %I MLine
+[1 0 0 1 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+0 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 23
+2401 2304
+2401 3893
+2403 5522
+2405 4905
+2408 5492
+2410 8222
+2412 7351
+2415 5980
+2417 5113
+2419 5349
+2422 2946
+2424 3768
+2426 3987
+2428 3116
+2431 2943
+2433 3963
+2435 6127
+2438 6093
+2440 5254
+2442 5632
+2445 5956
+2447 7000
+2449 2304
+23 MLine
+End
+
+Begin %I MLine
+[1 0 0 1 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+0 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 14
+2449 2304
+2451 5820
+2454 7758
+2456 5967
+2458 3336
+2461 4018
+2463 5883
+2465 5444
+2468 5422
+2470 3213
+2472 5818
+2474 6579
+2477 3669
+2477 2304
+14 MLine
+End
+
+Begin %I MLine
+[1 0 0 1 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+0 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 52
+2481 2304
+2481 3929
+2484 5008
+2486 5156
+2488 9181
+2491 7231
+2493 6319
+2495 3796
+2498 4272
+2500 5322
+2502 6001
+2504 4344
+2507 3939
+2509 4495
+2511 6707
+2514 6862
+2516 4186
+2518 6898
+2521 5929
+2523 2683
+2525 6786
+2527 5745
+2530 7087
+2532 6073
+2534 7508
+2537 5712
+2539 3585
+2541 4588
+2544 3257
+2546 5062
+2548 4287
+2551 6107
+2553 4268
+2555 5516
+2557 3495
+2560 7006
+2562 5126
+2564 4795
+2567 6427
+2569 6482
+2571 6155
+2574 5672
+2576 5571
+2578 5941
+2580 4184
+2583 4580
+2585 6938
+2587 7021
+2590 5638
+2592 6728
+2594 6274
+2597 2304
+52 MLine
+End
+
+Begin %I MLine
+[1 0 0 1 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+0 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 30
+2597 2304
+2599 5625
+2601 4085
+2604 3972
+2606 7103
+2608 4874
+2610 3563
+2613 5008
+2615 5237
+2617 4205
+2620 5002
+2622 6644
+2624 4303
+2627 3993
+2629 5486
+2631 3143
+2633 5398
+2636 2961
+2638 5134
+2640 4828
+2643 3800
+2645 5856
+2647 4655
+2650 5632
+2652 4448
+2654 6759
+2657 4162
+2659 5417
+2661 5031
+2663 2304
+30 MLine
+End
+
+Begin %I MLine
+[1 0 0 1 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+0 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 12
+2664 2304
+2666 5439
+2668 6260
+2670 5887
+2673 6677
+2675 3635
+2677 5685
+2680 6228
+2682 5760
+2684 5455
+2686 6136
+2689 2304
+12 MLine
+End
+
+Begin %I MLine
+[1 0 0 1 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+0 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 50
+2689 2304
+2691 5024
+2693 6701
+2696 5156
+2698 2972
+2700 5454
+2703 3338
+2705 4169
+2707 7335
+2710 5755
+2712 3025
+2714 3250
+2716 7785
+2719 3138
+2721 3858
+2723 5572
+2726 6626
+2728 3509
+2730 5704
+2733 4358
+2735 6663
+2737 2585
+2739 4067
+2742 5996
+2744 4279
+2746 4831
+2749 5393
+2751 3457
+2753 4996
+2756 5329
+2758 4711
+2760 5613
+2762 4766
+2765 6331
+2767 6019
+2769 3948
+2772 5539
+2774 3994
+2776 6042
+2779 5830
+2781 4390
+2783 3784
+2786 4605
+2788 4911
+2790 6647
+2792 4684
+2795 5122
+2797 4924
+2799 4768
+2799 2304
+50 MLine
+End
+
+Begin %I MLine
+[1 0 0 1 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+0 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 6
+2804 2304
+2804 5242
+2806 4333
+2809 3694
+2811 6115
+2811 2304
+6 MLine
+End
+
+Begin %I MLine
+[1 0 0 1 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+0 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 500
+2815 2304
+2815 4467
+2818 4577
+2820 2438
+2822 5659
+2825 4704
+2827 4326
+2829 5129
+2832 3356
+2834 5948
+2836 5731
+2839 5003
+2841 6929
+2843 5010
+2845 6503
+2848 5508
+2850 4844
+2852 4207
+2855 4908
+2857 5596
+2859 5035
+2862 4658
+2864 3556
+2866 3631
+2868 5071
+2871 5299
+2873 5722
+2875 4846
+2878 5313
+2880 5105
+2882 4724
+2885 4666
+2887 5480
+2889 4429
+2892 5102
+2894 3208
+2896 5477
+2898 4912
+2901 5978
+2903 6812
+2905 4435
+2908 4117
+2910 3539
+2912 5100
+2915 5103
+2917 4579
+2919 4502
+2921 5469
+2924 4849
+2926 5587
+2928 5009
+2931 4724
+2933 5662
+2935 5433
+2938 5155
+2940 5584
+2942 4712
+2945 4849
+2947 5169
+2949 4890
+2951 2614
+2954 5378
+2956 3964
+2958 2365
+2961 4798
+2963 6236
+2965 5300
+2968 4452
+2970 4730
+2972 6526
+2974 4494
+2977 3588
+2979 5140
+2981 4810
+2984 4655
+2986 5072
+2988 3927
+2991 5600
+2993 4667
+2995 5611
+2998 4792
+3000 5403
+3002 5353
+3004 5246
+3007 4527
+3009 7247
+3011 5939
+3014 4158
+3016 4188
+3018 5535
+3021 6841
+3023 3405
+3025 5342
+3027 4717
+3030 4895
+3032 5026
+3034 4201
+3037 2962
+3039 3987
+3041 5061
+3044 4744
+3046 3880
+3048 5879
+3050 6122
+3053 5621
+3055 2487
+3057 5431
+3060 5492
+3062 4565
+3064 5669
+3067 4395
+3069 4125
+3071 4975
+3074 4476
+3076 6096
+3078 5557
+3080 5672
+3083 4699
+3085 3673
+3087 4429
+3090 3668
+3092 5839
+3094 5223
+3097 4999
+3099 3406
+3101 5109
+3103 5254
+3106 3251
+3108 4486
+3110 5880
+3113 4431
+3115 5721
+3117 4393
+3120 4941
+3122 4302
+3124 4320
+3127 4424
+3129 4504
+3131 5623
+3133 3928
+3136 6113
+3138 5371
+3140 5003
+3143 6304
+3145 4655
+3147 5484
+3150 4500
+3152 3724
+3154 4679
+3156 4937
+3159 4296
+3161 4444
+3163 5901
+3166 4381
+3168 5522
+3170 5929
+3173 4851
+3175 4986
+3177 3870
+3180 5414
+3182 3886
+3184 4957
+3186 4988
+3189 5250
+3191 5554
+3193 4910
+3196 4632
+3198 5334
+3200 4401
+3203 5663
+3205 5207
+3207 4188
+3209 5253
+3212 5965
+3214 5414
+3216 5223
+3219 5346
+3221 5186
+3223 5702
+3226 4887
+3228 4813
+3230 4958
+3233 5399
+3235 4439
+3237 4607
+3239 5723
+3242 4556
+3244 5758
+3246 5238
+3249 3989
+3251 5187
+3253 5354
+3256 5395
+3258 5384
+3260 4405
+3262 5695
+3265 5284
+3267 4783
+3269 6017
+3272 4313
+3274 5041
+3276 4289
+3279 4922
+3281 2568
+3283 5001
+3286 4472
+3288 6198
+3290 4679
+3292 4732
+3295 4601
+3297 5628
+3299 4872
+3302 4235
+3304 4272
+3306 5159
+3309 5456
+3311 4979
+3313 3544
+3315 5845
+3318 4297
+3320 4715
+3322 4241
+3325 4155
+3327 6127
+3329 4949
+3332 5663
+3334 7135
+3336 6070
+3338 4776
+3341 3711
+3343 4841
+3345 4666
+3348 4580
+3350 5700
+3352 4175
+3355 4755
+3357 5891
+3359 4288
+3362 4761
+3364 4206
+3366 6330
+3368 5722
+3371 5133
+3373 5191
+3375 4366
+3378 4523
+3380 5576
+3382 4902
+3385 4596
+3387 6145
+3389 4578
+3391 4242
+3394 5414
+3396 4061
+3398 5454
+3401 3813
+3403 4829
+3405 4015
+3408 3936
+3410 4625
+3412 4686
+3415 5942
+3417 5630
+3419 4603
+3421 5883
+3424 5757
+3426 5687
+3428 5088
+3431 5724
+3433 5345
+3435 4432
+3438 4290
+3440 5754
+3442 5237
+3444 4678
+3447 5493
+3449 5110
+3451 5526
+3454 4421
+3456 3996
+3458 4873
+3461 6145
+3463 4156
+3465 4670
+3468 4872
+3470 4465
+3472 4470
+3474 4697
+3477 4071
+3479 5492
+3481 5191
+3484 6397
+3486 4783
+3488 5121
+3491 5867
+3493 4828
+3495 4516
+3497 5792
+3500 5033
+3502 4759
+3504 5772
+3507 4804
+3509 5069
+3511 4818
+3514 4310
+3516 5510
+3518 6439
+3521 4828
+3523 5190
+3525 4826
+3527 6038
+3530 4626
+3532 4145
+3534 4726
+3537 4729
+3539 5912
+3541 4813
+3544 4724
+3546 3617
+3548 3524
+3550 4776
+3553 5115
+3555 5425
+3557 5289
+3560 4423
+3562 5103
+3564 4669
+3567 5011
+3569 4038
+3571 5312
+3574 4374
+3576 4433
+3578 5816
+3580 5225
+3583 4792
+3585 4320
+3587 5230
+3590 5429
+3592 5146
+3594 6043
+3597 4608
+3599 4724
+3601 4995
+3603 5955
+3606 4970
+3608 5198
+3610 5223
+3613 5098
+3615 5289
+3617 5018
+3620 4799
+3622 5859
+3624 5077
+3626 4886
+3629 5030
+3631 4722
+3633 4902
+3636 5249
+3638 5146
+3640 4894
+3643 5205
+3645 5113
+3647 4019
+3650 6192
+3652 4959
+3654 4908
+3656 4151
+3659 5368
+3661 5460
+3663 5533
+3666 4432
+3668 5306
+3670 4747
+3673 5517
+3675 4903
+3677 5888
+3679 5045
+3682 3707
+3684 4496
+3686 5224
+3689 3817
+3691 5335
+3693 4246
+3696 3908
+3698 3978
+3700 4389
+3703 5548
+3705 4863
+3707 4990
+3709 5449
+3712 4750
+3714 4948
+3716 4503
+3719 5024
+3721 5842
+3723 4975
+3726 4969
+3728 5672
+3730 4207
+3732 5094
+3735 5487
+3737 5905
+3739 4975
+3742 5292
+3744 4716
+3746 4578
+3749 4806
+3751 5140
+3753 4651
+3756 4398
+3758 4084
+3760 3932
+3762 4535
+3765 4530
+3767 5463
+3769 4177
+3772 5480
+3774 5624
+3776 4472
+3779 4549
+3781 5584
+3783 5168
+3785 5452
+3788 3898
+3790 5100
+3792 5481
+3795 4696
+3797 5129
+3799 4514
+3802 5556
+3804 5008
+3806 5725
+3809 4827
+3811 5357
+3813 4856
+3815 5141
+3818 4934
+3820 4390
+3822 5634
+3825 4602
+3827 4882
+3829 4937
+3832 5407
+3834 4768
+3836 4654
+3838 4381
+3841 5030
+3843 5045
+3845 4798
+3848 4707
+3850 5390
+3852 4503
+3855 5255
+3857 6042
+3859 4896
+3862 4401
+3864 5028
+3866 4492
+3868 4866
+3871 4663
+3873 5255
+3875 5130
+3878 4599
+3880 5406
+3882 4901
+3885 5557
+3887 4326
+3889 5076
+3891 5056
+3894 5139
+3896 4070
+3898 5221
+3901 4788
+3903 5081
+3905 4399
+3908 4964
+3910 5117
+3912 4909
+3914 4777
+3917 4040
+3919 4724
+3921 5427
+3924 5186
+3926 4993
+3928 5212
+3931 4986
+3933 3864
+3935 4739
+3938 5034
+3940 4072
+3942 5754
+3944 5316
+3947 5252
+3949 5204
+3951 5875
+3954 4977
+3956 4313
+3958 4613
+3961 5136
+3963 5681
+500 MLine
+End
+
+Begin %I MLine
+[1 0 0 1 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+0 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 500
+3963 5681
+3965 4624
+3967 4461
+3970 5042
+3972 4438
+3974 5657
+3977 5399
+3979 3812
+3981 5833
+3984 5350
+3986 5458
+3988 4868
+3991 4783
+3993 5525
+3995 5588
+3997 5269
+4000 4408
+4002 4393
+4004 4922
+4007 5568
+4009 4510
+4011 4548
+4014 4411
+4016 4941
+4018 4841
+4020 4787
+4023 5808
+4025 4826
+4027 5128
+4030 4730
+4032 5017
+4034 5048
+4037 4799
+4039 4785
+4041 4375
+4044 5213
+4046 5568
+4048 4951
+4050 4989
+4053 4776
+4055 3940
+4057 4609
+4060 4454
+4062 4359
+4064 4590
+4067 4768
+4069 5576
+4071 5372
+4073 5167
+4076 5030
+4078 5282
+4080 5159
+4083 5125
+4085 4896
+4087 4279
+4090 4118
+4092 5246
+4094 4829
+4097 4675
+4099 4790
+4101 4279
+4103 4508
+4106 5837
+4108 5020
+4110 6001
+4113 5002
+4115 5008
+4117 4610
+4120 4644
+4122 4988
+4124 4288
+4126 5505
+4129 4759
+4131 4503
+4133 5020
+4136 5694
+4138 4314
+4140 5493
+4143 4564
+4145 5661
+4147 5420
+4150 5234
+4152 5288
+4154 4500
+4156 5004
+4159 5302
+4161 5500
+4163 4977
+4166 5156
+4168 5086
+4170 4999
+4173 4981
+4175 4772
+4177 4580
+4179 5139
+4182 5207
+4184 4276
+4186 4922
+4189 4906
+4191 5479
+4193 4975
+4196 5382
+4198 5500
+4200 5328
+4202 4469
+4205 4588
+4207 5326
+4209 4851
+4212 4663
+4214 5724
+4216 5431
+4219 4599
+4221 4955
+4223 5454
+4226 5015
+4228 4924
+4230 5393
+4232 5306
+4235 4856
+4237 4893
+4239 4664
+4242 5474
+4244 4599
+4246 5019
+4249 4673
+4251 4318
+4253 5647
+4255 5041
+4258 5775
+4260 5480
+4262 4783
+4265 4759
+4267 4643
+4269 4279
+4272 5278
+4274 5538
+4276 4722
+4279 5910
+4281 4905
+4283 4317
+4285 4774
+4288 4561
+4290 4561
+4292 4850
+4295 5098
+4297 4554
+4299 4532
+4302 5041
+4304 4924
+4306 4701
+4308 5099
+4311 5253
+4313 5298
+4315 5776
+4318 5030
+4320 4716
+4322 5266
+4325 4609
+4327 4966
+4329 4568
+4332 5418
+4334 4973
+4336 5141
+4338 4958
+4341 5121
+4343 5460
+4345 5672
+4348 4749
+4350 5100
+4352 4724
+4355 4232
+4357 5027
+4359 5046
+4361 5168
+4364 5320
+4366 5105
+4368 4777
+4371 5116
+4373 5775
+4375 4421
+4378 5031
+4380 4978
+4382 4845
+4385 5488
+4387 4590
+4389 4833
+4391 4965
+4394 4366
+4396 5320
+4398 4346
+4401 5449
+4403 4965
+4405 4866
+4408 5194
+4410 5116
+4412 5283
+4414 5371
+4417 5008
+4419 4760
+4421 4975
+4424 4994
+4426 5518
+4428 5115
+4431 4922
+4433 5072
+4435 5072
+4438 5072
+4440 5504
+4442 4922
+4444 4890
+4447 4962
+4449 4517
+4451 4768
+4454 5186
+4456 4646
+4458 5284
+4461 4966
+4463 5038
+4465 4969
+4467 4645
+4470 5660
+4472 4947
+4474 5178
+4477 5404
+4479 5398
+4481 5401
+4484 4963
+4486 5163
+4488 4833
+4490 5232
+4493 5383
+4495 5109
+4497 5093
+4500 4753
+4502 4643
+4504 4767
+4507 5108
+4509 4911
+4511 5149
+4514 4571
+4516 4375
+4518 4975
+4520 5094
+4523 4842
+4525 4658
+4527 5448
+4530 5934
+4532 5224
+4534 5224
+4537 4954
+4539 5292
+4541 4966
+4543 5091
+4546 4905
+4548 4974
+4550 4297
+4553 4940
+4555 4925
+4557 4921
+4560 4742
+4562 4752
+4564 5144
+4567 4895
+4569 5405
+4571 4855
+4573 4757
+4576 5108
+4578 5306
+4580 4644
+4583 5336
+4585 4894
+4587 4848
+4590 4655
+4592 5337
+4594 5515
+4596 4901
+4599 5022
+4601 5022
+4603 5548
+4606 4988
+4608 4623
+4610 4469
+4613 4490
+4615 4659
+4617 4980
+4620 5075
+4622 5099
+4624 4922
+4626 5054
+4629 5236
+4631 5052
+4633 5531
+4636 5225
+4638 5275
+4640 4977
+4643 4743
+4645 4717
+4647 5345
+4649 5088
+4652 4813
+4654 5338
+4656 5287
+4659 5098
+4661 4788
+4663 5424
+4666 4585
+4668 4910
+4670 5043
+4673 5206
+4675 5201
+4677 4620
+4679 5045
+4682 4696
+4684 4673
+4686 5296
+4689 4573
+4691 5206
+4693 5055
+4696 4435
+4698 4443
+4700 4889
+4702 5561
+4705 4966
+4707 4320
+4709 4736
+4712 4464
+4714 5158
+4716 4813
+4719 5148
+4721 5102
+4723 5191
+4726 5054
+4728 5194
+4730 4852
+4732 5080
+4735 5019
+4737 4851
+4739 4744
+4742 4957
+4744 4917
+4746 4926
+4749 5063
+4751 4728
+4753 4751
+4755 4911
+4758 4911
+4760 5027
+4762 5015
+4765 5015
+4767 5004
+4769 5004
+4772 4696
+4774 4820
+4776 4875
+4778 4522
+4781 5230
+4783 4775
+4785 5186
+4788 5368
+4790 5194
+4792 5205
+4795 4593
+4797 4913
+4799 5297
+4802 4835
+4804 4865
+4806 5045
+4808 4749
+4811 4941
+4813 4895
+4815 5172
+4818 4664
+4820 5231
+4822 4223
+4825 5269
+4827 4988
+4829 4988
+4831 5265
+4834 5192
+4836 4702
+4838 4962
+4841 5098
+4843 5098
+4845 5093
+4848 4871
+4850 4969
+4852 4969
+4855 4978
+4857 4868
+4859 5379
+4861 5102
+4864 5102
+4866 4823
+4868 5200
+4871 5394
+4873 5161
+4875 4883
+4878 5314
+4880 4925
+4882 4571
+4884 4774
+4887 5374
+4889 4838
+4891 4704
+4894 4783
+4896 5002
+4898 5002
+4901 4956
+4903 5232
+4905 4857
+4908 4670
+4910 4833
+4912 4762
+4914 5050
+4917 5168
+4919 4682
+4921 5204
+4924 4893
+4926 5064
+4928 4985
+4931 5071
+4933 4713
+4935 4922
+4937 5297
+4940 5261
+4942 4830
+4944 4959
+4947 4852
+4949 5581
+4951 4954
+4954 5296
+4956 4887
+4958 5213
+4961 4970
+4963 4837
+4965 5252
+4967 4464
+4970 5034
+4972 4849
+4974 5002
+4977 4985
+4979 4985
+4981 5084
+4984 5084
+4986 4684
+4988 4783
+4990 5093
+4993 4739
+4995 4795
+4997 5103
+5000 5384
+5002 5222
+5004 4611
+5007 5069
+5009 4831
+5011 4709
+5014 4707
+5016 4958
+5018 4943
+5020 4629
+5023 4886
+5025 5015
+5027 5035
+5030 4843
+5032 4694
+5034 5041
+5037 5073
+5039 5269
+5041 5017
+5043 4911
+5046 4843
+5048 4751
+5050 5015
+5053 4939
+5055 4967
+5057 4967
+5060 4985
+5062 4398
+5064 4722
+5066 4740
+5069 4921
+5071 5025
+5073 4880
+5076 4880
+5078 4927
+5080 5003
+5083 4812
+5085 5053
+5087 4348
+5090 4729
+5092 4669
+5094 5221
+5096 4690
+5099 4910
+5101 4959
+5103 4653
+5106 5057
+5108 4969
+5110 5184
+5113 4616
+500 MLine
+End
+
+Begin %I MLine
+[1 0 0 1 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+0 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 500
+5113 4616
+5115 4936
+5117 4540
+5119 4891
+5122 5043
+5124 4992
+5126 4778
+5129 5068
+5131 5131
+5133 5131
+5136 5045
+5138 5231
+5140 4833
+5143 5131
+5145 4709
+5147 5427
+5149 4974
+5152 4730
+5154 4888
+5156 5125
+5159 5035
+5161 5109
+5163 4732
+5166 5046
+5168 5046
+5170 4913
+5172 4913
+5175 4757
+5177 4984
+5179 4897
+5182 4825
+5184 5268
+5186 5224
+5189 5204
+5191 4592
+5193 5284
+5196 5072
+5198 5063
+5200 5062
+5202 5110
+5205 4821
+5207 5222
+5209 4620
+5212 4789
+5214 5325
+5216 4757
+5219 5111
+5221 5252
+5223 4927
+5225 5057
+5228 5170
+5230 5213
+5232 5114
+5235 4661
+5237 5304
+5239 4687
+5242 5291
+5244 4886
+5246 5107
+5249 4927
+5251 4770
+5253 4770
+5255 4834
+5258 5052
+5260 5234
+5262 4922
+5265 5106
+5267 4969
+5269 4969
+5272 5047
+5274 5101
+5276 4732
+5278 4789
+5281 4984
+5283 4820
+5285 4762
+5288 4758
+5290 5325
+5292 5300
+5295 5152
+5297 5128
+5299 4924
+5302 4948
+5304 4948
+5306 4948
+5308 4993
+5311 4662
+5313 5063
+5315 5118
+5318 4630
+5320 5277
+5322 4788
+5325 5040
+5327 4895
+5329 4819
+5331 4819
+5334 4972
+5336 5243
+5338 4697
+5341 4708
+5343 4735
+5345 4944
+5348 5163
+5350 5094
+5352 4961
+5354 4702
+5357 4737
+5359 5242
+5361 4990
+5364 4830
+5366 5019
+5368 4972
+5371 4972
+5373 5282
+5375 5063
+5378 5126
+5380 5103
+5382 5103
+5384 4722
+5387 5052
+5389 5354
+5391 4988
+5394 4971
+5396 4941
+5398 4941
+5401 4961
+5403 4670
+5405 4846
+5407 4982
+5410 4975
+5412 5088
+5414 4652
+5417 5151
+5419 5213
+5421 4920
+5424 5019
+5426 5019
+5428 4846
+5431 5164
+5433 4990
+5435 4942
+5437 4957
+5440 5141
+5442 5118
+5444 4895
+5447 5205
+5449 5178
+5451 5178
+5454 4697
+5456 4697
+5458 4591
+5460 5278
+5463 5107
+5465 4720
+5467 4883
+5470 5075
+5472 5075
+5474 5060
+5477 5473
+5479 4735
+5481 4941
+5484 5004
+5486 5054
+5488 4836
+5490 5050
+5493 5047
+5495 4856
+5497 5001
+5500 4828
+5502 4963
+5504 5065
+5507 4942
+5509 4840
+5511 5395
+5513 4773
+5516 4962
+5518 4972
+5520 5125
+5523 5100
+5525 5015
+5527 5017
+5530 4844
+5532 5343
+5534 5009
+5537 5065
+5539 5384
+5541 5182
+5543 5004
+5546 5109
+5548 4874
+5550 4995
+5553 4971
+5555 5002
+5557 5002
+5560 4792
+5562 4593
+5564 4773
+5566 4773
+5569 5186
+5571 5155
+5573 4967
+5576 4978
+5578 4731
+5580 5171
+5583 4789
+5585 4789
+5587 4789
+5590 4996
+5592 4996
+5594 5008
+5596 4823
+5599 4823
+5601 4875
+5603 5014
+5606 5230
+5608 4985
+5610 4865
+5613 4880
+5615 5204
+5617 5122
+5619 4957
+5622 4826
+5624 4835
+5626 4881
+5629 5042
+5631 5197
+5633 5026
+5636 4863
+5638 5049
+5640 4837
+5642 4870
+5645 5100
+5647 5098
+5649 5138
+5652 4545
+5654 4803
+5656 4999
+5659 4950
+5661 4913
+5663 4995
+5666 5133
+5668 4899
+5670 4799
+5672 4887
+5675 4798
+5677 5091
+5679 4990
+5682 4853
+5684 5096
+5686 5096
+5689 5032
+5691 5032
+5693 5032
+5695 4999
+5698 4791
+5700 4800
+5702 4800
+5705 4874
+5707 4856
+5709 4943
+5712 4808
+5714 5105
+5716 5032
+5719 4985
+5721 4745
+5723 4780
+5725 5016
+5728 5016
+5730 5063
+5732 4903
+5735 5186
+5737 4701
+5739 5222
+5742 5039
+5744 5016
+5746 5016
+5748 4882
+5751 5087
+5753 5087
+5755 5115
+5758 5402
+5760 4911
+5762 5054
+5765 5054
+5767 4908
+5769 4908
+5772 4973
+5774 4989
+5776 4989
+5778 5011
+5781 4889
+5783 5015
+5785 5077
+5788 5139
+5790 5245
+5792 4767
+5795 5118
+5797 4922
+5799 5041
+5801 5007
+5804 5073
+5806 5039
+5808 4969
+5811 5111
+5813 5111
+5815 4875
+5818 5111
+5820 4901
+5822 4912
+5825 5042
+5827 4773
+5829 4886
+5831 5244
+5834 4826
+5836 4982
+5838 4996
+5841 4996
+5843 4996
+5845 5085
+5848 5017
+5850 5017
+5852 5037
+5854 4850
+5857 5118
+5859 4948
+5861 4755
+5864 5069
+5866 5172
+5868 4966
+5871 4717
+5873 5193
+5875 5160
+5878 4758
+5880 4785
+5882 5106
+5884 4889
+5887 4898
+5889 4921
+5891 4921
+5894 4709
+5896 5255
+5898 4906
+5901 4906
+5903 4799
+5905 4860
+5907 4912
+5910 5085
+5912 4821
+5914 5015
+5917 4876
+5919 4908
+5921 4996
+5924 4996
+5926 4870
+5928 5102
+5930 4948
+5933 4804
+5935 4804
+5937 4899
+5940 4973
+5942 4973
+5944 4973
+5947 5193
+5949 5193
+5951 5197
+5954 5084
+5956 4980
+5958 4844
+5960 5138
+5963 5081
+5965 4743
+5967 5055
+5970 5055
+5972 4734
+5974 4863
+5977 5062
+5979 5103
+5981 4989
+5983 4952
+5986 5019
+5988 4744
+5990 4856
+5993 5131
+5995 5131
+5997 4985
+6000 4926
+6002 5111
+6004 5012
+6007 5207
+6009 5159
+6011 5159
+6013 5026
+6016 5159
+6018 4791
+6020 5094
+6023 5122
+6025 4870
+6027 5126
+6030 5008
+6032 4911
+6034 4772
+6036 5192
+6039 4828
+6041 4813
+6043 4813
+6046 4811
+6048 4961
+6050 5075
+6053 5075
+6055 4982
+6057 4882
+6060 5048
+6062 4684
+6064 5190
+6066 4956
+6069 4956
+6071 5168
+6073 4899
+6076 4891
+6078 4754
+6080 4754
+6083 4910
+6085 5053
+6087 5057
+6089 4921
+6092 4921
+6094 4899
+6096 4899
+6099 5004
+6101 5009
+6103 5009
+6106 4985
+6108 4934
+6110 4934
+6113 5063
+6115 5063
+6117 5040
+6119 5040
+6122 4826
+6124 4802
+6126 4729
+6129 4729
+6131 4903
+6133 4951
+6136 5091
+6138 5091
+6140 5009
+6142 4810
+6145 5070
+6147 4822
+6149 5028
+6152 5028
+6154 4874
+6156 4985
+6159 4952
+6161 4918
+6163 4790
+6166 4972
+6168 4944
+6170 4873
+6172 4924
+6175 4723
+6177 4942
+6179 4994
+6182 4958
+6184 4958
+6186 4958
+6189 4975
+6191 5000
+6193 5267
+6195 5080
+6198 4910
+6200 4838
+6202 4838
+6205 5128
+6207 5136
+6209 4845
+6212 4840
+6214 4840
+6216 4840
+6218 4840
+6221 4897
+6223 5000
+6225 4893
+6228 5148
+6230 4831
+6232 4994
+6235 4908
+6237 5023
+6239 5014
+6242 5032
+6244 5032
+6246 5060
+6248 4918
+6251 4918
+6253 4999
+6255 4919
+6258 4925
+6260 4957
+6262 5204
+500 MLine
+End
+
+Begin %I MLine
+[1 0 0 1 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+0 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 500
+6262 5204
+6265 4829
+6267 4977
+6269 4803
+6271 5030
+6274 5015
+6276 4984
+6278 4984
+6281 4919
+6283 4890
+6285 4928
+6288 4928
+6290 4928
+6292 4928
+6295 4966
+6297 5039
+6299 5039
+6301 5163
+6304 4981
+6306 4823
+6308 4979
+6311 4943
+6313 4856
+6315 4856
+6318 4856
+6320 4849
+6322 4961
+6324 4948
+6327 4948
+6329 4973
+6331 4926
+6334 4926
+6336 4967
+6338 4952
+6341 5017
+6343 5017
+6345 4924
+6348 4851
+6350 4971
+6352 4965
+6354 4965
+6357 5061
+6359 4912
+6361 4949
+6364 4949
+6366 4949
+6368 5015
+6371 4796
+6373 4853
+6375 4857
+6377 4863
+6380 4835
+6382 4835
+6384 4929
+6387 4929
+6389 5048
+6391 4861
+6394 4954
+6396 4954
+6398 4721
+6401 4981
+6403 4883
+6405 4883
+6407 4883
+6410 5004
+6412 5062
+6414 5053
+6417 5053
+6419 5053
+6421 4855
+6424 4965
+6426 4965
+6428 4867
+6430 4867
+6433 5011
+6435 4928
+6437 5022
+6440 5022
+6442 5022
+6444 4956
+6447 4811
+6449 4995
+6451 4969
+6454 4850
+6456 5041
+6458 5007
+6460 5079
+6463 4849
+6465 4990
+6467 4990
+6470 5034
+6472 4899
+6474 4899
+6477 4840
+6479 4936
+6481 5032
+6483 5005
+6486 4909
+6488 5033
+6490 5033
+6493 5121
+6495 5043
+6497 5062
+6500 5062
+6502 5008
+6504 4966
+6506 4891
+6509 4914
+6511 4884
+6513 4884
+6516 4990
+6518 4990
+6520 4990
+6523 4990
+6525 5066
+6527 5022
+6530 4993
+6532 4889
+6534 5020
+6536 5020
+6539 5076
+6541 4916
+6543 5141
+6546 5098
+6548 5081
+6550 4851
+6553 5033
+6555 4977
+6557 4977
+6559 5003
+6562 4821
+6564 5113
+6566 4972
+6569 5022
+6571 4912
+6573 5009
+6576 5009
+6578 5034
+6580 4985
+6583 5099
+6585 4979
+6587 4942
+6589 4942
+6592 4978
+6594 4898
+6596 4999
+6599 4999
+6601 4999
+6603 4999
+6606 4773
+6608 5153
+6610 5153
+6612 4942
+6615 4932
+6617 4969
+6619 5016
+6622 5016
+6624 5057
+6626 4999
+6629 4802
+6631 4967
+6633 5076
+6636 4861
+6638 4861
+6640 4861
+6642 4911
+6645 5018
+6647 5018
+6649 5050
+6652 5050
+6654 5007
+6656 5007
+6659 4989
+6661 4989
+6663 4989
+6665 4919
+6668 5017
+6670 5017
+6672 4934
+6675 4808
+6677 4878
+6679 4878
+6682 4873
+6684 4952
+6686 4911
+6689 4901
+6691 4901
+6693 4831
+6695 4831
+6698 5011
+6700 4972
+6702 4972
+6705 4972
+6707 4972
+6709 4954
+6712 5140
+6714 5034
+6716 4957
+6718 4952
+6721 4952
+6723 4952
+6725 4989
+6728 4992
+6730 5035
+6732 5042
+6735 5042
+6737 5042
+6739 4941
+6742 4941
+6744 4941
+6746 5009
+6748 5009
+6751 4980
+6753 5004
+6755 4971
+6758 5020
+6760 5020
+6762 4901
+6765 4952
+6767 4994
+6769 4924
+6771 4924
+6774 4924
+6776 4924
+6778 4924
+6781 4939
+6783 5005
+6785 4866
+6788 4866
+6790 5088
+6792 4807
+6794 4807
+6797 5005
+6799 4937
+6801 4937
+6804 4937
+6806 4937
+6808 5052
+6811 4903
+6813 4903
+6815 4903
+6818 4903
+6820 5019
+6822 4933
+6824 4933
+6827 5038
+6829 5048
+6831 4959
+6834 5007
+6836 4936
+6838 4973
+6841 4943
+6843 4963
+6845 4835
+6847 4980
+6850 4980
+6852 4981
+6854 4980
+6857 4980
+6859 5043
+6861 4970
+6864 4985
+6866 4965
+6868 4965
+6871 4993
+6873 4993
+6875 4993
+6877 4905
+6880 4905
+6882 4905
+6884 4905
+6887 5031
+6889 4873
+6891 4963
+6894 4878
+6896 4921
+6898 4921
+6900 4921
+6903 4921
+6905 4921
+6907 4868
+6910 4971
+6912 4971
+6914 4971
+6917 5008
+6919 4925
+6921 4925
+6924 4902
+6926 4926
+6928 4926
+6930 4990
+6933 4990
+6935 4990
+6937 5024
+6940 5024
+6942 5024
+6944 4917
+6947 4917
+6949 5052
+6951 5052
+6953 5008
+6956 4971
+6958 4971
+6960 4971
+6963 4925
+6965 4936
+6967 4829
+6970 4920
+6972 4884
+6974 4901
+6977 4861
+6979 4890
+6981 5026
+6983 5008
+6986 4901
+6988 4881
+6990 4881
+6993 4894
+6995 4904
+6997 5007
+7000 5007
+7002 5007
+7004 5007
+7006 5007
+7009 5007
+7011 4993
+7013 4993
+7016 5034
+7018 5034
+7020 5034
+7023 5034
+7025 4883
+7027 5040
+7030 4933
+7032 4933
+7034 4933
+7036 4933
+7039 4933
+7041 4933
+7043 4933
+7046 4933
+7048 4933
+7050 4933
+7053 4933
+7055 4964
+7057 4893
+7059 4876
+7062 4919
+7064 4919
+7066 4919
+7069 4919
+7071 4896
+7073 5002
+7076 4855
+7078 4955
+7080 5032
+7082 4996
+7085 4996
+7087 4996
+7089 4973
+7092 5095
+7094 4850
+7096 4901
+7099 4904
+7101 4904
+7103 4904
+7106 4904
+7108 4904
+7110 4996
+7112 4886
+7115 4886
+7117 4919
+7119 4919
+7122 4919
+7124 5023
+7126 4913
+7129 4913
+7131 4913
+7133 4913
+7135 4913
+7138 5032
+7140 4971
+7142 4971
+7145 4971
+7147 4971
+7149 4971
+7152 4971
+7154 4971
+7156 4971
+7159 4971
+7161 4926
+7163 5022
+7165 5005
+7168 5005
+7170 4882
+7172 4922
+7175 4924
+7177 4924
+7179 4924
+7182 4924
+7184 5028
+7186 4879
+7188 4879
+7191 4879
+7193 4879
+7195 4965
+7198 4965
+7200 4939
+7202 4875
+7205 4909
+7207 4973
+7209 4973
+7212 4987
+7214 4903
+7216 4903
+7218 4903
+7221 4903
+7223 4903
+7225 4965
+7228 4965
+7230 4944
+7232 4989
+7235 4883
+7237 4883
+7239 4973
+7241 4952
+7244 4952
+7246 4994
+7248 4994
+7251 4993
+7253 4957
+7255 4996
+7258 4924
+7260 4985
+7262 4985
+7265 4943
+7267 4943
+7269 4943
+7271 4943
+7274 4943
+7276 4880
+7278 4875
+7281 4899
+7283 4822
+7285 4883
+7288 4883
+7290 4883
+7292 4883
+7294 4922
+7297 4922
+7299 5007
+7301 5007
+7304 5001
+7306 5001
+7308 5001
+7311 4969
+7313 4882
+7315 4956
+7318 4956
+7320 4920
+7322 4920
+7324 4920
+7327 4911
+7329 4911
+7331 4944
+7334 4924
+7336 4924
+7338 5050
+7341 5050
+7343 5063
+7345 4922
+7347 4922
+7350 4922
+7352 4922
+7354 4979
+7357 4979
+7359 4932
+7361 4970
+7364 5004
+7366 4972
+7368 4972
+7370 4972
+7373 4972
+7375 4972
+7377 4939
+7380 4939
+7382 4939
+7384 4939
+7387 4939
+7389 4859
+7391 4842
+7394 4999
+7396 4999
+7398 4999
+7400 4929
+7403 4929
+7405 4929
+7407 4958
+7410 4996
+7412 4996
+500 MLine
+End
+
+Begin %I MLine
+[1 0 0 1 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+0 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 500
+7412 4996
+7414 5039
+7417 5039
+7419 5035
+7421 4922
+7423 4952
+7426 5009
+7428 4898
+7430 4898
+7433 4898
+7435 4868
+7437 5033
+7440 5033
+7442 5033
+7444 5033
+7447 5033
+7449 4988
+7451 4988
+7453 4941
+7456 5012
+7458 4980
+7460 4980
+7463 4980
+7465 5018
+7467 4935
+7470 4935
+7472 4962
+7474 4962
+7476 4962
+7479 4996
+7481 4996
+7483 4959
+7486 4959
+7488 4973
+7490 4973
+7493 4973
+7495 4999
+7497 5052
+7500 5102
+7502 5066
+7504 5066
+7506 5066
+7509 4905
+7511 4905
+7513 4905
+7516 4965
+7518 4961
+7520 4961
+7523 4961
+7525 4961
+7527 4994
+7529 4994
+7532 5001
+7534 4928
+7536 5045
+7539 5045
+7541 5045
+7543 5023
+7546 4995
+7548 4974
+7550 4974
+7553 5037
+7555 4990
+7557 4990
+7559 4990
+7562 4990
+7564 4990
+7566 4990
+7569 4990
+7571 4990
+7573 4905
+7576 4905
+7578 4905
+7580 4905
+7582 5017
+7585 5017
+7587 4984
+7589 5049
+7592 4999
+7594 4999
+7596 4999
+7599 4931
+7601 4981
+7603 4981
+7606 4981
+7608 5007
+7610 5007
+7612 5007
+7615 5007
+7617 4948
+7619 4950
+7622 4950
+7624 4979
+7626 4935
+7629 4935
+7631 4935
+7633 4936
+7635 4956
+7638 4956
+7640 5011
+7642 5011
+7645 5011
+7647 5011
+7649 5011
+7652 5011
+7654 4984
+7656 5012
+7658 5012
+7661 4975
+7663 4975
+7665 4975
+7668 4975
+7670 4916
+7672 4916
+7675 4903
+7677 4903
+7679 4903
+7682 4979
+7684 4979
+7686 4949
+7688 4871
+7691 4852
+7693 4852
+7695 5010
+7698 5010
+7700 5010
+7702 5010
+7705 4982
+7707 4911
+7709 5007
+7711 4901
+7714 4924
+7716 4954
+7718 4954
+7721 4954
+7723 4956
+7725 4967
+7728 4967
+7730 4967
+7732 4947
+7735 4947
+7737 4948
+7739 4948
+7741 4948
+7744 4948
+7746 4948
+7748 4948
+7751 4919
+7753 5012
+7755 4956
+7758 4956
+7760 4956
+7762 4956
+7764 4956
+7767 4961
+7769 4961
+7771 4980
+7774 4980
+7776 4980
+7778 4980
+7781 4980
+7783 4980
+7785 4980
+7788 4959
+7790 4959
+7792 4959
+7794 4959
+7797 4959
+7799 4959
+7801 4959
+7804 5049
+7806 5049
+7808 4919
+7811 5015
+7813 5015
+7815 5015
+7817 5015
+7820 5015
+7822 5010
+7824 4959
+7827 4959
+7829 4959
+7831 4980
+7834 4980
+7836 4980
+7838 4966
+7841 4966
+7843 4966
+7845 4966
+7847 4974
+7850 4974
+7852 5012
+7854 4913
+7857 4913
+7859 4952
+7861 4952
+7864 4952
+7866 4952
+7868 4952
+7870 4986
+7873 4942
+7875 4942
+7877 4919
+7880 5031
+7882 5031
+7884 5031
+7887 4927
+7889 4927
+7891 4966
+7894 4966
+7896 5030
+7898 4948
+7900 4948
+7903 4948
+7905 4975
+7907 4975
+7910 4967
+7912 4888
+7914 4917
+7917 4987
+7919 4944
+7921 4909
+7923 4909
+7926 4909
+7928 4975
+7930 4975
+7933 4975
+7935 4916
+7937 4921
+7940 4950
+7942 4950
+7944 4979
+7946 4979
+7949 4979
+7951 4979
+7953 4979
+7956 4972
+7958 4947
+7960 4980
+7963 4946
+7965 4946
+7967 4940
+7970 4940
+7972 4940
+7974 4940
+7976 4975
+7979 4989
+7981 4989
+7983 4989
+7986 4936
+7988 5001
+7990 5001
+7993 5001
+7995 4965
+7997 4933
+7999 4933
+8002 4948
+8004 4971
+8006 4971
+8009 4971
+8011 4971
+8013 4971
+8016 4979
+8018 4979
+8020 4979
+8023 4969
+8025 5017
+8027 5017
+8029 5017
+8032 4928
+8034 4966
+8036 4940
+8039 4940
+8041 4940
+8043 4940
+8046 4940
+8048 4940
+8050 5024
+8052 5024
+8055 5024
+8057 4995
+8059 4996
+8062 4996
+8064 4996
+8066 4996
+8069 4996
+8071 4996
+8073 4996
+8076 4996
+8078 4996
+8080 4996
+8082 4940
+8085 4940
+8087 4940
+8089 4940
+8092 4980
+8094 4980
+8096 4980
+8099 4996
+8101 4996
+8103 4979
+8105 4990
+8108 4990
+8110 5019
+8112 5019
+8115 5019
+8117 5019
+8119 4944
+8122 4966
+8124 5002
+8126 5002
+8129 5002
+8131 5002
+8133 5002
+8135 5002
+8138 5009
+8140 4946
+8142 4946
+8145 4946
+8147 4946
+8149 5002
+8152 5002
+8154 5002
+8156 5002
+8158 5002
+8161 5002
+8163 5002
+8165 5012
+8168 5012
+8170 5012
+8172 5012
+8175 5012
+8177 4919
+8179 4919
+8182 4980
+8184 4985
+8186 4985
+8188 4985
+8191 4985
+8193 4985
+8195 4985
+8198 4979
+8200 4979
+8202 4937
+8205 4937
+8207 4937
+8209 4937
+8211 4937
+8214 4937
+8216 4937
+8218 4937
+8221 4937
+8223 4937
+8225 4937
+8228 4937
+8230 4937
+8232 4937
+8234 4961
+8237 4966
+8239 4966
+8241 4966
+8244 4966
+8246 4966
+8248 4966
+8251 4966
+8253 4966
+8255 4966
+8258 5002
+8260 5002
+8262 5002
+8264 4995
+8267 4965
+8269 4965
+8271 4965
+8274 4965
+8276 4965
+8278 4933
+8281 4933
+8283 4933
+8285 4933
+8287 4933
+8290 4933
+8292 4933
+8294 4996
+8297 4996
+8299 4996
+8301 4996
+8304 4996
+8306 4996
+8308 4996
+8311 4996
+8313 4996
+8315 4996
+8317 4929
+8320 4988
+8322 4988
+8324 4988
+8327 4939
+8329 4979
+8331 4964
+8334 4964
+8336 4964
+8338 4964
+8340 4964
+8343 4964
+8345 4964
+8347 4964
+8350 4964
+8352 4964
+8354 4964
+8357 4964
+8359 4964
+8361 4964
+8364 4964
+8366 4964
+8368 4964
+8370 4964
+8373 4964
+8375 4964
+8377 4964
+8380 4964
+8382 4964
+8384 4966
+8387 4966
+8389 4966
+8391 4952
+8393 4952
+8396 4952
+8398 4952
+8400 4952
+8403 4986
+8405 4986
+8407 4986
+8410 5018
+8412 5018
+8414 5018
+8417 5018
+8419 5005
+8421 5005
+8423 5005
+8426 5005
+8428 5005
+8430 4949
+8433 4949
+8435 4941
+8437 4941
+8440 4941
+8442 4941
+8444 4941
+8446 4961
+8449 4954
+8451 4957
+8453 4957
+8456 4971
+8458 4971
+8460 4970
+8463 4970
+8465 4946
+8467 5009
+8470 5009
+8472 4959
+8474 4959
+8476 4959
+8479 4959
+8481 4984
+8483 5020
+8486 5020
+8488 4914
+8490 4914
+8493 4914
+8495 4973
+8497 4973
+8499 4973
+8502 4973
+8504 4973
+8506 4973
+8509 4973
+8511 4973
+8513 4973
+8516 4973
+8518 4947
+8520 4979
+8522 4979
+8525 4979
+8527 4979
+8529 4979
+8532 4979
+8534 4979
+8536 4955
+8539 4955
+8541 4955
+8543 4955
+8546 4986
+8548 4951
+8550 4951
+8552 4951
+8555 4951
+8557 4951
+8559 4951
+8562 4951
+500 MLine
+End
+
+Begin %I MLine
+[1 0 0 1 0 0 ] trueoriginalCTM originalCTM
+concatmatrix pop
+0 setlinecap 0 setlinejoin 10.43 setmiterlimit
+/eoFillRule true def
+%I b 65535
+0 0 0 [ ] 0 SetB
+%I cfg Black
+0 0 0 SetCFg
+%I cbg White
+1 1 1 SetCBg
+%I p
+none SetP
+%I t
+[0.05 0 0 0.05 18 108 ] concat
+%I 53
+8562 4951
+8564 4943
+8566 4963
+8569 4985
+8571 4985
+8573 4985
+8575 4995
+8578 4996
+8580 4964
+8582 4964
+8585 4981
+8587 4981
+8589 4917
+8592 4959
+8594 4959
+8596 4959
+8599 4959
+8601 4959
+8603 4959
+8605 4959
+8608 4980
+8610 4980
+8612 4980
+8615 4947
+8617 4947
+8619 4947
+8622 4947
+8624 4942
+8626 4929
+8628 4929
+8631 4932
+8633 4932
+8635 4932
+8638 4932
+8640 4932
+8642 4932
+8645 4937
+8647 4937
+8649 4937
+8652 4964
+8654 4964
+8656 4997
+8658 5004
+8661 4973
+8663 4973
+8665 4984
+8668 4984
+8670 4973
+8672 4973
+8675 4973
+8677 4986
+8679 4980
+8681 4980
+53 MLine
+End
+
+%%PageTrailer
+End %I eop
+showpage
+
+%%Trailer
+end
+%%EOF
diff --git a/gsl-1.9/doc/siman.texi b/gsl-1.9/doc/siman.texi
new file mode 100644
index 0000000..902cad7
--- /dev/null
+++ b/gsl-1.9/doc/siman.texi
@@ -0,0 +1,371 @@
+@cindex simulated annealing
+@cindex combinatorial optimization
+@cindex optimization, combinatorial
+@cindex energy function
+@cindex cost function
+Stochastic search techniques are used when the structure of a space is
+not well understood or is not smooth, so that techniques like Newton's
+method (which requires calculating Jacobian derivative matrices) cannot
+be used. In particular, these techniques are frequently used to solve
+combinatorial optimization problems, such as the traveling salesman
+problem.
+
+The goal is to find a point in the space at which a real valued
+@dfn{energy function} (or @dfn{cost function}) is minimized. Simulated
+annealing is a minimization technique which has given good results in
+avoiding local minima; it is based on the idea of taking a random walk
+through the space at successively lower temperatures, where the
+probability of taking a step is given by a Boltzmann distribution.
+
+The functions described in this chapter are declared in the header file
+@file{gsl_siman.h}.
+
+@menu
+* Simulated Annealing algorithm::
+* Simulated Annealing functions::
+* Examples with Simulated Annealing::
+* Simulated Annealing References and Further Reading::
+@end menu
+
+@node Simulated Annealing algorithm
+@section Simulated Annealing algorithm
+
+The simulated annealing algorithm takes random walks through the problem
+space, looking for points with low energies; in these random walks, the
+probability of taking a step is determined by the Boltzmann distribution,
+@tex
+\beforedisplay
+$$
+p = e^{-(E_{i+1} - E_i)/(kT)}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+p = e^@{-(E_@{i+1@} - E_i)/(kT)@}
+@end example
+
+@end ifinfo
+@noindent
+if
+@c{$E_{i+1} > E_i$}
+@math{E_@{i+1@} > E_i}, and
+@math{p = 1} when
+@c{$E_{i+1} \le E_i$}
+@math{E_@{i+1@} <= E_i}.
+
+In other words, a step will occur if the new energy is lower. If
+the new energy is higher, the transition can still occur, and its
+likelihood is proportional to the temperature @math{T} and inversely
+proportional to the energy difference
+@c{$E_{i+1} - E_i$}
+@math{E_@{i+1@} - E_i}.
+
+The temperature @math{T} is initially set to a high value, and a random
+walk is carried out at that temperature. Then the temperature is
+lowered very slightly according to a @dfn{cooling schedule}, for
+example: @c{$T \rightarrow T/\mu_T$}
+@math{T -> T/mu_T}
+where @math{\mu_T} is slightly greater than 1.
+@cindex cooling schedule
+@cindex schedule, cooling
+
+The slight probability of taking a step that gives higher energy is what
+allows simulated annealing to frequently get out of local minima.
+
+@node Simulated Annealing functions
+@section Simulated Annealing functions
+
+@deftypefun void gsl_siman_solve (const gsl_rng * @var{r}, void * @var{x0_p}, gsl_siman_Efunc_t @var{Ef}, gsl_siman_step_t @var{take_step}, gsl_siman_metric_t @var{distance}, gsl_siman_print_t @var{print_position}, gsl_siman_copy_t @var{copyfunc}, gsl_siman_copy_construct_t @var{copy_constructor}, gsl_siman_destroy_t @var{destructor}, size_t @var{element_size}, gsl_siman_params_t @var{params})
+
+This function performs a simulated annealing search through a given
+space. The space is specified by providing the functions @var{Ef} and
+@var{distance}. The simulated annealing steps are generated using the
+random number generator @var{r} and the function @var{take_step}.
+
+The starting configuration of the system should be given by @var{x0_p}.
+The routine offers two modes for updating configurations, a fixed-size
+mode and a variable-size mode. In the fixed-size mode the configuration
+is stored as a single block of memory of size @var{element_size}.
+Copies of this configuration are created, copied and destroyed
+internally using the standard library functions @code{malloc},
+@code{memcpy} and @code{free}. The function pointers @var{copyfunc},
+@var{copy_constructor} and @var{destructor} should be null pointers in
+fixed-size mode. In the variable-size mode the functions
+@var{copyfunc}, @var{copy_constructor} and @var{destructor} are used to
+create, copy and destroy configurations internally. The variable
+@var{element_size} should be zero in the variable-size mode.
+
+The @var{params} structure (described below) controls the run by
+providing the temperature schedule and other tunable parameters to the
+algorithm.
+
+On exit the best result achieved during the search is placed in
+@code{*@var{x0_p}}. If the annealing process has been successful this
+should be a good approximation to the optimal point in the space.
+
+If the function pointer @var{print_position} is not null, a debugging
+log will be printed to @code{stdout} with the following columns:
+
+@example
+number_of_iterations temperature x x-(*x0_p) Ef(x)
+@end example
+
+and the output of the function @var{print_position} itself. If
+@var{print_position} is null then no information is printed.
+@end deftypefun
+
+@noindent
+The simulated annealing routines require several user-specified
+functions to define the configuration space and energy function. The
+prototypes for these functions are given below.
+
+@deftp {Data Type} gsl_siman_Efunc_t
+This function type should return the energy of a configuration @var{xp}.
+
+@example
+double (*gsl_siman_Efunc_t) (void *xp)
+@end example
+@end deftp
+
+@deftp {Data Type} gsl_siman_step_t
+This function type should modify the configuration @var{xp} using a random step
+taken from the generator @var{r}, up to a maximum distance of
+@var{step_size}.
+
+@example
+void (*gsl_siman_step_t) (const gsl_rng *r, void *xp,
+ double step_size)
+@end example
+@end deftp
+
+@deftp {Data Type} gsl_siman_metric_t
+This function type should return the distance between two configurations
+@var{xp} and @var{yp}.
+
+@example
+double (*gsl_siman_metric_t) (void *xp, void *yp)
+@end example
+@end deftp
+
+@deftp {Data Type} gsl_siman_print_t
+This function type should print the contents of the configuration @var{xp}.
+
+@example
+void (*gsl_siman_print_t) (void *xp)
+@end example
+@end deftp
+
+@deftp {Data Type} gsl_siman_copy_t
+This function type should copy the configuration @var{source} into @var{dest}.
+
+@example
+void (*gsl_siman_copy_t) (void *source, void *dest)
+@end example
+@end deftp
+
+@deftp {Data Type} gsl_siman_copy_construct_t
+This function type should create a new copy of the configuration @var{xp}.
+
+@example
+void * (*gsl_siman_copy_construct_t) (void *xp)
+@end example
+@end deftp
+
+@deftp {Data Type} gsl_siman_destroy_t
+This function type should destroy the configuration @var{xp}, freeing its
+memory.
+
+@example
+void (*gsl_siman_destroy_t) (void *xp)
+@end example
+@end deftp
+
+@deftp {Data Type} gsl_siman_params_t
+These are the parameters that control a run of @code{gsl_siman_solve}.
+This structure contains all the information needed to control the
+search, beyond the energy function, the step function and the initial
+guess.
+
+@table @code
+@item int n_tries
+The number of points to try for each step.
+
+@item int iters_fixed_T
+The number of iterations at each temperature.
+
+@item double step_size
+The maximum step size in the random walk.
+
+@item double k, t_initial, mu_t, t_min
+The parameters of the Boltzmann distribution and cooling schedule.
+@end table
+@end deftp
+
+
+@node Examples with Simulated Annealing
+@section Examples
+
+The simulated annealing package is clumsy, and it has to be because it
+is written in C, for C callers, and tries to be polymorphic at the same
+time. But here we provide some examples which can be pasted into your
+application with little change and should make things easier.
+
+@menu
+* Trivial example::
+* Traveling Salesman Problem::
+@end menu
+
+@node Trivial example
+@subsection Trivial example
+
+The first example, in one dimensional cartesian space, sets up an energy
+function which is a damped sine wave; this has many local minima, but
+only one global minimum, somewhere between 1.0 and 1.5. The initial
+guess given is 15.5, which is several local minima away from the global
+minimum.
+
+@smallexample
+@verbatiminclude examples/siman.c
+@end smallexample
+
+@need 2000
+Here are a couple of plots that are generated by running
+@code{siman_test} in the following way:
+
+@example
+$ ./siman_test | awk '!/^#/ @{print $1, $4@}'
+ | graph -y 1.34 1.4 -W0 -X generation -Y position
+ | plot -Tps > siman-test.eps
+$ ./siman_test | awk '!/^#/ @{print $1, $4@}'
+ | graph -y -0.88 -0.83 -W0 -X generation -Y energy
+ | plot -Tps > siman-energy.eps
+@end example
+
+@iftex
+@sp 1
+@center @image{siman-test,2.8in}
+@center @image{siman-energy,2.8in}
+
+@quotation
+Example of a simulated annealing run: at higher temperatures (early in
+the plot) you see that the solution can fluctuate, but at lower
+temperatures it converges.
+@end quotation
+@end iftex
+
+@node Traveling Salesman Problem
+@subsection Traveling Salesman Problem
+@cindex TSP
+@cindex traveling salesman problem
+
+The TSP (@dfn{Traveling Salesman Problem}) is the classic combinatorial
+optimization problem. I have provided a very simple version of it,
+based on the coordinates of twelve cities in the southwestern United
+States. This should maybe be called the @dfn{Flying Salesman Problem},
+since I am using the great-circle distance between cities, rather than
+the driving distance. Also: I assume the earth is a sphere, so I don't
+use geoid distances.
+
+The @code{gsl_siman_solve} routine finds a route which is 3490.62
+Kilometers long; this is confirmed by an exhaustive search of all
+possible routes with the same initial city.
+
+The full code can be found in @file{siman/siman_tsp.c}, but I include
+here some plots generated in the following way:
+
+@smallexample
+$ ./siman_tsp > tsp.output
+$ grep -v "^#" tsp.output
+ | awk '@{print $1, $NF@}'
+ | graph -y 3300 6500 -W0 -X generation -Y distance
+ -L "TSP - 12 southwest cities"
+ | plot -Tps > 12-cities.eps
+$ grep initial_city_coord tsp.output
+ | awk '@{print $2, $3@}'
+ | graph -X "longitude (- means west)" -Y "latitude"
+ -L "TSP - initial-order" -f 0.03 -S 1 0.1
+ | plot -Tps > initial-route.eps
+$ grep final_city_coord tsp.output
+ | awk '@{print $2, $3@}'
+ | graph -X "longitude (- means west)" -Y "latitude"
+ -L "TSP - final-order" -f 0.03 -S 1 0.1
+ | plot -Tps > final-route.eps
+@end smallexample
+
+@noindent
+This is the output showing the initial order of the cities; longitude is
+negative, since it is west and I want the plot to look like a map.
+
+@smallexample
+# initial coordinates of cities (longitude and latitude)
+###initial_city_coord: -105.95 35.68 Santa Fe
+###initial_city_coord: -112.07 33.54 Phoenix
+###initial_city_coord: -106.62 35.12 Albuquerque
+###initial_city_coord: -103.2 34.41 Clovis
+###initial_city_coord: -107.87 37.29 Durango
+###initial_city_coord: -96.77 32.79 Dallas
+###initial_city_coord: -105.92 35.77 Tesuque
+###initial_city_coord: -107.84 35.15 Grants
+###initial_city_coord: -106.28 35.89 Los Alamos
+###initial_city_coord: -106.76 32.34 Las Cruces
+###initial_city_coord: -108.58 37.35 Cortez
+###initial_city_coord: -108.74 35.52 Gallup
+###initial_city_coord: -105.95 35.68 Santa Fe
+@end smallexample
+
+The optimal route turns out to be:
+
+@smallexample
+# final coordinates of cities (longitude and latitude)
+###final_city_coord: -105.95 35.68 Santa Fe
+###final_city_coord: -106.28 35.89 Los Alamos
+###final_city_coord: -106.62 35.12 Albuquerque
+###final_city_coord: -107.84 35.15 Grants
+###final_city_coord: -107.87 37.29 Durango
+###final_city_coord: -108.58 37.35 Cortez
+###final_city_coord: -108.74 35.52 Gallup
+###final_city_coord: -112.07 33.54 Phoenix
+###final_city_coord: -106.76 32.34 Las Cruces
+###final_city_coord: -96.77 32.79 Dallas
+###final_city_coord: -103.2 34.41 Clovis
+###final_city_coord: -105.92 35.77 Tesuque
+###final_city_coord: -105.95 35.68 Santa Fe
+@end smallexample
+
+@iftex
+@sp 1
+@center @image{initial-route,2.2in}
+@center @image{final-route,2.2in}
+
+@quotation
+Initial and final (optimal) route for the 12 southwestern cities Flying
+Salesman Problem.
+@end quotation
+@end iftex
+
+@noindent
+Here's a plot of the cost function (energy) versus generation (point in
+the calculation at which a new temperature is set) for this problem:
+
+@iftex
+@sp 1
+@center @image{12-cities,2.8in}
+
+@quotation
+Example of a simulated annealing run for the 12 southwestern cities
+Flying Salesman Problem.
+@end quotation
+@end iftex
+
+@node Simulated Annealing References and Further Reading
+@section References and Further Reading
+
+Further information is available in the following book,
+
+@itemize @asis
+@item
+@cite{Modern Heuristic Techniques for Combinatorial Problems}, Colin R. Reeves
+(ed.), McGraw-Hill, 1995 (ISBN 0-07-709239-2).
+@end itemize
diff --git a/gsl-1.9/doc/sort.texi b/gsl-1.9/doc/sort.texi
new file mode 100644
index 0000000..3e5f216
--- /dev/null
+++ b/gsl-1.9/doc/sort.texi
@@ -0,0 +1,315 @@
+@cindex sorting
+@cindex heapsort
+This chapter describes functions for sorting data, both directly and
+indirectly (using an index). All the functions use the @dfn{heapsort}
+algorithm. Heapsort is an @math{O(N \log N)} algorithm which operates
+in-place and does not require any additional storage. It also provides
+consistent performance, the running time for its worst-case (ordered
+data) being not significantly longer than the average and best cases.
+Note that the heapsort algorithm does not preserve the relative ordering
+of equal elements---it is an @dfn{unstable} sort. However the resulting
+order of equal elements will be consistent across different platforms
+when using these functions.
+
+@menu
+* Sorting objects::
+* Sorting vectors::
+* Selecting the k smallest or largest elements::
+* Computing the rank::
+* Sorting Examples::
+* Sorting References and Further Reading::
+@end menu
+
+@node Sorting objects
+@section Sorting objects
+
+The following function provides a simple alternative to the standard
+library function @code{qsort}. It is intended for systems lacking
+@code{qsort}, not as a replacement for it. The function @code{qsort}
+should be used whenever possible, as it will be faster and can provide
+stable ordering of equal elements. Documentation for @code{qsort} is
+available in the @cite{GNU C Library Reference Manual}.
+
+The functions described in this section are defined in the header file
+@file{gsl_heapsort.h}.
+
+@cindex comparison functions, definition
+@deftypefun void gsl_heapsort (void * @var{array}, size_t @var{count}, size_t @var{size}, gsl_comparison_fn_t @var{compare})
+
+This function sorts the @var{count} elements of the array @var{array},
+each of size @var{size}, into ascending order using the comparison
+function @var{compare}. The type of the comparison function is defined by,
+
+@example
+int (*gsl_comparison_fn_t) (const void * a,
+ const void * b)
+@end example
+
+@noindent
+A comparison function should return a negative integer if the first
+argument is less than the second argument, @code{0} if the two arguments
+are equal and a positive integer if the first argument is greater than
+the second argument.
+
+For example, the following function can be used to sort doubles into
+ascending numerical order.
+
+@example
+int
+compare_doubles (const double * a,
+ const double * b)
+@{
+ if (*a > *b)
+ return 1;
+ else if (*a < *b)
+ return -1;
+ else
+ return 0;
+@}
+@end example
+
+@noindent
+The appropriate function call to perform the sort is,
+
+@example
+gsl_heapsort (array, count, sizeof(double),
+ compare_doubles);
+@end example
+
+Note that unlike @code{qsort} the heapsort algorithm cannot be made into
+a stable sort by pointer arithmetic. The trick of comparing pointers for
+equal elements in the comparison function does not work for the heapsort
+algorithm. The heapsort algorithm performs an internal rearrangement of
+the data which destroys its initial ordering.
+@end deftypefun
+
+@cindex indirect sorting
+@deftypefun int gsl_heapsort_index (size_t * @var{p}, const void * @var{array}, size_t @var{count}, size_t @var{size}, gsl_comparison_fn_t @var{compare})
+
+This function indirectly sorts the @var{count} elements of the array
+@var{array}, each of size @var{size}, into ascending order using the
+comparison function @var{compare}. The resulting permutation is stored
+in @var{p}, an array of length @var{n}. The elements of @var{p} give the
+index of the array element which would have been stored in that position
+if the array had been sorted in place. The first element of @var{p}
+gives the index of the least element in @var{array}, and the last
+element of @var{p} gives the index of the greatest element in
+@var{array}. The array itself is not changed.
+@end deftypefun
+
+@node Sorting vectors
+@section Sorting vectors
+
+The following functions will sort the elements of an array or vector,
+either directly or indirectly. They are defined for all real and integer
+types using the normal suffix rules. For example, the @code{float}
+versions of the array functions are @code{gsl_sort_float} and
+@code{gsl_sort_float_index}. The corresponding vector functions are
+@code{gsl_sort_vector_float} and @code{gsl_sort_vector_float_index}. The
+prototypes are available in the header files @file{gsl_sort_float.h}
+@file{gsl_sort_vector_float.h}. The complete set of prototypes can be
+included using the header files @file{gsl_sort.h} and
+@file{gsl_sort_vector.h}.
+
+There are no functions for sorting complex arrays or vectors, since the
+ordering of complex numbers is not uniquely defined. To sort a complex
+vector by magnitude compute a real vector containing the magnitudes
+of the complex elements, and sort this vector indirectly. The resulting
+index gives the appropriate ordering of the original complex vector.
+
+@cindex sorting vector elements
+@cindex vector, sorting elements of
+@deftypefun void gsl_sort (double * @var{data}, size_t @var{stride}, size_t @var{n})
+This function sorts the @var{n} elements of the array @var{data} with
+stride @var{stride} into ascending numerical order.
+@end deftypefun
+
+@deftypefun void gsl_sort_vector (gsl_vector * @var{v})
+This function sorts the elements of the vector @var{v} into ascending
+numerical order.
+@end deftypefun
+
+@cindex indirect sorting, of vector elements
+@deftypefun void gsl_sort_index (size_t * @var{p}, const double * @var{data}, size_t @var{stride}, size_t @var{n})
+This function indirectly sorts the @var{n} elements of the array
+@var{data} with stride @var{stride} into ascending order, storing the
+resulting permutation in @var{p}. The array @var{p} must be allocated with
+a sufficient length to store the @var{n} elements of the permutation.
+The elements of @var{p} give the index of the array element which would
+have been stored in that position if the array had been sorted in place.
+The array @var{data} is not changed.
+@end deftypefun
+
+@deftypefun int gsl_sort_vector_index (gsl_permutation * @var{p}, const gsl_vector * @var{v})
+This function indirectly sorts the elements of the vector @var{v} into
+ascending order, storing the resulting permutation in @var{p}. The
+elements of @var{p} give the index of the vector element which would
+have been stored in that position if the vector had been sorted in
+place. The first element of @var{p} gives the index of the least element
+in @var{v}, and the last element of @var{p} gives the index of the
+greatest element in @var{v}. The vector @var{v} is not changed.
+@end deftypefun
+
+@node Selecting the k smallest or largest elements
+@section Selecting the k smallest or largest elements
+
+The functions described in this section select the @math{k} smallest
+or largest elements of a data set of size @math{N}. The routines use an
+@math{O(kN)} direct insertion algorithm which is suited to subsets that
+are small compared with the total size of the dataset. For example, the
+routines are useful for selecting the 10 largest values from one million
+data points, but not for selecting the largest 100,000 values. If the
+subset is a significant part of the total dataset it may be faster
+to sort all the elements of the dataset directly with an @math{O(N \log
+N)} algorithm and obtain the smallest or largest values that way.
+
+@deftypefun int gsl_sort_smallest (double * @var{dest}, size_t @var{k}, const double * @var{src}, size_t @var{stride}, size_t @var{n})
+This function copies the @var{k} smallest elements of the array
+@var{src}, of size @var{n} and stride @var{stride}, in ascending
+numerical order into the array @var{dest}. The size @var{k} of the subset must be
+less than or equal to @var{n}. The data @var{src} is not modified by
+this operation.
+@end deftypefun
+
+@deftypefun int gsl_sort_largest (double * @var{dest}, size_t @var{k}, const double * @var{src}, size_t @var{stride}, size_t @var{n})
+This function copies the @var{k} largest elements of the array
+@var{src}, of size @var{n} and stride @var{stride}, in descending
+numerical order into the array @var{dest}. @var{k} must be
+less than or equal to @var{n}. The data @var{src} is not modified by
+this operation.
+@end deftypefun
+
+@deftypefun int gsl_sort_vector_smallest (double * @var{dest}, size_t @var{k}, const gsl_vector * @var{v})
+@deftypefunx int gsl_sort_vector_largest (double * @var{dest}, size_t @var{k}, const gsl_vector * @var{v})
+These functions copy the @var{k} smallest or largest elements of the
+vector @var{v} into the array @var{dest}. @var{k}
+must be less than or equal to the length of the vector @var{v}.
+@end deftypefun
+
+The following functions find the indices of the @math{k} smallest or
+largest elements of a dataset,
+
+@deftypefun int gsl_sort_smallest_index (size_t * @var{p}, size_t @var{k}, const double * @var{src}, size_t @var{stride}, size_t @var{n})
+This function stores the indices of the @var{k} smallest elements of
+the array @var{src}, of size @var{n} and stride @var{stride}, in the
+array @var{p}. The indices are chosen so that the corresponding data is
+in ascending numerical order. @var{k} must be
+less than or equal to @var{n}. The data @var{src} is not modified by
+this operation.
+@end deftypefun
+
+@deftypefun int gsl_sort_largest_index (size_t * @var{p}, size_t @var{k}, const double * @var{src}, size_t @var{stride}, size_t @var{n})
+This function stores the indices of the @var{k} largest elements of
+the array @var{src}, of size @var{n} and stride @var{stride}, in the
+array @var{p}. The indices are chosen so that the corresponding data is
+in descending numerical order. @var{k} must be
+less than or equal to @var{n}. The data @var{src} is not modified by
+this operation.
+@end deftypefun
+
+@deftypefun int gsl_sort_vector_smallest_index (size_t * @var{p}, size_t @var{k}, const gsl_vector * @var{v})
+@deftypefunx int gsl_sort_vector_largest_index (size_t * @var{p}, size_t @var{k}, const gsl_vector * @var{v})
+These functions store the indices of the @var{k} smallest or largest
+elements of the vector @var{v} in the array @var{p}. @var{k} must be less than or equal to the length of the vector
+@var{v}.
+@end deftypefun
+
+
+@node Computing the rank
+@section Computing the rank
+
+The @dfn{rank} of an element is its order in the sorted data. The rank
+is the inverse of the index permutation, @var{p}. It can be computed
+using the following algorithm,
+
+@example
+for (i = 0; i < p->size; i++)
+@{
+ size_t pi = p->data[i];
+ rank->data[pi] = i;
+@}
+@end example
+
+@noindent
+This can be computed directly from the function
+@code{gsl_permutation_inverse(rank,p)}.
+
+The following function will print the rank of each element of the vector
+@var{v},
+
+@example
+void
+print_rank (gsl_vector * v)
+@{
+ size_t i;
+ size_t n = v->size;
+ gsl_permutation * perm = gsl_permutation_alloc(n);
+ gsl_permutation * rank = gsl_permutation_alloc(n);
+
+ gsl_sort_vector_index (perm, v);
+ gsl_permutation_inverse (rank, perm);
+
+ for (i = 0; i < n; i++)
+ @{
+ double vi = gsl_vector_get(v, i);
+ printf ("element = %d, value = %g, rank = %d\n",
+ i, vi, rank->data[i]);
+ @}
+
+ gsl_permutation_free (perm);
+ gsl_permutation_free (rank);
+@}
+@end example
+
+@node Sorting Examples
+@section Examples
+
+The following example shows how to use the permutation @var{p} to print
+the elements of the vector @var{v} in ascending order,
+
+@example
+gsl_sort_vector_index (p, v);
+
+for (i = 0; i < v->size; i++)
+@{
+ double vpi = gsl_vector_get (v, p->data[i]);
+ printf ("order = %d, value = %g\n", i, vpi);
+@}
+@end example
+
+@noindent
+The next example uses the function @code{gsl_sort_smallest} to select
+the 5 smallest numbers from 100000 uniform random variates stored in an
+array,
+
+@example
+@verbatiminclude examples/sortsmall.c
+@end example
+The output lists the 5 smallest values, in ascending order,
+
+@example
+$ ./a.out
+@verbatiminclude examples/sortsmall.out
+@end example
+
+@node Sorting References and Further Reading
+@section References and Further Reading
+
+The subject of sorting is covered extensively in Knuth's
+@cite{Sorting and Searching},
+
+@itemize @asis
+@item
+Donald E. Knuth, @cite{The Art of Computer Programming: Sorting and
+Searching} (Vol 3, 3rd Ed, 1997), Addison-Wesley, ISBN 0201896850.
+@end itemize
+
+@noindent
+The Heapsort algorithm is described in the following book,
+
+@itemize @asis
+@item Robert Sedgewick, @cite{Algorithms in C}, Addison-Wesley,
+ISBN 0201514257.
+@end itemize
+
+
diff --git a/gsl-1.9/doc/specfunc-airy.texi b/gsl-1.9/doc/specfunc-airy.texi
new file mode 100644
index 0000000..726f516
--- /dev/null
+++ b/gsl-1.9/doc/specfunc-airy.texi
@@ -0,0 +1,130 @@
+@cindex Airy functions
+@cindex Ai(x)
+@cindex Bi(x)
+
+The Airy functions @math{Ai(x)} and @math{Bi(x)} are defined by the
+integral representations,
+@tex
+\beforedisplay
+$$
+\eqalign{
+Ai(x) & = {1\over\pi} \int_0^\infty \cos(t^3/3 + xt ) \,dt, \cr
+Bi(x) & = {1\over\pi} \int_0^\infty (e^{-t^3/3} + \sin(t^3/3 + xt)) \,dt.
+}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+Ai(x) = (1/\pi) \int_0^\infty \cos((1/3) t^3 + xt) dt
+Bi(x) = (1/\pi) \int_0^\infty (e^(-(1/3) t^3) + \sin((1/3) t^3 + xt)) dt
+@end example
+
+@end ifinfo
+@noindent
+For further information see Abramowitz & Stegun, Section 10.4. The Airy
+functions are defined in the header file @file{gsl_sf_airy.h}.
+
+@menu
+* Airy Functions::
+* Derivatives of Airy Functions::
+* Zeros of Airy Functions::
+* Zeros of Derivatives of Airy Functions::
+@end menu
+
+@node Airy Functions
+@subsection Airy Functions
+
+@deftypefun double gsl_sf_airy_Ai (double @var{x}, gsl_mode_t @var{mode})
+@deftypefunx int gsl_sf_airy_Ai_e (double @var{x}, gsl_mode_t @var{mode}, gsl_sf_result * @var{result})
+These routines compute the Airy function @math{Ai(x)} with an accuracy
+specified by @var{mode}.
+@end deftypefun
+
+@deftypefun double gsl_sf_airy_Bi (double @var{x}, gsl_mode_t @var{mode})
+@deftypefunx int gsl_sf_airy_Bi_e (double @var{x}, gsl_mode_t @var{mode}, gsl_sf_result * @var{result})
+These routines compute the Airy function @math{Bi(x)} with an accuracy
+specified by @var{mode}.
+@end deftypefun
+
+@deftypefun double gsl_sf_airy_Ai_scaled (double @var{x}, gsl_mode_t @var{mode})
+@deftypefunx int gsl_sf_airy_Ai_scaled_e (double @var{x}, gsl_mode_t @var{mode}, gsl_sf_result * @var{result})
+These routines compute a scaled version of the Airy function
+@math{S_A(x) Ai(x)}. For @math{x>0} the scaling factor @math{S_A(x)} is @c{$\exp(+(2/3) x^{3/2})$}
+@math{\exp(+(2/3) x^(3/2))},
+and is 1
+for @math{x<0}.
+@end deftypefun
+
+@deftypefun double gsl_sf_airy_Bi_scaled (double @var{x}, gsl_mode_t @var{mode})
+@deftypefunx int gsl_sf_airy_Bi_scaled_e (double @var{x}, gsl_mode_t @var{mode}, gsl_sf_result * @var{result})
+These routines compute a scaled version of the Airy function
+@math{S_B(x) Bi(x)}. For @math{x>0} the scaling factor @math{S_B(x)} is @c{$\exp(-(2/3) x^{3/2})$}
+@math{exp(-(2/3) x^(3/2))}, and is 1 for @math{x<0}.
+@end deftypefun
+
+
+@node Derivatives of Airy Functions
+@subsection Derivatives of Airy Functions
+
+@deftypefun double gsl_sf_airy_Ai_deriv (double @var{x}, gsl_mode_t @var{mode})
+@deftypefunx int gsl_sf_airy_Ai_deriv_e (double @var{x}, gsl_mode_t @var{mode}, gsl_sf_result * @var{result})
+These routines compute the Airy function derivative @math{Ai'(x)} with
+an accuracy specified by @var{mode}.
+@end deftypefun
+
+@deftypefun double gsl_sf_airy_Bi_deriv (double @var{x}, gsl_mode_t @var{mode})
+@deftypefunx int gsl_sf_airy_Bi_deriv_e (double @var{x}, gsl_mode_t @var{mode}, gsl_sf_result * @var{result})
+These routines compute the Airy function derivative @math{Bi'(x)} with
+an accuracy specified by @var{mode}.
+@end deftypefun
+
+@deftypefun double gsl_sf_airy_Ai_deriv_scaled (double @var{x}, gsl_mode_t @var{mode})
+@deftypefunx int gsl_sf_airy_Ai_deriv_scaled_e (double @var{x}, gsl_mode_t @var{mode}, gsl_sf_result * @var{result})
+These routines compute the scaled Airy function derivative
+@math{S_A(x) Ai'(x)}.
+For @math{x>0} the scaling factor @math{S_A(x)} is @c{$\exp(+(2/3) x^{3/2})$}
+@math{\exp(+(2/3) x^(3/2))}, and is 1 for @math{x<0}.
+@end deftypefun
+
+@deftypefun double gsl_sf_airy_Bi_deriv_scaled (double @var{x}, gsl_mode_t @var{mode})
+@deftypefunx int gsl_sf_airy_Bi_deriv_scaled_e (double @var{x}, gsl_mode_t @var{mode}, gsl_sf_result * @var{result})
+These routines compute the scaled Airy function derivative
+@math{S_B(x) Bi'(x)}.
+For @math{x>0} the scaling factor @math{S_B(x)} is @c{$\exp(-(2/3) x^{3/2})$}
+@math{exp(-(2/3) x^(3/2))}, and is 1 for @math{x<0}.
+@end deftypefun
+
+
+@node Zeros of Airy Functions
+@subsection Zeros of Airy Functions
+
+@deftypefun double gsl_sf_airy_zero_Ai (unsigned int @var{s})
+@deftypefunx int gsl_sf_airy_zero_Ai_e (unsigned int @var{s}, gsl_sf_result * @var{result})
+These routines compute the location of the @var{s}-th zero of the Airy
+function @math{Ai(x)}.
+@end deftypefun
+
+@deftypefun double gsl_sf_airy_zero_Bi (unsigned int @var{s})
+@deftypefunx int gsl_sf_airy_zero_Bi_e (unsigned int @var{s}, gsl_sf_result * @var{result})
+These routines compute the location of the @var{s}-th zero of the Airy
+function @math{Bi(x)}.
+@end deftypefun
+
+
+@node Zeros of Derivatives of Airy Functions
+@subsection Zeros of Derivatives of Airy Functions
+
+@deftypefun double gsl_sf_airy_zero_Ai_deriv (unsigned int @var{s})
+@deftypefunx int gsl_sf_airy_zero_Ai_deriv_e (unsigned int @var{s}, gsl_sf_result * @var{result})
+These routines compute the location of the @var{s}-th zero of the Airy
+function derivative @math{Ai'(x)}.
+@end deftypefun
+
+@deftypefun double gsl_sf_airy_zero_Bi_deriv (unsigned int @var{s})
+@deftypefunx int gsl_sf_airy_zero_Bi_deriv_e (unsigned int @var{s}, gsl_sf_result * @var{result})
+These routines compute the location of the @var{s}-th zero of the Airy
+function derivative @math{Bi'(x)}.
+@end deftypefun
+
diff --git a/gsl-1.9/doc/specfunc-bessel.texi b/gsl-1.9/doc/specfunc-bessel.texi
new file mode 100644
index 0000000..e3b09c9
--- /dev/null
+++ b/gsl-1.9/doc/specfunc-bessel.texi
@@ -0,0 +1,585 @@
+@cindex Bessel functions
+
+The routines described in this section compute the Cylindrical Bessel
+functions @math{J_n(x)}, @math{Y_n(x)}, Modified cylindrical Bessel
+functions @math{I_n(x)}, @math{K_n(x)}, Spherical Bessel functions
+@math{j_l(x)}, @math{y_l(x)}, and Modified Spherical Bessel functions
+@math{i_l(x)}, @math{k_l(x)}. For more information see Abramowitz & Stegun,
+Chapters 9 and 10. The Bessel functions are defined in the header file
+@file{gsl_sf_bessel.h}.
+
+@menu
+* Regular Cylindrical Bessel Functions::
+* Irregular Cylindrical Bessel Functions::
+* Regular Modified Cylindrical Bessel Functions::
+* Irregular Modified Cylindrical Bessel Functions::
+* Regular Spherical Bessel Functions::
+* Irregular Spherical Bessel Functions::
+* Regular Modified Spherical Bessel Functions::
+* Irregular Modified Spherical Bessel Functions::
+* Regular Bessel Function - Fractional Order::
+* Irregular Bessel Functions - Fractional Order::
+* Regular Modified Bessel Functions - Fractional Order::
+* Irregular Modified Bessel Functions - Fractional Order::
+* Zeros of Regular Bessel Functions::
+@end menu
+
+@node Regular Cylindrical Bessel Functions
+@subsection Regular Cylindrical Bessel Functions
+@cindex Cylindrical Bessel Functions
+@cindex Regular Cylindrical Bessel Functions
+
+@deftypefun double gsl_sf_bessel_J0 (double @var{x})
+@deftypefunx int gsl_sf_bessel_J0_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the regular cylindrical Bessel function of zeroth
+order, @math{J_0(x)}.
+@comment Exceptional Return Values: none
+@end deftypefun
+
+@deftypefun double gsl_sf_bessel_J1 (double @var{x})
+@deftypefunx int gsl_sf_bessel_J1_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the regular cylindrical Bessel function of first
+order, @math{J_1(x)}.
+@comment Exceptional Return Values: GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_bessel_Jn (int @var{n}, double @var{x})
+@deftypefunx int gsl_sf_bessel_Jn_e (int @var{n}, double @var{x}, gsl_sf_result * @var{result})
+These routines compute the regular cylindrical Bessel function of
+order @var{n}, @math{J_n(x)}.
+@comment Exceptional Return Values: GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun int gsl_sf_bessel_Jn_array (int @var{nmin}, int @var{nmax}, double @var{x}, double @var{result_array}[])
+This routine computes the values of the regular cylindrical Bessel
+functions @math{J_n(x)} for @math{n} from @var{nmin} to @var{nmax}
+inclusive, storing the results in the array @var{result_array}. The
+values are computed using recurrence relations for efficiency, and
+therefore may differ slightly from the exact values.
+@comment Exceptional Return Values: GSL_EDOM, GSL_EUNDRFLW
+@end deftypefun
+
+
+@node Irregular Cylindrical Bessel Functions
+@subsection Irregular Cylindrical Bessel Functions
+@cindex Irregular Cylindrical Bessel Functions
+
+@deftypefun double gsl_sf_bessel_Y0 (double @var{x})
+@deftypefunx int gsl_sf_bessel_Y0_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the irregular cylindrical Bessel function of zeroth
+order, @math{Y_0(x)}, for @math{x>0}.
+@comment Exceptional Return Values: GSL_EDOM, GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_bessel_Y1 (double @var{x})
+@deftypefunx int gsl_sf_bessel_Y1_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the irregular cylindrical Bessel function of first
+order, @math{Y_1(x)}, for @math{x>0}.
+@comment Exceptional Return Values: GSL_EDOM, GSL_EOVRFLW, GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_bessel_Yn (int @var{n},double @var{x})
+@deftypefunx int gsl_sf_bessel_Yn_e (int @var{n},double @var{x}, gsl_sf_result * @var{result})
+These routines compute the irregular cylindrical Bessel function of
+order @var{n}, @math{Y_n(x)}, for @math{x>0}.
+@comment Exceptional Return Values: GSL_EDOM, GSL_EOVRFLW, GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun int gsl_sf_bessel_Yn_array (int @var{nmin}, int @var{nmax}, double @var{x}, double @var{result_array}[])
+This routine computes the values of the irregular cylindrical Bessel
+functions @math{Y_n(x)} for @math{n} from @var{nmin} to @var{nmax}
+inclusive, storing the results in the array @var{result_array}. The
+domain of the function is @math{x>0}. The values are computed using
+recurrence relations for efficiency, and therefore may differ slightly
+from the exact values.
+@comment Exceptional Return Values: GSL_EDOM, GSL_EOVRFLW, GSL_EUNDRFLW
+@end deftypefun
+
+
+@node Regular Modified Cylindrical Bessel Functions
+@subsection Regular Modified Cylindrical Bessel Functions
+@cindex Modified Cylindrical Bessel Functions
+@cindex Regular Modified Cylindrical Bessel Functions
+
+@deftypefun double gsl_sf_bessel_I0 (double @var{x})
+@deftypefunx int gsl_sf_bessel_I0_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the regular modified cylindrical Bessel function
+of zeroth order, @math{I_0(x)}.
+@comment Exceptional Return Values: GSL_EOVRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_bessel_I1 (double @var{x})
+@deftypefunx int gsl_sf_bessel_I1_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the regular modified cylindrical Bessel function
+of first order, @math{I_1(x)}.
+@comment Exceptional Return Values: GSL_EOVRFLW, GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_bessel_In (int @var{n}, double @var{x})
+@deftypefunx int gsl_sf_bessel_In_e (int @var{n}, double @var{x}, gsl_sf_result * @var{result})
+These routines compute the regular modified cylindrical Bessel function
+of order @var{n}, @math{I_n(x)}.
+@comment Exceptional Return Values: GSL_EOVRFLW, GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun int gsl_sf_bessel_In_array (int @var{nmin}, int @var{nmax}, double @var{x}, double @var{result_array}[])
+This routine computes the values of the regular modified cylindrical
+Bessel functions @math{I_n(x)} for @math{n} from @var{nmin} to
+@var{nmax} inclusive, storing the results in the array
+@var{result_array}. The start of the range @var{nmin} must be positive
+or zero. The values are computed using recurrence relations for
+efficiency, and therefore may differ slightly from the exact values.
+@comment Domain: nmin >=0, nmax >= nmin
+@comment Conditions: n=nmin,...,nmax, nmin >=0, nmax >= nmin
+@comment Exceptional Return Values: GSL_EDOM, GSL_EOVRFLW, GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_bessel_I0_scaled (double @var{x})
+@deftypefunx int gsl_sf_bessel_I0_scaled_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the scaled regular modified cylindrical Bessel
+function of zeroth order @math{\exp(-|x|) I_0(x)}.
+@comment Exceptional Return Values: none
+@end deftypefun
+
+@deftypefun double gsl_sf_bessel_I1_scaled (double @var{x})
+@deftypefunx int gsl_sf_bessel_I1_scaled_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the scaled regular modified cylindrical Bessel
+function of first order @math{\exp(-|x|) I_1(x)}.
+@comment Exceptional Return Values: GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_bessel_In_scaled (int @var{n}, double @var{x})
+@deftypefunx int gsl_sf_bessel_In_scaled_e (int @var{n}, double @var{x}, gsl_sf_result * @var{result})
+These routines compute the scaled regular modified cylindrical Bessel
+function of order @var{n}, @math{\exp(-|x|) I_n(x)}
+@comment Exceptional Return Values: GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun int gsl_sf_bessel_In_scaled_array (int @var{nmin}, int @var{nmax}, double @var{x}, double @var{result_array}[])
+This routine computes the values of the scaled regular cylindrical
+Bessel functions @math{\exp(-|x|) I_n(x)} for @math{n} from
+@var{nmin} to @var{nmax} inclusive, storing the results in the array
+@var{result_array}. The start of the range @var{nmin} must be positive
+or zero. The values are computed using recurrence relations for
+efficiency, and therefore may differ slightly from the exact values.
+@comment Domain: nmin >=0, nmax >= nmin
+@comment Conditions: n=nmin,...,nmax
+@comment Exceptional Return Values: GSL_EUNDRFLW
+@end deftypefun
+
+
+@node Irregular Modified Cylindrical Bessel Functions
+@subsection Irregular Modified Cylindrical Bessel Functions
+@cindex Irregular Modified Cylindrical Bessel Functions
+
+@deftypefun double gsl_sf_bessel_K0 (double @var{x})
+@deftypefunx int gsl_sf_bessel_K0_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the irregular modified cylindrical Bessel
+function of zeroth order, @math{K_0(x)}, for @math{x > 0}.
+@comment Domain: x > 0.0
+@comment Exceptional Return Values: GSL_EDOM, GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_bessel_K1 (double @var{x})
+@deftypefunx int gsl_sf_bessel_K1_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the irregular modified cylindrical Bessel
+function of first order, @math{K_1(x)}, for @math{x > 0}.
+@comment Domain: x > 0.0
+@comment Exceptional Return Values: GSL_EDOM, GSL_EOVRFLW, GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_bessel_Kn (int @var{n}, double @var{x})
+@deftypefunx int gsl_sf_bessel_Kn_e (int @var{n}, double @var{x}, gsl_sf_result * @var{result})
+These routines compute the irregular modified cylindrical Bessel
+function of order @var{n}, @math{K_n(x)}, for @math{x > 0}.
+@comment Domain: x > 0.0
+@comment Exceptional Return Values: GSL_EDOM, GSL_EOVRFLW, GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun int gsl_sf_bessel_Kn_array (int @var{nmin}, int @var{nmax}, double @var{x}, double @var{result_array}[])
+This routine computes the values of the irregular modified cylindrical
+Bessel functions @math{K_n(x)} for @math{n} from @var{nmin} to
+@var{nmax} inclusive, storing the results in the array
+@var{result_array}. The start of the range @var{nmin} must be positive
+or zero. The domain of the function is @math{x>0}. The values are
+computed using recurrence relations for efficiency, and therefore
+may differ slightly from the exact values.
+@comment Conditions: n=nmin,...,nmax
+@comment Domain: x > 0.0, nmin>=0, nmax >= nmin
+@comment Exceptional Return Values: GSL_EDOM, GSL_EOVRFLW, GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_bessel_K0_scaled (double @var{x})
+@deftypefunx int gsl_sf_bessel_K0_scaled_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the scaled irregular modified cylindrical Bessel
+function of zeroth order @math{\exp(x) K_0(x)} for @math{x>0}.
+@comment Domain: x > 0.0
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+@deftypefun double gsl_sf_bessel_K1_scaled (double @var{x})
+@deftypefunx int gsl_sf_bessel_K1_scaled_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the scaled irregular modified cylindrical Bessel
+function of first order @math{\exp(x) K_1(x)} for @math{x>0}.
+@comment Domain: x > 0.0
+@comment Exceptional Return Values: GSL_EDOM, GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_bessel_Kn_scaled (int @var{n}, double @var{x})
+@deftypefunx int gsl_sf_bessel_Kn_scaled_e (int @var{n}, double @var{x}, gsl_sf_result * @var{result})
+These routines compute the scaled irregular modified cylindrical Bessel
+function of order @var{n}, @math{\exp(x) K_n(x)}, for @math{x>0}.
+@comment Domain: x > 0.0
+@comment Exceptional Return Values: GSL_EDOM, GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun int gsl_sf_bessel_Kn_scaled_array (int @var{nmin}, int @var{nmax}, double @var{x}, double @var{result_array}[])
+This routine computes the values of the scaled irregular cylindrical
+Bessel functions @math{\exp(x) K_n(x)} for @math{n} from @var{nmin} to
+@var{nmax} inclusive, storing the results in the array
+@var{result_array}. The start of the range @var{nmin} must be positive
+or zero. The domain of the function is @math{x>0}. The values are
+computed using recurrence relations for efficiency, and therefore
+may differ slightly from the exact values.
+@comment Domain: x > 0.0, nmin >=0, nmax >= nmin
+@comment Conditions: n=nmin,...,nmax
+@comment Exceptional Return Values: GSL_EDOM, GSL_EUNDRFLW
+@end deftypefun
+
+
+@node Regular Spherical Bessel Functions
+@subsection Regular Spherical Bessel Functions
+@cindex Spherical Bessel Functions
+@cindex Regular Spherical Bessel Functions
+
+@deftypefun double gsl_sf_bessel_j0 (double @var{x})
+@deftypefunx int gsl_sf_bessel_j0_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the regular spherical Bessel function of zeroth
+order, @math{j_0(x) = \sin(x)/x}.
+@comment Exceptional Return Values: none
+@end deftypefun
+
+@deftypefun double gsl_sf_bessel_j1 (double @var{x})
+@deftypefunx int gsl_sf_bessel_j1_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the regular spherical Bessel function of first
+order, @math{j_1(x) = (\sin(x)/x - \cos(x))/x}.
+@comment Exceptional Return Values: GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_bessel_j2 (double @var{x})
+@deftypefunx int gsl_sf_bessel_j2_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the regular spherical Bessel function of second
+order, @math{j_2(x) = ((3/x^2 - 1)\sin(x) - 3\cos(x)/x)/x}.
+@comment Exceptional Return Values: GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_bessel_jl (int @var{l}, double @var{x})
+@deftypefunx int gsl_sf_bessel_jl_e (int @var{l}, double @var{x}, gsl_sf_result * @var{result})
+These routines compute the regular spherical Bessel function of
+order @var{l}, @math{j_l(x)}, for @c{$l \geq 0$}
+@math{l >= 0} and @c{$x \geq 0$}
+@math{x >= 0}.
+@comment Domain: l >= 0, x >= 0.0
+@comment Exceptional Return Values: GSL_EDOM, GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun int gsl_sf_bessel_jl_array (int @var{lmax}, double @var{x}, double @var{result_array}[])
+This routine computes the values of the regular spherical Bessel
+functions @math{j_l(x)} for @math{l} from 0 to @var{lmax}
+inclusive for @c{$lmax \geq 0$}
+@math{lmax >= 0} and @c{$x \geq 0$}
+@math{x >= 0}, storing the results in the array @var{result_array}.
+The values are computed using recurrence relations for
+efficiency, and therefore may differ slightly from the exact values.
+@comment Domain: lmax >= 0
+@comment Conditions: l=0,1,...,lmax
+@comment Exceptional Return Values: GSL_EDOM, GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun int gsl_sf_bessel_jl_steed_array (int @var{lmax}, double @var{x}, double * @var{jl_x_array})
+This routine uses Steed's method to compute the values of the regular
+spherical Bessel functions @math{j_l(x)} for @math{l} from 0 to
+@var{lmax} inclusive for @c{$lmax \geq 0$}
+@math{lmax >= 0} and @c{$x \geq 0$}
+@math{x >= 0}, storing the results in the array
+@var{result_array}.
+The Steed/Barnett algorithm is described in @cite{Comp. Phys. Comm.} 21,
+297 (1981). Steed's method is more stable than the
+recurrence used in the other functions but is also slower.
+@comment Domain: lmax >= 0
+@comment Conditions: l=0,1,...,lmax
+@comment Exceptional Return Values: GSL_EDOM, GSL_EUNDRFLW
+@end deftypefun
+
+
+@node Irregular Spherical Bessel Functions
+@subsection Irregular Spherical Bessel Functions
+@cindex Irregular Spherical Bessel Functions
+
+@deftypefun double gsl_sf_bessel_y0 (double @var{x})
+@deftypefunx int gsl_sf_bessel_y0_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the irregular spherical Bessel function of zeroth
+order, @math{y_0(x) = -\cos(x)/x}.
+@comment Exceptional Return Values: none
+@end deftypefun
+
+@deftypefun double gsl_sf_bessel_y1 (double @var{x})
+@deftypefunx int gsl_sf_bessel_y1_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the irregular spherical Bessel function of first
+order, @math{y_1(x) = -(\cos(x)/x + \sin(x))/x}.
+@comment Exceptional Return Values: GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_bessel_y2 (double @var{x})
+@deftypefunx int gsl_sf_bessel_y2_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the irregular spherical Bessel function of second
+order, @math{y_2(x) = (-3/x^3 + 1/x)\cos(x) - (3/x^2)\sin(x)}.
+@comment Exceptional Return Values: GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_bessel_yl (int @var{l}, double @var{x})
+@deftypefunx int gsl_sf_bessel_yl_e (int @var{l}, double @var{x}, gsl_sf_result * @var{result})
+These routines compute the irregular spherical Bessel function of
+order @var{l}, @math{y_l(x)}, for @c{$l \geq 0$}
+@math{l >= 0}.
+@comment Exceptional Return Values: GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun int gsl_sf_bessel_yl_array (int @var{lmax}, double @var{x}, double @var{result_array}[])
+This routine computes the values of the irregular spherical Bessel
+functions @math{y_l(x)} for @math{l} from 0 to @var{lmax}
+inclusive for @c{$lmax \geq 0$}
+@math{lmax >= 0}, storing the results in the array @var{result_array}.
+The values are computed using recurrence relations for
+efficiency, and therefore may differ slightly from the exact values.
+@comment Domain: lmax >= 0
+@comment Conditions: l=0,1,...,lmax
+@comment Exceptional Return Values: GSL_EUNDRFLW
+@end deftypefun
+
+
+@node Regular Modified Spherical Bessel Functions
+@subsection Regular Modified Spherical Bessel Functions
+@cindex Modified Spherical Bessel Functions
+@cindex Regular Modified Spherical Bessel Functions
+
+The regular modified spherical Bessel functions @math{i_l(x)}
+are related to the modified Bessel functions of fractional order,
+@c{$i_l(x) = \sqrt{\pi/(2x)} I_{l+1/2}(x)$}
+@math{i_l(x) = \sqrt@{\pi/(2x)@} I_@{l+1/2@}(x)}
+
+@deftypefun double gsl_sf_bessel_i0_scaled (double @var{x})
+@deftypefunx int gsl_sf_bessel_i0_scaled_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the scaled regular modified spherical Bessel
+function of zeroth order, @math{\exp(-|x|) i_0(x)}.
+@comment Exceptional Return Values: none
+@end deftypefun
+
+@deftypefun double gsl_sf_bessel_i1_scaled (double @var{x})
+@deftypefunx int gsl_sf_bessel_i1_scaled_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the scaled regular modified spherical Bessel
+function of first order, @math{\exp(-|x|) i_1(x)}.
+@comment Exceptional Return Values: GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_bessel_i2_scaled (double @var{x})
+@deftypefunx int gsl_sf_bessel_i2_scaled_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the scaled regular modified spherical Bessel
+function of second order, @math{ \exp(-|x|) i_2(x) }
+@comment Exceptional Return Values: GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_bessel_il_scaled (int @var{l}, double @var{x})
+@deftypefunx int gsl_sf_bessel_il_scaled_e (int @var{l}, double @var{x}, gsl_sf_result * @var{result})
+These routines compute the scaled regular modified spherical Bessel
+function of order @var{l}, @math{ \exp(-|x|) i_l(x) }
+@comment Domain: l >= 0
+@comment Exceptional Return Values: GSL_EDOM, GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun int gsl_sf_bessel_il_scaled_array (int @var{lmax}, double @var{x}, double @var{result_array}[])
+This routine computes the values of the scaled regular modified
+cylindrical Bessel functions @math{\exp(-|x|) i_l(x)} for @math{l} from
+0 to @var{lmax} inclusive for @c{$lmax \geq 0$}
+@math{lmax >= 0}, storing the results in
+the array @var{result_array}.
+The values are computed using recurrence relations for
+efficiency, and therefore may differ slightly from the exact values.
+@comment Domain: lmax >= 0
+@comment Conditions: l=0,1,...,lmax
+@comment Exceptional Return Values: GSL_EUNDRFLW
+@end deftypefun
+
+
+@node Irregular Modified Spherical Bessel Functions
+@subsection Irregular Modified Spherical Bessel Functions
+@cindex Irregular Modified Spherical Bessel Functions
+
+The irregular modified spherical Bessel functions @math{k_l(x)}
+are related to the irregular modified Bessel functions of fractional order,
+@c{$k_l(x) = \sqrt{\pi/(2x)} K_{l+1/2}(x)$}
+@math{k_l(x) = \sqrt@{\pi/(2x)@} K_@{l+1/2@}(x)}.
+
+@deftypefun double gsl_sf_bessel_k0_scaled (double @var{x})
+@deftypefunx int gsl_sf_bessel_k0_scaled_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the scaled irregular modified spherical Bessel
+function of zeroth order, @math{\exp(x) k_0(x)}, for @math{x>0}.
+@comment Domain: x > 0.0
+@comment Exceptional Return Values: GSL_EDOM, GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_bessel_k1_scaled (double @var{x})
+@deftypefunx int gsl_sf_bessel_k1_scaled_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the scaled irregular modified spherical Bessel
+function of first order, @math{\exp(x) k_1(x)}, for @math{x>0}.
+@comment Domain: x > 0.0
+@comment Exceptional Return Values: GSL_EDOM, GSL_EUNDRFLW, GSL_EOVRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_bessel_k2_scaled (double @var{x})
+@deftypefunx int gsl_sf_bessel_k2_scaled_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the scaled irregular modified spherical Bessel
+function of second order, @math{\exp(x) k_2(x)}, for @math{x>0}.
+@comment Domain: x > 0.0
+@comment Exceptional Return Values: GSL_EDOM, GSL_EUNDRFLW, GSL_EOVRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_bessel_kl_scaled (int @var{l}, double @var{x})
+@deftypefunx int gsl_sf_bessel_kl_scaled_e (int @var{l}, double @var{x}, gsl_sf_result * @var{result})
+These routines compute the scaled irregular modified spherical Bessel
+function of order @var{l}, @math{\exp(x) k_l(x)}, for @math{x>0}.
+@comment Domain: x > 0.0
+@comment Exceptional Return Values: GSL_EDOM, GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun int gsl_sf_bessel_kl_scaled_array (int @var{lmax}, double @var{x}, double @var{result_array}[])
+This routine computes the values of the scaled irregular modified
+spherical Bessel functions @math{\exp(x) k_l(x)} for @math{l} from
+0 to @var{lmax} inclusive for @c{$lmax \geq 0$}
+@math{lmax >= 0} and @math{x>0}, storing the results in
+the array @var{result_array}.
+The values are computed using recurrence relations for
+efficiency, and therefore may differ slightly from the exact values.
+@comment Domain: lmax >= 0
+@comment Conditions: l=0,1,...,lmax
+@comment Exceptional Return Values: GSL_EDOM, GSL_EUNDRFLW
+@end deftypefun
+
+
+@node Regular Bessel Function - Fractional Order
+@subsection Regular Bessel Function---Fractional Order
+@cindex Fractional Order Bessel Functions
+@cindex Bessel Functions, Fractional Order
+@cindex Regular Bessel Functions, Fractional Order
+
+@deftypefun double gsl_sf_bessel_Jnu (double @var{nu}, double @var{x})
+@deftypefunx int gsl_sf_bessel_Jnu_e (double @var{nu}, double @var{x}, gsl_sf_result * @var{result})
+These routines compute the regular cylindrical Bessel function of
+fractional order @math{\nu}, @math{J_\nu(x)}.
+@comment Exceptional Return Values: GSL_EDOM, GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun int gsl_sf_bessel_sequence_Jnu_e (double @var{nu}, gsl_mode_t @var{mode}, size_t @var{size}, double @var{v}[])
+This function computes the regular cylindrical Bessel function of
+fractional order @math{\nu}, @math{J_\nu(x)}, evaluated at a series of
+@math{x} values. The array @var{v} of length @var{size} contains the
+@math{x} values. They are assumed to be strictly ordered and positive.
+The array is over-written with the values of @math{J_\nu(x_i)}.
+@comment Exceptional Return Values: GSL_EDOM, GSL_EINVAL
+@end deftypefun
+
+
+@node Irregular Bessel Functions - Fractional Order
+@subsection Irregular Bessel Functions---Fractional Order
+
+@deftypefun double gsl_sf_bessel_Ynu (double @var{nu}, double @var{x})
+@deftypefunx int gsl_sf_bessel_Ynu_e (double @var{nu}, double @var{x}, gsl_sf_result * @var{result})
+These routines compute the irregular cylindrical Bessel function of
+fractional order @math{\nu}, @math{Y_\nu(x)}.
+@comment Exceptional Return Values:
+@end deftypefun
+
+
+@node Regular Modified Bessel Functions - Fractional Order
+@subsection Regular Modified Bessel Functions---Fractional Order
+@cindex Modified Bessel Functions, Fractional Order
+@cindex Regular Modified Bessel Functions, Fractional Order
+
+@deftypefun double gsl_sf_bessel_Inu (double @var{nu}, double @var{x})
+@deftypefunx int gsl_sf_bessel_Inu_e (double @var{nu}, double @var{x}, gsl_sf_result * @var{result})
+These routines compute the regular modified Bessel function of
+fractional order @math{\nu}, @math{I_\nu(x)} for @math{x>0},
+@math{\nu>0}.
+@comment Domain: x >= 0, nu >= 0
+@comment Exceptional Return Values: GSL_EDOM, GSL_EOVRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_bessel_Inu_scaled (double @var{nu}, double @var{x})
+@deftypefunx int gsl_sf_bessel_Inu_scaled_e (double @var{nu}, double @var{x}, gsl_sf_result * @var{result})
+These routines compute the scaled regular modified Bessel function of
+fractional order @math{\nu}, @math{\exp(-|x|)I_\nu(x)} for @math{x>0},
+@math{\nu>0}.
+@comment @math{ \exp(-|x|) I_@{\nu@}(x) }
+@comment Domain: x >= 0, nu >= 0
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+
+@node Irregular Modified Bessel Functions - Fractional Order
+@subsection Irregular Modified Bessel Functions---Fractional Order
+@cindex Irregular Modified Bessel Functions, Fractional Order
+
+@deftypefun double gsl_sf_bessel_Knu (double @var{nu}, double @var{x})
+@deftypefunx int gsl_sf_bessel_Knu_e (double @var{nu}, double @var{x}, gsl_sf_result * @var{result})
+These routines compute the irregular modified Bessel function of
+fractional order @math{\nu}, @math{K_\nu(x)} for @math{x>0},
+@math{\nu>0}.
+@comment Domain: x > 0, nu >= 0
+@comment Exceptional Return Values: GSL_EDOM, GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_bessel_lnKnu (double @var{nu}, double @var{x})
+@deftypefunx int gsl_sf_bessel_lnKnu_e (double @var{nu}, double @var{x}, gsl_sf_result * @var{result})
+These routines compute the logarithm of the irregular modified Bessel
+function of fractional order @math{\nu}, @math{\ln(K_\nu(x))} for
+@math{x>0}, @math{\nu>0}.
+@comment Domain: x > 0, nu >= 0
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+@deftypefun double gsl_sf_bessel_Knu_scaled (double @var{nu}, double @var{x})
+@deftypefunx int gsl_sf_bessel_Knu_scaled_e (double @var{nu}, double @var{x}, gsl_sf_result * @var{result})
+These routines compute the scaled irregular modified Bessel function of
+fractional order @math{\nu}, @math{\exp(+|x|) K_\nu(x)} for @math{x>0},
+@math{\nu>0}.
+@comment Domain: x > 0, nu >= 0
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+@node Zeros of Regular Bessel Functions
+@subsection Zeros of Regular Bessel Functions
+@cindex Zeros of Regular Bessel Functions
+@cindex Regular Bessel Functions, Zeros of
+
+@deftypefun double gsl_sf_bessel_zero_J0 (unsigned int @var{s})
+@deftypefunx int gsl_sf_bessel_zero_J0_e (unsigned int @var{s}, gsl_sf_result * @var{result})
+These routines compute the location of the @var{s}-th positive zero of
+the Bessel function @math{J_0(x)}.
+@comment Exceptional Return Values:
+@end deftypefun
+
+@deftypefun double gsl_sf_bessel_zero_J1 (unsigned int @var{s})
+@deftypefunx int gsl_sf_bessel_zero_J1_e (unsigned int @var{s}, gsl_sf_result * @var{result})
+These routines compute the location of the @var{s}-th positive zero of
+the Bessel function @math{J_1(x)}.
+@comment Exceptional Return Values:
+@end deftypefun
+
+@deftypefun double gsl_sf_bessel_zero_Jnu (double @var{nu}, unsigned int @var{s})
+@deftypefunx int gsl_sf_bessel_zero_Jnu_e (double @var{nu}, unsigned int @var{s}, gsl_sf_result * @var{result})
+These routines compute the location of the @var{s}-th positive zero of
+the Bessel function @math{J_\nu(x)}. The current implementation does not
+support negative values of @var{nu}.
+@comment Exceptional Return Values:
+@end deftypefun
+
diff --git a/gsl-1.9/doc/specfunc-clausen.texi b/gsl-1.9/doc/specfunc-clausen.texi
new file mode 100644
index 0000000..b0987c2
--- /dev/null
+++ b/gsl-1.9/doc/specfunc-clausen.texi
@@ -0,0 +1,28 @@
+@cindex Clausen functions
+
+The Clausen function is defined by the following integral,
+@tex
+\beforedisplay
+$$
+Cl_2(x) = - \int_0^x dt \log(2 \sin(t/2))
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+Cl_2(x) = - \int_0^x dt \log(2 \sin(t/2))
+@end example
+
+@end ifinfo
+@noindent
+It is related to the dilogarithm by
+@c{$Cl_2(\theta) = \Im(Li_2(e^{i\theta}))$}
+@math{Cl_2(\theta) = \Im Li_2(\exp(i\theta))}.
+The Clausen functions are declared in the header file
+@file{gsl_sf_clausen.h}.
+
+@deftypefun double gsl_sf_clausen (double @var{x})
+@deftypefunx int gsl_sf_clausen_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the Clausen integral @math{Cl_2(x)}.
+@end deftypefun
diff --git a/gsl-1.9/doc/specfunc-coulomb.texi b/gsl-1.9/doc/specfunc-coulomb.texi
new file mode 100644
index 0000000..7114620
--- /dev/null
+++ b/gsl-1.9/doc/specfunc-coulomb.texi
@@ -0,0 +1,151 @@
+@cindex Coulomb wave functions
+@cindex hydrogen atom
+
+The prototypes of the Coulomb functions are declared in the header file
+@file{gsl_sf_coulomb.h}. Both bound state and scattering solutions are
+available.
+
+@menu
+* Normalized Hydrogenic Bound States::
+* Coulomb Wave Functions::
+* Coulomb Wave Function Normalization Constant::
+@end menu
+
+@node Normalized Hydrogenic Bound States
+@subsection Normalized Hydrogenic Bound States
+
+@deftypefun double gsl_sf_hydrogenicR_1 (double @var{Z}, double @var{r})
+@deftypefunx int gsl_sf_hydrogenicR_1_e (double @var{Z}, double @var{r}, gsl_sf_result * @var{result})
+These routines compute the lowest-order normalized hydrogenic bound
+state radial wavefunction @c{$R_1 := 2Z \sqrt{Z} \exp(-Z r)$}
+@math{R_1 := 2Z \sqrt@{Z@} \exp(-Z r)}.
+@end deftypefun
+
+@deftypefun double gsl_sf_hydrogenicR (int @var{n}, int @var{l}, double @var{Z}, double @var{r})
+@deftypefunx int gsl_sf_hydrogenicR_e (int @var{n}, int @var{l}, double @var{Z}, double @var{r}, gsl_sf_result * @var{result})
+These routines compute the @var{n}-th normalized hydrogenic bound state
+radial wavefunction,
+@comment
+@tex
+\beforedisplay
+$$
+R_n := {2 Z^{3/2} \over n^2} \left({2Z r \over n}\right)^l \sqrt{(n-l-1)! \over (n+l)!} \exp(-Z r/n) L^{2l+1}_{n-l-1}(2Z r / n).
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+R_n := 2 (Z^@{3/2@}/n^2) \sqrt@{(n-l-1)!/(n+l)!@} \exp(-Z r/n) (2Zr/n)^l
+ L^@{2l+1@}_@{n-l-1@}(2Zr/n).
+@end example
+
+@end ifinfo
+@noindent
+where @math{L^a_b(x)} is the generalized Laguerre polynomial (@pxref{Laguerre Functions}).
+The normalization is chosen such that the wavefunction @math{\psi} is
+given by
+@c{$\psi(n,l,r) = R_n Y_{lm}$}
+@math{\psi(n,l,r) = R_n Y_@{lm@}}.
+@end deftypefun
+
+@node Coulomb Wave Functions
+@subsection Coulomb Wave Functions
+
+The Coulomb wave functions @math{F_L(\eta,x)}, @math{G_L(\eta,x)} are
+described in Abramowitz & Stegun, Chapter 14. Because there can be a
+large dynamic range of values for these functions, overflows are handled
+gracefully. If an overflow occurs, @code{GSL_EOVRFLW} is signalled and
+exponent(s) are returned through the modifiable parameters @var{exp_F},
+@var{exp_G}. The full solution can be reconstructed from the following
+relations,
+@tex
+\beforedisplay
+$$
+\eqalign{
+ F_L(\eta,x) &= fc[k_L] * \exp(exp_F)\cr
+ G_L(\eta,x) &= gc[k_L] * \exp(exp_G)\cr
+\cr
+ F_L'(\eta,x) &= fcp[k_L] * \exp(exp_F)\cr
+ G_L'(\eta,x) &= gcp[k_L] * \exp(exp_G)
+}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+F_L(eta,x) = fc[k_L] * exp(exp_F)
+G_L(eta,x) = gc[k_L] * exp(exp_G)
+
+F_L'(eta,x) = fcp[k_L] * exp(exp_F)
+G_L'(eta,x) = gcp[k_L] * exp(exp_G)
+@end example
+
+@end ifinfo
+@noindent
+
+@deftypefun int gsl_sf_coulomb_wave_FG_e (double @var{eta}, double @var{x}, double @var{L_F}, int @var{k}, gsl_sf_result * @var{F}, gsl_sf_result * @var{Fp}, gsl_sf_result * @var{G}, gsl_sf_result * @var{Gp}, double * @var{exp_F}, double * @var{exp_G})
+This function computes the Coulomb wave functions @math{F_L(\eta,x)},
+@c{$G_{L-k}(\eta,x)$}
+@math{G_@{L-k@}(\eta,x)} and their derivatives
+@math{F'_L(\eta,x)},
+@c{$G'_{L-k}(\eta,x)$}
+@math{G'_@{L-k@}(\eta,x)}
+with respect to @math{x}. The parameters are restricted to @math{L,
+L-k > -1/2}, @math{x > 0} and integer @math{k}. Note that @math{L}
+itself is not restricted to being an integer. The results are stored in
+the parameters @var{F}, @var{G} for the function values and @var{Fp},
+@var{Gp} for the derivative values. If an overflow occurs,
+@code{GSL_EOVRFLW} is returned and scaling exponents are stored in
+the modifiable parameters @var{exp_F}, @var{exp_G}.
+@end deftypefun
+
+@deftypefun int gsl_sf_coulomb_wave_F_array (double @var{L_min}, int @var{kmax}, double @var{eta}, double @var{x}, double @var{fc_array}[], double * @var{F_exponent})
+This function computes the Coulomb wave function @math{F_L(\eta,x)} for
+@math{L = Lmin \dots Lmin + kmax}, storing the results in @var{fc_array}.
+In the case of overflow the exponent is stored in @var{F_exponent}.
+@end deftypefun
+
+@deftypefun int gsl_sf_coulomb_wave_FG_array (double @var{L_min}, int @var{kmax}, double @var{eta}, double @var{x}, double @var{fc_array}[], double @var{gc_array}[], double * @var{F_exponent}, double * @var{G_exponent})
+This function computes the functions @math{F_L(\eta,x)},
+@math{G_L(\eta,x)} for @math{L = Lmin \dots Lmin + kmax} storing the
+results in @var{fc_array} and @var{gc_array}. In the case of overflow the
+exponents are stored in @var{F_exponent} and @var{G_exponent}.
+@end deftypefun
+
+@deftypefun int gsl_sf_coulomb_wave_FGp_array (double @var{L_min}, int @var{kmax}, double @var{eta}, double @var{x}, double @var{fc_array}[], double @var{fcp_array}[], double @var{gc_array}[], double @var{gcp_array}[], double * @var{F_exponent}, double * @var{G_exponent})
+This function computes the functions @math{F_L(\eta,x)},
+@math{G_L(\eta,x)} and their derivatives @math{F'_L(\eta,x)},
+@math{G'_L(\eta,x)} for @math{L = Lmin \dots Lmin + kmax} storing the
+results in @var{fc_array}, @var{gc_array}, @var{fcp_array} and @var{gcp_array}.
+In the case of overflow the exponents are stored in @var{F_exponent}
+and @var{G_exponent}.
+@end deftypefun
+
+@deftypefun int gsl_sf_coulomb_wave_sphF_array (double @var{L_min}, int @var{kmax}, double @var{eta}, double @var{x}, double @var{fc_array}[], double @var{F_exponent}[])
+This function computes the Coulomb wave function divided by the argument
+@math{F_L(\eta, x)/x} for @math{L = Lmin \dots Lmin + kmax}, storing the
+results in @var{fc_array}. In the case of overflow the exponent is
+stored in @var{F_exponent}. This function reduces to spherical Bessel
+functions in the limit @math{\eta \to 0}.
+@end deftypefun
+
+@node Coulomb Wave Function Normalization Constant
+@subsection Coulomb Wave Function Normalization Constant
+
+The Coulomb wave function normalization constant is defined in
+Abramowitz 14.1.7.
+
+@deftypefun int gsl_sf_coulomb_CL_e (double @var{L}, double @var{eta}, gsl_sf_result * @var{result})
+This function computes the Coulomb wave function normalization constant
+@math{C_L(\eta)} for @math{L > -1}.
+@end deftypefun
+
+@deftypefun int gsl_sf_coulomb_CL_array (double @var{Lmin}, int @var{kmax}, double @var{eta}, double @var{cl}[])
+This function computes the Coulomb wave function normalization constant
+@math{C_L(\eta)} for @math{L = Lmin \dots Lmin + kmax}, @math{Lmin > -1}.
+@end deftypefun
+
+
+
diff --git a/gsl-1.9/doc/specfunc-coupling.texi b/gsl-1.9/doc/specfunc-coupling.texi
new file mode 100644
index 0000000..3efd9fe
--- /dev/null
+++ b/gsl-1.9/doc/specfunc-coupling.texi
@@ -0,0 +1,109 @@
+@cindex coupling coefficients
+@cindex 3-j symbols
+@cindex 6-j symbols
+@cindex 9-j symbols
+@cindex Wigner coefficients
+@cindex Racah coefficients
+
+The Wigner 3-j, 6-j and 9-j symbols give the coupling coefficients for
+combined angular momentum vectors. Since the arguments of the standard
+coupling coefficient functions are integer or half-integer, the
+arguments of the following functions are, by convention, integers equal
+to twice the actual spin value. For information on the 3-j coefficients
+see Abramowitz & Stegun, Section 27.9. The functions described in this
+section are declared in the header file @file{gsl_sf_coupling.h}.
+
+@menu
+* 3-j Symbols::
+* 6-j Symbols::
+* 9-j Symbols::
+@end menu
+
+@node 3-j Symbols
+@subsection 3-j Symbols
+
+@deftypefun double gsl_sf_coupling_3j (int @var{two_ja}, int @var{two_jb}, int @var{two_jc}, int @var{two_ma}, int @var{two_mb}, int @var{two_mc})
+@deftypefunx int gsl_sf_coupling_3j_e (int @var{two_ja}, int @var{two_jb}, int @var{two_jc}, int @var{two_ma}, int @var{two_mb}, int @var{two_mc}, gsl_sf_result * @var{result})
+These routines compute the Wigner 3-j coefficient,
+@tex
+\beforedisplay
+$$
+\pmatrix{ja & jb & jc\cr
+ ma & mb & mc\cr}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+(ja jb jc
+ ma mb mc)
+@end example
+
+@end ifinfo
+@noindent
+where the arguments are given in half-integer units, @math{ja} =
+@var{two_ja}/2, @math{ma} = @var{two_ma}/2, etc.
+@comment Exceptional Return Values: GSL_EDOM, GSL_EOVRFLW
+@end deftypefun
+
+
+@node 6-j Symbols
+@subsection 6-j Symbols
+
+@deftypefun double gsl_sf_coupling_6j (int @var{two_ja}, int @var{two_jb}, int @var{two_jc}, int @var{two_jd}, int @var{two_je}, int @var{two_jf})
+@deftypefunx int gsl_sf_coupling_6j_e (int @var{two_ja}, int @var{two_jb}, int @var{two_jc}, int @var{two_jd}, int @var{two_je}, int @var{two_jf}, gsl_sf_result * @var{result})
+These routines compute the Wigner 6-j coefficient,
+@tex
+\beforedisplay
+$$
+\left\{\matrix{ja & jb & jc\cr
+ jd & je & jf\cr}\right\}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+@{ja jb jc
+ jd je jf@}
+@end example
+
+@end ifinfo
+@noindent
+where the arguments are given in half-integer units, @math{ja} =
+@var{two_ja}/2, @math{ma} = @var{two_ma}/2, etc.
+@comment Exceptional Return Values: GSL_EDOM, GSL_EOVRFLW
+@end deftypefun
+
+
+@node 9-j Symbols
+@subsection 9-j Symbols
+
+@deftypefun double gsl_sf_coupling_9j (int @var{two_ja}, int @var{two_jb}, int @var{two_jc}, int @var{two_jd}, int @var{two_je}, int @var{two_jf}, int @var{two_jg}, int @var{two_jh}, int @var{two_ji})
+@deftypefunx int gsl_sf_coupling_9j_e (int @var{two_ja}, int @var{two_jb}, int @var{two_jc}, int @var{two_jd}, int @var{two_je}, int @var{two_jf}, int @var{two_jg}, int @var{two_jh}, int @var{two_ji}, gsl_sf_result * @var{result})
+These routines compute the Wigner 9-j coefficient,
+@tex
+\beforedisplay
+$$
+\left\{\matrix{ja & jb & jc\cr
+ jd & je & jf\cr
+ jg & jh & ji\cr}\right\}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+@{ja jb jc
+ jd je jf
+ jg jh ji@}
+@end example
+
+@end ifinfo
+@noindent
+where the arguments are given in half-integer units, @math{ja} =
+@var{two_ja}/2, @math{ma} = @var{two_ma}/2, etc.
+@comment Exceptional Return Values: GSL_EDOM, GSL_EOVRFLW
+@end deftypefun
+
diff --git a/gsl-1.9/doc/specfunc-dawson.texi b/gsl-1.9/doc/specfunc-dawson.texi
new file mode 100644
index 0000000..451ccf0
--- /dev/null
+++ b/gsl-1.9/doc/specfunc-dawson.texi
@@ -0,0 +1,12 @@
+@cindex Dawson function
+
+The Dawson integral is defined by @math{\exp(-x^2) \int_0^x dt
+\exp(t^2)}. A table of Dawson's integral can be found in Abramowitz &
+Stegun, Table 7.5. The Dawson functions are declared in the header file
+@file{gsl_sf_dawson.h}.
+
+@deftypefun double gsl_sf_dawson (double @var{x})
+@deftypefunx int gsl_sf_dawson_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the value of Dawson's integral for @var{x}.
+@comment Exceptional Return Values: GSL_EUNDRFLW
+@end deftypefun
diff --git a/gsl-1.9/doc/specfunc-debye.texi b/gsl-1.9/doc/specfunc-debye.texi
new file mode 100644
index 0000000..400dde2
--- /dev/null
+++ b/gsl-1.9/doc/specfunc-debye.texi
@@ -0,0 +1,63 @@
+@cindex Debye functions
+
+The Debye functions @math{D_n(x)} are defined by the following integral,
+@tex
+\beforedisplay
+$$
+D_n(x) = {n \over x^n} \int_0^x dt {t^n \over e^t - 1}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+D_n(x) = n/x^n \int_0^x dt (t^n/(e^t - 1))
+@end example
+
+@end ifinfo
+@noindent
+For further information see Abramowitz &
+Stegun, Section 27.1. The Debye functions are declared in the header
+file @file{gsl_sf_debye.h}.
+
+@deftypefun double gsl_sf_debye_1 (double @var{x})
+@deftypefunx int gsl_sf_debye_1_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the first-order Debye function
+@math{D_1(x) = (1/x) \int_0^x dt (t/(e^t - 1))}.
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+@deftypefun double gsl_sf_debye_2 (double @var{x})
+@deftypefunx int gsl_sf_debye_2_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the second-order Debye function
+@math{D_2(x) = (2/x^2) \int_0^x dt (t^2/(e^t - 1))}.
+@comment Exceptional Return Values: GSL_EDOM, GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_debye_3 (double @var{x})
+@deftypefunx int gsl_sf_debye_3_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the third-order Debye function
+@math{D_3(x) = (3/x^3) \int_0^x dt (t^3/(e^t - 1))}.
+@comment Exceptional Return Values: GSL_EDOM, GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_debye_4 (double @var{x})
+@deftypefunx int gsl_sf_debye_4_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the fourth-order Debye function
+@math{D_4(x) = (4/x^4) \int_0^x dt (t^4/(e^t - 1))}.
+@comment Exceptional Return Values: GSL_EDOM, GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_debye_5 (double @var{x})
+@deftypefunx int gsl_sf_debye_5_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the fifth-order Debye function
+@math{D_5(x) = (5/x^5) \int_0^x dt (t^5/(e^t - 1))}.
+@comment Exceptional Return Values: GSL_EDOM, GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_debye_6 (double @var{x})
+@deftypefunx int gsl_sf_debye_6_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the sixth-order Debye function
+@math{D_6(x) = (6/x^6) \int_0^x dt (t^6/(e^t - 1))}.
+@comment Exceptional Return Values: GSL_EDOM, GSL_EUNDRFLW
+@end deftypefun
diff --git a/gsl-1.9/doc/specfunc-dilog.texi b/gsl-1.9/doc/specfunc-dilog.texi
new file mode 100644
index 0000000..696b565
--- /dev/null
+++ b/gsl-1.9/doc/specfunc-dilog.texi
@@ -0,0 +1,33 @@
+@cindex dilogarithm
+
+The functions described in this section are declared in the header file
+@file{gsl_sf_dilog.h}.
+
+@menu
+* Real Argument::
+* Complex Argument::
+@end menu
+
+@node Real Argument
+@subsection Real Argument
+
+@deftypefun double gsl_sf_dilog (double @var{x})
+@deftypefunx int gsl_sf_dilog_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the dilogarithm for a real argument. In Lewin's
+notation this is @math{Li_2(x)}, the real part of the dilogarithm of a
+real @math{x}. It is defined by the integral representation
+@math{Li_2(x) = - \Re \int_0^x ds \log(1-s) / s}.
+Note that @math{\Im(Li_2(x)) = 0} for @c{$x \le 1$}
+@math{x <= 1}, and @math{-\pi\log(x)} for @math{x > 1}.
+
+@end deftypefun
+
+@node Complex Argument
+@subsection Complex Argument
+
+
+@deftypefun int gsl_sf_complex_dilog_e (double @var{r}, double @var{theta}, gsl_sf_result * @var{result_re}, gsl_sf_result * @var{result_im})
+This function computes the full complex-valued dilogarithm for the
+complex argument @math{z = r \exp(i \theta)}. The real and imaginary
+parts of the result are returned in @var{result_re}, @var{result_im}.
+@end deftypefun
diff --git a/gsl-1.9/doc/specfunc-elementary.texi b/gsl-1.9/doc/specfunc-elementary.texi
new file mode 100644
index 0000000..6d6f92a
--- /dev/null
+++ b/gsl-1.9/doc/specfunc-elementary.texi
@@ -0,0 +1,23 @@
+@cindex elementary operations
+@cindex multiplication
+
+The following functions allow for the propagation of errors when
+combining quantities by multiplication. The functions are declared in
+the header file @file{gsl_sf_elementary.h}.
+
+@comment @deftypefun double gsl_sf_multiply (double @var{x}, double @var{y})
+@deftypefun int gsl_sf_multiply_e (double @var{x}, double @var{y}, gsl_sf_result * @var{result})
+This function multiplies @var{x} and @var{y} storing the product and its
+associated error in @var{result}.
+@comment Exceptional Return Values: GSL_EOVRFLW, GSL_EUNDRFLW
+@end deftypefun
+
+
+@deftypefun int gsl_sf_multiply_err_e (double @var{x}, double @var{dx}, double @var{y}, double @var{dy}, gsl_sf_result * @var{result})
+This function multiplies @var{x} and @var{y} with associated absolute
+errors @var{dx} and @var{dy}. The product
+@c{$xy \pm xy \sqrt{(dx/x)^2 +(dy/y)^2}$}
+@math{xy +/- xy \sqrt((dx/x)^2 +(dy/y)^2)}
+is stored in @var{result}.
+@comment Exceptional Return Values: GSL_EOVRFLW, GSL_EUNDRFLW
+@end deftypefun
diff --git a/gsl-1.9/doc/specfunc-ellint.texi b/gsl-1.9/doc/specfunc-ellint.texi
new file mode 100644
index 0000000..601f9de
--- /dev/null
+++ b/gsl-1.9/doc/specfunc-ellint.texi
@@ -0,0 +1,198 @@
+@cindex elliptic integrals
+
+The functions described in this section are declared in the header
+file @file{gsl_sf_ellint.h}. Further information about the elliptic
+integrals can be found in Abramowitz & Stegun, Chapter 17.
+
+@menu
+* Definition of Legendre Forms::
+* Definition of Carlson Forms::
+* Legendre Form of Complete Elliptic Integrals::
+* Legendre Form of Incomplete Elliptic Integrals::
+* Carlson Forms::
+@end menu
+
+@node Definition of Legendre Forms
+@subsection Definition of Legendre Forms
+@cindex Legendre forms of elliptic integrals
+The Legendre forms of elliptic integrals @math{F(\phi,k)},
+@math{E(\phi,k)} and @math{\Pi(\phi,k,n)} are defined by,
+@tex
+\beforedisplay
+$$
+\eqalign{
+F(\phi,k) &= \int_0^\phi dt {1 \over \sqrt{(1 - k^2 \sin^2(t))}}\cr
+E(\phi,k) &= \int_0^\phi dt \sqrt{(1 - k^2 \sin^2(t))}\cr
+\Pi(\phi,k,n) &= \int_0^\phi dt {1 \over (1 + n \sin^2(t)) \sqrt{1 - k^2 \sin^2(t)}}
+}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+ F(\phi,k) = \int_0^\phi dt 1/\sqrt((1 - k^2 \sin^2(t)))
+
+ E(\phi,k) = \int_0^\phi dt \sqrt((1 - k^2 \sin^2(t)))
+
+Pi(\phi,k,n) = \int_0^\phi dt 1/((1 + n \sin^2(t))\sqrt(1 - k^2 \sin^2(t)))
+@end example
+
+@end ifinfo
+@noindent
+The complete Legendre forms are denoted by @math{K(k) = F(\pi/2, k)} and
+@math{E(k) = E(\pi/2, k)}.
+
+The notation used here is based on Carlson, @cite{Numerische
+Mathematik} 33 (1979) 1 and differs slightly from that used by
+Abramowitz & Stegun, where the functions are given in terms of the
+parameter @math{m = k^2} and @math{n} is replaced by @math{-n}.
+
+@node Definition of Carlson Forms
+@subsection Definition of Carlson Forms
+@cindex Carlson forms of Elliptic integrals
+The Carlson symmetric forms of elliptical integrals @math{RC(x,y)},
+@math{RD(x,y,z)}, @math{RF(x,y,z)} and @math{RJ(x,y,z,p)} are defined
+by,
+@tex
+\beforedisplay
+$$
+\eqalign{
+RC(x,y) &= 1/2 \int_0^\infty dt (t+x)^{-1/2} (t+y)^{-1}\cr
+RD(x,y,z) &= 3/2 \int_0^\infty dt (t+x)^{-1/2} (t+y)^{-1/2} (t+z)^{-3/2}\cr
+RF(x,y,z) &= 1/2 \int_0^\infty dt (t+x)^{-1/2} (t+y)^{-1/2} (t+z)^{-1/2}\cr
+RJ(x,y,z,p) &= 3/2 \int_0^\infty dt (t+x)^{-1/2} (t+y)^{-1/2} (t+z)^{-1/2} (t+p)^{-1}
+}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+ RC(x,y) = 1/2 \int_0^\infty dt (t+x)^(-1/2) (t+y)^(-1)
+
+ RD(x,y,z) = 3/2 \int_0^\infty dt (t+x)^(-1/2) (t+y)^(-1/2) (t+z)^(-3/2)
+
+ RF(x,y,z) = 1/2 \int_0^\infty dt (t+x)^(-1/2) (t+y)^(-1/2) (t+z)^(-1/2)
+
+RJ(x,y,z,p) = 3/2 \int_0^\infty dt
+ (t+x)^(-1/2) (t+y)^(-1/2) (t+z)^(-1/2) (t+p)^(-1)
+@end example
+@end ifinfo
+
+@node Legendre Form of Complete Elliptic Integrals
+@subsection Legendre Form of Complete Elliptic Integrals
+
+@deftypefun double gsl_sf_ellint_Kcomp (double @var{k}, gsl_mode_t @var{mode})
+@deftypefunx int gsl_sf_ellint_Kcomp_e (double @var{k}, gsl_mode_t @var{mode}, gsl_sf_result * @var{result})
+These routines compute the complete elliptic integral @math{K(k)} to
+the accuracy specified by the mode variable @var{mode}.
+Note that Abramowitz & Stegun define this function in terms of the
+parameter @math{m = k^2}.
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+@deftypefun double gsl_sf_ellint_Ecomp (double @var{k}, gsl_mode_t @var{mode})
+@deftypefunx int gsl_sf_ellint_Ecomp_e (double @var{k}, gsl_mode_t @var{mode}, gsl_sf_result * @var{result})
+These routines compute the complete elliptic integral @math{E(k)} to the
+accuracy specified by the mode variable @var{mode}.
+Note that Abramowitz & Stegun define this function in terms of the
+parameter @math{m = k^2}.
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+@deftypefun double gsl_sf_ellint_Pcomp (double @var{k}, double @var{n}, gsl_mode_t @var{mode})
+@deftypefunx int gsl_sf_ellint_Pcomp_e (double @var{k}, double @var{n}, gsl_mode_t @var{mode}, gsl_sf_result * @var{result})
+These routines compute the complete elliptic integral @math{\Pi(k,n)} to the
+accuracy specified by the mode variable @var{mode}.
+Note that Abramowitz & Stegun define this function in terms of the
+parameters @math{m = k^2} and @math{\sin^2(\alpha) = k^2}, with the
+change of sign @math{n \to -n}.
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+@node Legendre Form of Incomplete Elliptic Integrals
+@subsection Legendre Form of Incomplete Elliptic Integrals
+
+@deftypefun double gsl_sf_ellint_F (double @var{phi}, double @var{k}, gsl_mode_t @var{mode})
+@deftypefunx int gsl_sf_ellint_F_e (double @var{phi}, double @var{k}, gsl_mode_t @var{mode}, gsl_sf_result * @var{result})
+These routines compute the incomplete elliptic integral @math{F(\phi,k)}
+to the accuracy specified by the mode variable @var{mode}.
+Note that Abramowitz & Stegun define this function in terms of the
+parameter @math{m = k^2}.
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+@deftypefun double gsl_sf_ellint_E (double @var{phi}, double @var{k}, gsl_mode_t @var{mode})
+@deftypefunx int gsl_sf_ellint_E_e (double @var{phi}, double @var{k}, gsl_mode_t @var{mode}, gsl_sf_result * @var{result})
+These routines compute the incomplete elliptic integral @math{E(\phi,k)}
+to the accuracy specified by the mode variable @var{mode}.
+Note that Abramowitz & Stegun define this function in terms of the
+parameter @math{m = k^2}.
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+@deftypefun double gsl_sf_ellint_P (double @var{phi}, double @var{k}, double @var{n}, gsl_mode_t @var{mode})
+@deftypefunx int gsl_sf_ellint_P_e (double @var{phi}, double @var{k}, double @var{n}, gsl_mode_t @var{mode}, gsl_sf_result * @var{result})
+These routines compute the incomplete elliptic integral @math{\Pi(\phi,k,n)}
+to the accuracy specified by the mode variable @var{mode}.
+Note that Abramowitz & Stegun define this function in terms of the
+parameters @math{m = k^2} and @math{\sin^2(\alpha) = k^2}, with the
+change of sign @math{n \to -n}.
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+@deftypefun double gsl_sf_ellint_D (double @var{phi}, double @var{k}, double @var{n}, gsl_mode_t @var{mode})
+@deftypefunx int gsl_sf_ellint_D_e (double @var{phi}, double @var{k}, double @var{n}, gsl_mode_t @var{mode}, gsl_sf_result * @var{result})
+These functions compute the incomplete elliptic integral
+@math{D(\phi,k)} which is defined through the Carlson form @math{RD(x,y,z)}
+by the following relation,
+@tex
+\beforedisplay
+$$
+D(\phi,k,n) = {1 \over 3} (\sin \phi)^3 RD (1-\sin^2(\phi), 1-k^2 \sin^2(\phi), 1).
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+D(\phi,k,n) = (1/3)(\sin(\phi))^3 RD (1-\sin^2(\phi), 1-k^2 \sin^2(\phi), 1).
+@end example
+@end ifinfo
+The argument @var{n} is not used and will be removed in a future release.
+
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+
+@node Carlson Forms
+@subsection Carlson Forms
+
+@deftypefun double gsl_sf_ellint_RC (double @var{x}, double @var{y}, gsl_mode_t @var{mode})
+@deftypefunx int gsl_sf_ellint_RC_e (double @var{x}, double @var{y}, gsl_mode_t @var{mode}, gsl_sf_result * @var{result})
+These routines compute the incomplete elliptic integral @math{RC(x,y)}
+to the accuracy specified by the mode variable @var{mode}.
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+@deftypefun double gsl_sf_ellint_RD (double @var{x}, double @var{y}, double @var{z}, gsl_mode_t @var{mode})
+@deftypefunx int gsl_sf_ellint_RD_e (double @var{x}, double @var{y}, double @var{z}, gsl_mode_t @var{mode}, gsl_sf_result * @var{result})
+These routines compute the incomplete elliptic integral @math{RD(x,y,z)}
+to the accuracy specified by the mode variable @var{mode}.
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+@deftypefun double gsl_sf_ellint_RF (double @var{x}, double @var{y}, double @var{z}, gsl_mode_t @var{mode})
+@deftypefunx int gsl_sf_ellint_RF_e (double @var{x}, double @var{y}, double @var{z}, gsl_mode_t @var{mode}, gsl_sf_result * @var{result})
+These routines compute the incomplete elliptic integral @math{RF(x,y,z)}
+to the accuracy specified by the mode variable @var{mode}.
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+@deftypefun double gsl_sf_ellint_RJ (double @var{x}, double @var{y}, double @var{z}, double @var{p}, gsl_mode_t @var{mode})
+@deftypefunx int gsl_sf_ellint_RJ_e (double @var{x}, double @var{y}, double @var{z}, double @var{p}, gsl_mode_t @var{mode}, gsl_sf_result * @var{result})
+These routines compute the incomplete elliptic integral @math{RJ(x,y,z,p)}
+to the accuracy specified by the mode variable @var{mode}.
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
diff --git a/gsl-1.9/doc/specfunc-elljac.texi b/gsl-1.9/doc/specfunc-elljac.texi
new file mode 100644
index 0000000..dead60f
--- /dev/null
+++ b/gsl-1.9/doc/specfunc-elljac.texi
@@ -0,0 +1,13 @@
+@cindex Jacobi elliptic functions
+@cindex elliptic functions (Jacobi)
+
+The Jacobian Elliptic functions are defined in Abramowitz & Stegun,
+Chapter 16. The functions are declared in the header file
+@file{gsl_sf_elljac.h}.
+
+@deftypefun int gsl_sf_elljac_e (double @var{u}, double @var{m}, double * @var{sn}, double * @var{cn}, double * @var{dn})
+This function computes the Jacobian elliptic functions @math{sn(u|m)},
+@math{cn(u|m)}, @math{dn(u|m)} by descending Landen
+transformations.
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
diff --git a/gsl-1.9/doc/specfunc-erf.texi b/gsl-1.9/doc/specfunc-erf.texi
new file mode 100644
index 0000000..6b28cde
--- /dev/null
+++ b/gsl-1.9/doc/specfunc-erf.texi
@@ -0,0 +1,99 @@
+@cindex error function
+@cindex erf(x)
+@cindex erfc(x)
+
+The error function is described in Abramowitz & Stegun, Chapter 7. The
+functions in this section are declared in the header file
+@file{gsl_sf_erf.h}.
+
+@menu
+* Error Function::
+* Complementary Error Function::
+* Log Complementary Error Function::
+* Probability functions::
+@end menu
+
+@node Error Function
+@subsection Error Function
+
+@deftypefun double gsl_sf_erf (double @var{x})
+@deftypefunx int gsl_sf_erf_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the error function @c{$\erf(x)$}
+@math{erf(x)}, where
+@c{$\erf(x) = (2/\sqrt{\pi}) \int_0^x dt \exp(-t^2)$}
+@math{erf(x) = (2/\sqrt(\pi)) \int_0^x dt \exp(-t^2)}.
+@comment Exceptional Return Values: none
+@end deftypefun
+
+@node Complementary Error Function
+@subsection Complementary Error Function
+
+@deftypefun double gsl_sf_erfc (double @var{x})
+@deftypefunx int gsl_sf_erfc_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the complementary error function
+@c{$\erfc(x) = 1 - \erf(x) = (2/\sqrt{\pi}) \int_x^\infty \exp(-t^2)$}
+@math{erfc(x) = 1 - erf(x) = (2/\sqrt(\pi)) \int_x^\infty \exp(-t^2)}.
+@comment Exceptional Return Values: none
+@end deftypefun
+
+
+@node Log Complementary Error Function
+@subsection Log Complementary Error Function
+
+@deftypefun double gsl_sf_log_erfc (double @var{x})
+@deftypefunx int gsl_sf_log_erfc_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the logarithm of the complementary error function
+@math{\log(\erfc(x))}.
+@comment Exceptional Return Values: none
+@end deftypefun
+
+
+@node Probability functions
+@subsection Probability functions
+
+The probability functions for the Normal or Gaussian distribution are
+described in Abramowitz & Stegun, Section 26.2.
+
+@deftypefun double gsl_sf_erf_Z (double @var{x})
+@deftypefunx int gsl_sf_erf_Z_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the Gaussian probability density function
+@c{$Z(x) = (1/\sqrt{2\pi}) \exp(-x^2/2)$}
+@math{Z(x) = (1/\sqrt@{2\pi@}) \exp(-x^2/2)}.
+@end deftypefun
+
+@deftypefun double gsl_sf_erf_Q (double @var{x})
+@deftypefunx int gsl_sf_erf_Q_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the upper tail of the Gaussian probability
+function
+@c{$Q(x) = (1/\sqrt{2\pi}) \int_x^\infty dt \exp(-t^2/2)$}
+@math{Q(x) = (1/\sqrt@{2\pi@}) \int_x^\infty dt \exp(-t^2/2)}.
+@comment Exceptional Return Values: none
+@end deftypefun
+
+@cindex hazard function, normal distribution
+@cindex Mill's ratio, inverse
+The @dfn{hazard function} for the normal distribution,
+also known as the inverse Mill's ratio, is defined as,
+@tex
+\beforedisplay
+$$
+h(x) = {Z(x)\over Q(x)} = \sqrt{2 \over \pi} {\exp(-x^2 / 2) \over \erfc(x/\sqrt 2)}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+h(x) = Z(x)/Q(x) = \sqrt@{2/\pi@} \exp(-x^2 / 2) / \erfc(x/\sqrt 2)
+@end example
+
+@end ifinfo
+@noindent
+It decreases rapidly as @math{x} approaches @math{-\infty} and asymptotes
+to @math{h(x) \sim x} as @math{x} approaches @math{+\infty}.
+
+@deftypefun double gsl_sf_hazard (double @var{x})
+@deftypefunx int gsl_sf_hazard_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the hazard function for the normal distribution.
+@comment Exceptional Return Values: GSL_EUNDRFLW
+@end deftypefun
diff --git a/gsl-1.9/doc/specfunc-exp.texi b/gsl-1.9/doc/specfunc-exp.texi
new file mode 100644
index 0000000..cbdf5ca
--- /dev/null
+++ b/gsl-1.9/doc/specfunc-exp.texi
@@ -0,0 +1,135 @@
+@cindex exponential function
+@cindex exp
+
+The functions described in this section are declared in the header file
+@file{gsl_sf_exp.h}.
+
+@menu
+* Exponential Function::
+* Relative Exponential Functions::
+* Exponentiation With Error Estimate::
+@end menu
+
+@node Exponential Function
+@subsection Exponential Function
+
+@deftypefun double gsl_sf_exp (double @var{x})
+@deftypefunx int gsl_sf_exp_e (double @var{x}, gsl_sf_result * @var{result})
+These routines provide an exponential function @math{\exp(x)} using GSL
+semantics and error checking.
+@comment Exceptional Return Values: GSL_EOVRFLW, GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun int gsl_sf_exp_e10_e (double @var{x}, gsl_sf_result_e10 * @var{result})
+This function computes the exponential @math{\exp(x)} using the
+@code{gsl_sf_result_e10} type to return a result with extended range.
+This function may be useful if the value of @math{\exp(x)} would
+overflow the numeric range of @code{double}.
+@comment Exceptional Return Values: GSL_EOVRFLW, GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_exp_mult (double @var{x}, double @var{y})
+@deftypefunx int gsl_sf_exp_mult_e (double @var{x}, double @var{y}, gsl_sf_result * @var{result})
+These routines exponentiate @var{x} and multiply by the factor @var{y}
+to return the product @math{y \exp(x)}.
+@comment Exceptional Return Values: GSL_EOVRFLW, GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun int gsl_sf_exp_mult_e10_e (const double @var{x}, const double @var{y}, gsl_sf_result_e10 * @var{result})
+This function computes the product @math{y \exp(x)} using the
+@code{gsl_sf_result_e10} type to return a result with extended numeric
+range.
+@comment Exceptional Return Values: GSL_EOVRFLW, GSL_EUNDRFLW
+@end deftypefun
+
+
+
+@node Relative Exponential Functions
+@subsection Relative Exponential Functions
+
+@deftypefun double gsl_sf_expm1 (double @var{x})
+@deftypefunx int gsl_sf_expm1_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the quantity @math{\exp(x)-1} using an algorithm
+that is accurate for small @math{x}.
+@comment Exceptional Return Values: GSL_EOVRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_exprel (double @var{x})
+@deftypefunx int gsl_sf_exprel_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the quantity @math{(\exp(x)-1)/x} using an
+algorithm that is accurate for small @math{x}. For small @math{x} the
+algorithm is based on the expansion @math{(\exp(x)-1)/x = 1 + x/2 +
+x^2/(2*3) + x^3/(2*3*4) + \dots}.
+@comment Exceptional Return Values: GSL_EOVRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_exprel_2 (double @var{x})
+@deftypefunx int gsl_sf_exprel_2_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the quantity @math{2(\exp(x)-1-x)/x^2} using an
+algorithm that is accurate for small @math{x}. For small @math{x} the
+algorithm is based on the expansion @math{2(\exp(x)-1-x)/x^2 =
+1 + x/3 + x^2/(3*4) + x^3/(3*4*5) + \dots}.
+@comment Exceptional Return Values: GSL_EOVRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_exprel_n (int @var{n}, double @var{x})
+@deftypefunx int gsl_sf_exprel_n_e (int @var{n}, double @var{x}, gsl_sf_result * @var{result})
+These routines compute the @math{N}-relative exponential, which is the
+@var{n}-th generalization of the functions @code{gsl_sf_exprel} and
+@code{gsl_sf_exprel2}. The @math{N}-relative exponential is given by,
+@tex
+\beforedisplay
+$$
+\eqalign{
+\hbox{exprel}_N(x)
+ &= N!/x^N \left(\exp(x) - \sum_{k=0}^{N-1} x^k/k!\right)\cr
+ &= 1 + x/(N+1) + x^2/((N+1)(N+2)) + \dots\cr
+ &= {}_1F_1(1,1+N,x)\cr
+}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+exprel_N(x) = N!/x^N (\exp(x) - \sum_@{k=0@}^@{N-1@} x^k/k!)
+ = 1 + x/(N+1) + x^2/((N+1)(N+2)) + ...
+ = 1F1 (1,1+N,x)
+@end example
+@end ifinfo
+@comment Exceptional Return Values:
+@end deftypefun
+
+
+
+@node Exponentiation With Error Estimate
+@subsection Exponentiation With Error Estimate
+
+
+@deftypefun int gsl_sf_exp_err_e (double @var{x}, double @var{dx}, gsl_sf_result * @var{result})
+This function exponentiates @var{x} with an associated absolute error
+@var{dx}.
+@comment Exceptional Return Values:
+@end deftypefun
+
+@deftypefun int gsl_sf_exp_err_e10_e (double @var{x}, double @var{dx}, gsl_sf_result_e10 * @var{result})
+This function exponentiates a quantity @var{x} with an associated absolute
+error @var{dx} using the @code{gsl_sf_result_e10} type to return a result with
+extended range.
+@comment Exceptional Return Values:
+@end deftypefun
+
+@deftypefun int gsl_sf_exp_mult_err_e (double @var{x}, double @var{dx}, double @var{y}, double @var{dy}, gsl_sf_result * @var{result})
+This routine computes the product @math{y \exp(x)} for the quantities
+@var{x}, @var{y} with associated absolute errors @var{dx}, @var{dy}.
+@comment Exceptional Return Values: GSL_EOVRFLW, GSL_EUNDRFLW
+@end deftypefun
+
+
+@deftypefun int gsl_sf_exp_mult_err_e10_e (double @var{x}, double @var{dx}, double @var{y}, double @var{dy}, gsl_sf_result_e10 * @var{result})
+This routine computes the product @math{y \exp(x)} for the quantities
+@var{x}, @var{y} with associated absolute errors @var{dx}, @var{dy} using the
+@code{gsl_sf_result_e10} type to return a result with extended range.
+@comment Exceptional Return Values: GSL_EOVRFLW, GSL_EUNDRFLW
+@end deftypefun
+
diff --git a/gsl-1.9/doc/specfunc-expint.texi b/gsl-1.9/doc/specfunc-expint.texi
new file mode 100644
index 0000000..2d68ccb
--- /dev/null
+++ b/gsl-1.9/doc/specfunc-expint.texi
@@ -0,0 +1,155 @@
+@cindex exponential integrals
+@cindex integrals, exponential
+
+Information on the exponential integrals can be found in Abramowitz &
+Stegun, Chapter 5. These functions are declared in the header file
+@file{gsl_sf_expint.h}.
+
+@menu
+* Exponential Integral::
+* Ei(x)::
+* Hyperbolic Integrals::
+* Ei_3(x)::
+* Trigonometric Integrals::
+* Arctangent Integral::
+@end menu
+
+@node Exponential Integral
+@subsection Exponential Integral
+@cindex E1(x), E2(x), Ei(x)
+
+@deftypefun double gsl_sf_expint_E1 (double @var{x})
+@deftypefunx int gsl_sf_expint_E1_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the exponential integral @math{E_1(x)},
+@tex
+\beforedisplay
+$$
+E_1(x) := \Re \int_1^\infty dt \exp(-xt)/t.
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+E_1(x) := \Re \int_1^\infty dt \exp(-xt)/t.
+@end example
+
+@end ifinfo
+@noindent
+@comment Domain: x != 0.0
+@comment Exceptional Return Values: GSL_EDOM, GSL_EOVRFLW, GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_expint_E2 (double @var{x})
+@deftypefunx int gsl_sf_expint_E2_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the second-order exponential integral @math{E_2(x)},
+@tex
+\beforedisplay
+$$
+E_2(x) := \Re \int_1^\infty dt \exp(-xt)/t^2.
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+E_2(x) := \Re \int_1^\infty dt \exp(-xt)/t^2.
+@end example
+
+@end ifinfo
+@noindent
+@comment Domain: x != 0.0
+@comment Exceptional Return Values: GSL_EDOM, GSL_EOVRFLW, GSL_EUNDRFLW
+@end deftypefun
+
+@node Ei(x)
+@subsection Ei(x)
+
+@deftypefun double gsl_sf_expint_Ei (double @var{x})
+@deftypefunx int gsl_sf_expint_Ei_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the exponential integral @math{Ei(x)},
+@tex
+\beforedisplay
+$$
+Ei(x) := - PV\left(\int_{-x}^\infty dt \exp(-t)/t\right)
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+Ei(x) := - PV(\int_@{-x@}^\infty dt \exp(-t)/t)
+@end example
+
+@end ifinfo
+@noindent
+where @math{PV} denotes the principal value of the integral.
+@comment Domain: x != 0.0
+@comment Exceptional Return Values: GSL_EDOM, GSL_EOVRFLW, GSL_EUNDRFLW
+@end deftypefun
+
+
+@node Hyperbolic Integrals
+@subsection Hyperbolic Integrals
+@cindex hyperbolic integrals
+@cindex Shi(x)
+@cindex Chi(x)
+
+@deftypefun double gsl_sf_Shi (double @var{x})
+@deftypefunx int gsl_sf_Shi_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the integral @math{Shi(x) = \int_0^x dt \sinh(t)/t}.
+@comment Exceptional Return Values: GSL_EOVRFLW, GSL_EUNDRFLW
+@end deftypefun
+
+
+@deftypefun double gsl_sf_Chi (double @var{x})
+@deftypefunx int gsl_sf_Chi_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the integral @math{ Chi(x) := \Re[ \gamma_E + \log(x) + \int_0^x dt (\cosh[t]-1)/t] }, where @math{\gamma_E} is the Euler constant (available as the macro @code{M_EULER}).
+@comment Domain: x != 0.0
+@comment Exceptional Return Values: GSL_EDOM, GSL_EOVRFLW, GSL_EUNDRFLW
+@end deftypefun
+
+
+@node Ei_3(x)
+@subsection Ei_3(x)
+
+@deftypefun double gsl_sf_expint_3 (double @var{x})
+@deftypefunx int gsl_sf_expint_3_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the third-order exponential integral
+@math{Ei_3(x) = \int_0^xdt \exp(-t^3)} for @c{$x \ge 0$}
+@math{x >= 0}.
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+@node Trigonometric Integrals
+@subsection Trigonometric Integrals
+@cindex trigonometric integrals
+@cindex Si(x)
+@cindex Ci(x)
+@deftypefun double gsl_sf_Si (const double @var{x})
+@deftypefunx int gsl_sf_Si_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the Sine integral
+@math{Si(x) = \int_0^x dt \sin(t)/t}.
+@comment Exceptional Return Values: none
+@end deftypefun
+
+
+@deftypefun double gsl_sf_Ci (const double @var{x})
+@deftypefunx int gsl_sf_Ci_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the Cosine integral @math{Ci(x) = -\int_x^\infty dt
+\cos(t)/t} for @math{x > 0}.
+@comment Domain: x > 0.0
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+
+@node Arctangent Integral
+@subsection Arctangent Integral
+@cindex arctangent integral
+@deftypefun double gsl_sf_atanint (double @var{x})
+@deftypefunx int gsl_sf_atanint_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the Arctangent integral, which is defined as @math{AtanInt(x) = \int_0^x dt \arctan(t)/t}.
+@comment Domain:
+@comment Exceptional Return Values:
+@end deftypefun
+
diff --git a/gsl-1.9/doc/specfunc-fermi-dirac.texi b/gsl-1.9/doc/specfunc-fermi-dirac.texi
new file mode 100644
index 0000000..f9314be
--- /dev/null
+++ b/gsl-1.9/doc/specfunc-fermi-dirac.texi
@@ -0,0 +1,122 @@
+@cindex Fermi-Dirac function
+
+The functions described in this section are declared in the header file
+@file{gsl_sf_fermi_dirac.h}.
+
+@menu
+* Complete Fermi-Dirac Integrals::
+* Incomplete Fermi-Dirac Integrals::
+@end menu
+
+@node Complete Fermi-Dirac Integrals
+@subsection Complete Fermi-Dirac Integrals
+@cindex complete Fermi-Dirac integrals
+@cindex Fj(x), Fermi-Dirac integral
+The complete Fermi-Dirac integral @math{F_j(x)} is given by,
+@tex
+\beforedisplay
+$$
+F_j(x) := {1\over\Gamma(j+1)} \int_0^\infty dt {t^j \over (\exp(t-x) + 1)}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+F_j(x) := (1/r\Gamma(j+1)) \int_0^\infty dt (t^j / (\exp(t-x) + 1))
+@end example
+@end ifinfo
+
+@deftypefun double gsl_sf_fermi_dirac_m1 (double @var{x})
+@deftypefunx int gsl_sf_fermi_dirac_m1_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the complete Fermi-Dirac integral with an index of @math{-1}.
+This integral is given by
+@c{$F_{-1}(x) = e^x / (1 + e^x)$}
+@math{F_@{-1@}(x) = e^x / (1 + e^x)}.
+@comment Exceptional Return Values: GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_fermi_dirac_0 (double @var{x})
+@deftypefunx int gsl_sf_fermi_dirac_0_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the complete Fermi-Dirac integral with an index of @math{0}.
+This integral is given by @math{F_0(x) = \ln(1 + e^x)}.
+@comment Exceptional Return Values: GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_fermi_dirac_1 (double @var{x})
+@deftypefunx int gsl_sf_fermi_dirac_1_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the complete Fermi-Dirac integral with an index of @math{1},
+@math{F_1(x) = \int_0^\infty dt (t /(\exp(t-x)+1))}.
+@comment Exceptional Return Values: GSL_EUNDRFLW, GSL_EOVRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_fermi_dirac_2 (double @var{x})
+@deftypefunx int gsl_sf_fermi_dirac_2_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the complete Fermi-Dirac integral with an index
+of @math{2},
+@math{F_2(x) = (1/2) \int_0^\infty dt (t^2 /(\exp(t-x)+1))}.
+@comment Exceptional Return Values: GSL_EUNDRFLW, GSL_EOVRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_fermi_dirac_int (int @var{j}, double @var{x})
+@deftypefunx int gsl_sf_fermi_dirac_int_e (int @var{j}, double @var{x}, gsl_sf_result * @var{result})
+These routines compute the complete Fermi-Dirac integral with an integer
+index of @math{j},
+@math{F_j(x) = (1/\Gamma(j+1)) \int_0^\infty dt (t^j /(\exp(t-x)+1))}.
+@comment Complete integral F_j(x) for integer j
+@comment Exceptional Return Values: GSL_EUNDRFLW, GSL_EOVRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_fermi_dirac_mhalf (double @var{x})
+@deftypefunx int gsl_sf_fermi_dirac_mhalf_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the complete Fermi-Dirac integral
+@c{$F_{-1/2}(x)$}
+@math{F_@{-1/2@}(x)}.
+@comment Exceptional Return Values: GSL_EUNDRFLW, GSL_EOVRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_fermi_dirac_half (double @var{x})
+@deftypefunx int gsl_sf_fermi_dirac_half_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the complete Fermi-Dirac integral
+@c{$F_{1/2}(x)$}
+@math{F_@{1/2@}(x)}.
+@comment Exceptional Return Values: GSL_EUNDRFLW, GSL_EOVRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_fermi_dirac_3half (double @var{x})
+@deftypefunx int gsl_sf_fermi_dirac_3half_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the complete Fermi-Dirac integral
+@c{$F_{3/2}(x)$}
+@math{F_@{3/2@}(x)}.
+@comment Exceptional Return Values: GSL_EUNDRFLW, GSL_EOVRFLW
+@end deftypefun
+
+
+@node Incomplete Fermi-Dirac Integrals
+@subsection Incomplete Fermi-Dirac Integrals
+@cindex incomplete Fermi-Dirac integral
+@cindex Fj(x,b), incomplete Fermi-Dirac integral
+The incomplete Fermi-Dirac integral @math{F_j(x,b)} is given by,
+@tex
+\beforedisplay
+$$
+F_j(x,b) := {1\over\Gamma(j+1)} \int_b^\infty dt {t^j \over (\exp(t-x) + 1)}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+F_j(x,b) := (1/\Gamma(j+1)) \int_b^\infty dt (t^j / (\Exp(t-x) + 1))
+@end example
+@end ifinfo
+
+@deftypefun double gsl_sf_fermi_dirac_inc_0 (double @var{x}, double @var{b})
+@deftypefunx int gsl_sf_fermi_dirac_inc_0_e (double @var{x}, double @var{b}, gsl_sf_result * @var{result})
+These routines compute the incomplete Fermi-Dirac integral with an index
+of zero,
+@c{$F_0(x,b) = \ln(1 + e^{b-x}) - (b-x)$}
+@math{F_0(x,b) = \ln(1 + e^@{b-x@}) - (b-x)}.
+@comment Exceptional Return Values: GSL_EUNDRFLW, GSL_EDOM
+@end deftypefun
+
diff --git a/gsl-1.9/doc/specfunc-gamma.texi b/gsl-1.9/doc/specfunc-gamma.texi
new file mode 100644
index 0000000..f15e7ef
--- /dev/null
+++ b/gsl-1.9/doc/specfunc-gamma.texi
@@ -0,0 +1,314 @@
+The functions described in this section are declared
+in the header file @file{gsl_sf_gamma.h}.
+
+@menu
+* Gamma Functions::
+* Factorials::
+* Pochhammer Symbol::
+* Incomplete Gamma Functions::
+* Beta Functions::
+* Incomplete Beta Function::
+@end menu
+
+@node Gamma Functions
+@subsection Gamma Functions
+@cindex gamma functions
+
+The Gamma function is defined by the following integral,
+@tex
+\beforedisplay
+$$
+\Gamma(x) = \int_0^{\infty} dt \, t^{x-1} \exp(-t)
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+\Gamma(x) = \int_0^\infty dt t^@{x-1@} \exp(-t)
+@end example
+
+@end ifinfo
+@noindent
+It is related to the factorial function by @math{\Gamma(n)=(n-1)!}
+for positive integer @math{n}. Further information on the Gamma function
+can be found in Abramowitz & Stegun, Chapter 6. The functions
+described in this section are declared in the header file
+@file{gsl_sf_gamma.h}.
+
+@deftypefun double gsl_sf_gamma (double @var{x})
+@deftypefunx int gsl_sf_gamma_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the Gamma function @math{\Gamma(x)}, subject to @math{x}
+not being a negative integer or zero. The function is computed using the real
+Lanczos method. The maximum value of @math{x} such that @math{\Gamma(x)} is not
+considered an overflow is given by the macro @code{GSL_SF_GAMMA_XMAX}
+and is 171.0.
+@comment exceptions: GSL_EDOM, GSL_EOVRFLW, GSL_EROUND
+@end deftypefun
+
+@deftypefun double gsl_sf_lngamma (double @var{x})
+@deftypefunx int gsl_sf_lngamma_e (double @var{x}, gsl_sf_result * @var{result})
+@cindex logarithm of Gamma function
+These routines compute the logarithm of the Gamma function,
+@math{\log(\Gamma(x))}, subject to @math{x} not being a negative
+integer or zero. For @math{x<0} the real part of @math{\log(\Gamma(x))} is
+returned, which is equivalent to @math{\log(|\Gamma(x)|)}. The function
+is computed using the real Lanczos method.
+@comment exceptions: GSL_EDOM, GSL_EROUND
+@end deftypefun
+
+@deftypefun int gsl_sf_lngamma_sgn_e (double @var{x}, gsl_sf_result * @var{result_lg}, double * @var{sgn})
+This routine computes the sign of the gamma function and the logarithm of
+its magnitude, subject to @math{x} not being a negative integer or zero. The
+function is computed using the real Lanczos method. The value of the
+gamma function can be reconstructed using the relation @math{\Gamma(x) =
+sgn * \exp(resultlg)}.
+@comment exceptions: GSL_EDOM, GSL_EROUND
+@end deftypefun
+
+@deftypefun double gsl_sf_gammastar (double @var{x})
+@deftypefunx int gsl_sf_gammastar_e (double @var{x}, gsl_sf_result * @var{result})
+@cindex Regulated Gamma function
+These routines compute the regulated Gamma Function @math{\Gamma^*(x)}
+for @math{x > 0}. The regulated gamma function is given by,
+@tex
+\beforedisplay
+$$
+\eqalign{
+\Gamma^*(x) &= \Gamma(x)/(\sqrt{2\pi} x^{(x-1/2)} \exp(-x))\cr
+ &= \left(1 + {1 \over 12x} + ...\right) \quad\hbox{for~} x\to \infty\cr
+}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+\Gamma^*(x) = \Gamma(x)/(\sqrt@{2\pi@} x^@{(x-1/2)@} \exp(-x))
+ = (1 + (1/12x) + ...) for x \to \infty
+@end example
+@end ifinfo
+and is a useful suggestion of Temme.
+@comment exceptions: GSL_EDOM
+@end deftypefun
+
+@deftypefun double gsl_sf_gammainv (double @var{x})
+@deftypefunx int gsl_sf_gammainv_e (double @var{x}, gsl_sf_result * @var{result})
+@cindex Reciprocal Gamma function
+These routines compute the reciprocal of the gamma function,
+@math{1/\Gamma(x)} using the real Lanczos method.
+@comment exceptions: GSL_EUNDRFLW, GSL_EROUND
+@end deftypefun
+
+@deftypefun int gsl_sf_lngamma_complex_e (double @var{zr}, double @var{zi}, gsl_sf_result * @var{lnr}, gsl_sf_result * @var{arg})
+@cindex Complex Gamma function
+This routine computes @math{\log(\Gamma(z))} for complex @math{z=z_r+i
+z_i} and @math{z} not a negative integer or zero, using the complex Lanczos
+method. The returned parameters are @math{lnr = \log|\Gamma(z)|} and
+@math{arg = \arg(\Gamma(z))} in @math{(-\pi,\pi]}. Note that the phase
+part (@var{arg}) is not well-determined when @math{|z|} is very large,
+due to inevitable roundoff in restricting to @math{(-\pi,\pi]}. This
+will result in a @code{GSL_ELOSS} error when it occurs. The absolute
+value part (@var{lnr}), however, never suffers from loss of precision.
+@comment exceptions: GSL_EDOM, GSL_ELOSS
+@end deftypefun
+
+@node Factorials
+@subsection Factorials
+@cindex factorial
+
+Although factorials can be computed from the Gamma function, using
+the relation @math{n! = \Gamma(n+1)} for non-negative integer @math{n},
+it is usually more efficient to call the functions in this section,
+particularly for small values of @math{n}, whose factorial values are
+maintained in hardcoded tables.
+
+@deftypefun double gsl_sf_fact (unsigned int @var{n})
+@deftypefunx int gsl_sf_fact_e (unsigned int @var{n}, gsl_sf_result * @var{result})
+@cindex factorial
+These routines compute the factorial @math{n!}. The factorial is
+related to the Gamma function by @math{n! = \Gamma(n+1)}.
+The maximum value of @math{n} such that @math{n!} is not
+considered an overflow is given by the macro @code{GSL_SF_FACT_NMAX}
+and is 170.
+@comment exceptions: GSL_EDOM, GSL_OVRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_doublefact (unsigned int @var{n})
+@deftypefunx int gsl_sf_doublefact_e (unsigned int @var{n}, gsl_sf_result * @var{result})
+@cindex double factorial
+These routines compute the double factorial @math{n!! = n(n-2)(n-4) \dots}.
+The maximum value of @math{n} such that @math{n!!} is not
+considered an overflow is given by the macro @code{GSL_SF_DOUBLEFACT_NMAX}
+and is 297.
+@comment exceptions: GSL_EDOM, GSL_OVRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_lnfact (unsigned int @var{n})
+@deftypefunx int gsl_sf_lnfact_e (unsigned int @var{n}, gsl_sf_result * @var{result})
+@cindex logarithm of factorial
+These routines compute the logarithm of the factorial of @var{n},
+@math{\log(n!)}. The algorithm is faster than computing
+@math{\ln(\Gamma(n+1))} via @code{gsl_sf_lngamma} for @math{n < 170},
+but defers for larger @var{n}.
+@comment exceptions: none
+@end deftypefun
+
+@deftypefun double gsl_sf_lndoublefact (unsigned int @var{n})
+@deftypefunx int gsl_sf_lndoublefact_e (unsigned int @var{n}, gsl_sf_result * @var{result})
+@cindex logarithm of double factorial
+These routines compute the logarithm of the double factorial of @var{n},
+@math{\log(n!!)}.
+@comment exceptions: none
+@end deftypefun
+
+@deftypefun double gsl_sf_choose (unsigned int @var{n}, unsigned int @var{m})
+@deftypefunx int gsl_sf_choose_e (unsigned int @var{n}, unsigned int @var{m}, gsl_sf_result * @var{result})
+@cindex combinatorial factor C(m,n)
+These routines compute the combinatorial factor @code{n choose m}
+@math{= n!/(m!(n-m)!)}
+@comment exceptions: GSL_EDOM, GSL_EOVRFLW
+@end deftypefun
+
+
+@deftypefun double gsl_sf_lnchoose (unsigned int @var{n}, unsigned int @var{m})
+@deftypefunx int gsl_sf_lnchoose_e (unsigned int @var{n}, unsigned int @var{m}, gsl_sf_result * @var{result})
+@cindex logarithm of combinatorial factor C(m,n)
+These routines compute the logarithm of @code{n choose m}. This is
+equivalent to the sum @math{\log(n!) - \log(m!) - \log((n-m)!)}.
+@comment exceptions: GSL_EDOM
+@end deftypefun
+
+@deftypefun double gsl_sf_taylorcoeff (int @var{n}, double @var{x})
+@deftypefunx int gsl_sf_taylorcoeff_e (int @var{n}, double @var{x}, gsl_sf_result * @var{result})
+@cindex Taylor coefficients, computation of
+These routines compute the Taylor coefficient @math{x^n / n!} for
+@c{$x \ge 0$}
+@math{x >= 0},
+@c{$n \ge 0$}
+@math{n >= 0}.
+@comment exceptions: GSL_EDOM, GSL_EOVRFLW, GSL_EUNDRFLW
+@end deftypefun
+
+@node Pochhammer Symbol
+@subsection Pochhammer Symbol
+
+@deftypefun double gsl_sf_poch (double @var{a}, double @var{x})
+@deftypefunx int gsl_sf_poch_e (double @var{a}, double @var{x}, gsl_sf_result * @var{result})
+@cindex Pochhammer symbol
+@cindex Apell symbol, see Pochammer symbol
+These routines compute the Pochhammer symbol @math{(a)_x = \Gamma(a +
+x)/\Gamma(a)}, subject to @math{a} and @math{a+x} not being negative
+integers or zero. The Pochhammer symbol is also known as the Apell symbol and
+sometimes written as @math{(a,x)}.
+@comment exceptions: GSL_EDOM, GSL_EOVRFLW
+@end deftypefun
+
+
+@deftypefun double gsl_sf_lnpoch (double @var{a}, double @var{x})
+@deftypefunx int gsl_sf_lnpoch_e (double @var{a}, double @var{x}, gsl_sf_result * @var{result})
+@cindex logarithm of Pochhammer symbol
+These routines compute the logarithm of the Pochhammer symbol,
+@math{\log((a)_x) = \log(\Gamma(a + x)/\Gamma(a))} for @math{a > 0},
+@math{a+x > 0}.
+@comment exceptions: GSL_EDOM
+@end deftypefun
+
+@deftypefun int gsl_sf_lnpoch_sgn_e (double @var{a}, double @var{x}, gsl_sf_result * @var{result}, double * @var{sgn})
+These routines compute the sign of the Pochhammer symbol and the
+logarithm of its magnitude. The computed parameters are @math{result =
+\log(|(a)_x|)} and @math{sgn = \sgn((a)_x)} where @math{(a)_x =
+\Gamma(a + x)/\Gamma(a)}, subject to @math{a}, @math{a+x} not being
+negative integers or zero.
+@comment exceptions: GSL_EDOM
+@end deftypefun
+
+@deftypefun double gsl_sf_pochrel (double @var{a}, double @var{x})
+@deftypefunx int gsl_sf_pochrel_e (double @var{a}, double @var{x}, gsl_sf_result * @var{result})
+@cindex relative Pochhammer symbol
+These routines compute the relative Pochhammer symbol @math{((a)_x -
+1)/x} where @math{(a)_x = \Gamma(a + x)/\Gamma(a)}.
+@comment exceptions: GSL_EDOM
+@end deftypefun
+
+
+@node Incomplete Gamma Functions
+@subsection Incomplete Gamma Functions
+
+@deftypefun double gsl_sf_gamma_inc (double @var{a}, double @var{x})
+@deftypefunx int gsl_sf_gamma_inc_e (double @var{a}, double @var{x}, gsl_sf_result * @var{result})
+@cindex non-normalized incomplete Gamma function
+@cindex unnormalized incomplete Gamma function
+These functions compute the unnormalized incomplete Gamma Function
+@c{$\Gamma(a,x) = \int_x^\infty dt\, t^{(a-1)} \exp(-t)$}
+@math{\Gamma(a,x) = \int_x^\infty dt t^@{a-1@} \exp(-t)}
+for @math{a} real and @c{$x \ge 0$}
+@math{x >= 0}.
+@comment exceptions: GSL_EDOM
+@end deftypefun
+
+@deftypefun double gsl_sf_gamma_inc_Q (double @var{a}, double @var{x})
+@deftypefunx int gsl_sf_gamma_inc_Q_e (double @var{a}, double @var{x}, gsl_sf_result * @var{result})
+@cindex incomplete Gamma function
+These routines compute the normalized incomplete Gamma Function
+@c{$Q(a,x) = 1/\Gamma(a) \int_x^\infty dt\, t^{(a-1)} \exp(-t)$}
+@math{Q(a,x) = 1/\Gamma(a) \int_x^\infty dt t^@{a-1@} \exp(-t)}
+for @math{a > 0}, @c{$x \ge 0$}
+@math{x >= 0}.
+@comment exceptions: GSL_EDOM
+@end deftypefun
+
+@deftypefun double gsl_sf_gamma_inc_P (double @var{a}, double @var{x})
+@deftypefunx int gsl_sf_gamma_inc_P_e (double @var{a}, double @var{x}, gsl_sf_result * @var{result})
+@cindex complementary incomplete Gamma function
+These routines compute the complementary normalized incomplete Gamma Function
+@c{$P(a,x) = 1 - Q(a,x) = 1/\Gamma(a) \int_0^x dt\, t^{(a-1)} \exp(-t)$}
+@math{P(a,x) = 1 - Q(a,x) = 1/\Gamma(a) \int_0^x dt t^@{a-1@} \exp(-t)}
+for @math{a > 0}, @c{$x \ge 0$}
+@math{x >= 0}.
+
+Note that Abramowitz & Stegun call @math{P(a,x)} the incomplete gamma
+function (section 6.5).
+@comment exceptions: GSL_EDOM
+@end deftypefun
+
+@node Beta Functions
+@subsection Beta Functions
+
+@deftypefun double gsl_sf_beta (double @var{a}, double @var{b})
+@deftypefunx int gsl_sf_beta_e (double @var{a}, double @var{b}, gsl_sf_result * @var{result})
+@cindex Beta function
+These routines compute the Beta Function, @math{B(a,b) =
+\Gamma(a)\Gamma(b)/\Gamma(a+b)} subject to @math{a} and @math{b} not
+being negative integers.
+@comment exceptions: GSL_EDOM, GSL_EOVRFLW, GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_lnbeta (double @var{a}, double @var{b})
+@deftypefunx int gsl_sf_lnbeta_e (double @var{a}, double @var{b}, gsl_sf_result * @var{result})
+@cindex logarithm of Beta function
+These routines compute the logarithm of the Beta Function, @math{\log(B(a,b))}
+subject to @math{a} and @math{b} not
+being negative integers.
+@comment exceptions: GSL_EDOM
+@end deftypefun
+
+@node Incomplete Beta Function
+@subsection Incomplete Beta Function
+
+@deftypefun double gsl_sf_beta_inc (double @var{a}, double @var{b}, double @var{x})
+@deftypefunx int gsl_sf_beta_inc_e (double @var{a}, double @var{b}, double @var{x}, gsl_sf_result * @var{result})
+@cindex incomplete Beta function, normalized
+@cindex normalized incomplete Beta function
+@cindex Beta function, incomplete normalized
+These routines compute the normalized incomplete Beta function
+@math{I_x(a,b)=B_x(a,b)/B(a,b)} where @c{$B_x(a,b) = \int_0^x t^{a-1} (1-t)^{b-1} dt$}
+@math{B_x(a,b) = \int_0^x t^@{a-1@} (1-t)^@{b-1@} dt}
+for @math{a > 0}, @math{b > 0}, and @c{$0 \le x \le 1$}
+@math{0 <= x <= 1}.
+@end deftypefun
+
+
+
+
+
diff --git a/gsl-1.9/doc/specfunc-gegenbauer.texi b/gsl-1.9/doc/specfunc-gegenbauer.texi
new file mode 100644
index 0000000..949c3dd
--- /dev/null
+++ b/gsl-1.9/doc/specfunc-gegenbauer.texi
@@ -0,0 +1,42 @@
+@cindex Gegenbauer functions
+
+The Gegenbauer polynomials are defined in Abramowitz & Stegun, Chapter
+22, where they are known as Ultraspherical polynomials. The functions
+described in this section are declared in the header file
+@file{gsl_sf_gegenbauer.h}.
+
+@deftypefun double gsl_sf_gegenpoly_1 (double @var{lambda}, double @var{x})
+@deftypefunx double gsl_sf_gegenpoly_2 (double @var{lambda}, double @var{x})
+@deftypefunx double gsl_sf_gegenpoly_3 (double @var{lambda}, double @var{x})
+@deftypefunx int gsl_sf_gegenpoly_1_e (double @var{lambda}, double @var{x}, gsl_sf_result * @var{result})
+@deftypefunx int gsl_sf_gegenpoly_2_e (double @var{lambda}, double @var{x}, gsl_sf_result * @var{result})
+@deftypefunx int gsl_sf_gegenpoly_3_e (double @var{lambda}, double @var{x}, gsl_sf_result * @var{result})
+These functions evaluate the Gegenbauer polynomials
+@c{$C^{(\lambda)}_n(x)$}
+@math{C^@{(\lambda)@}_n(x)} using explicit
+representations for @math{n =1, 2, 3}.
+@comment Exceptional Return Values: none
+@end deftypefun
+
+
+@deftypefun double gsl_sf_gegenpoly_n (int @var{n}, double @var{lambda}, double @var{x})
+@deftypefunx int gsl_sf_gegenpoly_n_e (int @var{n}, double @var{lambda}, double @var{x}, gsl_sf_result * @var{result})
+These functions evaluate the Gegenbauer polynomial @c{$C^{(\lambda)}_n(x)$}
+@math{C^@{(\lambda)@}_n(x)} for a specific value of @var{n},
+@var{lambda}, @var{x} subject to @math{\lambda > -1/2}, @c{$n \ge 0$}
+@math{n >= 0}.
+@comment Domain: lambda > -1/2, n >= 0
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+
+@deftypefun int gsl_sf_gegenpoly_array (int @var{nmax}, double @var{lambda}, double @var{x}, double @var{result_array}[])
+This function computes an array of Gegenbauer polynomials
+@c{$C^{(\lambda)}_n(x)$}
+@math{C^@{(\lambda)@}_n(x)} for @math{n = 0, 1, 2, \dots, nmax}, subject
+to @math{\lambda > -1/2}, @c{$nmax \ge 0$}
+@math{nmax >= 0}.
+@comment Conditions: n = 0, 1, 2, ... nmax
+@comment Domain: lambda > -1/2, nmax >= 0
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
diff --git a/gsl-1.9/doc/specfunc-hyperg.texi b/gsl-1.9/doc/specfunc-hyperg.texi
new file mode 100644
index 0000000..c67eb8c
--- /dev/null
+++ b/gsl-1.9/doc/specfunc-hyperg.texi
@@ -0,0 +1,108 @@
+@cindex hypergeometric functions
+@cindex confluent hypergeometric functions
+
+Hypergeometric functions are described in Abramowitz & Stegun, Chapters
+13 and 15. These functions are declared in the header file
+@file{gsl_sf_hyperg.h}.
+
+@deftypefun double gsl_sf_hyperg_0F1 (double @var{c}, double @var{x})
+@deftypefunx int gsl_sf_hyperg_0F1_e (double @var{c}, double @var{x}, gsl_sf_result * @var{result})
+These routines compute the hypergeometric function @c{${}_0F_1(c,x)$}
+@math{0F1(c,x)}.
+@comment It is related to Bessel functions
+@comment 0F1[c,x] =
+@comment Gamma[c] x^(1/2(1-c)) I_(c-1)(2 Sqrt[x])
+@comment Gamma[c] (-x)^(1/2(1-c)) J_(c-1)(2 Sqrt[-x])
+@comment exceptions: GSL_EOVRFLW, GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_hyperg_1F1_int (int @var{m}, int @var{n}, double @var{x})
+@deftypefunx int gsl_sf_hyperg_1F1_int_e (int @var{m}, int @var{n}, double @var{x}, gsl_sf_result * @var{result})
+These routines compute the confluent hypergeometric function
+@c{${}_1F_1(m,n,x) = M(m,n,x)$}
+@math{1F1(m,n,x) = M(m,n,x)} for integer parameters @var{m}, @var{n}.
+@comment exceptions:
+@end deftypefun
+
+@deftypefun double gsl_sf_hyperg_1F1 (double @var{a}, double @var{b}, double @var{x})
+@deftypefunx int gsl_sf_hyperg_1F1_e (double @var{a}, double @var{b}, double @var{x}, gsl_sf_result * @var{result})
+These routines compute the confluent hypergeometric function
+@c{${}_1F_1(a,b,x) = M(a,b,x)$}
+@math{1F1(a,b,x) = M(a,b,x)} for general parameters @var{a}, @var{b}.
+@comment exceptions:
+@end deftypefun
+
+@deftypefun double gsl_sf_hyperg_U_int (int @var{m}, int @var{n}, double @var{x})
+@deftypefunx int gsl_sf_hyperg_U_int_e (int @var{m}, int @var{n}, double @var{x}, gsl_sf_result * @var{result})
+These routines compute the confluent hypergeometric function
+@math{U(m,n,x)} for integer parameters @var{m}, @var{n}.
+@comment exceptions:
+@end deftypefun
+
+@deftypefun int gsl_sf_hyperg_U_int_e10_e (int @var{m}, int @var{n}, double @var{x}, gsl_sf_result_e10 * @var{result})
+This routine computes the confluent hypergeometric function
+@math{U(m,n,x)} for integer parameters @var{m}, @var{n} using the
+@code{gsl_sf_result_e10} type to return a result with extended range.
+@end deftypefun
+
+@deftypefun double gsl_sf_hyperg_U (double @var{a}, double @var{b}, double @var{x})
+@deftypefunx int gsl_sf_hyperg_U_e (double @var{a}, double @var{b}, double @var{x}, gsl_sf_result * @var{result})
+These routines compute the confluent hypergeometric function @math{U(a,b,x)}.
+@comment exceptions:
+@end deftypefun
+
+@deftypefun int gsl_sf_hyperg_U_e10_e (double @var{a}, double @var{b}, double @var{x}, gsl_sf_result_e10 * @var{result})
+This routine computes the confluent hypergeometric function
+@math{U(a,b,x)} using the @code{gsl_sf_result_e10} type to return a
+result with extended range.
+@comment exceptions:
+@end deftypefun
+
+@deftypefun double gsl_sf_hyperg_2F1 (double @var{a}, double @var{b}, double @var{c}, double @var{x})
+@deftypefunx int gsl_sf_hyperg_2F1_e (double @var{a}, double @var{b}, double @var{c}, double @var{x}, gsl_sf_result * @var{result})
+These routines compute the Gauss hypergeometric function
+@c{${}_2F_1(a,b,c,x)$}
+@math{2F1(a,b,c,x)} for @math{|x| < 1}.
+
+If the arguments @math{(a,b,c,x)} are too close to a singularity then
+the function can return the error code @code{GSL_EMAXITER} when the
+series approximation converges too slowly. This occurs in the region of
+@math{x=1}, @math{c - a - b = m} for integer m.
+@comment exceptions:
+@end deftypefun
+
+@deftypefun double gsl_sf_hyperg_2F1_conj (double @var{aR}, double @var{aI}, double @var{c}, double @var{x})
+@deftypefunx int gsl_sf_hyperg_2F1_conj_e (double @var{aR}, double @var{aI}, double @var{c}, double @var{x}, gsl_sf_result * @var{result})
+These routines compute the Gauss hypergeometric function
+@c{${}_2F_1(a_R + i a_I, aR - i aI, c, x)$}
+@math{2F1(a_R + i a_I, a_R - i a_I, c, x)} with complex parameters
+for @math{|x| < 1}.
+exceptions:
+@end deftypefun
+
+@deftypefun double gsl_sf_hyperg_2F1_renorm (double @var{a}, double @var{b}, double @var{c}, double @var{x})
+@deftypefunx int gsl_sf_hyperg_2F1_renorm_e (double @var{a}, double @var{b}, double @var{c}, double @var{x}, gsl_sf_result * @var{result})
+These routines compute the renormalized Gauss hypergeometric function
+@c{${}_2F_1(a,b,c,x) / \Gamma(c)$}
+@math{2F1(a,b,c,x) / \Gamma(c)} for @math{|x| < 1}.
+@comment exceptions:
+@end deftypefun
+
+@deftypefun double gsl_sf_hyperg_2F1_conj_renorm (double @var{aR}, double @var{aI}, double @var{c}, double @var{x})
+@deftypefunx int gsl_sf_hyperg_2F1_conj_renorm_e (double @var{aR}, double @var{aI}, double @var{c}, double @var{x}, gsl_sf_result * @var{result})
+These routines compute the renormalized Gauss hypergeometric function
+@c{${}_2F_1(a_R + i a_I, a_R - i a_I, c, x) / \Gamma(c)$}
+@math{2F1(a_R + i a_I, a_R - i a_I, c, x) / \Gamma(c)} for @math{|x| < 1}.
+@comment exceptions:
+@end deftypefun
+
+@deftypefun double gsl_sf_hyperg_2F0 (double @var{a}, double @var{b}, double @var{x})
+@deftypefunx int gsl_sf_hyperg_2F0_e (double @var{a}, double @var{b}, double @var{x}, gsl_sf_result * @var{result})
+These routines compute the hypergeometric function @c{${}_2F_0(a,b,x)$}
+@math{2F0(a,b,x)}. The series representation
+is a divergent hypergeometric series. However, for @math{x < 0} we
+have
+@c{${}_2F_0(a,b,x) = (-1/x)^a U(a,1+a-b,-1/x)$}
+@math{2F0(a,b,x) = (-1/x)^a U(a,1+a-b,-1/x)}
+@comment exceptions: GSL_EDOM
+@end deftypefun
diff --git a/gsl-1.9/doc/specfunc-laguerre.texi b/gsl-1.9/doc/specfunc-laguerre.texi
new file mode 100644
index 0000000..8672d59
--- /dev/null
+++ b/gsl-1.9/doc/specfunc-laguerre.texi
@@ -0,0 +1,40 @@
+@cindex Laguerre functions
+@cindex confluent hypergeometric function
+
+The generalized Laguerre polynomials are defined in terms of confluent
+hypergeometric functions as
+@c{$L^a_n(x) = ((a+1)_n / n!) {}_1F_1(-n,a+1,x)$}
+@math{L^a_n(x) = ((a+1)_n / n!) 1F1(-n,a+1,x)}, and are sometimes referred to as the
+associated Laguerre polynomials. They are related to the plain
+Laguerre polynomials @math{L_n(x)} by @math{L^0_n(x) = L_n(x)} and
+@c{$L^k_n(x) = (-1)^k (d^k/dx^k) L_{(n+k)}(x)$}
+@math{L^k_n(x) = (-1)^k (d^k/dx^k) L_(n+k)(x)}. For
+more information see Abramowitz & Stegun, Chapter 22.
+
+The functions described in this section are
+declared in the header file @file{gsl_sf_laguerre.h}.
+
+@deftypefun double gsl_sf_laguerre_1 (double @var{a}, double @var{x})
+@deftypefunx double gsl_sf_laguerre_2 (double @var{a}, double @var{x})
+@deftypefunx double gsl_sf_laguerre_3 (double @var{a}, double @var{x})
+@deftypefunx int gsl_sf_laguerre_1_e (double @var{a}, double @var{x}, gsl_sf_result * @var{result})
+@deftypefunx int gsl_sf_laguerre_2_e (double @var{a}, double @var{x}, gsl_sf_result * @var{result})
+@deftypefunx int gsl_sf_laguerre_3_e (double @var{a}, double @var{x}, gsl_sf_result * @var{result})
+These routines evaluate the generalized Laguerre polynomials
+@math{L^a_1(x)}, @math{L^a_2(x)}, @math{L^a_3(x)} using explicit
+representations.
+@comment Exceptional Return Values: none
+@end deftypefun
+
+
+@deftypefun double gsl_sf_laguerre_n (const int @var{n}, const double @var{a}, const double @var{x})
+@deftypefunx int gsl_sf_laguerre_n_e (int @var{n}, double @var{a}, double @var{x}, gsl_sf_result * @var{result})
+These routines evaluate the generalized Laguerre polynomials
+@math{L^a_n(x)} for @math{a > -1},
+@c{$n \ge 0$}
+@math{n >= 0}.
+
+@comment Domain: a > -1.0, n >= 0
+@comment Evaluate generalized Laguerre polynomials.
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
diff --git a/gsl-1.9/doc/specfunc-lambert.texi b/gsl-1.9/doc/specfunc-lambert.texi
new file mode 100644
index 0000000..c05d23d
--- /dev/null
+++ b/gsl-1.9/doc/specfunc-lambert.texi
@@ -0,0 +1,28 @@
+@cindex W function
+@cindex Lambert function
+
+Lambert's W functions, @math{W(x)}, are defined to be solutions
+of the equation @math{W(x) \exp(W(x)) = x}. This function has
+multiple branches for @math{x < 0}; however, it has only
+two real-valued branches. We define @math{W_0(x)} to be the
+principal branch, where @math{W > -1} for @math{x < 0}, and
+@c{$W_{-1}(x)$}
+@math{W_@{-1@}(x)} to be the other real branch, where
+@math{W < -1} for @math{x < 0}. The Lambert functions are
+declared in the header file @file{gsl_sf_lambert.h}.
+
+
+@deftypefun double gsl_sf_lambert_W0 (double @var{x})
+@deftypefunx int gsl_sf_lambert_W0_e (double @var{x}, gsl_sf_result * @var{result})
+These compute the principal branch of the Lambert W function, @math{W_0(x)}.
+@comment exceptions: GSL_EDOM, GSL_EMAXITER
+@end deftypefun
+
+@deftypefun double gsl_sf_lambert_Wm1 (double @var{x})
+@deftypefunx int gsl_sf_lambert_Wm1_e (double @var{x}, gsl_sf_result * @var{result})
+These compute the secondary real-valued branch of the Lambert W function,
+@c{$W_{-1}(x)$}
+@math{W_@{-1@}(x)}.
+@comment exceptions: GSL_EDOM, GSL_EMAXITER
+@end deftypefun
+
diff --git a/gsl-1.9/doc/specfunc-legendre.texi b/gsl-1.9/doc/specfunc-legendre.texi
new file mode 100644
index 0000000..4be1005
--- /dev/null
+++ b/gsl-1.9/doc/specfunc-legendre.texi
@@ -0,0 +1,272 @@
+@cindex Legendre functions
+@cindex spherical harmonics
+@cindex conical functions
+@cindex hyperbolic space
+
+The Legendre Functions and Legendre Polynomials are described in
+Abramowitz & Stegun, Chapter 8. These functions are declared in
+the header file @file{gsl_sf_legendre.h}.
+
+@menu
+* Legendre Polynomials::
+* Associated Legendre Polynomials and Spherical Harmonics::
+* Conical Functions::
+* Radial Functions for Hyperbolic Space::
+@end menu
+
+@node Legendre Polynomials
+@subsection Legendre Polynomials
+
+@deftypefun double gsl_sf_legendre_P1 (double @var{x})
+@deftypefunx double gsl_sf_legendre_P2 (double @var{x})
+@deftypefunx double gsl_sf_legendre_P3 (double @var{x})
+@deftypefunx int gsl_sf_legendre_P1_e (double @var{x}, gsl_sf_result * @var{result})
+@deftypefunx int gsl_sf_legendre_P2_e (double @var{x}, gsl_sf_result * @var{result})
+@deftypefunx int gsl_sf_legendre_P3_e (double @var{x}, gsl_sf_result * @var{result})
+These functions evaluate the Legendre polynomials
+@c{$P_l(x)$}
+@math{P_l(x)} using explicit
+representations for @math{l=1, 2, 3}.
+@comment Exceptional Return Values: none
+@end deftypefun
+
+@deftypefun double gsl_sf_legendre_Pl (int @var{l}, double @var{x})
+@deftypefunx int gsl_sf_legendre_Pl_e (int @var{l}, double @var{x}, gsl_sf_result * @var{result})
+These functions evaluate the Legendre polynomial @c{$P_l(x)$}
+@math{P_l(x)} for a specific value of @var{l},
+@var{x} subject to @c{$l \ge 0$}
+@math{l >= 0},
+@c{$|x| \le 1$}
+@math{|x| <= 1}
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+@deftypefun int gsl_sf_legendre_Pl_array (int @var{lmax}, double @var{x}, double @var{result_array}[])
+@deftypefunx int gsl_sf_legendre_Pl_deriv_array (int @var{lmax}, double @var{x}, double @var{result_array}[], double @var{result_deriv_array}[])
+
+These functions compute an array of Legendre polynomials
+@math{P_l(x)}, and optionally their derivatives @math{dP_l(x)/dx},
+for @math{l = 0, \dots, lmax},
+@c{$|x| \le 1$}
+@math{|x| <= 1}
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+
+@deftypefun double gsl_sf_legendre_Q0 (double @var{x})
+@deftypefunx int gsl_sf_legendre_Q0_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the Legendre function @math{Q_0(x)} for @math{x >
+-1}, @c{$x \ne 1$}
+@math{x != 1}.
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+
+@deftypefun double gsl_sf_legendre_Q1 (double @var{x})
+@deftypefunx int gsl_sf_legendre_Q1_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the Legendre function @math{Q_1(x)} for @math{x >
+-1}, @c{$x \ne 1$}
+@math{x != 1}.
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+@deftypefun double gsl_sf_legendre_Ql (int @var{l}, double @var{x})
+@deftypefunx int gsl_sf_legendre_Ql_e (int @var{l}, double @var{x}, gsl_sf_result * @var{result})
+These routines compute the Legendre function @math{Q_l(x)} for @math{x >
+-1}, @c{$x \ne 1$}
+@math{x != 1} and @c{$l \ge 0$}
+@math{l >= 0}.
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+
+@node Associated Legendre Polynomials and Spherical Harmonics
+@subsection Associated Legendre Polynomials and Spherical Harmonics
+
+The following functions compute the associated Legendre Polynomials
+@math{P_l^m(x)}. Note that this function grows combinatorially with
+@math{l} and can overflow for @math{l} larger than about 150. There is
+no trouble for small @math{m}, but overflow occurs when @math{m} and
+@math{l} are both large. Rather than allow overflows, these functions
+refuse to calculate @math{P_l^m(x)} and return @code{GSL_EOVRFLW} when
+they can sense that @math{l} and @math{m} are too big.
+
+If you want to calculate a spherical harmonic, then @emph{do not} use
+these functions. Instead use @code{gsl_sf_legendre_sphPlm} below,
+which uses a similar recursion, but with the normalized functions.
+
+@deftypefun double gsl_sf_legendre_Plm (int @var{l}, int @var{m}, double @var{x})
+@deftypefunx int gsl_sf_legendre_Plm_e (int @var{l}, int @var{m}, double @var{x}, gsl_sf_result * @var{result})
+These routines compute the associated Legendre polynomial
+@math{P_l^m(x)} for @c{$m \ge 0$}
+@math{m >= 0}, @c{$l \ge m$}
+@math{l >= m}, @c{$|x| \le 1$}
+@math{|x| <= 1}.
+@comment Exceptional Return Values: GSL_EDOM, GSL_EOVRFLW
+@end deftypefun
+
+@deftypefun int gsl_sf_legendre_Plm_array (int @var{lmax}, int @var{m}, double @var{x}, double @var{result_array}[])
+@deftypefunx int gsl_sf_legendre_Plm_deriv_array (int @var{lmax}, int @var{m}, double @var{x}, double @var{result_array}[], double @var{result_deriv_array}[])
+These functions compute an array of Legendre polynomials
+@math{P_l^m(x)}, and optionally their derivatives @math{dP_l^m(x)/dx},
+for @c{$m \ge 0$}
+@math{m >= 0}, @c{$l = |m|, \dots, lmax$}
+@math{l = |m|, ..., lmax}, @c{$|x| \le 1$}
+@math{|x| <= 1}.
+@comment Exceptional Return Values: GSL_EDOM, GSL_EOVRFLW
+@end deftypefun
+
+
+@deftypefun double gsl_sf_legendre_sphPlm (int @var{l}, int @var{m}, double @var{x})
+@deftypefunx int gsl_sf_legendre_sphPlm_e (int @var{l}, int @var{m}, double @var{x}, gsl_sf_result * @var{result})
+These routines compute the normalized associated Legendre polynomial
+@c{$\sqrt{(2l+1)/(4\pi)} \sqrt{(l-m)!/(l+m)!} P_l^m(x)$}
+@math{$\sqrt@{(2l+1)/(4\pi)@} \sqrt@{(l-m)!/(l+m)!@} P_l^m(x)$} suitable
+for use in spherical harmonics. The parameters must satisfy @c{$m \ge 0$}
+@math{m >= 0}, @c{$l \ge m$}
+@math{l >= m}, @c{$|x| \le 1$}
+@math{|x| <= 1}. Theses routines avoid the overflows
+that occur for the standard normalization of @math{P_l^m(x)}.
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+@deftypefun int gsl_sf_legendre_sphPlm_array (int @var{lmax}, int @var{m}, double @var{x}, double @var{result_array}[])
+@deftypefunx int gsl_sf_legendre_sphPlm_deriv_array (int @var{lmax}, int @var{m}, double @var{x}, double @var{result_array}[], double @var{result_deriv_array}[])
+These functions compute an array of normalized associated Legendre functions
+@c{$\sqrt{(2l+1)/(4\pi)} \sqrt{(l-m)!/(l+m)!} P_l^m(x)$}
+@math{$\sqrt@{(2l+1)/(4\pi)@} \sqrt@{(l-m)!/(l+m)!@} P_l^m(x)$},
+and optionally their derivatives,
+for @c{$m \ge 0$}
+@math{m >= 0}, @c{$l = |m|, \dots, lmax$}
+@math{l = |m|, ..., lmax}, @c{$|x| \le 1$}
+@math{|x| <= 1.0}
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+@deftypefun int gsl_sf_legendre_array_size (const int @var{lmax}, const int @var{m})
+This function returns the size of @var{result_array}[] needed for the array
+versions of @math{P_l^m(x)}, @math{@var{lmax} - @var{m} + 1}.
+@comment Exceptional Return Values: none
+@end deftypefun
+
+@node Conical Functions
+@subsection Conical Functions
+
+The Conical Functions @c{$P^\mu_{-(1/2)+i\lambda}(x)$}
+@math{P^\mu_@{-(1/2)+i\lambda@}(x)} and @c{$Q^\mu_{-(1/2)+i\lambda}$}
+@math{Q^\mu_@{-(1/2)+i\lambda@}}
+are described in Abramowitz & Stegun, Section 8.12.
+
+@deftypefun double gsl_sf_conicalP_half (double @var{lambda}, double @var{x})
+@deftypefunx int gsl_sf_conicalP_half_e (double @var{lambda}, double @var{x}, gsl_sf_result * @var{result})
+These routines compute the irregular Spherical Conical Function
+@c{$P^{1/2}_{-1/2 + i \lambda}(x)$}
+@math{P^@{1/2@}_@{-1/2 + i \lambda@}(x)} for @math{x > -1}.
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+@deftypefun double gsl_sf_conicalP_mhalf (double @var{lambda}, double @var{x})
+@deftypefunx int gsl_sf_conicalP_mhalf_e (double @var{lambda}, double @var{x}, gsl_sf_result * @var{result})
+These routines compute the regular Spherical Conical Function
+@c{$P^{-1/2}_{-1/2 + i \lambda}(x)$}
+@math{P^@{-1/2@}_@{-1/2 + i \lambda@}(x)} for @math{x > -1}.
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+@deftypefun double gsl_sf_conicalP_0 (double @var{lambda}, double @var{x})
+@deftypefunx int gsl_sf_conicalP_0_e (double @var{lambda}, double @var{x}, gsl_sf_result * @var{result})
+These routines compute the conical function
+@c{$P^0_{-1/2 + i \lambda}(x)$}
+@math{P^0_@{-1/2 + i \lambda@}(x)}
+for @math{x > -1}.
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+
+@deftypefun double gsl_sf_conicalP_1 (double @var{lambda}, double @var{x})
+@deftypefunx int gsl_sf_conicalP_1_e (double @var{lambda}, double @var{x}, gsl_sf_result * @var{result})
+These routines compute the conical function
+@c{$P^1_{-1/2 + i \lambda}(x)$}
+@math{P^1_@{-1/2 + i \lambda@}(x)} for @math{x > -1}.
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+
+@deftypefun double gsl_sf_conicalP_sph_reg (int @var{l}, double @var{lambda}, double @var{x})
+@deftypefunx int gsl_sf_conicalP_sph_reg_e (int @var{l}, double @var{lambda}, double @var{x}, gsl_sf_result * @var{result})
+These routines compute the Regular Spherical Conical Function
+@c{$P^{-1/2-l}_{-1/2 + i \lambda}(x)$}
+@math{P^@{-1/2-l@}_@{-1/2 + i \lambda@}(x)} for @math{x > -1}, @c{$l \ge -1$}
+@math{l >= -1}.
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+
+@deftypefun double gsl_sf_conicalP_cyl_reg (int @var{m}, double @var{lambda}, double @var{x})
+@deftypefunx int gsl_sf_conicalP_cyl_reg_e (int @var{m}, double @var{lambda}, double @var{x}, gsl_sf_result * @var{result})
+These routines compute the Regular Cylindrical Conical Function
+@c{$P^{-m}_{-1/2 + i \lambda}(x)$}
+@math{P^@{-m@}_@{-1/2 + i \lambda@}(x)} for @math{x > -1}, @c{$m \ge -1$}
+@math{m >= -1}.
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+
+
+@node Radial Functions for Hyperbolic Space
+@subsection Radial Functions for Hyperbolic Space
+
+The following spherical functions are specializations of Legendre
+functions which give the regular eigenfunctions of the Laplacian on a
+3-dimensional hyperbolic space @math{H3d}. Of particular interest is
+the flat limit, @math{\lambda \to \infty}, @math{\eta \to 0},
+@math{\lambda\eta} fixed.
+
+@deftypefun double gsl_sf_legendre_H3d_0 (double @var{lambda}, double @var{eta})
+@deftypefunx int gsl_sf_legendre_H3d_0_e (double @var{lambda}, double @var{eta}, gsl_sf_result * @var{result})
+These routines compute the zeroth radial eigenfunction of the Laplacian on the
+3-dimensional hyperbolic space,
+@c{$$L^{H3d}_0(\lambda,\eta) := {\sin(\lambda\eta) \over \lambda\sinh(\eta)}$$}
+@math{L^@{H3d@}_0(\lambda,\eta) := \sin(\lambda\eta)/(\lambda\sinh(\eta))}
+for @c{$\eta \ge 0$}
+@math{\eta >= 0}.
+In the flat limit this takes the form
+@c{$L^{H3d}_0(\lambda,\eta) = j_0(\lambda\eta)$}
+@math{L^@{H3d@}_0(\lambda,\eta) = j_0(\lambda\eta)}.
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+@deftypefun double gsl_sf_legendre_H3d_1 (double @var{lambda}, double @var{eta})
+@deftypefunx int gsl_sf_legendre_H3d_1_e (double @var{lambda}, double @var{eta}, gsl_sf_result * @var{result})
+These routines compute the first radial eigenfunction of the Laplacian on
+the 3-dimensional hyperbolic space,
+@c{$$L^{H3d}_1(\lambda,\eta) := {1\over\sqrt{\lambda^2 + 1}} {\left(\sin(\lambda \eta)\over \lambda \sinh(\eta)\right)} \left(\coth(\eta) - \lambda \cot(\lambda\eta)\right)$$}
+@math{L^@{H3d@}_1(\lambda,\eta) := 1/\sqrt@{\lambda^2 + 1@} \sin(\lambda \eta)/(\lambda \sinh(\eta)) (\coth(\eta) - \lambda \cot(\lambda\eta))}
+for @c{$\eta \ge 0$}
+@math{\eta >= 0}.
+In the flat limit this takes the form
+@c{$L^{H3d}_1(\lambda,\eta) = j_1(\lambda\eta)$}
+@math{L^@{H3d@}_1(\lambda,\eta) = j_1(\lambda\eta)}.
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+@deftypefun double gsl_sf_legendre_H3d (int @var{l}, double @var{lambda}, double @var{eta})
+@deftypefunx int gsl_sf_legendre_H3d_e (int @var{l}, double @var{lambda}, double @var{eta}, gsl_sf_result * @var{result})
+These routines compute the @var{l}-th radial eigenfunction of the
+Laplacian on the 3-dimensional hyperbolic space @c{$\eta \ge 0$}
+@math{\eta >= 0}, @c{$l \ge 0$}
+@math{l >= 0}. In the flat limit this takes the form
+@c{$L^{H3d}_l(\lambda,\eta) = j_l(\lambda\eta)$}
+@math{L^@{H3d@}_l(\lambda,\eta) = j_l(\lambda\eta)}.
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+@deftypefun int gsl_sf_legendre_H3d_array (int @var{lmax}, double @var{lambda}, double @var{eta}, double @var{result_array}[])
+This function computes an array of radial eigenfunctions
+@c{$L^{H3d}_l( \lambda, \eta)$}
+@math{L^@{H3d@}_l(\lambda, \eta)}
+for @c{$0 \le l \le lmax$}
+@math{0 <= l <= lmax}.
+@comment Exceptional Return Values:
+@end deftypefun
+
diff --git a/gsl-1.9/doc/specfunc-log.texi b/gsl-1.9/doc/specfunc-log.texi
new file mode 100644
index 0000000..75279e8
--- /dev/null
+++ b/gsl-1.9/doc/specfunc-log.texi
@@ -0,0 +1,47 @@
+@cindex logarithm and related functions
+
+Information on the properties of the Logarithm function can be found in
+Abramowitz & Stegun, Chapter 4. The functions described in this section
+are declared in the header file @file{gsl_sf_log.h}.
+
+@deftypefun double gsl_sf_log (double @var{x})
+@deftypefunx int gsl_sf_log_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the logarithm of @var{x}, @math{\log(x)}, for
+@math{x > 0}.
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+
+@deftypefun double gsl_sf_log_abs (double @var{x})
+@deftypefunx int gsl_sf_log_abs_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the logarithm of the magnitude of @var{x},
+@math{\log(|x|)}, for @math{x \ne 0}.
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+
+@deftypefun int gsl_sf_complex_log_e (double @var{zr}, double @var{zi}, gsl_sf_result * @var{lnr}, gsl_sf_result * @var{theta})
+This routine computes the complex logarithm of @math{z = z_r + i
+z_i}. The results are returned as @var{lnr}, @var{theta} such that
+@math{\exp(lnr + i \theta) = z_r + i z_i}, where @math{\theta} lies in
+the range @math{[-\pi,\pi]}.
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+
+@deftypefun double gsl_sf_log_1plusx (double @var{x})
+@deftypefunx int gsl_sf_log_1plusx_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute @math{\log(1 + x)} for @math{x > -1} using an
+algorithm that is accurate for small @math{x}.
+@comment Domain: x > -1.0
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+
+@deftypefun double gsl_sf_log_1plusx_mx (double @var{x})
+@deftypefunx int gsl_sf_log_1plusx_mx_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute @math{\log(1 + x) - x} for @math{x > -1} using an
+algorithm that is accurate for small @math{x}.
+@comment Domain: x > -1.0
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
diff --git a/gsl-1.9/doc/specfunc-mathieu.texi b/gsl-1.9/doc/specfunc-mathieu.texi
new file mode 100644
index 0000000..dddec1d
--- /dev/null
+++ b/gsl-1.9/doc/specfunc-mathieu.texi
@@ -0,0 +1,257 @@
+@cindex Mathieu functions
+
+The routines described in this section compute the angular and radial
+Mathieu functions, and their characteristic values. Mathieu
+functions are the solutions of the following two differential
+equations:
+@tex
+\beforedisplay
+$$
+\eqalign{
+{{d^2 y}\over{d v^2}}& + (a - 2q\cos 2v)y = 0, \cr
+{{d^2 f}\over{d u^2}}& - (a - 2q\cosh 2u)f = 0.
+}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+d^2y/dv^2 + (a - 2q\cos 2v)y = 0
+d^2f/du^2 - (a - 2q\cosh 2u)f = 0
+@end example
+
+@end ifinfo
+@noindent
+The angular Mathieu functions @math{ce_r(x,q)}, @math{se_r(x,q)} are
+the even and odd periodic solutions of the first equation, which is known as Mathieu's equation. These exist
+only for the discrete sequence of characteristic values @math{a=a_r(q)}
+(even-periodic) and @math{a=b_r(q)} (odd-periodic).
+
+The radial Mathieu functions @c{$Mc^{(j)}_{r}(z,q)$}
+@math{Mc^@{(j)@}_@{r@}(z,q)}, @c{$Ms^{(j)}_@{r@}(z,q)$}
+@math{Ms^@{(j)@}_@{r@}(z,q)} are the solutions of the second equation,
+which is referred to as Mathieu's modified equation. The
+radial Mathieu functions of the first, second, third and fourth kind
+are denoted by the parameter @math{j}, which takes the value 1, 2, 3
+or 4.
+
+@comment The angular Mathieu functions can be divided into four types as
+@comment @tex
+@comment \beforedisplay
+@comment $$
+@comment \eqalign{
+@comment x & = \sum_{m=0}^\infty A_{2m+p} \cos(2m+p)\phi, \quad p = 0, 1, \cr
+@comment x & = \sum_{m=0}^\infty B_{2m+p} \sin(2m+p)\phi, \quad p = 0, 1.
+@comment }
+@comment $$
+@comment \afterdisplay
+@comment @end tex
+@comment @ifinfo
+
+@comment @example
+@comment x = \sum_(m=0)^\infty A_(2m+p) \cos(2m+p)\phi, p = 0, 1,
+@comment x = \sum_(m=0)^\infty B_(2m+p) \sin(2m+p)\phi, p = 0, 1.
+@comment @end example
+
+@comment @end ifinfo
+@comment @noindent
+@comment The nomenclature used for the angular Mathieu functions is @math{ce_n}
+@comment for the first solution and @math{se_n} for the second.
+
+@comment Similar solutions exist for the radial Mathieu functions by replacing
+@comment the trigonometric functions with their corresponding hyperbolic
+@comment functions as shown below.
+@comment @tex
+@comment \beforedisplay
+@comment $$
+@comment \eqalign{
+@comment x & = \sum_{m=0}^\infty A_{2m+p} \cosh(2m+p)u, \quad p = 0, 1, \cr
+@comment x & = \sum_{m=0}^\infty B_{2m+p} \sinh(2m+p)u, \quad p = 0, 1.
+@comment }
+@comment $$
+@comment \afterdisplay
+@comment @end tex
+@comment @ifinfo
+
+@comment @example
+@comment x = \sum_(m=0)^\infty A_(2m+p) \cosh(2m+p)u, p = 0, 1,
+@comment x = \sum_(m=0)^\infty B_(2m+p) \sinh(2m+p)u, p = 0, 1.
+@comment @end example
+
+@comment @end ifinfo
+@comment @noindent
+@comment The nomenclature used for the radial Mathieu functions is @math{Mc_n}
+@comment for the first solution and @math{Ms_n} for the second. The hyperbolic
+@comment series do not always converge at an acceptable rate. Therefore most
+@comment texts on the subject suggest using the following equivalent equations
+@comment that are expanded in series of Bessel and Hankel functions.
+@comment @tex
+@comment \beforedisplay
+@comment $$
+@comment \eqalign{
+@comment Mc_{2n}^{(j)}(x,q) & = \sum_{m=0}^\infty (-1)^{r+k}
+@comment A_{2m}^{2n}(q)\left[J_m(u_1)Z_m^{(j)}(u_2) +
+@comment J_m(u_1)Z_m^{(j)}(u_2)\right]/A_2^{2n} \cr
+@comment Mc_{2n+1}^{(j)}(x,q) & = \sum_{m=0}^\infty (-1)^{r+k}
+@comment A_{2m+1}^{2n+1}(q)\left[J_m(u_1)Z_{m+1}^{(j)}(u_2) +
+@comment J_{m+1}(u_1)Z_m^{(j)}(u_2)\right]/A_1^{2n+1} \cr
+@comment Ms_{2n}^{(j)}(x,q) & = \sum_{m=1}^\infty (-1)^{r+k}
+@comment B_{2m}^{2n}(q)\left[J_{m-1}(u_1)Z_{m+1}^{(j)}(u_2) +
+@comment J_{m+1}(u_1)Z_{m-1}^{(j)}(u_2)\right]/B_2^{2n} \cr
+@comment Ms_{2n+1}^{(j)}(x,q) & = \sum_{m=0}^\infty (-1)^{r+k}
+@comment B_{2m+1}^{2n+1}(q)\left[J_m(u_1)Z_{m+1}^{(j)}(u_2) +
+@comment J_{m+1}(u_1)Z_m^{(j)}(u_2)\right]/B_1^{2n+1}
+@comment }
+@comment $$
+@comment \afterdisplay
+@comment @end tex
+@comment @ifinfo
+
+@comment @example
+@comment Mc_(2n)^(j)(x,q) = \sum_(m=0)^\infty (-1)^(r+k) A_(2m)^(2n)(q)
+@comment [J_m(u_1)Z_m^(j)(u_2) + J_m(u_1)Z_m^(j)(u_2)]/A_2^(2n)
+@comment Mc_(2n+1)^(j)(x,q) = \sum_(m=0)^\infty (-1)^(r+k) A_(2m+1)^(2n+1)(q)
+@comment [J_m(u_1)Z_(m+1)^(j)(u_2) + J_(m+1)(u_1)Z_m^(j)(u_2)]/A_1^(2n+1)
+@comment Ms_(2n)^(j)(x,q) = \sum_(m=1)^\infty (-1)^(r+k) B_(2m)^(2n)(q)
+@comment [J_(m-1)(u_1)Z_(m+1)^(j)(u_2) + J_(m+1)(u_1)Z_(m-1)^(j)(u_2)]/B_2^(2n)
+@comment Ms_(2n+1)^(j)(x,q) = \sum_(m=0)^\infty (-1)^(r+k) B_(2m+1)^(2n+1)(q)
+@comment [J_m(u_1)Z_(m+1)^(j)(u_2) + J_(m+1)(u_1)Z_m^(j)(u_2)]/B_1^(2n+1)
+@comment @end example
+
+@comment @end ifinfo
+@comment @noindent
+@comment where @c{$u_1 = \sqrt{q} \exp(-x)$}
+@comment @math{u_1 = \sqrt@{q@} \exp(-x)} and @c{$u_2 = \sqrt@{q@} \exp(x)$}
+@comment @math{u_2 = \sqrt@{q@} \exp(x)} and
+@comment @tex
+@comment \beforedisplay
+@comment $$
+@comment \eqalign{
+@comment Z_m^{(1)}(u) & = J_m(u) \cr
+@comment Z_m^{(2)}(u) & = Y_m(u) \cr
+@comment Z_m^{(3)}(u) & = H_m^{(1)}(u) \cr
+@comment Z_m^{(4)}(u) & = H_m^{(2)}(u)
+@comment }
+@comment $$
+@comment \afterdisplay
+@comment @end tex
+@comment @ifinfo
+
+@comment @example
+@comment Z_m^(1)(u) = J_m(u)
+@comment Z_m^(2)(u) = Y_m(u)
+@comment Z_m^(3)(u) = H_m^(1)(u)
+@comment Z_m^(4)(u) = H_m^(2)(u)
+@comment @end example
+
+@comment @end ifinfo
+@comment @noindent
+@comment where @math{J_m(u)}, @math{Y_m(u)}, @math{H_m^{(1)}(u)}, and
+@comment @math{H_m^{(2)}(u)} are the regular and irregular Bessel functions and
+@comment the Hankel functions, respectively.
+
+For more information on the Mathieu functions, see Abramowitz and
+Stegun, Chapter 20. These functions are defined in the header file
+@file{gsl_sf_mathieu.h}.
+
+@menu
+* Mathieu Function Workspace::
+* Mathieu Function Characteristic Values::
+* Angular Mathieu Functions::
+* Radial Mathieu Functions::
+@end menu
+
+@node Mathieu Function Workspace
+@subsection Mathieu Function Workspace
+
+The Mathieu functions can be computed for a single order or
+for multiple orders, using array-based routines. The array-based
+routines require a preallocated workspace.
+
+@deftypefun {gsl_sf_mathieu_workspace *} gsl_sf_mathieu_alloc (size_t @var{n}, double @var{qmax})
+This function returns a workspace for the array versions of the
+Mathieu routines. The arguments @var{n} and @var{qmax} specify the
+maximum order and @math{q}-value of Mathieu functions which can be
+computed with this workspace.
+
+@comment This is required in order to properly
+@comment terminate the infinite eigenvalue matrix for high precision solutions.
+@comment The characteristic values for all orders @math{0 \to n} are stored in
+@comment the work structure array element @kbd{work->char_value}.
+@end deftypefun
+
+@deftypefun void gsl_sf_mathieu_free (gsl_sf_mathieu_workspace @var{*work})
+This function frees the workspace @var{work}.
+@end deftypefun
+
+@node Mathieu Function Characteristic Values
+@subsection Mathieu Function Characteristic Values
+@cindex Mathieu Function Characteristic Values
+
+@deftypefun int gsl_sf_mathieu_a (int @var{n}, double @var{q}, gsl_sf_result @var{*result})
+@deftypefunx int gsl_sf_mathieu_b (int @var{n}, double @var{q}, gsl_sf_result @var{*result})
+These routines compute the characteristic values @math{a_n(q)},
+@math{b_n(q)} of the Mathieu functions @math{ce_n(q,x)} and
+@math{se_n(q,x)}, respectively.
+@end deftypefun
+
+@deftypefun int gsl_sf_mathieu_a_array (int @var{order_min}, int @var{order_max}, double @var{q}, gsl_sf_mathieu_workspace @var{*work}, double @var{result_array}[])
+@deftypefunx int gsl_sf_mathieu_b_array (int @var{order_min}, int @var{order_max}, double @var{q}, gsl_sf_mathieu_workspace @var{*work}, double @var{result_array}[])
+These routines compute a series of Mathieu characteristic values
+@math{a_n(q)}, @math{b_n(q)} for @math{n} from @var{order_min} to
+@var{order_max} inclusive, storing the results in the array @var{result_array}.
+@end deftypefun
+
+@node Angular Mathieu Functions
+@subsection Angular Mathieu Functions
+@cindex Angular Mathieu Functions
+@cindex @math{ce(q,x)}, Mathieu function
+@cindex @math{se(q,x)}, Mathieu function
+
+@deftypefun int gsl_sf_mathieu_ce (int @var{n}, double @var{q}, double @var{x}, gsl_sf_result @var{*result})
+@deftypefunx int gsl_sf_mathieu_se (int @var{n}, double @var{q}, double @var{x}, gsl_sf_result @var{*result})
+These routines compute the angular Mathieu functions @math{ce_n(q,x)}
+and @math{se_n(q,x)}, respectively.
+@end deftypefun
+
+@deftypefun int gsl_sf_mathieu_ce_array (int @var{nmin}, int @var{nmax}, double @var{q}, double @var{x}, gsl_sf_mathieu_workspace @var{*work}, double @var{result_array}[])
+@deftypefunx int gsl_sf_mathieu_se_array (int @var{nmin}, int @var{nmax}, double @var{q}, double @var{x}, gsl_sf_mathieu_workspace @var{*work}, double @var{result_array}[])
+These routines compute a series of the angular Mathieu functions
+@math{ce_n(q,x)} and @math{se_n(q,x)} of order @math{n} from
+@var{nmin} to @var{nmax} inclusive, storing the results in the array
+@var{result_array}.
+@end deftypefun
+
+@node Radial Mathieu Functions
+@subsection Radial Mathieu Functions
+@cindex Radial Mathieu Functions
+
+@deftypefun int gsl_sf_mathieu_Mc (int @var{j}, int @var{n}, double @var{q}, double @var{x}, gsl_sf_result @var{*result})
+@deftypefunx int gsl_sf_mathieu_Ms (int @var{j}, int @var{n}, double @var{q}, double @var{x}, gsl_sf_result @var{*result})
+These routines compute the radial @var{j}-th kind Mathieu functions
+@c{$Mc_n^{(j)}(q,x)$}
+@math{Mc_n^@{(j)@}(q,x)} and
+@c{$Ms_n^{(j)}(q,x)$}
+@math{Ms_n^@{(j)@}(q,x)} of order @var{n}.
+
+The allowed values of @var{j} are 1 and 2.
+The functions for @math{j = 3,4} can be computed as
+@c{$M_n^{(3)} = M_n^{(1)} + iM_n^{(2)}$}
+@math{M_n^@{(3)@} = M_n^@{(1)@} + iM_n^@{(2)@}} and
+@c{$M_n^{(4)} = M_n^{(1)} - iM_n^{(2)}$}
+@math{M_n^@{(4)@} = M_n^@{(1)@} - iM_n^@{(2)@}},
+where
+@c{$M_n^{(j)} = Mc_n^{(j)}$}
+@math{M_n^@{(j)@} = Mc_n^@{(j)@}} or
+@c{$Ms_n^{(j)}$}
+@math{Ms_n^@{(j)@}}.
+@end deftypefun
+
+@deftypefun int gsl_sf_mathieu_Mc_array (int @var{j}, int @var{nmin}, int @var{nmax}, double @var{q}, double @var{x}, gsl_sf_mathieu_workspace @var{*work}, double @var{result_array}[])
+@deftypefunx int gsl_sf_mathieu_Ms_array (int @var{j}, int @var{nmin}, int @var{nmax}, double @var{q}, double @var{x}, gsl_sf_mathieu_workspace @var{*work}, double @var{result_array}[])
+These routines compute a series of the radial Mathieu functions of
+kind @var{j}, with order from @var{nmin} to @var{nmax} inclusive, storing the
+results in the array @var{result_array}.
+@end deftypefun
+
diff --git a/gsl-1.9/doc/specfunc-pow-int.texi b/gsl-1.9/doc/specfunc-pow-int.texi
new file mode 100644
index 0000000..f05469a
--- /dev/null
+++ b/gsl-1.9/doc/specfunc-pow-int.texi
@@ -0,0 +1,22 @@
+@cindex power function
+@cindex integer powers
+
+The following functions are equivalent to the function @code{gsl_pow_int}
+(@pxref{Small integer powers}) with an error estimate. These functions are
+declared in the header file @file{gsl_sf_pow_int.h}.
+
+@deftypefun double gsl_sf_pow_int (double @var{x}, int @var{n})
+@deftypefunx int gsl_sf_pow_int_e (double @var{x}, int @var{n}, gsl_sf_result * @var{result})
+These routines compute the power @math{x^n} for integer @var{n}. The
+power is computed using the minimum number of multiplications. For
+example, @math{x^8} is computed as @math{((x^2)^2)^2}, requiring only 3
+multiplications. For reasons of efficiency, these functions do not
+check for overflow or underflow conditions.
+@end deftypefun
+
+@example
+#include <gsl/gsl_sf_pow_int.h>
+/* compute 3.0**12 */
+double y = gsl_sf_pow_int(3.0, 12);
+@end example
+
diff --git a/gsl-1.9/doc/specfunc-psi.texi b/gsl-1.9/doc/specfunc-psi.texi
new file mode 100644
index 0000000..8bbef3b
--- /dev/null
+++ b/gsl-1.9/doc/specfunc-psi.texi
@@ -0,0 +1,90 @@
+@cindex psi function
+@cindex digamma function
+@cindex polygamma functions
+
+The polygamma functions of order @math{n} are defined by
+@tex
+\beforedisplay
+$$
+\psi^{(n)}(x) = \left(d \over dx\right)^n \psi(x) = \left(d \over dx\right)^{n+1} \log(\Gamma(x))
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+\psi^@{(n)@}(x) = (d/dx)^n \psi(x) = (d/dx)^@{n+1@} \log(\Gamma(x))
+@end example
+
+@end ifinfo
+@noindent
+where @math{\psi(x) = \Gamma'(x)/\Gamma(x)} is known as the digamma function.
+These functions are declared in the header file @file{gsl_sf_psi.h}.
+
+@menu
+* Digamma Function::
+* Trigamma Function::
+* Polygamma Function::
+@end menu
+
+@node Digamma Function
+@subsection Digamma Function
+
+@deftypefun double gsl_sf_psi_int (int @var{n})
+@deftypefunx int gsl_sf_psi_int_e (int @var{n}, gsl_sf_result * @var{result})
+These routines compute the digamma function @math{\psi(n)} for positive
+integer @var{n}. The digamma function is also called the Psi function.
+@comment Domain: n integer, n > 0
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+
+@deftypefun double gsl_sf_psi (double @var{x})
+@deftypefunx int gsl_sf_psi_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the digamma function @math{\psi(x)} for general
+@math{x}, @math{x \ne 0}.
+@comment Domain: x != 0.0, -1.0, -2.0, ...
+@comment Exceptional Return Values: GSL_EDOM, GSL_ELOSS
+@end deftypefun
+
+
+@deftypefun double gsl_sf_psi_1piy (double @var{y})
+@deftypefunx int gsl_sf_psi_1piy_e (double @var{y}, gsl_sf_result * @var{result})
+These routines compute the real part of the digamma function on the line
+@math{1+i y}, @math{\Re[\psi(1 + i y)]}.
+@comment exceptions: none
+@comment Exceptional Return Values: none
+@end deftypefun
+
+
+@node Trigamma Function
+@subsection Trigamma Function
+
+@deftypefun double gsl_sf_psi_1_int (int @var{n})
+@deftypefunx int gsl_sf_psi_1_int_e (int @var{n}, gsl_sf_result * @var{result})
+These routines compute the Trigamma function @math{\psi'(n)} for
+positive integer @math{n}.
+@comment Domain: n integer, n > 0
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+@deftypefun double gsl_sf_psi_1 (double @var{x})
+@deftypefunx int gsl_sf_psi_1_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the Trigamma function @math{\psi'(x)} for
+general @math{x}.
+@comment Domain: x != 0.0, -1.0, -2.0, ...
+@comment Exceptional Return Values: GSL_EDOM, GSL_ELOSS
+@end deftypefun
+
+@node Polygamma Function
+@subsection Polygamma Function
+
+@deftypefun double gsl_sf_psi_n (int @var{n}, double @var{x})
+@deftypefunx int gsl_sf_psi_n_e (int @var{n}, double @var{x}, gsl_sf_result * @var{result})
+These routines compute the polygamma function @c{$\psi^{(n)}(x)$}
+@math{\psi^@{(n)@}(x)} for
+@c{$n \ge 0$}
+@math{n >= 0}, @math{x > 0}.
+@comment Domain: n >= 0, x > 0.0
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
diff --git a/gsl-1.9/doc/specfunc-synchrotron.texi b/gsl-1.9/doc/specfunc-synchrotron.texi
new file mode 100644
index 0000000..d02d4e3
--- /dev/null
+++ b/gsl-1.9/doc/specfunc-synchrotron.texi
@@ -0,0 +1,24 @@
+@cindex synchrotron functions
+
+The functions described in this section are declared in the header file
+@file{gsl_sf_synchrotron.h}.
+
+@deftypefun double gsl_sf_synchrotron_1 (double @var{x})
+@deftypefunx int gsl_sf_synchrotron_1_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the first synchrotron function
+@c{$x \int_x^\infty dt K_{5/3}(t)$}
+@math{x \int_x^\infty dt K_@{5/3@}(t)} for @c{$x \ge 0$}
+@math{x >= 0}.
+@comment Domain: x >= 0.0
+@comment Exceptional Return Values: GSL_EDOM, GSL_EUNDRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_synchrotron_2 (double @var{x})
+@deftypefunx int gsl_sf_synchrotron_2_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the second synchrotron function
+@c{$x K_{2/3}(x)$}
+@math{x K_@{2/3@}(x)} for @c{$x \ge 0$}
+@math{x >= 0}.
+@comment Domain: x >= 0.0
+@comment Exceptional Return Values: GSL_EDOM, GSL_EUNDRFLW
+@end deftypefun
diff --git a/gsl-1.9/doc/specfunc-transport.texi b/gsl-1.9/doc/specfunc-transport.texi
new file mode 100644
index 0000000..7337d5c
--- /dev/null
+++ b/gsl-1.9/doc/specfunc-transport.texi
@@ -0,0 +1,34 @@
+@cindex transport functions
+
+The transport functions @math{J(n,x)} are defined by the integral
+representations
+@c{$J(n,x) := \int_0^x dt \, t^n e^t /(e^t - 1)^2$}
+@math{J(n,x) := \int_0^x dt t^n e^t /(e^t - 1)^2}.
+They are declared in the header file @file{gsl_sf_transport.h}.
+
+@deftypefun double gsl_sf_transport_2 (double @var{x})
+@deftypefunx int gsl_sf_transport_2_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the transport function @math{J(2,x)}.
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+
+@deftypefun double gsl_sf_transport_3 (double @var{x})
+@deftypefunx int gsl_sf_transport_3_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the transport function @math{J(3,x)}.
+@comment Exceptional Return Values: GSL_EDOM, GSL_EUNDRFLW
+@end deftypefun
+
+
+@deftypefun double gsl_sf_transport_4 (double @var{x})
+@deftypefunx int gsl_sf_transport_4_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the transport function @math{J(4,x)}.
+@comment Exceptional Return Values: GSL_EDOM, GSL_EUNDRFLW
+@end deftypefun
+
+
+@deftypefun double gsl_sf_transport_5 (double @var{x})
+@deftypefunx int gsl_sf_transport_5_e (double @var{x}, gsl_sf_result * @var{result})
+These routines compute the transport function @math{J(5,x)}.
+@comment Exceptional Return Values: GSL_EDOM, GSL_EUNDRFLW
+@end deftypefun
diff --git a/gsl-1.9/doc/specfunc-trig.texi b/gsl-1.9/doc/specfunc-trig.texi
new file mode 100644
index 0000000..547b2a1
--- /dev/null
+++ b/gsl-1.9/doc/specfunc-trig.texi
@@ -0,0 +1,160 @@
+@cindex trigonometric functions
+
+The library includes its own trigonometric functions in order to provide
+consistency across platforms and reliable error estimates. These
+functions are declared in the header file @file{gsl_sf_trig.h}.
+
+@menu
+* Circular Trigonometric Functions::
+* Trigonometric Functions for Complex Arguments::
+* Hyperbolic Trigonometric Functions::
+* Conversion Functions::
+* Restriction Functions::
+* Trigonometric Functions With Error Estimates::
+@end menu
+
+@node Circular Trigonometric Functions
+@subsection Circular Trigonometric Functions
+
+@deftypefun double gsl_sf_sin (double @var{x})
+@deftypefunx int gsl_sf_sin_e (double @var{x}, gsl_sf_result * @var{result})
+@cindex sine function, special functions
+These routines compute the sine function @math{\sin(x)}.
+@comment Exceptional Return Values:
+@end deftypefun
+
+@deftypefun double gsl_sf_cos (double @var{x})
+@deftypefunx int gsl_sf_cos_e (double @var{x}, gsl_sf_result * @var{result})
+@cindex cosine function, special functions
+These routines compute the cosine function @math{\cos(x)}.
+@comment Exceptional Return Values:
+@end deftypefun
+
+@deftypefun double gsl_sf_hypot (double @var{x}, double @var{y})
+@deftypefunx int gsl_sf_hypot_e (double @var{x}, double @var{y}, gsl_sf_result * @var{result})
+@cindex hypot function, special functions
+These routines compute the hypotenuse function @c{$\sqrt{x^2 + y^2}$}
+@math{\sqrt@{x^2 + y^2@}} avoiding overflow and underflow.
+@comment Exceptional Return Values:
+@end deftypefun
+
+@deftypefun double gsl_sf_sinc (double @var{x})
+@deftypefunx int gsl_sf_sinc_e (double @var{x}, gsl_sf_result * @var{result})
+@cindex complex sinc function, special functions
+These routines compute @math{\sinc(x) = \sin(\pi x) / (\pi x)} for any
+value of @var{x}.
+@comment Exceptional Return Values: none
+@end deftypefun
+
+@node Trigonometric Functions for Complex Arguments
+@subsection Trigonometric Functions for Complex Arguments
+
+@deftypefun int gsl_sf_complex_sin_e (double @var{zr}, double @var{zi}, gsl_sf_result * @var{szr}, gsl_sf_result * @var{szi})
+@cindex complex sine function, special functions
+This function computes the complex sine, @math{\sin(z_r + i z_i)} storing
+the real and imaginary parts in @var{szr}, @var{szi}.
+@comment Exceptional Return Values: GSL_EOVRFLW
+@end deftypefun
+
+@deftypefun int gsl_sf_complex_cos_e (double @var{zr}, double @var{zi}, gsl_sf_result * @var{czr}, gsl_sf_result * @var{czi})
+@cindex complex cosine function, special functions
+This function computes the complex cosine, @math{\cos(z_r + i z_i)} storing
+the real and imaginary parts in @var{szr}, @var{szi}.
+@comment Exceptional Return Values: GSL_EOVRFLW
+@end deftypefun
+
+@deftypefun int gsl_sf_complex_logsin_e (double @var{zr}, double @var{zi}, gsl_sf_result * @var{lszr}, gsl_sf_result * @var{lszi})
+@cindex complex log sine function, special functions
+This function computes the logarithm of the complex sine,
+@math{\log(\sin(z_r + i z_i))} storing the real and imaginary parts in
+@var{szr}, @var{szi}.
+@comment Exceptional Return Values: GSL_EDOM, GSL_ELOSS
+@end deftypefun
+
+@node Hyperbolic Trigonometric Functions
+@subsection Hyperbolic Trigonometric Functions
+
+@deftypefun double gsl_sf_lnsinh (double @var{x})
+@deftypefunx int gsl_sf_lnsinh_e (double @var{x}, gsl_sf_result * @var{result})
+@cindex logarithm of sinh function, special functions
+These routines compute @math{\log(\sinh(x))} for @math{x > 0}.
+@comment Domain: x > 0
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+@deftypefun double gsl_sf_lncosh (double @var{x})
+@deftypefunx int gsl_sf_lncosh_e (double @var{x}, gsl_sf_result * @var{result})
+@cindex logarithm of cosh function, special functions
+These routines compute @math{\log(\cosh(x))} for any @var{x}.
+@comment Exceptional Return Values: none
+@end deftypefun
+
+
+@node Conversion Functions
+@subsection Conversion Functions
+@cindex polar to rectangular conversion
+@cindex rectangular to polar conversion
+
+@deftypefun int gsl_sf_polar_to_rect (double @var{r}, double @var{theta}, gsl_sf_result * @var{x}, gsl_sf_result * @var{y});
+This function converts the polar coordinates (@var{r},@var{theta}) to
+rectilinear coordinates (@var{x},@var{y}), @math{x = r\cos(\theta)},
+@math{y = r\sin(\theta)}.
+@comment Exceptional Return Values: GSL_ELOSS
+@end deftypefun
+
+@deftypefun int gsl_sf_rect_to_polar (double @var{x}, double @var{y}, gsl_sf_result * @var{r}, gsl_sf_result * @var{theta})
+This function converts the rectilinear coordinates (@var{x},@var{y}) to
+polar coordinates (@var{r},@var{theta}), such that @math{x =
+r\cos(\theta)}, @math{y = r\sin(\theta)}. The argument @var{theta}
+lies in the range @math{[-\pi, \pi]}.
+@comment Exceptional Return Values: GSL_EDOM
+@end deftypefun
+
+@node Restriction Functions
+@subsection Restriction Functions
+@cindex angular reduction
+@cindex reduction of angular variables
+
+@deftypefun double gsl_sf_angle_restrict_symm (double @var{theta})
+@deftypefunx int gsl_sf_angle_restrict_symm_e (double * @var{theta})
+These routines force the angle @var{theta} to lie in the range
+@math{(-\pi,\pi]}.
+
+Note that the mathematical value of @math{\pi} is slightly greater
+than @code{M_PI}, so the machine numbers @code{M_PI} and @code{-M_PI}
+are included in the range.
+@comment Exceptional Return Values: GSL_ELOSS
+@end deftypefun
+
+@deftypefun double gsl_sf_angle_restrict_pos (double @var{theta})
+@deftypefunx int gsl_sf_angle_restrict_pos_e (double * @var{theta})
+These routines force the angle @var{theta} to lie in the range @math{[0,
+2\pi)}.
+
+Note that the mathematical value of @math{2\pi} is slightly greater
+than @code{2*M_PI}, so the machine number @code{2*M_PI} is included in
+the range.
+
+@comment Exceptional Return Values: GSL_ELOSS
+@end deftypefun
+
+
+@node Trigonometric Functions With Error Estimates
+@subsection Trigonometric Functions With Error Estimates
+
+@deftypefun int gsl_sf_sin_err_e (double @var{x}, double @var{dx}, gsl_sf_result * @var{result})
+This routine computes the sine of an angle @var{x} with an associated
+absolute error @var{dx},
+@c{$\sin(x \pm dx)$}
+@math{\sin(x \pm dx)}. Note that this function is provided in the error-handling form only since
+its purpose is to compute the propagated error.
+@end deftypefun
+
+@deftypefun int gsl_sf_cos_err_e (double @var{x}, double @var{dx}, gsl_sf_result * @var{result})
+This routine computes the cosine of an angle @var{x} with an associated
+absolute error @var{dx},
+@c{$\cos(x \pm dx)$}
+@math{\cos(x \pm dx)}. Note that this function is provided in the error-handling form only since
+its purpose is to compute the propagated error.
+@end deftypefun
+
diff --git a/gsl-1.9/doc/specfunc-zeta.texi b/gsl-1.9/doc/specfunc-zeta.texi
new file mode 100644
index 0000000..a773212
--- /dev/null
+++ b/gsl-1.9/doc/specfunc-zeta.texi
@@ -0,0 +1,98 @@
+@cindex Zeta functions
+
+The Riemann zeta function is defined in Abramowitz & Stegun, Section
+23.2. The functions described in this section are declared in the
+header file @file{gsl_sf_zeta.h}.
+
+@menu
+* Riemann Zeta Function::
+* Riemann Zeta Function Minus One::
+* Hurwitz Zeta Function::
+* Eta Function::
+@end menu
+
+@node Riemann Zeta Function
+@subsection Riemann Zeta Function
+
+The Riemann zeta function is defined by the infinite sum
+@c{$\zeta(s) = \sum_{k=1}^\infty k^{-s}$}
+@math{\zeta(s) = \sum_@{k=1@}^\infty k^@{-s@}}.
+
+@deftypefun double gsl_sf_zeta_int (int @var{n})
+@deftypefunx int gsl_sf_zeta_int_e (int @var{n}, gsl_sf_result * @var{result})
+These routines compute the Riemann zeta function @math{\zeta(n)}
+for integer @var{n},
+@math{n \ne 1}.
+@comment Domain: n integer, n != 1
+@comment Exceptional Return Values: GSL_EDOM, GSL_EOVRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_zeta (double @var{s})
+@deftypefunx int gsl_sf_zeta_e (double @var{s}, gsl_sf_result * @var{result})
+These routines compute the Riemann zeta function @math{\zeta(s)}
+for arbitrary @var{s},
+@math{s \ne 1}.
+@comment Domain: s != 1.0
+@comment Exceptional Return Values: GSL_EDOM, GSL_EOVRFLW
+@end deftypefun
+
+
+@node Riemann Zeta Function Minus One
+@subsection Riemann Zeta Function Minus One
+
+For large positive argument, the Riemann zeta function approaches one.
+In this region the fractional part is interesting, and therefore we
+need a function to evaluate it explicitly.
+
+@deftypefun double gsl_sf_zetam1_int (int @var{n})
+@deftypefunx int gsl_sf_zetam1_int_e (int @var{n}, gsl_sf_result * @var{result})
+These routines compute @math{\zeta(n) - 1} for integer @var{n},
+@math{n \ne 1}.
+@comment Domain: n integer, n != 1
+@comment Exceptional Return Values: GSL_EDOM, GSL_EOVRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_zetam1 (double @var{s})
+@deftypefunx int gsl_sf_zetam1_e (double @var{s}, gsl_sf_result * @var{result})
+These routines compute @math{\zeta(s) - 1} for arbitrary @var{s},
+@math{s \ne 1}.
+@comment Domain: s != 1.0
+@comment Exceptional Return Values: GSL_EDOM, GSL_EOVRFLW
+@end deftypefun
+
+
+@node Hurwitz Zeta Function
+@subsection Hurwitz Zeta Function
+
+The Hurwitz zeta function is defined by
+@c{$\zeta(s,q) = \sum_0^\infty (k+q)^{-s}$}
+@math{\zeta(s,q) = \sum_0^\infty (k+q)^@{-s@}}.
+
+@deftypefun double gsl_sf_hzeta (double @var{s}, double @var{q})
+@deftypefunx int gsl_sf_hzeta_e (double @var{s}, double @var{q}, gsl_sf_result * @var{result})
+These routines compute the Hurwitz zeta function @math{\zeta(s,q)} for
+@math{s > 1}, @math{q > 0}.
+@comment Domain: s > 1.0, q > 0.0
+@comment Exceptional Return Values: GSL_EDOM, GSL_EUNDRFLW, GSL_EOVRFLW
+@end deftypefun
+
+
+@node Eta Function
+@subsection Eta Function
+
+The eta function is defined by
+@c{$\eta(s) = (1-2^{1-s}) \zeta(s)$}
+@math{\eta(s) = (1-2^@{1-s@}) \zeta(s)}.
+
+@deftypefun double gsl_sf_eta_int (int @var{n})
+@deftypefunx int gsl_sf_eta_int_e (int @var{n}, gsl_sf_result * @var{result})
+These routines compute the eta function @math{\eta(n)} for integer @var{n}.
+@comment Exceptional Return Values: GSL_EUNDRFLW, GSL_EOVRFLW
+@end deftypefun
+
+@deftypefun double gsl_sf_eta (double @var{s})
+@deftypefunx int gsl_sf_eta_e (double @var{s}, gsl_sf_result * @var{result})
+These routines compute the eta function @math{\eta(s)} for arbitrary @var{s}.
+@comment Exceptional Return Values: GSL_EUNDRFLW, GSL_EOVRFLW
+@end deftypefun
+
diff --git a/gsl-1.9/doc/specfunc.texi b/gsl-1.9/doc/specfunc.texi
new file mode 100644
index 0000000..50c93c3
--- /dev/null
+++ b/gsl-1.9/doc/specfunc.texi
@@ -0,0 +1,352 @@
+@cindex special functions
+
+This chapter describes the GSL special function library. The library
+includes routines for calculating the values of Airy functions, Bessel
+functions, Clausen functions, Coulomb wave functions, Coupling
+coefficients, the Dawson function, Debye functions, Dilogarithms,
+Elliptic integrals, Jacobi elliptic functions, Error functions,
+Exponential integrals, Fermi-Dirac functions, Gamma functions,
+Gegenbauer functions, Hypergeometric functions, Laguerre functions,
+Legendre functions and Spherical Harmonics, the Psi (Digamma) Function,
+Synchrotron functions, Transport functions, Trigonometric functions and
+Zeta functions. Each routine also computes an estimate of the numerical
+error in the calculated value of the function.
+
+The functions in this chapter are declared in individual header files,
+such as @file{gsl_sf_airy.h}, @file{gsl_sf_bessel.h}, etc. The complete
+set of header files can be included using the file @file{gsl_sf.h}.
+
+@menu
+* Special Function Usage::
+* The gsl_sf_result struct::
+* Special Function Modes::
+* Airy Functions and Derivatives::
+* Bessel Functions::
+* Clausen Functions::
+* Coulomb Functions::
+* Coupling Coefficients::
+* Dawson Function::
+* Debye Functions::
+* Dilogarithm::
+* Elementary Operations::
+* Elliptic Integrals::
+* Elliptic Functions (Jacobi)::
+* Error Functions::
+* Exponential Functions::
+* Exponential Integrals::
+* Fermi-Dirac Function::
+* Gamma and Beta Functions::
+* Gegenbauer Functions::
+* Hypergeometric Functions::
+* Laguerre Functions::
+* Lambert W Functions::
+* Legendre Functions and Spherical Harmonics::
+* Logarithm and Related Functions::
+* Mathieu Functions::
+* Power Function::
+* Psi (Digamma) Function::
+* Synchrotron Functions::
+* Transport Functions::
+* Trigonometric Functions::
+* Zeta Functions::
+* Special Functions Examples::
+* Special Functions References and Further Reading::
+@end menu
+
+@node Special Function Usage
+@section Usage
+
+The special functions are available in two calling conventions, a
+@dfn{natural form} which returns the numerical value of the function and
+an @dfn{error-handling form} which returns an error code. The two types
+of function provide alternative ways of accessing the same underlying
+code.
+
+The @dfn{natural form} returns only the value of the function and can be
+used directly in mathematical expressions. For example, the following
+function call will compute the value of the Bessel function
+@math{J_0(x)},
+
+@example
+double y = gsl_sf_bessel_J0 (x);
+@end example
+
+@noindent
+There is no way to access an error code or to estimate the error using
+this method. To allow access to this information the alternative
+error-handling form stores the value and error in a modifiable argument,
+
+@example
+gsl_sf_result result;
+int status = gsl_sf_bessel_J0_e (x, &result);
+@end example
+
+@noindent
+The error-handling functions have the suffix @code{_e}. The returned
+status value indicates error conditions such as overflow, underflow or
+loss of precision. If there are no errors the error-handling functions
+return @code{GSL_SUCCESS}.
+
+@node The gsl_sf_result struct
+@section The gsl_sf_result struct
+@cindex gsl_sf_result
+@cindex gsl_sf_result_e10
+
+The error handling form of the special functions always calculate an
+error estimate along with the value of the result. Therefore,
+structures are provided for amalgamating a value and error estimate.
+These structures are declared in the header file @file{gsl_sf_result.h}.
+
+The @code{gsl_sf_result} struct contains value and error fields.
+
+@example
+typedef struct
+@{
+ double val;
+ double err;
+@} gsl_sf_result;
+@end example
+
+@noindent
+The field @var{val} contains the value and the field @var{err} contains
+an estimate of the absolute error in the value.
+
+In some cases, an overflow or underflow can be detected and handled by a
+function. In this case, it may be possible to return a scaling exponent
+as well as an error/value pair in order to save the result from
+exceeding the dynamic range of the built-in types. The
+@code{gsl_sf_result_e10} struct contains value and error fields as well
+as an exponent field such that the actual result is obtained as
+@code{result * 10^(e10)}.
+
+@example
+typedef struct
+@{
+ double val;
+ double err;
+ int e10;
+@} gsl_sf_result_e10;
+@end example
+
+@node Special Function Modes
+@section Modes
+
+The goal of the library is to achieve double precision accuracy wherever
+possible. However the cost of evaluating some special functions to
+double precision can be significant, particularly where very high order
+terms are required. In these cases a @code{mode} argument allows the
+accuracy of the function to be reduced in order to improve performance.
+The following precision levels are available for the mode argument,
+
+@table @code
+@item GSL_PREC_DOUBLE
+Double-precision, a relative accuracy of approximately @c{$2 \times 10^{-16}$}
+@math{2 * 10^-16}.
+@item GSL_PREC_SINGLE
+Single-precision, a relative accuracy of approximately @c{$1 \times 10^{-7}$}
+@math{10^-7}.
+@item GSL_PREC_APPROX
+Approximate values, a relative accuracy of approximately @c{$5 \times 10^{-4}$}
+@math{5 * 10^-4}.
+@end table
+
+@noindent
+The approximate mode provides the fastest evaluation at the lowest
+accuracy.
+
+@node Airy Functions and Derivatives
+@section Airy Functions and Derivatives
+@include specfunc-airy.texi
+
+@node Bessel Functions
+@section Bessel Functions
+@include specfunc-bessel.texi
+
+@node Clausen Functions
+@section Clausen Functions
+@include specfunc-clausen.texi
+
+@node Coulomb Functions
+@section Coulomb Functions
+@include specfunc-coulomb.texi
+
+@node Coupling Coefficients
+@section Coupling Coefficients
+@include specfunc-coupling.texi
+
+@node Dawson Function
+@section Dawson Function
+@include specfunc-dawson.texi
+
+@node Debye Functions
+@section Debye Functions
+@include specfunc-debye.texi
+
+@node Dilogarithm
+@section Dilogarithm
+@include specfunc-dilog.texi
+
+@node Elementary Operations
+@section Elementary Operations
+@include specfunc-elementary.texi
+
+@node Elliptic Integrals
+@section Elliptic Integrals
+@include specfunc-ellint.texi
+
+@node Elliptic Functions (Jacobi)
+@section Elliptic Functions (Jacobi)
+@include specfunc-elljac.texi
+
+@node Error Functions
+@section Error Functions
+@include specfunc-erf.texi
+
+@node Exponential Functions
+@section Exponential Functions
+@include specfunc-exp.texi
+
+@node Exponential Integrals
+@section Exponential Integrals
+@include specfunc-expint.texi
+
+@node Fermi-Dirac Function
+@section Fermi-Dirac Function
+@include specfunc-fermi-dirac.texi
+
+@node Gamma and Beta Functions
+@section Gamma and Beta Functions
+@include specfunc-gamma.texi
+
+@node Gegenbauer Functions
+@section Gegenbauer Functions
+@include specfunc-gegenbauer.texi
+
+@node Hypergeometric Functions
+@section Hypergeometric Functions
+@include specfunc-hyperg.texi
+
+@node Laguerre Functions
+@section Laguerre Functions
+@include specfunc-laguerre.texi
+
+@node Lambert W Functions
+@section Lambert W Functions
+@include specfunc-lambert.texi
+
+@node Legendre Functions and Spherical Harmonics
+@section Legendre Functions and Spherical Harmonics
+@include specfunc-legendre.texi
+
+@node Logarithm and Related Functions
+@section Logarithm and Related Functions
+@include specfunc-log.texi
+
+@node Mathieu Functions
+@section Mathieu Functions
+@include specfunc-mathieu.texi
+
+@node Power Function
+@section Power Function
+@include specfunc-pow-int.texi
+
+@node Psi (Digamma) Function
+@section Psi (Digamma) Function
+@include specfunc-psi.texi
+
+@node Synchrotron Functions
+@section Synchrotron Functions
+@include specfunc-synchrotron.texi
+
+@node Transport Functions
+@section Transport Functions
+@include specfunc-transport.texi
+
+@node Trigonometric Functions
+@section Trigonometric Functions
+@include specfunc-trig.texi
+
+@node Zeta Functions
+@section Zeta Functions
+@include specfunc-zeta.texi
+
+@node Special Functions Examples
+@section Examples
+
+The following example demonstrates the use of the error handling form of
+the special functions, in this case to compute the Bessel function
+@math{J_0(5.0)},
+
+@example
+@verbatiminclude examples/specfun_e.c
+@end example
+
+@noindent
+Here are the results of running the program,
+
+@example
+$ ./a.out
+@verbatiminclude examples/specfun_e.out
+@end example
+
+@noindent
+The next program computes the same quantity using the natural form of
+the function. In this case the error term @var{result.err} and return
+status are not accessible.
+
+@example
+@verbatiminclude examples/specfun.c
+@end example
+
+@noindent
+The results of the function are the same,
+
+@example
+$ ./a.out
+@verbatiminclude examples/specfun.out
+@end example
+
+
+
+@node Special Functions References and Further Reading
+@section References and Further Reading
+
+The library follows the conventions of @cite{Abramowitz & Stegun} where
+possible,
+@itemize @asis
+@item
+Abramowitz & Stegun (eds.), @cite{Handbook of Mathematical Functions}
+@end itemize
+
+@noindent
+The following papers contain information on the algorithms used
+to compute the special functions,
+@cindex MISCFUN
+@itemize @asis
+@item
+MISCFUN: A software package to compute uncommon special functions.
+@cite{ACM Trans.@: Math.@: Soft.}, vol.@: 22, 1996, 288--301
+
+@item
+G.N. Watson, A Treatise on the Theory of Bessel Functions,
+2nd Edition (Cambridge University Press, 1944).
+
+@item
+G. Nemeth, Mathematical Approximations of Special Functions,
+Nova Science Publishers, ISBN 1-56072-052-2
+
+@item
+B.C. Carlson, Special Functions of Applied Mathematics (1977)
+
+@item
+W.J. Thompson, Atlas for Computing Mathematical Functions, John Wiley & Sons,
+New York (1997).
+
+@item
+Y.Y. Luke, Algorithms for the Computation of Mathematical Functions, Academic
+Press, New York (1977).
+
+@comment @item
+@comment Fermi-Dirac functions of orders @math{-1/2}, @math{1/2}, @math{3/2}, and
+@comment @math{5/2}. @cite{ACM Trans. Math. Soft.}, vol. 24, 1998, 1-12.
+@end itemize
diff --git a/gsl-1.9/doc/stamp-vti b/gsl-1.9/doc/stamp-vti
new file mode 100644
index 0000000..391fb64
--- /dev/null
+++ b/gsl-1.9/doc/stamp-vti
@@ -0,0 +1,4 @@
+@set UPDATED 20 February 2007
+@set UPDATED-MONTH February 2007
+@set EDITION 1.9
+@set VERSION 1.9
diff --git a/gsl-1.9/doc/statistics.texi b/gsl-1.9/doc/statistics.texi
new file mode 100644
index 0000000..c289278
--- /dev/null
+++ b/gsl-1.9/doc/statistics.texi
@@ -0,0 +1,741 @@
+@cindex statistics
+@cindex mean
+@cindex standard deviation
+@cindex variance
+@cindex estimated standard deviation
+@cindex estimated variance
+@cindex t-test
+@cindex range
+@cindex min
+@cindex max
+
+This chapter describes the statistical functions in the library. The
+basic statistical functions include routines to compute the mean,
+variance and standard deviation. More advanced functions allow you to
+calculate absolute deviations, skewness, and kurtosis as well as the
+median and arbitrary percentiles. The algorithms use recurrence
+relations to compute average quantities in a stable way, without large
+intermediate values that might overflow.
+
+The functions are available in versions for datasets in the standard
+floating-point and integer types. The versions for double precision
+floating-point data have the prefix @code{gsl_stats} and are declared in
+the header file @file{gsl_statistics_double.h}. The versions for integer
+data have the prefix @code{gsl_stats_int} and are declared in the header
+file @file{gsl_statistics_int.h}.
+
+@menu
+* Mean and standard deviation and variance::
+* Absolute deviation::
+* Higher moments (skewness and kurtosis)::
+* Autocorrelation::
+* Covariance::
+* Weighted Samples::
+* Maximum and Minimum values::
+* Median and Percentiles::
+* Example statistical programs::
+* Statistics References and Further Reading::
+@end menu
+
+@node Mean and standard deviation and variance
+@section Mean, Standard Deviation and Variance
+
+@deftypefun double gsl_stats_mean (const double @var{data}[], size_t @var{stride}, size_t @var{n})
+This function returns the arithmetic mean of @var{data}, a dataset of
+length @var{n} with stride @var{stride}. The arithmetic mean, or
+@dfn{sample mean}, is denoted by @math{\Hat\mu} and defined as,
+@tex
+\beforedisplay
+$$
+{\Hat\mu} = {1 \over N} \sum x_i
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+\Hat\mu = (1/N) \sum x_i
+@end example
+
+@end ifinfo
+@noindent
+where @math{x_i} are the elements of the dataset @var{data}. For
+samples drawn from a gaussian distribution the variance of
+@math{\Hat\mu} is @math{\sigma^2 / N}.
+@end deftypefun
+
+@deftypefun double gsl_stats_variance (const double @var{data}[], size_t @var{stride}, size_t @var{n})
+This function returns the estimated, or @dfn{sample}, variance of
+@var{data}, a dataset of length @var{n} with stride @var{stride}. The
+estimated variance is denoted by @math{\Hat\sigma^2} and is defined by,
+@tex
+\beforedisplay
+$$
+{\Hat\sigma}^2 = {1 \over (N-1)} \sum (x_i - {\Hat\mu})^2
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+\Hat\sigma^2 = (1/(N-1)) \sum (x_i - \Hat\mu)^2
+@end example
+
+@end ifinfo
+@noindent
+where @math{x_i} are the elements of the dataset @var{data}. Note that
+the normalization factor of @math{1/(N-1)} results from the derivation
+of @math{\Hat\sigma^2} as an unbiased estimator of the population
+variance @math{\sigma^2}. For samples drawn from a gaussian distribution
+the variance of @math{\Hat\sigma^2} itself is @math{2 \sigma^4 / N}.
+
+This function computes the mean via a call to @code{gsl_stats_mean}. If
+you have already computed the mean then you can pass it directly to
+@code{gsl_stats_variance_m}.
+@end deftypefun
+
+@deftypefun double gsl_stats_variance_m (const double @var{data}[], size_t @var{stride}, size_t @var{n}, double @var{mean})
+This function returns the sample variance of @var{data} relative to the
+given value of @var{mean}. The function is computed with @math{\Hat\mu}
+replaced by the value of @var{mean} that you supply,
+@tex
+\beforedisplay
+$$
+{\Hat\sigma}^2 = {1 \over (N-1)} \sum (x_i - mean)^2
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+\Hat\sigma^2 = (1/(N-1)) \sum (x_i - mean)^2
+@end example
+@end ifinfo
+@end deftypefun
+
+@deftypefun double gsl_stats_sd (const double @var{data}[], size_t @var{stride}, size_t @var{n})
+@deftypefunx double gsl_stats_sd_m (const double @var{data}[], size_t @var{stride}, size_t @var{n}, double @var{mean})
+The standard deviation is defined as the square root of the variance.
+These functions return the square root of the corresponding variance
+functions above.
+@end deftypefun
+
+@deftypefun double gsl_stats_variance_with_fixed_mean (const double @var{data}[], size_t @var{stride}, size_t @var{n}, double @var{mean})
+This function computes an unbiased estimate of the variance of
+@var{data} when the population mean @var{mean} of the underlying
+distribution is known @emph{a priori}. In this case the estimator for
+the variance uses the factor @math{1/N} and the sample mean
+@math{\Hat\mu} is replaced by the known population mean @math{\mu},
+@tex
+\beforedisplay
+$$
+{\Hat\sigma}^2 = {1 \over N} \sum (x_i - \mu)^2
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+\Hat\sigma^2 = (1/N) \sum (x_i - \mu)^2
+@end example
+@end ifinfo
+@end deftypefun
+
+
+@deftypefun double gsl_stats_sd_with_fixed_mean (const double @var{data}[], size_t @var{stride}, size_t @var{n}, double @var{mean})
+This function calculates the standard deviation of @var{data} for a
+fixed population mean @var{mean}. The result is the square root of the
+corresponding variance function.
+@end deftypefun
+
+@node Absolute deviation
+@section Absolute deviation
+
+@deftypefun double gsl_stats_absdev (const double @var{data}[], size_t @var{stride}, size_t @var{n})
+This function computes the absolute deviation from the mean of
+@var{data}, a dataset of length @var{n} with stride @var{stride}. The
+absolute deviation from the mean is defined as,
+@tex
+\beforedisplay
+$$
+absdev = {1 \over N} \sum |x_i - {\Hat\mu}|
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+absdev = (1/N) \sum |x_i - \Hat\mu|
+@end example
+
+@end ifinfo
+@noindent
+where @math{x_i} are the elements of the dataset @var{data}. The
+absolute deviation from the mean provides a more robust measure of the
+width of a distribution than the variance. This function computes the
+mean of @var{data} via a call to @code{gsl_stats_mean}.
+@end deftypefun
+
+@deftypefun double gsl_stats_absdev_m (const double @var{data}[], size_t @var{stride}, size_t @var{n}, double @var{mean})
+This function computes the absolute deviation of the dataset @var{data}
+relative to the given value of @var{mean},
+@tex
+\beforedisplay
+$$
+absdev = {1 \over N} \sum |x_i - mean|
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+absdev = (1/N) \sum |x_i - mean|
+@end example
+
+@end ifinfo
+@noindent
+This function is useful if you have already computed the mean of
+@var{data} (and want to avoid recomputing it), or wish to calculate the
+absolute deviation relative to another value (such as zero, or the
+median).
+@end deftypefun
+
+@node Higher moments (skewness and kurtosis)
+@section Higher moments (skewness and kurtosis)
+
+@deftypefun double gsl_stats_skew (const double @var{data}[], size_t @var{stride}, size_t @var{n})
+This function computes the skewness of @var{data}, a dataset of length
+@var{n} with stride @var{stride}. The skewness is defined as,
+@tex
+\beforedisplay
+$$
+skew = {1 \over N} \sum
+ {\left( x_i - {\Hat\mu} \over {\Hat\sigma} \right)}^3
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+skew = (1/N) \sum ((x_i - \Hat\mu)/\Hat\sigma)^3
+@end example
+
+@end ifinfo
+@noindent
+where @math{x_i} are the elements of the dataset @var{data}. The skewness
+measures the asymmetry of the tails of a distribution.
+
+The function computes the mean and estimated standard deviation of
+@var{data} via calls to @code{gsl_stats_mean} and @code{gsl_stats_sd}.
+@end deftypefun
+
+@deftypefun double gsl_stats_skew_m_sd (const double @var{data}[], size_t @var{stride}, size_t @var{n}, double @var{mean}, double @var{sd})
+This function computes the skewness of the dataset @var{data} using the
+given values of the mean @var{mean} and standard deviation @var{sd},
+@tex
+\beforedisplay
+$$
+skew = {1 \over N}
+ \sum {\left( x_i - mean \over sd \right)}^3
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+skew = (1/N) \sum ((x_i - mean)/sd)^3
+@end example
+
+@end ifinfo
+@noindent
+These functions are useful if you have already computed the mean and
+standard deviation of @var{data} and want to avoid recomputing them.
+@end deftypefun
+
+@deftypefun double gsl_stats_kurtosis (const double @var{data}[], size_t @var{stride}, size_t @var{n})
+This function computes the kurtosis of @var{data}, a dataset of length
+@var{n} with stride @var{stride}. The kurtosis is defined as,
+@tex
+\beforedisplay
+$$
+kurtosis = \left( {1 \over N} \sum
+ {\left(x_i - {\Hat\mu} \over {\Hat\sigma} \right)}^4
+ \right)
+ - 3
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+kurtosis = ((1/N) \sum ((x_i - \Hat\mu)/\Hat\sigma)^4) - 3
+@end example
+
+@end ifinfo
+@noindent
+The kurtosis measures how sharply peaked a distribution is, relative to
+its width. The kurtosis is normalized to zero for a gaussian
+distribution.
+@end deftypefun
+
+@deftypefun double gsl_stats_kurtosis_m_sd (const double @var{data}[], size_t @var{stride}, size_t @var{n}, double @var{mean}, double @var{sd})
+This function computes the kurtosis of the dataset @var{data} using the
+given values of the mean @var{mean} and standard deviation @var{sd},
+@tex
+\beforedisplay
+$$
+kurtosis = {1 \over N}
+ \left( \sum {\left(x_i - mean \over sd \right)}^4 \right)
+ - 3
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+kurtosis = ((1/N) \sum ((x_i - mean)/sd)^4) - 3
+@end example
+
+@end ifinfo
+@noindent
+This function is useful if you have already computed the mean and
+standard deviation of @var{data} and want to avoid recomputing them.
+@end deftypefun
+
+@node Autocorrelation
+@section Autocorrelation
+
+@deftypefun double gsl_stats_lag1_autocorrelation (const double @var{data}[], const size_t @var{stride}, const size_t @var{n})
+This function computes the lag-1 autocorrelation of the dataset @var{data}.
+@tex
+\beforedisplay
+$$
+a_1 = {\sum_{i = 1}^{n} (x_{i} - \Hat\mu) (x_{i-1} - \Hat\mu)
+\over
+\sum_{i = 1}^{n} (x_{i} - \Hat\mu) (x_{i} - \Hat\mu)}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+a_1 = @{\sum_@{i = 1@}^@{n@} (x_@{i@} - \Hat\mu) (x_@{i-1@} - \Hat\mu)
+ \over
+ \sum_@{i = 1@}^@{n@} (x_@{i@} - \Hat\mu) (x_@{i@} - \Hat\mu)@}
+@end example
+@end ifinfo
+@end deftypefun
+
+
+@deftypefun double gsl_stats_lag1_autocorrelation_m (const double @var{data}[], const size_t @var{stride}, const size_t @var{n}, const double @var{mean})
+This function computes the lag-1 autocorrelation of the dataset
+@var{data} using the given value of the mean @var{mean}.
+
+@end deftypefun
+
+@node Covariance
+@section Covariance
+@cindex covariance, of two datasets
+
+@deftypefun double gsl_stats_covariance (const double @var{data1}[], const size_t @var{stride1}, const double @var{data2}[], const size_t @var{stride2}, const size_t @var{n})
+This function computes the covariance of the datasets @var{data1} and
+@var{data2} which must both be of the same length @var{n}.
+@tex
+\beforedisplay
+$$
+covar = {1 \over (n - 1)} \sum_{i = 1}^{n} (x_{i} - \Hat x) (y_{i} - \Hat y)
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+covar = (1/(n - 1)) \sum_@{i = 1@}^@{n@} (x_i - \Hat x) (y_i - \Hat y)
+@end example
+@end ifinfo
+@end deftypefun
+
+@deftypefun double gsl_stats_covariance_m (const double @var{data1}[], const size_t @var{stride1}, const double @var{data2}[], const size_t @var{stride2}, const size_t @var{n}, const double @var{mean1}, const double @var{mean2})
+This function computes the covariance of the datasets @var{data1} and
+@var{data2} using the given values of the means, @var{mean1} and
+@var{mean2}. This is useful if you have already computed the means of
+@var{data1} and @var{data2} and want to avoid recomputing them.
+@end deftypefun
+
+
+@node Weighted Samples
+@section Weighted Samples
+
+The functions described in this section allow the computation of
+statistics for weighted samples. The functions accept an array of
+samples, @math{x_i}, with associated weights, @math{w_i}. Each sample
+@math{x_i} is considered as having been drawn from a Gaussian
+distribution with variance @math{\sigma_i^2}. The sample weight
+@math{w_i} is defined as the reciprocal of this variance, @math{w_i =
+1/\sigma_i^2}. Setting a weight to zero corresponds to removing a
+sample from a dataset.
+
+@deftypefun double gsl_stats_wmean (const double @var{w}[], size_t @var{wstride}, const double @var{data}[], size_t @var{stride}, size_t @var{n})
+This function returns the weighted mean of the dataset @var{data} with
+stride @var{stride} and length @var{n}, using the set of weights @var{w}
+with stride @var{wstride} and length @var{n}. The weighted mean is defined as,
+@tex
+\beforedisplay
+$$
+{\Hat\mu} = {{\sum w_i x_i} \over {\sum w_i}}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+\Hat\mu = (\sum w_i x_i) / (\sum w_i)
+@end example
+@end ifinfo
+@end deftypefun
+
+
+@deftypefun double gsl_stats_wvariance (const double @var{w}[], size_t @var{wstride}, const double @var{data}[], size_t @var{stride}, size_t @var{n})
+This function returns the estimated variance of the dataset @var{data}
+with stride @var{stride} and length @var{n}, using the set of weights
+@var{w} with stride @var{wstride} and length @var{n}. The estimated
+variance of a weighted dataset is defined as,
+@tex
+\beforedisplay
+$$
+\Hat\sigma^2 = {{\sum w_i} \over {(\sum w_i)^2 - \sum (w_i^2)}}
+ \sum w_i (x_i - \Hat\mu)^2
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+\Hat\sigma^2 = ((\sum w_i)/((\sum w_i)^2 - \sum (w_i^2)))
+ \sum w_i (x_i - \Hat\mu)^2
+@end example
+
+@end ifinfo
+@noindent
+Note that this expression reduces to an unweighted variance with the
+familiar @math{1/(N-1)} factor when there are @math{N} equal non-zero
+weights.
+@end deftypefun
+
+@deftypefun double gsl_stats_wvariance_m (const double @var{w}[], size_t @var{wstride}, const double @var{data}[], size_t @var{stride}, size_t @var{n}, double @var{wmean})
+This function returns the estimated variance of the weighted dataset
+@var{data} using the given weighted mean @var{wmean}.
+@end deftypefun
+
+@deftypefun double gsl_stats_wsd (const double @var{w}[], size_t @var{wstride}, const double @var{data}[], size_t @var{stride}, size_t @var{n})
+The standard deviation is defined as the square root of the variance.
+This function returns the square root of the corresponding variance
+function @code{gsl_stats_wvariance} above.
+@end deftypefun
+
+@deftypefun double gsl_stats_wsd_m (const double @var{w}[], size_t @var{wstride}, const double @var{data}[], size_t @var{stride}, size_t @var{n}, double @var{wmean})
+This function returns the square root of the corresponding variance
+function @code{gsl_stats_wvariance_m} above.
+@end deftypefun
+
+@deftypefun double gsl_stats_wvariance_with_fixed_mean (const double @var{w}[], size_t @var{wstride}, const double @var{data}[], size_t @var{stride}, size_t @var{n}, const double @var{mean})
+This function computes an unbiased estimate of the variance of weighted
+dataset @var{data} when the population mean @var{mean} of the underlying
+distribution is known @emph{a priori}. In this case the estimator for
+the variance replaces the sample mean @math{\Hat\mu} by the known
+population mean @math{\mu},
+@tex
+\beforedisplay
+$$
+\Hat\sigma^2 = {{\sum w_i (x_i - \mu)^2} \over {\sum w_i}}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+\Hat\sigma^2 = (\sum w_i (x_i - \mu)^2) / (\sum w_i)
+@end example
+@end ifinfo
+@end deftypefun
+
+@deftypefun double gsl_stats_wsd_with_fixed_mean (const double @var{w}[], size_t @var{wstride}, const double @var{data}[], size_t @var{stride}, size_t @var{n}, const double @var{mean})
+The standard deviation is defined as the square root of the variance.
+This function returns the square root of the corresponding variance
+function above.
+@end deftypefun
+
+@deftypefun double gsl_stats_wabsdev (const double @var{w}[], size_t @var{wstride}, const double @var{data}[], size_t @var{stride}, size_t @var{n})
+This function computes the weighted absolute deviation from the weighted
+mean of @var{data}. The absolute deviation from the mean is defined as,
+@tex
+\beforedisplay
+$$
+absdev = {{\sum w_i |x_i - \Hat\mu|} \over {\sum w_i}}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+absdev = (\sum w_i |x_i - \Hat\mu|) / (\sum w_i)
+@end example
+@end ifinfo
+@end deftypefun
+
+@deftypefun double gsl_stats_wabsdev_m (const double @var{w}[], size_t @var{wstride}, const double @var{data}[], size_t @var{stride}, size_t @var{n}, double @var{wmean})
+This function computes the absolute deviation of the weighted dataset
+@var{data} about the given weighted mean @var{wmean}.
+@end deftypefun
+
+@deftypefun double gsl_stats_wskew (const double @var{w}[], size_t @var{wstride}, const double @var{data}[], size_t @var{stride}, size_t @var{n})
+This function computes the weighted skewness of the dataset @var{data}.
+@tex
+\beforedisplay
+$$
+skew = {{\sum w_i ((x_i - xbar)/\sigma)^3} \over {\sum w_i}}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+skew = (\sum w_i ((x_i - xbar)/\sigma)^3) / (\sum w_i)
+@end example
+@end ifinfo
+@end deftypefun
+
+@deftypefun double gsl_stats_wskew_m_sd (const double @var{w}[], size_t @var{wstride}, const double @var{data}[], size_t @var{stride}, size_t @var{n}, double @var{wmean}, double @var{wsd})
+This function computes the weighted skewness of the dataset @var{data}
+using the given values of the weighted mean and weighted standard
+deviation, @var{wmean} and @var{wsd}.
+@end deftypefun
+
+@deftypefun double gsl_stats_wkurtosis (const double @var{w}[], size_t @var{wstride}, const double @var{data}[], size_t @var{stride}, size_t @var{n})
+This function computes the weighted kurtosis of the dataset @var{data}.
+
+@tex
+\beforedisplay
+$$
+kurtosis = {{\sum w_i ((x_i - xbar)/sigma)^4} \over {\sum w_i}} - 3
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+kurtosis = ((\sum w_i ((x_i - xbar)/sigma)^4) / (\sum w_i)) - 3
+@end example
+@end ifinfo
+@end deftypefun
+
+@deftypefun double gsl_stats_wkurtosis_m_sd (const double @var{w}[], size_t @var{wstride}, const double @var{data}[], size_t @var{stride}, size_t @var{n}, double @var{wmean}, double @var{wsd})
+This function computes the weighted kurtosis of the dataset @var{data}
+using the given values of the weighted mean and weighted standard
+deviation, @var{wmean} and @var{wsd}.
+@end deftypefun
+
+@node Maximum and Minimum values
+@section Maximum and Minimum values
+
+The following functions find the maximum and minimum values of a
+dataset (or their indices). If the data contains @code{NaN}s then a
+@code{NaN} will be returned, since the maximum or minimum value is
+undefined. For functions which return an index, the location of the
+first @code{NaN} in the array is returned.
+
+@deftypefun double gsl_stats_max (const double @var{data}[], size_t @var{stride}, size_t @var{n})
+This function returns the maximum value in @var{data}, a dataset of
+length @var{n} with stride @var{stride}. The maximum value is defined
+as the value of the element @math{x_i} which satisfies @c{$x_i \ge x_j$}
+@math{x_i >= x_j} for all @math{j}.
+
+If you want instead to find the element with the largest absolute
+magnitude you will need to apply @code{fabs} or @code{abs} to your data
+before calling this function.
+@end deftypefun
+
+@deftypefun double gsl_stats_min (const double @var{data}[], size_t @var{stride}, size_t @var{n})
+This function returns the minimum value in @var{data}, a dataset of
+length @var{n} with stride @var{stride}. The minimum value is defined
+as the value of the element @math{x_i} which satisfies @c{$x_i \le x_j$}
+@math{x_i <= x_j} for all @math{j}.
+
+If you want instead to find the element with the smallest absolute
+magnitude you will need to apply @code{fabs} or @code{abs} to your data
+before calling this function.
+@end deftypefun
+
+@deftypefun void gsl_stats_minmax (double * @var{min}, double * @var{max}, const double @var{data}[], size_t @var{stride}, size_t @var{n})
+This function finds both the minimum and maximum values @var{min},
+@var{max} in @var{data} in a single pass.
+@end deftypefun
+
+@deftypefun size_t gsl_stats_max_index (const double @var{data}[], size_t @var{stride}, size_t @var{n})
+This function returns the index of the maximum value in @var{data}, a
+dataset of length @var{n} with stride @var{stride}. The maximum value is
+defined as the value of the element @math{x_i} which satisfies
+@c{$x_i \ge x_j$}
+@math{x_i >= x_j} for all @math{j}. When there are several equal maximum
+elements then the first one is chosen.
+@end deftypefun
+
+@deftypefun size_t gsl_stats_min_index (const double @var{data}[], size_t @var{stride}, size_t @var{n})
+This function returns the index of the minimum value in @var{data}, a
+dataset of length @var{n} with stride @var{stride}. The minimum value
+is defined as the value of the element @math{x_i} which satisfies
+@c{$x_i \ge x_j$}
+@math{x_i >= x_j} for all @math{j}. When there are several equal
+minimum elements then the first one is chosen.
+@end deftypefun
+
+@deftypefun void gsl_stats_minmax_index (size_t * @var{min_index}, size_t * @var{max_index}, const double @var{data}[], size_t @var{stride}, size_t @var{n})
+This function returns the indexes @var{min_index}, @var{max_index} of
+the minimum and maximum values in @var{data} in a single pass.
+@end deftypefun
+
+@node Median and Percentiles
+@section Median and Percentiles
+
+The median and percentile functions described in this section operate on
+sorted data. For convenience we use @dfn{quantiles}, measured on a scale
+of 0 to 1, instead of percentiles (which use a scale of 0 to 100).
+
+@deftypefun double gsl_stats_median_from_sorted_data (const double @var{sorted_data}[], size_t @var{stride}, size_t @var{n})
+This function returns the median value of @var{sorted_data}, a dataset
+of length @var{n} with stride @var{stride}. The elements of the array
+must be in ascending numerical order. There are no checks to see
+whether the data are sorted, so the function @code{gsl_sort} should
+always be used first.
+
+When the dataset has an odd number of elements the median is the value
+of element @math{(n-1)/2}. When the dataset has an even number of
+elements the median is the mean of the two nearest middle values,
+elements @math{(n-1)/2} and @math{n/2}. Since the algorithm for
+computing the median involves interpolation this function always returns
+a floating-point number, even for integer data types.
+@end deftypefun
+
+@deftypefun double gsl_stats_quantile_from_sorted_data (const double @var{sorted_data}[], size_t @var{stride}, size_t @var{n}, double @var{f})
+This function returns a quantile value of @var{sorted_data}, a
+double-precision array of length @var{n} with stride @var{stride}. The
+elements of the array must be in ascending numerical order. The
+quantile is determined by the @var{f}, a fraction between 0 and 1. For
+example, to compute the value of the 75th percentile @var{f} should have
+the value 0.75.
+
+There are no checks to see whether the data are sorted, so the function
+@code{gsl_sort} should always be used first.
+
+The quantile is found by interpolation, using the formula
+@tex
+\beforedisplay
+$$
+\hbox{quantile} = (1 - \delta) x_i + \delta x_{i+1}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+quantile = (1 - \delta) x_i + \delta x_@{i+1@}
+@end example
+
+@end ifinfo
+@noindent
+where @math{i} is @code{floor}(@math{(n - 1)f}) and @math{\delta} is
+@math{(n-1)f - i}.
+
+Thus the minimum value of the array (@code{data[0*stride]}) is given by
+@var{f} equal to zero, the maximum value (@code{data[(n-1)*stride]}) is
+given by @var{f} equal to one and the median value is given by @var{f}
+equal to 0.5. Since the algorithm for computing quantiles involves
+interpolation this function always returns a floating-point number, even
+for integer data types.
+@end deftypefun
+
+
+@comment @node Statistical tests
+@comment @section Statistical tests
+
+@comment FIXME, do more work on the statistical tests
+
+@comment -@deftypefun double gsl_stats_ttest (const double @var{data1}[], double @var{data2}[], size_t @var{n1}, size_t @var{n2})
+@comment -@deftypefunx Statistics double gsl_stats_int_ttest (const double @var{data1}[], double @var{data2}[], size_t @var{n1}, size_t @var{n2})
+
+@comment The function @code{gsl_stats_ttest} computes the t-test statistic for
+@comment the two arrays @var{data1}[] and @var{data2}[], of lengths @var{n1} and
+@comment -@var{n2} respectively.
+
+@comment The t-test statistic measures the difference between the means of two
+@comment datasets.
+
+@node Example statistical programs
+@section Examples
+Here is a basic example of how to use the statistical functions:
+
+@example
+@verbatiminclude examples/stat.c
+@end example
+
+The program should produce the following output,
+
+@example
+@verbatiminclude examples/stat.out
+@end example
+
+
+Here is an example using sorted data,
+
+@example
+@verbatiminclude examples/statsort.c
+@end example
+
+This program should produce the following output,
+
+@example
+@verbatiminclude examples/statsort.out
+@end example
+
+@node Statistics References and Further Reading
+@section References and Further Reading
+
+The standard reference for almost any topic in statistics is the
+multi-volume @cite{Advanced Theory of Statistics} by Kendall and Stuart.
+
+@itemize @asis
+@item
+Maurice Kendall, Alan Stuart, and J. Keith Ord.
+@cite{The Advanced Theory of Statistics} (multiple volumes)
+reprinted as @cite{Kendall's Advanced Theory of Statistics}.
+Wiley, ISBN 047023380X.
+@end itemize
+
+@noindent
+Many statistical concepts can be more easily understood by a Bayesian
+approach. The following book by Gelman, Carlin, Stern and Rubin gives a
+comprehensive coverage of the subject.
+
+@itemize @asis
+@item
+Andrew Gelman, John B. Carlin, Hal S. Stern, Donald B. Rubin.
+@cite{Bayesian Data Analysis}.
+Chapman & Hall, ISBN 0412039915.
+@end itemize
+
+@noindent
+For physicists the Particle Data Group provides useful reviews of
+Probability and Statistics in the ``Mathematical Tools'' section of its
+Annual Review of Particle Physics.
+
+@itemize @asis
+@item
+@cite{Review of Particle Properties}
+R.M. Barnett et al., Physical Review D54, 1 (1996)
+@end itemize
+
+@noindent
+The Review of Particle Physics is available online at
+the website @uref{http://pdg.lbl.gov/}.
+
+
diff --git a/gsl-1.9/doc/sum.texi b/gsl-1.9/doc/sum.texi
new file mode 100644
index 0000000..9b11675
--- /dev/null
+++ b/gsl-1.9/doc/sum.texi
@@ -0,0 +1,186 @@
+@cindex acceleration of series
+@cindex summation, acceleration
+@cindex series, acceleration
+@cindex u-transform for series
+@cindex Levin u-transform
+@cindex convergence, accelerating a series
+
+The functions described in this chapter accelerate the convergence of a
+series using the Levin @math{u}-transform. This method takes a small number of
+terms from the start of a series and uses a systematic approximation to
+compute an extrapolated value and an estimate of its error. The
+@math{u}-transform works for both convergent and divergent series, including
+asymptotic series.
+
+These functions are declared in the header file @file{gsl_sum.h}.
+
+@menu
+* Acceleration functions::
+* Acceleration functions without error estimation::
+* Example of accelerating a series::
+* Series Acceleration References::
+@end menu
+
+@node Acceleration functions
+@section Acceleration functions
+
+The following functions compute the full Levin @math{u}-transform of a series
+with its error estimate. The error estimate is computed by propagating
+rounding errors from each term through to the final extrapolation.
+
+These functions are intended for summing analytic series where each term
+is known to high accuracy, and the rounding errors are assumed to
+originate from finite precision. They are taken to be relative errors of
+order @code{GSL_DBL_EPSILON} for each term.
+
+The calculation of the error in the extrapolated value is an
+@math{O(N^2)} process, which is expensive in time and memory. A faster
+but less reliable method which estimates the error from the convergence
+of the extrapolated value is described in the next section. For the
+method described here a full table of intermediate values and
+derivatives through to @math{O(N)} must be computed and stored, but this
+does give a reliable error estimate.
+
+@deftypefun {gsl_sum_levin_u_workspace *} gsl_sum_levin_u_alloc (size_t @var{n})
+This function allocates a workspace for a Levin @math{u}-transform of @var{n}
+terms. The size of the workspace is @math{O(2n^2 + 3n)}.
+@end deftypefun
+
+@deftypefun void gsl_sum_levin_u_free (gsl_sum_levin_u_workspace * @var{w})
+This function frees the memory associated with the workspace @var{w}.
+@end deftypefun
+
+@deftypefun int gsl_sum_levin_u_accel (const double * @var{array}, size_t @var{array_size}, gsl_sum_levin_u_workspace * @var{w}, double * @var{sum_accel}, double * @var{abserr})
+This function takes the terms of a series in @var{array} of size
+@var{array_size} and computes the extrapolated limit of the series using
+a Levin @math{u}-transform. Additional working space must be provided in
+@var{w}. The extrapolated sum is stored in @var{sum_accel}, with an
+estimate of the absolute error stored in @var{abserr}. The actual
+term-by-term sum is returned in @code{w->sum_plain}. The algorithm
+calculates the truncation error (the difference between two successive
+extrapolations) and round-off error (propagated from the individual
+terms) to choose an optimal number of terms for the extrapolation.
+All the terms of the series passed in through @var{array} should be non-zero.
+@end deftypefun
+
+
+@node Acceleration functions without error estimation
+@section Acceleration functions without error estimation
+
+The functions described in this section compute the Levin @math{u}-transform of
+series and attempt to estimate the error from the ``truncation error'' in
+the extrapolation, the difference between the final two approximations.
+Using this method avoids the need to compute an intermediate table of
+derivatives because the error is estimated from the behavior of the
+extrapolated value itself. Consequently this algorithm is an @math{O(N)}
+process and only requires @math{O(N)} terms of storage. If the series
+converges sufficiently fast then this procedure can be acceptable. It
+is appropriate to use this method when there is a need to compute many
+extrapolations of series with similar convergence properties at high-speed.
+For example, when numerically integrating a function defined by a
+parameterized series where the parameter varies only slightly. A
+reliable error estimate should be computed first using the full
+algorithm described above in order to verify the consistency of the
+results.
+
+@deftypefun {gsl_sum_levin_utrunc_workspace *} gsl_sum_levin_utrunc_alloc (size_t @var{n})
+This function allocates a workspace for a Levin @math{u}-transform of @var{n}
+terms, without error estimation. The size of the workspace is
+@math{O(3n)}.
+@end deftypefun
+
+@deftypefun void gsl_sum_levin_utrunc_free (gsl_sum_levin_utrunc_workspace * @var{w})
+This function frees the memory associated with the workspace @var{w}.
+@end deftypefun
+
+@deftypefun int gsl_sum_levin_utrunc_accel (const double * @var{array}, size_t @var{array_size}, gsl_sum_levin_utrunc_workspace * @var{w}, double * @var{sum_accel}, double * @var{abserr_trunc})
+This function takes the terms of a series in @var{array} of size
+@var{array_size} and computes the extrapolated limit of the series using
+a Levin @math{u}-transform. Additional working space must be provided in
+@var{w}. The extrapolated sum is stored in @var{sum_accel}. The actual
+term-by-term sum is returned in @code{w->sum_plain}. The algorithm
+terminates when the difference between two successive extrapolations
+reaches a minimum or is sufficiently small. The difference between these
+two values is used as estimate of the error and is stored in
+@var{abserr_trunc}. To improve the reliability of the algorithm the
+extrapolated values are replaced by moving averages when calculating the
+truncation error, smoothing out any fluctuations.
+@end deftypefun
+
+
+@node Example of accelerating a series
+@section Examples
+
+The following code calculates an estimate of @math{\zeta(2) = \pi^2 / 6}
+using the series,
+@tex
+\beforedisplay
+$$
+\zeta(2) = 1 + 1/2^2 + 1/3^2 + 1/4^2 + \dots
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+\zeta(2) = 1 + 1/2^2 + 1/3^2 + 1/4^2 + ...
+@end example
+
+@end ifinfo
+@noindent
+After @var{N} terms the error in the sum is @math{O(1/N)}, making direct
+summation of the series converge slowly.
+
+@example
+@verbatiminclude examples/sum.c
+@end example
+
+@noindent
+The output below shows that the Levin @math{u}-transform is able to obtain an
+estimate of the sum to 1 part in
+@c{$10^{10}$}
+@math{10^10} using the first eleven terms of the series. The
+error estimate returned by the function is also accurate, giving
+the correct number of significant digits.
+
+@example
+$ ./a.out
+@verbatiminclude examples/sum.out
+@end example
+
+@noindent
+Note that a direct summation of this series would require
+@c{$10^{10}$}
+@math{10^10} terms to achieve the same precision as the accelerated
+sum does in 13 terms.
+
+@node Series Acceleration References
+@section References and Further Reading
+
+The algorithms used by these functions are described in the following papers,
+
+@itemize @asis
+@item
+T. Fessler, W.F. Ford, D.A. Smith,
+@sc{hurry}: An acceleration algorithm for scalar sequences and series
+@cite{ACM Transactions on Mathematical Software}, 9(3):346--354, 1983.
+and Algorithm 602 9(3):355--357, 1983.
+@end itemize
+
+@noindent
+The theory of the @math{u}-transform was presented by Levin,
+
+@itemize @asis
+@item
+D. Levin,
+Development of Non-Linear Transformations for Improving Convergence of
+Sequences, @cite{Intern.@: J.@: Computer Math.} B3:371--388, 1973.
+@end itemize
+
+@noindent
+A review paper on the Levin Transform is available online,
+@itemize @asis
+@item
+Herbert H. H. Homeier, Scalar Levin-Type Sequence Transformations,
+@uref{http://arxiv.org/abs/math/0005209}.
+@end itemize
diff --git a/gsl-1.9/doc/texinfo.tex b/gsl-1.9/doc/texinfo.tex
new file mode 100644
index 0000000..c93912a
--- /dev/null
+++ b/gsl-1.9/doc/texinfo.tex
@@ -0,0 +1,7086 @@
+% texinfo.tex -- TeX macros to handle Texinfo files.
+%
+% Load plain if necessary, i.e., if running under initex.
+\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
+%
+\def\texinfoversion{2004-11-25.16}
+%
+% Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
+% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software
+% Foundation, Inc.
+%
+% This texinfo.tex file is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License as
+% published by the Free Software Foundation; either version 2, or (at
+% your option) any later version.
+%
+% This texinfo.tex file is distributed in the hope that it will be
+% useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+% of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+% General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this texinfo.tex file; see the file COPYING. If not, write
+% to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+% Boston, MA 02111-1307, USA.
+%
+% As a special exception, when this file is read by TeX when processing
+% a Texinfo source document, you may use the result without
+% restriction. (This has been our intent since Texinfo was invented.)
+%
+% Please try the latest version of texinfo.tex before submitting bug
+% reports; you can get the latest version from:
+% http://www.gnu.org/software/texinfo/ (the Texinfo home page), or
+% ftp://tug.org/tex/texinfo.tex
+% (and all CTAN mirrors, see http://www.ctan.org).
+% The texinfo.tex in any given distribution could well be out
+% of date, so if that's what you're using, please check.
+%
+% Send bug reports to bug-texinfo@gnu.org. Please include including a
+% complete document in each bug report with which we can reproduce the
+% problem. Patches are, of course, greatly appreciated.
+%
+% To process a Texinfo manual with TeX, it's most reliable to use the
+% texi2dvi shell script that comes with the distribution. For a simple
+% manual foo.texi, however, you can get away with this:
+% tex foo.texi
+% texindex foo.??
+% tex foo.texi
+% tex foo.texi
+% dvips foo.dvi -o # or whatever; this makes foo.ps.
+% The extra TeX runs get the cross-reference information correct.
+% Sometimes one run after texindex suffices, and sometimes you need more
+% than two; texi2dvi does it as many times as necessary.
+%
+% It is possible to adapt texinfo.tex for other languages, to some
+% extent. You can get the existing language-specific files from the
+% full Texinfo distribution.
+%
+% The GNU Texinfo home page is http://www.gnu.org/software/texinfo.
+
+
+\message{Loading texinfo [version \texinfoversion]:}
+
+% If in a .fmt file, print the version number
+% and turn on active characters that we couldn't do earlier because
+% they might have appeared in the input file name.
+\everyjob{\message{[Texinfo version \texinfoversion]}%
+ \catcode`+=\active \catcode`\_=\active}
+
+\message{Basics,}
+\chardef\other=12
+
+% We never want plain's \outer definition of \+ in Texinfo.
+% For @tex, we can use \tabalign.
+\let\+ = \relax
+
+% Save some plain tex macros whose names we will redefine.
+\let\ptexb=\b
+\let\ptexbullet=\bullet
+\let\ptexc=\c
+\let\ptexcomma=\,
+\let\ptexdot=\.
+\let\ptexdots=\dots
+\let\ptexend=\end
+\let\ptexequiv=\equiv
+\let\ptexexclam=\!
+\let\ptexfootnote=\footnote
+\let\ptexgtr=>
+\let\ptexhat=^
+\let\ptexi=\i
+\let\ptexindent=\indent
+\let\ptexinsert=\insert
+\let\ptexlbrace=\{
+\let\ptexless=<
+\let\ptexnewwrite\newwrite
+\let\ptexnoindent=\noindent
+\let\ptexplus=+
+\let\ptexrbrace=\}
+\let\ptexslash=\/
+\let\ptexstar=\*
+\let\ptext=\t
+
+% If this character appears in an error message or help string, it
+% starts a new line in the output.
+\newlinechar = `^^J
+
+% Use TeX 3.0's \inputlineno to get the line number, for better error
+% messages, but if we're using an old version of TeX, don't do anything.
+%
+\ifx\inputlineno\thisisundefined
+ \let\linenumber = \empty % Pre-3.0.
+\else
+ \def\linenumber{l.\the\inputlineno:\space}
+\fi
+
+% Set up fixed words for English if not already set.
+\ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi
+\ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi
+\ifx\putwordfile\undefined \gdef\putwordfile{file}\fi
+\ifx\putwordin\undefined \gdef\putwordin{in}\fi
+\ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi
+\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi
+\ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi
+\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi
+\ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi
+\ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi
+\ifx\putwordof\undefined \gdef\putwordof{of}\fi
+\ifx\putwordon\undefined \gdef\putwordon{on}\fi
+\ifx\putwordpage\undefined \gdef\putwordpage{page}\fi
+\ifx\putwordsection\undefined \gdef\putwordsection{section}\fi
+\ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi
+\ifx\putwordsee\undefined \gdef\putwordsee{see}\fi
+\ifx\putwordSee\undefined \gdef\putwordSee{See}\fi
+\ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi
+\ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi
+%
+\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi
+\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi
+\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi
+\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi
+\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi
+\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi
+\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi
+\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi
+\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi
+\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi
+\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi
+\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi
+%
+\ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi
+\ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi
+\ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi
+\ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi
+\ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi
+
+% In some macros, we cannot use the `\? notation---the left quote is
+% in some cases the escape char.
+\chardef\colonChar = `\:
+\chardef\commaChar = `\,
+\chardef\dotChar = `\.
+\chardef\exclamChar= `\!
+\chardef\questChar = `\?
+\chardef\semiChar = `\;
+\chardef\underChar = `\_
+
+\chardef\spaceChar = `\ %
+\chardef\spacecat = 10
+\def\spaceisspace{\catcode\spaceChar=\spacecat}
+
+% Ignore a token.
+%
+\def\gobble#1{}
+
+% The following is used inside several \edef's.
+\def\makecsname#1{\expandafter\noexpand\csname#1\endcsname}
+
+% Hyphenation fixes.
+\hyphenation{
+ Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script
+ ap-pen-dix bit-map bit-maps
+ data-base data-bases eshell fall-ing half-way long-est man-u-script
+ man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm
+ par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces
+ spell-ing spell-ings
+ stand-alone strong-est time-stamp time-stamps which-ever white-space
+ wide-spread wrap-around
+}
+
+% Margin to add to right of even pages, to left of odd pages.
+\newdimen\bindingoffset
+\newdimen\normaloffset
+\newdimen\pagewidth \newdimen\pageheight
+
+% For a final copy, take out the rectangles
+% that mark overfull boxes (in case you have decided
+% that the text looks ok even though it passes the margin).
+%
+\def\finalout{\overfullrule=0pt}
+
+% @| inserts a changebar to the left of the current line. It should
+% surround any changed text. This approach does *not* work if the
+% change spans more than two lines of output. To handle that, we would
+% have adopt a much more difficult approach (putting marks into the main
+% vertical list for the beginning and end of each change).
+%
+\def\|{%
+ % \vadjust can only be used in horizontal mode.
+ \leavevmode
+ %
+ % Append this vertical mode material after the current line in the output.
+ \vadjust{%
+ % We want to insert a rule with the height and depth of the current
+ % leading; that is exactly what \strutbox is supposed to record.
+ \vskip-\baselineskip
+ %
+ % \vadjust-items are inserted at the left edge of the type. So
+ % the \llap here moves out into the left-hand margin.
+ \llap{%
+ %
+ % For a thicker or thinner bar, change the `1pt'.
+ \vrule height\baselineskip width1pt
+ %
+ % This is the space between the bar and the text.
+ \hskip 12pt
+ }%
+ }%
+}
+
+% Sometimes it is convenient to have everything in the transcript file
+% and nothing on the terminal. We don't just call \tracingall here,
+% since that produces some useless output on the terminal. We also make
+% some effort to order the tracing commands to reduce output in the log
+% file; cf. trace.sty in LaTeX.
+%
+\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
+\def\loggingall{%
+ \tracingstats2
+ \tracingpages1
+ \tracinglostchars2 % 2 gives us more in etex
+ \tracingparagraphs1
+ \tracingoutput1
+ \tracingmacros2
+ \tracingrestores1
+ \showboxbreadth\maxdimen \showboxdepth\maxdimen
+ \ifx\eTeXversion\undefined\else % etex gives us more logging
+ \tracingscantokens1
+ \tracingifs1
+ \tracinggroups1
+ \tracingnesting2
+ \tracingassigns1
+ \fi
+ \tracingcommands3 % 3 gives us more in etex
+ \errorcontextlines16
+}%
+
+% add check for \lastpenalty to plain's definitions. If the last thing
+% we did was a \nobreak, we don't want to insert more space.
+%
+\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount
+ \removelastskip\penalty-50\smallskip\fi\fi}
+\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount
+ \removelastskip\penalty-100\medskip\fi\fi}
+\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount
+ \removelastskip\penalty-200\bigskip\fi\fi}
+
+% For @cropmarks command.
+% Do @cropmarks to get crop marks.
+%
+\newif\ifcropmarks
+\let\cropmarks = \cropmarkstrue
+%
+% Dimensions to add cropmarks at corners.
+% Added by P. A. MacKay, 12 Nov. 1986
+%
+\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
+\newdimen\cornerlong \cornerlong=1pc
+\newdimen\cornerthick \cornerthick=.3pt
+\newdimen\topandbottommargin \topandbottommargin=.75in
+
+% Main output routine.
+\chardef\PAGE = 255
+\output = {\onepageout{\pagecontents\PAGE}}
+
+\newbox\headlinebox
+\newbox\footlinebox
+
+% \onepageout takes a vbox as an argument. Note that \pagecontents
+% does insertions, but you have to call it yourself.
+\def\onepageout#1{%
+ \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi
+ %
+ \ifodd\pageno \advance\hoffset by \bindingoffset
+ \else \advance\hoffset by -\bindingoffset\fi
+ %
+ % Do this outside of the \shipout so @code etc. will be expanded in
+ % the headline as they should be, not taken literally (outputting ''code).
+ \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}%
+ \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}%
+ %
+ {%
+ % Have to do this stuff outside the \shipout because we want it to
+ % take effect in \write's, yet the group defined by the \vbox ends
+ % before the \shipout runs.
+ %
+ \escapechar = `\\ % use backslash in output files.
+ \indexdummies % don't expand commands in the output.
+ \normalturnoffactive % \ in index entries must not stay \, e.g., if
+ % the page break happens to be in the middle of an example.
+ \shipout\vbox{%
+ % Do this early so pdf references go to the beginning of the page.
+ \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi
+ %
+ \ifcropmarks \vbox to \outervsize\bgroup
+ \hsize = \outerhsize
+ \vskip-\topandbottommargin
+ \vtop to0pt{%
+ \line{\ewtop\hfil\ewtop}%
+ \nointerlineskip
+ \line{%
+ \vbox{\moveleft\cornerthick\nstop}%
+ \hfill
+ \vbox{\moveright\cornerthick\nstop}%
+ }%
+ \vss}%
+ \vskip\topandbottommargin
+ \line\bgroup
+ \hfil % center the page within the outer (page) hsize.
+ \ifodd\pageno\hskip\bindingoffset\fi
+ \vbox\bgroup
+ \fi
+ %
+ \unvbox\headlinebox
+ \pagebody{#1}%
+ \ifdim\ht\footlinebox > 0pt
+ % Only leave this space if the footline is nonempty.
+ % (We lessened \vsize for it in \oddfootingxxx.)
+ % The \baselineskip=24pt in plain's \makefootline has no effect.
+ \vskip 2\baselineskip
+ \unvbox\footlinebox
+ \fi
+ %
+ \ifcropmarks
+ \egroup % end of \vbox\bgroup
+ \hfil\egroup % end of (centering) \line\bgroup
+ \vskip\topandbottommargin plus1fill minus1fill
+ \boxmaxdepth = \cornerthick
+ \vbox to0pt{\vss
+ \line{%
+ \vbox{\moveleft\cornerthick\nsbot}%
+ \hfill
+ \vbox{\moveright\cornerthick\nsbot}%
+ }%
+ \nointerlineskip
+ \line{\ewbot\hfil\ewbot}%
+ }%
+ \egroup % \vbox from first cropmarks clause
+ \fi
+ }% end of \shipout\vbox
+ }% end of group with \normalturnoffactive
+ \advancepageno
+ \ifnum\outputpenalty>-20000 \else\dosupereject\fi
+}
+
+\newinsert\margin \dimen\margin=\maxdimen
+
+\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
+{\catcode`\@ =11
+\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
+% marginal hacks, juha@viisa.uucp (Juha Takala)
+\ifvoid\margin\else % marginal info is present
+ \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
+\dimen@=\dp#1 \unvbox#1
+\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
+\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
+}
+
+% Here are the rules for the cropmarks. Note that they are
+% offset so that the space between them is truly \outerhsize or \outervsize
+% (P. A. MacKay, 12 November, 1986)
+%
+\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
+\def\nstop{\vbox
+ {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
+\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
+\def\nsbot{\vbox
+ {\hrule height\cornerlong depth\cornerthick width\cornerthick}}
+
+% Parse an argument, then pass it to #1. The argument is the rest of
+% the input line (except we remove a trailing comment). #1 should be a
+% macro which expects an ordinary undelimited TeX argument.
+%
+\def\parsearg{\parseargusing{}}
+\def\parseargusing#1#2{%
+ \def\next{#2}%
+ \begingroup
+ \obeylines
+ \spaceisspace
+ #1%
+ \parseargline\empty% Insert the \empty token, see \finishparsearg below.
+}
+
+{\obeylines %
+ \gdef\parseargline#1^^M{%
+ \endgroup % End of the group started in \parsearg.
+ \argremovecomment #1\comment\ArgTerm%
+ }%
+}
+
+% First remove any @comment, then any @c comment.
+\def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm}
+\def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm}
+
+% Each occurence of `\^^M' or `<space>\^^M' is replaced by a single space.
+%
+% \argremovec might leave us with trailing space, e.g.,
+% @end itemize @c foo
+% This space token undergoes the same procedure and is eventually removed
+% by \finishparsearg.
+%
+\def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M}
+\def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M}
+\def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{%
+ \def\temp{#3}%
+ \ifx\temp\empty
+ % We cannot use \next here, as it holds the macro to run;
+ % thus we reuse \temp.
+ \let\temp\finishparsearg
+ \else
+ \let\temp\argcheckspaces
+ \fi
+ % Put the space token in:
+ \temp#1 #3\ArgTerm
+}
+
+% If a _delimited_ argument is enclosed in braces, they get stripped; so
+% to get _exactly_ the rest of the line, we had to prevent such situation.
+% We prepended an \empty token at the very beginning and we expand it now,
+% just before passing the control to \next.
+% (Similarily, we have to think about #3 of \argcheckspacesY above: it is
+% either the null string, or it ends with \^^M---thus there is no danger
+% that a pair of braces would be stripped.
+%
+% But first, we have to remove the trailing space token.
+%
+\def\finishparsearg#1 \ArgTerm{\expandafter\next\expandafter{#1}}
+
+% \parseargdef\foo{...}
+% is roughly equivalent to
+% \def\foo{\parsearg\Xfoo}
+% \def\Xfoo#1{...}
+%
+% Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my
+% favourite TeX trick. --kasal, 16nov03
+
+\def\parseargdef#1{%
+ \expandafter \doparseargdef \csname\string#1\endcsname #1%
+}
+\def\doparseargdef#1#2{%
+ \def#2{\parsearg#1}%
+ \def#1##1%
+}
+
+% Several utility definitions with active space:
+{
+ \obeyspaces
+ \gdef\obeyedspace{ }
+
+ % Make each space character in the input produce a normal interword
+ % space in the output. Don't allow a line break at this space, as this
+ % is used only in environments like @example, where each line of input
+ % should produce a line of output anyway.
+ %
+ \gdef\sepspaces{\obeyspaces\let =\tie}
+
+ % If an index command is used in an @example environment, any spaces
+ % therein should become regular spaces in the raw index file, not the
+ % expansion of \tie (\leavevmode \penalty \@M \ ).
+ \gdef\unsepspaces{\let =\space}
+}
+
+
+\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
+
+% Define the framework for environments in texinfo.tex. It's used like this:
+%
+% \envdef\foo{...}
+% \def\Efoo{...}
+%
+% It's the responsibility of \envdef to insert \begingroup before the
+% actual body; @end closes the group after calling \Efoo. \envdef also
+% defines \thisenv, so the current environment is known; @end checks
+% whether the environment name matches. The \checkenv macro can also be
+% used to check whether the current environment is the one expected.
+%
+% Non-false conditionals (@iftex, @ifset) don't fit into this, so they
+% are not treated as enviroments; they don't open a group. (The
+% implementation of @end takes care not to call \endgroup in this
+% special case.)
+
+
+% At runtime, environments start with this:
+\def\startenvironment#1{\begingroup\def\thisenv{#1}}
+% initialize
+\let\thisenv\empty
+
+% ... but they get defined via ``\envdef\foo{...}'':
+\long\def\envdef#1#2{\def#1{\startenvironment#1#2}}
+\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}}
+
+% Check whether we're in the right environment:
+\def\checkenv#1{%
+ \def\temp{#1}%
+ \ifx\thisenv\temp
+ \else
+ \badenverr
+ \fi
+}
+
+% Evironment mismatch, #1 expected:
+\def\badenverr{%
+ \errhelp = \EMsimple
+ \errmessage{This command can appear only \inenvironment\temp,
+ not \inenvironment\thisenv}%
+}
+\def\inenvironment#1{%
+ \ifx#1\empty
+ out of any environment%
+ \else
+ in environment \expandafter\string#1%
+ \fi
+}
+
+% @end foo executes the definition of \Efoo.
+% But first, it executes a specialized version of \checkenv
+%
+\parseargdef\end{%
+ \if 1\csname iscond.#1\endcsname
+ \else
+ % The general wording of \badenverr may not be ideal, but... --kasal, 06nov03
+ \expandafter\checkenv\csname#1\endcsname
+ \csname E#1\endcsname
+ \endgroup
+ \fi
+}
+
+\newhelp\EMsimple{Press RETURN to continue.}
+
+
+%% Simple single-character @ commands
+
+% @@ prints an @
+% Kludge this until the fonts are right (grr).
+\def\@{{\tt\char64}}
+
+% This is turned off because it was never documented
+% and you can use @w{...} around a quote to suppress ligatures.
+%% Define @` and @' to be the same as ` and '
+%% but suppressing ligatures.
+%\def\`{{`}}
+%\def\'{{'}}
+
+% Used to generate quoted braces.
+\def\mylbrace {{\tt\char123}}
+\def\myrbrace {{\tt\char125}}
+\let\{=\mylbrace
+\let\}=\myrbrace
+\begingroup
+ % Definitions to produce \{ and \} commands for indices,
+ % and @{ and @} for the aux file.
+ \catcode`\{ = \other \catcode`\} = \other
+ \catcode`\[ = 1 \catcode`\] = 2
+ \catcode`\! = 0 \catcode`\\ = \other
+ !gdef!lbracecmd[\{]%
+ !gdef!rbracecmd[\}]%
+ !gdef!lbraceatcmd[@{]%
+ !gdef!rbraceatcmd[@}]%
+!endgroup
+
+% @comma{} to avoid , parsing problems.
+\let\comma = ,
+
+% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
+% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
+\let\, = \c
+\let\dotaccent = \.
+\def\ringaccent#1{{\accent23 #1}}
+\let\tieaccent = \t
+\let\ubaraccent = \b
+\let\udotaccent = \d
+
+% Other special characters: @questiondown @exclamdown @ordf @ordm
+% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
+\def\questiondown{?`}
+\def\exclamdown{!`}
+\def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}}
+\def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}}
+
+% Dotless i and dotless j, used for accents.
+\def\imacro{i}
+\def\jmacro{j}
+\def\dotless#1{%
+ \def\temp{#1}%
+ \ifx\temp\imacro \ptexi
+ \else\ifx\temp\jmacro \j
+ \else \errmessage{@dotless can be used only with i or j}%
+ \fi\fi
+}
+
+% The \TeX{} logo, as in plain, but resetting the spacing so that a
+% period following counts as ending a sentence. (Idea found in latex.)
+%
+\edef\TeX{\TeX \spacefactor=1000 }
+
+% @LaTeX{} logo. Not quite the same results as the definition in
+% latex.ltx, since we use a different font for the raised A; it's most
+% convenient for us to use an explicitly smaller font, rather than using
+% the \scriptstyle font (since we don't reset \scriptstyle and
+% \scriptscriptstyle).
+%
+\def\LaTeX{%
+ L\kern-.36em
+ {\setbox0=\hbox{T}%
+ \vbox to \ht0{\hbox{\selectfonts\lllsize A}\vss}}%
+ \kern-.15em
+ \TeX
+}
+
+% Be sure we're in horizontal mode when doing a tie, since we make space
+% equivalent to this in @example-like environments. Otherwise, a space
+% at the beginning of a line will start with \penalty -- and
+% since \penalty is valid in vertical mode, we'd end up putting the
+% penalty on the vertical list instead of in the new paragraph.
+{\catcode`@ = 11
+ % Avoid using \@M directly, because that causes trouble
+ % if the definition is written into an index file.
+ \global\let\tiepenalty = \@M
+ \gdef\tie{\leavevmode\penalty\tiepenalty\ }
+}
+
+% @: forces normal size whitespace following.
+\def\:{\spacefactor=1000 }
+
+% @* forces a line break.
+\def\*{\hfil\break\hbox{}\ignorespaces}
+
+% @/ allows a line break.
+\let\/=\allowbreak
+
+% @. is an end-of-sentence period.
+\def\.{.\spacefactor=3000 }
+
+% @! is an end-of-sentence bang.
+\def\!{!\spacefactor=3000 }
+
+% @? is an end-of-sentence query.
+\def\?{?\spacefactor=3000 }
+
+% @w prevents a word break. Without the \leavevmode, @w at the
+% beginning of a paragraph, when TeX is still in vertical mode, would
+% produce a whole line of output instead of starting the paragraph.
+\def\w#1{\leavevmode\hbox{#1}}
+
+% @group ... @end group forces ... to be all on one page, by enclosing
+% it in a TeX vbox. We use \vtop instead of \vbox to construct the box
+% to keep its height that of a normal line. According to the rules for
+% \topskip (p.114 of the TeXbook), the glue inserted is
+% max (\topskip - \ht (first item), 0). If that height is large,
+% therefore, no glue is inserted, and the space between the headline and
+% the text is small, which looks bad.
+%
+% Another complication is that the group might be very large. This can
+% cause the glue on the previous page to be unduly stretched, because it
+% does not have much material. In this case, it's better to add an
+% explicit \vfill so that the extra space is at the bottom. The
+% threshold for doing this is if the group is more than \vfilllimit
+% percent of a page (\vfilllimit can be changed inside of @tex).
+%
+\newbox\groupbox
+\def\vfilllimit{0.7}
+%
+\envdef\group{%
+ \ifnum\catcode`\^^M=\active \else
+ \errhelp = \groupinvalidhelp
+ \errmessage{@group invalid in context where filling is enabled}%
+ \fi
+ \startsavinginserts
+ %
+ \setbox\groupbox = \vtop\bgroup
+ % Do @comment since we are called inside an environment such as
+ % @example, where each end-of-line in the input causes an
+ % end-of-line in the output. We don't want the end-of-line after
+ % the `@group' to put extra space in the output. Since @group
+ % should appear on a line by itself (according to the Texinfo
+ % manual), we don't worry about eating any user text.
+ \comment
+}
+%
+% The \vtop produces a box with normal height and large depth; thus, TeX puts
+% \baselineskip glue before it, and (when the next line of text is done)
+% \lineskip glue after it. Thus, space below is not quite equal to space
+% above. But it's pretty close.
+\def\Egroup{%
+ % To get correct interline space between the last line of the group
+ % and the first line afterwards, we have to propagate \prevdepth.
+ \endgraf % Not \par, as it may have been set to \lisppar.
+ \global\dimen1 = \prevdepth
+ \egroup % End the \vtop.
+ % \dimen0 is the vertical size of the group's box.
+ \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox
+ % \dimen2 is how much space is left on the page (more or less).
+ \dimen2 = \pageheight \advance\dimen2 by -\pagetotal
+ % if the group doesn't fit on the current page, and it's a big big
+ % group, force a page break.
+ \ifdim \dimen0 > \dimen2
+ \ifdim \pagetotal < \vfilllimit\pageheight
+ \page
+ \fi
+ \fi
+ \box\groupbox
+ \prevdepth = \dimen1
+ \checkinserts
+}
+%
+% TeX puts in an \escapechar (i.e., `@') at the beginning of the help
+% message, so this ends up printing `@group can only ...'.
+%
+\newhelp\groupinvalidhelp{%
+group can only be used in environments such as @example,^^J%
+where each line of input produces a line of output.}
+
+% @need space-in-mils
+% forces a page break if there is not space-in-mils remaining.
+
+\newdimen\mil \mil=0.001in
+
+% Old definition--didn't work.
+%\parseargdef\need{\par %
+%% This method tries to make TeX break the page naturally
+%% if the depth of the box does not fit.
+%{\baselineskip=0pt%
+%\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak
+%\prevdepth=-1000pt
+%}}
+
+\parseargdef\need{%
+ % Ensure vertical mode, so we don't make a big box in the middle of a
+ % paragraph.
+ \par
+ %
+ % If the @need value is less than one line space, it's useless.
+ \dimen0 = #1\mil
+ \dimen2 = \ht\strutbox
+ \advance\dimen2 by \dp\strutbox
+ \ifdim\dimen0 > \dimen2
+ %
+ % Do a \strut just to make the height of this box be normal, so the
+ % normal leading is inserted relative to the preceding line.
+ % And a page break here is fine.
+ \vtop to #1\mil{\strut\vfil}%
+ %
+ % TeX does not even consider page breaks if a penalty added to the
+ % main vertical list is 10000 or more. But in order to see if the
+ % empty box we just added fits on the page, we must make it consider
+ % page breaks. On the other hand, we don't want to actually break the
+ % page after the empty box. So we use a penalty of 9999.
+ %
+ % There is an extremely small chance that TeX will actually break the
+ % page at this \penalty, if there are no other feasible breakpoints in
+ % sight. (If the user is using lots of big @group commands, which
+ % almost-but-not-quite fill up a page, TeX will have a hard time doing
+ % good page breaking, for example.) However, I could not construct an
+ % example where a page broke at this \penalty; if it happens in a real
+ % document, then we can reconsider our strategy.
+ \penalty9999
+ %
+ % Back up by the size of the box, whether we did a page break or not.
+ \kern -#1\mil
+ %
+ % Do not allow a page break right after this kern.
+ \nobreak
+ \fi
+}
+
+% @br forces paragraph break (and is undocumented).
+
+\let\br = \par
+
+% @page forces the start of a new page.
+%
+\def\page{\par\vfill\supereject}
+
+% @exdent text....
+% outputs text on separate line in roman font, starting at standard page margin
+
+% This records the amount of indent in the innermost environment.
+% That's how much \exdent should take out.
+\newskip\exdentamount
+
+% This defn is used inside fill environments such as @defun.
+\parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}
+
+% This defn is used inside nofill environments such as @example.
+\parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount
+ \leftline{\hskip\leftskip{\rm#1}}}}
+
+% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
+% paragraph. For more general purposes, use the \margin insertion
+% class. WHICH is `l' or `r'.
+%
+\newskip\inmarginspacing \inmarginspacing=1cm
+\def\strutdepth{\dp\strutbox}
+%
+\def\doinmargin#1#2{\strut\vadjust{%
+ \nobreak
+ \kern-\strutdepth
+ \vtop to \strutdepth{%
+ \baselineskip=\strutdepth
+ \vss
+ % if you have multiple lines of stuff to put here, you'll need to
+ % make the vbox yourself of the appropriate size.
+ \ifx#1l%
+ \llap{\ignorespaces #2\hskip\inmarginspacing}%
+ \else
+ \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}%
+ \fi
+ \null
+ }%
+}}
+\def\inleftmargin{\doinmargin l}
+\def\inrightmargin{\doinmargin r}
+%
+% @inmargin{TEXT [, RIGHT-TEXT]}
+% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;
+% else use TEXT for both).
+%
+\def\inmargin#1{\parseinmargin #1,,\finish}
+\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing.
+ \setbox0 = \hbox{\ignorespaces #2}%
+ \ifdim\wd0 > 0pt
+ \def\lefttext{#1}% have both texts
+ \def\righttext{#2}%
+ \else
+ \def\lefttext{#1}% have only one text
+ \def\righttext{#1}%
+ \fi
+ %
+ \ifodd\pageno
+ \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin
+ \else
+ \def\temp{\inleftmargin\lefttext}%
+ \fi
+ \temp
+}
+
+% @include file insert text of that file as input.
+%
+\def\include{\parseargusing\filenamecatcodes\includezzz}
+\def\includezzz#1{%
+ \pushthisfilestack
+ \def\thisfile{#1}%
+ {%
+ \makevalueexpandable
+ \def\temp{\input #1 }%
+ \expandafter
+ }\temp
+ \popthisfilestack
+}
+\def\filenamecatcodes{%
+ \catcode`\\=\other
+ \catcode`~=\other
+ \catcode`^=\other
+ \catcode`_=\other
+ \catcode`|=\other
+ \catcode`<=\other
+ \catcode`>=\other
+ \catcode`+=\other
+ \catcode`-=\other
+}
+
+\def\pushthisfilestack{%
+ \expandafter\pushthisfilestackX\popthisfilestack\StackTerm
+}
+\def\pushthisfilestackX{%
+ \expandafter\pushthisfilestackY\thisfile\StackTerm
+}
+\def\pushthisfilestackY #1\StackTerm #2\StackTerm {%
+ \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}%
+}
+
+\def\popthisfilestack{\errthisfilestackempty}
+\def\errthisfilestackempty{\errmessage{Internal error:
+ the stack of filenames is empty.}}
+
+\def\thisfile{}
+
+% @center line
+% outputs that line, centered.
+%
+\parseargdef\center{%
+ \ifhmode
+ \let\next\centerH
+ \else
+ \let\next\centerV
+ \fi
+ \next{\hfil \ignorespaces#1\unskip \hfil}%
+}
+\def\centerH#1{%
+ {%
+ \hfil\break
+ \advance\hsize by -\leftskip
+ \advance\hsize by -\rightskip
+ \line{#1}%
+ \break
+ }%
+}
+\def\centerV#1{\line{\kern\leftskip #1\kern\rightskip}}
+
+% @sp n outputs n lines of vertical space
+
+\parseargdef\sp{\vskip #1\baselineskip}
+
+% @comment ...line which is ignored...
+% @c is the same as @comment
+% @ignore ... @end ignore is another way to write a comment
+
+\def\comment{\begingroup \catcode`\^^M=\other%
+\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
+\commentxxx}
+{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}}
+
+\let\c=\comment
+
+% @paragraphindent NCHARS
+% We'll use ems for NCHARS, close enough.
+% NCHARS can also be the word `asis' or `none'.
+% We cannot feasibly implement @paragraphindent asis, though.
+%
+\def\asisword{asis} % no translation, these are keywords
+\def\noneword{none}
+%
+\parseargdef\paragraphindent{%
+ \def\temp{#1}%
+ \ifx\temp\asisword
+ \else
+ \ifx\temp\noneword
+ \defaultparindent = 0pt
+ \else
+ \defaultparindent = #1em
+ \fi
+ \fi
+ \parindent = \defaultparindent
+}
+
+% @exampleindent NCHARS
+% We'll use ems for NCHARS like @paragraphindent.
+% It seems @exampleindent asis isn't necessary, but
+% I preserve it to make it similar to @paragraphindent.
+\parseargdef\exampleindent{%
+ \def\temp{#1}%
+ \ifx\temp\asisword
+ \else
+ \ifx\temp\noneword
+ \lispnarrowing = 0pt
+ \else
+ \lispnarrowing = #1em
+ \fi
+ \fi
+}
+
+% @firstparagraphindent WORD
+% If WORD is `none', then suppress indentation of the first paragraph
+% after a section heading. If WORD is `insert', then do indent at such
+% paragraphs.
+%
+% The paragraph indentation is suppressed or not by calling
+% \suppressfirstparagraphindent, which the sectioning commands do.
+% We switch the definition of this back and forth according to WORD.
+% By default, we suppress indentation.
+%
+\def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent}
+\def\insertword{insert}
+%
+\parseargdef\firstparagraphindent{%
+ \def\temp{#1}%
+ \ifx\temp\noneword
+ \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent
+ \else\ifx\temp\insertword
+ \let\suppressfirstparagraphindent = \relax
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @firstparagraphindent option `\temp'}%
+ \fi\fi
+}
+
+% Here is how we actually suppress indentation. Redefine \everypar to
+% \kern backwards by \parindent, and then reset itself to empty.
+%
+% We also make \indent itself not actually do anything until the next
+% paragraph.
+%
+\gdef\dosuppressfirstparagraphindent{%
+ \gdef\indent{%
+ \restorefirstparagraphindent
+ \indent
+ }%
+ \gdef\noindent{%
+ \restorefirstparagraphindent
+ \noindent
+ }%
+ \global\everypar = {%
+ \kern -\parindent
+ \restorefirstparagraphindent
+ }%
+}
+
+\gdef\restorefirstparagraphindent{%
+ \global \let \indent = \ptexindent
+ \global \let \noindent = \ptexnoindent
+ \global \everypar = {}%
+}
+
+
+% @asis just yields its argument. Used with @table, for example.
+%
+\def\asis#1{#1}
+
+% @math outputs its argument in math mode.
+%
+% One complication: _ usually means subscripts, but it could also mean
+% an actual _ character, as in @math{@var{some_variable} + 1}. So make
+% _ active, and distinguish by seeing if the current family is \slfam,
+% which is what @var uses.
+{
+ \catcode\underChar = \active
+ \gdef\mathunderscore{%
+ \catcode\underChar=\active
+ \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
+ }
+}
+% Another complication: we want \\ (and @\) to output a \ character.
+% FYI, plain.tex uses \\ as a temporary control sequence (why?), but
+% this is not advertised and we don't care. Texinfo does not
+% otherwise define @\.
+%
+% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.
+\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}
+%
+\def\math{%
+ \tex
+ \mathunderscore
+ \let\\ = \mathbackslash
+ \mathactive
+ $\finishmath
+}
+\def\finishmath#1{#1$\endgroup} % Close the group opened by \tex.
+
+% Some active characters (such as <) are spaced differently in math.
+% We have to reset their definitions in case the @math was an argument
+% to a command which sets the catcodes (such as @item or @section).
+%
+{
+ \catcode`^ = \active
+ \catcode`< = \active
+ \catcode`> = \active
+ \catcode`+ = \active
+ \gdef\mathactive{%
+ \let^ = \ptexhat
+ \let< = \ptexless
+ \let> = \ptexgtr
+ \let+ = \ptexplus
+ }
+}
+
+% @bullet and @minus need the same treatment as @math, just above.
+\def\bullet{$\ptexbullet$}
+\def\minus{$-$}
+
+% @dots{} outputs an ellipsis using the current font.
+% We do .5em per period so that it has the same spacing in a typewriter
+% font as three actual period characters.
+%
+\def\dots{%
+ \leavevmode
+ \hbox to 1.5em{%
+ \hskip 0pt plus 0.25fil
+ .\hfil.\hfil.%
+ \hskip 0pt plus 0.5fil
+ }%
+}
+
+% @enddots{} is an end-of-sentence ellipsis.
+%
+\def\enddots{%
+ \dots
+ \spacefactor=3000
+}
+
+% @comma{} is so commas can be inserted into text without messing up
+% Texinfo's parsing.
+%
+\let\comma = ,
+
+% @refill is a no-op.
+\let\refill=\relax
+
+% If working on a large document in chapters, it is convenient to
+% be able to disable indexing, cross-referencing, and contents, for test runs.
+% This is done with @novalidate (before @setfilename).
+%
+\newif\iflinks \linkstrue % by default we want the aux files.
+\let\novalidate = \linksfalse
+
+% @setfilename is done at the beginning of every texinfo file.
+% So open here the files we need to have open while reading the input.
+% This makes it possible to make a .fmt file for texinfo.
+\def\setfilename{%
+ \fixbackslash % Turn off hack to swallow `\input texinfo'.
+ \iflinks
+ \tryauxfile
+ % Open the new aux file. TeX will close it automatically at exit.
+ \immediate\openout\auxfile=\jobname.aux
+ \fi % \openindices needs to do some work in any case.
+ \openindices
+ \let\setfilename=\comment % Ignore extra @setfilename cmds.
+ %
+ % If texinfo.cnf is present on the system, read it.
+ % Useful for site-wide @afourpaper, etc.
+ \openin 1 texinfo.cnf
+ \ifeof 1 \else \input texinfo.cnf \fi
+ \closein 1
+ %
+ \comment % Ignore the actual filename.
+}
+
+% Called from \setfilename.
+%
+\def\openindices{%
+ \newindex{cp}%
+ \newcodeindex{fn}%
+ \newcodeindex{vr}%
+ \newcodeindex{tp}%
+ \newcodeindex{ky}%
+ \newcodeindex{pg}%
+}
+
+% @bye.
+\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
+
+
+\message{pdf,}
+% adobe `portable' document format
+\newcount\tempnum
+\newcount\lnkcount
+\newtoks\filename
+\newcount\filenamelength
+\newcount\pgn
+\newtoks\toksA
+\newtoks\toksB
+\newtoks\toksC
+\newtoks\toksD
+\newbox\boxA
+\newcount\countA
+\newif\ifpdf
+\newif\ifpdfmakepagedest
+
+% when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1
+% can be set). So we test for \relax and 0 as well as \undefined,
+% borrowed from ifpdf.sty.
+\ifx\pdfoutput\undefined
+\else
+ \ifx\pdfoutput\relax
+ \else
+ \ifcase\pdfoutput
+ \else
+ \pdftrue
+ \fi
+ \fi
+\fi
+%
+\ifpdf
+ \input pdfcolor
+ \pdfcatalog{/PageMode /UseOutlines}%
+ \def\dopdfimage#1#2#3{%
+ \def\imagewidth{#2}%
+ \def\imageheight{#3}%
+ % without \immediate, pdftex seg faults when the same image is
+ % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.)
+ \ifnum\pdftexversion < 14
+ \immediate\pdfimage
+ \else
+ \immediate\pdfximage
+ \fi
+ \ifx\empty\imagewidth\else width \imagewidth \fi
+ \ifx\empty\imageheight\else height \imageheight \fi
+ \ifnum\pdftexversion<13
+ #1.pdf%
+ \else
+ {#1.pdf}%
+ \fi
+ \ifnum\pdftexversion < 14 \else
+ \pdfrefximage \pdflastximage
+ \fi}
+ \def\pdfmkdest#1{{%
+ % We have to set dummies so commands such as @code in a section title
+ % aren't expanded.
+ \atdummies
+ \normalturnoffactive
+ \pdfdest name{#1} xyz%
+ }}
+ \def\pdfmkpgn#1{#1}
+ \let\linkcolor = \Blue % was Cyan, but that seems light?
+ \def\endlink{\Black\pdfendlink}
+ % Adding outlines to PDF; macros for calculating structure of outlines
+ % come from Petr Olsak
+ \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
+ \else \csname#1\endcsname \fi}
+ \def\advancenumber#1{\tempnum=\expnumber{#1}\relax
+ \advance\tempnum by 1
+ \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
+ %
+ % #1 is the section text. #2 is the pdf expression for the number
+ % of subentries (or empty, for subsubsections). #3 is the node
+ % text, which might be empty if this toc entry had no
+ % corresponding node. #4 is the page number.
+ %
+ \def\dopdfoutline#1#2#3#4{%
+ % Generate a link to the node text if that exists; else, use the
+ % page number. We could generate a destination for the section
+ % text in the case where a section has no node, but it doesn't
+ % seem worthwhile, since most documents are normally structured.
+ \def\pdfoutlinedest{#3}%
+ \ifx\pdfoutlinedest\empty \def\pdfoutlinedest{#4}\fi
+ %
+ \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{#1}%
+ }
+ %
+ \def\pdfmakeoutlines{%
+ \begingroup
+ % Thanh's hack / proper braces in bookmarks
+ \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace
+ \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace
+ %
+ % Read toc silently, to get counts of subentries for \pdfoutline.
+ \def\numchapentry##1##2##3##4{%
+ \def\thischapnum{##2}%
+ \def\thissecnum{0}%
+ \def\thissubsecnum{0}%
+ }%
+ \def\numsecentry##1##2##3##4{%
+ \advancenumber{chap\thischapnum}%
+ \def\thissecnum{##2}%
+ \def\thissubsecnum{0}%
+ }%
+ \def\numsubsecentry##1##2##3##4{%
+ \advancenumber{sec\thissecnum}%
+ \def\thissubsecnum{##2}%
+ }%
+ \def\numsubsubsecentry##1##2##3##4{%
+ \advancenumber{subsec\thissubsecnum}%
+ }%
+ \def\thischapnum{0}%
+ \def\thissecnum{0}%
+ \def\thissubsecnum{0}%
+ %
+ % use \def rather than \let here because we redefine \chapentry et
+ % al. a second time, below.
+ \def\appentry{\numchapentry}%
+ \def\appsecentry{\numsecentry}%
+ \def\appsubsecentry{\numsubsecentry}%
+ \def\appsubsubsecentry{\numsubsubsecentry}%
+ \def\unnchapentry{\numchapentry}%
+ \def\unnsecentry{\numsecentry}%
+ \def\unnsubsecentry{\numsubsecentry}%
+ \def\unnsubsubsecentry{\numsubsubsecentry}%
+ \input \jobname.toc
+ %
+ % Read toc second time, this time actually producing the outlines.
+ % The `-' means take the \expnumber as the absolute number of
+ % subentries, which we calculated on our first read of the .toc above.
+ %
+ % We use the node names as the destinations.
+ \def\numchapentry##1##2##3##4{%
+ \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}%
+ \def\numsecentry##1##2##3##4{%
+ \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}%
+ \def\numsubsecentry##1##2##3##4{%
+ \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}%
+ \def\numsubsubsecentry##1##2##3##4{% count is always zero
+ \dopdfoutline{##1}{}{##3}{##4}}%
+ %
+ % PDF outlines are displayed using system fonts, instead of
+ % document fonts. Therefore we cannot use special characters,
+ % since the encoding is unknown. For example, the eogonek from
+ % Latin 2 (0xea) gets translated to a | character. Info from
+ % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100.
+ %
+ % xx to do this right, we have to translate 8-bit characters to
+ % their "best" equivalent, based on the @documentencoding. Right
+ % now, I guess we'll just let the pdf reader have its way.
+ \indexnofonts
+ \turnoffactive
+ \input \jobname.toc
+ \endgroup
+ }
+ %
+ \def\makelinks #1,{%
+ \def\params{#1}\def\E{END}%
+ \ifx\params\E
+ \let\nextmakelinks=\relax
+ \else
+ \let\nextmakelinks=\makelinks
+ \ifnum\lnkcount>0,\fi
+ \picknum{#1}%
+ \startlink attr{/Border [0 0 0]}
+ goto name{\pdfmkpgn{\the\pgn}}%
+ \linkcolor #1%
+ \advance\lnkcount by 1%
+ \endlink
+ \fi
+ \nextmakelinks
+ }
+ \def\picknum#1{\expandafter\pn#1}
+ \def\pn#1{%
+ \def\p{#1}%
+ \ifx\p\lbrace
+ \let\nextpn=\ppn
+ \else
+ \let\nextpn=\ppnn
+ \def\first{#1}
+ \fi
+ \nextpn
+ }
+ \def\ppn#1{\pgn=#1\gobble}
+ \def\ppnn{\pgn=\first}
+ \def\pdfmklnk#1{\lnkcount=0\makelinks #1,END,}
+ \def\skipspaces#1{\def\PP{#1}\def\D{|}%
+ \ifx\PP\D\let\nextsp\relax
+ \else\let\nextsp\skipspaces
+ \ifx\p\space\else\addtokens{\filename}{\PP}%
+ \advance\filenamelength by 1
+ \fi
+ \fi
+ \nextsp}
+ \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax}
+ \ifnum\pdftexversion < 14
+ \let \startlink \pdfannotlink
+ \else
+ \let \startlink \pdfstartlink
+ \fi
+ \def\pdfurl#1{%
+ \begingroup
+ \normalturnoffactive\def\@{@}%
+ \makevalueexpandable
+ \leavevmode\Red
+ \startlink attr{/Border [0 0 0]}%
+ user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
+ \endgroup}
+ \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
+ \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
+ \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
+ \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
+ \def\maketoks{%
+ \expandafter\poptoks\the\toksA|ENDTOKS|\relax
+ \ifx\first0\adn0
+ \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
+ \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
+ \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
+ \else
+ \ifnum0=\countA\else\makelink\fi
+ \ifx\first.\let\next=\done\else
+ \let\next=\maketoks
+ \addtokens{\toksB}{\the\toksD}
+ \ifx\first,\addtokens{\toksB}{\space}\fi
+ \fi
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \next}
+ \def\makelink{\addtokens{\toksB}%
+ {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
+ \def\pdflink#1{%
+ \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
+ \linkcolor #1\endlink}
+ \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
+\else
+ \let\pdfmkdest = \gobble
+ \let\pdfurl = \gobble
+ \let\endlink = \relax
+ \let\linkcolor = \relax
+ \let\pdfmakeoutlines = \relax
+\fi % \ifx\pdfoutput
+
+
+\message{fonts,}
+
+% Change the current font style to #1, remembering it in \curfontstyle.
+% For now, we do not accumulate font styles: @b{@i{foo}} prints foo in
+% italics, not bold italics.
+%
+\def\setfontstyle#1{%
+ \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd.
+ \csname ten#1\endcsname % change the current font
+}
+
+% Select #1 fonts with the current style.
+%
+\def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname}
+
+\def\rm{\fam=0 \setfontstyle{rm}}
+\def\it{\fam=\itfam \setfontstyle{it}}
+\def\sl{\fam=\slfam \setfontstyle{sl}}
+\def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf}
+\def\tt{\fam=\ttfam \setfontstyle{tt}}
+
+% Texinfo sort of supports the sans serif font style, which plain TeX does not.
+% So we set up a \sf.
+\newfam\sffam
+\def\sf{\fam=\sffam \setfontstyle{sf}}
+\let\li = \sf % Sometimes we call it \li, not \sf.
+
+% We don't need math for this font style.
+\def\ttsl{\setfontstyle{ttsl}}
+
+% Default leading.
+\newdimen\textleading \textleading = 13.2pt
+
+% Set the baselineskip to #1, and the lineskip and strut size
+% correspondingly. There is no deep meaning behind these magic numbers
+% used as factors; they just match (closely enough) what Knuth defined.
+%
+\def\lineskipfactor{.08333}
+\def\strutheightpercent{.70833}
+\def\strutdepthpercent {.29167}
+%
+\def\setleading#1{%
+ \normalbaselineskip = #1\relax
+ \normallineskip = \lineskipfactor\normalbaselineskip
+ \normalbaselines
+ \setbox\strutbox =\hbox{%
+ \vrule width0pt height\strutheightpercent\baselineskip
+ depth \strutdepthpercent \baselineskip
+ }%
+}
+
+% Set the font macro #1 to the font named #2, adding on the
+% specified font prefix (normally `cm').
+% #3 is the font's design size, #4 is a scale factor
+\def\setfont#1#2#3#4{\font#1=\fontprefix#2#3 scaled #4}
+
+% Use cm as the default font prefix.
+% To specify the font prefix, you must define \fontprefix
+% before you read in texinfo.tex.
+\ifx\fontprefix\undefined
+\def\fontprefix{cm}
+\fi
+% Support font families that don't use the same naming scheme as CM.
+\def\rmshape{r}
+\def\rmbshape{bx} %where the normal face is bold
+\def\bfshape{b}
+\def\bxshape{bx}
+\def\ttshape{tt}
+\def\ttbshape{tt}
+\def\ttslshape{sltt}
+\def\itshape{ti}
+\def\itbshape{bxti}
+\def\slshape{sl}
+\def\slbshape{bxsl}
+\def\sfshape{ss}
+\def\sfbshape{ss}
+\def\scshape{csc}
+\def\scbshape{csc}
+
+% Text fonts (11.2pt, magstep1).
+\def\textnominalsize{11pt}
+\edef\mainmagstep{\magstephalf}
+\setfont\textrm\rmshape{10}{\mainmagstep}
+\setfont\texttt\ttshape{10}{\mainmagstep}
+\setfont\textbf\bfshape{10}{\mainmagstep}
+\setfont\textit\itshape{10}{\mainmagstep}
+\setfont\textsl\slshape{10}{\mainmagstep}
+\setfont\textsf\sfshape{10}{\mainmagstep}
+\setfont\textsc\scshape{10}{\mainmagstep}
+\setfont\textttsl\ttslshape{10}{\mainmagstep}
+\font\texti=cmmi10 scaled \mainmagstep
+\font\textsy=cmsy10 scaled \mainmagstep
+
+% A few fonts for @defun names and args.
+\setfont\defbf\bfshape{10}{\magstep1}
+\setfont\deftt\ttshape{10}{\magstep1}
+\setfont\defttsl\ttslshape{10}{\magstep1}
+\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf}
+
+% Fonts for indices, footnotes, small examples (9pt).
+\def\smallnominalsize{9pt}
+\setfont\smallrm\rmshape{9}{1000}
+\setfont\smalltt\ttshape{9}{1000}
+\setfont\smallbf\bfshape{10}{900}
+\setfont\smallit\itshape{9}{1000}
+\setfont\smallsl\slshape{9}{1000}
+\setfont\smallsf\sfshape{9}{1000}
+\setfont\smallsc\scshape{10}{900}
+\setfont\smallttsl\ttslshape{10}{900}
+\font\smalli=cmmi9
+\font\smallsy=cmsy9
+
+% Fonts for small examples (8pt).
+\def\smallernominalsize{8pt}
+\setfont\smallerrm\rmshape{8}{1000}
+\setfont\smallertt\ttshape{8}{1000}
+\setfont\smallerbf\bfshape{10}{800}
+\setfont\smallerit\itshape{8}{1000}
+\setfont\smallersl\slshape{8}{1000}
+\setfont\smallersf\sfshape{8}{1000}
+\setfont\smallersc\scshape{10}{800}
+\setfont\smallerttsl\ttslshape{10}{800}
+\font\smalleri=cmmi8
+\font\smallersy=cmsy8
+
+% Fonts for title page (20.4pt):
+\def\titlenominalsize{20pt}
+\setfont\titlerm\rmbshape{12}{\magstep3}
+\setfont\titleit\itbshape{10}{\magstep4}
+\setfont\titlesl\slbshape{10}{\magstep4}
+\setfont\titlett\ttbshape{12}{\magstep3}
+\setfont\titlettsl\ttslshape{10}{\magstep4}
+\setfont\titlesf\sfbshape{17}{\magstep1}
+\let\titlebf=\titlerm
+\setfont\titlesc\scbshape{10}{\magstep4}
+\font\titlei=cmmi12 scaled \magstep3
+\font\titlesy=cmsy10 scaled \magstep4
+\def\authorrm{\secrm}
+\def\authortt{\sectt}
+
+% Chapter (and unnumbered) fonts (17.28pt).
+\def\chapnominalsize{17pt}
+\setfont\chaprm\rmbshape{12}{\magstep2}
+\setfont\chapit\itbshape{10}{\magstep3}
+\setfont\chapsl\slbshape{10}{\magstep3}
+\setfont\chaptt\ttbshape{12}{\magstep2}
+\setfont\chapttsl\ttslshape{10}{\magstep3}
+\setfont\chapsf\sfbshape{17}{1000}
+\let\chapbf=\chaprm
+\setfont\chapsc\scbshape{10}{\magstep3}
+\font\chapi=cmmi12 scaled \magstep2
+\font\chapsy=cmsy10 scaled \magstep3
+
+% Section fonts (14.4pt).
+\def\secnominalsize{14pt}
+\setfont\secrm\rmbshape{12}{\magstep1}
+\setfont\secit\itbshape{10}{\magstep2}
+\setfont\secsl\slbshape{10}{\magstep2}
+\setfont\sectt\ttbshape{12}{\magstep1}
+\setfont\secttsl\ttslshape{10}{\magstep2}
+\setfont\secsf\sfbshape{12}{\magstep1}
+\let\secbf\secrm
+\setfont\secsc\scbshape{10}{\magstep2}
+\font\seci=cmmi12 scaled \magstep1
+\font\secsy=cmsy10 scaled \magstep2
+
+% Subsection fonts (13.15pt).
+\def\ssecnominalsize{13pt}
+\setfont\ssecrm\rmbshape{12}{\magstephalf}
+\setfont\ssecit\itbshape{10}{1315}
+\setfont\ssecsl\slbshape{10}{1315}
+\setfont\ssectt\ttbshape{12}{\magstephalf}
+\setfont\ssecttsl\ttslshape{10}{1315}
+\setfont\ssecsf\sfbshape{12}{\magstephalf}
+\let\ssecbf\ssecrm
+\setfont\ssecsc\scbshape{10}{1315}
+\font\sseci=cmmi12 scaled \magstephalf
+\font\ssecsy=cmsy10 scaled 1315
+
+% Reduced fonts for @acro in text (10pt).
+\def\reducednominalsize{10pt}
+\setfont\reducedrm\rmshape{10}{1000}
+\setfont\reducedtt\ttshape{10}{1000}
+\setfont\reducedbf\bfshape{10}{1000}
+\setfont\reducedit\itshape{10}{1000}
+\setfont\reducedsl\slshape{10}{1000}
+\setfont\reducedsf\sfshape{10}{1000}
+\setfont\reducedsc\scshape{10}{1000}
+\setfont\reducedttsl\ttslshape{10}{1000}
+\font\reducedi=cmmi10
+\font\reducedsy=cmsy10
+
+% In order for the font changes to affect most math symbols and letters,
+% we have to define the \textfont of the standard families. Since
+% texinfo doesn't allow for producing subscripts and superscripts except
+% in the main text, we don't bother to reset \scriptfont and
+% \scriptscriptfont (which would also require loading a lot more fonts).
+%
+\def\resetmathfonts{%
+ \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy
+ \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf
+ \textfont\ttfam=\tentt \textfont\sffam=\tensf
+}
+
+% The font-changing commands redefine the meanings of \tenSTYLE, instead
+% of just \STYLE. We do this because \STYLE needs to also set the
+% current \fam for math mode. Our \STYLE (e.g., \rm) commands hardwire
+% \tenSTYLE to set the current font.
+%
+% Each font-changing command also sets the names \lsize (one size lower)
+% and \lllsize (three sizes lower). These relative commands are used in
+% the LaTeX logo and acronyms.
+%
+% This all needs generalizing, badly.
+%
+\def\textfonts{%
+ \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
+ \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
+ \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy
+ \let\tenttsl=\textttsl
+ \def\curfontsize{text}%
+ \def\lsize{reduced}\def\lllsize{smaller}%
+ \resetmathfonts \setleading{\textleading}}
+\def\titlefonts{%
+ \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl
+ \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc
+ \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy
+ \let\tenttsl=\titlettsl
+ \def\curfontsize{title}%
+ \def\lsize{chap}\def\lllsize{subsec}%
+ \resetmathfonts \setleading{25pt}}
+\def\titlefont#1{{\titlefonts\rm #1}}
+\def\chapfonts{%
+ \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
+ \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
+ \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy
+ \let\tenttsl=\chapttsl
+ \def\curfontsize{chap}%
+ \def\lsize{sec}\def\lllsize{text}%
+ \resetmathfonts \setleading{19pt}}
+\def\secfonts{%
+ \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
+ \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
+ \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy
+ \let\tenttsl=\secttsl
+ \def\curfontsize{sec}%
+ \def\lsize{subsec}\def\lllsize{reduced}%
+ \resetmathfonts \setleading{16pt}}
+\def\subsecfonts{%
+ \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
+ \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
+ \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy
+ \let\tenttsl=\ssecttsl
+ \def\curfontsize{ssec}%
+ \def\lsize{text}\def\lllsize{small}%
+ \resetmathfonts \setleading{15pt}}
+\let\subsubsecfonts = \subsecfonts
+\def\reducedfonts{%
+ \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl
+ \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc
+ \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy
+ \let\tenttsl=\reducedttsl
+ \def\curfontsize{reduced}%
+ \def\lsize{small}\def\lllsize{smaller}%
+ \resetmathfonts \setleading{10.5pt}}
+\def\smallfonts{%
+ \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl
+ \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc
+ \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy
+ \let\tenttsl=\smallttsl
+ \def\curfontsize{small}%
+ \def\lsize{smaller}\def\lllsize{smaller}%
+ \resetmathfonts \setleading{10.5pt}}
+\def\smallerfonts{%
+ \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl
+ \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc
+ \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy
+ \let\tenttsl=\smallerttsl
+ \def\curfontsize{smaller}%
+ \def\lsize{smaller}\def\lllsize{smaller}%
+ \resetmathfonts \setleading{9.5pt}}
+
+% Set the fonts to use with the @small... environments.
+\let\smallexamplefonts = \smallfonts
+
+% About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample
+% can fit this many characters:
+% 8.5x11=86 smallbook=72 a4=90 a5=69
+% If we use \scriptfonts (8pt), then we can fit this many characters:
+% 8.5x11=90+ smallbook=80 a4=90+ a5=77
+% For me, subjectively, the few extra characters that fit aren't worth
+% the additional smallness of 8pt. So I'm making the default 9pt.
+%
+% By the way, for comparison, here's what fits with @example (10pt):
+% 8.5x11=71 smallbook=60 a4=75 a5=58
+%
+% I wish the USA used A4 paper.
+% --karl, 24jan03.
+
+
+% Set up the default fonts, so we can use them for creating boxes.
+%
+\textfonts \rm
+
+% Define these so they can be easily changed for other fonts.
+\def\angleleft{$\langle$}
+\def\angleright{$\rangle$}
+
+% Count depth in font-changes, for error checks
+\newcount\fontdepth \fontdepth=0
+
+% Fonts for short table of contents.
+\setfont\shortcontrm\rmshape{12}{1000}
+\setfont\shortcontbf\bfshape{10}{\magstep1} % no cmb12
+\setfont\shortcontsl\slshape{12}{1000}
+\setfont\shortconttt\ttshape{12}{1000}
+
+%% Add scribe-like font environments, plus @l for inline lisp (usually sans
+%% serif) and @ii for TeX italic
+
+% \smartitalic{ARG} outputs arg in italics, followed by an italic correction
+% unless the following character is such as not to need one.
+\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else
+ \ptexslash\fi\fi\fi}
+\def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx}
+\def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx}
+
+% like \smartslanted except unconditionally uses \ttsl.
+% @var is set to this for defun arguments.
+\def\ttslanted#1{{\ttsl #1}\futurelet\next\smartitalicx}
+
+% like \smartslanted except unconditionally use \sl. We never want
+% ttsl for book titles, do we?
+\def\cite#1{{\sl #1}\futurelet\next\smartitalicx}
+
+\let\i=\smartitalic
+\let\slanted=\smartslanted
+\let\var=\smartslanted
+\let\dfn=\smartslanted
+\let\emph=\smartitalic
+
+% @b, explicit bold.
+\def\b#1{{\bf #1}}
+\let\strong=\b
+
+% @sansserif, explicit sans.
+\def\sansserif#1{{\sf #1}}
+
+% We can't just use \exhyphenpenalty, because that only has effect at
+% the end of a paragraph. Restore normal hyphenation at the end of the
+% group within which \nohyphenation is presumably called.
+%
+\def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation}
+\def\restorehyphenation{\hyphenchar\font = `- }
+
+% Set sfcode to normal for the chars that usually have another value.
+% Can't use plain's \frenchspacing because it uses the `\x notation, and
+% sometimes \x has an active definition that messes things up.
+%
+\catcode`@=11
+ \def\frenchspacing{%
+ \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m
+ \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m
+ }
+\catcode`@=\other
+
+\def\t#1{%
+ {\tt \rawbackslash \frenchspacing #1}%
+ \null
+}
+\def\samp#1{`\tclose{#1}'\null}
+\setfont\keyrm\rmshape{8}{1000}
+\font\keysy=cmsy9
+\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{%
+ \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{%
+ \vbox{\hrule\kern-0.4pt
+ \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}%
+ \kern-0.4pt\hrule}%
+ \kern-.06em\raise0.4pt\hbox{\angleright}}}}
+% The old definition, with no lozenge:
+%\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null}
+\def\ctrl #1{{\tt \rawbackslash \hat}#1}
+
+% @file, @option are the same as @samp.
+\let\file=\samp
+\let\option=\samp
+
+% @code is a modification of @t,
+% which makes spaces the same size as normal in the surrounding text.
+\def\tclose#1{%
+ {%
+ % Change normal interword space to be same as for the current font.
+ \spaceskip = \fontdimen2\font
+ %
+ % Switch to typewriter.
+ \tt
+ %
+ % But `\ ' produces the large typewriter interword space.
+ \def\ {{\spaceskip = 0pt{} }}%
+ %
+ % Turn off hyphenation.
+ \nohyphenation
+ %
+ \rawbackslash
+ \frenchspacing
+ #1%
+ }%
+ \null
+}
+
+% We *must* turn on hyphenation at `-' and `_' in @code.
+% Otherwise, it is too hard to avoid overfull hboxes
+% in the Emacs manual, the Library manual, etc.
+
+% Unfortunately, TeX uses one parameter (\hyphenchar) to control
+% both hyphenation at - and hyphenation within words.
+% We must therefore turn them both off (\tclose does that)
+% and arrange explicitly to hyphenate at a dash.
+% -- rms.
+{
+ \catcode`\-=\active
+ \catcode`\_=\active
+ %
+ \global\def\code{\begingroup
+ \catcode`\-=\active \let-\codedash
+ \catcode`\_=\active \let_\codeunder
+ \codex
+ }
+}
+
+\def\realdash{-}
+\def\codedash{-\discretionary{}{}{}}
+\def\codeunder{%
+ % this is all so @math{@code{var_name}+1} can work. In math mode, _
+ % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.)
+ % will therefore expand the active definition of _, which is us
+ % (inside @code that is), therefore an endless loop.
+ \ifusingtt{\ifmmode
+ \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_.
+ \else\normalunderscore \fi
+ \discretionary{}{}{}}%
+ {\_}%
+}
+\def\codex #1{\tclose{#1}\endgroup}
+
+% @kbd is like @code, except that if the argument is just one @key command,
+% then @kbd has no effect.
+
+% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
+% `example' (@kbd uses ttsl only inside of @example and friends),
+% or `code' (@kbd uses normal tty font always).
+\parseargdef\kbdinputstyle{%
+ \def\arg{#1}%
+ \ifx\arg\worddistinct
+ \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
+ \else\ifx\arg\wordexample
+ \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
+ \else\ifx\arg\wordcode
+ \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @kbdinputstyle option `\arg'}%
+ \fi\fi\fi
+}
+\def\worddistinct{distinct}
+\def\wordexample{example}
+\def\wordcode{code}
+
+% Default is `distinct.'
+\kbdinputstyle distinct
+
+\def\xkey{\key}
+\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
+\ifx\one\xkey\ifx\threex\three \key{#2}%
+\else{\tclose{\kbdfont\look}}\fi
+\else{\tclose{\kbdfont\look}}\fi}
+
+% For @indicateurl, @env, @command quotes seem unnecessary, so use \code.
+\let\indicateurl=\code
+\let\env=\code
+\let\command=\code
+
+% @uref (abbreviation for `urlref') takes an optional (comma-separated)
+% second argument specifying the text to display and an optional third
+% arg as text to display instead of (rather than in addition to) the url
+% itself. First (mandatory) arg is the url. Perhaps eventually put in
+% a hypertex \special here.
+%
+\def\uref#1{\douref #1,,,\finish}
+\def\douref#1,#2,#3,#4\finish{\begingroup
+ \unsepspaces
+ \pdfurl{#1}%
+ \setbox0 = \hbox{\ignorespaces #3}%
+ \ifdim\wd0 > 0pt
+ \unhbox0 % third arg given, show only that
+ \else
+ \setbox0 = \hbox{\ignorespaces #2}%
+ \ifdim\wd0 > 0pt
+ \ifpdf
+ \unhbox0 % PDF: 2nd arg given, show only it
+ \else
+ \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url
+ \fi
+ \else
+ \code{#1}% only url given, so show it
+ \fi
+ \fi
+ \endlink
+\endgroup}
+
+% @url synonym for @uref, since that's how everyone uses it.
+%
+\let\url=\uref
+
+% rms does not like angle brackets --karl, 17may97.
+% So now @email is just like @uref, unless we are pdf.
+%
+%\def\email#1{\angleleft{\tt #1}\angleright}
+\ifpdf
+ \def\email#1{\doemail#1,,\finish}
+ \def\doemail#1,#2,#3\finish{\begingroup
+ \unsepspaces
+ \pdfurl{mailto:#1}%
+ \setbox0 = \hbox{\ignorespaces #2}%
+ \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi
+ \endlink
+ \endgroup}
+\else
+ \let\email=\uref
+\fi
+
+% Check if we are currently using a typewriter font. Since all the
+% Computer Modern typewriter fonts have zero interword stretch (and
+% shrink), and it is reasonable to expect all typewriter fonts to have
+% this property, we can check that font parameter.
+%
+\def\ifmonospace{\ifdim\fontdimen3\font=0pt }
+
+% Typeset a dimension, e.g., `in' or `pt'. The only reason for the
+% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
+%
+\def\dmn#1{\thinspace #1}
+
+\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par}
+
+% @l was never documented to mean ``switch to the Lisp font'',
+% and it is not used as such in any manual I can find. We need it for
+% Polish suppressed-l. --karl, 22sep96.
+%\def\l#1{{\li #1}\null}
+
+% Explicit font changes: @r, @sc, undocumented @ii.
+\def\r#1{{\rm #1}} % roman font
+\def\sc#1{{\smallcaps#1}} % smallcaps font
+\def\ii#1{{\it #1}} % italic font
+
+% @acronym for "FBI", "NATO", and the like.
+% We print this one point size smaller, since it's intended for
+% all-uppercase.
+%
+\def\acronym#1{\doacronym #1,,\finish}
+\def\doacronym#1,#2,#3\finish{%
+ {\selectfonts\lsize #1}%
+ \def\temp{#2}%
+ \ifx\temp\empty \else
+ \space ({\unsepspaces \ignorespaces \temp \unskip})%
+ \fi
+}
+
+% @abbr for "Comput. J." and the like.
+% No font change, but don't do end-of-sentence spacing.
+%
+\def\abbr#1{\doabbr #1,,\finish}
+\def\doabbr#1,#2,#3\finish{%
+ {\frenchspacing #1}%
+ \def\temp{#2}%
+ \ifx\temp\empty \else
+ \space ({\unsepspaces \ignorespaces \temp \unskip})%
+ \fi
+}
+
+% @pounds{} is a sterling sign, which Knuth put in the CM italic font.
+%
+\def\pounds{{\it\$}}
+
+% @euro{} comes from a separate font, depending on the current style.
+% We use the free feym* fonts from the eurosym package by Henrik
+% Theiling, which support regular, slanted, bold and bold slanted (and
+% "outlined" (blackboard board, sort of) versions, which we don't need).
+% It is available from http://www.ctan.org/tex-archive/fonts/eurosym.
+%
+% Although only regular is the truly official Euro symbol, we ignore
+% that. The Euro is designed to be slightly taller than the regular
+% font height.
+%
+% feymr - regular
+% feymo - slanted
+% feybr - bold
+% feybo - bold slanted
+%
+% There is no good (free) typewriter version, to my knowledge.
+% A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide.
+% Hmm.
+%
+% Also doesn't work in math. Do we need to do math with euro symbols?
+% Hope not.
+%
+%
+\def\euro{{\eurofont e}}
+\def\eurofont{%
+ % We set the font at each command, rather than predefining it in
+ % \textfonts and the other font-switching commands, so that
+ % installations which never need the symbold don't have to have the
+ % font installed.
+ %
+ % There is only one designed size (nominal 10pt), so we always scale
+ % that to the current nominal size.
+ %
+ % By the way, simply using "at 1em" works for cmr10 and the like, but
+ % does not work for cmbx10 and other extended/shrunken fonts.
+ %
+ \def\eurosize{\csname\curfontsize nominalsize\endcsname}%
+ %
+ \ifx\curfontstyle\bfstylename
+ % bold:
+ \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize
+ \else
+ % regular:
+ \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize
+ \fi
+ \thiseurofont
+}
+
+% @registeredsymbol - R in a circle. The font for the R should really
+% be smaller yet, but lllsize is the best we can do for now.
+% Adapted from the plain.tex definition of \copyright.
+%
+\def\registeredsymbol{%
+ $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}%
+ \hfil\crcr\Orb}}%
+ }$%
+}
+
+% Laurent Siebenmann reports \Orb undefined with:
+% Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38
+% so we'll define it if necessary.
+%
+\ifx\Orb\undefined
+\def\Orb{\mathhexbox20D}
+\fi
+
+
+\message{page headings,}
+
+\newskip\titlepagetopglue \titlepagetopglue = 1.5in
+\newskip\titlepagebottomglue \titlepagebottomglue = 2pc
+
+% First the title page. Must do @settitle before @titlepage.
+\newif\ifseenauthor
+\newif\iffinishedtitlepage
+
+% Do an implicit @contents or @shortcontents after @end titlepage if the
+% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage.
+%
+\newif\ifsetcontentsaftertitlepage
+ \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue
+\newif\ifsetshortcontentsaftertitlepage
+ \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue
+
+\parseargdef\shorttitlepage{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%
+ \endgroup\page\hbox{}\page}
+
+\envdef\titlepage{%
+ % Open one extra group, as we want to close it in the middle of \Etitlepage.
+ \begingroup
+ \parindent=0pt \textfonts
+ % Leave some space at the very top of the page.
+ \vglue\titlepagetopglue
+ % No rule at page bottom unless we print one at the top with @title.
+ \finishedtitlepagetrue
+ %
+ % Most title ``pages'' are actually two pages long, with space
+ % at the top of the second. We don't want the ragged left on the second.
+ \let\oldpage = \page
+ \def\page{%
+ \iffinishedtitlepage\else
+ \finishtitlepage
+ \fi
+ \let\page = \oldpage
+ \page
+ \null
+ }%
+}
+
+\def\Etitlepage{%
+ \iffinishedtitlepage\else
+ \finishtitlepage
+ \fi
+ % It is important to do the page break before ending the group,
+ % because the headline and footline are only empty inside the group.
+ % If we use the new definition of \page, we always get a blank page
+ % after the title page, which we certainly don't want.
+ \oldpage
+ \endgroup
+ %
+ % Need this before the \...aftertitlepage checks so that if they are
+ % in effect the toc pages will come out with page numbers.
+ \HEADINGSon
+ %
+ % If they want short, they certainly want long too.
+ \ifsetshortcontentsaftertitlepage
+ \shortcontents
+ \contents
+ \global\let\shortcontents = \relax
+ \global\let\contents = \relax
+ \fi
+ %
+ \ifsetcontentsaftertitlepage
+ \contents
+ \global\let\contents = \relax
+ \global\let\shortcontents = \relax
+ \fi
+}
+
+\def\finishtitlepage{%
+ \vskip4pt \hrule height 2pt width \hsize
+ \vskip\titlepagebottomglue
+ \finishedtitlepagetrue
+}
+
+%%% Macros to be used within @titlepage:
+
+\let\subtitlerm=\tenrm
+\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}
+
+\def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines
+ \let\tt=\authortt}
+
+\parseargdef\title{%
+ \checkenv\titlepage
+ \leftline{\titlefonts\rm #1}
+ % print a rule at the page bottom also.
+ \finishedtitlepagefalse
+ \vskip4pt \hrule height 4pt width \hsize \vskip4pt
+}
+
+\parseargdef\subtitle{%
+ \checkenv\titlepage
+ {\subtitlefont \rightline{#1}}%
+}
+
+% @author should come last, but may come many times.
+% It can also be used inside @quotation.
+%
+\parseargdef\author{%
+ \def\temp{\quotation}%
+ \ifx\thisenv\temp
+ \def\quotationauthor{#1}% printed in \Equotation.
+ \else
+ \checkenv\titlepage
+ \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi
+ {\authorfont \leftline{#1}}%
+ \fi
+}
+
+
+%%% Set up page headings and footings.
+
+\let\thispage=\folio
+
+\newtoks\evenheadline % headline on even pages
+\newtoks\oddheadline % headline on odd pages
+\newtoks\evenfootline % footline on even pages
+\newtoks\oddfootline % footline on odd pages
+
+% Now make TeX use those variables
+\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
+ \else \the\evenheadline \fi}}
+\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
+ \else \the\evenfootline \fi}\HEADINGShook}
+\let\HEADINGShook=\relax
+
+% Commands to set those variables.
+% For example, this is what @headings on does
+% @evenheading @thistitle|@thispage|@thischapter
+% @oddheading @thischapter|@thispage|@thistitle
+% @evenfooting @thisfile||
+% @oddfooting ||@thisfile
+
+
+\def\evenheading{\parsearg\evenheadingxxx}
+\def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish}
+\def\evenheadingyyy #1\|#2\|#3\|#4\finish{%
+\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\def\oddheading{\parsearg\oddheadingxxx}
+\def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish}
+\def\oddheadingyyy #1\|#2\|#3\|#4\finish{%
+\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
+
+\def\evenfooting{\parsearg\evenfootingxxx}
+\def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish}
+\def\evenfootingyyy #1\|#2\|#3\|#4\finish{%
+\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\def\oddfooting{\parsearg\oddfootingxxx}
+\def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish}
+\def\oddfootingyyy #1\|#2\|#3\|#4\finish{%
+ \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
+ %
+ % Leave some space for the footline. Hopefully ok to assume
+ % @evenfooting will not be used by itself.
+ \global\advance\pageheight by -\baselineskip
+ \global\advance\vsize by -\baselineskip
+}
+
+\parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}}
+
+
+% @headings double turns headings on for double-sided printing.
+% @headings single turns headings on for single-sided printing.
+% @headings off turns them off.
+% @headings on same as @headings double, retained for compatibility.
+% @headings after turns on double-sided headings after this page.
+% @headings doubleafter turns on double-sided headings after this page.
+% @headings singleafter turns on single-sided headings after this page.
+% By default, they are off at the start of a document,
+% and turned `on' after @end titlepage.
+
+\def\headings #1 {\csname HEADINGS#1\endcsname}
+
+\def\HEADINGSoff{%
+\global\evenheadline={\hfil} \global\evenfootline={\hfil}
+\global\oddheadline={\hfil} \global\oddfootline={\hfil}}
+\HEADINGSoff
+% When we turn headings on, set the page number to 1.
+% For double-sided printing, put current file name in lower left corner,
+% chapter name on inside top of right hand pages, document
+% title on inside top of left hand pages, and page numbers on outside top
+% edge of all pages.
+\def\HEADINGSdouble{%
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+\let\contentsalignmacro = \chappager
+
+% For single-sided printing, chapter title goes across top left of page,
+% page number on top right.
+\def\HEADINGSsingle{%
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+\def\HEADINGSon{\HEADINGSdouble}
+
+\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
+\let\HEADINGSdoubleafter=\HEADINGSafter
+\def\HEADINGSdoublex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+
+\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
+\def\HEADINGSsinglex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+
+% Subroutines used in generating headings
+% This produces Day Month Year style of output.
+% Only define if not already defined, in case a txi-??.tex file has set
+% up a different format (e.g., txi-cs.tex does this).
+\ifx\today\undefined
+\def\today{%
+ \number\day\space
+ \ifcase\month
+ \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
+ \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
+ \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
+ \fi
+ \space\number\year}
+\fi
+
+% @settitle line... specifies the title of the document, for headings.
+% It generates no output of its own.
+\def\thistitle{\putwordNoTitle}
+\def\settitle{\parsearg{\gdef\thistitle}}
+
+
+\message{tables,}
+% Tables -- @table, @ftable, @vtable, @item(x).
+
+% default indentation of table text
+\newdimen\tableindent \tableindent=.8in
+% default indentation of @itemize and @enumerate text
+\newdimen\itemindent \itemindent=.3in
+% margin between end of table item and start of table text.
+\newdimen\itemmargin \itemmargin=.1in
+
+% used internally for \itemindent minus \itemmargin
+\newdimen\itemmax
+
+% Note @table, @ftable, and @vtable define @item, @itemx, etc., with
+% these defs.
+% They also define \itemindex
+% to index the item name in whatever manner is desired (perhaps none).
+
+\newif\ifitemxneedsnegativevskip
+
+\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi}
+
+\def\internalBitem{\smallbreak \parsearg\itemzzz}
+\def\internalBitemx{\itemxpar \parsearg\itemzzz}
+
+\def\itemzzz #1{\begingroup %
+ \advance\hsize by -\rightskip
+ \advance\hsize by -\tableindent
+ \setbox0=\hbox{\itemindicate{#1}}%
+ \itemindex{#1}%
+ \nobreak % This prevents a break before @itemx.
+ %
+ % If the item text does not fit in the space we have, put it on a line
+ % by itself, and do not allow a page break either before or after that
+ % line. We do not start a paragraph here because then if the next
+ % command is, e.g., @kindex, the whatsit would get put into the
+ % horizontal list on a line by itself, resulting in extra blank space.
+ \ifdim \wd0>\itemmax
+ %
+ % Make this a paragraph so we get the \parskip glue and wrapping,
+ % but leave it ragged-right.
+ \begingroup
+ \advance\leftskip by-\tableindent
+ \advance\hsize by\tableindent
+ \advance\rightskip by0pt plus1fil
+ \leavevmode\unhbox0\par
+ \endgroup
+ %
+ % We're going to be starting a paragraph, but we don't want the
+ % \parskip glue -- logically it's part of the @item we just started.
+ \nobreak \vskip-\parskip
+ %
+ % Stop a page break at the \parskip glue coming up. However, if
+ % what follows is an environment such as @example, there will be no
+ % \parskip glue; then the negative vskip we just inserted would
+ % cause the example and the item to crash together. So we use this
+ % bizarre value of 10001 as a signal to \aboveenvbreak to insert
+ % \parskip glue after all. Section titles are handled this way also.
+ %
+ \penalty 10001
+ \endgroup
+ \itemxneedsnegativevskipfalse
+ \else
+ % The item text fits into the space. Start a paragraph, so that the
+ % following text (if any) will end up on the same line.
+ \noindent
+ % Do this with kerns and \unhbox so that if there is a footnote in
+ % the item text, it can migrate to the main vertical list and
+ % eventually be printed.
+ \nobreak\kern-\tableindent
+ \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0
+ \unhbox0
+ \nobreak\kern\dimen0
+ \endgroup
+ \itemxneedsnegativevskiptrue
+ \fi
+}
+
+\def\item{\errmessage{@item while not in a list environment}}
+\def\itemx{\errmessage{@itemx while not in a list environment}}
+
+% @table, @ftable, @vtable.
+\envdef\table{%
+ \let\itemindex\gobble
+ \tablecheck{table}%
+}
+\envdef\ftable{%
+ \def\itemindex ##1{\doind {fn}{\code{##1}}}%
+ \tablecheck{ftable}%
+}
+\envdef\vtable{%
+ \def\itemindex ##1{\doind {vr}{\code{##1}}}%
+ \tablecheck{vtable}%
+}
+\def\tablecheck#1{%
+ \ifnum \the\catcode`\^^M=\active
+ \endgroup
+ \errmessage{This command won't work in this context; perhaps the problem is
+ that we are \inenvironment\thisenv}%
+ \def\next{\doignore{#1}}%
+ \else
+ \let\next\tablex
+ \fi
+ \next
+}
+\def\tablex#1{%
+ \def\itemindicate{#1}%
+ \parsearg\tabley
+}
+\def\tabley#1{%
+ {%
+ \makevalueexpandable
+ \edef\temp{\noexpand\tablez #1\space\space\space}%
+ \expandafter
+ }\temp \endtablez
+}
+\def\tablez #1 #2 #3 #4\endtablez{%
+ \aboveenvbreak
+ \ifnum 0#1>0 \advance \leftskip by #1\mil \fi
+ \ifnum 0#2>0 \tableindent=#2\mil \fi
+ \ifnum 0#3>0 \advance \rightskip by #3\mil \fi
+ \itemmax=\tableindent
+ \advance \itemmax by -\itemmargin
+ \advance \leftskip by \tableindent
+ \exdentamount=\tableindent
+ \parindent = 0pt
+ \parskip = \smallskipamount
+ \ifdim \parskip=0pt \parskip=2pt \fi
+ \let\item = \internalBitem
+ \let\itemx = \internalBitemx
+}
+\def\Etable{\endgraf\afterenvbreak}
+\let\Eftable\Etable
+\let\Evtable\Etable
+\let\Eitemize\Etable
+\let\Eenumerate\Etable
+
+% This is the counter used by @enumerate, which is really @itemize
+
+\newcount \itemno
+
+\envdef\itemize{\parsearg\doitemize}
+
+\def\doitemize#1{%
+ \aboveenvbreak
+ \itemmax=\itemindent
+ \advance\itemmax by -\itemmargin
+ \advance\leftskip by \itemindent
+ \exdentamount=\itemindent
+ \parindent=0pt
+ \parskip=\smallskipamount
+ \ifdim\parskip=0pt \parskip=2pt \fi
+ \def\itemcontents{#1}%
+ % @itemize with no arg is equivalent to @itemize @bullet.
+ \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi
+ \let\item=\itemizeitem
+}
+
+% Definition of @item while inside @itemize and @enumerate.
+%
+\def\itemizeitem{%
+ \advance\itemno by 1 % for enumerations
+ {\let\par=\endgraf \smallbreak}% reasonable place to break
+ {%
+ % If the document has an @itemize directly after a section title, a
+ % \nobreak will be last on the list, and \sectionheading will have
+ % done a \vskip-\parskip. In that case, we don't want to zero
+ % parskip, or the item text will crash with the heading. On the
+ % other hand, when there is normal text preceding the item (as there
+ % usually is), we do want to zero parskip, or there would be too much
+ % space. In that case, we won't have a \nobreak before. At least
+ % that's the theory.
+ \ifnum\lastpenalty<10000 \parskip=0in \fi
+ \noindent
+ \hbox to 0pt{\hss \itemcontents \kern\itemmargin}%
+ \vadjust{\penalty 1200}}% not good to break after first line of item.
+ \flushcr
+}
+
+% \splitoff TOKENS\endmark defines \first to be the first token in
+% TOKENS, and \rest to be the remainder.
+%
+\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%
+
+% Allow an optional argument of an uppercase letter, lowercase letter,
+% or number, to specify the first label in the enumerated list. No
+% argument is the same as `1'.
+%
+\envparseargdef\enumerate{\enumeratey #1 \endenumeratey}
+\def\enumeratey #1 #2\endenumeratey{%
+ % If we were given no argument, pretend we were given `1'.
+ \def\thearg{#1}%
+ \ifx\thearg\empty \def\thearg{1}\fi
+ %
+ % Detect if the argument is a single token. If so, it might be a
+ % letter. Otherwise, the only valid thing it can be is a number.
+ % (We will always have one token, because of the test we just made.
+ % This is a good thing, since \splitoff doesn't work given nothing at
+ % all -- the first parameter is undelimited.)
+ \expandafter\splitoff\thearg\endmark
+ \ifx\rest\empty
+ % Only one token in the argument. It could still be anything.
+ % A ``lowercase letter'' is one whose \lccode is nonzero.
+ % An ``uppercase letter'' is one whose \lccode is both nonzero, and
+ % not equal to itself.
+ % Otherwise, we assume it's a number.
+ %
+ % We need the \relax at the end of the \ifnum lines to stop TeX from
+ % continuing to look for a <number>.
+ %
+ \ifnum\lccode\expandafter`\thearg=0\relax
+ \numericenumerate % a number (we hope)
+ \else
+ % It's a letter.
+ \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax
+ \lowercaseenumerate % lowercase letter
+ \else
+ \uppercaseenumerate % uppercase letter
+ \fi
+ \fi
+ \else
+ % Multiple tokens in the argument. We hope it's a number.
+ \numericenumerate
+ \fi
+}
+
+% An @enumerate whose labels are integers. The starting integer is
+% given in \thearg.
+%
+\def\numericenumerate{%
+ \itemno = \thearg
+ \startenumeration{\the\itemno}%
+}
+
+% The starting (lowercase) letter is in \thearg.
+\def\lowercaseenumerate{%
+ \itemno = \expandafter`\thearg
+ \startenumeration{%
+ % Be sure we're not beyond the end of the alphabet.
+ \ifnum\itemno=0
+ \errmessage{No more lowercase letters in @enumerate; get a bigger
+ alphabet}%
+ \fi
+ \char\lccode\itemno
+ }%
+}
+
+% The starting (uppercase) letter is in \thearg.
+\def\uppercaseenumerate{%
+ \itemno = \expandafter`\thearg
+ \startenumeration{%
+ % Be sure we're not beyond the end of the alphabet.
+ \ifnum\itemno=0
+ \errmessage{No more uppercase letters in @enumerate; get a bigger
+ alphabet}
+ \fi
+ \char\uccode\itemno
+ }%
+}
+
+% Call \doitemize, adding a period to the first argument and supplying the
+% common last two arguments. Also subtract one from the initial value in
+% \itemno, since @item increments \itemno.
+%
+\def\startenumeration#1{%
+ \advance\itemno by -1
+ \doitemize{#1.}\flushcr
+}
+
+% @alphaenumerate and @capsenumerate are abbreviations for giving an arg
+% to @enumerate.
+%
+\def\alphaenumerate{\enumerate{a}}
+\def\capsenumerate{\enumerate{A}}
+\def\Ealphaenumerate{\Eenumerate}
+\def\Ecapsenumerate{\Eenumerate}
+
+
+% @multitable macros
+% Amy Hendrickson, 8/18/94, 3/6/96
+%
+% @multitable ... @end multitable will make as many columns as desired.
+% Contents of each column will wrap at width given in preamble. Width
+% can be specified either with sample text given in a template line,
+% or in percent of \hsize, the current width of text on page.
+
+% Table can continue over pages but will only break between lines.
+
+% To make preamble:
+%
+% Either define widths of columns in terms of percent of \hsize:
+% @multitable @columnfractions .25 .3 .45
+% @item ...
+%
+% Numbers following @columnfractions are the percent of the total
+% current hsize to be used for each column. You may use as many
+% columns as desired.
+
+
+% Or use a template:
+% @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+% @item ...
+% using the widest term desired in each column.
+
+% Each new table line starts with @item, each subsequent new column
+% starts with @tab. Empty columns may be produced by supplying @tab's
+% with nothing between them for as many times as empty columns are needed,
+% ie, @tab@tab@tab will produce two empty columns.
+
+% @item, @tab do not need to be on their own lines, but it will not hurt
+% if they are.
+
+% Sample multitable:
+
+% @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+% @item first col stuff @tab second col stuff @tab third col
+% @item
+% first col stuff
+% @tab
+% second col stuff
+% @tab
+% third col
+% @item first col stuff @tab second col stuff
+% @tab Many paragraphs of text may be used in any column.
+%
+% They will wrap at the width determined by the template.
+% @item@tab@tab This will be in third column.
+% @end multitable
+
+% Default dimensions may be reset by user.
+% @multitableparskip is vertical space between paragraphs in table.
+% @multitableparindent is paragraph indent in table.
+% @multitablecolmargin is horizontal space to be left between columns.
+% @multitablelinespace is space to leave between table items, baseline
+% to baseline.
+% 0pt means it depends on current normal line spacing.
+%
+\newskip\multitableparskip
+\newskip\multitableparindent
+\newdimen\multitablecolspace
+\newskip\multitablelinespace
+\multitableparskip=0pt
+\multitableparindent=6pt
+\multitablecolspace=12pt
+\multitablelinespace=0pt
+
+% Macros used to set up halign preamble:
+%
+\let\endsetuptable\relax
+\def\xendsetuptable{\endsetuptable}
+\let\columnfractions\relax
+\def\xcolumnfractions{\columnfractions}
+\newif\ifsetpercent
+
+% #1 is the @columnfraction, usually a decimal number like .5, but might
+% be just 1. We just use it, whatever it is.
+%
+\def\pickupwholefraction#1 {%
+ \global\advance\colcount by 1
+ \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}%
+ \setuptable
+}
+
+\newcount\colcount
+\def\setuptable#1{%
+ \def\firstarg{#1}%
+ \ifx\firstarg\xendsetuptable
+ \let\go = \relax
+ \else
+ \ifx\firstarg\xcolumnfractions
+ \global\setpercenttrue
+ \else
+ \ifsetpercent
+ \let\go\pickupwholefraction
+ \else
+ \global\advance\colcount by 1
+ \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a
+ % separator; typically that is always in the input, anyway.
+ \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
+ \fi
+ \fi
+ \ifx\go\pickupwholefraction
+ % Put the argument back for the \pickupwholefraction call, so
+ % we'll always have a period there to be parsed.
+ \def\go{\pickupwholefraction#1}%
+ \else
+ \let\go = \setuptable
+ \fi%
+ \fi
+ \go
+}
+
+% multitable-only commands.
+%
+% @headitem starts a heading row, which we typeset in bold.
+% Assignments have to be global since we are inside the implicit group
+% of an alignment entry. Note that \everycr resets \everytab.
+\def\headitem{\checkenv\multitable \crcr \global\everytab={\bf}\the\everytab}%
+%
+% A \tab used to include \hskip1sp. But then the space in a template
+% line is not enough. That is bad. So let's go back to just `&' until
+% we encounter the problem it was intended to solve again.
+% --karl, nathan@acm.org, 20apr99.
+\def\tab{\checkenv\multitable &\the\everytab}%
+
+% @multitable ... @end multitable definitions:
+%
+\newtoks\everytab % insert after every tab.
+%
+\envdef\multitable{%
+ \vskip\parskip
+ \startsavinginserts
+ %
+ % @item within a multitable starts a normal row.
+ % We use \def instead of \let so that if one of the multitable entries
+ % contains an @itemize, we don't choke on the \item (seen as \crcr aka
+ % \endtemplate) expanding \doitemize.
+ \def\item{\crcr}%
+ %
+ \tolerance=9500
+ \hbadness=9500
+ \setmultitablespacing
+ \parskip=\multitableparskip
+ \parindent=\multitableparindent
+ \overfullrule=0pt
+ \global\colcount=0
+ %
+ \everycr = {%
+ \noalign{%
+ \global\everytab={}%
+ \global\colcount=0 % Reset the column counter.
+ % Check for saved footnotes, etc.
+ \checkinserts
+ % Keeps underfull box messages off when table breaks over pages.
+ %\filbreak
+ % Maybe so, but it also creates really weird page breaks when the
+ % table breaks over pages. Wouldn't \vfil be better? Wait until the
+ % problem manifests itself, so it can be fixed for real --karl.
+ }%
+ }%
+ %
+ \parsearg\domultitable
+}
+\def\domultitable#1{%
+ % To parse everything between @multitable and @item:
+ \setuptable#1 \endsetuptable
+ %
+ % This preamble sets up a generic column definition, which will
+ % be used as many times as user calls for columns.
+ % \vtop will set a single line and will also let text wrap and
+ % continue for many paragraphs if desired.
+ \halign\bgroup &%
+ \global\advance\colcount by 1
+ \multistrut
+ \vtop{%
+ % Use the current \colcount to find the correct column width:
+ \hsize=\expandafter\csname col\the\colcount\endcsname
+ %
+ % In order to keep entries from bumping into each other
+ % we will add a \leftskip of \multitablecolspace to all columns after
+ % the first one.
+ %
+ % If a template has been used, we will add \multitablecolspace
+ % to the width of each template entry.
+ %
+ % If the user has set preamble in terms of percent of \hsize we will
+ % use that dimension as the width of the column, and the \leftskip
+ % will keep entries from bumping into each other. Table will start at
+ % left margin and final column will justify at right margin.
+ %
+ % Make sure we don't inherit \rightskip from the outer environment.
+ \rightskip=0pt
+ \ifnum\colcount=1
+ % The first column will be indented with the surrounding text.
+ \advance\hsize by\leftskip
+ \else
+ \ifsetpercent \else
+ % If user has not set preamble in terms of percent of \hsize
+ % we will advance \hsize by \multitablecolspace.
+ \advance\hsize by \multitablecolspace
+ \fi
+ % In either case we will make \leftskip=\multitablecolspace:
+ \leftskip=\multitablecolspace
+ \fi
+ % Ignoring space at the beginning and end avoids an occasional spurious
+ % blank line, when TeX decides to break the line at the space before the
+ % box from the multistrut, so the strut ends up on a line by itself.
+ % For example:
+ % @multitable @columnfractions .11 .89
+ % @item @code{#}
+ % @tab Legal holiday which is valid in major parts of the whole country.
+ % Is automatically provided with highlighting sequences respectively
+ % marking characters.
+ \noindent\ignorespaces##\unskip\multistrut
+ }\cr
+}
+\def\Emultitable{%
+ \crcr
+ \egroup % end the \halign
+ \global\setpercentfalse
+}
+
+\def\setmultitablespacing{%
+ \def\multistrut{\strut}% just use the standard line spacing
+ %
+ % Compute \multitablelinespace (if not defined by user) for use in
+ % \multitableparskip calculation. We used define \multistrut based on
+ % this, but (ironically) that caused the spacing to be off.
+ % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100.
+\ifdim\multitablelinespace=0pt
+\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
+\global\advance\multitablelinespace by-\ht0
+\fi
+%% Test to see if parskip is larger than space between lines of
+%% table. If not, do nothing.
+%% If so, set to same dimension as multitablelinespace.
+\ifdim\multitableparskip>\multitablelinespace
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
+ %% than skip between lines in the table.
+\fi%
+\ifdim\multitableparskip=0pt
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
+ %% than skip between lines in the table.
+\fi}
+
+
+\message{conditionals,}
+
+% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext,
+% @ifnotxml always succeed. They currently do nothing; we don't
+% attempt to check whether the conditionals are properly nested. But we
+% have to remember that they are conditionals, so that @end doesn't
+% attempt to close an environment group.
+%
+\def\makecond#1{%
+ \expandafter\let\csname #1\endcsname = \relax
+ \expandafter\let\csname iscond.#1\endcsname = 1
+}
+\makecond{iftex}
+\makecond{ifnotdocbook}
+\makecond{ifnothtml}
+\makecond{ifnotinfo}
+\makecond{ifnotplaintext}
+\makecond{ifnotxml}
+
+% Ignore @ignore, @ifhtml, @ifinfo, and the like.
+%
+\def\direntry{\doignore{direntry}}
+\def\documentdescription{\doignore{documentdescription}}
+\def\docbook{\doignore{docbook}}
+\def\html{\doignore{html}}
+\def\ifdocbook{\doignore{ifdocbook}}
+\def\ifhtml{\doignore{ifhtml}}
+\def\ifinfo{\doignore{ifinfo}}
+\def\ifnottex{\doignore{ifnottex}}
+\def\ifplaintext{\doignore{ifplaintext}}
+\def\ifxml{\doignore{ifxml}}
+\def\ignore{\doignore{ignore}}
+\def\menu{\doignore{menu}}
+\def\xml{\doignore{xml}}
+
+% Ignore text until a line `@end #1', keeping track of nested conditionals.
+%
+% A count to remember the depth of nesting.
+\newcount\doignorecount
+
+\def\doignore#1{\begingroup
+ % Scan in ``verbatim'' mode:
+ \catcode`\@ = \other
+ \catcode`\{ = \other
+ \catcode`\} = \other
+ %
+ % Make sure that spaces turn into tokens that match what \doignoretext wants.
+ \spaceisspace
+ %
+ % Count number of #1's that we've seen.
+ \doignorecount = 0
+ %
+ % Swallow text until we reach the matching `@end #1'.
+ \dodoignore{#1}%
+}
+
+{ \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source.
+ \obeylines %
+ %
+ \gdef\dodoignore#1{%
+ % #1 contains the command name as a string, e.g., `ifinfo'.
+ %
+ % Define a command to find the next `@end #1', which must be on a line
+ % by itself.
+ \long\def\doignoretext##1^^M@end #1{\doignoretextyyy##1^^M@#1\_STOP_}%
+ % And this command to find another #1 command, at the beginning of a
+ % line. (Otherwise, we would consider a line `@c @ifset', for
+ % example, to count as an @ifset for nesting.)
+ \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}%
+ %
+ % And now expand that command.
+ \obeylines %
+ \doignoretext ^^M%
+ }%
+}
+
+\def\doignoreyyy#1{%
+ \def\temp{#1}%
+ \ifx\temp\empty % Nothing found.
+ \let\next\doignoretextzzz
+ \else % Found a nested condition, ...
+ \advance\doignorecount by 1
+ \let\next\doignoretextyyy % ..., look for another.
+ % If we're here, #1 ends with ^^M\ifinfo (for example).
+ \fi
+ \next #1% the token \_STOP_ is present just after this macro.
+}
+
+% We have to swallow the remaining "\_STOP_".
+%
+\def\doignoretextzzz#1{%
+ \ifnum\doignorecount = 0 % We have just found the outermost @end.
+ \let\next\enddoignore
+ \else % Still inside a nested condition.
+ \advance\doignorecount by -1
+ \let\next\doignoretext % Look for the next @end.
+ \fi
+ \next
+}
+
+% Finish off ignored text.
+\def\enddoignore{\endgroup\ignorespaces}
+
+
+% @set VAR sets the variable VAR to an empty value.
+% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
+%
+% Since we want to separate VAR from REST-OF-LINE (which might be
+% empty), we can't just use \parsearg; we have to insert a space of our
+% own to delimit the rest of the line, and then take it out again if we
+% didn't need it.
+% We rely on the fact that \parsearg sets \catcode`\ =10.
+%
+\parseargdef\set{\setyyy#1 \endsetyyy}
+\def\setyyy#1 #2\endsetyyy{%
+ {%
+ \makevalueexpandable
+ \def\temp{#2}%
+ \edef\next{\gdef\makecsname{SET#1}}%
+ \ifx\temp\empty
+ \next{}%
+ \else
+ \setzzz#2\endsetzzz
+ \fi
+ }%
+}
+% Remove the trailing space \setxxx inserted.
+\def\setzzz#1 \endsetzzz{\next{#1}}
+
+% @clear VAR clears (i.e., unsets) the variable VAR.
+%
+\parseargdef\clear{%
+ {%
+ \makevalueexpandable
+ \global\expandafter\let\csname SET#1\endcsname=\relax
+ }%
+}
+
+% @value{foo} gets the text saved in variable foo.
+\def\value{\begingroup\makevalueexpandable\valuexxx}
+\def\valuexxx#1{\expandablevalue{#1}\endgroup}
+{
+ \catcode`\- = \active \catcode`\_ = \active
+ %
+ \gdef\makevalueexpandable{%
+ \let\value = \expandablevalue
+ % We don't want these characters active, ...
+ \catcode`\-=\other \catcode`\_=\other
+ % ..., but we might end up with active ones in the argument if
+ % we're called from @code, as @code{@value{foo-bar_}}, though.
+ % So \let them to their normal equivalents.
+ \let-\realdash \let_\normalunderscore
+ }
+}
+
+% We have this subroutine so that we can handle at least some @value's
+% properly in indexes (we call \makevalueexpandable in \indexdummies).
+% The command has to be fully expandable (if the variable is set), since
+% the result winds up in the index file. This means that if the
+% variable's value contains other Texinfo commands, it's almost certain
+% it will fail (although perhaps we could fix that with sufficient work
+% to do a one-level expansion on the result, instead of complete).
+%
+\def\expandablevalue#1{%
+ \expandafter\ifx\csname SET#1\endcsname\relax
+ {[No value for ``#1'']}%
+ \message{Variable `#1', used in @value, is not set.}%
+ \else
+ \csname SET#1\endcsname
+ \fi
+}
+
+% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
+% with @set.
+%
+% To get special treatment of `@end ifset,' call \makeond and the redefine.
+%
+\makecond{ifset}
+\def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}}
+\def\doifset#1#2{%
+ {%
+ \makevalueexpandable
+ \let\next=\empty
+ \expandafter\ifx\csname SET#2\endcsname\relax
+ #1% If not set, redefine \next.
+ \fi
+ \expandafter
+ }\next
+}
+\def\ifsetfail{\doignore{ifset}}
+
+% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been
+% defined with @set, or has been undefined with @clear.
+%
+% The `\else' inside the `\doifset' parameter is a trick to reuse the
+% above code: if the variable is not set, do nothing, if it is set,
+% then redefine \next to \ifclearfail.
+%
+\makecond{ifclear}
+\def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}}
+\def\ifclearfail{\doignore{ifclear}}
+
+% @dircategory CATEGORY -- specify a category of the dir file
+% which this file should belong to. Ignore this in TeX.
+\let\dircategory=\comment
+
+% @defininfoenclose.
+\let\definfoenclose=\comment
+
+
+\message{indexing,}
+% Index generation facilities
+
+% Define \newwrite to be identical to plain tex's \newwrite
+% except not \outer, so it can be used within macros and \if's.
+\edef\newwrite{\makecsname{ptexnewwrite}}
+
+% \newindex {foo} defines an index named foo.
+% It automatically defines \fooindex such that
+% \fooindex ...rest of line... puts an entry in the index foo.
+% It also defines \fooindfile to be the number of the output channel for
+% the file that accumulates this index. The file's extension is foo.
+% The name of an index should be no more than 2 characters long
+% for the sake of vms.
+%
+\def\newindex#1{%
+ \iflinks
+ \expandafter\newwrite \csname#1indfile\endcsname
+ \openout \csname#1indfile\endcsname \jobname.#1 % Open the file
+ \fi
+ \expandafter\xdef\csname#1index\endcsname{% % Define @#1index
+ \noexpand\doindex{#1}}
+}
+
+% @defindex foo == \newindex{foo}
+%
+\def\defindex{\parsearg\newindex}
+
+% Define @defcodeindex, like @defindex except put all entries in @code.
+%
+\def\defcodeindex{\parsearg\newcodeindex}
+%
+\def\newcodeindex#1{%
+ \iflinks
+ \expandafter\newwrite \csname#1indfile\endcsname
+ \openout \csname#1indfile\endcsname \jobname.#1
+ \fi
+ \expandafter\xdef\csname#1index\endcsname{%
+ \noexpand\docodeindex{#1}}%
+}
+
+
+% @synindex foo bar makes index foo feed into index bar.
+% Do this instead of @defindex foo if you don't want it as a separate index.
+%
+% @syncodeindex foo bar similar, but put all entries made for index foo
+% inside @code.
+%
+\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}}
+\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}}
+
+% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo),
+% #3 the target index (bar).
+\def\dosynindex#1#2#3{%
+ % Only do \closeout if we haven't already done it, else we'll end up
+ % closing the target index.
+ \expandafter \ifx\csname donesynindex#2\endcsname \undefined
+ % The \closeout helps reduce unnecessary open files; the limit on the
+ % Acorn RISC OS is a mere 16 files.
+ \expandafter\closeout\csname#2indfile\endcsname
+ \expandafter\let\csname\donesynindex#2\endcsname = 1
+ \fi
+ % redefine \fooindfile:
+ \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname
+ \expandafter\let\csname#2indfile\endcsname=\temp
+ % redefine \fooindex:
+ \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}%
+}
+
+% Define \doindex, the driver for all \fooindex macros.
+% Argument #1 is generated by the calling \fooindex macro,
+% and it is "foo", the name of the index.
+
+% \doindex just uses \parsearg; it calls \doind for the actual work.
+% This is because \doind is more useful to call from other macros.
+
+% There is also \dosubind {index}{topic}{subtopic}
+% which makes an entry in a two-level index such as the operation index.
+
+\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer}
+\def\singleindexer #1{\doind{\indexname}{#1}}
+
+% like the previous two, but they put @code around the argument.
+\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}
+\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
+
+% Take care of Texinfo commands that can appear in an index entry.
+% Since there are some commands we want to expand, and others we don't,
+% we have to laboriously prevent expansion for those that we don't.
+%
+\def\indexdummies{%
+ \def\@{@}% change to @@ when we switch to @ as escape char in index files.
+ \def\ {\realbackslash\space }%
+ % Need these in case \tex is in effect and \{ is a \delimiter again.
+ % But can't use \lbracecmd and \rbracecmd because texindex assumes
+ % braces and backslashes are used only as delimiters.
+ \let\{ = \mylbrace
+ \let\} = \myrbrace
+ %
+ % \definedummyword defines \#1 as \realbackslash #1\space, thus
+ % effectively preventing its expansion. This is used only for control
+ % words, not control letters, because the \space would be incorrect
+ % for control characters, but is needed to separate the control word
+ % from whatever follows.
+ %
+ % For control letters, we have \definedummyletter, which omits the
+ % space.
+ %
+ % These can be used both for control words that take an argument and
+ % those that do not. If it is followed by {arg} in the input, then
+ % that will dutifully get written to the index (or wherever).
+ %
+ \def\definedummyword##1{%
+ \expandafter\def\csname ##1\endcsname{\realbackslash ##1\space}%
+ }%
+ \def\definedummyletter##1{%
+ \expandafter\def\csname ##1\endcsname{\realbackslash ##1}%
+ }%
+ \let\definedummyaccent\definedummyletter
+ %
+ % Do the redefinitions.
+ \commondummies
+}
+
+% For the aux file, @ is the escape character. So we want to redefine
+% everything using @ instead of \realbackslash. When everything uses
+% @, this will be simpler.
+%
+\def\atdummies{%
+ \def\@{@@}%
+ \def\ {@ }%
+ \let\{ = \lbraceatcmd
+ \let\} = \rbraceatcmd
+ %
+ % (See comments in \indexdummies.)
+ \def\definedummyword##1{%
+ \expandafter\def\csname ##1\endcsname{@##1\space}%
+ }%
+ \def\definedummyletter##1{%
+ \expandafter\def\csname ##1\endcsname{@##1}%
+ }%
+ \let\definedummyaccent\definedummyletter
+ %
+ % Do the redefinitions.
+ \commondummies
+}
+
+% Called from \indexdummies and \atdummies. \definedummyword and
+% \definedummyletter must be defined first.
+%
+\def\commondummies{%
+ %
+ \normalturnoffactive
+ %
+ \commondummiesnofonts
+ %
+ \definedummyletter{_}%
+ %
+ % Non-English letters.
+ \definedummyword{AA}%
+ \definedummyword{AE}%
+ \definedummyword{L}%
+ \definedummyword{OE}%
+ \definedummyword{O}%
+ \definedummyword{aa}%
+ \definedummyword{ae}%
+ \definedummyword{l}%
+ \definedummyword{oe}%
+ \definedummyword{o}%
+ \definedummyword{ss}%
+ \definedummyword{exclamdown}%
+ \definedummyword{questiondown}%
+ \definedummyword{ordf}%
+ \definedummyword{ordm}%
+ %
+ % Although these internal commands shouldn't show up, sometimes they do.
+ \definedummyword{bf}%
+ \definedummyword{gtr}%
+ \definedummyword{hat}%
+ \definedummyword{less}%
+ \definedummyword{sf}%
+ \definedummyword{sl}%
+ \definedummyword{tclose}%
+ \definedummyword{tt}%
+ %
+ \definedummyword{LaTeX}%
+ \definedummyword{TeX}%
+ %
+ % Assorted special characters.
+ \definedummyword{bullet}%
+ \definedummyword{comma}%
+ \definedummyword{copyright}%
+ \definedummyword{registeredsymbol}%
+ \definedummyword{dots}%
+ \definedummyword{enddots}%
+ \definedummyword{equiv}%
+ \definedummyword{error}%
+ \definedummyword{euro}%
+ \definedummyword{expansion}%
+ \definedummyword{minus}%
+ \definedummyword{pounds}%
+ \definedummyword{point}%
+ \definedummyword{print}%
+ \definedummyword{result}%
+ %
+ % Handle some cases of @value -- where it does not contain any
+ % (non-fully-expandable) commands.
+ \makevalueexpandable
+ %
+ % Normal spaces, not active ones.
+ \unsepspaces
+ %
+ % No macro expansion.
+ \turnoffmacros
+}
+
+% \commondummiesnofonts: common to \commondummies and \indexnofonts.
+%
+% Better have this without active chars.
+{
+ \catcode`\~=\other
+ \gdef\commondummiesnofonts{%
+ % Control letters and accents.
+ \definedummyletter{!}%
+ \definedummyaccent{"}%
+ \definedummyaccent{'}%
+ \definedummyletter{*}%
+ \definedummyaccent{,}%
+ \definedummyletter{.}%
+ \definedummyletter{/}%
+ \definedummyletter{:}%
+ \definedummyaccent{=}%
+ \definedummyletter{?}%
+ \definedummyaccent{^}%
+ \definedummyaccent{`}%
+ \definedummyaccent{~}%
+ \definedummyword{u}%
+ \definedummyword{v}%
+ \definedummyword{H}%
+ \definedummyword{dotaccent}%
+ \definedummyword{ringaccent}%
+ \definedummyword{tieaccent}%
+ \definedummyword{ubaraccent}%
+ \definedummyword{udotaccent}%
+ \definedummyword{dotless}%
+ %
+ % Texinfo font commands.
+ \definedummyword{b}%
+ \definedummyword{i}%
+ \definedummyword{r}%
+ \definedummyword{sc}%
+ \definedummyword{t}%
+ %
+ % Commands that take arguments.
+ \definedummyword{acronym}%
+ \definedummyword{cite}%
+ \definedummyword{code}%
+ \definedummyword{command}%
+ \definedummyword{dfn}%
+ \definedummyword{emph}%
+ \definedummyword{env}%
+ \definedummyword{file}%
+ \definedummyword{kbd}%
+ \definedummyword{key}%
+ \definedummyword{math}%
+ \definedummyword{option}%
+ \definedummyword{samp}%
+ \definedummyword{strong}%
+ \definedummyword{tie}%
+ \definedummyword{uref}%
+ \definedummyword{url}%
+ \definedummyword{var}%
+ \definedummyword{verb}%
+ \definedummyword{w}%
+ }
+}
+
+% \indexnofonts is used when outputting the strings to sort the index
+% by, and when constructing control sequence names. It eliminates all
+% control sequences and just writes whatever the best ASCII sort string
+% would be for a given command (usually its argument).
+%
+\def\indexnofonts{%
+ % Accent commands should become @asis.
+ \def\definedummyaccent##1{%
+ \expandafter\let\csname ##1\endcsname\asis
+ }%
+ % We can just ignore other control letters.
+ \def\definedummyletter##1{%
+ \expandafter\def\csname ##1\endcsname{}%
+ }%
+ % Hopefully, all control words can become @asis.
+ \let\definedummyword\definedummyaccent
+ %
+ \commondummiesnofonts
+ %
+ % Don't no-op \tt, since it isn't a user-level command
+ % and is used in the definitions of the active chars like <, >, |, etc.
+ % Likewise with the other plain tex font commands.
+ %\let\tt=\asis
+ %
+ \def\ { }%
+ \def\@{@}%
+ % how to handle braces?
+ \def\_{\normalunderscore}%
+ %
+ % Non-English letters.
+ \def\AA{AA}%
+ \def\AE{AE}%
+ \def\L{L}%
+ \def\OE{OE}%
+ \def\O{O}%
+ \def\aa{aa}%
+ \def\ae{ae}%
+ \def\l{l}%
+ \def\oe{oe}%
+ \def\o{o}%
+ \def\ss{ss}%
+ \def\exclamdown{!}%
+ \def\questiondown{?}%
+ \def\ordf{a}%
+ \def\ordm{o}%
+ %
+ \def\LaTeX{LaTeX}%
+ \def\TeX{TeX}%
+ %
+ % Assorted special characters.
+ % (The following {} will end up in the sort string, but that's ok.)
+ \def\bullet{bullet}%
+ \def\comma{,}%
+ \def\copyright{copyright}%
+ \def\registeredsymbol{R}%
+ \def\dots{...}%
+ \def\enddots{...}%
+ \def\equiv{==}%
+ \def\error{error}%
+ \def\euro{euro}%
+ \def\expansion{==>}%
+ \def\minus{-}%
+ \def\pounds{pounds}%
+ \def\point{.}%
+ \def\print{-|}%
+ \def\result{=>}%
+ %
+ % Don't write macro names.
+ \emptyusermacros
+}
+
+\let\indexbackslash=0 %overridden during \printindex.
+\let\SETmarginindex=\relax % put index entries in margin (undocumented)?
+
+% Most index entries go through here, but \dosubind is the general case.
+% #1 is the index name, #2 is the entry text.
+\def\doind#1#2{\dosubind{#1}{#2}{}}
+
+% Workhorse for all \fooindexes.
+% #1 is name of index, #2 is stuff to put there, #3 is subentry --
+% empty if called from \doind, as we usually are (the main exception
+% is with most defuns, which call us directly).
+%
+\def\dosubind#1#2#3{%
+ \iflinks
+ {%
+ % Store the main index entry text (including the third arg).
+ \toks0 = {#2}%
+ % If third arg is present, precede it with a space.
+ \def\thirdarg{#3}%
+ \ifx\thirdarg\empty \else
+ \toks0 = \expandafter{\the\toks0 \space #3}%
+ \fi
+ %
+ \edef\writeto{\csname#1indfile\endcsname}%
+ %
+ \ifvmode
+ \dosubindsanitize
+ \else
+ \dosubindwrite
+ \fi
+ }%
+ \fi
+}
+
+% Write the entry in \toks0 to the index file:
+%
+\def\dosubindwrite{%
+ % Put the index entry in the margin if desired.
+ \ifx\SETmarginindex\relax\else
+ \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}%
+ \fi
+ %
+ % Remember, we are within a group.
+ \indexdummies % Must do this here, since \bf, etc expand at this stage
+ \escapechar=`\\
+ \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now
+ % so it will be output as is; and it will print as backslash.
+ %
+ % Process the index entry with all font commands turned off, to
+ % get the string to sort by.
+ {\indexnofonts
+ \edef\temp{\the\toks0}% need full expansion
+ \xdef\indexsorttmp{\temp}%
+ }%
+ %
+ % Set up the complete index entry, with both the sort key and
+ % the original text, including any font commands. We write
+ % three arguments to \entry to the .?? file (four in the
+ % subentry case), texindex reduces to two when writing the .??s
+ % sorted result.
+ \edef\temp{%
+ \write\writeto{%
+ \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}%
+ }%
+ \temp
+}
+
+% Take care of unwanted page breaks:
+%
+% If a skip is the last thing on the list now, preserve it
+% by backing up by \lastskip, doing the \write, then inserting
+% the skip again. Otherwise, the whatsit generated by the
+% \write will make \lastskip zero. The result is that sequences
+% like this:
+% @end defun
+% @tindex whatever
+% @defun ...
+% will have extra space inserted, because the \medbreak in the
+% start of the @defun won't see the skip inserted by the @end of
+% the previous defun.
+%
+% But don't do any of this if we're not in vertical mode. We
+% don't want to do a \vskip and prematurely end a paragraph.
+%
+% Avoid page breaks due to these extra skips, too.
+%
+% But wait, there is a catch there:
+% We'll have to check whether \lastskip is zero skip. \ifdim is not
+% sufficient for this purpose, as it ignores stretch and shrink parts
+% of the skip. The only way seems to be to check the textual
+% representation of the skip.
+%
+% The following is almost like \def\zeroskipmacro{0.0pt} except that
+% the ``p'' and ``t'' characters have catcode \other, not 11 (letter).
+%
+\edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname}
+%
+% ..., ready, GO:
+%
+\def\dosubindsanitize{%
+ % \lastskip and \lastpenalty cannot both be nonzero simultaneously.
+ \skip0 = \lastskip
+ \edef\lastskipmacro{\the\lastskip}%
+ \count255 = \lastpenalty
+ %
+ % If \lastskip is nonzero, that means the last item was a
+ % skip. And since a skip is discardable, that means this
+ % -\skip0 glue we're inserting is preceded by a
+ % non-discardable item, therefore it is not a potential
+ % breakpoint, therefore no \nobreak needed.
+ \ifx\lastskipmacro\zeroskipmacro
+ \else
+ \vskip-\skip0
+ \fi
+ %
+ \dosubindwrite
+ %
+ \ifx\lastskipmacro\zeroskipmacro
+ % If \lastskip was zero, perhaps the last item was a penalty, and
+ % perhaps it was >=10000, e.g., a \nobreak. In that case, we want
+ % to re-insert the same penalty (values >10000 are used for various
+ % signals); since we just inserted a non-discardable item, any
+ % following glue (such as a \parskip) would be a breakpoint. For example:
+ %
+ % @deffn deffn-whatever
+ % @vindex index-whatever
+ % Description.
+ % would allow a break between the index-whatever whatsit
+ % and the "Description." paragraph.
+ \ifnum\count255>9999 \penalty\count255 \fi
+ \else
+ % On the other hand, if we had a nonzero \lastskip,
+ % this make-up glue would be preceded by a non-discardable item
+ % (the whatsit from the \write), so we must insert a \nobreak.
+ \nobreak\vskip\skip0
+ \fi
+}
+
+% The index entry written in the file actually looks like
+% \entry {sortstring}{page}{topic}
+% or
+% \entry {sortstring}{page}{topic}{subtopic}
+% The texindex program reads in these files and writes files
+% containing these kinds of lines:
+% \initial {c}
+% before the first topic whose initial is c
+% \entry {topic}{pagelist}
+% for a topic that is used without subtopics
+% \primary {topic}
+% for the beginning of a topic that is used with subtopics
+% \secondary {subtopic}{pagelist}
+% for each subtopic.
+
+% Define the user-accessible indexing commands
+% @findex, @vindex, @kindex, @cindex.
+
+\def\findex {\fnindex}
+\def\kindex {\kyindex}
+\def\cindex {\cpindex}
+\def\vindex {\vrindex}
+\def\tindex {\tpindex}
+\def\pindex {\pgindex}
+
+\def\cindexsub {\begingroup\obeylines\cindexsub}
+{\obeylines %
+\gdef\cindexsub "#1" #2^^M{\endgroup %
+\dosubind{cp}{#2}{#1}}}
+
+% Define the macros used in formatting output of the sorted index material.
+
+% @printindex causes a particular index (the ??s file) to get printed.
+% It does not print any chapter heading (usually an @unnumbered).
+%
+\parseargdef\printindex{\begingroup
+ \dobreak \chapheadingskip{10000}%
+ %
+ \smallfonts \rm
+ \tolerance = 9500
+ \everypar = {}% don't want the \kern\-parindent from indentation suppression.
+ %
+ % See if the index file exists and is nonempty.
+ % Change catcode of @ here so that if the index file contains
+ % \initial {@}
+ % as its first line, TeX doesn't complain about mismatched braces
+ % (because it thinks @} is a control sequence).
+ \catcode`\@ = 11
+ \openin 1 \jobname.#1s
+ \ifeof 1
+ % \enddoublecolumns gets confused if there is no text in the index,
+ % and it loses the chapter title and the aux file entries for the
+ % index. The easiest way to prevent this problem is to make sure
+ % there is some text.
+ \putwordIndexNonexistent
+ \else
+ %
+ % If the index file exists but is empty, then \openin leaves \ifeof
+ % false. We have to make TeX try to read something from the file, so
+ % it can discover if there is anything in it.
+ \read 1 to \temp
+ \ifeof 1
+ \putwordIndexIsEmpty
+ \else
+ % Index files are almost Texinfo source, but we use \ as the escape
+ % character. It would be better to use @, but that's too big a change
+ % to make right now.
+ \def\indexbackslash{\backslashcurfont}%
+ \catcode`\\ = 0
+ \escapechar = `\\
+ \begindoublecolumns
+ \input \jobname.#1s
+ \enddoublecolumns
+ \fi
+ \fi
+ \closein 1
+\endgroup}
+
+% These macros are used by the sorted index file itself.
+% Change them to control the appearance of the index.
+
+\def\initial#1{{%
+ % Some minor font changes for the special characters.
+ \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
+ %
+ % Remove any glue we may have, we'll be inserting our own.
+ \removelastskip
+ %
+ % We like breaks before the index initials, so insert a bonus.
+ \nobreak
+ \vskip 0pt plus 3\baselineskip
+ \penalty 0
+ \vskip 0pt plus -3\baselineskip
+ %
+ % Typeset the initial. Making this add up to a whole number of
+ % baselineskips increases the chance of the dots lining up from column
+ % to column. It still won't often be perfect, because of the stretch
+ % we need before each entry, but it's better.
+ %
+ % No shrink because it confuses \balancecolumns.
+ \vskip 1.67\baselineskip plus .5\baselineskip
+ \leftline{\secbf #1}%
+ % Do our best not to break after the initial.
+ \nobreak
+ \vskip .33\baselineskip plus .1\baselineskip
+}}
+
+% \entry typesets a paragraph consisting of the text (#1), dot leaders, and
+% then page number (#2) flushed to the right margin. It is used for index
+% and table of contents entries. The paragraph is indented by \leftskip.
+%
+% A straightforward implementation would start like this:
+% \def\entry#1#2{...
+% But this frozes the catcodes in the argument, and can cause problems to
+% @code, which sets - active. This problem was fixed by a kludge---
+% ``-'' was active throughout whole index, but this isn't really right.
+%
+% The right solution is to prevent \entry from swallowing the whole text.
+% --kasal, 21nov03
+\def\entry{%
+ \begingroup
+ %
+ % Start a new paragraph if necessary, so our assignments below can't
+ % affect previous text.
+ \par
+ %
+ % Do not fill out the last line with white space.
+ \parfillskip = 0in
+ %
+ % No extra space above this paragraph.
+ \parskip = 0in
+ %
+ % Do not prefer a separate line ending with a hyphen to fewer lines.
+ \finalhyphendemerits = 0
+ %
+ % \hangindent is only relevant when the entry text and page number
+ % don't both fit on one line. In that case, bob suggests starting the
+ % dots pretty far over on the line. Unfortunately, a large
+ % indentation looks wrong when the entry text itself is broken across
+ % lines. So we use a small indentation and put up with long leaders.
+ %
+ % \hangafter is reset to 1 (which is the value we want) at the start
+ % of each paragraph, so we need not do anything with that.
+ \hangindent = 2em
+ %
+ % When the entry text needs to be broken, just fill out the first line
+ % with blank space.
+ \rightskip = 0pt plus1fil
+ %
+ % A bit of stretch before each entry for the benefit of balancing
+ % columns.
+ \vskip 0pt plus1pt
+ %
+ % Swallow the left brace of the text (first parameter):
+ \afterassignment\doentry
+ \let\temp =
+}
+\def\doentry{%
+ \bgroup % Instead of the swallowed brace.
+ \noindent
+ \aftergroup\finishentry
+ % And now comes the text of the entry.
+}
+\def\finishentry#1{%
+ % #1 is the page number.
+ %
+ % The following is kludged to not output a line of dots in the index if
+ % there are no page numbers. The next person who breaks this will be
+ % cursed by a Unix daemon.
+ \def\tempa{{\rm }}%
+ \def\tempb{#1}%
+ \edef\tempc{\tempa}%
+ \edef\tempd{\tempb}%
+ \ifx\tempc\tempd
+ \ %
+ \else
+ %
+ % If we must, put the page number on a line of its own, and fill out
+ % this line with blank space. (The \hfil is overwhelmed with the
+ % fill leaders glue in \indexdotfill if the page number does fit.)
+ \hfil\penalty50
+ \null\nobreak\indexdotfill % Have leaders before the page number.
+ %
+ % The `\ ' here is removed by the implicit \unskip that TeX does as
+ % part of (the primitive) \par. Without it, a spurious underfull
+ % \hbox ensues.
+ \ifpdf
+ \pdfgettoks#1.%
+ \ \the\toksA
+ \else
+ \ #1%
+ \fi
+ \fi
+ \par
+ \endgroup
+}
+
+% Like \dotfill except takes at least 1 em.
+\def\indexdotfill{\cleaders
+ \hbox{$\mathsurround=0pt \mkern1.5mu ${\it .}$ \mkern1.5mu$}\hskip 1em plus 1fill}
+
+\def\primary #1{\line{#1\hfil}}
+
+\newskip\secondaryindent \secondaryindent=0.5cm
+\def\secondary#1#2{{%
+ \parfillskip=0in
+ \parskip=0in
+ \hangindent=1in
+ \hangafter=1
+ \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill
+ \ifpdf
+ \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
+ \else
+ #2
+ \fi
+ \par
+}}
+
+% Define two-column mode, which we use to typeset indexes.
+% Adapted from the TeXbook, page 416, which is to say,
+% the manmac.tex format used to print the TeXbook itself.
+\catcode`\@=11
+
+\newbox\partialpage
+\newdimen\doublecolumnhsize
+
+\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
+ % Grab any single-column material above us.
+ \output = {%
+ %
+ % Here is a possibility not foreseen in manmac: if we accumulate a
+ % whole lot of material, we might end up calling this \output
+ % routine twice in a row (see the doublecol-lose test, which is
+ % essentially a couple of indexes with @setchapternewpage off). In
+ % that case we just ship out what is in \partialpage with the normal
+ % output routine. Generally, \partialpage will be empty when this
+ % runs and this will be a no-op. See the indexspread.tex test case.
+ \ifvoid\partialpage \else
+ \onepageout{\pagecontents\partialpage}%
+ \fi
+ %
+ \global\setbox\partialpage = \vbox{%
+ % Unvbox the main output page.
+ \unvbox\PAGE
+ \kern-\topskip \kern\baselineskip
+ }%
+ }%
+ \eject % run that output routine to set \partialpage
+ %
+ % Use the double-column output routine for subsequent pages.
+ \output = {\doublecolumnout}%
+ %
+ % Change the page size parameters. We could do this once outside this
+ % routine, in each of @smallbook, @afourpaper, and the default 8.5x11
+ % format, but then we repeat the same computation. Repeating a couple
+ % of assignments once per index is clearly meaningless for the
+ % execution time, so we may as well do it in one place.
+ %
+ % First we halve the line length, less a little for the gutter between
+ % the columns. We compute the gutter based on the line length, so it
+ % changes automatically with the paper format. The magic constant
+ % below is chosen so that the gutter has the same value (well, +-<1pt)
+ % as it did when we hard-coded it.
+ %
+ % We put the result in a separate register, \doublecolumhsize, so we
+ % can restore it in \pagesofar, after \hsize itself has (potentially)
+ % been clobbered.
+ %
+ \doublecolumnhsize = \hsize
+ \advance\doublecolumnhsize by -.04154\hsize
+ \divide\doublecolumnhsize by 2
+ \hsize = \doublecolumnhsize
+ %
+ % Double the \vsize as well. (We don't need a separate register here,
+ % since nobody clobbers \vsize.)
+ \vsize = 2\vsize
+}
+
+% The double-column output routine for all double-column pages except
+% the last.
+%
+\def\doublecolumnout{%
+ \splittopskip=\topskip \splitmaxdepth=\maxdepth
+ % Get the available space for the double columns -- the normal
+ % (undoubled) page height minus any material left over from the
+ % previous page.
+ \dimen@ = \vsize
+ \divide\dimen@ by 2
+ \advance\dimen@ by -\ht\partialpage
+ %
+ % box0 will be the left-hand column, box2 the right.
+ \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
+ \onepageout\pagesofar
+ \unvbox255
+ \penalty\outputpenalty
+}
+%
+% Re-output the contents of the output page -- any previous material,
+% followed by the two boxes we just split, in box0 and box2.
+\def\pagesofar{%
+ \unvbox\partialpage
+ %
+ \hsize = \doublecolumnhsize
+ \wd0=\hsize \wd2=\hsize
+ \hbox to\pagewidth{\box0\hfil\box2}%
+}
+%
+% All done with double columns.
+\def\enddoublecolumns{%
+ \output = {%
+ % Split the last of the double-column material. Leave it on the
+ % current page, no automatic page break.
+ \balancecolumns
+ %
+ % If we end up splitting too much material for the current page,
+ % though, there will be another page break right after this \output
+ % invocation ends. Having called \balancecolumns once, we do not
+ % want to call it again. Therefore, reset \output to its normal
+ % definition right away. (We hope \balancecolumns will never be
+ % called on to balance too much material, but if it is, this makes
+ % the output somewhat more palatable.)
+ \global\output = {\onepageout{\pagecontents\PAGE}}%
+ }%
+ \eject
+ \endgroup % started in \begindoublecolumns
+ %
+ % \pagegoal was set to the doubled \vsize above, since we restarted
+ % the current page. We're now back to normal single-column
+ % typesetting, so reset \pagegoal to the normal \vsize (after the
+ % \endgroup where \vsize got restored).
+ \pagegoal = \vsize
+}
+%
+% Called at the end of the double column material.
+\def\balancecolumns{%
+ \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120.
+ \dimen@ = \ht0
+ \advance\dimen@ by \topskip
+ \advance\dimen@ by-\baselineskip
+ \divide\dimen@ by 2 % target to split to
+ %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}%
+ \splittopskip = \topskip
+ % Loop until we get a decent breakpoint.
+ {%
+ \vbadness = 10000
+ \loop
+ \global\setbox3 = \copy0
+ \global\setbox1 = \vsplit3 to \dimen@
+ \ifdim\ht3>\dimen@
+ \global\advance\dimen@ by 1pt
+ \repeat
+ }%
+ %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}%
+ \setbox0=\vbox to\dimen@{\unvbox1}%
+ \setbox2=\vbox to\dimen@{\unvbox3}%
+ %
+ \pagesofar
+}
+\catcode`\@ = \other
+
+
+\message{sectioning,}
+% Chapters, sections, etc.
+
+% \unnumberedno is an oxymoron, of course. But we count the unnumbered
+% sections so that we can refer to them unambiguously in the pdf
+% outlines by their "section number". We avoid collisions with chapter
+% numbers by starting them at 10000. (If a document ever has 10000
+% chapters, we're in trouble anyway, I'm sure.)
+\newcount\unnumberedno \unnumberedno = 10000
+\newcount\chapno
+\newcount\secno \secno=0
+\newcount\subsecno \subsecno=0
+\newcount\subsubsecno \subsubsecno=0
+
+% This counter is funny since it counts through charcodes of letters A, B, ...
+\newcount\appendixno \appendixno = `\@
+%
+% \def\appendixletter{\char\the\appendixno}
+% We do the following ugly conditional instead of the above simple
+% construct for the sake of pdftex, which needs the actual
+% letter in the expansion, not just typeset.
+%
+\def\appendixletter{%
+ \ifnum\appendixno=`A A%
+ \else\ifnum\appendixno=`B B%
+ \else\ifnum\appendixno=`C C%
+ \else\ifnum\appendixno=`D D%
+ \else\ifnum\appendixno=`E E%
+ \else\ifnum\appendixno=`F F%
+ \else\ifnum\appendixno=`G G%
+ \else\ifnum\appendixno=`H H%
+ \else\ifnum\appendixno=`I I%
+ \else\ifnum\appendixno=`J J%
+ \else\ifnum\appendixno=`K K%
+ \else\ifnum\appendixno=`L L%
+ \else\ifnum\appendixno=`M M%
+ \else\ifnum\appendixno=`N N%
+ \else\ifnum\appendixno=`O O%
+ \else\ifnum\appendixno=`P P%
+ \else\ifnum\appendixno=`Q Q%
+ \else\ifnum\appendixno=`R R%
+ \else\ifnum\appendixno=`S S%
+ \else\ifnum\appendixno=`T T%
+ \else\ifnum\appendixno=`U U%
+ \else\ifnum\appendixno=`V V%
+ \else\ifnum\appendixno=`W W%
+ \else\ifnum\appendixno=`X X%
+ \else\ifnum\appendixno=`Y Y%
+ \else\ifnum\appendixno=`Z Z%
+ % The \the is necessary, despite appearances, because \appendixletter is
+ % expanded while writing the .toc file. \char\appendixno is not
+ % expandable, thus it is written literally, thus all appendixes come out
+ % with the same letter (or @) in the toc without it.
+ \else\char\the\appendixno
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
+
+% Each @chapter defines this as the name of the chapter.
+% page headings and footings can use it. @section does likewise.
+% However, they are not reliable, because we don't use marks.
+\def\thischapter{}
+\def\thissection{}
+
+\newcount\absseclevel % used to calculate proper heading level
+\newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count
+
+% @raisesections: treat @section as chapter, @subsection as section, etc.
+\def\raisesections{\global\advance\secbase by -1}
+\let\up=\raisesections % original BFox name
+
+% @lowersections: treat @chapter as section, @section as subsection, etc.
+\def\lowersections{\global\advance\secbase by 1}
+\let\down=\lowersections % original BFox name
+
+% we only have subsub.
+\chardef\maxseclevel = 3
+%
+% A numbered section within an unnumbered changes to unnumbered too.
+% To achive this, remember the "biggest" unnum. sec. we are currently in:
+\chardef\unmlevel = \maxseclevel
+%
+% Trace whether the current chapter is an appendix or not:
+% \chapheadtype is "N" or "A", unnumbered chapters are ignored.
+\def\chapheadtype{N}
+
+% Choose a heading macro
+% #1 is heading type
+% #2 is heading level
+% #3 is text for heading
+\def\genhead#1#2#3{%
+ % Compute the abs. sec. level:
+ \absseclevel=#2
+ \advance\absseclevel by \secbase
+ % Make sure \absseclevel doesn't fall outside the range:
+ \ifnum \absseclevel < 0
+ \absseclevel = 0
+ \else
+ \ifnum \absseclevel > 3
+ \absseclevel = 3
+ \fi
+ \fi
+ % The heading type:
+ \def\headtype{#1}%
+ \if \headtype U%
+ \ifnum \absseclevel < \unmlevel
+ \chardef\unmlevel = \absseclevel
+ \fi
+ \else
+ % Check for appendix sections:
+ \ifnum \absseclevel = 0
+ \edef\chapheadtype{\headtype}%
+ \else
+ \if \headtype A\if \chapheadtype N%
+ \errmessage{@appendix... within a non-appendix chapter}%
+ \fi\fi
+ \fi
+ % Check for numbered within unnumbered:
+ \ifnum \absseclevel > \unmlevel
+ \def\headtype{U}%
+ \else
+ \chardef\unmlevel = 3
+ \fi
+ \fi
+ % Now print the heading:
+ \if \headtype U%
+ \ifcase\absseclevel
+ \unnumberedzzz{#3}%
+ \or \unnumberedseczzz{#3}%
+ \or \unnumberedsubseczzz{#3}%
+ \or \unnumberedsubsubseczzz{#3}%
+ \fi
+ \else
+ \if \headtype A%
+ \ifcase\absseclevel
+ \appendixzzz{#3}%
+ \or \appendixsectionzzz{#3}%
+ \or \appendixsubseczzz{#3}%
+ \or \appendixsubsubseczzz{#3}%
+ \fi
+ \else
+ \ifcase\absseclevel
+ \chapterzzz{#3}%
+ \or \seczzz{#3}%
+ \or \numberedsubseczzz{#3}%
+ \or \numberedsubsubseczzz{#3}%
+ \fi
+ \fi
+ \fi
+ \suppressfirstparagraphindent
+}
+
+% an interface:
+\def\numhead{\genhead N}
+\def\apphead{\genhead A}
+\def\unnmhead{\genhead U}
+
+% @chapter, @appendix, @unnumbered. Increment top-level counter, reset
+% all lower-level sectioning counters to zero.
+%
+% Also set \chaplevelprefix, which we prepend to @float sequence numbers
+% (e.g., figures), q.v. By default (before any chapter), that is empty.
+\let\chaplevelprefix = \empty
+%
+\outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz
+\def\chapterzzz#1{%
+ % section resetting is \global in case the chapter is in a group, such
+ % as an @include file.
+ \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+ \global\advance\chapno by 1
+ %
+ % Used for \float.
+ \gdef\chaplevelprefix{\the\chapno.}%
+ \resetallfloatnos
+ %
+ \message{\putwordChapter\space \the\chapno}%
+ %
+ % Write the actual heading.
+ \chapmacro{#1}{Ynumbered}{\the\chapno}%
+ %
+ % So @section and the like are numbered underneath this chapter.
+ \global\let\section = \numberedsec
+ \global\let\subsection = \numberedsubsec
+ \global\let\subsubsection = \numberedsubsubsec
+}
+
+\outer\parseargdef\appendix{\apphead0{#1}} % normally apphead0 calls appendixzzz
+\def\appendixzzz#1{%
+ \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+ \global\advance\appendixno by 1
+ \gdef\chaplevelprefix{\appendixletter.}%
+ \resetallfloatnos
+ %
+ \def\appendixnum{\putwordAppendix\space \appendixletter}%
+ \message{\appendixnum}%
+ %
+ \chapmacro{#1}{Yappendix}{\appendixletter}%
+ %
+ \global\let\section = \appendixsec
+ \global\let\subsection = \appendixsubsec
+ \global\let\subsubsection = \appendixsubsubsec
+}
+
+\outer\parseargdef\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz
+\def\unnumberedzzz#1{%
+ \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+ \global\advance\unnumberedno by 1
+ %
+ % Since an unnumbered has no number, no prefix for figures.
+ \global\let\chaplevelprefix = \empty
+ \resetallfloatnos
+ %
+ % This used to be simply \message{#1}, but TeX fully expands the
+ % argument to \message. Therefore, if #1 contained @-commands, TeX
+ % expanded them. For example, in `@unnumbered The @cite{Book}', TeX
+ % expanded @cite (which turns out to cause errors because \cite is meant
+ % to be executed, not expanded).
+ %
+ % Anyway, we don't want the fully-expanded definition of @cite to appear
+ % as a result of the \message, we just want `@cite' itself. We use
+ % \the<toks register> to achieve this: TeX expands \the<toks> only once,
+ % simply yielding the contents of <toks register>. (We also do this for
+ % the toc entries.)
+ \toks0 = {#1}%
+ \message{(\the\toks0)}%
+ %
+ \chapmacro{#1}{Ynothing}{\the\unnumberedno}%
+ %
+ \global\let\section = \unnumberedsec
+ \global\let\subsection = \unnumberedsubsec
+ \global\let\subsubsection = \unnumberedsubsubsec
+}
+
+% @centerchap is like @unnumbered, but the heading is centered.
+\outer\parseargdef\centerchap{%
+ % Well, we could do the following in a group, but that would break
+ % an assumption that \chapmacro is called at the outermost level.
+ % Thus we are safer this way: --kasal, 24feb04
+ \let\centerparametersmaybe = \centerparameters
+ \unnmhead0{#1}%
+ \let\centerparametersmaybe = \relax
+}
+
+% @top is like @unnumbered.
+\let\top\unnumbered
+
+% Sections.
+\outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz
+\def\seczzz#1{%
+ \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1
+ \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}%
+}
+
+\outer\parseargdef\appendixsection{\apphead1{#1}} % normally calls appendixsectionzzz
+\def\appendixsectionzzz#1{%
+ \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1
+ \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}%
+}
+\let\appendixsec\appendixsection
+
+\outer\parseargdef\unnumberedsec{\unnmhead1{#1}} % normally calls unnumberedseczzz
+\def\unnumberedseczzz#1{%
+ \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1
+ \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}%
+}
+
+% Subsections.
+\outer\parseargdef\numberedsubsec{\numhead2{#1}} % normally calls numberedsubseczzz
+\def\numberedsubseczzz#1{%
+ \global\subsubsecno=0 \global\advance\subsecno by 1
+ \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}%
+}
+
+\outer\parseargdef\appendixsubsec{\apphead2{#1}} % normally calls appendixsubseczzz
+\def\appendixsubseczzz#1{%
+ \global\subsubsecno=0 \global\advance\subsecno by 1
+ \sectionheading{#1}{subsec}{Yappendix}%
+ {\appendixletter.\the\secno.\the\subsecno}%
+}
+
+\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
+\def\unnumberedsubseczzz#1{%
+ \global\subsubsecno=0 \global\advance\subsecno by 1
+ \sectionheading{#1}{subsec}{Ynothing}%
+ {\the\unnumberedno.\the\secno.\the\subsecno}%
+}
+
+% Subsubsections.
+\outer\parseargdef\numberedsubsubsec{\numhead3{#1}} % normally numberedsubsubseczzz
+\def\numberedsubsubseczzz#1{%
+ \global\advance\subsubsecno by 1
+ \sectionheading{#1}{subsubsec}{Ynumbered}%
+ {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+\outer\parseargdef\appendixsubsubsec{\apphead3{#1}} % normally appendixsubsubseczzz
+\def\appendixsubsubseczzz#1{%
+ \global\advance\subsubsecno by 1
+ \sectionheading{#1}{subsubsec}{Yappendix}%
+ {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
+\def\unnumberedsubsubseczzz#1{%
+ \global\advance\subsubsecno by 1
+ \sectionheading{#1}{subsubsec}{Ynothing}%
+ {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+% These macros control what the section commands do, according
+% to what kind of chapter we are in (ordinary, appendix, or unnumbered).
+% Define them by default for a numbered chapter.
+\let\section = \numberedsec
+\let\subsection = \numberedsubsec
+\let\subsubsection = \numberedsubsubsec
+
+% Define @majorheading, @heading and @subheading
+
+% NOTE on use of \vbox for chapter headings, section headings, and such:
+% 1) We use \vbox rather than the earlier \line to permit
+% overlong headings to fold.
+% 2) \hyphenpenalty is set to 10000 because hyphenation in a
+% heading is obnoxious; this forbids it.
+% 3) Likewise, headings look best if no \parindent is used, and
+% if justification is not attempted. Hence \raggedright.
+
+
+\def\majorheading{%
+ {\advance\chapheadingskip by 10pt \chapbreak }%
+ \parsearg\chapheadingzzz
+}
+
+\def\chapheading{\chapbreak \parsearg\chapheadingzzz}
+\def\chapheadingzzz#1{%
+ {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}%
+ \bigskip \par\penalty 200\relax
+ \suppressfirstparagraphindent
+}
+
+% @heading, @subheading, @subsubheading.
+\parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{}
+ \suppressfirstparagraphindent}
+\parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{}
+ \suppressfirstparagraphindent}
+\parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{}
+ \suppressfirstparagraphindent}
+
+% These macros generate a chapter, section, etc. heading only
+% (including whitespace, linebreaking, etc. around it),
+% given all the information in convenient, parsed form.
+
+%%% Args are the skip and penalty (usually negative)
+\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
+
+%%% Define plain chapter starts, and page on/off switching for it
+% Parameter controlling skip before chapter headings (if needed)
+
+\newskip\chapheadingskip
+
+\def\chapbreak{\dobreak \chapheadingskip {-4000}}
+\def\chappager{\par\vfill\supereject}
+\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi}
+
+\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
+
+\def\CHAPPAGoff{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chapbreak
+\global\let\pagealignmacro=\chappager}
+
+\def\CHAPPAGon{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chappager
+\global\let\pagealignmacro=\chappager
+\global\def\HEADINGSon{\HEADINGSsingle}}
+
+\def\CHAPPAGodd{%
+\global\let\contentsalignmacro = \chapoddpage
+\global\let\pchapsepmacro=\chapoddpage
+\global\let\pagealignmacro=\chapoddpage
+\global\def\HEADINGSon{\HEADINGSdouble}}
+
+\CHAPPAGon
+
+% Chapter opening.
+%
+% #1 is the text, #2 is the section type (Ynumbered, Ynothing,
+% Yappendix, Yomitfromtoc), #3 the chapter number.
+%
+% To test against our argument.
+\def\Ynothingkeyword{Ynothing}
+\def\Yomitfromtockeyword{Yomitfromtoc}
+\def\Yappendixkeyword{Yappendix}
+%
+\def\chapmacro#1#2#3{%
+ \pchapsepmacro
+ {%
+ \chapfonts \rm
+ %
+ % Have to define \thissection before calling \donoderef, because the
+ % xref code eventually uses it. On the other hand, it has to be called
+ % after \pchapsepmacro, or the headline will change too soon.
+ \gdef\thissection{#1}%
+ \gdef\thischaptername{#1}%
+ %
+ % Only insert the separating space if we have a chapter/appendix
+ % number, and don't print the unnumbered ``number''.
+ \def\temptype{#2}%
+ \ifx\temptype\Ynothingkeyword
+ \setbox0 = \hbox{}%
+ \def\toctype{unnchap}%
+ \def\thischapter{#1}%
+ \else\ifx\temptype\Yomitfromtockeyword
+ \setbox0 = \hbox{}% contents like unnumbered, but no toc entry
+ \def\toctype{omit}%
+ \xdef\thischapter{}%
+ \else\ifx\temptype\Yappendixkeyword
+ \setbox0 = \hbox{\putwordAppendix{} #3\enspace}%
+ \def\toctype{app}%
+ % We don't substitute the actual chapter name into \thischapter
+ % because we don't want its macros evaluated now. And we don't
+ % use \thissection because that changes with each section.
+ %
+ \xdef\thischapter{\putwordAppendix{} \appendixletter:
+ \noexpand\thischaptername}%
+ \else
+ \setbox0 = \hbox{#3\enspace}%
+ \def\toctype{numchap}%
+ \xdef\thischapter{\putwordChapter{} \the\chapno:
+ \noexpand\thischaptername}%
+ \fi\fi\fi
+ %
+ % Write the toc entry for this chapter. Must come before the
+ % \donoderef, because we include the current node name in the toc
+ % entry, and \donoderef resets it to empty.
+ \writetocentry{\toctype}{#1}{#3}%
+ %
+ % For pdftex, we have to write out the node definition (aka, make
+ % the pdfdest) after any page break, but before the actual text has
+ % been typeset. If the destination for the pdf outline is after the
+ % text, then jumping from the outline may wind up with the text not
+ % being visible, for instance under high magnification.
+ \donoderef{#2}%
+ %
+ % Typeset the actual heading.
+ \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
+ \hangindent=\wd0 \centerparametersmaybe
+ \unhbox0 #1\par}%
+ }%
+ \nobreak\bigskip % no page break after a chapter title
+ \nobreak
+}
+
+% @centerchap -- centered and unnumbered.
+\let\centerparametersmaybe = \relax
+\def\centerparameters{%
+ \advance\rightskip by 3\rightskip
+ \leftskip = \rightskip
+ \parfillskip = 0pt
+}
+
+
+% I don't think this chapter style is supported any more, so I'm not
+% updating it with the new noderef stuff. We'll see. --karl, 11aug03.
+%
+\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
+%
+\def\unnchfopen #1{%
+\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}\bigskip \par\nobreak
+}
+\def\chfopen #1#2{\chapoddpage {\chapfonts
+\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
+\par\penalty 5000 %
+}
+\def\centerchfopen #1{%
+\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt
+ \hfill {\rm #1}\hfill}}\bigskip \par\nobreak
+}
+\def\CHAPFopen{%
+ \global\let\chapmacro=\chfopen
+ \global\let\centerchapmacro=\centerchfopen}
+
+
+% Section titles. These macros combine the section number parts and
+% call the generic \sectionheading to do the printing.
+%
+\newskip\secheadingskip
+\def\secheadingbreak{\dobreak \secheadingskip{-1000}}
+
+% Subsection titles.
+\newskip\subsecheadingskip
+\def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}}
+
+% Subsubsection titles.
+\def\subsubsecheadingskip{\subsecheadingskip}
+\def\subsubsecheadingbreak{\subsecheadingbreak}
+
+
+% Print any size, any type, section title.
+%
+% #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is
+% the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the
+% section number.
+%
+\def\sectionheading#1#2#3#4{%
+ {%
+ % Switch to the right set of fonts.
+ \csname #2fonts\endcsname \rm
+ %
+ % Insert space above the heading.
+ \csname #2headingbreak\endcsname
+ %
+ % Only insert the space after the number if we have a section number.
+ \def\sectionlevel{#2}%
+ \def\temptype{#3}%
+ %
+ \ifx\temptype\Ynothingkeyword
+ \setbox0 = \hbox{}%
+ \def\toctype{unn}%
+ \gdef\thissection{#1}%
+ \else\ifx\temptype\Yomitfromtockeyword
+ % for @headings -- no section number, don't include in toc,
+ % and don't redefine \thissection.
+ \setbox0 = \hbox{}%
+ \def\toctype{omit}%
+ \let\sectionlevel=\empty
+ \else\ifx\temptype\Yappendixkeyword
+ \setbox0 = \hbox{#4\enspace}%
+ \def\toctype{app}%
+ \gdef\thissection{#1}%
+ \else
+ \setbox0 = \hbox{#4\enspace}%
+ \def\toctype{num}%
+ \gdef\thissection{#1}%
+ \fi\fi\fi
+ %
+ % Write the toc entry (before \donoderef). See comments in \chfplain.
+ \writetocentry{\toctype\sectionlevel}{#1}{#4}%
+ %
+ % Write the node reference (= pdf destination for pdftex).
+ % Again, see comments in \chfplain.
+ \donoderef{#3}%
+ %
+ % Output the actual section heading.
+ \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
+ \hangindent=\wd0 % zero if no section number
+ \unhbox0 #1}%
+ }%
+ % Add extra space after the heading -- half of whatever came above it.
+ % Don't allow stretch, though.
+ \kern .5 \csname #2headingskip\endcsname
+ %
+ % Do not let the kern be a potential breakpoint, as it would be if it
+ % was followed by glue.
+ \nobreak
+ %
+ % We'll almost certainly start a paragraph next, so don't let that
+ % glue accumulate. (Not a breakpoint because it's preceded by a
+ % discardable item.)
+ \vskip-\parskip
+ %
+ % This is purely so the last item on the list is a known \penalty >
+ % 10000. This is so \startdefun can avoid allowing breakpoints after
+ % section headings. Otherwise, it would insert a valid breakpoint between:
+ %
+ % @section sec-whatever
+ % @deffn def-whatever
+ \penalty 10001
+}
+
+
+\message{toc,}
+% Table of contents.
+\newwrite\tocfile
+
+% Write an entry to the toc file, opening it if necessary.
+% Called from @chapter, etc.
+%
+% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno}
+% We append the current node name (if any) and page number as additional
+% arguments for the \{chap,sec,...}entry macros which will eventually
+% read this. The node name is used in the pdf outlines as the
+% destination to jump to.
+%
+% We open the .toc file for writing here instead of at @setfilename (or
+% any other fixed time) so that @contents can be anywhere in the document.
+% But if #1 is `omit', then we don't do anything. This is used for the
+% table of contents chapter openings themselves.
+%
+\newif\iftocfileopened
+\def\omitkeyword{omit}%
+%
+\def\writetocentry#1#2#3{%
+ \edef\writetoctype{#1}%
+ \ifx\writetoctype\omitkeyword \else
+ \iftocfileopened\else
+ \immediate\openout\tocfile = \jobname.toc
+ \global\tocfileopenedtrue
+ \fi
+ %
+ \iflinks
+ \toks0 = {#2}%
+ \toks2 = \expandafter{\lastnode}%
+ \edef\temp{\write\tocfile{\realbackslash #1entry{\the\toks0}{#3}%
+ {\the\toks2}{\noexpand\folio}}}%
+ \temp
+ \fi
+ \fi
+ %
+ % Tell \shipout to create a pdf destination on each page, if we're
+ % writing pdf. These are used in the table of contents. We can't
+ % just write one on every page because the title pages are numbered
+ % 1 and 2 (the page numbers aren't printed), and so are the first
+ % two pages of the document. Thus, we'd have two destinations named
+ % `1', and two named `2'.
+ \ifpdf \global\pdfmakepagedesttrue \fi
+}
+
+\newskip\contentsrightmargin \contentsrightmargin=1in
+\newcount\savepageno
+\newcount\lastnegativepageno \lastnegativepageno = -1
+
+% Prepare to read what we've written to \tocfile.
+%
+\def\startcontents#1{%
+ % If @setchapternewpage on, and @headings double, the contents should
+ % start on an odd page, unlike chapters. Thus, we maintain
+ % \contentsalignmacro in parallel with \pagealignmacro.
+ % From: Torbjorn Granlund <tege@matematik.su.se>
+ \contentsalignmacro
+ \immediate\closeout\tocfile
+ %
+ % Don't need to put `Contents' or `Short Contents' in the headline.
+ % It is abundantly clear what they are.
+ \def\thischapter{}%
+ \chapmacro{#1}{Yomitfromtoc}{}%
+ %
+ \savepageno = \pageno
+ \begingroup % Set up to handle contents files properly.
+ \catcode`\\=0 \catcode`\{=1 \catcode`\}=2 \catcode`\@=11
+ % We can't do this, because then an actual ^ in a section
+ % title fails, e.g., @chapter ^ -- exponentiation. --karl, 9jul97.
+ %\catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi
+ \raggedbottom % Worry more about breakpoints than the bottom.
+ \advance\hsize by -\contentsrightmargin % Don't use the full line length.
+ %
+ % Roman numerals for page numbers.
+ \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi
+}
+
+
+% Normal (long) toc.
+\def\contents{%
+ \startcontents{\putwordTOC}%
+ \openin 1 \jobname.toc
+ \ifeof 1 \else
+ \input \jobname.toc
+ \fi
+ \vfill \eject
+ \contentsalignmacro % in case @setchapternewpage odd is in effect
+ \ifeof 1 \else
+ \pdfmakeoutlines
+ \fi
+ \closein 1
+ \endgroup
+ \lastnegativepageno = \pageno
+ \global\pageno = \savepageno
+}
+
+% And just the chapters.
+\def\summarycontents{%
+ \startcontents{\putwordShortTOC}%
+ %
+ \let\numchapentry = \shortchapentry
+ \let\appentry = \shortchapentry
+ \let\unnchapentry = \shortunnchapentry
+ % We want a true roman here for the page numbers.
+ \secfonts
+ \let\rm=\shortcontrm \let\bf=\shortcontbf
+ \let\sl=\shortcontsl \let\tt=\shortconttt
+ \rm
+ \hyphenpenalty = 10000
+ \advance\baselineskip by 1pt % Open it up a little.
+ \def\numsecentry##1##2##3##4{}
+ \let\appsecentry = \numsecentry
+ \let\unnsecentry = \numsecentry
+ \let\numsubsecentry = \numsecentry
+ \let\appsubsecentry = \numsecentry
+ \let\unnsubsecentry = \numsecentry
+ \let\numsubsubsecentry = \numsecentry
+ \let\appsubsubsecentry = \numsecentry
+ \let\unnsubsubsecentry = \numsecentry
+ \openin 1 \jobname.toc
+ \ifeof 1 \else
+ \input \jobname.toc
+ \fi
+ \closein 1
+ \vfill \eject
+ \contentsalignmacro % in case @setchapternewpage odd is in effect
+ \endgroup
+ \lastnegativepageno = \pageno
+ \global\pageno = \savepageno
+}
+\let\shortcontents = \summarycontents
+
+% Typeset the label for a chapter or appendix for the short contents.
+% The arg is, e.g., `A' for an appendix, or `3' for a chapter.
+%
+\def\shortchaplabel#1{%
+ % This space should be enough, since a single number is .5em, and the
+ % widest letter (M) is 1em, at least in the Computer Modern fonts.
+ % But use \hss just in case.
+ % (This space doesn't include the extra space that gets added after
+ % the label; that gets put in by \shortchapentry above.)
+ %
+ % We'd like to right-justify chapter numbers, but that looks strange
+ % with appendix letters. And right-justifying numbers and
+ % left-justifying letters looks strange when there is less than 10
+ % chapters. Have to read the whole toc once to know how many chapters
+ % there are before deciding ...
+ \hbox to 1em{#1\hss}%
+}
+
+% These macros generate individual entries in the table of contents.
+% The first argument is the chapter or section name.
+% The last argument is the page number.
+% The arguments in between are the chapter number, section number, ...
+
+% Chapters, in the main contents.
+\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}}
+%
+% Chapters, in the short toc.
+% See comments in \dochapentry re vbox and related settings.
+\def\shortchapentry#1#2#3#4{%
+ \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}%
+}
+
+% Appendices, in the main contents.
+% Need the word Appendix, and a fixed-size box.
+%
+\def\appendixbox#1{%
+ % We use M since it's probably the widest letter.
+ \setbox0 = \hbox{\putwordAppendix{} M}%
+ \hbox to \wd0{\putwordAppendix{} #1\hss}}
+%
+\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}}
+
+% Unnumbered chapters.
+\def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}}
+\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}}
+
+% Sections.
+\def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}}
+\let\appsecentry=\numsecentry
+\def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}}
+
+% Subsections.
+\def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}}
+\let\appsubsecentry=\numsubsecentry
+\def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}}
+
+% And subsubsections.
+\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}}
+\let\appsubsubsecentry=\numsubsubsecentry
+\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}}
+
+% This parameter controls the indentation of the various levels.
+% Same as \defaultparindent.
+\newdimen\tocindent \tocindent = 15pt
+
+% Now for the actual typesetting. In all these, #1 is the text and #2 is the
+% page number.
+%
+% If the toc has to be broken over pages, we want it to be at chapters
+% if at all possible; hence the \penalty.
+\def\dochapentry#1#2{%
+ \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip
+ \begingroup
+ \chapentryfonts
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+ \endgroup
+ \nobreak\vskip .25\baselineskip plus.1\baselineskip
+}
+
+\def\dosecentry#1#2{\begingroup
+ \secentryfonts \leftskip=\tocindent
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsecentry#1#2{\begingroup
+ \subsecentryfonts \leftskip=2\tocindent
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsubsecentry#1#2{\begingroup
+ \subsubsecentryfonts \leftskip=3\tocindent
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+% We use the same \entry macro as for the index entries.
+\let\tocentry = \entry
+
+% Space between chapter (or whatever) number and the title.
+\def\labelspace{\hskip1em \relax}
+
+\def\dopageno#1{{\rm #1}}
+\def\doshortpageno#1{{\rm #1}}
+
+\def\chapentryfonts{\secfonts \rm}
+\def\secentryfonts{\textfonts}
+\def\subsecentryfonts{\textfonts}
+\def\subsubsecentryfonts{\textfonts}
+
+
+\message{environments,}
+% @foo ... @end foo.
+
+% @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
+%
+% Since these characters are used in examples, it should be an even number of
+% \tt widths. Each \tt character is 1en, so two makes it 1em.
+%
+\def\point{$\star$}
+\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
+\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}}
+\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
+\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}}
+
+% The @error{} command.
+% Adapted from the TeXbook's \boxit.
+%
+\newbox\errorbox
+%
+{\tentt \global\dimen0 = 3em}% Width of the box.
+\dimen2 = .55pt % Thickness of rules
+% The text. (`r' is open on the right, `e' somewhat less so on the left.)
+\setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt}
+%
+\setbox\errorbox=\hbox to \dimen0{\hfil
+ \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
+ \advance\hsize by -2\dimen2 % Rules.
+ \vbox{%
+ \hrule height\dimen2
+ \hbox{\vrule width\dimen2 \kern3pt % Space to left of text.
+ \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
+ \kern3pt\vrule width\dimen2}% Space to right.
+ \hrule height\dimen2}
+ \hfil}
+%
+\def\error{\leavevmode\lower.7ex\copy\errorbox}
+
+% @tex ... @end tex escapes into raw Tex temporarily.
+% One exception: @ is still an escape character, so that @end tex works.
+% But \@ or @@ will get a plain tex @ character.
+
+\envdef\tex{%
+ \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
+ \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
+ \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie
+ \catcode `\%=14
+ \catcode `\+=\other
+ \catcode `\"=\other
+ \catcode `\|=\other
+ \catcode `\<=\other
+ \catcode `\>=\other
+ \escapechar=`\\
+ %
+ \let\b=\ptexb
+ \let\bullet=\ptexbullet
+ \let\c=\ptexc
+ \let\,=\ptexcomma
+ \let\.=\ptexdot
+ \let\dots=\ptexdots
+ \let\equiv=\ptexequiv
+ \let\!=\ptexexclam
+ \let\i=\ptexi
+ \let\indent=\ptexindent
+ \let\noindent=\ptexnoindent
+ \let\{=\ptexlbrace
+ \let\+=\tabalign
+ \let\}=\ptexrbrace
+ \let\/=\ptexslash
+ \let\*=\ptexstar
+ \let\t=\ptext
+ %
+ \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
+ \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
+ \def\@{@}%
+}
+% There is no need to define \Etex.
+
+% Define @lisp ... @end lisp.
+% @lisp environment forms a group so it can rebind things,
+% including the definition of @end lisp (which normally is erroneous).
+
+% Amount to narrow the margins by for @lisp.
+\newskip\lispnarrowing \lispnarrowing=0.4in
+
+% This is the definition that ^^M gets inside @lisp, @example, and other
+% such environments. \null is better than a space, since it doesn't
+% have any width.
+\def\lisppar{\null\endgraf}
+
+% This space is always present above and below environments.
+\newskip\envskipamount \envskipamount = 0pt
+
+% Make spacing and below environment symmetrical. We use \parskip here
+% to help in doing that, since in @example-like environments \parskip
+% is reset to zero; thus the \afterenvbreak inserts no space -- but the
+% start of the next paragraph will insert \parskip.
+%
+\def\aboveenvbreak{{%
+ % =10000 instead of <10000 because of a special case in \itemzzz and
+ % \sectionheading, q.v.
+ \ifnum \lastpenalty=10000 \else
+ \advance\envskipamount by \parskip
+ \endgraf
+ \ifdim\lastskip<\envskipamount
+ \removelastskip
+ % it's not a good place to break if the last penalty was \nobreak
+ % or better ...
+ \ifnum\lastpenalty<10000 \penalty-50 \fi
+ \vskip\envskipamount
+ \fi
+ \fi
+}}
+
+\let\afterenvbreak = \aboveenvbreak
+
+% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins.
+\let\nonarrowing=\relax
+
+% @cartouche ... @end cartouche: draw rectangle w/rounded corners around
+% environment contents.
+\font\circle=lcircle10
+\newdimen\circthick
+\newdimen\cartouter\newdimen\cartinner
+\newskip\normbskip\newskip\normpskip\newskip\normlskip
+\circthick=\fontdimen8\circle
+%
+\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth
+\def\ctr{{\hskip 6pt\circle\char'010}}
+\def\cbl{{\circle\char'012\hskip -6pt}}
+\def\cbr{{\hskip 6pt\circle\char'011}}
+\def\carttop{\hbox to \cartouter{\hskip\lskip
+ \ctl\leaders\hrule height\circthick\hfil\ctr
+ \hskip\rskip}}
+\def\cartbot{\hbox to \cartouter{\hskip\lskip
+ \cbl\leaders\hrule height\circthick\hfil\cbr
+ \hskip\rskip}}
+%
+\newskip\lskip\newskip\rskip
+
+\envdef\cartouche{%
+ \ifhmode\par\fi % can't be in the midst of a paragraph.
+ \startsavinginserts
+ \lskip=\leftskip \rskip=\rightskip
+ \leftskip=0pt\rightskip=0pt % we want these *outside*.
+ \cartinner=\hsize \advance\cartinner by-\lskip
+ \advance\cartinner by-\rskip
+ \cartouter=\hsize
+ \advance\cartouter by 18.4pt % allow for 3pt kerns on either
+ % side, and for 6pt waste from
+ % each corner char, and rule thickness
+ \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
+ % Flag to tell @lisp, etc., not to narrow margin.
+ \let\nonarrowing=\comment
+ \vbox\bgroup
+ \baselineskip=0pt\parskip=0pt\lineskip=0pt
+ \carttop
+ \hbox\bgroup
+ \hskip\lskip
+ \vrule\kern3pt
+ \vbox\bgroup
+ \kern3pt
+ \hsize=\cartinner
+ \baselineskip=\normbskip
+ \lineskip=\normlskip
+ \parskip=\normpskip
+ \vskip -\parskip
+ \comment % For explanation, see the end of \def\group.
+}
+\def\Ecartouche{%
+ \ifhmode\par\fi
+ \kern3pt
+ \egroup
+ \kern3pt\vrule
+ \hskip\rskip
+ \egroup
+ \cartbot
+ \egroup
+ \checkinserts
+}
+
+
+% This macro is called at the beginning of all the @example variants,
+% inside a group.
+\def\nonfillstart{%
+ \aboveenvbreak
+ \hfuzz = 12pt % Don't be fussy
+ \sepspaces % Make spaces be word-separators rather than space tokens.
+ \let\par = \lisppar % don't ignore blank lines
+ \obeylines % each line of input is a line of output
+ \parskip = 0pt
+ \parindent = 0pt
+ \emergencystretch = 0pt % don't try to avoid overfull boxes
+ % @cartouche defines \nonarrowing to inhibit narrowing
+ % at next level down.
+ \ifx\nonarrowing\relax
+ \advance \leftskip by \lispnarrowing
+ \exdentamount=\lispnarrowing
+ \fi
+ \let\exdent=\nofillexdent
+}
+
+% If you want all examples etc. small: @set dispenvsize small.
+% If you want even small examples the full size: @set dispenvsize nosmall.
+% This affects the following displayed environments:
+% @example, @display, @format, @lisp
+%
+\def\smallword{small}
+\def\nosmallword{nosmall}
+\let\SETdispenvsize\relax
+\def\setnormaldispenv{%
+ \ifx\SETdispenvsize\smallword
+ \smallexamplefonts \rm
+ \fi
+}
+\def\setsmalldispenv{%
+ \ifx\SETdispenvsize\nosmallword
+ \else
+ \smallexamplefonts \rm
+ \fi
+}
+
+% We often define two environments, @foo and @smallfoo.
+% Let's do it by one command:
+\def\makedispenv #1#2{
+ \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}
+ \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}
+ \expandafter\let\csname E#1\endcsname \afterenvbreak
+ \expandafter\let\csname Esmall#1\endcsname \afterenvbreak
+}
+
+% Define two synonyms:
+\def\maketwodispenvs #1#2#3{
+ \makedispenv{#1}{#3}
+ \makedispenv{#2}{#3}
+}
+
+% @lisp: indented, narrowed, typewriter font; @example: same as @lisp.
+%
+% @smallexample and @smalllisp: use smaller fonts.
+% Originally contributed by Pavel@xerox.
+%
+\maketwodispenvs {lisp}{example}{%
+ \nonfillstart
+ \tt
+ \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
+ \gobble % eat return
+}
+
+% @display/@smalldisplay: same as @lisp except keep current font.
+%
+\makedispenv {display}{%
+ \nonfillstart
+ \gobble
+}
+
+% @format/@smallformat: same as @display except don't narrow margins.
+%
+\makedispenv{format}{%
+ \let\nonarrowing = t%
+ \nonfillstart
+ \gobble
+}
+
+% @flushleft: same as @format, but doesn't obey \SETdispenvsize.
+\envdef\flushleft{%
+ \let\nonarrowing = t%
+ \nonfillstart
+ \gobble
+}
+\let\Eflushleft = \afterenvbreak
+
+% @flushright.
+%
+\envdef\flushright{%
+ \let\nonarrowing = t%
+ \nonfillstart
+ \advance\leftskip by 0pt plus 1fill
+ \gobble
+}
+\let\Eflushright = \afterenvbreak
+
+
+% @quotation does normal linebreaking (hence we can't use \nonfillstart)
+% and narrows the margins. We keep \parskip nonzero in general, since
+% we're doing normal filling. So, when using \aboveenvbreak and
+% \afterenvbreak, temporarily make \parskip 0.
+%
+\envdef\quotation{%
+ {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
+ \parindent=0pt
+ %
+ % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
+ \ifx\nonarrowing\relax
+ \advance\leftskip by \lispnarrowing
+ \advance\rightskip by \lispnarrowing
+ \exdentamount = \lispnarrowing
+ \let\nonarrowing = \relax
+ \fi
+ \parsearg\quotationlabel
+}
+
+% We have retained a nonzero parskip for the environment, since we're
+% doing normal filling.
+%
+\def\Equotation{%
+ \par
+ \ifx\quotationauthor\undefined\else
+ % indent a bit.
+ \leftline{\kern 2\leftskip \sl ---\quotationauthor}%
+ \fi
+ {\parskip=0pt \afterenvbreak}%
+}
+
+% If we're given an argument, typeset it in bold with a colon after.
+\def\quotationlabel#1{%
+ \def\temp{#1}%
+ \ifx\temp\empty \else
+ {\bf #1: }%
+ \fi
+}
+
+
+% LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>}
+% If we want to allow any <char> as delimiter,
+% we need the curly braces so that makeinfo sees the @verb command, eg:
+% `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org
+%
+% [Knuth]: Donald Ervin Knuth, 1996. The TeXbook.
+%
+% [Knuth] p.344; only we need to do the other characters Texinfo sets
+% active too. Otherwise, they get lost as the first character on a
+% verbatim line.
+\def\dospecials{%
+ \do\ \do\\\do\{\do\}\do\$\do\&%
+ \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~%
+ \do\<\do\>\do\|\do\@\do+\do\"%
+}
+%
+% [Knuth] p. 380
+\def\uncatcodespecials{%
+ \def\do##1{\catcode`##1=\other}\dospecials}
+%
+% [Knuth] pp. 380,381,391
+% Disable Spanish ligatures ?` and !` of \tt font
+\begingroup
+ \catcode`\`=\active\gdef`{\relax\lq}
+\endgroup
+%
+% Setup for the @verb command.
+%
+% Eight spaces for a tab
+\begingroup
+ \catcode`\^^I=\active
+ \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }}
+\endgroup
+%
+\def\setupverb{%
+ \tt % easiest (and conventionally used) font for verbatim
+ \def\par{\leavevmode\endgraf}%
+ \catcode`\`=\active
+ \tabeightspaces
+ % Respect line breaks,
+ % print special symbols as themselves, and
+ % make each space count
+ % must do in this order:
+ \obeylines \uncatcodespecials \sepspaces
+}
+
+% Setup for the @verbatim environment
+%
+% Real tab expansion
+\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount
+%
+\def\starttabbox{\setbox0=\hbox\bgroup}
+\begingroup
+ \catcode`\^^I=\active
+ \gdef\tabexpand{%
+ \catcode`\^^I=\active
+ \def^^I{\leavevmode\egroup
+ \dimen0=\wd0 % the width so far, or since the previous tab
+ \divide\dimen0 by\tabw
+ \multiply\dimen0 by\tabw % compute previous multiple of \tabw
+ \advance\dimen0 by\tabw % advance to next multiple of \tabw
+ \wd0=\dimen0 \box0 \starttabbox
+ }%
+ }
+\endgroup
+\def\setupverbatim{%
+ \nonfillstart
+ \advance\leftskip by -\defbodyindent
+ % Easiest (and conventionally used) font for verbatim
+ \tt
+ \def\par{\leavevmode\egroup\box0\endgraf}%
+ \catcode`\`=\active
+ \tabexpand
+ % Respect line breaks,
+ % print special symbols as themselves, and
+ % make each space count
+ % must do in this order:
+ \obeylines \uncatcodespecials \sepspaces
+ \everypar{\starttabbox}%
+}
+
+% Do the @verb magic: verbatim text is quoted by unique
+% delimiter characters. Before first delimiter expect a
+% right brace, after last delimiter expect closing brace:
+%
+% \def\doverb'{'<char>#1<char>'}'{#1}
+%
+% [Knuth] p. 382; only eat outer {}
+\begingroup
+ \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other
+ \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next]
+\endgroup
+%
+\def\verb{\begingroup\setupverb\doverb}
+%
+%
+% Do the @verbatim magic: define the macro \doverbatim so that
+% the (first) argument ends when '@end verbatim' is reached, ie:
+%
+% \def\doverbatim#1@end verbatim{#1}
+%
+% For Texinfo it's a lot easier than for LaTeX,
+% because texinfo's \verbatim doesn't stop at '\end{verbatim}':
+% we need not redefine '\', '{' and '}'.
+%
+% Inspired by LaTeX's verbatim command set [latex.ltx]
+%
+\begingroup
+ \catcode`\ =\active
+ \obeylines %
+ % ignore everything up to the first ^^M, that's the newline at the end
+ % of the @verbatim input line itself. Otherwise we get an extra blank
+ % line in the output.
+ \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}%
+ % We really want {...\end verbatim} in the body of the macro, but
+ % without the active space; thus we have to use \xdef and \gobble.
+\endgroup
+%
+\envdef\verbatim{%
+ \setupverbatim\doverbatim
+}
+\let\Everbatim = \afterenvbreak
+
+
+% @verbatiminclude FILE - insert text of file in verbatim environment.
+%
+\def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude}
+%
+\def\doverbatiminclude#1{%
+ {%
+ \makevalueexpandable
+ \setupverbatim
+ \input #1
+ \afterenvbreak
+ }%
+}
+
+% @copying ... @end copying.
+% Save the text away for @insertcopying later.
+%
+% We save the uninterpreted tokens, rather than creating a box.
+% Saving the text in a box would be much easier, but then all the
+% typesetting commands (@smallbook, font changes, etc.) have to be done
+% beforehand -- and a) we want @copying to be done first in the source
+% file; b) letting users define the frontmatter in as flexible order as
+% possible is very desirable.
+%
+\def\copying{\checkenv{}\begingroup\scanargctxt\docopying}
+\def\docopying#1@end copying{\endgroup\def\copyingtext{#1}}
+%
+\def\insertcopying{%
+ \begingroup
+ \parindent = 0pt % paragraph indentation looks wrong on title page
+ \scanexp\copyingtext
+ \endgroup
+}
+
+\message{defuns,}
+% @defun etc.
+
+\newskip\defbodyindent \defbodyindent=.4in
+\newskip\defargsindent \defargsindent=50pt
+\newskip\deflastargmargin \deflastargmargin=18pt
+
+% Start the processing of @deffn:
+\def\startdefun{%
+ \ifnum\lastpenalty<10000
+ \medbreak
+ \else
+ % If there are two @def commands in a row, we'll have a \nobreak,
+ % which is there to keep the function description together with its
+ % header. But if there's nothing but headers, we need to allow a
+ % break somewhere. Check specifically for penalty 10002, inserted
+ % by \defargscommonending, instead of 10000, since the sectioning
+ % commands also insert a nobreak penalty, and we don't want to allow
+ % a break between a section heading and a defun.
+ %
+ \ifnum\lastpenalty=10002 \penalty2000 \fi
+ %
+ % Similarly, after a section heading, do not allow a break.
+ % But do insert the glue.
+ \medskip % preceded by discardable penalty, so not a breakpoint
+ \fi
+ %
+ \parindent=0in
+ \advance\leftskip by \defbodyindent
+ \exdentamount=\defbodyindent
+}
+
+\def\dodefunx#1{%
+ % First, check whether we are in the right environment:
+ \checkenv#1%
+ %
+ % As above, allow line break if we have multiple x headers in a row.
+ % It's not a great place, though.
+ \ifnum\lastpenalty=10002 \penalty3000 \fi
+ %
+ % And now, it's time to reuse the body of the original defun:
+ \expandafter\gobbledefun#1%
+}
+\def\gobbledefun#1\startdefun{}
+
+% \printdefunline \deffnheader{text}
+%
+\def\printdefunline#1#2{%
+ \begingroup
+ % call \deffnheader:
+ #1#2 \endheader
+ % common ending:
+ \interlinepenalty = 10000
+ \advance\rightskip by 0pt plus 1fil
+ \endgraf
+ \nobreak\vskip -\parskip
+ \penalty 10002 % signal to \startdefun and \dodefunx
+ % Some of the @defun-type tags do not enable magic parentheses,
+ % rendering the following check redundant. But we don't optimize.
+ \checkparencounts
+ \endgroup
+}
+
+\def\Edefun{\endgraf\medbreak}
+
+% \makedefun{deffn} creates \deffn, \deffnx and \Edeffn;
+% the only thing remainnig is to define \deffnheader.
+%
+\def\makedefun#1{%
+ \expandafter\let\csname E#1\endcsname = \Edefun
+ \edef\temp{\noexpand\domakedefun
+ \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}%
+ \temp
+}
+
+% \domakedefun \deffn \deffnx \deffnheader
+%
+% Define \deffn and \deffnx, without parameters.
+% \deffnheader has to be defined explicitly.
+%
+\def\domakedefun#1#2#3{%
+ \envdef#1{%
+ \startdefun
+ \parseargusing\activeparens{\printdefunline#3}%
+ }%
+ \def#2{\dodefunx#1}%
+ \def#3%
+}
+
+%%% Untyped functions:
+
+% @deffn category name args
+\makedefun{deffn}{\deffngeneral{}}
+
+% @deffn category class name args
+\makedefun{defop}#1 {\defopon{#1\ \putwordon}}
+
+% \defopon {category on}class name args
+\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
+
+% \deffngeneral {subind}category name args
+%
+\def\deffngeneral#1#2 #3 #4\endheader{%
+ % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}.
+ \dosubind{fn}{\code{#3}}{#1}%
+ \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}%
+}
+
+%%% Typed functions:
+
+% @deftypefn category type name args
+\makedefun{deftypefn}{\deftypefngeneral{}}
+
+% @deftypeop category class type name args
+\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}}
+
+% \deftypeopon {category on}class type name args
+\def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
+
+% \deftypefngeneral {subind}category type name args
+%
+\def\deftypefngeneral#1#2 #3 #4 #5\endheader{%
+ \dosubind{fn}{\code{#4}}{#1}%
+ \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
+}
+
+%%% Typed variables:
+
+% @deftypevr category type var args
+\makedefun{deftypevr}{\deftypecvgeneral{}}
+
+% @deftypecv category class type var args
+\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}}
+
+% \deftypecvof {category of}class type var args
+\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} }
+
+% \deftypecvgeneral {subind}category type var args
+%
+\def\deftypecvgeneral#1#2 #3 #4 #5\endheader{%
+ \dosubind{vr}{\code{#4}}{#1}%
+ \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
+}
+
+%%% Untyped variables:
+
+% @defvr category var args
+\makedefun{defvr}#1 {\deftypevrheader{#1} {} }
+
+% @defcv category class var args
+\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}}
+
+% \defcvof {category of}class var args
+\def\defcvof#1#2 {\deftypecvof{#1}#2 {} }
+
+%%% Type:
+% @deftp category name args
+\makedefun{deftp}#1 #2 #3\endheader{%
+ \doind{tp}{\code{#2}}%
+ \defname{#1}{}{#2}\defunargs{#3\unskip}%
+}
+
+% Remaining @defun-like shortcuts:
+\makedefun{defun}{\deffnheader{\putwordDeffunc} }
+\makedefun{defmac}{\deffnheader{\putwordDefmac} }
+\makedefun{defspec}{\deffnheader{\putwordDefspec} }
+\makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} }
+\makedefun{defvar}{\defvrheader{\putwordDefvar} }
+\makedefun{defopt}{\defvrheader{\putwordDefopt} }
+\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} }
+\makedefun{defmethod}{\defopon\putwordMethodon}
+\makedefun{deftypemethod}{\deftypeopon\putwordMethodon}
+\makedefun{defivar}{\defcvof\putwordInstanceVariableof}
+\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof}
+
+% \defname, which formats the name of the @def (not the args).
+% #1 is the category, such as "Function".
+% #2 is the return type, if any.
+% #3 is the function name.
+%
+% We are followed by (but not passed) the arguments, if any.
+%
+\def\defname#1#2#3{%
+ % Get the values of \leftskip and \rightskip as they were outside the @def...
+ \advance\leftskip by -\defbodyindent
+ %
+ % How we'll format the type name. Putting it in brackets helps
+ % distinguish it from the body text that may end up on the next line
+ % just below it.
+ \def\temp{#1}%
+ \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi}
+ %
+ % Figure out line sizes for the paragraph shape.
+ % The first line needs space for \box0; but if \rightskip is nonzero,
+ % we need only space for the part of \box0 which exceeds it:
+ \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip
+ % The continuations:
+ \dimen2=\hsize \advance\dimen2 by -\defargsindent
+ % (plain.tex says that \dimen1 should be used only as global.)
+ \parshape 2 0in \dimen0 \defargsindent \dimen2
+ %
+ % Put the type name to the right margin.
+ \noindent
+ \hbox to 0pt{%
+ \hfil\box0 \kern-\hsize
+ % \hsize has to be shortened this way:
+ \kern\leftskip
+ % Intentionally do not respect \rightskip, since we need the space.
+ }%
+ %
+ % Allow all lines to be underfull without complaint:
+ \tolerance=10000 \hbadness=10000
+ \exdentamount=\defbodyindent
+ {%
+ % defun fonts. We use typewriter by default (used to be bold) because:
+ % . we're printing identifiers, they should be in tt in principle.
+ % . in languages with many accents, such as Czech or French, it's
+ % common to leave accents off identifiers. The result looks ok in
+ % tt, but exceedingly strange in rm.
+ % . we don't want -- and --- to be treated as ligatures.
+ % . this still does not fix the ?` and !` ligatures, but so far no
+ % one has made identifiers using them :).
+ \df \tt
+ \def\temp{#2}% return value type
+ \ifx\temp\empty\else \tclose{\temp} \fi
+ #3% output function name
+ }%
+ {\rm\enskip}% hskip 0.5 em of \tenrm
+ %
+ \boldbrax
+ % arguments will be output next, if any.
+}
+
+% Print arguments in slanted roman (not ttsl), inconsistently with using
+% tt for the name. This is because literal text is sometimes needed in
+% the argument list (groff manual), and ttsl and tt are not very
+% distinguishable. Prevent hyphenation at `-' chars.
+%
+\def\defunargs#1{%
+ % use sl by default (not ttsl),
+ % tt for the names.
+ \df \sl \hyphenchar\font=0
+ %
+ % On the other hand, if an argument has two dashes (for instance), we
+ % want a way to get ttsl. Let's try @var for that.
+ \let\var=\ttslanted
+ #1%
+ \sl\hyphenchar\font=45
+}
+
+% We want ()&[] to print specially on the defun line.
+%
+\def\activeparens{%
+ \catcode`\(=\active \catcode`\)=\active
+ \catcode`\[=\active \catcode`\]=\active
+ \catcode`\&=\active
+}
+
+% Make control sequences which act like normal parenthesis chars.
+\let\lparen = ( \let\rparen = )
+
+% Be sure that we always have a definition for `(', etc. For example,
+% if the fn name has parens in it, \boldbrax will not be in effect yet,
+% so TeX would otherwise complain about undefined control sequence.
+{
+ \activeparens
+ \global\let(=\lparen \global\let)=\rparen
+ \global\let[=\lbrack \global\let]=\rbrack
+ \global\let& = \&
+
+ \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
+ \gdef\magicamp{\let&=\amprm}
+}
+
+\newcount\parencount
+
+% If we encounter &foo, then turn on ()-hacking afterwards
+\newif\ifampseen
+\def\amprm#1 {\ampseentrue{\bf\&#1 }}
+
+\def\parenfont{%
+ \ifampseen
+ % At the first level, print parens in roman,
+ % otherwise use the default font.
+ \ifnum \parencount=1 \rm \fi
+ \else
+ % The \sf parens (in \boldbrax) actually are a little bolder than
+ % the contained text. This is especially needed for [ and ] .
+ \sf
+ \fi
+}
+\def\infirstlevel#1{%
+ \ifampseen
+ \ifnum\parencount=1
+ #1%
+ \fi
+ \fi
+}
+\def\bfafterword#1 {#1 \bf}
+
+\def\opnr{%
+ \global\advance\parencount by 1
+ {\parenfont(}%
+ \infirstlevel \bfafterword
+}
+\def\clnr{%
+ {\parenfont)}%
+ \infirstlevel \sl
+ \global\advance\parencount by -1
+}
+
+\newcount\brackcount
+\def\lbrb{%
+ \global\advance\brackcount by 1
+ {\bf[}%
+}
+\def\rbrb{%
+ {\bf]}%
+ \global\advance\brackcount by -1
+}
+
+\def\checkparencounts{%
+ \ifnum\parencount=0 \else \badparencount \fi
+ \ifnum\brackcount=0 \else \badbrackcount \fi
+}
+\def\badparencount{%
+ \errmessage{Unbalanced parentheses in @def}%
+ \global\parencount=0
+}
+\def\badbrackcount{%
+ \errmessage{Unbalanced square braces in @def}%
+ \global\brackcount=0
+}
+
+
+\message{macros,}
+% @macro.
+
+% To do this right we need a feature of e-TeX, \scantokens,
+% which we arrange to emulate with a temporary file in ordinary TeX.
+\ifx\eTeXversion\undefined
+ \newwrite\macscribble
+ \def\scantokens#1{%
+ \toks0={#1}%
+ \immediate\openout\macscribble=\jobname.tmp
+ \immediate\write\macscribble{\the\toks0}%
+ \immediate\closeout\macscribble
+ \input \jobname.tmp
+ }
+\fi
+
+\def\scanmacro#1{%
+ \begingroup
+ \newlinechar`\^^M
+ \let\xeatspaces\eatspaces
+ % Undo catcode changes of \startcontents and \doprintindex
+ % When called from @insertcopying or (short)caption, we need active
+ % backslash to get it printed correctly. Previously, we had
+ % \catcode`\\=\other instead. We'll see whether a problem appears
+ % with macro expansion. --kasal, 19aug04
+ \catcode`\@=0 \catcode`\\=\active \escapechar=`\@
+ % ... and \example
+ \spaceisspace
+ %
+ % Append \endinput to make sure that TeX does not see the ending newline.
+ %
+ % I've verified that it is necessary both for e-TeX and for ordinary TeX
+ % --kasal, 29nov03
+ \scantokens{#1\endinput}%
+ \endgroup
+}
+
+\def\scanexp#1{%
+ \edef\temp{\noexpand\scanmacro{#1}}%
+ \temp
+}
+
+\newcount\paramno % Count of parameters
+\newtoks\macname % Macro name
+\newif\ifrecursive % Is it recursive?
+\def\macrolist{} % List of all defined macros in the form
+ % \do\macro1\do\macro2...
+
+% Utility routines.
+% This does \let #1 = #2, with \csnames; that is,
+% \let \csname#1\endcsname = \csname#2\endcsname
+% (except of course we have to play expansion games).
+%
+\def\cslet#1#2{%
+ \expandafter\let
+ \csname#1\expandafter\endcsname
+ \csname#2\endcsname
+}
+
+% Trim leading and trailing spaces off a string.
+% Concepts from aro-bend problem 15 (see CTAN).
+{\catcode`\@=11
+\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }}
+\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@}
+\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @}
+\def\unbrace#1{#1}
+\unbrace{\gdef\trim@@@ #1 } #2@{#1}
+}
+
+% Trim a single trailing ^^M off a string.
+{\catcode`\^^M=\other \catcode`\Q=3%
+\gdef\eatcr #1{\eatcra #1Q^^MQ}%
+\gdef\eatcra#1^^MQ{\eatcrb#1Q}%
+\gdef\eatcrb#1Q#2Q{#1}%
+}
+
+% Macro bodies are absorbed as an argument in a context where
+% all characters are catcode 10, 11 or 12, except \ which is active
+% (as in normal texinfo). It is necessary to change the definition of \.
+
+% It's necessary to have hard CRs when the macro is executed. This is
+% done by making ^^M (\endlinechar) catcode 12 when reading the macro
+% body, and then making it the \newlinechar in \scanmacro.
+
+\def\scanctxt{%
+ \catcode`\"=\other
+ \catcode`\+=\other
+ \catcode`\<=\other
+ \catcode`\>=\other
+ \catcode`\@=\other
+ \catcode`\^=\other
+ \catcode`\_=\other
+ \catcode`\|=\other
+ \catcode`\~=\other
+}
+
+\def\scanargctxt{%
+ \scanctxt
+ \catcode`\\=\other
+ \catcode`\^^M=\other
+}
+
+\def\macrobodyctxt{%
+ \scanctxt
+ \catcode`\{=\other
+ \catcode`\}=\other
+ \catcode`\^^M=\other
+ \usembodybackslash
+}
+
+\def\macroargctxt{%
+ \scanctxt
+ \catcode`\\=\other
+}
+
+% \mbodybackslash is the definition of \ in @macro bodies.
+% It maps \foo\ => \csname macarg.foo\endcsname => #N
+% where N is the macro parameter number.
+% We define \csname macarg.\endcsname to be \realbackslash, so
+% \\ in macro replacement text gets you a backslash.
+
+{\catcode`@=0 @catcode`@\=@active
+ @gdef@usembodybackslash{@let\=@mbodybackslash}
+ @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}
+}
+\expandafter\def\csname macarg.\endcsname{\realbackslash}
+
+\def\macro{\recursivefalse\parsearg\macroxxx}
+\def\rmacro{\recursivetrue\parsearg\macroxxx}
+
+\def\macroxxx#1{%
+ \getargs{#1}% now \macname is the macname and \argl the arglist
+ \ifx\argl\empty % no arguments
+ \paramno=0%
+ \else
+ \expandafter\parsemargdef \argl;%
+ \fi
+ \if1\csname ismacro.\the\macname\endcsname
+ \message{Warning: redefining \the\macname}%
+ \else
+ \expandafter\ifx\csname \the\macname\endcsname \relax
+ \else \errmessage{Macro name \the\macname\space already defined}\fi
+ \global\cslet{macsave.\the\macname}{\the\macname}%
+ \global\expandafter\let\csname ismacro.\the\macname\endcsname=1%
+ % Add the macroname to \macrolist
+ \toks0 = \expandafter{\macrolist\do}%
+ \xdef\macrolist{\the\toks0
+ \expandafter\noexpand\csname\the\macname\endcsname}%
+ \fi
+ \begingroup \macrobodyctxt
+ \ifrecursive \expandafter\parsermacbody
+ \else \expandafter\parsemacbody
+ \fi}
+
+\parseargdef\unmacro{%
+ \if1\csname ismacro.#1\endcsname
+ \global\cslet{#1}{macsave.#1}%
+ \global\expandafter\let \csname ismacro.#1\endcsname=0%
+ % Remove the macro name from \macrolist:
+ \begingroup
+ \expandafter\let\csname#1\endcsname \relax
+ \let\do\unmacrodo
+ \xdef\macrolist{\macrolist}%
+ \endgroup
+ \else
+ \errmessage{Macro #1 not defined}%
+ \fi
+}
+
+% Called by \do from \dounmacro on each macro. The idea is to omit any
+% macro definitions that have been changed to \relax.
+%
+\def\unmacrodo#1{%
+ \ifx#1\relax
+ % remove this
+ \else
+ \noexpand\do \noexpand #1%
+ \fi
+}
+
+% This makes use of the obscure feature that if the last token of a
+% <parameter list> is #, then the preceding argument is delimited by
+% an opening brace, and that opening brace is not consumed.
+\def\getargs#1{\getargsxxx#1{}}
+\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs}
+\def\getmacname #1 #2\relax{\macname={#1}}
+\def\getmacargs#1{\def\argl{#1}}
+
+% Parse the optional {params} list. Set up \paramno and \paramlist
+% so \defmacro knows what to do. Define \macarg.blah for each blah
+% in the params list, to be ##N where N is the position in that list.
+% That gets used by \mbodybackslash (above).
+
+% We need to get `macro parameter char #' into several definitions.
+% The technique used is stolen from LaTeX: let \hash be something
+% unexpandable, insert that wherever you need a #, and then redefine
+% it to # just before using the token list produced.
+%
+% The same technique is used to protect \eatspaces till just before
+% the macro is used.
+
+\def\parsemargdef#1;{\paramno=0\def\paramlist{}%
+ \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,}
+\def\parsemargdefxxx#1,{%
+ \if#1;\let\next=\relax
+ \else \let\next=\parsemargdefxxx
+ \advance\paramno by 1%
+ \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
+ {\xeatspaces{\hash\the\paramno}}%
+ \edef\paramlist{\paramlist\hash\the\paramno,}%
+ \fi\next}
+
+% These two commands read recursive and nonrecursive macro bodies.
+% (They're different since rec and nonrec macros end differently.)
+
+\long\def\parsemacbody#1@end macro%
+{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
+\long\def\parsermacbody#1@end rmacro%
+{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
+
+% This defines the macro itself. There are six cases: recursive and
+% nonrecursive macros of zero, one, and many arguments.
+% Much magic with \expandafter here.
+% \xdef is used so that macro definitions will survive the file
+% they're defined in; @include reads the file inside a group.
+\def\defmacro{%
+ \let\hash=##% convert placeholders to macro parameter chars
+ \ifrecursive
+ \ifcase\paramno
+ % 0
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \noexpand\scanmacro{\temp}}%
+ \or % 1
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \noexpand\braceorline
+ \expandafter\noexpand\csname\the\macname xxx\endcsname}%
+ \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
+ \egroup\noexpand\scanmacro{\temp}}%
+ \else % many
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \noexpand\csname\the\macname xx\endcsname}%
+ \expandafter\xdef\csname\the\macname xx\endcsname##1{%
+ \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
+ \expandafter\expandafter
+ \expandafter\xdef
+ \expandafter\expandafter
+ \csname\the\macname xxx\endcsname
+ \paramlist{\egroup\noexpand\scanmacro{\temp}}%
+ \fi
+ \else
+ \ifcase\paramno
+ % 0
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \noexpand\norecurse{\the\macname}%
+ \noexpand\scanmacro{\temp}\egroup}%
+ \or % 1
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \noexpand\braceorline
+ \expandafter\noexpand\csname\the\macname xxx\endcsname}%
+ \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
+ \egroup
+ \noexpand\norecurse{\the\macname}%
+ \noexpand\scanmacro{\temp}\egroup}%
+ \else % many
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \expandafter\noexpand\csname\the\macname xx\endcsname}%
+ \expandafter\xdef\csname\the\macname xx\endcsname##1{%
+ \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
+ \expandafter\expandafter
+ \expandafter\xdef
+ \expandafter\expandafter
+ \csname\the\macname xxx\endcsname
+ \paramlist{%
+ \egroup
+ \noexpand\norecurse{\the\macname}%
+ \noexpand\scanmacro{\temp}\egroup}%
+ \fi
+ \fi}
+
+\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
+
+% \braceorline decides whether the next nonwhitespace character is a
+% {. If so it reads up to the closing }, if not, it reads the whole
+% line. Whatever was read is then fed to the next control sequence
+% as an argument (by \parsebrace or \parsearg)
+\def\braceorline#1{\let\next=#1\futurelet\nchar\braceorlinexxx}
+\def\braceorlinexxx{%
+ \ifx\nchar\bgroup\else
+ \expandafter\parsearg
+ \fi \next}
+
+% We want to disable all macros during \shipout so that they are not
+% expanded by \write.
+\def\turnoffmacros{\begingroup \def\do##1{\let\noexpand##1=\relax}%
+ \edef\next{\macrolist}\expandafter\endgroup\next}
+
+% For \indexnofonts, we need to get rid of all macros, leaving only the
+% arguments (if present). Of course this is not nearly correct, but it
+% is the best we can do for now. makeinfo does not expand macros in the
+% argument to @deffn, which ends up writing an index entry, and texindex
+% isn't prepared for an index sort entry that starts with \.
+%
+% Since macro invocations are followed by braces, we can just redefine them
+% to take a single TeX argument. The case of a macro invocation that
+% goes to end-of-line is not handled.
+%
+\def\emptyusermacros{\begingroup
+ \def\do##1{\let\noexpand##1=\noexpand\asis}%
+ \edef\next{\macrolist}\expandafter\endgroup\next}
+
+
+% @alias.
+% We need some trickery to remove the optional spaces around the equal
+% sign. Just make them active and then expand them all to nothing.
+\def\alias{\parseargusing\obeyspaces\aliasxxx}
+\def\aliasxxx #1{\aliasyyy#1\relax}
+\def\aliasyyy #1=#2\relax{%
+ {%
+ \expandafter\let\obeyedspace=\empty
+ \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}%
+ }%
+ \next
+}
+
+
+\message{cross references,}
+
+\newwrite\auxfile
+
+\newif\ifhavexrefs % True if xref values are known.
+\newif\ifwarnedxrefs % True if we warned once that they aren't known.
+
+% @inforef is relatively simple.
+\def\inforef #1{\inforefzzz #1,,,,**}
+\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
+ node \samp{\ignorespaces#1{}}}
+
+% @node's only job in TeX is to define \lastnode, which is used in
+% cross-references. The @node line might or might not have commas, and
+% might or might not have spaces before the first comma, like:
+% @node foo , bar , ...
+% We don't want such trailing spaces in the node name.
+%
+\parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse}
+%
+% also remove a trailing comma, in case of something like this:
+% @node Help-Cross, , , Cross-refs
+\def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse}
+\def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}}
+
+\let\nwnode=\node
+\let\lastnode=\empty
+
+% Write a cross-reference definition for the current node. #1 is the
+% type (Ynumbered, Yappendix, Ynothing).
+%
+\def\donoderef#1{%
+ \ifx\lastnode\empty\else
+ \setref{\lastnode}{#1}%
+ \global\let\lastnode=\empty
+ \fi
+}
+
+% @anchor{NAME} -- define xref target at arbitrary point.
+%
+\newcount\savesfregister
+%
+\def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
+\def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
+\def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
+
+% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an
+% anchor), which consists of three parts:
+% 1) NAME-title - the current sectioning name taken from \thissection,
+% or the anchor name.
+% 2) NAME-snt - section number and type, passed as the SNT arg, or
+% empty for anchors.
+% 3) NAME-pg - the page number.
+%
+% This is called from \donoderef, \anchor, and \dofloat. In the case of
+% floats, there is an additional part, which is not written here:
+% 4) NAME-lof - the text as it should appear in a @listoffloats.
+%
+\def\setref#1#2{%
+ \pdfmkdest{#1}%
+ \iflinks
+ {%
+ \atdummies % preserve commands, but don't expand them
+ \turnoffactive
+ \otherbackslash
+ \edef\writexrdef##1##2{%
+ \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef
+ ##1}{##2}}% these are parameters of \writexrdef
+ }%
+ \toks0 = \expandafter{\thissection}%
+ \immediate \writexrdef{title}{\the\toks0 }%
+ \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc.
+ \writexrdef{pg}{\folio}% will be written later, during \shipout
+ }%
+ \fi
+}
+
+% @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is
+% the node name, #2 the name of the Info cross-reference, #3 the printed
+% node name, #4 the name of the Info file, #5 the name of the printed
+% manual. All but the node name can be omitted.
+%
+\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]}
+\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]}
+\def\ref#1{\xrefX[#1,,,,,,,]}
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
+ \unsepspaces
+ \def\printedmanual{\ignorespaces #5}%
+ \def\printedrefname{\ignorespaces #3}%
+ \setbox1=\hbox{\printedmanual\unskip}%
+ \setbox0=\hbox{\printedrefname\unskip}%
+ \ifdim \wd0 = 0pt
+ % No printed node name was explicitly given.
+ \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax
+ % Use the node name inside the square brackets.
+ \def\printedrefname{\ignorespaces #1}%
+ \else
+ % Use the actual chapter/section title appear inside
+ % the square brackets. Use the real section title if we have it.
+ \ifdim \wd1 > 0pt
+ % It is in another manual, so we don't have it.
+ \def\printedrefname{\ignorespaces #1}%
+ \else
+ \ifhavexrefs
+ % We know the real title if we have the xref values.
+ \def\printedrefname{\refx{#1-title}{}}%
+ \else
+ % Otherwise just copy the Info node name.
+ \def\printedrefname{\ignorespaces #1}%
+ \fi%
+ \fi
+ \fi
+ \fi
+ %
+ % Make link in pdf output.
+ \ifpdf
+ \leavevmode
+ \getfilename{#4}%
+ {\turnoffactive \otherbackslash
+ \ifnum\filenamelength>0
+ \startlink attr{/Border [0 0 0]}%
+ goto file{\the\filename.pdf} name{#1}%
+ \else
+ \startlink attr{/Border [0 0 0]}%
+ goto name{\pdfmkpgn{#1}}%
+ \fi
+ }%
+ \linkcolor
+ \fi
+ %
+ % Float references are printed completely differently: "Figure 1.2"
+ % instead of "[somenode], p.3". We distinguish them by the
+ % LABEL-title being set to a magic string.
+ {%
+ % Have to otherify everything special to allow the \csname to
+ % include an _ in the xref name, etc.
+ \indexnofonts
+ \turnoffactive
+ \otherbackslash
+ \expandafter\global\expandafter\let\expandafter\Xthisreftitle
+ \csname XR#1-title\endcsname
+ }%
+ \iffloat\Xthisreftitle
+ % If the user specified the print name (third arg) to the ref,
+ % print it instead of our usual "Figure 1.2".
+ \ifdim\wd0 = 0pt
+ \refx{#1-snt}%
+ \else
+ \printedrefname
+ \fi
+ %
+ % if the user also gave the printed manual name (fifth arg), append
+ % "in MANUALNAME".
+ \ifdim \wd1 > 0pt
+ \space \putwordin{} \cite{\printedmanual}%
+ \fi
+ \else
+ % node/anchor (non-float) references.
+ %
+ % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not
+ % insert empty discretionaries after hyphens, which means that it will
+ % not find a line break at a hyphen in a node names. Since some manuals
+ % are best written with fairly long node names, containing hyphens, this
+ % is a loss. Therefore, we give the text of the node name again, so it
+ % is as if TeX is seeing it for the first time.
+ \ifdim \wd1 > 0pt
+ \putwordsection{} ``\printedrefname'' \putwordin{} \cite{\printedmanual}%
+ \else
+ % _ (for example) has to be the character _ for the purposes of the
+ % control sequence corresponding to the node, but it has to expand
+ % into the usual \leavevmode...\vrule stuff for purposes of
+ % printing. So we \turnoffactive for the \refx-snt, back on for the
+ % printing, back off for the \refx-pg.
+ {\turnoffactive \otherbackslash
+ % Only output a following space if the -snt ref is nonempty; for
+ % @unnumbered and @anchor, it won't be.
+ \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
+ \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
+ }%
+ % output the `[mynode]' via a macro so it can be overridden.
+ \xrefprintnodename\printedrefname
+ %
+ % But we always want a comma and a space:
+ ,\space
+ %
+ % output the `page 3'.
+ \turnoffactive \otherbackslash \putwordpage\tie\refx{#1-pg}{}%
+ \fi
+ \fi
+ \endlink
+\endgroup}
+
+% This macro is called from \xrefX for the `[nodename]' part of xref
+% output. It's a separate macro only so it can be changed more easily,
+% since square brackets don't work well in some documents. Particularly
+% one that Bob is working on :).
+%
+\def\xrefprintnodename#1{[#1]}
+
+% Things referred to by \setref.
+%
+\def\Ynothing{}
+\def\Yomitfromtoc{}
+\def\Ynumbered{%
+ \ifnum\secno=0
+ \putwordChapter@tie \the\chapno
+ \else \ifnum\subsecno=0
+ \putwordSection@tie \the\chapno.\the\secno
+ \else \ifnum\subsubsecno=0
+ \putwordSection@tie \the\chapno.\the\secno.\the\subsecno
+ \else
+ \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno
+ \fi\fi\fi
+}
+\def\Yappendix{%
+ \ifnum\secno=0
+ \putwordAppendix@tie @char\the\appendixno{}%
+ \else \ifnum\subsecno=0
+ \putwordSection@tie @char\the\appendixno.\the\secno
+ \else \ifnum\subsubsecno=0
+ \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno
+ \else
+ \putwordSection@tie
+ @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno
+ \fi\fi\fi
+}
+
+% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.
+% If its value is nonempty, SUFFIX is output afterward.
+%
+\def\refx#1#2{%
+ {%
+ \indexnofonts
+ \otherbackslash
+ \expandafter\global\expandafter\let\expandafter\thisrefX
+ \csname XR#1\endcsname
+ }%
+ \ifx\thisrefX\relax
+ % If not defined, say something at least.
+ \angleleft un\-de\-fined\angleright
+ \iflinks
+ \ifhavexrefs
+ \message{\linenumber Undefined cross reference `#1'.}%
+ \else
+ \ifwarnedxrefs\else
+ \global\warnedxrefstrue
+ \message{Cross reference values unknown; you must run TeX again.}%
+ \fi
+ \fi
+ \fi
+ \else
+ % It's defined, so just use it.
+ \thisrefX
+ \fi
+ #2% Output the suffix in any case.
+}
+
+% This is the macro invoked by entries in the aux file. Usually it's
+% just a \def (we prepend XR to the control sequence name to avoid
+% collisions). But if this is a float type, we have more work to do.
+%
+\def\xrdef#1#2{%
+ \expandafter\gdef\csname XR#1\endcsname{#2}% remember this xref value.
+ %
+ % Was that xref control sequence that we just defined for a float?
+ \expandafter\iffloat\csname XR#1\endcsname
+ % it was a float, and we have the (safe) float type in \iffloattype.
+ \expandafter\let\expandafter\floatlist
+ \csname floatlist\iffloattype\endcsname
+ %
+ % Is this the first time we've seen this float type?
+ \expandafter\ifx\floatlist\relax
+ \toks0 = {\do}% yes, so just \do
+ \else
+ % had it before, so preserve previous elements in list.
+ \toks0 = \expandafter{\floatlist\do}%
+ \fi
+ %
+ % Remember this xref in the control sequence \floatlistFLOATTYPE,
+ % for later use in \listoffloats.
+ \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0{#1}}%
+ \fi
+}
+
+% Read the last existing aux file, if any. No error if none exists.
+%
+\def\tryauxfile{%
+ \openin 1 \jobname.aux
+ \ifeof 1 \else
+ \readauxfile
+ \global\havexrefstrue
+ \fi
+ \closein 1
+}
+
+\def\readauxfile{\begingroup
+ \catcode`\^^@=\other
+ \catcode`\^^A=\other
+ \catcode`\^^B=\other
+ \catcode`\^^C=\other
+ \catcode`\^^D=\other
+ \catcode`\^^E=\other
+ \catcode`\^^F=\other
+ \catcode`\^^G=\other
+ \catcode`\^^H=\other
+ \catcode`\^^K=\other
+ \catcode`\^^L=\other
+ \catcode`\^^N=\other
+ \catcode`\^^P=\other
+ \catcode`\^^Q=\other
+ \catcode`\^^R=\other
+ \catcode`\^^S=\other
+ \catcode`\^^T=\other
+ \catcode`\^^U=\other
+ \catcode`\^^V=\other
+ \catcode`\^^W=\other
+ \catcode`\^^X=\other
+ \catcode`\^^Z=\other
+ \catcode`\^^[=\other
+ \catcode`\^^\=\other
+ \catcode`\^^]=\other
+ \catcode`\^^^=\other
+ \catcode`\^^_=\other
+ % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc.
+ % in xref tags, i.e., node names. But since ^^e4 notation isn't
+ % supported in the main text, it doesn't seem desirable. Furthermore,
+ % that is not enough: for node names that actually contain a ^
+ % character, we would end up writing a line like this: 'xrdef {'hat
+ % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first
+ % argument, and \hat is not an expandable control sequence. It could
+ % all be worked out, but why? Either we support ^^ or we don't.
+ %
+ % The other change necessary for this was to define \auxhat:
+ % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter
+ % and then to call \auxhat in \setq.
+ %
+ \catcode`\^=\other
+ %
+ % Special characters. Should be turned off anyway, but...
+ \catcode`\~=\other
+ \catcode`\[=\other
+ \catcode`\]=\other
+ \catcode`\"=\other
+ \catcode`\_=\other
+ \catcode`\|=\other
+ \catcode`\<=\other
+ \catcode`\>=\other
+ \catcode`\$=\other
+ \catcode`\#=\other
+ \catcode`\&=\other
+ \catcode`\%=\other
+ \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
+ %
+ % This is to support \ in node names and titles, since the \
+ % characters end up in a \csname. It's easier than
+ % leaving it active and making its active definition an actual \
+ % character. What I don't understand is why it works in the *value*
+ % of the xrdef. Seems like it should be a catcode12 \, and that
+ % should not typeset properly. But it works, so I'm moving on for
+ % now. --karl, 15jan04.
+ \catcode`\\=\other
+ %
+ % Make the characters 128-255 be printing characters.
+ {%
+ \count 1=128
+ \def\loop{%
+ \catcode\count 1=\other
+ \advance\count 1 by 1
+ \ifnum \count 1<256 \loop \fi
+ }%
+ }%
+ %
+ % @ is our escape character in .aux files, and we need braces.
+ \catcode`\{=1
+ \catcode`\}=2
+ \catcode`\@=0
+ %
+ \input \jobname.aux
+\endgroup}
+
+
+\message{insertions,}
+% including footnotes.
+
+\newcount \footnoteno
+
+% The trailing space in the following definition for supereject is
+% vital for proper filling; pages come out unaligned when you do a
+% pagealignmacro call if that space before the closing brace is
+% removed. (Generally, numeric constants should always be followed by a
+% space to prevent strange expansion errors.)
+\def\supereject{\par\penalty -20000\footnoteno =0 }
+
+% @footnotestyle is meaningful for info output only.
+\let\footnotestyle=\comment
+
+{\catcode `\@=11
+%
+% Auto-number footnotes. Otherwise like plain.
+\gdef\footnote{%
+ \let\indent=\ptexindent
+ \let\noindent=\ptexnoindent
+ \global\advance\footnoteno by \@ne
+ \edef\thisfootno{$^{\the\footnoteno}$}%
+ %
+ % In case the footnote comes at the end of a sentence, preserve the
+ % extra spacing after we do the footnote number.
+ \let\@sf\empty
+ \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi
+ %
+ % Remove inadvertent blank space before typesetting the footnote number.
+ \unskip
+ \thisfootno\@sf
+ \dofootnote
+}%
+
+% Don't bother with the trickery in plain.tex to not require the
+% footnote text as a parameter. Our footnotes don't need to be so general.
+%
+% Oh yes, they do; otherwise, @ifset (and anything else that uses
+% \parseargline) fails inside footnotes because the tokens are fixed when
+% the footnote is read. --karl, 16nov96.
+%
+\gdef\dofootnote{%
+ \insert\footins\bgroup
+ % We want to typeset this text as a normal paragraph, even if the
+ % footnote reference occurs in (for example) a display environment.
+ % So reset some parameters.
+ \hsize=\pagewidth
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\ht\strutbox % top baseline for broken footnotes
+ \splitmaxdepth\dp\strutbox
+ \floatingpenalty\@MM
+ \leftskip\z@skip
+ \rightskip\z@skip
+ \spaceskip\z@skip
+ \xspaceskip\z@skip
+ \parindent\defaultparindent
+ %
+ \smallfonts \rm
+ %
+ % Because we use hanging indentation in footnotes, a @noindent appears
+ % to exdent this text, so make it be a no-op. makeinfo does not use
+ % hanging indentation so @noindent can still be needed within footnote
+ % text after an @example or the like (not that this is good style).
+ \let\noindent = \relax
+ %
+ % Hang the footnote text off the number. Use \everypar in case the
+ % footnote extends for more than one paragraph.
+ \everypar = {\hang}%
+ \textindent{\thisfootno}%
+ %
+ % Don't crash into the line above the footnote text. Since this
+ % expands into a box, it must come within the paragraph, lest it
+ % provide a place where TeX can split the footnote.
+ \footstrut
+ \futurelet\next\fo@t
+}
+}%end \catcode `\@=11
+
+% In case a @footnote appears in a vbox, save the footnote text and create
+% the real \insert just after the vbox finished. Otherwise, the insertion
+% would be lost.
+% Similarily, if a @footnote appears inside an alignment, save the footnote
+% text to a box and make the \insert when a row of the table is finished.
+% And the same can be done for other insert classes. --kasal, 16nov03.
+
+% Replace the \insert primitive by a cheating macro.
+% Deeper inside, just make sure that the saved insertions are not spilled
+% out prematurely.
+%
+\def\startsavinginserts{%
+ \ifx \insert\ptexinsert
+ \let\insert\saveinsert
+ \else
+ \let\checkinserts\relax
+ \fi
+}
+
+% This \insert replacement works for both \insert\footins{foo} and
+% \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}.
+%
+\def\saveinsert#1{%
+ \edef\next{\noexpand\savetobox \makeSAVEname#1}%
+ \afterassignment\next
+ % swallow the left brace
+ \let\temp =
+}
+\def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}}
+\def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1}
+
+\def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi}
+
+\def\placesaveins#1{%
+ \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname
+ {\box#1}%
+}
+
+% eat @SAVE -- beware, all of them have catcode \other:
+{
+ \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-)
+ \gdef\gobblesave @SAVE{}
+}
+
+% initialization:
+\def\newsaveins #1{%
+ \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}%
+ \next
+}
+\def\newsaveinsX #1{%
+ \csname newbox\endcsname #1%
+ \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts
+ \checksaveins #1}%
+}
+
+% initialize:
+\let\checkinserts\empty
+\newsaveins\footins
+\newsaveins\margin
+
+
+% @image. We use the macros from epsf.tex to support this.
+% If epsf.tex is not installed and @image is used, we complain.
+%
+% Check for and read epsf.tex up front. If we read it only at @image
+% time, we might be inside a group, and then its definitions would get
+% undone and the next image would fail.
+\openin 1 = epsf.tex
+\ifeof 1 \else
+ % Do not bother showing banner with epsf.tex v2.7k (available in
+ % doc/epsf.tex and on ctan).
+ \def\epsfannounce{\toks0 = }%
+ \input epsf.tex
+\fi
+\closein 1
+%
+% We will only complain once about lack of epsf.tex.
+\newif\ifwarnednoepsf
+\newhelp\noepsfhelp{epsf.tex must be installed for images to
+ work. It is also included in the Texinfo distribution, or you can get
+ it from ftp://tug.org/tex/epsf.tex.}
+%
+\def\image#1{%
+ \ifx\epsfbox\undefined
+ \ifwarnednoepsf \else
+ \errhelp = \noepsfhelp
+ \errmessage{epsf.tex not found, images will be ignored}%
+ \global\warnednoepsftrue
+ \fi
+ \else
+ \imagexxx #1,,,,,\finish
+ \fi
+}
+%
+% Arguments to @image:
+% #1 is (mandatory) image filename; we tack on .eps extension.
+% #2 is (optional) width, #3 is (optional) height.
+% #4 is (ignored optional) html alt text.
+% #5 is (ignored optional) extension.
+% #6 is just the usual extra ignored arg for parsing this stuff.
+\newif\ifimagevmode
+\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup
+ \catcode`\^^M = 5 % in case we're inside an example
+ \normalturnoffactive % allow _ et al. in names
+ % If the image is by itself, center it.
+ \ifvmode
+ \imagevmodetrue
+ \nobreak\bigskip
+ % Usually we'll have text after the image which will insert
+ % \parskip glue, so insert it here too to equalize the space
+ % above and below.
+ \nobreak\vskip\parskip
+ \nobreak
+ \line\bgroup\hss
+ \fi
+ %
+ % Output the image.
+ \ifpdf
+ \dopdfimage{#1}{#2}{#3}%
+ \else
+ % \epsfbox itself resets \epsf?size at each figure.
+ \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
+ \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
+ \epsfbox{#1.eps}%
+ \fi
+ %
+ \ifimagevmode \hss \egroup \bigbreak \fi % space after the image
+\endgroup}
+
+
+% @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables,
+% etc. We don't actually implement floating yet, we always include the
+% float "here". But it seemed the best name for the future.
+%
+\envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish}
+
+% There may be a space before second and/or third parameter; delete it.
+\def\eatcommaspace#1, {#1,}
+
+% #1 is the optional FLOATTYPE, the text label for this float, typically
+% "Figure", "Table", "Example", etc. Can't contain commas. If omitted,
+% this float will not be numbered and cannot be referred to.
+%
+% #2 is the optional xref label. Also must be present for the float to
+% be referable.
+%
+% #3 is the optional positioning argument; for now, it is ignored. It
+% will somehow specify the positions allowed to float to (here, top, bottom).
+%
+% We keep a separate counter for each FLOATTYPE, which we reset at each
+% chapter-level command.
+\let\resetallfloatnos=\empty
+%
+\def\dofloat#1,#2,#3,#4\finish{%
+ \let\thiscaption=\empty
+ \let\thisshortcaption=\empty
+ %
+ % don't lose footnotes inside @float.
+ %
+ % BEWARE: when the floats start float, we have to issue warning whenever an
+ % insert appears inside a float which could possibly float. --kasal, 26may04
+ %
+ \startsavinginserts
+ %
+ % We can't be used inside a paragraph.
+ \par
+ %
+ \vtop\bgroup
+ \def\floattype{#1}%
+ \def\floatlabel{#2}%
+ \def\floatloc{#3}% we do nothing with this yet.
+ %
+ \ifx\floattype\empty
+ \let\safefloattype=\empty
+ \else
+ {%
+ % the floattype might have accents or other special characters,
+ % but we need to use it in a control sequence name.
+ \indexnofonts
+ \turnoffactive
+ \xdef\safefloattype{\floattype}%
+ }%
+ \fi
+ %
+ % If label is given but no type, we handle that as the empty type.
+ \ifx\floatlabel\empty \else
+ % We want each FLOATTYPE to be numbered separately (Figure 1,
+ % Table 1, Figure 2, ...). (And if no label, no number.)
+ %
+ \expandafter\getfloatno\csname\safefloattype floatno\endcsname
+ \global\advance\floatno by 1
+ %
+ {%
+ % This magic value for \thissection is output by \setref as the
+ % XREFLABEL-title value. \xrefX uses it to distinguish float
+ % labels (which have a completely different output format) from
+ % node and anchor labels. And \xrdef uses it to construct the
+ % lists of floats.
+ %
+ \edef\thissection{\floatmagic=\safefloattype}%
+ \setref{\floatlabel}{Yfloat}%
+ }%
+ \fi
+ %
+ % start with \parskip glue, I guess.
+ \vskip\parskip
+ %
+ % Don't suppress indentation if a float happens to start a section.
+ \restorefirstparagraphindent
+}
+
+% we have these possibilities:
+% @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap
+% @float Foo,lbl & no caption: Foo 1.1
+% @float Foo & @caption{Cap}: Foo: Cap
+% @float Foo & no caption: Foo
+% @float ,lbl & Caption{Cap}: 1.1: Cap
+% @float ,lbl & no caption: 1.1
+% @float & @caption{Cap}: Cap
+% @float & no caption:
+%
+\def\Efloat{%
+ \let\floatident = \empty
+ %
+ % In all cases, if we have a float type, it comes first.
+ \ifx\floattype\empty \else \def\floatident{\floattype}\fi
+ %
+ % If we have an xref label, the number comes next.
+ \ifx\floatlabel\empty \else
+ \ifx\floattype\empty \else % if also had float type, need tie first.
+ \appendtomacro\floatident{\tie}%
+ \fi
+ % the number.
+ \appendtomacro\floatident{\chaplevelprefix\the\floatno}%
+ \fi
+ %
+ % Start the printed caption with what we've constructed in
+ % \floatident, but keep it separate; we need \floatident again.
+ \let\captionline = \floatident
+ %
+ \ifx\thiscaption\empty \else
+ \ifx\floatident\empty \else
+ \appendtomacro\captionline{: }% had ident, so need a colon between
+ \fi
+ %
+ % caption text.
+ \appendtomacro\captionline{\scanexp\thiscaption}%
+ \fi
+ %
+ % If we have anything to print, print it, with space before.
+ % Eventually this needs to become an \insert.
+ \ifx\captionline\empty \else
+ \vskip.5\parskip
+ \captionline
+ %
+ % Space below caption.
+ \vskip\parskip
+ \fi
+ %
+ % If have an xref label, write the list of floats info. Do this
+ % after the caption, to avoid chance of it being a breakpoint.
+ \ifx\floatlabel\empty \else
+ % Write the text that goes in the lof to the aux file as
+ % \floatlabel-lof. Besides \floatident, we include the short
+ % caption if specified, else the full caption if specified, else nothing.
+ {%
+ \atdummies \turnoffactive \otherbackslash
+ % since we read the caption text in the macro world, where ^^M
+ % is turned into a normal character, we have to scan it back, so
+ % we don't write the literal three characters "^^M" into the aux file.
+ \scanexp{%
+ \xdef\noexpand\gtemp{%
+ \ifx\thisshortcaption\empty
+ \thiscaption
+ \else
+ \thisshortcaption
+ \fi
+ }%
+ }%
+ \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident
+ \ifx\gtemp\empty \else : \gtemp \fi}}%
+ }%
+ \fi
+ \egroup % end of \vtop
+ %
+ % place the captured inserts
+ %
+ % BEWARE: when the floats start float, we have to issue warning whenever an
+ % insert appears inside a float which could possibly float. --kasal, 26may04
+ %
+ \checkinserts
+}
+
+% Append the tokens #2 to the definition of macro #1, not expanding either.
+%
+\def\appendtomacro#1#2{%
+ \expandafter\def\expandafter#1\expandafter{#1#2}%
+}
+
+% @caption, @shortcaption
+%
+\def\caption{\docaption\thiscaption}
+\def\shortcaption{\docaption\thisshortcaption}
+\def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption}
+\def\defcaption#1#2{\egroup \def#1{#2}}
+
+% The parameter is the control sequence identifying the counter we are
+% going to use. Create it if it doesn't exist and assign it to \floatno.
+\def\getfloatno#1{%
+ \ifx#1\relax
+ % Haven't seen this figure type before.
+ \csname newcount\endcsname #1%
+ %
+ % Remember to reset this floatno at the next chap.
+ \expandafter\gdef\expandafter\resetallfloatnos
+ \expandafter{\resetallfloatnos #1=0 }%
+ \fi
+ \let\floatno#1%
+}
+
+% \setref calls this to get the XREFLABEL-snt value. We want an @xref
+% to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we
+% first read the @float command.
+%
+\def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}%
+
+% Magic string used for the XREFLABEL-title value, so \xrefX can
+% distinguish floats from other xref types.
+\def\floatmagic{!!float!!}
+
+% #1 is the control sequence we are passed; we expand into a conditional
+% which is true if #1 represents a float ref. That is, the magic
+% \thissection value which we \setref above.
+%
+\def\iffloat#1{\expandafter\doiffloat#1==\finish}
+%
+% #1 is (maybe) the \floatmagic string. If so, #2 will be the
+% (safe) float type for this float. We set \iffloattype to #2.
+%
+\def\doiffloat#1=#2=#3\finish{%
+ \def\temp{#1}%
+ \def\iffloattype{#2}%
+ \ifx\temp\floatmagic
+}
+
+% @listoffloats FLOATTYPE - print a list of floats like a table of contents.
+%
+\parseargdef\listoffloats{%
+ \def\floattype{#1}% floattype
+ {%
+ % the floattype might have accents or other special characters,
+ % but we need to use it in a control sequence name.
+ \indexnofonts
+ \turnoffactive
+ \xdef\safefloattype{\floattype}%
+ }%
+ %
+ % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE.
+ \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax
+ \ifhavexrefs
+ % if the user said @listoffloats foo but never @float foo.
+ \message{\linenumber No `\safefloattype' floats to list.}%
+ \fi
+ \else
+ \begingroup
+ \leftskip=\tocindent % indent these entries like a toc
+ \let\do=\listoffloatsdo
+ \csname floatlist\safefloattype\endcsname
+ \endgroup
+ \fi
+}
+
+% This is called on each entry in a list of floats. We're passed the
+% xref label, in the form LABEL-title, which is how we save it in the
+% aux file. We strip off the -title and look up \XRLABEL-lof, which
+% has the text we're supposed to typeset here.
+%
+% Figures without xref labels will not be included in the list (since
+% they won't appear in the aux file).
+%
+\def\listoffloatsdo#1{\listoffloatsdoentry#1\finish}
+\def\listoffloatsdoentry#1-title\finish{{%
+ % Can't fully expand XR#1-lof because it can contain anything. Just
+ % pass the control sequence. On the other hand, XR#1-pg is just the
+ % page number, and we want to fully expand that so we can get a link
+ % in pdf output.
+ \toksA = \expandafter{\csname XR#1-lof\endcsname}%
+ %
+ % use the same \entry macro we use to generate the TOC and index.
+ \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}%
+ \writeentry
+}}
+
+\message{localization,}
+% and i18n.
+
+% @documentlanguage is usually given very early, just after
+% @setfilename. If done too late, it may not override everything
+% properly. Single argument is the language abbreviation.
+% It would be nice if we could set up a hyphenation file here.
+%
+\parseargdef\documentlanguage{%
+ \tex % read txi-??.tex file in plain TeX.
+ % Read the file if it exists.
+ \openin 1 txi-#1.tex
+ \ifeof 1
+ \errhelp = \nolanghelp
+ \errmessage{Cannot read language file txi-#1.tex}%
+ \else
+ \input txi-#1.tex
+ \fi
+ \closein 1
+ \endgroup
+}
+\newhelp\nolanghelp{The given language definition file cannot be found or
+is empty. Maybe you need to install it? In the current directory
+should work if nowhere else does.}
+
+
+% @documentencoding should change something in TeX eventually, most
+% likely, but for now just recognize it.
+\let\documentencoding = \comment
+
+
+% Page size parameters.
+%
+\newdimen\defaultparindent \defaultparindent = 15pt
+
+\chapheadingskip = 15pt plus 4pt minus 2pt
+\secheadingskip = 12pt plus 3pt minus 2pt
+\subsecheadingskip = 9pt plus 2pt minus 2pt
+
+% Prevent underfull vbox error messages.
+\vbadness = 10000
+
+% Don't be so finicky about underfull hboxes, either.
+\hbadness = 2000
+
+% Following George Bush, just get rid of widows and orphans.
+\widowpenalty=10000
+\clubpenalty=10000
+
+% Use TeX 3.0's \emergencystretch to help line breaking, but if we're
+% using an old version of TeX, don't do anything. We want the amount of
+% stretch added to depend on the line length, hence the dependence on
+% \hsize. We call this whenever the paper size is set.
+%
+\def\setemergencystretch{%
+ \ifx\emergencystretch\thisisundefined
+ % Allow us to assign to \emergencystretch anyway.
+ \def\emergencystretch{\dimen0}%
+ \else
+ \emergencystretch = .15\hsize
+ \fi
+}
+
+% Parameters in order: 1) textheight; 2) textwidth; 3) voffset;
+% 4) hoffset; 5) binding offset; 6) topskip; 7) physical page height; 8)
+% physical page width.
+%
+% We also call \setleading{\textleading}, so the caller should define
+% \textleading. The caller should also set \parskip.
+%
+\def\internalpagesizes#1#2#3#4#5#6#7#8{%
+ \voffset = #3\relax
+ \topskip = #6\relax
+ \splittopskip = \topskip
+ %
+ \vsize = #1\relax
+ \advance\vsize by \topskip
+ \outervsize = \vsize
+ \advance\outervsize by 2\topandbottommargin
+ \pageheight = \vsize
+ %
+ \hsize = #2\relax
+ \outerhsize = \hsize
+ \advance\outerhsize by 0.5in
+ \pagewidth = \hsize
+ %
+ \normaloffset = #4\relax
+ \bindingoffset = #5\relax
+ %
+ \ifpdf
+ \pdfpageheight #7\relax
+ \pdfpagewidth #8\relax
+ \fi
+ %
+ \setleading{\textleading}
+ %
+ \parindent = \defaultparindent
+ \setemergencystretch
+}
+
+% @letterpaper (the default).
+\def\letterpaper{{\globaldefs = 1
+ \parskip = 3pt plus 2pt minus 1pt
+ \textleading = 13.2pt
+ %
+ % If page is nothing but text, make it come out even.
+ \internalpagesizes{46\baselineskip}{6in}%
+ {\voffset}{.25in}%
+ {\bindingoffset}{36pt}%
+ {11in}{8.5in}%
+}}
+
+% Use @smallbook to reset parameters for 7x9.5 (or so) format.
+\def\smallbook{{\globaldefs = 1
+ \parskip = 2pt plus 1pt
+ \textleading = 12pt
+ %
+ \internalpagesizes{7.5in}{5in}%
+ {\voffset}{.25in}%
+ {\bindingoffset}{16pt}%
+ {9.25in}{7in}%
+ %
+ \lispnarrowing = 0.3in
+ \tolerance = 700
+ \hfuzz = 1pt
+ \contentsrightmargin = 0pt
+ \defbodyindent = .5cm
+}}
+
+% Use @afourpaper to print on European A4 paper.
+\def\afourpaper{{\globaldefs = 1
+ \parskip = 3pt plus 2pt minus 1pt
+ \textleading = 13.2pt
+ %
+ % Double-side printing via postscript on Laserjet 4050
+ % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm.
+ % To change the settings for a different printer or situation, adjust
+ % \normaloffset until the front-side and back-side texts align. Then
+ % do the same for \bindingoffset. You can set these for testing in
+ % your texinfo source file like this:
+ % @tex
+ % \global\normaloffset = -6mm
+ % \global\bindingoffset = 10mm
+ % @end tex
+ \internalpagesizes{51\baselineskip}{160mm}
+ {\voffset}{\hoffset}%
+ {\bindingoffset}{44pt}%
+ {297mm}{210mm}%
+ %
+ \tolerance = 700
+ \hfuzz = 1pt
+ \contentsrightmargin = 0pt
+ \defbodyindent = 5mm
+}}
+
+% Use @afivepaper to print on European A5 paper.
+% From romildo@urano.iceb.ufop.br, 2 July 2000.
+% He also recommends making @example and @lisp be small.
+\def\afivepaper{{\globaldefs = 1
+ \parskip = 2pt plus 1pt minus 0.1pt
+ \textleading = 12.5pt
+ %
+ \internalpagesizes{160mm}{120mm}%
+ {\voffset}{\hoffset}%
+ {\bindingoffset}{8pt}%
+ {210mm}{148mm}%
+ %
+ \lispnarrowing = 0.2in
+ \tolerance = 800
+ \hfuzz = 1.2pt
+ \contentsrightmargin = 0pt
+ \defbodyindent = 2mm
+ \tableindent = 12mm
+}}
+
+% A specific text layout, 24x15cm overall, intended for A4 paper.
+\def\afourlatex{{\globaldefs = 1
+ \afourpaper
+ \internalpagesizes{237mm}{150mm}%
+ {\voffset}{4.6mm}%
+ {\bindingoffset}{7mm}%
+ {297mm}{210mm}%
+ %
+ % Must explicitly reset to 0 because we call \afourpaper.
+ \globaldefs = 0
+}}
+
+% Use @afourwide to print on A4 paper in landscape format.
+\def\afourwide{{\globaldefs = 1
+ \afourpaper
+ \internalpagesizes{241mm}{165mm}%
+ {\voffset}{-2.95mm}%
+ {\bindingoffset}{7mm}%
+ {297mm}{210mm}%
+ \globaldefs = 0
+}}
+
+% @pagesizes TEXTHEIGHT[,TEXTWIDTH]
+% Perhaps we should allow setting the margins, \topskip, \parskip,
+% and/or leading, also. Or perhaps we should compute them somehow.
+%
+\parseargdef\pagesizes{\pagesizesyyy #1,,\finish}
+\def\pagesizesyyy#1,#2,#3\finish{{%
+ \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
+ \globaldefs = 1
+ %
+ \parskip = 3pt plus 2pt minus 1pt
+ \setleading{\textleading}%
+ %
+ \dimen0 = #1
+ \advance\dimen0 by \voffset
+ %
+ \dimen2 = \hsize
+ \advance\dimen2 by \normaloffset
+ %
+ \internalpagesizes{#1}{\hsize}%
+ {\voffset}{\normaloffset}%
+ {\bindingoffset}{44pt}%
+ {\dimen0}{\dimen2}%
+}}
+
+% Set default to letter.
+%
+\letterpaper
+
+
+\message{and turning on texinfo input format.}
+
+% Define macros to output various characters with catcode for normal text.
+\catcode`\"=\other
+\catcode`\~=\other
+\catcode`\^=\other
+\catcode`\_=\other
+\catcode`\|=\other
+\catcode`\<=\other
+\catcode`\>=\other
+\catcode`\+=\other
+\catcode`\$=\other
+\def\normaldoublequote{"}
+\def\normaltilde{~}
+\def\normalcaret{^}
+\def\normalunderscore{_}
+\def\normalverticalbar{|}
+\def\normalless{<}
+\def\normalgreater{>}
+\def\normalplus{+}
+\def\normaldollar{$}%$ font-lock fix
+
+% This macro is used to make a character print one way in \tt
+% (where it can probably be output as-is), and another way in other fonts,
+% where something hairier probably needs to be done.
+%
+% #1 is what to print if we are indeed using \tt; #2 is what to print
+% otherwise. Since all the Computer Modern typewriter fonts have zero
+% interword stretch (and shrink), and it is reasonable to expect all
+% typewriter fonts to have this, we can check that font parameter.
+%
+\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi}
+
+% Same as above, but check for italic font. Actually this also catches
+% non-italic slanted fonts since it is impossible to distinguish them from
+% italic fonts. But since this is only used by $ and it uses \sl anyway
+% this is not a problem.
+\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi}
+
+% Turn off all special characters except @
+% (and those which the user can use as if they were ordinary).
+% Most of these we simply print from the \tt font, but for some, we can
+% use math or other variants that look better in normal text.
+
+\catcode`\"=\active
+\def\activedoublequote{{\tt\char34}}
+\let"=\activedoublequote
+\catcode`\~=\active
+\def~{{\tt\char126}}
+\chardef\hat=`\^
+\catcode`\^=\active
+\def^{{\tt \hat}}
+
+\catcode`\_=\active
+\def_{\ifusingtt\normalunderscore\_}
+% Subroutine for the previous macro.
+\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }
+
+\catcode`\|=\active
+\def|{{\tt\char124}}
+\chardef \less=`\<
+\catcode`\<=\active
+\def<{{\tt \less}}
+\chardef \gtr=`\>
+\catcode`\>=\active
+\def>{{\tt \gtr}}
+\catcode`\+=\active
+\def+{{\tt \char 43}}
+\catcode`\$=\active
+\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix
+
+% If a .fmt file is being used, characters that might appear in a file
+% name cannot be active until we have parsed the command line.
+% So turn them off again, and have \everyjob (or @setfilename) turn them on.
+% \otherifyactive is called near the end of this file.
+\def\otherifyactive{\catcode`+=\other \catcode`\_=\other}
+
+\catcode`\@=0
+
+% \backslashcurfont outputs one backslash character in current font,
+% as in \char`\\.
+\global\chardef\backslashcurfont=`\\
+\global\let\rawbackslashxx=\backslashcurfont % let existing .??s files work
+
+% \rawbackslash defines an active \ to do \backslashcurfont.
+% \otherbackslash defines an active \ to be a literal `\' character with
+% catcode other.
+{\catcode`\\=\active
+ @gdef@rawbackslash{@let\=@backslashcurfont}
+ @gdef@otherbackslash{@let\=@realbackslash}
+}
+
+% \realbackslash is an actual character `\' with catcode other.
+{\catcode`\\=\other @gdef@realbackslash{\}}
+
+% \normalbackslash outputs one backslash in fixed width font.
+\def\normalbackslash{{\tt\backslashcurfont}}
+
+\catcode`\\=\active
+
+% Used sometimes to turn off (effectively) the active characters
+% even after parsing them.
+@def@turnoffactive{%
+ @let"=@normaldoublequote
+ @let\=@realbackslash
+ @let~=@normaltilde
+ @let^=@normalcaret
+ @let_=@normalunderscore
+ @let|=@normalverticalbar
+ @let<=@normalless
+ @let>=@normalgreater
+ @let+=@normalplus
+ @let$=@normaldollar %$ font-lock fix
+ @unsepspaces
+}
+
+% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
+% the literal character `\'. (Thus, \ is not expandable when this is in
+% effect.)
+%
+@def@normalturnoffactive{@turnoffactive @let\=@normalbackslash}
+
+% Make _ and + \other characters, temporarily.
+% This is canceled by @fixbackslash.
+@otherifyactive
+
+% If a .fmt file is being used, we don't want the `\input texinfo' to show up.
+% That is what \eatinput is for; after that, the `\' should revert to printing
+% a backslash.
+%
+@gdef@eatinput input texinfo{@fixbackslash}
+@global@let\ = @eatinput
+
+% On the other hand, perhaps the file did not have a `\input texinfo'. Then
+% the first `\{ in the file would cause an error. This macro tries to fix
+% that, assuming it is called before the first `\' could plausibly occur.
+% Also back turn on active characters that might appear in the input
+% file name, in case not using a pre-dumped format.
+%
+@gdef@fixbackslash{%
+ @ifx\@eatinput @let\ = @normalbackslash @fi
+ @catcode`+=@active
+ @catcode`@_=@active
+}
+
+% Say @foo, not \foo, in error messages.
+@escapechar = `@@
+
+% These look ok in all fonts, so just make them not special.
+@catcode`@& = @other
+@catcode`@# = @other
+@catcode`@% = @other
+
+
+@c Local variables:
+@c eval: (add-hook 'write-file-hooks 'time-stamp)
+@c page-delimiter: "^\\\\message"
+@c time-stamp-start: "def\\\\texinfoversion{"
+@c time-stamp-format: "%:y-%02m-%02d.%02H"
+@c time-stamp-end: "}"
+@c End:
+
+@c vim:sw=2:
+
+@ignore
+ arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115
+@end ignore
diff --git a/gsl-1.9/doc/usage.texi b/gsl-1.9/doc/usage.texi
new file mode 100644
index 0000000..adcd494
--- /dev/null
+++ b/gsl-1.9/doc/usage.texi
@@ -0,0 +1,489 @@
+@cindex standards conformance, ANSI C
+@cindex ANSI C, use of
+@cindex C extensions, compatible use of
+@cindex compatibility
+This chapter describes how to compile programs that use GSL, and
+introduces its conventions.
+
+@menu
+* An Example Program::
+* Compiling and Linking::
+* Shared Libraries::
+* ANSI C Compliance::
+* Inline functions::
+* Long double::
+* Portability functions::
+* Alternative optimized functions::
+* Support for different numeric types::
+* Compatibility with C++::
+* Aliasing of arrays::
+* Thread-safety::
+* Deprecated Functions::
+* Code Reuse::
+@end menu
+
+@node An Example Program
+@section An Example Program
+
+The following short program demonstrates the use of the library by
+computing the value of the Bessel function @math{J_0(x)} for @math{x=5},
+
+@example
+@verbatiminclude examples/intro.c
+@end example
+
+@noindent
+The output is shown below, and should be correct to double-precision
+accuracy,
+
+@example
+@verbatiminclude examples/intro.out
+@end example
+
+@noindent
+The steps needed to compile this program are described in the following
+sections.
+
+@node Compiling and Linking
+@section Compiling and Linking
+@cindex compiling programs, include paths
+@cindex including GSL header files
+@cindex header files, including
+The library header files are installed in their own @file{gsl}
+directory. You should write any preprocessor include statements with a
+@file{gsl/} directory prefix thus,
+
+@example
+#include <gsl/gsl_math.h>
+@end example
+
+@noindent
+If the directory is not installed on the standard search path of your
+compiler you will also need to provide its location to the preprocessor
+as a command line flag. The default location of the @file{gsl}
+directory is @file{/usr/local/include/gsl}. A typical compilation
+command for a source file @file{example.c} with the GNU C compiler
+@code{gcc} is,
+
+@example
+$ gcc -Wall -I/usr/local/include -c example.c
+@end example
+
+@noindent
+This results in an object file @file{example.o}. The default
+include path for @code{gcc} searches @file{/usr/local/include} automatically so
+the @code{-I} option can actually be omitted when GSL is installed
+in its default location.
+
+@menu
+* Linking programs with the library::
+* Linking with an alternative BLAS library::
+@end menu
+
+@node Linking programs with the library
+@subsection Linking programs with the library
+@cindex compiling programs, library paths
+@cindex linking with GSL libraries
+@cindex libraries, linking with
+The library is installed as a single file, @file{libgsl.a}. A shared
+version of the library @file{libgsl.so} is also installed on systems
+that support shared libraries. The default location of these files is
+@file{/usr/local/lib}. If this directory is not on the standard search
+path of your linker you will also need to provide its location as a
+command line flag.
+
+To link against the library you need to specify
+both the main library and a supporting @sc{cblas} library, which
+provides standard basic linear algebra subroutines. A suitable
+@sc{cblas} implementation is provided in the library
+@file{libgslcblas.a} if your system does not provide one. The following
+example shows how to link an application with the library,
+
+@example
+$ gcc -L/usr/local/lib example.o -lgsl -lgslcblas -lm
+@end example
+
+@noindent
+The default library path for @code{gcc} searches @file{/usr/local/lib}
+automatically so the @code{-L} option can be omitted when GSL is
+installed in its default location.
+
+@node Linking with an alternative BLAS library
+@subsection Linking with an alternative BLAS library
+
+The following command line shows how you would link the same application
+with an alternative @sc{cblas} library called @file{libcblas},
+
+@example
+$ gcc example.o -lgsl -lcblas -lm
+@end example
+
+@noindent
+For the best performance an optimized platform-specific @sc{cblas}
+library should be used for @code{-lcblas}. The library must conform to
+the @sc{cblas} standard. The @sc{atlas} package provides a portable
+high-performance @sc{blas} library with a @sc{cblas} interface. It is
+free software and should be installed for any work requiring fast vector
+and matrix operations. The following command line will link with the
+@sc{atlas} library and its @sc{cblas} interface,
+
+@example
+$ gcc example.o -lgsl -lcblas -latlas -lm
+@end example
+
+@noindent
+For more information see @ref{BLAS Support}.
+
+@comment The program @code{gsl-config} provides information on the local version
+@comment of the library. For example, the following command shows that the
+@comment library has been installed under the directory @file{/usr/local},
+
+@comment @example
+@comment $ gsl-config --prefix
+@comment /usr/local
+@comment @end example
+@comment @noindent
+@comment Further information is available using the command @code{gsl-config --help}.
+
+@node Shared Libraries
+@section Shared Libraries
+@cindex shared libraries
+@cindex libraries, shared
+@cindex LD_LIBRARY_PATH
+To run a program linked with the shared version of the library the
+operating system must be able to locate the corresponding @file{.so}
+file at runtime. If the library cannot be found, the following error
+will occur:
+
+@example
+$ ./a.out
+./a.out: error while loading shared libraries:
+libgsl.so.0: cannot open shared object file: No such
+file or directory
+@end example
+
+@noindent
+To avoid this error, define the shell variable @code{LD_LIBRARY_PATH} to
+include the directory where the library is installed.
+
+For example, in the Bourne shell (@code{/bin/sh} or @code{/bin/bash}),
+the library search path can be set with the following commands:
+
+@example
+$ LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
+$ export LD_LIBRARY_PATH
+$ ./example
+@end example
+
+@noindent
+In the C-shell (@code{/bin/csh} or @code{/bin/tcsh}) the equivalent
+command is,
+
+@example
+% setenv LD_LIBRARY_PATH /usr/local/lib:$LD_LIBRARY_PATH
+@end example
+
+@noindent
+The standard prompt for the C-shell in the example above is the percent
+character @samp{%}, and should not be typed as part of the command.
+
+To save retyping these commands each session they should be placed in an
+individual or system-wide login file.
+
+To compile a statically linked version of the program, use the
+@code{-static} flag in @code{gcc},
+
+@example
+$ gcc -static example.o -lgsl -lgslcblas -lm
+@end example
+
+@node ANSI C Compliance
+@section ANSI C Compliance
+
+The library is written in ANSI C and is intended to conform to the ANSI
+C standard (C89). It should be portable to any system with a working
+ANSI C compiler.
+
+The library does not rely on any non-ANSI extensions in the interface it
+exports to the user. Programs you write using GSL can be ANSI
+compliant. Extensions which can be used in a way compatible with pure
+ANSI C are supported, however, via conditional compilation. This allows
+the library to take advantage of compiler extensions on those platforms
+which support them.
+
+When an ANSI C feature is known to be broken on a particular system the
+library will exclude any related functions at compile-time. This should
+make it impossible to link a program that would use these functions and
+give incorrect results.
+
+To avoid namespace conflicts all exported function names and variables
+have the prefix @code{gsl_}, while exported macros have the prefix
+@code{GSL_}.
+
+@node Inline functions
+@section Inline functions
+
+@cindex inline functions
+@cindex HAVE_INLINE
+The @code{inline} keyword is not part of the original ANSI C standard
+(C89) and the library does not export any inline function definitions by
+default. However, the library provides optional inline versions of
+performance-critical functions by conditional compilation. The inline
+versions of these functions can be included by defining the macro
+@code{HAVE_INLINE} when compiling an application,
+
+@example
+$ gcc -Wall -c -DHAVE_INLINE example.c
+@end example
+
+@noindent
+If you use @code{autoconf} this macro can be defined automatically. If
+you do not define the macro @code{HAVE_INLINE} then the slower
+non-inlined versions of the functions will be used instead.
+
+Note that the actual usage of the inline keyword is @code{extern
+inline}, which eliminates unnecessary function definitions in @sc{gcc}.
+If the form @code{extern inline} causes problems with other compilers a
+stricter autoconf test can be used, see @ref{Autoconf Macros}.
+
+@node Long double
+@section Long double
+@cindex long double
+The extended numerical type @code{long double} is part of the ANSI C
+standard and should be available in every modern compiler. However, the
+precision of @code{long double} is platform dependent, and this should
+be considered when using it. The IEEE standard only specifies the
+minimum precision of extended precision numbers, while the precision of
+@code{double} is the same on all platforms.
+
+In some system libraries the @code{stdio.h} formatted input/output
+functions @code{printf} and @code{scanf} are not implemented correctly
+for @code{long double}. Undefined or incorrect results are avoided by
+testing these functions during the @code{configure} stage of library
+compilation and eliminating certain GSL functions which depend on them
+if necessary. The corresponding line in the @code{configure} output
+looks like this,
+
+@example
+checking whether printf works with long double... no
+@end example
+
+@noindent
+Consequently when @code{long double} formatted input/output does not
+work on a given system it should be impossible to link a program which
+uses GSL functions dependent on this.
+
+If it is necessary to work on a system which does not support formatted
+@code{long double} input/output then the options are to use binary
+formats or to convert @code{long double} results into @code{double} for
+reading and writing.
+
+@node Portability functions
+@section Portability functions
+
+To help in writing portable applications GSL provides some
+implementations of functions that are found in other libraries, such as
+the BSD math library. You can write your application to use the native
+versions of these functions, and substitute the GSL versions via a
+preprocessor macro if they are unavailable on another platform.
+
+For example, after determining whether the BSD function @code{hypot} is
+available you can include the following macro definitions in a file
+@file{config.h} with your application,
+
+@example
+/* Substitute gsl_hypot for missing system hypot */
+
+#ifndef HAVE_HYPOT
+#define hypot gsl_hypot
+#endif
+@end example
+
+@noindent
+The application source files can then use the include command
+@code{#include <config.h>} to replace each occurrence of @code{hypot} by
+@code{gsl_hypot} when @code{hypot} is not available. This substitution
+can be made automatically if you use @code{autoconf}, see @ref{Autoconf
+Macros}.
+
+In most circumstances the best strategy is to use the native versions of
+these functions when available, and fall back to GSL versions otherwise,
+since this allows your application to take advantage of any
+platform-specific optimizations in the system library. This is the
+strategy used within GSL itself.
+
+@node Alternative optimized functions
+@section Alternative optimized functions
+
+@cindex alternative optimized functions
+@cindex optimized functions, alternatives
+The main implementation of some functions in the library will not be
+optimal on all architectures. For example, there are several ways to
+compute a Gaussian random variate and their relative speeds are
+platform-dependent. In cases like this the library provides alternative
+implementations of these functions with the same interface. If you
+write your application using calls to the standard implementation you
+can select an alternative version later via a preprocessor definition.
+It is also possible to introduce your own optimized functions this way
+while retaining portability. The following lines demonstrate the use of
+a platform-dependent choice of methods for sampling from the Gaussian
+distribution,
+
+@example
+#ifdef SPARC
+#define gsl_ran_gaussian gsl_ran_gaussian_ratio_method
+#endif
+#ifdef INTEL
+#define gsl_ran_gaussian my_gaussian
+#endif
+@end example
+
+@noindent
+These lines would be placed in the configuration header file
+@file{config.h} of the application, which should then be included by all
+the source files. Note that the alternative implementations will not
+produce bit-for-bit identical results, and in the case of random number
+distributions will produce an entirely different stream of random
+variates.
+
+@node Support for different numeric types
+@section Support for different numeric types
+
+Many functions in the library are defined for different numeric types.
+This feature is implemented by varying the name of the function with a
+type-related modifier---a primitive form of C++ templates. The
+modifier is inserted into the function name after the initial module
+prefix. The following table shows the function names defined for all
+the numeric types of an imaginary module @code{gsl_foo} with function
+@code{fn},
+
+@example
+gsl_foo_fn double
+gsl_foo_long_double_fn long double
+gsl_foo_float_fn float
+gsl_foo_long_fn long
+gsl_foo_ulong_fn unsigned long
+gsl_foo_int_fn int
+gsl_foo_uint_fn unsigned int
+gsl_foo_short_fn short
+gsl_foo_ushort_fn unsigned short
+gsl_foo_char_fn char
+gsl_foo_uchar_fn unsigned char
+@end example
+
+@noindent
+The normal numeric precision @code{double} is considered the default and
+does not require a suffix. For example, the function
+@code{gsl_stats_mean} computes the mean of double precision numbers,
+while the function @code{gsl_stats_int_mean} computes the mean of
+integers.
+
+A corresponding scheme is used for library defined types, such as
+@code{gsl_vector} and @code{gsl_matrix}. In this case the modifier is
+appended to the type name. For example, if a module defines a new
+type-dependent struct or typedef @code{gsl_foo} it is modified for other
+types in the following way,
+
+@example
+gsl_foo double
+gsl_foo_long_double long double
+gsl_foo_float float
+gsl_foo_long long
+gsl_foo_ulong unsigned long
+gsl_foo_int int
+gsl_foo_uint unsigned int
+gsl_foo_short short
+gsl_foo_ushort unsigned short
+gsl_foo_char char
+gsl_foo_uchar unsigned char
+@end example
+
+@noindent
+When a module contains type-dependent definitions the library provides
+individual header files for each type. The filenames are modified as
+shown in the below. For convenience the default header includes the
+definitions for all the types. To include only the double precision
+header file, or any other specific type, use its individual filename.
+
+@example
+#include <gsl/gsl_foo.h> All types
+#include <gsl/gsl_foo_double.h> double
+#include <gsl/gsl_foo_long_double.h> long double
+#include <gsl/gsl_foo_float.h> float
+#include <gsl/gsl_foo_long.h> long
+#include <gsl/gsl_foo_ulong.h> unsigned long
+#include <gsl/gsl_foo_int.h> int
+#include <gsl/gsl_foo_uint.h> unsigned int
+#include <gsl/gsl_foo_short.h> short
+#include <gsl/gsl_foo_ushort.h> unsigned short
+#include <gsl/gsl_foo_char.h> char
+#include <gsl/gsl_foo_uchar.h> unsigned char
+@end example
+
+@node Compatibility with C++
+@section Compatibility with C++
+@cindex C++, compatibility
+The library header files automatically define functions to have
+@code{extern "C"} linkage when included in C++ programs. This allows
+the functions to be called directly from C++.
+
+To use C++ exception handling within user-defined functions passed to
+the library as parameters, the library must be built with the
+additional @code{CFLAGS} compilation option @option{-fexceptions}.
+
+@node Aliasing of arrays
+@section Aliasing of arrays
+@cindex aliasing of arrays
+The library assumes that arrays, vectors and matrices passed as
+modifiable arguments are not aliased and do not overlap with each other.
+This removes the need for the library to handle overlapping memory
+regions as a special case, and allows additional optimizations to be
+used. If overlapping memory regions are passed as modifiable arguments
+then the results of such functions will be undefined. If the arguments
+will not be modified (for example, if a function prototype declares them
+as @code{const} arguments) then overlapping or aliased memory regions
+can be safely used.
+
+@node Thread-safety
+@section Thread-safety
+
+The library can be used in multi-threaded programs. All the functions
+are thread-safe, in the sense that they do not use static variables.
+Memory is always associated with objects and not with functions. For
+functions which use @dfn{workspace} objects as temporary storage the
+workspaces should be allocated on a per-thread basis. For functions
+which use @dfn{table} objects as read-only memory the tables can be used
+by multiple threads simultaneously. Table arguments are always declared
+@code{const} in function prototypes, to indicate that they may be
+safely accessed by different threads.
+
+There are a small number of static global variables which are used to
+control the overall behavior of the library (e.g. whether to use
+range-checking, the function to call on fatal error, etc). These
+variables are set directly by the user, so they should be initialized
+once at program startup and not modified by different threads.
+
+@node Deprecated Functions
+@section Deprecated Functions
+@cindex deprecated functions
+
+From time to time, it may be necessary for the definitions of some
+functions to be altered or removed from the library. In these
+circumstances the functions will first be declared @dfn{deprecated} and
+then removed from subsequent versions of the library. Functions that
+are deprecated can be disabled in the current release by setting the
+preprocessor definition @code{GSL_DISABLE_DEPRECATED}. This allows
+existing code to be tested for forwards compatibility.
+
+@node Code Reuse
+@section Code Reuse
+@cindex code reuse in applications
+@cindex source code, reuse in applications
+Where possible the routines in the library have been written to avoid
+dependencies between modules and files. This should make it possible to
+extract individual functions for use in your own applications, without
+needing to have the whole library installed. You may need to define
+certain macros such as @code{GSL_ERROR} and remove some @code{#include}
+statements in order to compile the files as standalone units. Reuse of
+the library code in this way is encouraged, subject to the terms of the
+GNU General Public License.
diff --git a/gsl-1.9/doc/vdp.eps b/gsl-1.9/doc/vdp.eps
new file mode 100644
index 0000000..2e79246
--- /dev/null
+++ b/gsl-1.9/doc/vdp.eps
@@ -0,0 +1,1082 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: vdp.eps
+%%Creator: gnuplot 3.5 (pre 3.6) patchlevel beta 347
+%%CreationDate: Mon Jun 11 17:56:56 2001
+%%DocumentFonts: (atend)
+%%BoundingBox: 50 50 410 302
+%%Orientation: Portrait
+%%EndComments
+/gnudict 120 dict def
+gnudict begin
+/Color false def
+/Solid false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+/vshift -46 def
+/dl {10 mul} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+ 0 vshift R show } def
+/Rshow { currentpoint stroke M
+ dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+ dup stringwidth pop -2 div vshift R show } def
+/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke gnulinewidth 2 mul setlinewidth } def
+/AL { stroke gnulinewidth 2 div setlinewidth } def
+/UL { gnulinewidth mul /userlinewidth exch def } def
+/PL { stroke userlinewidth setlinewidth } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 dl 2 dl] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 1 0 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
+/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/Pnt { stroke [] 0 setdash
+ gsave 1 setlinecap M 0 0 V stroke grestore } def
+/Dia { stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt } def
+/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt } def
+/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt } def
+/Star { 2 copy Pls Crs } def
+/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill } def
+/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill } def
+/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt } def
+/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill } def
+/Pent { stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt } def
+/PentF { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore } def
+/Circle { stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt } def
+/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
+/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def
+/C1 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C2 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C3 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C4 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C5 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc } bind def
+/C6 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C7 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C8 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C9 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C11 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C12 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C13 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/C14 { BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc } bind def
+/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath } bind def
+/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath } bind def
+/Square { dup Rec } bind def
+/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
+/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
+/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
+/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
+/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill
+ Bsquare } bind def
+/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
+/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare } bind def
+/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare } bind def
+/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
+/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare } bind def
+/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
+/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
+/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
+/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
+/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
+/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
+/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
+/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
+/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
+/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
+/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
+/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
+/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
+/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
+/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
+/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
+/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
+/DiaE { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke } def
+/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke } def
+/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke } def
+/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke } def
+/PentE { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore } def
+/CircE { stroke [] 0 setdash
+ hpt 0 360 arc stroke } def
+/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def
+/DiaW { stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke } def
+/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke } def
+/TriUW { stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke } def
+/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke } def
+/PentW { stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore } def
+/CircW { stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke } def
+/BoxFill { gsave Rec 1 setgray fill grestore } def
+end
+%%EndProlog
+gnudict begin
+gsave
+50 50 translate
+0.050 0.050 scale
+0 setgray
+newpath
+(Helvetica) findfont 140 scalefont setfont
+1.000 UL
+LTb
+336 739 M
+63 0 V
+6633 0 R
+-63 0 V
+252 739 M
+(-4) Rshow
+336 1658 M
+63 0 V
+6633 0 R
+-63 0 V
+-6717 0 R
+(-2) Rshow
+336 2576 M
+63 0 V
+6633 0 R
+-63 0 V
+-6717 0 R
+(0) Rshow
+336 3494 M
+63 0 V
+6633 0 R
+-63 0 V
+-6717 0 R
+(2) Rshow
+336 4413 M
+63 0 V
+6633 0 R
+-63 0 V
+-6717 0 R
+(4) Rshow
+336 280 M
+0 63 V
+0 4529 R
+0 -63 V
+336 140 M
+(0) Cshow
+1006 280 M
+0 63 V
+0 4529 R
+0 -63 V
+0 -4669 R
+(10) Cshow
+1675 280 M
+0 63 V
+0 4529 R
+0 -63 V
+0 -4669 R
+(20) Cshow
+2345 280 M
+0 63 V
+0 4529 R
+0 -63 V
+0 -4669 R
+(30) Cshow
+3014 280 M
+0 63 V
+0 4529 R
+0 -63 V
+0 -4669 R
+(40) Cshow
+3684 280 M
+0 63 V
+0 4529 R
+0 -63 V
+0 -4669 R
+(50) Cshow
+4354 280 M
+0 63 V
+0 4529 R
+0 -63 V
+0 -4669 R
+(60) Cshow
+5023 280 M
+0 63 V
+0 4529 R
+0 -63 V
+0 -4669 R
+(70) Cshow
+5693 280 M
+0 63 V
+0 4529 R
+0 -63 V
+0 -4669 R
+(80) Cshow
+6362 280 M
+0 63 V
+0 4529 R
+0 -63 V
+0 -4669 R
+(90) Cshow
+7032 280 M
+0 63 V
+0 4529 R
+0 -63 V
+0 -4669 R
+(100) Cshow
+1.000 UL
+LTb
+336 280 M
+6696 0 V
+0 4592 V
+-6696 0 V
+336 280 L
+1.000 UP
+1.000 UL
+LT0
+336 3035 Pls
+336 3035 Pls
+336 3035 Pls
+336 3035 Pls
+336 3035 Pls
+336 3035 Pls
+337 3035 Pls
+343 3033 Pls
+361 3002 Pls
+371 2964 Pls
+379 2914 Pls
+385 2845 Pls
+390 2743 Pls
+393 2642 Pls
+396 2508 Pls
+399 2310 Pls
+400 2140 Pls
+402 1961 Pls
+404 1832 Pls
+406 1746 Pls
+407 1698 Pls
+409 1672 Pls
+411 1660 Pls
+413 1655 Pls
+415 1654 Pls
+418 1654 Pls
+420 1655 Pls
+424 1656 Pls
+427 1658 Pls
+432 1660 Pls
+437 1662 Pls
+444 1665 Pls
+452 1669 Pls
+463 1674 Pls
+473 1679 Pls
+483 1684 Pls
+494 1689 Pls
+504 1694 Pls
+515 1699 Pls
+525 1705 Pls
+536 1710 Pls
+546 1715 Pls
+557 1721 Pls
+568 1726 Pls
+578 1732 Pls
+589 1738 Pls
+600 1744 Pls
+611 1750 Pls
+623 1756 Pls
+634 1762 Pls
+645 1769 Pls
+657 1775 Pls
+668 1782 Pls
+680 1789 Pls
+692 1796 Pls
+704 1804 Pls
+716 1811 Pls
+728 1819 Pls
+740 1827 Pls
+753 1836 Pls
+766 1845 Pls
+779 1854 Pls
+792 1864 Pls
+805 1874 Pls
+819 1885 Pls
+833 1896 Pls
+847 1908 Pls
+862 1922 Pls
+877 1936 Pls
+892 1952 Pls
+908 1969 Pls
+925 1990 Pls
+943 2015 Pls
+962 2047 Pls
+984 2095 Pls
+998 2143 Pls
+1007 2191 Pls
+1014 2250 Pls
+1020 2333 Pls
+1024 2429 Pls
+1027 2541 Pls
+1029 2691 Pls
+1032 2903 Pls
+1034 3077 Pls
+1036 3242 Pls
+1037 3365 Pls
+1039 3431 Pls
+1041 3468 Pls
+1042 3488 Pls
+1044 3497 Pls
+1046 3500 Pls
+1049 3501 Pls
+1051 3500 Pls
+1054 3499 Pls
+1057 3498 Pls
+1061 3496 Pls
+1066 3494 Pls
+1072 3492 Pls
+1079 3488 Pls
+1089 3484 Pls
+1099 3479 Pls
+1109 3474 Pls
+1119 3469 Pls
+1130 3464 Pls
+1140 3459 Pls
+1150 3454 Pls
+1161 3449 Pls
+1171 3444 Pls
+1182 3438 Pls
+1193 3433 Pls
+1203 3427 Pls
+1214 3422 Pls
+1225 3416 Pls
+1236 3410 Pls
+1247 3404 Pls
+1258 3398 Pls
+1269 3392 Pls
+1281 3385 Pls
+1292 3379 Pls
+1304 3372 Pls
+1315 3365 Pls
+1327 3358 Pls
+1339 3350 Pls
+1351 3343 Pls
+1363 3335 Pls
+1376 3327 Pls
+1388 3318 Pls
+1401 3310 Pls
+1414 3301 Pls
+1427 3291 Pls
+1440 3281 Pls
+1454 3270 Pls
+1468 3259 Pls
+1482 3247 Pls
+1496 3234 Pls
+1511 3220 Pls
+1526 3205 Pls
+1542 3188 Pls
+1559 3168 Pls
+1576 3145 Pls
+1595 3115 Pls
+1616 3073 Pls
+1634 3020 Pls
+1643 2974 Pls
+1651 2919 Pls
+1657 2845 Pls
+1662 2744 Pls
+1665 2639 Pls
+1667 2501 Pls
+1670 2301 Pls
+1672 2129 Pls
+1674 1952 Pls
+1675 1825 Pls
+1677 1741 Pls
+1679 1694 Pls
+1681 1669 Pls
+1682 1657 Pls
+1684 1653 Pls
+1687 1651 Pls
+1689 1651 Pls
+1692 1652 Pls
+1695 1654 Pls
+1699 1655 Pls
+1703 1657 Pls
+1708 1660 Pls
+1715 1663 Pls
+1724 1667 Pls
+1734 1671 Pls
+1744 1676 Pls
+1755 1681 Pls
+1765 1686 Pls
+1775 1691 Pls
+1786 1696 Pls
+1796 1701 Pls
+1807 1707 Pls
+1817 1712 Pls
+1828 1717 Pls
+1838 1723 Pls
+1849 1728 Pls
+1860 1734 Pls
+1871 1740 Pls
+1882 1746 Pls
+1893 1752 Pls
+1904 1758 Pls
+1916 1765 Pls
+1927 1771 Pls
+1938 1778 Pls
+1950 1785 Pls
+1962 1792 Pls
+1974 1799 Pls
+1986 1807 Pls
+1998 1814 Pls
+2010 1822 Pls
+2023 1831 Pls
+2035 1839 Pls
+2048 1848 Pls
+2061 1858 Pls
+2074 1868 Pls
+2088 1878 Pls
+2101 1889 Pls
+2116 1901 Pls
+2130 1913 Pls
+2145 1927 Pls
+2160 1942 Pls
+2176 1958 Pls
+2192 1977 Pls
+2209 1999 Pls
+2227 2026 Pls
+2247 2062 Pls
+2270 2122 Pls
+2279 2164 Pls
+2288 2216 Pls
+2294 2283 Pls
+2301 2415 Pls
+2304 2516 Pls
+2306 2656 Pls
+2309 2858 Pls
+2311 3029 Pls
+2313 3205 Pls
+2314 3331 Pls
+2316 3414 Pls
+2318 3460 Pls
+2319 3484 Pls
+2321 3495 Pls
+2323 3500 Pls
+2325 3501 Pls
+2328 3501 Pls
+2331 3500 Pls
+2334 3498 Pls
+2338 3497 Pls
+2342 3495 Pls
+2347 3492 Pls
+2354 3489 Pls
+2363 3485 Pls
+2373 3480 Pls
+2383 3476 Pls
+2394 3471 Pls
+2404 3466 Pls
+2414 3461 Pls
+2425 3456 Pls
+2435 3451 Pls
+2446 3445 Pls
+2456 3440 Pls
+2467 3435 Pls
+2477 3429 Pls
+2488 3423 Pls
+2499 3418 Pls
+2510 3412 Pls
+2521 3406 Pls
+2532 3400 Pls
+2543 3394 Pls
+2555 3387 Pls
+2566 3381 Pls
+2577 3374 Pls
+2589 3367 Pls
+2601 3360 Pls
+2613 3353 Pls
+2625 3345 Pls
+2637 3337 Pls
+2649 3329 Pls
+2662 3321 Pls
+2674 3312 Pls
+2687 3303 Pls
+2700 3294 Pls
+2713 3284 Pls
+2727 3274 Pls
+2741 3263 Pls
+2755 3251 Pls
+2769 3238 Pls
+2784 3225 Pls
+2799 3210 Pls
+2815 3194 Pls
+2831 3175 Pls
+2848 3153 Pls
+2867 3126 Pls
+2887 3089 Pls
+2909 3027 Pls
+2919 2987 Pls
+2927 2934 Pls
+2933 2866 Pls
+2940 2732 Pls
+2942 2630 Pls
+2945 2488 Pls
+2948 2283 Pls
+2950 2111 Pls
+2951 1938 Pls
+2953 1801 Pls
+2955 1730 Pls
+2957 1689 Pls
+2958 1666 Pls
+2960 1656 Pls
+2962 1652 Pls
+2965 1651 Pls
+2967 1651 Pls
+2970 1652 Pls
+2973 1654 Pls
+2977 1656 Pls
+2982 1658 Pls
+2987 1660 Pls
+2994 1663 Pls
+3004 1668 Pls
+3014 1672 Pls
+3024 1677 Pls
+3034 1682 Pls
+3044 1687 Pls
+3055 1692 Pls
+3065 1697 Pls
+3075 1702 Pls
+3086 1708 Pls
+3096 1713 Pls
+3107 1718 Pls
+3118 1724 Pls
+3129 1729 Pls
+3139 1735 Pls
+3150 1741 Pls
+3161 1747 Pls
+3173 1753 Pls
+3184 1759 Pls
+3195 1766 Pls
+3206 1772 Pls
+3218 1779 Pls
+3230 1786 Pls
+3241 1793 Pls
+3253 1800 Pls
+3265 1808 Pls
+3277 1816 Pls
+3290 1824 Pls
+3302 1832 Pls
+3315 1841 Pls
+3328 1850 Pls
+3341 1859 Pls
+3354 1869 Pls
+3368 1880 Pls
+3381 1891 Pls
+3396 1903 Pls
+3410 1916 Pls
+3425 1929 Pls
+3440 1944 Pls
+3456 1961 Pls
+3472 1980 Pls
+3490 2003 Pls
+3508 2031 Pls
+3529 2070 Pls
+3548 2125 Pls
+3558 2169 Pls
+3566 2222 Pls
+3572 2292 Pls
+3578 2406 Pls
+3581 2506 Pls
+3583 2642 Pls
+3586 2840 Pls
+3588 3011 Pls
+3590 3191 Pls
+3592 3320 Pls
+3593 3407 Pls
+3595 3456 Pls
+3597 3482 Pls
+3599 3494 Pls
+3600 3499 Pls
+3603 3501 Pls
+3605 3501 Pls
+3608 3500 Pls
+3611 3499 Pls
+3615 3497 Pls
+3619 3495 Pls
+3624 3493 Pls
+3630 3490 Pls
+3639 3486 Pls
+3649 3481 Pls
+3660 3476 Pls
+3670 3471 Pls
+3681 3466 Pls
+3691 3461 Pls
+3702 3456 Pls
+3712 3451 Pls
+3723 3445 Pls
+3733 3440 Pls
+3744 3435 Pls
+3755 3429 Pls
+3765 3424 Pls
+3776 3418 Pls
+3787 3412 Pls
+3798 3406 Pls
+3809 3400 Pls
+3821 3394 Pls
+3832 3387 Pls
+3843 3381 Pls
+3855 3374 Pls
+3866 3367 Pls
+3878 3360 Pls
+3890 3353 Pls
+3902 3345 Pls
+3914 3338 Pls
+3926 3330 Pls
+3939 3321 Pls
+3951 3313 Pls
+3964 3304 Pls
+3977 3294 Pls
+3991 3284 Pls
+4004 3274 Pls
+4018 3263 Pls
+4032 3251 Pls
+4046 3239 Pls
+4061 3225 Pls
+4076 3210 Pls
+4092 3194 Pls
+4108 3175 Pls
+4125 3153 Pls
+4144 3126 Pls
+4164 3090 Pls
+4186 3029 Pls
+4196 2988 Pls
+4204 2936 Pls
+4210 2869 Pls
+4217 2736 Pls
+4220 2635 Pls
+4222 2495 Pls
+4225 2292 Pls
+4227 2121 Pls
+4229 1945 Pls
+4231 1820 Pls
+4232 1738 Pls
+4234 1692 Pls
+4236 1667 Pls
+4238 1657 Pls
+4240 1652 Pls
+4242 1651 Pls
+4244 1651 Pls
+4247 1652 Pls
+4250 1654 Pls
+4254 1655 Pls
+4258 1657 Pls
+4264 1660 Pls
+4270 1663 Pls
+4279 1667 Pls
+4290 1672 Pls
+4300 1677 Pls
+4310 1681 Pls
+4320 1686 Pls
+4331 1691 Pls
+4341 1696 Pls
+4351 1702 Pls
+4362 1707 Pls
+4373 1712 Pls
+4383 1718 Pls
+4394 1723 Pls
+4405 1729 Pls
+4415 1734 Pls
+4426 1740 Pls
+4437 1746 Pls
+4448 1752 Pls
+4460 1758 Pls
+4471 1765 Pls
+4482 1771 Pls
+4494 1778 Pls
+4506 1785 Pls
+4517 1792 Pls
+4529 1799 Pls
+4541 1807 Pls
+4553 1815 Pls
+4566 1823 Pls
+4578 1831 Pls
+4591 1840 Pls
+4604 1849 Pls
+4617 1858 Pls
+4630 1868 Pls
+4643 1878 Pls
+4657 1889 Pls
+4671 1901 Pls
+4685 1914 Pls
+4700 1927 Pls
+4715 1942 Pls
+4731 1959 Pls
+4748 1978 Pls
+4765 2000 Pls
+4783 2027 Pls
+4803 2064 Pls
+4826 2126 Pls
+4835 2166 Pls
+4843 2220 Pls
+4849 2288 Pls
+4856 2423 Pls
+4859 2526 Pls
+4861 2669 Pls
+4864 2875 Pls
+4866 3048 Pls
+4868 3219 Pls
+4870 3351 Pls
+4871 3422 Pls
+4873 3463 Pls
+4875 3487 Pls
+4877 3496 Pls
+4879 3500 Pls
+4881 3501 Pls
+4883 3501 Pls
+4886 3500 Pls
+4890 3498 Pls
+4893 3496 Pls
+4898 3494 Pls
+4903 3492 Pls
+4910 3489 Pls
+4920 3484 Pls
+4930 3479 Pls
+4940 3475 Pls
+4950 3470 Pls
+4961 3465 Pls
+4971 3460 Pls
+4981 3455 Pls
+4992 3450 Pls
+5002 3444 Pls
+5013 3439 Pls
+5024 3434 Pls
+5034 3428 Pls
+5045 3423 Pls
+5056 3417 Pls
+5067 3411 Pls
+5078 3405 Pls
+5089 3399 Pls
+5100 3393 Pls
+5111 3386 Pls
+5123 3380 Pls
+5134 3373 Pls
+5146 3366 Pls
+5158 3359 Pls
+5170 3352 Pls
+5182 3344 Pls
+5194 3336 Pls
+5206 3328 Pls
+5219 3320 Pls
+5231 3311 Pls
+5244 3302 Pls
+5257 3292 Pls
+5271 3282 Pls
+5284 3272 Pls
+5298 3261 Pls
+5312 3249 Pls
+5326 3236 Pls
+5341 3223 Pls
+5357 3207 Pls
+5372 3191 Pls
+5389 3171 Pls
+5406 3149 Pls
+5425 3120 Pls
+5445 3081 Pls
+5464 3027 Pls
+5474 2982 Pls
+5482 2929 Pls
+5488 2859 Pls
+5494 2747 Pls
+5497 2647 Pls
+5500 2511 Pls
+5502 2313 Pls
+5504 2142 Pls
+5506 1962 Pls
+5508 1833 Pls
+5509 1746 Pls
+5511 1697 Pls
+5513 1670 Pls
+5515 1658 Pls
+5517 1653 Pls
+5519 1651 Pls
+5521 1651 Pls
+5524 1652 Pls
+5527 1653 Pls
+5531 1655 Pls
+5535 1657 Pls
+5540 1659 Pls
+5547 1662 Pls
+5555 1666 Pls
+5566 1671 Pls
+5576 1676 Pls
+5587 1681 Pls
+5597 1686 Pls
+5608 1691 Pls
+5618 1696 Pls
+5629 1701 Pls
+5639 1707 Pls
+5650 1712 Pls
+5660 1717 Pls
+5671 1723 Pls
+5682 1728 Pls
+5693 1734 Pls
+5704 1740 Pls
+5715 1746 Pls
+5726 1752 Pls
+5737 1758 Pls
+5748 1765 Pls
+5760 1771 Pls
+5771 1778 Pls
+5783 1785 Pls
+5794 1792 Pls
+5806 1799 Pls
+5818 1807 Pls
+5830 1814 Pls
+5843 1822 Pls
+5855 1831 Pls
+5868 1839 Pls
+5881 1848 Pls
+5894 1858 Pls
+5907 1868 Pls
+5920 1878 Pls
+5934 1889 Pls
+5948 1901 Pls
+5963 1913 Pls
+5977 1927 Pls
+5993 1942 Pls
+6008 1958 Pls
+6025 1977 Pls
+6042 1999 Pls
+6060 2026 Pls
+6080 2063 Pls
+6103 2124 Pls
+6112 2164 Pls
+6120 2217 Pls
+6127 2284 Pls
+6133 2418 Pls
+6136 2519 Pls
+6139 2660 Pls
+6141 2863 Pls
+6143 3035 Pls
+6145 3210 Pls
+6147 3335 Pls
+6148 3416 Pls
+6150 3461 Pls
+6152 3485 Pls
+6154 3496 Pls
+6156 3500 Pls
+6158 3501 Pls
+6161 3501 Pls
+6163 3500 Pls
+6167 3498 Pls
+6170 3497 Pls
+6175 3495 Pls
+6180 3492 Pls
+6187 3489 Pls
+6196 3485 Pls
+6206 3480 Pls
+6217 3475 Pls
+6227 3470 Pls
+6237 3465 Pls
+6247 3460 Pls
+6258 3455 Pls
+6268 3450 Pls
+6279 3445 Pls
+6289 3440 Pls
+6300 3434 Pls
+6310 3429 Pls
+6321 3423 Pls
+6332 3417 Pls
+6343 3412 Pls
+6354 3406 Pls
+6365 3400 Pls
+6376 3393 Pls
+6388 3387 Pls
+6399 3380 Pls
+6411 3374 Pls
+6422 3367 Pls
+6434 3360 Pls
+6446 3352 Pls
+6458 3345 Pls
+6470 3337 Pls
+6482 3329 Pls
+6495 3321 Pls
+6507 3312 Pls
+6520 3303 Pls
+6533 3294 Pls
+6547 3284 Pls
+6560 3273 Pls
+6574 3262 Pls
+6588 3250 Pls
+6602 3238 Pls
+6617 3224 Pls
+6632 3209 Pls
+6648 3193 Pls
+6664 3174 Pls
+6682 3152 Pls
+6700 3124 Pls
+6720 3086 Pls
+6743 3023 Pls
+6752 2983 Pls
+6760 2928 Pls
+6766 2859 Pls
+6772 2747 Pls
+6775 2647 Pls
+6777 2511 Pls
+6780 2313 Pls
+6782 2142 Pls
+6784 1962 Pls
+6785 1833 Pls
+6787 1746 Pls
+6789 1697 Pls
+6790 1670 Pls
+6792 1658 Pls
+6794 1653 Pls
+6796 1651 Pls
+6799 1651 Pls
+6801 1652 Pls
+6805 1653 Pls
+6808 1655 Pls
+6812 1657 Pls
+6818 1659 Pls
+6824 1662 Pls
+6833 1666 Pls
+6843 1671 Pls
+6854 1676 Pls
+6864 1681 Pls
+6875 1686 Pls
+6885 1691 Pls
+6896 1696 Pls
+6906 1701 Pls
+6917 1707 Pls
+6927 1712 Pls
+6938 1717 Pls
+6949 1723 Pls
+6959 1728 Pls
+6970 1734 Pls
+6981 1740 Pls
+6992 1746 Pls
+7003 1752 Pls
+7014 1758 Pls
+7026 1765 Pls
+7032 1768 Pls
+stroke
+grestore
+end
+showpage
+%%Trailer
+%%DocumentFonts: Helvetica
diff --git a/gsl-1.9/doc/vectors.texi b/gsl-1.9/doc/vectors.texi
new file mode 100644
index 0000000..e17a1af
--- /dev/null
+++ b/gsl-1.9/doc/vectors.texi
@@ -0,0 +1,1616 @@
+@cindex blocks
+@cindex vectors
+@cindex matrices
+
+The functions described in this chapter provide a simple vector and
+matrix interface to ordinary C arrays. The memory management of these
+arrays is implemented using a single underlying type, known as a
+block. By writing your functions in terms of vectors and matrices you
+can pass a single structure containing both data and dimensions as an
+argument without needing additional function parameters. The structures
+are compatible with the vector and matrix formats used by @sc{blas}
+routines.
+
+@menu
+* Data types::
+* Blocks::
+* Vectors::
+* Matrices::
+* Vector and Matrix References and Further Reading::
+@end menu
+
+@node Data types
+@section Data types
+
+All the functions are available for each of the standard data-types.
+The versions for @code{double} have the prefix @code{gsl_block},
+@code{gsl_vector} and @code{gsl_matrix}. Similarly the versions for
+single-precision @code{float} arrays have the prefix
+@code{gsl_block_float}, @code{gsl_vector_float} and
+@code{gsl_matrix_float}. The full list of available types is given
+below,
+
+@example
+gsl_block double
+gsl_block_float float
+gsl_block_long_double long double
+gsl_block_int int
+gsl_block_uint unsigned int
+gsl_block_long long
+gsl_block_ulong unsigned long
+gsl_block_short short
+gsl_block_ushort unsigned short
+gsl_block_char char
+gsl_block_uchar unsigned char
+gsl_block_complex complex double
+gsl_block_complex_float complex float
+gsl_block_complex_long_double complex long double
+@end example
+
+@noindent
+Corresponding types exist for the @code{gsl_vector} and
+@code{gsl_matrix} functions.
+
+
+
+@node Blocks
+@section Blocks
+
+For consistency all memory is allocated through a @code{gsl_block}
+structure. The structure contains two components, the size of an area of
+memory and a pointer to the memory. The @code{gsl_block} structure looks
+like this,
+
+@example
+typedef struct
+@{
+ size_t size;
+ double * data;
+@} gsl_block;
+@end example
+@comment
+
+@noindent
+Vectors and matrices are made by @dfn{slicing} an underlying block. A
+slice is a set of elements formed from an initial offset and a
+combination of indices and step-sizes. In the case of a matrix the
+step-size for the column index represents the row-length. The step-size
+for a vector is known as the @dfn{stride}.
+
+The functions for allocating and deallocating blocks are defined in
+@file{gsl_block.h}
+
+@menu
+* Block allocation::
+* Reading and writing blocks::
+* Example programs for blocks::
+@end menu
+
+@node Block allocation
+@subsection Block allocation
+
+The functions for allocating memory to a block follow the style of
+@code{malloc} and @code{free}. In addition they also perform their own
+error checking. If there is insufficient memory available to allocate a
+block then the functions call the GSL error handler (with an error
+number of @code{GSL_ENOMEM}) in addition to returning a null
+pointer. Thus if you use the library error handler to abort your program
+then it isn't necessary to check every @code{alloc}.
+
+@deftypefun {gsl_block *} gsl_block_alloc (size_t @var{n})
+This function allocates memory for a block of @var{n} double-precision
+elements, returning a pointer to the block struct. The block is not
+initialized and so the values of its elements are undefined. Use the
+function @code{gsl_block_calloc} if you want to ensure that all the
+elements are initialized to zero.
+
+A null pointer is returned if insufficient memory is available to create
+the block.
+@end deftypefun
+
+@deftypefun {gsl_block *} gsl_block_calloc (size_t @var{n})
+This function allocates memory for a block and initializes all the
+elements of the block to zero.
+@end deftypefun
+
+@deftypefun void gsl_block_free (gsl_block * @var{b})
+This function frees the memory used by a block @var{b} previously
+allocated with @code{gsl_block_alloc} or @code{gsl_block_calloc}. The
+block @var{b} must be a valid block object (a null pointer is not
+allowed).
+@end deftypefun
+
+@node Reading and writing blocks
+@subsection Reading and writing blocks
+
+The library provides functions for reading and writing blocks to a file
+as binary data or formatted text.
+
+@deftypefun int gsl_block_fwrite (FILE * @var{stream}, const gsl_block * @var{b})
+This function writes the elements of the block @var{b} to the stream
+@var{stream} in binary format. The return value is 0 for success and
+@code{GSL_EFAILED} if there was a problem writing to the file. Since the
+data is written in the native binary format it may not be portable
+between different architectures.
+@end deftypefun
+
+@deftypefun int gsl_block_fread (FILE * @var{stream}, gsl_block * @var{b})
+This function reads into the block @var{b} from the open stream
+@var{stream} in binary format. The block @var{b} must be preallocated
+with the correct length since the function uses the size of @var{b} to
+determine how many bytes to read. The return value is 0 for success and
+@code{GSL_EFAILED} if there was a problem reading from the file. The
+data is assumed to have been written in the native binary format on the
+same architecture.
+@end deftypefun
+
+@deftypefun int gsl_block_fprintf (FILE * @var{stream}, const gsl_block * @var{b}, const char * @var{format})
+This function writes the elements of the block @var{b} line-by-line to
+the stream @var{stream} using the format specifier @var{format}, which
+should be one of the @code{%g}, @code{%e} or @code{%f} formats for
+floating point numbers and @code{%d} for integers. The function returns
+0 for success and @code{GSL_EFAILED} if there was a problem writing to
+the file.
+@end deftypefun
+
+@deftypefun int gsl_block_fscanf (FILE * @var{stream}, gsl_block * @var{b})
+This function reads formatted data from the stream @var{stream} into the
+block @var{b}. The block @var{b} must be preallocated with the correct
+length since the function uses the size of @var{b} to determine how many
+numbers to read. The function returns 0 for success and
+@code{GSL_EFAILED} if there was a problem reading from the file.
+@end deftypefun
+@comment
+
+@node Example programs for blocks
+@subsection Example programs for blocks
+
+The following program shows how to allocate a block,
+
+@example
+@verbatiminclude examples/block.c
+@end example
+@comment
+
+@noindent
+Here is the output from the program,
+
+@example
+@verbatiminclude examples/block.out
+@end example
+@comment
+
+@node Vectors
+@section Vectors
+@cindex vectors
+@cindex stride, of vector index
+
+Vectors are defined by a @code{gsl_vector} structure which describes a
+slice of a block. Different vectors can be created which point to the
+same block. A vector slice is a set of equally-spaced elements of an
+area of memory.
+
+The @code{gsl_vector} structure contains five components, the
+@dfn{size}, the @dfn{stride}, a pointer to the memory where the elements
+are stored, @var{data}, a pointer to the block owned by the vector,
+@var{block}, if any, and an ownership flag, @var{owner}. The structure
+is very simple and looks like this,
+
+@example
+typedef struct
+@{
+ size_t size;
+ size_t stride;
+ double * data;
+ gsl_block * block;
+ int owner;
+@} gsl_vector;
+@end example
+@comment
+
+@noindent
+The @var{size} is simply the number of vector elements. The range of
+valid indices runs from 0 to @code{size-1}. The @var{stride} is the
+step-size from one element to the next in physical memory, measured in
+units of the appropriate datatype. The pointer @var{data} gives the
+location of the first element of the vector in memory. The pointer
+@var{block} stores the location of the memory block in which the vector
+elements are located (if any). If the vector owns this block then the
+@var{owner} field is set to one and the block will be deallocated when the
+vector is freed. If the vector points to a block owned by another
+object then the @var{owner} field is zero and any underlying block will not be
+deallocated with the vector.
+
+The functions for allocating and accessing vectors are defined in
+@file{gsl_vector.h}
+
+@menu
+* Vector allocation::
+* Accessing vector elements::
+* Initializing vector elements::
+* Reading and writing vectors::
+* Vector views::
+* Copying vectors::
+* Exchanging elements::
+* Vector operations::
+* Finding maximum and minimum elements of vectors::
+* Vector properties::
+* Example programs for vectors::
+@end menu
+
+@node Vector allocation
+@subsection Vector allocation
+
+The functions for allocating memory to a vector follow the style of
+@code{malloc} and @code{free}. In addition they also perform their own
+error checking. If there is insufficient memory available to allocate a
+vector then the functions call the GSL error handler (with an error
+number of @code{GSL_ENOMEM}) in addition to returning a null
+pointer. Thus if you use the library error handler to abort your program
+then it isn't necessary to check every @code{alloc}.
+
+@deftypefun {gsl_vector *} gsl_vector_alloc (size_t @var{n})
+This function creates a vector of length @var{n}, returning a pointer to
+a newly initialized vector struct. A new block is allocated for the
+elements of the vector, and stored in the @var{block} component of the
+vector struct. The block is ``owned'' by the vector, and will be
+deallocated when the vector is deallocated.
+@end deftypefun
+
+@deftypefun {gsl_vector *} gsl_vector_calloc (size_t @var{n})
+This function allocates memory for a vector of length @var{n} and
+initializes all the elements of the vector to zero.
+@end deftypefun
+
+@deftypefun void gsl_vector_free (gsl_vector * @var{v})
+This function frees a previously allocated vector @var{v}. If the
+vector was created using @code{gsl_vector_alloc} then the block
+underlying the vector will also be deallocated. If the vector has
+been created from another object then the memory is still owned by
+that object and will not be deallocated. The vector @var{v} must be a
+valid vector object (a null pointer is not allowed).
+@end deftypefun
+
+@node Accessing vector elements
+@subsection Accessing vector elements
+@cindex vectors, range-checking
+@cindex range-checking for vectors
+@cindex bounds checking, extension to GCC
+@cindex gcc extensions, range-checking
+@cindex Fortran range checking, equivalent in gcc
+
+Unlike @sc{fortran} compilers, C compilers do not usually provide
+support for range checking of vectors and matrices. Range checking is
+available in the GNU C Compiler bounds-checking extension, but it is not
+part of the default installation of GCC. The functions
+@code{gsl_vector_get} and @code{gsl_vector_set} can perform portable
+range checking for you and report an error if you attempt to access
+elements outside the allowed range.
+
+The functions for accessing the elements of a vector or matrix are
+defined in @file{gsl_vector.h} and declared @code{extern inline} to
+eliminate function-call overhead. You must compile your program with
+the macro @code{HAVE_INLINE} defined to use these functions.
+
+If necessary you can turn off range checking completely without
+modifying any source files by recompiling your program with the
+preprocessor definition @code{GSL_RANGE_CHECK_OFF}. Provided your
+compiler supports inline functions the effect of turning off range
+checking is to replace calls to @code{gsl_vector_get(v,i)} by
+@code{v->data[i*v->stride]} and calls to @code{gsl_vector_set(v,i,x)} by
+@code{v->data[i*v->stride]=x}. Thus there should be no performance
+penalty for using the range checking functions when range checking is
+turned off.
+
+@deftypefun double gsl_vector_get (const gsl_vector * @var{v}, size_t @var{i})
+This function returns the @var{i}-th element of a vector @var{v}. If
+@var{i} lies outside the allowed range of 0 to @math{@var{n}-1} then the error
+handler is invoked and 0 is returned.
+@end deftypefun
+
+@deftypefun void gsl_vector_set (gsl_vector * @var{v}, size_t @var{i}, double @var{x})
+This function sets the value of the @var{i}-th element of a vector
+@var{v} to @var{x}. If @var{i} lies outside the allowed range of 0 to
+@math{@var{n}-1} then the error handler is invoked.
+@end deftypefun
+
+@deftypefun {double *} gsl_vector_ptr (gsl_vector * @var{v}, size_t @var{i})
+@deftypefunx {const double *} gsl_vector_const_ptr (const gsl_vector * @var{v}, size_t @var{i})
+These functions return a pointer to the @var{i}-th element of a vector
+@var{v}. If @var{i} lies outside the allowed range of 0 to @math{@var{n}-1}
+then the error handler is invoked and a null pointer is returned.
+@end deftypefun
+
+@node Initializing vector elements
+@subsection Initializing vector elements
+@cindex vectors, initializing
+@cindex initializing vectors
+
+@deftypefun void gsl_vector_set_all (gsl_vector * @var{v}, double @var{x})
+This function sets all the elements of the vector @var{v} to the value
+@var{x}.
+@end deftypefun
+
+@deftypefun void gsl_vector_set_zero (gsl_vector * @var{v})
+This function sets all the elements of the vector @var{v} to zero.
+@end deftypefun
+
+@deftypefun int gsl_vector_set_basis (gsl_vector * @var{v}, size_t @var{i})
+This function makes a basis vector by setting all the elements of the
+vector @var{v} to zero except for the @var{i}-th element which is set to
+one.
+@end deftypefun
+
+@node Reading and writing vectors
+@subsection Reading and writing vectors
+
+The library provides functions for reading and writing vectors to a file
+as binary data or formatted text.
+
+@deftypefun int gsl_vector_fwrite (FILE * @var{stream}, const gsl_vector * @var{v})
+This function writes the elements of the vector @var{v} to the stream
+@var{stream} in binary format. The return value is 0 for success and
+@code{GSL_EFAILED} if there was a problem writing to the file. Since the
+data is written in the native binary format it may not be portable
+between different architectures.
+@end deftypefun
+
+@deftypefun int gsl_vector_fread (FILE * @var{stream}, gsl_vector * @var{v})
+This function reads into the vector @var{v} from the open stream
+@var{stream} in binary format. The vector @var{v} must be preallocated
+with the correct length since the function uses the size of @var{v} to
+determine how many bytes to read. The return value is 0 for success and
+@code{GSL_EFAILED} if there was a problem reading from the file. The
+data is assumed to have been written in the native binary format on the
+same architecture.
+@end deftypefun
+
+@deftypefun int gsl_vector_fprintf (FILE * @var{stream}, const gsl_vector * @var{v}, const char * @var{format})
+This function writes the elements of the vector @var{v} line-by-line to
+the stream @var{stream} using the format specifier @var{format}, which
+should be one of the @code{%g}, @code{%e} or @code{%f} formats for
+floating point numbers and @code{%d} for integers. The function returns
+0 for success and @code{GSL_EFAILED} if there was a problem writing to
+the file.
+@end deftypefun
+
+@deftypefun int gsl_vector_fscanf (FILE * @var{stream}, gsl_vector * @var{v})
+This function reads formatted data from the stream @var{stream} into the
+vector @var{v}. The vector @var{v} must be preallocated with the correct
+length since the function uses the size of @var{v} to determine how many
+numbers to read. The function returns 0 for success and
+@code{GSL_EFAILED} if there was a problem reading from the file.
+@end deftypefun
+
+@node Vector views
+@subsection Vector views
+
+In addition to creating vectors from slices of blocks it is also
+possible to slice vectors and create vector views. For example, a
+subvector of another vector can be described with a view, or two views
+can be made which provide access to the even and odd elements of a
+vector.
+
+A vector view is a temporary object, stored on the stack, which can be
+used to operate on a subset of vector elements. Vector views can be
+defined for both constant and non-constant vectors, using separate types
+that preserve constness. A vector view has the type
+@code{gsl_vector_view} and a constant vector view has the type
+@code{gsl_vector_const_view}. In both cases the elements of the view
+can be accessed as a @code{gsl_vector} using the @code{vector} component
+of the view object. A pointer to a vector of type @code{gsl_vector *}
+or @code{const gsl_vector *} can be obtained by taking the address of
+this component with the @code{&} operator.
+
+When using this pointer it is important to ensure that the view itself
+remains in scope---the simplest way to do so is by always writing the
+pointer as @code{&}@var{view}@code{.vector}, and never storing this value
+in another variable.
+
+@deftypefun gsl_vector_view gsl_vector_subvector (gsl_vector * @var{v}, size_t @var{offset}, size_t @var{n})
+@deftypefunx {gsl_vector_const_view} gsl_vector_const_subvector (const gsl_vector * @var{v}, size_t @var{offset}, size_t @var{n})
+These functions return a vector view of a subvector of another vector
+@var{v}. The start of the new vector is offset by @var{offset} elements
+from the start of the original vector. The new vector has @var{n}
+elements. Mathematically, the @var{i}-th element of the new vector
+@var{v'} is given by,
+
+@example
+v'(i) = v->data[(offset + i)*v->stride]
+@end example
+
+@noindent
+where the index @var{i} runs from 0 to @code{n-1}.
+
+The @code{data} pointer of the returned vector struct is set to null if
+the combined parameters (@var{offset},@var{n}) overrun the end of the
+original vector.
+
+The new vector is only a view of the block underlying the original
+vector, @var{v}. The block containing the elements of @var{v} is not
+owned by the new vector. When the view goes out of scope the original
+vector @var{v} and its block will continue to exist. The original
+memory can only be deallocated by freeing the original vector. Of
+course, the original vector should not be deallocated while the view is
+still in use.
+
+The function @code{gsl_vector_const_subvector} is equivalent to
+@code{gsl_vector_subvector} but can be used for vectors which are
+declared @code{const}.
+@end deftypefun
+
+
+@deftypefun gsl_vector_view gsl_vector_subvector_with_stride (gsl_vector * @var{v}, size_t @var{offset}, size_t @var{stride}, size_t @var{n})
+@deftypefunx {gsl_vector_const_view} gsl_vector_const_subvector_with_stride (const gsl_vector * @var{v}, size_t @var{offset}, size_t @var{stride}, size_t @var{n})
+These functions return a vector view of a subvector of another vector
+@var{v} with an additional stride argument. The subvector is formed in
+the same way as for @code{gsl_vector_subvector} but the new vector has
+@var{n} elements with a step-size of @var{stride} from one element to
+the next in the original vector. Mathematically, the @var{i}-th element
+of the new vector @var{v'} is given by,
+
+@example
+v'(i) = v->data[(offset + i*stride)*v->stride]
+@end example
+
+@noindent
+where the index @var{i} runs from 0 to @code{n-1}.
+
+Note that subvector views give direct access to the underlying elements
+of the original vector. For example, the following code will zero the
+even elements of the vector @code{v} of length @code{n}, while leaving the
+odd elements untouched,
+
+@example
+gsl_vector_view v_even
+ = gsl_vector_subvector_with_stride (v, 0, 2, n/2);
+gsl_vector_set_zero (&v_even.vector);
+@end example
+
+@noindent
+A vector view can be passed to any subroutine which takes a vector
+argument just as a directly allocated vector would be, using
+@code{&}@var{view}@code{.vector}. For example, the following code
+computes the norm of the odd elements of @code{v} using the @sc{blas}
+routine @sc{dnrm2},
+
+@example
+gsl_vector_view v_odd
+ = gsl_vector_subvector_with_stride (v, 1, 2, n/2);
+double r = gsl_blas_dnrm2 (&v_odd.vector);
+@end example
+
+The function @code{gsl_vector_const_subvector_with_stride} is equivalent
+to @code{gsl_vector_subvector_with_stride} but can be used for vectors
+which are declared @code{const}.
+@end deftypefun
+
+@deftypefun gsl_vector_view gsl_vector_complex_real (gsl_vector_complex * @var{v})
+@deftypefunx {gsl_vector_const_view} gsl_vector_complex_const_real (const gsl_vector_complex * @var{v})
+These functions return a vector view of the real parts of the complex
+vector @var{v}.
+
+The function @code{gsl_vector_complex_const_real} is equivalent to
+@code{gsl_vector_complex_real} but can be used for vectors which are
+declared @code{const}.
+@end deftypefun
+
+@deftypefun gsl_vector_view gsl_vector_complex_imag (gsl_vector_complex * @var{v})
+@deftypefunx {gsl_vector_const_view} gsl_vector_complex_const_imag (const gsl_vector_complex * @var{v})
+These functions return a vector view of the imaginary parts of the
+complex vector @var{v}.
+
+The function @code{gsl_vector_complex_const_imag} is equivalent to
+@code{gsl_vector_complex_imag} but can be used for vectors which are
+declared @code{const}.
+@end deftypefun
+
+@deftypefun gsl_vector_view gsl_vector_view_array (double * @var{base}, size_t @var{n})
+@deftypefunx {gsl_vector_const_view} gsl_vector_const_view_array (const double * @var{base}, size_t @var{n})
+These functions return a vector view of an array. The start of the new
+vector is given by @var{base} and has @var{n} elements. Mathematically,
+the @var{i}-th element of the new vector @var{v'} is given by,
+
+@example
+v'(i) = base[i]
+@end example
+
+@noindent
+where the index @var{i} runs from 0 to @code{n-1}.
+
+The array containing the elements of @var{v} is not owned by the new
+vector view. When the view goes out of scope the original array will
+continue to exist. The original memory can only be deallocated by
+freeing the original pointer @var{base}. Of course, the original array
+should not be deallocated while the view is still in use.
+
+The function @code{gsl_vector_const_view_array} is equivalent to
+@code{gsl_vector_view_array} but can be used for arrays which are
+declared @code{const}.
+@end deftypefun
+
+@deftypefun gsl_vector_view gsl_vector_view_array_with_stride (double * @var{base}, size_t @var{stride}, size_t @var{n})
+@deftypefunx gsl_vector_const_view gsl_vector_const_view_array_with_stride (const double * @var{base}, size_t @var{stride}, size_t @var{n})
+These functions return a vector view of an array @var{base} with an
+additional stride argument. The subvector is formed in the same way as
+for @code{gsl_vector_view_array} but the new vector has @var{n} elements
+with a step-size of @var{stride} from one element to the next in the
+original array. Mathematically, the @var{i}-th element of the new
+vector @var{v'} is given by,
+
+@example
+v'(i) = base[i*stride]
+@end example
+
+@noindent
+where the index @var{i} runs from 0 to @code{n-1}.
+
+Note that the view gives direct access to the underlying elements of the
+original array. A vector view can be passed to any subroutine which
+takes a vector argument just as a directly allocated vector would be,
+using @code{&}@var{view}@code{.vector}.
+
+The function @code{gsl_vector_const_view_array_with_stride} is
+equivalent to @code{gsl_vector_view_array_with_stride} but can be used
+for arrays which are declared @code{const}.
+@end deftypefun
+
+
+@comment @node Modifying subvector views
+@comment @subsection Modifying subvector views
+@comment
+@comment @deftypefun int gsl_vector_view_from_vector (gsl_vector * @var{v}, gsl_vector * @var{base}, size_t @var{offset}, size_t @var{n}, size_t @var{stride})
+@comment This function modifies and existing vector view @var{v} to form a new
+@comment view of a vector @var{base}, starting from element @var{offset}. The
+@comment vector has @var{n} elements separated by stride @var{stride}. Any
+@comment existing view in @var{v} will be lost as a result of this function.
+@comment @end deftypefun
+@comment
+@comment @deftypefun int gsl_vector_view_from_array (gsl_vector * @var{v}, double * @var{base}, size_t @var{offset}, size_t @var{n}, size_t @var{stride})
+@comment This function modifies and existing vector view @var{v} to form a new
+@comment view of an array @var{base}, starting from element @var{offset}. The
+@comment vector has @var{n} elements separated by stride @var{stride}. Any
+@comment existing view in @var{v} will be lost as a result of this function.
+@comment @end deftypefun
+
+@comment @deftypefun {gsl_vector *} gsl_vector_alloc_from_block (gsl_block * @var{b}, size_t @var{offset}, size_t @var{n}, size_t @var{stride})
+@comment This function creates a vector as a slice of an existing block @var{b},
+@comment returning a pointer to a newly initialized vector struct. The start of
+@comment the vector is offset by @var{offset} elements from the start of the
+@comment block. The vector has @var{n} elements, with a step-size of @var{stride}
+@comment from one element to the next. Mathematically, the @var{i}-th element of
+@comment the vector is given by,
+@comment
+@comment @example
+@comment v(i) = b->data[offset + i*stride]
+@comment @end example
+@comment @noindent
+@comment where the index @var{i} runs from 0 to @code{n-1}.
+@comment
+@comment A null pointer is returned if the combined parameters
+@comment (@var{offset},@var{n},@var{stride}) overrun the end of the block or if
+@comment insufficient memory is available to store the vector.
+@comment
+@comment The vector is only a view of the block @var{b}, and the block is not
+@comment owned by the vector. When the vector is deallocated the block @var{b}
+@comment will continue to exist. This memory can only be deallocated by freeing
+@comment the block itself. Of course, this block should not be deallocated while
+@comment the vector is still in use.
+@comment @end deftypefun
+@comment
+@comment @deftypefun {gsl_vector *} gsl_vector_alloc_from_vector (gsl_vector * @var{v}, size_t @var{offset}, size_t @var{n}, size_t @var{stride})
+@comment This function creates a vector as a slice of another vector @var{v},
+@comment returning a pointer to a newly initialized vector struct. The start of
+@comment the new vector is offset by @var{offset} elements from the start of the
+@comment original vector. The new vector has @var{n} elements, with a step-size
+@comment of @var{stride} from one element to the next in the original vector.
+@comment Mathematically, the @var{i}-th element of the new vector @var{v'} is
+@comment given by,
+@comment
+@comment @example
+@comment v'(i) = v->data[(offset + i*stride)*v->stride]
+@comment @end example
+@comment @noindent
+@comment where the index @var{i} runs from 0 to @code{n-1}.
+@comment
+@comment A null pointer is returned if the combined parameters
+@comment (@var{offset},@var{n},@var{stride}) overrun the end of the original
+@comment vector or if insufficient memory is available store the new vector.
+@comment
+@comment The new vector is only a view of the block underlying the original
+@comment vector, @var{v}. The block is not owned by the new vector. When the new
+@comment vector is deallocated the original vector @var{v} and its block will
+@comment continue to exist. The original memory can only be deallocated by
+@comment freeing the original vector. Of course, the original vector should not
+@comment be deallocated while the new vector is still in use.
+@comment @end deftypefun
+
+@node Copying vectors
+@subsection Copying vectors
+
+Common operations on vectors such as addition and multiplication are
+available in the @sc{blas} part of the library (@pxref{BLAS
+Support}). However, it is useful to have a small number of utility
+functions which do not require the full @sc{blas} code. The following
+functions fall into this category.
+
+@deftypefun int gsl_vector_memcpy (gsl_vector * @var{dest}, const gsl_vector * @var{src})
+This function copies the elements of the vector @var{src} into the
+vector @var{dest}. The two vectors must have the same length.
+@end deftypefun
+
+@deftypefun int gsl_vector_swap (gsl_vector * @var{v}, gsl_vector * @var{w})
+This function exchanges the elements of the vectors @var{v} and @var{w}
+by copying. The two vectors must have the same length.
+@end deftypefun
+
+
+@node Exchanging elements
+@subsection Exchanging elements
+
+The following function can be used to exchange, or permute, the elements
+of a vector.
+
+@deftypefun int gsl_vector_swap_elements (gsl_vector * @var{v}, size_t @var{i}, size_t @var{j})
+This function exchanges the @var{i}-th and @var{j}-th elements of the
+vector @var{v} in-place.
+@end deftypefun
+
+@deftypefun int gsl_vector_reverse (gsl_vector * @var{v})
+This function reverses the order of the elements of the vector @var{v}.
+@end deftypefun
+
+
+@node Vector operations
+@subsection Vector operations
+
+The following operations are only defined for real vectors.
+
+@deftypefun int gsl_vector_add (gsl_vector * @var{a}, const gsl_vector * @var{b})
+This function adds the elements of vector @var{b} to the elements of
+vector @var{a}, @math{a'_i = a_i + b_i}. The two vectors must have the
+same length.
+@end deftypefun
+
+@deftypefun int gsl_vector_sub (gsl_vector * @var{a}, const gsl_vector * @var{b})
+This function subtracts the elements of vector @var{b} from the elements of
+vector @var{a}, @math{a'_i = a_i - b_i}. The two vectors must have the
+same length.
+@end deftypefun
+
+@deftypefun int gsl_vector_mul (gsl_vector * @var{a}, const gsl_vector * @var{b})
+This function multiplies the elements of vector @var{a} by the elements of
+vector @var{b}, @math{a'_i = a_i * b_i}. The two vectors must have the
+same length.
+@end deftypefun
+
+@deftypefun int gsl_vector_div (gsl_vector * @var{a}, const gsl_vector * @var{b})
+This function divides the elements of vector @var{a} by the elements of
+vector @var{b}, @math{a'_i = a_i / b_i}. The two vectors must have the
+same length.
+@end deftypefun
+
+@deftypefun int gsl_vector_scale (gsl_vector * @var{a}, const double @var{x})
+This function multiplies the elements of vector @var{a} by the constant
+factor @var{x}, @math{a'_i = x a_i}.
+@end deftypefun
+
+@deftypefun int gsl_vector_add_constant (gsl_vector * @var{a}, const double @var{x})
+This function adds the constant value @var{x} to the elements of the
+vector @var{a}, @math{a'_i = a_i + x}.
+@end deftypefun
+
+@node Finding maximum and minimum elements of vectors
+@subsection Finding maximum and minimum elements of vectors
+
+@deftypefun double gsl_vector_max (const gsl_vector * @var{v})
+This function returns the maximum value in the vector @var{v}.
+@end deftypefun
+
+@deftypefun double gsl_vector_min (const gsl_vector * @var{v})
+This function returns the minimum value in the vector @var{v}.
+@end deftypefun
+
+@deftypefun void gsl_vector_minmax (const gsl_vector * @var{v}, double * @var{min_out}, double * @var{max_out})
+This function returns the minimum and maximum values in the vector
+@var{v}, storing them in @var{min_out} and @var{max_out}.
+@end deftypefun
+
+@deftypefun size_t gsl_vector_max_index (const gsl_vector * @var{v})
+This function returns the index of the maximum value in the vector @var{v}.
+When there are several equal maximum elements then the lowest index is
+returned.
+@end deftypefun
+
+@deftypefun size_t gsl_vector_min_index (const gsl_vector * @var{v})
+This function returns the index of the minimum value in the vector @var{v}.
+When there are several equal minimum elements then the lowest index is
+returned.
+@end deftypefun
+
+@deftypefun void gsl_vector_minmax_index (const gsl_vector * @var{v}, size_t * @var{imin}, size_t * @var{imax})
+This function returns the indices of the minimum and maximum values in
+the vector @var{v}, storing them in @var{imin} and @var{imax}. When
+there are several equal minimum or maximum elements then the lowest
+indices are returned.
+@end deftypefun
+
+@node Vector properties
+@subsection Vector properties
+
+@deftypefun int gsl_vector_isnull (const gsl_vector * @var{v})
+@deftypefunx int gsl_vector_ispos (const gsl_vector * @var{v})
+@deftypefunx int gsl_vector_isneg (const gsl_vector * @var{v})
+These functions return 1 if all the elements of the vector @var{v}
+are zero, strictly positive, or strictly negative respectively, and 0
+otherwise. To test for a non-negative vector, use the expression
+@code{!gsl_vector_isneg(v)}.
+@end deftypefun
+
+@node Example programs for vectors
+@subsection Example programs for vectors
+
+This program shows how to allocate, initialize and read from a vector
+using the functions @code{gsl_vector_alloc}, @code{gsl_vector_set} and
+@code{gsl_vector_get}.
+
+@example
+@verbatiminclude examples/vector.c
+@end example
+@comment
+
+@noindent
+Here is the output from the program. The final loop attempts to read
+outside the range of the vector @code{v}, and the error is trapped by
+the range-checking code in @code{gsl_vector_get}.
+
+@example
+$ ./a.out
+v_0 = 1.23
+v_1 = 2.23
+v_2 = 3.23
+gsl: vector_source.c:12: ERROR: index out of range
+Default GSL error handler invoked.
+Aborted (core dumped)
+@end example
+@comment
+
+@noindent
+The next program shows how to write a vector to a file.
+
+@example
+@verbatiminclude examples/vectorw.c
+@end example
+@comment
+
+@noindent
+After running this program the file @file{test.dat} should contain the
+elements of @code{v}, written using the format specifier
+@code{%.5g}. The vector could then be read back in using the function
+@code{gsl_vector_fscanf (f, v)} as follows:
+
+@example
+@verbatiminclude examples/vectorr.c
+@end example
+
+
+@node Matrices
+@section Matrices
+@cindex matrices
+@cindex physical dimension, matrices
+@cindex trailing dimension, matrices
+@cindex leading dimension, matrices
+
+Matrices are defined by a @code{gsl_matrix} structure which describes a
+generalized slice of a block. Like a vector it represents a set of
+elements in an area of memory, but uses two indices instead of one.
+
+The @code{gsl_matrix} structure contains six components, the two
+dimensions of the matrix, a physical dimension, a pointer to the memory
+where the elements of the matrix are stored, @var{data}, a pointer to
+the block owned by the matrix @var{block}, if any, and an ownership
+flag, @var{owner}. The physical dimension determines the memory layout
+and can differ from the matrix dimension to allow the use of
+submatrices. The @code{gsl_matrix} structure is very simple and looks
+like this,
+
+@example
+typedef struct
+@{
+ size_t size1;
+ size_t size2;
+ size_t tda;
+ double * data;
+ gsl_block * block;
+ int owner;
+@} gsl_matrix;
+@end example
+@comment
+
+@noindent
+Matrices are stored in row-major order, meaning that each row of
+elements forms a contiguous block in memory. This is the standard
+``C-language ordering'' of two-dimensional arrays. Note that @sc{fortran}
+stores arrays in column-major order. The number of rows is @var{size1}.
+The range of valid row indices runs from 0 to @code{size1-1}. Similarly
+@var{size2} is the number of columns. The range of valid column indices
+runs from 0 to @code{size2-1}. The physical row dimension @var{tda}, or
+@dfn{trailing dimension}, specifies the size of a row of the matrix as
+laid out in memory.
+
+For example, in the following matrix @var{size1} is 3, @var{size2} is 4,
+and @var{tda} is 8. The physical memory layout of the matrix begins in
+the top left hand-corner and proceeds from left to right along each row
+in turn.
+
+@example
+@group
+00 01 02 03 XX XX XX XX
+10 11 12 13 XX XX XX XX
+20 21 22 23 XX XX XX XX
+@end group
+@end example
+
+@noindent
+Each unused memory location is represented by ``@code{XX}''. The
+pointer @var{data} gives the location of the first element of the matrix
+in memory. The pointer @var{block} stores the location of the memory
+block in which the elements of the matrix are located (if any). If the
+matrix owns this block then the @var{owner} field is set to one and the
+block will be deallocated when the matrix is freed. If the matrix is
+only a slice of a block owned by another object then the @var{owner} field is
+zero and any underlying block will not be freed.
+
+The functions for allocating and accessing matrices are defined in
+@file{gsl_matrix.h}
+
+@menu
+* Matrix allocation::
+* Accessing matrix elements::
+* Initializing matrix elements::
+* Reading and writing matrices::
+* Matrix views::
+* Creating row and column views::
+* Copying matrices::
+* Copying rows and columns::
+* Exchanging rows and columns::
+* Matrix operations::
+* Finding maximum and minimum elements of matrices::
+* Matrix properties::
+* Example programs for matrices::
+@end menu
+
+@node Matrix allocation
+@subsection Matrix allocation
+
+The functions for allocating memory to a matrix follow the style of
+@code{malloc} and @code{free}. They also perform their own error
+checking. If there is insufficient memory available to allocate a vector
+then the functions call the GSL error handler (with an error number of
+@code{GSL_ENOMEM}) in addition to returning a null pointer. Thus if you
+use the library error handler to abort your program then it isn't
+necessary to check every @code{alloc}.
+
+@deftypefun {gsl_matrix *} gsl_matrix_alloc (size_t @var{n1}, size_t @var{n2})
+This function creates a matrix of size @var{n1} rows by @var{n2}
+columns, returning a pointer to a newly initialized matrix struct. A new
+block is allocated for the elements of the matrix, and stored in the
+@var{block} component of the matrix struct. The block is ``owned'' by the
+matrix, and will be deallocated when the matrix is deallocated.
+@end deftypefun
+
+@deftypefun {gsl_matrix *} gsl_matrix_calloc (size_t @var{n1}, size_t @var{n2})
+This function allocates memory for a matrix of size @var{n1} rows by
+@var{n2} columns and initializes all the elements of the matrix to zero.
+@end deftypefun
+
+@deftypefun void gsl_matrix_free (gsl_matrix * @var{m})
+This function frees a previously allocated matrix @var{m}. If the
+matrix was created using @code{gsl_matrix_alloc} then the block
+underlying the matrix will also be deallocated. If the matrix has
+been created from another object then the memory is still owned by
+that object and will not be deallocated. The matrix @var{m} must be a
+valid matrix object (a null pointer is not allowed).
+@end deftypefun
+
+@node Accessing matrix elements
+@subsection Accessing matrix elements
+@cindex matrices, range-checking
+@cindex range-checking for matrices
+
+The functions for accessing the elements of a matrix use the same range
+checking system as vectors. You can turn off range checking by recompiling
+your program with the preprocessor definition
+@code{GSL_RANGE_CHECK_OFF}.
+
+The elements of the matrix are stored in ``C-order'', where the second
+index moves continuously through memory. More precisely, the element
+accessed by the function @code{gsl_matrix_get(m,i,j)} and
+@code{gsl_matrix_set(m,i,j,x)} is
+
+@example
+m->data[i * m->tda + j]
+@end example
+@comment
+
+@noindent
+where @var{tda} is the physical row-length of the matrix.
+
+@deftypefun double gsl_matrix_get (const gsl_matrix * @var{m}, size_t @var{i}, size_t @var{j})
+This function returns the @math{(i,j)}-th element of a matrix
+@var{m}. If @var{i} or @var{j} lie outside the allowed range of 0 to
+@math{@var{n1}-1} and 0 to @math{@var{n2}-1} then the error handler is invoked and 0
+is returned.
+@end deftypefun
+
+@deftypefun void gsl_matrix_set (gsl_matrix * @var{m}, size_t @var{i}, size_t @var{j}, double @var{x})
+This function sets the value of the @math{(i,j)}-th element of a
+matrix @var{m} to @var{x}. If @var{i} or @var{j} lies outside the
+allowed range of 0 to @math{@var{n1}-1} and 0 to @math{@var{n2}-1} then the error
+handler is invoked.
+@end deftypefun
+
+@deftypefun {double *} gsl_matrix_ptr (gsl_matrix * @var{m}, size_t @var{i}, size_t @var{j})
+@deftypefunx {const double *} gsl_matrix_const_ptr (const gsl_matrix * @var{m}, size_t @var{i}, size_t @var{j})
+These functions return a pointer to the @math{(i,j)}-th element of a
+matrix @var{m}. If @var{i} or @var{j} lie outside the allowed range of
+0 to @math{@var{n1}-1} and 0 to @math{@var{n2}-1} then the error handler is invoked
+and a null pointer is returned.
+@end deftypefun
+
+@node Initializing matrix elements
+@subsection Initializing matrix elements
+@cindex matrices, initializing
+@cindex initializing matrices
+@cindex identity matrix
+@cindex matrix, identity
+@cindex zero matrix
+@cindex matrix, zero
+@cindex constant matrix
+@cindex matrix, constant
+
+@deftypefun void gsl_matrix_set_all (gsl_matrix * @var{m}, double @var{x})
+This function sets all the elements of the matrix @var{m} to the value
+@var{x}.
+@end deftypefun
+
+@deftypefun void gsl_matrix_set_zero (gsl_matrix * @var{m})
+This function sets all the elements of the matrix @var{m} to zero.
+@end deftypefun
+
+@deftypefun void gsl_matrix_set_identity (gsl_matrix * @var{m})
+This function sets the elements of the matrix @var{m} to the
+corresponding elements of the identity matrix, @math{m(i,j) =
+\delta(i,j)}, i.e. a unit diagonal with all off-diagonal elements zero.
+This applies to both square and rectangular matrices.
+@end deftypefun
+
+@node Reading and writing matrices
+@subsection Reading and writing matrices
+
+The library provides functions for reading and writing matrices to a file
+as binary data or formatted text.
+
+@deftypefun int gsl_matrix_fwrite (FILE * @var{stream}, const gsl_matrix * @var{m})
+This function writes the elements of the matrix @var{m} to the stream
+@var{stream} in binary format. The return value is 0 for success and
+@code{GSL_EFAILED} if there was a problem writing to the file. Since the
+data is written in the native binary format it may not be portable
+between different architectures.
+@end deftypefun
+
+@deftypefun int gsl_matrix_fread (FILE * @var{stream}, gsl_matrix * @var{m})
+This function reads into the matrix @var{m} from the open stream
+@var{stream} in binary format. The matrix @var{m} must be preallocated
+with the correct dimensions since the function uses the size of @var{m} to
+determine how many bytes to read. The return value is 0 for success and
+@code{GSL_EFAILED} if there was a problem reading from the file. The
+data is assumed to have been written in the native binary format on the
+same architecture.
+@end deftypefun
+
+@deftypefun int gsl_matrix_fprintf (FILE * @var{stream}, const gsl_matrix * @var{m}, const char * @var{format})
+This function writes the elements of the matrix @var{m} line-by-line to
+the stream @var{stream} using the format specifier @var{format}, which
+should be one of the @code{%g}, @code{%e} or @code{%f} formats for
+floating point numbers and @code{%d} for integers. The function returns
+0 for success and @code{GSL_EFAILED} if there was a problem writing to
+the file.
+@end deftypefun
+
+@deftypefun int gsl_matrix_fscanf (FILE * @var{stream}, gsl_matrix * @var{m})
+This function reads formatted data from the stream @var{stream} into the
+matrix @var{m}. The matrix @var{m} must be preallocated with the correct
+dimensions since the function uses the size of @var{m} to determine how many
+numbers to read. The function returns 0 for success and
+@code{GSL_EFAILED} if there was a problem reading from the file.
+@end deftypefun
+
+@node Matrix views
+@subsection Matrix views
+
+A matrix view is a temporary object, stored on the stack, which can be
+used to operate on a subset of matrix elements. Matrix views can be
+defined for both constant and non-constant matrices using separate types
+that preserve constness. A matrix view has the type
+@code{gsl_matrix_view} and a constant matrix view has the type
+@code{gsl_matrix_const_view}. In both cases the elements of the view
+can by accessed using the @code{matrix} component of the view object. A
+pointer @code{gsl_matrix *} or @code{const gsl_matrix *} can be obtained
+by taking the address of the @code{matrix} component with the @code{&}
+operator. In addition to matrix views it is also possible to create
+vector views of a matrix, such as row or column views.
+
+@deftypefun gsl_matrix_view gsl_matrix_submatrix (gsl_matrix * @var{m}, size_t @var{k1}, size_t @var{k2}, size_t @var{n1}, size_t @var{n2})
+@deftypefunx gsl_matrix_const_view gsl_matrix_const_submatrix (const gsl_matrix * @var{m}, size_t @var{k1}, size_t @var{k2}, size_t @var{n1}, size_t @var{n2})
+These functions return a matrix view of a submatrix of the matrix
+@var{m}. The upper-left element of the submatrix is the element
+(@var{k1},@var{k2}) of the original matrix. The submatrix has @var{n1}
+rows and @var{n2} columns. The physical number of columns in memory
+given by @var{tda} is unchanged. Mathematically, the
+@math{(i,j)}-th element of the new matrix is given by,
+
+@example
+m'(i,j) = m->data[(k1*m->tda + k2) + i*m->tda + j]
+@end example
+
+@noindent
+where the index @var{i} runs from 0 to @code{n1-1} and the index @var{j}
+runs from 0 to @code{n2-1}.
+
+The @code{data} pointer of the returned matrix struct is set to null if
+the combined parameters (@var{i},@var{j},@var{n1},@var{n2},@var{tda})
+overrun the ends of the original matrix.
+
+The new matrix view is only a view of the block underlying the existing
+matrix, @var{m}. The block containing the elements of @var{m} is not
+owned by the new matrix view. When the view goes out of scope the
+original matrix @var{m} and its block will continue to exist. The
+original memory can only be deallocated by freeing the original matrix.
+Of course, the original matrix should not be deallocated while the view
+is still in use.
+
+The function @code{gsl_matrix_const_submatrix} is equivalent to
+@code{gsl_matrix_submatrix} but can be used for matrices which are
+declared @code{const}.
+@end deftypefun
+
+
+@deftypefun gsl_matrix_view gsl_matrix_view_array (double * @var{base}, size_t @var{n1}, size_t @var{n2})
+@deftypefunx gsl_matrix_const_view gsl_matrix_const_view_array (const double * @var{base}, size_t @var{n1}, size_t @var{n2})
+These functions return a matrix view of the array @var{base}. The
+matrix has @var{n1} rows and @var{n2} columns. The physical number of
+columns in memory is also given by @var{n2}. Mathematically, the
+@math{(i,j)}-th element of the new matrix is given by,
+
+@example
+m'(i,j) = base[i*n2 + j]
+@end example
+
+@noindent
+where the index @var{i} runs from 0 to @code{n1-1} and the index @var{j}
+runs from 0 to @code{n2-1}.
+
+The new matrix is only a view of the array @var{base}. When the view
+goes out of scope the original array @var{base} will continue to exist.
+The original memory can only be deallocated by freeing the original
+array. Of course, the original array should not be deallocated while
+the view is still in use.
+
+The function @code{gsl_matrix_const_view_array} is equivalent to
+@code{gsl_matrix_view_array} but can be used for matrices which are
+declared @code{const}.
+@end deftypefun
+
+
+@deftypefun gsl_matrix_view gsl_matrix_view_array_with_tda (double * @var{base}, size_t @var{n1}, size_t @var{n2}, size_t @var{tda})
+@deftypefunx gsl_matrix_const_view gsl_matrix_const_view_array_with_tda (const double * @var{base}, size_t @var{n1}, size_t @var{n2}, size_t @var{tda})
+These functions return a matrix view of the array @var{base} with a
+physical number of columns @var{tda} which may differ from the corresponding
+dimension of the matrix. The matrix has @var{n1} rows and @var{n2}
+columns, and the physical number of columns in memory is given by
+@var{tda}. Mathematically, the @math{(i,j)}-th element of the new
+matrix is given by,
+
+@example
+m'(i,j) = base[i*tda + j]
+@end example
+
+@noindent
+where the index @var{i} runs from 0 to @code{n1-1} and the index @var{j}
+runs from 0 to @code{n2-1}.
+
+The new matrix is only a view of the array @var{base}. When the view
+goes out of scope the original array @var{base} will continue to exist.
+The original memory can only be deallocated by freeing the original
+array. Of course, the original array should not be deallocated while
+the view is still in use.
+
+The function @code{gsl_matrix_const_view_array_with_tda} is equivalent
+to @code{gsl_matrix_view_array_with_tda} but can be used for matrices
+which are declared @code{const}.
+@end deftypefun
+
+@deftypefun gsl_matrix_view gsl_matrix_view_vector (gsl_vector * @var{v}, size_t @var{n1}, size_t @var{n2})
+@deftypefunx gsl_matrix_const_view gsl_matrix_const_view_vector (const gsl_vector * @var{v}, size_t @var{n1}, size_t @var{n2})
+These functions return a matrix view of the vector @var{v}. The matrix
+has @var{n1} rows and @var{n2} columns. The vector must have unit
+stride. The physical number of columns in memory is also given by
+@var{n2}. Mathematically, the @math{(i,j)}-th element of the new
+matrix is given by,
+
+@example
+m'(i,j) = v->data[i*n2 + j]
+@end example
+
+@noindent
+where the index @var{i} runs from 0 to @code{n1-1} and the index @var{j}
+runs from 0 to @code{n2-1}.
+
+The new matrix is only a view of the vector @var{v}. When the view
+goes out of scope the original vector @var{v} will continue to exist.
+The original memory can only be deallocated by freeing the original
+vector. Of course, the original vector should not be deallocated while
+the view is still in use.
+
+The function @code{gsl_matrix_const_view_vector} is equivalent to
+@code{gsl_matrix_view_vector} but can be used for matrices which are
+declared @code{const}.
+@end deftypefun
+
+
+@deftypefun gsl_matrix_view gsl_matrix_view_vector_with_tda (gsl_vector * @var{v}, size_t @var{n1}, size_t @var{n2}, size_t @var{tda})
+@deftypefunx gsl_matrix_const_view gsl_matrix_const_view_vector_with_tda (const gsl_vector * @var{v}, size_t @var{n1}, size_t @var{n2}, size_t @var{tda})
+These functions return a matrix view of the vector @var{v} with a
+physical number of columns @var{tda} which may differ from the
+corresponding matrix dimension. The vector must have unit stride. The
+matrix has @var{n1} rows and @var{n2} columns, and the physical number
+of columns in memory is given by @var{tda}. Mathematically, the
+@math{(i,j)}-th element of the new matrix is given by,
+
+@example
+m'(i,j) = v->data[i*tda + j]
+@end example
+
+@noindent
+where the index @var{i} runs from 0 to @code{n1-1} and the index @var{j}
+runs from 0 to @code{n2-1}.
+
+The new matrix is only a view of the vector @var{v}. When the view
+goes out of scope the original vector @var{v} will continue to exist.
+The original memory can only be deallocated by freeing the original
+vector. Of course, the original vector should not be deallocated while
+the view is still in use.
+
+The function @code{gsl_matrix_const_view_vector_with_tda} is equivalent
+to @code{gsl_matrix_view_vector_with_tda} but can be used for matrices
+which are declared @code{const}.
+@end deftypefun
+
+
+@comment @node Modifying matrix views
+@comment @subsection Modifying matrix views
+@comment
+@comment @deftypefun int gsl_matrix_view_from_matrix (gsl_matrix * @var{m}, gsl_matrix * @var{mm}, const size_t @var{k1}, const size_t @var{k2}, const size_t @var{n1}, const size_t @var{n2})
+@comment This function modifies and existing matrix view @var{m} to form a new
+@comment view of a matrix @var{mm}, starting from element (@var{k1},@var{k2}).
+@comment The matrix view has @var{n1} rows and @var{n2} columns. Any existing
+@comment view in @var{m} will be lost as a result of this function.
+@comment @end deftypefun
+@comment
+@comment @deftypefun int gsl_matrix_view_from_vector (gsl_matrix * @var{m}, gsl_vector * @var{v}, const size_t @var{offset}, const size_t @var{n1}, const size_t @var{n2})
+@comment This function modifies and existing matrix view @var{m} to form a new
+@comment view of a vector @var{v}, starting from element @var{offset}. The
+@comment vector has @var{n1} rows and @var{n2} columns. Any
+@comment existing view in @var{m} will be lost as a result of this function.
+@comment @end deftypefun
+@comment
+@comment @deftypefun int gsl_matrix_view_from_array (gsl_matrix * @var{m}, double * @var{base}, const size_t @var{offset}, const size_t @var{n1}, const size_t @var{n2})
+@comment This function modifies and existing matrix view @var{m} to form a new
+@comment view of an array @var{base}, starting from element @var{offset}. The
+@comment matrix has @var{n1} rows and @var{n2} columns. Any
+@comment existing view in @var{m} will be lost as a result of this function.
+@comment @end deftypefun
+@comment
+@comment @deftypefun {gsl_matrix *} gsl_matrix_alloc_from_block (gsl_block * @var{b}, size_t @var{offset}, size_t @var{n1}, size_t @var{n2}, size_t @var{tda})
+@comment This function creates a matrix as a slice of the block @var{b},
+@comment returning a pointer to a newly initialized matrix struct. The start of
+@comment the matrix is offset by @var{offset} elements from the start of the
+@comment block. The matrix has @var{n1} rows and @var{n2} columns, with the
+@comment physical number of columns in memory given by @var{tda}.
+@comment Mathematically, the (@var{i},@var{j})-th element of the matrix is given by,
+@comment
+@comment @example
+@comment m(i,j) = b->data[offset + i*tda + j]
+@comment @end example
+@comment @noindent
+@comment where the index @var{i} runs from 0 to @code{n1-1} and the index @var{j}
+@comment runs from 0 to @code{n2-1}.
+@comment
+@comment A null pointer is returned if the combined parameters
+@comment (@var{offset},@var{n1},@var{n2},@var{tda}) overrun the end of the block
+@comment or if insufficient memory is available to store the matrix.
+@comment
+@comment The matrix is only a view of the block @var{b}, and the block is not
+@comment owned by the matrix. When the matrix is deallocated the block @var{b}
+@comment will continue to exist. This memory can only be deallocated by freeing
+@comment the block itself. Of course, this block should not be deallocated while
+@comment the matrix is still in use.
+@comment @end deftypefun
+@comment
+@comment @deftypefun {gsl_matrix *} gsl_matrix_alloc_from_matrix (gsl_matrix * @var{m}, size_t @var{k1}, size_t @var{k2}, size_t @var{n1}, size_t @var{n2})
+@comment
+@comment This function creates a matrix as a submatrix of the matrix @var{m},
+@comment returning a pointer to a newly initialized matrix struct. The upper-left
+@comment element of the submatrix is the element (@var{k1},@var{k2}) of the
+@comment original matrix. The submatrix has @var{n1} rows and @var{n2} columns.
+@comment The physical number of columns in memory given by @var{tda} is
+@comment unchanged. Mathematically, the (@var{i},@var{j})-th element of the
+@comment new matrix is given by,
+@comment
+@comment @example
+@comment m'(i,j) = m->data[(k1*m->tda + k2) + i*m->tda + j]
+@comment @end example
+@comment @noindent
+@comment where the index @var{i} runs from 0 to @code{n1-1} and the index @var{j}
+@comment runs from 0 to @code{n2-1}.
+@comment
+@comment A null pointer is returned if the combined parameters
+@comment (@var{k1},@var{k2},@var{n1},@var{n2},@var{tda}) overrun the end of the
+@comment original matrix or if insufficient memory is available to store the matrix.
+@comment
+@comment The new matrix is only a view of the block underlying the existing
+@comment matrix, @var{m}. The block is not owned by the new matrix. When the new
+@comment matrix is deallocated the original matrix @var{m} and its block will
+@comment continue to exist. The original memory can only be deallocated by
+@comment freeing the original matrix. Of course, the original matrix should not
+@comment be deallocated while the new matrix is still in use.
+@comment @end deftypefun
+
+@node Creating row and column views
+@subsection Creating row and column views
+
+In general there are two ways to access an object, by reference or by
+copying. The functions described in this section create vector views
+which allow access to a row or column of a matrix by reference.
+Modifying elements of the view is equivalent to modifying the matrix,
+since both the vector view and the matrix point to the same memory
+block.
+
+@deftypefun gsl_vector_view gsl_matrix_row (gsl_matrix * @var{m}, size_t @var{i})
+@deftypefunx {gsl_vector_const_view} gsl_matrix_const_row (const gsl_matrix * @var{m}, size_t @var{i})
+These functions return a vector view of the @var{i}-th row of the matrix
+@var{m}. The @code{data} pointer of the new vector is set to null if
+@var{i} is out of range.
+
+The function @code{gsl_vector_const_row} is equivalent to
+@code{gsl_matrix_row} but can be used for matrices which are declared
+@code{const}.
+@end deftypefun
+
+@deftypefun gsl_vector_view gsl_matrix_column (gsl_matrix * @var{m}, size_t @var{j})
+@deftypefunx {gsl_vector_const_view} gsl_matrix_const_column (const gsl_matrix * @var{m}, size_t @var{j})
+These functions return a vector view of the @var{j}-th column of the
+matrix @var{m}. The @code{data} pointer of the new vector is set to
+null if @var{j} is out of range.
+
+The function @code{gsl_vector_const_column} is equivalent to
+@code{gsl_matrix_column} but can be used for matrices which are declared
+@code{const}.
+@end deftypefun
+
+@cindex matrix diagonal
+@cindex diagonal, of a matrix
+@deftypefun gsl_vector_view gsl_matrix_diagonal (gsl_matrix * @var{m})
+@deftypefunx {gsl_vector_const_view} gsl_matrix_const_diagonal (const gsl_matrix * @var{m})
+These functions returns a vector view of the diagonal of the matrix
+@var{m}. The matrix @var{m} is not required to be square. For a
+rectangular matrix the length of the diagonal is the same as the smaller
+dimension of the matrix.
+
+The function @code{gsl_matrix_const_diagonal} is equivalent to
+@code{gsl_matrix_diagonal} but can be used for matrices which are
+declared @code{const}.
+@end deftypefun
+
+@cindex matrix subdiagonal
+@cindex subdiagonal, of a matrix
+@deftypefun gsl_vector_view gsl_matrix_subdiagonal (gsl_matrix * @var{m}, size_t @var{k})
+@deftypefunx {gsl_vector_const_view} gsl_matrix_const_subdiagonal (const gsl_matrix * @var{m}, size_t @var{k})
+These functions return a vector view of the @var{k}-th subdiagonal of
+the matrix @var{m}. The matrix @var{m} is not required to be square.
+The diagonal of the matrix corresponds to @math{k = 0}.
+
+The function @code{gsl_matrix_const_subdiagonal} is equivalent to
+@code{gsl_matrix_subdiagonal} but can be used for matrices which are
+declared @code{const}.
+@end deftypefun
+
+@cindex matrix superdiagonal
+@cindex superdiagonal, matrix
+@deftypefun gsl_vector_view gsl_matrix_superdiagonal (gsl_matrix * @var{m}, size_t @var{k})
+@deftypefunx {gsl_vector_const_view} gsl_matrix_const_superdiagonal (const gsl_matrix * @var{m}, size_t @var{k})
+These functions return a vector view of the @var{k}-th superdiagonal of
+the matrix @var{m}. The matrix @var{m} is not required to be square. The
+diagonal of the matrix corresponds to @math{k = 0}.
+
+The function @code{gsl_matrix_const_superdiagonal} is equivalent to
+@code{gsl_matrix_superdiagonal} but can be used for matrices which are
+declared @code{const}.
+@end deftypefun
+
+@comment @deftypefun {gsl_vector *} gsl_vector_alloc_row_from_matrix (gsl_matrix * @var{m}, size_t @var{i})
+@comment This function allocates a new @code{gsl_vector} struct which points to
+@comment the @var{i}-th row of the matrix @var{m}.
+@comment @end deftypefun
+@comment
+@comment @deftypefun {gsl_vector *} gsl_vector_alloc_col_from_matrix (gsl_matrix * @var{m}, size_t @var{j})
+@comment This function allocates a new @code{gsl_vector} struct which points to
+@comment the @var{j}-th column of the matrix @var{m}.
+@comment @end deftypefun
+
+@node Copying matrices
+@subsection Copying matrices
+
+@deftypefun int gsl_matrix_memcpy (gsl_matrix * @var{dest}, const gsl_matrix * @var{src})
+This function copies the elements of the matrix @var{src} into the
+matrix @var{dest}. The two matrices must have the same size.
+@end deftypefun
+
+@deftypefun int gsl_matrix_swap (gsl_matrix * @var{m1}, gsl_matrix * @var{m2})
+This function exchanges the elements of the matrices @var{m1} and
+@var{m2} by copying. The two matrices must have the same size.
+@end deftypefun
+
+@node Copying rows and columns
+@subsection Copying rows and columns
+
+The functions described in this section copy a row or column of a matrix
+into a vector. This allows the elements of the vector and the matrix to
+be modified independently. Note that if the matrix and the vector point
+to overlapping regions of memory then the result will be undefined. The
+same effect can be achieved with more generality using
+@code{gsl_vector_memcpy} with vector views of rows and columns.
+
+@deftypefun int gsl_matrix_get_row (gsl_vector * @var{v}, const gsl_matrix * @var{m}, size_t @var{i})
+This function copies the elements of the @var{i}-th row of the matrix
+@var{m} into the vector @var{v}. The length of the vector must be the
+same as the length of the row.
+@end deftypefun
+
+@deftypefun int gsl_matrix_get_col (gsl_vector * @var{v}, const gsl_matrix * @var{m}, size_t @var{j})
+This function copies the elements of the @var{j}-th column of the matrix
+@var{m} into the vector @var{v}. The length of the vector must be the
+same as the length of the column.
+@end deftypefun
+
+@deftypefun int gsl_matrix_set_row (gsl_matrix * @var{m}, size_t @var{i}, const gsl_vector * @var{v})
+This function copies the elements of the vector @var{v} into the
+@var{i}-th row of the matrix @var{m}. The length of the vector must be
+the same as the length of the row.
+@end deftypefun
+
+@deftypefun int gsl_matrix_set_col (gsl_matrix * @var{m}, size_t @var{j}, const gsl_vector * @var{v})
+This function copies the elements of the vector @var{v} into the
+@var{j}-th column of the matrix @var{m}. The length of the vector must be
+the same as the length of the column.
+@end deftypefun
+
+@node Exchanging rows and columns
+@subsection Exchanging rows and columns
+
+The following functions can be used to exchange the rows and columns of
+a matrix.
+
+@deftypefun int gsl_matrix_swap_rows (gsl_matrix * @var{m}, size_t @var{i}, size_t @var{j})
+This function exchanges the @var{i}-th and @var{j}-th rows of the matrix
+@var{m} in-place.
+@end deftypefun
+
+@deftypefun int gsl_matrix_swap_columns (gsl_matrix * @var{m}, size_t @var{i}, size_t @var{j})
+This function exchanges the @var{i}-th and @var{j}-th columns of the
+matrix @var{m} in-place.
+@end deftypefun
+
+@deftypefun int gsl_matrix_swap_rowcol (gsl_matrix * @var{m}, size_t @var{i}, size_t @var{j})
+This function exchanges the @var{i}-th row and @var{j}-th column of the
+matrix @var{m} in-place. The matrix must be square for this operation to
+be possible.
+@end deftypefun
+
+@deftypefun int gsl_matrix_transpose_memcpy (gsl_matrix * @var{dest}, const gsl_matrix * @var{src})
+This function makes the matrix @var{dest} the transpose of the matrix
+@var{src} by copying the elements of @var{src} into @var{dest}. This
+function works for all matrices provided that the dimensions of the matrix
+@var{dest} match the transposed dimensions of the matrix @var{src}.
+@end deftypefun
+
+@deftypefun int gsl_matrix_transpose (gsl_matrix * @var{m})
+This function replaces the matrix @var{m} by its transpose by copying
+the elements of the matrix in-place. The matrix must be square for this
+operation to be possible.
+@end deftypefun
+
+@node Matrix operations
+@subsection Matrix operations
+
+The following operations are defined for real and complex matrices.
+
+@deftypefun int gsl_matrix_add (gsl_matrix * @var{a}, const gsl_matrix * @var{b})
+This function adds the elements of matrix @var{b} to the elements of
+matrix @var{a}, @math{a'(i,j) = a(i,j) + b(i,j)}. The two matrices must have the
+same dimensions.
+@end deftypefun
+
+@deftypefun int gsl_matrix_sub (gsl_matrix * @var{a}, const gsl_matrix * @var{b})
+This function subtracts the elements of matrix @var{b} from the elements of
+matrix @var{a}, @math{a'(i,j) = a(i,j) - b(i,j)}. The two matrices must have the
+same dimensions.
+@end deftypefun
+
+@deftypefun int gsl_matrix_mul_elements (gsl_matrix * @var{a}, const gsl_matrix * @var{b})
+This function multiplies the elements of matrix @var{a} by the elements of
+matrix @var{b}, @math{a'(i,j) = a(i,j) * b(i,j)}. The two matrices must have the
+same dimensions.
+@end deftypefun
+
+@deftypefun int gsl_matrix_div_elements (gsl_matrix * @var{a}, const gsl_matrix * @var{b})
+This function divides the elements of matrix @var{a} by the elements of
+matrix @var{b}, @math{a'(i,j) = a(i,j) / b(i,j)}. The two matrices must have the
+same dimensions.
+@end deftypefun
+
+@deftypefun int gsl_matrix_scale (gsl_matrix * @var{a}, const double @var{x})
+This function multiplies the elements of matrix @var{a} by the constant
+factor @var{x}, @math{a'(i,j) = x a(i,j)}.
+@end deftypefun
+
+@deftypefun int gsl_matrix_add_constant (gsl_matrix * @var{a}, const double @var{x})
+This function adds the constant value @var{x} to the elements of the
+matrix @var{a}, @math{a'(i,j) = a(i,j) + x}.
+@end deftypefun
+
+@node Finding maximum and minimum elements of matrices
+@subsection Finding maximum and minimum elements of matrices
+
+The following operations are only defined for real matrices.
+
+@deftypefun double gsl_matrix_max (const gsl_matrix * @var{m})
+This function returns the maximum value in the matrix @var{m}.
+@end deftypefun
+
+@deftypefun double gsl_matrix_min (const gsl_matrix * @var{m})
+This function returns the minimum value in the matrix @var{m}.
+@end deftypefun
+
+@deftypefun void gsl_matrix_minmax (const gsl_matrix * @var{m}, double * @var{min_out}, double * @var{max_out})
+This function returns the minimum and maximum values in the matrix
+@var{m}, storing them in @var{min_out} and @var{max_out}.
+@end deftypefun
+
+@deftypefun void gsl_matrix_max_index (const gsl_matrix * @var{m}, size_t * @var{imax}, size_t * @var{jmax})
+This function returns the indices of the maximum value in the matrix
+@var{m}, storing them in @var{imax} and @var{jmax}. When there are
+several equal maximum elements then the first element found is returned,
+searching in row-major order.
+@end deftypefun
+
+@deftypefun void gsl_matrix_min_index (const gsl_matrix * @var{m}, size_t * @var{imin}, size_t * @var{jmin})
+This function returns the indices of the minimum value in the matrix
+@var{m}, storing them in @var{imin} and @var{jmin}. When there are
+several equal minimum elements then the first element found is returned,
+searching in row-major order.
+@end deftypefun
+
+@deftypefun void gsl_matrix_minmax_index (const gsl_matrix * @var{m}, size_t * @var{imin}, size_t * @var{jmin}, size_t * @var{imax}, size_t * @var{jmax})
+This function returns the indices of the minimum and maximum values in
+the matrix @var{m}, storing them in (@var{imin},@var{jmin}) and
+(@var{imax},@var{jmax}). When there are several equal minimum or maximum
+elements then the first elements found are returned, searching in
+row-major order.
+@end deftypefun
+
+@node Matrix properties
+@subsection Matrix properties
+
+@deftypefun int gsl_matrix_isnull (const gsl_matrix * @var{m})
+@deftypefunx int gsl_matrix_ispos (const gsl_matrix * @var{m})
+@deftypefunx int gsl_matrix_isneg (const gsl_matrix * @var{m})
+These functions return 1 if all the elements of the matrix @var{m} are
+zero, strictly positive, or strictly negative respectively, and 0
+otherwise. To test for a non-negative matrix, use the expression
+@code{!gsl_matrix_isneg(m)}. To test whether a matrix is
+positive-definite, use the Cholesky decomposition (@pxref{Cholesky Decomposition}).
+@end deftypefun
+
+@node Example programs for matrices
+@subsection Example programs for matrices
+
+The program below shows how to allocate, initialize and read from a matrix
+using the functions @code{gsl_matrix_alloc}, @code{gsl_matrix_set} and
+@code{gsl_matrix_get}.
+
+@example
+@verbatiminclude examples/matrix.c
+@end example
+@comment
+
+@noindent
+Here is the output from the program. The final loop attempts to read
+outside the range of the matrix @code{m}, and the error is trapped by
+the range-checking code in @code{gsl_matrix_get}.
+
+@example
+$ ./a.out
+m(0,0) = 0.23
+m(0,1) = 1.23
+m(0,2) = 2.23
+m(1,0) = 100.23
+m(1,1) = 101.23
+m(1,2) = 102.23
+...
+m(9,2) = 902.23
+gsl: matrix_source.c:13: ERROR: first index out of range
+Default GSL error handler invoked.
+Aborted (core dumped)
+@end example
+@comment
+
+@noindent
+The next program shows how to write a matrix to a file.
+
+@example
+@verbatiminclude examples/matrixw.c
+@end example
+@comment
+
+@noindent
+After running this program the file @file{test.dat} should contain the
+elements of @code{m}, written in binary format. The matrix which is read
+back in using the function @code{gsl_matrix_fread} should be exactly
+equal to the original matrix.
+
+The following program demonstrates the use of vector views. The program
+computes the column norms of a matrix.
+
+@example
+@verbatiminclude examples/vectorview.c
+@end example
+
+@noindent
+Here is the output of the program,
+
+@example
+$ ./a.out
+@verbatiminclude examples/vectorview.out
+@end example
+
+@noindent
+The results can be confirmed using @sc{gnu octave},
+
+@example
+$ octave
+GNU Octave, version 2.0.16.92
+octave> m = sin(0:9)' * ones(1,10)
+ + ones(10,1) * cos(0:9);
+octave> sqrt(sum(m.^2))
+ans =
+ 4.3146 3.1205 2.1932 3.2611 2.5342 2.5728
+ 4.2047 3.6520 2.0852 3.0731
+@end example
+
+
+@node Vector and Matrix References and Further Reading
+@section References and Further Reading
+
+The block, vector and matrix objects in GSL follow the @code{valarray}
+model of C++. A description of this model can be found in the following
+reference,
+
+@itemize @asis
+@item
+B. Stroustrup,
+@cite{The C++ Programming Language} (3rd Ed),
+Section 22.4 Vector Arithmetic.
+Addison-Wesley 1997, ISBN 0-201-88954-4.
+@end itemize
diff --git a/gsl-1.9/doc/version-ref.texi b/gsl-1.9/doc/version-ref.texi
new file mode 100644
index 0000000..391fb64
--- /dev/null
+++ b/gsl-1.9/doc/version-ref.texi
@@ -0,0 +1,4 @@
+@set UPDATED 20 February 2007
+@set UPDATED-MONTH February 2007
+@set EDITION 1.9
+@set VERSION 1.9
diff --git a/gsl-1.9/eigen/ChangeLog b/gsl-1.9/eigen/ChangeLog
new file mode 100644
index 0000000..6862b4f
--- /dev/null
+++ b/gsl-1.9/eigen/ChangeLog
@@ -0,0 +1,93 @@
+2006-09-14 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c (test_eigen_symm): fix duplicate VAL_DESC to ABS_DESC
+ (test_eigen_herm): fix duplicate VAL_DESC to ABS_DESC
+
+2006-08-14 Brian Gough <bjg@network-theory.co.uk>
+
+ * unsymm.c (gsl_eigen_unsymm): support for unsymmetric matrices
+ (P.Alken)
+
+2006-04-18 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c (test_eigenvalues): increase error bound
+
+2006-03-26 Brian Gough <bjg@network-theory.co.uk>
+
+ * jacobi.c (gsl_eigen_invert_jacobi): use unsigned int for nrot
+ consistently
+
+2005-08-22 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c (test_eigenvalues): increased test tolerance
+
+2004-12-03 Brian Gough <bjg@network-theory.co.uk>
+
+ * jacobi.c (gsl_eigen_jacobi): use algorithm from Golub and Van
+ Loan
+ (gsl_eigen_invert_jacobi): new code
+
+2003-01-02 Brian Gough <brian.gough@network-theory.co.uk>
+
+ * symmv.c (gsl_eigen_symmv): change gsl_isnan to isnan
+
+ * symm.c (gsl_eigen_symm): change gsl_isnan to isnan
+
+ * hermv.c (gsl_eigen_hermv): change gsl_isnan to isnan
+
+ * herm.c (gsl_eigen_herm): change gsl_isnan to isnan
+
+2002-11-16 Brian Gough <bjg@network-theory.co.uk>
+
+ * symm.c (gsl_eigen_symm): prevent infinite loop for NaNs
+
+ * herm.c (gsl_eigen_herm): prevent infinite loop for NaNs
+
+ * symmv.c (gsl_eigen_symmv): prevent infinite loop for NaNs
+
+ * hermv.c (gsl_eigen_hermv): prevent infinite loop for NaNs
+
+Fri Oct 18 17:58:35 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c (main): added test cases to catch division by zero
+ (beta_r=0) in householdercomplex.c
+
+Wed Aug 28 19:05:54 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * Makefile.am (test_LDADD): fix link order to have libgslsys near
+ end
+
+Thu Aug 2 18:17:58 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * hermv.c (gsl_eigen_hermv): fixed index bug in accumulation of evec.
+
+ * symmv.c (gsl_eigen_symmv): fixed index bug in accumulation of evec.
+
+ * test.c (main): added two new test cases
+
+ * qrstep.c (trailing_eigenvalue): chose better value of mu when
+ dt=0, prevents infinite loop.
+
+Sun Jul 1 22:43:45 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * modified to use new-style vector views
+
+Wed Jun 20 12:30:38 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * hermv.c (gsl_eigen_hermv): additional workspace argument no
+ longer required
+
+Mon Apr 23 10:31:01 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * unified error handling conventions to _e for error handling
+ functions and no suffix for plain functions, so _impl functions
+ are no longer needed.
+
+ * removed tests for EFAULT, since EFAULT should only apply to
+ invalid non-null pointers.
+
+Fri Apr 13 20:33:18 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * eigen/test.c (test_invert_jacobi): removed matmult and replaced
+ by gsl_blas_dgemm
+
diff --git a/gsl-1.9/eigen/Makefile.am b/gsl-1.9/eigen/Makefile.am
new file mode 100644
index 0000000..52590de
--- /dev/null
+++ b/gsl-1.9/eigen/Makefile.am
@@ -0,0 +1,17 @@
+noinst_LTLIBRARIES = libgsleigen.la
+
+check_PROGRAMS = test
+
+pkginclude_HEADERS = gsl_eigen.h
+libgsleigen_la_SOURCES = jacobi.c symm.c symmv.c nonsymm.c nonsymmv.c herm.c hermv.c sort.c francis.c schur.c
+INCLUDES= -I$(top_builddir)
+
+noinst_HEADERS = qrstep.c schur.h
+
+TESTS = $(check_PROGRAMS)
+
+test_LDADD = libgsleigen.la ../test/libgsltest.la ../linalg/libgsllinalg.la ../permutation/libgslpermutation.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la ../sys/libgslsys.la ../err/libgslerr.la ../utils/libutils.la
+
+test_SOURCES = test.c
+
+
diff --git a/gsl-1.9/eigen/Makefile.in b/gsl-1.9/eigen/Makefile.in
new file mode 100644
index 0000000..94acd03
--- /dev/null
+++ b/gsl-1.9/eigen/Makefile.in
@@ -0,0 +1,549 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = test$(EXEEXT)
+subdir = eigen
+DIST_COMMON = $(noinst_HEADERS) $(pkginclude_HEADERS) \
+ $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog TODO
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgsleigen_la_LIBADD =
+am_libgsleigen_la_OBJECTS = jacobi.lo symm.lo symmv.lo nonsymm.lo \
+ nonsymmv.lo herm.lo hermv.lo sort.lo francis.lo schur.lo
+libgsleigen_la_OBJECTS = $(am_libgsleigen_la_OBJECTS)
+am_test_OBJECTS = test.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = libgsleigen.la ../test/libgsltest.la \
+ ../linalg/libgsllinalg.la ../permutation/libgslpermutation.la \
+ ../blas/libgslblas.la ../cblas/libgslcblas.la \
+ ../matrix/libgslmatrix.la ../vector/libgslvector.la \
+ ../block/libgslblock.la ../complex/libgslcomplex.la \
+ ../ieee-utils/libgslieeeutils.la ../sys/libgslsys.la \
+ ../err/libgslerr.la ../utils/libutils.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgsleigen_la_SOURCES) $(test_SOURCES)
+DIST_SOURCES = $(libgsleigen_la_SOURCES) $(test_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libgsleigen.la
+pkginclude_HEADERS = gsl_eigen.h
+libgsleigen_la_SOURCES = jacobi.c symm.c symmv.c nonsymm.c nonsymmv.c herm.c hermv.c sort.c francis.c schur.c
+INCLUDES = -I$(top_builddir)
+noinst_HEADERS = qrstep.c schur.h
+TESTS = $(check_PROGRAMS)
+test_LDADD = libgsleigen.la ../test/libgsltest.la ../linalg/libgsllinalg.la ../permutation/libgslpermutation.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la ../sys/libgslsys.la ../err/libgslerr.la ../utils/libutils.la
+test_SOURCES = test.c
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps eigen/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps eigen/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgsleigen.la: $(libgsleigen_la_OBJECTS) $(libgsleigen_la_DEPENDENCIES)
+ $(LINK) $(libgsleigen_la_LDFLAGS) $(libgsleigen_la_OBJECTS) $(libgsleigen_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkgincludeHEADERS
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/eigen/TODO b/gsl-1.9/eigen/TODO
new file mode 100644
index 0000000..6bc18e6
--- /dev/null
+++ b/gsl-1.9/eigen/TODO
@@ -0,0 +1,15 @@
+
+* Document Jacobi eigen function, in particular that it only works for
+symmetric matrices.
+
+* add support for nonsymmv left eigenvectors?:
+
+ gsl_eigen_nonsymmv_params(const int lr)
+
+ to specify whether we should compute left/right eigenvectors (or both).
+
+ If they want both, we'll need a new function:
+
+ gsl_eigen_nonsymmv_lr(..., evec_r, evec_l, ...)
+ and
+ gsl_eigen_nonsymmv_lr_Z(...)
diff --git a/gsl-1.9/eigen/francis.c b/gsl-1.9/eigen/francis.c
new file mode 100644
index 0000000..98ecb9f
--- /dev/null
+++ b/gsl-1.9/eigen/francis.c
@@ -0,0 +1,783 @@
+/* eigen/francis.c
+ *
+ * Copyright (C) 2006 Patrick Alken
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <math.h>
+#include <gsl/gsl_eigen.h>
+#include <gsl/gsl_linalg.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_blas.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_vector_complex.h>
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_cblas.h>
+
+#include "schur.h"
+
+/*
+ * This module computes the eigenvalues of a real upper hessenberg
+ * matrix, using the classical double shift Francis QR algorithm.
+ * It will also optionally compute the full Schur form and matrix of
+ * Schur vectors.
+ *
+ * See Golub & Van Loan, "Matrix Computations" (3rd ed),
+ * algorithm 7.5.2
+ */
+
+/* exceptional shift coefficients - these values are from LAPACK DLAHQR */
+#define GSL_FRANCIS_COEFF1 (0.75)
+#define GSL_FRANCIS_COEFF2 (-0.4375)
+
+static inline void francis_schur_decomp(gsl_matrix * H,
+ gsl_vector_complex * eval,
+ gsl_eigen_francis_workspace * w);
+static inline size_t francis_search_subdiag_small_elements(gsl_matrix * A);
+static inline int francis_qrstep(gsl_matrix * H,
+ gsl_eigen_francis_workspace * w);
+static inline void francis_schur_standardize(gsl_matrix *A,
+ gsl_complex *eval1,
+ gsl_complex *eval2,
+ gsl_eigen_francis_workspace *w);
+static inline void francis_get_submatrix(gsl_matrix *A, gsl_matrix *B,
+ size_t *top);
+
+
+/*
+gsl_eigen_francis_alloc()
+
+Allocate a workspace for solving the nonsymmetric eigenvalue problem.
+The size of this workspace is O(1)
+
+Inputs: none
+
+Return: pointer to workspace
+*/
+
+gsl_eigen_francis_workspace *
+gsl_eigen_francis_alloc(void)
+{
+ gsl_eigen_francis_workspace *w;
+
+ w = (gsl_eigen_francis_workspace *)
+ malloc (sizeof (gsl_eigen_francis_workspace));
+
+ if (w == 0)
+ {
+ GSL_ERROR_NULL ("failed to allocate space for workspace", GSL_ENOMEM);
+ }
+
+ /* these are filled in later */
+
+ w->size = 0;
+ w->max_iterations = 0;
+ w->n_iter = 0;
+ w->n_evals = 0;
+
+ w->compute_t = 0;
+ w->Z = NULL;
+ w->H = NULL;
+
+ w->hv2 = gsl_vector_alloc(2);
+ w->hv3 = gsl_vector_alloc(3);
+
+ if ((w->hv2 == 0) || (w->hv3 == 0))
+ {
+ GSL_ERROR_NULL ("failed to allocate space for householder vectors", GSL_ENOMEM);
+ }
+
+ return (w);
+} /* gsl_eigen_francis_alloc() */
+
+/*
+gsl_eigen_francis_free()
+ Free francis workspace w
+*/
+
+void
+gsl_eigen_francis_free (gsl_eigen_francis_workspace *w)
+{
+ gsl_vector_free(w->hv2);
+ gsl_vector_free(w->hv3);
+
+ free(w);
+} /* gsl_eigen_francis_free() */
+
+/*
+gsl_eigen_francis_T()
+ Called when we want to compute the Schur form T, or no longer
+compute the Schur form T
+
+Inputs: compute_t - 1 to compute T, 0 to not compute T
+ w - francis workspace
+*/
+
+void
+gsl_eigen_francis_T (const int compute_t, gsl_eigen_francis_workspace *w)
+{
+ w->compute_t = compute_t;
+}
+
+/*
+gsl_eigen_francis()
+
+Solve the nonsymmetric eigenvalue problem
+
+H x = \lambda x
+
+for the eigenvalues \lambda using algorithm 7.5.2 of
+Golub & Van Loan, "Matrix Computations" (3rd ed)
+
+Inputs: H - upper hessenberg matrix
+ eval - where to store eigenvalues
+ w - workspace
+
+Return: success or error - if error code is returned,
+ then the QR procedure did not converge in the
+ allowed number of iterations. In the event of non-
+ convergence, the number of eigenvalues found will
+ still be stored in the beginning of eval,
+
+Notes: On output, the diagonal of H contains 1-by-1 or 2-by-2
+ blocks containing the eigenvalues. If T is desired,
+ H will contain the full Schur form on output.
+*/
+
+int
+gsl_eigen_francis (gsl_matrix * H, gsl_vector_complex * eval,
+ gsl_eigen_francis_workspace * w)
+{
+ /* check matrix and vector sizes */
+
+ if (H->size1 != H->size2)
+ {
+ GSL_ERROR ("matrix must be square to compute eigenvalues", GSL_ENOTSQR);
+ }
+ else if (eval->size != H->size1)
+ {
+ GSL_ERROR ("eigenvalue vector must match matrix size", GSL_EBADLEN);
+ }
+ else
+ {
+ const size_t N = H->size1;
+ int j;
+
+ /*
+ * Set internal parameters which depend on matrix size.
+ * The Francis solver can be called with any size matrix
+ * since the workspace does not depend on N.
+ * Furthermore, multishift solvers which call the Francis
+ * solver may need to call it with different sized matrices
+ */
+ w->size = N;
+ w->max_iterations = 30 * N;
+
+ /*
+ * save a pointer to original matrix since francis_schur_decomp
+ * is recursive
+ */
+ w->H = H;
+
+ w->n_iter = 0;
+ w->n_evals = 0;
+
+ /*
+ * zero out the first two subdiagonals (below the main subdiagonal)
+ * needed as scratch space by the QR sweep routine
+ */
+ for (j = 0; j < (int) N - 3; ++j)
+ {
+ gsl_matrix_set(H, (size_t) j + 2, (size_t) j, 0.0);
+ gsl_matrix_set(H, (size_t) j + 3, (size_t) j, 0.0);
+ }
+
+ if (N > 2)
+ gsl_matrix_set(H, N - 1, N - 3, 0.0);
+
+ /*
+ * compute Schur decomposition of H and store eigenvalues
+ * into eval
+ */
+ francis_schur_decomp(H, eval, w);
+
+ if (w->n_evals != N)
+ return GSL_EMAXITER;
+
+ return GSL_SUCCESS;
+ }
+} /* gsl_eigen_francis() */
+
+/*
+gsl_eigen_francis_Z()
+
+Solve the nonsymmetric eigenvalue problem for a Hessenberg
+matrix
+
+H x = \lambda x
+
+for the eigenvalues \lambda using the Francis double-shift
+method.
+
+Here we compute the real Schur form
+
+T = Q^t H Q
+
+with the diagonal blocks of T giving us the eigenvalues.
+Q is the matrix of Schur vectors.
+
+Originally, H was obtained from a general nonsymmetric matrix
+A via a transformation
+
+H = U^t A U
+
+so that
+
+T = (UQ)^t A (UQ) = Z^t A Z
+
+Z is the matrix of Schur vectors computed by this algorithm
+
+Inputs: H - upper hessenberg matrix
+ eval - where to store eigenvalues
+ Z - where to store Schur vectors
+ w - workspace
+
+Notes: 1) If T is computed, it is stored in H on output. Otherwise,
+ the diagonal of H will contain 1-by-1 and 2-by-2 blocks
+ containing the eigenvalues.
+
+ 2) The matrix Z must be initialized to the Hessenberg
+ similarity matrix U. Or if you want the eigenvalues
+ of H, initialize Z to the identity matrix.
+*/
+
+int
+gsl_eigen_francis_Z (gsl_matrix * H, gsl_vector_complex * eval,
+ gsl_matrix * Z, gsl_eigen_francis_workspace * w)
+{
+ int s;
+
+ /* set internal Z pointer so we know to accumulate transformations */
+ w->Z = Z;
+
+ s = gsl_eigen_francis(H, eval, w);
+
+ w->Z = NULL;
+
+ return s;
+} /* gsl_eigen_francis_Z() */
+
+/********************************************
+ * INTERNAL ROUTINES *
+ ********************************************/
+
+/*
+francis_schur_decomp()
+ Compute the Schur decomposition of the matrix H
+
+Inputs: H - hessenberg matrix
+ eval - where to store eigenvalues
+ w - workspace
+
+Return: none
+*/
+
+static inline void
+francis_schur_decomp(gsl_matrix * H, gsl_vector_complex * eval,
+ gsl_eigen_francis_workspace * w)
+{
+ gsl_matrix_view m; /* active matrix we are working on */
+ size_t N; /* size of matrix */
+ size_t q; /* index of small subdiagonal element */
+ gsl_complex lambda1, /* eigenvalues */
+ lambda2;
+
+ N = H->size1;
+
+ if (N == 1)
+ {
+ GSL_SET_COMPLEX(&lambda1, gsl_matrix_get(H, 0, 0), 0.0);
+ gsl_vector_complex_set(eval, w->n_evals, lambda1);
+ w->n_evals += 1;
+ w->n_iter = 0;
+ return;
+ }
+ else if (N == 2)
+ {
+ francis_schur_standardize(H, &lambda1, &lambda2, w);
+ gsl_vector_complex_set(eval, w->n_evals, lambda1);
+ gsl_vector_complex_set(eval, w->n_evals + 1, lambda2);
+ w->n_evals += 2;
+ w->n_iter = 0;
+ return;
+ }
+
+ m = gsl_matrix_submatrix(H, 0, 0, N, N);
+
+ while ((N > 2) && ((w->n_iter)++ < w->max_iterations))
+ {
+ q = francis_search_subdiag_small_elements(&m.matrix);
+
+ if (q == 0)
+ {
+ /*
+ * no small subdiagonal element found - perform a QR
+ * sweep on the active reduced hessenberg matrix
+ */
+ francis_qrstep(&m.matrix, w);
+ continue;
+ }
+
+ /*
+ * a small subdiagonal element was found - one or two eigenvalues
+ * have converged or the matrix has split into two smaller matrices
+ */
+
+ if (q == (N - 1))
+ {
+ /*
+ * the last subdiagonal element of the matrix is 0 -
+ * m_{NN} is a real eigenvalue
+ */
+ GSL_SET_COMPLEX(&lambda1,
+ gsl_matrix_get(&m.matrix, q, q), 0.0);
+ gsl_vector_complex_set(eval, w->n_evals, lambda1);
+ w->n_evals += 1;
+ w->n_iter = 0;
+
+ --N;
+ m = gsl_matrix_submatrix(&m.matrix, 0, 0, N, N);
+ }
+ else if (q == (N - 2))
+ {
+ gsl_matrix_view v;
+
+ /*
+ * The bottom right 2-by-2 block of m is an eigenvalue
+ * system
+ */
+
+ v = gsl_matrix_submatrix(&m.matrix, q, q, 2, 2);
+ francis_schur_standardize(&v.matrix, &lambda1, &lambda2, w);
+
+ gsl_vector_complex_set(eval, w->n_evals, lambda1);
+ gsl_vector_complex_set(eval, w->n_evals + 1, lambda2);
+ w->n_evals += 2;
+ w->n_iter = 0;
+
+ N -= 2;
+ m = gsl_matrix_submatrix(&m.matrix, 0, 0, N, N);
+ }
+ else if (q == 1)
+ {
+ /* the first matrix element is an eigenvalue */
+ GSL_SET_COMPLEX(&lambda1,
+ gsl_matrix_get(&m.matrix, 0, 0), 0.0);
+ gsl_vector_complex_set(eval, w->n_evals, lambda1);
+ w->n_evals += 1;
+ w->n_iter = 0;
+
+ --N;
+ m = gsl_matrix_submatrix(&m.matrix, 1, 1, N, N);
+ }
+ else if (q == 2)
+ {
+ gsl_matrix_view v;
+
+ /* the upper left 2-by-2 block is an eigenvalue system */
+
+ v = gsl_matrix_submatrix(&m.matrix, 0, 0, 2, 2);
+ francis_schur_standardize(&v.matrix, &lambda1, &lambda2, w);
+
+ gsl_vector_complex_set(eval, w->n_evals, lambda1);
+ gsl_vector_complex_set(eval, w->n_evals + 1, lambda2);
+ w->n_evals += 2;
+ w->n_iter = 0;
+
+ N -= 2;
+ m = gsl_matrix_submatrix(&m.matrix, 2, 2, N, N);
+ }
+ else
+ {
+ gsl_matrix_view v;
+
+ /*
+ * There is a zero element on the subdiagonal somewhere
+ * in the middle of the matrix - we can now operate
+ * separately on the two submatrices split by this
+ * element. q is the row index of the zero element.
+ */
+
+ /* operate on lower right (N - q)-by-(N - q) block first */
+ v = gsl_matrix_submatrix(&m.matrix, q, q, N - q, N - q);
+ francis_schur_decomp(&v.matrix, eval, w);
+
+ /* operate on upper left q-by-q block */
+ v = gsl_matrix_submatrix(&m.matrix, 0, 0, q, q);
+ francis_schur_decomp(&v.matrix, eval, w);
+
+ N = 0;
+ }
+ }
+
+ if (N == 1)
+ {
+ GSL_SET_COMPLEX(&lambda1, gsl_matrix_get(&m.matrix, 0, 0), 0.0);
+ gsl_vector_complex_set(eval, w->n_evals, lambda1);
+ w->n_evals += 1;
+ w->n_iter = 0;
+ }
+ else if (N == 2)
+ {
+ francis_schur_standardize(&m.matrix, &lambda1, &lambda2, w);
+ gsl_vector_complex_set(eval, w->n_evals, lambda1);
+ gsl_vector_complex_set(eval, w->n_evals + 1, lambda2);
+ w->n_evals += 2;
+ w->n_iter = 0;
+ }
+} /* francis_schur_decomp() */
+
+/*
+francis_qrstep()
+ Perform a Francis QR step.
+
+See Golub & Van Loan, "Matrix Computations" (3rd ed),
+algorithm 7.5.1
+
+Inputs: H - upper Hessenberg matrix
+ w - workspace
+
+Notes: The matrix H must be "reduced", ie: have no tiny subdiagonal
+ elements. When computing the first householder reflection,
+ we divide by H_{21} so it is necessary that this element
+ is not zero. When a subdiagonal element becomes negligible,
+ the calling function should call this routine with the
+ submatrices split by that element, so that we don't divide
+ by zeros.
+*/
+
+static inline int
+francis_qrstep(gsl_matrix * H, gsl_eigen_francis_workspace * w)
+{
+ const size_t N = H->size1;
+ double x, y, z; /* householder vector elements */
+ double scale; /* scale factor to avoid overflow */
+ size_t i; /* looping */
+ gsl_matrix_view m;
+ double tau_i; /* householder coefficient */
+ size_t q, r;
+ size_t top; /* location of H in original matrix */
+ double s,
+ disc;
+ double h_nn, /* H(n,n) */
+ h_nm1nm1, /* H(n-1,n-1) */
+ h_cross, /* H(n,n-1) * H(n-1,n) */
+ h_tmp1,
+ h_tmp2;
+
+ if ((w->n_iter == 10) || (w->n_iter == 20))
+ {
+ /*
+ * exceptional shifts: we have gone 10 or 20 iterations
+ * without finding a new eigenvalue, try a new choice of shifts.
+ * See Numerical Recipes in C, eq 11.6.27 and LAPACK routine
+ * DLAHQR
+ */
+ s = fabs(gsl_matrix_get(H, N - 1, N - 2)) +
+ fabs(gsl_matrix_get(H, N - 2, N - 3));
+ h_nn = gsl_matrix_get(H, N - 1, N - 1) + GSL_FRANCIS_COEFF1 * s;
+ h_nm1nm1 = h_nn;
+ h_cross = GSL_FRANCIS_COEFF2 * s * s;
+ }
+ else
+ {
+ /*
+ * normal shifts - compute Rayleigh quotient and use
+ * Wilkinson shift if possible
+ */
+
+ h_nn = gsl_matrix_get(H, N - 1, N - 1);
+ h_nm1nm1 = gsl_matrix_get(H, N - 2, N - 2);
+ h_cross = gsl_matrix_get(H, N - 1, N - 2) *
+ gsl_matrix_get(H, N - 2, N - 1);
+
+ disc = 0.5 * (h_nm1nm1 - h_nn);
+ disc = disc * disc + h_cross;
+ if (disc > 0.0)
+ {
+ double ave;
+
+ /* real roots - use Wilkinson's shift twice */
+ disc = sqrt(disc);
+ ave = 0.5 * (h_nm1nm1 + h_nn);
+ if (fabs(h_nm1nm1) - fabs(h_nn) > 0.0)
+ {
+ h_nm1nm1 = h_nm1nm1 * h_nn - h_cross;
+ h_nn = h_nm1nm1 / (disc * GSL_SIGN(ave) + ave);
+ }
+ else
+ {
+ h_nn = disc * GSL_SIGN(ave) + ave;
+ }
+
+ h_nm1nm1 = h_nn;
+ h_cross = 0.0;
+ }
+ }
+
+ h_tmp1 = h_nm1nm1 - gsl_matrix_get(H, 0, 0);
+ h_tmp2 = h_nn - gsl_matrix_get(H, 0, 0);
+
+ /*
+ * These formulas are equivalent to those in Golub & Van Loan
+ * for the normal shift case - the terms have been rearranged
+ * to reduce possible roundoff error when subdiagonal elements
+ * are small
+ */
+
+ x = (h_tmp1*h_tmp2 - h_cross) / gsl_matrix_get(H, 1, 0) +
+ gsl_matrix_get(H, 0, 1);
+ y = gsl_matrix_get(H, 1, 1) - gsl_matrix_get(H, 0, 0) - h_tmp1 - h_tmp2;
+ z = gsl_matrix_get(H, 2, 1);
+
+ scale = fabs(x) + fabs(y) + fabs(z);
+ if (scale != 0.0)
+ {
+ /* scale to prevent overflow or underflow */
+ x /= scale;
+ y /= scale;
+ z /= scale;
+ }
+
+ if (w->Z || w->compute_t)
+ {
+ /*
+ * get absolute indices of this (sub)matrix relative to the
+ * original Hessenberg matrix
+ */
+ francis_get_submatrix(w->H, H, &top);
+ }
+
+ for (i = 0; i < N - 2; ++i)
+ {
+ gsl_vector_set(w->hv3, 0, x);
+ gsl_vector_set(w->hv3, 1, y);
+ gsl_vector_set(w->hv3, 2, z);
+ tau_i = gsl_linalg_householder_transform(w->hv3);
+
+ if (tau_i != 0.0)
+ {
+ /* q = max(1, i - 1) */
+ q = (1 > ((int)i - 1)) ? 0 : (i - 1);
+
+ /* r = min(i + 3, N - 1) */
+ r = ((i + 3) < (N - 1)) ? (i + 3) : (N - 1);
+
+ if (w->compute_t)
+ {
+ /*
+ * We are computing the Schur form T, so we
+ * need to transform the whole matrix H
+ *
+ * H -> P_k^t H P_k
+ *
+ * where P_k is the current Householder matrix
+ */
+
+ /* apply left householder matrix (I - tau_i v v') to H */
+ m = gsl_matrix_submatrix(w->H,
+ top + i,
+ top + q,
+ 3,
+ w->size - top - q);
+ gsl_linalg_householder_hm(tau_i, w->hv3, &m.matrix);
+
+ /* apply right householder matrix (I - tau_i v v') to H */
+ m = gsl_matrix_submatrix(w->H,
+ 0,
+ top + i,
+ top + r + 1,
+ 3);
+ gsl_linalg_householder_mh(tau_i, w->hv3, &m.matrix);
+ }
+ else
+ {
+ /*
+ * We are not computing the Schur form T, so we
+ * only need to transform the active block
+ */
+
+ /* apply left householder matrix (I - tau_i v v') to H */
+ m = gsl_matrix_submatrix(H, i, q, 3, N - q);
+ gsl_linalg_householder_hm(tau_i, w->hv3, &m.matrix);
+
+ /* apply right householder matrix (I - tau_i v v') to H */
+ m = gsl_matrix_submatrix(H, 0, i, r + 1, 3);
+ gsl_linalg_householder_mh(tau_i, w->hv3, &m.matrix);
+ }
+
+ if (w->Z)
+ {
+ /* accumulate the similarity transformation into Z */
+ m = gsl_matrix_submatrix(w->Z, 0, top + i, w->size, 3);
+ gsl_linalg_householder_mh(tau_i, w->hv3, &m.matrix);
+ }
+ } /* if (tau_i != 0.0) */
+
+ x = gsl_matrix_get(H, i + 1, i);
+ y = gsl_matrix_get(H, i + 2, i);
+ if (i < (N - 3))
+ {
+ z = gsl_matrix_get(H, i + 3, i);
+ }
+
+ scale = fabs(x) + fabs(y) + fabs(z);
+ if (scale != 0.0)
+ {
+ /* scale to prevent overflow or underflow */
+ x /= scale;
+ y /= scale;
+ z /= scale;
+ }
+ } /* for (i = 0; i < N - 2; ++i) */
+
+ gsl_vector_set(w->hv2, 0, x);
+ gsl_vector_set(w->hv2, 1, y);
+ tau_i = gsl_linalg_householder_transform(w->hv2);
+
+ if (w->compute_t)
+ {
+ m = gsl_matrix_submatrix(w->H,
+ top + N - 2,
+ top + N - 3,
+ 2,
+ w->size - top - N + 3);
+ gsl_linalg_householder_hm(tau_i, w->hv2, &m.matrix);
+
+ m = gsl_matrix_submatrix(w->H,
+ 0,
+ top + N - 2,
+ top + N,
+ 2);
+ gsl_linalg_householder_mh(tau_i, w->hv2, &m.matrix);
+ }
+ else
+ {
+ m = gsl_matrix_submatrix(H, N - 2, N - 3, 2, 3);
+ gsl_linalg_householder_hm(tau_i, w->hv2, &m.matrix);
+
+ m = gsl_matrix_submatrix(H, 0, N - 2, N, 2);
+ gsl_linalg_householder_mh(tau_i, w->hv2, &m.matrix);
+ }
+
+ if (w->Z)
+ {
+ /* accumulate transformation into Z */
+ m = gsl_matrix_submatrix(w->Z, 0, top + N - 2, w->size, 2);
+ gsl_linalg_householder_mh(tau_i, w->hv2, &m.matrix);
+ }
+
+ return GSL_SUCCESS;
+} /* francis_qrstep() */
+
+/*
+francis_search_subdiag_small_elements()
+ Search for a small subdiagonal element starting from the bottom
+of a matrix A. A small element is one that satisfies:
+
+|A_{i,i-1}| <= eps * (|A_{i,i}| + |A_{i-1,i-1}|)
+
+Inputs: A - matrix (must be at least 3-by-3)
+
+Return: row index of small subdiagonal element or 0 if not found
+
+Notes: the first small element that is found (starting from bottom)
+ is set to zero
+*/
+
+static inline size_t
+francis_search_subdiag_small_elements(gsl_matrix * A)
+{
+ const size_t N = A->size1;
+ size_t i;
+ double dpel = gsl_matrix_get(A, N - 2, N - 2);
+
+ for (i = N - 1; i > 0; --i)
+ {
+ double sel = gsl_matrix_get(A, i, i - 1);
+ double del = gsl_matrix_get(A, i, i);
+
+ if ((sel == 0.0) ||
+ (fabs(sel) < GSL_DBL_EPSILON * (fabs(del) + fabs(dpel))))
+ {
+ gsl_matrix_set(A, i, i - 1, 0.0);
+ return (i);
+ }
+
+ dpel = del;
+ }
+
+ return (0);
+} /* francis_search_subdiag_small_elements() */
+
+/*
+francis_schur_standardize()
+ Convert a 2-by-2 diagonal block in the Schur form to standard form
+and update the rest of T and Z matrices if required.
+
+Inputs: A - 2-by-2 matrix
+ eval1 - where to store eigenvalue 1
+ eval2 - where to store eigenvalue 2
+ w - francis workspace
+*/
+
+static inline void
+francis_schur_standardize(gsl_matrix *A, gsl_complex *eval1,
+ gsl_complex *eval2,
+ gsl_eigen_francis_workspace *w)
+{
+ size_t top;
+
+ /*
+ * figure out where the submatrix A resides in the
+ * original matrix H
+ */
+ francis_get_submatrix(w->H, A, &top);
+
+ /* convert A to standard form and store eigenvalues */
+ gsl_schur_standardize(w->H, top, eval1, eval2, w->compute_t, w->Z);
+} /* francis_schur_standardize() */
+
+/*
+francis_get_submatrix()
+ B is a submatrix of A. The goal of this function is to
+compute the indices in A of where the matrix B resides
+*/
+
+static inline void
+francis_get_submatrix(gsl_matrix *A, gsl_matrix *B, size_t *top)
+{
+ size_t diff;
+ double ratio;
+
+ diff = (size_t) (B->data - A->data);
+
+ ratio = (double)diff / ((double) (A->tda + 1));
+
+ *top = (size_t) floor(ratio);
+} /* francis_get_submatrix() */
diff --git a/gsl-1.9/eigen/gsl_eigen.h b/gsl-1.9/eigen/gsl_eigen.h
new file mode 100644
index 0000000..25983dc
--- /dev/null
+++ b/gsl-1.9/eigen/gsl_eigen.h
@@ -0,0 +1,210 @@
+/* eigen/gsl_eigen.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_EIGEN_H__
+#define __GSL_EIGEN_H__
+
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_matrix.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+typedef struct {
+ size_t size;
+ double * d;
+ double * sd;
+} gsl_eigen_symm_workspace;
+
+gsl_eigen_symm_workspace * gsl_eigen_symm_alloc (const size_t n);
+void gsl_eigen_symm_free (gsl_eigen_symm_workspace * w);
+int gsl_eigen_symm (gsl_matrix * A, gsl_vector * eval, gsl_eigen_symm_workspace * w);
+
+typedef struct {
+ size_t size;
+ double * d;
+ double * sd;
+ double * gc;
+ double * gs;
+} gsl_eigen_symmv_workspace;
+
+gsl_eigen_symmv_workspace * gsl_eigen_symmv_alloc (const size_t n);
+void gsl_eigen_symmv_free (gsl_eigen_symmv_workspace * w);
+int gsl_eigen_symmv (gsl_matrix * A, gsl_vector * eval, gsl_matrix * evec, gsl_eigen_symmv_workspace * w);
+
+typedef struct {
+ size_t size; /* matrix size */
+ size_t max_iterations; /* max iterations since last eigenvalue found */
+ size_t n_iter; /* number of iterations since last eigenvalue found */
+ size_t n_evals; /* number of eigenvalues found so far */
+
+ gsl_vector *hv2; /* temporary 2-by-1 householder vector */
+ gsl_vector *hv3; /* temporary 3-by-1 householder vector */
+
+ int compute_t; /* compute Schur form T = Z^t A Z */
+
+ gsl_matrix *H; /* pointer to Hessenberg matrix */
+
+ gsl_matrix *Z; /* pointer to Schur vector matrix */
+} gsl_eigen_francis_workspace;
+
+gsl_eigen_francis_workspace * gsl_eigen_francis_alloc (void);
+void gsl_eigen_francis_free (gsl_eigen_francis_workspace * w);
+void gsl_eigen_francis_T (const int compute_t,
+ gsl_eigen_francis_workspace * w);
+int gsl_eigen_francis (gsl_matrix * H, gsl_vector_complex * eval,
+ gsl_eigen_francis_workspace * w);
+int gsl_eigen_francis_Z (gsl_matrix * H, gsl_vector_complex * eval,
+ gsl_matrix * Z,
+ gsl_eigen_francis_workspace * w);
+
+typedef struct {
+ size_t size; /* size of matrices */
+ gsl_vector *diag; /* diagonal matrix elements from balancing */
+ gsl_vector *tau; /* Householder coefficients */
+ gsl_matrix *Z; /* pointer to Z matrix */
+ int do_balance; /* perform balancing transformation? */
+ size_t n_evals; /* number of eigenvalues found */
+
+ gsl_eigen_francis_workspace *francis_workspace_p;
+} gsl_eigen_nonsymm_workspace;
+
+gsl_eigen_nonsymm_workspace * gsl_eigen_nonsymm_alloc (const size_t n);
+void gsl_eigen_nonsymm_free (gsl_eigen_nonsymm_workspace * w);
+void gsl_eigen_nonsymm_params (const int compute_t, const int balance,
+ gsl_eigen_nonsymm_workspace *w);
+int gsl_eigen_nonsymm (gsl_matrix * A, gsl_vector_complex * eval,
+ gsl_eigen_nonsymm_workspace * w);
+int gsl_eigen_nonsymm_Z (gsl_matrix * A, gsl_vector_complex * eval,
+ gsl_matrix * Z, gsl_eigen_nonsymm_workspace * w);
+
+typedef struct {
+ size_t size; /* size of matrices */
+ gsl_vector *work; /* scratch workspace */
+ gsl_vector *work2; /* scratch workspace */
+ gsl_vector *work3; /* scratch workspace */
+
+ gsl_matrix *Z; /* pointer to Schur vectors */
+
+ gsl_eigen_nonsymm_workspace *nonsymm_workspace_p;
+} gsl_eigen_nonsymmv_workspace;
+
+gsl_eigen_nonsymmv_workspace * gsl_eigen_nonsymmv_alloc (const size_t n);
+void gsl_eigen_nonsymmv_free (gsl_eigen_nonsymmv_workspace * w);
+int gsl_eigen_nonsymmv (gsl_matrix * A, gsl_vector_complex * eval,
+ gsl_matrix_complex * evec,
+ gsl_eigen_nonsymmv_workspace * w);
+int gsl_eigen_nonsymmv_Z (gsl_matrix * A, gsl_vector_complex * eval,
+ gsl_matrix_complex * evec, gsl_matrix * Z,
+ gsl_eigen_nonsymmv_workspace * w);
+
+typedef struct {
+ size_t size;
+ double * d;
+ double * sd;
+ double * tau;
+} gsl_eigen_herm_workspace;
+
+gsl_eigen_herm_workspace * gsl_eigen_herm_alloc (const size_t n);
+void gsl_eigen_herm_free (gsl_eigen_herm_workspace * w);
+int gsl_eigen_herm (gsl_matrix_complex * A, gsl_vector * eval,
+ gsl_eigen_herm_workspace * w);
+
+typedef struct {
+ size_t size;
+ double * d;
+ double * sd;
+ double * tau;
+ double * gc;
+ double * gs;
+} gsl_eigen_hermv_workspace;
+
+gsl_eigen_hermv_workspace * gsl_eigen_hermv_alloc (const size_t n);
+void gsl_eigen_hermv_free (gsl_eigen_hermv_workspace * w);
+int gsl_eigen_hermv (gsl_matrix_complex * A, gsl_vector * eval,
+ gsl_matrix_complex * evec,
+ gsl_eigen_hermv_workspace * w);
+
+
+
+typedef enum {
+ GSL_EIGEN_SORT_VAL_ASC,
+ GSL_EIGEN_SORT_VAL_DESC,
+ GSL_EIGEN_SORT_ABS_ASC,
+ GSL_EIGEN_SORT_ABS_DESC
+}
+gsl_eigen_sort_t;
+
+/* Sort eigensystem results based on eigenvalues.
+ * Sorts in order of increasing value or increasing
+ * absolute value.
+ *
+ * exceptions: GSL_EBADLEN
+ */
+
+int gsl_eigen_symmv_sort(gsl_vector * eval, gsl_matrix * evec,
+ gsl_eigen_sort_t sort_type);
+
+int gsl_eigen_hermv_sort(gsl_vector * eval, gsl_matrix_complex * evec,
+ gsl_eigen_sort_t sort_type);
+
+int gsl_eigen_nonsymmv_sort(gsl_vector_complex * eval,
+ gsl_matrix_complex * evec,
+ gsl_eigen_sort_t sort_type);
+
+
+/* The following functions are obsolete: */
+
+/* Eigensolve by Jacobi Method
+ *
+ * The data in the matrix input is destroyed.
+ *
+ * exceptions:
+ */
+int
+gsl_eigen_jacobi(gsl_matrix * matrix,
+ gsl_vector * eval,
+ gsl_matrix * evec,
+ unsigned int max_rot,
+ unsigned int * nrot);
+
+
+/* Invert by Jacobi Method
+ *
+ * exceptions:
+ */
+int
+gsl_eigen_invert_jacobi(const gsl_matrix * matrix,
+ gsl_matrix * ainv,
+ unsigned int max_rot);
+
+
+
+__END_DECLS
+
+#endif /* __GSL_EIGEN_H__ */
diff --git a/gsl-1.9/eigen/herm.c b/gsl-1.9/eigen/herm.c
new file mode 100644
index 0000000..7b903ab
--- /dev/null
+++ b/gsl-1.9/eigen/herm.c
@@ -0,0 +1,181 @@
+/* eigen/herm.c
+ *
+ * Copyright (C) 2001 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_linalg.h>
+#include <gsl/gsl_eigen.h>
+
+/* Compute eigenvalues of complex hermitian matrix using reduction to
+ real symmetric tridiagonal form, followed by QR iteration with
+ implicit shifts.
+
+ See Golub & Van Loan, "Matrix Computations" (3rd ed), Section 8.3 */
+
+#include "qrstep.c"
+
+gsl_eigen_herm_workspace *
+gsl_eigen_herm_alloc (const size_t n)
+{
+ gsl_eigen_herm_workspace * w ;
+
+ if (n == 0)
+ {
+ GSL_ERROR_NULL ("matrix dimension must be positive integer", GSL_EINVAL);
+ }
+
+ w = (gsl_eigen_herm_workspace *) malloc (sizeof(gsl_eigen_herm_workspace));
+
+ if (w == 0)
+ {
+ GSL_ERROR_NULL ("failed to allocate space for workspace", GSL_ENOMEM);
+ }
+
+ w->d = (double *) malloc (n * sizeof (double));
+
+ if (w->d == 0)
+ {
+ GSL_ERROR_NULL ("failed to allocate space for diagonal", GSL_ENOMEM);
+ }
+
+ w->sd = (double *) malloc (n * sizeof (double));
+
+ if (w->sd == 0)
+ {
+ GSL_ERROR_NULL ("failed to allocate space for subdiagonal", GSL_ENOMEM);
+ }
+
+ w->tau = (double *) malloc (2 * n * sizeof (double));
+
+ if (w->tau == 0)
+ {
+ GSL_ERROR_NULL ("failed to allocate space for tau", GSL_ENOMEM);
+ }
+
+ w->size = n;
+
+ return w;
+}
+
+void
+gsl_eigen_herm_free (gsl_eigen_herm_workspace * w)
+{
+ free (w->tau);
+ free (w->sd);
+ free (w->d);
+ free(w);
+}
+
+int
+gsl_eigen_herm (gsl_matrix_complex * A, gsl_vector * eval,
+ gsl_eigen_herm_workspace * w)
+{
+ if (A->size1 != A->size2)
+ {
+ GSL_ERROR ("matrix must be square to compute eigenvalues", GSL_ENOTSQR);
+ }
+ else if (eval->size != A->size1)
+ {
+ GSL_ERROR ("eigenvalue vector must match matrix size", GSL_EBADLEN);
+ }
+ else
+ {
+ const size_t N = A->size1;
+ double *const d = w->d;
+ double *const sd = w->sd;
+
+ size_t a, b;
+
+ /* handle special case */
+
+ if (N == 1)
+ {
+ gsl_complex A00 = gsl_matrix_complex_get (A, 0, 0);
+ gsl_vector_set (eval, 0, GSL_REAL(A00));
+ return GSL_SUCCESS;
+ }
+
+ {
+ gsl_vector_view d_vec = gsl_vector_view_array (d, N);
+ gsl_vector_view sd_vec = gsl_vector_view_array (sd, N - 1);
+ gsl_vector_complex_view tau_vec = gsl_vector_complex_view_array (w->tau, N-1);
+ gsl_linalg_hermtd_decomp (A, &tau_vec.vector);
+ gsl_linalg_hermtd_unpack_T (A, &d_vec.vector, &sd_vec.vector);
+ }
+
+ /* Make an initial pass through the tridiagonal decomposition
+ to remove off-diagonal elements which are effectively zero */
+
+ chop_small_elements (N, d, sd);
+
+ /* Progressively reduce the matrix until it is diagonal */
+
+ b = N - 1;
+
+ while (b > 0)
+ {
+ if (sd[b - 1] == 0.0 || isnan(sd[b - 1]))
+ {
+ b--;
+ continue;
+ }
+
+ /* Find the largest unreduced block (a,b) starting from b
+ and working backwards */
+
+ a = b - 1;
+
+ while (a > 0)
+ {
+ if (sd[a - 1] == 0.0)
+ {
+ break;
+ }
+ a--;
+ }
+
+ {
+ const size_t n_block = b - a + 1;
+ double *d_block = d + a;
+ double *sd_block = sd + a;
+
+ /* apply QR reduction with implicit deflation to the
+ unreduced block */
+
+ qrstep (n_block, d_block, sd_block, NULL, NULL);
+
+ /* remove any small off-diagonal elements */
+
+ chop_small_elements (n_block, d_block, sd_block);
+ }
+ }
+
+ {
+ gsl_vector_view d_vec = gsl_vector_view_array (d, N);
+ gsl_vector_memcpy (eval, &d_vec.vector);
+ }
+
+ return GSL_SUCCESS;
+ }
+}
+
+
diff --git a/gsl-1.9/eigen/hermv.c b/gsl-1.9/eigen/hermv.c
new file mode 100644
index 0000000..4fc4869
--- /dev/null
+++ b/gsl-1.9/eigen/hermv.c
@@ -0,0 +1,249 @@
+/* eigen/hermv.c
+ *
+ * Copyright (C) 2001 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_complex_math.h>
+#include <gsl/gsl_linalg.h>
+#include <gsl/gsl_eigen.h>
+
+/* Compute eigenvalues/eigenvectors of complex hermitian matrix using
+ reduction to real symmetric tridiagonal form, followed by QR
+ iteration with implicit shifts.
+
+ See Golub & Van Loan, "Matrix Computations" (3rd ed), Section 8.3 */
+
+#include "qrstep.c"
+
+gsl_eigen_hermv_workspace *
+gsl_eigen_hermv_alloc (const size_t n)
+{
+ gsl_eigen_hermv_workspace * w ;
+
+ if (n == 0)
+ {
+ GSL_ERROR_NULL ("matrix dimension must be positive integer", GSL_EINVAL);
+ }
+
+ w = (gsl_eigen_hermv_workspace *) malloc (sizeof(gsl_eigen_hermv_workspace));
+
+ if (w == 0)
+ {
+ GSL_ERROR_NULL ("failed to allocate space for workspace", GSL_ENOMEM);
+ }
+
+ w->d = (double *) malloc (n * sizeof (double));
+
+ if (w->d == 0)
+ {
+ free (w);
+ GSL_ERROR_NULL ("failed to allocate space for diagonal", GSL_ENOMEM);
+ }
+
+ w->sd = (double *) malloc (n * sizeof (double));
+
+ if (w->sd == 0)
+ {
+ free (w->d);
+ free (w);
+ GSL_ERROR_NULL ("failed to allocate space for subdiagonal", GSL_ENOMEM);
+ }
+
+ w->tau = (double *) malloc (2 * n * sizeof (double));
+
+ if (w->tau == 0)
+ {
+ free (w->sd);
+ free (w->d);
+ free (w);
+ GSL_ERROR_NULL ("failed to allocate space for tau", GSL_ENOMEM);
+ }
+
+ w->gc = (double *) malloc (n * sizeof (double));
+
+ if (w->gc == 0)
+ {
+ free (w->tau);
+ free (w->sd);
+ free (w->d);
+ free (w);
+ GSL_ERROR_NULL ("failed to allocate space for cosines", GSL_ENOMEM);
+ }
+
+ w->gs = (double *) malloc (n * sizeof (double));
+
+ if (w->gs == 0)
+ {
+ free (w->gc);
+ free (w->tau);
+ free (w->sd);
+ free (w->d);
+ free (w);
+ GSL_ERROR_NULL ("failed to allocate space for sines", GSL_ENOMEM);
+ }
+
+ w->size = n;
+
+ return w;
+}
+
+void
+gsl_eigen_hermv_free (gsl_eigen_hermv_workspace * w)
+{
+ free (w->gs);
+ free (w->gc);
+ free (w->tau);
+ free (w->sd);
+ free (w->d);
+ free (w);
+}
+
+int
+gsl_eigen_hermv (gsl_matrix_complex * A, gsl_vector * eval,
+ gsl_matrix_complex * evec,
+ gsl_eigen_hermv_workspace * w)
+{
+ if (A->size1 != A->size2)
+ {
+ GSL_ERROR ("matrix must be square to compute eigenvalues", GSL_ENOTSQR);
+ }
+ else if (eval->size != A->size1)
+ {
+ GSL_ERROR ("eigenvalue vector must match matrix size", GSL_EBADLEN);
+ }
+ else if (evec->size1 != A->size1 || evec->size2 != A->size1)
+ {
+ GSL_ERROR ("eigenvector matrix must match matrix size", GSL_EBADLEN);
+ }
+ else
+ {
+ const size_t N = A->size1;
+ double *const d = w->d;
+ double *const sd = w->sd;
+
+ size_t a, b;
+
+ /* handle special case */
+
+ if (N == 1)
+ {
+ gsl_complex A00 = gsl_matrix_complex_get (A, 0, 0);
+ gsl_vector_set (eval, 0, GSL_REAL(A00));
+ gsl_matrix_complex_set (evec, 0, 0, GSL_COMPLEX_ONE);
+ return GSL_SUCCESS;
+ }
+
+ /* Transform the matrix into a symmetric tridiagonal form */
+
+ {
+ gsl_vector_view d_vec = gsl_vector_view_array (d, N);
+ gsl_vector_view sd_vec = gsl_vector_view_array (sd, N - 1);
+ gsl_vector_complex_view tau_vec = gsl_vector_complex_view_array (w->tau, N-1);
+ gsl_linalg_hermtd_decomp (A, &tau_vec.vector);
+ gsl_linalg_hermtd_unpack (A, &tau_vec.vector, evec, &d_vec.vector, &sd_vec.vector);
+ }
+
+ /* Make an initial pass through the tridiagonal decomposition
+ to remove off-diagonal elements which are effectively zero */
+
+ chop_small_elements (N, d, sd);
+
+ /* Progressively reduce the matrix until it is diagonal */
+
+ b = N - 1;
+
+ while (b > 0)
+ {
+ if (sd[b - 1] == 0.0 || isnan(sd[b - 1]))
+ {
+ b--;
+ continue;
+ }
+
+ /* Find the largest unreduced block (a,b) starting from b
+ and working backwards */
+
+ a = b - 1;
+
+ while (a > 0)
+ {
+ if (sd[a - 1] == 0.0)
+ {
+ break;
+ }
+ a--;
+ }
+
+ {
+ size_t i;
+ const size_t n_block = b - a + 1;
+ double *d_block = d + a;
+ double *sd_block = sd + a;
+ double * const gc = w->gc;
+ double * const gs = w->gs;
+
+ /* apply QR reduction with implicit deflation to the
+ unreduced block */
+
+ qrstep (n_block, d_block, sd_block, gc, gs);
+
+ /* Apply Givens rotation Gij(c,s) to matrix Q, Q <- Q G */
+
+ for (i = 0; i < n_block - 1; i++)
+ {
+ const double c = gc[i], s = gs[i];
+ size_t k;
+
+ for (k = 0; k < N; k++)
+ {
+ gsl_complex qki = gsl_matrix_complex_get (evec, k, a + i);
+ gsl_complex qkj = gsl_matrix_complex_get (evec, k, a + i + 1);
+ /* qki <= qki * c - qkj * s */
+ /* qkj <= qki * s + qkj * c */
+ gsl_complex x1 = gsl_complex_mul_real(qki, c);
+ gsl_complex y1 = gsl_complex_mul_real(qkj, -s);
+
+ gsl_complex x2 = gsl_complex_mul_real(qki, s);
+ gsl_complex y2 = gsl_complex_mul_real(qkj, c);
+
+ gsl_complex qqki = gsl_complex_add(x1, y1);
+ gsl_complex qqkj = gsl_complex_add(x2, y2);
+
+ gsl_matrix_complex_set (evec, k, a + i, qqki);
+ gsl_matrix_complex_set (evec, k, a + i + 1, qqkj);
+ }
+ }
+
+ /* remove any small off-diagonal elements */
+
+ chop_small_elements (n_block, d_block, sd_block);
+ }
+ }
+
+ {
+ gsl_vector_view d_vec = gsl_vector_view_array (d, N);
+ gsl_vector_memcpy (eval, &d_vec.vector);
+ }
+
+ return GSL_SUCCESS;
+ }
+}
diff --git a/gsl-1.9/eigen/jacobi.c b/gsl-1.9/eigen/jacobi.c
new file mode 100644
index 0000000..7f4a4dc
--- /dev/null
+++ b/gsl-1.9/eigen/jacobi.c
@@ -0,0 +1,259 @@
+/* eigen/jacobi.c
+ *
+ * Copyright (C) 2004 Brian Gough, Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_eigen.h>
+
+/* Algorithm 8.4.3 - Cyclic Jacobi. Golub & Van Loan, Matrix Computations */
+
+static inline double
+symschur2 (gsl_matrix * A, size_t p, size_t q, double *c, double *s)
+{
+ double Apq = gsl_matrix_get (A, p, q);
+
+ if (Apq != 0.0)
+ {
+ double App = gsl_matrix_get (A, p, p);
+ double Aqq = gsl_matrix_get (A, q, q);
+ double tau = (Aqq - App) / (2.0 * Apq);
+ double t, c1;
+
+ if (tau >= 0.0)
+ {
+ t = 1.0 / (tau + hypot (1.0, tau));
+ }
+ else
+ {
+ t = -1.0 / (-tau + hypot (1.0, tau));
+ }
+
+ c1 = 1.0 / hypot (1.0, t);
+
+ *c = c1;
+ *s = t * c1;
+ }
+ else
+ {
+ *c = 1.0;
+ *s = 0.0;
+ }
+
+ /* reduction in off(A) is 2*(A_pq)^2 */
+
+ return fabs (Apq);
+}
+
+inline static void
+apply_jacobi_L (gsl_matrix * A, size_t p, size_t q, double c, double s)
+{
+ size_t j;
+ const size_t N = A->size2;
+
+ /* Apply rotation to matrix A, A' = J^T A */
+
+ for (j = 0; j < N; j++)
+ {
+ double Apj = gsl_matrix_get (A, p, j);
+ double Aqj = gsl_matrix_get (A, q, j);
+ gsl_matrix_set (A, p, j, Apj * c - Aqj * s);
+ gsl_matrix_set (A, q, j, Apj * s + Aqj * c);
+ }
+}
+
+inline static void
+apply_jacobi_R (gsl_matrix * A, size_t p, size_t q, double c, double s)
+{
+ size_t i;
+ const size_t M = A->size1;
+
+ /* Apply rotation to matrix A, A' = A J */
+
+ for (i = 0; i < M; i++)
+ {
+ double Aip = gsl_matrix_get (A, i, p);
+ double Aiq = gsl_matrix_get (A, i, q);
+ gsl_matrix_set (A, i, p, Aip * c - Aiq * s);
+ gsl_matrix_set (A, i, q, Aip * s + Aiq * c);
+ }
+}
+
+inline static double
+norm (gsl_matrix * A)
+{
+ size_t i, j, M = A->size1, N = A->size2;
+ double sum = 0.0, scale = 0.0, ssq = 1.0;
+
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ double Aij = gsl_matrix_get (A, i, j);
+
+ if (Aij != 0.0)
+ {
+ double ax = fabs (Aij);
+
+ if (scale < ax)
+ {
+ ssq = 1.0 + ssq * (scale / ax) * (scale / ax);
+ scale = ax;
+ }
+ else
+ {
+ ssq += (ax / scale) * (ax / scale);
+ }
+ }
+
+ }
+ }
+
+ sum = scale * sqrt (ssq);
+
+ return sum;
+}
+
+int
+gsl_eigen_jacobi (gsl_matrix * a,
+ gsl_vector * eval,
+ gsl_matrix * evec, unsigned int max_rot, unsigned int *nrot)
+{
+ size_t i, p, q;
+ const size_t M = a->size1, N = a->size2;
+ double red, redsum = 0.0;
+
+ if (M != N)
+ {
+ GSL_ERROR ("eigenproblem requires square matrix", GSL_ENOTSQR);
+ }
+ else if (M != evec->size1 || M != evec->size2)
+ {
+ GSL_ERROR ("eigenvector matrix must match input matrix", GSL_EBADLEN);
+ }
+ else if (M != eval->size)
+ {
+ GSL_ERROR ("eigenvalue vector must match input matrix", GSL_EBADLEN);
+ }
+
+ gsl_vector_set_zero (eval);
+ gsl_matrix_set_identity (evec);
+
+ for (i = 0; i < max_rot; i++)
+ {
+ double nrm = norm (a);
+
+ if (nrm == 0.0)
+ break;
+
+ for (p = 0; p < N; p++)
+ {
+ for (q = p + 1; q < N; q++)
+ {
+ double c, s;
+
+ red = symschur2 (a, p, q, &c, &s);
+ redsum += red;
+
+ /* Compute A <- J^T A J */
+ apply_jacobi_L (a, p, q, c, s);
+ apply_jacobi_R (a, p, q, c, s);
+
+ /* Compute V <- V J */
+ apply_jacobi_R (evec, p, q, c, s);
+ }
+ }
+ }
+
+ *nrot = i;
+
+ for (p = 0; p < N; p++)
+ {
+ double ep = gsl_matrix_get (a, p, p);
+ gsl_vector_set (eval, p, ep);
+ }
+
+ if (i == max_rot)
+ {
+ return GSL_EMAXITER;
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+gsl_eigen_invert_jacobi (const gsl_matrix * a,
+ gsl_matrix * ainv, unsigned int max_rot)
+{
+ if (a->size1 != a->size2 || ainv->size1 != ainv->size2)
+ {
+ GSL_ERROR("jacobi method requires square matrix", GSL_ENOTSQR);
+ }
+ else if (a->size1 != ainv->size2)
+ {
+ GSL_ERROR ("inverse matrix must match input matrix", GSL_EBADLEN);
+ }
+
+ {
+ const size_t n = a->size2;
+ size_t i,j,k;
+ unsigned int nrot = 0;
+ int status;
+
+ gsl_vector * eval = gsl_vector_alloc(n);
+ gsl_matrix * evec = gsl_matrix_alloc(n, n);
+ gsl_matrix * tmp = gsl_matrix_alloc(n, n);
+
+ gsl_matrix_memcpy (tmp, a);
+
+ status = gsl_eigen_jacobi(tmp, eval, evec, max_rot, &nrot);
+
+ for(i=0; i<n; i++)
+ {
+ for(j=0; j<n; j++)
+ {
+ double ainv_ij = 0.0;
+
+ for(k = 0; k<n; k++)
+ {
+ double f = 1.0 / gsl_vector_get(eval, k);
+ double vik = gsl_matrix_get (evec, i, k);
+ double vjk = gsl_matrix_get (evec, j, k);
+ ainv_ij += vik * vjk * f;
+ }
+ gsl_matrix_set (ainv, i, j, ainv_ij);
+ }
+ }
+
+ gsl_vector_free(eval);
+ gsl_matrix_free(evec);
+ gsl_matrix_free(tmp);
+
+ if (status)
+ {
+ return status;
+ }
+ else
+ {
+ return GSL_SUCCESS;
+ }
+ }
+}
diff --git a/gsl-1.9/eigen/nonsymm.c b/gsl-1.9/eigen/nonsymm.c
new file mode 100644
index 0000000..de9088a
--- /dev/null
+++ b/gsl-1.9/eigen/nonsymm.c
@@ -0,0 +1,285 @@
+/* eigen/nonsymm.c
+ *
+ * Copyright (C) 2006 Patrick Alken
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <math.h>
+#include <gsl/gsl_eigen.h>
+#include <gsl/gsl_linalg.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_blas.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_vector_complex.h>
+#include <gsl/gsl_matrix.h>
+
+/*
+ * This module computes the eigenvalues of a real nonsymmetric
+ * matrix, using the double shift Francis method.
+ *
+ * See the references in francis.c.
+ *
+ * This module gets the matrix ready by balancing it and
+ * reducing it to Hessenberg form before passing it to the
+ * francis module.
+ */
+
+/*
+gsl_eigen_nonsymm_alloc()
+
+Allocate a workspace for solving the nonsymmetric eigenvalue problem.
+The size of this workspace is O(2n)
+
+Inputs: n - size of matrix
+
+Return: pointer to workspace
+*/
+
+gsl_eigen_nonsymm_workspace *
+gsl_eigen_nonsymm_alloc(const size_t n)
+{
+ gsl_eigen_nonsymm_workspace *w;
+
+ if (n == 0)
+ {
+ GSL_ERROR_NULL ("matrix dimension must be positive integer",
+ GSL_EINVAL);
+ }
+
+ w = (gsl_eigen_nonsymm_workspace *)
+ malloc (sizeof (gsl_eigen_nonsymm_workspace));
+
+ if (w == 0)
+ {
+ GSL_ERROR_NULL ("failed to allocate space for workspace", GSL_ENOMEM);
+ }
+
+ w->size = n;
+ w->Z = NULL;
+ w->do_balance = 0;
+
+ w->diag = gsl_vector_alloc(n);
+
+ if (w->diag == 0)
+ {
+ GSL_ERROR_NULL ("failed to allocate space for balancing vector", GSL_ENOMEM);
+ }
+
+ w->tau = gsl_vector_alloc(n);
+
+ if (w->tau == 0)
+ {
+ GSL_ERROR_NULL ("failed to allocate space for hessenberg coefficients", GSL_ENOMEM);
+ }
+
+ w->francis_workspace_p = gsl_eigen_francis_alloc();
+
+ if (w->francis_workspace_p == 0)
+ {
+ GSL_ERROR_NULL ("failed to allocate space for francis workspace", GSL_ENOMEM);
+ }
+
+ return (w);
+} /* gsl_eigen_nonsymm_alloc() */
+
+/*
+gsl_eigen_nonsymm_free()
+ Free workspace w
+*/
+
+void
+gsl_eigen_nonsymm_free (gsl_eigen_nonsymm_workspace * w)
+{
+ gsl_vector_free(w->tau);
+
+ gsl_vector_free(w->diag);
+
+ gsl_eigen_francis_free(w->francis_workspace_p);
+
+ free(w);
+} /* gsl_eigen_nonsymm_free() */
+
+/*
+gsl_eigen_nonsymm_params()
+ Set some parameters which define how we solve the eigenvalue
+problem.
+
+Inputs: compute_t - 1 if we want to compute T, 0 if not
+ balance - 1 if we want to balance the matrix, 0 if not
+ w - nonsymm workspace
+*/
+
+void
+gsl_eigen_nonsymm_params (const int compute_t, const int balance,
+ gsl_eigen_nonsymm_workspace *w)
+{
+ gsl_eigen_francis_T(compute_t, w->francis_workspace_p);
+ w->do_balance = balance;
+} /* gsl_eigen_nonsymm_params() */
+
+/*
+gsl_eigen_nonsymm()
+
+Solve the nonsymmetric eigenvalue problem
+
+A x = \lambda x
+
+for the eigenvalues \lambda using the Francis method.
+
+Here we compute the real Schur form
+
+T = Z^t A Z
+
+with the diagonal blocks of T giving us the eigenvalues.
+Z is a matrix of Schur vectors which is not computed by
+this algorithm. See gsl_eigen_nonsymm_Z().
+
+Inputs: A - general real matrix
+ eval - where to store eigenvalues
+ w - workspace
+
+Return: success or error
+
+Notes: If T is computed, it is stored in A on output. Otherwise
+ the diagonal of A contains the 1-by-1 and 2-by-2 eigenvalue
+ blocks.
+*/
+
+int
+gsl_eigen_nonsymm (gsl_matrix * A, gsl_vector_complex * eval,
+ gsl_eigen_nonsymm_workspace * w)
+{
+ const size_t N = A->size1;
+
+ /* check matrix and vector sizes */
+
+ if (N != A->size2)
+ {
+ GSL_ERROR ("matrix must be square to compute eigenvalues", GSL_ENOTSQR);
+ }
+ else if (eval->size != N)
+ {
+ GSL_ERROR ("eigenvalue vector must match matrix size", GSL_EBADLEN);
+ }
+ else
+ {
+ int s;
+
+ if (w->do_balance)
+ {
+ /* balance the matrix */
+ gsl_linalg_balance_matrix(A, w->diag);
+ }
+
+ /* compute the Hessenberg reduction of A */
+ gsl_linalg_hessenberg(A, w->tau);
+
+ if (w->Z)
+ {
+ /*
+ * initialize the matrix Z to U, which is the matrix used
+ * to construct the Hessenberg reduction.
+ */
+
+ /* compute U and store it in Z */
+ gsl_linalg_hessenberg_unpack(A, w->tau, w->Z);
+
+ /* find the eigenvalues and Schur vectors */
+ s = gsl_eigen_francis_Z(A, eval, w->Z, w->francis_workspace_p);
+
+ if (w->do_balance)
+ {
+ /*
+ * The Schur vectors in Z are the vectors for the balanced
+ * matrix. We now must undo the balancing to get the
+ * vectors for the original matrix A.
+ */
+ gsl_linalg_balance_accum(w->Z, w->diag);
+ }
+ }
+ else
+ {
+ /* find the eigenvalues only */
+ s = gsl_eigen_francis(A, eval, w->francis_workspace_p);
+ }
+
+ w->n_evals = w->francis_workspace_p->n_evals;
+
+ return s;
+ }
+} /* gsl_eigen_nonsymm() */
+
+/*
+gsl_eigen_nonsymm_Z()
+
+Solve the nonsymmetric eigenvalue problem
+
+A x = \lambda x
+
+for the eigenvalues \lambda.
+
+Here we compute the real Schur form
+
+T = Z^t A Z
+
+with the diagonal blocks of T giving us the eigenvalues.
+Z is the matrix of Schur vectors.
+
+Inputs: A - general real matrix
+ eval - where to store eigenvalues
+ Z - where to store Schur vectors
+ w - workspace
+
+Return: success or error
+
+Notes: If T is computed, it is stored in A on output. Otherwise
+ the diagonal of A contains the 1-by-1 and 2-by-2 eigenvalue
+ blocks.
+*/
+
+int
+gsl_eigen_nonsymm_Z (gsl_matrix * A, gsl_vector_complex * eval,
+ gsl_matrix * Z, gsl_eigen_nonsymm_workspace * w)
+{
+ /* check matrix and vector sizes */
+
+ if (A->size1 != A->size2)
+ {
+ GSL_ERROR ("matrix must be square to compute eigenvalues", GSL_ENOTSQR);
+ }
+ else if (eval->size != A->size1)
+ {
+ GSL_ERROR ("eigenvalue vector must match matrix size", GSL_EBADLEN);
+ }
+ else if ((Z->size1 != Z->size2) || (Z->size1 != A->size1))
+ {
+ GSL_ERROR ("Z matrix has wrong dimensions", GSL_EBADLEN);
+ }
+ else
+ {
+ int s;
+
+ w->Z = Z;
+
+ s = gsl_eigen_nonsymm(A, eval, w);
+
+ w->Z = NULL;
+
+ return s;
+ }
+} /* gsl_eigen_nonsymm_Z() */
diff --git a/gsl-1.9/eigen/nonsymmv.c b/gsl-1.9/eigen/nonsymmv.c
new file mode 100644
index 0000000..bcd2589
--- /dev/null
+++ b/gsl-1.9/eigen/nonsymmv.c
@@ -0,0 +1,1470 @@
+/* eigen/nonsymmv.c
+ *
+ * Copyright (C) 2006 Patrick Alken
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <math.h>
+
+#include <gsl/gsl_complex.h>
+#include <gsl/gsl_complex_math.h>
+#include <gsl/gsl_eigen.h>
+#include <gsl/gsl_linalg.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_blas.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_vector_complex.h>
+#include <gsl/gsl_matrix.h>
+
+/*
+ * This module computes the eigenvalues and eigenvectors of a real
+ * nonsymmetric matrix.
+ *
+ * This file contains routines based on original code from LAPACK
+ * which is distributed under the modified BSD license. The LAPACK
+ * routines used are DTREVC and DLALN2.
+ */
+
+#define GSL_NONSYMMV_SMLNUM (2.0 * GSL_DBL_MIN)
+#define GSL_NONSYMMV_BIGNUM ((1.0 - GSL_DBL_EPSILON) / GSL_NONSYMMV_SMLNUM)
+
+static void nonsymmv_get_right_eigenvectors(gsl_matrix *T, gsl_matrix *Z,
+ gsl_vector_complex *eval,
+ gsl_matrix_complex *evec,
+ gsl_eigen_nonsymmv_workspace *w);
+static inline void nonsymmv_solve_equation(gsl_matrix *A, double z,
+ gsl_vector *b, gsl_vector *x,
+ double *s, double *xnorm,
+ double smin);
+static inline void nonsymmv_solve_equation_z(gsl_matrix *A, gsl_complex *z,
+ gsl_vector_complex *b,
+ gsl_vector_complex *x,
+ double *s, double *xnorm,
+ double smin);
+static void nonsymmv_normalize_eigenvectors(gsl_vector_complex *eval,
+ gsl_matrix_complex *evec);
+
+/*
+gsl_eigen_nonsymmv_alloc()
+
+Allocate a workspace for solving the nonsymmetric eigenvalue problem.
+The size of this workspace is O(5n).
+
+Inputs: n - size of matrices
+
+Return: pointer to workspace
+*/
+
+gsl_eigen_nonsymmv_workspace *
+gsl_eigen_nonsymmv_alloc(const size_t n)
+{
+ gsl_eigen_nonsymmv_workspace *w;
+
+ if (n == 0)
+ {
+ GSL_ERROR_NULL ("matrix dimension must be positive integer",
+ GSL_EINVAL);
+ }
+
+ w = (gsl_eigen_nonsymmv_workspace *)
+ malloc (sizeof (gsl_eigen_nonsymmv_workspace));
+
+ if (w == 0)
+ {
+ GSL_ERROR_NULL ("failed to allocate space for workspace", GSL_ENOMEM);
+ }
+
+ w->size = n;
+ w->Z = NULL;
+ w->nonsymm_workspace_p = gsl_eigen_nonsymm_alloc(n);
+
+ if (w->nonsymm_workspace_p == 0)
+ {
+ GSL_ERROR_NULL ("failed to allocate space for nonsymm workspace", GSL_ENOMEM);
+ }
+
+ /*
+ * set parameters to compute the full Schur form T and balance
+ * the matrices
+ */
+ gsl_eigen_nonsymm_params(1, 1, w->nonsymm_workspace_p);
+
+ w->work = gsl_vector_alloc(n);
+ w->work2 = gsl_vector_alloc(n);
+ w->work3 = gsl_vector_alloc(n);
+ if (w->work == 0 || w->work2 == 0 || w->work3 == 0)
+ {
+ GSL_ERROR_NULL ("failed to allocate space for nonsymmv additional workspace", GSL_ENOMEM);
+ }
+
+ return (w);
+} /* gsl_eigen_nonsymmv_alloc() */
+
+/*
+gsl_eigen_nonsymmv_free()
+ Free workspace w
+*/
+
+void
+gsl_eigen_nonsymmv_free (gsl_eigen_nonsymmv_workspace * w)
+{
+ gsl_eigen_nonsymm_free(w->nonsymm_workspace_p);
+ gsl_vector_free(w->work);
+ gsl_vector_free(w->work2);
+ gsl_vector_free(w->work3);
+
+ free(w);
+} /* gsl_eigen_nonsymmv_free() */
+
+/*
+gsl_eigen_nonsymmv()
+
+Solve the nonsymmetric eigensystem problem
+
+A x = \lambda x
+
+for the eigenvalues \lambda and right eigenvectors x
+
+Inputs: A - general real matrix
+ eval - where to store eigenvalues
+ evec - where to store eigenvectors
+ w - workspace
+
+Return: success or error
+*/
+
+int
+gsl_eigen_nonsymmv (gsl_matrix * A, gsl_vector_complex * eval,
+ gsl_matrix_complex * evec,
+ gsl_eigen_nonsymmv_workspace * w)
+{
+ const size_t N = A->size1;
+
+ /* check matrix and vector sizes */
+
+ if (N != A->size2)
+ {
+ GSL_ERROR ("matrix must be square to compute eigenvalues", GSL_ENOTSQR);
+ }
+ else if (eval->size != N)
+ {
+ GSL_ERROR ("eigenvalue vector must match matrix size", GSL_EBADLEN);
+ }
+ else if (evec->size1 != evec->size2)
+ {
+ GSL_ERROR ("eigenvector matrix must be square", GSL_ENOTSQR);
+ }
+ else if (evec->size1 != N)
+ {
+ GSL_ERROR ("eigenvector matrix has wrong size", GSL_EBADLEN);
+ }
+ else
+ {
+ int s;
+ gsl_matrix Z;
+
+ /*
+ * We need a place to store the Schur vectors, so we will
+ * treat evec as a real matrix and store them in the left
+ * half - the factor of 2 in the tda corresponds to the
+ * complex multiplicity
+ */
+ Z.size1 = N;
+ Z.size2 = N;
+ Z.tda = 2 * N;
+ Z.data = evec->data;
+ Z.block = 0;
+ Z.owner = 0;
+
+ /* compute eigenvalues, Schur form, and Schur vectors */
+ s = gsl_eigen_nonsymm_Z(A, eval, &Z, w->nonsymm_workspace_p);
+
+ if (w->Z)
+ {
+ /*
+ * save the Schur vectors in user supplied matrix, since
+ * they will be destroyed when computing eigenvectors
+ */
+ gsl_matrix_memcpy(w->Z, &Z);
+ }
+
+ /* only compute eigenvectors if we found all eigenvalues */
+ if (s == GSL_SUCCESS)
+ {
+ /* compute eigenvectors */
+ nonsymmv_get_right_eigenvectors(A, &Z, eval, evec, w);
+
+ /* normalize so that Euclidean norm is 1 */
+ nonsymmv_normalize_eigenvectors(eval, evec);
+ }
+
+ return s;
+ }
+} /* gsl_eigen_nonsymmv() */
+
+/*
+gsl_eigen_nonsymmv_Z()
+ Compute eigenvalues and eigenvectors of a real nonsymmetric matrix
+and also save the Schur vectors. See comments in gsl_eigen_nonsymm_Z
+for more information.
+
+Inputs: A - real nonsymmetric matrix
+ eval - where to store eigenvalues
+ evec - where to store eigenvectors
+ Z - where to store Schur vectors
+ w - nonsymmv workspace
+
+Return: success or error
+*/
+
+int
+gsl_eigen_nonsymmv_Z (gsl_matrix * A, gsl_vector_complex * eval,
+ gsl_matrix_complex * evec, gsl_matrix * Z,
+ gsl_eigen_nonsymmv_workspace * w)
+{
+ /* check matrix and vector sizes */
+
+ if (A->size1 != A->size2)
+ {
+ GSL_ERROR ("matrix must be square to compute eigenvalues/eigenvectors", GSL_ENOTSQR);
+ }
+ else if (eval->size != A->size1)
+ {
+ GSL_ERROR ("eigenvalue vector must match matrix size", GSL_EBADLEN);
+ }
+ else if (evec->size1 != evec->size2)
+ {
+ GSL_ERROR ("eigenvector matrix must be square", GSL_ENOTSQR);
+ }
+ else if (evec->size1 != A->size1)
+ {
+ GSL_ERROR ("eigenvector matrix has wrong size", GSL_EBADLEN);
+ }
+ else if ((Z->size1 != Z->size2) || (Z->size1 != A->size1))
+ {
+ GSL_ERROR ("Z matrix has wrong dimensions", GSL_EBADLEN);
+ }
+ else
+ {
+ int s;
+
+ w->Z = Z;
+
+ s = gsl_eigen_nonsymmv(A, eval, evec, w);
+
+ w->Z = NULL;
+
+ return s;
+ }
+} /* gsl_eigen_nonsymmv_Z() */
+
+/********************************************
+ * INTERNAL ROUTINES *
+ ********************************************/
+
+/*
+nonsymmv_get_right_eigenvectors()
+ Compute the right eigenvectors of the Schur form T and then
+backtransform them using the Schur vectors to get right eigenvectors of
+the original matrix.
+
+Inputs: T - Schur form
+ Z - Schur vectors
+ eval - where to store eigenvalues (to ensure that the
+ correct eigenvalue is stored in the same position
+ as the eigenvectors)
+ evec - where to store eigenvectors
+ w - nonsymmv workspace
+
+Return: none
+
+Notes: 1) based on LAPACK routine DTREVC - the algorithm used is
+ backsubstitution on the upper quasi triangular system T
+ followed by backtransformation by Z to get vectors of the
+ original matrix.
+
+ 2) The Schur vectors in Z are destroyed and replaced with
+ eigenvectors stored with the same storage scheme as DTREVC.
+ The eigenvectors are also stored in 'evec'
+
+ 3) The matrix T is unchanged on output
+
+ 4) Each eigenvector is normalized so that the element of
+ largest magnitude has magnitude 1; here the magnitude of
+ a complex number (x,y) is taken to be |x| + |y|
+*/
+
+static void
+nonsymmv_get_right_eigenvectors(gsl_matrix *T, gsl_matrix *Z,
+ gsl_vector_complex *eval,
+ gsl_matrix_complex *evec,
+ gsl_eigen_nonsymmv_workspace *w)
+{
+ const size_t N = T->size1;
+ const double smlnum = GSL_DBL_MIN * N / GSL_DBL_EPSILON;
+ const double bignum = (1.0 - GSL_DBL_EPSILON) / smlnum;
+ int i; /* looping */
+ size_t iu, /* looping */
+ ju,
+ ii;
+ gsl_complex lambda; /* current eigenvalue */
+ double lambda_re, /* Re(lambda) */
+ lambda_im; /* Im(lambda) */
+ gsl_matrix_view Tv, /* temporary views */
+ Zv;
+ gsl_vector_view y, /* temporary views */
+ y2,
+ ev,
+ ev2;
+ double dat[4], /* scratch arrays */
+ dat_X[4];
+ double scale; /* scale factor */
+ double xnorm; /* |X| */
+ gsl_vector_complex_view ecol, /* column of evec */
+ ecol2;
+ int complex_pair; /* complex eigenvalue pair? */
+ double smin;
+
+ /*
+ * Compute 1-norm of each column of upper triangular part of T
+ * to control overflow in triangular solver
+ */
+
+ gsl_vector_set(w->work3, 0, 0.0);
+ for (ju = 1; ju < N; ++ju)
+ {
+ gsl_vector_set(w->work3, ju, 0.0);
+ for (iu = 0; iu < ju; ++iu)
+ {
+ gsl_vector_set(w->work3, ju,
+ gsl_vector_get(w->work3, ju) +
+ fabs(gsl_matrix_get(T, iu, ju)));
+ }
+ }
+
+ for (i = (int) N - 1; i >= 0; --i)
+ {
+ iu = (size_t) i;
+
+ /* get current eigenvalue and store it in lambda */
+ lambda_re = gsl_matrix_get(T, iu, iu);
+
+ if (iu != 0 && gsl_matrix_get(T, iu, iu - 1) != 0.0)
+ {
+ lambda_im = sqrt(fabs(gsl_matrix_get(T, iu, iu - 1))) *
+ sqrt(fabs(gsl_matrix_get(T, iu - 1, iu)));
+ }
+ else
+ {
+ lambda_im = 0.0;
+ }
+
+ GSL_SET_COMPLEX(&lambda, lambda_re, lambda_im);
+
+ smin = GSL_MAX(GSL_DBL_EPSILON * (fabs(lambda_re) + fabs(lambda_im)),
+ smlnum);
+ smin = GSL_MAX(smin, GSL_NONSYMMV_SMLNUM);
+
+ if (lambda_im == 0.0)
+ {
+ int k, l;
+ gsl_vector_view bv, xv;
+
+ /* real eigenvector */
+
+ /*
+ * The ordering of eigenvalues in 'eval' is arbitrary and
+ * does not necessarily follow the Schur form T, so store
+ * lambda in the right slot in eval to ensure it corresponds
+ * to the eigenvector we are about to compute
+ */
+ gsl_vector_complex_set(eval, iu, lambda);
+
+ /*
+ * We need to solve the system:
+ *
+ * (T(1:iu-1, 1:iu-1) - lambda*I)*X = -T(1:iu-1,iu)
+ */
+
+ /* construct right hand side */
+ for (k = 0; k < i; ++k)
+ {
+ gsl_vector_set(w->work,
+ (size_t) k,
+ -gsl_matrix_get(T, (size_t) k, iu));
+ }
+
+ gsl_vector_set(w->work, iu, 1.0);
+
+ for (l = i - 1; l >= 0; --l)
+ {
+ size_t lu = (size_t) l;
+
+ if (lu == 0)
+ complex_pair = 0;
+ else
+ complex_pair = gsl_matrix_get(T, lu, lu - 1) != 0.0;
+
+ if (!complex_pair)
+ {
+ double x;
+
+ /*
+ * 1-by-1 diagonal block - solve the system:
+ *
+ * (T_{ll} - lambda)*x = -T_{l(iu)}
+ */
+
+ Tv = gsl_matrix_submatrix(T, lu, lu, 1, 1);
+ bv = gsl_vector_view_array(dat, 1);
+ gsl_vector_set(&bv.vector, 0,
+ gsl_vector_get(w->work, lu));
+ xv = gsl_vector_view_array(dat_X, 1);
+
+ nonsymmv_solve_equation(&Tv.matrix,
+ lambda_re,
+ &bv.vector,
+ &xv.vector,
+ &scale,
+ &xnorm,
+ smin);
+
+ /* scale x to avoid overflow */
+ x = gsl_vector_get(&xv.vector, 0);
+ if (xnorm > 1.0)
+ {
+ if (gsl_vector_get(w->work3, lu) > bignum / xnorm)
+ {
+ x /= xnorm;
+ scale /= xnorm;
+ }
+ }
+
+ if (scale != 1.0)
+ {
+ gsl_vector_view wv;
+
+ wv = gsl_vector_subvector(w->work, 0, iu + 1);
+ gsl_blas_dscal(scale, &wv.vector);
+ }
+
+ gsl_vector_set(w->work, lu, x);
+
+ if (lu > 0)
+ {
+ gsl_vector_view v1, v2;
+
+ /* update right hand side */
+
+ v1 = gsl_matrix_column(T, lu);
+ v1 = gsl_vector_subvector(&v1.vector, 0, lu);
+
+ v2 = gsl_vector_subvector(w->work, 0, lu);
+
+ gsl_blas_daxpy(-x, &v1.vector, &v2.vector);
+ } /* if (l > 0) */
+ } /* if (!complex_pair) */
+ else
+ {
+ double x11, x21;
+
+ /*
+ * 2-by-2 diagonal block
+ */
+
+ Tv = gsl_matrix_submatrix(T, lu - 1, lu - 1, 2, 2);
+ bv = gsl_vector_view_array(dat, 2);
+ gsl_vector_set(&bv.vector, 0,
+ gsl_vector_get(w->work, lu - 1));
+ gsl_vector_set(&bv.vector, 1,
+ gsl_vector_get(w->work, lu));
+ xv = gsl_vector_view_array(dat_X, 2);
+
+ nonsymmv_solve_equation(&Tv.matrix,
+ lambda_re,
+ &bv.vector,
+ &xv.vector,
+ &scale,
+ &xnorm,
+ smin);
+
+ /* scale X(1,1) and X(2,1) to avoid overflow */
+ x11 = gsl_vector_get(&xv.vector, 0);
+ x21 = gsl_vector_get(&xv.vector, 1);
+
+ if (xnorm > 1.0)
+ {
+ double beta;
+
+ beta = GSL_MAX(gsl_vector_get(w->work3, lu - 1),
+ gsl_vector_get(w->work3, lu));
+ if (beta > bignum / xnorm)
+ {
+ x11 /= xnorm;
+ x21 /= xnorm;
+ scale /= xnorm;
+ }
+ }
+
+ /* scale if necessary */
+ if (scale != 1.0)
+ {
+ gsl_vector_view wv;
+
+ wv = gsl_vector_subvector(w->work, 0, iu + 1);
+ gsl_blas_dscal(scale, &wv.vector);
+ }
+
+ gsl_vector_set(w->work, lu - 1, x11);
+ gsl_vector_set(w->work, lu, x21);
+
+ /* update right hand side */
+ if (lu > 1)
+ {
+ gsl_vector_view v1, v2;
+
+ v1 = gsl_matrix_column(T, lu - 1);
+ v1 = gsl_vector_subvector(&v1.vector, 0, lu - 1);
+ v2 = gsl_vector_subvector(w->work, 0, lu - 1);
+ gsl_blas_daxpy(-x11, &v1.vector, &v2.vector);
+
+ v1 = gsl_matrix_column(T, lu);
+ v1 = gsl_vector_subvector(&v1.vector, 0, lu - 1);
+ gsl_blas_daxpy(-x21, &v1.vector, &v2.vector);
+ }
+
+ --l;
+ } /* if (complex_pair) */
+ } /* for (l = i - 1; l >= 0; --l) */
+
+ /*
+ * At this point, w->work is an eigenvector of the
+ * Schur form T. To get an eigenvector of the original
+ * matrix, we multiply on the left by Z, the matrix of
+ * Schur vectors
+ */
+
+ ecol = gsl_matrix_complex_column(evec, iu);
+ y = gsl_matrix_column(Z, iu);
+
+ if (iu > 0)
+ {
+ gsl_vector_view x;
+
+ Zv = gsl_matrix_submatrix(Z, 0, 0, N, iu);
+
+ x = gsl_vector_subvector(w->work, 0, iu);
+
+ /* compute Z * w->work and store it in Z(:,iu) */
+ gsl_blas_dgemv(CblasNoTrans,
+ 1.0,
+ &Zv.matrix,
+ &x.vector,
+ gsl_vector_get(w->work, iu),
+ &y.vector);
+ } /* if (iu > 0) */
+
+ /* store eigenvector into evec */
+
+ ev = gsl_vector_complex_real(&ecol.vector);
+ ev2 = gsl_vector_complex_imag(&ecol.vector);
+
+ scale = 0.0;
+ for (ii = 0; ii < N; ++ii)
+ {
+ double a = gsl_vector_get(&y.vector, ii);
+
+ /* store real part of eigenvector */
+ gsl_vector_set(&ev.vector, ii, a);
+
+ /* set imaginary part to 0 */
+ gsl_vector_set(&ev2.vector, ii, 0.0);
+
+ if (fabs(a) > scale)
+ scale = fabs(a);
+ }
+
+ if (scale != 0.0)
+ scale = 1.0 / scale;
+
+ /* scale by magnitude of largest element */
+ gsl_blas_dscal(scale, &ev.vector);
+ } /* if (GSL_IMAG(lambda) == 0.0) */
+ else
+ {
+ gsl_vector_complex_view bv, xv;
+ size_t k;
+ int l;
+ gsl_complex lambda2;
+
+ /* complex eigenvector */
+
+ /*
+ * Store the complex conjugate eigenvalues in the right
+ * slots in eval
+ */
+ GSL_SET_REAL(&lambda2, GSL_REAL(lambda));
+ GSL_SET_IMAG(&lambda2, -GSL_IMAG(lambda));
+ gsl_vector_complex_set(eval, iu - 1, lambda);
+ gsl_vector_complex_set(eval, iu, lambda2);
+
+ /*
+ * First solve:
+ *
+ * [ T(i:i+1,i:i+1) - lambda*I ] * X = 0
+ */
+
+ if (fabs(gsl_matrix_get(T, iu - 1, iu)) >=
+ fabs(gsl_matrix_get(T, iu, iu - 1)))
+ {
+ gsl_vector_set(w->work, iu - 1, 1.0);
+ gsl_vector_set(w->work2, iu,
+ lambda_im / gsl_matrix_get(T, iu - 1, iu));
+ }
+ else
+ {
+ gsl_vector_set(w->work, iu - 1,
+ -lambda_im / gsl_matrix_get(T, iu, iu - 1));
+ gsl_vector_set(w->work2, iu, 1.0);
+ }
+ gsl_vector_set(w->work, iu, 0.0);
+ gsl_vector_set(w->work2, iu - 1, 0.0);
+
+ /* construct right hand side */
+ for (k = 0; k < iu - 1; ++k)
+ {
+ gsl_vector_set(w->work, k,
+ -gsl_vector_get(w->work, iu - 1) *
+ gsl_matrix_get(T, k, iu - 1));
+ gsl_vector_set(w->work2, k,
+ -gsl_vector_get(w->work2, iu) *
+ gsl_matrix_get(T, k, iu));
+ }
+
+ /*
+ * We must solve the upper quasi-triangular system:
+ *
+ * [ T(1:i-2,1:i-2) - lambda*I ] * X = s*(work + i*work2)
+ */
+
+ for (l = i - 2; l >= 0; --l)
+ {
+ size_t lu = (size_t) l;
+
+ if (lu == 0)
+ complex_pair = 0;
+ else
+ complex_pair = gsl_matrix_get(T, lu, lu - 1) != 0.0;
+
+ if (!complex_pair)
+ {
+ gsl_complex bval;
+ gsl_complex x;
+
+ /*
+ * 1-by-1 diagonal block - solve the system:
+ *
+ * (T_{ll} - lambda)*x = work + i*work2
+ */
+
+ Tv = gsl_matrix_submatrix(T, lu, lu, 1, 1);
+ bv = gsl_vector_complex_view_array(dat, 1);
+ xv = gsl_vector_complex_view_array(dat_X, 1);
+
+ GSL_SET_COMPLEX(&bval,
+ gsl_vector_get(w->work, lu),
+ gsl_vector_get(w->work2, lu));
+ gsl_vector_complex_set(&bv.vector, 0, bval);
+
+ nonsymmv_solve_equation_z(&Tv.matrix,
+ &lambda,
+ &bv.vector,
+ &xv.vector,
+ &scale,
+ &xnorm,
+ smin);
+
+ if (xnorm > 1.0)
+ {
+ if (gsl_vector_get(w->work3, lu) > bignum / xnorm)
+ {
+ gsl_blas_zdscal(1.0/xnorm, &xv.vector);
+ scale /= xnorm;
+ }
+ }
+
+ /* scale if necessary */
+ if (scale != 1.0)
+ {
+ gsl_vector_view wv;
+
+ wv = gsl_vector_subvector(w->work, 0, iu + 1);
+ gsl_blas_dscal(scale, &wv.vector);
+ wv = gsl_vector_subvector(w->work2, 0, iu + 1);
+ gsl_blas_dscal(scale, &wv.vector);
+ }
+
+ x = gsl_vector_complex_get(&xv.vector, 0);
+ gsl_vector_set(w->work, lu, GSL_REAL(x));
+ gsl_vector_set(w->work2, lu, GSL_IMAG(x));
+
+ /* update the right hand side */
+ if (lu > 0)
+ {
+ gsl_vector_view v1, v2;
+
+ v1 = gsl_matrix_column(T, lu);
+ v1 = gsl_vector_subvector(&v1.vector, 0, lu);
+ v2 = gsl_vector_subvector(w->work, 0, lu);
+ gsl_blas_daxpy(-GSL_REAL(x), &v1.vector, &v2.vector);
+
+ v2 = gsl_vector_subvector(w->work2, 0, lu);
+ gsl_blas_daxpy(-GSL_IMAG(x), &v1.vector, &v2.vector);
+ } /* if (lu > 0) */
+ } /* if (!complex_pair) */
+ else
+ {
+ gsl_complex b1, b2, x1, x2;
+
+ /*
+ * 2-by-2 diagonal block - solve the system
+ */
+
+ Tv = gsl_matrix_submatrix(T, lu - 1, lu - 1, 2, 2);
+ bv = gsl_vector_complex_view_array(dat, 2);
+ xv = gsl_vector_complex_view_array(dat_X, 2);
+
+ GSL_SET_COMPLEX(&b1,
+ gsl_vector_get(w->work, lu - 1),
+ gsl_vector_get(w->work2, lu - 1));
+ GSL_SET_COMPLEX(&b2,
+ gsl_vector_get(w->work, lu),
+ gsl_vector_get(w->work2, lu));
+ gsl_vector_complex_set(&bv.vector, 0, b1);
+ gsl_vector_complex_set(&bv.vector, 1, b2);
+
+ nonsymmv_solve_equation_z(&Tv.matrix,
+ &lambda,
+ &bv.vector,
+ &xv.vector,
+ &scale,
+ &xnorm,
+ smin);
+
+ x1 = gsl_vector_complex_get(&xv.vector, 0);
+ x2 = gsl_vector_complex_get(&xv.vector, 1);
+
+ if (xnorm > 1.0)
+ {
+ double beta;
+
+ beta = GSL_MAX(gsl_vector_get(w->work3, lu - 1),
+ gsl_vector_get(w->work3, lu));
+ if (beta > bignum / xnorm)
+ {
+ gsl_blas_zdscal(1.0/xnorm, &xv.vector);
+ scale /= xnorm;
+ }
+ }
+
+ /* scale if necessary */
+ if (scale != 1.0)
+ {
+ gsl_vector_view wv;
+
+ wv = gsl_vector_subvector(w->work, 0, iu + 1);
+ gsl_blas_dscal(scale, &wv.vector);
+ wv = gsl_vector_subvector(w->work2, 0, iu + 1);
+ gsl_blas_dscal(scale, &wv.vector);
+ }
+ gsl_vector_set(w->work, lu - 1, GSL_REAL(x1));
+ gsl_vector_set(w->work, lu, GSL_REAL(x2));
+ gsl_vector_set(w->work2, lu - 1, GSL_IMAG(x1));
+ gsl_vector_set(w->work2, lu, GSL_IMAG(x2));
+
+ /* update right hand side */
+ if (lu > 1)
+ {
+ gsl_vector_view v1, v2, v3, v4;
+
+ v1 = gsl_matrix_column(T, lu - 1);
+ v1 = gsl_vector_subvector(&v1.vector, 0, lu - 1);
+ v4 = gsl_matrix_column(T, lu);
+ v4 = gsl_vector_subvector(&v4.vector, 0, lu - 1);
+ v2 = gsl_vector_subvector(w->work, 0, lu - 1);
+ v3 = gsl_vector_subvector(w->work2, 0, lu - 1);
+
+ gsl_blas_daxpy(-GSL_REAL(x1), &v1.vector, &v2.vector);
+ gsl_blas_daxpy(-GSL_REAL(x2), &v4.vector, &v2.vector);
+ gsl_blas_daxpy(-GSL_IMAG(x1), &v1.vector, &v3.vector);
+ gsl_blas_daxpy(-GSL_IMAG(x2), &v4.vector, &v3.vector);
+ } /* if (lu > 1) */
+
+ --l;
+ } /* if (complex_pair) */
+ } /* for (l = i - 2; l >= 0; --l) */
+
+ /*
+ * At this point, work + i*work2 is an eigenvector
+ * of T - backtransform to get an eigenvector of the
+ * original matrix
+ */
+
+ y = gsl_matrix_column(Z, iu - 1);
+ y2 = gsl_matrix_column(Z, iu);
+
+ if (iu > 1)
+ {
+ gsl_vector_view x;
+
+ /* compute real part of eigenvectors */
+
+ Zv = gsl_matrix_submatrix(Z, 0, 0, N, iu - 1);
+ x = gsl_vector_subvector(w->work, 0, iu - 1);
+
+ gsl_blas_dgemv(CblasNoTrans,
+ 1.0,
+ &Zv.matrix,
+ &x.vector,
+ gsl_vector_get(w->work, iu - 1),
+ &y.vector);
+
+
+ /* now compute the imaginary part */
+ x = gsl_vector_subvector(w->work2, 0, iu - 1);
+
+ gsl_blas_dgemv(CblasNoTrans,
+ 1.0,
+ &Zv.matrix,
+ &x.vector,
+ gsl_vector_get(w->work2, iu),
+ &y2.vector);
+ }
+ else
+ {
+ gsl_blas_dscal(gsl_vector_get(w->work, iu - 1), &y.vector);
+ gsl_blas_dscal(gsl_vector_get(w->work2, iu), &y2.vector);
+ }
+
+ /*
+ * Now store the eigenvectors into evec - the real parts
+ * are Z(:,iu - 1) and the imaginary parts are
+ * +/- Z(:,iu)
+ */
+
+ /* get views of the two eigenvector slots */
+ ecol = gsl_matrix_complex_column(evec, iu - 1);
+ ecol2 = gsl_matrix_complex_column(evec, iu);
+
+ /*
+ * save imaginary part first as it may get overwritten
+ * when copying the real part due to our storage scheme
+ * in Z/evec
+ */
+ ev = gsl_vector_complex_imag(&ecol.vector);
+ ev2 = gsl_vector_complex_imag(&ecol2.vector);
+ scale = 0.0;
+ for (ii = 0; ii < N; ++ii)
+ {
+ double a = gsl_vector_get(&y2.vector, ii);
+
+ scale = GSL_MAX(scale,
+ fabs(a) + fabs(gsl_vector_get(&y.vector, ii)));
+
+ gsl_vector_set(&ev.vector, ii, a);
+ gsl_vector_set(&ev2.vector, ii, -a);
+ }
+
+ /* now save the real part */
+ ev = gsl_vector_complex_real(&ecol.vector);
+ ev2 = gsl_vector_complex_real(&ecol2.vector);
+ for (ii = 0; ii < N; ++ii)
+ {
+ double a = gsl_vector_get(&y.vector, ii);
+
+ gsl_vector_set(&ev.vector, ii, a);
+ gsl_vector_set(&ev2.vector, ii, a);
+ }
+
+ if (scale != 0.0)
+ scale = 1.0 / scale;
+
+ /* scale by largest element magnitude */
+
+ gsl_blas_zdscal(scale, &ecol.vector);
+ gsl_blas_zdscal(scale, &ecol2.vector);
+
+ /*
+ * decrement i since we took care of two eigenvalues at
+ * the same time
+ */
+ --i;
+ } /* if (GSL_IMAG(lambda) != 0.0) */
+ } /* for (i = (int) N - 1; i >= 0; --i) */
+} /* nonsymmv_get_right_eigenvectors() */
+
+/*
+nonsymmv_solve_equation()
+
+ Solve the equation which comes up in the back substitution
+when computing eigenvectors corresponding to real eigenvalues.
+The equation that is solved is:
+
+(A - z*I)*x = s*b
+
+where
+
+A is n-by-n with n = 1 or 2
+b and x are n-by-1 real vectors
+s is a scaling factor set by this function to prevent overflow in x
+
+Inputs: A - square matrix (n-by-n)
+ z - real scalar (eigenvalue)
+ b - right hand side vector
+ x - (output) where to store solution
+ s - (output) scale factor
+ xnorm - (output) infinity norm of X
+ smin - lower bound on singular values of A - if A - z*I
+ is less than this value, we'll use smin*I instead.
+ This value should be a safe distance above underflow.
+
+Notes: 1) A and b are not changed on output
+ 2) Based on lapack routine DLALN2
+*/
+
+static inline void
+nonsymmv_solve_equation(gsl_matrix *A, double z, gsl_vector *b,
+ gsl_vector *x, double *s, double *xnorm,
+ double smin)
+{
+ size_t N = A->size1;
+ double bnorm;
+ double scale = 1.0;
+
+ if (N == 1)
+ {
+ double c, /* denominator */
+ cnorm; /* |c| */
+
+ /*
+ * we have a 1-by-1 (real) scalar system to solve:
+ *
+ * (a - z)*x = b
+ * with z real
+ */
+
+ /* c = a - z */
+ c = gsl_matrix_get(A, 0, 0) - z;
+ cnorm = fabs(c);
+
+ if (cnorm < smin)
+ {
+ /* set c = smin*I */
+ c = smin;
+ cnorm = smin;
+ }
+
+ /* check scaling for x = b / c */
+ bnorm = fabs(gsl_vector_get(b, 0));
+ if (cnorm < 1.0 && bnorm > 1.0)
+ {
+ if (bnorm > GSL_NONSYMMV_BIGNUM*cnorm)
+ scale = 1.0 / bnorm;
+ }
+
+ /* compute x */
+ gsl_vector_set(x, 0, gsl_vector_get(b, 0) * scale / c);
+ *xnorm = fabs(gsl_vector_get(x, 0));
+ } /* if (N == 1) */
+ else
+ {
+ double cr[2][2];
+ double *crv;
+ double cmax;
+ size_t icmax, j;
+ double bval1, bval2;
+ double ur11, ur12, ur22, ur11r;
+ double cr21, cr22;
+ double lr21;
+ double b1, b2, bbnd;
+ double x1, x2;
+ double temp;
+ size_t ipivot[4][4] = { { 0, 1, 2, 3 },
+ { 1, 0, 3, 2 },
+ { 2, 3, 0, 1 },
+ { 3, 2, 1, 0 } };
+ int rswap[4] = { 0, 1, 0, 1 };
+ int zswap[4] = { 0, 0, 1, 1 };
+
+ /*
+ * we have a 2-by-2 real system to solve:
+ *
+ * [ A11 - z A12 ] [ x1 ] = [ b1 ]
+ * [ A21 A22 - z ] [ x2 ] [ b2 ]
+ *
+ * (z real)
+ */
+
+ crv = (double *) cr;
+
+ /*
+ * compute the real part of C = A - z*I - use column ordering
+ * here since porting from lapack
+ */
+ cr[0][0] = gsl_matrix_get(A, 0, 0) - z;
+ cr[1][1] = gsl_matrix_get(A, 1, 1) - z;
+ cr[0][1] = gsl_matrix_get(A, 1, 0);
+ cr[1][0] = gsl_matrix_get(A, 0, 1);
+
+ /* find the largest element in C */
+ cmax = 0.0;
+ icmax = 0;
+ for (j = 0; j < 4; ++j)
+ {
+ if (fabs(crv[j]) > cmax)
+ {
+ cmax = fabs(crv[j]);
+ icmax = j;
+ }
+ }
+
+ bval1 = gsl_vector_get(b, 0);
+ bval2 = gsl_vector_get(b, 1);
+
+ /* if norm(C) < smin, use smin*I */
+
+ if (cmax < smin)
+ {
+ bnorm = GSL_MAX(fabs(bval1), fabs(bval2));
+ if (smin < 1.0 && bnorm > 1.0)
+ {
+ if (bnorm > GSL_NONSYMMV_BIGNUM*smin)
+ scale = 1.0 / bnorm;
+ }
+ temp = scale / smin;
+ gsl_vector_set(x, 0, temp * bval1);
+ gsl_vector_set(x, 1, temp * bval2);
+ *xnorm = temp * bnorm;
+ *s = scale;
+ return;
+ }
+
+ /* gaussian elimination with complete pivoting */
+ ur11 = crv[icmax];
+ cr21 = crv[ipivot[1][icmax]];
+ ur12 = crv[ipivot[2][icmax]];
+ cr22 = crv[ipivot[3][icmax]];
+ ur11r = 1.0 / ur11;
+ lr21 = ur11r * cr21;
+ ur22 = cr22 - ur12 * lr21;
+
+ /* if smaller pivot < smin, use smin */
+ if (fabs(ur22) < smin)
+ ur22 = smin;
+
+ if (rswap[icmax])
+ {
+ b1 = bval2;
+ b2 = bval1;
+ }
+ else
+ {
+ b1 = bval1;
+ b2 = bval2;
+ }
+
+ b2 -= lr21 * b1;
+ bbnd = GSL_MAX(fabs(b1 * (ur22 * ur11r)), fabs(b2));
+ if (bbnd > 1.0 && fabs(ur22) < 1.0)
+ {
+ if (bbnd >= GSL_NONSYMMV_BIGNUM * fabs(ur22))
+ scale = 1.0 / bbnd;
+ }
+
+ x2 = (b2 * scale) / ur22;
+ x1 = (scale * b1) * ur11r - x2 * (ur11r * ur12);
+ if (zswap[icmax])
+ {
+ gsl_vector_set(x, 0, x2);
+ gsl_vector_set(x, 1, x1);
+ }
+ else
+ {
+ gsl_vector_set(x, 0, x1);
+ gsl_vector_set(x, 1, x2);
+ }
+
+ *xnorm = GSL_MAX(fabs(x1), fabs(x2));
+
+ /* further scaling if norm(A) norm(X) > overflow */
+ if (*xnorm > 1.0 && cmax > 1.0)
+ {
+ if (*xnorm > GSL_NONSYMMV_BIGNUM / cmax)
+ {
+ temp = cmax / GSL_NONSYMMV_BIGNUM;
+ gsl_blas_dscal(temp, x);
+ *xnorm *= temp;
+ scale *= temp;
+ }
+ }
+ } /* if (N == 2) */
+
+ *s = scale;
+} /* nonsymmv_solve_equation() */
+
+/*
+nonsymmv_solve_equation_z()
+
+ Solve the equation which comes up in the back substitution
+when computing eigenvectors corresponding to complex eigenvalues.
+The equation that is solved is:
+
+(A - z*I)*x = s*b
+
+where
+
+A is n-by-n with n = 1 or 2
+b and x are n-by-1 complex vectors
+s is a scaling factor set by this function to prevent overflow in x
+
+Inputs: A - square matrix (n-by-n)
+ z - complex scalar (eigenvalue)
+ b - right hand side vector
+ x - (output) where to store solution
+ s - (output) scale factor
+ xnorm - (output) infinity norm of X
+ smin - lower bound on singular values of A - if A - z*I
+ is less than this value, we'll use smin*I instead.
+ This value should be a safe distance above underflow.
+
+Notes: 1) A and b are not changed on output
+ 2) Based on lapack routine DLALN2
+*/
+
+static inline void
+nonsymmv_solve_equation_z(gsl_matrix *A, gsl_complex *z,
+ gsl_vector_complex *b, gsl_vector_complex *x,
+ double *s, double *xnorm, double smin)
+{
+ size_t N = A->size1;
+ double scale = 1.0;
+ double bnorm;
+
+ if (N == 1)
+ {
+ double cr, /* denominator */
+ ci,
+ cnorm; /* |c| */
+ gsl_complex bval, c, xval, tmp;
+
+ /*
+ * we have a 1-by-1 (complex) scalar system to solve:
+ *
+ * (a - z)*x = b
+ * (z is complex, a is real)
+ */
+
+ /* c = a - z */
+ cr = gsl_matrix_get(A, 0, 0) - GSL_REAL(*z);
+ ci = -GSL_IMAG(*z);
+ cnorm = fabs(cr) + fabs(ci);
+
+ if (cnorm < smin)
+ {
+ /* set c = smin*I */
+ cr = smin;
+ ci = 0.0;
+ cnorm = smin;
+ }
+
+ /* check scaling for x = b / c */
+ bval = gsl_vector_complex_get(b, 0);
+ bnorm = fabs(GSL_REAL(bval)) + fabs(GSL_IMAG(bval));
+ if (cnorm < 1.0 && bnorm > 1.0)
+ {
+ if (bnorm > GSL_NONSYMMV_BIGNUM*cnorm)
+ scale = 1.0 / bnorm;
+ }
+
+ /* compute x */
+ GSL_SET_COMPLEX(&tmp, scale*GSL_REAL(bval), scale*GSL_IMAG(bval));
+ GSL_SET_COMPLEX(&c, cr, ci);
+ xval = gsl_complex_div(tmp, c);
+
+ gsl_vector_complex_set(x, 0, xval);
+
+ *xnorm = fabs(GSL_REAL(xval)) + fabs(GSL_IMAG(xval));
+ } /* if (N == 1) */
+ else
+ {
+ double cr[2][2], ci[2][2];
+ double *civ, *crv;
+ double cmax;
+ gsl_complex bval1, bval2;
+ gsl_complex xval1, xval2;
+ double xr1, xi1;
+ size_t icmax;
+ size_t j;
+ double temp;
+ double ur11, ur12, ur22, ui11, ui12, ui22, ur11r, ui11r;
+ double ur12s, ui12s;
+ double u22abs;
+ double lr21, li21;
+ double cr21, cr22, ci21, ci22;
+ double br1, bi1, br2, bi2, bbnd;
+ gsl_complex b1, b2;
+ size_t ipivot[4][4] = { { 0, 1, 2, 3 },
+ { 1, 0, 3, 2 },
+ { 2, 3, 0, 1 },
+ { 3, 2, 1, 0 } };
+ int rswap[4] = { 0, 1, 0, 1 };
+ int zswap[4] = { 0, 0, 1, 1 };
+
+ /*
+ * complex 2-by-2 system:
+ *
+ * [ A11 - z A12 ] [ X1 ] = [ B1 ]
+ * [ A21 A22 - z ] [ X2 ] [ B2 ]
+ *
+ * (z complex)
+ *
+ * where the X and B values are complex.
+ */
+
+ civ = (double *) ci;
+ crv = (double *) cr;
+
+ /*
+ * compute the real part of C = A - z*I - use column ordering
+ * here since porting from lapack
+ */
+ cr[0][0] = gsl_matrix_get(A, 0, 0) - GSL_REAL(*z);
+ cr[1][1] = gsl_matrix_get(A, 1, 1) - GSL_REAL(*z);
+ cr[0][1] = gsl_matrix_get(A, 1, 0);
+ cr[1][0] = gsl_matrix_get(A, 0, 1);
+
+ /* compute the imaginary part */
+ ci[0][0] = -GSL_IMAG(*z);
+ ci[0][1] = 0.0;
+ ci[1][0] = 0.0;
+ ci[1][1] = -GSL_IMAG(*z);
+
+ cmax = 0.0;
+ icmax = 0;
+
+ for (j = 0; j < 4; ++j)
+ {
+ if (fabs(crv[j]) + fabs(civ[j]) > cmax)
+ {
+ cmax = fabs(crv[j]) + fabs(civ[j]);
+ icmax = j;
+ }
+ }
+
+ bval1 = gsl_vector_complex_get(b, 0);
+ bval2 = gsl_vector_complex_get(b, 1);
+
+ /* if norm(C) < smin, use smin*I */
+ if (cmax < smin)
+ {
+ bnorm = GSL_MAX(fabs(GSL_REAL(bval1)) + fabs(GSL_IMAG(bval1)),
+ fabs(GSL_REAL(bval2)) + fabs(GSL_IMAG(bval2)));
+ if (smin < 1.0 && bnorm > 1.0)
+ {
+ if (bnorm > GSL_NONSYMMV_BIGNUM*smin)
+ scale = 1.0 / bnorm;
+ }
+
+ temp = scale / smin;
+ xval1 = gsl_complex_mul_real(bval1, temp);
+ xval2 = gsl_complex_mul_real(bval2, temp);
+ gsl_vector_complex_set(x, 0, xval1);
+ gsl_vector_complex_set(x, 1, xval2);
+ *xnorm = temp * bnorm;
+ *s = scale;
+ return;
+ }
+
+ /* gaussian elimination with complete pivoting */
+ ur11 = crv[icmax];
+ ui11 = civ[icmax];
+ cr21 = crv[ipivot[1][icmax]];
+ ci21 = civ[ipivot[1][icmax]];
+ ur12 = crv[ipivot[2][icmax]];
+ ui12 = civ[ipivot[2][icmax]];
+ cr22 = crv[ipivot[3][icmax]];
+ ci22 = civ[ipivot[3][icmax]];
+
+ if (icmax == 0 || icmax == 3)
+ {
+ /* off diagonals of pivoted C are real */
+ if (fabs(ur11) > fabs(ui11))
+ {
+ temp = ui11 / ur11;
+ ur11r = 1.0 / (ur11 * (1.0 + temp*temp));
+ ui11r = -temp * ur11r;
+ }
+ else
+ {
+ temp = ur11 / ui11;
+ ui11r = -1.0 / (ui11 * (1.0 + temp*temp));
+ ur11r = -temp*ui11r;
+ }
+ lr21 = cr21 * ur11r;
+ li21 = cr21 * ui11r;
+ ur12s = ur12 * ur11r;
+ ui12s = ur12 * ui11r;
+ ur22 = cr22 - ur12 * lr21;
+ ui22 = ci22 - ur12 * li21;
+ }
+ else
+ {
+ /* diagonals of pivoted C are real */
+ ur11r = 1.0 / ur11;
+ ui11r = 0.0;
+ lr21 = cr21 * ur11r;
+ li21 = ci21 * ur11r;
+ ur12s = ur12 * ur11r;
+ ui12s = ui12 * ur11r;
+ ur22 = cr22 - ur12 * lr21 + ui12 * li21;
+ ui22 = -ur12 * li21 - ui12 * lr21;
+ }
+
+ u22abs = fabs(ur22) + fabs(ui22);
+
+ /* if smaller pivot < smin, use smin */
+ if (u22abs < smin)
+ {
+ ur22 = smin;
+ ui22 = 0.0;
+ }
+
+ if (rswap[icmax])
+ {
+ br2 = GSL_REAL(bval1);
+ bi2 = GSL_IMAG(bval1);
+ br1 = GSL_REAL(bval2);
+ bi1 = GSL_IMAG(bval2);
+ }
+ else
+ {
+ br1 = GSL_REAL(bval1);
+ bi1 = GSL_IMAG(bval1);
+ br2 = GSL_REAL(bval2);
+ bi2 = GSL_IMAG(bval2);
+ }
+
+ br2 += li21*bi1 - lr21*br1;
+ bi2 -= li21*br1 + lr21*bi1;
+ bbnd = GSL_MAX((fabs(br1) + fabs(bi1)) *
+ (u22abs * (fabs(ur11r) + fabs(ui11r))),
+ fabs(br2) + fabs(bi2));
+ if (bbnd > 1.0 && u22abs < 1.0)
+ {
+ if (bbnd >= GSL_NONSYMMV_BIGNUM*u22abs)
+ {
+ scale = 1.0 / bbnd;
+ br1 *= scale;
+ bi1 *= scale;
+ br2 *= scale;
+ bi2 *= scale;
+ }
+ }
+
+ GSL_SET_COMPLEX(&b1, br2, bi2);
+ GSL_SET_COMPLEX(&b2, ur22, ui22);
+ xval2 = gsl_complex_div(b1, b2);
+
+ xr1 = ur11r*br1 - ui11r*bi1 - ur12s*GSL_REAL(xval2) + ui12s*GSL_IMAG(xval2);
+ xi1 = ui11r*br1 + ur11r*bi1 - ui12s*GSL_REAL(xval2) - ur12s*GSL_IMAG(xval2);
+ GSL_SET_COMPLEX(&xval1, xr1, xi1);
+
+ if (zswap[icmax])
+ {
+ gsl_vector_complex_set(x, 0, xval2);
+ gsl_vector_complex_set(x, 1, xval1);
+ }
+ else
+ {
+ gsl_vector_complex_set(x, 0, xval1);
+ gsl_vector_complex_set(x, 1, xval2);
+ }
+
+ *xnorm = GSL_MAX(fabs(GSL_REAL(xval1)) + fabs(GSL_IMAG(xval1)),
+ fabs(GSL_REAL(xval2)) + fabs(GSL_IMAG(xval2)));
+
+ /* further scaling if norm(A) norm(X) > overflow */
+ if (*xnorm > 1.0 && cmax > 1.0)
+ {
+ if (*xnorm > GSL_NONSYMMV_BIGNUM / cmax)
+ {
+ temp = cmax / GSL_NONSYMMV_BIGNUM;
+ gsl_blas_zdscal(temp, x);
+ *xnorm *= temp;
+ scale *= temp;
+ }
+ }
+ } /* if (N == 2) */
+
+ *s = scale;
+} /* nonsymmv_solve_equation_z() */
+
+/*
+nonsymmv_normalize_eigenvectors()
+ Normalize eigenvectors so that their Euclidean norm is 1
+
+Inputs: eval - eigenvalues
+ evec - eigenvectors
+*/
+
+static void
+nonsymmv_normalize_eigenvectors(gsl_vector_complex *eval,
+ gsl_matrix_complex *evec)
+{
+ const size_t N = evec->size1;
+ size_t i; /* looping */
+ gsl_complex ei;
+ gsl_vector_complex_view vi;
+ gsl_vector_view re, im;
+ double scale; /* scaling factor */
+
+ for (i = 0; i < N; ++i)
+ {
+ ei = gsl_vector_complex_get(eval, i);
+ vi = gsl_matrix_complex_column(evec, i);
+
+ re = gsl_vector_complex_real(&vi.vector);
+
+ if (GSL_IMAG(ei) == 0.0)
+ {
+ scale = 1.0 / gsl_blas_dnrm2(&re.vector);
+ gsl_blas_dscal(scale, &re.vector);
+ }
+ else if (GSL_IMAG(ei) > 0.0)
+ {
+ im = gsl_vector_complex_imag(&vi.vector);
+
+ scale = 1.0 / gsl_hypot(gsl_blas_dnrm2(&re.vector),
+ gsl_blas_dnrm2(&im.vector));
+ gsl_blas_zdscal(scale, &vi.vector);
+
+ vi = gsl_matrix_complex_column(evec, i + 1);
+ gsl_blas_zdscal(scale, &vi.vector);
+ }
+ }
+} /* nonsymmv_normalize_eigenvectors() */
diff --git a/gsl-1.9/eigen/qrstep.c b/gsl-1.9/eigen/qrstep.c
new file mode 100644
index 0000000..0394677
--- /dev/null
+++ b/gsl-1.9/eigen/qrstep.c
@@ -0,0 +1,178 @@
+/* remove off-diagonal elements which are neglegible compared with the
+ neighboring diagonal elements */
+
+inline static void
+chop_small_elements (const size_t N, const double d[], double sd[])
+{
+ double d_i = d[0];
+
+ size_t i;
+
+ for (i = 0; i < N - 1; i++)
+ {
+ double sd_i = sd[i];
+ double d_ip1 = d[i + 1];
+
+ if (fabs (sd_i) < GSL_DBL_EPSILON * (fabs (d_i) + fabs (d_ip1)))
+ {
+ sd[i] = 0.0;
+ }
+ d_i = d_ip1;
+ }
+}
+
+/* Generate a Givens rotation (cos,sin) which takes v=(x,y) to (|v|,0)
+
+ From Golub and Van Loan, "Matrix Computations", Section 5.1.8 */
+
+inline static void
+create_givens (const double a, const double b, double *c, double *s)
+{
+ if (b == 0)
+ {
+ *c = 1;
+ *s = 0;
+ }
+ else if (fabs (b) > fabs (a))
+ {
+ double t = -a / b;
+ double s1 = 1.0 / sqrt (1 + t * t);
+ *s = s1;
+ *c = s1 * t;
+ }
+ else
+ {
+ double t = -b / a;
+ double c1 = 1.0 / sqrt (1 + t * t);
+ *c = c1;
+ *s = c1 * t;
+ }
+}
+
+inline static double
+trailing_eigenvalue (const size_t n, const double d[], const double sd[])
+{
+ double ta = d[n - 2];
+ double tb = d[n - 1];
+ double tab = sd[n - 2];
+
+ double dt = (ta - tb) / 2.0;
+
+ double mu;
+
+ if (dt >= 0)
+ {
+ mu = tb - (tab * tab) / (dt + hypot (dt, tab));
+ }
+ else
+ {
+ mu = tb + (tab * tab) / ((-dt) + hypot (dt, tab));
+ }
+
+ return mu;
+}
+
+static void
+qrstep (const size_t n, double d[], double sd[], double gc[], double gs[])
+{
+ double x, z;
+ double ak, bk, zk, ap, bp, aq, bq;
+ size_t k;
+
+ double mu = trailing_eigenvalue (n, d, sd);
+
+ x = d[0] - mu;
+ z = sd[0];
+
+ ak = 0;
+ bk = 0;
+ zk = 0;
+
+ ap = d[0];
+ bp = sd[0];
+
+ aq = d[1];
+
+ if (n == 2)
+ {
+ double c, s;
+ create_givens (x, z, &c, &s);
+
+ if (gc != NULL)
+ gc[0] = c;
+ if (gs != NULL)
+ gs[0] = s;
+
+ {
+ double ap1 = c * (c * ap - s * bp) + s * (s * aq - c * bp);
+ double bp1 = c * (s * ap + c * bp) - s * (s * bp + c * aq);
+
+ double aq1 = s * (s * ap + c * bp) + c * (s * bp + c * aq);
+
+ ak = ap1;
+ bk = bp1;
+
+ ap = aq1;
+ }
+
+ d[0] = ak;
+ sd[0] = bk;
+ d[1] = ap;
+
+ return;
+ }
+
+ bq = sd[1];
+
+ for (k = 0; k < n - 1; k++)
+ {
+ double c, s;
+ create_givens (x, z, &c, &s);
+
+ /* store Givens rotation */
+ if (gc != NULL)
+ gc[k] = c;
+ if (gs != NULL)
+ gs[k] = s;
+
+ /* compute G' T G */
+
+ {
+ double bk1 = c * bk - s * zk;
+
+ double ap1 = c * (c * ap - s * bp) + s * (s * aq - c * bp);
+ double bp1 = c * (s * ap + c * bp) - s * (s * bp + c * aq);
+ double zp1 = -s * bq;
+
+ double aq1 = s * (s * ap + c * bp) + c * (s * bp + c * aq);
+ double bq1 = c * bq;
+
+ ak = ap1;
+ bk = bp1;
+ zk = zp1;
+
+ ap = aq1;
+ bp = bq1;
+
+ if (k < n - 2)
+ aq = d[k + 2];
+ if (k < n - 3)
+ bq = sd[k + 2];
+
+ d[k] = ak;
+
+ if (k > 0)
+ sd[k - 1] = bk1;
+
+ if (k < n - 2)
+ sd[k + 1] = bp;
+
+ x = bk;
+ z = zk;
+ }
+ }
+
+ /* k = n - 1 */
+ d[k] = ap;
+ sd[k - 1] = bk;
+}
diff --git a/gsl-1.9/eigen/schur.c b/gsl-1.9/eigen/schur.c
new file mode 100644
index 0000000..b2b7adb
--- /dev/null
+++ b/gsl-1.9/eigen/schur.c
@@ -0,0 +1,372 @@
+/* eigen/schur.c
+ *
+ * Copyright (C) 2006 Patrick Alken
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <math.h>
+#include <gsl/gsl_eigen.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_blas.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_linalg.h>
+#include <gsl/gsl_cblas.h>
+
+#include "schur.h"
+
+/*
+ * This module contains some routines related to manipulating the
+ * Schur form of a matrix which are needed by the eigenvalue solvers
+ *
+ * This file contains routines based on original code from LAPACK
+ * which is distributed under the modified BSD license. The LAPACK
+ * routine used is DLANV2.
+ */
+
+static inline void schur_standard_form(gsl_matrix *A, gsl_complex *eval1,
+ gsl_complex *eval2, double *cs,
+ double *sn);
+
+/*
+gsl_schur_standardize()
+ Wrapper function for schur_standard_form - convert a 2-by-2 eigenvalue
+block to standard form and then update the Schur form and
+Schur vectors.
+
+Inputs: T - Schur form
+ row - row of T of 2-by-2 block to be updated
+ eval1 - where to store eigenvalue 1
+ eval2 - where to store eigenvalue 2
+ update_t - 1 = update the entire matrix T with the transformation
+ 0 = do not update rest of T
+ Z - (optional) if non-null, accumulate transformation
+*/
+
+void
+gsl_schur_standardize(gsl_matrix *T, size_t row, gsl_complex *eval1,
+ gsl_complex *eval2, int update_t, gsl_matrix *Z)
+{
+ const size_t N = T->size1;
+ gsl_matrix_view m;
+ double cs, sn;
+
+ m = gsl_matrix_submatrix(T, row, row, 2, 2);
+ schur_standard_form(&m.matrix, eval1, eval2, &cs, &sn);
+
+ if (update_t)
+ {
+ gsl_vector_view xv, yv, v;
+
+ /*
+ * The above call to schur_standard_form transformed a 2-by-2 block
+ * of T into upper triangular form via the transformation
+ *
+ * U = [ CS -SN ]
+ * [ SN CS ]
+ *
+ * The original matrix T was
+ *
+ * T = [ T_{11} | T_{12} | T_{13} ]
+ * [ 0* | A | T_{23} ]
+ * [ 0 | 0* | T_{33} ]
+ *
+ * where 0* indicates all zeros except for possibly
+ * one subdiagonal element next to A.
+ *
+ * After schur_standard_form, T looks like this:
+ *
+ * T = [ T_{11} | T_{12} | T_{13} ]
+ * [ 0* | U^t A U | T_{23} ]
+ * [ 0 | 0* | T_{33} ]
+ *
+ * since only the 2-by-2 block of A was changed. However,
+ * in order to be able to back transform T at the end,
+ * we need to apply the U transformation to the rest
+ * of the matrix T since there is no way to apply a
+ * similarity transformation to T and change only the
+ * middle 2-by-2 block. In other words, let
+ *
+ * M = [ I 0 0 ]
+ * [ 0 U 0 ]
+ * [ 0 0 I ]
+ *
+ * and compute
+ *
+ * M^t T M = [ T_{11} | T_{12} U | T_{13} ]
+ * [ U^t 0* | U^t A U | U^t T_{23} ]
+ * [ 0 | 0* U | T_{33} ]
+ *
+ * So basically we need to apply the transformation U
+ * to the i x 2 matrix T_{12} and the 2 x (n - i + 2)
+ * matrix T_{23}, where i is the index of the top of A
+ * in T.
+ *
+ * The BLAS routine drot() is suited for this.
+ */
+
+ if (row < (N - 2))
+ {
+ /* transform the 2 rows of T_{23} */
+
+ v = gsl_matrix_row(T, row);
+ xv = gsl_vector_subvector(&v.vector,
+ row + 2,
+ N - row - 2);
+
+ v = gsl_matrix_row(T, row + 1);
+ yv = gsl_vector_subvector(&v.vector,
+ row + 2,
+ N - row - 2);
+
+ gsl_blas_drot(&xv.vector, &yv.vector, cs, sn);
+ }
+
+ if (row > 0)
+ {
+ /* transform the 2 columns of T_{12} */
+
+ v = gsl_matrix_column(T, row);
+ xv = gsl_vector_subvector(&v.vector,
+ 0,
+ row);
+
+ v = gsl_matrix_column(T, row + 1);
+ yv = gsl_vector_subvector(&v.vector,
+ 0,
+ row);
+
+ gsl_blas_drot(&xv.vector, &yv.vector, cs, sn);
+ }
+ } /* if (update_t) */
+
+ if (Z)
+ {
+ gsl_vector_view xv, yv;
+
+ /*
+ * Accumulate the transformation in Z. Here, Z -> Z * M
+ *
+ * So:
+ *
+ * Z -> [ Z_{11} | Z_{12} U | Z_{13} ]
+ * [ Z_{21} | Z_{22} U | Z_{23} ]
+ * [ Z_{31} | Z_{32} U | Z_{33} ]
+ *
+ * So we just need to apply drot() to the 2 columns
+ * starting at index 'row'
+ */
+
+ xv = gsl_matrix_column(Z, row);
+ yv = gsl_matrix_column(Z, row + 1);
+
+ gsl_blas_drot(&xv.vector, &yv.vector, cs, sn);
+ } /* if (Z) */
+} /* gsl_schur_standardize() */
+
+/*******************************************************
+ * INTERNAL ROUTINES *
+ *******************************************************/
+
+/*
+schur_standard_form()
+ Compute the Schur factorization of a real 2-by-2 matrix in
+standard form:
+
+[ A B ] = [ CS -SN ] [ T11 T12 ] [ CS SN ]
+[ C D ] [ SN CS ] [ T21 T22 ] [-SN CS ]
+
+where either:
+1) T21 = 0 so that T11 and T22 are real eigenvalues of the matrix, or
+2) T11 = T22 and T21*T12 < 0, so that T11 +/- sqrt(|T21*T12|) are
+ complex conjugate eigenvalues
+
+Inputs: A - 2-by-2 matrix
+ eval1 - where to store eigenvalue 1
+ eval2 - where to store eigenvalue 2
+ cs - where to store cosine parameter of rotation matrix
+ sn - where to store sine parameter of rotation matrix
+
+Notes: based on LAPACK routine DLANV2
+*/
+
+static inline void
+schur_standard_form(gsl_matrix *A, gsl_complex *eval1, gsl_complex *eval2,
+ double *cs, double *sn)
+{
+ double a, b, c, d; /* input matrix values */
+ double tmp;
+ double p, z;
+ double bcmax, bcmis, scale;
+ double tau, sigma;
+ double cs1, sn1;
+ double aa, bb, cc, dd;
+ double sab, sac;
+
+ a = gsl_matrix_get(A, 0, 0);
+ b = gsl_matrix_get(A, 0, 1);
+ c = gsl_matrix_get(A, 1, 0);
+ d = gsl_matrix_get(A, 1, 1);
+
+ if (c == 0.0)
+ {
+ /*
+ * matrix is already upper triangular - set rotation matrix
+ * to the identity
+ */
+ *cs = 1.0;
+ *sn = 0.0;
+ }
+ else if (b == 0.0)
+ {
+ /* swap rows and columns to make it upper triangular */
+
+ *cs = 0.0;
+ *sn = 1.0;
+
+ tmp = d;
+ d = a;
+ a = tmp;
+ b = -c;
+ c = 0.0;
+ }
+ else if (((a - d) == 0.0) && (GSL_SIGN(b) != GSL_SIGN(c)))
+ {
+ /* the matrix has complex eigenvalues with a == d */
+ *cs = 1.0;
+ *sn = 0.0;
+ }
+ else
+ {
+ tmp = a - d;
+ p = 0.5 * tmp;
+ bcmax = GSL_MAX(fabs(b), fabs(c));
+ bcmis = GSL_MIN(fabs(b), fabs(c)) * GSL_SIGN(b) * GSL_SIGN(c);
+ scale = GSL_MAX(fabs(p), bcmax);
+ z = (p / scale) * p + (bcmax / scale) * bcmis;
+
+ if (z >= 4.0 * GSL_DBL_EPSILON)
+ {
+ /* real eigenvalues, compute a and d */
+
+ z = p + GSL_SIGN(p) * fabs(sqrt(scale) * sqrt(z));
+ a = d + z;
+ d -= (bcmax / z) * bcmis;
+
+ /* compute b and the rotation matrix */
+
+ tau = gsl_hypot(c, z);
+ *cs = z / tau;
+ *sn = c / tau;
+ b -= c;
+ c = 0.0;
+ }
+ else
+ {
+ /*
+ * complex eigenvalues, or real (almost) equal eigenvalues -
+ * make diagonal elements equal
+ */
+
+ sigma = b + c;
+ tau = gsl_hypot(sigma, tmp);
+ *cs = sqrt(0.5 * (1.0 + fabs(sigma) / tau));
+ *sn = -(p / (tau * (*cs))) * GSL_SIGN(sigma);
+
+ /*
+ * Compute [ AA BB ] = [ A B ] [ CS -SN ]
+ * [ CC DD ] [ C D ] [ SN CS ]
+ */
+ aa = a * (*cs) + b * (*sn);
+ bb = -a * (*sn) + b * (*cs);
+ cc = c * (*cs) + d * (*sn);
+ dd = -c * (*sn) + d * (*cs);
+
+ /*
+ * Compute [ A B ] = [ CS SN ] [ AA BB ]
+ * [ C D ] [-SN CS ] [ CC DD ]
+ */
+ a = aa * (*cs) + cc * (*sn);
+ b = bb * (*cs) + dd * (*sn);
+ c = -aa * (*sn) + cc * (*cs);
+ d = -bb * (*sn) + dd * (*cs);
+
+ tmp = 0.5 * (a + d);
+ a = d = tmp;
+
+ if (c != 0.0)
+ {
+ if (b != 0.0)
+ {
+ if (GSL_SIGN(b) == GSL_SIGN(c))
+ {
+ /*
+ * real eigenvalues: reduce to upper triangular
+ * form
+ */
+ sab = sqrt(fabs(b));
+ sac = sqrt(fabs(c));
+ p = GSL_SIGN(c) * fabs(sab * sac);
+ tau = 1.0 / sqrt(fabs(b + c));
+ a = tmp + p;
+ d = tmp - p;
+ b -= c;
+ c = 0.0;
+
+ cs1 = sab * tau;
+ sn1 = sac * tau;
+ tmp = (*cs) * cs1 - (*sn) * sn1;
+ *sn = (*cs) * sn1 + (*sn) * cs1;
+ *cs = tmp;
+ }
+ }
+ else
+ {
+ b = -c;
+ c = 0.0;
+ tmp = *cs;
+ *cs = -(*sn);
+ *sn = tmp;
+ }
+ }
+ }
+ }
+
+ /* set eigenvalues */
+
+ GSL_SET_REAL(eval1, a);
+ GSL_SET_REAL(eval2, d);
+ if (c == 0.0)
+ {
+ GSL_SET_IMAG(eval1, 0.0);
+ GSL_SET_IMAG(eval2, 0.0);
+ }
+ else
+ {
+ tmp = sqrt(fabs(b) * fabs(c));
+ GSL_SET_IMAG(eval1, tmp);
+ GSL_SET_IMAG(eval2, -tmp);
+ }
+
+ /* set new matrix elements */
+
+ gsl_matrix_set(A, 0, 0, a);
+ gsl_matrix_set(A, 0, 1, b);
+ gsl_matrix_set(A, 1, 0, c);
+ gsl_matrix_set(A, 1, 1, d);
+} /* schur_standard_form() */
diff --git a/gsl-1.9/eigen/schur.h b/gsl-1.9/eigen/schur.h
new file mode 100644
index 0000000..17d87a0
--- /dev/null
+++ b/gsl-1.9/eigen/schur.h
@@ -0,0 +1,33 @@
+/* eigen/schur.h
+ *
+ * Copyright (C) 2006 Patrick Alken
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_SCHUR_H__
+#define __GSL_SCHUR_H__
+
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_complex.h>
+
+/*
+ * Prototypes
+ */
+
+void gsl_schur_standardize(gsl_matrix *T, size_t row, gsl_complex *eval1,
+ gsl_complex *eval2, int update_t, gsl_matrix *Z);
+
+#endif /* __GSL_SCHUR_H__ */
diff --git a/gsl-1.9/eigen/sort.c b/gsl-1.9/eigen/sort.c
new file mode 100644
index 0000000..d0755d9
--- /dev/null
+++ b/gsl-1.9/eigen/sort.c
@@ -0,0 +1,235 @@
+/* eigen/eigen_sort.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman, Modified: B. Gough. */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_eigen.h>
+#include <gsl/gsl_complex.h>
+#include <gsl/gsl_complex_math.h>
+
+/* The eigen_sort below is not very good, but it is simple and
+ * self-contained. We can always implement an improved sort later. */
+
+int
+gsl_eigen_symmv_sort (gsl_vector * eval, gsl_matrix * evec,
+ gsl_eigen_sort_t sort_type)
+{
+ if (evec->size1 != evec->size2)
+ {
+ GSL_ERROR ("eigenvector matrix must be square", GSL_ENOTSQR);
+ }
+ else if (eval->size != evec->size1)
+ {
+ GSL_ERROR ("eigenvalues must match eigenvector matrix", GSL_EBADLEN);
+ }
+ else
+ {
+ const size_t N = eval->size;
+ size_t i;
+
+ for (i = 0; i < N - 1; i++)
+ {
+ size_t j;
+ size_t k = i;
+
+ double ek = gsl_vector_get (eval, i);
+
+ /* search for something to swap */
+ for (j = i + 1; j < N; j++)
+ {
+ int test;
+ const double ej = gsl_vector_get (eval, j);
+
+ switch (sort_type)
+ {
+ case GSL_EIGEN_SORT_VAL_ASC:
+ test = (ej < ek);
+ break;
+ case GSL_EIGEN_SORT_VAL_DESC:
+ test = (ej > ek);
+ break;
+ case GSL_EIGEN_SORT_ABS_ASC:
+ test = (fabs (ej) < fabs (ek));
+ break;
+ case GSL_EIGEN_SORT_ABS_DESC:
+ test = (fabs (ej) > fabs (ek));
+ break;
+ default:
+ GSL_ERROR ("unrecognized sort type", GSL_EINVAL);
+ }
+
+ if (test)
+ {
+ k = j;
+ ek = ej;
+ }
+ }
+
+ if (k != i)
+ {
+ /* swap eigenvalues */
+ gsl_vector_swap_elements (eval, i, k);
+
+ /* swap eigenvectors */
+ gsl_matrix_swap_columns (evec, i, k);
+ }
+ }
+
+ return GSL_SUCCESS;
+ }
+}
+
+
+int
+gsl_eigen_hermv_sort (gsl_vector * eval, gsl_matrix_complex * evec,
+ gsl_eigen_sort_t sort_type)
+{
+ if (evec->size1 != evec->size2)
+ {
+ GSL_ERROR ("eigenvector matrix must be square", GSL_ENOTSQR);
+ }
+ else if (eval->size != evec->size1)
+ {
+ GSL_ERROR ("eigenvalues must match eigenvector matrix", GSL_EBADLEN);
+ }
+ else
+ {
+ const size_t N = eval->size;
+ size_t i;
+
+ for (i = 0; i < N - 1; i++)
+ {
+ size_t j;
+ size_t k = i;
+
+ double ek = gsl_vector_get (eval, i);
+
+ /* search for something to swap */
+ for (j = i + 1; j < N; j++)
+ {
+ int test;
+ const double ej = gsl_vector_get (eval, j);
+
+ switch (sort_type)
+ {
+ case GSL_EIGEN_SORT_VAL_ASC:
+ test = (ej < ek);
+ break;
+ case GSL_EIGEN_SORT_VAL_DESC:
+ test = (ej > ek);
+ break;
+ case GSL_EIGEN_SORT_ABS_ASC:
+ test = (fabs (ej) < fabs (ek));
+ break;
+ case GSL_EIGEN_SORT_ABS_DESC:
+ test = (fabs (ej) > fabs (ek));
+ break;
+ default:
+ GSL_ERROR ("unrecognized sort type", GSL_EINVAL);
+ }
+
+ if (test)
+ {
+ k = j;
+ ek = ej;
+ }
+ }
+
+ if (k != i)
+ {
+ /* swap eigenvalues */
+ gsl_vector_swap_elements (eval, i, k);
+
+ /* swap eigenvectors */
+ gsl_matrix_complex_swap_columns (evec, i, k);
+ }
+ }
+
+ return GSL_SUCCESS;
+ }
+}
+
+int
+gsl_eigen_nonsymmv_sort (gsl_vector_complex * eval,
+ gsl_matrix_complex * evec,
+ gsl_eigen_sort_t sort_type)
+{
+ if (evec->size1 != evec->size2)
+ {
+ GSL_ERROR ("eigenvector matrix must be square", GSL_ENOTSQR);
+ }
+ else if (eval->size != evec->size1)
+ {
+ GSL_ERROR ("eigenvalues must match eigenvector matrix", GSL_EBADLEN);
+ }
+ else
+ {
+ const size_t N = eval->size;
+ size_t i;
+
+ for (i = 0; i < N - 1; i++)
+ {
+ size_t j;
+ size_t k = i;
+
+ gsl_complex ek = gsl_vector_complex_get (eval, i);
+
+ /* search for something to swap */
+ for (j = i + 1; j < N; j++)
+ {
+ int test;
+ const gsl_complex ej = gsl_vector_complex_get (eval, j);
+
+ switch (sort_type)
+ {
+ case GSL_EIGEN_SORT_ABS_ASC:
+ test = (gsl_complex_abs (ej) < gsl_complex_abs (ek));
+ break;
+ case GSL_EIGEN_SORT_ABS_DESC:
+ test = (gsl_complex_abs (ej) > gsl_complex_abs (ek));
+ break;
+ case GSL_EIGEN_SORT_VAL_ASC:
+ case GSL_EIGEN_SORT_VAL_DESC:
+ default:
+ GSL_ERROR ("invalid sort type", GSL_EINVAL);
+ }
+
+ if (test)
+ {
+ k = j;
+ ek = ej;
+ }
+ }
+
+ if (k != i)
+ {
+ /* swap eigenvalues */
+ gsl_vector_complex_swap_elements (eval, i, k);
+
+ /* swap eigenvectors */
+ gsl_matrix_complex_swap_columns (evec, i, k);
+ }
+ }
+
+ return GSL_SUCCESS;
+ }
+}
diff --git a/gsl-1.9/eigen/symm.c b/gsl-1.9/eigen/symm.c
new file mode 100644
index 0000000..a13351e
--- /dev/null
+++ b/gsl-1.9/eigen/symm.c
@@ -0,0 +1,179 @@
+/* eigen/symm.c
+ *
+ * Copyright (C) 2001 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_linalg.h>
+#include <gsl/gsl_eigen.h>
+
+/* Compute eigenvalues/eigenvectors of real symmetric matrix using
+ reduction to tridiagonal form, followed by QR iteration with
+ implicit shifts.
+
+ See Golub & Van Loan, "Matrix Computations" (3rd ed), Section 8.3
+ */
+
+#include "qrstep.c"
+
+gsl_eigen_symm_workspace *
+gsl_eigen_symm_alloc (const size_t n)
+{
+ gsl_eigen_symm_workspace *w;
+
+ if (n == 0)
+ {
+ GSL_ERROR_NULL ("matrix dimension must be positive integer",
+ GSL_EINVAL);
+ }
+
+ w = ((gsl_eigen_symm_workspace *)
+ malloc (sizeof (gsl_eigen_symm_workspace)));
+
+ if (w == 0)
+ {
+ GSL_ERROR_NULL ("failed to allocate space for workspace", GSL_ENOMEM);
+ }
+
+ w->d = (double *) malloc (n * sizeof (double));
+
+ if (w->d == 0)
+ {
+ GSL_ERROR_NULL ("failed to allocate space for diagonal", GSL_ENOMEM);
+ }
+
+ w->sd = (double *) malloc (n * sizeof (double));
+
+ if (w->sd == 0)
+ {
+ GSL_ERROR_NULL ("failed to allocate space for subdiagonal", GSL_ENOMEM);
+ }
+
+ w->size = n;
+
+ return w;
+}
+
+void
+gsl_eigen_symm_free (gsl_eigen_symm_workspace * w)
+{
+ free (w->sd);
+ free (w->d);
+ free (w);
+}
+
+
+int
+gsl_eigen_symm (gsl_matrix * A, gsl_vector * eval,
+ gsl_eigen_symm_workspace * w)
+{
+ if (A->size1 != A->size2)
+ {
+ GSL_ERROR ("matrix must be square to compute eigenvalues", GSL_ENOTSQR);
+ }
+ else if (eval->size != A->size1)
+ {
+ GSL_ERROR ("eigenvalue vector must match matrix size", GSL_EBADLEN);
+ }
+ else
+ {
+ const size_t N = A->size1;
+ double *const d = w->d;
+ double *const sd = w->sd;
+
+ size_t a, b;
+
+ /* handle special case */
+
+ if (N == 1)
+ {
+ double A00 = gsl_matrix_get (A, 0, 0);
+ gsl_vector_set (eval, 0, A00);
+ return GSL_SUCCESS;
+ }
+
+ /* use sd as the temporary workspace for the decomposition,
+ since we can discard the tau result immediately if we are not
+ computing eigenvectors */
+
+ {
+ gsl_vector_view d_vec = gsl_vector_view_array (d, N);
+ gsl_vector_view sd_vec = gsl_vector_view_array (sd, N - 1);
+ gsl_vector_view tau = gsl_vector_view_array (sd, N - 1);
+ gsl_linalg_symmtd_decomp (A, &tau.vector);
+ gsl_linalg_symmtd_unpack_T (A, &d_vec.vector, &sd_vec.vector);
+ }
+
+ /* Make an initial pass through the tridiagonal decomposition
+ to remove off-diagonal elements which are effectively zero */
+
+ chop_small_elements (N, d, sd);
+
+ /* Progressively reduce the matrix until it is diagonal */
+
+ b = N - 1;
+
+ while (b > 0)
+ {
+ if (sd[b - 1] == 0.0 || isnan(sd[b - 1]))
+ {
+ b--;
+ continue;
+ }
+
+ /* Find the largest unreduced block (a,b) starting from b
+ and working backwards */
+
+ a = b - 1;
+
+ while (a > 0)
+ {
+ if (sd[a - 1] == 0.0)
+ {
+ break;
+ }
+ a--;
+ }
+
+ {
+ const size_t n_block = b - a + 1;
+ double *d_block = d + a;
+ double *sd_block = sd + a;
+
+ /* apply QR reduction with implicit deflation to the
+ unreduced block */
+
+ qrstep (n_block, d_block, sd_block, NULL, NULL);
+
+ /* remove any small off-diagonal elements */
+
+ chop_small_elements (n_block, d_block, sd_block);
+ }
+ }
+
+ {
+ gsl_vector_view d_vec = gsl_vector_view_array (d, N);
+ gsl_vector_memcpy (eval, &d_vec.vector);
+ }
+
+ return GSL_SUCCESS;
+ }
+}
diff --git a/gsl-1.9/eigen/symmv.c b/gsl-1.9/eigen/symmv.c
new file mode 100644
index 0000000..44df5d3
--- /dev/null
+++ b/gsl-1.9/eigen/symmv.c
@@ -0,0 +1,215 @@
+/* eigen/symmv.c
+ *
+ * Copyright (C) 2001 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_linalg.h>
+#include <gsl/gsl_eigen.h>
+
+/* Compute eigenvalues/eigenvectors of real symmetric matrix using
+ reduction to tridiagonal form, followed by QR iteration with
+ implicit shifts.
+
+ See Golub & Van Loan, "Matrix Computations" (3rd ed), Section 8.3
+ */
+
+#include "qrstep.c"
+
+gsl_eigen_symmv_workspace *
+gsl_eigen_symmv_alloc (const size_t n)
+{
+ gsl_eigen_symmv_workspace * w ;
+
+ if (n == 0)
+ {
+ GSL_ERROR_NULL ("matrix dimension must be positive integer", GSL_EINVAL);
+ }
+
+ w= ((gsl_eigen_symmv_workspace *) malloc (sizeof(gsl_eigen_symmv_workspace)));
+
+ if (w == 0)
+ {
+ GSL_ERROR_NULL ("failed to allocate space for workspace", GSL_ENOMEM);
+ }
+
+ w->d = (double *) malloc (n * sizeof (double));
+
+ if (w->d == 0)
+ {
+ GSL_ERROR_NULL ("failed to allocate space for diagonal", GSL_ENOMEM);
+ }
+
+ w->sd = (double *) malloc (n * sizeof (double));
+
+ if (w->sd == 0)
+ {
+ GSL_ERROR_NULL ("failed to allocate space for subdiagonal", GSL_ENOMEM);
+ }
+
+ w->gc = (double *) malloc (n * sizeof (double));
+
+ if (w->gc == 0)
+ {
+ GSL_ERROR_NULL ("failed to allocate space for cosines", GSL_ENOMEM);
+ }
+
+ w->gs = (double *) malloc (n * sizeof (double));
+
+ if (w->gs == 0)
+ {
+ GSL_ERROR_NULL ("failed to allocate space for sines", GSL_ENOMEM);
+ }
+
+ w->size = n;
+
+ return w;
+}
+
+void
+gsl_eigen_symmv_free (gsl_eigen_symmv_workspace * w)
+{
+ free(w->gs);
+ free(w->gc);
+ free(w->sd);
+ free(w->d);
+ free(w);
+}
+
+
+int
+gsl_eigen_symmv (gsl_matrix * A, gsl_vector * eval, gsl_matrix * evec,
+ gsl_eigen_symmv_workspace * w)
+{
+ if (A->size1 != A->size2)
+ {
+ GSL_ERROR ("matrix must be square to compute eigenvalues", GSL_ENOTSQR);
+ }
+ else if (eval->size != A->size1)
+ {
+ GSL_ERROR ("eigenvalue vector must match matrix size", GSL_EBADLEN);
+ }
+ else if (evec->size1 != A->size1 || evec->size2 != A->size1)
+ {
+ GSL_ERROR ("eigenvector matrix must match matrix size", GSL_EBADLEN);
+ }
+ else
+ {
+ double *const d = w->d;
+ double *const sd = w->sd;
+ const size_t N = A->size1;
+ size_t a, b;
+
+ /* handle special case */
+
+ if (N == 1)
+ {
+ double A00 = gsl_matrix_get (A, 0, 0);
+ gsl_vector_set (eval, 0, A00);
+ gsl_matrix_set (evec, 0, 0, 1.0);
+ return GSL_SUCCESS;
+ }
+
+ /* use sd as the temporary workspace for the decomposition when
+ computing eigenvectors */
+
+ {
+ gsl_vector_view d_vec = gsl_vector_view_array (d, N);
+ gsl_vector_view sd_vec = gsl_vector_view_array (sd, N - 1);
+ gsl_vector_view tau = gsl_vector_view_array (sd, N - 1);
+ gsl_linalg_symmtd_decomp (A, &tau.vector);
+ gsl_linalg_symmtd_unpack (A, &tau.vector, evec, &d_vec.vector, &sd_vec.vector);
+ }
+
+ /* Make an initial pass through the tridiagonal decomposition
+ to remove off-diagonal elements which are effectively zero */
+
+ chop_small_elements (N, d, sd);
+
+ /* Progressively reduce the matrix until it is diagonal */
+
+ b = N - 1;
+
+ while (b > 0)
+ {
+ if (sd[b - 1] == 0.0 || isnan(sd[b - 1]))
+ {
+ b--;
+ continue;
+ }
+
+ /* Find the largest unreduced block (a,b) starting from b
+ and working backwards */
+
+ a = b - 1;
+
+ while (a > 0)
+ {
+ if (sd[a - 1] == 0.0)
+ {
+ break;
+ }
+ a--;
+ }
+
+ {
+ size_t i;
+ const size_t n_block = b - a + 1;
+ double *d_block = d + a;
+ double *sd_block = sd + a;
+ double * const gc = w->gc;
+ double * const gs = w->gs;
+
+ /* apply QR reduction with implicit deflation to the
+ unreduced block */
+
+ qrstep (n_block, d_block, sd_block, gc, gs);
+
+ /* Apply Givens rotation Gij(c,s) to matrix Q, Q <- Q G */
+
+ for (i = 0; i < n_block - 1; i++)
+ {
+ const double c = gc[i], s = gs[i];
+ size_t k;
+
+ for (k = 0; k < N; k++)
+ {
+ double qki = gsl_matrix_get (evec, k, a + i);
+ double qkj = gsl_matrix_get (evec, k, a + i + 1);
+ gsl_matrix_set (evec, k, a + i, qki * c - qkj * s);
+ gsl_matrix_set (evec, k, a + i + 1, qki * s + qkj * c);
+ }
+ }
+
+ /* remove any small off-diagonal elements */
+
+ chop_small_elements (N, d, sd);
+ }
+ }
+
+ {
+ gsl_vector_view d_vec = gsl_vector_view_array (d, N);
+ gsl_vector_memcpy (eval, &d_vec.vector);
+ }
+
+ return GSL_SUCCESS;
+ }
+}
diff --git a/gsl-1.9/eigen/test.c b/gsl-1.9/eigen/test.c
new file mode 100644
index 0000000..460a379
--- /dev/null
+++ b/gsl-1.9/eigen/test.c
@@ -0,0 +1,622 @@
+/* eigen/test.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_blas.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_complex_math.h>
+#include <gsl/gsl_eigen.h>
+#include <gsl/gsl_linalg.h>
+
+gsl_matrix *
+create_hilbert_matrix(int size)
+{
+ int i, j;
+ gsl_matrix * m = gsl_matrix_alloc(size, size);
+ for(i=0; i<size; i++) {
+ for(j=0; j<size; j++) {
+ gsl_matrix_set(m, i, j, 1.0/(i+j+1.0));
+ }
+ }
+ return m;
+}
+
+gsl_matrix *
+create_random_symm_matrix(int size)
+{
+ int i, j;
+ unsigned long k = 1;
+ gsl_matrix * m = gsl_matrix_alloc(size, size);
+ for(i=0; i<size; i++) {
+ for(j=i; j<size; j++) {
+ double x;
+ k = (69069 * k + 1) & 0xffffffffUL;
+ x = k / 4294967296.0;
+ gsl_matrix_set(m, i, j, x);
+ gsl_matrix_set(m, j, i, x);
+ }
+ }
+ return m;
+}
+
+gsl_matrix_complex *
+create_random_herm_matrix(int size)
+{
+ int i, j;
+ unsigned long k = 1;
+ gsl_matrix_complex * m = gsl_matrix_complex_alloc(size, size);
+ for(i=0; i<size; i++) {
+ for(j=i; j<size; j++) {
+ gsl_complex z;
+ k = (69069 * k + 1) & 0xffffffffUL;
+ GSL_REAL(z) = k / 4294967296.0;
+ k = (69069 * k + 1) & 0xffffffffUL;
+ GSL_IMAG(z) = (i == j) ? 0 : k / 4294967296.0;
+ gsl_matrix_complex_set(m, i, j, z);
+ gsl_matrix_complex_set(m, j, i, gsl_complex_conjugate(z));
+ }
+ }
+ return m;
+}
+
+gsl_matrix *
+create_random_nonsymm_matrix(int size)
+{
+ int i, j;
+ unsigned long k = 1;
+ gsl_matrix * m = gsl_matrix_alloc(size, size);
+ for(i=0; i<size; i++) {
+ for(j=0; j<size; j++) {
+ k = (69069 * k + 1) & 0xffffffffUL;
+ gsl_matrix_set(m, i, j, k / 4294967296.0);
+ }
+ }
+ return m;
+}
+
+void
+test_eigen_results (size_t N, const gsl_matrix * m, const gsl_vector * eval,
+ const gsl_matrix * evec, const char * desc,
+ const char * desc2)
+{
+ size_t i,j;
+
+ gsl_vector * x = gsl_vector_alloc(N);
+ gsl_vector * y = gsl_vector_alloc(N);
+
+ /* check eigenvalues */
+
+ for (i = 0; i < N; i++)
+ {
+ double ei = gsl_vector_get (eval, i);
+ gsl_vector_const_view vi = gsl_matrix_const_column(evec, i);
+ gsl_vector_memcpy(x, &vi.vector);
+ /* compute y = m x (should = lambda v) */
+ gsl_blas_dgemv (CblasNoTrans, 1.0, m, x, 0.0, y);
+ for (j = 0; j < N; j++)
+ {
+ double xj = gsl_vector_get (x, j);
+ double yj = gsl_vector_get (y, j);
+ gsl_test_rel(yj, ei * xj, 1e8 * GSL_DBL_EPSILON,
+ "%s, eigenvalue(%d,%d), %s", desc, i, j, desc2);
+ }
+ }
+
+ /* check eigenvectors are orthonormal */
+
+ for (i = 0; i < N; i++)
+ {
+ gsl_vector_const_view vi = gsl_matrix_const_column(evec, i);
+ double nrm_v = gsl_blas_dnrm2(&vi.vector);
+ gsl_test_rel (nrm_v, 1.0, N * GSL_DBL_EPSILON, "%s, normalized(%d), %s",
+ desc, i, desc2);
+ }
+
+ for (i = 0; i < N; i++)
+ {
+ gsl_vector_const_view vi = gsl_matrix_const_column(evec, i);
+ for (j = i + 1; j < N; j++)
+ {
+ gsl_vector_const_view vj = gsl_matrix_const_column(evec, j);
+ double vivj;
+ gsl_blas_ddot (&vi.vector, &vj.vector, &vivj);
+ gsl_test_abs (vivj, 0.0, N * GSL_DBL_EPSILON,
+ "%s, orthogonal(%d,%d), %s", desc, i, j, desc2);
+ }
+ }
+
+ gsl_vector_free(x);
+ gsl_vector_free(y);
+}
+
+
+void
+test_eigenvalues (size_t N, const gsl_vector *eval, const gsl_vector * eval2,
+ const char * desc, const char * desc2)
+{
+ size_t i;
+ for (i = 0; i < N; i++)
+ {
+ double ei = gsl_vector_get (eval, i);
+ double e2i = gsl_vector_get (eval2, i);
+ gsl_test_rel(ei, e2i, 10*N*GSL_DBL_EPSILON,
+ "%s, direct eigenvalue(%d), %s",
+ desc, i, desc2);
+ }
+}
+
+void
+test_eigenvalues_complex (size_t N, const gsl_vector_complex *eval,
+ const gsl_vector_complex * eval2,
+ const char * desc, const char * desc2)
+{
+ size_t i;
+ for (i = 0; i < N; i++)
+ {
+ gsl_complex ei = gsl_vector_complex_get (eval, i);
+ gsl_complex e2i = gsl_vector_complex_get (eval2, i);
+ gsl_test_rel(GSL_REAL(ei), GSL_REAL(e2i), 10*N*GSL_DBL_EPSILON,
+ "%s, direct eigenvalue(%d) real, %s",
+ desc, i, desc2);
+ gsl_test_rel(GSL_IMAG(ei), GSL_IMAG(e2i), 10*N*GSL_DBL_EPSILON,
+ "%s, direct eigenvalue(%d) imag, %s",
+ desc, i, desc2);
+ }
+}
+
+void
+test_eigen_complex_results (size_t N, const gsl_matrix_complex * m,
+ const gsl_vector * eval,
+ const gsl_matrix_complex * evec,
+ const char * desc,
+ const char * desc2)
+{
+ size_t i,j;
+
+ gsl_vector_complex * x = gsl_vector_complex_alloc(N);
+ gsl_vector_complex * y = gsl_vector_complex_alloc(N);
+
+ /* check eigenvalues */
+
+ for (i = 0; i < N; i++)
+ {
+ double ei = gsl_vector_get (eval, i);
+ gsl_vector_complex_const_view vi = gsl_matrix_complex_const_column(evec, i);
+ gsl_vector_complex_memcpy(x, &vi.vector);
+ /* compute y = m x (should = lambda v) */
+ gsl_blas_zgemv (CblasNoTrans, GSL_COMPLEX_ONE, m, x,
+ GSL_COMPLEX_ZERO, y);
+ for (j = 0; j < N; j++)
+ {
+ gsl_complex xj = gsl_vector_complex_get (x, j);
+ gsl_complex yj = gsl_vector_complex_get (y, j);
+ gsl_test_rel(GSL_REAL(yj), ei * GSL_REAL(xj), 1e8*GSL_DBL_EPSILON,
+ "%s, eigenvalue(%d,%d), real, %s", desc, i, j, desc2);
+ gsl_test_rel(GSL_IMAG(yj), ei * GSL_IMAG(xj), 1e8*GSL_DBL_EPSILON,
+ "%s, eigenvalue(%d,%d), imag, %s", desc, i, j, desc2);
+ }
+ }
+
+ /* check eigenvectors are orthonormal */
+
+ for (i = 0; i < N; i++)
+ {
+ gsl_vector_complex_const_view vi = gsl_matrix_complex_const_column(evec, i);
+ double nrm_v = gsl_blas_dznrm2(&vi.vector);
+ gsl_test_rel (nrm_v, 1.0, N * GSL_DBL_EPSILON, "%s, normalized(%d), %s",
+ desc, i, desc2);
+ }
+
+ for (i = 0; i < N; i++)
+ {
+ gsl_vector_complex_const_view vi = gsl_matrix_complex_const_column(evec, i);
+ for (j = i + 1; j < N; j++)
+ {
+ gsl_vector_complex_const_view vj
+ = gsl_matrix_complex_const_column(evec, j);
+ gsl_complex vivj;
+ gsl_blas_zdotc (&vi.vector, &vj.vector, &vivj);
+ gsl_test_abs (gsl_complex_abs(vivj), 0.0, N * GSL_DBL_EPSILON,
+ "%s, orthogonal(%d,%d), %s", desc, i, j, desc2);
+ }
+ }
+
+ gsl_vector_complex_free(x);
+ gsl_vector_complex_free(y);
+}
+
+void
+test_eigen_nonsymm_results (size_t N, const gsl_matrix * m,
+ const gsl_vector_complex * eval,
+ const gsl_matrix_complex * evec,
+ const char * desc,
+ const char * desc2)
+{
+ size_t i,j;
+
+ gsl_vector_complex * x = gsl_vector_complex_alloc(N);
+ gsl_vector_complex * y = gsl_vector_complex_alloc(N);
+ gsl_matrix_complex * A = gsl_matrix_complex_alloc(N, N);
+
+ /* we need a complex matrix for the blas routines, so copy m into A */
+ for (i = 0; i < N; ++i)
+ {
+ for (j = 0; j < N; ++j)
+ {
+ gsl_complex z;
+ GSL_SET_COMPLEX(&z, gsl_matrix_get(m, i, j), 0.0);
+ gsl_matrix_complex_set(A, i, j, z);
+ }
+ }
+
+ for (i = 0; i < N; i++)
+ {
+ gsl_complex ei = gsl_vector_complex_get (eval, i);
+ gsl_vector_complex_const_view vi = gsl_matrix_complex_const_column(evec, i);
+ double norm = gsl_blas_dznrm2(&vi.vector);
+
+ /* check that eigenvector is normalized */
+ gsl_test_rel(norm, 1.0, N * GSL_DBL_EPSILON,
+ "%s, normalized(%d), %s", desc, i, desc2);
+
+ gsl_vector_complex_memcpy(x, &vi.vector);
+
+ /* compute y = m x (should = lambda v) */
+ gsl_blas_zgemv (CblasNoTrans, GSL_COMPLEX_ONE, A, x,
+ GSL_COMPLEX_ZERO, y);
+
+ /* compute x = lambda v */
+ gsl_blas_zscal(ei, x);
+
+ /* now test if y = x */
+ for (j = 0; j < N; j++)
+ {
+ gsl_complex xj = gsl_vector_complex_get (x, j);
+ gsl_complex yj = gsl_vector_complex_get (y, j);
+
+ /* use abs here in case the values are close to 0 */
+ gsl_test_abs(GSL_REAL(yj), GSL_REAL(xj), 1e8*GSL_DBL_EPSILON,
+ "%s, eigenvalue(%d,%d), real, %s", desc, i, j, desc2);
+ gsl_test_abs(GSL_IMAG(yj), GSL_IMAG(xj), 1e8*GSL_DBL_EPSILON,
+ "%s, eigenvalue(%d,%d), imag, %s", desc, i, j, desc2);
+ }
+ }
+
+ gsl_matrix_complex_free(A);
+ gsl_vector_complex_free(x);
+ gsl_vector_complex_free(y);
+}
+
+void
+test_eigen_nonsymm_Z(size_t N, const gsl_matrix * m, gsl_matrix * Z,
+ gsl_matrix * T, const char * desc)
+{
+ size_t i, j;
+
+ gsl_matrix * T1 = gsl_matrix_alloc(N, N);
+ gsl_matrix * T2 = gsl_matrix_alloc(N, N);
+
+ /* zero lower triangle of T */
+ gsl_linalg_hessenberg_set_zero(T);
+
+ /* compute T1 = m Z */
+ gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, m, Z, 0.0, T1);
+
+ /* compute T2 = Z T */
+ gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, Z, T, 0.0, T2);
+
+ for (i = 0; i < N; ++i)
+ {
+ for (j = 0; j < N; ++j)
+ {
+ double x = gsl_matrix_get(T1, i, j);
+ double y = gsl_matrix_get(T2, i, j);
+
+ gsl_test_rel(x, y, 1.0e8 * GSL_DBL_EPSILON,
+ "%s, schur(%d,%d)", desc, i, j);
+ }
+ }
+
+ gsl_matrix_free (T1);
+ gsl_matrix_free (T2);
+}
+
+void
+test_eigen_symm(const char * desc, const gsl_matrix * m)
+{
+ size_t N = m->size1;
+
+ gsl_matrix * A = gsl_matrix_alloc(N, N);
+ gsl_matrix * evec = gsl_matrix_alloc(N, N);
+ gsl_vector * eval = gsl_vector_alloc(N);
+ gsl_vector * eval2 = gsl_vector_alloc(N);
+
+ gsl_eigen_symm_workspace * w1 = gsl_eigen_symm_alloc (N);
+ gsl_eigen_symmv_workspace * w2 = gsl_eigen_symmv_alloc (N);
+
+ gsl_matrix_memcpy(A, m);
+ gsl_eigen_symmv(A, eval, evec, w2);
+ test_eigen_results (N, m, eval, evec, desc, "unsorted");
+
+ gsl_matrix_memcpy(A, m);
+ gsl_eigen_symm(A, eval2, w1);
+ test_eigenvalues (N, eval, eval2, desc, "unsorted");
+
+ gsl_eigen_symmv_sort (eval, evec, GSL_EIGEN_SORT_VAL_ASC);
+ test_eigen_results (N, m, eval, evec, desc, "val/asc");
+
+ gsl_eigen_symmv_sort (eval, evec, GSL_EIGEN_SORT_VAL_DESC);
+ test_eigen_results (N, m, eval, evec, desc, "val/desc");
+
+ gsl_eigen_symmv_sort (eval, evec, GSL_EIGEN_SORT_ABS_ASC);
+ test_eigen_results (N, m, eval, evec, desc, "abs/asc");
+
+ gsl_eigen_symmv_sort (eval, evec, GSL_EIGEN_SORT_ABS_DESC);
+ test_eigen_results (N, m, eval, evec, desc, "abs/desc");
+
+ gsl_eigen_symm_free (w1);
+ gsl_eigen_symmv_free (w2);
+
+ gsl_matrix_free(A);
+ gsl_matrix_free(evec);
+ gsl_vector_free(eval);
+ gsl_vector_free(eval2);
+}
+
+
+void
+test_eigen_herm(const char * desc, const gsl_matrix_complex * m)
+{
+ size_t N = m->size1;
+
+ gsl_matrix_complex * A = gsl_matrix_complex_alloc(N, N);
+ gsl_matrix_complex * evec = gsl_matrix_complex_alloc(N, N);
+ gsl_vector * eval = gsl_vector_alloc(N);
+ gsl_vector * eval2 = gsl_vector_alloc(N);
+
+ gsl_eigen_herm_workspace * w1 = gsl_eigen_herm_alloc (N);
+ gsl_eigen_hermv_workspace * w2 = gsl_eigen_hermv_alloc (N);
+
+ gsl_matrix_complex_memcpy(A, m);
+ gsl_eigen_hermv(A, eval, evec, w2);
+ test_eigen_complex_results (N, m, eval, evec, desc, "unsorted");
+
+ gsl_matrix_complex_memcpy(A, m);
+ gsl_eigen_herm(A, eval2, w1);
+ test_eigenvalues (N, eval, eval2, desc, "unsorted");
+
+ gsl_eigen_hermv_sort (eval, evec, GSL_EIGEN_SORT_VAL_ASC);
+ test_eigen_complex_results (N, m, eval, evec, desc, "val/asc");
+
+ gsl_eigen_hermv_sort (eval, evec, GSL_EIGEN_SORT_VAL_DESC);
+ test_eigen_complex_results (N, m, eval, evec, desc, "val/desc");
+
+ gsl_eigen_hermv_sort (eval, evec, GSL_EIGEN_SORT_ABS_ASC);
+ test_eigen_complex_results (N, m, eval, evec, desc, "abs/asc");
+
+ gsl_eigen_hermv_sort (eval, evec, GSL_EIGEN_SORT_ABS_DESC);
+ test_eigen_complex_results (N, m, eval, evec, desc, "abs/desc");
+
+ gsl_eigen_herm_free (w1);
+ gsl_eigen_hermv_free (w2);
+
+ gsl_matrix_complex_free(A);
+ gsl_matrix_complex_free(evec);
+ gsl_vector_free(eval);
+ gsl_vector_free(eval2);
+}
+
+void
+test_eigen_nonsymm(const char * desc, const gsl_matrix * m)
+{
+ size_t N = m->size1;
+
+ gsl_matrix * A = gsl_matrix_alloc(N, N);
+ gsl_matrix * Z = gsl_matrix_alloc(N, N);
+ gsl_matrix_complex * evec = gsl_matrix_complex_alloc(N, N);
+ gsl_vector_complex * eval = gsl_vector_complex_alloc(N);
+
+ gsl_eigen_nonsymmv_workspace * wv = gsl_eigen_nonsymmv_alloc (N);
+
+ /*
+ * calculate eigenvalues and eigenvectors - it is sufficient to test
+ * gsl_eigen_nonsymmv() since that function calls gsl_eigen_nonsymm()
+ * for the eigenvalues
+ */
+ gsl_matrix_memcpy(A, m);
+ gsl_eigen_nonsymmv(A, eval, evec, wv);
+ test_eigen_nonsymm_results (N, m, eval, evec, desc, "unsorted");
+
+ /* test sort routines */
+ gsl_eigen_nonsymmv_sort (eval, evec, GSL_EIGEN_SORT_ABS_ASC);
+ test_eigen_nonsymm_results (N, m, eval, evec, desc, "abs/asc");
+
+ gsl_eigen_nonsymmv_sort (eval, evec, GSL_EIGEN_SORT_ABS_DESC);
+ test_eigen_nonsymm_results (N, m, eval, evec, desc, "abs/desc");
+
+ /* test Schur vectors */
+ gsl_matrix_memcpy(A, m);
+ gsl_eigen_nonsymmv_Z(A, eval, evec, Z, wv);
+ test_eigen_nonsymm_Z(N, m, Z, A, desc);
+
+ gsl_eigen_nonsymmv_free (wv);
+
+ gsl_matrix_free(A);
+ gsl_matrix_free(Z);
+ gsl_matrix_complex_free(evec);
+ gsl_vector_complex_free(eval);
+}
+
+void
+test_eigen_jacobi(const char * desc, const gsl_matrix * m)
+{
+ size_t N = m->size1;
+ unsigned int nrot;
+
+ gsl_matrix * A = gsl_matrix_alloc(N, N);
+ gsl_matrix * evec = gsl_matrix_alloc(N, N);
+ gsl_vector * eval = gsl_vector_alloc(N);
+
+ gsl_matrix_memcpy(A, m);
+ gsl_eigen_jacobi(A, eval, evec, 1000, &nrot);
+ gsl_eigen_symmv_sort(eval, evec, GSL_EIGEN_SORT_VAL_ASC);
+
+ test_eigen_results (N, m, eval, evec, desc, "");
+
+ gsl_matrix_free(A);
+ gsl_matrix_free(evec);
+ gsl_vector_free(eval);
+}
+
+
+int test_invert_jacobi(void)
+{
+ int s = 0;
+ int i, j;
+ gsl_matrix * hminv = gsl_matrix_alloc(10, 10);
+ gsl_matrix * id = gsl_matrix_alloc(10, 10);
+
+ /* 10x10 Hilbert matrix */
+ gsl_matrix * hm = create_hilbert_matrix(10);
+ gsl_eigen_invert_jacobi(hm, hminv, 1000);
+
+ /* gsl_linalg_matmult(hm, hminv, id); */
+ gsl_blas_dgemm (CblasNoTrans, CblasNoTrans, 1.0, hm, hminv, 0.0, id);
+
+ for(i=0; i<10; i++) {
+ for(j=0; j<10; j++) {
+ double delta_ij = ( i == j ? 1.0 : 0.0 );
+ double id_ij = gsl_matrix_get(id, i, j);
+
+ int rs = ( fabs(id_ij - delta_ij) > 5.0e-3 );
+ s += rs;
+ gsl_test_abs(id_ij, delta_ij, 5e-3, "invert hilbert(10) %d,%d", i,j);
+ }
+ }
+
+ gsl_test (s, "gsl_eigen_jacobi_invert hilbert(10)");
+
+ gsl_matrix_free(hm);
+ gsl_matrix_free(hminv);
+ gsl_matrix_free(id);
+
+ return s;
+}
+
+int main()
+{
+ gsl_ieee_env_setup ();
+
+ {
+ double r[] = { 0, 0, -1, 0,
+ 0, 1, 0, 1,
+ -1, 0, 0, 0,
+ 0, 1, 0, 0 };
+ gsl_matrix_view s4 = gsl_matrix_view_array (r, 4, 4);
+
+ test_eigen_symm("symm(4)", &s4.matrix);
+ }
+
+ {
+ double c[] = { 0,0, 0,0, -1,0, 0,0,
+ 0,0, 1,0, 0,0, 1,0,
+ -1,0, 0,0, 0,0, 0,0,
+ 0,0, 1,0, 0,0, 0,0 };
+
+ gsl_matrix_complex_view h4 = gsl_matrix_complex_view_array (c, 4, 4);
+
+ test_eigen_herm("herm(4)", &h4.matrix);
+ }
+
+ {
+ double r[] = { 0, 1, 1, 1,
+ 1, 1, 1, 1,
+ 0, 0, 0, 0,
+ 0, 0, 0, 0 };
+ gsl_matrix_view n4 = gsl_matrix_view_array (r, 4, 4);
+
+ test_eigen_nonsymm("nonsymm(4)", &n4.matrix);
+ }
+
+ {
+ double r[] = { 1, 0, 0, 0,
+ 0, 2, 0, 0,
+ 0, 0, 3, 0,
+ 0, 0, 0, 4 };
+ gsl_matrix_view s4 = gsl_matrix_view_array (r, 4, 4);
+
+ test_eigen_symm("symm(4) diag", &s4.matrix);
+ }
+
+ {
+ double c[] = { 1,0, 0,0, 0,0, 0,0,
+ 0,0, 2,0, 0,0, 0,0,
+ 0,0, 0,0, 3,0, 0,0,
+ 0,0, 0,0, 0,0, 4,0 };
+
+ gsl_matrix_complex_view h4 = gsl_matrix_complex_view_array (c, 4, 4);
+
+ test_eigen_herm("herm(4) diag", &h4.matrix);
+ }
+
+ {
+ double r[] = { 1, 1, 0, 1,
+ 1, 1, 1, 1,
+ 1, 1, 1, 1,
+ 0, 1, 0, 0 };
+ gsl_matrix_view n4 = gsl_matrix_view_array (r, 4, 4);
+
+ test_eigen_nonsymm("nonsymm(4) degen", &n4.matrix);
+ }
+
+ {
+ gsl_matrix *rs10 = create_random_symm_matrix (10);
+ test_eigen_symm("symm(10)", rs10);
+ gsl_matrix_free (rs10);
+ }
+
+ {
+ gsl_matrix_complex *rh10 = create_random_herm_matrix (10);
+ test_eigen_herm("herm(10)", rh10);
+ gsl_matrix_complex_free (rh10);
+ }
+
+ {
+ gsl_matrix *rn10 = create_random_nonsymm_matrix (10);
+ test_eigen_nonsymm("nonsymm(10)", rn10);
+ gsl_matrix_free (rn10);
+ }
+
+#if 0 /* Deprecated functions */
+ {
+ gsl_matrix *h5 = create_hilbert_matrix (5);
+ test_eigen_jacobi("hilbert(5)", h5);
+ test_invert_jacobi();
+ gsl_matrix_free (h5);
+ }
+#endif
+
+ exit (gsl_test_summary());
+}
diff --git a/gsl-1.9/err/ChangeLog b/gsl-1.9/err/ChangeLog
new file mode 100644
index 0000000..c5916fd
--- /dev/null
+++ b/gsl-1.9/err/ChangeLog
@@ -0,0 +1,161 @@
+2004-07-10 Brian Gough <bjg@network-theory.co.uk>
+
+ * error.c (gsl_error): flush stdout/stderr before aborting (needed
+ to get a useful error message on some platforms)
+
+2003-06-17 Brian Gough <bjg@network-theory.co.uk>
+
+ * warn.c: removed, the functions are not used
+
+Sat Apr 27 21:27:32 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * error.c (gsl_error): added an explanatory message in the default
+ error handler before aborting
+
+Tue Jun 12 11:52:23 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_errno.h (GSL_STATUS_UPDATE): added macro for updating
+ status value multiple times
+
+Fri Apr 27 18:18:59 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_errno.h (GSL_ERROR_NULL): added macro which returns NULL,
+ for out of memory conditions
+
+Mon Jan 22 16:01:55 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_errno.h: added EOF for end of file
+
+Sat Aug 26 19:26:59 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_errno.h: added error codes ETOLF, ETOLX, ETOLG for
+ unattainable tolerances in (F,X,G) in multimin MINPACK LM
+ algorithm.
+
+Fri May 5 11:20:10 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * split gsl_test code out into separate test/ directory
+
+Sun Nov 28 17:17:03 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_errno.h: added GSL_ENOPROG and GSL_ENOPROGJ to handle error
+ conditions from minpack hybrid algorithms (INFO=5,4 in the
+ original code)
+
+Thu Oct 28 14:41:31 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_test.h: changed variable name in prototype for clarity
+
+Thu Oct 7 11:46:53 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * test_results.c (gsl_test_str): changed #if __STDC__ to #ifdef
+ __STDC__ so the code will compile with compilers that define
+ __STDC__ to 0 meaning STDC+extensions.
+
+Sun Jul 11 21:48:25 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * test_errnos.c (main): added GSL_ECACHE to handle internal cache
+ structures which grow and can hit a limit
+
+Sun Mar 7 17:00:08 1999 Brian Gough <bjg@netsci.freeserve.co.uk>
+
+ * gsl_errno.h, test_errnos.c, strerror.c: added GSL_EDIVERGE for
+ divergent integrals and series
+
+Sat Feb 20 12:14:47 1999 Brian Gough <bjg@netsci.freeserve.co.uk>
+
+ * test_errnos.c (main): added the new error codes to the tests
+
+ * gsl_errno.h: moved all the error codes into a single enum
+ instead of having a separate enum for GSL_SUCCESS and GSL_FAILURE
+
+Fri Feb 19 15:56:15 1999 Brian Gough <bjg@netsci.freeserve.co.uk>
+
+ * gsl_errno.h, strerror.c: added GSL_CONTINUE as an error code
+ indicating that an iteration process has not converged and should
+ be continued for more iterations.
+
+Tue Nov 17 17:11:31 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * gsl_test.h: removed #include <config.h> which should not be
+ present in installed header files
+
+Tue Nov 10 15:55:56 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * test_results.c (gsl_test_abs), gsl_test.h: added gsl_test_abs
+ for absolute errors, like gsl_test_rel for relative errors
+
+Fri Oct 23 12:51:01 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * test_results.c (gsl_test_rel): print a shorter "observed vs
+ expected" message if the description is 45 characters or longer
+
+Mon Jun 1 11:02:04 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * gsl_errno.h: added GSL_EUNSUP for errors caused by a hardware
+ feature which is not supported on a particular platform
+
+ * renamed test.c to test_results.c to avoid confusion when debugging
+ other test programs called test.c
+
+Sat May 30 16:11:34 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * gsl_errno.h: add GSL_ESING for errors caused by singularities
+ or other bad function behavior
+
+Fri May 29 14:41:19 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * gsl_errno.h: added GSL_EBADLEN to signify bad lengths of
+ matrices or vectors (e.g. non-conformant sizes in a matrix or
+ vector multiplication)
+
+Wed May 27 18:15:34 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * test.c (gsl_test_str): changed things so that the strings aren't
+ printed unless the string equality test fails (usually they were
+ too long)
+
+Mon May 18 17:58:20 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * test.c (gsl_test_rel): added a test for numerical quantities,
+ given a result, an expected result and an allowable relative
+ error.
+ (gsl_test_int): added a test for comparing integers
+
+Sun May 10 16:03:12 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * gsl_errno.h: added GSL_EROUND for roundoff errors
+
+Fri May 8 18:50:13 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * gsl_errno.h: changed GSL_ETIMEOUT to GSL_EMAXITER to describe
+ the error that occurs when a specified number of iterations is
+ exceeded.
+
+Sun Apr 19 19:14:05 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * strerror.c (gsl_strerror): added an strerror function for making
+ readable descriptions of the error number
+
+Wed Apr 15 21:59:57 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * added a stream handler, for the error stream
+
+ * completely reorganized the files, but the functions are
+ relatively unchanged
+
+Wed Apr 8 13:55:48 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * gsl_errno.h (GSL_ERROR_RETURN_NOTHING): added an error macro
+ suitable for void functions
+
+Mon Apr 6 14:10:48 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * gsl_errno.h: use enum instead of #define for symbolic constants,
+ so that they can be seen in the debugger
+
+Sun Apr 5 19:49:17 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * err/errno.c (gsl_error): now takes gsl_errno as an argument
+ (this is useful for doing conditional breakpoints)
+
diff --git a/gsl-1.9/err/Makefile.am b/gsl-1.9/err/Makefile.am
new file mode 100644
index 0000000..9f4175f
--- /dev/null
+++ b/gsl-1.9/err/Makefile.am
@@ -0,0 +1,12 @@
+noinst_LTLIBRARIES = libgslerr.la
+
+pkginclude_HEADERS = gsl_errno.h gsl_message.h
+
+libgslerr_la_SOURCES = error.c stream.c message.c strerror.c
+
+check_PROGRAMS = test
+
+TESTS = $(check_PROGRAMS)
+
+test_SOURCES = test.c
+test_LDADD = libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
diff --git a/gsl-1.9/err/Makefile.in b/gsl-1.9/err/Makefile.in
new file mode 100644
index 0000000..f6827b3
--- /dev/null
+++ b/gsl-1.9/err/Makefile.in
@@ -0,0 +1,541 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = test$(EXEEXT)
+subdir = err
+DIST_COMMON = $(pkginclude_HEADERS) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in ChangeLog TODO
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgslerr_la_LIBADD =
+am_libgslerr_la_OBJECTS = error.lo stream.lo message.lo strerror.lo
+libgslerr_la_OBJECTS = $(am_libgslerr_la_OBJECTS)
+am_test_OBJECTS = test.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = libgslerr.la ../test/libgsltest.la \
+ ../sys/libgslsys.la ../utils/libutils.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgslerr_la_SOURCES) $(test_SOURCES)
+DIST_SOURCES = $(libgslerr_la_SOURCES) $(test_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libgslerr.la
+pkginclude_HEADERS = gsl_errno.h gsl_message.h
+libgslerr_la_SOURCES = error.c stream.c message.c strerror.c
+TESTS = $(check_PROGRAMS)
+test_SOURCES = test.c
+test_LDADD = libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps err/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps err/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgslerr.la: $(libgslerr_la_OBJECTS) $(libgslerr_la_DEPENDENCIES)
+ $(LINK) $(libgslerr_la_LDFLAGS) $(libgslerr_la_OBJECTS) $(libgslerr_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkgincludeHEADERS
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/err/TODO b/gsl-1.9/err/TODO
new file mode 100644
index 0000000..06dff89
--- /dev/null
+++ b/gsl-1.9/err/TODO
@@ -0,0 +1,3 @@
+* Add a GSL_ERROR_MODE environment variable for choosing error
+behavior at runtime (???).
+
diff --git a/gsl-1.9/err/error.c b/gsl-1.9/err/error.c
new file mode 100644
index 0000000..709512d
--- /dev/null
+++ b/gsl-1.9/err/error.c
@@ -0,0 +1,78 @@
+/* err/error.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_message.h>
+
+gsl_error_handler_t * gsl_error_handler = NULL;
+
+static void no_error_handler (const char *reason, const char *file, int line, int gsl_errno);
+
+void
+gsl_error (const char * reason, const char * file, int line, int gsl_errno)
+{
+ if (gsl_error_handler)
+ {
+ (*gsl_error_handler) (reason, file, line, gsl_errno);
+ return ;
+ }
+
+ gsl_stream_printf ("ERROR", file, line, reason);
+
+ fflush (stdout);
+ fprintf (stderr, "Default GSL error handler invoked.\n");
+ fflush (stderr);
+
+ abort ();
+}
+
+gsl_error_handler_t *
+gsl_set_error_handler (gsl_error_handler_t * new_handler)
+{
+ gsl_error_handler_t * previous_handler = gsl_error_handler;
+ gsl_error_handler = new_handler;
+ return previous_handler;
+}
+
+
+gsl_error_handler_t *
+gsl_set_error_handler_off (void)
+{
+ gsl_error_handler_t * previous_handler = gsl_error_handler;
+ gsl_error_handler = no_error_handler;
+ return previous_handler;
+}
+
+static void
+no_error_handler (const char *reason, const char *file, int line, int gsl_errno)
+{
+ /* do nothing */
+ reason = 0;
+ file = 0;
+ line = 0;
+ gsl_errno = 0;
+ return;
+}
+
+
diff --git a/gsl-1.9/err/gsl_errno.h b/gsl-1.9/err/gsl_errno.h
new file mode 100644
index 0000000..ca537e9
--- /dev/null
+++ b/gsl-1.9/err/gsl_errno.h
@@ -0,0 +1,154 @@
+/* err/gsl_errno.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_ERRNO_H__
+#define __GSL_ERRNO_H__
+
+#include <stdio.h>
+#include <errno.h>
+#include <gsl/gsl_types.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+enum {
+ GSL_SUCCESS = 0,
+ GSL_FAILURE = -1,
+ GSL_CONTINUE = -2, /* iteration has not converged */
+ GSL_EDOM = 1, /* input domain error, e.g sqrt(-1) */
+ GSL_ERANGE = 2, /* output range error, e.g. exp(1e100) */
+ GSL_EFAULT = 3, /* invalid pointer */
+ GSL_EINVAL = 4, /* invalid argument supplied by user */
+ GSL_EFAILED = 5, /* generic failure */
+ GSL_EFACTOR = 6, /* factorization failed */
+ GSL_ESANITY = 7, /* sanity check failed - shouldn't happen */
+ GSL_ENOMEM = 8, /* malloc failed */
+ GSL_EBADFUNC = 9, /* problem with user-supplied function */
+ GSL_ERUNAWAY = 10, /* iterative process is out of control */
+ GSL_EMAXITER = 11, /* exceeded max number of iterations */
+ GSL_EZERODIV = 12, /* tried to divide by zero */
+ GSL_EBADTOL = 13, /* user specified an invalid tolerance */
+ GSL_ETOL = 14, /* failed to reach the specified tolerance */
+ GSL_EUNDRFLW = 15, /* underflow */
+ GSL_EOVRFLW = 16, /* overflow */
+ GSL_ELOSS = 17, /* loss of accuracy */
+ GSL_EROUND = 18, /* failed because of roundoff error */
+ GSL_EBADLEN = 19, /* matrix, vector lengths are not conformant */
+ GSL_ENOTSQR = 20, /* matrix not square */
+ GSL_ESING = 21, /* apparent singularity detected */
+ GSL_EDIVERGE = 22, /* integral or series is divergent */
+ GSL_EUNSUP = 23, /* requested feature is not supported by the hardware */
+ GSL_EUNIMPL = 24, /* requested feature not (yet) implemented */
+ GSL_ECACHE = 25, /* cache limit exceeded */
+ GSL_ETABLE = 26, /* table limit exceeded */
+ GSL_ENOPROG = 27, /* iteration is not making progress towards solution */
+ GSL_ENOPROGJ = 28, /* jacobian evaluations are not improving the solution */
+ GSL_ETOLF = 29, /* cannot reach the specified tolerance in F */
+ GSL_ETOLX = 30, /* cannot reach the specified tolerance in X */
+ GSL_ETOLG = 31, /* cannot reach the specified tolerance in gradient */
+ GSL_EOF = 32 /* end of file */
+} ;
+
+void gsl_error (const char * reason, const char * file, int line,
+ int gsl_errno);
+
+void gsl_stream_printf (const char *label, const char *file,
+ int line, const char *reason);
+
+const char * gsl_strerror (const int gsl_errno);
+
+typedef void gsl_error_handler_t (const char * reason, const char * file,
+ int line, int gsl_errno);
+
+typedef void gsl_stream_handler_t (const char * label, const char * file,
+ int line, const char * reason);
+
+gsl_error_handler_t *
+gsl_set_error_handler (gsl_error_handler_t * new_handler);
+
+gsl_error_handler_t *
+gsl_set_error_handler_off (void);
+
+gsl_stream_handler_t *
+gsl_set_stream_handler (gsl_stream_handler_t * new_handler);
+
+FILE * gsl_set_stream (FILE * new_stream);
+
+/* GSL_ERROR: call the error handler, and return the error code */
+
+#define GSL_ERROR(reason, gsl_errno) \
+ do { \
+ gsl_error (reason, __FILE__, __LINE__, gsl_errno) ; \
+ return gsl_errno ; \
+ } while (0)
+
+/* GSL_ERROR_VAL: call the error handler, and return the given value */
+
+#define GSL_ERROR_VAL(reason, gsl_errno, value) \
+ do { \
+ gsl_error (reason, __FILE__, __LINE__, gsl_errno) ; \
+ return value ; \
+ } while (0)
+
+/* GSL_ERROR_VOID: call the error handler, and then return
+ (for void functions which still need to generate an error) */
+
+#define GSL_ERROR_VOID(reason, gsl_errno) \
+ do { \
+ gsl_error (reason, __FILE__, __LINE__, gsl_errno) ; \
+ return ; \
+ } while (0)
+
+/* GSL_ERROR_NULL suitable for out-of-memory conditions */
+
+#define GSL_ERROR_NULL(reason, gsl_errno) GSL_ERROR_VAL(reason, gsl_errno, 0)
+
+/* Sometimes you have several status results returned from
+ * function calls and you want to combine them in some sensible
+ * way. You cannot produce a "total" status condition, but you can
+ * pick one from a set of conditions based on an implied hierarchy.
+ *
+ * In other words:
+ * you have: status_a, status_b, ...
+ * you want: status = (status_a if it is bad, or status_b if it is bad,...)
+ *
+ * In this example you consider status_a to be more important and
+ * it is checked first, followed by the others in the order specified.
+ *
+ * Here are some dumb macros to do this.
+ */
+#define GSL_ERROR_SELECT_2(a,b) ((a) != GSL_SUCCESS ? (a) : ((b) != GSL_SUCCESS ? (b) : GSL_SUCCESS))
+#define GSL_ERROR_SELECT_3(a,b,c) ((a) != GSL_SUCCESS ? (a) : GSL_ERROR_SELECT_2(b,c))
+#define GSL_ERROR_SELECT_4(a,b,c,d) ((a) != GSL_SUCCESS ? (a) : GSL_ERROR_SELECT_3(b,c,d))
+#define GSL_ERROR_SELECT_5(a,b,c,d,e) ((a) != GSL_SUCCESS ? (a) : GSL_ERROR_SELECT_4(b,c,d,e))
+
+#define GSL_STATUS_UPDATE(sp, s) do { if ((s) != GSL_SUCCESS) *(sp) = (s);} while(0)
+
+__END_DECLS
+
+#endif /* __GSL_ERRNO_H__ */
diff --git a/gsl-1.9/err/gsl_message.h b/gsl-1.9/err/gsl_message.h
new file mode 100644
index 0000000..c717f53
--- /dev/null
+++ b/gsl-1.9/err/gsl_message.h
@@ -0,0 +1,80 @@
+/* err/gsl_message.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_MESSAGE_H__
+#define __GSL_MESSAGE_H__
+#include <gsl/gsl_types.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+/* Provide a general messaging service for client use. Messages can
+ * be selectively turned off at compile time by defining an
+ * appropriate message mask. Client code which uses the GSL_MESSAGE()
+ * macro must provide a mask which is or'ed with the GSL_MESSAGE_MASK.
+ *
+ * The messaging service can be completely turned off
+ * by defining GSL_MESSAGING_OFF. */
+
+void gsl_message(const char * message, const char * file, int line,
+ unsigned int mask);
+
+#ifndef GSL_MESSAGE_MASK
+#define GSL_MESSAGE_MASK 0xffffffffu /* default all messages allowed */
+#endif
+
+GSL_VAR unsigned int gsl_message_mask ;
+
+/* Provide some symolic masks for client ease of use. */
+
+enum {
+ GSL_MESSAGE_MASK_A = 1,
+ GSL_MESSAGE_MASK_B = 2,
+ GSL_MESSAGE_MASK_C = 4,
+ GSL_MESSAGE_MASK_D = 8,
+ GSL_MESSAGE_MASK_E = 16,
+ GSL_MESSAGE_MASK_F = 32,
+ GSL_MESSAGE_MASK_G = 64,
+ GSL_MESSAGE_MASK_H = 128
+} ;
+
+#ifdef GSL_MESSAGING_OFF /* throw away messages */
+#define GSL_MESSAGE(message, mask) do { } while(0)
+#else /* output all messages */
+#define GSL_MESSAGE(message, mask) \
+ do { \
+ if (mask & GSL_MESSAGE_MASK) \
+ gsl_message (message, __FILE__, __LINE__, mask) ; \
+ } while (0)
+#endif
+
+__END_DECLS
+
+#endif /* __GSL_MESSAGE_H__ */
+
+
diff --git a/gsl-1.9/err/message.c b/gsl-1.9/err/message.c
new file mode 100644
index 0000000..9098b37
--- /dev/null
+++ b/gsl-1.9/err/message.c
@@ -0,0 +1,38 @@
+/* err/message.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_message.h>
+
+unsigned int gsl_message_mask = GSL_MESSAGE_MASK;
+
+void
+gsl_message (const char * reason, const char * file, int line,
+ unsigned int mask)
+{
+ if (mask & gsl_message_mask)
+ {
+ gsl_stream_printf ("MESSAGE", file, line, reason);
+ }
+}
diff --git a/gsl-1.9/err/stream.c b/gsl-1.9/err/stream.c
new file mode 100644
index 0000000..acc7122
--- /dev/null
+++ b/gsl-1.9/err/stream.c
@@ -0,0 +1,66 @@
+/* err/stream.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_message.h>
+
+FILE * gsl_stream = NULL ;
+gsl_stream_handler_t * gsl_stream_handler = NULL;
+
+void
+gsl_stream_printf (const char *label, const char *file, int line,
+ const char *reason)
+{
+ if (gsl_stream == NULL)
+ {
+ gsl_stream = stderr;
+ }
+ if (gsl_stream_handler)
+ {
+ (*gsl_stream_handler) (label, file, line, reason);
+ return;
+ }
+ fprintf (gsl_stream, "gsl: %s:%d: %s: %s\n", file, line, label, reason);
+
+}
+
+gsl_stream_handler_t *
+gsl_set_stream_handler (gsl_stream_handler_t * new_handler)
+{
+ gsl_stream_handler_t * previous_handler = gsl_stream_handler;
+ gsl_stream_handler = new_handler;
+ return previous_handler;
+}
+
+FILE *
+gsl_set_stream (FILE * new_stream)
+{
+ FILE * previous_stream;
+ if (gsl_stream == NULL) {
+ gsl_stream = stderr;
+ }
+ previous_stream = gsl_stream;
+ gsl_stream = new_stream;
+ return previous_stream;
+}
diff --git a/gsl-1.9/err/strerror.c b/gsl-1.9/err/strerror.c
new file mode 100644
index 0000000..49f57c0
--- /dev/null
+++ b/gsl-1.9/err/strerror.c
@@ -0,0 +1,101 @@
+/* err/strerror.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_errno.h>
+
+const char *
+gsl_strerror (const int gsl_errno)
+{
+ switch (gsl_errno)
+ {
+ case GSL_SUCCESS:
+ return "success" ;
+ case GSL_FAILURE:
+ return "failure" ;
+ case GSL_CONTINUE:
+ return "the iteration has not converged yet";
+ case GSL_EDOM:
+ return "input domain error" ;
+ case GSL_ERANGE:
+ return "output range error" ;
+ case GSL_EFAULT:
+ return "invalid pointer" ;
+ case GSL_EINVAL:
+ return "invalid argument supplied by user" ;
+ case GSL_EFAILED:
+ return "generic failure" ;
+ case GSL_EFACTOR:
+ return "factorization failed" ;
+ case GSL_ESANITY:
+ return "sanity check failed - shouldn't happen" ;
+ case GSL_ENOMEM:
+ return "malloc failed" ;
+ case GSL_EBADFUNC:
+ return "problem with user-supplied function";
+ case GSL_ERUNAWAY:
+ return "iterative process is out of control";
+ case GSL_EMAXITER:
+ return "exceeded max number of iterations" ;
+ case GSL_EZERODIV:
+ return "tried to divide by zero" ;
+ case GSL_EBADTOL:
+ return "specified tolerance is invalid or theoretically unattainable" ;
+ case GSL_ETOL:
+ return "failed to reach the specified tolerance" ;
+ case GSL_EUNDRFLW:
+ return "underflow" ;
+ case GSL_EOVRFLW:
+ return "overflow" ;
+ case GSL_ELOSS:
+ return "loss of accuracy" ;
+ case GSL_EROUND:
+ return "roundoff error" ;
+ case GSL_EBADLEN:
+ return "matrix/vector sizes are not conformant" ;
+ case GSL_ENOTSQR:
+ return "matrix not square" ;
+ case GSL_ESING:
+ return "singularity or extremely bad function behavior detected" ;
+ case GSL_EDIVERGE:
+ return "integral or series is divergent" ;
+ case GSL_EUNSUP:
+ return "the required feature is not supported by this hardware platform";
+ case GSL_EUNIMPL:
+ return "the requested feature is not (yet) implemented";
+ case GSL_ECACHE:
+ return "cache limit exceeded";
+ case GSL_ETABLE:
+ return "table limit exceeded";
+ case GSL_ENOPROG:
+ return "iteration is not making progress towards solution";
+ case GSL_ENOPROGJ:
+ return "jacobian evaluations are not improving the solution";
+ case GSL_ETOLF:
+ return "cannot reach the specified tolerance in F";
+ case GSL_ETOLX:
+ return "cannot reach the specified tolerance in X";
+ case GSL_ETOLG:
+ return "cannot reach the specified tolerance in gradient";
+ case GSL_EOF:
+ return "end of file";
+ default:
+ return "unknown error code" ;
+ }
+}
diff --git a/gsl-1.9/err/test.c b/gsl-1.9/err/test.c
new file mode 100644
index 0000000..ccc111d
--- /dev/null
+++ b/gsl-1.9/err/test.c
@@ -0,0 +1,116 @@
+/* err/test_errnos.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_test.h>
+
+#define CHECK(x) errors[n].number = x ; errors[n].name = #x ; n++ ;
+#define MAX_ERRS 64
+
+int verbose = 0 ;
+
+int
+main (void)
+{
+ int i, j, n = 0 ;
+
+ struct {
+ int number;
+ const char * name;
+ } errors[MAX_ERRS] ;
+
+ CHECK(GSL_SUCCESS);
+ CHECK(GSL_FAILURE);
+ CHECK(GSL_CONTINUE);
+ CHECK(GSL_EDOM);
+ CHECK(GSL_ERANGE);
+ CHECK(GSL_EFAULT);
+ CHECK(GSL_EINVAL);
+ CHECK(GSL_EFAILED);
+ CHECK(GSL_EFACTOR);
+ CHECK(GSL_ESANITY);
+ CHECK(GSL_ENOMEM);
+ CHECK(GSL_EBADFUNC);
+ CHECK(GSL_ERUNAWAY);
+ CHECK(GSL_EMAXITER);
+ CHECK(GSL_EZERODIV);
+ CHECK(GSL_EBADTOL);
+ CHECK(GSL_ETOL);
+ CHECK(GSL_EUNDRFLW);
+ CHECK(GSL_EOVRFLW);
+ CHECK(GSL_ELOSS);
+ CHECK(GSL_EROUND);
+ CHECK(GSL_EBADLEN);
+ CHECK(GSL_ENOTSQR);
+ CHECK(GSL_ESING);
+ CHECK(GSL_EDIVERGE);
+ CHECK(GSL_EUNSUP);
+ CHECK(GSL_EUNIMPL);
+ CHECK(GSL_ECACHE);
+ CHECK(GSL_ETABLE);
+ CHECK(GSL_ENOPROG);
+ CHECK(GSL_ENOPROGJ);
+ CHECK(GSL_ETOLF);
+ CHECK(GSL_ETOLX);
+ CHECK(GSL_ETOLG);
+ CHECK(GSL_EOF);
+
+ for (i = 0 ; i < n ; i++)
+ {
+ if (verbose) printf ("%s = %d\n", errors[i].name, errors[i].number) ;
+ }
+
+ for (i = 0; i < n; i++)
+ {
+ int status = 0;
+ for (j = 0; j < n; j++)
+ {
+ if (j != i)
+ status |= (errors[i].number == errors[j].number);
+ }
+
+ gsl_test (status, "%s is distinct from other error values",
+ errors[i].name);
+ }
+
+ for (i = 0; i < n; i++)
+ {
+ int status = 0;
+ int e1 = errors[i].number ;
+ for (j = 0; j < n; j++)
+ {
+ if (j != i)
+ {
+ int e2 = errors[j].number;
+ status |= (gsl_strerror(e1) == gsl_strerror(e2)) ;
+ }
+ }
+ gsl_test (status, "%s has a distinct error message",
+ errors[i].name);
+ }
+
+
+ exit (gsl_test_summary ());
+}
+
diff --git a/gsl-1.9/fft/ChangeLog b/gsl-1.9/fft/ChangeLog
new file mode 100644
index 0000000..214c7eb
--- /dev/null
+++ b/gsl-1.9/fft/ChangeLog
@@ -0,0 +1,128 @@
+2006-03-16 Brian Gough <bjg@network-theory.co.uk>
+
+ * changed to gsl_fft_forward and gsl_fft_backward enums throughout
+ internally instead of forward and backward.
+
+2005-05-19 Brian Gough <bjg@network-theory.co.uk>
+
+ * Makefile.am (noinst_HEADERS): removed unused real.c
+
+Tue Jul 24 15:16:50 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * single precision fft now uses float throughout, rather than
+ mixing float and double.
+
+Mon Jul 16 12:38:29 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * reorganized function names and split work
+
+Tue May 1 14:35:52 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * Makefile.am (libgslfft_la_SOURCES): removed spurious headers
+ from SOURCES line
+
+2000-10-19 Brian Gough <bjg@inweb.aethos.co.uk>
+
+ * hc_init.c (FUNCTION): scratch space changed to n elements
+ instead of 2*n (apparently the routine previously allocated too
+ much space)
+
+Wed Feb 16 14:43:42 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * Makefile.am (pkginclude_HEADERS): added missing
+ pkginclude_HEADERS for float functions.
+
+Mon Feb 14 15:11:55 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * made all internal functions static (required a slight
+ reorganization)
+
+Fri Aug 6 11:20:25 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * removed dependence on rand() and RAND_MAX
+
+Sun Feb 14 17:31:21 1999 Brian Gough <bjg@netsci.freeserve.co.uk>
+
+ * started converting header files to use gsl_complex_packed_array
+ more consistently
+
+Mon Dec 14 22:55:00 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * real_init.c: fixed a possible malloc(0) bug found by Electric Fence.
+
+Mon Nov 23 15:47:13 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * gsl_fft_complex.h, gsl_fft_complex_float.h: removed data[][]
+ type arguments from prototypes since this seems to be non-ANSI.
+ Use **data instead.
+
+1998-11-09 <bjg@ancho.lanl.gov>
+
+ * compare_source.c: fix up int/unsigned format types to prevent
+ warnings
+
+Wed Oct 28 15:07:22 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * c.c: added #include <string.h> for memcpy
+
+ * c_float.c: added #include <string.h> for memcpy
+
+Thu Sep 10 12:05:07 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * removed wavetable from function names to make them shorter and
+ avoid confusion, e.g. gsl_fft_complex_wavetable_alloc ->
+ gsl_fft_complex_alloc
+
+Sat Sep 5 22:32:19 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * major work done on templatizing everything so that you can do an
+ fft of a float or a double vector.
+
+Tue Sep 1 16:44:06 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * c_main.c: renamed c.c to c_main.c
+
+Tue Jul 28 11:30:43 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * renamed gsl_fft_signals.h to fft_signals.h (not exported)
+
+ * fft.h: a place to keep some local macros
+
+ * c.c: renamed complex.c to c.c
+
+Mon Jul 27 12:46:25 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * bitreverse.c: removed gsl_ftt_ prefix from non-exported functions
+
+Wed Jun 10 17:36:01 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * test.c: Eliminated the need for getopt
+
+ * test_radix2.c: Eliminated the need for getopt
+
+ * test_trap.c: Eliminated the need for getopt
+
+Mon Apr 27 18:48:58 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * fft_alloc functions now return a pointer to a newly allocated
+ wavetable struct (or a null pointer if there isn't enough memory)
+
+Fri Apr 10 15:12:37 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * renamed complex_*.c and halfcomplex_*.c to c_*.c and hc_*.c to
+ avoid linker complaints about long filenames on some platforms
+
+Sun Mar 29 15:56:34 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * To be compatible with other architectures use size_t everywhere
+ instead of unsigned int
+
+Sat Mar 21 17:28:26 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * factorize.c (gsl_fft_factorize): Stopped returning the sum of
+ factors in the status variable. The user can compute it if
+ necessary.
+
+1998-01-27 Mark Galassi <rosalia@cygnus.com>
+
+ * Makefile.am: fixed a typo: removed trailing \ at the end of this file.
diff --git a/gsl-1.9/fft/Makefile.am b/gsl-1.9/fft/Makefile.am
new file mode 100644
index 0000000..ad2953f
--- /dev/null
+++ b/gsl-1.9/fft/Makefile.am
@@ -0,0 +1,21 @@
+noinst_LTLIBRARIES = libgslfft.la
+
+pkginclude_HEADERS = gsl_fft.h gsl_fft_complex.h gsl_fft_halfcomplex.h gsl_fft_real.h gsl_dft_complex.h gsl_dft_complex_float.h gsl_fft_complex_float.h gsl_fft_halfcomplex_float.h gsl_fft_real_float.h
+
+INCLUDES= -I$(top_builddir) -I$(top_srcdir)
+
+libgslfft_la_SOURCES = dft.c fft.c
+
+noinst_HEADERS = c_pass.h hc_pass.h real_pass.h signals.h signals_source.c c_main.c c_init.c c_pass_2.c c_pass_3.c c_pass_4.c c_pass_5.c c_pass_6.c c_pass_7.c c_pass_n.c c_radix2.c bitreverse.c bitreverse.h factorize.c factorize.h hc_init.c hc_pass_2.c hc_pass_3.c hc_pass_4.c hc_pass_5.c hc_pass_n.c hc_radix2.c hc_unpack.c real_init.c real_pass_2.c real_pass_3.c real_pass_4.c real_pass_5.c real_pass_n.c real_radix2.c real_unpack.c compare.h compare_source.c dft_source.c hc_main.c real_main.c test_complex_source.c test_real_source.c test_trap_source.c urand.c complex_internal.h
+
+TESTS = $(check_PROGRAMS)
+
+check_PROGRAMS = test
+
+test_SOURCES = test.c signals.c
+
+test_LDADD = libgslfft.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+
+#errs_LDADD = libgslfft.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la
+#benchmark_LDADD = libgslfft.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la
+
diff --git a/gsl-1.9/fft/Makefile.in b/gsl-1.9/fft/Makefile.in
new file mode 100644
index 0000000..ddfcac9
--- /dev/null
+++ b/gsl-1.9/fft/Makefile.in
@@ -0,0 +1,547 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = test$(EXEEXT)
+subdir = fft
+DIST_COMMON = $(noinst_HEADERS) $(pkginclude_HEADERS) \
+ $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog TODO
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgslfft_la_LIBADD =
+am_libgslfft_la_OBJECTS = dft.lo fft.lo
+libgslfft_la_OBJECTS = $(am_libgslfft_la_OBJECTS)
+am_test_OBJECTS = test.$(OBJEXT) signals.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = libgslfft.la ../ieee-utils/libgslieeeutils.la \
+ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \
+ ../utils/libutils.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgslfft_la_SOURCES) $(test_SOURCES)
+DIST_SOURCES = $(libgslfft_la_SOURCES) $(test_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libgslfft.la
+pkginclude_HEADERS = gsl_fft.h gsl_fft_complex.h gsl_fft_halfcomplex.h gsl_fft_real.h gsl_dft_complex.h gsl_dft_complex_float.h gsl_fft_complex_float.h gsl_fft_halfcomplex_float.h gsl_fft_real_float.h
+INCLUDES = -I$(top_builddir) -I$(top_srcdir)
+libgslfft_la_SOURCES = dft.c fft.c
+noinst_HEADERS = c_pass.h hc_pass.h real_pass.h signals.h signals_source.c c_main.c c_init.c c_pass_2.c c_pass_3.c c_pass_4.c c_pass_5.c c_pass_6.c c_pass_7.c c_pass_n.c c_radix2.c bitreverse.c bitreverse.h factorize.c factorize.h hc_init.c hc_pass_2.c hc_pass_3.c hc_pass_4.c hc_pass_5.c hc_pass_n.c hc_radix2.c hc_unpack.c real_init.c real_pass_2.c real_pass_3.c real_pass_4.c real_pass_5.c real_pass_n.c real_radix2.c real_unpack.c compare.h compare_source.c dft_source.c hc_main.c real_main.c test_complex_source.c test_real_source.c test_trap_source.c urand.c complex_internal.h
+TESTS = $(check_PROGRAMS)
+test_SOURCES = test.c signals.c
+test_LDADD = libgslfft.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps fft/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps fft/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgslfft.la: $(libgslfft_la_OBJECTS) $(libgslfft_la_DEPENDENCIES)
+ $(LINK) $(libgslfft_la_LDFLAGS) $(libgslfft_la_OBJECTS) $(libgslfft_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkgincludeHEADERS
+
+
+#errs_LDADD = libgslfft.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la
+#benchmark_LDADD = libgslfft.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/fft/TODO b/gsl-1.9/fft/TODO
new file mode 100644
index 0000000..7d65da7
--- /dev/null
+++ b/gsl-1.9/fft/TODO
@@ -0,0 +1,14 @@
+* Sine and Cosine Transforms from FFTPACK.
+
+* A simple multidimensional fft.
+
+* Convolutions. This will need different interfaces corresponding to
+the type of underlying FFT (radix-2, mixed-radix, radix-2 real,
+mixed-radix real). The convolution function should be fft'ed before
+being passed, so that the function can be used in a loop. The main
+point of the function being to do the index manipulation for the
+multiplication F*G. Theoretically someone might want to convolve real
+and complex data together which could be done but would double the
+number of interfaces. It would be reasonable to restrict the
+convolutions to real-real and complex-complex.
+
diff --git a/gsl-1.9/fft/bitreverse.c b/gsl-1.9/fft/bitreverse.c
new file mode 100644
index 0000000..15e0e8a
--- /dev/null
+++ b/gsl-1.9/fft/bitreverse.c
@@ -0,0 +1,101 @@
+/* fft/bitreverse.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_fft.h>
+
+#include "complex_internal.h"
+#include "bitreverse.h"
+
+static int
+FUNCTION(fft_complex,bitreverse_order) (BASE data[],
+ const size_t stride,
+ const size_t n,
+ size_t logn)
+{
+ /* This is the Goldrader bit-reversal algorithm */
+
+ size_t i;
+ size_t j = 0;
+
+ logn = 0 ; /* not needed for this algorithm */
+
+ for (i = 0; i < n - 1; i++)
+ {
+ size_t k = n / 2 ;
+
+ if (i < j)
+ {
+ const BASE tmp_real = REAL(data,stride,i);
+ const BASE tmp_imag = IMAG(data,stride,i);
+ REAL(data,stride,i) = REAL(data,stride,j);
+ IMAG(data,stride,i) = IMAG(data,stride,j);
+ REAL(data,stride,j) = tmp_real;
+ IMAG(data,stride,j) = tmp_imag;
+ }
+
+ while (k <= j)
+ {
+ j = j - k ;
+ k = k / 2 ;
+ }
+
+ j += k ;
+ }
+
+ return 0;
+}
+
+
+static int
+FUNCTION(fft_real,bitreverse_order) (BASE data[],
+ const size_t stride,
+ const size_t n,
+ size_t logn)
+{
+ /* This is the Goldrader bit-reversal algorithm */
+
+ size_t i;
+ size_t j = 0;
+
+ logn = 0 ; /* not needed for this algorithm */
+
+ for (i = 0; i < n - 1; i++)
+ {
+ size_t k = n / 2 ;
+
+ if (i < j)
+ {
+ const BASE tmp = VECTOR(data,stride,i);
+ VECTOR(data,stride,i) = VECTOR(data,stride,j);
+ VECTOR(data,stride,j) = tmp;
+ }
+
+ while (k <= j)
+ {
+ j = j - k ;
+ k = k / 2 ;
+ }
+
+ j += k ;
+ }
+
+ return 0;
+}
+
diff --git a/gsl-1.9/fft/bitreverse.h b/gsl-1.9/fft/bitreverse.h
new file mode 100644
index 0000000..f0afc5f
--- /dev/null
+++ b/gsl-1.9/fft/bitreverse.h
@@ -0,0 +1,33 @@
+/* fft/bitreverse.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+
+static int FUNCTION(fft_complex,bitreverse_order) (BASE data[],
+ const size_t stride,
+ const size_t n,
+ size_t logn) ;
+
+static int FUNCTION(fft_real,bitreverse_order) (BASE data[],
+ const size_t stride,
+ const size_t n,
+ size_t logn) ;
+
+
+
+
diff --git a/gsl-1.9/fft/c_init.c b/gsl-1.9/fft/c_init.c
new file mode 100644
index 0000000..89abe95
--- /dev/null
+++ b/gsl-1.9/fft/c_init.c
@@ -0,0 +1,194 @@
+/* fft/c_init.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+TYPE(gsl_fft_complex_wavetable) *
+FUNCTION(gsl_fft_complex_wavetable,alloc) (size_t n)
+{
+ int status ;
+ size_t i;
+ size_t n_factors;
+ size_t t, product, product_1, q;
+ double d_theta;
+
+ TYPE(gsl_fft_complex_wavetable) * wavetable ;
+
+ if (n == 0)
+ {
+ GSL_ERROR_VAL ("length n must be positive integer", GSL_EDOM, 0);
+ }
+
+ wavetable = (TYPE(gsl_fft_complex_wavetable) *)
+ malloc(sizeof(TYPE(gsl_fft_complex_wavetable)));
+
+ if (wavetable == NULL)
+ {
+ GSL_ERROR_VAL ("failed to allocate struct", GSL_ENOMEM, 0);
+ }
+
+ wavetable->trig = (TYPE(gsl_complex) *) malloc (n * sizeof (TYPE(gsl_complex)));
+
+ if (wavetable->trig == NULL)
+ {
+ free(wavetable) ; /* error in constructor, prevent memory leak */
+
+ GSL_ERROR_VAL ("failed to allocate trigonometric lookup table",
+ GSL_ENOMEM, 0);
+ }
+
+ wavetable->n = n ;
+
+ status = fft_complex_factorize (n, &n_factors, wavetable->factor);
+
+ if (status)
+ {
+ /* exception in constructor, avoid memory leak */
+
+ free (wavetable->trig);
+ free (wavetable);
+
+ GSL_ERROR_VAL ("factorization failed", GSL_EFACTOR, 0);
+ };
+
+ wavetable->nf = n_factors;
+
+ d_theta = -2.0 * M_PI / ((double) n);
+
+ t = 0;
+ product = 1;
+ for (i = 0; i < n_factors; i++)
+ {
+ size_t j;
+ const size_t factor = wavetable->factor[i];
+ wavetable->twiddle[i] = wavetable->trig + t;
+ product_1 = product; /* product_1 = p_(i-1) */
+ product *= factor;
+ q = n / product;
+
+ for (j = 1; j < factor; j++)
+ {
+ size_t k;
+ size_t m = 0;
+ for (k = 1; k <= q; k++)
+ {
+ double theta;
+ m = m + j * product_1;
+ m = m % n;
+ theta = d_theta * m; /* d_theta*j*k*p_(i-1) */
+ GSL_REAL(wavetable->trig[t]) = cos (theta);
+ GSL_IMAG(wavetable->trig[t]) = sin (theta);
+
+ t++;
+ }
+ }
+ }
+
+ if (t > n)
+ {
+ /* exception in constructor, avoid memory leak */
+
+ free (wavetable->trig);
+ free (wavetable);
+
+ GSL_ERROR_VAL ("overflowed trigonometric lookup table",
+ GSL_ESANITY, 0);
+ }
+
+ return wavetable;
+}
+
+
+TYPE(gsl_fft_complex_workspace) *
+FUNCTION(gsl_fft_complex_workspace,alloc) (size_t n)
+{
+ TYPE(gsl_fft_complex_workspace) * workspace ;
+
+ if (n == 0)
+ {
+ GSL_ERROR_VAL ("length n must be positive integer", GSL_EDOM, 0);
+ }
+
+ workspace = (TYPE(gsl_fft_complex_workspace) *)
+ malloc(sizeof(TYPE(gsl_fft_complex_workspace)));
+
+ if (workspace == NULL)
+ {
+ GSL_ERROR_VAL ("failed to allocate struct", GSL_ENOMEM, 0);
+ }
+
+ workspace->n = n ;
+
+ workspace->scratch = (BASE *) malloc (2 * n * sizeof (BASE));
+
+ if (workspace->scratch == NULL)
+ {
+ free(workspace) ; /* error in constructor, prevent memory leak */
+
+ GSL_ERROR_VAL ("failed to allocate scratch space", GSL_ENOMEM, 0);
+ }
+
+ return workspace;
+}
+
+
+void
+FUNCTION(gsl_fft_complex_wavetable,free) (TYPE(gsl_fft_complex_wavetable) * wavetable)
+{
+
+ /* release trigonometric lookup tables */
+
+ free (wavetable->trig);
+ wavetable->trig = NULL;
+
+ free (wavetable) ;
+}
+
+void
+FUNCTION(gsl_fft_complex_workspace,free) (TYPE(gsl_fft_complex_workspace) * workspace)
+{
+ /* release scratch space */
+
+ free (workspace->scratch);
+ workspace->scratch = NULL;
+ free (workspace) ;
+}
+
+
+int
+FUNCTION(gsl_fft_complex,memcpy) (TYPE(gsl_fft_complex_wavetable) * dest,
+ TYPE(gsl_fft_complex_wavetable) * src)
+{
+ int i, n, nf ;
+
+ if (dest->n != src->n)
+ {
+ GSL_ERROR ("length of src and dest do not match", GSL_EINVAL);
+ }
+
+ n = dest->n ;
+ nf = dest->nf ;
+
+ memcpy(dest->trig, src->trig, n * sizeof (double)) ;
+
+ for (i = 0 ; i < nf ; i++)
+ {
+ dest->twiddle[i] = dest->trig + (src->twiddle[i] - src->trig) ;
+ }
+
+ return 0 ;
+}
diff --git a/gsl-1.9/fft/c_main.c b/gsl-1.9/fft/c_main.c
new file mode 100644
index 0000000..2f48fcc
--- /dev/null
+++ b/gsl-1.9/fft/c_main.c
@@ -0,0 +1,223 @@
+/* fft/c_main.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "c_pass.h"
+
+int
+FUNCTION(gsl_fft_complex,forward) (TYPE(gsl_complex_packed_array) data,
+ const size_t stride,
+ const size_t n,
+ const TYPE(gsl_fft_complex_wavetable) * wavetable,
+ TYPE(gsl_fft_complex_workspace) * work)
+{
+ gsl_fft_direction sign = gsl_fft_forward;
+ int status = FUNCTION(gsl_fft_complex,transform) (data, stride, n,
+ wavetable, work, sign);
+ return status;
+}
+
+int
+FUNCTION(gsl_fft_complex,backward) (TYPE(gsl_complex_packed_array) data,
+ const size_t stride,
+ const size_t n,
+ const TYPE(gsl_fft_complex_wavetable) * wavetable,
+ TYPE(gsl_fft_complex_workspace) * work)
+{
+ gsl_fft_direction sign = gsl_fft_backward;
+ int status = FUNCTION(gsl_fft_complex,transform) (data, stride, n,
+ wavetable, work, sign);
+ return status;
+}
+
+int
+FUNCTION(gsl_fft_complex,inverse) (TYPE(gsl_complex_packed_array) data,
+ const size_t stride,
+ const size_t n,
+ const TYPE(gsl_fft_complex_wavetable) * wavetable,
+ TYPE(gsl_fft_complex_workspace) * work)
+{
+ gsl_fft_direction sign = gsl_fft_backward;
+ int status = FUNCTION(gsl_fft_complex,transform) (data, stride, n,
+ wavetable, work, sign);
+
+ if (status)
+ {
+ return status;
+ }
+
+ /* normalize inverse fft with 1/n */
+
+ {
+ const ATOMIC norm = ONE / (ATOMIC)n;
+ size_t i;
+ for (i = 0; i < n; i++)
+ {
+ REAL(data,stride,i) *= norm;
+ IMAG(data,stride,i) *= norm;
+ }
+ }
+ return status;
+}
+
+int
+FUNCTION(gsl_fft_complex,transform) (TYPE(gsl_complex_packed_array) data,
+ const size_t stride,
+ const size_t n,
+ const TYPE(gsl_fft_complex_wavetable) * wavetable,
+ TYPE(gsl_fft_complex_workspace) * work,
+ const gsl_fft_direction sign)
+{
+ const size_t nf = wavetable->nf;
+
+ size_t i;
+
+ size_t q, product = 1;
+
+ TYPE(gsl_complex) *twiddle1, *twiddle2, *twiddle3, *twiddle4,
+ *twiddle5, *twiddle6;
+
+ size_t state = 0;
+
+ BASE * const scratch = work->scratch;
+
+ BASE * in = data;
+ size_t istride = stride;
+
+ BASE * out = scratch;
+ size_t ostride = 1;
+
+ if (n == 0)
+ {
+ GSL_ERROR ("length n must be positive integer", GSL_EDOM);
+ }
+
+ if (n == 1)
+ { /* FFT of 1 data point is the identity */
+ return 0;
+ }
+
+ if (n != wavetable->n)
+ {
+ GSL_ERROR ("wavetable does not match length of data", GSL_EINVAL);
+ }
+
+ if (n != work->n)
+ {
+ GSL_ERROR ("workspace does not match length of data", GSL_EINVAL);
+ }
+
+ for (i = 0; i < nf; i++)
+ {
+ const size_t factor = wavetable->factor[i];
+ product *= factor;
+ q = n / product;
+
+ if (state == 0)
+ {
+ in = data;
+ istride = stride;
+ out = scratch;
+ ostride = 1;
+ state = 1;
+ }
+ else
+ {
+ in = scratch;
+ istride = 1;
+ out = data;
+ ostride = stride;
+ state = 0;
+ }
+
+ if (factor == 2)
+ {
+ twiddle1 = wavetable->twiddle[i];
+ FUNCTION(fft_complex,pass_2) (in, istride, out, ostride, sign,
+ product, n, twiddle1);
+ }
+ else if (factor == 3)
+ {
+ twiddle1 = wavetable->twiddle[i];
+ twiddle2 = twiddle1 + q;
+ FUNCTION(fft_complex,pass_3) (in, istride, out, ostride, sign,
+ product, n, twiddle1, twiddle2);
+ }
+ else if (factor == 4)
+ {
+ twiddle1 = wavetable->twiddle[i];
+ twiddle2 = twiddle1 + q;
+ twiddle3 = twiddle2 + q;
+ FUNCTION(fft_complex,pass_4) (in, istride, out, ostride, sign,
+ product, n, twiddle1, twiddle2,
+ twiddle3);
+ }
+ else if (factor == 5)
+ {
+ twiddle1 = wavetable->twiddle[i];
+ twiddle2 = twiddle1 + q;
+ twiddle3 = twiddle2 + q;
+ twiddle4 = twiddle3 + q;
+ FUNCTION(fft_complex,pass_5) (in, istride, out, ostride, sign,
+ product, n, twiddle1, twiddle2,
+ twiddle3, twiddle4);
+ }
+ else if (factor == 6)
+ {
+ twiddle1 = wavetable->twiddle[i];
+ twiddle2 = twiddle1 + q;
+ twiddle3 = twiddle2 + q;
+ twiddle4 = twiddle3 + q;
+ twiddle5 = twiddle4 + q;
+ FUNCTION(fft_complex,pass_6) (in, istride, out, ostride, sign,
+ product, n, twiddle1, twiddle2,
+ twiddle3, twiddle4, twiddle5);
+ }
+ else if (factor == 7)
+ {
+ twiddle1 = wavetable->twiddle[i];
+ twiddle2 = twiddle1 + q;
+ twiddle3 = twiddle2 + q;
+ twiddle4 = twiddle3 + q;
+ twiddle5 = twiddle4 + q;
+ twiddle6 = twiddle5 + q;
+ FUNCTION(fft_complex,pass_7) (in, istride, out, ostride, sign,
+ product, n, twiddle1, twiddle2,
+ twiddle3, twiddle4, twiddle5,
+ twiddle6);
+ }
+ else
+ {
+ twiddle1 = wavetable->twiddle[i];
+ FUNCTION(fft_complex,pass_n) (in, istride, out, ostride, sign,
+ factor, product, n, twiddle1);
+ }
+ }
+
+ if (state == 1) /* copy results back from scratch to data */
+ {
+ for (i = 0; i < n; i++)
+ {
+ REAL(data,stride,i) = REAL(scratch,1,i) ;
+ IMAG(data,stride,i) = IMAG(scratch,1,i) ;
+ }
+ }
+
+ return 0;
+
+}
diff --git a/gsl-1.9/fft/c_pass.h b/gsl-1.9/fft/c_pass.h
new file mode 100644
index 0000000..ec89112
--- /dev/null
+++ b/gsl-1.9/fft/c_pass.h
@@ -0,0 +1,106 @@
+/* fft/c_pass.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+static int
+FUNCTION(fft_complex,pass_2) (const BASE in[],
+ const size_t istride,
+ BASE out[],
+ const size_t ostride,
+ const gsl_fft_direction sign,
+ const size_t product,
+ const size_t n,
+ const TYPE(gsl_complex) twiddle[]);
+
+static int
+FUNCTION(fft_complex,pass_3) (const BASE in[],
+ const size_t istride,
+ BASE out[],
+ const size_t ostride,
+ const gsl_fft_direction sign,
+ const size_t product,
+ const size_t n,
+ const TYPE(gsl_complex) twiddle1[],
+ const TYPE(gsl_complex) twiddle2[]);
+
+static int
+FUNCTION(fft_complex,pass_4) (const BASE in[],
+ const size_t istride,
+ BASE out[],
+ const size_t ostride,
+ const gsl_fft_direction sign,
+ const size_t product,
+ const size_t n,
+ const TYPE(gsl_complex) twiddle1[],
+ const TYPE(gsl_complex) twiddle2[],
+ const TYPE(gsl_complex) twiddle3[]);
+
+static int
+FUNCTION(fft_complex,pass_5) (const BASE in[],
+ const size_t istride,
+ BASE out[],
+ const size_t ostride,
+ const gsl_fft_direction sign,
+ const size_t product,
+ const size_t n,
+ const TYPE(gsl_complex) twiddle1[],
+ const TYPE(gsl_complex) twiddle2[],
+ const TYPE(gsl_complex) twiddle3[],
+ const TYPE(gsl_complex) twiddle4[]);
+
+static int
+FUNCTION(fft_complex,pass_6) (const BASE in[],
+ const size_t istride,
+ BASE out[],
+ const size_t ostride,
+ const gsl_fft_direction sign,
+ const size_t product,
+ const size_t n,
+ const TYPE(gsl_complex) twiddle1[],
+ const TYPE(gsl_complex) twiddle2[],
+ const TYPE(gsl_complex) twiddle3[],
+ const TYPE(gsl_complex) twiddle4[],
+ const TYPE(gsl_complex) twiddle5[]);
+
+static int
+FUNCTION(fft_complex,pass_7) (const BASE in[],
+ const size_t istride,
+ BASE out[],
+ const size_t ostride,
+ const gsl_fft_direction sign,
+ const size_t product,
+ const size_t n,
+ const TYPE(gsl_complex) twiddle1[],
+ const TYPE(gsl_complex) twiddle2[],
+ const TYPE(gsl_complex) twiddle3[],
+ const TYPE(gsl_complex) twiddle4[],
+ const TYPE(gsl_complex) twiddle5[],
+ const TYPE(gsl_complex) twiddle6[]);
+
+
+static int
+FUNCTION(fft_complex,pass_n) (BASE in[],
+ const size_t istride,
+ BASE out[],
+ const size_t ostride,
+ const gsl_fft_direction sign,
+ const size_t factor,
+ const size_t product,
+ const size_t n,
+ const TYPE(gsl_complex) twiddle[]);
+
diff --git a/gsl-1.9/fft/c_pass_2.c b/gsl-1.9/fft/c_pass_2.c
new file mode 100644
index 0000000..b0dac46
--- /dev/null
+++ b/gsl-1.9/fft/c_pass_2.c
@@ -0,0 +1,98 @@
+/* fft/c_pass_2.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+static int
+FUNCTION(fft_complex,pass_2) (const BASE in[],
+ const size_t istride,
+ BASE out[],
+ const size_t ostride,
+ const gsl_fft_direction sign,
+ const size_t product,
+ const size_t n,
+ const TYPE(gsl_complex) twiddle[])
+{
+ size_t i = 0, j = 0;
+ size_t k, k1;
+
+ const size_t factor = 2;
+ const size_t m = n / factor;
+ const size_t q = n / product;
+ const size_t product_1 = product / factor;
+ const size_t jump = (factor - 1) * product_1;
+
+ for (k = 0; k < q; k++)
+ {
+ ATOMIC w_real, w_imag;
+
+ if (k == 0)
+ {
+ w_real = 1.0;
+ w_imag = 0.0;
+ }
+ else
+ {
+ if (sign == gsl_fft_forward)
+ {
+ /* forward tranform */
+ w_real = GSL_REAL(twiddle[k - 1]);
+ w_imag = GSL_IMAG(twiddle[k - 1]);
+ }
+ else
+ {
+ /* backward tranform: w -> conjugate(w) */
+ w_real = GSL_REAL(twiddle[k - 1]);
+ w_imag = -GSL_IMAG(twiddle[k - 1]);
+ }
+ }
+
+ for (k1 = 0; k1 < product_1; k1++)
+ {
+ const ATOMIC z0_real = REAL(in,istride,i);
+ const ATOMIC z0_imag = IMAG(in,istride,i);
+
+ const ATOMIC z1_real = REAL(in,istride,i+m);
+ const ATOMIC z1_imag = IMAG(in,istride,i+m);
+
+ /* compute x = W(2) z */
+
+ /* x0 = z0 + z1 */
+ const ATOMIC x0_real = z0_real + z1_real;
+ const ATOMIC x0_imag = z0_imag + z1_imag;
+
+ /* x1 = z0 - z1 */
+ const ATOMIC x1_real = z0_real - z1_real;
+ const ATOMIC x1_imag = z0_imag - z1_imag;
+
+ /* apply twiddle factors */
+
+ /* out0 = 1 * x0 */
+ REAL(out,ostride,j) = x0_real;
+ IMAG(out,ostride,j) = x0_imag;
+
+ /* out1 = w * x1 */
+ REAL(out,ostride,j+product_1) = w_real * x1_real - w_imag * x1_imag;
+ IMAG(out,ostride,j+product_1) = w_real * x1_imag + w_imag * x1_real;
+
+ i++;
+ j++;
+ }
+ j += jump;
+ }
+ return 0;
+}
diff --git a/gsl-1.9/fft/c_pass_3.c b/gsl-1.9/fft/c_pass_3.c
new file mode 100644
index 0000000..f55fb5c
--- /dev/null
+++ b/gsl-1.9/fft/c_pass_3.c
@@ -0,0 +1,127 @@
+/* fft/c_pass_3.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+static int
+FUNCTION(fft_complex,pass_3) (const BASE in[],
+ const size_t istride,
+ BASE out[],
+ const size_t ostride,
+ const gsl_fft_direction sign,
+ const size_t product,
+ const size_t n,
+ const TYPE(gsl_complex) * twiddle1,
+ const TYPE(gsl_complex) * twiddle2)
+{
+ size_t i = 0, j = 0;
+ size_t k, k1;
+
+ const size_t factor = 3;
+ const size_t m = n / factor;
+ const size_t q = n / product;
+ const size_t product_1 = product / factor;
+ const size_t jump = (factor - 1) * product_1;
+
+ const ATOMIC tau = sqrt (3.0) / 2.0;
+
+ for (k = 0; k < q; k++)
+ {
+ ATOMIC w1_real, w1_imag, w2_real, w2_imag;
+
+ if (k == 0)
+ {
+ w1_real = 1.0;
+ w1_imag = 0.0;
+ w2_real = 1.0;
+ w2_imag = 0.0;
+ }
+ else
+ {
+ if (sign == gsl_fft_forward)
+ {
+ /* forward tranform */
+ w1_real = GSL_REAL(twiddle1[k - 1]);
+ w1_imag = GSL_IMAG(twiddle1[k - 1]);
+ w2_real = GSL_REAL(twiddle2[k - 1]);
+ w2_imag = GSL_IMAG(twiddle2[k - 1]);
+ }
+ else
+ {
+ /* backward tranform: w -> conjugate(w) */
+ w1_real = GSL_REAL(twiddle1[k - 1]);
+ w1_imag = -GSL_IMAG(twiddle1[k - 1]);
+ w2_real = GSL_REAL(twiddle2[k - 1]);
+ w2_imag = -GSL_IMAG(twiddle2[k - 1]);
+ }
+ }
+
+ for (k1 = 0; k1 < product_1; k1++)
+ {
+ const ATOMIC z0_real = REAL(in,istride,i);
+ const ATOMIC z0_imag = IMAG(in,istride,i);
+ const ATOMIC z1_real = REAL(in,istride,i+m);
+ const ATOMIC z1_imag = IMAG(in,istride,i+m);
+ const ATOMIC z2_real = REAL(in,istride,i+2*m);
+ const ATOMIC z2_imag = IMAG(in,istride,i+2*m);
+
+ /* compute x = W(3) z */
+
+ /* t1 = z1 + z2 */
+ const ATOMIC t1_real = z1_real + z2_real;
+ const ATOMIC t1_imag = z1_imag + z2_imag;
+
+ /* t2 = z0 - t1/2 */
+ const ATOMIC t2_real = z0_real - t1_real / 2.0;
+ const ATOMIC t2_imag = z0_imag - t1_imag / 2.0;
+
+ /* t3 = (+/-) sin(pi/3)*(z1 - z2) */
+ const ATOMIC t3_real = ((int) sign) * tau * (z1_real - z2_real);
+ const ATOMIC t3_imag = ((int) sign) * tau * (z1_imag - z2_imag);
+
+ /* x0 = z0 + t1 */
+ const ATOMIC x0_real = z0_real + t1_real;
+ const ATOMIC x0_imag = z0_imag + t1_imag;
+
+ /* x1 = t2 + i t3 */
+ const ATOMIC x1_real = t2_real - t3_imag;
+ const ATOMIC x1_imag = t2_imag + t3_real;
+
+ /* x2 = t2 - i t3 */
+ const ATOMIC x2_real = t2_real + t3_imag;
+ const ATOMIC x2_imag = t2_imag - t3_real;
+
+ /* apply twiddle factors */
+
+ /* to0 = 1 * x0 */
+ REAL(out,ostride,j) = x0_real;
+ IMAG(out,ostride,j) = x0_imag;
+
+ /* to1 = w1 * x1 */
+ REAL(out,ostride,j+product_1) = w1_real * x1_real - w1_imag * x1_imag;
+ IMAG(out,ostride,j+product_1) = w1_real * x1_imag + w1_imag * x1_real;
+
+ /* to2 = w2 * x2 */
+ REAL(out,ostride,j+2*product_1) = w2_real * x2_real - w2_imag * x2_imag;
+ IMAG(out,ostride,j+2*product_1) = w2_real * x2_imag + w2_imag * x2_real;
+
+ i++; j++;
+ }
+ j += jump;
+ }
+ return 0;
+}
diff --git a/gsl-1.9/fft/c_pass_4.c b/gsl-1.9/fft/c_pass_4.c
new file mode 100644
index 0000000..8fa3b7f
--- /dev/null
+++ b/gsl-1.9/fft/c_pass_4.c
@@ -0,0 +1,147 @@
+/* fft/c_pass_4.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+static int
+FUNCTION(fft_complex,pass_4) (const BASE in[],
+ const size_t istride,
+ BASE out[],
+ const size_t ostride,
+ const gsl_fft_direction sign,
+ const size_t product,
+ const size_t n,
+ const TYPE(gsl_complex) twiddle1[],
+ const TYPE(gsl_complex) twiddle2[],
+ const TYPE(gsl_complex) twiddle3[])
+{
+ size_t i = 0, j = 0;
+ size_t k, k1;
+
+ const size_t factor = 4;
+ const size_t m = n / factor;
+ const size_t q = n / product;
+ const size_t p_1 = product / factor;
+ const size_t jump = (factor - 1) * p_1;
+
+ for (k = 0; k < q; k++)
+ {
+ ATOMIC w1_real, w1_imag, w2_real, w2_imag, w3_real, w3_imag;
+
+ if (k == 0)
+ {
+ w1_real = 1.0;
+ w1_imag = 0.0;
+ w2_real = 1.0;
+ w2_imag = 0.0;
+ w3_real = 1.0;
+ w3_imag = 0.0;
+ }
+ else
+ {
+ if (sign == gsl_fft_forward)
+ {
+ /* forward tranform */
+ w1_real = GSL_REAL(twiddle1[k - 1]);
+ w1_imag = GSL_IMAG(twiddle1[k - 1]);
+ w2_real = GSL_REAL(twiddle2[k - 1]);
+ w2_imag = GSL_IMAG(twiddle2[k - 1]);
+ w3_real = GSL_REAL(twiddle3[k - 1]);
+ w3_imag = GSL_IMAG(twiddle3[k - 1]);
+ }
+ else
+ {
+ /* backward tranform: w -> conjugate(w) */
+ w1_real = GSL_REAL(twiddle1[k - 1]);
+ w1_imag = -GSL_IMAG(twiddle1[k - 1]);
+ w2_real = GSL_REAL(twiddle2[k - 1]);
+ w2_imag = -GSL_IMAG(twiddle2[k - 1]);
+ w3_real = GSL_REAL(twiddle3[k - 1]);
+ w3_imag = -GSL_IMAG(twiddle3[k - 1]);
+ }
+ }
+
+ for (k1 = 0; k1 < p_1; k1++)
+ {
+ const ATOMIC z0_real = REAL(in,istride,i);
+ const ATOMIC z0_imag = IMAG(in,istride,i);
+ const ATOMIC z1_real = REAL(in,istride,i+m);
+ const ATOMIC z1_imag = IMAG(in,istride,i+m);
+ const ATOMIC z2_real = REAL(in,istride,i+2*m);
+ const ATOMIC z2_imag = IMAG(in,istride,i+2*m);
+ const ATOMIC z3_real = REAL(in,istride,i+3*m);
+ const ATOMIC z3_imag = IMAG(in,istride,i+3*m);
+
+ /* compute x = W(4) z */
+
+ /* t1 = z0 + z2 */
+ const ATOMIC t1_real = z0_real + z2_real;
+ const ATOMIC t1_imag = z0_imag + z2_imag;
+
+ /* t2 = z1 + z3 */
+ const ATOMIC t2_real = z1_real + z3_real;
+ const ATOMIC t2_imag = z1_imag + z3_imag;
+
+ /* t3 = z0 - z2 */
+ const ATOMIC t3_real = z0_real - z2_real;
+ const ATOMIC t3_imag = z0_imag - z2_imag;
+
+ /* t4 = (+/-) (z1 - z3) */
+ const ATOMIC t4_real = ((int) sign) * (z1_real - z3_real);
+ const ATOMIC t4_imag = ((int) sign) * (z1_imag - z3_imag);
+
+ /* x0 = t1 + t2 */
+ const ATOMIC x0_real = t1_real + t2_real;
+ const ATOMIC x0_imag = t1_imag + t2_imag;
+
+ /* x1 = t3 + i t4 */
+ const ATOMIC x1_real = t3_real - t4_imag;
+ const ATOMIC x1_imag = t3_imag + t4_real;
+
+ /* x2 = t1 - t2 */
+ const ATOMIC x2_real = t1_real - t2_real;
+ const ATOMIC x2_imag = t1_imag - t2_imag;
+
+ /* x3 = t3 - i t4 */
+ const ATOMIC x3_real = t3_real + t4_imag;
+ const ATOMIC x3_imag = t3_imag - t4_real;
+
+ /* apply twiddle factors */
+
+ /* to0 = 1 * x0 */
+ REAL(out,ostride,j) = x0_real;
+ IMAG(out,ostride,j) = x0_imag;
+
+ /* to1 = w1 * x1 */
+ REAL(out, ostride, j + p_1) = w1_real * x1_real - w1_imag * x1_imag;
+ IMAG(out, ostride, j + p_1) = w1_real * x1_imag + w1_imag * x1_real;
+
+ /* to2 = w2 * x2 */
+ REAL(out, ostride, j + 2 * p_1) = w2_real * x2_real - w2_imag * x2_imag;
+ IMAG(out, ostride, j + 2 * p_1) = w2_real * x2_imag + w2_imag * x2_real;
+
+ /* to3 = w3 * x3 */
+ REAL(out, ostride, j + 3 * p_1) = w3_real * x3_real - w3_imag * x3_imag;
+ IMAG(out, ostride, j + 3 * p_1) = w3_real * x3_imag + w3_imag * x3_real;
+
+ i++;
+ j++;
+ }
+ j += jump;
+ }
+ return 0;
+}
diff --git a/gsl-1.9/fft/c_pass_5.c b/gsl-1.9/fft/c_pass_5.c
new file mode 100644
index 0000000..d8a9d65
--- /dev/null
+++ b/gsl-1.9/fft/c_pass_5.c
@@ -0,0 +1,205 @@
+/* fft/c_pass_5.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+static int
+FUNCTION(fft_complex,pass_5) (const BASE in[],
+ const size_t istride,
+ BASE out[],
+ const size_t ostride,
+ const gsl_fft_direction sign,
+ const size_t product,
+ const size_t n,
+ const TYPE(gsl_complex) twiddle1[],
+ const TYPE(gsl_complex) twiddle2[],
+ const TYPE(gsl_complex) twiddle3[],
+ const TYPE(gsl_complex) twiddle4[])
+{
+ size_t i = 0, j = 0;
+ size_t k, k1;
+
+ const size_t factor = 5;
+ const size_t m = n / factor;
+ const size_t q = n / product;
+ const size_t p_1 = product / factor;
+ const size_t jump = (factor - 1) * p_1;
+
+ const ATOMIC sin_2pi_by_5 = sin (2.0 * M_PI / 5.0);
+ const ATOMIC sin_2pi_by_10 = sin (2.0 * M_PI / 10.0);
+
+ for (k = 0; k < q; k++)
+ {
+
+ ATOMIC w1_real, w1_imag, w2_real, w2_imag, w3_real, w3_imag, w4_real,
+ w4_imag;
+
+ if (k == 0)
+ {
+ w1_real = 1.0;
+ w1_imag = 0.0;
+ w2_real = 1.0;
+ w2_imag = 0.0;
+ w3_real = 1.0;
+ w3_imag = 0.0;
+ w4_real = 1.0;
+ w4_imag = 0.0;
+ }
+ else
+ {
+ if (sign == gsl_fft_forward)
+ {
+ /* forward tranform */
+ w1_real = GSL_REAL(twiddle1[k - 1]);
+ w1_imag = GSL_IMAG(twiddle1[k - 1]);
+ w2_real = GSL_REAL(twiddle2[k - 1]);
+ w2_imag = GSL_IMAG(twiddle2[k - 1]);
+ w3_real = GSL_REAL(twiddle3[k - 1]);
+ w3_imag = GSL_IMAG(twiddle3[k - 1]);
+ w4_real = GSL_REAL(twiddle4[k - 1]);
+ w4_imag = GSL_IMAG(twiddle4[k - 1]);
+ }
+ else
+ {
+ /* backward tranform: w -> conjugate(w) */
+ w1_real = GSL_REAL(twiddle1[k - 1]);
+ w1_imag = -GSL_IMAG(twiddle1[k - 1]);
+ w2_real = GSL_REAL(twiddle2[k - 1]);
+ w2_imag = -GSL_IMAG(twiddle2[k - 1]);
+ w3_real = GSL_REAL(twiddle3[k - 1]);
+ w3_imag = -GSL_IMAG(twiddle3[k - 1]);
+ w4_real = GSL_REAL(twiddle4[k - 1]);
+ w4_imag = -GSL_IMAG(twiddle4[k - 1]);
+ }
+ }
+
+ for (k1 = 0; k1 < p_1; k1++)
+ {
+
+ ATOMIC x0_real, x0_imag, x1_real, x1_imag, x2_real, x2_imag,
+ x3_real, x3_imag, x4_real, x4_imag;
+
+ const ATOMIC z0_real = REAL(in,istride,i);
+ const ATOMIC z0_imag = IMAG(in,istride,i);
+ const ATOMIC z1_real = REAL(in,istride,i + m);
+ const ATOMIC z1_imag = IMAG(in,istride,i + m);
+ const ATOMIC z2_real = REAL(in,istride,i + 2*m);
+ const ATOMIC z2_imag = IMAG(in,istride,i + 2*m);
+ const ATOMIC z3_real = REAL(in,istride,i + 3*m);
+ const ATOMIC z3_imag = IMAG(in,istride,i + 3*m);
+ const ATOMIC z4_real = REAL(in,istride,i + 4*m);
+ const ATOMIC z4_imag = IMAG(in,istride,i + 4*m);
+
+ /* compute x = W(5) z */
+
+ /* t1 = z1 + z4 */
+ const ATOMIC t1_real = z1_real + z4_real;
+ const ATOMIC t1_imag = z1_imag + z4_imag;
+
+ /* t2 = z2 + z3 */
+ const ATOMIC t2_real = z2_real + z3_real;
+ const ATOMIC t2_imag = z2_imag + z3_imag;
+
+ /* t3 = z1 - z4 */
+ const ATOMIC t3_real = z1_real - z4_real;
+ const ATOMIC t3_imag = z1_imag - z4_imag;
+
+ /* t4 = z2 - z3 */
+ const ATOMIC t4_real = z2_real - z3_real;
+ const ATOMIC t4_imag = z2_imag - z3_imag;
+
+ /* t5 = t1 + t2 */
+ const ATOMIC t5_real = t1_real + t2_real;
+ const ATOMIC t5_imag = t1_imag + t2_imag;
+
+ /* t6 = (sqrt(5)/4)(t1 - t2) */
+ const ATOMIC t6_real = (sqrt (5.0) / 4.0) * (t1_real - t2_real);
+ const ATOMIC t6_imag = (sqrt (5.0) / 4.0) * (t1_imag - t2_imag);
+
+ /* t7 = z0 - ((t5)/4) */
+ const ATOMIC t7_real = z0_real - t5_real / 4.0;
+ const ATOMIC t7_imag = z0_imag - t5_imag / 4.0;
+
+ /* t8 = t7 + t6 */
+ const ATOMIC t8_real = t7_real + t6_real;
+ const ATOMIC t8_imag = t7_imag + t6_imag;
+
+ /* t9 = t7 - t6 */
+ const ATOMIC t9_real = t7_real - t6_real;
+ const ATOMIC t9_imag = t7_imag - t6_imag;
+
+ /* t10 = sin(2 pi/5) t3 + sin(2 pi/10) t4 */
+ const ATOMIC t10_real = ((int) sign) * (sin_2pi_by_5 * t3_real +
+ sin_2pi_by_10 * t4_real);
+ const ATOMIC t10_imag = ((int) sign) * (sin_2pi_by_5 * t3_imag +
+ sin_2pi_by_10 * t4_imag);
+
+ /* t11 = sin(2 pi/10) t3 - sin(2 pi/5) t4 */
+ const ATOMIC t11_real = ((int) sign) * (sin_2pi_by_10 * t3_real -
+ sin_2pi_by_5 * t4_real);
+ const ATOMIC t11_imag = ((int) sign) * (sin_2pi_by_10 * t3_imag -
+ sin_2pi_by_5 * t4_imag);
+
+ /* x0 = z0 + t5 */
+ x0_real = z0_real + t5_real;
+ x0_imag = z0_imag + t5_imag;
+
+ /* x1 = t8 + i t10 */
+ x1_real = t8_real - t10_imag;
+ x1_imag = t8_imag + t10_real;
+
+ /* x2 = t9 + i t11 */
+ x2_real = t9_real - t11_imag;
+ x2_imag = t9_imag + t11_real;
+
+ /* x3 = t9 - i t11 */
+ x3_real = t9_real + t11_imag;
+ x3_imag = t9_imag - t11_real;
+
+ /* x4 = t8 - i t10 */
+ x4_real = t8_real + t10_imag;
+ x4_imag = t8_imag - t10_real;
+
+ /* apply twiddle factors */
+
+ /* to0 = 1 * x0 */
+ REAL(out,ostride,j) = x0_real;
+ IMAG(out,ostride,j) = x0_imag;
+
+ /* to1 = w1 * x1 */
+ REAL(out,ostride,j + p_1) = w1_real * x1_real - w1_imag * x1_imag;
+ IMAG(out,ostride,j + p_1) = w1_real * x1_imag + w1_imag * x1_real;
+
+ /* to2 = w2 * x2 */
+ REAL(out,ostride,j + 2*p_1) = w2_real * x2_real - w2_imag * x2_imag;
+ IMAG(out,ostride,j+2*p_1) = w2_real * x2_imag + w2_imag * x2_real;
+
+ /* to3 = w3 * x3 */
+ REAL(out,ostride,j+3*p_1) = w3_real * x3_real - w3_imag * x3_imag;
+ IMAG(out,ostride,j+3*p_1) = w3_real * x3_imag + w3_imag * x3_real;
+
+ /* to4 = w4 * x4 */
+ REAL(out,ostride,j+4*p_1) = w4_real * x4_real - w4_imag * x4_imag;
+ IMAG(out,ostride,j+4*p_1) = w4_real * x4_imag + w4_imag * x4_real;
+
+ i++;
+ j++;
+ }
+ j += jump;
+ }
+ return 0;
+}
diff --git a/gsl-1.9/fft/c_pass_6.c b/gsl-1.9/fft/c_pass_6.c
new file mode 100644
index 0000000..02e2128
--- /dev/null
+++ b/gsl-1.9/fft/c_pass_6.c
@@ -0,0 +1,220 @@
+/* fft/c_pass_6.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+static int
+FUNCTION(fft_complex,pass_6) (const BASE in[],
+ const size_t istride,
+ BASE out[],
+ const size_t ostride,
+ const gsl_fft_direction sign,
+ const size_t product,
+ const size_t n,
+ const TYPE(gsl_complex) twiddle1[],
+ const TYPE(gsl_complex) twiddle2[],
+ const TYPE(gsl_complex) twiddle3[],
+ const TYPE(gsl_complex) twiddle4[],
+ const TYPE(gsl_complex) twiddle5[])
+{
+
+ size_t i = 0, j = 0;
+ size_t k, k1;
+
+ const size_t factor = 6;
+ const size_t m = n / factor;
+ const size_t q = n / product;
+ const size_t p_1 = product / factor;
+ const size_t jump = (factor - 1) * p_1;
+
+ const ATOMIC tau = sqrt (3.0) / 2.0;
+
+ for (k = 0; k < q; k++)
+ {
+ ATOMIC w1_real, w1_imag, w2_real, w2_imag, w3_real, w3_imag, w4_real,
+ w4_imag, w5_real, w5_imag;
+
+ if (k == 0)
+ {
+ w1_real = 1.0;
+ w1_imag = 0.0;
+ w2_real = 1.0;
+ w2_imag = 0.0;
+ w3_real = 1.0;
+ w3_imag = 0.0;
+ w4_real = 1.0;
+ w4_imag = 0.0;
+ w5_real = 1.0;
+ w5_imag = 0.0;
+ }
+ else
+ {
+ if (sign == gsl_fft_forward)
+ {
+ /* forward tranform */
+ w1_real = GSL_REAL(twiddle1[k - 1]);
+ w1_imag = GSL_IMAG(twiddle1[k - 1]);
+ w2_real = GSL_REAL(twiddle2[k - 1]);
+ w2_imag = GSL_IMAG(twiddle2[k - 1]);
+ w3_real = GSL_REAL(twiddle3[k - 1]);
+ w3_imag = GSL_IMAG(twiddle3[k - 1]);
+ w4_real = GSL_REAL(twiddle4[k - 1]);
+ w4_imag = GSL_IMAG(twiddle4[k - 1]);
+ w5_real = GSL_REAL(twiddle5[k - 1]);
+ w5_imag = GSL_IMAG(twiddle5[k - 1]);
+ }
+ else
+ {
+ /* backward tranform: w -> conjugate(w) */
+ w1_real = GSL_REAL(twiddle1[k - 1]);
+ w1_imag = -GSL_IMAG(twiddle1[k - 1]);
+ w2_real = GSL_REAL(twiddle2[k - 1]);
+ w2_imag = -GSL_IMAG(twiddle2[k - 1]);
+ w3_real = GSL_REAL(twiddle3[k - 1]);
+ w3_imag = -GSL_IMAG(twiddle3[k - 1]);
+ w4_real = GSL_REAL(twiddle4[k - 1]);
+ w4_imag = -GSL_IMAG(twiddle4[k - 1]);
+ w5_real = GSL_REAL(twiddle5[k - 1]);
+ w5_imag = -GSL_IMAG(twiddle5[k - 1]);
+ }
+ }
+
+ for (k1 = 0; k1 < p_1; k1++)
+ {
+ const ATOMIC z0_real = REAL(in,istride,i);
+ const ATOMIC z0_imag = IMAG(in,istride,i);
+ const ATOMIC z1_real = REAL(in,istride,i+m);
+ const ATOMIC z1_imag = IMAG(in,istride,i+m);
+ const ATOMIC z2_real = REAL(in,istride,i+2*m);
+ const ATOMIC z2_imag = IMAG(in,istride,i+2*m);
+ const ATOMIC z3_real = REAL(in,istride,i+3*m);
+ const ATOMIC z3_imag = IMAG(in,istride,i+3*m);
+ const ATOMIC z4_real = REAL(in,istride,i+4*m);
+ const ATOMIC z4_imag = IMAG(in,istride,i+4*m);
+ const ATOMIC z5_real = REAL(in,istride,i+5*m);
+ const ATOMIC z5_imag = IMAG(in,istride,i+5*m);
+
+ /* compute x = W(6) z */
+
+ /* W(6) is a combination of sums and differences of W(3) acting
+ on the even and odd elements of z */
+
+ /* ta1 = z2 + z4 */
+ const ATOMIC ta1_real = z2_real + z4_real;
+ const ATOMIC ta1_imag = z2_imag + z4_imag;
+
+ /* ta2 = z0 - ta1/2 */
+ const ATOMIC ta2_real = z0_real - ta1_real / 2;
+ const ATOMIC ta2_imag = z0_imag - ta1_imag / 2;
+
+ /* ta3 = (+/-) sin(pi/3)*(z2 - z4) */
+ const ATOMIC ta3_real = ((int) sign) * tau * (z2_real - z4_real);
+ const ATOMIC ta3_imag = ((int) sign) * tau * (z2_imag - z4_imag);
+
+ /* a0 = z0 + ta1 */
+ const ATOMIC a0_real = z0_real + ta1_real;
+ const ATOMIC a0_imag = z0_imag + ta1_imag;
+
+ /* a1 = ta2 + i ta3 */
+ const ATOMIC a1_real = ta2_real - ta3_imag;
+ const ATOMIC a1_imag = ta2_imag + ta3_real;
+
+ /* a2 = ta2 - i ta3 */
+ const ATOMIC a2_real = ta2_real + ta3_imag;
+ const ATOMIC a2_imag = ta2_imag - ta3_real;
+
+ /* tb1 = z5 + z1 */
+ const ATOMIC tb1_real = z5_real + z1_real;
+ const ATOMIC tb1_imag = z5_imag + z1_imag;
+
+ /* tb2 = z3 - tb1/2 */
+ const ATOMIC tb2_real = z3_real - tb1_real / 2;
+ const ATOMIC tb2_imag = z3_imag - tb1_imag / 2;
+
+ /* tb3 = (+/-) sin(pi/3)*(z5 - z1) */
+ const ATOMIC tb3_real = ((int) sign) * tau * (z5_real - z1_real);
+ const ATOMIC tb3_imag = ((int) sign) * tau * (z5_imag - z1_imag);
+
+ /* b0 = z3 + tb1 */
+ const ATOMIC b0_real = z3_real + tb1_real;
+ const ATOMIC b0_imag = z3_imag + tb1_imag;
+
+ /* b1 = tb2 + i tb3 */
+ const ATOMIC b1_real = tb2_real - tb3_imag;
+ const ATOMIC b1_imag = tb2_imag + tb3_real;
+
+ /* b2 = tb2 - i tb3 */
+ const ATOMIC b2_real = tb2_real + tb3_imag;
+ const ATOMIC b2_imag = tb2_imag - tb3_real;
+
+ /* x0 = a0 + b0 */
+ const ATOMIC x0_real = a0_real + b0_real;
+ const ATOMIC x0_imag = a0_imag + b0_imag;
+
+ /* x4 = a1 + b1 */
+ const ATOMIC x4_real = a1_real + b1_real;
+ const ATOMIC x4_imag = a1_imag + b1_imag;
+
+ /* x2 = a2 + b2 */
+ const ATOMIC x2_real = a2_real + b2_real;
+ const ATOMIC x2_imag = a2_imag + b2_imag;
+
+ /* x3 = a0 - b0 */
+ const ATOMIC x3_real = a0_real - b0_real;
+ const ATOMIC x3_imag = a0_imag - b0_imag;
+
+ /* x1 = a1 - b1 */
+ const ATOMIC x1_real = a1_real - b1_real;
+ const ATOMIC x1_imag = a1_imag - b1_imag;
+
+ /* x5 = a2 - b2 */
+ const ATOMIC x5_real = a2_real - b2_real;
+ const ATOMIC x5_imag = a2_imag - b2_imag;
+
+ /* apply twiddle factors */
+
+ /* to0 = 1 * x0 */
+ REAL(out,ostride,j) = x0_real;
+ IMAG(out,ostride,j) = x0_imag;
+
+ /* to1 = w1 * x1 */
+ REAL(out,ostride,j+p_1) = w1_real * x1_real - w1_imag * x1_imag;
+ IMAG(out,ostride,j+p_1) = w1_real * x1_imag + w1_imag * x1_real;
+
+ /* to2 = w2 * x2 */
+ REAL(out,ostride,j+2*p_1) = w2_real * x2_real - w2_imag * x2_imag;
+ IMAG(out,ostride,j+2*p_1) = w2_real * x2_imag + w2_imag * x2_real;
+
+ /* to3 = w3 * x3 */
+ REAL(out,ostride,j+3*p_1) = w3_real * x3_real - w3_imag * x3_imag;
+ IMAG(out,ostride,j+3*p_1) = w3_real * x3_imag + w3_imag * x3_real;
+
+ /* to4 = w4 * x4 */
+ REAL(out,ostride,j+4*p_1) = w4_real * x4_real - w4_imag * x4_imag;
+ IMAG(out,ostride,j+4*p_1) = w4_real * x4_imag + w4_imag * x4_real;
+
+ /* to5 = w5 * x5 */
+ REAL(out,ostride,j+5*p_1) = w5_real * x5_real - w5_imag * x5_imag;
+ IMAG(out,ostride,j+5*p_1) = w5_real * x5_imag + w5_imag * x5_real;
+
+ i++;
+ j++;
+ }
+ j += jump;
+ }
+ return 0;
+}
diff --git a/gsl-1.9/fft/c_pass_7.c b/gsl-1.9/fft/c_pass_7.c
new file mode 100644
index 0000000..d996f8a
--- /dev/null
+++ b/gsl-1.9/fft/c_pass_7.c
@@ -0,0 +1,312 @@
+/* fft/c_pass_7.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+static int
+FUNCTION(fft_complex,pass_7) (const BASE in[],
+ const size_t istride,
+ BASE out[],
+ const size_t ostride,
+ const gsl_fft_direction sign,
+ const size_t product,
+ const size_t n,
+ const TYPE(gsl_complex) twiddle1[],
+ const TYPE(gsl_complex) twiddle2[],
+ const TYPE(gsl_complex) twiddle3[],
+ const TYPE(gsl_complex) twiddle4[],
+ const TYPE(gsl_complex) twiddle5[],
+ const TYPE(gsl_complex) twiddle6[])
+{
+ size_t i = 0, j = 0;
+ size_t k, k1;
+
+ const size_t factor = 7;
+ const size_t m = n / factor;
+ const size_t q = n / product;
+ const size_t p_1 = product / factor;
+ const size_t jump = (factor - 1) * p_1;
+
+ const ATOMIC c1 = cos(1.0 * 2.0 * M_PI / 7.0) ;
+ const ATOMIC c2 = cos(2.0 * 2.0 * M_PI / 7.0) ;
+ const ATOMIC c3 = cos(3.0 * 2.0 * M_PI / 7.0) ;
+
+ const ATOMIC s1 = sin(1.0 * 2.0 * M_PI / 7.0) ;
+ const ATOMIC s2 = sin(2.0 * 2.0 * M_PI / 7.0) ;
+ const ATOMIC s3 = sin(3.0 * 2.0 * M_PI / 7.0) ;
+
+ for (k = 0; k < q; k++)
+ {
+ ATOMIC w1_real, w1_imag, w2_real, w2_imag, w3_real, w3_imag, w4_real,
+ w4_imag, w5_real, w5_imag, w6_real, w6_imag;
+
+ if (k == 0)
+ {
+ w1_real = 1.0;
+ w1_imag = 0.0;
+ w2_real = 1.0;
+ w2_imag = 0.0;
+ w3_real = 1.0;
+ w3_imag = 0.0;
+ w4_real = 1.0;
+ w4_imag = 0.0;
+ w5_real = 1.0;
+ w5_imag = 0.0;
+ w6_real = 1.0;
+ w6_imag = 0.0;
+ }
+ else
+ {
+ if (sign == gsl_fft_forward)
+ {
+ /* forward tranform */
+ w1_real = GSL_REAL(twiddle1[k - 1]);
+ w1_imag = GSL_IMAG(twiddle1[k - 1]);
+ w2_real = GSL_REAL(twiddle2[k - 1]);
+ w2_imag = GSL_IMAG(twiddle2[k - 1]);
+ w3_real = GSL_REAL(twiddle3[k - 1]);
+ w3_imag = GSL_IMAG(twiddle3[k - 1]);
+ w4_real = GSL_REAL(twiddle4[k - 1]);
+ w4_imag = GSL_IMAG(twiddle4[k - 1]);
+ w5_real = GSL_REAL(twiddle5[k - 1]);
+ w5_imag = GSL_IMAG(twiddle5[k - 1]);
+ w6_real = GSL_REAL(twiddle6[k - 1]);
+ w6_imag = GSL_IMAG(twiddle6[k - 1]);
+ }
+ else
+ {
+ /* backward tranform: w -> conjugate(w) */
+ w1_real = GSL_REAL(twiddle1[k - 1]);
+ w1_imag = -GSL_IMAG(twiddle1[k - 1]);
+ w2_real = GSL_REAL(twiddle2[k - 1]);
+ w2_imag = -GSL_IMAG(twiddle2[k - 1]);
+ w3_real = GSL_REAL(twiddle3[k - 1]);
+ w3_imag = -GSL_IMAG(twiddle3[k - 1]);
+ w4_real = GSL_REAL(twiddle4[k - 1]);
+ w4_imag = -GSL_IMAG(twiddle4[k - 1]);
+ w5_real = GSL_REAL(twiddle5[k - 1]);
+ w5_imag = -GSL_IMAG(twiddle5[k - 1]);
+ w6_real = GSL_REAL(twiddle6[k - 1]);
+ w6_imag = -GSL_IMAG(twiddle6[k - 1]);
+ }
+ }
+
+ for (k1 = 0; k1 < p_1; k1++)
+ {
+ const ATOMIC z0_real = REAL(in,istride,i);
+ const ATOMIC z0_imag = IMAG(in,istride,i);
+ const ATOMIC z1_real = REAL(in,istride,i+m);
+ const ATOMIC z1_imag = IMAG(in,istride,i+m);
+ const ATOMIC z2_real = REAL(in,istride,i+2*m);
+ const ATOMIC z2_imag = IMAG(in,istride,i+2*m);
+ const ATOMIC z3_real = REAL(in,istride,i+3*m);
+ const ATOMIC z3_imag = IMAG(in,istride,i+3*m);
+ const ATOMIC z4_real = REAL(in,istride,i+4*m);
+ const ATOMIC z4_imag = IMAG(in,istride,i+4*m);
+ const ATOMIC z5_real = REAL(in,istride,i+5*m);
+ const ATOMIC z5_imag = IMAG(in,istride,i+5*m);
+ const ATOMIC z6_real = REAL(in,istride,i+6*m);
+ const ATOMIC z6_imag = IMAG(in,istride,i+6*m);
+
+ /* compute x = W(7) z */
+
+ /* t0 = z1 + z6 */
+ const ATOMIC t0_real = z1_real + z6_real ;
+ const ATOMIC t0_imag = z1_imag + z6_imag ;
+
+ /* t1 = z1 - z6 */
+ const ATOMIC t1_real = z1_real - z6_real ;
+ const ATOMIC t1_imag = z1_imag - z6_imag ;
+
+ /* t2 = z2 + z5 */
+ const ATOMIC t2_real = z2_real + z5_real ;
+ const ATOMIC t2_imag = z2_imag + z5_imag ;
+
+ /* t3 = z2 - z5 */
+ const ATOMIC t3_real = z2_real - z5_real ;
+ const ATOMIC t3_imag = z2_imag - z5_imag ;
+
+ /* t4 = z4 + z3 */
+ const ATOMIC t4_real = z4_real + z3_real ;
+ const ATOMIC t4_imag = z4_imag + z3_imag ;
+
+ /* t5 = z4 - z3 */
+ const ATOMIC t5_real = z4_real - z3_real ;
+ const ATOMIC t5_imag = z4_imag - z3_imag ;
+
+ /* t6 = t2 + t0 */
+ const ATOMIC t6_real = t2_real + t0_real ;
+ const ATOMIC t6_imag = t2_imag + t0_imag ;
+
+ /* t7 = t5 + t3 */
+ const ATOMIC t7_real = t5_real + t3_real ;
+ const ATOMIC t7_imag = t5_imag + t3_imag ;
+
+ /* b0 = z0 + t6 + t4 */
+ const ATOMIC b0_real = z0_real + t6_real + t4_real ;
+ const ATOMIC b0_imag = z0_imag + t6_imag + t4_imag ;
+
+ /* b1 = ((cos(2pi/7) + cos(4pi/7) + cos(6pi/7))/3-1) (t6 + t4) */
+ const ATOMIC b1_real = (((c1 + c2 + c3)/3.0 - 1.0) * (t6_real + t4_real));
+ const ATOMIC b1_imag = (((c1 + c2 + c3)/3.0 - 1.0) * (t6_imag + t4_imag));
+
+ /* b2 = ((2*cos(2pi/7) - cos(4pi/7) - cos(6pi/7))/3) (t0 - t4) */
+ const ATOMIC b2_real = (((2.0 * c1 - c2 - c3)/3.0) * (t0_real - t4_real));
+ const ATOMIC b2_imag = (((2.0 * c1 - c2 - c3)/3.0) * (t0_imag - t4_imag));
+
+ /* b3 = ((cos(2pi/7) - 2*cos(4pi/7) + cos(6pi/7))/3) (t4 - t2) */
+ const ATOMIC b3_real = (((c1 - 2.0*c2 + c3)/3.0) * (t4_real - t2_real));
+ const ATOMIC b3_imag = (((c1 - 2.0*c2 + c3)/3.0) * (t4_imag - t2_imag));
+
+ /* b4 = ((cos(2pi/7) + cos(4pi/7) - 2*cos(6pi/7))/3) (t2 - t0) */
+ const ATOMIC b4_real = (((c1 + c2 - 2.0 * c3)/3.0) * (t2_real - t0_real));
+ const ATOMIC b4_imag = (((c1 + c2 - 2.0 * c3)/3.0) * (t2_imag - t0_imag));
+
+ /* b5 = sign * ((sin(2pi/7) + sin(4pi/7) - sin(6pi/7))/3) (t7 + t1) */
+ const ATOMIC b5_real = (-(int)sign) * ((s1 + s2 - s3)/3.0) * (t7_real + t1_real) ;
+ const ATOMIC b5_imag = (-(int)sign) * ((s1 + s2 - s3)/3.0) * (t7_imag + t1_imag) ;
+
+ /* b6 = sign * ((2sin(2pi/7) - sin(4pi/7) + sin(6pi/7))/3) (t1 - t5) */
+ const ATOMIC b6_real = (-(int)sign) * ((2.0 * s1 - s2 + s3)/3.0) * (t1_real - t5_real) ;
+ const ATOMIC b6_imag = (-(int)sign) * ((2.0 * s1 - s2 + s3)/3.0) * (t1_imag - t5_imag) ;
+
+ /* b7 = sign * ((sin(2pi/7) - 2sin(4pi/7) - sin(6pi/7))/3) (t5 - t3) */
+ const ATOMIC b7_real = (-(int)sign) * ((s1 - 2.0 * s2 - s3)/3.0) * (t5_real - t3_real) ;
+ const ATOMIC b7_imag = (-(int)sign) * ((s1 - 2.0 * s2 - s3)/3.0) * (t5_imag - t3_imag) ;
+
+ /* b8 = sign * ((sin(2pi/7) + sin(4pi/7) + 2sin(6pi/7))/3) (t3 - t1) */
+ const ATOMIC b8_real = (-(int)sign) * ((s1 + s2 + 2.0 * s3)/3.0) * (t3_real - t1_real) ;
+ const ATOMIC b8_imag = (-(int)sign) * ((s1 + s2 + 2.0 * s3)/3.0) * (t3_imag - t1_imag) ;
+
+
+ /* T0 = b0 + b1 */
+ const ATOMIC T0_real = b0_real + b1_real ;
+ const ATOMIC T0_imag = b0_imag + b1_imag ;
+
+ /* T1 = b2 + b3 */
+ const ATOMIC T1_real = b2_real + b3_real ;
+ const ATOMIC T1_imag = b2_imag + b3_imag ;
+
+ /* T2 = b4 - b3 */
+ const ATOMIC T2_real = b4_real - b3_real ;
+ const ATOMIC T2_imag = b4_imag - b3_imag ;
+
+ /* T3 = -b2 - b4 */
+ const ATOMIC T3_real = -b2_real - b4_real ;
+ const ATOMIC T3_imag = -b2_imag - b4_imag ;
+
+ /* T4 = b6 + b7 */
+ const ATOMIC T4_real = b6_real + b7_real ;
+ const ATOMIC T4_imag = b6_imag + b7_imag ;
+
+ /* T5 = b8 - b7 */
+ const ATOMIC T5_real = b8_real - b7_real ;
+ const ATOMIC T5_imag = b8_imag - b7_imag ;
+
+ /* T6 = -b8 - b6 */
+ const ATOMIC T6_real = -b8_real - b6_real ;
+ const ATOMIC T6_imag = -b8_imag - b6_imag ;
+
+ /* T7 = T0 + T1 */
+ const ATOMIC T7_real = T0_real + T1_real ;
+ const ATOMIC T7_imag = T0_imag + T1_imag ;
+
+ /* T8 = T0 + T2 */
+ const ATOMIC T8_real = T0_real + T2_real ;
+ const ATOMIC T8_imag = T0_imag + T2_imag ;
+
+ /* T9 = T0 + T3 */
+ const ATOMIC T9_real = T0_real + T3_real ;
+ const ATOMIC T9_imag = T0_imag + T3_imag ;
+
+ /* T10 = T4 + b5 */
+ const ATOMIC T10_real = T4_real + b5_real ;
+ const ATOMIC T10_imag = T4_imag + b5_imag ;
+
+ /* T11 = T5 + b5 */
+ const ATOMIC T11_real = T5_real + b5_real ;
+ const ATOMIC T11_imag = T5_imag + b5_imag ;
+
+ /* T12 = T6 + b5 */
+ const ATOMIC T12_real = T6_real + b5_real ;
+ const ATOMIC T12_imag = T6_imag + b5_imag ;
+
+
+ /* x0 = b0 */
+ const ATOMIC x0_real = b0_real ;
+ const ATOMIC x0_imag = b0_imag ;
+
+ /* x1 = T7 - i T10 */
+ const ATOMIC x1_real = T7_real + T10_imag ;
+ const ATOMIC x1_imag = T7_imag - T10_real ;
+
+ /* x2 = T9 - i T12 */
+ const ATOMIC x2_real = T9_real + T12_imag ;
+ const ATOMIC x2_imag = T9_imag - T12_real ;
+
+ /* x3 = T8 + i T11 */
+ const ATOMIC x3_real = T8_real - T11_imag ;
+ const ATOMIC x3_imag = T8_imag + T11_real ;
+
+ /* x4 = T8 - i T11 */
+ const ATOMIC x4_real = T8_real + T11_imag ;
+ const ATOMIC x4_imag = T8_imag - T11_real ;
+
+ /* x5 = T9 + i T12 */
+ const ATOMIC x5_real = T9_real - T12_imag ;
+ const ATOMIC x5_imag = T9_imag + T12_real ;
+
+ /* x6 = T7 + i T10 */
+ const ATOMIC x6_real = T7_real - T10_imag ;
+ const ATOMIC x6_imag = T7_imag + T10_real ;
+
+ /* apply twiddle factors */
+
+ /* to0 = 1 * x0 */
+ REAL(out,ostride,j) = x0_real;
+ IMAG(out,ostride,j) = x0_imag;
+
+ /* to1 = w1 * x1 */
+ REAL(out,ostride,j+p_1) = w1_real * x1_real - w1_imag * x1_imag;
+ IMAG(out,ostride,j+p_1) = w1_real * x1_imag + w1_imag * x1_real;
+
+ /* to2 = w2 * x2 */
+ REAL(out,ostride,j+2*p_1) = w2_real * x2_real - w2_imag * x2_imag;
+ IMAG(out,ostride,j+2*p_1) = w2_real * x2_imag + w2_imag * x2_real;
+
+ /* to3 = w3 * x3 */
+ REAL(out,ostride,j+3*p_1) = w3_real * x3_real - w3_imag * x3_imag;
+ IMAG(out,ostride,j+3*p_1) = w3_real * x3_imag + w3_imag * x3_real;
+
+ /* to4 = w4 * x4 */
+ REAL(out,ostride,j+4*p_1) = w4_real * x4_real - w4_imag * x4_imag;
+ IMAG(out,ostride,j+4*p_1) = w4_real * x4_imag + w4_imag * x4_real;
+
+ /* to5 = w5 * x5 */
+ REAL(out,ostride,j+5*p_1) = w5_real * x5_real - w5_imag * x5_imag;
+ IMAG(out,ostride,j+5*p_1) = w5_real * x5_imag + w5_imag * x5_real;
+
+ /* to6 = w6 * x6 */
+ REAL(out,ostride,j+6*p_1) = w6_real * x6_real - w6_imag * x6_imag;
+ IMAG(out,ostride,j+6*p_1) = w6_real * x6_imag + w6_imag * x6_real;
+
+ i++; j++;
+ }
+ j += jump;
+ }
+ return 0;
+}
diff --git a/gsl-1.9/fft/c_pass_n.c b/gsl-1.9/fft/c_pass_n.c
new file mode 100644
index 0000000..a4ec823
--- /dev/null
+++ b/gsl-1.9/fft/c_pass_n.c
@@ -0,0 +1,204 @@
+/* fft/c_pass_n.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+static int
+FUNCTION(fft_complex,pass_n) (BASE in[],
+ const size_t istride,
+ BASE out[],
+ const size_t ostride,
+ const gsl_fft_direction sign,
+ const size_t factor,
+ const size_t product,
+ const size_t n,
+ const TYPE(gsl_complex) twiddle[])
+{
+ size_t i = 0, j = 0;
+ size_t k, k1;
+
+ const size_t m = n / factor;
+ const size_t q = n / product;
+ const size_t p_1 = product / factor;
+ const size_t jump = (factor - 1) * p_1;
+
+ size_t e, e1;
+
+ for (i = 0; i < m; i++)
+ {
+ REAL(out,ostride,i) = REAL(in,istride,i);
+ IMAG(out,ostride,i) = IMAG(in,istride,i);
+ }
+
+ for (e = 1; e < (factor - 1) / 2 + 1; e++)
+ {
+ for (i = 0; i < m; i++)
+ {
+ const size_t idx = i + e * m;
+ const size_t idxc = i + (factor - e) * m;
+ REAL(out,ostride,idx) = REAL(in,istride,idx) + REAL(in,istride,idxc);
+ IMAG(out,ostride,idx) = IMAG(in,istride,idx) + IMAG(in,istride,idxc);
+ REAL(out,ostride,idxc) = REAL(in,istride,idx) - REAL(in,istride,idxc);
+ IMAG(out,ostride,idxc) = IMAG(in,istride,idx) - IMAG(in,istride,idxc);
+ }
+ }
+
+ /* e = 0 */
+
+ for (i=0 ; i<m; i++)
+ {
+ REAL(in,istride,i) = REAL(out,ostride,i);
+ IMAG(in,istride,i) = IMAG(out,ostride,i);
+ }
+
+ for (e1 = 1; e1 < (factor - 1) / 2 + 1; e1++)
+ {
+ for (i = 0; i < m; i++)
+ {
+ REAL(in,istride,i) += REAL(out,ostride,i + e1*m) ;
+ IMAG(in,istride,i) += IMAG(out,ostride,i + e1*m) ;
+ }
+ }
+
+ for (e = 1; e < (factor-1)/2 + 1; e++)
+ {
+ size_t idx = e*q ;
+ const size_t idx_step = e * q ;
+ ATOMIC w_real, w_imag ;
+
+ const size_t em = e * m ;
+ const size_t ecm = (factor - e) * m ;
+
+ for (i = 0; i < m; i++)
+ {
+ REAL(in,istride,i+em) = REAL(out,ostride,i) ;
+ IMAG(in,istride,i+em) = IMAG(out,ostride,i) ;
+ REAL(in,istride,i+ecm) = REAL(out,ostride,i) ;
+ IMAG(in,istride,i+ecm) = IMAG(out,ostride,i) ;
+ }
+
+ for (e1 = 1; e1 < (factor - 1) / 2 + 1; e1++)
+ {
+ if (idx == 0) {
+ w_real = 1 ;
+ w_imag = 0 ;
+ } else {
+ if (sign == gsl_fft_forward) {
+ w_real = GSL_REAL(twiddle[idx - 1]) ;
+ w_imag = GSL_IMAG(twiddle[idx - 1]) ;
+ } else {
+ w_real = GSL_REAL(twiddle[idx - 1]) ;
+ w_imag = -GSL_IMAG(twiddle[idx - 1]) ;
+ }
+ }
+
+ for (i = 0; i < m; i++)
+ {
+ const ATOMIC xp_real = REAL(out,ostride,i + e1 * m);
+ const ATOMIC xp_imag = IMAG(out,ostride,i + e1 * m);
+ const ATOMIC xm_real = REAL(out,ostride,i + (factor - e1) *m);
+ const ATOMIC xm_imag = IMAG(out,ostride,i + (factor - e1) *m);
+
+ const ATOMIC ap = w_real * xp_real ;
+ const ATOMIC am = w_imag * xm_imag ;
+
+ ATOMIC sum_real = ap - am;
+ ATOMIC sumc_real = ap + am;
+
+ const ATOMIC bp = w_real * xp_imag ;
+ const ATOMIC bm = w_imag * xm_real ;
+
+ ATOMIC sum_imag = bp + bm;
+ ATOMIC sumc_imag = bp - bm;
+
+ REAL(in,istride,i + em) += sum_real;
+ IMAG(in,istride,i + em) += sum_imag;
+ REAL(in,istride,i + ecm) += sumc_real;
+ IMAG(in,istride,i + ecm) += sumc_imag;
+ }
+ idx += idx_step ;
+ idx %= factor * q ;
+ }
+ }
+
+ i = 0;
+ j = 0;
+
+ /* k = 0 */
+ for (k1 = 0; k1 < p_1; k1++)
+ {
+ REAL(out,ostride,k1) = REAL(in,istride,k1);
+ IMAG(out,ostride,k1) = IMAG(in,istride,k1);
+ }
+
+ for (e1 = 1; e1 < factor; e1++)
+ {
+ for (k1 = 0; k1 < p_1; k1++)
+ {
+ REAL(out,ostride,k1 + e1 * p_1) = REAL(in,istride,k1 + e1 * m) ;
+ IMAG(out,ostride,k1 + e1 * p_1) = IMAG(in,istride,k1 + e1 * m) ;
+ }
+ }
+
+ i = p_1 ;
+ j = product ;
+
+ for (k = 1; k < q; k++)
+ {
+ for (k1 = 0; k1 < p_1; k1++)
+ {
+ REAL(out,ostride,j) = REAL(in,istride,i);
+ IMAG(out,ostride,j) = IMAG(in,istride,i);
+ i++;
+ j++;
+ }
+ j += jump;
+ }
+
+ i = p_1 ;
+ j = product ;
+
+ for (k = 1; k < q; k++)
+ {
+ for (k1 = 0; k1 < p_1; k1++)
+ {
+ for (e1 = 1; e1 < factor; e1++)
+ {
+ ATOMIC x_real = REAL(in, istride,i + e1 * m);
+ ATOMIC x_imag = IMAG(in, istride,i + e1 * m);
+
+ ATOMIC w_real, w_imag ;
+ if (sign == gsl_fft_forward) {
+ w_real = GSL_REAL(twiddle[(e1-1)*q + k-1]) ;
+ w_imag = GSL_IMAG(twiddle[(e1-1)*q + k-1]) ;
+ } else {
+ w_real = GSL_REAL(twiddle[(e1-1)*q + k-1]) ;
+ w_imag = -GSL_IMAG(twiddle[(e1-1)*q + k-1]) ;
+ }
+
+ REAL(out,ostride,j + e1 * p_1) = w_real * x_real - w_imag * x_imag;
+ IMAG(out,ostride,j + e1 * p_1) = w_real * x_imag + w_imag * x_real;
+ }
+ i++;
+ j++;
+ }
+ j += jump;
+ }
+
+ return 0;
+}
+
diff --git a/gsl-1.9/fft/c_radix2.c b/gsl-1.9/fft/c_radix2.c
new file mode 100644
index 0000000..f8dcf43
--- /dev/null
+++ b/gsl-1.9/fft/c_radix2.c
@@ -0,0 +1,316 @@
+/* fft/c_radix2.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+int
+FUNCTION(gsl_fft_complex,radix2_forward) (TYPE(gsl_complex_packed_array) data,
+ const size_t stride, const size_t n)
+{
+ gsl_fft_direction sign = gsl_fft_forward;
+ int status = FUNCTION(gsl_fft_complex,radix2_transform) (data, stride, n, sign);
+ return status;
+}
+
+int
+FUNCTION(gsl_fft_complex,radix2_backward) (TYPE(gsl_complex_packed_array) data,
+ const size_t stride, const size_t n)
+{
+ gsl_fft_direction sign = gsl_fft_backward;
+ int status = FUNCTION(gsl_fft_complex,radix2_transform) (data, stride, n, sign);
+ return status;
+}
+
+int
+FUNCTION(gsl_fft_complex,radix2_inverse) (TYPE(gsl_complex_packed_array) data,
+ const size_t stride, const size_t n)
+{
+ gsl_fft_direction sign = gsl_fft_backward;
+ int status = FUNCTION(gsl_fft_complex,radix2_transform) (data, stride, n, sign);
+
+ if (status)
+ {
+ return status;
+ }
+
+ /* normalize inverse fft with 1/n */
+
+ {
+ const ATOMIC norm = 1.0 / n;
+ size_t i;
+ for (i = 0; i < n; i++)
+ {
+ REAL(data,stride,i) *= norm;
+ IMAG(data,stride,i) *= norm;
+ }
+ }
+
+ return status;
+}
+
+
+
+int
+FUNCTION(gsl_fft_complex,radix2_transform) (TYPE(gsl_complex_packed_array) data,
+ const size_t stride,
+ const size_t n,
+ const gsl_fft_direction sign)
+{
+ int result ;
+ size_t dual;
+ size_t bit;
+ size_t logn = 0;
+ int status;
+
+ if (n == 1) /* identity operation */
+ {
+ return 0 ;
+ }
+
+ /* make sure that n is a power of 2 */
+
+ result = fft_binary_logn(n) ;
+
+ if (result == -1)
+ {
+ GSL_ERROR ("n is not a power of 2", GSL_EINVAL);
+ }
+ else
+ {
+ logn = result ;
+ }
+
+ /* bit reverse the ordering of input data for decimation in time algorithm */
+
+ status = FUNCTION(fft_complex,bitreverse_order) (data, stride, n, logn) ;
+
+ /* apply fft recursion */
+
+ dual = 1;
+
+ for (bit = 0; bit < logn; bit++)
+ {
+ ATOMIC w_real = 1.0;
+ ATOMIC w_imag = 0.0;
+
+ const double theta = 2.0 * ((int) sign) * M_PI / (2.0 * (double) dual);
+
+ const ATOMIC s = sin (theta);
+ const ATOMIC t = sin (theta / 2.0);
+ const ATOMIC s2 = 2.0 * t * t;
+
+ size_t a, b;
+
+ /* a = 0 */
+
+ for (b = 0; b < n; b += 2 * dual)
+ {
+ const size_t i = b ;
+ const size_t j = b + dual;
+
+ const ATOMIC z1_real = REAL(data,stride,j) ;
+ const ATOMIC z1_imag = IMAG(data,stride,j) ;
+
+ const ATOMIC wd_real = z1_real ;
+ const ATOMIC wd_imag = z1_imag ;
+
+ REAL(data,stride,j) = REAL(data,stride,i) - wd_real;
+ IMAG(data,stride,j) = IMAG(data,stride,i) - wd_imag;
+ REAL(data,stride,i) += wd_real;
+ IMAG(data,stride,i) += wd_imag;
+ }
+
+ /* a = 1 .. (dual-1) */
+
+ for (a = 1; a < dual; a++)
+ {
+
+ /* trignometric recurrence for w-> exp(i theta) w */
+
+ {
+ const ATOMIC tmp_real = w_real - s * w_imag - s2 * w_real;
+ const ATOMIC tmp_imag = w_imag + s * w_real - s2 * w_imag;
+ w_real = tmp_real;
+ w_imag = tmp_imag;
+ }
+
+ for (b = 0; b < n; b += 2 * dual)
+ {
+ const size_t i = b + a;
+ const size_t j = b + a + dual;
+
+ const ATOMIC z1_real = REAL(data,stride,j) ;
+ const ATOMIC z1_imag = IMAG(data,stride,j) ;
+
+ const ATOMIC wd_real = w_real * z1_real - w_imag * z1_imag;
+ const ATOMIC wd_imag = w_real * z1_imag + w_imag * z1_real;
+
+ REAL(data,stride,j) = REAL(data,stride,i) - wd_real;
+ IMAG(data,stride,j) = IMAG(data,stride,i) - wd_imag;
+ REAL(data,stride,i) += wd_real;
+ IMAG(data,stride,i) += wd_imag;
+ }
+ }
+ dual *= 2;
+ }
+
+ return 0;
+
+}
+
+
+int
+FUNCTION(gsl_fft_complex,radix2_dif_forward) (TYPE(gsl_complex_packed_array) data,
+ const size_t stride,
+ const size_t n)
+{
+ gsl_fft_direction sign = gsl_fft_forward;
+ int status = FUNCTION(gsl_fft_complex,radix2_dif_transform) (data, stride, n, sign);
+ return status;
+}
+
+int
+FUNCTION(gsl_fft_complex,radix2_dif_backward) (TYPE(gsl_complex_packed_array) data,
+ const size_t stride,
+ const size_t n)
+{
+ gsl_fft_direction sign = gsl_fft_backward;
+ int status = FUNCTION(gsl_fft_complex,radix2_dif_transform) (data, stride, n, sign);
+ return status;
+}
+
+int
+FUNCTION(gsl_fft_complex,radix2_dif_inverse) (TYPE(gsl_complex_packed_array) data,
+ const size_t stride,
+ const size_t n)
+{
+ gsl_fft_direction sign = gsl_fft_backward;
+ int status = FUNCTION(gsl_fft_complex,radix2_dif_transform) (data, stride, n, sign);
+
+ if (status)
+ {
+ return status;
+ }
+
+ /* normalize inverse fft with 1/n */
+
+ {
+ const ATOMIC norm = 1.0 / n;
+ size_t i;
+ for (i = 0; i < n; i++)
+ {
+ REAL(data,stride,i) *= norm;
+ IMAG(data,stride,i) *= norm;
+ }
+ }
+
+ return status;
+}
+
+int
+FUNCTION(gsl_fft_complex,radix2_dif_transform) (TYPE(gsl_complex_packed_array) data,
+ const size_t stride,
+ const size_t n,
+ const gsl_fft_direction sign)
+{
+ int result ;
+ size_t dual;
+ size_t bit;
+ size_t logn = 0;
+ int status;
+
+ if (n == 1) /* identity operation */
+ {
+ return 0 ;
+ }
+
+ /* make sure that n is a power of 2 */
+
+ result = fft_binary_logn(n) ;
+
+ if (result == -1)
+ {
+ GSL_ERROR ("n is not a power of 2", GSL_EINVAL);
+ }
+ else
+ {
+ logn = result ;
+ }
+
+ /* apply fft recursion */
+
+ dual = n / 2;
+
+ for (bit = 0; bit < logn; bit++)
+ {
+ ATOMIC w_real = 1.0;
+ ATOMIC w_imag = 0.0;
+
+ const double theta = 2.0 * ((int) sign) * M_PI / ((double) (2 * dual));
+
+ const ATOMIC s = sin (theta);
+ const ATOMIC t = sin (theta / 2.0);
+ const ATOMIC s2 = 2.0 * t * t;
+
+ size_t a, b;
+
+ for (b = 0; b < dual; b++)
+ {
+ for (a = 0; a < n; a+= 2 * dual)
+ {
+ const size_t i = b + a;
+ const size_t j = b + a + dual;
+
+ const ATOMIC t1_real = REAL(data,stride,i) + REAL(data,stride,j);
+ const ATOMIC t1_imag = IMAG(data,stride,i) + IMAG(data,stride,j);
+ const ATOMIC t2_real = REAL(data,stride,i) - REAL(data,stride,j);
+ const ATOMIC t2_imag = IMAG(data,stride,i) - IMAG(data,stride,j);
+
+ REAL(data,stride,i) = t1_real;
+ IMAG(data,stride,i) = t1_imag;
+ REAL(data,stride,j) = w_real*t2_real - w_imag * t2_imag;
+ IMAG(data,stride,j) = w_real*t2_imag + w_imag * t2_real;
+ }
+
+ /* trignometric recurrence for w-> exp(i theta) w */
+
+ {
+ const ATOMIC tmp_real = w_real - s * w_imag - s2 * w_real;
+ const ATOMIC tmp_imag = w_imag + s * w_real - s2 * w_imag;
+ w_real = tmp_real;
+ w_imag = tmp_imag;
+ }
+ }
+ dual /= 2;
+ }
+
+ /* bit reverse the ordering of output data for decimation in
+ frequency algorithm */
+
+ status = FUNCTION(fft_complex,bitreverse_order)(data, stride, n, logn) ;
+
+ return 0;
+
+}
+
+
+
+
+
+
+
+
diff --git a/gsl-1.9/fft/compare.h b/gsl-1.9/fft/compare.h
new file mode 100644
index 0000000..fe37179
--- /dev/null
+++ b/gsl-1.9/fft/compare.h
@@ -0,0 +1,30 @@
+/* fft/compare.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+int
+FUNCTION(compare_complex,results) (const char *name_a, const BASE a[],
+ const char *name_b, const BASE b[],
+ size_t stride, size_t n,
+ const double allowed_ticks);
+
+int
+FUNCTION(compare_real,results) (const char *name_a, const BASE a[],
+ const char *name_b, const BASE b[],
+ size_t stride, size_t n,
+ const double allowed_ticks);
diff --git a/gsl-1.9/fft/compare_source.c b/gsl-1.9/fft/compare_source.c
new file mode 100644
index 0000000..0f4ad83
--- /dev/null
+++ b/gsl-1.9/fft/compare_source.c
@@ -0,0 +1,125 @@
+/* fft/compare_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "compare.h"
+
+int
+FUNCTION(compare_complex,results) (const char *name_a, const BASE a[],
+ const char *name_b, const BASE b[],
+ size_t stride, size_t n,
+ const double allowed_ticks)
+{
+ size_t i;
+ double ticks, max_ticks = 0;
+ double dr, di;
+ const char *flag;
+
+ for (i = 0; i < n; i++)
+ {
+ dr = b[2*stride*i] - a[2*stride*i];
+ di = b[2*stride*i+1] - a[2*stride*i+1];
+ ticks = (fabs (dr) + fabs (di)) / BASE_EPSILON;
+ if (ticks > max_ticks)
+ {
+ max_ticks = ticks;
+ }
+ }
+
+ if (max_ticks < allowed_ticks)
+ {
+ return 0;
+ }
+
+ printf ("\n%s vs %s : max_ticks = %f\n", name_a, name_b, max_ticks);
+
+ for (i = 0; i < n; i++)
+ {
+ dr = b[2*stride*i] - a[2*stride*i];
+ di = b[2*stride*i+1] - a[2*stride*i+1];
+ ticks = (fabs (dr) + fabs (di)) / BASE_EPSILON;
+
+ if (ticks > 1000)
+ {
+ flag = "***";
+ }
+ else
+ {
+ flag = "";
+ }
+
+ printf ("%15s: %d %.16f %.16f %s\n", name_a, (int)i,
+ a[2*stride*i], a[2*stride*i+1], flag);
+ printf ("%15s: %d %.16f %.16f %e %s\n", name_b, (int)i,
+ b[2*stride*i], b[2*stride*i+1], ticks, flag);
+ }
+
+ return -1;
+}
+
+
+int
+FUNCTION(compare_real,results) (const char *name_a, const BASE a[],
+ const char *name_b, const BASE b[],
+ size_t stride, size_t n,
+ const double allowed_ticks)
+{
+ size_t i;
+ double ticks, max_ticks = 0;
+ double dr;
+ const char *flag;
+
+ for (i = 0; i < n; i++)
+ {
+ dr = b[stride*i] - a[stride*i];
+ ticks = fabs (dr) / BASE_EPSILON;
+ if (ticks > max_ticks)
+ {
+ max_ticks = ticks;
+ }
+ }
+
+ if (max_ticks < allowed_ticks)
+ {
+ return 0;
+ }
+
+ printf ("\n%s vs %s : max_ticks = %f\n", name_a, name_b, max_ticks);
+
+ for (i = 0; i < n; i++)
+ {
+ dr = b[stride*i] - a[stride*i];
+ ticks = fabs (dr) / BASE_EPSILON;
+
+ if (ticks > 1000)
+ {
+ flag = "***";
+ }
+ else
+ {
+ flag = "";
+ }
+
+ printf ("%15s: %d %.16f %s\n", name_a, (int)i,
+ a[stride*i], flag);
+ printf ("%15s: %d %.16f %e %s\n", name_b, (int)i,
+ b[stride*i], ticks, flag);
+ }
+
+ return -1;
+}
diff --git a/gsl-1.9/fft/complex_internal.h b/gsl-1.9/fft/complex_internal.h
new file mode 100644
index 0000000..1c9c366
--- /dev/null
+++ b/gsl-1.9/fft/complex_internal.h
@@ -0,0 +1,14 @@
+/* Handling of packed complex types... not meant for client consumption.
+ */
+#ifndef COMPLEX_INTERNAL_H_
+#define COMPLEX_INTERNAL_H_
+
+#define VECTOR(a,stride,i) ((a)[(stride)*(i)])
+#define REAL(a,stride,i) ((a)[2*(stride)*(i)])
+#define IMAG(a,stride,i) ((a)[2*(stride)*(i)+1])
+
+#define REAL0(a) ((a)[0])
+#define IMAG0(a) ((a)[1])
+
+
+#endif /* !COMPLEX_INTERNAL_H_ */
diff --git a/gsl-1.9/fft/dft.c b/gsl-1.9/fft/dft.c
new file mode 100644
index 0000000..26d32a5
--- /dev/null
+++ b/gsl-1.9/fft/dft.c
@@ -0,0 +1,25 @@
+#include <config.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <math.h>
+
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_complex.h>
+
+#include <gsl/gsl_dft_complex.h>
+#include <gsl/gsl_dft_complex_float.h>
+
+#include "complex_internal.h"
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "dft_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "dft_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
diff --git a/gsl-1.9/fft/dft_source.c b/gsl-1.9/fft/dft_source.c
new file mode 100644
index 0000000..2f2c349
--- /dev/null
+++ b/gsl-1.9/fft/dft_source.c
@@ -0,0 +1,104 @@
+/* fft/dft_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+int
+FUNCTION(gsl_dft_complex,forward) (const BASE data[],
+ const size_t stride, const size_t n,
+ BASE result[])
+{
+ gsl_fft_direction sign = gsl_fft_forward;
+ int status = FUNCTION(gsl_dft_complex,transform) (data, stride, n, result, sign);
+ return status;
+}
+
+int
+FUNCTION(gsl_dft_complex,backward) (const BASE data[],
+ const size_t stride, const size_t n,
+ BASE result[])
+{
+ gsl_fft_direction sign = gsl_fft_backward;
+ int status = FUNCTION(gsl_dft_complex,transform) (data, stride, n, result, sign);
+ return status;
+}
+
+
+int
+FUNCTION(gsl_dft_complex,inverse) (const BASE data[],
+ const size_t stride, const size_t n,
+ BASE result[])
+{
+ gsl_fft_direction sign = gsl_fft_backward;
+ int status = FUNCTION(gsl_dft_complex,transform) (data, stride, n, result, sign);
+
+ /* normalize inverse fft with 1/n */
+
+ {
+ const ATOMIC norm = ONE / (ATOMIC)n;
+ size_t i;
+ for (i = 0; i < n; i++)
+ {
+ REAL(result,stride,i) *= norm;
+ IMAG(result,stride,i) *= norm;
+ }
+ }
+ return status;
+}
+
+int
+FUNCTION(gsl_dft_complex,transform) (const BASE data[],
+ const size_t stride, const size_t n,
+ BASE result[],
+ const gsl_fft_direction sign)
+{
+
+ size_t i, j, exponent;
+
+ const double d_theta = 2.0 * ((int) sign) * M_PI / (double) n;
+
+ /* FIXME: check that input length == output length and give error */
+
+ for (i = 0; i < n; i++)
+ {
+ ATOMIC sum_real = 0;
+ ATOMIC sum_imag = 0;
+
+ exponent = 0;
+
+ for (j = 0; j < n; j++)
+ {
+ double theta = d_theta * (double) exponent;
+ /* sum = exp(i theta) * data[j] */
+
+ ATOMIC w_real = (ATOMIC) cos (theta);
+ ATOMIC w_imag = (ATOMIC) sin (theta);
+
+ ATOMIC data_real = REAL(data,stride,j);
+ ATOMIC data_imag = IMAG(data,stride,j);
+
+ sum_real += w_real * data_real - w_imag * data_imag;
+ sum_imag += w_real * data_imag + w_imag * data_real;
+
+ exponent = (exponent + i) % n;
+ }
+ REAL(result,stride,i) = sum_real;
+ IMAG(result,stride,i) = sum_imag;
+ }
+
+ return 0;
+}
diff --git a/gsl-1.9/fft/factorize.c b/gsl-1.9/fft/factorize.c
new file mode 100644
index 0000000..2379fad
--- /dev/null
+++ b/gsl-1.9/fft/factorize.c
@@ -0,0 +1,176 @@
+/* fft/factorize.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_fft_complex.h>
+
+#include "factorize.h"
+
+static int
+fft_complex_factorize (const size_t n,
+ size_t *nf,
+ size_t factors[])
+{
+ const size_t complex_subtransforms[] =
+ {7, 6, 5, 4, 3, 2, 0};
+
+ /* other factors can be added here if their transform modules are
+ implemented. The end of the list is marked by 0. */
+
+ int status = fft_factorize (n, complex_subtransforms, nf, factors);
+ return status;
+}
+
+static int
+fft_halfcomplex_factorize (const size_t n,
+ size_t *nf,
+ size_t factors[])
+{
+ const size_t halfcomplex_subtransforms[] =
+ {5, 4, 3, 2, 0};
+
+ int status = fft_factorize (n, halfcomplex_subtransforms, nf, factors);
+ return status;
+}
+
+static int
+fft_real_factorize (const size_t n,
+ size_t *nf,
+ size_t factors[])
+{
+ const size_t real_subtransforms[] =
+ {5, 4, 3, 2, 0};
+
+ int status = fft_factorize (n, real_subtransforms, nf, factors);
+ return status;
+}
+
+
+static int
+fft_factorize (const size_t n,
+ const size_t implemented_subtransforms[],
+ size_t *n_factors,
+ size_t factors[])
+
+{
+ size_t nf = 0;
+ size_t ntest = n;
+ size_t factor;
+ size_t i = 0;
+
+ if (n == 0)
+ {
+ GSL_ERROR ("length n must be positive integer", GSL_EDOM);
+ }
+
+ if (n == 1)
+ {
+ factors[0] = 1;
+ *n_factors = 1;
+ return 0;
+ }
+
+ /* deal with the implemented factors first */
+
+ while (implemented_subtransforms[i] && ntest != 1)
+ {
+ factor = implemented_subtransforms[i];
+ while ((ntest % factor) == 0)
+ {
+ ntest = ntest / factor;
+ factors[nf] = factor;
+ nf++;
+ }
+ i++;
+ }
+
+ /* deal with any other even prime factors (there is only one) */
+
+ factor = 2;
+
+ while ((ntest % factor) == 0 && (ntest != 1))
+ {
+ ntest = ntest / factor;
+ factors[nf] = factor;
+ nf++;
+ }
+
+ /* deal with any other odd prime factors */
+
+ factor = 3;
+
+ while (ntest != 1)
+ {
+ while ((ntest % factor) != 0)
+ {
+ factor += 2;
+ }
+ ntest = ntest / factor;
+ factors[nf] = factor;
+ nf++;
+ }
+
+ /* check that the factorization is correct */
+ {
+ size_t product = 1;
+
+ for (i = 0; i < nf; i++)
+ {
+ product *= factors[i];
+ }
+
+ if (product != n)
+ {
+ GSL_ERROR ("factorization failed", GSL_ESANITY);
+ }
+ }
+
+ *n_factors = nf;
+
+ return 0;
+}
+
+
+static int
+fft_binary_logn (const size_t n)
+{
+ size_t ntest ;
+ size_t binary_logn = 0 ;
+ size_t k = 1;
+
+ while (k < n)
+ {
+ k *= 2;
+ binary_logn++;
+ }
+
+ ntest = (1 << binary_logn) ;
+
+ if (n != ntest )
+ {
+ return -1 ; /* n is not a power of 2 */
+ }
+
+ return binary_logn;
+}
+
+
+
+
diff --git a/gsl-1.9/fft/factorize.h b/gsl-1.9/fft/factorize.h
new file mode 100644
index 0000000..af57a51
--- /dev/null
+++ b/gsl-1.9/fft/factorize.h
@@ -0,0 +1,29 @@
+/* fft/factorize.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+static int fft_complex_factorize (const size_t n, size_t *nf, size_t factors[]);
+
+static int fft_halfcomplex_factorize (const size_t n, size_t *nf, size_t factors[]);
+
+static int fft_real_factorize (const size_t n, size_t *nf, size_t factors[]);
+
+static int fft_factorize (const size_t n, const size_t implemented_subtransforms[], size_t *n_factors, size_t factors[]);
+
+static int fft_binary_logn (const size_t n) ;
+
diff --git a/gsl-1.9/fft/fft.c b/gsl-1.9/fft/fft.c
new file mode 100644
index 0000000..9aa0da7
--- /dev/null
+++ b/gsl-1.9/fft/fft.c
@@ -0,0 +1,117 @@
+#include <config.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_complex.h>
+
+#include <gsl/gsl_fft_complex.h>
+#include <gsl/gsl_fft_complex_float.h>
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "bitreverse.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "bitreverse.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#include "factorize.c"
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "c_init.c"
+#include "c_main.c"
+#include "c_pass_2.c"
+#include "c_pass_3.c"
+#include "c_pass_4.c"
+#include "c_pass_5.c"
+#include "c_pass_6.c"
+#include "c_pass_7.c"
+#include "c_pass_n.c"
+#include "c_radix2.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "c_init.c"
+#include "c_main.c"
+#include "c_pass_2.c"
+#include "c_pass_3.c"
+#include "c_pass_4.c"
+#include "c_pass_5.c"
+#include "c_pass_6.c"
+#include "c_pass_7.c"
+#include "c_pass_n.c"
+#include "c_radix2.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#include <gsl/gsl_fft_halfcomplex.h>
+#include <gsl/gsl_fft_halfcomplex_float.h>
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "hc_init.c"
+#include "hc_main.c"
+#include "hc_pass_2.c"
+#include "hc_pass_3.c"
+#include "hc_pass_4.c"
+#include "hc_pass_5.c"
+#include "hc_pass_n.c"
+#include "hc_radix2.c"
+#include "hc_unpack.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "hc_init.c"
+#include "hc_main.c"
+#include "hc_pass_2.c"
+#include "hc_pass_3.c"
+#include "hc_pass_4.c"
+#include "hc_pass_5.c"
+#include "hc_pass_n.c"
+#include "hc_radix2.c"
+#include "hc_unpack.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#include <gsl/gsl_fft_real.h>
+#include <gsl/gsl_fft_real_float.h>
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "real_init.c"
+#include "real_main.c"
+#include "real_pass_2.c"
+#include "real_pass_3.c"
+#include "real_pass_4.c"
+#include "real_pass_5.c"
+#include "real_pass_n.c"
+#include "real_radix2.c"
+#include "real_unpack.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "real_init.c"
+#include "real_main.c"
+#include "real_pass_2.c"
+#include "real_pass_3.c"
+#include "real_pass_4.c"
+#include "real_pass_5.c"
+#include "real_pass_n.c"
+#include "real_radix2.c"
+#include "real_unpack.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
diff --git a/gsl-1.9/fft/gsl_dft_complex.h b/gsl-1.9/fft/gsl_dft_complex.h
new file mode 100644
index 0000000..6337e60
--- /dev/null
+++ b/gsl-1.9/fft/gsl_dft_complex.h
@@ -0,0 +1,55 @@
+/* fft/gsl_dft_complex.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_DFT_COMPLEX_H__
+#define __GSL_DFT_COMPLEX_H__
+
+#include <stddef.h>
+
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_complex.h>
+#include <gsl/gsl_fft.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+int gsl_dft_complex_forward (const double data[], const size_t stride, const size_t n,
+ double result[]);
+
+int gsl_dft_complex_backward (const double data[], const size_t stride, const size_t n,
+ double result[]);
+
+int gsl_dft_complex_inverse (const double data[], const size_t stride, const size_t n,
+ double result[]);
+
+int gsl_dft_complex_transform (const double data[], const size_t stride, const size_t n,
+ double result[], const gsl_fft_direction sign);
+
+__END_DECLS
+
+#endif /* __GSL_DFT_COMPLEX_H__ */
diff --git a/gsl-1.9/fft/gsl_dft_complex_float.h b/gsl-1.9/fft/gsl_dft_complex_float.h
new file mode 100644
index 0000000..9acf9af
--- /dev/null
+++ b/gsl-1.9/fft/gsl_dft_complex_float.h
@@ -0,0 +1,55 @@
+/* fft/gsl_dft_complex_float.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_DFT_COMPLEX_FLOAT_H__
+#define __GSL_DFT_COMPLEX_FLOAT_H__
+
+#include <stddef.h>
+
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_complex.h>
+#include <gsl/gsl_fft.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+int gsl_dft_complex_float_forward (const float data[], const size_t stride, const size_t n,
+ float result[]);
+
+int gsl_dft_complex_float_backward (const float data[], const size_t stride, const size_t n,
+ float result[]);
+
+int gsl_dft_complex_float_inverse (const float data[], const size_t stride, const size_t n,
+ float result[]);
+
+int gsl_dft_complex_float_transform (const float data[], const size_t stride, const size_t n,
+ float result[], const gsl_fft_direction sign);
+
+__END_DECLS
+
+#endif /* __GSL_DFT_COMPLEX_FLOAT_H__ */
diff --git a/gsl-1.9/fft/gsl_fft.h b/gsl-1.9/fft/gsl_fft.h
new file mode 100644
index 0000000..d98971f
--- /dev/null
+++ b/gsl-1.9/fft/gsl_fft.h
@@ -0,0 +1,60 @@
+/* fft/gsl_fft.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_FFT_H__
+#define __GSL_FFT_H__
+
+#include <gsl/gsl_complex.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+#ifndef GSL_DISABLE_DEPRECATED
+typedef enum
+ {
+ forward = -1, backward = +1,
+ gsl_fft_forward = -1, gsl_fft_backward = +1
+ }
+gsl_fft_direction;
+#else
+typedef enum
+ {
+ gsl_fft_forward = -1, gsl_fft_backward = +1
+ }
+gsl_fft_direction;
+#endif
+
+/* this gives the sign in the formula
+
+ h(f) = \sum x(t) exp(+/- 2 pi i f t)
+
+ where - is the forward transform direction and + the inverse direction */
+
+__END_DECLS
+
+#endif /* __GSL_FFT_H__ */
diff --git a/gsl-1.9/fft/gsl_fft_complex.h b/gsl-1.9/fft/gsl_fft_complex.h
new file mode 100644
index 0000000..dd3d968
--- /dev/null
+++ b/gsl-1.9/fft/gsl_fft_complex.h
@@ -0,0 +1,136 @@
+/* fft/gsl_fft_complex.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_FFT_COMPLEX_H__
+#define __GSL_FFT_COMPLEX_H__
+
+#include <stddef.h>
+
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_complex.h>
+#include <gsl/gsl_fft.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+/* Power of 2 routines */
+
+
+int gsl_fft_complex_radix2_forward (gsl_complex_packed_array data,
+ const size_t stride,
+ const size_t n);
+
+int gsl_fft_complex_radix2_backward (gsl_complex_packed_array data,
+ const size_t stride,
+ const size_t n);
+
+int gsl_fft_complex_radix2_inverse (gsl_complex_packed_array data,
+ const size_t stride,
+ const size_t n);
+
+int gsl_fft_complex_radix2_transform (gsl_complex_packed_array data,
+ const size_t stride,
+ const size_t n,
+ const gsl_fft_direction sign);
+
+int gsl_fft_complex_radix2_dif_forward (gsl_complex_packed_array data,
+ const size_t stride,
+ const size_t n);
+
+int gsl_fft_complex_radix2_dif_backward (gsl_complex_packed_array data,
+ const size_t stride,
+ const size_t n);
+
+int gsl_fft_complex_radix2_dif_inverse (gsl_complex_packed_array data,
+ const size_t stride,
+ const size_t n);
+
+int gsl_fft_complex_radix2_dif_transform (gsl_complex_packed_array data,
+ const size_t stride,
+ const size_t n,
+ const gsl_fft_direction sign);
+
+/* Mixed Radix general-N routines */
+
+typedef struct
+ {
+ size_t n;
+ size_t nf;
+ size_t factor[64];
+ gsl_complex *twiddle[64];
+ gsl_complex *trig;
+ }
+gsl_fft_complex_wavetable;
+
+typedef struct
+{
+ size_t n;
+ double *scratch;
+}
+gsl_fft_complex_workspace;
+
+
+gsl_fft_complex_wavetable *gsl_fft_complex_wavetable_alloc (size_t n);
+
+void gsl_fft_complex_wavetable_free (gsl_fft_complex_wavetable * wavetable);
+
+gsl_fft_complex_workspace *gsl_fft_complex_workspace_alloc (size_t n);
+
+void gsl_fft_complex_workspace_free (gsl_fft_complex_workspace * workspace);
+
+int gsl_fft_complex_memcpy (gsl_fft_complex_wavetable * dest,
+ gsl_fft_complex_wavetable * src);
+
+
+int gsl_fft_complex_forward (gsl_complex_packed_array data,
+ const size_t stride,
+ const size_t n,
+ const gsl_fft_complex_wavetable * wavetable,
+ gsl_fft_complex_workspace * work);
+
+int gsl_fft_complex_backward (gsl_complex_packed_array data,
+ const size_t stride,
+ const size_t n,
+ const gsl_fft_complex_wavetable * wavetable,
+ gsl_fft_complex_workspace * work);
+
+int gsl_fft_complex_inverse (gsl_complex_packed_array data,
+ const size_t stride,
+ const size_t n,
+ const gsl_fft_complex_wavetable * wavetable,
+ gsl_fft_complex_workspace * work);
+
+int gsl_fft_complex_transform (gsl_complex_packed_array data,
+ const size_t stride, const size_t n,
+ const gsl_fft_complex_wavetable * wavetable,
+ gsl_fft_complex_workspace * work,
+ const gsl_fft_direction sign);
+
+__END_DECLS
+
+#endif /* __GSL_FFT_COMPLEX_H__ */
diff --git a/gsl-1.9/fft/gsl_fft_complex_float.h b/gsl-1.9/fft/gsl_fft_complex_float.h
new file mode 100644
index 0000000..6216a02
--- /dev/null
+++ b/gsl-1.9/fft/gsl_fft_complex_float.h
@@ -0,0 +1,139 @@
+/* fft/gsl_fft_complex_float.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_FFT_COMPLEX_FLOAT_H__
+#define __GSL_FFT_COMPLEX_FLOAT_H__
+
+#include <stddef.h>
+
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_complex.h>
+#include <gsl/gsl_fft.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+/* Power of 2 routines */
+
+
+int gsl_fft_complex_float_radix2_forward (gsl_complex_packed_array_float data,
+ const size_t stride,
+ const size_t n);
+
+int gsl_fft_complex_float_radix2_backward (gsl_complex_packed_array_float data,
+ const size_t stride,
+ const size_t n);
+
+int gsl_fft_complex_float_radix2_inverse (gsl_complex_packed_array_float data,
+ const size_t stride,
+ const size_t n);
+
+int gsl_fft_complex_float_radix2_transform (gsl_complex_packed_array_float data,
+ const size_t stride,
+ const size_t n,
+ const gsl_fft_direction sign);
+
+int gsl_fft_complex_float_radix2_dif_forward (gsl_complex_packed_array_float data,
+ const size_t stride,
+ const size_t n);
+
+int gsl_fft_complex_float_radix2_dif_backward (gsl_complex_packed_array_float data,
+ const size_t stride,
+ const size_t n);
+
+int gsl_fft_complex_float_radix2_dif_inverse (gsl_complex_packed_array_float data,
+ const size_t stride,
+ const size_t n);
+
+int gsl_fft_complex_float_radix2_dif_transform (gsl_complex_packed_array_float data,
+ const size_t stride,
+ const size_t n,
+ const gsl_fft_direction sign);
+
+/* Mixed Radix general-N routines */
+
+typedef struct
+ {
+ size_t n;
+ size_t nf;
+ size_t factor[64];
+ gsl_complex_float *twiddle[64];
+ gsl_complex_float *trig;
+ }
+gsl_fft_complex_wavetable_float;
+
+typedef struct
+{
+ size_t n;
+ float *scratch;
+}
+gsl_fft_complex_workspace_float;
+
+
+gsl_fft_complex_wavetable_float *gsl_fft_complex_wavetable_float_alloc (size_t n);
+
+void gsl_fft_complex_wavetable_float_free (gsl_fft_complex_wavetable_float * wavetable);
+
+gsl_fft_complex_workspace_float *gsl_fft_complex_workspace_float_alloc (size_t n);
+
+void gsl_fft_complex_workspace_float_free (gsl_fft_complex_workspace_float * workspace);
+
+
+int gsl_fft_complex_float_memcpy (gsl_fft_complex_wavetable_float * dest,
+ gsl_fft_complex_wavetable_float * src);
+
+
+int gsl_fft_complex_float_forward (gsl_complex_packed_array_float data,
+ const size_t stride,
+ const size_t n,
+ const gsl_fft_complex_wavetable_float * wavetable,
+ gsl_fft_complex_workspace_float * work);
+
+int gsl_fft_complex_float_backward (gsl_complex_packed_array_float data,
+ const size_t stride,
+ const size_t n,
+ const gsl_fft_complex_wavetable_float * wavetable,
+ gsl_fft_complex_workspace_float * work);
+
+int gsl_fft_complex_float_inverse (gsl_complex_packed_array_float data,
+ const size_t stride,
+ const size_t n,
+ const gsl_fft_complex_wavetable_float * wavetable,
+ gsl_fft_complex_workspace_float * work);
+
+int gsl_fft_complex_float_transform (gsl_complex_packed_array_float data,
+ const size_t stride, const size_t n,
+ const gsl_fft_complex_wavetable_float * wavetable,
+ gsl_fft_complex_workspace_float * work,
+ const gsl_fft_direction sign);
+
+__END_DECLS
+
+#endif /* __GSL_FFT_COMPLEX_FLOAT_H__ */
+
+
diff --git a/gsl-1.9/fft/gsl_fft_halfcomplex.h b/gsl-1.9/fft/gsl_fft_halfcomplex.h
new file mode 100644
index 0000000..c7ed2da
--- /dev/null
+++ b/gsl-1.9/fft/gsl_fft_halfcomplex.h
@@ -0,0 +1,86 @@
+/* fft/gsl_fft_halfcomplex.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_FFT_HALFCOMPLEX_H__
+#define __GSL_FFT_HALFCOMPLEX_H__
+
+#include <stddef.h>
+
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_complex.h>
+#include <gsl/gsl_fft.h>
+#include <gsl/gsl_fft_real.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+int gsl_fft_halfcomplex_radix2_backward (double data[], const size_t stride, const size_t n);
+int gsl_fft_halfcomplex_radix2_inverse (double data[], const size_t stride, const size_t n);
+int gsl_fft_halfcomplex_radix2_transform (double data[], const size_t stride, const size_t n);
+
+typedef struct
+ {
+ size_t n;
+ size_t nf;
+ size_t factor[64];
+ gsl_complex *twiddle[64];
+ gsl_complex *trig;
+ }
+gsl_fft_halfcomplex_wavetable;
+
+gsl_fft_halfcomplex_wavetable * gsl_fft_halfcomplex_wavetable_alloc (size_t n);
+
+void
+gsl_fft_halfcomplex_wavetable_free (gsl_fft_halfcomplex_wavetable * wavetable);
+
+
+int gsl_fft_halfcomplex_backward (double data[], const size_t stride, const size_t n,
+ const gsl_fft_halfcomplex_wavetable * wavetable,
+ gsl_fft_real_workspace * work);
+
+int gsl_fft_halfcomplex_inverse (double data[], const size_t stride, const size_t n,
+ const gsl_fft_halfcomplex_wavetable * wavetable,
+ gsl_fft_real_workspace * work);
+
+int gsl_fft_halfcomplex_transform (double data[], const size_t stride, const size_t n,
+ const gsl_fft_halfcomplex_wavetable * wavetable,
+ gsl_fft_real_workspace * work);
+
+int
+gsl_fft_halfcomplex_unpack (const double halfcomplex_coefficient[],
+ double complex_coefficient[],
+ const size_t stride, const size_t n);
+
+int
+gsl_fft_halfcomplex_radix2_unpack (const double halfcomplex_coefficient[],
+ double complex_coefficient[],
+ const size_t stride, const size_t n);
+
+__END_DECLS
+
+#endif /* __GSL_FFT_HALFCOMPLEX_H__ */
diff --git a/gsl-1.9/fft/gsl_fft_halfcomplex_float.h b/gsl-1.9/fft/gsl_fft_halfcomplex_float.h
new file mode 100644
index 0000000..4666850
--- /dev/null
+++ b/gsl-1.9/fft/gsl_fft_halfcomplex_float.h
@@ -0,0 +1,86 @@
+/* fft/gsl_fft_halfcomplex_float.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_FFT_HALFCOMPLEX_FLOAT_H__
+#define __GSL_FFT_HALFCOMPLEX_FLOAT_H__
+
+#include <stddef.h>
+
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_complex.h>
+#include <gsl/gsl_fft.h>
+#include <gsl/gsl_fft_real_float.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+int gsl_fft_halfcomplex_float_radix2_backward (float data[], const size_t stride, const size_t n);
+int gsl_fft_halfcomplex_float_radix2_inverse (float data[], const size_t stride, const size_t n);
+int gsl_fft_halfcomplex_float_radix2_transform (float data[], const size_t stride, const size_t n);
+
+typedef struct
+ {
+ size_t n;
+ size_t nf;
+ size_t factor[64];
+ gsl_complex_float *twiddle[64];
+ gsl_complex_float *trig;
+ }
+gsl_fft_halfcomplex_wavetable_float;
+
+
+gsl_fft_halfcomplex_wavetable_float * gsl_fft_halfcomplex_wavetable_float_alloc (size_t n);
+
+void
+gsl_fft_halfcomplex_wavetable_float_free (gsl_fft_halfcomplex_wavetable_float * wavetable);
+
+int gsl_fft_halfcomplex_float_backward (float data[], const size_t stride, const size_t n,
+ const gsl_fft_halfcomplex_wavetable_float * wavetable,
+ gsl_fft_real_workspace_float * work);
+
+int gsl_fft_halfcomplex_float_inverse (float data[], const size_t stride, const size_t n,
+ const gsl_fft_halfcomplex_wavetable_float * wavetable,
+ gsl_fft_real_workspace_float * work);
+
+int gsl_fft_halfcomplex_float_transform (float data[], const size_t stride, const size_t n,
+ const gsl_fft_halfcomplex_wavetable_float * wavetable,
+ gsl_fft_real_workspace_float * work);
+
+int
+gsl_fft_halfcomplex_float_unpack (const float halfcomplex_coefficient[],
+ float complex_coefficient[],
+ const size_t stride, const size_t n);
+
+int
+gsl_fft_halfcomplex_float_radix2_unpack (const float halfcomplex_coefficient[],
+ float complex_coefficient[],
+ const size_t stride, const size_t n);
+
+__END_DECLS
+
+#endif /* __GSL_FFT_HALFCOMPLEX_FLOAT_H__ */
diff --git a/gsl-1.9/fft/gsl_fft_real.h b/gsl-1.9/fft/gsl_fft_real.h
new file mode 100644
index 0000000..5af69e8
--- /dev/null
+++ b/gsl-1.9/fft/gsl_fft_real.h
@@ -0,0 +1,80 @@
+/* fft/gsl_fft_real.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_FFT_REAL_H__
+#define __GSL_FFT_REAL_H__
+
+#include <stddef.h>
+
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_complex.h>
+#include <gsl/gsl_fft.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+int gsl_fft_real_radix2_transform (double data[], const size_t stride, const size_t n) ;
+
+typedef struct
+ {
+ size_t n;
+ size_t nf;
+ size_t factor[64];
+ gsl_complex *twiddle[64];
+ gsl_complex *trig;
+ }
+gsl_fft_real_wavetable;
+
+typedef struct
+ {
+ size_t n;
+ double *scratch;
+ }
+gsl_fft_real_workspace;
+
+gsl_fft_real_wavetable * gsl_fft_real_wavetable_alloc (size_t n);
+
+void gsl_fft_real_wavetable_free (gsl_fft_real_wavetable * wavetable);
+
+gsl_fft_real_workspace * gsl_fft_real_workspace_alloc (size_t n);
+
+void gsl_fft_real_workspace_free (gsl_fft_real_workspace * workspace);
+
+
+int gsl_fft_real_transform (double data[], const size_t stride, const size_t n,
+ const gsl_fft_real_wavetable * wavetable,
+ gsl_fft_real_workspace * work);
+
+
+int gsl_fft_real_unpack (const double real_coefficient[],
+ double complex_coefficient[],
+ const size_t stride, const size_t n);
+
+__END_DECLS
+
+#endif /* __GSL_FFT_REAL_H__ */
diff --git a/gsl-1.9/fft/gsl_fft_real_float.h b/gsl-1.9/fft/gsl_fft_real_float.h
new file mode 100644
index 0000000..2c219d7
--- /dev/null
+++ b/gsl-1.9/fft/gsl_fft_real_float.h
@@ -0,0 +1,79 @@
+/* fft/gsl_fft_real_float.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_FFT_REAL_FLOAT_H__
+#define __GSL_FFT_REAL_FLOAT_H__
+
+#include <stddef.h>
+
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_complex.h>
+#include <gsl/gsl_fft.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+int gsl_fft_real_float_radix2_transform (float data[], const size_t stride, const size_t n) ;
+
+typedef struct
+ {
+ size_t n;
+ size_t nf;
+ size_t factor[64];
+ gsl_complex_float *twiddle[64];
+ gsl_complex_float *trig;
+ }
+gsl_fft_real_wavetable_float;
+
+typedef struct
+ {
+ size_t n;
+ float *scratch;
+ }
+gsl_fft_real_workspace_float;
+
+gsl_fft_real_wavetable_float * gsl_fft_real_wavetable_float_alloc (size_t n);
+
+void gsl_fft_real_wavetable_float_free (gsl_fft_real_wavetable_float * wavetable);
+
+gsl_fft_real_workspace_float * gsl_fft_real_workspace_float_alloc (size_t n);
+
+void gsl_fft_real_workspace_float_free (gsl_fft_real_workspace_float * workspace);
+
+int gsl_fft_real_float_transform (float data[], const size_t stride, const size_t n,
+ const gsl_fft_real_wavetable_float * wavetable,
+ gsl_fft_real_workspace_float * work);
+
+
+int gsl_fft_real_float_unpack (const float real_float_coefficient[],
+ float complex_coefficient[],
+ const size_t stride, const size_t n);
+
+__END_DECLS
+
+#endif /* __GSL_FFT_REAL_FLOAT_H__ */
diff --git a/gsl-1.9/fft/hc_init.c b/gsl-1.9/fft/hc_init.c
new file mode 100644
index 0000000..e4b59c0
--- /dev/null
+++ b/gsl-1.9/fft/hc_init.c
@@ -0,0 +1,128 @@
+/* fft/hc_init.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+TYPE(gsl_fft_halfcomplex_wavetable) *
+FUNCTION(gsl_fft_halfcomplex_wavetable,alloc) (size_t n)
+{
+ int status;
+ size_t i;
+ size_t n_factors;
+ size_t t, product, product_1, q;
+ double d_theta;
+
+ TYPE(gsl_fft_halfcomplex_wavetable) * wavetable ;
+
+ if (n == 0)
+ {
+ GSL_ERROR_VAL ("length n must be positive integer", GSL_EDOM, 0);
+ }
+
+ wavetable = (TYPE(gsl_fft_halfcomplex_wavetable) *)
+ malloc(sizeof(TYPE(gsl_fft_halfcomplex_wavetable)));
+
+ if (wavetable == NULL)
+ {
+ GSL_ERROR_VAL ("failed to allocate struct", GSL_ENOMEM, 0);
+ }
+
+ wavetable->trig = (TYPE(gsl_complex) *) malloc (n * sizeof (TYPE(gsl_complex)));
+
+ if (wavetable->trig == NULL)
+ {
+ /* error in constructor, prevent memory leak */
+
+ free(wavetable) ;
+
+ GSL_ERROR_VAL ("failed to allocate trigonometric lookup table",
+ GSL_ENOMEM, 0);
+ }
+
+ wavetable->n = n ;
+
+ status = fft_halfcomplex_factorize (n, &n_factors, wavetable->factor);
+
+ if (status)
+ {
+ /* error in constructor, prevent memory leak */
+
+ free(wavetable->trig) ;
+ free(wavetable) ;
+
+ GSL_ERROR_VAL ("factorization failed", GSL_EFACTOR, 0);
+ }
+
+ wavetable->nf = n_factors;
+
+ d_theta = 2.0 * M_PI / ((double) n);
+
+ t = 0;
+ product = 1;
+ for (i = 0; i < n_factors; i++)
+ {
+ size_t j;
+ const size_t factor = wavetable->factor[i];
+ wavetable->twiddle[i] = wavetable->trig + t;
+ product_1 = product; /* product_1 = p_(i-1) */
+ product *= factor;
+ q = n / product;
+
+ for (j = 1; j < factor; j++)
+ {
+ size_t k;
+ size_t m = 0;
+ for (k = 1; k < (q + 1) / 2; k++)
+ {
+ double theta;
+ m = m + j * product_1;
+ m = m % n;
+ theta = d_theta * m; /* d_theta*j*k*product_1 */
+ GSL_REAL(wavetable->trig[t]) = cos (theta);
+ GSL_IMAG(wavetable->trig[t]) = sin (theta);
+
+ t++;
+ }
+ }
+ }
+
+ if (t > (n / 2))
+ {
+ /* error in constructor, prevent memory leak */
+
+ free(wavetable->trig) ;
+ free(wavetable) ;
+
+ GSL_ERROR_VAL ("overflowed trigonometric lookup table", GSL_ESANITY, 0);
+ }
+
+ return wavetable;
+}
+
+
+void
+FUNCTION(gsl_fft_halfcomplex_wavetable,free) (TYPE(gsl_fft_halfcomplex_wavetable) * wavetable)
+{
+
+ /* release trigonometric lookup tables */
+
+ free (wavetable->trig);
+ wavetable->trig = NULL;
+
+ free (wavetable);
+}
+
diff --git a/gsl-1.9/fft/hc_main.c b/gsl-1.9/fft/hc_main.c
new file mode 100644
index 0000000..591acd4
--- /dev/null
+++ b/gsl-1.9/fft/hc_main.c
@@ -0,0 +1,188 @@
+/* fft/hc_main.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <math.h>
+
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_complex.h>
+#include <gsl/gsl_fft_halfcomplex.h>
+
+#include "hc_pass.h"
+
+int
+FUNCTION(gsl_fft_halfcomplex,backward) (BASE data[], const size_t stride,
+ const size_t n,
+ const TYPE(gsl_fft_halfcomplex_wavetable) * wavetable,
+ TYPE(gsl_fft_real_workspace) * work)
+{
+ int status = FUNCTION(gsl_fft_halfcomplex,transform) (data, stride, n, wavetable, work) ;
+ return status ;
+}
+
+int
+FUNCTION(gsl_fft_halfcomplex,inverse) (BASE data[], const size_t stride,
+ const size_t n,
+ const TYPE(gsl_fft_halfcomplex_wavetable) * wavetable,
+ TYPE(gsl_fft_real_workspace) * work)
+{
+ int status = FUNCTION(gsl_fft_halfcomplex,transform) (data, stride, n, wavetable, work);
+
+ if (status)
+ {
+ return status;
+ }
+
+ /* normalize inverse fft with 1/n */
+
+ {
+ const double norm = 1.0 / n;
+ size_t i;
+ for (i = 0; i < n; i++)
+ {
+ data[stride*i] *= norm;
+ }
+ }
+ return status;
+}
+
+int
+FUNCTION(gsl_fft_halfcomplex,transform) (BASE data[], const size_t stride, const size_t n,
+ const TYPE(gsl_fft_halfcomplex_wavetable) * wavetable,
+ TYPE(gsl_fft_real_workspace) * work)
+{
+ BASE * const scratch = work->scratch;
+
+ BASE * in;
+ BASE * out;
+ size_t istride, ostride ;
+
+
+ size_t factor, product, q;
+ size_t i;
+ size_t nf;
+ int state;
+ int product_1;
+ int tskip;
+ TYPE(gsl_complex) *twiddle1, *twiddle2, *twiddle3, *twiddle4;
+
+ if (n == 0)
+ {
+ GSL_ERROR ("length n must be positive integer", GSL_EDOM);
+ }
+
+ if (n == 1)
+ { /* FFT of one data point is the identity */
+ return 0;
+ }
+
+ if (n != wavetable->n)
+ {
+ GSL_ERROR ("wavetable does not match length of data", GSL_EINVAL);
+ }
+
+ if (n != work->n)
+ {
+ GSL_ERROR ("workspace does not match length of data", GSL_EINVAL);
+ }
+
+ nf = wavetable->nf;
+ product = 1;
+ state = 0;
+
+ for (i = 0; i < nf; i++)
+ {
+ factor = wavetable->factor[i];
+ product_1 = product;
+ product *= factor;
+ q = n / product;
+
+ tskip = (q + 1) / 2 - 1;
+
+ if (state == 0)
+ {
+ in = data;
+ istride = stride;
+ out = scratch;
+ ostride = 1;
+ state = 1;
+ }
+ else
+ {
+ in = scratch;
+ istride = 1;
+ out = data;
+ ostride = stride;
+ state = 0;
+ }
+
+ if (factor == 2)
+ {
+ twiddle1 = wavetable->twiddle[i];
+ FUNCTION(fft_halfcomplex,pass_2) (in, istride, out, ostride,
+ product, n, twiddle1);
+ }
+ else if (factor == 3)
+ {
+ twiddle1 = wavetable->twiddle[i];
+ twiddle2 = twiddle1 + tskip;
+ FUNCTION(fft_halfcomplex,pass_3) (in, istride, out, ostride,
+ product, n, twiddle1, twiddle2);
+ }
+ else if (factor == 4)
+ {
+ twiddle1 = wavetable->twiddle[i];
+ twiddle2 = twiddle1 + tskip;
+ twiddle3 = twiddle2 + tskip;
+ FUNCTION(fft_halfcomplex,pass_4) (in, istride, out, ostride,
+ product, n, twiddle1, twiddle2,
+ twiddle3);
+ }
+ else if (factor == 5)
+ {
+ twiddle1 = wavetable->twiddle[i];
+ twiddle2 = twiddle1 + tskip;
+ twiddle3 = twiddle2 + tskip;
+ twiddle4 = twiddle3 + tskip;
+ FUNCTION(fft_halfcomplex,pass_5) (in, istride, out, ostride,
+ product, n, twiddle1, twiddle2,
+ twiddle3, twiddle4);
+ }
+ else
+ {
+ twiddle1 = wavetable->twiddle[i];
+ FUNCTION(fft_halfcomplex,pass_n) (in, istride, out, ostride,
+ factor, product, n, twiddle1);
+ }
+ }
+
+ if (state == 1) /* copy results back from scratch to data */
+ {
+ for (i = 0; i < n; i++)
+ {
+ data[stride*i] = scratch[i] ;
+ }
+ }
+
+ return 0;
+
+}
+
+
diff --git a/gsl-1.9/fft/hc_pass.h b/gsl-1.9/fft/hc_pass.h
new file mode 100644
index 0000000..dd8f3d9
--- /dev/null
+++ b/gsl-1.9/fft/hc_pass.h
@@ -0,0 +1,76 @@
+/* fft/hc_pass.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "complex_internal.h"
+
+static void
+FUNCTION(fft_halfcomplex,pass_2) (const BASE in[],
+ const size_t istride,
+ BASE out[],
+ const size_t ostride,
+ const size_t product,
+ const size_t n,
+ const TYPE(gsl_complex) twiddle[]);
+
+static void
+FUNCTION(fft_halfcomplex,pass_3) (const BASE in[],
+ const size_t istride,
+ BASE out[],
+ const size_t ostride,
+ const size_t product,
+ const size_t n,
+ const TYPE(gsl_complex) twiddle1[],
+ const TYPE(gsl_complex) twiddle2[]);
+
+static void
+FUNCTION(fft_halfcomplex,pass_4) (const BASE in[],
+ const size_t istride,
+ BASE out[],
+ const size_t ostride,
+ const size_t product,
+ const size_t n,
+ const TYPE(gsl_complex) twiddle1[],
+ const TYPE(gsl_complex) twiddle2[],
+ const TYPE(gsl_complex) twiddle3[]);
+
+static void
+FUNCTION(fft_halfcomplex,pass_5) (const BASE in[],
+ const size_t istride,
+ BASE out[],
+ const size_t ostride,
+ const size_t product,
+ const size_t n,
+ const TYPE(gsl_complex) twiddle1[],
+ const TYPE(gsl_complex) twiddle2[],
+ const TYPE(gsl_complex) twiddle3[],
+ const TYPE(gsl_complex) twiddle4[]);
+
+static void
+FUNCTION(fft_halfcomplex,pass_n) (const BASE in[],
+ const size_t istride,
+ BASE out[],
+ const size_t ostride,
+ const size_t factor,
+ const size_t product,
+ const size_t n,
+ const TYPE(gsl_complex) twiddle[]);
+
+
+
+
diff --git a/gsl-1.9/fft/hc_pass_2.c b/gsl-1.9/fft/hc_pass_2.c
new file mode 100644
index 0000000..2cb448e
--- /dev/null
+++ b/gsl-1.9/fft/hc_pass_2.c
@@ -0,0 +1,106 @@
+/* fft/hc_pass_2.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+static void
+FUNCTION(fft_halfcomplex,pass_2) (const BASE in[],
+ const size_t istride,
+ BASE out[],
+ const size_t ostride,
+ const size_t product,
+ const size_t n,
+ const TYPE(gsl_complex) twiddle[])
+{
+ size_t i, j, k, k1, jump;
+ size_t factor, q, m, product_1;
+ i = 0;
+ j = 0;
+
+ factor = 2;
+ m = n / factor;
+ q = n / product;
+ product_1 = product / factor;
+ jump = (factor - 1) * q;
+
+ for (k1 = 0; k1 < product_1; k1++)
+ {
+ const ATOMIC r0 = VECTOR(in,istride,2 * k1 * q);
+ const ATOMIC r1 = VECTOR(in,istride,2 * k1 * q + 2 * q - 1);
+
+ const ATOMIC s0 = r0 + r1;
+ const ATOMIC s1 = r0 - r1;
+
+ VECTOR(out,ostride,q * k1) = s0;
+ VECTOR(out,ostride,q * k1 + m) = s1;
+ }
+
+ if (q == 1)
+ return;
+
+ for (k = 1; k < (q + 1) / 2; k++)
+ {
+ const ATOMIC w_real = GSL_REAL(twiddle[k - 1]);
+ const ATOMIC w_imag = GSL_IMAG(twiddle[k - 1]);
+
+ for (k1 = 0; k1 < product_1; k1++)
+ {
+ const size_t from0 = 2 * k1 * q + 2 * k - 1;
+ const size_t from1 = 2 * k1 * q - 2 * k + 2 * q - 1;
+
+ const ATOMIC z0_real = VECTOR(in,istride,from0);
+ const ATOMIC z0_imag = VECTOR(in,istride,from0 + 1);
+
+ const ATOMIC z1_real = VECTOR(in,istride,from1);
+ const ATOMIC z1_imag = VECTOR(in,istride,from1 + 1);
+
+ /* compute x = W(2) z */
+
+ /* x0 = z0 + z1 */
+ const ATOMIC x0_real = z0_real + z1_real;
+ const ATOMIC x0_imag = z0_imag - z1_imag;
+
+ /* x1 = z0 - z1 */
+ const ATOMIC x1_real = z0_real - z1_real;
+ const ATOMIC x1_imag = z0_imag + z1_imag;
+
+ const size_t to0 = k1 * q + 2 * k - 1;
+ const size_t to1 = to0 + m;
+
+ VECTOR(out,ostride,to0) = x0_real;
+ VECTOR(out,ostride,to0 + 1) = x0_imag;
+
+ VECTOR(out,ostride,to1) = w_real * x1_real - w_imag * x1_imag;
+ VECTOR(out,ostride,to1 + 1) = w_imag * x1_real + w_real * x1_imag;
+
+ }
+ }
+
+ if (q % 2 == 1)
+ return;
+
+ for (k1 = 0; k1 < product_1; k1++)
+ {
+ const size_t from0 = 2 * k1 * q + q - 1;
+ const size_t to0 = k1 * q + q - 1;
+ const size_t to1 = to0 + m;
+
+ VECTOR(out,ostride,to0) = 2 * VECTOR(in,istride,from0);
+ VECTOR(out,ostride,to1) = -2 * VECTOR(in,istride,from0 + 1);
+ }
+ return;
+}
diff --git a/gsl-1.9/fft/hc_pass_3.c b/gsl-1.9/fft/hc_pass_3.c
new file mode 100644
index 0000000..1edd5b0
--- /dev/null
+++ b/gsl-1.9/fft/hc_pass_3.c
@@ -0,0 +1,162 @@
+/* fft/hc_pass_3.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+static void
+FUNCTION(fft_halfcomplex,pass_3) (const BASE in[],
+ const size_t istride,
+ BASE out[],
+ const size_t ostride,
+ const size_t product,
+ const size_t n,
+ const TYPE(gsl_complex) twiddle1[],
+ const TYPE(gsl_complex) twiddle2[])
+{
+ size_t i, j, k, k1, jump;
+ size_t factor, q, m, product_1;
+
+ ATOMIC tau = sqrt (3.0) / 2.0;
+
+ i = 0;
+ j = 0;
+
+ factor = 3;
+ m = n / factor;
+ q = n / product;
+ product_1 = product / factor;
+ jump = (factor - 1) * q;
+
+ for (k1 = 0; k1 < product_1; k1++)
+ {
+ const size_t from0 = 3 * k1 * q;
+ const size_t from1 = from0 + 2 * q - 1;
+
+ const ATOMIC z0_real = VECTOR(in,istride,from0);
+ const ATOMIC z1_real = VECTOR(in,istride,from1);
+ const ATOMIC z1_imag = VECTOR(in,istride,from1 + 1);
+
+ const ATOMIC t1_real = 2 * z1_real;
+ const ATOMIC t2_real = z0_real - z1_real;
+ const ATOMIC t3_imag = 2 * tau * z1_imag;
+
+ const size_t to0 = q * k1;
+ const size_t to1 = to0 + m;
+ const size_t to2 = to1 + m;
+
+ VECTOR(out,ostride,to0) = z0_real + t1_real;
+ VECTOR(out,ostride,to1) = t2_real - t3_imag;
+ VECTOR(out,ostride,to2) = t2_real + t3_imag;
+
+ }
+
+ if (q == 1)
+ return;
+
+ for (k = 1; k < (q + 1) / 2; k++)
+ {
+ const ATOMIC w1_real = GSL_REAL(twiddle1[k - 1]);
+ const ATOMIC w1_imag = GSL_IMAG(twiddle1[k - 1]);
+ const ATOMIC w2_real = GSL_REAL(twiddle2[k - 1]);
+ const ATOMIC w2_imag = GSL_IMAG(twiddle2[k - 1]);
+
+ for (k1 = 0; k1 < product_1; k1++)
+ {
+ const size_t from0 = 3 * k1 * q + 2 * k - 1;
+ const size_t from1 = from0 + 2 * q;
+ const size_t from2 = 3 * k1 * q - 2 * k + 2 * q - 1;
+
+ const ATOMIC z0_real = VECTOR(in,istride,from0);
+ const ATOMIC z0_imag = VECTOR(in,istride,from0 + 1);
+
+ const ATOMIC z1_real = VECTOR(in,istride,from1);
+ const ATOMIC z1_imag = VECTOR(in,istride,from1 + 1);
+
+ const ATOMIC z2_real = VECTOR(in,istride,from2);
+ const ATOMIC z2_imag = -VECTOR(in,istride,from2 + 1);
+
+ /* compute x = W(3) z */
+
+ /* t1 = z1 + z2 */
+ const ATOMIC t1_real = z1_real + z2_real;
+ const ATOMIC t1_imag = z1_imag + z2_imag;
+
+ /* t2 = z0 - t1/2 */
+ const ATOMIC t2_real = z0_real - t1_real / 2.0;
+ const ATOMIC t2_imag = z0_imag - t1_imag / 2.0;
+
+ /* t3 = sin(pi/3)*(z1 - z2) */
+ const ATOMIC t3_real = tau * (z1_real - z2_real);
+ const ATOMIC t3_imag = tau * (z1_imag - z2_imag);
+
+ /* x0 = z0 + t1 */
+ const ATOMIC x0_real = z0_real + t1_real;
+ const ATOMIC x0_imag = z0_imag + t1_imag;
+
+ /* x1 = t2 + i t3 */
+ const ATOMIC x1_real = t2_real - t3_imag;
+ const ATOMIC x1_imag = t2_imag + t3_real;
+
+ /* x2 = t2 - i t3 */
+ const ATOMIC x2_real = t2_real + t3_imag;
+ const ATOMIC x2_imag = t2_imag - t3_real;
+
+ const size_t to0 = k1 * q + 2 * k - 1;
+ const size_t to1 = to0 + m;
+ const size_t to2 = to1 + m;
+
+ VECTOR(out,ostride,to0) = x0_real;
+ VECTOR(out,ostride,to0 + 1) = x0_imag;
+
+ VECTOR(out,ostride,to1) = w1_real * x1_real - w1_imag * x1_imag;
+ VECTOR(out,ostride,to1 + 1) = w1_imag * x1_real + w1_real * x1_imag;
+
+ VECTOR(out,ostride,to2) = w2_real * x2_real - w2_imag * x2_imag;
+ VECTOR(out,ostride,to2 + 1) = w2_imag * x2_real + w2_real * x2_imag;
+
+ }
+ }
+
+ if (q % 2 == 1)
+ return;
+
+ for (k1 = 0; k1 < product_1; k1++)
+ {
+ const size_t from0 = 3 * k1 * q + q - 1;
+ const size_t from1 = from0 + 2 * q;
+
+ const ATOMIC z0_real = VECTOR(in,istride,from0);
+ const ATOMIC z0_imag = VECTOR(in,istride,from0 + 1);
+ const ATOMIC z1_real = VECTOR(in,istride,from1);
+
+ const ATOMIC t1_real = z0_real - z1_real;
+ const ATOMIC t2_real = 2 * tau * z0_imag;
+
+ const ATOMIC x0_real = 2 * z0_real + z1_real;
+ const ATOMIC x1_real = t1_real - t2_real;
+ const ATOMIC x2_real = -t1_real - t2_real;
+
+ const size_t to0 = k1 * q + q - 1;
+ const size_t to1 = to0 + m;
+ const size_t to2 = to1 + m;
+
+ VECTOR(out,ostride,to0) = x0_real;
+ VECTOR(out,ostride,to1) = x1_real;
+ VECTOR(out,ostride,to2) = x2_real;
+ }
+ return;
+}
diff --git a/gsl-1.9/fft/hc_pass_4.c b/gsl-1.9/fft/hc_pass_4.c
new file mode 100644
index 0000000..9f2caeb
--- /dev/null
+++ b/gsl-1.9/fft/hc_pass_4.c
@@ -0,0 +1,189 @@
+/* fft/hc_pass_4.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+static void
+FUNCTION(fft_halfcomplex,pass_4) (const BASE in[],
+ const size_t istride,
+ BASE out[],
+ const size_t ostride,
+ const size_t product,
+ const size_t n,
+ const TYPE(gsl_complex) twiddle1[],
+ const TYPE(gsl_complex) twiddle2[],
+ const TYPE(gsl_complex) twiddle3[])
+{
+ size_t i, j, k, k1, jump;
+ size_t factor, q, m, product_1;
+
+ i = 0;
+ j = 0;
+
+ factor = 4;
+ m = n / factor;
+ q = n / product;
+ product_1 = product / factor;
+ jump = (factor - 1) * q;
+
+ for (k1 = 0; k1 < product_1; k1++)
+ {
+ const size_t from0 = 4 * k1 * q;
+ const size_t from1 = from0 + 2 * q - 1;
+ const size_t from2 = from1 + 2 * q;
+
+ const ATOMIC z0_real = VECTOR(in,istride,from0);
+ const ATOMIC z1_real = VECTOR(in,istride,from1);
+ const ATOMIC z1_imag = VECTOR(in,istride,from1 + 1);
+ const ATOMIC z2_real = VECTOR(in,istride,from2);
+
+ const ATOMIC t1_real = z0_real + z2_real;
+ const ATOMIC t2_real = 2 * z1_real;
+ const ATOMIC t3_real = z0_real - z2_real;
+ const ATOMIC t4_imag = 2 * z1_imag;
+
+ const size_t to0 = q * k1;
+ const size_t to1 = to0 + m;
+ const size_t to2 = to1 + m;
+ const size_t to3 = to2 + m;
+
+ VECTOR(out,ostride,to0) = t1_real + t2_real;
+ VECTOR(out,ostride,to1) = t3_real - t4_imag;
+ VECTOR(out,ostride,to2) = t1_real - t2_real;
+ VECTOR(out,ostride,to3) = t3_real + t4_imag;
+ }
+
+ if (q == 1)
+ return;
+
+ for (k = 1; k < (q + 1) / 2; k++)
+ {
+ const ATOMIC w1_real = GSL_REAL(twiddle1[k - 1]);
+ const ATOMIC w1_imag = GSL_IMAG(twiddle1[k - 1]);
+ const ATOMIC w2_real = GSL_REAL(twiddle2[k - 1]);
+ const ATOMIC w2_imag = GSL_IMAG(twiddle2[k - 1]);
+ const ATOMIC w3_real = GSL_REAL(twiddle3[k - 1]);
+ const ATOMIC w3_imag = GSL_IMAG(twiddle3[k - 1]);
+
+ for (k1 = 0; k1 < product_1; k1++)
+ {
+ const size_t from0 = 4 * k1 * q + 2 * k - 1;
+ const size_t from1 = from0 + 2 * q;
+ const size_t from2 = 4 * k1 * q - 2 * k + 2 * q - 1;
+ const size_t from3 = from2 + 2 * q;
+
+ const ATOMIC z0_real = VECTOR(in,istride,from0);
+ const ATOMIC z0_imag = VECTOR(in,istride,from0 + 1);
+
+ const ATOMIC z1_real = VECTOR(in,istride,from1);
+ const ATOMIC z1_imag = VECTOR(in,istride,from1 + 1);
+
+ const ATOMIC z2_real = VECTOR(in,istride,from3);
+ const ATOMIC z2_imag = -VECTOR(in,istride,from3 + 1);
+
+ const ATOMIC z3_real = VECTOR(in,istride,from2);
+ const ATOMIC z3_imag = -VECTOR(in,istride,from2 + 1);
+
+ /* compute x = W(4) z */
+
+ /* t1 = z0 + z2 */
+ const ATOMIC t1_real = z0_real + z2_real;
+ const ATOMIC t1_imag = z0_imag + z2_imag;
+
+ /* t2 = z1 + z3 */
+ const ATOMIC t2_real = z1_real + z3_real;
+ const ATOMIC t2_imag = z1_imag + z3_imag;
+
+ /* t3 = z0 - z2 */
+ const ATOMIC t3_real = z0_real - z2_real;
+ const ATOMIC t3_imag = z0_imag - z2_imag;
+
+ /* t4 = (z1 - z3) */
+ const ATOMIC t4_real = (z1_real - z3_real);
+ const ATOMIC t4_imag = (z1_imag - z3_imag);
+
+ /* x0 = t1 + t2 */
+ const ATOMIC x0_real = t1_real + t2_real;
+ const ATOMIC x0_imag = t1_imag + t2_imag;
+
+ /* x1 = t3 + i t4 */
+ const ATOMIC x1_real = t3_real - t4_imag;
+ const ATOMIC x1_imag = t3_imag + t4_real;
+
+ /* x2 = t1 - t2 */
+ const ATOMIC x2_real = t1_real - t2_real;
+ const ATOMIC x2_imag = t1_imag - t2_imag;
+
+ /* x3 = t3 - i t4 */
+ const ATOMIC x3_real = t3_real + t4_imag;
+ const ATOMIC x3_imag = t3_imag - t4_real;
+
+ const size_t to0 = k1 * q + 2 * k - 1;
+ const size_t to1 = to0 + m;
+ const size_t to2 = to1 + m;
+ const size_t to3 = to2 + m;
+
+ VECTOR(out,ostride,to0) = x0_real;
+ VECTOR(out,ostride,to0 + 1) = x0_imag;
+
+ VECTOR(out,ostride,to1) = w1_real * x1_real - w1_imag * x1_imag;
+ VECTOR(out,ostride,to1 + 1) = w1_imag * x1_real + w1_real * x1_imag;
+
+ VECTOR(out,ostride,to2) = w2_real * x2_real - w2_imag * x2_imag;
+ VECTOR(out,ostride,to2 + 1) = w2_imag * x2_real + w2_real * x2_imag;
+
+ /* to3 = w3 * x3 */
+ VECTOR(out,ostride,to3) = w3_real * x3_real - w3_imag * x3_imag;
+ VECTOR(out,ostride,to3 + 1) = w3_real * x3_imag + w3_imag * x3_real;
+
+ }
+ }
+
+ if (q % 2 == 1)
+ return;
+
+ for (k1 = 0; k1 < product_1; k1++)
+ {
+ const size_t from0 = 4 * k1 * q + q - 1;
+ const size_t from1 = from0 + 2 * q;
+
+ const ATOMIC z0_real = VECTOR(in,istride,from0);
+ const ATOMIC z0_imag = VECTOR(in,istride,from0 + 1);
+
+ const ATOMIC z1_real = VECTOR(in,istride,from1);
+ const ATOMIC z1_imag = VECTOR(in,istride,from1 + 1);
+
+ const ATOMIC t1_real = sqrt (2.0) * (z0_imag + z1_imag);
+ const ATOMIC t2_real = sqrt (2.0) * (z0_real - z1_real);
+
+ const ATOMIC x0_real = 2 * (z0_real + z1_real);
+ const ATOMIC x1_real = t2_real - t1_real;
+ const ATOMIC x2_real = 2 * (z1_imag - z0_imag);
+ const ATOMIC x3_real = -(t2_real + t1_real);
+
+ const size_t to0 = k1 * q + q - 1;
+ const size_t to1 = to0 + m;
+ const size_t to2 = to1 + m;
+ const size_t to3 = to2 + m;
+
+ VECTOR(out,ostride,to0) = x0_real;
+ VECTOR(out,ostride,to1) = x1_real;
+ VECTOR(out,ostride,to2) = x2_real;
+ VECTOR(out,ostride,to3) = x3_real;
+ }
+ return;
+}
diff --git a/gsl-1.9/fft/hc_pass_5.c b/gsl-1.9/fft/hc_pass_5.c
new file mode 100644
index 0000000..6074eb5
--- /dev/null
+++ b/gsl-1.9/fft/hc_pass_5.c
@@ -0,0 +1,264 @@
+/* fft/hc_pass_5.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+static void
+FUNCTION(fft_halfcomplex,pass_5) (const BASE in[],
+ const size_t istride,
+ BASE out[],
+ const size_t ostride,
+ const size_t product,
+ const size_t n,
+ const TYPE(gsl_complex) twiddle1[],
+ const TYPE(gsl_complex) twiddle2[],
+ const TYPE(gsl_complex) twiddle3[],
+ const TYPE(gsl_complex) twiddle4[])
+{
+
+ size_t i, j, k, k1, jump;
+ size_t factor, q, m, product_1;
+
+ const ATOMIC sina = sin (2.0 * M_PI / 5.0);
+ const ATOMIC sinb = sin (2.0 * M_PI / 10.0);
+
+ i = 0;
+ j = 0;
+
+ factor = 5;
+ m = n / factor;
+ q = n / product;
+ product_1 = product / factor;
+ jump = (factor - 1) * q;
+
+ for (k1 = 0; k1 < product_1; k1++)
+ {
+ const size_t from0 = 5 * k1 * q;
+ const size_t from1 = from0 + 2 * q - 1;
+ const size_t from2 = from1 + 2 * q;
+
+ const ATOMIC z0_real = VECTOR(in,istride,from0);
+ const ATOMIC z1_real = VECTOR(in,istride,from1);
+ const ATOMIC z1_imag = VECTOR(in,istride,from1 + 1);
+ const ATOMIC z2_real = VECTOR(in,istride,from2);
+ const ATOMIC z2_imag = VECTOR(in,istride,from2 + 1);
+
+ const ATOMIC t1_real = 2 * (z1_real + z2_real);
+ const ATOMIC t2_real = 2 * (sqrt (5.0) / 4.0) * (z1_real - z2_real);
+ const ATOMIC t3_real = z0_real - t1_real / 4.0;
+ const ATOMIC t4_real = t2_real + t3_real;
+ const ATOMIC t5_real = -t2_real + t3_real;
+ const ATOMIC t6_imag = 2 * (sina * z1_imag + sinb * z2_imag);
+ const ATOMIC t7_imag = 2 * (sinb * z1_imag - sina * z2_imag);
+
+ const ATOMIC x0_real = z0_real + t1_real;
+ const ATOMIC x1_real = t4_real - t6_imag;
+ const ATOMIC x2_real = t5_real - t7_imag;
+ const ATOMIC x3_real = t5_real + t7_imag;
+ const ATOMIC x4_real = t4_real + t6_imag;
+
+ const size_t to0 = q * k1;
+ const size_t to1 = to0 + m;
+ const size_t to2 = to1 + m;
+ const size_t to3 = to2 + m;
+ const size_t to4 = to3 + m;
+
+ VECTOR(out,ostride,to0) = x0_real;
+ VECTOR(out,ostride,to1) = x1_real;
+ VECTOR(out,ostride,to2) = x2_real;
+ VECTOR(out,ostride,to3) = x3_real;
+ VECTOR(out,ostride,to4) = x4_real;
+ }
+
+ if (q == 1)
+ return;
+
+ for (k = 1; k < (q + 1) / 2; k++)
+ {
+ const ATOMIC w1_real = GSL_REAL(twiddle1[k - 1]);
+ const ATOMIC w1_imag = GSL_IMAG(twiddle1[k - 1]);
+ const ATOMIC w2_real = GSL_REAL(twiddle2[k - 1]);
+ const ATOMIC w2_imag = GSL_IMAG(twiddle2[k - 1]);
+ const ATOMIC w3_real = GSL_REAL(twiddle3[k - 1]);
+ const ATOMIC w3_imag = GSL_IMAG(twiddle3[k - 1]);
+ const ATOMIC w4_real = GSL_REAL(twiddle4[k - 1]);
+ const ATOMIC w4_imag = GSL_IMAG(twiddle4[k - 1]);
+
+ for (k1 = 0; k1 < product_1; k1++)
+ {
+ const size_t from0 = 5 * k1 * q + 2 * k - 1;
+ const size_t from1 = from0 + 2 * q;
+ const size_t from2 = from1 + 2 * q;
+ const size_t from3 = 5 * k1 * q - 2 * k + 2 * q - 1;
+ const size_t from4 = from3 + 2 * q;
+
+ const ATOMIC z0_real = VECTOR(in,istride,from0);
+ const ATOMIC z0_imag = VECTOR(in,istride,from0 + 1);
+
+ const ATOMIC z1_real = VECTOR(in,istride,from1);
+ const ATOMIC z1_imag = VECTOR(in,istride,from1 + 1);
+
+ const ATOMIC z2_real = VECTOR(in,istride,from2);
+ const ATOMIC z2_imag = VECTOR(in,istride,from2 + 1);
+
+ const ATOMIC z3_real = VECTOR(in,istride,from4);
+ const ATOMIC z3_imag = -VECTOR(in,istride,from4 + 1);
+
+ const ATOMIC z4_real = VECTOR(in,istride,from3);
+ const ATOMIC z4_imag = -VECTOR(in,istride,from3 + 1);
+
+ /* compute x = W(5) z */
+
+ /* t1 = z1 + z4 */
+ const ATOMIC t1_real = z1_real + z4_real;
+ const ATOMIC t1_imag = z1_imag + z4_imag;
+
+ /* t2 = z2 + z3 */
+ const ATOMIC t2_real = z2_real + z3_real;
+ const ATOMIC t2_imag = z2_imag + z3_imag;
+
+ /* t3 = z1 - z4 */
+ const ATOMIC t3_real = z1_real - z4_real;
+ const ATOMIC t3_imag = z1_imag - z4_imag;
+
+ /* t4 = z2 - z3 */
+ const ATOMIC t4_real = z2_real - z3_real;
+ const ATOMIC t4_imag = z2_imag - z3_imag;
+
+ /* t5 = t1 + t2 */
+ const ATOMIC t5_real = t1_real + t2_real;
+ const ATOMIC t5_imag = t1_imag + t2_imag;
+
+ /* t6 = (sqrt(5)/4)(t1 - t2) */
+ const ATOMIC t6_real = (sqrt (5.0) / 4.0) * (t1_real - t2_real);
+ const ATOMIC t6_imag = (sqrt (5.0) / 4.0) * (t1_imag - t2_imag);
+
+ /* t7 = z0 - ((t5)/4) */
+ const ATOMIC t7_real = z0_real - t5_real / 4.0;
+ const ATOMIC t7_imag = z0_imag - t5_imag / 4.0;
+
+ /* t8 = t7 + t6 */
+ const ATOMIC t8_real = t7_real + t6_real;
+ const ATOMIC t8_imag = t7_imag + t6_imag;
+
+ /* t9 = t7 - t6 */
+ const ATOMIC t9_real = t7_real - t6_real;
+ const ATOMIC t9_imag = t7_imag - t6_imag;
+
+ /* t10 = sin(2 pi/5) t3 + sin(2 pi/10) t4 */
+ const ATOMIC t10_real = sina * t3_real + sinb * t4_real;
+ const ATOMIC t10_imag = sina * t3_imag + sinb * t4_imag;
+
+ /* t11 = sin(2 pi/10) t3 - sin(2 pi/5) t4 */
+ const ATOMIC t11_real = sinb * t3_real - sina * t4_real;
+ const ATOMIC t11_imag = sinb * t3_imag - sina * t4_imag;
+
+ /* x0 = z0 + t5 */
+ const ATOMIC x0_real = z0_real + t5_real;
+ const ATOMIC x0_imag = z0_imag + t5_imag;
+
+ /* x1 = t8 + i t10 */
+ const ATOMIC x1_real = t8_real - t10_imag;
+ const ATOMIC x1_imag = t8_imag + t10_real;
+
+ /* x2 = t9 + i t11 */
+ const ATOMIC x2_real = t9_real - t11_imag;
+ const ATOMIC x2_imag = t9_imag + t11_real;
+
+ /* x3 = t9 - i t11 */
+ const ATOMIC x3_real = t9_real + t11_imag;
+ const ATOMIC x3_imag = t9_imag - t11_real;
+
+ /* x4 = t8 - i t10 */
+ const ATOMIC x4_real = t8_real + t10_imag;
+ const ATOMIC x4_imag = t8_imag - t10_real;
+
+ const size_t to0 = k1 * q + 2 * k - 1;
+ const size_t to1 = to0 + m;
+ const size_t to2 = to1 + m;
+ const size_t to3 = to2 + m;
+ const size_t to4 = to3 + m;
+
+ /* apply twiddle factors */
+
+ /* to0 = 1 * x0 */
+ VECTOR(out,ostride,to0) = x0_real;
+ VECTOR(out,ostride,to0 + 1) = x0_imag;
+
+ /* to1 = w1 * x1 */
+ VECTOR(out,ostride,to1) = w1_real * x1_real - w1_imag * x1_imag;
+ VECTOR(out,ostride,to1 + 1) = w1_real * x1_imag + w1_imag * x1_real;
+
+ /* to2 = w2 * x2 */
+ VECTOR(out,ostride,to2) = w2_real * x2_real - w2_imag * x2_imag;
+ VECTOR(out,ostride,to2 + 1) = w2_real * x2_imag + w2_imag * x2_real;
+
+ /* to3 = w3 * x3 */
+ VECTOR(out,ostride,to3) = w3_real * x3_real - w3_imag * x3_imag;
+ VECTOR(out,ostride,to3 + 1) = w3_real * x3_imag + w3_imag * x3_real;
+
+ /* to4 = w4 * x4 */
+ VECTOR(out,ostride,to4) = w4_real * x4_real - w4_imag * x4_imag;
+ VECTOR(out,ostride,to4 + 1) = w4_real * x4_imag + w4_imag * x4_real;
+ }
+ }
+
+ if (q % 2 == 1)
+ return;
+
+ for (k1 = 0; k1 < product_1; k1++)
+ {
+ const size_t from0 = 5 * k1 * q + q - 1;
+ const size_t from1 = from0 + 2 * q;
+ const size_t from2 = from1 + 2 * q;
+
+ const ATOMIC z0_real = 2 * VECTOR(in,istride,from0);
+ const ATOMIC z0_imag = 2 * VECTOR(in,istride,from0 + 1);
+
+ const ATOMIC z1_real = 2 * VECTOR(in,istride,from1);
+ const ATOMIC z1_imag = 2 * VECTOR(in,istride,from1 + 1);
+
+ const ATOMIC z2_real = VECTOR(in,istride,from2);
+
+ const ATOMIC t1_real = z0_real + z1_real;
+ const ATOMIC t2_real = (t1_real / 4.0) - z2_real;
+ const ATOMIC t3_real = (sqrt (5.0) / 4.0) * (z0_real - z1_real);
+ const ATOMIC t4_real = sinb * z0_imag + sina * z1_imag;
+ const ATOMIC t5_real = sina * z0_imag - sinb * z1_imag;
+ const ATOMIC t6_real = t3_real + t2_real;
+ const ATOMIC t7_real = t3_real - t2_real;
+
+ const ATOMIC x0_real = t1_real + z2_real;
+ const ATOMIC x1_real = t6_real - t4_real;
+ const ATOMIC x2_real = t7_real - t5_real;
+ const ATOMIC x3_real = -t7_real - t5_real;
+ const ATOMIC x4_real = -t6_real - t4_real;
+
+ const size_t to0 = k1 * q + q - 1;
+ const size_t to1 = to0 + m;
+ const size_t to2 = to1 + m;
+ const size_t to3 = to2 + m;
+ const size_t to4 = to3 + m;
+
+ VECTOR(out,ostride,to0) = x0_real;
+ VECTOR(out,ostride,to1) = x1_real;
+ VECTOR(out,ostride,to2) = x2_real;
+ VECTOR(out,ostride,to3) = x3_real;
+ VECTOR(out,ostride,to4) = x4_real;
+ }
+ return;
+}
diff --git a/gsl-1.9/fft/hc_pass_n.c b/gsl-1.9/fft/hc_pass_n.c
new file mode 100644
index 0000000..0572744
--- /dev/null
+++ b/gsl-1.9/fft/hc_pass_n.c
@@ -0,0 +1,257 @@
+/* fft/hc_pass_n.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+static void
+FUNCTION(fft_halfcomplex,pass_n) (const BASE in[],
+ const size_t istride,
+ BASE out[],
+ const size_t ostride,
+ const size_t factor,
+ const size_t product,
+ const size_t n,
+ const TYPE(gsl_complex) twiddle[])
+{
+
+ size_t k, k1;
+
+ const size_t m = n / factor;
+ const size_t q = n / product;
+ const size_t product_1 = product / factor;
+
+ size_t e1, e2;
+
+ const double d_theta = 2.0 * M_PI / ((double) factor);
+ const ATOMIC cos_d_theta = cos (d_theta);
+ const ATOMIC sin_d_theta = sin (d_theta);
+
+ for (k1 = 0; k1 < product_1; k1++)
+ {
+ /* compute z = W(factor) x, for x halfcomplex */
+
+ ATOMIC dw_real = 1.0, dw_imag = 0.0;
+
+ for (e1 = 0; e1 < factor; e1++)
+ {
+ ATOMIC sum_real = 0.0;
+ ATOMIC w_real = 1.0, w_imag = 0.0;
+
+ if (e1 > 0)
+ {
+ ATOMIC tmp_real = dw_real * cos_d_theta - dw_imag * sin_d_theta;
+ ATOMIC tmp_imag = dw_real * sin_d_theta + dw_imag * cos_d_theta;
+ dw_real = tmp_real;
+ dw_imag = tmp_imag;
+ }
+
+ for (e2 = 0; e2 <= factor - e2; e2++)
+ {
+ ATOMIC z_real, z_imag;
+
+ if (e2 > 0)
+ {
+ ATOMIC tmp_real = dw_real * w_real - dw_imag * w_imag;
+ ATOMIC tmp_imag = dw_real * w_imag + dw_imag * w_real;
+ w_real = tmp_real;
+ w_imag = tmp_imag;
+ }
+
+ if (e2 == 0)
+ {
+ size_t from_idx = factor * k1 * q;
+ z_real = VECTOR(in,istride,from_idx);
+ z_imag = 0.0;
+ sum_real += w_real * z_real - w_imag * z_imag;
+ }
+ else if (e2 == factor - e2)
+ {
+ size_t from_idx = factor * q * k1 + 2 * e2 * q - 1;
+ z_real = VECTOR(in,istride,from_idx);
+ z_imag = 0.0;
+ sum_real += w_real * z_real;
+ }
+ else
+ {
+ size_t from_idx = factor * q * k1 + 2 * e2 * q - 1;
+ z_real = VECTOR(in,istride,from_idx);
+ z_imag = VECTOR(in,istride,from_idx + 1);
+ sum_real += 2 * (w_real * z_real - w_imag * z_imag);
+ }
+
+ }
+
+ {
+ const size_t to_idx = q * k1 + e1 * m;
+ VECTOR(out,ostride,to_idx) = sum_real;
+ }
+ }
+ }
+
+ if (q == 1)
+ return;
+
+ for (k = 1; k < (q + 1) / 2; k++)
+ {
+ for (k1 = 0; k1 < product_1; k1++)
+ {
+
+ ATOMIC dw_real = 1.0, dw_imag = 0.0;
+
+ for (e1 = 0; e1 < factor; e1++)
+ {
+ ATOMIC z_real, z_imag;
+ ATOMIC sum_real = 0.0;
+ ATOMIC sum_imag = 0.0;
+ ATOMIC w_real = 1.0, w_imag = 0.0;
+
+ if (e1 > 0)
+ {
+ ATOMIC t_real = dw_real * cos_d_theta - dw_imag * sin_d_theta;
+ ATOMIC t_imag = dw_real * sin_d_theta + dw_imag * cos_d_theta;
+ dw_real = t_real;
+ dw_imag = t_imag;
+ }
+
+ for (e2 = 0; e2 < factor; e2++)
+ {
+
+ if (e2 > 0)
+ {
+ ATOMIC tmp_real = dw_real * w_real - dw_imag * w_imag;
+ ATOMIC tmp_imag = dw_real * w_imag + dw_imag * w_real;
+ w_real = tmp_real;
+ w_imag = tmp_imag;
+ }
+
+ if (e2 < factor - e2)
+ {
+ const size_t from0 = factor * k1 * q + 2 * k + 2 * e2 * q - 1;
+ z_real = VECTOR(in,istride,from0);
+ z_imag = VECTOR(in,istride,from0 + 1);
+ }
+ else
+ {
+ const size_t from0 = factor * k1 * q - 2 * k + 2 * (factor - e2) * q - 1;
+ z_real = VECTOR(in,istride,from0);
+ z_imag = -VECTOR(in,istride,from0 + 1);
+ }
+
+ sum_real += w_real * z_real - w_imag * z_imag;
+ sum_imag += w_real * z_imag + w_imag * z_real;
+ }
+
+ if (k == 0 || e1 == 0)
+ {
+ w_real = 1.0;
+ w_imag = 0.0;
+ }
+ else
+ {
+ size_t tskip = (q + 1) / 2 - 1;
+ w_real = GSL_REAL(twiddle[k - 1 + tskip * (e1 - 1)]);
+ w_imag = GSL_IMAG(twiddle[k - 1 + tskip * (e1 - 1)]);
+ }
+
+ {
+ const size_t to0 = k1 * q + 2 * k + e1 * m - 1;
+ VECTOR(out,ostride,to0) = w_real * sum_real - w_imag * sum_imag;
+ VECTOR(out,ostride,to0 + 1) = w_real * sum_imag + w_imag * sum_real;
+ }
+
+ }
+ }
+ }
+
+
+ if (q % 2 == 1)
+ return;
+
+ {
+ double tw_arg = M_PI / ((double) factor);
+ ATOMIC cos_tw_arg = cos (tw_arg);
+ ATOMIC sin_tw_arg = sin (tw_arg);
+
+ for (k1 = 0; k1 < product_1; k1++)
+ {
+
+ ATOMIC dw_real = 1.0, dw_imag = 0.0;
+ ATOMIC tw_real = 1.0, tw_imag = 0.0;
+
+ for (e1 = 0; e1 < factor; e1++)
+ {
+ ATOMIC w_real, w_imag, z_real, z_imag;
+
+ ATOMIC sum_real = 0.0;
+
+ if (e1 > 0)
+ {
+ ATOMIC tmp_real = tw_real * cos_tw_arg - tw_imag * sin_tw_arg;
+ ATOMIC tmp_imag = tw_real * sin_tw_arg + tw_imag * cos_tw_arg;
+ tw_real = tmp_real;
+ tw_imag = tmp_imag;
+ }
+
+ w_real = tw_real;
+ w_imag = tw_imag;
+
+ if (e1 > 0)
+ {
+ ATOMIC t_real = dw_real * cos_d_theta - dw_imag * sin_d_theta;
+ ATOMIC t_imag = dw_real * sin_d_theta + dw_imag * cos_d_theta;
+ dw_real = t_real;
+ dw_imag = t_imag;
+ }
+
+ for (e2 = 0; e2 <= factor - e2 - 1; e2++)
+ {
+
+ if (e2 > 0)
+ {
+ ATOMIC tmp_real = dw_real * w_real - dw_imag * w_imag;
+ ATOMIC tmp_imag = dw_real * w_imag + dw_imag * w_real;
+ w_real = tmp_real;
+ w_imag = tmp_imag;
+ }
+
+
+ if (e2 == factor - e2 - 1)
+ {
+ const size_t from0 = factor * k1 * q + q + 2 * e2 * q - 1;
+ z_real = VECTOR(in,istride,from0);
+ z_imag = 0.0;
+ sum_real += w_real * z_real - w_imag * z_imag;
+ }
+ else
+ {
+ const size_t from0 = factor * k1 * q + q + 2 * e2 * q - 1;
+ z_real = VECTOR(in,istride,from0);
+ z_imag = VECTOR(in,istride,from0 + 1);
+ sum_real += 2 * (w_real * z_real - w_imag * z_imag);
+ }
+
+ }
+
+ {
+ const size_t to0 = k1 * q + q + e1 * m - 1;
+ VECTOR(out,ostride,to0) = sum_real;
+ }
+ }
+ }
+ }
+ return;
+}
diff --git a/gsl-1.9/fft/hc_radix2.c b/gsl-1.9/fft/hc_radix2.c
new file mode 100644
index 0000000..bc0d540
--- /dev/null
+++ b/gsl-1.9/fft/hc_radix2.c
@@ -0,0 +1,173 @@
+/* fft/hc_radix2.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+int
+FUNCTION(gsl_fft_halfcomplex,radix2_backward) (BASE data[],
+ const size_t stride,
+ const size_t n)
+{
+ int status = FUNCTION(gsl_fft_halfcomplex,radix2_transform) (data, stride, n) ;
+ return status ;
+}
+
+int
+FUNCTION(gsl_fft_halfcomplex,radix2_inverse) (BASE data[],
+ const size_t stride,
+ const size_t n)
+{
+ int status = FUNCTION(gsl_fft_halfcomplex,radix2_transform) (data, stride, n);
+
+ if (status)
+ {
+ return status;
+ }
+
+ /* normalize inverse fft with 1/n */
+
+ {
+ const ATOMIC norm = 1.0 / n;
+ size_t i;
+ for (i = 0; i < n; i++)
+ {
+ data[stride*i] *= norm;
+ }
+ }
+ return status;
+}
+
+int
+FUNCTION(gsl_fft_halfcomplex,radix2_transform) (BASE data[],
+ const size_t stride,
+ const size_t n)
+{
+ int result ;
+ size_t p, p_1, q;
+ size_t i;
+ size_t logn = 0;
+ int status;
+
+ if (n == 1) /* identity operation */
+ {
+ return 0 ;
+ }
+
+ /* make sure that n is a power of 2 */
+
+ result = fft_binary_logn(n) ;
+
+ if (result == -1)
+ {
+ GSL_ERROR ("n is not a power of 2", GSL_EINVAL);
+ }
+ else
+ {
+ logn = result ;
+ }
+
+ /* apply fft recursion */
+
+ p = n; q = 1 ; p_1 = n/2 ;
+
+ for (i = 1; i <= logn; i++)
+ {
+ size_t a, b;
+
+ /* a = 0 */
+
+ for (b = 0; b < q; b++)
+ {
+ const ATOMIC z0 = VECTOR(data,stride,b*p);
+ const ATOMIC z1 = VECTOR(data,stride,b*p + p_1);
+
+ const ATOMIC t0_real = z0 + z1 ;
+ const ATOMIC t1_real = z0 - z1 ;
+
+ VECTOR(data,stride,b*p) = t0_real;
+ VECTOR(data,stride,b*p + p_1) = t1_real ;
+ }
+
+ /* a = 1 ... p_{i-1}/2 - 1 */
+
+ {
+ ATOMIC w_real = 1.0;
+ ATOMIC w_imag = 0.0;
+
+ const ATOMIC theta = 2.0 * M_PI / p;
+
+ const ATOMIC s = sin (theta);
+ const ATOMIC t = sin (theta / 2.0);
+ const ATOMIC s2 = 2.0 * t * t;
+
+ for (a = 1; a < (p_1)/2; a++)
+ {
+ /* trignometric recurrence for w-> exp(i theta) w */
+
+ {
+ const ATOMIC tmp_real = w_real - s * w_imag - s2 * w_real;
+ const ATOMIC tmp_imag = w_imag + s * w_real - s2 * w_imag;
+ w_real = tmp_real;
+ w_imag = tmp_imag;
+ }
+
+ for (b = 0; b < q; b++)
+ {
+ ATOMIC z0_real = VECTOR(data,stride,b*p + a) ;
+ ATOMIC z0_imag = VECTOR(data,stride,b*p + p - a) ;
+ ATOMIC z1_real = VECTOR(data,stride,b*p + p_1 - a) ;
+ ATOMIC z1_imag = -VECTOR(data,stride,b*p + p_1 + a) ;
+
+ /* t0 = z0 + z1 */
+
+ ATOMIC t0_real = z0_real + z1_real;
+ ATOMIC t0_imag = z0_imag + z1_imag;
+
+ /* t1 = (z0 - z1) */
+
+ ATOMIC t1_real = z0_real - z1_real;
+ ATOMIC t1_imag = z0_imag - z1_imag;
+
+ VECTOR(data,stride,b*p + a) = t0_real ;
+ VECTOR(data,stride,b*p + p_1 - a) = t0_imag ;
+
+ VECTOR(data,stride,b*p + p_1 + a) = (w_real * t1_real - w_imag * t1_imag) ;
+ VECTOR(data,stride,b*p + p - a) = (w_real * t1_imag + w_imag * t1_real) ;
+ }
+ }
+ }
+
+ if (p_1 > 1) {
+ for (b = 0; b < q; b++) {
+ VECTOR(data,stride,b*p + p_1/2) *= 2 ;
+ VECTOR(data,stride,b*p + p_1 + p_1/2) *= -2 ;
+ }
+ }
+
+ p_1 = p_1 / 2 ;
+ p = p / 2 ;
+ q = q * 2 ;
+ }
+
+ /* bit reverse the ordering of output data for decimation in
+ frequency algorithm */
+
+ status = FUNCTION(fft_real,bitreverse_order)(data, stride, n, logn) ;
+
+ return 0;
+
+}
diff --git a/gsl-1.9/fft/hc_unpack.c b/gsl-1.9/fft/hc_unpack.c
new file mode 100644
index 0000000..00e37d6
--- /dev/null
+++ b/gsl-1.9/fft/hc_unpack.c
@@ -0,0 +1,90 @@
+/* fft/hc_unpack.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+int
+FUNCTION(gsl_fft_halfcomplex,unpack) (const BASE halfcomplex_coefficient[],
+ BASE complex_coefficient[],
+ const size_t stride, const size_t n)
+{
+ size_t i;
+
+ if (n == 0)
+ {
+ GSL_ERROR ("length n must be positive integer", GSL_EDOM);
+ }
+
+ REAL(complex_coefficient,stride,0) = halfcomplex_coefficient[0];
+ IMAG(complex_coefficient,stride,0) = 0.0;
+
+ for (i = 1; i < n - i; i++)
+ {
+ const ATOMIC hc_real = halfcomplex_coefficient[(2 * i - 1) * stride];
+ const ATOMIC hc_imag = halfcomplex_coefficient[2 * i * stride];
+
+ REAL(complex_coefficient,stride,i) = hc_real;
+ IMAG(complex_coefficient,stride,i) = hc_imag;
+ REAL(complex_coefficient,stride,n - i) = hc_real;
+ IMAG(complex_coefficient,stride,n - i) = -hc_imag;
+ }
+
+ if (i == n - i)
+ {
+ REAL(complex_coefficient,stride,i) = halfcomplex_coefficient[(n - 1) * stride];
+ IMAG(complex_coefficient,stride,i) = 0.0;
+ }
+
+ return 0;
+}
+
+
+int
+FUNCTION(gsl_fft_halfcomplex,radix2_unpack) (const BASE halfcomplex_coefficient[],
+ BASE complex_coefficient[],
+ const size_t stride, const size_t n)
+{
+ size_t i;
+
+ if (n == 0)
+ {
+ GSL_ERROR ("length n must be positive integer", GSL_EDOM);
+ }
+
+ REAL(complex_coefficient,stride,0) = halfcomplex_coefficient[0];
+ IMAG(complex_coefficient,stride,0) = 0.0;
+
+ for (i = 1; i < n - i; i++)
+ {
+ const ATOMIC hc_real = halfcomplex_coefficient[i * stride];
+ const ATOMIC hc_imag = halfcomplex_coefficient[(n - i) * stride];
+
+ REAL(complex_coefficient,stride,i) = hc_real;
+ IMAG(complex_coefficient,stride,i) = hc_imag;
+ REAL(complex_coefficient,stride,n - i) = hc_real;
+ IMAG(complex_coefficient,stride,n - i) = -hc_imag;
+ }
+
+ if (i == n - i)
+ {
+ REAL(complex_coefficient,stride,i) = halfcomplex_coefficient[i * stride];
+ IMAG(complex_coefficient,stride,i) = 0.0;
+ }
+
+ return 0;
+}
+
diff --git a/gsl-1.9/fft/real_init.c b/gsl-1.9/fft/real_init.c
new file mode 100644
index 0000000..75d89e8
--- /dev/null
+++ b/gsl-1.9/fft/real_init.c
@@ -0,0 +1,183 @@
+/* fft/real_init.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+TYPE(gsl_fft_real_wavetable) *
+FUNCTION(gsl_fft_real_wavetable,alloc) (size_t n)
+{
+ int status;
+ size_t i;
+ size_t n_factors;
+ size_t t, product, product_1, q;
+ double d_theta;
+
+ TYPE(gsl_fft_real_wavetable) * wavetable;
+
+ if (n == 0)
+ {
+ GSL_ERROR_VAL ("length n must be positive integer", GSL_EDOM, 0);
+ }
+
+ wavetable = (TYPE(gsl_fft_real_wavetable) *)
+ malloc(sizeof(TYPE(gsl_fft_real_wavetable)));
+
+ if (wavetable == NULL)
+ {
+ GSL_ERROR_VAL ("failed to allocate struct", GSL_ENOMEM, 0);
+ }
+
+ if (n == 1)
+ {
+ wavetable->trig = 0;
+ }
+ else
+ {
+ wavetable->trig = (TYPE(gsl_complex) *)
+ malloc ((n / 2) * sizeof (TYPE(gsl_complex)));
+
+ if (wavetable->trig == NULL)
+ {
+ /* error in constructor, prevent memory leak */
+
+ free(wavetable) ;
+
+ GSL_ERROR_VAL ("failed to allocate trigonometric lookup table",
+ GSL_ENOMEM, 0);
+ }
+ }
+
+ wavetable->n = n;
+
+ status = fft_real_factorize (n, &n_factors, wavetable->factor);
+
+ if (status)
+ {
+ /* error in constructor, prevent memory leak */
+
+ free(wavetable->trig);
+ free(wavetable) ;
+
+ GSL_ERROR_VAL ("factorization failed", GSL_EFACTOR, 0);
+ }
+
+ wavetable->nf = n_factors;
+
+ d_theta = 2.0 * M_PI / ((double) n);
+
+ t = 0;
+ product = 1;
+ for (i = 0; i < wavetable->nf; i++)
+ {
+ size_t j;
+ const size_t factor = wavetable->factor[i];
+ wavetable->twiddle[i] = wavetable->trig + t;
+ product_1 = product; /* product_1 = p_(i-1) */
+ product *= factor;
+ q = n / product;
+
+ for (j = 1; j < factor; j++)
+ {
+ size_t k;
+ size_t m = 0;
+ for (k = 1; k < (product_1 + 1) / 2; k++)
+ {
+ double theta;
+ m = m + j * q;
+ m = m % n;
+ theta = d_theta * m; /* d_theta*j*k*q */
+ GSL_REAL(wavetable->trig[t]) = cos (theta);
+ GSL_IMAG(wavetable->trig[t]) = sin (theta);
+
+ t++;
+ }
+ }
+ }
+
+ if (t > (n / 2))
+ {
+ /* error in constructor, prevent memory leak */
+
+ free(wavetable->trig);
+ free(wavetable) ;
+
+ GSL_ERROR_VAL ("overflowed trigonometric lookup table",
+ GSL_ESANITY, 0);
+ }
+
+ return wavetable;
+}
+
+TYPE(gsl_fft_real_workspace) *
+FUNCTION(gsl_fft_real_workspace,alloc) (size_t n)
+{
+ TYPE(gsl_fft_real_workspace) * workspace;
+
+ if (n == 0)
+ {
+ GSL_ERROR_VAL ("length n must be positive integer", GSL_EDOM, 0);
+ }
+
+ workspace = (TYPE(gsl_fft_real_workspace) *)
+ malloc(sizeof(TYPE(gsl_fft_real_workspace)));
+
+ if (workspace == NULL)
+ {
+ GSL_ERROR_VAL ("failed to allocate struct", GSL_ENOMEM, 0);
+ }
+
+ workspace->n = n;
+
+ workspace->scratch = (BASE *) malloc (n * sizeof (BASE));
+
+ if (workspace->scratch == NULL)
+ {
+ /* error in constructor, prevent memory leak */
+
+ free(workspace) ;
+
+ GSL_ERROR_VAL ("failed to allocate scratch space", GSL_ENOMEM, 0);
+ }
+
+ return workspace;
+}
+
+
+
+void
+FUNCTION(gsl_fft_real_wavetable,free) (TYPE(gsl_fft_real_wavetable) * wavetable)
+{
+
+ /* release trigonometric lookup tables */
+
+ free (wavetable->trig);
+ wavetable->trig = NULL;
+
+ free (wavetable) ;
+}
+
+void
+FUNCTION(gsl_fft_real_workspace,free) (TYPE(gsl_fft_real_workspace) * workspace)
+{
+
+ /* release scratch space */
+
+ free (workspace->scratch);
+ workspace->scratch = NULL;
+
+ free (workspace) ;
+}
diff --git a/gsl-1.9/fft/real_main.c b/gsl-1.9/fft/real_main.c
new file mode 100644
index 0000000..47919a9
--- /dev/null
+++ b/gsl-1.9/fft/real_main.c
@@ -0,0 +1,145 @@
+/* fft/real_main.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <math.h>
+
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_complex.h>
+#include <gsl/gsl_fft_real.h>
+
+#include "real_pass.h"
+
+int
+FUNCTION(gsl_fft_real,transform) (BASE data[], const size_t stride, const size_t n,
+ const TYPE(gsl_fft_real_wavetable) * wavetable,
+ TYPE(gsl_fft_real_workspace) * work)
+{
+ const size_t nf = wavetable->nf;
+
+ size_t i;
+
+ size_t q, product = 1;
+ size_t tskip;
+ size_t product_1;
+
+ BASE *const scratch = work->scratch;
+ TYPE(gsl_complex) *twiddle1, *twiddle2, *twiddle3, *twiddle4;
+
+ size_t state = 0;
+ BASE *in = data;
+ size_t istride = stride ;
+ BASE *out = scratch;
+ size_t ostride = 1 ;
+
+ if (n == 0)
+ {
+ GSL_ERROR ("length n must be positive integer", GSL_EDOM);
+ }
+
+ if (n == 1)
+ { /* FFT of one data point is the identity */
+ return 0;
+ }
+
+ if (n != wavetable->n)
+ {
+ GSL_ERROR ("wavetable does not match length of data", GSL_EINVAL);
+ }
+
+ if (n != work->n)
+ {
+ GSL_ERROR ("workspace does not match length of data", GSL_EINVAL);
+ }
+
+ for (i = 0; i < nf; i++)
+ {
+ const size_t factor = wavetable->factor[i];
+ product_1 = product;
+ product *= factor;
+ q = n / product;
+
+ tskip = (product_1 + 1) / 2 - 1;
+
+ if (state == 0)
+ {
+ in = data;
+ istride = stride;
+ out = scratch;
+ ostride = 1;
+ state = 1;
+ }
+ else
+ {
+ in = scratch;
+ istride = 1;
+ out = data;
+ ostride = stride;
+ state = 0;
+ }
+
+ if (factor == 2)
+ {
+ twiddle1 = wavetable->twiddle[i];
+ FUNCTION(fft_real,pass_2) (in, istride, out, ostride, product, n, twiddle1);
+ }
+ else if (factor == 3)
+ {
+ twiddle1 = wavetable->twiddle[i];
+ twiddle2 = twiddle1 + tskip;
+ FUNCTION(fft_real,pass_3) (in, istride, out, ostride, product, n, twiddle1,
+ twiddle2);
+ }
+ else if (factor == 4)
+ {
+ twiddle1 = wavetable->twiddle[i];
+ twiddle2 = twiddle1 + tskip;
+ twiddle3 = twiddle2 + tskip;
+ FUNCTION(fft_real,pass_4) (in, istride, out, ostride, product, n, twiddle1,
+ twiddle2, twiddle3);
+ }
+ else if (factor == 5)
+ {
+ twiddle1 = wavetable->twiddle[i];
+ twiddle2 = twiddle1 + tskip;
+ twiddle3 = twiddle2 + tskip;
+ twiddle4 = twiddle3 + tskip;
+ FUNCTION(fft_real,pass_5) (in, istride, out, ostride, product, n, twiddle1,
+ twiddle2, twiddle3, twiddle4);
+ }
+ else
+ {
+ twiddle1 = wavetable->twiddle[i];
+ FUNCTION(fft_real,pass_n) (in, istride, out, ostride, factor, product, n,
+ twiddle1);
+ }
+ }
+
+ if (state == 1) /* copy results back from scratch to data */
+ {
+ for (i = 0; i < n; i++)
+ {
+ data[stride*i] = scratch[i] ;
+ }
+ }
+
+ return 0;
+
+}
diff --git a/gsl-1.9/fft/real_pass.h b/gsl-1.9/fft/real_pass.h
new file mode 100644
index 0000000..af795f7
--- /dev/null
+++ b/gsl-1.9/fft/real_pass.h
@@ -0,0 +1,65 @@
+/* fft/real_pass.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+static void FUNCTION(fft_real,pass_2) (const BASE in[],
+ const size_t istride,
+ BASE out[],
+ const size_t ostride,
+ const size_t product,
+ const size_t n,
+ const TYPE(gsl_complex) twiddle[]);
+
+static void FUNCTION(fft_real,pass_3) (const BASE in[],
+ const size_t istride,
+ BASE out[],
+ const size_t ostride,
+ const size_t product,
+ const size_t n,
+ const TYPE(gsl_complex) twiddle1[],
+ const TYPE(gsl_complex) twiddle2[]);
+
+static void FUNCTION(fft_real,pass_4) (const BASE in[],
+ const size_t istride,
+ BASE out[],
+ const size_t ostride,
+ const size_t product,
+ const size_t n,
+ const TYPE(gsl_complex) twiddle1[],
+ const TYPE(gsl_complex) twiddle2[],
+ const TYPE(gsl_complex) twiddle3[]);
+
+static void FUNCTION(fft_real,pass_5) (const BASE in[],
+ const size_t istride,
+ BASE out[],
+ const size_t ostride,
+ const size_t product,
+ const size_t n,
+ const TYPE(gsl_complex) twiddle1[],
+ const TYPE(gsl_complex) twiddle2[],
+ const TYPE(gsl_complex) twiddle3[],
+ const TYPE(gsl_complex) twiddle4[]);
+
+static void FUNCTION(fft_real,pass_n) (const BASE in[],
+ const size_t istride,
+ BASE out[],
+ const size_t ostride,
+ const size_t factor,
+ const size_t product,
+ const size_t n,
+ const TYPE(gsl_complex) twiddle[]);
diff --git a/gsl-1.9/fft/real_pass_2.c b/gsl-1.9/fft/real_pass_2.c
new file mode 100644
index 0000000..b1f5184
--- /dev/null
+++ b/gsl-1.9/fft/real_pass_2.c
@@ -0,0 +1,116 @@
+/* fft/real_pass_2.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+static void
+FUNCTION(fft_real,pass_2) (const BASE in[],
+ const size_t istride,
+ BASE out[],
+ const size_t ostride,
+ const size_t product,
+ const size_t n,
+ const TYPE(gsl_complex) twiddle[])
+{
+ size_t k, k1;
+
+ const size_t factor = 2;
+ const size_t m = n / factor;
+ const size_t q = n / product;
+ const size_t product_1 = product / factor;
+
+ for (k1 = 0; k1 < q; k1++)
+ {
+ const size_t from0 = k1 * product_1;
+ const size_t from1 = from0 + m;
+
+ const ATOMIC r0 = VECTOR(in,istride,from0);
+ const ATOMIC r1 = VECTOR(in,istride,from1);
+
+ const ATOMIC s0 = r0 + r1;
+ const ATOMIC s1 = r0 - r1;
+
+ const size_t to0 = product * k1;
+ const size_t to1 = to0 + product - 1;
+
+ VECTOR(out,ostride,to0) = s0;
+ VECTOR(out,ostride,to1) = s1;
+ }
+
+ if (product_1 == 1)
+ return;
+
+ for (k = 1; k < (product_1 + 1) / 2; k++)
+ {
+
+ /* forward real transform: w -> conjugate(w) */
+ const ATOMIC w_real = GSL_REAL(twiddle[k - 1]);
+ const ATOMIC w_imag = -GSL_IMAG(twiddle[k - 1]);
+
+ for (k1 = 0; k1 < q; k1++)
+ {
+ const size_t from0 = k1 * product_1 + 2 * k - 1;
+ const size_t from1 = from0 + m;
+
+ const ATOMIC f0_real = VECTOR(in,istride,from0);
+ const ATOMIC f0_imag = VECTOR(in,istride,from0 + 1);
+
+ const ATOMIC f1_real = VECTOR(in,istride,from1);
+ const ATOMIC f1_imag = VECTOR(in,istride,from1 + 1);
+
+ const ATOMIC z0_real = f0_real;
+ const ATOMIC z0_imag = f0_imag;
+
+ const ATOMIC z1_real = w_real * f1_real - w_imag * f1_imag;
+ const ATOMIC z1_imag = w_real * f1_imag + w_imag * f1_real;
+
+ /* compute x = W(2) z */
+
+ /* x0 = z0 + z1 */
+ const ATOMIC x0_real = z0_real + z1_real;
+ const ATOMIC x0_imag = z0_imag + z1_imag;
+
+ /* x1 = z0 - z1 */
+ const ATOMIC x1_real = z0_real - z1_real;
+ const ATOMIC x1_imag = z0_imag - z1_imag;
+
+ const size_t to0 = k1 * product + 2 * k - 1;
+ const size_t to1 = k1 * product + product - 2 * k - 1;
+
+ VECTOR(out,ostride,to0) = x0_real;
+ VECTOR(out,ostride,to0 + 1) = x0_imag;
+
+ /* stored in conjugate location */
+ VECTOR(out,ostride,to1) = x1_real;
+ VECTOR(out,ostride,to1 + 1) = -x1_imag;
+ }
+ }
+
+ if (product_1 % 2 == 1)
+ return;
+
+ for (k1 = 0; k1 < q; k1++)
+ {
+ const size_t from0 = k1 * product_1 + product_1 - 1;
+ const size_t from1 = from0 + m;
+ const size_t to0 = k1 * product + product_1 - 1;
+
+ VECTOR(out,ostride,to0) = VECTOR(in,istride,from0);
+ VECTOR(out,ostride,to0 + 1) = -VECTOR(in,istride,from1);
+ }
+ return;
+}
diff --git a/gsl-1.9/fft/real_pass_3.c b/gsl-1.9/fft/real_pass_3.c
new file mode 100644
index 0000000..561a156
--- /dev/null
+++ b/gsl-1.9/fft/real_pass_3.c
@@ -0,0 +1,166 @@
+/* fft/real_pass_3.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+static void
+FUNCTION(fft_real,pass_3) (const BASE in[],
+ const size_t istride,
+ BASE out[],
+ const size_t ostride,
+ const size_t product,
+ const size_t n,
+ const TYPE(gsl_complex) twiddle1[],
+ const TYPE(gsl_complex) twiddle2[])
+{
+ size_t k, k1;
+
+ const size_t factor = 3;
+ const size_t m = n / factor;
+ const size_t q = n / product;
+ const size_t product_1 = product / factor;
+
+ const ATOMIC tau = sqrt (3.0) / 2.0;
+
+ for (k1 = 0; k1 < q; k1++)
+ {
+ const size_t from0 = k1 * product_1;
+ const size_t from1 = from0 + m;
+ const size_t from2 = from1 + m;
+
+ const ATOMIC z0_real = VECTOR(in,istride,from0);
+ const ATOMIC z1_real = VECTOR(in,istride,from1);
+ const ATOMIC z2_real = VECTOR(in,istride,from2);
+
+ const ATOMIC t1 = z1_real + z2_real;
+
+ const ATOMIC x0_real = z0_real + t1;
+ const ATOMIC x1_real = z0_real - t1 / 2.0;
+ const ATOMIC x1_imag = -tau * (z1_real - z2_real);
+
+ const size_t to0 = product * k1;
+ const size_t to1 = to0 + 2 * product_1 - 1;
+
+ VECTOR(out,ostride,to0) = x0_real;
+ VECTOR(out,ostride,to1) = x1_real;
+ VECTOR(out,ostride,to1 + 1) = x1_imag;
+ }
+
+ if (product_1 == 1)
+ return;
+
+ for (k = 1; k < (product_1 + 1) / 2; k++)
+ {
+ const ATOMIC w1_real = GSL_REAL(twiddle1[k - 1]);
+ const ATOMIC w1_imag = -GSL_IMAG(twiddle1[k - 1]);
+ const ATOMIC w2_real = GSL_REAL(twiddle2[k - 1]);
+ const ATOMIC w2_imag = -GSL_IMAG(twiddle2[k - 1]);
+
+ for (k1 = 0; k1 < q; k1++)
+ {
+ const size_t from0 = k1 * product_1 + 2 * k - 1;
+ const size_t from1 = from0 + m;
+ const size_t from2 = from1 + m;
+
+ const ATOMIC f0_real = VECTOR(in,istride,from0);
+ const ATOMIC f0_imag = VECTOR(in,istride,from0 + 1);
+ const ATOMIC f1_real = VECTOR(in,istride,from1);
+ const ATOMIC f1_imag = VECTOR(in,istride,from1 + 1);
+ const ATOMIC f2_real = VECTOR(in,istride,from2);
+ const ATOMIC f2_imag = VECTOR(in,istride,from2 + 1);
+
+ const ATOMIC z0_real = f0_real;
+ const ATOMIC z0_imag = f0_imag;
+ const ATOMIC z1_real = w1_real * f1_real - w1_imag * f1_imag;
+ const ATOMIC z1_imag = w1_real * f1_imag + w1_imag * f1_real;
+ const ATOMIC z2_real = w2_real * f2_real - w2_imag * f2_imag;
+ const ATOMIC z2_imag = w2_real * f2_imag + w2_imag * f2_real;
+
+ /* compute x = W(3) z */
+
+ /* t1 = z1 + z2 */
+ const ATOMIC t1_real = z1_real + z2_real;
+ const ATOMIC t1_imag = z1_imag + z2_imag;
+
+ /* t2 = z0 - t1/2 */
+ const ATOMIC t2_real = z0_real - t1_real / 2;
+ const ATOMIC t2_imag = z0_imag - t1_imag / 2;
+
+ /* t3 = (+/-) sin(pi/3)*(z1 - z2) */
+ const ATOMIC t3_real = -tau * (z1_real - z2_real);
+ const ATOMIC t3_imag = -tau * (z1_imag - z2_imag);
+
+ /* x0 = z0 + t1 */
+ const ATOMIC x0_real = z0_real + t1_real;
+ const ATOMIC x0_imag = z0_imag + t1_imag;
+
+ /* x1 = t2 + i t3 */
+ const ATOMIC x1_real = t2_real - t3_imag;
+ const ATOMIC x1_imag = t2_imag + t3_real;
+
+ /* x2 = t2 - i t3 */
+ const ATOMIC x2_real = t2_real + t3_imag;
+ const ATOMIC x2_imag = t2_imag - t3_real;
+
+ /* apply twiddle factors */
+
+ const size_t to0 = k1 * product + 2 * k - 1;
+ const size_t to1 = to0 + 2 * product_1;
+ const size_t to2 = 2 * product_1 - 2 * k + k1 * product - 1;
+
+ /* to0 = 1 * x0 */
+ VECTOR(out,ostride,to0) = x0_real;
+ VECTOR(out,ostride,to0 + 1) = x0_imag;
+
+ /* to1 = 1 * x1 */
+ VECTOR(out,ostride,to1) = x1_real;
+ VECTOR(out,ostride,to1 + 1) = x1_imag;
+
+ /* to2 = 1 * x2 */
+ VECTOR(out,ostride,to2) = x2_real;
+ VECTOR(out,ostride,to2 + 1) = -x2_imag;
+ }
+ }
+
+ if (product_1 % 2 == 1)
+ return;
+
+ for (k1 = 0; k1 < q; k1++)
+ {
+ const size_t from0 = k1 * product_1 + product_1 - 1;
+ const size_t from1 = from0 + m;
+ const size_t from2 = from1 + m;
+
+ const ATOMIC z0_real = VECTOR(in,istride,from0);
+ const ATOMIC z1_real = VECTOR(in,istride,from1);
+ const ATOMIC z2_real = VECTOR(in,istride,from2);
+
+ const ATOMIC t1 = z1_real - z2_real;
+ const ATOMIC x0_real = z0_real + t1 / 2.0;
+ const ATOMIC x0_imag = -tau * (z1_real + z2_real);
+ const ATOMIC x1_real = z0_real - t1;
+
+ const size_t to0 = k1 * product + product_1 - 1;
+ const size_t to1 = to0 + 2 * product_1;
+
+ VECTOR(out,ostride,to0) = x0_real;
+ VECTOR(out,ostride,to0 + 1) = x0_imag;
+ VECTOR(out,ostride,to1) = x1_real;
+ }
+
+ return;
+}
diff --git a/gsl-1.9/fft/real_pass_4.c b/gsl-1.9/fft/real_pass_4.c
new file mode 100644
index 0000000..576791b
--- /dev/null
+++ b/gsl-1.9/fft/real_pass_4.c
@@ -0,0 +1,203 @@
+/* fft/real_pass_4.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+static void
+FUNCTION(fft_real,pass_4) (const BASE in[],
+ const size_t istride,
+ BASE out[],
+ const size_t ostride,
+ const size_t product,
+ const size_t n,
+ const TYPE(gsl_complex) twiddle1[],
+ const TYPE(gsl_complex) twiddle2[],
+ const TYPE(gsl_complex) twiddle3[])
+{
+ size_t k, k1;
+
+ const size_t factor = 4;
+ const size_t m = n / factor;
+ const size_t q = n / product;
+ const size_t product_1 = product / factor;
+
+ for (k1 = 0; k1 < q; k1++)
+ {
+ const size_t from0 = k1 * product_1;
+ const size_t from1 = from0 + m;
+ const size_t from2 = from1 + m;
+ const size_t from3 = from2 + m;
+
+ const ATOMIC z0_real = VECTOR(in,istride,from0);
+ const ATOMIC z1_real = VECTOR(in,istride,from1);
+ const ATOMIC z2_real = VECTOR(in,istride,from2);
+ const ATOMIC z3_real = VECTOR(in,istride,from3);
+
+ /* compute x = W(4) z */
+
+ /* t1 = z0 + z2 */
+ const ATOMIC t1_real = z0_real + z2_real;
+
+ /* t2 = z1 + z3 */
+ const ATOMIC t2_real = z1_real + z3_real;
+
+ /* t3 = z0 - z2 */
+ const ATOMIC t3_real = z0_real - z2_real;
+
+ /* t4 = - (z1 - z3) */
+ const ATOMIC t4_real = -(z1_real - z3_real);
+
+ /* x0 = t1 + t2 */
+ const ATOMIC x0_real = t1_real + t2_real;
+
+ /* x1 = t3 + i t4 */
+ const ATOMIC x1_real = t3_real;
+ const ATOMIC x1_imag = t4_real;
+
+ /* x2 = t1 - t2 */
+ const ATOMIC x2_real = t1_real - t2_real;
+
+ const size_t to0 = product * k1;
+ const size_t to1 = to0 + 2 * product_1 - 1;
+ const size_t to2 = to1 + 2 * product_1;
+
+ VECTOR(out,ostride,to0) = x0_real;
+ VECTOR(out,ostride,to1) = x1_real;
+ VECTOR(out,ostride,to1 + 1) = x1_imag;
+ VECTOR(out,ostride,to2) = x2_real;
+ }
+
+ if (product_1 == 1)
+ return;
+
+ for (k = 1; k < (product_1 + 1) / 2; k++)
+ {
+ ATOMIC w1_real, w1_imag, w2_real, w2_imag, w3_real, w3_imag;
+ w1_real = GSL_REAL(twiddle1[k - 1]);
+ w1_imag = -GSL_IMAG(twiddle1[k - 1]);
+ w2_real = GSL_REAL(twiddle2[k - 1]);
+ w2_imag = -GSL_IMAG(twiddle2[k - 1]);
+ w3_real = GSL_REAL(twiddle3[k - 1]);
+ w3_imag = -GSL_IMAG(twiddle3[k - 1]);
+
+ for (k1 = 0; k1 < q; k1++)
+ {
+ const size_t from0 = k1 * product_1 + 2 * k - 1;
+ const size_t from1 = from0 + m;
+ const size_t from2 = from1 + m;
+ const size_t from3 = from2 + m;
+
+ const ATOMIC f0_real = VECTOR(in,istride,from0);
+ const ATOMIC f0_imag = VECTOR(in,istride,from0 + 1);
+ const ATOMIC f1_real = VECTOR(in,istride,from1);
+ const ATOMIC f1_imag = VECTOR(in,istride,from1 + 1);
+ const ATOMIC f2_real = VECTOR(in,istride,from2);
+ const ATOMIC f2_imag = VECTOR(in,istride,from2 + 1);
+ const ATOMIC f3_real = VECTOR(in,istride,from3);
+ const ATOMIC f3_imag = VECTOR(in,istride,from3 + 1);
+
+ const ATOMIC z0_real = f0_real;
+ const ATOMIC z0_imag = f0_imag;
+ const ATOMIC z1_real = w1_real * f1_real - w1_imag * f1_imag;
+ const ATOMIC z1_imag = w1_real * f1_imag + w1_imag * f1_real;
+ const ATOMIC z2_real = w2_real * f2_real - w2_imag * f2_imag;
+ const ATOMIC z2_imag = w2_real * f2_imag + w2_imag * f2_real;
+ const ATOMIC z3_real = w3_real * f3_real - w3_imag * f3_imag;
+ const ATOMIC z3_imag = w3_real * f3_imag + w3_imag * f3_real;
+
+ /* compute x = W(4) z */
+
+ /* t1 = z0 + z2 */
+ const ATOMIC t1_real = z0_real + z2_real;
+ const ATOMIC t1_imag = z0_imag + z2_imag;
+
+ /* t2 = z1 + z3 */
+ const ATOMIC t2_real = z1_real + z3_real;
+ const ATOMIC t2_imag = z1_imag + z3_imag;
+
+ /* t3 = z0 - z2 */
+ const ATOMIC t3_real = z0_real - z2_real;
+ const ATOMIC t3_imag = z0_imag - z2_imag;
+
+ /* t4 = - (z1 - z3) */
+ const ATOMIC t4_real = -(z1_real - z3_real);
+ const ATOMIC t4_imag = -(z1_imag - z3_imag);
+
+ /* x0 = t1 + t2 */
+ const ATOMIC x0_real = t1_real + t2_real;
+ const ATOMIC x0_imag = t1_imag + t2_imag;
+
+ /* x1 = t3 + i t4 */
+ const ATOMIC x1_real = t3_real - t4_imag;
+ const ATOMIC x1_imag = t3_imag + t4_real;
+
+ /* x2 = t1 - t2 */
+ const ATOMIC x2_real = t1_real - t2_real;
+ const ATOMIC x2_imag = t1_imag - t2_imag;
+
+ /* x3 = t3 - i t4 */
+ const ATOMIC x3_real = t3_real + t4_imag;
+ const ATOMIC x3_imag = t3_imag - t4_real;
+
+ const size_t to0 = k1 * product + 2 * k - 1;
+ const size_t to1 = to0 + 2 * product_1;
+ const size_t to2 = 2 * product_1 - 2 * k + k1 * product - 1;
+ const size_t to3 = to2 + 2 * product_1;
+
+ VECTOR(out,ostride,to0) = x0_real;
+ VECTOR(out,ostride,to0 + 1) = x0_imag;
+
+ VECTOR(out,ostride,to1) = x1_real;
+ VECTOR(out,ostride,to1 + 1) = x1_imag;
+
+ VECTOR(out,ostride,to3) = x2_real;
+ VECTOR(out,ostride,to3 + 1) = -x2_imag;
+
+ VECTOR(out,ostride,to2) = x3_real;
+ VECTOR(out,ostride,to2 + 1) = -x3_imag;
+ }
+ }
+
+ if (product_1 % 2 == 1)
+ return;
+
+ for (k1 = 0; k1 < q; k1++)
+ {
+ const size_t from0 = k1 * product_1 + product_1 - 1;
+ const size_t from1 = from0 + m;
+ const size_t from2 = from1 + m;
+ const size_t from3 = from2 + m;
+
+ const ATOMIC x0 = VECTOR(in,istride,from0);
+ const ATOMIC x1 = VECTOR(in,istride,from1);
+ const ATOMIC x2 = VECTOR(in,istride,from2);
+ const ATOMIC x3 = VECTOR(in,istride,from3);
+
+ const ATOMIC t1 = (1.0 / sqrt (2.0)) * (x1 - x3);
+ const ATOMIC t2 = (1.0 / sqrt (2.0)) * (x1 + x3);
+
+ const size_t to0 = k1 * product + 2 * k - 1;
+ const size_t to1 = to0 + 2 * product_1;
+
+ VECTOR(out,ostride,to0) = x0 + t1;
+ VECTOR(out,ostride,to0 + 1) = -x2 - t2;
+
+ VECTOR(out,ostride,to1) = x0 - t1;
+ VECTOR(out,ostride,to1 + 1) = x2 - t2;
+ }
+ return;
+}
diff --git a/gsl-1.9/fft/real_pass_5.c b/gsl-1.9/fft/real_pass_5.c
new file mode 100644
index 0000000..3b3b4a7
--- /dev/null
+++ b/gsl-1.9/fft/real_pass_5.c
@@ -0,0 +1,283 @@
+/* fft/real_pass_5.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+static void
+FUNCTION(fft_real,pass_5) (const BASE in[],
+ const size_t istride,
+ BASE out[],
+ const size_t ostride,
+ const size_t product,
+ const size_t n,
+ const TYPE(gsl_complex) twiddle1[],
+ const TYPE(gsl_complex) twiddle2[],
+ const TYPE(gsl_complex) twiddle3[],
+ const TYPE(gsl_complex) twiddle4[])
+{
+ size_t k, k1;
+
+ const size_t factor = 5;
+ const size_t m = n / factor;
+ const size_t q = n / product;
+ const size_t product_1 = product / factor;
+
+ const ATOMIC sina = sin (2.0 * M_PI / 5.0);
+ const ATOMIC sinb = sin (2.0 * M_PI / 10.0);
+
+ for (k1 = 0; k1 < q; k1++)
+ {
+ const size_t from0 = k1 * product_1;
+ const size_t from1 = from0 + m;
+ const size_t from2 = from1 + m;
+ const size_t from3 = from2 + m;
+ const size_t from4 = from3 + m;
+
+ const ATOMIC z0_real = VECTOR(in,istride,from0);
+ const ATOMIC z1_real = VECTOR(in,istride,from1);
+ const ATOMIC z2_real = VECTOR(in,istride,from2);
+ const ATOMIC z3_real = VECTOR(in,istride,from3);
+ const ATOMIC z4_real = VECTOR(in,istride,from4);
+
+ /* t1 = z1 + z4 */
+ const ATOMIC t1_real = z1_real + z4_real;
+
+ /* t2 = z2 + z3 */
+ const ATOMIC t2_real = z2_real + z3_real;
+
+ /* t3 = z1 - z4 */
+ const ATOMIC t3_real = z1_real - z4_real;
+
+ /* t4 = z2 - z3 */
+ const ATOMIC t4_real = z2_real - z3_real;
+
+ /* t5 = t1 + t2 */
+ const ATOMIC t5_real = t1_real + t2_real;
+
+ /* t6 = (sqrt(5)/4)(t1 - t2) */
+ const ATOMIC t6_real = (sqrt (5.0) / 4.0) * (t1_real - t2_real);
+
+ /* t7 = z0 - ((t5)/4) */
+ const ATOMIC t7_real = z0_real - t5_real / 4.0;
+
+ /* t8 = t7 + t6 */
+ const ATOMIC t8_real = t7_real + t6_real;
+
+ /* t9 = t7 - t6 */
+ const ATOMIC t9_real = t7_real - t6_real;
+
+ /* t10 = -(sin(2 pi/5) t3 + sin(2 pi/10) t4 ) */
+ const ATOMIC t10_real = -sina * t3_real - sinb * t4_real;
+
+ /* t11 = -(sin(2 pi/10) t3 - sin(2 pi/5) t4) */
+ const ATOMIC t11_real = -sinb * t3_real + sina * t4_real;
+
+ /* x0 = z0 + t5 */
+ const ATOMIC x0_real = z0_real + t5_real;
+
+ /* x1 = t8 + i t10 */
+ const ATOMIC x1_real = t8_real;
+ const ATOMIC x1_imag = t10_real;
+
+ /* x2 = t9 + i t11 */
+ const ATOMIC x2_real = t9_real;
+ const ATOMIC x2_imag = t11_real;
+
+ const size_t to0 = product * k1;
+ const size_t to1 = to0 + 2 * product_1 - 1;
+ const size_t to2 = to1 + 2 * product_1;
+
+ VECTOR(out,ostride,to0) = x0_real;
+ VECTOR(out,ostride,to1) = x1_real;
+ VECTOR(out,ostride,to1 + 1) = x1_imag;
+ VECTOR(out,ostride,to2) = x2_real;
+ VECTOR(out,ostride,to2 + 1) = x2_imag;
+ }
+
+ if (product_1 == 1)
+ return;
+
+ for (k = 1; k < (product_1 + 1) / 2; k++)
+ {
+ const ATOMIC w1_real = GSL_REAL(twiddle1[k - 1]);
+ const ATOMIC w1_imag = -GSL_IMAG(twiddle1[k - 1]);
+ const ATOMIC w2_real = GSL_REAL(twiddle2[k - 1]);
+ const ATOMIC w2_imag = -GSL_IMAG(twiddle2[k - 1]);
+ const ATOMIC w3_real = GSL_REAL(twiddle3[k - 1]);
+ const ATOMIC w3_imag = -GSL_IMAG(twiddle3[k - 1]);
+ const ATOMIC w4_real = GSL_REAL(twiddle4[k - 1]);
+ const ATOMIC w4_imag = -GSL_IMAG(twiddle4[k - 1]);
+
+ for (k1 = 0; k1 < q; k1++)
+ {
+ const size_t from0 = k1 * product_1 + 2 * k - 1;
+ const size_t from1 = from0 + m;
+ const size_t from2 = from1 + m;
+ const size_t from3 = from2 + m;
+ const size_t from4 = from3 + m;
+
+ const ATOMIC f0_real = VECTOR(in,istride,from0);
+ const ATOMIC f0_imag = VECTOR(in,istride,from0 + 1);
+ const ATOMIC f1_real = VECTOR(in,istride,from1);
+ const ATOMIC f1_imag = VECTOR(in,istride,from1 + 1);
+ const ATOMIC f2_real = VECTOR(in,istride,from2);
+ const ATOMIC f2_imag = VECTOR(in,istride,from2 + 1);
+ const ATOMIC f3_real = VECTOR(in,istride,from3);
+ const ATOMIC f3_imag = VECTOR(in,istride,from3 + 1);
+ const ATOMIC f4_real = VECTOR(in,istride,from4);
+ const ATOMIC f4_imag = VECTOR(in,istride,from4 + 1);
+
+ const ATOMIC z0_real = f0_real;
+ const ATOMIC z0_imag = f0_imag;
+ const ATOMIC z1_real = w1_real * f1_real - w1_imag * f1_imag;
+ const ATOMIC z1_imag = w1_real * f1_imag + w1_imag * f1_real;
+ const ATOMIC z2_real = w2_real * f2_real - w2_imag * f2_imag;
+ const ATOMIC z2_imag = w2_real * f2_imag + w2_imag * f2_real;
+ const ATOMIC z3_real = w3_real * f3_real - w3_imag * f3_imag;
+ const ATOMIC z3_imag = w3_real * f3_imag + w3_imag * f3_real;
+ const ATOMIC z4_real = w4_real * f4_real - w4_imag * f4_imag;
+ const ATOMIC z4_imag = w4_real * f4_imag + w4_imag * f4_real;
+
+ /* compute x = W(5) z */
+
+ /* t1 = z1 + z4 */
+ const ATOMIC t1_real = z1_real + z4_real;
+ const ATOMIC t1_imag = z1_imag + z4_imag;
+
+ /* t2 = z2 + z3 */
+ const ATOMIC t2_real = z2_real + z3_real;
+ const ATOMIC t2_imag = z2_imag + z3_imag;
+
+ /* t3 = z1 - z4 */
+ const ATOMIC t3_real = z1_real - z4_real;
+ const ATOMIC t3_imag = z1_imag - z4_imag;
+
+ /* t4 = z2 - z3 */
+ const ATOMIC t4_real = z2_real - z3_real;
+ const ATOMIC t4_imag = z2_imag - z3_imag;
+
+ /* t5 = t1 + t2 */
+ const ATOMIC t5_real = t1_real + t2_real;
+ const ATOMIC t5_imag = t1_imag + t2_imag;
+
+ /* t6 = (sqrt(5)/4)(t1 - t2) */
+ const ATOMIC t6_real = (sqrt (5.0) / 4.0) * (t1_real - t2_real);
+ const ATOMIC t6_imag = (sqrt (5.0) / 4.0) * (t1_imag - t2_imag);
+
+ /* t7 = z0 - ((t5)/4) */
+ const ATOMIC t7_real = z0_real - t5_real / 4.0;
+ const ATOMIC t7_imag = z0_imag - t5_imag / 4.0;
+
+ /* t8 = t7 + t6 */
+ const ATOMIC t8_real = t7_real + t6_real;
+ const ATOMIC t8_imag = t7_imag + t6_imag;
+
+ /* t9 = t7 - t6 */
+ const ATOMIC t9_real = t7_real - t6_real;
+ const ATOMIC t9_imag = t7_imag - t6_imag;
+
+ /* t10 = - (sin(2 pi/5) t3 + sin(2 pi/10) t4) */
+ const ATOMIC t10_real = -sina * t3_real - sinb * t4_real;
+ const ATOMIC t10_imag = -sina * t3_imag - sinb * t4_imag;
+
+ /* t11 = -(sin(2 pi/10) t3 - sin(2 pi/5) t4) */
+ const ATOMIC t11_real = -sinb * t3_real + sina * t4_real;
+ const ATOMIC t11_imag = -sinb * t3_imag + sina * t4_imag;
+
+ /* x0 = z0 + t5 */
+ const ATOMIC x0_real = z0_real + t5_real;
+ const ATOMIC x0_imag = z0_imag + t5_imag;
+
+ /* x1 = t8 + i t10 */
+ const ATOMIC x1_real = t8_real - t10_imag;
+ const ATOMIC x1_imag = t8_imag + t10_real;
+
+ /* x2 = t9 + i t11 */
+ const ATOMIC x2_real = t9_real - t11_imag;
+ const ATOMIC x2_imag = t9_imag + t11_real;
+
+ /* x3 = t9 - i t11 */
+ const ATOMIC x3_real = t9_real + t11_imag;
+ const ATOMIC x3_imag = t9_imag - t11_real;
+
+ /* x4 = t8 - i t10 */
+ const ATOMIC x4_real = t8_real + t10_imag;
+ const ATOMIC x4_imag = t8_imag - t10_real;
+
+ const size_t to0 = k1 * product + 2 * k - 1;
+ const size_t to1 = to0 + 2 * product_1;
+ const size_t to2 = to1 + 2 * product_1;
+ const size_t to3 = 2 * product_1 - 2 * k + k1 * product - 1;
+ const size_t to4 = to3 + 2 * product_1;
+
+ VECTOR(out,ostride,to0) = x0_real;
+ VECTOR(out,ostride,to0 + 1) = x0_imag;
+
+ VECTOR(out,ostride,to1) = x1_real;
+ VECTOR(out,ostride,to1 + 1) = x1_imag;
+
+ VECTOR(out,ostride,to2) = x2_real;
+ VECTOR(out,ostride,to2 + 1) = x2_imag;
+
+ VECTOR(out,ostride,to3) = x4_real;
+ VECTOR(out,ostride,to3 + 1) = -x4_imag;
+
+ VECTOR(out,ostride,to4) = x3_real;
+ VECTOR(out,ostride,to4 + 1) = -x3_imag;
+ }
+ }
+
+ if (product_1 % 2 == 1)
+ return;
+
+ for (k1 = 0; k1 < q; k1++)
+ {
+ const size_t from0 = k1 * product_1 + product_1 - 1;
+ const size_t from1 = from0 + m;
+ const size_t from2 = from1 + m;
+ const size_t from3 = from2 + m;
+ const size_t from4 = from3 + m;
+
+ const ATOMIC z0_real = VECTOR(in,istride,from0);
+ const ATOMIC z1_real = VECTOR(in,istride,from1);
+ const ATOMIC z2_real = VECTOR(in,istride,from2);
+ const ATOMIC z3_real = VECTOR(in,istride,from3);
+ const ATOMIC z4_real = VECTOR(in,istride,from4);
+
+ const ATOMIC t1 = z1_real - z4_real;
+ const ATOMIC t2 = z1_real + z4_real;
+ const ATOMIC t3 = z2_real - z3_real;
+ const ATOMIC t4 = z2_real + z3_real;
+ const ATOMIC t5 = t1 - t3;
+ const ATOMIC t6 = z0_real + t5 / 4.0;
+ const ATOMIC t7 = (sqrt (5.0) / 4.0) * (t1 + t3);
+
+ const size_t to0 = k1 * product + product_1 - 1;
+ const size_t to1 = to0 + 2 * product_1;
+ const size_t to2 = to1 + 2 * product_1;
+
+ VECTOR(out,ostride,to0) = t6 + t7;
+ VECTOR(out,ostride,to0 + 1) = -sinb * t2 - sina * t4;
+
+ VECTOR(out,ostride,to1) = t6 - t7;
+ VECTOR(out,ostride,to1 + 1) = -sina * t2 + sinb * t4;
+
+ VECTOR(out,ostride,to2) = z0_real - t5;
+ }
+
+ return;
+}
diff --git a/gsl-1.9/fft/real_pass_n.c b/gsl-1.9/fft/real_pass_n.c
new file mode 100644
index 0000000..984728c
--- /dev/null
+++ b/gsl-1.9/fft/real_pass_n.c
@@ -0,0 +1,264 @@
+/* fft/real_pass_n.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+static void
+FUNCTION(fft_real,pass_n) (const BASE in[],
+ const size_t istride,
+ BASE out[],
+ const size_t ostride,
+ const size_t factor,
+ const size_t product,
+ const size_t n,
+ const TYPE(gsl_complex) twiddle[])
+{
+ size_t k, k1;
+
+ const size_t m = n / factor;
+ const size_t q = n / product;
+ const size_t product_1 = product / factor;
+
+ size_t e1, e2;
+
+ const double d_theta = 2.0 * M_PI / ((double) factor);
+ const ATOMIC cos_d_theta = cos (d_theta);
+ const ATOMIC sin_d_theta = sin (d_theta);
+
+ for (k1 = 0; k1 < q; k1++)
+ {
+ /* compute x = W(factor) z, for z real */
+
+ ATOMIC dw_real = 1.0, dw_imag = 0.0;
+
+ for (e1 = 0; e1 <= factor - e1; e1++)
+ {
+ ATOMIC sum_real = 0.0;
+ ATOMIC sum_imag = 0.0;
+
+ ATOMIC w_real = 1.0, w_imag = 0.0;
+
+ if (e1 > 0)
+ {
+ ATOMIC tmp_real = dw_real * cos_d_theta + dw_imag * sin_d_theta;
+ ATOMIC tmp_imag = -dw_real * sin_d_theta + dw_imag * cos_d_theta;
+ dw_real = tmp_real;
+ dw_imag = tmp_imag;
+ }
+
+ for (e2 = 0; e2 < factor; e2++)
+ {
+ ATOMIC z_real = VECTOR(in,istride,k1 * product_1 + e2 * m);
+
+ if (e2 > 0)
+ {
+ ATOMIC tmp_real = dw_real * w_real - dw_imag * w_imag;
+ ATOMIC tmp_imag = dw_real * w_imag + dw_imag * w_real;
+ w_real = tmp_real;
+ w_imag = tmp_imag;
+ }
+
+ sum_real += w_real * z_real;
+ sum_imag += w_imag * z_real;
+
+ }
+ if (e1 == 0)
+ {
+ const size_t to0 = product * k1;
+ VECTOR(out,ostride,to0) = sum_real;
+ }
+ else if (e1 < factor - e1)
+ {
+ const size_t to0 = k1 * product + 2 * e1 * product_1 - 1;
+ VECTOR(out,ostride,to0) = sum_real;
+ VECTOR(out,ostride,to0 + 1) = sum_imag;
+ }
+ else if (e1 == factor - e1)
+ {
+ const size_t to0 = k1 * product + 2 * e1 * product_1 - 1;
+ VECTOR(out,ostride,to0) = sum_real;
+ }
+
+ }
+ }
+
+ if (product_1 == 1)
+ return;
+
+ for (k = 1; k < (product_1 + 1) / 2; k++)
+ {
+ for (k1 = 0; k1 < q; k1++)
+ {
+
+ ATOMIC dw_real = 1.0, dw_imag = 0.0;
+
+ for (e1 = 0; e1 < factor; e1++)
+ {
+ ATOMIC sum_real = 0.0, sum_imag = 0.0;
+
+ ATOMIC w_real = 1.0, w_imag = 0.0;
+
+ if (e1 > 0)
+ {
+ const ATOMIC tmp_real = dw_real * cos_d_theta + dw_imag * sin_d_theta;
+ const ATOMIC tmp_imag = -dw_real * sin_d_theta + dw_imag * cos_d_theta;
+ dw_real = tmp_real;
+ dw_imag = tmp_imag;
+ }
+
+ for (e2 = 0; e2 < factor; e2++)
+ {
+
+ int tskip = (product_1 + 1) / 2 - 1;
+ const size_t from0 = k1 * product_1 + 2 * k + e2 * m - 1;
+ ATOMIC tw_real, tw_imag;
+ ATOMIC z_real, z_imag;
+
+ if (e2 == 0)
+ {
+ tw_real = 1.0;
+ tw_imag = 0.0;
+ }
+ else
+ {
+ const size_t t_index = (k - 1) + (e2 - 1) * tskip;
+ tw_real = GSL_REAL(twiddle[t_index]);
+ tw_imag = -GSL_IMAG(twiddle[t_index]);
+ }
+
+ {
+ const ATOMIC f0_real = VECTOR(in,istride,from0);
+ const ATOMIC f0_imag = VECTOR(in,istride,from0 + 1);
+
+ z_real = tw_real * f0_real - tw_imag * f0_imag;
+ z_imag = tw_real * f0_imag + tw_imag * f0_real;
+ }
+
+ if (e2 > 0)
+ {
+ const ATOMIC tmp_real = dw_real * w_real - dw_imag * w_imag;
+ const ATOMIC tmp_imag = dw_real * w_imag + dw_imag * w_real;
+ w_real = tmp_real;
+ w_imag = tmp_imag;
+ }
+
+ sum_real += w_real * z_real - w_imag * z_imag;
+ sum_imag += w_real * z_imag + w_imag * z_real;
+ }
+
+ if (e1 < factor - e1)
+ {
+ const size_t to0 = k1 * product - 1 + 2 * e1 * product_1 + 2 * k;
+ VECTOR(out,ostride,to0) = sum_real;
+ VECTOR(out,ostride,to0 + 1) = sum_imag;
+ }
+ else
+ {
+ const size_t to0 = k1 * product - 1 + 2 * (factor - e1) * product_1 - 2 * k;
+ VECTOR(out,ostride,to0) = sum_real;
+ VECTOR(out,ostride,to0 + 1) = -sum_imag;
+ }
+
+ }
+ }
+ }
+
+
+ if (product_1 % 2 == 1)
+ return;
+
+ {
+ double tw_arg = M_PI / ((double) factor);
+ ATOMIC cos_tw_arg = cos (tw_arg);
+ ATOMIC sin_tw_arg = -sin (tw_arg);
+
+ for (k1 = 0; k1 < q; k1++)
+ {
+ ATOMIC dw_real = 1.0, dw_imag = 0.0;
+
+ for (e1 = 0; e1 < factor; e1++)
+ {
+ ATOMIC z_real, z_imag;
+
+ ATOMIC sum_real = 0.0;
+ ATOMIC sum_imag = 0.0;
+
+ ATOMIC w_real = 1.0, w_imag = 0.0;
+ ATOMIC tw_real = 1.0, tw_imag = 0.0;
+
+ if (e1 > 0)
+ {
+ ATOMIC t_real = dw_real * cos_d_theta + dw_imag * sin_d_theta;
+ ATOMIC t_imag = -dw_real * sin_d_theta + dw_imag * cos_d_theta;
+ dw_real = t_real;
+ dw_imag = t_imag;
+ }
+
+ for (e2 = 0; e2 < factor; e2++)
+ {
+
+ if (e2 > 0)
+ {
+ ATOMIC tmp_real = tw_real * cos_tw_arg - tw_imag * sin_tw_arg;
+ ATOMIC tmp_imag = tw_real * sin_tw_arg + tw_imag * cos_tw_arg;
+ tw_real = tmp_real;
+ tw_imag = tmp_imag;
+ }
+
+ if (e2 > 0)
+ {
+ ATOMIC tmp_real = dw_real * w_real - dw_imag * w_imag;
+ ATOMIC tmp_imag = dw_real * w_imag + dw_imag * w_real;
+ w_real = tmp_real;
+ w_imag = tmp_imag;
+ }
+
+
+ {
+ const size_t from0 = k1 * product_1 + 2 * k + e2 * m - 1;
+ const ATOMIC f0_real = VECTOR(in,istride,from0);
+ z_real = tw_real * f0_real;
+ z_imag = tw_imag * f0_real;
+ }
+
+ sum_real += w_real * z_real - w_imag * z_imag;
+ sum_imag += w_real * z_imag + w_imag * z_real;
+ }
+
+ if (e1 + 1 < factor - e1)
+ {
+ const size_t to0 = k1 * product - 1 + 2 * e1 * product_1 + 2 * k;
+ VECTOR(out,ostride,to0) = sum_real;
+ VECTOR(out,ostride,to0 + 1) = sum_imag;
+ }
+ else if (e1 + 1 == factor - e1)
+ {
+ const size_t to0 = k1 * product - 1 + 2 * e1 * product_1 + 2 * k;
+ VECTOR(out,ostride,to0) = sum_real;
+ }
+ else
+ {
+ const size_t to0 = k1 * product - 1 + 2 * (factor - e1) * product_1 - 2 * k;
+ VECTOR(out,ostride,to0) = sum_real;
+ VECTOR(out,ostride,to0 + 1) = -sum_imag;
+ }
+
+ }
+ }
+ }
+ return;
+}
diff --git a/gsl-1.9/fft/real_radix2.c b/gsl-1.9/fft/real_radix2.c
new file mode 100644
index 0000000..ad5d827
--- /dev/null
+++ b/gsl-1.9/fft/real_radix2.c
@@ -0,0 +1,134 @@
+/* fft/real_radix2.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+int
+FUNCTION(gsl_fft_real,radix2_transform) (BASE data[], const size_t stride, const size_t n)
+{
+ int result ;
+ size_t p, p_1, q;
+ size_t i;
+ size_t logn = 0;
+ int status;
+
+ if (n == 1) /* identity operation */
+ {
+ return 0 ;
+ }
+
+ /* make sure that n is a power of 2 */
+
+ result = fft_binary_logn(n) ;
+
+ if (result == -1)
+ {
+ GSL_ERROR ("n is not a power of 2", GSL_EINVAL);
+ }
+ else
+ {
+ logn = result ;
+ }
+
+ /* bit reverse the ordering of input data for decimation in time algorithm */
+
+ status = FUNCTION(fft_real,bitreverse_order)(data, stride, n, logn) ;
+
+ /* apply fft recursion */
+
+ p = 1; q = n ;
+
+ for (i = 1; i <= logn; i++)
+ {
+ size_t a, b;
+
+ p_1 = p ;
+ p = 2 * p ;
+ q = q / 2 ;
+
+ /* a = 0 */
+
+ for (b = 0; b < q; b++)
+ {
+ ATOMIC t0_real = VECTOR(data,stride,b*p) + VECTOR(data,stride,b*p + p_1) ;
+ ATOMIC t1_real = VECTOR(data,stride,b*p) - VECTOR(data,stride,b*p + p_1) ;
+
+ VECTOR(data,stride,b*p) = t0_real ;
+ VECTOR(data,stride,b*p + p_1) = t1_real ;
+ }
+
+ /* a = 1 ... p_{i-1}/2 - 1 */
+
+ {
+ ATOMIC w_real = 1.0;
+ ATOMIC w_imag = 0.0;
+
+ const double theta = - 2.0 * M_PI / p;
+
+ const ATOMIC s = sin (theta);
+ const ATOMIC t = sin (theta / 2.0);
+ const ATOMIC s2 = 2.0 * t * t;
+
+ for (a = 1; a < (p_1)/2; a++)
+ {
+ /* trignometric recurrence for w-> exp(i theta) w */
+
+ {
+ const ATOMIC tmp_real = w_real - s * w_imag - s2 * w_real;
+ const ATOMIC tmp_imag = w_imag + s * w_real - s2 * w_imag;
+ w_real = tmp_real;
+ w_imag = tmp_imag;
+ }
+
+ for (b = 0; b < q; b++)
+ {
+ ATOMIC z0_real = VECTOR(data,stride,b*p + a) ;
+ ATOMIC z0_imag = VECTOR(data,stride,b*p + p_1 - a) ;
+ ATOMIC z1_real = VECTOR(data,stride,b*p + p_1 + a) ;
+ ATOMIC z1_imag = VECTOR(data,stride,b*p + p - a) ;
+
+ /* t0 = z0 + w * z1 */
+
+ ATOMIC t0_real = z0_real + w_real * z1_real - w_imag * z1_imag;
+ ATOMIC t0_imag = z0_imag + w_real * z1_imag + w_imag * z1_real;
+
+ /* t1 = z0 - w * z1 */
+
+ ATOMIC t1_real = z0_real - w_real * z1_real + w_imag * z1_imag;
+ ATOMIC t1_imag = z0_imag - w_real * z1_imag - w_imag * z1_real;
+
+ VECTOR(data,stride,b*p + a) = t0_real ;
+ VECTOR(data,stride,b*p + p - a) = t0_imag ;
+
+ VECTOR(data,stride,b*p + p_1 - a) = t1_real ;
+ VECTOR(data,stride,b*p + p_1 + a) = -t1_imag ;
+ }
+ }
+ }
+
+ if (p_1 > 1)
+ {
+ for (b = 0; b < q; b++)
+ {
+ /* a = p_{i-1}/2 */
+
+ VECTOR(data,stride,b*p + p - p_1/2) *= -1 ;
+ }
+ }
+ }
+ return 0;
+}
diff --git a/gsl-1.9/fft/real_unpack.c b/gsl-1.9/fft/real_unpack.c
new file mode 100644
index 0000000..f8da6f9
--- /dev/null
+++ b/gsl-1.9/fft/real_unpack.c
@@ -0,0 +1,42 @@
+/* fft/real_unpack.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "complex_internal.h"
+
+int
+FUNCTION(gsl_fft_real,unpack) (const BASE real_coefficient[],
+ BASE complex_coefficient[],
+ const size_t stride, const size_t n)
+{
+ size_t i;
+
+ if (n == 0)
+ {
+ GSL_ERROR ("length n must be positive integer", GSL_EDOM);
+ }
+
+ for (i = 0; i < n; i++)
+ {
+ REAL(complex_coefficient,stride,i) = real_coefficient[i * stride];
+ IMAG(complex_coefficient,stride,i) = 0.0;
+ }
+
+ return 0;
+
+}
diff --git a/gsl-1.9/fft/signals.c b/gsl-1.9/fft/signals.c
new file mode 100644
index 0000000..9869abe
--- /dev/null
+++ b/gsl-1.9/fft/signals.c
@@ -0,0 +1,26 @@
+#include <config.h>
+#include <math.h>
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_complex.h>
+#include <gsl/gsl_errno.h>
+
+#include <gsl/gsl_dft_complex.h>
+#include <gsl/gsl_dft_complex_float.h>
+
+#include "complex_internal.h"
+
+#include "urand.c"
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "signals_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "signals_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
diff --git a/gsl-1.9/fft/signals.h b/gsl-1.9/fft/signals.h
new file mode 100644
index 0000000..9f7da2c
--- /dev/null
+++ b/gsl-1.9/fft/signals.h
@@ -0,0 +1,64 @@
+/* fft/signals.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+int FUNCTION(fft_signal,complex_pulse) (const size_t k,
+ const size_t n,
+ const size_t stride,
+ const BASE z_real,
+ const BASE z_imag,
+ BASE data[],
+ BASE fft[]);
+
+int FUNCTION(fft_signal,complex_constant) (const size_t n,
+ const size_t stride,
+ const BASE z_real,
+ const BASE z_imag,
+ BASE data[],
+ BASE fft[]);
+
+int FUNCTION(fft_signal,complex_exp) (const int k,
+ const size_t n,
+ const size_t stride,
+ const BASE z_real,
+ const BASE z_imag,
+ BASE data[],
+ BASE fft[]);
+
+
+int FUNCTION(fft_signal,complex_exppair) (const int k1,
+ const int k2,
+ const size_t n,
+ const size_t stride,
+ const BASE z1_real,
+ const BASE z1_imag,
+ const BASE z2_real,
+ const BASE z2_imag,
+ BASE data[],
+ BASE fft[]);
+
+int FUNCTION(fft_signal,complex_noise) (const size_t n,
+ const size_t stride,
+ BASE data[],
+ BASE fft[]);
+
+int FUNCTION(fft_signal,real_noise) (const size_t n,
+ const size_t stride,
+ BASE data[],
+ BASE fft[]);
+
diff --git a/gsl-1.9/fft/signals_source.c b/gsl-1.9/fft/signals_source.c
new file mode 100644
index 0000000..eff3ec7
--- /dev/null
+++ b/gsl-1.9/fft/signals_source.c
@@ -0,0 +1,288 @@
+/* fft/signals_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "signals.h"
+
+int
+FUNCTION(fft_signal,complex_pulse) (const size_t k,
+ const size_t n,
+ const size_t stride,
+ const BASE z_real,
+ const BASE z_imag,
+ BASE data[],
+ BASE fft[])
+{
+ size_t j;
+
+ if (n == 0)
+ {
+ GSL_ERROR ("length n must be positive integer", GSL_EDOM);
+ }
+
+ /* gsl_complex pulse at position k, data[j] = z * delta_{jk} */
+
+ for (j = 0; j < n; j++)
+ {
+ REAL(data,stride,j) = 0.0;
+ IMAG(data,stride,j) = 0.0;
+ }
+
+ REAL(data,stride,k % n) = z_real;
+ IMAG(data,stride,k % n) = z_imag;
+
+ /* fourier transform, fft[j] = z * exp(-2 pi i j k / n) */
+
+ for (j = 0; j < n; j++)
+ {
+ const double arg = -2 * M_PI * ((double) ((j * k) % n)) / ((double) n);
+ const BASE w_real = (BASE)cos (arg);
+ const BASE w_imag = (BASE)sin (arg);
+ REAL(fft,stride,j) = w_real * z_real - w_imag * z_imag;
+ IMAG(fft,stride,j) = w_real * z_imag + w_imag * z_real;
+ }
+
+ return 0;
+
+}
+
+
+int
+FUNCTION(fft_signal,complex_constant) (const size_t n,
+ const size_t stride,
+ const BASE z_real,
+ const BASE z_imag,
+ BASE data[],
+ BASE fft[])
+{
+ size_t j;
+
+ if (n == 0)
+ {
+ GSL_ERROR ("length n must be positive integer", GSL_EDOM);
+ }
+
+ /* constant, data[j] = z */
+
+ for (j = 0; j < n; j++)
+ {
+ REAL(data,stride,j) = z_real;
+ IMAG(data,stride,j) = z_imag;
+ }
+
+ /* fourier transform, fft[j] = n z delta_{j0} */
+
+ for (j = 0; j < n; j++)
+ {
+ REAL(fft,stride,j) = 0.0;
+ IMAG(fft,stride,j) = 0.0;
+ }
+
+ REAL(fft,stride,0) = ((BASE) n) * z_real;
+ IMAG(fft,stride,0) = ((BASE) n) * z_imag;
+
+ return 0;
+
+}
+
+
+int
+FUNCTION(fft_signal,complex_exp) (const int k,
+ const size_t n,
+ const size_t stride,
+ const BASE z_real,
+ const BASE z_imag,
+ BASE data[],
+ BASE fft[])
+{
+ size_t j;
+
+ if (n == 0)
+ {
+ GSL_ERROR ("length n must be positive integer", GSL_EDOM);
+ }
+
+ /* exponential, data[j] = z * exp(2 pi i j k) */
+
+ for (j = 0; j < n; j++)
+ {
+ const double arg = 2 * M_PI * ((double) ((j * k) % n)) / ((double) n);
+ const BASE w_real = (BASE)cos (arg);
+ const BASE w_imag = (BASE)sin (arg);
+ REAL(data,stride,j) = w_real * z_real - w_imag * z_imag;
+ IMAG(data,stride,j) = w_real * z_imag + w_imag * z_real;
+ }
+
+ /* fourier transform, fft[j] = z * delta{(j - k),0} */
+
+ for (j = 0; j < n; j++)
+ {
+ REAL(fft,stride,j) = 0.0;
+ IMAG(fft,stride,j) = 0.0;
+ }
+
+ {
+ int freq;
+
+ if (k <= 0)
+ {
+ freq = (n-k) % n ;
+ }
+ else
+ {
+ freq = (k % n);
+ };
+
+ REAL(fft,stride,freq) = ((BASE) n) * z_real;
+ IMAG(fft,stride,freq) = ((BASE) n) * z_imag;
+ }
+
+ return 0;
+
+}
+
+
+int
+FUNCTION(fft_signal,complex_exppair) (const int k1,
+ const int k2,
+ const size_t n,
+ const size_t stride,
+ const BASE z1_real,
+ const BASE z1_imag,
+ const BASE z2_real,
+ const BASE z2_imag,
+ BASE data[],
+ BASE fft[])
+{
+ size_t j;
+
+ if (n == 0)
+ {
+ GSL_ERROR ("length n must be positive integer", GSL_EDOM);
+ }
+
+ /* exponential, data[j] = z1 * exp(2 pi i j k1) + z2 * exp(2 pi i j k2) */
+
+ for (j = 0; j < n; j++)
+ {
+ const double arg1 = 2 * M_PI * ((double) ((j * k1) % n)) / ((double) n);
+ const BASE w1_real = (BASE)cos (arg1);
+ const BASE w1_imag = (BASE)sin (arg1);
+ const double arg2 = 2 * M_PI * ((double) ((j * k2) % n)) / ((double) n);
+ const BASE w2_real = (BASE)cos (arg2);
+ const BASE w2_imag = (BASE)sin (arg2);
+ REAL(data,stride,j) = w1_real * z1_real - w1_imag * z1_imag;
+ IMAG(data,stride,j) = w1_real * z1_imag + w1_imag * z1_real;
+ REAL(data,stride,j) += w2_real * z2_real - w2_imag * z2_imag;
+ IMAG(data,stride,j) += w2_real * z2_imag + w2_imag * z2_real;
+ }
+
+ /* fourier transform, fft[j] = z1 * delta{(j - k1),0} + z2 *
+ delta{(j - k2,0)} */
+
+ for (j = 0; j < n; j++)
+ {
+ REAL(fft,stride,j) = 0.0;
+ IMAG(fft,stride,j) = 0.0;
+ }
+
+ {
+ int freq1, freq2;
+
+ if (k1 <= 0)
+ {
+ freq1 = (n - k1) % n;
+ }
+ else
+ {
+ freq1 = (k1 % n);
+ };
+
+ if (k2 <= 0)
+ {
+ freq2 = (n - k2) % n;
+ }
+ else
+ {
+ freq2 = (k2 % n);
+ };
+
+ REAL(fft,stride,freq1) += ((BASE) n) * z1_real;
+ IMAG(fft,stride,freq1) += ((BASE) n) * z1_imag;
+ REAL(fft,stride,freq2) += ((BASE) n) * z2_real;
+ IMAG(fft,stride,freq2) += ((BASE) n) * z2_imag;
+ }
+
+ return 0;
+
+}
+
+
+int
+FUNCTION(fft_signal,complex_noise) (const size_t n,
+ const size_t stride,
+ BASE data[],
+ BASE fft[])
+{
+ size_t i;
+ int status;
+
+ if (n == 0)
+ {
+ GSL_ERROR ("length n must be positive integer", GSL_EDOM);
+ }
+
+ for (i = 0; i < n; i++)
+ {
+ REAL(data,stride,i) = (BASE)urand();
+ IMAG(data,stride,i) = (BASE)urand();
+ }
+
+ /* compute the dft */
+ status = FUNCTION(gsl_dft_complex,forward) (data, stride, n, fft);
+
+ return status;
+}
+
+
+int
+FUNCTION(fft_signal,real_noise) (const size_t n,
+ const size_t stride,
+ BASE data[],
+ BASE fft[])
+{
+ size_t i;
+ int status;
+
+ if (n == 0)
+ {
+ GSL_ERROR ("length n must be positive integer", GSL_EDOM);
+ }
+
+ for (i = 0; i < n; i++)
+ {
+ REAL(data,stride,i) = (BASE)urand();
+ IMAG(data,stride,i) = 0.0;
+ }
+
+ /* compute the dft */
+ status = FUNCTION(gsl_dft_complex,forward) (data, stride, n, fft);
+
+ return status;
+}
+
diff --git a/gsl-1.9/fft/test.c b/gsl-1.9/fft/test.c
new file mode 100644
index 0000000..779a056
--- /dev/null
+++ b/gsl-1.9/fft/test.c
@@ -0,0 +1,126 @@
+/* fft/test.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <string.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <float.h>
+
+#include <gsl/gsl_complex.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_dft_complex.h>
+#include <gsl/gsl_fft_complex.h>
+#include <gsl/gsl_fft_complex_float.h>
+#include <gsl/gsl_fft_real.h>
+#include <gsl/gsl_fft_real_float.h>
+#include <gsl/gsl_fft_halfcomplex.h>
+#include <gsl/gsl_fft_halfcomplex_float.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_test.h>
+
+void my_error_handler (const char *reason, const char *file,
+ int line, int err);
+
+#include "complex_internal.h"
+
+/* Usage: test [n]
+ Exercise the fft routines for length n. By default n runs from 1 to 100.
+ The exit status indicates success or failure. */
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "compare_source.c"
+#include "bitreverse.c"
+#include "test_complex_source.c"
+#include "test_real_source.c"
+#include "test_trap_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "compare_source.c"
+#include "bitreverse.c"
+#include "test_complex_source.c"
+#include "test_real_source.c"
+#include "test_trap_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+int
+main (int argc, char *argv[])
+{
+ size_t i;
+ size_t start = 1, end = 99;
+ size_t stride ;
+ size_t n = 0;
+
+ gsl_ieee_env_setup ();
+
+ if (argc == 2)
+ n = strtol (argv[1], NULL, 0);
+
+ if (n)
+ {
+ start = n ;
+ end = n ;
+ }
+
+
+ for (i = 1 ; i <= end ; i *= 2)
+ {
+ if (i >= start)
+ {
+ for (stride = 1 ; stride < 4 ; stride++)
+ {
+ test_complex_bitreverse_order (stride, i) ;
+ test_complex_radix2 (stride, i) ;
+ test_real_bitreverse_order (stride, i) ;
+ test_real_radix2 (stride, i) ;
+ }
+ }
+ }
+
+ for (i = start ; i <= end ; i++)
+ {
+ for (stride = 1 ; stride < 4 ; stride++)
+ {
+ test_complex_func (stride, i) ;
+ test_complex_float_func (stride, i) ;
+ test_real_func (stride, i) ;
+ test_real_float_func (stride, i) ;
+ }
+ }
+
+ gsl_set_error_handler (&my_error_handler);
+ test_trap () ;
+ test_float_trap () ;
+
+ exit (gsl_test_summary ());
+}
+
+
+void
+my_error_handler (const char *reason, const char *file, int line, int err)
+{
+ if (0) printf ("(caught [%s:%d: %s (%d)])\n", file, line, reason, err) ;
+}
diff --git a/gsl-1.9/fft/test_complex_source.c b/gsl-1.9/fft/test_complex_source.c
new file mode 100644
index 0000000..a4c0d27
--- /dev/null
+++ b/gsl-1.9/fft/test_complex_source.c
@@ -0,0 +1,448 @@
+/* fft/test_complex.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "bitreverse.h"
+#include "signals.h"
+#include "compare.h"
+
+void FUNCTION(test_complex,func) (size_t stride, size_t n);
+int FUNCTION(test,offset) (const BASE data[], size_t stride,
+ size_t n, size_t offset);
+void FUNCTION(test_complex,bitreverse_order) (size_t stride, size_t n) ;
+void FUNCTION(test_complex,radix2) (size_t stride, size_t n);
+
+int FUNCTION(test,offset) (const BASE data[], size_t stride,
+ size_t n, size_t offset)
+{
+ int status = 0 ;
+ size_t i, j, k = 0 ;
+
+ for (i = 0; i < n; i++)
+ {
+ k += 2 ;
+
+ for (j = 1; j < stride; j++)
+ {
+ status |= data[k] != k + offset ;
+ k++ ;
+ status |= data[k] != k + offset ;
+ k++ ;
+ }
+ }
+ return status ;
+}
+
+
+void FUNCTION(test_complex,func) (size_t stride, size_t n)
+{
+ size_t i ;
+ int status ;
+
+ TYPE(gsl_fft_complex_wavetable) * cw ;
+ TYPE(gsl_fft_complex_workspace) * cwork ;
+
+ BASE * complex_data = (BASE *) malloc (2 * n * stride * sizeof (BASE));
+ BASE * complex_tmp = (BASE *) malloc (2 * n * stride * sizeof (BASE));
+ BASE * fft_complex_data = (BASE *) malloc (2 * n * stride * sizeof (BASE));
+ BASE * fft_complex_tmp = (BASE *) malloc (2 * n * stride * sizeof (BASE));
+
+ for (i = 0 ; i < 2 * n * stride ; i++)
+ {
+ complex_data[i] = (BASE)i ;
+ complex_tmp[i] = (BASE)(i + 1000.0) ;
+ fft_complex_data[i] = (BASE)(i + 2000.0) ;
+ fft_complex_tmp[i] = (BASE)(i + 3000.0) ;
+ }
+
+ gsl_set_error_handler (NULL); /* abort on any errors */
+
+ /* Test allocation */
+
+ {
+ cw = FUNCTION(gsl_fft_complex_wavetable,alloc) (n);
+ gsl_test (cw == 0, NAME(gsl_fft_complex_wavetable)
+ "_alloc, n = %d, stride = %d", n, stride);
+ }
+
+ {
+ cwork = FUNCTION(gsl_fft_complex_workspace,alloc) (n);
+ gsl_test (cwork == 0, NAME(gsl_fft_complex_workspace)
+ "_alloc, n = %d", n);
+ }
+
+
+ /* Test mixed radix fft with noise */
+
+ {
+ FUNCTION(fft_signal,complex_noise) (n, stride, complex_data, fft_complex_data);
+ for (i = 0 ; i < n ; i++)
+ {
+ REAL(complex_tmp,stride,i) = REAL(complex_data,stride,i) ;
+ IMAG(complex_tmp,stride,i) = IMAG(complex_data,stride,i) ;
+ }
+
+ FUNCTION(gsl_fft_complex,forward) (complex_data, stride, n, cw, cwork);
+
+ for (i = 0 ; i < n ; i++)
+ {
+ REAL(fft_complex_tmp,stride,i) = REAL(complex_data,stride,i) ;
+ IMAG(fft_complex_tmp,stride,i) = IMAG(complex_data,stride,i) ;
+ }
+
+ status = FUNCTION(compare_complex,results) ("dft", fft_complex_data,
+ "fft of noise", complex_data,
+ stride, n, 1e6);
+ gsl_test (status, NAME(gsl_fft_complex)
+ "_forward with signal_noise, n = %d, stride = %d", n, stride);
+
+ if (stride > 1)
+ {
+ status = FUNCTION(test, offset) (complex_data, stride, n, 0) ;
+
+ gsl_test (status, NAME(gsl_fft_complex)
+ "_forward avoids unstrided data, n = %d, stride = %d",
+ n, stride);
+ }
+ }
+
+ /* Test the inverse fft */
+
+ {
+ status = FUNCTION(gsl_fft_complex,inverse) (complex_data, stride, n, cw, cwork);
+ status = FUNCTION(compare_complex,results) ("orig", complex_tmp,
+ "fft inverse", complex_data,
+ stride, n, 1e6);
+ gsl_test (status, NAME(gsl_fft_complex)
+ "_inverse with signal_noise, n = %d, stride = %d", n, stride);
+
+ if (stride > 1)
+ {
+ status = FUNCTION(test, offset) (complex_data, stride, n, 0) ;
+
+ gsl_test (status, NAME(gsl_fft_complex)
+ "_inverse other data untouched, n = %d, stride = %d",
+ n, stride);
+ }
+
+ }
+
+ /* Test the backward fft */
+
+ {
+ status = FUNCTION(gsl_fft_complex,backward) (fft_complex_tmp, stride, n, cw, cwork);
+
+ for (i = 0; i < n; i++)
+ {
+ REAL(complex_tmp,stride,i) *= n;
+ IMAG(complex_tmp,stride,i) *= n;
+ }
+ status = FUNCTION(compare_complex,results) ("orig",
+ complex_tmp,
+ "fft backward",
+ fft_complex_tmp,
+ stride, n, 1e6);
+
+ gsl_test (status, NAME(gsl_fft_complex)
+ "_backward with signal_noise, n = %d, stride = %d", n, stride);
+
+ if (stride > 1)
+ {
+ status = FUNCTION(test, offset) (fft_complex_tmp, stride, n, 3000) ;
+
+ gsl_test (status, NAME(gsl_fft_complex)
+ "_backward avoids unstrided data, n = %d, stride = %d",
+ n, stride);
+ }
+
+ }
+
+ /* Test a pulse signal */
+
+ {
+ FUNCTION(fft_signal,complex_pulse) (1, n, stride, 1.0, 0.0, complex_data,
+ fft_complex_data);
+ FUNCTION(gsl_fft_complex,forward) (complex_data, stride, n, cw, cwork);
+ status = FUNCTION(compare_complex,results) ("analytic", fft_complex_data,
+ "fft of pulse", complex_data,
+ stride, n, 1e6);
+ gsl_test (status, NAME(gsl_fft_complex)
+ "_forward with signal_pulse, n = %d, stride = %d", n, stride);
+
+ }
+
+
+ /* Test a constant signal */
+
+ {
+ FUNCTION(fft_signal,complex_constant) (n, stride, 1.0, 0.0, complex_data,
+ fft_complex_data);
+ FUNCTION(gsl_fft_complex,forward) (complex_data, stride, n, cw, cwork);
+ status = FUNCTION(compare_complex,results) ("analytic", fft_complex_data,
+ "fft of constant",
+ complex_data,
+ stride, n, 1e6);
+ gsl_test (status, NAME(gsl_fft_complex)
+ "_forward with signal_constant, n = %d, stride = %d", n, stride);
+ }
+
+ /* Test an exponential (cos/sin) signal */
+
+ {
+ status = 0;
+ for (i = 0; i < n; i++)
+ {
+ FUNCTION(fft_signal,complex_exp) ((int)i, n, stride, 1.0, 0.0, complex_data,
+ fft_complex_data);
+ FUNCTION(gsl_fft_complex,forward) (complex_data, stride, n, cw, cwork);
+ status |= FUNCTION(compare_complex,results) ("analytic",
+ fft_complex_data,
+ "fft of exp",
+ complex_data,
+ stride, n, 1e6);
+ }
+ gsl_test (status, NAME(gsl_fft_complex)
+ "_forward with signal_exp, n = %d, stride = %d", n, stride);
+ }
+
+ FUNCTION(gsl_fft_complex_wavetable,free) (cw);
+ FUNCTION(gsl_fft_complex_workspace,free) (cwork);
+
+ free (complex_data);
+ free (complex_tmp);
+ free (fft_complex_data);
+ free (fft_complex_tmp);
+}
+
+
+void
+FUNCTION(test_complex,bitreverse_order) (size_t stride, size_t n)
+{
+ int status ;
+ size_t logn, i ;
+
+ BASE * tmp = (BASE *) malloc (2 * n * stride * sizeof (BASE));
+ BASE * data = (BASE *) malloc (2 * n * stride * sizeof (BASE));
+ BASE * reversed_data = (BASE *) malloc (2 * n * stride * sizeof (BASE));
+
+ for (i = 0; i < 2 * stride * n; i++)
+ {
+ data[i] = (BASE)i ;
+ }
+
+ memcpy (tmp, data, 2 * n * stride * sizeof(BASE)) ;
+
+ logn = 0 ; while (n > (1U<<logn)) {logn++ ; } ;
+
+ /* do a naive bit reversal as a baseline for testing the other routines */
+
+ for (i = 0; i < n; i++)
+ {
+ size_t i_tmp = i ;
+ size_t j = 0 ;
+ size_t bit ;
+
+ for (bit = 0; bit < logn; bit++)
+ {
+ j <<= 1; /* reverse shift i into j */
+ j |= i_tmp & 1;
+ i_tmp >>= 1;
+ }
+
+ reversed_data[2*j*stride] = data[2*i*stride] ;
+ reversed_data[2*j*stride+1] = data[2*i*stride+1] ;
+ }
+
+ FUNCTION(fft_complex,bitreverse_order) (data, stride, n, logn);
+
+ status = FUNCTION(compare_complex,results) ("naive bit reverse",
+ reversed_data,
+ "fft_complex_bitreverse_order",
+ data,
+ stride, n, 1e6);
+
+ gsl_test (status, "fft_complex_bitreverse_order, n = %d", n);
+
+ free (reversed_data) ;
+ free (data) ;
+ free (tmp) ;
+}
+
+void FUNCTION(test_complex,radix2) (size_t stride, size_t n)
+{
+ size_t i ;
+ int status ;
+
+ BASE * complex_data = (BASE *) malloc (2 * n * stride * sizeof (BASE));
+ BASE * complex_tmp = (BASE *) malloc (2 * n * stride * sizeof (BASE));
+ BASE * fft_complex_data = (BASE *) malloc (2 * n * stride * sizeof (BASE));
+ BASE * fft_complex_tmp = (BASE *) malloc (2 * n * stride * sizeof (BASE));
+
+ for (i = 0 ; i < 2 * n * stride ; i++)
+ {
+ complex_data[i] = (BASE)i ;
+ complex_tmp[i] = (BASE)(i + 1000.0) ;
+ fft_complex_data[i] = (BASE)(i + 2000.0) ;
+ fft_complex_tmp[i] = (BASE)(i + 3000.0) ;
+ }
+
+ gsl_set_error_handler (NULL); /* abort on any errors */
+
+ /* Test radix-2 fft with noise */
+
+ {
+ FUNCTION(fft_signal,complex_noise) (n, stride, complex_data,
+ fft_complex_data);
+ for (i = 0 ; i < n ; i++)
+ {
+ REAL(complex_tmp,stride,i) = REAL(complex_data,stride,i) ;
+ IMAG(complex_tmp,stride,i) = IMAG(complex_data,stride,i) ;
+ }
+
+ FUNCTION(gsl_fft_complex,radix2_forward) (complex_data, stride, n);
+
+ for (i = 0 ; i < n ; i++)
+ {
+ REAL(fft_complex_tmp,stride,i) = REAL(complex_data,stride,i) ;
+ IMAG(fft_complex_tmp,stride,i) = IMAG(complex_data,stride,i) ;
+ }
+
+ status = FUNCTION(compare_complex,results) ("dft", fft_complex_data,
+ "fft of noise", complex_data,
+ stride, n, 1e6);
+ gsl_test (status, NAME(gsl_fft_complex)
+ "_radix2_forward with signal_noise, n = %d, stride = %d",
+ n, stride);
+
+ if (stride > 1)
+ {
+ status = FUNCTION(test, offset) (complex_data, stride, n, 0) ;
+
+ gsl_test (status, NAME(gsl_fft_complex)
+ "_radix2_forward avoids unstrided data, n = %d, stride = %d",
+ n, stride);
+ }
+ }
+
+ /* Test the inverse fft */
+
+ {
+ status = FUNCTION(gsl_fft_complex,radix2_inverse) (complex_data, stride, n);
+ status = FUNCTION(compare_complex,results) ("orig", complex_tmp,
+ "fft inverse", complex_data,
+ stride, n, 1e6);
+ gsl_test (status, NAME(gsl_fft_complex)
+ "_radix2_inverse with signal_noise, n = %d, stride = %d", n, stride);
+
+ if (stride > 1)
+ {
+ status = FUNCTION(test, offset) (complex_data, stride, n, 0) ;
+
+ gsl_test (status, NAME(gsl_fft_complex)
+ "_radix2_inverse other data untouched, n = %d, stride = %d",
+ n, stride);
+ }
+
+ }
+
+ /* Test the backward fft */
+
+ {
+ status = FUNCTION(gsl_fft_complex,radix2_backward) (fft_complex_tmp, stride, n);
+
+ for (i = 0; i < n; i++)
+ {
+ REAL(complex_tmp,stride,i) *= n;
+ IMAG(complex_tmp,stride,i) *= n;
+ }
+ status = FUNCTION(compare_complex,results) ("orig",
+ complex_tmp,
+ "fft backward",
+ fft_complex_tmp,
+ stride, n, 1e6);
+
+ gsl_test (status, NAME(gsl_fft_complex)
+ "_radix2_backward with signal_noise, n = %d, stride = %d", n, stride);
+
+ if (stride > 1)
+ {
+ status = FUNCTION(test, offset) (fft_complex_tmp, stride, n, 3000) ;
+
+ gsl_test (status, NAME(gsl_fft_complex)
+ "_radix2_backward avoids unstrided data, n = %d, stride = %d",
+ n, stride);
+ }
+
+ }
+
+ /* Test a pulse signal */
+
+ {
+ FUNCTION(fft_signal,complex_pulse) (1, n, stride, 1.0, 0.0, complex_data,
+ fft_complex_data);
+ FUNCTION(gsl_fft_complex,radix2_forward) (complex_data, stride, n);
+ status = FUNCTION(compare_complex,results) ("analytic", fft_complex_data,
+ "fft of pulse", complex_data,
+ stride, n, 1e6);
+ gsl_test (status, NAME(gsl_fft_complex)
+ "_radix2_forward with signal_pulse, n = %d, stride = %d", n, stride);
+
+ }
+
+
+ /* Test a constant signal */
+
+ {
+ FUNCTION(fft_signal,complex_constant) (n, stride, 1.0, 0.0, complex_data,
+ fft_complex_data);
+ FUNCTION(gsl_fft_complex,radix2_forward) (complex_data, stride, n);
+ status = FUNCTION(compare_complex,results) ("analytic", fft_complex_data,
+ "fft of constant",
+ complex_data,
+ stride, n, 1e6);
+ gsl_test (status, NAME(gsl_fft_complex)
+ "_radix2_forward with signal_constant, n = %d, stride = %d",
+ n, stride);
+ }
+
+ /* Test an exponential (cos/sin) signal */
+
+ {
+ status = 0;
+ for (i = 0; i < n; i++)
+ {
+ FUNCTION(fft_signal,complex_exp) ((int)i, n, stride, 1.0, 0.0, complex_data,
+ fft_complex_data);
+ FUNCTION(gsl_fft_complex,radix2_forward) (complex_data, stride, n);
+ status |= FUNCTION(compare_complex,results) ("analytic",
+ fft_complex_data,
+ "fft of exp",
+ complex_data,
+ stride, n, 1e6);
+ }
+ gsl_test (status, NAME(gsl_fft_complex)
+ "_radix2_forward with signal_exp, n = %d, stride = %d", n, stride);
+ }
+
+
+ free (complex_data);
+ free (complex_tmp);
+ free (fft_complex_data);
+ free (fft_complex_tmp);
+}
+
diff --git a/gsl-1.9/fft/test_real_source.c b/gsl-1.9/fft/test_real_source.c
new file mode 100644
index 0000000..1605a78
--- /dev/null
+++ b/gsl-1.9/fft/test_real_source.c
@@ -0,0 +1,235 @@
+/* fft/test_real.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "bitreverse.h"
+#include "signals.h"
+#include "compare.h"
+
+void FUNCTION(test_real,func) (size_t stride, size_t n);
+void FUNCTION(test_real,bitreverse_order) (size_t stride, size_t n);
+void FUNCTION(test_real,radix2) (size_t stride, size_t n);
+
+void FUNCTION(test_real,func) (size_t stride, size_t n)
+{
+ size_t i ;
+ int status ;
+
+ TYPE(gsl_fft_real_wavetable) * rw ;
+ TYPE(gsl_fft_halfcomplex_wavetable) * hcw ;
+ TYPE(gsl_fft_real_workspace) * rwork ;
+
+ BASE * real_data = (BASE *) malloc (n * stride * sizeof (BASE));
+ BASE * complex_data = (BASE *) malloc (2 * n * stride * sizeof (BASE));
+ BASE * complex_tmp = (BASE *) malloc (2 * n * stride * sizeof (BASE));
+ BASE * fft_complex_data = (BASE *) malloc (2 * n * stride * sizeof (BASE));
+
+ for (i = 0 ; i < n * stride ; i++)
+ {
+ real_data[i] = (BASE)i ;
+ }
+
+ for (i = 0 ; i < 2 * n * stride ; i++)
+ {
+ complex_data[i] = (BASE)(i + 1000.0) ;
+ complex_tmp[i] = (BASE)(i + 2000.0) ;
+ fft_complex_data[i] = (BASE)(i + 3000.0) ;
+ }
+
+ gsl_set_error_handler (NULL); /* abort on any errors */
+
+ /* mixed radix real fft */
+
+ rw = FUNCTION(gsl_fft_real_wavetable,alloc) (n);
+ gsl_test (rw == 0, NAME(gsl_fft_real_wavetable)
+ "_alloc, n = %d, stride = %d", n, stride);
+
+ rwork = FUNCTION(gsl_fft_real_workspace,alloc) (n);
+ gsl_test (rwork == 0, NAME(gsl_fft_real_workspace)
+ "_alloc, n = %d", n);
+
+ FUNCTION(fft_signal,real_noise) (n, stride, complex_data, fft_complex_data);
+ memcpy (complex_tmp, complex_data, 2 * n * stride * sizeof (BASE));
+
+ for (i = 0; i < n; i++)
+ {
+ real_data[i*stride] = REAL(complex_data,stride,i);
+ }
+
+ FUNCTION(gsl_fft_real,transform) (real_data, stride, n, rw, rwork);
+ FUNCTION(gsl_fft_halfcomplex,unpack) (real_data, complex_data, stride, n);
+
+ status = FUNCTION(compare_complex,results) ("dft", fft_complex_data,
+ "fft of noise", complex_data,
+ stride, n, 1e6);
+ gsl_test (status, NAME(gsl_fft_real)
+ " with signal_real_noise, n = %d, stride = %d", n, stride);
+
+ /* compute the inverse fft */
+
+ hcw = FUNCTION(gsl_fft_halfcomplex_wavetable,alloc) (n);
+ gsl_test (hcw == 0, NAME(gsl_fft_halfcomplex_wavetable)
+ "_alloc, n = %d, stride = %d", n, stride);
+
+ status = FUNCTION(gsl_fft_halfcomplex,transform) (real_data, stride, n, hcw, rwork);
+
+ for (i = 0; i < n; i++)
+ {
+ real_data[i*stride] /= n;
+ }
+
+ FUNCTION(gsl_fft_real,unpack) (real_data, complex_data, stride, n);
+
+ status = FUNCTION(compare_complex,results) ("orig", complex_tmp,
+ "fft inverse", complex_data,
+ stride, n, 1e6);
+
+ gsl_test (status, NAME(gsl_fft_halfcomplex)
+ " with data from signal_noise, n = %d, stride = %d", n, stride);
+
+ FUNCTION(gsl_fft_real_workspace,free) (rwork);
+ FUNCTION(gsl_fft_real_wavetable,free) (rw);
+ FUNCTION(gsl_fft_halfcomplex_wavetable,free) (hcw);
+
+ free(real_data) ;
+ free(complex_data) ;
+ free(complex_tmp) ;
+ free(fft_complex_data) ;
+}
+
+
+void
+FUNCTION(test_real,bitreverse_order) (size_t stride, size_t n)
+{
+ int status ;
+ size_t logn, i ;
+
+ BASE * tmp = (BASE *) malloc (n * stride * sizeof (BASE));
+ BASE * data = (BASE *) malloc (n * stride * sizeof (BASE));
+ BASE * reversed_data = (BASE *) malloc (n * stride * sizeof (BASE));
+
+ for (i = 0; i < stride * n; i++)
+ {
+ data[i] = (BASE)i ;
+ }
+
+ memcpy (tmp, data, n * stride * sizeof(BASE)) ;
+
+ logn = 0 ; while (n > (1U <<logn)) {logn++;} ;
+
+ /* do a naive bit reversal as a baseline for testing the other routines */
+
+ for (i = 0; i < n; i++)
+ {
+ size_t i_tmp = i ;
+ size_t j = 0 ;
+ size_t bit ;
+
+ for (bit = 0; bit < logn; bit++)
+ {
+ j <<= 1; /* reverse shift i into j */
+ j |= i_tmp & 1;
+ i_tmp >>= 1;
+ }
+
+ reversed_data[j*stride] = data[i*stride] ;
+ }
+
+ FUNCTION(fft_real,bitreverse_order) (data, stride, n, logn);
+
+ status = FUNCTION(compare_real,results) ("naive bit reverse",
+ reversed_data,
+ "fft_complex_bitreverse_order",
+ data,
+ stride, n, 1e6);
+
+ gsl_test (status, NAME(fft_real) "_bitreverse_order, n = %d", n);
+
+ free (reversed_data) ;
+ free (data) ;
+ free (tmp) ;
+}
+
+
+void FUNCTION(test_real,radix2) (size_t stride, size_t n)
+{
+ size_t i ;
+ int status ;
+
+ BASE * real_data = (BASE *) malloc (n * stride * sizeof (BASE));
+ BASE * complex_data = (BASE *) malloc (2 * n * stride * sizeof (BASE));
+ BASE * complex_tmp = (BASE *) malloc (2 * n * stride * sizeof (BASE));
+ BASE * fft_complex_data = (BASE *) malloc (2 * n * stride * sizeof (BASE));
+
+ for (i = 0 ; i < n * stride ; i++)
+ {
+ real_data[i] = (BASE)i ;
+ }
+
+ for (i = 0 ; i < 2 * n * stride ; i++)
+ {
+ complex_data[i] = (BASE)(i + 1000.0) ;
+ complex_tmp[i] = (BASE)(i + 2000.0) ;
+ fft_complex_data[i] = (BASE)(i + 3000.0) ;
+ }
+
+ gsl_set_error_handler (NULL); /* abort on any errors */
+
+ /* radix-2 real fft */
+
+ FUNCTION(fft_signal,real_noise) (n, stride, complex_data, fft_complex_data);
+ memcpy (complex_tmp, complex_data, 2 * n * stride * sizeof (BASE));
+
+ for (i = 0; i < n; i++)
+ {
+ real_data[i*stride] = REAL(complex_data,stride,i);
+ }
+
+ FUNCTION(gsl_fft_real,radix2_transform) (real_data, stride, n);
+ FUNCTION(gsl_fft_halfcomplex,radix2_unpack) (real_data, complex_data, stride, n);
+
+ status = FUNCTION(compare_complex,results) ("dft", fft_complex_data,
+ "fft of noise", complex_data,
+ stride, n, 1e6);
+ gsl_test (status, NAME(gsl_fft_real)
+ "_radix2 with signal_real_noise, n = %d, stride = %d", n, stride);
+
+ /* compute the inverse fft */
+
+ status = FUNCTION(gsl_fft_halfcomplex,radix2_transform) (real_data, stride, n);
+
+ for (i = 0; i < n; i++)
+ {
+ real_data[i*stride] /= n;
+ }
+
+ FUNCTION(gsl_fft_real,unpack) (real_data, complex_data, stride, n);
+
+ status = FUNCTION(compare_complex,results) ("orig", complex_tmp,
+ "fft inverse", complex_data,
+ stride, n, 1e6);
+
+ gsl_test (status, NAME(gsl_fft_halfcomplex)
+ "_radix2 with data from signal_noise, n = %d, stride = %d", n, stride);
+
+
+ free(real_data) ;
+ free(complex_data) ;
+ free(complex_tmp) ;
+ free(fft_complex_data) ;
+}
diff --git a/gsl-1.9/fft/test_trap_source.c b/gsl-1.9/fft/test_trap_source.c
new file mode 100644
index 0000000..379ac7a
--- /dev/null
+++ b/gsl-1.9/fft/test_trap_source.c
@@ -0,0 +1,138 @@
+/* fft/test_trap.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+void FUNCTION(test,trap) (void);
+
+void
+FUNCTION(test,trap) (void)
+{
+ int status ;
+
+ BASE real_x ;
+ BASE complex_x ;
+
+ BASE * real_data = &real_x ;
+ BASE * complex_data = &complex_x ;
+
+ TYPE(gsl_fft_complex_wavetable) * cw;
+ TYPE(gsl_fft_real_wavetable) * rw;
+ TYPE(gsl_fft_halfcomplex_wavetable) * hcw;
+
+ TYPE(gsl_fft_complex_workspace) * cwork;
+ TYPE(gsl_fft_real_workspace) * rwork;
+
+ /* n = 0 in alloc */
+
+ cw = FUNCTION(gsl_fft_complex_wavetable,alloc) (0);
+ gsl_test (cw != 0, "trap for n = 0 in " NAME(gsl_fft_complex_wavetable) "_alloc");
+
+ rw = FUNCTION(gsl_fft_real_wavetable,alloc) (0);
+ gsl_test (rw != 0, "trap for n = 0 in " NAME(gsl_fft_real_wavetable) "_alloc" );
+
+ hcw = FUNCTION(gsl_fft_halfcomplex_wavetable,alloc) (0);
+ gsl_test (hcw != 0, "trap for n = 0 in " NAME(gsl_fft_halfcomplex_wavetable) "_alloc");
+
+ cwork = FUNCTION(gsl_fft_complex_workspace,alloc) (0);
+ gsl_test (cw != 0, "trap for n = 0 in " NAME(gsl_fft_complex_workspace) "_alloc");
+
+ rwork = FUNCTION(gsl_fft_real_workspace,alloc) (0);
+ gsl_test (rw != 0, "trap for n = 0 in " NAME(gsl_fft_real_workspace) "_alloc" );
+
+ cw = FUNCTION(gsl_fft_complex_wavetable,alloc) (10);
+ hcw = FUNCTION(gsl_fft_halfcomplex_wavetable,alloc) (10);
+ rw = FUNCTION(gsl_fft_real_wavetable,alloc) (10);
+
+ cwork = FUNCTION(gsl_fft_complex_workspace,alloc) (10);
+ rwork = FUNCTION(gsl_fft_real_workspace,alloc) (10);
+
+ /* n = 0 in fft forward */
+
+ status = FUNCTION(gsl_fft_complex,forward) (complex_data, 1, 0, cw, cwork);
+ gsl_test (!status, "trap for n = 0 in " NAME(gsl_fft_complex) "_forward");
+
+ status = FUNCTION(gsl_fft_real,transform) (real_data, 1, 0, rw, rwork);
+ gsl_test (!status, "trap for n = 0 in " NAME(gsl_fft_real) "_transform");
+
+ status = FUNCTION(gsl_fft_halfcomplex,transform) (real_data, 1, 0, hcw, rwork);
+ gsl_test (!status, "trap for n = 0 in " NAME(gsl_fft_halfcomplex) "_transform");
+
+ status = FUNCTION(gsl_fft_complex,radix2_forward) (complex_data, 1, 0);
+ gsl_test (!status, "trap for n = 0 in " NAME(gsl_fft_complex) "_radix2_forward");
+
+ /* n = 0 in fft backward */
+
+ status = FUNCTION(gsl_fft_complex,backward) (complex_data, 1, 0, cw, cwork);
+ gsl_test (!status, "trap for n = 0 in " NAME(gsl_fft_complex) "_backward");
+
+ status = FUNCTION(gsl_fft_complex,radix2_backward) (complex_data, 1, 0);
+ gsl_test (!status, "trap for n = 0 in " NAME(gsl_fft_complex) "_radix2_backward");
+
+ /* n = 0 in fft inverse */
+
+ status = FUNCTION(gsl_fft_complex,inverse) (complex_data, 1, 0, cw, cwork);
+ gsl_test (!status, "trap for n = 0 in " NAME(gsl_fft_complex) "_inverse");
+
+ status = FUNCTION(gsl_fft_complex,radix2_inverse) (complex_data, 1, 0);
+ gsl_test (!status, "trap for n = 0 in " NAME(gsl_fft_complex) "_radix2_inverse");
+
+ /* n != 2^k in power of 2 routines */
+
+ status = FUNCTION(gsl_fft_complex,radix2_forward) (complex_data, 1, 17);
+ gsl_test (!status, "trap for n != 2^k in " NAME(gsl_fft_complex) "_radix2_forward");
+
+ status = FUNCTION(gsl_fft_complex,radix2_backward) (complex_data, 1, 17);
+ gsl_test (!status, "trap for n != 2^k in " NAME(gsl_fft_complex) "_radix2_backward");
+
+ status = FUNCTION(gsl_fft_complex,radix2_inverse) (complex_data, 1, 17);
+ gsl_test (!status, "trap for n != 2^k in " NAME(gsl_fft_complex) "_radix2_inverse");
+
+ /* n != wavetable.n in mixed radix routines */
+
+ cw->n = 3;
+ status = FUNCTION(gsl_fft_complex,forward) (complex_data, 1, 4, cw, cwork);
+ gsl_test (!status, "trap for n != nw in " NAME(gsl_fft_complex) "_forward");
+
+ cw->n = 3;
+ status = FUNCTION(gsl_fft_complex,backward) (complex_data, 1, 4, cw, cwork);
+ gsl_test (!status, "trap for n != nw in " NAME(gsl_fft_complex) "_backward");
+
+ cw->n = 3;
+ status = FUNCTION(gsl_fft_complex,inverse) (complex_data, 1, 4, cw, cwork);
+ gsl_test (!status, "trap for n != nw in " NAME(gsl_fft_complex) "_inverse");
+
+ rw->n = 3;
+ status = FUNCTION(gsl_fft_real,transform) (real_data, 1, 4, rw, rwork);
+ gsl_test (!status, "trap for n != nw in " NAME(gsl_fft_real) "_transform");
+
+ hcw->n = 3;
+ status = FUNCTION(gsl_fft_halfcomplex,transform) (real_data, 1, 4, hcw, rwork);
+ gsl_test (!status, "trap for n != nw in " NAME(gsl_fft_halfcomplex) "_transform");
+
+ FUNCTION (gsl_fft_halfcomplex_wavetable,free) (hcw) ;
+ FUNCTION (gsl_fft_real_wavetable,free) (rw) ;
+ FUNCTION (gsl_fft_complex_wavetable,free) (cw) ;
+
+ FUNCTION (gsl_fft_real_workspace,free) (rwork) ;
+ FUNCTION (gsl_fft_complex_workspace,free) (cwork) ;
+
+}
+
+
+
+
diff --git a/gsl-1.9/fft/urand.c b/gsl-1.9/fft/urand.c
new file mode 100644
index 0000000..3a0fccf
--- /dev/null
+++ b/gsl-1.9/fft/urand.c
@@ -0,0 +1,26 @@
+/* fft/urand.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+double urand (void);
+
+double urand (void) {
+ static unsigned long int x = 1;
+ x = (1103515245 * x + 12345) & 0x7fffffffUL ;
+ return x / 2147483648.0 ;
+}
diff --git a/gsl-1.9/fit/ChangeLog b/gsl-1.9/fit/ChangeLog
new file mode 100644
index 0000000..c32f572
--- /dev/null
+++ b/gsl-1.9/fit/ChangeLog
@@ -0,0 +1,8 @@
+2004-12-23 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_fit.h: remove unused declarations
+
+Tue Sep 19 19:09:46 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * fit/test.c (main): removed unused variables
+
diff --git a/gsl-1.9/fit/Makefile.am b/gsl-1.9/fit/Makefile.am
new file mode 100644
index 0000000..675e98d
--- /dev/null
+++ b/gsl-1.9/fit/Makefile.am
@@ -0,0 +1,18 @@
+noinst_LTLIBRARIES = libgslfit.la
+
+pkginclude_HEADERS = gsl_fit.h
+
+INCLUDES= -I$(top_builddir)
+
+libgslfit_la_SOURCES = linear.c
+
+check_PROGRAMS = test #demo
+
+TESTS = $(check_PROGRAMS)
+
+test_SOURCES = test.c
+test_LDADD = libgslfit.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../utils/libutils.la ../sys/libgslsys.la
+
+#demo_SOURCES = demo.c
+#demo_LDADD = libgslfit.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../utils/libutils.la ../sys/libgslsys.la
+
diff --git a/gsl-1.9/fit/Makefile.in b/gsl-1.9/fit/Makefile.in
new file mode 100644
index 0000000..9365efd
--- /dev/null
+++ b/gsl-1.9/fit/Makefile.in
@@ -0,0 +1,546 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = test$(EXEEXT)
+subdir = fit
+DIST_COMMON = $(pkginclude_HEADERS) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in ChangeLog
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgslfit_la_LIBADD =
+am_libgslfit_la_OBJECTS = linear.lo
+libgslfit_la_OBJECTS = $(am_libgslfit_la_OBJECTS)
+am_test_OBJECTS = test.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = libgslfit.la ../ieee-utils/libgslieeeutils.la \
+ ../err/libgslerr.la ../test/libgsltest.la ../utils/libutils.la \
+ ../sys/libgslsys.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgslfit_la_SOURCES) $(test_SOURCES)
+DIST_SOURCES = $(libgslfit_la_SOURCES) $(test_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libgslfit.la
+pkginclude_HEADERS = gsl_fit.h
+INCLUDES = -I$(top_builddir)
+libgslfit_la_SOURCES = linear.c
+TESTS = $(check_PROGRAMS)
+test_SOURCES = test.c
+test_LDADD = libgslfit.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../utils/libutils.la ../sys/libgslsys.la
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps fit/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps fit/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgslfit.la: $(libgslfit_la_OBJECTS) $(libgslfit_la_DEPENDENCIES)
+ $(LINK) $(libgslfit_la_LDFLAGS) $(libgslfit_la_OBJECTS) $(libgslfit_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkgincludeHEADERS
+
+
+#demo_SOURCES = demo.c
+#demo_LDADD = libgslfit.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../utils/libutils.la ../sys/libgslsys.la
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/fit/gsl_fit.h b/gsl-1.9/fit/gsl_fit.h
new file mode 100644
index 0000000..bacfe7d
--- /dev/null
+++ b/gsl-1.9/fit/gsl_fit.h
@@ -0,0 +1,85 @@
+/* fit/gsl_fit.h
+ *
+ * Copyright (C) 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_FIT_H__
+#define __GSL_FIT_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+int gsl_fit_linear (const double * x, const size_t xstride,
+ const double * y, const size_t ystride,
+ const size_t n,
+ double * c0, double * c1,
+ double * cov00, double * cov01, double * cov11,
+ double * sumsq);
+
+
+int gsl_fit_wlinear (const double * x, const size_t xstride,
+ const double * w, const size_t wstride,
+ const double * y, const size_t ystride,
+ const size_t n,
+ double * c0, double * c1,
+ double * cov00, double * cov01, double * cov11,
+ double * chisq);
+
+int
+gsl_fit_linear_est (const double x,
+ const double c0, const double c1,
+ const double c00, const double c01, const double c11,
+ double *y, double *y_err);
+
+
+int gsl_fit_mul (const double * x, const size_t xstride,
+ const double * y, const size_t ystride,
+ const size_t n,
+ double * c1,
+ double * cov11,
+ double * sumsq);
+
+int gsl_fit_wmul (const double * x, const size_t xstride,
+ const double * w, const size_t wstride,
+ const double * y, const size_t ystride,
+ const size_t n,
+ double * c1,
+ double * cov11,
+ double * sumsq);
+
+
+int
+gsl_fit_mul_est (const double x,
+ const double c1,
+ const double c11,
+ double *y, double *y_err);
+
+__END_DECLS
+
+#endif /* __GSL_FIT_H__ */
diff --git a/gsl-1.9/fit/linear.c b/gsl-1.9/fit/linear.c
new file mode 100644
index 0000000..ef5ae5e
--- /dev/null
+++ b/gsl-1.9/fit/linear.c
@@ -0,0 +1,346 @@
+/* fit/linear.c
+ *
+ * Copyright (C) 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_fit.h>
+
+/* Fit the data (x_i, y_i) to the linear relationship
+
+ Y = c0 + c1 x
+
+ returning,
+
+ c0, c1 -- coefficients
+ cov00, cov01, cov11 -- variance-covariance matrix of c0 and c1,
+ sumsq -- sum of squares of residuals
+
+ This fit can be used in the case where the errors for the data are
+ uknown, but assumed equal for all points. The resulting
+ variance-covariance matrix estimates the error in the coefficients
+ from the observed variance of the points around the best fit line.
+*/
+
+int
+gsl_fit_linear (const double *x, const size_t xstride,
+ const double *y, const size_t ystride,
+ const size_t n,
+ double *c0, double *c1,
+ double *cov_00, double *cov_01, double *cov_11, double *sumsq)
+{
+ double m_x = 0, m_y = 0, m_dx2 = 0, m_dxdy = 0;
+
+ size_t i;
+
+ for (i = 0; i < n; i++)
+ {
+ m_x += (x[i * xstride] - m_x) / (i + 1.0);
+ m_y += (y[i * ystride] - m_y) / (i + 1.0);
+ }
+
+ for (i = 0; i < n; i++)
+ {
+ const double dx = x[i * xstride] - m_x;
+ const double dy = y[i * ystride] - m_y;
+
+ m_dx2 += (dx * dx - m_dx2) / (i + 1.0);
+ m_dxdy += (dx * dy - m_dxdy) / (i + 1.0);
+ }
+
+ /* In terms of y = a + b x */
+
+ {
+ double s2 = 0, d2 = 0;
+ double b = m_dxdy / m_dx2;
+ double a = m_y - m_x * b;
+
+ *c0 = a;
+ *c1 = b;
+
+ /* Compute chi^2 = \sum (y_i - (a + b * x_i))^2 */
+
+ for (i = 0; i < n; i++)
+ {
+ const double dx = x[i * xstride] - m_x;
+ const double dy = y[i * ystride] - m_y;
+ const double d = dy - b * dx;
+ d2 += d * d;
+ }
+
+ s2 = d2 / (n - 2.0); /* chisq per degree of freedom */
+
+ *cov_00 = s2 * (1.0 / n) * (1 + m_x * m_x / m_dx2);
+ *cov_11 = s2 * 1.0 / (n * m_dx2);
+
+ *cov_01 = s2 * (-m_x) / (n * m_dx2);
+
+ *sumsq = d2;
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+/* Fit the weighted data (x_i, w_i, y_i) to the linear relationship
+
+ Y = c0 + c1 x
+
+ returning,
+
+ c0, c1 -- coefficients
+ s0, s1 -- the standard deviations of c0 and c1,
+ r -- the correlation coefficient between c0 and c1,
+ chisq -- weighted sum of squares of residuals */
+
+int
+gsl_fit_wlinear (const double *x, const size_t xstride,
+ const double *w, const size_t wstride,
+ const double *y, const size_t ystride,
+ const size_t n,
+ double *c0, double *c1,
+ double *cov_00, double *cov_01, double *cov_11,
+ double *chisq)
+{
+
+ /* compute the weighted means and weighted deviations from the means */
+
+ /* wm denotes a "weighted mean", wm(f) = (sum_i w_i f_i) / (sum_i w_i) */
+
+ double W = 0, wm_x = 0, wm_y = 0, wm_dx2 = 0, wm_dxdy = 0;
+
+ size_t i;
+
+ for (i = 0; i < n; i++)
+ {
+ const double wi = w[i * wstride];
+
+ if (wi > 0)
+ {
+ W += wi;
+ wm_x += (x[i * xstride] - wm_x) * (wi / W);
+ wm_y += (y[i * ystride] - wm_y) * (wi / W);
+ }
+ }
+
+ W = 0; /* reset the total weight */
+
+ for (i = 0; i < n; i++)
+ {
+ const double wi = w[i * wstride];
+
+ if (wi > 0)
+ {
+ const double dx = x[i * xstride] - wm_x;
+ const double dy = y[i * ystride] - wm_y;
+
+ W += wi;
+ wm_dx2 += (dx * dx - wm_dx2) * (wi / W);
+ wm_dxdy += (dx * dy - wm_dxdy) * (wi / W);
+ }
+ }
+
+ /* In terms of y = a + b x */
+
+ {
+ double d2 = 0;
+ double b = wm_dxdy / wm_dx2;
+ double a = wm_y - wm_x * b;
+
+ *c0 = a;
+ *c1 = b;
+
+ *cov_00 = (1 / W) * (1 + wm_x * wm_x / wm_dx2);
+ *cov_11 = 1 / (W * wm_dx2);
+
+ *cov_01 = -wm_x / (W * wm_dx2);
+
+ /* Compute chi^2 = \sum w_i (y_i - (a + b * x_i))^2 */
+
+ for (i = 0; i < n; i++)
+ {
+ const double wi = w[i * wstride];
+
+ if (wi > 0)
+ {
+ const double dx = x[i * xstride] - wm_x;
+ const double dy = y[i * ystride] - wm_y;
+ const double d = dy - b * dx;
+ d2 += wi * d * d;
+ }
+ }
+
+ *chisq = d2;
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+
+int
+gsl_fit_linear_est (const double x,
+ const double c0, const double c1,
+ const double c00, const double c01, const double c11,
+ double *y, double *y_err)
+{
+ *y = c0 + c1 * x;
+ *y_err = sqrt (c00 + x * (2 * c01 + c11 * x));
+ return GSL_SUCCESS;
+}
+
+
+int
+gsl_fit_mul (const double *x, const size_t xstride,
+ const double *y, const size_t ystride,
+ const size_t n,
+ double *c1, double *cov_11, double *sumsq)
+{
+ double m_x = 0, m_y = 0, m_dx2 = 0, m_dxdy = 0;
+
+ size_t i;
+
+ for (i = 0; i < n; i++)
+ {
+ m_x += (x[i * xstride] - m_x) / (i + 1.0);
+ m_y += (y[i * ystride] - m_y) / (i + 1.0);
+ }
+
+ for (i = 0; i < n; i++)
+ {
+ const double dx = x[i * xstride] - m_x;
+ const double dy = y[i * ystride] - m_y;
+
+ m_dx2 += (dx * dx - m_dx2) / (i + 1.0);
+ m_dxdy += (dx * dy - m_dxdy) / (i + 1.0);
+ }
+
+ /* In terms of y = b x */
+
+ {
+ double s2 = 0, d2 = 0;
+ double b = (m_x * m_y + m_dxdy) / (m_x * m_x + m_dx2);
+
+ *c1 = b;
+
+ /* Compute chi^2 = \sum (y_i - b * x_i)^2 */
+
+ for (i = 0; i < n; i++)
+ {
+ const double dx = x[i * xstride] - m_x;
+ const double dy = y[i * ystride] - m_y;
+ const double d = (m_y - b * m_x) + dy - b * dx;
+ d2 += d * d;
+ }
+
+ s2 = d2 / (n - 1.0); /* chisq per degree of freedom */
+
+ *cov_11 = s2 * 1.0 / (n * (m_x * m_x + m_dx2));
+
+ *sumsq = d2;
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+int
+gsl_fit_wmul (const double *x, const size_t xstride,
+ const double *w, const size_t wstride,
+ const double *y, const size_t ystride,
+ const size_t n,
+ double *c1, double *cov_11, double *chisq)
+{
+
+ /* compute the weighted means and weighted deviations from the means */
+
+ /* wm denotes a "weighted mean", wm(f) = (sum_i w_i f_i) / (sum_i w_i) */
+
+ double W = 0, wm_x = 0, wm_y = 0, wm_dx2 = 0, wm_dxdy = 0;
+
+ size_t i;
+
+ for (i = 0; i < n; i++)
+ {
+ const double wi = w[i * wstride];
+
+ if (wi > 0)
+ {
+ W += wi;
+ wm_x += (x[i * xstride] - wm_x) * (wi / W);
+ wm_y += (y[i * ystride] - wm_y) * (wi / W);
+ }
+ }
+
+ W = 0; /* reset the total weight */
+
+ for (i = 0; i < n; i++)
+ {
+ const double wi = w[i * wstride];
+
+ if (wi > 0)
+ {
+ const double dx = x[i * xstride] - wm_x;
+ const double dy = y[i * ystride] - wm_y;
+
+ W += wi;
+ wm_dx2 += (dx * dx - wm_dx2) * (wi / W);
+ wm_dxdy += (dx * dy - wm_dxdy) * (wi / W);
+ }
+ }
+
+ /* In terms of y = b x */
+
+ {
+ double d2 = 0;
+ double b = (wm_x * wm_y + wm_dxdy) / (wm_x * wm_x + wm_dx2);
+
+ *c1 = b;
+
+ *cov_11 = 1 / (W * (wm_x * wm_x + wm_dx2));
+
+ /* Compute chi^2 = \sum w_i (y_i - b * x_i)^2 */
+
+ for (i = 0; i < n; i++)
+ {
+ const double wi = w[i * wstride];
+
+ if (wi > 0)
+ {
+ const double dx = x[i * xstride] - wm_x;
+ const double dy = y[i * ystride] - wm_y;
+ const double d = (wm_y - b * wm_x) + (dy - b * dx);
+ d2 += wi * d * d;
+ }
+ }
+
+ *chisq = d2;
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+gsl_fit_mul_est (const double x,
+ const double c1, const double c11,
+ double *y, double *y_err)
+{
+ *y = c1 * x;
+ *y_err = sqrt (c11) * fabs (x);
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/fit/test.c b/gsl-1.9/fit/test.c
new file mode 100644
index 0000000..2555522
--- /dev/null
+++ b/gsl-1.9/fit/test.c
@@ -0,0 +1,173 @@
+/* These tests are based on the NIST Statistical Reference Datasets
+ See http://www.nist.gov/itl/div898/strd/index.html for more
+ information. */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_fit.h>
+
+#include <gsl/gsl_ieee_utils.h>
+
+size_t norris_n = 36;
+
+double norris_x[] = { 0.2, 337.4, 118.2, 884.6, 10.1, 226.5, 666.3, 996.3,
+ 448.6, 777.0, 558.2, 0.4, 0.6, 775.5, 666.9, 338.0,
+ 447.5, 11.6, 556.0, 228.1, 995.8, 887.6, 120.2, 0.3,
+ 0.3, 556.8, 339.1, 887.2, 999.0, 779.0, 11.1, 118.3,
+ 229.2, 669.1, 448.9, 0.5 } ;
+
+double norris_y[] = { 0.1, 338.8, 118.1, 888.0, 9.2, 228.1, 668.5, 998.5,
+ 449.1, 778.9, 559.2, 0.3, 0.1, 778.1, 668.8, 339.3,
+ 448.9, 10.8, 557.7, 228.3, 998.0, 888.8, 119.6, 0.3,
+ 0.6, 557.6, 339.3, 888.0, 998.5, 778.9, 10.2, 117.6,
+ 228.9, 668.4, 449.2, 0.2};
+
+size_t noint1_n = 11;
+double noint1_x[] = { 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70 };
+double noint1_y[] = { 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140};
+
+size_t noint2_n = 3;
+double noint2_x[] = { 4, 5, 6 } ;
+double noint2_y[] = { 3, 4, 4 } ;
+
+int
+main (void)
+{
+
+
+ double x[1000], y[1000], w[1000];
+
+ size_t xstride = 2, wstride = 3, ystride = 5;
+ size_t i;
+
+ for (i = 0; i < norris_n; i++)
+ {
+ x[i*xstride] = norris_x[i];
+ w[i*wstride] = 1.0;
+ y[i*ystride] = norris_y[i];
+ }
+
+ gsl_ieee_env_setup();
+
+ {
+ double c0, c1, cov00, cov01, cov11, sumsq;
+
+ double expected_c0 = -0.262323073774029;
+ double expected_c1 = 1.00211681802045;
+ double expected_cov00 = pow(0.232818234301152, 2.0);
+ double expected_cov01 = -7.74327536339570e-05; /* computed from octave */
+ double expected_cov11 = pow(0.429796848199937E-03, 2.0);
+ double expected_sumsq = 26.6173985294224;
+
+ gsl_fit_linear (x, xstride, y, ystride, norris_n,
+ &c0, &c1, &cov00, &cov01, &cov11, &sumsq);
+
+ /* gsl_fit_wlinear (x, xstride, w, wstride, y, ystride, norris_n,
+ &c0, &c1, &cov00, &cov01, &cov11, &sumsq); */
+
+ gsl_test_rel (c0, expected_c0, 1e-10, "norris gsl_fit_linear c0") ;
+ gsl_test_rel (c1, expected_c1, 1e-10, "norris gsl_fit_linear c1") ;
+ gsl_test_rel (cov00, expected_cov00, 1e-10, "norris gsl_fit_linear cov00") ;
+ gsl_test_rel (cov01, expected_cov01, 1e-10, "norris gsl_fit_linear cov01") ;
+ gsl_test_rel (cov11, expected_cov11, 1e-10, "norris gsl_fit_linear cov11") ;
+ gsl_test_rel (sumsq, expected_sumsq, 1e-10, "norris gsl_fit_linear sumsq") ;
+ }
+
+ {
+ double c0, c1, cov00, cov01, cov11, sumsq;
+
+ double expected_c0 = -0.262323073774029;
+ double expected_c1 = 1.00211681802045;
+ double expected_cov00 = 6.92384428759429e-02; /* computed from octave */
+ double expected_cov01 = -9.89095016390515e-05; /* computed from octave */
+ double expected_cov11 = 2.35960747164148e-07; /* computed from octave */
+ double expected_sumsq = 26.6173985294224;
+
+ gsl_fit_wlinear (x, xstride, w, wstride, y, ystride, norris_n,
+ &c0, &c1, &cov00, &cov01, &cov11, &sumsq);
+
+ gsl_test_rel (c0, expected_c0, 1e-10, "norris gsl_fit_wlinear c0") ;
+ gsl_test_rel (c1, expected_c1, 1e-10, "norris gsl_fit_wlinear c1") ;
+ gsl_test_rel (cov00, expected_cov00, 1e-10, "norris gsl_fit_wlinear cov00") ;
+ gsl_test_rel (cov01, expected_cov01, 1e-10, "norris gsl_fit_wlinear cov01") ;
+ gsl_test_rel (cov11, expected_cov11, 1e-10, "norris gsl_fit_wlinear cov11") ;
+ gsl_test_rel (sumsq, expected_sumsq, 1e-10, "norris gsl_fit_wlinear sumsq") ;
+ }
+
+ for (i = 0; i < noint1_n; i++)
+ {
+ x[i*xstride] = noint1_x[i];
+ w[i*wstride] = 1.0;
+ y[i*ystride] = noint1_y[i];
+ }
+
+ {
+ double c1, cov11, sumsq;
+
+ double expected_c1 = 2.07438016528926;
+ double expected_cov11 = pow(0.165289256198347E-01, 2.0);
+ double expected_sumsq = 127.272727272727;
+
+ gsl_fit_mul (x, xstride, y, ystride, noint1_n, &c1, &cov11, &sumsq);
+
+ gsl_test_rel (c1, expected_c1, 1e-10, "noint1 gsl_fit_mul c1") ;
+ gsl_test_rel (cov11, expected_cov11, 1e-10, "noint1 gsl_fit_mul cov11") ;
+ gsl_test_rel (sumsq, expected_sumsq, 1e-10, "noint1 gsl_fit_mul sumsq") ;
+ }
+
+ {
+ double c1, cov11, sumsq;
+
+ double expected_c1 = 2.07438016528926;
+ double expected_cov11 = 2.14661371686165e-05; /* computed from octave */
+ double expected_sumsq = 127.272727272727;
+
+ gsl_fit_wmul (x, xstride, w, wstride, y, ystride, noint1_n, &c1, &cov11, &sumsq);
+
+ gsl_test_rel (c1, expected_c1, 1e-10, "noint1 gsl_fit_wmul c1") ;
+ gsl_test_rel (cov11, expected_cov11, 1e-10, "noint1 gsl_fit_wmul cov11") ;
+ gsl_test_rel (sumsq, expected_sumsq, 1e-10, "noint1 gsl_fit_wmul sumsq") ;
+ }
+
+
+ for (i = 0; i < noint2_n; i++)
+ {
+ x[i*xstride] = noint2_x[i];
+ w[i*wstride] = 1.0;
+ y[i*ystride] = noint2_y[i];
+ }
+
+ {
+ double c1, cov11, sumsq;
+
+ double expected_c1 = 0.727272727272727;
+ double expected_cov11 = pow(0.420827318078432E-01, 2.0);
+ double expected_sumsq = 0.272727272727273;
+
+ gsl_fit_mul (x, xstride, y, ystride, noint2_n, &c1, &cov11, &sumsq);
+
+ gsl_test_rel (c1, expected_c1, 1e-10, "noint2 gsl_fit_mul c1") ;
+ gsl_test_rel (cov11, expected_cov11, 1e-10, "noint2 gsl_fit_mul cov11") ;
+ gsl_test_rel (sumsq, expected_sumsq, 1e-10, "noint2 gsl_fit_mul sumsq") ;
+ }
+
+ {
+ double c1, cov11, sumsq;
+
+ double expected_c1 = 0.727272727272727;
+ double expected_cov11 = 1.29870129870130e-02 ; /* computed from octave */
+ double expected_sumsq = 0.272727272727273;
+
+ gsl_fit_wmul (x, xstride, w, wstride, y, ystride, noint2_n, &c1, &cov11, &sumsq);
+
+ gsl_test_rel (c1, expected_c1, 1e-10, "noint2 gsl_fit_wmul c1") ;
+ gsl_test_rel (cov11, expected_cov11, 1e-10, "noint2 gsl_fit_wmul cov11") ;
+ gsl_test_rel (sumsq, expected_sumsq, 1e-10, "noint2 gsl_fit_wmul sumsq") ;
+ }
+
+ /* now summarize the results */
+
+ exit (gsl_test_summary ());
+}
diff --git a/gsl-1.9/gsl-config.in b/gsl-1.9/gsl-config.in
new file mode 100755
index 0000000..29092f6
--- /dev/null
+++ b/gsl-1.9/gsl-config.in
@@ -0,0 +1,80 @@
+#! /bin/sh
+
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+includedir=@includedir@
+
+usage()
+{
+ cat <<EOF
+Usage: gsl-config [OPTION]
+
+Known values for OPTION are:
+
+ --prefix show GSL installation prefix
+ --libs print library linking information, with cblas
+ --libs-without-cblas print library linking information, without cblas
+ --cflags print pre-processor and compiler flags
+ --help display this help and exit
+ --version output version information
+
+An external CBLAS library can be specified using the GSL_CBLAS_LIB
+environment variable. The GSL CBLAS library is used by default.
+
+EOF
+
+ exit $1
+}
+
+if test $# -eq 0; then
+ usage 1
+fi
+
+cflags=false
+libs=false
+
+while test $# -gt 0; do
+ case "$1" in
+ -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) optarg= ;;
+ esac
+
+ case "$1" in
+ --prefix=*)
+ prefix=$optarg
+ ;;
+
+ --prefix)
+ echo $prefix
+ ;;
+
+ --version)
+ echo @VERSION@
+ exit 0
+ ;;
+
+ --help)
+ usage 0
+ ;;
+
+ --cflags)
+ echo @GSL_CFLAGS@
+ ;;
+
+ --libs)
+ : ${GSL_CBLAS_LIB=-lgslcblas}
+ echo @GSL_LIBS@ $GSL_CBLAS_LIB -lm
+ ;;
+
+ --libs-without-cblas)
+ echo @GSL_LIBS@ -lm
+ ;;
+ *)
+ usage
+ exit 1
+ ;;
+ esac
+ shift
+done
+
+exit 0
diff --git a/gsl-1.9/gsl-histogram.c b/gsl-1.9/gsl-histogram.c
new file mode 100644
index 0000000..ee1e2dd
--- /dev/null
+++ b/gsl-1.9/gsl-histogram.c
@@ -0,0 +1,78 @@
+/* histogram/gsl-histogram.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <gsl/gsl_histogram.h>
+
+int
+main (int argc, char **argv)
+{
+ double a = 0.0, b = 1.0;
+ size_t n = 10;
+
+ if (argc != 3 && argc !=4)
+ {
+ printf ("Usage: gsl-histogram xmin xmax [n]\n");
+ printf (
+"Computes a histogram of the data on stdin using n bins from xmin to xmax.\n"
+"If n is unspecified then bins of integer width are used.\n");
+ exit (0);
+ }
+
+ a = atof (argv[1]);
+ b = atof (argv[2]);
+
+ if (argc == 4)
+ {
+ n = atoi (argv[3]);
+ }
+ else
+ {
+ n = (int)(b - a) ;
+ }
+
+ {
+ double x;
+ gsl_histogram *h = gsl_histogram_alloc (n);
+
+ gsl_histogram_set_ranges_uniform (h, a, b);
+
+ while (fscanf(stdin, "%lg", &x) == 1)
+ {
+ gsl_histogram_increment(h, x);
+ }
+
+#ifdef DISPLAY_STATS
+ {
+ double mean = gsl_histogram_mean (h);
+ double sigma = gsl_histogram_sigma (h);
+ fprintf (stdout, "# mean = %g\n", mean);
+ fprintf (stdout, "# sigma = %g\n", sigma);
+ }
+#endif
+
+ gsl_histogram_fprintf (stdout, h, "%g", "%g");
+
+ gsl_histogram_free (h);
+ }
+
+ return 0;
+}
diff --git a/gsl-1.9/gsl-randist.c b/gsl-1.9/gsl-randist.c
new file mode 100644
index 0000000..714493d
--- /dev/null
+++ b/gsl-1.9/gsl-randist.c
@@ -0,0 +1,393 @@
+/* randist/gsl-randist.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+
+#include <gsl/gsl_randist.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_test.h>
+
+void error (const char * s);
+
+
+int
+main (int argc, char *argv[])
+{
+ size_t i,j;
+ size_t n = 0;
+ double mu = 0, nu = 0, nu1 = 0, nu2 = 0, sigma = 0, a = 0, b = 0, c = 0;
+ double zeta = 0, sigmax = 0, sigmay = 0, rho = 0;
+ double p = 0;
+ double x = 0, y =0, z=0 ;
+ unsigned int N = 0, t = 0, n1 = 0, n2 = 0 ;
+ unsigned long int seed = 0 ;
+ const char * name ;
+ gsl_rng * r ;
+
+ if (argc < 4)
+ {
+ printf (
+"Usage: gsl-randist seed n DIST param1 param2 ...\n"
+"Generates n samples from the distribution DIST with parameters param1,\n"
+"param2, etc. Valid distributions are,\n"
+"\n"
+" beta\n"
+" binomial\n"
+" bivariate-gaussian\n"
+" cauchy\n"
+" chisq\n"
+" dir-2d\n"
+" dir-3d\n"
+" dir-nd\n"
+" erlang\n"
+" exponential\n"
+" exppow\n"
+" fdist\n"
+" flat\n"
+" gamma\n"
+" gaussian-tail\n"
+" gaussian\n"
+" geometric\n"
+" gumbel1\n"
+" gumbel2\n"
+" hypergeometric\n"
+" laplace\n"
+" landau\n"
+" levy\n"
+" levy-skew\n"
+" logarithmic\n"
+" logistic\n"
+" lognormal\n"
+" negative-binomial\n"
+" pareto\n"
+" pascal\n"
+" poisson\n"
+" rayleigh-tail\n"
+" rayleigh\n"
+" tdist\n"
+" ugaussian-tail\n"
+" ugaussian\n"
+" weibull\n") ;
+ exit (0);
+ }
+
+ argv++ ; seed = atol (argv[0]); argc-- ;
+ argv++ ; n = atol (argv[0]); argc-- ;
+ argv++ ; name = argv[0] ; argc-- ; argc-- ;
+
+ gsl_rng_env_setup() ;
+
+ if (gsl_rng_default_seed != 0) {
+ fprintf(stderr,
+ "overriding GSL_RNG_SEED with command line value, seed = %ld\n",
+ seed) ;
+ }
+
+ gsl_rng_default_seed = seed ;
+
+ r = gsl_rng_alloc(gsl_rng_default) ;
+
+
+#define NAME(x) !strcmp(name,(x))
+#define OUTPUT(x) for (i = 0; i < n; i++) { printf("%g\n", (x)) ; }
+#define OUTPUT1(a,x) for(i = 0; i < n; i++) { a ; printf("%g\n", x) ; }
+#define OUTPUT2(a,x,y) for(i = 0; i < n; i++) { a ; printf("%g %g\n", x, y) ; }
+#define OUTPUT3(a,x,y,z) for(i = 0; i < n; i++) { a ; printf("%g %g %g\n", x, y, z) ; }
+#define INT_OUTPUT(x) for (i = 0; i < n; i++) { printf("%d\n", (x)) ; }
+#define ARGS(x,y) if (argc != x) error(y) ;
+#define DBL_ARG(x) if (argc) { x=atof((++argv)[0]);argc--;} else {error( #x);};
+#define INT_ARG(x) if (argc) { x=atoi((++argv)[0]);argc--;} else {error( #x);};
+
+ if (NAME("bernoulli"))
+ {
+ ARGS(1, "p = probability of success");
+ DBL_ARG(p)
+ INT_OUTPUT(gsl_ran_bernoulli (r, p));
+ }
+ else if (NAME("beta"))
+ {
+ ARGS(2, "a,b = shape parameters");
+ DBL_ARG(a)
+ DBL_ARG(b)
+ OUTPUT(gsl_ran_beta (r, a, b));
+ }
+ else if (NAME("binomial"))
+ {
+ ARGS(2, "p = probability, N = number of trials");
+ DBL_ARG(p)
+ INT_ARG(N)
+ INT_OUTPUT(gsl_ran_binomial (r, p, N));
+ }
+ else if (NAME("cauchy"))
+ {
+ ARGS(1, "a = scale parameter");
+ DBL_ARG(a)
+ OUTPUT(gsl_ran_cauchy (r, a));
+ }
+ else if (NAME("chisq"))
+ {
+ ARGS(1, "nu = degrees of freedom");
+ DBL_ARG(nu)
+ OUTPUT(gsl_ran_chisq (r, nu));
+ }
+ else if (NAME("erlang"))
+ {
+ ARGS(2, "a = scale parameter, b = order");
+ DBL_ARG(a)
+ DBL_ARG(b)
+ OUTPUT(gsl_ran_erlang (r, a, b));
+ }
+ else if (NAME("exponential"))
+ {
+ ARGS(1, "mu = mean value");
+ DBL_ARG(mu) ;
+ OUTPUT(gsl_ran_exponential (r, mu));
+ }
+ else if (NAME("exppow"))
+ {
+ ARGS(2, "a = scale parameter, b = power (1=exponential, 2=gaussian)");
+ DBL_ARG(a) ;
+ DBL_ARG(b) ;
+ OUTPUT(gsl_ran_exppow (r, a, b));
+ }
+ else if (NAME("fdist"))
+ {
+ ARGS(2, "nu1, nu2 = degrees of freedom parameters");
+ DBL_ARG(nu1) ;
+ DBL_ARG(nu2) ;
+ OUTPUT(gsl_ran_fdist (r, nu1, nu2));
+ }
+ else if (NAME("flat"))
+ {
+ ARGS(2, "a = lower limit, b = upper limit");
+ DBL_ARG(a) ;
+ DBL_ARG(b) ;
+ OUTPUT(gsl_ran_flat (r, a, b));
+ }
+ else if (NAME("gamma"))
+ {
+ ARGS(2, "a = order, b = scale");
+ DBL_ARG(a) ;
+ DBL_ARG(b) ;
+ OUTPUT(gsl_ran_gamma (r, a, b));
+ }
+ else if (NAME("gaussian"))
+ {
+ ARGS(1, "sigma = standard deviation");
+ DBL_ARG(sigma) ;
+ OUTPUT(gsl_ran_gaussian (r, sigma));
+ }
+ else if (NAME("gaussian-tail"))
+ {
+ ARGS(2, "a = lower limit, sigma = standard deviation");
+ DBL_ARG(a) ;
+ DBL_ARG(sigma) ;
+ OUTPUT(gsl_ran_gaussian_tail (r, a, sigma));
+ }
+ else if (NAME("ugaussian"))
+ {
+ ARGS(0, "unit gaussian, no parameters required");
+ OUTPUT(gsl_ran_ugaussian (r));
+ }
+ else if (NAME("ugaussian-tail"))
+ {
+ ARGS(1, "a = lower limit");
+ DBL_ARG(a) ;
+ OUTPUT(gsl_ran_ugaussian_tail (r, a));
+ }
+ else if (NAME("bivariate-gaussian"))
+ {
+ ARGS(3, "sigmax = x std.dev., sigmay = y std.dev., rho = correlation");
+ DBL_ARG(sigmax) ;
+ DBL_ARG(sigmay) ;
+ DBL_ARG(rho) ;
+ OUTPUT2(gsl_ran_bivariate_gaussian (r, sigmax, sigmay, rho, &x, &y),
+ x, y);
+ }
+ else if (NAME("dir-2d"))
+ {
+ OUTPUT2(gsl_ran_dir_2d (r, &x, &y), x, y);
+ }
+ else if (NAME("dir-3d"))
+ {
+ OUTPUT3(gsl_ran_dir_3d (r, &x, &y, &z), x, y, z);
+ }
+ else if (NAME("dir-nd"))
+ {
+ double *xarr;
+ ARGS(1, "n1 = number of dimensions of hypersphere");
+ INT_ARG(n1) ;
+ xarr = (double *)malloc(n1*sizeof(double));
+
+ for(i = 0; i < n; i++) {
+ gsl_ran_dir_nd (r, n1, xarr) ;
+ for (j = 0; j < n1; j++) {
+ if (j) putchar(' ');
+ printf("%g", xarr[j]) ;
+ }
+ putchar('\n');
+ } ;
+
+ free(xarr);
+ }
+ else if (NAME("geometric"))
+ {
+ ARGS(1, "p = bernoulli trial probability of success");
+ DBL_ARG(p) ;
+ INT_OUTPUT(gsl_ran_geometric (r, p));
+ }
+ else if (NAME("gumbel1"))
+ {
+ ARGS(2, "a = order, b = scale parameter");
+ DBL_ARG(a) ;
+ DBL_ARG(b) ;
+ OUTPUT(gsl_ran_gumbel1 (r, a, b));
+ }
+ else if (NAME("gumbel2"))
+ {
+ ARGS(2, "a = order, b = scale parameter");
+ DBL_ARG(a) ;
+ DBL_ARG(b) ;
+ OUTPUT(gsl_ran_gumbel2 (r, a, b));
+ }
+ else if (NAME("hypergeometric"))
+ {
+ ARGS(3, "n1 = tagged population, n2 = untagged population, t = number of trials");
+ INT_ARG(n1) ;
+ INT_ARG(n2) ;
+ INT_ARG(t) ;
+ INT_OUTPUT(gsl_ran_hypergeometric (r, n1, n2, t));
+ }
+ else if (NAME("laplace"))
+ {
+ ARGS(1, "a = scale parameter");
+ DBL_ARG(a) ;
+ OUTPUT(gsl_ran_laplace (r, a));
+ }
+ else if (NAME("landau"))
+ {
+ ARGS(0, "no arguments required");
+ OUTPUT(gsl_ran_landau (r));
+ }
+ else if (NAME("levy"))
+ {
+ ARGS(2, "c = scale, a = power (1=cauchy, 2=gaussian)");
+ DBL_ARG(c) ;
+ DBL_ARG(a) ;
+ OUTPUT(gsl_ran_levy (r, c, a));
+ }
+ else if (NAME("levy-skew"))
+ {
+ ARGS(3, "c = scale, a = power (1=cauchy, 2=gaussian), b = skew");
+ DBL_ARG(c) ;
+ DBL_ARG(a) ;
+ DBL_ARG(b) ;
+ OUTPUT(gsl_ran_levy_skew (r, c, a, b));
+ }
+ else if (NAME("logarithmic"))
+ {
+ ARGS(1, "p = probability");
+ DBL_ARG(p) ;
+ INT_OUTPUT(gsl_ran_logarithmic (r, p));
+ }
+ else if (NAME("logistic"))
+ {
+ ARGS(1, "a = scale parameter");
+ DBL_ARG(a) ;
+ OUTPUT(gsl_ran_logistic (r, a));
+ }
+ else if (NAME("lognormal"))
+ {
+ ARGS(2, "zeta = location parameter, sigma = scale parameter");
+ DBL_ARG(zeta) ;
+ DBL_ARG(sigma) ;
+ OUTPUT(gsl_ran_lognormal (r, zeta, sigma));
+ }
+ else if (NAME("negative-binomial"))
+ {
+ ARGS(2, "p = probability, a = order");
+ DBL_ARG(p) ;
+ DBL_ARG(a) ;
+ INT_OUTPUT(gsl_ran_negative_binomial (r, p, a));
+ }
+ else if (NAME("pareto"))
+ {
+ ARGS(2, "a = power, b = scale parameter");
+ DBL_ARG(a) ;
+ DBL_ARG(b) ;
+ OUTPUT(gsl_ran_pareto (r, a, b));
+ }
+ else if (NAME("pascal"))
+ {
+ ARGS(2, "p = probability, n = order (integer)");
+ DBL_ARG(p) ;
+ INT_ARG(N) ;
+ INT_OUTPUT(gsl_ran_pascal (r, p, N));
+ }
+ else if (NAME("poisson"))
+ {
+ ARGS(1, "mu = scale parameter");
+ DBL_ARG(mu) ;
+ INT_OUTPUT(gsl_ran_poisson (r, mu));
+ }
+ else if (NAME("rayleigh"))
+ {
+ ARGS(1, "sigma = scale parameter");
+ DBL_ARG(sigma) ;
+ OUTPUT(gsl_ran_rayleigh (r, sigma));
+ }
+ else if (NAME("rayleigh-tail"))
+ {
+ ARGS(2, "a = lower limit, sigma = scale parameter");
+ DBL_ARG(a) ;
+ DBL_ARG(sigma) ;
+ OUTPUT(gsl_ran_rayleigh_tail (r, a, sigma));
+ }
+ else if (NAME("tdist"))
+ {
+ ARGS(1, "nu = degrees of freedom");
+ DBL_ARG(nu) ;
+ OUTPUT(gsl_ran_tdist (r, nu));
+ }
+ else if (NAME("weibull"))
+ {
+ ARGS(2, "a = scale parameter, b = exponent");
+ DBL_ARG(a) ;
+ DBL_ARG(b) ;
+ OUTPUT(gsl_ran_weibull (r, a, b));
+ }
+ else
+ {
+ fprintf(stderr,"Error: unrecognized distribution: %s\n", name) ;
+ }
+
+ return 0 ;
+}
+
+
+void
+error (const char * s)
+{
+ fprintf(stderr, "Error: arguments should be %s\n",s) ;
+ exit (EXIT_FAILURE) ;
+}
diff --git a/gsl-1.9/gsl.m4 b/gsl-1.9/gsl.m4
new file mode 100644
index 0000000..813dfb6
--- /dev/null
+++ b/gsl-1.9/gsl.m4
@@ -0,0 +1,168 @@
+# Configure path for the GNU Scientific Library
+# Christopher R. Gabriel <cgabriel@linux.it>, April 2000
+
+
+AC_DEFUN([AM_PATH_GSL],
+[
+AC_ARG_WITH(gsl-prefix,[ --with-gsl-prefix=PFX Prefix where GSL is installed (optional)],
+ gsl_prefix="$withval", gsl_prefix="")
+AC_ARG_WITH(gsl-exec-prefix,[ --with-gsl-exec-prefix=PFX Exec prefix where GSL is installed (optional)],
+ gsl_exec_prefix="$withval", gsl_exec_prefix="")
+AC_ARG_ENABLE(gsltest, [ --disable-gsltest Do not try to compile and run a test GSL program],
+ , enable_gsltest=yes)
+
+ if test "x${GSL_CONFIG+set}" != xset ; then
+ if test "x$gsl_prefix" != x ; then
+ GSL_CONFIG="$gsl_prefix/bin/gsl-config"
+ fi
+ if test "x$gsl_exec_prefix" != x ; then
+ GSL_CONFIG="$gsl_exec_prefix/bin/gsl-config"
+ fi
+ fi
+
+ AC_PATH_PROG(GSL_CONFIG, gsl-config, no)
+ min_gsl_version=ifelse([$1], ,0.2.5,$1)
+ AC_MSG_CHECKING(for GSL - version >= $min_gsl_version)
+ no_gsl=""
+ if test "$GSL_CONFIG" = "no" ; then
+ no_gsl=yes
+ else
+ GSL_CFLAGS=`$GSL_CONFIG --cflags`
+ GSL_LIBS=`$GSL_CONFIG --libs`
+
+ gsl_major_version=`$GSL_CONFIG --version | \
+ sed 's/^\([[0-9]]*\).*/\1/'`
+ if test "x${gsl_major_version}" = "x" ; then
+ gsl_major_version=0
+ fi
+
+ gsl_minor_version=`$GSL_CONFIG --version | \
+ sed 's/^\([[0-9]]*\)\.\{0,1\}\([[0-9]]*\).*/\2/'`
+ if test "x${gsl_minor_version}" = "x" ; then
+ gsl_minor_version=0
+ fi
+
+ gsl_micro_version=`$GSL_CONFIG --version | \
+ sed 's/^\([[0-9]]*\)\.\{0,1\}\([[0-9]]*\)\.\{0,1\}\([[0-9]]*\).*/\3/'`
+ if test "x${gsl_micro_version}" = "x" ; then
+ gsl_micro_version=0
+ fi
+
+ if test "x$enable_gsltest" = "xyes" ; then
+ ac_save_CFLAGS="$CFLAGS"
+ ac_save_LIBS="$LIBS"
+ CFLAGS="$CFLAGS $GSL_CFLAGS"
+ LIBS="$LIBS $GSL_LIBS"
+
+ rm -f conf.gsltest
+ AC_TRY_RUN([
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+char* my_strdup (const char *str);
+
+char*
+my_strdup (const char *str)
+{
+ char *new_str;
+
+ if (str)
+ {
+ new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char));
+ strcpy (new_str, str);
+ }
+ else
+ new_str = NULL;
+
+ return new_str;
+}
+
+int main (void)
+{
+ int major = 0, minor = 0, micro = 0;
+ int n;
+ char *tmp_version;
+
+ system ("touch conf.gsltest");
+
+ /* HP/UX 9 (%@#!) writes to sscanf strings */
+ tmp_version = my_strdup("$min_gsl_version");
+
+ n = sscanf(tmp_version, "%d.%d.%d", &major, &minor, &micro) ;
+
+ if (n != 2 && n != 3) {
+ printf("%s, bad version string\n", "$min_gsl_version");
+ exit(1);
+ }
+
+ if (($gsl_major_version > major) ||
+ (($gsl_major_version == major) && ($gsl_minor_version > minor)) ||
+ (($gsl_major_version == major) && ($gsl_minor_version == minor) && ($gsl_micro_version >= micro)))
+ {
+ exit(0);
+ }
+ else
+ {
+ printf("\n*** 'gsl-config --version' returned %d.%d.%d, but the minimum version\n", $gsl_major_version, $gsl_minor_version, $gsl_micro_version);
+ printf("*** of GSL required is %d.%d.%d. If gsl-config is correct, then it is\n", major, minor, micro);
+ printf("*** best to upgrade to the required version.\n");
+ printf("*** If gsl-config was wrong, set the environment variable GSL_CONFIG\n");
+ printf("*** to point to the correct copy of gsl-config, and remove the file\n");
+ printf("*** config.cache before re-running configure\n");
+ exit(1);
+ }
+}
+
+],, no_gsl=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
+ CFLAGS="$ac_save_CFLAGS"
+ LIBS="$ac_save_LIBS"
+ fi
+ fi
+ if test "x$no_gsl" = x ; then
+ AC_MSG_RESULT(yes)
+ ifelse([$2], , :, [$2])
+ else
+ AC_MSG_RESULT(no)
+ if test "$GSL_CONFIG" = "no" ; then
+ echo "*** The gsl-config script installed by GSL could not be found"
+ echo "*** If GSL was installed in PREFIX, make sure PREFIX/bin is in"
+ echo "*** your path, or set the GSL_CONFIG environment variable to the"
+ echo "*** full path to gsl-config."
+ else
+ if test -f conf.gsltest ; then
+ :
+ else
+ echo "*** Could not run GSL test program, checking why..."
+ CFLAGS="$CFLAGS $GSL_CFLAGS"
+ LIBS="$LIBS $GSL_LIBS"
+ AC_TRY_LINK([
+#include <stdio.h>
+], [ return 0; ],
+ [ echo "*** The test program compiled, but did not run. This usually means"
+ echo "*** that the run-time linker is not finding GSL or finding the wrong"
+ echo "*** version of GSL. If it is not finding GSL, you'll need to set your"
+ echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
+ echo "*** to the installed location Also, make sure you have run ldconfig if that"
+ echo "*** is required on your system"
+ echo "***"
+ echo "*** If you have an old version installed, it is best to remove it, although"
+ echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"],
+ [ echo "*** The test program failed to compile or link. See the file config.log for the"
+ echo "*** exact error that occured. This usually means GSL was incorrectly installed"
+ echo "*** or that you have moved GSL since it was installed. In the latter case, you"
+ echo "*** may want to edit the gsl-config script: $GSL_CONFIG" ])
+ CFLAGS="$ac_save_CFLAGS"
+ LIBS="$ac_save_LIBS"
+ fi
+ fi
+# GSL_CFLAGS=""
+# GSL_LIBS=""
+ ifelse([$3], , :, [$3])
+ fi
+ AC_SUBST(GSL_CFLAGS)
+ AC_SUBST(GSL_LIBS)
+ rm -f conf.gsltest
+])
+
+
diff --git a/gsl-1.9/gsl.pc.in b/gsl-1.9/gsl.pc.in
new file mode 100644
index 0000000..7309232
--- /dev/null
+++ b/gsl-1.9/gsl.pc.in
@@ -0,0 +1,10 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: GSL
+Description: GNU Scientific Library
+Version: @VERSION@
+Libs: @GSL_LIBS@ -lgslcblas @LIBS@
+Cflags: @GSL_CFLAGS@
diff --git a/gsl-1.9/gsl.spec.in b/gsl-1.9/gsl.spec.in
new file mode 100644
index 0000000..b89658f
--- /dev/null
+++ b/gsl-1.9/gsl.spec.in
@@ -0,0 +1,80 @@
+Name: gsl
+Summary: GNU Scientific Library (GSL)
+Packager: jungman@lanl.gov, rosalia@lanl.gov
+%define version @VERSION@
+%define release 0
+Version: %{version}
+Release: %{release}
+License: GPL
+Vendor: The GSL Team
+Distribution: research software
+Source: gsl-%{version}.tar.gz
+Group: Libraries/Research
+%define mybuildroot /var/tmp/%{name}-build
+BuildRoot: %{mybuildroot}
+
+%description
+ The GNU Scientific Library (GSL) is a numerical library for C and
+C++ programmers. It contains over 1000 mathematical routines written
+in ANSI C. The library follows modern coding conventions, and lends
+itself to being used in very high level languages (VHLLs).
+
+The library covers the following subject areas:
+
+ Complex Numbers Roots of Polynomials Special Functions
+ Vectors and Matrices Permutations Sorting
+ BLAS Support Linear Algebra Eigensystems
+ Fast Fourier Transforms Quadrature Random Numbers
+ Quasi-Random Sequences Random Distributions Statistics
+ Histograms N-Tuples Monte Carlo Integration
+ Simulated Annealing Differential Equations Interpolation
+ Numerical Differentiation Chebyshev Approximation Series Acceleration
+ Discrete Hankel Transforms Root-Finding Minimization
+ Least-Squares Fitting Physical Constants IEEE Floating-Point
+
+Further information can be found in the GSL Reference Manual.
+Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+2006, 2007 The GSL Team.
+
+Install the gsl package if you need a library for high-level
+scientific numerical analysis.
+
+%prep
+%setup -q -n gsl-%{version}
+
+%build
+CFLAGS="$RPM_OPT_FLAGS"
+./configure --prefix=%{_prefix} \
+ --bindir=%{_bindir} --mandir=%{_mandir} \
+ --localstatedir=%{_localstatedir} --libdir=%{_libdir} \
+ --datadir=%{_datadir} --includedir=%{_includedir} \
+ --sysconfdir=%{_sysconfdir}
+make
+
+%install
+rm -rf $RPM_BUILD_ROOT
+
+make prefix=$RPM_BUILD_ROOT%{_prefix} bindir=$RPM_BUILD_ROOT%{_bindir} \
+ mandir=$RPM_BUILD_ROOT%{_mandir} libdir=$RPM_BUILD_ROOT%{_libdir} \
+ localstatedir=$RPM_BUILD_ROOT%{_localstatedir} \
+ datadir=$RPM_BUILD_ROOT%{_datadir} \
+ includedir=$RPM_BUILD_ROOT%{_includedir} \
+ sysconfdir=$RPM_BUILD_ROOT%{_sysconfdir} install
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%post -p /sbin/ldconfig
+
+%postun -p /sbin/ldconfig
+
+%files
+%doc {NEWS,ChangeLog,INSTALL,README,AUTHORS,THANKS,SUPPORT,BUGS}
+%doc /usr/info/*
+/usr/bin/gsl-config
+/usr/bin/gsl-histogram
+/usr/bin/gsl-randist
+/usr/lib
+/usr/include/gsl
+/usr/share/aclocal/gsl.m4
+/usr/share/man
diff --git a/gsl-1.9/gsl/Makefile.am b/gsl-1.9/gsl/Makefile.am
new file mode 100644
index 0000000..4df31e8
--- /dev/null
+++ b/gsl-1.9/gsl/Makefile.am
@@ -0,0 +1,17 @@
+
+header-links: remove-links
+ HEADERLIST="$(top_srcdir)/gsl*.h $(top_srcdir)/*/gsl*.h"; \
+ for h in $$HEADERLIST; do \
+ BASENAME=`basename $$h`; \
+ test -r $$BASENAME || $(LN_S) $$h $$BASENAME; \
+ done
+
+remove-links:
+ rm -f gsl*.h
+
+
+all: all-am header-links
+
+clean: clean-am remove-links
+distclean: distclean-am remove-links
+ -rm -f Makefile
diff --git a/gsl-1.9/gsl/Makefile.in b/gsl-1.9/gsl/Makefile.in
new file mode 100644
index 0000000..9722011
--- /dev/null
+++ b/gsl-1.9/gsl/Makefile.in
@@ -0,0 +1,334 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = gsl
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+depcomp =
+am__depfiles_maybe =
+SOURCES =
+DIST_SOURCES =
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps gsl/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps gsl/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean-am: clean-am distclean-generic distclean-libtool
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+ distclean distclean-generic distclean-libtool distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man install-strip \
+ installcheck installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-generic \
+ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \
+ uninstall-info-am
+
+
+header-links: remove-links
+ HEADERLIST="$(top_srcdir)/gsl*.h $(top_srcdir)/*/gsl*.h"; \
+ for h in $$HEADERLIST; do \
+ BASENAME=`basename $$h`; \
+ test -r $$BASENAME || $(LN_S) $$h $$BASENAME; \
+ done
+
+remove-links:
+ rm -f gsl*.h
+
+all: all-am header-links
+
+clean: clean-am remove-links
+distclean: distclean-am remove-links
+ -rm -f Makefile
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/gsl_machine.h b/gsl-1.9/gsl_machine.h
new file mode 100644
index 0000000..c44ffc2
--- /dev/null
+++ b/gsl-1.9/gsl_machine.h
@@ -0,0 +1,104 @@
+/* Author: B. Gough and G. Jungman */
+#ifndef __GSL_MACHINE_H__
+#define __GSL_MACHINE_H__
+
+#include <limits.h>
+#include <float.h>
+
+/* magic constants; mostly for the benefit of the implementation */
+
+/* -*-MACHINE CONSTANTS-*-
+ *
+ * PLATFORM: Whiz-O-Matic 9000
+ * FP_PLATFORM: IEEE-Virtual
+ * HOSTNAME: nnn.lanl.gov
+ * DATE: Fri Nov 20 17:53:26 MST 1998
+ */
+#define GSL_DBL_EPSILON 2.2204460492503131e-16
+#define GSL_SQRT_DBL_EPSILON 1.4901161193847656e-08
+#define GSL_ROOT3_DBL_EPSILON 6.0554544523933429e-06
+#define GSL_ROOT4_DBL_EPSILON 1.2207031250000000e-04
+#define GSL_ROOT5_DBL_EPSILON 7.4009597974140505e-04
+#define GSL_ROOT6_DBL_EPSILON 2.4607833005759251e-03
+#define GSL_LOG_DBL_EPSILON (-3.6043653389117154e+01)
+
+#define GSL_DBL_MIN 2.2250738585072014e-308
+#define GSL_SQRT_DBL_MIN 1.4916681462400413e-154
+#define GSL_ROOT3_DBL_MIN 2.8126442852362996e-103
+#define GSL_ROOT4_DBL_MIN 1.2213386697554620e-77
+#define GSL_ROOT5_DBL_MIN 2.9476022969691763e-62
+#define GSL_ROOT6_DBL_MIN 5.3034368905798218e-52
+#define GSL_LOG_DBL_MIN (-7.0839641853226408e+02)
+
+#define GSL_DBL_MAX 1.7976931348623157e+308
+#define GSL_SQRT_DBL_MAX 1.3407807929942596e+154
+#define GSL_ROOT3_DBL_MAX 5.6438030941222897e+102
+#define GSL_ROOT4_DBL_MAX 1.1579208923731620e+77
+#define GSL_ROOT5_DBL_MAX 4.4765466227572707e+61
+#define GSL_ROOT6_DBL_MAX 2.3756689782295612e+51
+#define GSL_LOG_DBL_MAX 7.0978271289338397e+02
+
+#define GSL_FLT_EPSILON 1.1920928955078125e-07
+#define GSL_SQRT_FLT_EPSILON 3.4526698300124393e-04
+#define GSL_ROOT3_FLT_EPSILON 4.9215666011518501e-03
+#define GSL_ROOT4_FLT_EPSILON 1.8581361171917516e-02
+#define GSL_ROOT5_FLT_EPSILON 4.1234622211652937e-02
+#define GSL_ROOT6_FLT_EPSILON 7.0153878019335827e-02
+#define GSL_LOG_FLT_EPSILON (-1.5942385152878742e+01)
+
+#define GSL_FLT_MIN 1.1754943508222875e-38
+#define GSL_SQRT_FLT_MIN 1.0842021724855044e-19
+#define GSL_ROOT3_FLT_MIN 2.2737367544323241e-13
+#define GSL_ROOT4_FLT_MIN 3.2927225399135965e-10
+#define GSL_ROOT5_FLT_MIN 2.5944428542140822e-08
+#define GSL_ROOT6_FLT_MIN 4.7683715820312542e-07
+#define GSL_LOG_FLT_MIN (-8.7336544750553102e+01)
+
+#define GSL_FLT_MAX 3.4028234663852886e+38
+#define GSL_SQRT_FLT_MAX 1.8446743523953730e+19
+#define GSL_ROOT3_FLT_MAX 6.9814635196223242e+12
+#define GSL_ROOT4_FLT_MAX 4.2949672319999986e+09
+#define GSL_ROOT5_FLT_MAX 5.0859007855960041e+07
+#define GSL_ROOT6_FLT_MAX 2.6422459233807749e+06
+#define GSL_LOG_FLT_MAX 8.8722839052068352e+01
+
+#define GSL_SFLT_EPSILON 4.8828125000000000e-04
+#define GSL_SQRT_SFLT_EPSILON 2.2097086912079612e-02
+#define GSL_ROOT3_SFLT_EPSILON 7.8745065618429588e-02
+#define GSL_ROOT4_SFLT_EPSILON 1.4865088937534013e-01
+#define GSL_ROOT5_SFLT_EPSILON 2.1763764082403100e-01
+#define GSL_ROOT6_SFLT_EPSILON 2.8061551207734325e-01
+#define GSL_LOG_SFLT_EPSILON (-7.6246189861593985e+00)
+
+/* !MACHINE CONSTANTS! */
+
+
+/* a little internal backwards compatibility */
+#define GSL_MACH_EPS GSL_DBL_EPSILON
+
+
+
+/* Here are the constants related to or derived from
+ * machine constants. These are not to be confused with
+ * the constants that define various precision levels
+ * for the precision/error system.
+ *
+ * This information is determined at configure time
+ * and is platform dependent. Edit at your own risk.
+ *
+ * PLATFORM: WHIZ-O-MATIC
+ * CONFIG-DATE: Thu Nov 19 19:27:18 MST 1998
+ * CONFIG-HOST: nnn.lanl.gov
+ */
+
+/* machine precision constants */
+/* #define GSL_MACH_EPS 1.0e-15 */
+#define GSL_SQRT_MACH_EPS 3.2e-08
+#define GSL_ROOT3_MACH_EPS 1.0e-05
+#define GSL_ROOT4_MACH_EPS 0.000178
+#define GSL_ROOT5_MACH_EPS 0.00100
+#define GSL_ROOT6_MACH_EPS 0.00316
+#define GSL_LOG_MACH_EPS (-34.54)
+
+
+#endif /* __GSL_MACHINE_H__ */
diff --git a/gsl-1.9/gsl_math.h b/gsl-1.9/gsl_math.h
new file mode 100644
index 0000000..7f9a391
--- /dev/null
+++ b/gsl-1.9/gsl_math.h
@@ -0,0 +1,226 @@
+/* gsl_math.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_MATH_H__
+#define __GSL_MATH_H__
+#include <math.h>
+#include <gsl/gsl_sys.h>
+#include <gsl/gsl_machine.h>
+#include <gsl/gsl_precision.h>
+#include <gsl/gsl_nan.h>
+#include <gsl/gsl_pow_int.h>
+
+#ifndef M_E
+#define M_E 2.71828182845904523536028747135 /* e */
+#endif
+
+#ifndef M_LOG2E
+#define M_LOG2E 1.44269504088896340735992468100 /* log_2 (e) */
+#endif
+
+#ifndef M_LOG10E
+#define M_LOG10E 0.43429448190325182765112891892 /* log_10 (e) */
+#endif
+
+#ifndef M_SQRT2
+#define M_SQRT2 1.41421356237309504880168872421 /* sqrt(2) */
+#endif
+
+#ifndef M_SQRT1_2
+#define M_SQRT1_2 0.70710678118654752440084436210 /* sqrt(1/2) */
+#endif
+
+
+#ifndef M_SQRT3
+#define M_SQRT3 1.73205080756887729352744634151 /* sqrt(3) */
+#endif
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846264338328 /* pi */
+#endif
+
+#ifndef M_PI_2
+#define M_PI_2 1.57079632679489661923132169164 /* pi/2 */
+#endif
+
+#ifndef M_PI_4
+#define M_PI_4 0.78539816339744830961566084582 /* pi/4 */
+#endif
+
+#ifndef M_SQRTPI
+#define M_SQRTPI 1.77245385090551602729816748334 /* sqrt(pi) */
+#endif
+
+#ifndef M_2_SQRTPI
+#define M_2_SQRTPI 1.12837916709551257389615890312 /* 2/sqrt(pi) */
+#endif
+
+#ifndef M_1_PI
+#define M_1_PI 0.31830988618379067153776752675 /* 1/pi */
+#endif
+
+#ifndef M_2_PI
+#define M_2_PI 0.63661977236758134307553505349 /* 2/pi */
+#endif
+
+#ifndef M_LN10
+#define M_LN10 2.30258509299404568401799145468 /* ln(10) */
+#endif
+
+#ifndef M_LN2
+#define M_LN2 0.69314718055994530941723212146 /* ln(2) */
+#endif
+
+#ifndef M_LNPI
+#define M_LNPI 1.14472988584940017414342735135 /* ln(pi) */
+#endif
+
+#ifndef M_EULER
+#define M_EULER 0.57721566490153286060651209008 /* Euler constant */
+#endif
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+/* other needlessly compulsive abstractions */
+
+#define GSL_IS_ODD(n) ((n) & 1)
+#define GSL_IS_EVEN(n) (!(GSL_IS_ODD(n)))
+#define GSL_SIGN(x) ((x) >= 0.0 ? 1 : -1)
+
+/* Return nonzero if x is a real number, i.e. non NaN or infinite. */
+#define GSL_IS_REAL(x) (gsl_finite(x))
+
+/* Define MAX and MIN macros/functions if they don't exist. */
+
+/* plain old macros for general use */
+#define GSL_MAX(a,b) ((a) > (b) ? (a) : (b))
+#define GSL_MIN(a,b) ((a) < (b) ? (a) : (b))
+
+/* function versions of the above, in case they are needed */
+double gsl_max (double a, double b);
+double gsl_min (double a, double b);
+
+/* inline-friendly strongly typed versions */
+#ifdef HAVE_INLINE
+
+extern inline int GSL_MAX_INT (int a, int b);
+extern inline int GSL_MIN_INT (int a, int b);
+extern inline double GSL_MAX_DBL (double a, double b);
+extern inline double GSL_MIN_DBL (double a, double b);
+extern inline long double GSL_MAX_LDBL (long double a, long double b);
+extern inline long double GSL_MIN_LDBL (long double a, long double b);
+
+extern inline int
+GSL_MAX_INT (int a, int b)
+{
+ return GSL_MAX (a, b);
+}
+
+extern inline int
+GSL_MIN_INT (int a, int b)
+{
+ return GSL_MIN (a, b);
+}
+
+extern inline double
+GSL_MAX_DBL (double a, double b)
+{
+ return GSL_MAX (a, b);
+}
+
+extern inline double
+GSL_MIN_DBL (double a, double b)
+{
+ return GSL_MIN (a, b);
+}
+
+extern inline long double
+GSL_MAX_LDBL (long double a, long double b)
+{
+ return GSL_MAX (a, b);
+}
+
+extern inline long double
+GSL_MIN_LDBL (long double a, long double b)
+{
+ return GSL_MIN (a, b);
+}
+#else
+#define GSL_MAX_INT(a,b) GSL_MAX(a,b)
+#define GSL_MIN_INT(a,b) GSL_MIN(a,b)
+#define GSL_MAX_DBL(a,b) GSL_MAX(a,b)
+#define GSL_MIN_DBL(a,b) GSL_MIN(a,b)
+#define GSL_MAX_LDBL(a,b) GSL_MAX(a,b)
+#define GSL_MIN_LDBL(a,b) GSL_MIN(a,b)
+#endif /* HAVE_INLINE */
+
+/* Definition of an arbitrary function with parameters */
+
+struct gsl_function_struct
+{
+ double (* function) (double x, void * params);
+ void * params;
+};
+
+typedef struct gsl_function_struct gsl_function ;
+
+#define GSL_FN_EVAL(F,x) (*((F)->function))(x,(F)->params)
+
+/* Definition of an arbitrary function returning two values, r1, r2 */
+
+struct gsl_function_fdf_struct
+{
+ double (* f) (double x, void * params);
+ double (* df) (double x, void * params);
+ void (* fdf) (double x, void * params, double * f, double * df);
+ void * params;
+};
+
+typedef struct gsl_function_fdf_struct gsl_function_fdf ;
+
+#define GSL_FN_FDF_EVAL_F(FDF,x) (*((FDF)->f))(x,(FDF)->params)
+#define GSL_FN_FDF_EVAL_DF(FDF,x) (*((FDF)->df))(x,(FDF)->params)
+#define GSL_FN_FDF_EVAL_F_DF(FDF,x,y,dy) (*((FDF)->fdf))(x,(FDF)->params,(y),(dy))
+
+
+/* Definition of an arbitrary vector-valued function with parameters */
+
+struct gsl_function_vec_struct
+{
+ int (* function) (double x, double y[], void * params);
+ void * params;
+};
+
+typedef struct gsl_function_vec_struct gsl_function_vec ;
+
+#define GSL_FN_VEC_EVAL(F,x,y) (*((F)->function))(x,y,(F)->params)
+
+__END_DECLS
+
+#endif /* __GSL_MATH_H__ */
diff --git a/gsl-1.9/gsl_mode.h b/gsl-1.9/gsl_mode.h
new file mode 100644
index 0000000..aaad114
--- /dev/null
+++ b/gsl-1.9/gsl_mode.h
@@ -0,0 +1,87 @@
+/* gsl_mode.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: B. Gough and G. Jungman */
+
+#ifndef __GSL_MODE_H__
+#define __GSL_MODE_H__
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+
+/* Some functions can take a mode argument. This
+ * is a rough method to do things like control
+ * the precision of the algorithm. This mainly
+ * occurs in special functions, but we figured
+ * it was ok to have a general facility.
+ *
+ * The mode type is 32-bit field. Most of
+ * the fields are currently unused. Users
+ * '|' various predefined constants to get
+ * a desired mode.
+ */
+typedef unsigned int gsl_mode_t;
+
+
+/* Here are the predefined constants.
+ * Note that the precision constants
+ * are special because they are used
+ * to index arrays, so do not change
+ * them. The precision information is
+ * in the low order 3 bits of gsl_mode_t
+ * (the third bit is currently unused).
+ */
+
+/* Note that "0" is double precision,
+ * so that you get that by default if
+ * you forget a flag.
+ */
+#define GSL_PREC_DOUBLE 0
+#define GSL_PREC_SINGLE 1
+#define GSL_PREC_APPROX 2
+
+#ifdef HAVE_INLINE
+extern inline unsigned int GSL_MODE_PREC(gsl_mode_t mt);
+
+extern inline unsigned int
+GSL_MODE_PREC(gsl_mode_t mt)
+{ return (mt & (unsigned int)7); }
+#else /* HAVE_INLINE */
+#define GSL_MODE_PREC(mt) ((mt) & (unsigned int)7)
+#endif /* HAVE_INLINE */
+
+
+/* Here are some predefined generic modes.
+ */
+#define GSL_MODE_DEFAULT 0
+
+
+__END_DECLS
+
+#endif /* __GSL_MODE_H__ */
diff --git a/gsl-1.9/gsl_nan.h b/gsl-1.9/gsl_nan.h
new file mode 100644
index 0000000..8c5a93f
--- /dev/null
+++ b/gsl-1.9/gsl_nan.h
@@ -0,0 +1,45 @@
+/* gsl_nan.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_NAN_H__
+#define __GSL_NAN_H__
+
+#ifdef INFINITY
+# define GSL_POSINF INFINITY
+# define GSL_NEGINF (-INFINITY)
+#elif defined(HUGE_VAL)
+# define GSL_POSINF HUGE_VAL
+# define GSL_NEGINF (-HUGE_VAL)
+#else
+# define GSL_POSINF (gsl_posinf())
+# define GSL_NEGINF (gsl_neginf())
+#endif
+
+#ifdef NAN
+# define GSL_NAN NAN
+#elif defined(INFINITY)
+# define GSL_NAN (INFINITY/INFINITY)
+#else
+# define GSL_NAN (gsl_nan())
+#endif
+
+#define GSL_POSZERO (+0)
+#define GSL_NEGZERO (-0)
+
+#endif /* __GSL_NAN_H__ */
diff --git a/gsl-1.9/gsl_pow_int.h b/gsl-1.9/gsl_pow_int.h
new file mode 100644
index 0000000..63864c9
--- /dev/null
+++ b/gsl-1.9/gsl_pow_int.h
@@ -0,0 +1,68 @@
+/* gsl_pow_int.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_POW_INT_H__
+#define __GSL_POW_INT_H__
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+#ifdef HAVE_INLINE
+extern inline double gsl_pow_2(const double x);
+extern inline double gsl_pow_3(const double x);
+extern inline double gsl_pow_4(const double x);
+extern inline double gsl_pow_5(const double x);
+extern inline double gsl_pow_6(const double x);
+extern inline double gsl_pow_7(const double x);
+extern inline double gsl_pow_8(const double x);
+extern inline double gsl_pow_9(const double x);
+
+extern inline double gsl_pow_2(const double x) { return x*x; }
+extern inline double gsl_pow_3(const double x) { return x*x*x; }
+extern inline double gsl_pow_4(const double x) { double x2 = x*x; return x2*x2; }
+extern inline double gsl_pow_5(const double x) { double x2 = x*x; return x2*x2*x; }
+extern inline double gsl_pow_6(const double x) { double x2 = x*x; return x2*x2*x2; }
+extern inline double gsl_pow_7(const double x) { double x3 = x*x*x; return x3*x3*x; }
+extern inline double gsl_pow_8(const double x) { double x2 = x*x; double x4 = x2*x2; return x4*x4; }
+extern inline double gsl_pow_9(const double x) { double x3 = x*x*x; return x3*x3*x3; }
+#else
+double gsl_pow_2(const double x);
+double gsl_pow_3(const double x);
+double gsl_pow_4(const double x);
+double gsl_pow_5(const double x);
+double gsl_pow_6(const double x);
+double gsl_pow_7(const double x);
+double gsl_pow_8(const double x);
+double gsl_pow_9(const double x);
+#endif
+
+double gsl_pow_int(double x, int n);
+
+__END_DECLS
+
+#endif /* __GSL_POW_INT_H__ */
diff --git a/gsl-1.9/gsl_precision.h b/gsl-1.9/gsl_precision.h
new file mode 100644
index 0000000..1eca35e
--- /dev/null
+++ b/gsl-1.9/gsl_precision.h
@@ -0,0 +1,66 @@
+/* gsl_precision.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: B. Gough and G. Jungman */
+
+#ifndef __GSL_PRECISION_H__
+#define __GSL_PRECISION_H__
+#include <gsl/gsl_types.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+
+/* A type for the precision indicator.
+ * This is mainly for pedagogy.
+ */
+typedef unsigned int gsl_prec_t;
+
+
+/* The number of precision types.
+ * Remember that precision-mode
+ * can index an array.
+ */
+#define _GSL_PREC_T_NUM 3
+
+
+/* Arrays containing derived
+ * precision constants for the
+ * different precision levels.
+ */
+GSL_VAR const double gsl_prec_eps[];
+GSL_VAR const double gsl_prec_sqrt_eps[];
+GSL_VAR const double gsl_prec_root3_eps[];
+GSL_VAR const double gsl_prec_root4_eps[];
+GSL_VAR const double gsl_prec_root5_eps[];
+GSL_VAR const double gsl_prec_root6_eps[];
+
+
+__END_DECLS
+
+#endif /* __GSL_PRECISION_H__ */
diff --git a/gsl-1.9/gsl_types.h b/gsl-1.9/gsl_types.h
new file mode 100644
index 0000000..0de0945
--- /dev/null
+++ b/gsl-1.9/gsl_types.h
@@ -0,0 +1,41 @@
+/* gsl_types.h
+ *
+ * Copyright (C) 2001 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_TYPES_H__
+#define __GSL_TYPES_H__
+
+#ifndef GSL_VAR
+
+#ifdef WIN32
+# ifdef GSL_DLL
+# ifdef DLL_EXPORT
+# define GSL_VAR extern __declspec(dllexport)
+# else
+# define GSL_VAR extern __declspec(dllimport)
+# endif
+# else
+# define GSL_VAR extern
+# endif
+#else
+# define GSL_VAR extern
+#endif
+
+#endif
+
+#endif /* __GSL_TYPES_H__ */
diff --git a/gsl-1.9/gsl_version.h.in b/gsl-1.9/gsl_version.h.in
new file mode 100644
index 0000000..25bf3a3
--- /dev/null
+++ b/gsl-1.9/gsl_version.h.in
@@ -0,0 +1,24 @@
+#ifndef __GSL_VERSION_H__
+#define __GSL_VERSION_H__
+
+#include <gsl/gsl_types.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+__BEGIN_DECLS
+
+
+#define GSL_VERSION "@VERSION@"
+
+GSL_VAR const char * gsl_version;
+
+__END_DECLS
+
+#endif /* __GSL_VERSION_H__ */
diff --git a/gsl-1.9/histogram/ChangeLog b/gsl-1.9/histogram/ChangeLog
new file mode 100644
index 0000000..18e5ab4
--- /dev/null
+++ b/gsl-1.9/histogram/ChangeLog
@@ -0,0 +1,156 @@
+2004-11-28 Brian Gough <bjg@network-theory.co.uk>
+
+ * init2d.c (make_uniform): compute uniform range without
+ cancellation error.
+
+ * init.c (make_uniform): compute uniform range without
+ cancellation error.
+
+Tue Aug 27 19:36:43 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * test2d.c (main): changed test output format from %g to %e for
+ portability
+
+ * test.c (main): changed test output format from %g to %e for
+ portability
+
+Wed Mar 6 22:03:35 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * test2d.c (main): cleaned up the tests a bit
+
+ * stat2d.c: added checks for wi>0 (Achim Gaedke)
+
+Sat Jan 26 17:09:10 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * stat2d.c: added <math.h> include for sqrt
+
+Fri Jan 18 21:45:35 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * stat2d.c: functions to compute statistics of 2d histograms
+ (Achim Gaedke)
+
+Mon Jan 14 19:34:31 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * stat.c (gsl_histogram_sum): new function to sum bins (Achim
+ Gaedke)
+
+ * maxval2d.c (gsl_histogram2d_sum): new function to sum bins
+ (Achim Gaedke)
+
+Thu Oct 18 14:48:07 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * pdf2d.c (gsl_histogram2d_pdf_alloc): changed the definition of
+ the pdf alloc function to be consistent with the rest of the
+ library
+
+ * pdf.c (gsl_histogram_pdf_alloc): changed the definition of the
+ pdf alloc function to be consistent with the rest of the library
+
+ * init2d.c (gsl_histogram2d_alloc): added an alloc function for
+ consistency
+
+ * init.c (gsl_histogram_alloc): added an alloc function for
+ consistency
+
+Wed Sep 12 13:38:40 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * stat.c (gsl_histogram_mean): fixed calculation of mean/sigma and
+ made it part of the library
+
+Sun Aug 19 13:31:35 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * test_gsl_histogram.sh: moved to top-level directory
+
+Sat Aug 18 22:21:26 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl-histogram.c: moved to top-level directory
+
+Mon Jun 25 17:41:42 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * init2d.c (gsl_histogram2d_set_ranges_uniform): added range
+ initialization functions suggested by Achim Gaedke
+
+ * init.c (gsl_histogram_set_ranges_uniform): added range
+ initialization functions suggested by Achim Gaedke
+
+Tue Apr 17 22:13:05 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * get2d.c: include "find.c"
+
+Mon Apr 16 20:13:45 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * get2d.c (gsl_histogram2d_get): removed unnecessary reference to
+ find2d
+
+Mon Jan 22 13:55:13 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * find.c (find): optimize for the linear case, include own binary
+ search for speed
+
+ * add.c (gsl_histogram_accumulate): fix check of array bound for
+ index
+
+Sun May 28 12:23:46 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * test2d.c (main): use binary mode "b" when reading and writing
+ binary files
+
+ * test.c (main): use binary mode "b" when reading and writing
+ binary files
+
+Wed Apr 26 15:09:22 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * oper2d.c (gsl_histogram2d_shift): added function for shifting
+ histogram by a constant offset
+
+ * oper.c (gsl_histogram_shift): added function for shifting
+ histogram by a constant offset
+
+Wed Apr 19 17:27:44 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * added numerous extensions from Simone Piccardi
+
+2000-04-01 Mark Galassi <rosalia@lanl.gov>
+
+ * *.c: changed 0 -> GSL_SUCCESS where appropriate; THANKS to Dave
+ Morrison.
+
+Fri Nov 19 15:31:51 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl-histogram.c (main): free memory before exit, eliminates
+ warning from checkergcc
+
+ * test_gsl_histogram.sh: added a test for the gsl-histogram
+ program
+
+Fri Oct 1 15:47:01 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * file.c file2d.c: converted to use new block i/o functions
+
+Wed Aug 18 11:41:40 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * eliminated obvious memory leaks from the tests, so that we can
+ check that the _free functions work correctly
+
+ * gsl-histogram.c (main): removed unused variable
+
+Fri Aug 6 11:19:37 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * removed dependence on rand() and RAND_MAX
+
+1999-08-05 Mark Galassi <rosalia@lanl.gov>
+
+ * gsl-histogram.c (main): fixed a simple logic bug. Thanks to
+ Barak Pearlmutter (bap@cs.unm.edu) for the patch.
+
+1998-11-06 <bjg@ancho.lanl.gov>
+
+ * used a cast of (int) when attempting to print size_t variables
+ with %d
+
+Wed Sep 16 15:08:59 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * gsl-histogram.c (main): made the number of bins
+ optional. If you don't specify it then it uses bins of width 1.
+
+
diff --git a/gsl-1.9/histogram/Makefile.am b/gsl-1.9/histogram/Makefile.am
new file mode 100644
index 0000000..0adb316
--- /dev/null
+++ b/gsl-1.9/histogram/Makefile.am
@@ -0,0 +1,20 @@
+noinst_LTLIBRARIES = libgslhistogram.la
+
+pkginclude_HEADERS = gsl_histogram.h gsl_histogram2d.h
+
+INCLUDES= -I$(top_builddir)
+
+libgslhistogram_la_SOURCES = add.c get.c init.c params.c reset.c file.c pdf.c gsl_histogram.h add2d.c get2d.c init2d.c params2d.c reset2d.c file2d.c pdf2d.c gsl_histogram2d.h calloc_range.c calloc_range2d.c copy.c copy2d.c maxval.c maxval2d.c oper.c oper2d.c stat.c stat2d.c
+
+noinst_HEADERS = urand.c find.c find2d.c
+
+check_PROGRAMS = test
+TESTS = $(check_PROGRAMS)
+
+EXTRA_DIST = urand.c
+
+test_SOURCES = test.c test1d.c test2d.c test1d_resample.c test2d_resample.c test1d_trap.c test2d_trap.c
+test_LDADD = libgslhistogram.la ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la
+
+CLEANFILES = test.txt test.dat
+
diff --git a/gsl-1.9/histogram/Makefile.in b/gsl-1.9/histogram/Makefile.in
new file mode 100644
index 0000000..3ebd2b6
--- /dev/null
+++ b/gsl-1.9/histogram/Makefile.in
@@ -0,0 +1,553 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = test$(EXEEXT)
+subdir = histogram
+DIST_COMMON = $(noinst_HEADERS) $(pkginclude_HEADERS) \
+ $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog TODO
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgslhistogram_la_LIBADD =
+am_libgslhistogram_la_OBJECTS = add.lo get.lo init.lo params.lo \
+ reset.lo file.lo pdf.lo add2d.lo get2d.lo init2d.lo \
+ params2d.lo reset2d.lo file2d.lo pdf2d.lo calloc_range.lo \
+ calloc_range2d.lo copy.lo copy2d.lo maxval.lo maxval2d.lo \
+ oper.lo oper2d.lo stat.lo stat2d.lo
+libgslhistogram_la_OBJECTS = $(am_libgslhistogram_la_OBJECTS)
+am_test_OBJECTS = test.$(OBJEXT) test1d.$(OBJEXT) test2d.$(OBJEXT) \
+ test1d_resample.$(OBJEXT) test2d_resample.$(OBJEXT) \
+ test1d_trap.$(OBJEXT) test2d_trap.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = libgslhistogram.la ../block/libgslblock.la \
+ ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la \
+ ../test/libgsltest.la ../sys/libgslsys.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgslhistogram_la_SOURCES) $(test_SOURCES)
+DIST_SOURCES = $(libgslhistogram_la_SOURCES) $(test_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libgslhistogram.la
+pkginclude_HEADERS = gsl_histogram.h gsl_histogram2d.h
+INCLUDES = -I$(top_builddir)
+libgslhistogram_la_SOURCES = add.c get.c init.c params.c reset.c file.c pdf.c gsl_histogram.h add2d.c get2d.c init2d.c params2d.c reset2d.c file2d.c pdf2d.c gsl_histogram2d.h calloc_range.c calloc_range2d.c copy.c copy2d.c maxval.c maxval2d.c oper.c oper2d.c stat.c stat2d.c
+noinst_HEADERS = urand.c find.c find2d.c
+TESTS = $(check_PROGRAMS)
+EXTRA_DIST = urand.c
+test_SOURCES = test.c test1d.c test2d.c test1d_resample.c test2d_resample.c test1d_trap.c test2d_trap.c
+test_LDADD = libgslhistogram.la ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la
+CLEANFILES = test.txt test.dat
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps histogram/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps histogram/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgslhistogram.la: $(libgslhistogram_la_OBJECTS) $(libgslhistogram_la_DEPENDENCIES)
+ $(LINK) $(libgslhistogram_la_LDFLAGS) $(libgslhistogram_la_OBJECTS) $(libgslhistogram_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkgincludeHEADERS
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/histogram/TODO b/gsl-1.9/histogram/TODO
new file mode 100644
index 0000000..1e5b07a
--- /dev/null
+++ b/gsl-1.9/histogram/TODO
@@ -0,0 +1,3 @@
+* Implement N-d histograms (Simone Piccardi <piccardi@fi.infn.it> is
+working on something here).
+
diff --git a/gsl-1.9/histogram/add.c b/gsl-1.9/histogram/add.c
new file mode 100644
index 0000000..1697d41
--- /dev/null
+++ b/gsl-1.9/histogram/add.c
@@ -0,0 +1,55 @@
+/* histogram/add.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_histogram.h>
+
+#include "find.c"
+
+int
+gsl_histogram_increment (gsl_histogram * h, double x)
+{
+ int status = gsl_histogram_accumulate (h, x, 1.0);
+ return status;
+}
+
+int
+gsl_histogram_accumulate (gsl_histogram * h, double x, double weight)
+{
+ const size_t n = h->n;
+ size_t index = 0;
+
+ int status = find (h->n, h->range, x, &index);
+
+ if (status)
+ {
+ return GSL_EDOM;
+ }
+
+ if (index >= n)
+ {
+ GSL_ERROR ("index lies outside valid range of 0 .. n - 1",
+ GSL_ESANITY);
+ }
+
+ h->bin[index] += weight;
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/histogram/add2d.c b/gsl-1.9/histogram/add2d.c
new file mode 100644
index 0000000..066119d
--- /dev/null
+++ b/gsl-1.9/histogram/add2d.c
@@ -0,0 +1,66 @@
+/* histogram/add2d.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_histogram.h>
+#include <gsl/gsl_histogram2d.h>
+
+#include "find2d.c"
+
+int
+gsl_histogram2d_increment (gsl_histogram2d * h, double x, double y)
+{
+ int status = gsl_histogram2d_accumulate (h, x, y, 1.0);
+ return status;
+}
+
+int
+gsl_histogram2d_accumulate (gsl_histogram2d * h,
+ double x, double y, double weight)
+{
+ const size_t nx = h->nx;
+ const size_t ny = h->ny;
+
+ size_t i = 0, j = 0;
+
+ int status = find2d (h->nx, h->xrange, h->ny, h->yrange, x, y, &i, &j);
+
+ if (status)
+ {
+ return GSL_EDOM;
+ }
+
+ if (i >= nx)
+ {
+ GSL_ERROR ("index lies outside valid range of 0 .. nx - 1",
+ GSL_ESANITY);
+ }
+
+ if (j >= ny)
+ {
+ GSL_ERROR ("index lies outside valid range of 0 .. ny - 1",
+ GSL_ESANITY);
+ }
+
+ h->bin[i * ny + j] += weight;
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/histogram/calloc_range.c b/gsl-1.9/histogram/calloc_range.c
new file mode 100644
index 0000000..cb6e346
--- /dev/null
+++ b/gsl-1.9/histogram/calloc_range.c
@@ -0,0 +1,108 @@
+/* gsl_histogram_calloc_range.c
+ * Copyright (C) 2000 Simone Piccardi
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+/***************************************************************
+ *
+ * File gsl_histogram_calloc_range.c:
+ * Routine to create a variable binning histogram providing
+ * an input range vector. Need GSL library and header.
+ * Do range check and allocate the histogram data.
+ *
+ * Author: S. Piccardi
+ * Jan. 2000
+ *
+ ***************************************************************/
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_histogram.h>
+
+gsl_histogram *
+gsl_histogram_calloc_range (size_t n, double *range)
+{
+ size_t i;
+ gsl_histogram *h;
+
+ /* check arguments */
+
+ if (n == 0)
+ {
+ GSL_ERROR_VAL ("histogram length n must be positive integer",
+ GSL_EDOM, 0);
+ }
+
+ /* check ranges */
+
+ for (i = 0; i < n; i++)
+ {
+ if (range[i] >= range[i + 1])
+ {
+ GSL_ERROR_VAL ("histogram bin extremes must be "
+ "in increasing order", GSL_EDOM, 0);
+ }
+ }
+
+ /* Allocate histogram */
+
+ h = (gsl_histogram *) malloc (sizeof (gsl_histogram));
+
+ if (h == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for histogram struct",
+ GSL_ENOMEM, 0);
+ }
+
+ h->range = (double *) malloc ((n + 1) * sizeof (double));
+
+ if (h->range == 0)
+ {
+ /* exception in constructor, avoid memory leak */
+ free (h);
+ GSL_ERROR_VAL ("failed to allocate space for histogram ranges",
+ GSL_ENOMEM, 0);
+ }
+
+ h->bin = (double *) malloc (n * sizeof (double));
+
+ if (h->bin == 0)
+ {
+ /* exception in constructor, avoid memory leak */
+ free (h->range);
+ free (h);
+ GSL_ERROR_VAL ("failed to allocate space for histogram bins",
+ GSL_ENOMEM, 0);
+ }
+
+ /* initialize ranges */
+
+ for (i = 0; i <= n; i++)
+ {
+ h->range[i] = range[i];
+ }
+
+ /* clear contents */
+
+ for (i = 0; i < n; i++)
+ {
+ h->bin[i] = 0;
+ }
+
+ h->n = n;
+
+ return h;
+}
diff --git a/gsl-1.9/histogram/calloc_range2d.c b/gsl-1.9/histogram/calloc_range2d.c
new file mode 100644
index 0000000..98d0caf
--- /dev/null
+++ b/gsl-1.9/histogram/calloc_range2d.c
@@ -0,0 +1,153 @@
+/* gsl_histogram2d_calloc_range.c
+ * Copyright (C) 2000 Simone Piccardi
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+/***************************************************************
+ *
+ * File gsl_histogram2d_calloc_range.c:
+ * Routine to create a variable binning 2D histogram providing
+ * the input range vectors. Need GSL library and header.
+ * Do range check and allocate the histogram data.
+ *
+ * Author: S. Piccardi
+ * Jan. 2000
+ *
+ ***************************************************************/
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_histogram2d.h>
+/*
+ * Routine that create a 2D histogram using the given
+ * values for X and Y ranges
+ */
+gsl_histogram2d *
+gsl_histogram2d_calloc_range (size_t nx, size_t ny,
+ double *xrange,
+ double *yrange)
+{
+ size_t i, j;
+ gsl_histogram2d *h;
+
+ /* check arguments */
+
+ if (nx == 0)
+ {
+ GSL_ERROR_VAL ("histogram length nx must be positive integer",
+ GSL_EDOM, 0);
+ }
+
+ if (ny == 0)
+ {
+ GSL_ERROR_VAL ("histogram length ny must be positive integer",
+ GSL_EDOM, 0);
+ }
+
+ /* init ranges */
+
+ for (i = 0; i < nx; i++)
+ {
+ if (xrange[i] >= xrange[i + 1])
+ {
+ GSL_ERROR_VAL ("histogram xrange not in increasing order",
+ GSL_EDOM, 0);
+ }
+ }
+
+ for (j = 0; j < ny; j++)
+ {
+ if (yrange[j] >= yrange[j + 1])
+ {
+ GSL_ERROR_VAL ("histogram yrange not in increasing order"
+ ,GSL_EDOM, 0);
+ }
+ }
+
+ /* Allocate histogram */
+
+ h = (gsl_histogram2d *) malloc (sizeof (gsl_histogram2d));
+
+ if (h == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for histogram struct",
+ GSL_ENOMEM, 0);
+ }
+
+ h->xrange = (double *) malloc ((nx + 1) * sizeof (double));
+
+ if (h->xrange == 0)
+ {
+ /* exception in constructor, avoid memory leak */
+ free (h);
+
+ GSL_ERROR_VAL ("failed to allocate space for histogram xrange",
+ GSL_ENOMEM, 0);
+ }
+
+ h->yrange = (double *) malloc ((ny + 1) * sizeof (double));
+
+ if (h->yrange == 0)
+ {
+ /* exception in constructor, avoid memory leak */
+ free (h);
+
+ GSL_ERROR_VAL ("failed to allocate space for histogram yrange",
+ GSL_ENOMEM, 0);
+ }
+
+ h->bin = (double *) malloc (nx * ny * sizeof (double));
+
+ if (h->bin == 0)
+ {
+ /* exception in constructor, avoid memory leak */
+ free (h->xrange);
+ free (h->yrange);
+ free (h);
+
+ GSL_ERROR_VAL ("failed to allocate space for histogram bins",
+ GSL_ENOMEM, 0);
+ }
+
+ /* init histogram */
+
+ /* init ranges */
+
+ for (i = 0; i <= nx; i++)
+ {
+ h->xrange[i] = xrange[i];
+ }
+
+ for (j = 0; j <= ny; j++)
+ {
+ h->yrange[j] = yrange[j];
+ }
+
+ /* clear contents */
+
+ for (i = 0; i < nx; i++)
+ {
+ for (j = 0; j < ny; j++)
+ {
+ h->bin[i * ny + j] = 0;
+ }
+ }
+
+ h->nx = nx;
+ h->ny = ny;
+
+ return h;
+}
diff --git a/gsl-1.9/histogram/copy.c b/gsl-1.9/histogram/copy.c
new file mode 100644
index 0000000..848dcf1
--- /dev/null
+++ b/gsl-1.9/histogram/copy.c
@@ -0,0 +1,91 @@
+/* gsl_histogram_copy.c
+ * Copyright (C) 2000 Simone Piccardi
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+/***************************************************************
+ *
+ * File gsl_histogram_copy.c:
+ * Routine to copy an histogram.
+ * Need GSL library and headers.
+ *
+ * Author: S. Piccardi
+ * Jan. 2000
+ *
+ ***************************************************************/
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_histogram.h>
+
+/*
+ * gsl_histogram_copy:
+ * copy the contents of an histogram into another
+ */
+
+int
+gsl_histogram_memcpy (gsl_histogram * dest, const gsl_histogram * src)
+{
+ size_t n = src->n;
+ size_t i;
+
+ if (dest->n != src->n)
+ {
+ GSL_ERROR ("histograms have different sizes, cannot copy",
+ GSL_EINVAL);
+ }
+
+ for (i = 0; i <= n; i++)
+ {
+ dest->range[i] = src->range[i];
+ }
+
+ for (i = 0; i < n; i++)
+ {
+ dest->bin[i] = src->bin[i];
+ }
+
+ return GSL_SUCCESS;
+}
+
+/*
+ * gsl_histogram_duplicate:
+ * duplicate an histogram creating
+ * an identical new one
+ */
+
+gsl_histogram *
+gsl_histogram_clone (const gsl_histogram * src)
+{
+ size_t n = src->n;
+ size_t i;
+ gsl_histogram *h;
+
+ h = gsl_histogram_calloc_range (n, src->range);
+
+ if (h == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for histogram struct",
+ GSL_ENOMEM, 0);
+ }
+
+ for (i = 0; i < n; i++)
+ {
+ h->bin[i] = src->bin[i];
+ }
+
+ return h;
+}
diff --git a/gsl-1.9/histogram/copy2d.c b/gsl-1.9/histogram/copy2d.c
new file mode 100644
index 0000000..94fa2d6
--- /dev/null
+++ b/gsl-1.9/histogram/copy2d.c
@@ -0,0 +1,96 @@
+/* gsl_histogram2d_copy.c
+ * Copyright (C) 2000 Simone Piccardi
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+/***************************************************************
+ *
+ * File gsl_histogram2d_copy.c:
+ * Routine to copy a 2D histogram.
+ * Need GSL library and header.
+ *
+ * Author: S. Piccardi
+ * Jan. 2000
+ *
+ ***************************************************************/
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_histogram2d.h>
+
+/*
+ * gsl_histogram2d_copy:
+ * copy the contents of an histogram into another
+ */
+int
+gsl_histogram2d_memcpy (gsl_histogram2d * dest, const gsl_histogram2d * src)
+{
+ size_t nx = src->nx;
+ size_t ny = src->ny;
+ size_t i;
+ if (dest->nx != src->nx || dest->ny != src->ny)
+ {
+ GSL_ERROR ("histograms have different sizes, cannot copy",
+ GSL_EINVAL);
+ }
+
+ for (i = 0; i <= nx; i++)
+ {
+ dest->xrange[i] = src->xrange[i];
+ }
+
+ for (i = 0; i <= ny; i++)
+ {
+ dest->yrange[i] = src->yrange[i];
+ }
+
+ for (i = 0; i < nx * ny; i++)
+ {
+ dest->bin[i] = src->bin[i];
+ }
+
+ return GSL_SUCCESS;
+}
+
+/*
+ * gsl_histogram2d_duplicate:
+ * duplicate an histogram creating
+ * an identical new one
+ */
+
+gsl_histogram2d *
+gsl_histogram2d_clone (const gsl_histogram2d * src)
+{
+ size_t nx = src->nx;
+ size_t ny = src->ny;
+ size_t i;
+ gsl_histogram2d *h;
+
+ h = gsl_histogram2d_calloc_range (nx, ny, src->xrange, src->yrange);
+
+ if (h == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for histogram struct",
+ GSL_ENOMEM, 0);
+ }
+
+ for (i = 0; i < nx * ny; i++)
+ {
+ h->bin[i] = src->bin[i];
+ }
+
+ return h;
+}
diff --git a/gsl-1.9/histogram/file.c b/gsl-1.9/histogram/file.c
new file mode 100644
index 0000000..7013dc0
--- /dev/null
+++ b/gsl-1.9/histogram/file.c
@@ -0,0 +1,127 @@
+/* histogram/file.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_block.h>
+#include <gsl/gsl_histogram.h>
+
+int
+gsl_histogram_fread (FILE * stream, gsl_histogram * h)
+{
+ int status = gsl_block_raw_fread (stream, h->range, h->n + 1, 1);
+
+ if (status)
+ return status;
+
+ status = gsl_block_raw_fread (stream, h->bin, h->n, 1);
+ return status;
+}
+
+int
+gsl_histogram_fwrite (FILE * stream, const gsl_histogram * h)
+{
+ int status = gsl_block_raw_fwrite (stream, h->range, h->n + 1, 1);
+
+ if (status)
+ return status;
+
+ status = gsl_block_raw_fwrite (stream, h->bin, h->n, 1);
+ return status;
+}
+
+int
+gsl_histogram_fprintf (FILE * stream, const gsl_histogram * h,
+ const char *range_format, const char *bin_format)
+{
+ size_t i;
+ const size_t n = h->n;
+
+ for (i = 0; i < n; i++)
+ {
+ int status = fprintf (stream, range_format, h->range[i]);
+
+ if (status < 0)
+ {
+ GSL_ERROR ("fprintf failed", GSL_EFAILED);
+ }
+
+ status = putc (' ', stream);
+
+ if (status == EOF)
+ {
+ GSL_ERROR ("putc failed", GSL_EFAILED);
+ }
+
+ status = fprintf (stream, range_format, h->range[i + 1]);
+
+ if (status < 0)
+ {
+ GSL_ERROR ("fprintf failed", GSL_EFAILED);
+ }
+
+ status = putc (' ', stream);
+
+ if (status == EOF)
+ {
+ GSL_ERROR ("putc failed", GSL_EFAILED);
+ }
+
+ status = fprintf (stream, bin_format, h->bin[i]);
+
+ if (status < 0)
+ {
+ GSL_ERROR ("fprintf failed", GSL_EFAILED);
+ }
+
+ status = putc ('\n', stream);
+
+ if (status == EOF)
+ {
+ GSL_ERROR ("putc failed", GSL_EFAILED);
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+gsl_histogram_fscanf (FILE * stream, gsl_histogram * h)
+{
+ size_t i;
+ const size_t n = h->n;
+ double upper;
+
+ for (i = 0; i < n; i++)
+ {
+ int status = fscanf (stream,
+ "%lg %lg %lg", h->range + i, &upper,
+ h->bin + i);
+
+ if (status != 3)
+ {
+ GSL_ERROR ("fscanf failed", GSL_EFAILED);
+ }
+ }
+
+ h->range[n] = upper;
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/histogram/file2d.c b/gsl-1.9/histogram/file2d.c
new file mode 100644
index 0000000..2bf1b6e
--- /dev/null
+++ b/gsl-1.9/histogram/file2d.c
@@ -0,0 +1,184 @@
+/* histogram/file2d.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_block.h>
+#include <gsl/gsl_histogram2d.h>
+
+int
+gsl_histogram2d_fread (FILE * stream, gsl_histogram2d * h)
+{
+ int status = gsl_block_raw_fread (stream, h->xrange, h->nx + 1, 1);
+
+ if (status)
+ return status;
+
+ status = gsl_block_raw_fread (stream, h->yrange, h->ny + 1, 1);
+
+ if (status)
+ return status;
+
+ status = gsl_block_raw_fread (stream, h->bin, h->nx * h->ny, 1);
+
+ return status;
+}
+
+int
+gsl_histogram2d_fwrite (FILE * stream, const gsl_histogram2d * h)
+{
+ int status = gsl_block_raw_fwrite (stream, h->xrange, h->nx + 1, 1);
+
+ if (status)
+ return status;
+
+ status = gsl_block_raw_fwrite (stream, h->yrange, h->ny + 1, 1);
+
+ if (status)
+ return status;
+
+ status = gsl_block_raw_fwrite (stream, h->bin, h->nx * h->ny, 1);
+ return status;
+}
+
+int
+gsl_histogram2d_fprintf (FILE * stream, const gsl_histogram2d * h,
+ const char *range_format, const char *bin_format)
+{
+ size_t i, j;
+ const size_t nx = h->nx;
+ const size_t ny = h->ny;
+ int status;
+
+ for (i = 0; i < nx; i++)
+ {
+ for (j = 0; j < ny; j++)
+ {
+ status = fprintf (stream, range_format, h->xrange[i]);
+
+ if (status < 0)
+ {
+ GSL_ERROR ("fprintf failed", GSL_EFAILED);
+ }
+
+ status = putc (' ', stream);
+
+ if (status == EOF)
+ {
+ GSL_ERROR ("putc failed", GSL_EFAILED);
+ }
+
+ status = fprintf (stream, range_format, h->xrange[i + 1]);
+
+ if (status < 0)
+ {
+ GSL_ERROR ("fprintf failed", GSL_EFAILED);
+ }
+
+ status = putc (' ', stream);
+
+ if (status == EOF)
+ {
+ GSL_ERROR ("putc failed", GSL_EFAILED);
+ }
+
+ status = fprintf (stream, range_format, h->yrange[j]);
+
+ if (status < 0)
+ {
+ GSL_ERROR ("fprintf failed", GSL_EFAILED);
+ }
+
+ status = putc (' ', stream);
+
+ if (status == EOF)
+ {
+ GSL_ERROR ("putc failed", GSL_EFAILED);
+ }
+
+ status = fprintf (stream, range_format, h->yrange[j + 1]);
+
+ if (status < 0)
+ {
+ GSL_ERROR ("fprintf failed", GSL_EFAILED);
+ }
+
+ status = putc (' ', stream);
+
+ if (status == EOF)
+ {
+ GSL_ERROR ("putc failed", GSL_EFAILED);
+ }
+
+ status = fprintf (stream, bin_format, h->bin[i * ny + j]);
+
+ if (status < 0)
+ {
+ GSL_ERROR ("fprintf failed", GSL_EFAILED);
+ }
+
+ status = putc ('\n', stream);
+
+ if (status == EOF)
+ {
+ GSL_ERROR ("putc failed", GSL_EFAILED);
+ }
+ }
+ status = putc ('\n', stream);
+
+ if (status == EOF)
+ {
+ GSL_ERROR ("putc failed", GSL_EFAILED);
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+gsl_histogram2d_fscanf (FILE * stream, gsl_histogram2d * h)
+{
+ size_t i, j;
+ const size_t nx = h->nx;
+ const size_t ny = h->ny;
+ double xupper, yupper;
+
+ for (i = 0; i < nx; i++)
+ {
+ for (j = 0; j < ny; j++)
+ {
+ int status = fscanf (stream,
+ "%lg %lg %lg %lg %lg",
+ h->xrange + i, &xupper,
+ h->yrange + j, &yupper,
+ h->bin + i * ny + j);
+
+ if (status != 5)
+ {
+ GSL_ERROR ("fscanf failed", GSL_EFAILED);
+ }
+ }
+ h->yrange[ny] = yupper;
+ }
+
+ h->xrange[nx] = xupper;
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/histogram/find.c b/gsl-1.9/histogram/find.c
new file mode 100644
index 0000000..b252a36
--- /dev/null
+++ b/gsl-1.9/histogram/find.c
@@ -0,0 +1,86 @@
+/* histogram/find.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* determines whether to optimize for linear ranges */
+#define LINEAR_OPT 1
+
+static int find (const size_t n, const double range[],
+ const double x, size_t * i);
+
+static int
+find (const size_t n, const double range[], const double x, size_t * i)
+{
+ size_t i_linear, lower, upper, mid;
+
+ if (x < range[0])
+ {
+ return -1;
+ }
+
+ if (x >= range[n])
+ {
+ return +1;
+ }
+
+ /* optimize for linear case */
+
+#ifdef LINEAR_OPT
+ {
+ double u = (x - range[0]) / (range[n] - range[0]);
+ i_linear = (size_t) (u * n);
+ }
+
+ if (x >= range[i_linear] && x < range[i_linear + 1])
+ {
+ *i = i_linear;
+ return 0;
+ }
+#endif
+
+ /* perform binary search */
+
+ upper = n ;
+ lower = 0 ;
+
+ while (upper - lower > 1)
+ {
+ mid = (upper + lower) / 2 ;
+
+ if (x >= range[mid])
+ {
+ lower = mid ;
+ }
+ else
+ {
+ upper = mid ;
+ }
+ }
+
+ *i = lower ;
+
+ /* sanity check the result */
+
+ if (x < range[lower] || x >= range[lower + 1])
+ {
+ GSL_ERROR ("x not found in range", GSL_ESANITY);
+ }
+
+ return 0;
+}
+
diff --git a/gsl-1.9/histogram/find2d.c b/gsl-1.9/histogram/find2d.c
new file mode 100644
index 0000000..1b8e5b5
--- /dev/null
+++ b/gsl-1.9/histogram/find2d.c
@@ -0,0 +1,50 @@
+/* histogram/find2d.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "find.c"
+
+static int
+find2d (const size_t nx, const double xrange[],
+ const size_t ny, const double yrange[],
+ const double x, const double y,
+ size_t * i, size_t * j);
+
+
+static int
+find2d (const size_t nx, const double xrange[],
+ const size_t ny, const double yrange[],
+ const double x, const double y,
+ size_t * i, size_t * j)
+{
+ int status = find (nx, xrange, x, i);
+
+ if (status)
+ {
+ return status;
+ }
+
+ status = find (ny, yrange, y, j);
+
+ if (status)
+ {
+ return status;
+ }
+
+ return 0;
+}
diff --git a/gsl-1.9/histogram/get.c b/gsl-1.9/histogram/get.c
new file mode 100644
index 0000000..6e832a5
--- /dev/null
+++ b/gsl-1.9/histogram/get.c
@@ -0,0 +1,69 @@
+/* histogram/get.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_histogram.h>
+
+#include "find.c"
+
+double
+gsl_histogram_get (const gsl_histogram * h, size_t i)
+{
+ const size_t n = h->n;
+
+ if (i >= n)
+ {
+ GSL_ERROR_VAL ("index lies outside valid range of 0 .. n - 1",
+ GSL_EDOM, 0);
+ }
+
+ return h->bin[i];
+}
+
+int
+gsl_histogram_get_range (const gsl_histogram * h, size_t i,
+ double *lower, double *upper)
+{
+ const size_t n = h->n;
+
+ if (i >= n)
+ {
+ GSL_ERROR ("index lies outside valid range of 0 .. n - 1", GSL_EDOM);
+ }
+
+ *lower = h->range[i];
+ *upper = h->range[i + 1];
+
+ return GSL_SUCCESS;
+}
+
+int
+gsl_histogram_find (const gsl_histogram * h,
+ const double x, size_t * i)
+{
+ int status = find (h->n, h->range, x, i);
+
+ if (status)
+ {
+ GSL_ERROR ("x not found in range of h", GSL_EDOM);
+ }
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/histogram/get2d.c b/gsl-1.9/histogram/get2d.c
new file mode 100644
index 0000000..593e2de
--- /dev/null
+++ b/gsl-1.9/histogram/get2d.c
@@ -0,0 +1,101 @@
+/* histogram/get2d.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_histogram2d.h>
+
+#include "find.c"
+
+double
+gsl_histogram2d_get (const gsl_histogram2d * h, const size_t i, const size_t j)
+{
+ const size_t nx = h->nx;
+ const size_t ny = h->ny;
+
+ if (i >= nx)
+ {
+ GSL_ERROR_VAL ("index i lies outside valid range of 0 .. nx - 1",
+ GSL_EDOM, 0);
+ }
+
+ if (j >= ny)
+ {
+ GSL_ERROR_VAL ("index j lies outside valid range of 0 .. ny - 1",
+ GSL_EDOM, 0);
+ }
+
+ return h->bin[i * ny + j];
+}
+
+int
+gsl_histogram2d_get_xrange (const gsl_histogram2d * h, const size_t i,
+ double *xlower, double *xupper)
+{
+ const size_t nx = h->nx;
+
+ if (i >= nx)
+ {
+ GSL_ERROR ("index i lies outside valid range of 0 .. nx - 1", GSL_EDOM);
+ }
+
+ *xlower = h->xrange[i];
+ *xupper = h->xrange[i + 1];
+
+ return GSL_SUCCESS;
+}
+
+int
+gsl_histogram2d_get_yrange (const gsl_histogram2d * h, const size_t j,
+ double *ylower, double *yupper)
+{
+ const size_t ny = h->ny;
+
+ if (j >= ny)
+ {
+ GSL_ERROR ("index j lies outside valid range of 0 .. ny - 1", GSL_EDOM);
+ }
+
+ *ylower = h->yrange[j];
+ *yupper = h->yrange[j + 1];
+
+ return GSL_SUCCESS;
+}
+
+int
+gsl_histogram2d_find (const gsl_histogram2d * h,
+ const double x, const double y,
+ size_t * i, size_t * j)
+{
+ int status = find (h->nx, h->xrange, x, i);
+
+ if (status)
+ {
+ GSL_ERROR ("x not found in range of h", GSL_EDOM);
+ }
+
+ status = find (h->ny, h->yrange, y, j);
+
+ if (status)
+ {
+ GSL_ERROR ("y not found in range of h", GSL_EDOM);
+ }
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/histogram/gsl_histogram.h b/gsl-1.9/histogram/gsl_histogram.h
new file mode 100644
index 0000000..e246e3a
--- /dev/null
+++ b/gsl-1.9/histogram/gsl_histogram.h
@@ -0,0 +1,134 @@
+/* histogram/gsl_histogram.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_HISTOGRAM_H__
+#define __GSL_HISTOGRAM_H__
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+typedef struct {
+ size_t n ;
+ double * range ;
+ double * bin ;
+} gsl_histogram ;
+
+typedef struct {
+ size_t n ;
+ double * range ;
+ double * sum ;
+} gsl_histogram_pdf ;
+
+gsl_histogram * gsl_histogram_alloc (size_t n);
+
+gsl_histogram * gsl_histogram_calloc (size_t n);
+gsl_histogram * gsl_histogram_calloc_uniform (const size_t n, const double xmin, const double xmax);
+void gsl_histogram_free (gsl_histogram * h);
+int gsl_histogram_increment (gsl_histogram * h, double x);
+int gsl_histogram_accumulate (gsl_histogram * h, double x, double weight);
+int gsl_histogram_find (const gsl_histogram * h,
+ const double x, size_t * i);
+
+double gsl_histogram_get (const gsl_histogram * h, size_t i);
+int gsl_histogram_get_range (const gsl_histogram * h, size_t i,
+ double * lower, double * upper);
+
+double gsl_histogram_max (const gsl_histogram * h);
+double gsl_histogram_min (const gsl_histogram * h);
+size_t gsl_histogram_bins (const gsl_histogram * h);
+
+void gsl_histogram_reset (gsl_histogram * h);
+
+gsl_histogram * gsl_histogram_calloc_range(size_t n, double * range);
+
+int
+gsl_histogram_set_ranges (gsl_histogram * h, const double range[], size_t size);
+int
+gsl_histogram_set_ranges_uniform (gsl_histogram * h, double xmin, double xmax);
+
+
+
+int
+gsl_histogram_memcpy(gsl_histogram * dest, const gsl_histogram * source);
+
+gsl_histogram *
+gsl_histogram_clone(const gsl_histogram * source);
+
+double gsl_histogram_max_val (const gsl_histogram * h);
+
+size_t gsl_histogram_max_bin (const gsl_histogram * h);
+
+double gsl_histogram_min_val (const gsl_histogram * h);
+
+size_t gsl_histogram_min_bin (const gsl_histogram * h);
+
+int
+gsl_histogram_equal_bins_p(const gsl_histogram *h1, const gsl_histogram *h2);
+
+int
+gsl_histogram_add(gsl_histogram *h1, const gsl_histogram *h2);
+
+int
+gsl_histogram_sub(gsl_histogram *h1, const gsl_histogram *h2);
+
+int
+gsl_histogram_mul(gsl_histogram *h1, const gsl_histogram *h2);
+
+int
+gsl_histogram_div(gsl_histogram *h1, const gsl_histogram *h2);
+
+int
+gsl_histogram_scale(gsl_histogram *h, double scale);
+
+int
+gsl_histogram_shift (gsl_histogram * h, double shift);
+
+
+double gsl_histogram_sigma (const gsl_histogram * h);
+
+double gsl_histogram_mean (const gsl_histogram * h);
+
+double gsl_histogram_sum (const gsl_histogram * h);
+
+int gsl_histogram_fwrite (FILE * stream, const gsl_histogram * h) ;
+int gsl_histogram_fread (FILE * stream, gsl_histogram * h);
+int gsl_histogram_fprintf (FILE * stream, const gsl_histogram * h,
+ const char * range_format, const char * bin_format);
+int gsl_histogram_fscanf (FILE * stream, gsl_histogram * h);
+
+gsl_histogram_pdf * gsl_histogram_pdf_alloc (const size_t n);
+int gsl_histogram_pdf_init (gsl_histogram_pdf * p, const gsl_histogram * h);
+void gsl_histogram_pdf_free (gsl_histogram_pdf * p);
+double gsl_histogram_pdf_sample (const gsl_histogram_pdf * p, double r);
+
+__END_DECLS
+
+#endif /* __GSL_HISTOGRAM_H__ */
diff --git a/gsl-1.9/histogram/gsl_histogram2d.h b/gsl-1.9/histogram/gsl_histogram2d.h
new file mode 100644
index 0000000..b4628aa
--- /dev/null
+++ b/gsl-1.9/histogram/gsl_histogram2d.h
@@ -0,0 +1,172 @@
+/* histogram/gsl_histogram2d.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_HISTOGRAM2D_H__
+#define __GSL_HISTOGRAM2D_H__
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+typedef struct {
+ size_t nx, ny ;
+ double * xrange ;
+ double * yrange ;
+ double * bin ;
+} gsl_histogram2d ;
+
+typedef struct {
+ size_t nx, ny ;
+ double * xrange ;
+ double * yrange ;
+ double * sum ;
+} gsl_histogram2d_pdf ;
+
+gsl_histogram2d * gsl_histogram2d_alloc (const size_t nx, const size_t ny);
+gsl_histogram2d * gsl_histogram2d_calloc (const size_t nx, const size_t ny);
+gsl_histogram2d * gsl_histogram2d_calloc_uniform (const size_t nx, const size_t ny,
+ const double xmin, const double xmax,
+ const double ymin, const double ymax);
+
+void gsl_histogram2d_free (gsl_histogram2d * h);
+
+int gsl_histogram2d_increment (gsl_histogram2d * h, double x, double y);
+int gsl_histogram2d_accumulate (gsl_histogram2d * h,
+ double x, double y, double weight);
+int gsl_histogram2d_find (const gsl_histogram2d * h,
+ const double x, const double y, size_t * i, size_t * j);
+
+double gsl_histogram2d_get (const gsl_histogram2d * h, const size_t i, const size_t j);
+int gsl_histogram2d_get_xrange (const gsl_histogram2d * h, const size_t i,
+ double * xlower, double * xupper);
+int gsl_histogram2d_get_yrange (const gsl_histogram2d * h, const size_t j,
+ double * ylower, double * yupper);
+
+
+double gsl_histogram2d_xmax (const gsl_histogram2d * h);
+double gsl_histogram2d_xmin (const gsl_histogram2d * h);
+size_t gsl_histogram2d_nx (const gsl_histogram2d * h);
+
+double gsl_histogram2d_ymax (const gsl_histogram2d * h);
+double gsl_histogram2d_ymin (const gsl_histogram2d * h);
+size_t gsl_histogram2d_ny (const gsl_histogram2d * h);
+
+void gsl_histogram2d_reset (gsl_histogram2d * h);
+
+gsl_histogram2d *
+gsl_histogram2d_calloc_range(size_t nx, size_t ny,
+ double *xrange, double *yrange);
+
+int
+gsl_histogram2d_set_ranges_uniform (gsl_histogram2d * h,
+ double xmin, double xmax,
+ double ymin, double ymax);
+
+int
+gsl_histogram2d_set_ranges (gsl_histogram2d * h,
+ const double xrange[], size_t xsize,
+ const double yrange[], size_t ysize);
+
+int
+gsl_histogram2d_memcpy(gsl_histogram2d *dest, const gsl_histogram2d *source);
+
+gsl_histogram2d *
+gsl_histogram2d_clone(const gsl_histogram2d * source);
+
+double
+gsl_histogram2d_max_val(const gsl_histogram2d *h);
+
+void
+gsl_histogram2d_max_bin (const gsl_histogram2d *h, size_t *i, size_t *j);
+
+double
+gsl_histogram2d_min_val(const gsl_histogram2d *h);
+
+void
+gsl_histogram2d_min_bin (const gsl_histogram2d *h, size_t *i, size_t *j);
+
+double
+gsl_histogram2d_xmean (const gsl_histogram2d * h);
+
+double
+gsl_histogram2d_ymean (const gsl_histogram2d * h);
+
+double
+gsl_histogram2d_xsigma (const gsl_histogram2d * h);
+
+double
+gsl_histogram2d_ysigma (const gsl_histogram2d * h);
+
+double
+gsl_histogram2d_cov (const gsl_histogram2d * h);
+
+double
+gsl_histogram2d_sum (const gsl_histogram2d *h);
+
+int
+gsl_histogram2d_equal_bins_p(const gsl_histogram2d *h1,
+ const gsl_histogram2d *h2) ;
+
+int
+gsl_histogram2d_add(gsl_histogram2d *h1, const gsl_histogram2d *h2);
+
+int
+gsl_histogram2d_sub(gsl_histogram2d *h1, const gsl_histogram2d *h2);
+
+int
+gsl_histogram2d_mul(gsl_histogram2d *h1, const gsl_histogram2d *h2);
+
+int
+gsl_histogram2d_div(gsl_histogram2d *h1, const gsl_histogram2d *h2);
+
+int
+gsl_histogram2d_scale(gsl_histogram2d *h, double scale);
+
+int
+gsl_histogram2d_shift(gsl_histogram2d *h, double shift);
+
+int gsl_histogram2d_fwrite (FILE * stream, const gsl_histogram2d * h) ;
+int gsl_histogram2d_fread (FILE * stream, gsl_histogram2d * h);
+int gsl_histogram2d_fprintf (FILE * stream, const gsl_histogram2d * h,
+ const char * range_format,
+ const char * bin_format);
+int gsl_histogram2d_fscanf (FILE * stream, gsl_histogram2d * h);
+
+gsl_histogram2d_pdf * gsl_histogram2d_pdf_alloc (const size_t nx, const size_t ny);
+int gsl_histogram2d_pdf_init (gsl_histogram2d_pdf * p, const gsl_histogram2d * h);
+void gsl_histogram2d_pdf_free (gsl_histogram2d_pdf * p);
+int gsl_histogram2d_pdf_sample (const gsl_histogram2d_pdf * p,
+ double r1, double r2,
+ double * x, double * y);
+
+__END_DECLS
+
+#endif /* __GSL_HISTOGRAM2D_H__ */
+
diff --git a/gsl-1.9/histogram/init.c b/gsl-1.9/histogram/init.c
new file mode 100644
index 0000000..6ff47f5
--- /dev/null
+++ b/gsl-1.9/histogram/init.c
@@ -0,0 +1,198 @@
+/* histogram/init.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_histogram.h>
+
+gsl_histogram *
+gsl_histogram_alloc (size_t n)
+{
+ gsl_histogram *h;
+
+ if (n == 0)
+ {
+ GSL_ERROR_VAL ("histogram length n must be positive integer",
+ GSL_EDOM, 0);
+ }
+
+ h = (gsl_histogram *) malloc (sizeof (gsl_histogram));
+
+ if (h == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for histogram struct",
+ GSL_ENOMEM, 0);
+ }
+
+ h->range = (double *) malloc ((n + 1) * sizeof (double));
+
+ if (h->range == 0)
+ {
+ free (h); /* exception in constructor, avoid memory leak */
+
+ GSL_ERROR_VAL ("failed to allocate space for histogram ranges",
+ GSL_ENOMEM, 0);
+ }
+
+ h->bin = (double *) malloc (n * sizeof (double));
+
+ if (h->bin == 0)
+ {
+ free (h->range);
+ free (h); /* exception in constructor, avoid memory leak */
+
+ GSL_ERROR_VAL ("failed to allocate space for histogram bins",
+ GSL_ENOMEM, 0);
+ }
+
+ h->n = n;
+
+ return h;
+}
+
+static void
+make_uniform (double range[], size_t n, double xmin, double xmax)
+{
+ size_t i;
+
+ for (i = 0; i <= n; i++)
+ {
+ double f1 = ((double) (n-i) / (double) n);
+ double f2 = ((double) i / (double) n);
+ range[i] = f1 * xmin + f2 * xmax;
+ }
+}
+
+gsl_histogram *
+gsl_histogram_calloc_uniform (const size_t n, const double xmin,
+ const double xmax)
+{
+ gsl_histogram *h;
+
+ if (xmin >= xmax)
+ {
+ GSL_ERROR_VAL ("xmin must be less than xmax", GSL_EINVAL, 0);
+ }
+
+ h = gsl_histogram_calloc (n);
+
+ if (h == 0)
+ {
+ return h;
+ }
+
+ make_uniform (h->range, n, xmin, xmax);
+
+ return h;
+}
+
+gsl_histogram *
+gsl_histogram_calloc (size_t n)
+{
+ gsl_histogram * h = gsl_histogram_alloc (n);
+
+ if (h == 0)
+ {
+ return h;
+ }
+
+ {
+ size_t i;
+
+ for (i = 0; i < n + 1; i++)
+ {
+ h->range[i] = i;
+ }
+
+ for (i = 0; i < n; i++)
+ {
+ h->bin[i] = 0;
+ }
+ }
+
+ h->n = n;
+
+ return h;
+}
+
+
+void
+gsl_histogram_free (gsl_histogram * h)
+{
+ free (h->range);
+ free (h->bin);
+ free (h);
+}
+
+/* These initialization functions suggested by Achim Gaedke */
+
+int
+gsl_histogram_set_ranges_uniform (gsl_histogram * h, double xmin, double xmax)
+{
+ size_t i;
+ const size_t n = h->n;
+
+ if (xmin >= xmax)
+ {
+ GSL_ERROR ("xmin must be less than xmax", GSL_EINVAL);
+ }
+
+ /* initialize ranges */
+
+ make_uniform (h->range, n, xmin, xmax);
+
+ /* clear contents */
+
+ for (i = 0; i < n; i++)
+ {
+ h->bin[i] = 0;
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+gsl_histogram_set_ranges (gsl_histogram * h, const double range[], size_t size)
+{
+ size_t i;
+ const size_t n = h->n;
+
+ if (size != (n+1))
+ {
+ GSL_ERROR ("size of range must match size of histogram", GSL_EINVAL);
+ }
+
+ /* initialize ranges */
+
+ for (i = 0; i <= n; i++)
+ {
+ h->range[i] = range[i];
+ }
+
+ /* clear contents */
+
+ for (i = 0; i < n; i++)
+ {
+ h->bin[i] = 0;
+ }
+
+ return GSL_SUCCESS;
+}
+
diff --git a/gsl-1.9/histogram/init2d.c b/gsl-1.9/histogram/init2d.c
new file mode 100644
index 0000000..bed068f
--- /dev/null
+++ b/gsl-1.9/histogram/init2d.c
@@ -0,0 +1,300 @@
+/* histogram/init2d.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_histogram2d.h>
+
+gsl_histogram2d *
+gsl_histogram2d_alloc (const size_t nx, const size_t ny)
+{
+ gsl_histogram2d *h;
+
+ if (nx == 0)
+ {
+ GSL_ERROR_VAL ("histogram2d length nx must be positive integer",
+ GSL_EDOM, 0);
+ }
+
+ if (ny == 0)
+ {
+ GSL_ERROR_VAL ("histogram2d length ny must be positive integer",
+ GSL_EDOM, 0);
+ }
+
+ h = (gsl_histogram2d *) malloc (sizeof (gsl_histogram2d));
+
+ if (h == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for histogram2d struct",
+ GSL_ENOMEM, 0);
+ }
+
+ h->xrange = (double *) malloc ((nx + 1) * sizeof (double));
+
+ if (h->xrange == 0)
+ {
+ free (h); /* exception in constructor, avoid memory leak */
+
+ GSL_ERROR_VAL ("failed to allocate space for histogram2d x ranges",
+ GSL_ENOMEM, 0);
+ }
+
+ h->yrange = (double *) malloc ((ny + 1) * sizeof (double));
+
+ if (h->yrange == 0)
+ {
+ free (h->xrange);
+ free (h); /* exception in constructor, avoid memory leak */
+
+ GSL_ERROR_VAL ("failed to allocate space for histogram2d y ranges",
+ GSL_ENOMEM, 0);
+ }
+
+ h->bin = (double *) malloc (nx * ny * sizeof (double));
+
+ if (h->bin == 0)
+ {
+ free (h->xrange);
+ free (h->yrange);
+ free (h); /* exception in constructor, avoid memory leak */
+
+ GSL_ERROR_VAL ("failed to allocate space for histogram bins",
+ GSL_ENOMEM, 0);
+ }
+
+ h->nx = nx;
+ h->ny = ny;
+
+ return h;
+}
+
+static void
+make_uniform (double range[], size_t n, double xmin, double xmax)
+{
+ size_t i;
+
+ for (i = 0; i <= n; i++)
+ {
+ double f1 = ((double) (n-i) / (double) n);
+ double f2 = ((double) i / (double) n);
+ range[i] = f1 * xmin + f2 * xmax;
+ }
+}
+
+gsl_histogram2d *
+gsl_histogram2d_calloc_uniform (const size_t nx, const size_t ny,
+ const double xmin, const double xmax,
+ const double ymin, const double ymax)
+{
+ gsl_histogram2d *h;
+
+ if (xmin >= xmax)
+ {
+ GSL_ERROR_VAL ("xmin must be less than xmax", GSL_EINVAL, 0);
+ }
+
+ if (ymin >= ymax)
+ {
+ GSL_ERROR_VAL ("ymin must be less than ymax", GSL_EINVAL, 0);
+ }
+
+ h = gsl_histogram2d_calloc (nx, ny);
+
+ if (h == 0)
+ {
+ return h;
+ }
+
+ make_uniform (h->xrange, nx, xmin, xmax);
+ make_uniform (h->yrange, ny, ymin, ymax);
+
+ return h;
+}
+
+gsl_histogram2d *
+gsl_histogram2d_calloc (const size_t nx, const size_t ny)
+{
+ gsl_histogram2d *h;
+
+ if (nx == 0)
+ {
+ GSL_ERROR_VAL ("histogram2d length nx must be positive integer",
+ GSL_EDOM, 0);
+ }
+
+ if (ny == 0)
+ {
+ GSL_ERROR_VAL ("histogram2d length ny must be positive integer",
+ GSL_EDOM, 0);
+ }
+
+ h = (gsl_histogram2d *) malloc (sizeof (gsl_histogram2d));
+
+ if (h == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for histogram2d struct",
+ GSL_ENOMEM, 0);
+ }
+
+ h->xrange = (double *) malloc ((nx + 1) * sizeof (double));
+
+ if (h->xrange == 0)
+ {
+ free (h); /* exception in constructor, avoid memory leak */
+
+ GSL_ERROR_VAL ("failed to allocate space for histogram2d x ranges",
+ GSL_ENOMEM, 0);
+ }
+
+ h->yrange = (double *) malloc ((ny + 1) * sizeof (double));
+
+ if (h->yrange == 0)
+ {
+ free (h->xrange);
+ free (h); /* exception in constructor, avoid memory leak */
+
+ GSL_ERROR_VAL ("failed to allocate space for histogram2d y ranges",
+ GSL_ENOMEM, 0);
+ }
+
+ h->bin = (double *) malloc (nx * ny * sizeof (double));
+
+ if (h->bin == 0)
+ {
+ free (h->xrange);
+ free (h->yrange);
+ free (h); /* exception in constructor, avoid memory leak */
+
+ GSL_ERROR_VAL ("failed to allocate space for histogram bins",
+ GSL_ENOMEM, 0);
+ }
+
+ {
+ size_t i;
+
+ for (i = 0; i < nx + 1; i++)
+ {
+ h->xrange[i] = i;
+ }
+
+ for (i = 0; i < ny + 1; i++)
+ {
+ h->yrange[i] = i;
+ }
+
+ for (i = 0; i < nx * ny; i++)
+ {
+ h->bin[i] = 0;
+ }
+ }
+
+ h->nx = nx;
+ h->ny = ny;
+
+ return h;
+}
+
+
+void
+gsl_histogram2d_free (gsl_histogram2d * h)
+{
+ free (h->xrange);
+ free (h->yrange);
+ free (h->bin);
+ free (h);
+}
+
+
+int
+gsl_histogram2d_set_ranges_uniform (gsl_histogram2d * h,
+ double xmin, double xmax,
+ double ymin, double ymax)
+{
+ size_t i;
+ const size_t nx = h->nx, ny = h->ny;
+
+ if (xmin >= xmax)
+ {
+ GSL_ERROR_VAL ("xmin must be less than xmax", GSL_EINVAL, 0);
+ }
+
+ if (ymin >= ymax)
+ {
+ GSL_ERROR_VAL ("ymin must be less than ymax", GSL_EINVAL, 0);
+ }
+
+ /* initialize ranges */
+
+ make_uniform (h->xrange, nx, xmin, xmax);
+ make_uniform (h->yrange, ny, ymin, ymax);
+
+ /* clear contents */
+
+ for (i = 0; i < nx * ny; i++)
+ {
+ h->bin[i] = 0;
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+gsl_histogram2d_set_ranges (gsl_histogram2d * h,
+ const double xrange[], size_t xsize,
+ const double yrange[], size_t ysize)
+{
+ size_t i;
+ const size_t nx = h->nx, ny = h->ny;
+
+ if (xsize != (nx + 1))
+ {
+ GSL_ERROR_VAL ("size of xrange must match size of histogram",
+ GSL_EINVAL, 0);
+ }
+
+ if (ysize != (ny + 1))
+ {
+ GSL_ERROR_VAL ("size of yrange must match size of histogram",
+ GSL_EINVAL, 0);
+ }
+
+ /* initialize ranges */
+
+ for (i = 0; i <= nx; i++)
+ {
+ h->xrange[i] = xrange[i];
+ }
+
+ for (i = 0; i <= ny; i++)
+ {
+ h->yrange[i] = yrange[i];
+ }
+
+ /* clear contents */
+
+ for (i = 0; i < nx * ny; i++)
+ {
+ h->bin[i] = 0;
+ }
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/histogram/maxval.c b/gsl-1.9/histogram/maxval.c
new file mode 100644
index 0000000..2031537
--- /dev/null
+++ b/gsl-1.9/histogram/maxval.c
@@ -0,0 +1,101 @@
+/* gsl_histogram_maxval.c
+ * Copyright (C) 2000 Simone Piccardi
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+/***************************************************************
+ *
+ * File gsl_histogram_maxval.c:
+ * Routine to find maximum and minumum content of a hisogram.
+ * Need GSL library and header.
+ * Contains the routines:
+ * gsl_histogram_max_val find max content values
+ * gsl_histogram_min_val find min content values
+ * gsl_histogram_bin_max find coordinates of max contents bin
+ * gsl_histogram_bin_min find coordinates of min contents bin
+ *
+ * Author: S. Piccardi
+ * Jan. 2000
+ *
+ ***************************************************************/
+#include <config.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_histogram.h>
+
+double
+gsl_histogram_max_val (const gsl_histogram * h)
+{
+ const size_t n = h->n;
+ size_t i;
+ double max = h->bin[0];
+ for (i = 0; i < n; i++)
+ {
+ if (h->bin[i] > max)
+ {
+ max = h->bin[i];
+ }
+ }
+ return max;
+}
+
+size_t
+gsl_histogram_max_bin (const gsl_histogram * h)
+{
+ size_t i;
+ size_t imax = 0;
+ double max = h->bin[0];
+ for (i = 0; i < h->n; i++)
+ {
+ if (h->bin[i] > max)
+ {
+ max = h->bin[i];
+ imax = i;
+ }
+ }
+ return imax;
+}
+
+double
+gsl_histogram_min_val (const gsl_histogram * h)
+{
+ size_t i;
+ double min = h->bin[0];
+ for (i = 0; i < h->n; i++)
+ {
+ if (h->bin[i] < min)
+ {
+ min = h->bin[i];
+ }
+ }
+ return min;
+}
+
+size_t
+gsl_histogram_min_bin (const gsl_histogram * h)
+{
+ size_t i;
+ size_t imin = 0;
+ double min = h->bin[0];
+ for (i = 0; i < h->n; i++)
+ {
+ if (h->bin[i] < min)
+ {
+ min = h->bin[i];
+ imin = i;
+ }
+ }
+ return imin;
+}
diff --git a/gsl-1.9/histogram/maxval2d.c b/gsl-1.9/histogram/maxval2d.c
new file mode 100644
index 0000000..916fc85
--- /dev/null
+++ b/gsl-1.9/histogram/maxval2d.c
@@ -0,0 +1,140 @@
+/* gsl_histogram2d_maxval.c
+ * Copyright (C) 2000 Simone Piccardi
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+/***************************************************************
+ *
+ * File gsl_histogram2d_maxval.c:
+ * Routine to find maximum and minumum content of a 2D hisogram.
+ * Need GSL library and header.
+ * Contains the routines:
+ * gsl_histogram2d_max_val find max content values
+ * gsl_histogram2d_min_val find min content values
+ * gsl_histogram2d_bin_max find coordinates of max contents bin
+ * gsl_histogram2d_bin_min find coordinates of min contents bin
+ *
+ * Author: S. Piccardi
+ * Jan. 2000
+ *
+ ***************************************************************/
+#include <config.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_histogram2d.h>
+/*
+ * Return the maximum contents value of a 2D histogram
+ */
+double
+gsl_histogram2d_max_val (const gsl_histogram2d * h)
+{
+ const size_t nx = h->nx;
+ const size_t ny = h->ny;
+ size_t i;
+ double max = h->bin[0 * ny + 0];
+
+ for (i = 0; i < nx * ny; i++)
+ {
+ if (h->bin[i] > max)
+ {
+ max = h->bin[i];
+ }
+ }
+ return max;
+}
+
+/*
+ * Find the bin index for maximum value of a 2D histogram
+ */
+
+void
+gsl_histogram2d_max_bin (const gsl_histogram2d * h, size_t * imax_out, size_t * jmax_out)
+{
+ const size_t nx = h->nx;
+ const size_t ny = h->ny;
+ size_t imax = 0, jmax = 0, i, j;
+ double max = h->bin[0 * ny + 0];
+
+ for (i = 0; i < nx; i++)
+ {
+ for (j = 0; j < ny; j++)
+ {
+ double x = h->bin[i * ny + j];
+
+ if (x > max)
+ {
+ max = x;
+ imax = i;
+ jmax = j;
+ }
+ }
+ }
+
+ *imax_out = imax;
+ *jmax_out = jmax;
+}
+
+/*
+ * Return the minimum contents value of a 2D histogram
+ */
+
+double
+gsl_histogram2d_min_val (const gsl_histogram2d * h)
+{
+ const size_t nx = h->nx;
+ const size_t ny = h->ny;
+ size_t i;
+ double min = h->bin[0 * ny + 0];
+
+ for (i = 0; i < nx * ny; i++)
+ {
+ if (h->bin[i] < min)
+ {
+ min = h->bin[i];
+ }
+ }
+
+ return min;
+}
+/*
+ * Find the bin index for minimum value of a 2D histogram
+ */
+void
+gsl_histogram2d_min_bin (const gsl_histogram2d * h, size_t * imin_out, size_t * jmin_out)
+{
+ const size_t nx = h->nx;
+ const size_t ny = h->ny;
+ size_t imin = 0, jmin = 0, i, j;
+ double min = h->bin[0 * ny + 0];
+
+ for (i = 0; i < nx; i++)
+ {
+ for (j = 0; j < ny; j++)
+ {
+ double x = h->bin[i * ny + j];
+
+ if (x < min)
+ {
+ min = x;
+ imin = i;
+ jmin = j;
+ }
+ }
+ }
+
+ *imin_out = imin;
+ *jmin_out = jmin;
+}
+
diff --git a/gsl-1.9/histogram/oper.c b/gsl-1.9/histogram/oper.c
new file mode 100644
index 0000000..1d96a6d
--- /dev/null
+++ b/gsl-1.9/histogram/oper.c
@@ -0,0 +1,195 @@
+/* gsl_histogram_oper.c
+ * Copyright (C) 2000 Simone Piccardi
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+/***************************************************************
+ *
+ * File gsl_histogram_oper.c:
+ * Routine to make operation on histograms.
+ * Need GSL library and header.
+ * Contains the routines:
+ * gsl_histogram_same_binning check if two histograms have the same binning
+ * gsl_histogram_add add two histograms
+ * gsl_histogram_sub subctract two histograms
+ * gsl_histogram_mult multiply two histograms
+ * gsl_histogram_div divide two histograms
+ * gsl_histogram_scale scale histogram contents
+ *
+ * Author: S. Piccardi
+ * Jan. 2000
+ *
+ ***************************************************************/
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_histogram.h>
+
+/*
+ * gsl_histogram_same_binning:
+ * control if two histograms have the
+ * same binning
+ */
+
+int
+gsl_histogram_equal_bins_p (const gsl_histogram * h1, const gsl_histogram * h2)
+{
+ if (h1->n != h2->n)
+ {
+ return 0;
+ }
+
+ {
+ size_t i;
+ /* init ranges */
+
+ for (i = 0; i <= h1->n; i++)
+ {
+ if (h1->range[i] != h2->range[i])
+ {
+ return 0;
+ }
+ }
+ }
+
+ return 1;
+}
+
+/*
+ * gsl_histogram_add:
+ * add two histograms
+ */
+int
+gsl_histogram_add (gsl_histogram * h1, const gsl_histogram * h2)
+{
+ size_t i;
+
+ if (!gsl_histogram_equal_bins_p (h1, h2))
+ {
+ GSL_ERROR ("histograms have different binning", GSL_EINVAL);
+ }
+
+ for (i = 0; i < h1->n; i++)
+ {
+ h1->bin[i] += h2->bin[i];
+ }
+
+ return GSL_SUCCESS;
+}
+
+/*
+ * gsl_histogram_sub:
+ * subtract two histograms
+ */
+
+int
+gsl_histogram_sub (gsl_histogram * h1, const gsl_histogram * h2)
+{
+ size_t i;
+
+ if (!gsl_histogram_equal_bins_p (h1, h2))
+ {
+ GSL_ERROR ("histograms have different binning", GSL_EINVAL);
+ }
+
+ for (i = 0; i < h1->n; i++)
+ {
+ h1->bin[i] -= h2->bin[i];
+ }
+
+ return GSL_SUCCESS;
+
+}
+
+/*
+ * gsl_histogram_mult:
+ * multiply two histograms
+ */
+
+int
+gsl_histogram_mul (gsl_histogram * h1, const gsl_histogram * h2)
+{
+ size_t i;
+
+ if (!gsl_histogram_equal_bins_p (h1, h2))
+ {
+ GSL_ERROR ("histograms have different binning", GSL_EINVAL);
+ }
+
+ for (i = 0; i < h1->n; i++)
+ {
+ h1->bin[i] *= h2->bin[i];
+ }
+
+ return GSL_SUCCESS;
+}
+/*
+ * gsl_histogram_div:
+ * divide two histograms
+ */
+int
+gsl_histogram_div (gsl_histogram * h1, const gsl_histogram * h2)
+{
+ size_t i;
+
+ if (!gsl_histogram_equal_bins_p (h1, h2))
+ {
+ GSL_ERROR ("histograms have different binning", GSL_EINVAL);
+ }
+
+ for (i = 0; i < h1->n; i++)
+ {
+ h1->bin[i] /= h2->bin[i];
+ }
+
+ return GSL_SUCCESS;
+}
+
+/*
+ * gsl_histogram_scale:
+ * scale a histogram by a numeric factor
+ */
+
+int
+gsl_histogram_scale (gsl_histogram * h, double scale)
+{
+ size_t i;
+
+ for (i = 0; i < h->n; i++)
+ {
+ h->bin[i] *= scale;
+ }
+
+ return GSL_SUCCESS;
+}
+
+/*
+ * gsl_histogram_shift:
+ * shift a histogram by a numeric offset
+ */
+
+int
+gsl_histogram_shift (gsl_histogram * h, double shift)
+{
+ size_t i;
+
+ for (i = 0; i < h->n; i++)
+ {
+ h->bin[i] += shift;
+ }
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/histogram/oper2d.c b/gsl-1.9/histogram/oper2d.c
new file mode 100644
index 0000000..054f78f
--- /dev/null
+++ b/gsl-1.9/histogram/oper2d.c
@@ -0,0 +1,203 @@
+/* gsl_histogram2d_oper.c
+ * Copyright (C) 2000 Simone Piccardi
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+/***************************************************************
+ *
+ * File gsl_histogram2d_oper.c:
+ * Routine to make operation on 2D histograms.
+ * Need GSL library and header.
+ * Contains the routines:
+ * gsl_histogram2d_same_binning check if two histograms have the same binning
+ * gsl_histogram2d_add add two histogram
+ * gsl_histogram2d_sub subctract two histogram
+ * gsl_histogram2d_mult multiply two histogram
+ * gsl_histogram2d_div divide two histogram
+ * gsl_histogram2d_scale scale histogram contents
+ *
+ * Author: S. Piccardi
+ * Jan. 2000
+ *
+ ***************************************************************/
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_histogram2d.h>
+
+/*
+ * gsl_histogram2d_same_binning:
+ * control if two histogram have the
+ * same binning
+ */
+int
+gsl_histogram2d_equal_bins_p (const gsl_histogram2d * h1,
+ const gsl_histogram2d * h2)
+{
+
+ if ((h1->nx != h2->nx) || (h1->ny != h2->ny))
+ {
+ return 0;
+ }
+ {
+ size_t i;
+ /* init ranges */
+ for (i = 0; i <= (h1->nx); i++)
+ {
+ if (h1->xrange[i] != h2->xrange[i])
+ {
+ return 0;
+ }
+ }
+ for (i = 0; i <= (h1->ny); i++)
+ {
+ if (h1->yrange[i] != h2->yrange[i])
+ {
+ return 0;
+ }
+ }
+ }
+ return 1;
+}
+
+/*
+ * gsl_histogram2d_add:
+ * add two histogram
+ */
+
+int
+gsl_histogram2d_add (gsl_histogram2d * h1, const gsl_histogram2d * h2)
+{
+ size_t i;
+
+ if (!gsl_histogram2d_equal_bins_p (h1, h2))
+ {
+ GSL_ERROR ("histograms have different binning", GSL_EINVAL);
+ }
+
+ for (i = 0; i < (h1->nx) * (h1->ny); i++)
+ {
+ h1->bin[i] += h2->bin[i];
+ }
+
+ return GSL_SUCCESS;
+}
+
+/*
+ * gsl_histogram2d_sub:
+ * subtract two histogram
+ */
+
+int
+gsl_histogram2d_sub (gsl_histogram2d * h1, const gsl_histogram2d * h2)
+{
+ size_t i;
+
+ if (!gsl_histogram2d_equal_bins_p (h1, h2))
+ {
+ GSL_ERROR ("histograms have different binning", GSL_EINVAL);
+ }
+
+ for (i = 0; i < (h1->nx) * (h1->ny); i++)
+ {
+ h1->bin[i] -= h2->bin[i];
+ }
+
+ return GSL_SUCCESS;
+}
+
+/*
+ * gsl_histogram2d_mult:
+ * multiply two histogram
+ */
+
+int
+gsl_histogram2d_mul (gsl_histogram2d * h1, const gsl_histogram2d * h2)
+{
+ size_t i;
+
+ if (!gsl_histogram2d_equal_bins_p (h1, h2))
+ {
+ GSL_ERROR ("histograms have different binning", GSL_EINVAL);
+ }
+
+ for (i = 0; i < (h1->nx) * (h1->ny); i++)
+ {
+ h1->bin[i] *= h2->bin[i];
+ }
+
+ return GSL_SUCCESS;
+}
+
+/*
+ * gsl_histogram2d_div:
+ * divide two histogram
+ */
+
+int
+gsl_histogram2d_div (gsl_histogram2d * h1, const gsl_histogram2d * h2)
+{
+ size_t i;
+
+ if (!gsl_histogram2d_equal_bins_p (h1, h2))
+ {
+ GSL_ERROR ("histograms have different binning", GSL_EINVAL);
+ }
+
+ for (i = 0; i < (h1->nx) * (h1->ny); i++)
+ {
+ h1->bin[i] /= h2->bin[i];
+ }
+
+ return GSL_SUCCESS;
+}
+
+/*
+ * gsl_histogram2d_scale:
+ * scale a histogram by a numeric factor
+ */
+
+int
+gsl_histogram2d_scale (gsl_histogram2d * h, double scale)
+{
+ size_t i;
+
+ for (i = 0; i < (h->nx) * (h->ny); i++)
+ {
+ h->bin[i] *= scale;
+ }
+
+ return GSL_SUCCESS;
+}
+
+/*
+ * gsl_histogram2d_shift:
+ * shift a histogram by a numeric offset
+ */
+
+int
+gsl_histogram2d_shift (gsl_histogram2d * h, double shift)
+{
+ size_t i;
+
+ for (i = 0; i < (h->nx) * (h->ny); i++)
+ {
+ h->bin[i] += shift;
+ }
+
+ return GSL_SUCCESS;
+}
+
diff --git a/gsl-1.9/histogram/params.c b/gsl-1.9/histogram/params.c
new file mode 100644
index 0000000..9e2ca12
--- /dev/null
+++ b/gsl-1.9/histogram/params.c
@@ -0,0 +1,42 @@
+/* histogram/params.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_histogram.h>
+
+double
+gsl_histogram_max (const gsl_histogram * h)
+{
+ const int n = h->n;
+
+ return h->range[n];
+}
+
+double
+gsl_histogram_min (const gsl_histogram * h)
+{
+ return h->range[0];
+}
+
+size_t
+gsl_histogram_bins (const gsl_histogram * h)
+{
+ return h->n;
+}
diff --git a/gsl-1.9/histogram/params2d.c b/gsl-1.9/histogram/params2d.c
new file mode 100644
index 0000000..3ca946e
--- /dev/null
+++ b/gsl-1.9/histogram/params2d.c
@@ -0,0 +1,60 @@
+/* histogram/params2d.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_histogram2d.h>
+
+double
+gsl_histogram2d_xmax (const gsl_histogram2d * h)
+{
+ const int nx = h->nx;
+ return h->xrange[nx];
+}
+
+double
+gsl_histogram2d_xmin (const gsl_histogram2d * h)
+{
+ return h->xrange[0];
+}
+
+double
+gsl_histogram2d_ymax (const gsl_histogram2d * h)
+{
+ const int ny = h->ny;
+ return h->yrange[ny];
+}
+
+double
+gsl_histogram2d_ymin (const gsl_histogram2d * h)
+{
+ return h->yrange[0];
+}
+
+size_t
+gsl_histogram2d_nx (const gsl_histogram2d * h)
+{
+ return h->nx;
+}
+
+size_t
+gsl_histogram2d_ny (const gsl_histogram2d * h)
+{
+ return h->ny;
+}
diff --git a/gsl-1.9/histogram/pdf.c b/gsl-1.9/histogram/pdf.c
new file mode 100644
index 0000000..78f9a22
--- /dev/null
+++ b/gsl-1.9/histogram/pdf.c
@@ -0,0 +1,153 @@
+/* histogram/pdf.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_histogram.h>
+
+#include "find.c"
+
+double
+gsl_histogram_pdf_sample (const gsl_histogram_pdf * p, double r)
+{
+ size_t i;
+ int status;
+
+/* Wrap the exclusive top of the bin down to the inclusive bottom of
+ the bin. Since this is a single point it should not affect the
+ distribution. */
+
+ if (r == 1.0)
+ {
+ r = 0.0;
+ }
+
+ status = find (p->n, p->sum, r, &i);
+
+ if (status)
+ {
+ GSL_ERROR_VAL ("cannot find r in cumulative pdf", GSL_EDOM, 0);
+ }
+ else
+ {
+ double delta = (r - p->sum[i]) / (p->sum[i + 1] - p->sum[i]);
+ double x = p->range[i] + delta * (p->range[i + 1] - p->range[i]);
+ return x;
+ }
+}
+
+gsl_histogram_pdf *
+gsl_histogram_pdf_alloc (const size_t n)
+{
+ gsl_histogram_pdf *p;
+
+ if (n == 0)
+ {
+ GSL_ERROR_VAL ("histogram pdf length n must be positive integer",
+ GSL_EDOM, 0);
+ }
+
+ p = (gsl_histogram_pdf *) malloc (sizeof (gsl_histogram_pdf));
+
+ if (p == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for histogram pdf struct",
+ GSL_ENOMEM, 0);
+ }
+
+ p->range = (double *) malloc ((n + 1) * sizeof (double));
+
+ if (p->range == 0)
+ {
+ free (p); /* exception in constructor, avoid memory leak */
+
+ GSL_ERROR_VAL ("failed to allocate space for histogram pdf ranges",
+ GSL_ENOMEM, 0);
+ }
+
+ p->sum = (double *) malloc ((n + 1) * sizeof (double));
+
+ if (p->sum == 0)
+ {
+ free (p->range);
+ free (p); /* exception in constructor, avoid memory leak */
+
+ GSL_ERROR_VAL ("failed to allocate space for histogram pdf sums",
+ GSL_ENOMEM, 0);
+ }
+
+ p->n = n;
+
+ return p;
+}
+
+int
+gsl_histogram_pdf_init (gsl_histogram_pdf * p, const gsl_histogram * h)
+{
+ size_t i;
+ size_t n = p->n;
+
+ if (n != h->n)
+ {
+ GSL_ERROR ("histogram length must match pdf length", GSL_EINVAL);
+ }
+
+ for (i = 0; i < n; i++)
+ {
+ if (h->bin[i] < 0)
+ {
+ GSL_ERROR ("histogram bins must be non-negative to compute"
+ "a probability distribution", GSL_EDOM);
+ }
+ }
+
+ for (i = 0; i < n + 1; i++)
+ {
+ p->range[i] = h->range[i];
+ }
+
+ {
+ double mean = 0, sum = 0;
+
+ for (i = 0; i < n; i++)
+ {
+ mean += (h->bin[i] - mean) / ((double) (i + 1));
+ }
+
+ p->sum[0] = 0;
+
+ for (i = 0; i < n; i++)
+ {
+ sum += (h->bin[i] / mean) / n;
+ p->sum[i + 1] = sum;
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+void
+gsl_histogram_pdf_free (gsl_histogram_pdf * p)
+{
+ free (p->range);
+ free (p->sum);
+ free (p);
+}
diff --git a/gsl-1.9/histogram/pdf2d.c b/gsl-1.9/histogram/pdf2d.c
new file mode 100644
index 0000000..f62dea5
--- /dev/null
+++ b/gsl-1.9/histogram/pdf2d.c
@@ -0,0 +1,186 @@
+/* histogram/pdf2d.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_histogram.h>
+#include <gsl/gsl_histogram2d.h>
+
+#include "find.c"
+
+int
+gsl_histogram2d_pdf_sample (const gsl_histogram2d_pdf * p,
+ double r1, double r2,
+ double *x, double *y)
+{
+ size_t k;
+ int status;
+
+/* Wrap the exclusive top of the bin down to the inclusive bottom of
+ the bin. Since this is a single point it should not affect the
+ distribution. */
+
+ if (r2 == 1.0)
+ {
+ r2 = 0.0;
+ }
+ if (r1 == 1.0)
+ {
+ r1 = 0.0;
+ }
+
+ status = find (p->nx * p->ny, p->sum, r1, &k);
+
+ if (status)
+ {
+ GSL_ERROR ("cannot find r1 in cumulative pdf", GSL_EDOM);
+ }
+ else
+ {
+ size_t i = k / p->ny;
+ size_t j = k - (i * p->ny);
+ double delta = (r1 - p->sum[k]) / (p->sum[k + 1] - p->sum[k]);
+ *x = p->xrange[i] + delta * (p->xrange[i + 1] - p->xrange[i]);
+ *y = p->yrange[j] + r2 * (p->yrange[j + 1] - p->yrange[j]);
+ return GSL_SUCCESS;
+ }
+}
+
+gsl_histogram2d_pdf *
+gsl_histogram2d_pdf_alloc (const size_t nx, const size_t ny)
+{
+ const size_t n = nx * ny;
+
+ gsl_histogram2d_pdf *p;
+
+ if (n == 0)
+ {
+ GSL_ERROR_VAL ("histogram2d pdf length n must be positive integer",
+ GSL_EDOM, 0);
+ }
+
+ p = (gsl_histogram2d_pdf *) malloc (sizeof (gsl_histogram2d_pdf));
+
+ if (p == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for histogram2d pdf struct",
+ GSL_ENOMEM, 0);
+ }
+
+ p->xrange = (double *) malloc ((nx + 1) * sizeof (double));
+
+ if (p->xrange == 0)
+ {
+ free (p); /* exception in constructor, avoid memory leak */
+
+ GSL_ERROR_VAL ("failed to allocate space for histogram2d pdf xranges",
+ GSL_ENOMEM, 0);
+ }
+
+ p->yrange = (double *) malloc ((ny + 1) * sizeof (double));
+
+ if (p->yrange == 0)
+ {
+ free (p->xrange);
+ free (p); /* exception in constructor, avoid memory leak */
+
+ GSL_ERROR_VAL ("failed to allocate space for histogram2d pdf yranges",
+ GSL_ENOMEM, 0);
+ }
+
+ p->sum = (double *) malloc ((n + 1) * sizeof (double));
+
+ if (p->sum == 0)
+ {
+ free (p->yrange);
+ free (p->xrange);
+ free (p); /* exception in constructor, avoid memory leak */
+
+ GSL_ERROR_VAL ("failed to allocate space for histogram2d pdf sums",
+ GSL_ENOMEM, 0);
+ }
+
+ p->nx = nx;
+ p->ny = ny;
+
+ return p;
+}
+
+int
+gsl_histogram2d_pdf_init (gsl_histogram2d_pdf * p, const gsl_histogram2d * h)
+{
+ size_t i;
+ const size_t nx = p->nx;
+ const size_t ny = p->ny;
+ const size_t n = nx * ny;
+
+ if (nx != h->nx || ny != h->ny)
+ {
+ GSL_ERROR ("histogram2d size must match pdf size", GSL_EDOM);
+ }
+
+ for (i = 0; i < n; i++)
+ {
+ if (h->bin[i] < 0)
+ {
+ GSL_ERROR ("histogram bins must be non-negative to compute"
+ "a probability distribution", GSL_EDOM);
+ }
+ }
+
+ for (i = 0; i < nx + 1; i++)
+ {
+ p->xrange[i] = h->xrange[i];
+ }
+
+ for (i = 0; i < ny + 1; i++)
+ {
+ p->yrange[i] = h->yrange[i];
+ }
+
+ {
+ double mean = 0, sum = 0;
+
+ for (i = 0; i < n; i++)
+ {
+ mean += (h->bin[i] - mean) / ((double) (i + 1));
+ }
+
+ p->sum[0] = 0;
+
+ for (i = 0; i < n; i++)
+ {
+ sum += (h->bin[i] / mean) / n;
+ p->sum[i + 1] = sum;
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+void
+gsl_histogram2d_pdf_free (gsl_histogram2d_pdf * p)
+{
+ free (p->xrange);
+ free (p->yrange);
+ free (p->sum);
+ free (p);
+}
diff --git a/gsl-1.9/histogram/reset.c b/gsl-1.9/histogram/reset.c
new file mode 100644
index 0000000..1206122
--- /dev/null
+++ b/gsl-1.9/histogram/reset.c
@@ -0,0 +1,34 @@
+/* histogram/reset.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_histogram.h>
+
+void
+gsl_histogram_reset (gsl_histogram * h)
+{
+ size_t i;
+ const size_t n = h->n;
+
+ for (i = 0; i < n; i++)
+ {
+ h->bin[i] = 0;
+ }
+}
diff --git a/gsl-1.9/histogram/reset2d.c b/gsl-1.9/histogram/reset2d.c
new file mode 100644
index 0000000..160b1da
--- /dev/null
+++ b/gsl-1.9/histogram/reset2d.c
@@ -0,0 +1,35 @@
+/* histogram/reset2d.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_histogram2d.h>
+
+void
+gsl_histogram2d_reset (gsl_histogram2d * h)
+{
+ size_t i;
+ const size_t nx = h->nx;
+ const size_t ny = h->ny;
+
+ for (i = 0; i < nx * ny; i++)
+ {
+ h->bin[i] = 0;
+ }
+}
diff --git a/gsl-1.9/histogram/stat.c b/gsl-1.9/histogram/stat.c
new file mode 100644
index 0000000..5ee9e9c
--- /dev/null
+++ b/gsl-1.9/histogram/stat.c
@@ -0,0 +1,140 @@
+/* gsl_histogram_stat.c
+ * Copyright (C) 2000 Simone Piccardi
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+/***************************************************************
+ *
+ * File gsl_histogram_stat.c:
+ * Routines for statisticalcomputations on histograms.
+ * Need GSL library and header.
+ * Contains the routines:
+ * gsl_histogram_mean compute histogram mean
+ * gsl_histogram_sigma compute histogram sigma
+ *
+ * Author: S. Piccardi
+ * Jan. 2000
+ *
+ ***************************************************************/
+#include <config.h>
+#include <stdlib.h>
+#include <math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_histogram.h>
+
+/* FIXME: We skip negative values in the histogram h->bin[i] < 0,
+ since those correspond to negative weights (BJG) */
+
+double
+gsl_histogram_mean (const gsl_histogram * h)
+{
+ const size_t n = h->n;
+ size_t i;
+
+ /* Compute the bin-weighted arithmetic mean M of a histogram using the
+ recurrence relation
+
+ M(n) = M(n-1) + (x[n] - M(n-1)) (w(n)/(W(n-1) + w(n)))
+ W(n) = W(n-1) + w(n)
+
+ */
+
+ long double wmean = 0;
+ long double W = 0;
+
+ for (i = 0; i < n; i++)
+ {
+ double xi = (h->range[i + 1] + h->range[i]) / 2;
+ double wi = h->bin[i];
+
+ if (wi > 0)
+ {
+ W += wi;
+ wmean += (xi - wmean) * (wi / W);
+ }
+ }
+
+ return wmean;
+}
+
+double
+gsl_histogram_sigma (const gsl_histogram * h)
+{
+ const size_t n = h->n;
+ size_t i;
+
+ long double wvariance = 0 ;
+ long double wmean = 0;
+ long double W = 0;
+
+ /* FIXME: should use a single pass formula here, as given in
+ N.J.Higham 'Accuracy and Stability of Numerical Methods', p.12 */
+
+ /* Compute the mean */
+
+ for (i = 0; i < n; i++)
+ {
+ double xi = (h->range[i + 1] + h->range[i]) / 2;
+ double wi = h->bin[i];
+
+ if (wi > 0)
+ {
+ W += wi;
+ wmean += (xi - wmean) * (wi / W);
+ }
+ }
+
+ /* Compute the variance */
+
+ W = 0.0;
+
+ for (i = 0; i < n; i++)
+ {
+ double xi = ((h->range[i + 1]) + (h->range[i])) / 2;
+ double wi = h->bin[i];
+
+ if (wi > 0) {
+ const long double delta = (xi - wmean);
+ W += wi ;
+ wvariance += (delta * delta - wvariance) * (wi / W);
+ }
+ }
+
+ {
+ double sigma = sqrt (wvariance) ;
+ return sigma;
+ }
+}
+
+
+/*
+ sum up all bins of histogram
+ */
+
+double
+gsl_histogram_sum(const gsl_histogram * h)
+{
+ double sum=0;
+ size_t i=0;
+ size_t n;
+ n=h->n;
+
+ while(i < n)
+ sum += h->bin[i++];
+
+ return sum;
+}
+
diff --git a/gsl-1.9/histogram/stat2d.c b/gsl-1.9/histogram/stat2d.c
new file mode 100644
index 0000000..5ad7adf
--- /dev/null
+++ b/gsl-1.9/histogram/stat2d.c
@@ -0,0 +1,266 @@
+/* histogram/stat2d.c
+ * Copyright (C) 2002 Achim Gaedke
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/***************************************************************
+ *
+ * File histogram/stat2d.c:
+ * Routine to return statistical values of the content of a 2D hisogram.
+ *
+ * Contains the routines:
+ * gsl_histogram2d_sum sum up all bin values
+ * gsl_histogram2d_xmean determine mean of x values
+ * gsl_histogram2d_ymean determine mean of y values
+ *
+ * Author: Achim Gaedke Achim.Gaedke@zpr.uni-koeln.de
+ * Jan. 2002
+ *
+ ***************************************************************/
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_histogram2d.h>
+
+/*
+ sum up all bins of histogram2d
+ */
+
+double
+gsl_histogram2d_sum (const gsl_histogram2d * h)
+{
+ const size_t n = h->nx * h->ny;
+ double sum = 0;
+ size_t i = 0;
+
+ while (i < n)
+ sum += h->bin[i++];
+
+ return sum;
+}
+
+double
+gsl_histogram2d_xmean (const gsl_histogram2d * h)
+{
+ const size_t nx = h->nx;
+ const size_t ny = h->ny;
+ size_t i;
+ size_t j;
+
+ /* Compute the bin-weighted arithmetic mean M of a histogram using the
+ recurrence relation
+
+ M(n) = M(n-1) + (x[n] - M(n-1)) (w(n)/(W(n-1) + w(n)))
+ W(n) = W(n-1) + w(n)
+
+ */
+
+ long double wmean = 0;
+ long double W = 0;
+
+ for (i = 0; i < nx; i++)
+ {
+ double xi = (h->xrange[i + 1] + h->xrange[i]) / 2.0;
+ double wi = 0;
+
+ for (j = 0; j < ny; j++)
+ {
+ double wij = h->bin[i * ny + j];
+ if (wij > 0)
+ wi += wij;
+ }
+ if (wi > 0)
+ {
+ W += wi;
+ wmean += (xi - wmean) * (wi / W);
+ }
+ }
+
+ return wmean;
+}
+
+double
+gsl_histogram2d_ymean (const gsl_histogram2d * h)
+{
+ const size_t nx = h->nx;
+ const size_t ny = h->ny;
+ size_t i;
+ size_t j;
+
+ /* Compute the bin-weighted arithmetic mean M of a histogram using the
+ recurrence relation
+
+ M(n) = M(n-1) + (x[n] - M(n-1)) (w(n)/(W(n-1) + w(n)))
+ W(n) = W(n-1) + w(n)
+
+ */
+
+ long double wmean = 0;
+ long double W = 0;
+
+ for (j = 0; j < ny; j++)
+ {
+ double yj = (h->yrange[j + 1] + h->yrange[j]) / 2.0;
+ double wj = 0;
+
+ for (i = 0; i < nx; i++)
+ {
+ double wij = h->bin[i * ny + j];
+ if (wij > 0)
+ wj += wij;
+ }
+
+ if (wj > 0)
+ {
+ W += wj;
+ wmean += (yj - wmean) * (wj / W);
+ }
+ }
+
+ return wmean;
+}
+
+double
+gsl_histogram2d_xsigma (const gsl_histogram2d * h)
+{
+ const double xmean = gsl_histogram2d_xmean (h);
+ const size_t nx = h->nx;
+ const size_t ny = h->ny;
+ size_t i;
+ size_t j;
+
+ /* Compute the bin-weighted arithmetic mean M of a histogram using the
+ recurrence relation
+
+ M(n) = M(n-1) + (x[n] - M(n-1)) (w(n)/(W(n-1) + w(n)))
+ W(n) = W(n-1) + w(n)
+
+ */
+
+ long double wvariance = 0;
+ long double W = 0;
+
+ for (i = 0; i < nx; i++)
+ {
+ double xi = (h->xrange[i + 1] + h->xrange[i]) / 2 - xmean;
+ double wi = 0;
+
+ for (j = 0; j < ny; j++)
+ {
+ double wij = h->bin[i * ny + j];
+ if (wij > 0)
+ wi += wij;
+ }
+
+ if (wi > 0)
+ {
+ W += wi;
+ wvariance += ((xi * xi) - wvariance) * (wi / W);
+ }
+ }
+
+ {
+ double xsigma = sqrt (wvariance);
+ return xsigma;
+ }
+}
+
+double
+gsl_histogram2d_ysigma (const gsl_histogram2d * h)
+{
+ const double ymean = gsl_histogram2d_ymean (h);
+ const size_t nx = h->nx;
+ const size_t ny = h->ny;
+ size_t i;
+ size_t j;
+
+ /* Compute the bin-weighted arithmetic mean M of a histogram using the
+ recurrence relation
+
+ M(n) = M(n-1) + (x[n] - M(n-1)) (w(n)/(W(n-1) + w(n)))
+ W(n) = W(n-1) + w(n)
+
+ */
+
+ long double wvariance = 0;
+ long double W = 0;
+
+ for (j = 0; j < ny; j++)
+ {
+ double yj = (h->yrange[j + 1] + h->yrange[j]) / 2.0 - ymean;
+ double wj = 0;
+
+ for (i = 0; i < nx; i++)
+ {
+ double wij = h->bin[i * ny + j];
+ if (wij > 0)
+ wj += wij;
+ }
+ if (wj > 0)
+ {
+ W += wj;
+ wvariance += ((yj * yj) - wvariance) * (wj / W);
+ }
+ }
+
+ {
+ double ysigma = sqrt (wvariance);
+ return ysigma;
+ }
+}
+
+double
+gsl_histogram2d_cov (const gsl_histogram2d * h)
+{
+ const double xmean = gsl_histogram2d_xmean (h);
+ const double ymean = gsl_histogram2d_ymean (h);
+ const size_t nx = h->nx;
+ const size_t ny = h->ny;
+ size_t i;
+ size_t j;
+
+ /* Compute the bin-weighted arithmetic mean M of a histogram using the
+ recurrence relation
+
+ M(n) = M(n-1) + (x[n] - M(n-1)) (w(n)/(W(n-1) + w(n)))
+ W(n) = W(n-1) + w(n)
+
+ */
+
+ long double wcovariance = 0;
+ long double W = 0;
+
+ for (j = 0; j < ny; j++)
+ {
+ for (i = 0; i < nx; i++)
+ {
+ double xi = (h->xrange[i + 1] + h->xrange[i]) / 2.0 - xmean;
+ double yj = (h->yrange[j + 1] + h->yrange[j]) / 2.0 - ymean;
+ double wij = h->bin[i * ny + j];
+
+ if (wij > 0)
+ {
+ W += wij;
+ wcovariance += ((xi * yj) - wcovariance) * (wij / W);
+ }
+ }
+ }
+
+ return wcovariance;
+
+}
diff --git a/gsl-1.9/histogram/test.c b/gsl-1.9/histogram/test.c
new file mode 100644
index 0000000..c170de8
--- /dev/null
+++ b/gsl-1.9/histogram/test.c
@@ -0,0 +1,45 @@
+/* histogram/test.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <gsl/gsl_histogram.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+
+void test1d (void);
+void test2d (void);
+void test1d_resample (void);
+void test2d_resample (void);
+void test1d_trap (void);
+void test2d_trap (void);
+
+int
+main (void)
+{
+ test1d();
+ test2d();
+ test1d_resample();
+ test2d_resample();
+ test1d_trap();
+ test2d_trap();
+
+ exit (gsl_test_summary ());
+}
diff --git a/gsl-1.9/histogram/test1d.c b/gsl-1.9/histogram/test1d.c
new file mode 100644
index 0000000..ff2d89a
--- /dev/null
+++ b/gsl-1.9/histogram/test1d.c
@@ -0,0 +1,483 @@
+/* histogram/test.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <gsl/gsl_histogram.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+
+#define N 397
+#define NR 10
+
+void
+test1d (void)
+{
+ double xr[NR + 1] =
+ {0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0};
+
+ gsl_histogram *h, *h1, *hr, *g;
+ size_t i, j;
+
+ gsl_ieee_env_setup ();
+
+ h = gsl_histogram_calloc (N);
+ h1 = gsl_histogram_calloc (N);
+ g = gsl_histogram_calloc (N);
+
+ gsl_test (h->range == 0, "gsl_histogram_alloc returns valid range pointer");
+ gsl_test (h->bin == 0, "gsl_histogram_alloc returns valid bin pointer");
+ gsl_test (h->n != N, "gsl_histogram_alloc returns valid size");
+
+
+ hr = gsl_histogram_calloc_range (NR, xr);
+
+ gsl_test (hr->range == 0, "gsl_histogram_calloc_range returns valid range pointer");
+ gsl_test (hr->bin == 0, "gsl_histogram_calloc_range returns valid bin pointer");
+ gsl_test (hr->n != NR, "gsl_histogram_calloc_range returns valid size");
+
+ {
+ int status = 0;
+ for (i = 0; i <= NR; i++)
+ {
+ if (hr->range[i] != xr[i])
+ {
+ status = 1;
+ }
+ };
+
+ gsl_test (status, "gsl_histogram_calloc_range creates range");
+ }
+
+ for (i = 0; i <= NR; i++)
+ {
+ hr->range[i] = 0.0;
+ }
+
+ {
+ int status = gsl_histogram_set_ranges (hr, xr, NR+1);
+
+ for (i = 0; i <= NR; i++)
+ {
+ if (hr->range[i] != xr[i])
+ {
+ status = 1;
+ }
+ };
+
+ gsl_test (status, "gsl_histogram_set_range sets range");
+ }
+
+
+ for (i = 0; i < N; i++)
+ {
+ gsl_histogram_accumulate (h, (double) i, (double) i);
+ };
+
+ {
+ int status = 0;
+
+ for (i = 0; i < N; i++)
+ {
+ if (h->bin[i] != (double) i)
+ {
+ status = 1;
+ }
+ };
+
+ gsl_test (status, "gsl_histogram_accumulate writes into array");
+ }
+
+
+ {
+ int status = 0;
+
+ for (i = 0; i < N; i++)
+ {
+ if (gsl_histogram_get (h, i) != i)
+ status = 1;
+ };
+ gsl_test (status, "gsl_histogram_get reads from array");
+ }
+
+ for (i = 0; i <= N; i++)
+ {
+ h1->range[i] = 100.0 + i;
+ }
+
+ gsl_histogram_memcpy (h1, h);
+
+ {
+ int status = 0;
+ for (i = 0; i <= N; i++)
+ {
+ if (h1->range[i] != h->range[i])
+ status = 1;
+ };
+ gsl_test (status, "gsl_histogram_memcpy copies bin ranges");
+ }
+
+ {
+ int status = 0;
+ for (i = 0; i < N; i++)
+ {
+ if (gsl_histogram_get (h1, i) != gsl_histogram_get (h, i))
+ status = 1;
+ };
+ gsl_test (status, "gsl_histogram_memcpy copies bin values");
+ }
+
+ gsl_histogram_free (h1);
+
+ h1 = gsl_histogram_clone (h);
+
+ {
+ int status = 0;
+ for (i = 0; i <= N; i++)
+ {
+ if (h1->range[i] != h->range[i])
+ status = 1;
+ };
+ gsl_test (status, "gsl_histogram_clone copies bin ranges");
+ }
+
+ {
+ int status = 0;
+ for (i = 0; i < N; i++)
+ {
+ if (gsl_histogram_get (h1, i) != gsl_histogram_get (h, i))
+ status = 1;
+ };
+ gsl_test (status, "gsl_histogram_clone copies bin values");
+ }
+
+ gsl_histogram_reset (h);
+
+ {
+ int status = 0;
+
+ for (i = 0; i < N; i++)
+ {
+ if (h->bin[i] != 0)
+ status = 1;
+ }
+ gsl_test (status, "gsl_histogram_reset zeros array");
+ }
+
+
+ {
+ int status = 0;
+
+ for (i = 0; i < N; i++)
+ {
+ gsl_histogram_increment (h, (double) i);
+
+ for (j = 0; j <= i; j++)
+ {
+ if (h->bin[j] != 1)
+ {
+ status = 1;
+ }
+ }
+
+ for (j = i + 1; j < N; j++)
+ {
+ if (h->bin[j] != 0)
+ {
+ status = 1;
+ }
+ }
+ }
+
+ gsl_test (status, "gsl_histogram_increment increases bin value");
+ }
+
+ {
+ int status = 0;
+ for (i = 0; i < N; i++)
+ {
+ double x0 = 0, x1 = 0;
+
+ gsl_histogram_get_range (h, i, &x0, &x1);
+
+ if (x0 != i || x1 != i + 1)
+ {
+ status = 1;
+ }
+ }
+ gsl_test (status, "gsl_histogram_getbinrange returns bin range");
+ }
+
+ {
+ int status = 0;
+ if (gsl_histogram_max (h) != N)
+ status = 1;
+ gsl_test (status, "gsl_histogram_max returns maximum");
+ }
+
+ {
+ int status = 0;
+ if (gsl_histogram_min (h) != 0)
+ status = 1;
+ gsl_test (status, "gsl_histogram_min returns minimum");
+ }
+
+ {
+ int status = 0;
+ if (gsl_histogram_bins (h) != N)
+ status = 1;
+ gsl_test (status, "gsl_histogram_bins returns number of bins");
+ }
+
+ h->bin[2] = 123456.0;
+ h->bin[4] = -654321;
+
+ {
+ double max = gsl_histogram_max_val (h);
+ gsl_test (max != 123456.0, "gsl_histogram_max_val finds maximum value");
+ }
+
+ {
+ double min = gsl_histogram_min_val (h);
+ gsl_test (min != -654321.0, "gsl_histogram_min_val finds minimum value");
+ }
+
+ {
+ size_t imax = gsl_histogram_max_bin (h);
+ gsl_test (imax != 2, "gsl_histogram_max_bin finds maximum value bin");
+ }
+
+ {
+ size_t imin = gsl_histogram_min_bin (h);
+ gsl_test (imin != 4, "gsl_histogram_min_bin find minimum value bin");
+ }
+
+ for (i = 0; i < N; i++)
+ {
+ h->bin[i] = i + 27;
+ g->bin[i] = (i + 27) * (i + 1);
+ }
+
+ {
+ double sum=gsl_histogram_sum (h);
+ gsl_test(sum != N*27+((N-1)*N)/2, "gsl_histogram_sum sums all bin values");
+ }
+
+ gsl_histogram_memcpy (h1, g);
+ gsl_histogram_add (h1, h);
+
+ {
+ int status = 0;
+ for (i = 0; i < N; i++)
+ {
+ if (h1->bin[i] != g->bin[i] + h->bin[i])
+ status = 1;
+ }
+ gsl_test (status, "gsl_histogram_add histogram addition");
+ }
+
+ gsl_histogram_memcpy (h1, g);
+ gsl_histogram_sub (h1, h);
+
+ {
+ int status = 0;
+ for (i = 0; i < N; i++)
+ {
+ if (h1->bin[i] != g->bin[i] - h->bin[i])
+ status = 1;
+ }
+ gsl_test (status, "gsl_histogram_sub histogram subtraction");
+ }
+
+
+ gsl_histogram_memcpy (h1, g);
+ gsl_histogram_mul (h1, h);
+
+ {
+ int status = 0;
+ for (i = 0; i < N; i++)
+ {
+ if (h1->bin[i] != g->bin[i] * h->bin[i])
+ status = 1;
+ }
+ gsl_test (status, "gsl_histogram_mul histogram multiplication");
+ }
+
+
+ gsl_histogram_memcpy (h1, g);
+ gsl_histogram_div (h1, h);
+
+ {
+ int status = 0;
+ for (i = 0; i < N; i++)
+ {
+ if (h1->bin[i] != g->bin[i] / h->bin[i])
+ status = 1;
+ }
+ gsl_test (status, "gsl_histogram_div histogram division");
+ }
+
+ gsl_histogram_memcpy (h1, g);
+ gsl_histogram_scale (h1, 0.5);
+
+ {
+ int status = 0;
+ for (i = 0; i < N; i++)
+ {
+ if (h1->bin[i] != 0.5 * g->bin[i])
+ status = 1;
+ }
+ gsl_test (status, "gsl_histogram_scale histogram scaling");
+ }
+
+ gsl_histogram_memcpy (h1, g);
+ gsl_histogram_shift (h1, 0.25);
+
+ {
+ int status = 0;
+ for (i = 0; i < N; i++)
+ {
+ if (h1->bin[i] != 0.25 + g->bin[i])
+ status = 1;
+ }
+ gsl_test (status, "gsl_histogram_shift histogram shift");
+ }
+
+
+ gsl_histogram_free (h); /* free whatever is in h */
+
+ h = gsl_histogram_calloc_uniform (N, 0.0, 1.0);
+
+ gsl_test (h->range == 0,
+ "gsl_histogram_calloc_uniform returns valid range pointer");
+ gsl_test (h->bin == 0,
+ "gsl_histogram_calloc_uniform returns valid bin pointer");
+ gsl_test (h->n != N,
+ "gsl_histogram_calloc_uniform returns valid size");
+
+ gsl_histogram_accumulate (h, 0.0, 1.0);
+ gsl_histogram_accumulate (h, 0.1, 2.0);
+ gsl_histogram_accumulate (h, 0.2, 3.0);
+ gsl_histogram_accumulate (h, 0.3, 4.0);
+
+ {
+ size_t i1, i2, i3, i4;
+ double expected;
+ int status = gsl_histogram_find (h, 0.0, &i1);
+ status = gsl_histogram_find (h, 0.1, &i2);
+ status = gsl_histogram_find (h, 0.2, &i3);
+ status = gsl_histogram_find (h, 0.3, &i4);
+
+ for (i = 0; i < N; i++)
+ {
+ if (i == i1)
+ {
+ expected = 1.0;
+ }
+ else if (i == i2)
+ {
+ expected = 2.0;
+ }
+ else if (i == i3)
+ {
+ expected = 3.0;
+ }
+ else if (i == i4)
+ {
+ expected = 4.0;
+ }
+ else
+ {
+ expected = 0.0;
+ }
+
+ if (h->bin[i] != expected)
+ {
+ status = 1;
+ }
+
+ }
+ gsl_test (status, "gsl_histogram_find returns index");
+ }
+
+
+ {
+ FILE *f = fopen ("test.txt", "w");
+ gsl_histogram_fprintf (f, h, "%.19e", "%.19e");
+ fclose (f);
+ }
+
+ {
+ FILE *f = fopen ("test.txt", "r");
+ gsl_histogram *hh = gsl_histogram_calloc (N);
+ int status = 0;
+
+ gsl_histogram_fscanf (f, hh);
+
+ for (i = 0; i < N; i++)
+ {
+ if (h->range[i] != hh->range[i])
+ status = 1;
+ if (h->bin[i] != hh->bin[i])
+ status = 1;
+ }
+ if (h->range[N] != hh->range[N])
+ status = 1;
+
+ gsl_test (status, "gsl_histogram_fprintf and fscanf");
+
+ gsl_histogram_free (hh);
+ fclose (f);
+ }
+
+ {
+ FILE *f = fopen ("test.dat", "wb");
+ gsl_histogram_fwrite (f, h);
+ fclose (f);
+ }
+
+ {
+ FILE *f = fopen ("test.dat", "rb");
+ gsl_histogram *hh = gsl_histogram_calloc (N);
+ int status = 0;
+
+ gsl_histogram_fread (f, hh);
+
+ for (i = 0; i < N; i++)
+ {
+ if (h->range[i] != hh->range[i])
+ status = 1;
+ if (h->bin[i] != hh->bin[i])
+ status = 1;
+ }
+ if (h->range[N] != hh->range[N])
+ status = 1;
+
+ gsl_test (status, "gsl_histogram_fwrite and fread");
+
+ gsl_histogram_free (hh);
+ fclose (f);
+ }
+
+ gsl_histogram_free (h);
+ gsl_histogram_free (g);
+ gsl_histogram_free (h1);
+ gsl_histogram_free (hr);
+}
diff --git a/gsl-1.9/histogram/test1d_resample.c b/gsl-1.9/histogram/test1d_resample.c
new file mode 100644
index 0000000..525c126
--- /dev/null
+++ b/gsl-1.9/histogram/test1d_resample.c
@@ -0,0 +1,99 @@
+/* histogram/test1d_resample.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <math.h>
+#include <gsl/gsl_histogram.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+
+#include "urand.c"
+
+void
+test1d_resample (void)
+{
+ size_t i;
+ int status = 0;
+
+ gsl_histogram *h;
+
+ gsl_ieee_env_setup ();
+
+ h = gsl_histogram_calloc_uniform (10, 0.0, 1.0);
+
+ gsl_histogram_increment (h, 0.1);
+ gsl_histogram_increment (h, 0.2);
+ gsl_histogram_increment (h, 0.2);
+ gsl_histogram_increment (h, 0.3);
+
+ {
+ gsl_histogram_pdf *p = gsl_histogram_pdf_alloc (10);
+
+ gsl_histogram *hh = gsl_histogram_calloc_uniform (100, 0.0, 1.0);
+
+ gsl_histogram_pdf_init (p, h);
+
+ for (i = 0; i < 100000; i++)
+ {
+ double u = urand();
+ double x = gsl_histogram_pdf_sample (p, u);
+ gsl_histogram_increment (hh, x);
+ }
+
+ for (i = 0; i < 100; i++)
+ {
+ double y = gsl_histogram_get (hh, i) / 2500;
+ double x, xmax;
+ size_t k;
+ double ya;
+
+ gsl_histogram_get_range (hh, i, &x, &xmax);
+
+ gsl_histogram_find (h, x, &k);
+ ya = gsl_histogram_get (h, k);
+
+ if (ya == 0)
+ {
+ if (y != 0)
+ {
+ printf ("%d: %g vs %g\n", (int) i, y, ya);
+ status = 1;
+ }
+ }
+ else
+ {
+ double err = 1 / sqrt (gsl_histogram_get (hh, i));
+ double sigma = fabs ((y - ya) / (ya * err));
+ if (sigma > 3)
+ {
+ status = 1;
+ printf ("%g vs %g err=%g sigma=%g\n", y, ya, err, sigma);
+ }
+ }
+ }
+
+ gsl_histogram_pdf_free (p) ;
+ gsl_histogram_free (hh);
+
+ gsl_test (status, "gsl_histogram_pdf_sample within statistical errors");
+ }
+
+ gsl_histogram_free (h);
+}
diff --git a/gsl-1.9/histogram/test1d_trap.c b/gsl-1.9/histogram/test1d_trap.c
new file mode 100644
index 0000000..511cb1f
--- /dev/null
+++ b/gsl-1.9/histogram/test1d_trap.c
@@ -0,0 +1,130 @@
+/* histogram/test_trap.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <gsl/gsl_histogram.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_ieee_utils.h>
+
+#define N 397
+
+static void my_error_handler (const char *reason, const char *file,
+ int line, int err);
+static int status = 0;
+
+void
+test1d_trap (void)
+{
+ gsl_histogram *h;
+ double result, lower, upper;
+ size_t i;
+
+ gsl_set_error_handler (&my_error_handler);
+
+ gsl_ieee_env_setup ();
+
+ status = 0;
+ h = gsl_histogram_calloc (0);
+ gsl_test (!status, "gsl_histogram_calloc traps zero-length histogram");
+ gsl_test (h != 0,
+ "gsl_histogram_calloc returns NULL for zero-length histogram");
+
+ status = 0;
+ h = gsl_histogram_calloc_uniform (0, 0.0, 1.0);
+ gsl_test (!status,
+ "gsl_histogram_calloc_uniform traps zero-length histogram");
+ gsl_test (h != 0,
+ "gsl_histogram_calloc_uniform returns NULL for zero-length histogram");
+
+ status = 0;
+ h = gsl_histogram_calloc_uniform (10, 1.0, 1.0);
+ gsl_test (!status,
+ "gsl_histogram_calloc_uniform traps equal endpoints");
+ gsl_test (h != 0,
+ "gsl_histogram_calloc_uniform returns NULL for equal endpoints");
+
+ status = 0;
+ h = gsl_histogram_calloc_uniform (10, 2.0, 1.0);
+ gsl_test (!status,
+ "gsl_histogram_calloc_uniform traps invalid range");
+ gsl_test (h != 0,
+ "gsl_histogram_calloc_uniform returns NULL for invalid range");
+
+ h = gsl_histogram_calloc_uniform (N, 0.0, 1.0);
+
+ status = gsl_histogram_accumulate (h, 1.0, 10.0);
+ gsl_test (status != GSL_EDOM, "gsl_histogram_accumulate traps x at xmax");
+
+ status = gsl_histogram_accumulate (h, 2.0, 100.0);
+ gsl_test (status != GSL_EDOM, "gsl_histogram_accumulate traps x above xmax");
+
+ status = gsl_histogram_accumulate (h, -1.0, 1000.0);
+ gsl_test (status != GSL_EDOM, "gsl_histogram_accumulate traps x below xmin");
+
+ status = gsl_histogram_increment (h, 1.0);
+ gsl_test (status != GSL_EDOM, "gsl_histogram_increment traps x at xmax");
+
+ status = gsl_histogram_increment (h, 2.0);
+ gsl_test (status != GSL_EDOM, "gsl_histogram_increment traps x above xmax");
+
+ status = gsl_histogram_increment (h, -1.0);
+ gsl_test (status != GSL_EDOM, "gsl_histogram_increment traps x below xmin");
+
+
+ result = gsl_histogram_get (h, N);
+ gsl_test (result != 0, "gsl_histogram_get traps index at n");
+
+ result = gsl_histogram_get (h, N + 1);
+ gsl_test (result != 0, "gsl_histogram_get traps index above n");
+
+ status = gsl_histogram_get_range (h, N, &lower, &upper);
+ gsl_test (status != GSL_EDOM,
+ "gsl_histogram_get_range traps index at n");
+
+ status = gsl_histogram_get_range (h, N + 1, &lower, &upper);
+ gsl_test (status != GSL_EDOM,
+ "gsl_histogram_get_range traps index above n");
+
+
+ status = 0;
+ gsl_histogram_find (h, -0.01, &i);
+ gsl_test (status != GSL_EDOM, "gsl_histogram_find traps x below xmin");
+
+ status = 0;
+ gsl_histogram_find (h, 1.0, &i);
+ gsl_test (status != GSL_EDOM, "gsl_histogram_find traps x at xmax");
+
+ status = 0;
+ gsl_histogram_find (h, 1.1, &i);
+ gsl_test (status != GSL_EDOM, "gsl_histogram_find traps x above xmax");
+
+ gsl_histogram_free (h);
+}
+
+
+static void
+my_error_handler (const char *reason, const char *file, int line, int err)
+{
+ if (0)
+ printf ("(caught [%s:%d: %s (%d)])\n", file, line, reason, err);
+ status = 1;
+}
diff --git a/gsl-1.9/histogram/test2d.c b/gsl-1.9/histogram/test2d.c
new file mode 100644
index 0000000..df09155
--- /dev/null
+++ b/gsl-1.9/histogram/test2d.c
@@ -0,0 +1,753 @@
+/* histogram/test2d.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_machine.h>
+#include <gsl/gsl_histogram2d.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+
+#define M 107
+#define N 239
+#define M1 17
+#define N1 23
+#define MR 10
+#define NR 5
+
+void
+test2d (void)
+{
+ double xr[MR + 1] =
+ { 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0 };
+
+ double yr[NR + 1] = { 90.0, 91.0, 92.0, 93.0, 94.0, 95.0 };
+
+ gsl_histogram2d *h, *h1, *g, *hr;
+ size_t i, j, k;
+
+ gsl_ieee_env_setup ();
+
+ h = gsl_histogram2d_calloc (M, N);
+ h1 = gsl_histogram2d_calloc (M, N);
+ g = gsl_histogram2d_calloc (M, N);
+
+ gsl_test (h->xrange == 0,
+ "gsl_histogram2d_calloc returns valid xrange pointer");
+ gsl_test (h->yrange == 0,
+ "gsl_histogram2d_calloc returns valid yrange pointer");
+ gsl_test (h->bin == 0, "gsl_histogram2d_calloc returns valid bin pointer");
+
+ gsl_test (h->nx != M, "gsl_histogram2d_calloc returns valid nx");
+ gsl_test (h->ny != N, "gsl_histogram2d_calloc returns valid ny");
+
+ hr = gsl_histogram2d_calloc_range (MR, NR, xr, yr);
+
+ gsl_test (hr->xrange == 0,
+ "gsl_histogram2d_calloc_range returns valid xrange pointer");
+ gsl_test (hr->yrange == 0,
+ "gsl_histogram2d_calloc_range returns valid yrange pointer");
+ gsl_test (hr->bin == 0,
+ "gsl_histogram2d_calloc_range returns valid bin pointer");
+
+ gsl_test (hr->nx != MR, "gsl_histogram2d_calloc_range returns valid nx");
+ gsl_test (hr->ny != NR, "gsl_histogram2d_calloc_range returns valid ny");
+
+ {
+ int status = 0;
+ for (i = 0; i <= MR; i++)
+ {
+ if (hr->xrange[i] != xr[i])
+ {
+ status = 1;
+ }
+ };
+
+ gsl_test (status,
+ "gsl_histogram2d_calloc_range creates xrange");
+ }
+
+ {
+ int status = 0;
+ for (i = 0; i <= NR; i++)
+ {
+ if (hr->yrange[i] != yr[i])
+ {
+ status = 1;
+ }
+ };
+
+ gsl_test (status,
+ "gsl_histogram2d_calloc_range creates yrange");
+ }
+
+ for (i = 0; i <= MR; i++)
+ {
+ hr->xrange[i] = 0.0;
+ }
+
+ for (i = 0; i <= NR; i++)
+ {
+ hr->yrange[i] = 0.0;
+ }
+
+ {
+ int status = gsl_histogram2d_set_ranges (hr, xr, MR + 1, yr, NR + 1);
+
+ for (i = 0; i <= MR; i++)
+ {
+ if (hr->xrange[i] != xr[i])
+ {
+ status = 1;
+ }
+ };
+
+ gsl_test (status, "gsl_histogram2d_set_ranges sets xrange");
+ }
+
+ {
+ int status = 0;
+ for (i = 0; i <= NR; i++)
+ {
+ if (hr->yrange[i] != yr[i])
+ {
+ status = 1;
+ }
+ };
+
+ gsl_test (status, "gsl_histogram2d_set_ranges sets yrange");
+ }
+
+
+ k = 0;
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ k++;
+ gsl_histogram2d_accumulate (h, (double) i, (double) j, (double) k);
+ };
+ }
+
+ {
+ int status = 0;
+ k = 0;
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ k++;
+ if (h->bin[i * N + j] != (double) k)
+ {
+ status = 1;
+ }
+ }
+ }
+ gsl_test (status,
+ "gsl_histogram2d_accumulate writes into array");
+ }
+
+ {
+ int status = 0;
+ k = 0;
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ k++;
+ if (gsl_histogram2d_get (h, i, j) != (double) k)
+ status = 1;
+ };
+ }
+ gsl_test (status, "gsl_histogram2d_get reads from array");
+ }
+
+ for (i = 0; i <= M; i++)
+ {
+ h1->xrange[i] = 100.0 + i;
+ }
+
+ for (i = 0; i <= N; i++)
+ {
+ h1->yrange[i] = 900.0 + i * i;
+ }
+
+ gsl_histogram2d_memcpy (h1, h);
+
+ {
+ int status = 0;
+ for (i = 0; i <= M; i++)
+ {
+ if (h1->xrange[i] != h->xrange[i])
+ status = 1;
+ };
+ gsl_test (status, "gsl_histogram2d_memcpy copies bin xranges");
+ }
+
+ {
+ int status = 0;
+ for (i = 0; i <= N; i++)
+ {
+ if (h1->yrange[i] != h->yrange[i])
+ status = 1;
+ };
+ gsl_test (status, "gsl_histogram2d_memcpy copies bin yranges");
+ }
+
+ {
+ int status = 0;
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ if (gsl_histogram2d_get (h1, i, j) !=
+ gsl_histogram2d_get (h, i, j))
+ status = 1;
+ }
+ }
+ gsl_test (status, "gsl_histogram2d_memcpy copies bin values");
+ }
+
+ gsl_histogram2d_free (h1);
+
+ h1 = gsl_histogram2d_clone (h);
+
+ {
+ int status = 0;
+ for (i = 0; i <= M; i++)
+ {
+ if (h1->xrange[i] != h->xrange[i])
+ status = 1;
+ };
+ gsl_test (status, "gsl_histogram2d_clone copies bin xranges");
+ }
+
+ {
+ int status = 0;
+ for (i = 0; i <= N; i++)
+ {
+ if (h1->yrange[i] != h->yrange[i])
+ status = 1;
+ };
+ gsl_test (status, "gsl_histogram2d_clone copies bin yranges");
+ }
+
+ {
+ int status = 0;
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ if (gsl_histogram2d_get (h1, i, j) !=
+ gsl_histogram2d_get (h, i, j))
+ status = 1;
+ }
+ }
+ gsl_test (status, "gsl_histogram2d_clone copies bin values");
+ }
+
+
+ gsl_histogram2d_reset (h);
+
+ {
+ int status = 0;
+
+ for (i = 0; i < M * N; i++)
+ {
+ if (h->bin[i] != 0)
+ status = 1;
+ }
+ gsl_test (status, "gsl_histogram2d_reset zeros array");
+ }
+
+ gsl_histogram2d_free (h);
+ h = gsl_histogram2d_calloc (M1, N1);
+
+ {
+
+ int status = 0;
+
+ for (i = 0; i < M1; i++)
+ {
+ for (j = 0; j < N1; j++)
+ {
+ gsl_histogram2d_increment (h, (double) i, (double) j);
+
+ for (k = 0; k <= i * N1 + j; k++)
+ {
+ if (h->bin[k] != 1)
+ {
+ status = 1;
+ }
+ }
+
+ for (k = i * N1 + j + 1; k < M1 * N1; k++)
+ {
+ if (h->bin[k] != 0)
+ {
+ status = 1;
+ }
+ }
+ }
+ }
+ gsl_test (status, "gsl_histogram2d_increment increases bin value");
+ }
+
+ gsl_histogram2d_free (h);
+ h = gsl_histogram2d_calloc (M, N);
+
+ {
+ int status = 0;
+ for (i = 0; i < M; i++)
+ {
+ double x0 = 0, x1 = 0;
+ gsl_histogram2d_get_xrange (h, i, &x0, &x1);
+
+ if (x0 != i || x1 != i + 1)
+ {
+ status = 1;
+ }
+ }
+ gsl_test (status,
+ "gsl_histogram2d_get_xlowerlimit and xupperlimit");
+ }
+
+
+ {
+ int status = 0;
+ for (i = 0; i < N; i++)
+ {
+ double y0 = 0, y1 = 0;
+ gsl_histogram2d_get_yrange (h, i, &y0, &y1);
+
+ if (y0 != i || y1 != i + 1)
+ {
+ status = 1;
+ }
+ }
+ gsl_test (status,
+ "gsl_histogram2d_get_ylowerlimit and yupperlimit");
+ }
+
+
+ {
+ int status = 0;
+ if (gsl_histogram2d_xmax (h) != M)
+ status = 1;
+ gsl_test (status, "gsl_histogram2d_xmax");
+ }
+
+ {
+ int status = 0;
+ if (gsl_histogram2d_xmin (h) != 0)
+ status = 1;
+ gsl_test (status, "gsl_histogram2d_xmin");
+ }
+
+ {
+ int status = 0;
+ if (gsl_histogram2d_nx (h) != M)
+ status = 1;
+ gsl_test (status, "gsl_histogram2d_nx");
+ }
+
+ {
+ int status = 0;
+ if (gsl_histogram2d_ymax (h) != N)
+ status = 1;
+ gsl_test (status, "gsl_histogram2d_ymax");
+ }
+
+ {
+ int status = 0;
+ if (gsl_histogram2d_ymin (h) != 0)
+ status = 1;
+ gsl_test (status, "gsl_histogram2d_ymin");
+ }
+
+ {
+ int status = 0;
+ if (gsl_histogram2d_ny (h) != N)
+ status = 1;
+ gsl_test (status, "gsl_histogram2d_ny");
+ }
+
+ h->bin[3 * N + 2] = 123456.0;
+ h->bin[4 * N + 3] = -654321;
+
+ {
+ double max = gsl_histogram2d_max_val (h);
+ gsl_test (max != 123456.0, "gsl_histogram2d_max_val finds maximum value");
+ }
+
+ {
+ double min = gsl_histogram2d_min_val (h);
+ gsl_test (min != -654321.0,
+ "gsl_histogram2d_min_val finds minimum value");
+ }
+
+ {
+ size_t imax, jmax;
+ gsl_histogram2d_max_bin (h, &imax, &jmax);
+ gsl_test (imax != 3
+ || jmax != 2,
+ "gsl_histogram2d_max_bin finds maximum value bin");
+ }
+
+ {
+ size_t imin, jmin;
+ gsl_histogram2d_min_bin (h, &imin, &jmin);
+ gsl_test (imin != 4
+ || jmin != 3, "gsl_histogram2d_min_bin find minimum value bin");
+ }
+
+ for (i = 0; i < M * N; i++)
+ {
+ h->bin[i] = i + 27;
+ g->bin[i] = (i + 27) * (i + 1);
+ }
+
+ {
+ double sum = gsl_histogram2d_sum (h);
+ gsl_test (sum != N * M * 27 + ((N * M - 1) * N * M) / 2,
+ "gsl_histogram2d_sum sums all bin values");
+ }
+
+ {
+ /* first test... */
+ const double xpos = 0.6;
+ const double ypos = 0.85;
+ double xmean;
+ double ymean;
+ size_t xbin;
+ size_t ybin;
+ gsl_histogram2d *h3 = gsl_histogram2d_alloc (M, N);
+ gsl_histogram2d_set_ranges_uniform (h3, 0, 1, 0, 1);
+ gsl_histogram2d_increment (h3, xpos, ypos);
+ gsl_histogram2d_find (h3, xpos, ypos, &xbin, &ybin);
+ xmean = gsl_histogram2d_xmean (h3);
+ ymean = gsl_histogram2d_ymean (h3);
+
+ {
+ double expected_xmean = (h3->xrange[xbin] + h3->xrange[xbin + 1]) / 2.0;
+ double expected_ymean = (h3->yrange[ybin] + h3->yrange[ybin + 1]) / 2.0;
+ gsl_test_abs (xmean, expected_xmean, 100.0 * GSL_DBL_EPSILON,
+ "gsl_histogram2d_xmean");
+ gsl_test_abs (ymean, expected_ymean, 100.0 * GSL_DBL_EPSILON,
+ "gsl_histogram2d_ymean");
+ };
+ gsl_histogram2d_free (h3);
+ }
+
+ {
+ /* test it with bivariate normal distribution */
+ const double xmean = 0.7;
+ const double ymean = 0.7;
+ const double xsigma = 0.1;
+ const double ysigma = 0.1;
+ const double correl = 0.5;
+ const double norm =
+ 10.0 / M_PI / xsigma / ysigma / sqrt (1.0 - correl * correl);
+ size_t xbin;
+ size_t ybin;
+ gsl_histogram2d *h3 = gsl_histogram2d_alloc (M, N);
+ gsl_histogram2d_set_ranges_uniform (h3, 0, 1, 0, 1);
+ /* initialize with 2d gauss pdf in two directions */
+ for (xbin = 0; xbin < M; xbin++)
+ {
+ double xi =
+ ((h3->xrange[xbin] + h3->xrange[xbin + 1]) / 2.0 - xmean) / xsigma;
+ for (ybin = 0; ybin < N; ybin++)
+ {
+ double yi =
+ ((h3->yrange[ybin] + h3->yrange[ybin + 1]) / 2.0 -
+ ymean) / ysigma;
+ double prob =
+ norm * exp (-(xi * xi - 2.0 * correl * xi * yi + yi * yi) /
+ 2.0 / (1 - correl * correl));
+ h3->bin[xbin * N + ybin] = prob;
+ }
+ }
+ {
+ double xs = gsl_histogram2d_xsigma (h3);
+ double ys = gsl_histogram2d_ysigma (h3);
+ /* evaluate results and compare with parameters */
+
+ gsl_test_abs (gsl_histogram2d_xmean (h3), xmean, 2.0/M,
+ "gsl_histogram2d_xmean histogram mean(x)");
+ gsl_test_abs (gsl_histogram2d_ymean (h3), ymean, 2.0/N,
+ "gsl_histogram2d_ymean histogram mean(y)");
+ gsl_test_abs (xs, xsigma, 2.0/M,
+ "gsl_histogram2d_xsigma histogram stdev(x)");
+ gsl_test_abs (ys, ysigma, 2.0/N,
+ "gsl_histogram2d_ysigma histogram stdev(y)");
+ gsl_test_abs (gsl_histogram2d_cov (h3) / xs / ys, correl,
+ 2.0/((M < N) ? M : N),
+ "gsl_histogram2d_cov histogram covariance");
+ }
+ gsl_histogram2d_free (h3);
+ }
+
+ gsl_histogram2d_memcpy (h1, g);
+ gsl_histogram2d_add (h1, h);
+
+ {
+ int status = 0;
+ for (i = 0; i < M * N; i++)
+ {
+ if (h1->bin[i] != g->bin[i] + h->bin[i])
+ status = 1;
+ }
+ gsl_test (status, "gsl_histogram2d_add histogram addition");
+ }
+
+ gsl_histogram2d_memcpy (h1, g);
+ gsl_histogram2d_sub (h1, h);
+
+ {
+ int status = 0;
+ for (i = 0; i < M * N; i++)
+ {
+ if (h1->bin[i] != g->bin[i] - h->bin[i])
+ status = 1;
+ }
+ gsl_test (status, "gsl_histogram2d_sub histogram subtraction");
+ }
+
+
+ gsl_histogram2d_memcpy (h1, g);
+ gsl_histogram2d_mul (h1, h);
+
+ {
+ int status = 0;
+ for (i = 0; i < M * N; i++)
+ {
+ if (h1->bin[i] != g->bin[i] * h->bin[i])
+ status = 1;
+ }
+ gsl_test (status, "gsl_histogram2d_mul histogram multiplication");
+ }
+
+ gsl_histogram2d_memcpy (h1, g);
+ gsl_histogram2d_div (h1, h);
+
+ {
+ int status = 0;
+ for (i = 0; i < M * N; i++)
+ {
+ if (h1->bin[i] != g->bin[i] / h->bin[i])
+ status = 1;
+ }
+ gsl_test (status, "gsl_histogram2d_div histogram division");
+ }
+
+ gsl_histogram2d_memcpy (h1, g);
+ gsl_histogram2d_scale (h1, 0.5);
+
+ {
+ int status = 0;
+ for (i = 0; i < M * N; i++)
+ {
+ if (h1->bin[i] != 0.5 * g->bin[i])
+ status = 1;
+ }
+ gsl_test (status, "gsl_histogram2d_scale histogram scaling");
+ }
+
+ gsl_histogram2d_memcpy (h1, g);
+ gsl_histogram2d_shift (h1, 0.25);
+
+ {
+ int status = 0;
+ for (i = 0; i < M * N; i++)
+ {
+ if (h1->bin[i] != 0.25 + g->bin[i])
+ status = 1;
+ }
+ gsl_test (status, "gsl_histogram2d_shift histogram shift");
+ }
+
+ gsl_histogram2d_free (h); /* free whatever is in h */
+
+ h = gsl_histogram2d_calloc_uniform (M1, N1, 0.0, 5.0, 0.0, 5.0);
+
+ gsl_test (h->xrange == 0,
+ "gsl_histogram2d_calloc_uniform returns valid range pointer");
+ gsl_test (h->yrange == 0,
+ "gsl_histogram2d_calloc_uniform returns valid range pointer");
+ gsl_test (h->bin == 0,
+ "gsl_histogram2d_calloc_uniform returns valid bin pointer");
+ gsl_test (h->nx != M1, "gsl_histogram2d_calloc_uniform returns valid nx");
+ gsl_test (h->ny != N1, "gsl_histogram2d_calloc_uniform returns valid ny");
+
+ gsl_histogram2d_accumulate (h, 0.0, 3.01, 1.0);
+ gsl_histogram2d_accumulate (h, 0.1, 2.01, 2.0);
+ gsl_histogram2d_accumulate (h, 0.2, 1.01, 3.0);
+ gsl_histogram2d_accumulate (h, 0.3, 0.01, 4.0);
+
+ {
+ size_t i1, i2, i3, i4;
+ size_t j1, j2, j3, j4;
+ double expected;
+ int status;
+ status = gsl_histogram2d_find (h, 0.0, 3.01, &i1, &j1);
+ status = gsl_histogram2d_find (h, 0.1, 2.01, &i2, &j2);
+ status = gsl_histogram2d_find (h, 0.2, 1.01, &i3, &j3);
+ status = gsl_histogram2d_find (h, 0.3, 0.01, &i4, &j4);
+
+ for (i = 0; i < M1; i++)
+ {
+ for (j = 0; j < N1; j++)
+ {
+ if (i == i1 && j == j1)
+ {
+ expected = 1.0;
+ }
+ else if (i == i2 && j == j2)
+ {
+ expected = 2.0;
+ }
+ else if (i == i3 && j == j3)
+ {
+ expected = 3.0;
+ }
+ else if (i == i4 && j == j4)
+ {
+ expected = 4.0;
+ }
+ else
+ {
+ expected = 0.0;
+ }
+
+ if (h->bin[i * N1 + j] != expected)
+ {
+ status = 1;
+ }
+ }
+ }
+ gsl_test (status, "gsl_histogram2d_find returns index");
+ }
+
+ {
+ FILE *f = fopen ("test.txt", "w");
+ gsl_histogram2d_fprintf (f, h, "%.19e", "%.19e");
+ fclose (f);
+ }
+
+ {
+ FILE *f = fopen ("test.txt", "r");
+ gsl_histogram2d *hh = gsl_histogram2d_calloc (M1, N1);
+ int status = 0;
+
+ gsl_histogram2d_fscanf (f, hh);
+
+ for (i = 0; i <= M1; i++)
+ {
+ if (h->xrange[i] != hh->xrange[i])
+ {
+ printf ("xrange[%d] : %g orig vs %g\n",
+ (int) i, h->xrange[i], hh->xrange[i]);
+ status = 1;
+ }
+ }
+
+ for (j = 0; j <= N1; j++)
+ {
+ if (h->yrange[j] != hh->yrange[j])
+ {
+ printf ("yrange[%d] : %g orig vs %g\n",
+ (int) j, h->yrange[j], hh->yrange[j]);
+ status = 1;
+ }
+ }
+
+ for (i = 0; i < M1 * N1; i++)
+ {
+ if (h->bin[i] != hh->bin[i])
+ {
+ printf ("bin[%d] : %g orig vs %g\n",
+ (int) i, h->bin[i], hh->bin[i]);
+ status = 1;
+ }
+ }
+
+ gsl_test (status, "gsl_histogram2d_fprintf and fscanf");
+
+ gsl_histogram2d_free (hh);
+ fclose (f);
+ }
+
+ {
+ FILE *f = fopen ("test.dat", "wb");
+ gsl_histogram2d_fwrite (f, h);
+ fclose (f);
+ }
+
+ {
+ FILE *f = fopen ("test.dat", "rb");
+ gsl_histogram2d *hh = gsl_histogram2d_calloc (M1, N1);
+ int status = 0;
+
+ gsl_histogram2d_fread (f, hh);
+
+ for (i = 0; i <= M1; i++)
+ {
+ if (h->xrange[i] != hh->xrange[i])
+ {
+ printf ("xrange[%d] : %g orig vs %g\n",
+ (int) i, h->xrange[i], hh->xrange[i]);
+ status = 1;
+ }
+ }
+
+ for (j = 0; j <= N1; j++)
+ {
+ if (h->yrange[j] != hh->yrange[j])
+ {
+ printf ("yrange[%d] : %g orig vs %g\n",
+ (int) j, h->yrange[j], hh->yrange[j]);
+ status = 1;
+ }
+ }
+
+ for (i = 0; i < M1 * N1; i++)
+ {
+ if (h->bin[i] != hh->bin[i])
+ {
+ printf ("bin[%d] : %g orig vs %g\n",
+ (int) i, h->bin[i], hh->bin[i]);
+ status = 1;
+ }
+ }
+
+ gsl_test (status, "gsl_histogram2d_fwrite and fread");
+
+ gsl_histogram2d_free (hh);
+ fclose (f);
+ }
+
+ gsl_histogram2d_free (h);
+ gsl_histogram2d_free (h1);
+ gsl_histogram2d_free (g);
+ gsl_histogram2d_free (hr);
+}
diff --git a/gsl-1.9/histogram/test2d_resample.c b/gsl-1.9/histogram/test2d_resample.c
new file mode 100644
index 0000000..4df207f
--- /dev/null
+++ b/gsl-1.9/histogram/test2d_resample.c
@@ -0,0 +1,115 @@
+/* histogram/test2d_resample.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <math.h>
+#include <gsl/gsl_histogram2d.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+
+#include "urand.c"
+
+void
+test2d_resample (void)
+{
+ size_t i, j;
+ int status = 0;
+ double total = 0;
+ size_t N = 200000;
+
+ gsl_histogram2d *h;
+
+ gsl_ieee_env_setup ();
+
+ h = gsl_histogram2d_calloc_uniform (10, 10, 0.0, 1.0, 0.0, 1.0);
+
+ for (i = 0; i < 10; i++)
+ {
+ for (j = 0; j < 10; j++)
+ {
+ double w = 10.0 * i + j;
+ total += w;
+ gsl_histogram2d_accumulate (h, 0.1 * i, 0.1 * i, w);
+ }
+ }
+
+ {
+ gsl_histogram2d_pdf *p = gsl_histogram2d_pdf_alloc (10,10);
+
+ gsl_histogram2d *hh = gsl_histogram2d_calloc_uniform (20, 20,
+ 0.0, 1.0,
+ 0.0, 1.0);
+
+ gsl_histogram2d_pdf_init (p, h);
+
+ for (i = 0; i < N; i++)
+ {
+ double u = urand();
+ double v = urand();
+ double x, y;
+ status = gsl_histogram2d_pdf_sample (p, u, v, &x, &y);
+ status = gsl_histogram2d_increment (hh, x, y);
+ }
+
+ status = 0;
+ for (i = 0; i < 20; i++)
+ {
+ for (j = 0; j < 20; j++)
+ {
+ double z = 4 * total * gsl_histogram2d_get (hh, i, j) / (double) N;
+ size_t k1, k2;
+ double ya;
+ double x, xmax, y, ymax;
+
+ gsl_histogram2d_get_xrange (hh, i, &x, &xmax);
+ gsl_histogram2d_get_yrange (hh, j, &y, &ymax);
+
+ gsl_histogram2d_find (h, x, y, &k1, &k2);
+ ya = gsl_histogram2d_get (h, k1, k2);
+
+ if (ya == 0)
+ {
+ if (z != 0)
+ {
+ status = 1;
+ printf ("(%d,%d): %g vs %g\n", (int)i, (int)j, z, ya);
+ }
+ }
+ else
+ {
+ double err = 1 / sqrt (gsl_histogram2d_get (hh, i, j));
+ double sigma = fabs ((z - ya) / (ya * err));
+ if (sigma > 3)
+ {
+ status = 1;
+ printf ("%g vs %g err=%g sigma=%g\n", z, ya, err, sigma);
+ }
+ }
+ }
+ }
+
+ gsl_histogram2d_pdf_free (p) ;
+ gsl_histogram2d_free (hh) ;
+
+ gsl_test (status, "gsl_histogram2d_pdf_sample within statistical errors");
+ }
+
+ gsl_histogram2d_free (h) ;
+}
diff --git a/gsl-1.9/histogram/test2d_trap.c b/gsl-1.9/histogram/test2d_trap.c
new file mode 100644
index 0000000..b597ae5
--- /dev/null
+++ b/gsl-1.9/histogram/test2d_trap.c
@@ -0,0 +1,203 @@
+/* histogram/test2d_trap.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <gsl/gsl_histogram2d.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_ieee_utils.h>
+
+#define N 107
+#define M 239
+
+static void my_error_handler (const char *reason, const char *file,
+ int line, int err);
+static int status = 0;
+
+void
+test2d_trap (void)
+{
+ gsl_histogram2d *h;
+ double result, lower, upper;
+ size_t i, j;
+
+ gsl_set_error_handler (&my_error_handler);
+
+ gsl_ieee_env_setup ();
+
+ status = 0;
+ h = gsl_histogram2d_calloc (0, 10);
+ gsl_test (!status, "gsl_histogram_calloc traps zero-width histogram");
+ gsl_test (h != 0,
+ "gsl_histogram2d_calloc returns NULL for zero-width histogram");
+
+
+ status = 0;
+ h = gsl_histogram2d_calloc (10, 0);
+ gsl_test (!status, "gsl_histogram_calloc traps zero-length histogram");
+ gsl_test (h != 0,
+ "gsl_histogram2d_calloc returns NULL for zero-length histogram");
+
+
+ status = 0;
+ h = gsl_histogram2d_calloc_uniform (0, 10, 0.0, 1.0, 0.0, 1.0);
+ gsl_test (!status,
+ "gsl_histogram2d_calloc_uniform traps zero-width histogram");
+ gsl_test (h != 0,
+ "gsl_histogram2d_calloc_uniform returns NULL for zero-width histogram");
+
+ status = 0;
+ h = gsl_histogram2d_calloc_uniform (10, 0, 0.0, 1.0, 0.0, 1.0);
+ gsl_test (!status,
+ "gsl_histogram2d_calloc_uniform traps zero-length histogram");
+ gsl_test (h != 0,
+ "gsl_histogram2d_calloc_uniform returns NULL for zero-length histogram");
+
+ status = 0;
+ h = gsl_histogram2d_calloc_uniform (10, 10, 0.0, 1.0, 1.0, 1.0);
+ gsl_test (!status,
+ "gsl_histogram2d_calloc_uniform traps equal endpoints");
+ gsl_test (h != 0,
+ "gsl_histogram2d_calloc_uniform returns NULL for equal endpoints");
+
+ status = 0;
+ h = gsl_histogram2d_calloc_uniform (10, 10, 1.0, 1.0, 0.0, 1.0);
+ gsl_test (!status,
+ "gsl_histogram2d_calloc_uniform traps equal endpoints");
+ gsl_test (h != 0,
+ "gsl_histogram2d_calloc_uniform returns NULL for equal endpoints");
+
+ status = 0;
+ h = gsl_histogram2d_calloc_uniform (10, 10, 0.0, 1.0, 2.0, 1.0);
+ gsl_test (!status,
+ "gsl_histogram2d_calloc_uniform traps invalid range");
+ gsl_test (h != 0,
+ "gsl_histogram2d_calloc_uniform returns NULL for invalid range");
+
+ status = 0;
+ h = gsl_histogram2d_calloc_uniform (10, 10, 2.0, 1.0, 0.0, 1.0);
+ gsl_test (!status,
+ "gsl_histogram2d_calloc_uniform traps invalid range");
+ gsl_test (h != 0,
+ "gsl_histogram2d_calloc_uniform returns NULL for invalid range");
+
+ h = gsl_histogram2d_calloc_uniform (N, M, 0.0, 1.0, 0.0, 1.0);
+
+ status = gsl_histogram2d_accumulate (h, 1.0, 0.0, 10.0);
+ gsl_test (status != GSL_EDOM, "gsl_histogram2d_accumulate traps x at xmax");
+
+ status = gsl_histogram2d_accumulate (h, 2.0, 0.0, 100.0);
+ gsl_test (status != GSL_EDOM, "gsl_histogram2d_accumulate traps x above xmax");
+
+ status = gsl_histogram2d_accumulate (h, -1.0, 0.0, 1000.0);
+ gsl_test (status != GSL_EDOM, "gsl_histogram2d_accumulate traps x below xmin");
+
+ status = gsl_histogram2d_accumulate (h, 0.0, 1.0, 10.0);
+ gsl_test (status != GSL_EDOM, "gsl_histogram2d_accumulate traps y at ymax");
+
+ status = gsl_histogram2d_accumulate (h, 0.0, 2.0, 100.0);
+ gsl_test (status != GSL_EDOM, "gsl_histogram2d_accumulate traps y above ymax");
+
+ status = gsl_histogram2d_accumulate (h, 0.0, -1.0, 1000.0);
+ gsl_test (status != GSL_EDOM, "gsl_histogram2d_accumulate traps y below ymin");
+
+
+ status = gsl_histogram2d_increment (h, 1.0, 0.0);
+ gsl_test (status != GSL_EDOM, "gsl_histogram2d_increment traps x at xmax");
+
+ status = gsl_histogram2d_increment (h, 2.0, 0.0);
+ gsl_test (status != GSL_EDOM, "gsl_histogram2d_increment traps x above xmax");
+
+ status = gsl_histogram2d_increment (h, -1.0, 0.0);
+ gsl_test (status != GSL_EDOM, "gsl_histogram2d_increment traps x below xmin");
+
+
+ status = gsl_histogram2d_increment (h, 0.0, 1.0);
+ gsl_test (status != GSL_EDOM, "gsl_histogram2d_increment traps y at ymax");
+
+ status = gsl_histogram2d_increment (h, 0.0, 2.0);
+ gsl_test (status != GSL_EDOM, "gsl_histogram2d_increment traps y above ymax");
+
+ status = gsl_histogram2d_increment (h, 0.0, -1.0);
+ gsl_test (status != GSL_EDOM, "gsl_histogram2d_increment traps y below ymin");
+
+
+ result = gsl_histogram2d_get (h, N, 0);
+ gsl_test (result != 0, "gsl_histogram2d_get traps x index at nx");
+
+ result = gsl_histogram2d_get (h, N + 1, 0);
+ gsl_test (result != 0, "gsl_histogram2d_get traps x index above nx");
+
+ result = gsl_histogram2d_get (h, 0, M);
+ gsl_test (result != 0, "gsl_histogram2d_get traps y index at ny");
+
+ result = gsl_histogram2d_get (h, 0, M + 1);
+ gsl_test (result != 0, "gsl_histogram2d_get traps y index above ny");
+
+
+ status = gsl_histogram2d_get_xrange (h, N, &lower, &upper);
+ gsl_test (status != GSL_EDOM, "gsl_histogram2d_get_xrange traps index at nx");
+
+ status = gsl_histogram2d_get_xrange (h, N + 1, &lower, &upper);
+ gsl_test (status != GSL_EDOM, "gsl_histogram2d_get_xrange traps index above nx");
+
+ status = gsl_histogram2d_get_yrange (h, M, &lower, &upper);
+ gsl_test (status != GSL_EDOM, "gsl_histogram2d_get_yrange traps index at ny");
+
+ status = gsl_histogram2d_get_yrange (h, M + 1, &lower, &upper);
+ gsl_test (status != GSL_EDOM, "gsl_histogram2d_get_yrange traps index above ny");
+
+ status = 0;
+ gsl_histogram2d_find (h, -0.01, 0.0, &i, &j);
+ gsl_test (status != GSL_EDOM, "gsl_histogram2d_find traps x below xmin");
+
+ status = 0;
+ gsl_histogram2d_find (h, 1.0, 0.0, &i, &j);
+ gsl_test (status != GSL_EDOM, "gsl_histogram2d_find traps x at xmax");
+
+ status = 0;
+ gsl_histogram2d_find (h, 1.1, 0.0, &i, &j);
+ gsl_test (status != GSL_EDOM, "gsl_histogram2d_find traps x above xmax");
+
+
+ status = 0;
+ gsl_histogram2d_find (h, 0.0, -0.01, &i, &j);
+ gsl_test (status != GSL_EDOM, "gsl_histogram2d_find traps y below ymin");
+
+ status = 0;
+ gsl_histogram2d_find (h, 0.0, 1.0, &i, &j);
+ gsl_test (status != GSL_EDOM, "gsl_histogram2d_find traps y at ymax");
+
+ status = 0;
+ gsl_histogram2d_find (h, 0.0, 1.1, &i, &j);
+ gsl_test (status != GSL_EDOM, "gsl_histogram2d_find traps y above ymax");
+
+ gsl_histogram2d_free (h);
+}
+
+
+static void
+my_error_handler (const char *reason, const char *file, int line, int err)
+{
+ if (0)
+ printf ("(caught [%s:%d: %s (%d)])\n", file, line, reason, err);
+ status = 1;
+}
diff --git a/gsl-1.9/histogram/urand.c b/gsl-1.9/histogram/urand.c
new file mode 100644
index 0000000..9c6450f
--- /dev/null
+++ b/gsl-1.9/histogram/urand.c
@@ -0,0 +1,26 @@
+/* histogram/urand.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+static double urand (void);
+
+static double urand (void) {
+ static unsigned long int x = 1;
+ x = (1103515245 * x + 12345) & 0x7fffffffUL ;
+ return x / 2147483648.0 ;
+}
diff --git a/gsl-1.9/ieee-utils/ChangeLog b/gsl-1.9/ieee-utils/ChangeLog
new file mode 100644
index 0000000..e417b2d
--- /dev/null
+++ b/gsl-1.9/ieee-utils/ChangeLog
@@ -0,0 +1,212 @@
+2005-02-11 Brian Gough <bjg@network-theory.co.uk>
+
+ * fp-gnuc99.c (gsl_ieee_set_mode): added an #ifdef for the default
+ round to nearest mode
+
+2003-12-20 Brian Gough <bjg@network-theory.co.uk>
+
+ * fp-gnuc99.c (_GNU_SOURCE): define _GNU_SOURCE when including
+ fenv.h
+
+2003-07-21 Brian Gough <bjg@network-theory.co.uk>
+
+ * read.c (gsl_ieee_read_mode_string): added missing
+ mask-division-by-zero to error message
+
+2003-06-14 Brian Gough <bjg@network-theory.co.uk>
+
+ * fp-m68klinux.c fp-ppclinux.c fp-sparclinux.c fp-x86linux.c:
+ renamed to fp-gnum68k.c fp-gnuppc.c fp-gnusparc.c fp-gnux86.c
+ since they are dependent on the GNU C Library interface rather
+ than the kernel interface
+
+ * fp-gnuc99.c: added a fallback to the C99 exception functions for
+ cases where the operating system is not recognized
+
+Mon Aug 26 20:57:29 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c: use system values for FLT_MIN, FLT_MAX, DBL_MIN, DBL_MAX
+
+Sat May 11 22:30:43 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c (TEST_DENORMAL): test denormals only when available, as
+ tested in configure script
+
+Mon Sep 10 14:23:52 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * fp-netbsd.c fp-openbsd.c (gsl_ieee_set_mode): tried to correct
+ the logic for the denormalized exception.
+
+Tue Jul 10 13:10:12 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * env.c (gsl_ieee_env_setup): send GSL_IEEE_MODE output to stderr
+
+Tue Jun 26 10:44:13 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * fp-netbsd.c (gsl_ieee_set_mode): simplified, patch from Jason Beegan
+
+ * fp-openbsd.c (gsl_ieee_set_mode): simplified
+
+Mon Jun 25 20:47:33 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * fp-openbsd.c (gsl_ieee_set_mode): added support for openbsd
+
+Tue May 8 10:49:58 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * fp-aix.c: changed macros from TRAP_ to TRP_..
+
+Fri Apr 13 15:07:10 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * fp-darwin.c: added darwin support from Rodney Sparapani
+
+Wed Mar 28 13:12:20 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * fp-netbsd.c: added netbsd support from Jason Beegan
+ <jasontd@indigo.ie>
+
+Thu Mar 15 14:11:29 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * fp-hpux11.c: added support for HPUX11
+
+Fri Mar 2 16:58:36 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * fp-os2emx.c: add ieee support for OS/2 from Henry Sobotka
+ <sobotka@axess.com>
+
+Thu Jul 20 19:41:56 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * fp-freebsd.c (gsl_ieee_set_mode): added fp-freebsd.c from
+ Vladimir Kushnir
+
+Mon Jun 12 19:23:53 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * Makefile.am (noinst_HEADERS): added aix and irix to makefile
+
+ * fp-x86linux.c (gsl_ieee_set_mode): Handle libc5, where
+ _FPU_SETCW is not available, by defining the macro. Suggested by
+ OKUJI Yoshinori <okuji@gnu.org>
+
+Wed Jun 7 19:18:15 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * fp-ppclinux.c: added support for ppc linux
+
+Tue Jun 6 19:59:50 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * fp-x86linux.c: renamed from fp-linux.c
+
+Thu May 18 11:53:13 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c: turned off tests for denormals on irix, since they are
+ supported
+
+ * fp.c: added IRIX and AIX to the top-level fp.c file -- somehow
+ they had been forgotten!
+
+2000-05-14 Steve Robbins <steve@nyongwa.montreal.qc.ca>
+
+ * fp-tru64.c: include `/usr/include/float.h', if necessary for
+ picking up FP_RND_RN and friends.
+
+Sun Apr 2 14:25:52 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * fp-m68klinux.c: added file for m68k support (not complete, some
+ macros need to be checked)
+
+Thu Mar 16 15:34:08 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * read.c (gsl_ieee_read_mode_string): changed token separator to ,
+ instead of ;
+
+Thu Feb 24 19:20:50 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * fp-tru64.c (gsl_ieee_set_mode): added an #ifdef for
+ IEEE_TRAP_ENABLE_DNO, which may or may not be defined depending on
+ the version of Digital Unix.
+
+Mon Feb 14 14:03:22 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * made internal functions static and removed redundant functions
+
+Fri Nov 5 15:01:55 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * fp-sparclinux.c: added support for sparclinux
+
+Thu Oct 7 13:03:00 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * make_rep.c: more careful conversion from unsigned to signed integer
+ for sign attribute to prevent warnings
+
+Sat Aug 21 01:05:01 1999 Tim Mooney <mooney@plains.NoDak.edu>
+
+ * fp-aix.c: added, based on fp-solaris.
+
+Fri Aug 20 12:17:53 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * fp-tru64.c (gsl_ieee_set_mode): note that INEXACT is not easily
+ supported on Tru64, and give an error if anyone tries to use it
+
+Wed Aug 18 21:36:01 1999 Tim Mooney <mooney@plains.NoDak.edu>
+
+ * fp-irix.c: added, based on fp-solaris. IRIX 6 has a rounding and
+ exception interface that is identical to Solaris, right down to the enums.
+
+Tue Aug 17 18:36:01 1999 Tim Mooney <mooney@plains.NoDak.edu>
+
+ * fp-tru64.c: added, based on solaris and HP-UX fp-* files.
+ Rounding mode and trap control requires that the compiler be
+ passed special options, see the comments in fp-tru64.c.
+
+Fri Jul 23 19:00:51 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * print.c: added fprintf versions of the printf functions
+
+Sat May 8 20:39:28 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * fp-linux.c (gsl_ieee_set_mode): changed from using the function
+ __fput_setcw() to the macro _FPU_SETCW() since Khimenko Victor
+ <khim@sch57.msk.ru> reports that __setfpucw() is not in the shared
+ lib version of glibc-2.1.1
+
+Fri Apr 2 20:52:59 1999 Brian Gough <bjg@netsci.freeserve.co.uk>
+
+ * endian.c (setup_dynamic_endianness): removed useless test,
+ u.c[i]<0 for unsigned
+
+Fri Aug 21 15:36:22 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * fp-unknown.c (gsl_ieee_set_mode): made return type int, as it
+ should be
+
+Mon Jun 15 22:02:00 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * renamed read-mode-string.c to read.c and print-ieee.c to print.c
+
+Tue Jun 2 19:29:34 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * gsl_ieee_utils.h: renamed GSL_IEEE_CATCH_INEXACT to
+ GSL_IEEE_TRAP_INEXACT, which is a better name
+
+Mon Jun 1 15:27:08 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * fp-sunos4.c: support for sunos4 IEEE interface
+
+ * fp-solaris.c: support for solaris IEEE interface
+
+ * renamed fp-mode-string.c to fp-env.c, in order to avoid short
+ filename problems
+
+ * added support for setting the IEEE mode from the environment
+ variable GSL_IEEE_MODE (only works for the Linux kernel so far)
+
+Mon May 18 16:20:17 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * The determination of endianness is now done on each call instead
+ of at configure time (autoconf complains about what would happen
+ to the test if it were cross compiling). Ok, so it's a bit slower
+ but this isn't a performance critical routine.
+
+Sat May 16 23:10:09 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * This directory contains some routines for examining IEEE format
+ numbers at the bit level
+
diff --git a/gsl-1.9/ieee-utils/Makefile.am b/gsl-1.9/ieee-utils/Makefile.am
new file mode 100644
index 0000000..559e531
--- /dev/null
+++ b/gsl-1.9/ieee-utils/Makefile.am
@@ -0,0 +1,14 @@
+noinst_LTLIBRARIES = libgslieeeutils.la
+
+pkginclude_HEADERS = gsl_ieee_utils.h
+
+libgslieeeutils_la_SOURCES = print.c make_rep.c gsl_ieee_utils.h env.c fp.c read.c
+
+noinst_HEADERS = fp-aix.c fp-darwin.c fp-darwin86.c fp-hpux.c fp-hpux11.c fp-irix.c fp-gnum68k.c fp-gnuppc.c fp-solaris.c fp-gnusparc.c fp-sunos4.c fp-tru64.c fp-unknown.c fp-gnux86.c fp-freebsd.c fp-os2emx.c fp-netbsd.c fp-openbsd.c fp-gnuc99.c endian.c standardize.c
+
+INCLUDES= -I$(top_builddir)
+
+TESTS = $(check_PROGRAMS)
+check_PROGRAMS = test
+test_LDADD = libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+test_SOURCES = test.c
diff --git a/gsl-1.9/ieee-utils/Makefile.in b/gsl-1.9/ieee-utils/Makefile.in
new file mode 100644
index 0000000..d2422b1
--- /dev/null
+++ b/gsl-1.9/ieee-utils/Makefile.in
@@ -0,0 +1,544 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = test$(EXEEXT)
+subdir = ieee-utils
+DIST_COMMON = $(noinst_HEADERS) $(pkginclude_HEADERS) \
+ $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog TODO
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgslieeeutils_la_LIBADD =
+am_libgslieeeutils_la_OBJECTS = print.lo make_rep.lo env.lo fp.lo \
+ read.lo
+libgslieeeutils_la_OBJECTS = $(am_libgslieeeutils_la_OBJECTS)
+am_test_OBJECTS = test.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = libgslieeeutils.la ../err/libgslerr.la \
+ ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgslieeeutils_la_SOURCES) $(test_SOURCES)
+DIST_SOURCES = $(libgslieeeutils_la_SOURCES) $(test_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libgslieeeutils.la
+pkginclude_HEADERS = gsl_ieee_utils.h
+libgslieeeutils_la_SOURCES = print.c make_rep.c gsl_ieee_utils.h env.c fp.c read.c
+noinst_HEADERS = fp-aix.c fp-darwin.c fp-darwin86.c fp-hpux.c fp-hpux11.c fp-irix.c fp-gnum68k.c fp-gnuppc.c fp-solaris.c fp-gnusparc.c fp-sunos4.c fp-tru64.c fp-unknown.c fp-gnux86.c fp-freebsd.c fp-os2emx.c fp-netbsd.c fp-openbsd.c fp-gnuc99.c endian.c standardize.c
+INCLUDES = -I$(top_builddir)
+TESTS = $(check_PROGRAMS)
+test_LDADD = libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+test_SOURCES = test.c
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps ieee-utils/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps ieee-utils/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgslieeeutils.la: $(libgslieeeutils_la_OBJECTS) $(libgslieeeutils_la_DEPENDENCIES)
+ $(LINK) $(libgslieeeutils_la_LDFLAGS) $(libgslieeeutils_la_OBJECTS) $(libgslieeeutils_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkgincludeHEADERS
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/ieee-utils/TODO b/gsl-1.9/ieee-utils/TODO
new file mode 100644
index 0000000..c499e8e
--- /dev/null
+++ b/gsl-1.9/ieee-utils/TODO
@@ -0,0 +1,2 @@
+* Fix up ieee-utils/fp-m68klinux.c for correct behavior and actually
+test it.
diff --git a/gsl-1.9/ieee-utils/endian.c b/gsl-1.9/ieee-utils/endian.c
new file mode 100644
index 0000000..4c2caea
--- /dev/null
+++ b/gsl-1.9/ieee-utils/endian.c
@@ -0,0 +1,37 @@
+/* ieee-utils/endian.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_ieee_utils.h>
+
+static int little_endian_p (void) ;
+
+static int
+little_endian_p (void) {
+ /* Are we little or big endian? From Harbison & Steele. */
+ union
+ {
+ long l;
+ char c[sizeof (long)];
+ } u;
+ u.l = 1;
+ return (u.c[sizeof (long) - 1] == 1);
+}
+
diff --git a/gsl-1.9/ieee-utils/env.c b/gsl-1.9/ieee-utils/env.c
new file mode 100644
index 0000000..efff49c
--- /dev/null
+++ b/gsl-1.9/ieee-utils/env.c
@@ -0,0 +1,114 @@
+/* ieee-utils/env.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_errno.h>
+
+void
+gsl_ieee_env_setup (void)
+{
+ const char * p = getenv("GSL_IEEE_MODE") ;
+
+ int precision = 0, rounding = 0, exception_mask = 0 ;
+
+ int comma = 0 ;
+
+ if (p == 0) /* GSL_IEEE_MODE environment variable is not set */
+ return ;
+
+ if (*p == '\0') /* GSL_IEEE_MODE environment variable is empty */
+ return ;
+
+ gsl_ieee_read_mode_string (p, &precision, &rounding, &exception_mask) ;
+
+ gsl_ieee_set_mode (precision, rounding, exception_mask) ;
+
+ fprintf(stderr, "GSL_IEEE_MODE=\"") ;
+
+ /* Print string with a preceeding comma if the list has already begun */
+
+#define PRINTC(x) do {if(comma) fprintf(stderr,","); fprintf(stderr,x); comma++ ;} while(0)
+
+ switch (precision)
+ {
+ case GSL_IEEE_SINGLE_PRECISION:
+ PRINTC("single-precision") ;
+ break ;
+ case GSL_IEEE_DOUBLE_PRECISION:
+ PRINTC("double-precision") ;
+ break ;
+ case GSL_IEEE_EXTENDED_PRECISION:
+ PRINTC("extended-precision") ;
+ break ;
+ }
+
+ switch (rounding)
+ {
+ case GSL_IEEE_ROUND_TO_NEAREST:
+ PRINTC("round-to-nearest") ;
+ break ;
+ case GSL_IEEE_ROUND_DOWN:
+ PRINTC("round-down") ;
+ break ;
+ case GSL_IEEE_ROUND_UP:
+ PRINTC("round-up") ;
+ break ;
+ case GSL_IEEE_ROUND_TO_ZERO:
+ PRINTC("round-to-zero") ;
+ break ;
+ }
+
+ if ((exception_mask & GSL_IEEE_MASK_ALL) == GSL_IEEE_MASK_ALL)
+ {
+ PRINTC("mask-all") ;
+ }
+ else if ((exception_mask & GSL_IEEE_MASK_ALL) == 0)
+ {
+ PRINTC("trap-common") ;
+ }
+ else
+ {
+ if (exception_mask & GSL_IEEE_MASK_INVALID)
+ PRINTC("mask-invalid") ;
+
+ if (exception_mask & GSL_IEEE_MASK_DENORMALIZED)
+ PRINTC("mask-denormalized") ;
+
+ if (exception_mask & GSL_IEEE_MASK_DIVISION_BY_ZERO)
+ PRINTC("mask-division-by-zero") ;
+
+ if (exception_mask & GSL_IEEE_MASK_OVERFLOW)
+ PRINTC("mask-overflow") ;
+
+ if (exception_mask & GSL_IEEE_MASK_UNDERFLOW)
+ PRINTC("mask-underflow") ;
+ }
+
+ if (exception_mask & GSL_IEEE_TRAP_INEXACT)
+ PRINTC("trap-inexact") ;
+
+ fprintf(stderr,"\"\n") ;
+}
+
+
+
+
+
diff --git a/gsl-1.9/ieee-utils/fp-aix.c b/gsl-1.9/ieee-utils/fp-aix.c
new file mode 100644
index 0000000..9933f8f
--- /dev/null
+++ b/gsl-1.9/ieee-utils/fp-aix.c
@@ -0,0 +1,120 @@
+/* ieee-utils/fp-aix.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Tim Mooney
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <math.h>
+#include <fptrap.h>
+#include <float.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_errno.h>
+
+int
+gsl_ieee_set_mode (int precision, int rounding, int exception_mask)
+{
+ fptrap_t mode = 0 ;
+ fprnd_t rnd = 0 ;
+
+ switch (precision)
+ {
+
+ /* I'm not positive about AIX only supporting default precision rounding,
+ * but this is the best assumption until it's proven otherwise. */
+
+ case GSL_IEEE_SINGLE_PRECISION:
+ GSL_ERROR ("AIX only supports default precision rounding",
+ GSL_EUNSUP) ;
+ break ;
+ case GSL_IEEE_DOUBLE_PRECISION:
+ GSL_ERROR ("AIX only supports default precision rounding",
+ GSL_EUNSUP) ;
+ break ;
+ case GSL_IEEE_EXTENDED_PRECISION:
+ GSL_ERROR ("AIX only supports default precision rounding",
+ GSL_EUNSUP) ;
+ break ;
+ }
+
+ switch (rounding)
+ {
+ case GSL_IEEE_ROUND_TO_NEAREST:
+ rnd = FP_RND_RN ;
+ fp_swap_rnd (rnd) ;
+ break ;
+ case GSL_IEEE_ROUND_DOWN:
+ rnd = FP_RND_RM ;
+ fp_swap_rnd (rnd) ;
+ break ;
+ case GSL_IEEE_ROUND_UP:
+ rnd = FP_RND_RP ;
+ fp_swap_rnd (rnd) ;
+ break ;
+ case GSL_IEEE_ROUND_TO_ZERO:
+ rnd = FP_RND_RZ ;
+ fp_swap_rnd (rnd) ;
+ break ;
+ default:
+ rnd = FP_RND_RN ;
+ fp_swap_rnd (rnd) ;
+ }
+
+ /* Turn on all the exceptions apart from 'inexact' */
+
+ mode = TRP_INVALID | TRP_DIV_BY_ZERO | TRP_OVERFLOW | TRP_UNDERFLOW ;
+
+ if (exception_mask & GSL_IEEE_MASK_INVALID)
+ mode &= ~ TRP_INVALID ;
+
+ if (exception_mask & GSL_IEEE_MASK_DENORMALIZED)
+ {
+ /* do nothing */
+ }
+ else
+ {
+ GSL_ERROR ("AIX does not support the denormalized operand exception. "
+ "Use 'mask-denormalized' to work around this.",
+ GSL_EUNSUP) ;
+ }
+
+ if (exception_mask & GSL_IEEE_MASK_DIVISION_BY_ZERO)
+ mode &= ~ TRP_DIV_BY_ZERO ;
+
+ if (exception_mask & GSL_IEEE_MASK_OVERFLOW)
+ mode &= ~ TRP_OVERFLOW ;
+
+ if (exception_mask & GSL_IEEE_MASK_UNDERFLOW)
+ mode &= ~ TRP_UNDERFLOW ;
+
+ if (exception_mask & GSL_IEEE_TRAP_INEXACT)
+ {
+ mode |= TRP_INEXACT ;
+ }
+ else
+ {
+ mode &= ~ TRP_INEXACT ;
+ }
+
+ /* AIX appears to require two steps -- first enable floating point traps
+ * in general... */
+ fp_trap(FP_TRAP_SYNC);
+
+ /* next, enable the traps we're interested in */
+ fp_enable(mode);
+
+ return GSL_SUCCESS ;
+
+}
diff --git a/gsl-1.9/ieee-utils/fp-darwin.c b/gsl-1.9/ieee-utils/fp-darwin.c
new file mode 100644
index 0000000..c06a8a6
--- /dev/null
+++ b/gsl-1.9/ieee-utils/fp-darwin.c
@@ -0,0 +1,95 @@
+/* ieee-utils/fp-darwin.c
+ *
+ * Copyright (C) 2001 Rodney Sparapani <rsparapa@mcw.edu>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <architecture/ppc/fp_regs.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_errno.h>
+
+int
+gsl_ieee_set_mode (int precision, int rounding, int exception_mask)
+{
+ ppc_fp_scr_t fp_scr = get_fp_scr() ;
+
+ switch (precision)
+ {
+ case GSL_IEEE_SINGLE_PRECISION:
+ GSL_ERROR ("powerpc only supports default precision rounding", GSL_EUNSUP);
+ break ;
+ case GSL_IEEE_DOUBLE_PRECISION:
+ GSL_ERROR ("powerpc only supports default precision rounding", GSL_EUNSUP);
+ break ;
+ case GSL_IEEE_EXTENDED_PRECISION:
+ GSL_ERROR ("powerpc only supports default precision rounding", GSL_EUNSUP);
+ break ;
+ }
+
+ switch (rounding)
+ {
+ case GSL_IEEE_ROUND_TO_NEAREST:
+ fp_scr.rn = RN_NEAREST ;
+ break ;
+ case GSL_IEEE_ROUND_DOWN:
+ fp_scr.rn = RN_TOWARD_MINUS ;
+ break ;
+ case GSL_IEEE_ROUND_UP:
+ fp_scr.rn = RN_TOWARD_PLUS ;
+ break ;
+ case GSL_IEEE_ROUND_TO_ZERO:
+ fp_scr.rn = RN_TOWARD_ZERO ;
+ break ;
+ default:
+ fp_scr.rn = RN_NEAREST ;
+ }
+
+ if (exception_mask & GSL_IEEE_MASK_INVALID)
+ fp_scr.ve = 0 ; //ve bit: invalid op exception enable
+
+ if (exception_mask & GSL_IEEE_MASK_DENORMALIZED)
+ {
+ /* do nothing */
+ }
+ else
+ {
+ GSL_ERROR ("powerpc does not support the denormalized operand exception. "
+ "Use 'mask-denormalized' to work around this.", GSL_EUNSUP) ;
+ }
+
+ if (exception_mask & GSL_IEEE_MASK_DIVISION_BY_ZERO)
+ fp_scr.ze = 0 ; //ze bit: zero divide exception enable
+
+ if (exception_mask & GSL_IEEE_MASK_OVERFLOW)
+ fp_scr.oe = 0 ; //oe bit: overflow exception enable
+
+ if (exception_mask & GSL_IEEE_MASK_UNDERFLOW)
+ fp_scr.ue = 0 ; //ue bit: underflow exception enable
+
+ if (exception_mask & GSL_IEEE_TRAP_INEXACT)
+ {
+ fp_scr.xe = 1 ; //xe bit: inexact exception enable
+ }
+ else
+ {
+ fp_scr.xe = 01 ;
+ }
+
+ set_fp_scr(fp_scr);
+
+ return GSL_SUCCESS ;
+
+}
diff --git a/gsl-1.9/ieee-utils/fp-darwin86.c b/gsl-1.9/ieee-utils/fp-darwin86.c
new file mode 100644
index 0000000..51cac04
--- /dev/null
+++ b/gsl-1.9/ieee-utils/fp-darwin86.c
@@ -0,0 +1,204 @@
+/* ieee-utils/fp-darwin86.c
+ *
+ * Copyright (C) 2006 Erik Schnetter
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_errno.h>
+
+/* Here is the dirty part. Set up your 387 through the control word
+ * (cw) register.
+ *
+ * 15-13 12 11-10 9-8 7-6 5 4 3 2 1 0
+ * | reserved | IC | RC | PC | reserved | PM | UM | OM | ZM | DM | IM
+ *
+ * IM: Invalid operation mask
+ * DM: Denormalized operand mask
+ * ZM: Zero-divide mask
+ * OM: Overflow mask
+ * UM: Underflow mask
+ * PM: Precision (inexact result) mask
+ *
+ * Mask bit is 1 means no interrupt.
+ *
+ * PC: Precision control
+ * 11 - round to extended precision
+ * 10 - round to double precision
+ * 00 - round to single precision
+ *
+ * RC: Rounding control
+ * 00 - rounding to nearest
+ * 01 - rounding down (toward - infinity)
+ * 10 - rounding up (toward + infinity)
+ * 11 - rounding toward zero
+ *
+ * IC: Infinity control
+ * That is for 8087 and 80287 only.
+ *
+ * The hardware default is 0x037f which we use.
+ */
+
+/* masking of interrupts */
+#define _FPU_MASK_IM 0x01
+#define _FPU_MASK_DM 0x02
+#define _FPU_MASK_ZM 0x04
+#define _FPU_MASK_OM 0x08
+#define _FPU_MASK_UM 0x10
+#define _FPU_MASK_PM 0x20
+
+/* precision control */
+#define _FPU_EXTENDED 0x300 /* libm requires double extended precision. */
+#define _FPU_DOUBLE 0x200
+#define _FPU_SINGLE 0x0
+
+/* rounding control */
+#define _FPU_RC_NEAREST 0x0 /* RECOMMENDED */
+#define _FPU_RC_DOWN 0x400
+#define _FPU_RC_UP 0x800
+#define _FPU_RC_ZERO 0xC00
+
+#define _FPU_RESERVED 0xF0C0 /* Reserved bits in cw */
+
+
+/* The fdlibm code requires strict IEEE double precision arithmetic,
+ and no interrupts for exceptions, rounding to nearest. */
+
+#define _FPU_DEFAULT 0x037f
+
+/* IEEE: same as above. */
+#define _FPU_IEEE 0x037f
+
+/* Type of the control word. */
+typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__HI__)));
+
+/* Macros for accessing the hardware control word.
+
+ Note that the use of these macros is no sufficient anymore with
+ recent hardware. Some floating point operations are executed in
+ the SSE/SSE2 engines which have their own control and status register. */
+#define _FPU_GETCW(cw) __asm__ __volatile__ ("fnstcw %0" : "=m" (*&cw))
+#define _FPU_SETCW(cw) __asm__ __volatile__ ("fldcw %0" : : "m" (*&cw))
+
+/* Default control word set at startup. */
+extern fpu_control_t __fpu_control;
+
+
+
+#define _FPU_GETMXCSR(cw_sse) asm volatile ("stmxcsr %0" : "=m" (cw_sse))
+#define _FPU_SETMXCSR(cw_sse) asm volatile ("ldmxcsr %0" : : "m" (cw_sse))
+
+
+
+int
+gsl_ieee_set_mode (int precision, int rounding, int exception_mask)
+{
+ fpu_control_t mode, mode_sse;
+
+ _FPU_GETCW (mode) ;
+ mode &= _FPU_RESERVED ;
+
+ switch (precision)
+ {
+ case GSL_IEEE_SINGLE_PRECISION:
+ mode |= _FPU_SINGLE ;
+ break ;
+ case GSL_IEEE_DOUBLE_PRECISION:
+ mode |= _FPU_DOUBLE ;
+ break ;
+ case GSL_IEEE_EXTENDED_PRECISION:
+ mode |= _FPU_EXTENDED ;
+ break ;
+ default:
+ mode |= _FPU_EXTENDED ;
+ }
+
+ switch (rounding)
+ {
+ case GSL_IEEE_ROUND_TO_NEAREST:
+ mode |= _FPU_RC_NEAREST ;
+ break ;
+ case GSL_IEEE_ROUND_DOWN:
+ mode |= _FPU_RC_DOWN ;
+ break ;
+ case GSL_IEEE_ROUND_UP:
+ mode |= _FPU_RC_UP ;
+ break ;
+ case GSL_IEEE_ROUND_TO_ZERO:
+ mode |= _FPU_RC_ZERO ;
+ break ;
+ default:
+ mode |= _FPU_RC_NEAREST ;
+ }
+
+ if (exception_mask & GSL_IEEE_MASK_INVALID)
+ mode |= _FPU_MASK_IM ;
+
+ if (exception_mask & GSL_IEEE_MASK_DENORMALIZED)
+ mode |= _FPU_MASK_DM ;
+
+ if (exception_mask & GSL_IEEE_MASK_DIVISION_BY_ZERO)
+ mode |= _FPU_MASK_ZM ;
+
+ if (exception_mask & GSL_IEEE_MASK_OVERFLOW)
+ mode |= _FPU_MASK_OM ;
+
+ if (exception_mask & GSL_IEEE_MASK_UNDERFLOW)
+ mode |= _FPU_MASK_UM ;
+
+ if (exception_mask & GSL_IEEE_TRAP_INEXACT)
+ {
+ mode &= ~ _FPU_MASK_PM ;
+ }
+ else
+ {
+ mode |= _FPU_MASK_PM ;
+ }
+
+ _FPU_SETCW (mode) ;
+
+ _FPU_GETMXCSR (mode_sse) ;
+ mode_sse &= 0xFFFF0000 ;
+
+ if (exception_mask & GSL_IEEE_MASK_INVALID)
+ mode_sse |= _FPU_MASK_IM << 7 ;
+
+ if (exception_mask & GSL_IEEE_MASK_DENORMALIZED)
+ mode_sse |= _FPU_MASK_DM << 7 ;
+
+ if (exception_mask & GSL_IEEE_MASK_DIVISION_BY_ZERO)
+ mode_sse |= _FPU_MASK_ZM << 7 ;
+
+ if (exception_mask & GSL_IEEE_MASK_OVERFLOW)
+ mode_sse |= _FPU_MASK_OM << 7 ;
+
+ if (exception_mask & GSL_IEEE_MASK_UNDERFLOW)
+ mode_sse |= _FPU_MASK_UM << 7 ;
+
+ if (exception_mask & GSL_IEEE_TRAP_INEXACT)
+ {
+ mode_sse &= ~ _FPU_MASK_PM << 7 ;
+ }
+ else
+ {
+ mode_sse |= _FPU_MASK_PM << 7 ;
+ }
+
+ _FPU_SETMXCSR (mode_sse) ;
+
+ return GSL_SUCCESS ;
+}
diff --git a/gsl-1.9/ieee-utils/fp-freebsd.c b/gsl-1.9/ieee-utils/fp-freebsd.c
new file mode 100644
index 0000000..e11cfd2
--- /dev/null
+++ b/gsl-1.9/ieee-utils/fp-freebsd.c
@@ -0,0 +1,102 @@
+/* ieee-utils/fp-freebsd.c
+ *
+ * Copyright (C) 2000 Vladimir Kushnir
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <ieeefp.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_errno.h>
+
+int
+gsl_ieee_set_mode (int precision, int rounding, int exception_mask)
+{
+ fp_prec_t prec = 0 ;
+ fp_except_t mode = 0 ;
+ fp_rnd_t rnd = 0 ;
+
+ switch (precision)
+ {
+ case GSL_IEEE_SINGLE_PRECISION:
+ prec = FP_PS;
+ fpsetprec(prec);
+ break ;
+ case GSL_IEEE_DOUBLE_PRECISION:
+ prec = FP_PD;
+ fpsetprec(prec);
+ break ;
+ case GSL_IEEE_EXTENDED_PRECISION:
+ prec = FP_PE;
+ fpsetprec(prec);
+ break ;
+ }
+
+ switch (rounding)
+ {
+ case GSL_IEEE_ROUND_TO_NEAREST:
+ rnd = FP_RN ;
+ fpsetround (rnd) ;
+ break ;
+ case GSL_IEEE_ROUND_DOWN:
+ rnd = FP_RM ;
+ fpsetround (rnd) ;
+ break ;
+ case GSL_IEEE_ROUND_UP:
+ rnd = FP_RP ;
+ fpsetround (rnd) ;
+ break ;
+ case GSL_IEEE_ROUND_TO_ZERO:
+ rnd = FP_RZ ;
+ fpsetround (rnd) ;
+ break ;
+ default:
+ rnd = FP_RN ;
+ fpsetround (rnd) ;
+ }
+
+ /* Turn on all the exceptions apart from 'inexact' */
+
+ mode = FP_X_INV | FP_X_DNML | FP_X_DZ | FP_X_OFL | FP_X_UFL ;
+
+ if (exception_mask & GSL_IEEE_MASK_INVALID)
+ mode &= ~ FP_X_INV ;
+
+ if (exception_mask & GSL_IEEE_MASK_DENORMALIZED)
+ mode &= ~ FP_X_DNML ;
+
+ if (exception_mask & GSL_IEEE_MASK_DIVISION_BY_ZERO)
+ mode &= ~ FP_X_DZ ;
+
+ if (exception_mask & GSL_IEEE_MASK_OVERFLOW)
+ mode &= ~ FP_X_OFL ;
+
+ if (exception_mask & GSL_IEEE_MASK_UNDERFLOW)
+ mode &= ~ FP_X_UFL ;
+
+ if (exception_mask & GSL_IEEE_TRAP_INEXACT)
+ {
+ mode |= FP_X_IMP ;
+ }
+ else
+ {
+ mode &= ~ FP_X_IMP ;
+ }
+
+ fpsetmask (mode) ;
+
+ return GSL_SUCCESS ;
+
+}
diff --git a/gsl-1.9/ieee-utils/fp-gnuc99.c b/gsl-1.9/ieee-utils/fp-gnuc99.c
new file mode 100644
index 0000000..93a8e0a
--- /dev/null
+++ b/gsl-1.9/ieee-utils/fp-gnuc99.c
@@ -0,0 +1,182 @@
+/* ieee-utils/fp-gnuc99.c
+ *
+ * Copyright (C) 2003, 2004 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#define _GNU_SOURCE 1
+
+#include <math.h>
+#include <stdio.h>
+#include <fenv.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_errno.h>
+
+int
+gsl_ieee_set_mode (int precision, int rounding, int exception_mask)
+{
+ int mode;
+
+ switch (precision)
+ {
+ case GSL_IEEE_SINGLE_PRECISION:
+ GSL_ERROR ("single precision rounding is not supported by <fenv.h>",
+ GSL_EUNSUP) ;
+ break ;
+ case GSL_IEEE_DOUBLE_PRECISION:
+ GSL_ERROR ("double precision rounding is not supported by <fenv.h>",
+ GSL_EUNSUP) ;
+ break ;
+ case GSL_IEEE_EXTENDED_PRECISION:
+ GSL_ERROR ("extended precision rounding is not supported by <fenv.h>",
+ GSL_EUNSUP) ;
+ break ;
+ }
+
+
+ switch (rounding)
+ {
+ case GSL_IEEE_ROUND_TO_NEAREST:
+#ifdef FE_TONEAREST
+ fesetround (FE_TONEAREST) ;
+#else
+ GSL_ERROR ("round-to-nearest is not supported by <fenv.h>", GSL_EUNSUP) ;
+#endif
+ break ;
+ case GSL_IEEE_ROUND_DOWN:
+#ifdef FE_DOWNWARD
+ fesetround (FE_DOWNWARD) ;
+#else
+ GSL_ERROR ("round-down is not supported by <fenv.h>", GSL_EUNSUP) ;
+#endif
+ break ;
+ case GSL_IEEE_ROUND_UP:
+#ifdef FE_UPWARD
+ fesetround (FE_UPWARD) ;
+#else
+ GSL_ERROR ("round-up is not supported by <fenv.h>", GSL_EUNSUP) ;
+#endif
+ break ;
+ case GSL_IEEE_ROUND_TO_ZERO:
+#ifdef FE_TOWARDZERO
+ fesetround (FE_TOWARDZERO) ;
+#else
+ GSL_ERROR ("round-toward-zero is not supported by <fenv.h>", GSL_EUNSUP) ;
+#endif
+ break ;
+ default:
+#ifdef FE_TONEAREST
+ fesetround (FE_TONEAREST) ;
+#else
+ GSL_ERROR ("default round-to-nearest mode is not supported by <fenv.h>", GSL_EUNSUP) ;
+#endif
+ }
+
+ /* Turn on all the exceptions apart from 'inexact' */
+
+ mode = 0;
+
+#ifdef FE_INVALID
+ mode |= FE_INVALID;
+#endif
+
+#ifdef FE_DIVBYZERO
+ mode |= FE_DIVBYZERO;
+#endif
+
+#ifdef FE_OVERFLOW
+ mode |= FE_OVERFLOW ;
+#endif
+
+#ifdef FE_UNDERFLOW
+ mode |= FE_UNDERFLOW ;
+#endif
+
+ if (exception_mask & GSL_IEEE_MASK_INVALID)
+ {
+#ifdef FE_INVALID
+ mode &= ~ FE_INVALID ;
+#else
+ GSL_ERROR ("invalid operation exception not supported by <fenv.h>",
+ GSL_EUNSUP);
+#endif
+ }
+
+ if (exception_mask & GSL_IEEE_MASK_DENORMALIZED)
+ {
+ /* do nothing */
+ }
+ else
+ {
+ GSL_ERROR ("denormalized operand exception not supported by <fenv.h>. "
+ "Use 'mask-denormalized' to work around this.", GSL_EUNSUP) ;
+ }
+
+ if (exception_mask & GSL_IEEE_MASK_DIVISION_BY_ZERO)
+ {
+#ifdef FE_DIVBYZERO
+ mode &= ~ FE_DIVBYZERO ;
+#else
+ GSL_ERROR ("division by zero exception not supported by <fenv.h>",
+ GSL_EUNSUP);
+#endif
+ }
+
+ if (exception_mask & GSL_IEEE_MASK_OVERFLOW)
+ {
+#ifdef FE_OVERFLOW
+ mode &= ~ FE_OVERFLOW ;
+#else
+ GSL_ERROR ("overflow exception not supported by <fenv.h>", GSL_EUNSUP);
+#endif
+ }
+
+ if (exception_mask & GSL_IEEE_MASK_UNDERFLOW)
+ {
+#ifdef FE_UNDERFLOW
+ mode &= ~ FE_UNDERFLOW ;
+#else
+ GSL_ERROR ("underflow exception not supported by <fenv.h>", GSL_EUNSUP);
+#endif
+ }
+
+ if (exception_mask & GSL_IEEE_TRAP_INEXACT)
+ {
+#ifdef FE_INEXACT
+ mode |= FE_INEXACT ;
+#else
+ GSL_ERROR ("inexact exception not supported by <fenv.h>", GSL_EUNSUP);
+#endif
+ }
+ else
+ {
+#ifdef FE_INEXACT
+ mode &= ~ FE_INEXACT ;
+#else
+ /* do nothing */
+#endif
+ }
+
+#if HAVE_DECL_FEENABLEEXCEPT
+ feenableexcept (mode) ;
+#elif HAVE_DECL_FESETTRAPENABLE
+ fesettrapenable (mode);
+#else
+ GSL_ERROR ("unknown exception trap method", GSL_EUNSUP)
+#endif
+
+ return GSL_SUCCESS ;
+}
diff --git a/gsl-1.9/ieee-utils/fp-gnum68k.c b/gsl-1.9/ieee-utils/fp-gnum68k.c
new file mode 100644
index 0000000..5aab825
--- /dev/null
+++ b/gsl-1.9/ieee-utils/fp-gnum68k.c
@@ -0,0 +1,101 @@
+/* ieee-utils/fp-gnum68k.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <stdio.h>
+#include <fpu_control.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_ieee_utils.h>
+
+int
+gsl_ieee_set_mode (int precision, int rounding, int exception_mask)
+{
+ unsigned short mode = 0 ;
+
+ switch (precision)
+ {
+ case GSL_IEEE_SINGLE_PRECISION:
+ mode |= _FPU_SINGLE ;
+ break ;
+ case GSL_IEEE_DOUBLE_PRECISION:
+ mode |= _FPU_DOUBLE ;
+ break ;
+ case GSL_IEEE_EXTENDED_PRECISION:
+ mode |= _FPU_EXTENDED ;
+ break ;
+ default:
+ mode |= _FPU_EXTENDED ;
+ }
+
+ switch (rounding)
+ {
+ case GSL_IEEE_ROUND_TO_NEAREST:
+ mode |= _FPU_RC_NEAREST ;
+ break ;
+ case GSL_IEEE_ROUND_DOWN:
+ mode |= _FPU_RC_DOWN ;
+ break ;
+ case GSL_IEEE_ROUND_UP:
+ mode |= _FPU_RC_UP ;
+ break ;
+ case GSL_IEEE_ROUND_TO_ZERO:
+ mode |= _FPU_RC_ZERO ;
+ break ;
+ default:
+ mode |= _FPU_RC_NEAREST ;
+ }
+
+ /* FIXME: I don't have documentation for the M68K so I'm not sure
+ about the mapping of the exceptions below. Maybe someone who does
+ know could correct this. */
+
+ if (exception_mask & GSL_IEEE_MASK_INVALID)
+ mode |= _FPU_MASK_OPERR ;
+
+ if (exception_mask & GSL_IEEE_MASK_DENORMALIZED)
+ {
+ /* do nothing */
+ }
+ else
+ {
+ GSL_ERROR ("the denormalized operand exception has not been implemented for m68k yet. Use 'mask-denormalized' to work around this.", GSL_EUNSUP) ;
+ /*mode |= _FPU_MASK_DM ; ???? */
+ }
+
+ if (exception_mask & GSL_IEEE_MASK_DIVISION_BY_ZERO)
+ mode |= _FPU_MASK_DZ ;
+
+ if (exception_mask & GSL_IEEE_MASK_OVERFLOW)
+ mode |= _FPU_MASK_OVFL ;
+
+ if (exception_mask & GSL_IEEE_MASK_UNDERFLOW)
+ mode |= _FPU_MASK_UNFL ;
+
+ if (exception_mask & GSL_IEEE_TRAP_INEXACT)
+ {
+ mode &= ~ (_FPU_MASK_INEX1 | _FPU_MASK_INEX2) ;
+ }
+ else
+ {
+ mode |= (_FPU_MASK_INEX1 | _FPU_MASK_INEX2) ;
+ }
+
+ _FPU_SETCW(mode) ;
+
+ return GSL_SUCCESS ;
+}
diff --git a/gsl-1.9/ieee-utils/fp-gnuppc.c b/gsl-1.9/ieee-utils/fp-gnuppc.c
new file mode 100644
index 0000000..161c5b3
--- /dev/null
+++ b/gsl-1.9/ieee-utils/fp-gnuppc.c
@@ -0,0 +1,98 @@
+/* ieee-utils/fp-gnuppc.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough, John Fisher
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <stdio.h>
+#include <fpu_control.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_ieee_utils.h>
+
+
+/*
+ * Identical to fp-gnux86.c, except with references to
+ * _FPU_SINGLE, _FPU_DOUBLE, _FPU_EXTENDED, _FPU_MASK_DM
+ * and _FPU_MASK_PM converted to errors.
+ */
+
+int
+gsl_ieee_set_mode (int precision, int rounding, int exception_mask)
+{
+ unsigned short mode = 0 ;
+
+ switch (precision)
+ {
+ case GSL_IEEE_SINGLE_PRECISION:
+ GSL_ERROR ("powerpc only supports default precision rounding", GSL_EUNSUP);
+ break ;
+ case GSL_IEEE_DOUBLE_PRECISION:
+ GSL_ERROR ("powerpc only supports default precision rounding", GSL_EUNSUP);
+ break ;
+ case GSL_IEEE_EXTENDED_PRECISION:
+ GSL_ERROR ("powerpc only supports default precision rounding", GSL_EUNSUP);
+ break ;
+ }
+
+ switch (rounding)
+ {
+ case GSL_IEEE_ROUND_TO_NEAREST:
+ mode |= _FPU_RC_NEAREST ;
+ break ;
+ case GSL_IEEE_ROUND_DOWN:
+ mode |= _FPU_RC_DOWN ;
+ break ;
+ case GSL_IEEE_ROUND_UP:
+ mode |= _FPU_RC_UP ;
+ break ;
+ case GSL_IEEE_ROUND_TO_ZERO:
+ mode |= _FPU_RC_ZERO ;
+ break ;
+ default:
+ mode |= _FPU_RC_NEAREST ;
+ }
+
+ if (exception_mask & GSL_IEEE_MASK_INVALID)
+ mode |= _FPU_MASK_IM ;
+
+ if (exception_mask & GSL_IEEE_MASK_DENORMALIZED)
+ {
+ /* do nothing */
+ }
+ else
+ {
+ GSL_ERROR ("powerpc does not support the denormalized operand exception. "
+ "Use 'mask-denormalized' to work around this.", GSL_EUNSUP) ;
+ }
+
+ if (exception_mask & GSL_IEEE_MASK_DIVISION_BY_ZERO)
+ mode |= _FPU_MASK_ZM ;
+
+ if (exception_mask & GSL_IEEE_MASK_OVERFLOW)
+ mode |= _FPU_MASK_OM ;
+
+ if (exception_mask & GSL_IEEE_MASK_UNDERFLOW)
+ mode |= _FPU_MASK_UM ;
+
+ if (exception_mask & GSL_IEEE_TRAP_INEXACT)
+ {
+ GSL_ERROR ("powerpc does not support traps for inexact operations", GSL_EUNSUP) ;
+ }
+
+ _FPU_SETCW(mode) ;
+
+ return GSL_SUCCESS ;
+}
diff --git a/gsl-1.9/ieee-utils/fp-gnusparc.c b/gsl-1.9/ieee-utils/fp-gnusparc.c
new file mode 100644
index 0000000..560e839
--- /dev/null
+++ b/gsl-1.9/ieee-utils/fp-gnusparc.c
@@ -0,0 +1,97 @@
+/* ieee-utils/fp-gnusparc.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <stdio.h>
+#include <fpu_control.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_ieee_utils.h>
+
+int
+gsl_ieee_set_mode (int precision, int rounding, int exception_mask)
+{
+ unsigned short mode = 0 ;
+
+ switch (precision)
+ {
+ case GSL_IEEE_SINGLE_PRECISION:
+ mode |= _FPU_SINGLE ;
+ break ;
+ case GSL_IEEE_DOUBLE_PRECISION:
+ mode |= _FPU_DOUBLE ;
+ break ;
+ case GSL_IEEE_EXTENDED_PRECISION:
+ mode |= _FPU_EXTENDED ;
+ break ;
+ default:
+ mode |= _FPU_EXTENDED ;
+ }
+
+ switch (rounding)
+ {
+ case GSL_IEEE_ROUND_TO_NEAREST:
+ mode |= _FPU_RC_NEAREST ;
+ break ;
+ case GSL_IEEE_ROUND_DOWN:
+ mode |= _FPU_RC_DOWN ;
+ break ;
+ case GSL_IEEE_ROUND_UP:
+ mode |= _FPU_RC_UP ;
+ break ;
+ case GSL_IEEE_ROUND_TO_ZERO:
+ mode |= _FPU_RC_ZERO ;
+ break ;
+ default:
+ mode |= _FPU_RC_NEAREST ;
+ }
+
+ if (exception_mask & GSL_IEEE_MASK_INVALID)
+ mode |= _FPU_MASK_IM ;
+
+ if (exception_mask & GSL_IEEE_MASK_DENORMALIZED)
+ {
+ /* do nothing */
+ }
+ else
+ {
+ GSL_ERROR ("sparc does not support the denormalized operand exception. "
+ "Use 'mask-denormalized' to work around this.", GSL_EUNSUP) ;
+ }
+
+ if (exception_mask & GSL_IEEE_MASK_DIVISION_BY_ZERO)
+ mode |= _FPU_MASK_ZM ;
+
+ if (exception_mask & GSL_IEEE_MASK_OVERFLOW)
+ mode |= _FPU_MASK_OM ;
+
+ if (exception_mask & GSL_IEEE_MASK_UNDERFLOW)
+ mode |= _FPU_MASK_UM ;
+
+ if (exception_mask & GSL_IEEE_TRAP_INEXACT)
+ {
+ mode &= ~ _FPU_MASK_PM ;
+ }
+ else
+ {
+ mode |= _FPU_MASK_PM ;
+ }
+
+ _FPU_SETCW(mode) ;
+
+ return GSL_SUCCESS ;
+}
diff --git a/gsl-1.9/ieee-utils/fp-gnux86.c b/gsl-1.9/ieee-utils/fp-gnux86.c
new file mode 100644
index 0000000..3591fcc
--- /dev/null
+++ b/gsl-1.9/ieee-utils/fp-gnux86.c
@@ -0,0 +1,99 @@
+/* ieee-utils/fp-gnux86.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <stdio.h>
+#include <fpu_control.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_ieee_utils.h>
+
+ /* Handle libc5, where _FPU_SETCW is not available, suggested by
+ OKUJI Yoshinori <okuji@gnu.org> and Evgeny Stambulchik
+ <fnevgeny@plasma-gate.weizmann.ac.il> */
+
+#ifndef _FPU_SETCW
+#include <i386/fpu_control.h>
+#define _FPU_SETCW(cw) __setfpucw(cw)
+#endif
+
+int
+gsl_ieee_set_mode (int precision, int rounding, int exception_mask)
+{
+ unsigned short mode = 0 ;
+
+ switch (precision)
+ {
+ case GSL_IEEE_SINGLE_PRECISION:
+ mode |= _FPU_SINGLE ;
+ break ;
+ case GSL_IEEE_DOUBLE_PRECISION:
+ mode |= _FPU_DOUBLE ;
+ break ;
+ case GSL_IEEE_EXTENDED_PRECISION:
+ mode |= _FPU_EXTENDED ;
+ break ;
+ default:
+ mode |= _FPU_EXTENDED ;
+ }
+
+ switch (rounding)
+ {
+ case GSL_IEEE_ROUND_TO_NEAREST:
+ mode |= _FPU_RC_NEAREST ;
+ break ;
+ case GSL_IEEE_ROUND_DOWN:
+ mode |= _FPU_RC_DOWN ;
+ break ;
+ case GSL_IEEE_ROUND_UP:
+ mode |= _FPU_RC_UP ;
+ break ;
+ case GSL_IEEE_ROUND_TO_ZERO:
+ mode |= _FPU_RC_ZERO ;
+ break ;
+ default:
+ mode |= _FPU_RC_NEAREST ;
+ }
+
+ if (exception_mask & GSL_IEEE_MASK_INVALID)
+ mode |= _FPU_MASK_IM ;
+
+ if (exception_mask & GSL_IEEE_MASK_DENORMALIZED)
+ mode |= _FPU_MASK_DM ;
+
+ if (exception_mask & GSL_IEEE_MASK_DIVISION_BY_ZERO)
+ mode |= _FPU_MASK_ZM ;
+
+ if (exception_mask & GSL_IEEE_MASK_OVERFLOW)
+ mode |= _FPU_MASK_OM ;
+
+ if (exception_mask & GSL_IEEE_MASK_UNDERFLOW)
+ mode |= _FPU_MASK_UM ;
+
+ if (exception_mask & GSL_IEEE_TRAP_INEXACT)
+ {
+ mode &= ~ _FPU_MASK_PM ;
+ }
+ else
+ {
+ mode |= _FPU_MASK_PM ;
+ }
+
+ _FPU_SETCW(mode) ;
+
+ return GSL_SUCCESS ;
+}
diff --git a/gsl-1.9/ieee-utils/fp-hpux.c b/gsl-1.9/ieee-utils/fp-hpux.c
new file mode 100644
index 0000000..560a9bd
--- /dev/null
+++ b/gsl-1.9/ieee-utils/fp-hpux.c
@@ -0,0 +1,110 @@
+/* ieee-utils/fp-hpux.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <math.h>
+#include <stdio.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_errno.h>
+
+int
+gsl_ieee_set_mode (int precision, int rounding, int exception_mask)
+{
+ fp_except mode = 0 ;
+ fp_rnd rnd = 0 ;
+
+ switch (precision)
+ {
+ case GSL_IEEE_SINGLE_PRECISION:
+ GSL_ERROR ("HPUX PA-RISC only supports default precision rounding",
+ GSL_EUNSUP) ;
+ break ;
+ case GSL_IEEE_DOUBLE_PRECISION:
+ GSL_ERROR ("HPUX PA-RISC only supports default precision rounding",
+ GSL_EUNSUP) ;
+ break ;
+ case GSL_IEEE_EXTENDED_PRECISION:
+ GSL_ERROR ("HPUX PA-RISC only supports default precision rounding",
+ GSL_EUNSUP) ;
+ break ;
+ }
+
+
+ switch (rounding)
+ {
+ case GSL_IEEE_ROUND_TO_NEAREST:
+ rnd = FP_RN ;
+ fpsetround (rnd) ;
+ break ;
+ case GSL_IEEE_ROUND_DOWN:
+ rnd = FP_RM ;
+ fpsetround (rnd) ;
+ break ;
+ case GSL_IEEE_ROUND_UP:
+ rnd = FP_RP ;
+ fpsetround (rnd) ;
+ break ;
+ case GSL_IEEE_ROUND_TO_ZERO:
+ rnd = FP_RZ ;
+ fpsetround (rnd) ;
+ break ;
+ default:
+ rnd = FP_RN ;
+ fpsetround (rnd) ;
+ }
+
+ /* Turn on all the exceptions apart from 'inexact' */
+
+ mode = FP_X_INV | FP_X_DZ | FP_X_OFL | FP_X_UFL ;
+
+ if (exception_mask & GSL_IEEE_MASK_INVALID)
+ mode &= ~ FP_X_INV ;
+
+ if (exception_mask & GSL_IEEE_MASK_DENORMALIZED)
+ {
+ /* do nothing */
+ }
+ else
+ {
+ GSL_ERROR ("HP-UX does not support the denormalized operand exception. "
+ "Use 'mask-denormalized' to work around this.",
+ GSL_EUNSUP) ;
+ }
+
+ if (exception_mask & GSL_IEEE_MASK_DIVISION_BY_ZERO)
+ mode &= ~ FP_X_DZ ;
+
+ if (exception_mask & GSL_IEEE_MASK_OVERFLOW)
+ mode &= ~ FP_X_OFL ;
+
+ if (exception_mask & GSL_IEEE_MASK_UNDERFLOW)
+ mode &= ~ FP_X_UFL ;
+
+ if (exception_mask & GSL_IEEE_TRAP_INEXACT)
+ {
+ mode |= FP_X_IMP ;
+ }
+ else
+ {
+ mode &= ~ FP_X_IMP ;
+ }
+
+ fpsetmask (mode) ;
+
+ return GSL_SUCCESS ;
+}
diff --git a/gsl-1.9/ieee-utils/fp-hpux11.c b/gsl-1.9/ieee-utils/fp-hpux11.c
new file mode 100644
index 0000000..86d0c4c
--- /dev/null
+++ b/gsl-1.9/ieee-utils/fp-hpux11.c
@@ -0,0 +1,105 @@
+/* ieee-utils/fp-hpux11.c
+ *
+ * Copyright (C) 2001 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <math.h>
+#include <stdio.h>
+#include <fenv.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_errno.h>
+
+int
+gsl_ieee_set_mode (int precision, int rounding, int exception_mask)
+{
+ int mode;
+
+ switch (precision)
+ {
+ case GSL_IEEE_SINGLE_PRECISION:
+ GSL_ERROR ("HPUX PA-RISC only supports default precision rounding",
+ GSL_EUNSUP) ;
+ break ;
+ case GSL_IEEE_DOUBLE_PRECISION:
+ GSL_ERROR ("HPUX PA-RISC only supports default precision rounding",
+ GSL_EUNSUP) ;
+ break ;
+ case GSL_IEEE_EXTENDED_PRECISION:
+ GSL_ERROR ("HPUX PA-RISC only supports default precision rounding",
+ GSL_EUNSUP) ;
+ break ;
+ }
+
+
+ switch (rounding)
+ {
+ case GSL_IEEE_ROUND_TO_NEAREST:
+ fesetround (FE_TONEAREST) ;
+ break ;
+ case GSL_IEEE_ROUND_DOWN:
+ fesetround (FE_DOWNWARD) ;
+ break ;
+ case GSL_IEEE_ROUND_UP:
+ fesetround (FE_UPWARD) ;
+ break ;
+ case GSL_IEEE_ROUND_TO_ZERO:
+ fesetround (FE_TOWARDZERO) ;
+ break ;
+ default:
+ fesetround (FE_TONEAREST) ;
+ }
+
+ /* Turn on all the exceptions apart from 'inexact' */
+
+ mode = FE_INVALID | FE_DIVBYZERO | FE_OVERFLOW | FE_UNDERFLOW ;
+
+ if (exception_mask & GSL_IEEE_MASK_INVALID)
+ mode &= ~ FE_INVALID ;
+
+ if (exception_mask & GSL_IEEE_MASK_DENORMALIZED)
+ {
+ /* do nothing */
+ }
+ else
+ {
+ GSL_ERROR ("HP-UX does not support the denormalized operand exception. "
+ "Use 'mask-denormalized' to work around this.",
+ GSL_EUNSUP) ;
+ }
+
+ if (exception_mask & GSL_IEEE_MASK_DIVISION_BY_ZERO)
+ mode &= ~ FE_DIVBYZERO ;
+
+ if (exception_mask & GSL_IEEE_MASK_OVERFLOW)
+ mode &= ~ FE_OVERFLOW ;
+
+ if (exception_mask & GSL_IEEE_MASK_UNDERFLOW)
+ mode &= ~ FE_UNDERFLOW ;
+
+ if (exception_mask & GSL_IEEE_TRAP_INEXACT)
+ {
+ mode |= FE_INEXACT ;
+ }
+ else
+ {
+ mode &= ~ FE_INEXACT ;
+ }
+
+ fesettrapenable (mode) ;
+
+ return GSL_SUCCESS ;
+}
diff --git a/gsl-1.9/ieee-utils/fp-irix.c b/gsl-1.9/ieee-utils/fp-irix.c
new file mode 100644
index 0000000..8394612
--- /dev/null
+++ b/gsl-1.9/ieee-utils/fp-irix.c
@@ -0,0 +1,110 @@
+/* ieee-utils/fp-irix.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Tim Mooney
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <math.h>
+#include <ieeefp.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_errno.h>
+
+int
+gsl_ieee_set_mode (int precision, int rounding, int exception_mask)
+{
+ fp_except mode = 0 ;
+ fp_rnd rnd = 0 ;
+
+ switch (precision)
+ {
+ case GSL_IEEE_SINGLE_PRECISION:
+ GSL_ERROR ("IRIX only supports default precision rounding",
+ GSL_EUNSUP) ;
+ break ;
+ case GSL_IEEE_DOUBLE_PRECISION:
+ GSL_ERROR ("IRIX only supports default precision rounding",
+ GSL_EUNSUP) ;
+ break ;
+ case GSL_IEEE_EXTENDED_PRECISION:
+ GSL_ERROR ("IRIX only supports default precision rounding",
+ GSL_EUNSUP) ;
+ break ;
+ }
+
+ switch (rounding)
+ {
+ case GSL_IEEE_ROUND_TO_NEAREST:
+ rnd = FP_RN ;
+ fpsetround (rnd) ;
+ break ;
+ case GSL_IEEE_ROUND_DOWN:
+ rnd = FP_RM ;
+ fpsetround (rnd) ;
+ break ;
+ case GSL_IEEE_ROUND_UP:
+ rnd = FP_RP ;
+ fpsetround (rnd) ;
+ break ;
+ case GSL_IEEE_ROUND_TO_ZERO:
+ rnd = FP_RZ ;
+ fpsetround (rnd) ;
+ break ;
+ default:
+ rnd = FP_RN ;
+ fpsetround (rnd) ;
+ }
+
+ /* Turn on all the exceptions apart from 'inexact' */
+
+ mode = FP_X_INV | FP_X_DZ | FP_X_OFL | FP_X_UFL ;
+
+ if (exception_mask & GSL_IEEE_MASK_INVALID)
+ mode &= ~ FP_X_INV ;
+
+ if (exception_mask & GSL_IEEE_MASK_DENORMALIZED)
+ {
+ /* do nothing */
+ }
+ else
+ {
+ GSL_ERROR ("IRIX does not support the denormalized operand exception. "
+ "Use 'mask-denormalized' to work around this.",
+ GSL_EUNSUP) ;
+ }
+
+ if (exception_mask & GSL_IEEE_MASK_DIVISION_BY_ZERO)
+ mode &= ~ FP_X_DZ ;
+
+ if (exception_mask & GSL_IEEE_MASK_OVERFLOW)
+ mode &= ~ FP_X_OFL ;
+
+ if (exception_mask & GSL_IEEE_MASK_UNDERFLOW)
+ mode &= ~ FP_X_UFL ;
+
+ if (exception_mask & GSL_IEEE_TRAP_INEXACT)
+ {
+ mode |= FP_X_IMP ;
+ }
+ else
+ {
+ mode &= ~ FP_X_IMP ;
+ }
+
+ fpsetmask (mode) ;
+
+ return GSL_SUCCESS ;
+
+}
diff --git a/gsl-1.9/ieee-utils/fp-netbsd.c b/gsl-1.9/ieee-utils/fp-netbsd.c
new file mode 100644
index 0000000..6f8b138
--- /dev/null
+++ b/gsl-1.9/ieee-utils/fp-netbsd.c
@@ -0,0 +1,118 @@
+/* fp-netbsd.c
+ *
+ * Copyright (C) 2001 Jason Beegan
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <ieeefp.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_errno.h>
+
+int
+gsl_ieee_set_mode (int precision, int rounding, int exception_mask)
+{
+ fp_except mode = 0;
+ fp_rnd rnd = 0;
+
+ switch (precision)
+ {
+ case GSL_IEEE_SINGLE_PRECISION:
+ GSL_ERROR ("NetBSD only supports default precision rounding",
+ GSL_EUNSUP);
+ break;
+ case GSL_IEEE_DOUBLE_PRECISION:
+ GSL_ERROR ("NetBSD only supports default precision rounding",
+ GSL_EUNSUP);
+ break;
+ case GSL_IEEE_EXTENDED_PRECISION:
+ GSL_ERROR ("NetBSD only supports default precision rounding",
+ GSL_EUNSUP);
+ break;
+ }
+
+ switch (rounding)
+ {
+ case GSL_IEEE_ROUND_TO_NEAREST:
+ rnd = FP_RN;
+ fpsetround (rnd);
+ break;
+ case GSL_IEEE_ROUND_DOWN:
+ rnd = FP_RM;
+ fpsetround (rnd);
+ break;
+ case GSL_IEEE_ROUND_UP:
+ rnd = FP_RP;
+ fpsetround (rnd);
+ break;
+ case GSL_IEEE_ROUND_TO_ZERO:
+ rnd = FP_RZ;
+ fpsetround (rnd);
+ break;
+ default:
+ rnd = FP_RN;
+ fpsetround (rnd);
+ }
+
+/* Turn on all available exceptions apart from 'inexact'.
+ Denormalized operand exception not available on all platforms. */
+
+ mode = FP_X_INV | FP_X_DZ | FP_X_OFL | FP_X_UFL;
+#ifdef FP_X_DNML
+ mode = mode | FP_X_DNML;
+#endif
+
+ if (exception_mask & GSL_IEEE_MASK_INVALID)
+ mode &= ~ FP_X_INV;
+
+ if (exception_mask & GSL_IEEE_MASK_DENORMALIZED)
+ {
+#ifdef FP_X_DNML
+ mode &= ~ FP_X_DNML;
+#endif
+ }
+ else
+ {
+#ifndef FP_X_DNML
+ GSL_ERROR ("NetBSD does not support the denormalized operand exception on this platform. "
+ "Use 'mask-denormalized' to work around this.",
+ GSL_EUNSUP);
+#endif
+ }
+
+ if (exception_mask & GSL_IEEE_MASK_DIVISION_BY_ZERO)
+ mode &= ~ FP_X_DZ;
+
+ if (exception_mask & GSL_IEEE_MASK_OVERFLOW)
+ mode &= ~ FP_X_OFL;
+
+ if (exception_mask & GSL_IEEE_MASK_UNDERFLOW)
+ mode &= ~ FP_X_UFL;
+
+ if (exception_mask & GSL_IEEE_TRAP_INEXACT)
+ {
+ mode |= FP_X_IMP;
+ }
+ else
+ {
+ mode &= ~ FP_X_IMP;
+ }
+
+ fpsetmask (mode);
+
+ return GSL_SUCCESS;
+
+}
+
diff --git a/gsl-1.9/ieee-utils/fp-openbsd.c b/gsl-1.9/ieee-utils/fp-openbsd.c
new file mode 100644
index 0000000..4aacd5e
--- /dev/null
+++ b/gsl-1.9/ieee-utils/fp-openbsd.c
@@ -0,0 +1,121 @@
+/* fp-openbsd.c
+ *
+ * Copyright (C) 2001 Jason Beegan
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <ieeefp.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_errno.h>
+
+/* This is a copy of fp-netbsd.c, modified for openbsd by Toby White
+ --- Brian Gough */
+
+int
+gsl_ieee_set_mode (int precision, int rounding, int exception_mask)
+{
+ fp_except mode = 0;
+ fp_rnd rnd = 0;
+
+ switch (precision)
+ {
+ case GSL_IEEE_SINGLE_PRECISION:
+ GSL_ERROR ("OpenBSD only supports default precision rounding",
+ GSL_EUNSUP);
+ break;
+ case GSL_IEEE_DOUBLE_PRECISION:
+ GSL_ERROR ("OpenBSD only supports default precision rounding",
+ GSL_EUNSUP);
+ break;
+ case GSL_IEEE_EXTENDED_PRECISION:
+ GSL_ERROR ("OpenBSD only supports default precision rounding",
+ GSL_EUNSUP);
+ break;
+ }
+
+ switch (rounding)
+ {
+ case GSL_IEEE_ROUND_TO_NEAREST:
+ rnd = FP_RN;
+ fpsetround (rnd);
+ break;
+ case GSL_IEEE_ROUND_DOWN:
+ rnd = FP_RM;
+ fpsetround (rnd);
+ break;
+ case GSL_IEEE_ROUND_UP:
+ rnd = FP_RP;
+ fpsetround (rnd);
+ break;
+ case GSL_IEEE_ROUND_TO_ZERO:
+ rnd = FP_RZ;
+ fpsetround (rnd);
+ break;
+ default:
+ rnd = FP_RN;
+ fpsetround (rnd);
+ }
+
+/* Turn on all available exceptions apart from 'inexact'.
+ Denormalized operand exception not available on all platforms. */
+
+ mode = FP_X_INV | FP_X_DZ | FP_X_OFL | FP_X_UFL;
+#ifdef FP_X_DNML
+ mode = mode | FP_X_DNML;
+#endif
+
+ if (exception_mask & GSL_IEEE_MASK_INVALID)
+ mode &= ~ FP_X_INV;
+
+ if (exception_mask & GSL_IEEE_MASK_DENORMALIZED)
+ {
+#ifdef FP_X_DNML
+ mode &= ~ FP_X_DNML;
+#endif
+ }
+ else
+ {
+#ifndef FP_X_DNML
+ GSL_ERROR ("OpenBSD does not support the denormalized operand exception on this platform. "
+ "Use 'mask-denormalized' to work around this.",
+ GSL_EUNSUP);
+#endif
+ }
+
+ if (exception_mask & GSL_IEEE_MASK_DIVISION_BY_ZERO)
+ mode &= ~ FP_X_DZ;
+
+ if (exception_mask & GSL_IEEE_MASK_OVERFLOW)
+ mode &= ~ FP_X_OFL;
+
+ if (exception_mask & GSL_IEEE_MASK_UNDERFLOW)
+ mode &= ~ FP_X_UFL;
+
+ if (exception_mask & GSL_IEEE_TRAP_INEXACT)
+ {
+ mode |= FP_X_IMP;
+ }
+ else
+ {
+ mode &= ~ FP_X_IMP;
+ }
+
+ fpsetmask (mode);
+
+ return GSL_SUCCESS;
+
+}
+
diff --git a/gsl-1.9/ieee-utils/fp-os2emx.c b/gsl-1.9/ieee-utils/fp-os2emx.c
new file mode 100644
index 0000000..c0ce735
--- /dev/null
+++ b/gsl-1.9/ieee-utils/fp-os2emx.c
@@ -0,0 +1,91 @@
+/* ieee-utils/fp-os2.c
+ *
+ * Copyright (C) 2001 Henry Sobotka <sobotka@axess.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <float.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_errno.h>
+
+int
+gsl_ieee_set_mode (int precision, int rounding, int exception_mask)
+{
+ unsigned mode = 0;
+
+ switch (precision)
+ {
+ case GSL_IEEE_SINGLE_PRECISION:
+ _control87(PC_24, MCW_PC);
+ break ;
+ case GSL_IEEE_DOUBLE_PRECISION:
+ _control87(PC_53, MCW_PC);
+ break ;
+ case GSL_IEEE_EXTENDED_PRECISION:
+ _control87(PC_64, MCW_PC);
+ break ;
+ }
+
+ switch (rounding)
+ {
+ case GSL_IEEE_ROUND_TO_NEAREST:
+ _control87(RC_NEAR, MCW_RC);
+ break ;
+ case GSL_IEEE_ROUND_DOWN:
+ _control87(RC_DOWN, MCW_RC);
+ break ;
+ case GSL_IEEE_ROUND_UP:
+ _control87(RC_UP, MCW_RC);
+ break ;
+ case GSL_IEEE_ROUND_TO_ZERO:
+ _control87(RC_CHOP, MCW_RC);
+ break ;
+ default:
+ _control87(RC_NEAR, MCW_RC);
+ }
+
+ /* Turn on all the exceptions apart from 'inexact' */
+
+ mode = EM_INVALID | EM_DENORMAL | EM_ZERODIVIDE | EM_OVERFLOW | EM_UNDERFLOW;
+
+ if (exception_mask & GSL_IEEE_MASK_INVALID)
+ mode &= ~ EM_INVALID;
+
+ if (exception_mask & GSL_IEEE_MASK_DENORMALIZED)
+ mode &= ~ EM_DENORMAL;
+
+ if (exception_mask & GSL_IEEE_MASK_DIVISION_BY_ZERO)
+ mode &= ~ EM_ZERODIVIDE;
+
+ if (exception_mask & GSL_IEEE_MASK_OVERFLOW)
+ mode &= ~ EM_OVERFLOW;
+
+ if (exception_mask & GSL_IEEE_MASK_UNDERFLOW)
+ mode &= ~ EM_UNDERFLOW;
+
+ if (exception_mask & GSL_IEEE_TRAP_INEXACT)
+ {
+ mode |= EM_INEXACT;
+ }
+ else
+ {
+ mode &= ~ EM_INEXACT;
+ }
+
+ _control87(mode, MCW_EM);
+
+ return GSL_SUCCESS ;
+}
diff --git a/gsl-1.9/ieee-utils/fp-solaris.c b/gsl-1.9/ieee-utils/fp-solaris.c
new file mode 100644
index 0000000..b9f93db
--- /dev/null
+++ b/gsl-1.9/ieee-utils/fp-solaris.c
@@ -0,0 +1,110 @@
+/* ieee-utils/fp-solaris.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <math.h>
+#include <ieeefp.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_errno.h>
+
+int
+gsl_ieee_set_mode (int precision, int rounding, int exception_mask)
+{
+ fp_except mode = 0 ;
+ fp_rnd rnd = 0 ;
+
+ switch (precision)
+ {
+ case GSL_IEEE_SINGLE_PRECISION:
+ GSL_ERROR ("solaris only supports default precision rounding",
+ GSL_EUNSUP) ;
+ break ;
+ case GSL_IEEE_DOUBLE_PRECISION:
+ GSL_ERROR ("solaris only supports default precision rounding",
+ GSL_EUNSUP) ;
+ break ;
+ case GSL_IEEE_EXTENDED_PRECISION:
+ GSL_ERROR ("solaris only supports default precision rounding",
+ GSL_EUNSUP) ;
+ break ;
+ }
+
+ switch (rounding)
+ {
+ case GSL_IEEE_ROUND_TO_NEAREST:
+ rnd = FP_RN ;
+ fpsetround (rnd) ;
+ break ;
+ case GSL_IEEE_ROUND_DOWN:
+ rnd = FP_RM ;
+ fpsetround (rnd) ;
+ break ;
+ case GSL_IEEE_ROUND_UP:
+ rnd = FP_RP ;
+ fpsetround (rnd) ;
+ break ;
+ case GSL_IEEE_ROUND_TO_ZERO:
+ rnd = FP_RZ ;
+ fpsetround (rnd) ;
+ break ;
+ default:
+ rnd = FP_RN ;
+ fpsetround (rnd) ;
+ }
+
+ /* Turn on all the exceptions apart from 'inexact' */
+
+ mode = FP_X_INV | FP_X_DZ | FP_X_OFL | FP_X_UFL ;
+
+ if (exception_mask & GSL_IEEE_MASK_INVALID)
+ mode &= ~ FP_X_INV ;
+
+ if (exception_mask & GSL_IEEE_MASK_DENORMALIZED)
+ {
+ /* do nothing */
+ }
+ else
+ {
+ GSL_ERROR ("solaris does not support the denormalized operand exception. "
+ "Use 'mask-denormalized' to work around this.",
+ GSL_EUNSUP) ;
+ }
+
+ if (exception_mask & GSL_IEEE_MASK_DIVISION_BY_ZERO)
+ mode &= ~ FP_X_DZ ;
+
+ if (exception_mask & GSL_IEEE_MASK_OVERFLOW)
+ mode &= ~ FP_X_OFL ;
+
+ if (exception_mask & GSL_IEEE_MASK_UNDERFLOW)
+ mode &= ~ FP_X_UFL ;
+
+ if (exception_mask & GSL_IEEE_TRAP_INEXACT)
+ {
+ mode |= FP_X_IMP ;
+ }
+ else
+ {
+ mode &= ~ FP_X_IMP ;
+ }
+
+ fpsetmask (mode) ;
+
+ return GSL_SUCCESS ;
+
+}
diff --git a/gsl-1.9/ieee-utils/fp-sunos4.c b/gsl-1.9/ieee-utils/fp-sunos4.c
new file mode 100644
index 0000000..307b538
--- /dev/null
+++ b/gsl-1.9/ieee-utils/fp-sunos4.c
@@ -0,0 +1,122 @@
+/* ieee-utils/fp-sunos4.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <sys/ieeefp.h>
+#include <floatingpoint.h>
+#include <signal.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_errno.h>
+
+int
+gsl_ieee_set_mode (int precision, int rounding, int exception_mask)
+{
+ char * out ;
+
+ switch (precision)
+ {
+ case GSL_IEEE_SINGLE_PRECISION:
+ ieee_flags ("set", "precision", "single", out) ;
+ break ;
+ case GSL_IEEE_DOUBLE_PRECISION:
+ ieee_flags ("set", "precision", "double", out) ;
+ break ;
+ case GSL_IEEE_EXTENDED_PRECISION:
+ ieee_flags ("set", "precision", "extended", out) ;
+ break ;
+ default:
+ ieee_flags ("set", "precision", "extended", out) ;
+ }
+
+ switch (rounding)
+ {
+ case GSL_IEEE_ROUND_TO_NEAREST:
+ ieee_flags ("set", "direction", "nearest", out) ;
+ break ;
+ case GSL_IEEE_ROUND_DOWN:
+ ieee_flags ("set", "direction", "negative", out) ;
+ break ;
+ case GSL_IEEE_ROUND_UP:
+ ieee_flags ("set", "direction", "positive", out) ;
+ break ;
+ case GSL_IEEE_ROUND_TO_ZERO:
+ ieee_flags ("set", "direction", "tozero", out) ;
+ break ;
+ default:
+ ieee_flags ("set", "direction", "nearest", out) ;
+ }
+
+ if (exception_mask & GSL_IEEE_MASK_INVALID)
+ {
+ ieee_handler ("set", "invalid", SIGFPE_IGNORE) ;
+ }
+ else
+ {
+ ieee_handler ("set", "invalid", SIGFPE_ABORT) ;
+ }
+
+ if (exception_mask & GSL_IEEE_MASK_DENORMALIZED)
+ {
+ ieee_handler ("set", "denormalized", SIGFPE_IGNORE) ;
+ }
+ else
+ {
+ GSL_ERROR ("sunos4 does not support the denormalized operand exception. "
+ "Use 'mask-denormalized' to work around this.",
+ GSL_EUNSUP) ;
+ }
+
+
+ if (exception_mask & GSL_IEEE_MASK_DIVISION_BY_ZERO)
+ {
+ ieee_handler ("set", "division", SIGFPE_IGNORE) ;
+ }
+ else
+ {
+ ieee_handler ("set", "division", SIGFPE_ABORT) ;
+ }
+
+ if (exception_mask & GSL_IEEE_MASK_OVERFLOW)
+ {
+ ieee_handler ("set", "overflow", SIGFPE_IGNORE) ;
+ }
+ else
+ {
+ ieee_handler ("set", "overflow", SIGFPE_ABORT) ;
+ }
+
+ if (exception_mask & GSL_IEEE_MASK_UNDERFLOW)
+ {
+ ieee_handler ("set", "underflow", SIGFPE_IGNORE) ;
+ }
+ else
+ {
+ ieee_handler ("set", "underflow", SIGFPE_ABORT) ;
+ }
+
+ if (exception_mask & GSL_IEEE_TRAP_INEXACT)
+ {
+ ieee_handler ("set", "inexact", SIGFPE_ABORT) ;
+ }
+ else
+ {
+ ieee_handler ("set", "inexact", SIGFPE_IGNORE) ;
+ }
+
+ return GSL_SUCCESS ;
+}
diff --git a/gsl-1.9/ieee-utils/fp-tru64.c b/gsl-1.9/ieee-utils/fp-tru64.c
new file mode 100644
index 0000000..1051f1f
--- /dev/null
+++ b/gsl-1.9/ieee-utils/fp-tru64.c
@@ -0,0 +1,176 @@
+/* ieee-utils/fp-tru64.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Tim Mooney
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+
+/*
+ * Under Compaq's Unix with the silly name, read the man pages for read_rnd,
+ * write_rnd, and ieee(3) for more information on the functions used here.
+ *
+ * Note that enabling control of dynamic rounding mode (via write_rnd) requires
+ * that you pass a special flag to your C compiler. For Compaq's C compiler
+ * the flag is `-fprm d', for gcc it's `-mfp-rounding-mode=d'.
+ *
+ * Enabling the trap control (via ieee_set_fp_control) also requires a
+ * flag be passed to the C compiler. The flag for Compaq's C compiler
+ * is `-ieee' and for gcc it's `-mieee'.
+
+ * We have not implemented the `inexact' case, since it is rarely used
+ * and requires the library being built with an additional compiler
+ * flag that can degrade performance for everything else. If you need
+ * to add support for `inexact' the relevant flag for Compaq's
+ * compiler is `-ieee_with_inexact', and the flag for gcc is
+ * `-mieee-with-inexact'.
+ *
+ * Problem have been reported with the "fixed" float.h installed with
+ * gcc-2.95 lacking some of the definitions in the system float.h (the
+ * symptoms are errors like: `FP_RND_RN' undeclared). To work around
+ * this we can include the system float.h before the gcc version, e.g.
+ *
+ * #include "/usr/include/float.h"
+ * #include <float.h>
+ */
+
+#include <float.h>
+
+#ifndef FP_RND_RN
+# undef _FLOAT_H_
+# include "/usr/include/float.h"
+# undef _FLOAT_H_
+# include <float.h>
+#endif
+
+#include <machine/fpu.h>
+#include <stdio.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_errno.h>
+
+int
+gsl_ieee_set_mode (int precision, int rounding, int exception_mask)
+{
+ unsigned long int mode = 0 ;
+ unsigned int rnd = 0 ;
+
+/* I'm actually not completely sure that the alpha only supports default
+ * precisions rounding, but I couldn't find any information regarding this, so
+ * it seems safe to assume this for now until it's proven otherwise.
+ */
+
+ switch (precision)
+ {
+ case GSL_IEEE_SINGLE_PRECISION:
+ GSL_ERROR ("Tru64 Unix on the alpha only supports default precision rounding",
+ GSL_EUNSUP) ;
+ break ;
+ case GSL_IEEE_DOUBLE_PRECISION:
+ GSL_ERROR ("Tru64 Unix on the alpha only supports default precision rounding",
+ GSL_EUNSUP) ;
+ break ;
+ case GSL_IEEE_EXTENDED_PRECISION:
+ GSL_ERROR ("Tru64 Unix on the alpha only supports default precision rounding",
+ GSL_EUNSUP) ;
+ break ;
+ }
+
+
+ switch (rounding)
+ {
+ case GSL_IEEE_ROUND_TO_NEAREST:
+ rnd = FP_RND_RN ;
+ write_rnd (rnd) ;
+ break ;
+ case GSL_IEEE_ROUND_DOWN:
+ rnd = FP_RND_RM ;
+ write_rnd (rnd) ;
+ break ;
+ case GSL_IEEE_ROUND_UP:
+ rnd = FP_RND_RP ;
+ write_rnd (rnd) ;
+ break ;
+ case GSL_IEEE_ROUND_TO_ZERO:
+ rnd = FP_RND_RZ ;
+ write_rnd (rnd) ;
+ break ;
+ default:
+ rnd = FP_RND_RN ;
+ write_rnd (rnd) ;
+ }
+
+ /* Turn on all the exceptions apart from 'inexact' */
+
+ /* from the ieee(3) man page:
+ * IEEE_TRAP_ENABLE_INV -> Invalid operation
+ * IEEE_TRAP_ENABLE_DZE -> Divide by 0
+ * IEEE_TRAP_ENABLE_OVF -> Overflow
+ * IEEE_TRAP_ENABLE_UNF -> Underflow
+ * IEEE_TRAP_ENABLE_INE -> Inexact (requires special option to C compiler)
+ * IEEE_TRAP_ENABLE_DNO -> denormal operand
+ * Note: IEEE_TRAP_ENABLE_DNO is not supported on OSF 3.x or Digital Unix
+ * 4.0 - 4.0d(?).
+ * IEEE_TRAP_ENABLE_MASK -> mask of all the trap enables
+ * IEEE_MAP_DMZ -> map denormal inputs to zero
+ * IEEE_MAP_UMZ -> map underflow results to zero
+ */
+
+ mode = IEEE_TRAP_ENABLE_INV | IEEE_TRAP_ENABLE_DZE | IEEE_TRAP_ENABLE_OVF
+ | IEEE_TRAP_ENABLE_UNF ;
+
+ if (exception_mask & GSL_IEEE_MASK_INVALID)
+ mode &= ~ IEEE_TRAP_ENABLE_INV ;
+
+ if (exception_mask & GSL_IEEE_MASK_DENORMALIZED)
+ {
+#ifdef IEEE_TRAP_ENABLE_DNO
+ mode &= ~ IEEE_TRAP_ENABLE_DNO ;
+#else
+ GSL_ERROR ("Sorry, this version of Digital Unix does not support denormalized operands", GSL_EUNSUP) ;
+#endif
+ }
+
+ if (exception_mask & GSL_IEEE_MASK_DIVISION_BY_ZERO)
+ mode &= ~ IEEE_TRAP_ENABLE_DZE ;
+
+ if (exception_mask & GSL_IEEE_MASK_OVERFLOW)
+ mode &= ~ IEEE_TRAP_ENABLE_OVF ;
+
+ if (exception_mask & GSL_IEEE_MASK_UNDERFLOW)
+ mode &= ~ IEEE_TRAP_ENABLE_UNF ;
+
+ if (exception_mask & GSL_IEEE_TRAP_INEXACT)
+ {
+ /* To implement this would require a special flag to the C
+ compiler which can cause degraded performance */
+
+ GSL_ERROR ("Sorry, GSL does not implement trap-inexact for Tru64 Unix on the alpha - see fp-tru64.c for details", GSL_EUNSUP) ;
+
+ /* In case you need to add it, the appropriate line would be
+ *
+ * mode |= IEEE_TRAP_ENABLE_INE ;
+ *
+ */
+
+ }
+ else
+ {
+ mode &= ~ IEEE_TRAP_ENABLE_INE ;
+ }
+
+ ieee_set_fp_control (mode) ;
+
+ return GSL_SUCCESS ;
+}
diff --git a/gsl-1.9/ieee-utils/fp-unknown.c b/gsl-1.9/ieee-utils/fp-unknown.c
new file mode 100644
index 0000000..4161bbc
--- /dev/null
+++ b/gsl-1.9/ieee-utils/fp-unknown.c
@@ -0,0 +1,30 @@
+/* ieee-utils/fp-unknown.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_errno.h>
+
+int
+gsl_ieee_set_mode (int precision, int rounding, int exception_mask)
+{
+ GSL_ERROR (
+"the IEEE interface for this platform is unsupported or could not be "
+"determined at configure time\n", GSL_EUNSUP) ;
+}
diff --git a/gsl-1.9/ieee-utils/fp.c b/gsl-1.9/ieee-utils/fp.c
new file mode 100644
index 0000000..5c282f3
--- /dev/null
+++ b/gsl-1.9/ieee-utils/fp.c
@@ -0,0 +1,41 @@
+#include <config.h>
+
+#if HAVE_GNUSPARC_IEEE_INTERFACE
+#include "fp-gnusparc.c"
+#elif HAVE_GNUM68K_IEEE_INTERFACE
+#include "fp-gnum68k.c"
+#elif HAVE_GNUPPC_IEEE_INTERFACE
+#include "fp-gnuppc.c"
+#elif HAVE_GNUX86_IEEE_INTERFACE
+#include "fp-gnux86.c"
+#elif HAVE_HPUX11_IEEE_INTERFACE
+#include "fp-hpux11.c"
+#elif HAVE_HPUX_IEEE_INTERFACE
+#include "fp-hpux.c"
+#elif HAVE_SUNOS4_IEEE_INTERFACE
+#include "fp-sunos4.c"
+#elif HAVE_SOLARIS_IEEE_INTERFACE
+#include "fp-solaris.c"
+#elif HAVE_IRIX_IEEE_INTERFACE
+#include "fp-irix.c"
+#elif HAVE_AIX_IEEE_INTERFACE
+#include "fp-aix.c"
+#elif HAVE_TRU64_IEEE_INTERFACE
+#include "fp-tru64.c"
+#elif HAVE_FREEBSD_IEEE_INTERFACE
+#include "fp-freebsd.c"
+#elif HAVE_OS2EMX_IEEE_INTERFACE
+#include "fp-os2emx.c"
+#elif HAVE_NETBSD_IEEE_INTERFACE
+#include "fp-netbsd.c"
+#elif HAVE_OPENBSD_IEEE_INTERFACE
+#include "fp-openbsd.c"
+#elif HAVE_DARWIN_IEEE_INTERFACE
+#include "fp-darwin.c"
+#elif HAVE_DARWIN86_IEEE_INTERFACE
+#include "fp-darwin86.c"
+#elif HAVE_DECL_FEENABLEEXCEPT || HAVE_DECL_FESETTRAPENABLE
+#include "fp-gnuc99.c"
+#else
+#include "fp-unknown.c"
+#endif
diff --git a/gsl-1.9/ieee-utils/gsl_ieee_utils.h b/gsl-1.9/ieee-utils/gsl_ieee_utils.h
new file mode 100644
index 0000000..2838735
--- /dev/null
+++ b/gsl-1.9/ieee-utils/gsl_ieee_utils.h
@@ -0,0 +1,99 @@
+/* ieee-utils/gsl_ieee_utils.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_IEEE_UTILS_H__
+#define __GSL_IEEE_UTILS_H__
+#include <stdio.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+enum {
+ GSL_IEEE_TYPE_NAN = 1,
+ GSL_IEEE_TYPE_INF = 2,
+ GSL_IEEE_TYPE_NORMAL = 3,
+ GSL_IEEE_TYPE_DENORMAL = 4,
+ GSL_IEEE_TYPE_ZERO = 5
+} ;
+
+typedef struct {
+ int sign ;
+ char mantissa[24] ; /* Actual bits are 0..22, element 23 is \0 */
+ int exponent ;
+ int type ;
+} gsl_ieee_float_rep ;
+
+typedef struct {
+ int sign ;
+ char mantissa[53] ; /* Actual bits are 0..51, element 52 is \0 */
+ int exponent ;
+ int type ;
+} gsl_ieee_double_rep ;
+
+
+void gsl_ieee_printf_float (const float * x) ;
+void gsl_ieee_printf_double (const double * x) ;
+
+void gsl_ieee_fprintf_float (FILE * stream, const float * x) ;
+void gsl_ieee_fprintf_double (FILE * stream, const double * x) ;
+
+void gsl_ieee_float_to_rep (const float * x, gsl_ieee_float_rep * r) ;
+void gsl_ieee_double_to_rep (const double * x, gsl_ieee_double_rep * r) ;
+
+enum {
+ GSL_IEEE_SINGLE_PRECISION = 1,
+ GSL_IEEE_DOUBLE_PRECISION = 2,
+ GSL_IEEE_EXTENDED_PRECISION = 3
+} ;
+
+enum {
+ GSL_IEEE_ROUND_TO_NEAREST = 1,
+ GSL_IEEE_ROUND_DOWN = 2,
+ GSL_IEEE_ROUND_UP = 3,
+ GSL_IEEE_ROUND_TO_ZERO = 4
+} ;
+
+enum {
+ GSL_IEEE_MASK_INVALID = 1,
+ GSL_IEEE_MASK_DENORMALIZED = 2,
+ GSL_IEEE_MASK_DIVISION_BY_ZERO = 4,
+ GSL_IEEE_MASK_OVERFLOW = 8,
+ GSL_IEEE_MASK_UNDERFLOW = 16,
+ GSL_IEEE_MASK_ALL = 31,
+ GSL_IEEE_TRAP_INEXACT = 32
+} ;
+
+void gsl_ieee_env_setup (void) ;
+int gsl_ieee_read_mode_string (const char * description, int * precision,
+ int * rounding, int * exception_mask) ;
+int gsl_ieee_set_mode (int precision, int rounding, int exception_mask) ;
+
+__END_DECLS
+
+#endif /* __GSL_IEEE_UTILS_H__ */
+
diff --git a/gsl-1.9/ieee-utils/make_rep.c b/gsl-1.9/ieee-utils/make_rep.c
new file mode 100644
index 0000000..59bf861
--- /dev/null
+++ b/gsl-1.9/ieee-utils/make_rep.c
@@ -0,0 +1,197 @@
+/* ieee-utils/make_rep.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_ieee_utils.h>
+
+#include "endian.c"
+#include "standardize.c"
+
+static void sprint_nybble(int i, char *s) ;
+static void sprint_byte(int i, char *s) ;
+static int determine_ieee_type (int non_zero, int exponent, int max_exponent);
+
+
+/* For the IEEE float format the bits are found from the following
+ masks,
+
+ sign = 0x80000000
+ exponent = 0x7f800000
+ mantisssa = 0x007fffff
+
+ For the IEEE double format the masks are,
+
+ sign = 0x8000000000000000
+ exponent = 0x7ff0000000000000
+ mantissa = 0x000fffffffffffff
+
+ */
+
+void
+gsl_ieee_float_to_rep (const float * x, gsl_ieee_float_rep * r)
+{
+ int e, non_zero;
+
+ union {
+ float f;
+ struct {
+ unsigned char byte[4] ;
+ } ieee ;
+ } u;
+
+ u.f = *x ;
+
+ if (little_endian_p())
+ make_float_bigendian(&(u.f)) ;
+
+ /* note that r->sign is signed, u.ieee.byte is unsigned */
+
+ if (u.ieee.byte[3]>>7)
+ {
+ r->sign = 1 ;
+ }
+ else
+ {
+ r->sign = 0 ;
+ }
+
+ e = (u.ieee.byte[3] & 0x7f) << 1 | (u.ieee.byte[2] & 0x80)>>7 ;
+
+ r->exponent = e - 127 ;
+
+ sprint_byte((u.ieee.byte[2] & 0x7f) << 1,r->mantissa) ;
+ sprint_byte(u.ieee.byte[1],r->mantissa + 7) ;
+ sprint_byte(u.ieee.byte[0],r->mantissa + 15) ;
+
+ r->mantissa[23] = '\0' ;
+
+ non_zero = u.ieee.byte[0] || u.ieee.byte[1] || (u.ieee.byte[2] & 0x7f);
+
+ r->type = determine_ieee_type (non_zero, e, 255) ;
+}
+
+void
+gsl_ieee_double_to_rep (const double * x, gsl_ieee_double_rep * r)
+{
+
+ int e, non_zero;
+
+ union
+ {
+ double d;
+ struct {
+ unsigned char byte[8];
+ } ieee ;
+ } u;
+
+ u.d= *x ;
+
+ if (little_endian_p())
+ make_double_bigendian(&(u.d)) ;
+
+ /* note that r->sign is signed, u.ieee.byte is unsigned */
+
+ if (u.ieee.byte[7]>>7)
+ {
+ r->sign = 1 ;
+ }
+ else
+ {
+ r->sign = 0 ;
+ }
+
+
+ e =(u.ieee.byte[7] & 0x7f)<<4 ^ (u.ieee.byte[6] & 0xf0)>>4 ;
+
+ r->exponent = e - 1023 ;
+
+ sprint_nybble(u.ieee.byte[6],r->mantissa) ;
+ sprint_byte(u.ieee.byte[5],r->mantissa + 4) ;
+ sprint_byte(u.ieee.byte[4],r->mantissa + 12) ;
+ sprint_byte(u.ieee.byte[3],r->mantissa + 20) ;
+ sprint_byte(u.ieee.byte[2],r->mantissa + 28) ;
+ sprint_byte(u.ieee.byte[1],r->mantissa + 36) ;
+ sprint_byte(u.ieee.byte[0],r->mantissa + 44) ;
+
+ r->mantissa[52] = '\0' ;
+
+ non_zero = (u.ieee.byte[0] || u.ieee.byte[1] || u.ieee.byte[2]
+ || u.ieee.byte[3] || u.ieee.byte[4] || u.ieee.byte[5]
+ || (u.ieee.byte[6] & 0x0f)) ;
+
+ r->type = determine_ieee_type (non_zero, e, 2047) ;
+}
+
+/* A table of character representations of nybbles */
+
+static char nybble[16][5]={ /* include space for the \0 */
+ "0000", "0001", "0010", "0011",
+ "0100", "0101", "0110", "0111",
+ "1000", "1001", "1010", "1011",
+ "1100", "1101", "1110", "1111"
+} ;
+
+static void
+sprint_nybble(int i, char *s)
+{
+ char *c ;
+ c=nybble[i & 0x0f ];
+ *s=c[0] ; *(s+1)=c[1] ; *(s+2)=c[2] ; *(s+3)=c[3] ;
+}
+
+static void
+sprint_byte(int i, char *s)
+{
+ char *c ;
+ c=nybble[(i & 0xf0)>>4];
+ *s=c[0] ; *(s+1)=c[1] ; *(s+2)=c[2] ; *(s+3)=c[3] ;
+ c=nybble[i & 0x0f];
+ *(s+4)=c[0] ; *(s+5)=c[1] ; *(s+6)=c[2] ; *(s+7)=c[3] ;
+}
+
+static int
+determine_ieee_type (int non_zero, int exponent, int max_exponent)
+{
+ if (exponent == max_exponent)
+ {
+ if (non_zero)
+ {
+ return GSL_IEEE_TYPE_NAN ;
+ }
+ else
+ {
+ return GSL_IEEE_TYPE_INF ;
+ }
+ }
+ else if (exponent == 0)
+ {
+ if (non_zero)
+ {
+ return GSL_IEEE_TYPE_DENORMAL ;
+ }
+ else
+ {
+ return GSL_IEEE_TYPE_ZERO ;
+ }
+ }
+ else
+ {
+ return GSL_IEEE_TYPE_NORMAL ;
+ }
+}
diff --git a/gsl-1.9/ieee-utils/print.c b/gsl-1.9/ieee-utils/print.c
new file mode 100644
index 0000000..736b455
--- /dev/null
+++ b/gsl-1.9/ieee-utils/print.c
@@ -0,0 +1,99 @@
+/* ieee-utils/print.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <math.h>
+#include <gsl/gsl_ieee_utils.h>
+
+/* A table of sign characters, 0=positive, 1=negative. We print a space
+ instead of a unary + sign for compatibility with bc */
+
+static char signs[2]={' ','-'} ;
+
+void
+gsl_ieee_fprintf_float (FILE * stream, const float * x) {
+ gsl_ieee_float_rep r ;
+ gsl_ieee_float_to_rep(x, &r) ;
+
+ switch (r.type)
+ {
+ case GSL_IEEE_TYPE_NAN:
+ fprintf(stream, "NaN") ;
+ break ;
+ case GSL_IEEE_TYPE_INF:
+ fprintf(stream, "%cInf", signs[r.sign]) ;
+ break ;
+ case GSL_IEEE_TYPE_NORMAL:
+ fprintf(stream, "%c1.%s*2^%d", signs[r.sign], r.mantissa, r.exponent) ;
+ break ;
+ case GSL_IEEE_TYPE_DENORMAL:
+ fprintf(stream, "%c0.%s*2^%d", signs[r.sign], r.mantissa, r.exponent + 1) ;
+ break ;
+ case GSL_IEEE_TYPE_ZERO:
+ fprintf(stream, "%c0", signs[r.sign]) ;
+ break ;
+ default:
+ fprintf(stream, "[non-standard IEEE float]") ;
+ }
+}
+
+void
+gsl_ieee_printf_float (const float * x)
+{
+ gsl_ieee_fprintf_float (stdout,x);
+}
+
+void
+gsl_ieee_fprintf_double (FILE * stream, const double * x) {
+ gsl_ieee_double_rep r ;
+ gsl_ieee_double_to_rep (x, &r) ;
+
+ switch (r.type)
+ {
+ case GSL_IEEE_TYPE_NAN:
+ fprintf(stream, "NaN") ;
+ break ;
+ case GSL_IEEE_TYPE_INF:
+ fprintf(stream, "%cInf", signs[r.sign]) ;
+ break ;
+ case GSL_IEEE_TYPE_NORMAL:
+ fprintf(stream, "%c1.%s*2^%d", signs[r.sign], r.mantissa, r.exponent) ;
+ break ;
+ case GSL_IEEE_TYPE_DENORMAL:
+ fprintf(stream, "%c0.%s*2^%d", signs[r.sign], r.mantissa, r.exponent + 1) ;
+ break ;
+ case GSL_IEEE_TYPE_ZERO:
+ fprintf(stream, "%c0", signs[r.sign]) ;
+ break ;
+ default:
+ fprintf(stream, "[non-standard IEEE double]") ;
+ }
+}
+
+void
+gsl_ieee_printf_double (const double * x)
+{
+ gsl_ieee_fprintf_double (stdout,x);
+}
+
+
+
+
+
diff --git a/gsl-1.9/ieee-utils/read.c b/gsl-1.9/ieee-utils/read.c
new file mode 100644
index 0000000..37227d5
--- /dev/null
+++ b/gsl-1.9/ieee-utils/read.c
@@ -0,0 +1,194 @@
+/* ieee-utils/read.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_ieee_utils.h>
+
+static int
+lookup_string (const char * p, int * precision, int * rounding,
+ int * exception_mask) ;
+
+int
+gsl_ieee_read_mode_string (const char * description,
+ int * precision,
+ int * rounding,
+ int * exception_mask)
+{
+ char * start ;
+ char * end;
+ char * p;
+
+ int precision_count = 0 ;
+ int rounding_count = 0 ;
+ int exception_count = 0 ;
+
+ start = (char *) malloc(strlen(description) + 1) ;
+
+ if (start == 0)
+ {
+ GSL_ERROR ("no memory to parse mode string", GSL_ENOMEM) ;
+ }
+
+ strcpy (start, description) ;
+
+ p = start ;
+
+ *precision = 0 ;
+ *rounding = 0 ;
+ *exception_mask = 0 ;
+
+ do {
+ int status ;
+ int new_precision, new_rounding, new_exception ;
+
+ end = strchr (p,',') ;
+
+ if (end)
+ {
+ *end = '\0' ;
+ do
+ {
+ end++ ; /* skip over trailing whitespace */
+ }
+ while (*end == ' ' || *end == ',') ;
+ }
+
+ new_precision = 0 ;
+ new_rounding = 0 ;
+ new_exception = 0 ;
+
+ status = lookup_string (p, &new_precision, &new_rounding, &new_exception) ;
+
+ if (status)
+ GSL_ERROR ("unrecognized GSL_IEEE_MODE string.\nValid settings are:\n\n"
+ " single-precision double-precision extended-precision\n"
+ " round-to-nearest round-down round-up round-to-zero\n"
+ " mask-invalid mask-denormalized mask-division-by-zero\n"
+ " mask-overflow mask-underflow mask-all\n"
+ " trap-common trap-inexact\n"
+ "\n"
+ "separated by commas. "
+ "(e.g. GSL_IEEE_MODE=\"round-down,mask-underflow\")",
+ GSL_EINVAL) ;
+
+ if (new_precision)
+ {
+ *precision = new_precision ;
+ precision_count ++ ;
+ if (precision_count > 1)
+ GSL_ERROR ("attempted to set IEEE precision twice", GSL_EINVAL) ;
+ }
+
+ if (new_rounding)
+ {
+ *rounding = new_rounding ;
+ rounding_count ++ ;
+ if (rounding_count > 1)
+ GSL_ERROR ("attempted to set IEEE rounding mode twice", GSL_EINVAL) ;
+ }
+
+ if (new_exception)
+ {
+ *exception_mask |= new_exception ;
+ exception_count ++ ;
+ }
+
+ p = end ;
+
+ } while (end && *p != '\0') ;
+
+ free(start) ;
+
+ return GSL_SUCCESS ;
+}
+
+static int
+lookup_string (const char * p, int * precision, int * rounding,
+ int * exception_mask)
+{
+ if (strcmp(p,"single-precision") == 0)
+ {
+ *precision = GSL_IEEE_SINGLE_PRECISION ;
+ }
+ else if (strcmp(p,"double-precision") == 0)
+ {
+ *precision = GSL_IEEE_DOUBLE_PRECISION ;
+ }
+ else if (strcmp(p,"extended-precision") == 0)
+ {
+ *precision = GSL_IEEE_EXTENDED_PRECISION ;
+ }
+ else if (strcmp(p,"round-to-nearest") == 0)
+ {
+ *rounding = GSL_IEEE_ROUND_TO_NEAREST ;
+ }
+ else if (strcmp(p,"round-down") == 0)
+ {
+ *rounding = GSL_IEEE_ROUND_DOWN ;
+ }
+ else if (strcmp(p,"round-up") == 0)
+ {
+ *rounding = GSL_IEEE_ROUND_UP ;
+ }
+ else if (strcmp(p,"round-to-zero") == 0)
+ {
+ *rounding = GSL_IEEE_ROUND_TO_ZERO ;
+ }
+ else if (strcmp(p,"mask-all") == 0)
+ {
+ *exception_mask = GSL_IEEE_MASK_ALL ;
+ }
+ else if (strcmp(p,"mask-invalid") == 0)
+ {
+ *exception_mask = GSL_IEEE_MASK_INVALID ;
+ }
+ else if (strcmp(p,"mask-denormalized") == 0)
+ {
+ *exception_mask = GSL_IEEE_MASK_DENORMALIZED ;
+ }
+ else if (strcmp(p,"mask-division-by-zero") == 0)
+ {
+ *exception_mask = GSL_IEEE_MASK_DIVISION_BY_ZERO ;
+ }
+ else if (strcmp(p,"mask-overflow") == 0)
+ {
+ *exception_mask = GSL_IEEE_MASK_OVERFLOW ;
+ }
+ else if (strcmp(p,"mask-underflow") == 0)
+ {
+ *exception_mask = GSL_IEEE_MASK_UNDERFLOW ;
+ }
+ else if (strcmp(p,"trap-inexact") == 0)
+ {
+ *exception_mask = GSL_IEEE_TRAP_INEXACT ;
+ }
+ else if (strcmp(p,"trap-common") == 0)
+ {
+ return 0 ;
+ }
+ else
+ {
+ return 1 ;
+ }
+
+ return 0 ;
+}
diff --git a/gsl-1.9/ieee-utils/standardize.c b/gsl-1.9/ieee-utils/standardize.c
new file mode 100644
index 0000000..dd96f97
--- /dev/null
+++ b/gsl-1.9/ieee-utils/standardize.c
@@ -0,0 +1,61 @@
+/* ieee-utils/standardize.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+static void make_float_bigendian (float * x);
+static void make_double_bigendian (double * x);
+
+static void
+make_float_bigendian (float * x)
+{
+ union {
+ float f;
+ unsigned char b[4];
+ } u,v;
+
+ u.f = *x ;
+
+ v.b[0]=u.b[3] ;
+ v.b[1]=u.b[2] ;
+ v.b[2]=u.b[1] ;
+ v.b[3]=u.b[0] ;
+
+ *x=v.f ;
+}
+
+static void
+make_double_bigendian (double * x)
+{
+ union {
+ double d;
+ unsigned char b[8];
+ } u,v;
+
+ u.d = *x ;
+
+ v.b[0]=u.b[7] ;
+ v.b[1]=u.b[6] ;
+ v.b[2]=u.b[5] ;
+ v.b[3]=u.b[4] ;
+ v.b[4]=u.b[3] ;
+ v.b[5]=u.b[2] ;
+ v.b[6]=u.b[1] ;
+ v.b[7]=u.b[0] ;
+
+ *x=v.d ;
+}
diff --git a/gsl-1.9/ieee-utils/test.c b/gsl-1.9/ieee-utils/test.c
new file mode 100644
index 0000000..3af8187
--- /dev/null
+++ b/gsl-1.9/ieee-utils/test.c
@@ -0,0 +1,482 @@
+/* ieee-utils/test.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <math.h>
+#include <float.h>
+#include <string.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_test.h>
+
+#if HAVE_IRIX_IEEE_INTERFACE
+/* don't test denormals on IRIX */
+#else
+#if HAVE_IEEE_DENORMALS
+#define TEST_DENORMAL 1
+#endif
+#endif
+
+#ifndef FLT_MIN
+#define FLT_MIN 1.17549435e-38f
+#endif
+
+#ifndef FLT_MAX
+#define FLT_MAX 3.40282347e+38f
+#endif
+
+#ifndef DBL_MIN
+#define DBL_MIN 2.2250738585072014e-308
+#endif
+
+#ifndef DBL_MAX
+#define DBL_MAX 1.7976931348623157e+308
+#endif
+
+int
+main (void)
+{
+ float zerof = 0.0f, minus_onef = -1.0f ;
+ double zero = 0.0, minus_one = -1.0 ;
+
+ /* Check for +ZERO (float) */
+
+ {
+ float f = 0.0f;
+ const char mantissa[] = "00000000000000000000000";
+ gsl_ieee_float_rep r;
+ gsl_ieee_float_to_rep (&f, &r);
+
+ gsl_test_int (r.sign, 0, "float x = 0, sign is +");
+ gsl_test_int (r.exponent, -127, "float x = 0, exponent is -127");
+ gsl_test_str (r.mantissa, mantissa, "float x = 0, mantissa");
+ gsl_test_int (r.type, GSL_IEEE_TYPE_ZERO, "float x = 0, type is ZERO");
+ }
+
+ /* Check for -ZERO (float) */
+
+ {
+ float f = minus_onef;
+ const char mantissa[] = "00000000000000000000000";
+ gsl_ieee_float_rep r;
+
+ while (f < 0) {
+ f *= 0.1f;
+ }
+
+ gsl_ieee_float_to_rep (&f, &r);
+
+ gsl_test_int (r.sign, 1, "float x = -1*0, sign is -");
+ gsl_test_int (r.exponent, -127, "float x = -1*0, exponent is -127");
+ gsl_test_str (r.mantissa, mantissa, "float x = -1*0, mantissa");
+ gsl_test_int (r.type, GSL_IEEE_TYPE_ZERO, "float x = -1*0, type is ZERO");
+ }
+
+ /* Check for a positive NORMAL number (e.g. 2.1) (float) */
+
+ {
+ float f = 2.1f;
+ const char mantissa[] = "00001100110011001100110";
+
+ gsl_ieee_float_rep r;
+ gsl_ieee_float_to_rep (&f, &r);
+
+ gsl_test_int (r.sign, 0, "float x = 2.1, sign is +");
+ gsl_test_int (r.exponent, 1, "float x = 2.1, exponent is 1");
+ gsl_test_str (r.mantissa, mantissa, "float x = 2.1, mantissa");
+ gsl_test_int (r.type, GSL_IEEE_TYPE_NORMAL, "float x = 2.1, type is NORMAL");
+ }
+
+
+ /* Check for a negative NORMAL number (e.g. -1.3304...) (float) */
+
+ {
+ float f = -1.3303577090924210f ;
+ const char mantissa[] = "01010100100100100101001";
+
+ gsl_ieee_float_rep r;
+ gsl_ieee_float_to_rep (&f, &r);
+
+ gsl_test_int (r.sign, 1, "float x = -1.3304..., sign is -");
+ gsl_test_int (r.exponent, 0, "float x = -1.3304..., exponent is 0");
+ gsl_test_str (r.mantissa, mantissa, "float x = -1.3304..., mantissa");
+ gsl_test_int (r.type, GSL_IEEE_TYPE_NORMAL,
+ "float x = -1.3304..., type is NORMAL");
+ }
+
+ /* Check for a large positive NORMAL number (e.g. 3.37e31) (float) */
+
+ {
+ float f = 3.37e31f;
+ const char mantissa[] = "10101001010110101001001";
+ gsl_ieee_float_rep r;
+ gsl_ieee_float_to_rep (&f, &r);
+
+ gsl_test_int (r.sign, 0, "float x = 3.37e31, sign is +");
+ gsl_test_int (r.exponent, 104, "float x = 3.37e31, exponent is 104");
+ gsl_test_str (r.mantissa, mantissa, "float x = 3.37e31, mantissa");
+ gsl_test_int (r.type, GSL_IEEE_TYPE_NORMAL, "float x = 3.37e31, type is NORMAL");
+ }
+
+ /* Check for a small positive NORMAL number (e.g. 3.37e-31) (float) */
+
+ {
+ float f = 3.37e-31f;
+ const char mantissa[] = "10110101011100110111011";
+
+ gsl_ieee_float_rep r;
+ gsl_ieee_float_to_rep (&f, &r);
+
+ gsl_test_int (r.sign, 0, "float x = 3.37e-31, sign is +");
+ gsl_test_int (r.exponent, -102, "float x = 3.37e-31, exponent is -102");
+ gsl_test_str (r.mantissa, mantissa, "float x = 3.37e-31, mantissa");
+ gsl_test_int (r.type, GSL_IEEE_TYPE_NORMAL,
+ "float x = 3.37e-31, type is NORMAL");
+ }
+
+ /* Check for FLT_MIN (smallest possible number that is not denormal) */
+
+ {
+ float f = FLT_MIN;
+ const char mantissa[] = "00000000000000000000000";
+ gsl_ieee_float_rep r;
+ gsl_ieee_float_to_rep (&f, &r);
+
+ gsl_test_int (r.sign, 0, "float x = FLT_MIN, sign is +");
+ gsl_test_int (r.exponent, -126, "float x = FLT_MIN, exponent is -126");
+ gsl_test_str (r.mantissa, mantissa, "float x = FLT_MIN, mantissa");
+ gsl_test_int (r.type, GSL_IEEE_TYPE_NORMAL, "float x = FLT_MIN, type is NORMAL");
+ }
+
+ /* Check for FLT_MAX (largest possible number that is not Inf) */
+
+ {
+ float f = FLT_MAX;
+ const char mantissa[] = "11111111111111111111111";
+
+ gsl_ieee_float_rep r;
+ gsl_ieee_float_to_rep (&f, &r);
+
+ gsl_test_int (r.sign, 0, "float x = FLT_MAX, sign is +");
+ gsl_test_int (r.exponent, 127, "float x = FLT_MAX, exponent is 127");
+ gsl_test_str (r.mantissa, mantissa, "float x = FLT_MAX, mantissa");
+ gsl_test_int (r.type, GSL_IEEE_TYPE_NORMAL, "float x = FLT_MAX, type is NORMAL");
+ }
+
+
+ /* Check for DENORMAL numbers (e.g. FLT_MIN/2^n) */
+
+#ifdef TEST_DENORMAL
+ {
+ float f = FLT_MIN;
+ char mantissa[] = "10000000000000000000000";
+
+ int i;
+ gsl_ieee_float_rep r;
+
+ for (i = 0; i < 23; i++)
+ {
+ float x = f / (float)pow (2.0, 1 + (float) i);
+ mantissa[i] = '1';
+ gsl_ieee_float_to_rep (&x, &r);
+
+ gsl_test_int (r.sign, 0, "float x = FLT_MIN/2^%d, sign is +", i + 1);
+ gsl_test_int (r.exponent, -127,
+ "float x = FLT_MIN/2^%d, exponent is -127", i + 1);
+ gsl_test_str (r.mantissa, mantissa,
+ "float x = FLT_MIN/2^%d, mantissa", i + 1);
+ gsl_test_int (r.type, GSL_IEEE_TYPE_DENORMAL,
+ "float x = FLT_MIN/2^%d, type is DENORMAL", i + 1);
+ mantissa[i] = '0';
+ }
+ }
+#endif
+
+ /* Check for positive INFINITY (e.g. 2*FLT_MAX) */
+
+ {
+ float f = FLT_MAX;
+ const char mantissa[] = "00000000000000000000000";
+
+ gsl_ieee_float_rep r;
+
+ float x;
+ x = 2 * f;
+ gsl_ieee_float_to_rep (&x, &r);
+
+ gsl_test_int (r.sign, 0, "float x = 2*FLT_MAX, sign is +");
+ gsl_test_int (r.exponent, 128, "float x = 2*FLT_MAX, exponent is 128");
+ gsl_test_str (r.mantissa, mantissa, "float x = 2*FLT_MAX, mantissa");
+ gsl_test_int (r.type, GSL_IEEE_TYPE_INF, "float x = -2*FLT_MAX, type is INF");
+ }
+
+ /* Check for negative INFINITY (e.g. -2*FLT_MAX) */
+
+ {
+ float f = FLT_MAX;
+ const char mantissa[] = "00000000000000000000000";
+
+ gsl_ieee_float_rep r;
+
+ float x;
+ x = -2 * f;
+ gsl_ieee_float_to_rep (&x, &r);
+
+ gsl_test_int (r.sign, 1, "float x = -2*FLT_MAX, sign is -");
+ gsl_test_int (r.exponent, 128, "float x = -2*FLT_MAX, exponent is 128");
+ gsl_test_str (r.mantissa, mantissa, "float x = -2*FLT_MAX, mantissa");
+ gsl_test_int (r.type, GSL_IEEE_TYPE_INF, "float x = -2*FLT_MAX, type is INF");
+ }
+
+ /* Check for NAN (e.g. Inf - Inf) (float) */
+
+ {
+ gsl_ieee_float_rep r;
+ float x = 1.0f, y = 2.0f, z = zerof;
+
+ x = x / z;
+ y = y / z;
+ z = y - x;
+
+ gsl_ieee_float_to_rep (&z, &r);
+
+ /* We don't check the sign and we don't check the mantissa because
+ they could be anything for a NaN */
+
+ gsl_test_int (r.exponent, 128, "float x = NaN, exponent is 128");
+ gsl_test_int (r.type, GSL_IEEE_TYPE_NAN, "float x = NaN, type is NAN");
+ }
+
+
+ /* Check for +ZERO */
+
+ {
+ double d = 0.0;
+ const char mantissa[]
+ = "0000000000000000000000000000000000000000000000000000";
+ gsl_ieee_double_rep r;
+ gsl_ieee_double_to_rep (&d, &r);
+
+ gsl_test_int (r.sign, 0, "double x = 0, sign is +");
+ gsl_test_int (r.exponent, -1023, "double x = 0, exponent is -1023");
+ gsl_test_str (r.mantissa, mantissa, "double x = 0, mantissa");
+ gsl_test_int (r.type, GSL_IEEE_TYPE_ZERO, "double x = 0, type is ZERO");
+ }
+
+ /* Check for -ZERO */
+
+ {
+ double d = minus_one;
+ const char mantissa[]
+ = "0000000000000000000000000000000000000000000000000000";
+ gsl_ieee_double_rep r;
+
+ while (d < 0) {
+ d *= 0.1;
+ }
+
+ gsl_ieee_double_to_rep (&d, &r);
+
+ gsl_test_int (r.sign, 1, "double x = -1*0, sign is -");
+ gsl_test_int (r.exponent, -1023, "double x = -1*0, exponent is -1023");
+ gsl_test_str (r.mantissa, mantissa, "double x = -1*0, mantissa");
+ gsl_test_int (r.type, GSL_IEEE_TYPE_ZERO, "double x = -1*0, type is ZERO");
+ }
+
+ /* Check for a positive NORMAL number (e.g. 2.1) */
+
+ {
+ double d = 2.1;
+ const char mantissa[]
+ = "0000110011001100110011001100110011001100110011001101";
+ gsl_ieee_double_rep r;
+ gsl_ieee_double_to_rep (&d, &r);
+
+ gsl_test_int (r.sign, 0, "double x = 2.1, sign is +");
+ gsl_test_int (r.exponent, 1, "double x = 2.1, exponent is 1");
+ gsl_test_str (r.mantissa, mantissa, "double x = 2.1, mantissa");
+ gsl_test_int (r.type, GSL_IEEE_TYPE_NORMAL, "double x = 2.1, type is NORMAL");
+ }
+
+
+ /* Check for a negative NORMAL number (e.g. -1.3304...) */
+
+ {
+ double d = -1.3303577090924210146738460025517269968986511230468750;
+ const char mantissa[]
+ = "0101010010010010010100101010010010001000100011101110";
+ gsl_ieee_double_rep r;
+ gsl_ieee_double_to_rep (&d, &r);
+
+ gsl_test_int (r.sign, 1, "double x = -1.3304..., sign is -");
+ gsl_test_int (r.exponent, 0, "double x = -1.3304..., exponent is 0");
+ gsl_test_str (r.mantissa, mantissa, "double x = -1.3304..., mantissa");
+ gsl_test_int (r.type, GSL_IEEE_TYPE_NORMAL,
+ "double x = -1.3304..., type is NORMAL");
+ }
+
+ /* Check for a large positive NORMAL number (e.g. 3.37e297) */
+
+ {
+ double d = 3.37e297;
+ const char mantissa[]
+ = "0100100111001001100101111001100000100110011101000100";
+ gsl_ieee_double_rep r;
+ gsl_ieee_double_to_rep (&d, &r);
+
+ gsl_test_int (r.sign, 0, "double x = 3.37e297, sign is +");
+ gsl_test_int (r.exponent, 988, "double x = 3.37e297, exponent is 998");
+ gsl_test_str (r.mantissa, mantissa, "double x = 3.37e297, mantissa");
+ gsl_test_int (r.type, GSL_IEEE_TYPE_NORMAL,
+ "double x = 3.37e297, type is NORMAL");
+ }
+
+ /* Check for a small positive NORMAL number (e.g. 3.37e-297) */
+
+ {
+ double d = 3.37e-297;
+ const char mantissa[]
+ = "0001101000011011101011100001110010100001001100110111";
+ gsl_ieee_double_rep r;
+ gsl_ieee_double_to_rep (&d, &r);
+
+ gsl_test_int (r.sign, 0, "double x = 3.37e-297, sign is +");
+ gsl_test_int (r.exponent, -985, "double x = 3.37e-297, exponent is -985");
+ gsl_test_str (r.mantissa, mantissa, "double x = 3.37e-297, mantissa");
+ gsl_test_int (r.type, GSL_IEEE_TYPE_NORMAL,
+ "double x = 3.37e-297, type is NORMAL");
+ }
+
+ /* Check for DBL_MIN (smallest possible number that is not denormal) */
+
+ {
+ double d = DBL_MIN;
+ const char mantissa[]
+ = "0000000000000000000000000000000000000000000000000000";
+ gsl_ieee_double_rep r;
+ gsl_ieee_double_to_rep (&d, &r);
+
+ gsl_test_int (r.sign, 0, "double x = DBL_MIN, sign is +");
+ gsl_test_int (r.exponent, -1022, "double x = DBL_MIN, exponent is -1022");
+ gsl_test_str (r.mantissa, mantissa, "double x = DBL_MIN, mantissa");
+ gsl_test_int (r.type, GSL_IEEE_TYPE_NORMAL,
+ "double x = DBL_MIN, type is NORMAL");
+ }
+
+ /* Check for DBL_MAX (largest possible number that is not Inf) */
+
+ {
+ double d = DBL_MAX;
+ const char mantissa[]
+ = "1111111111111111111111111111111111111111111111111111";
+ gsl_ieee_double_rep r;
+ gsl_ieee_double_to_rep (&d, &r);
+
+ gsl_test_int (r.sign, 0, "double x = DBL_MAX, sign is +");
+ gsl_test_int (r.exponent, 1023, "double x = DBL_MAX, exponent is 1023");
+ gsl_test_str (r.mantissa, mantissa, "double x = DBL_MAX, mantissa");
+ gsl_test_int (r.type, GSL_IEEE_TYPE_NORMAL,
+ "double x = DBL_MAX, type is NORMAL");
+ }
+
+ /* Check for DENORMAL numbers (e.g. DBL_MIN/2^n) */
+
+#ifdef TEST_DENORMAL
+ {
+ double d = DBL_MIN;
+ char mantissa[]
+ = "1000000000000000000000000000000000000000000000000000";
+ int i;
+ gsl_ieee_double_rep r;
+
+ for (i = 0; i < 52; i++)
+ {
+ double x = d / pow (2.0, 1 + (double) i);
+ mantissa[i] = '1';
+ gsl_ieee_double_to_rep (&x, &r);
+
+ gsl_test_int (r.sign, 0, "double x = DBL_MIN/2^%d, sign is +", i + 1);
+ gsl_test_int (r.exponent, -1023,
+ "double x = DBL_MIN/2^%d, exponent", i + 1);
+ gsl_test_str (r.mantissa, mantissa,
+ "double x = DBL_MIN/2^%d, mantissa", i + 1);
+ gsl_test_int (r.type, GSL_IEEE_TYPE_DENORMAL,
+ "double x = DBL_MIN/2^%d, type is DENORMAL", i + 1);
+ mantissa[i] = '0';
+ }
+ }
+#endif
+
+ /* Check for positive INFINITY (e.g. 2*DBL_MAX) */
+
+ {
+ double d = DBL_MAX;
+ const char mantissa[]
+ = "0000000000000000000000000000000000000000000000000000";
+ gsl_ieee_double_rep r;
+
+ double x;
+ x = 2.0 * d;
+ gsl_ieee_double_to_rep (&x, &r);
+
+ gsl_test_int (r.sign, 0, "double x = 2*DBL_MAX, sign is +");
+ gsl_test_int (r.exponent, 1024, "double x = 2*DBL_MAX, exponent is 1024");
+ gsl_test_str (r.mantissa, mantissa, "double x = 2*DBL_MAX, mantissa");
+ gsl_test_int (r.type, GSL_IEEE_TYPE_INF, "double x = 2*DBL_MAX, type is INF");
+ }
+
+ /* Check for negative INFINITY (e.g. -2*DBL_MAX) */
+
+ {
+ double d = DBL_MAX;
+ const char mantissa[]
+ = "0000000000000000000000000000000000000000000000000000";
+ gsl_ieee_double_rep r;
+
+ double x;
+ x = -2.0 * d;
+ gsl_ieee_double_to_rep (&x, &r);
+
+ gsl_test_int (r.sign, 1, "double x = -2*DBL_MAX, sign is -");
+ gsl_test_int (r.exponent, 1024, "double x = -2*DBL_MAX, exponent is 1024");
+ gsl_test_str (r.mantissa, mantissa, "double x = -2*DBL_MAX, mantissa");
+ gsl_test_int (r.type, GSL_IEEE_TYPE_INF,"double x = -2*DBL_MAX, type is INF");
+ }
+
+ /* Check for NAN (e.g. Inf - Inf) */
+
+ {
+ gsl_ieee_double_rep r;
+ double x = 1.0, y = 2.0, z = zero;
+
+ x = x / z;
+ y = y / z;
+ z = y - x;
+
+ gsl_ieee_double_to_rep (&z, &r);
+
+ /* We don't check the sign and we don't check the mantissa because
+ they could be anything for a NaN */
+
+ gsl_test_int (r.exponent, 1024, "double x = NaN, exponent is 1024");
+ gsl_test_int (r.type, GSL_IEEE_TYPE_NAN, "double x = NaN, type is NAN");
+ }
+
+ exit (gsl_test_summary ());
+}
diff --git a/gsl-1.9/install-sh b/gsl-1.9/install-sh
new file mode 100755
index 0000000..5871924
--- /dev/null
+++ b/gsl-1.9/install-sh
@@ -0,0 +1,238 @@
+#! /bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+#
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+transformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+ case $1 in
+ -c) instcmd="$cpprog"
+ shift
+ continue;;
+
+ -d) dir_arg=true
+ shift
+ continue;;
+
+ -m) chmodcmd="$chmodprog $2"
+ shift
+ shift
+ continue;;
+
+ -o) chowncmd="$chownprog $2"
+ shift
+ shift
+ continue;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift
+ shift
+ continue;;
+
+ -s) stripcmd="$stripprog"
+ shift
+ continue;;
+
+ -t=*) transformarg=`echo $1 | sed 's/-t=//'`
+ shift
+ continue;;
+
+ -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+ shift
+ continue;;
+
+ *) if [ x"$src" = x ]
+ then
+ src=$1
+ else
+ # this colon is to work around a 386BSD /bin/sh bug
+ :
+ dst=$1
+ fi
+ shift
+ continue;;
+ esac
+done
+
+if [ x"$src" = x ]
+then
+ echo "install: no input file specified"
+ exit 1
+else
+ true
+fi
+
+if [ x"$dir_arg" != x ]; then
+ dst=$src
+ src=""
+
+ if [ -d $dst ]; then
+ instcmd=:
+ else
+ instcmd=mkdir
+ fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad
+# if $src (and thus $dsttmp) contains '*'.
+
+ if [ -f $src -o -d $src ]
+ then
+ true
+ else
+ echo "install: $src does not exist"
+ exit 1
+ fi
+
+ if [ x"$dst" = x ]
+ then
+ echo "install: no destination specified"
+ exit 1
+ else
+ true
+ fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+ if [ -d $dst ]
+ then
+ dst="$dst"/`basename $src`
+ else
+ true
+ fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+# this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='
+'
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+ pathcomp="${pathcomp}${1}"
+ shift
+
+ if [ ! -d "${pathcomp}" ] ;
+ then
+ $mkdirprog "${pathcomp}"
+ else
+ true
+ fi
+
+ pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+ $doit $instcmd $dst &&
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+ if [ x"$transformarg" = x ]
+ then
+ dstfile=`basename $dst`
+ else
+ dstfile=`basename $dst $transformbasename |
+ sed $transformarg`$transformbasename
+ fi
+
+# don't allow the sed command to completely eliminate the filename
+
+ if [ x"$dstfile" = x ]
+ then
+ dstfile=`basename $dst`
+ else
+ true
+ fi
+
+# Make a temp file name in the proper directory.
+
+ dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+ $doit $instcmd $src $dsttmp &&
+
+ trap "rm -f ${dsttmp}" 0 &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing. If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+
+# Now rename the file to the real destination.
+
+ $doit $rmcmd -f $dstdir/$dstfile &&
+ $doit $mvcmd $dsttmp $dstdir/$dstfile
+
+fi &&
+
+
+exit 0
diff --git a/gsl-1.9/integration/ChangeLog b/gsl-1.9/integration/ChangeLog
new file mode 100644
index 0000000..995c577
--- /dev/null
+++ b/gsl-1.9/integration/ChangeLog
@@ -0,0 +1,133 @@
+2003-01-12 Brian Gough <brian.gough@network-theory.co.uk>
+
+ * qawc.c (gsl_integration_qawc): fixed bisection condition to
+ prevent singularity falling on interval boundary
+
+Mon Apr 29 20:05:56 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * qcheb.c (gsl_integration_qcheb): avoid loss of precision by
+ replacing endpoints center+half_length by b and center-half_length
+ by a
+
+Mon Jul 30 17:46:42 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c (main): reduced tolerance on qagiu(f455) smooth elist
+ test slightly
+
+Mon Jul 2 15:42:41 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * util.c: split out some static functions into separate files
+
+Tue Apr 17 22:11:28 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * qc25f.c (qc25f): need GSL_ERROR_VOID because function does not
+ return value
+
+Mon Apr 16 20:09:09 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * qc25f.c (qc25f): removed unnecessary variables, replaced use of
+ abort by GSL_ERROR
+
+ * qmomof.c (gsl_integration_qawo_table_set_length): removed
+ unnecessary duplicate variable declaration for i
+
+Mon Jan 22 12:35:05 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * qmomof.c: moments are now precomputed in a read-only table
+ instead of being computed on the fly (cached)
+
+Fri Dec 8 19:45:52 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * reorganized, made internal functions static
+
+Thu Nov 16 19:45:19 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * qag_impl.c (gsl_integration_qag_impl): replace use of volatile
+ with the macro GSL_COERCE_DBL
+
+Wed May 31 19:35:57 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c (main): increased tolerances on some results to allow
+ tests to pass with other compilers
+
+Mon May 15 14:21:00 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c (main): increased one test limit slightly to allow for
+ rounding errors
+
+Wed Feb 23 14:35:31 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * qpsrt.c (qpsrt): changed ordering of while conditions to avoid
+ segmentation faults due to accessing values before testing end of
+ loop condition. Thanks to Brett Viren
+ <bviren@superk.physics.sunysb.edu> for pointing this out.
+
+ * qelg.c (qelg): changed update of nres from the original quadpack
+ so that uninitialized elements of the res3la array are never
+ accessed.
+
+ * test.c (main): eliminate small memory leak from test
+
+Mon Feb 14 13:45:04 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * qk.c: renamed function qk to gsl_integration_qk since it is
+ exported
+
+ * err.c: made internal function rescale_err static, only used in
+ qk.c and qng.c
+
+Mon Jul 12 11:37:55 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * qawc_impl.c (gsl_integration_qawc_impl): removed, no longer
+ necessary since everything goes into qawc.c
+
+Fri Apr 2 20:57:09 1999 Brian Gough <bjg@netsci.freeserve.co.uk>
+
+ * qelg.c (qelg): removed debugging code
+
+ * qpsrt.c (qpsrt): removed debugging code
+
+Thu Mar 11 15:15:46 1999 Brian Gough <bjg@netsci.freeserve.co.uk>
+
+ * qags_impl.c (gsl_integration_qags_impl): removed dependency in
+ quadrature function calls by introducing dummy variables resabs1
+ and resabs2
+
+Wed Mar 10 19:05:41 1999 Brian Gough <bjg@netsci.freeserve.co.uk>
+
+ * added integrators QAGI, QAGIU, QAGIL for infinite and
+ semi-infinite ranges
+
+1999-01-01 Mark Galassi <rosalia@cygnus.com>
+
+ * integration.c: replaced strings.h with string.h, which is the
+ ISO library way.
+
+Sat Nov 21 12:43:03 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * Makefile.am (libgslintegration_a_SOURCES): eliminated local
+ max.h in favor of global GSL_MAX
+
+ * added missing gsl_math.h headers for new GSL_DBL_EPSILON macros
+
+Tue Nov 17 17:16:51 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * added #include <config.h> to all top-level source files
+
+Fri Jun 12 22:30:21 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * qage_impl.c: started using volatile (selectively) to enforce
+ strict IEEE behavior for the branches where it matters. I was
+ going to use gcc's -ffloat-store option but it didn't work for me.
+ Using volatile is not really a complete solution but is probably
+ close enough for all practical purposes (also it doesn't degrade
+ the performance as much as -ffloat-store would).
+
+Sat May 30 15:40:51 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * test.c (main): basic tests of qage are now complete
+
+ * qage_impl.c (gsl_integration_qage_impl): fixed serious bug for
+ index i, which was incremented at the end of the do loop and
+ give an extra undefined entry in the result list!
+
diff --git a/gsl-1.9/integration/Makefile.am b/gsl-1.9/integration/Makefile.am
new file mode 100644
index 0000000..d66869f
--- /dev/null
+++ b/gsl-1.9/integration/Makefile.am
@@ -0,0 +1,14 @@
+noinst_LTLIBRARIES = libgslintegration.la
+
+INCLUDES= -I$(top_builddir)
+
+libgslintegration_la_SOURCES = qk15.c qk21.c qk31.c qk41.c qk51.c qk61.c qk.c qng.c qng.h qag.c qags.c qagp.c workspace.c qcheb.c qawc.c qmomo.c qaws.c qmomof.c qawo.c qawf.c
+
+pkginclude_HEADERS = gsl_integration.h
+noinst_HEADERS = qpsrt.c qpsrt2.c qelg.c qc25c.c qc25s.c qc25f.c ptsort.c util.c err.c positivity.c append.c initialise.c set_initial.c reset.c
+
+TESTS = $(check_PROGRAMS)
+check_PROGRAMS = test
+
+test_SOURCES = test.c tests.c tests.h
+test_LDADD = libgslintegration.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
diff --git a/gsl-1.9/integration/Makefile.in b/gsl-1.9/integration/Makefile.in
new file mode 100644
index 0000000..a198d30
--- /dev/null
+++ b/gsl-1.9/integration/Makefile.in
@@ -0,0 +1,547 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = test$(EXEEXT)
+subdir = integration
+DIST_COMMON = $(noinst_HEADERS) $(pkginclude_HEADERS) \
+ $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog TODO
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgslintegration_la_LIBADD =
+am_libgslintegration_la_OBJECTS = qk15.lo qk21.lo qk31.lo qk41.lo \
+ qk51.lo qk61.lo qk.lo qng.lo qag.lo qags.lo qagp.lo \
+ workspace.lo qcheb.lo qawc.lo qmomo.lo qaws.lo qmomof.lo \
+ qawo.lo qawf.lo
+libgslintegration_la_OBJECTS = $(am_libgslintegration_la_OBJECTS)
+am_test_OBJECTS = test.$(OBJEXT) tests.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = libgslintegration.la \
+ ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la \
+ ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgslintegration_la_SOURCES) $(test_SOURCES)
+DIST_SOURCES = $(libgslintegration_la_SOURCES) $(test_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libgslintegration.la
+INCLUDES = -I$(top_builddir)
+libgslintegration_la_SOURCES = qk15.c qk21.c qk31.c qk41.c qk51.c qk61.c qk.c qng.c qng.h qag.c qags.c qagp.c workspace.c qcheb.c qawc.c qmomo.c qaws.c qmomof.c qawo.c qawf.c
+pkginclude_HEADERS = gsl_integration.h
+noinst_HEADERS = qpsrt.c qpsrt2.c qelg.c qc25c.c qc25s.c qc25f.c ptsort.c util.c err.c positivity.c append.c initialise.c set_initial.c reset.c
+TESTS = $(check_PROGRAMS)
+test_SOURCES = test.c tests.c tests.h
+test_LDADD = libgslintegration.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps integration/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps integration/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgslintegration.la: $(libgslintegration_la_OBJECTS) $(libgslintegration_la_DEPENDENCIES)
+ $(LINK) $(libgslintegration_la_LDFLAGS) $(libgslintegration_la_OBJECTS) $(libgslintegration_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkgincludeHEADERS
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/integration/TODO b/gsl-1.9/integration/TODO
new file mode 100644
index 0000000..027d6c4
--- /dev/null
+++ b/gsl-1.9/integration/TODO
@@ -0,0 +1,11 @@
+* BUG#14 -- qagil
+
+The extrapolation used in qags gives negative results when integrating
+the small tails of probability distributions using qagil, even though
+each individual term in the sequence is positive and increasing (!).
+This is a feature of the original quadpack and appears to be due to
+the extrapolation algorithm, which should probably be tweaked to avoid
+this undesirable behavior.
+
+
+* Someone to volunteer to do Cubature, e.g as provided by Cubpack.
diff --git a/gsl-1.9/integration/append.c b/gsl-1.9/integration/append.c
new file mode 100644
index 0000000..44a0dc2
--- /dev/null
+++ b/gsl-1.9/integration/append.c
@@ -0,0 +1,35 @@
+/* integration/append.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+static inline
+void append_interval (gsl_integration_workspace * workspace,
+ double a1, double b1, double area1, double error1)
+{
+ const size_t i_new = workspace->size ;
+
+ workspace->alist[i_new] = a1;
+ workspace->blist[i_new] = b1;
+ workspace->rlist[i_new] = area1;
+ workspace->elist[i_new] = error1;
+ workspace->order[i_new] = i_new;
+ workspace->level[i_new] = 0;
+
+ workspace->size++;
+}
+
diff --git a/gsl-1.9/integration/err.c b/gsl-1.9/integration/err.c
new file mode 100644
index 0000000..a9f9f00
--- /dev/null
+++ b/gsl-1.9/integration/err.c
@@ -0,0 +1,58 @@
+/* integration/err.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <float.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_integration.h>
+
+static double rescale_error (double err, const double result_abs, const double result_asc) ;
+
+static double
+rescale_error (double err, const double result_abs, const double result_asc)
+{
+ err = fabs(err) ;
+
+ if (result_asc != 0 && err != 0)
+ {
+ double scale = pow((200 * err / result_asc), 1.5) ;
+
+ if (scale < 1)
+ {
+ err = result_asc * scale ;
+ }
+ else
+ {
+ err = result_asc ;
+ }
+ }
+ if (result_abs > GSL_DBL_MIN / (50 * GSL_DBL_EPSILON))
+ {
+ double min_err = 50 * GSL_DBL_EPSILON * result_abs ;
+
+ if (min_err > err)
+ {
+ err = min_err ;
+ }
+ }
+
+ return err ;
+}
+
diff --git a/gsl-1.9/integration/gsl_integration.h b/gsl-1.9/integration/gsl_integration.h
new file mode 100644
index 0000000..3f0f240
--- /dev/null
+++ b/gsl-1.9/integration/gsl_integration.h
@@ -0,0 +1,252 @@
+/* integration/gsl_integration.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_INTEGRATION_H__
+#define __GSL_INTEGRATION_H__
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+/* Workspace for adaptive integrators */
+
+typedef struct
+ {
+ size_t limit;
+ size_t size;
+ size_t nrmax;
+ size_t i;
+ size_t maximum_level;
+ double *alist;
+ double *blist;
+ double *rlist;
+ double *elist;
+ size_t *order;
+ size_t *level;
+ }
+gsl_integration_workspace;
+
+gsl_integration_workspace *
+ gsl_integration_workspace_alloc (const size_t n);
+
+void
+ gsl_integration_workspace_free (gsl_integration_workspace * w);
+
+
+/* Workspace for QAWS integrator */
+
+typedef struct
+{
+ double alpha;
+ double beta;
+ int mu;
+ int nu;
+ double ri[25];
+ double rj[25];
+ double rg[25];
+ double rh[25];
+}
+gsl_integration_qaws_table;
+
+gsl_integration_qaws_table *
+gsl_integration_qaws_table_alloc (double alpha, double beta, int mu, int nu);
+
+int
+gsl_integration_qaws_table_set (gsl_integration_qaws_table * t,
+ double alpha, double beta, int mu, int nu);
+
+void
+gsl_integration_qaws_table_free (gsl_integration_qaws_table * t);
+
+/* Workspace for QAWO integrator */
+
+enum gsl_integration_qawo_enum { GSL_INTEG_COSINE, GSL_INTEG_SINE };
+
+typedef struct
+{
+ size_t n;
+ double omega;
+ double L;
+ double par;
+ enum gsl_integration_qawo_enum sine;
+ double *chebmo;
+}
+gsl_integration_qawo_table;
+
+gsl_integration_qawo_table *
+gsl_integration_qawo_table_alloc (double omega, double L,
+ enum gsl_integration_qawo_enum sine,
+ size_t n);
+
+int
+gsl_integration_qawo_table_set (gsl_integration_qawo_table * t,
+ double omega, double L,
+ enum gsl_integration_qawo_enum sine);
+
+int
+gsl_integration_qawo_table_set_length (gsl_integration_qawo_table * t,
+ double L);
+
+void
+gsl_integration_qawo_table_free (gsl_integration_qawo_table * t);
+
+
+/* Definition of an integration rule */
+
+typedef void gsl_integration_rule (const gsl_function * f,
+ double a, double b,
+ double *result, double *abserr,
+ double *defabs, double *resabs);
+
+void gsl_integration_qk15 (const gsl_function * f, double a, double b,
+ double *result, double *abserr,
+ double *resabs, double *resasc);
+
+void gsl_integration_qk21 (const gsl_function * f, double a, double b,
+ double *result, double *abserr,
+ double *resabs, double *resasc);
+
+void gsl_integration_qk31 (const gsl_function * f, double a, double b,
+ double *result, double *abserr,
+ double *resabs, double *resasc);
+
+void gsl_integration_qk41 (const gsl_function * f, double a, double b,
+ double *result, double *abserr,
+ double *resabs, double *resasc);
+
+void gsl_integration_qk51 (const gsl_function * f, double a, double b,
+ double *result, double *abserr,
+ double *resabs, double *resasc);
+
+void gsl_integration_qk61 (const gsl_function * f, double a, double b,
+ double *result, double *abserr,
+ double *resabs, double *resasc);
+
+void gsl_integration_qcheb (gsl_function * f, double a, double b,
+ double *cheb12, double *cheb24);
+
+/* The low-level integration rules in QUADPACK are identified by small
+ integers (1-6). We'll use symbolic constants to refer to them. */
+
+enum
+ {
+ GSL_INTEG_GAUSS15 = 1, /* 15 point Gauss-Kronrod rule */
+ GSL_INTEG_GAUSS21 = 2, /* 21 point Gauss-Kronrod rule */
+ GSL_INTEG_GAUSS31 = 3, /* 31 point Gauss-Kronrod rule */
+ GSL_INTEG_GAUSS41 = 4, /* 41 point Gauss-Kronrod rule */
+ GSL_INTEG_GAUSS51 = 5, /* 51 point Gauss-Kronrod rule */
+ GSL_INTEG_GAUSS61 = 6 /* 61 point Gauss-Kronrod rule */
+ };
+
+void
+gsl_integration_qk (const int n, const double xgk[],
+ const double wg[], const double wgk[],
+ double fv1[], double fv2[],
+ const gsl_function *f, double a, double b,
+ double * result, double * abserr,
+ double * resabs, double * resasc);
+
+
+int gsl_integration_qng (const gsl_function * f,
+ double a, double b,
+ double epsabs, double epsrel,
+ double *result, double *abserr,
+ size_t * neval);
+
+int gsl_integration_qag (const gsl_function * f,
+ double a, double b,
+ double epsabs, double epsrel, size_t limit,
+ int key,
+ gsl_integration_workspace * workspace,
+ double *result, double *abserr);
+
+int gsl_integration_qagi (gsl_function * f,
+ double epsabs, double epsrel, size_t limit,
+ gsl_integration_workspace * workspace,
+ double *result, double *abserr);
+
+int gsl_integration_qagiu (gsl_function * f,
+ double a,
+ double epsabs, double epsrel, size_t limit,
+ gsl_integration_workspace * workspace,
+ double *result, double *abserr);
+
+int gsl_integration_qagil (gsl_function * f,
+ double b,
+ double epsabs, double epsrel, size_t limit,
+ gsl_integration_workspace * workspace,
+ double *result, double *abserr);
+
+
+int gsl_integration_qags (const gsl_function * f,
+ double a, double b,
+ double epsabs, double epsrel, size_t limit,
+ gsl_integration_workspace * workspace,
+ double *result, double *abserr);
+
+int gsl_integration_qagp (const gsl_function * f,
+ double *pts, size_t npts,
+ double epsabs, double epsrel, size_t limit,
+ gsl_integration_workspace * workspace,
+ double *result, double *abserr);
+
+int gsl_integration_qawc (gsl_function *f,
+ const double a, const double b, const double c,
+ const double epsabs, const double epsrel, const size_t limit,
+ gsl_integration_workspace * workspace,
+ double * result, double * abserr);
+
+int gsl_integration_qaws (gsl_function * f,
+ const double a, const double b,
+ gsl_integration_qaws_table * t,
+ const double epsabs, const double epsrel,
+ const size_t limit,
+ gsl_integration_workspace * workspace,
+ double *result, double *abserr);
+
+int gsl_integration_qawo (gsl_function * f,
+ const double a,
+ const double epsabs, const double epsrel,
+ const size_t limit,
+ gsl_integration_workspace * workspace,
+ gsl_integration_qawo_table * wf,
+ double *result, double *abserr);
+
+int gsl_integration_qawf (gsl_function * f,
+ const double a,
+ const double epsabs,
+ const size_t limit,
+ gsl_integration_workspace * workspace,
+ gsl_integration_workspace * cycle_workspace,
+ gsl_integration_qawo_table * wf,
+ double *result, double *abserr);
+
+__END_DECLS
+
+#endif /* __GSL_INTEGRATION_H__ */
diff --git a/gsl-1.9/integration/initialise.c b/gsl-1.9/integration/initialise.c
new file mode 100644
index 0000000..cbdd8bc
--- /dev/null
+++ b/gsl-1.9/integration/initialise.c
@@ -0,0 +1,37 @@
+/* integration/initialise.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+static inline
+void initialise (gsl_integration_workspace * workspace, double a, double b);
+
+static inline
+void initialise (gsl_integration_workspace * workspace, double a, double b)
+{
+ workspace->size = 0;
+ workspace->nrmax = 0;
+ workspace->i = 0;
+ workspace->alist[0] = a;
+ workspace->blist[0] = b;
+ workspace->rlist[0] = 0.0;
+ workspace->elist[0] = 0.0;
+ workspace->order[0] = 0;
+ workspace->level[0] = 0;
+
+ workspace->maximum_level = 0;
+}
diff --git a/gsl-1.9/integration/positivity.c b/gsl-1.9/integration/positivity.c
new file mode 100644
index 0000000..cfa89f1
--- /dev/null
+++ b/gsl-1.9/integration/positivity.c
@@ -0,0 +1,13 @@
+/* Compare the integral of f(x) with the integral of |f(x)|
+ to determine if f(x) covers both positive and negative values */
+
+static inline int
+test_positivity (double result, double resabs);
+
+static inline int
+test_positivity (double result, double resabs)
+{
+ int status = (fabs (result) >= (1 - 50 * GSL_DBL_EPSILON) * resabs);
+
+ return status;
+}
diff --git a/gsl-1.9/integration/ptsort.c b/gsl-1.9/integration/ptsort.c
new file mode 100644
index 0000000..3ff86b1
--- /dev/null
+++ b/gsl-1.9/integration/ptsort.c
@@ -0,0 +1,62 @@
+/* integration/ptsort.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+static void
+sort_results (gsl_integration_workspace * workspace);
+
+static void
+sort_results (gsl_integration_workspace * workspace)
+{
+ size_t i;
+
+ double * elist = workspace->elist ;
+ size_t * order = workspace->order ;
+
+ size_t nint = workspace->size;
+
+ for (i = 0; i < nint; i++)
+ {
+ size_t i1 = order[i];
+ double e1 = elist[i1];
+ size_t i_max = i1;
+ size_t j;
+
+ for (j = i + 1; j < nint; j++)
+ {
+ size_t i2 = order[j];
+ double e2 = elist[i2];
+
+ if (e2 >= e1)
+ {
+ i_max = i2;
+ e1 = e2;
+ }
+ }
+
+ if (i_max != i1)
+ {
+ order[i] = order[i_max];
+ order[i_max] = i1;
+ }
+ }
+
+ workspace->i = order[0] ;
+}
+
+
diff --git a/gsl-1.9/integration/qag.c b/gsl-1.9/integration/qag.c
new file mode 100644
index 0000000..f5945a8
--- /dev/null
+++ b/gsl-1.9/integration/qag.c
@@ -0,0 +1,265 @@
+/* integration/qag.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_integration.h>
+
+#include "initialise.c"
+#include "set_initial.c"
+#include "qpsrt.c"
+#include "util.c"
+
+static int
+qag (const gsl_function *f,
+ const double a, const double b,
+ const double epsabs, const double epsrel,
+ const size_t limit,
+ gsl_integration_workspace * workspace,
+ double * result, double * abserr,
+ gsl_integration_rule * q) ;
+
+int
+gsl_integration_qag (const gsl_function *f,
+ double a, double b,
+ double epsabs, double epsrel, size_t limit,
+ int key,
+ gsl_integration_workspace * workspace,
+ double * result, double * abserr)
+{
+ int status ;
+ gsl_integration_rule * integration_rule = gsl_integration_qk15 ;
+
+ if (key < GSL_INTEG_GAUSS15)
+ {
+ key = GSL_INTEG_GAUSS15 ;
+ }
+ else if (key > GSL_INTEG_GAUSS61)
+ {
+ key = GSL_INTEG_GAUSS61 ;
+ }
+
+ switch (key)
+ {
+ case GSL_INTEG_GAUSS15:
+ integration_rule = gsl_integration_qk15 ;
+ break ;
+ case GSL_INTEG_GAUSS21:
+ integration_rule = gsl_integration_qk21 ;
+ break ;
+ case GSL_INTEG_GAUSS31:
+ integration_rule = gsl_integration_qk31 ;
+ break ;
+ case GSL_INTEG_GAUSS41:
+ integration_rule = gsl_integration_qk41 ;
+ break ;
+ case GSL_INTEG_GAUSS51:
+ integration_rule = gsl_integration_qk51 ;
+ break ;
+ case GSL_INTEG_GAUSS61:
+ integration_rule = gsl_integration_qk61 ;
+ break ;
+ default:
+ GSL_ERROR("value of key does specify a known integration rule",
+ GSL_EINVAL) ;
+ }
+
+ status = qag (f, a, b, epsabs, epsrel, limit,
+ workspace,
+ result, abserr,
+ integration_rule) ;
+
+ return status ;
+}
+
+static int
+qag (const gsl_function * f,
+ const double a, const double b,
+ const double epsabs, const double epsrel,
+ const size_t limit,
+ gsl_integration_workspace * workspace,
+ double *result, double *abserr,
+ gsl_integration_rule * q)
+{
+ double area, errsum;
+ double result0, abserr0, resabs0, resasc0;
+ double tolerance;
+ size_t iteration = 0;
+ int roundoff_type1 = 0, roundoff_type2 = 0, error_type = 0;
+
+ double round_off;
+
+ /* Initialize results */
+
+ initialise (workspace, a, b);
+
+ *result = 0;
+ *abserr = 0;
+
+ if (limit > workspace->limit)
+ {
+ GSL_ERROR ("iteration limit exceeds available workspace", GSL_EINVAL) ;
+ }
+
+ if (epsabs <= 0 && (epsrel < 50 * GSL_DBL_EPSILON || epsrel < 0.5e-28))
+ {
+ GSL_ERROR ("tolerance cannot be acheived with given epsabs and epsrel",
+ GSL_EBADTOL);
+ }
+
+ /* perform the first integration */
+
+ q (f, a, b, &result0, &abserr0, &resabs0, &resasc0);
+
+ set_initial_result (workspace, result0, abserr0);
+
+ /* Test on accuracy */
+
+ tolerance = GSL_MAX_DBL (epsabs, epsrel * fabs (result0));
+
+ /* need IEEE rounding here to match original quadpack behavior */
+
+ round_off = GSL_COERCE_DBL (50 * GSL_DBL_EPSILON * resabs0);
+
+ if (abserr0 <= round_off && abserr0 > tolerance)
+ {
+ *result = result0;
+ *abserr = abserr0;
+
+ GSL_ERROR ("cannot reach tolerance because of roundoff error "
+ "on first attempt", GSL_EROUND);
+ }
+ else if ((abserr0 <= tolerance && abserr0 != resasc0) || abserr0 == 0.0)
+ {
+ *result = result0;
+ *abserr = abserr0;
+
+ return GSL_SUCCESS;
+ }
+ else if (limit == 1)
+ {
+ *result = result0;
+ *abserr = abserr0;
+
+ GSL_ERROR ("a maximum of one iteration was insufficient", GSL_EMAXITER);
+ }
+
+ area = result0;
+ errsum = abserr0;
+
+ iteration = 1;
+
+ do
+ {
+ double a1, b1, a2, b2;
+ double a_i, b_i, r_i, e_i;
+ double area1 = 0, area2 = 0, area12 = 0;
+ double error1 = 0, error2 = 0, error12 = 0;
+ double resasc1, resasc2;
+ double resabs1, resabs2;
+
+ /* Bisect the subinterval with the largest error estimate */
+
+ retrieve (workspace, &a_i, &b_i, &r_i, &e_i);
+
+ a1 = a_i;
+ b1 = 0.5 * (a_i + b_i);
+ a2 = b1;
+ b2 = b_i;
+
+ q (f, a1, b1, &area1, &error1, &resabs1, &resasc1);
+ q (f, a2, b2, &area2, &error2, &resabs2, &resasc2);
+
+ area12 = area1 + area2;
+ error12 = error1 + error2;
+
+ errsum += (error12 - e_i);
+ area += area12 - r_i;
+
+ if (resasc1 != error1 && resasc2 != error2)
+ {
+ double delta = r_i - area12;
+
+ if (fabs (delta) <= 1.0e-5 * fabs (area12) && error12 >= 0.99 * e_i)
+ {
+ roundoff_type1++;
+ }
+ if (iteration >= 10 && error12 > e_i)
+ {
+ roundoff_type2++;
+ }
+ }
+
+ tolerance = GSL_MAX_DBL (epsabs, epsrel * fabs (area));
+
+ if (errsum > tolerance)
+ {
+ if (roundoff_type1 >= 6 || roundoff_type2 >= 20)
+ {
+ error_type = 2; /* round off error */
+ }
+
+ /* set error flag in the case of bad integrand behaviour at
+ a point of the integration range */
+
+ if (subinterval_too_small (a1, a2, b2))
+ {
+ error_type = 3;
+ }
+ }
+
+ update (workspace, a1, b1, area1, error1, a2, b2, area2, error2);
+
+ retrieve (workspace, &a_i, &b_i, &r_i, &e_i);
+
+ iteration++;
+
+ }
+ while (iteration < limit && !error_type && errsum > tolerance);
+
+ *result = sum_results (workspace);
+ *abserr = errsum;
+
+ if (errsum <= tolerance)
+ {
+ return GSL_SUCCESS;
+ }
+ else if (error_type == 2)
+ {
+ GSL_ERROR ("roundoff error prevents tolerance from being achieved",
+ GSL_EROUND);
+ }
+ else if (error_type == 3)
+ {
+ GSL_ERROR ("bad integrand behavior found in the integration interval",
+ GSL_ESING);
+ }
+ else if (iteration == limit)
+ {
+ GSL_ERROR ("maximum number of subdivisions reached", GSL_EMAXITER);
+ }
+ else
+ {
+ GSL_ERROR ("could not integrate function", GSL_EFAILED);
+ }
+}
+
+
diff --git a/gsl-1.9/integration/qagp.c b/gsl-1.9/integration/qagp.c
new file mode 100644
index 0000000..fc8e039
--- /dev/null
+++ b/gsl-1.9/integration/qagp.c
@@ -0,0 +1,510 @@
+/* integration/qagp.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_integration.h>
+
+static int
+qagp (const gsl_function *f,
+ const double *pts, const size_t npts,
+ const double epsabs, const double epsrel, const size_t limit,
+ gsl_integration_workspace * workspace,
+ double *result, double *abserr,
+ gsl_integration_rule * q);
+
+#include "initialise.c"
+#include "qpsrt.c"
+#include "util.c"
+#include "append.c"
+#include "reset.c"
+#include "qelg.c"
+#include "qpsrt2.c"
+#include "ptsort.c"
+#include "positivity.c"
+
+int
+gsl_integration_qagp (const gsl_function *f,
+ double * pts, size_t npts,
+ double epsabs, double epsrel, size_t limit,
+ gsl_integration_workspace * workspace,
+ double * result, double * abserr)
+{
+ int status = qagp (f, pts, npts,
+ epsabs, epsrel, limit,
+ workspace,
+ result, abserr,
+ &gsl_integration_qk21) ;
+
+ return status ;
+}
+
+
+static int
+qagp (const gsl_function * f,
+ const double *pts, const size_t npts,
+ const double epsabs, const double epsrel,
+ const size_t limit,
+ gsl_integration_workspace * workspace,
+ double *result, double *abserr,
+ gsl_integration_rule * q)
+{
+ double area, errsum;
+ double res_ext, err_ext;
+ double result0, abserr0, resabs0;
+ double tolerance;
+
+ double ertest = 0;
+ double error_over_large_intervals = 0;
+ double reseps = 0, abseps = 0, correc = 0;
+ size_t ktmin = 0;
+ int roundoff_type1 = 0, roundoff_type2 = 0, roundoff_type3 = 0;
+ int error_type = 0, error_type2 = 0;
+
+ size_t iteration = 0;
+
+ int positive_integrand = 0;
+ int extrapolate = 0;
+ int disallow_extrapolation = 0;
+
+ struct extrapolation_table table;
+
+ const size_t nint = npts - 1; /* number of intervals */
+
+ size_t *ndin = workspace->level; /* temporarily alias ndin to level */
+
+ size_t i;
+
+ /* Initialize results */
+
+ *result = 0;
+ *abserr = 0;
+
+ /* Test on validity of parameters */
+
+ if (limit > workspace->limit)
+ {
+ GSL_ERROR ("iteration limit exceeds available workspace", GSL_EINVAL) ;
+ }
+
+ if (npts > workspace->limit)
+ {
+ GSL_ERROR ("npts exceeds size of workspace", GSL_EINVAL);
+ }
+
+ if (epsabs <= 0 && (epsrel < 50 * GSL_DBL_EPSILON || epsrel < 0.5e-28))
+ {
+ GSL_ERROR ("tolerance cannot be acheived with given epsabs and epsrel",
+ GSL_EBADTOL);
+ }
+
+ /* Check that the integration range and break points are an
+ ascending sequence */
+
+ for (i = 0; i < nint; i++)
+ {
+ if (pts[i + 1] < pts[i])
+ {
+ GSL_ERROR ("points are not in an ascending sequence", GSL_EINVAL);
+ }
+ }
+
+ /* Perform the first integration */
+
+ result0 = 0;
+ abserr0 = 0;
+ resabs0 = 0;
+
+ initialise (workspace, 0.0, 0.0) ;
+
+ for (i = 0; i < nint; i++)
+ {
+ double area1, error1, resabs1, resasc1;
+ const double a1 = pts[i];
+ const double b1 = pts[i + 1];
+
+ q (f, a1, b1, &area1, &error1, &resabs1, &resasc1);
+
+ result0 = result0 + area1;
+ abserr0 = abserr0 + error1;
+ resabs0 = resabs0 + resabs1;
+
+ append_interval (workspace, a1, b1, area1, error1);
+
+ if (error1 == resasc1 && error1 != 0.0)
+ {
+ ndin[i] = 1;
+ }
+ else
+ {
+ ndin[i] = 0;
+ }
+ }
+
+ /* Compute the initial error estimate */
+
+ errsum = 0.0;
+
+ for (i = 0; i < nint; i++)
+ {
+ if (ndin[i])
+ {
+ workspace->elist[i] = abserr0;
+ }
+
+ errsum = errsum + workspace->elist[i];
+
+ }
+
+ for (i = 0; i < nint; i++)
+ {
+ workspace->level[i] = 0;
+ }
+
+ /* Sort results into order of decreasing error via the indirection
+ array order[] */
+
+ sort_results (workspace);
+
+ /* Test on accuracy */
+
+ tolerance = GSL_MAX_DBL (epsabs, epsrel * fabs (result0));
+
+ if (abserr0 <= 100 * GSL_DBL_EPSILON * resabs0 && abserr0 > tolerance)
+ {
+ *result = result0;
+ *abserr = abserr0;
+
+ GSL_ERROR ("cannot reach tolerance because of roundoff error"
+ "on first attempt", GSL_EROUND);
+ }
+ else if (abserr0 <= tolerance)
+ {
+ *result = result0;
+ *abserr = abserr0;
+
+ return GSL_SUCCESS;
+ }
+ else if (limit == 1)
+ {
+ *result = result0;
+ *abserr = abserr0;
+
+ GSL_ERROR ("a maximum of one iteration was insufficient", GSL_EMAXITER);
+ }
+
+ /* Initialization */
+
+ initialise_table (&table);
+ append_table (&table, result0);
+
+ area = result0;
+
+ res_ext = result0;
+ err_ext = GSL_DBL_MAX;
+
+ error_over_large_intervals = errsum;
+ ertest = tolerance;
+
+ positive_integrand = test_positivity (result0, resabs0);
+
+ iteration = nint - 1;
+
+ do
+ {
+ size_t current_level;
+ double a1, b1, a2, b2;
+ double a_i, b_i, r_i, e_i;
+ double area1 = 0, area2 = 0, area12 = 0;
+ double error1 = 0, error2 = 0, error12 = 0;
+ double resasc1, resasc2;
+ double resabs1, resabs2;
+ double last_e_i;
+
+ /* Bisect the subinterval with the largest error estimate */
+
+ retrieve (workspace, &a_i, &b_i, &r_i, &e_i);
+
+ current_level = workspace->level[workspace->i] + 1;
+
+ a1 = a_i;
+ b1 = 0.5 * (a_i + b_i);
+ a2 = b1;
+ b2 = b_i;
+
+ iteration++;
+
+ q (f, a1, b1, &area1, &error1, &resabs1, &resasc1);
+ q (f, a2, b2, &area2, &error2, &resabs2, &resasc2);
+
+ area12 = area1 + area2;
+ error12 = error1 + error2;
+ last_e_i = e_i;
+
+ /* Improve previous approximations to the integral and test for
+ accuracy.
+
+ We write these expressions in the same way as the original
+ QUADPACK code so that the rounding errors are the same, which
+ makes testing easier. */
+
+ errsum = errsum + error12 - e_i;
+ area = area + area12 - r_i;
+
+ tolerance = GSL_MAX_DBL (epsabs, epsrel * fabs (area));
+
+ if (resasc1 != error1 && resasc2 != error2)
+ {
+ double delta = r_i - area12;
+
+ if (fabs (delta) <= 1.0e-5 * fabs (area12) && error12 >= 0.99 * e_i)
+ {
+ if (!extrapolate)
+ {
+ roundoff_type1++;
+ }
+ else
+ {
+ roundoff_type2++;
+ }
+ }
+
+ if (i > 10 && error12 > e_i)
+ {
+ roundoff_type3++;
+ }
+ }
+
+ /* Test for roundoff and eventually set error flag */
+
+ if (roundoff_type1 + roundoff_type2 >= 10 || roundoff_type3 >= 20)
+ {
+ error_type = 2; /* round off error */
+ }
+
+ if (roundoff_type2 >= 5)
+ {
+ error_type2 = 1;
+ }
+
+ /* set error flag in the case of bad integrand behaviour at
+ a point of the integration range */
+
+ if (subinterval_too_small (a1, a2, b2))
+ {
+ error_type = 4;
+ }
+
+ /* append the newly-created intervals to the list */
+
+ update (workspace, a1, b1, area1, error1, a2, b2, area2, error2);
+
+ if (errsum <= tolerance)
+ {
+ goto compute_result;
+ }
+
+ if (error_type)
+ {
+ break;
+ }
+
+ if (iteration >= limit - 1)
+ {
+ error_type = 1;
+ break;
+ }
+
+ if (disallow_extrapolation)
+ {
+ continue;
+ }
+
+ error_over_large_intervals += -last_e_i;
+
+ if (current_level < workspace->maximum_level)
+ {
+ error_over_large_intervals += error12;
+ }
+
+ if (!extrapolate)
+ {
+ /* test whether the interval to be bisected next is the
+ smallest interval. */
+ if (large_interval (workspace))
+ continue;
+
+ extrapolate = 1;
+ workspace->nrmax = 1;
+ }
+
+ /* The smallest interval has the largest error. Before
+ bisecting decrease the sum of the errors over the larger
+ intervals (error_over_large_intervals) and perform
+ extrapolation. */
+
+ if (!error_type2 && error_over_large_intervals > ertest)
+ {
+ if (increase_nrmax (workspace))
+ continue;
+ }
+
+ /* Perform extrapolation */
+
+ append_table (&table, area);
+
+ if (table.n < 3)
+ {
+ goto skip_extrapolation;
+ }
+
+ qelg (&table, &reseps, &abseps);
+
+ ktmin++;
+
+ if (ktmin > 5 && err_ext < 0.001 * errsum)
+ {
+ error_type = 5;
+ }
+
+ if (abseps < err_ext)
+ {
+ ktmin = 0;
+ err_ext = abseps;
+ res_ext = reseps;
+ correc = error_over_large_intervals;
+ ertest = GSL_MAX_DBL (epsabs, epsrel * fabs (reseps));
+ if (err_ext <= ertest)
+ break;
+ }
+
+ /* Prepare bisection of the smallest interval. */
+
+ if (table.n == 1)
+ {
+ disallow_extrapolation = 1;
+ }
+
+ if (error_type == 5)
+ {
+ break;
+ }
+
+ skip_extrapolation:
+
+ reset_nrmax (workspace);
+ extrapolate = 0;
+ error_over_large_intervals = errsum;
+
+ }
+ while (iteration < limit);
+
+ *result = res_ext;
+ *abserr = err_ext;
+
+ if (err_ext == GSL_DBL_MAX)
+ goto compute_result;
+
+ if (error_type || error_type2)
+ {
+ if (error_type2)
+ {
+ err_ext += correc;
+ }
+
+ if (error_type == 0)
+ error_type = 3;
+
+ if (result != 0 && area != 0)
+ {
+ if (err_ext / fabs (res_ext) > errsum / fabs (area))
+ goto compute_result;
+ }
+ else if (err_ext > errsum)
+ {
+ goto compute_result;
+ }
+ else if (area == 0.0)
+ {
+ goto return_error;
+ }
+ }
+
+ /* Test on divergence. */
+
+ {
+ double max_area = GSL_MAX_DBL (fabs (res_ext), fabs (area));
+
+ if (!positive_integrand && max_area < 0.01 * resabs0)
+ goto return_error;
+ }
+
+ {
+ double ratio = res_ext / area;
+
+ if (ratio < 0.01 || ratio > 100 || errsum > fabs (area))
+ error_type = 6;
+ }
+
+ goto return_error;
+
+compute_result:
+
+ *result = sum_results (workspace);
+ *abserr = errsum;
+
+return_error:
+
+ if (error_type > 2)
+ error_type--;
+
+ if (error_type == 0)
+ {
+ return GSL_SUCCESS;
+ }
+ else if (error_type == 1)
+ {
+ GSL_ERROR ("number of iterations was insufficient", GSL_EMAXITER);
+ }
+ else if (error_type == 2)
+ {
+ GSL_ERROR ("cannot reach tolerance because of roundoff error",
+ GSL_EROUND);
+ }
+ else if (error_type == 3)
+ {
+ GSL_ERROR ("bad integrand behavior found in the integration interval",
+ GSL_ESING);
+ }
+ else if (error_type == 4)
+ {
+ GSL_ERROR ("roundoff error detected in the extrapolation table",
+ GSL_EROUND);
+ }
+ else if (error_type == 5)
+ {
+ GSL_ERROR ("integral is divergent, or slowly convergent",
+ GSL_EDIVERGE);
+ }
+ else
+ {
+ GSL_ERROR ("could not integrate function", GSL_EFAILED);
+ }
+}
diff --git a/gsl-1.9/integration/qags.c b/gsl-1.9/integration/qags.c
new file mode 100644
index 0000000..903acc1
--- /dev/null
+++ b/gsl-1.9/integration/qags.c
@@ -0,0 +1,570 @@
+/* integration/qags.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_integration.h>
+
+#include "initialise.c"
+#include "set_initial.c"
+#include "qpsrt.c"
+#include "util.c"
+#include "reset.c"
+#include "qpsrt2.c"
+#include "qelg.c"
+#include "positivity.c"
+
+static int qags (const gsl_function * f, const double a, const double
+ b, const double epsabs, const double epsrel, const size_t limit,
+ gsl_integration_workspace * workspace, double *result, double *abserr,
+ gsl_integration_rule * q);
+
+int
+gsl_integration_qags (const gsl_function *f,
+ double a, double b,
+ double epsabs, double epsrel, size_t limit,
+ gsl_integration_workspace * workspace,
+ double * result, double * abserr)
+{
+ int status = qags (f, a, b, epsabs, epsrel, limit,
+ workspace,
+ result, abserr,
+ &gsl_integration_qk21) ;
+ return status ;
+}
+
+/* QAGI: evaluate an integral over an infinite range using the
+ transformation
+
+ integrate(f(x),-Inf,Inf) = integrate((f((1-t)/t) + f(-(1-t)/t))/t^2,0,1)
+
+ */
+
+static double i_transform (double t, void *params);
+
+int
+gsl_integration_qagi (gsl_function * f,
+ double epsabs, double epsrel, size_t limit,
+ gsl_integration_workspace * workspace,
+ double *result, double *abserr)
+{
+ int status;
+
+ gsl_function f_transform;
+
+ f_transform.function = &i_transform;
+ f_transform.params = f;
+
+ status = qags (&f_transform, 0.0, 1.0,
+ epsabs, epsrel, limit,
+ workspace,
+ result, abserr,
+ &gsl_integration_qk15);
+
+ return status;
+}
+
+static double
+i_transform (double t, void *params)
+{
+ gsl_function *f = (gsl_function *) params;
+ double x = (1 - t) / t;
+ double y = GSL_FN_EVAL (f, x) + GSL_FN_EVAL (f, -x);
+ return (y / t) / t;
+}
+
+
+/* QAGIL: Evaluate an integral over an infinite range using the
+ transformation,
+
+ integrate(f(x),-Inf,b) = integrate(f(b-(1-t)/t)/t^2,0,1)
+
+ */
+
+struct il_params { double b ; gsl_function * f ; } ;
+
+static double il_transform (double t, void *params);
+
+int
+gsl_integration_qagil (gsl_function * f,
+ double b,
+ double epsabs, double epsrel, size_t limit,
+ gsl_integration_workspace * workspace,
+ double *result, double *abserr)
+{
+ int status;
+
+ gsl_function f_transform;
+ struct il_params transform_params ;
+
+ transform_params.b = b ;
+ transform_params.f = f ;
+
+ f_transform.function = &il_transform;
+ f_transform.params = &transform_params;
+
+ status = qags (&f_transform, 0.0, 1.0,
+ epsabs, epsrel, limit,
+ workspace,
+ result, abserr,
+ &gsl_integration_qk15);
+
+ return status;
+}
+
+static double
+il_transform (double t, void *params)
+{
+ struct il_params *p = (struct il_params *) params;
+ double b = p->b;
+ gsl_function * f = p->f;
+ double x = b - (1 - t) / t;
+ double y = GSL_FN_EVAL (f, x);
+ return (y / t) / t;
+}
+
+/* QAGIU: Evaluate an integral over an infinite range using the
+ transformation
+
+ integrate(f(x),a,Inf) = integrate(f(a+(1-t)/t)/t^2,0,1)
+
+ */
+
+struct iu_params { double a ; gsl_function * f ; } ;
+
+static double iu_transform (double t, void *params);
+
+int
+gsl_integration_qagiu (gsl_function * f,
+ double a,
+ double epsabs, double epsrel, size_t limit,
+ gsl_integration_workspace * workspace,
+ double *result, double *abserr)
+{
+ int status;
+
+ gsl_function f_transform;
+ struct iu_params transform_params ;
+
+ transform_params.a = a ;
+ transform_params.f = f ;
+
+ f_transform.function = &iu_transform;
+ f_transform.params = &transform_params;
+
+ status = qags (&f_transform, 0.0, 1.0,
+ epsabs, epsrel, limit,
+ workspace,
+ result, abserr,
+ &gsl_integration_qk15);
+
+ return status;
+}
+
+static double
+iu_transform (double t, void *params)
+{
+ struct iu_params *p = (struct iu_params *) params;
+ double a = p->a;
+ gsl_function * f = p->f;
+ double x = a + (1 - t) / t;
+ double y = GSL_FN_EVAL (f, x);
+ return (y / t) / t;
+}
+
+/* Main integration function */
+
+static int
+qags (const gsl_function * f,
+ const double a, const double b,
+ const double epsabs, const double epsrel,
+ const size_t limit,
+ gsl_integration_workspace * workspace,
+ double *result, double *abserr,
+ gsl_integration_rule * q)
+{
+ double area, errsum;
+ double res_ext, err_ext;
+ double result0, abserr0, resabs0, resasc0;
+ double tolerance;
+
+ double ertest = 0;
+ double error_over_large_intervals = 0;
+ double reseps = 0, abseps = 0, correc = 0;
+ size_t ktmin = 0;
+ int roundoff_type1 = 0, roundoff_type2 = 0, roundoff_type3 = 0;
+ int error_type = 0, error_type2 = 0;
+
+ size_t iteration = 0;
+
+ int positive_integrand = 0;
+ int extrapolate = 0;
+ int disallow_extrapolation = 0;
+
+ struct extrapolation_table table;
+
+ /* Initialize results */
+
+ initialise (workspace, a, b);
+
+ *result = 0;
+ *abserr = 0;
+
+ if (limit > workspace->limit)
+ {
+ GSL_ERROR ("iteration limit exceeds available workspace", GSL_EINVAL) ;
+ }
+
+ /* Test on accuracy */
+
+ if (epsabs <= 0 && (epsrel < 50 * GSL_DBL_EPSILON || epsrel < 0.5e-28))
+ {
+ GSL_ERROR ("tolerance cannot be acheived with given epsabs and epsrel",
+ GSL_EBADTOL);
+ }
+
+ /* Perform the first integration */
+
+ q (f, a, b, &result0, &abserr0, &resabs0, &resasc0);
+
+ set_initial_result (workspace, result0, abserr0);
+
+ tolerance = GSL_MAX_DBL (epsabs, epsrel * fabs (result0));
+
+ if (abserr0 <= 100 * GSL_DBL_EPSILON * resabs0 && abserr0 > tolerance)
+ {
+ *result = result0;
+ *abserr = abserr0;
+
+ GSL_ERROR ("cannot reach tolerance because of roundoff error"
+ "on first attempt", GSL_EROUND);
+ }
+ else if ((abserr0 <= tolerance && abserr0 != resasc0) || abserr0 == 0.0)
+ {
+ *result = result0;
+ *abserr = abserr0;
+
+ return GSL_SUCCESS;
+ }
+ else if (limit == 1)
+ {
+ *result = result0;
+ *abserr = abserr0;
+
+ GSL_ERROR ("a maximum of one iteration was insufficient", GSL_EMAXITER);
+ }
+
+ /* Initialization */
+
+ initialise_table (&table);
+ append_table (&table, result0);
+
+ area = result0;
+ errsum = abserr0;
+
+ res_ext = result0;
+ err_ext = GSL_DBL_MAX;
+
+ positive_integrand = test_positivity (result0, resabs0);
+
+ iteration = 1;
+
+ do
+ {
+ size_t current_level;
+ double a1, b1, a2, b2;
+ double a_i, b_i, r_i, e_i;
+ double area1 = 0, area2 = 0, area12 = 0;
+ double error1 = 0, error2 = 0, error12 = 0;
+ double resasc1, resasc2;
+ double resabs1, resabs2;
+ double last_e_i;
+
+ /* Bisect the subinterval with the largest error estimate */
+
+ retrieve (workspace, &a_i, &b_i, &r_i, &e_i);
+
+ current_level = workspace->level[workspace->i] + 1;
+
+ a1 = a_i;
+ b1 = 0.5 * (a_i + b_i);
+ a2 = b1;
+ b2 = b_i;
+
+ iteration++;
+
+ q (f, a1, b1, &area1, &error1, &resabs1, &resasc1);
+ q (f, a2, b2, &area2, &error2, &resabs2, &resasc2);
+
+ area12 = area1 + area2;
+ error12 = error1 + error2;
+ last_e_i = e_i;
+
+ /* Improve previous approximations to the integral and test for
+ accuracy.
+
+ We write these expressions in the same way as the original
+ QUADPACK code so that the rounding errors are the same, which
+ makes testing easier. */
+
+ errsum = errsum + error12 - e_i;
+ area = area + area12 - r_i;
+
+ tolerance = GSL_MAX_DBL (epsabs, epsrel * fabs (area));
+
+ if (resasc1 != error1 && resasc2 != error2)
+ {
+ double delta = r_i - area12;
+
+ if (fabs (delta) <= 1.0e-5 * fabs (area12) && error12 >= 0.99 * e_i)
+ {
+ if (!extrapolate)
+ {
+ roundoff_type1++;
+ }
+ else
+ {
+ roundoff_type2++;
+ }
+ }
+ if (iteration > 10 && error12 > e_i)
+ {
+ roundoff_type3++;
+ }
+ }
+
+ /* Test for roundoff and eventually set error flag */
+
+ if (roundoff_type1 + roundoff_type2 >= 10 || roundoff_type3 >= 20)
+ {
+ error_type = 2; /* round off error */
+ }
+
+ if (roundoff_type2 >= 5)
+ {
+ error_type2 = 1;
+ }
+
+ /* set error flag in the case of bad integrand behaviour at
+ a point of the integration range */
+
+ if (subinterval_too_small (a1, a2, b2))
+ {
+ error_type = 4;
+ }
+
+ /* append the newly-created intervals to the list */
+
+ update (workspace, a1, b1, area1, error1, a2, b2, area2, error2);
+
+ if (errsum <= tolerance)
+ {
+ goto compute_result;
+ }
+
+ if (error_type)
+ {
+ break;
+ }
+
+ if (iteration >= limit - 1)
+ {
+ error_type = 1;
+ break;
+ }
+
+ if (iteration == 2) /* set up variables on first iteration */
+ {
+ error_over_large_intervals = errsum;
+ ertest = tolerance;
+ append_table (&table, area);
+ continue;
+ }
+
+ if (disallow_extrapolation)
+ {
+ continue;
+ }
+
+ error_over_large_intervals += -last_e_i;
+
+ if (current_level < workspace->maximum_level)
+ {
+ error_over_large_intervals += error12;
+ }
+
+ if (!extrapolate)
+ {
+ /* test whether the interval to be bisected next is the
+ smallest interval. */
+
+ if (large_interval (workspace))
+ continue;
+
+ extrapolate = 1;
+ workspace->nrmax = 1;
+ }
+
+ if (!error_type2 && error_over_large_intervals > ertest)
+ {
+ if (increase_nrmax (workspace))
+ continue;
+ }
+
+ /* Perform extrapolation */
+
+ append_table (&table, area);
+
+ qelg (&table, &reseps, &abseps);
+
+ ktmin++;
+
+ if (ktmin > 5 && err_ext < 0.001 * errsum)
+ {
+ error_type = 5;
+ }
+
+ if (abseps < err_ext)
+ {
+ ktmin = 0;
+ err_ext = abseps;
+ res_ext = reseps;
+ correc = error_over_large_intervals;
+ ertest = GSL_MAX_DBL (epsabs, epsrel * fabs (reseps));
+ if (err_ext <= ertest)
+ break;
+ }
+
+ /* Prepare bisection of the smallest interval. */
+
+ if (table.n == 1)
+ {
+ disallow_extrapolation = 1;
+ }
+
+ if (error_type == 5)
+ {
+ break;
+ }
+
+ /* work on interval with largest error */
+
+ reset_nrmax (workspace);
+ extrapolate = 0;
+ error_over_large_intervals = errsum;
+
+ }
+ while (iteration < limit);
+
+ *result = res_ext;
+ *abserr = err_ext;
+
+ if (err_ext == GSL_DBL_MAX)
+ goto compute_result;
+
+ if (error_type || error_type2)
+ {
+ if (error_type2)
+ {
+ err_ext += correc;
+ }
+
+ if (error_type == 0)
+ error_type = 3;
+
+ if (res_ext != 0.0 && area != 0.0)
+ {
+ if (err_ext / fabs (res_ext) > errsum / fabs (area))
+ goto compute_result;
+ }
+ else if (err_ext > errsum)
+ {
+ goto compute_result;
+ }
+ else if (area == 0.0)
+ {
+ goto return_error;
+ }
+ }
+
+ /* Test on divergence. */
+
+ {
+ double max_area = GSL_MAX_DBL (fabs (res_ext), fabs (area));
+
+ if (!positive_integrand && max_area < 0.01 * resabs0)
+ goto return_error;
+ }
+
+ {
+ double ratio = res_ext / area;
+
+ if (ratio < 0.01 || ratio > 100.0 || errsum > fabs (area))
+ error_type = 6;
+ }
+
+ goto return_error;
+
+compute_result:
+
+ *result = sum_results (workspace);
+ *abserr = errsum;
+
+return_error:
+
+ if (error_type > 2)
+ error_type--;
+
+
+
+ if (error_type == 0)
+ {
+ return GSL_SUCCESS;
+ }
+ else if (error_type == 1)
+ {
+ GSL_ERROR ("number of iterations was insufficient", GSL_EMAXITER);
+ }
+ else if (error_type == 2)
+ {
+ GSL_ERROR ("cannot reach tolerance because of roundoff error",
+ GSL_EROUND);
+ }
+ else if (error_type == 3)
+ {
+ GSL_ERROR ("bad integrand behavior found in the integration interval",
+ GSL_ESING);
+ }
+ else if (error_type == 4)
+ {
+ GSL_ERROR ("roundoff error detected in the extrapolation table",
+ GSL_EROUND);
+ }
+ else if (error_type == 5)
+ {
+ GSL_ERROR ("integral is divergent, or slowly convergent",
+ GSL_EDIVERGE);
+ }
+ else
+ {
+ GSL_ERROR ("could not integrate function", GSL_EFAILED);
+ }
+
+}
diff --git a/gsl-1.9/integration/qawc.c b/gsl-1.9/integration/qawc.c
new file mode 100644
index 0000000..4e781d1
--- /dev/null
+++ b/gsl-1.9/integration/qawc.c
@@ -0,0 +1,220 @@
+/* integration/qawc.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <float.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_integration.h>
+
+#include "initialise.c"
+#include "set_initial.c"
+#include "qpsrt.c"
+#include "util.c"
+#include "qc25c.c"
+
+int
+gsl_integration_qawc (gsl_function * f,
+ const double a, const double b, const double c,
+ const double epsabs, const double epsrel,
+ const size_t limit,
+ gsl_integration_workspace * workspace,
+ double *result, double *abserr)
+{
+ double area, errsum;
+ double result0, abserr0;
+ double tolerance;
+ size_t iteration = 0;
+ int roundoff_type1 = 0, roundoff_type2 = 0, error_type = 0;
+ int err_reliable;
+ int sign = 1;
+ double lower, higher;
+
+ /* Initialize results */
+
+ *result = 0;
+ *abserr = 0;
+
+ if (limit > workspace->limit)
+ {
+ GSL_ERROR ("iteration limit exceeds available workspace", GSL_EINVAL) ;
+ }
+
+ if (b < a)
+ {
+ lower = b ;
+ higher = a ;
+ sign = -1 ;
+ }
+ else
+ {
+ lower = a;
+ higher = b;
+ }
+
+ initialise (workspace, lower, higher);
+
+ if (epsabs <= 0 && (epsrel < 50 * GSL_DBL_EPSILON || epsrel < 0.5e-28))
+ {
+ GSL_ERROR ("tolerance cannot be acheived with given epsabs and epsrel",
+ GSL_EBADTOL);
+ }
+
+ if (c == a || c == b)
+ {
+ GSL_ERROR ("cannot integrate with singularity on endpoint", GSL_EINVAL);
+ }
+
+ /* perform the first integration */
+
+ qc25c (f, lower, higher, c, &result0, &abserr0, &err_reliable);
+
+ set_initial_result (workspace, result0, abserr0);
+
+ /* Test on accuracy, use 0.01 relative error as an extra safety
+ margin on the first iteration (ignored for subsequent iterations) */
+
+ tolerance = GSL_MAX_DBL (epsabs, epsrel * fabs (result0));
+
+ if (abserr0 < tolerance && abserr0 < 0.01 * fabs(result0))
+ {
+ *result = sign * result0;
+ *abserr = abserr0;
+
+ return GSL_SUCCESS;
+ }
+ else if (limit == 1)
+ {
+ *result = sign * result0;
+ *abserr = abserr0;
+
+ GSL_ERROR ("a maximum of one iteration was insufficient", GSL_EMAXITER);
+ }
+
+ area = result0;
+ errsum = abserr0;
+
+ iteration = 1;
+
+ do
+ {
+ double a1, b1, a2, b2;
+ double a_i, b_i, r_i, e_i;
+ double area1 = 0, area2 = 0, area12 = 0;
+ double error1 = 0, error2 = 0, error12 = 0;
+ int err_reliable1, err_reliable2;
+
+ /* Bisect the subinterval with the largest error estimate */
+
+ retrieve (workspace, &a_i, &b_i, &r_i, &e_i);
+
+ a1 = a_i;
+ b1 = 0.5 * (a_i + b_i);
+ a2 = b1;
+ b2 = b_i;
+
+ if (c > a1 && c <= b1)
+ {
+ b1 = 0.5 * (c + b2) ;
+ a2 = b1;
+ }
+ else if (c > b1 && c < b2)
+ {
+ b1 = 0.5 * (a1 + c) ;
+ a2 = b1;
+ }
+
+ qc25c (f, a1, b1, c, &area1, &error1, &err_reliable1);
+ qc25c (f, a2, b2, c, &area2, &error2, &err_reliable2);
+
+ area12 = area1 + area2;
+ error12 = error1 + error2;
+
+ errsum += (error12 - e_i);
+ area += area12 - r_i;
+
+ if (err_reliable1 && err_reliable2)
+ {
+ double delta = r_i - area12;
+
+ if (fabs (delta) <= 1.0e-5 * fabs (area12) && error12 >= 0.99 * e_i)
+ {
+ roundoff_type1++;
+ }
+ if (iteration >= 10 && error12 > e_i)
+ {
+ roundoff_type2++;
+ }
+ }
+
+ tolerance = GSL_MAX_DBL (epsabs, epsrel * fabs (area));
+
+ if (errsum > tolerance)
+ {
+ if (roundoff_type1 >= 6 || roundoff_type2 >= 20)
+ {
+ error_type = 2; /* round off error */
+ }
+
+ /* set error flag in the case of bad integrand behaviour at
+ a point of the integration range */
+
+ if (subinterval_too_small (a1, a2, b2))
+ {
+ error_type = 3;
+ }
+ }
+
+ update (workspace, a1, b1, area1, error1, a2, b2, area2, error2);
+
+ retrieve (workspace, &a_i, &b_i, &r_i, &e_i);
+
+ iteration++;
+
+ }
+ while (iteration < limit && !error_type && errsum > tolerance);
+
+ *result = sign * sum_results (workspace);
+ *abserr = errsum;
+
+ if (errsum <= tolerance)
+ {
+ return GSL_SUCCESS;
+ }
+ else if (error_type == 2)
+ {
+ GSL_ERROR ("roundoff error prevents tolerance from being achieved",
+ GSL_EROUND);
+ }
+ else if (error_type == 3)
+ {
+ GSL_ERROR ("bad integrand behavior found in the integration interval",
+ GSL_ESING);
+ }
+ else if (iteration == limit)
+ {
+ GSL_ERROR ("maximum number of subdivisions reached", GSL_EMAXITER);
+ }
+ else
+ {
+ GSL_ERROR ("could not integrate function", GSL_EFAILED);
+ }
+
+}
diff --git a/gsl-1.9/integration/qawf.c b/gsl-1.9/integration/qawf.c
new file mode 100644
index 0000000..ba72f53
--- /dev/null
+++ b/gsl-1.9/integration/qawf.c
@@ -0,0 +1,281 @@
+/* integration/qawf.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <float.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_integration.h>
+
+#include "initialise.c"
+#include "append.c"
+#include "qelg.c"
+
+int
+gsl_integration_qawf (gsl_function * f,
+ const double a,
+ const double epsabs,
+ const size_t limit,
+ gsl_integration_workspace * workspace,
+ gsl_integration_workspace * cycle_workspace,
+ gsl_integration_qawo_table * wf,
+ double *result, double *abserr)
+{
+ double area, errsum;
+ double res_ext, err_ext;
+ double correc, total_error = 0.0, truncation_error;
+
+ size_t ktmin = 0;
+ size_t iteration = 0;
+
+ struct extrapolation_table table;
+
+ double cycle;
+ double omega = wf->omega;
+
+ const double p = 0.9;
+ double factor = 1;
+ double initial_eps, eps;
+ int error_type = 0;
+
+ /* Initialize results */
+
+ initialise (workspace, a, a);
+
+ *result = 0;
+ *abserr = 0;
+
+ if (limit > workspace->limit)
+ {
+ GSL_ERROR ("iteration limit exceeds available workspace", GSL_EINVAL) ;
+ }
+
+ /* Test on accuracy */
+
+ if (epsabs <= 0)
+ {
+ GSL_ERROR ("absolute tolerance epsabs must be positive", GSL_EBADTOL) ;
+ }
+
+ if (omega == 0.0)
+ {
+ if (wf->sine == GSL_INTEG_SINE)
+ {
+ /* The function sin(w x) f(x) is always zero for w = 0 */
+
+ *result = 0;
+ *abserr = 0;
+
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ /* The function cos(w x) f(x) is always f(x) for w = 0 */
+
+ int status = gsl_integration_qagiu (f, a, epsabs, 0.0,
+ cycle_workspace->limit,
+ cycle_workspace,
+ result, abserr);
+ return status;
+ }
+ }
+
+ if (epsabs > GSL_DBL_MIN / (1 - p))
+ {
+ eps = epsabs * (1 - p);
+ }
+ else
+ {
+ eps = epsabs;
+ }
+
+ initial_eps = eps;
+
+ area = 0;
+ errsum = 0;
+
+ res_ext = 0;
+ err_ext = GSL_DBL_MAX;
+ correc = 0;
+
+ cycle = (2 * floor (fabs (omega)) + 1) * M_PI / fabs (omega);
+
+ gsl_integration_qawo_table_set_length (wf, cycle);
+
+ initialise_table (&table);
+
+ for (iteration = 0; iteration < limit; iteration++)
+ {
+ double area1, error1, reseps, erreps;
+
+ double a1 = a + iteration * cycle;
+ double b1 = a1 + cycle;
+
+ double epsabs1 = eps * factor;
+
+ int status = gsl_integration_qawo (f, a1, epsabs1, 0.0, limit,
+ cycle_workspace, wf,
+ &area1, &error1);
+
+ append_interval (workspace, a1, b1, area1, error1);
+
+ factor *= p;
+
+ area = area + area1;
+ errsum = errsum + error1;
+
+ /* estimate the truncation error as 50 times the final term */
+
+ truncation_error = 50 * fabs (area1);
+
+ total_error = errsum + truncation_error;
+
+ if (total_error < epsabs && iteration > 4)
+ {
+ goto compute_result;
+ }
+
+ if (error1 > correc)
+ {
+ correc = error1;
+ }
+
+ if (status)
+ {
+ eps = GSL_MAX_DBL (initial_eps, correc * (1.0 - p));
+ }
+
+ if (status && total_error < 10 * correc && iteration > 3)
+ {
+ goto compute_result;
+ }
+
+ append_table (&table, area);
+
+ if (table.n < 2)
+ {
+ continue;
+ }
+
+ qelg (&table, &reseps, &erreps);
+
+ ktmin++;
+
+ if (ktmin >= 15 && err_ext < 0.001 * total_error)
+ {
+ error_type = 4;
+ }
+
+ if (erreps < err_ext)
+ {
+ ktmin = 0;
+ err_ext = erreps;
+ res_ext = reseps;
+
+ if (err_ext + 10 * correc <= epsabs)
+ break;
+ if (err_ext <= epsabs && 10 * correc >= epsabs)
+ break;
+ }
+
+ }
+
+ if (iteration == limit)
+ error_type = 1;
+
+ if (err_ext == GSL_DBL_MAX)
+ goto compute_result;
+
+ err_ext = err_ext + 10 * correc;
+
+ *result = res_ext;
+ *abserr = err_ext;
+
+ if (error_type == 0)
+ {
+ return GSL_SUCCESS ;
+ }
+
+ if (res_ext != 0.0 && area != 0.0)
+ {
+ if (err_ext / fabs (res_ext) > errsum / fabs (area))
+ goto compute_result;
+ }
+ else if (err_ext > errsum)
+ {
+ goto compute_result;
+ }
+ else if (area == 0.0)
+ {
+ goto return_error;
+ }
+
+ if (error_type == 4)
+ {
+ err_ext = err_ext + truncation_error;
+ }
+
+ goto return_error;
+
+compute_result:
+
+ *result = area;
+ *abserr = total_error;
+
+return_error:
+
+ if (error_type > 2)
+ error_type--;
+
+ if (error_type == 0)
+ {
+ return GSL_SUCCESS;
+ }
+ else if (error_type == 1)
+ {
+ GSL_ERROR ("number of iterations was insufficient", GSL_EMAXITER);
+ }
+ else if (error_type == 2)
+ {
+ GSL_ERROR ("cannot reach tolerance because of roundoff error",
+ GSL_EROUND);
+ }
+ else if (error_type == 3)
+ {
+ GSL_ERROR ("bad integrand behavior found in the integration interval",
+ GSL_ESING);
+ }
+ else if (error_type == 4)
+ {
+ GSL_ERROR ("roundoff error detected in the extrapolation table",
+ GSL_EROUND);
+ }
+ else if (error_type == 5)
+ {
+ GSL_ERROR ("integral is divergent, or slowly convergent",
+ GSL_EDIVERGE);
+ }
+ else
+ {
+ GSL_ERROR ("could not integrate function", GSL_EFAILED);
+ }
+
+}
+
diff --git a/gsl-1.9/integration/qawo.c b/gsl-1.9/integration/qawo.c
new file mode 100644
index 0000000..dc0db8c
--- /dev/null
+++ b/gsl-1.9/integration/qawo.c
@@ -0,0 +1,460 @@
+/* integration/qawo.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <float.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_integration.h>
+
+#include "initialise.c"
+#include "set_initial.c"
+#include "reset.c"
+#include "qpsrt.c"
+#include "util.c"
+#include "qpsrt2.c"
+#include "qelg.c"
+#include "positivity.c"
+
+#include "qc25f.c"
+
+int
+gsl_integration_qawo (gsl_function * f,
+ const double a,
+ const double epsabs, const double epsrel,
+ const size_t limit,
+ gsl_integration_workspace * workspace,
+ gsl_integration_qawo_table * wf,
+ double *result, double *abserr)
+{
+ double area, errsum;
+ double res_ext, err_ext;
+ double result0, abserr0, resabs0, resasc0;
+ double tolerance;
+
+ double ertest = 0;
+ double error_over_large_intervals = 0;
+ double reseps = 0, abseps = 0, correc = 0;
+ size_t ktmin = 0;
+ int roundoff_type1 = 0, roundoff_type2 = 0, roundoff_type3 = 0;
+ int error_type = 0, error_type2 = 0;
+
+ size_t iteration = 0;
+
+ int positive_integrand = 0;
+ int extrapolate = 0;
+ int extall = 0;
+ int disallow_extrapolation = 0;
+
+ struct extrapolation_table table;
+
+ double b = a + wf->L ;
+ double abs_omega = fabs (wf->omega) ;
+
+ /* Initialize results */
+
+ initialise (workspace, a, b);
+
+ *result = 0;
+ *abserr = 0;
+
+ if (limit > workspace->limit)
+ {
+ GSL_ERROR ("iteration limit exceeds available workspace", GSL_EINVAL) ;
+ }
+
+ /* Test on accuracy */
+
+ if (epsabs <= 0 && (epsrel < 50 * GSL_DBL_EPSILON || epsrel < 0.5e-28))
+ {
+ GSL_ERROR ("tolerance cannot be acheived with given epsabs and epsrel",
+ GSL_EBADTOL);
+ }
+
+ /* Perform the first integration */
+
+ qc25f (f, a, b, wf, 0, &result0, &abserr0, &resabs0, &resasc0);
+
+ set_initial_result (workspace, result0, abserr0);
+
+ tolerance = GSL_MAX_DBL (epsabs, epsrel * fabs (result0));
+
+ if (abserr0 <= 100 * GSL_DBL_EPSILON * resabs0 && abserr0 > tolerance)
+ {
+ *result = result0;
+ *abserr = abserr0;
+
+ GSL_ERROR ("cannot reach tolerance because of roundoff error"
+ "on first attempt", GSL_EROUND);
+ }
+ else if ((abserr0 <= tolerance && abserr0 != resasc0) || abserr0 == 0.0)
+ {
+ *result = result0;
+ *abserr = abserr0;
+
+ return GSL_SUCCESS;
+ }
+ else if (limit == 1)
+ {
+ *result = result0;
+ *abserr = abserr0;
+
+ GSL_ERROR ("a maximum of one iteration was insufficient", GSL_EMAXITER);
+ }
+
+ /* Initialization */
+
+ initialise_table (&table);
+
+ if (0.5 * abs_omega * fabs(b - a) <= 2)
+ {
+ append_table (&table, result0);
+ extall = 1;
+ }
+
+ area = result0;
+ errsum = abserr0;
+
+ res_ext = result0;
+ err_ext = GSL_DBL_MAX;
+
+ positive_integrand = test_positivity (result0, resabs0);
+
+ iteration = 1;
+
+ do
+ {
+ size_t current_level;
+ double a1, b1, a2, b2;
+ double a_i, b_i, r_i, e_i;
+ double area1 = 0, area2 = 0, area12 = 0;
+ double error1 = 0, error2 = 0, error12 = 0;
+ double resasc1, resasc2;
+ double resabs1, resabs2;
+ double last_e_i;
+
+ /* Bisect the subinterval with the largest error estimate */
+
+ retrieve (workspace, &a_i, &b_i, &r_i, &e_i);
+
+ current_level = workspace->level[workspace->i] + 1;
+
+ if (current_level >= wf->n)
+ {
+ error_type = -1 ; /* exceeded limit of table */
+ break ;
+ }
+
+ a1 = a_i;
+ b1 = 0.5 * (a_i + b_i);
+ a2 = b1;
+ b2 = b_i;
+
+ iteration++;
+
+ qc25f (f, a1, b1, wf, current_level, &area1, &error1, &resabs1, &resasc1);
+ qc25f (f, a2, b2, wf, current_level, &area2, &error2, &resabs2, &resasc2);
+
+ area12 = area1 + area2;
+ error12 = error1 + error2;
+ last_e_i = e_i;
+
+ /* Improve previous approximations to the integral and test for
+ accuracy.
+
+ We write these expressions in the same way as the original
+ QUADPACK code so that the rounding errors are the same, which
+ makes testing easier. */
+
+ errsum = errsum + error12 - e_i;
+ area = area + area12 - r_i;
+
+ tolerance = GSL_MAX_DBL (epsabs, epsrel * fabs (area));
+
+ if (resasc1 != error1 && resasc2 != error2)
+ {
+ double delta = r_i - area12;
+
+ if (fabs (delta) <= 1.0e-5 * fabs (area12) && error12 >= 0.99 * e_i)
+ {
+ if (!extrapolate)
+ {
+ roundoff_type1++;
+ }
+ else
+ {
+ roundoff_type2++;
+ }
+ }
+ if (iteration > 10 && error12 > e_i)
+ {
+ roundoff_type3++;
+ }
+ }
+
+ /* Test for roundoff and eventually set error flag */
+
+ if (roundoff_type1 + roundoff_type2 >= 10 || roundoff_type3 >= 20)
+ {
+ error_type = 2; /* round off error */
+ }
+
+ if (roundoff_type2 >= 5)
+ {
+ error_type2 = 1;
+ }
+
+ /* set error flag in the case of bad integrand behaviour at
+ a point of the integration range */
+
+ if (subinterval_too_small (a1, a2, b2))
+ {
+ error_type = 4;
+ }
+
+ /* append the newly-created intervals to the list */
+
+ update (workspace, a1, b1, area1, error1, a2, b2, area2, error2);
+
+ if (errsum <= tolerance)
+ {
+ goto compute_result;
+ }
+
+ if (error_type)
+ {
+ break;
+ }
+
+ if (iteration >= limit - 1)
+ {
+ error_type = 1;
+ break;
+ }
+
+ /* set up variables on first iteration */
+
+ if (iteration == 2 && extall)
+ {
+ error_over_large_intervals = errsum;
+ ertest = tolerance;
+ append_table (&table, area);
+ continue;
+ }
+
+ if (disallow_extrapolation)
+ {
+ continue;
+ }
+
+ if (extall)
+ {
+ error_over_large_intervals += -last_e_i;
+
+ if (current_level < workspace->maximum_level)
+ {
+ error_over_large_intervals += error12;
+ }
+
+ if (extrapolate)
+ goto label70;
+ }
+
+ if (large_interval(workspace))
+ {
+ continue;
+ }
+
+ if (extall)
+ {
+ extrapolate = 1;
+ workspace->nrmax = 1;
+ }
+ else
+ {
+ /* test whether the interval to be bisected next is the
+ smallest interval. */
+ size_t i = workspace->i;
+ double width = workspace->blist[i] - workspace->alist[i];
+
+ if (0.25 * fabs(width) * abs_omega > 2)
+ continue;
+
+ extall = 1;
+ error_over_large_intervals = errsum;
+ ertest = tolerance;
+ continue;
+ }
+
+ label70:
+ if (!error_type2 && error_over_large_intervals > ertest)
+ {
+ if (increase_nrmax (workspace))
+ continue;
+ }
+
+ /* Perform extrapolation */
+
+ append_table (&table, area);
+
+ if (table.n < 3)
+ {
+ reset_nrmax(workspace);
+ extrapolate = 0;
+ error_over_large_intervals = errsum;
+ continue;
+ }
+
+ qelg (&table, &reseps, &abseps);
+
+ ktmin++;
+
+ if (ktmin > 5 && err_ext < 0.001 * errsum)
+ {
+ error_type = 5;
+ }
+
+ if (abseps < err_ext)
+ {
+ ktmin = 0;
+ err_ext = abseps;
+ res_ext = reseps;
+ correc = error_over_large_intervals;
+ ertest = GSL_MAX_DBL (epsabs, epsrel * fabs (reseps));
+ if (err_ext <= ertest)
+ break;
+ }
+
+ /* Prepare bisection of the smallest interval. */
+
+ if (table.n == 1)
+ {
+ disallow_extrapolation = 1;
+ }
+
+ if (error_type == 5)
+ {
+ break;
+ }
+
+ /* work on interval with largest error */
+
+ reset_nrmax (workspace);
+ extrapolate = 0;
+ error_over_large_intervals = errsum;
+
+ }
+ while (iteration < limit);
+
+ *result = res_ext;
+ *abserr = err_ext;
+
+ if (err_ext == GSL_DBL_MAX)
+ goto compute_result;
+
+ if (error_type || error_type2)
+ {
+ if (error_type2)
+ {
+ err_ext += correc;
+ }
+
+ if (error_type == 0)
+ error_type = 3;
+
+ if (result != 0 && area != 0)
+ {
+ if (err_ext / fabs (res_ext) > errsum / fabs (area))
+ goto compute_result;
+ }
+ else if (err_ext > errsum)
+ {
+ goto compute_result;
+ }
+ else if (area == 0.0)
+ {
+ goto return_error;
+ }
+ }
+
+ /* Test on divergence. */
+
+ {
+ double max_area = GSL_MAX_DBL (fabs (res_ext), fabs (area));
+
+ if (!positive_integrand && max_area < 0.01 * resabs0)
+ goto return_error;
+ }
+
+ {
+ double ratio = res_ext / area;
+
+ if (ratio < 0.01 || ratio > 100 || errsum > fabs (area))
+ error_type = 6;
+ }
+
+ goto return_error;
+
+compute_result:
+
+ *result = sum_results (workspace);
+ *abserr = errsum;
+
+return_error:
+
+ if (error_type > 2)
+ error_type--;
+
+ if (error_type == 0)
+ {
+ return GSL_SUCCESS;
+ }
+ else if (error_type == 1)
+ {
+ GSL_ERROR ("number of iterations was insufficient", GSL_EMAXITER);
+ }
+ else if (error_type == 2)
+ {
+ GSL_ERROR ("cannot reach tolerance because of roundoff error",
+ GSL_EROUND);
+ }
+ else if (error_type == 3)
+ {
+ GSL_ERROR ("bad integrand behavior found in the integration interval",
+ GSL_ESING);
+ }
+ else if (error_type == 4)
+ {
+ GSL_ERROR ("roundoff error detected in extrapolation table", GSL_EROUND);
+ }
+ else if (error_type == 5)
+ {
+ GSL_ERROR ("integral is divergent, or slowly convergent", GSL_EDIVERGE);
+ }
+ else if (error_type == -1)
+ {
+ GSL_ERROR ("exceeded limit of trigonometric table", GSL_ETABLE);
+ }
+ else
+ {
+ GSL_ERROR ("could not integrate function", GSL_EFAILED);
+ }
+
+}
diff --git a/gsl-1.9/integration/qaws.c b/gsl-1.9/integration/qaws.c
new file mode 100644
index 0000000..cd02387
--- /dev/null
+++ b/gsl-1.9/integration/qaws.c
@@ -0,0 +1,220 @@
+/* integration/qaws.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <float.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_integration.h>
+
+#include "initialise.c"
+#include "append.c"
+#include "qpsrt.c"
+#include "util.c"
+#include "qc25s.c"
+
+int
+gsl_integration_qaws (gsl_function * f,
+ const double a, const double b,
+ gsl_integration_qaws_table * t,
+ const double epsabs, const double epsrel,
+ const size_t limit,
+ gsl_integration_workspace * workspace,
+ double *result, double *abserr)
+{
+ double area, errsum;
+ double result0, abserr0;
+ double tolerance;
+ size_t iteration = 0;
+ int roundoff_type1 = 0, roundoff_type2 = 0, error_type = 0;
+
+ /* Initialize results */
+
+ initialise (workspace, a, b);
+
+ *result = 0;
+ *abserr = 0;
+
+ if (limit > workspace->limit)
+ {
+ GSL_ERROR ("iteration limit exceeds available workspace", GSL_EINVAL) ;
+ }
+
+ if (b <= a)
+ {
+ GSL_ERROR ("limits must form an ascending sequence, a < b", GSL_EINVAL) ;
+ }
+
+ if (epsabs <= 0 && (epsrel < 50 * GSL_DBL_EPSILON || epsrel < 0.5e-28))
+ {
+ GSL_ERROR ("tolerance cannot be acheived with given epsabs and epsrel",
+ GSL_EBADTOL);
+ }
+
+ /* perform the first integration */
+
+ {
+ double area1, area2;
+ double error1, error2;
+ int err_reliable1, err_reliable2;
+ double a1 = a;
+ double b1 = 0.5 * (a + b);
+ double a2 = b1;
+ double b2 = b;
+
+ qc25s (f, a, b, a1, b1, t, &area1, &error1, &err_reliable1);
+ qc25s (f, a, b, a2, b2, t, &area2, &error2, &err_reliable2);
+
+ if (error1 > error2)
+ {
+ append_interval (workspace, a1, b1, area1, error1);
+ append_interval (workspace, a2, b2, area2, error2);
+ }
+ else
+ {
+ append_interval (workspace, a2, b2, area2, error2);
+ append_interval (workspace, a1, b1, area1, error1);
+ }
+
+ result0 = area1 + area2;
+ abserr0 = error1 + error2;
+ }
+
+ /* Test on accuracy */
+
+ tolerance = GSL_MAX_DBL (epsabs, epsrel * fabs (result0));
+
+ /* Test on accuracy, use 0.01 relative error as an extra safety
+ margin on the first iteration (ignored for subsequent iterations) */
+
+ if (abserr0 < tolerance && abserr0 < 0.01 * fabs(result0))
+ {
+ *result = result0;
+ *abserr = abserr0;
+
+ return GSL_SUCCESS;
+ }
+ else if (limit == 1)
+ {
+ *result = result0;
+ *abserr = abserr0;
+
+ GSL_ERROR ("a maximum of one iteration was insufficient", GSL_EMAXITER);
+ }
+
+ area = result0;
+ errsum = abserr0;
+
+ iteration = 2;
+
+ do
+ {
+ double a1, b1, a2, b2;
+ double a_i, b_i, r_i, e_i;
+ double area1 = 0, area2 = 0, area12 = 0;
+ double error1 = 0, error2 = 0, error12 = 0;
+ int err_reliable1, err_reliable2;
+
+ /* Bisect the subinterval with the largest error estimate */
+
+ retrieve (workspace, &a_i, &b_i, &r_i, &e_i);
+
+ a1 = a_i;
+ b1 = 0.5 * (a_i + b_i);
+ a2 = b1;
+ b2 = b_i;
+
+ qc25s (f, a, b, a1, b1, t, &area1, &error1, &err_reliable1);
+ qc25s (f, a, b, a2, b2, t, &area2, &error2, &err_reliable2);
+
+ area12 = area1 + area2;
+ error12 = error1 + error2;
+
+ errsum += (error12 - e_i);
+ area += area12 - r_i;
+
+ if (err_reliable1 && err_reliable2)
+ {
+ double delta = r_i - area12;
+
+ if (fabs (delta) <= 1.0e-5 * fabs (area12) && error12 >= 0.99 * e_i)
+ {
+ roundoff_type1++;
+ }
+ if (iteration >= 10 && error12 > e_i)
+ {
+ roundoff_type2++;
+ }
+ }
+
+ tolerance = GSL_MAX_DBL (epsabs, epsrel * fabs (area));
+
+ if (errsum > tolerance)
+ {
+ if (roundoff_type1 >= 6 || roundoff_type2 >= 20)
+ {
+ error_type = 2; /* round off error */
+ }
+
+ /* set error flag in the case of bad integrand behaviour at
+ a point of the integration range */
+
+ if (subinterval_too_small (a1, a2, b2))
+ {
+ error_type = 3;
+ }
+ }
+
+ update (workspace, a1, b1, area1, error1, a2, b2, area2, error2);
+
+ retrieve (workspace, &a_i, &b_i, &r_i, &e_i);
+
+ iteration++;
+
+ }
+ while (iteration < limit && !error_type && errsum > tolerance);
+
+ *result = sum_results (workspace);
+ *abserr = errsum;
+
+ if (errsum <= tolerance)
+ {
+ return GSL_SUCCESS;
+ }
+ else if (error_type == 2)
+ {
+ GSL_ERROR ("roundoff error prevents tolerance from being achieved",
+ GSL_EROUND);
+ }
+ else if (error_type == 3)
+ {
+ GSL_ERROR ("bad integrand behavior found in the integration interval",
+ GSL_ESING);
+ }
+ else if (iteration == limit)
+ {
+ GSL_ERROR ("maximum number of subdivisions reached", GSL_EMAXITER);
+ }
+ else
+ {
+ GSL_ERROR ("could not integrate function", GSL_EFAILED);
+ }
+
+}
diff --git a/gsl-1.9/integration/qc25c.c b/gsl-1.9/integration/qc25c.c
new file mode 100644
index 0000000..94f4b1f
--- /dev/null
+++ b/gsl-1.9/integration/qc25c.c
@@ -0,0 +1,132 @@
+/* integration/qc25c.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+struct fn_cauchy_params
+{
+ gsl_function *function;
+ double singularity;
+};
+
+static double fn_cauchy (double t, void *params);
+
+static void compute_moments (double cc, double *moment);
+
+static void
+qc25c (gsl_function * f, double a, double b, double c,
+ double *result, double *abserr, int *err_reliable);
+
+static void
+qc25c (gsl_function * f, double a, double b, double c,
+ double *result, double *abserr, int *err_reliable)
+{
+ double cc = (2 * c - b - a) / (b - a);
+
+ if (fabs (cc) > 1.1)
+ {
+ double resabs, resasc;
+
+ gsl_function weighted_function;
+ struct fn_cauchy_params fn_params;
+
+ fn_params.function = f;
+ fn_params.singularity = c;
+
+ weighted_function.function = &fn_cauchy;
+ weighted_function.params = &fn_params;
+
+ gsl_integration_qk15 (&weighted_function, a, b, result, abserr,
+ &resabs, &resasc);
+
+ if (*abserr == resasc)
+ {
+ *err_reliable = 0;
+ }
+ else
+ {
+ *err_reliable = 1;
+ }
+
+ return;
+ }
+ else
+ {
+ double cheb12[13], cheb24[25], moment[25];
+ double res12 = 0, res24 = 0;
+ size_t i;
+ gsl_integration_qcheb (f, a, b, cheb12, cheb24);
+ compute_moments (cc, moment);
+
+ for (i = 0; i < 13; i++)
+ {
+ res12 += cheb12[i] * moment[i];
+ }
+
+ for (i = 0; i < 25; i++)
+ {
+ res24 += cheb24[i] * moment[i];
+ }
+
+ *result = res24;
+ *abserr = fabs(res24 - res12) ;
+ *err_reliable = 0;
+
+ return;
+ }
+}
+
+static double
+fn_cauchy (double x, void *params)
+{
+ struct fn_cauchy_params *p = (struct fn_cauchy_params *) params;
+ gsl_function *f = p->function;
+ double c = p->singularity;
+ return GSL_FN_EVAL (f, x) / (x - c);
+}
+
+static void
+compute_moments (double cc, double *moment)
+{
+ size_t k;
+
+ double a0 = log (fabs ((1.0 - cc) / (1.0 + cc)));
+ double a1 = 2 + a0 * cc;
+
+ moment[0] = a0;
+ moment[1] = a1;
+
+ for (k = 2; k < 25; k++)
+ {
+ double a2;
+
+ if ((k % 2) == 0)
+ {
+ a2 = 2.0 * cc * a1 - a0;
+ }
+ else
+ {
+ const double km1 = k - 1.0;
+ a2 = 2.0 * cc * a1 - a0 - 4.0 / (km1 * km1 - 1.0);
+ }
+
+ moment[k] = a2;
+
+ a0 = a1;
+ a1 = a2;
+ }
+}
diff --git a/gsl-1.9/integration/qc25f.c b/gsl-1.9/integration/qc25f.c
new file mode 100644
index 0000000..73c085c
--- /dev/null
+++ b/gsl-1.9/integration/qc25f.c
@@ -0,0 +1,158 @@
+/* integration/qc25f.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+struct fn_fourier_params
+{
+ gsl_function *function;
+ double omega;
+};
+
+static double fn_sin (double t, void *params);
+static double fn_cos (double t, void *params);
+
+static void
+qc25f (gsl_function * f, double a, double b,
+ gsl_integration_qawo_table * wf, size_t level,
+ double *result, double *abserr, double *resabs, double *resasc);
+
+static void
+qc25f (gsl_function * f, double a, double b,
+ gsl_integration_qawo_table * wf, size_t level,
+ double *result, double *abserr, double *resabs, double *resasc)
+{
+ const double center = 0.5 * (a + b);
+ const double half_length = 0.5 * (b - a);
+ const double omega = wf->omega ;
+
+ const double par = omega * half_length;
+
+ if (fabs (par) < 2)
+ {
+ gsl_function weighted_function;
+ struct fn_fourier_params fn_params;
+
+ fn_params.function = f;
+ fn_params.omega = omega;
+
+ if (wf->sine == GSL_INTEG_SINE)
+ {
+ weighted_function.function = &fn_sin;
+ }
+ else
+ {
+ weighted_function.function = &fn_cos;
+ }
+
+ weighted_function.params = &fn_params;
+
+ gsl_integration_qk15 (&weighted_function, a, b, result, abserr,
+ resabs, resasc);
+
+ return;
+ }
+ else
+ {
+ double *moment;
+ double cheb12[13], cheb24[25];
+ double result_abs, res12_cos, res12_sin, res24_cos, res24_sin;
+ double est_cos, est_sin;
+ double c, s;
+ size_t i;
+
+ gsl_integration_qcheb (f, a, b, cheb12, cheb24);
+
+ if (level >= wf->n)
+ {
+ /* table overflow should not happen, check before calling */
+ GSL_ERROR_VOID("table overflow in internal function", GSL_ESANITY);
+ }
+
+ /* obtain moments from the table */
+
+ moment = wf->chebmo + 25 * level;
+
+ res12_cos = cheb12[12] * moment[12];
+ res12_sin = 0 ;
+
+ for (i = 0; i < 6; i++)
+ {
+ size_t k = 10 - 2 * i;
+ res12_cos += cheb12[k] * moment[k];
+ res12_sin += cheb12[k + 1] * moment[k + 1];
+ }
+
+ res24_cos = cheb24[24] * moment[24];
+ res24_sin = 0 ;
+
+ result_abs = fabs(cheb24[24]) ;
+
+ for (i = 0; i < 12; i++)
+ {
+ size_t k = 22 - 2 * i;
+ res24_cos += cheb24[k] * moment[k];
+ res24_sin += cheb24[k + 1] * moment[k + 1];
+ result_abs += fabs(cheb24[k]) + fabs(cheb24[k+1]);
+ }
+
+ est_cos = fabs(res24_cos - res12_cos);
+ est_sin = fabs(res24_sin - res12_sin);
+
+ c = half_length * cos(center * omega);
+ s = half_length * sin(center * omega);
+
+ if (wf->sine == GSL_INTEG_SINE)
+ {
+ *result = c * res24_sin + s * res24_cos;
+ *abserr = fabs(c * est_sin) + fabs(s * est_cos);
+ }
+ else
+ {
+ *result = c * res24_cos - s * res24_sin;
+ *abserr = fabs(c * est_cos) + fabs(s * est_sin);
+ }
+
+ *resabs = result_abs * half_length;
+ *resasc = GSL_DBL_MAX;
+
+ return;
+ }
+}
+
+static double
+fn_sin (double x, void *params)
+{
+ struct fn_fourier_params *p = (struct fn_fourier_params *) params;
+ gsl_function *f = p->function;
+ double w = p->omega;
+ double wx = w * x;
+ double sinwx = sin(wx) ;
+ return GSL_FN_EVAL (f, x) * sinwx;
+}
+
+static double
+fn_cos (double x, void *params)
+{
+ struct fn_fourier_params *p = (struct fn_fourier_params *) params;
+ gsl_function *f = p->function;
+ double w = p->omega;
+ double wx = w * x;
+ double coswx = cos(wx) ;
+ return GSL_FN_EVAL (f, x) * coswx ;
+}
+
diff --git a/gsl-1.9/integration/qc25s.c b/gsl-1.9/integration/qc25s.c
new file mode 100644
index 0000000..196e30d
--- /dev/null
+++ b/gsl-1.9/integration/qc25s.c
@@ -0,0 +1,238 @@
+/* integration/qc25s.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+struct fn_qaws_params
+{
+ gsl_function *function;
+ double a;
+ double b;
+ gsl_integration_qaws_table *table;
+};
+
+static double fn_qaws (double t, void *params);
+static double fn_qaws_L (double x, void *params);
+static double fn_qaws_R (double x, void *params);
+
+static void
+compute_result (const double * r, const double * cheb12, const double * cheb24,
+ double * result12, double * result24);
+
+
+static void
+qc25s (gsl_function * f, double a, double b, double a1, double b1,
+ gsl_integration_qaws_table * t,
+ double *result, double *abserr, int *err_reliable);
+
+static void
+qc25s (gsl_function * f, double a, double b, double a1, double b1,
+ gsl_integration_qaws_table * t,
+ double *result, double *abserr, int *err_reliable)
+{
+ gsl_function weighted_function;
+ struct fn_qaws_params fn_params;
+
+ fn_params.function = f;
+ fn_params.a = a;
+ fn_params.b = b;
+ fn_params.table = t;
+
+ weighted_function.params = &fn_params;
+
+ if (a1 == a && (t->alpha != 0.0 || t->mu != 0))
+ {
+ double cheb12[13], cheb24[25];
+
+ double factor = pow(0.5 * (b1 - a1), t->alpha + 1.0);
+
+ weighted_function.function = &fn_qaws_R;
+
+ gsl_integration_qcheb (&weighted_function, a1, b1, cheb12, cheb24);
+
+ if (t->mu == 0)
+ {
+ double res12 = 0, res24 = 0;
+ double u = factor;
+
+ compute_result (t->ri, cheb12, cheb24, &res12, &res24);
+
+ *result = u * res24;
+ *abserr = fabs(u * (res24 - res12));
+ }
+ else
+ {
+ double res12a = 0, res24a = 0;
+ double res12b = 0, res24b = 0;
+
+ double u = factor * log(b1 - a1);
+ double v = factor;
+
+ compute_result (t->ri, cheb12, cheb24, &res12a, &res24a);
+ compute_result (t->rg, cheb12, cheb24, &res12b, &res24b);
+
+ *result = u * res24a + v * res24b;
+ *abserr = fabs(u * (res24a - res12a)) + fabs(v * (res24b - res12b));
+ }
+
+ *err_reliable = 0;
+
+ return;
+ }
+ else if (b1 == b && (t->beta != 0.0 || t->nu != 0))
+ {
+ double cheb12[13], cheb24[25];
+ double factor = pow(0.5 * (b1 - a1), t->beta + 1.0);
+
+ weighted_function.function = &fn_qaws_L;
+
+ gsl_integration_qcheb (&weighted_function, a1, b1, cheb12, cheb24);
+
+ if (t->nu == 0)
+ {
+ double res12 = 0, res24 = 0;
+ double u = factor;
+
+ compute_result (t->rj, cheb12, cheb24, &res12, &res24);
+
+ *result = u * res24;
+ *abserr = fabs(u * (res24 - res12));
+ }
+ else
+ {
+ double res12a = 0, res24a = 0;
+ double res12b = 0, res24b = 0;
+
+ double u = factor * log(b1 - a1);
+ double v = factor;
+
+ compute_result (t->rj, cheb12, cheb24, &res12a, &res24a);
+ compute_result (t->rh, cheb12, cheb24, &res12b, &res24b);
+
+ *result = u * res24a + v * res24b;
+ *abserr = fabs(u * (res24a - res12a)) + fabs(v * (res24b - res12b));
+ }
+
+ *err_reliable = 0;
+
+ return;
+ }
+ else
+ {
+ double resabs, resasc;
+
+ weighted_function.function = &fn_qaws;
+
+ gsl_integration_qk15 (&weighted_function, a1, b1, result, abserr,
+ &resabs, &resasc);
+
+ if (*abserr == resasc)
+ {
+ *err_reliable = 0;
+ }
+ else
+ {
+ *err_reliable = 1;
+ }
+
+ return;
+ }
+
+}
+
+static double
+fn_qaws (double x, void *params)
+{
+ struct fn_qaws_params *p = (struct fn_qaws_params *) params;
+ gsl_function *f = p->function;
+ gsl_integration_qaws_table *t = p->table;
+
+ double factor = 1.0;
+
+ if (t->alpha != 0.0)
+ factor *= pow(x - p->a, t->alpha);
+
+ if (t->beta != 0.0)
+ factor *= pow(p->b - x, t->beta);
+
+ if (t->mu == 1)
+ factor *= log(x - p->a);
+
+ if (t->nu == 1)
+ factor *= log(p->b - x);
+
+ return factor * GSL_FN_EVAL (f, x);
+}
+
+static double
+fn_qaws_L (double x, void *params)
+{
+ struct fn_qaws_params *p = (struct fn_qaws_params *) params;
+ gsl_function *f = p->function;
+ gsl_integration_qaws_table *t = p->table;
+
+ double factor = 1.0;
+
+ if (t->alpha != 0.0)
+ factor *= pow(x - p->a, t->alpha);
+
+ if (t->mu == 1)
+ factor *= log(x - p->a);
+
+ return factor * GSL_FN_EVAL (f, x);
+}
+
+static double
+fn_qaws_R (double x, void *params)
+{
+ struct fn_qaws_params *p = (struct fn_qaws_params *) params;
+ gsl_function *f = p->function;
+ gsl_integration_qaws_table *t = p->table;
+
+ double factor = 1.0;
+
+ if (t->beta != 0.0)
+ factor *= pow(p->b - x, t->beta);
+
+ if (t->nu == 1)
+ factor *= log(p->b - x);
+
+ return factor * GSL_FN_EVAL (f, x);
+}
+
+
+static void
+compute_result (const double * r, const double * cheb12, const double * cheb24,
+ double * result12, double * result24)
+{
+ size_t i;
+ double res12 = 0;
+ double res24 = 0;
+
+ for (i = 0; i < 13; i++)
+ {
+ res12 += r[i] * cheb12[i];
+ }
+
+ for (i = 0; i < 25; i++)
+ {
+ res24 += r[i] * cheb24[i];
+ }
+
+ *result12 = res12;
+ *result24 = res24;
+}
diff --git a/gsl-1.9/integration/qcheb.c b/gsl-1.9/integration/qcheb.c
new file mode 100644
index 0000000..a6564f7
--- /dev/null
+++ b/gsl-1.9/integration/qcheb.c
@@ -0,0 +1,229 @@
+/* integration/qcheb.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_integration.h>
+
+
+/* This function computes the 12-th order and 24-th order Chebyshev
+ approximations to f(x) on [a,b] */
+
+void
+gsl_integration_qcheb (gsl_function * f, double a, double b, double *cheb12, double *cheb24)
+{
+ size_t i;
+ double fval[25], v[12];
+
+ /* These are the values of cos(pi*k/24) for k=1..11 needed for the
+ Chebyshev expansion of f(x) */
+
+ const double x[11] = { 0.9914448613738104,
+ 0.9659258262890683,
+ 0.9238795325112868,
+ 0.8660254037844386,
+ 0.7933533402912352,
+ 0.7071067811865475,
+ 0.6087614290087206,
+ 0.5000000000000000,
+ 0.3826834323650898,
+ 0.2588190451025208,
+ 0.1305261922200516 };
+
+ const double center = 0.5 * (b + a);
+ const double half_length = 0.5 * (b - a);
+
+ fval[0] = 0.5 * GSL_FN_EVAL (f, b);
+ fval[12] = GSL_FN_EVAL (f, center);
+ fval[24] = 0.5 * GSL_FN_EVAL (f, a);
+
+ for (i = 1; i < 12; i++)
+ {
+ const size_t j = 24 - i;
+ const double u = half_length * x[i-1];
+ fval[i] = GSL_FN_EVAL(f, center + u);
+ fval[j] = GSL_FN_EVAL(f, center - u);
+ }
+
+ for (i = 0; i < 12; i++)
+ {
+ const size_t j = 24 - i;
+ v[i] = fval[i] - fval[j];
+ fval[i] = fval[i] + fval[j];
+ }
+
+ {
+ const double alam1 = v[0] - v[8];
+ const double alam2 = x[5] * (v[2] - v[6] - v[10]);
+
+ cheb12[3] = alam1 + alam2;
+ cheb12[9] = alam1 - alam2;
+ }
+
+ {
+ const double alam1 = v[1] - v[7] - v[9];
+ const double alam2 = v[3] - v[5] - v[11];
+ {
+ const double alam = x[2] * alam1 + x[8] * alam2;
+
+ cheb24[3] = cheb12[3] + alam;
+ cheb24[21] = cheb12[3] - alam;
+ }
+
+ {
+ const double alam = x[8] * alam1 - x[2] * alam2;
+ cheb24[9] = cheb12[9] + alam;
+ cheb24[15] = cheb12[9] - alam;
+ }
+ }
+
+ {
+ const double part1 = x[3] * v[4];
+ const double part2 = x[7] * v[8];
+ const double part3 = x[5] * v[6];
+
+ {
+ const double alam1 = v[0] + part1 + part2;
+ const double alam2 = x[1] * v[2] + part3 + x[9] * v[10];
+
+ cheb12[1] = alam1 + alam2;
+ cheb12[11] = alam1 - alam2;
+ }
+
+ {
+ const double alam1 = v[0] - part1 + part2;
+ const double alam2 = x[9] * v[2] - part3 + x[1] * v[10];
+ cheb12[5] = alam1 + alam2;
+ cheb12[7] = alam1 - alam2;
+ }
+ }
+
+ {
+ const double alam = (x[0] * v[1] + x[2] * v[3] + x[4] * v[5]
+ + x[6] * v[7] + x[8] * v[9] + x[10] * v[11]);
+ cheb24[1] = cheb12[1] + alam;
+ cheb24[23] = cheb12[1] - alam;
+ }
+
+ {
+ const double alam = (x[10] * v[1] - x[8] * v[3] + x[6] * v[5]
+ - x[4] * v[7] + x[2] * v[9] - x[0] * v[11]);
+ cheb24[11] = cheb12[11] + alam;
+ cheb24[13] = cheb12[11] - alam;
+ }
+
+ {
+ const double alam = (x[4] * v[1] - x[8] * v[3] - x[0] * v[5]
+ - x[10] * v[7] + x[2] * v[9] + x[6] * v[11]);
+ cheb24[5] = cheb12[5] + alam;
+ cheb24[19] = cheb12[5] - alam;
+ }
+
+ {
+ const double alam = (x[6] * v[1] - x[2] * v[3] - x[10] * v[5]
+ + x[0] * v[7] - x[8] * v[9] - x[4] * v[11]);
+ cheb24[7] = cheb12[7] + alam;
+ cheb24[17] = cheb12[7] - alam;
+ }
+
+ for (i = 0; i < 6; i++)
+ {
+ const size_t j = 12 - i;
+ v[i] = fval[i] - fval[j];
+ fval[i] = fval[i] + fval[j];
+ }
+
+ {
+ const double alam1 = v[0] + x[7] * v[4];
+ const double alam2 = x[3] * v[2];
+
+ cheb12[2] = alam1 + alam2;
+ cheb12[10] = alam1 - alam2;
+ }
+
+ cheb12[6] = v[0] - v[4];
+
+ {
+ const double alam = x[1] * v[1] + x[5] * v[3] + x[9] * v[5];
+ cheb24[2] = cheb12[2] + alam;
+ cheb24[22] = cheb12[2] - alam;
+ }
+
+ {
+ const double alam = x[5] * (v[1] - v[3] - v[5]);
+ cheb24[6] = cheb12[6] + alam;
+ cheb24[18] = cheb12[6] - alam;
+ }
+
+ {
+ const double alam = x[9] * v[1] - x[5] * v[3] + x[1] * v[5];
+ cheb24[10] = cheb12[10] + alam;
+ cheb24[14] = cheb12[10] - alam;
+ }
+
+ for (i = 0; i < 3; i++)
+ {
+ const size_t j = 6 - i;
+ v[i] = fval[i] - fval[j];
+ fval[i] = fval[i] + fval[j];
+ }
+
+ cheb12[4] = v[0] + x[7] * v[2];
+ cheb12[8] = fval[0] - x[7] * fval[2];
+
+ {
+ const double alam = x[3] * v[1];
+ cheb24[4] = cheb12[4] + alam;
+ cheb24[20] = cheb12[4] - alam;
+ }
+
+ {
+ const double alam = x[7] * fval[1] - fval[3];
+ cheb24[8] = cheb12[8] + alam;
+ cheb24[16] = cheb12[8] - alam;
+ }
+
+ cheb12[0] = fval[0] + fval[2];
+
+ {
+ const double alam = fval[1] + fval[3];
+ cheb24[0] = cheb12[0] + alam;
+ cheb24[24] = cheb12[0] - alam;
+ }
+
+ cheb12[12] = v[0] - v[2];
+ cheb24[12] = cheb12[12];
+
+ for (i = 1; i < 12; i++)
+ {
+ cheb12[i] *= 1.0 / 6.0;
+ }
+
+ cheb12[0] *= 1.0 / 12.0;
+ cheb12[12] *= 1.0 / 12.0;
+
+ for (i = 1; i < 24; i++)
+ {
+ cheb24[i] *= 1.0 / 12.0;
+ }
+
+ cheb24[0] *= 1.0 / 24.0;
+ cheb24[24] *= 1.0 / 24.0;
+}
diff --git a/gsl-1.9/integration/qelg.c b/gsl-1.9/integration/qelg.c
new file mode 100644
index 0000000..8f45f64
--- /dev/null
+++ b/gsl-1.9/integration/qelg.c
@@ -0,0 +1,233 @@
+/* integration/qelg.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+struct extrapolation_table
+ {
+ size_t n;
+ double rlist2[52];
+ size_t nres;
+ double res3la[3];
+ };
+
+static void
+ initialise_table (struct extrapolation_table *table);
+
+static void
+ append_table (struct extrapolation_table *table, double y);
+
+static void
+initialise_table (struct extrapolation_table *table)
+{
+ table->n = 0;
+ table->nres = 0;
+}
+#ifdef JUNK
+static void
+initialise_table (struct extrapolation_table *table, double y)
+{
+ table->n = 0;
+ table->rlist2[0] = y;
+ table->nres = 0;
+}
+#endif
+static void
+append_table (struct extrapolation_table *table, double y)
+{
+ size_t n;
+ n = table->n;
+ table->rlist2[n] = y;
+ table->n++;
+}
+
+/* static inline void
+ qelg (size_t * n, double epstab[],
+ double * result, double * abserr,
+ double res3la[], size_t * nres); */
+
+static inline void
+ qelg (struct extrapolation_table *table, double *result, double *abserr);
+
+static inline void
+qelg (struct extrapolation_table *table, double *result, double *abserr)
+{
+ double *epstab = table->rlist2;
+ double *res3la = table->res3la;
+ const size_t n = table->n - 1;
+
+ const double current = epstab[n];
+
+ double absolute = GSL_DBL_MAX;
+ double relative = 5 * GSL_DBL_EPSILON * fabs (current);
+
+ const size_t newelm = n / 2;
+ const size_t n_orig = n;
+ size_t n_final = n;
+ size_t i;
+
+ const size_t nres_orig = table->nres;
+
+ *result = current;
+ *abserr = GSL_DBL_MAX;
+
+ if (n < 2)
+ {
+ *result = current;
+ *abserr = GSL_MAX_DBL (absolute, relative);
+ return;
+ }
+
+ epstab[n + 2] = epstab[n];
+ epstab[n] = GSL_DBL_MAX;
+
+ for (i = 0; i < newelm; i++)
+ {
+ double res = epstab[n - 2 * i + 2];
+ double e0 = epstab[n - 2 * i - 2];
+ double e1 = epstab[n - 2 * i - 1];
+ double e2 = res;
+
+ double e1abs = fabs (e1);
+ double delta2 = e2 - e1;
+ double err2 = fabs (delta2);
+ double tol2 = GSL_MAX_DBL (fabs (e2), e1abs) * GSL_DBL_EPSILON;
+ double delta3 = e1 - e0;
+ double err3 = fabs (delta3);
+ double tol3 = GSL_MAX_DBL (e1abs, fabs (e0)) * GSL_DBL_EPSILON;
+
+ double e3, delta1, err1, tol1, ss;
+
+ if (err2 <= tol2 && err3 <= tol3)
+ {
+ /* If e0, e1 and e2 are equal to within machine accuracy,
+ convergence is assumed. */
+
+ *result = res;
+ absolute = err2 + err3;
+ relative = 5 * GSL_DBL_EPSILON * fabs (res);
+ *abserr = GSL_MAX_DBL (absolute, relative);
+ return;
+ }
+
+ e3 = epstab[n - 2 * i];
+ epstab[n - 2 * i] = e1;
+ delta1 = e1 - e3;
+ err1 = fabs (delta1);
+ tol1 = GSL_MAX_DBL (e1abs, fabs (e3)) * GSL_DBL_EPSILON;
+
+ /* If two elements are very close to each other, omit a part of
+ the table by adjusting the value of n */
+
+ if (err1 <= tol1 || err2 <= tol2 || err3 <= tol3)
+ {
+ n_final = 2 * i;
+ break;
+ }
+
+ ss = (1 / delta1 + 1 / delta2) - 1 / delta3;
+
+ /* Test to detect irregular behaviour in the table, and
+ eventually omit a part of the table by adjusting the value of
+ n. */
+
+ if (fabs (ss * e1) <= 0.0001)
+ {
+ n_final = 2 * i;
+ break;
+ }
+
+ /* Compute a new element and eventually adjust the value of
+ result. */
+
+ res = e1 + 1 / ss;
+ epstab[n - 2 * i] = res;
+
+ {
+ const double error = err2 + fabs (res - e2) + err3;
+
+ if (error <= *abserr)
+ {
+ *abserr = error;
+ *result = res;
+ }
+ }
+ }
+
+ /* Shift the table */
+
+ {
+ const size_t limexp = 50 - 1;
+
+ if (n_final == limexp)
+ {
+ n_final = 2 * (limexp / 2);
+ }
+ }
+
+ if (n_orig % 2 == 1)
+ {
+ for (i = 0; i <= newelm; i++)
+ {
+ epstab[1 + i * 2] = epstab[i * 2 + 3];
+ }
+ }
+ else
+ {
+ for (i = 0; i <= newelm; i++)
+ {
+ epstab[i * 2] = epstab[i * 2 + 2];
+ }
+ }
+
+ if (n_orig != n_final)
+ {
+ for (i = 0; i <= n_final; i++)
+ {
+ epstab[i] = epstab[n_orig - n_final + i];
+ }
+ }
+
+ table->n = n_final + 1;
+
+ if (nres_orig < 3)
+ {
+ res3la[nres_orig] = *result;
+ *abserr = GSL_DBL_MAX;
+ }
+ else
+ { /* Compute error estimate */
+ *abserr = (fabs (*result - res3la[2]) + fabs (*result - res3la[1])
+ + fabs (*result - res3la[0]));
+
+ res3la[0] = res3la[1];
+ res3la[1] = res3la[2];
+ res3la[2] = *result;
+ }
+
+ /* In QUADPACK the variable table->nres is incremented at the top of
+ qelg, so it increases on every call. This leads to the array
+ res3la being accessed when its elements are still undefined, so I
+ have moved the update to this point so that its value more
+ useful. */
+
+ table->nres = nres_orig + 1;
+
+ *abserr = GSL_MAX_DBL (*abserr, 5 * GSL_DBL_EPSILON * fabs (*result));
+
+ return;
+}
diff --git a/gsl-1.9/integration/qk.c b/gsl-1.9/integration/qk.c
new file mode 100644
index 0000000..3e14146
--- /dev/null
+++ b/gsl-1.9/integration/qk.c
@@ -0,0 +1,102 @@
+/* integration/qk.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <float.h>
+#include <math.h>
+#include <gsl/gsl_integration.h>
+#include "err.c"
+
+void
+gsl_integration_qk (const int n,
+ const double xgk[], const double wg[], const double wgk[],
+ double fv1[], double fv2[],
+ const gsl_function * f, double a, double b,
+ double *result, double *abserr,
+ double *resabs, double *resasc)
+{
+
+ const double center = 0.5 * (a + b);
+ const double half_length = 0.5 * (b - a);
+ const double abs_half_length = fabs (half_length);
+ const double f_center = GSL_FN_EVAL (f, center);
+
+ double result_gauss = 0;
+ double result_kronrod = f_center * wgk[n - 1];
+
+ double result_abs = fabs (result_kronrod);
+ double result_asc = 0;
+ double mean = 0, err = 0;
+
+ int j;
+
+ if (n % 2 == 0)
+ {
+ result_gauss = f_center * wg[n / 2 - 1];
+ }
+
+ for (j = 0; j < (n - 1) / 2; j++)
+ {
+ const int jtw = j * 2 + 1; /* j=1,2,3 jtw=2,4,6 */
+ const double abscissa = half_length * xgk[jtw];
+ const double fval1 = GSL_FN_EVAL (f, center - abscissa);
+ const double fval2 = GSL_FN_EVAL (f, center + abscissa);
+ const double fsum = fval1 + fval2;
+ fv1[jtw] = fval1;
+ fv2[jtw] = fval2;
+ result_gauss += wg[j] * fsum;
+ result_kronrod += wgk[jtw] * fsum;
+ result_abs += wgk[jtw] * (fabs (fval1) + fabs (fval2));
+ }
+
+ for (j = 0; j < n / 2; j++)
+ {
+ int jtwm1 = j * 2;
+ const double abscissa = half_length * xgk[jtwm1];
+ const double fval1 = GSL_FN_EVAL (f, center - abscissa);
+ const double fval2 = GSL_FN_EVAL (f, center + abscissa);
+ fv1[jtwm1] = fval1;
+ fv2[jtwm1] = fval2;
+ result_kronrod += wgk[jtwm1] * (fval1 + fval2);
+ result_abs += wgk[jtwm1] * (fabs (fval1) + fabs (fval2));
+ };
+
+ mean = result_kronrod * 0.5;
+
+ result_asc = wgk[n - 1] * fabs (f_center - mean);
+
+ for (j = 0; j < n - 1; j++)
+ {
+ result_asc += wgk[j] * (fabs (fv1[j] - mean) + fabs (fv2[j] - mean));
+ }
+
+ /* scale by the width of the integration region */
+
+ err = (result_kronrod - result_gauss) * half_length;
+
+ result_kronrod *= half_length;
+ result_abs *= abs_half_length;
+ result_asc *= abs_half_length;
+
+ *result = result_kronrod;
+ *resabs = result_abs;
+ *resasc = result_asc;
+ *abserr = rescale_error (err, result_abs, result_asc);
+
+}
diff --git a/gsl-1.9/integration/qk15.c b/gsl-1.9/integration/qk15.c
new file mode 100644
index 0000000..574e874
--- /dev/null
+++ b/gsl-1.9/integration/qk15.c
@@ -0,0 +1,70 @@
+/* integration/qk15.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_integration.h>
+
+/* Gauss quadrature weights and kronrod quadrature abscissae and
+ weights as evaluated with 80 decimal digit arithmetic by
+ L. W. Fullerton, Bell Labs, Nov. 1981. */
+
+static const double xgk[8] = /* abscissae of the 15-point kronrod rule */
+{
+ 0.991455371120812639206854697526329,
+ 0.949107912342758524526189684047851,
+ 0.864864423359769072789712788640926,
+ 0.741531185599394439863864773280788,
+ 0.586087235467691130294144838258730,
+ 0.405845151377397166906606412076961,
+ 0.207784955007898467600689403773245,
+ 0.000000000000000000000000000000000
+};
+
+/* xgk[1], xgk[3], ... abscissae of the 7-point gauss rule.
+ xgk[0], xgk[2], ... abscissae to optimally extend the 7-point gauss rule */
+
+static const double wg[4] = /* weights of the 7-point gauss rule */
+{
+ 0.129484966168869693270611432679082,
+ 0.279705391489276667901467771423780,
+ 0.381830050505118944950369775488975,
+ 0.417959183673469387755102040816327
+};
+
+static const double wgk[8] = /* weights of the 15-point kronrod rule */
+{
+ 0.022935322010529224963732008058970,
+ 0.063092092629978553290700663189204,
+ 0.104790010322250183839876322541518,
+ 0.140653259715525918745189590510238,
+ 0.169004726639267902826583426598550,
+ 0.190350578064785409913256402421014,
+ 0.204432940075298892414161999234649,
+ 0.209482141084727828012999174891714
+};
+
+void
+gsl_integration_qk15 (const gsl_function * f, double a, double b,
+ double *result, double *abserr,
+ double *resabs, double *resasc)
+{
+ double fv1[8], fv2[8];
+ gsl_integration_qk (8, xgk, wg, wgk, fv1, fv2, f, a, b, result, abserr, resabs, resasc);
+}
+
diff --git a/gsl-1.9/integration/qk21.c b/gsl-1.9/integration/qk21.c
new file mode 100644
index 0000000..8c5d27f
--- /dev/null
+++ b/gsl-1.9/integration/qk21.c
@@ -0,0 +1,77 @@
+/* integration/qk21.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_integration.h>
+
+/* Gauss quadrature weights and kronrod quadrature abscissae and
+ weights as evaluated with 80 decimal digit arithmetic by
+ L. W. Fullerton, Bell Labs, Nov. 1981. */
+
+static const double xgk[11] = /* abscissae of the 21-point kronrod rule */
+{
+ 0.995657163025808080735527280689003,
+ 0.973906528517171720077964012084452,
+ 0.930157491355708226001207180059508,
+ 0.865063366688984510732096688423493,
+ 0.780817726586416897063717578345042,
+ 0.679409568299024406234327365114874,
+ 0.562757134668604683339000099272694,
+ 0.433395394129247190799265943165784,
+ 0.294392862701460198131126603103866,
+ 0.148874338981631210884826001129720,
+ 0.000000000000000000000000000000000
+};
+
+/* xgk[1], xgk[3], ... abscissae of the 10-point gauss rule.
+ xgk[0], xgk[2], ... abscissae to optimally extend the 10-point gauss rule */
+
+static const double wg[5] = /* weights of the 10-point gauss rule */
+{
+ 0.066671344308688137593568809893332,
+ 0.149451349150580593145776339657697,
+ 0.219086362515982043995534934228163,
+ 0.269266719309996355091226921569469,
+ 0.295524224714752870173892994651338
+};
+
+static const double wgk[11] = /* weights of the 21-point kronrod rule */
+{
+ 0.011694638867371874278064396062192,
+ 0.032558162307964727478818972459390,
+ 0.054755896574351996031381300244580,
+ 0.075039674810919952767043140916190,
+ 0.093125454583697605535065465083366,
+ 0.109387158802297641899210590325805,
+ 0.123491976262065851077958109831074,
+ 0.134709217311473325928054001771707,
+ 0.142775938577060080797094273138717,
+ 0.147739104901338491374841515972068,
+ 0.149445554002916905664936468389821
+};
+
+
+void
+gsl_integration_qk21 (const gsl_function * f, double a, double b,
+ double *result, double *abserr,
+ double *resabs, double *resasc)
+{
+ double fv1[11], fv2[11];
+ gsl_integration_qk (11, xgk, wg, wgk, fv1, fv2, f, a, b, result, abserr, resabs, resasc);
+}
diff --git a/gsl-1.9/integration/qk31.c b/gsl-1.9/integration/qk31.c
new file mode 100644
index 0000000..2cfc0bd
--- /dev/null
+++ b/gsl-1.9/integration/qk31.c
@@ -0,0 +1,89 @@
+/* integration/qk31.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_integration.h>
+
+/* Gauss quadrature weights and kronrod quadrature abscissae and
+ weights as evaluated with 80 decimal digit arithmetic by
+ L. W. Fullerton, Bell Labs, Nov. 1981. */
+
+static const double xgk[16] = /* abscissae of the 31-point kronrod rule */
+{
+ 0.998002298693397060285172840152271,
+ 0.987992518020485428489565718586613,
+ 0.967739075679139134257347978784337,
+ 0.937273392400705904307758947710209,
+ 0.897264532344081900882509656454496,
+ 0.848206583410427216200648320774217,
+ 0.790418501442465932967649294817947,
+ 0.724417731360170047416186054613938,
+ 0.650996741297416970533735895313275,
+ 0.570972172608538847537226737253911,
+ 0.485081863640239680693655740232351,
+ 0.394151347077563369897207370981045,
+ 0.299180007153168812166780024266389,
+ 0.201194093997434522300628303394596,
+ 0.101142066918717499027074231447392,
+ 0.000000000000000000000000000000000
+};
+
+/* xgk[1], xgk[3], ... abscissae of the 15-point gauss rule.
+ xgk[0], xgk[2], ... abscissae to optimally extend the 15-point gauss rule */
+
+static const double wg[8] = /* weights of the 15-point gauss rule */
+{
+ 0.030753241996117268354628393577204,
+ 0.070366047488108124709267416450667,
+ 0.107159220467171935011869546685869,
+ 0.139570677926154314447804794511028,
+ 0.166269205816993933553200860481209,
+ 0.186161000015562211026800561866423,
+ 0.198431485327111576456118326443839,
+ 0.202578241925561272880620199967519
+};
+
+static const double wgk[16] = /* weights of the 31-point kronrod rule */
+{
+ 0.005377479872923348987792051430128,
+ 0.015007947329316122538374763075807,
+ 0.025460847326715320186874001019653,
+ 0.035346360791375846222037948478360,
+ 0.044589751324764876608227299373280,
+ 0.053481524690928087265343147239430,
+ 0.062009567800670640285139230960803,
+ 0.069854121318728258709520077099147,
+ 0.076849680757720378894432777482659,
+ 0.083080502823133021038289247286104,
+ 0.088564443056211770647275443693774,
+ 0.093126598170825321225486872747346,
+ 0.096642726983623678505179907627589,
+ 0.099173598721791959332393173484603,
+ 0.100769845523875595044946662617570,
+ 0.101330007014791549017374792767493
+};
+
+void
+gsl_integration_qk31 (const gsl_function * f, double a, double b,
+ double *result, double *abserr,
+ double *resabs, double *resasc)
+{
+ double fv1[16], fv2[16];
+ gsl_integration_qk (16, xgk, wg, wgk, fv1, fv2, f, a, b, result, abserr, resabs, resasc);
+}
diff --git a/gsl-1.9/integration/qk41.c b/gsl-1.9/integration/qk41.c
new file mode 100644
index 0000000..0398141
--- /dev/null
+++ b/gsl-1.9/integration/qk41.c
@@ -0,0 +1,102 @@
+/* integration/qk41.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_integration.h>
+
+/* Gauss quadrature weights and kronrod quadrature abscissae and
+ weights as evaluated with 80 decimal digit arithmetic by
+ L. W. Fullerton, Bell Labs, Nov. 1981. */
+
+static const double xgk[21] = /* abscissae of the 41-point kronrod rule */
+{
+ 0.998859031588277663838315576545863,
+ 0.993128599185094924786122388471320,
+ 0.981507877450250259193342994720217,
+ 0.963971927277913791267666131197277,
+ 0.940822633831754753519982722212443,
+ 0.912234428251325905867752441203298,
+ 0.878276811252281976077442995113078,
+ 0.839116971822218823394529061701521,
+ 0.795041428837551198350638833272788,
+ 0.746331906460150792614305070355642,
+ 0.693237656334751384805490711845932,
+ 0.636053680726515025452836696226286,
+ 0.575140446819710315342946036586425,
+ 0.510867001950827098004364050955251,
+ 0.443593175238725103199992213492640,
+ 0.373706088715419560672548177024927,
+ 0.301627868114913004320555356858592,
+ 0.227785851141645078080496195368575,
+ 0.152605465240922675505220241022678,
+ 0.076526521133497333754640409398838,
+ 0.000000000000000000000000000000000
+};
+
+/* xgk[1], xgk[3], ... abscissae of the 20-point gauss rule.
+ xgk[0], xgk[2], ... abscissae to optimally extend the 20-point gauss rule */
+
+static const double wg[11] = /* weights of the 20-point gauss rule */
+{
+ 0.017614007139152118311861962351853,
+ 0.040601429800386941331039952274932,
+ 0.062672048334109063569506535187042,
+ 0.083276741576704748724758143222046,
+ 0.101930119817240435036750135480350,
+ 0.118194531961518417312377377711382,
+ 0.131688638449176626898494499748163,
+ 0.142096109318382051329298325067165,
+ 0.149172986472603746787828737001969,
+ 0.152753387130725850698084331955098
+};
+
+static const double wgk[21] = /* weights of the 41-point kronrod rule */
+{
+ 0.003073583718520531501218293246031,
+ 0.008600269855642942198661787950102,
+ 0.014626169256971252983787960308868,
+ 0.020388373461266523598010231432755,
+ 0.025882133604951158834505067096153,
+ 0.031287306777032798958543119323801,
+ 0.036600169758200798030557240707211,
+ 0.041668873327973686263788305936895,
+ 0.046434821867497674720231880926108,
+ 0.050944573923728691932707670050345,
+ 0.055195105348285994744832372419777,
+ 0.059111400880639572374967220648594,
+ 0.062653237554781168025870122174255,
+ 0.065834597133618422111563556969398,
+ 0.068648672928521619345623411885368,
+ 0.071054423553444068305790361723210,
+ 0.073030690332786667495189417658913,
+ 0.074582875400499188986581418362488,
+ 0.075704497684556674659542775376617,
+ 0.076377867672080736705502835038061,
+ 0.076600711917999656445049901530102
+};
+
+void
+gsl_integration_qk41 (const gsl_function * f, double a, double b,
+ double *result, double *abserr,
+ double *resabs, double *resasc)
+{
+ double fv1[21], fv2[21];
+ gsl_integration_qk (21, xgk, wg, wgk, fv1, fv2, f, a, b, result, abserr, resabs, resasc);
+}
+
diff --git a/gsl-1.9/integration/qk51.c b/gsl-1.9/integration/qk51.c
new file mode 100644
index 0000000..803280e
--- /dev/null
+++ b/gsl-1.9/integration/qk51.c
@@ -0,0 +1,117 @@
+/* integration/qk51.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_integration.h>
+
+/* Gauss quadrature weights and kronrod quadrature abscissae and
+ weights as evaluated with 80 decimal digit arithmetic by
+ L. W. Fullerton, Bell Labs, Nov. 1981. */
+
+static const double xgk[26] = /* abscissae of the 51-point kronrod rule */
+{
+ 0.999262104992609834193457486540341,
+ 0.995556969790498097908784946893902,
+ 0.988035794534077247637331014577406,
+ 0.976663921459517511498315386479594,
+ 0.961614986425842512418130033660167,
+ 0.942974571228974339414011169658471,
+ 0.920747115281701561746346084546331,
+ 0.894991997878275368851042006782805,
+ 0.865847065293275595448996969588340,
+ 0.833442628760834001421021108693570,
+ 0.797873797998500059410410904994307,
+ 0.759259263037357630577282865204361,
+ 0.717766406813084388186654079773298,
+ 0.673566368473468364485120633247622,
+ 0.626810099010317412788122681624518,
+ 0.577662930241222967723689841612654,
+ 0.526325284334719182599623778158010,
+ 0.473002731445714960522182115009192,
+ 0.417885382193037748851814394594572,
+ 0.361172305809387837735821730127641,
+ 0.303089538931107830167478909980339,
+ 0.243866883720988432045190362797452,
+ 0.183718939421048892015969888759528,
+ 0.122864692610710396387359818808037,
+ 0.061544483005685078886546392366797,
+ 0.000000000000000000000000000000000
+};
+
+/* xgk[1], xgk[3], ... abscissae of the 25-point gauss rule.
+ xgk[0], xgk[2], ... abscissae to optimally extend the 25-point gauss rule */
+
+static const double wg[13] = /* weights of the 25-point gauss rule */
+{
+ 0.011393798501026287947902964113235,
+ 0.026354986615032137261901815295299,
+ 0.040939156701306312655623487711646,
+ 0.054904695975835191925936891540473,
+ 0.068038333812356917207187185656708,
+ 0.080140700335001018013234959669111,
+ 0.091028261982963649811497220702892,
+ 0.100535949067050644202206890392686,
+ 0.108519624474263653116093957050117,
+ 0.114858259145711648339325545869556,
+ 0.119455763535784772228178126512901,
+ 0.122242442990310041688959518945852,
+ 0.123176053726715451203902873079050
+};
+
+static const double wgk[26] = /* weights of the 51-point kronrod rule */
+{
+ 0.001987383892330315926507851882843,
+ 0.005561932135356713758040236901066,
+ 0.009473973386174151607207710523655,
+ 0.013236229195571674813656405846976,
+ 0.016847817709128298231516667536336,
+ 0.020435371145882835456568292235939,
+ 0.024009945606953216220092489164881,
+ 0.027475317587851737802948455517811,
+ 0.030792300167387488891109020215229,
+ 0.034002130274329337836748795229551,
+ 0.037116271483415543560330625367620,
+ 0.040083825504032382074839284467076,
+ 0.042872845020170049476895792439495,
+ 0.045502913049921788909870584752660,
+ 0.047982537138836713906392255756915,
+ 0.050277679080715671963325259433440,
+ 0.052362885806407475864366712137873,
+ 0.054251129888545490144543370459876,
+ 0.055950811220412317308240686382747,
+ 0.057437116361567832853582693939506,
+ 0.058689680022394207961974175856788,
+ 0.059720340324174059979099291932562,
+ 0.060539455376045862945360267517565,
+ 0.061128509717053048305859030416293,
+ 0.061471189871425316661544131965264,
+ 0.061580818067832935078759824240066
+};
+
+/* wgk[25] was calculated from the values of wgk[0..24] */
+
+void
+gsl_integration_qk51 (const gsl_function * f, double a, double b,
+ double *result, double *abserr,
+ double *resabs, double *resasc)
+{
+ double fv1[26], fv2[26];
+ gsl_integration_qk (26, xgk, wg, wgk, fv1, fv2, f, a, b, result, abserr, resabs, resasc);
+}
+
diff --git a/gsl-1.9/integration/qk61.c b/gsl-1.9/integration/qk61.c
new file mode 100644
index 0000000..d144db4
--- /dev/null
+++ b/gsl-1.9/integration/qk61.c
@@ -0,0 +1,126 @@
+/* integration/qk61.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_integration.h>
+
+/* Gauss quadrature weights and kronrod quadrature abscissae and
+ weights as evaluated with 80 decimal digit arithmetic by
+ L. W. Fullerton, Bell Labs, Nov. 1981. */
+
+static const double xgk[31] = /* abscissae of the 61-point kronrod rule */
+{
+ 0.999484410050490637571325895705811,
+ 0.996893484074649540271630050918695,
+ 0.991630996870404594858628366109486,
+ 0.983668123279747209970032581605663,
+ 0.973116322501126268374693868423707,
+ 0.960021864968307512216871025581798,
+ 0.944374444748559979415831324037439,
+ 0.926200047429274325879324277080474,
+ 0.905573307699907798546522558925958,
+ 0.882560535792052681543116462530226,
+ 0.857205233546061098958658510658944,
+ 0.829565762382768397442898119732502,
+ 0.799727835821839083013668942322683,
+ 0.767777432104826194917977340974503,
+ 0.733790062453226804726171131369528,
+ 0.697850494793315796932292388026640,
+ 0.660061064126626961370053668149271,
+ 0.620526182989242861140477556431189,
+ 0.579345235826361691756024932172540,
+ 0.536624148142019899264169793311073,
+ 0.492480467861778574993693061207709,
+ 0.447033769538089176780609900322854,
+ 0.400401254830394392535476211542661,
+ 0.352704725530878113471037207089374,
+ 0.304073202273625077372677107199257,
+ 0.254636926167889846439805129817805,
+ 0.204525116682309891438957671002025,
+ 0.153869913608583546963794672743256,
+ 0.102806937966737030147096751318001,
+ 0.051471842555317695833025213166723,
+ 0.000000000000000000000000000000000
+};
+
+/* xgk[1], xgk[3], ... abscissae of the 30-point gauss rule.
+ xgk[0], xgk[2], ... abscissae to optimally extend the 30-point gauss rule */
+
+static const double wg[15] = /* weights of the 30-point gauss rule */
+{
+ 0.007968192496166605615465883474674,
+ 0.018466468311090959142302131912047,
+ 0.028784707883323369349719179611292,
+ 0.038799192569627049596801936446348,
+ 0.048402672830594052902938140422808,
+ 0.057493156217619066481721689402056,
+ 0.065974229882180495128128515115962,
+ 0.073755974737705206268243850022191,
+ 0.080755895229420215354694938460530,
+ 0.086899787201082979802387530715126,
+ 0.092122522237786128717632707087619,
+ 0.096368737174644259639468626351810,
+ 0.099593420586795267062780282103569,
+ 0.101762389748405504596428952168554,
+ 0.102852652893558840341285636705415
+};
+
+static const double wgk[31] = /* weights of the 61-point kronrod rule */
+{
+ 0.001389013698677007624551591226760,
+ 0.003890461127099884051267201844516,
+ 0.006630703915931292173319826369750,
+ 0.009273279659517763428441146892024,
+ 0.011823015253496341742232898853251,
+ 0.014369729507045804812451432443580,
+ 0.016920889189053272627572289420322,
+ 0.019414141193942381173408951050128,
+ 0.021828035821609192297167485738339,
+ 0.024191162078080601365686370725232,
+ 0.026509954882333101610601709335075,
+ 0.028754048765041292843978785354334,
+ 0.030907257562387762472884252943092,
+ 0.032981447057483726031814191016854,
+ 0.034979338028060024137499670731468,
+ 0.036882364651821229223911065617136,
+ 0.038678945624727592950348651532281,
+ 0.040374538951535959111995279752468,
+ 0.041969810215164246147147541285970,
+ 0.043452539701356069316831728117073,
+ 0.044814800133162663192355551616723,
+ 0.046059238271006988116271735559374,
+ 0.047185546569299153945261478181099,
+ 0.048185861757087129140779492298305,
+ 0.049055434555029778887528165367238,
+ 0.049795683427074206357811569379942,
+ 0.050405921402782346840893085653585,
+ 0.050881795898749606492297473049805,
+ 0.051221547849258772170656282604944,
+ 0.051426128537459025933862879215781,
+ 0.051494729429451567558340433647099
+};
+
+void
+gsl_integration_qk61 (const gsl_function * f, double a, double b,
+ double *result, double *abserr,
+ double *resabs, double *resasc)
+{
+ double fv1[31], fv2[31];
+ gsl_integration_qk (31, xgk, wg, wgk, fv1, fv2, f, a, b, result, abserr, resabs, resasc);
+}
diff --git a/gsl-1.9/integration/qmomo.c b/gsl-1.9/integration/qmomo.c
new file mode 100644
index 0000000..62125a9
--- /dev/null
+++ b/gsl-1.9/integration/qmomo.c
@@ -0,0 +1,193 @@
+/* integration/qmomo.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_integration.h>
+#include <gsl/gsl_errno.h>
+
+static void
+initialise (double * ri, double * rj, double * rg, double * rh,
+ double alpha, double beta);
+
+gsl_integration_qaws_table *
+gsl_integration_qaws_table_alloc (double alpha, double beta, int mu, int nu)
+{
+ gsl_integration_qaws_table * t;
+
+ if (alpha < -1.0)
+ {
+ GSL_ERROR_VAL ("alpha must be greater than -1.0", GSL_EINVAL, 0);
+ }
+
+ if (beta < -1.0)
+ {
+ GSL_ERROR_VAL ("beta must be greater than -1.0", GSL_EINVAL, 0);
+ }
+
+ if (mu != 0 && mu != 1)
+ {
+ GSL_ERROR_VAL ("mu must be 0 or 1", GSL_EINVAL, 0);
+ }
+
+ if (nu != 0 && nu != 1)
+ {
+ GSL_ERROR_VAL ("nu must be 0 or 1", GSL_EINVAL, 0);
+ }
+
+ t = (gsl_integration_qaws_table *)
+ malloc(sizeof(gsl_integration_qaws_table));
+
+ if (t == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for qaws_table struct",
+ GSL_ENOMEM, 0);
+ }
+
+ t->alpha = alpha;
+ t->beta = beta;
+ t->mu = mu;
+ t->nu = nu;
+
+ initialise (t->ri, t->rj, t->rg, t->rh, alpha, beta);
+
+ return t;
+}
+
+
+int
+gsl_integration_qaws_table_set (gsl_integration_qaws_table * t,
+ double alpha, double beta, int mu, int nu)
+{
+ if (alpha < -1.0)
+ {
+ GSL_ERROR ("alpha must be greater than -1.0", GSL_EINVAL);
+ }
+
+ if (beta < -1.0)
+ {
+ GSL_ERROR ("beta must be greater than -1.0", GSL_EINVAL);
+ }
+
+ if (mu != 0 && mu != 1)
+ {
+ GSL_ERROR ("mu must be 0 or 1", GSL_EINVAL);
+ }
+
+ if (nu != 0 && nu != 1)
+ {
+ GSL_ERROR ("nu must be 0 or 1", GSL_EINVAL);
+ }
+
+ t->alpha = alpha;
+ t->beta = beta;
+ t->mu = mu;
+ t->nu = nu;
+
+ initialise (t->ri, t->rj, t->rg, t->rh, alpha, beta);
+
+ return GSL_SUCCESS;
+}
+
+
+void
+gsl_integration_qaws_table_free (gsl_integration_qaws_table * t)
+{
+ free (t);
+}
+
+static void
+initialise (double * ri, double * rj, double * rg, double * rh,
+ double alpha, double beta)
+{
+ const double alpha_p1 = alpha + 1.0;
+ const double beta_p1 = beta + 1.0;
+
+ const double alpha_p2 = alpha + 2.0;
+ const double beta_p2 = beta + 2.0;
+
+ const double r_alpha = pow (2.0, alpha_p1);
+ const double r_beta = pow (2.0, beta_p1);
+
+ size_t i;
+
+ double an, anm1;
+
+ ri[0] = r_alpha / alpha_p1;
+ ri[1] = ri[0] * alpha / alpha_p2;
+
+ an = 2.0;
+ anm1 = 1.0;
+
+ for (i = 2; i < 25; i++)
+ {
+ ri[i] = -(r_alpha + an * (an - alpha_p2) * ri[i - 1])
+ / (anm1 * (an + alpha_p1));
+ anm1 = an;
+ an = an + 1.0;
+ }
+
+ rj[0] = r_beta / beta_p1;
+ rj[1] = rj[0] * beta / beta_p2;
+
+ an = 2.0;
+ anm1 = 1.0;
+
+ for (i = 2; i < 25; i++)
+ {
+ rj[i] = -(r_beta + an * (an - beta_p2) * rj[i - 1])
+ / (anm1 * (an + beta_p1));
+ anm1 = an;
+ an = an + 1.0;
+ }
+
+ rg[0] = -ri[0] / alpha_p1;
+ rg[1] = -rg[0] - 2.0 * r_alpha / (alpha_p2 * alpha_p2);
+
+ an = 2.0;
+ anm1 = 1.0;
+
+ for (i = 2; i < 25; i++)
+ {
+ rg[i] = -(an * (an - alpha_p2) * rg[i - 1] - an * ri[i - 1]
+ + anm1 * ri[i]) / (anm1 * (an + alpha_p1));
+ anm1 = an;
+ an = an + 1.0;
+ }
+
+ rh[0] = -rj[0] / beta_p1;
+ rh[1] = -rh[0] - 2.0 * r_beta / (beta_p2 * beta_p2);
+
+ an = 2.0;
+ anm1 = 1.0;
+
+ for (i = 2; i < 25; i++)
+ {
+ rh[i] = -(an * (an - beta_p2) * rh[i - 1] - an * rj[i - 1]
+ + anm1 * rj[i]) / (anm1 * (an + beta_p1));
+ anm1 = an;
+ an = an + 1.0;
+ }
+
+ for (i = 1; i < 25; i += 2)
+ {
+ rj[i] *= -1;
+ rh[i] *= -1;
+ }
+}
diff --git a/gsl-1.9/integration/qmomof.c b/gsl-1.9/integration/qmomof.c
new file mode 100644
index 0000000..b0026dc
--- /dev/null
+++ b/gsl-1.9/integration/qmomof.c
@@ -0,0 +1,389 @@
+/* integration/qmomof.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_integration.h>
+#include <gsl/gsl_errno.h>
+
+static void
+compute_moments (double par, double * cheb);
+
+static int
+dgtsl (size_t n, double *c, double *d, double *e, double *b);
+
+gsl_integration_qawo_table *
+gsl_integration_qawo_table_alloc (double omega, double L,
+ enum gsl_integration_qawo_enum sine,
+ size_t n)
+{
+ gsl_integration_qawo_table *t;
+ double * chebmo;
+
+ if (n == 0)
+ {
+ GSL_ERROR_VAL ("table length n must be positive integer",
+ GSL_EDOM, 0);
+ }
+
+ t = (gsl_integration_qawo_table *)
+ malloc (sizeof (gsl_integration_qawo_table));
+
+ if (t == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for qawo_table struct",
+ GSL_ENOMEM, 0);
+ }
+
+ chebmo = (double *) malloc (25 * n * sizeof (double));
+
+ if (chebmo == 0)
+ {
+ free (t);
+ GSL_ERROR_VAL ("failed to allocate space for chebmo block",
+ GSL_ENOMEM, 0);
+ }
+
+ t->n = n;
+ t->sine = sine;
+ t->omega = omega;
+ t->L = L;
+ t->par = 0.5 * omega * L;
+ t->chebmo = chebmo;
+
+ /* precompute the moments */
+
+ {
+ size_t i;
+ double scale = 1.0;
+
+ for (i = 0 ; i < t->n; i++)
+ {
+ compute_moments (t->par * scale, t->chebmo + 25*i);
+ scale *= 0.5;
+ }
+ }
+
+ return t;
+}
+
+int
+gsl_integration_qawo_table_set (gsl_integration_qawo_table * t,
+ double omega, double L,
+ enum gsl_integration_qawo_enum sine)
+{
+ t->omega = omega;
+ t->sine = sine;
+ t->L = L;
+ t->par = 0.5 * omega * L;
+
+ /* recompute the moments */
+
+ {
+ size_t i;
+ double scale = 1.0;
+
+ for (i = 0 ; i < t->n; i++)
+ {
+ compute_moments (t->par * scale, t->chebmo + 25*i);
+ scale *= 0.5;
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+int
+gsl_integration_qawo_table_set_length (gsl_integration_qawo_table * t,
+ double L)
+{
+ /* return immediately if the length is the same as the old length */
+
+ if (L == t->L)
+ return GSL_SUCCESS;
+
+ /* otherwise reset the table and compute the new parameters */
+
+ t->L = L;
+ t->par = 0.5 * t->omega * L;
+
+ /* recompute the moments */
+
+ {
+ size_t i;
+ double scale = 1.0;
+
+ for (i = 0 ; i < t->n; i++)
+ {
+ compute_moments (t->par * scale, t->chebmo + 25*i);
+ scale *= 0.5;
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+void
+gsl_integration_qawo_table_free (gsl_integration_qawo_table * t)
+{
+ free (t->chebmo);
+ free (t);
+}
+
+static void
+compute_moments (double par, double *chebmo)
+{
+ double v[28], d[25], d1[25], d2[25];
+
+ const size_t noeq = 25;
+
+ const double par2 = par * par;
+ const double par4 = par2 * par2;
+ const double par22 = par2 + 2.0;
+
+ const double sinpar = sin (par);
+ const double cospar = cos (par);
+
+ size_t i;
+
+ /* compute the chebyschev moments with respect to cosine */
+
+ double ac = 8 * cospar;
+ double as = 24 * par * sinpar;
+
+ v[0] = 2 * sinpar / par;
+ v[1] = (8 * cospar + (2 * par2 - 8) * sinpar / par) / par2;
+ v[2] = (32 * (par2 - 12) * cospar
+ + (2 * ((par2 - 80) * par2 + 192) * sinpar) / par) / par4;
+
+ if (fabs (par) <= 24)
+ {
+ /* compute the moments as the solution of a boundary value
+ problem using the asyptotic expansion as an endpoint */
+
+ double an2, ass, asap;
+ double an = 6;
+ size_t k;
+
+ for (k = 0; k < noeq - 1; k++)
+ {
+ an2 = an * an;
+ d[k] = -2 * (an2 - 4) * (par22 - 2 * an2);
+ d2[k] = (an - 1) * (an - 2) * par2;
+ d1[k + 1] = (an + 3) * (an + 4) * par2;
+ v[k + 3] = as - (an2 - 4) * ac;
+ an = an + 2.0;
+ }
+
+ an2 = an * an;
+
+ d[noeq - 1] = -2 * (an2 - 4) * (par22 - 2 * an2);
+ v[noeq + 2] = as - (an2 - 4) * ac;
+ v[3] = v[3] - 56 * par2 * v[2];
+
+ ass = par * sinpar;
+ asap = (((((210 * par2 - 1) * cospar - (105 * par2 - 63) * ass) / an2
+ - (1 - 15 * par2) * cospar + 15 * ass) / an2
+ - cospar + 3 * ass) / an2
+ - cospar) / an2;
+ v[noeq + 2] = v[noeq + 2] - 2 * asap * par2 * (an - 1) * (an - 2);
+
+ dgtsl (noeq, d1, d, d2, v + 3);
+
+ }
+ else
+ {
+ /* compute the moments by forward recursion */
+ size_t k;
+ double an = 4;
+
+ for (k = 3; k < 13; k++)
+ {
+ double an2 = an * an;
+ v[k] = ((an2 - 4) * (2 * (par22 - 2 * an2) * v[k - 1] - ac)
+ + as - par2 * (an + 1) * (an + 2) * v[k - 2])
+ / (par2 * (an - 1) * (an - 2));
+ an = an + 2.0;
+ }
+ }
+
+
+ for (i = 0; i < 13; i++)
+ {
+ chebmo[2 * i] = v[i];
+ }
+
+ /* compute the chebyschev moments with respect to sine */
+
+ v[0] = 2 * (sinpar - par * cospar) / par2;
+ v[1] = (18 - 48 / par2) * sinpar / par2 + (-2 + 48 / par2) * cospar / par;
+
+ ac = -24 * par * cospar;
+ as = -8 * sinpar;
+
+ if (fabs (par) <= 24)
+ {
+ /* compute the moments as the solution of a boundary value
+ problem using the asyptotic expansion as an endpoint */
+
+ size_t k;
+ double an2, ass, asap;
+ double an = 5;
+
+ for (k = 0; k < noeq - 1; k++)
+ {
+ an2 = an * an;
+ d[k] = -2 * (an2 - 4) * (par22 - 2 * an2);
+ d2[k] = (an - 1) * (an - 2) * par2;
+ d1[k + 1] = (an + 3) * (an + 4) * par2;
+ v[k + 2] = ac + (an2 - 4) * as;
+ an = an + 2.0;
+ }
+
+ an2 = an * an;
+
+ d[noeq - 1] = -2 * (an2 - 4) * (par22 - 2 * an2);
+ v[noeq + 1] = ac + (an2 - 4) * as;
+ v[2] = v[2] - 42 * par2 * v[1];
+
+ ass = par * cospar;
+ asap = (((((105 * par2 - 63) * ass - (210 * par2 - 1) * sinpar) / an2
+ + (15 * par2 - 1) * sinpar
+ - 15 * ass) / an2 - sinpar - 3 * ass) / an2 - sinpar) / an2;
+ v[noeq + 1] = v[noeq + 1] - 2 * asap * par2 * (an - 1) * (an - 2);
+
+ dgtsl (noeq, d1, d, d2, v + 2);
+
+ }
+ else
+ {
+ /* compute the moments by forward recursion */
+ size_t k;
+ double an = 3;
+ for (k = 2; k < 12; k++)
+ {
+ double an2 = an * an;
+ v[k] = ((an2 - 4) * (2 * (par22 - 2 * an2) * v[k - 1] + as)
+ + ac - par2 * (an + 1) * (an + 2) * v[k - 2])
+ / (par2 * (an - 1) * (an - 2));
+ an = an + 2.0;
+ }
+ }
+
+ for (i = 0; i < 12; i++)
+ {
+ chebmo[2 * i + 1] = v[i];
+ }
+
+}
+
+static int
+dgtsl (size_t n, double *c, double *d, double *e, double *b)
+{
+ /* solves a tridiagonal matrix A x = b
+
+ c[1 .. n - 1] subdiagonal of the matrix A
+ d[0 .. n - 1] diagonal of the matrix A
+ e[0 .. n - 2] superdiagonal of the matrix A
+
+ b[0 .. n - 1] right hand side, replaced by the solution vector x */
+
+ size_t k;
+
+ c[0] = d[0];
+
+ if (n == 0)
+ {
+ return GSL_SUCCESS;
+ }
+
+ if (n == 1)
+ {
+ b[0] = b[0] / d[0] ;
+ return GSL_SUCCESS;
+ }
+
+ d[0] = e[0];
+ e[0] = 0;
+ e[n - 1] = 0;
+
+ for (k = 0; k < n - 1; k++)
+ {
+ size_t k1 = k + 1;
+
+ if (fabs (c[k1]) >= fabs (c[k]))
+ {
+ {
+ double t = c[k1];
+ c[k1] = c[k];
+ c[k] = t;
+ };
+ {
+ double t = d[k1];
+ d[k1] = d[k];
+ d[k] = t;
+ };
+ {
+ double t = e[k1];
+ e[k1] = e[k];
+ e[k] = t;
+ };
+ {
+ double t = b[k1];
+ b[k1] = b[k];
+ b[k] = t;
+ };
+ }
+
+ if (c[k] == 0)
+ {
+ return GSL_FAILURE ;
+ }
+
+ {
+ double t = -c[k1] / c[k];
+
+ c[k1] = d[k1] + t * d[k];
+ d[k1] = e[k1] + t * e[k];
+ e[k1] = 0;
+ b[k1] = b[k1] + t * b[k];
+ }
+
+ }
+
+ if (c[n - 1] == 0)
+ {
+ return GSL_FAILURE;
+ }
+
+
+ b[n - 1] = b[n - 1] / c[n - 1];
+
+ b[n - 2] = (b[n - 2] - d[n - 2] * b[n - 1]) / c[n - 2];
+
+ for (k = n ; k > 2; k--)
+ {
+ size_t kb = k - 3;
+ b[kb] = (b[kb] - d[kb] * b[kb + 1] - e[kb] * b[kb + 2]) / c[kb];
+ }
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/integration/qng.c b/gsl-1.9/integration/qng.c
new file mode 100644
index 0000000..ecf8e62
--- /dev/null
+++ b/gsl-1.9/integration/qng.c
@@ -0,0 +1,190 @@
+/* integration/qng.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <float.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_integration.h>
+
+#include "err.c"
+#include "qng.h"
+
+int
+gsl_integration_qng (const gsl_function *f,
+ double a, double b,
+ double epsabs, double epsrel,
+ double * result, double * abserr, size_t * neval)
+{
+ double fv1[5], fv2[5], fv3[5], fv4[5];
+ double savfun[21]; /* array of function values which have been computed */
+ double res10, res21, res43, res87; /* 10, 21, 43 and 87 point results */
+ double result_kronrod, err ;
+ double resabs; /* approximation to the integral of abs(f) */
+ double resasc; /* approximation to the integral of abs(f-i/(b-a)) */
+
+ const double half_length = 0.5 * (b - a);
+ const double abs_half_length = fabs (half_length);
+ const double center = 0.5 * (b + a);
+ const double f_center = GSL_FN_EVAL(f, center);
+
+ int k ;
+
+ if (epsabs <= 0 && (epsrel < 50 * GSL_DBL_EPSILON || epsrel < 0.5e-28))
+ {
+ * result = 0;
+ * abserr = 0;
+ * neval = 0;
+ GSL_ERROR ("tolerance cannot be acheived with given epsabs and epsrel",
+ GSL_EBADTOL);
+ };
+
+ /* Compute the integral using the 10- and 21-point formula. */
+
+ res10 = 0;
+ res21 = w21b[5] * f_center;
+ resabs = w21b[5] * fabs (f_center);
+
+ for (k = 0; k < 5; k++)
+ {
+ const double abscissa = half_length * x1[k];
+ const double fval1 = GSL_FN_EVAL(f, center + abscissa);
+ const double fval2 = GSL_FN_EVAL(f, center - abscissa);
+ const double fval = fval1 + fval2;
+ res10 += w10[k] * fval;
+ res21 += w21a[k] * fval;
+ resabs += w21a[k] * (fabs (fval1) + fabs (fval2));
+ savfun[k] = fval;
+ fv1[k] = fval1;
+ fv2[k] = fval2;
+ }
+
+ for (k = 0; k < 5; k++)
+ {
+ const double abscissa = half_length * x2[k];
+ const double fval1 = GSL_FN_EVAL(f, center + abscissa);
+ const double fval2 = GSL_FN_EVAL(f, center - abscissa);
+ const double fval = fval1 + fval2;
+ res21 += w21b[k] * fval;
+ resabs += w21b[k] * (fabs (fval1) + fabs (fval2));
+ savfun[k + 5] = fval;
+ fv3[k] = fval1;
+ fv4[k] = fval2;
+ }
+
+ resabs *= abs_half_length ;
+
+ {
+ const double mean = 0.5 * res21;
+
+ resasc = w21b[5] * fabs (f_center - mean);
+
+ for (k = 0; k < 5; k++)
+ {
+ resasc +=
+ (w21a[k] * (fabs (fv1[k] - mean) + fabs (fv2[k] - mean))
+ + w21b[k] * (fabs (fv3[k] - mean) + fabs (fv4[k] - mean)));
+ }
+ resasc *= abs_half_length ;
+ }
+
+ result_kronrod = res21 * half_length;
+
+ err = rescale_error ((res21 - res10) * half_length, resabs, resasc) ;
+
+ /* test for convergence. */
+
+ if (err < epsabs || err < epsrel * fabs (result_kronrod))
+ {
+ * result = result_kronrod ;
+ * abserr = err ;
+ * neval = 21;
+ return GSL_SUCCESS;
+ }
+
+ /* compute the integral using the 43-point formula. */
+
+ res43 = w43b[11] * f_center;
+
+ for (k = 0; k < 10; k++)
+ {
+ res43 += savfun[k] * w43a[k];
+ }
+
+ for (k = 0; k < 11; k++)
+ {
+ const double abscissa = half_length * x3[k];
+ const double fval = (GSL_FN_EVAL(f, center + abscissa)
+ + GSL_FN_EVAL(f, center - abscissa));
+ res43 += fval * w43b[k];
+ savfun[k + 10] = fval;
+ }
+
+ /* test for convergence */
+
+ result_kronrod = res43 * half_length;
+ err = rescale_error ((res43 - res21) * half_length, resabs, resasc);
+
+ if (err < epsabs || err < epsrel * fabs (result_kronrod))
+ {
+ * result = result_kronrod ;
+ * abserr = err ;
+ * neval = 43;
+ return GSL_SUCCESS;
+ }
+
+ /* compute the integral using the 87-point formula. */
+
+ res87 = w87b[22] * f_center;
+
+ for (k = 0; k < 21; k++)
+ {
+ res87 += savfun[k] * w87a[k];
+ }
+
+ for (k = 0; k < 22; k++)
+ {
+ const double abscissa = half_length * x4[k];
+ res87 += w87b[k] * (GSL_FN_EVAL(f, center + abscissa)
+ + GSL_FN_EVAL(f, center - abscissa));
+ }
+
+ /* test for convergence */
+
+ result_kronrod = res87 * half_length ;
+
+ err = rescale_error ((res87 - res43) * half_length, resabs, resasc);
+
+ if (err < epsabs || err < epsrel * fabs (result_kronrod))
+ {
+ * result = result_kronrod ;
+ * abserr = err ;
+ * neval = 87;
+ return GSL_SUCCESS;
+ }
+
+ /* failed to converge */
+
+ * result = result_kronrod ;
+ * abserr = err ;
+ * neval = 87;
+
+ GSL_ERROR("failed to reach tolerance with highest-order rule", GSL_ETOL) ;
+}
diff --git a/gsl-1.9/integration/qng.h b/gsl-1.9/integration/qng.h
new file mode 100644
index 0000000..dbdffdf
--- /dev/null
+++ b/gsl-1.9/integration/qng.h
@@ -0,0 +1,193 @@
+/* integration/qng.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Gauss-Kronrod-Patterson quadrature coefficients for use in
+ quadpack routine qng. These coefficients were calculated with
+ 101 decimal digit arithmetic by L. W. Fullerton, Bell Labs, Nov
+ 1981. */
+
+/* x1, abscissae common to the 10-, 21-, 43- and 87-point rule */
+static const double x1[5] = {
+ 0.973906528517171720077964012084452,
+ 0.865063366688984510732096688423493,
+ 0.679409568299024406234327365114874,
+ 0.433395394129247190799265943165784,
+ 0.148874338981631210884826001129720
+} ;
+
+/* w10, weights of the 10-point formula */
+static const double w10[5] = {
+ 0.066671344308688137593568809893332,
+ 0.149451349150580593145776339657697,
+ 0.219086362515982043995534934228163,
+ 0.269266719309996355091226921569469,
+ 0.295524224714752870173892994651338
+} ;
+
+/* x2, abscissae common to the 21-, 43- and 87-point rule */
+static const double x2[5] = {
+ 0.995657163025808080735527280689003,
+ 0.930157491355708226001207180059508,
+ 0.780817726586416897063717578345042,
+ 0.562757134668604683339000099272694,
+ 0.294392862701460198131126603103866
+} ;
+
+/* w21a, weights of the 21-point formula for abscissae x1 */
+static const double w21a[5] = {
+ 0.032558162307964727478818972459390,
+ 0.075039674810919952767043140916190,
+ 0.109387158802297641899210590325805,
+ 0.134709217311473325928054001771707,
+ 0.147739104901338491374841515972068
+} ;
+
+/* w21b, weights of the 21-point formula for abscissae x2 */
+static const double w21b[6] = {
+ 0.011694638867371874278064396062192,
+ 0.054755896574351996031381300244580,
+ 0.093125454583697605535065465083366,
+ 0.123491976262065851077958109831074,
+ 0.142775938577060080797094273138717,
+ 0.149445554002916905664936468389821
+} ;
+
+/* x3, abscissae common to the 43- and 87-point rule */
+static const double x3[11] = {
+ 0.999333360901932081394099323919911,
+ 0.987433402908088869795961478381209,
+ 0.954807934814266299257919200290473,
+ 0.900148695748328293625099494069092,
+ 0.825198314983114150847066732588520,
+ 0.732148388989304982612354848755461,
+ 0.622847970537725238641159120344323,
+ 0.499479574071056499952214885499755,
+ 0.364901661346580768043989548502644,
+ 0.222254919776601296498260928066212,
+ 0.074650617461383322043914435796506
+} ;
+
+/* w43a, weights of the 43-point formula for abscissae x1, x3 */
+static const double w43a[10] = {
+ 0.016296734289666564924281974617663,
+ 0.037522876120869501461613795898115,
+ 0.054694902058255442147212685465005,
+ 0.067355414609478086075553166302174,
+ 0.073870199632393953432140695251367,
+ 0.005768556059769796184184327908655,
+ 0.027371890593248842081276069289151,
+ 0.046560826910428830743339154433824,
+ 0.061744995201442564496240336030883,
+ 0.071387267268693397768559114425516
+} ;
+
+/* w43b, weights of the 43-point formula for abscissae x3 */
+static const double w43b[12] = {
+ 0.001844477640212414100389106552965,
+ 0.010798689585891651740465406741293,
+ 0.021895363867795428102523123075149,
+ 0.032597463975345689443882222526137,
+ 0.042163137935191811847627924327955,
+ 0.050741939600184577780189020092084,
+ 0.058379395542619248375475369330206,
+ 0.064746404951445885544689259517511,
+ 0.069566197912356484528633315038405,
+ 0.072824441471833208150939535192842,
+ 0.074507751014175118273571813842889,
+ 0.074722147517403005594425168280423
+} ;
+
+/* x4, abscissae of the 87-point rule */
+static const double x4[22] = {
+ 0.999902977262729234490529830591582,
+ 0.997989895986678745427496322365960,
+ 0.992175497860687222808523352251425,
+ 0.981358163572712773571916941623894,
+ 0.965057623858384619128284110607926,
+ 0.943167613133670596816416634507426,
+ 0.915806414685507209591826430720050,
+ 0.883221657771316501372117548744163,
+ 0.845710748462415666605902011504855,
+ 0.803557658035230982788739474980964,
+ 0.757005730685495558328942793432020,
+ 0.706273209787321819824094274740840,
+ 0.651589466501177922534422205016736,
+ 0.593223374057961088875273770349144,
+ 0.531493605970831932285268948562671,
+ 0.466763623042022844871966781659270,
+ 0.399424847859218804732101665817923,
+ 0.329874877106188288265053371824597,
+ 0.258503559202161551802280975429025,
+ 0.185695396568346652015917141167606,
+ 0.111842213179907468172398359241362,
+ 0.037352123394619870814998165437704
+} ;
+
+/* w87a, weights of the 87-point formula for abscissae x1, x2, x3 */
+static const double w87a[21] = {
+ 0.008148377384149172900002878448190,
+ 0.018761438201562822243935059003794,
+ 0.027347451050052286161582829741283,
+ 0.033677707311637930046581056957588,
+ 0.036935099820427907614589586742499,
+ 0.002884872430211530501334156248695,
+ 0.013685946022712701888950035273128,
+ 0.023280413502888311123409291030404,
+ 0.030872497611713358675466394126442,
+ 0.035693633639418770719351355457044,
+ 0.000915283345202241360843392549948,
+ 0.005399280219300471367738743391053,
+ 0.010947679601118931134327826856808,
+ 0.016298731696787335262665703223280,
+ 0.021081568889203835112433060188190,
+ 0.025370969769253827243467999831710,
+ 0.029189697756475752501446154084920,
+ 0.032373202467202789685788194889595,
+ 0.034783098950365142750781997949596,
+ 0.036412220731351787562801163687577,
+ 0.037253875503047708539592001191226
+} ;
+
+/* w87b, weights of the 87-point formula for abscissae x4 */
+static const double w87b[23] = {
+ 0.000274145563762072350016527092881,
+ 0.001807124155057942948341311753254,
+ 0.004096869282759164864458070683480,
+ 0.006758290051847378699816577897424,
+ 0.009549957672201646536053581325377,
+ 0.012329447652244853694626639963780,
+ 0.015010447346388952376697286041943,
+ 0.017548967986243191099665352925900,
+ 0.019938037786440888202278192730714,
+ 0.022194935961012286796332102959499,
+ 0.024339147126000805470360647041454,
+ 0.026374505414839207241503786552615,
+ 0.028286910788771200659968002987960,
+ 0.030052581128092695322521110347341,
+ 0.031646751371439929404586051078883,
+ 0.033050413419978503290785944862689,
+ 0.034255099704226061787082821046821,
+ 0.035262412660156681033782717998428,
+ 0.036076989622888701185500318003895,
+ 0.036698604498456094498018047441094,
+ 0.037120549269832576114119958413599,
+ 0.037334228751935040321235449094698,
+ 0.037361073762679023410321241766599
+} ;
+
diff --git a/gsl-1.9/integration/qpsrt.c b/gsl-1.9/integration/qpsrt.c
new file mode 100644
index 0000000..519bab4
--- /dev/null
+++ b/gsl-1.9/integration/qpsrt.c
@@ -0,0 +1,113 @@
+/* integration/qpsrt.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+static inline void
+qpsrt (gsl_integration_workspace * workspace);
+
+static inline
+void qpsrt (gsl_integration_workspace * workspace)
+{
+ const size_t last = workspace->size - 1;
+ const size_t limit = workspace->limit;
+
+ double * elist = workspace->elist;
+ size_t * order = workspace->order;
+
+ double errmax ;
+ double errmin ;
+ int i, k, top;
+
+ size_t i_nrmax = workspace->nrmax;
+ size_t i_maxerr = order[i_nrmax] ;
+
+ /* Check whether the list contains more than two error estimates */
+
+ if (last < 2)
+ {
+ order[0] = 0 ;
+ order[1] = 1 ;
+ workspace->i = i_maxerr ;
+ return ;
+ }
+
+ errmax = elist[i_maxerr] ;
+
+ /* This part of the routine is only executed if, due to a difficult
+ integrand, subdivision increased the error estimate. In the normal
+ case the insert procedure should start after the nrmax-th largest
+ error estimate. */
+
+ while (i_nrmax > 0 && errmax > elist[order[i_nrmax - 1]])
+ {
+ order[i_nrmax] = order[i_nrmax - 1] ;
+ i_nrmax-- ;
+ }
+
+ /* Compute the number of elements in the list to be maintained in
+ descending order. This number depends on the number of
+ subdivisions still allowed. */
+
+ if(last < (limit/2 + 2))
+ {
+ top = last ;
+ }
+ else
+ {
+ top = limit - last + 1;
+ }
+
+ /* Insert errmax by traversing the list top-down, starting
+ comparison from the element elist(order(i_nrmax+1)). */
+
+ i = i_nrmax + 1 ;
+
+ /* The order of the tests in the following line is important to
+ prevent a segmentation fault */
+
+ while (i < top && errmax < elist[order[i]])
+ {
+ order[i-1] = order[i] ;
+ i++ ;
+ }
+
+ order[i-1] = i_maxerr ;
+
+ /* Insert errmin by traversing the list bottom-up */
+
+ errmin = elist[last] ;
+
+ k = top - 1 ;
+
+ while (k > i - 2 && errmin >= elist[order[k]])
+ {
+ order[k+1] = order[k] ;
+ k-- ;
+ }
+
+ order[k+1] = last ;
+
+ /* Set i_max and e_max */
+
+ i_maxerr = order[i_nrmax] ;
+
+ workspace->i = i_maxerr ;
+ workspace->nrmax = i_nrmax ;
+}
+
+
diff --git a/gsl-1.9/integration/qpsrt2.c b/gsl-1.9/integration/qpsrt2.c
new file mode 100644
index 0000000..b59b41f
--- /dev/null
+++ b/gsl-1.9/integration/qpsrt2.c
@@ -0,0 +1,81 @@
+/* integration/qpsrt2.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* The smallest interval has the largest error. Before bisecting
+ decrease the sum of the errors over the larger intervals
+ (error_over_large_intervals) and perform extrapolation. */
+
+static int
+increase_nrmax (gsl_integration_workspace * workspace);
+
+static int
+increase_nrmax (gsl_integration_workspace * workspace)
+{
+ int k;
+ int id = workspace->nrmax;
+ int jupbnd;
+
+ const size_t * level = workspace->level;
+ const size_t * order = workspace->order;
+
+ size_t limit = workspace->limit ;
+ size_t last = workspace->size - 1 ;
+
+ if (last > (1 + limit / 2))
+ {
+ jupbnd = limit + 1 - last;
+ }
+ else
+ {
+ jupbnd = last;
+ }
+
+ for (k = id; k <= jupbnd; k++)
+ {
+ size_t i_max = order[workspace->nrmax];
+
+ workspace->i = i_max ;
+
+ if (level[i_max] < workspace->maximum_level)
+ {
+ return 1;
+ }
+
+ workspace->nrmax++;
+
+ }
+ return 0;
+}
+
+static int
+large_interval (gsl_integration_workspace * workspace)
+{
+ size_t i = workspace->i ;
+ const size_t * level = workspace->level;
+
+ if (level[i] < workspace->maximum_level)
+ {
+ return 1 ;
+ }
+ else
+ {
+ return 0 ;
+ }
+}
+
diff --git a/gsl-1.9/integration/reset.c b/gsl-1.9/integration/reset.c
new file mode 100644
index 0000000..424b837
--- /dev/null
+++ b/gsl-1.9/integration/reset.c
@@ -0,0 +1,9 @@
+static inline void
+reset_nrmax (gsl_integration_workspace * workspace);
+
+static inline void
+reset_nrmax (gsl_integration_workspace * workspace)
+{
+ workspace->nrmax = 0;
+ workspace->i = workspace->order[0] ;
+}
diff --git a/gsl-1.9/integration/set_initial.c b/gsl-1.9/integration/set_initial.c
new file mode 100644
index 0000000..410a213
--- /dev/null
+++ b/gsl-1.9/integration/set_initial.c
@@ -0,0 +1,12 @@
+static inline
+void set_initial_result (gsl_integration_workspace * workspace,
+ double result, double error);
+
+static inline
+void set_initial_result (gsl_integration_workspace * workspace,
+ double result, double error)
+{
+ workspace->size = 1;
+ workspace->rlist[0] = result;
+ workspace->elist[0] = error;
+}
diff --git a/gsl-1.9/integration/test.c b/gsl-1.9/integration/test.c
new file mode 100644
index 0000000..e5b6981
--- /dev/null
+++ b/gsl-1.9/integration/test.c
@@ -0,0 +1,2105 @@
+/* integration/test.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_integration.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+
+#include "tests.h"
+
+gsl_function make_function (double (* f) (double, void *), double * p);
+
+gsl_function make_function (double (* f) (double, void *), double * p)
+{
+ gsl_function f_new;
+
+ f_new.function = f ;
+ f_new.params = p ;
+
+ return f_new;
+}
+
+struct counter_params {
+ gsl_function * f;
+ int neval;
+} ;
+
+double counter (double x, void * params);
+gsl_function make_counter (gsl_function * f, struct counter_params * p);
+
+double
+counter (double x, void * params)
+{
+ struct counter_params * p = (struct counter_params *) params;
+ p->neval++ ; /* increment counter */
+ return GSL_FN_EVAL(p->f, x);
+}
+
+gsl_function make_counter (gsl_function * f, struct counter_params * p)
+{
+ gsl_function f_new;
+
+ p->f = f;
+ p->neval = 0 ;
+
+ f_new.function = &counter ;
+ f_new.params = p ;
+
+ return f_new;
+}
+
+void my_error_handler (const char *reason, const char *file,
+ int line, int err);
+
+int main (void)
+{
+ gsl_ieee_env_setup ();
+ gsl_set_error_handler (&my_error_handler);
+
+ /* Test the basic Gauss-Kronrod rules with a smooth positive function. */
+
+ {
+ double result = 0, abserr = 0, resabs = 0, resasc = 0 ;
+ double exp_result = 7.716049357767090777E-02;
+ double exp_abserr = 2.990224871000550874E-06;
+ double exp_resabs = 7.716049357767090777E-02;
+ double exp_resasc = 4.434273814139995384E-02;
+
+ double alpha = 2.6 ;
+ gsl_function f = make_function(&f1, &alpha) ;
+
+ gsl_integration_qk15 (&f, 0.0, 1.0,
+ &result, &abserr, &resabs, &resasc) ;
+ gsl_test_rel(result,exp_result,1e-15,"qk15(f1) smooth result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-7,"qk15(f1) smooth abserr") ;
+ gsl_test_rel(resabs,exp_resabs,1e-15,"qk15(f1) smooth resabs") ;
+ gsl_test_rel(resasc,exp_resasc,1e-15,"qk15(f1) smooth resasc") ;
+
+ gsl_integration_qk15 (&f, 1.0, 0.0,
+ &result, &abserr, &resabs, &resasc) ;
+
+ gsl_test_rel(result,-exp_result,1e-15,"qk15(f1) reverse result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-7,"qk15(f1) reverse abserr") ;
+ gsl_test_rel(resabs,exp_resabs,1e-15,"qk15(f1) reverse resabs") ;
+ gsl_test_rel(resasc,exp_resasc,1e-15,"qk15(f1) reverse resasc") ;
+ }
+
+ {
+ double result = 0, abserr = 0, resabs = 0, resasc = 0 ;
+ double exp_result = 7.716049379303084599E-02;
+ double exp_abserr = 9.424302194248481445E-08;
+ double exp_resabs = 7.716049379303084599E-02;
+ double exp_resasc = 4.434311425038358484E-02;
+
+ double alpha = 2.6 ;
+ gsl_function f = make_function(&f1, &alpha);
+
+ gsl_integration_qk21 (&f, 0.0, 1.0,
+ &result, &abserr, &resabs, &resasc) ;
+ gsl_test_rel(result,exp_result,1e-15,"qk21(f1) smooth result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-7,"qk21(f1) smooth abserr") ;
+ gsl_test_rel(resabs,exp_resabs,1e-15,"qk21(f1) smooth resabs") ;
+ gsl_test_rel(resasc,exp_resasc,1e-15,"qk21(f1) smooth resasc") ;
+
+ gsl_integration_qk21 (&f, 1.0, 0.0,
+ &result, &abserr, &resabs, &resasc) ;
+ gsl_test_rel(result,-exp_result,1e-15,"qk21(f1) reverse result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-7,"qk21(f1) reverse abserr") ;
+ gsl_test_rel(resabs,exp_resabs,1e-15,"qk21(f1) reverse resabs") ;
+ gsl_test_rel(resasc,exp_resasc,1e-15,"qk21(f1) reverse resasc") ;
+ }
+
+ {
+ double result = 0, abserr = 0, resabs = 0, resasc = 0 ;
+ double exp_result = 7.716049382494900855E-02;
+ double exp_abserr = 1.713503193600029893E-09;
+ double exp_resabs = 7.716049382494900855E-02;
+ double exp_resasc = 4.427995051868838933E-02;
+
+ double alpha = 2.6 ;
+ gsl_function f = make_function(&f1, &alpha);
+
+ gsl_integration_qk31 (&f, 0.0, 1.0,
+ &result, &abserr, &resabs, &resasc) ;
+ gsl_test_rel(result,exp_result,1e-15,"qk31(f1) smooth result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-7,"qk31(f1) smooth abserr") ;
+ gsl_test_rel(resabs,exp_resabs,1e-15,"qk31(f1) smooth resabs") ;
+ gsl_test_rel(resasc,exp_resasc,1e-15,"qk31(f1) smooth resasc") ;
+
+ gsl_integration_qk31 (&f, 1.0, 0.0,
+ &result, &abserr, &resabs, &resasc) ;
+ gsl_test_rel(result,-exp_result,1e-15,"qk31(f1) reverse result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-7,"qk31(f1) reverse abserr") ;
+ gsl_test_rel(resabs,exp_resabs,1e-15,"qk31(f1) reverse resabs") ;
+ gsl_test_rel(resasc,exp_resasc,1e-15,"qk31(f1) reverse resasc") ;
+ }
+
+ {
+ double result = 0, abserr = 0, resabs = 0, resasc = 0 ;
+ double exp_result = 7.716049382681375302E-02;
+ double exp_abserr = 9.576386660975511224E-11;
+ double exp_resabs = 7.716049382681375302E-02;
+ double exp_resasc = 4.421521169637691873E-02;
+
+ double alpha = 2.6 ;
+ gsl_function f = make_function(&f1, &alpha);
+
+ gsl_integration_qk41 (&f, 0.0, 1.0,
+ &result, &abserr, &resabs, &resasc) ;
+ gsl_test_rel(result,exp_result,1e-15,"qk41(f1) smooth result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-7,"qk41(f1) smooth abserr") ;
+ gsl_test_rel(resabs,exp_resabs,1e-15,"qk41(f1) smooth resabs") ;
+ gsl_test_rel(resasc,exp_resasc,1e-15,"qk41(f1) smooth resasc") ;
+
+ gsl_integration_qk41 (&f, 1.0, 0.0,
+ &result, &abserr, &resabs, &resasc) ;
+ gsl_test_rel(result,-exp_result,1e-15,"qk41(f1) reverse result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-7,"qk41(f1) reverse abserr") ;
+ gsl_test_rel(resabs,exp_resabs,1e-15,"qk41(f1) reverse resabs") ;
+ gsl_test_rel(resasc,exp_resasc,1e-15,"qk41(f1) reverse resasc") ;
+ }
+
+ {
+ double result = 0, abserr = 0, resabs = 0, resasc = 0 ;
+ double exp_result = 7.716049382708510540E-02;
+ double exp_abserr = 1.002079980317363772E-11;
+ double exp_resabs = 7.716049382708510540E-02;
+ double exp_resasc = 4.416474291216854892E-02;
+
+ double alpha = 2.6 ;
+ gsl_function f = make_function(&f1, &alpha);
+
+ gsl_integration_qk51 (&f, 0.0, 1.0,
+ &result, &abserr, &resabs, &resasc) ;
+ gsl_test_rel(result,exp_result,1e-15,"qk51(f1) smooth result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-5,"qk51(f1) smooth abserr") ;
+ gsl_test_rel(resabs,exp_resabs,1e-15,"qk51(f1) smooth resabs") ;
+ gsl_test_rel(resasc,exp_resasc,1e-15,"qk51(f1) smooth resasc") ;
+
+ gsl_integration_qk51 (&f, 1.0, 0.0,
+ &result, &abserr, &resabs, &resasc) ;
+ gsl_test_rel(result,-exp_result,1e-15,"qk51(f1) reverse result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-5,"qk51(f1) reverse abserr") ;
+ gsl_test_rel(resabs,exp_resabs,1e-15,"qk51(f1) reverse resabs") ;
+ gsl_test_rel(resasc,exp_resasc,1e-15,"qk51(f1) reverse resasc") ;
+ }
+
+ {
+ double result = 0, abserr = 0, resabs = 0, resasc = 0 ;
+ double exp_result = 7.716049382713800753E-02;
+ double exp_abserr = 1.566060362296155616E-12;
+ double exp_resabs = 7.716049382713800753E-02;
+ double exp_resasc = 4.419287685934316506E-02;
+
+ double alpha = 2.6 ;
+ gsl_function f = make_function(&f1, &alpha);
+
+ gsl_integration_qk61 (&f, 0.0, 1.0,
+ &result, &abserr, &resabs, &resasc) ;
+ gsl_test_rel(result,exp_result,1e-15,"qk61(f1) smooth result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-5,"qk61(f1) smooth abserr") ;
+ gsl_test_rel(resabs,exp_resabs,1e-15,"qk61(f1) smooth resabs") ;
+ gsl_test_rel(resasc,exp_resasc,1e-15,"qk61(f1) smooth resasc") ;
+
+ gsl_integration_qk61 (&f, 1.0, 0.0,
+ &result, &abserr, &resabs, &resasc) ;
+ gsl_test_rel(result,-exp_result,1e-15,"qk61(f1) reverse result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-5,"qk61(f1) reverse abserr") ;
+ gsl_test_rel(resabs,exp_resabs,1e-15,"qk61(f1) reverse resabs") ;
+ gsl_test_rel(resasc,exp_resasc,1e-15,"qk61(f1) reverse resasc") ;
+ }
+
+ /* Now test the basic rules with a positive function that has a
+ singularity. This should give large values of abserr which would
+ find discrepancies in the abserr calculation. */
+
+ {
+ double result = 0, abserr = 0, resabs = 0, resasc = 0 ;
+ double exp_result = 1.555688196612745777E+01;
+ double exp_abserr = 2.350164577239293706E+01;
+ double exp_resabs = 1.555688196612745777E+01;
+ double exp_resasc = 2.350164577239293706E+01;
+
+ double alpha = -0.9 ;
+ gsl_function f = make_function(&f1, &alpha);
+
+ gsl_integration_qk15 (&f, 0.0, 1.0,
+ &result, &abserr, &resabs, &resasc) ;
+ gsl_test_rel(result,exp_result,1e-15,"qk15(f1) singular result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-7,"qk15(f1) singular abserr") ;
+ gsl_test_rel(resabs,exp_resabs,1e-15,"qk15(f1) singular resabs") ;
+ gsl_test_rel(resasc,exp_resasc,1e-15,"qk15(f1) singular resasc") ;
+
+ gsl_integration_qk15 (&f, 1.0, 0.0,
+ &result, &abserr, &resabs, &resasc) ;
+ gsl_test_rel(result,-exp_result,1e-15,"qk15(f1) reverse result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-7,"qk15(f1) reverse abserr") ;
+ gsl_test_rel(resabs,exp_resabs,1e-15,"qk15(f1) reverse resabs") ;
+ gsl_test_rel(resasc,exp_resasc,1e-15,"qk15(f1) reverse resasc") ;
+ }
+
+ {
+ double result = 0, abserr = 0, resabs = 0, resasc = 0 ;
+ double exp_result = 1.799045317938126232E+01;
+ double exp_abserr = 2.782360287710622515E+01;
+ double exp_resabs = 1.799045317938126232E+01;
+ double exp_resasc = 2.782360287710622515E+01;
+
+ double alpha = -0.9 ;
+ gsl_function f = make_function(&f1, &alpha);
+
+ gsl_integration_qk21 (&f, 0.0, 1.0,
+ &result, &abserr, &resabs, &resasc) ;
+ gsl_test_rel(result,exp_result,1e-15,"qk21(f1) singular result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-7,"qk21(f1) singular abserr") ;
+ gsl_test_rel(resabs,exp_resabs,1e-15,"qk21(f1) singular resabs") ;
+ gsl_test_rel(resasc,exp_resasc,1e-15,"qk21(f1) singular resasc") ;
+
+ gsl_integration_qk21 (&f, 1.0, 0.0,
+ &result, &abserr, &resabs, &resasc) ;
+ gsl_test_rel(result,-exp_result,1e-15,"qk21(f1) reverse result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-7,"qk21(f1) reverse abserr") ;
+ gsl_test_rel(resabs,exp_resabs,1e-15,"qk21(f1) reverse resabs") ;
+ gsl_test_rel(resasc,exp_resasc,1e-15,"qk21(f1) reverse resasc") ;
+ }
+
+ {
+ double result = 0, abserr = 0, resabs = 0, resasc = 0 ;
+ double exp_result = 2.081873305159121657E+01;
+ double exp_abserr = 3.296500137482590276E+01;
+ double exp_resabs = 2.081873305159121301E+01;
+ double exp_resasc = 3.296500137482590276E+01;
+
+ double alpha = -0.9 ;
+ gsl_function f = make_function(&f1, &alpha);
+
+ gsl_integration_qk31 (&f, 0.0, 1.0,
+ &result, &abserr, &resabs, &resasc) ;
+ gsl_test_rel(result,exp_result,1e-15,"qk31(f1) singular result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-7,"qk31(f1) singular abserr") ;
+ gsl_test_rel(resabs,exp_resabs,1e-15,"qk31(f1) singular resabs") ;
+ gsl_test_rel(resasc,exp_resasc,1e-15,"qk31(f1) singular resasc") ;
+
+ gsl_integration_qk31 (&f, 1.0, 0.0,
+ &result, &abserr, &resabs, &resasc) ;
+ gsl_test_rel(result,-exp_result,1e-15,"qk31(f1) reverse result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-7,"qk31(f1) reverse abserr") ;
+ gsl_test_rel(resabs,exp_resabs,1e-15,"qk31(f1) reverse resabs") ;
+ gsl_test_rel(resasc,exp_resasc,1e-15,"qk31(f1) reverse resasc") ;
+ }
+
+ {
+ double result = 0, abserr = 0, resabs = 0, resasc = 0 ;
+ double exp_result = 2.288677623903126701E+01;
+ double exp_abserr = 3.671538820274916048E+01;
+ double exp_resabs = 2.288677623903126701E+01;
+ double exp_resasc = 3.671538820274916048E+01;
+
+ double alpha = -0.9 ;
+ gsl_function f = make_function(&f1, &alpha);
+
+ gsl_integration_qk41 (&f, 0.0, 1.0,
+ &result, &abserr, &resabs, &resasc) ;
+ gsl_test_rel(result,exp_result,1e-15,"qk41(f1) singular result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-7,"qk41(f1) singular abserr") ;
+ gsl_test_rel(resabs,exp_resabs,1e-15,"qk41(f1) singular resabs") ;
+ gsl_test_rel(resasc,exp_resasc,1e-15,"qk41(f1) singular resasc") ;
+
+ gsl_integration_qk41 (&f, 1.0, 0.0,
+ &result, &abserr, &resabs, &resasc) ;
+ gsl_test_rel(result,-exp_result,1e-15,"qk41(f1) reverse result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-7,"qk41(f1) reverse abserr") ;
+ gsl_test_rel(resabs,exp_resabs,1e-15,"qk41(f1) reverse resabs") ;
+ gsl_test_rel(resasc,exp_resasc,1e-15,"qk41(f1) reverse resasc") ;
+ }
+
+ {
+ double result = 0, abserr = 0, resabs = 0, resasc = 0 ;
+ double exp_result = 2.449953612016972215E+01;
+ double exp_abserr = 3.967771249391228849E+01;
+ double exp_resabs = 2.449953612016972215E+01;
+ double exp_resasc = 3.967771249391228849E+01;
+
+ double alpha = -0.9 ;
+ gsl_function f = make_function(&f1, &alpha);
+
+ gsl_integration_qk51 (&f, 0.0, 1.0,
+ &result, &abserr, &resabs, &resasc) ;
+ gsl_test_rel(result,exp_result,1e-15,"qk51(f1) singular result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-7,"qk51(f1) singular abserr") ;
+ gsl_test_rel(resabs,exp_resabs,1e-15,"qk51(f1) singular resabs") ;
+ gsl_test_rel(resasc,exp_resasc,1e-15,"qk51(f1) singular resasc") ;
+
+ gsl_integration_qk51 (&f, 1.0, 0.0,
+ &result, &abserr, &resabs, &resasc) ;
+ gsl_test_rel(result,-exp_result,1e-15,"qk51(f1) reverse result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-7,"qk51(f1) reverse abserr") ;
+ gsl_test_rel(resabs,exp_resabs,1e-15,"qk51(f1) reverse resabs") ;
+ gsl_test_rel(resasc,exp_resasc,1e-15,"qk51(f1) reverse resasc") ;
+ }
+
+ {
+ double result = 0, abserr = 0, resabs = 0, resasc = 0 ;
+ double exp_result = 2.583030240976628988E+01;
+ double exp_abserr = 4.213750493076978643E+01;
+ double exp_resabs = 2.583030240976628988E+01;
+ double exp_resasc = 4.213750493076978643E+01;
+
+ double alpha = -0.9 ;
+ gsl_function f = make_function(&f1, &alpha);
+
+ gsl_integration_qk61 (&f, 0.0, 1.0,
+ &result, &abserr, &resabs, &resasc) ;
+ gsl_test_rel(result,exp_result,1e-15,"qk61(f1) singular result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-7,"qk61(f1) singular abserr") ;
+ gsl_test_rel(resabs,exp_resabs,1e-15,"qk61(f1) singular resabs") ;
+ gsl_test_rel(resasc,exp_resasc,1e-15,"qk61(f1) singular resasc") ;
+
+ gsl_integration_qk61 (&f, 1.0, 0.0,
+ &result, &abserr, &resabs, &resasc) ;
+ gsl_test_rel(result,-exp_result,1e-15,"qk61(f1) reverse result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-7,"qk61(f1) reverse abserr") ;
+ gsl_test_rel(resabs,exp_resabs,1e-15,"qk61(f1) reverse resabs") ;
+ gsl_test_rel(resasc,exp_resasc,1e-15,"qk61(f1) reverse resasc") ;
+ }
+
+ /* Test the basic Gauss-Kronrod rules with a smooth oscillating
+ function, over an unsymmetric range. This should find any
+ discrepancies in the abscissae. */
+
+ {
+ double result = 0, abserr = 0, resabs = 0, resasc = 0 ;
+ double exp_result =-7.238969575483799046E-01;
+ double exp_abserr = 8.760080200939757174E-06;
+ double exp_resabs = 1.165564172429140788E+00;
+ double exp_resasc = 9.334560307787327371E-01;
+
+ double alpha = 1.3 ;
+ gsl_function f = make_function(&f3, &alpha);
+
+ gsl_integration_qk15 (&f, 0.3, 2.71,
+ &result, &abserr, &resabs, &resasc) ;
+ gsl_test_rel(result,exp_result,1e-15,"qk15(f3) oscill result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-7,"qk15(f3) oscill abserr") ;
+ gsl_test_rel(resabs,exp_resabs,1e-15,"qk15(f3) oscill resabs") ;
+ gsl_test_rel(resasc,exp_resasc,1e-15,"qk15(f3) oscill resasc") ;
+
+ gsl_integration_qk15 (&f, 2.71, 0.3,
+ &result, &abserr, &resabs, &resasc) ;
+ gsl_test_rel(result,-exp_result,1e-15,"qk15(f3) reverse result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-7,"qk15(f3) reverse abserr") ;
+ gsl_test_rel(resabs,exp_resabs,1e-15,"qk15(f3) reverse resabs") ;
+ gsl_test_rel(resasc,exp_resasc,1e-15,"qk15(f3) reverse resasc") ;
+ }
+
+ {
+ double result = 0, abserr = 0, resabs = 0, resasc = 0 ;
+ double exp_result =-7.238969575482959717E-01;
+ double exp_abserr = 7.999213141433641888E-11;
+ double exp_resabs = 1.150829032708484023E+00;
+ double exp_resasc = 9.297591249133687619E-01;
+
+ double alpha = 1.3 ;
+ gsl_function f = make_function(&f3, &alpha);
+
+ gsl_integration_qk21 (&f, 0.3, 2.71,
+ &result, &abserr, &resabs, &resasc) ;
+ gsl_test_rel(result,exp_result,1e-15,"qk21(f3) oscill result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-5,"qk21(f3) oscill abserr") ;
+ gsl_test_rel(resabs,exp_resabs,1e-15,"qk21(f3) oscill resabs") ;
+ gsl_test_rel(resasc,exp_resasc,1e-15,"qk21(f3) oscill resasc") ;
+
+ gsl_integration_qk21 (&f, 2.71, 0.3,
+ &result, &abserr, &resabs, &resasc) ;
+ gsl_test_rel(result,-exp_result,1e-15,"qk21(f3) reverse result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-5,"qk21(f3) reverse abserr") ;
+ gsl_test_rel(resabs,exp_resabs,1e-15,"qk21(f3) reverse resabs") ;
+ gsl_test_rel(resasc,exp_resasc,1e-15,"qk21(f3) reverse resasc") ;
+ }
+
+ {
+ double result = 0, abserr = 0, resabs = 0, resasc = 0 ;
+ double exp_result =-7.238969575482959717E-01;
+ double exp_abserr = 1.285805464427459261E-14;
+ double exp_resabs = 1.158150602093290571E+00;
+ double exp_resasc = 9.277828092501518853E-01;
+
+ double alpha = 1.3 ;
+ gsl_function f = make_function(&f3, &alpha);
+
+ gsl_integration_qk31 (&f, 0.3, 2.71,
+ &result, &abserr, &resabs, &resasc) ;
+ gsl_test_rel(result,exp_result,1e-15,"qk31(f3) oscill result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-7,"qk31(f3) oscill abserr") ;
+ gsl_test_rel(resabs,exp_resabs,1e-15,"qk31(f3) oscill resabs") ;
+ gsl_test_rel(resasc,exp_resasc,1e-15,"qk31(f3) oscill resasc") ;
+
+ gsl_integration_qk31 (&f, 2.71, 0.3,
+ &result, &abserr, &resabs, &resasc) ;
+ gsl_test_rel(result,-exp_result,1e-15,"qk31(f3) reverse result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-7,"qk31(f3) reverse abserr") ;
+ gsl_test_rel(resabs,exp_resabs,1e-15,"qk31(f3) reverse resabs") ;
+ gsl_test_rel(resasc,exp_resasc,1e-15,"qk31(f3) reverse resasc") ;
+ }
+
+ {
+ double result = 0, abserr = 0, resabs = 0, resasc = 0 ;
+ double exp_result =-7.238969575482959717E-01;
+ double exp_abserr = 1.286535726271015626E-14;
+ double exp_resabs = 1.158808363486595328E+00;
+ double exp_resasc = 9.264382258645686985E-01;
+
+ double alpha = 1.3 ;
+ gsl_function f = make_function(&f3, &alpha);
+
+ gsl_integration_qk41 (&f, 0.3, 2.71,
+ &result, &abserr, &resabs, &resasc) ;
+ gsl_test_rel(result,exp_result,1e-15,"qk41(f3) oscill result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-7,"qk41(f3) oscill abserr") ;
+ gsl_test_rel(resabs,exp_resabs,1e-15,"qk41(f3) oscill resabs") ;
+ gsl_test_rel(resasc,exp_resasc,1e-15,"qk41(f3) oscill resasc") ;
+
+ gsl_integration_qk41 (&f, 2.71, 0.3,
+ &result, &abserr, &resabs, &resasc) ;
+ gsl_test_rel(result,-exp_result,1e-15,"qk41(f3) reverse result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-7,"qk41(f3) reverse abserr") ;
+ gsl_test_rel(resabs,exp_resabs,1e-15,"qk41(f3) reverse resabs") ;
+ gsl_test_rel(resasc,exp_resasc,1e-15,"qk41(f3) reverse resasc") ;
+ }
+
+ {
+ double result = 0, abserr = 0, resabs = 0, resasc = 0 ;
+ double exp_result =-7.238969575482961938E-01;
+ double exp_abserr = 1.285290995039385778E-14;
+ double exp_resabs = 1.157687209264406381E+00;
+ double exp_resasc = 9.264666884071264263E-01;
+
+ double alpha = 1.3 ;
+ gsl_function f = make_function(&f3, &alpha);
+
+ gsl_integration_qk51 (&f, 0.3, 2.71,
+ &result, &abserr, &resabs, &resasc) ;
+ gsl_test_rel(result,exp_result,1e-15,"qk51(f3) oscill result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-7,"qk51(f3) oscill abserr") ;
+ gsl_test_rel(resabs,exp_resabs,1e-15,"qk51(f3) oscill resabs") ;
+ gsl_test_rel(resasc,exp_resasc,1e-15,"qk51(f3) oscill resasc") ;
+
+ gsl_integration_qk51 (&f, 2.71, 0.3,
+ &result, &abserr, &resabs, &resasc) ;
+ gsl_test_rel(result,-exp_result,1e-15,"qk51(f3) reverse result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-7,"qk51(f3) reverse abserr") ;
+ gsl_test_rel(resabs,exp_resabs,1e-15,"qk51(f3) reverse resabs") ;
+ gsl_test_rel(resasc,exp_resasc,1e-15,"qk51(f3) reverse resasc") ;
+ }
+
+ {
+ double result = 0, abserr = 0, resabs = 0, resasc = 0 ;
+ double exp_result =-7.238969575482959717E-01;
+ double exp_abserr = 1.286438572027470736E-14;
+ double exp_resabs = 1.158720854723590099E+00;
+ double exp_resasc = 9.270469641771273972E-01;
+
+ double alpha = 1.3 ;
+ gsl_function f = make_function(&f3, &alpha);
+
+ gsl_integration_qk61 (&f, 0.3, 2.71,
+ &result, &abserr, &resabs, &resasc) ;
+ gsl_test_rel(result,exp_result,1e-15,"qk61(f3) oscill result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-7,"qk61(f3) oscill abserr") ;
+ gsl_test_rel(resabs,exp_resabs,1e-15,"qk61(f3) oscill resabs") ;
+ gsl_test_rel(resasc,exp_resasc,1e-15,"qk61(f3) oscill resasc") ;
+
+ gsl_integration_qk61 (&f, 2.71, 0.3,
+ &result, &abserr, &resabs, &resasc) ;
+ gsl_test_rel(result,-exp_result,1e-15,"qk61(f3) reverse result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-7,"qk61(f3) reverse abserr") ;
+ gsl_test_rel(resabs,exp_resabs,1e-15,"qk61(f3) reverse resabs") ;
+ gsl_test_rel(resasc,exp_resasc,1e-15,"qk61(f3) reverse resasc") ;
+ }
+
+ /* Test the non-adaptive gaussian integrator QNG */
+
+ {
+ int status = 0; size_t neval = 0 ;
+ double result = 0, abserr = 0 ;
+ double exp_result = 7.716049379303083211E-02;
+ double exp_abserr = 9.424302199601294244E-08;
+ int exp_neval = 21;
+ int exp_ier = 0;
+
+ double alpha = 2.6 ;
+ gsl_function f = make_function(&f1, &alpha);
+
+ status = gsl_integration_qng (&f, 0.0, 1.0, 1e-1, 0.0,
+ &result, &abserr, &neval) ;
+ gsl_test_rel(result,exp_result,1e-15,"qng(f1) smooth result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-7,"qng(f1) smooth abserr") ;
+ gsl_test_int((int)neval,exp_neval,"qng(f1) smooth neval") ;
+ gsl_test_int(status,exp_ier,"qng(f1) smooth status") ;
+
+ status = gsl_integration_qng (&f, 1.0, 0.0, 1e-1, 0.0,
+ &result, &abserr, &neval) ;
+ gsl_test_rel(result,-exp_result,1e-15,"qng(f1) reverse result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-7,"qng(f1) reverse abserr") ;
+ gsl_test_int((int)neval,exp_neval,"qng(f1) reverse neval") ;
+ gsl_test_int(status,exp_ier,"qng(f1) reverse status") ;
+ }
+
+ {
+ int status = 0; size_t neval = 0 ;
+ double result = 0, abserr = 0 ;
+
+ double exp_result = 7.716049382706505200E-02;
+ double exp_abserr = 2.666893044866214501E-12;
+ int exp_neval = 43;
+ int exp_ier = 0;
+
+ double alpha = 2.6 ;
+ gsl_function f = make_function(&f1, &alpha);
+
+ status = gsl_integration_qng (&f, 0.0, 1.0, 0.0, 1e-9,
+ &result, &abserr, &neval) ;
+ gsl_test_rel(result,exp_result,1e-15,"qng(f1) smooth 43pt result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-5,"qng(f1) smooth 43pt abserr") ;
+ gsl_test_int((int)neval,exp_neval,"qng(f1) smooth 43pt neval") ;
+ gsl_test_int(status,exp_ier,"qng(f1) smooth 43pt status") ;
+
+ status = gsl_integration_qng (&f, 1.0, 0.0, 0.0, 1e-9,
+ &result, &abserr, &neval) ;
+ gsl_test_rel(result,-exp_result,1e-15,"qng(f1) reverse 43pt result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-5,"qng(f1) reverse 43pt abserr") ;
+ gsl_test_int((int)neval,exp_neval,"qng(f1) reverse 43pt neval") ;
+ gsl_test_int(status,exp_ier,"qng(f1) reverse 43pt status") ;
+ }
+
+ {
+ int status; size_t neval = 0 ;
+ double result = 0, abserr = 0 ;
+ double exp_result =-7.238969575482961938E-01;
+ double exp_abserr = 1.277676889520056369E-14;
+ int exp_neval = 43;
+ int exp_ier = 0;
+
+ double alpha = 1.3 ;
+ gsl_function f = make_function(&f3, &alpha);
+
+ status = gsl_integration_qng (&f, 0.3, 2.71, 0.0, 1e-12,
+ &result, &abserr, &neval) ;
+ gsl_test_rel(result,exp_result,1e-15,"qnq(f3) oscill result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-7,"qng(f3) oscill abserr") ;
+ gsl_test_int((int)neval,exp_neval,"qng(f3) oscill neval") ;
+ gsl_test_int(status,exp_ier,"qng(f3) oscill status") ;
+
+ status = gsl_integration_qng (&f, 2.71, 0.3, 0.0, 1e-12,
+ &result, &abserr, &neval) ;
+ gsl_test_rel(result,-exp_result,1e-15,"qnq(f3) reverse result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-7,"qng(f3) reverse abserr") ;
+ gsl_test_int((int)neval,exp_neval,"qng(f3) reverse neval") ;
+ gsl_test_int(status,exp_ier,"qng(f3) reverse status") ;
+ }
+
+ {
+ int status = 0; size_t neval = 0 ;
+ double result = 0, abserr = 0 ;
+
+ double exp_result = 7.716049382716029525E-02;
+ double exp_abserr = 8.566535680046930668E-16;
+ int exp_neval = 87;
+ int exp_ier = 0;
+
+ double alpha = 2.6 ;
+ gsl_function f = make_function(&f1, &alpha);
+
+ status = gsl_integration_qng (&f, 0.0, 1.0, 0.0, 1e-13,
+ &result, &abserr, &neval) ;
+ gsl_test_rel(result,exp_result,1e-15,"qng(f1) 87pt smooth result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-7,"qng(f1) 87pt smooth abserr") ;
+ gsl_test_int((int)neval,exp_neval,"qng(f1) 87pt smooth neval") ;
+ gsl_test_int(status,exp_ier,"qng(f1) 87pt smooth status") ;
+
+ status = gsl_integration_qng (&f, 1.0, 0.0, 0.0, 1e-13,
+ &result, &abserr, &neval) ;
+ gsl_test_rel(result,-exp_result,1e-15,"qng(f1) 87pt reverse result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-7,"qng(f1) 87pt reverse abserr") ;
+ gsl_test_int((int)neval,exp_neval,"qng(f1) 87pt reverse neval") ;
+ gsl_test_int(status,exp_ier,"qng(f1) 87pt reverse status") ;
+ }
+
+ {
+ int status = 0; size_t neval = 0 ;
+ double result = 0, abserr = 0 ;
+
+ double exp_result = 3.222948711817264211E+01;
+ double exp_abserr = 2.782360287710622870E+01;
+ int exp_neval = 87;
+ int exp_ier = GSL_ETOL;
+
+ double alpha = -0.9 ;
+ gsl_function f = make_function(&f1, &alpha);
+
+ status = gsl_integration_qng (&f, 0.0, 1.0, 0.0, 1e-3,
+ &result, &abserr, &neval) ;
+ gsl_test_rel(result,exp_result,1e-15,"qng(f1) sing beyond 87pt result");
+ gsl_test_rel(abserr,exp_abserr,1e-7,"qng(f1) sing beyond 87pt abserr");
+ gsl_test_int((int)neval,exp_neval,"qng(f1) sing beyond 87pt neval") ;
+ gsl_test_int(status,exp_ier,"qng(f1) sing beyond 87pt status") ;
+
+ status = gsl_integration_qng (&f, 1.0, 0.0, 0.0, 1e-3,
+ &result, &abserr, &neval) ;
+ gsl_test_rel(result,-exp_result,1e-15,"qng(f1) reverse beyond 87pt result");
+ gsl_test_rel(abserr,exp_abserr,1e-7,"qng(f1) rev beyond 87pt abserr");
+ gsl_test_int((int)neval,exp_neval,"qng(f1) rev beyond 87pt neval") ;
+ gsl_test_int(status,exp_ier,"qng(f1) rev beyond 87pt status") ;
+ }
+
+ /* Test the adaptive integrator QAG */
+
+ {
+ int status = 0, i; struct counter_params p;
+ double result = 0, abserr=0;
+
+ gsl_integration_workspace * w = gsl_integration_workspace_alloc (1000) ;
+
+ double exp_result = 7.716049382715854665E-02 ;
+ double exp_abserr = 6.679384885865053037E-12 ;
+ int exp_neval = 165;
+ int exp_ier = 0;
+ int exp_last = 6;
+
+ double a[6] = { 0, 0.5, 0.25, 0.125, 0.0625, 0.03125 } ;
+ double b[6] = { 0.03125, 1, 0.5, 0.25, 0.125, 0.0625 } ;
+ double r[6] = { 3.966769831709074375E-06, 5.491842501998222409E-02,
+ 1.909827770934243926E-02, 2.776531175604360531E-03,
+ 3.280661030752063693E-04, 3.522704932261797744E-05 } ;
+ double e[6] = { 6.678528276336181873E-12, 6.097169993333454062E-16,
+ 2.120334764359736934E-16, 3.082568839745514608E-17,
+ 3.642265412331439511E-18, 3.910988124757650942E-19 } ;
+ int order[6] = { 1, 2, 3, 4, 5, 6 } ;
+
+ double alpha = 2.6 ;
+ gsl_function f = make_function(&f1, &alpha) ;
+
+ gsl_function fc = make_counter(&f, &p) ;
+
+ status = gsl_integration_qag (&fc, 0.0, 1.0, 0.0, 1e-10, w->limit,
+ GSL_INTEG_GAUSS15, w,
+ &result, &abserr) ;
+
+ gsl_test_rel(result,exp_result,1e-15,"qag(f1) smooth result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-6,"qag(f1) smooth abserr") ;
+ gsl_test_int((int)(p.neval),exp_neval,"qag(f1) smooth neval") ;
+ gsl_test_int((int)(w->size),exp_last,"qag(f1) smooth last") ;
+ gsl_test_int(status,exp_ier,"qag(f1) smooth status") ;
+
+ for (i = 0; i < 6 ; i++)
+ gsl_test_rel(w->alist[i],a[i],1e-15,"qag(f1) smooth alist") ;
+
+ for (i = 0; i < 6 ; i++)
+ gsl_test_rel(w->blist[i],b[i],1e-15,"qag(f1) smooth blist") ;
+
+ for (i = 0; i < 6 ; i++)
+ gsl_test_rel(w->rlist[i],r[i],1e-15,"qag(f1) smooth rlist") ;
+
+ for (i = 0; i < 6 ; i++)
+ gsl_test_rel(w->elist[i],e[i],1e-6,"qag(f1) smooth elist") ;
+
+ for (i = 0; i < 6 ; i++)
+ gsl_test_int((int)w->order[i],order[i]-1,"qag(f1) smooth order") ;
+
+ p.neval = 0;
+
+ status = gsl_integration_qag (&fc, 1.0, 0.0, 0.0, 1e-10, w->limit,
+ GSL_INTEG_GAUSS15, w,
+ &result, &abserr) ;
+
+ gsl_test_rel(result,-exp_result,1e-15,"qag(f1) reverse result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-6,"qag(f1) reverse abserr") ;
+ gsl_test_int((int)(p.neval),exp_neval,"qag(f1) reverse neval") ;
+ gsl_test_int((int)(w->size),exp_last,"qag(f1) reverse last") ;
+ gsl_test_int(status,exp_ier,"qag(f1) reverse status") ;
+
+ gsl_integration_workspace_free (w) ;
+
+ }
+
+ /* Test the same function using an absolute error bound and the
+ 21-point rule */
+
+ {
+ int status = 0, i; struct counter_params p;
+ double result = 0, abserr=0;
+
+ gsl_integration_workspace * w = gsl_integration_workspace_alloc (1000) ;
+
+ double exp_result = 7.716049382716050342E-02 ;
+ double exp_abserr = 2.227969521869139532E-15 ;
+ int exp_neval = 315;
+ int exp_ier = 0;
+ int exp_last = 8;
+
+ double a[8] = { 0, 0.5, 0.25, 0.125, 0.0625, 0.03125, 0.015625,
+ 0.0078125 } ;
+ double b[8] = { 0.0078125, 1, 0.5, 0.25, 0.125, 0.0625, 0.03125,
+ 0.015625 } ;
+ double r[8] = { 3.696942726831556522E-08, 5.491842501998223103E-02,
+ 1.909827770934243579E-02, 2.776531175604360097E-03,
+ 3.280661030752062609E-04, 3.522704932261797744E-05,
+ 3.579060884684503576E-06, 3.507395216921808047E-07 } ;
+ double e[8] = { 1.371316364034059572E-15, 6.097169993333454062E-16,
+ 2.120334764359736441E-16, 3.082568839745514608E-17,
+ 3.642265412331439511E-18, 3.910988124757650460E-19,
+ 3.973555800712018091E-20, 3.893990926286736620E-21 } ;
+ int order[8] = { 1, 2, 3, 4, 5, 6, 7, 8 } ;
+
+ double alpha = 2.6 ;
+ gsl_function f = make_function(&f1, &alpha);
+
+ gsl_function fc = make_counter(&f, &p) ;
+
+ status = gsl_integration_qag (&fc, 0.0, 1.0, 1e-14, 0.0, w->limit,
+ GSL_INTEG_GAUSS21, w,
+ &result, &abserr) ;
+
+ gsl_test_rel(result,exp_result,1e-15,"qag(f1,21pt) smooth result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-6,"qag(f1,21pt) smooth abserr") ;
+ gsl_test_int((int)(p.neval),exp_neval,"qag(f1,21pt) smooth neval") ;
+ gsl_test_int((int)(w->size),exp_last,"qag(f1,21pt) smooth last") ;
+ gsl_test_int(status,exp_ier,"qag(f1,21pt) smooth status") ;
+
+ for (i = 0; i < 8 ; i++)
+ gsl_test_rel(w->alist[i],a[i],1e-15,"qag(f1,21pt) smooth alist") ;
+
+ for (i = 0; i < 8 ; i++)
+ gsl_test_rel(w->blist[i],b[i],1e-15,"qag(f1,21pt) smooth blist") ;
+
+ for (i = 0; i < 8 ; i++)
+ gsl_test_rel(w->rlist[i],r[i],1e-15,"qag(f1,21pt) smooth rlist") ;
+
+ for (i = 0; i < 8 ; i++)
+ gsl_test_rel(w->elist[i],e[i],1e-6,"qag(f1,21pt) smooth elist") ;
+
+ for (i = 0; i < 8 ; i++)
+ gsl_test_int((int)w->order[i],order[i]-1,"qag(f1,21pt) smooth order");
+
+
+ p.neval = 0;
+ status = gsl_integration_qag (&fc, 1.0, 0.0, 1e-14, 0.0, w->limit,
+ GSL_INTEG_GAUSS21, w,
+ &result, &abserr) ;
+
+ gsl_test_rel(result,-exp_result,1e-15,"qag(f1,21pt) reverse result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-6,"qag(f1,21pt) reverse abserr") ;
+ gsl_test_int((int)(p.neval),exp_neval,"qag(f1,21pt) reverse neval") ;
+ gsl_test_int((int)(w->size),exp_last,"qag(f1,21pt) reverse last") ;
+ gsl_test_int(status,exp_ier,"qag(f1,21pt) reverse status") ;
+
+ gsl_integration_workspace_free (w) ;
+
+ }
+
+ /* Adaptive integration of an oscillatory function which terminates because
+ of roundoff error, uses the 31-pt rule */
+
+ {
+ int status = 0; struct counter_params p;
+ double result = 0, abserr=0;
+
+ gsl_integration_workspace * w = gsl_integration_workspace_alloc (1000) ;
+
+ double exp_result = -7.238969575482959717E-01;
+ double exp_abserr = 1.285805464427459261E-14;
+ int exp_neval = 31;
+ int exp_ier = GSL_EROUND;
+ int exp_last = 1;
+
+ double alpha = 1.3 ;
+ gsl_function f = make_function(&f3, &alpha);
+
+ gsl_function fc = make_counter(&f, &p) ;
+
+ status = gsl_integration_qag (&fc, 0.3, 2.71, 1e-14, 0.0, w->limit,
+ GSL_INTEG_GAUSS31, w,
+ &result, &abserr) ;
+
+ gsl_test_rel(result,exp_result,1e-15,"qag(f3,31pt) oscill result");
+ gsl_test_rel(abserr,exp_abserr,1e-6,"qag(f3,31pt) oscill abserr");
+ gsl_test_int((int)(p.neval),exp_neval,"qag(f3,31pt) oscill neval") ;
+ gsl_test_int((int)(w->size),exp_last,"qag(f3,31pt) oscill last") ;
+ gsl_test_int(status,exp_ier,"qag(f3,31pt) oscill status") ;
+
+ p.neval = 0;
+ status = gsl_integration_qag (&fc, 2.71, 0.3, 1e-14, 0.0, w->limit,
+ GSL_INTEG_GAUSS31, w,
+ &result, &abserr) ;
+
+ gsl_test_rel(result,-exp_result,1e-15,"qag(f3,31pt) reverse result");
+ gsl_test_rel(abserr,exp_abserr,1e-6,"qag(f3,31pt) reverse abserr");
+ gsl_test_int((int)(p.neval),exp_neval,"qag(f3,31pt) reverse neval") ;
+ gsl_test_int((int)(w->size),exp_last,"qag(f3,31pt) reverse last") ;
+ gsl_test_int(status,exp_ier,"qag(f3,31pt) reverse status") ;
+
+ gsl_integration_workspace_free (w) ;
+
+ }
+
+ /* Check the singularity detection (singularity at x=-0.1 in this example) */
+
+ {
+ int status = 0; struct counter_params p;
+ double result = 0, abserr=0;
+
+ gsl_integration_workspace * w = gsl_integration_workspace_alloc (1000) ;
+
+ int exp_neval = 5151;
+ int exp_ier = GSL_ESING;
+ int exp_last = 51;
+
+ double alpha = 2.0 ;
+ gsl_function f = make_function(&f16, &alpha);
+
+ gsl_function fc = make_counter(&f, &p) ;
+
+ status = gsl_integration_qag (&fc, -1.0, 1.0, 1e-14, 0.0, w->limit,
+ GSL_INTEG_GAUSS51, w,
+ &result, &abserr) ;
+
+ gsl_test_int((int)(p.neval),exp_neval,"qag(f16,51pt) sing neval") ;
+ gsl_test_int((int)(w->size),exp_last,"qag(f16,51pt) sing last") ;
+ gsl_test_int(status,exp_ier,"qag(f16,51pt) sing status") ;
+
+ p.neval = 0;
+ status = gsl_integration_qag (&fc, 1.0, -1.0, 1e-14, 0.0, w->limit,
+ GSL_INTEG_GAUSS51, w,
+ &result, &abserr) ;
+
+ gsl_test_int((int)(p.neval),exp_neval,"qag(f16,51pt) rev neval") ;
+ gsl_test_int((int)(w->size),exp_last,"qag(f16,51pt) rev last") ;
+ gsl_test_int(status,exp_ier,"qag(f16,51pt) rev status") ;
+
+ gsl_integration_workspace_free (w) ;
+
+ }
+
+ /* Check for hitting the iteration limit */
+
+ {
+ int status = 0, i; struct counter_params p;
+ double result = 0, abserr=0;
+
+ gsl_integration_workspace * w = gsl_integration_workspace_alloc (3) ;
+
+ double exp_result = 9.565151449233894709 ;
+ double exp_abserr = 1.570369823891028460E+01;
+ int exp_neval = 305;
+ int exp_ier = GSL_EMAXITER;
+ int exp_last = 3;
+
+ double a[3] = { -5.000000000000000000E-01,
+ 0.000000000000000000,
+ -1.000000000000000000 } ;
+
+ double b[3] = { 0.000000000000000000,
+ 1.000000000000000000,
+ -5.000000000000000000E-01 } ;
+
+ double r[3] = { 9.460353469435913709,
+ 9.090909090909091161E-02,
+ 1.388888888888888812E-02 } ;
+
+ double e[3] = { 1.570369823891028460E+01,
+ 1.009293658750142399E-15,
+ 1.541976423090495140E-16 } ;
+
+ int order[3] = { 1, 2, 3 } ;
+
+ double alpha = 1.0 ;
+ gsl_function f = make_function(&f16, &alpha);
+ gsl_function fc = make_counter(&f, &p) ;
+
+ status = gsl_integration_qag (&fc, -1.0, 1.0, 1e-14, 0.0, w->limit,
+ GSL_INTEG_GAUSS61, w,
+ &result, &abserr) ;
+
+ gsl_test_rel(result,exp_result,1e-15,"qag(f16,61pt) limit result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-6,"qag(f16,61pt) limit abserr") ;
+ gsl_test_int((int)(p.neval),exp_neval,"qag(f16,61pt) limit neval") ;
+ gsl_test_int((int)(w->size),exp_last,"qag(f16,61pt) limit last") ;
+ gsl_test_int(status,exp_ier,"qag(f16,61pt) limit status") ;
+
+ for (i = 0; i < 3 ; i++)
+ gsl_test_rel(w->alist[i],a[i],1e-15,"qag(f16,61pt) limit alist") ;
+
+ for (i = 0; i < 3 ; i++)
+ gsl_test_rel(w->blist[i],b[i],1e-15,"qag(f16,61pt) limit blist") ;
+
+ for (i = 0; i < 3 ; i++)
+ gsl_test_rel(w->rlist[i],r[i],1e-15,"qag(f16,61pt) limit rlist") ;
+
+ for (i = 0; i < 3 ; i++)
+ gsl_test_rel(w->elist[i],e[i],1e-6,"qag(f16,61pt) limit elist") ;
+
+ for (i = 0; i < 3 ; i++)
+ gsl_test_int((int)w->order[i],order[i]-1,"qag(f16,61pt) limit order");
+
+ p.neval = 0;
+ status = gsl_integration_qag (&fc, 1.0, -1.0, 1e-14, 0.0, w->limit,
+ GSL_INTEG_GAUSS61, w,
+ &result, &abserr) ;
+
+ gsl_test_rel(result,-exp_result,1e-15,"qag(f16,61pt) reverse result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-6,"qag(f16,61pt) reverse abserr") ;
+ gsl_test_int((int)(p.neval),exp_neval,"qag(f16,61pt) reverse neval") ;
+ gsl_test_int((int)(w->size),exp_last,"qag(f16,61pt) reverse last") ;
+ gsl_test_int(status,exp_ier,"qag(f16,61pt) reverse status") ;
+
+ gsl_integration_workspace_free (w) ;
+
+ }
+
+ /* Test the adaptive integrator with extrapolation QAGS */
+
+ {
+ int status = 0, i; struct counter_params p;
+ double result = 0, abserr=0;
+
+ gsl_integration_workspace * w = gsl_integration_workspace_alloc (1000) ;
+
+ double exp_result = 7.716049382715789440E-02 ;
+ double exp_abserr = 2.216394961010438404E-12 ;
+ int exp_neval = 189;
+ int exp_ier = 0;
+ int exp_last = 5;
+
+ double a[5] = { 0, 0.5, 0.25, 0.125, 0.0625 } ;
+ double b[5] = { 0.0625, 1, 0.5, 0.25, 0.125 } ;
+ double r[5] = { 3.919381915366914693E-05,
+ 5.491842501998223103E-02,
+ 1.909827770934243579E-02,
+ 2.776531175604360097E-03,
+ 3.280661030752062609E-04 } ;
+ double e[5] = { 2.215538742580964735E-12,
+ 6.097169993333454062E-16,
+ 2.120334764359736441E-16,
+ 3.082568839745514608E-17,
+ 3.642265412331439511E-18 } ;
+ int order[5] = { 1, 2, 3, 4, 5 } ;
+
+ double alpha = 2.6 ;
+ gsl_function f = make_function(&f1, &alpha);
+ gsl_function fc = make_counter(&f, &p) ;
+
+ status = gsl_integration_qags (&fc, 0.0, 1.0, 0.0, 1e-10, w->limit,
+ w,
+ &result, &abserr) ;
+
+ gsl_test_rel(result,exp_result,1e-15,"qags(f1) smooth result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-6,"qags(f1) smooth abserr") ;
+ gsl_test_int((int)(p.neval),exp_neval,"qags(f1) smooth neval") ;
+ gsl_test_int((int)(w->size),exp_last,"qags(f1) smooth last") ;
+ gsl_test_int(status,exp_ier,"qags(f1) smooth status") ;
+
+ for (i = 0; i < 5 ; i++)
+ gsl_test_rel(w->alist[i],a[i],1e-15,"qags(f1) smooth alist") ;
+
+ for (i = 0; i < 5 ; i++)
+ gsl_test_rel(w->blist[i],b[i],1e-15,"qags(f1) smooth blist") ;
+
+ for (i = 0; i < 5 ; i++)
+ gsl_test_rel(w->rlist[i],r[i],1e-15,"qags(f1) smooth rlist") ;
+
+ for (i = 0; i < 5 ; i++)
+ gsl_test_rel(w->elist[i],e[i],1e-6,"qags(f1) smooth elist") ;
+
+ for (i = 0; i < 5 ; i++)
+ gsl_test_int((int)w->order[i],order[i]-1,"qags(f1) smooth order") ;
+
+ p.neval = 0;
+ status = gsl_integration_qags (&fc, 1.0, 0.0, 0.0, 1e-10, w->limit,
+ w,
+ &result, &abserr) ;
+
+ gsl_test_rel(result,-exp_result,1e-15,"qags(f1) reverse result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-6,"qags(f1) reverse abserr") ;
+ gsl_test_int((int)(p.neval),exp_neval,"qags(f1) reverse neval") ;
+ gsl_test_int((int)(w->size),exp_last,"qags(f1) reverse last") ;
+ gsl_test_int(status,exp_ier,"qags(f1) reverse status") ;
+
+ gsl_integration_workspace_free (w) ;
+
+ }
+
+ /* Test f11 using an absolute error bound */
+
+ {
+ int status = 0, i; struct counter_params p;
+ double result = 0, abserr=0;
+
+ gsl_integration_workspace * w = gsl_integration_workspace_alloc (1000) ;
+
+ /* All results are for GSL_IEEE_MODE=double-precision */
+
+ double exp_result = -5.908755278982136588E+03 ;
+ double exp_abserr = 1.299646281053874554E-10 ;
+ int exp_neval = 357;
+ int exp_ier = 0;
+ int exp_last = 9;
+
+ double a[9] = { 1.000000000000000000E+00,
+ 5.005000000000000000E+02,
+ 2.507500000000000000E+02,
+ 1.258750000000000000E+02,
+ 6.343750000000000000E+01,
+ 3.221875000000000000E+01,
+ 1.660937500000000000E+01,
+ 8.804687500000000000E+00,
+ 4.902343750000000000E+00 } ;
+ double b[9] = { 4.902343750000000000E+00,
+ 1.000000000000000000E+03,
+ 5.005000000000000000E+02,
+ 2.507500000000000000E+02,
+ 1.258750000000000000E+02,
+ 6.343750000000000000E+01,
+ 3.221875000000000000E+01,
+ 1.660937500000000000E+01,
+ 8.804687500000000000E+00 } ;
+ double r[9] = { -3.890977835520834649E+00,
+ -3.297343675805121620E+03,
+ -1.475904154146372775E+03,
+ -6.517404019686431411E+02,
+ -2.829354222635842007E+02,
+ -1.201692001973227519E+02,
+ -4.959999906099650246E+01,
+ -1.971441499411640308E+01,
+ -7.457032710459004399E+00 } ;
+ double e[9] = { 6.448276035006137169E-11,
+ 3.660786868980994028E-11,
+ 1.638582774073219226E-11,
+ 7.235772003440423011E-12,
+ 3.141214202790722909E-12,
+ 1.334146129098576244E-12,
+ 5.506706097890446534E-13,
+ 2.188739744348345039E-13,
+ 8.278969410534525339E-14 } ;
+ int order[9] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 } ;
+
+ double alpha = 2.0 ;
+ gsl_function f = make_function(&f11, &alpha);
+ gsl_function fc = make_counter(&f, &p) ;
+
+ status = gsl_integration_qags (&fc, 1.0, 1000.0, 1e-7, 0.0, w->limit,
+ w,
+ &result, &abserr) ;
+
+ gsl_test_rel(result,exp_result,1e-15,"qags(f11) smooth result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-3,"qags(f11) smooth abserr") ;
+ gsl_test_int((int)(p.neval),exp_neval,"qags(f11) smooth neval") ;
+ gsl_test_int((int)(w->size),exp_last,"qags(f11) smooth last") ;
+ gsl_test_int(status,exp_ier,"qags(f11) smooth status") ;
+
+ for (i = 0; i < 9 ; i++)
+ gsl_test_rel(w->alist[i],a[i],1e-15,"qags(f11) smooth alist") ;
+
+ for (i = 0; i < 9 ; i++)
+ gsl_test_rel(w->blist[i],b[i],1e-15,"qags(f11) smooth blist") ;
+
+ for (i = 0; i < 9 ; i++)
+ gsl_test_rel(w->rlist[i],r[i],1e-15,"qags(f11) smooth rlist") ;
+
+ for (i = 0; i < 9 ; i++)
+ gsl_test_rel(w->elist[i],e[i],1e-5,"qags(f11) smooth elist") ;
+
+ for (i = 0; i < 9 ; i++)
+ gsl_test_int((int)w->order[i],order[i]-1,"qags(f11) smooth order");
+
+ p.neval = 0;
+ status = gsl_integration_qags (&fc, 1000.0, 1.0, 1e-7, 0.0, w->limit,
+ w,
+ &result, &abserr) ;
+
+ gsl_test_rel(result,-exp_result,1e-15,"qags(f11) reverse result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-3,"qags(f11) reverse abserr") ;
+ gsl_test_int((int)(p.neval),exp_neval,"qags(f11) reverse neval") ;
+ gsl_test_int((int)(w->size),exp_last,"qags(f11) reverse last") ;
+ gsl_test_int(status,exp_ier,"qags(f11) reverse status") ;
+
+ gsl_integration_workspace_free (w) ;
+
+ }
+
+ /* Test infinite range integral f455 using a relative error bound */
+
+ {
+ int status = 0, i; struct counter_params p;
+ double result = 0, abserr=0;
+
+ gsl_integration_workspace * w = gsl_integration_workspace_alloc (1000) ;
+
+ /* All results are for GSL_IEEE_MODE=double-precision */
+
+ double exp_result = -3.616892186127022568E-01 ;
+ double exp_abserr = 3.016716913328831851E-06;
+ int exp_neval = 285;
+ int exp_ier = 0;
+ int exp_last = 10;
+
+ double a[10] = { 9.687500000000000000E-01,
+ 0.000000000000000000E+00,
+ 5.000000000000000000E-01,
+ 2.500000000000000000E-01,
+ 7.500000000000000000E-01,
+ 1.250000000000000000E-01,
+ 8.750000000000000000E-01,
+ 6.250000000000000000E-02,
+ 9.375000000000000000E-01,
+ 3.125000000000000000E-02 } ;
+ double b[10] = { 1.000000000000000000E+00,
+ 3.125000000000000000E-02,
+ 7.500000000000000000E-01,
+ 5.000000000000000000E-01,
+ 8.750000000000000000E-01,
+ 2.500000000000000000E-01,
+ 9.375000000000000000E-01,
+ 1.250000000000000000E-01,
+ 9.687500000000000000E-01,
+ 6.250000000000000000E-02 } ;
+ double r[10] = { -1.390003415539725340E-01,
+ 1.429785306003466313E-03,
+ -1.229943369113085765E-02,
+ 2.995321156568048898E-03,
+ -4.980050133751051655E-02,
+ 2.785385934678596704E-03,
+ -8.653752279614615461E-02,
+ 1.736218164975512294E-03,
+ -8.398745675010892142E-02,
+ 1.041689192004495576E-03 } ;
+ double e[10] = { 2.395037249893453013E-02,
+ 2.161214992172538524E-04,
+ 5.720644840858777846E-14,
+ 3.325474514168701167E-17,
+ 3.147380432198176412E-14,
+ 3.092399597147240624E-17,
+ 9.607595030230581153E-16,
+ 1.927589382528252344E-17,
+ 9.324480826368044019E-16,
+ 1.156507325466566521E-17 } ;
+ int order[10] = { 1, 2, 3, 5, 7, 9, 4, 6, 8, 10 } ;
+
+ gsl_function f = make_function(&f455, 0);
+ gsl_function fc = make_counter(&f, &p) ;
+
+ status = gsl_integration_qagiu (&fc, 0.0, 0.0, 1.0e-3, w->limit,
+ w,
+ &result, &abserr) ;
+
+ gsl_test_rel(result,exp_result,1e-14,"qagiu(f455) smooth result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-5,"qagiu(f455) smooth abserr") ;
+ gsl_test_int((int)(p.neval),exp_neval,"qagiu(f455) smooth neval") ;
+ gsl_test_int((int)(w->size),exp_last,"qagiu(f455) smooth last") ;
+ gsl_test_int(status,exp_ier,"qagiu(f455) smooth status") ;
+
+ for (i = 0; i < 10 ; i++)
+ gsl_test_rel(w->alist[i],a[i],1e-15,"qagiu(f455) smooth alist") ;
+
+ for (i = 0; i < 10 ; i++)
+ gsl_test_rel(w->blist[i],b[i],1e-15,"qagiu(f455) smooth blist") ;
+
+ for (i = 0; i < 10 ; i++)
+ gsl_test_rel(w->rlist[i],r[i],1e-15,"qagiu(f455) smooth rlist") ;
+
+ for (i = 0; i < 10 ; i++)
+ gsl_test_rel(w->elist[i],e[i],1e-4,"qagiu(f455) smooth elist") ;
+
+ for (i = 0; i < 10 ; i++)
+ gsl_test_int((int)w->order[i],order[i]-1,"qagiu(f455) smooth order");
+
+ gsl_integration_workspace_free (w) ;
+
+ }
+
+ /* Test infinite range integral f15 using a relative error bound */
+
+ {
+ int status = 0, i; struct counter_params p;
+ double result = 0, abserr=0;
+
+ gsl_integration_workspace * w = gsl_integration_workspace_alloc (1000) ;
+
+ /* All results are for GSL_IEEE_MODE=double-precision */
+
+ double exp_result = 6.553600000000024738E+04;
+ double exp_abserr = 7.121667111456009280E-04;
+ int exp_neval = 285;
+ int exp_ier = 0;
+ int exp_last = 10;
+
+ double a[10] = { 0.000000000000000000E+00,
+ 5.000000000000000000E-01,
+ 2.500000000000000000E-01,
+ 1.250000000000000000E-01,
+ 6.250000000000000000E-02,
+ 3.125000000000000000E-02,
+ 1.562500000000000000E-02,
+ 7.812500000000000000E-03,
+ 3.906250000000000000E-03,
+ 1.953125000000000000E-03 } ;
+ double b[10] = { 1.953125000000000000E-03,
+ 1.000000000000000000E+00,
+ 5.000000000000000000E-01,
+ 2.500000000000000000E-01,
+ 1.250000000000000000E-01,
+ 6.250000000000000000E-02,
+ 3.125000000000000000E-02,
+ 1.562500000000000000E-02,
+ 7.812500000000000000E-03,
+ 3.906250000000000000E-03 } ;
+ double r[10] = { 1.099297665754340292E+00,
+ 3.256176475185617591E-01,
+ 8.064694554185326325E+00,
+ 8.873128656118993263E+01,
+ 6.977679035845269482E+02,
+ 4.096981198511257389E+03,
+ 1.574317583220441520E+04,
+ 2.899418134793237914E+04,
+ 1.498314766425578091E+04,
+ 9.225251570832365360E+02 } ;
+ double e[10] = { 7.101865971621337814E-04,
+ 1.912660677170175771E-08,
+ 9.167763417119923333E-08,
+ 3.769501719163865578E-07,
+ 6.973493131275552509E-07,
+ 1.205653952340679711E-07,
+ 1.380003928453846583E-07,
+ 1.934652413547325474E-07,
+ 3.408933028357320364E-07,
+ 2.132473175465897029E-09 } ;
+ int order[10] = { 1, 5, 4, 9, 8, 7, 6, 3, 2, 10 } ;
+
+ double alpha = 5.0;
+
+ gsl_function f = make_function(&f15, &alpha);
+ gsl_function fc = make_counter(&f, &p) ;
+
+ status = gsl_integration_qagiu (&fc, 0.0, 0.0, 1.0e-7, w->limit,
+ w,
+ &result, &abserr) ;
+
+ gsl_test_rel(result,exp_result,1e-14,"qagiu(f15) smooth result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-5,"qagiu(f15) smooth abserr") ;
+ gsl_test_int((int)(p.neval),exp_neval,"qagiu(f15) smooth neval") ;
+ gsl_test_int((int)(w->size),exp_last,"qagiu(f15) smooth last") ;
+ gsl_test_int(status,exp_ier,"qagiu(f15) smooth status") ;
+
+ for (i = 0; i < 10 ; i++)
+ gsl_test_rel(w->alist[i],a[i],1e-15,"qagiu(f15) smooth alist") ;
+
+ for (i = 0; i < 10 ; i++)
+ gsl_test_rel(w->blist[i],b[i],1e-15,"qagiu(f15) smooth blist") ;
+
+ for (i = 0; i < 10 ; i++)
+ gsl_test_rel(w->rlist[i],r[i],1e-15,"qagiu(f15) smooth rlist") ;
+
+ for (i = 0; i < 10 ; i++)
+ gsl_test_rel(w->elist[i],e[i],1e-4,"qagiu(f15) smooth elist") ;
+
+ for (i = 0; i < 10 ; i++)
+ gsl_test_int((int)w->order[i],order[i]-1,"qagiu(f15) smooth order");
+
+ gsl_integration_workspace_free (w) ;
+
+ }
+
+ /* Test infinite range integral f16 using an absolute error bound */
+
+ {
+ int status = 0, i; struct counter_params p;
+ double result = 0, abserr=0;
+
+ gsl_integration_workspace * w = gsl_integration_workspace_alloc (1000) ;
+
+ /* All results are for GSL_IEEE_MODE=double-precision */
+
+ double exp_result = 1.000000000006713292E-04;
+ double exp_abserr = 3.084062020905636316E-09;
+ int exp_neval = 165;
+ int exp_ier = 0;
+ int exp_last = 6;
+
+ double a[6] = { 0.000000000000000000E+00,
+ 5.000000000000000000E-01,
+ 2.500000000000000000E-01,
+ 1.250000000000000000E-01,
+ 6.250000000000000000E-02,
+ 3.125000000000000000E-02 } ;
+ double b[6] = { 3.125000000000000000E-02,
+ 1.000000000000000000E+00,
+ 5.000000000000000000E-01,
+ 2.500000000000000000E-01,
+ 1.250000000000000000E-01,
+ 6.250000000000000000E-02 } ;
+ double r[6] = { 7.633587786326674618E-05,
+ 9.900990099009899620E-07,
+ 1.922522349322310737E-06,
+ 3.629434715543053753E-06,
+ 6.501422186103209199E-06,
+ 1.062064387653501389E-05 } ;
+ double e[6] = { 3.084061858351569051E-09,
+ 3.112064814755089674E-17,
+ 4.543453652226561245E-17,
+ 4.908618166361344548E-17,
+ 3.014338672269481784E-17,
+ 6.795996738013555461E-18 } ;
+ int order[6] = { 1, 4, 3, 2, 5, 6 } ;
+
+ double alpha = 1.0;
+
+ gsl_function f = make_function(&f16, &alpha);
+ gsl_function fc = make_counter(&f, &p) ;
+
+ status = gsl_integration_qagiu (&fc, 99.9, 1.0e-7, 0.0, w->limit,
+ w,
+ &result, &abserr) ;
+
+ gsl_test_rel(result,exp_result,1e-14,"qagiu(f16) smooth result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-5,"qagiu(f16) smooth abserr") ;
+ gsl_test_int((int)(p.neval),exp_neval,"qagiu(f16) smooth neval") ;
+ gsl_test_int((int)(w->size),exp_last,"qagiu(f16) smooth last") ;
+ gsl_test_int(status,exp_ier,"qagiu(f16) smooth status") ;
+
+ for (i = 0; i < 6 ; i++)
+ gsl_test_rel(w->alist[i],a[i],1e-15,"qagiu(f16) smooth alist") ;
+
+ for (i = 0; i < 6 ; i++)
+ gsl_test_rel(w->blist[i],b[i],1e-15,"qagiu(f16) smooth blist") ;
+
+ for (i = 0; i < 6 ; i++)
+ gsl_test_rel(w->rlist[i],r[i],1e-15,"qagiu(f16) smooth rlist") ;
+
+ for (i = 0; i < 6 ; i++)
+ gsl_test_rel(w->elist[i],e[i],1e-4,"qagiu(f16) smooth elist") ;
+
+ for (i = 0; i < 6 ; i++)
+ gsl_test_int((int)w->order[i],order[i]-1,"qagiu(f16) smooth order");
+
+ gsl_integration_workspace_free (w) ;
+
+ }
+
+ /* Test infinite range integral myfn1 using an absolute error bound */
+
+ {
+ int status = 0, i; struct counter_params p;
+ double result = 0, abserr=0;
+
+ gsl_integration_workspace * w = gsl_integration_workspace_alloc (1000) ;
+
+ /* All results are for GSL_IEEE_MODE=double-precision */
+
+ double exp_result = 2.275875794468747770E+00;
+ double exp_abserr = 7.436490118267390744E-09;
+ int exp_neval = 270;
+ int exp_ier = 0;
+ int exp_last = 5;
+
+ double a[5] = { 1.250000000000000000E-01,
+ 5.000000000000000000E-01,
+ 2.500000000000000000E-01,
+ 0.000000000000000000E+00,
+ 3.750000000000000000E-01 } ;
+ double b[5] = { 2.500000000000000000E-01,
+ 1.000000000000000000E+00,
+ 3.750000000000000000E-01,
+ 1.250000000000000000E-01,
+ 5.000000000000000000E-01 } ;
+ double r[5] = { 4.639317228058405717E-04,
+ 1.691664195356748834E+00,
+ 1.146307471900291086E-01,
+ 4.379392477350953574E-20,
+ 4.691169201991640669E-01 } ;
+ double e[5] = { 3.169263960393051137E-09,
+ 4.265988974874425043E-09,
+ 1.231954072964969637E-12,
+ 8.360902986775307673E-20,
+ 5.208244060463541433E-15 } ;
+ int order[5] = { 2, 1, 3, 5, 4 } ;
+
+ gsl_function f = make_function(&myfn1, 0);
+ gsl_function fc = make_counter(&f, &p) ;
+
+ status = gsl_integration_qagi (&fc, 1.0e-7, 0.0, w->limit,
+ w,
+ &result, &abserr) ;
+
+ gsl_test_rel(result,exp_result,1e-14,"qagiu(myfn1) smooth result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-5,"qagiu(myfn1) smooth abserr") ;
+ gsl_test_int((int)(p.neval),exp_neval,"qagiu(myfn1) smooth neval") ;
+ gsl_test_int((int)(w->size),exp_last,"qagiu(myfn1) smooth last") ;
+ gsl_test_int(status,exp_ier,"qagiu(myfn1) smooth status") ;
+
+ for (i = 0; i < 5 ; i++)
+ gsl_test_rel(w->alist[i],a[i],1e-15,"qagiu(myfn1) smooth alist") ;
+
+ for (i = 0; i < 5 ; i++)
+ gsl_test_rel(w->blist[i],b[i],1e-15,"qagiu(myfn1) smooth blist") ;
+
+ for (i = 0; i < 5 ; i++)
+ gsl_test_rel(w->rlist[i],r[i],1e-14,"qagiu(myfn1) smooth rlist") ;
+
+ for (i = 0; i < 5 ; i++)
+ gsl_test_rel(w->elist[i],e[i],1e-4,"qagiu(myfn1) smooth elist") ;
+
+ for (i = 0; i < 5 ; i++)
+ gsl_test_int((int)w->order[i],order[i]-1,"qagiu(myfn1) smooth order");
+
+ gsl_integration_workspace_free (w) ;
+
+ }
+
+ /* Test infinite range integral myfn1 using an absolute error bound */
+
+ {
+ int status = 0, i; struct counter_params p;
+ double result = 0, abserr=0;
+
+ gsl_integration_workspace * w = gsl_integration_workspace_alloc (1000) ;
+
+ /* All results are for GSL_IEEE_MODE=double-precision */
+
+ double exp_result = 2.718281828459044647E+00;
+ double exp_abserr = 1.588185109253204805E-10;
+ int exp_neval = 135;
+ int exp_ier = 0;
+ int exp_last = 5;
+
+ double a[5] = { 0.000000000000000000E+00,
+ 5.000000000000000000E-01,
+ 2.500000000000000000E-01,
+ 1.250000000000000000E-01,
+ 6.250000000000000000E-02 } ;
+ double b[5] = { 6.250000000000000000E-02,
+ 1.000000000000000000E+00,
+ 5.000000000000000000E-01,
+ 2.500000000000000000E-01,
+ 1.250000000000000000E-01 } ;
+ double r[5] = { 8.315287189746029816E-07,
+ 1.718281828459045091E+00,
+ 8.646647167633871867E-01,
+ 1.328565310599463256E-01,
+ 2.477920647947255521E-03 } ;
+ double e[5] = { 1.533437090413525935E-10,
+ 4.117868247943567505E-12,
+ 7.802455785301941044E-13,
+ 5.395586026138397182E-13,
+ 3.713312434866150125E-14 } ;
+ int order[5] = { 1, 2, 3, 4, 5 } ;
+
+ double alpha = 1.0 ;
+ gsl_function f = make_function(&myfn2, &alpha);
+ gsl_function fc = make_counter(&f, &p) ;
+
+ status = gsl_integration_qagil (&fc, 1.0, 1.0e-7, 0.0, w->limit,
+ w,
+ &result, &abserr) ;
+
+ gsl_test_rel(result,exp_result,1e-14,"qagiu(myfn2) smooth result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-5,"qagiu(myfn2) smooth abserr") ;
+ gsl_test_int((int)(p.neval),exp_neval,"qagiu(myfn2) smooth neval") ;
+ gsl_test_int((int)(w->size),exp_last,"qagiu(myfn2) smooth last") ;
+ gsl_test_int(status,exp_ier,"qagiu(myfn2) smooth status") ;
+
+ for (i = 0; i < 5 ; i++)
+ gsl_test_rel(w->alist[i],a[i],1e-15,"qagiu(myfn2) smooth alist") ;
+
+ for (i = 0; i < 5 ; i++)
+ gsl_test_rel(w->blist[i],b[i],1e-15,"qagiu(myfn2) smooth blist") ;
+
+ for (i = 0; i < 5 ; i++)
+ gsl_test_rel(w->rlist[i],r[i],1e-14,"qagiu(myfn2) smooth rlist") ;
+
+ for (i = 0; i < 5 ; i++)
+ gsl_test_rel(w->elist[i],e[i],1e-4,"qagiu(myfn2) smooth elist") ;
+
+ for (i = 0; i < 5 ; i++)
+ gsl_test_int((int)w->order[i],order[i]-1,"qagiu(myfn2) smooth order");
+
+ gsl_integration_workspace_free (w) ;
+
+ }
+
+ /* Test integral f454 with integrable singular points */
+
+ {
+ int status = 0, i; struct counter_params p;
+ double result = 0, abserr=0;
+
+ gsl_integration_workspace * w = gsl_integration_workspace_alloc (1000) ;
+
+ /* All results are for GSL_IEEE_MODE=double-precision */
+
+ double exp_result = 5.274080611672716401E+01;
+ double exp_abserr = 1.755703848687062418E-04;
+ int exp_neval = 777;
+ int exp_ier = 0;
+ int exp_last = 20;
+
+ double a[20] = { 9.687500000000000000E-01,
+ 1.401269388548935790E+00,
+ 1.414213562373095145E+00,
+ 1.000000000000000000E+00,
+ 0.000000000000000000E+00,
+ 2.207106781186547462E+00,
+ 1.810660171779821415E+00,
+ 1.207106781186547462E+00,
+ 5.000000000000000000E-01,
+ 1.103553390593273731E+00,
+ 1.612436867076458391E+00,
+ 1.310660171779821415E+00,
+ 7.500000000000000000E-01,
+ 1.051776695296636976E+00,
+ 1.513325214724776657E+00,
+ 1.362436867076458391E+00,
+ 8.750000000000000000E-01,
+ 1.463769388548935790E+00,
+ 1.388325214724776657E+00,
+ 9.375000000000000000E-01} ;
+ double b[20] = { 1.000000000000000000E+00,
+ 1.414213562373095145E+00,
+ 1.463769388548935790E+00,
+ 1.051776695296636976E+00,
+ 5.000000000000000000E-01,
+ 3.000000000000000000E+00,
+ 2.207106781186547462E+00,
+ 1.310660171779821415E+00,
+ 7.500000000000000000E-01,
+ 1.207106781186547462E+00,
+ 1.810660171779821415E+00,
+ 1.362436867076458391E+00,
+ 8.750000000000000000E-01,
+ 1.103553390593273731E+00,
+ 1.612436867076458391E+00,
+ 1.388325214724776657E+00,
+ 9.375000000000000000E-01,
+ 1.513325214724776657E+00,
+ 1.401269388548935790E+00,
+ 9.687500000000000000E-01} ;
+ double r[20] = { -1.125078814079027711E-01,
+ -1.565132123531515207E-01,
+ -4.225328513207429193E-01,
+ -1.830392049835374568E-01,
+ 6.575875041899758092E-03,
+ 4.873920540843067783E+01,
+ 6.032891565603589079E+00,
+ -2.991531901645863023E-01,
+ -7.326282608704996063E-03,
+ -2.431894410706912923E-01,
+ 5.911661670635662835E-01,
+ -2.236786562536174916E-01,
+ -5.647871991778510847E-02,
+ -1.305470403178642658E-01,
+ -1.721363984401322045E-01,
+ -1.589345454585119055E-01,
+ -7.406626263352669715E-02,
+ -2.208730668000830344E-01,
+ -1.048692749517999567E-01,
+ -6.302287584527696551E-02} ;
+ double e[20] = { 2.506431410088378817E-02,
+ 2.730454695485963826E-02,
+ 1.017446081816190118E-01,
+ 3.252808038935910834E-02,
+ 7.300687878575027348E-17,
+ 5.411138804637469780E-13,
+ 6.697855121200013106E-14,
+ 3.321267596107916554E-15,
+ 1.417509685426979386E-16,
+ 2.699945168224041491E-15,
+ 6.573952690524728748E-15,
+ 2.483331942899818875E-15,
+ 6.270397525408045936E-16,
+ 1.449363299575615261E-15,
+ 1.911097929242846383E-15,
+ 1.764527917763735212E-15,
+ 8.223007012367522077E-16,
+ 2.452183642810224359E-15,
+ 1.164282836272345215E-15,
+ 6.996944784151910810E-16} ;
+ int order[20] = { 3, 4, 2, 1, 6, 7, 11, 8, 10, 12, 18,
+ 15, 16, 14, 19, 17, 20, 13, 9, 5 } ;
+
+ gsl_function f = make_function(&f454, 0);
+ gsl_function fc = make_counter(&f, &p) ;
+
+ double pts[4] ;
+
+ pts[0] = 0.0;
+ pts[1] = 1.0;
+ pts[2] = sqrt(2.0);
+ pts[3] = 3.0;
+
+ status = gsl_integration_qagp (&fc, pts, 4,
+ 0.0, 1.0e-3, w->limit,
+ w,
+ &result, &abserr) ;
+
+ gsl_test_rel(result,exp_result,1e-14,"qagp(f454) singular result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-5,"qagp(f454) singular abserr") ;
+ gsl_test_int((int)(p.neval),exp_neval,"qagp(f454) singular neval") ;
+ gsl_test_int((int)(w->size),exp_last,"qagp(f454) singular last") ;
+ gsl_test_int(status,exp_ier,"qagp(f454) singular status") ;
+
+ for (i = 0; i < 20 ; i++)
+ gsl_test_rel(w->alist[i],a[i],1e-15,"qagp(f454) singular alist") ;
+
+ for (i = 0; i < 20 ; i++)
+ gsl_test_rel(w->blist[i],b[i],1e-15,"qagp(f454) singular blist") ;
+
+ for (i = 0; i < 20 ; i++)
+ gsl_test_rel(w->rlist[i],r[i],1e-14,"qagp(f454) singular rlist") ;
+
+ for (i = 0; i < 20 ; i++)
+ gsl_test_rel(w->elist[i],e[i],1e-4,"qagp(f454) singular elist") ;
+
+ for (i = 0; i < 20 ; i++)
+ gsl_test_int((int)w->order[i],order[i]-1,"qagp(f454) singular order");
+
+ gsl_integration_workspace_free (w) ;
+
+ }
+
+
+ /* Test cauchy integration using a relative error bound */
+
+ {
+ int status = 0, i; struct counter_params p;
+ double result = 0, abserr=0;
+
+ gsl_integration_workspace * w = gsl_integration_workspace_alloc (1000) ;
+
+ /* All results are for GSL_IEEE_MODE=double-precision */
+
+ double exp_result = -8.994400695837000137E-02;
+ double exp_abserr = 1.185290176227023727E-06;
+ int exp_neval = 215;
+ int exp_ier = 0;
+ int exp_last = 6;
+
+ double a[6] = { -1.000000000000000000E+00,
+ 2.500000000000000000E+00,
+ 1.250000000000000000E+00,
+ 6.250000000000000000E-01,
+ -5.000000000000000000E-01,
+ -7.500000000000000000E-01} ;
+ double b[6] = { -7.500000000000000000E-01,
+ 5.000000000000000000E+00,
+ 2.500000000000000000E+00,
+ 1.250000000000000000E+00,
+ 6.250000000000000000E-01,
+ -5.000000000000000000E-01} ;
+ double r[6] = { -1.234231128040012976E-01,
+ 3.579970394639702888E-03,
+ 2.249831615049339983E-02,
+ 7.214232992127905808E-02,
+ 2.079093855884046535E-02,
+ -8.553244917962132821E-02} ;
+ double e[6] = { 1.172832717970022565E-06,
+ 9.018232896137375412E-13,
+ 1.815172652101790755E-12,
+ 1.006998195150956048E-13,
+ 1.245463873006391609E-08,
+ 1.833082948207153514E-15 } ;
+ int order[6] = { 1, 5, 3, 2, 4, 6 } ;
+
+ double alpha = 1.0 ;
+ gsl_function f = make_function(&f459, &alpha);
+ gsl_function fc = make_counter(&f, &p) ;
+
+ status = gsl_integration_qawc (&fc, -1.0, 5.0, 0.0, 0.0, 1.0e-3, w->limit,
+ w,
+ &result, &abserr) ;
+
+ gsl_test_rel(result,exp_result,1e-14,"qawc(f459) result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-6,"qawc(f459) abserr") ;
+ gsl_test_int((int)(p.neval),exp_neval,"qawc(f459) neval") ;
+ gsl_test_int((int)(w->size),exp_last,"qawc(f459) last") ;
+ gsl_test_int(status,exp_ier,"qawc(f459) status") ;
+
+ for (i = 0; i < 6 ; i++)
+ gsl_test_rel(w->alist[i],a[i],1e-15,"qawc(f459) alist") ;
+
+ for (i = 0; i < 6 ; i++)
+ gsl_test_rel(w->blist[i],b[i],1e-15,"qawc(f459) blist") ;
+
+ for (i = 0; i < 6 ; i++)
+ gsl_test_rel(w->rlist[i],r[i],1e-14,"qawc(f459) rlist") ;
+
+ for (i = 0; i < 6 ; i++)
+ gsl_test_rel(w->elist[i],e[i],1e-5,"qawc(f459) elist") ;
+
+ for (i = 0; i < 6 ; i++)
+ gsl_test_int((int)w->order[i],order[i]-1,"qawc(f459) order");
+
+ p.neval = 0;
+ status = gsl_integration_qawc (&fc, 5.0, -1.0, 0.0, 0.0, 1.0e-3, w->limit,
+ w,
+ &result, &abserr) ;
+
+ gsl_test_rel(result,-exp_result,1e-14,"qawc(f459) rev result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-6,"qawc(f459) rev abserr") ;
+ gsl_test_int((int)(p.neval),exp_neval,"qawc(f459) rev neval") ;
+ gsl_test_int((int)(w->size),exp_last,"qawc(f459) rev last") ;
+ gsl_test_int(status,exp_ier,"qawc(f459) rev status") ;
+
+ gsl_integration_workspace_free (w) ;
+
+ }
+
+ /* Test QAWS singular integration using a relative error bound */
+
+ {
+ int status = 0, i; struct counter_params p;
+ double result = 0, abserr=0;
+
+ gsl_integration_qaws_table * t
+ = gsl_integration_qaws_table_alloc (0.0, 0.0, 1, 0);
+
+ gsl_integration_workspace * w = gsl_integration_workspace_alloc (1000) ;
+
+ /* All results are for GSL_IEEE_MODE=double-precision */
+
+ double exp_result = -1.892751853489401670E-01;
+ double exp_abserr = 1.129133712015747658E-08;
+ int exp_neval = 280;
+ int exp_ier = 0;
+ int exp_last = 8;
+
+ double a[8] = { 0.000000000000000000E+00,
+ 5.000000000000000000E-01,
+ 2.500000000000000000E-01,
+ 1.250000000000000000E-01,
+ 6.250000000000000000E-02,
+ 3.125000000000000000E-02,
+ 1.562500000000000000E-02,
+ 7.812500000000000000E-03} ;
+ double b[8] = { 7.812500000000000000E-03,
+ 1.000000000000000000E+00,
+ 5.000000000000000000E-01,
+ 2.500000000000000000E-01,
+ 1.250000000000000000E-01,
+ 6.250000000000000000E-02,
+ 3.125000000000000000E-02,
+ 1.562500000000000000E-02} ;
+ double r[8] = { -4.126317299834445824E-05,
+ -1.076283950172247789E-01,
+ -6.240573216173390947E-02,
+ -1.456169844189576269E-02,
+ -3.408925115926728436E-03,
+ -8.914083918175634211E-04,
+ -2.574191402137795482E-04,
+ -8.034390712936630608E-05} ;
+ double e[8] = { 1.129099387465713953E-08,
+ 3.423394967694403596E-13,
+ 6.928428071454762659E-16,
+ 1.616673288784094320E-16,
+ 3.784667152924835070E-17,
+ 9.896621209399419425E-18,
+ 2.857926564445496100E-18,
+ 8.919965558336773736E-19} ;
+ int order[8] = { 1, 2, 3, 4, 5, 6, 7, 8 } ;
+
+ double alpha = 1.0 ;
+ gsl_function f = make_function(&f458, &alpha);
+ gsl_function fc = make_counter(&f, &p) ;
+
+ status = gsl_integration_qaws (&fc, 0.0, 1.0, t, 0.0, 1.0e-7, w->limit,
+ w,
+ &result, &abserr) ;
+
+ gsl_test_rel(result,exp_result,1e-14,"qaws(f458) ln(x-a) result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-6,"qaws(f458) ln(x-a) abserr") ;
+ gsl_test_int((int)(p.neval),exp_neval,"qaws(f458) ln(x-a) neval") ;
+ gsl_test_int((int)(w->size),exp_last,"qaws(f458) ln(x-a) last") ;
+ gsl_test_int(status,exp_ier,"qaws(f458) ln(x-a) status") ;
+
+ for (i = 0; i < 6 ; i++)
+ gsl_test_rel(w->alist[i],a[i],1e-15,"qaws(f458) ln(x-a) alist") ;
+
+ for (i = 0; i < 6 ; i++)
+ gsl_test_rel(w->blist[i],b[i],1e-15,"qaws(f458) ln(x-a) blist") ;
+
+ for (i = 0; i < 6 ; i++)
+ gsl_test_rel(w->rlist[i],r[i],1e-14,"qaws(f458) ln(x-a) rlist") ;
+
+ for (i = 0; i < 6 ; i++)
+ gsl_test_rel(w->elist[i],e[i],1e-4,"qaws(f458) ln(x-a) elist") ;
+
+ for (i = 0; i < 6 ; i++)
+ gsl_test_int((int)w->order[i],order[i]-1,"qaws(f458) ln(x-a) order");
+
+ /* Test without logs */
+
+ gsl_integration_qaws_table_set (t, -0.5, -0.3, 0, 0);
+
+ status = gsl_integration_qaws (&fc, 0.0, 1.0, t, 0.0, 1.0e-7, w->limit,
+ w, &result, &abserr) ;
+
+ exp_result = 9.896686656601706433E-01;
+ exp_abserr = 5.888032513201251628E-08;
+
+ gsl_test_rel(result,exp_result,1e-14,"qaws(f458) AB result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-6,"qaws(f458) AB abserr") ;
+
+ /* Test with ln(x - a) */
+
+ gsl_integration_qaws_table_set (t, -0.5, -0.3, 1, 0);
+
+ status = gsl_integration_qaws (&fc, 0.0, 1.0, t, 0.0, 1.0e-7, w->limit,
+ w, &result, &abserr) ;
+
+ exp_result = -3.636679470586539620E-01;
+ exp_abserr = 2.851348775257054093E-08;
+
+ gsl_test_rel(result,exp_result,1e-14,"qaws(f458) AB ln(x-a) result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-6,"qaws(f458) AB ln(x-a) abserr") ;
+
+ /* Test with ln(b - x) */
+
+ gsl_integration_qaws_table_set (t, -0.5, -0.3, 0, 1);
+
+ status = gsl_integration_qaws (&fc, 0.0, 1.0, t, 0.0, 1.0e-7, w->limit,
+ w, &result, &abserr) ;
+
+ exp_result = -1.911489253363409802E+00;
+ exp_abserr = 9.854016753016499034E-09;
+
+ gsl_test_rel(result,exp_result,1e-14,"qaws(f458) AB ln(b-x) result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-6,"qaws(f458) AB ln(b-x) abserr") ;
+
+ /* Test with ln(x - a) ln(b - x) */
+
+ gsl_integration_qaws_table_set (t, -0.5, -0.3, 1, 1);
+
+ status = gsl_integration_qaws (&fc, 0.0, 1.0, t, 0.0, 1.0e-7, w->limit,
+ w, &result, &abserr) ;
+
+ exp_result = 3.159922862811048172E-01;
+ exp_abserr = 2.336183482198144595E-08;
+
+ gsl_test_rel(result,exp_result,1e-14,"qaws(f458) AB ln(x-a)ln(b-x) result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-6,"qaws(f458) AB ln(x-a)ln(b-x) abserr") ;
+
+ gsl_integration_workspace_free (w) ;
+ gsl_integration_qaws_table_free (t) ;
+
+ }
+
+
+ /* Test oscillatory integration using a relative error bound */
+
+ {
+ int status = 0, i; struct counter_params p;
+ double result = 0, abserr=0;
+
+ gsl_integration_workspace * w = gsl_integration_workspace_alloc (1000) ;
+ gsl_integration_qawo_table * wo
+ = gsl_integration_qawo_table_alloc (10.0 * M_PI, 1.0,
+ GSL_INTEG_SINE, 1000) ;
+
+ /* All results are for GSL_IEEE_MODE=double-precision */
+
+ double exp_result = -1.281368483991674190E-01;
+ double exp_abserr = 6.875028324415666248E-12;
+ int exp_neval = 305;
+ int exp_ier = 0;
+ int exp_last = 9;
+
+ double a[9] = { 0.000000000000000000E+00,
+ 5.000000000000000000E-01,
+ 2.500000000000000000E-01,
+ 1.250000000000000000E-01,
+ 6.250000000000000000E-02,
+ 3.125000000000000000E-02,
+ 1.562500000000000000E-02,
+ 7.812500000000000000E-03,
+ 3.906250000000000000E-03 } ;
+ double b[9] = { 3.906250000000000000E-03,
+ 1.000000000000000000E+00,
+ 5.000000000000000000E-01,
+ 2.500000000000000000E-01,
+ 1.250000000000000000E-01,
+ 6.250000000000000000E-02,
+ 3.125000000000000000E-02,
+ 1.562500000000000000E-02,
+ 7.812500000000000000E-03 } ;
+ double r[9] = { -1.447193692377651136E-03,
+ 2.190541162282139478E-02,
+ -2.587726479625663753E-02,
+ 5.483209176363500886E-02,
+ -3.081695575172510582E-02,
+ -9.178321994387816929E-02,
+ -3.886716016498160953E-02,
+ -1.242306301902117854E-02,
+ -3.659495117871544145E-03} ;
+ double e[9] = { 8.326506625798146465E-07,
+ 1.302638552580516100E-13,
+ 7.259224351945759794E-15,
+ 1.249770395036711102E-14,
+ 7.832180081562836579E-16,
+ 1.018998440559284116E-15,
+ 4.315121611695628020E-16,
+ 1.379237060008662177E-16,
+ 4.062855738364339357E-17 } ;
+ int order[9] = { 1, 2, 4, 3, 6, 5, 7, 8, 9 } ;
+
+ double alpha = 1.0 ;
+ gsl_function f = make_function(&f456, &alpha);
+ gsl_function fc = make_counter(&f, &p) ;
+
+ status = gsl_integration_qawo (&fc, 0.0, 0.0, 1e-7, w->limit,
+ w, wo, &result, &abserr) ;
+
+ gsl_test_rel(result,exp_result,1e-14,"qawo(f456) result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-3,"qawo(f456) abserr") ;
+ gsl_test_int((int)(p.neval),exp_neval,"qawo(f456) neval") ;
+ gsl_test_int((int)(w->size),exp_last,"qawo(f456) last") ;
+ gsl_test_int(status,exp_ier,"qawo(f456) status") ;
+
+ for (i = 0; i < 9 ; i++)
+ gsl_test_rel(w->alist[i],a[i],1e-15,"qawo(f456) alist") ;
+
+ for (i = 0; i < 9 ; i++)
+ gsl_test_rel(w->blist[i],b[i],1e-15,"qawo(f456) blist") ;
+
+ for (i = 0; i < 9 ; i++)
+ gsl_test_rel(w->rlist[i],r[i],1e-14,"qawo(f456) rlist") ;
+
+ for (i = 0; i < 9 ; i++)
+ gsl_test_rel(w->elist[i],e[i],1e-3,"qawo(f456) elist") ;
+
+ for (i = 0; i < 9 ; i++)
+ gsl_test_int((int)w->order[i],order[i]-1,"qawo(f456) order");
+
+
+ /* In reverse, flip limit and sign of length */
+
+ gsl_integration_qawo_table_set_length (wo, -1.0);
+
+ p.neval = 0;
+ status = gsl_integration_qawo (&fc, 1.0, 0.0, 1e-7, w->limit,
+ w, wo, &result, &abserr) ;
+
+ gsl_test_rel(result,-exp_result,1e-14,"qawo(f456) rev result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-3,"qawo(f456) rev abserr") ;
+ gsl_test_int((int)(p.neval),exp_neval,"qawo(f456) rev neval") ;
+ gsl_test_int((int)(w->size),exp_last,"qawo(f456) rev last") ;
+ gsl_test_int(status,exp_ier,"qawo(f456) rev status") ;
+
+
+ gsl_integration_qawo_table_free (wo) ;
+ gsl_integration_workspace_free (w) ;
+
+ }
+
+ /* Test fourier integration using an absolute error bound */
+
+ {
+ int status = 0, i; struct counter_params p;
+ double result = 0, abserr=0;
+
+ gsl_integration_workspace * w = gsl_integration_workspace_alloc (1000) ;
+ gsl_integration_workspace * wc = gsl_integration_workspace_alloc (1000) ;
+ gsl_integration_qawo_table * wo
+ = gsl_integration_qawo_table_alloc (M_PI / 2.0, 1.0,
+ GSL_INTEG_COSINE, 1000) ;
+
+ /* All results are for GSL_IEEE_MODE=double-precision */
+
+ double exp_result = 9.999999999279802765E-01;
+ double exp_abserr = 1.556289974669056164E-08;
+ int exp_neval = 590;
+ int exp_ier = 0;
+ int exp_last = 12;
+
+ double r[12] = { 1.013283128125232802E+00,
+ -1.810857954748607349E-02,
+ 7.466754034900931897E-03,
+ -4.360312526786496237E-03,
+ 2.950184068216192904E-03,
+ -2.168238443073697373E-03,
+ 1.680910783140869081E-03,
+ -1.352797860944863345E-03,
+ 1.119354921991485901E-03,
+ -9.462367583691360827E-04,
+ 8.136341270731781887E-04,
+ -7.093931338504278145E-04 } ;
+ double e[12] = { 1.224798040766472695E-12,
+ 1.396565155187268456E-13,
+ 1.053844511655910310E-16,
+ 6.505213034913026604E-19,
+ 7.155734338404329264E-18,
+ 1.105886215935214523E-17,
+ 9.757819552369539906E-18,
+ 5.854691731421723944E-18,
+ 4.553649124439220312E-18,
+ 7.643625316022806260E-18,
+ 2.439454888092388058E-17,
+ 2.130457268934021451E-17 } ;
+
+ double alpha = 1.0 ;
+ gsl_function f = make_function(&f457, &alpha);
+ gsl_function fc = make_counter(&f, &p) ;
+
+ status = gsl_integration_qawf (&fc, 0.0, 1e-7, w->limit,
+ w, wc, wo, &result, &abserr) ;
+
+ gsl_test_rel(result,exp_result,1e-14,"qawf(f457) result") ;
+ gsl_test_rel(abserr,exp_abserr,1e-3,"qawf(f457) abserr") ;
+ gsl_test_int((int)(p.neval),exp_neval,"qawf(f457) neval") ;
+ gsl_test_int((int)(w->size),exp_last,"qawf(f457) last") ;
+ gsl_test_int(status,exp_ier,"qawf(f457) status") ;
+
+ for (i = 0; i < 9 ; i++)
+ gsl_test_rel(w->rlist[i],r[i],1e-12,"qawf(f457) rlist") ;
+
+ /* We can only get within two orders of magnitude on the error
+ here, which is very sensitive to the floating point precision */
+
+ for (i = 0; i < 9 ; i++)
+ gsl_test_rel(w->elist[i],e[i],50.0,"qawf(f457) elist") ;
+
+
+ gsl_integration_qawo_table_free (wo) ;
+ gsl_integration_workspace_free (wc) ;
+ gsl_integration_workspace_free (w) ;
+
+ }
+
+ exit (gsl_test_summary());
+}
+
+void
+my_error_handler (const char *reason, const char *file, int line, int err)
+{
+ if (0) printf ("(caught [%s:%d: %s (%d)])\n", file, line, reason, err) ;
+}
+
+
diff --git a/gsl-1.9/integration/tests.c b/gsl-1.9/integration/tests.c
new file mode 100644
index 0000000..d6bf5d4
--- /dev/null
+++ b/gsl-1.9/integration/tests.c
@@ -0,0 +1,220 @@
+/* integration/tests.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+
+#include "tests.h"
+
+/* These are the test functions from table 4.1 of the QUADPACK book */
+
+/* f1(x) = x^alpha * log(1/x) */
+/* integ(f1,x,0,1) = 1/(alpha + 1)^2 */
+
+double f1 (double x, void * params) {
+ double alpha = *(double *) params ;
+ return pow(x,alpha) * log(1/x) ;
+}
+
+/* f2(x) = 4^-alpha / ((x-pi/4)^2 + 16^-alpha) */
+/* integ(f2,x,0,1) = arctan((4-pi)4^(alpha-1)) + arctan(pi 4^(alpha-1)) */
+
+double f2 (double x, void * params) {
+ double alpha = *(double *) params ;
+ return pow(4.0,-alpha) / (pow((x-M_PI/4.0),2.0) + pow(16.0,-alpha)) ;
+}
+
+/* f3(x) = cos(2^alpha * sin(x)) */
+/* integ(f3,x,0,pi) = pi J_0(2^alpha) */
+
+double f3 (double x, void * params) {
+ double alpha = *(double *) params ;
+ return cos(pow(2.0,alpha) * sin(x)) ;
+}
+
+/* Functions 4, 5 and 6 are duplicates of functions 1, 2 and 3 */
+/* .... */
+
+/* f7(x) = |x - 1/3|^alpha */
+/* integ(f7,x,0,1) = ((2/3)^(alpha+1) + (1/3)^(alpha+1))/(alpha + 1) */
+
+double f7 (double x, void * params) {
+ double alpha = *(double *) params ;
+ return pow(fabs(x - (1.0/3.0)),alpha) ;
+}
+
+/* f8(x) = |x - pi/4|^alpha */
+/* integ(f8,x,0,1) =
+ ((1 - pi/4)^(alpha+1) + (pi/4)^(alpha+1))/(alpha + 1) */
+
+double f8 (double x, void * params) {
+ double alpha = *(double *) params ;
+ return pow(fabs(x - (M_PI/4.0)),alpha) ;
+}
+
+/* f9(x) = sqrt(1 - x^2) / (x + 1 + 2^-alpha) */
+/* integ(f9,x,-1,1) = pi/sqrt((1+2^-alpha)^2-1) */
+
+double f9 (double x, void * params) {
+ double alpha = *(double *) params ;
+ return 1 / ((x + 1 + pow(2.0,-alpha)) * sqrt(1-x*x)) ;
+}
+
+/* f10(x) = sin(x)^(alpha - 1) */
+/* integ(f10,x,0,pi/2) = 2^(alpha-2) ((Gamma(alpha/2))^2)/Gamma(alpha) */
+
+double f10 (double x, void * params) {
+ double alpha = *(double *) params ;
+ return pow(sin(x), alpha-1) ;
+}
+
+/* f11(x) = log(1/x)^(alpha - 1) */
+/* integ(f11,x,0,1) = Gamma(alpha) */
+
+double f11 (double x, void * params) {
+ double alpha = *(double *) params ;
+ return pow(log(1/x), alpha-1) ;
+}
+
+/* f12(x) = exp(20*(x-1)) * sin(2^alpha * x) */
+/* integ(f12,x,0,1) =
+ (20 sin(2^alpha) - 2^alpha cos(2^alpha) + 2^alpha exp(-20))
+ /(400 + 4^alpha) */
+
+double f12 (double x, void * params) {
+ double alpha = *(double *) params ;
+ return exp(20*(x-1)) * sin(pow(2.0,alpha) * x) ;
+}
+
+/* f13(x) = cos(2^alpha * x)/sqrt(x(1 - x)) */
+/* integ(f13,x,0,1) = pi cos(2^(alpha-1)) J_0(2^(alpha-1)) */
+
+double f13 (double x, void * params) {
+ double alpha = *(double *) params ;
+ return cos(pow(2.0,alpha)*x)/sqrt(x*(1-x)) ;
+}
+
+double f14 (double x, void * params) {
+ double alpha = *(double *) params ;
+ return exp(-pow(2.0,-alpha)*x)*cos(x)/sqrt(x) ;
+}
+
+double f15 (double x, void * params) {
+ double alpha = *(double *) params ;
+ return x*x * exp(-pow(2.0,-alpha)*x) ;
+}
+
+double f16 (double x, void * params) {
+ double alpha = *(double *) params ;
+ if (x==0 && alpha == 1) return 1 ; /* make the function continuous in x */
+ if (x==0 && alpha > 1) return 0 ; /* avoid problems with pow(0,1) */
+ return pow(x,alpha-1)/pow((1+10*x),2.0) ;
+}
+
+double f17 (double x, void * params) {
+ double alpha = *(double *) params ;
+ return pow(2.0,-alpha)/(((x-1)*(x-1)+pow(4.0,-alpha))*(x-2)) ;
+}
+
+/* f454(x) = x^3 log|(x^2-1)(x^2-2)| */
+/* integ(f454,x,0,inf) = 61 log(2) + (77/4) log(7) - 27 */
+
+double f454 (double x, void * params) {
+ double x2 = x * x;
+ double x3 = x * x2;
+ params = 0 ;
+ return x3 * log(fabs((x2 - 1.0) * (x2 - 2.0))) ;
+}
+
+/* f455(x) = log(x)/(1+100*x^2) */
+/* integ(f455,x,0,inf) = -log(10)/20 */
+
+double f455 (double x, void * params) {
+ params = 0 ;
+ return log(x) / (1.0 + 100.0 * x * x) ;
+}
+
+/* f456(x) = log(x) */
+/* integ(f456*sin(10 pi x),x,0,1) = -(gamma + log(10pi) - Ci(10pi))/(10pi) */
+
+double f456 (double x, void * params) {
+ params = 0 ;
+ if (x == 0.0)
+ {
+ return 0;
+ }
+ return log(x) ;
+}
+
+/* f457(x) = 1/sqrt(x) */
+/* integ(f457*cos(pi x / 2),x,0,+inf) = 1 */
+
+double f457 (double x, void * params) {
+ params = 0 ;
+ if (x == 0.0)
+ {
+ return 0;
+ }
+ return 1/sqrt(x) ;
+}
+
+/* f458(x) = 1/(1 + log(x)^2)^2 */
+/* integ(log(x) f458(x),x,0,1) = (Ci(1) sin(1) + (pi/2 - Si(1)) cos(1))/pi
+ = -0.1892752 */
+
+double f458 (double x, void * params) {
+ params = 0 ;
+
+ if (x == 0.0)
+ {
+ return 0;
+ }
+ else
+ {
+ double u = log(x);
+ double v = 1 + u * u;
+
+ return 1.0 / (v * v) ;
+ }
+}
+
+/* f459(x) = 1/(5 x^3 + 6) */
+/* integ(f459/(x-0),x,-1,5) = log(125/631)/18 */
+
+double f459 (double x, void * params) {
+ params = 0 ;
+ return 1.0 / (5.0 * x * x * x + 6.0) ;
+}
+
+/* myfn1(x) = exp(-x - x^2) */
+/* integ(myfn1,x,-inf,inf) = sqrt(pi) exp(-1/4) */
+
+double myfn1 (double x, void * params) {
+ params = 0;
+ return exp(-x - x*x) ;
+}
+
+/* myfn2(x) = exp(alpha*x) */
+/* integ(myfn2,x,-inf,b) = exp(alpha*b)/alpha */
+
+double myfn2 (double x, void * params) {
+ double alpha = *(double *) params ;
+ return exp(alpha*x) ;
+}
diff --git a/gsl-1.9/integration/tests.h b/gsl-1.9/integration/tests.h
new file mode 100644
index 0000000..260a905
--- /dev/null
+++ b/gsl-1.9/integration/tests.h
@@ -0,0 +1,49 @@
+/* integration/tests.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+double f1 (double x, void * params);
+double f2 (double x, void * params);
+double f3 (double x, void * params);
+double f4 (double x, void * params);
+double f5 (double x, void * params);
+
+double f6 (double x, void * params);
+double f7 (double x, void * params);
+double f8 (double x, void * params);
+double f9 (double x, void * params);
+double f10 (double x, void * params);
+
+double f11 (double x, void * params);
+double f12 (double x, void * params);
+double f13 (double x, void * params);
+double f14 (double x, void * params);
+double f15 (double x, void * params);
+
+double f16 (double x, void * params);
+double f17 (double x, void * params);
+
+double f454 (double x, void * params);
+double f455 (double x, void * params);
+double f456 (double x, void * params);
+double f457 (double x, void * params);
+double f458 (double x, void * params);
+double f459 (double x, void * params);
+
+double myfn1 (double x, void * params);
+double myfn2 (double x, void * params);
diff --git a/gsl-1.9/integration/util.c b/gsl-1.9/integration/util.c
new file mode 100644
index 0000000..8be4f64
--- /dev/null
+++ b/gsl-1.9/integration/util.c
@@ -0,0 +1,137 @@
+/* integration/util.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+static inline
+void update (gsl_integration_workspace * workspace,
+ double a1, double b1, double area1, double error1,
+ double a2, double b2, double area2, double error2);
+
+static inline void
+retrieve (const gsl_integration_workspace * workspace,
+ double * a, double * b, double * r, double * e);
+
+
+
+static inline
+void update (gsl_integration_workspace * workspace,
+ double a1, double b1, double area1, double error1,
+ double a2, double b2, double area2, double error2)
+{
+ double * alist = workspace->alist ;
+ double * blist = workspace->blist ;
+ double * rlist = workspace->rlist ;
+ double * elist = workspace->elist ;
+ size_t * level = workspace->level ;
+
+ const size_t i_max = workspace->i ;
+ const size_t i_new = workspace->size ;
+
+ const size_t new_level = workspace->level[i_max] + 1;
+
+ /* append the newly-created intervals to the list */
+
+ if (error2 > error1)
+ {
+ alist[i_max] = a2; /* blist[maxerr] is already == b2 */
+ rlist[i_max] = area2;
+ elist[i_max] = error2;
+ level[i_max] = new_level;
+
+ alist[i_new] = a1;
+ blist[i_new] = b1;
+ rlist[i_new] = area1;
+ elist[i_new] = error1;
+ level[i_new] = new_level;
+ }
+ else
+ {
+ blist[i_max] = b1; /* alist[maxerr] is already == a1 */
+ rlist[i_max] = area1;
+ elist[i_max] = error1;
+ level[i_max] = new_level;
+
+ alist[i_new] = a2;
+ blist[i_new] = b2;
+ rlist[i_new] = area2;
+ elist[i_new] = error2;
+ level[i_new] = new_level;
+ }
+
+ workspace->size++;
+
+ if (new_level > workspace->maximum_level)
+ {
+ workspace->maximum_level = new_level;
+ }
+
+ qpsrt (workspace) ;
+}
+
+static inline void
+retrieve (const gsl_integration_workspace * workspace,
+ double * a, double * b, double * r, double * e)
+{
+ const size_t i = workspace->i;
+ double * alist = workspace->alist;
+ double * blist = workspace->blist;
+ double * rlist = workspace->rlist;
+ double * elist = workspace->elist;
+
+ *a = alist[i] ;
+ *b = blist[i] ;
+ *r = rlist[i] ;
+ *e = elist[i] ;
+}
+
+static inline double
+sum_results (const gsl_integration_workspace * workspace);
+
+static inline double
+sum_results (const gsl_integration_workspace * workspace)
+{
+ const double * const rlist = workspace->rlist ;
+ const size_t n = workspace->size;
+
+ size_t k;
+ double result_sum = 0;
+
+ for (k = 0; k < n; k++)
+ {
+ result_sum += rlist[k];
+ }
+
+ return result_sum;
+}
+
+static inline int
+subinterval_too_small (double a1, double a2, double b2);
+
+static inline int
+subinterval_too_small (double a1, double a2, double b2)
+{
+ const double e = GSL_DBL_EPSILON;
+ const double u = GSL_DBL_MIN;
+
+ double tmp = (1 + 100 * e) * (fabs (a2) + 1000 * u);
+
+ int status = fabs (a1) <= tmp && fabs (b2) <= tmp;
+
+ return status;
+}
+
diff --git a/gsl-1.9/integration/workspace.c b/gsl-1.9/integration/workspace.c
new file mode 100644
index 0000000..bf62ac4
--- /dev/null
+++ b/gsl-1.9/integration/workspace.c
@@ -0,0 +1,153 @@
+/* integration/workspace.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_integration.h>
+#include <gsl/gsl_errno.h>
+
+gsl_integration_workspace *
+gsl_integration_workspace_alloc (const size_t n)
+{
+ gsl_integration_workspace * w ;
+
+ if (n == 0)
+ {
+ GSL_ERROR_VAL ("workspace length n must be positive integer",
+ GSL_EDOM, 0);
+ }
+
+ w = (gsl_integration_workspace *)
+ malloc (sizeof (gsl_integration_workspace));
+
+ if (w == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for workspace struct",
+ GSL_ENOMEM, 0);
+ }
+
+ w->alist = (double *) malloc (n * sizeof (double));
+
+ if (w->alist == 0)
+ {
+ free (w); /* exception in constructor, avoid memory leak */
+
+ GSL_ERROR_VAL ("failed to allocate space for alist ranges",
+ GSL_ENOMEM, 0);
+ }
+
+ w->blist = (double *) malloc (n * sizeof (double));
+
+ if (w->blist == 0)
+ {
+ free (w->alist);
+ free (w); /* exception in constructor, avoid memory leak */
+
+ GSL_ERROR_VAL ("failed to allocate space for blist ranges",
+ GSL_ENOMEM, 0);
+ }
+
+ w->rlist = (double *) malloc (n * sizeof (double));
+
+ if (w->rlist == 0)
+ {
+ free (w->blist);
+ free (w->alist);
+ free (w); /* exception in constructor, avoid memory leak */
+
+ GSL_ERROR_VAL ("failed to allocate space for rlist ranges",
+ GSL_ENOMEM, 0);
+ }
+
+
+ w->elist = (double *) malloc (n * sizeof (double));
+
+ if (w->elist == 0)
+ {
+ free (w->rlist);
+ free (w->blist);
+ free (w->alist);
+ free (w); /* exception in constructor, avoid memory leak */
+
+ GSL_ERROR_VAL ("failed to allocate space for elist ranges",
+ GSL_ENOMEM, 0);
+ }
+
+ w->order = (size_t *) malloc (n * sizeof (size_t));
+
+ if (w->order == 0)
+ {
+ free (w->elist);
+ free (w->rlist);
+ free (w->blist);
+ free (w->alist);
+ free (w); /* exception in constructor, avoid memory leak */
+
+ GSL_ERROR_VAL ("failed to allocate space for order ranges",
+ GSL_ENOMEM, 0);
+ }
+
+ w->level = (size_t *) malloc (n * sizeof (size_t));
+
+ if (w->level == 0)
+ {
+ free (w->order);
+ free (w->elist);
+ free (w->rlist);
+ free (w->blist);
+ free (w->alist);
+ free (w); /* exception in constructor, avoid memory leak */
+
+ GSL_ERROR_VAL ("failed to allocate space for order ranges",
+ GSL_ENOMEM, 0);
+ }
+
+ w->size = 0 ;
+ w->limit = n ;
+ w->maximum_level = 0 ;
+
+ return w ;
+}
+
+void
+gsl_integration_workspace_free (gsl_integration_workspace * w)
+{
+ free (w->level) ;
+ free (w->order) ;
+ free (w->elist) ;
+ free (w->rlist) ;
+ free (w->blist) ;
+ free (w->alist) ;
+ free (w) ;
+}
+
+/*
+size_t
+gsl_integration_workspace_limit (gsl_integration_workspace * w)
+{
+ return w->limit ;
+}
+
+
+size_t
+gsl_integration_workspace_size (gsl_integration_workspace * w)
+{
+ return w->size ;
+}
+*/
diff --git a/gsl-1.9/interpolation/ChangeLog b/gsl-1.9/interpolation/ChangeLog
new file mode 100644
index 0000000..ce3a5dd
--- /dev/null
+++ b/gsl-1.9/interpolation/ChangeLog
@@ -0,0 +1,98 @@
+2005-12-24 Brian Gough <bjg@network-theory.co.uk>
+
+ * cspline.c (cspline_init_periodic): fix invalid memory access of
+ xa[3] for sys_size=2
+
+2005-12-22 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c (test_cspline2): added extra test of cspline
+ (test_cspline3): added extra test of cspline
+
+2004-11-28 Brian Gough <bjg@network-theory.co.uk>
+
+ * cspline.c (cspline_init): support case of degenerate x[i] values
+ (cspline_init_periodic): support case of degenerate x[i] values
+
+ * integ_eval.h (integ_eval): improve numerical stability of
+ integration formula
+
+2004-03-15 Brian Gough <bjg@network-theory.co.uk>
+
+ * cspline.c (cspline_init): handle the case N=1 specially
+
+2003-07-24 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_interp.h: removed duplicate declaration of
+ gsl_interp_accel_find
+
+Sat Apr 27 20:57:22 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * cspline.c (cspline_init_periodic): handle boundary effects
+ correctly
+
+Sun Dec 2 22:48:23 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * poly.c: added polynomial interpolation based on divided
+ differences from Dan, Ho-Jin.
+
+Tue Jul 3 12:10:53 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * interp.c (DISCARD_STATUS): discard error status values using a
+ macro for configurability
+
+Sun Jul 1 21:41:27 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * cspline.c: added const to state in appropriate places
+
+Tue Jun 26 11:57:55 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * spline.c: added missing #include <string.h> for memcpy
+
+Mon Jun 25 19:58:45 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * standardized to gsl conventions, added high-level 'spline'
+ interface
+
+Mon Apr 30 13:29:34 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * renamed gsl_interp_obj to gsl_interp
+
+Mon Apr 23 10:29:51 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * unified error handling conventions to _e for error handling
+ functions and no suffix for plain functions, so _impl functions
+ are no longer needed.
+
+ * removed tests for EFAULT, since EFAULT should only apply to
+ invalid non-null pointers.
+
+
+Tue Apr 11 19:56:25 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * cspline.c (cspline_calc_periodic): changed occurrence of gsl_la
+ name to new gsl_linalg prefix, gsl_linalg_solve_symm_cyc_tridiag
+ (cspline_calc_natural): ditto
+
+Mon Aug 30 11:31:00 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * bsearch.c: made gsl_interp_bsearch (formerly interp_bsearch) an
+ exported function, since it is needed by the inline version of
+ gsl_interp_accel_find in gsl_interp.h
+
+Tue Nov 17 16:52:00 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * added #include <config.h> to all top-level source files
+
+ * renamed test_interp.c to test.c
+
+ * test_interp.c: got rid of unused function alloc_xy_table
+
+Fri Nov 13 16:50:05 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * clean up for make strict, use size_t instead of unsigned int
+
+1998-11-06 <bjg@ancho.lanl.gov>
+
+ * added const to several declarations where needed.
+
+
diff --git a/gsl-1.9/interpolation/Makefile.am b/gsl-1.9/interpolation/Makefile.am
new file mode 100644
index 0000000..8889430
--- /dev/null
+++ b/gsl-1.9/interpolation/Makefile.am
@@ -0,0 +1,18 @@
+noinst_LTLIBRARIES = libgslinterpolation.la
+
+check_PROGRAMS = test
+
+pkginclude_HEADERS = gsl_interp.h gsl_spline.h
+
+libgslinterpolation_la_SOURCES = accel.c akima.c bsearch.c cspline.c interp.c linear.c integ_eval.h spline.c poly.c
+
+noinst_HEADERS = bsearch.h
+
+INCLUDES= -I$(top_builddir)
+
+TESTS = $(check_PROGRAMS)
+
+test_LDADD = libgslinterpolation.la ../poly/libgslpoly.la ../linalg/libgsllinalg.la ../permutation/libgslpermutation.la ../blas/libgslblas.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la ../complex/libgslcomplex.la ../cblas/libgslcblas.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+
+test_SOURCES = test.c
+
diff --git a/gsl-1.9/interpolation/Makefile.in b/gsl-1.9/interpolation/Makefile.in
new file mode 100644
index 0000000..b580609
--- /dev/null
+++ b/gsl-1.9/interpolation/Makefile.in
@@ -0,0 +1,549 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = test$(EXEEXT)
+subdir = interpolation
+DIST_COMMON = $(noinst_HEADERS) $(pkginclude_HEADERS) \
+ $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog TODO
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgslinterpolation_la_LIBADD =
+am_libgslinterpolation_la_OBJECTS = accel.lo akima.lo bsearch.lo \
+ cspline.lo interp.lo linear.lo spline.lo poly.lo
+libgslinterpolation_la_OBJECTS = $(am_libgslinterpolation_la_OBJECTS)
+am_test_OBJECTS = test.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = libgslinterpolation.la ../poly/libgslpoly.la \
+ ../linalg/libgsllinalg.la ../permutation/libgslpermutation.la \
+ ../blas/libgslblas.la ../matrix/libgslmatrix.la \
+ ../vector/libgslvector.la ../block/libgslblock.la \
+ ../complex/libgslcomplex.la ../cblas/libgslcblas.la \
+ ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la \
+ ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgslinterpolation_la_SOURCES) $(test_SOURCES)
+DIST_SOURCES = $(libgslinterpolation_la_SOURCES) $(test_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libgslinterpolation.la
+pkginclude_HEADERS = gsl_interp.h gsl_spline.h
+libgslinterpolation_la_SOURCES = accel.c akima.c bsearch.c cspline.c interp.c linear.c integ_eval.h spline.c poly.c
+noinst_HEADERS = bsearch.h
+INCLUDES = -I$(top_builddir)
+TESTS = $(check_PROGRAMS)
+test_LDADD = libgslinterpolation.la ../poly/libgslpoly.la ../linalg/libgsllinalg.la ../permutation/libgslpermutation.la ../blas/libgslblas.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la ../complex/libgslcomplex.la ../cblas/libgslcblas.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+test_SOURCES = test.c
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps interpolation/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps interpolation/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgslinterpolation.la: $(libgslinterpolation_la_OBJECTS) $(libgslinterpolation_la_DEPENDENCIES)
+ $(LINK) $(libgslinterpolation_la_LDFLAGS) $(libgslinterpolation_la_OBJECTS) $(libgslinterpolation_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkgincludeHEADERS
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/interpolation/TODO b/gsl-1.9/interpolation/TODO
new file mode 100644
index 0000000..3bf369f
--- /dev/null
+++ b/gsl-1.9/interpolation/TODO
@@ -0,0 +1,10 @@
+1. need to add a test for the akima splines
+
+2. [DOCUMENTATION] From: Conrad Curry <cwcurry@orca.st.usm.edu>
+
+ I would suggest adding more about cspline and Akima similiar to what
+ is given for 'polynomial', particularly under what conditions one
+ would be prefered over the other.
+
+3. add akima splines without the Wodicka modification, so that the spline
+is a smooth curve without corners.
diff --git a/gsl-1.9/interpolation/accel.c b/gsl-1.9/interpolation/accel.c
new file mode 100644
index 0000000..72d9345
--- /dev/null
+++ b/gsl-1.9/interpolation/accel.c
@@ -0,0 +1,82 @@
+/* interpolation/accel.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman
+ */
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_interp.h>
+
+gsl_interp_accel *
+gsl_interp_accel_alloc (void)
+{
+ gsl_interp_accel *a = (gsl_interp_accel *) malloc (sizeof (gsl_interp_accel));
+ if (a == 0)
+ {
+ GSL_ERROR_NULL("could not allocate space for gsl_interp_accel", GSL_ENOMEM);
+ }
+
+ a->cache = 0;
+ a->hit_count = 0;
+ a->miss_count = 0;
+
+ return a;
+}
+
+int
+gsl_interp_accel_reset (gsl_interp_accel * a)
+{
+ a->cache = 0;
+ a->hit_count = 0;
+ a->miss_count = 0;
+
+ return GSL_SUCCESS;
+}
+
+#ifndef HIDE_INLINE_STATIC
+size_t
+gsl_interp_accel_find (gsl_interp_accel * a, const double xa[], size_t len, double x)
+{
+ size_t x_index = a->cache;
+
+ if (x < xa[x_index])
+ {
+ a->miss_count++;
+ a->cache = gsl_interp_bsearch (xa, x, 0, x_index);
+ }
+ else if (x > xa[x_index + 1])
+ {
+ a->miss_count++;
+ a->cache = gsl_interp_bsearch (xa, x, x_index, len - 1);
+ }
+ else
+ {
+ a->hit_count++;
+ }
+
+ return a->cache;
+}
+#endif
+
+void
+gsl_interp_accel_free (gsl_interp_accel * a)
+{
+ free (a);
+}
diff --git a/gsl-1.9/interpolation/akima.c b/gsl-1.9/interpolation/akima.c
new file mode 100644
index 0000000..452432f
--- /dev/null
+++ b/gsl-1.9/interpolation/akima.c
@@ -0,0 +1,389 @@
+/* interpolation/akima.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman
+ */
+#include <config.h>
+#include <stdlib.h>
+#include <math.h>
+#include <gsl/gsl_errno.h>
+#include "integ_eval.h"
+#include <gsl/gsl_interp.h>
+
+typedef struct
+{
+ double * b;
+ double * c;
+ double * d;
+ double * _m;
+} akima_state_t;
+
+
+/* common creation */
+static void *
+akima_alloc (size_t size)
+{
+ akima_state_t *state = (akima_state_t *) malloc (sizeof (akima_state_t));
+
+ if (state == NULL)
+ {
+ GSL_ERROR_NULL("failed to allocate space for state", GSL_ENOMEM);
+ }
+
+ state->b = (double *) malloc (size * sizeof (double));
+
+ if (state->b == NULL)
+ {
+ free (state);
+ GSL_ERROR_NULL("failed to allocate space for b", GSL_ENOMEM);
+ }
+
+ state->c = (double *) malloc (size * sizeof (double));
+
+ if (state->c == NULL)
+ {
+ free (state->b);
+ free (state);
+ GSL_ERROR_NULL("failed to allocate space for c", GSL_ENOMEM);
+ }
+
+ state->d = (double *) malloc (size * sizeof (double));
+
+ if (state->d == NULL)
+ {
+ free (state->c);
+ free (state->b);
+ free (state);
+ GSL_ERROR_NULL("failed to allocate space for d", GSL_ENOMEM);
+ }
+
+ state->_m = (double *) malloc ((size + 4) * sizeof (double));
+
+ if (state->_m == NULL)
+ {
+ free (state->d);
+ free (state->c);
+ free (state->b);
+ free (state);
+ GSL_ERROR_NULL("failed to allocate space for _m", GSL_ENOMEM);
+ }
+
+ return state;
+}
+
+
+/* common calculation */
+static void
+akima_calc (const double x_array[], double b[], double c[], double d[], size_t size, double m[])
+{
+ size_t i;
+
+ for (i = 0; i < (size - 1); i++)
+ {
+ const double NE = fabs (m[i + 1] - m[i]) + fabs (m[i - 1] - m[i - 2]);
+ if (NE == 0.0)
+ {
+ b[i] = m[i];
+ c[i] = 0.0;
+ d[i] = 0.0;
+ }
+ else
+ {
+ const double h_i = x_array[i + 1] - x_array[i];
+ const double NE_next = fabs (m[i + 2] - m[i + 1]) + fabs (m[i] - m[i - 1]);
+ const double alpha_i = fabs (m[i - 1] - m[i - 2]) / NE;
+ double alpha_ip1;
+ double tL_ip1;
+ if (NE_next == 0.0)
+ {
+ tL_ip1 = m[i];
+ }
+ else
+ {
+ alpha_ip1 = fabs (m[i] - m[i - 1]) / NE_next;
+ tL_ip1 = (1.0 - alpha_ip1) * m[i] + alpha_ip1 * m[i + 1];
+ }
+ b[i] = (1.0 - alpha_i) * m[i - 1] + alpha_i * m[i];
+ c[i] = (3.0 * m[i] - 2.0 * b[i] - tL_ip1) / h_i;
+ d[i] = (b[i] + tL_ip1 - 2.0 * m[i]) / (h_i * h_i);
+ }
+ }
+}
+
+
+static int
+akima_init (void * vstate, const double x_array[], const double y_array[],
+ size_t size)
+{
+ akima_state_t *state = (akima_state_t *) vstate;
+
+ double * m = state->_m + 2; /* offset so we can address the -1,-2
+ components */
+
+ size_t i;
+ for (i = 0; i <= size - 2; i++)
+ {
+ m[i] = (y_array[i + 1] - y_array[i]) / (x_array[i + 1] - x_array[i]);
+ }
+
+ /* non-periodic boundary conditions */
+ m[-2] = 3.0 * m[0] - 2.0 * m[1];
+ m[-1] = 2.0 * m[0] - m[1];
+ m[size - 1] = 2.0 * m[size - 2] - m[size - 3];
+ m[size] = 3.0 * m[size - 2] - 2.0 * m[size - 3];
+
+ akima_calc (x_array, state->b, state->c, state->d, size, m);
+
+ return GSL_SUCCESS;
+}
+
+
+static int
+akima_init_periodic (void * vstate,
+ const double x_array[],
+ const double y_array[],
+ size_t size)
+{
+ akima_state_t *state = (akima_state_t *) vstate;
+
+ double * m = state->_m + 2; /* offset so we can address the -1,-2
+ components */
+
+ size_t i;
+ for (i = 0; i <= size - 2; i++)
+ {
+ m[i] = (y_array[i + 1] - y_array[i]) / (x_array[i + 1] - x_array[i]);
+ }
+
+ /* periodic boundary conditions */
+ m[-2] = m[size - 1 - 2];
+ m[-1] = m[size - 1 - 1];
+ m[size - 1] = m[0];
+ m[size] = m[1];
+
+ akima_calc (x_array, state->b, state->c, state->d, size, m);
+
+ return GSL_SUCCESS;
+}
+
+static void
+akima_free (void * vstate)
+{
+ akima_state_t *state = (akima_state_t *) vstate;
+
+ free (state->b);
+ free (state->c);
+ free (state->d);
+ free (state->_m);
+ free (state);
+}
+
+
+static
+int
+akima_eval (const void * vstate,
+ const double x_array[], const double y_array[], size_t size,
+ double x,
+ gsl_interp_accel * a,
+ double *y)
+{
+ const akima_state_t *state = (const akima_state_t *) vstate;
+
+ size_t index;
+
+ if (a != 0)
+ {
+ index = gsl_interp_accel_find (a, x_array, size, x);
+ }
+ else
+ {
+ index = gsl_interp_bsearch (x_array, x, 0, size - 1);
+ }
+
+ /* evaluate */
+ {
+ const double x_lo = x_array[index];
+ const double delx = x - x_lo;
+ const double b = state->b[index];
+ const double c = state->c[index];
+ const double d = state->d[index];
+ *y = y_array[index] + delx * (b + delx * (c + d * delx));
+ return GSL_SUCCESS;
+ }
+}
+
+
+static int
+akima_eval_deriv (const void * vstate,
+ const double x_array[], const double y_array[], size_t size,
+ double x,
+ gsl_interp_accel * a,
+ double *dydx)
+{
+ const akima_state_t *state = (const akima_state_t *) vstate;
+
+ size_t index;
+
+ DISCARD_POINTER(y_array); /* prevent warning about unused parameter */
+
+ if (a != 0)
+ {
+ index = gsl_interp_accel_find (a, x_array, size, x);
+ }
+ else
+ {
+ index = gsl_interp_bsearch (x_array, x, 0, size - 1);
+ }
+
+ /* evaluate */
+ {
+ double x_lo = x_array[index];
+ double delx = x - x_lo;
+ double b = state->b[index];
+ double c = state->c[index];
+ double d = state->d[index];
+ *dydx = b + delx * (2.0 * c + 3.0 * d * delx);
+ return GSL_SUCCESS;
+ }
+}
+
+
+static
+int
+akima_eval_deriv2 (const void * vstate,
+ const double x_array[], const double y_array[], size_t size,
+ double x,
+ gsl_interp_accel * a,
+ double *y_pp)
+{
+ const akima_state_t *state = (const akima_state_t *) vstate;
+
+ size_t index;
+
+ DISCARD_POINTER(y_array); /* prevent warning about unused parameter */
+
+ if (a != 0)
+ {
+ index = gsl_interp_accel_find (a, x_array, size, x);
+ }
+ else
+ {
+ index = gsl_interp_bsearch (x_array, x, 0, size - 1);
+ }
+
+ /* evaluate */
+ {
+ const double x_lo = x_array[index];
+ const double delx = x - x_lo;
+ const double c = state->c[index];
+ const double d = state->d[index];
+ *y_pp = 2.0 * c + 6.0 * d * delx;
+ return GSL_SUCCESS;
+ }
+}
+
+
+static
+int
+akima_eval_integ (const void * vstate,
+ const double x_array[], const double y_array[], size_t size,
+ gsl_interp_accel * acc,
+ double a, double b,
+ double * result)
+{
+ const akima_state_t *state = (const akima_state_t *) vstate;
+
+ size_t i, index_a, index_b;
+
+ if (acc != 0)
+ {
+ index_a = gsl_interp_accel_find (acc, x_array, size, a);
+ index_b = gsl_interp_accel_find (acc, x_array, size, b);
+ }
+ else
+ {
+ index_a = gsl_interp_bsearch (x_array, a, 0, size - 1);
+ index_b = gsl_interp_bsearch (x_array, b, 0, size - 1);
+ }
+
+ *result = 0.0;
+
+ /* interior intervals */
+
+ for(i=index_a; i<=index_b; i++) {
+ const double x_hi = x_array[i + 1];
+ const double x_lo = x_array[i];
+ const double y_lo = y_array[i];
+ const double dx = x_hi - x_lo;
+ if(dx != 0.0) {
+
+ if (i == index_a || i == index_b)
+ {
+ double x1 = (i == index_a) ? a : x_lo;
+ double x2 = (i == index_b) ? b : x_hi;
+ *result += integ_eval (y_lo, state->b[i], state->c[i], state->d[i],
+ x_lo, x1, x2);
+ }
+ else
+ {
+ *result += dx * (y_lo
+ + dx*(0.5*state->b[i]
+ + dx*(state->c[i]/3.0
+ + 0.25*state->d[i]*dx)));
+ }
+ }
+ else {
+ *result = 0.0;
+ return GSL_FAILURE;
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+static const gsl_interp_type akima_type =
+{
+ "akima",
+ 5,
+ &akima_alloc,
+ &akima_init,
+ &akima_eval,
+ &akima_eval_deriv,
+ &akima_eval_deriv2,
+ &akima_eval_integ,
+ &akima_free
+};
+
+const gsl_interp_type * gsl_interp_akima = &akima_type;
+
+static const gsl_interp_type akima_periodic_type =
+{
+ "akima-periodic",
+ 5,
+ &akima_alloc,
+ &akima_init_periodic,
+ &akima_eval,
+ &akima_eval_deriv,
+ &akima_eval_deriv2,
+ &akima_eval_integ,
+ &akima_free
+};
+
+const gsl_interp_type * gsl_interp_akima_periodic = &akima_periodic_type;
diff --git a/gsl-1.9/interpolation/bsearch.c b/gsl-1.9/interpolation/bsearch.c
new file mode 100644
index 0000000..81692db
--- /dev/null
+++ b/gsl-1.9/interpolation/bsearch.c
@@ -0,0 +1,47 @@
+/* interpolation/bsearch.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman
+ */
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_interp.h>
+
+#ifndef HIDE_INLINE_STATIC
+size_t
+gsl_interp_bsearch (
+ const double x_array[], double x,
+ size_t index_lo,
+ size_t index_hi
+ )
+{
+ size_t ilo = index_lo;
+ size_t ihi = index_hi;
+ while (ihi > ilo + 1)
+ {
+ size_t i = (ihi + ilo) / 2;
+ if (x_array[i] > x)
+ ihi = i;
+ else
+ ilo = i;
+ }
+
+ return ilo;
+}
+#endif
diff --git a/gsl-1.9/interpolation/bsearch.h b/gsl-1.9/interpolation/bsearch.h
new file mode 100644
index 0000000..0379d81
--- /dev/null
+++ b/gsl-1.9/interpolation/bsearch.h
@@ -0,0 +1,80 @@
+/* interpolation/bsearch.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman
+ */
+#ifndef __GSL_INTERP_BSEARCH_H__
+#define __GSL_INTERP_BSEARCH_H__
+
+
+/* Perform a binary search of an array of values.
+ *
+ * The parameters index_lo and index_hi provide an initial bracket,
+ * and it is assumed that index_lo < index_hi. The resulting index
+ * is guaranteed to be strictly less than index_hi and greater than
+ * or equal to index_lo, so that the implicit bracket [index, index+1]
+ * always corresponds to a region within the implicit value range of
+ * the value array.
+ *
+ * Note that this means the relationship of 'x' to x_array[index]
+ * and x_array[index+1] depends on the result region, i.e. the
+ * behaviour at the boundaries may not correspond to what you
+ * expect. We have the following complete specification of the
+ * behaviour.
+ * Suppose the input is x_array[] = { x0, x1, ..., xN }
+ * if ( x == x0 ) then index == 0
+ * if ( x > x0 && x <= x1 ) then index == 0, and sim. for other interior pts
+ * if ( x == xN ) then index == N-1
+ * if ( x > xN ) then index == N-1
+ * if ( x < x0 ) then index == 0
+ */
+size_t
+gsl_interp_bsearch(
+ const double x_array[], double x,
+ size_t index_lo,
+ size_t index_hi
+ );
+
+
+#ifdef HAVE_INLINE
+extern
+inline
+size_t
+gsl_interp_bsearch(
+ const double x_array[], double x,
+ size_t index_lo,
+ size_t index_hi
+ )
+{
+ size_t ilo = index_lo;
+ size_t ihi = index_hi;
+ while(ihi > ilo + 1) {
+ size_t i = (ihi + ilo)/2;
+ if(x_array[i] > x)
+ ihi = i;
+ else
+ ilo = i;
+ }
+
+ return ilo;
+}
+#endif /* HAVE_INLINE */
+
+
+#endif /* __GSL_INTERP_BSEARCH_H__ */
diff --git a/gsl-1.9/interpolation/cspline.c b/gsl-1.9/interpolation/cspline.c
new file mode 100644
index 0000000..6207b16
--- /dev/null
+++ b/gsl-1.9/interpolation/cspline.c
@@ -0,0 +1,475 @@
+/* interpolation/cspline.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2004 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman
+ */
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_linalg.h>
+#include <gsl/gsl_vector.h>
+#include "integ_eval.h"
+#include <gsl/gsl_interp.h>
+
+typedef struct
+{
+ double * c;
+ double * g;
+ double * diag;
+ double * offdiag;
+} cspline_state_t;
+
+
+/* common initialization */
+static void *
+cspline_alloc (size_t size)
+{
+ cspline_state_t * state = (cspline_state_t *) malloc (sizeof (cspline_state_t));
+
+ if (state == NULL)
+ {
+ GSL_ERROR_NULL("failed to allocate space for state", GSL_ENOMEM);
+ }
+
+ state->c = (double *) malloc (size * sizeof (double));
+
+ if (state->c == NULL)
+ {
+ free (state);
+ GSL_ERROR_NULL("failed to allocate space for c", GSL_ENOMEM);
+ }
+
+ state->g = (double *) malloc (size * sizeof (double));
+
+ if (state->g == NULL)
+ {
+ free (state->c);
+ free (state);
+ GSL_ERROR_NULL("failed to allocate space for g", GSL_ENOMEM);
+ }
+
+ state->diag = (double *) malloc (size * sizeof (double));
+
+ if (state->diag == NULL)
+ {
+ free (state->g);
+ free (state->c);
+ free (state);
+ GSL_ERROR_NULL("failed to allocate space for diag", GSL_ENOMEM);
+ }
+
+ state->offdiag = (double *) malloc (size * sizeof (double));
+
+ if (state->offdiag == NULL)
+ {
+ free (state->diag);
+ free (state->g);
+ free (state->c);
+ free (state);
+ GSL_ERROR_NULL("failed to allocate space for offdiag", GSL_ENOMEM);
+ }
+
+ return state;
+}
+
+
+/* natural spline calculation
+ * see [Engeln-Mullges + Uhlig, p. 254]
+ */
+static int
+cspline_init (void * vstate, const double xa[], const double ya[],
+ size_t size)
+{
+ cspline_state_t *state = (cspline_state_t *) vstate;
+
+ size_t i;
+ size_t num_points = size;
+ size_t max_index = num_points - 1; /* Engeln-Mullges + Uhlig "n" */
+ size_t sys_size = max_index - 1; /* linear system is sys_size x sys_size */
+
+ state->c[0] = 0.0;
+ state->c[max_index] = 0.0;
+
+ for (i = 0; i < sys_size; i++)
+ {
+ const double h_i = xa[i + 1] - xa[i];
+ const double h_ip1 = xa[i + 2] - xa[i + 1];
+ const double ydiff_i = ya[i + 1] - ya[i];
+ const double ydiff_ip1 = ya[i + 2] - ya[i + 1];
+ const double g_i = (h_i != 0.0) ? 1.0 / h_i : 0.0;
+ const double g_ip1 = (h_ip1 != 0.0) ? 1.0 / h_ip1 : 0.0;
+ state->offdiag[i] = h_ip1;
+ state->diag[i] = 2.0 * (h_ip1 + h_i);
+ state->g[i] = 3.0 * (ydiff_ip1 * g_ip1 - ydiff_i * g_i);
+ }
+
+ if (sys_size == 1)
+ {
+ state->c[1] = state->g[0] / state->diag[0];
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ gsl_vector_view g_vec = gsl_vector_view_array(state->g, sys_size);
+ gsl_vector_view diag_vec = gsl_vector_view_array(state->diag, sys_size);
+ gsl_vector_view offdiag_vec = gsl_vector_view_array(state->offdiag, sys_size - 1);
+ gsl_vector_view solution_vec = gsl_vector_view_array ((state->c) + 1, sys_size);
+
+ int status = gsl_linalg_solve_symm_tridiag(&diag_vec.vector,
+ &offdiag_vec.vector,
+ &g_vec.vector,
+ &solution_vec.vector);
+ return status;
+ }
+}
+
+
+/* periodic spline calculation
+ * see [Engeln-Mullges + Uhlig, p. 256]
+ */
+static int
+cspline_init_periodic (void * vstate, const double xa[], const double ya[],
+ size_t size)
+{
+ cspline_state_t *state = (cspline_state_t *) vstate;
+
+ size_t i;
+ size_t num_points = size;
+ size_t max_index = num_points - 1; /* Engeln-Mullges + Uhlig "n" */
+ size_t sys_size = max_index; /* linear system is sys_size x sys_size */
+
+ if (sys_size == 2) {
+ /* solve 2x2 system */
+
+ const double h0 = xa[1] - xa[0];
+ const double h1 = xa[2] - xa[1];
+
+ const double A = 2.0*(h0 + h1);
+ const double B = h0 + h1;
+ double g[2];
+ double det;
+
+ g[0] = 3.0 * ((ya[2] - ya[1]) / h1 - (ya[1] - ya[0]) / h0);
+ g[1] = 3.0 * ((ya[1] - ya[2]) / h0 - (ya[2] - ya[1]) / h1);
+
+ det = 3.0 * (h0 + h1) * (h0 + h1);
+ state->c[1] = ( A * g[0] - B * g[1])/det;
+ state->c[2] = (-B * g[0] + A * g[1])/det;
+ state->c[0] = state->c[2];
+
+ return GSL_SUCCESS;
+ } else {
+
+ for (i = 0; i < sys_size-1; i++) {
+ const double h_i = xa[i + 1] - xa[i];
+ const double h_ip1 = xa[i + 2] - xa[i + 1];
+ const double ydiff_i = ya[i + 1] - ya[i];
+ const double ydiff_ip1 = ya[i + 2] - ya[i + 1];
+ const double g_i = (h_i != 0.0) ? 1.0 / h_i : 0.0;
+ const double g_ip1 = (h_ip1 != 0.0) ? 1.0 / h_ip1 : 0.0;
+ state->offdiag[i] = h_ip1;
+ state->diag[i] = 2.0 * (h_ip1 + h_i);
+ state->g[i] = 3.0 * (ydiff_ip1 * g_ip1 - ydiff_i * g_i);
+ }
+
+ i = sys_size - 1;
+
+ {
+ const double h_i = xa[i + 1] - xa[i];
+ const double h_ip1 = xa[1] - xa[0];
+ const double ydiff_i = ya[i + 1] - ya[i];
+ const double ydiff_ip1 = ya[1] - ya[0];
+ const double g_i = (h_i != 0.0) ? 1.0 / h_i : 0.0;
+ const double g_ip1 = (h_ip1 != 0.0) ? 1.0 / h_ip1 : 0.0;
+ state->offdiag[i] = h_ip1;
+ state->diag[i] = 2.0 * (h_ip1 + h_i);
+ state->g[i] = 3.0 * (ydiff_ip1 * g_ip1 - ydiff_i * g_i);
+ }
+
+ {
+ gsl_vector_view g_vec = gsl_vector_view_array(state->g, sys_size);
+ gsl_vector_view diag_vec = gsl_vector_view_array(state->diag, sys_size);
+ gsl_vector_view offdiag_vec = gsl_vector_view_array(state->offdiag, sys_size);
+ gsl_vector_view solution_vec = gsl_vector_view_array ((state->c) + 1, sys_size);
+
+ int status = gsl_linalg_solve_symm_cyc_tridiag(&diag_vec.vector,
+ &offdiag_vec.vector,
+ &g_vec.vector,
+ &solution_vec.vector);
+ state->c[0] = state->c[max_index];
+
+ return status;
+ }
+ }
+}
+
+
+static
+void
+cspline_free (void * vstate)
+{
+ cspline_state_t *state = (cspline_state_t *) vstate;
+
+ free (state->c);
+ free (state->g);
+ free (state->diag);
+ free (state->offdiag);
+ free (state);
+}
+
+/* function for common coefficient determination
+ */
+static inline void
+coeff_calc (const double c_array[], double dy, double dx, size_t index,
+ double * b, double * c, double * d)
+{
+ const double c_i = c_array[index];
+ const double c_ip1 = c_array[index + 1];
+ *b = (dy / dx) - dx * (c_ip1 + 2.0 * c_i) / 3.0;
+ *c = c_i;
+ *d = (c_ip1 - c_i) / (3.0 * dx);
+}
+
+
+static
+int
+cspline_eval (const void * vstate,
+ const double x_array[], const double y_array[], size_t size,
+ double x,
+ gsl_interp_accel * a,
+ double *y)
+{
+ const cspline_state_t *state = (const cspline_state_t *) vstate;
+
+ double x_lo, x_hi;
+ double dx;
+ size_t index;
+
+ if (a != 0)
+ {
+ index = gsl_interp_accel_find (a, x_array, size, x);
+ }
+ else
+ {
+ index = gsl_interp_bsearch (x_array, x, 0, size - 1);
+ }
+
+ /* evaluate */
+ x_hi = x_array[index + 1];
+ x_lo = x_array[index];
+ dx = x_hi - x_lo;
+ if (dx > 0.0)
+ {
+ const double y_lo = y_array[index];
+ const double y_hi = y_array[index + 1];
+ const double dy = y_hi - y_lo;
+ double delx = x - x_lo;
+ double b_i, c_i, d_i;
+ coeff_calc(state->c, dy, dx, index, &b_i, &c_i, &d_i);
+ *y = y_lo + delx * (b_i + delx * (c_i + delx * d_i));
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ *y = 0.0;
+ return GSL_EINVAL;
+ }
+}
+
+
+static
+int
+cspline_eval_deriv (const void * vstate,
+ const double x_array[], const double y_array[], size_t size,
+ double x,
+ gsl_interp_accel * a,
+ double *dydx)
+{
+ const cspline_state_t *state = (const cspline_state_t *) vstate;
+
+ double x_lo, x_hi;
+ double dx;
+ size_t index;
+
+ if (a != 0)
+ {
+ index = gsl_interp_accel_find (a, x_array, size, x);
+ }
+ else
+ {
+ index = gsl_interp_bsearch (x_array, x, 0, size - 1);
+ }
+
+ /* evaluate */
+ x_hi = x_array[index + 1];
+ x_lo = x_array[index];
+ dx = x_hi - x_lo;
+ if (dx > 0.0)
+ {
+ const double y_lo = y_array[index];
+ const double y_hi = y_array[index + 1];
+ const double dy = y_hi - y_lo;
+ double delx = x - x_lo;
+ double b_i, c_i, d_i;
+ coeff_calc(state->c, dy, dx, index, &b_i, &c_i, &d_i);
+ *dydx = b_i + delx * (2.0 * c_i + 3.0 * d_i * delx);
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ *dydx = 0.0;
+ return GSL_FAILURE;
+ }
+}
+
+
+static
+int
+cspline_eval_deriv2 (const void * vstate,
+ const double x_array[], const double y_array[], size_t size,
+ double x,
+ gsl_interp_accel * a,
+ double * y_pp)
+{
+ const cspline_state_t *state = (const cspline_state_t *) vstate;
+
+ double x_lo, x_hi;
+ double dx;
+ size_t index;
+
+ if (a != 0)
+ {
+ index = gsl_interp_accel_find (a, x_array, size, x);
+ }
+ else
+ {
+ index = gsl_interp_bsearch (x_array, x, 0, size - 1);
+ }
+
+ /* evaluate */
+ x_hi = x_array[index + 1];
+ x_lo = x_array[index];
+ dx = x_hi - x_lo;
+ if (dx > 0.0)
+ {
+ const double y_lo = y_array[index];
+ const double y_hi = y_array[index + 1];
+ const double dy = y_hi - y_lo;
+ double delx = x - x_lo;
+ double b_i, c_i, d_i;
+ coeff_calc(state->c, dy, dx, index, &b_i, &c_i, &d_i);
+ *y_pp = 2.0 * c_i + 6.0 * d_i * delx;
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ *y_pp = 0.0;
+ return GSL_FAILURE;
+ }
+}
+
+
+static
+int
+cspline_eval_integ (const void * vstate,
+ const double x_array[], const double y_array[], size_t size,
+ gsl_interp_accel * acc,
+ double a, double b,
+ double * result)
+{
+ const cspline_state_t *state = (const cspline_state_t *) vstate;
+
+ size_t i, index_a, index_b;
+
+ if (acc != 0)
+ {
+ index_a = gsl_interp_accel_find (acc, x_array, size, a);
+ index_b = gsl_interp_accel_find (acc, x_array, size, b);
+ }
+ else
+ {
+ index_a = gsl_interp_bsearch (x_array, a, 0, size - 1);
+ index_b = gsl_interp_bsearch (x_array, b, 0, size - 1);
+ }
+
+ *result = 0.0;
+
+ /* interior intervals */
+ for(i=index_a; i<=index_b; i++) {
+ const double x_hi = x_array[i + 1];
+ const double x_lo = x_array[i];
+ const double y_lo = y_array[i];
+ const double y_hi = y_array[i + 1];
+ const double dx = x_hi - x_lo;
+ const double dy = y_hi - y_lo;
+ if(dx != 0.0) {
+ double b_i, c_i, d_i;
+ coeff_calc(state->c, dy, dx, i, &b_i, &c_i, &d_i);
+
+ if (i == index_a || i == index_b)
+ {
+ double x1 = (i == index_a) ? a : x_lo;
+ double x2 = (i == index_b) ? b : x_hi;
+ *result += integ_eval(y_lo, b_i, c_i, d_i, x_lo, x1, x2);
+ }
+ else
+ {
+ *result += dx * (y_lo + dx*(0.5*b_i + dx*(c_i/3.0 + 0.25*d_i*dx)));
+ }
+ }
+ else {
+ *result = 0.0;
+ return GSL_FAILURE;
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+static const gsl_interp_type cspline_type =
+{
+ "cspline",
+ 3,
+ &cspline_alloc,
+ &cspline_init,
+ &cspline_eval,
+ &cspline_eval_deriv,
+ &cspline_eval_deriv2,
+ &cspline_eval_integ,
+ &cspline_free
+};
+
+const gsl_interp_type * gsl_interp_cspline = &cspline_type;
+
+static const gsl_interp_type cspline_periodic_type =
+{
+ "cspline-periodic",
+ 2,
+ &cspline_alloc,
+ &cspline_init_periodic,
+ &cspline_eval,
+ &cspline_eval_deriv,
+ &cspline_eval_deriv2,
+ &cspline_eval_integ,
+ &cspline_free
+};
+
+const gsl_interp_type * gsl_interp_cspline_periodic = &cspline_periodic_type;
+
+
diff --git a/gsl-1.9/interpolation/gsl_interp.h b/gsl-1.9/interpolation/gsl_interp.h
new file mode 100644
index 0000000..d4757ca
--- /dev/null
+++ b/gsl-1.9/interpolation/gsl_interp.h
@@ -0,0 +1,202 @@
+/* interpolation/gsl_interp.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman
+ */
+#ifndef __GSL_INTERP_H__
+#define __GSL_INTERP_H__
+#include <stdlib.h>
+#include <gsl/gsl_types.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+/* evaluation accelerator */
+typedef struct {
+ size_t cache; /* cache of index */
+ size_t miss_count; /* keep statistics */
+ size_t hit_count;
+}
+gsl_interp_accel;
+
+
+/* interpolation object type */
+typedef struct {
+ const char * name;
+ unsigned int min_size;
+ void * (*alloc) (size_t size);
+ int (*init) (void *, const double xa[], const double ya[], size_t size);
+ int (*eval) (const void *, const double xa[], const double ya[], size_t size, double x, gsl_interp_accel *, double * y);
+ int (*eval_deriv) (const void *, const double xa[], const double ya[], size_t size, double x, gsl_interp_accel *, double * y_p);
+ int (*eval_deriv2) (const void *, const double xa[], const double ya[], size_t size, double x, gsl_interp_accel *, double * y_pp);
+ int (*eval_integ) (const void *, const double xa[], const double ya[], size_t size, gsl_interp_accel *, double a, double b, double * result);
+ void (*free) (void *);
+
+} gsl_interp_type;
+
+
+/* general interpolation object */
+typedef struct {
+ const gsl_interp_type * type;
+ double xmin;
+ double xmax;
+ size_t size;
+ void * state;
+} gsl_interp;
+
+
+/* available types */
+GSL_VAR const gsl_interp_type * gsl_interp_linear;
+GSL_VAR const gsl_interp_type * gsl_interp_polynomial;
+GSL_VAR const gsl_interp_type * gsl_interp_cspline;
+GSL_VAR const gsl_interp_type * gsl_interp_cspline_periodic;
+GSL_VAR const gsl_interp_type * gsl_interp_akima;
+GSL_VAR const gsl_interp_type * gsl_interp_akima_periodic;
+
+gsl_interp_accel *
+gsl_interp_accel_alloc(void);
+
+size_t
+gsl_interp_accel_find(gsl_interp_accel * a, const double x_array[], size_t size, double x);
+
+int
+gsl_interp_accel_reset (gsl_interp_accel * a);
+
+void
+gsl_interp_accel_free(gsl_interp_accel * a);
+
+gsl_interp *
+gsl_interp_alloc(const gsl_interp_type * T, size_t n);
+
+int
+gsl_interp_init(gsl_interp * obj, const double xa[], const double ya[], size_t size);
+
+const char * gsl_interp_name(const gsl_interp * interp);
+unsigned int gsl_interp_min_size(const gsl_interp * interp);
+
+
+int
+gsl_interp_eval_e(const gsl_interp * obj,
+ const double xa[], const double ya[], double x,
+ gsl_interp_accel * a, double * y);
+
+double
+gsl_interp_eval(const gsl_interp * obj,
+ const double xa[], const double ya[], double x,
+ gsl_interp_accel * a);
+
+int
+gsl_interp_eval_deriv_e(const gsl_interp * obj,
+ const double xa[], const double ya[], double x,
+ gsl_interp_accel * a,
+ double * d);
+
+double
+gsl_interp_eval_deriv(const gsl_interp * obj,
+ const double xa[], const double ya[], double x,
+ gsl_interp_accel * a);
+
+int
+gsl_interp_eval_deriv2_e(const gsl_interp * obj,
+ const double xa[], const double ya[], double x,
+ gsl_interp_accel * a,
+ double * d2);
+
+double
+gsl_interp_eval_deriv2(const gsl_interp * obj,
+ const double xa[], const double ya[], double x,
+ gsl_interp_accel * a);
+
+int
+gsl_interp_eval_integ_e(const gsl_interp * obj,
+ const double xa[], const double ya[],
+ double a, double b,
+ gsl_interp_accel * acc,
+ double * result);
+
+double
+gsl_interp_eval_integ(const gsl_interp * obj,
+ const double xa[], const double ya[],
+ double a, double b,
+ gsl_interp_accel * acc);
+
+void
+gsl_interp_free(gsl_interp * interp);
+
+size_t gsl_interp_bsearch(const double x_array[], double x,
+ size_t index_lo, size_t index_hi);
+
+#ifdef HAVE_INLINE
+extern inline size_t
+gsl_interp_bsearch(const double x_array[], double x,
+ size_t index_lo, size_t index_hi);
+
+extern inline size_t
+gsl_interp_bsearch(const double x_array[], double x,
+ size_t index_lo, size_t index_hi)
+{
+ size_t ilo = index_lo;
+ size_t ihi = index_hi;
+ while(ihi > ilo + 1) {
+ size_t i = (ihi + ilo)/2;
+ if(x_array[i] > x)
+ ihi = i;
+ else
+ ilo = i;
+ }
+
+ return ilo;
+}
+#endif
+
+#ifdef HAVE_INLINE
+extern inline size_t
+gsl_interp_accel_find(gsl_interp_accel * a, const double xa[], size_t len, double x)
+{
+ size_t x_index = a->cache;
+
+ if(x < xa[x_index]) {
+ a->miss_count++;
+ a->cache = gsl_interp_bsearch(xa, x, 0, x_index);
+ }
+ else if(x > xa[x_index + 1]) {
+ a->miss_count++;
+ a->cache = gsl_interp_bsearch(xa, x, x_index, len-1);
+ }
+ else {
+ a->hit_count++;
+ }
+
+ return a->cache;
+}
+#endif /* HAVE_INLINE */
+
+
+__END_DECLS
+
+#endif /* __GSL_INTERP_H__ */
diff --git a/gsl-1.9/interpolation/gsl_spline.h b/gsl-1.9/interpolation/gsl_spline.h
new file mode 100644
index 0000000..7eb40e9
--- /dev/null
+++ b/gsl-1.9/interpolation/gsl_spline.h
@@ -0,0 +1,101 @@
+/* interpolation/gsl_spline.h
+ *
+ * Copyright (C) 2001 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_SPLINE_H__
+#define __GSL_SPLINE_H__
+#include <stdlib.h>
+#include <gsl/gsl_interp.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+
+/* general interpolation object */
+typedef struct {
+ gsl_interp * interp;
+ double * x;
+ double * y;
+ size_t size;
+} gsl_spline;
+
+gsl_spline *
+gsl_spline_alloc(const gsl_interp_type * T, size_t size);
+
+int
+gsl_spline_init(gsl_spline * spline, const double xa[], const double ya[], size_t size);
+
+const char * gsl_spline_name(const gsl_spline * spline);
+unsigned int gsl_spline_min_size(const gsl_spline * spline);
+
+
+int
+gsl_spline_eval_e(const gsl_spline * spline, double x,
+ gsl_interp_accel * a, double * y);
+
+double
+gsl_spline_eval(const gsl_spline * spline, double x, gsl_interp_accel * a);
+
+int
+gsl_spline_eval_deriv_e(const gsl_spline * spline,
+ double x,
+ gsl_interp_accel * a,
+ double * y);
+
+double
+gsl_spline_eval_deriv(const gsl_spline * spline,
+ double x,
+ gsl_interp_accel * a);
+
+int
+gsl_spline_eval_deriv2_e(const gsl_spline * spline,
+ double x,
+ gsl_interp_accel * a,
+ double * y);
+
+double
+gsl_spline_eval_deriv2(const gsl_spline * spline,
+ double x,
+ gsl_interp_accel * a);
+
+int
+gsl_spline_eval_integ_e(const gsl_spline * spline,
+ double a, double b,
+ gsl_interp_accel * acc,
+ double * y);
+
+double
+gsl_spline_eval_integ(const gsl_spline * spline,
+ double a, double b,
+ gsl_interp_accel * acc);
+
+void
+gsl_spline_free(gsl_spline * spline);
+
+__END_DECLS
+
+#endif /* __GSL_INTERP_H__ */
diff --git a/gsl-1.9/interpolation/integ_eval.h b/gsl-1.9/interpolation/integ_eval.h
new file mode 100644
index 0000000..4cc21f0
--- /dev/null
+++ b/gsl-1.9/interpolation/integ_eval.h
@@ -0,0 +1,36 @@
+/* interpolation/integ_eval_macro.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* function for doing the spline integral evaluation
+ which is common to both the cspline and akima methods
+ */
+
+static inline double
+integ_eval (double ai, double bi, double ci, double di, double xi, double a,
+ double b)
+{
+ const double r1 = a - xi;
+ const double r2 = b - xi;
+ const double r12 = r1 + r2;
+ const double bterm = 0.5 * bi * r12;
+ const double cterm = (1.0 / 3.0) * ci * (r1 * r1 + r2 * r2 + r1 * r2);
+ const double dterm = 0.25 * di * r12 * (r1 * r1 + r2 * r2);
+
+ return (b - a) * (ai + bterm + cterm + dterm);
+}
diff --git a/gsl-1.9/interpolation/interp.c b/gsl-1.9/interpolation/interp.c
new file mode 100644
index 0000000..0361730
--- /dev/null
+++ b/gsl-1.9/interpolation/interp.c
@@ -0,0 +1,244 @@
+/* interpolation/interp.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman
+ */
+#include <config.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_interp.h>
+
+#define DISCARD_STATUS(s) if ((s) != GSL_SUCCESS) { GSL_ERROR_VAL("interpolation error", (s), GSL_NAN); }
+
+gsl_interp *
+gsl_interp_alloc (const gsl_interp_type * T, size_t size)
+{
+ gsl_interp * interp;
+
+ if (size < T->min_size)
+ {
+ GSL_ERROR_NULL ("insufficient number of points for interpolation type",
+ GSL_EINVAL);
+ }
+
+ interp = (gsl_interp *) malloc (sizeof(gsl_interp));
+
+ if (interp == NULL)
+ {
+ GSL_ERROR_NULL ("failed to allocate space for interp struct",
+ GSL_ENOMEM);
+ }
+
+ interp->type = T;
+ interp->size = size;
+
+ if (interp->type->alloc == NULL)
+ {
+ interp->state = NULL;
+ return interp;
+ }
+
+ interp->state = interp->type->alloc(size);
+
+ if (interp->state == NULL)
+ {
+ free (interp);
+ GSL_ERROR_NULL ("failed to allocate space for interp state", GSL_ENOMEM);
+ };
+
+ return interp;
+}
+
+int
+gsl_interp_init (gsl_interp * interp, const double x_array[], const double y_array[], size_t size)
+{
+ if (size != interp->size)
+ {
+ GSL_ERROR ("data must match size of interpolation object", GSL_EINVAL);
+ }
+
+ interp->xmin = x_array[0];
+ interp->xmax = x_array[size - 1];
+
+ {
+ int status = interp->type->init(interp->state, x_array, y_array, size);
+ return status;
+ }
+}
+
+const char *
+gsl_interp_name(const gsl_interp * interp)
+{
+ return interp->type->name;
+}
+
+unsigned int
+gsl_interp_min_size(const gsl_interp * interp)
+{
+ return interp->type->min_size;
+}
+
+void
+gsl_interp_free (gsl_interp * interp)
+{
+ if (interp->type->free)
+ interp->type->free (interp->state);
+ free (interp);
+}
+
+
+
+int
+gsl_interp_eval_e (const gsl_interp * interp,
+ const double xa[], const double ya[], double x,
+ gsl_interp_accel * a, double *y)
+{
+ if (x < interp->xmin)
+ {
+ *y = ya[0];
+ return GSL_EDOM;
+ }
+ else if (x > interp->xmax)
+ {
+ *y = ya[interp->size - 1];
+ return GSL_EDOM;
+ }
+
+ return interp->type->eval (interp->state, xa, ya, interp->size, x, a, y);
+}
+
+double
+gsl_interp_eval (const gsl_interp * interp,
+ const double xa[], const double ya[], double x,
+ gsl_interp_accel * a)
+{
+ double y;
+ int status = interp->type->eval (interp->state, xa, ya, interp->size, x, a, &y);
+
+ DISCARD_STATUS(status);
+
+ return y;
+}
+
+
+int
+gsl_interp_eval_deriv_e (const gsl_interp * interp,
+ const double xa[], const double ya[], double x,
+ gsl_interp_accel * a,
+ double *dydx)
+{
+ if (x < interp->xmin)
+ {
+ *dydx = 0.0;
+ return GSL_EDOM;
+ }
+ else if (x > interp->xmax)
+ {
+ *dydx = 0.0;
+ return GSL_EDOM;
+ }
+
+ return interp->type->eval_deriv (interp->state, xa, ya, interp->size, x, a, dydx);
+}
+
+double
+gsl_interp_eval_deriv (const gsl_interp * interp,
+ const double xa[], const double ya[], double x,
+ gsl_interp_accel * a)
+{
+ double dydx;
+ int status = interp->type->eval_deriv (interp->state, xa, ya, interp->size, x, a, &dydx);
+
+ DISCARD_STATUS(status);
+
+ return dydx;
+}
+
+
+int
+gsl_interp_eval_deriv2_e (const gsl_interp * interp,
+ const double xa[], const double ya[], double x,
+ gsl_interp_accel * a,
+ double * d2)
+{
+ if (x < interp->xmin)
+ {
+ *d2 = 0.0;
+ return GSL_EDOM;
+ }
+ else if (x > interp->xmax)
+ {
+ *d2 = 0.0;
+ return GSL_EDOM;
+ }
+
+ return interp->type->eval_deriv2 (interp->state, xa, ya, interp->size, x, a, d2);
+}
+
+double
+gsl_interp_eval_deriv2 (const gsl_interp * interp,
+ const double xa[], const double ya[], double x,
+ gsl_interp_accel * a)
+{
+ double d2;
+ int status = interp->type->eval_deriv2 (interp->state, xa, ya, interp->size, x, a, &d2);
+
+ DISCARD_STATUS(status);
+
+ return d2;
+}
+
+
+int
+gsl_interp_eval_integ_e (const gsl_interp * interp,
+ const double xa[], const double ya[],
+ double a, double b,
+ gsl_interp_accel * acc,
+ double * result)
+{
+ if (a > b || a < interp->xmin || b > interp->xmax)
+ {
+ *result = 0.0;
+ return GSL_EDOM;
+ }
+ else if(a == b)
+ {
+ *result = 0.0;
+ return GSL_SUCCESS;
+ }
+
+ return interp->type->eval_integ (interp->state, xa, ya, interp->size, acc, a, b, result);
+}
+
+
+double
+gsl_interp_eval_integ (const gsl_interp * interp,
+ const double xa[], const double ya[],
+ double a, double b,
+ gsl_interp_accel * acc)
+{
+ double result;
+ int status = interp->type->eval_integ (interp->state, xa, ya, interp->size, acc, a, b, &result);
+
+ DISCARD_STATUS(status);
+
+ return result;
+}
+
+
diff --git a/gsl-1.9/interpolation/linear.c b/gsl-1.9/interpolation/linear.c
new file mode 100644
index 0000000..aa9ec00
--- /dev/null
+++ b/gsl-1.9/interpolation/linear.c
@@ -0,0 +1,198 @@
+/* interpolation/linear.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman
+ */
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_interp.h>
+
+static int
+linear_init (void * vstate,
+ const double x_array[],
+ const double y_array[],
+ size_t size)
+{
+ return GSL_SUCCESS;
+}
+
+static
+int
+linear_eval (const void * vstate,
+ const double x_array[], const double y_array[], size_t size,
+ double x,
+ gsl_interp_accel * a,
+ double *y)
+{
+ double x_lo, x_hi;
+ double y_lo, y_hi;
+ double dx;
+ size_t index;
+
+ if (a != 0)
+ {
+ index = gsl_interp_accel_find (a, x_array, size, x);
+ }
+ else
+ {
+ index = gsl_interp_bsearch (x_array, x, 0, size - 1);
+ }
+
+ /* evaluate */
+ x_lo = x_array[index];
+ x_hi = x_array[index + 1];
+ y_lo = y_array[index];
+ y_hi = y_array[index + 1];
+ dx = x_hi - x_lo;
+ if (dx > 0.0)
+ {
+ *y = y_lo + (x - x_lo) / dx * (y_hi - y_lo);
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ *y = 0.0;
+ return GSL_EINVAL;
+ }
+}
+
+
+static
+int
+linear_eval_deriv (const void * vstate,
+ const double x_array[], const double y_array[], size_t size,
+ double x,
+ gsl_interp_accel * a,
+ double *dydx)
+{
+ double x_lo, x_hi;
+ double y_lo, y_hi;
+ double dx;
+ double dy;
+ size_t index;
+
+ if (a != 0)
+ {
+ index = gsl_interp_accel_find (a, x_array, size, x);
+ }
+ else
+ {
+ index = gsl_interp_bsearch (x_array, x, 0, size - 1);
+ }
+
+ /* evaluate */
+ x_lo = x_array[index];
+ x_hi = x_array[index + 1];
+ y_lo = y_array[index];
+ y_hi = y_array[index + 1];
+ dx = x_hi - x_lo;
+ dy = y_hi - y_lo;
+ if (dx > 0.0)
+ {
+ *dydx = dy / dx;;
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ *dydx = 0.0;
+ return GSL_EINVAL;
+ }
+}
+
+
+static
+int
+linear_eval_deriv2 (const void * vstate,
+ const double x_array[], const double y_array[], size_t size,
+ double x,
+ gsl_interp_accel * a,
+ double *y_pp)
+{
+ *y_pp = 0.0;
+
+ return GSL_SUCCESS;
+}
+
+
+static
+int
+linear_eval_integ (const void * vstate,
+ const double x_array[], const double y_array[], size_t size,
+ gsl_interp_accel * acc,
+ double a, double b,
+ double * result)
+{
+ size_t i, index_a, index_b;
+
+ if (acc != 0)
+ {
+ index_a = gsl_interp_accel_find (acc, x_array, size, a);
+ index_b = gsl_interp_accel_find (acc, x_array, size, b);
+ }
+ else
+ {
+ index_a = gsl_interp_bsearch (x_array, a, 0, size - 1);
+ index_b = gsl_interp_bsearch (x_array, b, 0, size - 1);
+ }
+
+ /* endpoints span more than one interval */
+
+ *result = 0.0;
+
+ /* interior intervals */
+ for(i=index_a; i<=index_b; i++) {
+ const double x_hi = x_array[i + 1];
+ const double x_lo = x_array[i];
+ const double y_lo = y_array[i];
+ const double y_hi = y_array[i + 1];
+ const double dx = x_hi - x_lo;
+
+ if(dx != 0.0) {
+ if (i == index_a || i == index_b)
+ {
+ double x1 = (i == index_a) ? a : x_lo;
+ double x2 = (i == index_b) ? b : x_hi;
+ const double D = (y_hi-y_lo)/dx;
+ *result += (x2-x1) * (y_lo + 0.5*D*((x2-x_lo)+(x1-x_lo)));
+ }
+ else
+ {
+ *result += 0.5 * dx * (y_lo + y_hi);
+ }
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+static const gsl_interp_type linear_type =
+{
+ "linear",
+ 2,
+ NULL, /* alloc, not applicable */
+ &linear_init,
+ &linear_eval,
+ &linear_eval_deriv,
+ &linear_eval_deriv2,
+ &linear_eval_integ,
+ NULL, /* free, not applicable */
+};
+
+const gsl_interp_type * gsl_interp_linear = &linear_type;
diff --git a/gsl-1.9/interpolation/poly.c b/gsl-1.9/interpolation/poly.c
new file mode 100644
index 0000000..a0cd68a
--- /dev/null
+++ b/gsl-1.9/interpolation/poly.c
@@ -0,0 +1,173 @@
+/* interpolation/interp_poly.c
+ *
+ * Copyright (C) 2001 DAN, HO-JIN
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_poly.h>
+#include <gsl/gsl_interp.h>
+
+typedef struct
+{
+ double *d;
+ double *coeff;
+ double *work;
+}
+polynomial_state_t;
+
+static void *
+polynomial_alloc (size_t size)
+{
+ polynomial_state_t *state =
+ (polynomial_state_t *) malloc (sizeof (polynomial_state_t));
+
+ if (state == 0)
+ {
+ GSL_ERROR_NULL ("failed to allocate space for polynomial state",
+ GSL_ENOMEM);
+ }
+
+ state->d = (double *) malloc (sizeof (double) * size);
+
+ if (state->d == 0)
+ {
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for d", GSL_ENOMEM);
+ }
+
+ state->coeff = (double *) malloc (sizeof (double) * size);
+
+ if (state->coeff == 0)
+ {
+ free (state->d);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for d", GSL_ENOMEM);
+ }
+
+ state->work = (double *) malloc (sizeof (double) * size);
+
+ if (state->work == 0)
+ {
+ free (state->coeff);
+ free (state->d);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for d", GSL_ENOMEM);
+ }
+
+ return state;
+}
+
+static int
+polynomial_init (void *vstate,
+ const double xa[], const double ya[], size_t size)
+{
+ polynomial_state_t *state = (polynomial_state_t *) vstate;
+
+ int status = gsl_poly_dd_init (state->d, xa, ya, size);
+
+ return status;
+}
+
+static int
+polynomial_eval (const void *vstate,
+ const double xa[], const double ya[], size_t size, double x,
+ gsl_interp_accel * acc, double *y)
+{
+ const polynomial_state_t *state = (const polynomial_state_t *) vstate;
+
+ *y = gsl_poly_dd_eval (state->d, xa, size, x);
+
+ return GSL_SUCCESS;
+}
+
+
+static int
+polynomial_deriv (const void *vstate,
+ const double xa[], const double ya[], size_t size, double x,
+ gsl_interp_accel * acc, double *y)
+{
+ const polynomial_state_t *state = (const polynomial_state_t *) vstate;
+
+ gsl_poly_dd_taylor (state->coeff, x, state->d, xa, size, state->work);
+
+ *y = state->coeff[1];
+
+ return GSL_SUCCESS;
+}
+
+static int
+polynomial_deriv2 (const void *vstate,
+ const double xa[], const double ya[], size_t size,
+ double x, gsl_interp_accel * acc, double *y)
+{
+ const polynomial_state_t *state = (const polynomial_state_t *) vstate;
+
+ gsl_poly_dd_taylor (state->coeff, x, state->d, xa, size, state->work);
+
+ *y = 2.0 * state->coeff[2];
+
+ return GSL_SUCCESS;
+}
+
+static int
+polynomial_integ (const void *vstate, const double xa[], const double ya[],
+ size_t size, gsl_interp_accel * acc, double a, double b,
+ double *result)
+{
+ const polynomial_state_t *state = (const polynomial_state_t *) vstate;
+ size_t i;
+ double sum;
+
+ gsl_poly_dd_taylor (state->coeff, 0.0, state->d, xa, size, state->work);
+
+ sum = state->coeff[0] * (b - a);
+
+ for (i = 1; i < size; i++)
+ {
+ sum += state->coeff[i] * (pow (b, i + 1) - pow (a, i + 1)) / (i + 1.0);
+ }
+
+ *result = sum;
+
+ return GSL_SUCCESS;
+}
+
+static void
+polynomial_free (void *vstate)
+{
+ polynomial_state_t *state = (polynomial_state_t *) vstate;
+ free (state->d);
+ free (state->coeff);
+ free (state->work);
+ free (state);
+}
+
+static const gsl_interp_type polynomial_type = {
+ "polynomial",
+ 3,
+ &polynomial_alloc,
+ &polynomial_init,
+ &polynomial_eval,
+ &polynomial_deriv,
+ &polynomial_deriv2,
+ &polynomial_integ,
+ &polynomial_free,
+};
+
+const gsl_interp_type *gsl_interp_polynomial = &polynomial_type;
diff --git a/gsl-1.9/interpolation/spline.c b/gsl-1.9/interpolation/spline.c
new file mode 100644
index 0000000..d5b5a0f
--- /dev/null
+++ b/gsl-1.9/interpolation/spline.c
@@ -0,0 +1,193 @@
+/* interpolation/spline.c
+ *
+ * Copyright (C) 2001 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <string.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_interp.h>
+#include <gsl/gsl_spline.h>
+
+gsl_spline *
+gsl_spline_alloc (const gsl_interp_type * T, size_t size)
+{
+ gsl_spline * spline = (gsl_spline *) malloc (sizeof(gsl_spline));
+
+ if (spline == NULL)
+ {
+ GSL_ERROR_NULL ("failed to allocate space for spline struct",
+ GSL_ENOMEM);
+ }
+
+ spline->interp = gsl_interp_alloc (T, size);
+
+ if (spline->interp == NULL)
+ {
+ free (spline);
+ GSL_ERROR_NULL ("failed to allocate space for interp", GSL_ENOMEM);
+ };
+
+ spline->x = (double *) malloc (size * sizeof(double));
+
+ if (spline->x == NULL)
+ {
+ gsl_interp_free(spline->interp);
+ free(spline);
+ GSL_ERROR_NULL ("failed to allocate space for x", GSL_ENOMEM);
+ }
+
+ spline->y = (double *) malloc (size * sizeof(double));
+
+ if (spline->y == NULL)
+ {
+ free(spline->x);
+ gsl_interp_free(spline->interp);
+ free(spline);
+ GSL_ERROR_NULL ("failed to allocate space for y", GSL_ENOMEM);
+ }
+
+ spline->size = size;
+
+ return spline;
+}
+
+int
+gsl_spline_init (gsl_spline * spline, const double x_array[], const double y_array[], size_t size)
+{
+ if (size != spline->size)
+ {
+ GSL_ERROR ("data must match size of spline object", GSL_EINVAL);
+ }
+
+ memcpy (spline->x, x_array, size * sizeof(double));
+ memcpy (spline->y, y_array, size * sizeof(double));
+
+ {
+ int status = gsl_interp_init (spline->interp, x_array, y_array, size);
+ return status;
+ }
+}
+
+const char *
+gsl_spline_name(const gsl_spline * spline)
+{
+ return gsl_interp_name(spline->interp);
+}
+
+unsigned int
+gsl_spline_min_size(const gsl_spline * spline)
+{
+ return gsl_interp_min_size(spline->interp);
+}
+
+void
+gsl_spline_free (gsl_spline * spline)
+{
+ gsl_interp_free (spline->interp);
+ free (spline->x);
+ free (spline->y);
+ free (spline);
+}
+
+int
+gsl_spline_eval_e (const gsl_spline * spline,
+ double x,
+ gsl_interp_accel * a, double *y)
+{
+ return gsl_interp_eval_e (spline->interp,
+ spline->x, spline->y,
+ x, a, y);
+}
+
+double
+gsl_spline_eval (const gsl_spline * spline,
+ double x,
+ gsl_interp_accel * a)
+{
+ return gsl_interp_eval (spline->interp,
+ spline->x, spline->y,
+ x, a);
+}
+
+
+int
+gsl_spline_eval_deriv_e (const gsl_spline * spline,
+ double x,
+ gsl_interp_accel * a,
+ double *dydx)
+{
+ return gsl_interp_eval_deriv_e (spline->interp,
+ spline->x, spline->y,
+ x, a, dydx);
+}
+
+double
+gsl_spline_eval_deriv (const gsl_spline * spline,
+ double x,
+ gsl_interp_accel * a)
+{
+ return gsl_interp_eval_deriv (spline->interp,
+ spline->x, spline->y,
+ x, a);
+}
+
+
+int
+gsl_spline_eval_deriv2_e (const gsl_spline * spline,
+ double x,
+ gsl_interp_accel * a,
+ double * d2)
+{
+ return gsl_interp_eval_deriv2_e (spline->interp,
+ spline->x, spline->y,
+ x, a, d2);
+}
+
+double
+gsl_spline_eval_deriv2 (const gsl_spline * spline,
+ double x,
+ gsl_interp_accel * a)
+{
+ return gsl_interp_eval_deriv2 (spline->interp,
+ spline->x, spline->y,
+ x, a);
+}
+
+
+int
+gsl_spline_eval_integ_e (const gsl_spline * spline,
+ double a, double b,
+ gsl_interp_accel * acc,
+ double * result)
+{
+ return gsl_interp_eval_integ_e (spline->interp,
+ spline->x, spline->y,
+ a, b, acc, result);
+}
+
+
+double
+gsl_spline_eval_integ (const gsl_spline * spline,
+ double a, double b,
+ gsl_interp_accel * acc)
+{
+ return gsl_interp_eval_integ (spline->interp,
+ spline->x, spline->y,
+ a, b, acc);
+}
+
diff --git a/gsl-1.9/interpolation/test.c b/gsl-1.9/interpolation/test.c
new file mode 100644
index 0000000..feb01d5
--- /dev/null
+++ b/gsl-1.9/interpolation/test.c
@@ -0,0 +1,949 @@
+/* interpolation/test.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+
+/* Author: G. Jungman
+ */
+#include <config.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_interp.h>
+#include <gsl/gsl_ieee_utils.h>
+
+int
+test_bsearch(void)
+{
+ double x_array[5] = { 0.0, 1.0, 2.0, 3.0, 4.0 };
+ size_t index_result;
+ int status = 0;
+ int s;
+
+ /* check an interior point */
+ index_result = gsl_interp_bsearch(x_array, 1.5, 0, 4);
+ s = (index_result != 1);
+ status += s;
+ gsl_test (s, "simple bsearch");
+
+ /* check that we get the last interval if x == last value */
+ index_result = gsl_interp_bsearch(x_array, 4.0, 0, 4);
+ s = (index_result != 3);
+ status += s;
+ gsl_test (s, "upper endpoint bsearch");
+
+ /* check that we get the first interval if x == first value */
+ index_result = gsl_interp_bsearch(x_array, 0.0, 0, 4);
+ s = (index_result != 0);
+ status += s;
+ gsl_test (s, "lower endpoint bsearch");
+
+ /* check that we get correct interior boundary behaviour */
+ index_result = gsl_interp_bsearch(x_array, 2.0, 0, 4);
+ s = (index_result != 2);
+ status += s;
+ gsl_test (s, "degenerate bsearch");
+
+ /* check out of bounds above */
+ index_result = gsl_interp_bsearch(x_array, 10.0, 0, 4);
+ s = (index_result != 3);
+ status += s;
+ gsl_test (s, "out of bounds bsearch +");
+
+ /* check out of bounds below */
+ index_result = gsl_interp_bsearch(x_array, -10.0, 0, 4);
+ s = (index_result != 0);
+ status += s;
+ gsl_test (s, "out of bounds bsearch -");
+
+ return status;
+}
+
+
+
+typedef double TEST_FUNC (double);
+typedef struct _xy_table xy_table;
+
+struct _xy_table
+ {
+ double * x;
+ double * y;
+ size_t n;
+ };
+
+xy_table make_xy_table (double x[], double y[], size_t n);
+
+xy_table
+make_xy_table (double x[], double y[], size_t n)
+{
+ xy_table t;
+ t.x = x;
+ t.y = y;
+ t.n = n;
+ return t;
+}
+
+static int
+test_interp (
+ const xy_table * data_table,
+ const gsl_interp_type * T,
+ xy_table * test_table,
+ xy_table * test_d_table,
+ xy_table * test_i_table
+ )
+{
+ int status = 0, s1, s2, s3;
+ size_t i;
+
+ gsl_interp_accel *a = gsl_interp_accel_alloc ();
+ gsl_interp *interp = gsl_interp_alloc (T, data_table->n);
+
+ gsl_interp_init (interp, data_table->x, data_table->y, data_table->n);
+
+ for (i = 0; i < test_table->n; i++)
+ {
+ double x = test_table->x[i];
+ double y;
+ double deriv;
+ double integ;
+ double diff_y, diff_deriv, diff_integ;
+ s1 = gsl_interp_eval_e (interp, data_table->x, data_table->y, x, a, &y);
+ s2 = gsl_interp_eval_deriv_e (interp, data_table->x, data_table->y, x, a, &deriv);
+ s3 = gsl_interp_eval_integ_e (interp, data_table->x, data_table->y, test_table->x[0], x, a, &integ);
+
+ gsl_test (s1, "gsl_interp_eval_e %s", gsl_interp_name(interp));
+ gsl_test (s2, "gsl_interp_eval_deriv_e %s", gsl_interp_name(interp));
+ gsl_test (s3, "gsl_interp_eval_integ_e %s", gsl_interp_name(interp));
+
+ gsl_test_abs (y, test_table->y[i], 1e-10, "%s %d", gsl_interp_name(interp), i);
+ gsl_test_abs (deriv, test_d_table->y[i], 1e-10, "%s deriv %d", gsl_interp_name(interp), i);
+ gsl_test_abs (integ, test_i_table->y[i], 1e-10, "%s integ %d", gsl_interp_name(interp), i);
+
+ diff_y = y - test_table->y[i];
+ diff_deriv = deriv - test_d_table->y[i];
+ diff_integ = integ - test_i_table->y[i];
+ if (fabs (diff_y) > 1.e-10 || fabs(diff_deriv) > 1.0e-10 || fabs(diff_integ) > 1.0e-10) {
+ status++;
+ }
+ }
+
+ gsl_interp_accel_free (a);
+ gsl_interp_free (interp);
+
+ return status;
+}
+
+static int
+test_linear (void)
+{
+ int s;
+
+ double data_x[4] = { 0.0, 1.0, 2.0, 3.0 };
+ double data_y[4] = { 0.0, 1.0, 2.0, 3.0 };
+ double test_x[6] = { 0.0, 0.5, 1.0, 1.5, 2.5, 3.0 };
+ double test_y[6] = { 0.0, 0.5, 1.0, 1.5, 2.5, 3.0 };
+ double test_dy[6] = { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 };
+ double test_iy[6] = { 0.0, 0.125, 0.5, 9.0/8.0, 25.0/8.0, 9.0/2.0 };
+
+ xy_table data_table = make_xy_table(data_x, data_y, 4);
+ xy_table test_table = make_xy_table(test_x, test_y, 6);
+ xy_table test_d_table = make_xy_table(test_x, test_dy, 6);
+ xy_table test_i_table = make_xy_table(test_x, test_iy, 6);
+
+ s = test_interp (&data_table, gsl_interp_linear, &test_table, &test_d_table, &test_i_table);
+ gsl_test (s, "linear interpolation");
+ return s;
+}
+
+static int
+test_polynomial (void)
+{
+ int s;
+
+ double data_x[4] = { 0.0, 1.0, 2.0, 3.0 };
+ double data_y[4] = { 0.0, 1.0, 2.0, 3.0 };
+ double test_x[6] = { 0.0, 0.5, 1.0, 1.5, 2.5, 3.0 };
+ double test_y[6] = { 0.0, 0.5, 1.0, 1.5, 2.5, 3.0 };
+ double test_dy[6] = { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 };
+ double test_iy[6] = { 0.0, 0.125, 0.5, 9.0/8.0, 25.0/8.0, 9.0/2.0 };
+
+ xy_table data_table = make_xy_table(data_x, data_y, 4);
+ xy_table test_table = make_xy_table(test_x, test_y, 6);
+ xy_table test_d_table = make_xy_table(test_x, test_dy, 6);
+ xy_table test_i_table = make_xy_table(test_x, test_iy, 6);
+
+ s = test_interp (&data_table, gsl_interp_polynomial, &test_table, &test_d_table, &test_i_table);
+ gsl_test (s, "polynomial interpolation");
+ return s;
+}
+
+
+static int
+test_cspline (void)
+{
+ int s;
+
+ double data_x[3] = { 0.0, 1.0, 2.0 };
+ double data_y[3] = { 0.0, 1.0, 2.0 };
+ double test_x[4] = { 0.0, 0.5, 1.0, 2.0 };
+ double test_y[4] = { 0.0, 0.5, 1.0, 2.0 };
+ double test_dy[4] = { 1.0, 1.0, 1.0, 1.0 };
+ double test_iy[4] = { 0.0, 0.125, 0.5, 2.0 };
+
+ xy_table data_table = make_xy_table(data_x, data_y, 3);
+ xy_table test_table = make_xy_table(test_x, test_y, 4);
+ xy_table test_d_table = make_xy_table(test_x, test_dy, 4);
+ xy_table test_i_table = make_xy_table(test_x, test_iy, 4);
+
+ s = test_interp (&data_table, gsl_interp_cspline, &test_table, &test_d_table, &test_i_table);
+ gsl_test (s, "cspline interpolation");
+ return s;
+}
+
+static int
+test_cspline2 (void)
+{
+ /* Test taken from Young & Gregory, A Survey of Numerical
+ Mathematics, Vol 1 Chapter 6.8 */
+
+ int s;
+
+ double data_x[6] = { 0.0, 0.2, 0.4, 0.6, 0.8, 1.0 };
+
+ double data_y[6] = { 1.0,
+ 0.961538461538461, 0.862068965517241,
+ 0.735294117647059, 0.609756097560976,
+ 0.500000000000000 } ;
+
+ double test_x[50] = {
+ 0.00, 0.02, 0.04, 0.06, 0.08, 0.10, 0.12, 0.14, 0.16, 0.18,
+ 0.20, 0.22, 0.24, 0.26, 0.28, 0.30, 0.32, 0.34, 0.36, 0.38,
+ 0.40, 0.42, 0.44, 0.46, 0.48, 0.50, 0.52, 0.54, 0.56, 0.58,
+ 0.60, 0.62, 0.64, 0.66, 0.68, 0.70, 0.72, 0.74, 0.76, 0.78,
+ 0.80, 0.82, 0.84, 0.86, 0.88, 0.90, 0.92, 0.94, 0.96, 0.98 };
+
+ double test_y[50] = {
+ 1.000000000000000, 0.997583282975581, 0.995079933416512,
+ 0.992403318788142, 0.989466806555819, 0.986183764184894,
+ 0.982467559140716, 0.978231558888635, 0.973389130893999,
+ 0.967853642622158, 0.961538461538461, 0.954382579685350,
+ 0.946427487413627, 0.937740299651188, 0.928388131325928,
+ 0.918438097365742, 0.907957312698524, 0.897012892252170,
+ 0.885671950954575, 0.874001603733634, 0.862068965517241,
+ 0.849933363488199, 0.837622973848936, 0.825158185056786,
+ 0.812559385569085, 0.799846963843167, 0.787041308336369,
+ 0.774162807506023, 0.761231849809467, 0.748268823704033,
+ 0.735294117647059, 0.722328486073082, 0.709394147325463,
+ 0.696513685724764, 0.683709685591549, 0.671004731246381,
+ 0.658421407009825, 0.645982297202442, 0.633709986144797,
+ 0.621627058157454, 0.609756097560976, 0.598112015427308,
+ 0.586679029833925, 0.575433685609685, 0.564352527583445,
+ 0.553412100584061, 0.542588949440392, 0.531859618981294,
+ 0.521200654035625, 0.510588599432241};
+
+ double test_dy[50] = {
+ -0.120113913432180, -0.122279726798445, -0.128777166897241,
+ -0.139606233728568, -0.154766927292426, -0.174259247588814,
+ -0.198083194617734, -0.226238768379184, -0.258725968873165,
+ -0.295544796099676, -0.336695250058719, -0.378333644186652,
+ -0.416616291919835, -0.451543193258270, -0.483114348201955,
+ -0.511329756750890, -0.536189418905076, -0.557693334664512,
+ -0.575841504029200, -0.590633926999137, -0.602070603574326,
+ -0.611319695518765, -0.619549364596455, -0.626759610807396,
+ -0.632950434151589, -0.638121834629033, -0.642273812239728,
+ -0.645406366983674, -0.647519498860871, -0.648613207871319,
+ -0.648687494015019, -0.647687460711257, -0.645558211379322,
+ -0.642299746019212, -0.637912064630930, -0.632395167214473,
+ -0.625749053769843, -0.617973724297039, -0.609069178796061,
+ -0.599035417266910, -0.587872439709585, -0.576731233416743,
+ -0.566762785681043, -0.557967096502484, -0.550344165881066,
+ -0.543893993816790, -0.538616580309654, -0.534511925359660,
+ -0.531580028966807, -0.529820891131095};
+
+ double test_iy[50] = {
+ 0.000000000000000, 0.019975905023535, 0.039902753768792,
+ 0.059777947259733, 0.079597153869625, 0.099354309321042,
+ 0.119041616685866, 0.138649546385285, 0.158166836189794,
+ 0.177580491219196, 0.196875783942601, 0.216036382301310,
+ 0.235045759060558, 0.253888601161251, 0.272550937842853,
+ 0.291020140643388, 0.309284923399436, 0.327335342246135,
+ 0.345162795617181, 0.362760024244829, 0.380121111159890,
+ 0.397241442753010, 0.414117280448683, 0.430745332379281,
+ 0.447122714446318, 0.463246950320456, 0.479115971441505,
+ 0.494728117018421, 0.510082134029305, 0.525177177221407,
+ 0.540012809111123, 0.554589001813881, 0.568906157172889,
+ 0.582965126887879, 0.596767214344995, 0.610314174616794,
+ 0.623608214462242, 0.636651992326715, 0.649448618342004,
+ 0.662001654326309, 0.674315113784241, 0.686393423540581,
+ 0.698241001711602, 0.709861835676399, 0.721259443710643,
+ 0.732436874986582, 0.743396709573044, 0.754141058435429,
+ 0.764671563435718, 0.774989397332469 };
+
+ xy_table data_table = make_xy_table(data_x, data_y, 6);
+ xy_table test_table = make_xy_table(test_x, test_y, 50);
+ xy_table test_d_table = make_xy_table(test_x, test_dy, 50);
+ xy_table test_i_table = make_xy_table(test_x, test_iy, 50);
+
+ s = test_interp (&data_table, gsl_interp_cspline, &test_table, &test_d_table, &test_i_table);
+ gsl_test (s, "cspline 1/(1+x^2) interpolation");
+ return s;
+}
+
+static int
+test_cspline3 (void)
+{
+ /* This data has been chosen to be random (uneven spacing in x and y)
+ and the exact cubic spine solution computed using Octave */
+
+ int s;
+
+ double data_x[7] = {
+ -1.2139767065644265,
+ -0.792590494453907,
+ -0.250954683125019,
+ 0.665867809951305,
+ 0.735655088722706,
+ 0.827622053027153,
+ 1.426592227816582
+ };
+
+ double data_y[7] = {
+ -0.00453877449035645,
+ 0.49763182550668716,
+ 0.17805472016334534,
+ 0.40514493733644485,
+ -0.21595209836959839,
+ 0.47405586764216423,
+ 0.46561462432146072
+ } ;
+
+ double test_x[19] = {
+ -1.2139767065644265,
+ -1.0735146358609200,
+ -0.9330525651574135,
+ -0.7925904944539071,
+ -0.6120452240109444,
+ -0.4314999535679818,
+ -0.2509546831250191,
+ 0.0546528145670890,
+ 0.3602603122591972,
+ 0.6658678099513053,
+ 0.6891302362084388,
+ 0.7123926624655723,
+ 0.7356550887227058,
+ 0.7663107434908548,
+ 0.7969663982590039,
+ 0.8276220530271530,
+ 1.0272787779569625,
+ 1.2269355028867721,
+ 1.4265922278165817,
+ };
+
+ double test_y[19] = {
+ -0.00453877449035645,
+ 0.25816917628390590,
+ 0.44938881397673230,
+ 0.49763182550668716,
+ 0.31389980410075147,
+ 0.09948951681196887,
+ 0.17805472016334534,
+ 1.27633142487980233,
+ 2.04936553432792001,
+ 0.40514493733644485,
+ 0.13322324792901385,
+ -0.09656315924697809,
+ -0.21595209836959839,
+ -0.13551147728045118,
+ 0.13466779030061801,
+ 0.47405586764216423,
+ 1.68064089899304370,
+ 1.43594739539458649,
+ 0.46561462432146072
+ };
+
+ double test_dy[19] = {
+ 1.955137555965937,
+ 1.700662049790549,
+ 0.937235531264386,
+ -0.335141999612553,
+ -1.401385073563169,
+ -0.674982149482761,
+ 1.844066772628670,
+ 4.202528085784793,
+ -0.284432022227558,
+ -11.616813551408383,
+ -11.272731243226174,
+ -7.994209291156876,
+ -1.781247695200491,
+ 6.373970868827501,
+ 10.597456848997197,
+ 10.889210245308570,
+ 1.803124267866902,
+ -3.648527318598099,
+ -5.465744514086432,
+ };
+
+ double test_iy[19] = {
+ 0.000000000000000,
+ 0.018231117234914,
+ 0.069178822023139,
+ 0.137781019634897,
+ 0.213936442847744,
+ 0.249280997744777,
+ 0.267492946016120,
+ 0.471372708120518,
+ 1.014473660088477,
+ 1.477731933018837,
+ 1.483978291717981,
+ 1.484256847945450,
+ 1.480341742628893,
+ 1.474315901028282,
+ 1.473972210647307,
+ 1.483279773396950,
+ 1.728562698140330,
+ 2.057796448999396,
+ 2.253662886537457,
+ };
+
+ xy_table data_table = make_xy_table(data_x, data_y, 7);
+ xy_table test_table = make_xy_table(test_x, test_y, 19);
+ xy_table test_d_table = make_xy_table(test_x, test_dy, 19);
+ xy_table test_i_table = make_xy_table(test_x, test_iy, 19);
+
+ s = test_interp (&data_table, gsl_interp_cspline, &test_table, &test_d_table, &test_i_table);
+ gsl_test (s, "cspline arbitrary data interpolation");
+ return s;
+}
+
+static int
+test_csplinep (void)
+{
+ /* This data has been chosen to be random (uneven spacing in x and y)
+ and the exact cubic spine solution computed using Octave */
+
+ int s;
+
+ double data_x[11] = {
+ 0.000000000000000,
+ 0.130153674349869,
+ 0.164545962312740,
+ 0.227375461261537,
+ 0.256465324353657,
+ 0.372545206874658,
+ 0.520820016781720,
+ 0.647654717733075,
+ 0.753429306654340,
+ 0.900873984827658,
+ 1.000000000000000,
+ };
+
+ double data_y[11] = {
+ 0.000000000000000,
+ 0.729629261832041,
+ 0.859286331568207,
+ 0.989913099419008,
+ 0.999175006262120,
+ 0.717928599519215,
+ -0.130443237213363,
+ -0.800267961158980,
+ -0.999767873040527,
+ -0.583333769240853,
+ -0.000000000000000,
+ } ;
+
+ double test_x[31] = {
+ 0.000000000000000,
+ 0.043384558116623,
+ 0.086769116233246,
+ 0.130153674349869,
+ 0.141617770337492,
+ 0.153081866325116,
+ 0.164545962312740,
+ 0.185489128629005,
+ 0.206432294945271,
+ 0.227375461261537,
+ 0.237072082292243,
+ 0.246768703322951,
+ 0.256465324353657,
+ 0.295158618527324,
+ 0.333851912700991,
+ 0.372545206874658,
+ 0.421970143510346,
+ 0.471395080146033,
+ 0.520820016781720,
+ 0.563098250432172,
+ 0.605376484082623,
+ 0.647654717733075,
+ 0.682912914040164,
+ 0.718171110347252,
+ 0.753429306654340,
+ 0.802577532712113,
+ 0.851725758769885,
+ 0.900873984827658,
+ 0.933915989885105,
+ 0.966957994942553,
+ 1.000000000000000
+ };
+
+ double test_y[31] = {
+ 0.000000000000000,
+ 0.268657574670719,
+ 0.517940878523929,
+ 0.729629261832041,
+ 0.777012551497867,
+ 0.820298314554859,
+ 0.859286331568207,
+ 0.918833991960315,
+ 0.962624749226346,
+ 0.989913099419008,
+ 0.996756196601349,
+ 0.999858105635752,
+ 0.999175006262120,
+ 0.959248551766306,
+ 0.863713527741856,
+ 0.717928599519215,
+ 0.470065187871106,
+ 0.177694938589523,
+ -0.130443237213363,
+ -0.385093922365765,
+ -0.613840011545983,
+ -0.800267961158980,
+ -0.912498361131651,
+ -0.980219217412290,
+ -0.999767873040528,
+ -0.943635958253643,
+ -0.800314354800596,
+ -0.583333769240853,
+ -0.403689914131666,
+ -0.206151346799382,
+ -0.000000000000000
+ };
+
+ double test_dy[31] = {
+ 6.275761975917336,
+ 6.039181349093287,
+ 5.382620652895025,
+ 4.306079887322550,
+ 3.957389777282752,
+ 3.591234754612763,
+ 3.207614819312586,
+ 2.473048186927024,
+ 1.702885029353488,
+ 0.897125346591982,
+ 0.513561009477969,
+ 0.125477545550710,
+ -0.267125045189792,
+ -1.773533414873785,
+ -3.141450982859891,
+ -4.370877749148106,
+ -5.562104227060234,
+ -6.171864888961167,
+ -6.200159734850907,
+ -5.781556055213110,
+ -4.974725570010514,
+ -3.779668279243120,
+ -2.569220222282655,
+ -1.254891157670244,
+ 0.163318914594122,
+ 2.074985916277011,
+ 3.711348850147548,
+ 5.072407716205733,
+ 5.754438923510391,
+ 6.155557010080926,
+ 6.275761975917336
+ };
+
+ double test_iy[31] = {
+ 0.000000000000000,
+ 0.005864903144198,
+ 0.023030998930796,
+ 0.050262495763030,
+ 0.058902457844100,
+ 0.068062330564832,
+ 0.077693991819461,
+ 0.096340576055474,
+ 0.116070578226521,
+ 0.136546192283223,
+ 0.146181187290769,
+ 0.155864434185569,
+ 0.165559443629720,
+ 0.203636318965633,
+ 0.239075190181586,
+ 0.269828050745236,
+ 0.299428805999600,
+ 0.315560685785616,
+ 0.316734151903742,
+ 0.305773798930857,
+ 0.284537037103156,
+ 0.254466034797342,
+ 0.224146112780097,
+ 0.190643050847000,
+ 0.155590744566140,
+ 0.107448508851745,
+ 0.064263083957312,
+ 0.029987183298960,
+ 0.013618510529526,
+ 0.003506827320794,
+ 0.000090064010007,
+ };
+
+ xy_table data_table = make_xy_table(data_x, data_y, 11);
+ xy_table test_table = make_xy_table(test_x, test_y, 31);
+ xy_table test_d_table = make_xy_table(test_x, test_dy, 31);
+ xy_table test_i_table = make_xy_table(test_x, test_iy, 31);
+
+ s = test_interp (&data_table, gsl_interp_cspline_periodic, &test_table, &test_d_table, &test_i_table);
+ gsl_test (s, "cspline periodic sine interpolation");
+ return s;
+}
+
+static int
+test_csplinep2 (void)
+{
+ /* This data tests the periodic case n=3 */
+
+ int s;
+
+ double data_x[3] = {
+ 0.123,
+ 0.423,
+ 1.123
+ };
+
+ double data_y[3] = {
+ 0.456000000000000,
+ 1.407056516295154,
+ 0.456000000000000
+ } ;
+
+ double test_x[61] = {
+ 0.123000000000000,
+ 0.133000000000000,
+ 0.143000000000000,
+ 0.153000000000000,
+ 0.163000000000000,
+ 0.173000000000000,
+ 0.183000000000000,
+ 0.193000000000000,
+ 0.203000000000000,
+ 0.213000000000000,
+ 0.223000000000000,
+ 0.233000000000000,
+ 0.243000000000000,
+ 0.253000000000000,
+ 0.263000000000000,
+ 0.273000000000000,
+ 0.283000000000000,
+ 0.293000000000000,
+ 0.303000000000000,
+ 0.313000000000000,
+ 0.323000000000000,
+ 0.333000000000000,
+ 0.343000000000000,
+ 0.353000000000000,
+ 0.363000000000000,
+ 0.373000000000000,
+ 0.383000000000000,
+ 0.393000000000000,
+ 0.403000000000000,
+ 0.413000000000000,
+ 0.423000000000000,
+ 0.446333333333333,
+ 0.469666666666667,
+ 0.493000000000000,
+ 0.516333333333333,
+ 0.539666666666667,
+ 0.563000000000000,
+ 0.586333333333333,
+ 0.609666666666667,
+ 0.633000000000000,
+ 0.656333333333333,
+ 0.679666666666667,
+ 0.703000000000000,
+ 0.726333333333333,
+ 0.749666666666667,
+ 0.773000000000000,
+ 0.796333333333333,
+ 0.819666666666667,
+ 0.843000000000000,
+ 0.866333333333333,
+ 0.889666666666667,
+ 0.913000000000000,
+ 0.936333333333333,
+ 0.959666666666667,
+ 0.983000000000000,
+ 1.006333333333333,
+ 1.029666666666667,
+ 1.053000000000000,
+ 1.076333333333333,
+ 1.099666666666667,
+ 1.123000000000000
+ };
+
+ double test_y[61] = {
+ 0.456000000000000,
+ 0.475443822110923,
+ 0.497423794931967,
+ 0.521758764840979,
+ 0.548267578215809,
+ 0.576769081434305,
+ 0.607082120874316,
+ 0.639025542913690,
+ 0.672418193930275,
+ 0.707078920301921,
+ 0.742826568406475,
+ 0.779479984621787,
+ 0.816858015325704,
+ 0.854779506896076,
+ 0.893063305710751,
+ 0.931528258147577,
+ 0.969993210584403,
+ 1.008277009399078,
+ 1.046198500969450,
+ 1.083576531673367,
+ 1.120229947888679,
+ 1.155977595993233,
+ 1.190638322364879,
+ 1.224030973381464,
+ 1.255974395420838,
+ 1.286287434860848,
+ 1.314788938079344,
+ 1.341297751454174,
+ 1.365632721363187,
+ 1.387612694184230,
+ 1.407056516295154,
+ 1.442092968697928,
+ 1.463321489456714,
+ 1.471728359403224,
+ 1.468299859369172,
+ 1.454022270186272,
+ 1.429881872686237,
+ 1.396864947700781,
+ 1.355957776061616,
+ 1.308146638600458,
+ 1.254417816149018,
+ 1.195757589539010,
+ 1.133152239602149,
+ 1.067588047170148,
+ 1.000051293074719,
+ 0.931528258147577,
+ 0.863005223220435,
+ 0.795468469125006,
+ 0.729904276693004,
+ 0.667298926756143,
+ 0.608638700146136,
+ 0.554909877694696,
+ 0.507098740233537,
+ 0.466191568594372,
+ 0.433174643608916,
+ 0.409034246108881,
+ 0.394756656925981,
+ 0.391328156891929,
+ 0.399735026838439,
+ 0.420963547597225,
+ 0.456000000000000
+ };
+
+ double test_dy[61] = {
+ 1.8115362215145774,
+ 2.0742089736341924,
+ 2.3187663635386602,
+ 2.5452083912279826,
+ 2.7535350567021584,
+ 2.9437463599611897,
+ 3.1158423010050744,
+ 3.2698228798338147,
+ 3.4056880964474079,
+ 3.5234379508458549,
+ 3.6230724430291570,
+ 3.7045915729973125,
+ 3.7679953407503231,
+ 3.8132837462881874,
+ 3.8404567896109061,
+ 3.8495144707184790,
+ 3.8404567896109061,
+ 3.8132837462881874,
+ 3.7679953407503231,
+ 3.7045915729973125,
+ 3.6230724430291565,
+ 3.5234379508458549,
+ 3.4056880964474074,
+ 3.2698228798338147,
+ 3.1158423010050749,
+ 2.9437463599611897,
+ 2.7535350567021584,
+ 2.5452083912279830,
+ 2.3187663635386597,
+ 2.0742089736341924,
+ 1.8115362215145772,
+ 1.1986331332354823,
+ 0.6279992234583869,
+ 0.0996344921833026,
+ -0.3864610605897765,
+ -0.8302874348608467,
+ -1.2318446306299125,
+ -1.5911326478969707,
+ -1.9081514866620208,
+ -2.1829011469250670,
+ -2.4153816286861041,
+ -2.6055929319451341,
+ -2.7535350567021584,
+ -2.8592080029571765,
+ -2.9226117707101862,
+ -2.9437463599611893,
+ -2.9226117707101862,
+ -2.8592080029571760,
+ -2.7535350567021593,
+ -2.6055929319451354,
+ -2.4153816286861045,
+ -2.1829011469250656,
+ -1.9081514866620242,
+ -1.5911326478969716,
+ -1.2318446306299160,
+ -0.8302874348608498,
+ -0.3864610605897769,
+ 0.0996344921832995,
+ 0.6279992234583824,
+ 1.1986331332354769,
+ 1.8115362215145772
+ };
+
+ double test_iy[61] = {
+ 0.000000000000000,
+ 0.004655030170954,
+ 0.009517330277919,
+ 0.014611356059886,
+ 0.019959751719625,
+ 0.025583349923681,
+ 0.031501171802382,
+ 0.037730426949832,
+ 0.044286513423914,
+ 0.051183017746288,
+ 0.058431714902395,
+ 0.066042568341453,
+ 0.074023729976459,
+ 0.082381540184189,
+ 0.091120527805195,
+ 0.100243410143811,
+ 0.109751092968147,
+ 0.119642670510092,
+ 0.129915425465314,
+ 0.140564828993259,
+ 0.151584540717153,
+ 0.162966408723997,
+ 0.174700469564574,
+ 0.186774948253444,
+ 0.199176258268946,
+ 0.211889001553197,
+ 0.224895968512091,
+ 0.238178138015305,
+ 0.251714677396289,
+ 0.265482942452275,
+ 0.279458477444273,
+ 0.312726362409309,
+ 0.346648754292945,
+ 0.380914974633193,
+ 0.415237358187469,
+ 0.449351252932597,
+ 0.483015020064806,
+ 0.516010033999735,
+ 0.548140682372425,
+ 0.579234366037328,
+ 0.609141499068300,
+ 0.637735508758604,
+ 0.664912835620912,
+ 0.690592933387298,
+ 0.714718269009247,
+ 0.737254322657649,
+ 0.758189587722801,
+ 0.777535570814405,
+ 0.795326791761572,
+ 0.811620783612819,
+ 0.826498092636068,
+ 0.840062278318649,
+ 0.852439913367300,
+ 0.863780583708163,
+ 0.874256888486789,
+ 0.884064440068133,
+ 0.893421864036559,
+ 0.902570799195836,
+ 0.911775897569142,
+ 0.921324824399059,
+ 0.931528258147577
+ };
+
+ xy_table data_table = make_xy_table(data_x, data_y, 3);
+ xy_table test_table = make_xy_table(test_x, test_y, 61);
+ xy_table test_d_table = make_xy_table(test_x, test_dy, 61);
+ xy_table test_i_table = make_xy_table(test_x, test_iy, 61);
+
+ s = test_interp (&data_table, gsl_interp_cspline_periodic, &test_table, &test_d_table, &test_i_table);
+ gsl_test (s, "cspline periodic 3pt interpolation");
+ return s;
+}
+
+
+
+static int
+test_akima (void)
+{
+ int s;
+
+ double data_x[5] = { 0.0, 1.0, 2.0, 3.0, 4.0 };
+ double data_y[5] = { 0.0, 1.0, 2.0, 3.0, 4.0 };
+ double test_x[4] = { 0.0, 0.5, 1.0, 2.0 };
+ double test_y[4] = { 0.0, 0.5, 1.0, 2.0 };
+ double test_dy[4] = { 1.0, 1.0, 1.0, 1.0 };
+ double test_iy[4] = { 0.0, 0.125, 0.5, 2.0 };
+
+ xy_table data_table = make_xy_table(data_x, data_y, 5);
+ xy_table test_table = make_xy_table(test_x, test_y, 4);
+ xy_table test_d_table = make_xy_table(test_x, test_dy, 4);
+ xy_table test_i_table = make_xy_table(test_x, test_iy, 4);
+
+ s = test_interp (&data_table, gsl_interp_akima, &test_table, &test_d_table, &test_i_table);
+ gsl_test (s, "akima interpolation");
+ return s;
+}
+
+
+int
+main (int argc, char **argv)
+{
+ int status = 0;
+
+ gsl_ieee_env_setup ();
+
+ argc = 0; /* prevent warnings about unused parameters */
+ argv = 0;
+
+ status += test_bsearch();
+ status += test_linear();
+ status += test_polynomial();
+ status += test_cspline();
+ status += test_cspline2();
+ status += test_cspline3();
+ status += test_csplinep();
+ status += test_csplinep2();
+ status += test_akima();
+
+ exit (gsl_test_summary());
+}
diff --git a/gsl-1.9/linalg/ChangeLog b/gsl-1.9/linalg/ChangeLog
new file mode 100644
index 0000000..f454b25
--- /dev/null
+++ b/gsl-1.9/linalg/ChangeLog
@@ -0,0 +1,350 @@
+2006-08-14 Brian Gough <bjg@network-theory.co.uk>
+
+ * balancemat.c: balance a general matrix D^-1 A D for rows and
+ columns
+
+2006-04-24 Brian Gough <bjg@network-theory.co.uk>
+
+ * svdstep.c apply_givens.c householder.c: perform linear
+ operations with level-1 blas when compiled with USE_BLAS.
+
+2006-02-10 Brian Gough <bjg@network-theory.co.uk>
+
+ * cholesky.c (quiet_sqrt): added a quiet_sqrt to allow checking
+ for positive definiteness without a runtime error
+
+2005-08-22 Brian Gough <bjg@network-theory.co.uk>
+
+ * svd.c (gsl_linalg_SV_decomp_jacobi): reorganised convergence
+ tests to increase robustness in the presence of extended precision
+ registers.
+
+2005-06-22 Brian Gough <bjg@network-theory.co.uk>
+
+ * svd.c (gsl_linalg_SV_decomp_jacobi): increased number of sweeps
+ to MAX(5*N,12) and track numerical errors for better termination
+
+2005-02-02 Brian Gough <bjg@network-theory.co.uk>
+
+ * svd.c (gsl_linalg_SV_decomp_jacobi): changed M<N test to correct
+ matrix A instead of Q.
+
+2004-12-23 Brian Gough <bjg@network-theory.co.uk>
+
+ * qr.c (gsl_linalg_R_svx): added missing function
+
+2004-09-13 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c: added tests for LQ, P^TLQ solvers
+
+ * ptlq.c: added support for PA = LQ decompositions
+
+ * lq.c: added support for A = LQ decompositions
+
+2004-05-30 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c (test_LU_solve): increase test tolerance to accommodate
+ gcc-3.3.3 w/ bounds checking
+
+2004-05-26 Brian Gough <bjg@network-theory.co.uk>
+
+ * householder.c (gsl_linalg_householder_hm):
+ (gsl_linalg_householder_mh):
+ (gsl_linalg_householder_hm1): added blas code (but ifdef'd out)
+
+ * test.c (test_SV_decomp_dim): skip NaNs in test
+ (test_SV_decomp_mod_dim): skip NaNs in test
+
+2004-04-26 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c (test_TDN_solve): increased tolerance for tests
+ (test_TDN_cyc_solve): increased tolerance for tests
+
+2004-03-15 Brian Gough <bjg@network-theory.co.uk>
+
+ * tridiag.c: (gsl_linalg_solve_symm_tridiag):
+ (gsl_linalg_solve_tridiag):
+ (gsl_linalg_solve_symm_cyc_tridiag):
+ (gsl_linalg_solve_cyc_tridiag): use GSL_ERROR macro to report
+ errors, make size restrictions tighter (no unused elements allowed
+ to be passed in).
+
+2004-03-06 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c (test_SV_decomp_mod_dim): added tests for SV_decomp_mod
+
+ * svd.c (gsl_linalg_SV_decomp): handle the case N=1 (SVD of a
+ column vector)
+ (gsl_linalg_SV_decomp_mod): handle the case N=1 (SVD of a column
+ vector)
+
+2004-03-05 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c (test_SV_decomp): add tests with inf/nan
+
+ * svd.c (gsl_linalg_SV_decomp): handle nans in block reduction
+
+ * balance.c: handle infinity/nan when scaling input matrix
+
+2003-07-24 Brian Gough <bjg@network-theory.co.uk>
+
+ * tridiag.c (solve_cyc_tridiag_nonsym): fixed declarations of i so
+ they do not shadow each other
+
+2003-05-30 Brian Gough <bjg@network-theory.co.uk>
+
+ * householder.c (gsl_linalg_householder_hv): converted to use blas
+ routines
+
+2003-05-08 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c: added tests for QR_QRsolve and QRPT_QRsolve
+
+ * qrpt.c (gsl_linalg_QRPT_QRsolve): fixed dgemv to use CblasTrans
+ when computing Q^T b
+
+ * qr.c (gsl_linalg_QR_QRsolve): fixed dgemv to use CblasTrans when
+ computing Q^T b
+
+Fri Oct 18 17:46:30 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * householdercomplex.c (gsl_linalg_complex_householder_transform):
+ return tau = 0 to prevent division by zero for beta_r = 0
+
+Mon Aug 12 20:12:55 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * bidiag.c (gsl_linalg_bidiag_unpack_B): fixed to copy
+ superdiagonal and not subdiagonal, as was incorrectly done
+ previously.
+
+Sun Jun 16 11:57:00 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * svd.c (gsl_linalg_SV_decomp): keep track of maximum value
+ correctly when sorting singular values
+
+ * test.c (test_SV_decomp): add 3x3 of SVD
+
+ * svdstep.c (chase_out_intermediate_zero): handle case of dk=0
+ (chase_out_trailing_zero): handle case of dn=0
+
+Wed Apr 17 20:04:11 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * tridiag.c (gsl_linalg_solve_tridiag):
+ (gsl_linalg_solve_cyc_tridiag): added tridiagonal solvers for
+ non-symmetric case (David Necas <yeti@physics.muni.cz>)
+
+Mon Apr 15 19:55:40 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * tridiag.c (solve_cyc_tridiag): corrected typographical error in
+ Engeln-Mullges Algorithm 4.35, step 1.7 (f_(n-1) should be
+ alpha_(n-1))
+
+Thu Sep 13 12:26:17 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c (test_SV_decomp): added brute force testing of 2x2 svd
+
+ * svdstep.c (svd2): fixed bug where singular values in 2x2 svd
+ were not ordered correctly.
+
+Mon Sep 10 22:35:24 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c (test_LUc_solve): added a test for complex LU
+
+Tue Sep 4 17:22:58 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * luc.c: added LU decomposition for complex matrices
+
+Wed Aug 29 16:34:50 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * svd.c (gsl_linalg_SV_decomp_jacobi): make sure all singular
+ vectors are zero, not just first.
+
+ * svdstep.c (svd2): added explicit calculation of 2x2 svd, fixes
+ bug that prevents convergence.
+
+Thu Aug 2 18:19:08 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * svdstep.c (trailing_eigenvalue): chose better value of mu when
+ dt=0.
+
+Sun Jul 8 18:03:05 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * qrpt.c (gsl_linalg_QRPT_decomp): fix bug where null column
+ caused division by zero in norm-update calculation
+
+Sun Jul 1 22:43:22 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * modified to use new-style vector views, affects most
+ functions
+
+Wed Jun 20 13:38:24 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * svd.c (gsl_linalg_SV_decomp): added error checking
+
+Tue Jun 19 23:19:49 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * svd.c (gsl_linalg_SV_decomp): Golub-Reinsch svd, has more
+ deterministic convergence
+ (gsl_linalg_SV_decomp_mod): Golub-Reinsch with
+ Preconditioning, much more efficient for M>>N
+
+ * balance.c (gsl_linalg_balance_columns): balances (or
+ "equilibrates") the columns of a matrix
+
+Sun Jun 17 21:49:03 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * givens.c: split out apply_givens functions into separate file
+ apply_givens.c
+
+Wed Jun 13 23:41:34 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * qr.c (gsl_linalg_QR_decomp): simplified reverse loop
+
+ * bidiag.c: bidiagonalisation of a matrix (needed for
+ Golub-Reinsch SVD)
+
+Wed Jun 6 12:36:58 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * householdercomplex.c: split out complex functions into a
+ separate file to reduce linking dependencies
+
+ * qrpt.c (gsl_linalg_QRPT_decomp): provide workspace as an
+ argument, to avoid allocating it on each call
+ (gsl_linalg_QRPT_decomp2): provide workspace as an argument, to
+ avoid allocating it on each call
+
+ * qr.c (gsl_linalg_QR_decomp): provide workspace as an argument,
+ to avoid allocating it on each call
+
+Thu May 17 17:01:45 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * qr.c (gsl_linalg_QR_lssolve): added least squares solver
+
+Sat Apr 28 00:39:53 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * qr.c (gsl_linalg_QR_update): fixed QR update to work correctly
+ with rectangular matrices where M > N
+
+Mon Apr 23 10:29:01 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * tridiag.c: removed EFAULT test since this should only apply to
+ non-null invalid pointers
+
+Fri Apr 13 20:43:38 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c: replaced uses of matmult by dgemm
+
+Sun Oct 22 13:56:30 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * householder.c (gsl_linalg_householder_transform): changed calls
+ to gsl_hypot() to hypot() so that the system function is used in
+ preference (the configure script will define hypot to gsl_hypot if
+ hypot is unavailable)
+
+ * svd.c (gsl_linalg_SV_decomp): changed calls to gsl_hypot() to
+ hypot()
+
+Sat Oct 21 15:54:56 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * tridiag.c (solve_tridiag): prevent out-of-bounds array access
+ for small N (attempt to access element[N-2] when N is 1).
+
+Tue Sep 19 21:42:13 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * qrpt.c (gsl_linalg_QRPT_decomp2): added convenience function to
+ compute q,r unpacked decomposition directly
+
+Wed Aug 16 19:50:35 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * svd.c (gsl_linalg_SV_decomp): take more care with singular
+ values, set the associated vectors to zero
+
+Sun Aug 13 16:39:40 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * qrpt.c (gsl_linalg_QRPT_decomp): fixed obvious bug in selection
+ of column with max norm
+
+Wed May 31 19:42:59 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c (test_QR_update): increased tolerances on results to
+ allow tests to pass with other compilers
+
+Wed May 3 21:19:45 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * cholesky.c: added cholesky decomposition/solve from Thomas
+ Walter. Modified for GSL.
+
+Fri Apr 28 17:13:00 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * renamed all matrices to use upper case variable names, e.g. A
+
+Thu Apr 27 20:31:46 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c: tightened up accuracy of the decomp test
+
+ * test_la.c: renamed to test.c for consistency
+ (test_QR_decomp): added the "moler" matrix as a test for SVD
+
+ * svd.c (gsl_linalg_SV_decomp): improved the convergence criterion
+ for rank deficient case.
+
+Wed Apr 26 19:37:46 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * renamed rhs -> b, and solution -> x throughout for consistency
+
+Mon Apr 24 17:04:52 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * test_la.c (main): added tests for MxN matrices
+
+ * test_la.c (main): added tests for SV decomposition and solve.
+
+ * svd.c (gsl_linalg_SV_decomp): made use of vector row/column
+ functions, tidied up the algorithm a bit. Use a standard tolerance
+ of 10*GSL_DBL_EPSILON.
+ (gsl_linalg_SV_solve): added a least squares solver
+
+Sun Apr 23 21:18:04 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_linalg.h, svd.c (gsl_linalg_SV_decomp): changed function
+ name to new naming convention
+
+ * qr.c (gsl_linalg_QR_unpack): fixed index ranges for rectangular
+ case when unpacking R
+
+Sat Apr 22 15:05:21 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * matrix.c: removed, equivalent functions now in matrix directory
+
+Sat Mar 11 17:36:33 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * multiply.c: removed _impl from these functions since all the
+ errors they can return are fatal.
+
+Wed Feb 16 12:03:00 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * multiply.c (gsl_la_matmult_mod_impl): fixed error in transposed
+ matrix memory access, expressions should always be of the form
+ M->data[i*M->size2 + j] even when i,j are transposed.
+
+ Safer to replace matrix access by gsl_matrix_set and
+ gsl_matrix_get, which is what I have done now. Shouldn't be any
+ cost in the production version of the library where we have
+ inlines and range checking off.
+
+Tue Feb 15 17:46:19 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * tridiag.h (solve_cyc_tridiag): fixed typo in header, was
+ solve_cyctridiag, missing _.
+
+ * converted all functions to use gsl_permutation instead of
+ gsl_vector_int
+
+Fri Oct 1 15:51:02 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * temporary changes resulting from changes to block/vector/matrix
+ organization
+
+Fri Aug 6 14:42:23 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * linalg_simple.c: include <string.h> to declare memcpy
+
diff --git a/gsl-1.9/linalg/Makefile.am b/gsl-1.9/linalg/Makefile.am
new file mode 100644
index 0000000..8f4a9b3
--- /dev/null
+++ b/gsl-1.9/linalg/Makefile.am
@@ -0,0 +1,19 @@
+noinst_LTLIBRARIES = libgsllinalg.la
+
+pkginclude_HEADERS = gsl_linalg.h
+
+INCLUDES= -I$(top_builddir)
+
+libgsllinalg_la_SOURCES = multiply.c exponential.c tridiag.c tridiag.h lu.c luc.c hh.c qr.c qrpt.c lq.c ptlq.c svd.c householder.c householdercomplex.c hessenberg.c cholesky.c symmtd.c hermtd.c bidiag.c balance.c balancemat.c
+
+noinst_HEADERS = givens.c apply_givens.c svdstep.c tridiag.h
+
+TESTS = $(check_PROGRAMS)
+
+check_PROGRAMS = test
+
+test_LDADD = libgsllinalg.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../permutation/libgslpermutation.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+
+test_SOURCES = test.c
+
+
diff --git a/gsl-1.9/linalg/Makefile.in b/gsl-1.9/linalg/Makefile.in
new file mode 100644
index 0000000..ff3ea12
--- /dev/null
+++ b/gsl-1.9/linalg/Makefile.in
@@ -0,0 +1,550 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = test$(EXEEXT)
+subdir = linalg
+DIST_COMMON = $(noinst_HEADERS) $(pkginclude_HEADERS) \
+ $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog TODO
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgsllinalg_la_LIBADD =
+am_libgsllinalg_la_OBJECTS = multiply.lo exponential.lo tridiag.lo \
+ lu.lo luc.lo hh.lo qr.lo qrpt.lo lq.lo ptlq.lo svd.lo \
+ householder.lo householdercomplex.lo hessenberg.lo cholesky.lo \
+ symmtd.lo hermtd.lo bidiag.lo balance.lo balancemat.lo
+libgsllinalg_la_OBJECTS = $(am_libgsllinalg_la_OBJECTS)
+am_test_OBJECTS = test.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = libgsllinalg.la ../blas/libgslblas.la \
+ ../cblas/libgslcblas.la ../permutation/libgslpermutation.la \
+ ../matrix/libgslmatrix.la ../vector/libgslvector.la \
+ ../block/libgslblock.la ../complex/libgslcomplex.la \
+ ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la \
+ ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgsllinalg_la_SOURCES) $(test_SOURCES)
+DIST_SOURCES = $(libgsllinalg_la_SOURCES) $(test_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libgsllinalg.la
+pkginclude_HEADERS = gsl_linalg.h
+INCLUDES = -I$(top_builddir)
+libgsllinalg_la_SOURCES = multiply.c exponential.c tridiag.c tridiag.h lu.c luc.c hh.c qr.c qrpt.c lq.c ptlq.c svd.c householder.c householdercomplex.c hessenberg.c cholesky.c symmtd.c hermtd.c bidiag.c balance.c balancemat.c
+noinst_HEADERS = givens.c apply_givens.c svdstep.c tridiag.h
+TESTS = $(check_PROGRAMS)
+test_LDADD = libgsllinalg.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../permutation/libgslpermutation.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+test_SOURCES = test.c
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps linalg/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps linalg/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgsllinalg.la: $(libgsllinalg_la_OBJECTS) $(libgsllinalg_la_DEPENDENCIES)
+ $(LINK) $(libgsllinalg_la_LDFLAGS) $(libgsllinalg_la_OBJECTS) $(libgsllinalg_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkgincludeHEADERS
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/linalg/TODO b/gsl-1.9/linalg/TODO
new file mode 100644
index 0000000..31747ee
--- /dev/null
+++ b/gsl-1.9/linalg/TODO
@@ -0,0 +1,6 @@
+* Provide support for the following special systems:
+
+ Vandermonde, Toeplitz, ...
+
+
+
diff --git a/gsl-1.9/linalg/apply_givens.c b/gsl-1.9/linalg/apply_givens.c
new file mode 100644
index 0000000..2d4fe55
--- /dev/null
+++ b/gsl-1.9/linalg/apply_givens.c
@@ -0,0 +1,125 @@
+/* linalg/apply_givens.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 Gerard Jungman, Brian Gough
+ * Copyright (C) 2004 Joerg Wensch, modifications for LQ.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+inline static void
+apply_givens_qr (size_t M, size_t N, gsl_matrix * Q, gsl_matrix * R,
+ size_t i, size_t j, double c, double s)
+{
+ size_t k;
+
+ /* Apply rotation to matrix Q, Q' = Q G */
+
+#if USE_BLAS
+ {
+ gsl_matrix_view Q0M = gsl_matrix_submatrix(Q,0,0,M,j+1);
+ gsl_vector_view Qi = gsl_matrix_column(&Q0M.matrix,i);
+ gsl_vector_view Qj = gsl_matrix_column(&Q0M.matrix,j);
+ gsl_blas_drot(&Qi.vector, &Qj.vector, c, -s);
+ }
+#else
+ for (k = 0; k < M; k++)
+ {
+ double qki = gsl_matrix_get (Q, k, i);
+ double qkj = gsl_matrix_get (Q, k, j);
+ gsl_matrix_set (Q, k, i, qki * c - qkj * s);
+ gsl_matrix_set (Q, k, j, qki * s + qkj * c);
+ }
+#endif
+
+ /* Apply rotation to matrix R, R' = G^T R (note: upper triangular so
+ zero for column < row) */
+
+#if USE_BLAS
+ {
+ k = GSL_MIN(i,j);
+ gsl_matrix_view R0 = gsl_matrix_submatrix(R, 0, k, j+1, N-k);
+ gsl_vector_view Ri = gsl_matrix_row(&R0.matrix,i);
+ gsl_vector_view Rj = gsl_matrix_row(&R0.matrix,j);
+ gsl_blas_drot(&Ri.vector, &Rj.vector, c, -s);
+ }
+#else
+ for (k = GSL_MIN (i, j); k < N; k++)
+ {
+ double rik = gsl_matrix_get (R, i, k);
+ double rjk = gsl_matrix_get (R, j, k);
+ gsl_matrix_set (R, i, k, c * rik - s * rjk);
+ gsl_matrix_set (R, j, k, s * rik + c * rjk);
+ }
+#endif
+}
+
+inline static void
+apply_givens_lq (size_t M, size_t N, gsl_matrix * Q, gsl_matrix * L,
+ size_t i, size_t j, double c, double s)
+{
+ size_t k;
+
+ /* Apply rotation to matrix Q, Q' = G Q */
+
+#if USE_BLAS
+ {
+ gsl_matrix_view Q0M = gsl_matrix_submatrix(Q,0,0,j+1,M);
+ gsl_vector_view Qi = gsl_matrix_row(&Q0M.matrix,i);
+ gsl_vector_view Qj = gsl_matrix_row(&Q0M.matrix,j);
+ gsl_blas_drot(&Qi.vector, &Qj.vector, c, -s);
+ }
+#else
+ for (k = 0; k < M; k++)
+ {
+ double qik = gsl_matrix_get (Q, i, k);
+ double qjk = gsl_matrix_get (Q, j, k);
+ gsl_matrix_set (Q, i, k, qik * c - qjk * s);
+ gsl_matrix_set (Q, j, k, qik * s + qjk * c);
+ }
+#endif
+
+ /* Apply rotation to matrix L, L' = L G^T (note: lower triangular so
+ zero for column > row) */
+
+#if USE_BLAS
+ {
+ k = GSL_MIN(i,j);
+ gsl_matrix_view L0 = gsl_matrix_submatrix(L, k, 0, N-k, j+1);
+ gsl_vector_view Li = gsl_matrix_column(&L0.matrix,i);
+ gsl_vector_view Lj = gsl_matrix_column(&L0.matrix,j);
+ gsl_blas_drot(&Li.vector, &Lj.vector, c, -s);
+ }
+#else
+ for (k = GSL_MIN (i, j); k < N; k++)
+ {
+ double lki = gsl_matrix_get (L, k, i);
+ double lkj = gsl_matrix_get (L, k, j);
+ gsl_matrix_set (L, k, i, c * lki - s * lkj);
+ gsl_matrix_set (L, k, j, s * lki + c * lkj);
+ }
+#endif
+}
+
+inline static void
+apply_givens_vec (gsl_vector * v, size_t i, size_t j, double c, double s)
+{
+ /* Apply rotation to vector v' = G^T v */
+
+ double vi = gsl_vector_get (v, i);
+ double vj = gsl_vector_get (v, j);
+ gsl_vector_set (v, i, c * vi - s * vj);
+ gsl_vector_set (v, j, s * vi + c * vj);
+}
+
diff --git a/gsl-1.9/linalg/balance.c b/gsl-1.9/linalg/balance.c
new file mode 100644
index 0000000..a5ebed1
--- /dev/null
+++ b/gsl-1.9/linalg/balance.c
@@ -0,0 +1,86 @@
+/* linalg/balance.c
+ *
+ * Copyright (C) 2001, 2004 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Balance a general matrix by scaling the columns
+ *
+ * B = A D
+ *
+ * where D is a diagonal matrix
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_blas.h>
+
+#include <gsl/gsl_linalg.h>
+
+int
+gsl_linalg_balance_columns (gsl_matrix * A, gsl_vector * D)
+{
+ const size_t N = A->size2;
+ size_t j;
+
+ if (D->size != A->size2)
+ {
+ GSL_ERROR("length of D must match second dimension of A", GSL_EINVAL);
+ }
+
+ gsl_vector_set_all (D, 1.0);
+
+ for (j = 0; j < N; j++)
+ {
+ gsl_vector_view A_j = gsl_matrix_column (A, j);
+
+ double s = gsl_blas_dasum(&A_j.vector);
+
+ double f = 1.0;
+
+ if (s == 0.0 || !gsl_finite(s))
+ {
+ gsl_vector_set (D, j, f);
+ continue;
+ }
+
+ /* FIXME: we could use frexp() here */
+
+ while (s > 1.0)
+ {
+ s /= 2.0;
+ f *= 2.0;
+ }
+
+ while (s < 0.5)
+ {
+ s *= 2.0;
+ f /= 2.0;
+ }
+
+ gsl_vector_set (D, j, f);
+
+ if (f != 1.0)
+ {
+ gsl_blas_dscal(1.0/f, &A_j.vector);
+ }
+ }
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/linalg/balancemat.c b/gsl-1.9/linalg/balancemat.c
new file mode 100644
index 0000000..b09cbb9
--- /dev/null
+++ b/gsl-1.9/linalg/balancemat.c
@@ -0,0 +1,186 @@
+/* linalg/balance.c
+ *
+ * Copyright (C) 2006 Patrick Alken
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Balance a general matrix by scaling the rows and columns, so the
+ * new row and column norms are the same order of magnitude.
+ *
+ * B = D^-1 A D
+ *
+ * where D is a diagonal matrix
+ *
+ * This is necessary for the unsymmetric eigenvalue problem since the
+ * calculation can become numerically unstable for unbalanced
+ * matrices.
+ *
+ * See Golub & Van Loan, "Matrix Computations" (3rd ed), Section 7.5.7
+ * and Wilkinson & Reinsch, "Handbook for Automatic Computation", II/11 p320.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_blas.h>
+
+#include <gsl/gsl_linalg.h>
+
+#define FLOAT_RADIX 2.0
+#define FLOAT_RADIX_SQ (FLOAT_RADIX * FLOAT_RADIX)
+
+int
+gsl_linalg_balance_matrix(gsl_matrix * A, gsl_vector * D)
+{
+ const size_t N = A->size1;
+
+ if (N != D->size)
+ {
+ GSL_ERROR ("vector must match matrix size", GSL_EBADLEN);
+ }
+ else
+ {
+ double row_norm,
+ col_norm;
+ int not_converged;
+ gsl_vector_view v;
+
+ /* initialize D to the identity matrix */
+ gsl_vector_set_all(D, 1.0);
+
+ not_converged = 1;
+
+ while (not_converged)
+ {
+ size_t i, j;
+ double g, f, s;
+
+ not_converged = 0;
+
+ for (i = 0; i < N; ++i)
+ {
+ row_norm = 0.0;
+ col_norm = 0.0;
+
+ for (j = 0; j < N; ++j)
+ {
+ if (j != i)
+ {
+ col_norm += fabs(gsl_matrix_get(A, j, i));
+ row_norm += fabs(gsl_matrix_get(A, i, j));
+ }
+ }
+
+ if ((col_norm == 0.0) || (row_norm == 0.0))
+ {
+ continue;
+ }
+
+ g = row_norm / FLOAT_RADIX;
+ f = 1.0;
+ s = col_norm + row_norm;
+
+ /*
+ * find the integer power of the machine radix which
+ * comes closest to balancing the matrix
+ */
+ while (col_norm < g)
+ {
+ f *= FLOAT_RADIX;
+ col_norm *= FLOAT_RADIX_SQ;
+ }
+
+ g = row_norm * FLOAT_RADIX;
+
+ while (col_norm > g)
+ {
+ f /= FLOAT_RADIX;
+ col_norm /= FLOAT_RADIX_SQ;
+ }
+
+ if ((row_norm + col_norm) < 0.95 * s * f)
+ {
+ not_converged = 1;
+
+ g = 1.0 / f;
+
+ /*
+ * apply similarity transformation D, where
+ * D_{ij} = f_i * delta_{ij}
+ */
+
+ /* multiply by D^{-1} on the left */
+ v = gsl_matrix_row(A, i);
+ gsl_blas_dscal(g, &v.vector);
+
+ /* multiply by D on the right */
+ v = gsl_matrix_column(A, i);
+ gsl_blas_dscal(f, &v.vector);
+
+ /* keep track of transformation */
+ gsl_vector_set(D, i, gsl_vector_get(D, i) * f);
+ }
+ }
+ }
+
+ return GSL_SUCCESS;
+ }
+} /* gsl_linalg_balance_matrix() */
+
+/*
+gsl_linalg_balance_accum()
+ Accumulate a balancing transformation into a matrix.
+This is used during the computation of Schur vectors since the
+Schur vectors computed are the vectors for the balanced matrix.
+We must at some point accumulate the balancing transformation into
+the Schur vector matrix to get the vectors for the original matrix.
+
+A -> D A
+
+where D is the diagonal matrix
+
+Inputs: A - matrix to transform
+ D - vector containing diagonal elements of D
+*/
+
+int
+gsl_linalg_balance_accum(gsl_matrix *A, gsl_vector *D)
+{
+ const size_t N = A->size1;
+
+ if (N != D->size)
+ {
+ GSL_ERROR ("vector must match matrix size", GSL_EBADLEN);
+ }
+ else
+ {
+ size_t i;
+ double s;
+ gsl_vector_view r;
+
+ for (i = 0; i < N; ++i)
+ {
+ s = gsl_vector_get(D, i);
+ r = gsl_matrix_row(A, i);
+
+ gsl_blas_dscal(s, &r.vector);
+ }
+
+ return GSL_SUCCESS;
+ }
+} /* gsl_linalg_balance_accum() */
diff --git a/gsl-1.9/linalg/bidiag.c b/gsl-1.9/linalg/bidiag.c
new file mode 100644
index 0000000..914ce7e
--- /dev/null
+++ b/gsl-1.9/linalg/bidiag.c
@@ -0,0 +1,364 @@
+/* linalg/bidiag.c
+ *
+ * Copyright (C) 2001 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Factorise a matrix A into
+ *
+ * A = U B V^T
+ *
+ * where U and V are orthogonal and B is upper bidiagonal.
+ *
+ * On exit, B is stored in the diagonal and first superdiagonal of A.
+ *
+ * U is stored as a packed set of Householder transformations in the
+ * lower triangular part of the input matrix below the diagonal.
+ *
+ * V is stored as a packed set of Householder transformations in the
+ * upper triangular part of the input matrix above the first
+ * superdiagonal.
+ *
+ * The full matrix for U can be obtained as the product
+ *
+ * U = U_1 U_2 .. U_N
+ *
+ * where
+ *
+ * U_i = (I - tau_i * u_i * u_i')
+ *
+ * and where u_i is a Householder vector
+ *
+ * u_i = [0, .. , 0, 1, A(i+1,i), A(i+3,i), .. , A(M,i)]
+ *
+ * The full matrix for V can be obtained as the product
+ *
+ * V = V_1 V_2 .. V_(N-2)
+ *
+ * where
+ *
+ * V_i = (I - tau_i * v_i * v_i')
+ *
+ * and where v_i is a Householder vector
+ *
+ * v_i = [0, .. , 0, 1, A(i,i+2), A(i,i+3), .. , A(i,N)]
+ *
+ * See Golub & Van Loan, "Matrix Computations" (3rd ed), Algorithm 5.4.2
+ *
+ * Note: this description uses 1-based indices. The code below uses
+ * 0-based indices
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_blas.h>
+
+#include <gsl/gsl_linalg.h>
+
+int
+gsl_linalg_bidiag_decomp (gsl_matrix * A, gsl_vector * tau_U, gsl_vector * tau_V)
+{
+ if (A->size1 < A->size2)
+ {
+ GSL_ERROR ("bidiagonal decomposition requires M>=N", GSL_EBADLEN);
+ }
+ else if (tau_U->size != A->size2)
+ {
+ GSL_ERROR ("size of tau_U must be N", GSL_EBADLEN);
+ }
+ else if (tau_V->size + 1 != A->size2)
+ {
+ GSL_ERROR ("size of tau_V must be (N - 1)", GSL_EBADLEN);
+ }
+ else
+ {
+ const size_t M = A->size1;
+ const size_t N = A->size2;
+ size_t i;
+
+ for (i = 0 ; i < N; i++)
+ {
+ /* Apply Householder transformation to current column */
+
+ {
+ gsl_vector_view c = gsl_matrix_column (A, i);
+ gsl_vector_view v = gsl_vector_subvector (&c.vector, i, M - i);
+ double tau_i = gsl_linalg_householder_transform (&v.vector);
+
+ /* Apply the transformation to the remaining columns */
+
+ if (i + 1 < N)
+ {
+ gsl_matrix_view m =
+ gsl_matrix_submatrix (A, i, i + 1, M - i, N - (i + 1));
+ gsl_linalg_householder_hm (tau_i, &v.vector, &m.matrix);
+ }
+
+ gsl_vector_set (tau_U, i, tau_i);
+
+ }
+
+ /* Apply Householder transformation to current row */
+
+ if (i + 1 < N)
+ {
+ gsl_vector_view r = gsl_matrix_row (A, i);
+ gsl_vector_view v = gsl_vector_subvector (&r.vector, i + 1, N - (i + 1));
+ double tau_i = gsl_linalg_householder_transform (&v.vector);
+
+ /* Apply the transformation to the remaining rows */
+
+ if (i + 1 < M)
+ {
+ gsl_matrix_view m =
+ gsl_matrix_submatrix (A, i+1, i+1, M - (i+1), N - (i+1));
+ gsl_linalg_householder_mh (tau_i, &v.vector, &m.matrix);
+ }
+
+ gsl_vector_set (tau_V, i, tau_i);
+ }
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+/* Form the orthogonal matrices U, V, diagonal d and superdiagonal sd
+ from the packed bidiagonal matrix A */
+
+int
+gsl_linalg_bidiag_unpack (const gsl_matrix * A,
+ const gsl_vector * tau_U,
+ gsl_matrix * U,
+ const gsl_vector * tau_V,
+ gsl_matrix * V,
+ gsl_vector * diag,
+ gsl_vector * superdiag)
+{
+ const size_t M = A->size1;
+ const size_t N = A->size2;
+
+ const size_t K = GSL_MIN(M, N);
+
+ if (M < N)
+ {
+ GSL_ERROR ("matrix A must have M >= N", GSL_EBADLEN);
+ }
+ else if (tau_U->size != K)
+ {
+ GSL_ERROR ("size of tau must be MIN(M,N)", GSL_EBADLEN);
+ }
+ else if (tau_V->size + 1 != K)
+ {
+ GSL_ERROR ("size of tau must be MIN(M,N) - 1", GSL_EBADLEN);
+ }
+ else if (U->size1 != M || U->size2 != N)
+ {
+ GSL_ERROR ("size of U must be M x N", GSL_EBADLEN);
+ }
+ else if (V->size1 != N || V->size2 != N)
+ {
+ GSL_ERROR ("size of V must be N x N", GSL_EBADLEN);
+ }
+ else if (diag->size != K)
+ {
+ GSL_ERROR ("size of diagonal must match size of A", GSL_EBADLEN);
+ }
+ else if (superdiag->size + 1 != K)
+ {
+ GSL_ERROR ("size of subdiagonal must be (diagonal size - 1)", GSL_EBADLEN);
+ }
+ else
+ {
+ size_t i, j;
+
+ /* Copy diagonal into diag */
+
+ for (i = 0; i < N; i++)
+ {
+ double Aii = gsl_matrix_get (A, i, i);
+ gsl_vector_set (diag, i, Aii);
+ }
+
+ /* Copy superdiagonal into superdiag */
+
+ for (i = 0; i < N - 1; i++)
+ {
+ double Aij = gsl_matrix_get (A, i, i+1);
+ gsl_vector_set (superdiag, i, Aij);
+ }
+
+ /* Initialize V to the identity */
+
+ gsl_matrix_set_identity (V);
+
+ for (i = N - 1; i > 0 && i--;)
+ {
+ /* Householder row transformation to accumulate V */
+ gsl_vector_const_view r = gsl_matrix_const_row (A, i);
+ gsl_vector_const_view h =
+ gsl_vector_const_subvector (&r.vector, i + 1, N - (i+1));
+
+ double ti = gsl_vector_get (tau_V, i);
+
+ gsl_matrix_view m =
+ gsl_matrix_submatrix (V, i + 1, i + 1, N-(i+1), N-(i+1));
+
+ gsl_linalg_householder_hm (ti, &h.vector, &m.matrix);
+ }
+
+ /* Initialize U to the identity */
+
+ gsl_matrix_set_identity (U);
+
+ for (j = N; j > 0 && j--;)
+ {
+ /* Householder column transformation to accumulate U */
+ gsl_vector_const_view c = gsl_matrix_const_column (A, j);
+ gsl_vector_const_view h = gsl_vector_const_subvector (&c.vector, j, M - j);
+ double tj = gsl_vector_get (tau_U, j);
+
+ gsl_matrix_view m =
+ gsl_matrix_submatrix (U, j, j, M-j, N-j);
+
+ gsl_linalg_householder_hm (tj, &h.vector, &m.matrix);
+ }
+
+ return GSL_SUCCESS;
+ }
+}
+
+int
+gsl_linalg_bidiag_unpack2 (gsl_matrix * A,
+ gsl_vector * tau_U,
+ gsl_vector * tau_V,
+ gsl_matrix * V)
+{
+ const size_t M = A->size1;
+ const size_t N = A->size2;
+
+ const size_t K = GSL_MIN(M, N);
+
+ if (M < N)
+ {
+ GSL_ERROR ("matrix A must have M >= N", GSL_EBADLEN);
+ }
+ else if (tau_U->size != K)
+ {
+ GSL_ERROR ("size of tau must be MIN(M,N)", GSL_EBADLEN);
+ }
+ else if (tau_V->size + 1 != K)
+ {
+ GSL_ERROR ("size of tau must be MIN(M,N) - 1", GSL_EBADLEN);
+ }
+ else if (V->size1 != N || V->size2 != N)
+ {
+ GSL_ERROR ("size of V must be N x N", GSL_EBADLEN);
+ }
+ else
+ {
+ size_t i, j;
+
+ /* Initialize V to the identity */
+
+ gsl_matrix_set_identity (V);
+
+ for (i = N - 1; i > 0 && i--;)
+ {
+ /* Householder row transformation to accumulate V */
+ gsl_vector_const_view r = gsl_matrix_const_row (A, i);
+ gsl_vector_const_view h =
+ gsl_vector_const_subvector (&r.vector, i + 1, N - (i+1));
+
+ double ti = gsl_vector_get (tau_V, i);
+
+ gsl_matrix_view m =
+ gsl_matrix_submatrix (V, i + 1, i + 1, N-(i+1), N-(i+1));
+
+ gsl_linalg_householder_hm (ti, &h.vector, &m.matrix);
+ }
+
+ /* Copy superdiagonal into tau_v */
+
+ for (i = 0; i < N - 1; i++)
+ {
+ double Aij = gsl_matrix_get (A, i, i+1);
+ gsl_vector_set (tau_V, i, Aij);
+ }
+
+ /* Allow U to be unpacked into the same memory as A, copy
+ diagonal into tau_U */
+
+ for (j = N; j > 0 && j--;)
+ {
+ /* Householder column transformation to accumulate U */
+ double tj = gsl_vector_get (tau_U, j);
+ double Ajj = gsl_matrix_get (A, j, j);
+ gsl_matrix_view m = gsl_matrix_submatrix (A, j, j, M-j, N-j);
+
+ gsl_vector_set (tau_U, j, Ajj);
+ gsl_linalg_householder_hm1 (tj, &m.matrix);
+ }
+
+ return GSL_SUCCESS;
+ }
+}
+
+
+int
+gsl_linalg_bidiag_unpack_B (const gsl_matrix * A,
+ gsl_vector * diag,
+ gsl_vector * superdiag)
+{
+ const size_t M = A->size1;
+ const size_t N = A->size2;
+
+ const size_t K = GSL_MIN(M, N);
+
+ if (diag->size != K)
+ {
+ GSL_ERROR ("size of diagonal must match size of A", GSL_EBADLEN);
+ }
+ else if (superdiag->size + 1 != K)
+ {
+ GSL_ERROR ("size of subdiagonal must be (matrix size - 1)", GSL_EBADLEN);
+ }
+ else
+ {
+ size_t i;
+
+ /* Copy diagonal into diag */
+
+ for (i = 0; i < K; i++)
+ {
+ double Aii = gsl_matrix_get (A, i, i);
+ gsl_vector_set (diag, i, Aii);
+ }
+
+ /* Copy superdiagonal into superdiag */
+
+ for (i = 0; i < K - 1; i++)
+ {
+ double Aij = gsl_matrix_get (A, i, i+1);
+ gsl_vector_set (superdiag, i, Aij);
+ }
+
+ return GSL_SUCCESS;
+ }
+}
diff --git a/gsl-1.9/linalg/cholesky.c b/gsl-1.9/linalg/cholesky.c
new file mode 100644
index 0000000..671aa96
--- /dev/null
+++ b/gsl-1.9/linalg/cholesky.c
@@ -0,0 +1,266 @@
+/* Cholesky Decomposition
+ *
+ * Copyright (C) 2000 Thomas Walter
+ *
+ * 03 May 2000: Modified for GSL by Brian Gough
+ * 29 Jul 2005: Additions by Gerard Jungman
+ * Copyright (C) 2000,2001, 2002, 2003, 2005 Brian Gough, Gerard Jungman
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2, or (at your option) any
+ * later version.
+ *
+ * This source is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ */
+
+/*
+ * Cholesky decomposition of a symmetrix positive definite matrix.
+ * This is useful to solve the matrix arising in
+ * periodic cubic splines
+ * approximating splines
+ *
+ * This algorithm does:
+ * A = L * L'
+ * with
+ * L := lower left triangle matrix
+ * L' := the transposed form of L.
+ *
+ */
+
+#include <config.h>
+
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_blas.h>
+#include <gsl/gsl_linalg.h>
+
+static inline
+double
+quiet_sqrt (double x)
+ /* avoids runtime error, for checking matrix for positive definiteness */
+{
+ return (x >= 0) ? sqrt(x) : GSL_NAN;
+}
+
+int
+gsl_linalg_cholesky_decomp (gsl_matrix * A)
+{
+ const size_t M = A->size1;
+ const size_t N = A->size2;
+
+ if (M != N)
+ {
+ GSL_ERROR("cholesky decomposition requires square matrix", GSL_ENOTSQR);
+ }
+ else
+ {
+ size_t i,j,k;
+ int status = 0;
+
+ /* Do the first 2 rows explicitly. It is simple, and faster. And
+ * one can return if the matrix has only 1 or 2 rows.
+ */
+
+ double A_00 = gsl_matrix_get (A, 0, 0);
+
+ double L_00 = quiet_sqrt(A_00);
+
+ if (A_00 <= 0)
+ {
+ status = GSL_EDOM ;
+ }
+
+ gsl_matrix_set (A, 0, 0, L_00);
+
+ if (M > 1)
+ {
+ double A_10 = gsl_matrix_get (A, 1, 0);
+ double A_11 = gsl_matrix_get (A, 1, 1);
+
+ double L_10 = A_10 / L_00;
+ double diag = A_11 - L_10 * L_10;
+ double L_11 = quiet_sqrt(diag);
+
+ if (diag <= 0)
+ {
+ status = GSL_EDOM;
+ }
+
+ gsl_matrix_set (A, 1, 0, L_10);
+ gsl_matrix_set (A, 1, 1, L_11);
+ }
+
+ for (k = 2; k < M; k++)
+ {
+ double A_kk = gsl_matrix_get (A, k, k);
+
+ for (i = 0; i < k; i++)
+ {
+ double sum = 0;
+
+ double A_ki = gsl_matrix_get (A, k, i);
+ double A_ii = gsl_matrix_get (A, i, i);
+
+ gsl_vector_view ci = gsl_matrix_row (A, i);
+ gsl_vector_view ck = gsl_matrix_row (A, k);
+
+ if (i > 0) {
+ gsl_vector_view di = gsl_vector_subvector(&ci.vector, 0, i);
+ gsl_vector_view dk = gsl_vector_subvector(&ck.vector, 0, i);
+
+ gsl_blas_ddot (&di.vector, &dk.vector, &sum);
+ }
+
+ A_ki = (A_ki - sum) / A_ii;
+ gsl_matrix_set (A, k, i, A_ki);
+ }
+
+ {
+ gsl_vector_view ck = gsl_matrix_row (A, k);
+ gsl_vector_view dk = gsl_vector_subvector (&ck.vector, 0, k);
+
+ double sum = gsl_blas_dnrm2 (&dk.vector);
+ double diag = A_kk - sum * sum;
+
+ double L_kk = quiet_sqrt(diag);
+
+ if (diag <= 0)
+ {
+ status = GSL_EDOM;
+ }
+
+ gsl_matrix_set (A, k, k, L_kk);
+ }
+ }
+
+ /* Now copy the transposed lower triangle to the upper triangle,
+ * the diagonal is common.
+ */
+
+ for (i = 1; i < M; i++)
+ {
+ for (j = 0; j < i; j++)
+ {
+ double A_ij = gsl_matrix_get (A, i, j);
+ gsl_matrix_set (A, j, i, A_ij);
+ }
+ }
+
+ if (status == GSL_EDOM)
+ {
+ GSL_ERROR ("matrix must be positive definite", GSL_EDOM);
+ }
+
+ return GSL_SUCCESS;
+ }
+}
+
+
+int
+gsl_linalg_cholesky_solve (const gsl_matrix * LLT,
+ const gsl_vector * b,
+ gsl_vector * x)
+{
+ if (LLT->size1 != LLT->size2)
+ {
+ GSL_ERROR ("cholesky matrix must be square", GSL_ENOTSQR);
+ }
+ else if (LLT->size1 != b->size)
+ {
+ GSL_ERROR ("matrix size must match b size", GSL_EBADLEN);
+ }
+ else if (LLT->size2 != x->size)
+ {
+ GSL_ERROR ("matrix size must match solution size", GSL_EBADLEN);
+ }
+ else
+ {
+ /* Copy x <- b */
+
+ gsl_vector_memcpy (x, b);
+
+ /* Solve for c using forward-substitution, L c = b */
+
+ gsl_blas_dtrsv (CblasLower, CblasNoTrans, CblasNonUnit, LLT, x);
+
+ /* Perform back-substitution, U x = c */
+
+ gsl_blas_dtrsv (CblasUpper, CblasNoTrans, CblasNonUnit, LLT, x);
+
+
+ return GSL_SUCCESS;
+ }
+}
+
+int
+gsl_linalg_cholesky_svx (const gsl_matrix * LLT,
+ gsl_vector * x)
+{
+ if (LLT->size1 != LLT->size2)
+ {
+ GSL_ERROR ("cholesky matrix must be square", GSL_ENOTSQR);
+ }
+ else if (LLT->size2 != x->size)
+ {
+ GSL_ERROR ("matrix size must match solution size", GSL_EBADLEN);
+ }
+ else
+ {
+ /* Solve for c using forward-substitution, L c = b */
+
+ gsl_blas_dtrsv (CblasLower, CblasNoTrans, CblasNonUnit, LLT, x);
+
+ /* Perform back-substitution, U x = c */
+
+ gsl_blas_dtrsv (CblasUpper, CblasNoTrans, CblasNonUnit, LLT, x);
+
+ return GSL_SUCCESS;
+ }
+}
+
+
+int
+gsl_linalg_cholesky_decomp_unit(gsl_matrix * A, gsl_vector * D)
+{
+ const size_t N = A->size1;
+ size_t i, j;
+
+ /* initial Cholesky */
+ int stat_chol = gsl_linalg_cholesky_decomp(A);
+
+ if(stat_chol == GSL_SUCCESS)
+ {
+ /* calculate D from diagonal part of initial Cholesky */
+ for(i = 0; i < N; ++i)
+ {
+ const double C_ii = gsl_matrix_get(A, i, i);
+ gsl_vector_set(D, i, C_ii*C_ii);
+ }
+
+ /* multiply initial Cholesky by 1/sqrt(D) on the right */
+ for(i = 0; i < N; ++i)
+ {
+ for(j = 0; j < N; ++j)
+ {
+ gsl_matrix_set(A, i, j, gsl_matrix_get(A, i, j) / sqrt(gsl_vector_get(D, j)));
+ }
+ }
+
+ /* Because the initial Cholesky contained both L and transpose(L),
+ the result of the multiplication is not symmetric anymore;
+ but the lower triangle _is_ correct. Therefore we reflect
+ it to the upper triangle and declare victory.
+ */
+ for(i = 0; i < N; ++i)
+ for(j = i + 1; j < N; ++j)
+ gsl_matrix_set(A, i, j, gsl_matrix_get(A, j, i));
+ }
+
+ return stat_chol;
+}
diff --git a/gsl-1.9/linalg/exponential.c b/gsl-1.9/linalg/exponential.c
new file mode 100644
index 0000000..3d0df25
--- /dev/null
+++ b/gsl-1.9/linalg/exponential.c
@@ -0,0 +1,187 @@
+/* linalg/exponential.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+/* Calculate the matrix exponential, following
+ * Moler + Van Loan, SIAM Rev. 20, 801 (1978).
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_mode.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_blas.h>
+
+#include "gsl_linalg.h"
+
+
+/* store one of the suggested choices for the
+ * Taylor series / square method from Moler + VanLoan
+ */
+struct moler_vanloan_optimal_suggestion
+{
+ int k;
+ int j;
+};
+typedef struct moler_vanloan_optimal_suggestion mvl_suggestion_t;
+
+
+/* table from Moler and Van Loan
+ * mvl_tab[gsl_mode_t][matrix_norm_group]
+ */
+static mvl_suggestion_t mvl_tab[3][6] =
+{
+ /* double precision */
+ {
+ { 5, 1 }, { 5, 4 }, { 7, 5 }, { 9, 7 }, { 10, 10 }, { 8, 14 }
+ },
+
+ /* single precision */
+ {
+ { 2, 1 }, { 4, 0 }, { 7, 1 }, { 6, 5 }, { 5, 9 }, { 7, 11 }
+ },
+
+ /* approx precision */
+ {
+ { 1, 0 }, { 3, 0 }, { 5, 1 }, { 4, 5 }, { 4, 8 }, { 2, 11 }
+ }
+};
+
+
+inline
+static double
+sup_norm(const gsl_matrix * A)
+{
+ double min, max;
+ gsl_matrix_minmax(A, &min, &max);
+ return GSL_MAX_DBL(fabs(min), fabs(max));
+}
+
+
+static
+mvl_suggestion_t
+obtain_suggestion(const gsl_matrix * A, gsl_mode_t mode)
+{
+ const unsigned int mode_prec = GSL_MODE_PREC(mode);
+ const double norm_A = sup_norm(A);
+ if(norm_A < 0.01) return mvl_tab[mode_prec][0];
+ else if(norm_A < 0.1) return mvl_tab[mode_prec][1];
+ else if(norm_A < 1.0) return mvl_tab[mode_prec][2];
+ else if(norm_A < 10.0) return mvl_tab[mode_prec][3];
+ else if(norm_A < 100.0) return mvl_tab[mode_prec][4];
+ else if(norm_A < 1000.0) return mvl_tab[mode_prec][5];
+ else
+ {
+ /* outside the table we simply increase the number
+ * of squarings, bringing the reduced matrix into
+ * the range of the table; this is obviously suboptimal,
+ * but that is the price paid for not having those extra
+ * table entries
+ */
+ const double extra = log(1.01*norm_A/1000.0) / M_LN2;
+ const int extra_i = (unsigned int) ceil(extra);
+ mvl_suggestion_t s = mvl_tab[mode][5];
+ s.j += extra_i;
+ return s;
+ }
+}
+
+
+/* use series representation to calculate matrix exponential;
+ * this is used for small matrices; we use the sup_norm
+ * to measure the size of the terms in the expansion
+ */
+static void
+matrix_exp_series(
+ const gsl_matrix * B,
+ gsl_matrix * eB,
+ int number_of_terms
+ )
+{
+ int count;
+ gsl_matrix * temp = gsl_matrix_calloc(B->size1, B->size2);
+
+ /* init the Horner polynomial evaluation,
+ * eB = 1 + B/number_of_terms; we use
+ * eB to collect the partial results
+ */
+ gsl_matrix_memcpy(eB, B);
+ gsl_matrix_scale(eB, 1.0/number_of_terms);
+ gsl_matrix_add_diagonal(eB, 1.0);
+ for(count = number_of_terms-1; count >= 1; --count)
+ {
+ /* mult_temp = 1 + B eB / count */
+ gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, B, eB, 0.0, temp);
+ gsl_matrix_scale(temp, 1.0/count);
+ gsl_matrix_add_diagonal(temp, 1.0);
+
+ /* transfer partial result out of temp */
+ gsl_matrix_memcpy(eB, temp);
+ }
+
+ /* now eB holds the full result; we're done */
+ gsl_matrix_free(temp);
+}
+
+
+int
+gsl_linalg_exponential_ss(
+ const gsl_matrix * A,
+ gsl_matrix * eA,
+ gsl_mode_t mode
+ )
+{
+ if(A->size1 != A->size2)
+ {
+ GSL_ERROR("cannot exponentiate a non-square matrix", GSL_ENOTSQR);
+ }
+ else if(A->size1 != eA->size1 || A->size2 != eA->size2)
+ {
+ GSL_ERROR("exponential of matrix must have same dimension as matrix", GSL_EBADLEN);
+ }
+ else
+ {
+ int i;
+ const mvl_suggestion_t sugg = obtain_suggestion(A, mode);
+ const double divisor = exp(M_LN2 * sugg.j);
+
+ gsl_matrix * reduced_A = gsl_matrix_alloc(A->size1, A->size2);
+
+ /* decrease A by the calculated divisor */
+ gsl_matrix_memcpy(reduced_A, A);
+ gsl_matrix_scale(reduced_A, 1.0/divisor);
+
+ /* calculate exp of reduced matrix; store in eA as temp */
+ matrix_exp_series(reduced_A, eA, sugg.k);
+
+ /* square repeatedly; use reduced_A for scratch */
+ for(i = 0; i < sugg.j; ++i)
+ {
+ gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, eA, eA, 0.0, reduced_A);
+ gsl_matrix_memcpy(eA, reduced_A);
+ }
+
+ gsl_matrix_free(reduced_A);
+
+ return GSL_SUCCESS;
+ }
+}
+
diff --git a/gsl-1.9/linalg/givens.c b/gsl-1.9/linalg/givens.c
new file mode 100644
index 0000000..c3875d6
--- /dev/null
+++ b/gsl-1.9/linalg/givens.c
@@ -0,0 +1,46 @@
+/* linalg/givens.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Generate a Givens rotation (cos,sin) which takes v=(x,y) to (|v|,0)
+
+ From Golub and Van Loan, "Matrix Computations", Section 5.1.8 */
+
+inline static void
+create_givens (const double a, const double b, double *c, double *s)
+{
+ if (b == 0)
+ {
+ *c = 1;
+ *s = 0;
+ }
+ else if (fabs (b) > fabs (a))
+ {
+ double t = -a / b;
+ double s1 = 1.0 / sqrt (1 + t * t);
+ *s = s1;
+ *c = s1 * t;
+ }
+ else
+ {
+ double t = -b / a;
+ double c1 = 1.0 / sqrt (1 + t * t);
+ *c = c1;
+ *s = c1 * t;
+ }
+}
diff --git a/gsl-1.9/linalg/gsl_linalg.h b/gsl-1.9/linalg/gsl_linalg.h
new file mode 100644
index 0000000..94103f1
--- /dev/null
+++ b/gsl-1.9/linalg/gsl_linalg.h
@@ -0,0 +1,560 @@
+/* linalg/gsl_linalg.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_LINALG_H__
+#define __GSL_LINALG_H__
+
+#include <gsl/gsl_mode.h>
+#include <gsl/gsl_permutation.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_matrix.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+#define __BEGIN_DECLS extern "C" {
+#define __END_DECLS }
+#else
+#define __BEGIN_DECLS /* empty */
+#define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+typedef enum
+ {
+ GSL_LINALG_MOD_NONE = 0,
+ GSL_LINALG_MOD_TRANSPOSE = 1,
+ GSL_LINALG_MOD_CONJUGATE = 2
+ }
+gsl_linalg_matrix_mod_t;
+
+
+/* Note: You can now use the gsl_blas_dgemm function instead of matmult */
+
+/* Simple implementation of matrix multiply.
+ * Calculates C = A.B
+ *
+ * exceptions: GSL_EBADLEN
+ */
+int gsl_linalg_matmult (const gsl_matrix * A,
+ const gsl_matrix * B,
+ gsl_matrix * C);
+
+
+/* Simple implementation of matrix multiply.
+ * Allows transposition of either matrix, so it
+ * can compute A.B or Trans(A).B or A.Trans(B) or Trans(A).Trans(B)
+ *
+ * exceptions: GSL_EBADLEN
+ */
+int gsl_linalg_matmult_mod (const gsl_matrix * A,
+ gsl_linalg_matrix_mod_t modA,
+ const gsl_matrix * B,
+ gsl_linalg_matrix_mod_t modB,
+ gsl_matrix * C);
+
+/* Calculate the matrix exponential by the scaling and
+ * squaring method described in Moler + Van Loan,
+ * SIAM Rev 20, 801 (1978). The mode argument allows
+ * choosing an optimal strategy, from the table
+ * given in the paper, for a given precision.
+ *
+ * exceptions: GSL_ENOTSQR, GSL_EBADLEN
+ */
+int gsl_linalg_exponential_ss(
+ const gsl_matrix * A,
+ gsl_matrix * eA,
+ gsl_mode_t mode
+ );
+
+
+/* Householder Transformations */
+
+double gsl_linalg_householder_transform (gsl_vector * v);
+gsl_complex gsl_linalg_complex_householder_transform (gsl_vector_complex * v);
+
+int gsl_linalg_householder_hm (double tau,
+ const gsl_vector * v,
+ gsl_matrix * A);
+
+int gsl_linalg_householder_mh (double tau,
+ const gsl_vector * v,
+ gsl_matrix * A);
+
+int gsl_linalg_householder_hv (double tau,
+ const gsl_vector * v,
+ gsl_vector * w);
+
+int gsl_linalg_householder_hm1 (double tau,
+ gsl_matrix * A);
+
+int gsl_linalg_complex_householder_hm (gsl_complex tau,
+ const gsl_vector_complex * v,
+ gsl_matrix_complex * A);
+
+int gsl_linalg_complex_householder_hv (gsl_complex tau,
+ const gsl_vector_complex * v,
+ gsl_vector_complex * w);
+
+/* Hessenberg reduction */
+
+int gsl_linalg_hessenberg(gsl_matrix *A, gsl_vector *tau);
+int gsl_linalg_hessenberg_unpack(gsl_matrix * H, gsl_vector * tau,
+ gsl_matrix * U);
+int gsl_linalg_hessenberg_unpack_accum(gsl_matrix * H, gsl_vector * tau,
+ gsl_matrix * U);
+void gsl_linalg_hessenberg_set_zero(gsl_matrix * H);
+int gsl_linalg_hessenberg_submatrix(gsl_matrix *M, gsl_matrix *A,
+ size_t top, gsl_vector *tau);
+
+/* Singular Value Decomposition
+
+ * exceptions:
+ */
+
+int
+gsl_linalg_SV_decomp (gsl_matrix * A,
+ gsl_matrix * V,
+ gsl_vector * S,
+ gsl_vector * work);
+
+int
+gsl_linalg_SV_decomp_mod (gsl_matrix * A,
+ gsl_matrix * X,
+ gsl_matrix * V,
+ gsl_vector * S,
+ gsl_vector * work);
+
+int gsl_linalg_SV_decomp_jacobi (gsl_matrix * A,
+ gsl_matrix * Q,
+ gsl_vector * S);
+
+int
+gsl_linalg_SV_solve (const gsl_matrix * U,
+ const gsl_matrix * Q,
+ const gsl_vector * S,
+ const gsl_vector * b,
+ gsl_vector * x);
+
+
+/* LU Decomposition, Gaussian elimination with partial pivoting
+ */
+
+int gsl_linalg_LU_decomp (gsl_matrix * A, gsl_permutation * p, int *signum);
+
+int gsl_linalg_LU_solve (const gsl_matrix * LU,
+ const gsl_permutation * p,
+ const gsl_vector * b,
+ gsl_vector * x);
+
+int gsl_linalg_LU_svx (const gsl_matrix * LU,
+ const gsl_permutation * p,
+ gsl_vector * x);
+
+int gsl_linalg_LU_refine (const gsl_matrix * A,
+ const gsl_matrix * LU,
+ const gsl_permutation * p,
+ const gsl_vector * b,
+ gsl_vector * x,
+ gsl_vector * residual);
+
+int gsl_linalg_LU_invert (const gsl_matrix * LU,
+ const gsl_permutation * p,
+ gsl_matrix * inverse);
+
+double gsl_linalg_LU_det (gsl_matrix * LU, int signum);
+double gsl_linalg_LU_lndet (gsl_matrix * LU);
+int gsl_linalg_LU_sgndet (gsl_matrix * lu, int signum);
+
+/* Complex LU Decomposition */
+
+int gsl_linalg_complex_LU_decomp (gsl_matrix_complex * A,
+ gsl_permutation * p,
+ int *signum);
+
+int gsl_linalg_complex_LU_solve (const gsl_matrix_complex * LU,
+ const gsl_permutation * p,
+ const gsl_vector_complex * b,
+ gsl_vector_complex * x);
+
+int gsl_linalg_complex_LU_svx (const gsl_matrix_complex * LU,
+ const gsl_permutation * p,
+ gsl_vector_complex * x);
+
+int gsl_linalg_complex_LU_refine (const gsl_matrix_complex * A,
+ const gsl_matrix_complex * LU,
+ const gsl_permutation * p,
+ const gsl_vector_complex * b,
+ gsl_vector_complex * x,
+ gsl_vector_complex * residual);
+
+int gsl_linalg_complex_LU_invert (const gsl_matrix_complex * LU,
+ const gsl_permutation * p,
+ gsl_matrix_complex * inverse);
+
+gsl_complex gsl_linalg_complex_LU_det (gsl_matrix_complex * LU,
+ int signum);
+
+double gsl_linalg_complex_LU_lndet (gsl_matrix_complex * LU);
+
+gsl_complex gsl_linalg_complex_LU_sgndet (gsl_matrix_complex * LU,
+ int signum);
+
+/* QR decomposition */
+
+int gsl_linalg_QR_decomp (gsl_matrix * A,
+ gsl_vector * tau);
+
+int gsl_linalg_QR_solve (const gsl_matrix * QR,
+ const gsl_vector * tau,
+ const gsl_vector * b,
+ gsl_vector * x);
+
+int gsl_linalg_QR_svx (const gsl_matrix * QR,
+ const gsl_vector * tau,
+ gsl_vector * x);
+
+int gsl_linalg_QR_lssolve (const gsl_matrix * QR,
+ const gsl_vector * tau,
+ const gsl_vector * b,
+ gsl_vector * x,
+ gsl_vector * residual);
+
+
+int gsl_linalg_QR_QRsolve (gsl_matrix * Q,
+ gsl_matrix * R,
+ const gsl_vector * b,
+ gsl_vector * x);
+
+int gsl_linalg_QR_Rsolve (const gsl_matrix * QR,
+ const gsl_vector * b,
+ gsl_vector * x);
+
+int gsl_linalg_QR_Rsvx (const gsl_matrix * QR,
+ gsl_vector * x);
+
+int gsl_linalg_QR_update (gsl_matrix * Q,
+ gsl_matrix * R,
+ gsl_vector * w,
+ const gsl_vector * v);
+
+int gsl_linalg_QR_QTvec (const gsl_matrix * QR,
+ const gsl_vector * tau,
+ gsl_vector * v);
+
+int gsl_linalg_QR_Qvec (const gsl_matrix * QR,
+ const gsl_vector * tau,
+ gsl_vector * v);
+
+int gsl_linalg_QR_unpack (const gsl_matrix * QR,
+ const gsl_vector * tau,
+ gsl_matrix * Q,
+ gsl_matrix * R);
+
+int gsl_linalg_R_solve (const gsl_matrix * R,
+ const gsl_vector * b,
+ gsl_vector * x);
+
+int gsl_linalg_R_svx (const gsl_matrix * R,
+ gsl_vector * x);
+
+
+/* Q R P^T decomposition */
+
+int gsl_linalg_QRPT_decomp (gsl_matrix * A,
+ gsl_vector * tau,
+ gsl_permutation * p,
+ int *signum,
+ gsl_vector * norm);
+
+int gsl_linalg_QRPT_decomp2 (const gsl_matrix * A,
+ gsl_matrix * q, gsl_matrix * r,
+ gsl_vector * tau,
+ gsl_permutation * p,
+ int *signum,
+ gsl_vector * norm);
+
+int gsl_linalg_QRPT_solve (const gsl_matrix * QR,
+ const gsl_vector * tau,
+ const gsl_permutation * p,
+ const gsl_vector * b,
+ gsl_vector * x);
+
+
+int gsl_linalg_QRPT_svx (const gsl_matrix * QR,
+ const gsl_vector * tau,
+ const gsl_permutation * p,
+ gsl_vector * x);
+
+int gsl_linalg_QRPT_QRsolve (const gsl_matrix * Q,
+ const gsl_matrix * R,
+ const gsl_permutation * p,
+ const gsl_vector * b,
+ gsl_vector * x);
+
+int gsl_linalg_QRPT_Rsolve (const gsl_matrix * QR,
+ const gsl_permutation * p,
+ const gsl_vector * b,
+ gsl_vector * x);
+
+int gsl_linalg_QRPT_Rsvx (const gsl_matrix * QR,
+ const gsl_permutation * p,
+ gsl_vector * x);
+
+int gsl_linalg_QRPT_update (gsl_matrix * Q,
+ gsl_matrix * R,
+ const gsl_permutation * p,
+ gsl_vector * u,
+ const gsl_vector * v);
+
+/* LQ decomposition */
+
+int gsl_linalg_LQ_decomp (gsl_matrix * A, gsl_vector * tau);
+
+int gsl_linalg_LQ_solve_T (const gsl_matrix * LQ, const gsl_vector * tau,
+ const gsl_vector * b, gsl_vector * x);
+
+int gsl_linalg_LQ_svx_T (const gsl_matrix * LQ, const gsl_vector * tau,
+ gsl_vector * x);
+
+int gsl_linalg_LQ_lssolve_T (const gsl_matrix * LQ, const gsl_vector * tau,
+ const gsl_vector * b, gsl_vector * x,
+ gsl_vector * residual);
+
+int gsl_linalg_LQ_Lsolve_T (const gsl_matrix * LQ, const gsl_vector * b,
+ gsl_vector * x);
+
+int gsl_linalg_LQ_Lsvx_T (const gsl_matrix * LQ, gsl_vector * x);
+
+int gsl_linalg_L_solve_T (const gsl_matrix * L, const gsl_vector * b,
+ gsl_vector * x);
+
+int gsl_linalg_LQ_vecQ (const gsl_matrix * LQ, const gsl_vector * tau,
+ gsl_vector * v);
+
+int gsl_linalg_LQ_vecQT (const gsl_matrix * LQ, const gsl_vector * tau,
+ gsl_vector * v);
+
+int gsl_linalg_LQ_unpack (const gsl_matrix * LQ, const gsl_vector * tau,
+ gsl_matrix * Q, gsl_matrix * L);
+
+int gsl_linalg_LQ_update (gsl_matrix * Q, gsl_matrix * R,
+ const gsl_vector * v, gsl_vector * w);
+int gsl_linalg_LQ_LQsolve (gsl_matrix * Q, gsl_matrix * L,
+ const gsl_vector * b, gsl_vector * x);
+
+/* P^T L Q decomposition */
+
+int gsl_linalg_PTLQ_decomp (gsl_matrix * A, gsl_vector * tau,
+ gsl_permutation * p, int *signum,
+ gsl_vector * norm);
+
+int gsl_linalg_PTLQ_decomp2 (const gsl_matrix * A, gsl_matrix * q,
+ gsl_matrix * r, gsl_vector * tau,
+ gsl_permutation * p, int *signum,
+ gsl_vector * norm);
+
+int gsl_linalg_PTLQ_solve_T (const gsl_matrix * QR,
+ const gsl_vector * tau,
+ const gsl_permutation * p,
+ const gsl_vector * b,
+ gsl_vector * x);
+
+int gsl_linalg_PTLQ_svx_T (const gsl_matrix * LQ,
+ const gsl_vector * tau,
+ const gsl_permutation * p,
+ gsl_vector * x);
+
+int gsl_linalg_PTLQ_LQsolve_T (const gsl_matrix * Q, const gsl_matrix * L,
+ const gsl_permutation * p,
+ const gsl_vector * b,
+ gsl_vector * x);
+
+int gsl_linalg_PTLQ_Lsolve_T (const gsl_matrix * LQ,
+ const gsl_permutation * p,
+ const gsl_vector * b,
+ gsl_vector * x);
+
+int gsl_linalg_PTLQ_Lsvx_T (const gsl_matrix * LQ,
+ const gsl_permutation * p,
+ gsl_vector * x);
+
+int gsl_linalg_PTLQ_update (gsl_matrix * Q, gsl_matrix * L,
+ const gsl_permutation * p,
+ const gsl_vector * v, gsl_vector * w);
+
+/* Cholesky Decomposition */
+
+int gsl_linalg_cholesky_decomp (gsl_matrix * A);
+
+int gsl_linalg_cholesky_solve (const gsl_matrix * cholesky,
+ const gsl_vector * b,
+ gsl_vector * x);
+
+int gsl_linalg_cholesky_svx (const gsl_matrix * cholesky,
+ gsl_vector * x);
+
+
+/* Cholesky decomposition with unit-diagonal triangular parts.
+ * A = L D L^T, where diag(L) = (1,1,...,1).
+ * Upon exit, A contains L and L^T as for Cholesky, and
+ * the diagonal of A is (1,1,...,1). The vector Dis set
+ * to the diagonal elements of the diagonal matrix D.
+ */
+int gsl_linalg_cholesky_decomp_unit(gsl_matrix * A, gsl_vector * D);
+
+
+/* Symmetric to symmetric tridiagonal decomposition */
+
+int gsl_linalg_symmtd_decomp (gsl_matrix * A,
+ gsl_vector * tau);
+
+int gsl_linalg_symmtd_unpack (const gsl_matrix * A,
+ const gsl_vector * tau,
+ gsl_matrix * Q,
+ gsl_vector * diag,
+ gsl_vector * subdiag);
+
+int gsl_linalg_symmtd_unpack_T (const gsl_matrix * A,
+ gsl_vector * diag,
+ gsl_vector * subdiag);
+
+/* Hermitian to symmetric tridiagonal decomposition */
+
+int gsl_linalg_hermtd_decomp (gsl_matrix_complex * A,
+ gsl_vector_complex * tau);
+
+int gsl_linalg_hermtd_unpack (const gsl_matrix_complex * A,
+ const gsl_vector_complex * tau,
+ gsl_matrix_complex * Q,
+ gsl_vector * diag,
+ gsl_vector * sudiag);
+
+int gsl_linalg_hermtd_unpack_T (const gsl_matrix_complex * A,
+ gsl_vector * diag,
+ gsl_vector * subdiag);
+
+/* Linear Solve Using Householder Transformations
+
+ * exceptions:
+ */
+
+int gsl_linalg_HH_solve (gsl_matrix * A, const gsl_vector * b, gsl_vector * x);
+int gsl_linalg_HH_svx (gsl_matrix * A, gsl_vector * x);
+
+/* Linear solve for a symmetric tridiagonal system.
+
+ * The input vectors represent the NxN matrix as follows:
+ *
+ * diag[0] offdiag[0] 0 ...
+ * offdiag[0] diag[1] offdiag[1] ...
+ * 0 offdiag[1] diag[2] ...
+ * 0 0 offdiag[2] ...
+ * ... ... ... ...
+ */
+int gsl_linalg_solve_symm_tridiag (const gsl_vector * diag,
+ const gsl_vector * offdiag,
+ const gsl_vector * b,
+ gsl_vector * x);
+
+/* Linear solve for a nonsymmetric tridiagonal system.
+
+ * The input vectors represent the NxN matrix as follows:
+ *
+ * diag[0] abovediag[0] 0 ...
+ * belowdiag[0] diag[1] abovediag[1] ...
+ * 0 belowdiag[1] diag[2] ...
+ * 0 0 belowdiag[2] ...
+ * ... ... ... ...
+ */
+int gsl_linalg_solve_tridiag (const gsl_vector * diag,
+ const gsl_vector * abovediag,
+ const gsl_vector * belowdiag,
+ const gsl_vector * b,
+ gsl_vector * x);
+
+
+/* Linear solve for a symmetric cyclic tridiagonal system.
+
+ * The input vectors represent the NxN matrix as follows:
+ *
+ * diag[0] offdiag[0] 0 ..... offdiag[N-1]
+ * offdiag[0] diag[1] offdiag[1] .....
+ * 0 offdiag[1] diag[2] .....
+ * 0 0 offdiag[2] .....
+ * ... ...
+ * offdiag[N-1] ...
+ */
+int gsl_linalg_solve_symm_cyc_tridiag (const gsl_vector * diag,
+ const gsl_vector * offdiag,
+ const gsl_vector * b,
+ gsl_vector * x);
+
+/* Linear solve for a nonsymmetric cyclic tridiagonal system.
+
+ * The input vectors represent the NxN matrix as follows:
+ *
+ * diag[0] abovediag[0] 0 ..... belowdiag[N-1]
+ * belowdiag[0] diag[1] abovediag[1] .....
+ * 0 belowdiag[1] diag[2]
+ * 0 0 belowdiag[2] .....
+ * ... ...
+ * abovediag[N-1] ...
+ */
+int gsl_linalg_solve_cyc_tridiag (const gsl_vector * diag,
+ const gsl_vector * abovediag,
+ const gsl_vector * belowdiag,
+ const gsl_vector * b,
+ gsl_vector * x);
+
+
+/* Bidiagonal decomposition */
+
+int gsl_linalg_bidiag_decomp (gsl_matrix * A,
+ gsl_vector * tau_U,
+ gsl_vector * tau_V);
+
+int gsl_linalg_bidiag_unpack (const gsl_matrix * A,
+ const gsl_vector * tau_U,
+ gsl_matrix * U,
+ const gsl_vector * tau_V,
+ gsl_matrix * V,
+ gsl_vector * diag,
+ gsl_vector * superdiag);
+
+int gsl_linalg_bidiag_unpack2 (gsl_matrix * A,
+ gsl_vector * tau_U,
+ gsl_vector * tau_V,
+ gsl_matrix * V);
+
+int gsl_linalg_bidiag_unpack_B (const gsl_matrix * A,
+ gsl_vector * diag,
+ gsl_vector * superdiag);
+
+/* Balancing */
+
+int gsl_linalg_balance_matrix (gsl_matrix * A, gsl_vector * D);
+int gsl_linalg_balance_accum (gsl_matrix * A, gsl_vector * D);
+int gsl_linalg_balance_columns (gsl_matrix * A, gsl_vector * D);
+
+
+__END_DECLS
+
+#endif /* __GSL_LINALG_H__ */
diff --git a/gsl-1.9/linalg/hermtd.c b/gsl-1.9/linalg/hermtd.c
new file mode 100644
index 0000000..30c8cbb
--- /dev/null
+++ b/gsl-1.9/linalg/hermtd.c
@@ -0,0 +1,240 @@
+/* linalg/hermtd.c
+ *
+ * Copyright (C) 2001 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Factorise a hermitian matrix A into
+ *
+ * A = U T U'
+ *
+ * where U is unitary and T is real symmetric tridiagonal. Only the
+ * diagonal and lower triangular part of A is referenced and modified.
+ *
+ * On exit, T is stored in the diagonal and first subdiagonal of
+ * A. Since T is symmetric the upper diagonal is not stored.
+ *
+ * U is stored as a packed set of Householder transformations in the
+ * lower triangular part of the input matrix below the first subdiagonal.
+ *
+ * The full matrix for Q can be obtained as the product
+ *
+ * Q = Q_N ... Q_2 Q_1
+ *
+ * where
+ *
+ * Q_i = (I - tau_i * v_i * v_i')
+ *
+ * and where v_i is a Householder vector
+ *
+ * v_i = [0, ..., 0, 1, A(i+2,i), A(i+3,i), ... , A(N,i)]
+ *
+ * This storage scheme is the same as in LAPACK. See LAPACK's
+ * chetd2.f for details.
+ *
+ * See Golub & Van Loan, "Matrix Computations" (3rd ed), Section 8.3 */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_blas.h>
+#include <gsl/gsl_complex_math.h>
+
+#include <gsl/gsl_linalg.h>
+
+int
+gsl_linalg_hermtd_decomp (gsl_matrix_complex * A, gsl_vector_complex * tau)
+{
+ if (A->size1 != A->size2)
+ {
+ GSL_ERROR ("hermitian tridiagonal decomposition requires square matrix",
+ GSL_ENOTSQR);
+ }
+ else if (tau->size + 1 != A->size1)
+ {
+ GSL_ERROR ("size of tau must be (matrix size - 1)", GSL_EBADLEN);
+ }
+ else
+ {
+ const size_t N = A->size1;
+ size_t i;
+
+ const gsl_complex zero = gsl_complex_rect (0.0, 0.0);
+ const gsl_complex one = gsl_complex_rect (1.0, 0.0);
+ const gsl_complex neg_one = gsl_complex_rect (-1.0, 0.0);
+
+ for (i = 0 ; i < N - 1; i++)
+ {
+ gsl_vector_complex_view c = gsl_matrix_complex_column (A, i);
+ gsl_vector_complex_view v = gsl_vector_complex_subvector (&c.vector, i + 1, N - (i + 1));
+ gsl_complex tau_i = gsl_linalg_complex_householder_transform (&v.vector);
+
+ /* Apply the transformation H^T A H to the remaining columns */
+
+ if ((i + 1) < (N - 1)
+ && !(GSL_REAL(tau_i) == 0.0 && GSL_IMAG(tau_i) == 0.0))
+ {
+ gsl_matrix_complex_view m =
+ gsl_matrix_complex_submatrix (A, i + 1, i + 1,
+ N - (i+1), N - (i+1));
+ gsl_complex ei = gsl_vector_complex_get(&v.vector, 0);
+ gsl_vector_complex_view x = gsl_vector_complex_subvector (tau, i, N-(i+1));
+ gsl_vector_complex_set (&v.vector, 0, one);
+
+ /* x = tau * A * v */
+ gsl_blas_zhemv (CblasLower, tau_i, &m.matrix, &v.vector, zero, &x.vector);
+
+ /* w = x - (1/2) tau * (x' * v) * v */
+ {
+ gsl_complex xv, txv, alpha;
+ gsl_blas_zdotc(&x.vector, &v.vector, &xv);
+ txv = gsl_complex_mul(tau_i, xv);
+ alpha = gsl_complex_mul_real(txv, -0.5);
+ gsl_blas_zaxpy(alpha, &v.vector, &x.vector);
+ }
+
+ /* apply the transformation A = A - v w' - w v' */
+ gsl_blas_zher2(CblasLower, neg_one, &v.vector, &x.vector, &m.matrix);
+
+ gsl_vector_complex_set (&v.vector, 0, ei);
+ }
+
+ gsl_vector_complex_set (tau, i, tau_i);
+ }
+
+ return GSL_SUCCESS;
+ }
+}
+
+
+/* Form the orthogonal matrix Q from the packed QR matrix */
+
+int
+gsl_linalg_hermtd_unpack (const gsl_matrix_complex * A,
+ const gsl_vector_complex * tau,
+ gsl_matrix_complex * Q,
+ gsl_vector * diag,
+ gsl_vector * sdiag)
+{
+ if (A->size1 != A->size2)
+ {
+ GSL_ERROR ("matrix A must be sqaure", GSL_ENOTSQR);
+ }
+ else if (tau->size + 1 != A->size1)
+ {
+ GSL_ERROR ("size of tau must be (matrix size - 1)", GSL_EBADLEN);
+ }
+ else if (Q->size1 != A->size1 || Q->size2 != A->size1)
+ {
+ GSL_ERROR ("size of Q must match size of A", GSL_EBADLEN);
+ }
+ else if (diag->size != A->size1)
+ {
+ GSL_ERROR ("size of diagonal must match size of A", GSL_EBADLEN);
+ }
+ else if (sdiag->size + 1 != A->size1)
+ {
+ GSL_ERROR ("size of subdiagonal must be (matrix size - 1)", GSL_EBADLEN);
+ }
+ else
+ {
+ const size_t N = A->size1;
+
+ size_t i;
+
+ /* Initialize Q to the identity */
+
+ gsl_matrix_complex_set_identity (Q);
+
+ for (i = N - 1; i > 0 && i--;)
+ {
+ gsl_complex ti = gsl_vector_complex_get (tau, i);
+
+ gsl_vector_complex_const_view c = gsl_matrix_complex_const_column (A, i);
+
+ gsl_vector_complex_const_view h =
+ gsl_vector_complex_const_subvector (&c.vector, i + 1, N - (i+1));
+
+ gsl_matrix_complex_view m =
+ gsl_matrix_complex_submatrix (Q, i + 1, i + 1, N-(i+1), N-(i+1));
+
+ gsl_linalg_complex_householder_hm (ti, &h.vector, &m.matrix);
+ }
+
+ /* Copy diagonal into diag */
+
+ for (i = 0; i < N; i++)
+ {
+ gsl_complex Aii = gsl_matrix_complex_get (A, i, i);
+ gsl_vector_set (diag, i, GSL_REAL(Aii));
+ }
+
+ /* Copy subdiagonal into sdiag */
+
+ for (i = 0; i < N - 1; i++)
+ {
+ gsl_complex Aji = gsl_matrix_complex_get (A, i+1, i);
+ gsl_vector_set (sdiag, i, GSL_REAL(Aji));
+ }
+
+ return GSL_SUCCESS;
+ }
+}
+
+int
+gsl_linalg_hermtd_unpack_T (const gsl_matrix_complex * A,
+ gsl_vector * diag,
+ gsl_vector * sdiag)
+{
+ if (A->size1 != A->size2)
+ {
+ GSL_ERROR ("matrix A must be sqaure", GSL_ENOTSQR);
+ }
+ else if (diag->size != A->size1)
+ {
+ GSL_ERROR ("size of diagonal must match size of A", GSL_EBADLEN);
+ }
+ else if (sdiag->size + 1 != A->size1)
+ {
+ GSL_ERROR ("size of subdiagonal must be (matrix size - 1)", GSL_EBADLEN);
+ }
+ else
+ {
+ const size_t N = A->size1;
+
+ size_t i;
+
+ /* Copy diagonal into diag */
+
+ for (i = 0; i < N; i++)
+ {
+ gsl_complex Aii = gsl_matrix_complex_get (A, i, i);
+ gsl_vector_set (diag, i, GSL_REAL(Aii));
+ }
+
+ /* Copy subdiagonal into sd */
+
+ for (i = 0; i < N - 1; i++)
+ {
+ gsl_complex Aji = gsl_matrix_complex_get (A, i+1, i);
+ gsl_vector_set (sdiag, i, GSL_REAL(Aji));
+ }
+
+ return GSL_SUCCESS;
+ }
+}
diff --git a/gsl-1.9/linalg/hessenberg.c b/gsl-1.9/linalg/hessenberg.c
new file mode 100644
index 0000000..de9a47a
--- /dev/null
+++ b/gsl-1.9/linalg/hessenberg.c
@@ -0,0 +1,430 @@
+/* linalg/hessenberg.c
+ *
+ * Copyright (C) 2006 Patrick Alken
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_linalg.h>
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_vector.h>
+
+/*
+gsl_linalg_hessenberg()
+ Compute the Householder reduction to Hessenberg form of a
+square N-by-N matrix A.
+
+H = U^t A U
+
+See Golub & Van Loan, "Matrix Computations" (3rd ed), algorithm
+7.4.2
+
+Inputs: A - matrix to reduce
+ tau - where to store scalar factors in Householder
+ matrices; this vector must be of length N,
+ where N is the order of A
+
+Return: GSL_SUCCESS unless error occurs
+
+Notes: on output, the upper triangular portion of A (including
+the diagaonal and subdiagonal) contains the Hessenberg matrix.
+The lower triangular portion (below the subdiagonal) contains
+the Householder vectors which can be used to construct
+the similarity transform matrix U.
+
+The matrix U is
+
+U = U(1) U(2) ... U(n - 2)
+
+where
+
+U(i) = I - tau(i) * v(i) * v(i)^t
+
+and the vector v(i) is stored in column i of the matrix A
+underneath the subdiagonal. So the first element of v(i)
+is stored in row i + 2, column i, the second element at
+row i + 3, column i, and so on.
+
+Also note that for the purposes of computing U(i),
+v(1:i) = 0, v(i + 1) = 1, and v(i+2:n) is what is stored in
+column i of A beneath the subdiagonal.
+*/
+
+int
+gsl_linalg_hessenberg(gsl_matrix *A, gsl_vector *tau)
+{
+ const size_t N = A->size1;
+
+ if (N != A->size2)
+ {
+ GSL_ERROR ("Hessenberg reduction requires square matrix",
+ GSL_ENOTSQR);
+ }
+ else if (N != tau->size)
+ {
+ GSL_ERROR ("tau vector must match matrix size", GSL_EBADLEN);
+ }
+ else if (N < 3)
+ {
+ /* nothing to do */
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ size_t i; /* looping */
+ gsl_vector_view c, /* matrix column */
+ hv; /* householder vector */
+ gsl_matrix_view m;
+ double tau_i; /* beta in algorithm 7.4.2 */
+
+ for (i = 0; i < N - 2; ++i)
+ {
+ /*
+ * make a copy of A(i + 1:n, i) and store it in the section
+ * of 'tau' that we haven't stored coefficients in yet
+ */
+
+ c = gsl_matrix_column(A, i);
+ c = gsl_vector_subvector(&c.vector, i + 1, N - (i + 1));
+
+ hv = gsl_vector_subvector(tau, i + 1, N - (i + 1));
+ gsl_vector_memcpy(&hv.vector, &c.vector);
+
+ /* compute householder transformation of A(i+1:n,i) */
+ tau_i = gsl_linalg_householder_transform(&hv.vector);
+
+ /* apply left householder matrix (I - tau_i v v') to A */
+ m = gsl_matrix_submatrix(A, i + 1, i, N - (i + 1), N - i);
+ gsl_linalg_householder_hm(tau_i, &hv.vector, &m.matrix);
+
+ /* apply right householder matrix (I - tau_i v v') to A */
+ m = gsl_matrix_submatrix(A, 0, i + 1, N, N - (i + 1));
+ gsl_linalg_householder_mh(tau_i, &hv.vector, &m.matrix);
+
+ /* save Householder coefficient */
+ gsl_vector_set(tau, i, tau_i);
+
+ /*
+ * store Householder vector below the subdiagonal in column
+ * i of the matrix. hv(1) does not need to be stored since
+ * it is always 1.
+ */
+ c = gsl_vector_subvector(&c.vector, 1, c.vector.size - 1);
+ hv = gsl_vector_subvector(&hv.vector, 1, hv.vector.size - 1);
+ gsl_vector_memcpy(&c.vector, &hv.vector);
+ }
+
+ return GSL_SUCCESS;
+ }
+} /* gsl_linalg_hessenberg() */
+
+/*
+gsl_linalg_hessenberg_unpack()
+ Construct the matrix U which transforms a matrix A into
+its upper Hessenberg form:
+
+H = U^t A U
+
+by unpacking the information stored in H from gsl_linalg_hessenberg().
+
+U is a product of Householder matrices:
+
+U = U(1) U(2) ... U(n - 2)
+
+where
+
+U(i) = I - tau(i) * v(i) * v(i)^t
+
+The v(i) are stored in the lower triangular part of H by
+gsl_linalg_hessenberg(). The tau(i) are stored in the vector tau.
+
+Inputs: H - Hessenberg matrix computed from
+ gsl_linalg_hessenberg()
+ tau - tau vector computed from gsl_linalg_hessenberg()
+ U - (output) where to store similarity matrix
+
+Return: success or error
+*/
+
+int
+gsl_linalg_hessenberg_unpack(gsl_matrix * H, gsl_vector * tau,
+ gsl_matrix * U)
+{
+ int s;
+
+ gsl_matrix_set_identity(U);
+
+ s = gsl_linalg_hessenberg_unpack_accum(H, tau, U);
+
+ return s;
+} /* gsl_linalg_hessenberg_unpack() */
+
+/*
+gsl_linalg_hessenberg_unpack_accum()
+ This routine is the same as gsl_linalg_hessenberg_unpack(), except
+instead of storing the similarity matrix in U, it accumulates it,
+so that
+
+U -> U * [ U(1) U(2) ... U(n - 2) ]
+
+instead of:
+
+U -> U(1) U(2) ... U(n - 2)
+
+Inputs: H - Hessenberg matrix computed from
+ gsl_linalg_hessenberg()
+ tau - tau vector computed from gsl_linalg_hessenberg()
+ V - (input/output) where to accumulate similarity matrix
+
+Return: success or error
+
+Notes: 1) On input, V needs to be initialized. The Householder matrices
+ are accumulated into V, so on output,
+
+ V_out = V_in * U(1) * U(2) * ... * U(n - 2)
+
+ so if you just want the product of the Householder matrices,
+ initialize V to the identity matrix before calling this
+ function.
+
+ 2) V does not have to be square, but must have the same
+ number of columns as the order of H
+*/
+
+int
+gsl_linalg_hessenberg_unpack_accum(gsl_matrix * H, gsl_vector * tau,
+ gsl_matrix * V)
+{
+ const size_t N = H->size1;
+
+ if (N != H->size2)
+ {
+ GSL_ERROR ("Hessenberg reduction requires square matrix",
+ GSL_ENOTSQR);
+ }
+ else if (N != tau->size)
+ {
+ GSL_ERROR ("tau vector must match matrix size", GSL_EBADLEN);
+ }
+ else if (N != V->size2)
+ {
+ GSL_ERROR ("V matrix has wrong dimension", GSL_EBADLEN);
+ }
+ else
+ {
+ size_t j; /* looping */
+ double tau_j; /* householder coefficient */
+ gsl_vector_view c, /* matrix column */
+ hv; /* householder vector */
+ gsl_matrix_view m;
+
+ if (N < 3)
+ {
+ /* nothing to do */
+ return GSL_SUCCESS;
+ }
+
+ for (j = 0; j < (N - 2); ++j)
+ {
+ c = gsl_matrix_column(H, j);
+
+ tau_j = gsl_vector_get(tau, j);
+
+ /*
+ * get a view to the householder vector in column j, but
+ * make sure hv(2) starts at the element below the
+ * subdiagonal, since hv(1) was never stored and is always
+ * 1
+ */
+ hv = gsl_vector_subvector(&c.vector, j + 1, N - (j + 1));
+
+ /*
+ * Only operate on part of the matrix since the first
+ * j + 1 entries of the real householder vector are 0
+ *
+ * V -> V * U(j)
+ *
+ * Note here that V->size1 is not necessarily equal to N
+ */
+ m = gsl_matrix_submatrix(V, 0, j + 1, V->size1, N - (j + 1));
+
+ /* apply right Householder matrix to V */
+ gsl_linalg_householder_mh(tau_j, &hv.vector, &m.matrix);
+ }
+
+ return GSL_SUCCESS;
+ }
+} /* gsl_linalg_hessenberg_unpack_accum() */
+
+/*
+gsl_linalg_hessenberg_set_zero()
+ Zero out the lower triangular portion of the Hessenberg matrix H.
+This is useful when Householder vectors may be stored in the lower
+part of H, but eigenvalue solvers need some scratch space with zeros.
+*/
+
+void
+gsl_linalg_hessenberg_set_zero(gsl_matrix * H)
+{
+ const int N = (int) H->size1;
+ int i, j;
+
+ for (j = 0; j < N - 2; ++j)
+ {
+ for (i = j + 2; i < N; ++i)
+ {
+ gsl_matrix_set(H, i, j, 0.0);
+ }
+ }
+} /* gsl_linalg_hessenberg_set_zero() */
+
+/*
+gsl_linalg_hessenberg_submatrix()
+
+ This routine does the same thing as gsl_linalg_hessenberg(),
+except that it operates on a submatrix of a larger matrix, but
+updates the larger matrix with the Householder transformations.
+
+For example, suppose
+
+M = [ M_{11} | M_{12} | M_{13} ]
+ [ 0 | A | M_{23} ]
+ [ 0 | 0 | M_{33} ]
+
+where M_{11} and M_{33} are already in Hessenberg form, and we
+just want to reduce A to Hessenberg form. Applying the transformations
+to A alone will cause the larger matrix M to lose its similarity
+information. So this routine updates M_{12} and M_{23} as A gets
+reduced.
+
+Inputs: M - total matrix
+ A - (sub)matrix to reduce
+ top - row index of top of A in M
+ tau - where to store scalar factors in Householder
+ matrices; this vector must be of length N,
+ where N is the order of A
+
+Return: GSL_SUCCESS unless error occurs
+
+Notes: on output, the upper triangular portion of A (including
+the diagaonal and subdiagonal) contains the Hessenberg matrix.
+The lower triangular portion (below the subdiagonal) contains
+the Householder vectors which can be used to construct
+the similarity transform matrix U.
+
+The matrix U is
+
+U = U(1) U(2) ... U(n - 2)
+
+where
+
+U(i) = I - tau(i) * v(i) * v(i)^t
+
+and the vector v(i) is stored in column i of the matrix A
+underneath the subdiagonal. So the first element of v(i)
+is stored in row i + 2, column i, the second element at
+row i + 3, column i, and so on.
+
+Also note that for the purposes of computing U(i),
+v(1:i) = 0, v(i + 1) = 1, and v(i+2:n) is what is stored in
+column i of A beneath the subdiagonal.
+*/
+
+int
+gsl_linalg_hessenberg_submatrix(gsl_matrix *M, gsl_matrix *A, size_t top,
+ gsl_vector *tau)
+{
+ const size_t N = A->size1;
+ const size_t N_M = M->size1;
+
+ if (N != A->size2)
+ {
+ GSL_ERROR ("Hessenberg reduction requires square matrix",
+ GSL_ENOTSQR);
+ }
+ else if (N != tau->size)
+ {
+ GSL_ERROR ("tau vector must match matrix size", GSL_EBADLEN);
+ }
+ else if (N < 3)
+ {
+ /* nothing to do */
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ size_t i; /* looping */
+ gsl_vector_view c, /* matrix column */
+ hv; /* householder vector */
+ gsl_matrix_view m;
+ double tau_i; /* beta in algorithm 7.4.2 */
+
+ for (i = 0; i < N - 2; ++i)
+ {
+ /*
+ * make a copy of A(i + 1:n, i) and store it in the section
+ * of 'tau' that we haven't stored coefficients in yet
+ */
+
+ c = gsl_matrix_column(A, i);
+ c = gsl_vector_subvector(&c.vector, i + 1, N - (i + 1));
+
+ hv = gsl_vector_subvector(tau, i + 1, N - (i + 1));
+ gsl_vector_memcpy(&hv.vector, &c.vector);
+
+ /* compute householder transformation of A(i+1:n,i) */
+ tau_i = gsl_linalg_householder_transform(&hv.vector);
+
+ /*
+ * apply left householder matrix (I - tau_i v v') to
+ * [ A | M_{23} ]
+ */
+ m = gsl_matrix_submatrix(M,
+ top + i + 1,
+ top + i,
+ N - (i + 1),
+ N_M - top - i);
+ gsl_linalg_householder_hm(tau_i, &hv.vector, &m.matrix);
+
+ /*
+ * apply right householder matrix (I - tau_i v v') to
+ *
+ * [ M_{12} ]
+ * [ A ]
+ */
+ m = gsl_matrix_submatrix(M,
+ 0,
+ top + i + 1,
+ top + N,
+ N - (i + 1));
+ gsl_linalg_householder_mh(tau_i, &hv.vector, &m.matrix);
+
+ /* save Householder coefficient */
+ gsl_vector_set(tau, i, tau_i);
+
+ /*
+ * store Householder vector below the subdiagonal in column
+ * i of the matrix. hv(1) does not need to be stored since
+ * it is always 1.
+ */
+ c = gsl_vector_subvector(&c.vector, 1, c.vector.size - 1);
+ hv = gsl_vector_subvector(&hv.vector, 1, hv.vector.size - 1);
+ gsl_vector_memcpy(&c.vector, &hv.vector);
+ }
+
+ return GSL_SUCCESS;
+ }
+} /* gsl_linalg_hessenberg_submatrix() */
diff --git a/gsl-1.9/linalg/hh.c b/gsl-1.9/linalg/hh.c
new file mode 100644
index 0000000..6530c96
--- /dev/null
+++ b/gsl-1.9/linalg/hh.c
@@ -0,0 +1,179 @@
+/* linalg/hh.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_linalg.h>
+
+#define REAL double
+
+/* [Engeln-Mullges + Uhlig, Alg. 4.42]
+ */
+
+int
+gsl_linalg_HH_solve (gsl_matrix * A, const gsl_vector * b, gsl_vector * x)
+{
+ if (A->size1 > A->size2)
+ {
+ /* System is underdetermined. */
+
+ GSL_ERROR ("System is underdetermined", GSL_EINVAL);
+ }
+ else if (A->size2 != x->size)
+ {
+ GSL_ERROR ("matrix and vector sizes must be equal", GSL_EBADLEN);
+ }
+ else
+ {
+ int status ;
+
+ gsl_vector_memcpy (x, b);
+
+ status = gsl_linalg_HH_svx (A, x);
+
+ return status ;
+ }
+}
+
+int
+gsl_linalg_HH_svx (gsl_matrix * A, gsl_vector * x)
+{
+ if (A->size1 > A->size2)
+ {
+ /* System is underdetermined. */
+
+ GSL_ERROR ("System is underdetermined", GSL_EINVAL);
+ }
+ else if (A->size2 != x->size)
+ {
+ GSL_ERROR ("matrix and vector sizes must be equal", GSL_EBADLEN);
+ }
+ else
+ {
+ const size_t N = A->size1;
+ const size_t M = A->size2;
+ size_t i, j, k;
+ REAL *d = (REAL *) malloc (N * sizeof (REAL));
+
+ if (d == 0)
+ {
+ GSL_ERROR ("could not allocate memory for workspace", GSL_ENOMEM);
+ }
+
+ /* Perform Householder transformation. */
+
+ for (i = 0; i < N; i++)
+ {
+ const REAL aii = gsl_matrix_get (A, i, i);
+ REAL alpha;
+ REAL f;
+ REAL ak;
+ REAL max_norm = 0.0;
+ REAL r = 0.0;
+
+ for (k = i; k < M; k++)
+ {
+ REAL aki = gsl_matrix_get (A, k, i);
+ r += aki * aki;
+ }
+
+ if (r == 0.0)
+ {
+ /* Rank of matrix is less than size1. */
+ free (d);
+ GSL_ERROR ("matrix is rank deficient", GSL_ESING);
+ }
+
+ alpha = sqrt (r) * GSL_SIGN (aii);
+
+ ak = 1.0 / (r + alpha * aii);
+ gsl_matrix_set (A, i, i, aii + alpha);
+
+ d[i] = -alpha;
+
+ for (k = i + 1; k < N; k++)
+ {
+ REAL norm = 0.0;
+ f = 0.0;
+ for (j = i; j < M; j++)
+ {
+ REAL ajk = gsl_matrix_get (A, j, k);
+ REAL aji = gsl_matrix_get (A, j, i);
+ norm += ajk * ajk;
+ f += ajk * aji;
+ }
+ max_norm = GSL_MAX (max_norm, norm);
+
+ f *= ak;
+
+ for (j = i; j < M; j++)
+ {
+ REAL ajk = gsl_matrix_get (A, j, k);
+ REAL aji = gsl_matrix_get (A, j, i);
+ gsl_matrix_set (A, j, k, ajk - f * aji);
+ }
+ }
+
+ if (fabs (alpha) < 2.0 * GSL_DBL_EPSILON * sqrt (max_norm))
+ {
+ /* Apparent singularity. */
+ free (d);
+ GSL_ERROR("apparent singularity detected", GSL_ESING);
+ }
+
+ /* Perform update of RHS. */
+
+ f = 0.0;
+ for (j = i; j < M; j++)
+ {
+ f += gsl_vector_get (x, j) * gsl_matrix_get (A, j, i);
+ }
+ f *= ak;
+ for (j = i; j < M; j++)
+ {
+ REAL xj = gsl_vector_get (x, j);
+ REAL aji = gsl_matrix_get (A, j, i);
+ gsl_vector_set (x, j, xj - f * aji);
+ }
+ }
+
+ /* Perform back-substitution. */
+
+ for (i = N; i > 0 && i--;)
+ {
+ REAL xi = gsl_vector_get (x, i);
+ REAL sum = 0.0;
+ for (k = i + 1; k < N; k++)
+ {
+ sum += gsl_matrix_get (A, i, k) * gsl_vector_get (x, k);
+ }
+
+ gsl_vector_set (x, i, (xi - sum) / d[i]);
+ }
+
+ free (d);
+ return GSL_SUCCESS;
+ }
+}
+
diff --git a/gsl-1.9/linalg/householder.c b/gsl-1.9/linalg/householder.c
new file mode 100644
index 0000000..d9ab952
--- /dev/null
+++ b/gsl-1.9/linalg/householder.c
@@ -0,0 +1,326 @@
+/* linalg/householder.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_blas.h>
+
+#include <gsl/gsl_linalg.h>
+
+double
+gsl_linalg_householder_transform (gsl_vector * v)
+{
+ /* replace v[0:n-1] with a householder vector (v[0:n-1]) and
+ coefficient tau that annihilate v[1:n-1] */
+
+ const size_t n = v->size ;
+
+ if (n == 1)
+ {
+ return 0.0; /* tau = 0 */
+ }
+ else
+ {
+ double alpha, beta, tau ;
+
+ gsl_vector_view x = gsl_vector_subvector (v, 1, n - 1) ;
+
+ double xnorm = gsl_blas_dnrm2 (&x.vector);
+
+ if (xnorm == 0)
+ {
+ return 0.0; /* tau = 0 */
+ }
+
+ alpha = gsl_vector_get (v, 0) ;
+ beta = - (alpha >= 0.0 ? +1.0 : -1.0) * hypot(alpha, xnorm) ;
+ tau = (beta - alpha) / beta ;
+
+ gsl_blas_dscal (1.0 / (alpha - beta), &x.vector);
+ gsl_vector_set (v, 0, beta) ;
+
+ return tau;
+ }
+}
+
+int
+gsl_linalg_householder_hm (double tau, const gsl_vector * v, gsl_matrix * A)
+{
+ /* applies a householder transformation v,tau to matrix m */
+
+ if (tau == 0.0)
+ {
+ return GSL_SUCCESS;
+ }
+
+#ifdef USE_BLAS
+ {
+ gsl_vector_const_view v1 = gsl_vector_const_subvector (v, 1, v->size - 1);
+ gsl_matrix_view A1 = gsl_matrix_submatrix (A, 1, 0, A->size1 - 1, A->size2);
+ size_t j;
+
+ for (j = 0; j < A->size2; j++)
+ {
+ double wj = 0.0;
+ gsl_vector_view A1j = gsl_matrix_column(&A1.matrix, j);
+ gsl_blas_ddot (&A1j.vector, &v1.vector, &wj);
+ wj += gsl_matrix_get(A,0,j);
+
+ {
+ double A0j = gsl_matrix_get (A, 0, j);
+ gsl_matrix_set (A, 0, j, A0j - tau * wj);
+ }
+
+ gsl_blas_daxpy (-tau * wj, &v1.vector, &A1j.vector);
+ }
+ }
+#else
+ {
+ size_t i, j;
+
+ for (j = 0; j < A->size2; j++)
+ {
+ /* Compute wj = Akj vk */
+
+ double wj = gsl_matrix_get(A,0,j);
+
+ for (i = 1; i < A->size1; i++) /* note, computed for v(0) = 1 above */
+ {
+ wj += gsl_matrix_get(A,i,j) * gsl_vector_get(v,i);
+ }
+
+ /* Aij = Aij - tau vi wj */
+
+ /* i = 0 */
+ {
+ double A0j = gsl_matrix_get (A, 0, j);
+ gsl_matrix_set (A, 0, j, A0j - tau * wj);
+ }
+
+ /* i = 1 .. M-1 */
+
+ for (i = 1; i < A->size1; i++)
+ {
+ double Aij = gsl_matrix_get (A, i, j);
+ double vi = gsl_vector_get (v, i);
+ gsl_matrix_set (A, i, j, Aij - tau * vi * wj);
+ }
+ }
+ }
+#endif
+
+ return GSL_SUCCESS;
+}
+
+int
+gsl_linalg_householder_mh (double tau, const gsl_vector * v, gsl_matrix * A)
+{
+ /* applies a householder transformation v,tau to matrix m from the
+ right hand side in order to zero out rows */
+
+ if (tau == 0)
+ return GSL_SUCCESS;
+
+ /* A = A - tau w v' */
+
+#ifdef USE_BLAS
+ {
+ gsl_vector_const_view v1 = gsl_vector_const_subvector (v, 1, v->size - 1);
+ gsl_matrix_view A1 = gsl_matrix_submatrix (A, 0, 1, A->size1, A->size2-1);
+ size_t i;
+
+ for (i = 0; i < A->size1; i++)
+ {
+ double wi = 0.0;
+ gsl_vector_view A1i = gsl_matrix_row(&A1.matrix, i);
+ gsl_blas_ddot (&A1i.vector, &v1.vector, &wi);
+ wi += gsl_matrix_get(A,i,0);
+
+ {
+ double Ai0 = gsl_matrix_get (A, i, 0);
+ gsl_matrix_set (A, i, 0, Ai0 - tau * wi);
+ }
+
+ gsl_blas_daxpy(-tau * wi, &v1.vector, &A1i.vector);
+ }
+ }
+#else
+ {
+ size_t i, j;
+
+ for (i = 0; i < A->size1; i++)
+ {
+ double wi = gsl_matrix_get(A,i,0);
+
+ for (j = 1; j < A->size2; j++) /* note, computed for v(0) = 1 above */
+ {
+ wi += gsl_matrix_get(A,i,j) * gsl_vector_get(v,j);
+ }
+
+ /* j = 0 */
+
+ {
+ double Ai0 = gsl_matrix_get (A, i, 0);
+ gsl_matrix_set (A, i, 0, Ai0 - tau * wi);
+ }
+
+ /* j = 1 .. N-1 */
+
+ for (j = 1; j < A->size2; j++)
+ {
+ double vj = gsl_vector_get (v, j);
+ double Aij = gsl_matrix_get (A, i, j);
+ gsl_matrix_set (A, i, j, Aij - tau * wi * vj);
+ }
+ }
+ }
+#endif
+
+ return GSL_SUCCESS;
+}
+
+int
+gsl_linalg_householder_hv (double tau, const gsl_vector * v, gsl_vector * w)
+{
+ /* applies a householder transformation v to vector w */
+ const size_t N = v->size;
+
+ if (tau == 0)
+ return GSL_SUCCESS ;
+
+ {
+ /* compute d = v'w */
+
+ double d0 = gsl_vector_get(w,0);
+ double d1, d;
+
+ gsl_vector_const_view v1 = gsl_vector_const_subvector(v, 1, N-1);
+ gsl_vector_view w1 = gsl_vector_subvector(w, 1, N-1);
+
+ gsl_blas_ddot (&v1.vector, &w1.vector, &d1);
+
+ d = d0 + d1;
+
+ /* compute w = w - tau (v) (v'w) */
+
+ {
+ double w0 = gsl_vector_get (w,0);
+ gsl_vector_set (w, 0, w0 - tau * d);
+ }
+
+ gsl_blas_daxpy (-tau * d, &v1.vector, &w1.vector);
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+int
+gsl_linalg_householder_hm1 (double tau, gsl_matrix * A)
+{
+ /* applies a householder transformation v,tau to a matrix being
+ build up from the identity matrix, using the first column of A as
+ a householder vector */
+
+ if (tau == 0)
+ {
+ size_t i,j;
+
+ gsl_matrix_set (A, 0, 0, 1.0);
+
+ for (j = 1; j < A->size2; j++)
+ {
+ gsl_matrix_set (A, 0, j, 0.0);
+ }
+
+ for (i = 1; i < A->size1; i++)
+ {
+ gsl_matrix_set (A, i, 0, 0.0);
+ }
+
+ return GSL_SUCCESS;
+ }
+
+ /* w = A' v */
+
+#ifdef USE_BLAS
+ {
+ gsl_matrix_view A1 = gsl_matrix_submatrix (A, 1, 0, A->size1 - 1, A->size2);
+ gsl_vector_view v1 = gsl_matrix_column (&A1.matrix, 0);
+ size_t j;
+
+ for (j = 1; j < A->size2; j++)
+ {
+ double wj = 0.0; /* A0j * v0 */
+
+ gsl_vector_view A1j = gsl_matrix_column(&A1.matrix, j);
+ gsl_blas_ddot (&A1j.vector, &v1.vector, &wj);
+
+ /* A = A - tau v w' */
+
+ gsl_matrix_set (A, 0, j, - tau * wj);
+
+ gsl_blas_daxpy(-tau*wj, &v1.vector, &A1j.vector);
+ }
+
+ gsl_blas_dscal(-tau, &v1.vector);
+
+ gsl_matrix_set (A, 0, 0, 1.0 - tau);
+ }
+#else
+ {
+ size_t i, j;
+
+ for (j = 1; j < A->size2; j++)
+ {
+ double wj = 0.0; /* A0j * v0 */
+
+ for (i = 1; i < A->size1; i++)
+ {
+ double vi = gsl_matrix_get(A, i, 0);
+ wj += gsl_matrix_get(A,i,j) * vi;
+ }
+
+ /* A = A - tau v w' */
+
+ gsl_matrix_set (A, 0, j, - tau * wj);
+
+ for (i = 1; i < A->size1; i++)
+ {
+ double vi = gsl_matrix_get (A, i, 0);
+ double Aij = gsl_matrix_get (A, i, j);
+ gsl_matrix_set (A, i, j, Aij - tau * vi * wj);
+ }
+ }
+
+ for (i = 1; i < A->size1; i++)
+ {
+ double vi = gsl_matrix_get(A, i, 0);
+ gsl_matrix_set(A, i, 0, -tau * vi);
+ }
+
+ gsl_matrix_set (A, 0, 0, 1.0 - tau);
+ }
+#endif
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/linalg/householdercomplex.c b/gsl-1.9/linalg/householdercomplex.c
new file mode 100644
index 0000000..bc182a6
--- /dev/null
+++ b/gsl-1.9/linalg/householdercomplex.c
@@ -0,0 +1,207 @@
+/* linalg/householdercomplex.c
+ *
+ * Copyright (C) 2001 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Computes a householder transformation matrix H such that
+ *
+ * H' v = -/+ |v| e_1
+ *
+ * where e_1 is the first unit vector. On exit the matrix H can be
+ * computed from the return values (tau, v)
+ *
+ * H = I - tau * w * w'
+ *
+ * where w = (1, v(2), ..., v(N)). The nonzero element of the result
+ * vector -/+|v| e_1 is stored in v(1).
+ *
+ * Note that the matrix H' in the householder transformation is the
+ * hermitian conjugate of H. To compute H'v, pass the conjugate of
+ * tau as the first argument to gsl_linalg_householder_hm() rather
+ * than tau itself. See the LAPACK function CLARFG for details of this
+ * convention. */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_blas.h>
+#include <gsl/gsl_complex_math.h>
+
+#include <gsl/gsl_linalg.h>
+
+gsl_complex
+gsl_linalg_complex_householder_transform (gsl_vector_complex * v)
+{
+ /* replace v[0:n-1] with a householder vector (v[0:n-1]) and
+ coefficient tau that annihilate v[1:n-1] */
+
+ const size_t n = v->size ;
+
+ if (n == 1)
+ {
+ gsl_complex alpha = gsl_vector_complex_get (v, 0) ;
+ double absa = gsl_complex_abs (alpha);
+ double beta_r = - (GSL_REAL(alpha) >= 0 ? +1 : -1) * absa ;
+
+ gsl_complex tau;
+
+ if (beta_r == 0.0)
+ {
+ GSL_REAL(tau) = 0.0;
+ GSL_IMAG(tau) = 0.0;
+ }
+ else
+ {
+ GSL_REAL(tau) = (beta_r - GSL_REAL(alpha)) / beta_r ;
+ GSL_IMAG(tau) = - GSL_IMAG(alpha) / beta_r ;
+
+ {
+ gsl_complex beta = gsl_complex_rect (beta_r, 0.0);
+ gsl_vector_complex_set (v, 0, beta) ;
+ }
+ }
+
+ return tau;
+ }
+ else
+ {
+ gsl_complex tau ;
+ double beta_r;
+
+ gsl_vector_complex_view x = gsl_vector_complex_subvector (v, 1, n - 1) ;
+ gsl_complex alpha = gsl_vector_complex_get (v, 0) ;
+ double absa = gsl_complex_abs (alpha);
+ double xnorm = gsl_blas_dznrm2 (&x.vector);
+
+ if (xnorm == 0 && GSL_IMAG(alpha) == 0)
+ {
+ gsl_complex zero = gsl_complex_rect(0.0, 0.0);
+ return zero; /* tau = 0 */
+ }
+
+ beta_r = - (GSL_REAL(alpha) >= 0 ? +1 : -1) * hypot(absa, xnorm) ;
+
+ GSL_REAL(tau) = (beta_r - GSL_REAL(alpha)) / beta_r ;
+ GSL_IMAG(tau) = - GSL_IMAG(alpha) / beta_r ;
+
+ {
+ gsl_complex amb = gsl_complex_sub_real(alpha, beta_r);
+ gsl_complex s = gsl_complex_inverse(amb);
+ gsl_blas_zscal (s, &x.vector);
+ }
+
+ {
+ gsl_complex beta = gsl_complex_rect (beta_r, 0.0);
+ gsl_vector_complex_set (v, 0, beta) ;
+ }
+
+ return tau;
+ }
+}
+
+int
+gsl_linalg_complex_householder_hm (gsl_complex tau, const gsl_vector_complex * v, gsl_matrix_complex * A)
+{
+ /* applies a householder transformation v,tau to matrix m */
+
+ size_t i, j;
+
+ if (GSL_REAL(tau) == 0.0 && GSL_IMAG(tau) == 0.0)
+ {
+ return GSL_SUCCESS;
+ }
+
+ /* w = (v' A)^T */
+
+ for (j = 0; j < A->size2; j++)
+ {
+ gsl_complex tauwj;
+ gsl_complex wj = gsl_matrix_complex_get(A,0,j);
+
+ for (i = 1; i < A->size1; i++) /* note, computed for v(0) = 1 above */
+ {
+ gsl_complex Aij = gsl_matrix_complex_get(A,i,j);
+ gsl_complex vi = gsl_vector_complex_get(v,i);
+ gsl_complex Av = gsl_complex_mul (Aij, gsl_complex_conjugate(vi));
+ wj = gsl_complex_add (wj, Av);
+ }
+
+ tauwj = gsl_complex_mul (tau, wj);
+
+ /* A = A - v w^T */
+
+ {
+ gsl_complex A0j = gsl_matrix_complex_get (A, 0, j);
+ gsl_complex Atw = gsl_complex_sub (A0j, tauwj);
+ /* store A0j - tau * wj */
+ gsl_matrix_complex_set (A, 0, j, Atw);
+ }
+
+ for (i = 1; i < A->size1; i++)
+ {
+ gsl_complex vi = gsl_vector_complex_get (v, i);
+ gsl_complex tauvw = gsl_complex_mul(vi, tauwj);
+ gsl_complex Aij = gsl_matrix_complex_get (A, i, j);
+ gsl_complex Atwv = gsl_complex_sub (Aij, tauvw);
+ /* store Aij - tau * vi * wj */
+ gsl_matrix_complex_set (A, i, j, Atwv);
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+gsl_linalg_complex_householder_hv (gsl_complex tau, const gsl_vector_complex * v, gsl_vector_complex * w)
+{
+ const size_t N = v->size;
+
+ if (GSL_REAL(tau) == 0.0 && GSL_IMAG(tau) == 0.0)
+ return GSL_SUCCESS;
+
+ {
+ /* compute z = v'w */
+
+ gsl_complex z0 = gsl_vector_complex_get(w,0);
+ gsl_complex z1, z;
+ gsl_complex tz, ntz;
+
+ gsl_vector_complex_const_view v1 = gsl_vector_complex_const_subvector(v, 1, N-1);
+ gsl_vector_complex_view w1 = gsl_vector_complex_subvector(w, 1, N-1);
+
+ gsl_blas_zdotc(&v1.vector, &w1.vector, &z1);
+
+ z = gsl_complex_add (z0, z1);
+
+ tz = gsl_complex_mul(tau, z);
+ ntz = gsl_complex_negative (tz);
+
+ /* compute w = w - tau * (v'w) * v */
+
+ {
+ gsl_complex w0 = gsl_vector_complex_get(w, 0);
+ gsl_complex w0ntz = gsl_complex_add (w0, ntz);
+ gsl_vector_complex_set (w, 0, w0ntz);
+ }
+
+ gsl_blas_zaxpy(ntz, &v1.vector, &w1.vector);
+ }
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/linalg/lq.c b/gsl-1.9/linalg/lq.c
new file mode 100644
index 0000000..a1c768e
--- /dev/null
+++ b/gsl-1.9/linalg/lq.c
@@ -0,0 +1,567 @@
+/* linalg/lq.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ * Copyright (C) 2004 Joerg Wensch, modifications for LQ.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_blas.h>
+
+#include <gsl/gsl_linalg.h>
+
+#define REAL double
+
+#include "givens.c"
+#include "apply_givens.c"
+
+/* Note: The standard in numerical linear algebra is to solve A x = b
+ * resp. ||A x - b||_2 -> min by QR-decompositions where x, b are
+ * column vectors.
+ *
+ * When the matrix A has a large number of rows it is much more
+ * efficient to work with the transposed matrix A^T and to solve the
+ * system x^T A = b^T resp. ||x^T A - b^T||_2 -> min. This is caused
+ * by the row-oriented format in which GSL stores matrices. Therefore
+ * the QR-decomposition of A has to be replaced by a LQ decomposition
+ * of A^T
+ *
+ * The purpose of this package is to provide the algorithms to compute
+ * the LQ-decomposition and to solve the linear equations resp. least
+ * squares problems. The dimensions N, M of the matrix are switched
+ * because here A will probably be a transposed matrix. We write x^T,
+ * b^T,... for vectors the comments to emphasize that they are row
+ * vectors.
+ *
+ * It may even be useful to transpose your matrix explicitly (assumed
+ * that there are no memory restrictions) because this takes O(M x N)
+ * computing time where the decompostion takes O(M x N^2) computing
+ * time. */
+
+/* Factorise a general N x M matrix A into
+ *
+ * A = L Q
+ *
+ * where Q is orthogonal (M x M) and L is lower triangular (N x M).
+ *
+ * Q is stored as a packed set of Householder transformations in the
+ * strict upper triangular part of the input matrix.
+ *
+ * R is stored in the diagonal and lower triangle of the input matrix.
+ *
+ * The full matrix for Q can be obtained as the product
+ *
+ * Q = Q_k .. Q_2 Q_1
+ *
+ * where k = MIN(M,N) and
+ *
+ * Q_i = (I - tau_i * v_i * v_i')
+ *
+ * and where v_i is a Householder vector
+ *
+ * v_i = [1, m(i+1,i), m(i+2,i), ... , m(M,i)]
+ *
+ * This storage scheme is the same as in LAPACK. */
+
+int
+gsl_linalg_LQ_decomp (gsl_matrix * A, gsl_vector * tau)
+{
+ const size_t N = A->size1;
+ const size_t M = A->size2;
+
+ if (tau->size != GSL_MIN (M, N))
+ {
+ GSL_ERROR ("size of tau must be MIN(M,N)", GSL_EBADLEN);
+ }
+ else
+ {
+ size_t i;
+
+ for (i = 0; i < GSL_MIN (M, N); i++)
+ {
+ /* Compute the Householder transformation to reduce the j-th
+ column of the matrix to a multiple of the j-th unit vector */
+
+ gsl_vector_view c_full = gsl_matrix_row (A, i);
+ gsl_vector_view c = gsl_vector_subvector (&(c_full.vector), i, M-i);
+
+ double tau_i = gsl_linalg_householder_transform (&(c.vector));
+
+ gsl_vector_set (tau, i, tau_i);
+
+ /* Apply the transformation to the remaining columns and
+ update the norms */
+
+ if (i + 1 < N)
+ {
+ gsl_matrix_view m = gsl_matrix_submatrix (A, i + 1, i, N - (i + 1), M - i );
+ gsl_linalg_householder_mh (tau_i, &(c.vector), &(m.matrix));
+ }
+ }
+
+ return GSL_SUCCESS;
+ }
+}
+
+/* Solves the system x^T A = b^T using the LQ factorisation,
+
+ * x^T L = b^T Q^T
+ *
+ * to obtain x. Based on SLATEC code.
+ */
+
+
+int
+gsl_linalg_LQ_solve_T (const gsl_matrix * LQ, const gsl_vector * tau, const gsl_vector * b, gsl_vector * x)
+{
+ if (LQ->size1 != LQ->size2)
+ {
+ GSL_ERROR ("LQ matrix must be square", GSL_ENOTSQR);
+ }
+ else if (LQ->size2 != b->size)
+ {
+ GSL_ERROR ("matrix size must match b size", GSL_EBADLEN);
+ }
+ else if (LQ->size1 != x->size)
+ {
+ GSL_ERROR ("matrix size must match solution size", GSL_EBADLEN);
+ }
+ else
+ {
+ /* Copy x <- b */
+
+ gsl_vector_memcpy (x, b);
+
+ /* Solve for x */
+
+ gsl_linalg_LQ_svx_T (LQ, tau, x);
+
+ return GSL_SUCCESS;
+ }
+}
+
+/* Solves the system x^T A = b^T in place using the LQ factorisation,
+ *
+ * x^T L = b^T Q^T
+ *
+ * to obtain x. Based on SLATEC code.
+ */
+
+int
+gsl_linalg_LQ_svx_T (const gsl_matrix * LQ, const gsl_vector * tau, gsl_vector * x)
+{
+
+ if (LQ->size1 != LQ->size2)
+ {
+ GSL_ERROR ("LQ matrix must be square", GSL_ENOTSQR);
+ }
+ else if (LQ->size1 != x->size)
+ {
+ GSL_ERROR ("matrix size must match x/rhs size", GSL_EBADLEN);
+ }
+ else
+ {
+ /* compute rhs = Q^T b */
+
+ gsl_linalg_LQ_vecQT (LQ, tau, x);
+
+ /* Solve R x = rhs, storing x in-place */
+
+ gsl_blas_dtrsv (CblasLower, CblasTrans, CblasNonUnit, LQ, x);
+
+ return GSL_SUCCESS;
+ }
+}
+
+
+/* Find the least squares solution to the overdetermined system
+ *
+ * x^T A = b^T
+ *
+ * for M >= N using the LQ factorization A = L Q.
+ */
+
+int
+gsl_linalg_LQ_lssolve_T (const gsl_matrix * LQ, const gsl_vector * tau, const gsl_vector * b, gsl_vector * x, gsl_vector * residual)
+{
+ const size_t N = LQ->size1;
+ const size_t M = LQ->size2;
+
+ if (M < N)
+ {
+ GSL_ERROR ("LQ matrix must have M>=N", GSL_EBADLEN);
+ }
+ else if (M != b->size)
+ {
+ GSL_ERROR ("matrix size must match b size", GSL_EBADLEN);
+ }
+ else if (N != x->size)
+ {
+ GSL_ERROR ("matrix size must match solution size", GSL_EBADLEN);
+ }
+ else if (M != residual->size)
+ {
+ GSL_ERROR ("matrix size must match residual size", GSL_EBADLEN);
+ }
+ else
+ {
+ gsl_matrix_const_view L = gsl_matrix_const_submatrix (LQ, 0, 0, N, N);
+ gsl_vector_view c = gsl_vector_subvector(residual, 0, N);
+
+ gsl_vector_memcpy(residual, b);
+
+ /* compute rhs = b^T Q^T */
+
+ gsl_linalg_LQ_vecQT (LQ, tau, residual);
+
+ /* Solve x^T L = rhs */
+
+ gsl_vector_memcpy(x, &(c.vector));
+
+ gsl_blas_dtrsv (CblasLower, CblasTrans, CblasNonUnit, &(L.matrix), x);
+
+ /* Compute residual = b^T - x^T A = (b^T Q^T - x^T L) Q */
+
+ gsl_vector_set_zero(&(c.vector));
+
+ gsl_linalg_LQ_vecQ(LQ, tau, residual);
+
+ return GSL_SUCCESS;
+ }
+}
+
+
+int
+gsl_linalg_LQ_Lsolve_T (const gsl_matrix * LQ, const gsl_vector * b, gsl_vector * x)
+{
+ if (LQ->size1 != LQ->size2)
+ {
+ GSL_ERROR ("LQ matrix must be square", GSL_ENOTSQR);
+ }
+ else if (LQ->size1 != b->size)
+ {
+ GSL_ERROR ("matrix size must match b size", GSL_EBADLEN);
+ }
+ else if (LQ->size1 != x->size)
+ {
+ GSL_ERROR ("matrix size must match x size", GSL_EBADLEN);
+ }
+ else
+ {
+ /* Copy x <- b */
+
+ gsl_vector_memcpy (x, b);
+
+ /* Solve R x = b, storing x in-place */
+
+ gsl_blas_dtrsv (CblasLower, CblasTrans, CblasNonUnit, LQ, x);
+
+ return GSL_SUCCESS;
+ }
+}
+
+
+int
+gsl_linalg_LQ_Lsvx_T (const gsl_matrix * LQ, gsl_vector * x)
+{
+ if (LQ->size1 != LQ->size2)
+ {
+ GSL_ERROR ("LQ matrix must be square", GSL_ENOTSQR);
+ }
+ else if (LQ->size2 != x->size)
+ {
+ GSL_ERROR ("matrix size must match rhs size", GSL_EBADLEN);
+ }
+ else
+ {
+ /* Solve x^T L = b^T, storing x in-place */
+
+ gsl_blas_dtrsv (CblasLower, CblasTrans, CblasNonUnit, LQ, x);
+
+ return GSL_SUCCESS;
+ }
+}
+
+int
+gsl_linalg_L_solve_T (const gsl_matrix * L, const gsl_vector * b, gsl_vector * x)
+{
+ if (L->size1 != L->size2)
+ {
+ GSL_ERROR ("R matrix must be square", GSL_ENOTSQR);
+ }
+ else if (L->size2 != b->size)
+ {
+ GSL_ERROR ("matrix size must match b size", GSL_EBADLEN);
+ }
+ else if (L->size1 != x->size)
+ {
+ GSL_ERROR ("matrix size must match solution size", GSL_EBADLEN);
+ }
+ else
+ {
+ /* Copy x <- b */
+
+ gsl_vector_memcpy (x, b);
+
+ /* Solve R x = b, storing x inplace in b */
+
+ gsl_blas_dtrsv (CblasLower, CblasTrans, CblasNonUnit, L, x);
+
+ return GSL_SUCCESS;
+ }
+}
+
+
+
+
+int
+gsl_linalg_LQ_vecQT (const gsl_matrix * LQ, const gsl_vector * tau, gsl_vector * v)
+{
+ const size_t N = LQ->size1;
+ const size_t M = LQ->size2;
+
+ if (tau->size != GSL_MIN (M, N))
+ {
+ GSL_ERROR ("size of tau must be MIN(M,N)", GSL_EBADLEN);
+ }
+ else if (v->size != M)
+ {
+ GSL_ERROR ("vector size must be M", GSL_EBADLEN);
+ }
+ else
+ {
+ size_t i;
+
+ /* compute v Q^T */
+
+ for (i = 0; i < GSL_MIN (M, N); i++)
+ {
+ gsl_vector_const_view c = gsl_matrix_const_row (LQ, i);
+ gsl_vector_const_view h = gsl_vector_const_subvector (&(c.vector),
+ i, M - i);
+ gsl_vector_view w = gsl_vector_subvector (v, i, M - i);
+ double ti = gsl_vector_get (tau, i);
+ gsl_linalg_householder_hv (ti, &(h.vector), &(w.vector));
+ }
+ return GSL_SUCCESS;
+ }
+}
+
+int
+gsl_linalg_LQ_vecQ (const gsl_matrix * LQ, const gsl_vector * tau, gsl_vector * v)
+{
+ const size_t N = LQ->size1;
+ const size_t M = LQ->size2;
+
+ if (tau->size != GSL_MIN (M, N))
+ {
+ GSL_ERROR ("size of tau must be MIN(M,N)", GSL_EBADLEN);
+ }
+ else if (v->size != M)
+ {
+ GSL_ERROR ("vector size must be M", GSL_EBADLEN);
+ }
+ else
+ {
+ size_t i;
+
+ /* compute v Q^T */
+
+ for (i = GSL_MIN (M, N); i > 0 && i--;)
+ {
+ gsl_vector_const_view c = gsl_matrix_const_row (LQ, i);
+ gsl_vector_const_view h = gsl_vector_const_subvector (&(c.vector),
+ i, M - i);
+ gsl_vector_view w = gsl_vector_subvector (v, i, M - i);
+ double ti = gsl_vector_get (tau, i);
+ gsl_linalg_householder_hv (ti, &(h.vector), &(w.vector));
+ }
+ return GSL_SUCCESS;
+ }
+}
+
+
+/* Form the orthogonal matrix Q from the packed LQ matrix */
+
+int
+gsl_linalg_LQ_unpack (const gsl_matrix * LQ, const gsl_vector * tau, gsl_matrix * Q, gsl_matrix * L)
+{
+ const size_t N = LQ->size1;
+ const size_t M = LQ->size2;
+
+ if (Q->size1 != M || Q->size2 != M)
+ {
+ GSL_ERROR ("Q matrix must be M x M", GSL_ENOTSQR);
+ }
+ else if (L->size1 != N || L->size2 != M)
+ {
+ GSL_ERROR ("R matrix must be N x M", GSL_ENOTSQR);
+ }
+ else if (tau->size != GSL_MIN (M, N))
+ {
+ GSL_ERROR ("size of tau must be MIN(M,N)", GSL_EBADLEN);
+ }
+ else
+ {
+ size_t i, j, l_border;
+
+ /* Initialize Q to the identity */
+
+ gsl_matrix_set_identity (Q);
+
+ for (i = GSL_MIN (M, N); i > 0 && i--;)
+ {
+ gsl_vector_const_view c = gsl_matrix_const_row (LQ, i);
+ gsl_vector_const_view h = gsl_vector_const_subvector (&c.vector,
+ i, M - i);
+ gsl_matrix_view m = gsl_matrix_submatrix (Q, i, i, M - i, M - i);
+ double ti = gsl_vector_get (tau, i);
+ gsl_linalg_householder_mh (ti, &h.vector, &m.matrix);
+ }
+
+ /* Form the lower triangular matrix L from a packed LQ matrix */
+
+ for (i = 0; i < N; i++)
+ {
+ l_border=GSL_MIN(i,M-1);
+ for (j = 0; j <= l_border ; j++)
+ gsl_matrix_set (L, i, j, gsl_matrix_get (LQ, i, j));
+
+ for (j = l_border+1; j < M; j++)
+ gsl_matrix_set (L, i, j, 0.0);
+ }
+
+ return GSL_SUCCESS;
+ }
+}
+
+
+/* Update a LQ factorisation for A= L Q , A' = A + v u^T,
+
+ * L' Q' = LQ + v u^T
+ * = (L + v u^T Q^T) Q
+ * = (L + v w^T) Q
+ *
+ * where w = Q u.
+ *
+ * Algorithm from Golub and Van Loan, "Matrix Computations", Section
+ * 12.5 (Updating Matrix Factorizations, Rank-One Changes)
+ */
+
+int
+gsl_linalg_LQ_update (gsl_matrix * Q, gsl_matrix * L,
+ const gsl_vector * v, gsl_vector * w)
+{
+ const size_t N = L->size1;
+ const size_t M = L->size2;
+
+ if (Q->size1 != M || Q->size2 != M)
+ {
+ GSL_ERROR ("Q matrix must be N x N if L is M x N", GSL_ENOTSQR);
+ }
+ else if (w->size != M)
+ {
+ GSL_ERROR ("w must be length N if L is M x N", GSL_EBADLEN);
+ }
+ else if (v->size != N)
+ {
+ GSL_ERROR ("v must be length M if L is M x N", GSL_EBADLEN);
+ }
+ else
+ {
+ size_t j, k;
+ double w0;
+
+ /* Apply Given's rotations to reduce w to (|w|, 0, 0, ... , 0)
+
+ J_1^T .... J_(n-1)^T w = +/- |w| e_1
+
+ simultaneously applied to L, H = J_1^T ... J^T_(n-1) L
+ so that H is upper Hessenberg. (12.5.2) */
+
+ for (k = M - 1; k > 0; k--)
+ {
+ double c, s;
+ double wk = gsl_vector_get (w, k);
+ double wkm1 = gsl_vector_get (w, k - 1);
+
+ create_givens (wkm1, wk, &c, &s);
+ apply_givens_vec (w, k - 1, k, c, s);
+ apply_givens_lq (M, N, Q, L, k - 1, k, c, s);
+ }
+
+ w0 = gsl_vector_get (w, 0);
+
+ /* Add in v w^T (Equation 12.5.3) */
+
+ for (j = 0; j < N; j++)
+ {
+ double lj0 = gsl_matrix_get (L, j, 0);
+ double vj = gsl_vector_get (v, j);
+ gsl_matrix_set (L, j, 0, lj0 + w0 * vj);
+ }
+
+ /* Apply Givens transformations L' = G_(n-1)^T ... G_1^T H
+ Equation 12.5.4 */
+
+ for (k = 1; k < GSL_MIN(M,N+1); k++)
+ {
+ double c, s;
+ double diag = gsl_matrix_get (L, k - 1, k - 1);
+ double offdiag = gsl_matrix_get (L, k - 1 , k);
+
+ create_givens (diag, offdiag, &c, &s);
+ apply_givens_lq (M, N, Q, L, k - 1, k, c, s);
+
+ gsl_matrix_set (L, k - 1, k, 0.0); /* exact zero of G^T */
+ }
+
+ return GSL_SUCCESS;
+ }
+}
+
+int
+gsl_linalg_LQ_LQsolve (gsl_matrix * Q, gsl_matrix * L, const gsl_vector * b, gsl_vector * x)
+{
+ const size_t N = L->size1;
+ const size_t M = L->size2;
+
+ if (M != N)
+ {
+ return GSL_ENOTSQR;
+ }
+ else if (Q->size1 != M || b->size != M || x->size != M)
+ {
+ return GSL_EBADLEN;
+ }
+ else
+ {
+ /* compute sol = b^T Q^T */
+
+ gsl_blas_dgemv (CblasNoTrans, 1.0, Q, b, 0.0, x);
+
+ /* Solve x^T L = sol, storing x in-place */
+
+ gsl_blas_dtrsv (CblasLower, CblasTrans, CblasNonUnit, L, x);
+
+ return GSL_SUCCESS;
+ }
+}
diff --git a/gsl-1.9/linalg/lu.c b/gsl-1.9/linalg/lu.c
new file mode 100644
index 0000000..f61348e
--- /dev/null
+++ b/gsl-1.9/linalg/lu.c
@@ -0,0 +1,312 @@
+/* linalg/lu.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_permute_vector.h>
+#include <gsl/gsl_blas.h>
+
+#include <gsl/gsl_linalg.h>
+
+#define REAL double
+
+/* Factorise a general N x N matrix A into,
+ *
+ * P A = L U
+ *
+ * where P is a permutation matrix, L is unit lower triangular and U
+ * is upper triangular.
+ *
+ * L is stored in the strict lower triangular part of the input
+ * matrix. The diagonal elements of L are unity and are not stored.
+ *
+ * U is stored in the diagonal and upper triangular part of the
+ * input matrix.
+ *
+ * P is stored in the permutation p. Column j of P is column k of the
+ * identity matrix, where k = permutation->data[j]
+ *
+ * signum gives the sign of the permutation, (-1)^n, where n is the
+ * number of interchanges in the permutation.
+ *
+ * See Golub & Van Loan, Matrix Computations, Algorithm 3.4.1 (Gauss
+ * Elimination with Partial Pivoting).
+ */
+
+int
+gsl_linalg_LU_decomp (gsl_matrix * A, gsl_permutation * p, int *signum)
+{
+ if (A->size1 != A->size2)
+ {
+ GSL_ERROR ("LU decomposition requires square matrix", GSL_ENOTSQR);
+ }
+ else if (p->size != A->size1)
+ {
+ GSL_ERROR ("permutation length must match matrix size", GSL_EBADLEN);
+ }
+ else
+ {
+ const size_t N = A->size1;
+ size_t i, j, k;
+
+ *signum = 1;
+ gsl_permutation_init (p);
+
+ for (j = 0; j < N - 1; j++)
+ {
+ /* Find maximum in the j-th column */
+
+ REAL ajj, max = fabs (gsl_matrix_get (A, j, j));
+ size_t i_pivot = j;
+
+ for (i = j + 1; i < N; i++)
+ {
+ REAL aij = fabs (gsl_matrix_get (A, i, j));
+
+ if (aij > max)
+ {
+ max = aij;
+ i_pivot = i;
+ }
+ }
+
+ if (i_pivot != j)
+ {
+ gsl_matrix_swap_rows (A, j, i_pivot);
+ gsl_permutation_swap (p, j, i_pivot);
+ *signum = -(*signum);
+ }
+
+ ajj = gsl_matrix_get (A, j, j);
+
+ if (ajj != 0.0)
+ {
+ for (i = j + 1; i < N; i++)
+ {
+ REAL aij = gsl_matrix_get (A, i, j) / ajj;
+ gsl_matrix_set (A, i, j, aij);
+
+ for (k = j + 1; k < N; k++)
+ {
+ REAL aik = gsl_matrix_get (A, i, k);
+ REAL ajk = gsl_matrix_get (A, j, k);
+ gsl_matrix_set (A, i, k, aik - aij * ajk);
+ }
+ }
+ }
+ }
+
+ return GSL_SUCCESS;
+ }
+}
+
+int
+gsl_linalg_LU_solve (const gsl_matrix * LU, const gsl_permutation * p, const gsl_vector * b, gsl_vector * x)
+{
+ if (LU->size1 != LU->size2)
+ {
+ GSL_ERROR ("LU matrix must be square", GSL_ENOTSQR);
+ }
+ else if (LU->size1 != p->size)
+ {
+ GSL_ERROR ("permutation length must match matrix size", GSL_EBADLEN);
+ }
+ else if (LU->size1 != b->size)
+ {
+ GSL_ERROR ("matrix size must match b size", GSL_EBADLEN);
+ }
+ else if (LU->size2 != x->size)
+ {
+ GSL_ERROR ("matrix size must match solution size", GSL_EBADLEN);
+ }
+ else
+ {
+ /* Copy x <- b */
+
+ gsl_vector_memcpy (x, b);
+
+ /* Solve for x */
+
+ gsl_linalg_LU_svx (LU, p, x);
+
+ return GSL_SUCCESS;
+ }
+}
+
+
+int
+gsl_linalg_LU_svx (const gsl_matrix * LU, const gsl_permutation * p, gsl_vector * x)
+{
+ if (LU->size1 != LU->size2)
+ {
+ GSL_ERROR ("LU matrix must be square", GSL_ENOTSQR);
+ }
+ else if (LU->size1 != p->size)
+ {
+ GSL_ERROR ("permutation length must match matrix size", GSL_EBADLEN);
+ }
+ else if (LU->size1 != x->size)
+ {
+ GSL_ERROR ("matrix size must match solution/rhs size", GSL_EBADLEN);
+ }
+ else
+ {
+ /* Apply permutation to RHS */
+
+ gsl_permute_vector (p, x);
+
+ /* Solve for c using forward-substitution, L c = P b */
+
+ gsl_blas_dtrsv (CblasLower, CblasNoTrans, CblasUnit, LU, x);
+
+ /* Perform back-substitution, U x = c */
+
+ gsl_blas_dtrsv (CblasUpper, CblasNoTrans, CblasNonUnit, LU, x);
+
+ return GSL_SUCCESS;
+ }
+}
+
+
+int
+gsl_linalg_LU_refine (const gsl_matrix * A, const gsl_matrix * LU, const gsl_permutation * p, const gsl_vector * b, gsl_vector * x, gsl_vector * residual)
+{
+ if (A->size1 != A->size2)
+ {
+ GSL_ERROR ("matrix a must be square", GSL_ENOTSQR);
+ }
+ if (LU->size1 != LU->size2)
+ {
+ GSL_ERROR ("LU matrix must be square", GSL_ENOTSQR);
+ }
+ else if (A->size1 != LU->size2)
+ {
+ GSL_ERROR ("LU matrix must be decomposition of a", GSL_ENOTSQR);
+ }
+ else if (LU->size1 != p->size)
+ {
+ GSL_ERROR ("permutation length must match matrix size", GSL_EBADLEN);
+ }
+ else if (LU->size1 != b->size)
+ {
+ GSL_ERROR ("matrix size must match b size", GSL_EBADLEN);
+ }
+ else if (LU->size1 != x->size)
+ {
+ GSL_ERROR ("matrix size must match solution size", GSL_EBADLEN);
+ }
+ else
+ {
+ /* Compute residual, residual = (A * x - b) */
+
+ gsl_vector_memcpy (residual, b);
+ gsl_blas_dgemv (CblasNoTrans, 1.0, A, x, -1.0, residual);
+
+ /* Find correction, delta = - (A^-1) * residual, and apply it */
+
+ gsl_linalg_LU_svx (LU, p, residual);
+ gsl_blas_daxpy (-1.0, residual, x);
+
+ return GSL_SUCCESS;
+ }
+}
+
+int
+gsl_linalg_LU_invert (const gsl_matrix * LU, const gsl_permutation * p, gsl_matrix * inverse)
+{
+ size_t i, n = LU->size1;
+
+ int status = GSL_SUCCESS;
+
+ gsl_matrix_set_identity (inverse);
+
+ for (i = 0; i < n; i++)
+ {
+ gsl_vector_view c = gsl_matrix_column (inverse, i);
+ int status_i = gsl_linalg_LU_svx (LU, p, &(c.vector));
+
+ if (status_i)
+ status = status_i;
+ }
+
+ return status;
+}
+
+double
+gsl_linalg_LU_det (gsl_matrix * LU, int signum)
+{
+ size_t i, n = LU->size1;
+
+ double det = (double) signum;
+
+ for (i = 0; i < n; i++)
+ {
+ det *= gsl_matrix_get (LU, i, i);
+ }
+
+ return det;
+}
+
+
+double
+gsl_linalg_LU_lndet (gsl_matrix * LU)
+{
+ size_t i, n = LU->size1;
+
+ double lndet = 0.0;
+
+ for (i = 0; i < n; i++)
+ {
+ lndet += log (fabs (gsl_matrix_get (LU, i, i)));
+ }
+
+ return lndet;
+}
+
+
+int
+gsl_linalg_LU_sgndet (gsl_matrix * LU, int signum)
+{
+ size_t i, n = LU->size1;
+
+ int s = signum;
+
+ for (i = 0; i < n; i++)
+ {
+ double u = gsl_matrix_get (LU, i, i);
+
+ if (u < 0)
+ {
+ s *= -1;
+ }
+ else if (u == 0)
+ {
+ s = 0;
+ break;
+ }
+ }
+
+ return s;
+}
diff --git a/gsl-1.9/linalg/luc.c b/gsl-1.9/linalg/luc.c
new file mode 100644
index 0000000..5360679
--- /dev/null
+++ b/gsl-1.9/linalg/luc.c
@@ -0,0 +1,334 @@
+/* linalg/luc.c
+ *
+ * Copyright (C) 2001 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_complex.h>
+#include <gsl/gsl_complex_math.h>
+#include <gsl/gsl_permute_vector.h>
+#include <gsl/gsl_blas.h>
+#include <gsl/gsl_complex_math.h>
+
+#include <gsl/gsl_linalg.h>
+
+/* Factorise a general N x N complex matrix A into,
+ *
+ * P A = L U
+ *
+ * where P is a permutation matrix, L is unit lower triangular and U
+ * is upper triangular.
+ *
+ * L is stored in the strict lower triangular part of the input
+ * matrix. The diagonal elements of L are unity and are not stored.
+ *
+ * U is stored in the diagonal and upper triangular part of the
+ * input matrix.
+ *
+ * P is stored in the permutation p. Column j of P is column k of the
+ * identity matrix, where k = permutation->data[j]
+ *
+ * signum gives the sign of the permutation, (-1)^n, where n is the
+ * number of interchanges in the permutation.
+ *
+ * See Golub & Van Loan, Matrix Computations, Algorithm 3.4.1 (Gauss
+ * Elimination with Partial Pivoting).
+ */
+
+int
+gsl_linalg_complex_LU_decomp (gsl_matrix_complex * A, gsl_permutation * p, int *signum)
+{
+ if (A->size1 != A->size2)
+ {
+ GSL_ERROR ("LU decomposition requires square matrix", GSL_ENOTSQR);
+ }
+ else if (p->size != A->size1)
+ {
+ GSL_ERROR ("permutation length must match matrix size", GSL_EBADLEN);
+ }
+ else
+ {
+ const size_t N = A->size1;
+ size_t i, j, k;
+
+ *signum = 1;
+ gsl_permutation_init (p);
+
+ for (j = 0; j < N - 1; j++)
+ {
+ /* Find maximum in the j-th column */
+
+ gsl_complex ajj = gsl_matrix_complex_get (A, j, j);
+ double max = gsl_complex_abs (ajj);
+ size_t i_pivot = j;
+
+ for (i = j + 1; i < N; i++)
+ {
+ gsl_complex aij = gsl_matrix_complex_get (A, i, j);
+ double ai = gsl_complex_abs (aij);
+
+ if (ai > max)
+ {
+ max = ai;
+ i_pivot = i;
+ }
+ }
+
+ if (i_pivot != j)
+ {
+ gsl_matrix_complex_swap_rows (A, j, i_pivot);
+ gsl_permutation_swap (p, j, i_pivot);
+ *signum = -(*signum);
+ }
+
+ ajj = gsl_matrix_complex_get (A, j, j);
+
+ if (!(GSL_REAL(ajj) == 0.0 && GSL_IMAG(ajj) == 0.0))
+ {
+ for (i = j + 1; i < N; i++)
+ {
+ gsl_complex aij_orig = gsl_matrix_complex_get (A, i, j);
+ gsl_complex aij = gsl_complex_div (aij_orig, ajj);
+ gsl_matrix_complex_set (A, i, j, aij);
+
+ for (k = j + 1; k < N; k++)
+ {
+ gsl_complex aik = gsl_matrix_complex_get (A, i, k);
+ gsl_complex ajk = gsl_matrix_complex_get (A, j, k);
+
+ /* aik = aik - aij * ajk */
+
+ gsl_complex aijajk = gsl_complex_mul (aij, ajk);
+ gsl_complex aik_new = gsl_complex_sub (aik, aijajk);
+
+ gsl_matrix_complex_set (A, i, k, aik_new);
+ }
+ }
+ }
+ }
+
+ return GSL_SUCCESS;
+ }
+}
+
+int
+gsl_linalg_complex_LU_solve (const gsl_matrix_complex * LU, const gsl_permutation * p, const gsl_vector_complex * b, gsl_vector_complex * x)
+{
+ if (LU->size1 != LU->size2)
+ {
+ GSL_ERROR ("LU matrix must be square", GSL_ENOTSQR);
+ }
+ else if (LU->size1 != p->size)
+ {
+ GSL_ERROR ("permutation length must match matrix size", GSL_EBADLEN);
+ }
+ else if (LU->size1 != b->size)
+ {
+ GSL_ERROR ("matrix size must match b size", GSL_EBADLEN);
+ }
+ else if (LU->size2 != x->size)
+ {
+ GSL_ERROR ("matrix size must match solution size", GSL_EBADLEN);
+ }
+ else
+ {
+ /* Copy x <- b */
+
+ gsl_vector_complex_memcpy (x, b);
+
+ /* Solve for x */
+
+ gsl_linalg_complex_LU_svx (LU, p, x);
+
+ return GSL_SUCCESS;
+ }
+}
+
+
+int
+gsl_linalg_complex_LU_svx (const gsl_matrix_complex * LU, const gsl_permutation * p, gsl_vector_complex * x)
+{
+ if (LU->size1 != LU->size2)
+ {
+ GSL_ERROR ("LU matrix must be square", GSL_ENOTSQR);
+ }
+ else if (LU->size1 != p->size)
+ {
+ GSL_ERROR ("permutation length must match matrix size", GSL_EBADLEN);
+ }
+ else if (LU->size1 != x->size)
+ {
+ GSL_ERROR ("matrix size must match solution/rhs size", GSL_EBADLEN);
+ }
+ else
+ {
+ /* Apply permutation to RHS */
+
+ gsl_permute_vector_complex (p, x);
+
+ /* Solve for c using forward-substitution, L c = P b */
+
+ gsl_blas_ztrsv (CblasLower, CblasNoTrans, CblasUnit, LU, x);
+
+ /* Perform back-substitution, U x = c */
+
+ gsl_blas_ztrsv (CblasUpper, CblasNoTrans, CblasNonUnit, LU, x);
+
+ return GSL_SUCCESS;
+ }
+}
+
+
+int
+gsl_linalg_complex_LU_refine (const gsl_matrix_complex * A, const gsl_matrix_complex * LU, const gsl_permutation * p, const gsl_vector_complex * b, gsl_vector_complex * x, gsl_vector_complex * residual)
+{
+ if (A->size1 != A->size2)
+ {
+ GSL_ERROR ("matrix a must be square", GSL_ENOTSQR);
+ }
+ if (LU->size1 != LU->size2)
+ {
+ GSL_ERROR ("LU matrix must be square", GSL_ENOTSQR);
+ }
+ else if (A->size1 != LU->size2)
+ {
+ GSL_ERROR ("LU matrix must be decomposition of a", GSL_ENOTSQR);
+ }
+ else if (LU->size1 != p->size)
+ {
+ GSL_ERROR ("permutation length must match matrix size", GSL_EBADLEN);
+ }
+ else if (LU->size1 != b->size)
+ {
+ GSL_ERROR ("matrix size must match b size", GSL_EBADLEN);
+ }
+ else if (LU->size1 != x->size)
+ {
+ GSL_ERROR ("matrix size must match solution size", GSL_EBADLEN);
+ }
+ else
+ {
+ /* Compute residual, residual = (A * x - b) */
+
+ gsl_vector_complex_memcpy (residual, b);
+
+ {
+ gsl_complex one = GSL_COMPLEX_ONE;
+ gsl_complex negone = GSL_COMPLEX_NEGONE;
+ gsl_blas_zgemv (CblasNoTrans, one, A, x, negone, residual);
+ }
+
+ /* Find correction, delta = - (A^-1) * residual, and apply it */
+
+ gsl_linalg_complex_LU_svx (LU, p, residual);
+
+ {
+ gsl_complex negone= GSL_COMPLEX_NEGONE;
+ gsl_blas_zaxpy (negone, residual, x);
+ }
+
+ return GSL_SUCCESS;
+ }
+}
+
+int
+gsl_linalg_complex_LU_invert (const gsl_matrix_complex * LU, const gsl_permutation * p, gsl_matrix_complex * inverse)
+{
+ size_t i, n = LU->size1;
+
+ int status = GSL_SUCCESS;
+
+ gsl_matrix_complex_set_identity (inverse);
+
+ for (i = 0; i < n; i++)
+ {
+ gsl_vector_complex_view c = gsl_matrix_complex_column (inverse, i);
+ int status_i = gsl_linalg_complex_LU_svx (LU, p, &(c.vector));
+
+ if (status_i)
+ status = status_i;
+ }
+
+ return status;
+}
+
+gsl_complex
+gsl_linalg_complex_LU_det (gsl_matrix_complex * LU, int signum)
+{
+ size_t i, n = LU->size1;
+
+ gsl_complex det = gsl_complex_rect((double) signum, 0.0);
+
+ for (i = 0; i < n; i++)
+ {
+ gsl_complex zi = gsl_matrix_complex_get (LU, i, i);
+ det = gsl_complex_mul (det, zi);
+ }
+
+ return det;
+}
+
+
+double
+gsl_linalg_complex_LU_lndet (gsl_matrix_complex * LU)
+{
+ size_t i, n = LU->size1;
+
+ double lndet = 0.0;
+
+ for (i = 0; i < n; i++)
+ {
+ gsl_complex z = gsl_matrix_complex_get (LU, i, i);
+ lndet += log (gsl_complex_abs (z));
+ }
+
+ return lndet;
+}
+
+
+gsl_complex
+gsl_linalg_complex_LU_sgndet (gsl_matrix_complex * LU, int signum)
+{
+ size_t i, n = LU->size1;
+
+ gsl_complex phase = gsl_complex_rect((double) signum, 0.0);
+
+ for (i = 0; i < n; i++)
+ {
+ gsl_complex z = gsl_matrix_complex_get (LU, i, i);
+
+ double r = gsl_complex_abs(z);
+
+ if (r == 0)
+ {
+ phase = gsl_complex_rect(0.0, 0.0);
+ break;
+ }
+ else
+ {
+ z = gsl_complex_div_real(z, r);
+ phase = gsl_complex_mul(phase, z);
+ }
+ }
+
+ return phase;
+}
diff --git a/gsl-1.9/linalg/multiply.c b/gsl-1.9/linalg/multiply.c
new file mode 100644
index 0000000..0522cdd
--- /dev/null
+++ b/gsl-1.9/linalg/multiply.c
@@ -0,0 +1,137 @@
+/* linalg/multiply.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_linalg.h>
+
+#define SWAP_SIZE_T(a, b) do { size_t swap_tmp = a; a = b; b = swap_tmp; } while(0)
+
+int
+gsl_linalg_matmult (const gsl_matrix * A, const gsl_matrix * B, gsl_matrix * C)
+{
+ if (A->size2 != B->size1 || A->size1 != C->size1 || B->size2 != C->size2)
+ {
+ GSL_ERROR ("matrix sizes are not conformant", GSL_EBADLEN);
+ }
+ else
+ {
+ double a, b;
+ double temp;
+ size_t i, j, k;
+
+ for (i = 0; i < C->size1; i++)
+ {
+ for (j = 0; j < C->size2; j++)
+ {
+ a = gsl_matrix_get (A, i, 0);
+ b = gsl_matrix_get (B, 0, j);
+ temp = a * b;
+ for (k = 1; k < A->size2; k++)
+ {
+ a = gsl_matrix_get (A, i, k);
+ b = gsl_matrix_get (B, k, j);
+ temp += a * b;
+ }
+ gsl_matrix_set (C, i, j, temp);
+ }
+ }
+
+ return GSL_SUCCESS;
+ }
+}
+
+
+int
+gsl_linalg_matmult_mod (const gsl_matrix * A, gsl_linalg_matrix_mod_t modA,
+ const gsl_matrix * B, gsl_linalg_matrix_mod_t modB,
+ gsl_matrix * C)
+{
+ if (modA == GSL_LINALG_MOD_NONE && modB == GSL_LINALG_MOD_NONE)
+ {
+ return gsl_linalg_matmult (A, B, C);
+ }
+ else
+ {
+ size_t dim1_A = A->size1;
+ size_t dim2_A = A->size2;
+ size_t dim1_B = B->size1;
+ size_t dim2_B = B->size2;
+ size_t dim1_C = C->size1;
+ size_t dim2_C = C->size2;
+
+ if (modA & GSL_LINALG_MOD_TRANSPOSE)
+ SWAP_SIZE_T (dim1_A, dim2_A);
+ if (modB & GSL_LINALG_MOD_TRANSPOSE)
+ SWAP_SIZE_T (dim1_B, dim2_B);
+
+ if (dim2_A != dim1_B || dim1_A != dim1_C || dim2_B != dim2_C)
+ {
+ GSL_ERROR ("matrix sizes are not conformant", GSL_EBADLEN);
+ }
+ else
+ {
+ double a, b;
+ double temp;
+ size_t i, j, k;
+ size_t a1, a2, b1, b2;
+
+ for (i = 0; i < dim1_C; i++)
+ {
+ for (j = 0; j < dim2_C; j++)
+ {
+ a1 = i;
+ a2 = 0;
+ b1 = 0;
+ b2 = j;
+ if (modA & GSL_LINALG_MOD_TRANSPOSE)
+ SWAP_SIZE_T (a1, a2);
+ if (modB & GSL_LINALG_MOD_TRANSPOSE)
+ SWAP_SIZE_T (b1, b2);
+
+ a = gsl_matrix_get (A, a1, a2);
+ b = gsl_matrix_get (B, b1, b2);
+ temp = a * b;
+
+ for (k = 1; k < dim2_A; k++)
+ {
+ a1 = i;
+ a2 = k;
+ b1 = k;
+ b2 = j;
+ if (modA & GSL_LINALG_MOD_TRANSPOSE)
+ SWAP_SIZE_T (a1, a2);
+ if (modB & GSL_LINALG_MOD_TRANSPOSE)
+ SWAP_SIZE_T (b1, b2);
+ a = gsl_matrix_get (A, a1, a2);
+ b = gsl_matrix_get (B, b1, b2);
+ temp += a * b;
+ }
+
+ gsl_matrix_set (C, i, j, temp);
+ }
+ }
+
+ return GSL_SUCCESS;
+ }
+ }
+}
diff --git a/gsl-1.9/linalg/ptlq.c b/gsl-1.9/linalg/ptlq.c
new file mode 100644
index 0000000..f6368f0
--- /dev/null
+++ b/gsl-1.9/linalg/ptlq.c
@@ -0,0 +1,493 @@
+/* linalg/ptlq.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ * Copyright (C) 2004 Joerg Wensch, modifications for LQ.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gsl/gsl_blas.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_permute_vector.h>
+#include <gsl/gsl_linalg.h>
+
+#include "givens.c"
+#include "apply_givens.c"
+
+/* The purpose of this package is to speed up QR-decomposition for
+ large matrices. Because QR-decomposition is column oriented, but
+ GSL uses a row-oriented matrix format, there can considerable
+ speedup obtained by computing the LQ-decomposition of the
+ transposed matrix instead. This package provides LQ-decomposition
+ and related algorithms. */
+
+/* Factorise a general N x M matrix A into
+ *
+ * P A = L Q
+ *
+ * where Q is orthogonal (M x M) and L is lower triangular (N x M).
+ * When A is rank deficient, r = rank(A) < n, then the permutation is
+ * used to ensure that the lower n - r columns of L are zero and the first
+ * l rows of Q form an orthonormal basis for the rows of A.
+ *
+ * Q is stored as a packed set of Householder transformations in the
+ * strict upper triangular part of the input matrix.
+ *
+ * L is stored in the diagonal and lower triangle of the input matrix.
+ *
+ * P: column j of P is column k of the identity matrix, where k =
+ * permutation->data[j]
+ *
+ * The full matrix for Q can be obtained as the product
+ *
+ * Q = Q_k .. Q_2 Q_1
+ *
+ * where k = MIN(M,N) and
+ *
+ * Q_i = (I - tau_i * v_i * v_i')
+ *
+ * and where v_i is a Householder vector
+ *
+ * v_i = [1, m(i,i+1), m(i,i+2), ... , m(i,M)]
+ *
+ * This storage scheme is the same as in LAPACK. See LAPACK's
+ * dgeqpf.f for details.
+ *
+ */
+
+int
+gsl_linalg_PTLQ_decomp (gsl_matrix * A, gsl_vector * tau, gsl_permutation * p, int *signum, gsl_vector * norm)
+{
+ const size_t N = A->size1;
+ const size_t M = A->size2;
+
+ if (tau->size != GSL_MIN (M, N))
+ {
+ GSL_ERROR ("size of tau must be MIN(M,N)", GSL_EBADLEN);
+ }
+ else if (p->size != N)
+ {
+ GSL_ERROR ("permutation size must be N", GSL_EBADLEN);
+ }
+ else if (norm->size != N)
+ {
+ GSL_ERROR ("norm size must be N", GSL_EBADLEN);
+ }
+ else
+ {
+ size_t i;
+
+ *signum = 1;
+
+ gsl_permutation_init (p); /* set to identity */
+
+ /* Compute column norms and store in workspace */
+
+ for (i = 0; i < N; i++)
+ {
+ gsl_vector_view c = gsl_matrix_row (A, i);
+ double x = gsl_blas_dnrm2 (&c.vector);
+ gsl_vector_set (norm, i, x);
+ }
+
+ for (i = 0; i < GSL_MIN (M, N); i++)
+ {
+ /* Bring the column of largest norm into the pivot position */
+
+ double max_norm = gsl_vector_get(norm, i);
+ size_t j, kmax = i;
+
+ for (j = i + 1; j < N; j++)
+ {
+ double x = gsl_vector_get (norm, j);
+
+ if (x > max_norm)
+ {
+ max_norm = x;
+ kmax = j;
+ }
+ }
+
+ if (kmax != i)
+ {
+ gsl_matrix_swap_rows (A, i, kmax);
+ gsl_permutation_swap (p, i, kmax);
+ gsl_vector_swap_elements(norm,i,kmax);
+
+ (*signum) = -(*signum);
+ }
+
+ /* Compute the Householder transformation to reduce the j-th
+ column of the matrix to a multiple of the j-th unit vector */
+
+ {
+ gsl_vector_view c_full = gsl_matrix_row (A, i);
+ gsl_vector_view c = gsl_vector_subvector (&c_full.vector,
+ i, M - i);
+ double tau_i = gsl_linalg_householder_transform (&c.vector);
+
+ gsl_vector_set (tau, i, tau_i);
+
+ /* Apply the transformation to the remaining columns */
+
+ if (i + 1 < N)
+ {
+ gsl_matrix_view m = gsl_matrix_submatrix (A, i +1, i, N - (i+1), M - i);
+
+ gsl_linalg_householder_mh (tau_i, &c.vector, &m.matrix);
+ }
+ }
+
+ /* Update the norms of the remaining columns too */
+
+ if (i + 1 < M)
+ {
+ for (j = i + 1; j < N; j++)
+ {
+ double x = gsl_vector_get (norm, j);
+
+ if (x > 0.0)
+ {
+ double y = 0;
+ double temp= gsl_matrix_get (A, j, i) / x;
+
+ if (fabs (temp) >= 1)
+ y = 0.0;
+ else
+ y = x * sqrt (1 - temp * temp);
+
+ /* recompute norm to prevent loss of accuracy */
+
+ if (fabs (y / x) < sqrt (20.0) * GSL_SQRT_DBL_EPSILON)
+ {
+ gsl_vector_view c_full = gsl_matrix_row (A, j);
+ gsl_vector_view c =
+ gsl_vector_subvector(&c_full.vector,
+ i+1, M - (i+1));
+ y = gsl_blas_dnrm2 (&c.vector);
+ }
+
+ gsl_vector_set (norm, j, y);
+ }
+ }
+ }
+ }
+
+ return GSL_SUCCESS;
+ }
+}
+
+int
+gsl_linalg_PTLQ_decomp2 (const gsl_matrix * A, gsl_matrix * q, gsl_matrix * r, gsl_vector * tau, gsl_permutation * p, int *signum, gsl_vector * norm)
+{
+ const size_t N = A->size1;
+ const size_t M = A->size2;
+
+ if (q->size1 != M || q->size2 !=M)
+ {
+ GSL_ERROR ("q must be M x M", GSL_EBADLEN);
+ }
+ else if (r->size1 != N || r->size2 !=M)
+ {
+ GSL_ERROR ("r must be N x M", GSL_EBADLEN);
+ }
+ else if (tau->size != GSL_MIN (M, N))
+ {
+ GSL_ERROR ("size of tau must be MIN(M,N)", GSL_EBADLEN);
+ }
+ else if (p->size != N)
+ {
+ GSL_ERROR ("permutation size must be N", GSL_EBADLEN);
+ }
+ else if (norm->size != N)
+ {
+ GSL_ERROR ("norm size must be N", GSL_EBADLEN);
+ }
+
+ gsl_matrix_memcpy (r, A);
+
+ gsl_linalg_PTLQ_decomp (r, tau, p, signum, norm);
+
+ /* FIXME: aliased arguments depends on behavior of unpack routine! */
+
+ gsl_linalg_LQ_unpack (r, tau, q, r);
+
+ return GSL_SUCCESS;
+}
+
+
+/* Solves the system x^T A = b^T using the P^T L Q factorisation,
+
+ z^T L = b^T Q^T
+
+ x = P z;
+
+ to obtain x. Based on SLATEC code. */
+
+int
+gsl_linalg_PTLQ_solve_T (const gsl_matrix * QR,
+ const gsl_vector * tau,
+ const gsl_permutation * p,
+ const gsl_vector * b,
+ gsl_vector * x)
+{
+ if (QR->size1 != QR->size2)
+ {
+ GSL_ERROR ("QR matrix must be square", GSL_ENOTSQR);
+ }
+ else if (QR->size2 != p->size)
+ {
+ GSL_ERROR ("matrix size must match permutation size", GSL_EBADLEN);
+ }
+ else if (QR->size2 != b->size)
+ {
+ GSL_ERROR ("matrix size must match b size", GSL_EBADLEN);
+ }
+ else if (QR->size1 != x->size)
+ {
+ GSL_ERROR ("matrix size must match solution size", GSL_EBADLEN);
+ }
+ else
+ {
+ gsl_vector_memcpy (x, b);
+
+ gsl_linalg_PTLQ_svx_T (QR, tau, p, x);
+
+ return GSL_SUCCESS;
+ }
+}
+
+int
+gsl_linalg_PTLQ_svx_T (const gsl_matrix * LQ,
+ const gsl_vector * tau,
+ const gsl_permutation * p,
+ gsl_vector * x)
+{
+ if (LQ->size1 != LQ->size2)
+ {
+ GSL_ERROR ("LQ matrix must be square", GSL_ENOTSQR);
+ }
+ else if (LQ->size2 != p->size)
+ {
+ GSL_ERROR ("matrix size must match permutation size", GSL_EBADLEN);
+ }
+ else if (LQ->size1 != x->size)
+ {
+ GSL_ERROR ("matrix size must match solution size", GSL_EBADLEN);
+ }
+ else
+ {
+ /* compute sol = b^T Q^T */
+
+ gsl_linalg_LQ_vecQT (LQ, tau, x);
+
+ /* Solve L^T x = sol, storing x inplace in sol */
+
+ gsl_blas_dtrsv (CblasLower, CblasTrans, CblasNonUnit, LQ, x);
+
+ gsl_permute_vector_inverse (p, x);
+
+ return GSL_SUCCESS;
+ }
+}
+
+
+int
+gsl_linalg_PTLQ_LQsolve_T (const gsl_matrix * Q, const gsl_matrix * L,
+ const gsl_permutation * p,
+ const gsl_vector * b,
+ gsl_vector * x)
+{
+ if (Q->size1 != Q->size2 || L->size1 != L->size2)
+ {
+ return GSL_ENOTSQR;
+ }
+ else if (Q->size1 != p->size || Q->size1 != L->size1
+ || Q->size1 != b->size)
+ {
+ return GSL_EBADLEN;
+ }
+ else
+ {
+ /* compute b' = Q b */
+
+ gsl_blas_dgemv (CblasNoTrans, 1.0, Q, b, 0.0, x);
+
+ /* Solve L^T x = b', storing x inplace */
+
+ gsl_blas_dtrsv (CblasLower, CblasTrans, CblasNonUnit, L, x);
+
+ /* Apply permutation to solution in place */
+
+ gsl_permute_vector_inverse (p, x);
+
+ return GSL_SUCCESS;
+ }
+}
+
+int
+gsl_linalg_PTLQ_Lsolve_T (const gsl_matrix * LQ,
+ const gsl_permutation * p,
+ const gsl_vector * b,
+ gsl_vector * x)
+{
+ if (LQ->size1 != LQ->size2)
+ {
+ GSL_ERROR ("LQ matrix must be square", GSL_ENOTSQR);
+ }
+ else if (LQ->size1 != b->size)
+ {
+ GSL_ERROR ("matrix size must match b size", GSL_EBADLEN);
+ }
+ else if (LQ->size2 != x->size)
+ {
+ GSL_ERROR ("matrix size must match x size", GSL_EBADLEN);
+ }
+ else if (p->size != x->size)
+ {
+ GSL_ERROR ("permutation size must match x size", GSL_EBADLEN);
+ }
+ else
+ {
+ /* Copy x <- b */
+
+ gsl_vector_memcpy (x, b);
+
+ /* Solve L^T x = b, storing x inplace */
+
+ gsl_blas_dtrsv (CblasLower, CblasTrans, CblasNonUnit, LQ, x);
+
+ gsl_permute_vector_inverse (p, x);
+
+ return GSL_SUCCESS;
+ }
+}
+
+
+int
+gsl_linalg_PTLQ_Lsvx_T (const gsl_matrix * LQ,
+ const gsl_permutation * p,
+ gsl_vector * x)
+{
+ if (LQ->size1 != LQ->size2)
+ {
+ GSL_ERROR ("LQ matrix must be square", GSL_ENOTSQR);
+ }
+ else if (LQ->size2 != x->size)
+ {
+ GSL_ERROR ("matrix size must match x size", GSL_EBADLEN);
+ }
+ else if (p->size != x->size)
+ {
+ GSL_ERROR ("permutation size must match x size", GSL_EBADLEN);
+ }
+ else
+ {
+ /* Solve L^T x = b, storing x inplace */
+
+ gsl_blas_dtrsv (CblasLower, CblasTrans, CblasNonUnit, LQ, x);
+
+ gsl_permute_vector_inverse (p, x);
+
+ return GSL_SUCCESS;
+ }
+}
+
+
+
+/* Update a P^T L Q factorisation for P A= L Q , A' = A + v u^T,
+ PA' = PA + Pv u^T
+
+ * P^T L' Q' = P^T LQ + v u^T
+ * = P^T (L + (P v) u^T Q^T) Q
+ * = P^T (L + (P v) w^T) Q
+ *
+ * where w = Q^T u.
+ *
+ * Algorithm from Golub and Van Loan, "Matrix Computations", Section
+ * 12.5 (Updating Matrix Factorizations, Rank-One Changes)
+ */
+
+int
+gsl_linalg_PTLQ_update (gsl_matrix * Q, gsl_matrix * L,
+ const gsl_permutation * p,
+ const gsl_vector * v, gsl_vector * w)
+{
+ if (Q->size1 != Q->size2 || L->size1 != L->size2)
+ {
+ return GSL_ENOTSQR;
+ }
+ else if (L->size1 != Q->size2 || v->size != Q->size2 || w->size != Q->size2)
+ {
+ return GSL_EBADLEN;
+ }
+ else
+ {
+ size_t j, k;
+ const size_t N = Q->size1;
+ const size_t M = Q->size2;
+ double w0;
+
+ /* Apply Given's rotations to reduce w to (|w|, 0, 0, ... , 0)
+
+ J_1^T .... J_(n-1)^T w = +/- |w| e_1
+
+ simultaneously applied to L, H = J_1^T ... J^T_(n-1) L
+ so that H is upper Hessenberg. (12.5.2) */
+
+ for (k = M - 1; k > 0; k--)
+ {
+ double c, s;
+ double wk = gsl_vector_get (w, k);
+ double wkm1 = gsl_vector_get (w, k - 1);
+
+ create_givens (wkm1, wk, &c, &s);
+ apply_givens_vec (w, k - 1, k, c, s);
+ apply_givens_lq (M, N, Q, L, k - 1, k, c, s);
+ }
+
+ w0 = gsl_vector_get (w, 0);
+
+ /* Add in v w^T (Equation 12.5.3) */
+
+ for (j = 0; j < N; j++)
+ {
+ double lj0 = gsl_matrix_get (L, j, 0);
+ size_t p_j = gsl_permutation_get (p, j);
+ double vj = gsl_vector_get (v, p_j);
+ gsl_matrix_set (L, j, 0, lj0 + w0 * vj);
+ }
+
+ /* Apply Givens transformations L' = G_(n-1)^T ... G_1^T H
+ Equation 12.5.4 */
+
+ for (k = 1; k < N; k++)
+ {
+ double c, s;
+ double diag = gsl_matrix_get (L, k - 1, k - 1);
+ double offdiag = gsl_matrix_get (L, k - 1, k );
+
+ create_givens (diag, offdiag, &c, &s);
+ apply_givens_lq (M, N, Q, L, k - 1, k, c, s);
+ }
+
+ return GSL_SUCCESS;
+ }
+}
diff --git a/gsl-1.9/linalg/qr.c b/gsl-1.9/linalg/qr.c
new file mode 100644
index 0000000..f3526e6
--- /dev/null
+++ b/gsl-1.9/linalg/qr.c
@@ -0,0 +1,566 @@
+/* linalg/qr.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_blas.h>
+
+#include <gsl/gsl_linalg.h>
+
+#define REAL double
+
+#include "givens.c"
+#include "apply_givens.c"
+
+/* Factorise a general M x N matrix A into
+ *
+ * A = Q R
+ *
+ * where Q is orthogonal (M x M) and R is upper triangular (M x N).
+ *
+ * Q is stored as a packed set of Householder transformations in the
+ * strict lower triangular part of the input matrix.
+ *
+ * R is stored in the diagonal and upper triangle of the input matrix.
+ *
+ * The full matrix for Q can be obtained as the product
+ *
+ * Q = Q_k .. Q_2 Q_1
+ *
+ * where k = MIN(M,N) and
+ *
+ * Q_i = (I - tau_i * v_i * v_i')
+ *
+ * and where v_i is a Householder vector
+ *
+ * v_i = [1, m(i+1,i), m(i+2,i), ... , m(M,i)]
+ *
+ * This storage scheme is the same as in LAPACK. */
+
+int
+gsl_linalg_QR_decomp (gsl_matrix * A, gsl_vector * tau)
+{
+ const size_t M = A->size1;
+ const size_t N = A->size2;
+
+ if (tau->size != GSL_MIN (M, N))
+ {
+ GSL_ERROR ("size of tau must be MIN(M,N)", GSL_EBADLEN);
+ }
+ else
+ {
+ size_t i;
+
+ for (i = 0; i < GSL_MIN (M, N); i++)
+ {
+ /* Compute the Householder transformation to reduce the j-th
+ column of the matrix to a multiple of the j-th unit vector */
+
+ gsl_vector_view c_full = gsl_matrix_column (A, i);
+ gsl_vector_view c = gsl_vector_subvector (&(c_full.vector), i, M-i);
+
+ double tau_i = gsl_linalg_householder_transform (&(c.vector));
+
+ gsl_vector_set (tau, i, tau_i);
+
+ /* Apply the transformation to the remaining columns and
+ update the norms */
+
+ if (i + 1 < N)
+ {
+ gsl_matrix_view m = gsl_matrix_submatrix (A, i, i + 1, M - i, N - (i + 1));
+ gsl_linalg_householder_hm (tau_i, &(c.vector), &(m.matrix));
+ }
+ }
+
+ return GSL_SUCCESS;
+ }
+}
+
+/* Solves the system A x = b using the QR factorisation,
+
+ * R x = Q^T b
+ *
+ * to obtain x. Based on SLATEC code.
+ */
+
+int
+gsl_linalg_QR_solve (const gsl_matrix * QR, const gsl_vector * tau, const gsl_vector * b, gsl_vector * x)
+{
+ if (QR->size1 != QR->size2)
+ {
+ GSL_ERROR ("QR matrix must be square", GSL_ENOTSQR);
+ }
+ else if (QR->size1 != b->size)
+ {
+ GSL_ERROR ("matrix size must match b size", GSL_EBADLEN);
+ }
+ else if (QR->size2 != x->size)
+ {
+ GSL_ERROR ("matrix size must match solution size", GSL_EBADLEN);
+ }
+ else
+ {
+ /* Copy x <- b */
+
+ gsl_vector_memcpy (x, b);
+
+ /* Solve for x */
+
+ gsl_linalg_QR_svx (QR, tau, x);
+
+ return GSL_SUCCESS;
+ }
+}
+
+/* Solves the system A x = b in place using the QR factorisation,
+
+ * R x = Q^T b
+ *
+ * to obtain x. Based on SLATEC code.
+ */
+
+int
+gsl_linalg_QR_svx (const gsl_matrix * QR, const gsl_vector * tau, gsl_vector * x)
+{
+
+ if (QR->size1 != QR->size2)
+ {
+ GSL_ERROR ("QR matrix must be square", GSL_ENOTSQR);
+ }
+ else if (QR->size1 != x->size)
+ {
+ GSL_ERROR ("matrix size must match x/rhs size", GSL_EBADLEN);
+ }
+ else
+ {
+ /* compute rhs = Q^T b */
+
+ gsl_linalg_QR_QTvec (QR, tau, x);
+
+ /* Solve R x = rhs, storing x in-place */
+
+ gsl_blas_dtrsv (CblasUpper, CblasNoTrans, CblasNonUnit, QR, x);
+
+ return GSL_SUCCESS;
+ }
+}
+
+
+/* Find the least squares solution to the overdetermined system
+ *
+ * A x = b
+ *
+ * for M >= N using the QR factorization A = Q R.
+ */
+
+int
+gsl_linalg_QR_lssolve (const gsl_matrix * QR, const gsl_vector * tau, const gsl_vector * b, gsl_vector * x, gsl_vector * residual)
+{
+ const size_t M = QR->size1;
+ const size_t N = QR->size2;
+
+ if (M < N)
+ {
+ GSL_ERROR ("QR matrix must have M>=N", GSL_EBADLEN);
+ }
+ else if (M != b->size)
+ {
+ GSL_ERROR ("matrix size must match b size", GSL_EBADLEN);
+ }
+ else if (N != x->size)
+ {
+ GSL_ERROR ("matrix size must match solution size", GSL_EBADLEN);
+ }
+ else if (M != residual->size)
+ {
+ GSL_ERROR ("matrix size must match residual size", GSL_EBADLEN);
+ }
+ else
+ {
+ gsl_matrix_const_view R = gsl_matrix_const_submatrix (QR, 0, 0, N, N);
+ gsl_vector_view c = gsl_vector_subvector(residual, 0, N);
+
+ gsl_vector_memcpy(residual, b);
+
+ /* compute rhs = Q^T b */
+
+ gsl_linalg_QR_QTvec (QR, tau, residual);
+
+ /* Solve R x = rhs */
+
+ gsl_vector_memcpy(x, &(c.vector));
+
+ gsl_blas_dtrsv (CblasUpper, CblasNoTrans, CblasNonUnit, &(R.matrix), x);
+
+ /* Compute residual = b - A x = Q (Q^T b - R x) */
+
+ gsl_vector_set_zero(&(c.vector));
+
+ gsl_linalg_QR_Qvec(QR, tau, residual);
+
+ return GSL_SUCCESS;
+ }
+}
+
+
+int
+gsl_linalg_QR_Rsolve (const gsl_matrix * QR, const gsl_vector * b, gsl_vector * x)
+{
+ if (QR->size1 != QR->size2)
+ {
+ GSL_ERROR ("QR matrix must be square", GSL_ENOTSQR);
+ }
+ else if (QR->size1 != b->size)
+ {
+ GSL_ERROR ("matrix size must match b size", GSL_EBADLEN);
+ }
+ else if (QR->size2 != x->size)
+ {
+ GSL_ERROR ("matrix size must match x size", GSL_EBADLEN);
+ }
+ else
+ {
+ /* Copy x <- b */
+
+ gsl_vector_memcpy (x, b);
+
+ /* Solve R x = b, storing x in-place */
+
+ gsl_blas_dtrsv (CblasUpper, CblasNoTrans, CblasNonUnit, QR, x);
+
+ return GSL_SUCCESS;
+ }
+}
+
+
+int
+gsl_linalg_QR_Rsvx (const gsl_matrix * QR, gsl_vector * x)
+{
+ if (QR->size1 != QR->size2)
+ {
+ GSL_ERROR ("QR matrix must be square", GSL_ENOTSQR);
+ }
+ else if (QR->size1 != x->size)
+ {
+ GSL_ERROR ("matrix size must match rhs size", GSL_EBADLEN);
+ }
+ else
+ {
+ /* Solve R x = b, storing x in-place */
+
+ gsl_blas_dtrsv (CblasUpper, CblasNoTrans, CblasNonUnit, QR, x);
+
+ return GSL_SUCCESS;
+ }
+}
+
+int
+gsl_linalg_R_solve (const gsl_matrix * R, const gsl_vector * b, gsl_vector * x)
+{
+ if (R->size1 != R->size2)
+ {
+ GSL_ERROR ("R matrix must be square", GSL_ENOTSQR);
+ }
+ else if (R->size1 != b->size)
+ {
+ GSL_ERROR ("matrix size must match b size", GSL_EBADLEN);
+ }
+ else if (R->size2 != x->size)
+ {
+ GSL_ERROR ("matrix size must match solution size", GSL_EBADLEN);
+ }
+ else
+ {
+ /* Copy x <- b */
+
+ gsl_vector_memcpy (x, b);
+
+ /* Solve R x = b, storing x inplace in b */
+
+ gsl_blas_dtrsv (CblasUpper, CblasNoTrans, CblasNonUnit, R, x);
+
+ return GSL_SUCCESS;
+ }
+}
+
+int
+gsl_linalg_R_svx (const gsl_matrix * R, gsl_vector * x)
+{
+ if (R->size1 != R->size2)
+ {
+ GSL_ERROR ("R matrix must be square", GSL_ENOTSQR);
+ }
+ else if (R->size2 != x->size)
+ {
+ GSL_ERROR ("matrix size must match solution size", GSL_EBADLEN);
+ }
+ else
+ {
+ /* Solve R x = b, storing x inplace in b */
+
+ gsl_blas_dtrsv (CblasUpper, CblasNoTrans, CblasNonUnit, R, x);
+
+ return GSL_SUCCESS;
+ }
+}
+
+
+
+/* Form the product Q^T v from a QR factorized matrix
+ */
+
+int
+gsl_linalg_QR_QTvec (const gsl_matrix * QR, const gsl_vector * tau, gsl_vector * v)
+{
+ const size_t M = QR->size1;
+ const size_t N = QR->size2;
+
+ if (tau->size != GSL_MIN (M, N))
+ {
+ GSL_ERROR ("size of tau must be MIN(M,N)", GSL_EBADLEN);
+ }
+ else if (v->size != M)
+ {
+ GSL_ERROR ("vector size must be N", GSL_EBADLEN);
+ }
+ else
+ {
+ size_t i;
+
+ /* compute Q^T v */
+
+ for (i = 0; i < GSL_MIN (M, N); i++)
+ {
+ gsl_vector_const_view c = gsl_matrix_const_column (QR, i);
+ gsl_vector_const_view h = gsl_vector_const_subvector (&(c.vector), i, M - i);
+ gsl_vector_view w = gsl_vector_subvector (v, i, M - i);
+ double ti = gsl_vector_get (tau, i);
+ gsl_linalg_householder_hv (ti, &(h.vector), &(w.vector));
+ }
+ return GSL_SUCCESS;
+ }
+}
+
+
+int
+gsl_linalg_QR_Qvec (const gsl_matrix * QR, const gsl_vector * tau, gsl_vector * v)
+{
+ const size_t M = QR->size1;
+ const size_t N = QR->size2;
+
+ if (tau->size != GSL_MIN (M, N))
+ {
+ GSL_ERROR ("size of tau must be MIN(M,N)", GSL_EBADLEN);
+ }
+ else if (v->size != M)
+ {
+ GSL_ERROR ("vector size must be N", GSL_EBADLEN);
+ }
+ else
+ {
+ size_t i;
+
+ /* compute Q^T v */
+
+ for (i = GSL_MIN (M, N); i > 0 && i--;)
+ {
+ gsl_vector_const_view c = gsl_matrix_const_column (QR, i);
+ gsl_vector_const_view h = gsl_vector_const_subvector (&(c.vector),
+ i, M - i);
+ gsl_vector_view w = gsl_vector_subvector (v, i, M - i);
+ double ti = gsl_vector_get (tau, i);
+ gsl_linalg_householder_hv (ti, &h.vector, &w.vector);
+ }
+ return GSL_SUCCESS;
+ }
+}
+
+
+/* Form the orthogonal matrix Q from the packed QR matrix */
+
+int
+gsl_linalg_QR_unpack (const gsl_matrix * QR, const gsl_vector * tau, gsl_matrix * Q, gsl_matrix * R)
+{
+ const size_t M = QR->size1;
+ const size_t N = QR->size2;
+
+ if (Q->size1 != M || Q->size2 != M)
+ {
+ GSL_ERROR ("Q matrix must be M x M", GSL_ENOTSQR);
+ }
+ else if (R->size1 != M || R->size2 != N)
+ {
+ GSL_ERROR ("R matrix must be M x N", GSL_ENOTSQR);
+ }
+ else if (tau->size != GSL_MIN (M, N))
+ {
+ GSL_ERROR ("size of tau must be MIN(M,N)", GSL_EBADLEN);
+ }
+ else
+ {
+ size_t i, j;
+
+ /* Initialize Q to the identity */
+
+ gsl_matrix_set_identity (Q);
+
+ for (i = GSL_MIN (M, N); i > 0 && i--;)
+ {
+ gsl_vector_const_view c = gsl_matrix_const_column (QR, i);
+ gsl_vector_const_view h = gsl_vector_const_subvector (&c.vector,
+ i, M - i);
+ gsl_matrix_view m = gsl_matrix_submatrix (Q, i, i, M - i, M - i);
+ double ti = gsl_vector_get (tau, i);
+ gsl_linalg_householder_hm (ti, &h.vector, &m.matrix);
+ }
+
+ /* Form the right triangular matrix R from a packed QR matrix */
+
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < i && j < N; j++)
+ gsl_matrix_set (R, i, j, 0.0);
+
+ for (j = i; j < N; j++)
+ gsl_matrix_set (R, i, j, gsl_matrix_get (QR, i, j));
+ }
+
+ return GSL_SUCCESS;
+ }
+}
+
+
+/* Update a QR factorisation for A= Q R , A' = A + u v^T,
+
+ * Q' R' = QR + u v^T
+ * = Q (R + Q^T u v^T)
+ * = Q (R + w v^T)
+ *
+ * where w = Q^T u.
+ *
+ * Algorithm from Golub and Van Loan, "Matrix Computations", Section
+ * 12.5 (Updating Matrix Factorizations, Rank-One Changes)
+ */
+
+int
+gsl_linalg_QR_update (gsl_matrix * Q, gsl_matrix * R,
+ gsl_vector * w, const gsl_vector * v)
+{
+ const size_t M = R->size1;
+ const size_t N = R->size2;
+
+ if (Q->size1 != M || Q->size2 != M)
+ {
+ GSL_ERROR ("Q matrix must be M x M if R is M x N", GSL_ENOTSQR);
+ }
+ else if (w->size != M)
+ {
+ GSL_ERROR ("w must be length M if R is M x N", GSL_EBADLEN);
+ }
+ else if (v->size != N)
+ {
+ GSL_ERROR ("v must be length N if R is M x N", GSL_EBADLEN);
+ }
+ else
+ {
+ size_t j, k;
+ double w0;
+
+ /* Apply Given's rotations to reduce w to (|w|, 0, 0, ... , 0)
+
+ J_1^T .... J_(n-1)^T w = +/- |w| e_1
+
+ simultaneously applied to R, H = J_1^T ... J^T_(n-1) R
+ so that H is upper Hessenberg. (12.5.2) */
+
+ for (k = M - 1; k > 0; k--)
+ {
+ double c, s;
+ double wk = gsl_vector_get (w, k);
+ double wkm1 = gsl_vector_get (w, k - 1);
+
+ create_givens (wkm1, wk, &c, &s);
+ apply_givens_vec (w, k - 1, k, c, s);
+ apply_givens_qr (M, N, Q, R, k - 1, k, c, s);
+ }
+
+ w0 = gsl_vector_get (w, 0);
+
+ /* Add in w v^T (Equation 12.5.3) */
+
+ for (j = 0; j < N; j++)
+ {
+ double r0j = gsl_matrix_get (R, 0, j);
+ double vj = gsl_vector_get (v, j);
+ gsl_matrix_set (R, 0, j, r0j + w0 * vj);
+ }
+
+ /* Apply Givens transformations R' = G_(n-1)^T ... G_1^T H
+ Equation 12.5.4 */
+
+ for (k = 1; k < GSL_MIN(M,N+1); k++)
+ {
+ double c, s;
+ double diag = gsl_matrix_get (R, k - 1, k - 1);
+ double offdiag = gsl_matrix_get (R, k, k - 1);
+
+ create_givens (diag, offdiag, &c, &s);
+ apply_givens_qr (M, N, Q, R, k - 1, k, c, s);
+
+ gsl_matrix_set (R, k, k - 1, 0.0); /* exact zero of G^T */
+ }
+
+ return GSL_SUCCESS;
+ }
+}
+
+int
+gsl_linalg_QR_QRsolve (gsl_matrix * Q, gsl_matrix * R, const gsl_vector * b, gsl_vector * x)
+{
+ const size_t M = R->size1;
+ const size_t N = R->size2;
+
+ if (M != N)
+ {
+ return GSL_ENOTSQR;
+ }
+ else if (Q->size1 != M || b->size != M || x->size != M)
+ {
+ return GSL_EBADLEN;
+ }
+ else
+ {
+ /* compute sol = Q^T b */
+
+ gsl_blas_dgemv (CblasTrans, 1.0, Q, b, 0.0, x);
+
+ /* Solve R x = sol, storing x in-place */
+
+ gsl_blas_dtrsv (CblasUpper, CblasNoTrans, CblasNonUnit, R, x);
+
+ return GSL_SUCCESS;
+ }
+}
diff --git a/gsl-1.9/linalg/qrpt.c b/gsl-1.9/linalg/qrpt.c
new file mode 100644
index 0000000..ac38547
--- /dev/null
+++ b/gsl-1.9/linalg/qrpt.c
@@ -0,0 +1,486 @@
+/* linalg/qrpt.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_permute_vector.h>
+#include <gsl/gsl_blas.h>
+
+#include <gsl/gsl_linalg.h>
+
+#define REAL double
+
+#include "givens.c"
+#include "apply_givens.c"
+
+/* Factorise a general M x N matrix A into
+ *
+ * A P = Q R
+ *
+ * where Q is orthogonal (M x M) and R is upper triangular (M x N).
+ * When A is rank deficient, r = rank(A) < n, then the permutation is
+ * used to ensure that the lower n - r rows of R are zero and the first
+ * r columns of Q form an orthonormal basis for A.
+ *
+ * Q is stored as a packed set of Householder transformations in the
+ * strict lower triangular part of the input matrix.
+ *
+ * R is stored in the diagonal and upper triangle of the input matrix.
+ *
+ * P: column j of P is column k of the identity matrix, where k =
+ * permutation->data[j]
+ *
+ * The full matrix for Q can be obtained as the product
+ *
+ * Q = Q_k .. Q_2 Q_1
+ *
+ * where k = MIN(M,N) and
+ *
+ * Q_i = (I - tau_i * v_i * v_i')
+ *
+ * and where v_i is a Householder vector
+ *
+ * v_i = [1, m(i+1,i), m(i+2,i), ... , m(M,i)]
+ *
+ * This storage scheme is the same as in LAPACK. See LAPACK's
+ * dgeqpf.f for details.
+ *
+ */
+
+int
+gsl_linalg_QRPT_decomp (gsl_matrix * A, gsl_vector * tau, gsl_permutation * p, int *signum, gsl_vector * norm)
+{
+ const size_t M = A->size1;
+ const size_t N = A->size2;
+
+ if (tau->size != GSL_MIN (M, N))
+ {
+ GSL_ERROR ("size of tau must be MIN(M,N)", GSL_EBADLEN);
+ }
+ else if (p->size != N)
+ {
+ GSL_ERROR ("permutation size must be N", GSL_EBADLEN);
+ }
+ else if (norm->size != N)
+ {
+ GSL_ERROR ("norm size must be N", GSL_EBADLEN);
+ }
+ else
+ {
+ size_t i;
+
+ *signum = 1;
+
+ gsl_permutation_init (p); /* set to identity */
+
+ /* Compute column norms and store in workspace */
+
+ for (i = 0; i < N; i++)
+ {
+ gsl_vector_view c = gsl_matrix_column (A, i);
+ double x = gsl_blas_dnrm2 (&c.vector);
+ gsl_vector_set (norm, i, x);
+ }
+
+ for (i = 0; i < GSL_MIN (M, N); i++)
+ {
+ /* Bring the column of largest norm into the pivot position */
+
+ double max_norm = gsl_vector_get(norm, i);
+ size_t j, kmax = i;
+
+ for (j = i + 1; j < N; j++)
+ {
+ double x = gsl_vector_get (norm, j);
+
+ if (x > max_norm)
+ {
+ max_norm = x;
+ kmax = j;
+ }
+ }
+
+ if (kmax != i)
+ {
+ gsl_matrix_swap_columns (A, i, kmax);
+ gsl_permutation_swap (p, i, kmax);
+ gsl_vector_swap_elements(norm,i,kmax);
+
+ (*signum) = -(*signum);
+ }
+
+ /* Compute the Householder transformation to reduce the j-th
+ column of the matrix to a multiple of the j-th unit vector */
+
+ {
+ gsl_vector_view c_full = gsl_matrix_column (A, i);
+ gsl_vector_view c = gsl_vector_subvector (&c_full.vector,
+ i, M - i);
+ double tau_i = gsl_linalg_householder_transform (&c.vector);
+
+ gsl_vector_set (tau, i, tau_i);
+
+ /* Apply the transformation to the remaining columns */
+
+ if (i + 1 < N)
+ {
+ gsl_matrix_view m = gsl_matrix_submatrix (A, i, i + 1, M - i, N - (i+1));
+
+ gsl_linalg_householder_hm (tau_i, &c.vector, &m.matrix);
+ }
+ }
+
+ /* Update the norms of the remaining columns too */
+
+ if (i + 1 < M)
+ {
+ for (j = i + 1; j < N; j++)
+ {
+ double x = gsl_vector_get (norm, j);
+
+ if (x > 0.0)
+ {
+ double y = 0;
+ double temp= gsl_matrix_get (A, i, j) / x;
+
+ if (fabs (temp) >= 1)
+ y = 0.0;
+ else
+ y = x * sqrt (1 - temp * temp);
+
+ /* recompute norm to prevent loss of accuracy */
+
+ if (fabs (y / x) < sqrt (20.0) * GSL_SQRT_DBL_EPSILON)
+ {
+ gsl_vector_view c_full = gsl_matrix_column (A, j);
+ gsl_vector_view c =
+ gsl_vector_subvector(&c_full.vector,
+ i+1, M - (i+1));
+ y = gsl_blas_dnrm2 (&c.vector);
+ }
+
+ gsl_vector_set (norm, j, y);
+ }
+ }
+ }
+ }
+
+ return GSL_SUCCESS;
+ }
+}
+
+int
+gsl_linalg_QRPT_decomp2 (const gsl_matrix * A, gsl_matrix * q, gsl_matrix * r, gsl_vector * tau, gsl_permutation * p, int *signum, gsl_vector * norm)
+{
+ const size_t M = A->size1;
+ const size_t N = A->size2;
+
+ if (q->size1 != M || q->size2 !=M)
+ {
+ GSL_ERROR ("q must be M x M", GSL_EBADLEN);
+ }
+ else if (r->size1 != M || r->size2 !=N)
+ {
+ GSL_ERROR ("r must be M x N", GSL_EBADLEN);
+ }
+ else if (tau->size != GSL_MIN (M, N))
+ {
+ GSL_ERROR ("size of tau must be MIN(M,N)", GSL_EBADLEN);
+ }
+ else if (p->size != N)
+ {
+ GSL_ERROR ("permutation size must be N", GSL_EBADLEN);
+ }
+ else if (norm->size != N)
+ {
+ GSL_ERROR ("norm size must be N", GSL_EBADLEN);
+ }
+
+ gsl_matrix_memcpy (r, A);
+
+ gsl_linalg_QRPT_decomp (r, tau, p, signum, norm);
+
+ /* FIXME: aliased arguments depends on behavior of unpack routine! */
+
+ gsl_linalg_QR_unpack (r, tau, q, r);
+
+ return GSL_SUCCESS;
+}
+
+
+/* Solves the system A x = b using the Q R P^T factorisation,
+
+ R z = Q^T b
+
+ x = P z;
+
+ to obtain x. Based on SLATEC code. */
+
+int
+gsl_linalg_QRPT_solve (const gsl_matrix * QR,
+ const gsl_vector * tau,
+ const gsl_permutation * p,
+ const gsl_vector * b,
+ gsl_vector * x)
+{
+ if (QR->size1 != QR->size2)
+ {
+ GSL_ERROR ("QR matrix must be square", GSL_ENOTSQR);
+ }
+ else if (QR->size1 != p->size)
+ {
+ GSL_ERROR ("matrix size must match permutation size", GSL_EBADLEN);
+ }
+ else if (QR->size1 != b->size)
+ {
+ GSL_ERROR ("matrix size must match b size", GSL_EBADLEN);
+ }
+ else if (QR->size2 != x->size)
+ {
+ GSL_ERROR ("matrix size must match solution size", GSL_EBADLEN);
+ }
+ else
+ {
+ gsl_vector_memcpy (x, b);
+
+ gsl_linalg_QRPT_svx (QR, tau, p, x);
+
+ return GSL_SUCCESS;
+ }
+}
+
+int
+gsl_linalg_QRPT_svx (const gsl_matrix * QR,
+ const gsl_vector * tau,
+ const gsl_permutation * p,
+ gsl_vector * x)
+{
+ if (QR->size1 != QR->size2)
+ {
+ GSL_ERROR ("QR matrix must be square", GSL_ENOTSQR);
+ }
+ else if (QR->size1 != p->size)
+ {
+ GSL_ERROR ("matrix size must match permutation size", GSL_EBADLEN);
+ }
+ else if (QR->size2 != x->size)
+ {
+ GSL_ERROR ("matrix size must match solution size", GSL_EBADLEN);
+ }
+ else
+ {
+ /* compute sol = Q^T b */
+
+ gsl_linalg_QR_QTvec (QR, tau, x);
+
+ /* Solve R x = sol, storing x inplace in sol */
+
+ gsl_blas_dtrsv (CblasUpper, CblasNoTrans, CblasNonUnit, QR, x);
+
+ gsl_permute_vector_inverse (p, x);
+
+ return GSL_SUCCESS;
+ }
+}
+
+
+int
+gsl_linalg_QRPT_QRsolve (const gsl_matrix * Q, const gsl_matrix * R,
+ const gsl_permutation * p,
+ const gsl_vector * b,
+ gsl_vector * x)
+{
+ if (Q->size1 != Q->size2 || R->size1 != R->size2)
+ {
+ return GSL_ENOTSQR;
+ }
+ else if (Q->size1 != p->size || Q->size1 != R->size1
+ || Q->size1 != b->size)
+ {
+ return GSL_EBADLEN;
+ }
+ else
+ {
+ /* compute b' = Q^T b */
+
+ gsl_blas_dgemv (CblasTrans, 1.0, Q, b, 0.0, x);
+
+ /* Solve R x = b', storing x inplace */
+
+ gsl_blas_dtrsv (CblasUpper, CblasNoTrans, CblasNonUnit, R, x);
+
+ /* Apply permutation to solution in place */
+
+ gsl_permute_vector_inverse (p, x);
+
+ return GSL_SUCCESS;
+ }
+}
+
+int
+gsl_linalg_QRPT_Rsolve (const gsl_matrix * QR,
+ const gsl_permutation * p,
+ const gsl_vector * b,
+ gsl_vector * x)
+{
+ if (QR->size1 != QR->size2)
+ {
+ GSL_ERROR ("QR matrix must be square", GSL_ENOTSQR);
+ }
+ else if (QR->size1 != b->size)
+ {
+ GSL_ERROR ("matrix size must match b size", GSL_EBADLEN);
+ }
+ else if (QR->size2 != x->size)
+ {
+ GSL_ERROR ("matrix size must match x size", GSL_EBADLEN);
+ }
+ else if (p->size != x->size)
+ {
+ GSL_ERROR ("permutation size must match x size", GSL_EBADLEN);
+ }
+ else
+ {
+ /* Copy x <- b */
+
+ gsl_vector_memcpy (x, b);
+
+ /* Solve R x = b, storing x inplace */
+
+ gsl_blas_dtrsv (CblasUpper, CblasNoTrans, CblasNonUnit, QR, x);
+
+ gsl_permute_vector_inverse (p, x);
+
+ return GSL_SUCCESS;
+ }
+}
+
+
+int
+gsl_linalg_QRPT_Rsvx (const gsl_matrix * QR,
+ const gsl_permutation * p,
+ gsl_vector * x)
+{
+ if (QR->size1 != QR->size2)
+ {
+ GSL_ERROR ("QR matrix must be square", GSL_ENOTSQR);
+ }
+ else if (QR->size2 != x->size)
+ {
+ GSL_ERROR ("matrix size must match x size", GSL_EBADLEN);
+ }
+ else if (p->size != x->size)
+ {
+ GSL_ERROR ("permutation size must match x size", GSL_EBADLEN);
+ }
+ else
+ {
+ /* Solve R x = b, storing x inplace */
+
+ gsl_blas_dtrsv (CblasUpper, CblasNoTrans, CblasNonUnit, QR, x);
+
+ gsl_permute_vector_inverse (p, x);
+
+ return GSL_SUCCESS;
+ }
+}
+
+
+
+/* Update a Q R P^T factorisation for A P= Q R , A' = A + u v^T,
+
+ Q' R' P^-1 = QR P^-1 + u v^T
+ = Q (R + Q^T u v^T P ) P^-1
+ = Q (R + w v^T P) P^-1
+
+ where w = Q^T u.
+
+ Algorithm from Golub and Van Loan, "Matrix Computations", Section
+ 12.5 (Updating Matrix Factorizations, Rank-One Changes) */
+
+int
+gsl_linalg_QRPT_update (gsl_matrix * Q, gsl_matrix * R,
+ const gsl_permutation * p,
+ gsl_vector * w, const gsl_vector * v)
+{
+ if (Q->size1 != Q->size2 || R->size1 != R->size2)
+ {
+ return GSL_ENOTSQR;
+ }
+ else if (R->size1 != Q->size2 || v->size != Q->size2 || w->size != Q->size2)
+ {
+ return GSL_EBADLEN;
+ }
+ else
+ {
+ size_t j, k;
+ const size_t M = Q->size1;
+ const size_t N = Q->size2;
+ double w0;
+
+ /* Apply Given's rotations to reduce w to (|w|, 0, 0, ... , 0)
+
+ J_1^T .... J_(n-1)^T w = +/- |w| e_1
+
+ simultaneously applied to R, H = J_1^T ... J^T_(n-1) R
+ so that H is upper Hessenberg. (12.5.2) */
+
+ for (k = N - 1; k > 0; k--)
+ {
+ double c, s;
+ double wk = gsl_vector_get (w, k);
+ double wkm1 = gsl_vector_get (w, k - 1);
+
+ create_givens (wkm1, wk, &c, &s);
+ apply_givens_vec (w, k - 1, k, c, s);
+ apply_givens_qr (M, N, Q, R, k - 1, k, c, s);
+ }
+
+ w0 = gsl_vector_get (w, 0);
+
+ /* Add in w v^T (Equation 12.5.3) */
+
+ for (j = 0; j < N; j++)
+ {
+ double r0j = gsl_matrix_get (R, 0, j);
+ size_t p_j = gsl_permutation_get (p, j);
+ double vj = gsl_vector_get (v, p_j);
+ gsl_matrix_set (R, 0, j, r0j + w0 * vj);
+ }
+
+ /* Apply Givens transformations R' = G_(n-1)^T ... G_1^T H
+ Equation 12.5.4 */
+
+ for (k = 1; k < N; k++)
+ {
+ double c, s;
+ double diag = gsl_matrix_get (R, k - 1, k - 1);
+ double offdiag = gsl_matrix_get (R, k, k - 1);
+
+ create_givens (diag, offdiag, &c, &s);
+ apply_givens_qr (M, N, Q, R, k - 1, k, c, s);
+ }
+
+ return GSL_SUCCESS;
+ }
+}
diff --git a/gsl-1.9/linalg/svd.c b/gsl-1.9/linalg/svd.c
new file mode 100644
index 0000000..cd5588a
--- /dev/null
+++ b/gsl-1.9/linalg/svd.c
@@ -0,0 +1,620 @@
+/* linalg/svd.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_blas.h>
+
+#include <gsl/gsl_linalg.h>
+
+#include "givens.c"
+#include "svdstep.c"
+
+/* Factorise a general M x N matrix A into,
+ *
+ * A = U D V^T
+ *
+ * where U is a column-orthogonal M x N matrix (U^T U = I),
+ * D is a diagonal N x N matrix,
+ * and V is an N x N orthogonal matrix (V^T V = V V^T = I)
+ *
+ * U is stored in the original matrix A, which has the same size
+ *
+ * V is stored as a separate matrix (not V^T). You must take the
+ * transpose to form the product above.
+ *
+ * The diagonal matrix D is stored in the vector S, D_ii = S_i
+ */
+
+int
+gsl_linalg_SV_decomp (gsl_matrix * A, gsl_matrix * V, gsl_vector * S,
+ gsl_vector * work)
+{
+ size_t a, b, i, j;
+
+ const size_t M = A->size1;
+ const size_t N = A->size2;
+ const size_t K = GSL_MIN (M, N);
+
+ if (M < N)
+ {
+ GSL_ERROR ("svd of MxN matrix, M<N, is not implemented", GSL_EUNIMPL);
+ }
+ else if (V->size1 != N)
+ {
+ GSL_ERROR ("square matrix V must match second dimension of matrix A",
+ GSL_EBADLEN);
+ }
+ else if (V->size1 != V->size2)
+ {
+ GSL_ERROR ("matrix V must be square", GSL_ENOTSQR);
+ }
+ else if (S->size != N)
+ {
+ GSL_ERROR ("length of vector S must match second dimension of matrix A",
+ GSL_EBADLEN);
+ }
+ else if (work->size != N)
+ {
+ GSL_ERROR ("length of workspace must match second dimension of matrix A",
+ GSL_EBADLEN);
+ }
+
+ /* Handle the case of N = 1 (SVD of a column vector) */
+
+ if (N == 1)
+ {
+ gsl_vector_view column = gsl_matrix_column (A, 0);
+ double norm = gsl_blas_dnrm2 (&column.vector);
+
+ gsl_vector_set (S, 0, norm);
+ gsl_matrix_set (V, 0, 0, 1.0);
+
+ if (norm != 0.0)
+ {
+ gsl_blas_dscal (1.0/norm, &column.vector);
+ }
+
+ return GSL_SUCCESS;
+ }
+
+ {
+ gsl_vector_view f = gsl_vector_subvector (work, 0, K - 1);
+
+ /* bidiagonalize matrix A, unpack A into U S V */
+
+ gsl_linalg_bidiag_decomp (A, S, &f.vector);
+ gsl_linalg_bidiag_unpack2 (A, S, &f.vector, V);
+
+ /* apply reduction steps to B=(S,Sd) */
+
+ chop_small_elements (S, &f.vector);
+
+ /* Progressively reduce the matrix until it is diagonal */
+
+ b = N - 1;
+
+ while (b > 0)
+ {
+ double fbm1 = gsl_vector_get (&f.vector, b - 1);
+
+ if (fbm1 == 0.0 || gsl_isnan (fbm1))
+ {
+ b--;
+ continue;
+ }
+
+ /* Find the largest unreduced block (a,b) starting from b
+ and working backwards */
+
+ a = b - 1;
+
+ while (a > 0)
+ {
+ double fam1 = gsl_vector_get (&f.vector, a - 1);
+
+ if (fam1 == 0.0 || gsl_isnan (fam1))
+ {
+ break;
+ }
+
+ a--;
+ }
+
+ {
+ const size_t n_block = b - a + 1;
+ gsl_vector_view S_block = gsl_vector_subvector (S, a, n_block);
+ gsl_vector_view f_block = gsl_vector_subvector (&f.vector, a, n_block - 1);
+
+ gsl_matrix_view U_block =
+ gsl_matrix_submatrix (A, 0, a, A->size1, n_block);
+ gsl_matrix_view V_block =
+ gsl_matrix_submatrix (V, 0, a, V->size1, n_block);
+
+ qrstep (&S_block.vector, &f_block.vector, &U_block.matrix, &V_block.matrix);
+
+ /* remove any small off-diagonal elements */
+
+ chop_small_elements (&S_block.vector, &f_block.vector);
+ }
+ }
+ }
+ /* Make singular values positive by reflections if necessary */
+
+ for (j = 0; j < K; j++)
+ {
+ double Sj = gsl_vector_get (S, j);
+
+ if (Sj < 0.0)
+ {
+ for (i = 0; i < N; i++)
+ {
+ double Vij = gsl_matrix_get (V, i, j);
+ gsl_matrix_set (V, i, j, -Vij);
+ }
+
+ gsl_vector_set (S, j, -Sj);
+ }
+ }
+
+ /* Sort singular values into decreasing order */
+
+ for (i = 0; i < K; i++)
+ {
+ double S_max = gsl_vector_get (S, i);
+ size_t i_max = i;
+
+ for (j = i + 1; j < K; j++)
+ {
+ double Sj = gsl_vector_get (S, j);
+
+ if (Sj > S_max)
+ {
+ S_max = Sj;
+ i_max = j;
+ }
+ }
+
+ if (i_max != i)
+ {
+ /* swap eigenvalues */
+ gsl_vector_swap_elements (S, i, i_max);
+
+ /* swap eigenvectors */
+ gsl_matrix_swap_columns (A, i, i_max);
+ gsl_matrix_swap_columns (V, i, i_max);
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+/* Modified algorithm which is better for M>>N */
+
+int
+gsl_linalg_SV_decomp_mod (gsl_matrix * A,
+ gsl_matrix * X,
+ gsl_matrix * V, gsl_vector * S, gsl_vector * work)
+{
+ size_t i, j;
+
+ const size_t M = A->size1;
+ const size_t N = A->size2;
+
+ if (M < N)
+ {
+ GSL_ERROR ("svd of MxN matrix, M<N, is not implemented", GSL_EUNIMPL);
+ }
+ else if (V->size1 != N)
+ {
+ GSL_ERROR ("square matrix V must match second dimension of matrix A",
+ GSL_EBADLEN);
+ }
+ else if (V->size1 != V->size2)
+ {
+ GSL_ERROR ("matrix V must be square", GSL_ENOTSQR);
+ }
+ else if (X->size1 != N)
+ {
+ GSL_ERROR ("square matrix X must match second dimension of matrix A",
+ GSL_EBADLEN);
+ }
+ else if (X->size1 != X->size2)
+ {
+ GSL_ERROR ("matrix X must be square", GSL_ENOTSQR);
+ }
+ else if (S->size != N)
+ {
+ GSL_ERROR ("length of vector S must match second dimension of matrix A",
+ GSL_EBADLEN);
+ }
+ else if (work->size != N)
+ {
+ GSL_ERROR ("length of workspace must match second dimension of matrix A",
+ GSL_EBADLEN);
+ }
+
+ if (N == 1)
+ {
+ gsl_vector_view column = gsl_matrix_column (A, 0);
+ double norm = gsl_blas_dnrm2 (&column.vector);
+
+ gsl_vector_set (S, 0, norm);
+ gsl_matrix_set (V, 0, 0, 1.0);
+
+ if (norm != 0.0)
+ {
+ gsl_blas_dscal (1.0/norm, &column.vector);
+ }
+
+ return GSL_SUCCESS;
+ }
+
+ /* Convert A into an upper triangular matrix R */
+
+ for (i = 0; i < N; i++)
+ {
+ gsl_vector_view c = gsl_matrix_column (A, i);
+ gsl_vector_view v = gsl_vector_subvector (&c.vector, i, M - i);
+ double tau_i = gsl_linalg_householder_transform (&v.vector);
+
+ /* Apply the transformation to the remaining columns */
+
+ if (i + 1 < N)
+ {
+ gsl_matrix_view m =
+ gsl_matrix_submatrix (A, i, i + 1, M - i, N - (i + 1));
+ gsl_linalg_householder_hm (tau_i, &v.vector, &m.matrix);
+ }
+
+ gsl_vector_set (S, i, tau_i);
+ }
+
+ /* Copy the upper triangular part of A into X */
+
+ for (i = 0; i < N; i++)
+ {
+ for (j = 0; j < i; j++)
+ {
+ gsl_matrix_set (X, i, j, 0.0);
+ }
+
+ {
+ double Aii = gsl_matrix_get (A, i, i);
+ gsl_matrix_set (X, i, i, Aii);
+ }
+
+ for (j = i + 1; j < N; j++)
+ {
+ double Aij = gsl_matrix_get (A, i, j);
+ gsl_matrix_set (X, i, j, Aij);
+ }
+ }
+
+ /* Convert A into an orthogonal matrix L */
+
+ for (j = N; j > 0 && j--;)
+ {
+ /* Householder column transformation to accumulate L */
+ double tj = gsl_vector_get (S, j);
+ gsl_matrix_view m = gsl_matrix_submatrix (A, j, j, M - j, N - j);
+ gsl_linalg_householder_hm1 (tj, &m.matrix);
+ }
+
+ /* unpack R into X V S */
+
+ gsl_linalg_SV_decomp (X, V, S, work);
+
+ /* Multiply L by X, to obtain U = L X, stored in U */
+
+ {
+ gsl_vector_view sum = gsl_vector_subvector (work, 0, N);
+
+ for (i = 0; i < M; i++)
+ {
+ gsl_vector_view L_i = gsl_matrix_row (A, i);
+ gsl_vector_set_zero (&sum.vector);
+
+ for (j = 0; j < N; j++)
+ {
+ double Lij = gsl_vector_get (&L_i.vector, j);
+ gsl_vector_view X_j = gsl_matrix_row (X, j);
+ gsl_blas_daxpy (Lij, &X_j.vector, &sum.vector);
+ }
+
+ gsl_vector_memcpy (&L_i.vector, &sum.vector);
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+/* Solves the system A x = b using the SVD factorization
+ *
+ * A = U S V^T
+ *
+ * to obtain x. For M x N systems it finds the solution in the least
+ * squares sense.
+ */
+
+int
+gsl_linalg_SV_solve (const gsl_matrix * U,
+ const gsl_matrix * V,
+ const gsl_vector * S,
+ const gsl_vector * b, gsl_vector * x)
+{
+ if (U->size1 != b->size)
+ {
+ GSL_ERROR ("first dimension of matrix U must size of vector b",
+ GSL_EBADLEN);
+ }
+ else if (U->size2 != S->size)
+ {
+ GSL_ERROR ("length of vector S must match second dimension of matrix U",
+ GSL_EBADLEN);
+ }
+ else if (V->size1 != V->size2)
+ {
+ GSL_ERROR ("matrix V must be square", GSL_ENOTSQR);
+ }
+ else if (S->size != V->size1)
+ {
+ GSL_ERROR ("length of vector S must match size of matrix V",
+ GSL_EBADLEN);
+ }
+ else if (V->size2 != x->size)
+ {
+ GSL_ERROR ("size of matrix V must match size of vector x", GSL_EBADLEN);
+ }
+ else
+ {
+ const size_t N = U->size2;
+ size_t i;
+
+ gsl_vector *w = gsl_vector_calloc (N);
+
+ gsl_blas_dgemv (CblasTrans, 1.0, U, b, 0.0, w);
+
+ for (i = 0; i < N; i++)
+ {
+ double wi = gsl_vector_get (w, i);
+ double alpha = gsl_vector_get (S, i);
+ if (alpha != 0)
+ alpha = 1.0 / alpha;
+ gsl_vector_set (w, i, alpha * wi);
+ }
+
+ gsl_blas_dgemv (CblasNoTrans, 1.0, V, w, 0.0, x);
+
+ gsl_vector_free (w);
+
+ return GSL_SUCCESS;
+ }
+}
+
+/* This is a the jacobi version */
+/* Author: G. Jungman */
+
+/*
+ * Algorithm due to J.C. Nash, Compact Numerical Methods for
+ * Computers (New York: Wiley and Sons, 1979), chapter 3.
+ * See also Algorithm 4.1 in
+ * James Demmel, Kresimir Veselic, "Jacobi's Method is more
+ * accurate than QR", Lapack Working Note 15 (LAWN15), October 1989.
+ * Available from netlib.
+ *
+ * Based on code by Arthur Kosowsky, Rutgers University
+ * kosowsky@physics.rutgers.edu
+ *
+ * Another relevant paper is, P.P.M. De Rijk, "A One-Sided Jacobi
+ * Algorithm for computing the singular value decomposition on a
+ * vector computer", SIAM Journal of Scientific and Statistical
+ * Computing, Vol 10, No 2, pp 359-371, March 1989.
+ *
+ */
+
+int
+gsl_linalg_SV_decomp_jacobi (gsl_matrix * A, gsl_matrix * Q, gsl_vector * S)
+{
+ if (A->size1 < A->size2)
+ {
+ /* FIXME: only implemented M>=N case so far */
+
+ GSL_ERROR ("svd of MxN matrix, M<N, is not implemented", GSL_EUNIMPL);
+ }
+ else if (Q->size1 != A->size2)
+ {
+ GSL_ERROR ("square matrix Q must match second dimension of matrix A",
+ GSL_EBADLEN);
+ }
+ else if (Q->size1 != Q->size2)
+ {
+ GSL_ERROR ("matrix Q must be square", GSL_ENOTSQR);
+ }
+ else if (S->size != A->size2)
+ {
+ GSL_ERROR ("length of vector S must match second dimension of matrix A",
+ GSL_EBADLEN);
+ }
+ else
+ {
+ const size_t M = A->size1;
+ const size_t N = A->size2;
+ size_t i, j, k;
+
+ /* Initialize the rotation counter and the sweep counter. */
+ int count = 1;
+ int sweep = 0;
+ int sweepmax = 5*N;
+
+ double tolerance = 10 * M * GSL_DBL_EPSILON;
+
+ /* Always do at least 12 sweeps. */
+ sweepmax = GSL_MAX (sweepmax, 12);
+
+ /* Set Q to the identity matrix. */
+ gsl_matrix_set_identity (Q);
+
+ /* Store the column error estimates in S, for use during the
+ orthogonalization */
+
+ for (j = 0; j < N; j++)
+ {
+ gsl_vector_view cj = gsl_matrix_column (A, j);
+ double sj = gsl_blas_dnrm2 (&cj.vector);
+ gsl_vector_set(S, j, GSL_DBL_EPSILON * sj);
+ }
+
+ /* Orthogonalize A by plane rotations. */
+
+ while (count > 0 && sweep <= sweepmax)
+ {
+ /* Initialize rotation counter. */
+ count = N * (N - 1) / 2;
+
+ for (j = 0; j < N - 1; j++)
+ {
+ for (k = j + 1; k < N; k++)
+ {
+ double a = 0.0;
+ double b = 0.0;
+ double p = 0.0;
+ double q = 0.0;
+ double cosine, sine;
+ double v;
+ double abserr_a, abserr_b;
+ int sorted, orthog, noisya, noisyb;
+
+ gsl_vector_view cj = gsl_matrix_column (A, j);
+ gsl_vector_view ck = gsl_matrix_column (A, k);
+
+ gsl_blas_ddot (&cj.vector, &ck.vector, &p);
+ p *= 2.0 ; /* equation 9a: p = 2 x.y */
+
+ a = gsl_blas_dnrm2 (&cj.vector);
+ b = gsl_blas_dnrm2 (&ck.vector);
+
+ q = a * a - b * b;
+ v = hypot(p, q);
+
+ /* test for columns j,k orthogonal, or dominant errors */
+
+ abserr_a = gsl_vector_get(S,j);
+ abserr_b = gsl_vector_get(S,k);
+
+ sorted = (gsl_coerce_double(a) >= gsl_coerce_double(b));
+ orthog = (fabs (p) <= tolerance * gsl_coerce_double(a * b));
+ noisya = (a < abserr_a);
+ noisyb = (b < abserr_b);
+
+ if (sorted && (orthog || noisya || noisyb))
+ {
+ count--;
+ continue;
+ }
+
+ /* calculate rotation angles */
+ if (v == 0 || !sorted)
+ {
+ cosine = 0.0;
+ sine = 1.0;
+ }
+ else
+ {
+ cosine = sqrt((v + q) / (2.0 * v));
+ sine = p / (2.0 * v * cosine);
+ }
+
+ /* apply rotation to A */
+ for (i = 0; i < M; i++)
+ {
+ const double Aik = gsl_matrix_get (A, i, k);
+ const double Aij = gsl_matrix_get (A, i, j);
+ gsl_matrix_set (A, i, j, Aij * cosine + Aik * sine);
+ gsl_matrix_set (A, i, k, -Aij * sine + Aik * cosine);
+ }
+
+ gsl_vector_set(S, j, fabs(cosine) * abserr_a + fabs(sine) * abserr_b);
+ gsl_vector_set(S, k, fabs(sine) * abserr_a + fabs(cosine) * abserr_b);
+
+ /* apply rotation to Q */
+ for (i = 0; i < N; i++)
+ {
+ const double Qij = gsl_matrix_get (Q, i, j);
+ const double Qik = gsl_matrix_get (Q, i, k);
+ gsl_matrix_set (Q, i, j, Qij * cosine + Qik * sine);
+ gsl_matrix_set (Q, i, k, -Qij * sine + Qik * cosine);
+ }
+ }
+ }
+
+ /* Sweep completed. */
+ sweep++;
+ }
+
+ /*
+ * Orthogonalization complete. Compute singular values.
+ */
+
+ {
+ double prev_norm = -1.0;
+
+ for (j = 0; j < N; j++)
+ {
+ gsl_vector_view column = gsl_matrix_column (A, j);
+ double norm = gsl_blas_dnrm2 (&column.vector);
+
+ /* Determine if singular value is zero, according to the
+ criteria used in the main loop above (i.e. comparison
+ with norm of previous column). */
+
+ if (norm == 0.0 || prev_norm == 0.0
+ || (j > 0 && norm <= tolerance * prev_norm))
+ {
+ gsl_vector_set (S, j, 0.0); /* singular */
+ gsl_vector_set_zero (&column.vector); /* annihilate column */
+
+ prev_norm = 0.0;
+ }
+ else
+ {
+ gsl_vector_set (S, j, norm); /* non-singular */
+ gsl_vector_scale (&column.vector, 1.0 / norm); /* normalize column */
+
+ prev_norm = norm;
+ }
+ }
+ }
+
+ if (count > 0)
+ {
+ /* reached sweep limit */
+ GSL_ERROR ("Jacobi iterations did not reach desired tolerance",
+ GSL_ETOL);
+ }
+
+ return GSL_SUCCESS;
+ }
+}
diff --git a/gsl-1.9/linalg/svdstep.c b/gsl-1.9/linalg/svdstep.c
new file mode 100644
index 0000000..a47c741
--- /dev/null
+++ b/gsl-1.9/linalg/svdstep.c
@@ -0,0 +1,519 @@
+static void
+chop_small_elements (gsl_vector * d, gsl_vector * f)
+{
+ const size_t N = d->size;
+ double d_i = gsl_vector_get (d, 0);
+
+ size_t i;
+
+ for (i = 0; i < N - 1; i++)
+ {
+ double f_i = gsl_vector_get (f, i);
+ double d_ip1 = gsl_vector_get (d, i + 1);
+
+ if (fabs (f_i) < GSL_DBL_EPSILON * (fabs (d_i) + fabs (d_ip1)))
+ {
+ gsl_vector_set (f, i, 0.0);
+ }
+ d_i = d_ip1;
+ }
+
+}
+
+static double
+trailing_eigenvalue (const gsl_vector * d, const gsl_vector * f)
+{
+ const size_t n = d->size;
+
+ double da = gsl_vector_get (d, n - 2);
+ double db = gsl_vector_get (d, n - 1);
+ double fa = (n > 2) ? gsl_vector_get (f, n - 3) : 0.0;
+ double fb = gsl_vector_get (f, n - 2);
+
+ double ta = da * da + fa * fa;
+ double tb = db * db + fb * fb;
+ double tab = da * fb;
+
+ double dt = (ta - tb) / 2.0;
+
+ double mu;
+
+ if (dt >= 0)
+ {
+ mu = tb - (tab * tab) / (dt + hypot (dt, tab));
+ }
+ else
+ {
+ mu = tb + (tab * tab) / ((-dt) + hypot (dt, tab));
+ }
+
+ return mu;
+}
+
+static void
+create_schur (double d0, double f0, double d1, double * c, double * s)
+{
+ double apq = 2.0 * d0 * f0;
+
+ if (apq != 0.0)
+ {
+ double t;
+ double tau = (f0*f0 + (d1 + d0)*(d1 - d0)) / apq;
+
+ if (tau >= 0.0)
+ {
+ t = 1.0/(tau + hypot(1.0, tau));
+ }
+ else
+ {
+ t = -1.0/(-tau + hypot(1.0, tau));
+ }
+
+ *c = 1.0 / hypot(1.0, t);
+ *s = t * (*c);
+ }
+ else
+ {
+ *c = 1.0;
+ *s = 0.0;
+ }
+}
+
+static void
+svd2 (gsl_vector * d, gsl_vector * f, gsl_matrix * U, gsl_matrix * V)
+{
+ size_t i;
+ double c, s, a11, a12, a21, a22;
+
+ const size_t M = U->size1;
+ const size_t N = V->size1;
+
+ double d0 = gsl_vector_get (d, 0);
+ double f0 = gsl_vector_get (f, 0);
+
+ double d1 = gsl_vector_get (d, 1);
+
+ if (d0 == 0.0)
+ {
+ /* Eliminate off-diagonal element in [0,f0;0,d1] to make [d,0;0,0] */
+
+ create_givens (f0, d1, &c, &s);
+
+ /* compute B <= G^T B X, where X = [0,1;1,0] */
+
+ gsl_vector_set (d, 0, c * f0 - s * d1);
+ gsl_vector_set (f, 0, s * f0 + c * d1);
+ gsl_vector_set (d, 1, 0.0);
+
+ /* Compute U <= U G */
+
+ for (i = 0; i < M; i++)
+ {
+ double Uip = gsl_matrix_get (U, i, 0);
+ double Uiq = gsl_matrix_get (U, i, 1);
+ gsl_matrix_set (U, i, 0, c * Uip - s * Uiq);
+ gsl_matrix_set (U, i, 1, s * Uip + c * Uiq);
+ }
+
+ /* Compute V <= V X */
+
+ gsl_matrix_swap_columns (V, 0, 1);
+
+ return;
+ }
+ else if (d1 == 0.0)
+ {
+ /* Eliminate off-diagonal element in [d0,f0;0,0] */
+
+ create_givens (d0, f0, &c, &s);
+
+ /* compute B <= B G */
+
+ gsl_vector_set (d, 0, d0 * c - f0 * s);
+ gsl_vector_set (f, 0, 0.0);
+
+ /* Compute V <= V G */
+
+ for (i = 0; i < N; i++)
+ {
+ double Vip = gsl_matrix_get (V, i, 0);
+ double Viq = gsl_matrix_get (V, i, 1);
+ gsl_matrix_set (V, i, 0, c * Vip - s * Viq);
+ gsl_matrix_set (V, i, 1, s * Vip + c * Viq);
+ }
+
+ return;
+ }
+ else
+ {
+ /* Make columns orthogonal, A = [d0, f0; 0, d1] * G */
+
+ create_schur (d0, f0, d1, &c, &s);
+
+ /* compute B <= B G */
+
+ a11 = c * d0 - s * f0;
+ a21 = - s * d1;
+
+ a12 = s * d0 + c * f0;
+ a22 = c * d1;
+
+ /* Compute V <= V G */
+
+ for (i = 0; i < N; i++)
+ {
+ double Vip = gsl_matrix_get (V, i, 0);
+ double Viq = gsl_matrix_get (V, i, 1);
+ gsl_matrix_set (V, i, 0, c * Vip - s * Viq);
+ gsl_matrix_set (V, i, 1, s * Vip + c * Viq);
+ }
+
+ /* Eliminate off-diagonal elements, bring column with largest
+ norm to first column */
+
+ if (hypot(a11, a21) < hypot(a12,a22))
+ {
+ double t1, t2;
+
+ /* B <= B X */
+
+ t1 = a11; a11 = a12; a12 = t1;
+ t2 = a21; a21 = a22; a22 = t2;
+
+ /* V <= V X */
+
+ gsl_matrix_swap_columns(V, 0, 1);
+ }
+
+ create_givens (a11, a21, &c, &s);
+
+ /* compute B <= G^T B */
+
+ gsl_vector_set (d, 0, c * a11 - s * a21);
+ gsl_vector_set (f, 0, c * a12 - s * a22);
+ gsl_vector_set (d, 1, s * a12 + c * a22);
+
+ /* Compute U <= U G */
+
+ for (i = 0; i < M; i++)
+ {
+ double Uip = gsl_matrix_get (U, i, 0);
+ double Uiq = gsl_matrix_get (U, i, 1);
+ gsl_matrix_set (U, i, 0, c * Uip - s * Uiq);
+ gsl_matrix_set (U, i, 1, s * Uip + c * Uiq);
+ }
+
+ return;
+ }
+}
+
+
+static void
+chase_out_intermediate_zero (gsl_vector * d, gsl_vector * f, gsl_matrix * U, size_t k0)
+{
+#if !USE_BLAS
+ const size_t M = U->size1;
+#endif
+ const size_t n = d->size;
+ double c, s;
+ double x, y;
+ size_t k;
+
+ x = gsl_vector_get (f, k0);
+ y = gsl_vector_get (d, k0+1);
+
+ for (k = k0; k < n - 1; k++)
+ {
+ create_givens (y, -x, &c, &s);
+
+ /* Compute U <= U G */
+
+#ifdef USE_BLAS
+ {
+ gsl_vector_view Uk0 = gsl_matrix_column(U,k0);
+ gsl_vector_view Ukp1 = gsl_matrix_column(U,k+1);
+ gsl_blas_drot(&Uk0.vector, &Ukp1.vector, c, -s);
+ }
+#else
+ {
+ size_t i;
+
+ for (i = 0; i < M; i++)
+ {
+ double Uip = gsl_matrix_get (U, i, k0);
+ double Uiq = gsl_matrix_get (U, i, k + 1);
+ gsl_matrix_set (U, i, k0, c * Uip - s * Uiq);
+ gsl_matrix_set (U, i, k + 1, s * Uip + c * Uiq);
+ }
+ }
+#endif
+
+ /* compute B <= G^T B */
+
+ gsl_vector_set (d, k + 1, s * x + c * y);
+
+ if (k == k0)
+ gsl_vector_set (f, k, c * x - s * y );
+
+ if (k < n - 2)
+ {
+ double z = gsl_vector_get (f, k + 1);
+ gsl_vector_set (f, k + 1, c * z);
+
+ x = -s * z ;
+ y = gsl_vector_get (d, k + 2);
+ }
+ }
+}
+
+static void
+chase_out_trailing_zero (gsl_vector * d, gsl_vector * f, gsl_matrix * V)
+{
+#if !USE_BLAS
+ const size_t N = V->size1;
+#endif
+ const size_t n = d->size;
+ double c, s;
+ double x, y;
+ size_t k;
+
+ x = gsl_vector_get (d, n - 2);
+ y = gsl_vector_get (f, n - 2);
+
+ for (k = n - 1; k > 0 && k--;)
+ {
+ create_givens (x, y, &c, &s);
+
+ /* Compute V <= V G where G = [c, s ; -s, c] */
+
+#ifdef USE_BLAS
+ {
+ gsl_vector_view Vp = gsl_matrix_column(V,k);
+ gsl_vector_view Vq = gsl_matrix_column(V,n-1);
+ gsl_blas_drot(&Vp.vector, &Vq.vector, c, -s);
+ }
+#else
+ {
+ size_t i;
+
+ for (i = 0; i < N; i++)
+ {
+ double Vip = gsl_matrix_get (V, i, k);
+ double Viq = gsl_matrix_get (V, i, n - 1);
+ gsl_matrix_set (V, i, k, c * Vip - s * Viq);
+ gsl_matrix_set (V, i, n - 1, s * Vip + c * Viq);
+ }
+ }
+#endif
+
+ /* compute B <= B G */
+
+ gsl_vector_set (d, k, c * x - s * y);
+
+ if (k == n - 2)
+ gsl_vector_set (f, k, s * x + c * y );
+
+ if (k > 0)
+ {
+ double z = gsl_vector_get (f, k - 1);
+ gsl_vector_set (f, k - 1, c * z);
+
+ x = gsl_vector_get (d, k - 1);
+ y = s * z ;
+ }
+ }
+}
+
+static void
+qrstep (gsl_vector * d, gsl_vector * f, gsl_matrix * U, gsl_matrix * V)
+{
+#if !USE_BLAS
+ const size_t M = U->size1;
+ const size_t N = V->size1;
+#endif
+ const size_t n = d->size;
+ double y, z;
+ double ak, bk, zk, ap, bp, aq, bq;
+ size_t i, k;
+
+ if (n == 1)
+ return; /* shouldn't happen */
+
+ /* Compute 2x2 svd directly */
+
+ if (n == 2)
+ {
+ svd2 (d, f, U, V);
+ return;
+ }
+
+ /* Chase out any zeroes on the diagonal */
+
+ for (i = 0; i < n - 1; i++)
+ {
+ double d_i = gsl_vector_get (d, i);
+
+ if (d_i == 0.0)
+ {
+ chase_out_intermediate_zero (d, f, U, i);
+ return;
+ }
+ }
+
+ /* Chase out any zero at the end of the diagonal */
+
+ {
+ double d_nm1 = gsl_vector_get (d, n - 1);
+
+ if (d_nm1 == 0.0)
+ {
+ chase_out_trailing_zero (d, f, V);
+ return;
+ }
+ }
+
+
+ /* Apply QR reduction steps to the diagonal and offdiagonal */
+
+ {
+ double d0 = gsl_vector_get (d, 0);
+ double f0 = gsl_vector_get (f, 0);
+
+ double d1 = gsl_vector_get (d, 1);
+ double f1 = gsl_vector_get (f, 1);
+
+ {
+ double mu = trailing_eigenvalue (d, f);
+
+ y = d0 * d0 - mu;
+ z = d0 * f0;
+ }
+
+ /* Set up the recurrence for Givens rotations on a bidiagonal matrix */
+
+ ak = 0;
+ bk = 0;
+
+ ap = d0;
+ bp = f0;
+
+ aq = d1;
+ bq = f1;
+ }
+
+ for (k = 0; k < n - 1; k++)
+ {
+ double c, s;
+ create_givens (y, z, &c, &s);
+
+ /* Compute V <= V G */
+
+#ifdef USE_BLAS
+ {
+ gsl_vector_view Vk = gsl_matrix_column(V,k);
+ gsl_vector_view Vkp1 = gsl_matrix_column(V,k+1);
+ gsl_blas_drot(&Vk.vector, &Vkp1.vector, c, -s);
+ }
+#else
+ for (i = 0; i < N; i++)
+ {
+ double Vip = gsl_matrix_get (V, i, k);
+ double Viq = gsl_matrix_get (V, i, k + 1);
+ gsl_matrix_set (V, i, k, c * Vip - s * Viq);
+ gsl_matrix_set (V, i, k + 1, s * Vip + c * Viq);
+ }
+#endif
+
+ /* compute B <= B G */
+
+ {
+ double bk1 = c * bk - s * z;
+
+ double ap1 = c * ap - s * bp;
+ double bp1 = s * ap + c * bp;
+ double zp1 = -s * aq;
+
+ double aq1 = c * aq;
+
+ if (k > 0)
+ {
+ gsl_vector_set (f, k - 1, bk1);
+ }
+
+ ak = ap1;
+ bk = bp1;
+ zk = zp1;
+
+ ap = aq1;
+
+ if (k < n - 2)
+ {
+ bp = gsl_vector_get (f, k + 1);
+ }
+ else
+ {
+ bp = 0.0;
+ }
+
+ y = ak;
+ z = zk;
+ }
+
+ create_givens (y, z, &c, &s);
+
+ /* Compute U <= U G */
+
+#ifdef USE_BLAS
+ {
+ gsl_vector_view Uk = gsl_matrix_column(U,k);
+ gsl_vector_view Ukp1 = gsl_matrix_column(U,k+1);
+ gsl_blas_drot(&Uk.vector, &Ukp1.vector, c, -s);
+ }
+#else
+ for (i = 0; i < M; i++)
+ {
+ double Uip = gsl_matrix_get (U, i, k);
+ double Uiq = gsl_matrix_get (U, i, k + 1);
+ gsl_matrix_set (U, i, k, c * Uip - s * Uiq);
+ gsl_matrix_set (U, i, k + 1, s * Uip + c * Uiq);
+ }
+#endif
+
+ /* compute B <= G^T B */
+
+ {
+ double ak1 = c * ak - s * zk;
+ double bk1 = c * bk - s * ap;
+ double zk1 = -s * bp;
+
+ double ap1 = s * bk + c * ap;
+ double bp1 = c * bp;
+
+ gsl_vector_set (d, k, ak1);
+
+ ak = ak1;
+ bk = bk1;
+ zk = zk1;
+
+ ap = ap1;
+ bp = bp1;
+
+ if (k < n - 2)
+ {
+ aq = gsl_vector_get (d, k + 2);
+ }
+ else
+ {
+ aq = 0.0;
+ }
+
+ y = bk;
+ z = zk;
+ }
+ }
+
+ gsl_vector_set (f, n - 2, bk);
+ gsl_vector_set (d, n - 1, ap);
+}
+
+
diff --git a/gsl-1.9/linalg/symmtd.c b/gsl-1.9/linalg/symmtd.c
new file mode 100644
index 0000000..77356b9
--- /dev/null
+++ b/gsl-1.9/linalg/symmtd.c
@@ -0,0 +1,232 @@
+/* linalg/sytd.c
+ *
+ * Copyright (C) 2001 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Factorise a symmetric matrix A into
+ *
+ * A = Q T Q'
+ *
+ * where Q is orthogonal and T is symmetric tridiagonal. Only the
+ * diagonal and lower triangular part of A is referenced and modified.
+ *
+ * On exit, T is stored in the diagonal and first subdiagonal of
+ * A. Since T is symmetric the upper diagonal is not stored.
+ *
+ * Q is stored as a packed set of Householder transformations in the
+ * lower triangular part of the input matrix below the first subdiagonal.
+ *
+ * The full matrix for Q can be obtained as the product
+ *
+ * Q = Q_1 Q_2 ... Q_(N-2)
+ *
+ * where
+ *
+ * Q_i = (I - tau_i * v_i * v_i')
+ *
+ * and where v_i is a Householder vector
+ *
+ * v_i = [0, ... , 0, 1, A(i+1,i), A(i+2,i), ... , A(N,i)]
+ *
+ * This storage scheme is the same as in LAPACK. See LAPACK's
+ * ssytd2.f for details.
+ *
+ * See Golub & Van Loan, "Matrix Computations" (3rd ed), Section 8.3
+ *
+ * Note: this description uses 1-based indices. The code below uses
+ * 0-based indices
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_blas.h>
+
+#include <gsl/gsl_linalg.h>
+
+int
+gsl_linalg_symmtd_decomp (gsl_matrix * A, gsl_vector * tau)
+{
+ if (A->size1 != A->size2)
+ {
+ GSL_ERROR ("symmetric tridiagonal decomposition requires square matrix",
+ GSL_ENOTSQR);
+ }
+ else if (tau->size + 1 != A->size1)
+ {
+ GSL_ERROR ("size of tau must be (matrix size - 1)", GSL_EBADLEN);
+ }
+ else
+ {
+ const size_t N = A->size1;
+ size_t i;
+
+ for (i = 0 ; i < N - 2; i++)
+ {
+ gsl_vector_view c = gsl_matrix_column (A, i);
+ gsl_vector_view v = gsl_vector_subvector (&c.vector, i + 1, N - (i + 1));
+ double tau_i = gsl_linalg_householder_transform (&v.vector);
+
+ /* Apply the transformation H^T A H to the remaining columns */
+
+ if (tau_i != 0.0)
+ {
+ gsl_matrix_view m = gsl_matrix_submatrix (A, i + 1, i + 1,
+ N - (i+1), N - (i+1));
+ double ei = gsl_vector_get(&v.vector, 0);
+ gsl_vector_view x = gsl_vector_subvector (tau, i, N-(i+1));
+ gsl_vector_set (&v.vector, 0, 1.0);
+
+ /* x = tau * A * v */
+ gsl_blas_dsymv (CblasLower, tau_i, &m.matrix, &v.vector, 0.0, &x.vector);
+
+ /* w = x - (1/2) tau * (x' * v) * v */
+ {
+ double xv, alpha;
+ gsl_blas_ddot(&x.vector, &v.vector, &xv);
+ alpha = - (tau_i / 2.0) * xv;
+ gsl_blas_daxpy(alpha, &v.vector, &x.vector);
+ }
+
+ /* apply the transformation A = A - v w' - w v' */
+ gsl_blas_dsyr2(CblasLower, -1.0, &v.vector, &x.vector, &m.matrix);
+
+ gsl_vector_set (&v.vector, 0, ei);
+ }
+
+ gsl_vector_set (tau, i, tau_i);
+ }
+
+ return GSL_SUCCESS;
+ }
+}
+
+
+/* Form the orthogonal matrix Q from the packed QR matrix */
+
+int
+gsl_linalg_symmtd_unpack (const gsl_matrix * A,
+ const gsl_vector * tau,
+ gsl_matrix * Q,
+ gsl_vector * diag,
+ gsl_vector * sdiag)
+{
+ if (A->size1 != A->size2)
+ {
+ GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
+ }
+ else if (tau->size + 1 != A->size1)
+ {
+ GSL_ERROR ("size of tau must be (matrix size - 1)", GSL_EBADLEN);
+ }
+ else if (Q->size1 != A->size1 || Q->size2 != A->size1)
+ {
+ GSL_ERROR ("size of Q must match size of A", GSL_EBADLEN);
+ }
+ else if (diag->size != A->size1)
+ {
+ GSL_ERROR ("size of diagonal must match size of A", GSL_EBADLEN);
+ }
+ else if (sdiag->size + 1 != A->size1)
+ {
+ GSL_ERROR ("size of subdiagonal must be (matrix size - 1)", GSL_EBADLEN);
+ }
+ else
+ {
+ const size_t N = A->size1;
+
+ size_t i;
+
+ /* Initialize Q to the identity */
+
+ gsl_matrix_set_identity (Q);
+
+ for (i = N - 2; i > 0 && i--;)
+ {
+ gsl_vector_const_view c = gsl_matrix_const_column (A, i);
+ gsl_vector_const_view h = gsl_vector_const_subvector (&c.vector, i + 1, N - (i+1));
+ double ti = gsl_vector_get (tau, i);
+
+ gsl_matrix_view m = gsl_matrix_submatrix (Q, i + 1, i + 1, N-(i+1), N-(i+1));
+
+ gsl_linalg_householder_hm (ti, &h.vector, &m.matrix);
+ }
+
+ /* Copy diagonal into diag */
+
+ for (i = 0; i < N; i++)
+ {
+ double Aii = gsl_matrix_get (A, i, i);
+ gsl_vector_set (diag, i, Aii);
+ }
+
+ /* Copy subdiagonal into sd */
+
+ for (i = 0; i < N - 1; i++)
+ {
+ double Aji = gsl_matrix_get (A, i+1, i);
+ gsl_vector_set (sdiag, i, Aji);
+ }
+
+ return GSL_SUCCESS;
+ }
+}
+
+int
+gsl_linalg_symmtd_unpack_T (const gsl_matrix * A,
+ gsl_vector * diag,
+ gsl_vector * sdiag)
+{
+ if (A->size1 != A->size2)
+ {
+ GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
+ }
+ else if (diag->size != A->size1)
+ {
+ GSL_ERROR ("size of diagonal must match size of A", GSL_EBADLEN);
+ }
+ else if (sdiag->size + 1 != A->size1)
+ {
+ GSL_ERROR ("size of subdiagonal must be (matrix size - 1)", GSL_EBADLEN);
+ }
+ else
+ {
+ const size_t N = A->size1;
+
+ size_t i;
+
+ /* Copy diagonal into diag */
+
+ for (i = 0; i < N; i++)
+ {
+ double Aii = gsl_matrix_get (A, i, i);
+ gsl_vector_set (diag, i, Aii);
+ }
+
+ /* Copy subdiagonal into sdiag */
+
+ for (i = 0; i < N - 1; i++)
+ {
+ double Aij = gsl_matrix_get (A, i+1, i);
+ gsl_vector_set (sdiag, i, Aij);
+ }
+
+ return GSL_SUCCESS;
+ }
+}
diff --git a/gsl-1.9/linalg/test.c b/gsl-1.9/linalg/test.c
new file mode 100644
index 0000000..4736243
--- /dev/null
+++ b/gsl-1.9/linalg/test.c
@@ -0,0 +1,3790 @@
+/* linalg/test.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004, 2005
+ * Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman
+ */
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_permute_vector.h>
+#include <gsl/gsl_blas.h>
+#include <gsl/gsl_complex_math.h>
+#include <gsl/gsl_linalg.h>
+
+#define TEST_SVD_4X4 1
+
+int check (double x, double actual, double eps);
+gsl_matrix * create_hilbert_matrix(unsigned long size);
+gsl_matrix * create_general_matrix(unsigned long size1, unsigned long size2);
+gsl_matrix * create_vandermonde_matrix(unsigned long size);
+gsl_matrix * create_moler_matrix(unsigned long size);
+gsl_matrix * create_row_matrix(unsigned long size1, unsigned long size2);
+gsl_matrix * create_2x2_matrix(double a11, double a12, double a21, double a22);
+gsl_matrix * create_diagonal_matrix(double a[], unsigned long size);
+
+int test_matmult(void);
+int test_matmult_mod(void);
+int test_LU_solve_dim(const gsl_matrix * m, const double * actual, double eps);
+int test_LU_solve(void);
+int test_LUc_solve_dim(const gsl_matrix_complex * m, const double * actual, double eps);
+int test_LUc_solve(void);
+int test_QR_solve_dim(const gsl_matrix * m, const double * actual, double eps);
+int test_QR_solve(void);
+int test_QR_QRsolve_dim(const gsl_matrix * m, const double * actual, double eps);
+int test_QR_QRsolve(void);
+int test_QR_lssolve_dim(const gsl_matrix * m, const double * actual, double eps);
+int test_QR_lssolve(void);
+int test_QR_decomp_dim(const gsl_matrix * m, double eps);
+int test_QR_decomp(void);
+int test_QRPT_solve_dim(const gsl_matrix * m, const double * actual, double eps);
+int test_QRPT_solve(void);
+int test_QRPT_QRsolve_dim(const gsl_matrix * m, const double * actual, double eps);
+int test_QRPT_QRsolve(void);
+int test_QRPT_decomp_dim(const gsl_matrix * m, double eps);
+int test_QRPT_decomp(void);
+int test_QR_update_dim(const gsl_matrix * m, double eps);
+int test_QR_update(void);
+
+int test_LQ_solve_dim(const gsl_matrix * m, const double * actual, double eps);
+int test_LQ_solve(void);
+int test_LQ_LQsolve_dim(const gsl_matrix * m, const double * actual, double eps);
+int test_LQ_LQsolve(void);
+int test_LQ_lssolve_dim(const gsl_matrix * m, const double * actual, double eps);
+int test_LQ_lssolve(void);
+int test_LQ_decomp_dim(const gsl_matrix * m, double eps);
+int test_LQ_decomp(void);
+int test_PTLQ_solve_dim(const gsl_matrix * m, const double * actual, double eps);
+int test_PTLQ_solve(void);
+int test_PTLQ_LQsolve_dim(const gsl_matrix * m, const double * actual, double eps);
+int test_PTLQ_LQsolve(void);
+int test_PTLQ_decomp_dim(const gsl_matrix * m, double eps);
+int test_PTLQ_decomp(void);
+int test_LQ_update_dim(const gsl_matrix * m, double eps);
+int test_LQ_update(void);
+
+int test_SV_solve_dim(const gsl_matrix * m, const double * actual, double eps);
+int test_SV_solve(void);
+int test_SV_decomp_dim(const gsl_matrix * m, double eps);
+int test_SV_decomp(void);
+int test_SV_decomp_mod_dim(const gsl_matrix * m, double eps);
+int test_SV_decomp_mod(void);
+int test_SV_decomp_jacobi_dim(const gsl_matrix * m, double eps);
+int test_SV_decomp_jacobi(void);
+int test_cholesky_solve_dim(const gsl_matrix * m, const double * actual, double eps);
+int test_cholesky_solve(void);
+int test_cholesky_decomp_dim(const gsl_matrix * m, double eps);
+int test_cholesky_decomp(void);
+int test_HH_solve_dim(const gsl_matrix * m, const double * actual, double eps);
+int test_HH_solve(void);
+int test_TDS_solve_dim(unsigned long dim, double d, double od, const double * actual, double eps);
+int test_TDS_solve(void);
+int test_TDN_solve_dim(unsigned long dim, double d, double a, double b, const double * actual, double eps);
+int test_TDN_solve(void);
+int test_TDS_cyc_solve_one(const unsigned long dim, const double * d, const double * od, const double * r,
+ const double * actual, double eps);
+int test_TDS_cyc_solve(void);
+int test_TDN_cyc_solve_dim(unsigned long dim, double d, double a, double b, const double * actual, double eps);
+int test_TDN_cyc_solve(void);
+int test_bidiag_decomp_dim(const gsl_matrix * m, double eps);
+int test_bidiag_decomp(void);
+
+int
+check (double x, double actual, double eps)
+{
+ if (x == actual)
+ {
+ return 0;
+ }
+ else if (actual == 0)
+ {
+ return fabs(x) > eps;
+ }
+ else
+ {
+ return (fabs(x - actual)/fabs(actual)) > eps;
+ }
+}
+
+gsl_matrix *
+create_hilbert_matrix(unsigned long size)
+{
+ unsigned long i, j;
+ gsl_matrix * m = gsl_matrix_alloc(size, size);
+ for(i=0; i<size; i++) {
+ for(j=0; j<size; j++) {
+ gsl_matrix_set(m, i, j, 1.0/(i+j+1.0));
+ }
+ }
+ return m;
+}
+
+gsl_matrix *
+create_general_matrix(unsigned long size1, unsigned long size2)
+{
+ unsigned long i, j;
+ gsl_matrix * m = gsl_matrix_alloc(size1, size2);
+ for(i=0; i<size1; i++) {
+ for(j=0; j<size2; j++) {
+ gsl_matrix_set(m, i, j, 1.0/(i+j+1.0));
+ }
+ }
+ return m;
+}
+
+gsl_matrix *
+create_singular_matrix(unsigned long size1, unsigned long size2)
+{
+ unsigned long i, j;
+ gsl_matrix * m = gsl_matrix_alloc(size1, size2);
+ for(i=0; i<size1; i++) {
+ for(j=0; j<size2; j++) {
+ gsl_matrix_set(m, i, j, 1.0/(i+j+1.0));
+ }
+ }
+
+ /* zero the first column */
+ for(j = 0; j <size2; j++)
+ gsl_matrix_set(m,0,j,0.0);
+
+ return m;
+}
+
+
+gsl_matrix *
+create_vandermonde_matrix(unsigned long size)
+{
+ unsigned long i, j;
+ gsl_matrix * m = gsl_matrix_alloc(size, size);
+ for(i=0; i<size; i++) {
+ for(j=0; j<size; j++) {
+ gsl_matrix_set(m, i, j, pow(i + 1.0, size - j - 1.0));
+ }
+ }
+ return m;
+}
+
+gsl_matrix *
+create_moler_matrix(unsigned long size)
+{
+ unsigned long i, j;
+ gsl_matrix * m = gsl_matrix_alloc(size, size);
+ for(i=0; i<size; i++) {
+ for(j=0; j<size; j++) {
+ gsl_matrix_set(m, i, j, GSL_MIN(i+1,j+1)-2.0);
+ }
+ }
+ return m;
+}
+
+gsl_matrix_complex *
+create_complex_matrix(unsigned long size)
+{
+ unsigned long i, j;
+ gsl_matrix_complex * m = gsl_matrix_complex_alloc(size, size);
+ for(i=0; i<size; i++) {
+ for(j=0; j<size; j++) {
+ gsl_complex z = gsl_complex_rect(1.0/(i+j+1.0), 1/(i*i+j*j+0.5));
+ gsl_matrix_complex_set(m, i, j, z);
+ }
+ }
+ return m;
+}
+
+gsl_matrix *
+create_row_matrix(unsigned long size1, unsigned long size2)
+{
+ unsigned long i;
+ gsl_matrix * m = gsl_matrix_calloc(size1, size2);
+ for(i=0; i<size1; i++) {
+ gsl_matrix_set(m, i, 0, 1.0/(i+1.0));
+ }
+
+ return m;
+}
+
+gsl_matrix *
+create_2x2_matrix(double a11, double a12, double a21, double a22)
+{
+ gsl_matrix * m = gsl_matrix_alloc(2, 2);
+ gsl_matrix_set(m, 0, 0, a11);
+ gsl_matrix_set(m, 0, 1, a12);
+ gsl_matrix_set(m, 1, 0, a21);
+ gsl_matrix_set(m, 1, 1, a22);
+ return m;
+}
+
+gsl_matrix *
+create_diagonal_matrix(double a[], unsigned long size)
+{
+ unsigned long i;
+ gsl_matrix * m = gsl_matrix_calloc(size, size);
+ for(i=0; i<size; i++) {
+ gsl_matrix_set(m, i, i, a[i]);
+ }
+
+ return m;
+}
+
+gsl_matrix * m11;
+gsl_matrix * m51;
+
+gsl_matrix * m35;
+gsl_matrix * m53;
+gsl_matrix * m97;
+
+gsl_matrix * s35;
+gsl_matrix * s53;
+
+gsl_matrix * hilb2;
+gsl_matrix * hilb3;
+gsl_matrix * hilb4;
+gsl_matrix * hilb12;
+
+gsl_matrix * row3;
+gsl_matrix * row5;
+gsl_matrix * row12;
+
+gsl_matrix * A22;
+gsl_matrix * A33;
+gsl_matrix * A44;
+gsl_matrix * A55;
+
+gsl_matrix_complex * c7;
+
+gsl_matrix * inf5; double inf5_data[] = {1.0, 0.0, -3.0, 0.0, -5.0};
+gsl_matrix * nan5;
+
+double m53_lssolution[] = {52.5992295702070, -337.7263113752073,
+ 351.8823436427604};
+double hilb2_solution[] = {-8.0, 18.0} ;
+double hilb3_solution[] = {27.0, -192.0, 210.0};
+double hilb4_solution[] = {-64.0, 900.0, -2520.0, 1820.0};
+double hilb12_solution[] = {-1728.0, 245388.0, -8528520.0,
+ 127026900.0, -1009008000.0, 4768571808.0,
+ -14202796608.0, 27336497760.0, -33921201600.0,
+ 26189163000.0, -11437874448.0, 2157916488.0 };
+
+double c7_solution[] = { 2.40717272023734e+01, -9.84612797621247e+00,
+ -2.69338853034031e+02, 8.75455232472528e+01,
+ 2.96661356736296e+03, -1.02624473923993e+03,
+ -1.82073812124749e+04, 5.67384473042410e+03,
+ 5.57693879019068e+04, -1.61540963210502e+04,
+ -7.88941207561151e+04, 1.95053812987858e+04,
+ 3.95548551241728e+04, -7.76593696255317e+03 };
+
+gsl_matrix * vander2;
+gsl_matrix * vander3;
+gsl_matrix * vander4;
+gsl_matrix * vander12;
+
+double vander2_solution[] = {1.0, 0.0};
+double vander3_solution[] = {0.0, 1.0, 0.0};
+double vander4_solution[] = {0.0, 0.0, 1.0, 0.0};
+double vander12_solution[] = {0.0, 0.0, 0.0, 0.0,
+ 0.0, 0.0, 0.0, 0.0,
+ 0.0, 0.0, 1.0, 0.0};
+
+gsl_matrix * moler10;
+
+/* matmult now obsolete */
+#ifdef MATMULT
+int
+test_matmult(void)
+{
+ int s = 0;
+
+ gsl_matrix * A = gsl_matrix_calloc(2, 2);
+ gsl_matrix * B = gsl_matrix_calloc(2, 3);
+ gsl_matrix * C = gsl_matrix_calloc(2, 3);
+
+ gsl_matrix_set(A, 0, 0, 10.0);
+ gsl_matrix_set(A, 0, 1, 5.0);
+ gsl_matrix_set(A, 1, 0, 1.0);
+ gsl_matrix_set(A, 1, 1, 20.0);
+
+ gsl_matrix_set(B, 0, 0, 10.0);
+ gsl_matrix_set(B, 0, 1, 5.0);
+ gsl_matrix_set(B, 0, 2, 2.0);
+ gsl_matrix_set(B, 1, 0, 1.0);
+ gsl_matrix_set(B, 1, 1, 3.0);
+ gsl_matrix_set(B, 1, 2, 2.0);
+
+ gsl_linalg_matmult(A, B, C);
+
+ s += ( fabs(gsl_matrix_get(C, 0, 0) - 105.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 0, 1) - 65.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 0, 2) - 30.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 1, 0) - 30.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 1, 1) - 65.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 1, 2) - 42.0) > GSL_DBL_EPSILON );
+
+ gsl_matrix_free(A);
+ gsl_matrix_free(B);
+ gsl_matrix_free(C);
+
+ return s;
+}
+
+
+int
+test_matmult_mod(void)
+{
+ int s = 0;
+
+ gsl_matrix * A = gsl_matrix_calloc(3, 3);
+ gsl_matrix * B = gsl_matrix_calloc(3, 3);
+ gsl_matrix * C = gsl_matrix_calloc(3, 3);
+ gsl_matrix * D = gsl_matrix_calloc(2, 3);
+ gsl_matrix * E = gsl_matrix_calloc(2, 3);
+ gsl_matrix * F = gsl_matrix_calloc(2, 2);
+
+ gsl_matrix_set(A, 0, 0, 10.0);
+ gsl_matrix_set(A, 0, 1, 5.0);
+ gsl_matrix_set(A, 0, 2, 1.0);
+ gsl_matrix_set(A, 1, 0, 1.0);
+ gsl_matrix_set(A, 1, 1, 20.0);
+ gsl_matrix_set(A, 1, 2, 5.0);
+ gsl_matrix_set(A, 2, 0, 1.0);
+ gsl_matrix_set(A, 2, 1, 3.0);
+ gsl_matrix_set(A, 2, 2, 7.0);
+
+ gsl_matrix_set(B, 0, 0, 10.0);
+ gsl_matrix_set(B, 0, 1, 5.0);
+ gsl_matrix_set(B, 0, 2, 2.0);
+ gsl_matrix_set(B, 1, 0, 1.0);
+ gsl_matrix_set(B, 1, 1, 3.0);
+ gsl_matrix_set(B, 1, 2, 2.0);
+ gsl_matrix_set(B, 2, 0, 1.0);
+ gsl_matrix_set(B, 2, 1, 3.0);
+ gsl_matrix_set(B, 2, 2, 2.0);
+
+ gsl_matrix_set(D, 0, 0, 10.0);
+ gsl_matrix_set(D, 0, 1, 5.0);
+ gsl_matrix_set(D, 0, 2, 1.0);
+ gsl_matrix_set(D, 1, 0, 1.0);
+ gsl_matrix_set(D, 1, 1, 20.0);
+ gsl_matrix_set(D, 1, 2, 5.0);
+
+ gsl_matrix_set(E, 0, 0, 10.0);
+ gsl_matrix_set(E, 0, 1, 5.0);
+ gsl_matrix_set(E, 0, 2, 2.0);
+ gsl_matrix_set(E, 1, 0, 1.0);
+ gsl_matrix_set(E, 1, 1, 3.0);
+ gsl_matrix_set(E, 1, 2, 2.0);
+
+ gsl_linalg_matmult_mod(A, GSL_LINALG_MOD_NONE, B, GSL_LINALG_MOD_NONE, C);
+ s += ( fabs(gsl_matrix_get(C, 0, 0) - 106.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 0, 1) - 68.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 0, 2) - 32.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 1, 0) - 35.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 1, 1) - 80.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 1, 2) - 52.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 2, 0) - 20.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 2, 1) - 35.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 2, 2) - 22.0) > GSL_DBL_EPSILON );
+
+ gsl_linalg_matmult_mod(A, GSL_LINALG_MOD_TRANSPOSE, B, GSL_LINALG_MOD_NONE, C);
+ s += ( fabs(gsl_matrix_get(C, 0, 0) - 102.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 0, 1) - 56.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 0, 2) - 24.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 1, 0) - 73.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 1, 1) - 94.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 1, 2) - 56.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 2, 0) - 22.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 2, 1) - 41.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 2, 2) - 26.0) > GSL_DBL_EPSILON );
+
+ gsl_linalg_matmult_mod(A, GSL_LINALG_MOD_NONE, B, GSL_LINALG_MOD_TRANSPOSE, C);
+ s += ( fabs(gsl_matrix_get(C, 0, 0) - 127.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 0, 1) - 27.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 0, 2) - 27.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 1, 0) - 120.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 1, 1) - 71.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 1, 2) - 71.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 2, 0) - 39.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 2, 1) - 24.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 2, 2) - 24.0) > GSL_DBL_EPSILON );
+
+ gsl_linalg_matmult_mod(A, GSL_LINALG_MOD_TRANSPOSE, B, GSL_LINALG_MOD_TRANSPOSE, C);
+ s += ( fabs(gsl_matrix_get(C, 0, 0) - 107.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 0, 1) - 15.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 0, 2) - 15.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 1, 0) - 156.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 1, 1) - 71.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 1, 2) - 71.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 2, 0) - 49.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 2, 1) - 30.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 2, 2) - 30.0) > GSL_DBL_EPSILON );
+
+ /* now try for non-symmetric matrices */
+ gsl_linalg_matmult_mod(D, GSL_LINALG_MOD_TRANSPOSE, E, GSL_LINALG_MOD_NONE, C);
+ s += ( fabs(gsl_matrix_get(C, 0, 0) - 101.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 0, 1) - 53.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 0, 2) - 22.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 1, 0) - 70.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 1, 1) - 85.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 1, 2) - 50.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 2, 0) - 15.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 2, 1) - 20.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(C, 2, 2) - 12.0) > GSL_DBL_EPSILON );
+
+
+ gsl_linalg_matmult_mod(D, GSL_LINALG_MOD_NONE, E, GSL_LINALG_MOD_TRANSPOSE, F);
+ s += ( fabs(gsl_matrix_get(F, 0, 0) - 127.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(F, 0, 1) - 27.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(F, 1, 0) - 120.0) > GSL_DBL_EPSILON );
+ s += ( fabs(gsl_matrix_get(F, 1, 1) - 71.0) > GSL_DBL_EPSILON );
+
+
+ gsl_matrix_free(A);
+ gsl_matrix_free(B);
+ gsl_matrix_free(C);
+ gsl_matrix_free(D);
+ gsl_matrix_free(E);
+ gsl_matrix_free(F);
+
+ return s;
+}
+#endif
+
+int
+test_LU_solve_dim(const gsl_matrix * m, const double * actual, double eps)
+{
+ int s = 0;
+ int signum;
+ unsigned long i, dim = m->size1;
+
+ gsl_permutation * perm = gsl_permutation_alloc(dim);
+ gsl_vector * rhs = gsl_vector_alloc(dim);
+ gsl_matrix * lu = gsl_matrix_alloc(dim,dim);
+ gsl_vector * x = gsl_vector_alloc(dim);
+ gsl_vector * residual = gsl_vector_alloc(dim);
+ gsl_matrix_memcpy(lu,m);
+ for(i=0; i<dim; i++) gsl_vector_set(rhs, i, i+1.0);
+ s += gsl_linalg_LU_decomp(lu, perm, &signum);
+ s += gsl_linalg_LU_solve(lu, perm, rhs, x);
+
+ for(i=0; i<dim; i++) {
+ int foo = check(gsl_vector_get(x, i),actual[i],eps);
+ if(foo) {
+ printf("%3lu[%lu]: %22.18g %22.18g\n", dim, i, gsl_vector_get(x, i), actual[i]);
+ }
+ s += foo;
+ }
+
+ s += gsl_linalg_LU_refine(m, lu, perm, rhs, x, residual);
+
+ for(i=0; i<dim; i++) {
+ int foo = check(gsl_vector_get(x, i),actual[i],eps);
+ if(foo) {
+ printf("%3lu[%lu]: %22.18g %22.18g (improved)\n", dim, i, gsl_vector_get(x, i), actual[i]);
+ }
+ s += foo;
+ }
+
+ gsl_vector_free(residual);
+ gsl_vector_free(x);
+ gsl_matrix_free(lu);
+ gsl_vector_free(rhs);
+ gsl_permutation_free(perm);
+
+ return s;
+}
+
+
+int test_LU_solve(void)
+{
+ int f;
+ int s = 0;
+
+ f = test_LU_solve_dim(hilb2, hilb2_solution, 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LU_solve hilbert(2)");
+ s += f;
+
+ f = test_LU_solve_dim(hilb3, hilb3_solution, 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LU_solve hilbert(3)");
+ s += f;
+
+ f = test_LU_solve_dim(hilb4, hilb4_solution, 2048.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LU_solve hilbert(4)");
+ s += f;
+
+ f = test_LU_solve_dim(hilb12, hilb12_solution, 0.5);
+ gsl_test(f, " LU_solve hilbert(12)");
+ s += f;
+
+ f = test_LU_solve_dim(vander2, vander2_solution, 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LU_solve vander(2)");
+ s += f;
+
+ f = test_LU_solve_dim(vander3, vander3_solution, 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LU_solve vander(3)");
+ s += f;
+
+ f = test_LU_solve_dim(vander4, vander4_solution, 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LU_solve vander(4)");
+ s += f;
+
+ f = test_LU_solve_dim(vander12, vander12_solution, 0.05);
+ gsl_test(f, " LU_solve vander(12)");
+ s += f;
+
+ return s;
+}
+
+
+int
+test_LUc_solve_dim(const gsl_matrix_complex * m, const double * actual, double eps)
+{
+ int s = 0;
+ int signum;
+ unsigned long i, dim = m->size1;
+
+ gsl_permutation * perm = gsl_permutation_alloc(dim);
+ gsl_vector_complex * rhs = gsl_vector_complex_alloc(dim);
+ gsl_matrix_complex * lu = gsl_matrix_complex_alloc(dim,dim);
+ gsl_vector_complex * x = gsl_vector_complex_alloc(dim);
+ gsl_vector_complex * residual = gsl_vector_complex_alloc(dim);
+ gsl_matrix_complex_memcpy(lu,m);
+ for(i=0; i<dim; i++)
+ {
+ gsl_complex z = gsl_complex_rect (2.0*i+1.0, 2.0*i+2.0);
+ gsl_vector_complex_set(rhs, i, z);
+ }
+ s += gsl_linalg_complex_LU_decomp(lu, perm, &signum);
+ s += gsl_linalg_complex_LU_solve(lu, perm, rhs, x);
+
+ for(i=0; i<dim; i++) {
+ gsl_complex z = gsl_vector_complex_get(x, i);
+ int foo_r = check(GSL_REAL(z),actual[2*i],eps);
+ int foo_i = check(GSL_IMAG(z),actual[2*i+1],eps);
+ if(foo_r || foo_i) {
+ printf("%3lu[%lu]: %22.18g %22.18g\n", dim, i, GSL_REAL(z), actual[2*i]);
+ printf("%3lu[%lu]: %22.18g %22.18g\n", dim, i, GSL_IMAG(z), actual[2*i+1]);
+ }
+ s += foo_r + foo_i;
+ }
+
+ s += gsl_linalg_complex_LU_refine(m, lu, perm, rhs, x, residual);
+
+ for(i=0; i<dim; i++) {
+ gsl_complex z = gsl_vector_complex_get(x, i);
+ int foo_r = check(GSL_REAL(z),actual[2*i],eps);
+ int foo_i = check(GSL_IMAG(z),actual[2*i+1],eps);
+ if(foo_r || foo_i) {
+ printf("%3lu[%lu]: %22.18g %22.18g (improved)\n", dim, i, GSL_REAL(z), actual[2*i]);
+ printf("%3lu[%lu]: %22.18g %22.18g (improved)\n", dim, i, GSL_IMAG(z), actual[2*i+1]);
+ }
+ s += foo_r + foo_i;
+ }
+
+ gsl_vector_complex_free(residual);
+ gsl_vector_complex_free(x);
+ gsl_matrix_complex_free(lu);
+ gsl_vector_complex_free(rhs);
+ gsl_permutation_free(perm);
+
+ return s;
+}
+
+
+int test_LUc_solve(void)
+{
+ int f;
+ int s = 0;
+
+ f = test_LUc_solve_dim(c7, c7_solution, 1024.0 * 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " complex_LU_solve complex(7)");
+ s += f;
+
+ return s;
+}
+
+
+int
+test_QR_solve_dim(const gsl_matrix * m, const double * actual, double eps)
+{
+ int s = 0;
+ unsigned long i, dim = m->size1;
+
+ gsl_vector * rhs = gsl_vector_alloc(dim);
+ gsl_matrix * qr = gsl_matrix_alloc(dim,dim);
+ gsl_vector * d = gsl_vector_alloc(dim);
+ gsl_vector * x = gsl_vector_alloc(dim);
+
+ gsl_matrix_memcpy(qr,m);
+ for(i=0; i<dim; i++) gsl_vector_set(rhs, i, i+1.0);
+ s += gsl_linalg_QR_decomp(qr, d);
+ s += gsl_linalg_QR_solve(qr, d, rhs, x);
+ for(i=0; i<dim; i++) {
+ int foo = check(gsl_vector_get(x, i), actual[i], eps);
+ if(foo) {
+ printf("%3lu[%lu]: %22.18g %22.18g\n", dim, i, gsl_vector_get(x, i), actual[i]);
+ }
+ s += foo;
+ }
+
+ gsl_vector_free(x);
+ gsl_vector_free(d);
+ gsl_matrix_free(qr);
+ gsl_vector_free(rhs);
+
+ return s;
+}
+
+int test_QR_solve(void)
+{
+ int f;
+ int s = 0;
+
+ f = test_QR_solve_dim(hilb2, hilb2_solution, 2 * 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QR_solve hilbert(2)");
+ s += f;
+
+ f = test_QR_solve_dim(hilb3, hilb3_solution, 2 * 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QR_solve hilbert(3)");
+ s += f;
+
+ f = test_QR_solve_dim(hilb4, hilb4_solution, 2 * 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QR_solve hilbert(4)");
+ s += f;
+
+ f = test_QR_solve_dim(hilb12, hilb12_solution, 0.5);
+ gsl_test(f, " QR_solve hilbert(12)");
+ s += f;
+
+ f = test_QR_solve_dim(vander2, vander2_solution, 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QR_solve vander(2)");
+ s += f;
+
+ f = test_QR_solve_dim(vander3, vander3_solution, 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QR_solve vander(3)");
+ s += f;
+
+ f = test_QR_solve_dim(vander4, vander4_solution, 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QR_solve vander(4)");
+ s += f;
+
+ f = test_QR_solve_dim(vander12, vander12_solution, 0.05);
+ gsl_test(f, " QR_solve vander(12)");
+ s += f;
+
+ return s;
+}
+
+
+int
+test_QR_QRsolve_dim(const gsl_matrix * m, const double * actual, double eps)
+{
+ int s = 0;
+ unsigned long i, dim = m->size1;
+
+ gsl_vector * rhs = gsl_vector_alloc(dim);
+ gsl_matrix * qr = gsl_matrix_alloc(dim,dim);
+ gsl_matrix * q = gsl_matrix_alloc(dim,dim);
+ gsl_matrix * r = gsl_matrix_alloc(dim,dim);
+ gsl_vector * d = gsl_vector_alloc(dim);
+ gsl_vector * x = gsl_vector_alloc(dim);
+
+ gsl_matrix_memcpy(qr,m);
+ for(i=0; i<dim; i++) gsl_vector_set(rhs, i, i+1.0);
+ s += gsl_linalg_QR_decomp(qr, d);
+ s += gsl_linalg_QR_unpack(qr, d, q, r);
+ s += gsl_linalg_QR_QRsolve(q, r, rhs, x);
+ for(i=0; i<dim; i++) {
+ int foo = check(gsl_vector_get(x, i), actual[i], eps);
+ if(foo) {
+ printf("%3lu[%lu]: %22.18g %22.18g\n", dim, i, gsl_vector_get(x, i), actual[i]);
+ }
+ s += foo;
+ }
+
+ gsl_vector_free(x);
+ gsl_vector_free(d);
+ gsl_matrix_free(qr);
+ gsl_matrix_free(q);
+ gsl_matrix_free(r);
+ gsl_vector_free(rhs);
+ return s;
+}
+
+int test_QR_QRsolve(void)
+{
+ int f;
+ int s = 0;
+
+ f = test_QR_QRsolve_dim(hilb2, hilb2_solution, 2 * 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QR_QRsolve hilbert(2)");
+ s += f;
+
+ f = test_QR_QRsolve_dim(hilb3, hilb3_solution, 2 * 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QR_QRsolve hilbert(3)");
+ s += f;
+
+ f = test_QR_QRsolve_dim(hilb4, hilb4_solution, 2 * 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QR_QRsolve hilbert(4)");
+ s += f;
+
+ f = test_QR_QRsolve_dim(hilb12, hilb12_solution, 0.5);
+ gsl_test(f, " QR_QRsolve hilbert(12)");
+ s += f;
+
+ f = test_QR_QRsolve_dim(vander2, vander2_solution, 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QR_QRsolve vander(2)");
+ s += f;
+
+ f = test_QR_QRsolve_dim(vander3, vander3_solution, 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QR_QRsolve vander(3)");
+ s += f;
+
+ f = test_QR_QRsolve_dim(vander4, vander4_solution, 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QR_QRsolve vander(4)");
+ s += f;
+
+ f = test_QR_QRsolve_dim(vander12, vander12_solution, 0.05);
+ gsl_test(f, " QR_QRsolve vander(12)");
+ s += f;
+
+ return s;
+}
+
+
+int
+test_QR_lssolve_dim(const gsl_matrix * m, const double * actual, double eps)
+{
+ int s = 0;
+ unsigned long i, M = m->size1, N = m->size2;
+
+ gsl_vector * rhs = gsl_vector_alloc(M);
+ gsl_matrix * qr = gsl_matrix_alloc(M,N);
+ gsl_vector * d = gsl_vector_alloc(N);
+ gsl_vector * x = gsl_vector_alloc(N);
+ gsl_vector * r = gsl_vector_alloc(M);
+ gsl_vector * res = gsl_vector_alloc(M);
+
+ gsl_matrix_memcpy(qr,m);
+ for(i=0; i<M; i++) gsl_vector_set(rhs, i, i+1.0);
+ s += gsl_linalg_QR_decomp(qr, d);
+ s += gsl_linalg_QR_lssolve(qr, d, rhs, x, res);
+
+ for(i=0; i<N; i++) {
+ int foo = check(gsl_vector_get(x, i), actual[i], eps);
+ if(foo) {
+ printf("(%3lu,%3lu)[%lu]: %22.18g %22.18g\n", M, N, i, gsl_vector_get(x, i), actual[i]);
+ }
+ s += foo;
+ }
+
+ /* compute residual r = b - m x */
+ if (M == N) {
+ gsl_vector_set_zero(r);
+ } else {
+ gsl_vector_memcpy(r, rhs);
+ gsl_blas_dgemv(CblasNoTrans, -1.0, m, x, 1.0, r);
+ };
+
+ for(i=0; i<N; i++) {
+ int foo = check(gsl_vector_get(res, i), gsl_vector_get(r,i), sqrt(eps));
+ if(foo) {
+ printf("(%3lu,%3lu)[%lu]: %22.18g %22.18g\n", M, N, i, gsl_vector_get(res, i), gsl_vector_get(r,i));
+ }
+ s += foo;
+ }
+
+ gsl_vector_free(r);
+ gsl_vector_free(res);
+ gsl_vector_free(x);
+ gsl_vector_free(d);
+ gsl_matrix_free(qr);
+ gsl_vector_free(rhs);
+
+ return s;
+}
+
+int test_QR_lssolve(void)
+{
+ int f;
+ int s = 0;
+
+ f = test_QR_lssolve_dim(m53, m53_lssolution, 2 * 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QR_lssolve m(5,3)");
+ s += f;
+
+ f = test_QR_lssolve_dim(hilb2, hilb2_solution, 2 * 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QR_lssolve hilbert(2)");
+ s += f;
+
+ f = test_QR_lssolve_dim(hilb3, hilb3_solution, 2 * 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QR_lssolve hilbert(3)");
+ s += f;
+
+ f = test_QR_lssolve_dim(hilb4, hilb4_solution, 2 * 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QR_lssolve hilbert(4)");
+ s += f;
+
+ f = test_QR_lssolve_dim(hilb12, hilb12_solution, 0.5);
+ gsl_test(f, " QR_lssolve hilbert(12)");
+ s += f;
+
+ f = test_QR_lssolve_dim(vander2, vander2_solution, 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QR_lssolve vander(2)");
+ s += f;
+
+ f = test_QR_lssolve_dim(vander3, vander3_solution, 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QR_lssolve vander(3)");
+ s += f;
+
+ f = test_QR_lssolve_dim(vander4, vander4_solution, 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QR_lssolve vander(4)");
+ s += f;
+
+ f = test_QR_lssolve_dim(vander12, vander12_solution, 0.05);
+ gsl_test(f, " QR_lssolve vander(12)");
+ s += f;
+
+ return s;
+}
+
+
+int
+test_QR_decomp_dim(const gsl_matrix * m, double eps)
+{
+ int s = 0;
+ unsigned long i,j, M = m->size1, N = m->size2;
+
+ gsl_matrix * qr = gsl_matrix_alloc(M,N);
+ gsl_matrix * a = gsl_matrix_alloc(M,N);
+ gsl_matrix * q = gsl_matrix_alloc(M,M);
+ gsl_matrix * r = gsl_matrix_alloc(M,N);
+ gsl_vector * d = gsl_vector_alloc(GSL_MIN(M,N));
+
+ gsl_matrix_memcpy(qr,m);
+
+ s += gsl_linalg_QR_decomp(qr, d);
+ s += gsl_linalg_QR_unpack(qr, d, q, r);
+
+ /* compute a = q r */
+ gsl_blas_dgemm (CblasNoTrans, CblasNoTrans, 1.0, q, r, 0.0, a);
+
+ for(i=0; i<M; i++) {
+ for(j=0; j<N; j++) {
+ double aij = gsl_matrix_get(a, i, j);
+ double mij = gsl_matrix_get(m, i, j);
+ int foo = check(aij, mij, eps);
+ if(foo) {
+ printf("(%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", M, N, i,j, aij, mij);
+ }
+ s += foo;
+ }
+ }
+
+ gsl_vector_free(d);
+ gsl_matrix_free(qr);
+ gsl_matrix_free(a);
+ gsl_matrix_free(q);
+ gsl_matrix_free(r);
+
+ return s;
+}
+
+int test_QR_decomp(void)
+{
+ int f;
+ int s = 0;
+
+ f = test_QR_decomp_dim(m35, 2 * 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QR_decomp m(3,5)");
+ s += f;
+
+ f = test_QR_decomp_dim(m53, 2 * 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QR_decomp m(5,3)");
+ s += f;
+
+ f = test_QR_decomp_dim(hilb2, 2 * 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QR_decomp hilbert(2)");
+ s += f;
+
+ f = test_QR_decomp_dim(hilb3, 2 * 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QR_decomp hilbert(3)");
+ s += f;
+
+ f = test_QR_decomp_dim(hilb4, 2 * 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QR_decomp hilbert(4)");
+ s += f;
+
+ f = test_QR_decomp_dim(hilb12, 2 * 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QR_decomp hilbert(12)");
+ s += f;
+
+ f = test_QR_decomp_dim(vander2, 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QR_decomp vander(2)");
+ s += f;
+
+ f = test_QR_decomp_dim(vander3, 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QR_decomp vander(3)");
+ s += f;
+
+ f = test_QR_decomp_dim(vander4, 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QR_decomp vander(4)");
+ s += f;
+
+ f = test_QR_decomp_dim(vander12, 0.0005); /* FIXME: bad accuracy */
+ gsl_test(f, " QR_decomp vander(12)");
+ s += f;
+
+ return s;
+}
+
+int
+test_QRPT_solve_dim(const gsl_matrix * m, const double * actual, double eps)
+{
+ int s = 0;
+ int signum;
+ unsigned long i, dim = m->size1;
+
+ gsl_permutation * perm = gsl_permutation_alloc(dim);
+ gsl_vector * rhs = gsl_vector_alloc(dim);
+ gsl_matrix * qr = gsl_matrix_alloc(dim,dim);
+ gsl_vector * d = gsl_vector_alloc(dim);
+ gsl_vector * x = gsl_vector_alloc(dim);
+ gsl_vector * norm = gsl_vector_alloc(dim);
+
+ gsl_matrix_memcpy(qr,m);
+ for(i=0; i<dim; i++) gsl_vector_set(rhs, i, i+1.0);
+ s += gsl_linalg_QRPT_decomp(qr, d, perm, &signum, norm);
+ s += gsl_linalg_QRPT_solve(qr, d, perm, rhs, x);
+ for(i=0; i<dim; i++) {
+ int foo = check(gsl_vector_get(x, i), actual[i], eps);
+ if(foo) {
+ printf("%3lu[%lu]: %22.18g %22.18g\n", dim, i, gsl_vector_get(x, i), actual[i]);
+ }
+ s += foo;
+ }
+
+ gsl_vector_free(norm);
+ gsl_vector_free(x);
+ gsl_vector_free(d);
+ gsl_matrix_free(qr);
+ gsl_vector_free(rhs);
+ gsl_permutation_free(perm);
+
+ return s;
+}
+
+int test_QRPT_solve(void)
+{
+ int f;
+ int s = 0;
+
+ f = test_QRPT_solve_dim(hilb2, hilb2_solution, 2 * 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QRPT_solve hilbert(2)");
+ s += f;
+
+ f = test_QRPT_solve_dim(hilb3, hilb3_solution, 2 * 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QRPT_solve hilbert(3)");
+ s += f;
+
+ f = test_QRPT_solve_dim(hilb4, hilb4_solution, 2 * 2048.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QRPT_solve hilbert(4)");
+ s += f;
+
+ f = test_QRPT_solve_dim(hilb12, hilb12_solution, 0.5);
+ gsl_test(f, " QRPT_solve hilbert(12)");
+ s += f;
+
+ f = test_QRPT_solve_dim(vander2, vander2_solution, 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QRPT_solve vander(2)");
+ s += f;
+
+ f = test_QRPT_solve_dim(vander3, vander3_solution, 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QRPT_solve vander(3)");
+ s += f;
+
+ f = test_QRPT_solve_dim(vander4, vander4_solution, 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QRPT_solve vander(4)");
+ s += f;
+
+ f = test_QRPT_solve_dim(vander12, vander12_solution, 0.05);
+ gsl_test(f, " QRPT_solve vander(12)");
+ s += f;
+
+ return s;
+}
+
+int
+test_QRPT_QRsolve_dim(const gsl_matrix * m, const double * actual, double eps)
+{
+ int s = 0;
+ int signum;
+ unsigned long i, dim = m->size1;
+
+ gsl_permutation * perm = gsl_permutation_alloc(dim);
+ gsl_vector * rhs = gsl_vector_alloc(dim);
+ gsl_matrix * qr = gsl_matrix_alloc(dim,dim);
+ gsl_matrix * q = gsl_matrix_alloc(dim,dim);
+ gsl_matrix * r = gsl_matrix_alloc(dim,dim);
+ gsl_vector * d = gsl_vector_alloc(dim);
+ gsl_vector * x = gsl_vector_alloc(dim);
+ gsl_vector * norm = gsl_vector_alloc(dim);
+
+ gsl_matrix_memcpy(qr,m);
+ for(i=0; i<dim; i++) gsl_vector_set(rhs, i, i+1.0);
+ s += gsl_linalg_QRPT_decomp2(qr, q, r, d, perm, &signum, norm);
+ s += gsl_linalg_QRPT_QRsolve(q, r, perm, rhs, x);
+ for(i=0; i<dim; i++) {
+ int foo = check(gsl_vector_get(x, i), actual[i], eps);
+ if(foo) {
+ printf("%3lu[%lu]: %22.18g %22.18g\n", dim, i, gsl_vector_get(x, i), actual[i]);
+ }
+ s += foo;
+ }
+
+ gsl_vector_free(norm);
+ gsl_vector_free(x);
+ gsl_vector_free(d);
+ gsl_matrix_free(qr);
+ gsl_matrix_free(q);
+ gsl_matrix_free(r);
+ gsl_vector_free(rhs);
+ gsl_permutation_free(perm);
+
+ return s;
+}
+
+int test_QRPT_QRsolve(void)
+{
+ int f;
+ int s = 0;
+
+ f = test_QRPT_QRsolve_dim(hilb2, hilb2_solution, 2 * 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QRPT_QRsolve hilbert(2)");
+ s += f;
+
+ f = test_QRPT_QRsolve_dim(hilb3, hilb3_solution, 2 * 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QRPT_QRsolve hilbert(3)");
+ s += f;
+
+ f = test_QRPT_QRsolve_dim(hilb4, hilb4_solution, 2 * 2048.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QRPT_QRsolve hilbert(4)");
+ s += f;
+
+ f = test_QRPT_QRsolve_dim(hilb12, hilb12_solution, 0.5);
+ gsl_test(f, " QRPT_QRsolve hilbert(12)");
+ s += f;
+
+ f = test_QRPT_QRsolve_dim(vander2, vander2_solution, 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QRPT_QRsolve vander(2)");
+ s += f;
+
+ f = test_QRPT_QRsolve_dim(vander3, vander3_solution, 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QRPT_QRsolve vander(3)");
+ s += f;
+
+ f = test_QRPT_QRsolve_dim(vander4, vander4_solution, 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QRPT_QRsolve vander(4)");
+ s += f;
+
+ f = test_QRPT_QRsolve_dim(vander12, vander12_solution, 0.05);
+ gsl_test(f, " QRPT_QRsolve vander(12)");
+ s += f;
+
+ return s;
+}
+
+int
+test_QRPT_decomp_dim(const gsl_matrix * m, double eps)
+{
+ int s = 0, signum;
+ unsigned long i,j, M = m->size1, N = m->size2;
+
+ gsl_matrix * qr = gsl_matrix_alloc(M,N);
+ gsl_matrix * a = gsl_matrix_alloc(M,N);
+ gsl_matrix * q = gsl_matrix_alloc(M,M);
+ gsl_matrix * r = gsl_matrix_alloc(M,N);
+ gsl_vector * d = gsl_vector_alloc(GSL_MIN(M,N));
+ gsl_vector * norm = gsl_vector_alloc(N);
+
+ gsl_permutation * perm = gsl_permutation_alloc(N);
+
+ gsl_matrix_memcpy(qr,m);
+
+ s += gsl_linalg_QRPT_decomp(qr, d, perm, &signum, norm);
+ s += gsl_linalg_QR_unpack(qr, d, q, r);
+
+ /* compute a = q r */
+ gsl_blas_dgemm (CblasNoTrans, CblasNoTrans, 1.0, q, r, 0.0, a);
+
+
+ /* Compute QR P^T by permuting the elements of the rows of QR */
+
+ for (i = 0; i < M; i++) {
+ gsl_vector_view row = gsl_matrix_row (a, i);
+ gsl_permute_vector_inverse (perm, &row.vector);
+ }
+
+ for(i=0; i<M; i++) {
+ for(j=0; j<N; j++) {
+ double aij = gsl_matrix_get(a, i, j);
+ double mij = gsl_matrix_get(m, i, j);
+ int foo = check(aij, mij, eps);
+ if(foo) {
+ printf("(%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", M, N, i,j, aij, mij);
+ }
+ s += foo;
+ }
+ }
+
+ gsl_permutation_free (perm);
+ gsl_vector_free(norm);
+ gsl_vector_free(d);
+ gsl_matrix_free(qr);
+ gsl_matrix_free(a);
+ gsl_matrix_free(q);
+ gsl_matrix_free(r);
+
+ return s;
+}
+
+int test_QRPT_decomp(void)
+{
+ int f;
+ int s = 0;
+
+ f = test_QRPT_decomp_dim(m35, 2 * 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QRPT_decomp m(3,5)");
+ s += f;
+
+ f = test_QRPT_decomp_dim(m53, 2 * 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QRPT_decomp m(5,3)");
+ s += f;
+
+ f = test_QRPT_decomp_dim(s35, 2 * 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QRPT_decomp s(3,5)");
+ s += f;
+
+ f = test_QRPT_decomp_dim(s53, 2 * 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QRPT_decomp s(5,3)");
+ s += f;
+
+ f = test_QRPT_decomp_dim(hilb2, 2 * 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QRPT_decomp hilbert(2)");
+ s += f;
+
+ f = test_QRPT_decomp_dim(hilb3, 2 * 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QRPT_decomp hilbert(3)");
+ s += f;
+
+ f = test_QRPT_decomp_dim(hilb4, 2 * 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QRPT_decomp hilbert(4)");
+ s += f;
+
+ f = test_QRPT_decomp_dim(hilb12, 2 * 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QRPT_decomp hilbert(12)");
+ s += f;
+
+ f = test_QRPT_decomp_dim(vander2, 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QRPT_decomp vander(2)");
+ s += f;
+
+ f = test_QRPT_decomp_dim(vander3, 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QRPT_decomp vander(3)");
+ s += f;
+
+ f = test_QRPT_decomp_dim(vander4, 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QRPT_decomp vander(4)");
+ s += f;
+
+ f = test_QRPT_decomp_dim(vander12, 0.0005); /* FIXME: bad accuracy */
+ gsl_test(f, " QRPT_decomp vander(12)");
+ s += f;
+
+ return s;
+}
+
+
+int
+test_QR_update_dim(const gsl_matrix * m, double eps)
+{
+ int s = 0;
+ unsigned long i,j,k, M = m->size1, N = m->size2;
+
+ gsl_vector * rhs = gsl_vector_alloc(N);
+ gsl_matrix * qr1 = gsl_matrix_alloc(M,N);
+ gsl_matrix * qr2 = gsl_matrix_alloc(M,N);
+ gsl_matrix * q1 = gsl_matrix_alloc(M,M);
+ gsl_matrix * r1 = gsl_matrix_alloc(M,N);
+ gsl_matrix * q2 = gsl_matrix_alloc(M,M);
+ gsl_matrix * r2 = gsl_matrix_alloc(M,N);
+ gsl_vector * d = gsl_vector_alloc(GSL_MIN(M,N));
+ gsl_vector * solution1 = gsl_vector_alloc(N);
+ gsl_vector * solution2 = gsl_vector_alloc(N);
+ gsl_vector * u = gsl_vector_alloc(M);
+ gsl_vector * v = gsl_vector_alloc(N);
+ gsl_vector * w = gsl_vector_alloc(M);
+
+ gsl_matrix_memcpy(qr1,m);
+ gsl_matrix_memcpy(qr2,m);
+ for(i=0; i<N; i++) gsl_vector_set(rhs, i, i+1.0);
+ for(i=0; i<M; i++) gsl_vector_set(u, i, sin(i+1.0));
+ for(i=0; i<N; i++) gsl_vector_set(v, i, cos(i+2.0) + sin(i*i+3.0));
+
+ for(i=0; i<M; i++)
+ {
+ double ui = gsl_vector_get(u, i);
+ for(j=0; j<N; j++)
+ {
+ double vj = gsl_vector_get(v, j);
+ double qij = gsl_matrix_get(qr1, i, j);
+ gsl_matrix_set(qr1, i, j, qij + ui * vj);
+ }
+ }
+
+ s += gsl_linalg_QR_decomp(qr2, d);
+ s += gsl_linalg_QR_unpack(qr2, d, q2, r2);
+
+ /* compute w = Q^T u */
+
+ for (j = 0; j < M; j++)
+ {
+ double sum = 0;
+ for (i = 0; i < M; i++)
+ sum += gsl_matrix_get (q2, i, j) * gsl_vector_get (u, i);
+ gsl_vector_set (w, j, sum);
+ }
+
+ s += gsl_linalg_QR_update(q2, r2, w, v);
+
+ /* compute qr2 = q2 * r2 */
+
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j< N; j++)
+ {
+ double sum = 0;
+ for (k = 0; k <= GSL_MIN(j,M-1); k++)
+ {
+ double qik = gsl_matrix_get(q2, i, k);
+ double rkj = gsl_matrix_get(r2, k, j);
+ sum += qik * rkj ;
+ }
+ gsl_matrix_set (qr2, i, j, sum);
+ }
+ }
+
+ for(i=0; i<M; i++) {
+ for(j=0; j<N; j++) {
+ double s1 = gsl_matrix_get(qr1, i, j);
+ double s2 = gsl_matrix_get(qr2, i, j);
+
+ int foo = check(s1, s2, eps);
+ if(foo) {
+ printf("(%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", M, N, i,j, s1, s2);
+ }
+ s += foo;
+ }
+ }
+
+ gsl_vector_free(solution1);
+ gsl_vector_free(solution2);
+ gsl_vector_free(d);
+ gsl_vector_free(u);
+ gsl_vector_free(v);
+ gsl_vector_free(w);
+ gsl_matrix_free(qr1);
+ gsl_matrix_free(qr2);
+ gsl_matrix_free(q1);
+ gsl_matrix_free(r1);
+ gsl_matrix_free(q2);
+ gsl_matrix_free(r2);
+ gsl_vector_free(rhs);
+
+ return s;
+}
+
+int test_QR_update(void)
+{
+ int f;
+ int s = 0;
+
+ f = test_QR_update_dim(m35, 2 * 512.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QR_update m(3,5)");
+ s += f;
+
+ f = test_QR_update_dim(m53, 2 * 512.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QR_update m(5,3)");
+ s += f;
+
+ f = test_QR_update_dim(hilb2, 2 * 512.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QR_update hilbert(2)");
+ s += f;
+
+ f = test_QR_update_dim(hilb3, 2 * 512.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QR_update hilbert(3)");
+ s += f;
+
+ f = test_QR_update_dim(hilb4, 2 * 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QR_update hilbert(4)");
+ s += f;
+
+ f = test_QR_update_dim(hilb12, 2 * 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QR_update hilbert(12)");
+ s += f;
+
+ f = test_QR_update_dim(vander2, 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QR_update vander(2)");
+ s += f;
+
+ f = test_QR_update_dim(vander3, 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QR_update vander(3)");
+ s += f;
+
+ f = test_QR_update_dim(vander4, 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " QR_update vander(4)");
+ s += f;
+
+ f = test_QR_update_dim(vander12, 0.0005); /* FIXME: bad accuracy */
+ gsl_test(f, " QR_update vander(12)");
+ s += f;
+
+ return s;
+}
+
+int
+test_LQ_solve_dim(const gsl_matrix * m, const double * actual, double eps)
+{
+ int s = 0;
+ unsigned long i, dim = m->size1;
+
+ gsl_vector * rhs = gsl_vector_alloc(dim);
+ gsl_matrix * lq = gsl_matrix_alloc(dim,dim);
+ gsl_vector * d = gsl_vector_alloc(dim);
+ gsl_vector * x = gsl_vector_alloc(dim);
+
+ gsl_matrix_transpose_memcpy(lq,m);
+ for(i=0; i<dim; i++) gsl_vector_set(rhs, i, i+1.0);
+ s += gsl_linalg_LQ_decomp(lq, d);
+ s += gsl_linalg_LQ_solve_T(lq, d, rhs, x);
+ for(i=0; i<dim; i++) {
+ int foo = check(gsl_vector_get(x, i), actual[i], eps);
+ if(foo) {
+ printf("%3lu[%lu]: %22.18g %22.18g\n", dim, i, gsl_vector_get(x, i), actual[i]);
+ }
+ s += foo;
+ }
+
+ gsl_vector_free(x);
+ gsl_vector_free(d);
+ gsl_matrix_free(lq);
+ gsl_vector_free(rhs);
+
+ return s;
+}
+
+int test_LQ_solve(void)
+{
+ int f;
+ int s = 0;
+
+ f = test_LQ_solve_dim(hilb2, hilb2_solution, 2 * 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LQ_solve hilbert(2)");
+ s += f;
+
+ f = test_LQ_solve_dim(hilb3, hilb3_solution, 2 * 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LQ_solve hilbert(3)");
+ s += f;
+
+ f = test_LQ_solve_dim(hilb4, hilb4_solution, 4 * 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LQ_solve hilbert(4)");
+ s += f;
+
+ f = test_LQ_solve_dim(hilb12, hilb12_solution, 0.5);
+ gsl_test(f, " LQ_solve hilbert(12)");
+ s += f;
+
+ f = test_LQ_solve_dim(vander2, vander2_solution, 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LQ_solve vander(2)");
+ s += f;
+
+ f = test_LQ_solve_dim(vander3, vander3_solution, 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LQ_solve vander(3)");
+ s += f;
+
+ f = test_LQ_solve_dim(vander4, vander4_solution, 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LQ_solve vander(4)");
+ s += f;
+
+ f = test_LQ_solve_dim(vander12, vander12_solution, 0.05);
+ gsl_test(f, " LQ_solve vander(12)");
+ s += f;
+
+ return s;
+}
+
+
+
+
+int
+test_LQ_LQsolve_dim(const gsl_matrix * m, const double * actual, double eps)
+{
+ int s = 0;
+ unsigned long i, dim = m->size1;
+
+ gsl_vector * rhs = gsl_vector_alloc(dim);
+ gsl_matrix * lq = gsl_matrix_alloc(dim,dim);
+ gsl_matrix * q = gsl_matrix_alloc(dim,dim);
+ gsl_matrix * l = gsl_matrix_alloc(dim,dim);
+ gsl_vector * d = gsl_vector_alloc(dim);
+ gsl_vector * x = gsl_vector_alloc(dim);
+
+ gsl_matrix_transpose_memcpy(lq,m);
+ for(i=0; i<dim; i++) gsl_vector_set(rhs, i, i+1.0);
+ s += gsl_linalg_LQ_decomp(lq, d);
+ s += gsl_linalg_LQ_unpack(lq, d, q, l);
+ s += gsl_linalg_LQ_LQsolve(q, l, rhs, x);
+ for(i=0; i<dim; i++) {
+ int foo = check(gsl_vector_get(x, i), actual[i], eps);
+ if(foo) {
+ printf("%3lu[%lu]: %22.18g %22.18g\n", dim, i, gsl_vector_get(x, i), actual[i]);
+ }
+ s += foo;
+ }
+
+ gsl_vector_free(x);
+ gsl_vector_free(d);
+ gsl_matrix_free(lq);
+ gsl_matrix_free(q);
+ gsl_matrix_free(l);
+ gsl_vector_free(rhs);
+
+ return s;
+}
+
+int test_LQ_LQsolve(void)
+{
+ int f;
+ int s = 0;
+
+ f = test_LQ_LQsolve_dim(hilb2, hilb2_solution, 2 * 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LQ_LQsolve hilbert(2)");
+ s += f;
+
+ f = test_LQ_LQsolve_dim(hilb3, hilb3_solution, 2 * 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LQ_LQsolve hilbert(3)");
+ s += f;
+
+ f = test_LQ_LQsolve_dim(hilb4, hilb4_solution, 4 * 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LQ_LQsolve hilbert(4)");
+ s += f;
+
+ f = test_LQ_LQsolve_dim(hilb12, hilb12_solution, 0.5);
+ gsl_test(f, " LQ_LQsolve hilbert(12)");
+ s += f;
+
+ f = test_LQ_LQsolve_dim(vander2, vander2_solution, 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LQ_LQsolve vander(2)");
+ s += f;
+
+ f = test_LQ_LQsolve_dim(vander3, vander3_solution, 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LQ_LQsolve vander(3)");
+ s += f;
+
+ f = test_LQ_LQsolve_dim(vander4, vander4_solution, 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LQ_LQsolve vander(4)");
+ s += f;
+
+ f = test_LQ_LQsolve_dim(vander12, vander12_solution, 0.05);
+ gsl_test(f, " LQ_LQsolve vander(12)");
+ s += f;
+
+ return s;
+}
+
+
+int
+test_LQ_lssolve_dim(const gsl_matrix * m, const double * actual, double eps)
+{
+ int s = 0;
+ unsigned long i, M = m->size1, N = m->size2;
+
+ gsl_vector * rhs = gsl_vector_alloc(M);
+ gsl_matrix * lq = gsl_matrix_alloc(N,M);
+ gsl_vector * d = gsl_vector_alloc(N);
+ gsl_vector * x = gsl_vector_alloc(N);
+ gsl_vector * r = gsl_vector_alloc(M);
+ gsl_vector * res = gsl_vector_alloc(M);
+
+ gsl_matrix_transpose_memcpy(lq,m);
+ for(i=0; i<M; i++) gsl_vector_set(rhs, i, i+1.0);
+ s += gsl_linalg_LQ_decomp(lq, d);
+ s += gsl_linalg_LQ_lssolve_T(lq, d, rhs, x, res);
+
+ for(i=0; i<N; i++) {
+ int foo = check(gsl_vector_get(x, i), actual[i], eps);
+ if(foo) {
+ printf("(%3lu,%3lu)[%lu]: %22.18g %22.18g\n", M, N, i, gsl_vector_get(x, i), actual[i]);
+ }
+ s += foo;
+ }
+
+
+ /* compute residual r = b - m x */
+ if (M == N) {
+ gsl_vector_set_zero(r);
+ } else {
+ gsl_vector_memcpy(r, rhs);
+ gsl_blas_dgemv(CblasNoTrans, -1.0, m, x, 1.0, r);
+ };
+
+ for(i=0; i<N; i++) {
+ int foo = check(gsl_vector_get(res, i), gsl_vector_get(r,i), sqrt(eps));
+ if(foo) {
+ printf("(%3lu,%3lu)[%lu]: %22.18g %22.18g\n", M, N, i, gsl_vector_get(res, i), gsl_vector_get(r,i));
+ }
+ s += foo;
+ }
+
+ gsl_vector_free(r);
+ gsl_vector_free(res);
+ gsl_vector_free(x);
+ gsl_vector_free(d);
+ gsl_matrix_free(lq);
+ gsl_vector_free(rhs);
+
+ return s;
+}
+
+int test_LQ_lssolve(void)
+{
+ int f;
+ int s = 0;
+
+ f = test_LQ_lssolve_dim(m53, m53_lssolution, 2 * 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LQ_lssolve m(5,3)");
+ s += f;
+
+ f = test_LQ_lssolve_dim(hilb2, hilb2_solution, 2 * 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LQ_lssolve hilbert(2)");
+ s += f;
+
+ f = test_LQ_lssolve_dim(hilb3, hilb3_solution, 2 * 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LQ_lssolve hilbert(3)");
+ s += f;
+
+ f = test_LQ_lssolve_dim(hilb4, hilb4_solution, 4 * 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LQ_lssolve hilbert(4)");
+ s += f;
+
+ f = test_LQ_lssolve_dim(hilb12, hilb12_solution, 0.5);
+ gsl_test(f, " LQ_lssolve hilbert(12)");
+ s += f;
+
+ f = test_LQ_lssolve_dim(vander2, vander2_solution, 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LQ_lssolve vander(2)");
+ s += f;
+
+ f = test_LQ_lssolve_dim(vander3, vander3_solution, 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LQ_lssolve vander(3)");
+ s += f;
+
+ f = test_LQ_lssolve_dim(vander4, vander4_solution, 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LQ_lssolve vander(4)");
+ s += f;
+
+ f = test_LQ_lssolve_dim(vander12, vander12_solution, 0.05);
+ gsl_test(f, " LQ_lssolve vander(12)");
+ s += f;
+
+ return s;
+}
+
+
+
+
+
+
+
+
+int
+test_LQ_decomp_dim(const gsl_matrix * m, double eps)
+{
+ int s = 0;
+ unsigned long i,j, M = m->size1, N = m->size2;
+
+ gsl_matrix * lq = gsl_matrix_alloc(M,N);
+ gsl_matrix * a = gsl_matrix_alloc(M,N);
+ gsl_matrix * q = gsl_matrix_alloc(N,N);
+ gsl_matrix * l = gsl_matrix_alloc(M,N);
+ gsl_vector * d = gsl_vector_alloc(GSL_MIN(M,N));
+
+ gsl_matrix_memcpy(lq,m);
+
+ s += gsl_linalg_LQ_decomp(lq, d);
+ s += gsl_linalg_LQ_unpack(lq, d, q, l);
+
+ /* compute a = q r */
+ gsl_blas_dgemm (CblasNoTrans, CblasNoTrans, 1.0, l, q, 0.0, a);
+
+ for(i=0; i<M; i++) {
+ for(j=0; j<N; j++) {
+ double aij = gsl_matrix_get(a, i, j);
+ double mij = gsl_matrix_get(m, i, j);
+ int foo = check(aij, mij, eps);
+ if(foo) {
+ printf("(%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", M, N, i,j, aij, mij);
+ }
+ s += foo;
+ }
+ }
+
+ gsl_vector_free(d);
+ gsl_matrix_free(lq);
+ gsl_matrix_free(a);
+ gsl_matrix_free(q);
+ gsl_matrix_free(l);
+
+ return s;
+}
+
+int test_LQ_decomp(void)
+{
+ int f;
+ int s = 0;
+
+ f = test_LQ_decomp_dim(m35, 2 * 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LQ_decomp m(3,5)");
+ s += f;
+
+ f = test_LQ_decomp_dim(m53, 2 * 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LQ_decomp m(5,3)");
+ s += f;
+
+ f = test_LQ_decomp_dim(hilb2, 2 * 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LQ_decomp hilbert(2)");
+ s += f;
+
+ f = test_LQ_decomp_dim(hilb3, 2 * 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LQ_decomp hilbert(3)");
+ s += f;
+
+ f = test_LQ_decomp_dim(hilb4, 4 * 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LQ_decomp hilbert(4)");
+ s += f;
+
+ f = test_LQ_decomp_dim(hilb12, 2 * 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LQ_decomp hilbert(12)");
+ s += f;
+
+ f = test_LQ_decomp_dim(vander2, 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LQ_decomp vander(2)");
+ s += f;
+
+ f = test_LQ_decomp_dim(vander3, 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LQ_decomp vander(3)");
+ s += f;
+
+ f = test_LQ_decomp_dim(vander4, 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LQ_decomp vander(4)");
+ s += f;
+
+ f = test_LQ_decomp_dim(vander12, 0.0005); /* FIXME: bad accuracy */
+ gsl_test(f, " LQ_decomp vander(12)");
+ s += f;
+
+ return s;
+}
+
+
+
+
+int
+test_PTLQ_solve_dim(const gsl_matrix * m, const double * actual, double eps)
+{
+ int s = 0;
+ int signum;
+ unsigned long i, dim = m->size1;
+
+ gsl_permutation * perm = gsl_permutation_alloc(dim);
+ gsl_vector * rhs = gsl_vector_alloc(dim);
+ gsl_matrix * lq = gsl_matrix_alloc(dim,dim);
+ gsl_vector * d = gsl_vector_alloc(dim);
+ gsl_vector * x = gsl_vector_alloc(dim);
+ gsl_vector * norm = gsl_vector_alloc(dim);
+
+ gsl_matrix_transpose_memcpy(lq,m);
+ for(i=0; i<dim; i++) gsl_vector_set(rhs, i, i+1.0);
+ s += gsl_linalg_PTLQ_decomp(lq, d, perm, &signum, norm);
+ s += gsl_linalg_PTLQ_solve_T(lq, d, perm, rhs, x);
+ for(i=0; i<dim; i++) {
+ int foo = check(gsl_vector_get(x, i), actual[i], eps);
+ if(foo) {
+ printf("%3lu[%lu]: %22.18g %22.18g\n", dim, i, gsl_vector_get(x, i), actual[i]);
+ }
+ s += foo;
+ }
+
+ gsl_vector_free(norm);
+ gsl_vector_free(x);
+ gsl_vector_free(d);
+ gsl_matrix_free(lq);
+ gsl_vector_free(rhs);
+ gsl_permutation_free(perm);
+
+ return s;
+}
+
+int test_PTLQ_solve(void)
+{
+ int f;
+ int s = 0;
+
+ f = test_PTLQ_solve_dim(hilb2, hilb2_solution, 2 * 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " PTLQ_solve hilbert(2)");
+ s += f;
+
+ f = test_PTLQ_solve_dim(hilb3, hilb3_solution, 2 * 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " PTLQ_solve hilbert(3)");
+ s += f;
+
+ f = test_PTLQ_solve_dim(hilb4, hilb4_solution, 2 * 2048.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " PTLQ_solve hilbert(4)");
+ s += f;
+
+ f = test_PTLQ_solve_dim(hilb12, hilb12_solution, 0.5);
+ gsl_test(f, " PTLQ_solve hilbert(12)");
+ s += f;
+
+ f = test_PTLQ_solve_dim(vander2, vander2_solution, 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " PTLQ_solve vander(2)");
+ s += f;
+
+ f = test_PTLQ_solve_dim(vander3, vander3_solution, 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " PTLQ_solve vander(3)");
+ s += f;
+
+ f = test_PTLQ_solve_dim(vander4, vander4_solution, 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " PTLQ_solve vander(4)");
+ s += f;
+
+ f = test_PTLQ_solve_dim(vander12, vander12_solution, 0.05);
+ gsl_test(f, " PTLQ_solve vander(12)");
+ s += f;
+
+ return s;
+}
+
+
+int
+test_PTLQ_LQsolve_dim(const gsl_matrix * m, const double * actual, double eps)
+{
+ int s = 0;
+ int signum;
+ unsigned long i, dim = m->size1;
+
+ gsl_permutation * perm = gsl_permutation_alloc(dim);
+ gsl_vector * rhs = gsl_vector_alloc(dim);
+ gsl_matrix * lq = gsl_matrix_alloc(dim,dim);
+ gsl_matrix * q = gsl_matrix_alloc(dim,dim);
+ gsl_matrix * l = gsl_matrix_alloc(dim,dim);
+ gsl_vector * d = gsl_vector_alloc(dim);
+ gsl_vector * x = gsl_vector_alloc(dim);
+ gsl_vector * norm = gsl_vector_alloc(dim);
+
+ gsl_matrix_transpose_memcpy(lq,m);
+ for(i=0; i<dim; i++) gsl_vector_set(rhs, i, i+1.0);
+ s += gsl_linalg_PTLQ_decomp2(lq, q, l, d, perm, &signum, norm);
+ s += gsl_linalg_PTLQ_LQsolve_T(q, l, perm, rhs, x);
+ for(i=0; i<dim; i++) {
+ int foo = check(gsl_vector_get(x, i), actual[i], eps);
+ if(foo) {
+ printf("%3lu[%lu]: %22.18g %22.18g\n", dim, i, gsl_vector_get(x, i), actual[i]);
+ }
+ s += foo;
+ }
+
+ gsl_vector_free(norm);
+ gsl_vector_free(x);
+ gsl_vector_free(d);
+ gsl_matrix_free(lq);
+ gsl_vector_free(rhs);
+ gsl_permutation_free(perm);
+
+ return s;
+}
+
+int test_PTLQ_LQsolve(void)
+{
+ int f;
+ int s = 0;
+
+ f = test_PTLQ_LQsolve_dim(hilb2, hilb2_solution, 2 * 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " PTLQ_LQsolve hilbert(2)");
+ s += f;
+
+ f = test_PTLQ_LQsolve_dim(hilb3, hilb3_solution, 2 * 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " PTLQ_LQsolve hilbert(3)");
+ s += f;
+
+ f = test_PTLQ_LQsolve_dim(hilb4, hilb4_solution, 2 * 2048.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " PTLQ_LQsolve hilbert(4)");
+ s += f;
+
+ f = test_PTLQ_LQsolve_dim(hilb12, hilb12_solution, 0.5);
+ gsl_test(f, " PTLQ_LQsolve hilbert(12)");
+ s += f;
+
+ f = test_PTLQ_LQsolve_dim(vander2, vander2_solution, 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " PTLQ_LQsolve vander(2)");
+ s += f;
+
+ f = test_PTLQ_LQsolve_dim(vander3, vander3_solution, 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " PTLQ_LQsolve vander(3)");
+ s += f;
+
+ f = test_PTLQ_LQsolve_dim(vander4, vander4_solution, 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " PTLQ_LQsolve vander(4)");
+ s += f;
+
+ f = test_PTLQ_LQsolve_dim(vander12, vander12_solution, 0.05);
+ gsl_test(f, " PTLQ_LQsolve vander(12)");
+ s += f;
+
+ return s;
+}
+
+
+int
+test_PTLQ_decomp_dim(const gsl_matrix * m, double eps)
+{
+ int s = 0, signum;
+ unsigned long i,j, M = m->size1, N = m->size2;
+
+ gsl_matrix * lq = gsl_matrix_alloc(N,M);
+ gsl_matrix * a = gsl_matrix_alloc(N,M);
+ gsl_matrix * q = gsl_matrix_alloc(M,M);
+ gsl_matrix * l = gsl_matrix_alloc(N,M);
+ gsl_vector * d = gsl_vector_alloc(GSL_MIN(M,N));
+ gsl_vector * norm = gsl_vector_alloc(N);
+
+ gsl_permutation * perm = gsl_permutation_alloc(N);
+
+ gsl_matrix_transpose_memcpy(lq,m);
+
+ s += gsl_linalg_PTLQ_decomp(lq, d, perm, &signum, norm);
+ s += gsl_linalg_LQ_unpack(lq, d, q, l);
+
+ /* compute a = l q */
+ gsl_blas_dgemm (CblasNoTrans, CblasNoTrans, 1.0, l, q, 0.0, a);
+
+
+ /* Compute P LQ by permuting the rows of LQ */
+
+ for (i = 0; i < M; i++) {
+ gsl_vector_view col = gsl_matrix_column (a, i);
+ gsl_permute_vector_inverse (perm, &col.vector);
+ }
+
+ for(i=0; i<M; i++) {
+ for(j=0; j<N; j++) {
+ double aij = gsl_matrix_get(a, j, i);
+ double mij = gsl_matrix_get(m, i, j);
+ int foo = check(aij, mij, eps);
+ if(foo) {
+ printf("(%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", M, N, i,j, aij, mij);
+ }
+ s += foo;
+ }
+ }
+
+ gsl_permutation_free (perm);
+ gsl_vector_free(norm);
+ gsl_vector_free(d);
+ gsl_matrix_free(lq);
+ gsl_matrix_free(a);
+ gsl_matrix_free(q);
+ gsl_matrix_free(l);
+
+ return s;
+}
+
+int test_PTLQ_decomp(void)
+{
+ int f;
+ int s = 0;
+
+ f = test_PTLQ_decomp_dim(m35, 2 * 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " PTLQ_decomp m(3,5)");
+ s += f;
+
+ f = test_PTLQ_decomp_dim(m53, 2 * 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " PTLQ_decomp m(5,3)");
+ s += f;
+
+ f = test_PTLQ_decomp_dim(s35, 2 * 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " PTLQ_decomp s(3,5)");
+ s += f;
+
+ f = test_PTLQ_decomp_dim(s53, 2 * 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " PTLQ_decomp s(5,3)");
+ s += f;
+
+ f = test_PTLQ_decomp_dim(hilb2, 2 * 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " PTLQ_decomp hilbert(2)");
+ s += f;
+
+ f = test_PTLQ_decomp_dim(hilb3, 2 * 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " PTLQ_decomp hilbert(3)");
+ s += f;
+
+ f = test_PTLQ_decomp_dim(hilb4, 2 * 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " PTLQ_decomp hilbert(4)");
+ s += f;
+
+ f = test_PTLQ_decomp_dim(hilb12, 2 * 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " PTLQ_decomp hilbert(12)");
+ s += f;
+
+ f = test_PTLQ_decomp_dim(vander2, 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " PTLQ_decomp vander(2)");
+ s += f;
+
+ f = test_PTLQ_decomp_dim(vander3, 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " PTLQ_decomp vander(3)");
+ s += f;
+
+ f = test_PTLQ_decomp_dim(vander4, 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " PTLQ_decomp vander(4)");
+ s += f;
+
+ f = test_PTLQ_decomp_dim(vander12, 0.0005); /* FIXME: bad accuracy */
+ gsl_test(f, " PTLQ_decomp vander(12)");
+ s += f;
+
+ return s;
+}
+
+
+int
+test_LQ_update_dim(const gsl_matrix * m, double eps)
+{
+ int s = 0;
+ unsigned long i,j, M = m->size1, N = m->size2;
+
+ gsl_matrix * lq1 = gsl_matrix_alloc(N,M);
+ gsl_matrix * lq2 = gsl_matrix_alloc(N,M);
+ gsl_matrix * q1 = gsl_matrix_alloc(M,M);
+ gsl_matrix * l1 = gsl_matrix_alloc(N,M);
+ gsl_matrix * q2 = gsl_matrix_alloc(M,M);
+ gsl_matrix * l2 = gsl_matrix_alloc(N,M);
+ gsl_vector * d2 = gsl_vector_alloc(GSL_MIN(M,N));
+ gsl_vector * u = gsl_vector_alloc(M);
+ gsl_vector * v = gsl_vector_alloc(N);
+ gsl_vector * w = gsl_vector_alloc(M);
+
+ gsl_matrix_transpose_memcpy(lq1,m);
+ gsl_matrix_transpose_memcpy(lq2,m);
+ for(i=0; i<M; i++) gsl_vector_set(u, i, sin(i+1.0));
+ for(i=0; i<N; i++) gsl_vector_set(v, i, cos(i+2.0) + sin(i*i+3.0));
+
+ /* lq1 is updated */
+
+ gsl_blas_dger(1.0, v, u, lq1);
+
+ /* lq2 is first decomposed, updated later */
+
+ s += gsl_linalg_LQ_decomp(lq2, d2);
+ s += gsl_linalg_LQ_unpack(lq2, d2, q2, l2);
+
+ /* compute w = Q^T u */
+
+ gsl_blas_dgemv(CblasNoTrans, 1.0, q2, u, 0.0, w);
+
+ /* now lq2 is updated */
+
+ s += gsl_linalg_LQ_update(q2, l2, v, w);
+
+ /* multiply q2*l2 */
+
+ gsl_blas_dgemm(CblasNoTrans,CblasNoTrans,1.0,l2,q2,0.0,lq2);
+
+ /* check lq1==lq2 */
+
+ for(i=0; i<N; i++) {
+ for(j=0; j<M; j++) {
+ double s1 = gsl_matrix_get(lq1, i, j);
+ double s2 = gsl_matrix_get(lq2, i, j);
+
+ int foo = check(s1, s2, eps);
+#if 0
+ if(foo) {
+ printf("LQ:(%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", M, N, i,j, s1, s2);
+ }
+#endif
+ s += foo;
+ }
+ }
+
+ gsl_vector_free(d2);
+ gsl_vector_free(u);
+ gsl_vector_free(v);
+ gsl_vector_free(w);
+ gsl_matrix_free(lq1);
+ gsl_matrix_free(lq2);
+ gsl_matrix_free(q1);
+ gsl_matrix_free(l1);
+ gsl_matrix_free(q2);
+ gsl_matrix_free(l2);
+
+ return s;
+}
+
+int test_LQ_update(void)
+{
+ int f;
+ int s = 0;
+
+ f = test_LQ_update_dim(m35, 2 * 512.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LQ_update m(3,5)");
+ s += f;
+
+ f = test_LQ_update_dim(m53, 2 * 512.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LQ_update m(5,3)");
+ s += f;
+
+ f = test_LQ_update_dim(hilb2, 2 * 512.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LQ_update hilbert(2)");
+ s += f;
+
+ f = test_LQ_update_dim(hilb3, 2 * 512.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LQ_update hilbert(3)");
+ s += f;
+
+ f = test_LQ_update_dim(hilb4, 2 * 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LQ_update hilbert(4)");
+ s += f;
+
+ f = test_LQ_update_dim(hilb12, 2 * 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LQ_update hilbert(12)");
+ s += f;
+
+ f = test_LQ_update_dim(vander2, 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LQ_update vander(2)");
+ s += f;
+
+ f = test_LQ_update_dim(vander3, 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LQ_update vander(3)");
+ s += f;
+
+ f = test_LQ_update_dim(vander4, 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " LQ_update vander(4)");
+ s += f;
+
+ f = test_LQ_update_dim(vander12, 0.0005); /* FIXME: bad accuracy */
+ gsl_test(f, " LQ_update vander(12)");
+ s += f;
+
+ return s;
+}
+
+int
+test_SV_solve_dim(const gsl_matrix * m, const double * actual, double eps)
+{
+ int s = 0;
+ unsigned long i, dim = m->size1;
+
+ gsl_vector * rhs = gsl_vector_alloc(dim);
+ gsl_matrix * u = gsl_matrix_alloc(dim,dim);
+ gsl_matrix * q = gsl_matrix_alloc(dim,dim);
+ gsl_vector * d = gsl_vector_alloc(dim);
+ gsl_vector * x = gsl_vector_calloc(dim);
+ gsl_matrix_memcpy(u,m);
+ for(i=0; i<dim; i++) gsl_vector_set(rhs, i, i+1.0);
+ s += gsl_linalg_SV_decomp(u, q, d, x);
+ s += gsl_linalg_SV_solve(u, q, d, rhs, x);
+ for(i=0; i<dim; i++) {
+ int foo = check(gsl_vector_get(x, i), actual[i], eps);
+ if(foo) {
+ printf("%3lu[%lu]: %22.18g %22.18g\n", dim, i, gsl_vector_get(x, i), actual[i]);
+ }
+ s += foo;
+ }
+ gsl_vector_free(x);
+ gsl_vector_free(d);
+ gsl_matrix_free(u);
+ gsl_matrix_free(q);
+ gsl_vector_free(rhs);
+
+ return s;
+}
+
+int test_SV_solve(void)
+{
+ int f;
+ int s = 0;
+
+ f = test_SV_solve_dim(hilb2, hilb2_solution, 2 * 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_solve hilbert(2)");
+ s += f;
+
+ f = test_SV_solve_dim(hilb3, hilb3_solution, 2 * 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_solve hilbert(3)");
+ s += f;
+
+ f = test_SV_solve_dim(hilb4, hilb4_solution, 2 * 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_solve hilbert(4)");
+ s += f;
+
+ f = test_SV_solve_dim(hilb12, hilb12_solution, 0.5);
+ gsl_test(f, " SV_solve hilbert(12)");
+ s += f;
+
+ f = test_SV_solve_dim(vander2, vander2_solution, 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_solve vander(2)");
+ s += f;
+
+ f = test_SV_solve_dim(vander3, vander3_solution, 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_solve vander(3)");
+ s += f;
+
+ f = test_SV_solve_dim(vander4, vander4_solution, 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_solve vander(4)");
+ s += f;
+
+ f = test_SV_solve_dim(vander12, vander12_solution, 0.05);
+ gsl_test(f, " SV_solve vander(12)");
+ s += f;
+
+ return s;
+}
+
+int
+test_SV_decomp_dim(const gsl_matrix * m, double eps)
+{
+ int s = 0;
+ double di1;
+ unsigned long i,j, M = m->size1, N = m->size2;
+
+ gsl_matrix * v = gsl_matrix_alloc(M,N);
+ gsl_matrix * a = gsl_matrix_alloc(M,N);
+ gsl_matrix * q = gsl_matrix_alloc(N,N);
+ gsl_matrix * dqt = gsl_matrix_alloc(N,N);
+ gsl_vector * d = gsl_vector_alloc(N);
+ gsl_vector * w = gsl_vector_alloc(N);
+
+ gsl_matrix_memcpy(v,m);
+
+ s += gsl_linalg_SV_decomp(v, q, d, w);
+
+ /* Check that singular values are non-negative and in non-decreasing
+ order */
+
+ di1 = 0.0;
+
+ for (i = 0; i < N; i++)
+ {
+ double di = gsl_vector_get (d, i);
+
+ if (gsl_isnan (di))
+ {
+ continue; /* skip NaNs */
+ }
+
+ if (di < 0) {
+ s++;
+ printf("singular value %lu = %22.18g < 0\n", i, di);
+ }
+
+ if(i > 0 && di > di1) {
+ s++;
+ printf("singular value %lu = %22.18g vs previous %22.18g\n", i, di, di1);
+ }
+
+ di1 = di;
+ }
+
+ /* Scale dqt = D Q^T */
+
+ for (i = 0; i < N ; i++)
+ {
+ double di = gsl_vector_get (d, i);
+
+ for (j = 0; j < N; j++)
+ {
+ double qji = gsl_matrix_get(q, j, i);
+ gsl_matrix_set (dqt, i, j, qji * di);
+ }
+ }
+
+ /* compute a = v dqt */
+ gsl_blas_dgemm (CblasNoTrans, CblasNoTrans, 1.0, v, dqt, 0.0, a);
+
+ for(i=0; i<M; i++) {
+ for(j=0; j<N; j++) {
+ double aij = gsl_matrix_get(a, i, j);
+ double mij = gsl_matrix_get(m, i, j);
+ int foo = check(aij, mij, eps);
+ if(foo) {
+ printf("(%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", M, N, i,j, aij, mij);
+ }
+ s += foo;
+ }
+ }
+ gsl_vector_free(w);
+ gsl_vector_free(d);
+ gsl_matrix_free(v);
+ gsl_matrix_free(a);
+ gsl_matrix_free(q);
+ gsl_matrix_free(dqt);
+
+ return s;
+}
+
+int test_SV_decomp(void)
+{
+ int f;
+ int s = 0;
+
+ f = test_SV_decomp_dim(m11, 2 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp m(1,1)");
+ s += f;
+
+ f = test_SV_decomp_dim(m51, 2 * 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp m(5,1)");
+ s += f;
+
+ /* M<N not implemented yet */
+#if 0
+ f = test_SV_decomp_dim(m35, 2 * 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp m(3,5)");
+ s += f;
+#endif
+ f = test_SV_decomp_dim(m53, 2 * 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp m(5,3)");
+ s += f;
+
+ f = test_SV_decomp_dim(moler10, 2 * 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp moler(10)");
+ s += f;
+
+ f = test_SV_decomp_dim(hilb2, 2 * 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp hilbert(2)");
+ s += f;
+
+ f = test_SV_decomp_dim(hilb3, 2 * 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp hilbert(3)");
+ s += f;
+
+ f = test_SV_decomp_dim(hilb4, 2 * 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp hilbert(4)");
+ s += f;
+
+ f = test_SV_decomp_dim(hilb12, 2 * 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp hilbert(12)");
+ s += f;
+
+ f = test_SV_decomp_dim(vander2, 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp vander(2)");
+ s += f;
+
+ f = test_SV_decomp_dim(vander3, 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp vander(3)");
+ s += f;
+
+ f = test_SV_decomp_dim(vander4, 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp vander(4)");
+ s += f;
+
+ f = test_SV_decomp_dim(vander12, 1e-4);
+ gsl_test(f, " SV_decomp vander(12)");
+ s += f;
+
+ f = test_SV_decomp_dim(row3, 10 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp row3");
+ s += f;
+
+ f = test_SV_decomp_dim(row5, 128 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp row5");
+ s += f;
+
+ f = test_SV_decomp_dim(row12, 1024 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp row12");
+ s += f;
+
+ f = test_SV_decomp_dim(inf5, 1024 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp inf5");
+ s += f;
+
+ f = test_SV_decomp_dim(nan5, 1024 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp nan5");
+ s += f;
+
+
+ {
+ double i1, i2, i3, i4;
+ double lower = -2, upper = 2;
+
+ for (i1 = lower; i1 <= upper; i1++)
+ {
+ for (i2 = lower; i2 <= upper; i2++)
+ {
+ for (i3 = lower; i3 <= upper; i3++)
+ {
+ for (i4 = lower; i4 <= upper; i4++)
+ {
+ gsl_matrix_set (A22, 0,0, i1);
+ gsl_matrix_set (A22, 0,1, i2);
+ gsl_matrix_set (A22, 1,0, i3);
+ gsl_matrix_set (A22, 1,1, i4);
+
+ f = test_SV_decomp_dim(A22, 16 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp (2x2) A=[%g, %g; %g, %g]", i1,i2,i3,i4);
+ s += f;
+ }
+ }
+ }
+ }
+ }
+
+ {
+ int i;
+ double carry = 0, lower = 0, upper = 1;
+ double *a = A33->data;
+
+ for (i=0; i<9; i++) {
+ a[i] = lower;
+ }
+
+ while (carry == 0.0) {
+ f = test_SV_decomp_dim(A33, 64 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp (3x3) A=[ %g, %g, %g; %g, %g, %g; %g, %g, %g]",
+ a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]);
+
+ /* increment */
+ carry=1.0;
+ for (i=9; carry > 0.0 && i>0 && i--;)
+ {
+ double v=a[i]+carry;
+ carry = (v>upper) ? 1.0 : 0.0;
+ a[i] = (v>upper) ? lower : v;
+ }
+ }
+ }
+
+#ifdef TEST_SVD_4X4
+ {
+ int i;
+ double carry = 0, lower = 0, upper = 1;
+ double *a = A44->data;
+
+ for (i=0; i<16; i++) {
+ a[i] = lower;
+ }
+
+ while (carry == 0.0) {
+ f = test_SV_decomp_dim(A44, 64 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp (4x4) A=[ %g, %g, %g, %g; %g, %g, %g, %g; %g, %g, %g, %g; %g, %g, %g, %g]",
+ a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9],
+ a[10], a[11], a[12], a[13], a[14], a[15]);
+
+ /* increment */
+ carry=1.0;
+ for (i=16; carry > 0.0 && i>0 && i--;)
+ {
+ double v=a[i]+carry;
+ carry = (v>upper) ? 1.0 : 0.0;
+ a[i] = (v>upper) ? lower : v;
+ }
+ }
+ }
+#endif
+
+ return s;
+}
+
+
+int
+test_SV_decomp_mod_dim(const gsl_matrix * m, double eps)
+{
+ int s = 0;
+ double di1;
+ unsigned long i,j, M = m->size1, N = m->size2;
+
+ gsl_matrix * v = gsl_matrix_alloc(M,N);
+ gsl_matrix * a = gsl_matrix_alloc(M,N);
+ gsl_matrix * q = gsl_matrix_alloc(N,N);
+ gsl_matrix * x = gsl_matrix_alloc(N,N);
+ gsl_matrix * dqt = gsl_matrix_alloc(N,N);
+ gsl_vector * d = gsl_vector_alloc(N);
+ gsl_vector * w = gsl_vector_alloc(N);
+
+ gsl_matrix_memcpy(v,m);
+
+ s += gsl_linalg_SV_decomp_mod(v, x, q, d, w);
+
+ /* Check that singular values are non-negative and in non-decreasing
+ order */
+
+ di1 = 0.0;
+
+ for (i = 0; i < N; i++)
+ {
+ double di = gsl_vector_get (d, i);
+
+ if (gsl_isnan (di))
+ {
+ continue; /* skip NaNs */
+ }
+
+ if (di < 0) {
+ s++;
+ printf("singular value %lu = %22.18g < 0\n", i, di);
+ }
+
+ if(i > 0 && di > di1) {
+ s++;
+ printf("singular value %lu = %22.18g vs previous %22.18g\n", i, di, di1);
+ }
+
+ di1 = di;
+ }
+
+ /* Scale dqt = D Q^T */
+
+ for (i = 0; i < N ; i++)
+ {
+ double di = gsl_vector_get (d, i);
+
+ for (j = 0; j < N; j++)
+ {
+ double qji = gsl_matrix_get(q, j, i);
+ gsl_matrix_set (dqt, i, j, qji * di);
+ }
+ }
+
+ /* compute a = v dqt */
+ gsl_blas_dgemm (CblasNoTrans, CblasNoTrans, 1.0, v, dqt, 0.0, a);
+
+ for(i=0; i<M; i++) {
+ for(j=0; j<N; j++) {
+ double aij = gsl_matrix_get(a, i, j);
+ double mij = gsl_matrix_get(m, i, j);
+ int foo = check(aij, mij, eps);
+ if(foo) {
+ printf("(%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", M, N, i,j, aij, mij);
+ }
+ s += foo;
+ }
+ }
+ gsl_vector_free(w);
+ gsl_vector_free(d);
+ gsl_matrix_free(v);
+ gsl_matrix_free(a);
+ gsl_matrix_free(q);
+ gsl_matrix_free(dqt);
+ gsl_matrix_free (x);
+
+ return s;
+}
+
+int test_SV_decomp_mod(void)
+{
+ int f;
+ int s = 0;
+
+ f = test_SV_decomp_mod_dim(m11, 2 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp_mod m(1,1)");
+ s += f;
+
+ f = test_SV_decomp_mod_dim(m51, 2 * 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp_mod m(5,1)");
+ s += f;
+
+ /* M<N not implemented yet */
+#if 0
+ f = test_SV_decomp_mod_dim(m35, 2 * 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp_mod m(3,5)");
+ s += f;
+#endif
+ f = test_SV_decomp_mod_dim(m53, 2 * 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp_mod m(5,3)");
+ s += f;
+
+ f = test_SV_decomp_mod_dim(moler10, 2 * 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp_mod moler(10)");
+ s += f;
+
+ f = test_SV_decomp_mod_dim(hilb2, 2 * 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp_mod hilbert(2)");
+ s += f;
+
+ f = test_SV_decomp_mod_dim(hilb3, 2 * 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp_mod hilbert(3)");
+ s += f;
+
+ f = test_SV_decomp_mod_dim(hilb4, 2 * 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp_mod hilbert(4)");
+ s += f;
+
+ f = test_SV_decomp_mod_dim(hilb12, 2 * 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp_mod hilbert(12)");
+ s += f;
+
+ f = test_SV_decomp_mod_dim(vander2, 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp_mod vander(2)");
+ s += f;
+
+ f = test_SV_decomp_mod_dim(vander3, 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp_mod vander(3)");
+ s += f;
+
+ f = test_SV_decomp_mod_dim(vander4, 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp_mod vander(4)");
+ s += f;
+
+ f = test_SV_decomp_mod_dim(vander12, 1e-4);
+ gsl_test(f, " SV_decomp_mod vander(12)");
+ s += f;
+
+ f = test_SV_decomp_mod_dim(row3, 10 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp_mod row3");
+ s += f;
+
+ f = test_SV_decomp_mod_dim(row5, 128 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp_mod row5");
+ s += f;
+
+ f = test_SV_decomp_mod_dim(row12, 1024 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp_mod row12");
+ s += f;
+
+ f = test_SV_decomp_mod_dim(inf5, 1024 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp_mod inf5");
+ s += f;
+
+ f = test_SV_decomp_mod_dim(nan5, 1024 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp_mod nan5");
+ s += f;
+
+
+ {
+ double i1, i2, i3, i4;
+ double lower = -2, upper = 2;
+
+ for (i1 = lower; i1 <= upper; i1++)
+ {
+ for (i2 = lower; i2 <= upper; i2++)
+ {
+ for (i3 = lower; i3 <= upper; i3++)
+ {
+ for (i4 = lower; i4 <= upper; i4++)
+ {
+ gsl_matrix_set (A22, 0,0, i1);
+ gsl_matrix_set (A22, 0,1, i2);
+ gsl_matrix_set (A22, 1,0, i3);
+ gsl_matrix_set (A22, 1,1, i4);
+
+ f = test_SV_decomp_mod_dim(A22, 16 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp_mod (2x2) A=[%g, %g; %g, %g]", i1,i2,i3,i4);
+ s += f;
+ }
+ }
+ }
+ }
+ }
+
+ {
+ int i;
+ double carry = 0, lower = 0, upper = 1;
+ double *a = A33->data;
+
+ for (i=0; i<9; i++) {
+ a[i] = lower;
+ }
+
+ while (carry == 0.0) {
+ f = test_SV_decomp_mod_dim(A33, 64 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp_mod (3x3) A=[ %g, %g, %g; %g, %g, %g; %g, %g, %g]",
+ a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]);
+
+ /* increment */
+ carry=1.0;
+ for (i=9; carry > 0.0 && i>0 && i--;)
+ {
+ double v=a[i]+carry;
+ carry = (v>upper) ? 1.0 : 0.0;
+ a[i] = (v>upper) ? lower : v;
+ }
+ }
+ }
+
+#ifdef TEST_SVD_4X4
+ {
+ int i;
+ double carry = 0, lower = 0, upper = 1;
+ double *a = A44->data;
+
+ for (i=0; i<16; i++) {
+ a[i] = lower;
+ }
+
+ while (carry == 0.0) {
+ f = test_SV_decomp_mod_dim(A44, 64 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp_mod (4x4) A=[ %g, %g, %g, %g; %g, %g, %g, %g; %g, %g, %g, %g; %g, %g, %g, %g]",
+ a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9],
+ a[10], a[11], a[12], a[13], a[14], a[15]);
+
+ /* increment */
+ carry=1.0;
+ for (i=16; carry>0.0 && i>0 && i--;)
+ {
+ double v=a[i]+carry;
+ carry = (v>upper) ? 1.0 : 0.0;
+ a[i] = (v>upper) ? lower : v;
+ }
+ }
+ }
+#endif
+
+ return s;
+}
+
+
+int
+test_SV_decomp_jacobi_dim(const gsl_matrix * m, double eps)
+{
+ int s = 0;
+ double di1;
+ unsigned long i,j, M = m->size1, N = m->size2;
+
+ gsl_matrix * v = gsl_matrix_alloc(M,N);
+ gsl_matrix * a = gsl_matrix_alloc(M,N);
+ gsl_matrix * q = gsl_matrix_alloc(N,N);
+ gsl_matrix * dqt = gsl_matrix_alloc(N,N);
+ gsl_vector * d = gsl_vector_alloc(N);
+
+ gsl_matrix_memcpy(v,m);
+
+ s += gsl_linalg_SV_decomp_jacobi(v, q, d);
+ if (s)
+ printf("call returned status = %d\n", s);
+
+ /* Check that singular values are non-negative and in non-decreasing
+ order */
+
+ di1 = 0.0;
+
+ for (i = 0; i < N; i++)
+ {
+ double di = gsl_vector_get (d, i);
+
+ if (gsl_isnan (di))
+ {
+ continue; /* skip NaNs */
+ }
+
+ if (di < 0) {
+ s++;
+ printf("singular value %lu = %22.18g < 0\n", i, di);
+ }
+
+ if(i > 0 && di > di1) {
+ s++;
+ printf("singular value %lu = %22.18g vs previous %22.18g\n", i, di, di1);
+ }
+
+ di1 = di;
+ }
+
+ /* Scale dqt = D Q^T */
+
+ for (i = 0; i < N ; i++)
+ {
+ double di = gsl_vector_get (d, i);
+
+ for (j = 0; j < N; j++)
+ {
+ double qji = gsl_matrix_get(q, j, i);
+ gsl_matrix_set (dqt, i, j, qji * di);
+ }
+ }
+
+ /* compute a = v dqt */
+ gsl_blas_dgemm (CblasNoTrans, CblasNoTrans, 1.0, v, dqt, 0.0, a);
+
+ for(i=0; i<M; i++) {
+ for(j=0; j<N; j++) {
+ double aij = gsl_matrix_get(a, i, j);
+ double mij = gsl_matrix_get(m, i, j);
+ int foo = check(aij, mij, eps);
+ if(foo) {
+ printf("(%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", M, N, i,j, aij, mij);
+ }
+ s += foo;
+ }
+ }
+ gsl_vector_free(d);
+ gsl_matrix_free(v);
+ gsl_matrix_free(a);
+ gsl_matrix_free(q);
+ gsl_matrix_free(dqt);
+
+ return s;
+}
+
+int test_SV_decomp_jacobi(void)
+{
+ int f;
+ int s = 0;
+
+ f = test_SV_decomp_jacobi_dim(m11, 2 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp_jacobi m(1,1)");
+ s += f;
+
+ f = test_SV_decomp_jacobi_dim(m51, 2 * 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp_jacobi m(5,1)");
+ s += f;
+
+ /* M<N not implemented yet */
+#if 0
+ f = test_SV_decomp_jacobi_dim(m35, 2 * 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp_jacobi m(3,5)");
+ s += f;
+#endif
+ f = test_SV_decomp_jacobi_dim(m53, 2 * 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp_jacobi m(5,3)");
+ s += f;
+
+ f = test_SV_decomp_jacobi_dim(moler10, 2 * 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp_jacobi moler(10)");
+ s += f;
+
+ f = test_SV_decomp_jacobi_dim(hilb2, 2 * 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp_jacobi hilbert(2)");
+ s += f;
+
+ f = test_SV_decomp_jacobi_dim(hilb3, 2 * 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp_jacobi hilbert(3)");
+ s += f;
+
+ f = test_SV_decomp_jacobi_dim(hilb4, 2 * 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp_jacobi hilbert(4)");
+ s += f;
+
+ f = test_SV_decomp_jacobi_dim(hilb12, 2 * 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp_jacobi hilbert(12)");
+ s += f;
+
+ f = test_SV_decomp_jacobi_dim(vander2, 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp_jacobi vander(2)");
+ s += f;
+
+ f = test_SV_decomp_jacobi_dim(vander3, 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp_jacobi vander(3)");
+ s += f;
+
+ f = test_SV_decomp_jacobi_dim(vander4, 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp_jacobi vander(4)");
+ s += f;
+
+ f = test_SV_decomp_jacobi_dim(vander12, 1e-4);
+ gsl_test(f, " SV_decomp_jacobi vander(12)");
+ s += f;
+
+ f = test_SV_decomp_jacobi_dim(row3, 10 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp_jacobi row3");
+ s += f;
+
+ f = test_SV_decomp_jacobi_dim(row5, 128 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp_jacobi row5");
+ s += f;
+
+ f = test_SV_decomp_jacobi_dim(row12, 1024 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp_jacobi row12");
+ s += f;
+
+
+#ifdef TEST_JACOBI_INF
+ f = test_SV_decomp_jacobi_dim(inf5, 1024 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp_jacobi inf5");
+ s += f;
+
+ f = test_SV_decomp_jacobi_dim(nan5, 1024 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp_jacobi nan5");
+ s += f;
+#endif
+
+ {
+ double i1, i2, i3, i4;
+ double lower = -2, upper = 2;
+
+ for (i1 = lower; i1 <= upper; i1++)
+ {
+ for (i2 = lower; i2 <= upper; i2++)
+ {
+ for (i3 = lower; i3 <= upper; i3++)
+ {
+ for (i4 = lower; i4 <= upper; i4++)
+ {
+ gsl_matrix_set (A22, 0,0, i1);
+ gsl_matrix_set (A22, 0,1, i2);
+ gsl_matrix_set (A22, 1,0, i3);
+ gsl_matrix_set (A22, 1,1, i4);
+
+ f = test_SV_decomp_jacobi_dim(A22, 16 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp_jacobi (2x2) A=[%g, %g; %g, %g]", i1,i2,i3,i4);
+ s += f;
+ }
+ }
+ }
+ }
+ }
+
+ {
+ int i;
+ double carry = 0, lower = 0, upper = 1;
+ double *a = A33->data;
+
+ for (i=0; i<9; i++) {
+ a[i] = lower;
+ }
+
+ while (carry == 0.0) {
+ f = test_SV_decomp_jacobi_dim(A33, 64 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp_jacobi (3x3) A=[ %g, %g, %g; %g, %g, %g; %g, %g, %g]",
+ a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]);
+
+ /* increment */
+ carry=1.0;
+ for (i=9; carry > 0.0 && i>0 && i--;)
+ {
+ double v=a[i]+carry;
+ carry = (v>upper) ? 1.0 : 0.0;
+ a[i] = (v>upper) ? lower : v;
+ }
+ }
+ }
+
+#ifdef TEST_SVD_4X4
+ {
+ int i;
+ unsigned long k = 0;
+ double carry = 0, lower = 0, upper = 1;
+ double *a = A44->data;
+
+ for (i=0; i<16; i++) {
+ a[i] = lower;
+ }
+
+ while (carry == 0.0) {
+ k++;
+ f = test_SV_decomp_jacobi_dim(A44, 64 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp_jacobi (4x4) A=[ %g, %g, %g, %g; %g, %g, %g, %g; %g, %g, %g, %g; %g, %g, %g, %g] %lu",
+ a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9],
+ a[10], a[11], a[12], a[13], a[14], a[15], k);
+ /* increment */
+ carry=1.0;
+ for (i=16; carry > 0.0 && i>0 && i--;)
+ {
+ double v=a[i]+carry;
+ carry = (v>upper) ? 1.0 : 0.0;
+ a[i] = (v>upper) ? lower : v;
+ }
+ }
+ }
+#endif
+
+ {
+ int i;
+ unsigned long k = 0;
+ double carry = 0, lower = 0, upper = 1;
+ double *a = A55->data;
+
+ for (i=0; i<25; i++) {
+ a[i] = lower;
+ }
+
+ while (carry == 0.0) {
+ k++;
+
+ if (k % 1001 == 0)
+ {
+ f = test_SV_decomp_jacobi_dim(A55, 64 * GSL_DBL_EPSILON);
+ gsl_test(f, " SV_decomp_jacobi (5x5) case=%lu",k);
+ }
+
+ /* increment */
+ carry=1.0;
+ for (i=25; carry >0.0 && i>0 && i--;)
+ {
+ double v=a[i]+carry;
+ carry = (v>upper) ? 1.0 : 0.0;
+ a[i] = (v>upper) ? lower : v;
+ }
+ }
+ }
+
+
+ return s;
+}
+
+
+int
+test_cholesky_solve_dim(const gsl_matrix * m, const double * actual, double eps)
+{
+ int s = 0;
+ unsigned long i, dim = m->size1;
+
+ gsl_vector * rhs = gsl_vector_alloc(dim);
+ gsl_matrix * u = gsl_matrix_alloc(dim,dim);
+ gsl_vector * x = gsl_vector_calloc(dim);
+ gsl_matrix_memcpy(u,m);
+ for(i=0; i<dim; i++) gsl_vector_set(rhs, i, i+1.0);
+ s += gsl_linalg_cholesky_decomp(u);
+ s += gsl_linalg_cholesky_solve(u, rhs, x);
+ for(i=0; i<dim; i++) {
+ int foo = check(gsl_vector_get(x, i), actual[i], eps);
+ if(foo) {
+ printf("%3lu[%lu]: %22.18g %22.18g\n", dim, i, gsl_vector_get(x, i), actual[i]);
+ }
+ s += foo;
+ }
+ gsl_vector_free(x);
+ gsl_matrix_free(u);
+ gsl_vector_free(rhs);
+
+ return s;
+}
+
+int test_cholesky_solve(void)
+{
+ int f;
+ int s = 0;
+
+ f = test_cholesky_solve_dim(hilb2, hilb2_solution, 2 * 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " cholesky_solve hilbert(2)");
+ s += f;
+
+ f = test_cholesky_solve_dim(hilb3, hilb3_solution, 2 * 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " cholesky_solve hilbert(3)");
+ s += f;
+
+ f = test_cholesky_solve_dim(hilb4, hilb4_solution, 2 * 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " cholesky_solve hilbert(4)");
+ s += f;
+
+ f = test_cholesky_solve_dim(hilb12, hilb12_solution, 0.5);
+ gsl_test(f, " cholesky_solve hilbert(12)");
+ s += f;
+
+ return s;
+}
+
+
+int
+test_cholesky_decomp_dim(const gsl_matrix * m, double eps)
+{
+ int s = 0;
+ unsigned long i,j, M = m->size1, N = m->size2;
+
+ gsl_matrix * v = gsl_matrix_alloc(M,N);
+ gsl_matrix * a = gsl_matrix_alloc(M,N);
+ gsl_matrix * l = gsl_matrix_alloc(M,N);
+ gsl_matrix * lt = gsl_matrix_alloc(N,N);
+
+ gsl_matrix_memcpy(v,m);
+
+ s += gsl_linalg_cholesky_decomp(v);
+
+ /* Compute L LT */
+
+ for (i = 0; i < N ; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ double vij = gsl_matrix_get(v, i, j);
+ gsl_matrix_set (l, i, j, i>=j ? vij : 0);
+ gsl_matrix_set (lt, i, j, i<=j ? vij : 0);
+ }
+ }
+
+ /* compute a = l lt */
+ gsl_blas_dgemm (CblasNoTrans, CblasNoTrans, 1.0, l, lt, 0.0, a);
+
+ for(i=0; i<M; i++) {
+ for(j=0; j<N; j++) {
+ double aij = gsl_matrix_get(a, i, j);
+ double mij = gsl_matrix_get(m, i, j);
+ int foo = check(aij, mij, eps);
+ if(foo) {
+ printf("(%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", M, N, i,j, aij, mij);
+ }
+ s += foo;
+ }
+ }
+
+ gsl_matrix_free(v);
+ gsl_matrix_free(a);
+ gsl_matrix_free(l);
+ gsl_matrix_free(lt);
+
+ return s;
+}
+
+int test_cholesky_decomp(void)
+{
+ int f;
+ int s = 0;
+
+ f = test_cholesky_decomp_dim(hilb2, 2 * 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " cholesky_decomp hilbert(2)");
+ s += f;
+
+ f = test_cholesky_decomp_dim(hilb3, 2 * 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " cholesky_decomp hilbert(3)");
+ s += f;
+
+ f = test_cholesky_decomp_dim(hilb4, 2 * 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " cholesky_decomp hilbert(4)");
+ s += f;
+
+ f = test_cholesky_decomp_dim(hilb12, 2 * 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " cholesky_decomp hilbert(12)");
+ s += f;
+
+ return s;
+}
+
+
+int
+test_cholesky_decomp_unit_dim(const gsl_matrix * m, double eps)
+{
+ int s = 0;
+ const unsigned long M = m->size1;
+ const unsigned long N = m->size2;
+ unsigned long i,j;
+
+ gsl_matrix * v = gsl_matrix_alloc(M,N);
+ gsl_matrix * a = gsl_matrix_alloc(M,N);
+ gsl_matrix * l = gsl_matrix_alloc(M,N);
+ gsl_matrix * lt = gsl_matrix_alloc(N,N);
+ gsl_matrix * dm = gsl_matrix_alloc(M,N);
+ gsl_vector * dv = gsl_vector_alloc(M);
+
+ gsl_matrix_memcpy(v,m);
+
+ s += gsl_linalg_cholesky_decomp_unit(v, dv);
+
+ /*
+ for(i = 0; i < M; i++)
+ {
+ for(j = 0; j < N; j++)
+ {
+ printf("v[%lu,%lu]: %22.18e\n", i,j, gsl_matrix_get(v, i, j));
+ }
+ }
+
+
+ for(i = 0; i < M; i++)
+ {
+ printf("d[%lu]: %22.18e\n", i, gsl_vector_get(dv, i));
+ }
+ */
+
+ /* put L and transpose(L) into separate matrices */
+
+ for(i = 0; i < N ; i++)
+ {
+ for(j = 0; j < N; j++)
+ {
+ const double vij = gsl_matrix_get(v, i, j);
+ gsl_matrix_set (l, i, j, i>=j ? vij : 0);
+ gsl_matrix_set (lt, i, j, i<=j ? vij : 0);
+ }
+ }
+
+ /* put D into its own matrix */
+
+ gsl_matrix_set_zero(dm);
+ for(i = 0; i < M; ++i) gsl_matrix_set(dm, i, i, gsl_vector_get(dv, i));
+
+ /* compute a = L * D * transpose(L); uses v for temp space */
+
+ gsl_blas_dgemm (CblasNoTrans, CblasNoTrans, 1.0, dm, lt, 0.0, v);
+ gsl_blas_dgemm (CblasNoTrans, CblasNoTrans, 1.0, l, v, 0.0, a);
+
+ for(i = 0; i < M; i++)
+ {
+ for(j = 0; j < N; j++)
+ {
+ const double aij = gsl_matrix_get(a, i, j);
+ const double mij = gsl_matrix_get(m, i, j);
+ int foo = check(aij, mij, eps);
+ if(foo)
+ {
+ printf("(%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", M, N, i,j, aij, mij);
+ }
+ s += foo;
+ }
+ }
+
+ gsl_vector_free(dv);
+ gsl_matrix_free(dm);
+ gsl_matrix_free(lt);
+ gsl_matrix_free(l);
+ gsl_matrix_free(v);
+ gsl_matrix_free(a);
+
+ return s;
+}
+
+int test_cholesky_decomp_unit(void)
+{
+ int f;
+ int s = 0;
+
+ f = test_cholesky_decomp_unit_dim(hilb2, 2 * 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " cholesky_decomp_unit hilbert(2)");
+ s += f;
+
+ f = test_cholesky_decomp_unit_dim(hilb3, 2 * 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " cholesky_decomp_unit hilbert(3)");
+ s += f;
+
+ f = test_cholesky_decomp_unit_dim(hilb4, 2 * 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " cholesky_decomp_unit hilbert(4)");
+ s += f;
+
+ f = test_cholesky_decomp_unit_dim(hilb12, 2 * 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " cholesky_decomp_unit hilbert(12)");
+ s += f;
+
+ return s;
+}
+
+
+int
+test_HH_solve_dim(const gsl_matrix * m, const double * actual, double eps)
+{
+ int s = 0;
+ unsigned long i, dim = m->size1;
+
+ gsl_permutation * perm = gsl_permutation_alloc(dim);
+ gsl_matrix * hh = gsl_matrix_alloc(dim,dim);
+ gsl_vector * d = gsl_vector_alloc(dim);
+ gsl_vector * x = gsl_vector_alloc(dim);
+ gsl_matrix_memcpy(hh,m);
+ for(i=0; i<dim; i++) gsl_vector_set(x, i, i+1.0);
+ s += gsl_linalg_HH_svx(hh, x);
+ for(i=0; i<dim; i++) {
+ int foo = check(gsl_vector_get(x, i),actual[i],eps);
+ if( foo) {
+ printf("%3lu[%lu]: %22.18g %22.18g\n", dim, i, gsl_vector_get(x, i), actual[i]);
+ }
+ s += foo;
+ }
+ gsl_vector_free(x);
+ gsl_vector_free(d);
+ gsl_matrix_free(hh);
+ gsl_permutation_free(perm);
+
+ return s;
+}
+
+int test_HH_solve(void)
+{
+ int f;
+ int s = 0;
+
+ f = test_HH_solve_dim(hilb2, hilb2_solution, 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " HH_solve hilbert(2)");
+ s += f;
+
+ f = test_HH_solve_dim(hilb3, hilb3_solution, 128.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " HH_solve hilbert(3)");
+ s += f;
+
+ f = test_HH_solve_dim(hilb4, hilb4_solution, 2.0 * 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " HH_solve hilbert(4)");
+ s += f;
+
+ f = test_HH_solve_dim(hilb12, hilb12_solution, 0.5);
+ gsl_test(f, " HH_solve hilbert(12)");
+ s += f;
+
+ f = test_HH_solve_dim(vander2, vander2_solution, 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " HH_solve vander(2)");
+ s += f;
+
+ f = test_HH_solve_dim(vander3, vander3_solution, 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " HH_solve vander(3)");
+ s += f;
+
+ f = test_HH_solve_dim(vander4, vander4_solution, 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " HH_solve vander(4)");
+ s += f;
+
+ f = test_HH_solve_dim(vander12, vander12_solution, 0.05);
+ gsl_test(f, " HH_solve vander(12)");
+ s += f;
+
+ return s;
+}
+
+
+int
+test_TDS_solve_dim(unsigned long dim, double d, double od, const double * actual, double eps)
+{
+ int s = 0;
+ unsigned long i;
+
+ gsl_vector * offdiag = gsl_vector_alloc(dim-1);
+ gsl_vector * diag = gsl_vector_alloc(dim);
+ gsl_vector * rhs = gsl_vector_alloc(dim);
+ gsl_vector * x = gsl_vector_alloc(dim);
+
+ for(i=0; i<dim; i++) {
+ gsl_vector_set(diag, i, d);
+ gsl_vector_set(rhs, i, i + 1.0);
+ }
+ for(i=0; i<dim-1; i++) {
+ gsl_vector_set(offdiag, i, od);
+ }
+
+ s += gsl_linalg_solve_symm_tridiag(diag, offdiag, rhs, x);
+
+ for(i=0; i<dim; i++) {
+ double si = gsl_vector_get(x, i);
+ double ai = actual[i];
+ int foo = check(si, ai, eps);
+ if(foo) {
+ printf("%3lu[%lu]: %22.18g %22.18g\n", dim, i, gsl_vector_get(x, i), actual[i]);
+ }
+ s += foo;
+ }
+
+ gsl_vector_free(x);
+ gsl_vector_free(rhs);
+ gsl_vector_free(diag);
+ gsl_vector_free(offdiag);
+
+ return s;
+}
+
+
+int test_TDS_solve(void)
+{
+ int f;
+ int s = 0;
+
+ {
+ double actual[] = {0.0, 2.0};
+ f = test_TDS_solve_dim(2, 1.0, 0.5, actual, 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " solve_TDS dim=2 A");
+ s += f;
+ }
+
+ {
+ double actual[] = {3.0/8.0, 15.0/8.0};
+ f = test_TDS_solve_dim(2, 1.0, 1.0/3.0, actual, 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " solve_TDS dim=2 B");
+ s += f;
+ }
+
+ {
+ double actual[] = {5.0/8.0, 9.0/8.0, 2.0, 15.0/8.0, 35.0/8.0};
+ f = test_TDS_solve_dim(5, 1.0, 1.0/3.0, actual, 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " solve_TDS dim=5");
+ s += f;
+ }
+
+ return s;
+}
+
+int
+test_TDS_cyc_solve_one(const unsigned long dim, const double * d, const double * od,
+ const double * r, const double * actual, double eps)
+{
+ int s = 0;
+ unsigned long i;
+
+ gsl_vector * offdiag = gsl_vector_alloc(dim);
+ gsl_vector * diag = gsl_vector_alloc(dim);
+ gsl_vector * rhs = gsl_vector_alloc(dim);
+ gsl_vector * x = gsl_vector_alloc(dim);
+
+ for(i=0; i<dim; i++) {
+ gsl_vector_set(diag, i, d[i]);
+ gsl_vector_set(rhs, i, r[i]);
+ gsl_vector_set(offdiag, i, od[i]);
+ }
+
+ s += gsl_linalg_solve_symm_cyc_tridiag(diag, offdiag, rhs, x);
+
+ for(i=0; i<dim; i++) {
+ double si = gsl_vector_get(x, i);
+ double ai = actual[i];
+ int foo = check(si, ai, eps);
+ if(foo) {
+ printf("%3lu[%lu]: %22.18g %22.18g\n", dim, i, gsl_vector_get(x, i), actual[i]);
+ }
+ s += foo;
+ }
+
+ gsl_vector_free(x);
+ gsl_vector_free(rhs);
+ gsl_vector_free(diag);
+ gsl_vector_free(offdiag);
+
+ return s;
+}
+
+int test_TDS_cyc_solve(void)
+{
+ int f;
+ int s = 0;
+
+#ifdef SUPPORT_UNDERSIZE_CYC
+ {
+ unsigned long dim = 1;
+ double diag[] = { 2 };
+ double offdiag[] = { 3 };
+ double rhs[] = { 7 };
+ double actual[] = { 3.5 };
+
+ f = test_TDS_cyc_solve_one(dim, diag, offdiag, rhs, actual, 28.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " solve_TDS_cyc dim=%lu A", dim);
+ s += f;
+ }
+
+ {
+ unsigned long dim = 2;
+ double diag[] = { 1, 2 };
+ double offdiag[] = { 3, 4 };
+ double rhs[] = { 7, -7 };
+ double actual[] = { -5, 4 };
+
+ f = test_TDS_cyc_solve_one(dim, diag, offdiag, rhs, actual, 28.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " solve_TDS_cyc dim=%lu A", dim);
+ s += f;
+ }
+#endif
+
+ {
+ unsigned long dim = 3;
+ double diag[] = { 1, 1, 1 };
+ double offdiag[] = { 3, 3, 3 };
+ double rhs[] = { 7, -7, 7 };
+ double actual[] = { -2, 5, -2 };
+
+ f = test_TDS_cyc_solve_one(dim, diag, offdiag, rhs, actual, 28.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " solve_TDS_cyc dim=%lu A", dim);
+ s += f;
+ }
+
+ {
+ unsigned long dim = 5;
+ double diag[] = { 4, 2, 1, 2, 4 };
+ double offdiag[] = { 1, 1, 1, 1, 1 };
+ double rhs[] = { 30, -24, 3, 21, -30 };
+ double actual[] = { 12, 3, -42, 42, -21 };
+
+ /* f = test_TDS_cyc_solve_one(dim, diag, offdiag, rhs, actual, 7.0 * GSL_DBL_EPSILON);
+ FIXME: bad accuracy */
+ f = test_TDS_cyc_solve_one(dim, diag, offdiag, rhs, actual, 35.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " solve_TDS_cyc dim=%lu B", dim);
+ s += f;
+ }
+
+ return s;
+}
+
+int
+test_TDN_solve_dim(unsigned long dim, double d, double a, double b, const double * actual, double eps)
+{
+ int s = 0;
+ unsigned long i;
+
+ gsl_vector * abovediag = gsl_vector_alloc(dim-1);
+ gsl_vector * belowdiag = gsl_vector_alloc(dim-1);
+ gsl_vector * diag = gsl_vector_alloc(dim);
+ gsl_vector * rhs = gsl_vector_alloc(dim);
+ gsl_vector * x = gsl_vector_alloc(dim);
+
+ for(i=0; i<dim; i++) {
+ gsl_vector_set(diag, i, d);
+ gsl_vector_set(rhs, i, i + 1.0);
+ }
+ for(i=0; i<dim-1; i++) {
+ gsl_vector_set(abovediag, i, a);
+ gsl_vector_set(belowdiag, i, b);
+ }
+
+ s += gsl_linalg_solve_tridiag(diag, abovediag, belowdiag, rhs, x);
+
+ for(i=0; i<dim; i++) {
+ double si = gsl_vector_get(x, i);
+ double ai = actual[i];
+ int foo = check(si, ai, eps);
+ if(foo) {
+ printf("%3lu[%lu]: %22.18g %22.18g\n", dim, i, gsl_vector_get(x, i), actual[i]);
+ }
+ s += foo;
+ }
+
+ gsl_vector_free(x);
+ gsl_vector_free(rhs);
+ gsl_vector_free(diag);
+ gsl_vector_free(abovediag);
+ gsl_vector_free(belowdiag);
+
+ return s;
+}
+
+
+int test_TDN_solve(void)
+{
+ int f;
+ int s = 0;
+ double actual[16];
+
+ actual[0] = -7.0/3.0;
+ actual[1] = 5.0/3.0;
+ actual[2] = 4.0/3.0;
+ f = test_TDN_solve_dim(3, 1.0, 2.0, 1.0, actual, 2.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " solve_TDN dim=2 A");
+ s += f;
+
+ actual[0] = 0.75;
+ actual[1] = 0.75;
+ actual[2] = 2.625;
+ f = test_TDN_solve_dim(3, 1.0, 1.0/3.0, 1.0/2.0, actual, 2.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " solve_TDN dim=2 B");
+ s += f;
+
+ actual[0] = 99.0/140.0;
+ actual[1] = 41.0/35.0;
+ actual[2] = 19.0/10.0;
+ actual[3] = 72.0/35.0;
+ actual[4] = 139.0/35.0;
+ f = test_TDN_solve_dim(5, 1.0, 1.0/4.0, 1.0/2.0, actual, 35.0/8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " solve_TDN dim=5");
+ s += f;
+
+ return s;
+}
+
+int
+test_TDN_cyc_solve_dim(unsigned long dim, double d, double a, double b, const double * actual, double eps)
+{
+ int s = 0;
+ unsigned long i;
+
+ gsl_vector * abovediag = gsl_vector_alloc(dim);
+ gsl_vector * belowdiag = gsl_vector_alloc(dim);
+ gsl_vector * diag = gsl_vector_alloc(dim);
+ gsl_vector * rhs = gsl_vector_alloc(dim);
+ gsl_vector * x = gsl_vector_alloc(dim);
+
+ for(i=0; i<dim; i++) {
+ gsl_vector_set(diag, i, d);
+ gsl_vector_set(rhs, i, i + 1.0);
+ }
+ for(i=0; i<dim; i++) {
+ gsl_vector_set(abovediag, i, a);
+ gsl_vector_set(belowdiag, i, b);
+ }
+
+ s += gsl_linalg_solve_cyc_tridiag(diag, abovediag, belowdiag, rhs, x);
+
+ for(i=0; i<dim; i++) {
+ double si = gsl_vector_get(x, i);
+ double ai = actual[i];
+ int foo = check(si, ai, eps);
+ if(foo) {
+ printf("%3lu[%lu]: %22.18g %22.18g\n", dim, i, gsl_vector_get(x, i), actual[i]);
+ }
+ s += foo;
+ }
+
+ gsl_vector_free(x);
+ gsl_vector_free(rhs);
+ gsl_vector_free(diag);
+ gsl_vector_free(abovediag);
+ gsl_vector_free(belowdiag);
+
+ return s;
+}
+
+
+int test_TDN_cyc_solve(void)
+{
+ int f;
+ int s = 0;
+ double actual[16];
+
+ actual[0] = 3.0/2.0;
+ actual[1] = -1.0/2.0;
+ actual[2] = 1.0/2.0;
+ f = test_TDN_cyc_solve_dim(3, 1.0, 2.0, 1.0, actual, 32.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " solve_TDN_cyc dim=2 A");
+ s += f;
+
+ actual[0] = -5.0/22.0;
+ actual[1] = -3.0/22.0;
+ actual[2] = 29.0/22.0;
+ actual[3] = -9.0/22.0;
+ actual[4] = 43.0/22.0;
+ f = test_TDN_cyc_solve_dim(5, 3.0, 2.0, 1.0, actual, 66.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " solve_TDN_cyc dim=5");
+ s += f;
+
+ return s;
+}
+
+int
+test_bidiag_decomp_dim(const gsl_matrix * m, double eps)
+{
+ int s = 0;
+ unsigned long i,j,k,r, M = m->size1, N = m->size2;
+
+ gsl_matrix * A = gsl_matrix_alloc(M,N);
+ gsl_matrix * a = gsl_matrix_alloc(M,N);
+ gsl_matrix * b = gsl_matrix_alloc(N,N);
+
+ gsl_matrix * u = gsl_matrix_alloc(M,N);
+ gsl_matrix * v = gsl_matrix_alloc(N,N);
+
+ gsl_vector * tau1 = gsl_vector_alloc(N);
+ gsl_vector * tau2 = gsl_vector_alloc(N-1);
+ gsl_vector * d = gsl_vector_alloc(N);
+ gsl_vector * sd = gsl_vector_alloc(N-1);
+
+ gsl_matrix_memcpy(A,m);
+
+ s += gsl_linalg_bidiag_decomp(A, tau1, tau2);
+ s += gsl_linalg_bidiag_unpack(A, tau1, u, tau2, v, d, sd);
+
+ gsl_matrix_set_zero(b);
+ for (i = 0; i < N; i++) gsl_matrix_set(b, i,i, gsl_vector_get(d,i));
+ for (i = 0; i < N-1; i++) gsl_matrix_set(b, i,i+1, gsl_vector_get(sd,i));
+
+ /* Compute A = U B V^T */
+
+ for (i = 0; i < M ; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ double sum = 0;
+
+ for (k = 0; k < N; k++)
+ {
+ for (r = 0; r < N; r++)
+ {
+ sum += gsl_matrix_get(u, i, k) * gsl_matrix_get (b, k, r)
+ * gsl_matrix_get(v, j, r);
+ }
+ }
+ gsl_matrix_set (a, i, j, sum);
+ }
+ }
+
+ for(i=0; i<M; i++) {
+ for(j=0; j<N; j++) {
+ double aij = gsl_matrix_get(a, i, j);
+ double mij = gsl_matrix_get(m, i, j);
+ int foo = check(aij, mij, eps);
+ if(foo) {
+ printf("(%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", M, N, i,j, aij, mij);
+ }
+ s += foo;
+ }
+ }
+
+ gsl_matrix_free(A);
+ gsl_matrix_free(a);
+ gsl_matrix_free(u);
+ gsl_matrix_free(v);
+ gsl_matrix_free(b);
+ gsl_vector_free(tau1);
+ gsl_vector_free(tau2);
+ gsl_vector_free(d);
+ gsl_vector_free(sd);
+
+ return s;
+}
+
+int test_bidiag_decomp(void)
+{
+ int f;
+ int s = 0;
+
+ f = test_bidiag_decomp_dim(m53, 2 * 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " bidiag_decomp m(5,3)");
+ s += f;
+
+ f = test_bidiag_decomp_dim(m97, 2 * 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " bidiag_decomp m(9,7)");
+ s += f;
+
+ f = test_bidiag_decomp_dim(hilb2, 2 * 8.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " bidiag_decomp hilbert(2)");
+ s += f;
+
+ f = test_bidiag_decomp_dim(hilb3, 2 * 64.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " bidiag_decomp hilbert(3)");
+ s += f;
+
+ f = test_bidiag_decomp_dim(hilb4, 2 * 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " bidiag_decomp hilbert(4)");
+ s += f;
+
+ f = test_bidiag_decomp_dim(hilb12, 2 * 1024.0 * GSL_DBL_EPSILON);
+ gsl_test(f, " bidiag_decomp hilbert(12)");
+ s += f;
+
+ return s;
+}
+
+void
+my_error_handler (const char *reason, const char *file, int line, int err)
+{
+ if (0) printf ("(caught [%s:%d: %s (%d)])\n", file, line, reason, err) ;
+}
+
+int main(void)
+{
+ gsl_ieee_env_setup ();
+ gsl_set_error_handler (&my_error_handler);
+
+ m11 = create_general_matrix(1,1);
+ m51 = create_general_matrix(5,1);
+
+ m35 = create_general_matrix(3,5);
+ m53 = create_general_matrix(5,3);
+ m97 = create_general_matrix(9,7);
+
+ s35 = create_singular_matrix(3,5);
+ s53 = create_singular_matrix(5,3);
+
+ hilb2 = create_hilbert_matrix(2);
+ hilb3 = create_hilbert_matrix(3);
+ hilb4 = create_hilbert_matrix(4);
+ hilb12 = create_hilbert_matrix(12);
+
+ vander2 = create_vandermonde_matrix(2);
+ vander3 = create_vandermonde_matrix(3);
+ vander4 = create_vandermonde_matrix(4);
+ vander12 = create_vandermonde_matrix(12);
+
+ moler10 = create_moler_matrix(10);
+
+ c7 = create_complex_matrix(7);
+
+ row3 = create_row_matrix(3,3);
+ row5 = create_row_matrix(5,5);
+ row12 = create_row_matrix(12,12);
+
+ A22 = create_2x2_matrix (0.0, 0.0, 0.0, 0.0);
+ A33 = gsl_matrix_alloc(3,3);
+ A44 = gsl_matrix_alloc(4,4);
+ A55 = gsl_matrix_alloc(5,5);
+
+ inf5 = create_diagonal_matrix (inf5_data, 5);
+ gsl_matrix_set(inf5, 3, 3, GSL_POSINF);
+
+ nan5 = create_diagonal_matrix (inf5_data, 5);
+ gsl_matrix_set(nan5, 3, 3, GSL_NAN);
+
+
+ /* Matmult now obsolete */
+#ifdef MATMULT
+ gsl_test(test_matmult(), "Matrix Multiply");
+ gsl_test(test_matmult_mod(), "Matrix Multiply with Modification");
+#endif
+ gsl_test(test_bidiag_decomp(), "Bidiagonal Decomposition");
+ gsl_test(test_LU_solve(), "LU Decomposition and Solve");
+ gsl_test(test_LUc_solve(), "Complex LU Decomposition and Solve");
+ gsl_test(test_QR_decomp(), "QR Decomposition");
+ gsl_test(test_QR_solve(), "QR Solve");
+ gsl_test(test_LQ_solve(), "LQ Solve");
+ gsl_test(test_PTLQ_solve(), "PTLQ Solve");
+
+ gsl_test(test_LQ_decomp(), "LQ Decomposition");
+ gsl_test(test_LQ_LQsolve(), "LQ LQ Solve");
+ gsl_test(test_LQ_lssolve(), "LQ LS Solve");
+ gsl_test(test_LQ_update(), "LQ Rank-1 Update");
+ gsl_test(test_QRPT_decomp(), "PTLQ Decomposition");
+ gsl_test(test_PTLQ_solve(), "PTLQ Solve");
+
+ gsl_test(test_QR_QRsolve(), "QR QR Solve");
+ gsl_test(test_QR_lssolve(), "QR LS Solve");
+ gsl_test(test_QR_update(), "QR Rank-1 Update");
+ gsl_test(test_QRPT_decomp(), "QRPT Decomposition");
+ gsl_test(test_QRPT_solve(), "QRPT Solve");
+ gsl_test(test_QRPT_QRsolve(), "QRPT QR Solve");
+ gsl_test(test_SV_decomp(), "Singular Value Decomposition");
+ gsl_test(test_SV_decomp_jacobi(), "Singular Value Decomposition (Jacobi)");
+ gsl_test(test_SV_decomp_mod(), "Singular Value Decomposition (Mod)");
+ gsl_test(test_SV_solve(), "SVD Solve");
+ gsl_test(test_cholesky_decomp(), "Cholesky Decomposition");
+ gsl_test(test_cholesky_decomp_unit(), "Cholesky Decomposition [unit triangular]");
+ gsl_test(test_cholesky_solve(), "Cholesky Solve");
+ gsl_test(test_HH_solve(), "Householder solve");
+ gsl_test(test_TDS_solve(), "Tridiagonal symmetric solve");
+ gsl_test(test_TDS_cyc_solve(), "Tridiagonal symmetric cyclic solve");
+ gsl_test(test_TDN_solve(), "Tridiagonal nonsymmetric solve");
+ gsl_test(test_TDN_cyc_solve(), "Tridiagonal nonsymmetric cyclic solve");
+
+ gsl_matrix_free(m11);
+ gsl_matrix_free(m35);
+ gsl_matrix_free(m51);
+ gsl_matrix_free(m53);
+ gsl_matrix_free(m97);
+ gsl_matrix_free(s35);
+ gsl_matrix_free(s53);
+
+ gsl_matrix_free(hilb2);
+ gsl_matrix_free(hilb3);
+ gsl_matrix_free(hilb4);
+ gsl_matrix_free(hilb12);
+
+ gsl_matrix_free(vander2);
+ gsl_matrix_free(vander3);
+ gsl_matrix_free(vander4);
+ gsl_matrix_free(vander12);
+
+ gsl_matrix_free(moler10);
+
+ gsl_matrix_complex_free(c7);
+ gsl_matrix_free(row3);
+ gsl_matrix_free(row5);
+ gsl_matrix_free(row12);
+
+ gsl_matrix_free(A22);
+ gsl_matrix_free(A33);
+ gsl_matrix_free(A44);
+ gsl_matrix_free(A55);
+
+ gsl_matrix_free (inf5);
+ gsl_matrix_free (nan5);
+
+ exit (gsl_test_summary());
+}
diff --git a/gsl-1.9/linalg/tridiag.c b/gsl-1.9/linalg/tridiag.c
new file mode 100644
index 0000000..485fdcb
--- /dev/null
+++ b/gsl-1.9/linalg/tridiag.c
@@ -0,0 +1,558 @@
+/* linalg/tridiag.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2002, 2004 Gerard Jungman,
+ * Brian Gough, David Necas
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <stdlib.h>
+#include <math.h>
+#include <gsl/gsl_errno.h>
+#include "tridiag.h"
+#include <gsl/gsl_linalg.h>
+
+/* for description of method see [Engeln-Mullges + Uhlig, p. 92]
+ *
+ * diag[0] offdiag[0] 0 .....
+ * offdiag[0] diag[1] offdiag[1] .....
+ * 0 offdiag[1] diag[2]
+ * 0 0 offdiag[2] .....
+ */
+static
+int
+solve_tridiag(
+ const double diag[], size_t d_stride,
+ const double offdiag[], size_t o_stride,
+ const double b[], size_t b_stride,
+ double x[], size_t x_stride,
+ size_t N)
+{
+ int status;
+ double *gamma = (double *) malloc (N * sizeof (double));
+ double *alpha = (double *) malloc (N * sizeof (double));
+ double *c = (double *) malloc (N * sizeof (double));
+ double *z = (double *) malloc (N * sizeof (double));
+
+ if (gamma == 0 || alpha == 0 || c == 0 || z == 0)
+ {
+ status = GSL_ENOMEM;
+ }
+ else
+ {
+ size_t i, j;
+
+ /* Cholesky decomposition
+ A = L.D.L^t
+ lower_diag(L) = gamma
+ diag(D) = alpha
+ */
+ alpha[0] = diag[0];
+ gamma[0] = offdiag[0] / alpha[0];
+
+ for (i = 1; i < N - 1; i++)
+ {
+ alpha[i] = diag[d_stride * i] - offdiag[o_stride*(i - 1)] * gamma[i - 1];
+ gamma[i] = offdiag[o_stride * i] / alpha[i];
+ }
+
+ if (N > 1)
+ {
+ alpha[N - 1] = diag[d_stride * (N - 1)] - offdiag[o_stride*(N - 2)] * gamma[N - 2];
+ }
+
+ /* update RHS */
+ z[0] = b[0];
+ for (i = 1; i < N; i++)
+ {
+ z[i] = b[b_stride * i] - gamma[i - 1] * z[i - 1];
+ }
+ for (i = 0; i < N; i++)
+ {
+ c[i] = z[i] / alpha[i];
+ }
+
+ /* backsubstitution */
+ x[x_stride * (N - 1)] = c[N - 1];
+ if (N >= 2)
+ {
+ for (i = N - 2, j = 0; j <= N - 2; j++, i--)
+ {
+ x[x_stride * i] = c[i] - gamma[i] * x[x_stride * (i + 1)];
+ }
+ }
+
+ status = GSL_SUCCESS;
+ }
+
+ if (z != 0)
+ free (z);
+ if (c != 0)
+ free (c);
+ if (alpha != 0)
+ free (alpha);
+ if (gamma != 0)
+ free (gamma);
+
+ return status;
+}
+
+/* plain gauss elimination, only not bothering with the zeroes
+ *
+ * diag[0] abovediag[0] 0 .....
+ * belowdiag[0] diag[1] abovediag[1] .....
+ * 0 belowdiag[1] diag[2]
+ * 0 0 belowdiag[2] .....
+ */
+static
+int
+solve_tridiag_nonsym(
+ const double diag[], size_t d_stride,
+ const double abovediag[], size_t a_stride,
+ const double belowdiag[], size_t b_stride,
+ const double rhs[], size_t r_stride,
+ double x[], size_t x_stride,
+ size_t N)
+{
+ int status;
+ double *alpha = (double *) malloc (N * sizeof (double));
+ double *z = (double *) malloc (N * sizeof (double));
+
+ if (alpha == 0 || z == 0)
+ {
+ status = GSL_ENOMEM;
+ }
+ else
+ {
+ size_t i, j;
+
+ /* Bidiagonalization (eliminating belowdiag)
+ & rhs update
+ diag' = alpha
+ rhs' = z
+ */
+ alpha[0] = diag[0];
+ z[0] = rhs[0];
+
+ for (i = 1; i < N; i++)
+ {
+ const double t = belowdiag[b_stride*(i - 1)]/alpha[i-1];
+ alpha[i] = diag[d_stride*i] - t*abovediag[a_stride*(i - 1)];
+ z[i] = rhs[r_stride*i] - t*z[i-1];
+ /* FIXME!!! */
+ if (alpha[i] == 0) {
+ status = GSL_EZERODIV;
+ goto solve_tridiag_nonsym_END;
+ }
+ }
+
+ /* backsubstitution */
+ x[x_stride * (N - 1)] = z[N - 1]/alpha[N - 1];
+ if (N >= 2)
+ {
+ for (i = N - 2, j = 0; j <= N - 2; j++, i--)
+ {
+ x[x_stride * i] = (z[i] - abovediag[a_stride*i] * x[x_stride * (i + 1)])/alpha[i];
+ }
+ }
+
+ status = GSL_SUCCESS;
+ }
+
+solve_tridiag_nonsym_END:
+ if (z != 0)
+ free (z);
+ if (alpha != 0)
+ free (alpha);
+
+ return status;
+}
+
+/* for description of method see [Engeln-Mullges + Uhlig, p. 96]
+ *
+ * diag[0] offdiag[0] 0 ..... offdiag[N-1]
+ * offdiag[0] diag[1] offdiag[1] .....
+ * 0 offdiag[1] diag[2]
+ * 0 0 offdiag[2] .....
+ * ... ...
+ * offdiag[N-1] ...
+ *
+ */
+static
+int
+solve_cyc_tridiag(
+ const double diag[], size_t d_stride,
+ const double offdiag[], size_t o_stride,
+ const double b[], size_t b_stride,
+ double x[], size_t x_stride,
+ size_t N)
+{
+ int status;
+ double * delta = (double *) malloc (N * sizeof (double));
+ double * gamma = (double *) malloc (N * sizeof (double));
+ double * alpha = (double *) malloc (N * sizeof (double));
+ double * c = (double *) malloc (N * sizeof (double));
+ double * z = (double *) malloc (N * sizeof (double));
+
+ if (delta == 0 || gamma == 0 || alpha == 0 || c == 0 || z == 0)
+ {
+ status = GSL_ENOMEM;
+ }
+ else
+ {
+ size_t i, j;
+ double sum = 0.0;
+
+ /* factor */
+
+ if (N == 1)
+ {
+ x[0] = b[0] / diag[0];
+ return GSL_SUCCESS;
+ }
+
+ alpha[0] = diag[0];
+ gamma[0] = offdiag[0] / alpha[0];
+ delta[0] = offdiag[o_stride * (N-1)] / alpha[0];
+
+ for (i = 1; i < N - 2; i++)
+ {
+ alpha[i] = diag[d_stride * i] - offdiag[o_stride * (i-1)] * gamma[i - 1];
+ gamma[i] = offdiag[o_stride * i] / alpha[i];
+ delta[i] = -delta[i - 1] * offdiag[o_stride * (i-1)] / alpha[i];
+ }
+
+ for (i = 0; i < N - 2; i++)
+ {
+ sum += alpha[i] * delta[i] * delta[i];
+ }
+
+ alpha[N - 2] = diag[d_stride * (N - 2)] - offdiag[o_stride * (N - 3)] * gamma[N - 3];
+
+ gamma[N - 2] = (offdiag[o_stride * (N - 2)] - offdiag[o_stride * (N - 3)] * delta[N - 3]) / alpha[N - 2];
+
+ alpha[N - 1] = diag[d_stride * (N - 1)] - sum - alpha[(N - 2)] * gamma[N - 2] * gamma[N - 2];
+
+ /* update */
+ z[0] = b[0];
+ for (i = 1; i < N - 1; i++)
+ {
+ z[i] = b[b_stride * i] - z[i - 1] * gamma[i - 1];
+ }
+ sum = 0.0;
+ for (i = 0; i < N - 2; i++)
+ {
+ sum += delta[i] * z[i];
+ }
+ z[N - 1] = b[b_stride * (N - 1)] - sum - gamma[N - 2] * z[N - 2];
+ for (i = 0; i < N; i++)
+ {
+ c[i] = z[i] / alpha[i];
+ }
+
+ /* backsubstitution */
+ x[x_stride * (N - 1)] = c[N - 1];
+ x[x_stride * (N - 2)] = c[N - 2] - gamma[N - 2] * x[x_stride * (N - 1)];
+ if (N >= 3)
+ {
+ for (i = N - 3, j = 0; j <= N - 3; j++, i--)
+ {
+ x[x_stride * i] = c[i] - gamma[i] * x[x_stride * (i + 1)] - delta[i] * x[x_stride * (N - 1)];
+ }
+ }
+
+ status = GSL_SUCCESS;
+ }
+
+ if (z != 0)
+ free (z);
+ if (c != 0)
+ free (c);
+ if (alpha != 0)
+ free (alpha);
+ if (gamma != 0)
+ free (gamma);
+ if (delta != 0)
+ free (delta);
+
+ return status;
+}
+
+/* solve following system w/o the corner elements and then use
+ * Sherman-Morrison formula to compensate for them
+ *
+ * diag[0] abovediag[0] 0 ..... belowdiag[N-1]
+ * belowdiag[0] diag[1] abovediag[1] .....
+ * 0 belowdiag[1] diag[2]
+ * 0 0 belowdiag[2] .....
+ * ... ...
+ * abovediag[N-1] ...
+ */
+static
+int solve_cyc_tridiag_nonsym(
+ const double diag[], size_t d_stride,
+ const double abovediag[], size_t a_stride,
+ const double belowdiag[], size_t b_stride,
+ const double rhs[], size_t r_stride,
+ double x[], size_t x_stride,
+ size_t N)
+{
+ int status;
+ double *alpha = (double *) malloc (N * sizeof (double));
+ double *zb = (double *) malloc (N * sizeof (double));
+ double *zu = (double *) malloc (N * sizeof (double));
+ double *w = (double *) malloc (N * sizeof (double));
+ double beta;
+
+ if (alpha == 0 || zb == 0 || zu == 0 || w == 0)
+ {
+ status = GSL_ENOMEM;
+ }
+ else
+ {
+ /* Bidiagonalization (eliminating belowdiag)
+ & rhs update
+ diag' = alpha
+ rhs' = zb
+ rhs' for Aq=u is zu
+ */
+ zb[0] = rhs[0];
+ if (diag[0] != 0) beta = -diag[0]; else beta = 1;
+ {
+ const double q = 1 - abovediag[0]*belowdiag[0]/(diag[0]*diag[d_stride]);
+ if (fabs(q/beta) > 0.5 && fabs(q/beta) < 2) {
+ beta *= (fabs(q/beta) < 1) ? 0.5 : 2;
+ }
+ }
+ zu[0] = beta;
+ alpha[0] = diag[0] - beta;
+
+
+ {
+ size_t i;
+ for (i = 1; i+1 < N; i++)
+ {
+ const double t = belowdiag[b_stride*(i - 1)]/alpha[i-1];
+ alpha[i] = diag[d_stride*i] - t*abovediag[a_stride*(i - 1)];
+ zb[i] = rhs[r_stride*i] - t*zb[i-1];
+ zu[i] = -t*zu[i-1];
+ /* FIXME!!! */
+ if (alpha[i] == 0) {
+ status = GSL_EZERODIV;
+ goto solve_cyc_tridiag_nonsym_END;
+ }
+ }
+ }
+
+ {
+ const size_t i = N-1;
+ const double t = belowdiag[b_stride*(i - 1)]/alpha[i-1];
+ alpha[i] = diag[d_stride*i]
+ - abovediag[a_stride*i]*belowdiag[b_stride*i]/beta
+ - t*abovediag[a_stride*(i - 1)];
+ zb[i] = rhs[r_stride*i] - t*zb[i-1];
+ zu[i] = abovediag[a_stride*i] - t*zu[i-1];
+ /* FIXME!!! */
+ if (alpha[i] == 0) {
+ status = GSL_EZERODIV;
+ goto solve_cyc_tridiag_nonsym_END;
+ }
+ }
+
+
+ /* backsubstitution */
+ {
+ size_t i, j;
+ w[N-1] = zu[N-1]/alpha[N-1];
+ x[N-1] = zb[N-1]/alpha[N-1];
+ for (i = N - 2, j = 0; j <= N - 2; j++, i--)
+ {
+ w[i] = (zu[i] - abovediag[a_stride*i] * w[i+1])/alpha[i];
+ x[i*x_stride] = (zb[i] - abovediag[a_stride*i] * x[x_stride*(i + 1)])/alpha[i];
+ }
+ }
+
+ /* Sherman-Morrison */
+ {
+ const double vw = w[0] + belowdiag[b_stride*(N - 1)]/beta * w[N-1];
+ const double vx = x[0] + belowdiag[b_stride*(N - 1)]/beta * x[x_stride*(N - 1)];
+ /* FIXME!!! */
+ if (vw + 1 == 0) {
+ status = GSL_EZERODIV;
+ goto solve_cyc_tridiag_nonsym_END;
+ }
+
+ {
+ size_t i;
+ for (i = 0; i < N; i++)
+ x[i] -= vx/(1 + vw)*w[i];
+ }
+ }
+
+ status = GSL_SUCCESS;
+ }
+
+solve_cyc_tridiag_nonsym_END:
+ if (zb != 0)
+ free (zb);
+ if (zu != 0)
+ free (zu);
+ if (w != 0)
+ free (w);
+ if (alpha != 0)
+ free (alpha);
+
+ return status;
+}
+
+int
+gsl_linalg_solve_symm_tridiag(
+ const gsl_vector * diag,
+ const gsl_vector * offdiag,
+ const gsl_vector * rhs,
+ gsl_vector * solution)
+{
+ if(diag->size != rhs->size)
+ {
+ GSL_ERROR ("size of diag must match rhs", GSL_EBADLEN);
+ }
+ else if (offdiag->size != rhs->size-1)
+ {
+ GSL_ERROR ("size of offdiag must match rhs-1", GSL_EBADLEN);
+ }
+ else if (solution->size != rhs->size)
+ {
+ GSL_ERROR ("size of solution must match rhs", GSL_EBADLEN);
+ }
+ else
+ {
+ return solve_tridiag(diag->data, diag->stride,
+ offdiag->data, offdiag->stride,
+ rhs->data, rhs->stride,
+ solution->data, solution->stride,
+ diag->size);
+ }
+}
+
+int
+gsl_linalg_solve_tridiag(
+ const gsl_vector * diag,
+ const gsl_vector * abovediag,
+ const gsl_vector * belowdiag,
+ const gsl_vector * rhs,
+ gsl_vector * solution)
+{
+ if(diag->size != rhs->size)
+ {
+ GSL_ERROR ("size of diag must match rhs", GSL_EBADLEN);
+ }
+ else if (abovediag->size != rhs->size-1)
+ {
+ GSL_ERROR ("size of abovediag must match rhs-1", GSL_EBADLEN);
+ }
+ else if (belowdiag->size != rhs->size-1)
+ {
+ GSL_ERROR ("size of belowdiag must match rhs-1", GSL_EBADLEN);
+ }
+ else if (solution->size != rhs->size)
+ {
+ GSL_ERROR ("size of solution must match rhs", GSL_EBADLEN);
+ }
+ else
+ {
+ return solve_tridiag_nonsym(diag->data, diag->stride,
+ abovediag->data, abovediag->stride,
+ belowdiag->data, belowdiag->stride,
+ rhs->data, rhs->stride,
+ solution->data, solution->stride,
+ diag->size);
+ }
+}
+
+
+int
+gsl_linalg_solve_symm_cyc_tridiag(
+ const gsl_vector * diag,
+ const gsl_vector * offdiag,
+ const gsl_vector * rhs,
+ gsl_vector * solution)
+{
+ if(diag->size != rhs->size)
+ {
+ GSL_ERROR ("size of diag must match rhs", GSL_EBADLEN);
+ }
+ else if (offdiag->size != rhs->size)
+ {
+ GSL_ERROR ("size of offdiag must match rhs", GSL_EBADLEN);
+ }
+ else if (solution->size != rhs->size)
+ {
+ GSL_ERROR ("size of solution must match rhs", GSL_EBADLEN);
+ }
+ else if (diag->size < 3)
+ {
+ GSL_ERROR ("size of cyclic system must be 3 or more", GSL_EBADLEN);
+ }
+ else
+ {
+ return solve_cyc_tridiag(diag->data, diag->stride,
+ offdiag->data, offdiag->stride,
+ rhs->data, rhs->stride,
+ solution->data, solution->stride,
+ diag->size);
+ }
+}
+
+int
+gsl_linalg_solve_cyc_tridiag(
+ const gsl_vector * diag,
+ const gsl_vector * abovediag,
+ const gsl_vector * belowdiag,
+ const gsl_vector * rhs,
+ gsl_vector * solution)
+{
+ if(diag->size != rhs->size)
+ {
+ GSL_ERROR ("size of diag must match rhs", GSL_EBADLEN);
+ }
+ else if (abovediag->size != rhs->size)
+ {
+ GSL_ERROR ("size of abovediag must match rhs", GSL_EBADLEN);
+ }
+ else if (belowdiag->size != rhs->size)
+ {
+ GSL_ERROR ("size of belowdiag must match rhs", GSL_EBADLEN);
+ }
+ else if (solution->size != rhs->size)
+ {
+ GSL_ERROR ("size of solution must match rhs", GSL_EBADLEN);
+ }
+ else if (diag->size < 3)
+ {
+ GSL_ERROR ("size of cyclic system must be 3 or more", GSL_EBADLEN);
+ }
+ else
+ {
+ return solve_cyc_tridiag_nonsym(diag->data, diag->stride,
+ abovediag->data, abovediag->stride,
+ belowdiag->data, belowdiag->stride,
+ rhs->data, rhs->stride,
+ solution->data, solution->stride,
+ diag->size);
+ }
+}
diff --git a/gsl-1.9/linalg/tridiag.h b/gsl-1.9/linalg/tridiag.h
new file mode 100644
index 0000000..f52f2f2
--- /dev/null
+++ b/gsl-1.9/linalg/tridiag.h
@@ -0,0 +1,67 @@
+/* linalg/tridiag.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2002 Gerard Jungman,
+ * Brian Gough, David Necas
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman
+ */
+/* Low level tridiagonal solvers.
+ * Used internally in other areas of GSL.
+ */
+#ifndef __GSL_TRIDIAG_H__
+#define __GSL_TRIDIAG_H__
+
+#include <stdlib.h>
+
+static
+int solve_tridiag_nonsym(
+ const double diag[], size_t d_stride,
+ const double abovediag[], size_t a_stride,
+ const double belowdiag[], size_t b_stride,
+ const double rhs[], size_t r_stride,
+ double x[], size_t x_stride,
+ size_t N
+ );
+
+static
+int solve_tridiag(
+ const double diag[], size_t d_stride,
+ const double offdiag[], size_t o_stride,
+ const double b[], size_t b_stride,
+ double x[], size_t x_stride,
+ size_t N);
+
+static
+int solve_cyc_tridiag(
+ const double diag[], size_t d_stride,
+ const double offdiag[], size_t o_stride,
+ const double b[], size_t b_stride,
+ double x[], size_t x_stride,
+ size_t N
+ );
+
+static
+int solve_cyc_tridiag_nonsym(
+ const double diag[], size_t d_stride,
+ const double abovediag[], size_t a_stride,
+ const double belowdiag[], size_t b_stride,
+ const double rhs[], size_t r_stride,
+ double x[], size_t x_stride,
+ size_t N);
+
+#endif /* __GSL_TRIDIAG_H__ */
diff --git a/gsl-1.9/ltmain.sh b/gsl-1.9/ltmain.sh
new file mode 100644
index 0000000..06823e0
--- /dev/null
+++ b/gsl-1.9/ltmain.sh
@@ -0,0 +1,6863 @@
+# ltmain.sh - Provide generalized library-building support services.
+# NOTE: Changing this file will not affect anything until you rerun configure.
+#
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+basename="s,^.*/,,g"
+
+# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
+# is ksh but when the shell is invoked as "sh" and the current value of
+# the _XPG environment variable is not equal to 1 (one), the special
+# positional parameter $0, within a function call, is the name of the
+# function.
+progpath="$0"
+
+# The name of this program:
+progname=`echo "$progpath" | $SED $basename`
+modename="$progname"
+
+# Global variables:
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+
+PROGRAM=ltmain.sh
+PACKAGE=libtool
+VERSION=1.5.22
+TIMESTAMP=" (1.1220.2.365 2005/12/18 22:14:06)"
+
+# See if we are running on zsh, and set the options which allow our
+# commands through without removal of \ escapes.
+if test -n "${ZSH_VERSION+set}" ; then
+ setopt NO_GLOB_SUBST
+fi
+
+# Check that we have a working $echo.
+if test "X$1" = X--no-reexec; then
+ # Discard the --no-reexec flag, and continue.
+ shift
+elif test "X$1" = X--fallback-echo; then
+ # Avoid inline document here, it may be left over
+ :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then
+ # Yippee, $echo works!
+ :
+else
+ # Restart under the correct shell, and then maybe $echo will work.
+ exec $SHELL "$progpath" --no-reexec ${1+"$@"}
+fi
+
+if test "X$1" = X--fallback-echo; then
+ # used as fallback echo
+ shift
+ cat <<EOF
+$*
+EOF
+ exit $EXIT_SUCCESS
+fi
+
+default_mode=
+help="Try \`$progname --help' for more information."
+magic="%%%MAGIC variable%%%"
+mkdir="mkdir"
+mv="mv -f"
+rm="rm -f"
+
+# Sed substitution that helps us do robust quoting. It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed="${SED}"' -e 1s/^X//'
+sed_quote_subst='s/\([\\`\\"$\\\\]\)/\\\1/g'
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+ # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+ SP2NL='tr \040 \012'
+ NL2SP='tr \015\012 \040\040'
+ ;;
+ *) # EBCDIC based system
+ SP2NL='tr \100 \n'
+ NL2SP='tr \r\n \100\100'
+ ;;
+esac
+
+# NLS nuisances.
+# Only set LANG and LC_ALL to C if already set.
+# These must not be set unconditionally because not all systems understand
+# e.g. LANG=C (notably SCO).
+# We save the old values to restore during execute mode.
+if test "${LC_ALL+set}" = set; then
+ save_LC_ALL="$LC_ALL"; LC_ALL=C; export LC_ALL
+fi
+if test "${LANG+set}" = set; then
+ save_LANG="$LANG"; LANG=C; export LANG
+fi
+
+# Make sure IFS has a sensible default
+lt_nl='
+'
+IFS=" $lt_nl"
+
+if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
+ $echo "$modename: not configured to build any kind of library" 1>&2
+ $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2
+ exit $EXIT_FAILURE
+fi
+
+# Global variables.
+mode=$default_mode
+nonopt=
+prev=
+prevopt=
+run=
+show="$echo"
+show_help=
+execute_dlfiles=
+duplicate_deps=no
+preserve_args=
+lo2o="s/\\.lo\$/.${objext}/"
+o2lo="s/\\.${objext}\$/.lo/"
+
+#####################################
+# Shell function definitions:
+# This seems to be the best place for them
+
+# func_mktempdir [string]
+# Make a temporary directory that won't clash with other running
+# libtool processes, and avoids race conditions if possible. If
+# given, STRING is the basename for that directory.
+func_mktempdir ()
+{
+ my_template="${TMPDIR-/tmp}/${1-$progname}"
+
+ if test "$run" = ":"; then
+ # Return a directory name, but don't create it in dry-run mode
+ my_tmpdir="${my_template}-$$"
+ else
+
+ # If mktemp works, use that first and foremost
+ my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
+
+ if test ! -d "$my_tmpdir"; then
+ # Failing that, at least try and use $RANDOM to avoid a race
+ my_tmpdir="${my_template}-${RANDOM-0}$$"
+
+ save_mktempdir_umask=`umask`
+ umask 0077
+ $mkdir "$my_tmpdir"
+ umask $save_mktempdir_umask
+ fi
+
+ # If we're not in dry-run mode, bomb out on failure
+ test -d "$my_tmpdir" || {
+ $echo "cannot create temporary directory \`$my_tmpdir'" 1>&2
+ exit $EXIT_FAILURE
+ }
+ fi
+
+ $echo "X$my_tmpdir" | $Xsed
+}
+
+
+# func_win32_libid arg
+# return the library type of file 'arg'
+#
+# Need a lot of goo to handle *both* DLLs and import libs
+# Has to be a shell function in order to 'eat' the argument
+# that is supplied when $file_magic_command is called.
+func_win32_libid ()
+{
+ win32_libid_type="unknown"
+ win32_fileres=`file -L $1 2>/dev/null`
+ case $win32_fileres in
+ *ar\ archive\ import\ library*) # definitely import
+ win32_libid_type="x86 archive import"
+ ;;
+ *ar\ archive*) # could be an import, or static
+ if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \
+ $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then
+ win32_nmres=`eval $NM -f posix -A $1 | \
+ $SED -n -e '1,100{/ I /{s,.*,import,;p;q;};}'`
+ case $win32_nmres in
+ import*) win32_libid_type="x86 archive import";;
+ *) win32_libid_type="x86 archive static";;
+ esac
+ fi
+ ;;
+ *DLL*)
+ win32_libid_type="x86 DLL"
+ ;;
+ *executable*) # but shell scripts are "executable" too...
+ case $win32_fileres in
+ *MS\ Windows\ PE\ Intel*)
+ win32_libid_type="x86 DLL"
+ ;;
+ esac
+ ;;
+ esac
+ $echo $win32_libid_type
+}
+
+
+# func_infer_tag arg
+# Infer tagged configuration to use if any are available and
+# if one wasn't chosen via the "--tag" command line option.
+# Only attempt this if the compiler in the base compile
+# command doesn't match the default compiler.
+# arg is usually of the form 'gcc ...'
+func_infer_tag ()
+{
+ if test -n "$available_tags" && test -z "$tagname"; then
+ CC_quoted=
+ for arg in $CC; do
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ CC_quoted="$CC_quoted $arg"
+ done
+ case $@ in
+ # Blanks in the command may have been stripped by the calling shell,
+ # but not from the CC environment variable when configure was run.
+ " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;;
+ # Blanks at the start of $base_compile will cause this to fail
+ # if we don't check for them as well.
+ *)
+ for z in $available_tags; do
+ if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
+ # Evaluate the configuration.
+ eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
+ CC_quoted=
+ for arg in $CC; do
+ # Double-quote args containing other shell metacharacters.
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ CC_quoted="$CC_quoted $arg"
+ done
+ case "$@ " in
+ " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*)
+ # The compiler in the base compile command matches
+ # the one in the tagged configuration.
+ # Assume this is the tagged configuration we want.
+ tagname=$z
+ break
+ ;;
+ esac
+ fi
+ done
+ # If $tagname still isn't set, then no tagged configuration
+ # was found and let the user know that the "--tag" command
+ # line option must be used.
+ if test -z "$tagname"; then
+ $echo "$modename: unable to infer tagged configuration"
+ $echo "$modename: specify a tag with \`--tag'" 1>&2
+ exit $EXIT_FAILURE
+# else
+# $echo "$modename: using $tagname tagged configuration"
+ fi
+ ;;
+ esac
+ fi
+}
+
+
+# func_extract_an_archive dir oldlib
+func_extract_an_archive ()
+{
+ f_ex_an_ar_dir="$1"; shift
+ f_ex_an_ar_oldlib="$1"
+
+ $show "(cd $f_ex_an_ar_dir && $AR x $f_ex_an_ar_oldlib)"
+ $run eval "(cd \$f_ex_an_ar_dir && $AR x \$f_ex_an_ar_oldlib)" || exit $?
+ if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
+ :
+ else
+ $echo "$modename: ERROR: object name conflicts: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" 1>&2
+ exit $EXIT_FAILURE
+ fi
+}
+
+# func_extract_archives gentop oldlib ...
+func_extract_archives ()
+{
+ my_gentop="$1"; shift
+ my_oldlibs=${1+"$@"}
+ my_oldobjs=""
+ my_xlib=""
+ my_xabs=""
+ my_xdir=""
+ my_status=""
+
+ $show "${rm}r $my_gentop"
+ $run ${rm}r "$my_gentop"
+ $show "$mkdir $my_gentop"
+ $run $mkdir "$my_gentop"
+ my_status=$?
+ if test "$my_status" -ne 0 && test ! -d "$my_gentop"; then
+ exit $my_status
+ fi
+
+ for my_xlib in $my_oldlibs; do
+ # Extract the objects.
+ case $my_xlib in
+ [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
+ *) my_xabs=`pwd`"/$my_xlib" ;;
+ esac
+ my_xlib=`$echo "X$my_xlib" | $Xsed -e 's%^.*/%%'`
+ my_xdir="$my_gentop/$my_xlib"
+
+ $show "${rm}r $my_xdir"
+ $run ${rm}r "$my_xdir"
+ $show "$mkdir $my_xdir"
+ $run $mkdir "$my_xdir"
+ exit_status=$?
+ if test "$exit_status" -ne 0 && test ! -d "$my_xdir"; then
+ exit $exit_status
+ fi
+ case $host in
+ *-darwin*)
+ $show "Extracting $my_xabs"
+ # Do not bother doing anything if just a dry run
+ if test -z "$run"; then
+ darwin_orig_dir=`pwd`
+ cd $my_xdir || exit $?
+ darwin_archive=$my_xabs
+ darwin_curdir=`pwd`
+ darwin_base_archive=`$echo "X$darwin_archive" | $Xsed -e 's%^.*/%%'`
+ darwin_arches=`lipo -info "$darwin_archive" 2>/dev/null | $EGREP Architectures 2>/dev/null`
+ if test -n "$darwin_arches"; then
+ darwin_arches=`echo "$darwin_arches" | $SED -e 's/.*are://'`
+ darwin_arch=
+ $show "$darwin_base_archive has multiple architectures $darwin_arches"
+ for darwin_arch in $darwin_arches ; do
+ mkdir -p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+ lipo -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
+ cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+ func_extract_an_archive "`pwd`" "${darwin_base_archive}"
+ cd "$darwin_curdir"
+ $rm "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
+ done # $darwin_arches
+ ## Okay now we have a bunch of thin objects, gotta fatten them up :)
+ darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print| xargs basename | sort -u | $NL2SP`
+ darwin_file=
+ darwin_files=
+ for darwin_file in $darwin_filelist; do
+ darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP`
+ lipo -create -output "$darwin_file" $darwin_files
+ done # $darwin_filelist
+ ${rm}r unfat-$$
+ cd "$darwin_orig_dir"
+ else
+ cd "$darwin_orig_dir"
+ func_extract_an_archive "$my_xdir" "$my_xabs"
+ fi # $darwin_arches
+ fi # $run
+ ;;
+ *)
+ func_extract_an_archive "$my_xdir" "$my_xabs"
+ ;;
+ esac
+ my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP`
+ done
+ func_extract_archives_result="$my_oldobjs"
+}
+# End of Shell function definitions
+#####################################
+
+# Darwin sucks
+eval std_shrext=\"$shrext_cmds\"
+
+disable_libs=no
+
+# Parse our command line options once, thoroughly.
+while test "$#" -gt 0
+do
+ arg="$1"
+ shift
+
+ case $arg in
+ -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) optarg= ;;
+ esac
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$prev"; then
+ case $prev in
+ execute_dlfiles)
+ execute_dlfiles="$execute_dlfiles $arg"
+ ;;
+ tag)
+ tagname="$arg"
+ preserve_args="${preserve_args}=$arg"
+
+ # Check whether tagname contains only valid characters
+ case $tagname in
+ *[!-_A-Za-z0-9,/]*)
+ $echo "$progname: invalid tag name: $tagname" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+
+ case $tagname in
+ CC)
+ # Don't test for the "default" C tag, as we know, it's there, but
+ # not specially marked.
+ ;;
+ *)
+ if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then
+ taglist="$taglist $tagname"
+ # Evaluate the configuration.
+ eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`"
+ else
+ $echo "$progname: ignoring unknown tag $tagname" 1>&2
+ fi
+ ;;
+ esac
+ ;;
+ *)
+ eval "$prev=\$arg"
+ ;;
+ esac
+
+ prev=
+ prevopt=
+ continue
+ fi
+
+ # Have we seen a non-optional argument yet?
+ case $arg in
+ --help)
+ show_help=yes
+ ;;
+
+ --version)
+ $echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP"
+ $echo
+ $echo "Copyright (C) 2005 Free Software Foundation, Inc."
+ $echo "This is free software; see the source for copying conditions. There is NO"
+ $echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+ exit $?
+ ;;
+
+ --config)
+ ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath
+ # Now print the configurations for the tags.
+ for tagname in $taglist; do
+ ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath"
+ done
+ exit $?
+ ;;
+
+ --debug)
+ $echo "$progname: enabling shell trace mode"
+ set -x
+ preserve_args="$preserve_args $arg"
+ ;;
+
+ --dry-run | -n)
+ run=:
+ ;;
+
+ --features)
+ $echo "host: $host"
+ if test "$build_libtool_libs" = yes; then
+ $echo "enable shared libraries"
+ else
+ $echo "disable shared libraries"
+ fi
+ if test "$build_old_libs" = yes; then
+ $echo "enable static libraries"
+ else
+ $echo "disable static libraries"
+ fi
+ exit $?
+ ;;
+
+ --finish) mode="finish" ;;
+
+ --mode) prevopt="--mode" prev=mode ;;
+ --mode=*) mode="$optarg" ;;
+
+ --preserve-dup-deps) duplicate_deps="yes" ;;
+
+ --quiet | --silent)
+ show=:
+ preserve_args="$preserve_args $arg"
+ ;;
+
+ --tag)
+ prevopt="--tag"
+ prev=tag
+ preserve_args="$preserve_args --tag"
+ ;;
+ --tag=*)
+ set tag "$optarg" ${1+"$@"}
+ shift
+ prev=tag
+ preserve_args="$preserve_args --tag"
+ ;;
+
+ -dlopen)
+ prevopt="-dlopen"
+ prev=execute_dlfiles
+ ;;
+
+ -*)
+ $echo "$modename: unrecognized option \`$arg'" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+
+ *)
+ nonopt="$arg"
+ break
+ ;;
+ esac
+done
+
+if test -n "$prevopt"; then
+ $echo "$modename: option \`$prevopt' requires an argument" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+fi
+
+case $disable_libs in
+no)
+ ;;
+shared)
+ build_libtool_libs=no
+ build_old_libs=yes
+ ;;
+static)
+ build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
+ ;;
+esac
+
+# If this variable is set in any of the actions, the command in it
+# will be execed at the end. This prevents here-documents from being
+# left over by shells.
+exec_cmd=
+
+if test -z "$show_help"; then
+
+ # Infer the operation mode.
+ if test -z "$mode"; then
+ $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2
+ $echo "*** Future versions of Libtool will require --mode=MODE be specified." 1>&2
+ case $nonopt in
+ *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*)
+ mode=link
+ for arg
+ do
+ case $arg in
+ -c)
+ mode=compile
+ break
+ ;;
+ esac
+ done
+ ;;
+ *db | *dbx | *strace | *truss)
+ mode=execute
+ ;;
+ *install*|cp|mv)
+ mode=install
+ ;;
+ *rm)
+ mode=uninstall
+ ;;
+ *)
+ # If we have no mode, but dlfiles were specified, then do execute mode.
+ test -n "$execute_dlfiles" && mode=execute
+
+ # Just use the default operation mode.
+ if test -z "$mode"; then
+ if test -n "$nonopt"; then
+ $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2
+ else
+ $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2
+ fi
+ fi
+ ;;
+ esac
+ fi
+
+ # Only execute mode is allowed to have -dlopen flags.
+ if test -n "$execute_dlfiles" && test "$mode" != execute; then
+ $echo "$modename: unrecognized option \`-dlopen'" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Change the help message to a mode-specific one.
+ generic_help="$help"
+ help="Try \`$modename --help --mode=$mode' for more information."
+
+ # These modes are in order of execution frequency so that they run quickly.
+ case $mode in
+ # libtool compile mode
+ compile)
+ modename="$modename: compile"
+ # Get the compilation command and the source file.
+ base_compile=
+ srcfile="$nonopt" # always keep a non-empty value in "srcfile"
+ suppress_opt=yes
+ suppress_output=
+ arg_mode=normal
+ libobj=
+ later=
+
+ for arg
+ do
+ case $arg_mode in
+ arg )
+ # do not "continue". Instead, add this to base_compile
+ lastarg="$arg"
+ arg_mode=normal
+ ;;
+
+ target )
+ libobj="$arg"
+ arg_mode=normal
+ continue
+ ;;
+
+ normal )
+ # Accept any command-line options.
+ case $arg in
+ -o)
+ if test -n "$libobj" ; then
+ $echo "$modename: you cannot specify \`-o' more than once" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ arg_mode=target
+ continue
+ ;;
+
+ -static | -prefer-pic | -prefer-non-pic)
+ later="$later $arg"
+ continue
+ ;;
+
+ -no-suppress)
+ suppress_opt=no
+ continue
+ ;;
+
+ -Xcompiler)
+ arg_mode=arg # the next one goes into the "base_compile" arg list
+ continue # The current "srcfile" will either be retained or
+ ;; # replaced later. I would guess that would be a bug.
+
+ -Wc,*)
+ args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"`
+ lastarg=
+ save_ifs="$IFS"; IFS=','
+ for arg in $args; do
+ IFS="$save_ifs"
+
+ # Double-quote args containing other shell metacharacters.
+ # Many Bourne shells cannot handle close brackets correctly
+ # in scan sets, so we specify it separately.
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ lastarg="$lastarg $arg"
+ done
+ IFS="$save_ifs"
+ lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"`
+
+ # Add the arguments to base_compile.
+ base_compile="$base_compile $lastarg"
+ continue
+ ;;
+
+ * )
+ # Accept the current argument as the source file.
+ # The previous "srcfile" becomes the current argument.
+ #
+ lastarg="$srcfile"
+ srcfile="$arg"
+ ;;
+ esac # case $arg
+ ;;
+ esac # case $arg_mode
+
+ # Aesthetically quote the previous argument.
+ lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"`
+
+ case $lastarg in
+ # Double-quote args containing other shell metacharacters.
+ # Many Bourne shells cannot handle close brackets correctly
+ # in scan sets, and some SunOS ksh mistreat backslash-escaping
+ # in scan sets (worked around with variable expansion),
+ # and furthermore cannot handle '|' '&' '(' ')' in scan sets
+ # at all, so we specify them separately.
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ lastarg="\"$lastarg\""
+ ;;
+ esac
+
+ base_compile="$base_compile $lastarg"
+ done # for arg
+
+ case $arg_mode in
+ arg)
+ $echo "$modename: you must specify an argument for -Xcompile"
+ exit $EXIT_FAILURE
+ ;;
+ target)
+ $echo "$modename: you must specify a target with \`-o'" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ *)
+ # Get the name of the library object.
+ [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'`
+ ;;
+ esac
+
+ # Recognize several different file suffixes.
+ # If the user specifies -o file.o, it is replaced with file.lo
+ xform='[cCFSifmso]'
+ case $libobj in
+ *.ada) xform=ada ;;
+ *.adb) xform=adb ;;
+ *.ads) xform=ads ;;
+ *.asm) xform=asm ;;
+ *.c++) xform=c++ ;;
+ *.cc) xform=cc ;;
+ *.ii) xform=ii ;;
+ *.class) xform=class ;;
+ *.cpp) xform=cpp ;;
+ *.cxx) xform=cxx ;;
+ *.f90) xform=f90 ;;
+ *.for) xform=for ;;
+ *.java) xform=java ;;
+ esac
+
+ libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"`
+
+ case $libobj in
+ *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;;
+ *)
+ $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+
+ func_infer_tag $base_compile
+
+ for arg in $later; do
+ case $arg in
+ -static)
+ build_old_libs=yes
+ continue
+ ;;
+
+ -prefer-pic)
+ pic_mode=yes
+ continue
+ ;;
+
+ -prefer-non-pic)
+ pic_mode=no
+ continue
+ ;;
+ esac
+ done
+
+ qlibobj=`$echo "X$libobj" | $Xsed -e "$sed_quote_subst"`
+ case $qlibobj in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ qlibobj="\"$qlibobj\"" ;;
+ esac
+ test "X$libobj" != "X$qlibobj" \
+ && $echo "X$libobj" | grep '[]~#^*{};<>?"'"'"' &()|`$[]' \
+ && $echo "$modename: libobj name \`$libobj' may not contain shell special characters."
+ objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'`
+ xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$xdir" = "X$obj"; then
+ xdir=
+ else
+ xdir=$xdir/
+ fi
+ lobj=${xdir}$objdir/$objname
+
+ if test -z "$base_compile"; then
+ $echo "$modename: you must specify a compilation command" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Delete any leftover library objects.
+ if test "$build_old_libs" = yes; then
+ removelist="$obj $lobj $libobj ${libobj}T"
+ else
+ removelist="$lobj $libobj ${libobj}T"
+ fi
+
+ $run $rm $removelist
+ trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15
+
+ # On Cygwin there's no "real" PIC flag so we must build both object types
+ case $host_os in
+ cygwin* | mingw* | pw32* | os2*)
+ pic_mode=default
+ ;;
+ esac
+ if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
+ # non-PIC code in shared libraries is not supported
+ pic_mode=default
+ fi
+
+ # Calculate the filename of the output object if compiler does
+ # not support -o with -c
+ if test "$compiler_c_o" = no; then
+ output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext}
+ lockfile="$output_obj.lock"
+ removelist="$removelist $output_obj $lockfile"
+ trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15
+ else
+ output_obj=
+ need_locks=no
+ lockfile=
+ fi
+
+ # Lock this critical section if it is needed
+ # We use this script file to make the link, it avoids creating a new file
+ if test "$need_locks" = yes; then
+ until $run ln "$progpath" "$lockfile" 2>/dev/null; do
+ $show "Waiting for $lockfile to be removed"
+ sleep 2
+ done
+ elif test "$need_locks" = warn; then
+ if test -f "$lockfile"; then
+ $echo "\
+*** ERROR, $lockfile exists and contains:
+`cat $lockfile 2>/dev/null`
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together. If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+ $run $rm $removelist
+ exit $EXIT_FAILURE
+ fi
+ $echo "$srcfile" > "$lockfile"
+ fi
+
+ if test -n "$fix_srcfile_path"; then
+ eval srcfile=\"$fix_srcfile_path\"
+ fi
+ qsrcfile=`$echo "X$srcfile" | $Xsed -e "$sed_quote_subst"`
+ case $qsrcfile in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ qsrcfile="\"$qsrcfile\"" ;;
+ esac
+
+ $run $rm "$libobj" "${libobj}T"
+
+ # Create a libtool object file (analogous to a ".la" file),
+ # but don't create it if we're doing a dry run.
+ test -z "$run" && cat > ${libobj}T <<EOF
+# $libobj - a libtool object file
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+EOF
+
+ # Only build a PIC object if we are building libtool libraries.
+ if test "$build_libtool_libs" = yes; then
+ # Without this assignment, base_compile gets emptied.
+ fbsd_hideous_sh_bug=$base_compile
+
+ if test "$pic_mode" != no; then
+ command="$base_compile $qsrcfile $pic_flag"
+ else
+ # Don't build PIC code
+ command="$base_compile $qsrcfile"
+ fi
+
+ if test ! -d "${xdir}$objdir"; then
+ $show "$mkdir ${xdir}$objdir"
+ $run $mkdir ${xdir}$objdir
+ exit_status=$?
+ if test "$exit_status" -ne 0 && test ! -d "${xdir}$objdir"; then
+ exit $exit_status
+ fi
+ fi
+
+ if test -z "$output_obj"; then
+ # Place PIC objects in $objdir
+ command="$command -o $lobj"
+ fi
+
+ $run $rm "$lobj" "$output_obj"
+
+ $show "$command"
+ if $run eval "$command"; then :
+ else
+ test -n "$output_obj" && $run $rm $removelist
+ exit $EXIT_FAILURE
+ fi
+
+ if test "$need_locks" = warn &&
+ test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+ $echo "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together. If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+ $run $rm $removelist
+ exit $EXIT_FAILURE
+ fi
+
+ # Just move the object if needed, then go on to compile the next one
+ if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
+ $show "$mv $output_obj $lobj"
+ if $run $mv $output_obj $lobj; then :
+ else
+ error=$?
+ $run $rm $removelist
+ exit $error
+ fi
+ fi
+
+ # Append the name of the PIC object to the libtool object file.
+ test -z "$run" && cat >> ${libobj}T <<EOF
+pic_object='$objdir/$objname'
+
+EOF
+
+ # Allow error messages only from the first compilation.
+ if test "$suppress_opt" = yes; then
+ suppress_output=' >/dev/null 2>&1'
+ fi
+ else
+ # No PIC object so indicate it doesn't exist in the libtool
+ # object file.
+ test -z "$run" && cat >> ${libobj}T <<EOF
+pic_object=none
+
+EOF
+ fi
+
+ # Only build a position-dependent object if we build old libraries.
+ if test "$build_old_libs" = yes; then
+ if test "$pic_mode" != yes; then
+ # Don't build PIC code
+ command="$base_compile $qsrcfile"
+ else
+ command="$base_compile $qsrcfile $pic_flag"
+ fi
+ if test "$compiler_c_o" = yes; then
+ command="$command -o $obj"
+ fi
+
+ # Suppress compiler output if we already did a PIC compilation.
+ command="$command$suppress_output"
+ $run $rm "$obj" "$output_obj"
+ $show "$command"
+ if $run eval "$command"; then :
+ else
+ $run $rm $removelist
+ exit $EXIT_FAILURE
+ fi
+
+ if test "$need_locks" = warn &&
+ test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+ $echo "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together. If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+ $run $rm $removelist
+ exit $EXIT_FAILURE
+ fi
+
+ # Just move the object if needed
+ if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
+ $show "$mv $output_obj $obj"
+ if $run $mv $output_obj $obj; then :
+ else
+ error=$?
+ $run $rm $removelist
+ exit $error
+ fi
+ fi
+
+ # Append the name of the non-PIC object the libtool object file.
+ # Only append if the libtool object file exists.
+ test -z "$run" && cat >> ${libobj}T <<EOF
+# Name of the non-PIC object.
+non_pic_object='$objname'
+
+EOF
+ else
+ # Append the name of the non-PIC object the libtool object file.
+ # Only append if the libtool object file exists.
+ test -z "$run" && cat >> ${libobj}T <<EOF
+# Name of the non-PIC object.
+non_pic_object=none
+
+EOF
+ fi
+
+ $run $mv "${libobj}T" "${libobj}"
+
+ # Unlock the critical section if it was locked
+ if test "$need_locks" != no; then
+ $run $rm "$lockfile"
+ fi
+
+ exit $EXIT_SUCCESS
+ ;;
+
+ # libtool link mode
+ link | relink)
+ modename="$modename: link"
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+ # It is impossible to link a dll without this setting, and
+ # we shouldn't force the makefile maintainer to figure out
+ # which system we are compiling for in order to pass an extra
+ # flag for every libtool invocation.
+ # allow_undefined=no
+
+ # FIXME: Unfortunately, there are problems with the above when trying
+ # to make a dll which has undefined symbols, in which case not
+ # even a static library is built. For now, we need to specify
+ # -no-undefined on the libtool link line when we can be certain
+ # that all symbols are satisfied, otherwise we get a static library.
+ allow_undefined=yes
+ ;;
+ *)
+ allow_undefined=yes
+ ;;
+ esac
+ libtool_args="$nonopt"
+ base_compile="$nonopt $@"
+ compile_command="$nonopt"
+ finalize_command="$nonopt"
+
+ compile_rpath=
+ finalize_rpath=
+ compile_shlibpath=
+ finalize_shlibpath=
+ convenience=
+ old_convenience=
+ deplibs=
+ old_deplibs=
+ compiler_flags=
+ linker_flags=
+ dllsearchpath=
+ lib_search_path=`pwd`
+ inst_prefix_dir=
+
+ avoid_version=no
+ dlfiles=
+ dlprefiles=
+ dlself=no
+ export_dynamic=no
+ export_symbols=
+ export_symbols_regex=
+ generated=
+ libobjs=
+ ltlibs=
+ module=no
+ no_install=no
+ objs=
+ non_pic_objects=
+ notinst_path= # paths that contain not-installed libtool libraries
+ precious_files_regex=
+ prefer_static_libs=no
+ preload=no
+ prev=
+ prevarg=
+ release=
+ rpath=
+ xrpath=
+ perm_rpath=
+ temp_rpath=
+ thread_safe=no
+ vinfo=
+ vinfo_number=no
+
+ func_infer_tag $base_compile
+
+ # We need to know -static, to get the right output filenames.
+ for arg
+ do
+ case $arg in
+ -all-static | -static)
+ if test "X$arg" = "X-all-static"; then
+ if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
+ $echo "$modename: warning: complete static linking is impossible in this configuration" 1>&2
+ fi
+ if test -n "$link_static_flag"; then
+ dlopen_self=$dlopen_self_static
+ fi
+ prefer_static_libs=yes
+ else
+ if test -z "$pic_flag" && test -n "$link_static_flag"; then
+ dlopen_self=$dlopen_self_static
+ fi
+ prefer_static_libs=built
+ fi
+ build_libtool_libs=no
+ build_old_libs=yes
+ break
+ ;;
+ esac
+ done
+
+ # See if our shared archives depend on static archives.
+ test -n "$old_archive_from_new_cmds" && build_old_libs=yes
+
+ # Go through the arguments, transforming them on the way.
+ while test "$#" -gt 0; do
+ arg="$1"
+ shift
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test
+ ;;
+ *) qarg=$arg ;;
+ esac
+ libtool_args="$libtool_args $qarg"
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$prev"; then
+ case $prev in
+ output)
+ compile_command="$compile_command @OUTPUT@"
+ finalize_command="$finalize_command @OUTPUT@"
+ ;;
+ esac
+
+ case $prev in
+ dlfiles|dlprefiles)
+ if test "$preload" = no; then
+ # Add the symbol object into the linking commands.
+ compile_command="$compile_command @SYMFILE@"
+ finalize_command="$finalize_command @SYMFILE@"
+ preload=yes
+ fi
+ case $arg in
+ *.la | *.lo) ;; # We handle these cases below.
+ force)
+ if test "$dlself" = no; then
+ dlself=needless
+ export_dynamic=yes
+ fi
+ prev=
+ continue
+ ;;
+ self)
+ if test "$prev" = dlprefiles; then
+ dlself=yes
+ elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
+ dlself=yes
+ else
+ dlself=needless
+ export_dynamic=yes
+ fi
+ prev=
+ continue
+ ;;
+ *)
+ if test "$prev" = dlfiles; then
+ dlfiles="$dlfiles $arg"
+ else
+ dlprefiles="$dlprefiles $arg"
+ fi
+ prev=
+ continue
+ ;;
+ esac
+ ;;
+ expsyms)
+ export_symbols="$arg"
+ if test ! -f "$arg"; then
+ $echo "$modename: symbol file \`$arg' does not exist"
+ exit $EXIT_FAILURE
+ fi
+ prev=
+ continue
+ ;;
+ expsyms_regex)
+ export_symbols_regex="$arg"
+ prev=
+ continue
+ ;;
+ inst_prefix)
+ inst_prefix_dir="$arg"
+ prev=
+ continue
+ ;;
+ precious_regex)
+ precious_files_regex="$arg"
+ prev=
+ continue
+ ;;
+ release)
+ release="-$arg"
+ prev=
+ continue
+ ;;
+ objectlist)
+ if test -f "$arg"; then
+ save_arg=$arg
+ moreargs=
+ for fil in `cat $save_arg`
+ do
+# moreargs="$moreargs $fil"
+ arg=$fil
+ # A libtool-controlled object.
+
+ # Check to see that this really is a libtool object.
+ if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+ pic_object=
+ non_pic_object=
+
+ # Read the .lo file
+ # If there is no directory component, then add one.
+ case $arg in
+ */* | *\\*) . $arg ;;
+ *) . ./$arg ;;
+ esac
+
+ if test -z "$pic_object" || \
+ test -z "$non_pic_object" ||
+ test "$pic_object" = none && \
+ test "$non_pic_object" = none; then
+ $echo "$modename: cannot find name of object for \`$arg'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Extract subdirectory from the argument.
+ xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$xdir" = "X$arg"; then
+ xdir=
+ else
+ xdir="$xdir/"
+ fi
+
+ if test "$pic_object" != none; then
+ # Prepend the subdirectory the object is found in.
+ pic_object="$xdir$pic_object"
+
+ if test "$prev" = dlfiles; then
+ if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+ dlfiles="$dlfiles $pic_object"
+ prev=
+ continue
+ else
+ # If libtool objects are unsupported, then we need to preload.
+ prev=dlprefiles
+ fi
+ fi
+
+ # CHECK ME: I think I busted this. -Ossama
+ if test "$prev" = dlprefiles; then
+ # Preload the old-style object.
+ dlprefiles="$dlprefiles $pic_object"
+ prev=
+ fi
+
+ # A PIC object.
+ libobjs="$libobjs $pic_object"
+ arg="$pic_object"
+ fi
+
+ # Non-PIC object.
+ if test "$non_pic_object" != none; then
+ # Prepend the subdirectory the object is found in.
+ non_pic_object="$xdir$non_pic_object"
+
+ # A standard non-PIC object
+ non_pic_objects="$non_pic_objects $non_pic_object"
+ if test -z "$pic_object" || test "$pic_object" = none ; then
+ arg="$non_pic_object"
+ fi
+ else
+ # If the PIC object exists, use it instead.
+ # $xdir was prepended to $pic_object above.
+ non_pic_object="$pic_object"
+ non_pic_objects="$non_pic_objects $non_pic_object"
+ fi
+ else
+ # Only an error if not doing a dry-run.
+ if test -z "$run"; then
+ $echo "$modename: \`$arg' is not a valid libtool object" 1>&2
+ exit $EXIT_FAILURE
+ else
+ # Dry-run case.
+
+ # Extract subdirectory from the argument.
+ xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$xdir" = "X$arg"; then
+ xdir=
+ else
+ xdir="$xdir/"
+ fi
+
+ pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"`
+ non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"`
+ libobjs="$libobjs $pic_object"
+ non_pic_objects="$non_pic_objects $non_pic_object"
+ fi
+ fi
+ done
+ else
+ $echo "$modename: link input file \`$save_arg' does not exist"
+ exit $EXIT_FAILURE
+ fi
+ arg=$save_arg
+ prev=
+ continue
+ ;;
+ rpath | xrpath)
+ # We need an absolute path.
+ case $arg in
+ [\\/]* | [A-Za-z]:[\\/]*) ;;
+ *)
+ $echo "$modename: only absolute run-paths are allowed" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+ if test "$prev" = rpath; then
+ case "$rpath " in
+ *" $arg "*) ;;
+ *) rpath="$rpath $arg" ;;
+ esac
+ else
+ case "$xrpath " in
+ *" $arg "*) ;;
+ *) xrpath="$xrpath $arg" ;;
+ esac
+ fi
+ prev=
+ continue
+ ;;
+ xcompiler)
+ compiler_flags="$compiler_flags $qarg"
+ prev=
+ compile_command="$compile_command $qarg"
+ finalize_command="$finalize_command $qarg"
+ continue
+ ;;
+ xlinker)
+ linker_flags="$linker_flags $qarg"
+ compiler_flags="$compiler_flags $wl$qarg"
+ prev=
+ compile_command="$compile_command $wl$qarg"
+ finalize_command="$finalize_command $wl$qarg"
+ continue
+ ;;
+ xcclinker)
+ linker_flags="$linker_flags $qarg"
+ compiler_flags="$compiler_flags $qarg"
+ prev=
+ compile_command="$compile_command $qarg"
+ finalize_command="$finalize_command $qarg"
+ continue
+ ;;
+ shrext)
+ shrext_cmds="$arg"
+ prev=
+ continue
+ ;;
+ darwin_framework|darwin_framework_skip)
+ test "$prev" = "darwin_framework" && compiler_flags="$compiler_flags $arg"
+ compile_command="$compile_command $arg"
+ finalize_command="$finalize_command $arg"
+ prev=
+ continue
+ ;;
+ *)
+ eval "$prev=\"\$arg\""
+ prev=
+ continue
+ ;;
+ esac
+ fi # test -n "$prev"
+
+ prevarg="$arg"
+
+ case $arg in
+ -all-static)
+ if test -n "$link_static_flag"; then
+ compile_command="$compile_command $link_static_flag"
+ finalize_command="$finalize_command $link_static_flag"
+ fi
+ continue
+ ;;
+
+ -allow-undefined)
+ # FIXME: remove this flag sometime in the future.
+ $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2
+ continue
+ ;;
+
+ -avoid-version)
+ avoid_version=yes
+ continue
+ ;;
+
+ -dlopen)
+ prev=dlfiles
+ continue
+ ;;
+
+ -dlpreopen)
+ prev=dlprefiles
+ continue
+ ;;
+
+ -export-dynamic)
+ export_dynamic=yes
+ continue
+ ;;
+
+ -export-symbols | -export-symbols-regex)
+ if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+ $echo "$modename: more than one -exported-symbols argument is not allowed"
+ exit $EXIT_FAILURE
+ fi
+ if test "X$arg" = "X-export-symbols"; then
+ prev=expsyms
+ else
+ prev=expsyms_regex
+ fi
+ continue
+ ;;
+
+ -framework|-arch|-isysroot)
+ case " $CC " in
+ *" ${arg} ${1} "* | *" ${arg} ${1} "*)
+ prev=darwin_framework_skip ;;
+ *) compiler_flags="$compiler_flags $arg"
+ prev=darwin_framework ;;
+ esac
+ compile_command="$compile_command $arg"
+ finalize_command="$finalize_command $arg"
+ continue
+ ;;
+
+ -inst-prefix-dir)
+ prev=inst_prefix
+ continue
+ ;;
+
+ # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
+ # so, if we see these flags be careful not to treat them like -L
+ -L[A-Z][A-Z]*:*)
+ case $with_gcc/$host in
+ no/*-*-irix* | /*-*-irix*)
+ compile_command="$compile_command $arg"
+ finalize_command="$finalize_command $arg"
+ ;;
+ esac
+ continue
+ ;;
+
+ -L*)
+ dir=`$echo "X$arg" | $Xsed -e 's/^-L//'`
+ # We need an absolute path.
+ case $dir in
+ [\\/]* | [A-Za-z]:[\\/]*) ;;
+ *)
+ absdir=`cd "$dir" && pwd`
+ if test -z "$absdir"; then
+ $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2
+ absdir="$dir"
+ notinst_path="$notinst_path $dir"
+ fi
+ dir="$absdir"
+ ;;
+ esac
+ case "$deplibs " in
+ *" -L$dir "*) ;;
+ *)
+ deplibs="$deplibs -L$dir"
+ lib_search_path="$lib_search_path $dir"
+ ;;
+ esac
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+ testbindir=`$echo "X$dir" | $Xsed -e 's*/lib$*/bin*'`
+ case :$dllsearchpath: in
+ *":$dir:"*) ;;
+ *) dllsearchpath="$dllsearchpath:$dir";;
+ esac
+ case :$dllsearchpath: in
+ *":$testbindir:"*) ;;
+ *) dllsearchpath="$dllsearchpath:$testbindir";;
+ esac
+ ;;
+ esac
+ continue
+ ;;
+
+ -l*)
+ if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos*)
+ # These systems don't actually have a C or math library (as such)
+ continue
+ ;;
+ *-*-os2*)
+ # These systems don't actually have a C library (as such)
+ test "X$arg" = "X-lc" && continue
+ ;;
+ *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+ # Do not include libc due to us having libc/libc_r.
+ test "X$arg" = "X-lc" && continue
+ ;;
+ *-*-rhapsody* | *-*-darwin1.[012])
+ # Rhapsody C and math libraries are in the System framework
+ deplibs="$deplibs -framework System"
+ continue
+ ;;
+ *-*-sco3.2v5* | *-*-sco5v6*)
+ # Causes problems with __ctype
+ test "X$arg" = "X-lc" && continue
+ ;;
+ *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+ # Compiler inserts libc in the correct place for threads to work
+ test "X$arg" = "X-lc" && continue
+ ;;
+ esac
+ elif test "X$arg" = "X-lc_r"; then
+ case $host in
+ *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+ # Do not include libc_r directly, use -pthread flag.
+ continue
+ ;;
+ esac
+ fi
+ deplibs="$deplibs $arg"
+ continue
+ ;;
+
+ # Tru64 UNIX uses -model [arg] to determine the layout of C++
+ # classes, name mangling, and exception handling.
+ -model)
+ compile_command="$compile_command $arg"
+ compiler_flags="$compiler_flags $arg"
+ finalize_command="$finalize_command $arg"
+ prev=xcompiler
+ continue
+ ;;
+
+ -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe)
+ compiler_flags="$compiler_flags $arg"
+ compile_command="$compile_command $arg"
+ finalize_command="$finalize_command $arg"
+ continue
+ ;;
+
+ -module)
+ module=yes
+ continue
+ ;;
+
+ # -64, -mips[0-9] enable 64-bit mode on the SGI compiler
+ # -r[0-9][0-9]* specifies the processor on the SGI compiler
+ # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler
+ # +DA*, +DD* enable 64-bit mode on the HP compiler
+ # -q* pass through compiler args for the IBM compiler
+ # -m* pass through architecture-specific compiler args for GCC
+ # -m*, -t[45]*, -txscale* pass through architecture-specific
+ # compiler args for GCC
+ # -pg pass through profiling flag for GCC
+ # @file GCC response files
+ -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*|-pg| \
+ -t[45]*|-txscale*|@*)
+
+ # Unknown arguments in both finalize_command and compile_command need
+ # to be aesthetically quoted because they are evaled later.
+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ compile_command="$compile_command $arg"
+ finalize_command="$finalize_command $arg"
+ compiler_flags="$compiler_flags $arg"
+ continue
+ ;;
+
+ -shrext)
+ prev=shrext
+ continue
+ ;;
+
+ -no-fast-install)
+ fast_install=no
+ continue
+ ;;
+
+ -no-install)
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+ # The PATH hackery in wrapper scripts is required on Windows
+ # in order for the loader to find any dlls it needs.
+ $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2
+ $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2
+ fast_install=no
+ ;;
+ *) no_install=yes ;;
+ esac
+ continue
+ ;;
+
+ -no-undefined)
+ allow_undefined=no
+ continue
+ ;;
+
+ -objectlist)
+ prev=objectlist
+ continue
+ ;;
+
+ -o) prev=output ;;
+
+ -precious-files-regex)
+ prev=precious_regex
+ continue
+ ;;
+
+ -release)
+ prev=release
+ continue
+ ;;
+
+ -rpath)
+ prev=rpath
+ continue
+ ;;
+
+ -R)
+ prev=xrpath
+ continue
+ ;;
+
+ -R*)
+ dir=`$echo "X$arg" | $Xsed -e 's/^-R//'`
+ # We need an absolute path.
+ case $dir in
+ [\\/]* | [A-Za-z]:[\\/]*) ;;
+ *)
+ $echo "$modename: only absolute run-paths are allowed" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+ case "$xrpath " in
+ *" $dir "*) ;;
+ *) xrpath="$xrpath $dir" ;;
+ esac
+ continue
+ ;;
+
+ -static)
+ # The effects of -static are defined in a previous loop.
+ # We used to do the same as -all-static on platforms that
+ # didn't have a PIC flag, but the assumption that the effects
+ # would be equivalent was wrong. It would break on at least
+ # Digital Unix and AIX.
+ continue
+ ;;
+
+ -thread-safe)
+ thread_safe=yes
+ continue
+ ;;
+
+ -version-info)
+ prev=vinfo
+ continue
+ ;;
+ -version-number)
+ prev=vinfo
+ vinfo_number=yes
+ continue
+ ;;
+
+ -Wc,*)
+ args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'`
+ arg=
+ save_ifs="$IFS"; IFS=','
+ for flag in $args; do
+ IFS="$save_ifs"
+ case $flag in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ flag="\"$flag\""
+ ;;
+ esac
+ arg="$arg $wl$flag"
+ compiler_flags="$compiler_flags $flag"
+ done
+ IFS="$save_ifs"
+ arg=`$echo "X$arg" | $Xsed -e "s/^ //"`
+ ;;
+
+ -Wl,*)
+ args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'`
+ arg=
+ save_ifs="$IFS"; IFS=','
+ for flag in $args; do
+ IFS="$save_ifs"
+ case $flag in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ flag="\"$flag\""
+ ;;
+ esac
+ arg="$arg $wl$flag"
+ compiler_flags="$compiler_flags $wl$flag"
+ linker_flags="$linker_flags $flag"
+ done
+ IFS="$save_ifs"
+ arg=`$echo "X$arg" | $Xsed -e "s/^ //"`
+ ;;
+
+ -Xcompiler)
+ prev=xcompiler
+ continue
+ ;;
+
+ -Xlinker)
+ prev=xlinker
+ continue
+ ;;
+
+ -XCClinker)
+ prev=xcclinker
+ continue
+ ;;
+
+ # Some other compiler flag.
+ -* | +*)
+ # Unknown arguments in both finalize_command and compile_command need
+ # to be aesthetically quoted because they are evaled later.
+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ ;;
+
+ *.$objext)
+ # A standard object.
+ objs="$objs $arg"
+ ;;
+
+ *.lo)
+ # A libtool-controlled object.
+
+ # Check to see that this really is a libtool object.
+ if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+ pic_object=
+ non_pic_object=
+
+ # Read the .lo file
+ # If there is no directory component, then add one.
+ case $arg in
+ */* | *\\*) . $arg ;;
+ *) . ./$arg ;;
+ esac
+
+ if test -z "$pic_object" || \
+ test -z "$non_pic_object" ||
+ test "$pic_object" = none && \
+ test "$non_pic_object" = none; then
+ $echo "$modename: cannot find name of object for \`$arg'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Extract subdirectory from the argument.
+ xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$xdir" = "X$arg"; then
+ xdir=
+ else
+ xdir="$xdir/"
+ fi
+
+ if test "$pic_object" != none; then
+ # Prepend the subdirectory the object is found in.
+ pic_object="$xdir$pic_object"
+
+ if test "$prev" = dlfiles; then
+ if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+ dlfiles="$dlfiles $pic_object"
+ prev=
+ continue
+ else
+ # If libtool objects are unsupported, then we need to preload.
+ prev=dlprefiles
+ fi
+ fi
+
+ # CHECK ME: I think I busted this. -Ossama
+ if test "$prev" = dlprefiles; then
+ # Preload the old-style object.
+ dlprefiles="$dlprefiles $pic_object"
+ prev=
+ fi
+
+ # A PIC object.
+ libobjs="$libobjs $pic_object"
+ arg="$pic_object"
+ fi
+
+ # Non-PIC object.
+ if test "$non_pic_object" != none; then
+ # Prepend the subdirectory the object is found in.
+ non_pic_object="$xdir$non_pic_object"
+
+ # A standard non-PIC object
+ non_pic_objects="$non_pic_objects $non_pic_object"
+ if test -z "$pic_object" || test "$pic_object" = none ; then
+ arg="$non_pic_object"
+ fi
+ else
+ # If the PIC object exists, use it instead.
+ # $xdir was prepended to $pic_object above.
+ non_pic_object="$pic_object"
+ non_pic_objects="$non_pic_objects $non_pic_object"
+ fi
+ else
+ # Only an error if not doing a dry-run.
+ if test -z "$run"; then
+ $echo "$modename: \`$arg' is not a valid libtool object" 1>&2
+ exit $EXIT_FAILURE
+ else
+ # Dry-run case.
+
+ # Extract subdirectory from the argument.
+ xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$xdir" = "X$arg"; then
+ xdir=
+ else
+ xdir="$xdir/"
+ fi
+
+ pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"`
+ non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"`
+ libobjs="$libobjs $pic_object"
+ non_pic_objects="$non_pic_objects $non_pic_object"
+ fi
+ fi
+ ;;
+
+ *.$libext)
+ # An archive.
+ deplibs="$deplibs $arg"
+ old_deplibs="$old_deplibs $arg"
+ continue
+ ;;
+
+ *.la)
+ # A libtool-controlled library.
+
+ if test "$prev" = dlfiles; then
+ # This library was specified with -dlopen.
+ dlfiles="$dlfiles $arg"
+ prev=
+ elif test "$prev" = dlprefiles; then
+ # The library was specified with -dlpreopen.
+ dlprefiles="$dlprefiles $arg"
+ prev=
+ else
+ deplibs="$deplibs $arg"
+ fi
+ continue
+ ;;
+
+ # Some other compiler argument.
+ *)
+ # Unknown arguments in both finalize_command and compile_command need
+ # to be aesthetically quoted because they are evaled later.
+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ ;;
+ esac # arg
+
+ # Now actually substitute the argument into the commands.
+ if test -n "$arg"; then
+ compile_command="$compile_command $arg"
+ finalize_command="$finalize_command $arg"
+ fi
+ done # argument parsing loop
+
+ if test -n "$prev"; then
+ $echo "$modename: the \`$prevarg' option requires an argument" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
+ eval arg=\"$export_dynamic_flag_spec\"
+ compile_command="$compile_command $arg"
+ finalize_command="$finalize_command $arg"
+ fi
+
+ oldlibs=
+ # calculate the name of the file, without its directory
+ outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'`
+ libobjs_save="$libobjs"
+
+ if test -n "$shlibpath_var"; then
+ # get the directories listed in $shlibpath_var
+ eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\`
+ else
+ shlib_search_path=
+ fi
+ eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
+ eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
+
+ output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$output_objdir" = "X$output"; then
+ output_objdir="$objdir"
+ else
+ output_objdir="$output_objdir/$objdir"
+ fi
+ # Create the object directory.
+ if test ! -d "$output_objdir"; then
+ $show "$mkdir $output_objdir"
+ $run $mkdir $output_objdir
+ exit_status=$?
+ if test "$exit_status" -ne 0 && test ! -d "$output_objdir"; then
+ exit $exit_status
+ fi
+ fi
+
+ # Determine the type of output
+ case $output in
+ "")
+ $echo "$modename: you must specify an output file" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ *.$libext) linkmode=oldlib ;;
+ *.lo | *.$objext) linkmode=obj ;;
+ *.la) linkmode=lib ;;
+ *) linkmode=prog ;; # Anything else should be a program.
+ esac
+
+ case $host in
+ *cygwin* | *mingw* | *pw32*)
+ # don't eliminate duplications in $postdeps and $predeps
+ duplicate_compiler_generated_deps=yes
+ ;;
+ *)
+ duplicate_compiler_generated_deps=$duplicate_deps
+ ;;
+ esac
+ specialdeplibs=
+
+ libs=
+ # Find all interdependent deplibs by searching for libraries
+ # that are linked more than once (e.g. -la -lb -la)
+ for deplib in $deplibs; do
+ if test "X$duplicate_deps" = "Xyes" ; then
+ case "$libs " in
+ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+ esac
+ fi
+ libs="$libs $deplib"
+ done
+
+ if test "$linkmode" = lib; then
+ libs="$predeps $libs $compiler_lib_search_path $postdeps"
+
+ # Compute libraries that are listed more than once in $predeps
+ # $postdeps and mark them as special (i.e., whose duplicates are
+ # not to be eliminated).
+ pre_post_deps=
+ if test "X$duplicate_compiler_generated_deps" = "Xyes" ; then
+ for pre_post_dep in $predeps $postdeps; do
+ case "$pre_post_deps " in
+ *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;;
+ esac
+ pre_post_deps="$pre_post_deps $pre_post_dep"
+ done
+ fi
+ pre_post_deps=
+ fi
+
+ deplibs=
+ newdependency_libs=
+ newlib_search_path=
+ need_relink=no # whether we're linking any uninstalled libtool libraries
+ notinst_deplibs= # not-installed libtool libraries
+ case $linkmode in
+ lib)
+ passes="conv link"
+ for file in $dlfiles $dlprefiles; do
+ case $file in
+ *.la) ;;
+ *)
+ $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+ done
+ ;;
+ prog)
+ compile_deplibs=
+ finalize_deplibs=
+ alldeplibs=no
+ newdlfiles=
+ newdlprefiles=
+ passes="conv scan dlopen dlpreopen link"
+ ;;
+ *) passes="conv"
+ ;;
+ esac
+ for pass in $passes; do
+ if test "$linkmode,$pass" = "lib,link" ||
+ test "$linkmode,$pass" = "prog,scan"; then
+ libs="$deplibs"
+ deplibs=
+ fi
+ if test "$linkmode" = prog; then
+ case $pass in
+ dlopen) libs="$dlfiles" ;;
+ dlpreopen) libs="$dlprefiles" ;;
+ link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
+ esac
+ fi
+ if test "$pass" = dlopen; then
+ # Collect dlpreopened libraries
+ save_deplibs="$deplibs"
+ deplibs=
+ fi
+ for deplib in $libs; do
+ lib=
+ found=no
+ case $deplib in
+ -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe)
+ if test "$linkmode,$pass" = "prog,link"; then
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ else
+ compiler_flags="$compiler_flags $deplib"
+ fi
+ continue
+ ;;
+ -l*)
+ if test "$linkmode" != lib && test "$linkmode" != prog; then
+ $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2
+ continue
+ fi
+ name=`$echo "X$deplib" | $Xsed -e 's/^-l//'`
+ for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do
+ for search_ext in .la $std_shrext .so .a; do
+ # Search the libtool library
+ lib="$searchdir/lib${name}${search_ext}"
+ if test -f "$lib"; then
+ if test "$search_ext" = ".la"; then
+ found=yes
+ else
+ found=no
+ fi
+ break 2
+ fi
+ done
+ done
+ if test "$found" != yes; then
+ # deplib doesn't seem to be a libtool library
+ if test "$linkmode,$pass" = "prog,link"; then
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ else
+ deplibs="$deplib $deplibs"
+ test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+ fi
+ continue
+ else # deplib is a libtool library
+ # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
+ # We need to do some special things here, and not later.
+ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ case " $predeps $postdeps " in
+ *" $deplib "*)
+ if (${SED} -e '2q' $lib |
+ grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+ library_names=
+ old_library=
+ case $lib in
+ */* | *\\*) . $lib ;;
+ *) . ./$lib ;;
+ esac
+ for l in $old_library $library_names; do
+ ll="$l"
+ done
+ if test "X$ll" = "X$old_library" ; then # only static version available
+ found=no
+ ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$ladir" = "X$lib" && ladir="."
+ lib=$ladir/$old_library
+ if test "$linkmode,$pass" = "prog,link"; then
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ else
+ deplibs="$deplib $deplibs"
+ test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+ fi
+ continue
+ fi
+ fi
+ ;;
+ *) ;;
+ esac
+ fi
+ fi
+ ;; # -l
+ -L*)
+ case $linkmode in
+ lib)
+ deplibs="$deplib $deplibs"
+ test "$pass" = conv && continue
+ newdependency_libs="$deplib $newdependency_libs"
+ newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`
+ ;;
+ prog)
+ if test "$pass" = conv; then
+ deplibs="$deplib $deplibs"
+ continue
+ fi
+ if test "$pass" = scan; then
+ deplibs="$deplib $deplibs"
+ else
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ fi
+ newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`
+ ;;
+ *)
+ $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2
+ ;;
+ esac # linkmode
+ continue
+ ;; # -L
+ -R*)
+ if test "$pass" = link; then
+ dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'`
+ # Make sure the xrpath contains only unique directories.
+ case "$xrpath " in
+ *" $dir "*) ;;
+ *) xrpath="$xrpath $dir" ;;
+ esac
+ fi
+ deplibs="$deplib $deplibs"
+ continue
+ ;;
+ *.la) lib="$deplib" ;;
+ *.$libext)
+ if test "$pass" = conv; then
+ deplibs="$deplib $deplibs"
+ continue
+ fi
+ case $linkmode in
+ lib)
+ valid_a_lib=no
+ case $deplibs_check_method in
+ match_pattern*)
+ set dummy $deplibs_check_method
+ match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
+ if eval $echo \"$deplib\" 2>/dev/null \
+ | $SED 10q \
+ | $EGREP "$match_pattern_regex" > /dev/null; then
+ valid_a_lib=yes
+ fi
+ ;;
+ pass_all)
+ valid_a_lib=yes
+ ;;
+ esac
+ if test "$valid_a_lib" != yes; then
+ $echo
+ $echo "*** Warning: Trying to link with static lib archive $deplib."
+ $echo "*** I have the capability to make that library automatically link in when"
+ $echo "*** you link to this library. But I can only do this if you have a"
+ $echo "*** shared version of the library, which you do not appear to have"
+ $echo "*** because the file extensions .$libext of this argument makes me believe"
+ $echo "*** that it is just a static archive that I should not used here."
+ else
+ $echo
+ $echo "*** Warning: Linking the shared library $output against the"
+ $echo "*** static library $deplib is not portable!"
+ deplibs="$deplib $deplibs"
+ fi
+ continue
+ ;;
+ prog)
+ if test "$pass" != link; then
+ deplibs="$deplib $deplibs"
+ else
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ fi
+ continue
+ ;;
+ esac # linkmode
+ ;; # *.$libext
+ *.lo | *.$objext)
+ if test "$pass" = conv; then
+ deplibs="$deplib $deplibs"
+ elif test "$linkmode" = prog; then
+ if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
+ # If there is no dlopen support or we're linking statically,
+ # we need to preload.
+ newdlprefiles="$newdlprefiles $deplib"
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ else
+ newdlfiles="$newdlfiles $deplib"
+ fi
+ fi
+ continue
+ ;;
+ %DEPLIBS%)
+ alldeplibs=yes
+ continue
+ ;;
+ esac # case $deplib
+ if test "$found" = yes || test -f "$lib"; then :
+ else
+ $echo "$modename: cannot find the library \`$lib' or unhandled argument \`$deplib'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Check to see that this really is a libtool archive.
+ if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+ else
+ $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$ladir" = "X$lib" && ladir="."
+
+ dlname=
+ dlopen=
+ dlpreopen=
+ libdir=
+ library_names=
+ old_library=
+ # If the library was installed with an old release of libtool,
+ # it will not redefine variables installed, or shouldnotlink
+ installed=yes
+ shouldnotlink=no
+ avoidtemprpath=
+
+
+ # Read the .la file
+ case $lib in
+ */* | *\\*) . $lib ;;
+ *) . ./$lib ;;
+ esac
+
+ if test "$linkmode,$pass" = "lib,link" ||
+ test "$linkmode,$pass" = "prog,scan" ||
+ { test "$linkmode" != prog && test "$linkmode" != lib; }; then
+ test -n "$dlopen" && dlfiles="$dlfiles $dlopen"
+ test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen"
+ fi
+
+ if test "$pass" = conv; then
+ # Only check for convenience libraries
+ deplibs="$lib $deplibs"
+ if test -z "$libdir"; then
+ if test -z "$old_library"; then
+ $echo "$modename: cannot find name of link library for \`$lib'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ # It is a libtool convenience library, so add in its objects.
+ convenience="$convenience $ladir/$objdir/$old_library"
+ old_convenience="$old_convenience $ladir/$objdir/$old_library"
+ tmp_libs=
+ for deplib in $dependency_libs; do
+ deplibs="$deplib $deplibs"
+ if test "X$duplicate_deps" = "Xyes" ; then
+ case "$tmp_libs " in
+ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+ esac
+ fi
+ tmp_libs="$tmp_libs $deplib"
+ done
+ elif test "$linkmode" != prog && test "$linkmode" != lib; then
+ $echo "$modename: \`$lib' is not a convenience library" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ continue
+ fi # $pass = conv
+
+
+ # Get the name of the library we link against.
+ linklib=
+ for l in $old_library $library_names; do
+ linklib="$l"
+ done
+ if test -z "$linklib"; then
+ $echo "$modename: cannot find name of link library for \`$lib'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # This library was specified with -dlopen.
+ if test "$pass" = dlopen; then
+ if test -z "$libdir"; then
+ $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ if test -z "$dlname" ||
+ test "$dlopen_support" != yes ||
+ test "$build_libtool_libs" = no; then
+ # If there is no dlname, no dlopen support or we're linking
+ # statically, we need to preload. We also need to preload any
+ # dependent libraries so libltdl's deplib preloader doesn't
+ # bomb out in the load deplibs phase.
+ dlprefiles="$dlprefiles $lib $dependency_libs"
+ else
+ newdlfiles="$newdlfiles $lib"
+ fi
+ continue
+ fi # $pass = dlopen
+
+ # We need an absolute path.
+ case $ladir in
+ [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
+ *)
+ abs_ladir=`cd "$ladir" && pwd`
+ if test -z "$abs_ladir"; then
+ $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2
+ $echo "$modename: passing it literally to the linker, although it might fail" 1>&2
+ abs_ladir="$ladir"
+ fi
+ ;;
+ esac
+ laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+
+ # Find the relevant object directory and library name.
+ if test "X$installed" = Xyes; then
+ if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+ $echo "$modename: warning: library \`$lib' was moved." 1>&2
+ dir="$ladir"
+ absdir="$abs_ladir"
+ libdir="$abs_ladir"
+ else
+ dir="$libdir"
+ absdir="$libdir"
+ fi
+ test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
+ else
+ if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+ dir="$ladir"
+ absdir="$abs_ladir"
+ # Remove this search path later
+ notinst_path="$notinst_path $abs_ladir"
+ else
+ dir="$ladir/$objdir"
+ absdir="$abs_ladir/$objdir"
+ # Remove this search path later
+ notinst_path="$notinst_path $abs_ladir"
+ fi
+ fi # $installed = yes
+ name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
+
+ # This library was specified with -dlpreopen.
+ if test "$pass" = dlpreopen; then
+ if test -z "$libdir"; then
+ $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ # Prefer using a static library (so that no silly _DYNAMIC symbols
+ # are required to link).
+ if test -n "$old_library"; then
+ newdlprefiles="$newdlprefiles $dir/$old_library"
+ # Otherwise, use the dlname, so that lt_dlopen finds it.
+ elif test -n "$dlname"; then
+ newdlprefiles="$newdlprefiles $dir/$dlname"
+ else
+ newdlprefiles="$newdlprefiles $dir/$linklib"
+ fi
+ fi # $pass = dlpreopen
+
+ if test -z "$libdir"; then
+ # Link the convenience library
+ if test "$linkmode" = lib; then
+ deplibs="$dir/$old_library $deplibs"
+ elif test "$linkmode,$pass" = "prog,link"; then
+ compile_deplibs="$dir/$old_library $compile_deplibs"
+ finalize_deplibs="$dir/$old_library $finalize_deplibs"
+ else
+ deplibs="$lib $deplibs" # used for prog,scan pass
+ fi
+ continue
+ fi
+
+
+ if test "$linkmode" = prog && test "$pass" != link; then
+ newlib_search_path="$newlib_search_path $ladir"
+ deplibs="$lib $deplibs"
+
+ linkalldeplibs=no
+ if test "$link_all_deplibs" != no || test -z "$library_names" ||
+ test "$build_libtool_libs" = no; then
+ linkalldeplibs=yes
+ fi
+
+ tmp_libs=
+ for deplib in $dependency_libs; do
+ case $deplib in
+ -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test
+ esac
+ # Need to link against all dependency_libs?
+ if test "$linkalldeplibs" = yes; then
+ deplibs="$deplib $deplibs"
+ else
+ # Need to hardcode shared library paths
+ # or/and link against static libraries
+ newdependency_libs="$deplib $newdependency_libs"
+ fi
+ if test "X$duplicate_deps" = "Xyes" ; then
+ case "$tmp_libs " in
+ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+ esac
+ fi
+ tmp_libs="$tmp_libs $deplib"
+ done # for deplib
+ continue
+ fi # $linkmode = prog...
+
+ if test "$linkmode,$pass" = "prog,link"; then
+ if test -n "$library_names" &&
+ { test "$prefer_static_libs" = no || test -z "$old_library"; }; then
+ # We need to hardcode the library path
+ if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
+ # Make sure the rpath contains only unique directories.
+ case "$temp_rpath " in
+ *" $dir "*) ;;
+ *" $absdir "*) ;;
+ *) temp_rpath="$temp_rpath $absdir" ;;
+ esac
+ fi
+
+ # Hardcode the library path.
+ # Skip directories that are in the system default run-time
+ # search path.
+ case " $sys_lib_dlsearch_path " in
+ *" $absdir "*) ;;
+ *)
+ case "$compile_rpath " in
+ *" $absdir "*) ;;
+ *) compile_rpath="$compile_rpath $absdir"
+ esac
+ ;;
+ esac
+ case " $sys_lib_dlsearch_path " in
+ *" $libdir "*) ;;
+ *)
+ case "$finalize_rpath " in
+ *" $libdir "*) ;;
+ *) finalize_rpath="$finalize_rpath $libdir"
+ esac
+ ;;
+ esac
+ fi # $linkmode,$pass = prog,link...
+
+ if test "$alldeplibs" = yes &&
+ { test "$deplibs_check_method" = pass_all ||
+ { test "$build_libtool_libs" = yes &&
+ test -n "$library_names"; }; }; then
+ # We only need to search for static libraries
+ continue
+ fi
+ fi
+
+ link_static=no # Whether the deplib will be linked statically
+ use_static_libs=$prefer_static_libs
+ if test "$use_static_libs" = built && test "$installed" = yes ; then
+ use_static_libs=no
+ fi
+ if test -n "$library_names" &&
+ { test "$use_static_libs" = no || test -z "$old_library"; }; then
+ if test "$installed" = no; then
+ notinst_deplibs="$notinst_deplibs $lib"
+ need_relink=yes
+ fi
+ # This is a shared library
+
+ # Warn about portability, can't link against -module's on
+ # some systems (darwin)
+ if test "$shouldnotlink" = yes && test "$pass" = link ; then
+ $echo
+ if test "$linkmode" = prog; then
+ $echo "*** Warning: Linking the executable $output against the loadable module"
+ else
+ $echo "*** Warning: Linking the shared library $output against the loadable module"
+ fi
+ $echo "*** $linklib is not portable!"
+ fi
+ if test "$linkmode" = lib &&
+ test "$hardcode_into_libs" = yes; then
+ # Hardcode the library path.
+ # Skip directories that are in the system default run-time
+ # search path.
+ case " $sys_lib_dlsearch_path " in
+ *" $absdir "*) ;;
+ *)
+ case "$compile_rpath " in
+ *" $absdir "*) ;;
+ *) compile_rpath="$compile_rpath $absdir"
+ esac
+ ;;
+ esac
+ case " $sys_lib_dlsearch_path " in
+ *" $libdir "*) ;;
+ *)
+ case "$finalize_rpath " in
+ *" $libdir "*) ;;
+ *) finalize_rpath="$finalize_rpath $libdir"
+ esac
+ ;;
+ esac
+ fi
+
+ if test -n "$old_archive_from_expsyms_cmds"; then
+ # figure out the soname
+ set dummy $library_names
+ realname="$2"
+ shift; shift
+ libname=`eval \\$echo \"$libname_spec\"`
+ # use dlname if we got it. it's perfectly good, no?
+ if test -n "$dlname"; then
+ soname="$dlname"
+ elif test -n "$soname_spec"; then
+ # bleh windows
+ case $host in
+ *cygwin* | mingw*)
+ major=`expr $current - $age`
+ versuffix="-$major"
+ ;;
+ esac
+ eval soname=\"$soname_spec\"
+ else
+ soname="$realname"
+ fi
+
+ # Make a new name for the extract_expsyms_cmds to use
+ soroot="$soname"
+ soname=`$echo $soroot | ${SED} -e 's/^.*\///'`
+ newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a"
+
+ # If the library has no export list, then create one now
+ if test -f "$output_objdir/$soname-def"; then :
+ else
+ $show "extracting exported symbol list from \`$soname'"
+ save_ifs="$IFS"; IFS='~'
+ cmds=$extract_expsyms_cmds
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ fi
+
+ # Create $newlib
+ if test -f "$output_objdir/$newlib"; then :; else
+ $show "generating import library for \`$soname'"
+ save_ifs="$IFS"; IFS='~'
+ cmds=$old_archive_from_expsyms_cmds
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ fi
+ # make sure the library variables are pointing to the new library
+ dir=$output_objdir
+ linklib=$newlib
+ fi # test -n "$old_archive_from_expsyms_cmds"
+
+ if test "$linkmode" = prog || test "$mode" != relink; then
+ add_shlibpath=
+ add_dir=
+ add=
+ lib_linked=yes
+ case $hardcode_action in
+ immediate | unsupported)
+ if test "$hardcode_direct" = no; then
+ add="$dir/$linklib"
+ case $host in
+ *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
+ *-*-sysv4*uw2*) add_dir="-L$dir" ;;
+ *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
+ *-*-unixware7*) add_dir="-L$dir" ;;
+ *-*-darwin* )
+ # if the lib is a module then we can not link against
+ # it, someone is ignoring the new warnings I added
+ if /usr/bin/file -L $add 2> /dev/null |
+ $EGREP ": [^:]* bundle" >/dev/null ; then
+ $echo "** Warning, lib $linklib is a module, not a shared library"
+ if test -z "$old_library" ; then
+ $echo
+ $echo "** And there doesn't seem to be a static archive available"
+ $echo "** The link will probably fail, sorry"
+ else
+ add="$dir/$old_library"
+ fi
+ fi
+ esac
+ elif test "$hardcode_minus_L" = no; then
+ case $host in
+ *-*-sunos*) add_shlibpath="$dir" ;;
+ esac
+ add_dir="-L$dir"
+ add="-l$name"
+ elif test "$hardcode_shlibpath_var" = no; then
+ add_shlibpath="$dir"
+ add="-l$name"
+ else
+ lib_linked=no
+ fi
+ ;;
+ relink)
+ if test "$hardcode_direct" = yes; then
+ add="$dir/$linklib"
+ elif test "$hardcode_minus_L" = yes; then
+ add_dir="-L$dir"
+ # Try looking first in the location we're being installed to.
+ if test -n "$inst_prefix_dir"; then
+ case $libdir in
+ [\\/]*)
+ add_dir="$add_dir -L$inst_prefix_dir$libdir"
+ ;;
+ esac
+ fi
+ add="-l$name"
+ elif test "$hardcode_shlibpath_var" = yes; then
+ add_shlibpath="$dir"
+ add="-l$name"
+ else
+ lib_linked=no
+ fi
+ ;;
+ *) lib_linked=no ;;
+ esac
+
+ if test "$lib_linked" != yes; then
+ $echo "$modename: configuration error: unsupported hardcode properties"
+ exit $EXIT_FAILURE
+ fi
+
+ if test -n "$add_shlibpath"; then
+ case :$compile_shlibpath: in
+ *":$add_shlibpath:"*) ;;
+ *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;;
+ esac
+ fi
+ if test "$linkmode" = prog; then
+ test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
+ test -n "$add" && compile_deplibs="$add $compile_deplibs"
+ else
+ test -n "$add_dir" && deplibs="$add_dir $deplibs"
+ test -n "$add" && deplibs="$add $deplibs"
+ if test "$hardcode_direct" != yes && \
+ test "$hardcode_minus_L" != yes && \
+ test "$hardcode_shlibpath_var" = yes; then
+ case :$finalize_shlibpath: in
+ *":$libdir:"*) ;;
+ *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+ esac
+ fi
+ fi
+ fi
+
+ if test "$linkmode" = prog || test "$mode" = relink; then
+ add_shlibpath=
+ add_dir=
+ add=
+ # Finalize command for both is simple: just hardcode it.
+ if test "$hardcode_direct" = yes; then
+ add="$libdir/$linklib"
+ elif test "$hardcode_minus_L" = yes; then
+ add_dir="-L$libdir"
+ add="-l$name"
+ elif test "$hardcode_shlibpath_var" = yes; then
+ case :$finalize_shlibpath: in
+ *":$libdir:"*) ;;
+ *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+ esac
+ add="-l$name"
+ elif test "$hardcode_automatic" = yes; then
+ if test -n "$inst_prefix_dir" &&
+ test -f "$inst_prefix_dir$libdir/$linklib" ; then
+ add="$inst_prefix_dir$libdir/$linklib"
+ else
+ add="$libdir/$linklib"
+ fi
+ else
+ # We cannot seem to hardcode it, guess we'll fake it.
+ add_dir="-L$libdir"
+ # Try looking first in the location we're being installed to.
+ if test -n "$inst_prefix_dir"; then
+ case $libdir in
+ [\\/]*)
+ add_dir="$add_dir -L$inst_prefix_dir$libdir"
+ ;;
+ esac
+ fi
+ add="-l$name"
+ fi
+
+ if test "$linkmode" = prog; then
+ test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
+ test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
+ else
+ test -n "$add_dir" && deplibs="$add_dir $deplibs"
+ test -n "$add" && deplibs="$add $deplibs"
+ fi
+ fi
+ elif test "$linkmode" = prog; then
+ # Here we assume that one of hardcode_direct or hardcode_minus_L
+ # is not unsupported. This is valid on all known static and
+ # shared platforms.
+ if test "$hardcode_direct" != unsupported; then
+ test -n "$old_library" && linklib="$old_library"
+ compile_deplibs="$dir/$linklib $compile_deplibs"
+ finalize_deplibs="$dir/$linklib $finalize_deplibs"
+ else
+ compile_deplibs="-l$name -L$dir $compile_deplibs"
+ finalize_deplibs="-l$name -L$dir $finalize_deplibs"
+ fi
+ elif test "$build_libtool_libs" = yes; then
+ # Not a shared library
+ if test "$deplibs_check_method" != pass_all; then
+ # We're trying link a shared library against a static one
+ # but the system doesn't support it.
+
+ # Just print a warning and add the library to dependency_libs so
+ # that the program can be linked against the static library.
+ $echo
+ $echo "*** Warning: This system can not link to static lib archive $lib."
+ $echo "*** I have the capability to make that library automatically link in when"
+ $echo "*** you link to this library. But I can only do this if you have a"
+ $echo "*** shared version of the library, which you do not appear to have."
+ if test "$module" = yes; then
+ $echo "*** But as you try to build a module library, libtool will still create "
+ $echo "*** a static module, that should work as long as the dlopening application"
+ $echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
+ if test -z "$global_symbol_pipe"; then
+ $echo
+ $echo "*** However, this would only work if libtool was able to extract symbol"
+ $echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+ $echo "*** not find such a program. So, this module is probably useless."
+ $echo "*** \`nm' from GNU binutils and a full rebuild may help."
+ fi
+ if test "$build_old_libs" = no; then
+ build_libtool_libs=module
+ build_old_libs=yes
+ else
+ build_libtool_libs=no
+ fi
+ fi
+ else
+ deplibs="$dir/$old_library $deplibs"
+ link_static=yes
+ fi
+ fi # link shared/static library?
+
+ if test "$linkmode" = lib; then
+ if test -n "$dependency_libs" &&
+ { test "$hardcode_into_libs" != yes ||
+ test "$build_old_libs" = yes ||
+ test "$link_static" = yes; }; then
+ # Extract -R from dependency_libs
+ temp_deplibs=
+ for libdir in $dependency_libs; do
+ case $libdir in
+ -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'`
+ case " $xrpath " in
+ *" $temp_xrpath "*) ;;
+ *) xrpath="$xrpath $temp_xrpath";;
+ esac;;
+ *) temp_deplibs="$temp_deplibs $libdir";;
+ esac
+ done
+ dependency_libs="$temp_deplibs"
+ fi
+
+ newlib_search_path="$newlib_search_path $absdir"
+ # Link against this library
+ test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
+ # ... and its dependency_libs
+ tmp_libs=
+ for deplib in $dependency_libs; do
+ newdependency_libs="$deplib $newdependency_libs"
+ if test "X$duplicate_deps" = "Xyes" ; then
+ case "$tmp_libs " in
+ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+ esac
+ fi
+ tmp_libs="$tmp_libs $deplib"
+ done
+
+ if test "$link_all_deplibs" != no; then
+ # Add the search paths of all dependency libraries
+ for deplib in $dependency_libs; do
+ case $deplib in
+ -L*) path="$deplib" ;;
+ *.la)
+ dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$dir" = "X$deplib" && dir="."
+ # We need an absolute path.
+ case $dir in
+ [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
+ *)
+ absdir=`cd "$dir" && pwd`
+ if test -z "$absdir"; then
+ $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2
+ absdir="$dir"
+ fi
+ ;;
+ esac
+ if grep "^installed=no" $deplib > /dev/null; then
+ path="$absdir/$objdir"
+ else
+ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+ if test -z "$libdir"; then
+ $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ if test "$absdir" != "$libdir"; then
+ $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2
+ fi
+ path="$absdir"
+ fi
+ depdepl=
+ case $host in
+ *-*-darwin*)
+ # we do not want to link against static libs,
+ # but need to link against shared
+ eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
+ if test -n "$deplibrary_names" ; then
+ for tmp in $deplibrary_names ; do
+ depdepl=$tmp
+ done
+ if test -f "$path/$depdepl" ; then
+ depdepl="$path/$depdepl"
+ fi
+ # do not add paths which are already there
+ case " $newlib_search_path " in
+ *" $path "*) ;;
+ *) newlib_search_path="$newlib_search_path $path";;
+ esac
+ fi
+ path=""
+ ;;
+ *)
+ path="-L$path"
+ ;;
+ esac
+ ;;
+ -l*)
+ case $host in
+ *-*-darwin*)
+ # Again, we only want to link against shared libraries
+ eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"`
+ for tmp in $newlib_search_path ; do
+ if test -f "$tmp/lib$tmp_libs.dylib" ; then
+ eval depdepl="$tmp/lib$tmp_libs.dylib"
+ break
+ fi
+ done
+ path=""
+ ;;
+ *) continue ;;
+ esac
+ ;;
+ *) continue ;;
+ esac
+ case " $deplibs " in
+ *" $path "*) ;;
+ *) deplibs="$path $deplibs" ;;
+ esac
+ case " $deplibs " in
+ *" $depdepl "*) ;;
+ *) deplibs="$depdepl $deplibs" ;;
+ esac
+ done
+ fi # link_all_deplibs != no
+ fi # linkmode = lib
+ done # for deplib in $libs
+ dependency_libs="$newdependency_libs"
+ if test "$pass" = dlpreopen; then
+ # Link the dlpreopened libraries before other libraries
+ for deplib in $save_deplibs; do
+ deplibs="$deplib $deplibs"
+ done
+ fi
+ if test "$pass" != dlopen; then
+ if test "$pass" != conv; then
+ # Make sure lib_search_path contains only unique directories.
+ lib_search_path=
+ for dir in $newlib_search_path; do
+ case "$lib_search_path " in
+ *" $dir "*) ;;
+ *) lib_search_path="$lib_search_path $dir" ;;
+ esac
+ done
+ newlib_search_path=
+ fi
+
+ if test "$linkmode,$pass" != "prog,link"; then
+ vars="deplibs"
+ else
+ vars="compile_deplibs finalize_deplibs"
+ fi
+ for var in $vars dependency_libs; do
+ # Add libraries to $var in reverse order
+ eval tmp_libs=\"\$$var\"
+ new_libs=
+ for deplib in $tmp_libs; do
+ # FIXME: Pedantically, this is the right thing to do, so
+ # that some nasty dependency loop isn't accidentally
+ # broken:
+ #new_libs="$deplib $new_libs"
+ # Pragmatically, this seems to cause very few problems in
+ # practice:
+ case $deplib in
+ -L*) new_libs="$deplib $new_libs" ;;
+ -R*) ;;
+ *)
+ # And here is the reason: when a library appears more
+ # than once as an explicit dependence of a library, or
+ # is implicitly linked in more than once by the
+ # compiler, it is considered special, and multiple
+ # occurrences thereof are not removed. Compare this
+ # with having the same library being listed as a
+ # dependency of multiple other libraries: in this case,
+ # we know (pedantically, we assume) the library does not
+ # need to be listed more than once, so we keep only the
+ # last copy. This is not always right, but it is rare
+ # enough that we require users that really mean to play
+ # such unportable linking tricks to link the library
+ # using -Wl,-lname, so that libtool does not consider it
+ # for duplicate removal.
+ case " $specialdeplibs " in
+ *" $deplib "*) new_libs="$deplib $new_libs" ;;
+ *)
+ case " $new_libs " in
+ *" $deplib "*) ;;
+ *) new_libs="$deplib $new_libs" ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ done
+ tmp_libs=
+ for deplib in $new_libs; do
+ case $deplib in
+ -L*)
+ case " $tmp_libs " in
+ *" $deplib "*) ;;
+ *) tmp_libs="$tmp_libs $deplib" ;;
+ esac
+ ;;
+ *) tmp_libs="$tmp_libs $deplib" ;;
+ esac
+ done
+ eval $var=\"$tmp_libs\"
+ done # for var
+ fi
+ # Last step: remove runtime libs from dependency_libs
+ # (they stay in deplibs)
+ tmp_libs=
+ for i in $dependency_libs ; do
+ case " $predeps $postdeps $compiler_lib_search_path " in
+ *" $i "*)
+ i=""
+ ;;
+ esac
+ if test -n "$i" ; then
+ tmp_libs="$tmp_libs $i"
+ fi
+ done
+ dependency_libs=$tmp_libs
+ done # for pass
+ if test "$linkmode" = prog; then
+ dlfiles="$newdlfiles"
+ dlprefiles="$newdlprefiles"
+ fi
+
+ case $linkmode in
+ oldlib)
+ if test -n "$deplibs"; then
+ $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2
+ fi
+
+ if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+ $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2
+ fi
+
+ if test -n "$rpath"; then
+ $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2
+ fi
+
+ if test -n "$xrpath"; then
+ $echo "$modename: warning: \`-R' is ignored for archives" 1>&2
+ fi
+
+ if test -n "$vinfo"; then
+ $echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2
+ fi
+
+ if test -n "$release"; then
+ $echo "$modename: warning: \`-release' is ignored for archives" 1>&2
+ fi
+
+ if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+ $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2
+ fi
+
+ # Now set the variables for building old libraries.
+ build_libtool_libs=no
+ oldlibs="$output"
+ objs="$objs$old_deplibs"
+ ;;
+
+ lib)
+ # Make sure we only generate libraries of the form `libNAME.la'.
+ case $outputname in
+ lib*)
+ name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
+ eval shared_ext=\"$shrext_cmds\"
+ eval libname=\"$libname_spec\"
+ ;;
+ *)
+ if test "$module" = no; then
+ $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ if test "$need_lib_prefix" != no; then
+ # Add the "lib" prefix for modules if required
+ name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
+ eval shared_ext=\"$shrext_cmds\"
+ eval libname=\"$libname_spec\"
+ else
+ libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
+ fi
+ ;;
+ esac
+
+ if test -n "$objs"; then
+ if test "$deplibs_check_method" != pass_all; then
+ $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1
+ exit $EXIT_FAILURE
+ else
+ $echo
+ $echo "*** Warning: Linking the shared library $output against the non-libtool"
+ $echo "*** objects $objs is not portable!"
+ libobjs="$libobjs $objs"
+ fi
+ fi
+
+ if test "$dlself" != no; then
+ $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2
+ fi
+
+ set dummy $rpath
+ if test "$#" -gt 2; then
+ $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2
+ fi
+ install_libdir="$2"
+
+ oldlibs=
+ if test -z "$rpath"; then
+ if test "$build_libtool_libs" = yes; then
+ # Building a libtool convenience library.
+ # Some compilers have problems with a `.al' extension so
+ # convenience libraries should have the same extension an
+ # archive normally would.
+ oldlibs="$output_objdir/$libname.$libext $oldlibs"
+ build_libtool_libs=convenience
+ build_old_libs=yes
+ fi
+
+ if test -n "$vinfo"; then
+ $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2
+ fi
+
+ if test -n "$release"; then
+ $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2
+ fi
+ else
+
+ # Parse the version information argument.
+ save_ifs="$IFS"; IFS=':'
+ set dummy $vinfo 0 0 0
+ IFS="$save_ifs"
+
+ if test -n "$8"; then
+ $echo "$modename: too many parameters to \`-version-info'" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # convert absolute version numbers to libtool ages
+ # this retains compatibility with .la files and attempts
+ # to make the code below a bit more comprehensible
+
+ case $vinfo_number in
+ yes)
+ number_major="$2"
+ number_minor="$3"
+ number_revision="$4"
+ #
+ # There are really only two kinds -- those that
+ # use the current revision as the major version
+ # and those that subtract age and use age as
+ # a minor version. But, then there is irix
+ # which has an extra 1 added just for fun
+ #
+ case $version_type in
+ darwin|linux|osf|windows)
+ current=`expr $number_major + $number_minor`
+ age="$number_minor"
+ revision="$number_revision"
+ ;;
+ freebsd-aout|freebsd-elf|sunos)
+ current="$number_major"
+ revision="$number_minor"
+ age="0"
+ ;;
+ irix|nonstopux)
+ current=`expr $number_major + $number_minor - 1`
+ age="$number_minor"
+ revision="$number_minor"
+ ;;
+ esac
+ ;;
+ no)
+ current="$2"
+ revision="$3"
+ age="$4"
+ ;;
+ esac
+
+ # Check that each of the things are valid numbers.
+ case $current in
+ 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+ *)
+ $echo "$modename: CURRENT \`$current' must be a nonnegative integer" 1>&2
+ $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+
+ case $revision in
+ 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+ *)
+ $echo "$modename: REVISION \`$revision' must be a nonnegative integer" 1>&2
+ $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+
+ case $age in
+ 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+ *)
+ $echo "$modename: AGE \`$age' must be a nonnegative integer" 1>&2
+ $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+
+ if test "$age" -gt "$current"; then
+ $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2
+ $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Calculate the version variables.
+ major=
+ versuffix=
+ verstring=
+ case $version_type in
+ none) ;;
+
+ darwin)
+ # Like Linux, but with the current version available in
+ # verstring for coding it into the library header
+ major=.`expr $current - $age`
+ versuffix="$major.$age.$revision"
+ # Darwin ld doesn't like 0 for these options...
+ minor_current=`expr $current + 1`
+ verstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
+ ;;
+
+ freebsd-aout)
+ major=".$current"
+ versuffix=".$current.$revision";
+ ;;
+
+ freebsd-elf)
+ major=".$current"
+ versuffix=".$current";
+ ;;
+
+ irix | nonstopux)
+ major=`expr $current - $age + 1`
+
+ case $version_type in
+ nonstopux) verstring_prefix=nonstopux ;;
+ *) verstring_prefix=sgi ;;
+ esac
+ verstring="$verstring_prefix$major.$revision"
+
+ # Add in all the interfaces that we are compatible with.
+ loop=$revision
+ while test "$loop" -ne 0; do
+ iface=`expr $revision - $loop`
+ loop=`expr $loop - 1`
+ verstring="$verstring_prefix$major.$iface:$verstring"
+ done
+
+ # Before this point, $major must not contain `.'.
+ major=.$major
+ versuffix="$major.$revision"
+ ;;
+
+ linux)
+ major=.`expr $current - $age`
+ versuffix="$major.$age.$revision"
+ ;;
+
+ osf)
+ major=.`expr $current - $age`
+ versuffix=".$current.$age.$revision"
+ verstring="$current.$age.$revision"
+
+ # Add in all the interfaces that we are compatible with.
+ loop=$age
+ while test "$loop" -ne 0; do
+ iface=`expr $current - $loop`
+ loop=`expr $loop - 1`
+ verstring="$verstring:${iface}.0"
+ done
+
+ # Make executables depend on our current version.
+ verstring="$verstring:${current}.0"
+ ;;
+
+ sunos)
+ major=".$current"
+ versuffix=".$current.$revision"
+ ;;
+
+ windows)
+ # Use '-' rather than '.', since we only want one
+ # extension on DOS 8.3 filesystems.
+ major=`expr $current - $age`
+ versuffix="-$major"
+ ;;
+
+ *)
+ $echo "$modename: unknown library version type \`$version_type'" 1>&2
+ $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+
+ # Clear the version info if we defaulted, and they specified a release.
+ if test -z "$vinfo" && test -n "$release"; then
+ major=
+ case $version_type in
+ darwin)
+ # we can't check for "0.0" in archive_cmds due to quoting
+ # problems, so we reset it completely
+ verstring=
+ ;;
+ *)
+ verstring="0.0"
+ ;;
+ esac
+ if test "$need_version" = no; then
+ versuffix=
+ else
+ versuffix=".0.0"
+ fi
+ fi
+
+ # Remove version info from name if versioning should be avoided
+ if test "$avoid_version" = yes && test "$need_version" = no; then
+ major=
+ versuffix=
+ verstring=""
+ fi
+
+ # Check to see if the archive will have undefined symbols.
+ if test "$allow_undefined" = yes; then
+ if test "$allow_undefined_flag" = unsupported; then
+ $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2
+ build_libtool_libs=no
+ build_old_libs=yes
+ fi
+ else
+ # Don't allow undefined symbols.
+ allow_undefined_flag="$no_undefined_flag"
+ fi
+ fi
+
+ if test "$mode" != relink; then
+ # Remove our outputs, but don't remove object files since they
+ # may have been created when compiling PIC objects.
+ removelist=
+ tempremovelist=`$echo "$output_objdir/*"`
+ for p in $tempremovelist; do
+ case $p in
+ *.$objext)
+ ;;
+ $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
+ if test "X$precious_files_regex" != "X"; then
+ if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
+ then
+ continue
+ fi
+ fi
+ removelist="$removelist $p"
+ ;;
+ *) ;;
+ esac
+ done
+ if test -n "$removelist"; then
+ $show "${rm}r $removelist"
+ $run ${rm}r $removelist
+ fi
+ fi
+
+ # Now set the variables for building old libraries.
+ if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
+ oldlibs="$oldlibs $output_objdir/$libname.$libext"
+
+ # Transform .lo files to .o files.
+ oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP`
+ fi
+
+ # Eliminate all temporary directories.
+ for path in $notinst_path; do
+ lib_search_path=`$echo "$lib_search_path " | ${SED} -e "s% $path % %g"`
+ deplibs=`$echo "$deplibs " | ${SED} -e "s% -L$path % %g"`
+ dependency_libs=`$echo "$dependency_libs " | ${SED} -e "s% -L$path % %g"`
+ done
+
+ if test -n "$xrpath"; then
+ # If the user specified any rpath flags, then add them.
+ temp_xrpath=
+ for libdir in $xrpath; do
+ temp_xrpath="$temp_xrpath -R$libdir"
+ case "$finalize_rpath " in
+ *" $libdir "*) ;;
+ *) finalize_rpath="$finalize_rpath $libdir" ;;
+ esac
+ done
+ if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
+ dependency_libs="$temp_xrpath $dependency_libs"
+ fi
+ fi
+
+ # Make sure dlfiles contains only unique files that won't be dlpreopened
+ old_dlfiles="$dlfiles"
+ dlfiles=
+ for lib in $old_dlfiles; do
+ case " $dlprefiles $dlfiles " in
+ *" $lib "*) ;;
+ *) dlfiles="$dlfiles $lib" ;;
+ esac
+ done
+
+ # Make sure dlprefiles contains only unique files
+ old_dlprefiles="$dlprefiles"
+ dlprefiles=
+ for lib in $old_dlprefiles; do
+ case "$dlprefiles " in
+ *" $lib "*) ;;
+ *) dlprefiles="$dlprefiles $lib" ;;
+ esac
+ done
+
+ if test "$build_libtool_libs" = yes; then
+ if test -n "$rpath"; then
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*)
+ # these systems don't actually have a c library (as such)!
+ ;;
+ *-*-rhapsody* | *-*-darwin1.[012])
+ # Rhapsody C library is in the System framework
+ deplibs="$deplibs -framework System"
+ ;;
+ *-*-netbsd*)
+ # Don't link with libc until the a.out ld.so is fixed.
+ ;;
+ *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+ # Do not include libc due to us having libc/libc_r.
+ ;;
+ *-*-sco3.2v5* | *-*-sco5v6*)
+ # Causes problems with __ctype
+ ;;
+ *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+ # Compiler inserts libc in the correct place for threads to work
+ ;;
+ *)
+ # Add libc to deplibs on all other systems if necessary.
+ if test "$build_libtool_need_lc" = "yes"; then
+ deplibs="$deplibs -lc"
+ fi
+ ;;
+ esac
+ fi
+
+ # Transform deplibs into only deplibs that can be linked in shared.
+ name_save=$name
+ libname_save=$libname
+ release_save=$release
+ versuffix_save=$versuffix
+ major_save=$major
+ # I'm not sure if I'm treating the release correctly. I think
+ # release should show up in the -l (ie -lgmp5) so we don't want to
+ # add it in twice. Is that correct?
+ release=""
+ versuffix=""
+ major=""
+ newdeplibs=
+ droppeddeps=no
+ case $deplibs_check_method in
+ pass_all)
+ # Don't check for shared/static. Everything works.
+ # This might be a little naive. We might want to check
+ # whether the library exists or not. But this is on
+ # osf3 & osf4 and I'm not really sure... Just
+ # implementing what was already the behavior.
+ newdeplibs=$deplibs
+ ;;
+ test_compile)
+ # This code stresses the "libraries are programs" paradigm to its
+ # limits. Maybe even breaks it. We compile a program, linking it
+ # against the deplibs as a proxy for the library. Then we can check
+ # whether they linked in statically or dynamically with ldd.
+ $rm conftest.c
+ cat > conftest.c <<EOF
+ int main() { return 0; }
+EOF
+ $rm conftest
+ $LTCC $LTCFLAGS -o conftest conftest.c $deplibs
+ if test "$?" -eq 0 ; then
+ ldd_output=`ldd conftest`
+ for i in $deplibs; do
+ name=`expr $i : '-l\(.*\)'`
+ # If $name is empty we are operating on a -L argument.
+ if test "$name" != "" && test "$name" -ne "0"; then
+ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ case " $predeps $postdeps " in
+ *" $i "*)
+ newdeplibs="$newdeplibs $i"
+ i=""
+ ;;
+ esac
+ fi
+ if test -n "$i" ; then
+ libname=`eval \\$echo \"$libname_spec\"`
+ deplib_matches=`eval \\$echo \"$library_names_spec\"`
+ set dummy $deplib_matches
+ deplib_match=$2
+ if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+ newdeplibs="$newdeplibs $i"
+ else
+ droppeddeps=yes
+ $echo
+ $echo "*** Warning: dynamic linker does not accept needed library $i."
+ $echo "*** I have the capability to make that library automatically link in when"
+ $echo "*** you link to this library. But I can only do this if you have a"
+ $echo "*** shared version of the library, which I believe you do not have"
+ $echo "*** because a test_compile did reveal that the linker did not use it for"
+ $echo "*** its dynamic dependency list that programs get resolved with at runtime."
+ fi
+ fi
+ else
+ newdeplibs="$newdeplibs $i"
+ fi
+ done
+ else
+ # Error occurred in the first compile. Let's try to salvage
+ # the situation: Compile a separate program for each library.
+ for i in $deplibs; do
+ name=`expr $i : '-l\(.*\)'`
+ # If $name is empty we are operating on a -L argument.
+ if test "$name" != "" && test "$name" != "0"; then
+ $rm conftest
+ $LTCC $LTCFLAGS -o conftest conftest.c $i
+ # Did it work?
+ if test "$?" -eq 0 ; then
+ ldd_output=`ldd conftest`
+ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ case " $predeps $postdeps " in
+ *" $i "*)
+ newdeplibs="$newdeplibs $i"
+ i=""
+ ;;
+ esac
+ fi
+ if test -n "$i" ; then
+ libname=`eval \\$echo \"$libname_spec\"`
+ deplib_matches=`eval \\$echo \"$library_names_spec\"`
+ set dummy $deplib_matches
+ deplib_match=$2
+ if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+ newdeplibs="$newdeplibs $i"
+ else
+ droppeddeps=yes
+ $echo
+ $echo "*** Warning: dynamic linker does not accept needed library $i."
+ $echo "*** I have the capability to make that library automatically link in when"
+ $echo "*** you link to this library. But I can only do this if you have a"
+ $echo "*** shared version of the library, which you do not appear to have"
+ $echo "*** because a test_compile did reveal that the linker did not use this one"
+ $echo "*** as a dynamic dependency that programs can get resolved with at runtime."
+ fi
+ fi
+ else
+ droppeddeps=yes
+ $echo
+ $echo "*** Warning! Library $i is needed by this library but I was not able to"
+ $echo "*** make it link in! You will probably need to install it or some"
+ $echo "*** library that it depends on before this library will be fully"
+ $echo "*** functional. Installing it before continuing would be even better."
+ fi
+ else
+ newdeplibs="$newdeplibs $i"
+ fi
+ done
+ fi
+ ;;
+ file_magic*)
+ set dummy $deplibs_check_method
+ file_magic_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
+ for a_deplib in $deplibs; do
+ name=`expr $a_deplib : '-l\(.*\)'`
+ # If $name is empty we are operating on a -L argument.
+ if test "$name" != "" && test "$name" != "0"; then
+ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ case " $predeps $postdeps " in
+ *" $a_deplib "*)
+ newdeplibs="$newdeplibs $a_deplib"
+ a_deplib=""
+ ;;
+ esac
+ fi
+ if test -n "$a_deplib" ; then
+ libname=`eval \\$echo \"$libname_spec\"`
+ for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+ potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+ for potent_lib in $potential_libs; do
+ # Follow soft links.
+ if ls -lLd "$potent_lib" 2>/dev/null \
+ | grep " -> " >/dev/null; then
+ continue
+ fi
+ # The statement above tries to avoid entering an
+ # endless loop below, in case of cyclic links.
+ # We might still enter an endless loop, since a link
+ # loop can be closed while we follow links,
+ # but so what?
+ potlib="$potent_lib"
+ while test -h "$potlib" 2>/dev/null; do
+ potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
+ case $potliblink in
+ [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
+ *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";;
+ esac
+ done
+ if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \
+ | ${SED} 10q \
+ | $EGREP "$file_magic_regex" > /dev/null; then
+ newdeplibs="$newdeplibs $a_deplib"
+ a_deplib=""
+ break 2
+ fi
+ done
+ done
+ fi
+ if test -n "$a_deplib" ; then
+ droppeddeps=yes
+ $echo
+ $echo "*** Warning: linker path does not have real file for library $a_deplib."
+ $echo "*** I have the capability to make that library automatically link in when"
+ $echo "*** you link to this library. But I can only do this if you have a"
+ $echo "*** shared version of the library, which you do not appear to have"
+ $echo "*** because I did check the linker path looking for a file starting"
+ if test -z "$potlib" ; then
+ $echo "*** with $libname but no candidates were found. (...for file magic test)"
+ else
+ $echo "*** with $libname and none of the candidates passed a file format test"
+ $echo "*** using a file magic. Last file checked: $potlib"
+ fi
+ fi
+ else
+ # Add a -L argument.
+ newdeplibs="$newdeplibs $a_deplib"
+ fi
+ done # Gone through all deplibs.
+ ;;
+ match_pattern*)
+ set dummy $deplibs_check_method
+ match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
+ for a_deplib in $deplibs; do
+ name=`expr $a_deplib : '-l\(.*\)'`
+ # If $name is empty we are operating on a -L argument.
+ if test -n "$name" && test "$name" != "0"; then
+ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ case " $predeps $postdeps " in
+ *" $a_deplib "*)
+ newdeplibs="$newdeplibs $a_deplib"
+ a_deplib=""
+ ;;
+ esac
+ fi
+ if test -n "$a_deplib" ; then
+ libname=`eval \\$echo \"$libname_spec\"`
+ for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+ potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+ for potent_lib in $potential_libs; do
+ potlib="$potent_lib" # see symlink-check above in file_magic test
+ if eval $echo \"$potent_lib\" 2>/dev/null \
+ | ${SED} 10q \
+ | $EGREP "$match_pattern_regex" > /dev/null; then
+ newdeplibs="$newdeplibs $a_deplib"
+ a_deplib=""
+ break 2
+ fi
+ done
+ done
+ fi
+ if test -n "$a_deplib" ; then
+ droppeddeps=yes
+ $echo
+ $echo "*** Warning: linker path does not have real file for library $a_deplib."
+ $echo "*** I have the capability to make that library automatically link in when"
+ $echo "*** you link to this library. But I can only do this if you have a"
+ $echo "*** shared version of the library, which you do not appear to have"
+ $echo "*** because I did check the linker path looking for a file starting"
+ if test -z "$potlib" ; then
+ $echo "*** with $libname but no candidates were found. (...for regex pattern test)"
+ else
+ $echo "*** with $libname and none of the candidates passed a file format test"
+ $echo "*** using a regex pattern. Last file checked: $potlib"
+ fi
+ fi
+ else
+ # Add a -L argument.
+ newdeplibs="$newdeplibs $a_deplib"
+ fi
+ done # Gone through all deplibs.
+ ;;
+ none | unknown | *)
+ newdeplibs=""
+ tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \
+ -e 's/ -[LR][^ ]*//g'`
+ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ for i in $predeps $postdeps ; do
+ # can't use Xsed below, because $i might contain '/'
+ tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"`
+ done
+ fi
+ if $echo "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' \
+ | grep . >/dev/null; then
+ $echo
+ if test "X$deplibs_check_method" = "Xnone"; then
+ $echo "*** Warning: inter-library dependencies are not supported in this platform."
+ else
+ $echo "*** Warning: inter-library dependencies are not known to be supported."
+ fi
+ $echo "*** All declared inter-library dependencies are being dropped."
+ droppeddeps=yes
+ fi
+ ;;
+ esac
+ versuffix=$versuffix_save
+ major=$major_save
+ release=$release_save
+ libname=$libname_save
+ name=$name_save
+
+ case $host in
+ *-*-rhapsody* | *-*-darwin1.[012])
+ # On Rhapsody replace the C library is the System framework
+ newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'`
+ ;;
+ esac
+
+ if test "$droppeddeps" = yes; then
+ if test "$module" = yes; then
+ $echo
+ $echo "*** Warning: libtool could not satisfy all declared inter-library"
+ $echo "*** dependencies of module $libname. Therefore, libtool will create"
+ $echo "*** a static module, that should work as long as the dlopening"
+ $echo "*** application is linked with the -dlopen flag."
+ if test -z "$global_symbol_pipe"; then
+ $echo
+ $echo "*** However, this would only work if libtool was able to extract symbol"
+ $echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+ $echo "*** not find such a program. So, this module is probably useless."
+ $echo "*** \`nm' from GNU binutils and a full rebuild may help."
+ fi
+ if test "$build_old_libs" = no; then
+ oldlibs="$output_objdir/$libname.$libext"
+ build_libtool_libs=module
+ build_old_libs=yes
+ else
+ build_libtool_libs=no
+ fi
+ else
+ $echo "*** The inter-library dependencies that have been dropped here will be"
+ $echo "*** automatically added whenever a program is linked with this library"
+ $echo "*** or is declared to -dlopen it."
+
+ if test "$allow_undefined" = no; then
+ $echo
+ $echo "*** Since this library must not contain undefined symbols,"
+ $echo "*** because either the platform does not support them or"
+ $echo "*** it was explicitly requested with -no-undefined,"
+ $echo "*** libtool will only create a static version of it."
+ if test "$build_old_libs" = no; then
+ oldlibs="$output_objdir/$libname.$libext"
+ build_libtool_libs=module
+ build_old_libs=yes
+ else
+ build_libtool_libs=no
+ fi
+ fi
+ fi
+ fi
+ # Done checking deplibs!
+ deplibs=$newdeplibs
+ fi
+
+
+ # move library search paths that coincide with paths to not yet
+ # installed libraries to the beginning of the library search list
+ new_libs=
+ for path in $notinst_path; do
+ case " $new_libs " in
+ *" -L$path/$objdir "*) ;;
+ *)
+ case " $deplibs " in
+ *" -L$path/$objdir "*)
+ new_libs="$new_libs -L$path/$objdir" ;;
+ esac
+ ;;
+ esac
+ done
+ for deplib in $deplibs; do
+ case $deplib in
+ -L*)
+ case " $new_libs " in
+ *" $deplib "*) ;;
+ *) new_libs="$new_libs $deplib" ;;
+ esac
+ ;;
+ *) new_libs="$new_libs $deplib" ;;
+ esac
+ done
+ deplibs="$new_libs"
+
+
+ # All the library-specific variables (install_libdir is set above).
+ library_names=
+ old_library=
+ dlname=
+
+ # Test again, we may have decided not to build it any more
+ if test "$build_libtool_libs" = yes; then
+ if test "$hardcode_into_libs" = yes; then
+ # Hardcode the library paths
+ hardcode_libdirs=
+ dep_rpath=
+ rpath="$finalize_rpath"
+ test "$mode" != relink && rpath="$compile_rpath$rpath"
+ for libdir in $rpath; do
+ if test -n "$hardcode_libdir_flag_spec"; then
+ if test -n "$hardcode_libdir_separator"; then
+ if test -z "$hardcode_libdirs"; then
+ hardcode_libdirs="$libdir"
+ else
+ # Just accumulate the unique libdirs.
+ case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+ *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+ ;;
+ *)
+ hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+ ;;
+ esac
+ fi
+ else
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ dep_rpath="$dep_rpath $flag"
+ fi
+ elif test -n "$runpath_var"; then
+ case "$perm_rpath " in
+ *" $libdir "*) ;;
+ *) perm_rpath="$perm_rpath $libdir" ;;
+ esac
+ fi
+ done
+ # Substitute the hardcoded libdirs into the rpath.
+ if test -n "$hardcode_libdir_separator" &&
+ test -n "$hardcode_libdirs"; then
+ libdir="$hardcode_libdirs"
+ if test -n "$hardcode_libdir_flag_spec_ld"; then
+ eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\"
+ else
+ eval dep_rpath=\"$hardcode_libdir_flag_spec\"
+ fi
+ fi
+ if test -n "$runpath_var" && test -n "$perm_rpath"; then
+ # We should set the runpath_var.
+ rpath=
+ for dir in $perm_rpath; do
+ rpath="$rpath$dir:"
+ done
+ eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
+ fi
+ test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
+ fi
+
+ shlibpath="$finalize_shlibpath"
+ test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
+ if test -n "$shlibpath"; then
+ eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
+ fi
+
+ # Get the real and link names of the library.
+ eval shared_ext=\"$shrext_cmds\"
+ eval library_names=\"$library_names_spec\"
+ set dummy $library_names
+ realname="$2"
+ shift; shift
+
+ if test -n "$soname_spec"; then
+ eval soname=\"$soname_spec\"
+ else
+ soname="$realname"
+ fi
+ if test -z "$dlname"; then
+ dlname=$soname
+ fi
+
+ lib="$output_objdir/$realname"
+ linknames=
+ for link
+ do
+ linknames="$linknames $link"
+ done
+
+ # Use standard objects if they are pic
+ test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+
+ # Prepare the list of exported symbols
+ if test -z "$export_symbols"; then
+ if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
+ $show "generating symbol list for \`$libname.la'"
+ export_symbols="$output_objdir/$libname.exp"
+ $run $rm $export_symbols
+ cmds=$export_symbols_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ if len=`expr "X$cmd" : ".*"` &&
+ test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ skipped_export=false
+ else
+ # The command line is too long to execute in one step.
+ $show "using reloadable object file for export list..."
+ skipped_export=:
+ # Break out early, otherwise skipped_export may be
+ # set to false by a later but shorter cmd.
+ break
+ fi
+ done
+ IFS="$save_ifs"
+ if test -n "$export_symbols_regex"; then
+ $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\""
+ $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+ $show "$mv \"${export_symbols}T\" \"$export_symbols\""
+ $run eval '$mv "${export_symbols}T" "$export_symbols"'
+ fi
+ fi
+ fi
+
+ if test -n "$export_symbols" && test -n "$include_expsyms"; then
+ $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"'
+ fi
+
+ tmp_deplibs=
+ for test_deplib in $deplibs; do
+ case " $convenience " in
+ *" $test_deplib "*) ;;
+ *)
+ tmp_deplibs="$tmp_deplibs $test_deplib"
+ ;;
+ esac
+ done
+ deplibs="$tmp_deplibs"
+
+ if test -n "$convenience"; then
+ if test -n "$whole_archive_flag_spec"; then
+ save_libobjs=$libobjs
+ eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+ else
+ gentop="$output_objdir/${outputname}x"
+ generated="$generated $gentop"
+
+ func_extract_archives $gentop $convenience
+ libobjs="$libobjs $func_extract_archives_result"
+ fi
+ fi
+
+ if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
+ eval flag=\"$thread_safe_flag_spec\"
+ linker_flags="$linker_flags $flag"
+ fi
+
+ # Make a backup of the uninstalled library when relinking
+ if test "$mode" = relink; then
+ $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $?
+ fi
+
+ # Do each of the archive commands.
+ if test "$module" = yes && test -n "$module_cmds" ; then
+ if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+ eval test_cmds=\"$module_expsym_cmds\"
+ cmds=$module_expsym_cmds
+ else
+ eval test_cmds=\"$module_cmds\"
+ cmds=$module_cmds
+ fi
+ else
+ if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+ eval test_cmds=\"$archive_expsym_cmds\"
+ cmds=$archive_expsym_cmds
+ else
+ eval test_cmds=\"$archive_cmds\"
+ cmds=$archive_cmds
+ fi
+ fi
+
+ if test "X$skipped_export" != "X:" &&
+ len=`expr "X$test_cmds" : ".*" 2>/dev/null` &&
+ test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+ :
+ else
+ # The command line is too long to link in one step, link piecewise.
+ $echo "creating reloadable object files..."
+
+ # Save the value of $output and $libobjs because we want to
+ # use them later. If we have whole_archive_flag_spec, we
+ # want to use save_libobjs as it was before
+ # whole_archive_flag_spec was expanded, because we can't
+ # assume the linker understands whole_archive_flag_spec.
+ # This may have to be revisited, in case too many
+ # convenience libraries get linked in and end up exceeding
+ # the spec.
+ if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
+ save_libobjs=$libobjs
+ fi
+ save_output=$output
+ output_la=`$echo "X$output" | $Xsed -e "$basename"`
+
+ # Clear the reloadable object creation command queue and
+ # initialize k to one.
+ test_cmds=
+ concat_cmds=
+ objlist=
+ delfiles=
+ last_robj=
+ k=1
+ output=$output_objdir/$output_la-${k}.$objext
+ # Loop over the list of objects to be linked.
+ for obj in $save_libobjs
+ do
+ eval test_cmds=\"$reload_cmds $objlist $last_robj\"
+ if test "X$objlist" = X ||
+ { len=`expr "X$test_cmds" : ".*" 2>/dev/null` &&
+ test "$len" -le "$max_cmd_len"; }; then
+ objlist="$objlist $obj"
+ else
+ # The command $test_cmds is almost too long, add a
+ # command to the queue.
+ if test "$k" -eq 1 ; then
+ # The first file doesn't have a previous command to add.
+ eval concat_cmds=\"$reload_cmds $objlist $last_robj\"
+ else
+ # All subsequent reloadable object files will link in
+ # the last one created.
+ eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\"
+ fi
+ last_robj=$output_objdir/$output_la-${k}.$objext
+ k=`expr $k + 1`
+ output=$output_objdir/$output_la-${k}.$objext
+ objlist=$obj
+ len=1
+ fi
+ done
+ # Handle the remaining objects by creating one last
+ # reloadable object file. All subsequent reloadable object
+ # files will link in the last one created.
+ test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+ eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\"
+
+ if ${skipped_export-false}; then
+ $show "generating symbol list for \`$libname.la'"
+ export_symbols="$output_objdir/$libname.exp"
+ $run $rm $export_symbols
+ libobjs=$output
+ # Append the command to create the export file.
+ eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\"
+ fi
+
+ # Set up a command to remove the reloadable object files
+ # after they are used.
+ i=0
+ while test "$i" -lt "$k"
+ do
+ i=`expr $i + 1`
+ delfiles="$delfiles $output_objdir/$output_la-${i}.$objext"
+ done
+
+ $echo "creating a temporary reloadable object file: $output"
+
+ # Loop through the commands generated above and execute them.
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $concat_cmds; do
+ IFS="$save_ifs"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+
+ libobjs=$output
+ # Restore the value of output.
+ output=$save_output
+
+ if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
+ eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+ fi
+ # Expand the library linking commands again to reset the
+ # value of $libobjs for piecewise linking.
+
+ # Do each of the archive commands.
+ if test "$module" = yes && test -n "$module_cmds" ; then
+ if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+ cmds=$module_expsym_cmds
+ else
+ cmds=$module_cmds
+ fi
+ else
+ if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+ cmds=$archive_expsym_cmds
+ else
+ cmds=$archive_cmds
+ fi
+ fi
+
+ # Append the command to remove the reloadable object files
+ # to the just-reset $cmds.
+ eval cmds=\"\$cmds~\$rm $delfiles\"
+ fi
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || {
+ lt_exit=$?
+
+ # Restore the uninstalled library and exit
+ if test "$mode" = relink; then
+ $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)'
+ fi
+
+ exit $lt_exit
+ }
+ done
+ IFS="$save_ifs"
+
+ # Restore the uninstalled library and exit
+ if test "$mode" = relink; then
+ $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $?
+
+ if test -n "$convenience"; then
+ if test -z "$whole_archive_flag_spec"; then
+ $show "${rm}r $gentop"
+ $run ${rm}r "$gentop"
+ fi
+ fi
+
+ exit $EXIT_SUCCESS
+ fi
+
+ # Create links to the real library.
+ for linkname in $linknames; do
+ if test "$realname" != "$linkname"; then
+ $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)"
+ $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $?
+ fi
+ done
+
+ # If -module or -export-dynamic was specified, set the dlname.
+ if test "$module" = yes || test "$export_dynamic" = yes; then
+ # On all known operating systems, these are identical.
+ dlname="$soname"
+ fi
+ fi
+ ;;
+
+ obj)
+ if test -n "$deplibs"; then
+ $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2
+ fi
+
+ if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+ $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2
+ fi
+
+ if test -n "$rpath"; then
+ $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2
+ fi
+
+ if test -n "$xrpath"; then
+ $echo "$modename: warning: \`-R' is ignored for objects" 1>&2
+ fi
+
+ if test -n "$vinfo"; then
+ $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2
+ fi
+
+ if test -n "$release"; then
+ $echo "$modename: warning: \`-release' is ignored for objects" 1>&2
+ fi
+
+ case $output in
+ *.lo)
+ if test -n "$objs$old_deplibs"; then
+ $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ libobj="$output"
+ obj=`$echo "X$output" | $Xsed -e "$lo2o"`
+ ;;
+ *)
+ libobj=
+ obj="$output"
+ ;;
+ esac
+
+ # Delete the old objects.
+ $run $rm $obj $libobj
+
+ # Objects from convenience libraries. This assumes
+ # single-version convenience libraries. Whenever we create
+ # different ones for PIC/non-PIC, this we'll have to duplicate
+ # the extraction.
+ reload_conv_objs=
+ gentop=
+ # reload_cmds runs $LD directly, so let us get rid of
+ # -Wl from whole_archive_flag_spec
+ wl=
+
+ if test -n "$convenience"; then
+ if test -n "$whole_archive_flag_spec"; then
+ eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\"
+ else
+ gentop="$output_objdir/${obj}x"
+ generated="$generated $gentop"
+
+ func_extract_archives $gentop $convenience
+ reload_conv_objs="$reload_objs $func_extract_archives_result"
+ fi
+ fi
+
+ # Create the old-style object.
+ reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
+
+ output="$obj"
+ cmds=$reload_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+
+ # Exit if we aren't doing a library object file.
+ if test -z "$libobj"; then
+ if test -n "$gentop"; then
+ $show "${rm}r $gentop"
+ $run ${rm}r $gentop
+ fi
+
+ exit $EXIT_SUCCESS
+ fi
+
+ if test "$build_libtool_libs" != yes; then
+ if test -n "$gentop"; then
+ $show "${rm}r $gentop"
+ $run ${rm}r $gentop
+ fi
+
+ # Create an invalid libtool object if no PIC, so that we don't
+ # accidentally link it into a program.
+ # $show "echo timestamp > $libobj"
+ # $run eval "echo timestamp > $libobj" || exit $?
+ exit $EXIT_SUCCESS
+ fi
+
+ if test -n "$pic_flag" || test "$pic_mode" != default; then
+ # Only do commands if we really have different PIC objects.
+ reload_objs="$libobjs $reload_conv_objs"
+ output="$libobj"
+ cmds=$reload_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ fi
+
+ if test -n "$gentop"; then
+ $show "${rm}r $gentop"
+ $run ${rm}r $gentop
+ fi
+
+ exit $EXIT_SUCCESS
+ ;;
+
+ prog)
+ case $host in
+ *cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;;
+ esac
+ if test -n "$vinfo"; then
+ $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2
+ fi
+
+ if test -n "$release"; then
+ $echo "$modename: warning: \`-release' is ignored for programs" 1>&2
+ fi
+
+ if test "$preload" = yes; then
+ if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown &&
+ test "$dlopen_self_static" = unknown; then
+ $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support."
+ fi
+ fi
+
+ case $host in
+ *-*-rhapsody* | *-*-darwin1.[012])
+ # On Rhapsody replace the C library is the System framework
+ compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'`
+ finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'`
+ ;;
+ esac
+
+ case $host in
+ *darwin*)
+ # Don't allow lazy linking, it breaks C++ global constructors
+ if test "$tagname" = CXX ; then
+ compile_command="$compile_command ${wl}-bind_at_load"
+ finalize_command="$finalize_command ${wl}-bind_at_load"
+ fi
+ ;;
+ esac
+
+
+ # move library search paths that coincide with paths to not yet
+ # installed libraries to the beginning of the library search list
+ new_libs=
+ for path in $notinst_path; do
+ case " $new_libs " in
+ *" -L$path/$objdir "*) ;;
+ *)
+ case " $compile_deplibs " in
+ *" -L$path/$objdir "*)
+ new_libs="$new_libs -L$path/$objdir" ;;
+ esac
+ ;;
+ esac
+ done
+ for deplib in $compile_deplibs; do
+ case $deplib in
+ -L*)
+ case " $new_libs " in
+ *" $deplib "*) ;;
+ *) new_libs="$new_libs $deplib" ;;
+ esac
+ ;;
+ *) new_libs="$new_libs $deplib" ;;
+ esac
+ done
+ compile_deplibs="$new_libs"
+
+
+ compile_command="$compile_command $compile_deplibs"
+ finalize_command="$finalize_command $finalize_deplibs"
+
+ if test -n "$rpath$xrpath"; then
+ # If the user specified any rpath flags, then add them.
+ for libdir in $rpath $xrpath; do
+ # This is the magic to use -rpath.
+ case "$finalize_rpath " in
+ *" $libdir "*) ;;
+ *) finalize_rpath="$finalize_rpath $libdir" ;;
+ esac
+ done
+ fi
+
+ # Now hardcode the library paths
+ rpath=
+ hardcode_libdirs=
+ for libdir in $compile_rpath $finalize_rpath; do
+ if test -n "$hardcode_libdir_flag_spec"; then
+ if test -n "$hardcode_libdir_separator"; then
+ if test -z "$hardcode_libdirs"; then
+ hardcode_libdirs="$libdir"
+ else
+ # Just accumulate the unique libdirs.
+ case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+ *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+ ;;
+ *)
+ hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+ ;;
+ esac
+ fi
+ else
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ rpath="$rpath $flag"
+ fi
+ elif test -n "$runpath_var"; then
+ case "$perm_rpath " in
+ *" $libdir "*) ;;
+ *) perm_rpath="$perm_rpath $libdir" ;;
+ esac
+ fi
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+ testbindir=`$echo "X$libdir" | $Xsed -e 's*/lib$*/bin*'`
+ case :$dllsearchpath: in
+ *":$libdir:"*) ;;
+ *) dllsearchpath="$dllsearchpath:$libdir";;
+ esac
+ case :$dllsearchpath: in
+ *":$testbindir:"*) ;;
+ *) dllsearchpath="$dllsearchpath:$testbindir";;
+ esac
+ ;;
+ esac
+ done
+ # Substitute the hardcoded libdirs into the rpath.
+ if test -n "$hardcode_libdir_separator" &&
+ test -n "$hardcode_libdirs"; then
+ libdir="$hardcode_libdirs"
+ eval rpath=\" $hardcode_libdir_flag_spec\"
+ fi
+ compile_rpath="$rpath"
+
+ rpath=
+ hardcode_libdirs=
+ for libdir in $finalize_rpath; do
+ if test -n "$hardcode_libdir_flag_spec"; then
+ if test -n "$hardcode_libdir_separator"; then
+ if test -z "$hardcode_libdirs"; then
+ hardcode_libdirs="$libdir"
+ else
+ # Just accumulate the unique libdirs.
+ case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+ *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+ ;;
+ *)
+ hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+ ;;
+ esac
+ fi
+ else
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ rpath="$rpath $flag"
+ fi
+ elif test -n "$runpath_var"; then
+ case "$finalize_perm_rpath " in
+ *" $libdir "*) ;;
+ *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;;
+ esac
+ fi
+ done
+ # Substitute the hardcoded libdirs into the rpath.
+ if test -n "$hardcode_libdir_separator" &&
+ test -n "$hardcode_libdirs"; then
+ libdir="$hardcode_libdirs"
+ eval rpath=\" $hardcode_libdir_flag_spec\"
+ fi
+ finalize_rpath="$rpath"
+
+ if test -n "$libobjs" && test "$build_old_libs" = yes; then
+ # Transform all the library objects into standard objects.
+ compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+ finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+ fi
+
+ dlsyms=
+ if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+ if test -n "$NM" && test -n "$global_symbol_pipe"; then
+ dlsyms="${outputname}S.c"
+ else
+ $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2
+ fi
+ fi
+
+ if test -n "$dlsyms"; then
+ case $dlsyms in
+ "") ;;
+ *.c)
+ # Discover the nlist of each of the dlfiles.
+ nlist="$output_objdir/${outputname}.nm"
+
+ $show "$rm $nlist ${nlist}S ${nlist}T"
+ $run $rm "$nlist" "${nlist}S" "${nlist}T"
+
+ # Parse the name list into a source file.
+ $show "creating $output_objdir/$dlsyms"
+
+ test -z "$run" && $echo > "$output_objdir/$dlsyms" "\
+/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */
+/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */
+
+#ifdef __cplusplus
+extern \"C\" {
+#endif
+
+/* Prevent the only kind of declaration conflicts we can make. */
+#define lt_preloaded_symbols some_other_symbol
+
+/* External symbol declarations for the compiler. */\
+"
+
+ if test "$dlself" = yes; then
+ $show "generating symbol list for \`$output'"
+
+ test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist"
+
+ # Add our own program objects to the symbol list.
+ progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+ for arg in $progfiles; do
+ $show "extracting global C symbols from \`$arg'"
+ $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
+ done
+
+ if test -n "$exclude_expsyms"; then
+ $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
+ $run eval '$mv "$nlist"T "$nlist"'
+ fi
+
+ if test -n "$export_symbols_regex"; then
+ $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
+ $run eval '$mv "$nlist"T "$nlist"'
+ fi
+
+ # Prepare the list of exported symbols
+ if test -z "$export_symbols"; then
+ export_symbols="$output_objdir/$outputname.exp"
+ $run $rm $export_symbols
+ $run eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
+ case $host in
+ *cygwin* | *mingw* )
+ $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+ $run eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
+ ;;
+ esac
+ else
+ $run eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
+ $run eval 'grep -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
+ $run eval 'mv "$nlist"T "$nlist"'
+ case $host in
+ *cygwin* | *mingw* )
+ $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+ $run eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
+ ;;
+ esac
+ fi
+ fi
+
+ for arg in $dlprefiles; do
+ $show "extracting global C symbols from \`$arg'"
+ name=`$echo "$arg" | ${SED} -e 's%^.*/%%'`
+ $run eval '$echo ": $name " >> "$nlist"'
+ $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
+ done
+
+ if test -z "$run"; then
+ # Make sure we have at least an empty file.
+ test -f "$nlist" || : > "$nlist"
+
+ if test -n "$exclude_expsyms"; then
+ $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
+ $mv "$nlist"T "$nlist"
+ fi
+
+ # Try sorting and uniquifying the output.
+ if grep -v "^: " < "$nlist" |
+ if sort -k 3 </dev/null >/dev/null 2>&1; then
+ sort -k 3
+ else
+ sort +2
+ fi |
+ uniq > "$nlist"S; then
+ :
+ else
+ grep -v "^: " < "$nlist" > "$nlist"S
+ fi
+
+ if test -f "$nlist"S; then
+ eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"'
+ else
+ $echo '/* NONE */' >> "$output_objdir/$dlsyms"
+ fi
+
+ $echo >> "$output_objdir/$dlsyms" "\
+
+#undef lt_preloaded_symbols
+
+#if defined (__STDC__) && __STDC__
+# define lt_ptr void *
+#else
+# define lt_ptr char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+"
+
+ case $host in
+ *cygwin* | *mingw* )
+ $echo >> "$output_objdir/$dlsyms" "\
+/* DATA imports from DLLs on WIN32 can't be const, because
+ runtime relocations are performed -- see ld's documentation
+ on pseudo-relocs */
+struct {
+"
+ ;;
+ * )
+ $echo >> "$output_objdir/$dlsyms" "\
+const struct {
+"
+ ;;
+ esac
+
+
+ $echo >> "$output_objdir/$dlsyms" "\
+ const char *name;
+ lt_ptr address;
+}
+lt_preloaded_symbols[] =
+{\
+"
+
+ eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms"
+
+ $echo >> "$output_objdir/$dlsyms" "\
+ {0, (lt_ptr) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+ return lt_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif\
+"
+ fi
+
+ pic_flag_for_symtable=
+ case $host in
+ # compiling the symbol table file with pic_flag works around
+ # a FreeBSD bug that causes programs to crash when -lm is
+ # linked before any other PIC object. But we must not use
+ # pic_flag when linking with -static. The problem exists in
+ # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
+ *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
+ case "$compile_command " in
+ *" -static "*) ;;
+ *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";;
+ esac;;
+ *-*-hpux*)
+ case "$compile_command " in
+ *" -static "*) ;;
+ *) pic_flag_for_symtable=" $pic_flag";;
+ esac
+ esac
+
+ # Now compile the dynamic symbol file.
+ $show "(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")"
+ $run eval '(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $?
+
+ # Clean up the generated files.
+ $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T"
+ $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T"
+
+ # Transform the symbol file into the correct name.
+ case $host in
+ *cygwin* | *mingw* )
+ if test -f "$output_objdir/${outputname}.def" ; then
+ compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%"`
+ finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%"`
+ else
+ compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
+ finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
+ fi
+ ;;
+ * )
+ compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
+ finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
+ ;;
+ esac
+ ;;
+ *)
+ $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+ else
+ # We keep going just in case the user didn't refer to
+ # lt_preloaded_symbols. The linker will fail if global_symbol_pipe
+ # really was required.
+
+ # Nullify the symbol file.
+ compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"`
+ finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"`
+ fi
+
+ if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
+ # Replace the output file specification.
+ compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+ link_command="$compile_command$compile_rpath"
+
+ # We have no uninstalled library dependencies, so finalize right now.
+ $show "$link_command"
+ $run eval "$link_command"
+ exit_status=$?
+
+ # Delete the generated files.
+ if test -n "$dlsyms"; then
+ $show "$rm $output_objdir/${outputname}S.${objext}"
+ $run $rm "$output_objdir/${outputname}S.${objext}"
+ fi
+
+ exit $exit_status
+ fi
+
+ if test -n "$shlibpath_var"; then
+ # We should set the shlibpath_var
+ rpath=
+ for dir in $temp_rpath; do
+ case $dir in
+ [\\/]* | [A-Za-z]:[\\/]*)
+ # Absolute path.
+ rpath="$rpath$dir:"
+ ;;
+ *)
+ # Relative path: add a thisdir entry.
+ rpath="$rpath\$thisdir/$dir:"
+ ;;
+ esac
+ done
+ temp_rpath="$rpath"
+ fi
+
+ if test -n "$compile_shlibpath$finalize_shlibpath"; then
+ compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
+ fi
+ if test -n "$finalize_shlibpath"; then
+ finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
+ fi
+
+ compile_var=
+ finalize_var=
+ if test -n "$runpath_var"; then
+ if test -n "$perm_rpath"; then
+ # We should set the runpath_var.
+ rpath=
+ for dir in $perm_rpath; do
+ rpath="$rpath$dir:"
+ done
+ compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
+ fi
+ if test -n "$finalize_perm_rpath"; then
+ # We should set the runpath_var.
+ rpath=
+ for dir in $finalize_perm_rpath; do
+ rpath="$rpath$dir:"
+ done
+ finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
+ fi
+ fi
+
+ if test "$no_install" = yes; then
+ # We don't need to create a wrapper script.
+ link_command="$compile_var$compile_command$compile_rpath"
+ # Replace the output file specification.
+ link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+ # Delete the old output file.
+ $run $rm $output
+ # Link the executable and exit
+ $show "$link_command"
+ $run eval "$link_command" || exit $?
+ exit $EXIT_SUCCESS
+ fi
+
+ if test "$hardcode_action" = relink; then
+ # Fast installation is not supported
+ link_command="$compile_var$compile_command$compile_rpath"
+ relink_command="$finalize_var$finalize_command$finalize_rpath"
+
+ $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2
+ $echo "$modename: \`$output' will be relinked during installation" 1>&2
+ else
+ if test "$fast_install" != no; then
+ link_command="$finalize_var$compile_command$finalize_rpath"
+ if test "$fast_install" = yes; then
+ relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'`
+ else
+ # fast_install is set to needless
+ relink_command=
+ fi
+ else
+ link_command="$compile_var$compile_command$compile_rpath"
+ relink_command="$finalize_var$finalize_command$finalize_rpath"
+ fi
+ fi
+
+ # Replace the output file specification.
+ link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
+
+ # Delete the old output files.
+ $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname
+
+ $show "$link_command"
+ $run eval "$link_command" || exit $?
+
+ # Now create the wrapper script.
+ $show "creating $output"
+
+ # Quote the relink command for shipping.
+ if test -n "$relink_command"; then
+ # Preserve any variables that may affect compiler behavior
+ for var in $variables_saved_for_relink; do
+ if eval test -z \"\${$var+set}\"; then
+ relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command"
+ elif eval var_value=\$$var; test -z "$var_value"; then
+ relink_command="$var=; export $var; $relink_command"
+ else
+ var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"`
+ relink_command="$var=\"$var_value\"; export $var; $relink_command"
+ fi
+ done
+ relink_command="(cd `pwd`; $relink_command)"
+ relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"`
+ fi
+
+ # Quote $echo for shipping.
+ if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then
+ case $progpath in
+ [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";;
+ *) qecho="$SHELL `pwd`/$progpath --fallback-echo";;
+ esac
+ qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"`
+ else
+ qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"`
+ fi
+
+ # Only actually do things if our run command is non-null.
+ if test -z "$run"; then
+ # win32 will think the script is a binary if it has
+ # a .exe suffix, so we strip it off here.
+ case $output in
+ *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;;
+ esac
+ # test for cygwin because mv fails w/o .exe extensions
+ case $host in
+ *cygwin*)
+ exeext=.exe
+ outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;;
+ *) exeext= ;;
+ esac
+ case $host in
+ *cygwin* | *mingw* )
+ output_name=`basename $output`
+ output_path=`dirname $output`
+ cwrappersource="$output_path/$objdir/lt-$output_name.c"
+ cwrapper="$output_path/$output_name.exe"
+ $rm $cwrappersource $cwrapper
+ trap "$rm $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
+
+ cat > $cwrappersource <<EOF
+
+/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
+ Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+
+ The $output program cannot be directly executed until all the libtool
+ libraries that it depends on are installed.
+
+ This wrapper executable should never be moved out of the build directory.
+ If it is, it will not operate correctly.
+
+ Currently, it simply execs the wrapper *script* "/bin/sh $output",
+ but could eventually absorb all of the scripts functionality and
+ exec $objdir/$outputname directly.
+*/
+EOF
+ cat >> $cwrappersource<<"EOF"
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <malloc.h>
+#include <stdarg.h>
+#include <assert.h>
+#include <string.h>
+#include <ctype.h>
+#include <sys/stat.h>
+
+#if defined(PATH_MAX)
+# define LT_PATHMAX PATH_MAX
+#elif defined(MAXPATHLEN)
+# define LT_PATHMAX MAXPATHLEN
+#else
+# define LT_PATHMAX 1024
+#endif
+
+#ifndef DIR_SEPARATOR
+# define DIR_SEPARATOR '/'
+# define PATH_SEPARATOR ':'
+#endif
+
+#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
+ defined (__OS2__)
+# define HAVE_DOS_BASED_FILE_SYSTEM
+# ifndef DIR_SEPARATOR_2
+# define DIR_SEPARATOR_2 '\\'
+# endif
+# ifndef PATH_SEPARATOR_2
+# define PATH_SEPARATOR_2 ';'
+# endif
+#endif
+
+#ifndef DIR_SEPARATOR_2
+# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
+#else /* DIR_SEPARATOR_2 */
+# define IS_DIR_SEPARATOR(ch) \
+ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
+#endif /* DIR_SEPARATOR_2 */
+
+#ifndef PATH_SEPARATOR_2
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
+#else /* PATH_SEPARATOR_2 */
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
+#endif /* PATH_SEPARATOR_2 */
+
+#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type)))
+#define XFREE(stale) do { \
+ if (stale) { free ((void *) stale); stale = 0; } \
+} while (0)
+
+/* -DDEBUG is fairly common in CFLAGS. */
+#undef DEBUG
+#if defined DEBUGWRAPPER
+# define DEBUG(format, ...) fprintf(stderr, format, __VA_ARGS__)
+#else
+# define DEBUG(format, ...)
+#endif
+
+const char *program_name = NULL;
+
+void * xmalloc (size_t num);
+char * xstrdup (const char *string);
+const char * base_name (const char *name);
+char * find_executable(const char *wrapper);
+int check_executable(const char *path);
+char * strendzap(char *str, const char *pat);
+void lt_fatal (const char *message, ...);
+
+int
+main (int argc, char *argv[])
+{
+ char **newargz;
+ int i;
+
+ program_name = (char *) xstrdup (base_name (argv[0]));
+ DEBUG("(main) argv[0] : %s\n",argv[0]);
+ DEBUG("(main) program_name : %s\n",program_name);
+ newargz = XMALLOC(char *, argc+2);
+EOF
+
+ cat >> $cwrappersource <<EOF
+ newargz[0] = (char *) xstrdup("$SHELL");
+EOF
+
+ cat >> $cwrappersource <<"EOF"
+ newargz[1] = find_executable(argv[0]);
+ if (newargz[1] == NULL)
+ lt_fatal("Couldn't find %s", argv[0]);
+ DEBUG("(main) found exe at : %s\n",newargz[1]);
+ /* we know the script has the same name, without the .exe */
+ /* so make sure newargz[1] doesn't end in .exe */
+ strendzap(newargz[1],".exe");
+ for (i = 1; i < argc; i++)
+ newargz[i+1] = xstrdup(argv[i]);
+ newargz[argc+1] = NULL;
+
+ for (i=0; i<argc+1; i++)
+ {
+ DEBUG("(main) newargz[%d] : %s\n",i,newargz[i]);
+ ;
+ }
+
+EOF
+
+ case $host_os in
+ mingw*)
+ cat >> $cwrappersource <<EOF
+ execv("$SHELL",(char const **)newargz);
+EOF
+ ;;
+ *)
+ cat >> $cwrappersource <<EOF
+ execv("$SHELL",newargz);
+EOF
+ ;;
+ esac
+
+ cat >> $cwrappersource <<"EOF"
+ return 127;
+}
+
+void *
+xmalloc (size_t num)
+{
+ void * p = (void *) malloc (num);
+ if (!p)
+ lt_fatal ("Memory exhausted");
+
+ return p;
+}
+
+char *
+xstrdup (const char *string)
+{
+ return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL
+;
+}
+
+const char *
+base_name (const char *name)
+{
+ const char *base;
+
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+ /* Skip over the disk name in MSDOS pathnames. */
+ if (isalpha ((unsigned char)name[0]) && name[1] == ':')
+ name += 2;
+#endif
+
+ for (base = name; *name; name++)
+ if (IS_DIR_SEPARATOR (*name))
+ base = name + 1;
+ return base;
+}
+
+int
+check_executable(const char * path)
+{
+ struct stat st;
+
+ DEBUG("(check_executable) : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!");
+ if ((!path) || (!*path))
+ return 0;
+
+ if ((stat (path, &st) >= 0) &&
+ (
+ /* MinGW & native WIN32 do not support S_IXOTH or S_IXGRP */
+#if defined (S_IXOTH)
+ ((st.st_mode & S_IXOTH) == S_IXOTH) ||
+#endif
+#if defined (S_IXGRP)
+ ((st.st_mode & S_IXGRP) == S_IXGRP) ||
+#endif
+ ((st.st_mode & S_IXUSR) == S_IXUSR))
+ )
+ return 1;
+ else
+ return 0;
+}
+
+/* Searches for the full path of the wrapper. Returns
+ newly allocated full path name if found, NULL otherwise */
+char *
+find_executable (const char* wrapper)
+{
+ int has_slash = 0;
+ const char* p;
+ const char* p_next;
+ /* static buffer for getcwd */
+ char tmp[LT_PATHMAX + 1];
+ int tmp_len;
+ char* concat_name;
+
+ DEBUG("(find_executable) : %s\n", wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!");
+
+ if ((wrapper == NULL) || (*wrapper == '\0'))
+ return NULL;
+
+ /* Absolute path? */
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+ if (isalpha ((unsigned char)wrapper[0]) && wrapper[1] == ':')
+ {
+ concat_name = xstrdup (wrapper);
+ if (check_executable(concat_name))
+ return concat_name;
+ XFREE(concat_name);
+ }
+ else
+ {
+#endif
+ if (IS_DIR_SEPARATOR (wrapper[0]))
+ {
+ concat_name = xstrdup (wrapper);
+ if (check_executable(concat_name))
+ return concat_name;
+ XFREE(concat_name);
+ }
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+ }
+#endif
+
+ for (p = wrapper; *p; p++)
+ if (*p == '/')
+ {
+ has_slash = 1;
+ break;
+ }
+ if (!has_slash)
+ {
+ /* no slashes; search PATH */
+ const char* path = getenv ("PATH");
+ if (path != NULL)
+ {
+ for (p = path; *p; p = p_next)
+ {
+ const char* q;
+ size_t p_len;
+ for (q = p; *q; q++)
+ if (IS_PATH_SEPARATOR(*q))
+ break;
+ p_len = q - p;
+ p_next = (*q == '\0' ? q : q + 1);
+ if (p_len == 0)
+ {
+ /* empty path: current directory */
+ if (getcwd (tmp, LT_PATHMAX) == NULL)
+ lt_fatal ("getcwd failed");
+ tmp_len = strlen(tmp);
+ concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1);
+ memcpy (concat_name, tmp, tmp_len);
+ concat_name[tmp_len] = '/';
+ strcpy (concat_name + tmp_len + 1, wrapper);
+ }
+ else
+ {
+ concat_name = XMALLOC(char, p_len + 1 + strlen(wrapper) + 1);
+ memcpy (concat_name, p, p_len);
+ concat_name[p_len] = '/';
+ strcpy (concat_name + p_len + 1, wrapper);
+ }
+ if (check_executable(concat_name))
+ return concat_name;
+ XFREE(concat_name);
+ }
+ }
+ /* not found in PATH; assume curdir */
+ }
+ /* Relative path | not found in path: prepend cwd */
+ if (getcwd (tmp, LT_PATHMAX) == NULL)
+ lt_fatal ("getcwd failed");
+ tmp_len = strlen(tmp);
+ concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1);
+ memcpy (concat_name, tmp, tmp_len);
+ concat_name[tmp_len] = '/';
+ strcpy (concat_name + tmp_len + 1, wrapper);
+
+ if (check_executable(concat_name))
+ return concat_name;
+ XFREE(concat_name);
+ return NULL;
+}
+
+char *
+strendzap(char *str, const char *pat)
+{
+ size_t len, patlen;
+
+ assert(str != NULL);
+ assert(pat != NULL);
+
+ len = strlen(str);
+ patlen = strlen(pat);
+
+ if (patlen <= len)
+ {
+ str += len - patlen;
+ if (strcmp(str, pat) == 0)
+ *str = '\0';
+ }
+ return str;
+}
+
+static void
+lt_error_core (int exit_status, const char * mode,
+ const char * message, va_list ap)
+{
+ fprintf (stderr, "%s: %s: ", program_name, mode);
+ vfprintf (stderr, message, ap);
+ fprintf (stderr, ".\n");
+
+ if (exit_status >= 0)
+ exit (exit_status);
+}
+
+void
+lt_fatal (const char *message, ...)
+{
+ va_list ap;
+ va_start (ap, message);
+ lt_error_core (EXIT_FAILURE, "FATAL", message, ap);
+ va_end (ap);
+}
+EOF
+ # we should really use a build-platform specific compiler
+ # here, but OTOH, the wrappers (shell script and this C one)
+ # are only useful if you want to execute the "real" binary.
+ # Since the "real" binary is built for $host, then this
+ # wrapper might as well be built for $host, too.
+ $run $LTCC $LTCFLAGS -s -o $cwrapper $cwrappersource
+ ;;
+ esac
+ $rm $output
+ trap "$rm $output; exit $EXIT_FAILURE" 1 2 15
+
+ $echo > $output "\
+#! $SHELL
+
+# $output - temporary wrapper script for $objdir/$outputname
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# The $output program cannot be directly executed until all the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of the build directory.
+# If it is, it will not operate correctly.
+
+# Sed substitution that helps us do robust quoting. It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='${SED} -e 1s/^X//'
+sed_quote_subst='$sed_quote_subst'
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+relink_command=\"$relink_command\"
+
+# This environment variable determines our operation mode.
+if test \"\$libtool_install_magic\" = \"$magic\"; then
+ # install mode needs the following variable:
+ notinst_deplibs='$notinst_deplibs'
+else
+ # When we are sourced in execute mode, \$file and \$echo are already set.
+ if test \"\$libtool_execute_magic\" != \"$magic\"; then
+ echo=\"$qecho\"
+ file=\"\$0\"
+ # Make sure echo works.
+ if test \"X\$1\" = X--no-reexec; then
+ # Discard the --no-reexec flag, and continue.
+ shift
+ elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then
+ # Yippee, \$echo works!
+ :
+ else
+ # Restart under the correct shell, and then maybe \$echo will work.
+ exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"}
+ fi
+ fi\
+"
+ $echo >> $output "\
+
+ # Find the directory that this script lives in.
+ thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\`
+ test \"x\$thisdir\" = \"x\$file\" && thisdir=.
+
+ # Follow symbolic links until we get to the real thisdir.
+ file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\`
+ while test -n \"\$file\"; do
+ destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\`
+
+ # If there was a directory component, then change thisdir.
+ if test \"x\$destdir\" != \"x\$file\"; then
+ case \"\$destdir\" in
+ [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
+ *) thisdir=\"\$thisdir/\$destdir\" ;;
+ esac
+ fi
+
+ file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\`
+ file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\`
+ done
+
+ # Try to get the absolute directory name.
+ absdir=\`cd \"\$thisdir\" && pwd\`
+ test -n \"\$absdir\" && thisdir=\"\$absdir\"
+"
+
+ if test "$fast_install" = yes; then
+ $echo >> $output "\
+ program=lt-'$outputname'$exeext
+ progdir=\"\$thisdir/$objdir\"
+
+ if test ! -f \"\$progdir/\$program\" || \\
+ { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
+ test \"X\$file\" != \"X\$progdir/\$program\"; }; then
+
+ file=\"\$\$-\$program\"
+
+ if test ! -d \"\$progdir\"; then
+ $mkdir \"\$progdir\"
+ else
+ $rm \"\$progdir/\$file\"
+ fi"
+
+ $echo >> $output "\
+
+ # relink executable if necessary
+ if test -n \"\$relink_command\"; then
+ if relink_command_output=\`eval \$relink_command 2>&1\`; then :
+ else
+ $echo \"\$relink_command_output\" >&2
+ $rm \"\$progdir/\$file\"
+ exit $EXIT_FAILURE
+ fi
+ fi
+
+ $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
+ { $rm \"\$progdir/\$program\";
+ $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; }
+ $rm \"\$progdir/\$file\"
+ fi"
+ else
+ $echo >> $output "\
+ program='$outputname'
+ progdir=\"\$thisdir/$objdir\"
+"
+ fi
+
+ $echo >> $output "\
+
+ if test -f \"\$progdir/\$program\"; then"
+
+ # Export our shlibpath_var if we have one.
+ if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+ $echo >> $output "\
+ # Add our own library path to $shlibpath_var
+ $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
+
+ # Some systems cannot cope with colon-terminated $shlibpath_var
+ # The second colon is a workaround for a bug in BeOS R4 sed
+ $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\`
+
+ export $shlibpath_var
+"
+ fi
+
+ # fixup the dll searchpath if we need to.
+ if test -n "$dllsearchpath"; then
+ $echo >> $output "\
+ # Add the dll search path components to the executable PATH
+ PATH=$dllsearchpath:\$PATH
+"
+ fi
+
+ $echo >> $output "\
+ if test \"\$libtool_execute_magic\" != \"$magic\"; then
+ # Run the actual program with our arguments.
+"
+ case $host in
+ # Backslashes separate directories on plain windows
+ *-*-mingw | *-*-os2*)
+ $echo >> $output "\
+ exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
+"
+ ;;
+
+ *)
+ $echo >> $output "\
+ exec \"\$progdir/\$program\" \${1+\"\$@\"}
+"
+ ;;
+ esac
+ $echo >> $output "\
+ \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\"
+ exit $EXIT_FAILURE
+ fi
+ else
+ # The program doesn't exist.
+ \$echo \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
+ \$echo \"This script is just a wrapper for \$program.\" 1>&2
+ $echo \"See the $PACKAGE documentation for more information.\" 1>&2
+ exit $EXIT_FAILURE
+ fi
+fi\
+"
+ chmod +x $output
+ fi
+ exit $EXIT_SUCCESS
+ ;;
+ esac
+
+ # See if we need to build an old-fashioned archive.
+ for oldlib in $oldlibs; do
+
+ if test "$build_libtool_libs" = convenience; then
+ oldobjs="$libobjs_save"
+ addlibs="$convenience"
+ build_libtool_libs=no
+ else
+ if test "$build_libtool_libs" = module; then
+ oldobjs="$libobjs_save"
+ build_libtool_libs=no
+ else
+ oldobjs="$old_deplibs $non_pic_objects"
+ fi
+ addlibs="$old_convenience"
+ fi
+
+ if test -n "$addlibs"; then
+ gentop="$output_objdir/${outputname}x"
+ generated="$generated $gentop"
+
+ func_extract_archives $gentop $addlibs
+ oldobjs="$oldobjs $func_extract_archives_result"
+ fi
+
+ # Do each command in the archive commands.
+ if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
+ cmds=$old_archive_from_new_cmds
+ else
+ # POSIX demands no paths to be encoded in archives. We have
+ # to avoid creating archives with duplicate basenames if we
+ # might have to extract them afterwards, e.g., when creating a
+ # static archive out of a convenience library, or when linking
+ # the entirety of a libtool archive into another (currently
+ # not supported by libtool).
+ if (for obj in $oldobjs
+ do
+ $echo "X$obj" | $Xsed -e 's%^.*/%%'
+ done | sort | sort -uc >/dev/null 2>&1); then
+ :
+ else
+ $echo "copying selected object files to avoid basename conflicts..."
+
+ if test -z "$gentop"; then
+ gentop="$output_objdir/${outputname}x"
+ generated="$generated $gentop"
+
+ $show "${rm}r $gentop"
+ $run ${rm}r "$gentop"
+ $show "$mkdir $gentop"
+ $run $mkdir "$gentop"
+ exit_status=$?
+ if test "$exit_status" -ne 0 && test ! -d "$gentop"; then
+ exit $exit_status
+ fi
+ fi
+
+ save_oldobjs=$oldobjs
+ oldobjs=
+ counter=1
+ for obj in $save_oldobjs
+ do
+ objbase=`$echo "X$obj" | $Xsed -e 's%^.*/%%'`
+ case " $oldobjs " in
+ " ") oldobjs=$obj ;;
+ *[\ /]"$objbase "*)
+ while :; do
+ # Make sure we don't pick an alternate name that also
+ # overlaps.
+ newobj=lt$counter-$objbase
+ counter=`expr $counter + 1`
+ case " $oldobjs " in
+ *[\ /]"$newobj "*) ;;
+ *) if test ! -f "$gentop/$newobj"; then break; fi ;;
+ esac
+ done
+ $show "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
+ $run ln "$obj" "$gentop/$newobj" ||
+ $run cp "$obj" "$gentop/$newobj"
+ oldobjs="$oldobjs $gentop/$newobj"
+ ;;
+ *) oldobjs="$oldobjs $obj" ;;
+ esac
+ done
+ fi
+
+ eval cmds=\"$old_archive_cmds\"
+
+ if len=`expr "X$cmds" : ".*"` &&
+ test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+ cmds=$old_archive_cmds
+ else
+ # the command line is too long to link in one step, link in parts
+ $echo "using piecewise archive linking..."
+ save_RANLIB=$RANLIB
+ RANLIB=:
+ objlist=
+ concat_cmds=
+ save_oldobjs=$oldobjs
+
+ # Is there a better way of finding the last object in the list?
+ for obj in $save_oldobjs
+ do
+ last_oldobj=$obj
+ done
+ for obj in $save_oldobjs
+ do
+ oldobjs="$objlist $obj"
+ objlist="$objlist $obj"
+ eval test_cmds=\"$old_archive_cmds\"
+ if len=`expr "X$test_cmds" : ".*" 2>/dev/null` &&
+ test "$len" -le "$max_cmd_len"; then
+ :
+ else
+ # the above command should be used before it gets too long
+ oldobjs=$objlist
+ if test "$obj" = "$last_oldobj" ; then
+ RANLIB=$save_RANLIB
+ fi
+ test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
+ objlist=
+ fi
+ done
+ RANLIB=$save_RANLIB
+ oldobjs=$objlist
+ if test "X$oldobjs" = "X" ; then
+ eval cmds=\"\$concat_cmds\"
+ else
+ eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
+ fi
+ fi
+ fi
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ eval cmd=\"$cmd\"
+ IFS="$save_ifs"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ done
+
+ if test -n "$generated"; then
+ $show "${rm}r$generated"
+ $run ${rm}r$generated
+ fi
+
+ # Now create the libtool archive.
+ case $output in
+ *.la)
+ old_library=
+ test "$build_old_libs" = yes && old_library="$libname.$libext"
+ $show "creating $output"
+
+ # Preserve any variables that may affect compiler behavior
+ for var in $variables_saved_for_relink; do
+ if eval test -z \"\${$var+set}\"; then
+ relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command"
+ elif eval var_value=\$$var; test -z "$var_value"; then
+ relink_command="$var=; export $var; $relink_command"
+ else
+ var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"`
+ relink_command="$var=\"$var_value\"; export $var; $relink_command"
+ fi
+ done
+ # Quote the link command for shipping.
+ relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
+ relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"`
+ if test "$hardcode_automatic" = yes ; then
+ relink_command=
+ fi
+
+
+ # Only create the output if not a dry run.
+ if test -z "$run"; then
+ for installed in no yes; do
+ if test "$installed" = yes; then
+ if test -z "$install_libdir"; then
+ break
+ fi
+ output="$output_objdir/$outputname"i
+ # Replace all uninstalled libtool libraries with the installed ones
+ newdependency_libs=
+ for deplib in $dependency_libs; do
+ case $deplib in
+ *.la)
+ name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'`
+ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+ if test -z "$libdir"; then
+ $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ newdependency_libs="$newdependency_libs $libdir/$name"
+ ;;
+ *) newdependency_libs="$newdependency_libs $deplib" ;;
+ esac
+ done
+ dependency_libs="$newdependency_libs"
+ newdlfiles=
+ for lib in $dlfiles; do
+ name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+ if test -z "$libdir"; then
+ $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ newdlfiles="$newdlfiles $libdir/$name"
+ done
+ dlfiles="$newdlfiles"
+ newdlprefiles=
+ for lib in $dlprefiles; do
+ name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+ if test -z "$libdir"; then
+ $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ newdlprefiles="$newdlprefiles $libdir/$name"
+ done
+ dlprefiles="$newdlprefiles"
+ else
+ newdlfiles=
+ for lib in $dlfiles; do
+ case $lib in
+ [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+ *) abs=`pwd`"/$lib" ;;
+ esac
+ newdlfiles="$newdlfiles $abs"
+ done
+ dlfiles="$newdlfiles"
+ newdlprefiles=
+ for lib in $dlprefiles; do
+ case $lib in
+ [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+ *) abs=`pwd`"/$lib" ;;
+ esac
+ newdlprefiles="$newdlprefiles $abs"
+ done
+ dlprefiles="$newdlprefiles"
+ fi
+ $rm $output
+ # place dlname in correct position for cygwin
+ tdlname=$dlname
+ case $host,$output,$installed,$module,$dlname in
+ *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;;
+ esac
+ $echo > $output "\
+# $outputname - a libtool library file
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='$tdlname'
+
+# Names of this library.
+library_names='$library_names'
+
+# The name of the static archive.
+old_library='$old_library'
+
+# Libraries that this one depends upon.
+dependency_libs='$dependency_libs'
+
+# Version information for $libname.
+current=$current
+age=$age
+revision=$revision
+
+# Is this an already installed library?
+installed=$installed
+
+# Should we warn about portability when linking against -modules?
+shouldnotlink=$module
+
+# Files to dlopen/dlpreopen
+dlopen='$dlfiles'
+dlpreopen='$dlprefiles'
+
+# Directory that this library needs to be installed in:
+libdir='$install_libdir'"
+ if test "$installed" = no && test "$need_relink" = yes; then
+ $echo >> $output "\
+relink_command=\"$relink_command\""
+ fi
+ done
+ fi
+
+ # Do a symbolic link so that the libtool archive can be found in
+ # LD_LIBRARY_PATH before the program is installed.
+ $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)"
+ $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $?
+ ;;
+ esac
+ exit $EXIT_SUCCESS
+ ;;
+
+ # libtool install mode
+ install)
+ modename="$modename: install"
+
+ # There may be an optional sh(1) argument at the beginning of
+ # install_prog (especially on Windows NT).
+ if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
+ # Allow the use of GNU shtool's install command.
+ $echo "X$nonopt" | grep shtool > /dev/null; then
+ # Aesthetically quote it.
+ arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ install_prog="$arg "
+ arg="$1"
+ shift
+ else
+ install_prog=
+ arg=$nonopt
+ fi
+
+ # The real first argument should be the name of the installation program.
+ # Aesthetically quote it.
+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ install_prog="$install_prog$arg"
+
+ # We need to accept at least all the BSD install flags.
+ dest=
+ files=
+ opts=
+ prev=
+ install_type=
+ isdir=no
+ stripme=
+ for arg
+ do
+ if test -n "$dest"; then
+ files="$files $dest"
+ dest=$arg
+ continue
+ fi
+
+ case $arg in
+ -d) isdir=yes ;;
+ -f)
+ case " $install_prog " in
+ *[\\\ /]cp\ *) ;;
+ *) prev=$arg ;;
+ esac
+ ;;
+ -g | -m | -o) prev=$arg ;;
+ -s)
+ stripme=" -s"
+ continue
+ ;;
+ -*)
+ ;;
+ *)
+ # If the previous option needed an argument, then skip it.
+ if test -n "$prev"; then
+ prev=
+ else
+ dest=$arg
+ continue
+ fi
+ ;;
+ esac
+
+ # Aesthetically quote the argument.
+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ install_prog="$install_prog $arg"
+ done
+
+ if test -z "$install_prog"; then
+ $echo "$modename: you must specify an install program" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ if test -n "$prev"; then
+ $echo "$modename: the \`$prev' option requires an argument" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ if test -z "$files"; then
+ if test -z "$dest"; then
+ $echo "$modename: no file or destination specified" 1>&2
+ else
+ $echo "$modename: you must specify a destination" 1>&2
+ fi
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Strip any trailing slash from the destination.
+ dest=`$echo "X$dest" | $Xsed -e 's%/$%%'`
+
+ # Check to see that the destination is a directory.
+ test -d "$dest" && isdir=yes
+ if test "$isdir" = yes; then
+ destdir="$dest"
+ destname=
+ else
+ destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$destdir" = "X$dest" && destdir=.
+ destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'`
+
+ # Not a directory, so check to see that there is only one file specified.
+ set dummy $files
+ if test "$#" -gt 2; then
+ $echo "$modename: \`$dest' is not a directory" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ fi
+ case $destdir in
+ [\\/]* | [A-Za-z]:[\\/]*) ;;
+ *)
+ for file in $files; do
+ case $file in
+ *.lo) ;;
+ *)
+ $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+ done
+ ;;
+ esac
+
+ # This variable tells wrapper scripts just to set variables rather
+ # than running their programs.
+ libtool_install_magic="$magic"
+
+ staticlibs=
+ future_libdirs=
+ current_libdirs=
+ for file in $files; do
+
+ # Do each installation.
+ case $file in
+ *.$libext)
+ # Do the static libraries later.
+ staticlibs="$staticlibs $file"
+ ;;
+
+ *.la)
+ # Check to see that this really is a libtool archive.
+ if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+ else
+ $echo "$modename: \`$file' is not a valid libtool archive" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ library_names=
+ old_library=
+ relink_command=
+ # If there is no directory component, then add one.
+ case $file in
+ */* | *\\*) . $file ;;
+ *) . ./$file ;;
+ esac
+
+ # Add the libdir to current_libdirs if it is the destination.
+ if test "X$destdir" = "X$libdir"; then
+ case "$current_libdirs " in
+ *" $libdir "*) ;;
+ *) current_libdirs="$current_libdirs $libdir" ;;
+ esac
+ else
+ # Note the libdir as a future libdir.
+ case "$future_libdirs " in
+ *" $libdir "*) ;;
+ *) future_libdirs="$future_libdirs $libdir" ;;
+ esac
+ fi
+
+ dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/
+ test "X$dir" = "X$file/" && dir=
+ dir="$dir$objdir"
+
+ if test -n "$relink_command"; then
+ # Determine the prefix the user has applied to our future dir.
+ inst_prefix_dir=`$echo "$destdir" | $SED "s%$libdir\$%%"`
+
+ # Don't allow the user to place us outside of our expected
+ # location b/c this prevents finding dependent libraries that
+ # are installed to the same prefix.
+ # At present, this check doesn't affect windows .dll's that
+ # are installed into $libdir/../bin (currently, that works fine)
+ # but it's something to keep an eye on.
+ if test "$inst_prefix_dir" = "$destdir"; then
+ $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ if test -n "$inst_prefix_dir"; then
+ # Stick the inst_prefix_dir data into the link command.
+ relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
+ else
+ relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
+ fi
+
+ $echo "$modename: warning: relinking \`$file'" 1>&2
+ $show "$relink_command"
+ if $run eval "$relink_command"; then :
+ else
+ $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ fi
+
+ # See the names of the shared library.
+ set dummy $library_names
+ if test -n "$2"; then
+ realname="$2"
+ shift
+ shift
+
+ srcname="$realname"
+ test -n "$relink_command" && srcname="$realname"T
+
+ # Install the shared library and build the symlinks.
+ $show "$install_prog $dir/$srcname $destdir/$realname"
+ $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $?
+ if test -n "$stripme" && test -n "$striplib"; then
+ $show "$striplib $destdir/$realname"
+ $run eval "$striplib $destdir/$realname" || exit $?
+ fi
+
+ if test "$#" -gt 0; then
+ # Delete the old symlinks, and create new ones.
+ # Try `ln -sf' first, because the `ln' binary might depend on
+ # the symlink we replace! Solaris /bin/ln does not understand -f,
+ # so we also need to try rm && ln -s.
+ for linkname
+ do
+ if test "$linkname" != "$realname"; then
+ $show "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })"
+ $run eval "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })"
+ fi
+ done
+ fi
+
+ # Do each command in the postinstall commands.
+ lib="$destdir/$realname"
+ cmds=$postinstall_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || {
+ lt_exit=$?
+
+ # Restore the uninstalled library and exit
+ if test "$mode" = relink; then
+ $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)'
+ fi
+
+ exit $lt_exit
+ }
+ done
+ IFS="$save_ifs"
+ fi
+
+ # Install the pseudo-library for information purposes.
+ name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+ instname="$dir/$name"i
+ $show "$install_prog $instname $destdir/$name"
+ $run eval "$install_prog $instname $destdir/$name" || exit $?
+
+ # Maybe install the static library, too.
+ test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library"
+ ;;
+
+ *.lo)
+ # Install (i.e. copy) a libtool object.
+
+ # Figure out destination file name, if it wasn't already specified.
+ if test -n "$destname"; then
+ destfile="$destdir/$destname"
+ else
+ destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+ destfile="$destdir/$destfile"
+ fi
+
+ # Deduce the name of the destination old-style object file.
+ case $destfile in
+ *.lo)
+ staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"`
+ ;;
+ *.$objext)
+ staticdest="$destfile"
+ destfile=
+ ;;
+ *)
+ $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+
+ # Install the libtool object if requested.
+ if test -n "$destfile"; then
+ $show "$install_prog $file $destfile"
+ $run eval "$install_prog $file $destfile" || exit $?
+ fi
+
+ # Install the old object if enabled.
+ if test "$build_old_libs" = yes; then
+ # Deduce the name of the old-style object file.
+ staticobj=`$echo "X$file" | $Xsed -e "$lo2o"`
+
+ $show "$install_prog $staticobj $staticdest"
+ $run eval "$install_prog \$staticobj \$staticdest" || exit $?
+ fi
+ exit $EXIT_SUCCESS
+ ;;
+
+ *)
+ # Figure out destination file name, if it wasn't already specified.
+ if test -n "$destname"; then
+ destfile="$destdir/$destname"
+ else
+ destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+ destfile="$destdir/$destfile"
+ fi
+
+ # If the file is missing, and there is a .exe on the end, strip it
+ # because it is most likely a libtool script we actually want to
+ # install
+ stripped_ext=""
+ case $file in
+ *.exe)
+ if test ! -f "$file"; then
+ file=`$echo $file|${SED} 's,.exe$,,'`
+ stripped_ext=".exe"
+ fi
+ ;;
+ esac
+
+ # Do a test to see if this is really a libtool program.
+ case $host in
+ *cygwin*|*mingw*)
+ wrapper=`$echo $file | ${SED} -e 's,.exe$,,'`
+ ;;
+ *)
+ wrapper=$file
+ ;;
+ esac
+ if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then
+ notinst_deplibs=
+ relink_command=
+
+ # Note that it is not necessary on cygwin/mingw to append a dot to
+ # foo even if both foo and FILE.exe exist: automatic-append-.exe
+ # behavior happens only for exec(3), not for open(2)! Also, sourcing
+ # `FILE.' does not work on cygwin managed mounts.
+ #
+ # If there is no directory component, then add one.
+ case $wrapper in
+ */* | *\\*) . ${wrapper} ;;
+ *) . ./${wrapper} ;;
+ esac
+
+ # Check the variables that should have been set.
+ if test -z "$notinst_deplibs"; then
+ $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ finalize=yes
+ for lib in $notinst_deplibs; do
+ # Check to see that each library is installed.
+ libdir=
+ if test -f "$lib"; then
+ # If there is no directory component, then add one.
+ case $lib in
+ */* | *\\*) . $lib ;;
+ *) . ./$lib ;;
+ esac
+ fi
+ libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test
+ if test -n "$libdir" && test ! -f "$libfile"; then
+ $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2
+ finalize=no
+ fi
+ done
+
+ relink_command=
+ # Note that it is not necessary on cygwin/mingw to append a dot to
+ # foo even if both foo and FILE.exe exist: automatic-append-.exe
+ # behavior happens only for exec(3), not for open(2)! Also, sourcing
+ # `FILE.' does not work on cygwin managed mounts.
+ #
+ # If there is no directory component, then add one.
+ case $wrapper in
+ */* | *\\*) . ${wrapper} ;;
+ *) . ./${wrapper} ;;
+ esac
+
+ outputname=
+ if test "$fast_install" = no && test -n "$relink_command"; then
+ if test "$finalize" = yes && test -z "$run"; then
+ tmpdir=`func_mktempdir`
+ file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'`
+ outputname="$tmpdir/$file"
+ # Replace the output file specification.
+ relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'`
+
+ $show "$relink_command"
+ if $run eval "$relink_command"; then :
+ else
+ $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
+ ${rm}r "$tmpdir"
+ continue
+ fi
+ file="$outputname"
+ else
+ $echo "$modename: warning: cannot relink \`$file'" 1>&2
+ fi
+ else
+ # Install the binary that we compiled earlier.
+ file=`$echo "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"`
+ fi
+ fi
+
+ # remove .exe since cygwin /usr/bin/install will append another
+ # one anyway
+ case $install_prog,$host in
+ */usr/bin/install*,*cygwin*)
+ case $file:$destfile in
+ *.exe:*.exe)
+ # this is ok
+ ;;
+ *.exe:*)
+ destfile=$destfile.exe
+ ;;
+ *:*.exe)
+ destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'`
+ ;;
+ esac
+ ;;
+ esac
+ $show "$install_prog$stripme $file $destfile"
+ $run eval "$install_prog\$stripme \$file \$destfile" || exit $?
+ test -n "$outputname" && ${rm}r "$tmpdir"
+ ;;
+ esac
+ done
+
+ for file in $staticlibs; do
+ name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+
+ # Set up the ranlib parameters.
+ oldlib="$destdir/$name"
+
+ $show "$install_prog $file $oldlib"
+ $run eval "$install_prog \$file \$oldlib" || exit $?
+
+ if test -n "$stripme" && test -n "$old_striplib"; then
+ $show "$old_striplib $oldlib"
+ $run eval "$old_striplib $oldlib" || exit $?
+ fi
+
+ # Do each command in the postinstall commands.
+ cmds=$old_postinstall_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ done
+
+ if test -n "$future_libdirs"; then
+ $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2
+ fi
+
+ if test -n "$current_libdirs"; then
+ # Maybe just do a dry run.
+ test -n "$run" && current_libdirs=" -n$current_libdirs"
+ exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
+ else
+ exit $EXIT_SUCCESS
+ fi
+ ;;
+
+ # libtool finish mode
+ finish)
+ modename="$modename: finish"
+ libdirs="$nonopt"
+ admincmds=
+
+ if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+ for dir
+ do
+ libdirs="$libdirs $dir"
+ done
+
+ for libdir in $libdirs; do
+ if test -n "$finish_cmds"; then
+ # Do each command in the finish commands.
+ cmds=$finish_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || admincmds="$admincmds
+ $cmd"
+ done
+ IFS="$save_ifs"
+ fi
+ if test -n "$finish_eval"; then
+ # Do the single finish_eval.
+ eval cmds=\"$finish_eval\"
+ $run eval "$cmds" || admincmds="$admincmds
+ $cmds"
+ fi
+ done
+ fi
+
+ # Exit here if they wanted silent mode.
+ test "$show" = : && exit $EXIT_SUCCESS
+
+ $echo "X----------------------------------------------------------------------" | $Xsed
+ $echo "Libraries have been installed in:"
+ for libdir in $libdirs; do
+ $echo " $libdir"
+ done
+ $echo
+ $echo "If you ever happen to want to link against installed libraries"
+ $echo "in a given directory, LIBDIR, you must either use libtool, and"
+ $echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
+ $echo "flag during linking and do at least one of the following:"
+ if test -n "$shlibpath_var"; then
+ $echo " - add LIBDIR to the \`$shlibpath_var' environment variable"
+ $echo " during execution"
+ fi
+ if test -n "$runpath_var"; then
+ $echo " - add LIBDIR to the \`$runpath_var' environment variable"
+ $echo " during linking"
+ fi
+ if test -n "$hardcode_libdir_flag_spec"; then
+ libdir=LIBDIR
+ eval flag=\"$hardcode_libdir_flag_spec\"
+
+ $echo " - use the \`$flag' linker flag"
+ fi
+ if test -n "$admincmds"; then
+ $echo " - have your system administrator run these commands:$admincmds"
+ fi
+ if test -f /etc/ld.so.conf; then
+ $echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
+ fi
+ $echo
+ $echo "See any operating system documentation about shared libraries for"
+ $echo "more information, such as the ld(1) and ld.so(8) manual pages."
+ $echo "X----------------------------------------------------------------------" | $Xsed
+ exit $EXIT_SUCCESS
+ ;;
+
+ # libtool execute mode
+ execute)
+ modename="$modename: execute"
+
+ # The first argument is the command name.
+ cmd="$nonopt"
+ if test -z "$cmd"; then
+ $echo "$modename: you must specify a COMMAND" 1>&2
+ $echo "$help"
+ exit $EXIT_FAILURE
+ fi
+
+ # Handle -dlopen flags immediately.
+ for file in $execute_dlfiles; do
+ if test ! -f "$file"; then
+ $echo "$modename: \`$file' is not a file" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ dir=
+ case $file in
+ *.la)
+ # Check to see that this really is a libtool archive.
+ if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+ else
+ $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Read the libtool library.
+ dlname=
+ library_names=
+
+ # If there is no directory component, then add one.
+ case $file in
+ */* | *\\*) . $file ;;
+ *) . ./$file ;;
+ esac
+
+ # Skip this library if it cannot be dlopened.
+ if test -z "$dlname"; then
+ # Warn if it was a shared library.
+ test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'"
+ continue
+ fi
+
+ dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$dir" = "X$file" && dir=.
+
+ if test -f "$dir/$objdir/$dlname"; then
+ dir="$dir/$objdir"
+ else
+ $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ ;;
+
+ *.lo)
+ # Just add the directory containing the .lo file.
+ dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$dir" = "X$file" && dir=.
+ ;;
+
+ *)
+ $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2
+ continue
+ ;;
+ esac
+
+ # Get the absolute pathname.
+ absdir=`cd "$dir" && pwd`
+ test -n "$absdir" && dir="$absdir"
+
+ # Now add the directory to shlibpath_var.
+ if eval "test -z \"\$$shlibpath_var\""; then
+ eval "$shlibpath_var=\"\$dir\""
+ else
+ eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
+ fi
+ done
+
+ # This variable tells wrapper scripts just to set shlibpath_var
+ # rather than running their programs.
+ libtool_execute_magic="$magic"
+
+ # Check if any of the arguments is a wrapper script.
+ args=
+ for file
+ do
+ case $file in
+ -*) ;;
+ *)
+ # Do a test to see if this is really a libtool program.
+ if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+ # If there is no directory component, then add one.
+ case $file in
+ */* | *\\*) . $file ;;
+ *) . ./$file ;;
+ esac
+
+ # Transform arg to wrapped name.
+ file="$progdir/$program"
+ fi
+ ;;
+ esac
+ # Quote arguments (to preserve shell metacharacters).
+ file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"`
+ args="$args \"$file\""
+ done
+
+ if test -z "$run"; then
+ if test -n "$shlibpath_var"; then
+ # Export the shlibpath_var.
+ eval "export $shlibpath_var"
+ fi
+
+ # Restore saved environment variables
+ if test "${save_LC_ALL+set}" = set; then
+ LC_ALL="$save_LC_ALL"; export LC_ALL
+ fi
+ if test "${save_LANG+set}" = set; then
+ LANG="$save_LANG"; export LANG
+ fi
+
+ # Now prepare to actually exec the command.
+ exec_cmd="\$cmd$args"
+ else
+ # Display what would be done.
+ if test -n "$shlibpath_var"; then
+ eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\""
+ $echo "export $shlibpath_var"
+ fi
+ $echo "$cmd$args"
+ exit $EXIT_SUCCESS
+ fi
+ ;;
+
+ # libtool clean and uninstall mode
+ clean | uninstall)
+ modename="$modename: $mode"
+ rm="$nonopt"
+ files=
+ rmforce=
+ exit_status=0
+
+ # This variable tells wrapper scripts just to set variables rather
+ # than running their programs.
+ libtool_install_magic="$magic"
+
+ for arg
+ do
+ case $arg in
+ -f) rm="$rm $arg"; rmforce=yes ;;
+ -*) rm="$rm $arg" ;;
+ *) files="$files $arg" ;;
+ esac
+ done
+
+ if test -z "$rm"; then
+ $echo "$modename: you must specify an RM program" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ rmdirs=
+
+ origobjdir="$objdir"
+ for file in $files; do
+ dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$dir" = "X$file"; then
+ dir=.
+ objdir="$origobjdir"
+ else
+ objdir="$dir/$origobjdir"
+ fi
+ name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+ test "$mode" = uninstall && objdir="$dir"
+
+ # Remember objdir for removal later, being careful to avoid duplicates
+ if test "$mode" = clean; then
+ case " $rmdirs " in
+ *" $objdir "*) ;;
+ *) rmdirs="$rmdirs $objdir" ;;
+ esac
+ fi
+
+ # Don't error if the file doesn't exist and rm -f was used.
+ if (test -L "$file") >/dev/null 2>&1 \
+ || (test -h "$file") >/dev/null 2>&1 \
+ || test -f "$file"; then
+ :
+ elif test -d "$file"; then
+ exit_status=1
+ continue
+ elif test "$rmforce" = yes; then
+ continue
+ fi
+
+ rmfiles="$file"
+
+ case $name in
+ *.la)
+ # Possibly a libtool archive, so verify it.
+ if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+ . $dir/$name
+
+ # Delete the libtool libraries and symlinks.
+ for n in $library_names; do
+ rmfiles="$rmfiles $objdir/$n"
+ done
+ test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library"
+
+ case "$mode" in
+ clean)
+ case " $library_names " in
+ # " " in the beginning catches empty $dlname
+ *" $dlname "*) ;;
+ *) rmfiles="$rmfiles $objdir/$dlname" ;;
+ esac
+ test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i"
+ ;;
+ uninstall)
+ if test -n "$library_names"; then
+ # Do each command in the postuninstall commands.
+ cmds=$postuninstall_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd"
+ if test "$?" -ne 0 && test "$rmforce" != yes; then
+ exit_status=1
+ fi
+ done
+ IFS="$save_ifs"
+ fi
+
+ if test -n "$old_library"; then
+ # Do each command in the old_postuninstall commands.
+ cmds=$old_postuninstall_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd"
+ if test "$?" -ne 0 && test "$rmforce" != yes; then
+ exit_status=1
+ fi
+ done
+ IFS="$save_ifs"
+ fi
+ # FIXME: should reinstall the best remaining shared library.
+ ;;
+ esac
+ fi
+ ;;
+
+ *.lo)
+ # Possibly a libtool object, so verify it.
+ if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+
+ # Read the .lo file
+ . $dir/$name
+
+ # Add PIC object to the list of files to remove.
+ if test -n "$pic_object" \
+ && test "$pic_object" != none; then
+ rmfiles="$rmfiles $dir/$pic_object"
+ fi
+
+ # Add non-PIC object to the list of files to remove.
+ if test -n "$non_pic_object" \
+ && test "$non_pic_object" != none; then
+ rmfiles="$rmfiles $dir/$non_pic_object"
+ fi
+ fi
+ ;;
+
+ *)
+ if test "$mode" = clean ; then
+ noexename=$name
+ case $file in
+ *.exe)
+ file=`$echo $file|${SED} 's,.exe$,,'`
+ noexename=`$echo $name|${SED} 's,.exe$,,'`
+ # $file with .exe has already been added to rmfiles,
+ # add $file without .exe
+ rmfiles="$rmfiles $file"
+ ;;
+ esac
+ # Do a test to see if this is a libtool program.
+ if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+ relink_command=
+ . $dir/$noexename
+
+ # note $name still contains .exe if it was in $file originally
+ # as does the version of $file that was added into $rmfiles
+ rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}"
+ if test "$fast_install" = yes && test -n "$relink_command"; then
+ rmfiles="$rmfiles $objdir/lt-$name"
+ fi
+ if test "X$noexename" != "X$name" ; then
+ rmfiles="$rmfiles $objdir/lt-${noexename}.c"
+ fi
+ fi
+ fi
+ ;;
+ esac
+ $show "$rm $rmfiles"
+ $run $rm $rmfiles || exit_status=1
+ done
+ objdir="$origobjdir"
+
+ # Try to remove the ${objdir}s in the directories where we deleted files
+ for dir in $rmdirs; do
+ if test -d "$dir"; then
+ $show "rmdir $dir"
+ $run rmdir $dir >/dev/null 2>&1
+ fi
+ done
+
+ exit $exit_status
+ ;;
+
+ "")
+ $echo "$modename: you must specify a MODE" 1>&2
+ $echo "$generic_help" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+
+ if test -z "$exec_cmd"; then
+ $echo "$modename: invalid operation mode \`$mode'" 1>&2
+ $echo "$generic_help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+fi # test -z "$show_help"
+
+if test -n "$exec_cmd"; then
+ eval exec $exec_cmd
+ exit $EXIT_FAILURE
+fi
+
+# We need to display help for each of the modes.
+case $mode in
+"") $echo \
+"Usage: $modename [OPTION]... [MODE-ARG]...
+
+Provide generalized library-building support services.
+
+ --config show all configuration variables
+ --debug enable verbose shell tracing
+-n, --dry-run display commands without modifying any files
+ --features display basic configuration information and exit
+ --finish same as \`--mode=finish'
+ --help display this help message and exit
+ --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS]
+ --quiet same as \`--silent'
+ --silent don't print informational messages
+ --tag=TAG use configuration variables from tag TAG
+ --version print version information
+
+MODE must be one of the following:
+
+ clean remove files from the build directory
+ compile compile a source file into a libtool object
+ execute automatically set library path, then run a program
+ finish complete the installation of libtool libraries
+ install install libraries or executables
+ link create a library or an executable
+ uninstall remove libraries from an installed directory
+
+MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for
+a more detailed description of MODE.
+
+Report bugs to <bug-libtool@gnu.org>."
+ exit $EXIT_SUCCESS
+ ;;
+
+clean)
+ $echo \
+"Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
+
+Remove files from the build directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, object or program, all the files associated
+with it are deleted. Otherwise, only FILE itself is deleted using RM."
+ ;;
+
+compile)
+ $echo \
+"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
+
+Compile a source file into a libtool library object.
+
+This mode accepts the following additional options:
+
+ -o OUTPUT-FILE set the output file name to OUTPUT-FILE
+ -prefer-pic try to building PIC objects only
+ -prefer-non-pic try to building non-PIC objects only
+ -static always build a \`.o' file suitable for static linking
+
+COMPILE-COMMAND is a command to be used in creating a \`standard' object file
+from the given SOURCEFILE.
+
+The output file name is determined by removing the directory component from
+SOURCEFILE, then substituting the C source code suffix \`.c' with the
+library object suffix, \`.lo'."
+ ;;
+
+execute)
+ $echo \
+"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]...
+
+Automatically set library path, then run a program.
+
+This mode accepts the following additional options:
+
+ -dlopen FILE add the directory containing FILE to the library path
+
+This mode sets the library path environment variable according to \`-dlopen'
+flags.
+
+If any of the ARGS are libtool executable wrappers, then they are translated
+into their corresponding uninstalled binary, and any of their required library
+directories are added to the library path.
+
+Then, COMMAND is executed, with ARGS as arguments."
+ ;;
+
+finish)
+ $echo \
+"Usage: $modename [OPTION]... --mode=finish [LIBDIR]...
+
+Complete the installation of libtool libraries.
+
+Each LIBDIR is a directory that contains libtool libraries.
+
+The commands that this mode executes may require superuser privileges. Use
+the \`--dry-run' option if you just want to see what would be executed."
+ ;;
+
+install)
+ $echo \
+"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND...
+
+Install executables or libraries.
+
+INSTALL-COMMAND is the installation command. The first component should be
+either the \`install' or \`cp' program.
+
+The rest of the components are interpreted as arguments to that command (only
+BSD-compatible install options are recognized)."
+ ;;
+
+link)
+ $echo \
+"Usage: $modename [OPTION]... --mode=link LINK-COMMAND...
+
+Link object files or libraries together to form another library, or to
+create an executable program.
+
+LINK-COMMAND is a command using the C compiler that you would use to create
+a program from several object files.
+
+The following components of LINK-COMMAND are treated specially:
+
+ -all-static do not do any dynamic linking at all
+ -avoid-version do not add a version suffix if possible
+ -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime
+ -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols
+ -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
+ -export-symbols SYMFILE
+ try to export only the symbols listed in SYMFILE
+ -export-symbols-regex REGEX
+ try to export only the symbols matching REGEX
+ -LLIBDIR search LIBDIR for required installed libraries
+ -lNAME OUTPUT-FILE requires the installed library libNAME
+ -module build a library that can dlopened
+ -no-fast-install disable the fast-install mode
+ -no-install link a not-installable executable
+ -no-undefined declare that a library does not refer to external symbols
+ -o OUTPUT-FILE create OUTPUT-FILE from the specified objects
+ -objectlist FILE Use a list of object files found in FILE to specify objects
+ -precious-files-regex REGEX
+ don't remove output files matching REGEX
+ -release RELEASE specify package release information
+ -rpath LIBDIR the created library will eventually be installed in LIBDIR
+ -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries
+ -static do not do any dynamic linking of libtool libraries
+ -version-info CURRENT[:REVISION[:AGE]]
+ specify library version info [each variable defaults to 0]
+
+All other options (arguments beginning with \`-') are ignored.
+
+Every other argument is treated as a filename. Files ending in \`.la' are
+treated as uninstalled libtool libraries, other files are standard or library
+object files.
+
+If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
+only library objects (\`.lo' files) may be specified, and \`-rpath' is
+required, except when creating a convenience library.
+
+If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
+using \`ar' and \`ranlib', or on Windows using \`lib'.
+
+If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
+is created, otherwise an executable program is created."
+ ;;
+
+uninstall)
+ $echo \
+"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
+
+Remove libraries from an installation directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, all the files associated with it are deleted.
+Otherwise, only FILE itself is deleted using RM."
+ ;;
+
+*)
+ $echo "$modename: invalid operation mode \`$mode'" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+esac
+
+$echo
+$echo "Try \`$modename --help' for more information about other modes."
+
+exit $?
+
+# The TAGs below are defined such that we never get into a situation
+# in which we disable both kinds of libraries. Given conflicting
+# choices, we go for a static library, that is the most portable,
+# since we can't tell whether shared libraries were disabled because
+# the user asked for that or because the platform doesn't support
+# them. This is particularly important on AIX, because we don't
+# support having both static and shared libraries enabled at the same
+# time on that platform, so we default to a shared-only configuration.
+# If a disable-shared tag is given, we'll fallback to a static-only
+# configuration. But we'll never go from static-only to shared-only.
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
+disable_libs=shared
+# ### END LIBTOOL TAG CONFIG: disable-shared
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-static
+disable_libs=static
+# ### END LIBTOOL TAG CONFIG: disable-static
+
+# Local Variables:
+# mode:shell-script
+# sh-indentation:2
+# End:
diff --git a/gsl-1.9/matrix/ChangeLog b/gsl-1.9/matrix/ChangeLog
new file mode 100644
index 0000000..8e507be
--- /dev/null
+++ b/gsl-1.9/matrix/ChangeLog
@@ -0,0 +1,203 @@
+2007-02-17 Brian Gough <bjg@network-theory.co.uk>
+
+ * test_source.c (FUNCTION): avoid running negative value tests on
+ char, because it can be unsigned.
+
+2007-01-26 Brian Gough <bjg@network-theory.co.uk>
+
+ * minmax_source.c: added support for NaNs
+
+2006-10-31 Brian Gough <bjg@network-theory.co.uk>
+
+ * prop_source.c (FUNCTION): added functions gsl_matrix_ispos,
+ gsl_matrix_isneg
+
+2003-01-01 Brian Gough <brian.gough@network-theory.co.uk>
+
+ * gsl_matrix_complex_float.h (gsl_matrix_complex_float_get):
+ removed const from zero
+
+ * matrix_source.c (FUNCTION): removed const from zero
+
+2002-11-24 Brian Gough <bjg@network-theory.co.uk>
+
+ * Makefile.am: added libgslsys.a to link, to provide gsl_hypot for
+ complex division
+
+Mon Jun 17 22:31:33 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * test_complex_source.c (FUNCTION): fixed non-constant initializer
+
+Wed May 1 21:33:44 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_matrix_complex_float.h (gsl_matrix_complex_float_get): moved
+ constant zero inside GSL_RANGE_CHECK_OFF
+
+Sun Mar 24 20:28:48 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * oper_complex_source.c: complex matrix operations (from Toby
+ White)
+
+Mon Feb 18 20:33:58 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * copy_source.c (gsl_matrix_swap): fixed prototype by removing
+ const from second arg.
+
+Sun Jan 27 22:29:37 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c: ensure that range check is working when running the
+ tests
+
+Fri Sep 14 18:56:34 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * view_source.c: fixed cast for array type
+
+ * view.c: added #includes for missing const qualified types
+
+ * view_source.c: error for non-unit strides
+
+Fri Aug 3 14:11:23 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * added gsl_matrix_ptr and gsl_matrix_const_ptr functions
+
+Mon Jul 16 21:28:05 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * rowcol_source.c (FUNCTION): initialized view to NULL
+
+Fri Jul 13 21:29:27 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * changed views to be structs and used casts to initialize them
+
+Mon Jul 2 12:35:16 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * view.h: provide macros for initializing null
+ vectors and views
+
+Sun Jul 1 22:44:51 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * introduction of new-style vector/matrix views
+
+Fri Jun 1 17:04:52 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * getset_source.c: made these routines work with the current
+ matrix struct, previously they would give incorrect results
+
+Mon May 14 22:43:39 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * matrix_source.c (FUNCTION): removed unnecessary inline from
+ static function definition
+
+Tue May 1 23:09:25 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_matrix_float.h (struct ): MS VC++ requires that the
+ struct/typedef be made with a single definition
+
+Mon Mar 26 20:33:45 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * view_source.c: split view functions out into a separate file
+
+Sat Sep 9 16:47:16 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * added an owner field for indicating whether the underlying
+ memory is owned by the vector. Changed the meaning of the block
+ field to always be the address of the underlying block, even for
+ subviews (previously the block field was set to NULL in this
+ case).
+
+Thu Aug 17 19:46:22 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * swap_source.c (FUNCTION): added function
+ gsl_matrix_transpose_memcpy for transposing rectangular matrices
+
+Sun Jul 16 10:40:15 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * init_source.c (FUNCTION): added gsl_matrix_view function for
+ creating a matrix view of an ordinary C array
+
+Sat Jul 15 21:44:22 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * changed GSL_EDOM to GSL_EINVAL for invalid matrix size arguments
+
+Sat Jun 17 15:38:30 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * fixed up missing MULTIPLICITY factors in various functions
+
+Sun May 28 12:25:02 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * test_complex_source.c (FUNCTION): use binary mode "b" when
+ reading and writing binary files
+
+ * test_source.c (FUNCTION): use binary mode "b" when reading and
+ writing binary files
+
+Thu May 4 20:58:59 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * oper.c: added simple arithmetic operations (+,-,*,/,scale,+const)
+
+Wed Apr 26 15:04:22 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * prop_source.c (FUNCTION): added function gsl_matrix_isnull
+
+Tue Apr 18 12:51:49 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * minmax_source.c (FUNCTION): fixed bug in minmax where
+ coordinates would be incorrect for min or max in the first element
+
+ * test_source.c (FUNCTION): added tests for max/min functions
+
+Thu Apr 13 18:39:27 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * minmax.c: added matrix max/min functions
+
+Sat Mar 25 20:29:41 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * swap_source.c (FUNCTION): renamed swap_cols to swap_columns, and
+ renamed swap_rowcol to swap_row_column
+
+Tue Mar 21 21:15:22 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * matrix_source.c (FUNCTION): added set_all and set_zero functions
+
+Sat Mar 11 11:19:05 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * init_source.c (FUNCTION): added gsl_matrix_identity to set a
+ matrix to the identity, and gsl_matrix_zero for zeroing a matrix
+
+ * gsl_matrix.h: renamed struct element dim2 to tda (trailing
+ dimension) following blas conventions for row-major matrices
+
+Thu Dec 2 21:17:16 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * rowcol_source.c (FUNCTION): added gsl_matrix_view_from_vector
+ (Thanks to Fabrice Rossi)
+
+Sun Oct 31 20:01:39 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * copy.c copy_source.c: added gsl_matrix_copy function
+
+Tue Oct 19 14:13:35 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * added gsl_matrix_swap_row/col to exchange rows and columns
+
+Fri Oct 1 15:48:07 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * the matrix struct now supports a separate 'trailing dimension'
+ to allow handling of submatrices
+
+ * now uses separate block directory for memory management
+
+Mon Mar 1 20:05:52 1999 Brian Gough <bjg@netsci.freeserve.co.uk>
+
+ * rowcol_source.c: fix rowcol to use strides
+
+1998-11-09 <bjg@ancho.lanl.gov>
+
+ * test_source.c, test_complex_source.c: use macros to determine if
+ we should run tests with long double printf/scanf, since these
+ aren't supported on all platforms
+
+Mon Apr 6 15:06:38 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * make range checking the default, you have to define
+ GSL_RANGE_CHECK_OFF to turn it off
+
diff --git a/gsl-1.9/matrix/Makefile.am b/gsl-1.9/matrix/Makefile.am
new file mode 100644
index 0000000..29bbd85
--- /dev/null
+++ b/gsl-1.9/matrix/Makefile.am
@@ -0,0 +1,24 @@
+noinst_LTLIBRARIES = libgslmatrix.la
+
+check_PROGRAMS = test test_static
+
+pkginclude_HEADERS = gsl_matrix.h gsl_matrix_char.h gsl_matrix_complex_double.h gsl_matrix_complex_float.h gsl_matrix_complex_long_double.h gsl_matrix_double.h gsl_matrix_float.h gsl_matrix_int.h gsl_matrix_long.h gsl_matrix_long_double.h gsl_matrix_short.h gsl_matrix_uchar.h gsl_matrix_uint.h gsl_matrix_ulong.h gsl_matrix_ushort.h
+
+INCLUDES= -I$(top_builddir) -I$(top_srcdir)
+
+TESTS = $(check_PROGRAMS)
+
+test_LDADD = libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+test_static_LDADD = libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+
+test_SOURCES = test.c
+
+test_static_SOURCES = test_static.c
+
+CLEANFILES = test.txt test.dat
+
+noinst_HEADERS = matrix_source.c init_source.c file_source.c rowcol_source.c swap_source.c copy_source.c test_complex_source.c test_source.c minmax_source.c prop_source.c oper_source.c getset_source.c view_source.c submatrix_source.c oper_complex_source.c
+
+libgslmatrix_la_SOURCES = init.c matrix.c file.c rowcol.c swap.c copy.c minmax.c prop.c oper.c getset.c view.c submatrix.c view.h
+
+
diff --git a/gsl-1.9/matrix/Makefile.in b/gsl-1.9/matrix/Makefile.in
new file mode 100644
index 0000000..31be235
--- /dev/null
+++ b/gsl-1.9/matrix/Makefile.in
@@ -0,0 +1,562 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = test$(EXEEXT) test_static$(EXEEXT)
+subdir = matrix
+DIST_COMMON = $(noinst_HEADERS) $(pkginclude_HEADERS) \
+ $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog TODO
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgslmatrix_la_LIBADD =
+am_libgslmatrix_la_OBJECTS = init.lo matrix.lo file.lo rowcol.lo \
+ swap.lo copy.lo minmax.lo prop.lo oper.lo getset.lo view.lo \
+ submatrix.lo
+libgslmatrix_la_OBJECTS = $(am_libgslmatrix_la_OBJECTS)
+am_test_OBJECTS = test.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = libgslmatrix.la ../vector/libgslvector.la \
+ ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la \
+ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \
+ ../utils/libutils.la
+am_test_static_OBJECTS = test_static.$(OBJEXT)
+test_static_OBJECTS = $(am_test_static_OBJECTS)
+test_static_DEPENDENCIES = libgslmatrix.la ../vector/libgslvector.la \
+ ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la \
+ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \
+ ../utils/libutils.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgslmatrix_la_SOURCES) $(test_SOURCES) \
+ $(test_static_SOURCES)
+DIST_SOURCES = $(libgslmatrix_la_SOURCES) $(test_SOURCES) \
+ $(test_static_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libgslmatrix.la
+pkginclude_HEADERS = gsl_matrix.h gsl_matrix_char.h gsl_matrix_complex_double.h gsl_matrix_complex_float.h gsl_matrix_complex_long_double.h gsl_matrix_double.h gsl_matrix_float.h gsl_matrix_int.h gsl_matrix_long.h gsl_matrix_long_double.h gsl_matrix_short.h gsl_matrix_uchar.h gsl_matrix_uint.h gsl_matrix_ulong.h gsl_matrix_ushort.h
+INCLUDES = -I$(top_builddir) -I$(top_srcdir)
+TESTS = $(check_PROGRAMS)
+test_LDADD = libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+test_static_LDADD = libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+test_SOURCES = test.c
+test_static_SOURCES = test_static.c
+CLEANFILES = test.txt test.dat
+noinst_HEADERS = matrix_source.c init_source.c file_source.c rowcol_source.c swap_source.c copy_source.c test_complex_source.c test_source.c minmax_source.c prop_source.c oper_source.c getset_source.c view_source.c submatrix_source.c oper_complex_source.c
+libgslmatrix_la_SOURCES = init.c matrix.c file.c rowcol.c swap.c copy.c minmax.c prop.c oper.c getset.c view.c submatrix.c view.h
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps matrix/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps matrix/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgslmatrix.la: $(libgslmatrix_la_OBJECTS) $(libgslmatrix_la_DEPENDENCIES)
+ $(LINK) $(libgslmatrix_la_LDFLAGS) $(libgslmatrix_la_OBJECTS) $(libgslmatrix_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+test_static$(EXEEXT): $(test_static_OBJECTS) $(test_static_DEPENDENCIES)
+ @rm -f test_static$(EXEEXT)
+ $(LINK) $(test_static_LDFLAGS) $(test_static_OBJECTS) $(test_static_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkgincludeHEADERS
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/matrix/TODO b/gsl-1.9/matrix/TODO
new file mode 100644
index 0000000..d2e0ade
--- /dev/null
+++ b/gsl-1.9/matrix/TODO
@@ -0,0 +1,9 @@
+* Pretty print function
+
+* Clean up the tests.
+
+* Run tests where matrix tda != size2, note that tda is a physical
+dimension and size2 is the number of columns in the matrix. This will
+probably find a lot of bugs in the matrix logic.
+
+* Matrix norms that can be calculated analytically, e.g. Frobenius, etc
diff --git a/gsl-1.9/matrix/copy.c b/gsl-1.9/matrix/copy.c
new file mode 100644
index 0000000..ffe3a12
--- /dev/null
+++ b/gsl-1.9/matrix/copy.c
@@ -0,0 +1,87 @@
+#include <config.h>
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_errno.h>
+
+#define BASE_GSL_COMPLEX_LONG
+#include "templates_on.h"
+#include "copy_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_LONG
+
+#define BASE_GSL_COMPLEX
+#include "templates_on.h"
+#include "copy_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX
+
+#define BASE_GSL_COMPLEX_FLOAT
+#include "templates_on.h"
+#include "copy_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_FLOAT
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "copy_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "copy_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "copy_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "copy_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "copy_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "copy_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "copy_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "copy_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "copy_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "copy_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "copy_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
diff --git a/gsl-1.9/matrix/copy_source.c b/gsl-1.9/matrix/copy_source.c
new file mode 100644
index 0000000..1b51548
--- /dev/null
+++ b/gsl-1.9/matrix/copy_source.c
@@ -0,0 +1,88 @@
+/* matrix/copy_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+int
+FUNCTION (gsl_matrix, memcpy) (TYPE (gsl_matrix) * dest,
+ const TYPE (gsl_matrix) * src)
+{
+ const size_t src_size1 = src->size1;
+ const size_t src_size2 = src->size2;
+ const size_t dest_size1 = dest->size1;
+ const size_t dest_size2 = dest->size2;
+
+ if (src_size1 != dest_size1 || src_size2 != dest_size2)
+ {
+ GSL_ERROR ("matrix sizes are different", GSL_EBADLEN);
+ }
+
+ {
+ const size_t src_tda = src->tda ;
+ const size_t dest_tda = dest->tda ;
+ size_t i, j;
+
+ for (i = 0; i < src_size1 ; i++)
+ {
+ for (j = 0; j < MULTIPLICITY * src_size2; j++)
+ {
+ dest->data[MULTIPLICITY * dest_tda * i + j]
+ = src->data[MULTIPLICITY * src_tda * i + j];
+ }
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+int
+FUNCTION (gsl_matrix, swap) (TYPE (gsl_matrix) * dest, TYPE (gsl_matrix) * src)
+{
+ const size_t src_size1 = src->size1;
+ const size_t src_size2 = src->size2;
+ const size_t dest_size1 = dest->size1;
+ const size_t dest_size2 = dest->size2;
+
+ if (src_size1 != dest_size1 || src_size2 != dest_size2)
+ {
+ GSL_ERROR ("matrix sizes are different", GSL_EBADLEN);
+ }
+
+ {
+ const size_t src_tda = src->tda ;
+ const size_t dest_tda = dest->tda ;
+ size_t i, j;
+
+ for (i = 0; i < src_size1 ; i++)
+ {
+ for (j = 0; j < MULTIPLICITY * src_size2; j++)
+ {
+ ATOMIC tmp = src->data[MULTIPLICITY * src_tda * i + j];
+ src->data[MULTIPLICITY * src_tda * i + j]
+ = dest->data[MULTIPLICITY * dest_tda * i + j];
+ dest->data[MULTIPLICITY * dest_tda * i + j] = tmp ;
+ }
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+
+
diff --git a/gsl-1.9/matrix/file.c b/gsl-1.9/matrix/file.c
new file mode 100644
index 0000000..b752816
--- /dev/null
+++ b/gsl-1.9/matrix/file.c
@@ -0,0 +1,88 @@
+#include <config.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_vector.h>
+
+#define BASE_GSL_COMPLEX_LONG
+#include "templates_on.h"
+#include "file_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_LONG
+
+#define BASE_GSL_COMPLEX
+#include "templates_on.h"
+#include "file_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX
+
+#define BASE_GSL_COMPLEX_FLOAT
+#include "templates_on.h"
+#include "file_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_FLOAT
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "file_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "file_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "file_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "file_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "file_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "file_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "file_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "file_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "file_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "file_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "file_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
diff --git a/gsl-1.9/matrix/file_source.c b/gsl-1.9/matrix/file_source.c
new file mode 100644
index 0000000..7a715db
--- /dev/null
+++ b/gsl-1.9/matrix/file_source.c
@@ -0,0 +1,157 @@
+/* matrix/file_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+int
+FUNCTION (gsl_matrix, fread) (FILE * stream, TYPE (gsl_matrix) * m)
+{
+ int status = 0;
+
+ const size_t size1 = m->size1;
+ const size_t size2 = m->size2;
+
+ const size_t tda = m->tda;
+
+ if (tda == size2) /* the rows are contiguous */
+ {
+ status = FUNCTION (gsl_block, raw_fread) (stream,
+ m->data,
+ size1 * size2, 1);
+ }
+ else
+ {
+ size_t i;
+
+ for (i = 0 ; i < size1 ; i++) /* read each row separately */
+ {
+ status = FUNCTION (gsl_block, raw_fread) (stream,
+ m->data + i * tda,
+ size2, 1);
+ if (status)
+ break;
+ }
+ }
+
+ return status;
+}
+
+int
+FUNCTION (gsl_matrix, fwrite) (FILE * stream, const TYPE (gsl_matrix) * m)
+{
+ int status = 0;
+
+ const size_t size1 = m->size1;
+ const size_t size2 = m->size2;
+
+ const size_t tda = m->tda;
+
+ if (tda == size2) /* the rows are contiguous */
+ {
+ status = FUNCTION (gsl_block, raw_fwrite) (stream,
+ m->data,
+ size1 * size2, 1);
+ }
+ else
+ {
+ size_t i;
+
+ for (i = 0 ; i < size1 ; i++) /* write each row separately */
+ {
+ status = FUNCTION (gsl_block, raw_fwrite) (stream,
+ m->data + i * tda,
+ size2, 1);
+ if (status)
+ break;
+ }
+ }
+
+ return status;
+
+}
+
+#if !(USES_LONGDOUBLE && !HAVE_PRINTF_LONGDOUBLE)
+int
+FUNCTION (gsl_matrix, fprintf) (FILE * stream, const TYPE (gsl_matrix) * m,
+ const char *format)
+{
+ int status = 0;
+
+ const size_t size1 = m->size1;
+ const size_t size2 = m->size2;
+
+ const size_t tda = m->tda;
+
+ if (tda == size2) /* the rows are contiguous */
+ {
+ status = FUNCTION (gsl_block, raw_fprintf) (stream,
+ m->data,
+ size1 * size2, 1,
+ format);
+ }
+ else
+ {
+ size_t i;
+
+ for (i = 0 ; i < size1 ; i++) /* print each row separately */
+ {
+ status = FUNCTION (gsl_block, raw_fprintf) (stream,
+ m->data + i * tda,
+ size2, 1,
+ format);
+ if (status)
+ break;
+ }
+ }
+
+ return status;
+}
+
+int
+FUNCTION (gsl_matrix, fscanf) (FILE * stream, TYPE (gsl_matrix) * m)
+{
+ int status = 0;
+
+ const size_t size1 = m->size1;
+ const size_t size2 = m->size2;
+
+ const size_t tda = m->tda;
+
+ if (tda == size2) /* the rows are contiguous */
+ {
+ status = FUNCTION (gsl_block, raw_fscanf) (stream,
+ m->data,
+ size1 * size2, 1);
+ }
+ else
+ {
+ size_t i;
+
+ for (i = 0 ; i < size1 ; i++) /* scan each row separately */
+ {
+ status = FUNCTION (gsl_block, raw_fscanf) (stream,
+ m->data + i * tda,
+ size2, 1);
+ if (status)
+ break;
+ }
+ }
+
+ return status;
+}
+#endif
+
diff --git a/gsl-1.9/matrix/getset.c b/gsl-1.9/matrix/getset.c
new file mode 100644
index 0000000..526144d
--- /dev/null
+++ b/gsl-1.9/matrix/getset.c
@@ -0,0 +1,88 @@
+#include <config.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_vector.h>
+
+#define BASE_GSL_COMPLEX_LONG
+#include "templates_on.h"
+#include "getset_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_LONG
+
+#define BASE_GSL_COMPLEX
+#include "templates_on.h"
+#include "getset_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX
+
+#define BASE_GSL_COMPLEX_FLOAT
+#include "templates_on.h"
+#include "getset_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_FLOAT
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "getset_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "getset_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "getset_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "getset_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "getset_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "getset_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "getset_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "getset_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "getset_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "getset_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "getset_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
diff --git a/gsl-1.9/matrix/getset_source.c b/gsl-1.9/matrix/getset_source.c
new file mode 100644
index 0000000..e55c05b
--- /dev/null
+++ b/gsl-1.9/matrix/getset_source.c
@@ -0,0 +1,228 @@
+/**********************************************************************/
+/* The functions below are obsolete */
+/**********************************************************************/
+
+int
+FUNCTION (gsl_matrix, get_row) (TYPE (gsl_vector) * v,
+ const TYPE (gsl_matrix) * m,
+ const size_t i)
+{
+ const size_t M = m->size1;
+ const size_t N = m->size2;
+ const size_t tda = m->tda;
+
+ if (i >= M)
+ {
+ GSL_ERROR ("row index is out of range", GSL_EINVAL);
+ }
+
+ if (v->size != N)
+ {
+ GSL_ERROR ("matrix row size and vector length are not equal",
+ GSL_EBADLEN);
+ }
+
+ {
+ ATOMIC *v_data = v->data;
+ const ATOMIC *row_data = m->data + MULTIPLICITY * i * tda;
+ const size_t stride = v->stride ;
+ size_t j;
+
+ for (j = 0; j < N; j++)
+ {
+ unsigned int k;
+
+ for (k = 0; k < MULTIPLICITY; k++)
+ {
+ v_data[MULTIPLICITY * stride * j + k]
+ = row_data[MULTIPLICITY * j + k];
+ }
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+FUNCTION (gsl_matrix, get_col) (TYPE (gsl_vector) * v,
+ const TYPE (gsl_matrix) * m,
+ const size_t j)
+{
+ const size_t M = m->size1;
+ const size_t N = m->size2;
+ const size_t tda = m->tda;
+
+ if (j >= N)
+ {
+ GSL_ERROR ("column index is out of range", GSL_EINVAL);
+ }
+
+ if (v->size != M)
+ {
+ GSL_ERROR ("matrix column size and vector length are not equal",
+ GSL_EBADLEN);
+ }
+
+
+ {
+ ATOMIC *v_data = v->data;
+ const ATOMIC *column_data = m->data + MULTIPLICITY * j;
+ const size_t stride = v->stride ;
+ size_t i;
+
+ for (i = 0; i < M; i++)
+ {
+ unsigned int k;
+
+ for (k = 0; k < MULTIPLICITY; k++)
+ {
+ v_data[stride * MULTIPLICITY * i + k] =
+ column_data[MULTIPLICITY * i * tda + k];
+ }
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+FUNCTION (gsl_matrix, set_row) (TYPE (gsl_matrix) * m,
+ const size_t i,
+ const TYPE (gsl_vector) * v)
+{
+ const size_t M = m->size1;
+ const size_t N = m->size2;
+ const size_t tda = m->tda;
+
+ if (i >= M)
+ {
+ GSL_ERROR ("row index is out of range", GSL_EINVAL);
+ }
+
+ if (v->size != N)
+ {
+ GSL_ERROR ("matrix row size and vector length are not equal",
+ GSL_EBADLEN);
+ }
+
+ {
+ const ATOMIC *v_data = v->data;
+ ATOMIC *row_data = m->data + MULTIPLICITY * i * tda;
+ const size_t stride = v->stride ;
+ size_t j;
+
+ for (j = 0; j < N; j++)
+ {
+ unsigned int k;
+
+ for (k = 0; k < MULTIPLICITY; k++)
+ {
+ row_data[MULTIPLICITY*j + k]
+ = v_data[MULTIPLICITY * stride * j + k];
+ }
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+FUNCTION (gsl_matrix, set_col) (TYPE (gsl_matrix) * m,
+ const size_t j,
+ const TYPE (gsl_vector) * v)
+{
+ const size_t M = m->size1;
+ const size_t N = m->size2;
+ const size_t tda = m->tda;
+
+ if (j >= N)
+ {
+ GSL_ERROR ("column index is out of range", GSL_EINVAL);
+ }
+
+ if (v->size != M)
+ {
+ GSL_ERROR ("matrix column size and vector length are not equal",
+ GSL_EBADLEN);
+ }
+
+ {
+ const ATOMIC *v_data = v->data;
+ ATOMIC *column_data = m->data + MULTIPLICITY * j;
+ const size_t stride = v->stride ;
+ size_t i;
+
+ for (i = 0; i < M; i++)
+ {
+ unsigned int k;
+
+ for (k = 0; k < MULTIPLICITY; k++)
+ {
+ column_data[MULTIPLICITY * i * tda + k]
+ = v_data[MULTIPLICITY * stride * i + k];
+ }
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+TYPE (gsl_vector) *
+FUNCTION (gsl_vector, alloc_row_from_matrix) (TYPE(gsl_matrix) * m,
+ const size_t i)
+{
+ TYPE (gsl_vector) * v;
+
+ const size_t M = m->size1;
+
+ if (i >= M)
+ {
+ GSL_ERROR_VAL ("row index is out of range", GSL_EINVAL, 0);
+ }
+
+ v = (TYPE (gsl_vector) *) malloc (sizeof (TYPE (gsl_vector)));
+
+ if (v == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for vector struct",
+ GSL_ENOMEM, 0);
+ }
+
+ v->data = m->data + MULTIPLICITY * i * m->tda ;
+ v->size = m->size2;
+ v->stride = 1;
+ v->block = 0;
+
+ return v;
+}
+
+TYPE (gsl_vector) *
+FUNCTION (gsl_vector, alloc_col_from_matrix) (TYPE(gsl_matrix) * m,
+ const size_t j)
+{
+ TYPE (gsl_vector) * v;
+
+ const size_t N = m->size2;
+
+ if (j >= N)
+ {
+ GSL_ERROR_VAL ("column index is out of range", GSL_EINVAL, 0);
+ }
+
+ v = (TYPE (gsl_vector) *) malloc (sizeof (TYPE (gsl_vector)));
+
+ if (v == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for vector struct",
+ GSL_ENOMEM, 0);
+ }
+
+ v->data = m->data + MULTIPLICITY * j ;
+ v->size = m->size1;
+ v->stride = m->tda;
+ v->block = 0;
+
+ return v;
+}
+
diff --git a/gsl-1.9/matrix/gsl_matrix.h b/gsl-1.9/matrix/gsl_matrix.h
new file mode 100644
index 0000000..9b7ed76
--- /dev/null
+++ b/gsl-1.9/matrix/gsl_matrix.h
@@ -0,0 +1,25 @@
+#ifndef __GSL_MATRIX_H__
+#define __GSL_MATRIX_H__
+
+#include <gsl/gsl_matrix_complex_long_double.h>
+#include <gsl/gsl_matrix_complex_double.h>
+#include <gsl/gsl_matrix_complex_float.h>
+
+#include <gsl/gsl_matrix_long_double.h>
+#include <gsl/gsl_matrix_double.h>
+#include <gsl/gsl_matrix_float.h>
+
+#include <gsl/gsl_matrix_ulong.h>
+#include <gsl/gsl_matrix_long.h>
+
+#include <gsl/gsl_matrix_uint.h>
+#include <gsl/gsl_matrix_int.h>
+
+#include <gsl/gsl_matrix_ushort.h>
+#include <gsl/gsl_matrix_short.h>
+
+#include <gsl/gsl_matrix_uchar.h>
+#include <gsl/gsl_matrix_char.h>
+
+
+#endif /* __GSL_MATRIX_H__ */
diff --git a/gsl-1.9/matrix/gsl_matrix_char.h b/gsl-1.9/matrix/gsl_matrix_char.h
new file mode 100644
index 0000000..02567b2
--- /dev/null
+++ b/gsl-1.9/matrix/gsl_matrix_char.h
@@ -0,0 +1,318 @@
+/* matrix/gsl_matrix_char.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_MATRIX_CHAR_H__
+#define __GSL_MATRIX_CHAR_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_types.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_check_range.h>
+#include <gsl/gsl_vector_char.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+typedef struct
+{
+ size_t size1;
+ size_t size2;
+ size_t tda;
+ char * data;
+ gsl_block_char * block;
+ int owner;
+} gsl_matrix_char;
+
+typedef struct
+{
+ gsl_matrix_char matrix;
+} _gsl_matrix_char_view;
+
+typedef _gsl_matrix_char_view gsl_matrix_char_view;
+
+typedef struct
+{
+ gsl_matrix_char matrix;
+} _gsl_matrix_char_const_view;
+
+typedef const _gsl_matrix_char_const_view gsl_matrix_char_const_view;
+
+/* Allocation */
+
+gsl_matrix_char *
+gsl_matrix_char_alloc (const size_t n1, const size_t n2);
+
+gsl_matrix_char *
+gsl_matrix_char_calloc (const size_t n1, const size_t n2);
+
+gsl_matrix_char *
+gsl_matrix_char_alloc_from_block (gsl_block_char * b,
+ const size_t offset,
+ const size_t n1,
+ const size_t n2,
+ const size_t d2);
+
+gsl_matrix_char *
+gsl_matrix_char_alloc_from_matrix (gsl_matrix_char * m,
+ const size_t k1,
+ const size_t k2,
+ const size_t n1,
+ const size_t n2);
+
+gsl_vector_char *
+gsl_vector_char_alloc_row_from_matrix (gsl_matrix_char * m,
+ const size_t i);
+
+gsl_vector_char *
+gsl_vector_char_alloc_col_from_matrix (gsl_matrix_char * m,
+ const size_t j);
+
+void gsl_matrix_char_free (gsl_matrix_char * m);
+
+/* Views */
+
+_gsl_matrix_char_view
+gsl_matrix_char_submatrix (gsl_matrix_char * m,
+ const size_t i, const size_t j,
+ const size_t n1, const size_t n2);
+
+_gsl_vector_char_view
+gsl_matrix_char_row (gsl_matrix_char * m, const size_t i);
+
+_gsl_vector_char_view
+gsl_matrix_char_column (gsl_matrix_char * m, const size_t j);
+
+_gsl_vector_char_view
+gsl_matrix_char_diagonal (gsl_matrix_char * m);
+
+_gsl_vector_char_view
+gsl_matrix_char_subdiagonal (gsl_matrix_char * m, const size_t k);
+
+_gsl_vector_char_view
+gsl_matrix_char_superdiagonal (gsl_matrix_char * m, const size_t k);
+
+_gsl_matrix_char_view
+gsl_matrix_char_view_array (char * base,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_char_view
+gsl_matrix_char_view_array_with_tda (char * base,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+
+_gsl_matrix_char_view
+gsl_matrix_char_view_vector (gsl_vector_char * v,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_char_view
+gsl_matrix_char_view_vector_with_tda (gsl_vector_char * v,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+
+_gsl_matrix_char_const_view
+gsl_matrix_char_const_submatrix (const gsl_matrix_char * m,
+ const size_t i, const size_t j,
+ const size_t n1, const size_t n2);
+
+_gsl_vector_char_const_view
+gsl_matrix_char_const_row (const gsl_matrix_char * m,
+ const size_t i);
+
+_gsl_vector_char_const_view
+gsl_matrix_char_const_column (const gsl_matrix_char * m,
+ const size_t j);
+
+_gsl_vector_char_const_view
+gsl_matrix_char_const_diagonal (const gsl_matrix_char * m);
+
+_gsl_vector_char_const_view
+gsl_matrix_char_const_subdiagonal (const gsl_matrix_char * m,
+ const size_t k);
+
+_gsl_vector_char_const_view
+gsl_matrix_char_const_superdiagonal (const gsl_matrix_char * m,
+ const size_t k);
+
+_gsl_matrix_char_const_view
+gsl_matrix_char_const_view_array (const char * base,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_char_const_view
+gsl_matrix_char_const_view_array_with_tda (const char * base,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+_gsl_matrix_char_const_view
+gsl_matrix_char_const_view_vector (const gsl_vector_char * v,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_char_const_view
+gsl_matrix_char_const_view_vector_with_tda (const gsl_vector_char * v,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+/* Operations */
+
+char gsl_matrix_char_get(const gsl_matrix_char * m, const size_t i, const size_t j);
+void gsl_matrix_char_set(gsl_matrix_char * m, const size_t i, const size_t j, const char x);
+
+char * gsl_matrix_char_ptr(gsl_matrix_char * m, const size_t i, const size_t j);
+const char * gsl_matrix_char_const_ptr(const gsl_matrix_char * m, const size_t i, const size_t j);
+
+void gsl_matrix_char_set_zero (gsl_matrix_char * m);
+void gsl_matrix_char_set_identity (gsl_matrix_char * m);
+void gsl_matrix_char_set_all (gsl_matrix_char * m, char x);
+
+int gsl_matrix_char_fread (FILE * stream, gsl_matrix_char * m) ;
+int gsl_matrix_char_fwrite (FILE * stream, const gsl_matrix_char * m) ;
+int gsl_matrix_char_fscanf (FILE * stream, gsl_matrix_char * m);
+int gsl_matrix_char_fprintf (FILE * stream, const gsl_matrix_char * m, const char * format);
+
+int gsl_matrix_char_memcpy(gsl_matrix_char * dest, const gsl_matrix_char * src);
+int gsl_matrix_char_swap(gsl_matrix_char * m1, gsl_matrix_char * m2);
+
+int gsl_matrix_char_swap_rows(gsl_matrix_char * m, const size_t i, const size_t j);
+int gsl_matrix_char_swap_columns(gsl_matrix_char * m, const size_t i, const size_t j);
+int gsl_matrix_char_swap_rowcol(gsl_matrix_char * m, const size_t i, const size_t j);
+int gsl_matrix_char_transpose (gsl_matrix_char * m);
+int gsl_matrix_char_transpose_memcpy (gsl_matrix_char * dest, const gsl_matrix_char * src);
+
+char gsl_matrix_char_max (const gsl_matrix_char * m);
+char gsl_matrix_char_min (const gsl_matrix_char * m);
+void gsl_matrix_char_minmax (const gsl_matrix_char * m, char * min_out, char * max_out);
+
+void gsl_matrix_char_max_index (const gsl_matrix_char * m, size_t * imax, size_t *jmax);
+void gsl_matrix_char_min_index (const gsl_matrix_char * m, size_t * imin, size_t *jmin);
+void gsl_matrix_char_minmax_index (const gsl_matrix_char * m, size_t * imin, size_t * jmin, size_t * imax, size_t * jmax);
+
+int gsl_matrix_char_isnull (const gsl_matrix_char * m);
+int gsl_matrix_char_ispos (const gsl_matrix_char * m);
+int gsl_matrix_char_isneg (const gsl_matrix_char * m);
+
+int gsl_matrix_char_add (gsl_matrix_char * a, const gsl_matrix_char * b);
+int gsl_matrix_char_sub (gsl_matrix_char * a, const gsl_matrix_char * b);
+int gsl_matrix_char_mul_elements (gsl_matrix_char * a, const gsl_matrix_char * b);
+int gsl_matrix_char_div_elements (gsl_matrix_char * a, const gsl_matrix_char * b);
+int gsl_matrix_char_scale (gsl_matrix_char * a, const double x);
+int gsl_matrix_char_add_constant (gsl_matrix_char * a, const double x);
+int gsl_matrix_char_add_diagonal (gsl_matrix_char * a, const double x);
+
+/***********************************************************************/
+/* The functions below are obsolete */
+/***********************************************************************/
+int gsl_matrix_char_get_row(gsl_vector_char * v, const gsl_matrix_char * m, const size_t i);
+int gsl_matrix_char_get_col(gsl_vector_char * v, const gsl_matrix_char * m, const size_t j);
+int gsl_matrix_char_set_row(gsl_matrix_char * m, const size_t i, const gsl_vector_char * v);
+int gsl_matrix_char_set_col(gsl_matrix_char * m, const size_t j, const gsl_vector_char * v);
+
+/* inline functions if you are using GCC */
+
+#ifdef HAVE_INLINE
+extern inline
+char
+gsl_matrix_char_get(const gsl_matrix_char * m, const size_t i, const size_t j)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_VAL("first index out of range", GSL_EINVAL, 0) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_VAL("second index out of range", GSL_EINVAL, 0) ;
+ }
+#endif
+ return m->data[i * m->tda + j] ;
+}
+
+extern inline
+void
+gsl_matrix_char_set(gsl_matrix_char * m, const size_t i, const size_t j, const char x)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_VOID("first index out of range", GSL_EINVAL) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_VOID("second index out of range", GSL_EINVAL) ;
+ }
+#endif
+ m->data[i * m->tda + j] = x ;
+}
+
+extern inline
+char *
+gsl_matrix_char_ptr(gsl_matrix_char * m, const size_t i, const size_t j)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ;
+ }
+#endif
+ return (char *) (m->data + (i * m->tda + j)) ;
+}
+
+extern inline
+const char *
+gsl_matrix_char_const_ptr(const gsl_matrix_char * m, const size_t i, const size_t j)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ;
+ }
+#endif
+ return (const char *) (m->data + (i * m->tda + j)) ;
+}
+
+#endif
+
+__END_DECLS
+
+#endif /* __GSL_MATRIX_CHAR_H__ */
diff --git a/gsl-1.9/matrix/gsl_matrix_complex_double.h b/gsl-1.9/matrix/gsl_matrix_complex_double.h
new file mode 100644
index 0000000..b8e669c
--- /dev/null
+++ b/gsl-1.9/matrix/gsl_matrix_complex_double.h
@@ -0,0 +1,313 @@
+/* matrix/gsl_matrix_complex_double.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_MATRIX_COMPLEX_DOUBLE_H__
+#define __GSL_MATRIX_COMPLEX_DOUBLE_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_types.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_complex.h>
+#include <gsl/gsl_check_range.h>
+#include <gsl/gsl_vector_complex_double.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+typedef struct
+{
+ size_t size1;
+ size_t size2;
+ size_t tda;
+ double * data;
+ gsl_block_complex * block;
+ int owner;
+} gsl_matrix_complex ;
+
+typedef struct
+{
+ gsl_matrix_complex matrix;
+} _gsl_matrix_complex_view;
+
+typedef _gsl_matrix_complex_view gsl_matrix_complex_view;
+
+typedef struct
+{
+ gsl_matrix_complex matrix;
+} _gsl_matrix_complex_const_view;
+
+typedef const _gsl_matrix_complex_const_view gsl_matrix_complex_const_view;
+
+
+/* Allocation */
+
+gsl_matrix_complex *
+gsl_matrix_complex_alloc (const size_t n1, const size_t n2);
+
+gsl_matrix_complex *
+gsl_matrix_complex_calloc (const size_t n1, const size_t n2);
+
+gsl_matrix_complex *
+gsl_matrix_complex_alloc_from_block (gsl_block_complex * b,
+ const size_t offset,
+ const size_t n1, const size_t n2, const size_t d2);
+
+gsl_matrix_complex *
+gsl_matrix_complex_alloc_from_matrix (gsl_matrix_complex * b,
+ const size_t k1, const size_t k2,
+ const size_t n1, const size_t n2);
+
+gsl_vector_complex *
+gsl_vector_complex_alloc_row_from_matrix (gsl_matrix_complex * m,
+ const size_t i);
+
+gsl_vector_complex *
+gsl_vector_complex_alloc_col_from_matrix (gsl_matrix_complex * m,
+ const size_t j);
+
+void gsl_matrix_complex_free (gsl_matrix_complex * m);
+
+/* Views */
+
+_gsl_matrix_complex_view
+gsl_matrix_complex_submatrix (gsl_matrix_complex * m,
+ const size_t i, const size_t j,
+ const size_t n1, const size_t n2);
+
+_gsl_vector_complex_view
+gsl_matrix_complex_row (gsl_matrix_complex * m, const size_t i);
+
+_gsl_vector_complex_view
+gsl_matrix_complex_column (gsl_matrix_complex * m, const size_t j);
+
+_gsl_vector_complex_view
+gsl_matrix_complex_diagonal (gsl_matrix_complex * m);
+
+_gsl_vector_complex_view
+gsl_matrix_complex_subdiagonal (gsl_matrix_complex * m, const size_t k);
+
+_gsl_vector_complex_view
+gsl_matrix_complex_superdiagonal (gsl_matrix_complex * m, const size_t k);
+
+_gsl_matrix_complex_view
+gsl_matrix_complex_view_array (double * base,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_complex_view
+gsl_matrix_complex_view_array_with_tda (double * base,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+_gsl_matrix_complex_view
+gsl_matrix_complex_view_vector (gsl_vector_complex * v,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_complex_view
+gsl_matrix_complex_view_vector_with_tda (gsl_vector_complex * v,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+
+_gsl_matrix_complex_const_view
+gsl_matrix_complex_const_submatrix (const gsl_matrix_complex * m,
+ const size_t i, const size_t j,
+ const size_t n1, const size_t n2);
+
+_gsl_vector_complex_const_view
+gsl_matrix_complex_const_row (const gsl_matrix_complex * m,
+ const size_t i);
+
+_gsl_vector_complex_const_view
+gsl_matrix_complex_const_column (const gsl_matrix_complex * m,
+ const size_t j);
+
+_gsl_vector_complex_const_view
+gsl_matrix_complex_const_diagonal (const gsl_matrix_complex * m);
+
+_gsl_vector_complex_const_view
+gsl_matrix_complex_const_subdiagonal (const gsl_matrix_complex * m,
+ const size_t k);
+
+_gsl_vector_complex_const_view
+gsl_matrix_complex_const_superdiagonal (const gsl_matrix_complex * m,
+ const size_t k);
+
+_gsl_matrix_complex_const_view
+gsl_matrix_complex_const_view_array (const double * base,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_complex_const_view
+gsl_matrix_complex_const_view_array_with_tda (const double * base,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+_gsl_matrix_complex_const_view
+gsl_matrix_complex_const_view_vector (const gsl_vector_complex * v,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_complex_const_view
+gsl_matrix_complex_const_view_vector_with_tda (const gsl_vector_complex * v,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+/* Operations */
+
+gsl_complex gsl_matrix_complex_get(const gsl_matrix_complex * m, const size_t i, const size_t j);
+void gsl_matrix_complex_set(gsl_matrix_complex * m, const size_t i, const size_t j, const gsl_complex x);
+
+gsl_complex * gsl_matrix_complex_ptr(gsl_matrix_complex * m, const size_t i, const size_t j);
+const gsl_complex * gsl_matrix_complex_const_ptr(const gsl_matrix_complex * m, const size_t i, const size_t j);
+
+void gsl_matrix_complex_set_zero (gsl_matrix_complex * m);
+void gsl_matrix_complex_set_identity (gsl_matrix_complex * m);
+void gsl_matrix_complex_set_all (gsl_matrix_complex * m, gsl_complex x);
+
+int gsl_matrix_complex_fread (FILE * stream, gsl_matrix_complex * m) ;
+int gsl_matrix_complex_fwrite (FILE * stream, const gsl_matrix_complex * m) ;
+int gsl_matrix_complex_fscanf (FILE * stream, gsl_matrix_complex * m);
+int gsl_matrix_complex_fprintf (FILE * stream, const gsl_matrix_complex * m, const char * format);
+
+int gsl_matrix_complex_memcpy(gsl_matrix_complex * dest, const gsl_matrix_complex * src);
+int gsl_matrix_complex_swap(gsl_matrix_complex * m1, gsl_matrix_complex * m2);
+
+int gsl_matrix_complex_swap_rows(gsl_matrix_complex * m, const size_t i, const size_t j);
+int gsl_matrix_complex_swap_columns(gsl_matrix_complex * m, const size_t i, const size_t j);
+int gsl_matrix_complex_swap_rowcol(gsl_matrix_complex * m, const size_t i, const size_t j);
+
+int gsl_matrix_complex_transpose (gsl_matrix_complex * m);
+int gsl_matrix_complex_transpose_memcpy (gsl_matrix_complex * dest, const gsl_matrix_complex * src);
+
+int gsl_matrix_complex_isnull (const gsl_matrix_complex * m);
+int gsl_matrix_complex_ispos (const gsl_matrix_complex * m);
+int gsl_matrix_complex_isneg (const gsl_matrix_complex * m);
+
+int gsl_matrix_complex_add (gsl_matrix_complex * a, const gsl_matrix_complex * b);
+int gsl_matrix_complex_sub (gsl_matrix_complex * a, const gsl_matrix_complex * b);
+int gsl_matrix_complex_mul_elements (gsl_matrix_complex * a, const gsl_matrix_complex * b);
+int gsl_matrix_complex_div_elements (gsl_matrix_complex * a, const gsl_matrix_complex * b);
+int gsl_matrix_complex_scale (gsl_matrix_complex * a, const gsl_complex x);
+int gsl_matrix_complex_add_constant (gsl_matrix_complex * a, const gsl_complex x);
+int gsl_matrix_complex_add_diagonal (gsl_matrix_complex * a, const gsl_complex x);
+
+/***********************************************************************/
+/* The functions below are obsolete */
+/***********************************************************************/
+int gsl_matrix_complex_get_row(gsl_vector_complex * v, const gsl_matrix_complex * m, const size_t i);
+int gsl_matrix_complex_get_col(gsl_vector_complex * v, const gsl_matrix_complex * m, const size_t j);
+int gsl_matrix_complex_set_row(gsl_matrix_complex * m, const size_t i, const gsl_vector_complex * v);
+int gsl_matrix_complex_set_col(gsl_matrix_complex * m, const size_t j, const gsl_vector_complex * v);
+
+#ifdef HAVE_INLINE
+
+extern inline
+gsl_complex
+gsl_matrix_complex_get(const gsl_matrix_complex * m,
+ const size_t i, const size_t j)
+{
+#if GSL_RANGE_CHECK
+ gsl_complex zero = {{0,0}};
+
+ if (i >= m->size1)
+ {
+ GSL_ERROR_VAL("first index out of range", GSL_EINVAL, zero) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_VAL("second index out of range", GSL_EINVAL, zero) ;
+ }
+#endif
+ return *(gsl_complex *)(m->data + 2*(i * m->tda + j)) ;
+}
+
+extern inline
+void
+gsl_matrix_complex_set(gsl_matrix_complex * m,
+ const size_t i, const size_t j, const gsl_complex x)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_VOID("first index out of range", GSL_EINVAL) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_VOID("second index out of range", GSL_EINVAL) ;
+ }
+#endif
+ *(gsl_complex *)(m->data + 2*(i * m->tda + j)) = x ;
+}
+
+extern inline
+gsl_complex *
+gsl_matrix_complex_ptr(gsl_matrix_complex * m,
+ const size_t i, const size_t j)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ;
+ }
+#endif
+ return (gsl_complex *)(m->data + 2*(i * m->tda + j)) ;
+}
+
+extern inline
+const gsl_complex *
+gsl_matrix_complex_const_ptr(const gsl_matrix_complex * m,
+ const size_t i, const size_t j)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ;
+ }
+#endif
+ return (const gsl_complex *)(m->data + 2*(i * m->tda + j)) ;
+}
+
+#endif /* HAVE_INLINE */
+
+__END_DECLS
+
+#endif /* __GSL_MATRIX_COMPLEX_DOUBLE_H__ */
diff --git a/gsl-1.9/matrix/gsl_matrix_complex_float.h b/gsl-1.9/matrix/gsl_matrix_complex_float.h
new file mode 100644
index 0000000..e8dcf7d
--- /dev/null
+++ b/gsl-1.9/matrix/gsl_matrix_complex_float.h
@@ -0,0 +1,313 @@
+/* matrix/gsl_matrix_complex_float.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_MATRIX_COMPLEX_FLOAT_H__
+#define __GSL_MATRIX_COMPLEX_FLOAT_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_types.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_complex.h>
+#include <gsl/gsl_check_range.h>
+#include <gsl/gsl_vector_complex_float.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+typedef struct
+{
+ size_t size1;
+ size_t size2;
+ size_t tda;
+ float * data;
+ gsl_block_complex_float * block;
+ int owner;
+} gsl_matrix_complex_float ;
+
+typedef struct
+{
+ gsl_matrix_complex_float matrix;
+} _gsl_matrix_complex_float_view;
+
+typedef _gsl_matrix_complex_float_view gsl_matrix_complex_float_view;
+
+typedef struct
+{
+ gsl_matrix_complex_float matrix;
+} _gsl_matrix_complex_float_const_view;
+
+typedef const _gsl_matrix_complex_float_const_view gsl_matrix_complex_float_const_view;
+
+
+/* Allocation */
+
+gsl_matrix_complex_float *
+gsl_matrix_complex_float_alloc (const size_t n1, const size_t n2);
+
+gsl_matrix_complex_float *
+gsl_matrix_complex_float_calloc (const size_t n1, const size_t n2);
+
+gsl_matrix_complex_float *
+gsl_matrix_complex_float_alloc_from_block (gsl_block_complex_float * b,
+ const size_t offset,
+ const size_t n1, const size_t n2, const size_t d2);
+
+gsl_matrix_complex_float *
+gsl_matrix_complex_float_alloc_from_matrix (gsl_matrix_complex_float * b,
+ const size_t k1, const size_t k2,
+ const size_t n1, const size_t n2);
+
+gsl_vector_complex_float *
+gsl_vector_complex_float_alloc_row_from_matrix (gsl_matrix_complex_float * m,
+ const size_t i);
+
+gsl_vector_complex_float *
+gsl_vector_complex_float_alloc_col_from_matrix (gsl_matrix_complex_float * m,
+ const size_t j);
+
+void gsl_matrix_complex_float_free (gsl_matrix_complex_float * m);
+
+/* Views */
+
+_gsl_matrix_complex_float_view
+gsl_matrix_complex_float_submatrix (gsl_matrix_complex_float * m,
+ const size_t i, const size_t j,
+ const size_t n1, const size_t n2);
+
+_gsl_vector_complex_float_view
+gsl_matrix_complex_float_row (gsl_matrix_complex_float * m, const size_t i);
+
+_gsl_vector_complex_float_view
+gsl_matrix_complex_float_column (gsl_matrix_complex_float * m, const size_t j);
+
+_gsl_vector_complex_float_view
+gsl_matrix_complex_float_diagonal (gsl_matrix_complex_float * m);
+
+_gsl_vector_complex_float_view
+gsl_matrix_complex_float_subdiagonal (gsl_matrix_complex_float * m, const size_t k);
+
+_gsl_vector_complex_float_view
+gsl_matrix_complex_float_superdiagonal (gsl_matrix_complex_float * m, const size_t k);
+
+_gsl_matrix_complex_float_view
+gsl_matrix_complex_float_view_array (float * base,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_complex_float_view
+gsl_matrix_complex_float_view_array_with_tda (float * base,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+_gsl_matrix_complex_float_view
+gsl_matrix_complex_float_view_vector (gsl_vector_complex_float * v,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_complex_float_view
+gsl_matrix_complex_float_view_vector_with_tda (gsl_vector_complex_float * v,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+
+_gsl_matrix_complex_float_const_view
+gsl_matrix_complex_float_const_submatrix (const gsl_matrix_complex_float * m,
+ const size_t i, const size_t j,
+ const size_t n1, const size_t n2);
+
+_gsl_vector_complex_float_const_view
+gsl_matrix_complex_float_const_row (const gsl_matrix_complex_float * m,
+ const size_t i);
+
+_gsl_vector_complex_float_const_view
+gsl_matrix_complex_float_const_column (const gsl_matrix_complex_float * m,
+ const size_t j);
+
+_gsl_vector_complex_float_const_view
+gsl_matrix_complex_float_const_diagonal (const gsl_matrix_complex_float * m);
+
+_gsl_vector_complex_float_const_view
+gsl_matrix_complex_float_const_subdiagonal (const gsl_matrix_complex_float * m,
+ const size_t k);
+
+_gsl_vector_complex_float_const_view
+gsl_matrix_complex_float_const_superdiagonal (const gsl_matrix_complex_float * m,
+ const size_t k);
+
+_gsl_matrix_complex_float_const_view
+gsl_matrix_complex_float_const_view_array (const float * base,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_complex_float_const_view
+gsl_matrix_complex_float_const_view_array_with_tda (const float * base,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+_gsl_matrix_complex_float_const_view
+gsl_matrix_complex_float_const_view_vector (const gsl_vector_complex_float * v,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_complex_float_const_view
+gsl_matrix_complex_float_const_view_vector_with_tda (const gsl_vector_complex_float * v,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+/* Operations */
+
+gsl_complex_float gsl_matrix_complex_float_get(const gsl_matrix_complex_float * m, const size_t i, const size_t j);
+void gsl_matrix_complex_float_set(gsl_matrix_complex_float * m, const size_t i, const size_t j, const gsl_complex_float x);
+
+gsl_complex_float * gsl_matrix_complex_float_ptr(gsl_matrix_complex_float * m, const size_t i, const size_t j);
+const gsl_complex_float * gsl_matrix_complex_float_const_ptr(const gsl_matrix_complex_float * m, const size_t i, const size_t j);
+
+void gsl_matrix_complex_float_set_zero (gsl_matrix_complex_float * m);
+void gsl_matrix_complex_float_set_identity (gsl_matrix_complex_float * m);
+void gsl_matrix_complex_float_set_all (gsl_matrix_complex_float * m, gsl_complex_float x);
+
+int gsl_matrix_complex_float_fread (FILE * stream, gsl_matrix_complex_float * m) ;
+int gsl_matrix_complex_float_fwrite (FILE * stream, const gsl_matrix_complex_float * m) ;
+int gsl_matrix_complex_float_fscanf (FILE * stream, gsl_matrix_complex_float * m);
+int gsl_matrix_complex_float_fprintf (FILE * stream, const gsl_matrix_complex_float * m, const char * format);
+
+int gsl_matrix_complex_float_memcpy(gsl_matrix_complex_float * dest, const gsl_matrix_complex_float * src);
+int gsl_matrix_complex_float_swap(gsl_matrix_complex_float * m1, gsl_matrix_complex_float * m2);
+
+int gsl_matrix_complex_float_swap_rows(gsl_matrix_complex_float * m, const size_t i, const size_t j);
+int gsl_matrix_complex_float_swap_columns(gsl_matrix_complex_float * m, const size_t i, const size_t j);
+int gsl_matrix_complex_float_swap_rowcol(gsl_matrix_complex_float * m, const size_t i, const size_t j);
+
+int gsl_matrix_complex_float_transpose (gsl_matrix_complex_float * m);
+int gsl_matrix_complex_float_transpose_memcpy (gsl_matrix_complex_float * dest, const gsl_matrix_complex_float * src);
+
+int gsl_matrix_complex_float_isnull (const gsl_matrix_complex_float * m);
+int gsl_matrix_complex_float_ispos (const gsl_matrix_complex_float * m);
+int gsl_matrix_complex_float_isneg (const gsl_matrix_complex_float * m);
+
+int gsl_matrix_complex_float_add (gsl_matrix_complex_float * a, const gsl_matrix_complex_float * b);
+int gsl_matrix_complex_float_sub (gsl_matrix_complex_float * a, const gsl_matrix_complex_float * b);
+int gsl_matrix_complex_float_mul_elements (gsl_matrix_complex_float * a, const gsl_matrix_complex_float * b);
+int gsl_matrix_complex_float_div_elements (gsl_matrix_complex_float * a, const gsl_matrix_complex_float * b);
+int gsl_matrix_complex_float_scale (gsl_matrix_complex_float * a, const gsl_complex_float x);
+int gsl_matrix_complex_float_add_constant (gsl_matrix_complex_float * a, const gsl_complex_float x);
+int gsl_matrix_complex_float_add_diagonal (gsl_matrix_complex_float * a, const gsl_complex_float x);
+
+/***********************************************************************/
+/* The functions below are obsolete */
+/***********************************************************************/
+int gsl_matrix_complex_float_get_row(gsl_vector_complex_float * v, const gsl_matrix_complex_float * m, const size_t i);
+int gsl_matrix_complex_float_get_col(gsl_vector_complex_float * v, const gsl_matrix_complex_float * m, const size_t j);
+int gsl_matrix_complex_float_set_row(gsl_matrix_complex_float * m, const size_t i, const gsl_vector_complex_float * v);
+int gsl_matrix_complex_float_set_col(gsl_matrix_complex_float * m, const size_t j, const gsl_vector_complex_float * v);
+
+#ifdef HAVE_INLINE
+
+extern inline
+gsl_complex_float
+gsl_matrix_complex_float_get(const gsl_matrix_complex_float * m,
+ const size_t i, const size_t j)
+{
+#if GSL_RANGE_CHECK
+ gsl_complex_float zero = {{0,0}};
+
+ if (i >= m->size1)
+ {
+ GSL_ERROR_VAL("first index out of range", GSL_EINVAL, zero) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_VAL("second index out of range", GSL_EINVAL, zero) ;
+ }
+#endif
+ return *(gsl_complex_float *)(m->data + 2*(i * m->tda + j)) ;
+}
+
+extern inline
+void
+gsl_matrix_complex_float_set(gsl_matrix_complex_float * m,
+ const size_t i, const size_t j, const gsl_complex_float x)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_VOID("first index out of range", GSL_EINVAL) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_VOID("second index out of range", GSL_EINVAL) ;
+ }
+#endif
+ *(gsl_complex_float *)(m->data + 2*(i * m->tda + j)) = x ;
+}
+
+extern inline
+gsl_complex_float *
+gsl_matrix_complex_float_ptr(gsl_matrix_complex_float * m,
+ const size_t i, const size_t j)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ;
+ }
+#endif
+ return (gsl_complex_float *)(m->data + 2*(i * m->tda + j)) ;
+}
+
+extern inline
+const gsl_complex_float *
+gsl_matrix_complex_float_const_ptr(const gsl_matrix_complex_float * m,
+ const size_t i, const size_t j)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ;
+ }
+#endif
+ return (const gsl_complex_float *)(m->data + 2*(i * m->tda + j)) ;
+}
+
+#endif /* HAVE_INLINE */
+
+__END_DECLS
+
+#endif /* __GSL_MATRIX_COMPLEX_FLOAT_H__ */
diff --git a/gsl-1.9/matrix/gsl_matrix_complex_long_double.h b/gsl-1.9/matrix/gsl_matrix_complex_long_double.h
new file mode 100644
index 0000000..1d47d7d
--- /dev/null
+++ b/gsl-1.9/matrix/gsl_matrix_complex_long_double.h
@@ -0,0 +1,313 @@
+/* matrix/gsl_matrix_complex_long_double.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_MATRIX_COMPLEX_LONG_DOUBLE_H__
+#define __GSL_MATRIX_COMPLEX_LONG_DOUBLE_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_types.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_complex.h>
+#include <gsl/gsl_check_range.h>
+#include <gsl/gsl_vector_complex_long_double.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+typedef struct
+{
+ size_t size1;
+ size_t size2;
+ size_t tda;
+ long double * data;
+ gsl_block_complex_long_double * block;
+ int owner;
+} gsl_matrix_complex_long_double ;
+
+typedef struct
+{
+ gsl_matrix_complex_long_double matrix;
+} _gsl_matrix_complex_long_double_view;
+
+typedef _gsl_matrix_complex_long_double_view gsl_matrix_complex_long_double_view;
+
+typedef struct
+{
+ gsl_matrix_complex_long_double matrix;
+} _gsl_matrix_complex_long_double_const_view;
+
+typedef const _gsl_matrix_complex_long_double_const_view gsl_matrix_complex_long_double_const_view;
+
+
+/* Allocation */
+
+gsl_matrix_complex_long_double *
+gsl_matrix_complex_long_double_alloc (const size_t n1, const size_t n2);
+
+gsl_matrix_complex_long_double *
+gsl_matrix_complex_long_double_calloc (const size_t n1, const size_t n2);
+
+gsl_matrix_complex_long_double *
+gsl_matrix_complex_long_double_alloc_from_block (gsl_block_complex_long_double * b,
+ const size_t offset,
+ const size_t n1, const size_t n2, const size_t d2);
+
+gsl_matrix_complex_long_double *
+gsl_matrix_complex_long_double_alloc_from_matrix (gsl_matrix_complex_long_double * b,
+ const size_t k1, const size_t k2,
+ const size_t n1, const size_t n2);
+
+gsl_vector_complex_long_double *
+gsl_vector_complex_long_double_alloc_row_from_matrix (gsl_matrix_complex_long_double * m,
+ const size_t i);
+
+gsl_vector_complex_long_double *
+gsl_vector_complex_long_double_alloc_col_from_matrix (gsl_matrix_complex_long_double * m,
+ const size_t j);
+
+void gsl_matrix_complex_long_double_free (gsl_matrix_complex_long_double * m);
+
+/* Views */
+
+_gsl_matrix_complex_long_double_view
+gsl_matrix_complex_long_double_submatrix (gsl_matrix_complex_long_double * m,
+ const size_t i, const size_t j,
+ const size_t n1, const size_t n2);
+
+_gsl_vector_complex_long_double_view
+gsl_matrix_complex_long_double_row (gsl_matrix_complex_long_double * m, const size_t i);
+
+_gsl_vector_complex_long_double_view
+gsl_matrix_complex_long_double_column (gsl_matrix_complex_long_double * m, const size_t j);
+
+_gsl_vector_complex_long_double_view
+gsl_matrix_complex_long_double_diagonal (gsl_matrix_complex_long_double * m);
+
+_gsl_vector_complex_long_double_view
+gsl_matrix_complex_long_double_subdiagonal (gsl_matrix_complex_long_double * m, const size_t k);
+
+_gsl_vector_complex_long_double_view
+gsl_matrix_complex_long_double_superdiagonal (gsl_matrix_complex_long_double * m, const size_t k);
+
+_gsl_matrix_complex_long_double_view
+gsl_matrix_complex_long_double_view_array (long double * base,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_complex_long_double_view
+gsl_matrix_complex_long_double_view_array_with_tda (long double * base,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+_gsl_matrix_complex_long_double_view
+gsl_matrix_complex_long_double_view_vector (gsl_vector_complex_long_double * v,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_complex_long_double_view
+gsl_matrix_complex_long_double_view_vector_with_tda (gsl_vector_complex_long_double * v,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+
+_gsl_matrix_complex_long_double_const_view
+gsl_matrix_complex_long_double_const_submatrix (const gsl_matrix_complex_long_double * m,
+ const size_t i, const size_t j,
+ const size_t n1, const size_t n2);
+
+_gsl_vector_complex_long_double_const_view
+gsl_matrix_complex_long_double_const_row (const gsl_matrix_complex_long_double * m,
+ const size_t i);
+
+_gsl_vector_complex_long_double_const_view
+gsl_matrix_complex_long_double_const_column (const gsl_matrix_complex_long_double * m,
+ const size_t j);
+
+_gsl_vector_complex_long_double_const_view
+gsl_matrix_complex_long_double_const_diagonal (const gsl_matrix_complex_long_double * m);
+
+_gsl_vector_complex_long_double_const_view
+gsl_matrix_complex_long_double_const_subdiagonal (const gsl_matrix_complex_long_double * m,
+ const size_t k);
+
+_gsl_vector_complex_long_double_const_view
+gsl_matrix_complex_long_double_const_superdiagonal (const gsl_matrix_complex_long_double * m,
+ const size_t k);
+
+_gsl_matrix_complex_long_double_const_view
+gsl_matrix_complex_long_double_const_view_array (const long double * base,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_complex_long_double_const_view
+gsl_matrix_complex_long_double_const_view_array_with_tda (const long double * base,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+_gsl_matrix_complex_long_double_const_view
+gsl_matrix_complex_long_double_const_view_vector (const gsl_vector_complex_long_double * v,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_complex_long_double_const_view
+gsl_matrix_complex_long_double_const_view_vector_with_tda (const gsl_vector_complex_long_double * v,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+/* Operations */
+
+gsl_complex_long_double gsl_matrix_complex_long_double_get(const gsl_matrix_complex_long_double * m, const size_t i, const size_t j);
+void gsl_matrix_complex_long_double_set(gsl_matrix_complex_long_double * m, const size_t i, const size_t j, const gsl_complex_long_double x);
+
+gsl_complex_long_double * gsl_matrix_complex_long_double_ptr(gsl_matrix_complex_long_double * m, const size_t i, const size_t j);
+const gsl_complex_long_double * gsl_matrix_complex_long_double_const_ptr(const gsl_matrix_complex_long_double * m, const size_t i, const size_t j);
+
+void gsl_matrix_complex_long_double_set_zero (gsl_matrix_complex_long_double * m);
+void gsl_matrix_complex_long_double_set_identity (gsl_matrix_complex_long_double * m);
+void gsl_matrix_complex_long_double_set_all (gsl_matrix_complex_long_double * m, gsl_complex_long_double x);
+
+int gsl_matrix_complex_long_double_fread (FILE * stream, gsl_matrix_complex_long_double * m) ;
+int gsl_matrix_complex_long_double_fwrite (FILE * stream, const gsl_matrix_complex_long_double * m) ;
+int gsl_matrix_complex_long_double_fscanf (FILE * stream, gsl_matrix_complex_long_double * m);
+int gsl_matrix_complex_long_double_fprintf (FILE * stream, const gsl_matrix_complex_long_double * m, const char * format);
+
+int gsl_matrix_complex_long_double_memcpy(gsl_matrix_complex_long_double * dest, const gsl_matrix_complex_long_double * src);
+int gsl_matrix_complex_long_double_swap(gsl_matrix_complex_long_double * m1, gsl_matrix_complex_long_double * m2);
+
+int gsl_matrix_complex_long_double_swap_rows(gsl_matrix_complex_long_double * m, const size_t i, const size_t j);
+int gsl_matrix_complex_long_double_swap_columns(gsl_matrix_complex_long_double * m, const size_t i, const size_t j);
+int gsl_matrix_complex_long_double_swap_rowcol(gsl_matrix_complex_long_double * m, const size_t i, const size_t j);
+
+int gsl_matrix_complex_long_double_transpose (gsl_matrix_complex_long_double * m);
+int gsl_matrix_complex_long_double_transpose_memcpy (gsl_matrix_complex_long_double * dest, const gsl_matrix_complex_long_double * src);
+
+int gsl_matrix_complex_long_double_isnull (const gsl_matrix_complex_long_double * m);
+int gsl_matrix_complex_long_double_ispos (const gsl_matrix_complex_long_double * m);
+int gsl_matrix_complex_long_double_isneg (const gsl_matrix_complex_long_double * m);
+
+int gsl_matrix_complex_long_double_add (gsl_matrix_complex_long_double * a, const gsl_matrix_complex_long_double * b);
+int gsl_matrix_complex_long_double_sub (gsl_matrix_complex_long_double * a, const gsl_matrix_complex_long_double * b);
+int gsl_matrix_complex_long_double_mul_elements (gsl_matrix_complex_long_double * a, const gsl_matrix_complex_long_double * b);
+int gsl_matrix_complex_long_double_div_elements (gsl_matrix_complex_long_double * a, const gsl_matrix_complex_long_double * b);
+int gsl_matrix_complex_long_double_scale (gsl_matrix_complex_long_double * a, const gsl_complex_long_double x);
+int gsl_matrix_complex_long_double_add_constant (gsl_matrix_complex_long_double * a, const gsl_complex_long_double x);
+int gsl_matrix_complex_long_double_add_diagonal (gsl_matrix_complex_long_double * a, const gsl_complex_long_double x);
+
+/***********************************************************************/
+/* The functions below are obsolete */
+/***********************************************************************/
+int gsl_matrix_complex_long_double_get_row(gsl_vector_complex_long_double * v, const gsl_matrix_complex_long_double * m, const size_t i);
+int gsl_matrix_complex_long_double_get_col(gsl_vector_complex_long_double * v, const gsl_matrix_complex_long_double * m, const size_t j);
+int gsl_matrix_complex_long_double_set_row(gsl_matrix_complex_long_double * m, const size_t i, const gsl_vector_complex_long_double * v);
+int gsl_matrix_complex_long_double_set_col(gsl_matrix_complex_long_double * m, const size_t j, const gsl_vector_complex_long_double * v);
+
+#ifdef HAVE_INLINE
+
+extern inline
+gsl_complex_long_double
+gsl_matrix_complex_long_double_get(const gsl_matrix_complex_long_double * m,
+ const size_t i, const size_t j)
+{
+#if GSL_RANGE_CHECK
+ gsl_complex_long_double zero = {{0,0}};
+
+ if (i >= m->size1)
+ {
+ GSL_ERROR_VAL("first index out of range", GSL_EINVAL, zero) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_VAL("second index out of range", GSL_EINVAL, zero) ;
+ }
+#endif
+ return *(gsl_complex_long_double *)(m->data + 2*(i * m->tda + j)) ;
+}
+
+extern inline
+void
+gsl_matrix_complex_long_double_set(gsl_matrix_complex_long_double * m,
+ const size_t i, const size_t j, const gsl_complex_long_double x)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_VOID("first index out of range", GSL_EINVAL) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_VOID("second index out of range", GSL_EINVAL) ;
+ }
+#endif
+ *(gsl_complex_long_double *)(m->data + 2*(i * m->tda + j)) = x ;
+}
+
+extern inline
+gsl_complex_long_double *
+gsl_matrix_complex_long_double_ptr(gsl_matrix_complex_long_double * m,
+ const size_t i, const size_t j)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ;
+ }
+#endif
+ return (gsl_complex_long_double *)(m->data + 2*(i * m->tda + j)) ;
+}
+
+extern inline
+const gsl_complex_long_double *
+gsl_matrix_complex_long_double_const_ptr(const gsl_matrix_complex_long_double * m,
+ const size_t i, const size_t j)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ;
+ }
+#endif
+ return (const gsl_complex_long_double *)(m->data + 2*(i * m->tda + j)) ;
+}
+
+#endif /* HAVE_INLINE */
+
+__END_DECLS
+
+#endif /* __GSL_MATRIX_COMPLEX_LONG_DOUBLE_H__ */
diff --git a/gsl-1.9/matrix/gsl_matrix_double.h b/gsl-1.9/matrix/gsl_matrix_double.h
new file mode 100644
index 0000000..e31ee0b
--- /dev/null
+++ b/gsl-1.9/matrix/gsl_matrix_double.h
@@ -0,0 +1,318 @@
+/* matrix/gsl_matrix_double.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_MATRIX_DOUBLE_H__
+#define __GSL_MATRIX_DOUBLE_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_types.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_check_range.h>
+#include <gsl/gsl_vector_double.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+typedef struct
+{
+ size_t size1;
+ size_t size2;
+ size_t tda;
+ double * data;
+ gsl_block * block;
+ int owner;
+} gsl_matrix;
+
+typedef struct
+{
+ gsl_matrix matrix;
+} _gsl_matrix_view;
+
+typedef _gsl_matrix_view gsl_matrix_view;
+
+typedef struct
+{
+ gsl_matrix matrix;
+} _gsl_matrix_const_view;
+
+typedef const _gsl_matrix_const_view gsl_matrix_const_view;
+
+/* Allocation */
+
+gsl_matrix *
+gsl_matrix_alloc (const size_t n1, const size_t n2);
+
+gsl_matrix *
+gsl_matrix_calloc (const size_t n1, const size_t n2);
+
+gsl_matrix *
+gsl_matrix_alloc_from_block (gsl_block * b,
+ const size_t offset,
+ const size_t n1,
+ const size_t n2,
+ const size_t d2);
+
+gsl_matrix *
+gsl_matrix_alloc_from_matrix (gsl_matrix * m,
+ const size_t k1,
+ const size_t k2,
+ const size_t n1,
+ const size_t n2);
+
+gsl_vector *
+gsl_vector_alloc_row_from_matrix (gsl_matrix * m,
+ const size_t i);
+
+gsl_vector *
+gsl_vector_alloc_col_from_matrix (gsl_matrix * m,
+ const size_t j);
+
+void gsl_matrix_free (gsl_matrix * m);
+
+/* Views */
+
+_gsl_matrix_view
+gsl_matrix_submatrix (gsl_matrix * m,
+ const size_t i, const size_t j,
+ const size_t n1, const size_t n2);
+
+_gsl_vector_view
+gsl_matrix_row (gsl_matrix * m, const size_t i);
+
+_gsl_vector_view
+gsl_matrix_column (gsl_matrix * m, const size_t j);
+
+_gsl_vector_view
+gsl_matrix_diagonal (gsl_matrix * m);
+
+_gsl_vector_view
+gsl_matrix_subdiagonal (gsl_matrix * m, const size_t k);
+
+_gsl_vector_view
+gsl_matrix_superdiagonal (gsl_matrix * m, const size_t k);
+
+_gsl_matrix_view
+gsl_matrix_view_array (double * base,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_view
+gsl_matrix_view_array_with_tda (double * base,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+
+_gsl_matrix_view
+gsl_matrix_view_vector (gsl_vector * v,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_view
+gsl_matrix_view_vector_with_tda (gsl_vector * v,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+
+_gsl_matrix_const_view
+gsl_matrix_const_submatrix (const gsl_matrix * m,
+ const size_t i, const size_t j,
+ const size_t n1, const size_t n2);
+
+_gsl_vector_const_view
+gsl_matrix_const_row (const gsl_matrix * m,
+ const size_t i);
+
+_gsl_vector_const_view
+gsl_matrix_const_column (const gsl_matrix * m,
+ const size_t j);
+
+_gsl_vector_const_view
+gsl_matrix_const_diagonal (const gsl_matrix * m);
+
+_gsl_vector_const_view
+gsl_matrix_const_subdiagonal (const gsl_matrix * m,
+ const size_t k);
+
+_gsl_vector_const_view
+gsl_matrix_const_superdiagonal (const gsl_matrix * m,
+ const size_t k);
+
+_gsl_matrix_const_view
+gsl_matrix_const_view_array (const double * base,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_const_view
+gsl_matrix_const_view_array_with_tda (const double * base,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+_gsl_matrix_const_view
+gsl_matrix_const_view_vector (const gsl_vector * v,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_const_view
+gsl_matrix_const_view_vector_with_tda (const gsl_vector * v,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+/* Operations */
+
+double gsl_matrix_get(const gsl_matrix * m, const size_t i, const size_t j);
+void gsl_matrix_set(gsl_matrix * m, const size_t i, const size_t j, const double x);
+
+double * gsl_matrix_ptr(gsl_matrix * m, const size_t i, const size_t j);
+const double * gsl_matrix_const_ptr(const gsl_matrix * m, const size_t i, const size_t j);
+
+void gsl_matrix_set_zero (gsl_matrix * m);
+void gsl_matrix_set_identity (gsl_matrix * m);
+void gsl_matrix_set_all (gsl_matrix * m, double x);
+
+int gsl_matrix_fread (FILE * stream, gsl_matrix * m) ;
+int gsl_matrix_fwrite (FILE * stream, const gsl_matrix * m) ;
+int gsl_matrix_fscanf (FILE * stream, gsl_matrix * m);
+int gsl_matrix_fprintf (FILE * stream, const gsl_matrix * m, const char * format);
+
+int gsl_matrix_memcpy(gsl_matrix * dest, const gsl_matrix * src);
+int gsl_matrix_swap(gsl_matrix * m1, gsl_matrix * m2);
+
+int gsl_matrix_swap_rows(gsl_matrix * m, const size_t i, const size_t j);
+int gsl_matrix_swap_columns(gsl_matrix * m, const size_t i, const size_t j);
+int gsl_matrix_swap_rowcol(gsl_matrix * m, const size_t i, const size_t j);
+int gsl_matrix_transpose (gsl_matrix * m);
+int gsl_matrix_transpose_memcpy (gsl_matrix * dest, const gsl_matrix * src);
+
+double gsl_matrix_max (const gsl_matrix * m);
+double gsl_matrix_min (const gsl_matrix * m);
+void gsl_matrix_minmax (const gsl_matrix * m, double * min_out, double * max_out);
+
+void gsl_matrix_max_index (const gsl_matrix * m, size_t * imax, size_t *jmax);
+void gsl_matrix_min_index (const gsl_matrix * m, size_t * imin, size_t *jmin);
+void gsl_matrix_minmax_index (const gsl_matrix * m, size_t * imin, size_t * jmin, size_t * imax, size_t * jmax);
+
+int gsl_matrix_isnull (const gsl_matrix * m);
+int gsl_matrix_ispos (const gsl_matrix * m);
+int gsl_matrix_isneg (const gsl_matrix * m);
+
+int gsl_matrix_add (gsl_matrix * a, const gsl_matrix * b);
+int gsl_matrix_sub (gsl_matrix * a, const gsl_matrix * b);
+int gsl_matrix_mul_elements (gsl_matrix * a, const gsl_matrix * b);
+int gsl_matrix_div_elements (gsl_matrix * a, const gsl_matrix * b);
+int gsl_matrix_scale (gsl_matrix * a, const double x);
+int gsl_matrix_add_constant (gsl_matrix * a, const double x);
+int gsl_matrix_add_diagonal (gsl_matrix * a, const double x);
+
+/***********************************************************************/
+/* The functions below are obsolete */
+/***********************************************************************/
+int gsl_matrix_get_row(gsl_vector * v, const gsl_matrix * m, const size_t i);
+int gsl_matrix_get_col(gsl_vector * v, const gsl_matrix * m, const size_t j);
+int gsl_matrix_set_row(gsl_matrix * m, const size_t i, const gsl_vector * v);
+int gsl_matrix_set_col(gsl_matrix * m, const size_t j, const gsl_vector * v);
+
+/* inline functions if you are using GCC */
+
+#ifdef HAVE_INLINE
+extern inline
+double
+gsl_matrix_get(const gsl_matrix * m, const size_t i, const size_t j)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_VAL("first index out of range", GSL_EINVAL, 0) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_VAL("second index out of range", GSL_EINVAL, 0) ;
+ }
+#endif
+ return m->data[i * m->tda + j] ;
+}
+
+extern inline
+void
+gsl_matrix_set(gsl_matrix * m, const size_t i, const size_t j, const double x)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_VOID("first index out of range", GSL_EINVAL) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_VOID("second index out of range", GSL_EINVAL) ;
+ }
+#endif
+ m->data[i * m->tda + j] = x ;
+}
+
+extern inline
+double *
+gsl_matrix_ptr(gsl_matrix * m, const size_t i, const size_t j)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ;
+ }
+#endif
+ return (double *) (m->data + (i * m->tda + j)) ;
+}
+
+extern inline
+const double *
+gsl_matrix_const_ptr(const gsl_matrix * m, const size_t i, const size_t j)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ;
+ }
+#endif
+ return (const double *) (m->data + (i * m->tda + j)) ;
+}
+
+#endif
+
+__END_DECLS
+
+#endif /* __GSL_MATRIX_DOUBLE_H__ */
diff --git a/gsl-1.9/matrix/gsl_matrix_float.h b/gsl-1.9/matrix/gsl_matrix_float.h
new file mode 100644
index 0000000..3d0ce75
--- /dev/null
+++ b/gsl-1.9/matrix/gsl_matrix_float.h
@@ -0,0 +1,318 @@
+/* matrix/gsl_matrix_float.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_MATRIX_FLOAT_H__
+#define __GSL_MATRIX_FLOAT_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_types.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_check_range.h>
+#include <gsl/gsl_vector_float.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+typedef struct
+{
+ size_t size1;
+ size_t size2;
+ size_t tda;
+ float * data;
+ gsl_block_float * block;
+ int owner;
+} gsl_matrix_float;
+
+typedef struct
+{
+ gsl_matrix_float matrix;
+} _gsl_matrix_float_view;
+
+typedef _gsl_matrix_float_view gsl_matrix_float_view;
+
+typedef struct
+{
+ gsl_matrix_float matrix;
+} _gsl_matrix_float_const_view;
+
+typedef const _gsl_matrix_float_const_view gsl_matrix_float_const_view;
+
+/* Allocation */
+
+gsl_matrix_float *
+gsl_matrix_float_alloc (const size_t n1, const size_t n2);
+
+gsl_matrix_float *
+gsl_matrix_float_calloc (const size_t n1, const size_t n2);
+
+gsl_matrix_float *
+gsl_matrix_float_alloc_from_block (gsl_block_float * b,
+ const size_t offset,
+ const size_t n1,
+ const size_t n2,
+ const size_t d2);
+
+gsl_matrix_float *
+gsl_matrix_float_alloc_from_matrix (gsl_matrix_float * m,
+ const size_t k1,
+ const size_t k2,
+ const size_t n1,
+ const size_t n2);
+
+gsl_vector_float *
+gsl_vector_float_alloc_row_from_matrix (gsl_matrix_float * m,
+ const size_t i);
+
+gsl_vector_float *
+gsl_vector_float_alloc_col_from_matrix (gsl_matrix_float * m,
+ const size_t j);
+
+void gsl_matrix_float_free (gsl_matrix_float * m);
+
+/* Views */
+
+_gsl_matrix_float_view
+gsl_matrix_float_submatrix (gsl_matrix_float * m,
+ const size_t i, const size_t j,
+ const size_t n1, const size_t n2);
+
+_gsl_vector_float_view
+gsl_matrix_float_row (gsl_matrix_float * m, const size_t i);
+
+_gsl_vector_float_view
+gsl_matrix_float_column (gsl_matrix_float * m, const size_t j);
+
+_gsl_vector_float_view
+gsl_matrix_float_diagonal (gsl_matrix_float * m);
+
+_gsl_vector_float_view
+gsl_matrix_float_subdiagonal (gsl_matrix_float * m, const size_t k);
+
+_gsl_vector_float_view
+gsl_matrix_float_superdiagonal (gsl_matrix_float * m, const size_t k);
+
+_gsl_matrix_float_view
+gsl_matrix_float_view_array (float * base,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_float_view
+gsl_matrix_float_view_array_with_tda (float * base,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+
+_gsl_matrix_float_view
+gsl_matrix_float_view_vector (gsl_vector_float * v,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_float_view
+gsl_matrix_float_view_vector_with_tda (gsl_vector_float * v,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+
+_gsl_matrix_float_const_view
+gsl_matrix_float_const_submatrix (const gsl_matrix_float * m,
+ const size_t i, const size_t j,
+ const size_t n1, const size_t n2);
+
+_gsl_vector_float_const_view
+gsl_matrix_float_const_row (const gsl_matrix_float * m,
+ const size_t i);
+
+_gsl_vector_float_const_view
+gsl_matrix_float_const_column (const gsl_matrix_float * m,
+ const size_t j);
+
+_gsl_vector_float_const_view
+gsl_matrix_float_const_diagonal (const gsl_matrix_float * m);
+
+_gsl_vector_float_const_view
+gsl_matrix_float_const_subdiagonal (const gsl_matrix_float * m,
+ const size_t k);
+
+_gsl_vector_float_const_view
+gsl_matrix_float_const_superdiagonal (const gsl_matrix_float * m,
+ const size_t k);
+
+_gsl_matrix_float_const_view
+gsl_matrix_float_const_view_array (const float * base,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_float_const_view
+gsl_matrix_float_const_view_array_with_tda (const float * base,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+_gsl_matrix_float_const_view
+gsl_matrix_float_const_view_vector (const gsl_vector_float * v,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_float_const_view
+gsl_matrix_float_const_view_vector_with_tda (const gsl_vector_float * v,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+/* Operations */
+
+float gsl_matrix_float_get(const gsl_matrix_float * m, const size_t i, const size_t j);
+void gsl_matrix_float_set(gsl_matrix_float * m, const size_t i, const size_t j, const float x);
+
+float * gsl_matrix_float_ptr(gsl_matrix_float * m, const size_t i, const size_t j);
+const float * gsl_matrix_float_const_ptr(const gsl_matrix_float * m, const size_t i, const size_t j);
+
+void gsl_matrix_float_set_zero (gsl_matrix_float * m);
+void gsl_matrix_float_set_identity (gsl_matrix_float * m);
+void gsl_matrix_float_set_all (gsl_matrix_float * m, float x);
+
+int gsl_matrix_float_fread (FILE * stream, gsl_matrix_float * m) ;
+int gsl_matrix_float_fwrite (FILE * stream, const gsl_matrix_float * m) ;
+int gsl_matrix_float_fscanf (FILE * stream, gsl_matrix_float * m);
+int gsl_matrix_float_fprintf (FILE * stream, const gsl_matrix_float * m, const char * format);
+
+int gsl_matrix_float_memcpy(gsl_matrix_float * dest, const gsl_matrix_float * src);
+int gsl_matrix_float_swap(gsl_matrix_float * m1, gsl_matrix_float * m2);
+
+int gsl_matrix_float_swap_rows(gsl_matrix_float * m, const size_t i, const size_t j);
+int gsl_matrix_float_swap_columns(gsl_matrix_float * m, const size_t i, const size_t j);
+int gsl_matrix_float_swap_rowcol(gsl_matrix_float * m, const size_t i, const size_t j);
+int gsl_matrix_float_transpose (gsl_matrix_float * m);
+int gsl_matrix_float_transpose_memcpy (gsl_matrix_float * dest, const gsl_matrix_float * src);
+
+float gsl_matrix_float_max (const gsl_matrix_float * m);
+float gsl_matrix_float_min (const gsl_matrix_float * m);
+void gsl_matrix_float_minmax (const gsl_matrix_float * m, float * min_out, float * max_out);
+
+void gsl_matrix_float_max_index (const gsl_matrix_float * m, size_t * imax, size_t *jmax);
+void gsl_matrix_float_min_index (const gsl_matrix_float * m, size_t * imin, size_t *jmin);
+void gsl_matrix_float_minmax_index (const gsl_matrix_float * m, size_t * imin, size_t * jmin, size_t * imax, size_t * jmax);
+
+int gsl_matrix_float_isnull (const gsl_matrix_float * m);
+int gsl_matrix_float_ispos (const gsl_matrix_float * m);
+int gsl_matrix_float_isneg (const gsl_matrix_float * m);
+
+int gsl_matrix_float_add (gsl_matrix_float * a, const gsl_matrix_float * b);
+int gsl_matrix_float_sub (gsl_matrix_float * a, const gsl_matrix_float * b);
+int gsl_matrix_float_mul_elements (gsl_matrix_float * a, const gsl_matrix_float * b);
+int gsl_matrix_float_div_elements (gsl_matrix_float * a, const gsl_matrix_float * b);
+int gsl_matrix_float_scale (gsl_matrix_float * a, const double x);
+int gsl_matrix_float_add_constant (gsl_matrix_float * a, const double x);
+int gsl_matrix_float_add_diagonal (gsl_matrix_float * a, const double x);
+
+/***********************************************************************/
+/* The functions below are obsolete */
+/***********************************************************************/
+int gsl_matrix_float_get_row(gsl_vector_float * v, const gsl_matrix_float * m, const size_t i);
+int gsl_matrix_float_get_col(gsl_vector_float * v, const gsl_matrix_float * m, const size_t j);
+int gsl_matrix_float_set_row(gsl_matrix_float * m, const size_t i, const gsl_vector_float * v);
+int gsl_matrix_float_set_col(gsl_matrix_float * m, const size_t j, const gsl_vector_float * v);
+
+/* inline functions if you are using GCC */
+
+#ifdef HAVE_INLINE
+extern inline
+float
+gsl_matrix_float_get(const gsl_matrix_float * m, const size_t i, const size_t j)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_VAL("first index out of range", GSL_EINVAL, 0) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_VAL("second index out of range", GSL_EINVAL, 0) ;
+ }
+#endif
+ return m->data[i * m->tda + j] ;
+}
+
+extern inline
+void
+gsl_matrix_float_set(gsl_matrix_float * m, const size_t i, const size_t j, const float x)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_VOID("first index out of range", GSL_EINVAL) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_VOID("second index out of range", GSL_EINVAL) ;
+ }
+#endif
+ m->data[i * m->tda + j] = x ;
+}
+
+extern inline
+float *
+gsl_matrix_float_ptr(gsl_matrix_float * m, const size_t i, const size_t j)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ;
+ }
+#endif
+ return (float *) (m->data + (i * m->tda + j)) ;
+}
+
+extern inline
+const float *
+gsl_matrix_float_const_ptr(const gsl_matrix_float * m, const size_t i, const size_t j)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ;
+ }
+#endif
+ return (const float *) (m->data + (i * m->tda + j)) ;
+}
+
+#endif
+
+__END_DECLS
+
+#endif /* __GSL_MATRIX_FLOAT_H__ */
diff --git a/gsl-1.9/matrix/gsl_matrix_int.h b/gsl-1.9/matrix/gsl_matrix_int.h
new file mode 100644
index 0000000..f8b5079
--- /dev/null
+++ b/gsl-1.9/matrix/gsl_matrix_int.h
@@ -0,0 +1,318 @@
+/* matrix/gsl_matrix_int.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_MATRIX_INT_H__
+#define __GSL_MATRIX_INT_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_types.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_check_range.h>
+#include <gsl/gsl_vector_int.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+typedef struct
+{
+ size_t size1;
+ size_t size2;
+ size_t tda;
+ int * data;
+ gsl_block_int * block;
+ int owner;
+} gsl_matrix_int;
+
+typedef struct
+{
+ gsl_matrix_int matrix;
+} _gsl_matrix_int_view;
+
+typedef _gsl_matrix_int_view gsl_matrix_int_view;
+
+typedef struct
+{
+ gsl_matrix_int matrix;
+} _gsl_matrix_int_const_view;
+
+typedef const _gsl_matrix_int_const_view gsl_matrix_int_const_view;
+
+/* Allocation */
+
+gsl_matrix_int *
+gsl_matrix_int_alloc (const size_t n1, const size_t n2);
+
+gsl_matrix_int *
+gsl_matrix_int_calloc (const size_t n1, const size_t n2);
+
+gsl_matrix_int *
+gsl_matrix_int_alloc_from_block (gsl_block_int * b,
+ const size_t offset,
+ const size_t n1,
+ const size_t n2,
+ const size_t d2);
+
+gsl_matrix_int *
+gsl_matrix_int_alloc_from_matrix (gsl_matrix_int * m,
+ const size_t k1,
+ const size_t k2,
+ const size_t n1,
+ const size_t n2);
+
+gsl_vector_int *
+gsl_vector_int_alloc_row_from_matrix (gsl_matrix_int * m,
+ const size_t i);
+
+gsl_vector_int *
+gsl_vector_int_alloc_col_from_matrix (gsl_matrix_int * m,
+ const size_t j);
+
+void gsl_matrix_int_free (gsl_matrix_int * m);
+
+/* Views */
+
+_gsl_matrix_int_view
+gsl_matrix_int_submatrix (gsl_matrix_int * m,
+ const size_t i, const size_t j,
+ const size_t n1, const size_t n2);
+
+_gsl_vector_int_view
+gsl_matrix_int_row (gsl_matrix_int * m, const size_t i);
+
+_gsl_vector_int_view
+gsl_matrix_int_column (gsl_matrix_int * m, const size_t j);
+
+_gsl_vector_int_view
+gsl_matrix_int_diagonal (gsl_matrix_int * m);
+
+_gsl_vector_int_view
+gsl_matrix_int_subdiagonal (gsl_matrix_int * m, const size_t k);
+
+_gsl_vector_int_view
+gsl_matrix_int_superdiagonal (gsl_matrix_int * m, const size_t k);
+
+_gsl_matrix_int_view
+gsl_matrix_int_view_array (int * base,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_int_view
+gsl_matrix_int_view_array_with_tda (int * base,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+
+_gsl_matrix_int_view
+gsl_matrix_int_view_vector (gsl_vector_int * v,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_int_view
+gsl_matrix_int_view_vector_with_tda (gsl_vector_int * v,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+
+_gsl_matrix_int_const_view
+gsl_matrix_int_const_submatrix (const gsl_matrix_int * m,
+ const size_t i, const size_t j,
+ const size_t n1, const size_t n2);
+
+_gsl_vector_int_const_view
+gsl_matrix_int_const_row (const gsl_matrix_int * m,
+ const size_t i);
+
+_gsl_vector_int_const_view
+gsl_matrix_int_const_column (const gsl_matrix_int * m,
+ const size_t j);
+
+_gsl_vector_int_const_view
+gsl_matrix_int_const_diagonal (const gsl_matrix_int * m);
+
+_gsl_vector_int_const_view
+gsl_matrix_int_const_subdiagonal (const gsl_matrix_int * m,
+ const size_t k);
+
+_gsl_vector_int_const_view
+gsl_matrix_int_const_superdiagonal (const gsl_matrix_int * m,
+ const size_t k);
+
+_gsl_matrix_int_const_view
+gsl_matrix_int_const_view_array (const int * base,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_int_const_view
+gsl_matrix_int_const_view_array_with_tda (const int * base,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+_gsl_matrix_int_const_view
+gsl_matrix_int_const_view_vector (const gsl_vector_int * v,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_int_const_view
+gsl_matrix_int_const_view_vector_with_tda (const gsl_vector_int * v,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+/* Operations */
+
+int gsl_matrix_int_get(const gsl_matrix_int * m, const size_t i, const size_t j);
+void gsl_matrix_int_set(gsl_matrix_int * m, const size_t i, const size_t j, const int x);
+
+int * gsl_matrix_int_ptr(gsl_matrix_int * m, const size_t i, const size_t j);
+const int * gsl_matrix_int_const_ptr(const gsl_matrix_int * m, const size_t i, const size_t j);
+
+void gsl_matrix_int_set_zero (gsl_matrix_int * m);
+void gsl_matrix_int_set_identity (gsl_matrix_int * m);
+void gsl_matrix_int_set_all (gsl_matrix_int * m, int x);
+
+int gsl_matrix_int_fread (FILE * stream, gsl_matrix_int * m) ;
+int gsl_matrix_int_fwrite (FILE * stream, const gsl_matrix_int * m) ;
+int gsl_matrix_int_fscanf (FILE * stream, gsl_matrix_int * m);
+int gsl_matrix_int_fprintf (FILE * stream, const gsl_matrix_int * m, const char * format);
+
+int gsl_matrix_int_memcpy(gsl_matrix_int * dest, const gsl_matrix_int * src);
+int gsl_matrix_int_swap(gsl_matrix_int * m1, gsl_matrix_int * m2);
+
+int gsl_matrix_int_swap_rows(gsl_matrix_int * m, const size_t i, const size_t j);
+int gsl_matrix_int_swap_columns(gsl_matrix_int * m, const size_t i, const size_t j);
+int gsl_matrix_int_swap_rowcol(gsl_matrix_int * m, const size_t i, const size_t j);
+int gsl_matrix_int_transpose (gsl_matrix_int * m);
+int gsl_matrix_int_transpose_memcpy (gsl_matrix_int * dest, const gsl_matrix_int * src);
+
+int gsl_matrix_int_max (const gsl_matrix_int * m);
+int gsl_matrix_int_min (const gsl_matrix_int * m);
+void gsl_matrix_int_minmax (const gsl_matrix_int * m, int * min_out, int * max_out);
+
+void gsl_matrix_int_max_index (const gsl_matrix_int * m, size_t * imax, size_t *jmax);
+void gsl_matrix_int_min_index (const gsl_matrix_int * m, size_t * imin, size_t *jmin);
+void gsl_matrix_int_minmax_index (const gsl_matrix_int * m, size_t * imin, size_t * jmin, size_t * imax, size_t * jmax);
+
+int gsl_matrix_int_isnull (const gsl_matrix_int * m);
+int gsl_matrix_int_ispos (const gsl_matrix_int * m);
+int gsl_matrix_int_isneg (const gsl_matrix_int * m);
+
+int gsl_matrix_int_add (gsl_matrix_int * a, const gsl_matrix_int * b);
+int gsl_matrix_int_sub (gsl_matrix_int * a, const gsl_matrix_int * b);
+int gsl_matrix_int_mul_elements (gsl_matrix_int * a, const gsl_matrix_int * b);
+int gsl_matrix_int_div_elements (gsl_matrix_int * a, const gsl_matrix_int * b);
+int gsl_matrix_int_scale (gsl_matrix_int * a, const double x);
+int gsl_matrix_int_add_constant (gsl_matrix_int * a, const double x);
+int gsl_matrix_int_add_diagonal (gsl_matrix_int * a, const double x);
+
+/***********************************************************************/
+/* The functions below are obsolete */
+/***********************************************************************/
+int gsl_matrix_int_get_row(gsl_vector_int * v, const gsl_matrix_int * m, const size_t i);
+int gsl_matrix_int_get_col(gsl_vector_int * v, const gsl_matrix_int * m, const size_t j);
+int gsl_matrix_int_set_row(gsl_matrix_int * m, const size_t i, const gsl_vector_int * v);
+int gsl_matrix_int_set_col(gsl_matrix_int * m, const size_t j, const gsl_vector_int * v);
+
+/* inline functions if you are using GCC */
+
+#ifdef HAVE_INLINE
+extern inline
+int
+gsl_matrix_int_get(const gsl_matrix_int * m, const size_t i, const size_t j)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_VAL("first index out of range", GSL_EINVAL, 0) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_VAL("second index out of range", GSL_EINVAL, 0) ;
+ }
+#endif
+ return m->data[i * m->tda + j] ;
+}
+
+extern inline
+void
+gsl_matrix_int_set(gsl_matrix_int * m, const size_t i, const size_t j, const int x)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_VOID("first index out of range", GSL_EINVAL) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_VOID("second index out of range", GSL_EINVAL) ;
+ }
+#endif
+ m->data[i * m->tda + j] = x ;
+}
+
+extern inline
+int *
+gsl_matrix_int_ptr(gsl_matrix_int * m, const size_t i, const size_t j)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ;
+ }
+#endif
+ return (int *) (m->data + (i * m->tda + j)) ;
+}
+
+extern inline
+const int *
+gsl_matrix_int_const_ptr(const gsl_matrix_int * m, const size_t i, const size_t j)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ;
+ }
+#endif
+ return (const int *) (m->data + (i * m->tda + j)) ;
+}
+
+#endif
+
+__END_DECLS
+
+#endif /* __GSL_MATRIX_INT_H__ */
diff --git a/gsl-1.9/matrix/gsl_matrix_long.h b/gsl-1.9/matrix/gsl_matrix_long.h
new file mode 100644
index 0000000..745ee48
--- /dev/null
+++ b/gsl-1.9/matrix/gsl_matrix_long.h
@@ -0,0 +1,318 @@
+/* matrix/gsl_matrix_long.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_MATRIX_LONG_H__
+#define __GSL_MATRIX_LONG_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_types.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_check_range.h>
+#include <gsl/gsl_vector_long.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+typedef struct
+{
+ size_t size1;
+ size_t size2;
+ size_t tda;
+ long * data;
+ gsl_block_long * block;
+ int owner;
+} gsl_matrix_long;
+
+typedef struct
+{
+ gsl_matrix_long matrix;
+} _gsl_matrix_long_view;
+
+typedef _gsl_matrix_long_view gsl_matrix_long_view;
+
+typedef struct
+{
+ gsl_matrix_long matrix;
+} _gsl_matrix_long_const_view;
+
+typedef const _gsl_matrix_long_const_view gsl_matrix_long_const_view;
+
+/* Allocation */
+
+gsl_matrix_long *
+gsl_matrix_long_alloc (const size_t n1, const size_t n2);
+
+gsl_matrix_long *
+gsl_matrix_long_calloc (const size_t n1, const size_t n2);
+
+gsl_matrix_long *
+gsl_matrix_long_alloc_from_block (gsl_block_long * b,
+ const size_t offset,
+ const size_t n1,
+ const size_t n2,
+ const size_t d2);
+
+gsl_matrix_long *
+gsl_matrix_long_alloc_from_matrix (gsl_matrix_long * m,
+ const size_t k1,
+ const size_t k2,
+ const size_t n1,
+ const size_t n2);
+
+gsl_vector_long *
+gsl_vector_long_alloc_row_from_matrix (gsl_matrix_long * m,
+ const size_t i);
+
+gsl_vector_long *
+gsl_vector_long_alloc_col_from_matrix (gsl_matrix_long * m,
+ const size_t j);
+
+void gsl_matrix_long_free (gsl_matrix_long * m);
+
+/* Views */
+
+_gsl_matrix_long_view
+gsl_matrix_long_submatrix (gsl_matrix_long * m,
+ const size_t i, const size_t j,
+ const size_t n1, const size_t n2);
+
+_gsl_vector_long_view
+gsl_matrix_long_row (gsl_matrix_long * m, const size_t i);
+
+_gsl_vector_long_view
+gsl_matrix_long_column (gsl_matrix_long * m, const size_t j);
+
+_gsl_vector_long_view
+gsl_matrix_long_diagonal (gsl_matrix_long * m);
+
+_gsl_vector_long_view
+gsl_matrix_long_subdiagonal (gsl_matrix_long * m, const size_t k);
+
+_gsl_vector_long_view
+gsl_matrix_long_superdiagonal (gsl_matrix_long * m, const size_t k);
+
+_gsl_matrix_long_view
+gsl_matrix_long_view_array (long * base,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_long_view
+gsl_matrix_long_view_array_with_tda (long * base,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+
+_gsl_matrix_long_view
+gsl_matrix_long_view_vector (gsl_vector_long * v,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_long_view
+gsl_matrix_long_view_vector_with_tda (gsl_vector_long * v,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+
+_gsl_matrix_long_const_view
+gsl_matrix_long_const_submatrix (const gsl_matrix_long * m,
+ const size_t i, const size_t j,
+ const size_t n1, const size_t n2);
+
+_gsl_vector_long_const_view
+gsl_matrix_long_const_row (const gsl_matrix_long * m,
+ const size_t i);
+
+_gsl_vector_long_const_view
+gsl_matrix_long_const_column (const gsl_matrix_long * m,
+ const size_t j);
+
+_gsl_vector_long_const_view
+gsl_matrix_long_const_diagonal (const gsl_matrix_long * m);
+
+_gsl_vector_long_const_view
+gsl_matrix_long_const_subdiagonal (const gsl_matrix_long * m,
+ const size_t k);
+
+_gsl_vector_long_const_view
+gsl_matrix_long_const_superdiagonal (const gsl_matrix_long * m,
+ const size_t k);
+
+_gsl_matrix_long_const_view
+gsl_matrix_long_const_view_array (const long * base,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_long_const_view
+gsl_matrix_long_const_view_array_with_tda (const long * base,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+_gsl_matrix_long_const_view
+gsl_matrix_long_const_view_vector (const gsl_vector_long * v,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_long_const_view
+gsl_matrix_long_const_view_vector_with_tda (const gsl_vector_long * v,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+/* Operations */
+
+long gsl_matrix_long_get(const gsl_matrix_long * m, const size_t i, const size_t j);
+void gsl_matrix_long_set(gsl_matrix_long * m, const size_t i, const size_t j, const long x);
+
+long * gsl_matrix_long_ptr(gsl_matrix_long * m, const size_t i, const size_t j);
+const long * gsl_matrix_long_const_ptr(const gsl_matrix_long * m, const size_t i, const size_t j);
+
+void gsl_matrix_long_set_zero (gsl_matrix_long * m);
+void gsl_matrix_long_set_identity (gsl_matrix_long * m);
+void gsl_matrix_long_set_all (gsl_matrix_long * m, long x);
+
+int gsl_matrix_long_fread (FILE * stream, gsl_matrix_long * m) ;
+int gsl_matrix_long_fwrite (FILE * stream, const gsl_matrix_long * m) ;
+int gsl_matrix_long_fscanf (FILE * stream, gsl_matrix_long * m);
+int gsl_matrix_long_fprintf (FILE * stream, const gsl_matrix_long * m, const char * format);
+
+int gsl_matrix_long_memcpy(gsl_matrix_long * dest, const gsl_matrix_long * src);
+int gsl_matrix_long_swap(gsl_matrix_long * m1, gsl_matrix_long * m2);
+
+int gsl_matrix_long_swap_rows(gsl_matrix_long * m, const size_t i, const size_t j);
+int gsl_matrix_long_swap_columns(gsl_matrix_long * m, const size_t i, const size_t j);
+int gsl_matrix_long_swap_rowcol(gsl_matrix_long * m, const size_t i, const size_t j);
+int gsl_matrix_long_transpose (gsl_matrix_long * m);
+int gsl_matrix_long_transpose_memcpy (gsl_matrix_long * dest, const gsl_matrix_long * src);
+
+long gsl_matrix_long_max (const gsl_matrix_long * m);
+long gsl_matrix_long_min (const gsl_matrix_long * m);
+void gsl_matrix_long_minmax (const gsl_matrix_long * m, long * min_out, long * max_out);
+
+void gsl_matrix_long_max_index (const gsl_matrix_long * m, size_t * imax, size_t *jmax);
+void gsl_matrix_long_min_index (const gsl_matrix_long * m, size_t * imin, size_t *jmin);
+void gsl_matrix_long_minmax_index (const gsl_matrix_long * m, size_t * imin, size_t * jmin, size_t * imax, size_t * jmax);
+
+int gsl_matrix_long_isnull (const gsl_matrix_long * m);
+int gsl_matrix_long_ispos (const gsl_matrix_long * m);
+int gsl_matrix_long_isneg (const gsl_matrix_long * m);
+
+int gsl_matrix_long_add (gsl_matrix_long * a, const gsl_matrix_long * b);
+int gsl_matrix_long_sub (gsl_matrix_long * a, const gsl_matrix_long * b);
+int gsl_matrix_long_mul_elements (gsl_matrix_long * a, const gsl_matrix_long * b);
+int gsl_matrix_long_div_elements (gsl_matrix_long * a, const gsl_matrix_long * b);
+int gsl_matrix_long_scale (gsl_matrix_long * a, const double x);
+int gsl_matrix_long_add_constant (gsl_matrix_long * a, const double x);
+int gsl_matrix_long_add_diagonal (gsl_matrix_long * a, const double x);
+
+/***********************************************************************/
+/* The functions below are obsolete */
+/***********************************************************************/
+int gsl_matrix_long_get_row(gsl_vector_long * v, const gsl_matrix_long * m, const size_t i);
+int gsl_matrix_long_get_col(gsl_vector_long * v, const gsl_matrix_long * m, const size_t j);
+int gsl_matrix_long_set_row(gsl_matrix_long * m, const size_t i, const gsl_vector_long * v);
+int gsl_matrix_long_set_col(gsl_matrix_long * m, const size_t j, const gsl_vector_long * v);
+
+/* inline functions if you are using GCC */
+
+#ifdef HAVE_INLINE
+extern inline
+long
+gsl_matrix_long_get(const gsl_matrix_long * m, const size_t i, const size_t j)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_VAL("first index out of range", GSL_EINVAL, 0) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_VAL("second index out of range", GSL_EINVAL, 0) ;
+ }
+#endif
+ return m->data[i * m->tda + j] ;
+}
+
+extern inline
+void
+gsl_matrix_long_set(gsl_matrix_long * m, const size_t i, const size_t j, const long x)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_VOID("first index out of range", GSL_EINVAL) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_VOID("second index out of range", GSL_EINVAL) ;
+ }
+#endif
+ m->data[i * m->tda + j] = x ;
+}
+
+extern inline
+long *
+gsl_matrix_long_ptr(gsl_matrix_long * m, const size_t i, const size_t j)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ;
+ }
+#endif
+ return (long *) (m->data + (i * m->tda + j)) ;
+}
+
+extern inline
+const long *
+gsl_matrix_long_const_ptr(const gsl_matrix_long * m, const size_t i, const size_t j)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ;
+ }
+#endif
+ return (const long *) (m->data + (i * m->tda + j)) ;
+}
+
+#endif
+
+__END_DECLS
+
+#endif /* __GSL_MATRIX_LONG_H__ */
diff --git a/gsl-1.9/matrix/gsl_matrix_long_double.h b/gsl-1.9/matrix/gsl_matrix_long_double.h
new file mode 100644
index 0000000..3670105
--- /dev/null
+++ b/gsl-1.9/matrix/gsl_matrix_long_double.h
@@ -0,0 +1,318 @@
+/* matrix/gsl_matrix_long_double.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_MATRIX_LONG_DOUBLE_H__
+#define __GSL_MATRIX_LONG_DOUBLE_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_types.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_check_range.h>
+#include <gsl/gsl_vector_long_double.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+typedef struct
+{
+ size_t size1;
+ size_t size2;
+ size_t tda;
+ long double * data;
+ gsl_block_long_double * block;
+ int owner;
+} gsl_matrix_long_double;
+
+typedef struct
+{
+ gsl_matrix_long_double matrix;
+} _gsl_matrix_long_double_view;
+
+typedef _gsl_matrix_long_double_view gsl_matrix_long_double_view;
+
+typedef struct
+{
+ gsl_matrix_long_double matrix;
+} _gsl_matrix_long_double_const_view;
+
+typedef const _gsl_matrix_long_double_const_view gsl_matrix_long_double_const_view;
+
+/* Allocation */
+
+gsl_matrix_long_double *
+gsl_matrix_long_double_alloc (const size_t n1, const size_t n2);
+
+gsl_matrix_long_double *
+gsl_matrix_long_double_calloc (const size_t n1, const size_t n2);
+
+gsl_matrix_long_double *
+gsl_matrix_long_double_alloc_from_block (gsl_block_long_double * b,
+ const size_t offset,
+ const size_t n1,
+ const size_t n2,
+ const size_t d2);
+
+gsl_matrix_long_double *
+gsl_matrix_long_double_alloc_from_matrix (gsl_matrix_long_double * m,
+ const size_t k1,
+ const size_t k2,
+ const size_t n1,
+ const size_t n2);
+
+gsl_vector_long_double *
+gsl_vector_long_double_alloc_row_from_matrix (gsl_matrix_long_double * m,
+ const size_t i);
+
+gsl_vector_long_double *
+gsl_vector_long_double_alloc_col_from_matrix (gsl_matrix_long_double * m,
+ const size_t j);
+
+void gsl_matrix_long_double_free (gsl_matrix_long_double * m);
+
+/* Views */
+
+_gsl_matrix_long_double_view
+gsl_matrix_long_double_submatrix (gsl_matrix_long_double * m,
+ const size_t i, const size_t j,
+ const size_t n1, const size_t n2);
+
+_gsl_vector_long_double_view
+gsl_matrix_long_double_row (gsl_matrix_long_double * m, const size_t i);
+
+_gsl_vector_long_double_view
+gsl_matrix_long_double_column (gsl_matrix_long_double * m, const size_t j);
+
+_gsl_vector_long_double_view
+gsl_matrix_long_double_diagonal (gsl_matrix_long_double * m);
+
+_gsl_vector_long_double_view
+gsl_matrix_long_double_subdiagonal (gsl_matrix_long_double * m, const size_t k);
+
+_gsl_vector_long_double_view
+gsl_matrix_long_double_superdiagonal (gsl_matrix_long_double * m, const size_t k);
+
+_gsl_matrix_long_double_view
+gsl_matrix_long_double_view_array (long double * base,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_long_double_view
+gsl_matrix_long_double_view_array_with_tda (long double * base,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+
+_gsl_matrix_long_double_view
+gsl_matrix_long_double_view_vector (gsl_vector_long_double * v,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_long_double_view
+gsl_matrix_long_double_view_vector_with_tda (gsl_vector_long_double * v,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+
+_gsl_matrix_long_double_const_view
+gsl_matrix_long_double_const_submatrix (const gsl_matrix_long_double * m,
+ const size_t i, const size_t j,
+ const size_t n1, const size_t n2);
+
+_gsl_vector_long_double_const_view
+gsl_matrix_long_double_const_row (const gsl_matrix_long_double * m,
+ const size_t i);
+
+_gsl_vector_long_double_const_view
+gsl_matrix_long_double_const_column (const gsl_matrix_long_double * m,
+ const size_t j);
+
+_gsl_vector_long_double_const_view
+gsl_matrix_long_double_const_diagonal (const gsl_matrix_long_double * m);
+
+_gsl_vector_long_double_const_view
+gsl_matrix_long_double_const_subdiagonal (const gsl_matrix_long_double * m,
+ const size_t k);
+
+_gsl_vector_long_double_const_view
+gsl_matrix_long_double_const_superdiagonal (const gsl_matrix_long_double * m,
+ const size_t k);
+
+_gsl_matrix_long_double_const_view
+gsl_matrix_long_double_const_view_array (const long double * base,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_long_double_const_view
+gsl_matrix_long_double_const_view_array_with_tda (const long double * base,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+_gsl_matrix_long_double_const_view
+gsl_matrix_long_double_const_view_vector (const gsl_vector_long_double * v,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_long_double_const_view
+gsl_matrix_long_double_const_view_vector_with_tda (const gsl_vector_long_double * v,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+/* Operations */
+
+long double gsl_matrix_long_double_get(const gsl_matrix_long_double * m, const size_t i, const size_t j);
+void gsl_matrix_long_double_set(gsl_matrix_long_double * m, const size_t i, const size_t j, const long double x);
+
+long double * gsl_matrix_long_double_ptr(gsl_matrix_long_double * m, const size_t i, const size_t j);
+const long double * gsl_matrix_long_double_const_ptr(const gsl_matrix_long_double * m, const size_t i, const size_t j);
+
+void gsl_matrix_long_double_set_zero (gsl_matrix_long_double * m);
+void gsl_matrix_long_double_set_identity (gsl_matrix_long_double * m);
+void gsl_matrix_long_double_set_all (gsl_matrix_long_double * m, long double x);
+
+int gsl_matrix_long_double_fread (FILE * stream, gsl_matrix_long_double * m) ;
+int gsl_matrix_long_double_fwrite (FILE * stream, const gsl_matrix_long_double * m) ;
+int gsl_matrix_long_double_fscanf (FILE * stream, gsl_matrix_long_double * m);
+int gsl_matrix_long_double_fprintf (FILE * stream, const gsl_matrix_long_double * m, const char * format);
+
+int gsl_matrix_long_double_memcpy(gsl_matrix_long_double * dest, const gsl_matrix_long_double * src);
+int gsl_matrix_long_double_swap(gsl_matrix_long_double * m1, gsl_matrix_long_double * m2);
+
+int gsl_matrix_long_double_swap_rows(gsl_matrix_long_double * m, const size_t i, const size_t j);
+int gsl_matrix_long_double_swap_columns(gsl_matrix_long_double * m, const size_t i, const size_t j);
+int gsl_matrix_long_double_swap_rowcol(gsl_matrix_long_double * m, const size_t i, const size_t j);
+int gsl_matrix_long_double_transpose (gsl_matrix_long_double * m);
+int gsl_matrix_long_double_transpose_memcpy (gsl_matrix_long_double * dest, const gsl_matrix_long_double * src);
+
+long double gsl_matrix_long_double_max (const gsl_matrix_long_double * m);
+long double gsl_matrix_long_double_min (const gsl_matrix_long_double * m);
+void gsl_matrix_long_double_minmax (const gsl_matrix_long_double * m, long double * min_out, long double * max_out);
+
+void gsl_matrix_long_double_max_index (const gsl_matrix_long_double * m, size_t * imax, size_t *jmax);
+void gsl_matrix_long_double_min_index (const gsl_matrix_long_double * m, size_t * imin, size_t *jmin);
+void gsl_matrix_long_double_minmax_index (const gsl_matrix_long_double * m, size_t * imin, size_t * jmin, size_t * imax, size_t * jmax);
+
+int gsl_matrix_long_double_isnull (const gsl_matrix_long_double * m);
+int gsl_matrix_long_double_ispos (const gsl_matrix_long_double * m);
+int gsl_matrix_long_double_isneg (const gsl_matrix_long_double * m);
+
+int gsl_matrix_long_double_add (gsl_matrix_long_double * a, const gsl_matrix_long_double * b);
+int gsl_matrix_long_double_sub (gsl_matrix_long_double * a, const gsl_matrix_long_double * b);
+int gsl_matrix_long_double_mul_elements (gsl_matrix_long_double * a, const gsl_matrix_long_double * b);
+int gsl_matrix_long_double_div_elements (gsl_matrix_long_double * a, const gsl_matrix_long_double * b);
+int gsl_matrix_long_double_scale (gsl_matrix_long_double * a, const double x);
+int gsl_matrix_long_double_add_constant (gsl_matrix_long_double * a, const double x);
+int gsl_matrix_long_double_add_diagonal (gsl_matrix_long_double * a, const double x);
+
+/***********************************************************************/
+/* The functions below are obsolete */
+/***********************************************************************/
+int gsl_matrix_long_double_get_row(gsl_vector_long_double * v, const gsl_matrix_long_double * m, const size_t i);
+int gsl_matrix_long_double_get_col(gsl_vector_long_double * v, const gsl_matrix_long_double * m, const size_t j);
+int gsl_matrix_long_double_set_row(gsl_matrix_long_double * m, const size_t i, const gsl_vector_long_double * v);
+int gsl_matrix_long_double_set_col(gsl_matrix_long_double * m, const size_t j, const gsl_vector_long_double * v);
+
+/* inline functions if you are using GCC */
+
+#ifdef HAVE_INLINE
+extern inline
+long double
+gsl_matrix_long_double_get(const gsl_matrix_long_double * m, const size_t i, const size_t j)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_VAL("first index out of range", GSL_EINVAL, 0) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_VAL("second index out of range", GSL_EINVAL, 0) ;
+ }
+#endif
+ return m->data[i * m->tda + j] ;
+}
+
+extern inline
+void
+gsl_matrix_long_double_set(gsl_matrix_long_double * m, const size_t i, const size_t j, const long double x)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_VOID("first index out of range", GSL_EINVAL) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_VOID("second index out of range", GSL_EINVAL) ;
+ }
+#endif
+ m->data[i * m->tda + j] = x ;
+}
+
+extern inline
+long double *
+gsl_matrix_long_double_ptr(gsl_matrix_long_double * m, const size_t i, const size_t j)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ;
+ }
+#endif
+ return (long double *) (m->data + (i * m->tda + j)) ;
+}
+
+extern inline
+const long double *
+gsl_matrix_long_double_const_ptr(const gsl_matrix_long_double * m, const size_t i, const size_t j)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ;
+ }
+#endif
+ return (const long double *) (m->data + (i * m->tda + j)) ;
+}
+
+#endif
+
+__END_DECLS
+
+#endif /* __GSL_MATRIX_LONG_DOUBLE_H__ */
diff --git a/gsl-1.9/matrix/gsl_matrix_short.h b/gsl-1.9/matrix/gsl_matrix_short.h
new file mode 100644
index 0000000..17fc71c
--- /dev/null
+++ b/gsl-1.9/matrix/gsl_matrix_short.h
@@ -0,0 +1,318 @@
+/* matrix/gsl_matrix_short.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_MATRIX_SHORT_H__
+#define __GSL_MATRIX_SHORT_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_types.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_check_range.h>
+#include <gsl/gsl_vector_short.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+typedef struct
+{
+ size_t size1;
+ size_t size2;
+ size_t tda;
+ short * data;
+ gsl_block_short * block;
+ int owner;
+} gsl_matrix_short;
+
+typedef struct
+{
+ gsl_matrix_short matrix;
+} _gsl_matrix_short_view;
+
+typedef _gsl_matrix_short_view gsl_matrix_short_view;
+
+typedef struct
+{
+ gsl_matrix_short matrix;
+} _gsl_matrix_short_const_view;
+
+typedef const _gsl_matrix_short_const_view gsl_matrix_short_const_view;
+
+/* Allocation */
+
+gsl_matrix_short *
+gsl_matrix_short_alloc (const size_t n1, const size_t n2);
+
+gsl_matrix_short *
+gsl_matrix_short_calloc (const size_t n1, const size_t n2);
+
+gsl_matrix_short *
+gsl_matrix_short_alloc_from_block (gsl_block_short * b,
+ const size_t offset,
+ const size_t n1,
+ const size_t n2,
+ const size_t d2);
+
+gsl_matrix_short *
+gsl_matrix_short_alloc_from_matrix (gsl_matrix_short * m,
+ const size_t k1,
+ const size_t k2,
+ const size_t n1,
+ const size_t n2);
+
+gsl_vector_short *
+gsl_vector_short_alloc_row_from_matrix (gsl_matrix_short * m,
+ const size_t i);
+
+gsl_vector_short *
+gsl_vector_short_alloc_col_from_matrix (gsl_matrix_short * m,
+ const size_t j);
+
+void gsl_matrix_short_free (gsl_matrix_short * m);
+
+/* Views */
+
+_gsl_matrix_short_view
+gsl_matrix_short_submatrix (gsl_matrix_short * m,
+ const size_t i, const size_t j,
+ const size_t n1, const size_t n2);
+
+_gsl_vector_short_view
+gsl_matrix_short_row (gsl_matrix_short * m, const size_t i);
+
+_gsl_vector_short_view
+gsl_matrix_short_column (gsl_matrix_short * m, const size_t j);
+
+_gsl_vector_short_view
+gsl_matrix_short_diagonal (gsl_matrix_short * m);
+
+_gsl_vector_short_view
+gsl_matrix_short_subdiagonal (gsl_matrix_short * m, const size_t k);
+
+_gsl_vector_short_view
+gsl_matrix_short_superdiagonal (gsl_matrix_short * m, const size_t k);
+
+_gsl_matrix_short_view
+gsl_matrix_short_view_array (short * base,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_short_view
+gsl_matrix_short_view_array_with_tda (short * base,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+
+_gsl_matrix_short_view
+gsl_matrix_short_view_vector (gsl_vector_short * v,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_short_view
+gsl_matrix_short_view_vector_with_tda (gsl_vector_short * v,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+
+_gsl_matrix_short_const_view
+gsl_matrix_short_const_submatrix (const gsl_matrix_short * m,
+ const size_t i, const size_t j,
+ const size_t n1, const size_t n2);
+
+_gsl_vector_short_const_view
+gsl_matrix_short_const_row (const gsl_matrix_short * m,
+ const size_t i);
+
+_gsl_vector_short_const_view
+gsl_matrix_short_const_column (const gsl_matrix_short * m,
+ const size_t j);
+
+_gsl_vector_short_const_view
+gsl_matrix_short_const_diagonal (const gsl_matrix_short * m);
+
+_gsl_vector_short_const_view
+gsl_matrix_short_const_subdiagonal (const gsl_matrix_short * m,
+ const size_t k);
+
+_gsl_vector_short_const_view
+gsl_matrix_short_const_superdiagonal (const gsl_matrix_short * m,
+ const size_t k);
+
+_gsl_matrix_short_const_view
+gsl_matrix_short_const_view_array (const short * base,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_short_const_view
+gsl_matrix_short_const_view_array_with_tda (const short * base,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+_gsl_matrix_short_const_view
+gsl_matrix_short_const_view_vector (const gsl_vector_short * v,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_short_const_view
+gsl_matrix_short_const_view_vector_with_tda (const gsl_vector_short * v,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+/* Operations */
+
+short gsl_matrix_short_get(const gsl_matrix_short * m, const size_t i, const size_t j);
+void gsl_matrix_short_set(gsl_matrix_short * m, const size_t i, const size_t j, const short x);
+
+short * gsl_matrix_short_ptr(gsl_matrix_short * m, const size_t i, const size_t j);
+const short * gsl_matrix_short_const_ptr(const gsl_matrix_short * m, const size_t i, const size_t j);
+
+void gsl_matrix_short_set_zero (gsl_matrix_short * m);
+void gsl_matrix_short_set_identity (gsl_matrix_short * m);
+void gsl_matrix_short_set_all (gsl_matrix_short * m, short x);
+
+int gsl_matrix_short_fread (FILE * stream, gsl_matrix_short * m) ;
+int gsl_matrix_short_fwrite (FILE * stream, const gsl_matrix_short * m) ;
+int gsl_matrix_short_fscanf (FILE * stream, gsl_matrix_short * m);
+int gsl_matrix_short_fprintf (FILE * stream, const gsl_matrix_short * m, const char * format);
+
+int gsl_matrix_short_memcpy(gsl_matrix_short * dest, const gsl_matrix_short * src);
+int gsl_matrix_short_swap(gsl_matrix_short * m1, gsl_matrix_short * m2);
+
+int gsl_matrix_short_swap_rows(gsl_matrix_short * m, const size_t i, const size_t j);
+int gsl_matrix_short_swap_columns(gsl_matrix_short * m, const size_t i, const size_t j);
+int gsl_matrix_short_swap_rowcol(gsl_matrix_short * m, const size_t i, const size_t j);
+int gsl_matrix_short_transpose (gsl_matrix_short * m);
+int gsl_matrix_short_transpose_memcpy (gsl_matrix_short * dest, const gsl_matrix_short * src);
+
+short gsl_matrix_short_max (const gsl_matrix_short * m);
+short gsl_matrix_short_min (const gsl_matrix_short * m);
+void gsl_matrix_short_minmax (const gsl_matrix_short * m, short * min_out, short * max_out);
+
+void gsl_matrix_short_max_index (const gsl_matrix_short * m, size_t * imax, size_t *jmax);
+void gsl_matrix_short_min_index (const gsl_matrix_short * m, size_t * imin, size_t *jmin);
+void gsl_matrix_short_minmax_index (const gsl_matrix_short * m, size_t * imin, size_t * jmin, size_t * imax, size_t * jmax);
+
+int gsl_matrix_short_isnull (const gsl_matrix_short * m);
+int gsl_matrix_short_ispos (const gsl_matrix_short * m);
+int gsl_matrix_short_isneg (const gsl_matrix_short * m);
+
+int gsl_matrix_short_add (gsl_matrix_short * a, const gsl_matrix_short * b);
+int gsl_matrix_short_sub (gsl_matrix_short * a, const gsl_matrix_short * b);
+int gsl_matrix_short_mul_elements (gsl_matrix_short * a, const gsl_matrix_short * b);
+int gsl_matrix_short_div_elements (gsl_matrix_short * a, const gsl_matrix_short * b);
+int gsl_matrix_short_scale (gsl_matrix_short * a, const double x);
+int gsl_matrix_short_add_constant (gsl_matrix_short * a, const double x);
+int gsl_matrix_short_add_diagonal (gsl_matrix_short * a, const double x);
+
+/***********************************************************************/
+/* The functions below are obsolete */
+/***********************************************************************/
+int gsl_matrix_short_get_row(gsl_vector_short * v, const gsl_matrix_short * m, const size_t i);
+int gsl_matrix_short_get_col(gsl_vector_short * v, const gsl_matrix_short * m, const size_t j);
+int gsl_matrix_short_set_row(gsl_matrix_short * m, const size_t i, const gsl_vector_short * v);
+int gsl_matrix_short_set_col(gsl_matrix_short * m, const size_t j, const gsl_vector_short * v);
+
+/* inline functions if you are using GCC */
+
+#ifdef HAVE_INLINE
+extern inline
+short
+gsl_matrix_short_get(const gsl_matrix_short * m, const size_t i, const size_t j)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_VAL("first index out of range", GSL_EINVAL, 0) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_VAL("second index out of range", GSL_EINVAL, 0) ;
+ }
+#endif
+ return m->data[i * m->tda + j] ;
+}
+
+extern inline
+void
+gsl_matrix_short_set(gsl_matrix_short * m, const size_t i, const size_t j, const short x)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_VOID("first index out of range", GSL_EINVAL) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_VOID("second index out of range", GSL_EINVAL) ;
+ }
+#endif
+ m->data[i * m->tda + j] = x ;
+}
+
+extern inline
+short *
+gsl_matrix_short_ptr(gsl_matrix_short * m, const size_t i, const size_t j)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ;
+ }
+#endif
+ return (short *) (m->data + (i * m->tda + j)) ;
+}
+
+extern inline
+const short *
+gsl_matrix_short_const_ptr(const gsl_matrix_short * m, const size_t i, const size_t j)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ;
+ }
+#endif
+ return (const short *) (m->data + (i * m->tda + j)) ;
+}
+
+#endif
+
+__END_DECLS
+
+#endif /* __GSL_MATRIX_SHORT_H__ */
diff --git a/gsl-1.9/matrix/gsl_matrix_uchar.h b/gsl-1.9/matrix/gsl_matrix_uchar.h
new file mode 100644
index 0000000..c85c012
--- /dev/null
+++ b/gsl-1.9/matrix/gsl_matrix_uchar.h
@@ -0,0 +1,318 @@
+/* matrix/gsl_matrix_uchar.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_MATRIX_UCHAR_H__
+#define __GSL_MATRIX_UCHAR_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_types.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_check_range.h>
+#include <gsl/gsl_vector_uchar.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+typedef struct
+{
+ size_t size1;
+ size_t size2;
+ size_t tda;
+ unsigned char * data;
+ gsl_block_uchar * block;
+ int owner;
+} gsl_matrix_uchar;
+
+typedef struct
+{
+ gsl_matrix_uchar matrix;
+} _gsl_matrix_uchar_view;
+
+typedef _gsl_matrix_uchar_view gsl_matrix_uchar_view;
+
+typedef struct
+{
+ gsl_matrix_uchar matrix;
+} _gsl_matrix_uchar_const_view;
+
+typedef const _gsl_matrix_uchar_const_view gsl_matrix_uchar_const_view;
+
+/* Allocation */
+
+gsl_matrix_uchar *
+gsl_matrix_uchar_alloc (const size_t n1, const size_t n2);
+
+gsl_matrix_uchar *
+gsl_matrix_uchar_calloc (const size_t n1, const size_t n2);
+
+gsl_matrix_uchar *
+gsl_matrix_uchar_alloc_from_block (gsl_block_uchar * b,
+ const size_t offset,
+ const size_t n1,
+ const size_t n2,
+ const size_t d2);
+
+gsl_matrix_uchar *
+gsl_matrix_uchar_alloc_from_matrix (gsl_matrix_uchar * m,
+ const size_t k1,
+ const size_t k2,
+ const size_t n1,
+ const size_t n2);
+
+gsl_vector_uchar *
+gsl_vector_uchar_alloc_row_from_matrix (gsl_matrix_uchar * m,
+ const size_t i);
+
+gsl_vector_uchar *
+gsl_vector_uchar_alloc_col_from_matrix (gsl_matrix_uchar * m,
+ const size_t j);
+
+void gsl_matrix_uchar_free (gsl_matrix_uchar * m);
+
+/* Views */
+
+_gsl_matrix_uchar_view
+gsl_matrix_uchar_submatrix (gsl_matrix_uchar * m,
+ const size_t i, const size_t j,
+ const size_t n1, const size_t n2);
+
+_gsl_vector_uchar_view
+gsl_matrix_uchar_row (gsl_matrix_uchar * m, const size_t i);
+
+_gsl_vector_uchar_view
+gsl_matrix_uchar_column (gsl_matrix_uchar * m, const size_t j);
+
+_gsl_vector_uchar_view
+gsl_matrix_uchar_diagonal (gsl_matrix_uchar * m);
+
+_gsl_vector_uchar_view
+gsl_matrix_uchar_subdiagonal (gsl_matrix_uchar * m, const size_t k);
+
+_gsl_vector_uchar_view
+gsl_matrix_uchar_superdiagonal (gsl_matrix_uchar * m, const size_t k);
+
+_gsl_matrix_uchar_view
+gsl_matrix_uchar_view_array (unsigned char * base,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_uchar_view
+gsl_matrix_uchar_view_array_with_tda (unsigned char * base,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+
+_gsl_matrix_uchar_view
+gsl_matrix_uchar_view_vector (gsl_vector_uchar * v,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_uchar_view
+gsl_matrix_uchar_view_vector_with_tda (gsl_vector_uchar * v,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+
+_gsl_matrix_uchar_const_view
+gsl_matrix_uchar_const_submatrix (const gsl_matrix_uchar * m,
+ const size_t i, const size_t j,
+ const size_t n1, const size_t n2);
+
+_gsl_vector_uchar_const_view
+gsl_matrix_uchar_const_row (const gsl_matrix_uchar * m,
+ const size_t i);
+
+_gsl_vector_uchar_const_view
+gsl_matrix_uchar_const_column (const gsl_matrix_uchar * m,
+ const size_t j);
+
+_gsl_vector_uchar_const_view
+gsl_matrix_uchar_const_diagonal (const gsl_matrix_uchar * m);
+
+_gsl_vector_uchar_const_view
+gsl_matrix_uchar_const_subdiagonal (const gsl_matrix_uchar * m,
+ const size_t k);
+
+_gsl_vector_uchar_const_view
+gsl_matrix_uchar_const_superdiagonal (const gsl_matrix_uchar * m,
+ const size_t k);
+
+_gsl_matrix_uchar_const_view
+gsl_matrix_uchar_const_view_array (const unsigned char * base,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_uchar_const_view
+gsl_matrix_uchar_const_view_array_with_tda (const unsigned char * base,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+_gsl_matrix_uchar_const_view
+gsl_matrix_uchar_const_view_vector (const gsl_vector_uchar * v,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_uchar_const_view
+gsl_matrix_uchar_const_view_vector_with_tda (const gsl_vector_uchar * v,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+/* Operations */
+
+unsigned char gsl_matrix_uchar_get(const gsl_matrix_uchar * m, const size_t i, const size_t j);
+void gsl_matrix_uchar_set(gsl_matrix_uchar * m, const size_t i, const size_t j, const unsigned char x);
+
+unsigned char * gsl_matrix_uchar_ptr(gsl_matrix_uchar * m, const size_t i, const size_t j);
+const unsigned char * gsl_matrix_uchar_const_ptr(const gsl_matrix_uchar * m, const size_t i, const size_t j);
+
+void gsl_matrix_uchar_set_zero (gsl_matrix_uchar * m);
+void gsl_matrix_uchar_set_identity (gsl_matrix_uchar * m);
+void gsl_matrix_uchar_set_all (gsl_matrix_uchar * m, unsigned char x);
+
+int gsl_matrix_uchar_fread (FILE * stream, gsl_matrix_uchar * m) ;
+int gsl_matrix_uchar_fwrite (FILE * stream, const gsl_matrix_uchar * m) ;
+int gsl_matrix_uchar_fscanf (FILE * stream, gsl_matrix_uchar * m);
+int gsl_matrix_uchar_fprintf (FILE * stream, const gsl_matrix_uchar * m, const char * format);
+
+int gsl_matrix_uchar_memcpy(gsl_matrix_uchar * dest, const gsl_matrix_uchar * src);
+int gsl_matrix_uchar_swap(gsl_matrix_uchar * m1, gsl_matrix_uchar * m2);
+
+int gsl_matrix_uchar_swap_rows(gsl_matrix_uchar * m, const size_t i, const size_t j);
+int gsl_matrix_uchar_swap_columns(gsl_matrix_uchar * m, const size_t i, const size_t j);
+int gsl_matrix_uchar_swap_rowcol(gsl_matrix_uchar * m, const size_t i, const size_t j);
+int gsl_matrix_uchar_transpose (gsl_matrix_uchar * m);
+int gsl_matrix_uchar_transpose_memcpy (gsl_matrix_uchar * dest, const gsl_matrix_uchar * src);
+
+unsigned char gsl_matrix_uchar_max (const gsl_matrix_uchar * m);
+unsigned char gsl_matrix_uchar_min (const gsl_matrix_uchar * m);
+void gsl_matrix_uchar_minmax (const gsl_matrix_uchar * m, unsigned char * min_out, unsigned char * max_out);
+
+void gsl_matrix_uchar_max_index (const gsl_matrix_uchar * m, size_t * imax, size_t *jmax);
+void gsl_matrix_uchar_min_index (const gsl_matrix_uchar * m, size_t * imin, size_t *jmin);
+void gsl_matrix_uchar_minmax_index (const gsl_matrix_uchar * m, size_t * imin, size_t * jmin, size_t * imax, size_t * jmax);
+
+int gsl_matrix_uchar_isnull (const gsl_matrix_uchar * m);
+int gsl_matrix_uchar_ispos (const gsl_matrix_uchar * m);
+int gsl_matrix_uchar_isneg (const gsl_matrix_uchar * m);
+
+int gsl_matrix_uchar_add (gsl_matrix_uchar * a, const gsl_matrix_uchar * b);
+int gsl_matrix_uchar_sub (gsl_matrix_uchar * a, const gsl_matrix_uchar * b);
+int gsl_matrix_uchar_mul_elements (gsl_matrix_uchar * a, const gsl_matrix_uchar * b);
+int gsl_matrix_uchar_div_elements (gsl_matrix_uchar * a, const gsl_matrix_uchar * b);
+int gsl_matrix_uchar_scale (gsl_matrix_uchar * a, const double x);
+int gsl_matrix_uchar_add_constant (gsl_matrix_uchar * a, const double x);
+int gsl_matrix_uchar_add_diagonal (gsl_matrix_uchar * a, const double x);
+
+/***********************************************************************/
+/* The functions below are obsolete */
+/***********************************************************************/
+int gsl_matrix_uchar_get_row(gsl_vector_uchar * v, const gsl_matrix_uchar * m, const size_t i);
+int gsl_matrix_uchar_get_col(gsl_vector_uchar * v, const gsl_matrix_uchar * m, const size_t j);
+int gsl_matrix_uchar_set_row(gsl_matrix_uchar * m, const size_t i, const gsl_vector_uchar * v);
+int gsl_matrix_uchar_set_col(gsl_matrix_uchar * m, const size_t j, const gsl_vector_uchar * v);
+
+/* inline functions if you are using GCC */
+
+#ifdef HAVE_INLINE
+extern inline
+unsigned char
+gsl_matrix_uchar_get(const gsl_matrix_uchar * m, const size_t i, const size_t j)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_VAL("first index out of range", GSL_EINVAL, 0) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_VAL("second index out of range", GSL_EINVAL, 0) ;
+ }
+#endif
+ return m->data[i * m->tda + j] ;
+}
+
+extern inline
+void
+gsl_matrix_uchar_set(gsl_matrix_uchar * m, const size_t i, const size_t j, const unsigned char x)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_VOID("first index out of range", GSL_EINVAL) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_VOID("second index out of range", GSL_EINVAL) ;
+ }
+#endif
+ m->data[i * m->tda + j] = x ;
+}
+
+extern inline
+unsigned char *
+gsl_matrix_uchar_ptr(gsl_matrix_uchar * m, const size_t i, const size_t j)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ;
+ }
+#endif
+ return (unsigned char *) (m->data + (i * m->tda + j)) ;
+}
+
+extern inline
+const unsigned char *
+gsl_matrix_uchar_const_ptr(const gsl_matrix_uchar * m, const size_t i, const size_t j)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ;
+ }
+#endif
+ return (const unsigned char *) (m->data + (i * m->tda + j)) ;
+}
+
+#endif
+
+__END_DECLS
+
+#endif /* __GSL_MATRIX_UCHAR_H__ */
diff --git a/gsl-1.9/matrix/gsl_matrix_uint.h b/gsl-1.9/matrix/gsl_matrix_uint.h
new file mode 100644
index 0000000..18a38eb
--- /dev/null
+++ b/gsl-1.9/matrix/gsl_matrix_uint.h
@@ -0,0 +1,318 @@
+/* matrix/gsl_matrix_uint.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_MATRIX_UINT_H__
+#define __GSL_MATRIX_UINT_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_types.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_check_range.h>
+#include <gsl/gsl_vector_uint.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+typedef struct
+{
+ size_t size1;
+ size_t size2;
+ size_t tda;
+ unsigned int * data;
+ gsl_block_uint * block;
+ int owner;
+} gsl_matrix_uint;
+
+typedef struct
+{
+ gsl_matrix_uint matrix;
+} _gsl_matrix_uint_view;
+
+typedef _gsl_matrix_uint_view gsl_matrix_uint_view;
+
+typedef struct
+{
+ gsl_matrix_uint matrix;
+} _gsl_matrix_uint_const_view;
+
+typedef const _gsl_matrix_uint_const_view gsl_matrix_uint_const_view;
+
+/* Allocation */
+
+gsl_matrix_uint *
+gsl_matrix_uint_alloc (const size_t n1, const size_t n2);
+
+gsl_matrix_uint *
+gsl_matrix_uint_calloc (const size_t n1, const size_t n2);
+
+gsl_matrix_uint *
+gsl_matrix_uint_alloc_from_block (gsl_block_uint * b,
+ const size_t offset,
+ const size_t n1,
+ const size_t n2,
+ const size_t d2);
+
+gsl_matrix_uint *
+gsl_matrix_uint_alloc_from_matrix (gsl_matrix_uint * m,
+ const size_t k1,
+ const size_t k2,
+ const size_t n1,
+ const size_t n2);
+
+gsl_vector_uint *
+gsl_vector_uint_alloc_row_from_matrix (gsl_matrix_uint * m,
+ const size_t i);
+
+gsl_vector_uint *
+gsl_vector_uint_alloc_col_from_matrix (gsl_matrix_uint * m,
+ const size_t j);
+
+void gsl_matrix_uint_free (gsl_matrix_uint * m);
+
+/* Views */
+
+_gsl_matrix_uint_view
+gsl_matrix_uint_submatrix (gsl_matrix_uint * m,
+ const size_t i, const size_t j,
+ const size_t n1, const size_t n2);
+
+_gsl_vector_uint_view
+gsl_matrix_uint_row (gsl_matrix_uint * m, const size_t i);
+
+_gsl_vector_uint_view
+gsl_matrix_uint_column (gsl_matrix_uint * m, const size_t j);
+
+_gsl_vector_uint_view
+gsl_matrix_uint_diagonal (gsl_matrix_uint * m);
+
+_gsl_vector_uint_view
+gsl_matrix_uint_subdiagonal (gsl_matrix_uint * m, const size_t k);
+
+_gsl_vector_uint_view
+gsl_matrix_uint_superdiagonal (gsl_matrix_uint * m, const size_t k);
+
+_gsl_matrix_uint_view
+gsl_matrix_uint_view_array (unsigned int * base,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_uint_view
+gsl_matrix_uint_view_array_with_tda (unsigned int * base,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+
+_gsl_matrix_uint_view
+gsl_matrix_uint_view_vector (gsl_vector_uint * v,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_uint_view
+gsl_matrix_uint_view_vector_with_tda (gsl_vector_uint * v,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+
+_gsl_matrix_uint_const_view
+gsl_matrix_uint_const_submatrix (const gsl_matrix_uint * m,
+ const size_t i, const size_t j,
+ const size_t n1, const size_t n2);
+
+_gsl_vector_uint_const_view
+gsl_matrix_uint_const_row (const gsl_matrix_uint * m,
+ const size_t i);
+
+_gsl_vector_uint_const_view
+gsl_matrix_uint_const_column (const gsl_matrix_uint * m,
+ const size_t j);
+
+_gsl_vector_uint_const_view
+gsl_matrix_uint_const_diagonal (const gsl_matrix_uint * m);
+
+_gsl_vector_uint_const_view
+gsl_matrix_uint_const_subdiagonal (const gsl_matrix_uint * m,
+ const size_t k);
+
+_gsl_vector_uint_const_view
+gsl_matrix_uint_const_superdiagonal (const gsl_matrix_uint * m,
+ const size_t k);
+
+_gsl_matrix_uint_const_view
+gsl_matrix_uint_const_view_array (const unsigned int * base,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_uint_const_view
+gsl_matrix_uint_const_view_array_with_tda (const unsigned int * base,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+_gsl_matrix_uint_const_view
+gsl_matrix_uint_const_view_vector (const gsl_vector_uint * v,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_uint_const_view
+gsl_matrix_uint_const_view_vector_with_tda (const gsl_vector_uint * v,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+/* Operations */
+
+unsigned int gsl_matrix_uint_get(const gsl_matrix_uint * m, const size_t i, const size_t j);
+void gsl_matrix_uint_set(gsl_matrix_uint * m, const size_t i, const size_t j, const unsigned int x);
+
+unsigned int * gsl_matrix_uint_ptr(gsl_matrix_uint * m, const size_t i, const size_t j);
+const unsigned int * gsl_matrix_uint_const_ptr(const gsl_matrix_uint * m, const size_t i, const size_t j);
+
+void gsl_matrix_uint_set_zero (gsl_matrix_uint * m);
+void gsl_matrix_uint_set_identity (gsl_matrix_uint * m);
+void gsl_matrix_uint_set_all (gsl_matrix_uint * m, unsigned int x);
+
+int gsl_matrix_uint_fread (FILE * stream, gsl_matrix_uint * m) ;
+int gsl_matrix_uint_fwrite (FILE * stream, const gsl_matrix_uint * m) ;
+int gsl_matrix_uint_fscanf (FILE * stream, gsl_matrix_uint * m);
+int gsl_matrix_uint_fprintf (FILE * stream, const gsl_matrix_uint * m, const char * format);
+
+int gsl_matrix_uint_memcpy(gsl_matrix_uint * dest, const gsl_matrix_uint * src);
+int gsl_matrix_uint_swap(gsl_matrix_uint * m1, gsl_matrix_uint * m2);
+
+int gsl_matrix_uint_swap_rows(gsl_matrix_uint * m, const size_t i, const size_t j);
+int gsl_matrix_uint_swap_columns(gsl_matrix_uint * m, const size_t i, const size_t j);
+int gsl_matrix_uint_swap_rowcol(gsl_matrix_uint * m, const size_t i, const size_t j);
+int gsl_matrix_uint_transpose (gsl_matrix_uint * m);
+int gsl_matrix_uint_transpose_memcpy (gsl_matrix_uint * dest, const gsl_matrix_uint * src);
+
+unsigned int gsl_matrix_uint_max (const gsl_matrix_uint * m);
+unsigned int gsl_matrix_uint_min (const gsl_matrix_uint * m);
+void gsl_matrix_uint_minmax (const gsl_matrix_uint * m, unsigned int * min_out, unsigned int * max_out);
+
+void gsl_matrix_uint_max_index (const gsl_matrix_uint * m, size_t * imax, size_t *jmax);
+void gsl_matrix_uint_min_index (const gsl_matrix_uint * m, size_t * imin, size_t *jmin);
+void gsl_matrix_uint_minmax_index (const gsl_matrix_uint * m, size_t * imin, size_t * jmin, size_t * imax, size_t * jmax);
+
+int gsl_matrix_uint_isnull (const gsl_matrix_uint * m);
+int gsl_matrix_uint_ispos (const gsl_matrix_uint * m);
+int gsl_matrix_uint_isneg (const gsl_matrix_uint * m);
+
+int gsl_matrix_uint_add (gsl_matrix_uint * a, const gsl_matrix_uint * b);
+int gsl_matrix_uint_sub (gsl_matrix_uint * a, const gsl_matrix_uint * b);
+int gsl_matrix_uint_mul_elements (gsl_matrix_uint * a, const gsl_matrix_uint * b);
+int gsl_matrix_uint_div_elements (gsl_matrix_uint * a, const gsl_matrix_uint * b);
+int gsl_matrix_uint_scale (gsl_matrix_uint * a, const double x);
+int gsl_matrix_uint_add_constant (gsl_matrix_uint * a, const double x);
+int gsl_matrix_uint_add_diagonal (gsl_matrix_uint * a, const double x);
+
+/***********************************************************************/
+/* The functions below are obsolete */
+/***********************************************************************/
+int gsl_matrix_uint_get_row(gsl_vector_uint * v, const gsl_matrix_uint * m, const size_t i);
+int gsl_matrix_uint_get_col(gsl_vector_uint * v, const gsl_matrix_uint * m, const size_t j);
+int gsl_matrix_uint_set_row(gsl_matrix_uint * m, const size_t i, const gsl_vector_uint * v);
+int gsl_matrix_uint_set_col(gsl_matrix_uint * m, const size_t j, const gsl_vector_uint * v);
+
+/* inline functions if you are using GCC */
+
+#ifdef HAVE_INLINE
+extern inline
+unsigned int
+gsl_matrix_uint_get(const gsl_matrix_uint * m, const size_t i, const size_t j)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_VAL("first index out of range", GSL_EINVAL, 0) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_VAL("second index out of range", GSL_EINVAL, 0) ;
+ }
+#endif
+ return m->data[i * m->tda + j] ;
+}
+
+extern inline
+void
+gsl_matrix_uint_set(gsl_matrix_uint * m, const size_t i, const size_t j, const unsigned int x)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_VOID("first index out of range", GSL_EINVAL) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_VOID("second index out of range", GSL_EINVAL) ;
+ }
+#endif
+ m->data[i * m->tda + j] = x ;
+}
+
+extern inline
+unsigned int *
+gsl_matrix_uint_ptr(gsl_matrix_uint * m, const size_t i, const size_t j)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ;
+ }
+#endif
+ return (unsigned int *) (m->data + (i * m->tda + j)) ;
+}
+
+extern inline
+const unsigned int *
+gsl_matrix_uint_const_ptr(const gsl_matrix_uint * m, const size_t i, const size_t j)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ;
+ }
+#endif
+ return (const unsigned int *) (m->data + (i * m->tda + j)) ;
+}
+
+#endif
+
+__END_DECLS
+
+#endif /* __GSL_MATRIX_UINT_H__ */
diff --git a/gsl-1.9/matrix/gsl_matrix_ulong.h b/gsl-1.9/matrix/gsl_matrix_ulong.h
new file mode 100644
index 0000000..d710fe0
--- /dev/null
+++ b/gsl-1.9/matrix/gsl_matrix_ulong.h
@@ -0,0 +1,318 @@
+/* matrix/gsl_matrix_ulong.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_MATRIX_ULONG_H__
+#define __GSL_MATRIX_ULONG_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_types.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_check_range.h>
+#include <gsl/gsl_vector_ulong.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+typedef struct
+{
+ size_t size1;
+ size_t size2;
+ size_t tda;
+ unsigned long * data;
+ gsl_block_ulong * block;
+ int owner;
+} gsl_matrix_ulong;
+
+typedef struct
+{
+ gsl_matrix_ulong matrix;
+} _gsl_matrix_ulong_view;
+
+typedef _gsl_matrix_ulong_view gsl_matrix_ulong_view;
+
+typedef struct
+{
+ gsl_matrix_ulong matrix;
+} _gsl_matrix_ulong_const_view;
+
+typedef const _gsl_matrix_ulong_const_view gsl_matrix_ulong_const_view;
+
+/* Allocation */
+
+gsl_matrix_ulong *
+gsl_matrix_ulong_alloc (const size_t n1, const size_t n2);
+
+gsl_matrix_ulong *
+gsl_matrix_ulong_calloc (const size_t n1, const size_t n2);
+
+gsl_matrix_ulong *
+gsl_matrix_ulong_alloc_from_block (gsl_block_ulong * b,
+ const size_t offset,
+ const size_t n1,
+ const size_t n2,
+ const size_t d2);
+
+gsl_matrix_ulong *
+gsl_matrix_ulong_alloc_from_matrix (gsl_matrix_ulong * m,
+ const size_t k1,
+ const size_t k2,
+ const size_t n1,
+ const size_t n2);
+
+gsl_vector_ulong *
+gsl_vector_ulong_alloc_row_from_matrix (gsl_matrix_ulong * m,
+ const size_t i);
+
+gsl_vector_ulong *
+gsl_vector_ulong_alloc_col_from_matrix (gsl_matrix_ulong * m,
+ const size_t j);
+
+void gsl_matrix_ulong_free (gsl_matrix_ulong * m);
+
+/* Views */
+
+_gsl_matrix_ulong_view
+gsl_matrix_ulong_submatrix (gsl_matrix_ulong * m,
+ const size_t i, const size_t j,
+ const size_t n1, const size_t n2);
+
+_gsl_vector_ulong_view
+gsl_matrix_ulong_row (gsl_matrix_ulong * m, const size_t i);
+
+_gsl_vector_ulong_view
+gsl_matrix_ulong_column (gsl_matrix_ulong * m, const size_t j);
+
+_gsl_vector_ulong_view
+gsl_matrix_ulong_diagonal (gsl_matrix_ulong * m);
+
+_gsl_vector_ulong_view
+gsl_matrix_ulong_subdiagonal (gsl_matrix_ulong * m, const size_t k);
+
+_gsl_vector_ulong_view
+gsl_matrix_ulong_superdiagonal (gsl_matrix_ulong * m, const size_t k);
+
+_gsl_matrix_ulong_view
+gsl_matrix_ulong_view_array (unsigned long * base,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_ulong_view
+gsl_matrix_ulong_view_array_with_tda (unsigned long * base,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+
+_gsl_matrix_ulong_view
+gsl_matrix_ulong_view_vector (gsl_vector_ulong * v,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_ulong_view
+gsl_matrix_ulong_view_vector_with_tda (gsl_vector_ulong * v,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+
+_gsl_matrix_ulong_const_view
+gsl_matrix_ulong_const_submatrix (const gsl_matrix_ulong * m,
+ const size_t i, const size_t j,
+ const size_t n1, const size_t n2);
+
+_gsl_vector_ulong_const_view
+gsl_matrix_ulong_const_row (const gsl_matrix_ulong * m,
+ const size_t i);
+
+_gsl_vector_ulong_const_view
+gsl_matrix_ulong_const_column (const gsl_matrix_ulong * m,
+ const size_t j);
+
+_gsl_vector_ulong_const_view
+gsl_matrix_ulong_const_diagonal (const gsl_matrix_ulong * m);
+
+_gsl_vector_ulong_const_view
+gsl_matrix_ulong_const_subdiagonal (const gsl_matrix_ulong * m,
+ const size_t k);
+
+_gsl_vector_ulong_const_view
+gsl_matrix_ulong_const_superdiagonal (const gsl_matrix_ulong * m,
+ const size_t k);
+
+_gsl_matrix_ulong_const_view
+gsl_matrix_ulong_const_view_array (const unsigned long * base,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_ulong_const_view
+gsl_matrix_ulong_const_view_array_with_tda (const unsigned long * base,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+_gsl_matrix_ulong_const_view
+gsl_matrix_ulong_const_view_vector (const gsl_vector_ulong * v,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_ulong_const_view
+gsl_matrix_ulong_const_view_vector_with_tda (const gsl_vector_ulong * v,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+/* Operations */
+
+unsigned long gsl_matrix_ulong_get(const gsl_matrix_ulong * m, const size_t i, const size_t j);
+void gsl_matrix_ulong_set(gsl_matrix_ulong * m, const size_t i, const size_t j, const unsigned long x);
+
+unsigned long * gsl_matrix_ulong_ptr(gsl_matrix_ulong * m, const size_t i, const size_t j);
+const unsigned long * gsl_matrix_ulong_const_ptr(const gsl_matrix_ulong * m, const size_t i, const size_t j);
+
+void gsl_matrix_ulong_set_zero (gsl_matrix_ulong * m);
+void gsl_matrix_ulong_set_identity (gsl_matrix_ulong * m);
+void gsl_matrix_ulong_set_all (gsl_matrix_ulong * m, unsigned long x);
+
+int gsl_matrix_ulong_fread (FILE * stream, gsl_matrix_ulong * m) ;
+int gsl_matrix_ulong_fwrite (FILE * stream, const gsl_matrix_ulong * m) ;
+int gsl_matrix_ulong_fscanf (FILE * stream, gsl_matrix_ulong * m);
+int gsl_matrix_ulong_fprintf (FILE * stream, const gsl_matrix_ulong * m, const char * format);
+
+int gsl_matrix_ulong_memcpy(gsl_matrix_ulong * dest, const gsl_matrix_ulong * src);
+int gsl_matrix_ulong_swap(gsl_matrix_ulong * m1, gsl_matrix_ulong * m2);
+
+int gsl_matrix_ulong_swap_rows(gsl_matrix_ulong * m, const size_t i, const size_t j);
+int gsl_matrix_ulong_swap_columns(gsl_matrix_ulong * m, const size_t i, const size_t j);
+int gsl_matrix_ulong_swap_rowcol(gsl_matrix_ulong * m, const size_t i, const size_t j);
+int gsl_matrix_ulong_transpose (gsl_matrix_ulong * m);
+int gsl_matrix_ulong_transpose_memcpy (gsl_matrix_ulong * dest, const gsl_matrix_ulong * src);
+
+unsigned long gsl_matrix_ulong_max (const gsl_matrix_ulong * m);
+unsigned long gsl_matrix_ulong_min (const gsl_matrix_ulong * m);
+void gsl_matrix_ulong_minmax (const gsl_matrix_ulong * m, unsigned long * min_out, unsigned long * max_out);
+
+void gsl_matrix_ulong_max_index (const gsl_matrix_ulong * m, size_t * imax, size_t *jmax);
+void gsl_matrix_ulong_min_index (const gsl_matrix_ulong * m, size_t * imin, size_t *jmin);
+void gsl_matrix_ulong_minmax_index (const gsl_matrix_ulong * m, size_t * imin, size_t * jmin, size_t * imax, size_t * jmax);
+
+int gsl_matrix_ulong_isnull (const gsl_matrix_ulong * m);
+int gsl_matrix_ulong_ispos (const gsl_matrix_ulong * m);
+int gsl_matrix_ulong_isneg (const gsl_matrix_ulong * m);
+
+int gsl_matrix_ulong_add (gsl_matrix_ulong * a, const gsl_matrix_ulong * b);
+int gsl_matrix_ulong_sub (gsl_matrix_ulong * a, const gsl_matrix_ulong * b);
+int gsl_matrix_ulong_mul_elements (gsl_matrix_ulong * a, const gsl_matrix_ulong * b);
+int gsl_matrix_ulong_div_elements (gsl_matrix_ulong * a, const gsl_matrix_ulong * b);
+int gsl_matrix_ulong_scale (gsl_matrix_ulong * a, const double x);
+int gsl_matrix_ulong_add_constant (gsl_matrix_ulong * a, const double x);
+int gsl_matrix_ulong_add_diagonal (gsl_matrix_ulong * a, const double x);
+
+/***********************************************************************/
+/* The functions below are obsolete */
+/***********************************************************************/
+int gsl_matrix_ulong_get_row(gsl_vector_ulong * v, const gsl_matrix_ulong * m, const size_t i);
+int gsl_matrix_ulong_get_col(gsl_vector_ulong * v, const gsl_matrix_ulong * m, const size_t j);
+int gsl_matrix_ulong_set_row(gsl_matrix_ulong * m, const size_t i, const gsl_vector_ulong * v);
+int gsl_matrix_ulong_set_col(gsl_matrix_ulong * m, const size_t j, const gsl_vector_ulong * v);
+
+/* inline functions if you are using GCC */
+
+#ifdef HAVE_INLINE
+extern inline
+unsigned long
+gsl_matrix_ulong_get(const gsl_matrix_ulong * m, const size_t i, const size_t j)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_VAL("first index out of range", GSL_EINVAL, 0) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_VAL("second index out of range", GSL_EINVAL, 0) ;
+ }
+#endif
+ return m->data[i * m->tda + j] ;
+}
+
+extern inline
+void
+gsl_matrix_ulong_set(gsl_matrix_ulong * m, const size_t i, const size_t j, const unsigned long x)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_VOID("first index out of range", GSL_EINVAL) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_VOID("second index out of range", GSL_EINVAL) ;
+ }
+#endif
+ m->data[i * m->tda + j] = x ;
+}
+
+extern inline
+unsigned long *
+gsl_matrix_ulong_ptr(gsl_matrix_ulong * m, const size_t i, const size_t j)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ;
+ }
+#endif
+ return (unsigned long *) (m->data + (i * m->tda + j)) ;
+}
+
+extern inline
+const unsigned long *
+gsl_matrix_ulong_const_ptr(const gsl_matrix_ulong * m, const size_t i, const size_t j)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ;
+ }
+#endif
+ return (const unsigned long *) (m->data + (i * m->tda + j)) ;
+}
+
+#endif
+
+__END_DECLS
+
+#endif /* __GSL_MATRIX_ULONG_H__ */
diff --git a/gsl-1.9/matrix/gsl_matrix_ushort.h b/gsl-1.9/matrix/gsl_matrix_ushort.h
new file mode 100644
index 0000000..ccfea93
--- /dev/null
+++ b/gsl-1.9/matrix/gsl_matrix_ushort.h
@@ -0,0 +1,318 @@
+/* matrix/gsl_matrix_ushort.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_MATRIX_USHORT_H__
+#define __GSL_MATRIX_USHORT_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_types.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_check_range.h>
+#include <gsl/gsl_vector_ushort.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+typedef struct
+{
+ size_t size1;
+ size_t size2;
+ size_t tda;
+ unsigned short * data;
+ gsl_block_ushort * block;
+ int owner;
+} gsl_matrix_ushort;
+
+typedef struct
+{
+ gsl_matrix_ushort matrix;
+} _gsl_matrix_ushort_view;
+
+typedef _gsl_matrix_ushort_view gsl_matrix_ushort_view;
+
+typedef struct
+{
+ gsl_matrix_ushort matrix;
+} _gsl_matrix_ushort_const_view;
+
+typedef const _gsl_matrix_ushort_const_view gsl_matrix_ushort_const_view;
+
+/* Allocation */
+
+gsl_matrix_ushort *
+gsl_matrix_ushort_alloc (const size_t n1, const size_t n2);
+
+gsl_matrix_ushort *
+gsl_matrix_ushort_calloc (const size_t n1, const size_t n2);
+
+gsl_matrix_ushort *
+gsl_matrix_ushort_alloc_from_block (gsl_block_ushort * b,
+ const size_t offset,
+ const size_t n1,
+ const size_t n2,
+ const size_t d2);
+
+gsl_matrix_ushort *
+gsl_matrix_ushort_alloc_from_matrix (gsl_matrix_ushort * m,
+ const size_t k1,
+ const size_t k2,
+ const size_t n1,
+ const size_t n2);
+
+gsl_vector_ushort *
+gsl_vector_ushort_alloc_row_from_matrix (gsl_matrix_ushort * m,
+ const size_t i);
+
+gsl_vector_ushort *
+gsl_vector_ushort_alloc_col_from_matrix (gsl_matrix_ushort * m,
+ const size_t j);
+
+void gsl_matrix_ushort_free (gsl_matrix_ushort * m);
+
+/* Views */
+
+_gsl_matrix_ushort_view
+gsl_matrix_ushort_submatrix (gsl_matrix_ushort * m,
+ const size_t i, const size_t j,
+ const size_t n1, const size_t n2);
+
+_gsl_vector_ushort_view
+gsl_matrix_ushort_row (gsl_matrix_ushort * m, const size_t i);
+
+_gsl_vector_ushort_view
+gsl_matrix_ushort_column (gsl_matrix_ushort * m, const size_t j);
+
+_gsl_vector_ushort_view
+gsl_matrix_ushort_diagonal (gsl_matrix_ushort * m);
+
+_gsl_vector_ushort_view
+gsl_matrix_ushort_subdiagonal (gsl_matrix_ushort * m, const size_t k);
+
+_gsl_vector_ushort_view
+gsl_matrix_ushort_superdiagonal (gsl_matrix_ushort * m, const size_t k);
+
+_gsl_matrix_ushort_view
+gsl_matrix_ushort_view_array (unsigned short * base,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_ushort_view
+gsl_matrix_ushort_view_array_with_tda (unsigned short * base,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+
+_gsl_matrix_ushort_view
+gsl_matrix_ushort_view_vector (gsl_vector_ushort * v,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_ushort_view
+gsl_matrix_ushort_view_vector_with_tda (gsl_vector_ushort * v,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+
+_gsl_matrix_ushort_const_view
+gsl_matrix_ushort_const_submatrix (const gsl_matrix_ushort * m,
+ const size_t i, const size_t j,
+ const size_t n1, const size_t n2);
+
+_gsl_vector_ushort_const_view
+gsl_matrix_ushort_const_row (const gsl_matrix_ushort * m,
+ const size_t i);
+
+_gsl_vector_ushort_const_view
+gsl_matrix_ushort_const_column (const gsl_matrix_ushort * m,
+ const size_t j);
+
+_gsl_vector_ushort_const_view
+gsl_matrix_ushort_const_diagonal (const gsl_matrix_ushort * m);
+
+_gsl_vector_ushort_const_view
+gsl_matrix_ushort_const_subdiagonal (const gsl_matrix_ushort * m,
+ const size_t k);
+
+_gsl_vector_ushort_const_view
+gsl_matrix_ushort_const_superdiagonal (const gsl_matrix_ushort * m,
+ const size_t k);
+
+_gsl_matrix_ushort_const_view
+gsl_matrix_ushort_const_view_array (const unsigned short * base,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_ushort_const_view
+gsl_matrix_ushort_const_view_array_with_tda (const unsigned short * base,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+_gsl_matrix_ushort_const_view
+gsl_matrix_ushort_const_view_vector (const gsl_vector_ushort * v,
+ const size_t n1,
+ const size_t n2);
+
+_gsl_matrix_ushort_const_view
+gsl_matrix_ushort_const_view_vector_with_tda (const gsl_vector_ushort * v,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda);
+
+/* Operations */
+
+unsigned short gsl_matrix_ushort_get(const gsl_matrix_ushort * m, const size_t i, const size_t j);
+void gsl_matrix_ushort_set(gsl_matrix_ushort * m, const size_t i, const size_t j, const unsigned short x);
+
+unsigned short * gsl_matrix_ushort_ptr(gsl_matrix_ushort * m, const size_t i, const size_t j);
+const unsigned short * gsl_matrix_ushort_const_ptr(const gsl_matrix_ushort * m, const size_t i, const size_t j);
+
+void gsl_matrix_ushort_set_zero (gsl_matrix_ushort * m);
+void gsl_matrix_ushort_set_identity (gsl_matrix_ushort * m);
+void gsl_matrix_ushort_set_all (gsl_matrix_ushort * m, unsigned short x);
+
+int gsl_matrix_ushort_fread (FILE * stream, gsl_matrix_ushort * m) ;
+int gsl_matrix_ushort_fwrite (FILE * stream, const gsl_matrix_ushort * m) ;
+int gsl_matrix_ushort_fscanf (FILE * stream, gsl_matrix_ushort * m);
+int gsl_matrix_ushort_fprintf (FILE * stream, const gsl_matrix_ushort * m, const char * format);
+
+int gsl_matrix_ushort_memcpy(gsl_matrix_ushort * dest, const gsl_matrix_ushort * src);
+int gsl_matrix_ushort_swap(gsl_matrix_ushort * m1, gsl_matrix_ushort * m2);
+
+int gsl_matrix_ushort_swap_rows(gsl_matrix_ushort * m, const size_t i, const size_t j);
+int gsl_matrix_ushort_swap_columns(gsl_matrix_ushort * m, const size_t i, const size_t j);
+int gsl_matrix_ushort_swap_rowcol(gsl_matrix_ushort * m, const size_t i, const size_t j);
+int gsl_matrix_ushort_transpose (gsl_matrix_ushort * m);
+int gsl_matrix_ushort_transpose_memcpy (gsl_matrix_ushort * dest, const gsl_matrix_ushort * src);
+
+unsigned short gsl_matrix_ushort_max (const gsl_matrix_ushort * m);
+unsigned short gsl_matrix_ushort_min (const gsl_matrix_ushort * m);
+void gsl_matrix_ushort_minmax (const gsl_matrix_ushort * m, unsigned short * min_out, unsigned short * max_out);
+
+void gsl_matrix_ushort_max_index (const gsl_matrix_ushort * m, size_t * imax, size_t *jmax);
+void gsl_matrix_ushort_min_index (const gsl_matrix_ushort * m, size_t * imin, size_t *jmin);
+void gsl_matrix_ushort_minmax_index (const gsl_matrix_ushort * m, size_t * imin, size_t * jmin, size_t * imax, size_t * jmax);
+
+int gsl_matrix_ushort_isnull (const gsl_matrix_ushort * m);
+int gsl_matrix_ushort_ispos (const gsl_matrix_ushort * m);
+int gsl_matrix_ushort_isneg (const gsl_matrix_ushort * m);
+
+int gsl_matrix_ushort_add (gsl_matrix_ushort * a, const gsl_matrix_ushort * b);
+int gsl_matrix_ushort_sub (gsl_matrix_ushort * a, const gsl_matrix_ushort * b);
+int gsl_matrix_ushort_mul_elements (gsl_matrix_ushort * a, const gsl_matrix_ushort * b);
+int gsl_matrix_ushort_div_elements (gsl_matrix_ushort * a, const gsl_matrix_ushort * b);
+int gsl_matrix_ushort_scale (gsl_matrix_ushort * a, const double x);
+int gsl_matrix_ushort_add_constant (gsl_matrix_ushort * a, const double x);
+int gsl_matrix_ushort_add_diagonal (gsl_matrix_ushort * a, const double x);
+
+/***********************************************************************/
+/* The functions below are obsolete */
+/***********************************************************************/
+int gsl_matrix_ushort_get_row(gsl_vector_ushort * v, const gsl_matrix_ushort * m, const size_t i);
+int gsl_matrix_ushort_get_col(gsl_vector_ushort * v, const gsl_matrix_ushort * m, const size_t j);
+int gsl_matrix_ushort_set_row(gsl_matrix_ushort * m, const size_t i, const gsl_vector_ushort * v);
+int gsl_matrix_ushort_set_col(gsl_matrix_ushort * m, const size_t j, const gsl_vector_ushort * v);
+
+/* inline functions if you are using GCC */
+
+#ifdef HAVE_INLINE
+extern inline
+unsigned short
+gsl_matrix_ushort_get(const gsl_matrix_ushort * m, const size_t i, const size_t j)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_VAL("first index out of range", GSL_EINVAL, 0) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_VAL("second index out of range", GSL_EINVAL, 0) ;
+ }
+#endif
+ return m->data[i * m->tda + j] ;
+}
+
+extern inline
+void
+gsl_matrix_ushort_set(gsl_matrix_ushort * m, const size_t i, const size_t j, const unsigned short x)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_VOID("first index out of range", GSL_EINVAL) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_VOID("second index out of range", GSL_EINVAL) ;
+ }
+#endif
+ m->data[i * m->tda + j] = x ;
+}
+
+extern inline
+unsigned short *
+gsl_matrix_ushort_ptr(gsl_matrix_ushort * m, const size_t i, const size_t j)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ;
+ }
+#endif
+ return (unsigned short *) (m->data + (i * m->tda + j)) ;
+}
+
+extern inline
+const unsigned short *
+gsl_matrix_ushort_const_ptr(const gsl_matrix_ushort * m, const size_t i, const size_t j)
+{
+#if GSL_RANGE_CHECK
+ if (i >= m->size1)
+ {
+ GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ;
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ;
+ }
+#endif
+ return (const unsigned short *) (m->data + (i * m->tda + j)) ;
+}
+
+#endif
+
+__END_DECLS
+
+#endif /* __GSL_MATRIX_USHORT_H__ */
diff --git a/gsl-1.9/matrix/init.c b/gsl-1.9/matrix/init.c
new file mode 100644
index 0000000..1f137af
--- /dev/null
+++ b/gsl-1.9/matrix/init.c
@@ -0,0 +1,87 @@
+#include <config.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_matrix.h>
+
+#define BASE_GSL_COMPLEX_LONG
+#include "templates_on.h"
+#include "init_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_LONG
+
+#define BASE_GSL_COMPLEX
+#include "templates_on.h"
+#include "init_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX
+
+#define BASE_GSL_COMPLEX_FLOAT
+#include "templates_on.h"
+#include "init_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_FLOAT
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "init_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "init_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "init_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "init_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "init_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "init_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "init_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "init_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "init_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "init_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "init_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
diff --git a/gsl-1.9/matrix/init_source.c b/gsl-1.9/matrix/init_source.c
new file mode 100644
index 0000000..90f80fa
--- /dev/null
+++ b/gsl-1.9/matrix/init_source.c
@@ -0,0 +1,250 @@
+/* matrix/init_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+TYPE (gsl_matrix) *
+FUNCTION (gsl_matrix, alloc) (const size_t n1, const size_t n2)
+{
+ TYPE (gsl_block) * block;
+ TYPE (gsl_matrix) * m;
+
+ if (n1 == 0)
+ {
+ GSL_ERROR_VAL ("matrix dimension n1 must be positive integer",
+ GSL_EINVAL, 0);
+ }
+ else if (n2 == 0)
+ {
+ GSL_ERROR_VAL ("matrix dimension n2 must be positive integer",
+ GSL_EINVAL, 0);
+ }
+
+ m = (TYPE (gsl_matrix) *) malloc (sizeof (TYPE (gsl_matrix)));
+
+ if (m == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for matrix struct",
+ GSL_ENOMEM, 0);
+ }
+
+ /* FIXME: n1*n2 could overflow for large dimensions */
+
+ block = FUNCTION(gsl_block, alloc) (n1 * n2) ;
+
+ if (block == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for block",
+ GSL_ENOMEM, 0);
+ }
+
+ m->data = block->data;
+ m->size1 = n1;
+ m->size2 = n2;
+ m->tda = n2;
+ m->block = block;
+ m->owner = 1;
+
+ return m;
+}
+
+TYPE (gsl_matrix) *
+FUNCTION (gsl_matrix, calloc) (const size_t n1, const size_t n2)
+{
+ size_t i;
+
+ TYPE (gsl_matrix) * m = FUNCTION (gsl_matrix, alloc) (n1, n2);
+
+ if (m == 0)
+ return 0;
+
+ /* initialize matrix to zero */
+
+ for (i = 0; i < MULTIPLICITY * n1 * n2; i++)
+ {
+ m->data[i] = 0;
+ }
+
+ return m;
+}
+
+TYPE (gsl_matrix) *
+FUNCTION (gsl_matrix, alloc_from_block) (TYPE(gsl_block) * block,
+ const size_t offset,
+ const size_t n1,
+ const size_t n2,
+ const size_t d2)
+{
+ TYPE (gsl_matrix) * m;
+
+ if (n1 == 0)
+ {
+ GSL_ERROR_VAL ("matrix dimension n1 must be positive integer",
+ GSL_EINVAL, 0);
+ }
+ else if (n2 == 0)
+ {
+ GSL_ERROR_VAL ("matrix dimension n2 must be positive integer",
+ GSL_EINVAL, 0);
+ }
+ else if (d2 < n2)
+ {
+ GSL_ERROR_VAL ("matrix dimension d2 must be greater than n2",
+ GSL_EINVAL, 0);
+ }
+ else if (block->size < offset + n1 * d2)
+ {
+ GSL_ERROR_VAL ("matrix size exceeds available block size",
+ GSL_EINVAL, 0);
+ }
+
+ m = (TYPE (gsl_matrix) *) malloc (sizeof (TYPE (gsl_matrix)));
+
+ if (m == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for matrix struct",
+ GSL_ENOMEM, 0);
+ }
+
+ m->data = block->data + MULTIPLICITY * offset;
+ m->size1 = n1;
+ m->size2 = n2;
+ m->tda = d2;
+ m->block = block;
+ m->owner = 0;
+
+ return m;
+}
+
+
+TYPE (gsl_matrix) *
+FUNCTION (gsl_matrix, alloc_from_matrix) (TYPE(gsl_matrix) * mm,
+ const size_t k1,
+ const size_t k2,
+ const size_t n1,
+ const size_t n2)
+{
+ TYPE (gsl_matrix) * m;
+
+ if (n1 == 0)
+ {
+ GSL_ERROR_VAL ("matrix dimension n1 must be positive integer",
+ GSL_EINVAL, 0);
+ }
+ else if (n2 == 0)
+ {
+ GSL_ERROR_VAL ("matrix dimension n2 must be positive integer",
+ GSL_EINVAL, 0);
+ }
+ else if (k1 + n1 > mm->size1)
+ {
+ GSL_ERROR_VAL ("submatrix dimension 1 exceeds size of original",
+ GSL_EINVAL, 0);
+ }
+ else if (k2 + n2 > mm->size2)
+ {
+ GSL_ERROR_VAL ("submatrix dimension 2 exceeds size of original",
+ GSL_EINVAL, 0);
+ }
+
+ m = (TYPE (gsl_matrix) *) malloc (sizeof (TYPE (gsl_matrix)));
+
+ if (m == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for matrix struct",
+ GSL_ENOMEM, 0);
+ }
+
+ m->data = mm->data + k1 * mm->tda + k2 ;
+ m->size1 = n1;
+ m->size2 = n2;
+ m->tda = mm->tda;
+ m->block = mm->block;
+ m->owner = 0;
+
+ return m;
+}
+
+void
+FUNCTION (gsl_matrix, free) (TYPE (gsl_matrix) * m)
+{
+ if (m->owner)
+ {
+ FUNCTION(gsl_block, free) (m->block);
+ }
+
+ free (m);
+}
+void
+FUNCTION (gsl_matrix, set_identity) (TYPE (gsl_matrix) * m)
+{
+ size_t i, j;
+ ATOMIC * const data = m->data;
+ const size_t p = m->size1 ;
+ const size_t q = m->size2 ;
+ const size_t tda = m->tda ;
+
+ const BASE zero = ZERO;
+ const BASE one = ONE;
+
+ for (i = 0; i < p; i++)
+ {
+ for (j = 0; j < q; j++)
+ {
+ *(BASE *) (data + MULTIPLICITY * (i * tda + j)) = ((i == j) ? one : zero);
+ }
+ }
+}
+
+void
+FUNCTION (gsl_matrix, set_zero) (TYPE (gsl_matrix) * m)
+{
+ size_t i, j;
+ ATOMIC * const data = m->data;
+ const size_t p = m->size1 ;
+ const size_t q = m->size2 ;
+ const size_t tda = m->tda ;
+
+ const BASE zero = ZERO;
+
+ for (i = 0; i < p; i++)
+ {
+ for (j = 0; j < q; j++)
+ {
+ *(BASE *) (data + MULTIPLICITY * (i * tda + j)) = zero;
+ }
+ }
+}
+
+void
+FUNCTION (gsl_matrix, set_all) (TYPE (gsl_matrix) * m, BASE x)
+{
+ size_t i, j;
+ ATOMIC * const data = m->data;
+ const size_t p = m->size1 ;
+ const size_t q = m->size2 ;
+ const size_t tda = m->tda ;
+
+ for (i = 0; i < p; i++)
+ {
+ for (j = 0; j < q; j++)
+ {
+ *(BASE *) (data + MULTIPLICITY * (i * tda + j)) = x;
+ }
+ }
+}
+
diff --git a/gsl-1.9/matrix/matrix.c b/gsl-1.9/matrix/matrix.c
new file mode 100644
index 0000000..847ca19
--- /dev/null
+++ b/gsl-1.9/matrix/matrix.c
@@ -0,0 +1,87 @@
+#include <config.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_matrix.h>
+
+#define BASE_GSL_COMPLEX_LONG
+#include "templates_on.h"
+#include "matrix_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_LONG
+
+#define BASE_GSL_COMPLEX
+#include "templates_on.h"
+#include "matrix_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX
+
+#define BASE_GSL_COMPLEX_FLOAT
+#include "templates_on.h"
+#include "matrix_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_FLOAT
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "matrix_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "matrix_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "matrix_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "matrix_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "matrix_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "matrix_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "matrix_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "matrix_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "matrix_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "matrix_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "matrix_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
diff --git a/gsl-1.9/matrix/matrix_source.c b/gsl-1.9/matrix/matrix_source.c
new file mode 100644
index 0000000..aa09abc
--- /dev/null
+++ b/gsl-1.9/matrix/matrix_source.c
@@ -0,0 +1,97 @@
+/* matrix/matrix_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef HIDE_INLINE_STATIC
+BASE
+FUNCTION (gsl_matrix, get) (const TYPE (gsl_matrix) * m,
+ const size_t i, const size_t j)
+{
+ BASE zero = ZERO;
+
+ if (gsl_check_range)
+ {
+ if (i >= m->size1) /* size_t is unsigned, can't be negative */
+ {
+ GSL_ERROR_VAL ("first index out of range", GSL_EINVAL, zero);
+ }
+ else if (j >= m->size2) /* size_t is unsigned, can't be negative */
+ {
+ GSL_ERROR_VAL ("second index out of range", GSL_EINVAL, zero);
+ }
+ }
+ return *(BASE *) (m->data + MULTIPLICITY * (i * m->tda + j));
+}
+
+void
+FUNCTION (gsl_matrix, set) (TYPE (gsl_matrix) * m,
+ const size_t i, const size_t j,
+ const BASE x)
+{
+ if (gsl_check_range)
+ {
+ if (i >= m->size1) /* size_t is unsigned, can't be negative */
+ {
+ GSL_ERROR_VOID ("first index out of range", GSL_EINVAL);
+ }
+ else if (j >= m->size2) /* size_t is unsigned, can't be negative */
+ {
+ GSL_ERROR_VOID ("second index out of range", GSL_EINVAL);
+ }
+ }
+ *(BASE *) (m->data + MULTIPLICITY * (i * m->tda + j)) = x;
+}
+
+
+BASE *
+FUNCTION (gsl_matrix, ptr) (TYPE (gsl_matrix) * m,
+ const size_t i, const size_t j)
+{
+ if (gsl_check_range)
+ {
+ if (i >= m->size1) /* size_t is unsigned, can't be negative */
+ {
+ GSL_ERROR_NULL ("first index out of range", GSL_EINVAL);
+ }
+ else if (j >= m->size2) /* size_t is unsigned, can't be negative */
+ {
+ GSL_ERROR_NULL ("second index out of range", GSL_EINVAL);
+ }
+ }
+ return (BASE *) (m->data + MULTIPLICITY * (i * m->tda + j));
+}
+
+
+const BASE *
+FUNCTION (gsl_matrix, const_ptr) (const TYPE (gsl_matrix) * m,
+ const size_t i, const size_t j)
+{
+ if (gsl_check_range)
+ {
+ if (i >= m->size1) /* size_t is unsigned, can't be negative */
+ {
+ GSL_ERROR_NULL ("first index out of range", GSL_EINVAL);
+ }
+ else if (j >= m->size2) /* size_t is unsigned, can't be negative */
+ {
+ GSL_ERROR_NULL ("second index out of range", GSL_EINVAL);
+ }
+ }
+ return (const BASE *) (m->data + MULTIPLICITY * (i * m->tda + j));
+}
+#endif
diff --git a/gsl-1.9/matrix/minmax.c b/gsl-1.9/matrix/minmax.c
new file mode 100644
index 0000000..2a092d4
--- /dev/null
+++ b/gsl-1.9/matrix/minmax.c
@@ -0,0 +1,72 @@
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_matrix.h>
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "minmax_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "minmax_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "minmax_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "minmax_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "minmax_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "minmax_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "minmax_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "minmax_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "minmax_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "minmax_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "minmax_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
+
+
diff --git a/gsl-1.9/matrix/minmax_source.c b/gsl-1.9/matrix/minmax_source.c
new file mode 100644
index 0000000..0a9ce79
--- /dev/null
+++ b/gsl-1.9/matrix/minmax_source.c
@@ -0,0 +1,254 @@
+/* matrix/minmax_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+BASE
+FUNCTION (gsl_matrix, max) (const TYPE (gsl_matrix) * m)
+{
+ /* finds the largest element of a matrix */
+
+ const size_t M = m->size1;
+ const size_t N = m->size2;
+ const size_t tda = m->tda;
+
+ BASE max = m->data[0 * tda + 0];
+ size_t i, j;
+
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ BASE x = m->data[i * tda + j];
+ if (x > max)
+ max = x;
+#ifdef FP
+ if (isnan (x))
+ return x;
+#endif
+ }
+ }
+
+ return max;
+}
+
+BASE
+FUNCTION (gsl_matrix, min) (const TYPE (gsl_matrix) * m)
+{
+ /* finds the smallest element of a matrix */
+
+ const size_t M = m->size1;
+ const size_t N = m->size2;
+ const size_t tda = m->tda;
+
+ BASE min = m->data[0 * tda + 0];
+ size_t i, j;
+
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ BASE x = m->data[i * tda + j];
+ if (x < min)
+ min = x;
+#ifdef FP
+ if (isnan (x))
+ return x;
+#endif
+ }
+ }
+
+ return min;
+}
+
+
+void
+FUNCTION (gsl_matrix, minmax) (const TYPE (gsl_matrix) * m,
+ BASE * min_out,
+ BASE * max_out)
+{
+ /* finds the smallest and largest elements of a matrix */
+
+ const size_t M = m->size1;
+ const size_t N = m->size2;
+ const size_t tda = m->tda;
+
+ BASE max = m->data[0 * tda + 0];
+ BASE min = m->data[0 * tda + 0];
+
+ size_t i, j;
+
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ BASE x = m->data[i * tda + j];
+ if (x < min)
+ {
+ min = x;
+ }
+ if (x > max)
+ {
+ max = x;
+ }
+#ifdef FP
+ if (isnan (x))
+ {
+ *min_out = x;
+ *max_out = x;
+ return;
+ }
+#endif
+ }
+ }
+
+ *min_out = min;
+ *max_out = max;
+}
+
+void
+FUNCTION (gsl_matrix, max_index) (const TYPE (gsl_matrix) * m, size_t * imax_out, size_t *jmax_out)
+{
+ /* finds the largest element of a matrix */
+
+ const size_t M = m->size1;
+ const size_t N = m->size2;
+ const size_t tda = m->tda;
+
+ BASE max = m->data[0 * tda + 0];
+ size_t imax = 0, jmax = 0;
+ size_t i, j;
+
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ BASE x = m->data[i * tda + j];
+ if (x > max)
+ {
+ max = x;
+ imax = i;
+ jmax = j;
+ }
+#ifdef FP
+ if (isnan (x))
+ {
+ *imax_out = i;
+ *jmax_out = j;
+ return;
+ }
+#endif
+ }
+ }
+
+ *imax_out = imax;
+ *jmax_out = jmax;
+}
+
+void
+FUNCTION (gsl_matrix, min_index) (const TYPE (gsl_matrix) * m, size_t * imin_out, size_t *jmin_out)
+{
+ /* finds the largest element of a matrix */
+
+ const size_t M = m->size1;
+ const size_t N = m->size2;
+ const size_t tda = m->tda;
+
+ BASE min = m->data[0 * tda + 0];
+ size_t imin = 0, jmin = 0;
+ size_t i, j;
+
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ BASE x = m->data[i * tda + j];
+ if (x < min)
+ {
+ min = x;
+ imin = i;
+ jmin = j;
+ }
+#ifdef FP
+ if (isnan (x))
+ {
+ *imin_out = i;
+ *jmin_out = j;
+ return;
+ }
+#endif
+ }
+ }
+
+ *imin_out = imin;
+ *jmin_out = jmin;
+}
+
+void
+FUNCTION (gsl_matrix, minmax_index) (const TYPE (gsl_matrix) * m,
+ size_t * imin_out,
+ size_t * jmin_out,
+ size_t * imax_out,
+ size_t * jmax_out)
+{
+ /* finds the smallest and largest elements of a matrix */
+
+ const size_t M = m->size1;
+ const size_t N = m->size2;
+ const size_t tda = m->tda;
+
+ size_t imin = 0, jmin = 0, imax = 0, jmax = 0;
+ BASE max = m->data[0 * tda + 0];
+ BASE min = m->data[0 * tda + 0];
+
+ size_t i, j;
+
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ BASE x = m->data[i * tda + j];
+ if (x < min)
+ {
+ min = x;
+ imin = i;
+ jmin = j;
+ }
+ if (x > max)
+ {
+ max = x;
+ imax = i;
+ jmax = j;
+ }
+#ifdef FP
+ if (isnan (x))
+ {
+ *imin_out = i;
+ *jmin_out = j;
+ *imax_out = i;
+ *jmax_out = j;
+ return;
+ }
+#endif
+ }
+ }
+
+ *imin_out = imin;
+ *jmin_out = jmin;
+ *imax_out = imax;
+ *jmax_out = jmax;
+}
diff --git a/gsl-1.9/matrix/oper.c b/gsl-1.9/matrix/oper.c
new file mode 100644
index 0000000..996efad
--- /dev/null
+++ b/gsl-1.9/matrix/oper.c
@@ -0,0 +1,91 @@
+#include <config.h>
+#include <stdlib.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_matrix.h>
+
+#define BASE_GSL_COMPLEX_LONG
+#include "templates_on.h"
+#include "oper_complex_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_LONG
+
+#define BASE_GSL_COMPLEX
+#include "templates_on.h"
+#include "oper_complex_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX
+
+#define BASE_GSL_COMPLEX_FLOAT
+#include "templates_on.h"
+#include "oper_complex_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_FLOAT
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "oper_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "oper_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "oper_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "oper_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "oper_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "oper_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "oper_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "oper_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "oper_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "oper_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "oper_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
+
+
diff --git a/gsl-1.9/matrix/oper_complex_source.c b/gsl-1.9/matrix/oper_complex_source.c
new file mode 100644
index 0000000..d76328e
--- /dev/null
+++ b/gsl-1.9/matrix/oper_complex_source.c
@@ -0,0 +1,236 @@
+/* matrix/oper_complex_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+int
+FUNCTION (gsl_matrix, add) (TYPE (gsl_matrix) * a,
+ const TYPE (gsl_matrix) * b)
+{
+ const size_t M = a->size1;
+ const size_t N = a->size2;
+
+ if (b->size1 != M || b->size2 != N)
+ {
+ GSL_ERROR ("matrices must have same dimensions", GSL_EBADLEN);
+ }
+ else
+ {
+ const size_t tda_a = a->tda;
+ const size_t tda_b = b->tda;
+
+ size_t i, j;
+
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ const size_t aij = 2 * (i * tda_a + j);
+ const size_t bij = 2 * (i * tda_b + j);
+
+ a->data[aij] += b->data[bij];
+ a->data[aij + 1] += b->data[bij + 1];
+ }
+ }
+
+ return GSL_SUCCESS;
+ }
+}
+
+int
+FUNCTION (gsl_matrix, sub) (TYPE (gsl_matrix) * a,
+ const TYPE (gsl_matrix) * b)
+{
+ const size_t M = a->size1;
+ const size_t N = a->size2;
+
+ if (b->size1 != M || b->size2 != N)
+ {
+ GSL_ERROR ("matrices must have same dimensions", GSL_EBADLEN);
+ }
+ else
+ {
+ const size_t tda_a = a->tda;
+ const size_t tda_b = b->tda;
+
+ size_t i, j;
+
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ const size_t aij = 2 * (i * tda_a + j);
+ const size_t bij = 2 * (i * tda_b + j);
+
+ a->data[aij] -= b->data[bij];
+ a->data[aij + 1] -= b->data[bij + 1];
+ }
+ }
+
+ return GSL_SUCCESS;
+ }
+}
+
+int
+FUNCTION (gsl_matrix, mul_elements) (TYPE (gsl_matrix) * a,
+ const TYPE (gsl_matrix) * b)
+{
+ const size_t M = a->size1;
+ const size_t N = a->size2;
+
+ if (b->size1 != M || b->size2 != N)
+ {
+ GSL_ERROR ("matrices must have same dimensions", GSL_EBADLEN);
+ }
+ else
+ {
+ const size_t tda_a = a->tda;
+ const size_t tda_b = b->tda;
+
+ size_t i, j;
+
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ const size_t aij = 2 * (i * tda_a + j);
+ const size_t bij = 2 * (i * tda_b + j);
+
+ ATOMIC ar = a->data[aij];
+ ATOMIC ai = a->data[aij + 1];
+
+ ATOMIC br = b->data[bij];
+ ATOMIC bi = b->data[bij + 1];
+
+ a->data[aij] = ar * br - ai * bi;
+ a->data[aij + 1] = ar * bi + ai * br;
+ }
+ }
+
+ return GSL_SUCCESS;
+ }
+}
+
+int
+FUNCTION (gsl_matrix, div_elements) (TYPE (gsl_matrix) * a,
+ const TYPE (gsl_matrix) * b)
+{
+ const size_t M = a->size1;
+ const size_t N = a->size2;
+
+ if (b->size1 != M || b->size2 != N)
+ {
+ GSL_ERROR ("matrices must have same dimensions", GSL_EBADLEN);
+ }
+ else
+ {
+ const size_t tda_a = a->tda;
+ const size_t tda_b = b->tda;
+
+ size_t i, j;
+
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ const size_t aij = 2 * (i * tda_a + j);
+ const size_t bij = 2 * (i * tda_b + j);
+
+ ATOMIC ar = a->data[aij];
+ ATOMIC ai = a->data[aij + 1];
+
+ ATOMIC br = b->data[bij];
+ ATOMIC bi = b->data[bij + 1];
+
+ ATOMIC s = 1.0 / hypot(br, bi);
+
+ ATOMIC sbr = s * br;
+ ATOMIC sbi = s * bi;
+
+ a->data[aij] = (ar * sbr + ai * sbi) * s;
+ a->data[aij + 1] = (ai * sbr - ar * sbi) * s;
+ }
+ }
+
+ return GSL_SUCCESS;
+ }
+}
+
+int FUNCTION (gsl_matrix, scale) (TYPE (gsl_matrix) * a, const BASE x)
+{
+ const size_t M = a->size1;
+ const size_t N = a->size2;
+ const size_t tda = a->tda;
+
+ size_t i, j;
+
+ ATOMIC xr = GSL_REAL(x);
+ ATOMIC xi = GSL_IMAG(x);
+
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ const size_t aij = 2 * (i * tda + j);
+
+ ATOMIC ar = a->data[aij];
+ ATOMIC ai = a->data[aij + 1];
+
+ a->data[aij] = ar * xr - ai * xi;
+ a->data[aij + 1] = ar * xi + ai * xr;
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+int FUNCTION (gsl_matrix, add_constant) (TYPE (gsl_matrix) * a, const BASE x)
+{
+ const size_t M = a->size1;
+ const size_t N = a->size2;
+ const size_t tda = a->tda;
+
+ size_t i, j;
+
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ a->data[2 * (i * tda + j)] += GSL_REAL (x);
+ a->data[2 * (i * tda + j) + 1] += GSL_IMAG (x);
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+int FUNCTION (gsl_matrix, add_diagonal) (TYPE (gsl_matrix) * a, const BASE x)
+{
+ const size_t M = a->size1;
+ const size_t N = a->size2;
+ const size_t tda = a->tda;
+ const size_t loop_lim = (M < N ? M : N);
+ size_t i;
+ for (i = 0; i < loop_lim; i++)
+ {
+ a->data[2 * (i * tda + i)] += GSL_REAL (x);
+ a->data[2 * (i * tda + i) + 1] += GSL_IMAG (x);
+ }
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/matrix/oper_source.c b/gsl-1.9/matrix/oper_source.c
new file mode 100644
index 0000000..d20b3e0
--- /dev/null
+++ b/gsl-1.9/matrix/oper_source.c
@@ -0,0 +1,191 @@
+/* matrix/oper_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+int
+FUNCTION(gsl_matrix, add) (TYPE(gsl_matrix) * a, const TYPE(gsl_matrix) * b)
+{
+ const size_t M = a->size1;
+ const size_t N = a->size2;
+
+ if (b->size1 != M || b->size2 != N)
+ {
+ GSL_ERROR ("matrices must have same dimensions", GSL_EBADLEN);
+ }
+ else
+ {
+ const size_t tda_a = a->tda;
+ const size_t tda_b = b->tda;
+
+ size_t i, j;
+
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ a->data[i * tda_a + j] += b->data[i * tda_b + j];
+ }
+ }
+
+ return GSL_SUCCESS;
+ }
+}
+
+int
+FUNCTION(gsl_matrix, sub) (TYPE(gsl_matrix) * a, const TYPE(gsl_matrix) * b)
+{
+ const size_t M = a->size1;
+ const size_t N = a->size2;
+
+ if (b->size1 != M || b->size2 != N)
+ {
+ GSL_ERROR ("matrices must have same dimensions", GSL_EBADLEN);
+ }
+ else
+ {
+ const size_t tda_a = a->tda;
+ const size_t tda_b = b->tda;
+
+ size_t i, j;
+
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ a->data[i * tda_a + j] -= b->data[i * tda_b + j];
+ }
+ }
+
+ return GSL_SUCCESS;
+ }
+}
+
+int
+FUNCTION(gsl_matrix, mul_elements) (TYPE(gsl_matrix) * a, const TYPE(gsl_matrix) * b)
+{
+ const size_t M = a->size1;
+ const size_t N = a->size2;
+
+ if (b->size1 != M || b->size2 != N)
+ {
+ GSL_ERROR ("matrices must have same dimensions", GSL_EBADLEN);
+ }
+ else
+ {
+ const size_t tda_a = a->tda;
+ const size_t tda_b = b->tda;
+
+ size_t i, j;
+
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ a->data[i * tda_a + j] *= b->data[i * tda_b + j];
+ }
+ }
+
+ return GSL_SUCCESS;
+ }
+}
+
+int
+FUNCTION(gsl_matrix, div_elements) (TYPE(gsl_matrix) * a, const TYPE(gsl_matrix) * b)
+{
+ const size_t M = a->size1;
+ const size_t N = a->size2;
+
+ if (b->size1 != M || b->size2 != N)
+ {
+ GSL_ERROR ("matrices must have same dimensions", GSL_EBADLEN);
+ }
+ else
+ {
+ const size_t tda_a = a->tda;
+ const size_t tda_b = b->tda;
+
+ size_t i, j;
+
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ a->data[i * tda_a + j] /= b->data[i * tda_b + j];
+ }
+ }
+
+ return GSL_SUCCESS;
+ }
+}
+
+int
+FUNCTION(gsl_matrix, scale) (TYPE(gsl_matrix) * a, const double x)
+{
+ const size_t M = a->size1;
+ const size_t N = a->size2;
+ const size_t tda = a->tda;
+
+ size_t i, j;
+
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ a->data[i * tda + j] *= x;
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+FUNCTION(gsl_matrix, add_constant) (TYPE(gsl_matrix) * a, const double x)
+{
+ const size_t M = a->size1;
+ const size_t N = a->size2;
+ const size_t tda = a->tda;
+
+ size_t i, j;
+
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ a->data[i * tda + j] += x;
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+int
+FUNCTION(gsl_matrix, add_diagonal) (TYPE(gsl_matrix) * a, const double x)
+{
+ const size_t M = a->size1;
+ const size_t N = a->size2;
+ const size_t tda = a->tda;
+ const size_t loop_lim = ( M < N ? M : N );
+ size_t i;
+ for (i = 0; i < loop_lim; i++)
+ {
+ a->data[i * tda + i] += x;
+ }
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/matrix/prop.c b/gsl-1.9/matrix/prop.c
new file mode 100644
index 0000000..b151e8d
--- /dev/null
+++ b/gsl-1.9/matrix/prop.c
@@ -0,0 +1,87 @@
+#include <config.h>
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_errno.h>
+
+#define BASE_GSL_COMPLEX_LONG
+#include "templates_on.h"
+#include "prop_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_LONG
+
+#define BASE_GSL_COMPLEX
+#include "templates_on.h"
+#include "prop_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX
+
+#define BASE_GSL_COMPLEX_FLOAT
+#include "templates_on.h"
+#include "prop_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_FLOAT
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "prop_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "prop_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "prop_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "prop_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "prop_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "prop_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "prop_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "prop_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "prop_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "prop_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "prop_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
diff --git a/gsl-1.9/matrix/prop_source.c b/gsl-1.9/matrix/prop_source.c
new file mode 100644
index 0000000..6e4b780
--- /dev/null
+++ b/gsl-1.9/matrix/prop_source.c
@@ -0,0 +1,99 @@
+/* matrix/prop_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+int
+FUNCTION (gsl_matrix, isnull) (const TYPE (gsl_matrix) * m)
+{
+ const size_t size1 = m->size1;
+ const size_t size2 = m->size2;
+ const size_t tda = m->tda ;
+
+ size_t i, j, k;
+
+ for (i = 0; i < size1 ; i++)
+ {
+ for (j = 0; j < size2; j++)
+ {
+ for (k = 0; k < MULTIPLICITY; k++)
+ {
+ if (m->data[(i * tda + j) * MULTIPLICITY + k] != 0.0)
+ {
+ return 0;
+ }
+ }
+ }
+ }
+
+ return 1;
+}
+
+
+int
+FUNCTION (gsl_matrix, ispos) (const TYPE (gsl_matrix) * m)
+{
+ const size_t size1 = m->size1;
+ const size_t size2 = m->size2;
+ const size_t tda = m->tda ;
+
+ size_t i, j, k;
+
+ for (i = 0; i < size1 ; i++)
+ {
+ for (j = 0; j < size2; j++)
+ {
+ for (k = 0; k < MULTIPLICITY; k++)
+ {
+ if (m->data[(i * tda + j) * MULTIPLICITY + k] <= 0.0)
+ {
+ return 0;
+ }
+ }
+ }
+ }
+
+ return 1;
+}
+
+
+int
+FUNCTION (gsl_matrix, isneg) (const TYPE (gsl_matrix) * m)
+{
+ const size_t size1 = m->size1;
+ const size_t size2 = m->size2;
+ const size_t tda = m->tda ;
+
+ size_t i, j, k;
+
+ for (i = 0; i < size1 ; i++)
+ {
+ for (j = 0; j < size2; j++)
+ {
+ for (k = 0; k < MULTIPLICITY; k++)
+ {
+ if (m->data[(i * tda + j) * MULTIPLICITY + k] >= 0.0)
+ {
+ return 0;
+ }
+ }
+ }
+ }
+
+ return 1;
+}
+
diff --git a/gsl-1.9/matrix/rowcol.c b/gsl-1.9/matrix/rowcol.c
new file mode 100644
index 0000000..39a36f5
--- /dev/null
+++ b/gsl-1.9/matrix/rowcol.c
@@ -0,0 +1,178 @@
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_errno.h>
+
+#include "view.h"
+
+#define BASE_GSL_COMPLEX_LONG
+#include "templates_on.h"
+#include "rowcol_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_LONG
+
+#define BASE_GSL_COMPLEX
+#include "templates_on.h"
+#include "rowcol_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX
+
+#define BASE_GSL_COMPLEX_FLOAT
+#include "templates_on.h"
+#include "rowcol_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_FLOAT
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "rowcol_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "rowcol_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "rowcol_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "rowcol_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "rowcol_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "rowcol_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "rowcol_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "rowcol_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "rowcol_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "rowcol_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "rowcol_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
+
+#define USE_QUALIFIER
+#define QUALIFIER const
+
+#define BASE_GSL_COMPLEX_LONG
+#include "templates_on.h"
+#include "rowcol_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_LONG
+
+#define BASE_GSL_COMPLEX
+#include "templates_on.h"
+#include "rowcol_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX
+
+#define BASE_GSL_COMPLEX_FLOAT
+#include "templates_on.h"
+#include "rowcol_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_FLOAT
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "rowcol_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "rowcol_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "rowcol_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "rowcol_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "rowcol_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "rowcol_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "rowcol_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "rowcol_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "rowcol_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "rowcol_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "rowcol_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
diff --git a/gsl-1.9/matrix/rowcol_source.c b/gsl-1.9/matrix/rowcol_source.c
new file mode 100644
index 0000000..bf76c07
--- /dev/null
+++ b/gsl-1.9/matrix/rowcol_source.c
@@ -0,0 +1,134 @@
+/* matrix/rowcol_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+QUALIFIED_VIEW(_gsl_vector,view)
+FUNCTION (gsl_matrix, row) (QUALIFIED_TYPE(gsl_matrix) * m, const size_t i)
+{
+ QUALIFIED_VIEW(_gsl_vector,view) view = NULL_VECTOR_VIEW;
+
+ if (i >= m->size1)
+ {
+ GSL_ERROR_VAL ("row index is out of range", GSL_EINVAL, view);
+ }
+
+ {
+ TYPE(gsl_vector) v = NULL_VECTOR;
+
+ v.data = m->data + i * MULTIPLICITY * m->tda;
+ v.size = m->size2;
+ v.stride = 1;
+ v.block = m->block;
+ v.owner = 0;
+
+ view.vector = v;
+ return view;
+ }
+}
+
+QUALIFIED_VIEW(_gsl_vector,view)
+FUNCTION (gsl_matrix, column) (QUALIFIED_TYPE(gsl_matrix) * m, const size_t j)
+{
+ QUALIFIED_VIEW(_gsl_vector,view) view = NULL_VECTOR_VIEW;
+
+ if (j >= m->size2)
+ {
+ GSL_ERROR_VAL ("column index is out of range", GSL_EINVAL, view);
+ }
+
+ {
+ TYPE(gsl_vector) v = NULL_VECTOR;
+
+ v.data = m->data + j * MULTIPLICITY;
+ v.size = m->size1;
+ v.stride = m->tda;
+ v.block = m->block;
+ v.owner = 0;
+
+ view.vector = v;
+ return view;
+ }
+}
+
+QUALIFIED_VIEW(_gsl_vector,view)
+FUNCTION (gsl_matrix, diagonal) (QUALIFIED_TYPE(gsl_matrix) * m)
+{
+ QUALIFIED_VIEW(_gsl_vector,view) view = NULL_VECTOR_VIEW;
+
+ TYPE(gsl_vector) v = NULL_VECTOR;
+ v.data = m->data;
+ v.size = GSL_MIN(m->size1,m->size2);
+ v.stride = m->tda + 1;
+ v.block = m->block;
+ v.owner = 0;
+
+ view.vector = v;
+ return view;
+}
+
+QUALIFIED_VIEW(_gsl_vector,view)
+FUNCTION (gsl_matrix, subdiagonal) (QUALIFIED_TYPE(gsl_matrix) * m,
+ const size_t k)
+{
+ QUALIFIED_VIEW(_gsl_vector,view) view = NULL_VECTOR_VIEW;
+
+ if (k >= m->size1)
+ {
+ GSL_ERROR_VAL ("subdiagonal index is out of range", GSL_EINVAL, view);
+ }
+
+ {
+ TYPE(gsl_vector) v = NULL_VECTOR;
+
+ v.data = m->data + k * MULTIPLICITY * m->tda;
+ v.size = GSL_MIN(m->size1 - k, m->size2);
+ v.stride = m->tda + 1;
+ v.block = m->block;
+ v.owner = 0;
+
+ view.vector = v;
+ return view;
+ }
+}
+
+QUALIFIED_VIEW(_gsl_vector,view)
+FUNCTION (gsl_matrix, superdiagonal) (QUALIFIED_TYPE(gsl_matrix) * m,
+ const size_t k)
+{
+ QUALIFIED_VIEW(_gsl_vector,view) view = NULL_VECTOR_VIEW;
+
+
+ if (k >= m->size2)
+ {
+ GSL_ERROR_VAL ("column index is out of range", GSL_EINVAL, view);
+ }
+
+ {
+ TYPE(gsl_vector) v = NULL_VECTOR;
+
+ v.data = m->data + k * MULTIPLICITY;
+ v.size = GSL_MIN(m->size1, m->size2 - k);
+ v.stride = m->tda + 1;
+ v.block = m->block;
+ v.owner = 0;
+
+ view.vector = v;
+ return view;
+ }
+}
+
diff --git a/gsl-1.9/matrix/submatrix.c b/gsl-1.9/matrix/submatrix.c
new file mode 100644
index 0000000..c942762
--- /dev/null
+++ b/gsl-1.9/matrix/submatrix.c
@@ -0,0 +1,178 @@
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_errno.h>
+
+#include "view.h"
+
+#define BASE_GSL_COMPLEX_LONG
+#include "templates_on.h"
+#include "submatrix_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_LONG
+
+#define BASE_GSL_COMPLEX
+#include "templates_on.h"
+#include "submatrix_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX
+
+#define BASE_GSL_COMPLEX_FLOAT
+#include "templates_on.h"
+#include "submatrix_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_FLOAT
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "submatrix_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "submatrix_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "submatrix_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "submatrix_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "submatrix_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "submatrix_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "submatrix_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "submatrix_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "submatrix_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "submatrix_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "submatrix_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
+
+#define USE_QUALIFIER
+#define QUALIFIER const
+
+#define BASE_GSL_COMPLEX_LONG
+#include "templates_on.h"
+#include "submatrix_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_LONG
+
+#define BASE_GSL_COMPLEX
+#include "templates_on.h"
+#include "submatrix_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX
+
+#define BASE_GSL_COMPLEX_FLOAT
+#include "templates_on.h"
+#include "submatrix_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_FLOAT
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "submatrix_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "submatrix_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "submatrix_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "submatrix_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "submatrix_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "submatrix_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "submatrix_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "submatrix_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "submatrix_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "submatrix_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "submatrix_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
diff --git a/gsl-1.9/matrix/submatrix_source.c b/gsl-1.9/matrix/submatrix_source.c
new file mode 100644
index 0000000..9bfac27
--- /dev/null
+++ b/gsl-1.9/matrix/submatrix_source.c
@@ -0,0 +1,66 @@
+/* matrix/submatrix_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+QUALIFIED_VIEW(_gsl_matrix,view)
+FUNCTION (gsl_matrix, submatrix) (QUALIFIED_TYPE(gsl_matrix) * m,
+ const size_t i, const size_t j,
+ const size_t n1, const size_t n2)
+{
+ QUALIFIED_VIEW(_gsl_matrix,view) view = NULL_MATRIX_VIEW;
+
+ if (i >= m->size1)
+ {
+ GSL_ERROR_VAL ("row index is out of range", GSL_EINVAL, view);
+ }
+ else if (j >= m->size2)
+ {
+ GSL_ERROR_VAL ("column index is out of range", GSL_EINVAL, view);
+ }
+ else if (n1 == 0)
+ {
+ GSL_ERROR_VAL ("first dimension must be non-zero", GSL_EINVAL, view);
+ }
+ else if (n2 == 0)
+ {
+ GSL_ERROR_VAL ("second dimension must be non-zero", GSL_EINVAL, view);
+ }
+ else if (i + n1 > m->size1)
+ {
+ GSL_ERROR_VAL ("first dimension overflows matrix", GSL_EINVAL, view);
+ }
+ else if (j + n2 > m->size2)
+ {
+ GSL_ERROR_VAL ("second dimension overflows matrix", GSL_EINVAL, view);
+ }
+
+ {
+ TYPE(gsl_matrix) s = NULL_MATRIX;
+
+ s.data = m->data + MULTIPLICITY * (i * m->tda + j);
+ s.size1 = n1;
+ s.size2 = n2;
+ s.tda = m->tda;
+ s.block = m->block;
+ s.owner = 0;
+
+ view.matrix = s;
+ return view;
+ }
+}
+
diff --git a/gsl-1.9/matrix/swap.c b/gsl-1.9/matrix/swap.c
new file mode 100644
index 0000000..cf5b67c
--- /dev/null
+++ b/gsl-1.9/matrix/swap.c
@@ -0,0 +1,88 @@
+#include <config.h>
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_errno.h>
+
+#define BASE_GSL_COMPLEX_LONG
+#include "templates_on.h"
+#include "swap_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_LONG
+
+#define BASE_GSL_COMPLEX
+#include "templates_on.h"
+#include "swap_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX
+
+#define BASE_GSL_COMPLEX_FLOAT
+#include "templates_on.h"
+#include "swap_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_FLOAT
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "swap_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "swap_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "swap_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "swap_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "swap_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "swap_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "swap_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "swap_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "swap_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "swap_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "swap_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
diff --git a/gsl-1.9/matrix/swap_source.c b/gsl-1.9/matrix/swap_source.c
new file mode 100644
index 0000000..84b2204
--- /dev/null
+++ b/gsl-1.9/matrix/swap_source.c
@@ -0,0 +1,210 @@
+/* matrix/swap_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+int
+FUNCTION (gsl_matrix, swap_rows) (TYPE (gsl_matrix) * m,
+ const size_t i, const size_t j)
+{
+ const size_t size1 = m->size1;
+ const size_t size2 = m->size2;
+
+ if (i >= size1)
+ {
+ GSL_ERROR ("first row index is out of range", GSL_EINVAL);
+ }
+
+ if (j >= size1)
+ {
+ GSL_ERROR ("second row index is out of range", GSL_EINVAL);
+ }
+
+ if (i != j)
+ {
+ ATOMIC *row1 = m->data + MULTIPLICITY * i * m->tda;
+ ATOMIC *row2 = m->data + MULTIPLICITY * j * m->tda;
+
+ size_t k;
+
+ for (k = 0; k < MULTIPLICITY * size2; k++)
+ {
+ ATOMIC tmp = row1[k] ;
+ row1[k] = row2[k] ;
+ row2[k] = tmp ;
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+FUNCTION (gsl_matrix, swap_columns) (TYPE (gsl_matrix) * m,
+ const size_t i, const size_t j)
+{
+ const size_t size1 = m->size1;
+ const size_t size2 = m->size2;
+
+ if (i >= size2)
+ {
+ GSL_ERROR ("first column index is out of range", GSL_EINVAL);
+ }
+
+ if (j >= size2)
+ {
+ GSL_ERROR ("second column index is out of range", GSL_EINVAL);
+ }
+
+ if (i != j)
+ {
+ ATOMIC *col1 = m->data + MULTIPLICITY * i;
+ ATOMIC *col2 = m->data + MULTIPLICITY * j;
+
+ size_t p;
+
+ for (p = 0; p < size1; p++)
+ {
+ size_t k;
+ size_t n = p * MULTIPLICITY * m->tda;
+
+ for (k = 0; k < MULTIPLICITY; k++)
+ {
+ ATOMIC tmp = col1[n+k] ;
+ col1[n+k] = col2[n+k] ;
+ col2[n+k] = tmp ;
+ }
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+int
+FUNCTION (gsl_matrix, swap_rowcol) (TYPE (gsl_matrix) * m,
+ const size_t i, const size_t j)
+{
+ const size_t size1 = m->size1;
+ const size_t size2 = m->size2;
+
+ if (size1 != size2)
+ {
+ GSL_ERROR ("matrix must be square to swap row and column", GSL_ENOTSQR);
+ }
+
+ if (i >= size1)
+ {
+ GSL_ERROR ("row index is out of range", GSL_EINVAL);
+ }
+
+ if (j >= size2)
+ {
+ GSL_ERROR ("column index is out of range", GSL_EINVAL);
+ }
+
+ {
+ ATOMIC *row = m->data + MULTIPLICITY * i * m->tda;
+ ATOMIC *col = m->data + MULTIPLICITY * j;
+
+ size_t p;
+
+ for (p = 0; p < size1; p++)
+ {
+ size_t k;
+
+ size_t r = p * MULTIPLICITY;
+ size_t c = p * MULTIPLICITY * m->tda;
+
+ for (k = 0; k < MULTIPLICITY; k++)
+ {
+ ATOMIC tmp = col[c+k] ;
+ col[c+k] = row[r+k] ;
+ row[r+k] = tmp ;
+ }
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+int
+FUNCTION (gsl_matrix, transpose) (TYPE (gsl_matrix) * m)
+{
+ const size_t size1 = m->size1;
+ const size_t size2 = m->size2;
+ size_t i, j, k;
+
+ if (size1 != size2)
+ {
+ GSL_ERROR ("matrix must be square to take transpose", GSL_ENOTSQR);
+ }
+
+ for (i = 0; i < size1; i++)
+ {
+ for (j = i + 1 ; j < size2 ; j++)
+ {
+ for (k = 0; k < MULTIPLICITY; k++)
+ {
+ size_t e1 = (i * m->tda + j) * MULTIPLICITY + k ;
+ size_t e2 = (j * m->tda + i) * MULTIPLICITY + k ;
+ {
+ ATOMIC tmp = m->data[e1] ;
+ m->data[e1] = m->data[e2] ;
+ m->data[e2] = tmp ;
+ }
+ }
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+FUNCTION (gsl_matrix, transpose_memcpy) (TYPE (gsl_matrix) * dest,
+ const TYPE (gsl_matrix) * src)
+{
+ const size_t src_size1 = src->size1;
+ const size_t src_size2 = src->size2;
+
+ const size_t dest_size1 = dest->size1;
+ const size_t dest_size2 = dest->size2;
+
+ size_t i, j, k;
+
+ if (dest_size2 != src_size1 || dest_size1 != src_size2)
+ {
+ GSL_ERROR ("dimensions of dest matrix must be transpose of src matrix",
+ GSL_EBADLEN);
+ }
+
+ for (i = 0; i < dest_size1; i++)
+ {
+ for (j = 0 ; j < dest_size2; j++)
+ {
+ for (k = 0; k < MULTIPLICITY; k++)
+ {
+ size_t e1 = (i * dest->tda + j) * MULTIPLICITY + k ;
+ size_t e2 = (j * src->tda + i) * MULTIPLICITY + k ;
+
+ dest->data[e1] = src->data[e2] ;
+ }
+ }
+ }
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/matrix/test.c b/gsl-1.9/matrix/test.c
new file mode 100644
index 0000000..798d550
--- /dev/null
+++ b/gsl-1.9/matrix/test.c
@@ -0,0 +1,217 @@
+/* matrix/test.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+
+#if (!GSL_RANGE_CHECK) && HAVE_INLINE
+#undef GSL_RANGE_CHECK
+#define GSL_RANGE_CHECK 1
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+
+#define M 53
+#define N 107
+
+int status = 0;
+
+#ifndef DESC
+#define DESC ""
+#endif
+
+#define BASE_GSL_COMPLEX_LONG
+#include "templates_on.h"
+#include "test_complex_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_LONG
+
+#define BASE_GSL_COMPLEX
+#include "templates_on.h"
+#include "test_complex_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX
+
+#define BASE_GSL_COMPLEX_FLOAT
+#include "templates_on.h"
+#include "test_complex_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_FLOAT
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "test_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "test_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "test_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "test_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "test_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "test_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "test_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "test_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "test_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "test_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "test_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
+
+void my_error_handler (const char *reason, const char *file,
+ int line, int err);
+
+int
+main (void)
+{
+ gsl_ieee_env_setup ();
+
+ test_func ();
+ test_float_func ();
+ test_long_double_func ();
+ test_ulong_func ();
+ test_long_func ();
+ test_uint_func ();
+ test_int_func ();
+ test_ushort_func ();
+ test_short_func ();
+ test_uchar_func ();
+ test_char_func ();
+ test_complex_func ();
+ test_complex_float_func ();
+ test_complex_long_double_func ();
+
+ test_text ();
+ test_float_text ();
+#if HAVE_PRINTF_LONGDOUBLE
+ test_long_double_text ();
+#endif
+ test_ulong_text ();
+ test_long_text ();
+ test_uint_text ();
+ test_int_text ();
+ test_ushort_text ();
+ test_short_text ();
+ test_uchar_text ();
+ test_char_text ();
+ test_complex_text ();
+ test_complex_float_text ();
+#if HAVE_PRINTF_LONGDOUBLE
+ test_complex_long_double_text ();
+#endif
+
+ test_binary ();
+ test_float_binary ();
+ test_long_double_binary ();
+ test_ulong_binary ();
+ test_long_binary ();
+ test_uint_binary ();
+ test_int_binary ();
+ test_ushort_binary ();
+ test_short_binary ();
+ test_uchar_binary ();
+ test_char_binary ();
+ test_complex_binary ();
+ test_complex_float_binary ();
+ test_complex_long_double_binary ();
+
+#if GSL_RANGE_CHECK
+ gsl_set_error_handler (&my_error_handler);
+
+ test_trap ();
+ test_float_trap ();
+ test_long_double_trap ();
+ test_ulong_trap ();
+ test_long_trap ();
+ test_uint_trap ();
+ test_int_trap ();
+ test_ushort_trap ();
+ test_short_trap ();
+ test_uchar_trap ();
+ test_char_trap ();
+ test_complex_trap ();
+ test_complex_float_trap ();
+ test_complex_long_double_trap ();
+#endif
+
+ test_complex_arith ();
+ test_complex_float_arith ();
+ test_complex_long_double_arith ();
+
+ exit (gsl_test_summary ());
+}
+
+void
+my_error_handler (const char *reason, const char *file, int line, int err)
+{
+ if (0)
+ printf ("(caught [%s:%d: %s (%d)])\n", file, line, reason, err);
+ status = 1;
+}
diff --git a/gsl-1.9/matrix/test_complex_source.c b/gsl-1.9/matrix/test_complex_source.c
new file mode 100644
index 0000000..f4072d7
--- /dev/null
+++ b/gsl-1.9/matrix/test_complex_source.c
@@ -0,0 +1,597 @@
+/* matrix/test_complex_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+void FUNCTION (test, func) (void);
+void FUNCTION (test, trap) (void);
+void FUNCTION (test, text) (void);
+void FUNCTION (test, binary) (void);
+void FUNCTION (test, arith) (void);
+
+#define TEST(expr,desc) gsl_test((expr), NAME(gsl_matrix) desc " M=%d, N=%d", M, N)
+
+void
+FUNCTION (test, func) (void)
+{
+
+ size_t i, j;
+ int k = 0;
+
+ TYPE (gsl_matrix) * m = FUNCTION (gsl_matrix, alloc) (M, N);
+
+ gsl_test (m->data == 0, NAME (gsl_matrix) "_alloc returns valid pointer");
+ gsl_test (m->size1 != M, NAME (gsl_matrix) "_alloc returns valid size1");
+ gsl_test (m->size2 != N, NAME (gsl_matrix) "_alloc returns valid size2");
+ gsl_test (m->tda != N, NAME (gsl_matrix) "_alloc returns valid tda");
+
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ BASE z = ZERO;
+ k++;
+ GSL_REAL (z) = (ATOMIC) k;
+ GSL_IMAG (z) = (ATOMIC) (k + 1000);
+ FUNCTION (gsl_matrix, set) (m, i, j, z);
+ }
+ }
+
+ status = 0;
+ k = 0;
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ k++;
+ if (m->data[2 * (i * N + j)] != k ||
+ m->data[2 * (i * N + j) + 1] != k + 1000)
+ status = 1;
+ }
+ }
+
+ gsl_test (status, NAME (gsl_matrix) "_set writes into array");
+
+ status = 0;
+ k = 0;
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ BASE z = FUNCTION (gsl_matrix, get) (m, i, j);
+ k++;
+ if (GSL_REAL (z) != k || GSL_IMAG (z) != k + 1000)
+ status = 1;
+ }
+ }
+ gsl_test (status, NAME (gsl_matrix) "_get reads from array");
+
+ FUNCTION (gsl_matrix, free) (m); /* free whatever is in m */
+
+ m = FUNCTION (gsl_matrix, calloc) (M, N);
+
+ {
+ int status = (FUNCTION(gsl_matrix,isnull)(m) != 1);
+ TEST (status, "_isnull" DESC " on calloc matrix");
+
+ status = (FUNCTION(gsl_matrix,ispos)(m) != 0);
+ TEST (status, "_ispos" DESC " on calloc matrix");
+
+ status = (FUNCTION(gsl_matrix,isneg)(m) != 0);
+ TEST (status, "_isneg" DESC " on calloc matrix");
+ }
+
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ BASE z = ZERO;
+ FUNCTION (gsl_matrix, set) (m, i, j, z);
+ }
+ }
+
+ {
+ status = (FUNCTION(gsl_matrix,isnull)(m) != 1);
+ TEST (status, "_isnull" DESC " on null matrix") ;
+
+ status = (FUNCTION(gsl_matrix,ispos)(m) != 0);
+ TEST (status, "_ispos" DESC " on null matrix") ;
+
+ status = (FUNCTION(gsl_matrix,isneg)(m) != 0);
+ TEST (status, "_isneg" DESC " on null matrix") ;
+ }
+
+
+ k = 0;
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ BASE z = ZERO;
+ k++;
+ GSL_REAL (z) = (ATOMIC) (k % 10);
+ GSL_IMAG (z) = (ATOMIC) ((k + 5) % 10);
+ FUNCTION (gsl_matrix, set) (m, i, j, z);
+ }
+ }
+
+ {
+ status = (FUNCTION(gsl_matrix,isnull)(m) != 0);
+ TEST (status, "_isnull" DESC " on non-negative matrix") ;
+
+ status = (FUNCTION(gsl_matrix,ispos)(m) != 0);
+ TEST (status, "_ispos" DESC " on non-negative matrix") ;
+
+ status = (FUNCTION(gsl_matrix,isneg)(m) != 0);
+ TEST (status, "_isneg" DESC " on non-negative matrix") ;
+ }
+
+ k = 0;
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ BASE z = ZERO;
+ k++;
+ GSL_REAL (z) = (ATOMIC) ((k % 10) - 5);
+ GSL_IMAG (z) = (ATOMIC) (((k + 5) % 10) - 5);
+ FUNCTION (gsl_matrix, set) (m, i, j, z);
+ }
+ }
+
+ {
+ status = (FUNCTION(gsl_matrix,isnull)(m) != 0);
+ TEST (status, "_isnull" DESC " on mixed matrix") ;
+
+ status = (FUNCTION(gsl_matrix,ispos)(m) != 0);
+ TEST (status, "_ispos" DESC " on mixed matrix") ;
+
+ status = (FUNCTION(gsl_matrix,isneg)(m) != 0);
+ TEST (status, "_isneg" DESC " on mixed matrix") ;
+ }
+
+ k = 0;
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ BASE z = ZERO;
+ k++;
+ GSL_REAL (z) = -(ATOMIC) (k % 10);
+ GSL_IMAG (z) = -(ATOMIC) ((k + 5) % 10);
+ FUNCTION (gsl_matrix, set) (m, i, j, z);
+ }
+ }
+
+ {
+ status = (FUNCTION(gsl_matrix,isnull)(m) != 0);
+ TEST (status, "_isnull" DESC " on non-positive matrix") ;
+
+ status = (FUNCTION(gsl_matrix,ispos)(m) != 0);
+ TEST (status, "_ispos" DESC " on non-positive matrix") ;
+
+ status = (FUNCTION(gsl_matrix,isneg)(m) != 0);
+ TEST (status, "_isneg" DESC " on non-positive matrix") ;
+ }
+
+ k = 0;
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ BASE z = ZERO;
+ k++;
+ GSL_REAL (z) = (ATOMIC) (k % 10 + 1);
+ GSL_IMAG (z) = (ATOMIC) ((k + 5) % 10 + 1);
+ FUNCTION (gsl_matrix, set) (m, i, j, z);
+ }
+ }
+
+ {
+ status = (FUNCTION(gsl_matrix,isnull)(m) != 0);
+ TEST (status, "_isnull" DESC " on positive matrix") ;
+
+ status = (FUNCTION(gsl_matrix,ispos)(m) != 1);
+ TEST (status, "_ispos" DESC " on positive matrix") ;
+
+ status = (FUNCTION(gsl_matrix,isneg)(m) != 0);
+ TEST (status, "_isneg" DESC " on positive matrix") ;
+ }
+
+ k = 0;
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ BASE z = ZERO;
+ k++;
+ GSL_REAL (z) = -(ATOMIC) (k % 10 + 1);
+ GSL_IMAG (z) = -(ATOMIC) ((k + 5) % 10 + 1);
+ FUNCTION (gsl_matrix, set) (m, i, j, z);
+ }
+ }
+
+ {
+ status = (FUNCTION(gsl_matrix,isnull)(m) != 0);
+ TEST (status, "_isnull" DESC " on negative matrix") ;
+
+ status = (FUNCTION(gsl_matrix,ispos)(m) != 0);
+ TEST (status, "_ispos" DESC " on negative matrix") ;
+
+ status = (FUNCTION(gsl_matrix,isneg)(m) != 1);
+ TEST (status, "_isneg" DESC " on negative matrix") ;
+ }
+
+ FUNCTION (gsl_matrix, free) (m); /* free whatever is in m */
+}
+
+#if !(USES_LONGDOUBLE && !HAVE_PRINTF_LONGDOUBLE)
+void
+FUNCTION (test, text) (void)
+{
+ TYPE (gsl_matrix) * m = FUNCTION (gsl_matrix, alloc) (M, N);
+
+ size_t i, j;
+ int k = 0;
+
+ {
+ FILE *f = fopen ("test.txt", "w");
+ k = 0;
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ BASE z;
+ k++;
+ GSL_REAL (z) = (ATOMIC) k;
+ GSL_IMAG (z) = (ATOMIC) (k + 1000);
+ FUNCTION (gsl_matrix, set) (m, i, j, z);
+ }
+ }
+
+ FUNCTION (gsl_matrix, fprintf) (f, m, OUT_FORMAT);
+
+ fclose (f);
+ }
+
+ {
+ FILE *f = fopen ("test.txt", "r");
+ TYPE (gsl_matrix) * mm = FUNCTION (gsl_matrix, alloc) (M, N);
+ status = 0;
+
+ FUNCTION (gsl_matrix, fscanf) (f, mm);
+ k = 0;
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ k++;
+ if (mm->data[2 * (i * N + j)] != k
+ || mm->data[2 * (i * N + j) + 1] != k + 1000)
+ status = 1;
+ }
+ }
+
+ gsl_test (status, NAME (gsl_matrix) "_fprintf and fscanf");
+
+ fclose (f);
+ FUNCTION (gsl_matrix, free) (mm);
+ }
+
+ FUNCTION (gsl_matrix, free) (m);
+}
+#endif
+
+void
+FUNCTION (test, binary) (void)
+{
+ TYPE (gsl_matrix) * m = FUNCTION (gsl_matrix, alloc) (M, N);
+
+ size_t i, j;
+ int k = 0;
+
+ {
+ FILE *f = fopen ("test.dat", "wb");
+ k = 0;
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ BASE z = ZERO;
+ k++;
+ GSL_REAL (z) = (ATOMIC) k;
+ GSL_IMAG (z) = (ATOMIC) (k + 1000);
+ FUNCTION (gsl_matrix, set) (m, i, j, z);
+ }
+ }
+
+ FUNCTION (gsl_matrix, fwrite) (f, m);
+
+ fclose (f);
+ }
+
+ {
+ FILE *f = fopen ("test.dat", "rb");
+ TYPE (gsl_matrix) * mm = FUNCTION (gsl_matrix, alloc) (M, N);
+ status = 0;
+
+ FUNCTION (gsl_matrix, fread) (f, mm);
+ k = 0;
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ k++;
+ if (mm->data[2 * (i * N + j)] != k
+ || mm->data[2 * (i * N + j) + 1] != k + 1000)
+ status = 1;
+ }
+ }
+
+ gsl_test (status, NAME (gsl_matrix) "_write and read");
+
+ fclose (f);
+ FUNCTION (gsl_matrix, free) (mm);
+ }
+
+ FUNCTION (gsl_matrix, free) (m);
+}
+
+void
+FUNCTION (test, trap) (void)
+{
+ TYPE (gsl_matrix) * mc = FUNCTION (gsl_matrix, alloc) (M, N);
+ size_t i = 0, j = 0;
+
+ BASE z = { {(ATOMIC) 1.2, (ATOMIC) 3.4} };
+ BASE z1;
+
+ status = 0;
+ FUNCTION (gsl_matrix, set) (mc, i - 1, j, z);
+ gsl_test (!status,
+ NAME (gsl_matrix) "_set traps 1st index below lower bound");
+
+ status = 0;
+ FUNCTION (gsl_matrix, set) (mc, i, j - 1, z);
+ gsl_test (!status,
+ NAME (gsl_matrix) "_set traps 2nd index below lower bound");
+
+ status = 0;
+ FUNCTION (gsl_matrix, set) (mc, M + 1, 0, z);
+ gsl_test (!status,
+ NAME (gsl_matrix) "_set traps 1st index above upper bound");
+
+ status = 0;
+ FUNCTION (gsl_matrix, set) (mc, 0, N + 1, z);
+ gsl_test (!status,
+ NAME (gsl_matrix) "_set traps 2nd index above upper bound");
+
+ status = 0;
+ FUNCTION (gsl_matrix, set) (mc, M, 0, z);
+ gsl_test (!status, NAME (gsl_matrix) "_set traps 1st index at upper bound");
+
+ status = 0;
+ FUNCTION (gsl_matrix, set) (mc, 0, N, z);
+ gsl_test (!status, NAME (gsl_matrix) "_set traps 2nd index at upper bound");
+
+ status = 0;
+ z1 = FUNCTION (gsl_matrix, get) (mc, i - 1, 0);
+ gsl_test (!status,
+ NAME (gsl_matrix) "_get traps 1st index below lower bound");
+ gsl_test (GSL_REAL (z1) != 0,
+ NAME (gsl_matrix) "_get, zero real for 1st index below l.b.");
+ gsl_test (GSL_IMAG (z1) != 0,
+ NAME (gsl_matrix) "_get, zero imag for 1st index below l.b.");
+
+ status = 0;
+ z1 = FUNCTION (gsl_matrix, get) (mc, 0, j - 1);
+ gsl_test (!status,
+ NAME (gsl_matrix) "_get traps 2nd index below lower bound");
+ gsl_test (GSL_REAL (z1) != 0,
+ NAME (gsl_matrix) "_get, zero real for 2nd index below l.b.");
+ gsl_test (GSL_IMAG (z1) != 0,
+ NAME (gsl_matrix) "_get, zero imag for 2nd index below l.b.");
+
+ status = 0;
+ z1 = FUNCTION (gsl_matrix, get) (mc, M + 1, 0);
+ gsl_test (!status,
+ NAME (gsl_matrix) "_get traps 1st index above upper bound");
+ gsl_test (GSL_REAL (z1) != 0,
+ NAME (gsl_matrix) "_get, zero real for 1st index above u.b.");
+ gsl_test (GSL_IMAG (z1) != 0,
+ NAME (gsl_matrix) "_get, zero imag for 1st index above u.b.");
+
+ status = 0;
+ z1 = FUNCTION (gsl_matrix, get) (mc, 0, N + 1);
+ gsl_test (!status,
+ NAME (gsl_matrix) "_get traps 2nd index above upper bound");
+ gsl_test (GSL_REAL (z1) != 0,
+ NAME (gsl_matrix) "_get, zero real for 2nd index above u.b.");
+ gsl_test (GSL_IMAG (z1) != 0,
+ NAME (gsl_matrix) "_get, zero imag for 2nd index above u.b.");
+
+ status = 0;
+ z1 = FUNCTION (gsl_matrix, get) (mc, M, 0);
+ gsl_test (!status, NAME (gsl_matrix) "_get traps 1st index at upper bound");
+ gsl_test (GSL_REAL (z1) != 0,
+ NAME (gsl_matrix) "_get, zero real for 1st index at u.b.");
+ gsl_test (GSL_IMAG (z1) != 0,
+ NAME (gsl_matrix) "_get, zero imag for 1st index at u.b.");
+
+ status = 0;
+ z1 = FUNCTION (gsl_matrix, get) (mc, 0, N);
+ gsl_test (!status, NAME (gsl_matrix) "_get traps 2nd index at upper bound");
+ gsl_test (GSL_REAL (z1) != 0,
+ NAME (gsl_matrix) "_get, zero real for 2nd index at u.b.");
+ gsl_test (GSL_IMAG (z1) != 0,
+ NAME (gsl_matrix) "_get, zero imag for 2nd index at u.b.");
+
+ FUNCTION (gsl_matrix, free) (mc);
+}
+
+
+void
+FUNCTION (test, arith) (void)
+{
+
+#define P 8
+#define Q 12
+/* Must use smaller dimensions to prevent approximation of floats in float_mul_elements test*/
+
+ TYPE (gsl_matrix) * a = FUNCTION (gsl_matrix, alloc) (P, Q);
+ TYPE (gsl_matrix) * b = FUNCTION (gsl_matrix, alloc) (P, Q);
+ TYPE (gsl_matrix) * m = FUNCTION (gsl_matrix, alloc) (P, Q);
+ size_t i, j;
+ size_t k = 0;
+
+ size_t status = 0;
+
+ for (i = 0; i < P; i++)
+ {
+ for (j = 0; j < Q; j++)
+ {
+ BASE z, z1;
+ GSL_REAL (z) = (ATOMIC) k;
+ GSL_IMAG (z) = (ATOMIC) (k + 10);
+ GSL_REAL (z1) = (ATOMIC) (k + 5);
+ GSL_IMAG (z1) = (ATOMIC) (k + 20);
+
+ FUNCTION (gsl_matrix, set) (a, i, j, z);
+ FUNCTION (gsl_matrix, set) (b, i, j, z1);
+ k++;
+ }
+ }
+
+ {
+ FUNCTION (gsl_matrix, memcpy) (m, a);
+
+ FUNCTION (gsl_matrix, add) (m, b);
+
+ k = 0;
+ status = 0;
+
+ for (i = 0; i < P; i++)
+ {
+ for (j = 0; j < Q; j++)
+ {
+ BASE z = FUNCTION (gsl_matrix, get) (m, i, j);
+ if (GSL_REAL (z) != (ATOMIC) (2 * k + 5) ||
+ GSL_IMAG (z) != (ATOMIC) (2 * k + 30))
+ status = 1;
+ k++;
+ }
+ }
+ gsl_test (status, NAME (gsl_matrix) "_add matrix addition");
+ }
+
+ {
+ FUNCTION (gsl_matrix, memcpy) (m, a);
+
+ FUNCTION (gsl_matrix, sub) (m, b);
+
+ k = 0;
+ status = 0;
+
+ for (i = 0; i < P; i++)
+ {
+ for (j = 0; j < Q; j++)
+ {
+ BASE z = FUNCTION (gsl_matrix, get) (m, i, j);
+ if (GSL_REAL (z) != (ATOMIC) (-5)
+ || GSL_IMAG (z) != (ATOMIC) (-10))
+ status = 1;
+ k++;
+ }
+ }
+ gsl_test (status, NAME (gsl_matrix) "_sub matrix subtraction");
+ }
+
+ {
+ FUNCTION (gsl_matrix, memcpy) (m, a);
+
+ FUNCTION (gsl_matrix, mul_elements) (m, b);
+
+ k = 0;
+ status = 0;
+
+ for (i = 0; i < P; i++)
+ {
+ for (j = 0; j < Q; j++)
+ {
+ ATOMIC real = -(ATOMIC) (25 * k + 200);
+ ATOMIC imag = (ATOMIC) (2 * k * k + 35 * k + 50);
+ BASE z = FUNCTION (gsl_matrix, get) (m, i, j);
+ if (fabs (GSL_REAL (z) - real) > 100 * BASE_EPSILON ||
+ fabs (GSL_IMAG (z) - imag) > 100 * BASE_EPSILON)
+ {
+ status = 1;
+#ifdef DEBUG
+ printf ("%d\t%d\n", i, j);
+ printf (OUT_FORMAT "\n",
+ GSL_REAL (z) + (ATOMIC) (25 * (ATOMIC) k + 200));
+ printf (OUT_FORMAT "\n",
+ GSL_IMAG (z) - (ATOMIC) (2 * k * k + 35 * k + 50));
+ printf ("\n");
+#endif
+ }
+ k++;
+ }
+ }
+ gsl_test (status, NAME (gsl_matrix) "_mul_elements multiplication");
+ }
+
+
+ {
+ FUNCTION (gsl_matrix, memcpy) (m, a);
+
+ FUNCTION (gsl_matrix, div_elements) (m, b);
+
+ k = 0;
+ status = 0;
+
+ for (i = 0; i < P; i++)
+ {
+ for (j = 0; j < Q; j++)
+ {
+ ATOMIC denom = (2 * k * k + 50 * k + 425);
+ ATOMIC real = (ATOMIC) (2 * k * k + 35 * k + 200) / denom;
+ ATOMIC imag = ((ATOMIC) (50) - (ATOMIC) (5 * k)) / denom;
+ BASE z = FUNCTION (gsl_matrix, get) (m, i, j);
+ if (fabs (GSL_REAL (z) - real) > 100 * BASE_EPSILON ||
+ fabs (GSL_IMAG (z) - imag) > 100 * BASE_EPSILON)
+ {
+#ifdef DEBUG
+ printf (OUT_FORMAT "\t",
+ GSL_REAL (z) - (ATOMIC) (2 * k * k + 35 * k +
+ 200) / denom);
+ printf (OUT_FORMAT "\n",
+ GSL_IMAG (z) - ((ATOMIC) (50) -
+ (ATOMIC) (5 * k)) / denom);
+#endif
+ status = 1;
+ }
+ k++;
+ }
+ }
+ gsl_test (status, NAME (gsl_matrix) "_div_elements division");
+ }
+
+ FUNCTION (gsl_matrix, free) (a);
+ FUNCTION (gsl_matrix, free) (b);
+ FUNCTION (gsl_matrix, free) (m);
+
+}
diff --git a/gsl-1.9/matrix/test_source.c b/gsl-1.9/matrix/test_source.c
new file mode 100644
index 0000000..f3ec3a4
--- /dev/null
+++ b/gsl-1.9/matrix/test_source.c
@@ -0,0 +1,670 @@
+/* matrix/test_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+void FUNCTION (test, func) (void);
+void FUNCTION (test, trap) (void);
+void FUNCTION (test, text) (void);
+void FUNCTION (test, binary) (void);
+
+#define TEST(expr,desc) gsl_test((expr), NAME(gsl_matrix) desc " M=%d, N=%d", M, N)
+
+void
+FUNCTION (test, func) (void)
+{
+ TYPE (gsl_vector) * v;
+ size_t i, j;
+ size_t k = 0;
+
+ TYPE (gsl_matrix) * m = FUNCTION (gsl_matrix, alloc) (M, N);
+
+ gsl_test (m->data == 0, NAME (gsl_matrix) "_alloc returns valid pointer");
+ gsl_test (m->size1 != M, NAME (gsl_matrix) "_alloc returns valid size1");
+ gsl_test (m->size2 != N, NAME (gsl_matrix) "_alloc returns valid size2");
+ gsl_test (m->tda != N, NAME (gsl_matrix) "_alloc returns valid tda");
+
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ k++;
+ FUNCTION (gsl_matrix, set) (m, i, j, (BASE) k);
+ }
+ }
+
+ {
+ status = 0;
+ k = 0;
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ k++;
+ if (m->data[i * N + j] != (BASE) k)
+ status = 1;
+ };
+ };
+
+ gsl_test (status, NAME (gsl_matrix) "_set writes into array");
+ }
+
+ {
+ status = 0;
+ k = 0;
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ k++;
+ if (FUNCTION (gsl_matrix, get) (m, i, j) != (BASE) k)
+ status = 1;
+ };
+ };
+ gsl_test (status, NAME (gsl_matrix) "_get reads from array");
+ }
+
+
+ FUNCTION (gsl_matrix, free) (m); /* free whatever is in m */
+
+ m = FUNCTION (gsl_matrix, calloc) (M, N);
+ v = FUNCTION (gsl_vector, calloc) (N);
+
+ {
+ int status = (FUNCTION(gsl_matrix,isnull)(m) != 1);
+ TEST (status, "_isnull" DESC " on calloc matrix");
+
+ status = (FUNCTION(gsl_matrix,ispos)(m) != 0);
+ TEST (status, "_ispos" DESC " on calloc matrix");
+
+ status = (FUNCTION(gsl_matrix,isneg)(m) != 0);
+ TEST (status, "_isneg" DESC " on calloc matrix");
+ }
+
+
+ k = 0;
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ k++;
+ FUNCTION (gsl_matrix, set) (m, i, j, (BASE) k);
+ }
+ }
+
+
+ {
+ status = 0;
+ k = 0;
+ for (i = 0; i < M; i++)
+ {
+ FUNCTION (gsl_matrix, get_row) (v, m, i);
+
+ for (j = 0; j < N; j++)
+ {
+ k++;
+ if (v->data[j] != (BASE) k)
+ status = 1;
+ }
+ }
+
+ gsl_test (status, NAME (gsl_matrix) "_get_row extracts row");
+ }
+
+ {
+ BASE exp_max = FUNCTION(gsl_matrix, get) (m, 0, 0);
+ BASE exp_min = FUNCTION(gsl_matrix, get) (m, 0, 0);
+ size_t exp_imax = 0, exp_jmax = 0, exp_imin = 0, exp_jmin = 0;
+
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ BASE k = FUNCTION(gsl_matrix, get) (m, i, j);
+ if (k > exp_max) {
+ exp_max = FUNCTION(gsl_matrix, get) (m, i, j);
+ exp_imax = i;
+ exp_jmax = j;
+ }
+ if (k < exp_min) {
+ exp_min = FUNCTION(gsl_matrix, get) (m, i, j);
+ exp_imin = i;
+ exp_jmin = j;
+ }
+ }
+ }
+
+ {
+ BASE max = FUNCTION(gsl_matrix, max) (m) ;
+
+ gsl_test (max != exp_max, NAME(gsl_matrix) "_max returns correct maximum value");
+ }
+
+ {
+ BASE min = FUNCTION(gsl_matrix, min) (m) ;
+
+ gsl_test (min != exp_min, NAME(gsl_matrix) "_min returns correct minimum value");
+ }
+
+ {
+ BASE min, max;
+ FUNCTION(gsl_matrix, minmax) (m, &min, &max);
+
+ gsl_test (max != exp_max, NAME(gsl_matrix) "_minmax returns correct maximum value");
+ gsl_test (min != exp_min, NAME(gsl_matrix) "_minmax returns correct minimum value");
+ }
+
+
+ {
+ size_t imax, jmax;
+ FUNCTION(gsl_matrix, max_index) (m, &imax, &jmax) ;
+
+ gsl_test (imax != exp_imax, NAME(gsl_matrix) "_max_index returns correct maximum i");
+ gsl_test (jmax != exp_jmax, NAME(gsl_matrix) "_max_index returns correct maximum j");
+ }
+
+ {
+ size_t imin, jmin;
+ FUNCTION(gsl_matrix, min_index) (m, &imin, &jmin) ;
+
+ gsl_test (imin != exp_imin, NAME(gsl_matrix) "_min_index returns correct minimum i");
+ gsl_test (jmin != exp_jmin, NAME(gsl_matrix) "_min_index returns correct minimum j");
+ }
+
+ {
+ size_t imin, jmin, imax, jmax;
+
+ FUNCTION(gsl_matrix, minmax_index) (m, &imin, &jmin, &imax, &jmax);
+
+ gsl_test (imax != exp_imax, NAME(gsl_matrix) "_minmax_index returns correct maximum i");
+ gsl_test (jmax != exp_jmax, NAME(gsl_matrix) "_minmax_index returns correct maximum j");
+
+ gsl_test (imin != exp_imin, NAME(gsl_matrix) "_minmax_index returns correct minimum i");
+ gsl_test (jmin != exp_jmin, NAME(gsl_matrix) "_minmax_index returns correct minimum j");
+ }
+
+#if FP
+ FUNCTION(gsl_matrix,set)(m, 2, 3, GSL_NAN);
+ exp_min = GSL_NAN; exp_max = GSL_NAN;
+ exp_imin = 2; exp_jmin = 3;
+ exp_imax = 2; exp_jmax = 3;
+
+ {
+ BASE max = FUNCTION(gsl_matrix, max) (m) ;
+
+ gsl_test_abs (max,exp_max, 0, NAME(gsl_matrix) "_max returns correct maximum value for NaN");
+ }
+
+ {
+ BASE min = FUNCTION(gsl_matrix, min) (m) ;
+
+ gsl_test_abs (min, exp_min, 0, NAME(gsl_matrix) "_min returns correct minimum value for NaN");
+ }
+
+ {
+ BASE min, max;
+ FUNCTION(gsl_matrix, minmax) (m, &min, &max);
+
+ gsl_test_abs (max, exp_max, 0, NAME(gsl_matrix) "_minmax returns correct maximum value for NaN");
+ gsl_test_abs (min, exp_min, 0, NAME(gsl_matrix) "_minmax returns correct minimum value for NaN");
+ }
+
+
+ {
+ size_t imax, jmax;
+ FUNCTION(gsl_matrix, max_index) (m, &imax, &jmax) ;
+
+ gsl_test (imax != exp_imax, NAME(gsl_matrix) "_max_index returns correct maximum i for NaN");
+ gsl_test (jmax != exp_jmax, NAME(gsl_matrix) "_max_index returns correct maximum j for NaN");
+ }
+
+ {
+ size_t imin, jmin;
+ FUNCTION(gsl_matrix, min_index) (m, &imin, &jmin) ;
+
+ gsl_test (imin != exp_imin, NAME(gsl_matrix) "_min_index returns correct minimum i for NaN");
+ gsl_test (jmin != exp_jmin, NAME(gsl_matrix) "_min_index returns correct minimum j for NaN");
+ }
+
+ {
+ size_t imin, jmin, imax, jmax;
+
+ FUNCTION(gsl_matrix, minmax_index) (m, &imin, &jmin, &imax, &jmax);
+
+ gsl_test (imax != exp_imax, NAME(gsl_matrix) "_minmax_index returns correct maximum i for NaN");
+ gsl_test (jmax != exp_jmax, NAME(gsl_matrix) "_minmax_index returns correct maximum j for NaN");
+
+ gsl_test (imin != exp_imin, NAME(gsl_matrix) "_minmax_index returns correct minimum i for NaN");
+ gsl_test (jmin != exp_jmin, NAME(gsl_matrix) "_minmax_index returns correct minimum j for NaN");
+ }
+#endif
+
+
+ }
+
+
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ FUNCTION (gsl_matrix, set) (m, i, j, (ATOMIC) 0);
+ }
+ }
+
+ {
+ status = (FUNCTION(gsl_matrix,isnull)(m) != 1);
+ TEST (status, "_isnull" DESC " on null matrix") ;
+
+ status = (FUNCTION(gsl_matrix,ispos)(m) != 0);
+ TEST (status, "_ispos" DESC " on null matrix") ;
+
+ status = (FUNCTION(gsl_matrix,isneg)(m) != 0);
+ TEST (status, "_isneg" DESC " on null matrix") ;
+ }
+
+
+ k = 0;
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ k++;
+ FUNCTION (gsl_matrix, set) (m, i, j, (ATOMIC) (k % 10));
+ }
+ }
+
+ {
+ status = (FUNCTION(gsl_matrix,isnull)(m) != 0);
+ TEST (status, "_isnull" DESC " on non-negative matrix") ;
+
+ status = (FUNCTION(gsl_matrix,ispos)(m) != 0);
+ TEST (status, "_ispos" DESC " on non-negative matrix") ;
+
+ status = (FUNCTION(gsl_matrix,isneg)(m) != 0);
+ TEST (status, "_isneg" DESC " on non-negative matrix") ;
+ }
+
+#ifndef UNSIGNED
+ k = 0;
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ k++;
+ FUNCTION (gsl_matrix, set) (m, i, j, (ATOMIC) ((k % 10) - 5));
+ }
+ }
+
+ {
+ status = (FUNCTION(gsl_matrix,isnull)(m) != 0);
+ TEST (status, "_isnull" DESC " on mixed matrix") ;
+
+ status = (FUNCTION(gsl_matrix,ispos)(m) != 0);
+ TEST (status, "_ispos" DESC " on mixed matrix") ;
+
+ status = (FUNCTION(gsl_matrix,isneg)(m) != 0);
+ TEST (status, "_isneg" DESC " on mixed matrix") ;
+ }
+
+ k = 0;
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ k++;
+ FUNCTION (gsl_matrix, set) (m, i, j, -(ATOMIC) (k % 10));
+ }
+ }
+
+ {
+ status = (FUNCTION(gsl_matrix,isnull)(m) != 0);
+ TEST (status, "_isnull" DESC " on non-positive matrix") ;
+
+ status = (FUNCTION(gsl_matrix,ispos)(m) != 0);
+ TEST (status, "_ispos" DESC " on non-positive matrix") ;
+
+ status = (FUNCTION(gsl_matrix,isneg)(m) != 0);
+ TEST (status, "_isneg" DESC " on non-positive matrix") ;
+ }
+#endif
+
+ k = 0;
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ k++;
+ FUNCTION (gsl_matrix, set) (m, i, j, (ATOMIC) (k % 10 + 1));
+ }
+ }
+
+ {
+ status = (FUNCTION(gsl_matrix,isnull)(m) != 0);
+ TEST (status, "_isnull" DESC " on positive matrix") ;
+
+ status = (FUNCTION(gsl_matrix,ispos)(m) != 1);
+ TEST (status, "_ispos" DESC " on positive matrix") ;
+
+ status = (FUNCTION(gsl_matrix,isneg)(m) != 0);
+ TEST (status, "_isneg" DESC " on positive matrix") ;
+ }
+
+#if (!defined(UNSIGNED) && !defined(BASE_CHAR))
+ k = 0;
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ k++;
+ FUNCTION (gsl_matrix, set) (m, i, j, -(ATOMIC) (k % 10 + 1));
+ }
+ }
+
+ {
+ status = (FUNCTION(gsl_matrix,isnull)(m) != 0);
+ TEST (status, "_isnull" DESC " on negative matrix") ;
+
+ status = (FUNCTION(gsl_matrix,ispos)(m) != 0);
+ TEST (status, "_ispos" DESC " on negative matrix") ;
+
+ status = (FUNCTION(gsl_matrix,isneg)(m) != 1);
+ TEST (status, "_isneg" DESC " on negative matrix") ;
+ }
+#endif
+
+ {
+ TYPE (gsl_matrix) * a = FUNCTION (gsl_matrix, calloc) (M, N);
+ TYPE (gsl_matrix) * b = FUNCTION (gsl_matrix, calloc) (M, N);
+
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ FUNCTION (gsl_matrix, set) (a, i, j, (BASE)(3 + i + 5 * j));
+ FUNCTION (gsl_matrix, set) (b, i, j, (BASE)(3 + 2 * i + 4 * j));
+ }
+ }
+
+ FUNCTION(gsl_matrix, memcpy) (m, a);
+ FUNCTION(gsl_matrix, add) (m, b);
+
+ {
+ int status = 0;
+
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ BASE r = FUNCTION(gsl_matrix,get) (m,i,j);
+ BASE x = FUNCTION(gsl_matrix,get) (a,i,j);
+ BASE y = FUNCTION(gsl_matrix,get) (b,i,j);
+ BASE z = x + y;
+ if (r != z)
+ status = 1;
+ }
+ }
+ gsl_test (status, NAME (gsl_matrix) "_add matrix addition");
+ }
+
+
+ FUNCTION(gsl_matrix, memcpy) (m, a);
+ FUNCTION(gsl_matrix, sub) (m, b);
+
+ {
+ int status = 0;
+
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ BASE r = FUNCTION(gsl_matrix,get) (m,i,j);
+ BASE x = FUNCTION(gsl_matrix,get) (a,i,j);
+ BASE y = FUNCTION(gsl_matrix,get) (b,i,j);
+ BASE z = x - y;
+ if (r != z)
+ status = 1;
+ }
+ }
+ gsl_test (status, NAME (gsl_matrix) "_sub matrix subtraction");
+ }
+
+ FUNCTION(gsl_matrix, memcpy) (m, a);
+ FUNCTION(gsl_matrix, mul_elements) (m, b);
+
+ {
+ int status = 0;
+
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ BASE r = FUNCTION(gsl_matrix,get) (m,i,j);
+ BASE x = FUNCTION(gsl_matrix,get) (a,i,j);
+ BASE y = FUNCTION(gsl_matrix,get) (b,i,j);
+ BASE z = x * y;
+ if (r != z)
+ status = 1;
+ }
+ }
+ gsl_test (status, NAME (gsl_matrix) "_mul_elements multiplication");
+ }
+
+ FUNCTION(gsl_matrix, memcpy) (m, a);
+ FUNCTION(gsl_matrix, div_elements) (m, b);
+
+ {
+ int status = 0;
+
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ BASE r = FUNCTION(gsl_matrix,get) (m,i,j);
+ BASE x = FUNCTION(gsl_matrix,get) (a,i,j);
+ BASE y = FUNCTION(gsl_matrix,get) (b,i,j);
+ BASE z = x / y;
+ if (fabs(r - z) > 2 * GSL_FLT_EPSILON * fabs(z))
+ status = 1;
+ }
+ }
+ gsl_test (status, NAME (gsl_matrix) "_div_elements division");
+ }
+
+
+ FUNCTION(gsl_matrix, free) (a);
+ FUNCTION(gsl_matrix, free) (b);
+ }
+
+
+ FUNCTION (gsl_matrix, free) (m);
+ FUNCTION (gsl_vector, free) (v);
+}
+
+#if !(USES_LONGDOUBLE && !HAVE_PRINTF_LONGDOUBLE)
+void
+FUNCTION (test, text) (void)
+{
+ TYPE (gsl_matrix) * m = FUNCTION (gsl_matrix, alloc) (M, N);
+
+ size_t i, j;
+ int k = 0;
+
+ {
+ FILE *f = fopen ("test.txt", "w");
+
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ k++;
+ FUNCTION (gsl_matrix, set) (m, i, j, (BASE) k);
+ }
+ }
+
+ FUNCTION (gsl_matrix, fprintf) (f, m, OUT_FORMAT);
+ fclose (f);
+ }
+
+ {
+ FILE *f = fopen ("test.txt", "r");
+ TYPE (gsl_matrix) * mm = FUNCTION (gsl_matrix, alloc) (M, N);
+ status = 0;
+
+ FUNCTION (gsl_matrix, fscanf) (f, mm);
+ k = 0;
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ k++;
+ if (mm->data[i * N + j] != (BASE) k)
+ status = 1;
+ }
+ }
+
+ gsl_test (status, NAME (gsl_matrix) "_fprintf and fscanf");
+
+ fclose (f);
+ FUNCTION (gsl_matrix, free) (mm);
+ }
+
+ FUNCTION (gsl_matrix, free) (m);
+}
+#endif
+
+void
+FUNCTION (test, binary) (void)
+{
+ TYPE (gsl_matrix) * m = FUNCTION (gsl_matrix, calloc) (M, N);
+
+ size_t i, j;
+ size_t k = 0;
+
+ {
+ FILE *f = fopen ("test.dat", "wb");
+ k = 0;
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ k++;
+ FUNCTION (gsl_matrix, set) (m, i, j, (BASE) k);
+ }
+ }
+
+ FUNCTION (gsl_matrix, fwrite) (f, m);
+ fclose (f);
+ }
+
+ {
+ FILE *f = fopen ("test.dat", "rb");
+ TYPE (gsl_matrix) * mm = FUNCTION (gsl_matrix, alloc) (M, N);
+ status = 0;
+
+ FUNCTION (gsl_matrix, fread) (f, mm);
+ k = 0;
+ for (i = 0; i < M; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ k++;
+ if (mm->data[i * N + j] != (BASE) k)
+ status = 1;
+ }
+ }
+
+ gsl_test (status, NAME (gsl_matrix) "_write and read");
+
+ fclose (f);
+ FUNCTION (gsl_matrix, free) (mm);
+ }
+
+ FUNCTION (gsl_matrix, free) (m);
+}
+
+void
+FUNCTION (test, trap) (void)
+{
+ TYPE (gsl_matrix) * m = FUNCTION (gsl_matrix, alloc) (M, N);
+
+ size_t i = 0, j = 0;
+ double x;
+
+ status = 0;
+ FUNCTION (gsl_matrix, set) (m, M + 1, 0, (BASE) 1.2);
+ gsl_test (!status,
+ NAME (gsl_matrix) "_set traps 1st index above upper bound");
+
+ status = 0;
+ FUNCTION (gsl_matrix, set) (m, 0, N + 1, (BASE) 1.2);
+ gsl_test (!status,
+ NAME (gsl_matrix) "_set traps 2nd index above upper bound");
+
+ status = 0;
+ FUNCTION (gsl_matrix, set) (m, M, 0, (BASE) 1.2);
+ gsl_test (!status,
+ NAME (gsl_matrix) "_set traps 1st index at upper bound");
+
+ status = 0;
+ FUNCTION (gsl_matrix, set) (m, 0, N, (BASE) 1.2);
+ gsl_test (!status,
+ NAME (gsl_matrix) "_set traps 2nd index at upper bound");
+
+ status = 0;
+ x = FUNCTION (gsl_matrix, get) (m, i - 1, 0);
+ gsl_test (!status,
+ NAME (gsl_matrix) "_get traps 1st index below lower bound");
+ gsl_test (x != 0,
+ NAME (gsl_matrix) "_get returns zero for 1st index below lower bound");
+
+ status = 0;
+ x = FUNCTION (gsl_matrix, get) (m, 0, j - 1);
+ gsl_test (!status,
+ NAME (gsl_matrix) "_get traps 2nd index below lower bound");
+ gsl_test (x != 0,
+ NAME (gsl_matrix) "_get returns zero for 2nd index below lower bound");
+
+ status = 0;
+ x = FUNCTION (gsl_matrix, get) (m, M + 1, 0);
+ gsl_test (!status,
+ NAME (gsl_matrix) "_get traps 1st index above upper bound");
+ gsl_test (x != 0,
+ NAME (gsl_matrix) "_get returns zero for 1st index above upper bound");
+
+ status = 0;
+ x = FUNCTION (gsl_matrix, get) (m, 0, N + 1);
+ gsl_test (!status,
+ NAME (gsl_matrix) "_get traps 2nd index above upper bound");
+ gsl_test (x != 0,
+ NAME (gsl_matrix) "_get returns zero for 2nd index above upper bound");
+
+ status = 0;
+ x = FUNCTION (gsl_matrix, get) (m, M, 0);
+ gsl_test (!status,
+ NAME (gsl_matrix) "_get traps 1st index at upper bound");
+ gsl_test (x != 0,
+ NAME (gsl_matrix) "_get returns zero for 1st index at upper bound");
+
+ status = 0;
+ x = FUNCTION (gsl_matrix, get) (m, 0, N);
+ gsl_test (!status,
+ NAME (gsl_matrix) "_get traps 2nd index at upper bound");
+ gsl_test (x != 0,
+ NAME (gsl_matrix) "_get returns zero for 2nd index at upper bound");
+
+ FUNCTION (gsl_matrix, free) (m);
+}
diff --git a/gsl-1.9/matrix/test_static.c b/gsl-1.9/matrix/test_static.c
new file mode 100644
index 0000000..2ce7098
--- /dev/null
+++ b/gsl-1.9/matrix/test_static.c
@@ -0,0 +1,7 @@
+
+#undef HAVE_INLINE
+#ifndef NO_INLINE
+#define NO_INLINE
+#endif
+#define DESC " (static)"
+#include "test.c"
diff --git a/gsl-1.9/matrix/view.c b/gsl-1.9/matrix/view.c
new file mode 100644
index 0000000..2ad4911
--- /dev/null
+++ b/gsl-1.9/matrix/view.c
@@ -0,0 +1,176 @@
+#include <config.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_matrix.h>
+
+#include "view.h"
+
+#define BASE_GSL_COMPLEX_LONG
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_LONG
+
+#define BASE_GSL_COMPLEX
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX
+
+#define BASE_GSL_COMPLEX_FLOAT
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_FLOAT
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
+
+#define USE_QUALIFIER
+#define QUALIFIER const
+
+#define BASE_GSL_COMPLEX_LONG
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_LONG
+
+#define BASE_GSL_COMPLEX
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX
+
+#define BASE_GSL_COMPLEX_FLOAT
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_FLOAT
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
diff --git a/gsl-1.9/matrix/view.h b/gsl-1.9/matrix/view.h
new file mode 100644
index 0000000..01df9bd
--- /dev/null
+++ b/gsl-1.9/matrix/view.h
@@ -0,0 +1,5 @@
+#define NULL_VECTOR {0, 0, 0, 0, 0}
+#define NULL_VECTOR_VIEW {{0, 0, 0, 0, 0}}
+
+#define NULL_MATRIX {0, 0, 0, 0, 0, 0}
+#define NULL_MATRIX_VIEW {{0, 0, 0, 0, 0, 0}}
diff --git a/gsl-1.9/matrix/view_source.c b/gsl-1.9/matrix/view_source.c
new file mode 100644
index 0000000..f5bcc68
--- /dev/null
+++ b/gsl-1.9/matrix/view_source.c
@@ -0,0 +1,273 @@
+/* matrix/view_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+QUALIFIED_VIEW (_gsl_matrix,view)
+FUNCTION (gsl_matrix, view_array) (QUALIFIER ATOMIC * array,
+ const size_t n1, const size_t n2)
+{
+ QUALIFIED_VIEW (_gsl_matrix,view) view = NULL_MATRIX_VIEW;
+
+ if (n1 == 0)
+ {
+ GSL_ERROR_VAL ("matrix dimension n1 must be positive integer",
+ GSL_EINVAL, view);
+ }
+ else if (n2 == 0)
+ {
+ GSL_ERROR_VAL ("matrix dimension n2 must be positive integer",
+ GSL_EINVAL, view);
+ }
+
+ {
+ TYPE(gsl_matrix) m = NULL_MATRIX;
+
+ m.data = (ATOMIC *)array;
+ m.size1 = n1;
+ m.size2 = n2;
+ m.tda = n2;
+ m.block = 0;
+ m.owner = 0;
+
+ view.matrix = m;
+ return view;
+ }
+}
+
+QUALIFIED_VIEW (_gsl_matrix,view)
+FUNCTION(gsl_matrix, view_array_with_tda) (QUALIFIER ATOMIC * base,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda)
+{
+ QUALIFIED_VIEW (_gsl_matrix,view) view = NULL_MATRIX_VIEW;
+
+ if (n1 == 0)
+ {
+ GSL_ERROR_VAL ("matrix dimension n1 must be positive integer",
+ GSL_EINVAL, view);
+ }
+ else if (n2 == 0)
+ {
+ GSL_ERROR_VAL ("matrix dimension n2 must be positive integer",
+ GSL_EINVAL, view);
+ }
+ else if (n2 > tda)
+ {
+ GSL_ERROR_VAL ("matrix dimension n2 must not exceed tda",
+ GSL_EINVAL, view);
+ }
+
+
+ {
+ TYPE(gsl_matrix) m = NULL_MATRIX;
+
+ m.data = (ATOMIC *)base;
+ m.size1 = n1;
+ m.size2 = n2;
+ m.tda = tda;
+ m.block = 0;
+ m.owner = 0;
+
+ view.matrix = m;
+ return view;
+ }
+}
+
+QUALIFIED_VIEW (_gsl_matrix,view)
+FUNCTION(gsl_matrix, view_vector) (QUALIFIED_TYPE(gsl_vector) * v,
+ const size_t n1,
+ const size_t n2)
+{
+ QUALIFIED_VIEW (_gsl_matrix,view) view = NULL_MATRIX_VIEW;
+
+ if (n1 == 0)
+ {
+ GSL_ERROR_VAL ("matrix dimension n1 must be positive integer",
+ GSL_EINVAL, view);
+ }
+ else if (n2 == 0)
+ {
+ GSL_ERROR_VAL ("matrix dimension n2 must be positive integer",
+ GSL_EINVAL, view);
+ }
+ else if (v->stride != 1)
+ {
+ GSL_ERROR_VAL ("vector must have unit stride",
+ GSL_EINVAL, view);
+ }
+ else if (n1 * n2 > v->size)
+ {
+ GSL_ERROR_VAL ("matrix size exceeds size of original",
+ GSL_EINVAL, view);
+ }
+
+ {
+ TYPE(gsl_matrix) m = NULL_MATRIX;
+
+ m.data = v->data;
+ m.size1 = n1;
+ m.size2 = n2;
+ m.tda = n2;
+ m.block = v->block;
+ m.owner = 0;
+
+ view.matrix = m;
+ return view;
+ }
+}
+
+
+QUALIFIED_VIEW (_gsl_matrix,view)
+FUNCTION(gsl_matrix, view_vector_with_tda) (QUALIFIED_TYPE(gsl_vector) * v,
+ const size_t n1,
+ const size_t n2,
+ const size_t tda)
+{
+ QUALIFIED_VIEW (_gsl_matrix,view) view = NULL_MATRIX_VIEW;
+
+ if (n1 == 0)
+ {
+ GSL_ERROR_VAL ("matrix dimension n1 must be positive integer",
+ GSL_EINVAL, view);
+ }
+ else if (n2 == 0)
+ {
+ GSL_ERROR_VAL ("matrix dimension n2 must be positive integer",
+ GSL_EINVAL, view);
+ }
+ else if (v->stride != 1)
+ {
+ GSL_ERROR_VAL ("vector must have unit stride",
+ GSL_EINVAL, view);
+ }
+ else if (n2 > tda)
+ {
+ GSL_ERROR_VAL ("matrix dimension n2 must not exceed tda",
+ GSL_EINVAL, view);
+ }
+ else if (n1 * tda > v->size)
+ {
+ GSL_ERROR_VAL ("matrix size exceeds size of original",
+ GSL_EINVAL, view);
+ }
+
+ {
+ TYPE(gsl_matrix) m = NULL_MATRIX;
+
+ m.data = v->data;
+ m.size1 = n1;
+ m.size2 = n2;
+ m.tda = tda;
+ m.block = v->block;
+ m.owner = 0;
+
+ view.matrix = m;
+ return view;
+ }
+}
+
+#ifdef JUNK
+int
+FUNCTION (gsl_matrix, view_from_matrix) (TYPE(gsl_matrix) * m,
+ TYPE(gsl_matrix) * mm,
+ const size_t k1,
+ const size_t k2,
+ const size_t n1,
+ const size_t n2)
+{
+ if (n1 == 0)
+ {
+ GSL_ERROR_VAL ("matrix dimension n1 must be positive integer",
+ GSL_EINVAL, 0);
+ }
+ else if (n2 == 0)
+ {
+ GSL_ERROR_VAL ("matrix dimension n2 must be positive integer",
+ GSL_EINVAL, 0);
+ }
+ else if (k1 + n1 > mm->size1)
+ {
+ GSL_ERROR_VAL ("submatrix dimension 1 exceeds size of original",
+ GSL_EINVAL, 0);
+ }
+ else if (k2 + n2 > mm->size2)
+ {
+ GSL_ERROR_VAL ("submatrix dimension 2 exceeds size of original",
+ GSL_EINVAL, 0);
+ }
+
+ m->data = mm->data + k1 * mm->tda + k2 ;
+ m->size1 = n1;
+ m->size2 = n2;
+ m->tda = mm->tda;
+ m->block = mm->block;
+ m->owner = 0;
+
+ return GSL_SUCCESS;
+}
+
+int
+FUNCTION (gsl_vector, view_row_from_matrix) (TYPE(gsl_vector) * v,
+ TYPE(gsl_matrix) * m,
+ const size_t i)
+{
+ const size_t column_length = m->size1;
+
+ if (i >= column_length)
+ {
+ GSL_ERROR ("row index is out of range", GSL_EINVAL);
+ }
+
+ if (v->block != 0)
+ {
+ GSL_ERROR ("vector already has memory allocated to it", GSL_ENOMEM);
+ }
+
+ v->data = m->data + MULTIPLICITY * i * m->tda ;
+ v->size = m->size2;
+ v->stride = 1;
+
+ return GSL_SUCCESS;
+}
+
+int
+FUNCTION (gsl_vector, view_col_from_matrix) (TYPE(gsl_vector) * v,
+ TYPE(gsl_matrix) * m,
+ const size_t j)
+{
+ const size_t row_length = m->size2;
+
+ if (j >= row_length)
+ {
+ GSL_ERROR_VAL ("column index is out of range", GSL_EINVAL, 0);
+ }
+
+ if (v->block != 0)
+ {
+ GSL_ERROR ("vector already has memory allocated to it", GSL_ENOMEM);
+ }
+
+ v->data = m->data + MULTIPLICITY * j ;
+ v->size = m->size1;
+ v->stride = m->tda;
+
+ return GSL_SUCCESS;
+}
+#endif /* JUNK */
+
diff --git a/gsl-1.9/mdate-sh b/gsl-1.9/mdate-sh
new file mode 100644
index 0000000..0845b8b
--- /dev/null
+++ b/gsl-1.9/mdate-sh
@@ -0,0 +1,91 @@
+#!/bin/sh
+# mdate-sh - get modification time of a file and pretty-print it
+# Copyright (C) 1995 Software Foundation, Inc.
+# Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, June 1995
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+# Prevent date giving response in another language.
+LANG=C
+export LANG
+LC_ALL=C
+export LC_ALL
+LC_TIME=C
+export LC_TIME
+
+# Get the extended ls output of the file.
+if ls -L /dev/null 1>/dev/null 2>&1; then
+ set - `ls -L -l $1`
+else
+ set - `ls -l $1`
+fi
+# The month is at least the fourth argument.
+# (3 shifts here, the next inside the loop)
+shift
+shift
+shift
+
+# Find the month. Next argument is day, followed by the year or time.
+month=
+until test $month
+do
+ shift
+ case $1 in
+ Jan) month=January; nummonth=1;;
+ Feb) month=February; nummonth=2;;
+ Mar) month=March; nummonth=3;;
+ Apr) month=April; nummonth=4;;
+ May) month=May; nummonth=5;;
+ Jun) month=June; nummonth=6;;
+ Jul) month=July; nummonth=7;;
+ Aug) month=August; nummonth=8;;
+ Sep) month=September; nummonth=9;;
+ Oct) month=October; nummonth=10;;
+ Nov) month=November; nummonth=11;;
+ Dec) month=December; nummonth=12;;
+ esac
+done
+
+day=$2
+
+# Here we have to deal with the problem that the ls output gives either
+# the time of day or the year.
+case $3 in
+ *:*) set `date`; eval year=\$$#
+ case $2 in
+ Jan) nummonthtod=1;;
+ Feb) nummonthtod=2;;
+ Mar) nummonthtod=3;;
+ Apr) nummonthtod=4;;
+ May) nummonthtod=5;;
+ Jun) nummonthtod=6;;
+ Jul) nummonthtod=7;;
+ Aug) nummonthtod=8;;
+ Sep) nummonthtod=9;;
+ Oct) nummonthtod=10;;
+ Nov) nummonthtod=11;;
+ Dec) nummonthtod=12;;
+ esac
+ # For the first six month of the year the time notation can also
+ # be used for files modified in the last year.
+ if (expr $nummonth \> $nummonthtod) > /dev/null;
+ then
+ year=`expr $year - 1`
+ fi;;
+ *) year=$3;;
+esac
+
+# The result.
+echo $day $month $year
diff --git a/gsl-1.9/min/ChangeLog b/gsl-1.9/min/ChangeLog
new file mode 100644
index 0000000..8fc94c7
--- /dev/null
+++ b/gsl-1.9/min/ChangeLog
@@ -0,0 +1,77 @@
+2005-09-09 Brian Gough <bjg@network-theory.co.uk>
+
+ * min.h: improved error message, function can be discontinuous
+ despite what error message said.
+
+2005-04-28 Brian Gough <bjg@network-theory.co.uk>
+
+ * brent.c (brent_iterate): fixed error in ordering of tests for
+ updates so that it agrees with Brent's book.
+
+2004-04-13 Brian Gough <bjg@network-theory.co.uk>
+
+ * brent.c (brent_iterate): corrected condition for setting to
+ +/-tolerance.
+
+Sun Apr 7 15:22:11 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * fsolver.c (gsl_min_fminimizer_x_minimum): new function,
+ obsoletes gsl_min_fminimizer_minimum.
+ (gsl_min_fminimizer_f_minimum): new function for accessing
+ function values
+ (gsl_min_fminimizer_f_lower): new function for accessing function
+ values
+ (gsl_min_fminimizer_f_upper): new function for accessing function
+ values
+
+ * renamed minimum to x_minimum throughout
+
+Wed Oct 3 11:35:45 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c (main): added an extra test
+
+Sun Jul 15 17:53:26 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * eliminated interval type, changed order of arguments to set
+ functions
+
+Tue Apr 17 22:13:58 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * fsolver.c (gsl_min_fminimizer_alloc): removed unnecessary status
+ variable
+
+Mon Apr 2 14:54:33 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * brent.c (brent_init): fixed incorrect value for golden ratio
+ (brent_iterate): fixed incorrect value for golden ratio
+
+ * golden.c (goldensection_iterate): fixed incorrect value for
+ golden ratio
+
+ * bracketing.c (gsl_min_find_bracket): fixed incorrect value for
+ golden ratio
+
+Sun Feb 18 11:43:04 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * fsolver.c: changed so that the solver _alloc function no longer
+ calls _set, the user must do that separately.
+
+Fri May 5 16:09:11 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c (test_bracket): fixed warning about "control reaches end
+ of non-void function" by changing return type to void
+
+Tue Feb 15 16:32:55 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * bracketing.c (gsl_min_find_bracket): changed counter nb_eval
+ from type int to type size_t in order to avoid comparison between
+ signed and unsigned, (nb_eval < eval_max).
+
+Mon Feb 14 13:07:43 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * made all internal functions static
+
+Wed Oct 13 16:08:03 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * rewritten to allow initial values to be specified
+
diff --git a/gsl-1.9/min/Makefile.am b/gsl-1.9/min/Makefile.am
new file mode 100644
index 0000000..37d8304
--- /dev/null
+++ b/gsl-1.9/min/Makefile.am
@@ -0,0 +1,16 @@
+noinst_LTLIBRARIES = libgslmin.la
+
+pkginclude_HEADERS = gsl_min.h
+
+noinst_HEADERS = min.h
+
+INCLUDES= -I$(top_builddir)
+
+libgslmin_la_SOURCES = fsolver.c golden.c brent.c convergence.c bracketing.c
+
+check_PROGRAMS = test
+
+TESTS = $(check_PROGRAMS)
+
+test_SOURCES = test.c test_funcs.c test.h
+test_LDADD = libgslmin.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../utils/libutils.la ../sys/libgslsys.la
diff --git a/gsl-1.9/min/Makefile.in b/gsl-1.9/min/Makefile.in
new file mode 100644
index 0000000..046e78d
--- /dev/null
+++ b/gsl-1.9/min/Makefile.in
@@ -0,0 +1,545 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = test$(EXEEXT)
+subdir = min
+DIST_COMMON = $(noinst_HEADERS) $(pkginclude_HEADERS) \
+ $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgslmin_la_LIBADD =
+am_libgslmin_la_OBJECTS = fsolver.lo golden.lo brent.lo convergence.lo \
+ bracketing.lo
+libgslmin_la_OBJECTS = $(am_libgslmin_la_OBJECTS)
+am_test_OBJECTS = test.$(OBJEXT) test_funcs.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = libgslmin.la ../ieee-utils/libgslieeeutils.la \
+ ../err/libgslerr.la ../test/libgsltest.la ../utils/libutils.la \
+ ../sys/libgslsys.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgslmin_la_SOURCES) $(test_SOURCES)
+DIST_SOURCES = $(libgslmin_la_SOURCES) $(test_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libgslmin.la
+pkginclude_HEADERS = gsl_min.h
+noinst_HEADERS = min.h
+INCLUDES = -I$(top_builddir)
+libgslmin_la_SOURCES = fsolver.c golden.c brent.c convergence.c bracketing.c
+TESTS = $(check_PROGRAMS)
+test_SOURCES = test.c test_funcs.c test.h
+test_LDADD = libgslmin.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../utils/libutils.la ../sys/libgslsys.la
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps min/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps min/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgslmin.la: $(libgslmin_la_OBJECTS) $(libgslmin_la_DEPENDENCIES)
+ $(LINK) $(libgslmin_la_LDFLAGS) $(libgslmin_la_OBJECTS) $(libgslmin_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkgincludeHEADERS
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/min/bracketing.c b/gsl-1.9/min/bracketing.c
new file mode 100644
index 0000000..f3ceaf4
--- /dev/null
+++ b/gsl-1.9/min/bracketing.c
@@ -0,0 +1,125 @@
+/* min/bracketing.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Fabrice Rossi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* bracketing.c -- find an initial bracketing interval for a function to minimize */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_min.h>
+#include <gsl/gsl_machine.h>
+
+#include "min.h"
+
+int
+gsl_min_find_bracket(gsl_function *f,double *x_minimum,double * f_minimum,
+ double * x_lower, double * f_lower,
+ double * x_upper, double * f_upper,
+ size_t eval_max)
+{
+ /* The three following variables must be declared volatile to avoid storage
+ in extended precision registers available on some architecture. The code
+ relies on the ability to compare double values. As the values will be
+ store in regular memory, the extended precision will then be lost and
+ values that are different in extended precision might have equal
+ representation in double precision. This behavior might break the
+ algorithm.
+ */
+ volatile double f_left = *f_lower;
+ volatile double f_right = *f_upper;
+ volatile double f_center;
+ double x_left = *x_lower;
+ double x_right= *x_upper;
+ double x_center;
+ const double golden = 0.3819660; /* golden = (3 - sqrt(5))/2 */
+ size_t nb_eval = 0;
+
+
+ if (f_right >= f_left)
+ {
+ x_center = (x_right - x_left) * golden + x_left;
+ nb_eval++;
+ SAFE_FUNC_CALL (f, x_center, &f_center);
+ }
+ else
+ {
+ x_center = x_right ;
+ f_center = f_right ;
+ x_right = (x_center - x_left) / golden + x_left;
+ nb_eval++;
+ SAFE_FUNC_CALL (f, x_right, &f_right);
+ }
+
+ do
+ {
+ if (f_center < f_left )
+ {
+ if (f_center < f_right)
+ {
+ *x_lower = x_left;
+ *x_upper = x_right;
+ *x_minimum = x_center;
+ *f_lower = f_left;
+ *f_upper = f_right;
+ *f_minimum = f_center;
+/* gsl_ieee_printf_double (&f_left);
+ printf(" ");
+ gsl_ieee_printf_double (&f_center);
+ printf("\n");*/
+ return GSL_SUCCESS;
+ }
+ else if (f_center > f_right)
+ {
+ x_left = x_center;
+ f_left = f_center;
+ x_center = x_right;
+ f_center = f_right;
+ x_right = (x_center - x_left) / golden + x_left;
+ nb_eval++;
+ SAFE_FUNC_CALL (f, x_right, &f_right);
+ }
+ else /* f_center == f_right */
+ {
+ x_right = x_center;
+ f_right = f_center;
+ x_center = (x_right - x_left) * golden + x_left;
+ nb_eval++;
+ SAFE_FUNC_CALL (f, x_center, &f_center);
+ }
+ }
+ else /* f_center >= f_left */
+ {
+ x_right = x_center;
+ f_right = f_center;
+ x_center = (x_right - x_left) * golden + x_left;
+ nb_eval++;
+ SAFE_FUNC_CALL (f, x_center, &f_center);
+ }
+ }
+ while (nb_eval < eval_max
+ && (x_right - x_left) > GSL_SQRT_DBL_EPSILON * ( (x_right + x_left) * 0.5 ) + GSL_SQRT_DBL_EPSILON);
+ *x_lower = x_left;
+ *x_upper = x_right;
+ *x_minimum = x_center;
+ *f_lower = f_left;
+ *f_upper = f_right;
+ *f_minimum = f_center;
+ return GSL_FAILURE;
+}
+
diff --git a/gsl-1.9/min/brent.c b/gsl-1.9/min/brent.c
new file mode 100644
index 0000000..499e015
--- /dev/null
+++ b/gsl-1.9/min/brent.c
@@ -0,0 +1,223 @@
+/* min/brent.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* brent.c -- brent minimum finding algorithm */
+
+#include <config.h>
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <float.h>
+
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_min.h>
+
+#include "min.h"
+
+typedef struct
+ {
+ double d, e, v, w;
+ double f_v, f_w;
+ }
+brent_state_t;
+
+static int brent_init (void *vstate, gsl_function * f, double x_minimum, double f_minimum, double x_lower, double f_lower, double x_upper, double f_upper);
+static int brent_iterate (void *vstate, gsl_function * f, double *x_minimum, double * f_minimum, double * x_lower, double * f_lower, double * x_upper, double * f_upper);
+
+static int
+brent_init (void *vstate, gsl_function * f, double x_minimum, double f_minimum, double x_lower, double f_lower, double x_upper, double f_upper)
+{
+ brent_state_t *state = (brent_state_t *) vstate;
+
+ const double golden = 0.3819660; /* golden = (3 - sqrt(5))/2 */
+
+ double v = x_lower + golden * (x_upper - x_lower);
+ double w = v;
+
+ double f_vw;
+
+ x_minimum = 0 ; /* avoid warnings about unused varibles */
+ f_minimum = 0 ;
+ f_lower = 0 ;
+ f_upper = 0 ;
+
+ state->v = v;
+ state->w = w;
+
+ state->d = 0;
+ state->e = 0;
+
+ SAFE_FUNC_CALL (f, v, &f_vw);
+
+ state->f_v = f_vw;
+ state->f_w = f_vw;
+
+ return GSL_SUCCESS;
+}
+
+static int
+brent_iterate (void *vstate, gsl_function * f, double *x_minimum, double * f_minimum, double * x_lower, double * f_lower, double * x_upper, double * f_upper)
+{
+ brent_state_t *state = (brent_state_t *) vstate;
+
+ const double x_left = *x_lower;
+ const double x_right = *x_upper;
+
+ const double z = *x_minimum;
+ double d = state->e;
+ double e = state->d;
+ double u, f_u;
+ const double v = state->v;
+ const double w = state->w;
+ const double f_v = state->f_v;
+ const double f_w = state->f_w;
+ const double f_z = *f_minimum;
+
+ const double golden = 0.3819660; /* golden = (3 - sqrt(5))/2 */
+
+ const double w_lower = (z - x_left);
+ const double w_upper = (x_right - z);
+
+ const double tolerance = GSL_SQRT_DBL_EPSILON * fabs (z);
+
+ double p = 0, q = 0, r = 0;
+
+ const double midpoint = 0.5 * (x_left + x_right);
+
+ if (fabs (e) > tolerance)
+ {
+ /* fit parabola */
+
+ r = (z - w) * (f_z - f_v);
+ q = (z - v) * (f_z - f_w);
+ p = (z - v) * q - (z - w) * r;
+ q = 2 * (q - r);
+
+ if (q > 0)
+ {
+ p = -p;
+ }
+ else
+ {
+ q = -q;
+ }
+
+ r = e;
+ e = d;
+ }
+
+ if (fabs (p) < fabs (0.5 * q * r) && p < q * w_lower && p < q * w_upper)
+ {
+ double t2 = 2 * tolerance ;
+
+ d = p / q;
+ u = z + d;
+
+ if ((u - x_left) < t2 || (x_right - u) < t2)
+ {
+ d = (z < midpoint) ? tolerance : -tolerance ;
+ }
+ }
+ else
+ {
+ e = (z < midpoint) ? x_right - z : -(z - x_left) ;
+ d = golden * e;
+ }
+
+
+ if (fabs (d) >= tolerance)
+ {
+ u = z + d;
+ }
+ else
+ {
+ u = z + ((d > 0) ? tolerance : -tolerance) ;
+ }
+
+ state->e = e;
+ state->d = d;
+
+ SAFE_FUNC_CALL(f, u, &f_u);
+
+ if (f_u <= f_z)
+ {
+ if (u < z)
+ {
+ *x_upper = z;
+ *f_upper = f_z;
+ }
+ else
+ {
+ *x_lower = z;
+ *f_lower = f_z;
+ }
+
+ state->v = w;
+ state->f_v = f_w;
+ state->w = z;
+ state->f_w = f_z;
+ *x_minimum = u;
+ *f_minimum = f_u;
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ if (u < z)
+ {
+ *x_lower = u;
+ *f_lower = f_u;
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ *x_upper = u;
+ *f_upper = f_u;
+ return GSL_SUCCESS;
+ }
+
+ if (f_u <= f_w || w == z)
+ {
+ state->v = w;
+ state->f_v = f_w;
+ state->w = u;
+ state->f_w = f_u;
+ return GSL_SUCCESS;
+ }
+ else if (f_u <= f_v || v == z || v == w)
+ {
+ state->v = u;
+ state->f_v = f_u;
+ return GSL_SUCCESS;
+ }
+ }
+
+ return GSL_FAILURE;
+}
+
+
+static const gsl_min_fminimizer_type brent_type =
+{"brent", /* name */
+ sizeof (brent_state_t),
+ &brent_init,
+ &brent_iterate};
+
+const gsl_min_fminimizer_type *gsl_min_fminimizer_brent = &brent_type;
diff --git a/gsl-1.9/min/convergence.c b/gsl-1.9/min/convergence.c
new file mode 100644
index 0000000..8bb630d
--- /dev/null
+++ b/gsl-1.9/min/convergence.c
@@ -0,0 +1,61 @@
+/* min/convergence.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_min.h>
+
+int
+gsl_min_test_interval (double x_lower, double x_upper, double epsabs, double epsrel)
+{
+ const double lower = x_lower;
+ const double upper = x_upper;
+
+ const double abs_lower = fabs(lower) ;
+ const double abs_upper = fabs(upper) ;
+
+ double min_abs, tolerance;
+
+ if (epsrel < 0.0)
+ GSL_ERROR ("relative tolerance is negative", GSL_EBADTOL);
+
+ if (epsabs < 0.0)
+ GSL_ERROR ("absolute tolerance is negative", GSL_EBADTOL);
+
+ if (lower > upper)
+ GSL_ERROR ("lower bound larger than upper_bound", GSL_EINVAL);
+
+ if ((lower > 0 && upper > 0) || (lower < 0 && upper < 0))
+ {
+ min_abs = GSL_MIN_DBL(abs_lower, abs_upper) ;
+ }
+ else
+ {
+ min_abs = 0;
+ }
+
+ tolerance = epsabs + epsrel * min_abs ;
+
+ if (fabs(upper - lower) < tolerance)
+ return GSL_SUCCESS;
+
+ return GSL_CONTINUE ;
+}
+
diff --git a/gsl-1.9/min/fsolver.c b/gsl-1.9/min/fsolver.c
new file mode 100644
index 0000000..36feb91
--- /dev/null
+++ b/gsl-1.9/min/fsolver.c
@@ -0,0 +1,200 @@
+/* min/fsolver.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_min.h>
+
+#include "min.h"
+
+static int
+compute_f_values (gsl_function * f, double x_minimum, double * f_minimum,
+ double x_lower, double * f_lower,
+ double x_upper, double * f_upper);
+
+
+static int
+compute_f_values (gsl_function * f, double x_minimum, double * f_minimum,
+ double x_lower, double * f_lower,
+ double x_upper, double * f_upper)
+{
+ SAFE_FUNC_CALL(f, x_lower, f_lower);
+ SAFE_FUNC_CALL(f, x_upper, f_upper);
+ SAFE_FUNC_CALL(f, x_minimum, f_minimum);
+
+ return GSL_SUCCESS;
+}
+
+int
+gsl_min_fminimizer_set (gsl_min_fminimizer * s,
+ gsl_function * f,
+ double x_minimum, double x_lower, double x_upper)
+{
+ int status ;
+
+ double f_minimum, f_lower, f_upper;
+
+ status = compute_f_values (f, x_minimum, &f_minimum,
+ x_lower, &f_lower,
+ x_upper, &f_upper);
+
+ if (status != GSL_SUCCESS)
+ {
+ return status ;
+ }
+
+ status = gsl_min_fminimizer_set_with_values (s, f, x_minimum, f_minimum,
+ x_lower, f_lower,
+ x_upper, f_upper);
+ return status;
+}
+
+gsl_min_fminimizer *
+gsl_min_fminimizer_alloc (const gsl_min_fminimizer_type * T)
+{
+ gsl_min_fminimizer * s =
+ (gsl_min_fminimizer *) malloc (sizeof (gsl_min_fminimizer));
+
+ if (s == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for minimizer struct",
+ GSL_ENOMEM, 0);
+ };
+
+ s->state = malloc (T->size);
+
+ if (s->state == 0)
+ {
+ free (s); /* exception in constructor, avoid memory leak */
+
+ GSL_ERROR_VAL ("failed to allocate space for minimizer state",
+ GSL_ENOMEM, 0);
+ };
+
+ s->type = T ;
+ s->function = NULL;
+
+ return s;
+}
+
+int
+gsl_min_fminimizer_set_with_values (gsl_min_fminimizer * s, gsl_function * f,
+ double x_minimum, double f_minimum,
+ double x_lower, double f_lower,
+ double x_upper, double f_upper)
+{
+ s->function = f;
+ s->x_minimum = x_minimum;
+ s->x_lower = x_lower;
+ s->x_upper = x_upper;
+
+ if (x_lower > x_upper)
+ {
+ GSL_ERROR ("invalid interval (lower > upper)", GSL_EINVAL);
+ }
+
+ if (x_minimum >= x_upper || x_minimum <= x_lower)
+ {
+ GSL_ERROR ("x_minimum must lie inside interval (lower < x < upper)",
+ GSL_EINVAL);
+ }
+
+ s->f_lower = f_lower;
+ s->f_upper = f_upper;
+ s->f_minimum = f_minimum;
+
+ if (f_minimum >= f_lower || f_minimum >= f_upper)
+ {
+ GSL_ERROR ("endpoints do not enclose a minimum", GSL_EINVAL);
+ }
+
+ return (s->type->set) (s->state, s->function,
+ x_minimum, f_minimum,
+ x_lower, f_lower,
+ x_upper, f_upper);
+}
+
+
+int
+gsl_min_fminimizer_iterate (gsl_min_fminimizer * s)
+{
+ return (s->type->iterate) (s->state, s->function,
+ &(s->x_minimum), &(s->f_minimum),
+ &(s->x_lower), &(s->f_lower),
+ &(s->x_upper), &(s->f_upper));
+}
+
+void
+gsl_min_fminimizer_free (gsl_min_fminimizer * s)
+{
+ free (s->state);
+ free (s);
+}
+
+const char *
+gsl_min_fminimizer_name (const gsl_min_fminimizer * s)
+{
+ return s->type->name;
+}
+
+/* Deprecated, use x_minimum instead */
+double
+gsl_min_fminimizer_minimum (const gsl_min_fminimizer * s)
+{
+ return s->x_minimum;
+}
+
+double
+gsl_min_fminimizer_x_minimum (const gsl_min_fminimizer * s)
+{
+ return s->x_minimum;
+}
+
+double
+gsl_min_fminimizer_x_lower (const gsl_min_fminimizer * s)
+{
+ return s->x_lower;
+}
+
+double
+gsl_min_fminimizer_x_upper (const gsl_min_fminimizer * s)
+{
+ return s->x_upper;
+}
+
+double
+gsl_min_fminimizer_f_minimum (const gsl_min_fminimizer * s)
+{
+ return s->f_minimum;
+}
+
+double
+gsl_min_fminimizer_f_lower (const gsl_min_fminimizer * s)
+{
+ return s->f_lower;
+}
+
+double
+gsl_min_fminimizer_f_upper (const gsl_min_fminimizer * s)
+{
+ return s->f_upper;
+}
+
diff --git a/gsl-1.9/min/golden.c b/gsl-1.9/min/golden.c
new file mode 100644
index 0000000..49dfddb
--- /dev/null
+++ b/gsl-1.9/min/golden.c
@@ -0,0 +1,120 @@
+/* min/golden.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+
+/* goldensection.c -- goldensection minimum finding algorithm */
+
+#include <config.h>
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <float.h>
+
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_min.h>
+
+#include "min.h"
+
+typedef struct
+ {
+ double dummy;
+ }
+goldensection_state_t;
+
+static int goldensection_init (void * vstate, gsl_function * f, double x_minimum, double f_minimum, double x_lower, double f_lower, double x_upper, double f_upper);
+static int goldensection_iterate (void * vstate, gsl_function * f, double * x_minimum, double * f_minimum, double * x_lower, double * f_lower, double * x_upper, double * f_upper);
+
+static int
+goldensection_init (void * vstate, gsl_function * f, double x_minimum, double f_minimum, double x_lower, double f_lower, double x_upper, double f_upper)
+{
+ goldensection_state_t * state = (goldensection_state_t *) vstate;
+
+ /* no initialization required, prevent warnings about unused variables */
+
+ state = 0;
+ f = 0;
+ x_minimum = 0;
+ f_minimum = 0;
+ x_lower = 0;
+ f_lower = 0;
+ x_upper = 0;
+ f_upper = 0;
+
+ return GSL_SUCCESS;
+}
+
+static int
+goldensection_iterate (void * vstate, gsl_function * f, double * x_minimum, double * f_minimum, double * x_lower, double * f_lower, double * x_upper, double * f_upper)
+{
+ goldensection_state_t * state = (goldensection_state_t *) vstate;
+
+ const double x_center = *x_minimum ;
+ const double x_left = *x_lower ;
+ const double x_right = *x_upper ;
+
+ const double f_min = *f_minimum;
+
+ const double golden = 0.3819660; /* golden = (3 - sqrt(5))/2 */
+
+ const double w_lower = (x_center - x_left);
+ const double w_upper = (x_right - x_center);
+
+ double x_new, f_new;
+
+ state = 0 ; /* avoid warning about unused parameters */
+
+ x_new = x_center + golden * ((w_upper > w_lower) ? w_upper : -w_lower) ;
+
+ SAFE_FUNC_CALL (f, x_new, &f_new);
+
+ if (f_new < f_min)
+ {
+ *x_minimum = x_new ;
+ *f_minimum = f_new ;
+ return GSL_SUCCESS;
+ }
+ else if (x_new < x_center && f_new > f_min)
+ {
+ *x_lower = x_new ;
+ *f_lower = f_new ;
+ return GSL_SUCCESS;
+ }
+ else if (x_new > x_center && f_new > f_min)
+ {
+ *x_upper = x_new ;
+ *f_upper = f_new ;
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ return GSL_FAILURE;
+ }
+}
+
+
+static const gsl_min_fminimizer_type goldensection_type =
+{"goldensection", /* name */
+ sizeof (goldensection_state_t),
+ &goldensection_init,
+ &goldensection_iterate};
+
+const gsl_min_fminimizer_type * gsl_min_fminimizer_goldensection = &goldensection_type;
diff --git a/gsl-1.9/min/gsl_min.h b/gsl-1.9/min/gsl_min.h
new file mode 100644
index 0000000..88fe640
--- /dev/null
+++ b/gsl-1.9/min/gsl_min.h
@@ -0,0 +1,110 @@
+/* min/gsl_min.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_MIN_H__
+#define __GSL_MIN_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_types.h>
+#include <gsl/gsl_math.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+typedef struct
+ {
+ const char *name;
+ size_t size;
+ int (*set) (void *state, gsl_function * f, double x_minimum, double f_minimum, double x_lower, double f_lower, double x_upper, double f_upper);
+ int (*iterate) (void *state, gsl_function * f, double * x_minimum, double * f_minimum, double * x_lower, double * f_lower, double * x_upper, double * f_upper);
+ }
+gsl_min_fminimizer_type;
+
+typedef struct
+ {
+ const gsl_min_fminimizer_type * type;
+ gsl_function * function ;
+ double x_minimum ;
+ double x_lower ;
+ double x_upper ;
+ double f_minimum, f_lower, f_upper;
+ void *state;
+ }
+gsl_min_fminimizer;
+
+gsl_min_fminimizer *
+gsl_min_fminimizer_alloc (const gsl_min_fminimizer_type * T) ;
+
+void gsl_min_fminimizer_free (gsl_min_fminimizer * s);
+
+int gsl_min_fminimizer_set (gsl_min_fminimizer * s,
+ gsl_function * f, double x_minimum,
+ double x_lower, double x_upper);
+
+int gsl_min_fminimizer_set_with_values (gsl_min_fminimizer * s,
+ gsl_function * f,
+ double x_minimum, double f_minimum,
+ double x_lower, double f_lower,
+ double x_upper, double f_upper);
+
+int gsl_min_fminimizer_iterate (gsl_min_fminimizer * s);
+
+const char * gsl_min_fminimizer_name (const gsl_min_fminimizer * s);
+
+double gsl_min_fminimizer_x_minimum (const gsl_min_fminimizer * s);
+double gsl_min_fminimizer_x_lower (const gsl_min_fminimizer * s);
+double gsl_min_fminimizer_x_upper (const gsl_min_fminimizer * s);
+double gsl_min_fminimizer_f_minimum (const gsl_min_fminimizer * s);
+double gsl_min_fminimizer_f_lower (const gsl_min_fminimizer * s);
+double gsl_min_fminimizer_f_upper (const gsl_min_fminimizer * s);
+
+/* Deprecated, use x_minimum instead */
+double gsl_min_fminimizer_minimum (const gsl_min_fminimizer * s);
+
+int
+gsl_min_test_interval (double x_lower, double x_upper, double epsabs, double epsrel);
+
+GSL_VAR const gsl_min_fminimizer_type * gsl_min_fminimizer_goldensection;
+GSL_VAR const gsl_min_fminimizer_type * gsl_min_fminimizer_brent;
+
+typedef
+int (*gsl_min_bracketing_function)(gsl_function *f,
+ double *x_minimum,double * f_minimum,
+ double *x_lower, double * f_lower,
+ double *x_upper, double * f_upper,
+ size_t eval_max);
+
+int
+gsl_min_find_bracket(gsl_function *f,double *x_minimum,double * f_minimum,
+ double *x_lower, double * f_lower,
+ double *x_upper, double * f_upper,
+ size_t eval_max);
+
+__END_DECLS
+
+#endif /* __GSL_MIN_H__ */
diff --git a/gsl-1.9/min/min.h b/gsl-1.9/min/min.h
new file mode 100644
index 0000000..e2dd45f
--- /dev/null
+++ b/gsl-1.9/min/min.h
@@ -0,0 +1,25 @@
+/* min/min.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#define SAFE_FUNC_CALL(f, x, yp) \
+do { \
+ *yp = GSL_FN_EVAL(f,x); \
+ if (!finite(*yp)) \
+ GSL_ERROR("computed function value is infinite or NaN", GSL_EBADFUNC); \
+} while (0)
diff --git a/gsl-1.9/min/test.c b/gsl-1.9/min/test.c
new file mode 100644
index 0000000..4493a0e
--- /dev/null
+++ b/gsl-1.9/min/test.c
@@ -0,0 +1,215 @@
+/* min/test.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_min.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+
+#include "test.h"
+#include "min.h"
+
+/* stopping parameters */
+
+const double EPSABS = 0.001 ;
+const double EPSREL = 0.001 ;
+
+const unsigned int MAX_ITERATIONS = 100;
+
+void my_error_handler (const char *reason, const char *file,
+ int line, int err);
+
+#define WITHIN_TOL(a, b, epsrel, epsabs) \
+ (fabs((a) - (b)) < (epsrel) * GSL_MIN(fabs(a), fabs(b)) + (epsabs))
+
+int
+main (void)
+{
+ gsl_function F_cos, F_func1, F_func2, F_func3, F_func4;
+
+ const gsl_min_fminimizer_type * fminimizer[4] ;
+ const gsl_min_fminimizer_type ** T;
+
+ gsl_ieee_env_setup ();
+
+ fminimizer[0] = gsl_min_fminimizer_goldensection;
+ fminimizer[1] = gsl_min_fminimizer_brent;
+ fminimizer[2] = 0;
+
+ F_cos = create_function (f_cos) ;
+ F_func1 = create_function (func1) ;
+ F_func2 = create_function (func2) ;
+ F_func3 = create_function (func3) ;
+ F_func4 = create_function (func4) ;
+
+ gsl_set_error_handler (&my_error_handler);
+
+ for (T = fminimizer ; *T != 0 ; T++)
+ {
+ test_f (*T, "cos(x) [0 (3) 6]", &F_cos, 0.0, 3.0, 6.0, M_PI);
+ test_f (*T, "x^4 - 1 [-3 (-1) 17]", &F_func1, -3.0, -1.0, 17.0, 0.0);
+ test_f (*T, "sqrt(|x|) [-2 (-1) 1.5]", &F_func2, -2.0, -1.0, 1.5, 0.0);
+ test_f (*T, "func3(x) [-2 (3) 4]", &F_func3, -2.0, 3.0, 4.0, 1.0);
+ test_f (*T, "func4(x) [0 (0.782) 1]", &F_func4, 0, 0.782, 1.0, 0.8);
+
+ test_f_e (*T, "invalid range check [4, 0]", &F_cos, 4.0, 3.0, 0.0, M_PI);
+ test_f_e (*T, "invalid range check [1, 1]", &F_cos, 1.0, 1.0, 1.0, M_PI);
+ test_f_e (*T, "invalid range check [-1, 1]", &F_cos, -1.0, 0.0, 1.0, M_PI);
+ }
+ test_bracket("cos(x) [1,2]",&F_cos,1.0,2.0,15);
+ test_bracket("sqrt(|x|) [-1,0]",&F_func2,-1.0,0.0,15);
+ test_bracket("sqrt(|x|) [-1,-0.6]",&F_func2,-1.0,-0.6,15);
+ test_bracket("sqrt(|x|) [-1,1]",&F_func2,-1.0,1.0,15);
+
+ exit (gsl_test_summary ());
+}
+
+void
+test_f (const gsl_min_fminimizer_type * T,
+ const char * description, gsl_function *f,
+ double lower_bound, double middle, double upper_bound,
+ double correct_minimum)
+{
+ int status;
+ size_t iterations = 0;
+ double m, a, b;
+ double x_lower, x_upper;
+ gsl_min_fminimizer * s;
+
+ x_lower = lower_bound;
+ x_upper = upper_bound;
+
+ s = gsl_min_fminimizer_alloc (T) ;
+ gsl_min_fminimizer_set (s, f, middle, x_lower, x_upper) ;
+
+ do
+ {
+ iterations++ ;
+
+ status = gsl_min_fminimizer_iterate (s);
+
+ m = gsl_min_fminimizer_x_minimum(s);
+ a = gsl_min_fminimizer_x_lower(s);
+ b = gsl_min_fminimizer_x_upper(s);
+
+#ifdef DEBUG
+ printf("%.12f %.18f %.12f %.18f %.12f %.18f\n",
+ a, GSL_FN_EVAL(f, a), m, GSL_FN_EVAL(f, m), b, GSL_FN_EVAL(f, b));
+#endif
+
+ if (a > b)
+ gsl_test (GSL_FAILURE, "interval is invalid (%g,%g)", a, b);
+
+ if (m < a || m > b)
+ gsl_test (GSL_FAILURE, "m lies outside interval %g (%g,%g)", m, a, b);
+
+ if (status) break ;
+
+ status = gsl_min_test_interval (a, b, EPSABS, EPSREL);
+ }
+ while (status == GSL_CONTINUE && iterations < MAX_ITERATIONS);
+
+ gsl_test (status, "%s, %s (%g obs vs %g expected) ",
+ gsl_min_fminimizer_name(s), description,
+ gsl_min_fminimizer_x_minimum(s), correct_minimum);
+
+ /* check the validity of the returned result */
+
+ if (!WITHIN_TOL (m, correct_minimum, EPSREL, EPSABS))
+ {
+ gsl_test (GSL_FAILURE, "incorrect precision (%g obs vs %g expected)",
+ m, correct_minimum);
+ }
+
+ gsl_min_fminimizer_free (s);
+
+}
+
+void
+test_f_e (const gsl_min_fminimizer_type * T,
+ const char * description, gsl_function *f,
+ double lower_bound, double middle, double upper_bound,
+ double correct_minimum)
+{
+ int status;
+ size_t iterations = 0;
+ double x_lower, x_upper;
+ double a, b;
+ gsl_min_fminimizer * s;
+
+ x_lower = lower_bound;
+ x_upper = upper_bound;
+
+ s = gsl_min_fminimizer_alloc (T) ;
+ status = gsl_min_fminimizer_set (s, f, middle, x_lower, x_upper) ;
+
+ if (status != GSL_SUCCESS)
+ {
+ gsl_min_fminimizer_free (s) ;
+ gsl_test (status == GSL_SUCCESS, "%s, %s", T->name, description);
+ return ;
+ }
+
+ do
+ {
+ iterations++ ;
+ gsl_min_fminimizer_iterate (s);
+ a = gsl_min_fminimizer_x_lower(s);
+ b = gsl_min_fminimizer_x_upper(s);
+
+ status = gsl_min_test_interval (a, b, EPSABS, EPSREL);
+ }
+ while (status == GSL_CONTINUE && iterations < MAX_ITERATIONS);
+
+ gsl_test (!status, "%s, %s", gsl_min_fminimizer_name(s), description,
+ gsl_min_fminimizer_x_minimum(s) - correct_minimum);
+
+ gsl_min_fminimizer_free (s);
+}
+
+void
+my_error_handler (const char *reason, const char *file, int line, int err)
+{
+ if (0)
+ printf ("(caught [%s:%d: %s (%d)])\n", file, line, reason, err);
+}
+
+int
+test_bracket (const char * description,gsl_function *f,double lower_bound,
+ double upper_bound, unsigned int max)
+{
+ int status;
+ double x_lower, x_upper;
+ double f_upper,f_lower,f_minimum;
+ double x_minimum;
+
+ x_lower=lower_bound;
+ x_upper=upper_bound;
+ SAFE_FUNC_CALL (f,x_lower,&f_lower);
+ SAFE_FUNC_CALL (f,x_upper,&f_upper);
+ status=gsl_min_find_bracket(f,&x_minimum,&f_minimum,&x_lower,&f_lower,&x_upper,&f_upper,max);
+ gsl_test (status,"%s, interval: [%g,%g], values: (%g,%g), minimum at: %g, value: %g",
+ description,x_lower,x_upper,f_lower,f_upper,x_minimum,f_minimum);
+ return status;
+}
+
+
+
diff --git a/gsl-1.9/min/test.h b/gsl-1.9/min/test.h
new file mode 100644
index 0000000..24fa8c5
--- /dev/null
+++ b/gsl-1.9/min/test.h
@@ -0,0 +1,42 @@
+/* min/test.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+gsl_function create_function (double (*f)(double, void *));
+
+void
+test_f_e (const gsl_min_fminimizer_type * T,
+ const char * description, gsl_function *f,
+ double lower_bound, double minimum, double upper_bound,
+ double correct_minimum);
+
+void
+test_f (const gsl_min_fminimizer_type * T,
+ const char * description, gsl_function *f,
+ double lower_bound, double middle, double upper_bound,
+ double correct_minimum);
+
+int
+test_bracket (const char * description,gsl_function *f,double lower_bound,
+ double upper_bound, unsigned int max);
+
+double f_cos (double x, void * p);
+double func1 (double x, void * p);
+double func2 (double x, void * p);
+double func3 (double x, void * p);
+double func4 (double x, void * p);
diff --git a/gsl-1.9/min/test_funcs.c b/gsl-1.9/min/test_funcs.c
new file mode 100644
index 0000000..9d45be2
--- /dev/null
+++ b/gsl-1.9/min/test_funcs.c
@@ -0,0 +1,85 @@
+/* min/test_funcs.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_min.h>
+
+#include "test.h"
+
+gsl_function create_function (double (*f)(double, void *))
+{
+ gsl_function F ;
+ F.function = f ;
+ F.params = 0 ;
+ return F ;
+}
+
+double
+f_cos (double x, void * p)
+{
+ p = 0; /* avoid warning about unused parameter */
+ return cos(x);
+}
+
+/* f(x) = x^4 - 1 */
+/* minimum at x = 0 */
+
+double
+func1 (double x, void * p)
+{
+ p = 0; /* avoid warning about unused parameter */
+ return pow (x, 4.0) - 1;
+}
+
+/* f(x) = sqrt(|x|) */
+/* minimum at x = 0 */
+
+double
+func2 (double x, void * p)
+{
+ p = 0; /* avoid warning about unused parameter */
+ return sqrt(fabs(x));
+}
+
+
+/* f(x) = 1 for x < 1 and -exp(-x) for x >= 1 */
+/* minimum at x = 1 */
+
+double
+func3 (double x, void * p)
+{
+ p = 0; /* avoid warning about unused parameter */
+
+ if (x < 1)
+ return 1 ;
+ else
+ return - exp(-x) ;
+}
+
+/* f(x) = x - 30/(1+1e5*(x-0.8)**2) */
+/* minimum near x = 0.8 */
+
+double
+func4 (double x, void * p)
+{
+ p = 0; /* avoid warning about unused parameter */
+
+ return x - 30.0 / (1.0 + 1e5 * pow(x-0.8, 2.0));
+}
+
diff --git a/gsl-1.9/missing b/gsl-1.9/missing
new file mode 100755
index 0000000..6a37006
--- /dev/null
+++ b/gsl-1.9/missing
@@ -0,0 +1,336 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+# Copyright (C) 1996, 1997, 1999, 2000, 2002 Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+ echo 1>&2 "Try \`$0 --help' for more information"
+ exit 1
+fi
+
+run=:
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+ configure_ac=configure.ac
+else
+ configure_ac=configure.in
+fi
+
+case "$1" in
+--run)
+ # Try to run requested program, and just exit if it succeeds.
+ run=
+ shift
+ "$@" && exit 0
+ ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case "$1" in
+
+ -h|--h|--he|--hel|--help)
+ echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+ -h, --help display this help and exit
+ -v, --version output version information and exit
+ --run try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+ aclocal touch file \`aclocal.m4'
+ autoconf touch file \`configure'
+ autoheader touch file \`config.h.in'
+ automake touch all \`Makefile.in' files
+ bison create \`y.tab.[ch]', if possible, from existing .[ch]
+ flex create \`lex.yy.c', if possible, from existing .c
+ help2man touch the output file
+ lex create \`lex.yy.c', if possible, from existing .c
+ makeinfo touch the output file
+ tar try tar, gnutar, gtar, then tar without non-portable flags
+ yacc create \`y.tab.[ch]', if possible, from existing .[ch]"
+ ;;
+
+ -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+ echo "missing 0.4 - GNU automake"
+ ;;
+
+ -*)
+ echo 1>&2 "$0: Unknown \`$1' option"
+ echo 1>&2 "Try \`$0 --help' for more information"
+ exit 1
+ ;;
+
+ aclocal*)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ fi
+
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified \`acinclude.m4' or \`${configure_ac}'. You might want
+ to install the \`Automake' and \`Perl' packages. Grab them from
+ any GNU archive site."
+ touch aclocal.m4
+ ;;
+
+ autoconf)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ fi
+
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified \`${configure_ac}'. You might want to install the
+ \`Autoconf' and \`GNU m4' packages. Grab them from any GNU
+ archive site."
+ touch configure
+ ;;
+
+ autoheader)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ fi
+
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified \`acconfig.h' or \`${configure_ac}'. You might want
+ to install the \`Autoconf' and \`GNU m4' packages. Grab them
+ from any GNU archive site."
+ files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+ test -z "$files" && files="config.h"
+ touch_files=
+ for f in $files; do
+ case "$f" in
+ *:*) touch_files="$touch_files "`echo "$f" |
+ sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+ *) touch_files="$touch_files $f.in";;
+ esac
+ done
+ touch $touch_files
+ ;;
+
+ automake*)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ fi
+
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+ You might want to install the \`Automake' and \`Perl' packages.
+ Grab them from any GNU archive site."
+ find . -type f -name Makefile.am -print |
+ sed 's/\.am$/.in/' |
+ while read f; do touch "$f"; done
+ ;;
+
+ autom4te)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ fi
+
+ echo 1>&2 "\
+WARNING: \`$1' is needed, and you do not seem to have it handy on your
+ system. You might have modified some files without having the
+ proper tools for further handling them.
+ You can get \`$1Help2man' as part of \`Autoconf' from any GNU
+ archive site."
+
+ file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'`
+ test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'`
+ if test -f "$file"; then
+ touch $file
+ else
+ test -z "$file" || exec >$file
+ echo "#! /bin/sh"
+ echo "# Created by GNU Automake missing as a replacement of"
+ echo "# $ $@"
+ echo "exit 0"
+ chmod +x $file
+ exit 1
+ fi
+ ;;
+
+ bison|yacc)
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified a \`.y' file. You may need the \`Bison' package
+ in order for those modifications to take effect. You can get
+ \`Bison' from any GNU archive site."
+ rm -f y.tab.c y.tab.h
+ if [ $# -ne 1 ]; then
+ eval LASTARG="\${$#}"
+ case "$LASTARG" in
+ *.y)
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" y.tab.c
+ fi
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" y.tab.h
+ fi
+ ;;
+ esac
+ fi
+ if [ ! -f y.tab.h ]; then
+ echo >y.tab.h
+ fi
+ if [ ! -f y.tab.c ]; then
+ echo 'main() { return 0; }' >y.tab.c
+ fi
+ ;;
+
+ lex|flex)
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified a \`.l' file. You may need the \`Flex' package
+ in order for those modifications to take effect. You can get
+ \`Flex' from any GNU archive site."
+ rm -f lex.yy.c
+ if [ $# -ne 1 ]; then
+ eval LASTARG="\${$#}"
+ case "$LASTARG" in
+ *.l)
+ SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" lex.yy.c
+ fi
+ ;;
+ esac
+ fi
+ if [ ! -f lex.yy.c ]; then
+ echo 'main() { return 0; }' >lex.yy.c
+ fi
+ ;;
+
+ help2man)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ fi
+
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified a dependency of a manual page. You may need the
+ \`Help2man' package in order for those modifications to take
+ effect. You can get \`Help2man' from any GNU archive site."
+
+ file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+ if test -z "$file"; then
+ file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'`
+ fi
+ if [ -f "$file" ]; then
+ touch $file
+ else
+ test -z "$file" || exec >$file
+ echo ".ab help2man is required to generate this page"
+ exit 1
+ fi
+ ;;
+
+ makeinfo)
+ if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then
+ # We have makeinfo, but it failed.
+ exit 1
+ fi
+
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified a \`.texi' or \`.texinfo' file, or any other file
+ indirectly affecting the aspect of the manual. The spurious
+ call might also be the consequence of using a buggy \`make' (AIX,
+ DU, IRIX). You might want to install the \`Texinfo' package or
+ the \`GNU make' package. Grab either from any GNU archive site."
+ file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+ if test -z "$file"; then
+ file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+ file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file`
+ fi
+ touch $file
+ ;;
+
+ tar)
+ shift
+ if test -n "$run"; then
+ echo 1>&2 "ERROR: \`tar' requires --run"
+ exit 1
+ fi
+
+ # We have already tried tar in the generic part.
+ # Look for gnutar/gtar before invocation to avoid ugly error
+ # messages.
+ if (gnutar --version > /dev/null 2>&1); then
+ gnutar "$@" && exit 0
+ fi
+ if (gtar --version > /dev/null 2>&1); then
+ gtar "$@" && exit 0
+ fi
+ firstarg="$1"
+ if shift; then
+ case "$firstarg" in
+ *o*)
+ firstarg=`echo "$firstarg" | sed s/o//`
+ tar "$firstarg" "$@" && exit 0
+ ;;
+ esac
+ case "$firstarg" in
+ *h*)
+ firstarg=`echo "$firstarg" | sed s/h//`
+ tar "$firstarg" "$@" && exit 0
+ ;;
+ esac
+ fi
+
+ echo 1>&2 "\
+WARNING: I can't seem to be able to run \`tar' with the given arguments.
+ You may want to install GNU tar or Free paxutils, or check the
+ command line arguments."
+ exit 1
+ ;;
+
+ *)
+ echo 1>&2 "\
+WARNING: \`$1' is needed, and you do not seem to have it handy on your
+ system. You might have modified some files without having the
+ proper tools for further handling them. Check the \`README' file,
+ it often tells you about the needed prerequirements for installing
+ this package. You may also peek at any GNU archive site, in case
+ some other package would contain this missing \`$1' program."
+ exit 1
+ ;;
+esac
+
+exit 0
diff --git a/gsl-1.9/mkinstalldirs b/gsl-1.9/mkinstalldirs
new file mode 100755
index 0000000..cc8783e
--- /dev/null
+++ b/gsl-1.9/mkinstalldirs
@@ -0,0 +1,36 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Last modified: 1994-03-25
+# Public domain
+
+errstatus=0
+
+for file in ${1+"$@"} ; do
+ set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+ shift
+
+ pathcomp=
+ for d in ${1+"$@"} ; do
+ pathcomp="$pathcomp$d"
+ case "$pathcomp" in
+ -* ) pathcomp=./$pathcomp ;;
+ esac
+
+ if test ! -d "$pathcomp"; then
+ echo "mkdir $pathcomp" 1>&2
+ mkdir "$pathcomp" > /dev/null 2>&1 || lasterr=$?
+ fi
+
+ if test ! -d "$pathcomp"; then
+ errstatus=$lasterr
+ fi
+
+ pathcomp="$pathcomp/"
+ done
+done
+
+exit $errstatus
+
+# mkinstalldirs ends here
diff --git a/gsl-1.9/monte/ChangeLog b/gsl-1.9/monte/ChangeLog
new file mode 100644
index 0000000..2ae49d2
--- /dev/null
+++ b/gsl-1.9/monte/ChangeLog
@@ -0,0 +1,166 @@
+2004-06-02 Brian Gough <bjg@network-theory.co.uk>
+
+ * test_main.c: handle the case where sd==0 && error[i] !=0 more
+ carefully
+
+Mon Apr 23 13:23:47 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * test_main.c: removed unused status variable
+
+Sat Jan 6 19:56:49 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * miser.c (gsl_monte_miser_free): fixed memory leak for s->hits_{r,l}
+
+ * vegas.c (gsl_monte_vegas_free): fixed memory leak for s->x
+
+Fri Dec 22 21:43:04 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * miser.c: removed max-min estimation method for subvolumes. We
+ will use the standard variance method and try to use a sufficient
+ number of points to estimate the variance reliably.
+
+Wed Dec 20 21:32:40 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * vegas.c: tidied up the algorithm, deal with cases of sigma = 0
+ explicitly.
+
+Sat Dec 9 14:19:53 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * reorganization and clean up
+
+Thu Nov 16 19:50:27 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * miser.c: rewrite to fix overflows and make calling conventions
+ consistent
+
+ * plain.c: rewrite to fix overflows and make calling conventions
+ consistent
+
+Thu Oct 26 20:06:36 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * plain.c (gsl_monte_plain_integrate): integer factor
+ calls*(calls-1) used in numerical expression can easily overflow,
+ changed to calls*(calls-1.0).
+
+Sat Oct 21 20:36:06 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * miser.c (gsl_monte_miser_integrate): fixed bug where hits_l was
+ used in place of hits_r
+
+Tue Sep 19 19:16:37 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * plain.c (gsl_monte_plain_alloc): initialise check_done to avoid
+ warning about use of unitialised memory
+
+ * vegas.c (gsl_monte_vegas_alloc): as above
+
+ * miser.c (gsl_monte_miser_alloc): as above
+
+ * plain.c miser.c: removed use of sprintf for error messages
+
+Wed May 31 19:50:19 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * miser_test.c (main): increased tolerances to allow tests to pass
+ with different compilers
+
+Mon May 15 15:26:22 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * vegas_test.c (main): added gsl_ieee_env_setup() to allow change
+ of precision in tests
+
+ * miser_test.c (main): ditto
+
+ * plain_test.c (main): ditto
+
+Fri Feb 26 14:49:56 1999 Brian Gough <bjg@netsci.freeserve.co.uk>
+
+ * Makefile.am: removed ..._LDFLAGS = -static since this is
+ specific to gcc
+
+
+
+Wed Nov 18 10:59:56 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * use standard headers templates_on.h and templates_off.h instead
+ of source.h
+
+Tue Nov 17 16:49:12 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * added #include <config.h> to all top-level source files
+
+ * plain.c (gsl_monte_plain_integrate): replaced myMAX by GSL_MAX
+
+ * utils.c: move macros around to avoid double definition
+
+Fri Aug 14 10:12:06 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * Makefile.am: I needed to add utils.h to libgslmonte_a_SOURCES to
+ get it to work with my automake
+
+Thu Jul 30 17:31:29 1998 booth <booth@planck.pha.jhu.edu>
+
+ * gsl_monte_miser.h, miser.c:
+ Turn off the annoying warning in miser unless the user requests it.
+
+Wed Jul 29 20:24:54 1998 bjg <bjg@vvv.lanl.gov>
+
+ * Makefile.am, Makefile.in: some fixes to pass make distcheck
+
+ * Makefile.am, Makefile.in:
+ experimenting with new top level makefile.am
+
+Tue Jul 28 17:05:20 1998 booth <booth@planck.pha.jhu.edu>
+
+ * plain.c, vegas.c, miser.c:
+ make all the _free functions check their argument. Also, the init functions
+ now throw EFAULT if given a null pointer.
+
+ * gsl_monte_vegas.h, vegas.c:
+ vegas1, vegas2 and vegas3 all go away. Get them by setting the "stage"
+ variabe appropriately. Also, make _free check its argument.
+
+ * vegas.c, gsl_monte_vegas.h: minor cleanup prior to be change.
+
+ * vegas.c: minor changes, commiting by accident.
+
+Mon Jul 27 22:52:49 1998 bjg <bjg@vvv.lanl.gov>
+
+ * Makefile.in, Makefile.am:
+ fixed some of the include requirements for make dist
+
+Mon Jul 27 15:19:54 1998 booth <booth@planck.pha.jhu.edu>
+
+ * vegas_print.h, vegas_test.c, miser_test.c, vegas-print.c, vegas.c, Attic/gsl_vegas.h, Attic/gsl_vegas_print.h, gsl_monte_vegas.h, miser.c, Attic/gsl_miser.h, Makefile.am, Makefile.in, gsl_monte_miser.h:
+ Renamed public header files to follow convention correctly.
+
+ * vegas.c, vegas_test.c, miser.c, miser_test.c, plain.c, plain_test.c, Attic/gsl_miser.h, Attic/gsl_vegas.h, gsl_monte_plain.h:
+ All the integration functions now end with _integrate (except for
+ vegas1, vegas2 and vegas3 which are going away RSN).
+
+Tue Jul 21 21:54:33 1998 booth <booth@planck.pha.jhu.edu>
+
+ * vegas.c, vegas-print.c, Attic/gsl_vegas_print.h, Attic/gsl_vegas.h:
+ trivial stuff: eliminate compiler warnings, eliminate some unneeded variables,
+ change some types to make consistent with plain and miser.
+
+ * gsl_monte_plain.h, plain.c, plain_test.c:
+ Make "plain" conform to same style as miser and vegas.
+
+Fri Jul 17 02:23:40 1998 jungman <jungman@nnn.lanl.gov>
+
+ * Makefile.in: we're gonna make it...
+
+Thu Jul 16 16:23:45 1998 booth <booth@planck.pha.jhu.edu>
+
+ * vegas-print.c, vegas.c, Attic/gsl_vegas_print.h:
+ Have now completely eliminated all static variables.
+
+ * vegas_test.c, vegas.c, Attic/gsl_vegas.h, Attic/gsl_vegas_print.h, vegas-print.c:
+ Continuing to remove all static variables from vegas.
+
+Wed Jul 15 19:10:24 1998 booth <booth@planck.pha.jhu.edu>
+
+ * vegas.c, vegas_test.c, Attic/gsl_vegas.h:
+ Do the state-structure thing for vegas. Not finished, so far the only
+ real content is the rng structure.
+
diff --git a/gsl-1.9/monte/Makefile.am b/gsl-1.9/monte/Makefile.am
new file mode 100644
index 0000000..fec4ff4
--- /dev/null
+++ b/gsl-1.9/monte/Makefile.am
@@ -0,0 +1,21 @@
+noinst_LTLIBRARIES = libgslmonte.la
+
+libgslmonte_la_SOURCES = miser.c plain.c gsl_monte_vegas.h gsl_monte_miser.h gsl_monte_plain.h gsl_monte.h vegas.c
+
+pkginclude_HEADERS = gsl_monte.h gsl_monte_vegas.h gsl_monte_miser.h gsl_monte_plain.h
+
+INCLUDES= -I$(top_builddir) -I$(top_srcdir)
+
+TESTS = $(check_PROGRAMS)
+
+check_PROGRAMS = test #demo
+
+test_SOURCES = test.c
+test_LDADD = libgslmonte.la ../rng/libgslrng.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+
+noinst_HEADERS = test_main.c
+
+#demo_SOURCES= demo.c
+#demo_LDADD = libgslmonte.la ../rng/libgslrng.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../utils/libutils.la
+
+
diff --git a/gsl-1.9/monte/Makefile.in b/gsl-1.9/monte/Makefile.in
new file mode 100644
index 0000000..acbd39e
--- /dev/null
+++ b/gsl-1.9/monte/Makefile.in
@@ -0,0 +1,547 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = test$(EXEEXT)
+subdir = monte
+DIST_COMMON = README $(noinst_HEADERS) $(pkginclude_HEADERS) \
+ $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog TODO
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgslmonte_la_LIBADD =
+am_libgslmonte_la_OBJECTS = miser.lo plain.lo vegas.lo
+libgslmonte_la_OBJECTS = $(am_libgslmonte_la_OBJECTS)
+am_test_OBJECTS = test.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = libgslmonte.la ../rng/libgslrng.la \
+ ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la \
+ ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgslmonte_la_SOURCES) $(test_SOURCES)
+DIST_SOURCES = $(libgslmonte_la_SOURCES) $(test_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libgslmonte.la
+libgslmonte_la_SOURCES = miser.c plain.c gsl_monte_vegas.h gsl_monte_miser.h gsl_monte_plain.h gsl_monte.h vegas.c
+pkginclude_HEADERS = gsl_monte.h gsl_monte_vegas.h gsl_monte_miser.h gsl_monte_plain.h
+INCLUDES = -I$(top_builddir) -I$(top_srcdir)
+TESTS = $(check_PROGRAMS)
+test_SOURCES = test.c
+test_LDADD = libgslmonte.la ../rng/libgslrng.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+noinst_HEADERS = test_main.c
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps monte/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps monte/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgslmonte.la: $(libgslmonte_la_OBJECTS) $(libgslmonte_la_DEPENDENCIES)
+ $(LINK) $(libgslmonte_la_LDFLAGS) $(libgslmonte_la_OBJECTS) $(libgslmonte_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkgincludeHEADERS
+
+
+#demo_SOURCES= demo.c
+#demo_LDADD = libgslmonte.la ../rng/libgslrng.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../utils/libutils.la
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/monte/README b/gsl-1.9/monte/README
new file mode 100644
index 0000000..9658d7b
--- /dev/null
+++ b/gsl-1.9/monte/README
@@ -0,0 +1,37 @@
+G. P. Lepage, "VEGAS..." J. Comp. Phys. 27, 192(1978).
+W.H. Press, G.R. Farrar, "Miser..." Computers in Physics, v4 (1990), pp190-195
+
+References from PVEGAS by Richard Kreckel
+
+[1]: G.P. Lepage: A New Algorithm for Adaptive Multidimensional
+ Integration; Journal of Computational Physics 27,
+ 192-203, (1978)
+
+[2]: W. Press, S. Teukolsky, W. Vetterling, B. Flannery: Numerical
+ Recipes in C, (second edition) Cambridge University Press,
+ 1992.
+
+[3]: R.C. Tausworthe: Random numbers generated by linear
+ recurrence modulo two, Math. Comput. 19, 201-209, (1965)
+
+[4]: I. Deak: Uniform random number generators for parallel
+ computers; Parallel Computing, 15, 155-164, (1990)
+
+[5]: R. Kreckel: Parallelization of adaptive MC integrators,
+ MZ-TH/97-30, physics/9710028; Comp. Phys. Comm., 106, 258-266,
+ (1997) (A preliminary version of this article can be retrieved
+ via anonymous ftp from ftpthep.physik.uni-mainz.de in the directory
+ /pub/pvegas/.)
+
+[6]: S. Veseli: Multidimensional integration in a heterogeneous
+ network environment; FERMILAB-PUB-97/271-T; physics/9710017
+
+[7]: R. Kreckel: Addendum: Parallelization of adaptive MC integrators,
+ (Available via anonymous ftp from ftpthep.physik.uni-mainz.de in
+ the directory /pub/pvegas/.)
+
+[8]: MPI-Forum: MPI: A Message-Passing Interface Standard, University
+ of Tennessee, Knoxville, Tennessee, (1995)
+
+[9]: T. Ohl: Vegas Revisited: Adaptive Monte Carlo Integration Beyond
+ Factorization; hep-ph/9806432
diff --git a/gsl-1.9/monte/TODO b/gsl-1.9/monte/TODO
new file mode 100644
index 0000000..29d2eb4
--- /dev/null
+++ b/gsl-1.9/monte/TODO
@@ -0,0 +1,25 @@
+* Add Lattice Method and Quasi-random Method to monte carlo integration
+
+* Fix the "No-points in left/right half space" error in miser. Random
+errors like that are discouraged in a library. The routine should
+iterate over the dimensions choosing a point on each side of the
+bisection to ensure that the error does not occur.
+
+* VEGAS could estimate its roundoff error, caused by dividing up into
+many boxes and then summing (I know this is ridiculous for any
+realistic case, but it shows up on the tests when integrating a
+constant!). In particular, there are some failures reported for the
+VEGAS constant tests on Windows.
+
+* VEGAS gives a negative chisq for some cases where there are wildly
+inconsistent values. Calculation should be improved so that chisq>=0.
+
+Also, when there are inconsistent values it might make sense to scale
+the error by chisq, as is often done experimentally -- at least that
+way the error would be increased.
+
+* The original VEGAS allowed to user to calculate other weighted
+quantities. The appropriate way to implement it in GSL would be to
+provide a separate routine which returns sample points and weights so
+that the user can caculate any quantity.
+
diff --git a/gsl-1.9/monte/gsl_monte.h b/gsl-1.9/monte/gsl_monte.h
new file mode 100644
index 0000000..dd9c9d8
--- /dev/null
+++ b/gsl-1.9/monte/gsl_monte.h
@@ -0,0 +1,55 @@
+/* monte/gsl_monte.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Michael Booth
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Some things common to all the Monte-Carlo implementations */
+/* Author: MJB */
+
+#ifndef __GSL_MONTE_H__
+#define __GSL_MONTE_H__
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+/* Hide the function type in a typedef so that we can use it in all our
+ integration functions, and make it easy to change things.
+*/
+
+struct gsl_monte_function_struct {
+ double (*f)(double * x_array, size_t dim, void * params);
+ size_t dim;
+ void * params;
+};
+
+typedef struct gsl_monte_function_struct gsl_monte_function;
+
+#define GSL_MONTE_FN_EVAL(F,x) (*((F)->f))(x,(F)->dim,(F)->params)
+
+
+__END_DECLS
+
+#endif /* __GSL_MONTE_H__ */
diff --git a/gsl-1.9/monte/gsl_monte_miser.h b/gsl-1.9/monte/gsl_monte_miser.h
new file mode 100644
index 0000000..d08cb8c
--- /dev/null
+++ b/gsl-1.9/monte/gsl_monte_miser.h
@@ -0,0 +1,83 @@
+/* monte/gsl_monte_miser.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Michael Booth
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: MJB */
+
+#ifndef __GSL_MONTE_MISER_H__
+#define __GSL_MONTE_MISER_H__
+
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_monte.h>
+#include <gsl/gsl_monte_plain.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+typedef struct {
+ size_t min_calls;
+ size_t min_calls_per_bisection;
+ double dither;
+ double estimate_frac;
+ double alpha;
+ size_t dim;
+ int estimate_style;
+ int depth;
+ int verbose;
+ double * x;
+ double * xmid;
+ double * sigma_l;
+ double * sigma_r;
+ double * fmax_l;
+ double * fmax_r;
+ double * fmin_l;
+ double * fmin_r;
+ double * fsum_l;
+ double * fsum_r;
+ double * fsum2_l;
+ double * fsum2_r;
+ size_t * hits_l;
+ size_t * hits_r;
+} gsl_monte_miser_state;
+
+int gsl_monte_miser_integrate(gsl_monte_function * f,
+ const double xl[], const double xh[],
+ size_t dim, size_t calls,
+ gsl_rng *r,
+ gsl_monte_miser_state* state,
+ double *result, double *abserr);
+
+gsl_monte_miser_state* gsl_monte_miser_alloc(size_t dim);
+
+int gsl_monte_miser_init(gsl_monte_miser_state* state);
+
+void gsl_monte_miser_free(gsl_monte_miser_state* state);
+
+
+__END_DECLS
+
+#endif /* __GSL_MONTE_MISER_H__ */
diff --git a/gsl-1.9/monte/gsl_monte_plain.h b/gsl-1.9/monte/gsl_monte_plain.h
new file mode 100644
index 0000000..c3d2b28
--- /dev/null
+++ b/gsl-1.9/monte/gsl_monte_plain.h
@@ -0,0 +1,65 @@
+/* monte/gsl_monte_plain.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Michael Booth
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Plain Monte-Carlo. */
+
+/* Author: MJB */
+
+#ifndef __GSL_MONTE_PLAIN_H__
+#define __GSL_MONTE_PLAIN_H__
+
+#include <stdio.h>
+#include <gsl/gsl_monte.h>
+#include <gsl/gsl_rng.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+typedef struct {
+ size_t dim;
+ double *x;
+} gsl_monte_plain_state;
+
+int
+gsl_monte_plain_integrate (const gsl_monte_function * f,
+ const double xl[], const double xu[],
+ const size_t dim,
+ const size_t calls,
+ gsl_rng * r,
+ gsl_monte_plain_state * state,
+ double *result, double *abserr);
+
+gsl_monte_plain_state* gsl_monte_plain_alloc(size_t dim);
+
+int gsl_monte_plain_init(gsl_monte_plain_state* state);
+
+void gsl_monte_plain_free (gsl_monte_plain_state* state);
+
+__END_DECLS
+
+#endif /* __GSL_MONTE_PLAIN_H__ */
diff --git a/gsl-1.9/monte/gsl_monte_vegas.h b/gsl-1.9/monte/gsl_monte_vegas.h
new file mode 100644
index 0000000..b328307
--- /dev/null
+++ b/gsl-1.9/monte/gsl_monte_vegas.h
@@ -0,0 +1,105 @@
+/* monte/gsl_monte_vegas.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Michael Booth
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* header for the gsl "vegas" routines. Mike Booth, May 1998 */
+
+#ifndef __GSL_MONTE_VEGAS_H__
+#define __GSL_MONTE_VEGAS_H__
+
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_monte.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+enum {GSL_VEGAS_MODE_IMPORTANCE = 1,
+ GSL_VEGAS_MODE_IMPORTANCE_ONLY = 0,
+ GSL_VEGAS_MODE_STRATIFIED = -1};
+
+typedef struct {
+ /* grid */
+ size_t dim;
+ size_t bins_max;
+ unsigned int bins;
+ unsigned int boxes; /* these are both counted along the axes */
+ double * xi;
+ double * xin;
+ double * delx;
+ double * weight;
+ double vol;
+
+ double * x;
+ int * bin;
+ int * box;
+
+ /* distribution */
+ double * d;
+
+ /* control variables */
+ double alpha;
+ int mode;
+ int verbose;
+ unsigned int iterations;
+ int stage;
+
+ /* scratch variables preserved between calls to vegas1/2/3 */
+ double jac;
+ double wtd_int_sum;
+ double sum_wgts;
+ double chi_sum;
+ double chisq;
+
+ double result;
+ double sigma;
+
+ unsigned int it_start;
+ unsigned int it_num;
+ unsigned int samples;
+ unsigned int calls_per_box;
+
+ FILE * ostream;
+
+} gsl_monte_vegas_state;
+
+int gsl_monte_vegas_integrate(gsl_monte_function * f,
+ double xl[], double xu[],
+ size_t dim, size_t calls,
+ gsl_rng * r,
+ gsl_monte_vegas_state *state,
+ double* result, double* abserr);
+
+gsl_monte_vegas_state* gsl_monte_vegas_alloc(size_t dim);
+
+int gsl_monte_vegas_init(gsl_monte_vegas_state* state);
+
+void gsl_monte_vegas_free (gsl_monte_vegas_state* state);
+
+__END_DECLS
+
+#endif /* __GSL_MONTE_VEGAS_H__ */
+
diff --git a/gsl-1.9/monte/miser.c b/gsl-1.9/monte/miser.c
new file mode 100644
index 0000000..92e9215
--- /dev/null
+++ b/gsl-1.9/monte/miser.c
@@ -0,0 +1,681 @@
+/* monte/miser.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Michael Booth
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* MISER. Based on the algorithm described in the following article,
+
+ W.H. Press, G.R. Farrar, "Recursive Stratified Sampling for
+ Multidimensional Monte Carlo Integration", Computers in Physics,
+ v4 (1990), pp190-195.
+
+*/
+
+/* Author: MJB */
+/* Modified by Brian Gough 12/2000 */
+
+#include <config.h>
+#include <math.h>
+#include <stdlib.h>
+
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_monte.h>
+#include <gsl/gsl_monte_miser.h>
+
+static int
+estimate_corrmc (gsl_monte_function * f,
+ const double xl[], const double xu[],
+ size_t dim, size_t calls,
+ gsl_rng * r,
+ gsl_monte_miser_state * state,
+ double *result, double *abserr,
+ const double xmid[], double sigma_l[], double sigma_r[]);
+
+
+int
+gsl_monte_miser_integrate (gsl_monte_function * f,
+ const double xl[], const double xu[],
+ size_t dim, size_t calls,
+ gsl_rng * r,
+ gsl_monte_miser_state * state,
+ double *result, double *abserr)
+{
+ size_t n, estimate_calls, calls_l, calls_r;
+ const size_t min_calls = state->min_calls;
+ size_t i;
+ size_t i_bisect;
+ int found_best;
+
+ double res_est = 0, err_est = 0;
+ double res_r = 0, err_r = 0, res_l = 0, err_l = 0;
+ double xbi_l, xbi_m, xbi_r, s;
+
+ double vol;
+ double weight_l, weight_r;
+
+ double *x = state->x;
+ double *xmid = state->xmid;
+ double *sigma_l = state->sigma_l, *sigma_r = state->sigma_r;
+
+ if (dim != state->dim)
+ {
+ GSL_ERROR ("number of dimensions must match allocated size", GSL_EINVAL);
+ }
+
+ for (i = 0; i < dim; i++)
+ {
+ if (xu[i] <= xl[i])
+ {
+ GSL_ERROR ("xu must be greater than xl", GSL_EINVAL);
+ }
+
+ if (xu[i] - xl[i] > GSL_DBL_MAX)
+ {
+ GSL_ERROR ("Range of integration is too large, please rescale",
+ GSL_EINVAL);
+ }
+ }
+
+ if (state->alpha < 0)
+ {
+ GSL_ERROR ("alpha must be non-negative", GSL_EINVAL);
+ }
+
+ /* Compute volume */
+
+ vol = 1;
+
+ for (i = 0; i < dim; i++)
+ {
+ vol *= xu[i] - xl[i];
+ }
+
+ if (calls < state->min_calls_per_bisection)
+ {
+ double m = 0.0, q = 0.0;
+
+ if (calls < 2)
+ {
+ GSL_ERROR ("insufficient calls for subvolume", GSL_EFAILED);
+ }
+
+ for (n = 0; n < calls; n++)
+ {
+ /* Choose a random point in the integration region */
+
+ for (i = 0; i < dim; i++)
+ {
+ x[i] = xl[i] + gsl_rng_uniform_pos (r) * (xu[i] - xl[i]);
+ }
+
+ {
+ double fval = GSL_MONTE_FN_EVAL (f, x);
+
+ /* recurrence for mean and variance */
+
+ double d = fval - m;
+ m += d / (n + 1.0);
+ q += d * d * (n / (n + 1.0));
+ }
+ }
+
+ *result = vol * m;
+
+ *abserr = vol * sqrt (q / (calls * (calls - 1.0)));
+
+ return GSL_SUCCESS;
+ }
+
+ estimate_calls = GSL_MAX (min_calls, calls * (state->estimate_frac));
+
+ if (estimate_calls < 4 * dim)
+ {
+ GSL_ERROR ("insufficient calls to sample all halfspaces", GSL_ESANITY);
+ }
+
+ /* Flip coins to bisect the integration region with some fuzz */
+
+ for (i = 0; i < dim; i++)
+ {
+ s = (gsl_rng_uniform (r) - 0.5) >= 0.0 ? state->dither : -state->dither;
+ state->xmid[i] = (0.5 + s) * xl[i] + (0.5 - s) * xu[i];
+ }
+
+ /* The idea is to chose the direction to bisect based on which will
+ give the smallest total variance. We could (and may do so later)
+ use MC to compute these variances. But the NR guys simply estimate
+ the variances by finding the min and max function values
+ for each half-region for each bisection. */
+
+ estimate_corrmc (f, xl, xu, dim, estimate_calls,
+ r, state, &res_est, &err_est, xmid, sigma_l, sigma_r);
+
+ /* We have now used up some calls for the estimation */
+
+ calls -= estimate_calls;
+
+ /* Now find direction with the smallest total "variance" */
+
+ {
+ double best_var = GSL_DBL_MAX;
+ double beta = 2.0 / (1.0 + state->alpha);
+ found_best = 0;
+ i_bisect = 0;
+ weight_l = weight_r = 1.0;
+
+ for (i = 0; i < dim; i++)
+ {
+ if (sigma_l[i] >= 0 && sigma_r[i] >= 0)
+ {
+ /* estimates are okay */
+ double var = pow (sigma_l[i], beta) + pow (sigma_r[i], beta);
+
+ if (var <= best_var)
+ {
+ found_best = 1;
+ best_var = var;
+ i_bisect = i;
+ weight_l = pow (sigma_l[i], beta);
+ weight_r = pow (sigma_r[i], beta);
+ }
+ }
+ else
+ {
+ if (sigma_l[i] < 0)
+ {
+ GSL_ERROR ("no points in left-half space!", GSL_ESANITY);
+ }
+ if (sigma_r[i] < 0)
+ {
+ GSL_ERROR ("no points in right-half space!", GSL_ESANITY);
+ }
+ }
+ }
+ }
+
+ if (!found_best)
+ {
+ /* All estimates were the same, so chose a direction at random */
+
+ i_bisect = gsl_rng_uniform_int (r, dim);
+ }
+
+ xbi_l = xl[i_bisect];
+ xbi_m = xmid[i_bisect];
+ xbi_r = xu[i_bisect];
+
+ /* Get the actual fractional sizes of the two "halves", and
+ distribute the remaining calls among them */
+
+ {
+ double fraction_l = fabs ((xbi_m - xbi_l) / (xbi_r - xbi_l));
+ double fraction_r = 1 - fraction_l;
+
+ double a = fraction_l * weight_l;
+ double b = fraction_r * weight_r;
+
+ calls_l = min_calls + (calls - 2 * min_calls) * a / (a + b);
+ calls_r = min_calls + (calls - 2 * min_calls) * b / (a + b);
+ }
+
+ /* Compute the integral for the left hand side of the bisection */
+
+ /* Due to the recursive nature of the algorithm we must allocate
+ some new memory for each recursive call */
+
+ {
+ int status;
+
+ double *xu_tmp = (double *) malloc (dim * sizeof (double));
+
+ if (xu_tmp == 0)
+ {
+ GSL_ERROR_VAL ("out of memory for left workspace", GSL_ENOMEM, 0);
+ }
+
+ for (i = 0; i < dim; i++)
+ {
+ xu_tmp[i] = xu[i];
+ }
+
+ xu_tmp[i_bisect] = xbi_m;
+
+ status = gsl_monte_miser_integrate (f, xl, xu_tmp,
+ dim, calls_l, r, state,
+ &res_l, &err_l);
+ free (xu_tmp);
+
+ if (status != GSL_SUCCESS)
+ {
+ return status;
+ }
+ }
+
+ /* Compute the integral for the right hand side of the bisection */
+
+ {
+ int status;
+
+ double *xl_tmp = (double *) malloc (dim * sizeof (double));
+
+ if (xl_tmp == 0)
+ {
+ GSL_ERROR_VAL ("out of memory for right workspace", GSL_ENOMEM, 0);
+ }
+
+ for (i = 0; i < dim; i++)
+ {
+ xl_tmp[i] = xl[i];
+ }
+
+ xl_tmp[i_bisect] = xbi_m;
+
+ status = gsl_monte_miser_integrate (f, xl_tmp, xu,
+ dim, calls_r, r, state,
+ &res_r, &err_r);
+ free (xl_tmp);
+
+ if (status != GSL_SUCCESS)
+ {
+ return status;
+ }
+ }
+
+ *result = res_l + res_r;
+ *abserr = sqrt (err_l * err_l + err_r * err_r);
+
+ return GSL_SUCCESS;
+}
+
+gsl_monte_miser_state *
+gsl_monte_miser_alloc (size_t dim)
+{
+ gsl_monte_miser_state *s =
+ (gsl_monte_miser_state *) malloc (sizeof (gsl_monte_miser_state));
+
+ if (s == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for miser state struct",
+ GSL_ENOMEM, 0);
+ }
+
+ s->x = (double *) malloc (dim * sizeof (double));
+
+ if (s->x == 0)
+ {
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for x", GSL_ENOMEM, 0);
+ }
+
+ s->xmid = (double *) malloc (dim * sizeof (double));
+
+ if (s->xmid == 0)
+ {
+ free (s->x);
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for xmid", GSL_ENOMEM, 0);
+ }
+
+ s->sigma_l = (double *) malloc (dim * sizeof (double));
+
+ if (s->sigma_l == 0)
+ {
+ free (s->xmid);
+ free (s->x);
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for sigma_l", GSL_ENOMEM, 0);
+ }
+
+ s->sigma_r = (double *) malloc (dim * sizeof (double));
+
+ if (s->sigma_r == 0)
+ {
+ free (s->sigma_l);
+ free (s->xmid);
+ free (s->x);
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for sigma_r", GSL_ENOMEM, 0);
+ }
+
+ s->fmax_l = (double *) malloc (dim * sizeof (double));
+
+ if (s->fmax_l == 0)
+ {
+ free (s->sigma_r);
+ free (s->sigma_l);
+ free (s->xmid);
+ free (s->x);
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for fmax_l", GSL_ENOMEM, 0);
+ }
+
+ s->fmax_r = (double *) malloc (dim * sizeof (double));
+
+ if (s->fmax_r == 0)
+ {
+ free (s->fmax_l);
+ free (s->sigma_r);
+ free (s->sigma_l);
+ free (s->xmid);
+ free (s->x);
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for fmax_r", GSL_ENOMEM, 0);
+ }
+
+ s->fmin_l = (double *) malloc (dim * sizeof (double));
+
+ if (s->fmin_l == 0)
+ {
+ free (s->fmax_r);
+ free (s->fmax_l);
+ free (s->sigma_r);
+ free (s->sigma_l);
+ free (s->xmid);
+ free (s->x);
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for fmin_l", GSL_ENOMEM, 0);
+ }
+
+ s->fmin_r = (double *) malloc (dim * sizeof (double));
+
+ if (s->fmin_r == 0)
+ {
+ free (s->fmin_l);
+ free (s->fmax_r);
+ free (s->fmax_l);
+ free (s->sigma_r);
+ free (s->sigma_l);
+ free (s->xmid);
+ free (s->x);
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for fmin_r", GSL_ENOMEM, 0);
+ }
+
+ s->fsum_l = (double *) malloc (dim * sizeof (double));
+
+ if (s->fsum_l == 0)
+ {
+ free (s->fmin_r);
+ free (s->fmin_l);
+ free (s->fmax_r);
+ free (s->fmax_l);
+ free (s->sigma_r);
+ free (s->sigma_l);
+ free (s->xmid);
+ free (s->x);
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for fsum_l", GSL_ENOMEM, 0);
+ }
+
+ s->fsum_r = (double *) malloc (dim * sizeof (double));
+
+ if (s->fsum_r == 0)
+ {
+ free (s->fsum_l);
+ free (s->fmin_r);
+ free (s->fmin_l);
+ free (s->fmax_r);
+ free (s->fmax_l);
+ free (s->sigma_r);
+ free (s->sigma_l);
+ free (s->xmid);
+ free (s->x);
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for fsum_r", GSL_ENOMEM, 0);
+ }
+
+ s->fsum2_l = (double *) malloc (dim * sizeof (double));
+
+ if (s->fsum2_l == 0)
+ {
+ free (s->fsum_r);
+ free (s->fsum_l);
+ free (s->fmin_r);
+ free (s->fmin_l);
+ free (s->fmax_r);
+ free (s->fmax_l);
+ free (s->sigma_r);
+ free (s->sigma_l);
+ free (s->xmid);
+ free (s->x);
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for fsum2_l", GSL_ENOMEM, 0);
+ }
+
+ s->fsum2_r = (double *) malloc (dim * sizeof (double));
+
+ if (s->fsum2_r == 0)
+ {
+ free (s->fsum2_l);
+ free (s->fsum_r);
+ free (s->fsum_l);
+ free (s->fmin_r);
+ free (s->fmin_l);
+ free (s->fmax_r);
+ free (s->fmax_l);
+ free (s->sigma_r);
+ free (s->sigma_l);
+ free (s->xmid);
+ free (s->x);
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for fsum2_r", GSL_ENOMEM, 0);
+ }
+
+
+ s->hits_r = (size_t *) malloc (dim * sizeof (size_t));
+
+ if (s->hits_r == 0)
+ {
+ free (s->fsum2_r);
+ free (s->fsum2_l);
+ free (s->fsum_r);
+ free (s->fsum_l);
+ free (s->fmin_r);
+ free (s->fmin_l);
+ free (s->fmax_r);
+ free (s->fmax_l);
+ free (s->sigma_r);
+ free (s->sigma_l);
+ free (s->xmid);
+ free (s->x);
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for fsum2_r", GSL_ENOMEM, 0);
+ }
+
+ s->hits_l = (size_t *) malloc (dim * sizeof (size_t));
+
+ if (s->hits_l == 0)
+ {
+ free (s->hits_r);
+ free (s->fsum2_r);
+ free (s->fsum2_l);
+ free (s->fsum_r);
+ free (s->fsum_l);
+ free (s->fmin_r);
+ free (s->fmin_l);
+ free (s->fmax_r);
+ free (s->fmax_l);
+ free (s->sigma_r);
+ free (s->sigma_l);
+ free (s->xmid);
+ free (s->x);
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for fsum2_r", GSL_ENOMEM, 0);
+ }
+
+ s->dim = dim;
+
+ gsl_monte_miser_init (s);
+
+ return s;
+}
+
+int
+gsl_monte_miser_init (gsl_monte_miser_state * s)
+{
+ /* We use 8 points in each halfspace to estimate the variance. There are
+ 2*dim halfspaces. A variance estimate requires a minimum of 2 points. */
+ s->min_calls = 16 * s->dim;
+ s->min_calls_per_bisection = 32 * s->min_calls;
+ s->estimate_frac = 0.1;
+ s->alpha = 2.0;
+ s->dither = 0.0;
+
+ return GSL_SUCCESS;
+}
+
+void
+gsl_monte_miser_free (gsl_monte_miser_state * s)
+{
+ free (s->hits_r);
+ free (s->hits_l);
+ free (s->fsum2_r);
+ free (s->fsum2_l);
+ free (s->fsum_r);
+ free (s->fsum_l);
+ free (s->fmin_r);
+ free (s->fmin_l);
+ free (s->fmax_r);
+ free (s->fmax_l);
+ free (s->sigma_r);
+ free (s->sigma_l);
+ free (s->xmid);
+ free (s->x);
+ free (s);
+}
+
+static int
+estimate_corrmc (gsl_monte_function * f,
+ const double xl[], const double xu[],
+ size_t dim, size_t calls,
+ gsl_rng * r,
+ gsl_monte_miser_state * state,
+ double *result, double *abserr,
+ const double xmid[], double sigma_l[], double sigma_r[])
+{
+ size_t i, n;
+
+ double *x = state->x;
+ double *fsum_l = state->fsum_l;
+ double *fsum_r = state->fsum_r;
+ double *fsum2_l = state->fsum2_l;
+ double *fsum2_r = state->fsum2_r;
+ size_t *hits_l = state->hits_l;
+ size_t *hits_r = state->hits_r;
+
+ double m = 0.0, q = 0.0;
+ double vol = 1.0;
+
+ for (i = 0; i < dim; i++)
+ {
+ vol *= xu[i] - xl[i];
+ hits_l[i] = hits_r[i] = 0;
+ fsum_l[i] = fsum_r[i] = 0.0;
+ fsum2_l[i] = fsum2_r[i] = 0.0;
+ sigma_l[i] = sigma_r[i] = -1;
+ }
+
+ for (n = 0; n < calls; n++)
+ {
+ double fval;
+
+ unsigned int j = (n/2) % dim;
+ unsigned int side = (n % 2);
+
+ for (i = 0; i < dim; i++)
+ {
+ double z = gsl_rng_uniform_pos (r) ;
+
+ if (i != j)
+ {
+ x[i] = xl[i] + z * (xu[i] - xl[i]);
+ }
+ else
+ {
+ if (side == 0)
+ {
+ x[i] = xmid[i] + z * (xu[i] - xmid[i]);
+ }
+ else
+ {
+ x[i] = xl[i] + z * (xmid[i] - xl[i]);
+ }
+ }
+ }
+
+ fval = GSL_MONTE_FN_EVAL (f, x);
+
+ /* recurrence for mean and variance */
+ {
+ double d = fval - m;
+ m += d / (n + 1.0);
+ q += d * d * (n / (n + 1.0));
+ }
+
+ /* compute the variances on each side of the bisection */
+ for (i = 0; i < dim; i++)
+ {
+ if (x[i] <= xmid[i])
+ {
+ fsum_l[i] += fval;
+ fsum2_l[i] += fval * fval;
+ hits_l[i]++;
+ }
+ else
+ {
+ fsum_r[i] += fval;
+ fsum2_r[i] += fval * fval;
+ hits_r[i]++;
+ }
+ }
+ }
+
+ for (i = 0; i < dim; i++)
+ {
+ double fraction_l = (xmid[i] - xl[i]) / (xu[i] - xl[i]);
+
+ if (hits_l[i] > 0)
+ {
+ fsum_l[i] /= hits_l[i];
+ sigma_l[i] = sqrt (fsum2_l[i] - fsum_l[i] * fsum_l[i] / hits_l[i]);
+ sigma_l[i] *= fraction_l * vol / hits_l[i];
+ }
+
+ if (hits_r[i] > 0)
+ {
+ fsum_r[i] /= hits_r[i];
+ sigma_r[i] = sqrt (fsum2_r[i] - fsum_r[i] * fsum_r[i] / hits_r[i]);
+ sigma_r[i] *= (1 - fraction_l) * vol / hits_r[i];
+ }
+ }
+
+ *result = vol * m;
+
+ if (calls < 2)
+ {
+ *abserr = GSL_POSINF;
+ }
+ else
+ {
+ *abserr = vol * sqrt (q / (calls * (calls - 1.0)));
+ }
+
+ return GSL_SUCCESS;
+}
+
diff --git a/gsl-1.9/monte/plain.c b/gsl-1.9/monte/plain.c
new file mode 100644
index 0000000..cab3ae2
--- /dev/null
+++ b/gsl-1.9/monte/plain.c
@@ -0,0 +1,151 @@
+/* monte/plain.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Michael Booth
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Plain Monte-Carlo. */
+
+/* Author: MJB */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_monte_plain.h>
+
+int
+gsl_monte_plain_integrate (const gsl_monte_function * f,
+ const double xl[], const double xu[],
+ const size_t dim,
+ const size_t calls,
+ gsl_rng * r,
+ gsl_monte_plain_state * state,
+ double *result, double *abserr)
+{
+ double vol, m = 0, q = 0;
+ double *x = state->x;
+ size_t n, i;
+
+ if (dim != state->dim)
+ {
+ GSL_ERROR ("number of dimensions must match allocated size", GSL_EINVAL);
+ }
+
+ for (i = 0; i < dim; i++)
+ {
+ if (xu[i] <= xl[i])
+ {
+ GSL_ERROR ("xu must be greater than xl", GSL_EINVAL);
+ }
+
+ if (xu[i] - xl[i] > GSL_DBL_MAX)
+ {
+ GSL_ERROR ("Range of integration is too large, please rescale",
+ GSL_EINVAL);
+ }
+ }
+
+ /* Compute the volume of the region */
+
+ vol = 1;
+
+ for (i = 0; i < dim; i++)
+ {
+ vol *= xu[i] - xl[i];
+ }
+
+ for (n = 0; n < calls; n++)
+ {
+ /* Choose a random point in the integration region */
+
+ for (i = 0; i < dim; i++)
+ {
+ x[i] = xl[i] + gsl_rng_uniform_pos (r) * (xu[i] - xl[i]);
+ }
+
+ {
+ double fval = GSL_MONTE_FN_EVAL (f, x);
+
+ /* recurrence for mean and variance */
+
+ double d = fval - m;
+ m += d / (n + 1.0);
+ q += d * d * (n / (n + 1.0));
+ }
+ }
+
+ *result = vol * m;
+
+ if (calls < 2)
+ {
+ *abserr = GSL_POSINF;
+ }
+ else
+ {
+ *abserr = vol * sqrt (q / (calls * (calls - 1.0)));
+ }
+
+ return GSL_SUCCESS;
+}
+
+gsl_monte_plain_state *
+gsl_monte_plain_alloc (size_t dim)
+{
+ gsl_monte_plain_state *s =
+ (gsl_monte_plain_state *) malloc (sizeof (gsl_monte_plain_state));
+
+ if (s == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for state struct",
+ GSL_ENOMEM, 0);
+ }
+
+ s->x = (double *) malloc (dim * sizeof (double));
+
+ if (s->x == 0)
+ {
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for working vector",
+ GSL_ENOMEM, 0);
+ }
+
+ s->dim = dim;
+
+ return s;
+}
+
+/* Set some default values and whatever */
+
+int
+gsl_monte_plain_init (gsl_monte_plain_state * s)
+{
+ size_t i;
+
+ for (i = 0; i < s->dim; i++)
+ {
+ s->x[i] = 0.0;
+ }
+
+ return GSL_SUCCESS;
+}
+
+void
+gsl_monte_plain_free (gsl_monte_plain_state * s)
+{
+ free (s->x);
+ free (s);
+}
diff --git a/gsl-1.9/monte/test.c b/gsl-1.9/monte/test.c
new file mode 100644
index 0000000..7eb0a7a
--- /dev/null
+++ b/gsl-1.9/monte/test.c
@@ -0,0 +1,373 @@
+/* monte/test.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Michael Booth
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <math.h>
+#include <stdio.h>
+
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_monte_plain.h>
+#include <gsl/gsl_monte_miser.h>
+#include <gsl/gsl_monte_vegas.h>
+
+#define CONSTANT
+#define PRODUCT
+#define GAUSSIAN
+#define DBLGAUSSIAN
+#define TSUDA
+
+#define PLAIN
+#define MISER
+#define VEGAS
+
+double xl[11] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+double xu[11] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
+double xu2[11] = { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 };
+double xu3[2] = { GSL_DBL_MAX, GSL_DBL_MAX };
+
+double fconst (double x[], size_t d, void *params);
+double f0 (double x[], size_t d, void *params);
+double f1 (double x[], size_t d, void *params);
+double f2 (double x[], size_t d, void *params);
+double f3 (double x[], size_t d, void *params);
+
+void my_error_handler (const char *reason, const char *file,
+ int line, int err);
+
+struct problem {
+ gsl_monte_function * f;
+ double * xl;
+ double * xu;
+ size_t dim;
+ size_t calls;
+ double expected_result;
+ double expected_error;
+ char * description;
+} ;
+
+gsl_monte_function
+make_function (double (*f)(double *, size_t, void *), size_t d, void * p);
+
+gsl_monte_function
+make_function (double (*f)(double *, size_t, void *), size_t d, void * p)
+{
+ gsl_monte_function f_new;
+
+ f_new.f = f;
+ f_new.dim = d;
+ f_new.params = p;
+
+ return f_new;
+}
+
+
+void
+add (struct problem * problems, int * n,
+ gsl_monte_function * f, double xl[], double xu[], size_t dim, size_t calls,
+ double result, double err, char * description);
+
+void
+add (struct problem * problems, int * n,
+ gsl_monte_function * f, double xl[], double xu[], size_t dim, size_t calls,
+ double result, double err, char * description)
+{
+ int i = *n;
+ problems[i].f = f;
+ problems[i].xl = xl;
+ problems[i].xu = xu;
+ problems[i].dim = dim;
+ problems[i].calls = calls;
+ problems[i].expected_result = result;
+ problems[i].expected_error = err;
+ problems[i].description = description;
+ (*n)++;
+}
+
+#define TRIALS 10
+
+int
+main (void)
+{
+ double result[TRIALS], error[TRIALS];
+ double a = 0.1;
+ double c = (1.0 + sqrt (10.0)) / 9.0;
+
+ gsl_monte_function Fc = make_function(&fconst, 0, 0);
+ gsl_monte_function F0 = make_function(&f0, 0, &a);
+ gsl_monte_function F1 = make_function(&f1, 0, &a);
+ gsl_monte_function F2 = make_function(&f2, 0, &a);
+ gsl_monte_function F3 = make_function(&f3, 0, &c);
+
+ /* The relationship between the variance of the function itself, the
+ error on the integral and the number of calls is,
+
+ sigma = sqrt(variance/N)
+
+ where the variance is the <(f - <f>)^2> where <.> denotes the
+ volume average (integral over the integration region divided by
+ the volume) */
+
+ int n = 0;
+ struct problem * I;
+ struct problem problems[256];
+
+#ifdef CONSTANT
+ /* variance(Fc) = 0 */
+
+ add(problems,&n, &Fc, xl, xu, 1, 1000, 1.0, 0.0, "constant, 1d");
+ add(problems,&n, &Fc, xl, xu, 2, 1000, 1.0, 0.0, "constant, 2d");
+ add(problems,&n, &Fc, xl, xu, 3, 1000, 1.0, 0.0, "constant, 3d");
+ add(problems,&n, &Fc, xl, xu, 4, 1000, 1.0, 0.0, "constant, 4d");
+ add(problems,&n, &Fc, xl, xu, 5, 1000, 1.0, 0.0, "constant, 5d");
+ add(problems,&n, &Fc, xl, xu, 6, 1000, 1.0, 0.0, "constant, 6d");
+ add(problems,&n, &Fc, xl, xu, 7, 1000, 1.0, 0.0, "constant, 7d");
+ add(problems,&n, &Fc, xl, xu, 8, 1000, 1.0, 0.0, "constant, 8d");
+ add(problems,&n, &Fc, xl, xu, 9, 1000, 1.0, 0.0, "constant, 9d");
+ add(problems,&n, &Fc, xl, xu, 10, 1000, 1.0, 0.0, "constant, 10d");
+#endif
+
+#ifdef PRODUCT
+ /* variance(F0) = (4/3)^d - 1 */
+
+ add(problems,&n, &F0, xl, xu, 1, 3333, 1.0, 0.01, "product, 1d" );
+ add(problems,&n, &F0, xl, xu, 2, 7777, 1.0, 0.01, "product, 2d" );
+ add(problems,&n, &F0, xl, xu, 3, 13703, 1.0, 0.01, "product, 3d" );
+ add(problems,&n, &F0, xl, xu, 4, 21604, 1.0, 0.01, "product, 4d" );
+ add(problems,&n, &F0, xl, xu, 5, 32139, 1.0, 0.01, "product, 5d" );
+ add(problems,&n, &F0, xl, xu, 6, 46186, 1.0, 0.01, "product, 6d" );
+ add(problems,&n, &F0, xl, xu, 7, 64915, 1.0, 0.01, "product, 7d" );
+ add(problems,&n, &F0, xl, xu, 8, 89887, 1.0, 0.01, "product, 8d" );
+ add(problems,&n, &F0, xl, xu, 9, 123182, 1.0, 0.01, "product, 9d" );
+ add(problems,&n, &F0, xl, xu, 10, 167577, 1.0, 0.01, "product, 10d" );
+#endif
+
+#ifdef GAUSSIAN
+ /* variance(F1) = (1/(a sqrt(2 pi)))^d - 1 */
+
+ add(problems,&n, &F1, xl, xu, 1, 298, 1.0, 0.1, "gaussian, 1d" );
+ add(problems,&n, &F1, xl, xu, 2, 1492, 1.0, 0.1, "gaussian, 2d" );
+ add(problems,&n, &F1, xl, xu, 3, 6249, 1.0, 0.1, "gaussian, 3d" );
+ add(problems,&n, &F1, xl, xu, 4, 25230, 1.0, 0.1, "gaussian, 4d" );
+ add(problems,&n, &F1, xl, xu, 5, 100953, 1.0, 0.1, "gaussian, 5d" );
+ add(problems,&n, &F1, xl, xu, 6, 44782, 1.0, 0.3, "gaussian, 6d" );
+ add(problems,&n, &F1, xl, xu, 7, 178690, 1.0, 0.3, "gaussian, 7d" );
+ add(problems,&n, &F1, xl, xu, 8, 712904, 1.0, 0.3, "gaussian, 8d" );
+ add(problems,&n, &F1, xl, xu, 9, 2844109, 1.0, 0.3, "gaussian, 9d" );
+ add(problems,&n, &F1, xl, xu, 10, 11346390, 1.0, 0.3, "gaussian, 10d" );
+#endif
+
+#ifdef DBLGAUSSIAN
+ /* variance(F2) = 0.5 * (1/(a sqrt(2 pi)))^d - 1 */
+
+ add(problems,&n, &F2, xl, xu, 1, 9947, 1.0, 0.01, "double gaussian, 1d" );
+ add(problems,&n, &F2, xl, xu, 2, 695, 1.0, 0.1, "double gaussian, 2d" );
+ add(problems,&n, &F2, xl, xu, 3, 3074, 1.0, 0.1, "double gaussian, 3d" );
+ add(problems,&n, &F2, xl, xu, 4, 12565, 1.0, 0.1, "double gaussian, 4d" );
+ add(problems,&n, &F2, xl, xu, 5, 50426, 1.0, 0.1, "double gaussian, 5d" );
+ add(problems,&n, &F2, xl, xu, 6, 201472, 1.0, 0.1, "double gaussian, 6d" );
+ add(problems,&n, &F2, xl, xu, 7, 804056, 1.0, 0.1, "double gaussian, 7d" );
+ add(problems,&n, &F2, xl, xu, 8, 356446, 1.0, 0.3, "double gaussian, 8d" );
+ add(problems,&n, &F2, xl, xu, 9, 1422049, 1.0, 0.3, "double gaussian, 9d" );
+ add(problems,&n, &F2, xl, xu, 10, 5673189, 1.0, 0.3, "double gaussian, 10d" );
+#endif
+
+#ifdef TSUDA
+ /* variance(F3) = ((c^2 + c + 1/3)/(c(c+1)))^d - 1 */
+
+ add(problems,&n, &F3, xl, xu, 1, 4928, 1.0, 0.01, "tsuda function, 1d" );
+ add(problems,&n, &F3, xl, xu, 2, 12285, 1.0, 0.01, "tsuda function, 2d" );
+ add(problems,&n, &F3, xl, xu, 3, 23268, 1.0, 0.01, "tsuda function, 3d" );
+ add(problems,&n, &F3, xl, xu, 4, 39664, 1.0, 0.01, "tsuda function, 4d" );
+ add(problems,&n, &F3, xl, xu, 5, 64141, 1.0, 0.01, "tsuda function, 5d" );
+ add(problems,&n, &F3, xl, xu, 6, 100680, 1.0, 0.01, "tsuda function, 6d" );
+ add(problems,&n, &F3, xl, xu, 7, 155227, 1.0, 0.01, "tsuda function, 7d" );
+ add(problems,&n, &F3, xl, xu, 8, 236657, 1.0, 0.01, "tsuda function, 8d" );
+ add(problems,&n, &F3, xl, xu, 9, 358219, 1.0, 0.01, "tsuda function, 9d" );
+ add(problems,&n, &F3, xl, xu, 10, 539690, 1.0, 0.01, "tsuda function, 10d" );
+#endif
+
+ add(problems,&n, 0, 0, 0, 0, 0, 0, 0, 0 );
+
+
+ /* gsl_set_error_handler (&my_error_handler); */
+ gsl_ieee_env_setup ();
+ gsl_rng_env_setup ();
+
+#ifdef A
+ printf ("testing allocation/input checks\n");
+
+ status = gsl_monte_plain_validate (s, xl, xu3, 1, 1);
+ gsl_test (status != 0, "error if limits too large");
+ status = gsl_monte_plain_validate (s, xl, xu, 0, 10);
+ gsl_test (status != 0, "error if num_dim = 0");
+ status = gsl_monte_plain_validate (s, xl, xu, 1, 0);
+ gsl_test (status != 0, "error if calls = 0");
+ status = gsl_monte_plain_validate (s, xu, xl, 1, 10);
+ gsl_test (status != 0, "error if xu < xl");
+#endif
+
+#ifdef PLAIN
+#define NAME "plain"
+#define MONTE_STATE gsl_monte_plain_state
+#define MONTE_ALLOC gsl_monte_plain_alloc
+#define MONTE_INTEGRATE gsl_monte_plain_integrate
+#define MONTE_FREE gsl_monte_plain_free
+#define MONTE_SPEEDUP 1
+#define MONTE_ERROR_TEST(err,expected) gsl_test_factor(err,expected, 5.0, NAME ", %s, abserr[%d]", I->description, i)
+#include "test_main.c"
+#undef NAME
+#undef MONTE_STATE
+#undef MONTE_ALLOC
+#undef MONTE_INTEGRATE
+#undef MONTE_FREE
+#undef MONTE_ERROR_TEST
+#undef MONTE_SPEEDUP
+#endif
+
+#ifdef MISER
+#define NAME "miser"
+#define MONTE_STATE gsl_monte_miser_state
+#define MONTE_ALLOC gsl_monte_miser_alloc
+#define MONTE_INTEGRATE gsl_monte_miser_integrate
+#define MONTE_FREE gsl_monte_miser_free
+#define MONTE_SPEEDUP 2
+#define MONTE_ERROR_TEST(err,expected) gsl_test(err > 5.0 * expected, NAME ", %s, abserr[%d] (obs %g vs plain %g)", I->description, i, err, expected)
+#include "test_main.c"
+#undef NAME
+#undef MONTE_STATE
+#undef MONTE_ALLOC
+#undef MONTE_INTEGRATE
+#undef MONTE_FREE
+#undef MONTE_ERROR_TEST
+#undef MONTE_SPEEDUP
+#endif
+
+#ifdef VEGAS
+#define NAME "vegas"
+#define MONTE_STATE gsl_monte_vegas_state
+#define MONTE_ALLOC gsl_monte_vegas_alloc
+#define MONTE_INTEGRATE(f,xl,xu,dim,calls,r,s,res,err) { gsl_monte_vegas_integrate(f,xl,xu,dim,calls,r,s,res,err) ; if (s->chisq < 0.5 || s->chisq > 2) gsl_monte_vegas_integrate(f,xl,xu,dim,calls,r,s,res,err); }
+#define MONTE_FREE gsl_monte_vegas_free
+#define MONTE_SPEEDUP 3
+#define MONTE_ERROR_TEST(err,expected) gsl_test(err > 3.0 * (expected == 0 ? 1.0/(I->calls/MONTE_SPEEDUP) : expected), NAME ", %s, abserr[%d] (obs %g vs exp %g)", I->description, i, err, expected)
+#include "test_main.c"
+#undef NAME
+#undef MONTE_STATE
+#undef MONTE_ALLOC
+#undef MONTE_INTEGRATE
+#undef MONTE_FREE
+#undef MONTE_ERROR_TEST
+#undef MONTE_SPEEDUP
+#endif
+
+ exit (gsl_test_summary ());
+}
+
+/* Simple constant function */
+double
+fconst (double x[], size_t num_dim, void *params)
+{
+ return 1;
+}
+
+/* Simple product function */
+double
+f0 (double x[], size_t num_dim, void *params)
+{
+ double prod = 1.0;
+ unsigned int i;
+
+ for (i = 0; i < num_dim; ++i)
+ {
+ prod *= 2.0 * x[i];
+ }
+
+ return prod;
+}
+
+/* Gaussian centered at 1/2. */
+
+double
+f1 (double x[], size_t num_dim, void *params)
+{
+ double a = *(double *)params;
+ double sum = 0.;
+
+ unsigned int i;
+ for (i = 0; i < num_dim; i++)
+ {
+ double dx = x[i] - 0.5;
+ sum += dx * dx;
+ }
+ return (pow (M_2_SQRTPI / (2. * a), (double) num_dim) *
+ exp (-sum / (a * a)));
+}
+
+/* double gaussian */
+double
+f2 (double x[], size_t num_dim, void *params)
+{
+ double a = *(double *)params;
+ double sum1 = 0.;
+ double sum2 = 0.;
+
+ unsigned int i;
+ for (i = 0; i < num_dim; i++)
+ {
+ double dx1 = x[i] - 1. / 3.;
+ double dx2 = x[i] - 2. / 3.;
+ sum1 += dx1 * dx1;
+ sum2 += dx2 * dx2;
+ }
+ return 0.5 * pow (M_2_SQRTPI / (2. * a), num_dim)
+ * (exp (-sum1 / (a * a)) + exp (-sum2 / (a * a)));
+}
+
+/* Tsuda's example */
+double
+f3 (double x[], size_t num_dim, void *params)
+{
+ double c = *(double *)params;
+
+ double prod = 1.;
+
+ unsigned int i;
+
+ for (i = 0; i < num_dim; i++)
+ {
+ prod *= c / (c + 1) * pow((c + 1) / (c + x[i]), 2.0);
+ }
+
+ return prod;
+}
+
+
+void
+my_error_handler (const char *reason, const char *file, int line, int err)
+{
+ if (0)
+ printf ("(caught [%s:%d: %s (%d)])\n", file, line, reason, err);
+}
diff --git a/gsl-1.9/monte/test_main.c b/gsl-1.9/monte/test_main.c
new file mode 100644
index 0000000..d35f357
--- /dev/null
+++ b/gsl-1.9/monte/test_main.c
@@ -0,0 +1,70 @@
+for (I = problems ; I->f != 0; I++)
+{
+ size_t i;
+ double sum = 0, mean, sumd2 = 0, sd, res, err;
+
+ gsl_rng * r;
+
+ if (I->dim > 3)
+ {
+ continue ;
+ }
+
+ r = gsl_rng_alloc (gsl_rng_default);
+
+ for (i = 0; i < TRIALS ; i++)
+ {
+ MONTE_STATE *s = MONTE_ALLOC (I->dim);
+
+ I->f->dim = I->dim;
+
+ MONTE_INTEGRATE (I->f, I->xl, I->xu,
+ I->dim, I->calls / MONTE_SPEEDUP, r, s,
+ &res, &err);
+
+ gsl_test_abs (res, I->expected_result,
+ 5 * GSL_MAX(err, 1024*GSL_DBL_EPSILON),
+ NAME ", %s, result[%d]", I->description, i);
+
+ MONTE_ERROR_TEST (err, I->expected_error);
+
+ result[i] = res;
+ error[i] = err;
+
+ MONTE_FREE (s);
+ }
+
+ for (i = 0; i < TRIALS; i++)
+ {
+ sum += result[i];
+ }
+
+ mean = sum / TRIALS ;
+
+ for (i = 0; i < TRIALS; i++)
+ {
+ sumd2 += pow(result[i] - mean, 2.0);
+ }
+
+ sd = sqrt(sumd2 / (TRIALS-1.0)) ;
+
+ if (sd < TRIALS * GSL_DBL_EPSILON * fabs (mean))
+ {
+ sd = 0;
+ }
+
+ for (i = 0; i < TRIALS; i++)
+ {
+ if (sd == 0 && fabs(error[i]) < GSL_DBL_EPSILON * fabs(result[i]))
+ {
+ error[i] = 0.0;
+ }
+
+ gsl_test_factor (error[i], sd, 5.0,
+ NAME ", %s, abserr[%d] vs sd", I->description, i);
+ }
+
+
+ gsl_rng_free (r);
+}
+
diff --git a/gsl-1.9/monte/vegas.c b/gsl-1.9/monte/vegas.c
new file mode 100644
index 0000000..1a3eb21
--- /dev/null
+++ b/gsl-1.9/monte/vegas.c
@@ -0,0 +1,864 @@
+/* monte/vegas.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Michael Booth
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: MJB */
+/* Modified by: Brian Gough, 12/2000 */
+
+/* This is an implementation of the adaptive Monte-Carlo algorithm
+ of G. P. Lepage, originally described in J. Comp. Phys. 27, 192(1978).
+ The current version of the algorithm was described in the Cornell
+ preprint CLNS-80/447 of March, 1980.
+
+ This code follows most closely the c version by D.R.Yennie, coded
+ in 1984.
+
+ The input coordinates are x[j], with upper and lower limits xu[j]
+ and xl[j]. The integration length in the j-th direction is
+ delx[j]. Each coordinate x[j] is rescaled to a variable y[j] in
+ the range 0 to 1. The range is divided into bins with boundaries
+ xi[i][j], where i=0 corresponds to y=0 and i=bins to y=1. The grid
+ is refined (ie, bins are adjusted) using d[i][j] which is some
+ variation on the squared sum. A third parameter used in defining
+ the real coordinate using random numbers is called z. It ranges
+ from 0 to bins. Its integer part gives the lower index of the bin
+ into which a call is to be placed, and the remainder gives the
+ location inside the bin.
+
+ When stratified sampling is used the bins are grouped into boxes,
+ and the algorithm allocates an equal number of function calls to
+ each box.
+
+ The variable alpha controls how "stiff" the rebinning algorithm is.
+ alpha = 0 means never change the grid. Alpha is typically set between
+ 1 and 2.
+
+ */
+
+/* configuration headers */
+#include <config.h>
+
+/* standard headers */
+#include <math.h>
+#include <stdio.h>
+
+/* gsl headers */
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_monte_vegas.h>
+
+/* lib-specific headers */
+#define BINS_MAX 50 /* even integer, will be divided by two */
+
+/* A separable grid with coordinates and values */
+#define COORD(s,i,j) ((s)->xi[(i)*(s)->dim + (j)])
+#define NEW_COORD(s,i) ((s)->xin[(i)])
+#define VALUE(s,i,j) ((s)->d[(i)*(s)->dim + (j)])
+
+/* predeclare functions */
+
+typedef int coord;
+
+static void init_grid (gsl_monte_vegas_state * s, double xl[], double xu[],
+ size_t dim);
+static void reset_grid_values (gsl_monte_vegas_state * s);
+static void init_box_coord (gsl_monte_vegas_state * s, coord box[]);
+static int change_box_coord (gsl_monte_vegas_state * s, coord box[]);
+static void accumulate_distribution (gsl_monte_vegas_state * s, coord bin[],
+ double y);
+static void random_point (double x[], coord bin[], double *bin_vol,
+ const coord box[],
+ const double xl[], const double xu[],
+ gsl_monte_vegas_state * s, gsl_rng * r);
+static void resize_grid (gsl_monte_vegas_state * s, unsigned int bins);
+static void refine_grid (gsl_monte_vegas_state * s);
+
+static void print_lim (gsl_monte_vegas_state * state,
+ double xl[], double xu[], unsigned long dim);
+static void print_head (gsl_monte_vegas_state * state,
+ unsigned long num_dim, unsigned long calls,
+ unsigned int it_num,
+ unsigned int bins, unsigned int boxes);
+static void print_res (gsl_monte_vegas_state * state,
+ unsigned int itr, double res, double err,
+ double cum_res, double cum_err,
+ double chi_sq);
+static void print_dist (gsl_monte_vegas_state * state, unsigned long dim);
+static void print_grid (gsl_monte_vegas_state * state, unsigned long dim);
+
+int
+gsl_monte_vegas_integrate (gsl_monte_function * f,
+ double xl[], double xu[],
+ size_t dim, size_t calls,
+ gsl_rng * r,
+ gsl_monte_vegas_state * state,
+ double *result, double *abserr)
+{
+ double cum_int, cum_sig;
+ size_t i, k, it;
+
+ if (dim != state->dim)
+ {
+ GSL_ERROR ("number of dimensions must match allocated size", GSL_EINVAL);
+ }
+
+ for (i = 0; i < dim; i++)
+ {
+ if (xu[i] <= xl[i])
+ {
+ GSL_ERROR ("xu must be greater than xl", GSL_EINVAL);
+ }
+
+ if (xu[i] - xl[i] > GSL_DBL_MAX)
+ {
+ GSL_ERROR ("Range of integration is too large, please rescale",
+ GSL_EINVAL);
+ }
+ }
+
+ if (state->stage == 0)
+ {
+ init_grid (state, xl, xu, dim);
+
+ if (state->verbose >= 0)
+ {
+ print_lim (state, xl, xu, dim);
+ }
+ }
+
+ if (state->stage <= 1)
+ {
+ state->wtd_int_sum = 0;
+ state->sum_wgts = 0;
+ state->chi_sum = 0;
+ state->it_num = 1;
+ state->samples = 0;
+ }
+
+ if (state->stage <= 2)
+ {
+ unsigned int bins = state->bins_max;
+ unsigned int boxes = 1;
+
+ if (state->mode != GSL_VEGAS_MODE_IMPORTANCE_ONLY)
+ {
+ /* shooting for 2 calls/box */
+
+ boxes = floor (pow (calls / 2.0, 1.0 / dim));
+ state->mode = GSL_VEGAS_MODE_IMPORTANCE;
+
+ if (2 * boxes >= state->bins_max)
+ {
+ /* if bins/box < 2 */
+ int box_per_bin = GSL_MAX (boxes / state->bins_max, 1);
+
+ bins = GSL_MIN(boxes / box_per_bin, state->bins_max);
+ boxes = box_per_bin * bins;
+
+ state->mode = GSL_VEGAS_MODE_STRATIFIED;
+ }
+ }
+
+ {
+ double tot_boxes = pow ((double) boxes, (double) dim);
+ state->calls_per_box = GSL_MAX (calls / tot_boxes, 2);
+ calls = state->calls_per_box * tot_boxes;
+ }
+
+ /* total volume of x-space/(avg num of calls/bin) */
+ state->jac = state->vol * pow ((double) bins, (double) dim) / calls;
+
+ state->boxes = boxes;
+
+ /* If the number of bins changes from the previous invocation, bins
+ are expanded or contracted accordingly, while preserving bin
+ density */
+
+ if (bins != state->bins)
+ {
+ resize_grid (state, bins);
+
+ if (state->verbose > 1)
+ {
+ print_grid (state, dim);
+ }
+ }
+
+ if (state->verbose >= 0)
+ {
+ print_head (state,
+ dim, calls, state->it_num, state->bins, state->boxes);
+ }
+ }
+
+ state->it_start = state->it_num;
+
+ cum_int = 0.0;
+ cum_sig = 0.0;
+
+ state->chisq = 0.0;
+
+ for (it = 0; it < state->iterations; it++)
+ {
+ double intgrl = 0.0, intgrl_sq = 0.0;
+ double sig = 0.0;
+ double wgt;
+ size_t calls_per_box = state->calls_per_box;
+ double jacbin = state->jac;
+ double *x = state->x;
+ coord *bin = state->bin;
+
+ state->it_num = state->it_start + it;
+
+ reset_grid_values (state);
+ init_box_coord (state, state->box);
+
+ do
+ {
+ double m = 0, q = 0;
+ double f_sq_sum = 0.0;
+
+ for (k = 0; k < calls_per_box; k++)
+ {
+ double fval, bin_vol;
+
+ random_point (x, bin, &bin_vol, state->box, xl, xu, state, r);
+
+ fval = jacbin * bin_vol * GSL_MONTE_FN_EVAL (f, x);
+
+ /* recurrence for mean and variance */
+
+ {
+ double d = fval - m;
+ m += d / (k + 1.0);
+ q += d * d * (k / (k + 1.0));
+ }
+
+ if (state->mode != GSL_VEGAS_MODE_STRATIFIED)
+ {
+ double f_sq = fval * fval;
+ accumulate_distribution (state, bin, f_sq);
+ }
+ }
+
+ intgrl += m * calls_per_box;
+
+ f_sq_sum = q * calls_per_box ;
+
+ sig += f_sq_sum ;
+
+ if (state->mode == GSL_VEGAS_MODE_STRATIFIED)
+ {
+ accumulate_distribution (state, bin, f_sq_sum);
+ }
+ }
+ while (change_box_coord (state, state->box));
+
+ /* Compute final results for this iteration */
+
+ sig = sig / (calls_per_box - 1.0) ;
+
+ if (sig > 0)
+ {
+ wgt = 1.0 / sig;
+ }
+ else if (state->sum_wgts > 0)
+ {
+ wgt = state->sum_wgts / state->samples;
+ }
+ else
+ {
+ wgt = 0.0;
+ }
+
+ intgrl_sq = intgrl * intgrl;
+
+ state->result = intgrl;
+ state->sigma = sqrt(sig);
+
+ if (wgt > 0.0)
+ {
+ state->samples++ ;
+ state->sum_wgts += wgt;
+ state->wtd_int_sum += intgrl * wgt;
+ state->chi_sum += intgrl_sq * wgt;
+
+ cum_int = state->wtd_int_sum / state->sum_wgts;
+ cum_sig = sqrt (1 / state->sum_wgts);
+
+ if (state->samples > 1)
+ {
+ state->chisq = (state->chi_sum - state->wtd_int_sum * cum_int) /
+ (state->samples - 1.0);
+ }
+ }
+ else
+ {
+ cum_int += (intgrl - cum_int) / (it + 1.0);
+ cum_sig = 0.0;
+ }
+
+
+ if (state->verbose >= 0)
+ {
+ print_res (state,
+ state->it_num, intgrl, sqrt (sig), cum_int, cum_sig,
+ state->chisq);
+ if (it + 1 == state->iterations && state->verbose > 0)
+ {
+ print_grid (state, dim);
+ }
+ }
+
+ if (state->verbose > 1)
+ {
+ print_dist (state, dim);
+ }
+
+ refine_grid (state);
+
+ if (state->verbose > 1)
+ {
+ print_grid (state, dim);
+ }
+
+ }
+
+ /* By setting stage to 1 further calls will generate independent
+ estimates based on the same grid, although it may be rebinned. */
+
+ state->stage = 1;
+
+ *result = cum_int;
+ *abserr = cum_sig;
+
+ return GSL_SUCCESS;
+}
+
+
+
+gsl_monte_vegas_state *
+gsl_monte_vegas_alloc (size_t dim)
+{
+ gsl_monte_vegas_state *s =
+ (gsl_monte_vegas_state *) malloc (sizeof (gsl_monte_vegas_state));
+
+ if (s == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for vegas state struct",
+ GSL_ENOMEM, 0);
+ }
+
+ s->delx = (double *) malloc (dim * sizeof (double));
+
+ if (s->delx == 0)
+ {
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for delx", GSL_ENOMEM, 0);
+ }
+
+ s->d = (double *) malloc (BINS_MAX * dim * sizeof (double));
+
+ if (s->d == 0)
+ {
+ free (s->delx);
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for d", GSL_ENOMEM, 0);
+ }
+
+ s->xi = (double *) malloc ((BINS_MAX + 1) * dim * sizeof (double));
+
+ if (s->xi == 0)
+ {
+ free (s->d);
+ free (s->delx);
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for xi", GSL_ENOMEM, 0);
+ }
+
+ s->xin = (double *) malloc ((BINS_MAX + 1) * sizeof (double));
+
+ if (s->xin == 0)
+ {
+ free (s->xi);
+ free (s->d);
+ free (s->delx);
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for xin", GSL_ENOMEM, 0);
+ }
+
+ s->weight = (double *) malloc (BINS_MAX * sizeof (double));
+
+ if (s->weight == 0)
+ {
+ free (s->xin);
+ free (s->xi);
+ free (s->d);
+ free (s->delx);
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for xin", GSL_ENOMEM, 0);
+ }
+
+ s->box = (coord *) malloc (dim * sizeof (coord));
+
+ if (s->box == 0)
+ {
+ free (s->weight);
+ free (s->xin);
+ free (s->xi);
+ free (s->d);
+ free (s->delx);
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for box", GSL_ENOMEM, 0);
+ }
+
+ s->bin = (coord *) malloc (dim * sizeof (coord));
+
+ if (s->bin == 0)
+ {
+ free (s->box);
+ free (s->weight);
+ free (s->xin);
+ free (s->xi);
+ free (s->d);
+ free (s->delx);
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for bin", GSL_ENOMEM, 0);
+ }
+
+ s->x = (double *) malloc (dim * sizeof (double));
+
+ if (s->x == 0)
+ {
+ free (s->bin);
+ free (s->box);
+ free (s->weight);
+ free (s->xin);
+ free (s->xi);
+ free (s->d);
+ free (s->delx);
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for x", GSL_ENOMEM, 0);
+ }
+
+ s->dim = dim;
+ s->bins_max = BINS_MAX;
+
+ gsl_monte_vegas_init (s);
+
+ return s;
+}
+
+/* Set some default values and whatever */
+int
+gsl_monte_vegas_init (gsl_monte_vegas_state * state)
+{
+ state->stage = 0;
+ state->alpha = 1.5;
+ state->verbose = -1;
+ state->iterations = 5;
+ state->mode = GSL_VEGAS_MODE_IMPORTANCE;
+ state->chisq = 0;
+ state->bins = state->bins_max;
+ state->ostream = stdout;
+
+ return GSL_SUCCESS;
+}
+
+void
+gsl_monte_vegas_free (gsl_monte_vegas_state * s)
+{
+ free (s->x);
+ free (s->delx);
+ free (s->d);
+ free (s->xi);
+ free (s->xin);
+ free (s->weight);
+ free (s->box);
+ free (s->bin);
+ free (s);
+}
+
+static void
+init_box_coord (gsl_monte_vegas_state * s, coord box[])
+{
+ size_t i;
+
+ size_t dim = s->dim;
+
+ for (i = 0; i < dim; i++)
+ {
+ box[i] = 0;
+ }
+}
+
+/* change_box_coord steps through the box coord like
+ {0,0}, {0, 1}, {0, 2}, {0, 3}, {1, 0}, {1, 1}, {1, 2}, ...
+*/
+static int
+change_box_coord (gsl_monte_vegas_state * s, coord box[])
+{
+ int j = s->dim - 1;
+
+ int ng = s->boxes;
+
+ while (j >= 0)
+ {
+ box[j] = (box[j] + 1) % ng;
+
+ if (box[j] != 0)
+ {
+ return 1;
+ }
+
+ j--;
+ }
+
+ return 0;
+}
+
+static void
+init_grid (gsl_monte_vegas_state * s, double xl[], double xu[], size_t dim)
+{
+ size_t j;
+
+ double vol = 1.0;
+
+ s->bins = 1;
+
+ for (j = 0; j < dim; j++)
+ {
+ double dx = xu[j] - xl[j];
+ s->delx[j] = dx;
+ vol *= dx;
+
+ COORD (s, 0, j) = 0.0;
+ COORD (s, 1, j) = 1.0;
+ }
+
+ s->vol = vol;
+}
+
+
+static void
+reset_grid_values (gsl_monte_vegas_state * s)
+{
+ size_t i, j;
+
+ size_t dim = s->dim;
+ size_t bins = s->bins;
+
+ for (i = 0; i < bins; i++)
+ {
+ for (j = 0; j < dim; j++)
+ {
+ VALUE (s, i, j) = 0.0;
+ }
+ }
+}
+
+static void
+accumulate_distribution (gsl_monte_vegas_state * s, coord bin[], double y)
+{
+ size_t j;
+ size_t dim = s->dim;
+
+ for (j = 0; j < dim; j++)
+ {
+ int i = bin[j];
+ VALUE (s, i, j) += y;
+ }
+}
+
+static void
+random_point (double x[], coord bin[], double *bin_vol,
+ const coord box[], const double xl[], const double xu[],
+ gsl_monte_vegas_state * s, gsl_rng * r)
+{
+ /* Use the random number generator r to return a random position x
+ in a given box. The value of bin gives the bin location of the
+ random position (there may be several bins within a given box) */
+
+ double vol = 1.0;
+
+ size_t j;
+
+ size_t dim = s->dim;
+ size_t bins = s->bins;
+ size_t boxes = s->boxes;
+
+ DISCARD_POINTER(xu); /* prevent warning about unused parameter */
+
+ for (j = 0; j < dim; ++j)
+ {
+ /* box[j] + ran gives the position in the box units, while z
+ is the position in bin units. */
+
+ double z = ((box[j] + gsl_rng_uniform_pos (r)) / boxes) * bins;
+
+ int k = z;
+
+ double y, bin_width;
+
+ bin[j] = k;
+
+ if (k == 0)
+ {
+ bin_width = COORD (s, 1, j);
+ y = z * bin_width;
+ }
+ else
+ {
+ bin_width = COORD (s, k + 1, j) - COORD (s, k, j);
+ y = COORD (s, k, j) + (z - k) * bin_width;
+ }
+
+ x[j] = xl[j] + y * s->delx[j];
+
+ vol *= bin_width;
+ }
+
+ *bin_vol = vol;
+}
+
+
+static void
+resize_grid (gsl_monte_vegas_state * s, unsigned int bins)
+{
+ size_t j, k;
+ size_t dim = s->dim;
+
+ /* weight is ratio of bin sizes */
+
+ double pts_per_bin = (double) s->bins / (double) bins;
+
+ for (j = 0; j < dim; j++)
+ {
+ double xold;
+ double xnew = 0;
+ double dw = 0;
+ int i = 1;
+
+ for (k = 1; k <= s->bins; k++)
+ {
+ dw += 1.0;
+ xold = xnew;
+ xnew = COORD (s, k, j);
+
+ for (; dw > pts_per_bin; i++)
+ {
+ dw -= pts_per_bin;
+ NEW_COORD (s, i) = xnew - (xnew - xold) * dw;
+ }
+ }
+
+ for (k = 1 ; k < bins; k++)
+ {
+ COORD(s, k, j) = NEW_COORD(s, k);
+ }
+
+ COORD (s, bins, j) = 1;
+ }
+
+ s->bins = bins;
+}
+
+static void
+refine_grid (gsl_monte_vegas_state * s)
+{
+ size_t i, j, k;
+ size_t dim = s->dim;
+ size_t bins = s->bins;
+
+ for (j = 0; j < dim; j++)
+ {
+ double grid_tot_j, tot_weight;
+ double * weight = s->weight;
+
+ double oldg = VALUE (s, 0, j);
+ double newg = VALUE (s, 1, j);
+
+ VALUE (s, 0, j) = (oldg + newg) / 2;
+ grid_tot_j = VALUE (s, 0, j);
+
+ /* This implements gs[i][j] = (gs[i-1][j]+gs[i][j]+gs[i+1][j])/3 */
+
+ for (i = 1; i < bins - 1; i++)
+ {
+ double rc = oldg + newg;
+ oldg = newg;
+ newg = VALUE (s, i + 1, j);
+ VALUE (s, i, j) = (rc + newg) / 3;
+ grid_tot_j += VALUE (s, i, j);
+ }
+ VALUE (s, bins - 1, j) = (newg + oldg) / 2;
+
+ grid_tot_j += VALUE (s, bins - 1, j);
+
+ tot_weight = 0;
+
+ for (i = 0; i < bins; i++)
+ {
+ weight[i] = 0;
+
+ if (VALUE (s, i, j) > 0)
+ {
+ oldg = grid_tot_j / VALUE (s, i, j);
+ /* damped change */
+ weight[i] = pow (((oldg - 1) / oldg / log (oldg)), s->alpha);
+ }
+
+ tot_weight += weight[i];
+
+#ifdef DEBUG
+ printf("weight[%d] = %g\n", i, weight[i]);
+#endif
+ }
+
+ {
+ double pts_per_bin = tot_weight / bins;
+
+ double xold;
+ double xnew = 0;
+ double dw = 0;
+ i = 1;
+
+ for (k = 0; k < bins; k++)
+ {
+ dw += weight[k];
+ xold = xnew;
+ xnew = COORD (s, k + 1, j);
+
+ for (; dw > pts_per_bin; i++)
+ {
+ dw -= pts_per_bin;
+ NEW_COORD (s, i) = xnew - (xnew - xold) * dw / weight[k];
+ }
+ }
+
+ for (k = 1 ; k < bins ; k++)
+ {
+ COORD(s, k, j) = NEW_COORD(s, k);
+ }
+
+ COORD (s, bins, j) = 1;
+ }
+ }
+}
+
+
+static void
+print_lim (gsl_monte_vegas_state * state,
+ double xl[], double xu[], unsigned long dim)
+{
+ unsigned long j;
+
+ fprintf (state->ostream, "The limits of integration are:\n");
+ for (j = 0; j < dim; ++j)
+ fprintf (state->ostream, "\nxl[%lu]=%f xu[%lu]=%f", j, xl[j], j, xu[j]);
+ fprintf (state->ostream, "\n");
+ fflush (state->ostream);
+}
+
+static void
+print_head (gsl_monte_vegas_state * state,
+ unsigned long num_dim, unsigned long calls,
+ unsigned int it_num, unsigned int bins, unsigned int boxes)
+{
+ fprintf (state->ostream,
+ "\nnum_dim=%lu, calls=%lu, it_num=%d, max_it_num=%d ",
+ num_dim, calls, it_num, state->iterations);
+ fprintf (state->ostream,
+ "verb=%d, alph=%.2f,\nmode=%d, bins=%d, boxes=%d\n",
+ state->verbose, state->alpha, state->mode, bins, boxes);
+ fprintf (state->ostream,
+ "\n single.......iteration ");
+ fprintf (state->ostream, "accumulated......results \n");
+
+ fprintf (state->ostream,
+ "iteration integral sigma integral ");
+ fprintf (state->ostream, " sigma chi-sq/it\n\n");
+ fflush (state->ostream);
+
+}
+
+static void
+print_res (gsl_monte_vegas_state * state,
+ unsigned int itr,
+ double res, double err,
+ double cum_res, double cum_err,
+ double chi_sq)
+{
+ fprintf (state->ostream,
+ "%4d %6.4e %10.2e %6.4e %8.2e %10.2e\n",
+ itr, res, err, cum_res, cum_err, chi_sq);
+ fflush (state->ostream);
+}
+
+static void
+print_dist (gsl_monte_vegas_state * state, unsigned long dim)
+{
+ unsigned long i, j;
+ int p = state->verbose;
+ if (p < 1)
+ return;
+
+ for (j = 0; j < dim; ++j)
+ {
+ fprintf (state->ostream, "\n axis %lu \n", j);
+ fprintf (state->ostream, " x g\n");
+ for (i = 0; i < state->bins; i++)
+ {
+ fprintf (state->ostream, "weight [%11.2e , %11.2e] = ",
+ COORD (state, i, j), COORD(state,i+1,j));
+ fprintf (state->ostream, " %11.2e\n", VALUE (state, i, j));
+
+ }
+ fprintf (state->ostream, "\n");
+ }
+ fprintf (state->ostream, "\n");
+ fflush (state->ostream);
+
+}
+
+static void
+print_grid (gsl_monte_vegas_state * state, unsigned long dim)
+{
+ unsigned long i, j;
+ int p = state->verbose;
+ if (p < 1)
+ return;
+
+ for (j = 0; j < dim; ++j)
+ {
+ fprintf (state->ostream, "\n axis %lu \n", j);
+ fprintf (state->ostream, " x \n");
+ for (i = 0; i <= state->bins; i++)
+ {
+ fprintf (state->ostream, "%11.2e", COORD (state, i, j));
+ if (i % 5 == 4)
+ fprintf (state->ostream, "\n");
+ }
+ fprintf (state->ostream, "\n");
+ }
+ fprintf (state->ostream, "\n");
+ fflush (state->ostream);
+
+}
+
diff --git a/gsl-1.9/multifit/ChangeLog b/gsl-1.9/multifit/ChangeLog
new file mode 100644
index 0000000..17e4184
--- /dev/null
+++ b/gsl-1.9/multifit/ChangeLog
@@ -0,0 +1,145 @@
+2007-01-26 Brian Gough <bjg@network-theory.co.uk>
+
+ * fsolver.c (gsl_multifit_fsolver_set): made vector argument x
+ const
+
+2006-03-30 Brian Gough <bjg@network-theory.co.uk>
+
+ * fsolver.c (gsl_multifit_fsolver_alloc): minpack algorithms
+ require n>=p, added check
+
+ * fdfsolver.c (gsl_multifit_fdfsolver_alloc): minpack algorithms
+ require n>=p, added check
+
+2006-02-20 Brian Gough <bjg@network-theory.co.uk>
+
+ * multilinear.c (gsl_multifit_linear_est): added linear estimator
+
+ * test_estimator.c (test_estimator): added test for gsl_multifit_linear_est
+
+2005-07-03 Brian Gough <bjg@network-theory.co.uk>
+
+ * multilinear.c (gsl_multifit_linear_svd): accept a user-specified
+ tolerance for the SVD cutoff and return effective rank
+ (gsl_multifit_wlinear_svd): same
+
+2004-12-23 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_multifit_nlin.h: removed unused declaration of
+ gsl_multifit_fdjacobian
+
+2004-06-14 Brian Gough <bjg@network-theory.co.uk>
+
+ * lmiterate.c (iterate): handle case where fnorm = 0 to avoid
+ division by zero
+
+ * covar.c (gsl_multifit_covar): change tolerance test to match
+ original code, and handle case where tolr = 0
+
+2003-03-21 Brian Gough <bjg@network-theory.co.uk>
+
+ * lmset.c (set): removed reference to q, compute QR decomposition
+ in place
+
+ * lmiterate.c (iterate): removed reference to q, compute QR
+ decomposition in-place for R
+
+ * lmutil.c: removed compute_qtf
+
+ * lmder.c (lmder_free): removed reference to q
+ (lmder_alloc): removed reference to q
+
+Tue Nov 12 22:18:14 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * lmder.c (lmder_alloc): use GSL_ERROR instead of GSL_ERROR_VAL
+ for internal alloc functions which return int
+
+Thu Feb 28 20:15:33 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * lmiterate.c (iterate): return immediately if evaluation raised
+ error (Hans E. Plesser)
+
+ * lmpar.c (lmpar): avoid division by zero for w=0 in rank
+ deficient case
+
+Mon Oct 8 19:25:55 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c (main): added extra nist tests
+
+ * lmutil.c (compute_rptdx): fixed bug, permutation in rptdx vector
+ was incorrectly applied
+
+ * lmpar.c (compute_newton_direction): fixed bug, permutation of
+ newton direction vector was incorrect (should have been inverse
+ permutation)
+
+Mon Jul 30 17:43:21 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * test_filip.c (test_filip): reduce tolerance on covariance test
+ slightly for MSVC with /O2
+
+Sun Jul 1 22:42:34 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * multilinear.c: modified to use new-style vector views
+
+ * test_pontius.c: modified to use new-style vector views
+
+ * test_longley.c: modified to use new-style vector views
+
+ * test_fn.c: modified to use new-style vector views
+
+ * test_filip.c: modified to use new-style vector views
+
+Tue Jun 26 21:41:30 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * test_filip.c (test_filip): reduce tolerance on covariance test
+ slightly
+
+Wed Jun 20 13:11:26 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * removed unused variable work2
+
+Tue Jun 19 23:18:01 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * multilinear.c: perform column scaling before doing fit to
+ improve accuracy
+ (gsl_multifit_linear): use modified Golub-Reinsch SVD for greater
+ speed
+ (gsl_multifit_wlinear): use modified Golub-Reinsch SVD for greater
+ speed
+
+Wed Jun 6 13:32:22 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * lmder.c covar.c lmiterate.c lmset.c: updated to use new QR
+ calling convention (now passes workspace)
+
+Sat Apr 28 11:46:59 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * qrsolv.c (qrsolv): removed local declaration of j to avoid
+ shadowing global j
+
+Mon Apr 23 13:40:04 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * qrsolv.c (qrsolv): made function static so it is not exported
+
+Wed Apr 18 13:39:33 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * lmpar.c (compute_newton_direction): moved final rescaling inside
+ loop, as in the original lmpar.f
+
+Thu Mar 8 15:29:32 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * lmpar.c (compute_newton_direction): corrected bug that produced
+ negative index
+
+Sun Feb 18 16:39:46 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * fdfsolver.c (gsl_multifit_fdfsolver_alloc): changed so that the
+ solver _alloc function no longer calls _set, the user must do that
+ separately.
+
+Fri Sep 29 19:19:24 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * Makefile.am multifit/demo.c: removed demo from Makefile since it
+ is was just a temporary test.
+
diff --git a/gsl-1.9/multifit/Makefile.am b/gsl-1.9/multifit/Makefile.am
new file mode 100644
index 0000000..ab29801
--- /dev/null
+++ b/gsl-1.9/multifit/Makefile.am
@@ -0,0 +1,20 @@
+noinst_LTLIBRARIES = libgslmultifit.la
+
+pkginclude_HEADERS = gsl_multifit.h gsl_multifit_nlin.h
+
+INCLUDES= -I$(top_builddir)
+
+libgslmultifit_la_SOURCES = multilinear.c work.c lmder.c fsolver.c fdfsolver.c convergence.c gradient.c covar.c
+
+noinst_HEADERS = lmutil.c lmpar.c lmset.c lmiterate.c qrsolv.c test_brown.c test_enso.c test_filip.c test_fn.c test_hahn1.c test_kirby2.c test_longley.c test_nelson.c test_pontius.c test_estimator.c
+
+check_PROGRAMS = test #demo
+
+TESTS = $(check_PROGRAMS)
+
+test_SOURCES = test.c
+test_LDADD = libgslmultifit.la ../linalg/libgsllinalg.la ../permutation/libgslpermutation.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../utils/libutils.la ../sys/libgslsys.la
+
+#demo_SOURCES = demo.c
+#demo_LDADD = libgslmultifit.la ../linalg/libgsllinalg.la ../permutation/libgslpermutation.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la ../randist/libgslrandist.la ../rng/libgslrng.la ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../utils/libutils.la ../sys/libgslsys.la
+
diff --git a/gsl-1.9/multifit/Makefile.in b/gsl-1.9/multifit/Makefile.in
new file mode 100644
index 0000000..5004e67
--- /dev/null
+++ b/gsl-1.9/multifit/Makefile.in
@@ -0,0 +1,552 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = test$(EXEEXT)
+subdir = multifit
+DIST_COMMON = $(noinst_HEADERS) $(pkginclude_HEADERS) \
+ $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog TODO
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgslmultifit_la_LIBADD =
+am_libgslmultifit_la_OBJECTS = multilinear.lo work.lo lmder.lo \
+ fsolver.lo fdfsolver.lo convergence.lo gradient.lo covar.lo
+libgslmultifit_la_OBJECTS = $(am_libgslmultifit_la_OBJECTS)
+am_test_OBJECTS = test.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = libgslmultifit.la ../linalg/libgsllinalg.la \
+ ../permutation/libgslpermutation.la ../blas/libgslblas.la \
+ ../cblas/libgslcblas.la ../matrix/libgslmatrix.la \
+ ../vector/libgslvector.la ../block/libgslblock.la \
+ ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la \
+ ../err/libgslerr.la ../test/libgsltest.la ../utils/libutils.la \
+ ../sys/libgslsys.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgslmultifit_la_SOURCES) $(test_SOURCES)
+DIST_SOURCES = $(libgslmultifit_la_SOURCES) $(test_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libgslmultifit.la
+pkginclude_HEADERS = gsl_multifit.h gsl_multifit_nlin.h
+INCLUDES = -I$(top_builddir)
+libgslmultifit_la_SOURCES = multilinear.c work.c lmder.c fsolver.c fdfsolver.c convergence.c gradient.c covar.c
+noinst_HEADERS = lmutil.c lmpar.c lmset.c lmiterate.c qrsolv.c test_brown.c test_enso.c test_filip.c test_fn.c test_hahn1.c test_kirby2.c test_longley.c test_nelson.c test_pontius.c test_estimator.c
+TESTS = $(check_PROGRAMS)
+test_SOURCES = test.c
+test_LDADD = libgslmultifit.la ../linalg/libgsllinalg.la ../permutation/libgslpermutation.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../utils/libutils.la ../sys/libgslsys.la
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps multifit/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps multifit/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgslmultifit.la: $(libgslmultifit_la_OBJECTS) $(libgslmultifit_la_DEPENDENCIES)
+ $(LINK) $(libgslmultifit_la_LDFLAGS) $(libgslmultifit_la_OBJECTS) $(libgslmultifit_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkgincludeHEADERS
+
+
+#demo_SOURCES = demo.c
+#demo_LDADD = libgslmultifit.la ../linalg/libgsllinalg.la ../permutation/libgslpermutation.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la ../randist/libgslrandist.la ../rng/libgslrng.la ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../utils/libutils.la ../sys/libgslsys.la
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/multifit/TODO b/gsl-1.9/multifit/TODO
new file mode 100644
index 0000000..b67e058
--- /dev/null
+++ b/gsl-1.9/multifit/TODO
@@ -0,0 +1,7 @@
+The following would also be nice additions to the multifit function suite
+(see MS Excel regression output for example):
+
+1. Produce the correlation coefficient (r) and other statistics.
+2. Allow fit variable weighting (not observation weighting).
+3. Allow for principal factor computations.
+
diff --git a/gsl-1.9/multifit/convergence.c b/gsl-1.9/multifit/convergence.c
new file mode 100644
index 0000000..73a89a3
--- /dev/null
+++ b/gsl-1.9/multifit/convergence.c
@@ -0,0 +1,89 @@
+/* multifit/convergence.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_multifit_nlin.h>
+
+int
+gsl_multifit_test_delta (const gsl_vector * dx, const gsl_vector * x,
+ double epsabs, double epsrel)
+{
+ size_t i;
+ int ok = 1;
+ const size_t n = x->size ;
+
+ if (epsrel < 0.0)
+ {
+ GSL_ERROR ("relative tolerance is negative", GSL_EBADTOL);
+ }
+
+ for (i = 0 ; i < n ; i++)
+ {
+ double xi = gsl_vector_get(x,i);
+ double dxi = gsl_vector_get(dx,i);
+ double tolerance = epsabs + epsrel * fabs(xi) ;
+
+ if (fabs(dxi) < tolerance)
+ {
+ ok = 1;
+ }
+ else
+ {
+ ok = 0;
+ break;
+ }
+ }
+
+ if (ok)
+ return GSL_SUCCESS ;
+
+ return GSL_CONTINUE;
+}
+
+int
+gsl_multifit_test_gradient (const gsl_vector * g, double epsabs)
+{
+ size_t i;
+
+ double residual = 0;
+
+ const size_t n = g->size;
+
+ if (epsabs < 0.0)
+ {
+ GSL_ERROR ("absolute tolerance is negative", GSL_EBADTOL);
+ }
+
+ for (i = 0 ; i < n ; i++)
+ {
+ double gi = gsl_vector_get(g, i);
+
+ residual += fabs(gi);
+ }
+
+
+ if (residual < epsabs)
+ {
+ return GSL_SUCCESS;
+ }
+
+ return GSL_CONTINUE ;
+}
diff --git a/gsl-1.9/multifit/covar.c b/gsl-1.9/multifit/covar.c
new file mode 100644
index 0000000..05683a7
--- /dev/null
+++ b/gsl-1.9/multifit/covar.c
@@ -0,0 +1,192 @@
+/* multifit/covar.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+#include <gsl/gsl_linalg.h>
+#include <gsl/gsl_multifit_nlin.h>
+
+/* Compute the covariance matrix
+
+ cov = inv (J^T J)
+
+ by QRP^T decomposition of J
+*/
+
+int
+gsl_multifit_covar (const gsl_matrix * J, double epsrel, gsl_matrix * covar)
+{
+ double tolr;
+
+ size_t i, j, k;
+ size_t kmax = 0;
+
+ gsl_matrix * r;
+ gsl_vector * tau;
+ gsl_vector * norm;
+ gsl_permutation * perm;
+
+ size_t m = J->size1, n = J->size2 ;
+
+ if (m < n)
+ {
+ GSL_ERROR ("Jacobian be rectangular M x N with M >= N", GSL_EBADLEN);
+ }
+
+ if (covar->size1 != covar->size2 || covar->size1 != n)
+ {
+ GSL_ERROR ("covariance matrix must be square and match second dimension of jacobian", GSL_EBADLEN);
+ }
+
+ r = gsl_matrix_alloc (m, n);
+ tau = gsl_vector_alloc (n);
+ perm = gsl_permutation_alloc (n) ;
+ norm = gsl_vector_alloc (n) ;
+
+ {
+ int signum = 0;
+ gsl_matrix_memcpy (r, J);
+ gsl_linalg_QRPT_decomp (r, tau, perm, &signum, norm);
+ }
+
+
+ /* Form the inverse of R in the full upper triangle of R */
+
+ tolr = epsrel * fabs(gsl_matrix_get(r, 0, 0));
+
+ for (k = 0 ; k < n ; k++)
+ {
+ double rkk = gsl_matrix_get(r, k, k);
+
+ if (fabs(rkk) <= tolr)
+ {
+ break;
+ }
+
+ gsl_matrix_set(r, k, k, 1.0/rkk);
+
+ for (j = 0; j < k ; j++)
+ {
+ double t = gsl_matrix_get(r, j, k) / rkk;
+ gsl_matrix_set (r, j, k, 0.0);
+
+ for (i = 0; i <= j; i++)
+ {
+ double rik = gsl_matrix_get (r, i, k);
+ double rij = gsl_matrix_get (r, i, j);
+
+ gsl_matrix_set (r, i, k, rik - t * rij);
+ }
+ }
+ kmax = k;
+ }
+
+ /* Form the full upper triangle of the inverse of R^T R in the full
+ upper triangle of R */
+
+ for (k = 0; k <= kmax ; k++)
+ {
+ for (j = 0; j < k; j++)
+ {
+ double rjk = gsl_matrix_get (r, j, k);
+
+ for (i = 0; i <= j ; i++)
+ {
+ double rij = gsl_matrix_get (r, i, j);
+ double rik = gsl_matrix_get (r, i, k);
+
+ gsl_matrix_set (r, i, j, rij + rjk * rik);
+ }
+ }
+
+ {
+ double t = gsl_matrix_get (r, k, k);
+
+ for (i = 0; i <= k; i++)
+ {
+ double rik = gsl_matrix_get (r, i, k);
+
+ gsl_matrix_set (r, i, k, t * rik);
+ };
+ }
+ }
+
+ /* Form the full lower triangle of the covariance matrix in the
+ strict lower triangle of R and in w */
+
+ for (j = 0 ; j < n ; j++)
+ {
+ size_t pj = gsl_permutation_get (perm, j);
+
+ for (i = 0; i <= j; i++)
+ {
+ size_t pi = gsl_permutation_get (perm, i);
+
+ double rij;
+
+ if (j > kmax)
+ {
+ gsl_matrix_set (r, i, j, 0.0);
+ rij = 0.0 ;
+ }
+ else
+ {
+ rij = gsl_matrix_get (r, i, j);
+ }
+
+ if (pi > pj)
+ {
+ gsl_matrix_set (r, pi, pj, rij);
+ }
+ else if (pi < pj)
+ {
+ gsl_matrix_set (r, pj, pi, rij);
+ }
+
+ }
+
+ {
+ double rjj = gsl_matrix_get (r, j, j);
+ gsl_matrix_set (covar, pj, pj, rjj);
+ }
+ }
+
+
+ /* symmetrize the covariance matrix */
+
+ for (j = 0 ; j < n ; j++)
+ {
+ for (i = 0; i < j ; i++)
+ {
+ double rji = gsl_matrix_get (r, j, i);
+
+ gsl_matrix_set (covar, j, i, rji);
+ gsl_matrix_set (covar, i, j, rji);
+ }
+ }
+
+ gsl_matrix_free (r);
+ gsl_permutation_free (perm);
+ gsl_vector_free (tau);
+ gsl_vector_free (norm);
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/multifit/fdfsolver.c b/gsl-1.9/multifit/fdfsolver.c
new file mode 100644
index 0000000..4f46a9a
--- /dev/null
+++ b/gsl-1.9/multifit/fdfsolver.c
@@ -0,0 +1,170 @@
+/* multifit/fdfsolver.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_multifit_nlin.h>
+
+gsl_multifit_fdfsolver *
+gsl_multifit_fdfsolver_alloc (const gsl_multifit_fdfsolver_type * T,
+ size_t n, size_t p)
+{
+ int status;
+
+ gsl_multifit_fdfsolver * s;
+
+ if (n < p)
+ {
+ GSL_ERROR_VAL ("insufficient data points, n < p", GSL_EINVAL, 0);
+ }
+
+ s = (gsl_multifit_fdfsolver *) malloc (sizeof (gsl_multifit_fdfsolver));
+
+ if (s == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for multifit solver struct",
+ GSL_ENOMEM, 0);
+ }
+
+ s->x = gsl_vector_calloc (p);
+
+ if (s->x == 0)
+ {
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for x", GSL_ENOMEM, 0);
+ }
+
+ s->f = gsl_vector_calloc (n);
+
+ if (s->f == 0)
+ {
+ gsl_vector_free (s->x);
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for f", GSL_ENOMEM, 0);
+ }
+
+ s->J = gsl_matrix_calloc (n,p);
+
+ if (s->J == 0)
+ {
+ gsl_vector_free (s->x);
+ gsl_vector_free (s->f);
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for g", GSL_ENOMEM, 0);
+ }
+
+ s->dx = gsl_vector_calloc (p);
+
+ if (s->dx == 0)
+ {
+ gsl_matrix_free (s->J);
+ gsl_vector_free (s->x);
+ gsl_vector_free (s->f);
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for dx", GSL_ENOMEM, 0);
+ }
+
+ s->state = malloc (T->size);
+
+ if (s->state == 0)
+ {
+ gsl_vector_free (s->dx);
+ gsl_vector_free (s->x);
+ gsl_vector_free (s->f);
+ gsl_matrix_free (s->J);
+ free (s); /* exception in constructor, avoid memory leak */
+
+ GSL_ERROR_VAL ("failed to allocate space for multifit solver state",
+ GSL_ENOMEM, 0);
+ }
+
+ s->type = T ;
+
+ status = (s->type->alloc)(s->state, n, p);
+
+ if (status != GSL_SUCCESS)
+ {
+ free (s->state);
+ gsl_vector_free (s->dx);
+ gsl_vector_free (s->x);
+ gsl_vector_free (s->f);
+ gsl_matrix_free (s->J);
+ free (s); /* exception in constructor, avoid memory leak */
+
+ GSL_ERROR_VAL ("failed to set solver", status, 0);
+ }
+
+ s->fdf = NULL;
+
+ return s;
+}
+
+int
+gsl_multifit_fdfsolver_set (gsl_multifit_fdfsolver * s,
+ gsl_multifit_function_fdf * f,
+ const gsl_vector * x)
+{
+ if (s->f->size != f->n)
+ {
+ GSL_ERROR ("function size does not match solver", GSL_EBADLEN);
+ }
+
+ if (s->x->size != x->size)
+ {
+ GSL_ERROR ("vector length does not match solver", GSL_EBADLEN);
+ }
+
+ s->fdf = f;
+ gsl_vector_memcpy(s->x,x);
+
+ return (s->type->set) (s->state, s->fdf, s->x, s->f, s->J, s->dx);
+}
+
+int
+gsl_multifit_fdfsolver_iterate (gsl_multifit_fdfsolver * s)
+{
+ return (s->type->iterate) (s->state, s->fdf, s->x, s->f, s->J, s->dx);
+}
+
+void
+gsl_multifit_fdfsolver_free (gsl_multifit_fdfsolver * s)
+{
+ (s->type->free) (s->state);
+ free (s->state);
+ gsl_vector_free (s->dx);
+ gsl_vector_free (s->x);
+ gsl_vector_free (s->f);
+ gsl_matrix_free (s->J);
+ free (s);
+}
+
+const char *
+gsl_multifit_fdfsolver_name (const gsl_multifit_fdfsolver * s)
+{
+ return s->type->name;
+}
+
+gsl_vector *
+gsl_multifit_fdfsolver_position (const gsl_multifit_fdfsolver * s)
+{
+ return s->x;
+}
+
diff --git a/gsl-1.9/multifit/fsolver.c b/gsl-1.9/multifit/fsolver.c
new file mode 100644
index 0000000..675f75b
--- /dev/null
+++ b/gsl-1.9/multifit/fsolver.c
@@ -0,0 +1,156 @@
+/* multifit/fsolver.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_multifit_nlin.h>
+
+gsl_multifit_fsolver *
+gsl_multifit_fsolver_alloc (const gsl_multifit_fsolver_type * T,
+ size_t n, size_t p)
+{
+ int status;
+
+ gsl_multifit_fsolver * s;
+
+ if (n < p)
+ {
+ GSL_ERROR_VAL ("insufficient data points, n < p", GSL_EINVAL, 0);
+ }
+
+ s = (gsl_multifit_fsolver *) malloc (sizeof (gsl_multifit_fsolver));
+
+ if (s == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for multifit solver struct",
+ GSL_ENOMEM, 0);
+ }
+
+ s->x = gsl_vector_calloc (p);
+
+ if (s->x == 0)
+ {
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for x", GSL_ENOMEM, 0);
+ }
+
+ s->f = gsl_vector_calloc (n);
+
+ if (s->f == 0)
+ {
+ gsl_vector_free (s->x);
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for f", GSL_ENOMEM, 0);
+ }
+
+ s->dx = gsl_vector_calloc (p);
+
+ if (s->dx == 0)
+ {
+ gsl_vector_free (s->x);
+ gsl_vector_free (s->f);
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for dx", GSL_ENOMEM, 0);
+ }
+
+ s->state = malloc (T->size);
+
+ if (s->state == 0)
+ {
+ gsl_vector_free (s->dx);
+ gsl_vector_free (s->x);
+ gsl_vector_free (s->f);
+ free (s); /* exception in constructor, avoid memory leak */
+
+ GSL_ERROR_VAL ("failed to allocate space for multifit solver state",
+ GSL_ENOMEM, 0);
+ }
+
+ s->type = T ;
+
+ status = (s->type->alloc)(s->state, n, p);
+
+ if (status != GSL_SUCCESS)
+ {
+ (s->type->free)(s->state);
+ free (s->state);
+ gsl_vector_free (s->dx);
+ gsl_vector_free (s->x);
+ gsl_vector_free (s->f);
+ free (s); /* exception in constructor, avoid memory leak */
+
+ GSL_ERROR_VAL ("failed to set solver", status, 0);
+ }
+
+ s->function = NULL;
+
+ return s;
+}
+
+int
+gsl_multifit_fsolver_set (gsl_multifit_fsolver * s,
+ gsl_multifit_function * f,
+ const gsl_vector * x)
+{
+ if (s->f->size != f->n)
+ {
+ GSL_ERROR ("function size does not match solver", GSL_EBADLEN);
+ }
+
+ if (s->x->size != x->size)
+ {
+ GSL_ERROR ("vector length does not match solver", GSL_EBADLEN);
+ }
+
+ s->function = f;
+ gsl_vector_memcpy(s->x,x);
+
+ return (s->type->set) (s->state, s->function, s->x, s->f, s->dx);
+}
+
+int
+gsl_multifit_fsolver_iterate (gsl_multifit_fsolver * s)
+{
+ return (s->type->iterate) (s->state, s->function, s->x, s->f, s->dx);
+}
+
+void
+gsl_multifit_fsolver_free (gsl_multifit_fsolver * s)
+{
+ (s->type->free) (s->state);
+ free (s->state);
+ gsl_vector_free (s->dx);
+ gsl_vector_free (s->x);
+ gsl_vector_free (s->f);
+ free (s);
+}
+
+const char *
+gsl_multifit_fsolver_name (const gsl_multifit_fsolver * s)
+{
+ return s->type->name;
+}
+
+gsl_vector *
+gsl_multifit_fsolver_position (const gsl_multifit_fsolver * s)
+{
+ return s->x;
+}
diff --git a/gsl-1.9/multifit/gradient.c b/gsl-1.9/multifit/gradient.c
new file mode 100644
index 0000000..fd31f95
--- /dev/null
+++ b/gsl-1.9/multifit/gradient.c
@@ -0,0 +1,33 @@
+/* multifit/covar.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_multifit_nlin.h>
+#include <gsl/gsl_blas.h>
+
+int
+gsl_multifit_gradient (const gsl_matrix * J, const gsl_vector * f,
+ gsl_vector * g)
+{
+ int status = gsl_blas_dgemv (CblasTrans, 1.0, J, f, 0.0, g);
+ return status;
+}
+
diff --git a/gsl-1.9/multifit/gsl_multifit.h b/gsl-1.9/multifit/gsl_multifit.h
new file mode 100644
index 0000000..e408b0d
--- /dev/null
+++ b/gsl-1.9/multifit/gsl_multifit.h
@@ -0,0 +1,106 @@
+/* multifit/gsl_multifit.h
+ *
+ * Copyright (C) 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_MULTIFIT_H__
+#define __GSL_MULTIFIT_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_matrix.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+typedef struct
+{
+ size_t n; /* number of observations */
+ size_t p; /* number of parameters */
+ gsl_matrix * A;
+ gsl_matrix * Q;
+ gsl_matrix * QSI;
+ gsl_vector * S;
+ gsl_vector * t;
+ gsl_vector * xt;
+ gsl_vector * D;
+}
+gsl_multifit_linear_workspace;
+
+gsl_multifit_linear_workspace *
+gsl_multifit_linear_alloc (size_t n, size_t p);
+
+void
+gsl_multifit_linear_free (gsl_multifit_linear_workspace * work);
+
+int
+gsl_multifit_linear (const gsl_matrix * X,
+ const gsl_vector * y,
+ gsl_vector * c,
+ gsl_matrix * cov,
+ double * chisq,
+ gsl_multifit_linear_workspace * work);
+
+int
+gsl_multifit_linear_svd (const gsl_matrix * X,
+ const gsl_vector * y,
+ double tol,
+ size_t * rank,
+ gsl_vector * c,
+ gsl_matrix * cov,
+ double *chisq,
+ gsl_multifit_linear_workspace * work);
+
+int
+gsl_multifit_wlinear (const gsl_matrix * X,
+ const gsl_vector * w,
+ const gsl_vector * y,
+ gsl_vector * c,
+ gsl_matrix * cov,
+ double * chisq,
+ gsl_multifit_linear_workspace * work);
+
+int
+gsl_multifit_wlinear_svd (const gsl_matrix * X,
+ const gsl_vector * w,
+ const gsl_vector * y,
+ double tol,
+ size_t * rank,
+ gsl_vector * c,
+ gsl_matrix * cov,
+ double *chisq,
+ gsl_multifit_linear_workspace * work);
+
+int
+gsl_multifit_linear_est (const gsl_vector * x,
+ const gsl_vector * c,
+ const gsl_matrix * cov, double *y, double *y_err);
+
+
+__END_DECLS
+
+#endif /* __GSL_MULTIFIT_H__ */
diff --git a/gsl-1.9/multifit/gsl_multifit_nlin.h b/gsl-1.9/multifit/gsl_multifit_nlin.h
new file mode 100644
index 0000000..6d37960
--- /dev/null
+++ b/gsl-1.9/multifit/gsl_multifit_nlin.h
@@ -0,0 +1,172 @@
+/* multifit_nlin/gsl_multifit_nlin.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_MULTIFIT_NLIN_H__
+#define __GSL_MULTIFIT_NLIN_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_types.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_matrix.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+int gsl_multifit_gradient (const gsl_matrix * J, const gsl_vector * f,
+ gsl_vector * g);
+
+int gsl_multifit_covar (const gsl_matrix * J, double epsrel, gsl_matrix * covar);
+
+
+/* Definition of vector-valued functions with parameters based on gsl_vector */
+
+struct gsl_multifit_function_struct
+{
+ int (* f) (const gsl_vector * x, void * params, gsl_vector * f);
+ size_t n; /* number of functions */
+ size_t p; /* number of independent variables */
+ void * params;
+};
+
+typedef struct gsl_multifit_function_struct gsl_multifit_function ;
+
+#define GSL_MULTIFIT_FN_EVAL(F,x,y) (*((F)->f))(x,(F)->params,(y))
+
+typedef struct
+ {
+ const char *name;
+ size_t size;
+ int (*alloc) (void *state, size_t n, size_t p);
+ int (*set) (void *state, gsl_multifit_function * function, gsl_vector * x, gsl_vector * f, gsl_vector * dx);
+ int (*iterate) (void *state, gsl_multifit_function * function, gsl_vector * x, gsl_vector * f, gsl_vector * dx);
+ void (*free) (void *state);
+ }
+gsl_multifit_fsolver_type;
+
+typedef struct
+ {
+ const gsl_multifit_fsolver_type * type;
+ gsl_multifit_function * function ;
+ gsl_vector * x ;
+ gsl_vector * f ;
+ gsl_vector * dx ;
+ void *state;
+ }
+gsl_multifit_fsolver;
+
+gsl_multifit_fsolver *
+gsl_multifit_fsolver_alloc (const gsl_multifit_fsolver_type * T,
+ size_t n, size_t p);
+
+void gsl_multifit_fsolver_free (gsl_multifit_fsolver * s);
+
+int gsl_multifit_fsolver_set (gsl_multifit_fsolver * s,
+ gsl_multifit_function * f,
+ const gsl_vector * x);
+
+int gsl_multifit_fsolver_iterate (gsl_multifit_fsolver * s);
+
+const char * gsl_multifit_fsolver_name (const gsl_multifit_fsolver * s);
+gsl_vector * gsl_multifit_fsolver_position (const gsl_multifit_fsolver * s);
+
+/* Definition of vector-valued functions and gradient with parameters
+ based on gsl_vector */
+
+struct gsl_multifit_function_fdf_struct
+{
+ int (* f) (const gsl_vector * x, void * params, gsl_vector * f);
+ int (* df) (const gsl_vector * x, void * params, gsl_matrix * df);
+ int (* fdf) (const gsl_vector * x, void * params, gsl_vector * f, gsl_matrix *df);
+ size_t n; /* number of functions */
+ size_t p; /* number of independent variables */
+ void * params;
+};
+
+typedef struct gsl_multifit_function_fdf_struct gsl_multifit_function_fdf ;
+
+#define GSL_MULTIFIT_FN_EVAL_F(F,x,y) ((*((F)->f))(x,(F)->params,(y)))
+#define GSL_MULTIFIT_FN_EVAL_DF(F,x,dy) ((*((F)->df))(x,(F)->params,(dy)))
+#define GSL_MULTIFIT_FN_EVAL_F_DF(F,x,y,dy) ((*((F)->fdf))(x,(F)->params,(y),(dy)))
+
+typedef struct
+ {
+ const char *name;
+ size_t size;
+ int (*alloc) (void *state, size_t n, size_t p);
+ int (*set) (void *state, gsl_multifit_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_matrix * J, gsl_vector * dx);
+ int (*iterate) (void *state, gsl_multifit_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_matrix * J, gsl_vector * dx);
+ void (*free) (void *state);
+ }
+gsl_multifit_fdfsolver_type;
+
+typedef struct
+ {
+ const gsl_multifit_fdfsolver_type * type;
+ gsl_multifit_function_fdf * fdf ;
+ gsl_vector * x;
+ gsl_vector * f;
+ gsl_matrix * J;
+ gsl_vector * dx;
+ void *state;
+ }
+gsl_multifit_fdfsolver;
+
+
+gsl_multifit_fdfsolver *
+gsl_multifit_fdfsolver_alloc (const gsl_multifit_fdfsolver_type * T,
+ size_t n, size_t p);
+
+int
+gsl_multifit_fdfsolver_set (gsl_multifit_fdfsolver * s,
+ gsl_multifit_function_fdf * fdf,
+ const gsl_vector * x);
+
+int
+gsl_multifit_fdfsolver_iterate (gsl_multifit_fdfsolver * s);
+
+void
+gsl_multifit_fdfsolver_free (gsl_multifit_fdfsolver * s);
+
+const char * gsl_multifit_fdfsolver_name (const gsl_multifit_fdfsolver * s);
+gsl_vector * gsl_multifit_fdfsolver_position (const gsl_multifit_fdfsolver * s);
+
+int gsl_multifit_test_delta (const gsl_vector * dx, const gsl_vector * x,
+ double epsabs, double epsrel);
+
+int gsl_multifit_test_gradient (const gsl_vector * g, double epsabs);
+
+/* extern const gsl_multifit_fsolver_type * gsl_multifit_fsolver_gradient; */
+
+GSL_VAR const gsl_multifit_fdfsolver_type * gsl_multifit_fdfsolver_lmder;
+GSL_VAR const gsl_multifit_fdfsolver_type * gsl_multifit_fdfsolver_lmsder;
+
+
+__END_DECLS
+
+#endif /* __GSL_MULTIFIT_NLIN_H__ */
diff --git a/gsl-1.9/multifit/lmder.c b/gsl-1.9/multifit/lmder.c
new file mode 100644
index 0000000..0dbeca8
--- /dev/null
+++ b/gsl-1.9/multifit/lmder.c
@@ -0,0 +1,387 @@
+/* multfit/lmder.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <float.h>
+
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_multifit_nlin.h>
+#include <gsl/gsl_blas.h>
+#include <gsl/gsl_linalg.h>
+#include <gsl/gsl_permutation.h>
+
+
+typedef struct
+ {
+ size_t iter;
+ double xnorm;
+ double fnorm;
+ double delta;
+ double par;
+ gsl_matrix *r;
+ gsl_vector *tau;
+ gsl_vector *diag;
+ gsl_vector *qtf;
+ gsl_vector *newton;
+ gsl_vector *gradient;
+ gsl_vector *x_trial;
+ gsl_vector *f_trial;
+ gsl_vector *df;
+ gsl_vector *sdiag;
+ gsl_vector *rptdx;
+ gsl_vector *w;
+ gsl_vector *work1;
+ gsl_permutation * perm;
+ }
+lmder_state_t;
+
+static int lmder_alloc (void *vstate, size_t n, size_t p);
+static int lmder_set (void *vstate, gsl_multifit_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_matrix * J, gsl_vector * dx);
+static int lmsder_set (void *vstate, gsl_multifit_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_matrix * J, gsl_vector * dx);
+static int set (void *vstate, gsl_multifit_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_matrix * J, gsl_vector * dx, int scale);
+static int lmder_iterate (void *vstate, gsl_multifit_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_matrix * J, gsl_vector * dx);
+static void lmder_free (void *vstate);
+static int iterate (void *vstate, gsl_multifit_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_matrix * J, gsl_vector * dx, int scale);
+
+#include "lmutil.c"
+#include "lmpar.c"
+#include "lmset.c"
+#include "lmiterate.c"
+
+
+static int
+lmder_alloc (void *vstate, size_t n, size_t p)
+{
+ lmder_state_t *state = (lmder_state_t *) vstate;
+ gsl_matrix *r;
+ gsl_vector *tau, *diag, *qtf, *newton, *gradient, *x_trial, *f_trial,
+ *df, *sdiag, *rptdx, *w, *work1;
+ gsl_permutation *perm;
+
+ r = gsl_matrix_calloc (n, p);
+
+ if (r == 0)
+ {
+ GSL_ERROR ("failed to allocate space for r", GSL_ENOMEM);
+ }
+
+ state->r = r;
+
+ tau = gsl_vector_calloc (GSL_MIN(n, p));
+
+ if (tau == 0)
+ {
+ gsl_matrix_free (r);
+
+ GSL_ERROR ("failed to allocate space for tau", GSL_ENOMEM);
+ }
+
+ state->tau = tau;
+
+ diag = gsl_vector_calloc (p);
+
+ if (diag == 0)
+ {
+ gsl_matrix_free (r);
+ gsl_vector_free (tau);
+
+ GSL_ERROR ("failed to allocate space for diag", GSL_ENOMEM);
+ }
+
+ state->diag = diag;
+
+ qtf = gsl_vector_calloc (n);
+
+ if (qtf == 0)
+ {
+ gsl_matrix_free (r);
+ gsl_vector_free (tau);
+ gsl_vector_free (diag);
+
+ GSL_ERROR ("failed to allocate space for qtf", GSL_ENOMEM);
+ }
+
+ state->qtf = qtf;
+
+ newton = gsl_vector_calloc (p);
+
+ if (newton == 0)
+ {
+ gsl_matrix_free (r);
+ gsl_vector_free (tau);
+ gsl_vector_free (diag);
+ gsl_vector_free (qtf);
+
+ GSL_ERROR ("failed to allocate space for newton", GSL_ENOMEM);
+ }
+
+ state->newton = newton;
+
+ gradient = gsl_vector_calloc (p);
+
+ if (gradient == 0)
+ {
+ gsl_matrix_free (r);
+ gsl_vector_free (tau);
+ gsl_vector_free (diag);
+ gsl_vector_free (qtf);
+ gsl_vector_free (newton);
+
+ GSL_ERROR ("failed to allocate space for gradient", GSL_ENOMEM);
+ }
+
+ state->gradient = gradient;
+
+ x_trial = gsl_vector_calloc (p);
+
+ if (x_trial == 0)
+ {
+ gsl_matrix_free (r);
+ gsl_vector_free (tau);
+ gsl_vector_free (diag);
+ gsl_vector_free (qtf);
+ gsl_vector_free (newton);
+ gsl_vector_free (gradient);
+
+ GSL_ERROR ("failed to allocate space for x_trial", GSL_ENOMEM);
+ }
+
+ state->x_trial = x_trial;
+
+ f_trial = gsl_vector_calloc (n);
+
+ if (f_trial == 0)
+ {
+ gsl_matrix_free (r);
+ gsl_vector_free (tau);
+ gsl_vector_free (diag);
+ gsl_vector_free (qtf);
+ gsl_vector_free (newton);
+ gsl_vector_free (gradient);
+ gsl_vector_free (x_trial);
+
+ GSL_ERROR ("failed to allocate space for f_trial", GSL_ENOMEM);
+ }
+
+ state->f_trial = f_trial;
+
+ df = gsl_vector_calloc (n);
+
+ if (df == 0)
+ {
+ gsl_matrix_free (r);
+ gsl_vector_free (tau);
+ gsl_vector_free (diag);
+ gsl_vector_free (qtf);
+ gsl_vector_free (newton);
+ gsl_vector_free (gradient);
+ gsl_vector_free (x_trial);
+ gsl_vector_free (f_trial);
+
+ GSL_ERROR ("failed to allocate space for df", GSL_ENOMEM);
+ }
+
+ state->df = df;
+
+ sdiag = gsl_vector_calloc (p);
+
+ if (sdiag == 0)
+ {
+ gsl_matrix_free (r);
+ gsl_vector_free (tau);
+ gsl_vector_free (diag);
+ gsl_vector_free (qtf);
+ gsl_vector_free (newton);
+ gsl_vector_free (gradient);
+ gsl_vector_free (x_trial);
+ gsl_vector_free (f_trial);
+ gsl_vector_free (df);
+
+ GSL_ERROR ("failed to allocate space for sdiag", GSL_ENOMEM);
+ }
+
+ state->sdiag = sdiag;
+
+
+ rptdx = gsl_vector_calloc (n);
+
+ if (rptdx == 0)
+ {
+ gsl_matrix_free (r);
+ gsl_vector_free (tau);
+ gsl_vector_free (diag);
+ gsl_vector_free (qtf);
+ gsl_vector_free (newton);
+ gsl_vector_free (gradient);
+ gsl_vector_free (x_trial);
+ gsl_vector_free (f_trial);
+ gsl_vector_free (df);
+ gsl_vector_free (sdiag);
+
+ GSL_ERROR ("failed to allocate space for rptdx", GSL_ENOMEM);
+ }
+
+ state->rptdx = rptdx;
+
+ w = gsl_vector_calloc (n);
+
+ if (w == 0)
+ {
+ gsl_matrix_free (r);
+ gsl_vector_free (tau);
+ gsl_vector_free (diag);
+ gsl_vector_free (qtf);
+ gsl_vector_free (newton);
+ gsl_vector_free (gradient);
+ gsl_vector_free (x_trial);
+ gsl_vector_free (f_trial);
+ gsl_vector_free (df);
+ gsl_vector_free (sdiag);
+ gsl_vector_free (rptdx);
+
+ GSL_ERROR ("failed to allocate space for w", GSL_ENOMEM);
+ }
+
+ state->w = w;
+
+ work1 = gsl_vector_calloc (p);
+
+ if (work1 == 0)
+ {
+ gsl_matrix_free (r);
+ gsl_vector_free (tau);
+ gsl_vector_free (diag);
+ gsl_vector_free (qtf);
+ gsl_vector_free (newton);
+ gsl_vector_free (gradient);
+ gsl_vector_free (x_trial);
+ gsl_vector_free (f_trial);
+ gsl_vector_free (df);
+ gsl_vector_free (sdiag);
+ gsl_vector_free (rptdx);
+ gsl_vector_free (w);
+
+ GSL_ERROR ("failed to allocate space for work1", GSL_ENOMEM);
+ }
+
+ state->work1 = work1;
+
+ perm = gsl_permutation_calloc (p);
+
+ if (perm == 0)
+ {
+ gsl_matrix_free (r);
+ gsl_vector_free (tau);
+ gsl_vector_free (diag);
+ gsl_vector_free (qtf);
+ gsl_vector_free (newton);
+ gsl_vector_free (gradient);
+ gsl_vector_free (x_trial);
+ gsl_vector_free (f_trial);
+ gsl_vector_free (df);
+ gsl_vector_free (sdiag);
+ gsl_vector_free (rptdx);
+ gsl_vector_free (w);
+ gsl_vector_free (work1);
+
+ GSL_ERROR ("failed to allocate space for perm", GSL_ENOMEM);
+ }
+
+ state->perm = perm;
+
+ return GSL_SUCCESS;
+}
+
+static int
+lmder_set (void *vstate, gsl_multifit_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_matrix * J, gsl_vector * dx)
+{
+ int status = set (vstate, fdf, x, f, J, dx, 0);
+ return status ;
+}
+
+static int
+lmsder_set (void *vstate, gsl_multifit_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_matrix * J, gsl_vector * dx)
+{
+ int status = set (vstate, fdf, x, f, J, dx, 1);
+ return status ;
+}
+
+static int
+lmder_iterate (void *vstate, gsl_multifit_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_matrix * J, gsl_vector * dx)
+{
+ int status = iterate (vstate, fdf, x, f, J, dx, 0);
+ return status;
+}
+
+static int
+lmsder_iterate (void *vstate, gsl_multifit_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_matrix * J, gsl_vector * dx)
+{
+ int status = iterate (vstate, fdf, x, f, J, dx, 1);
+ return status;
+}
+
+static void
+lmder_free (void *vstate)
+{
+ lmder_state_t *state = (lmder_state_t *) vstate;
+
+ gsl_permutation_free (state->perm);
+ gsl_vector_free (state->work1);
+ gsl_vector_free (state->w);
+ gsl_vector_free (state->rptdx);
+ gsl_vector_free (state->sdiag);
+ gsl_vector_free (state->df);
+ gsl_vector_free (state->f_trial);
+ gsl_vector_free (state->x_trial);
+ gsl_vector_free (state->gradient);
+ gsl_vector_free (state->newton);
+ gsl_vector_free (state->qtf);
+ gsl_vector_free (state->diag);
+ gsl_vector_free (state->tau);
+ gsl_matrix_free (state->r);
+}
+
+static const gsl_multifit_fdfsolver_type lmder_type =
+{
+ "lmder", /* name */
+ sizeof (lmder_state_t),
+ &lmder_alloc,
+ &lmder_set,
+ &lmder_iterate,
+ &lmder_free
+};
+
+static const gsl_multifit_fdfsolver_type lmsder_type =
+{
+ "lmsder", /* name */
+ sizeof (lmder_state_t),
+ &lmder_alloc,
+ &lmsder_set,
+ &lmsder_iterate,
+ &lmder_free
+};
+
+const gsl_multifit_fdfsolver_type *gsl_multifit_fdfsolver_lmder = &lmder_type;
+const gsl_multifit_fdfsolver_type *gsl_multifit_fdfsolver_lmsder = &lmsder_type;
diff --git a/gsl-1.9/multifit/lmiterate.c b/gsl-1.9/multifit/lmiterate.c
new file mode 100644
index 0000000..78d0ea6
--- /dev/null
+++ b/gsl-1.9/multifit/lmiterate.c
@@ -0,0 +1,222 @@
+static int
+iterate (void *vstate, gsl_multifit_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_matrix * J, gsl_vector * dx, int scale)
+{
+ lmder_state_t *state = (lmder_state_t *) vstate;
+
+ gsl_matrix *r = state->r;
+ gsl_vector *tau = state->tau;
+ gsl_vector *diag = state->diag;
+ gsl_vector *qtf = state->qtf;
+ gsl_vector *x_trial = state->x_trial;
+ gsl_vector *f_trial = state->f_trial;
+ gsl_vector *rptdx = state->rptdx;
+ gsl_vector *newton = state->newton;
+ gsl_vector *gradient = state->gradient;
+ gsl_vector *sdiag = state->sdiag;
+ gsl_vector *w = state->w;
+ gsl_vector *work1 = state->work1;
+ gsl_permutation *perm = state->perm;
+
+ double prered, actred;
+ double pnorm, fnorm1, fnorm1p, gnorm;
+ double ratio;
+ double dirder;
+
+ int iter = 0;
+
+ double p1 = 0.1, p25 = 0.25, p5 = 0.5, p75 = 0.75, p0001 = 0.0001;
+
+ if (state->fnorm == 0.0)
+ {
+ return GSL_SUCCESS;
+ }
+
+ /* Compute qtf = Q^T f */
+
+ gsl_vector_memcpy (qtf, f);
+ gsl_linalg_QR_QTvec (r, tau, qtf);
+
+ /* Compute norm of scaled gradient */
+
+ compute_gradient_direction (r, perm, qtf, diag, gradient);
+
+ {
+ size_t iamax = gsl_blas_idamax (gradient);
+
+ gnorm = fabs(gsl_vector_get (gradient, iamax) / state->fnorm);
+ }
+
+ /* Determine the Levenberg-Marquardt parameter */
+
+lm_iteration:
+
+ iter++ ;
+
+ {
+ int status = lmpar (r, perm, qtf, diag, state->delta, &(state->par), newton, gradient, sdiag, dx, w);
+ if (status)
+ return status;
+ }
+
+ /* Take a trial step */
+
+ gsl_vector_scale (dx, -1.0); /* reverse the step to go downhill */
+
+ compute_trial_step (x, dx, state->x_trial);
+
+ pnorm = scaled_enorm (diag, dx);
+
+ if (state->iter == 1)
+ {
+ if (pnorm < state->delta)
+ {
+#ifdef DEBUG
+ printf("set delta = pnorm = %g\n" , pnorm);
+#endif
+ state->delta = pnorm;
+ }
+ }
+
+ /* Evaluate function at x + p */
+ /* return immediately if evaluation raised error */
+ {
+ int status = GSL_MULTIFIT_FN_EVAL_F (fdf, x_trial, f_trial);
+ if (status)
+ return status;
+ }
+
+ fnorm1 = enorm (f_trial);
+
+ /* Compute the scaled actual reduction */
+
+ actred = compute_actual_reduction (state->fnorm, fnorm1);
+
+#ifdef DEBUG
+ printf("lmiterate: fnorm = %g fnorm1 = %g actred = %g\n", state->fnorm, fnorm1, actred);
+#endif
+
+ /* Compute rptdx = R P^T dx, noting that |J dx| = |R P^T dx| */
+
+ compute_rptdx (r, perm, dx, rptdx);
+
+ fnorm1p = enorm (rptdx);
+
+ /* Compute the scaled predicted reduction = |J dx|^2 + 2 par |D dx|^2 */
+
+ {
+ double t1 = fnorm1p / state->fnorm;
+ double t2 = (sqrt(state->par) * pnorm) / state->fnorm;
+
+ prered = t1 * t1 + t2 * t2 / p5;
+ dirder = -(t1 * t1 + t2 * t2);
+ }
+
+ /* compute the ratio of the actual to predicted reduction */
+
+ if (prered > 0)
+ {
+ ratio = actred / prered;
+ }
+ else
+ {
+ ratio = 0;
+ }
+
+#ifdef DEBUG
+ printf("lmiterate: prered = %g dirder = %g ratio = %g\n", prered, dirder,ratio);
+#endif
+
+
+ /* update the step bound */
+
+ if (ratio > p25)
+ {
+#ifdef DEBUG
+ printf("ratio > p25\n");
+#endif
+ if (state->par == 0 || ratio >= p75)
+ {
+ state->delta = pnorm / p5;
+ state->par *= p5;
+#ifdef DEBUG
+ printf("updated step bounds: delta = %g, par = %g\n", state->delta, state->par);
+#endif
+ }
+ }
+ else
+ {
+ double temp = (actred >= 0) ? p5 : p5*dirder / (dirder + p5 * actred);
+
+#ifdef DEBUG
+ printf("ratio < p25\n");
+#endif
+
+ if (p1 * fnorm1 >= state->fnorm || temp < p1 )
+ {
+ temp = p1;
+ }
+
+ state->delta = temp * GSL_MIN_DBL (state->delta, pnorm/p1);
+
+ state->par /= temp;
+#ifdef DEBUG
+ printf("updated step bounds: delta = %g, par = %g\n", state->delta, state->par);
+#endif
+ }
+
+
+ /* test for successful iteration, termination and stringent tolerances */
+
+ if (ratio >= p0001)
+ {
+ gsl_vector_memcpy (x, x_trial);
+ gsl_vector_memcpy (f, f_trial);
+
+ /* return immediately if evaluation raised error */
+ {
+ int status = GSL_MULTIFIT_FN_EVAL_DF (fdf, x_trial, J);
+ if (status)
+ return status;
+ }
+
+ /* wa2_j = diag_j * x_j */
+ state->xnorm = scaled_enorm(diag, x);
+ state->fnorm = fnorm1;
+ state->iter++;
+
+ /* Rescale if necessary */
+
+ if (scale)
+ {
+ update_diag (J, diag);
+ }
+
+ {
+ int signum;
+ gsl_matrix_memcpy (r, J);
+ gsl_linalg_QRPT_decomp (r, tau, perm, &signum, work1);
+ }
+
+ return GSL_SUCCESS;
+ }
+ else if (fabs(actred) <= GSL_DBL_EPSILON && prered <= GSL_DBL_EPSILON
+ && p5 * ratio <= 1.0)
+ {
+ return GSL_ETOLF ;
+ }
+ else if (state->delta <= GSL_DBL_EPSILON * state->xnorm)
+ {
+ return GSL_ETOLX;
+ }
+ else if (gnorm <= GSL_DBL_EPSILON)
+ {
+ return GSL_ETOLG;
+ }
+ else if (iter < 10)
+ {
+ /* Repeat inner loop if unsuccessful */
+ goto lm_iteration;
+ }
+
+ return GSL_CONTINUE;
+}
diff --git a/gsl-1.9/multifit/lmpar.c b/gsl-1.9/multifit/lmpar.c
new file mode 100644
index 0000000..3f6f105
--- /dev/null
+++ b/gsl-1.9/multifit/lmpar.c
@@ -0,0 +1,473 @@
+/* multifit/lmpar.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <gsl/gsl_permute_vector_double.h>
+
+#include "qrsolv.c"
+
+static size_t
+count_nsing (const gsl_matrix * r)
+{
+ /* Count the number of nonsingular entries. Returns the index of the
+ first entry which is singular. */
+
+ size_t n = r->size2;
+ size_t i;
+
+ for (i = 0; i < n; i++)
+ {
+ double rii = gsl_matrix_get (r, i, i);
+
+ if (rii == 0)
+ {
+ break;
+ }
+ }
+
+ return i;
+}
+
+
+static void
+compute_newton_direction (const gsl_matrix * r, const gsl_permutation * perm,
+ const gsl_vector * qtf, gsl_vector * x)
+{
+
+ /* Compute and store in x the Gauss-Newton direction. If the
+ Jacobian is rank-deficient then obtain a least squares
+ solution. */
+
+ const size_t n = r->size2;
+ size_t i, j, nsing;
+
+ for (i = 0 ; i < n ; i++)
+ {
+ double qtfi = gsl_vector_get (qtf, i);
+ gsl_vector_set (x, i, qtfi);
+ }
+
+ nsing = count_nsing (r);
+
+#ifdef DEBUG
+ printf("nsing = %d\n", nsing);
+ printf("r = "); gsl_matrix_fprintf(stdout, r, "%g"); printf("\n");
+ printf("qtf = "); gsl_vector_fprintf(stdout, x, "%g"); printf("\n");
+#endif
+
+ for (i = nsing; i < n; i++)
+ {
+ gsl_vector_set (x, i, 0.0);
+ }
+
+ if (nsing > 0)
+ {
+ for (j = nsing; j > 0 && j--;)
+ {
+ double rjj = gsl_matrix_get (r, j, j);
+ double temp = gsl_vector_get (x, j) / rjj;
+
+ gsl_vector_set (x, j, temp);
+
+ for (i = 0; i < j; i++)
+ {
+ double rij = gsl_matrix_get (r, i, j);
+ double xi = gsl_vector_get (x, i);
+ gsl_vector_set (x, i, xi - rij * temp);
+ }
+ }
+ }
+
+ gsl_permute_vector_inverse (perm, x);
+}
+
+static void
+compute_newton_correction (const gsl_matrix * r, const gsl_vector * sdiag,
+ const gsl_permutation * p, gsl_vector * x,
+ double dxnorm,
+ const gsl_vector * diag, gsl_vector * w)
+{
+ size_t n = r->size2;
+ size_t i, j;
+
+ for (i = 0; i < n; i++)
+ {
+ size_t pi = gsl_permutation_get (p, i);
+
+ double dpi = gsl_vector_get (diag, pi);
+ double xpi = gsl_vector_get (x, pi);
+
+ gsl_vector_set (w, i, dpi * (dpi * xpi) / dxnorm);
+ }
+
+ for (j = 0; j < n; j++)
+ {
+ double sj = gsl_vector_get (sdiag, j);
+ double wj = gsl_vector_get (w, j);
+
+ double tj = wj / sj;
+
+ gsl_vector_set (w, j, tj);
+
+ for (i = j + 1; i < n; i++)
+ {
+ double rij = gsl_matrix_get (r, i, j);
+ double wi = gsl_vector_get (w, i);
+
+ gsl_vector_set (w, i, wi - rij * tj);
+ }
+ }
+}
+
+static void
+compute_newton_bound (const gsl_matrix * r, const gsl_vector * x,
+ double dxnorm, const gsl_permutation * perm,
+ const gsl_vector * diag, gsl_vector * w)
+{
+ /* If the jacobian is not rank-deficient then the Newton step
+ provides a lower bound for the zero of the function. Otherwise
+ set this bound to zero. */
+
+ size_t n = r->size2;
+
+ size_t i, j;
+
+ size_t nsing = count_nsing (r);
+
+ if (nsing < n)
+ {
+ gsl_vector_set_zero (w);
+ return;
+ }
+
+ for (i = 0; i < n; i++)
+ {
+ size_t pi = gsl_permutation_get (perm, i);
+
+ double dpi = gsl_vector_get (diag, pi);
+ double xpi = gsl_vector_get (x, pi);
+
+ gsl_vector_set (w, i, dpi * (dpi * xpi / dxnorm));
+ }
+
+ for (j = 0; j < n; j++)
+ {
+ double sum = 0;
+
+ for (i = 0; i < j; i++)
+ {
+ sum += gsl_matrix_get (r, i, j) * gsl_vector_get (w, i);
+ }
+
+ {
+ double rjj = gsl_matrix_get (r, j, j);
+ double wj = gsl_vector_get (w, j);
+
+ gsl_vector_set (w, j, (wj - sum) / rjj);
+ }
+ }
+}
+
+static void
+compute_gradient_direction (const gsl_matrix * r, const gsl_permutation * p,
+ const gsl_vector * qtf, const gsl_vector * diag,
+ gsl_vector * g)
+{
+ const size_t n = r->size2;
+
+ size_t i, j;
+
+ for (j = 0; j < n; j++)
+ {
+ double sum = 0;
+
+ for (i = 0; i <= j; i++)
+ {
+ sum += gsl_matrix_get (r, i, j) * gsl_vector_get (qtf, i);
+ }
+
+ {
+ size_t pj = gsl_permutation_get (p, j);
+ double dpj = gsl_vector_get (diag, pj);
+
+ gsl_vector_set (g, j, sum / dpj);
+ }
+ }
+}
+
+static int
+lmpar (gsl_matrix * r, const gsl_permutation * perm, const gsl_vector * qtf,
+ const gsl_vector * diag, double delta, double * par_inout,
+ gsl_vector * newton, gsl_vector * gradient, gsl_vector * sdiag,
+ gsl_vector * x, gsl_vector * w)
+{
+ double dxnorm, gnorm, fp, fp_old, par_lower, par_upper, par_c;
+
+ double par = *par_inout;
+
+ size_t iter = 0;
+
+#ifdef DEBUG
+ printf("ENTERING lmpar\n");
+#endif
+
+
+ compute_newton_direction (r, perm, qtf, newton);
+
+#ifdef DEBUG
+ printf ("newton = ");
+ gsl_vector_fprintf (stdout, newton, "%g");
+ printf ("\n");
+
+ printf ("diag = ");
+ gsl_vector_fprintf (stdout, diag, "%g");
+ printf ("\n");
+#endif
+
+ /* Evaluate the function at the origin and test for acceptance of
+ the Gauss-Newton direction. */
+
+ dxnorm = scaled_enorm (diag, newton);
+
+ fp = dxnorm - delta;
+
+#ifdef DEBUG
+ printf ("dxnorm = %g, delta = %g, fp = %g\n", dxnorm, delta, fp);
+#endif
+
+ if (fp <= 0.1 * delta)
+ {
+ gsl_vector_memcpy (x, newton);
+#ifdef DEBUG
+ printf ("took newton (fp = %g, delta = %g)\n", fp, delta);
+#endif
+
+ *par_inout = 0;
+
+ return GSL_SUCCESS;
+ }
+
+ compute_newton_bound (r, newton, dxnorm, perm, diag, w);
+
+ {
+ double wnorm = enorm (w);
+ double phider = wnorm * wnorm;
+
+ /* w == zero if r rank-deficient,
+ then set lower bound to zero form MINPACK, lmder.f
+ Hans E. Plesser 2002-02-25 (hans.plesser@itf.nlh.no) */
+ if ( wnorm > 0 )
+ par_lower = fp / (delta * phider);
+ else
+ par_lower = 0.0;
+ }
+
+#ifdef DEBUG
+ printf("par = %g\n", par );
+ printf("par_lower = %g\n", par_lower);
+#endif
+
+ compute_gradient_direction (r, perm, qtf, diag, gradient);
+
+ gnorm = enorm (gradient);
+
+#ifdef DEBUG
+ printf("gradient = "); gsl_vector_fprintf(stdout, gradient, "%g"); printf("\n");
+ printf("gnorm = %g\n", gnorm);
+#endif
+
+ par_upper = gnorm / delta;
+
+ if (par_upper == 0)
+ {
+ par_upper = GSL_DBL_MIN / GSL_MIN_DBL(delta, 0.1);
+ }
+
+#ifdef DEBUG
+ printf("par_upper = %g\n", par_upper);
+#endif
+
+ if (par > par_upper)
+ {
+#ifdef DEBUG
+ printf("set par to par_upper\n");
+#endif
+
+ par = par_upper;
+ }
+ else if (par < par_lower)
+ {
+#ifdef DEBUG
+ printf("set par to par_lower\n");
+#endif
+
+ par = par_lower;
+ }
+
+ if (par == 0)
+ {
+ par = gnorm / dxnorm;
+#ifdef DEBUG
+ printf("set par to gnorm/dxnorm = %g\n", par);
+#endif
+
+ }
+
+ /* Beginning of iteration */
+
+iteration:
+
+ iter++;
+
+#ifdef DEBUG
+ printf("lmpar iteration = %d\n", iter);
+#endif
+
+#ifdef BRIANSFIX
+ /* Seems like this is described in the paper but not in the MINPACK code */
+
+ if (par < par_lower || par > par_upper)
+ {
+ par = GSL_MAX_DBL (0.001 * par_upper, sqrt(par_lower * par_upper));
+ }
+#endif
+
+ /* Evaluate the function at the current value of par */
+
+ if (par == 0)
+ {
+ par = GSL_MAX_DBL (0.001 * par_upper, GSL_DBL_MIN);
+#ifdef DEBUG
+ printf("par = 0, set par to = %g\n", par);
+#endif
+
+ }
+
+ /* Compute the least squares solution of [ R P x - Q^T f, sqrt(par) D x]
+ for A = Q R P^T */
+
+#ifdef DEBUG
+ printf ("calling qrsolv with par = %g\n", par);
+#endif
+
+ {
+ double sqrt_par = sqrt(par);
+
+ qrsolv (r, perm, sqrt_par, diag, qtf, x, sdiag, w);
+ }
+
+ dxnorm = scaled_enorm (diag, x);
+
+ fp_old = fp;
+
+ fp = dxnorm - delta;
+
+#ifdef DEBUG
+ printf ("After qrsolv dxnorm = %g, delta = %g, fp = %g\n", dxnorm, delta, fp);
+ printf ("sdiag = ") ; gsl_vector_fprintf(stdout, sdiag, "%g"); printf("\n");
+ printf ("x = ") ; gsl_vector_fprintf(stdout, x, "%g"); printf("\n");
+ printf ("r = ") ; gsl_matrix_fprintf(stdout, r, "%g"); printf("\nXXX\n");
+#endif
+
+ /* If the function is small enough, accept the current value of par */
+
+ if (fabs (fp) <= 0.1 * delta)
+ goto line220;
+
+ if (par_lower == 0 && fp <= fp_old && fp_old < 0)
+ goto line220;
+
+ /* Check for maximum number of iterations */
+
+ if (iter == 10)
+ goto line220;
+
+ /* Compute the Newton correction */
+
+ compute_newton_correction (r, sdiag, perm, x, dxnorm, diag, w);
+
+#ifdef DEBUG
+ printf ("newton_correction = ");
+ gsl_vector_fprintf(stdout, w, "%g"); printf("\n");
+#endif
+
+ {
+ double wnorm = enorm (w);
+ par_c = fp / (delta * wnorm * wnorm);
+ }
+
+#ifdef DEBUG
+ printf("fp = %g\n", fp);
+ printf("par_lower = %g\n", par_lower);
+ printf("par_upper = %g\n", par_upper);
+ printf("par_c = %g\n", par_c);
+#endif
+
+
+ /* Depending on the sign of the function, update par_lower or par_upper */
+
+ if (fp > 0)
+ {
+ if (par > par_lower)
+ {
+ par_lower = par;
+#ifdef DEBUG
+ printf("fp > 0: set par_lower = par = %g\n", par);
+#endif
+
+ }
+ }
+ else if (fp < 0)
+ {
+ if (par < par_upper)
+ {
+#ifdef DEBUG
+ printf("fp < 0: set par_upper = par = %g\n", par);
+#endif
+ par_upper = par;
+ }
+ }
+
+ /* Compute an improved estimate for par */
+
+#ifdef DEBUG
+ printf("improved estimate par = MAX(%g, %g) \n", par_lower, par+par_c);
+#endif
+
+ par = GSL_MAX_DBL (par_lower, par + par_c);
+
+#ifdef DEBUG
+ printf("improved estimate par = %g \n", par);
+#endif
+
+
+ goto iteration;
+
+line220:
+
+#ifdef DEBUG
+ printf("LEAVING lmpar, par = %g\n", par);
+#endif
+
+ *par_inout = par;
+
+ return GSL_SUCCESS;
+}
+
+
+
diff --git a/gsl-1.9/multifit/lmset.c b/gsl-1.9/multifit/lmset.c
new file mode 100644
index 0000000..f6a97cc
--- /dev/null
+++ b/gsl-1.9/multifit/lmset.c
@@ -0,0 +1,44 @@
+static int
+set (void *vstate, gsl_multifit_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_matrix * J, gsl_vector * dx, int scale)
+{
+ lmder_state_t *state = (lmder_state_t *) vstate;
+
+ gsl_matrix *r = state->r;
+ gsl_vector *tau = state->tau;
+ gsl_vector *diag = state->diag;
+ gsl_vector *work1 = state->work1;
+ gsl_permutation *perm = state->perm;
+
+ int signum;
+
+ GSL_MULTIFIT_FN_EVAL_F_DF (fdf, x, f, J);
+
+ state->par = 0;
+ state->iter = 1;
+ state->fnorm = enorm (f);
+
+ gsl_vector_set_all (dx, 0.0);
+
+ /* store column norms in diag */
+
+ if (scale)
+ {
+ compute_diag (J, diag);
+ }
+ else
+ {
+ gsl_vector_set_all (diag, 1.0);
+ }
+
+ /* set delta to 100 |D x| or to 100 if |D x| is zero */
+
+ state->xnorm = scaled_enorm (diag, x);
+ state->delta = compute_delta (diag, x);
+
+ /* Factorize J into QR decomposition */
+
+ gsl_matrix_memcpy (r, J);
+ gsl_linalg_QRPT_decomp (r, tau, perm, &signum, work1);
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/multifit/lmutil.c b/gsl-1.9/multifit/lmutil.c
new file mode 100644
index 0000000..1f06178
--- /dev/null
+++ b/gsl-1.9/multifit/lmutil.c
@@ -0,0 +1,134 @@
+static void compute_diag (const gsl_matrix * J, gsl_vector * diag);
+static void update_diag (const gsl_matrix * J, gsl_vector * diag);
+static double compute_delta (gsl_vector * diag, gsl_vector * x);
+static double scaled_enorm (const gsl_vector * d, const gsl_vector * f);
+static double enorm (const gsl_vector * f);
+
+static double
+enorm (const gsl_vector * f)
+{
+ return gsl_blas_dnrm2 (f);
+}
+
+static double
+scaled_enorm (const gsl_vector * d, const gsl_vector * f)
+{
+ double e2 = 0;
+ size_t i, n = f->size;
+ for (i = 0; i < n; i++)
+ {
+ double fi = gsl_vector_get (f, i);
+ double di = gsl_vector_get (d, i);
+ double u = di * fi;
+ e2 += u * u;
+ }
+ return sqrt (e2);
+}
+
+static double
+compute_delta (gsl_vector * diag, gsl_vector * x)
+{
+ double Dx = scaled_enorm (diag, x);
+ double factor = 100; /* generally recommended value from MINPACK */
+
+ return (Dx > 0) ? factor * Dx : factor;
+}
+
+static double
+compute_actual_reduction (double fnorm, double fnorm1)
+{
+ double actred;
+
+ if (0.1 * fnorm1 < fnorm)
+ {
+ double u = fnorm1 / fnorm;
+ actred = 1 - u * u;
+ }
+ else
+ {
+ actred = -1;
+ }
+
+ return actred;
+}
+
+static void
+compute_diag (const gsl_matrix * J, gsl_vector * diag)
+{
+ size_t i, j, n = J->size1, p = J->size2;
+
+ for (j = 0; j < p; j++)
+ {
+ double sum = 0;
+
+ for (i = 0; i < n; i++)
+ {
+ double Jij = gsl_matrix_get (J, i, j);
+ sum += Jij * Jij;
+ }
+ if (sum == 0)
+ sum = 1.0;
+
+ gsl_vector_set (diag, j, sqrt (sum));
+ }
+}
+
+static void
+update_diag (const gsl_matrix * J, gsl_vector * diag)
+{
+ size_t i, j, n = diag->size;
+
+ for (j = 0; j < n; j++)
+ {
+ double cnorm, diagj, sum = 0;
+ for (i = 0; i < n; i++)
+ {
+ double Jij = gsl_matrix_get (J, i, j);
+ sum += Jij * Jij;
+ }
+ if (sum == 0)
+ sum = 1.0;
+
+ cnorm = sqrt (sum);
+ diagj = gsl_vector_get (diag, j);
+
+ if (cnorm > diagj)
+ gsl_vector_set (diag, j, cnorm);
+ }
+}
+
+static void
+compute_rptdx (const gsl_matrix * r, const gsl_permutation * p,
+ const gsl_vector * dx, gsl_vector * rptdx)
+{
+ size_t i, j, N = dx->size;
+
+ for (i = 0; i < N; i++)
+ {
+ double sum = 0;
+
+ for (j = i; j < N; j++)
+ {
+ size_t pj = gsl_permutation_get (p, j);
+
+ sum += gsl_matrix_get (r, i, j) * gsl_vector_get (dx, pj);
+ }
+
+ gsl_vector_set (rptdx, i, sum);
+ }
+}
+
+
+static void
+compute_trial_step (gsl_vector * x, gsl_vector * dx, gsl_vector * x_trial)
+{
+ size_t i, N = x->size;
+
+ for (i = 0; i < N; i++)
+ {
+ double pi = gsl_vector_get (dx, i);
+ double xi = gsl_vector_get (x, i);
+ gsl_vector_set (x_trial, i, xi + pi);
+ }
+}
+
diff --git a/gsl-1.9/multifit/multilinear.c b/gsl-1.9/multifit/multilinear.c
new file mode 100644
index 0000000..6616809
--- /dev/null
+++ b/gsl-1.9/multifit/multilinear.c
@@ -0,0 +1,432 @@
+/* multifit/multilinear.c
+ *
+ * Copyright (C) 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_multifit.h>
+#include <gsl/gsl_blas.h>
+#include <gsl/gsl_linalg.h>
+
+/* Fit
+ *
+ * y = X c
+ *
+ * where X is an M x N matrix of M observations for N variables.
+ *
+ */
+
+int
+gsl_multifit_linear (const gsl_matrix * X,
+ const gsl_vector * y,
+ gsl_vector * c,
+ gsl_matrix * cov,
+ double *chisq, gsl_multifit_linear_workspace * work)
+{
+ size_t rank;
+ int status = gsl_multifit_linear_svd (X, y, GSL_DBL_EPSILON, &rank, c,
+ cov, chisq, work);
+ return status;
+}
+
+/* Handle the general case of the SVD with tolerance and rank */
+
+int
+gsl_multifit_linear_svd (const gsl_matrix * X,
+ const gsl_vector * y,
+ double tol,
+ size_t * rank,
+ gsl_vector * c,
+ gsl_matrix * cov,
+ double *chisq, gsl_multifit_linear_workspace * work)
+{
+ if (X->size1 != y->size)
+ {
+ GSL_ERROR
+ ("number of observations in y does not match rows of matrix X",
+ GSL_EBADLEN);
+ }
+ else if (X->size2 != c->size)
+ {
+ GSL_ERROR ("number of parameters c does not match columns of matrix X",
+ GSL_EBADLEN);
+ }
+ else if (cov->size1 != cov->size2)
+ {
+ GSL_ERROR ("covariance matrix is not square", GSL_ENOTSQR);
+ }
+ else if (c->size != cov->size1)
+ {
+ GSL_ERROR
+ ("number of parameters does not match size of covariance matrix",
+ GSL_EBADLEN);
+ }
+ else if (X->size1 != work->n || X->size2 != work->p)
+ {
+ GSL_ERROR
+ ("size of workspace does not match size of observation matrix",
+ GSL_EBADLEN);
+ }
+ else if (tol <= 0)
+ {
+ GSL_ERROR ("tolerance must be positive", GSL_EINVAL);
+ }
+ else
+ {
+ const size_t n = X->size1;
+ const size_t p = X->size2;
+
+ size_t i, j, p_eff;
+
+ gsl_matrix *A = work->A;
+ gsl_matrix *Q = work->Q;
+ gsl_matrix *QSI = work->QSI;
+ gsl_vector *S = work->S;
+ gsl_vector *xt = work->xt;
+ gsl_vector *D = work->D;
+
+ /* Copy X to workspace, A <= X */
+
+ gsl_matrix_memcpy (A, X);
+
+ /* Balance the columns of the matrix A */
+
+ gsl_linalg_balance_columns (A, D);
+
+ /* Decompose A into U S Q^T */
+
+ gsl_linalg_SV_decomp_mod (A, QSI, Q, S, xt);
+
+ /* Solve y = A c for c */
+
+ gsl_blas_dgemv (CblasTrans, 1.0, A, y, 0.0, xt);
+
+ /* Scale the matrix Q, Q' = Q S^-1 */
+
+ gsl_matrix_memcpy (QSI, Q);
+
+ {
+ double alpha0 = gsl_vector_get (S, 0);
+ p_eff = 0;
+
+ for (j = 0; j < p; j++)
+ {
+ gsl_vector_view column = gsl_matrix_column (QSI, j);
+ double alpha = gsl_vector_get (S, j);
+
+ if (alpha <= tol * alpha0) {
+ alpha = 0.0;
+ } else {
+ alpha = 1.0 / alpha;
+ p_eff++;
+ }
+
+ gsl_vector_scale (&column.vector, alpha);
+ }
+
+ *rank = p_eff;
+ }
+
+ gsl_vector_set_zero (c);
+
+ gsl_blas_dgemv (CblasNoTrans, 1.0, QSI, xt, 0.0, c);
+
+ /* Unscale the balancing factors */
+
+ gsl_vector_div (c, D);
+
+ /* Compute chisq, from residual r = y - X c */
+
+ {
+ double s2 = 0, r2 = 0;
+
+ for (i = 0; i < n; i++)
+ {
+ double yi = gsl_vector_get (y, i);
+ gsl_vector_const_view row = gsl_matrix_const_row (X, i);
+ double y_est, ri;
+ gsl_blas_ddot (&row.vector, c, &y_est);
+ ri = yi - y_est;
+ r2 += ri * ri;
+ }
+
+ s2 = r2 / (n - p_eff); /* p_eff == rank */
+
+ *chisq = r2;
+
+ /* Form variance-covariance matrix cov = s2 * (Q S^-1) (Q S^-1)^T */
+
+ for (i = 0; i < p; i++)
+ {
+ gsl_vector_view row_i = gsl_matrix_row (QSI, i);
+ double d_i = gsl_vector_get (D, i);
+
+ for (j = i; j < p; j++)
+ {
+ gsl_vector_view row_j = gsl_matrix_row (QSI, j);
+ double d_j = gsl_vector_get (D, j);
+ double s;
+
+ gsl_blas_ddot (&row_i.vector, &row_j.vector, &s);
+
+ gsl_matrix_set (cov, i, j, s * s2 / (d_i * d_j));
+ gsl_matrix_set (cov, j, i, s * s2 / (d_i * d_j));
+ }
+ }
+ }
+
+ return GSL_SUCCESS;
+ }
+}
+
+int
+gsl_multifit_wlinear (const gsl_matrix * X,
+ const gsl_vector * w,
+ const gsl_vector * y,
+ gsl_vector * c,
+ gsl_matrix * cov,
+ double *chisq, gsl_multifit_linear_workspace * work)
+{
+ size_t rank;
+ int status = gsl_multifit_wlinear_svd (X, w, y, GSL_DBL_EPSILON, &rank, c,
+ cov, chisq, work);
+ return status;
+}
+
+
+int
+gsl_multifit_wlinear_svd (const gsl_matrix * X,
+ const gsl_vector * w,
+ const gsl_vector * y,
+ double tol,
+ size_t * rank,
+ gsl_vector * c,
+ gsl_matrix * cov,
+ double *chisq, gsl_multifit_linear_workspace * work)
+{
+ if (X->size1 != y->size)
+ {
+ GSL_ERROR
+ ("number of observations in y does not match rows of matrix X",
+ GSL_EBADLEN);
+ }
+ else if (X->size2 != c->size)
+ {
+ GSL_ERROR ("number of parameters c does not match columns of matrix X",
+ GSL_EBADLEN);
+ }
+ else if (w->size != y->size)
+ {
+ GSL_ERROR ("number of weights does not match number of observations",
+ GSL_EBADLEN);
+ }
+ else if (cov->size1 != cov->size2)
+ {
+ GSL_ERROR ("covariance matrix is not square", GSL_ENOTSQR);
+ }
+ else if (c->size != cov->size1)
+ {
+ GSL_ERROR
+ ("number of parameters does not match size of covariance matrix",
+ GSL_EBADLEN);
+ }
+ else if (X->size1 != work->n || X->size2 != work->p)
+ {
+ GSL_ERROR
+ ("size of workspace does not match size of observation matrix",
+ GSL_EBADLEN);
+ }
+ else
+ {
+ const size_t n = X->size1;
+ const size_t p = X->size2;
+
+ size_t i, j, p_eff;
+
+ gsl_matrix *A = work->A;
+ gsl_matrix *Q = work->Q;
+ gsl_matrix *QSI = work->QSI;
+ gsl_vector *S = work->S;
+ gsl_vector *t = work->t;
+ gsl_vector *xt = work->xt;
+ gsl_vector *D = work->D;
+
+ /* Scale X, A = sqrt(w) X */
+
+ gsl_matrix_memcpy (A, X);
+
+ for (i = 0; i < n; i++)
+ {
+ double wi = gsl_vector_get (w, i);
+
+ if (wi < 0)
+ wi = 0;
+
+ {
+ gsl_vector_view row = gsl_matrix_row (A, i);
+ gsl_vector_scale (&row.vector, sqrt (wi));
+ }
+ }
+
+ /* Balance the columns of the matrix A */
+
+ gsl_linalg_balance_columns (A, D);
+
+ /* Decompose A into U S Q^T */
+
+ gsl_linalg_SV_decomp_mod (A, QSI, Q, S, xt);
+
+ /* Solve sqrt(w) y = A c for c, by first computing t = sqrt(w) y */
+
+ for (i = 0; i < n; i++)
+ {
+ double wi = gsl_vector_get (w, i);
+ double yi = gsl_vector_get (y, i);
+ if (wi < 0)
+ wi = 0;
+ gsl_vector_set (t, i, sqrt (wi) * yi);
+ }
+
+ gsl_blas_dgemv (CblasTrans, 1.0, A, t, 0.0, xt);
+
+ /* Scale the matrix Q, Q' = Q S^-1 */
+
+ gsl_matrix_memcpy (QSI, Q);
+
+ {
+ double alpha0 = gsl_vector_get (S, 0);
+ p_eff = 0;
+
+ for (j = 0; j < p; j++)
+ {
+ gsl_vector_view column = gsl_matrix_column (QSI, j);
+ double alpha = gsl_vector_get (S, j);
+
+ if (alpha <= tol * alpha0) {
+ alpha = 0.0;
+ } else {
+ alpha = 1.0 / alpha;
+ p_eff++;
+ }
+
+ gsl_vector_scale (&column.vector, alpha);
+ }
+
+ *rank = p_eff;
+ }
+
+ gsl_vector_set_zero (c);
+
+ /* Solution */
+
+ gsl_blas_dgemv (CblasNoTrans, 1.0, QSI, xt, 0.0, c);
+
+ /* Unscale the balancing factors */
+
+ gsl_vector_div (c, D);
+
+ /* Form covariance matrix cov = (Q S^-1) (Q S^-1)^T */
+
+ for (i = 0; i < p; i++)
+ {
+ gsl_vector_view row_i = gsl_matrix_row (QSI, i);
+ double d_i = gsl_vector_get (D, i);
+
+ for (j = i; j < p; j++)
+ {
+ gsl_vector_view row_j = gsl_matrix_row (QSI, j);
+ double d_j = gsl_vector_get (D, j);
+ double s;
+
+ gsl_blas_ddot (&row_i.vector, &row_j.vector, &s);
+
+ gsl_matrix_set (cov, i, j, s / (d_i * d_j));
+ gsl_matrix_set (cov, j, i, s / (d_i * d_j));
+ }
+ }
+
+ /* Compute chisq, from residual r = y - X c */
+
+ {
+ double r2 = 0;
+
+ for (i = 0; i < n; i++)
+ {
+ double yi = gsl_vector_get (y, i);
+ double wi = gsl_vector_get (w, i);
+ gsl_vector_const_view row = gsl_matrix_const_row (X, i);
+ double y_est, ri;
+ gsl_blas_ddot (&row.vector, c, &y_est);
+ ri = yi - y_est;
+ r2 += wi * ri * ri;
+ }
+
+ *chisq = r2;
+ }
+
+ return GSL_SUCCESS;
+ }
+}
+
+
+int
+gsl_multifit_linear_est (const gsl_vector * x,
+ const gsl_vector * c,
+ const gsl_matrix * cov, double *y, double *y_err)
+{
+
+ if (x->size != c->size)
+ {
+ GSL_ERROR ("number of parameters c does not match number of observations x",
+ GSL_EBADLEN);
+ }
+ else if (cov->size1 != cov->size2)
+ {
+ GSL_ERROR ("covariance matrix is not square", GSL_ENOTSQR);
+ }
+ else if (c->size != cov->size1)
+ {
+ GSL_ERROR ("number of parameters c does not match size of covariance matrix cov",
+ GSL_EBADLEN);
+ }
+ else
+ {
+ size_t i, j;
+ double var = 0;
+
+ gsl_blas_ddot(x, c, y); /* y = x.c */
+
+ /* var = x' cov x */
+
+ for (i = 0; i < x->size; i++)
+ {
+ const double xi = gsl_vector_get (x, i);
+ var += xi * xi * gsl_matrix_get (cov, i, i);
+
+ for (j = 0; j < i; j++)
+ {
+ const double xj = gsl_vector_get (x, j);
+ var += 2 * xi * xj * gsl_matrix_get (cov, i, j);
+ }
+ }
+
+ *y_err = sqrt (var);
+
+ return GSL_SUCCESS;
+ }
+}
diff --git a/gsl-1.9/multifit/qrsolv.c b/gsl-1.9/multifit/qrsolv.c
new file mode 100644
index 0000000..06f0399
--- /dev/null
+++ b/gsl-1.9/multifit/qrsolv.c
@@ -0,0 +1,218 @@
+/* This function computes the solution to the least squares system
+
+ phi = [ A x = b , lambda D x = 0 ]^2
+
+ where A is an M by N matrix, D is an N by N diagonal matrix, lambda
+ is a scalar parameter and b is a vector of length M.
+
+ The function requires the factorization of A into A = Q R P^T,
+ where Q is an orthogonal matrix, R is an upper triangular matrix
+ with diagonal elements of non-increasing magnitude and P is a
+ permuation matrix. The system above is then equivalent to
+
+ [ R z = Q^T b, P^T (lambda D) P z = 0 ]
+
+ where x = P z. If this system does not have full rank then a least
+ squares solution is obtained. On output the function also provides
+ an upper triangular matrix S such that
+
+ P^T (A^T A + lambda^2 D^T D) P = S^T S
+
+ Parameters,
+
+ r: On input, contains the full upper triangle of R. On output the
+ strict lower triangle contains the transpose of the strict upper
+ triangle of S, and the diagonal of S is stored in sdiag. The full
+ upper triangle of R is not modified.
+
+ p: the encoded form of the permutation matrix P. column j of P is
+ column p[j] of the identity matrix.
+
+ lambda, diag: contains the scalar lambda and the diagonal elements
+ of the matrix D
+
+ qtb: contains the product Q^T b
+
+ x: on output contains the least squares solution of the system
+
+ wa: is a workspace of length N
+
+ */
+
+static int
+qrsolv (gsl_matrix * r, const gsl_permutation * p, const double lambda,
+ const gsl_vector * diag, const gsl_vector * qtb,
+ gsl_vector * x, gsl_vector * sdiag, gsl_vector * wa)
+{
+ size_t n = r->size2;
+
+ size_t i, j, k, nsing;
+
+ /* Copy r and qtb to preserve input and initialise s. In particular,
+ save the diagonal elements of r in x */
+
+ for (j = 0; j < n; j++)
+ {
+ double rjj = gsl_matrix_get (r, j, j);
+ double qtbj = gsl_vector_get (qtb, j);
+
+ for (i = j + 1; i < n; i++)
+ {
+ double rji = gsl_matrix_get (r, j, i);
+ gsl_matrix_set (r, i, j, rji);
+ }
+
+ gsl_vector_set (x, j, rjj);
+ gsl_vector_set (wa, j, qtbj);
+ }
+
+ /* Eliminate the diagonal matrix d using a Givens rotation */
+
+ for (j = 0; j < n; j++)
+ {
+ double qtbpj;
+
+ size_t pj = gsl_permutation_get (p, j);
+
+ double diagpj = lambda * gsl_vector_get (diag, pj);
+
+ if (diagpj == 0)
+ {
+ continue;
+ }
+
+ gsl_vector_set (sdiag, j, diagpj);
+
+ for (k = j + 1; k < n; k++)
+ {
+ gsl_vector_set (sdiag, k, 0.0);
+ }
+
+ /* The transformations to eliminate the row of d modify only a
+ single element of qtb beyond the first n, which is initially
+ zero */
+
+ qtbpj = 0;
+
+ for (k = j; k < n; k++)
+ {
+ /* Determine a Givens rotation which eliminates the
+ appropriate element in the current row of d */
+
+ double sine, cosine;
+
+ double wak = gsl_vector_get (wa, k);
+ double rkk = gsl_matrix_get (r, k, k);
+ double sdiagk = gsl_vector_get (sdiag, k);
+
+ if (sdiagk == 0)
+ {
+ continue;
+ }
+
+ if (fabs (rkk) < fabs (sdiagk))
+ {
+ double cotangent = rkk / sdiagk;
+ sine = 0.5 / sqrt (0.25 + 0.25 * cotangent * cotangent);
+ cosine = sine * cotangent;
+ }
+ else
+ {
+ double tangent = sdiagk / rkk;
+ cosine = 0.5 / sqrt (0.25 + 0.25 * tangent * tangent);
+ sine = cosine * tangent;
+ }
+
+ /* Compute the modified diagonal element of r and the
+ modified element of [qtb,0] */
+
+ {
+ double new_rkk = cosine * rkk + sine * sdiagk;
+ double new_wak = cosine * wak + sine * qtbpj;
+
+ qtbpj = -sine * wak + cosine * qtbpj;
+
+ gsl_matrix_set(r, k, k, new_rkk);
+ gsl_vector_set(wa, k, new_wak);
+ }
+
+ /* Accumulate the transformation in the row of s */
+
+ for (i = k + 1; i < n; i++)
+ {
+ double rik = gsl_matrix_get (r, i, k);
+ double sdiagi = gsl_vector_get (sdiag, i);
+
+ double new_rik = cosine * rik + sine * sdiagi;
+ double new_sdiagi = -sine * rik + cosine * sdiagi;
+
+ gsl_matrix_set(r, i, k, new_rik);
+ gsl_vector_set(sdiag, i, new_sdiagi);
+ }
+ }
+
+ /* Store the corresponding diagonal element of s and restore the
+ corresponding diagonal element of r */
+
+ {
+ double rjj = gsl_matrix_get (r, j, j);
+ double xj = gsl_vector_get(x, j);
+
+ gsl_vector_set (sdiag, j, rjj);
+ gsl_matrix_set (r, j, j, xj);
+ }
+
+ }
+
+ /* Solve the triangular system for z. If the system is singular then
+ obtain a least squares solution */
+
+ nsing = n;
+
+ for (j = 0; j < n; j++)
+ {
+ double sdiagj = gsl_vector_get (sdiag, j);
+
+ if (sdiagj == 0)
+ {
+ nsing = j;
+ break;
+ }
+ }
+
+ for (j = nsing; j < n; j++)
+ {
+ gsl_vector_set (wa, j, 0.0);
+ }
+
+ for (k = 0; k < nsing; k++)
+ {
+ double sum = 0;
+
+ j = (nsing - 1) - k;
+
+ for (i = j + 1; i < nsing; i++)
+ {
+ sum += gsl_matrix_get(r, i, j) * gsl_vector_get(wa, i);
+ }
+
+ {
+ double waj = gsl_vector_get (wa, j);
+ double sdiagj = gsl_vector_get (sdiag, j);
+
+ gsl_vector_set (wa, j, (waj - sum) / sdiagj);
+ }
+ }
+
+ /* Permute the components of z back to the components of x */
+
+ for (j = 0; j < n; j++)
+ {
+ size_t pj = gsl_permutation_get (p, j);
+ double waj = gsl_vector_get (wa, j);
+
+ gsl_vector_set (x, pj, waj);
+ }
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/multifit/test.c b/gsl-1.9/multifit/test.c
new file mode 100644
index 0000000..fede15a
--- /dev/null
+++ b/gsl-1.9/multifit/test.c
@@ -0,0 +1,210 @@
+/* These tests are based on the NIST Statistical Reference Datasets
+ See http://www.nist.gov/itl/div898/strd/index.html for more
+ information. */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_multifit.h>
+#include <gsl/gsl_multifit_nlin.h>
+#include <gsl/gsl_blas.h>
+
+#include <gsl/gsl_ieee_utils.h>
+
+#include "test_longley.c"
+#include "test_filip.c"
+#include "test_pontius.c"
+#include "test_brown.c"
+#include "test_enso.c"
+#include "test_kirby2.c"
+#include "test_hahn1.c"
+#include "test_nelson.c"
+#include "test_fn.c"
+#include "test_estimator.c"
+
+void
+test_lmder (gsl_multifit_function_fdf * f, double x0[],
+ double * X, double F[], double * cov);
+
+void
+test_fdf (const char * name, gsl_multifit_function_fdf * f,
+ double x0[], double x[], double sumsq,
+ double sigma[]);
+
+int
+main (void)
+{
+ gsl_ieee_env_setup();
+
+ test_longley();
+ test_filip();
+ test_pontius();
+ test_estimator();
+
+ {
+ gsl_multifit_function_fdf f = make_fdf (&brown_f, &brown_df, &brown_fdf,
+ brown_N, brown_P, 0);
+
+ test_lmder(&f, brown_x0, &brown_X[0][0], brown_F, &brown_cov[0][0]);
+ }
+
+ {
+ gsl_multifit_function_fdf f = make_fdf (&enso_f, &enso_df, &enso_fdf,
+ enso_N, enso_P, 0);
+
+ test_fdf("nist-ENSO", &f, enso_x0, enso_x, enso_sumsq, enso_sigma);
+ }
+
+ {
+ gsl_multifit_function_fdf f = make_fdf (&kirby2_f, &kirby2_df, &kirby2_fdf,
+ kirby2_N, kirby2_P, 0);
+
+ test_fdf("nist-kirby2", &f, kirby2_x0, kirby2_x, kirby2_sumsq, kirby2_sigma);
+ }
+
+ {
+ gsl_multifit_function_fdf f = make_fdf (&hahn1_f, &hahn1_df, &hahn1_fdf,
+ hahn1_N, hahn1_P, 0);
+
+ test_fdf("nist-hahn1", &f, hahn1_x0, hahn1_x, hahn1_sumsq, hahn1_sigma);
+ }
+
+#ifdef JUNK
+ {
+ gsl_multifit_function_fdf f = make_fdf (&nelson_f, &nelson_df, &nelson_fdf,
+ nelson_N, nelson_P, 0);
+
+ test_fdf("nist-nelson", &f, nelson_x0, nelson_x, nelson_sumsq, nelson_sigma);
+ }
+#endif
+
+ /* now summarize the results */
+
+ exit (gsl_test_summary ());
+}
+
+
+void
+test_lmder (gsl_multifit_function_fdf * f, double x0[],
+ double * X, double F[], double * cov)
+{
+ const gsl_multifit_fdfsolver_type *T;
+ gsl_multifit_fdfsolver *s;
+
+ const size_t n = f->n;
+ const size_t p = f->p;
+
+ int status;
+ size_t iter = 0, i;
+
+ gsl_vector_view x = gsl_vector_view_array (x0, p);
+
+ T = gsl_multifit_fdfsolver_lmsder;
+ s = gsl_multifit_fdfsolver_alloc (T, n, p);
+ gsl_multifit_fdfsolver_set (s, f, &x.vector);
+
+ do
+ {
+ status = gsl_multifit_fdfsolver_iterate (s);
+
+ for (i = 0 ; i < p; i++)
+ {
+ gsl_test_rel (gsl_vector_get (s->x, i), X[p*iter+i], 1e-5,
+ "lmsder, iter=%u, x%u", iter, i);
+ }
+
+ gsl_test_rel (gsl_blas_dnrm2 (s->f), F[iter], 1e-5,
+ "lmsder, iter=%u, f", iter);
+
+ iter++;
+ }
+ while (iter < 20);
+
+ {
+ size_t i, j;
+ gsl_matrix * covar = gsl_matrix_alloc (4, 4);
+ gsl_multifit_covar (s->J, 0.0, covar);
+
+ for (i = 0; i < 4; i++)
+ {
+ for (j = 0; j < 4; j++)
+ {
+ gsl_test_rel (gsl_matrix_get(covar,i,j), cov[i*p + j], 1e-7,
+ "gsl_multifit_covar cov(%d,%d)", i, j) ;
+ }
+ }
+
+ gsl_matrix_free (covar);
+ }
+
+ gsl_multifit_fdfsolver_free (s);
+
+}
+
+void
+test_fdf (const char * name, gsl_multifit_function_fdf * f,
+ double x0[], double x_final[],
+ double f_sumsq, double sigma[])
+{
+ const gsl_multifit_fdfsolver_type *T;
+ gsl_multifit_fdfsolver *s;
+
+ const size_t n = f->n;
+ const size_t p = f->p;
+
+ int status;
+ size_t iter = 0;
+
+ gsl_vector_view x = gsl_vector_view_array (x0, p);
+
+ T = gsl_multifit_fdfsolver_lmsder;
+ s = gsl_multifit_fdfsolver_alloc (T, n, p);
+ gsl_multifit_fdfsolver_set (s, f, &x.vector);
+
+ do
+ {
+ status = gsl_multifit_fdfsolver_iterate (s);
+
+#ifdef DEBUG
+ printf("iter = %d status = %d |f| = %.18e x = \n",
+ iter, status, gsl_blas_dnrm2 (s->f));
+
+ gsl_vector_fprintf(stdout, s->x, "%.8e");
+#endif
+ status = gsl_multifit_test_delta (s->dx, s->x, 0.0, 1e-7);
+
+ iter++;
+ }
+ while (status == GSL_CONTINUE && iter < 1000);
+
+ {
+ size_t i;
+ gsl_matrix * covar = gsl_matrix_alloc (p, p);
+ gsl_multifit_covar (s->J, 0.0, covar);
+
+ for (i = 0 ; i < p; i++)
+ {
+ gsl_test_rel (gsl_vector_get (s->x, i), x_final[i], 1e-5,
+ "%s, lmsder, x%u", name, i);
+ }
+
+
+ {
+ double s2 = pow(gsl_blas_dnrm2 (s->f), 2.0);
+
+ gsl_test_rel (s2, f_sumsq, 1e-5, "%s, lmsder, |f|^2", name);
+
+ for (i = 0; i < p; i++)
+ {
+ double ei = sqrt(s2/(n-p))*sqrt(gsl_matrix_get(covar,i,i));
+ gsl_test_rel (ei, sigma[i], 1e-4,
+ "%s, sigma(%d)", name, i) ;
+ }
+ }
+
+ gsl_matrix_free (covar);
+ }
+
+ gsl_multifit_fdfsolver_free (s);
+}
diff --git a/gsl-1.9/multifit/test_brown.c b/gsl-1.9/multifit/test_brown.c
new file mode 100644
index 0000000..e1ac937
--- /dev/null
+++ b/gsl-1.9/multifit/test_brown.c
@@ -0,0 +1,113 @@
+const size_t brown_N = 20;
+const size_t brown_P = 4;
+
+double brown_X[20][4] = {
+ {24.3485677, 4.71448798, -2.19486633, 2.69405755},
+ {22.4116222, 3.93075538, -1.42344852, 2.5233557},
+ {17.88886, 2.9290853, .125174936, -3.96823353},
+ {17.3237176, 2.99606803, 2.03285653, 2.28992327},
+ {17.0906508, 3.02485425, .296995153, .0876226126},
+ {16.578006, 3.1036312, -.18617941, .103262914},
+ {15.692993, 3.33088442, .0706406887, 1.05923955},
+ {14.3232177, 3.85604218, -2.3762839, -3.09486813},
+ {14.1279266, 3.97896121, .446109351, 1.40023753},
+ {13.6081961, 4.16435075, -1.51250057, -1.52510626},
+ {13.4295245, 4.22697223, -.196985195, .532009293},
+ {13.0176117, 4.3579261, -.353131208, .301377627},
+ {12.2713535, 4.62398535, -.00183585584, .894170703},
+ {11.0316144, 5.13967727, -2.38978772, -2.89510064},
+ {10.8807981, 5.24558004, .230495952, 1.27315117},
+ {10.4029264, 5.41141257, -1.5116632, -1.47615921},
+ {10.2574435, 5.46211045, -.299855732, .451893162},
+ {9.87863876, 5.57914292, -.368885288, .358086545},
+ {9.1894983, 5.82082741, -.230157969, .621476534},
+ {8.00589008, 6.27788753, -1.46022815, -1.33468082}
+};
+
+double brown_F[20] = {
+ 2474.05541,
+ 1924.69004,
+ 1280.63194,
+ 1244.81867,
+ 1190.53739,
+ 1159.34935,
+ 1108.44426,
+ 1090.11073,
+ 1015.92942,
+ 1002.43533,
+ 971.221084,
+ 949.589435,
+ 911.359899,
+ 906.522994,
+ 840.525729,
+ 833.950164,
+ 807.557511,
+ 791.00924,
+ 761.09598,
+ 726.787783,
+};
+
+double brown_cov[4][4] = {
+ { 1.8893186910e-01, -4.7099989571e-02, 5.2154168404e-01, 1.6608168209e-02},
+ {-4.7099989571e-02, 1.1761534388e-02, -1.2987843074e-01, -4.1615942391e-03},
+ { 5.2154168404e-01, -1.2987843074e-01, 1.4653936514e+00, 1.5738321686e-02},
+ { 1.6608168209e-02, -4.1615942391e-03, 1.5738321686e-02, 4.2348042340e-02},
+};
+
+double brown_x0[4] = { 25, 5, -5, -1 };
+
+int
+brown_f (const gsl_vector * x, void *params, gsl_vector * f)
+{
+ double x0 = gsl_vector_get (x, 0);
+ double x1 = gsl_vector_get (x, 1);
+ double x2 = gsl_vector_get (x, 2);
+ double x3 = gsl_vector_get (x, 3);
+ size_t i;
+
+ for (i = 0; i < 20; i++)
+ {
+ double ti = 0.2 * (i + 1);
+ double ui = x0 + x1 * ti - exp (ti);
+ double vi = x2 + x3 * sin (ti) - cos (ti);
+
+ gsl_vector_set (f, i, ui * ui + vi * vi);
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+brown_df (const gsl_vector * x, void *params, gsl_matrix * df)
+{
+ double x0 = gsl_vector_get (x, 0);
+ double x1 = gsl_vector_get (x, 1);
+ double x2 = gsl_vector_get (x, 2);
+ double x3 = gsl_vector_get (x, 3);
+ size_t i;
+
+ for (i = 0; i < 20; i++)
+ {
+ double ti = 0.2 * (i + 1);
+ double ui = x0 + x1 * ti - exp (ti);
+ double vi = x2 + x3 * sin (ti) - cos (ti);
+
+ gsl_matrix_set (df, i, 0, 2 * ui);
+ gsl_matrix_set (df, i, 1, 2 * ui * ti);
+ gsl_matrix_set (df, i, 2, 2 * vi);
+ gsl_matrix_set (df, i, 3, 2 * vi * sin (ti));
+
+ }
+ return GSL_SUCCESS;
+}
+
+int
+brown_fdf (const gsl_vector * x, void *params,
+ gsl_vector * f, gsl_matrix * df)
+{
+ brown_f (x, params, f);
+ brown_df (x, params, df);
+
+ return GSL_SUCCESS;
+}
+
diff --git a/gsl-1.9/multifit/test_enso.c b/gsl-1.9/multifit/test_enso.c
new file mode 100644
index 0000000..6343738
--- /dev/null
+++ b/gsl-1.9/multifit/test_enso.c
@@ -0,0 +1,279 @@
+const size_t enso_N = 168;
+const size_t enso_P = 9;
+
+double enso_x0[9] = { 10.0, 3.0, 0.5, 44.0, -1.5, 0.5, 26.0, 0.1, 1.5 };
+
+double enso_x[9] = {
+ 1.0510749193E+01,
+ 3.0762128085E+00,
+ 5.3280138227E-01,
+ 4.4311088700E+01,
+ -1.6231428586E+00,
+ 5.2554493756E-01,
+ 2.6887614440E+01,
+ 2.1232288488E-01,
+ 1.4966870418E+00
+};
+
+double enso_sumsq = 7.8853978668E+02;
+
+double enso_sigma[9] = {
+ 1.7488832467E-01,
+ 2.4310052139E-01,
+ 2.4354686618E-01,
+ 9.4408025976E-01,
+ 2.8078369611E-01,
+ 4.8073701119E-01,
+ 4.1612939130E-01,
+ 5.1460022911E-01,
+ 2.5434468893E-01
+};
+
+double enso_F[168] = {
+ 12.90000,
+ 11.30000,
+ 10.60000,
+ 11.20000,
+ 10.90000,
+ 7.500000,
+ 7.700000,
+ 11.70000,
+ 12.90000,
+ 14.30000,
+ 10.90000,
+ 13.70000,
+ 17.10000,
+ 14.00000,
+ 15.30000,
+ 8.500000,
+ 5.700000,
+ 5.500000,
+ 7.600000,
+ 8.600000,
+ 7.300000,
+ 7.600000,
+ 12.70000,
+ 11.00000,
+ 12.70000,
+ 12.90000,
+ 13.00000,
+ 10.90000,
+ 10.400000,
+ 10.200000,
+ 8.000000,
+ 10.90000,
+ 13.60000,
+ 10.500000,
+ 9.200000,
+ 12.40000,
+ 12.70000,
+ 13.30000,
+ 10.100000,
+ 7.800000,
+ 4.800000,
+ 3.000000,
+ 2.500000,
+ 6.300000,
+ 9.700000,
+ 11.60000,
+ 8.600000,
+ 12.40000,
+ 10.500000,
+ 13.30000,
+ 10.400000,
+ 8.100000,
+ 3.700000,
+ 10.70000,
+ 5.100000,
+ 10.400000,
+ 10.90000,
+ 11.70000,
+ 11.40000,
+ 13.70000,
+ 14.10000,
+ 14.00000,
+ 12.50000,
+ 6.300000,
+ 9.600000,
+ 11.70000,
+ 5.000000,
+ 10.80000,
+ 12.70000,
+ 10.80000,
+ 11.80000,
+ 12.60000,
+ 15.70000,
+ 12.60000,
+ 14.80000,
+ 7.800000,
+ 7.100000,
+ 11.20000,
+ 8.100000,
+ 6.400000,
+ 5.200000,
+ 12.00000,
+ 10.200000,
+ 12.70000,
+ 10.200000,
+ 14.70000,
+ 12.20000,
+ 7.100000,
+ 5.700000,
+ 6.700000,
+ 3.900000,
+ 8.500000,
+ 8.300000,
+ 10.80000,
+ 16.70000,
+ 12.60000,
+ 12.50000,
+ 12.50000,
+ 9.800000,
+ 7.200000,
+ 4.100000,
+ 10.60000,
+ 10.100000,
+ 10.100000,
+ 11.90000,
+ 13.60000,
+ 16.30000,
+ 17.60000,
+ 15.50000,
+ 16.00000,
+ 15.20000,
+ 11.20000,
+ 14.30000,
+ 14.50000,
+ 8.500000,
+ 12.00000,
+ 12.70000,
+ 11.30000,
+ 14.50000,
+ 15.10000,
+ 10.400000,
+ 11.50000,
+ 13.40000,
+ 7.500000,
+ 0.6000000,
+ 0.3000000,
+ 5.500000,
+ 5.000000,
+ 4.600000,
+ 8.200000,
+ 9.900000,
+ 9.200000,
+ 12.50000,
+ 10.90000,
+ 9.900000,
+ 8.900000,
+ 7.600000,
+ 9.500000,
+ 8.400000,
+ 10.70000,
+ 13.60000,
+ 13.70000,
+ 13.70000,
+ 16.50000,
+ 16.80000,
+ 17.10000,
+ 15.40000,
+ 9.500000,
+ 6.100000,
+ 10.100000,
+ 9.300000,
+ 5.300000,
+ 11.20000,
+ 16.60000,
+ 15.60000,
+ 12.00000,
+ 11.50000,
+ 8.600000,
+ 13.80000,
+ 8.700000,
+ 8.600000,
+ 8.600000,
+ 8.700000,
+ 12.80000,
+ 13.20000,
+ 14.00000,
+ 13.40000,
+ 14.80000
+};
+
+
+int
+enso_f (const gsl_vector * x, void *params, gsl_vector * f)
+{
+ double b[9];
+ size_t i;
+
+ for (i = 0; i < 9; i++)
+ {
+ b[i] = gsl_vector_get(x, i);
+ }
+
+ for (i = 0; i < 168; i++)
+ {
+ double t = (i + 1.0);
+ double y;
+ y = b[0];
+ y += b[1] * cos(2*M_PI*t/12);
+ y += b[2] * sin(2*M_PI*t/12);
+ y += b[4] * cos(2*M_PI*t/b[3]);
+ y += b[5] * sin(2*M_PI*t/b[3]);
+ y += b[7] * cos(2*M_PI*t/b[6]);
+ y += b[8] * sin(2*M_PI*t/b[6]);
+
+ gsl_vector_set (f, i, enso_F[i] - y);
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+enso_df (const gsl_vector * x, void *params, gsl_matrix * df)
+{
+ double b[9];
+ size_t i;
+
+ for (i = 0; i < 9; i++)
+ {
+ b[i] = gsl_vector_get(x, i);
+ }
+
+ for (i = 0; i < 168; i++)
+ {
+ double t = (i + 1.0);
+
+ gsl_matrix_set (df, i, 0, -1.0);
+ gsl_matrix_set (df, i, 1, -cos(2*M_PI*t/12));
+ gsl_matrix_set (df, i, 2, -sin(2*M_PI*t/12));
+ gsl_matrix_set (df, i, 3,
+ -b[4]*(2*M_PI*t/(b[3]*b[3]))*sin(2*M_PI*t/b[3])
+ +b[5]*(2*M_PI*t/(b[3]*b[3]))*cos(2*M_PI*t/b[3]));
+ gsl_matrix_set (df, i, 4, -cos(2*M_PI*t/b[3]));
+ gsl_matrix_set (df, i, 5, -sin(2*M_PI*t/b[3]));
+ gsl_matrix_set (df, i, 6,
+ -b[7] * (2*M_PI*t/(b[6]*b[6])) * sin(2*M_PI*t/b[6])
+ +b[8] * (2*M_PI*t/(b[6]*b[6])) * cos(2*M_PI*t/b[6]));
+ gsl_matrix_set (df, i, 7, -cos(2*M_PI*t/b[6]));
+ gsl_matrix_set (df, i, 8, -sin(2*M_PI*t/b[6]));
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+enso_fdf (const gsl_vector * x, void *params,
+ gsl_vector * f, gsl_matrix * df)
+{
+ enso_f (x, params, f);
+ enso_df (x, params, df);
+
+ return GSL_SUCCESS;
+}
+
+
+
+
+
diff --git a/gsl-1.9/multifit/test_estimator.c b/gsl-1.9/multifit/test_estimator.c
new file mode 100644
index 0000000..51cbaba
--- /dev/null
+++ b/gsl-1.9/multifit/test_estimator.c
@@ -0,0 +1,37 @@
+void
+test_estimator ()
+{
+ gsl_vector_view c;
+ gsl_matrix_view cov;
+ gsl_vector_view x;
+ double y, y_err;
+
+ double cov_ij[25] = {
+ 4.271520, -0.526675, 0.957930, 0.267750, -0.103610,
+ -0.526675, 5.701680, -0.098080, 0.641845, 0.429780,
+ 0.957930, -0.098080, 4.584790, 0.375865, 1.510810,
+ 0.267750, 0.641845, 0.375865, 4.422720, 0.392210,
+ -0.103610, 0.429780, 1.510810, 0.392210, 5.782750
+
+ };
+
+ double c_i[5] = {
+ -0.627020, 0.848674, 0.216877, -0.057883, 0.596668
+ };
+
+ double x_i[5] = {
+ 0.99932, 0.23858, 0.19797, 1.44008, -0.15335
+ };
+
+ double y_expected = -5.56037032230000e-01;
+ double yerr_expected = 3.91891123349318e+00;
+
+ cov = gsl_matrix_view_array(cov_ij, 5, 5);
+ c = gsl_vector_view_array(c_i, 5);
+ x = gsl_vector_view_array(x_i, 5);
+
+ gsl_multifit_linear_est(&x.vector , &c.vector, &cov.matrix, &y, &y_err);
+
+ gsl_test_rel (y, y_expected, 256*GSL_DBL_EPSILON, "gsl_multifit_linear_est y");
+ gsl_test_rel (y_err, yerr_expected, 256*GSL_DBL_EPSILON, "gsl_multifit_linear_est yerr");
+}
diff --git a/gsl-1.9/multifit/test_filip.c b/gsl-1.9/multifit/test_filip.c
new file mode 100644
index 0000000..bdb4609
--- /dev/null
+++ b/gsl-1.9/multifit/test_filip.c
@@ -0,0 +1,202 @@
+size_t filip_n = 82;
+size_t filip_p = 11;
+
+double filip_x[] = { -6.860120914, -4.324130045, -4.358625055,
+-4.358426747, -6.955852379, -6.661145254, -6.355462942, -6.118102026,
+-7.115148017, -6.815308569, -6.519993057, -6.204119983, -5.853871964,
+-6.109523091, -5.79832982, -5.482672118, -5.171791386, -4.851705903,
+-4.517126416, -4.143573228, -3.709075441, -3.499489089, -6.300769497,
+-5.953504836, -5.642065153, -5.031376979, -4.680685696, -4.329846955,
+-3.928486195, -8.56735134, -8.363211311, -8.107682739, -7.823908741,
+-7.522878745, -7.218819279, -6.920818754, -6.628932138, -6.323946875,
+-5.991399828, -8.781464495, -8.663140179, -8.473531488, -8.247337057,
+-7.971428747, -7.676129393, -7.352812702, -7.072065318, -6.774174009,
+-6.478861916, -6.159517513, -6.835647144, -6.53165267, -6.224098421,
+-5.910094889, -5.598599459, -5.290645224, -4.974284616, -4.64454848,
+-4.290560426, -3.885055584, -3.408378962, -3.13200249, -8.726767166,
+-8.66695597, -8.511026475, -8.165388579, -7.886056648, -7.588043762,
+-7.283412422, -6.995678626, -6.691862621, -6.392544977, -6.067374056,
+-6.684029655, -6.378719832, -6.065855188, -5.752272167, -5.132414673,
+-4.811352704, -4.098269308, -3.66174277, -3.2644011};
+
+double filip_y[] = { 0.8116, 0.9072, 0.9052, 0.9039, 0.8053, 0.8377,
+0.8667, 0.8809, 0.7975, 0.8162, 0.8515, 0.8766, 0.8885, 0.8859,
+0.8959, 0.8913, 0.8959, 0.8971, 0.9021, 0.909, 0.9139, 0.9199, 0.8692,
+0.8872, 0.89, 0.891, 0.8977, 0.9035, 0.9078, 0.7675, 0.7705, 0.7713,
+0.7736, 0.7775, 0.7841, 0.7971, 0.8329, 0.8641, 0.8804, 0.7668,
+0.7633, 0.7678, 0.7697, 0.77, 0.7749, 0.7796, 0.7897, 0.8131, 0.8498,
+0.8741, 0.8061, 0.846, 0.8751, 0.8856, 0.8919, 0.8934, 0.894, 0.8957,
+0.9047, 0.9129, 0.9209, 0.9219, 0.7739, 0.7681, 0.7665, 0.7703,
+0.7702, 0.7761, 0.7809, 0.7961, 0.8253, 0.8602, 0.8809, 0.8301,
+0.8664, 0.8834, 0.8898, 0.8964, 0.8963, 0.9074, 0.9119, 0.9228 } ;
+
+
+void
+test_filip ()
+{
+ size_t i, j;
+ {
+ gsl_multifit_linear_workspace * work =
+ gsl_multifit_linear_alloc (filip_n, filip_p);
+
+ gsl_matrix * X = gsl_matrix_alloc (filip_n, filip_p);
+ gsl_vector_view y = gsl_vector_view_array (filip_y, filip_n);
+ gsl_vector * c = gsl_vector_alloc (filip_p);
+ gsl_matrix * cov = gsl_matrix_alloc (filip_p, filip_p);
+ gsl_vector_view diag;
+
+ double chisq;
+
+ double expected_c[11] = { -1467.48961422980,
+ -2772.17959193342,
+ -2316.37108160893,
+ -1127.97394098372,
+ -354.478233703349,
+ -75.1242017393757,
+ -10.8753180355343,
+ -1.06221498588947,
+ -0.670191154593408E-01,
+ -0.246781078275479E-02,
+ -0.402962525080404E-04 };
+
+ double expected_sd[11] = { 298.084530995537,
+ 559.779865474950,
+ 466.477572127796,
+ 227.204274477751,
+ 71.6478660875927,
+ 15.2897178747400,
+ 2.23691159816033,
+ 0.221624321934227,
+ 0.142363763154724E-01,
+ 0.535617408889821E-03,
+ 0.896632837373868E-05 };
+
+ double expected_chisq = 0.795851382172941E-03;
+
+ for (i = 0 ; i < filip_n; i++)
+ {
+ for (j = 0; j < filip_p; j++)
+ {
+ gsl_matrix_set(X, i, j, pow(filip_x[i], j));
+ }
+ }
+
+ gsl_multifit_linear (X, &y.vector, c, cov, &chisq, work);
+
+ gsl_test_rel (gsl_vector_get(c,0), expected_c[0], 1e-7, "filip gsl_fit_multilinear c0") ;
+ gsl_test_rel (gsl_vector_get(c,1), expected_c[1], 1e-7, "filip gsl_fit_multilinear c1") ;
+ gsl_test_rel (gsl_vector_get(c,2), expected_c[2], 1e-7, "filip gsl_fit_multilinear c2") ;
+ gsl_test_rel (gsl_vector_get(c,3), expected_c[3], 1e-7, "filip gsl_fit_multilinear c3") ;
+ gsl_test_rel (gsl_vector_get(c,4), expected_c[4], 1e-7, "filip gsl_fit_multilinear c4") ;
+ gsl_test_rel (gsl_vector_get(c,5), expected_c[5], 1e-7, "filip gsl_fit_multilinear c5") ;
+ gsl_test_rel (gsl_vector_get(c,6), expected_c[6], 1e-7, "filip gsl_fit_multilinear c6") ;
+ gsl_test_rel (gsl_vector_get(c,7), expected_c[7], 1e-7, "filip gsl_fit_multilinear c7") ;
+ gsl_test_rel (gsl_vector_get(c,8), expected_c[8], 1e-7, "filip gsl_fit_multilinear c8") ;
+ gsl_test_rel (gsl_vector_get(c,9), expected_c[9], 1e-7, "filip gsl_fit_multilinear c9") ;
+ gsl_test_rel (gsl_vector_get(c,10), expected_c[10], 1e-7, "filip gsl_fit_multilinear c10") ;
+
+ diag = gsl_matrix_diagonal (cov);
+
+ gsl_test_rel (gsl_vector_get(&diag.vector,0), pow(expected_sd[0],2.0), 1e-6, "filip gsl_fit_multilinear cov00") ;
+ gsl_test_rel (gsl_vector_get(&diag.vector,1), pow(expected_sd[1],2.0), 1e-6, "filip gsl_fit_multilinear cov11") ;
+ gsl_test_rel (gsl_vector_get(&diag.vector,2), pow(expected_sd[2],2.0), 1e-6, "filip gsl_fit_multilinear cov22") ;
+ gsl_test_rel (gsl_vector_get(&diag.vector,3), pow(expected_sd[3],2.0), 1e-6, "filip gsl_fit_multilinear cov33") ;
+ gsl_test_rel (gsl_vector_get(&diag.vector,4), pow(expected_sd[4],2.0), 1e-6, "filip gsl_fit_multilinear cov44") ;
+ gsl_test_rel (gsl_vector_get(&diag.vector,5), pow(expected_sd[5],2.0), 1e-6, "filip gsl_fit_multilinear cov55") ;
+ gsl_test_rel (gsl_vector_get(&diag.vector,6), pow(expected_sd[6],2.0), 1e-6, "filip gsl_fit_multilinear cov66") ;
+ gsl_test_rel (gsl_vector_get(&diag.vector,7), pow(expected_sd[7],2.0), 1e-6, "filip gsl_fit_multilinear cov77") ;
+ gsl_test_rel (gsl_vector_get(&diag.vector,8), pow(expected_sd[8],2.0), 1e-6, "filip gsl_fit_multilinear cov88") ;
+ gsl_test_rel (gsl_vector_get(&diag.vector,9), pow(expected_sd[9],2.0), 1e-6, "filip gsl_fit_multilinear cov99") ;
+ gsl_test_rel (gsl_vector_get(&diag.vector,10), pow(expected_sd[10],2.0), 1e-6, "filip gsl_fit_multilinear cov1010") ;
+
+ gsl_test_rel (chisq, expected_chisq, 1e-7, "filip gsl_fit_multilinear chisq") ;
+
+ gsl_vector_free(c);
+ gsl_matrix_free(cov);
+ gsl_matrix_free(X);
+ gsl_multifit_linear_free (work);
+ }
+
+ {
+ gsl_multifit_linear_workspace * work =
+ gsl_multifit_linear_alloc (filip_n, filip_p);
+
+ gsl_matrix * X = gsl_matrix_alloc (filip_n, filip_p);
+ gsl_vector_view y = gsl_vector_view_array (filip_y, filip_n);
+ gsl_vector * w = gsl_vector_alloc (filip_n);
+ gsl_vector * c = gsl_vector_alloc (filip_p);
+ gsl_matrix * cov = gsl_matrix_alloc (filip_p, filip_p);
+
+ double chisq;
+
+ double expected_c[11] = { -1467.48961422980,
+ -2772.17959193342,
+ -2316.37108160893,
+ -1127.97394098372,
+ -354.478233703349,
+ -75.1242017393757,
+ -10.8753180355343,
+ -1.06221498588947,
+ -0.670191154593408E-01,
+ -0.246781078275479E-02,
+ -0.402962525080404E-04 };
+
+ /* computed using GNU Calc */
+
+ double expected_cov[11][11] ={ { 7.9269341767252183262588583867942e9, 1.4880416622254098343441063389706e10, 1.2385811858111487905481427591107e10, 6.0210784406215266653697715794241e9, 1.8936652526181982747116667336389e9, 4.0274900618493109653998118587093e8, 5.8685468011819735806180092394606e7, 5.7873451475721689084330083708901e6, 3.6982719848703747920663262917032e5, 1.3834818802741350637527054170891e4, 2.301758578713219280719633494302e2 },
+ { 1.4880416622254098334697515488559e10, 2.7955091668548290835529555438088e10, 2.3286604504243362691678565997033e10, 1.132895006796272983689297219686e10, 3.5657281653312473123348357644683e9, 7.5893300392314445528176646366087e8, 1.1066654886143524811964131660002e8, 1.0921285448484575110763947787775e7, 6.9838139975394769253353547606971e5, 2.6143091775349597218939272614126e4, 4.3523386330348588614289505633539e2 },
+ { 1.2385811858111487890788272968677e10, 2.3286604504243362677757802422747e10, 1.9412787917766676553608636489674e10, 9.4516246492862131849077729250098e9, 2.9771226694709917550143152097252e9, 6.3413035086730038062129508949859e8, 9.2536164488309401636559552742339e7, 9.1386304643423333815338760248027e6, 5.8479478338916429826337004060941e5, 2.1905933113294737443808429764554e4, 3.6493161325305557266196635180155e2 },
+ { 6.0210784406215266545770691532365e9, 1.1328950067962729823273441573365e10, 9.4516246492862131792040001429636e9, 4.6053152992000107509329772255094e9, 1.4517147860312147098138030287038e9, 3.0944988323328589376402579060072e8, 4.5190223822292688669369522708712e7, 4.4660958693678497534529855690752e6, 2.8599340736122198213681258676423e5, 1.0720394998549386596165641244705e4, 1.7870937745661967319298031044424e2 },
+ { 1.8936652526181982701620450132636e9, 3.5657281653312473058825073094524e9, 2.9771226694709917514149924058297e9, 1.451714786031214708936087401632e9, 4.5796563896564815123074920050827e8, 9.7693972414561515534525103622773e7, 1.427717861635658545863942948444e7, 1.4120161287735817621354292900338e6, 9.0484361228623960006818614875557e4, 3.394106783764852373199087455398e3, 5.6617406468519495376287407526295e1 },
+ { 4.0274900618493109532650887473599e8, 7.589330039231444534478894935778e8, 6.3413035086730037947153564986653e8, 3.09449883233285893390542947998e8, 9.7693972414561515475770399055121e7, 2.0855726248311948992114244257719e7, 3.0501263034740400533872858749566e6, 3.0187475839310308153394428784224e5, 1.9358204633534233524477930175632e4, 7.2662989867560017077361942813911e2, 1.2129002231061036467607394277965e1 },
+ { 5.868546801181973559370854830868e7, 1.1066654886143524778548044386795e8, 9.2536164488309401413296494869777e7, 4.5190223822292688587853853162072e7, 1.4277178616356585441556046753562e7, 3.050126303474040051574715592746e6, 4.4639982579046340884744460329946e5, 4.4212093985989836047285007760238e4, 2.8371395028774486687625333589972e3, 1.0656694507620102300567296504381e2, 1.7799982046359973175080475654123e0 },
+ { 5.7873451475721688839974153925406e6, 1.0921285448484575071271480643397e7, 9.1386304643423333540728480344578e6, 4.4660958693678497427674903565664e6, 1.4120161287735817596182229182587e6, 3.0187475839310308117812257613082e5, 4.4212093985989836021482392757677e4, 4.3818874017028389517560906916315e3, 2.813828775753142855163154605027e2, 1.0576188138416671883232607188969e1, 1.7676976288918295012452853715408e-1 },
+ { 3.6982719848703747742568351456818e5, 6.9838139975394768959780068745979e5, 5.8479478338916429616547638954781e5, 2.8599340736122198128717796825489e5, 9.0484361228623959793493985226792e4, 1.9358204633534233490579641064343e4, 2.8371395028774486654873647731797e3, 2.8138287757531428535592907878017e2, 1.8081118503579798222896804627964e1, 6.8005074291434681866415478598732e-1, 1.1373581557749643543869665860719e-2 },
+ { 1.3834818802741350562839757244708e4, 2.614309177534959709397445440919e4, 2.1905933113294737352721470167247e4, 1.0720394998549386558251721913182e4, 3.3941067837648523632905604575131e3, 7.2662989867560016909534954790835e2, 1.0656694507620102282337905013451e2, 1.0576188138416671871337685672492e1, 6.8005074291434681828743281967838e-1, 2.5593857187900736057022477529078e-2, 4.2831487599116264442963102045936e-4 },
+ { 2.3017585787132192669801658674163e2, 4.3523386330348588381716460685124e2, 3.6493161325305557094116270974735e2, 1.7870937745661967246233792737255e2, 5.6617406468519495180024059284629e1, 1.2129002231061036433003571679329e1, 1.7799982046359973135014027410646e0, 1.7676976288918294983059118597214e-1, 1.137358155774964353146460100337e-2, 4.283148759911626442000316269063e-4, 7.172253875245080423800933453952e-6 } };
+
+ double expected_chisq = 0.795851382172941E-03;
+
+ for (i = 0 ; i < filip_n; i++)
+ {
+ for (j = 0; j < filip_p; j++)
+ {
+ gsl_matrix_set(X, i, j, pow(filip_x[i], j));
+ }
+ }
+
+ gsl_vector_set_all (w, 1.0);
+
+ gsl_multifit_wlinear (X, w, &y.vector, c, cov, &chisq, work);
+
+ gsl_test_rel (gsl_vector_get(c,0), expected_c[0], 1e-7, "filip gsl_fit_multilinear c0") ;
+ gsl_test_rel (gsl_vector_get(c,1), expected_c[1], 1e-7, "filip gsl_fit_multilinear c1") ;
+ gsl_test_rel (gsl_vector_get(c,2), expected_c[2], 1e-7, "filip gsl_fit_multilinear c2") ;
+ gsl_test_rel (gsl_vector_get(c,3), expected_c[3], 1e-7, "filip gsl_fit_multilinear c3") ;
+ gsl_test_rel (gsl_vector_get(c,4), expected_c[4], 1e-7, "filip gsl_fit_multilinear c4") ;
+ gsl_test_rel (gsl_vector_get(c,5), expected_c[5], 1e-7, "filip gsl_fit_multilinear c5") ;
+ gsl_test_rel (gsl_vector_get(c,6), expected_c[6], 1e-7, "filip gsl_fit_multilinear c6") ;
+ gsl_test_rel (gsl_vector_get(c,7), expected_c[7], 1e-7, "filip gsl_fit_multilinear c7") ;
+ gsl_test_rel (gsl_vector_get(c,8), expected_c[8], 1e-7, "filip gsl_fit_multilinear c8") ;
+ gsl_test_rel (gsl_vector_get(c,9), expected_c[9], 1e-7, "filip gsl_fit_multilinear c9") ;
+ gsl_test_rel (gsl_vector_get(c,10), expected_c[10], 1e-7, "filip gsl_fit_multilinear c10") ;
+
+
+ for (i = 0; i < filip_p; i++)
+ {
+ for (j = 0; j < filip_p; j++)
+ {
+ gsl_test_rel (gsl_matrix_get(cov,i,j), expected_cov[i][j], 1e-6,
+ "filip gsl_fit_wmultilinear cov(%d,%d)", i, j) ;
+ }
+ }
+
+ gsl_test_rel (chisq, expected_chisq, 1e-7, "filip gsl_fit_multilinear chisq") ;
+
+ gsl_vector_free(w);
+ gsl_vector_free(c);
+ gsl_matrix_free(cov);
+ gsl_matrix_free(X);
+ gsl_multifit_linear_free (work);
+ }
+}
diff --git a/gsl-1.9/multifit/test_fn.c b/gsl-1.9/multifit/test_fn.c
new file mode 100644
index 0000000..ad190a1
--- /dev/null
+++ b/gsl-1.9/multifit/test_fn.c
@@ -0,0 +1,25 @@
+gsl_multifit_function_fdf
+make_fdf (int (* f) (const gsl_vector *, void *, gsl_vector *),
+ int (* df) (const gsl_vector *, void *, gsl_matrix *),
+ int (* fdf) (const gsl_vector *, void *, gsl_vector *, gsl_matrix *),
+ size_t n,
+ size_t p,
+ void * params);
+
+gsl_multifit_function_fdf
+make_fdf (int (* f) (const gsl_vector *, void *, gsl_vector *),
+ int (* df) (const gsl_vector *, void *, gsl_matrix *),
+ int (* fdf) (const gsl_vector *, void *, gsl_vector *, gsl_matrix *),
+ size_t n,
+ size_t p,
+ void * params)
+{
+ gsl_multifit_function_fdf F_new;
+ F_new.f = f;
+ F_new.df = df;
+ F_new.fdf = fdf;
+ F_new.n = n;
+ F_new.p = p;
+ F_new.params = params;
+ return F_new;
+}
diff --git a/gsl-1.9/multifit/test_hahn1.c b/gsl-1.9/multifit/test_hahn1.c
new file mode 100644
index 0000000..8a2385a
--- /dev/null
+++ b/gsl-1.9/multifit/test_hahn1.c
@@ -0,0 +1,568 @@
+const size_t hahn1_N = 236;
+const size_t hahn1_P = 7;
+
+/* double hahn1_x0[7] = { 10, -1, 0.05, -0.00001, -0.05, 0.001, -0.000001 }; */
+
+double hahn1_x0[7] = { 1, -0.1, 0.005, -0.000001, -0.005, 0.0001, -0.0000001};
+
+double hahn1_x[7] = {
+1.0776351733E+00,
+-1.2269296921E-01,
+4.0863750610E-03,
+-1.4262662514E-06,
+-5.7609940901E-03,
+2.4053735503E-04,
+-1.2314450199E-07
+};
+
+double hahn1_sumsq = 1.5324382854E+00;
+
+double hahn1_sigma[7] = {
+ 1.7070154742E-01,
+ 1.2000289189E-02,
+ 2.2508314937E-04,
+ 2.7578037666E-07,
+ 2.4712888219E-04,
+ 1.0449373768E-05,
+ 1.3027335327E-08
+};
+
+double hahn1_F1[236] = {
+ .591E0,
+ 1.547E0,
+ 2.902E0,
+ 2.894E0,
+ 4.703E0,
+ 6.307E0,
+ 7.03E0 ,
+ 7.898E0,
+ 9.470E0,
+ 9.484E0,
+ 10.072E0,
+ 10.163E0,
+ 11.615E0,
+ 12.005E0,
+ 12.478E0,
+ 12.982E0,
+ 12.970E0,
+ 13.926E0,
+ 14.452E0,
+ 14.404E0,
+ 15.190E0,
+ 15.550E0,
+ 15.528E0,
+ 15.499E0,
+ 16.131E0,
+ 16.438E0,
+ 16.387E0,
+ 16.549E0,
+ 16.872E0,
+ 16.830E0,
+ 16.926E0,
+ 16.907E0,
+ 16.966E0,
+ 17.060E0,
+ 17.122E0,
+ 17.311E0,
+ 17.355E0,
+ 17.668E0,
+ 17.767E0,
+ 17.803E0,
+ 17.765E0,
+ 17.768E0,
+ 17.736E0,
+ 17.858E0,
+ 17.877E0,
+ 17.912E0,
+ 18.046E0,
+ 18.085E0,
+ 18.291E0,
+ 18.357E0,
+ 18.426E0,
+ 18.584E0,
+ 18.610E0,
+ 18.870E0,
+ 18.795E0,
+ 19.111E0,
+ .367E0,
+ .796E0,
+ 0.892E0,
+ 1.903E0,
+ 2.150E0,
+ 3.697E0,
+ 5.870E0,
+ 6.421E0,
+ 7.422E0,
+ 9.944E0,
+ 11.023E0,
+ 11.87E0 ,
+ 12.786E0,
+ 14.067E0,
+ 13.974E0,
+ 14.462E0,
+ 14.464E0,
+ 15.381E0,
+ 15.483E0,
+ 15.59E0 ,
+ 16.075E0,
+ 16.347E0,
+ 16.181E0,
+ 16.915E0,
+ 17.003E0,
+ 16.978E0,
+ 17.756E0,
+ 17.808E0,
+ 17.868E0,
+ 18.481E0,
+ 18.486E0,
+ 19.090E0,
+ 16.062E0,
+ 16.337E0,
+ 16.345E0,
+ 16.388E0,
+ 17.159E0,
+ 17.116E0,
+ 17.164E0,
+ 17.123E0,
+ 17.979E0,
+ 17.974E0,
+ 18.007E0,
+ 17.993E0,
+ 18.523E0,
+ 18.669E0,
+ 18.617E0,
+ 19.371E0,
+ 19.330E0,
+ 0.080E0,
+ 0.248E0,
+ 1.089E0,
+ 1.418E0,
+ 2.278E0,
+ 3.624E0,
+ 4.574E0,
+ 5.556E0,
+ 7.267E0,
+ 7.695E0,
+ 9.136E0,
+ 9.959E0,
+ 9.957E0,
+ 11.600E0,
+ 13.138E0,
+ 13.564E0,
+ 13.871E0,
+ 13.994E0,
+ 14.947E0,
+ 15.473E0,
+ 15.379E0,
+ 15.455E0,
+ 15.908E0,
+ 16.114E0,
+ 17.071E0,
+ 17.135E0,
+ 17.282E0,
+ 17.368E0,
+ 17.483E0,
+ 17.764E0,
+ 18.185E0,
+ 18.271E0,
+ 18.236E0,
+ 18.237E0,
+ 18.523E0,
+ 18.627E0,
+ 18.665E0,
+ 19.086E0,
+ 0.214E0,
+ 0.943E0,
+ 1.429E0,
+ 2.241E0,
+ 2.951E0,
+ 3.782E0,
+ 4.757E0,
+ 5.602E0,
+ 7.169E0,
+ 8.920E0,
+ 10.055E0,
+ 12.035E0,
+ 12.861E0,
+ 13.436E0,
+ 14.167E0,
+ 14.755E0,
+ 15.168E0,
+ 15.651E0,
+ 15.746E0,
+ 16.216E0,
+ 16.445E0,
+ 16.965E0,
+ 17.121E0,
+ 17.206E0,
+ 17.250E0,
+ 17.339E0,
+ 17.793E0,
+ 18.123E0,
+ 18.49E0 ,
+ 18.566E0,
+ 18.645E0,
+ 18.706E0,
+ 18.924E0,
+ 19.1E0 ,
+ 0.375E0,
+ 0.471E0,
+ 1.504E0,
+ 2.204E0,
+ 2.813E0,
+ 4.765E0,
+ 9.835E0,
+ 10.040E0,
+ 11.946E0,
+ 12.596E0,
+ 13.303E0,
+ 13.922E0,
+ 14.440E0,
+ 14.951E0,
+ 15.627E0,
+ 15.639E0,
+ 15.814E0,
+ 16.315E0,
+ 16.334E0,
+ 16.430E0,
+ 16.423E0,
+ 17.024E0,
+ 17.009E0,
+ 17.165E0,
+ 17.134E0,
+ 17.349E0,
+ 17.576E0,
+ 17.848E0,
+ 18.090E0,
+ 18.276E0,
+ 18.404E0,
+ 18.519E0,
+ 19.133E0,
+ 19.074E0,
+ 19.239E0,
+ 19.280E0,
+ 19.101E0,
+ 19.398E0,
+ 19.252E0,
+ 19.89E0 ,
+ 20.007E0,
+ 19.929E0,
+ 19.268E0,
+ 19.324E0,
+ 20.049E0,
+ 20.107E0,
+ 20.062E0,
+ 20.065E0,
+ 19.286E0,
+ 19.972E0,
+ 20.088E0,
+ 20.743E0,
+ 20.83E0 ,
+ 20.935E0,
+ 21.035E0,
+ 20.93E0 ,
+ 21.074E0,
+ 21.085E0,
+ 20.935E0
+};
+
+
+double hahn1_F0[236] = {
+ 24.41E0,
+ 34.82E0,
+ 44.09E0,
+ 45.07E0,
+ 54.98E0,
+ 65.51E0,
+ 70.53E0,
+ 75.70E0,
+ 89.57E0,
+ 91.14E0,
+ 96.40E0,
+ 97.19E0,
+ 114.26E0,
+ 120.25E0,
+ 127.08E0,
+ 133.55E0,
+ 133.61E0,
+ 158.67E0,
+ 172.74E0,
+ 171.31E0,
+ 202.14E0,
+ 220.55E0,
+ 221.05E0,
+ 221.39E0,
+ 250.99E0,
+ 268.99E0,
+ 271.80E0,
+ 271.97E0,
+ 321.31E0,
+ 321.69E0,
+ 330.14E0,
+ 333.03E0,
+ 333.47E0,
+ 340.77E0,
+ 345.65E0,
+ 373.11E0,
+ 373.79E0,
+ 411.82E0,
+ 419.51E0,
+ 421.59E0,
+ 422.02E0,
+ 422.47E0,
+ 422.61E0,
+ 441.75E0,
+ 447.41E0,
+ 448.7E0 ,
+ 472.89E0,
+ 476.69E0,
+ 522.47E0,
+ 522.62E0,
+ 524.43E0,
+ 546.75E0,
+ 549.53E0,
+ 575.29E0,
+ 576.00E0,
+ 625.55E0,
+ 20.15E0,
+ 28.78E0,
+ 29.57E0,
+ 37.41E0,
+ 39.12E0,
+ 50.24E0,
+ 61.38E0,
+ 66.25E0,
+ 73.42E0,
+ 95.52E0,
+ 107.32E0,
+ 122.04E0,
+ 134.03E0,
+ 163.19E0,
+ 163.48E0,
+ 175.70E0,
+ 179.86E0,
+ 211.27E0,
+ 217.78E0,
+ 219.14E0,
+ 262.52E0,
+ 268.01E0,
+ 268.62E0,
+ 336.25E0,
+ 337.23E0,
+ 339.33E0,
+ 427.38E0,
+ 428.58E0,
+ 432.68E0,
+ 528.99E0,
+ 531.08E0,
+ 628.34E0,
+ 253.24E0,
+ 273.13E0,
+ 273.66E0,
+ 282.10E0,
+ 346.62E0,
+ 347.19E0,
+ 348.78E0,
+ 351.18E0,
+ 450.10E0,
+ 450.35E0,
+ 451.92E0,
+ 455.56E0,
+ 552.22E0,
+ 553.56E0,
+ 555.74E0,
+ 652.59E0,
+ 656.20E0,
+ 14.13E0,
+ 20.41E0,
+ 31.30E0,
+ 33.84E0,
+ 39.70E0,
+ 48.83E0,
+ 54.50E0,
+ 60.41E0,
+ 72.77E0,
+ 75.25E0,
+ 86.84E0,
+ 94.88E0,
+ 96.40E0,
+ 117.37E0,
+ 139.08E0,
+ 147.73E0,
+ 158.63E0,
+ 161.84E0,
+ 192.11E0,
+ 206.76E0,
+ 209.07E0,
+ 213.32E0,
+ 226.44E0,
+ 237.12E0,
+ 330.90E0,
+ 358.72E0,
+ 370.77E0,
+ 372.72E0,
+ 396.24E0,
+ 416.59E0,
+ 484.02E0,
+ 495.47E0,
+ 514.78E0,
+ 515.65E0,
+ 519.47E0,
+ 544.47E0,
+ 560.11E0,
+ 620.77E0,
+ 18.97E0,
+ 28.93E0,
+ 33.91E0,
+ 40.03E0,
+ 44.66E0,
+ 49.87E0,
+ 55.16E0,
+ 60.90E0,
+ 72.08E0,
+ 85.15E0,
+ 97.06E0,
+ 119.63E0,
+ 133.27E0,
+ 143.84E0,
+ 161.91E0,
+ 180.67E0,
+ 198.44E0,
+ 226.86E0,
+ 229.65E0,
+ 258.27E0,
+ 273.77E0,
+ 339.15E0,
+ 350.13E0,
+ 362.75E0,
+ 371.03E0,
+ 393.32E0,
+ 448.53E0,
+ 473.78E0,
+ 511.12E0,
+ 524.70E0,
+ 548.75E0,
+ 551.64E0,
+ 574.02E0,
+ 623.86E0,
+ 21.46E0,
+ 24.33E0,
+ 33.43E0,
+ 39.22E0,
+ 44.18E0,
+ 55.02E0,
+ 94.33E0,
+ 96.44E0,
+ 118.82E0,
+ 128.48E0,
+ 141.94E0,
+ 156.92E0,
+ 171.65E0,
+ 190.00E0,
+ 223.26E0,
+ 223.88E0,
+ 231.50E0,
+ 265.05E0,
+ 269.44E0,
+ 271.78E0,
+ 273.46E0,
+ 334.61E0,
+ 339.79E0,
+ 349.52E0,
+ 358.18E0,
+ 377.98E0,
+ 394.77E0,
+ 429.66E0,
+ 468.22E0,
+ 487.27E0,
+ 519.54E0,
+ 523.03E0,
+ 612.99E0,
+ 638.59E0,
+ 641.36E0,
+ 622.05E0,
+ 631.50E0,
+ 663.97E0,
+ 646.9E0 ,
+ 748.29E0,
+ 749.21E0,
+ 750.14E0,
+ 647.04E0,
+ 646.89E0,
+ 746.9E0 ,
+ 748.43E0,
+ 747.35E0,
+ 749.27E0,
+ 647.61E0,
+ 747.78E0,
+ 750.51E0,
+ 851.37E0,
+ 845.97E0,
+ 847.54E0,
+ 849.93E0,
+ 851.61E0,
+ 849.75E0,
+ 850.98E0,
+ 848.23E0
+};
+
+
+int
+hahn1_f (const gsl_vector * x, void *params, gsl_vector * f)
+{
+ double b[7];
+ size_t i;
+
+ for (i = 0; i < 7; i++)
+ {
+ b[i] = gsl_vector_get(x, i);
+ }
+
+ for (i = 0; i < 236; i++)
+ {
+ double x = hahn1_F0[i];
+ double y = ((b[0] + x* (b[1] + x * (b[2] + x * b[3])))
+ / (1 + x*(b[4] + x *(b[5] + x*b[6]))));
+ gsl_vector_set (f, i, hahn1_F1[i] - y);
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+hahn1_df (const gsl_vector * x, void *params, gsl_matrix * df)
+{
+ double b[7];
+ size_t i;
+
+ for (i = 0; i < 7; i++)
+ {
+ b[i] = gsl_vector_get(x, i);
+ }
+
+ for (i = 0; i < 236; i++)
+ {
+ double x = hahn1_F0[i];
+ double u = (b[0] + x*(b[1] + x*(b[2] + x * b[3])));
+ double v = (1 + x*(b[4] + x*(b[5] + x*b[6])));
+ gsl_matrix_set (df, i, 0, -1/v);
+ gsl_matrix_set (df, i, 1, -x/v);
+ gsl_matrix_set (df, i, 2, -x*x/v);
+ gsl_matrix_set (df, i, 3, -x*x*x/v);
+ gsl_matrix_set (df, i, 4, x*u/(v*v));
+ gsl_matrix_set (df, i, 5, x*x*u/(v*v));
+ gsl_matrix_set (df, i, 6, x*x*x*u/(v*v));
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+hahn1_fdf (const gsl_vector * x, void *params,
+ gsl_vector * f, gsl_matrix * df)
+{
+ hahn1_f (x, params, f);
+ hahn1_df (x, params, df);
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/multifit/test_kirby2.c b/gsl-1.9/multifit/test_kirby2.c
new file mode 100644
index 0000000..623a488
--- /dev/null
+++ b/gsl-1.9/multifit/test_kirby2.c
@@ -0,0 +1,392 @@
+const size_t kirby2_N = 151;
+const size_t kirby2_P = 5;
+
+/* double kirby2_x0[5] = { 2, -0.1, 0.003, -0.001, 0.00001 }; */
+
+double kirby2_x0[5] = { 1.5, -0.15, 0.0025, -0.0015, 0.00002 };
+
+double kirby2_x[5] = {
+ 1.6745063063E+00,
+ -1.3927397867E-01,
+ 2.5961181191E-03,
+ -1.7241811870E-03,
+ 2.1664802578E-05
+};
+
+double kirby2_sumsq = 3.9050739624E+00;
+
+double kirby2_sigma[5] = {
+ 8.7989634338E-02,
+ 4.1182041386E-03,
+ 4.1856520458E-05,
+ 5.8931897355E-05,
+ 2.0129761919E-07
+};
+
+double kirby2_F1[151] = {
+ 0.0082E0,
+ 0.0112E0,
+ 0.0149E0,
+ 0.0198E0,
+ 0.0248E0,
+ 0.0324E0,
+ 0.0420E0,
+ 0.0549E0,
+ 0.0719E0,
+ 0.0963E0,
+ 0.1291E0,
+ 0.1710E0,
+ 0.2314E0,
+ 0.3227E0,
+ 0.4809E0,
+ 0.7084E0,
+ 1.0220E0,
+ 1.4580E0,
+ 1.9520E0,
+ 2.5410E0,
+ 3.2230E0,
+ 3.9990E0,
+ 4.8520E0,
+ 5.7320E0,
+ 6.7270E0,
+ 7.8350E0,
+ 9.0250E0,
+ 10.2670E0,
+ 11.5780E0,
+ 12.9440E0,
+ 14.3770E0,
+ 15.8560E0,
+ 17.3310E0,
+ 18.8850E0,
+ 20.5750E0,
+ 22.3200E0,
+ 22.3030E0,
+ 23.4600E0,
+ 24.0600E0,
+ 25.2720E0,
+ 25.8530E0,
+ 27.1100E0,
+ 27.6580E0,
+ 28.9240E0,
+ 29.5110E0,
+ 30.7100E0,
+ 31.3500E0,
+ 32.5200E0,
+ 33.2300E0,
+ 34.3300E0,
+ 35.0600E0,
+ 36.1700E0,
+ 36.8400E0,
+ 38.0100E0,
+ 38.6700E0,
+ 39.8700E0,
+ 40.0300E0,
+ 40.5000E0,
+ 41.3700E0,
+ 41.6700E0,
+ 42.3100E0,
+ 42.7300E0,
+ 43.4600E0,
+ 44.1400E0,
+ 44.5500E0,
+ 45.2200E0,
+ 45.9200E0,
+ 46.3000E0,
+ 47.0000E0,
+ 47.6800E0,
+ 48.0600E0,
+ 48.7400E0,
+ 49.4100E0,
+ 49.7600E0,
+ 50.4300E0,
+ 51.1100E0,
+ 51.5000E0,
+ 52.1200E0,
+ 52.7600E0,
+ 53.1800E0,
+ 53.7800E0,
+ 54.4600E0,
+ 54.8300E0,
+ 55.4000E0,
+ 56.4300E0,
+ 57.0300E0,
+ 58.0000E0,
+ 58.6100E0,
+ 59.5800E0,
+ 60.1100E0,
+ 61.1000E0,
+ 61.6500E0,
+ 62.5900E0,
+ 63.1200E0,
+ 64.0300E0,
+ 64.6200E0,
+ 65.4900E0,
+ 66.0300E0,
+ 66.8900E0,
+ 67.4200E0,
+ 68.2300E0,
+ 68.7700E0,
+ 69.5900E0,
+ 70.1100E0,
+ 70.8600E0,
+ 71.4300E0,
+ 72.1600E0,
+ 72.7000E0,
+ 73.4000E0,
+ 73.9300E0,
+ 74.6000E0,
+ 75.1600E0,
+ 75.8200E0,
+ 76.3400E0,
+ 76.9800E0,
+ 77.4800E0,
+ 78.0800E0,
+ 78.6000E0,
+ 79.1700E0,
+ 79.6200E0,
+ 79.8800E0,
+ 80.1900E0,
+ 80.6600E0,
+ 81.2200E0,
+ 81.6600E0,
+ 82.1600E0,
+ 82.5900E0,
+ 83.1400E0,
+ 83.5000E0,
+ 84.0000E0,
+ 84.4000E0,
+ 84.8900E0,
+ 85.2600E0,
+ 85.7400E0,
+ 86.0700E0,
+ 86.5400E0,
+ 86.8900E0,
+ 87.3200E0,
+ 87.6500E0,
+ 88.1000E0,
+ 88.4300E0,
+ 88.8300E0,
+ 89.1200E0,
+ 89.5400E0,
+ 89.8500E0,
+ 90.2500E0,
+ 90.5500E0,
+ 90.9300E0,
+ 91.2000E0,
+ 91.5500E0,
+ 92.2000E0
+};
+
+
+double kirby2_F0[151] = {
+ 9.65E0,
+ 10.74E0,
+ 11.81E0,
+ 12.88E0,
+ 14.06E0,
+ 15.28E0,
+ 16.63E0,
+ 18.19E0,
+ 19.88E0,
+ 21.84E0,
+ 24.00E0,
+ 26.25E0,
+ 28.86E0,
+ 31.85E0,
+ 35.79E0,
+ 40.18E0,
+ 44.74E0,
+ 49.53E0,
+ 53.94E0,
+ 58.29E0,
+ 62.63E0,
+ 67.03E0,
+ 71.25E0,
+ 75.22E0,
+ 79.33E0,
+ 83.56E0,
+ 87.75E0,
+ 91.93E0,
+ 96.10E0,
+ 100.28E0,
+ 104.46E0,
+ 108.66E0,
+ 112.71E0,
+ 116.88E0,
+ 121.33E0,
+ 125.79E0,
+ 125.79E0,
+ 128.74E0,
+ 130.27E0,
+ 133.33E0,
+ 134.79E0,
+ 137.93E0,
+ 139.33E0,
+ 142.46E0,
+ 143.90E0,
+ 146.91E0,
+ 148.51E0,
+ 151.41E0,
+ 153.17E0,
+ 155.97E0,
+ 157.76E0,
+ 160.56E0,
+ 162.30E0,
+ 165.21E0,
+ 166.90E0,
+ 169.92E0,
+ 170.32E0,
+ 171.54E0,
+ 173.79E0,
+ 174.57E0,
+ 176.25E0,
+ 177.34E0,
+ 179.19E0,
+ 181.02E0,
+ 182.08E0,
+ 183.88E0,
+ 185.75E0,
+ 186.80E0,
+ 188.63E0,
+ 190.45E0,
+ 191.48E0,
+ 193.35E0,
+ 195.22E0,
+ 196.23E0,
+ 198.05E0,
+ 199.97E0,
+ 201.06E0,
+ 202.83E0,
+ 204.69E0,
+ 205.86E0,
+ 207.58E0,
+ 209.50E0,
+ 210.65E0,
+ 212.33E0,
+ 215.43E0,
+ 217.16E0,
+ 220.21E0,
+ 221.98E0,
+ 225.06E0,
+ 226.79E0,
+ 229.92E0,
+ 231.69E0,
+ 234.77E0,
+ 236.60E0,
+ 239.63E0,
+ 241.50E0,
+ 244.48E0,
+ 246.40E0,
+ 249.35E0,
+ 251.32E0,
+ 254.22E0,
+ 256.24E0,
+ 259.11E0,
+ 261.18E0,
+ 264.02E0,
+ 266.13E0,
+ 268.94E0,
+ 271.09E0,
+ 273.87E0,
+ 276.08E0,
+ 278.83E0,
+ 281.08E0,
+ 283.81E0,
+ 286.11E0,
+ 288.81E0,
+ 291.08E0,
+ 293.75E0,
+ 295.99E0,
+ 298.64E0,
+ 300.84E0,
+ 302.02E0,
+ 303.48E0,
+ 305.65E0,
+ 308.27E0,
+ 310.41E0,
+ 313.01E0,
+ 315.12E0,
+ 317.71E0,
+ 319.79E0,
+ 322.36E0,
+ 324.42E0,
+ 326.98E0,
+ 329.01E0,
+ 331.56E0,
+ 333.56E0,
+ 336.10E0,
+ 338.08E0,
+ 340.60E0,
+ 342.57E0,
+ 345.08E0,
+ 347.02E0,
+ 349.52E0,
+ 351.44E0,
+ 353.93E0,
+ 355.83E0,
+ 358.32E0,
+ 360.20E0,
+ 362.67E0,
+ 364.53E0,
+ 367.00E0,
+ 371.30E0
+};
+
+
+int
+kirby2_f (const gsl_vector * x, void *params, gsl_vector * f)
+{
+ double b[5];
+ size_t i;
+
+ for (i = 0; i < 5; i++)
+ {
+ b[i] = gsl_vector_get(x, i);
+ }
+
+ for (i = 0; i < 151; i++)
+ {
+ double x = kirby2_F0[i];
+ double y = ((b[0] + x* (b[1] + x * b[2]))
+ / (1 + x*(b[3] + x *b[4])));
+ gsl_vector_set (f, i, kirby2_F1[i] - y);
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+kirby2_df (const gsl_vector * x, void *params, gsl_matrix * df)
+{
+ double b[5];
+ size_t i;
+
+ for (i = 0; i < 5; i++)
+ {
+ b[i] = gsl_vector_get(x, i);
+ }
+
+ for (i = 0; i < 151; i++)
+ {
+ double x = kirby2_F0[i];
+ double u = (b[0] + x*(b[1] + x*b[2]));
+ double v = (1 + x*(b[3] + x*b[4]));
+ gsl_matrix_set (df, i, 0, -1/v);
+ gsl_matrix_set (df, i, 1, -x/v);
+ gsl_matrix_set (df, i, 2, -x*x/v);
+ gsl_matrix_set (df, i, 3, x*u/(v*v));
+ gsl_matrix_set (df, i, 4, x*x*u/(v*v));
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+kirby2_fdf (const gsl_vector * x, void *params,
+ gsl_vector * f, gsl_matrix * df)
+{
+ kirby2_f (x, params, f);
+ kirby2_df (x, params, df);
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/multifit/test_longley.c b/gsl-1.9/multifit/test_longley.c
new file mode 100644
index 0000000..1d2bf03
--- /dev/null
+++ b/gsl-1.9/multifit/test_longley.c
@@ -0,0 +1,166 @@
+size_t longley_n = 16;
+size_t longley_p = 7;
+
+double longley_x [] = {
+ 1, 83.0, 234289, 2356, 1590, 107608, 1947,
+ 1, 88.5, 259426, 2325, 1456, 108632, 1948,
+ 1, 88.2, 258054, 3682, 1616, 109773, 1949,
+ 1, 89.5, 284599, 3351, 1650, 110929, 1950,
+ 1, 96.2, 328975, 2099, 3099, 112075, 1951,
+ 1, 98.1, 346999, 1932, 3594, 113270, 1952,
+ 1, 99.0, 365385, 1870, 3547, 115094, 1953,
+ 1, 100.0, 363112, 3578, 3350, 116219, 1954,
+ 1, 101.2, 397469, 2904, 3048, 117388, 1955,
+ 1, 104.6, 419180, 2822, 2857, 118734, 1956,
+ 1, 108.4, 442769, 2936, 2798, 120445, 1957,
+ 1, 110.8, 444546, 4681, 2637, 121950, 1958,
+ 1, 112.6, 482704, 3813, 2552, 123366, 1959,
+ 1, 114.2, 502601, 3931, 2514, 125368, 1960,
+ 1, 115.7, 518173, 4806, 2572, 127852, 1961,
+ 1, 116.9, 554894, 4007, 2827, 130081, 1962 } ;
+
+double longley_y[] = {60323, 61122, 60171, 61187, 63221, 63639, 64989, 63761,
+ 66019, 67857, 68169, 66513, 68655, 69564, 69331, 70551};
+
+
+void
+test_longley ()
+{
+ size_t i, j;
+ {
+ gsl_multifit_linear_workspace * work =
+ gsl_multifit_linear_alloc (longley_n, longley_p);
+
+ gsl_matrix_view X = gsl_matrix_view_array (longley_x, longley_n, longley_p);
+ gsl_vector_view y = gsl_vector_view_array (longley_y, longley_n);
+ gsl_vector * c = gsl_vector_alloc (longley_p);
+ gsl_matrix * cov = gsl_matrix_alloc (longley_p, longley_p);
+ gsl_vector_view diag;
+
+ double chisq;
+
+ double expected_c[7] = { -3482258.63459582,
+ 15.0618722713733,
+ -0.358191792925910E-01,
+ -2.02022980381683,
+ -1.03322686717359,
+ -0.511041056535807E-01,
+ 1829.15146461355 };
+
+ double expected_sd[7] = { 890420.383607373,
+ 84.9149257747669,
+ 0.334910077722432E-01,
+ 0.488399681651699,
+ 0.214274163161675,
+ 0.226073200069370,
+ 455.478499142212 } ;
+
+ double expected_chisq = 836424.055505915;
+
+ gsl_multifit_linear (&X.matrix, &y.vector, c, cov, &chisq, work);
+
+ gsl_test_rel (gsl_vector_get(c,0), expected_c[0], 1e-10, "longley gsl_fit_multilinear c0") ;
+ gsl_test_rel (gsl_vector_get(c,1), expected_c[1], 1e-10, "longley gsl_fit_multilinear c1") ;
+ gsl_test_rel (gsl_vector_get(c,2), expected_c[2], 1e-10, "longley gsl_fit_multilinear c2") ;
+ gsl_test_rel (gsl_vector_get(c,3), expected_c[3], 1e-10, "longley gsl_fit_multilinear c3") ;
+ gsl_test_rel (gsl_vector_get(c,4), expected_c[4], 1e-10, "longley gsl_fit_multilinear c4") ;
+ gsl_test_rel (gsl_vector_get(c,5), expected_c[5], 1e-10, "longley gsl_fit_multilinear c5") ;
+ gsl_test_rel (gsl_vector_get(c,6), expected_c[6], 1e-10, "longley gsl_fit_multilinear c6") ;
+
+ diag = gsl_matrix_diagonal (cov);
+
+ gsl_test_rel (gsl_vector_get(&diag.vector,0), pow(expected_sd[0],2.0), 1e-10, "longley gsl_fit_multilinear cov00") ;
+ gsl_test_rel (gsl_vector_get(&diag.vector,1), pow(expected_sd[1],2.0), 1e-10, "longley gsl_fit_multilinear cov11") ;
+ gsl_test_rel (gsl_vector_get(&diag.vector,2), pow(expected_sd[2],2.0), 1e-10, "longley gsl_fit_multilinear cov22") ;
+ gsl_test_rel (gsl_vector_get(&diag.vector,3), pow(expected_sd[3],2.0), 1e-10, "longley gsl_fit_multilinear cov33") ;
+ gsl_test_rel (gsl_vector_get(&diag.vector,4), pow(expected_sd[4],2.0), 1e-10, "longley gsl_fit_multilinear cov44") ;
+ gsl_test_rel (gsl_vector_get(&diag.vector,5), pow(expected_sd[5],2.0), 1e-10, "longley gsl_fit_multilinear cov55") ;
+ gsl_test_rel (gsl_vector_get(&diag.vector,6), pow(expected_sd[6],2.0), 1e-10, "longley gsl_fit_multilinear cov66") ;
+
+ gsl_test_rel (chisq, expected_chisq, 1e-10, "longley gsl_fit_multilinear chisq") ;
+
+ gsl_vector_free(c);
+ gsl_matrix_free(cov);
+ gsl_multifit_linear_free (work);
+ }
+
+
+ {
+ gsl_multifit_linear_workspace * work =
+ gsl_multifit_linear_alloc (longley_n, longley_p);
+
+ gsl_matrix_view X = gsl_matrix_view_array (longley_x, longley_n, longley_p);
+ gsl_vector_view y = gsl_vector_view_array (longley_y, longley_n);
+ gsl_vector * w = gsl_vector_alloc (longley_n);
+ gsl_vector * c = gsl_vector_alloc (longley_p);
+ gsl_matrix * cov = gsl_matrix_alloc (longley_p, longley_p);
+
+ double chisq;
+
+ double expected_c[7] = { -3482258.63459582,
+ 15.0618722713733,
+ -0.358191792925910E-01,
+ -2.02022980381683,
+ -1.03322686717359,
+ -0.511041056535807E-01,
+ 1829.15146461355 };
+
+ double expected_cov[7][7] = { { 8531122.56783558,
+-166.727799925578, 0.261873708176346, 3.91188317230983,
+1.1285582054705, -0.889550869422687, -4362.58709870581},
+
+{-166.727799925578, 0.0775861253030891, -1.98725210399982e-05,
+-0.000247667096727256, -6.82911920718824e-05, 0.000136160797527761,
+0.0775255245956248},
+
+{0.261873708176346, -1.98725210399982e-05, 1.20690316701888e-08,
+1.66429546772984e-07, 3.61843600487847e-08, -6.78805814483582e-08,
+-0.00013158719037715},
+
+{3.91188317230983, -0.000247667096727256, 1.66429546772984e-07,
+2.56665052544717e-06, 6.96541409215597e-07, -9.00858307771567e-07,
+-0.00197260370663974},
+
+{1.1285582054705, -6.82911920718824e-05, 3.61843600487847e-08,
+6.96541409215597e-07, 4.94032602583969e-07, -9.8469143760973e-08,
+-0.000576921112208274},
+
+{-0.889550869422687, 0.000136160797527761, -6.78805814483582e-08,
+-9.00858307771567e-07, -9.8469143760973e-08, 5.49938542664952e-07,
+0.000430074434198215},
+
+{-4362.58709870581, 0.0775255245956248, -0.00013158719037715,
+-0.00197260370663974, -0.000576921112208274, 0.000430074434198215,
+2.23229587481535 }} ;
+
+ double expected_chisq = 836424.055505915;
+
+ gsl_vector_set_all (w, 1.0);
+
+ gsl_multifit_wlinear (&X.matrix, w, &y.vector, c, cov, &chisq, work);
+
+ gsl_test_rel (gsl_vector_get(c,0), expected_c[0], 1e-10, "longley gsl_fit_wmultilinear c0") ;
+ gsl_test_rel (gsl_vector_get(c,1), expected_c[1], 1e-10, "longley gsl_fit_wmultilinear c1") ;
+ gsl_test_rel (gsl_vector_get(c,2), expected_c[2], 1e-10, "longley gsl_fit_wmultilinear c2") ;
+ gsl_test_rel (gsl_vector_get(c,3), expected_c[3], 1e-10, "longley gsl_fit_wmultilinear c3") ;
+ gsl_test_rel (gsl_vector_get(c,4), expected_c[4], 1e-10, "longley gsl_fit_wmultilinear c4") ;
+ gsl_test_rel (gsl_vector_get(c,5), expected_c[5], 1e-10, "longley gsl_fit_wmultilinear c5") ;
+ gsl_test_rel (gsl_vector_get(c,6), expected_c[6], 1e-10, "longley gsl_fit_wmultilinear c6") ;
+
+ for (i = 0; i < longley_p; i++)
+ {
+ for (j = 0; j < longley_p; j++)
+ {
+ gsl_test_rel (gsl_matrix_get(cov,i,j), expected_cov[i][j], 1e-7,
+ "longley gsl_fit_wmultilinear cov(%d,%d)", i, j) ;
+ }
+ }
+
+ gsl_test_rel (chisq, expected_chisq, 1e-10, "longley gsl_fit_wmultilinear chisq") ;
+
+ gsl_vector_free(w);
+ gsl_vector_free(c);
+ gsl_matrix_free(cov);
+ gsl_multifit_linear_free (work);
+ }
+}
diff --git a/gsl-1.9/multifit/test_nelson.c b/gsl-1.9/multifit/test_nelson.c
new file mode 100644
index 0000000..19f594e
--- /dev/null
+++ b/gsl-1.9/multifit/test_nelson.c
@@ -0,0 +1,217 @@
+const size_t nelson_N = 128;
+const size_t nelson_P = 3;
+
+/* double nelson_x0[3] = { 2, 0.0001, -0.01}; */
+
+double nelson_x0[3] = { 2.5 , 0.000000005, -0.01};
+
+double nelson_x[3] = {
+ 2.5906836021E+00,
+ 5.6177717026E-09,
+ -5.7701013174E-02
+};
+
+double nelson_sumsq = 3.7976833176E+00;
+
+double nelson_sigma[3] = {
+ 1.9149996413E-02,
+ 6.1124096540E-09,
+ 3.9572366543E-03
+};
+
+double nelson_F[128][3] = {
+ { 15.00E0, 1E0, 180E0},
+ { 17.00E0, 1E0, 180E0},
+ { 15.50E0, 1E0, 180E0},
+ { 16.50E0, 1E0, 180E0},
+ { 15.50E0, 1E0, 225E0},
+ { 15.00E0, 1E0, 225E0},
+ { 16.00E0, 1E0, 225E0},
+ { 14.50E0, 1E0, 225E0},
+ { 15.00E0, 1E0, 250E0},
+ { 14.50E0, 1E0, 250E0},
+ { 12.50E0, 1E0, 250E0},
+ { 11.00E0, 1E0, 250E0},
+ { 14.00E0, 1E0, 275E0},
+ { 13.00E0, 1E0, 275E0},
+ { 14.00E0, 1E0, 275E0},
+ { 11.50E0, 1E0, 275E0},
+ { 14.00E0, 2E0, 180E0},
+ { 16.00E0, 2E0, 180E0},
+ { 13.00E0, 2E0, 180E0},
+ { 13.50E0, 2E0, 180E0},
+ { 13.00E0, 2E0, 225E0},
+ { 13.50E0, 2E0, 225E0},
+ { 12.50E0, 2E0, 225E0},
+ { 12.50E0, 2E0, 225E0},
+ { 12.50E0, 2E0, 250E0},
+ { 12.00E0, 2E0, 250E0},
+ { 11.50E0, 2E0, 250E0},
+ { 12.00E0, 2E0, 250E0},
+ { 13.00E0, 2E0, 275E0},
+ { 11.50E0, 2E0, 275E0},
+ { 13.00E0, 2E0, 275E0},
+ { 12.50E0, 2E0, 275E0},
+ { 13.50E0, 4E0, 180E0},
+ { 17.50E0, 4E0, 180E0},
+ { 17.50E0, 4E0, 180E0},
+ { 13.50E0, 4E0, 180E0},
+ { 12.50E0, 4E0, 225E0},
+ { 12.50E0, 4E0, 225E0},
+ { 15.00E0, 4E0, 225E0},
+ { 13.00E0, 4E0, 225E0},
+ { 12.00E0, 4E0, 250E0},
+ { 13.00E0, 4E0, 250E0},
+ { 12.00E0, 4E0, 250E0},
+ { 13.50E0, 4E0, 250E0},
+ { 10.00E0, 4E0, 275E0},
+ { 11.50E0, 4E0, 275E0},
+ { 11.00E0, 4E0, 275E0},
+ { 9.50E0, 4E0, 275E0},
+ { 15.00E0, 8E0, 180E0},
+ { 15.00E0, 8E0, 180E0},
+ { 15.50E0, 8E0, 180E0},
+ { 16.00E0, 8E0, 180E0},
+ { 13.00E0, 8E0, 225E0},
+ { 10.50E0, 8E0, 225E0},
+ { 13.50E0, 8E0, 225E0},
+ { 14.00E0, 8E0, 225E0},
+ { 12.50E0, 8E0, 250E0},
+ { 12.00E0, 8E0, 250E0},
+ { 11.50E0, 8E0, 250E0},
+ { 11.50E0, 8E0, 250E0},
+ { 6.50E0, 8E0, 275E0},
+ { 5.50E0, 8E0, 275E0},
+ { 6.00E0, 8E0, 275E0},
+ { 6.00E0, 8E0, 275E0},
+ { 18.50E0, 16E0, 180E0},
+ { 17.00E0, 16E0, 180E0},
+ { 15.30E0, 16E0, 180E0},
+ { 16.00E0, 16E0, 180E0},
+ { 13.00E0, 16E0, 225E0},
+ { 14.00E0, 16E0, 225E0},
+ { 12.50E0, 16E0, 225E0},
+ { 11.00E0, 16E0, 225E0},
+ { 12.00E0, 16E0, 250E0},
+ { 12.00E0, 16E0, 250E0},
+ { 11.50E0, 16E0, 250E0},
+ { 12.00E0, 16E0, 250E0},
+ { 6.00E0, 16E0, 275E0},
+ { 6.00E0, 16E0, 275E0},
+ { 5.00E0, 16E0, 275E0},
+ { 5.50E0, 16E0, 275E0},
+ { 12.50E0, 32E0, 180E0},
+ { 13.00E0, 32E0, 180E0},
+ { 16.00E0, 32E0, 180E0},
+ { 12.00E0, 32E0, 180E0},
+ { 11.00E0, 32E0, 225E0},
+ { 9.50E0, 32E0, 225E0},
+ { 11.00E0, 32E0, 225E0},
+ { 11.00E0, 32E0, 225E0},
+ { 11.00E0, 32E0, 250E0},
+ { 10.00E0, 32E0, 250E0},
+ { 10.50E0, 32E0, 250E0},
+ { 10.50E0, 32E0, 250E0},
+ { 2.70E0, 32E0, 275E0},
+ { 2.70E0, 32E0, 275E0},
+ { 2.50E0, 32E0, 275E0},
+ { 2.40E0, 32E0, 275E0},
+ { 13.00E0, 48E0, 180E0},
+ { 13.50E0, 48E0, 180E0},
+ { 16.50E0, 48E0, 180E0},
+ { 13.60E0, 48E0, 180E0},
+ { 11.50E0, 48E0, 225E0},
+ { 10.50E0, 48E0, 225E0},
+ { 13.50E0, 48E0, 225E0},
+ { 12.00E0, 48E0, 225E0},
+ { 7.00E0, 48E0, 250E0},
+ { 6.90E0, 48E0, 250E0},
+ { 8.80E0, 48E0, 250E0},
+ { 7.90E0, 48E0, 250E0},
+ { 1.20E0, 48E0, 275E0},
+ { 1.50E0, 48E0, 275E0},
+ { 1.00E0, 48E0, 275E0},
+ { 1.50E0, 48E0, 275E0},
+ { 13.00E0, 64E0, 180E0},
+ { 12.50E0, 64E0, 180E0},
+ { 16.50E0, 64E0, 180E0},
+ { 16.00E0, 64E0, 180E0},
+ { 11.00E0, 64E0, 225E0},
+ { 11.50E0, 64E0, 225E0},
+ { 10.50E0, 64E0, 225E0},
+ { 10.00E0, 64E0, 225E0},
+ { 7.27E0, 64E0, 250E0},
+ { 7.50E0, 64E0, 250E0},
+ { 6.70E0, 64E0, 250E0},
+ { 7.60E0, 64E0, 250E0},
+ { 1.50E0, 64E0, 275E0},
+ { 1.00E0, 64E0, 275E0},
+ { 1.20E0, 64E0, 275E0},
+ { 1.20E0, 64E0, 275E0}
+};
+
+
+int
+nelson_f (const gsl_vector * x, void *params, gsl_vector * f)
+{
+ double b[3];
+ size_t i;
+
+ for (i = 0; i < 3; i++)
+ {
+ b[i] = gsl_vector_get(x, i);
+ }
+
+
+
+ for (i = 0; i < 128; i++)
+ {
+ double x1 = nelson_F[i][1];
+ double x2 = nelson_F[i][2];
+
+ double y = b[0] - b[1] * x1 * (b[2]*x2 < -100) ? 0.0 : exp(-b[2] * x2);
+
+ gsl_vector_set (f, i, log(nelson_F[i][0]) - y);
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+nelson_df (const gsl_vector * x, void *params, gsl_matrix * df)
+{
+ double b[3];
+ size_t i;
+
+ for (i = 0; i < 3; i++)
+ {
+ b[i] = gsl_vector_get(x, i);
+ }
+
+ for (i = 0; i < 128; i++)
+ {
+ double x1 = nelson_F[i][1];
+ double x2 = nelson_F[i][2];
+
+ gsl_matrix_set (df, i, 0, -1.0);
+ gsl_matrix_set (df, i, 1, x1 * exp(-b[2] * x2));
+ gsl_matrix_set (df, i, 2, -b[1] * x1 * x2 * exp(-b[2] * x2));
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+nelson_fdf (const gsl_vector * x, void *params,
+ gsl_vector * f, gsl_matrix * df)
+{
+ nelson_f (x, params, f);
+ nelson_df (x, params, df);
+
+ return GSL_SUCCESS;
+}
+
+
+
+
+
diff --git a/gsl-1.9/multifit/test_pontius.c b/gsl-1.9/multifit/test_pontius.c
new file mode 100644
index 0000000..69c6905
--- /dev/null
+++ b/gsl-1.9/multifit/test_pontius.c
@@ -0,0 +1,131 @@
+size_t pontius_n = 40;
+size_t pontius_p = 3;
+
+double pontius_x[] = { 150000, 300000, 450000, 600000, 750000, 900000,
+1050000, 1200000, 1350000, 1500000, 1650000, 1800000, 1950000, 2100000,
+2250000, 2400000, 2550000, 2700000, 2850000, 3000000, 150000, 300000,
+450000, 600000, 750000, 900000, 1050000, 1200000, 1350000, 1500000,
+1650000, 1800000, 1950000, 2100000, 2250000, 2400000, 2550000, 2700000,
+2850000, 3000000 };
+
+double pontius_y[] = { .11019, .21956, .32949, .43899, .54803, .65694,
+.76562, .87487, .98292, 1.09146, 1.20001, 1.30822, 1.41599, 1.52399,
+1.63194, 1.73947, 1.84646, 1.95392, 2.06128, 2.16844, .11052, .22018,
+.32939, .43886, .54798, .65739, .76596, .87474, .98300, 1.09150,
+1.20004, 1.30818, 1.41613, 1.52408, 1.63159, 1.73965, 1.84696,
+1.95445, 2.06177, 2.16829 };
+
+void
+test_pontius ()
+{
+ size_t i, j;
+ {
+ gsl_multifit_linear_workspace * work =
+ gsl_multifit_linear_alloc (pontius_n, pontius_p);
+
+ gsl_matrix * X = gsl_matrix_alloc (pontius_n, pontius_p);
+ gsl_vector_view y = gsl_vector_view_array (pontius_y, pontius_n);
+ gsl_vector * c = gsl_vector_alloc (pontius_p);
+ gsl_matrix * cov = gsl_matrix_alloc (pontius_p, pontius_p);
+ gsl_vector_view diag;
+
+ double chisq;
+
+ double expected_c[3] = { 0.673565789473684E-03,
+ 0.732059160401003E-06,
+ -0.316081871345029E-14};
+
+ double expected_sd[3] = { 0.107938612033077E-03,
+ 0.157817399981659E-09,
+ 0.486652849992036E-16 };
+
+ double expected_chisq = 0.155761768796992E-05;
+
+ for (i = 0 ; i < pontius_n; i++)
+ {
+ for (j = 0; j < pontius_p; j++)
+ {
+ gsl_matrix_set(X, i, j, pow(pontius_x[i], j));
+ }
+ }
+
+ gsl_multifit_linear (X, &y.vector, c, cov, &chisq, work);
+
+ gsl_test_rel (gsl_vector_get(c,0), expected_c[0], 1e-10, "pontius gsl_fit_multilinear c0") ;
+ gsl_test_rel (gsl_vector_get(c,1), expected_c[1], 1e-10, "pontius gsl_fit_multilinear c1") ;
+ gsl_test_rel (gsl_vector_get(c,2), expected_c[2], 1e-10, "pontius gsl_fit_multilinear c2") ;
+
+ diag = gsl_matrix_diagonal (cov);
+
+ gsl_test_rel (gsl_vector_get(&diag.vector,0), pow(expected_sd[0],2.0), 1e-10, "pontius gsl_fit_multilinear cov00") ;
+ gsl_test_rel (gsl_vector_get(&diag.vector,1), pow(expected_sd[1],2.0), 1e-10, "pontius gsl_fit_multilinear cov11") ;
+ gsl_test_rel (gsl_vector_get(&diag.vector,2), pow(expected_sd[2],2.0), 1e-10, "pontius gsl_fit_multilinear cov22") ;
+
+ gsl_test_rel (chisq, expected_chisq, 1e-10, "pontius gsl_fit_multilinear chisq") ;
+
+ gsl_vector_free(c);
+ gsl_matrix_free(cov);
+ gsl_matrix_free(X);
+ gsl_multifit_linear_free (work);
+ }
+
+
+ {
+ gsl_multifit_linear_workspace * work =
+ gsl_multifit_linear_alloc (pontius_n, pontius_p);
+
+ gsl_matrix * X = gsl_matrix_alloc (pontius_n, pontius_p);
+ gsl_vector_view y = gsl_vector_view_array (pontius_y, pontius_n);
+ gsl_vector * w = gsl_vector_alloc (pontius_n);
+ gsl_vector * c = gsl_vector_alloc (pontius_p);
+ gsl_matrix * cov = gsl_matrix_alloc (pontius_p, pontius_p);
+
+ double chisq;
+
+ double expected_c[3] = { 0.673565789473684E-03,
+ 0.732059160401003E-06,
+ -0.316081871345029E-14};
+
+ double expected_chisq = 0.155761768796992E-05;
+
+ double expected_cov[3][3] ={
+ {2.76754385964916e-01 , -3.59649122807024e-07, 9.74658869395731e-14},
+ {-3.59649122807024e-07, 5.91630591630603e-13, -1.77210703526497e-19},
+ {9.74658869395731e-14, -1.77210703526497e-19, 5.62573661988878e-26} };
+
+
+ for (i = 0 ; i < pontius_n; i++)
+ {
+ for (j = 0; j < pontius_p; j++)
+ {
+ gsl_matrix_set(X, i, j, pow(pontius_x[i], j));
+ }
+ }
+
+ gsl_vector_set_all (w, 1.0);
+
+ gsl_multifit_wlinear (X, w, &y.vector, c, cov, &chisq, work);
+
+ gsl_test_rel (gsl_vector_get(c,0), expected_c[0], 1e-10, "pontius gsl_fit_multilinear c0") ;
+ gsl_test_rel (gsl_vector_get(c,1), expected_c[1], 1e-10, "pontius gsl_fit_multilinear c1") ;
+ gsl_test_rel (gsl_vector_get(c,2), expected_c[2], 1e-10, "pontius gsl_fit_multilinear c2") ;
+
+
+ for (i = 0; i < pontius_p; i++)
+ {
+ for (j = 0; j < pontius_p; j++)
+ {
+ gsl_test_rel (gsl_matrix_get(cov,i,j), expected_cov[i][j], 1e-10,
+ "pontius gsl_fit_wmultilinear cov(%d,%d)", i, j) ;
+ }
+ }
+
+ gsl_test_rel (chisq, expected_chisq, 1e-10, "pontius gsl_fit_multilinear chisq") ;
+
+ gsl_vector_free(w);
+ gsl_vector_free(c);
+ gsl_matrix_free(cov);
+ gsl_matrix_free(X);
+ gsl_multifit_linear_free (work);
+ }
+}
diff --git a/gsl-1.9/multifit/work.c b/gsl-1.9/multifit/work.c
new file mode 100644
index 0000000..f05e3ff
--- /dev/null
+++ b/gsl-1.9/multifit/work.c
@@ -0,0 +1,133 @@
+/* multifit/work.c
+ *
+ * Copyright (C) 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_multifit.h>
+
+gsl_multifit_linear_workspace *
+gsl_multifit_linear_alloc (size_t n, size_t p)
+{
+ gsl_multifit_linear_workspace *w;
+
+ w = (gsl_multifit_linear_workspace *)
+ malloc (sizeof (gsl_multifit_linear_workspace));
+
+ if (w == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for multifit_linear struct",
+ GSL_ENOMEM, 0);
+ }
+
+ w->n = n; /* number of observations */
+ w->p = p; /* number of parameters */
+
+ w->A = gsl_matrix_alloc (n, p);
+
+ if (w->A == 0)
+ {
+ free (w);
+ GSL_ERROR_VAL ("failed to allocate space for A", GSL_ENOMEM, 0);
+ }
+
+ w->Q = gsl_matrix_alloc (p, p);
+
+ if (w->Q == 0)
+ {
+ gsl_matrix_free (w->A);
+ free (w);
+ GSL_ERROR_VAL ("failed to allocate space for Q", GSL_ENOMEM, 0);
+ }
+
+ w->QSI = gsl_matrix_alloc (p, p);
+
+ if (w->QSI == 0)
+ {
+ gsl_matrix_free (w->Q);
+ gsl_matrix_free (w->A);
+ free (w);
+ GSL_ERROR_VAL ("failed to allocate space for QSI", GSL_ENOMEM, 0);
+ }
+
+ w->S = gsl_vector_alloc (p);
+
+ if (w->S == 0)
+ {
+ gsl_matrix_free (w->QSI);
+ gsl_matrix_free (w->Q);
+ gsl_matrix_free (w->A);
+ free (w);
+ GSL_ERROR_VAL ("failed to allocate space for S", GSL_ENOMEM, 0);
+ }
+
+ w->t = gsl_vector_alloc (n);
+
+ if (w->t == 0)
+ {
+ gsl_vector_free (w->S);
+ gsl_matrix_free (w->QSI);
+ gsl_matrix_free (w->Q);
+ gsl_matrix_free (w->A);
+ free (w);
+ GSL_ERROR_VAL ("failed to allocate space for t", GSL_ENOMEM, 0);
+ }
+
+ w->xt = gsl_vector_calloc (p);
+
+ if (w->xt == 0)
+ {
+ gsl_vector_free (w->t);
+ gsl_vector_free (w->S);
+ gsl_matrix_free (w->QSI);
+ gsl_matrix_free (w->Q);
+ gsl_matrix_free (w->A);
+ free (w);
+ GSL_ERROR_VAL ("failed to allocate space for xt", GSL_ENOMEM, 0);
+ }
+
+ w->D = gsl_vector_calloc (p);
+
+ if (w->D == 0)
+ {
+ gsl_vector_free (w->D);
+ gsl_vector_free (w->t);
+ gsl_vector_free (w->S);
+ gsl_matrix_free (w->QSI);
+ gsl_matrix_free (w->Q);
+ gsl_matrix_free (w->A);
+ free (w);
+ GSL_ERROR_VAL ("failed to allocate space for xt", GSL_ENOMEM, 0);
+ }
+
+ return w;
+}
+
+void
+gsl_multifit_linear_free (gsl_multifit_linear_workspace * work)
+{
+ gsl_matrix_free (work->A);
+ gsl_matrix_free (work->Q);
+ gsl_matrix_free (work->QSI);
+ gsl_vector_free (work->S);
+ gsl_vector_free (work->t);
+ gsl_vector_free (work->xt);
+ gsl_vector_free (work->D);
+ free (work);
+}
+
diff --git a/gsl-1.9/multimin/ChangeLog b/gsl-1.9/multimin/ChangeLog
new file mode 100644
index 0000000..e516f0f
--- /dev/null
+++ b/gsl-1.9/multimin/ChangeLog
@@ -0,0 +1,130 @@
+2007-02-20 Brian Gough <bjg@network-theory.co.uk>
+
+ * vector_bfgs2.c (vector_bfgs2_iterate): use positive step size
+
+2007-02-17 Brian Gough <bjg@network-theory.co.uk>
+
+ * linear_minimize.c (minimize): return GSL_ENOPROG for roundoff
+
+2007-02-14 Brian Gough <bjg@network-theory.co.uk>
+
+ * linear_minimize.c: made all functions static
+
+ * linear_wrapper.c: made all functions static
+
+2007-02-08 Brian Gough <bjg@network-theory.co.uk>
+
+ * linear_wrapper.c: convert multidimensional function to
+ one-dimensional for line minimisation
+
+ * linear_minimize.c: one-dimensional minimisation from Fletcher
+
+ * vector_bfgs2.c: added Fletcher's implementation
+
+2006-02-18 Brian Gough <bjg@network-theory.co.uk>
+
+ * vector_bfgs.c (vector_bfgs_iterate): avoid division by zero if
+ dxdg == 0
+
+2003-07-24 Brian Gough <bjg@network-theory.co.uk>
+
+ * simplex.c (nmsimplex_set): changed index variable i from int to
+ size_t
+
+2003-04-17 Brian Gough <bjg@network-theory.co.uk>
+
+ * simplex.c (nmsimplex_iterate): bug fix to find the second
+ highest point correctly
+
+ * vector_bfgs.c (vector_bfgs_iterate): no need to update g0norm on
+ each downhill step, since g0norm is the norm for the initial
+ gradient.
+
+ * conjugate_pr.c (conjugate_pr_iterate): no need to update g0norm
+ on each downhill step, since g0norm is the norm for the initial
+ gradient.
+
+ * conjugate_fr.c (conjugate_fr_iterate): no need to update g0norm
+ on each downhill step, since g0norm is the norm for the initial
+ gradient.
+
+Sun Sep 30 20:50:00 2002 Tuomo Keskitalo <tkeskita@pt.hut.fi>
+
+ * Added Nelder-Mead Simplex optimization algorithm and
+ fminimizer structure.
+
+Sun Feb 10 21:57:36 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * conjugate_pr.c (conjugate_pr_iterate): return error ENOPROG if
+ cannot find downward step
+
+ * conjugate_fr.c (conjugate_fr_iterate): return error ENOPROG if
+ cannot find downward step
+
+ * vector_bfgs.c (vector_bfgs_iterate): return error ENOPROG if
+ cannot find downward step
+
+Thu Oct 25 11:56:06 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * added a tolerance parameter for the line minimizations
+
+Wed Oct 24 23:18:46 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * modified all routines to use a single minimiztion iteration,
+ instead of nested iterations for line and gradient search.
+
+Thu Oct 18 22:56:52 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * renamed gsl_multimin_f_minimizer to gsl_multimin_fminimizer for
+ consistency with rest of the library
+
+ * renamed gsl_multimin_fdf_minimizer to gsl_multimin_fdfminimizer
+ for consistency with rest of the library
+
+Mon Oct 8 21:41:51 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * diff.c (gsl_multimin_diff): pass params argument using
+ GSL_MULTIMIN_FN_EVAL (3 occurrences)
+
+Sun Jul 15 17:54:15 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * fdfminimizer.c (gsl_multimin_fdf_minimizer_alloc): eliminated
+ use of interval type
+
+Sat Apr 28 11:29:08 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * diff.c (gsl_multimin_diff): made indices unsigned
+
+Mon Apr 23 13:22:31 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_multimin.h diff.c: made starting_point const throughout to
+ avoid compiler warnings
+
+ * made internal functions static
+
+ * gsl_multimin.h: added missing prototype for gsl_multimin_diff
+
+Tue Apr 17 22:15:37 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_multimin.h: added missing prototype for gsl_multimin_compute_ep
+
+Sun Feb 18 16:35:21 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * fdfminimizer.c (gsl_multimin_fdf_minimizer_alloc): modified to
+ account for change in calling convection of
+ gsl_min_fminimizer_alloc
+
+Fri May 5 16:08:34 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c (test_fdf): fixed warning about "control reaches end of
+ non-void function" by changing test_fdf to return type void
+
+Tue May 2 19:20:46 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c (main): added return gsl_test_summary() to main, so that
+ test results are returned through the exit status.
+
+Mon Feb 14 13:12:16 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * made all internal functions static
+
diff --git a/gsl-1.9/multimin/Makefile.am b/gsl-1.9/multimin/Makefile.am
new file mode 100644
index 0000000..0cf06bb
--- /dev/null
+++ b/gsl-1.9/multimin/Makefile.am
@@ -0,0 +1,20 @@
+noinst_LTLIBRARIES = libgslmultimin.la
+
+pkginclude_HEADERS = gsl_multimin.h
+
+INCLUDES= -I$(top_builddir)
+
+libgslmultimin_la_SOURCES = fdfminimizer.c steepest_descent.c conjugate_fr.c conjugate_pr.c convergence.c diff.c vector_bfgs.c vector_bfgs2.c fminimizer.c simplex.c
+
+noinst_HEADERS = directional_minimize.c linear_minimize.c linear_wrapper.c
+
+check_PROGRAMS = test #demo
+
+TESTS = $(check_PROGRAMS)
+
+test_SOURCES = test.c test_funcs.c test_funcs.h
+test_LDADD = libgslmultimin.la ../min/libgslmin.la ../poly/libgslpoly.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../linalg/libgsllinalg.la ../permutation/libgslpermutation.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+
+#demo_SOURCES = demo.c
+#demo_LDADD = libgslmultimin.la ../min/libgslmin.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../linalg/libgsllinalg.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+
diff --git a/gsl-1.9/multimin/Makefile.in b/gsl-1.9/multimin/Makefile.in
new file mode 100644
index 0000000..da0d1c7
--- /dev/null
+++ b/gsl-1.9/multimin/Makefile.in
@@ -0,0 +1,554 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = test$(EXEEXT)
+subdir = multimin
+DIST_COMMON = $(noinst_HEADERS) $(pkginclude_HEADERS) \
+ $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog TODO
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgslmultimin_la_LIBADD =
+am_libgslmultimin_la_OBJECTS = fdfminimizer.lo steepest_descent.lo \
+ conjugate_fr.lo conjugate_pr.lo convergence.lo diff.lo \
+ vector_bfgs.lo vector_bfgs2.lo fminimizer.lo simplex.lo
+libgslmultimin_la_OBJECTS = $(am_libgslmultimin_la_OBJECTS)
+am_test_OBJECTS = test.$(OBJEXT) test_funcs.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = libgslmultimin.la ../min/libgslmin.la \
+ ../poly/libgslpoly.la ../blas/libgslblas.la \
+ ../cblas/libgslcblas.la ../linalg/libgsllinalg.la \
+ ../permutation/libgslpermutation.la ../matrix/libgslmatrix.la \
+ ../vector/libgslvector.la ../block/libgslblock.la \
+ ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la \
+ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \
+ ../utils/libutils.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgslmultimin_la_SOURCES) $(test_SOURCES)
+DIST_SOURCES = $(libgslmultimin_la_SOURCES) $(test_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libgslmultimin.la
+pkginclude_HEADERS = gsl_multimin.h
+INCLUDES = -I$(top_builddir)
+libgslmultimin_la_SOURCES = fdfminimizer.c steepest_descent.c conjugate_fr.c conjugate_pr.c convergence.c diff.c vector_bfgs.c vector_bfgs2.c fminimizer.c simplex.c
+noinst_HEADERS = directional_minimize.c linear_minimize.c linear_wrapper.c
+TESTS = $(check_PROGRAMS)
+test_SOURCES = test.c test_funcs.c test_funcs.h
+test_LDADD = libgslmultimin.la ../min/libgslmin.la ../poly/libgslpoly.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../linalg/libgsllinalg.la ../permutation/libgslpermutation.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps multimin/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps multimin/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgslmultimin.la: $(libgslmultimin_la_OBJECTS) $(libgslmultimin_la_DEPENDENCIES)
+ $(LINK) $(libgslmultimin_la_LDFLAGS) $(libgslmultimin_la_OBJECTS) $(libgslmultimin_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkgincludeHEADERS
+
+
+#demo_SOURCES = demo.c
+#demo_LDADD = libgslmultimin.la ../min/libgslmin.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../linalg/libgsllinalg.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/multimin/TODO b/gsl-1.9/multimin/TODO
new file mode 100644
index 0000000..4ba4741
--- /dev/null
+++ b/gsl-1.9/multimin/TODO
@@ -0,0 +1,3 @@
+* Check behavior of conjugate_fr in multimin -- the demo results look odd.
+
+* Should have made f and df return int instead of void.
diff --git a/gsl-1.9/multimin/conjugate_fr.c b/gsl-1.9/multimin/conjugate_fr.c
new file mode 100644
index 0000000..4cbe15a
--- /dev/null
+++ b/gsl-1.9/multimin/conjugate_fr.c
@@ -0,0 +1,271 @@
+/* multimin/conjugate_fr.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Fabrice Rossi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* conjugate_fr.c -- Conjugate gradient Fletcher-Reeve algorithm */
+
+/* Modified by Brian Gough to use single iteration structure */
+
+#include <config.h>
+#include <gsl/gsl_multimin.h>
+#include <gsl/gsl_blas.h>
+
+#include "directional_minimize.c"
+
+typedef struct
+{
+ int iter;
+ double step;
+ double max_step;
+ double tol;
+ gsl_vector *x1;
+ gsl_vector *dx1;
+ gsl_vector *x2;
+ double pnorm;
+ gsl_vector *p;
+ double g0norm;
+ gsl_vector *g0;
+}
+conjugate_fr_state_t;
+
+static int
+conjugate_fr_alloc (void *vstate, size_t n)
+{
+ conjugate_fr_state_t *state = (conjugate_fr_state_t *) vstate;
+
+ state->x1 = gsl_vector_calloc (n);
+
+ if (state->x1 == 0)
+ {
+ GSL_ERROR ("failed to allocate space for x1", GSL_ENOMEM);
+ }
+
+ state->dx1 = gsl_vector_calloc (n);
+
+ if (state->dx1 == 0)
+ {
+ gsl_vector_free (state->x1);
+ GSL_ERROR ("failed to allocate space for dx1", GSL_ENOMEM);
+ }
+
+ state->x2 = gsl_vector_calloc (n);
+
+ if (state->x2 == 0)
+ {
+ gsl_vector_free (state->dx1);
+ gsl_vector_free (state->x1);
+ GSL_ERROR ("failed to allocate space for x2", GSL_ENOMEM);
+ }
+
+ state->p = gsl_vector_calloc (n);
+
+ if (state->p == 0)
+ {
+ gsl_vector_free (state->x2);
+ gsl_vector_free (state->dx1);
+ gsl_vector_free (state->x1);
+ GSL_ERROR ("failed to allocate space for p", GSL_ENOMEM);
+ }
+
+ state->g0 = gsl_vector_calloc (n);
+
+ if (state->g0 == 0)
+ {
+ gsl_vector_free (state->p);
+ gsl_vector_free (state->x2);
+ gsl_vector_free (state->dx1);
+ gsl_vector_free (state->x1);
+ GSL_ERROR ("failed to allocate space for g0", GSL_ENOMEM);
+ }
+
+ return GSL_SUCCESS;
+}
+
+static int
+conjugate_fr_set (void *vstate, gsl_multimin_function_fdf * fdf,
+ const gsl_vector * x, double *f, gsl_vector * gradient,
+ double step_size, double tol)
+{
+ conjugate_fr_state_t *state = (conjugate_fr_state_t *) vstate;
+
+ state->iter = 0;
+ state->step = step_size;
+ state->max_step = step_size;
+ state->tol = tol;
+
+ GSL_MULTIMIN_FN_EVAL_F_DF (fdf, x, f, gradient);
+
+ /* Use the gradient as the initial direction */
+
+ gsl_vector_memcpy (state->p, gradient);
+ gsl_vector_memcpy (state->g0, gradient);
+
+ {
+ double gnorm = gsl_blas_dnrm2 (gradient);
+
+ state->pnorm = gnorm;
+ state->g0norm = gnorm;
+ }
+
+ return GSL_SUCCESS;
+}
+
+static void
+conjugate_fr_free (void *vstate)
+{
+ conjugate_fr_state_t *state = (conjugate_fr_state_t *) vstate;
+
+ gsl_vector_free (state->g0);
+ gsl_vector_free (state->p);
+ gsl_vector_free (state->x2);
+ gsl_vector_free (state->dx1);
+ gsl_vector_free (state->x1);
+}
+
+static int
+conjugate_fr_restart (void *vstate)
+{
+ conjugate_fr_state_t *state = (conjugate_fr_state_t *) vstate;
+
+ state->iter = 0;
+ return GSL_SUCCESS;
+}
+
+static int
+conjugate_fr_iterate (void *vstate, gsl_multimin_function_fdf * fdf,
+ gsl_vector * x, double *f,
+ gsl_vector * gradient, gsl_vector * dx)
+{
+ conjugate_fr_state_t *state = (conjugate_fr_state_t *) vstate;
+
+ gsl_vector *x1 = state->x1;
+ gsl_vector *dx1 = state->dx1;
+ gsl_vector *x2 = state->x2;
+ gsl_vector *p = state->p;
+ gsl_vector *g0 = state->g0;
+
+ double pnorm = state->pnorm;
+ double g0norm = state->g0norm;
+
+ double fa = *f, fb, fc;
+ double dir;
+ double stepa = 0.0, stepb, stepc = state->step, tol = state->tol;
+
+ double g1norm;
+ double pg;
+
+ if (pnorm == 0.0 || g0norm == 0.0)
+ {
+ gsl_vector_set_zero (dx);
+ return GSL_ENOPROG;
+ }
+
+ /* Determine which direction is downhill, +p or -p */
+
+ gsl_blas_ddot (p, gradient, &pg);
+
+ dir = (pg >= 0.0) ? +1.0 : -1.0;
+
+ /* Compute new trial point at x_c= x - step * p, where p is the
+ current direction */
+
+ take_step (x, p, stepc, dir / pnorm, x1, dx);
+
+ /* Evaluate function and gradient at new point xc */
+
+ fc = GSL_MULTIMIN_FN_EVAL_F (fdf, x1);
+
+ if (fc < fa)
+ {
+ /* Success, reduced the function value */
+ state->step = stepc * 2.0;
+ *f = fc;
+ gsl_vector_memcpy (x, x1);
+ GSL_MULTIMIN_FN_EVAL_DF (fdf, x1, gradient);
+ return GSL_SUCCESS;
+ }
+
+#ifdef DEBUG
+ printf ("got stepc = %g fc = %g\n", stepc, fc);
+#endif
+
+ /* Do a line minimisation in the region (xa,fa) (xc,fc) to find an
+ intermediate (xb,fb) satisifying fa > fb < fc. Choose an initial
+ xb based on parabolic interpolation */
+
+ intermediate_point (fdf, x, p, dir / pnorm, pg,
+ stepa, stepc, fa, fc, x1, dx1, gradient, &stepb, &fb);
+
+ if (stepb == 0.0)
+ {
+ return GSL_ENOPROG;
+ }
+
+ minimize (fdf, x, p, dir / pnorm,
+ stepa, stepb, stepc, fa, fb, fc, tol,
+ x1, dx1, x2, dx, gradient, &(state->step), f, &g1norm);
+
+ gsl_vector_memcpy (x, x2);
+
+ /* Choose a new conjugate direction for the next step */
+
+ state->iter = (state->iter + 1) % x->size;
+
+ if (state->iter == 0)
+ {
+ gsl_vector_memcpy (p, gradient);
+ state->pnorm = g1norm;
+ }
+ else
+ {
+ /* p' = g1 - beta * p */
+
+ double beta = -pow (g1norm / g0norm, 2.0);
+ gsl_blas_dscal (-beta, p);
+ gsl_blas_daxpy (1.0, gradient, p);
+ state->pnorm = gsl_blas_dnrm2 (p);
+ }
+
+ state->g0norm = g1norm;
+ gsl_vector_memcpy (g0, gradient);
+
+#ifdef DEBUG
+ printf ("updated conjugate directions\n");
+ printf ("p: ");
+ gsl_vector_fprintf (stdout, p, "%g");
+ printf ("g: ");
+ gsl_vector_fprintf (stdout, gradient, "%g");
+#endif
+
+ return GSL_SUCCESS;
+}
+
+
+
+static const gsl_multimin_fdfminimizer_type conjugate_fr_type = {
+ "conjugate_fr", /* name */
+ sizeof (conjugate_fr_state_t),
+ &conjugate_fr_alloc,
+ &conjugate_fr_set,
+ &conjugate_fr_iterate,
+ &conjugate_fr_restart,
+ &conjugate_fr_free
+};
+
+const gsl_multimin_fdfminimizer_type
+ * gsl_multimin_fdfminimizer_conjugate_fr = &conjugate_fr_type;
diff --git a/gsl-1.9/multimin/conjugate_pr.c b/gsl-1.9/multimin/conjugate_pr.c
new file mode 100644
index 0000000..56f453c
--- /dev/null
+++ b/gsl-1.9/multimin/conjugate_pr.c
@@ -0,0 +1,276 @@
+/* multimin/conjugate_pr.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Fabrice Rossi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* conjugate_pr.c -- Conjugate gradient Polak-Ribiere algorithm */
+
+/* Modified by Brian Gough to use single iteration structure */
+
+#include <config.h>
+#include <gsl/gsl_multimin.h>
+#include <gsl/gsl_blas.h>
+
+#include "directional_minimize.c"
+
+typedef struct
+{
+ int iter;
+ double step;
+ double max_step;
+ double tol;
+ gsl_vector *x1;
+ gsl_vector *dx1;
+ gsl_vector *x2;
+ double pnorm;
+ gsl_vector *p;
+ double g0norm;
+ gsl_vector *g0;
+}
+conjugate_pr_state_t;
+
+static int
+conjugate_pr_alloc (void *vstate, size_t n)
+{
+ conjugate_pr_state_t *state = (conjugate_pr_state_t *) vstate;
+
+ state->x1 = gsl_vector_calloc (n);
+
+ if (state->x1 == 0)
+ {
+ GSL_ERROR ("failed to allocate space for x1", GSL_ENOMEM);
+ }
+
+ state->dx1 = gsl_vector_calloc (n);
+
+ if (state->dx1 == 0)
+ {
+ gsl_vector_free (state->x1);
+ GSL_ERROR ("failed to allocate space for dx1", GSL_ENOMEM);
+ }
+
+ state->x2 = gsl_vector_calloc (n);
+
+ if (state->x2 == 0)
+ {
+ gsl_vector_free (state->dx1);
+ gsl_vector_free (state->x1);
+ GSL_ERROR ("failed to allocate space for x2", GSL_ENOMEM);
+ }
+
+ state->p = gsl_vector_calloc (n);
+
+ if (state->p == 0)
+ {
+ gsl_vector_free (state->x2);
+ gsl_vector_free (state->dx1);
+ gsl_vector_free (state->x1);
+ GSL_ERROR ("failed to allocate space for p", GSL_ENOMEM);
+ }
+
+ state->g0 = gsl_vector_calloc (n);
+
+ if (state->g0 == 0)
+ {
+ gsl_vector_free (state->p);
+ gsl_vector_free (state->x2);
+ gsl_vector_free (state->dx1);
+ gsl_vector_free (state->x1);
+ GSL_ERROR ("failed to allocate space for g0", GSL_ENOMEM);
+ }
+
+ return GSL_SUCCESS;
+}
+
+static int
+conjugate_pr_set (void *vstate, gsl_multimin_function_fdf * fdf,
+ const gsl_vector * x, double *f, gsl_vector * gradient,
+ double step_size, double tol)
+{
+ conjugate_pr_state_t *state = (conjugate_pr_state_t *) vstate;
+
+ state->iter = 0;
+ state->step = step_size;
+ state->max_step = step_size;
+ state->tol = tol;
+
+ GSL_MULTIMIN_FN_EVAL_F_DF (fdf, x, f, gradient);
+
+ /* Use the gradient as the initial direction */
+
+ gsl_vector_memcpy (state->p, gradient);
+ gsl_vector_memcpy (state->g0, gradient);
+
+ {
+ double gnorm = gsl_blas_dnrm2 (gradient);
+
+ state->pnorm = gnorm;
+ state->g0norm = gnorm;
+ }
+
+ return GSL_SUCCESS;
+}
+
+static void
+conjugate_pr_free (void *vstate)
+{
+ conjugate_pr_state_t *state = (conjugate_pr_state_t *) vstate;
+
+ gsl_vector_free (state->g0);
+ gsl_vector_free (state->p);
+ gsl_vector_free (state->x2);
+ gsl_vector_free (state->dx1);
+ gsl_vector_free (state->x1);
+}
+
+static int
+conjugate_pr_restart (void *vstate)
+{
+ conjugate_pr_state_t *state = (conjugate_pr_state_t *) vstate;
+
+ state->iter = 0;
+ return GSL_SUCCESS;
+}
+
+static int
+conjugate_pr_iterate (void *vstate, gsl_multimin_function_fdf * fdf,
+ gsl_vector * x, double *f,
+ gsl_vector * gradient, gsl_vector * dx)
+{
+ conjugate_pr_state_t *state = (conjugate_pr_state_t *) vstate;
+
+ gsl_vector *x1 = state->x1;
+ gsl_vector *dx1 = state->dx1;
+ gsl_vector *x2 = state->x2;
+ gsl_vector *p = state->p;
+ gsl_vector *g0 = state->g0;
+
+ double pnorm = state->pnorm;
+ double g0norm = state->g0norm;
+
+ double fa = *f, fb, fc;
+ double dir;
+ double stepa = 0.0, stepb, stepc = state->step, tol = state->tol;
+
+ double g1norm;
+ double pg;
+
+ if (pnorm == 0.0 || g0norm == 0.0)
+ {
+ gsl_vector_set_zero (dx);
+ return GSL_ENOPROG;
+ }
+
+ /* Determine which direction is downhill, +p or -p */
+
+ gsl_blas_ddot (p, gradient, &pg);
+
+ dir = (pg >= 0.0) ? +1.0 : -1.0;
+
+ /* Compute new trial point at x_c= x - step * p, where p is the
+ current direction */
+
+ take_step (x, p, stepc, dir / pnorm, x1, dx);
+
+ /* Evaluate function and gradient at new point xc */
+
+ fc = GSL_MULTIMIN_FN_EVAL_F (fdf, x1);
+
+ if (fc < fa)
+ {
+ /* Success, reduced the function value */
+ state->step = stepc * 2.0;
+ *f = fc;
+ gsl_vector_memcpy (x, x1);
+ GSL_MULTIMIN_FN_EVAL_DF (fdf, x1, gradient);
+ return GSL_SUCCESS;
+ }
+
+#ifdef DEBUG
+ printf ("got stepc = %g fc = %g\n", stepc, fc);
+#endif
+
+ /* Do a line minimisation in the region (xa,fa) (xc,fc) to find an
+ intermediate (xb,fb) satisifying fa > fb < fc. Choose an initial
+ xb based on parabolic interpolation */
+
+ intermediate_point (fdf, x, p, dir / pnorm, pg,
+ stepa, stepc, fa, fc, x1, dx1, gradient, &stepb, &fb);
+
+ if (stepb == 0.0)
+ {
+ return GSL_ENOPROG;
+ }
+
+ minimize (fdf, x, p, dir / pnorm,
+ stepa, stepb, stepc, fa, fb, fc, tol,
+ x1, dx1, x2, dx, gradient, &(state->step), f, &g1norm);
+
+ gsl_vector_memcpy (x, x2);
+
+ /* Choose a new conjugate direction for the next step */
+
+ state->iter = (state->iter + 1) % x->size;
+
+ if (state->iter == 0)
+ {
+ gsl_vector_memcpy (p, gradient);
+ state->pnorm = g1norm;
+ }
+ else
+ {
+ /* p' = g1 - beta * p */
+
+ double g0g1, beta;
+
+ gsl_blas_daxpy (-1.0, gradient, g0); /* g0' = g0 - g1 */
+ gsl_blas_ddot(g0, gradient, &g0g1); /* g1g0 = (g0-g1).g1 */
+ beta = g0g1 / (g0norm*g0norm); /* beta = -((g1 - g0).g1)/(g0.g0) */
+
+ gsl_blas_dscal (-beta, p);
+ gsl_blas_daxpy (1.0, gradient, p);
+ state->pnorm = gsl_blas_dnrm2 (p);
+ }
+
+ state->g0norm = g1norm;
+ gsl_vector_memcpy (g0, gradient);
+
+#ifdef DEBUG
+ printf ("updated conjugate directions\n");
+ printf ("p: ");
+ gsl_vector_fprintf (stdout, p, "%g");
+ printf ("g: ");
+ gsl_vector_fprintf (stdout, gradient, "%g");
+#endif
+
+ return GSL_SUCCESS;
+}
+
+
+
+static const gsl_multimin_fdfminimizer_type conjugate_pr_type = {
+ "conjugate_pr", /* name */
+ sizeof (conjugate_pr_state_t),
+ &conjugate_pr_alloc,
+ &conjugate_pr_set,
+ &conjugate_pr_iterate,
+ &conjugate_pr_restart,
+ &conjugate_pr_free
+};
+
+const gsl_multimin_fdfminimizer_type
+ * gsl_multimin_fdfminimizer_conjugate_pr = &conjugate_pr_type;
diff --git a/gsl-1.9/multimin/convergence.c b/gsl-1.9/multimin/convergence.c
new file mode 100644
index 0000000..c468d3a
--- /dev/null
+++ b/gsl-1.9/multimin/convergence.c
@@ -0,0 +1,58 @@
+/* multimin/convergence.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Fabrice Rossi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_multimin.h>
+#include <gsl/gsl_blas.h>
+
+int
+gsl_multimin_test_gradient (const gsl_vector *g, double epsabs)
+{
+ double norm;
+
+ if (epsabs < 0.0)
+ {
+ GSL_ERROR ("absolute tolerance is negative", GSL_EBADTOL);
+ }
+
+ norm = gsl_blas_dnrm2(g);
+
+ if (norm < epsabs)
+ {
+ return GSL_SUCCESS;
+ }
+
+ return GSL_CONTINUE;
+}
+
+int
+gsl_multimin_test_size (const double size, double epsabs)
+{
+ if (epsabs < 0.0)
+ {
+ GSL_ERROR ("absolute tolerance is negative", GSL_EBADTOL);
+ }
+
+ if (size < epsabs)
+ {
+ return GSL_SUCCESS;
+ }
+
+ return GSL_CONTINUE;
+}
diff --git a/gsl-1.9/multimin/diff.c b/gsl-1.9/multimin/diff.c
new file mode 100644
index 0000000..218cc7f
--- /dev/null
+++ b/gsl-1.9/multimin/diff.c
@@ -0,0 +1,58 @@
+/* multimin/diff.c
+ *
+ * Copyright (C) 2000 David Morrison
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_multimin.h>
+
+int
+gsl_multimin_diff (const gsl_multimin_function * f,
+ const gsl_vector * x, gsl_vector * g)
+{
+ size_t i, n = f->n;
+
+ double h = GSL_SQRT_DBL_EPSILON;
+
+
+ gsl_vector * x1 = gsl_vector_alloc (n); /* FIXME: pass as argument */
+
+ gsl_vector_memcpy (x1, x);
+
+ for (i = 0; i < n; i++)
+ {
+ double fl, fh;
+
+ double xi = gsl_vector_get (x, i);
+ double dx = fabs(xi) * h;
+
+ if (dx == 0.0) dx = h;
+
+ gsl_vector_set (x1, i, xi + dx);
+ fh = GSL_MULTIMIN_FN_EVAL(f, x1);
+
+ gsl_vector_set (x1, i, xi - dx);
+ fl = GSL_MULTIMIN_FN_EVAL(f, x1);
+
+ gsl_vector_set (x1, i, xi);
+ gsl_vector_set (g, i, (fh - fl) / (2.0 * dx));
+ }
+
+ gsl_vector_free (x1);
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/multimin/directional_minimize.c b/gsl-1.9/multimin/directional_minimize.c
new file mode 100644
index 0000000..8e1c366
--- /dev/null
+++ b/gsl-1.9/multimin/directional_minimize.c
@@ -0,0 +1,236 @@
+/* multimin/directional_minimize.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Fabrice Rossi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+static void
+take_step (const gsl_vector * x, const gsl_vector * p,
+ double step, double lambda, gsl_vector * x1, gsl_vector * dx)
+{
+ gsl_vector_set_zero (dx);
+ gsl_blas_daxpy (-step * lambda, p, dx);
+
+ gsl_vector_memcpy (x1, x);
+ gsl_blas_daxpy (1.0, dx, x1);
+}
+
+static void
+intermediate_point (gsl_multimin_function_fdf * fdf,
+ const gsl_vector * x, const gsl_vector * p,
+ double lambda,
+ double pg,
+ double stepa, double stepc,
+ double fa, double fc,
+ gsl_vector * x1, gsl_vector * dx, gsl_vector * gradient,
+ double * step, double * f)
+{
+ double stepb, fb;
+
+trial:
+ {
+ double u = fabs (pg * lambda * stepc);
+ stepb = 0.5 * stepc * u / ((fc - fa) + u);
+ }
+
+ take_step (x, p, stepb, lambda, x1, dx);
+
+ fb = GSL_MULTIMIN_FN_EVAL_F (fdf, x1);
+
+#ifdef DEBUG
+ printf ("trying stepb = %g fb = %.18e\n", stepb, fb);
+#endif
+
+ if (fb >= fa && stepb > 0.0)
+ {
+ /* downhill step failed, reduce step-size and try again */
+ fc = fb;
+ stepc = stepb;
+ goto trial;
+ }
+#ifdef DEBUG
+ printf ("ok!\n");
+#endif
+
+ *step = stepb;
+ *f = fb;
+ GSL_MULTIMIN_FN_EVAL_DF(fdf, x1, gradient);
+}
+
+static void
+minimize (gsl_multimin_function_fdf * fdf,
+ const gsl_vector * x, const gsl_vector * p,
+ double lambda,
+ double stepa, double stepb, double stepc,
+ double fa, double fb, double fc, double tol,
+ gsl_vector * x1, gsl_vector * dx1,
+ gsl_vector * x2, gsl_vector * dx2, gsl_vector * gradient,
+ double * step, double * f, double * gnorm)
+{
+ /* Starting at (x0, f0) move along the direction p to find a minimum
+ f(x0 - lambda * p), returning the new point x1 = x0-lambda*p,
+ f1=f(x1) and g1 = grad(f) at x1. */
+
+ double u = stepb;
+ double v = stepa;
+ double w = stepc;
+ double fu = fb;
+ double fv = fa;
+ double fw = fc;
+
+ double old2 = fabs(w - v);
+ double old1 = fabs(v - u);
+
+ double stepm, fm, pg, gnorm1;
+
+ int iter = 0;
+
+ gsl_vector_memcpy (x2, x1);
+ gsl_vector_memcpy (dx2, dx1);
+
+ *f = fb;
+ *step = stepb;
+ *gnorm = gsl_blas_dnrm2 (gradient);
+
+mid_trial:
+
+ iter++;
+
+ if (iter > 10)
+ {
+ return; /* MAX ITERATIONS */
+ }
+
+ {
+ double dw = w - u;
+ double dv = v - u;
+ double du = 0.0;
+
+ double e1 = ((fv - fu) * dw * dw + (fu - fw) * dv * dv);
+ double e2 = 2.0 * ((fv - fu) * dw + (fu - fw) * dv);
+
+ if (e2 != 0.0)
+ {
+ du = e1 / e2;
+ }
+
+ if (du > 0.0 && du < (stepc - stepb) && fabs(du) < 0.5 * old2)
+ {
+ stepm = u + du;
+ }
+ else if (du < 0.0 && du > (stepa - stepb) && fabs(du) < 0.5 * old2)
+ {
+ stepm = u + du;
+ }
+ else if ((stepc - stepb) > (stepb - stepa))
+ {
+ stepm = 0.38 * (stepc - stepb) + stepb;
+ }
+ else
+ {
+ stepm = stepb - 0.38 * (stepb - stepa);
+ }
+ }
+
+ take_step (x, p, stepm, lambda, x1, dx1);
+
+ fm = GSL_MULTIMIN_FN_EVAL_F (fdf, x1);
+
+#ifdef DEBUG
+ printf ("trying stepm = %g fm = %.18e\n", stepm, fm);
+#endif
+
+ if (fm > fb)
+ {
+ if (fm < fv)
+ {
+ w = v;
+ v = stepm;
+ fw = fv;
+ fv = fm;
+ }
+ else if (fm < fw)
+ {
+ w = stepm;
+ fw = fm;
+ }
+
+ if (stepm < stepb)
+ {
+ stepa = stepm;
+ fa = fm;
+ }
+ else
+ {
+ stepc = stepm;
+ fc = fm;
+ }
+ goto mid_trial;
+ }
+ else if (fm <= fb)
+ {
+ old2 = old1;
+ old1 = fabs(u - stepm);
+ w = v;
+ v = u;
+ u = stepm;
+ fw = fv;
+ fv = fu;
+ fu = fm;
+
+ gsl_vector_memcpy (x2, x1);
+ gsl_vector_memcpy (dx2, dx1);
+
+ GSL_MULTIMIN_FN_EVAL_DF (fdf, x1, gradient);
+ gsl_blas_ddot (p, gradient, &pg);
+ gnorm1 = gsl_blas_dnrm2 (gradient);
+
+#ifdef DEBUG
+ printf ("p: "); gsl_vector_fprintf(stdout, p, "%g");
+ printf ("g: "); gsl_vector_fprintf(stdout, gradient, "%g");
+ printf ("gnorm: %.18e\n", gnorm1);
+ printf ("pg: %.18e\n", pg);
+ printf ("orth: %g\n", fabs (pg * lambda/ gnorm1));
+#endif
+ *f = fm;
+ *step = stepm;
+ *gnorm = gnorm1;
+
+ if (fabs (pg * lambda / gnorm1) < tol)
+ {
+#ifdef DEBUG
+ printf("ok!\n");
+#endif
+ return; /* SUCCESS */
+ }
+
+ if (stepm < stepb)
+ {
+ stepc = stepb;
+ fc = fb;
+ stepb = stepm;
+ fb = fm;
+ }
+ else
+ {
+ stepa = stepb;
+ fa = fb;
+ stepb = stepm;
+ fb = fm;
+ }
+ goto mid_trial;
+ }
+}
diff --git a/gsl-1.9/multimin/fdfminimizer.c b/gsl-1.9/multimin/fdfminimizer.c
new file mode 100644
index 0000000..9f4125a
--- /dev/null
+++ b/gsl-1.9/multimin/fdfminimizer.c
@@ -0,0 +1,173 @@
+/* multimin/fdfminimizer.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Fabrice Rossi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_multimin.h>
+
+gsl_multimin_fdfminimizer *
+gsl_multimin_fdfminimizer_alloc (const gsl_multimin_fdfminimizer_type * T,
+ size_t n)
+{
+ int status;
+
+ gsl_multimin_fdfminimizer *s =
+ (gsl_multimin_fdfminimizer *) malloc (sizeof (gsl_multimin_fdfminimizer));
+
+ if (s == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for minimizer struct",
+ GSL_ENOMEM, 0);
+ }
+
+ s->type = T;
+
+ s->x = gsl_vector_calloc (n);
+
+ if (s->x == 0)
+ {
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for x", GSL_ENOMEM, 0);
+ }
+
+ s->gradient = gsl_vector_calloc (n);
+
+ if (s->gradient == 0)
+ {
+ gsl_vector_free (s->x);
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for gradient", GSL_ENOMEM, 0);
+ }
+
+ s->dx = gsl_vector_calloc (n);
+
+ if (s->dx == 0)
+ {
+ gsl_vector_free (s->x);
+ gsl_vector_free (s->gradient);
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for dx", GSL_ENOMEM, 0);
+ }
+
+ s->state = malloc (T->size);
+
+ if (s->state == 0)
+ {
+ gsl_vector_free (s->x);
+ gsl_vector_free (s->gradient);
+ gsl_vector_free (s->dx);
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for minimizer state",
+ GSL_ENOMEM, 0);
+ }
+
+ status = (T->alloc) (s->state, n);
+
+ if (status != GSL_SUCCESS)
+ {
+ free (s->state);
+ gsl_vector_free (s->x);
+ gsl_vector_free (s->gradient);
+ gsl_vector_free (s->dx);
+ free (s);
+
+ GSL_ERROR_VAL ("failed to initialize minimizer state", GSL_ENOMEM, 0);
+ }
+
+ return s;
+}
+
+int
+gsl_multimin_fdfminimizer_set (gsl_multimin_fdfminimizer * s,
+ gsl_multimin_function_fdf * fdf,
+ const gsl_vector * x,
+ double step_size, double tol)
+{
+ if (s->x->size != fdf->n)
+ {
+ GSL_ERROR ("function incompatible with solver size", GSL_EBADLEN);
+ }
+
+ if (x->size != fdf->n)
+ {
+ GSL_ERROR ("vector length not compatible with function", GSL_EBADLEN);
+ }
+
+ s->fdf = fdf;
+
+ gsl_vector_memcpy (s->x,x);
+ gsl_vector_set_zero (s->dx);
+
+ return (s->type->set) (s->state, s->fdf, s->x, &(s->f), s->gradient, step_size, tol);
+}
+
+void
+gsl_multimin_fdfminimizer_free (gsl_multimin_fdfminimizer * s)
+{
+ (s->type->free) (s->state);
+ free (s->state);
+ gsl_vector_free (s->dx);
+ gsl_vector_free (s->gradient);
+ gsl_vector_free (s->x);
+ free (s);
+}
+
+int
+gsl_multimin_fdfminimizer_iterate (gsl_multimin_fdfminimizer * s)
+{
+ return (s->type->iterate) (s->state, s->fdf, s->x, &(s->f), s->gradient, s->dx);
+}
+
+int
+gsl_multimin_fdfminimizer_restart (gsl_multimin_fdfminimizer * s)
+{
+ return (s->type->restart) (s->state);
+}
+
+const char *
+gsl_multimin_fdfminimizer_name (const gsl_multimin_fdfminimizer * s)
+{
+ return s->type->name;
+}
+
+
+gsl_vector *
+gsl_multimin_fdfminimizer_x (gsl_multimin_fdfminimizer * s)
+{
+ return s->x;
+}
+
+gsl_vector *
+gsl_multimin_fdfminimizer_dx (gsl_multimin_fdfminimizer * s)
+{
+ return s->dx;
+}
+
+gsl_vector *
+gsl_multimin_fdfminimizer_gradient (gsl_multimin_fdfminimizer * s)
+{
+ return s->gradient;
+}
+
+double
+gsl_multimin_fdfminimizer_minimum (gsl_multimin_fdfminimizer * s)
+{
+ return s->f;
+}
+
diff --git a/gsl-1.9/multimin/fminimizer.c b/gsl-1.9/multimin/fminimizer.c
new file mode 100644
index 0000000..507dfd4
--- /dev/null
+++ b/gsl-1.9/multimin/fminimizer.c
@@ -0,0 +1,134 @@
+/* multimin/fminimizer.c
+ *
+ * Copyright (C) 2002 Tuomo Keskitalo, Ivo Alxneit
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_multimin.h>
+
+gsl_multimin_fminimizer *
+gsl_multimin_fminimizer_alloc (const gsl_multimin_fminimizer_type * T,
+ size_t n)
+{
+ int status;
+
+ gsl_multimin_fminimizer *s =
+ (gsl_multimin_fminimizer *) malloc (sizeof (gsl_multimin_fminimizer));
+
+ if (s == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for minimizer struct",
+ GSL_ENOMEM, 0);
+ }
+
+ s->type = T;
+
+ s->x = gsl_vector_calloc (n);
+
+ if (s->x == 0)
+ {
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for x", GSL_ENOMEM, 0);
+ }
+
+ s->state = malloc (T->size);
+
+ if (s->state == 0)
+ {
+ gsl_vector_free (s->x);
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for minimizer state",
+ GSL_ENOMEM, 0);
+ }
+
+ status = (T->alloc) (s->state, n);
+
+ if (status != GSL_SUCCESS)
+ {
+ free (s->state);
+ gsl_vector_free (s->x);
+ free (s);
+
+ GSL_ERROR_VAL ("failed to initialize minimizer state", GSL_ENOMEM, 0);
+ }
+
+ return s;
+}
+
+int
+gsl_multimin_fminimizer_set (gsl_multimin_fminimizer * s,
+ gsl_multimin_function * f,
+ const gsl_vector * x,
+ const gsl_vector * step_size)
+{
+ if (s->x->size != f->n)
+ {
+ GSL_ERROR ("function incompatible with solver size", GSL_EBADLEN);
+ }
+
+ if (x->size != f->n || step_size->size != f->n)
+ {
+ GSL_ERROR ("vector length not compatible with function", GSL_EBADLEN);
+ }
+
+ s->f = f;
+
+ gsl_vector_memcpy (s->x,x);
+
+ return (s->type->set) (s->state, s->f, s->x, &(s->size), step_size);
+}
+
+void
+gsl_multimin_fminimizer_free (gsl_multimin_fminimizer * s)
+{
+ (s->type->free) (s->state);
+ free (s->state);
+ gsl_vector_free (s->x);
+ free (s);
+}
+
+int
+gsl_multimin_fminimizer_iterate (gsl_multimin_fminimizer * s)
+{
+ return (s->type->iterate) (s->state, s->f, s->x, &(s->size), &(s->fval));
+}
+
+const char *
+gsl_multimin_fminimizer_name (const gsl_multimin_fminimizer * s)
+{
+ return s->type->name;
+}
+
+
+gsl_vector *
+gsl_multimin_fminimizer_x (const gsl_multimin_fminimizer * s)
+{
+ return s->x;
+}
+
+double
+gsl_multimin_fminimizer_minimum (const gsl_multimin_fminimizer * s)
+{
+ return s->fval;
+}
+
+double
+gsl_multimin_fminimizer_size (const gsl_multimin_fminimizer * s)
+{
+ return s->size;
+}
diff --git a/gsl-1.9/multimin/gsl_multimin.h b/gsl-1.9/multimin/gsl_multimin.h
new file mode 100644
index 0000000..53c342d
--- /dev/null
+++ b/gsl-1.9/multimin/gsl_multimin.h
@@ -0,0 +1,225 @@
+/* multimin/gsl_multimin.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Fabrice Rossi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Modified by Tuomo Keskitalo to include fminimizer and
+ Nelder Mead related lines */
+
+#ifndef __GSL_MULTIMIN_H__
+#define __GSL_MULTIMIN_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_types.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_min.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+/* Definition of an arbitrary real-valued function with gsl_vector input and */
+/* parameters */
+struct gsl_multimin_function_struct
+{
+ double (* f) (const gsl_vector * x, void * params);
+ size_t n;
+ void * params;
+};
+
+typedef struct gsl_multimin_function_struct gsl_multimin_function;
+
+#define GSL_MULTIMIN_FN_EVAL(F,x) (*((F)->f))(x,(F)->params)
+
+/* Definition of an arbitrary differentiable real-valued function */
+/* with gsl_vector input and parameters */
+struct gsl_multimin_function_fdf_struct
+{
+ double (* f) (const gsl_vector * x, void * params);
+ void (* df) (const gsl_vector * x, void * params,gsl_vector * df);
+ void (* fdf) (const gsl_vector * x, void * params,double *f,gsl_vector * df);
+ size_t n;
+ void * params;
+};
+
+typedef struct gsl_multimin_function_fdf_struct gsl_multimin_function_fdf;
+
+#define GSL_MULTIMIN_FN_EVAL_F(F,x) (*((F)->f))(x,(F)->params)
+#define GSL_MULTIMIN_FN_EVAL_DF(F,x,g) (*((F)->df))(x,(F)->params,(g))
+#define GSL_MULTIMIN_FN_EVAL_F_DF(F,x,y,g) (*((F)->fdf))(x,(F)->params,(y),(g))
+
+int gsl_multimin_diff (const gsl_multimin_function * f,
+ const gsl_vector * x, gsl_vector * g);
+
+/* minimization of non-differentiable functions */
+
+typedef struct
+{
+ const char *name;
+ size_t size;
+ int (*alloc) (void *state, size_t n);
+ int (*set) (void *state, gsl_multimin_function * f,
+ const gsl_vector * x,
+ double * size,
+ const gsl_vector * step_size);
+ int (*iterate) (void *state, gsl_multimin_function * f,
+ gsl_vector * x,
+ double * size,
+ double * fval);
+ void (*free) (void *state);
+}
+gsl_multimin_fminimizer_type;
+
+typedef struct
+{
+ /* multi dimensional part */
+ const gsl_multimin_fminimizer_type *type;
+ gsl_multimin_function *f;
+
+ double fval;
+ gsl_vector * x;
+
+ double size;
+
+ void *state;
+}
+gsl_multimin_fminimizer;
+
+gsl_multimin_fminimizer *
+gsl_multimin_fminimizer_alloc(const gsl_multimin_fminimizer_type *T,
+ size_t n);
+
+int
+gsl_multimin_fminimizer_set (gsl_multimin_fminimizer * s,
+ gsl_multimin_function * f,
+ const gsl_vector * x,
+ const gsl_vector * step_size);
+
+void
+gsl_multimin_fminimizer_free(gsl_multimin_fminimizer *s);
+
+const char *
+gsl_multimin_fminimizer_name (const gsl_multimin_fminimizer * s);
+
+int
+gsl_multimin_fminimizer_iterate(gsl_multimin_fminimizer *s);
+
+gsl_vector *
+gsl_multimin_fminimizer_x (const gsl_multimin_fminimizer * s);
+
+double
+gsl_multimin_fminimizer_minimum (const gsl_multimin_fminimizer * s);
+
+double
+gsl_multimin_fminimizer_size (const gsl_multimin_fminimizer * s);
+
+/* Convergence test functions */
+
+int
+gsl_multimin_test_gradient(const gsl_vector * g,double epsabs);
+
+int
+gsl_multimin_test_size(const double size ,double epsabs);
+
+/* minimisation of differentiable functions */
+
+typedef struct
+{
+ const char *name;
+ size_t size;
+ int (*alloc) (void *state, size_t n);
+ int (*set) (void *state, gsl_multimin_function_fdf * fdf,
+ const gsl_vector * x, double * f,
+ gsl_vector * gradient, double step_size, double tol);
+ int (*iterate) (void *state,gsl_multimin_function_fdf * fdf,
+ gsl_vector * x, double * f,
+ gsl_vector * gradient, gsl_vector * dx);
+ int (*restart) (void *state);
+ void (*free) (void *state);
+}
+gsl_multimin_fdfminimizer_type;
+
+typedef struct
+{
+ /* multi dimensional part */
+ const gsl_multimin_fdfminimizer_type *type;
+ gsl_multimin_function_fdf *fdf;
+
+ double f;
+ gsl_vector * x;
+ gsl_vector * gradient;
+ gsl_vector * dx;
+
+ void *state;
+}
+gsl_multimin_fdfminimizer;
+
+gsl_multimin_fdfminimizer *
+gsl_multimin_fdfminimizer_alloc(const gsl_multimin_fdfminimizer_type *T,
+ size_t n);
+
+int
+gsl_multimin_fdfminimizer_set (gsl_multimin_fdfminimizer * s,
+ gsl_multimin_function_fdf *fdf,
+ const gsl_vector * x,
+ double step_size, double tol);
+
+void
+gsl_multimin_fdfminimizer_free(gsl_multimin_fdfminimizer *s);
+
+const char *
+gsl_multimin_fdfminimizer_name (const gsl_multimin_fdfminimizer * s);
+
+int
+gsl_multimin_fdfminimizer_iterate(gsl_multimin_fdfminimizer *s);
+
+int
+gsl_multimin_fdfminimizer_restart(gsl_multimin_fdfminimizer *s);
+
+gsl_vector *
+gsl_multimin_fdfminimizer_x (gsl_multimin_fdfminimizer * s);
+
+gsl_vector *
+gsl_multimin_fdfminimizer_dx (gsl_multimin_fdfminimizer * s);
+
+gsl_vector *
+gsl_multimin_fdfminimizer_gradient (gsl_multimin_fdfminimizer * s);
+
+double
+gsl_multimin_fdfminimizer_minimum (gsl_multimin_fdfminimizer * s);
+
+GSL_VAR const gsl_multimin_fdfminimizer_type *gsl_multimin_fdfminimizer_steepest_descent;
+GSL_VAR const gsl_multimin_fdfminimizer_type *gsl_multimin_fdfminimizer_conjugate_pr;
+GSL_VAR const gsl_multimin_fdfminimizer_type *gsl_multimin_fdfminimizer_conjugate_fr;
+GSL_VAR const gsl_multimin_fdfminimizer_type *gsl_multimin_fdfminimizer_vector_bfgs;
+GSL_VAR const gsl_multimin_fdfminimizer_type *gsl_multimin_fdfminimizer_vector_bfgs2;
+GSL_VAR const gsl_multimin_fminimizer_type *gsl_multimin_fminimizer_nmsimplex;
+
+
+__END_DECLS
+
+#endif /* __GSL_MULTIMIN_H__ */
diff --git a/gsl-1.9/multimin/linear_minimize.c b/gsl-1.9/multimin/linear_minimize.c
new file mode 100644
index 0000000..60677d6
--- /dev/null
+++ b/gsl-1.9/multimin/linear_minimize.c
@@ -0,0 +1,247 @@
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_poly.h>
+
+/* Find a minimum in x=[0,1] of the interpolating quadratic through
+ * (0,f0) (1,f1) with derivative fp0 at x=0. The interpolating
+ * polynomial is q(x) = f0 + fp0 * z + (f1-f0-fp0) * z^2
+ */
+
+static double
+interp_quad (double f0, double fp0, double f1, double zl, double zh)
+{
+ double fl = f0 + zl*(fp0 + zl*(f1 - f0 -fp0));
+ double fh = f0 + zh*(fp0 + zh*(f1 - f0 -fp0));
+ double c = 2 * (f1 - f0 - fp0); /* curvature */
+
+ double zmin = zl, fmin = fl;
+
+ if (fh < fmin) { zmin = zh; fmin = fh; }
+
+ if (c > 0) /* positive curvature required for a minimum */
+ {
+ double z = -fp0 / c; /* location of minimum */
+ if (z > zl && z < zh) {
+ double f = f0 + z*(fp0 + z*(f1 - f0 -fp0));
+ if (f < fmin) { zmin = z; fmin = f; };
+ }
+ }
+
+ return zmin;
+}
+
+/* Find a minimum in x=[0,1] of the interpolating cubic through
+ * (0,f0) (1,f1) with derivatives fp0 at x=0 and fp1 at x=1.
+ *
+ * The interpolating polynomial is:
+ *
+ * c(x) = f0 + fp0 * z + eta * z^2 + xi * z^3
+ *
+ * where eta=3*(f1-f0)-2*fp0-fp1, xi=fp0+fp1-2*(f1-f0).
+ */
+
+static double
+cubic (double c0, double c1, double c2, double c3, double z)
+{
+ return c0 + z * (c1 + z * (c2 + z * c3));
+}
+
+static void
+check_extremum (double c0, double c1, double c2, double c3, double z,
+ double *zmin, double *fmin)
+{
+ /* could make an early return by testing curvature >0 for minimum */
+
+ double y = cubic (c0, c1, c2, c3, z);
+
+ if (y < *fmin)
+ {
+ *zmin = z; /* accepted new point*/
+ *fmin = y;
+ }
+}
+
+static double
+interp_cubic (double f0, double fp0, double f1, double fp1, double zl, double zh)
+{
+ double eta = 3 * (f1 - f0) - 2 * fp0 - fp1;
+ double xi = fp0 + fp1 - 2 * (f1 - f0);
+ double c0 = f0, c1 = fp0, c2 = eta, c3 = xi;
+ double zmin, fmin;
+ double z0, z1;
+
+ zmin = zl; fmin = cubic(c0, c1, c2, c3, zl);
+ check_extremum (c0, c1, c2, c3, zh, &zmin, &fmin);
+
+ {
+ int n = gsl_poly_solve_quadratic (3 * c3, 2 * c2, c1, &z0, &z1);
+
+ if (n == 2) /* found 2 roots */
+ {
+ if (z0 > zl && z0 < zh)
+ check_extremum (c0, c1, c2, c3, z0, &zmin, &fmin);
+ if (z1 > zl && z1 < zh)
+ check_extremum (c0, c1, c2, c3, z1, &zmin, &fmin);
+ }
+ else if (n == 1) /* found 1 root */
+ {
+ if (z0 > zl && z0 < zh)
+ check_extremum (c0, c1, c2, c3, z0, &zmin, &fmin);
+ }
+ }
+
+ return zmin;
+}
+
+
+static double
+interpolate (double a, double fa, double fpa,
+ double b, double fb, double fpb, double xmin, double xmax,
+ int order)
+{
+ /* Map [a,b] to [0,1] */
+ double z, alpha, zmin, zmax;
+
+ zmin = (xmin - a) / (b - a);
+ zmax = (xmax - a) / (b - a);
+
+ if (zmin > zmax)
+ {
+ double tmp = zmin;
+ zmin = zmax;
+ zmax = tmp;
+ };
+
+ if (order > 2 && GSL_IS_REAL(fpb)) {
+ z = interp_cubic (fa, fpa * (b - a), fb, fpb * (b - a), zmin, zmax);
+ } else {
+ z = interp_quad (fa, fpa * (b - a), fb, zmin, zmax);
+ }
+
+ alpha = a + z * (b - a);
+
+ return alpha;
+}
+
+/* recommended values from Fletcher are
+ rho = 0.01, sigma = 0.1, tau1 = 9, tau2 = 0.05, tau3 = 0.5 */
+
+static int
+minimize (gsl_function_fdf * fn, double rho, double sigma,
+ double tau1, double tau2, double tau3,
+ int order, double alpha1, double *alpha_new)
+{
+ double f0, fp0, falpha, falpha_prev, fpalpha, fpalpha_prev, delta,
+ alpha_next;
+ double alpha = alpha1, alpha_prev = 0.0;
+ double a, b, fa, fb, fpa, fpb;
+ const size_t bracket_iters = 100, section_iters = 100;
+ size_t i = 0;
+
+ GSL_FN_FDF_EVAL_F_DF (fn, 0.0, &f0, &fp0);
+ falpha_prev = f0;
+ fpalpha_prev = fp0;
+
+ /* Avoid uninitialized variables morning */
+ a = 0.0; b = alpha;
+ fa = f0; fb = 0.0;
+ fpa = fp0; fpb = 0.0;
+
+ /* Begin bracketing */
+
+ while (i++ < bracket_iters)
+ {
+ falpha = GSL_FN_FDF_EVAL_F (fn, alpha);
+
+ /* Fletcher's rho test */
+
+ if (falpha > f0 + alpha * rho * fp0 || falpha >= falpha_prev)
+ {
+ a = alpha_prev; fa = falpha_prev; fpa = fpalpha_prev;
+ b = alpha; fb = falpha; fpb = GSL_NAN;
+ break; /* goto sectioning */
+ }
+
+ fpalpha = GSL_FN_FDF_EVAL_DF (fn, alpha);
+
+ /* Fletcher's sigma test */
+
+ if (fabs (fpalpha) <= -sigma * fp0)
+ {
+ *alpha_new = alpha;
+ return GSL_SUCCESS;
+ }
+
+ if (fpalpha >= 0)
+ {
+ a = alpha; fa = falpha; fpa = fpalpha;
+ b = alpha_prev; fb = falpha_prev; fpb = fpalpha_prev;
+ break; /* goto sectioning */
+ }
+
+ delta = alpha - alpha_prev;
+
+ {
+ double lower = alpha + delta;
+ double upper = alpha + tau1 * delta;
+
+ alpha_next = interpolate (alpha_prev, falpha_prev, fpalpha_prev,
+ alpha, falpha, fpalpha, lower, upper, order);
+
+ }
+
+ alpha_prev = alpha;
+ falpha_prev = falpha;
+ fpalpha_prev = fpalpha;
+ alpha = alpha_next;
+ }
+
+ /* Sectioning of bracket [a,b] */
+
+ while (i++ < section_iters)
+ {
+ delta = b - a;
+
+ {
+ double lower = a + tau2 * delta;
+ double upper = b - tau3 * delta;
+
+ alpha = interpolate (a, fa, fpa, b, fb, fpb, lower, upper, order);
+ }
+
+ falpha = GSL_FN_FDF_EVAL_F (fn, alpha);
+
+ if ((a-alpha)*fpa <= GSL_DBL_EPSILON) {
+ /* roundoff prevents progress */
+ return GSL_ENOPROG;
+ };
+
+ if (falpha > f0 + rho * alpha * fp0 || falpha >= fa)
+ {
+ /* a_next = a; */
+ b = alpha; fb = falpha; fpb = GSL_NAN;
+ }
+ else
+ {
+ fpalpha = GSL_FN_FDF_EVAL_DF (fn, alpha);
+
+ if (fabs(fpalpha) <= -sigma * fp0)
+ {
+ *alpha_new = alpha;
+ return GSL_SUCCESS; /* terminate */
+ }
+
+ if ( ((b-a) >= 0 && fpalpha >= 0) || ((b-a) <=0 && fpalpha <= 0))
+ {
+ b = a; fb = fa; fpb = fpa;
+ a = alpha; fa = falpha; fpa = fpalpha;
+ }
+ else
+ {
+ a = alpha; fa = falpha; fpa = fpalpha;
+ }
+ }
+ }
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/multimin/linear_wrapper.c b/gsl-1.9/multimin/linear_wrapper.c
new file mode 100644
index 0000000..b284da9
--- /dev/null
+++ b/gsl-1.9/multimin/linear_wrapper.c
@@ -0,0 +1,185 @@
+typedef struct
+{
+ gsl_function_fdf fdf_linear;
+ gsl_multimin_function_fdf *fdf;
+ /* fixed values */
+ const gsl_vector *x;
+ const gsl_vector *g;
+ const gsl_vector *p;
+
+ /* cached values, for x(alpha) = x + alpha * p */
+ double f_alpha;
+ double df_alpha;
+ gsl_vector *x_alpha;
+ gsl_vector *g_alpha;
+
+ /* cache "keys" */
+ double f_cache_key;
+ double df_cache_key;
+ double x_cache_key;
+ double g_cache_key;
+}
+wrapper_t;
+
+static void
+moveto (double alpha, wrapper_t * w)
+{
+ if (alpha == w->x_cache_key) /* using previously cached position */
+ {
+ return;
+ }
+
+ /* set x_alpha = x + alpha * p */
+
+ gsl_vector_memcpy (w->x_alpha, w->x);
+ gsl_blas_daxpy (alpha, w->p, w->x_alpha);
+
+ w->x_cache_key = alpha;
+}
+
+static double
+slope (wrapper_t * w) /* compute gradient . direction */
+{
+ double df;
+ gsl_blas_ddot (w->g_alpha, w->p, &df);
+ return df;
+}
+
+static double
+wrap_f (double alpha, void *params)
+{
+ wrapper_t *w = (wrapper_t *) params;
+ if (alpha == w->f_cache_key) /* using previously cached f(alpha) */
+ {
+ return w->f_alpha;
+ }
+
+ moveto (alpha, w);
+
+ w->f_alpha = GSL_MULTIMIN_FN_EVAL_F (w->fdf, w->x_alpha);
+ w->f_cache_key = alpha;
+
+ return w->f_alpha;
+}
+
+static double
+wrap_df (double alpha, void *params)
+{
+ wrapper_t *w = (wrapper_t *) params;
+ if (alpha == w->df_cache_key) /* using previously cached df(alpha) */
+ {
+ return w->df_alpha;
+ }
+
+ moveto (alpha, w);
+
+ if (alpha != w->g_cache_key)
+ {
+ GSL_MULTIMIN_FN_EVAL_DF (w->fdf, w->x_alpha, w->g_alpha);
+ w->g_cache_key = alpha;
+ }
+
+ w->df_alpha = slope (w);
+ w->df_cache_key = alpha;
+
+ return w->df_alpha;
+}
+
+static void
+wrap_fdf (double alpha, void *params, double *f, double *df)
+{
+ wrapper_t *w = (wrapper_t *) params;
+
+ /* Check for previously cached values */
+
+ if (alpha == w->f_cache_key && alpha == w->df_cache_key)
+ {
+ *f = w->f_alpha;
+ *df = w->df_alpha;
+ return;
+ }
+
+ if (alpha == w->f_cache_key || alpha == w->df_cache_key)
+ {
+ *f = wrap_f (alpha, params);
+ *df = wrap_df (alpha, params);
+ return;
+ }
+
+ moveto (alpha, w);
+ GSL_MULTIMIN_FN_EVAL_F_DF (w->fdf, w->x_alpha, &w->f_alpha, w->g_alpha);
+ w->f_cache_key = alpha;
+ w->g_cache_key = alpha;
+
+ w->df_alpha = slope (w);
+ w->df_cache_key = alpha;
+
+ *f = w->f_alpha;
+ *df = w->df_alpha;
+}
+
+static void
+prepare_wrapper (wrapper_t * w, gsl_multimin_function_fdf * fdf,
+ const gsl_vector * x, double f, const gsl_vector *g,
+ const gsl_vector * p,
+ gsl_vector * x_alpha, gsl_vector *g_alpha)
+{
+ w->fdf_linear.f = &wrap_f;
+ w->fdf_linear.df = &wrap_df;
+ w->fdf_linear.fdf = &wrap_fdf;
+ w->fdf_linear.params = (void *)w; /* pointer to "self" */
+
+ w->fdf = fdf;
+
+ w->x = x;
+ w->g = g;
+ w->p = p;
+
+ w->x_alpha = x_alpha;
+ w->g_alpha = g_alpha;
+
+ gsl_vector_memcpy(w->x_alpha, w->x);
+ w->x_cache_key = 0.0;
+
+ w->f_alpha = f;
+ w->f_cache_key = 0.0;
+
+ gsl_vector_memcpy(w->g_alpha, w->g);
+ w->g_cache_key = 0.0;
+
+ w->df_alpha = slope(w);
+ w->df_cache_key = 0.0;
+}
+
+static void
+update_position (wrapper_t * w, double alpha, gsl_vector *x, double *f, gsl_vector *g)
+{
+ /* ensure that everything is fully cached */
+ { double f_alpha, df_alpha; wrap_fdf (alpha, w, &f_alpha, &df_alpha); } ;
+
+ *f = w->f_alpha;
+ gsl_vector_memcpy(x, w->x_alpha);
+ gsl_vector_memcpy(g, w->g_alpha);
+}
+
+static void
+change_direction (wrapper_t * w)
+{
+ /* Convert the cache values from the end of the current minimisation
+ to those needed for the start of the next minimisation, alpha=0 */
+
+ /* The new x_alpha for alpha=0 is the current position */
+ gsl_vector_memcpy (w->x_alpha, w->x);
+ w->x_cache_key = 0.0;
+
+ /* The function value does not change */
+ w->f_cache_key = 0.0;
+
+ /* The new g_alpha for alpha=0 is the current gradient at the endpoint */
+ gsl_vector_memcpy (w->g_alpha, w->g);
+ w->g_cache_key = 0.0;
+
+ /* Calculate the slope along the new direction vector, p */
+ w->df_alpha = slope (w);
+ w->df_cache_key = 0.0;
+}
diff --git a/gsl-1.9/multimin/simplex.c b/gsl-1.9/multimin/simplex.c
new file mode 100644
index 0000000..ffe55da
--- /dev/null
+++ b/gsl-1.9/multimin/simplex.c
@@ -0,0 +1,415 @@
+/* multimin/simplex.c
+ *
+ * Copyright (C) 2002 Tuomo Keskitalo, Ivo Alxneit
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/*
+ - Originally written by Tuomo Keskitalo <tuomo.keskitalo@iki.fi>
+ - Corrections to nmsimplex_iterate and other functions
+ by Ivo Alxneit <ivo.alxneit@psi.ch>
+ - Additional help by Brian Gough <bjg@network-theory.co.uk>
+*/
+
+/* The Simplex method of Nelder and Mead,
+ also known as the polytope search alogorithm. Ref:
+ Nelder, J.A., Mead, R., Computer Journal 7 (1965) pp. 308-313.
+
+ This implementation uses n+1 corner points in the simplex.
+*/
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_blas.h>
+#include <gsl/gsl_multimin.h>
+
+typedef struct
+{
+ gsl_matrix *x1; /* simplex corner points */
+ gsl_vector *y1; /* function value at corner points */
+ gsl_vector *ws1; /* workspace 1 for algorithm */
+ gsl_vector *ws2; /* workspace 2 for algorithm */
+}
+nmsimplex_state_t;
+
+static double
+nmsimplex_move_corner (const double coeff, const nmsimplex_state_t * state,
+ size_t corner, gsl_vector * xc,
+ const gsl_multimin_function * f)
+{
+ /* moves a simplex corner scaled by coeff (negative value represents
+ mirroring by the middle point of the "other" corner points)
+ and gives new corner in xc and function value at xc as a
+ return value
+ */
+
+ gsl_matrix *x1 = state->x1;
+
+ size_t i, j;
+ double newval, mp;
+
+ if (x1->size1 < 2)
+ {
+ GSL_ERROR ("simplex cannot have less than two corners!", GSL_EFAILED);
+ }
+
+ for (j = 0; j < x1->size2; j++)
+ {
+ mp = 0.0;
+ for (i = 0; i < x1->size1; i++)
+ {
+ if (i != corner)
+ {
+ mp += (gsl_matrix_get (x1, i, j));
+ }
+ }
+ mp /= (double) (x1->size1 - 1);
+ newval = mp - coeff * (mp - gsl_matrix_get (x1, corner, j));
+ gsl_vector_set (xc, j, newval);
+ }
+
+ newval = GSL_MULTIMIN_FN_EVAL (f, xc);
+
+ return newval;
+}
+
+static int
+nmsimplex_contract_by_best (nmsimplex_state_t * state, size_t best,
+ gsl_vector * xc, gsl_multimin_function * f)
+{
+
+ /* Function contracts the simplex in respect to
+ best valued corner. That is, all corners besides the
+ best corner are moved. */
+
+ /* the xc vector is simply work space here */
+
+ gsl_matrix *x1 = state->x1;
+ gsl_vector *y1 = state->y1;
+
+ size_t i, j;
+ double newval;
+
+ for (i = 0; i < x1->size1; i++)
+ {
+ if (i != best)
+ {
+ for (j = 0; j < x1->size2; j++)
+ {
+ newval = 0.5 * (gsl_matrix_get (x1, i, j)
+ + gsl_matrix_get (x1, best, j));
+ gsl_matrix_set (x1, i, j, newval);
+ }
+
+ /* evaluate function in the new point */
+
+ gsl_matrix_get_row (xc, x1, i);
+ newval = GSL_MULTIMIN_FN_EVAL (f, xc);
+ gsl_vector_set (y1, i, newval);
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+static int
+nmsimplex_calc_center (const nmsimplex_state_t * state, gsl_vector * mp)
+{
+ /* calculates the center of the simplex to mp */
+
+ gsl_matrix *x1 = state->x1;
+
+ size_t i, j;
+ double val;
+
+ for (j = 0; j < x1->size2; j++)
+ {
+ val = 0.0;
+ for (i = 0; i < x1->size1; i++)
+ {
+ val += gsl_matrix_get (x1, i, j);
+ }
+ val /= x1->size1;
+ gsl_vector_set (mp, j, val);
+ }
+
+ return GSL_SUCCESS;
+}
+
+static double
+nmsimplex_size (nmsimplex_state_t * state)
+{
+ /* calculates simplex size as average sum of length of vectors
+ from simplex center to corner points:
+
+ ( sum ( || y - y_middlepoint || ) ) / n
+ */
+
+ gsl_vector *s = state->ws1;
+ gsl_vector *mp = state->ws2;
+
+ gsl_matrix *x1 = state->x1;
+ size_t i;
+
+ double ss = 0.0;
+
+ /* Calculate middle point */
+ nmsimplex_calc_center (state, mp);
+
+ for (i = 0; i < x1->size1; i++)
+ {
+ gsl_matrix_get_row (s, x1, i);
+ gsl_blas_daxpy (-1.0, mp, s);
+ ss += gsl_blas_dnrm2 (s);
+ }
+
+ return ss / (double) (x1->size1);
+}
+
+static int
+nmsimplex_alloc (void *vstate, size_t n)
+{
+ nmsimplex_state_t *state = (nmsimplex_state_t *) vstate;
+
+ state->x1 = gsl_matrix_alloc (n + 1, n);
+
+ if (state->x1 == NULL)
+ {
+ GSL_ERROR ("failed to allocate space for x1", GSL_ENOMEM);
+ }
+
+ state->y1 = gsl_vector_alloc (n + 1);
+
+ if (state->y1 == NULL)
+ {
+ GSL_ERROR ("failed to allocate space for y", GSL_ENOMEM);
+ }
+
+ state->ws1 = gsl_vector_alloc (n);
+
+ if (state->ws1 == NULL)
+ {
+ GSL_ERROR ("failed to allocate space for ws1", GSL_ENOMEM);
+ }
+
+ state->ws2 = gsl_vector_alloc (n);
+
+ if (state->ws2 == NULL)
+ {
+ GSL_ERROR ("failed to allocate space for ws2", GSL_ENOMEM);
+ }
+
+ return GSL_SUCCESS;
+}
+
+static int
+nmsimplex_set (void *vstate, gsl_multimin_function * f,
+ const gsl_vector * x,
+ double *size, const gsl_vector * step_size)
+{
+ int status;
+ size_t i;
+ double val;
+
+ nmsimplex_state_t *state = (nmsimplex_state_t *) vstate;
+
+ gsl_vector *xtemp = state->ws1;
+
+ /* first point is the original x0 */
+
+ val = GSL_MULTIMIN_FN_EVAL (f, x);
+ gsl_matrix_set_row (state->x1, 0, x);
+ gsl_vector_set (state->y1, 0, val);
+
+ /* following points are initialized to x0 + step_size */
+
+ for (i = 0; i < x->size; i++)
+ {
+ status = gsl_vector_memcpy (xtemp, x);
+
+ if (status != 0)
+ {
+ GSL_ERROR ("vector memcopy failed", GSL_EFAILED);
+ }
+
+ val = gsl_vector_get (xtemp, i) + gsl_vector_get (step_size, i);
+ gsl_vector_set (xtemp, i, val);
+ val = GSL_MULTIMIN_FN_EVAL (f, xtemp);
+ gsl_matrix_set_row (state->x1, i + 1, xtemp);
+ gsl_vector_set (state->y1, i + 1, val);
+ }
+
+ /* Initialize simplex size */
+
+ *size = nmsimplex_size (state);
+
+ return GSL_SUCCESS;
+}
+
+static void
+nmsimplex_free (void *vstate)
+{
+ nmsimplex_state_t *state = (nmsimplex_state_t *) vstate;
+
+ gsl_matrix_free (state->x1);
+ gsl_vector_free (state->y1);
+ gsl_vector_free (state->ws1);
+ gsl_vector_free (state->ws2);
+}
+
+static int
+nmsimplex_iterate (void *vstate, gsl_multimin_function * f,
+ gsl_vector * x, double *size, double *fval)
+{
+
+ /* Simplex iteration tries to minimize function f value */
+ /* Includes corrections from Ivo Alxneit <ivo.alxneit@psi.ch> */
+
+ nmsimplex_state_t *state = (nmsimplex_state_t *) vstate;
+
+ /* xc and xc2 vectors store tried corner point coordinates */
+
+ gsl_vector *xc = state->ws1;
+ gsl_vector *xc2 = state->ws2;
+ gsl_vector *y1 = state->y1;
+ gsl_matrix *x1 = state->x1;
+
+ size_t n = y1->size;
+ size_t i;
+ size_t hi = 0, s_hi = 0, lo = 0;
+ double dhi, ds_hi, dlo;
+ int status;
+ double val, val2;
+
+ /* get index of highest, second highest and lowest point */
+
+ dhi = ds_hi = dlo = gsl_vector_get (y1, 0);
+
+ for (i = 1; i < n; i++)
+ {
+ val = (gsl_vector_get (y1, i));
+ if (val < dlo)
+ {
+ dlo = val;
+ lo = i;
+ }
+ else if (val > dhi)
+ {
+ ds_hi = dhi;
+ s_hi = hi;
+ dhi = val;
+ hi = i;
+ }
+ else if (val > ds_hi)
+ {
+ ds_hi = val;
+ s_hi = i;
+ }
+ }
+
+ /* reflect the highest value */
+
+ val = nmsimplex_move_corner (-1.0, state, hi, xc, f);
+
+ if (val < gsl_vector_get (y1, lo))
+ {
+
+ /* reflected point becomes lowest point, try expansion */
+
+ val2 = nmsimplex_move_corner (-2.0, state, hi, xc2, f);
+
+ if (val2 < gsl_vector_get (y1, lo))
+ {
+ gsl_matrix_set_row (x1, hi, xc2);
+ gsl_vector_set (y1, hi, val2);
+ }
+ else
+ {
+ gsl_matrix_set_row (x1, hi, xc);
+ gsl_vector_set (y1, hi, val);
+ }
+ }
+
+ /* reflection does not improve things enough */
+
+ else if (val > gsl_vector_get (y1, s_hi))
+ {
+ if (val <= gsl_vector_get (y1, hi))
+ {
+
+ /* if trial point is better than highest point, replace
+ highest point */
+
+ gsl_matrix_set_row (x1, hi, xc);
+ gsl_vector_set (y1, hi, val);
+ }
+
+ /* try one dimensional contraction */
+
+ val2 = nmsimplex_move_corner (0.5, state, hi, xc2, f);
+
+ if (val2 <= gsl_vector_get (y1, hi))
+ {
+ gsl_matrix_set_row (state->x1, hi, xc2);
+ gsl_vector_set (y1, hi, val2);
+ }
+
+ else
+ {
+
+ /* contract the whole simplex in respect to the best point */
+
+ status = nmsimplex_contract_by_best (state, lo, xc, f);
+ if (status != 0)
+ {
+ GSL_ERROR ("nmsimplex_contract_by_best failed", GSL_EFAILED);
+ }
+ }
+ }
+ else
+ {
+
+ /* trial point is better than second highest point.
+ Replace highest point by it */
+
+ gsl_matrix_set_row (x1, hi, xc);
+ gsl_vector_set (y1, hi, val);
+ }
+
+ /* return lowest point of simplex as x */
+
+ lo = gsl_vector_min_index (y1);
+ gsl_matrix_get_row (x, x1, lo);
+ *fval = gsl_vector_get (y1, lo);
+
+ /* Update simplex size */
+
+ *size = nmsimplex_size (state);
+
+ return GSL_SUCCESS;
+}
+
+static const gsl_multimin_fminimizer_type nmsimplex_type =
+{ "nmsimplex", /* name */
+ sizeof (nmsimplex_state_t),
+ &nmsimplex_alloc,
+ &nmsimplex_set,
+ &nmsimplex_iterate,
+ &nmsimplex_free
+};
+
+const gsl_multimin_fminimizer_type
+ * gsl_multimin_fminimizer_nmsimplex = &nmsimplex_type;
diff --git a/gsl-1.9/multimin/steepest_descent.c b/gsl-1.9/multimin/steepest_descent.c
new file mode 100644
index 0000000..ebfd29b
--- /dev/null
+++ b/gsl-1.9/multimin/steepest_descent.c
@@ -0,0 +1,171 @@
+/* multimin/steepest_descent.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Fabrice Rossi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* steepest_descent.c -- the steepest descent algorithm */
+
+/* Modified by Brian Gough to use single iteration structure */
+
+#include <config.h>
+#include <gsl/gsl_multimin.h>
+#include <gsl/gsl_blas_types.h>
+#include <gsl/gsl_blas.h>
+
+typedef struct
+{
+ double step;
+ double max_step;
+ double tol;
+ gsl_vector *x1;
+ gsl_vector *g1;
+}
+steepest_descent_state_t;
+
+static int
+steepest_descent_alloc (void *vstate, size_t n)
+{
+ steepest_descent_state_t *state = (steepest_descent_state_t *) vstate;
+
+ state->x1 = gsl_vector_alloc (n);
+
+ if (state->x1 == NULL)
+ {
+ GSL_ERROR ("failed to allocate space for x1", GSL_ENOMEM);
+ }
+
+ state->g1 = gsl_vector_alloc (n);
+
+ if (state->g1 == NULL)
+ {
+ gsl_vector_free (state->x1);
+ GSL_ERROR ("failed to allocate space for g1", GSL_ENOMEM);
+ }
+
+ return GSL_SUCCESS;
+}
+
+static int
+steepest_descent_set (void *vstate, gsl_multimin_function_fdf * fdf,
+ const gsl_vector * x, double *f,
+ gsl_vector * gradient, double step_size, double tol)
+{
+ steepest_descent_state_t *state = (steepest_descent_state_t *) vstate;
+
+ GSL_MULTIMIN_FN_EVAL_F_DF (fdf, x, f, gradient);
+
+ state->step = step_size;
+ state->max_step = step_size;
+ state->tol = tol;
+
+ return GSL_SUCCESS;
+}
+
+
+static void
+steepest_descent_free (void *vstate)
+{
+ steepest_descent_state_t *state = (steepest_descent_state_t *) vstate;
+
+ gsl_vector_free (state->x1);
+ gsl_vector_free (state->g1);
+}
+
+static int
+steepest_descent_restart (void *vstate)
+{
+ steepest_descent_state_t *state = (steepest_descent_state_t *) vstate;
+
+ state->step = state->max_step;
+
+ return GSL_SUCCESS;
+}
+
+static int
+steepest_descent_iterate (void *vstate, gsl_multimin_function_fdf * fdf,
+ gsl_vector * x, double *f,
+ gsl_vector * gradient, gsl_vector * dx)
+{
+ steepest_descent_state_t *state = (steepest_descent_state_t *) vstate;
+
+ gsl_vector *x1 = state->x1;
+ gsl_vector *g1 = state->g1;
+
+ double f0 = *f;
+ double f1;
+ double step = state->step, tol = state->tol;
+
+ int failed = 0;
+
+ /* compute new trial point at x1= x - step * dir, where dir is the
+ normalized gradient */
+
+ double gnorm = gsl_blas_dnrm2 (gradient);
+
+ if (gnorm == 0.0)
+ {
+ gsl_vector_set_zero (dx);
+ return GSL_ENOPROG;
+ }
+
+trial:
+ gsl_vector_set_zero (dx);
+ gsl_blas_daxpy (-step / gnorm, gradient, dx);
+
+ gsl_vector_memcpy (x1, x);
+ gsl_blas_daxpy (1.0, dx, x1);
+
+ /* evaluate function and gradient at new point x1 */
+
+ GSL_MULTIMIN_FN_EVAL_F_DF (fdf, x1, &f1, g1);
+
+ if (f1 > f0)
+ {
+ /* downhill step failed, reduce step-size and try again */
+
+ failed = 1;
+ step *= tol;
+ goto trial;
+ }
+
+ if (failed)
+ step *= tol;
+ else
+ step *= 2.0;
+
+ state->step = step;
+
+ gsl_vector_memcpy (x, x1);
+ gsl_vector_memcpy (gradient, g1);
+
+ *f = f1;
+
+ return GSL_SUCCESS;
+}
+
+static const gsl_multimin_fdfminimizer_type steepest_descent_type =
+ { "steepest_descent", /* name */
+ sizeof (steepest_descent_state_t),
+ &steepest_descent_alloc,
+ &steepest_descent_set,
+ &steepest_descent_iterate,
+ &steepest_descent_restart,
+ &steepest_descent_free
+};
+
+const gsl_multimin_fdfminimizer_type
+ * gsl_multimin_fdfminimizer_steepest_descent = &steepest_descent_type;
diff --git a/gsl-1.9/multimin/test.c b/gsl-1.9/multimin/test.c
new file mode 100644
index 0000000..0c5e7f7
--- /dev/null
+++ b/gsl-1.9/multimin/test.c
@@ -0,0 +1,196 @@
+/* multimin/test.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Fabrice Rossi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Modified by Tuomo Keskitalo to add Nelder Mead Simplex test suite */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_blas.h>
+#include <gsl/gsl_multimin.h>
+#include <gsl/gsl_ieee_utils.h>
+
+#include "test_funcs.h"
+
+unsigned int fcount, gcount;
+
+int
+test_fdf(const char * desc, gsl_multimin_function_fdf *f,
+ initpt_function initpt, const gsl_multimin_fdfminimizer_type *T);
+
+int
+test_f(const char * desc, gsl_multimin_function *f, initpt_function initpt);
+
+int
+main (void)
+{
+ const gsl_multimin_fdfminimizer_type *fdfminimizers[6];
+ const gsl_multimin_fdfminimizer_type ** T;
+
+ gsl_ieee_env_setup ();
+
+ fdfminimizers[0] = gsl_multimin_fdfminimizer_steepest_descent;
+ fdfminimizers[1] = gsl_multimin_fdfminimizer_conjugate_pr;
+ fdfminimizers[2] = gsl_multimin_fdfminimizer_conjugate_fr;
+ fdfminimizers[3] = gsl_multimin_fdfminimizer_vector_bfgs;
+ fdfminimizers[4] = gsl_multimin_fdfminimizer_vector_bfgs2;
+ fdfminimizers[5] = 0;
+
+ T = fdfminimizers;
+
+ while (*T != 0)
+ {
+ test_fdf("Roth", &roth, roth_initpt,*T);
+ test_fdf("Wood", &wood, wood_initpt,*T);
+ test_fdf("Rosenbrock", &rosenbrock, rosenbrock_initpt,*T);
+ T++;
+ }
+
+ test_f("Roth", &roth_fmin, roth_initpt);
+ test_f("Wood", &wood_fmin, wood_initpt);
+ test_f("Rosenbrock", &rosenbrock_fmin, rosenbrock_initpt);
+
+ T = fdfminimizers;
+
+ while (*T != 0)
+ {
+ test_fdf("NRoth", &Nroth, roth_initpt,*T);
+ test_fdf("NWood", &Nwood, wood_initpt,*T);
+ test_fdf("NRosenbrock", &Nrosenbrock, rosenbrock_initpt,*T);
+ T++;
+ }
+
+ exit (gsl_test_summary());
+}
+
+int
+test_fdf(const char * desc,
+ gsl_multimin_function_fdf *f,
+ initpt_function initpt,
+ const gsl_multimin_fdfminimizer_type *T)
+{
+ int status;
+ size_t iter = 0;
+ double step_size;
+
+ gsl_vector *x = gsl_vector_alloc (f->n);
+
+ gsl_multimin_fdfminimizer *s;
+ fcount = 0; gcount = 0;
+
+ (*initpt) (x);
+
+ step_size = 0.1 * gsl_blas_dnrm2 (x);
+
+ s = gsl_multimin_fdfminimizer_alloc(T, f->n);
+
+ gsl_multimin_fdfminimizer_set (s, f, x, step_size, 0.1);
+
+#ifdef DEBUG
+ printf("x "); gsl_vector_fprintf (stdout, s->x, "%g");
+ printf("g "); gsl_vector_fprintf (stdout, s->gradient, "%g");
+#endif
+
+ do
+ {
+ iter++;
+ status = gsl_multimin_fdfminimizer_iterate(s);
+
+#ifdef DEBUG
+ printf("%i: \n",iter);
+ printf("x "); gsl_vector_fprintf (stdout, s->x, "%g");
+ printf("g "); gsl_vector_fprintf (stdout, s->gradient, "%g");
+ printf("f(x) %g\n",s->f);
+ printf("dx %g\n",gsl_blas_dnrm2(s->dx));
+ printf("\n");
+#endif
+
+ status = gsl_multimin_test_gradient(s->gradient,1e-3);
+ }
+ while (iter < 5000 && status == GSL_CONTINUE);
+
+ status |= (fabs(s->f) > 1e-5);
+
+ gsl_test(status, "%s, on %s: %i iters (fn+g=%d+%d), f(x)=%g",
+ gsl_multimin_fdfminimizer_name(s),desc, iter, fcount, gcount, s->f);
+
+ gsl_multimin_fdfminimizer_free(s);
+ gsl_vector_free(x);
+
+ return status;
+}
+
+int
+test_f(const char * desc, gsl_multimin_function *f, initpt_function initpt)
+{
+ /* currently this function tests only nmsimplex */
+
+ int status;
+ size_t i, iter = 0;
+ const gsl_multimin_fminimizer_type *T = gsl_multimin_fminimizer_nmsimplex;
+
+ gsl_vector *x = gsl_vector_alloc (f->n);
+
+ gsl_vector *step_size = gsl_vector_alloc (f->n);
+
+ gsl_multimin_fminimizer *s;
+
+ fcount = 0; gcount = 0;
+ (*initpt) (x);
+
+ for (i = 0; i < f->n; i++)
+ gsl_vector_set (step_size, i, 1);
+
+ s = gsl_multimin_fminimizer_alloc(T, f->n);
+
+ gsl_multimin_fminimizer_set (s, f, x, step_size);
+
+#ifdef DEBUG
+ printf("x "); gsl_vector_fprintf (stdout, s->x, "%g");
+#endif
+
+ do
+ {
+ iter++;
+ status = gsl_multimin_fminimizer_iterate(s);
+
+#ifdef DEBUG
+ printf("%i: \n",iter);
+ printf("x "); gsl_vector_fprintf (stdout, s->x, "%g");
+ printf("f(x) %g\n", gsl_multimin_fminimizer_minimum (s));
+ printf("size: %g\n", gsl_multimin_fminimizer_size (s));
+ printf("\n");
+#endif
+
+ status = gsl_multimin_test_size (gsl_multimin_fminimizer_size (s),
+ 1e-3);
+ }
+ while (iter < 5000 && status == GSL_CONTINUE);
+
+ status |= (fabs(s->fval) > 1e-5);
+
+ gsl_test(status, "%s, on %s: %d iter (fn=%d), f(x)=%g",
+ gsl_multimin_fminimizer_name(s),desc, iter, fcount, s->fval);
+
+ gsl_multimin_fminimizer_free(s);
+ gsl_vector_free(x);
+ gsl_vector_free(step_size);
+
+ return status;
+}
diff --git a/gsl-1.9/multimin/test_funcs.c b/gsl-1.9/multimin/test_funcs.c
new file mode 100644
index 0000000..34081af
--- /dev/null
+++ b/gsl-1.9/multimin/test_funcs.c
@@ -0,0 +1,244 @@
+/* multimin/test_funcs.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Fabrice Rossi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_multimin.h>
+
+#include "test_funcs.h"
+
+gsl_multimin_function_fdf rosenbrock =
+{&rosenbrock_f,
+ &rosenbrock_df,
+ &rosenbrock_fdf,
+ 2, 0};
+
+gsl_multimin_function rosenbrock_fmin =
+{&rosenbrock_f,
+ 2, 0};
+
+void rosenbrock_initpt (gsl_vector * x)
+{
+ gsl_vector_set (x, 0, -1.2);
+ gsl_vector_set (x, 1, 1.0);
+}
+
+double rosenbrock_f (const gsl_vector * x, void *params)
+{
+ double u = gsl_vector_get(x,0);
+ double v = gsl_vector_get(x,1);
+ double a = u - 1;
+ double b = u * u - v;
+ fcount++;
+ return a * a + 10 * b * b;
+}
+
+void rosenbrock_df (const gsl_vector * x, void *params, gsl_vector * df)
+{
+ double u = gsl_vector_get(x,0);
+ double v = gsl_vector_get(x,1);
+ double b = u * u - v;
+ gcount++;
+ gsl_vector_set(df,0,2 * (u - 1) + 40 * u * b);
+ gsl_vector_set(df,1,-20 * b);
+}
+
+void rosenbrock_fdf (const gsl_vector * x, void *params, double * f,
+ gsl_vector * df)
+{
+ double u = gsl_vector_get(x,0);
+ double v = gsl_vector_get(x,1);
+ double a = u - 1;
+ double b = u * u - v;
+ gcount++;
+ *f = a * a + 10 * b * b;
+ gsl_vector_set(df,0,2 * (u - 1) + 40 * u * b);
+ gsl_vector_set(df,1,-20 * b);
+}
+
+gsl_multimin_function_fdf roth =
+{&roth_f,
+ &roth_df,
+ &roth_fdf,
+ 2, 0};
+
+gsl_multimin_function roth_fmin =
+{&roth_f,
+ 2, 0};
+
+void roth_initpt (gsl_vector * x)
+{
+ gsl_vector_set (x, 0, 4.5);
+ gsl_vector_set (x, 1, 3.5);
+}
+
+double roth_f (const gsl_vector * x, void *params)
+{
+ double u = gsl_vector_get(x,0);
+ double v = gsl_vector_get(x,1);
+ double a = -13.0 + u + ((5.0 - v)*v - 2.0)*v;
+ double b = -29.0 + u + ((v + 1.0)*v - 14.0)*v;
+ fcount++;
+ return a * a + b * b;
+}
+
+void roth_df (const gsl_vector * x, void *params, gsl_vector * df)
+{
+ double u = gsl_vector_get(x,0);
+ double v = gsl_vector_get(x,1);
+ double a = -13.0 + u + ((5.0 - v)*v - 2.0)*v;
+ double b = -29.0 + u + ((v + 1.0)*v - 14.0)*v;
+ double c = -2 + v * (10 - 3 * v);
+ double d = -14 + v * (2 + 3 * v);
+ gcount++;
+ gsl_vector_set(df,0,2 * a + 2 * b);
+ gsl_vector_set(df,1,2 * a * c + 2 * b * d);
+}
+
+void roth_fdf (const gsl_vector * x, void *params, double * f,
+ gsl_vector * df)
+{
+ *f = roth_f (x,params);
+ roth_df(x,params,df);
+}
+
+gsl_multimin_function_fdf wood =
+{&wood_f,
+ &wood_df,
+ &wood_fdf,
+ 4, 0};
+
+gsl_multimin_function wood_fmin =
+{&wood_f,
+ 4, 0};
+
+void
+wood_initpt (gsl_vector * x)
+{
+ gsl_vector_set (x, 0, -3.0);
+ gsl_vector_set (x, 1, -1.0);
+ gsl_vector_set (x, 2, -3.0);
+ gsl_vector_set (x, 3, -1.0);
+}
+
+double wood_f (const gsl_vector * x, void *params)
+{
+ double u1 = gsl_vector_get(x,0);
+ double u2 = gsl_vector_get(x,1);
+ double u3 = gsl_vector_get(x,2);
+ double u4 = gsl_vector_get(x,3);
+
+ double t1 = u1 * u1 - u2;
+ double t2 = u3 * u3 - u4;
+ fcount++;
+ return 100 * t1 * t1 + (1 - u1) * (1 - u1)
+ + 90 * t2 * t2 + (1 - u3) * (1 - u3)
+ + 10.1 * ( (1 - u2) * (1 - u2) + (1 - u4) * (1 - u4) )
+ + 19.8 * (1 - u2) * (1 - u4);
+}
+
+void wood_df (const gsl_vector * x, void *params, gsl_vector * df)
+{
+ double u1 = gsl_vector_get(x,0);
+ double u2 = gsl_vector_get(x,1);
+ double u3 = gsl_vector_get(x,2);
+ double u4 = gsl_vector_get(x,3);
+
+ double t1 = u1 * u1 - u2;
+ double t2 = u3 * u3 - u4;
+ gcount++;
+ gsl_vector_set(df,0, 400 * u1 * t1 - 2 * (1 - u1) );
+ gsl_vector_set(df,1, -200 * t1 - 20.2 * (1 - u2) - 19.8 * (1 - u4) );
+ gsl_vector_set(df,2, 360 * u3 * t2 - 2 * (1 - u3) );
+ gsl_vector_set(df,3, -180 * t2 - 20.2 * (1 - u4) - 19.8 * (1 - u2) );
+
+}
+
+void wood_fdf (const gsl_vector * x, void *params, double * f, gsl_vector * df)
+{
+ wood_df(x,params,df);
+ *f=wood_f(x,params);
+}
+
+
+gsl_multimin_function_fdf Nrosenbrock =
+{&rosenbrock_f,
+ &Nrosenbrock_df,
+ &Nrosenbrock_fdf,
+ 2, 0};
+
+void Nrosenbrock_df (const gsl_vector * x, void *params, gsl_vector * df)
+{
+ gsl_multimin_function F ;
+ F.f = rosenbrock_f;
+ F.params = params;
+ F.n = x->size;
+ gsl_multimin_diff (&F, x, df);
+}
+
+void Nrosenbrock_fdf (const gsl_vector * x, void *params, double * f,
+ gsl_vector * df)
+{
+ *f = rosenbrock_f (x, params);
+ Nrosenbrock_df (x, params, df);
+}
+
+gsl_multimin_function_fdf Nroth =
+{&roth_f,
+ &Nroth_df,
+ &Nroth_fdf,
+ 2, 0};
+
+void Nroth_df (const gsl_vector * x, void *params, gsl_vector * df)
+{
+ gsl_multimin_function F ;
+ F.f = roth_f;
+ F.params = params;
+ F.n = x->size;
+ gsl_multimin_diff (&F, x, df);
+}
+
+void Nroth_fdf (const gsl_vector * x, void *params, double * f,
+ gsl_vector * df)
+{
+ *f = roth_f (x, params);
+ Nroth_df (x, params, df);
+}
+
+
+gsl_multimin_function_fdf Nwood =
+{&wood_f,
+ &Nwood_df,
+ &Nwood_fdf,
+ 4, 0};
+
+void Nwood_df (const gsl_vector * x, void *params, gsl_vector * df)
+{
+ gsl_multimin_function F ;
+ F.f = wood_f;
+ F.params = params;
+ F.n = x->size;
+ gsl_multimin_diff (&F, x, df);
+}
+
+void Nwood_fdf (const gsl_vector * x, void *params, double * f,
+ gsl_vector * df)
+{
+ *f = wood_f (x, params);
+ Nwood_df (x, params, df);
+}
diff --git a/gsl-1.9/multimin/test_funcs.h b/gsl-1.9/multimin/test_funcs.h
new file mode 100644
index 0000000..b12a065
--- /dev/null
+++ b/gsl-1.9/multimin/test_funcs.h
@@ -0,0 +1,56 @@
+/* multimin/test_funcs.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Fabrice Rossi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+extern unsigned int fcount, gcount;
+
+typedef void (*initpt_function) (gsl_vector * x);
+
+extern gsl_multimin_function_fdf rosenbrock;
+extern gsl_multimin_function rosenbrock_fmin;
+void rosenbrock_initpt (gsl_vector * x);
+double rosenbrock_f (const gsl_vector * x, void *params);
+void rosenbrock_df (const gsl_vector * x, void *params, gsl_vector * df);
+void rosenbrock_fdf (const gsl_vector * x, void *params, double * f, gsl_vector * df);
+
+extern gsl_multimin_function_fdf wood;
+extern gsl_multimin_function wood_fmin;
+void wood_initpt (gsl_vector * x);
+double wood_f (const gsl_vector * x, void *params);
+void wood_df (const gsl_vector * x, void *params, gsl_vector * df);
+void wood_fdf (const gsl_vector * x, void *params, double * f, gsl_vector * df);
+
+extern gsl_multimin_function_fdf roth;
+extern gsl_multimin_function roth_fmin;
+void roth_initpt (gsl_vector * x);
+double roth_f (const gsl_vector * x, void *params);
+void roth_df (const gsl_vector * x, void *params, gsl_vector * df);
+void roth_fdf (const gsl_vector * x, void *params, double * f, gsl_vector * df);
+
+extern gsl_multimin_function_fdf Nrosenbrock;
+void Nrosenbrock_df (const gsl_vector * x, void *params, gsl_vector * df);
+void Nrosenbrock_fdf (const gsl_vector * x, void *params, double * f, gsl_vector * df);
+
+extern gsl_multimin_function_fdf Nroth;
+void Nroth_df (const gsl_vector * x, void *params, gsl_vector * df);
+void Nroth_fdf (const gsl_vector * x, void *params, double * f, gsl_vector * df);
+
+extern gsl_multimin_function_fdf Nwood;
+void Nwood_df (const gsl_vector * x, void *params, gsl_vector * df);
+void Nwood_fdf (const gsl_vector * x, void *params, double * f, gsl_vector * df);
+
diff --git a/gsl-1.9/multimin/vector_bfgs.c b/gsl-1.9/multimin/vector_bfgs.c
new file mode 100644
index 0000000..6d39f29
--- /dev/null
+++ b/gsl-1.9/multimin/vector_bfgs.c
@@ -0,0 +1,350 @@
+/* multimin/vector_bfgs.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Fabrice Rossi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* vector_bfgs.c -- Limited memory Broyden-Fletcher-Goldfarb-Shanno method */
+
+/* Modified by Brian Gough to use single iteration structure */
+
+#include <config.h>
+#include <gsl/gsl_multimin.h>
+#include <gsl/gsl_blas.h>
+
+#include "directional_minimize.c"
+
+typedef struct
+{
+ int iter;
+ double step;
+ double max_step;
+ double tol;
+ gsl_vector *x1;
+ gsl_vector *dx1;
+ gsl_vector *x2;
+ double g0norm;
+ double pnorm;
+ gsl_vector *p;
+ gsl_vector *x0;
+ gsl_vector *g0;
+ gsl_vector *dx0;
+ gsl_vector *dg0;
+}
+vector_bfgs_state_t;
+
+static int
+vector_bfgs_alloc (void *vstate, size_t n)
+{
+ vector_bfgs_state_t *state = (vector_bfgs_state_t *) vstate;
+
+ state->x1 = gsl_vector_calloc (n);
+
+ if (state->x1 == 0)
+ {
+ GSL_ERROR ("failed to allocate space for x1", GSL_ENOMEM);
+ }
+
+ state->dx1 = gsl_vector_calloc (n);
+
+ if (state->dx1 == 0)
+ {
+ gsl_vector_free (state->x1);
+ GSL_ERROR ("failed to allocate space for dx1", GSL_ENOMEM);
+ }
+
+ state->x2 = gsl_vector_calloc (n);
+
+ if (state->x2 == 0)
+ {
+ gsl_vector_free (state->dx1);
+ gsl_vector_free (state->x1);
+ GSL_ERROR ("failed to allocate space for x2", GSL_ENOMEM);
+ }
+
+ state->p = gsl_vector_calloc (n);
+
+ if (state->p == 0)
+ {
+ gsl_vector_free (state->x2);
+ gsl_vector_free (state->dx1);
+ gsl_vector_free (state->x1);
+ GSL_ERROR ("failed to allocate space for p", GSL_ENOMEM);
+ }
+
+ state->x0 = gsl_vector_calloc (n);
+
+ if (state->x0 == 0)
+ {
+ gsl_vector_free (state->p);
+ gsl_vector_free (state->x2);
+ gsl_vector_free (state->dx1);
+ gsl_vector_free (state->x1);
+ GSL_ERROR ("failed to allocate space for g0", GSL_ENOMEM);
+ }
+
+ state->g0 = gsl_vector_calloc (n);
+
+ if (state->g0 == 0)
+ {
+ gsl_vector_free (state->x0);
+ gsl_vector_free (state->p);
+ gsl_vector_free (state->x2);
+ gsl_vector_free (state->dx1);
+ gsl_vector_free (state->x1);
+ GSL_ERROR ("failed to allocate space for g0", GSL_ENOMEM);
+ }
+
+ state->dx0 = gsl_vector_calloc (n);
+
+ if (state->dx0 == 0)
+ {
+ gsl_vector_free (state->g0);
+ gsl_vector_free (state->x0);
+ gsl_vector_free (state->p);
+ gsl_vector_free (state->x2);
+ gsl_vector_free (state->dx1);
+ gsl_vector_free (state->x1);
+ GSL_ERROR ("failed to allocate space for g0", GSL_ENOMEM);
+ }
+
+ state->dg0 = gsl_vector_calloc (n);
+
+ if (state->dg0 == 0)
+ {
+ gsl_vector_free (state->dx0);
+ gsl_vector_free (state->g0);
+ gsl_vector_free (state->x0);
+ gsl_vector_free (state->p);
+ gsl_vector_free (state->x2);
+ gsl_vector_free (state->dx1);
+ gsl_vector_free (state->x1);
+ GSL_ERROR ("failed to allocate space for g0", GSL_ENOMEM);
+ }
+
+ return GSL_SUCCESS;
+}
+
+static int
+vector_bfgs_set (void *vstate, gsl_multimin_function_fdf * fdf,
+ const gsl_vector * x, double *f, gsl_vector * gradient,
+ double step_size, double tol)
+{
+ vector_bfgs_state_t *state = (vector_bfgs_state_t *) vstate;
+
+ state->iter = 0;
+ state->step = step_size;
+ state->max_step = step_size;
+ state->tol = tol;
+
+ GSL_MULTIMIN_FN_EVAL_F_DF (fdf, x, f, gradient);
+
+ /* Use the gradient as the initial direction */
+
+ gsl_vector_memcpy (state->x0, x);
+ gsl_vector_memcpy (state->p, gradient);
+ gsl_vector_memcpy (state->g0, gradient);
+
+ {
+ double gnorm = gsl_blas_dnrm2 (gradient);
+ state->pnorm = gnorm;
+ state->g0norm = gnorm;
+ }
+
+ return GSL_SUCCESS;
+}
+
+static void
+vector_bfgs_free (void *vstate)
+{
+ vector_bfgs_state_t *state = (vector_bfgs_state_t *) vstate;
+
+ gsl_vector_free (state->dg0);
+ gsl_vector_free (state->dx0);
+ gsl_vector_free (state->g0);
+ gsl_vector_free (state->x0);
+ gsl_vector_free (state->p);
+ gsl_vector_free (state->x2);
+ gsl_vector_free (state->dx1);
+ gsl_vector_free (state->x1);
+}
+
+static int
+vector_bfgs_restart (void *vstate)
+{
+ vector_bfgs_state_t *state = (vector_bfgs_state_t *) vstate;
+
+ state->iter = 0;
+ return GSL_SUCCESS;
+}
+
+static int
+vector_bfgs_iterate (void *vstate, gsl_multimin_function_fdf * fdf,
+ gsl_vector * x, double *f,
+ gsl_vector * gradient, gsl_vector * dx)
+{
+ vector_bfgs_state_t *state = (vector_bfgs_state_t *) vstate;
+
+ gsl_vector *x1 = state->x1;
+ gsl_vector *dx1 = state->dx1;
+ gsl_vector *x2 = state->x2;
+ gsl_vector *p = state->p;
+ gsl_vector *g0 = state->g0;
+ gsl_vector *x0 = state->x0;
+
+ double pnorm = state->pnorm;
+ double g0norm = state->g0norm;
+
+ double fa = *f, fb, fc;
+ double dir;
+ double stepa = 0.0, stepb, stepc = state->step, tol = state->tol;
+
+ double g1norm;
+ double pg;
+
+ if (pnorm == 0.0 || g0norm == 0.0)
+ {
+ gsl_vector_set_zero (dx);
+ return GSL_ENOPROG;
+ }
+
+ /* Determine which direction is downhill, +p or -p */
+
+ gsl_blas_ddot (p, gradient, &pg);
+
+ dir = (pg >= 0.0) ? +1.0 : -1.0;
+
+ /* Compute new trial point at x_c= x - step * p, where p is the
+ current direction */
+
+ take_step (x, p, stepc, dir / pnorm, x1, dx);
+
+ /* Evaluate function and gradient at new point xc */
+
+ fc = GSL_MULTIMIN_FN_EVAL_F (fdf, x1);
+
+ if (fc < fa)
+ {
+ /* Success, reduced the function value */
+ state->step = stepc * 2.0;
+ *f = fc;
+ gsl_vector_memcpy (x, x1);
+ GSL_MULTIMIN_FN_EVAL_DF (fdf, x1, gradient);
+ return GSL_SUCCESS;
+ }
+
+#ifdef DEBUG
+ printf ("got stepc = %g fc = %g\n", stepc, fc);
+#endif
+
+ /* Do a line minimisation in the region (xa,fa) (xc,fc) to find an
+ intermediate (xb,fb) satisifying fa > fb < fc. Choose an initial
+ xb based on parabolic interpolation */
+
+ intermediate_point (fdf, x, p, dir / pnorm, pg,
+ stepa, stepc, fa, fc, x1, dx1, gradient, &stepb, &fb);
+
+ if (stepb == 0.0)
+ {
+ return GSL_ENOPROG;
+ }
+
+ minimize (fdf, x, p, dir / pnorm,
+ stepa, stepb, stepc, fa, fb, fc, tol,
+ x1, dx1, x2, dx, gradient, &(state->step), f, &g1norm);
+
+ gsl_vector_memcpy (x, x2);
+
+ /* Choose a new direction for the next step */
+
+ state->iter = (state->iter + 1) % x->size;
+
+ if (state->iter == 0)
+ {
+ gsl_vector_memcpy (p, gradient);
+ state->pnorm = g1norm;
+ }
+ else
+ {
+ /* This is the BFGS update: */
+ /* p' = g1 - A dx - B dg */
+ /* A = - (1+ dg.dg/dx.dg) B + dg.g/dx.dg */
+ /* B = dx.g/dx.dg */
+
+ gsl_vector *dx0 = state->dx0;
+ gsl_vector *dg0 = state->dg0;
+
+ double dxg, dgg, dxdg, dgnorm, A, B;
+
+ /* dx0 = x - x0 */
+ gsl_vector_memcpy (dx0, x);
+ gsl_blas_daxpy (-1.0, x0, dx0);
+
+ /* dg0 = g - g0 */
+ gsl_vector_memcpy (dg0, gradient);
+ gsl_blas_daxpy (-1.0, g0, dg0);
+
+ gsl_blas_ddot (dx0, gradient, &dxg);
+ gsl_blas_ddot (dg0, gradient, &dgg);
+ gsl_blas_ddot (dx0, dg0, &dxdg);
+
+ dgnorm = gsl_blas_dnrm2 (dg0);
+
+ if (dxdg != 0)
+ {
+ B = dxg / dxdg;
+ A = -(1.0 + dgnorm * dgnorm / dxdg) * B + dgg / dxdg;
+ }
+ else
+ {
+ B = 0;
+ A = 0;
+ }
+
+ gsl_vector_memcpy (p, gradient);
+ gsl_blas_daxpy (-A, dx0, p);
+ gsl_blas_daxpy (-B, dg0, p);
+
+ state->pnorm = gsl_blas_dnrm2 (p);
+ }
+
+ gsl_vector_memcpy (g0, gradient);
+ gsl_vector_memcpy (x0, x);
+ state->g0norm = gsl_blas_dnrm2 (g0);
+
+#ifdef DEBUG
+ printf ("updated directions\n");
+ printf ("p: ");
+ gsl_vector_fprintf (stdout, p, "%g");
+ printf ("g: ");
+ gsl_vector_fprintf (stdout, gradient, "%g");
+#endif
+
+ return GSL_SUCCESS;
+}
+
+static const gsl_multimin_fdfminimizer_type vector_bfgs_type = {
+ "vector_bfgs", /* name */
+ sizeof (vector_bfgs_state_t),
+ &vector_bfgs_alloc,
+ &vector_bfgs_set,
+ &vector_bfgs_iterate,
+ &vector_bfgs_restart,
+ &vector_bfgs_free
+};
+
+const gsl_multimin_fdfminimizer_type
+ * gsl_multimin_fdfminimizer_vector_bfgs = &vector_bfgs_type;
diff --git a/gsl-1.9/multimin/vector_bfgs2.c b/gsl-1.9/multimin/vector_bfgs2.c
new file mode 100644
index 0000000..d4f5cb3
--- /dev/null
+++ b/gsl-1.9/multimin/vector_bfgs2.c
@@ -0,0 +1,330 @@
+/* multimin/vector_bfgs2.c
+ *
+ * Copyright (C) 2007 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+/* vector_bfgs2.c -- Fletcher's implementation of the BFGS method,
+ from R.Fletcher, "Practical Method's of Optimization", Second
+ Edition, ISBN 0471915475. Algorithms 2.6.2 and 2.6.4. */
+
+/* Thanks to Alan Irwin irwin@beluga.phys.uvic.ca. for suggesting this
+ algorithm and providing sample fortran benchmarks */
+
+#include <config.h>
+#include <gsl/gsl_multimin.h>
+#include <gsl/gsl_blas.h>
+
+#include "linear_minimize.c"
+#include "linear_wrapper.c"
+
+typedef struct
+{
+ int iter;
+ double step;
+ double g0norm;
+ double pnorm;
+ double delta_f;
+ double fp0; /* f'(0) for f(x-alpha*p) */
+ gsl_vector *x0;
+ gsl_vector *g0;
+ gsl_vector *p;
+ /* work space */
+ gsl_vector *dx0;
+ gsl_vector *dg0;
+ gsl_vector *x_alpha;
+ gsl_vector *g_alpha;
+ /* wrapper function */
+ wrapper_t wrap;
+ /* minimization parameters */
+ double rho;
+ double sigma;
+ double tau1;
+ double tau2;
+ double tau3;
+ int order;
+}
+vector_bfgs2_state_t;
+
+static int
+vector_bfgs2_alloc (void *vstate, size_t n)
+{
+ vector_bfgs2_state_t *state = (vector_bfgs2_state_t *) vstate;
+
+ state->p = gsl_vector_calloc (n);
+
+ if (state->p == 0)
+ {
+ GSL_ERROR ("failed to allocate space for p", GSL_ENOMEM);
+ }
+
+ state->x0 = gsl_vector_calloc (n);
+
+ if (state->x0 == 0)
+ {
+ gsl_vector_free (state->p);
+ GSL_ERROR ("failed to allocate space for g0", GSL_ENOMEM);
+ }
+
+ state->g0 = gsl_vector_calloc (n);
+
+ if (state->g0 == 0)
+ {
+ gsl_vector_free (state->x0);
+ gsl_vector_free (state->p);
+ GSL_ERROR ("failed to allocate space for g0", GSL_ENOMEM);
+ }
+
+ state->dx0 = gsl_vector_calloc (n);
+
+ if (state->dx0 == 0)
+ {
+ gsl_vector_free (state->g0);
+ gsl_vector_free (state->x0);
+ gsl_vector_free (state->p);
+ GSL_ERROR ("failed to allocate space for g0", GSL_ENOMEM);
+ }
+
+ state->dg0 = gsl_vector_calloc (n);
+
+ if (state->dg0 == 0)
+ {
+ gsl_vector_free (state->dx0);
+ gsl_vector_free (state->g0);
+ gsl_vector_free (state->x0);
+ gsl_vector_free (state->p);
+ GSL_ERROR ("failed to allocate space for g0", GSL_ENOMEM);
+ }
+
+ state->x_alpha = gsl_vector_calloc (n);
+
+ if (state->x_alpha == 0)
+ {
+ gsl_vector_free (state->dg0);
+ gsl_vector_free (state->dx0);
+ gsl_vector_free (state->g0);
+ gsl_vector_free (state->x0);
+ gsl_vector_free (state->p);
+ GSL_ERROR ("failed to allocate space for g0", GSL_ENOMEM);
+ }
+
+ state->g_alpha = gsl_vector_calloc (n);
+
+ if (state->g_alpha == 0)
+ {
+ gsl_vector_free (state->x_alpha);
+ gsl_vector_free (state->dg0);
+ gsl_vector_free (state->dx0);
+ gsl_vector_free (state->g0);
+ gsl_vector_free (state->x0);
+ gsl_vector_free (state->p);
+ GSL_ERROR ("failed to allocate space for g0", GSL_ENOMEM);
+ }
+
+ return GSL_SUCCESS;
+}
+
+static int
+vector_bfgs2_set (void *vstate, gsl_multimin_function_fdf * fdf,
+ const gsl_vector * x, double *f, gsl_vector * gradient,
+ double step_size, double tol)
+{
+ vector_bfgs2_state_t *state = (vector_bfgs2_state_t *) vstate;
+
+ state->iter = 0;
+ state->step = step_size;
+ state->delta_f = 0;
+
+ GSL_MULTIMIN_FN_EVAL_F_DF (fdf, x, f, gradient);
+
+ /* Use the gradient as the initial direction */
+
+ gsl_vector_memcpy (state->x0, x);
+ gsl_vector_memcpy (state->g0, gradient);
+ state->g0norm = gsl_blas_dnrm2 (state->g0);
+
+ gsl_vector_memcpy (state->p, gradient);
+ gsl_blas_dscal (-1 / state->g0norm, state->p);
+ state->pnorm = gsl_blas_dnrm2 (state->p); /* should be 1 */
+ state->fp0 = -state->g0norm;
+
+ /* Prepare the wrapper */
+
+ prepare_wrapper (&state->wrap, fdf,
+ state->x0, *f, state->g0,
+ state->p, state->x_alpha, state->g_alpha);
+
+ /* Prepare 1d minimisation parameters */
+
+ state->rho = 0.01;
+ state->sigma = tol;
+ state->tau1 = 9;
+ state->tau2 = 0.05;
+ state->tau3 = 0.5;
+ state->order = 3; /* use cubic interpolation where possible */
+
+ return GSL_SUCCESS;
+}
+
+static void
+vector_bfgs2_free (void *vstate)
+{
+ vector_bfgs2_state_t *state = (vector_bfgs2_state_t *) vstate;
+
+ gsl_vector_free (state->x_alpha);
+ gsl_vector_free (state->g_alpha);
+ gsl_vector_free (state->dg0);
+ gsl_vector_free (state->dx0);
+ gsl_vector_free (state->g0);
+ gsl_vector_free (state->x0);
+ gsl_vector_free (state->p);
+}
+
+static int
+vector_bfgs2_restart (void *vstate)
+{
+ vector_bfgs2_state_t *state = (vector_bfgs2_state_t *) vstate;
+
+ state->iter = 0;
+ return GSL_SUCCESS;
+}
+
+static int
+vector_bfgs2_iterate (void *vstate, gsl_multimin_function_fdf * fdf,
+ gsl_vector * x, double *f,
+ gsl_vector * gradient, gsl_vector * dx)
+{
+ vector_bfgs2_state_t *state = (vector_bfgs2_state_t *) vstate;
+ double alpha = 0.0, alpha1;
+ gsl_vector *x0 = state->x0;
+ gsl_vector *g0 = state->g0;
+ gsl_vector *p = state->p;
+
+ double g0norm = state->g0norm;
+ double pnorm = state->pnorm;
+ double delta_f = state->delta_f;
+ double pg, dir;
+ int status;
+
+ double f0 = *f;
+
+ if (pnorm == 0.0 || g0norm == 0.0 || state->fp0 == 0)
+ {
+ gsl_vector_set_zero (dx);
+ return GSL_ENOPROG;
+ }
+
+ if (delta_f < 0)
+ {
+ double del = GSL_MAX_DBL (-delta_f, 10 * GSL_DBL_EPSILON * fabs(f0));
+ alpha1 = GSL_MIN_DBL (1.0, 2.0 * del / (-state->fp0));
+ }
+ else
+ {
+ alpha1 = fabs(state->step);
+ }
+
+ /* line minimisation, with cubic interpolation (order = 3) */
+
+ status = minimize (&state->wrap.fdf_linear, state->rho, state->sigma,
+ state->tau1, state->tau2, state->tau3, state->order,
+ alpha1, &alpha);
+
+ if (status != GSL_SUCCESS)
+ {
+ return status;
+ }
+
+ update_position (&(state->wrap), alpha, x, f, gradient);
+
+ state->delta_f = *f - f0;
+
+ /* Choose a new direction for the next step */
+
+ {
+ /* This is the BFGS update: */
+ /* p' = g1 - A dx - B dg */
+ /* A = - (1+ dg.dg/dx.dg) B + dg.g/dx.dg */
+ /* B = dx.g/dx.dg */
+
+ gsl_vector *dx0 = state->dx0;
+ gsl_vector *dg0 = state->dg0;
+
+ double dxg, dgg, dxdg, dgnorm, A, B;
+
+ /* dx0 = x - x0 */
+ gsl_vector_memcpy (dx0, x);
+ gsl_blas_daxpy (-1.0, x0, dx0);
+
+ gsl_vector_memcpy (dx, dx0); /* keep a copy */
+
+ /* dg0 = g - g0 */
+ gsl_vector_memcpy (dg0, gradient);
+ gsl_blas_daxpy (-1.0, g0, dg0);
+
+ gsl_blas_ddot (dx0, gradient, &dxg);
+ gsl_blas_ddot (dg0, gradient, &dgg);
+ gsl_blas_ddot (dx0, dg0, &dxdg);
+
+ dgnorm = gsl_blas_dnrm2 (dg0);
+
+ if (dxdg != 0)
+ {
+ B = dxg / dxdg;
+ A = -(1.0 + dgnorm * dgnorm / dxdg) * B + dgg / dxdg;
+ }
+ else
+ {
+ B = 0;
+ A = 0;
+ }
+
+ gsl_vector_memcpy (p, gradient);
+ gsl_blas_daxpy (-A, dx0, p);
+ gsl_blas_daxpy (-B, dg0, p);
+ }
+
+ gsl_vector_memcpy (g0, gradient);
+ gsl_vector_memcpy (x0, x);
+ state->g0norm = gsl_blas_dnrm2 (g0);
+ state->pnorm = gsl_blas_dnrm2 (p);
+
+ /* update direction and fp0 */
+
+ gsl_blas_ddot (p, gradient, &pg);
+ dir = (pg >= 0.0) ? -1.0 : +1.0;
+ gsl_blas_dscal (dir / state->pnorm, p);
+ state->pnorm = gsl_blas_dnrm2 (p);
+ gsl_blas_ddot (p, g0, &state->fp0);
+
+ change_direction (&state->wrap);
+
+ return GSL_SUCCESS;
+}
+
+static const gsl_multimin_fdfminimizer_type vector_bfgs2_type = {
+ "vector_bfgs2", /* name */
+ sizeof (vector_bfgs2_state_t),
+ &vector_bfgs2_alloc,
+ &vector_bfgs2_set,
+ &vector_bfgs2_iterate,
+ &vector_bfgs2_restart,
+ &vector_bfgs2_free
+};
+
+const gsl_multimin_fdfminimizer_type
+ * gsl_multimin_fdfminimizer_vector_bfgs2 = &vector_bfgs2_type;
diff --git a/gsl-1.9/multiroots/ChangeLog b/gsl-1.9/multiroots/ChangeLog
new file mode 100644
index 0000000..c84ad1a
--- /dev/null
+++ b/gsl-1.9/multiroots/ChangeLog
@@ -0,0 +1,114 @@
+2007-01-26 Brian Gough <bjg@network-theory.co.uk>
+
+ * fsolver.c (gsl_multiroot_fsolver_set): made vector argument x
+ const
+
+ * fdfsolver.c (gsl_multiroot_fdfsolver_set): made vector argument
+ x const
+
+Tue Nov 12 22:26:40 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * newton.c (newton_alloc): return error code, not null
+
+ * hybridj.c (hybridj_alloc): return error code, not null
+
+ * hybrid.c (hybrid_alloc): return error code, not null
+
+ * gnewton.c (gnewton_alloc): return error code, not null
+
+ * dnewton.c (dnewton_alloc): return error code, not null
+
+ * broyden.c (broyden_alloc): return error code, not null
+
+Wed May 1 21:40:55 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * fdfsolver.c (gsl_multiroot_fdfsolver_dx): new function to return
+ dx
+ (gsl_multiroot_fdfsolver_f): new function to return f
+
+ * fsolver.c (gsl_multiroot_fsolver_dx): new function to return dx
+ (gsl_multiroot_fsolver_f): new function to return f
+
+Sat Jan 26 17:11:34 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * hybrid.c (set): fix broken 'if' statement
+
+Thu Jan 10 19:26:55 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * hybrid.c dnewton.c: return status values for user-function
+ (Theis Peter Hansen)
+
+Tue Jun 19 23:40:18 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * hybrid.c: removed workspace for linalg calls, no longer needed
+
+ * hybridj.c: removed workspace for linalg calls, no longer needed
+
+Wed Jun 6 13:31:18 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * hybridj.c: updated to use new QR calling convention (now passes
+ workspace)
+
+ * hybrid.c: updated to use new QR calling convention (now passes
+ workspace)
+
+Mon Apr 23 12:55:39 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * Makefile.am (test_LDADD): added cblas lib
+
+Mon Apr 16 20:18:08 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * dnewton.c (dnewton_iterate): removed unnecessary status variable
+
+Sun Feb 18 11:26:45 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * fdfsolver.c fsolver.c: changed so that the solver _alloc
+ function no longer calls _set, the user must do that separately.
+
+Thu Nov 30 21:48:39 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * newton.c (newton_iterate): return GSL_EBADFUNC if error in
+ function evaluation
+
+ * hybridj.c (iterate): return GSL_EBADFUNC if error in
+ function evaluation
+
+ * hybrid.c (iterate): return GSL_EBADFUNC if error in function
+ evaluation
+
+ * gnewton.c (gnewton_iterate): return GSL_EBADFUNC if error in
+ function evaluation
+
+ * fdjac.c (gsl_multiroot_fdjacobian): return GSL_EBADFUNC if error
+ in function evaluation
+
+ * dnewton.c (dnewton_iterate): return GSL_EBADFUNC if error in
+ function evaluation
+
+ * broyden.c (broyden_iterate): return GSL_EBADFUNC if error in
+ function evaluation
+
+Sun Aug 27 13:43:13 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * hybridj.c hybrid.c dogleg.c: begin comments with a capital
+ letter to improve readability
+
+Sat Aug 26 16:12:19 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * hybridj.c hybrid.c: renamed rdiag to tau, since it plays that
+ role here and is not the diagonal of R (see qr.c documentation for
+ more details)
+
+Wed Feb 23 15:36:39 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * changed gsl_vector_copy to gsl_vector_cpy
+
+Fri Feb 18 18:45:02 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * fixed various .c files to use permutation
+
+Wed Feb 16 21:13:24 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * fixed Makefiles that include gsl_linalg.h to add
+ -I$(srcdir)/../permutation to their include path
+
diff --git a/gsl-1.9/multiroots/Makefile.am b/gsl-1.9/multiroots/Makefile.am
new file mode 100644
index 0000000..fbc772d
--- /dev/null
+++ b/gsl-1.9/multiroots/Makefile.am
@@ -0,0 +1,19 @@
+# -*-makefile-*-
+
+noinst_LTLIBRARIES = libgslmultiroots.la
+
+pkginclude_HEADERS = gsl_multiroots.h
+
+noinst_HEADERS = enorm.c dogleg.c
+
+INCLUDES= -I$(top_builddir)
+
+libgslmultiroots_la_SOURCES = fdjac.c fsolver.c fdfsolver.c convergence.c newton.c gnewton.c dnewton.c broyden.c hybrid.c hybridj.c
+
+check_PROGRAMS = test
+
+TESTS = $(check_PROGRAMS)
+
+test_SOURCES = test.c test_funcs.c test_funcs.h
+test_LDADD = libgslmultiroots.la ../linalg/libgsllinalg.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../permutation/libgslpermutation.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+
diff --git a/gsl-1.9/multiroots/Makefile.in b/gsl-1.9/multiroots/Makefile.in
new file mode 100644
index 0000000..22e900e
--- /dev/null
+++ b/gsl-1.9/multiroots/Makefile.in
@@ -0,0 +1,552 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# -*-makefile-*-
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = test$(EXEEXT)
+subdir = multiroots
+DIST_COMMON = $(noinst_HEADERS) $(pkginclude_HEADERS) \
+ $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgslmultiroots_la_LIBADD =
+am_libgslmultiroots_la_OBJECTS = fdjac.lo fsolver.lo fdfsolver.lo \
+ convergence.lo newton.lo gnewton.lo dnewton.lo broyden.lo \
+ hybrid.lo hybridj.lo
+libgslmultiroots_la_OBJECTS = $(am_libgslmultiroots_la_OBJECTS)
+am_test_OBJECTS = test.$(OBJEXT) test_funcs.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = libgslmultiroots.la ../linalg/libgsllinalg.la \
+ ../blas/libgslblas.la ../cblas/libgslcblas.la \
+ ../permutation/libgslpermutation.la ../matrix/libgslmatrix.la \
+ ../vector/libgslvector.la ../block/libgslblock.la \
+ ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la \
+ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \
+ ../utils/libutils.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgslmultiroots_la_SOURCES) $(test_SOURCES)
+DIST_SOURCES = $(libgslmultiroots_la_SOURCES) $(test_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libgslmultiroots.la
+pkginclude_HEADERS = gsl_multiroots.h
+noinst_HEADERS = enorm.c dogleg.c
+INCLUDES = -I$(top_builddir)
+libgslmultiroots_la_SOURCES = fdjac.c fsolver.c fdfsolver.c convergence.c newton.c gnewton.c dnewton.c broyden.c hybrid.c hybridj.c
+TESTS = $(check_PROGRAMS)
+test_SOURCES = test.c test_funcs.c test_funcs.h
+test_LDADD = libgslmultiroots.la ../linalg/libgsllinalg.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../permutation/libgslpermutation.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps multiroots/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps multiroots/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgslmultiroots.la: $(libgslmultiroots_la_OBJECTS) $(libgslmultiroots_la_DEPENDENCIES)
+ $(LINK) $(libgslmultiroots_la_LDFLAGS) $(libgslmultiroots_la_OBJECTS) $(libgslmultiroots_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkgincludeHEADERS
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/multiroots/broyden.c b/gsl-1.9/multiroots/broyden.c
new file mode 100644
index 0000000..dbec753
--- /dev/null
+++ b/gsl-1.9/multiroots/broyden.c
@@ -0,0 +1,456 @@
+/* multiroots/broyden.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <float.h>
+
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_multiroots.h>
+#include <gsl/gsl_linalg.h>
+
+#include "enorm.c"
+
+/* Broyden's method. It is not an efficient or modern algorithm but
+ gives an example of a rank-1 update.
+
+ C.G. Broyden, "A Class of Methods for Solving Nonlinear
+ Simultaneous Equations", Mathematics of Computation, vol 19 (1965),
+ p 577-593
+
+ */
+
+typedef struct
+ {
+ gsl_matrix *H;
+ gsl_matrix *lu;
+ gsl_permutation *permutation;
+ gsl_vector *v;
+ gsl_vector *w;
+ gsl_vector *y;
+ gsl_vector *p;
+ gsl_vector *fnew;
+ gsl_vector *x_trial;
+ double phi;
+ }
+broyden_state_t;
+
+static int broyden_alloc (void *vstate, size_t n);
+static int broyden_set (void *vstate, gsl_multiroot_function * function, gsl_vector * x, gsl_vector * f, gsl_vector * dx);
+static int broyden_iterate (void *vstate, gsl_multiroot_function * function, gsl_vector * x, gsl_vector * f, gsl_vector * dx);
+static void broyden_free (void *vstate);
+
+
+static int
+broyden_alloc (void *vstate, size_t n)
+{
+ broyden_state_t *state = (broyden_state_t *) vstate;
+ gsl_vector *v, *w, *y, *fnew, *x_trial, *p;
+ gsl_permutation *perm;
+ gsl_matrix *m, *H;
+
+ m = gsl_matrix_calloc (n, n);
+
+ if (m == 0)
+ {
+ GSL_ERROR ("failed to allocate space for lu", GSL_ENOMEM);
+ }
+
+ state->lu = m;
+
+ perm = gsl_permutation_calloc (n);
+
+ if (perm == 0)
+ {
+ gsl_matrix_free (m);
+
+ GSL_ERROR ("failed to allocate space for permutation", GSL_ENOMEM);
+ }
+
+ state->permutation = perm;
+
+ H = gsl_matrix_calloc (n, n);
+
+ if (H == 0)
+ {
+ gsl_permutation_free (perm);
+ gsl_matrix_free (m);
+
+ GSL_ERROR ("failed to allocate space for d", GSL_ENOMEM);
+ }
+
+ state->H = H;
+
+ v = gsl_vector_calloc (n);
+
+ if (v == 0)
+ {
+ gsl_matrix_free (H);
+ gsl_permutation_free (perm);
+ gsl_matrix_free (m);
+
+ GSL_ERROR ("failed to allocate space for v", GSL_ENOMEM);
+ }
+
+ state->v = v;
+
+ w = gsl_vector_calloc (n);
+
+ if (w == 0)
+ {
+ gsl_vector_free (v);
+ gsl_matrix_free (H);
+ gsl_permutation_free (perm);
+ gsl_matrix_free (m);
+
+ GSL_ERROR ("failed to allocate space for w", GSL_ENOMEM);
+ }
+
+ state->w = w;
+
+ y = gsl_vector_calloc (n);
+
+ if (y == 0)
+ {
+ gsl_vector_free (w);
+ gsl_vector_free (v);
+ gsl_matrix_free (H);
+ gsl_permutation_free (perm);
+ gsl_matrix_free (m);
+
+ GSL_ERROR ("failed to allocate space for y", GSL_ENOMEM);
+ }
+
+ state->y = y;
+
+ fnew = gsl_vector_calloc (n);
+
+ if (fnew == 0)
+ {
+ gsl_vector_free (y);
+ gsl_vector_free (w);
+ gsl_vector_free (v);
+ gsl_matrix_free (H);
+ gsl_permutation_free (perm);
+ gsl_matrix_free (m);
+
+ GSL_ERROR ("failed to allocate space for fnew", GSL_ENOMEM);
+ }
+
+ state->fnew = fnew;
+
+ x_trial = gsl_vector_calloc (n);
+
+ if (x_trial == 0)
+ {
+ gsl_vector_free (fnew);
+ gsl_vector_free (y);
+ gsl_vector_free (w);
+ gsl_vector_free (v);
+ gsl_matrix_free (H);
+ gsl_permutation_free (perm);
+ gsl_matrix_free (m);
+
+ GSL_ERROR ("failed to allocate space for x_trial", GSL_ENOMEM);
+ }
+
+ state->x_trial = x_trial;
+
+ p = gsl_vector_calloc (n);
+
+ if (p == 0)
+ {
+ gsl_vector_free (x_trial);
+ gsl_vector_free (fnew);
+ gsl_vector_free (y);
+ gsl_vector_free (w);
+ gsl_vector_free (v);
+ gsl_matrix_free (H);
+ gsl_permutation_free (perm);
+ gsl_matrix_free (m);
+
+ GSL_ERROR ("failed to allocate space for p", GSL_ENOMEM);
+ }
+
+ state->p = p;
+
+ return GSL_SUCCESS;
+}
+
+static int
+broyden_set (void *vstate, gsl_multiroot_function * function, gsl_vector * x, gsl_vector * f, gsl_vector * dx)
+{
+ broyden_state_t *state = (broyden_state_t *) vstate;
+ size_t i, j, n = function->n;
+ int signum = 0;
+
+ GSL_MULTIROOT_FN_EVAL (function, x, f);
+
+ gsl_multiroot_fdjacobian (function, x, f, GSL_SQRT_DBL_EPSILON, state->lu);
+ gsl_linalg_LU_decomp (state->lu, state->permutation, &signum);
+ gsl_linalg_LU_invert (state->lu, state->permutation, state->H);
+
+ for (i = 0; i < n; i++)
+ for (j = 0; j < n; j++)
+ gsl_matrix_set(state->H,i,j,-gsl_matrix_get(state->H,i,j));
+
+ for (i = 0; i < n; i++)
+ {
+ gsl_vector_set (dx, i, 0.0);
+ }
+
+ state->phi = enorm (f);
+
+ return GSL_SUCCESS;
+}
+
+static int
+broyden_iterate (void *vstate, gsl_multiroot_function * function, gsl_vector * x, gsl_vector * f, gsl_vector * dx)
+{
+ broyden_state_t *state = (broyden_state_t *) vstate;
+
+ double phi0, phi1, t, lambda;
+
+ gsl_matrix *H = state->H;
+ gsl_vector *p = state->p;
+ gsl_vector *y = state->y;
+ gsl_vector *v = state->v;
+ gsl_vector *w = state->w;
+ gsl_vector *fnew = state->fnew;
+ gsl_vector *x_trial = state->x_trial;
+ gsl_matrix *lu = state->lu;
+ gsl_permutation *perm = state->permutation;
+
+ size_t i, j, iter;
+
+ size_t n = function->n;
+
+ /* p = H f */
+
+ for (i = 0; i < n; i++)
+ {
+ double sum = 0;
+
+ for (j = 0; j < n; j++)
+ {
+ sum += gsl_matrix_get (H, i, j) * gsl_vector_get (f, j);
+ }
+ gsl_vector_set (p, i, sum);
+ }
+
+ t = 1;
+ iter = 0;
+
+ phi0 = state->phi;
+
+new_step:
+
+ for (i = 0; i < n; i++)
+ {
+ double pi = gsl_vector_get (p, i);
+ double xi = gsl_vector_get (x, i);
+ gsl_vector_set (x_trial, i, xi + t * pi);
+ }
+
+ {
+ int status = GSL_MULTIROOT_FN_EVAL (function, x_trial, fnew);
+
+ if (status != GSL_SUCCESS)
+ {
+ return GSL_EBADFUNC;
+ }
+ }
+
+ phi1 = enorm (fnew);
+
+ iter++ ;
+
+ if (phi1 > phi0 && iter < 10 && t > 0.1)
+ {
+ /* full step goes uphill, take a reduced step instead */
+
+ double theta = phi1 / phi0;
+ t *= (sqrt (1.0 + 6.0 * theta) - 1.0) / (3.0 * theta);
+ goto new_step;
+ }
+
+ if (phi1 > phi0)
+ {
+ /* need to recompute Jacobian */
+ int signum = 0;
+
+ gsl_multiroot_fdjacobian (function, x, f, GSL_SQRT_DBL_EPSILON, lu);
+
+ for (i = 0; i < n; i++)
+ for (j = 0; j < n; j++)
+ gsl_matrix_set(lu,i,j,-gsl_matrix_get(lu,i,j));
+
+ gsl_linalg_LU_decomp (lu, perm, &signum);
+ gsl_linalg_LU_invert (lu, perm, H);
+
+ gsl_linalg_LU_solve (lu, perm, f, p);
+
+ t = 1;
+
+ for (i = 0; i < n; i++)
+ {
+ double pi = gsl_vector_get (p, i);
+ double xi = gsl_vector_get (x, i);
+ gsl_vector_set (x_trial, i, xi + t * pi);
+ }
+
+ {
+ int status = GSL_MULTIROOT_FN_EVAL (function, x_trial, fnew);
+
+ if (status != GSL_SUCCESS)
+ {
+ return GSL_EBADFUNC;
+ }
+ }
+
+ phi1 = enorm (fnew);
+ }
+
+ /* y = f' - f */
+
+ for (i = 0; i < n; i++)
+ {
+ double yi = gsl_vector_get (fnew, i) - gsl_vector_get (f, i);
+ gsl_vector_set (y, i, yi);
+ }
+
+ /* v = H y */
+
+ for (i = 0; i < n; i++)
+ {
+ double sum = 0;
+
+ for (j = 0; j < n; j++)
+ {
+ sum += gsl_matrix_get (H, i, j) * gsl_vector_get (y, j);
+ }
+
+ gsl_vector_set (v, i, sum);
+ }
+
+ /* lambda = p . v */
+
+ lambda = 0;
+
+ for (i = 0; i < n; i++)
+ {
+ lambda += gsl_vector_get (p, i) * gsl_vector_get (v, i);
+ }
+
+ if (lambda == 0)
+ {
+ GSL_ERROR ("approximation to Jacobian has collapsed", GSL_EZERODIV) ;
+ }
+
+ /* v' = v + t * p */
+
+ for (i = 0; i < n; i++)
+ {
+ double vi = gsl_vector_get (v, i) + t * gsl_vector_get (p, i);
+ gsl_vector_set (v, i, vi);
+ }
+
+ /* w^T = p^T H */
+
+ for (i = 0; i < n; i++)
+ {
+ double sum = 0;
+
+ for (j = 0; j < n; j++)
+ {
+ sum += gsl_matrix_get (H, j, i) * gsl_vector_get (p, j);
+ }
+
+ gsl_vector_set (w, i, sum);
+ }
+
+ /* Hij -> Hij - (vi wj / lambda) */
+
+ for (i = 0; i < n; i++)
+ {
+ double vi = gsl_vector_get (v, i);
+
+ for (j = 0; j < n; j++)
+ {
+ double wj = gsl_vector_get (w, j);
+ double Hij = gsl_matrix_get (H, i, j) - vi * wj / lambda;
+ gsl_matrix_set (H, i, j, Hij);
+ }
+ }
+
+ /* copy fnew into f */
+
+ gsl_vector_memcpy (f, fnew);
+
+ /* copy x_trial into x */
+
+ gsl_vector_memcpy (x, x_trial);
+
+ for (i = 0; i < n; i++)
+ {
+ double pi = gsl_vector_get (p, i);
+ gsl_vector_set (dx, i, t * pi);
+ }
+
+ state->phi = phi1;
+
+ return GSL_SUCCESS;
+}
+
+
+static void
+broyden_free (void *vstate)
+{
+ broyden_state_t *state = (broyden_state_t *) vstate;
+
+ gsl_matrix_free (state->H);
+
+ gsl_matrix_free (state->lu);
+ gsl_permutation_free (state->permutation);
+
+ gsl_vector_free (state->v);
+ gsl_vector_free (state->w);
+ gsl_vector_free (state->y);
+ gsl_vector_free (state->p);
+
+ gsl_vector_free (state->fnew);
+ gsl_vector_free (state->x_trial);
+
+}
+
+
+static const gsl_multiroot_fsolver_type broyden_type =
+{"broyden", /* name */
+ sizeof (broyden_state_t),
+ &broyden_alloc,
+ &broyden_set,
+ &broyden_iterate,
+ &broyden_free};
+
+const gsl_multiroot_fsolver_type *gsl_multiroot_fsolver_broyden = &broyden_type;
diff --git a/gsl-1.9/multiroots/convergence.c b/gsl-1.9/multiroots/convergence.c
new file mode 100644
index 0000000..1934662
--- /dev/null
+++ b/gsl-1.9/multiroots/convergence.c
@@ -0,0 +1,90 @@
+/* multiroots/convergence.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_multiroots.h>
+
+int
+gsl_multiroot_test_delta (const gsl_vector * dx, const gsl_vector * x,
+ double epsabs, double epsrel)
+{
+ size_t i;
+ int ok = 1;
+ const size_t n = x->size ;
+
+ if (epsrel < 0.0)
+ {
+ GSL_ERROR ("relative tolerance is negative", GSL_EBADTOL);
+ }
+
+ for (i = 0 ; i < n ; i++)
+ {
+ double xi = gsl_vector_get(x,i);
+ double dxi = gsl_vector_get(dx,i);
+ double tolerance = epsabs + epsrel * fabs(xi) ;
+
+ if (fabs(dxi) < tolerance)
+ {
+ ok = 1;
+ }
+ else
+ {
+ ok = 0;
+ break;
+ }
+ }
+
+ if (ok)
+ return GSL_SUCCESS ;
+
+ return GSL_CONTINUE;
+}
+
+int
+gsl_multiroot_test_residual (const gsl_vector * f, double epsabs)
+{
+ size_t i;
+
+ double residual = 0;
+
+ const size_t n = f->size;
+
+ if (epsabs < 0.0)
+ {
+ GSL_ERROR ("absolute tolerance is negative", GSL_EBADTOL);
+ }
+
+ for (i = 0 ; i < n ; i++)
+ {
+ double fi = gsl_vector_get(f, i);
+
+ residual += fabs(fi);
+ }
+
+
+ if (residual < epsabs)
+ {
+ return GSL_SUCCESS;
+ }
+
+ return GSL_CONTINUE ;
+}
+
diff --git a/gsl-1.9/multiroots/dnewton.c b/gsl-1.9/multiroots/dnewton.c
new file mode 100644
index 0000000..5a43a74
--- /dev/null
+++ b/gsl-1.9/multiroots/dnewton.c
@@ -0,0 +1,186 @@
+/* multiroots/dnewton.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <float.h>
+
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_multiroots.h>
+#include <gsl/gsl_linalg.h>
+
+/* Newton method using a finite difference approximation to the jacobian.
+ The derivatives are estimated using a step size of
+
+ h_i = sqrt(DBL_EPSILON) * x_i
+
+ */
+
+typedef struct
+ {
+ gsl_matrix * J;
+ gsl_matrix * lu;
+ gsl_permutation * permutation;
+ }
+dnewton_state_t;
+
+static int dnewton_alloc (void * vstate, size_t n);
+static int dnewton_set (void * vstate, gsl_multiroot_function * function, gsl_vector * x, gsl_vector * f, gsl_vector * dx);
+static int dnewton_iterate (void * vstate, gsl_multiroot_function * function, gsl_vector * x, gsl_vector * f, gsl_vector * dx);
+static void dnewton_free (void * vstate);
+
+static int
+dnewton_alloc (void * vstate, size_t n)
+{
+ dnewton_state_t * state = (dnewton_state_t *) vstate;
+ gsl_permutation * p;
+ gsl_matrix * m, * J;
+
+ m = gsl_matrix_calloc (n,n);
+
+ if (m == 0)
+ {
+ GSL_ERROR ("failed to allocate space for lu", GSL_ENOMEM);
+ }
+
+ state->lu = m ;
+
+ p = gsl_permutation_calloc (n);
+
+ if (p == 0)
+ {
+ gsl_matrix_free(m);
+
+ GSL_ERROR ("failed to allocate space for permutation", GSL_ENOMEM);
+ }
+
+ state->permutation = p ;
+
+ J = gsl_matrix_calloc (n,n);
+
+ if (J == 0)
+ {
+ gsl_permutation_free(p);
+ gsl_matrix_free(m);
+
+ GSL_ERROR ("failed to allocate space for d", GSL_ENOMEM);
+ }
+
+ state->J = J;
+
+ return GSL_SUCCESS;
+}
+
+static int
+dnewton_set (void * vstate, gsl_multiroot_function * function, gsl_vector * x, gsl_vector * f, gsl_vector * dx)
+{
+ dnewton_state_t * state = (dnewton_state_t *) vstate;
+ size_t i, n = function->n ;
+ int status;
+
+ status = GSL_MULTIROOT_FN_EVAL (function, x, f);
+ if (status)
+ return status;
+
+ status = gsl_multiroot_fdjacobian (function, x, f, GSL_SQRT_DBL_EPSILON,
+ state->J);
+ if (status)
+ return status;
+
+ for (i = 0; i < n; i++)
+ {
+ gsl_vector_set (dx, i, 0.0);
+ }
+
+ return GSL_SUCCESS;
+}
+
+static int
+dnewton_iterate (void * vstate, gsl_multiroot_function * function, gsl_vector * x, gsl_vector * f, gsl_vector * dx)
+{
+ dnewton_state_t * state = (dnewton_state_t *) vstate;
+
+ int signum ;
+
+ size_t i;
+
+ size_t n = function->n ;
+
+ gsl_matrix_memcpy (state->lu, state->J);
+
+ {
+ int status = gsl_linalg_LU_decomp (state->lu, state->permutation, &signum);
+ if (status)
+ return status;
+ }
+
+ {
+ int status = gsl_linalg_LU_solve (state->lu, state->permutation, f, dx);
+ if (status)
+ return status;
+ }
+
+ for (i = 0; i < n; i++)
+ {
+ double e = gsl_vector_get (dx, i);
+ double y = gsl_vector_get (x, i);
+ gsl_vector_set (dx, i, -e);
+ gsl_vector_set (x, i, y - e);
+ }
+
+ {
+ int status = GSL_MULTIROOT_FN_EVAL (function, x, f);
+
+ if (status != GSL_SUCCESS)
+ {
+ return GSL_EBADFUNC;
+ }
+ }
+
+ gsl_multiroot_fdjacobian (function, x, f, GSL_SQRT_DBL_EPSILON, state->J);
+
+ return GSL_SUCCESS;
+}
+
+
+static void
+dnewton_free (void * vstate)
+{
+ dnewton_state_t * state = (dnewton_state_t *) vstate;
+
+ gsl_matrix_free(state->J);
+ gsl_matrix_free(state->lu);
+ gsl_permutation_free(state->permutation);
+}
+
+
+static const gsl_multiroot_fsolver_type dnewton_type =
+{"dnewton", /* name */
+ sizeof (dnewton_state_t),
+ &dnewton_alloc,
+ &dnewton_set,
+ &dnewton_iterate,
+ &dnewton_free};
+
+const gsl_multiroot_fsolver_type * gsl_multiroot_fsolver_dnewton = &dnewton_type;
diff --git a/gsl-1.9/multiroots/dogleg.c b/gsl-1.9/multiroots/dogleg.c
new file mode 100644
index 0000000..4a120ef
--- /dev/null
+++ b/gsl-1.9/multiroots/dogleg.c
@@ -0,0 +1,413 @@
+/* multiroots/dogleg.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "enorm.c"
+
+static void compute_diag (const gsl_matrix * J, gsl_vector * diag);
+static void update_diag (const gsl_matrix * J, gsl_vector * diag);
+static double compute_delta (gsl_vector * diag, gsl_vector * x);
+static void compute_df (const gsl_vector * f_trial, const gsl_vector * f, gsl_vector * df);
+static void compute_wv (const gsl_vector * qtdf, const gsl_vector *rdx, const gsl_vector *dx, const gsl_vector *diag, double pnorm, gsl_vector * w, gsl_vector * v);
+
+static double scaled_enorm (const gsl_vector * d, const gsl_vector * f);
+
+static double scaled_enorm (const gsl_vector * d, const gsl_vector * f) {
+ double e2 = 0 ;
+ size_t i, n = f->size ;
+ for (i = 0; i < n ; i++) {
+ double fi= gsl_vector_get(f, i);
+ double di= gsl_vector_get(d, i);
+ double u = di * fi;
+ e2 += u * u ;
+ }
+ return sqrt(e2);
+}
+
+static double enorm_sum (const gsl_vector * a, const gsl_vector * b);
+
+static double enorm_sum (const gsl_vector * a, const gsl_vector * b) {
+ double e2 = 0 ;
+ size_t i, n = a->size ;
+ for (i = 0; i < n ; i++) {
+ double ai= gsl_vector_get(a, i);
+ double bi= gsl_vector_get(b, i);
+ double u = ai + bi;
+ e2 += u * u ;
+ }
+ return sqrt(e2);
+}
+
+static void
+compute_wv (const gsl_vector * qtdf, const gsl_vector *rdx, const gsl_vector *dx, const gsl_vector *diag, double pnorm, gsl_vector * w, gsl_vector * v)
+{
+ size_t i, n = qtdf->size;
+
+ for (i = 0; i < n; i++)
+ {
+ double qtdfi = gsl_vector_get (qtdf, i);
+ double rdxi = gsl_vector_get (rdx, i);
+ double dxi = gsl_vector_get (dx, i);
+ double diagi = gsl_vector_get (diag, i);
+
+ gsl_vector_set (w, i, (qtdfi - rdxi) / pnorm);
+ gsl_vector_set (v, i, diagi * diagi * dxi / pnorm);
+ }
+}
+
+
+static void
+compute_df (const gsl_vector * f_trial, const gsl_vector * f, gsl_vector * df)
+{
+ size_t i, n = f->size;
+
+ for (i = 0; i < n; i++)
+ {
+ double dfi = gsl_vector_get (f_trial, i) - gsl_vector_get (f, i);
+ gsl_vector_set (df, i, dfi);
+ }
+}
+
+static void
+compute_diag (const gsl_matrix * J, gsl_vector * diag)
+{
+ size_t i, j, n = diag->size;
+
+ for (j = 0; j < n; j++)
+ {
+ double sum = 0;
+ for (i = 0; i < n; i++)
+ {
+ double Jij = gsl_matrix_get (J, i, j);
+ sum += Jij * Jij;
+ }
+ if (sum == 0)
+ sum = 1.0;
+
+ gsl_vector_set (diag, j, sqrt (sum));
+ }
+}
+
+static void
+update_diag (const gsl_matrix * J, gsl_vector * diag)
+{
+ size_t i, j, n = diag->size;
+
+ for (j = 0; j < n; j++)
+ {
+ double cnorm, diagj, sum = 0;
+ for (i = 0; i < n; i++)
+ {
+ double Jij = gsl_matrix_get (J, i, j);
+ sum += Jij * Jij;
+ }
+ if (sum == 0)
+ sum = 1.0;
+
+ cnorm = sqrt (sum);
+ diagj = gsl_vector_get (diag, j);
+
+ if (cnorm > diagj)
+ gsl_vector_set (diag, j, cnorm);
+ }
+}
+
+static double
+compute_delta (gsl_vector * diag, gsl_vector * x)
+{
+ double Dx = scaled_enorm (diag, x);
+ double factor = 100;
+
+ return (Dx > 0) ? factor * Dx : factor;
+}
+
+static double
+compute_actual_reduction (double fnorm, double fnorm1)
+{
+ double actred;
+
+ if (fnorm1 < fnorm)
+ {
+ double u = fnorm1 / fnorm;
+ actred = 1 - u * u;
+ }
+ else
+ {
+ actred = -1;
+ }
+
+ return actred;
+}
+
+static double
+compute_predicted_reduction (double fnorm, double fnorm1)
+{
+ double prered;
+
+ if (fnorm1 < fnorm)
+ {
+ double u = fnorm1 / fnorm;
+ prered = 1 - u * u;
+ }
+ else
+ {
+ prered = 0;
+ }
+
+ return prered;
+}
+
+static void
+compute_qtf (const gsl_matrix * q, const gsl_vector * f, gsl_vector * qtf)
+{
+ size_t i, j, N = f->size ;
+
+ for (j = 0; j < N; j++)
+ {
+ double sum = 0;
+ for (i = 0; i < N; i++)
+ sum += gsl_matrix_get (q, i, j) * gsl_vector_get (f, i);
+
+ gsl_vector_set (qtf, j, sum);
+ }
+}
+
+static void
+compute_rdx (const gsl_matrix * r, const gsl_vector * dx, gsl_vector * rdx)
+{
+ size_t i, j, N = dx->size ;
+
+ for (i = 0; i < N; i++)
+ {
+ double sum = 0;
+
+ for (j = i; j < N; j++)
+ {
+ sum += gsl_matrix_get (r, i, j) * gsl_vector_get (dx, j);
+ }
+
+ gsl_vector_set (rdx, i, sum);
+ }
+}
+
+
+static void
+compute_trial_step (gsl_vector *x, gsl_vector * dx, gsl_vector * x_trial)
+{
+ size_t i, N = x->size;
+
+ for (i = 0; i < N; i++)
+ {
+ double pi = gsl_vector_get (dx, i);
+ double xi = gsl_vector_get (x, i);
+ gsl_vector_set (x_trial, i, xi + pi);
+ }
+}
+
+static int
+newton_direction (const gsl_matrix * r, const gsl_vector * qtf, gsl_vector * p)
+{
+ const size_t N = r->size2;
+ size_t i;
+ int status;
+
+ status = gsl_linalg_R_solve (r, qtf, p);
+
+#ifdef DEBUG
+ printf("rsolve status = %d\n", status);
+#endif
+
+ for (i = 0; i < N; i++)
+ {
+ double pi = gsl_vector_get (p, i);
+ gsl_vector_set (p, i, -pi);
+ }
+
+ return status;
+}
+
+static void
+gradient_direction (const gsl_matrix * r, const gsl_vector * qtf,
+ const gsl_vector * diag, gsl_vector * g)
+{
+ const size_t M = r->size1;
+ const size_t N = r->size2;
+
+ size_t i, j;
+
+ for (j = 0; j < M; j++)
+ {
+ double sum = 0;
+ double dj;
+
+ for (i = 0; i < N; i++)
+ {
+ sum += gsl_matrix_get (r, i, j) * gsl_vector_get (qtf, i);
+ }
+
+ dj = gsl_vector_get (diag, j);
+ gsl_vector_set (g, j, -sum / dj);
+ }
+}
+
+static void
+minimum_step (double gnorm, const gsl_vector * diag, gsl_vector * g)
+{
+ const size_t N = g->size;
+ size_t i;
+
+ for (i = 0; i < N; i++)
+ {
+ double gi = gsl_vector_get (g, i);
+ double di = gsl_vector_get (diag, i);
+ gsl_vector_set (g, i, (gi / gnorm) / di);
+ }
+}
+
+static void
+compute_Rg (const gsl_matrix * r, const gsl_vector * gradient, gsl_vector * Rg)
+{
+ const size_t N = r->size2;
+ size_t i, j;
+
+ for (i = 0; i < N; i++)
+ {
+ double sum = 0;
+
+ for (j = i; j < N; j++)
+ {
+ double gj = gsl_vector_get (gradient, j);
+ double rij = gsl_matrix_get (r, i, j);
+ sum += rij * gj;
+ }
+
+ gsl_vector_set (Rg, i, sum);
+ }
+}
+
+static void
+scaled_addition (double alpha, gsl_vector * newton, double beta, gsl_vector * gradient, gsl_vector * p)
+{
+ const size_t N = p->size;
+ size_t i;
+
+ for (i = 0; i < N; i++)
+ {
+ double ni = gsl_vector_get (newton, i);
+ double gi = gsl_vector_get (gradient, i);
+ gsl_vector_set (p, i, alpha * ni + beta * gi);
+ }
+}
+
+static int
+dogleg (const gsl_matrix * r, const gsl_vector * qtf,
+ const gsl_vector * diag, double delta,
+ gsl_vector * newton, gsl_vector * gradient, gsl_vector * p)
+{
+ double qnorm, gnorm, sgnorm, bnorm, temp;
+
+ newton_direction (r, qtf, newton);
+
+#ifdef DEBUG
+ printf("newton = "); gsl_vector_fprintf(stdout, newton, "%g"); printf("\n");
+#endif
+
+ qnorm = scaled_enorm (diag, newton);
+
+ if (qnorm <= delta)
+ {
+ gsl_vector_memcpy (p, newton);
+#ifdef DEBUG
+ printf("took newton (qnorm = %g <= delta = %g)\n", qnorm, delta);
+#endif
+ return GSL_SUCCESS;
+ }
+
+ gradient_direction (r, qtf, diag, gradient);
+
+#ifdef DEBUG
+ printf("grad = "); gsl_vector_fprintf(stdout, gradient, "%g"); printf("\n");
+#endif
+
+ gnorm = enorm (gradient);
+
+ if (gnorm == 0)
+ {
+ double alpha = delta / qnorm;
+ double beta = 0;
+ scaled_addition (alpha, newton, beta, gradient, p);
+#ifdef DEBUG
+ printf("took scaled newton because gnorm = 0\n");
+#endif
+ return GSL_SUCCESS;
+ }
+
+ minimum_step (gnorm, diag, gradient);
+
+ compute_Rg (r, gradient, p); /* Use p as temporary space to compute Rg */
+
+#ifdef DEBUG
+ printf("mingrad = "); gsl_vector_fprintf(stdout, gradient, "%g"); printf("\n");
+ printf("Rg = "); gsl_vector_fprintf(stdout, p, "%g"); printf("\n");
+#endif
+
+ temp = enorm (p);
+ sgnorm = (gnorm / temp) / temp;
+
+ if (sgnorm > delta)
+ {
+ double alpha = 0;
+ double beta = delta;
+ scaled_addition (alpha, newton, beta, gradient, p);
+#ifdef DEBUG
+ printf("took gradient\n");
+#endif
+ return GSL_SUCCESS;
+ }
+
+ bnorm = enorm (qtf);
+
+ {
+ double bg = bnorm / gnorm;
+ double bq = bnorm / qnorm;
+ double dq = delta / qnorm;
+ double dq2 = dq * dq;
+ double sd = sgnorm / delta;
+ double sd2 = sd * sd;
+
+ double t1 = bg * bq * sd;
+ double u = t1 - dq;
+ double t2 = t1 - dq * sd2 + sqrt (u * u + (1-dq2) * (1 - sd2));
+
+ double alpha = dq * (1 - sd2) / t2;
+ double beta = (1 - alpha) * sgnorm;
+
+#ifdef DEBUG
+ printf("bnorm = %g\n", bnorm);
+ printf("gnorm = %g\n", gnorm);
+ printf("qnorm = %g\n", qnorm);
+ printf("delta = %g\n", delta);
+ printf("alpha = %g beta = %g\n", alpha, beta);
+ printf("took scaled combination of newton and gradient\n");
+#endif
+
+ scaled_addition (alpha, newton, beta, gradient, p);
+ }
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/multiroots/enorm.c b/gsl-1.9/multiroots/enorm.c
new file mode 100644
index 0000000..4ad40a1
--- /dev/null
+++ b/gsl-1.9/multiroots/enorm.c
@@ -0,0 +1,33 @@
+/* multiroots/enorm.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+static double enorm (const gsl_vector * f);
+
+static double enorm (const gsl_vector * f) {
+ double e2 = 0 ;
+ size_t i, n = f->size ;
+ for (i = 0; i < n ; i++) {
+ double fi= gsl_vector_get(f, i);
+ e2 += fi * fi ;
+ }
+ return sqrt(e2);
+}
+
+
+
diff --git a/gsl-1.9/multiroots/fdfsolver.c b/gsl-1.9/multiroots/fdfsolver.c
new file mode 100644
index 0000000..0c34bba
--- /dev/null
+++ b/gsl-1.9/multiroots/fdfsolver.c
@@ -0,0 +1,176 @@
+/* multiroots/fdfsolver.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_multiroots.h>
+
+gsl_multiroot_fdfsolver *
+gsl_multiroot_fdfsolver_alloc (const gsl_multiroot_fdfsolver_type * T,
+ size_t n)
+{
+ int status;
+
+ gsl_multiroot_fdfsolver * s;
+
+ s = (gsl_multiroot_fdfsolver *) malloc (sizeof (gsl_multiroot_fdfsolver));
+
+ if (s == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for multiroot solver struct",
+ GSL_ENOMEM, 0);
+ }
+
+ s->x = gsl_vector_calloc (n);
+
+ if (s->x == 0)
+ {
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for x", GSL_ENOMEM, 0);
+ }
+
+ s->f = gsl_vector_calloc (n);
+
+ if (s->f == 0)
+ {
+ gsl_vector_free (s->x);
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for f", GSL_ENOMEM, 0);
+ }
+
+ s->J = gsl_matrix_calloc (n,n);
+
+ if (s->J == 0)
+ {
+ gsl_vector_free (s->x);
+ gsl_vector_free (s->f);
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for g", GSL_ENOMEM, 0);
+ }
+
+ s->dx = gsl_vector_calloc (n);
+
+ if (s->dx == 0)
+ {
+ gsl_matrix_free (s->J);
+ gsl_vector_free (s->x);
+ gsl_vector_free (s->f);
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for dx", GSL_ENOMEM, 0);
+ }
+
+ s->state = malloc (T->size);
+
+ if (s->state == 0)
+ {
+ gsl_vector_free (s->dx);
+ gsl_vector_free (s->x);
+ gsl_vector_free (s->f);
+ gsl_matrix_free (s->J);
+ free (s); /* exception in constructor, avoid memory leak */
+
+ GSL_ERROR_VAL ("failed to allocate space for multiroot solver state",
+ GSL_ENOMEM, 0);
+ }
+
+ s->type = T ;
+
+ status = (s->type->alloc)(s->state, n);
+
+ if (status != GSL_SUCCESS)
+ {
+ free (s->state);
+ gsl_vector_free (s->dx);
+ gsl_vector_free (s->x);
+ gsl_vector_free (s->f);
+ gsl_matrix_free (s->J);
+ free (s); /* exception in constructor, avoid memory leak */
+
+ GSL_ERROR_VAL ("failed to set solver", status, 0);
+ }
+
+ s->fdf = NULL;
+
+ return s;
+}
+
+int
+gsl_multiroot_fdfsolver_set (gsl_multiroot_fdfsolver * s,
+ gsl_multiroot_function_fdf * f,
+ const gsl_vector * x)
+{
+ if (s->x->size != f->n)
+ {
+ GSL_ERROR ("function incompatible with solver size", GSL_EBADLEN);
+ }
+
+ if (x->size != f->n)
+ {
+ GSL_ERROR ("vector length not compatible with function", GSL_EBADLEN);
+ }
+
+ s->fdf = f;
+ gsl_vector_memcpy(s->x,x);
+
+ return (s->type->set) (s->state, s->fdf, s->x, s->f, s->J, s->dx);
+}
+
+int
+gsl_multiroot_fdfsolver_iterate (gsl_multiroot_fdfsolver * s)
+{
+ return (s->type->iterate) (s->state, s->fdf, s->x, s->f, s->J, s->dx);
+}
+
+void
+gsl_multiroot_fdfsolver_free (gsl_multiroot_fdfsolver * s)
+{
+ (s->type->free) (s->state);
+ free (s->state);
+ gsl_vector_free (s->dx);
+ gsl_vector_free (s->x);
+ gsl_vector_free (s->f);
+ gsl_matrix_free (s->J);
+ free (s);
+}
+
+const char *
+gsl_multiroot_fdfsolver_name (const gsl_multiroot_fdfsolver * s)
+{
+ return s->type->name;
+}
+
+gsl_vector *
+gsl_multiroot_fdfsolver_root (const gsl_multiroot_fdfsolver * s)
+{
+ return s->x;
+}
+
+gsl_vector *
+gsl_multiroot_fdfsolver_dx (const gsl_multiroot_fdfsolver * s)
+{
+ return s->dx;
+}
+
+gsl_vector *
+gsl_multiroot_fdfsolver_f (const gsl_multiroot_fdfsolver * s)
+{
+ return s->f;
+}
diff --git a/gsl-1.9/multiroots/fdjac.c b/gsl-1.9/multiroots/fdjac.c
new file mode 100644
index 0000000..6628589
--- /dev/null
+++ b/gsl-1.9/multiroots/fdjac.c
@@ -0,0 +1,96 @@
+/* multiroots/fdjac.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_multiroots.h>
+
+int
+gsl_multiroot_fdjacobian (gsl_multiroot_function * F,
+ const gsl_vector * x, const gsl_vector * f,
+ double epsrel, gsl_matrix * jacobian)
+{
+ const size_t n = x->size;
+ const size_t m = f->size;
+ const size_t n1 = jacobian->size1;
+ const size_t n2 = jacobian->size2;
+
+ if (m != n1 || n != n2)
+ {
+ GSL_ERROR ("function and jacobian are not conformant", GSL_EBADLEN);
+ }
+
+ {
+ size_t i,j;
+ gsl_vector *x1, *f1;
+
+ x1 = gsl_vector_alloc (n);
+
+ if (x1 == 0)
+ {
+ GSL_ERROR ("failed to allocate space for x1 workspace", GSL_ENOMEM);
+ }
+
+ f1 = gsl_vector_alloc (m);
+
+ if (f1 == 0)
+ {
+ gsl_vector_free (x1);
+
+ GSL_ERROR ("failed to allocate space for f1 workspace", GSL_ENOMEM);
+ }
+
+ gsl_vector_memcpy (x1, x); /* copy x into x1 */
+
+ for (j = 0; j < n; j++)
+ {
+ double xj = gsl_vector_get (x, j);
+ double dx = epsrel * fabs (xj);
+
+ if (dx == 0)
+ {
+ dx = epsrel;
+ }
+
+ gsl_vector_set (x1, j, xj + dx);
+
+ {
+ int status = GSL_MULTIROOT_FN_EVAL (F, x1, f1);
+
+ if (status != GSL_SUCCESS)
+ {
+ return GSL_EBADFUNC;
+ }
+ }
+
+ gsl_vector_set (x1, j, xj);
+
+ for (i = 0; i < m; i++)
+ {
+ double g1 = gsl_vector_get (f1, i);
+ double g0 = gsl_vector_get (f, i);
+ gsl_matrix_set (jacobian, i, j, (g1 - g0) / dx);
+ }
+ }
+
+ gsl_vector_free (x1);
+ gsl_vector_free (f1);
+ }
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/multiroots/fsolver.c b/gsl-1.9/multiroots/fsolver.c
new file mode 100644
index 0000000..bb334a4
--- /dev/null
+++ b/gsl-1.9/multiroots/fsolver.c
@@ -0,0 +1,163 @@
+/* multiroots/fsolver.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_multiroots.h>
+
+gsl_multiroot_fsolver *
+gsl_multiroot_fsolver_alloc (const gsl_multiroot_fsolver_type * T,
+ size_t n)
+{
+ int status;
+
+ gsl_multiroot_fsolver * s;
+
+ s = (gsl_multiroot_fsolver *) malloc (sizeof (gsl_multiroot_fsolver));
+
+ if (s == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for multiroot solver struct",
+ GSL_ENOMEM, 0);
+ }
+
+ s->x = gsl_vector_calloc (n);
+
+ if (s->x == 0)
+ {
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for x", GSL_ENOMEM, 0);
+ }
+
+ s->f = gsl_vector_calloc (n);
+
+ if (s->f == 0)
+ {
+ gsl_vector_free (s->x);
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for f", GSL_ENOMEM, 0);
+ }
+
+ s->dx = gsl_vector_calloc (n);
+
+ if (s->dx == 0)
+ {
+ gsl_vector_free (s->x);
+ gsl_vector_free (s->f);
+ free (s);
+ GSL_ERROR_VAL ("failed to allocate space for dx", GSL_ENOMEM, 0);
+ }
+
+ s->state = malloc (T->size);
+
+ if (s->state == 0)
+ {
+ gsl_vector_free (s->dx);
+ gsl_vector_free (s->x);
+ gsl_vector_free (s->f);
+ free (s); /* exception in constructor, avoid memory leak */
+
+ GSL_ERROR_VAL ("failed to allocate space for multiroot solver state",
+ GSL_ENOMEM, 0);
+ }
+
+ s->type = T ;
+
+ status = (s->type->alloc)(s->state, n);
+
+ if (status != GSL_SUCCESS)
+ {
+ (s->type->free)(s->state);
+ free (s->state);
+ gsl_vector_free (s->dx);
+ gsl_vector_free (s->x);
+ gsl_vector_free (s->f);
+ free (s); /* exception in constructor, avoid memory leak */
+
+ GSL_ERROR_VAL ("failed to set solver", status, 0);
+ }
+
+ s->function = NULL;
+
+ return s;
+}
+
+int
+gsl_multiroot_fsolver_set (gsl_multiroot_fsolver * s,
+ gsl_multiroot_function * f,
+ const gsl_vector * x)
+{
+ if (s->x->size != f->n)
+ {
+ GSL_ERROR ("function incompatible with solver size", GSL_EBADLEN);
+ }
+
+ if (x->size != f->n)
+ {
+ GSL_ERROR ("vector length not compatible with function", GSL_EBADLEN);
+ }
+
+ s->function = f;
+ gsl_vector_memcpy(s->x,x);
+
+ return (s->type->set) (s->state, s->function, s->x, s->f, s->dx);
+}
+
+int
+gsl_multiroot_fsolver_iterate (gsl_multiroot_fsolver * s)
+{
+ return (s->type->iterate) (s->state, s->function, s->x, s->f, s->dx);
+}
+
+void
+gsl_multiroot_fsolver_free (gsl_multiroot_fsolver * s)
+{
+ (s->type->free) (s->state);
+ free (s->state);
+ gsl_vector_free (s->dx);
+ gsl_vector_free (s->x);
+ gsl_vector_free (s->f);
+ free (s);
+}
+
+const char *
+gsl_multiroot_fsolver_name (const gsl_multiroot_fsolver * s)
+{
+ return s->type->name;
+}
+
+gsl_vector *
+gsl_multiroot_fsolver_root (const gsl_multiroot_fsolver * s)
+{
+ return s->x;
+}
+
+gsl_vector *
+gsl_multiroot_fsolver_dx (const gsl_multiroot_fsolver * s)
+{
+ return s->dx;
+}
+
+gsl_vector *
+gsl_multiroot_fsolver_f (const gsl_multiroot_fsolver * s)
+{
+ return s->f;
+}
diff --git a/gsl-1.9/multiroots/gnewton.c b/gsl-1.9/multiroots/gnewton.c
new file mode 100644
index 0000000..13ade76
--- /dev/null
+++ b/gsl-1.9/multiroots/gnewton.c
@@ -0,0 +1,226 @@
+/* multiroots/gnewton.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <float.h>
+
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_multiroots.h>
+#include <gsl/gsl_linalg.h>
+
+#include "enorm.c"
+
+/* Simple globally convergent Newton method (rejects uphill steps) */
+
+typedef struct
+ {
+ double phi;
+ gsl_vector * x_trial;
+ gsl_vector * d;
+ gsl_matrix * lu;
+ gsl_permutation * permutation;
+ }
+gnewton_state_t;
+
+static int gnewton_alloc (void * vstate, size_t n);
+static int gnewton_set (void * vstate, gsl_multiroot_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_matrix * J, gsl_vector * dx);
+static int gnewton_iterate (void * vstate, gsl_multiroot_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_matrix * J, gsl_vector * dx);
+static void gnewton_free (void * vstate);
+
+static int
+gnewton_alloc (void * vstate, size_t n)
+{
+ gnewton_state_t * state = (gnewton_state_t *) vstate;
+ gsl_vector * d, * x_trial ;
+ gsl_permutation * p;
+ gsl_matrix * m;
+
+ m = gsl_matrix_calloc (n,n);
+
+ if (m == 0)
+ {
+ GSL_ERROR ("failed to allocate space for lu", GSL_ENOMEM);
+ }
+
+ state->lu = m ;
+
+ p = gsl_permutation_calloc (n);
+
+ if (p == 0)
+ {
+ gsl_matrix_free(m);
+
+ GSL_ERROR ("failed to allocate space for permutation", GSL_ENOMEM);
+ }
+
+ state->permutation = p ;
+
+ d = gsl_vector_calloc (n);
+
+ if (d == 0)
+ {
+ gsl_permutation_free(p);
+ gsl_matrix_free(m);
+
+ GSL_ERROR ("failed to allocate space for d", GSL_ENOMEM);
+ }
+
+ state->d = d;
+
+ x_trial = gsl_vector_calloc (n);
+
+ if (x_trial == 0)
+ {
+ gsl_vector_free(d);
+ gsl_permutation_free(p);
+ gsl_matrix_free(m);
+
+ GSL_ERROR ("failed to allocate space for x_trial", GSL_ENOMEM);
+ }
+
+ state->x_trial = x_trial;
+
+ return GSL_SUCCESS;
+}
+
+
+static int
+gnewton_set (void * vstate, gsl_multiroot_function_fdf * FDF, gsl_vector * x, gsl_vector * f, gsl_matrix * J, gsl_vector * dx)
+{
+ gnewton_state_t * state = (gnewton_state_t *) vstate;
+ size_t i, n = FDF->n ;
+
+ GSL_MULTIROOT_FN_EVAL_F_DF (FDF, x, f, J);
+
+ for (i = 0; i < n; i++)
+ {
+ gsl_vector_set (dx, i, 0.0);
+ }
+
+ state->phi = enorm(f);
+
+ return GSL_SUCCESS;
+}
+
+static int
+gnewton_iterate (void * vstate, gsl_multiroot_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_matrix * J, gsl_vector * dx)
+{
+ gnewton_state_t * state = (gnewton_state_t *) vstate;
+
+ int signum ;
+ double t, phi0, phi1;
+
+ size_t i;
+
+ size_t n = fdf->n ;
+
+ gsl_matrix_memcpy (state->lu, J);
+
+ gsl_linalg_LU_decomp (state->lu, state->permutation, &signum);
+
+ gsl_linalg_LU_solve (state->lu, state->permutation, f, state->d);
+
+ t = 1;
+
+ phi0 = state->phi;
+
+new_step:
+
+ for (i = 0; i < n; i++)
+ {
+ double di = gsl_vector_get (state->d, i);
+ double xi = gsl_vector_get (x, i);
+ gsl_vector_set (state->x_trial, i, xi - t*di);
+ }
+
+ {
+ int status = GSL_MULTIROOT_FN_EVAL_F (fdf, state->x_trial, f);
+
+ if (status != GSL_SUCCESS)
+ {
+ return GSL_EBADFUNC;
+ }
+ }
+
+ phi1 = enorm (f);
+
+ if (phi1 > phi0 && t > GSL_DBL_EPSILON)
+ {
+ /* full step goes uphill, take a reduced step instead */
+
+ double theta = phi1 / phi0;
+ double u = (sqrt(1.0 + 6.0 * theta) - 1.0) / (3.0 * theta);
+
+ t *= u ;
+
+ goto new_step;
+ }
+
+ /* copy x_trial into x */
+
+ gsl_vector_memcpy (x, state->x_trial);
+
+ for (i = 0; i < n; i++)
+ {
+ double di = gsl_vector_get (state->d, i);
+ gsl_vector_set (dx, i, -t*di);
+ }
+
+ {
+ int status = GSL_MULTIROOT_FN_EVAL_DF (fdf, x, J);
+
+ if (status != GSL_SUCCESS)
+ {
+ return GSL_EBADFUNC;
+ }
+ }
+
+ state->phi = phi1;
+
+ return GSL_SUCCESS;
+}
+
+
+static void
+gnewton_free (void * vstate)
+{
+ gnewton_state_t * state = (gnewton_state_t *) vstate;
+
+ gsl_vector_free(state->d);
+ gsl_vector_free(state->x_trial);
+ gsl_matrix_free(state->lu);
+ gsl_permutation_free(state->permutation);
+}
+
+
+static const gsl_multiroot_fdfsolver_type gnewton_type =
+{"gnewton", /* name */
+ sizeof (gnewton_state_t),
+ &gnewton_alloc,
+ &gnewton_set,
+ &gnewton_iterate,
+ &gnewton_free};
+
+const gsl_multiroot_fdfsolver_type * gsl_multiroot_fdfsolver_gnewton = &gnewton_type;
diff --git a/gsl-1.9/multiroots/gsl_multiroots.h b/gsl-1.9/multiroots/gsl_multiroots.h
new file mode 100644
index 0000000..6ea5681
--- /dev/null
+++ b/gsl-1.9/multiroots/gsl_multiroots.h
@@ -0,0 +1,177 @@
+/* multiroots/gsl_multiroots.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_MULTIROOTS_H__
+#define __GSL_MULTIROOTS_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_types.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_matrix.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+/* Definition of vector-valued functions with parameters based on gsl_vector */
+
+struct gsl_multiroot_function_struct
+{
+ int (* f) (const gsl_vector * x, void * params, gsl_vector * f);
+ size_t n;
+ void * params;
+};
+
+typedef struct gsl_multiroot_function_struct gsl_multiroot_function ;
+
+#define GSL_MULTIROOT_FN_EVAL(F,x,y) (*((F)->f))(x,(F)->params,(y))
+
+int gsl_multiroot_fdjacobian (gsl_multiroot_function * F,
+ const gsl_vector * x, const gsl_vector * f,
+ double epsrel, gsl_matrix * jacobian);
+
+
+typedef struct
+ {
+ const char *name;
+ size_t size;
+ int (*alloc) (void *state, size_t n);
+ int (*set) (void *state, gsl_multiroot_function * function, gsl_vector * x, gsl_vector * f, gsl_vector * dx);
+ int (*iterate) (void *state, gsl_multiroot_function * function, gsl_vector * x, gsl_vector * f, gsl_vector * dx);
+ void (*free) (void *state);
+ }
+gsl_multiroot_fsolver_type;
+
+typedef struct
+ {
+ const gsl_multiroot_fsolver_type * type;
+ gsl_multiroot_function * function ;
+ gsl_vector * x ;
+ gsl_vector * f ;
+ gsl_vector * dx ;
+ void *state;
+ }
+gsl_multiroot_fsolver;
+
+gsl_multiroot_fsolver *
+gsl_multiroot_fsolver_alloc (const gsl_multiroot_fsolver_type * T,
+ size_t n);
+
+void gsl_multiroot_fsolver_free (gsl_multiroot_fsolver * s);
+
+int gsl_multiroot_fsolver_set (gsl_multiroot_fsolver * s,
+ gsl_multiroot_function * f,
+ const gsl_vector * x);
+
+int gsl_multiroot_fsolver_iterate (gsl_multiroot_fsolver * s);
+
+const char * gsl_multiroot_fsolver_name (const gsl_multiroot_fsolver * s);
+gsl_vector * gsl_multiroot_fsolver_root (const gsl_multiroot_fsolver * s);
+gsl_vector * gsl_multiroot_fsolver_dx (const gsl_multiroot_fsolver * s);
+gsl_vector * gsl_multiroot_fsolver_f (const gsl_multiroot_fsolver * s);
+
+/* Definition of vector-valued functions and gradient with parameters
+ based on gsl_vector */
+
+struct gsl_multiroot_function_fdf_struct
+{
+ int (* f) (const gsl_vector * x, void * params, gsl_vector * f);
+ int (* df) (const gsl_vector * x, void * params, gsl_matrix * df);
+ int (* fdf) (const gsl_vector * x, void * params, gsl_vector * f, gsl_matrix *df);
+ size_t n;
+ void * params;
+};
+
+typedef struct gsl_multiroot_function_fdf_struct gsl_multiroot_function_fdf ;
+
+#define GSL_MULTIROOT_FN_EVAL_F(F,x,y) ((*((F)->f))(x,(F)->params,(y)))
+#define GSL_MULTIROOT_FN_EVAL_DF(F,x,dy) ((*((F)->df))(x,(F)->params,(dy)))
+#define GSL_MULTIROOT_FN_EVAL_F_DF(F,x,y,dy) ((*((F)->fdf))(x,(F)->params,(y),(dy)))
+
+typedef struct
+ {
+ const char *name;
+ size_t size;
+ int (*alloc) (void *state, size_t n);
+ int (*set) (void *state, gsl_multiroot_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_matrix * J, gsl_vector * dx);
+ int (*iterate) (void *state, gsl_multiroot_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_matrix * J, gsl_vector * dx);
+ void (*free) (void *state);
+ }
+gsl_multiroot_fdfsolver_type;
+
+typedef struct
+ {
+ const gsl_multiroot_fdfsolver_type * type;
+ gsl_multiroot_function_fdf * fdf ;
+ gsl_vector * x;
+ gsl_vector * f;
+ gsl_matrix * J;
+ gsl_vector * dx;
+ void *state;
+ }
+gsl_multiroot_fdfsolver;
+
+gsl_multiroot_fdfsolver *
+gsl_multiroot_fdfsolver_alloc (const gsl_multiroot_fdfsolver_type * T,
+ size_t n);
+
+int
+gsl_multiroot_fdfsolver_set (gsl_multiroot_fdfsolver * s,
+ gsl_multiroot_function_fdf * fdf,
+ const gsl_vector * x);
+
+int
+gsl_multiroot_fdfsolver_iterate (gsl_multiroot_fdfsolver * s);
+
+void
+gsl_multiroot_fdfsolver_free (gsl_multiroot_fdfsolver * s);
+
+const char * gsl_multiroot_fdfsolver_name (const gsl_multiroot_fdfsolver * s);
+gsl_vector * gsl_multiroot_fdfsolver_root (const gsl_multiroot_fdfsolver * s);
+gsl_vector * gsl_multiroot_fdfsolver_dx (const gsl_multiroot_fdfsolver * s);
+gsl_vector * gsl_multiroot_fdfsolver_f (const gsl_multiroot_fdfsolver * s);
+
+int gsl_multiroot_test_delta (const gsl_vector * dx, const gsl_vector * x,
+ double epsabs, double epsrel);
+
+int gsl_multiroot_test_residual (const gsl_vector * f, double epsabs);
+
+GSL_VAR const gsl_multiroot_fsolver_type * gsl_multiroot_fsolver_dnewton;
+GSL_VAR const gsl_multiroot_fsolver_type * gsl_multiroot_fsolver_broyden;
+GSL_VAR const gsl_multiroot_fsolver_type * gsl_multiroot_fsolver_hybrid;
+GSL_VAR const gsl_multiroot_fsolver_type * gsl_multiroot_fsolver_hybrids;
+
+GSL_VAR const gsl_multiroot_fdfsolver_type * gsl_multiroot_fdfsolver_newton;
+GSL_VAR const gsl_multiroot_fdfsolver_type * gsl_multiroot_fdfsolver_gnewton;
+GSL_VAR const gsl_multiroot_fdfsolver_type * gsl_multiroot_fdfsolver_hybridj;
+GSL_VAR const gsl_multiroot_fdfsolver_type * gsl_multiroot_fdfsolver_hybridsj;
+
+
+__END_DECLS
+
+#endif /* __GSL_MULTIROOTS_H__ */
diff --git a/gsl-1.9/multiroots/hybrid.c b/gsl-1.9/multiroots/hybrid.c
new file mode 100644
index 0000000..ddb65e5
--- /dev/null
+++ b/gsl-1.9/multiroots/hybrid.c
@@ -0,0 +1,661 @@
+/* multiroots/hybrid.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <float.h>
+
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_multiroots.h>
+#include <gsl/gsl_linalg.h>
+
+#include "dogleg.c"
+
+typedef struct
+{
+ size_t iter;
+ size_t ncfail;
+ size_t ncsuc;
+ size_t nslow1;
+ size_t nslow2;
+ double fnorm;
+ double delta;
+ gsl_matrix *J;
+ gsl_matrix *q;
+ gsl_matrix *r;
+ gsl_vector *tau;
+ gsl_vector *diag;
+ gsl_vector *qtf;
+ gsl_vector *newton;
+ gsl_vector *gradient;
+ gsl_vector *x_trial;
+ gsl_vector *f_trial;
+ gsl_vector *df;
+ gsl_vector *qtdf;
+ gsl_vector *rdx;
+ gsl_vector *w;
+ gsl_vector *v;
+}
+hybrid_state_t;
+
+static int hybrid_alloc (void *vstate, size_t n);
+static int hybrid_set (void *vstate, gsl_multiroot_function * func,
+ gsl_vector * x, gsl_vector * f, gsl_vector * dx);
+static int hybrids_set (void *vstate, gsl_multiroot_function * func,
+ gsl_vector * x, gsl_vector * f, gsl_vector * dx);
+static int set (void *vstate, gsl_multiroot_function * func, gsl_vector * x,
+ gsl_vector * f, gsl_vector * dx, int scale);
+static int hybrid_iterate (void *vstate, gsl_multiroot_function * func,
+ gsl_vector * x, gsl_vector * f, gsl_vector * dx);
+static void hybrid_free (void *vstate);
+static int iterate (void *vstate, gsl_multiroot_function * func,
+ gsl_vector * x, gsl_vector * f, gsl_vector * dx,
+ int scale);
+
+static int
+hybrid_alloc (void *vstate, size_t n)
+{
+ hybrid_state_t *state = (hybrid_state_t *) vstate;
+ gsl_matrix *J, *q, *r;
+ gsl_vector *tau, *diag, *qtf, *newton, *gradient, *x_trial, *f_trial,
+ *df, *qtdf, *rdx, *w, *v;
+
+ J = gsl_matrix_calloc (n, n);
+
+ if (J == 0)
+ {
+ GSL_ERROR ("failed to allocate space for J", GSL_ENOMEM);
+ }
+
+ state->J = J;
+
+ q = gsl_matrix_calloc (n, n);
+
+ if (q == 0)
+ {
+ gsl_matrix_free (J);
+
+ GSL_ERROR ("failed to allocate space for q", GSL_ENOMEM);
+ }
+
+ state->q = q;
+
+ r = gsl_matrix_calloc (n, n);
+
+ if (r == 0)
+ {
+ gsl_matrix_free (J);
+ gsl_matrix_free (q);
+
+ GSL_ERROR ("failed to allocate space for r", GSL_ENOMEM);
+ }
+
+ state->r = r;
+
+ tau = gsl_vector_calloc (n);
+
+ if (tau == 0)
+ {
+ gsl_matrix_free (J);
+ gsl_matrix_free (q);
+ gsl_matrix_free (r);
+
+ GSL_ERROR ("failed to allocate space for tau", GSL_ENOMEM);
+ }
+
+ state->tau = tau;
+
+ diag = gsl_vector_calloc (n);
+
+ if (diag == 0)
+ {
+ gsl_matrix_free (J);
+ gsl_matrix_free (q);
+ gsl_matrix_free (r);
+ gsl_vector_free (tau);
+
+ GSL_ERROR ("failed to allocate space for diag", GSL_ENOMEM);
+ }
+
+ state->diag = diag;
+
+ qtf = gsl_vector_calloc (n);
+
+ if (qtf == 0)
+ {
+ gsl_matrix_free (J);
+ gsl_matrix_free (q);
+ gsl_matrix_free (r);
+ gsl_vector_free (tau);
+ gsl_vector_free (diag);
+
+ GSL_ERROR ("failed to allocate space for qtf", GSL_ENOMEM);
+ }
+
+ state->qtf = qtf;
+
+ newton = gsl_vector_calloc (n);
+
+ if (newton == 0)
+ {
+ gsl_matrix_free (J);
+ gsl_matrix_free (q);
+ gsl_matrix_free (r);
+ gsl_vector_free (tau);
+ gsl_vector_free (diag);
+ gsl_vector_free (qtf);
+
+ GSL_ERROR ("failed to allocate space for newton", GSL_ENOMEM);
+ }
+
+ state->newton = newton;
+
+ gradient = gsl_vector_calloc (n);
+
+ if (gradient == 0)
+ {
+ gsl_matrix_free (J);
+ gsl_matrix_free (q);
+ gsl_matrix_free (r);
+ gsl_vector_free (tau);
+ gsl_vector_free (diag);
+ gsl_vector_free (qtf);
+ gsl_vector_free (newton);
+
+ GSL_ERROR ("failed to allocate space for gradient", GSL_ENOMEM);
+ }
+
+ state->gradient = gradient;
+
+ x_trial = gsl_vector_calloc (n);
+
+ if (x_trial == 0)
+ {
+ gsl_matrix_free (J);
+ gsl_matrix_free (q);
+ gsl_matrix_free (r);
+ gsl_vector_free (tau);
+ gsl_vector_free (diag);
+ gsl_vector_free (qtf);
+ gsl_vector_free (newton);
+ gsl_vector_free (gradient);
+
+ GSL_ERROR ("failed to allocate space for x_trial", GSL_ENOMEM);
+ }
+
+ state->x_trial = x_trial;
+
+ f_trial = gsl_vector_calloc (n);
+
+ if (f_trial == 0)
+ {
+ gsl_matrix_free (J);
+ gsl_matrix_free (q);
+ gsl_matrix_free (r);
+ gsl_vector_free (tau);
+ gsl_vector_free (diag);
+ gsl_vector_free (qtf);
+ gsl_vector_free (newton);
+ gsl_vector_free (gradient);
+ gsl_vector_free (x_trial);
+
+ GSL_ERROR ("failed to allocate space for f_trial", GSL_ENOMEM);
+ }
+
+ state->f_trial = f_trial;
+
+ df = gsl_vector_calloc (n);
+
+ if (df == 0)
+ {
+ gsl_matrix_free (J);
+ gsl_matrix_free (q);
+ gsl_matrix_free (r);
+ gsl_vector_free (tau);
+ gsl_vector_free (diag);
+ gsl_vector_free (qtf);
+ gsl_vector_free (newton);
+ gsl_vector_free (gradient);
+ gsl_vector_free (x_trial);
+ gsl_vector_free (f_trial);
+
+ GSL_ERROR ("failed to allocate space for df", GSL_ENOMEM);
+ }
+
+ state->df = df;
+
+ qtdf = gsl_vector_calloc (n);
+
+ if (qtdf == 0)
+ {
+ gsl_matrix_free (J);
+ gsl_matrix_free (q);
+ gsl_matrix_free (r);
+ gsl_vector_free (tau);
+ gsl_vector_free (diag);
+ gsl_vector_free (qtf);
+ gsl_vector_free (newton);
+ gsl_vector_free (gradient);
+ gsl_vector_free (x_trial);
+ gsl_vector_free (f_trial);
+ gsl_vector_free (df);
+
+ GSL_ERROR ("failed to allocate space for qtdf", GSL_ENOMEM);
+ }
+
+ state->qtdf = qtdf;
+
+
+ rdx = gsl_vector_calloc (n);
+
+ if (rdx == 0)
+ {
+ gsl_matrix_free (J);
+ gsl_matrix_free (q);
+ gsl_matrix_free (r);
+ gsl_vector_free (tau);
+ gsl_vector_free (diag);
+ gsl_vector_free (qtf);
+ gsl_vector_free (newton);
+ gsl_vector_free (gradient);
+ gsl_vector_free (x_trial);
+ gsl_vector_free (f_trial);
+ gsl_vector_free (df);
+ gsl_vector_free (qtdf);
+
+ GSL_ERROR ("failed to allocate space for rdx", GSL_ENOMEM);
+ }
+
+ state->rdx = rdx;
+
+ w = gsl_vector_calloc (n);
+
+ if (w == 0)
+ {
+ gsl_matrix_free (J);
+ gsl_matrix_free (q);
+ gsl_matrix_free (r);
+ gsl_vector_free (tau);
+ gsl_vector_free (diag);
+ gsl_vector_free (qtf);
+ gsl_vector_free (newton);
+ gsl_vector_free (gradient);
+ gsl_vector_free (x_trial);
+ gsl_vector_free (f_trial);
+ gsl_vector_free (df);
+ gsl_vector_free (qtdf);
+ gsl_vector_free (rdx);
+
+ GSL_ERROR ("failed to allocate space for w", GSL_ENOMEM);
+ }
+
+ state->w = w;
+
+ v = gsl_vector_calloc (n);
+
+ if (v == 0)
+ {
+ gsl_matrix_free (J);
+ gsl_matrix_free (q);
+ gsl_matrix_free (r);
+ gsl_vector_free (tau);
+ gsl_vector_free (diag);
+ gsl_vector_free (qtf);
+ gsl_vector_free (newton);
+ gsl_vector_free (gradient);
+ gsl_vector_free (x_trial);
+ gsl_vector_free (f_trial);
+ gsl_vector_free (df);
+ gsl_vector_free (qtdf);
+ gsl_vector_free (rdx);
+ gsl_vector_free (w);
+
+ GSL_ERROR ("failed to allocate space for v", GSL_ENOMEM);
+ }
+
+ state->v = v;
+
+ return GSL_SUCCESS;
+}
+
+static int
+hybrid_set (void *vstate, gsl_multiroot_function * func, gsl_vector * x,
+ gsl_vector * f, gsl_vector * dx)
+{
+ int status = set (vstate, func, x, f, dx, 0);
+ return status;
+}
+
+static int
+hybrids_set (void *vstate, gsl_multiroot_function * func, gsl_vector * x,
+ gsl_vector * f, gsl_vector * dx)
+{
+ int status = set (vstate, func, x, f, dx, 1);
+ return status;
+}
+
+static int
+set (void *vstate, gsl_multiroot_function * func, gsl_vector * x,
+ gsl_vector * f, gsl_vector * dx, int scale)
+{
+ hybrid_state_t *state = (hybrid_state_t *) vstate;
+
+ gsl_matrix *J = state->J;
+ gsl_matrix *q = state->q;
+ gsl_matrix *r = state->r;
+ gsl_vector *tau = state->tau;
+ gsl_vector *diag = state->diag;
+
+ int status;
+
+ status = GSL_MULTIROOT_FN_EVAL (func, x, f);
+
+ if (status)
+ {
+ return status;
+ }
+
+ status = gsl_multiroot_fdjacobian (func, x, f, GSL_SQRT_DBL_EPSILON, J);
+
+ if (status)
+ {
+ return status;
+ }
+
+ state->iter = 1;
+ state->fnorm = enorm (f);
+ state->ncfail = 0;
+ state->ncsuc = 0;
+ state->nslow1 = 0;
+ state->nslow2 = 0;
+
+ gsl_vector_set_all (dx, 0.0);
+
+ /* Store column norms in diag */
+
+ if (scale)
+ compute_diag (J, diag);
+ else
+ gsl_vector_set_all (diag, 1.0);
+
+ /* Set delta to factor |D x| or to factor if |D x| is zero */
+
+ state->delta = compute_delta (diag, x);
+
+ /* Factorize J into QR decomposition */
+
+ status = gsl_linalg_QR_decomp (J, tau);
+
+ if (status)
+ {
+ return status;
+ }
+
+ status = gsl_linalg_QR_unpack (J, tau, q, r);
+
+ return status;
+}
+
+static int
+hybrid_iterate (void *vstate, gsl_multiroot_function * func, gsl_vector * x,
+ gsl_vector * f, gsl_vector * dx)
+{
+ int status = iterate (vstate, func, x, f, dx, 0);
+ return status;
+}
+
+static int
+hybrids_iterate (void *vstate, gsl_multiroot_function * func, gsl_vector * x,
+ gsl_vector * f, gsl_vector * dx)
+{
+ int status = iterate (vstate, func, x, f, dx, 1);
+ return status;
+}
+
+static int
+iterate (void *vstate, gsl_multiroot_function * func, gsl_vector * x,
+ gsl_vector * f, gsl_vector * dx, int scale)
+{
+ hybrid_state_t *state = (hybrid_state_t *) vstate;
+
+ const double fnorm = state->fnorm;
+
+ gsl_matrix *J = state->J;
+ gsl_matrix *q = state->q;
+ gsl_matrix *r = state->r;
+ gsl_vector *tau = state->tau;
+ gsl_vector *diag = state->diag;
+ gsl_vector *qtf = state->qtf;
+ gsl_vector *x_trial = state->x_trial;
+ gsl_vector *f_trial = state->f_trial;
+ gsl_vector *df = state->df;
+ gsl_vector *qtdf = state->qtdf;
+ gsl_vector *rdx = state->rdx;
+ gsl_vector *w = state->w;
+ gsl_vector *v = state->v;
+
+ double prered, actred;
+ double pnorm, fnorm1, fnorm1p;
+ double ratio;
+ double p1 = 0.1, p5 = 0.5, p001 = 0.001, p0001 = 0.0001;
+
+ /* Compute qtf = Q^T f */
+
+ compute_qtf (q, f, qtf);
+
+ /* Compute dogleg step */
+
+ dogleg (r, qtf, diag, state->delta, state->newton, state->gradient, dx);
+
+ /* Take a trial step */
+
+ compute_trial_step (x, dx, state->x_trial);
+
+ pnorm = scaled_enorm (diag, dx);
+
+ if (state->iter == 1)
+ {
+ if (pnorm < state->delta)
+ {
+ state->delta = pnorm;
+ }
+ }
+
+ /* Evaluate function at x + p */
+
+ {
+ int status = GSL_MULTIROOT_FN_EVAL (func, x_trial, f_trial);
+
+ if (status != GSL_SUCCESS)
+ {
+ return GSL_EBADFUNC;
+ }
+ }
+
+ /* Set df = f_trial - f */
+
+ compute_df (f_trial, f, df);
+
+ /* Compute the scaled actual reduction */
+
+ fnorm1 = enorm (f_trial);
+
+ actred = compute_actual_reduction (fnorm, fnorm1);
+
+ /* Compute rdx = R dx */
+
+ compute_rdx (r, dx, rdx);
+
+ /* Compute the scaled predicted reduction phi1p = |Q^T f + R dx| */
+
+ fnorm1p = enorm_sum (qtf, rdx);
+
+ prered = compute_predicted_reduction (fnorm, fnorm1p);
+
+ /* Compute the ratio of the actual to predicted reduction */
+
+ if (prered > 0)
+ {
+ ratio = actred / prered;
+ }
+ else
+ {
+ ratio = 0;
+ }
+
+ /* Update the step bound */
+
+ if (ratio < p1)
+ {
+ state->ncsuc = 0;
+ state->ncfail++;
+ state->delta *= p5;
+ }
+ else
+ {
+ state->ncfail = 0;
+ state->ncsuc++;
+
+ if (ratio >= p5 || state->ncsuc > 1)
+ state->delta = GSL_MAX (state->delta, pnorm / p5);
+ if (fabs (ratio - 1) <= p1)
+ state->delta = pnorm / p5;
+ }
+
+ /* Test for successful iteration */
+
+ if (ratio >= p0001)
+ {
+ gsl_vector_memcpy (x, x_trial);
+ gsl_vector_memcpy (f, f_trial);
+ state->fnorm = fnorm1;
+ state->iter++;
+ }
+
+ /* Determine the progress of the iteration */
+
+ state->nslow1++;
+ if (actred >= p001)
+ state->nslow1 = 0;
+
+ if (actred >= p1)
+ state->nslow2 = 0;
+
+ if (state->ncfail == 2)
+ {
+ gsl_multiroot_fdjacobian (func, x, f, GSL_SQRT_DBL_EPSILON, J);
+
+ state->nslow2++;
+
+ if (state->iter == 1)
+ {
+ if (scale)
+ compute_diag (J, diag);
+ state->delta = compute_delta (diag, x);
+ }
+ else
+ {
+ if (scale)
+ update_diag (J, diag);
+ }
+
+ /* Factorize J into QR decomposition */
+
+ gsl_linalg_QR_decomp (J, tau);
+ gsl_linalg_QR_unpack (J, tau, q, r);
+
+ return GSL_SUCCESS;
+ }
+
+ /* Compute qtdf = Q^T df, w = (Q^T df - R dx)/|dx|, v = D^2 dx/|dx| */
+
+ compute_qtf (q, df, qtdf);
+
+ compute_wv (qtdf, rdx, dx, diag, pnorm, w, v);
+
+ /* Rank-1 update of the jacobian Q'R' = Q(R + w v^T) */
+
+ gsl_linalg_QR_update (q, r, w, v);
+
+ /* No progress as measured by jacobian evaluations */
+
+ if (state->nslow2 == 5)
+ {
+ return GSL_ENOPROGJ;
+ }
+
+ /* No progress as measured by function evaluations */
+
+ if (state->nslow1 == 10)
+ {
+ return GSL_ENOPROG;
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+static void
+hybrid_free (void *vstate)
+{
+ hybrid_state_t *state = (hybrid_state_t *) vstate;
+
+ gsl_vector_free (state->v);
+ gsl_vector_free (state->w);
+ gsl_vector_free (state->rdx);
+ gsl_vector_free (state->qtdf);
+ gsl_vector_free (state->df);
+ gsl_vector_free (state->f_trial);
+ gsl_vector_free (state->x_trial);
+ gsl_vector_free (state->gradient);
+ gsl_vector_free (state->newton);
+ gsl_vector_free (state->qtf);
+ gsl_vector_free (state->diag);
+ gsl_vector_free (state->tau);
+ gsl_matrix_free (state->r);
+ gsl_matrix_free (state->q);
+ gsl_matrix_free (state->J);
+}
+
+static const gsl_multiroot_fsolver_type hybrid_type = {
+ "hybrid", /* name */
+ sizeof (hybrid_state_t),
+ &hybrid_alloc,
+ &hybrid_set,
+ &hybrid_iterate,
+ &hybrid_free
+};
+
+static const gsl_multiroot_fsolver_type hybrids_type = {
+ "hybrids", /* name */
+ sizeof (hybrid_state_t),
+ &hybrid_alloc,
+ &hybrids_set,
+ &hybrids_iterate,
+ &hybrid_free
+};
+
+const gsl_multiroot_fsolver_type *gsl_multiroot_fsolver_hybrid = &hybrid_type;
+const gsl_multiroot_fsolver_type *gsl_multiroot_fsolver_hybrids =
+ &hybrids_type;
diff --git a/gsl-1.9/multiroots/hybridj.c b/gsl-1.9/multiroots/hybridj.c
new file mode 100644
index 0000000..a44a164
--- /dev/null
+++ b/gsl-1.9/multiroots/hybridj.c
@@ -0,0 +1,608 @@
+/* multiroots/hybridj.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <float.h>
+
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_multiroots.h>
+#include <gsl/gsl_linalg.h>
+
+#include "dogleg.c"
+
+typedef struct
+ {
+ size_t iter;
+ size_t ncfail;
+ size_t ncsuc;
+ size_t nslow1;
+ size_t nslow2;
+ double fnorm;
+ double delta;
+ gsl_matrix *q;
+ gsl_matrix *r;
+ gsl_vector *tau;
+ gsl_vector *diag;
+ gsl_vector *qtf;
+ gsl_vector *newton;
+ gsl_vector *gradient;
+ gsl_vector *x_trial;
+ gsl_vector *f_trial;
+ gsl_vector *df;
+ gsl_vector *qtdf;
+ gsl_vector *rdx;
+ gsl_vector *w;
+ gsl_vector *v;
+ }
+hybridj_state_t;
+
+static int hybridj_alloc (void *vstate, size_t n);
+static int hybridj_set (void *vstate, gsl_multiroot_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_matrix * J, gsl_vector * dx);
+static int hybridsj_set (void *vstate, gsl_multiroot_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_matrix * J, gsl_vector * dx);
+static int set (void *vstate, gsl_multiroot_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_matrix * J, gsl_vector * dx, int scale);
+static int hybridj_iterate (void *vstate, gsl_multiroot_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_matrix * J, gsl_vector * dx);
+static void hybridj_free (void *vstate);
+static int iterate (void *vstate, gsl_multiroot_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_matrix * J, gsl_vector * dx, int scale);
+
+static int
+hybridj_alloc (void *vstate, size_t n)
+{
+ hybridj_state_t *state = (hybridj_state_t *) vstate;
+ gsl_matrix *q, *r;
+ gsl_vector *tau, *diag, *qtf, *newton, *gradient, *x_trial, *f_trial,
+ *df, *qtdf, *rdx, *w, *v;
+
+ q = gsl_matrix_calloc (n, n);
+
+ if (q == 0)
+ {
+ GSL_ERROR ("failed to allocate space for q", GSL_ENOMEM);
+ }
+
+ state->q = q;
+
+ r = gsl_matrix_calloc (n, n);
+
+ if (r == 0)
+ {
+ gsl_matrix_free (q);
+
+ GSL_ERROR ("failed to allocate space for r", GSL_ENOMEM);
+ }
+
+ state->r = r;
+
+ tau = gsl_vector_calloc (n);
+
+ if (tau == 0)
+ {
+ gsl_matrix_free (q);
+ gsl_matrix_free (r);
+
+ GSL_ERROR ("failed to allocate space for tau", GSL_ENOMEM);
+ }
+
+ state->tau = tau;
+
+ diag = gsl_vector_calloc (n);
+
+ if (diag == 0)
+ {
+ gsl_matrix_free (q);
+ gsl_matrix_free (r);
+ gsl_vector_free (tau);
+
+ GSL_ERROR ("failed to allocate space for diag", GSL_ENOMEM);
+ }
+
+ state->diag = diag;
+
+ qtf = gsl_vector_calloc (n);
+
+ if (qtf == 0)
+ {
+ gsl_matrix_free (q);
+ gsl_matrix_free (r);
+ gsl_vector_free (tau);
+ gsl_vector_free (diag);
+
+ GSL_ERROR ("failed to allocate space for qtf", GSL_ENOMEM);
+ }
+
+ state->qtf = qtf;
+
+ newton = gsl_vector_calloc (n);
+
+ if (newton == 0)
+ {
+ gsl_matrix_free (q);
+ gsl_matrix_free (r);
+ gsl_vector_free (tau);
+ gsl_vector_free (diag);
+ gsl_vector_free (qtf);
+
+ GSL_ERROR ("failed to allocate space for newton", GSL_ENOMEM);
+ }
+
+ state->newton = newton;
+
+ gradient = gsl_vector_calloc (n);
+
+ if (gradient == 0)
+ {
+ gsl_matrix_free (q);
+ gsl_matrix_free (r);
+ gsl_vector_free (tau);
+ gsl_vector_free (diag);
+ gsl_vector_free (qtf);
+ gsl_vector_free (newton);
+
+ GSL_ERROR ("failed to allocate space for gradient", GSL_ENOMEM);
+ }
+
+ state->gradient = gradient;
+
+ x_trial = gsl_vector_calloc (n);
+
+ if (x_trial == 0)
+ {
+ gsl_matrix_free (q);
+ gsl_matrix_free (r);
+ gsl_vector_free (tau);
+ gsl_vector_free (diag);
+ gsl_vector_free (qtf);
+ gsl_vector_free (newton);
+ gsl_vector_free (gradient);
+
+ GSL_ERROR ("failed to allocate space for x_trial", GSL_ENOMEM);
+ }
+
+ state->x_trial = x_trial;
+
+ f_trial = gsl_vector_calloc (n);
+
+ if (f_trial == 0)
+ {
+ gsl_matrix_free (q);
+ gsl_matrix_free (r);
+ gsl_vector_free (tau);
+ gsl_vector_free (diag);
+ gsl_vector_free (qtf);
+ gsl_vector_free (newton);
+ gsl_vector_free (gradient);
+ gsl_vector_free (x_trial);
+
+ GSL_ERROR ("failed to allocate space for f_trial", GSL_ENOMEM);
+ }
+
+ state->f_trial = f_trial;
+
+ df = gsl_vector_calloc (n);
+
+ if (df == 0)
+ {
+ gsl_matrix_free (q);
+ gsl_matrix_free (r);
+ gsl_vector_free (tau);
+ gsl_vector_free (diag);
+ gsl_vector_free (qtf);
+ gsl_vector_free (newton);
+ gsl_vector_free (gradient);
+ gsl_vector_free (x_trial);
+ gsl_vector_free (f_trial);
+
+ GSL_ERROR ("failed to allocate space for df", GSL_ENOMEM);
+ }
+
+ state->df = df;
+
+ qtdf = gsl_vector_calloc (n);
+
+ if (qtdf == 0)
+ {
+ gsl_matrix_free (q);
+ gsl_matrix_free (r);
+ gsl_vector_free (tau);
+ gsl_vector_free (diag);
+ gsl_vector_free (qtf);
+ gsl_vector_free (newton);
+ gsl_vector_free (gradient);
+ gsl_vector_free (x_trial);
+ gsl_vector_free (f_trial);
+ gsl_vector_free (df);
+
+ GSL_ERROR ("failed to allocate space for qtdf", GSL_ENOMEM);
+ }
+
+ state->qtdf = qtdf;
+
+
+ rdx = gsl_vector_calloc (n);
+
+ if (rdx == 0)
+ {
+ gsl_matrix_free (q);
+ gsl_matrix_free (r);
+ gsl_vector_free (tau);
+ gsl_vector_free (diag);
+ gsl_vector_free (qtf);
+ gsl_vector_free (newton);
+ gsl_vector_free (gradient);
+ gsl_vector_free (x_trial);
+ gsl_vector_free (f_trial);
+ gsl_vector_free (df);
+ gsl_vector_free (qtdf);
+
+ GSL_ERROR ("failed to allocate space for rdx", GSL_ENOMEM);
+ }
+
+ state->rdx = rdx;
+
+ w = gsl_vector_calloc (n);
+
+ if (w == 0)
+ {
+ gsl_matrix_free (q);
+ gsl_matrix_free (r);
+ gsl_vector_free (tau);
+ gsl_vector_free (diag);
+ gsl_vector_free (qtf);
+ gsl_vector_free (newton);
+ gsl_vector_free (gradient);
+ gsl_vector_free (x_trial);
+ gsl_vector_free (f_trial);
+ gsl_vector_free (df);
+ gsl_vector_free (qtdf);
+ gsl_vector_free (rdx);
+
+ GSL_ERROR ("failed to allocate space for w", GSL_ENOMEM);
+ }
+
+ state->w = w;
+
+ v = gsl_vector_calloc (n);
+
+ if (v == 0)
+ {
+ gsl_matrix_free (q);
+ gsl_matrix_free (r);
+ gsl_vector_free (tau);
+ gsl_vector_free (diag);
+ gsl_vector_free (qtf);
+ gsl_vector_free (newton);
+ gsl_vector_free (gradient);
+ gsl_vector_free (x_trial);
+ gsl_vector_free (f_trial);
+ gsl_vector_free (df);
+ gsl_vector_free (qtdf);
+ gsl_vector_free (rdx);
+ gsl_vector_free (w);
+
+ GSL_ERROR ("failed to allocate space for v", GSL_ENOMEM);
+ }
+
+ state->v = v;
+
+ return GSL_SUCCESS;
+}
+
+static int
+hybridj_set (void *vstate, gsl_multiroot_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_matrix * J, gsl_vector * dx)
+{
+ int status = set (vstate, fdf, x, f, J, dx, 0);
+ return status ;
+}
+
+static int
+hybridsj_set (void *vstate, gsl_multiroot_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_matrix * J, gsl_vector * dx)
+{
+ int status = set (vstate, fdf, x, f, J, dx, 1);
+ return status ;
+}
+
+static int
+set (void *vstate, gsl_multiroot_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_matrix * J, gsl_vector * dx, int scale)
+{
+ hybridj_state_t *state = (hybridj_state_t *) vstate;
+
+ gsl_matrix *q = state->q;
+ gsl_matrix *r = state->r;
+ gsl_vector *tau = state->tau;
+ gsl_vector *diag = state->diag;
+
+ GSL_MULTIROOT_FN_EVAL_F_DF (fdf, x, f, J);
+
+ state->iter = 1;
+ state->fnorm = enorm (f);
+ state->ncfail = 0;
+ state->ncsuc = 0;
+ state->nslow1 = 0;
+ state->nslow2 = 0;
+
+ gsl_vector_set_all (dx, 0.0);
+
+ /* Store column norms in diag */
+
+ if (scale)
+ compute_diag (J, diag);
+ else
+ gsl_vector_set_all (diag, 1.0);
+
+ /* Set delta to factor |D x| or to factor if |D x| is zero */
+
+ state->delta = compute_delta (diag, x);
+
+ /* Factorize J into QR decomposition */
+
+ gsl_linalg_QR_decomp (J, tau);
+ gsl_linalg_QR_unpack (J, tau, q, r);
+
+ return GSL_SUCCESS;
+}
+
+static int
+hybridj_iterate (void *vstate, gsl_multiroot_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_matrix * J, gsl_vector * dx)
+{
+ int status = iterate (vstate, fdf, x, f, J, dx, 0);
+ return status;
+}
+
+static int
+hybridsj_iterate (void *vstate, gsl_multiroot_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_matrix * J, gsl_vector * dx)
+{
+ int status = iterate (vstate, fdf, x, f, J, dx, 1);
+ return status;
+}
+
+static int
+iterate (void *vstate, gsl_multiroot_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_matrix * J, gsl_vector * dx, int scale)
+{
+ hybridj_state_t *state = (hybridj_state_t *) vstate;
+
+ const double fnorm = state->fnorm;
+
+ gsl_matrix *q = state->q;
+ gsl_matrix *r = state->r;
+ gsl_vector *tau = state->tau;
+ gsl_vector *diag = state->diag;
+ gsl_vector *qtf = state->qtf;
+ gsl_vector *x_trial = state->x_trial;
+ gsl_vector *f_trial = state->f_trial;
+ gsl_vector *df = state->df;
+ gsl_vector *qtdf = state->qtdf;
+ gsl_vector *rdx = state->rdx;
+ gsl_vector *w = state->w;
+ gsl_vector *v = state->v;
+
+ double prered, actred;
+ double pnorm, fnorm1, fnorm1p;
+ double ratio;
+ double p1 = 0.1, p5 = 0.5, p001 = 0.001, p0001 = 0.0001;
+
+ /* Compute qtf = Q^T f */
+
+ compute_qtf (q, f, qtf);
+
+ /* Compute dogleg step */
+
+ dogleg (r, qtf, diag, state->delta, state->newton, state->gradient, dx);
+
+ /* Take a trial step */
+
+ compute_trial_step (x, dx, state->x_trial);
+
+ pnorm = scaled_enorm (diag, dx);
+
+ if (state->iter == 1)
+ {
+ if (pnorm < state->delta)
+ {
+ state->delta = pnorm;
+ }
+ }
+
+ /* Evaluate function at x + p */
+
+ {
+ int status = GSL_MULTIROOT_FN_EVAL_F (fdf, x_trial, f_trial);
+
+ if (status != GSL_SUCCESS)
+ {
+ return GSL_EBADFUNC;
+ }
+ }
+
+ /* Set df = f_trial - f */
+
+ compute_df (f_trial, f, df);
+
+ /* Compute the scaled actual reduction */
+
+ fnorm1 = enorm (f_trial);
+
+ actred = compute_actual_reduction (fnorm, fnorm1);
+
+ /* Compute rdx = R dx */
+
+ compute_rdx (r, dx, rdx);
+
+ /* Compute the scaled predicted reduction phi1p = |Q^T f + R dx| */
+
+ fnorm1p = enorm_sum (qtf, rdx);
+
+ prered = compute_predicted_reduction (fnorm, fnorm1p);
+
+ /* Compute the ratio of the actual to predicted reduction */
+
+ if (prered > 0)
+ {
+ ratio = actred / prered;
+ }
+ else
+ {
+ ratio = 0;
+ }
+
+ /* Update the step bound */
+
+ if (ratio < p1)
+ {
+ state->ncsuc = 0;
+ state->ncfail++;
+ state->delta *= p5;
+ }
+ else
+ {
+ state->ncfail = 0;
+ state->ncsuc++;
+
+ if (ratio >= p5 || state->ncsuc > 1)
+ state->delta = GSL_MAX (state->delta, pnorm / p5);
+ if (fabs (ratio - 1) <= p1)
+ state->delta = pnorm / p5;
+ }
+
+ /* Test for successful iteration */
+
+ if (ratio >= p0001)
+ {
+ gsl_vector_memcpy (x, x_trial);
+ gsl_vector_memcpy (f, f_trial);
+ state->fnorm = fnorm1;
+ state->iter++;
+ }
+
+ /* Determine the progress of the iteration */
+
+ state->nslow1++;
+ if (actred >= p001)
+ state->nslow1 = 0;
+
+ if (actred >= p1)
+ state->nslow2 = 0;
+
+ if (state->ncfail == 2)
+ {
+ {
+ int status = GSL_MULTIROOT_FN_EVAL_DF (fdf, x, J);
+
+ if (status != GSL_SUCCESS)
+ {
+ return GSL_EBADFUNC;
+ }
+ }
+
+ state->nslow2++;
+
+ if (state->iter == 1)
+ {
+ if (scale)
+ compute_diag (J, diag);
+ state->delta = compute_delta (diag, x);
+ }
+ else
+ {
+ if (scale)
+ update_diag (J, diag);
+ }
+
+ /* Factorize J into QR decomposition */
+
+ gsl_linalg_QR_decomp (J, tau);
+ gsl_linalg_QR_unpack (J, tau, q, r);
+ return GSL_SUCCESS;
+ }
+
+ /* Compute qtdf = Q^T df, w = (Q^T df - R dx)/|dx|, v = D^2 dx/|dx| */
+
+ compute_qtf (q, df, qtdf);
+
+ compute_wv (qtdf, rdx, dx, diag, pnorm, w, v);
+
+ /* Rank-1 update of the jacobian Q'R' = Q(R + w v^T) */
+
+ gsl_linalg_QR_update (q, r, w, v);
+
+ /* No progress as measured by jacobian evaluations */
+
+ if (state->nslow2 == 5)
+ {
+ return GSL_ENOPROGJ;
+ }
+
+ /* No progress as measured by function evaluations */
+
+ if (state->nslow1 == 10)
+ {
+ return GSL_ENOPROG;
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+static void
+hybridj_free (void *vstate)
+{
+ hybridj_state_t *state = (hybridj_state_t *) vstate;
+
+ gsl_vector_free (state->v);
+ gsl_vector_free (state->w);
+ gsl_vector_free (state->rdx);
+ gsl_vector_free (state->qtdf);
+ gsl_vector_free (state->df);
+ gsl_vector_free (state->f_trial);
+ gsl_vector_free (state->x_trial);
+ gsl_vector_free (state->gradient);
+ gsl_vector_free (state->newton);
+ gsl_vector_free (state->qtf);
+ gsl_vector_free (state->diag);
+ gsl_vector_free (state->tau);
+ gsl_matrix_free (state->r);
+ gsl_matrix_free (state->q);
+}
+
+static const gsl_multiroot_fdfsolver_type hybridj_type =
+{
+ "hybridj", /* name */
+ sizeof (hybridj_state_t),
+ &hybridj_alloc,
+ &hybridj_set,
+ &hybridj_iterate,
+ &hybridj_free
+};
+
+static const gsl_multiroot_fdfsolver_type hybridsj_type =
+{
+ "hybridsj", /* name */
+ sizeof (hybridj_state_t),
+ &hybridj_alloc,
+ &hybridsj_set,
+ &hybridsj_iterate,
+ &hybridj_free
+};
+
+const gsl_multiroot_fdfsolver_type *gsl_multiroot_fdfsolver_hybridj = &hybridj_type;
+const gsl_multiroot_fdfsolver_type *gsl_multiroot_fdfsolver_hybridsj = &hybridsj_type;
diff --git a/gsl-1.9/multiroots/newton.c b/gsl-1.9/multiroots/newton.c
new file mode 100644
index 0000000..88509d0
--- /dev/null
+++ b/gsl-1.9/multiroots/newton.c
@@ -0,0 +1,151 @@
+/* multiroots/newton.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <float.h>
+
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_multiroots.h>
+#include <gsl/gsl_linalg.h>
+
+typedef struct
+ {
+ gsl_matrix * lu;
+ gsl_permutation * permutation;
+ }
+newton_state_t;
+
+static int newton_alloc (void * vstate, size_t n);
+static int newton_set (void * vstate, gsl_multiroot_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_matrix * J, gsl_vector * dx);
+static int newton_iterate (void * vstate, gsl_multiroot_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_matrix * J, gsl_vector * dx);
+static void newton_free (void * vstate);
+
+static int
+newton_alloc (void * vstate, size_t n)
+{
+ newton_state_t * state = (newton_state_t *) vstate;
+ gsl_permutation * p;
+ gsl_matrix * m;
+
+ m = gsl_matrix_calloc (n,n);
+
+ if (m == 0)
+ {
+ GSL_ERROR ("failed to allocate space for lu", GSL_ENOMEM);
+ }
+
+ state->lu = m ;
+
+ p = gsl_permutation_calloc (n);
+
+ if (p == 0)
+ {
+ gsl_matrix_free(m);
+
+ GSL_ERROR ("failed to allocate space for permutation", GSL_ENOMEM);
+ }
+
+ state->permutation = p ;
+
+ return GSL_SUCCESS;
+}
+
+static int
+newton_set (void * vstate, gsl_multiroot_function_fdf * FDF, gsl_vector * x, gsl_vector * f, gsl_matrix * J, gsl_vector * dx)
+{
+ newton_state_t * state = (newton_state_t *) vstate;
+
+ size_t i, n = FDF->n ;
+
+ state = 0 ; /* avoid warnings about unused parameters */
+
+ GSL_MULTIROOT_FN_EVAL_F_DF (FDF, x, f, J);
+
+ for (i = 0; i < n; i++)
+ {
+ gsl_vector_set (dx, i, 0.0);
+ }
+
+ return GSL_SUCCESS;
+}
+
+static int
+newton_iterate (void * vstate, gsl_multiroot_function_fdf * fdf, gsl_vector * x, gsl_vector * f, gsl_matrix * J, gsl_vector * dx)
+{
+ newton_state_t * state = (newton_state_t *) vstate;
+
+ int signum;
+
+ size_t i;
+
+ size_t n = fdf->n ;
+
+ gsl_matrix_memcpy (state->lu, J);
+
+ gsl_linalg_LU_decomp (state->lu, state->permutation, &signum);
+
+ gsl_linalg_LU_solve (state->lu, state->permutation, f, dx);
+
+ for (i = 0; i < n; i++)
+ {
+ double e = gsl_vector_get (dx, i);
+ double y = gsl_vector_get (x, i);
+ gsl_vector_set (dx, i, -e);
+ gsl_vector_set (x, i, y - e);
+ }
+
+ {
+ int status = GSL_MULTIROOT_FN_EVAL_F_DF (fdf, x, f, J);
+
+ if (status != GSL_SUCCESS)
+ {
+ return GSL_EBADFUNC;
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+static void
+newton_free (void * vstate)
+{
+ newton_state_t * state = (newton_state_t *) vstate;
+
+ gsl_matrix_free(state->lu);
+
+ gsl_permutation_free(state->permutation);
+}
+
+
+static const gsl_multiroot_fdfsolver_type newton_type =
+{"newton", /* name */
+ sizeof (newton_state_t),
+ &newton_alloc,
+ &newton_set,
+ &newton_iterate,
+ &newton_free};
+
+const gsl_multiroot_fdfsolver_type * gsl_multiroot_fdfsolver_newton = &newton_type;
diff --git a/gsl-1.9/multiroots/test.c b/gsl-1.9/multiroots/test.c
new file mode 100644
index 0000000..029f2b7
--- /dev/null
+++ b/gsl-1.9/multiroots/test.c
@@ -0,0 +1,260 @@
+/* multiroots/test.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_multiroots.h>
+
+#include <gsl/gsl_ieee_utils.h>
+
+#include "test_funcs.h"
+int test_fdf (const char * desc, gsl_multiroot_function_fdf * function, initpt_function initpt, double factor, const gsl_multiroot_fdfsolver_type * T);
+int test_f (const char * desc, gsl_multiroot_function_fdf * fdf, initpt_function initpt, double factor, const gsl_multiroot_fsolver_type * T);
+
+
+int
+main (void)
+{
+ const gsl_multiroot_fsolver_type * fsolvers[5] ;
+ const gsl_multiroot_fsolver_type ** T1 ;
+
+ const gsl_multiroot_fdfsolver_type * fdfsolvers[5] ;
+ const gsl_multiroot_fdfsolver_type ** T2 ;
+
+ double f;
+
+ fsolvers[0] = gsl_multiroot_fsolver_dnewton;
+ fsolvers[1] = gsl_multiroot_fsolver_broyden;
+ fsolvers[2] = gsl_multiroot_fsolver_hybrid;
+ fsolvers[3] = gsl_multiroot_fsolver_hybrids;
+ fsolvers[4] = 0;
+
+ fdfsolvers[0] = gsl_multiroot_fdfsolver_newton;
+ fdfsolvers[1] = gsl_multiroot_fdfsolver_gnewton;
+ fdfsolvers[2] = gsl_multiroot_fdfsolver_hybridj;
+ fdfsolvers[3] = gsl_multiroot_fdfsolver_hybridsj;
+ fdfsolvers[4] = 0;
+
+ gsl_ieee_env_setup();
+
+
+ f = 1.0 ;
+
+ T1 = fsolvers ;
+
+ while (*T1 != 0)
+ {
+ test_f ("Rosenbrock", &rosenbrock, rosenbrock_initpt, f, *T1);
+ test_f ("Roth", &roth, roth_initpt, f, *T1);
+ test_f ("Powell badly scaled", &powellscal, powellscal_initpt, f, *T1);
+ test_f ("Brown badly scaled", &brownscal, brownscal_initpt, f, *T1);
+ test_f ("Powell singular", &powellsing, powellsing_initpt, f, *T1);
+ test_f ("Wood", &wood, wood_initpt, f, *T1);
+ test_f ("Helical", &helical, helical_initpt, f, *T1);
+ test_f ("Discrete BVP", &dbv, dbv_initpt, f, *T1);
+ test_f ("Trig", &trig, trig_initpt, f, *T1);
+ T1++;
+ }
+
+ T2 = fdfsolvers ;
+
+ while (*T2 != 0)
+ {
+ test_fdf ("Rosenbrock", &rosenbrock, rosenbrock_initpt, f, *T2);
+ test_fdf ("Roth", &roth, roth_initpt, f, *T2);
+ test_fdf ("Powell badly scaled", &powellscal, powellscal_initpt, f, *T2);
+ test_fdf ("Brown badly scaled", &brownscal, brownscal_initpt, f, *T2);
+ test_fdf ("Powell singular", &powellsing, powellsing_initpt, f, *T2);
+ test_fdf ("Wood", &wood, wood_initpt, f, *T2);
+ test_fdf ("Helical", &helical, helical_initpt, f, *T2);
+ test_fdf ("Discrete BVP", &dbv, dbv_initpt, f, *T2);
+ test_fdf ("Trig", &trig, trig_initpt, f, *T2);
+ T2++;
+ }
+
+ exit (gsl_test_summary ());
+}
+
+void scale (gsl_vector * x, double factor);
+
+void
+scale (gsl_vector * x, double factor)
+{
+ size_t i, n = x->size;
+
+ if (gsl_vector_isnull(x))
+ {
+ for (i = 0; i < n; i++)
+ {
+ gsl_vector_set (x, i, factor);
+ }
+ }
+ else
+ {
+ for (i = 0; i < n; i++)
+ {
+ double xi = gsl_vector_get(x, i);
+ gsl_vector_set(x, i, factor * xi);
+ }
+ }
+}
+
+int
+test_fdf (const char * desc, gsl_multiroot_function_fdf * function,
+ initpt_function initpt, double factor,
+ const gsl_multiroot_fdfsolver_type * T)
+{
+ int status;
+ double residual = 0;
+ size_t i, n = function->n, iter = 0;
+
+ gsl_vector *x = gsl_vector_alloc (n);
+ gsl_matrix *J = gsl_matrix_alloc (n, n);
+
+ gsl_multiroot_fdfsolver *s;
+
+ (*initpt) (x);
+
+ if (factor != 1.0) scale(x, factor);
+
+ s = gsl_multiroot_fdfsolver_alloc (T, n);
+ gsl_multiroot_fdfsolver_set (s, function, x);
+
+ do
+ {
+ iter++;
+ status = gsl_multiroot_fdfsolver_iterate (s);
+
+ if (status)
+ break ;
+
+ status = gsl_multiroot_test_residual (s->f, 0.0000001);
+ }
+ while (status == GSL_CONTINUE && iter < 1000);
+
+#ifdef DEBUG
+ printf("x "); gsl_vector_fprintf (stdout, s->x, "%g"); printf("\n");
+ printf("f "); gsl_vector_fprintf (stdout, s->f, "%g"); printf("\n");
+#endif
+
+
+#ifdef TEST_JACOBIAN
+ {
+ double r,sum; size_t j;
+
+ gsl_multiroot_function f1 ;
+ f1.f = function->f ;
+ f1.n = function->n ;
+ f1.params = function->params ;
+
+ gsl_multiroot_fdjacobian (&f1, s->x, s->f, GSL_SQRT_DBL_EPSILON, J);
+
+ /* compare J and s->J */
+
+ r=0;sum=0;
+ for (i = 0; i < n; i++)
+ for (j = 0; j< n ; j++)
+ {
+ double u = gsl_matrix_get(J,i,j);
+ double su = gsl_matrix_get(s->J, i, j);
+ r = fabs(u - su)/(1e-6 + 1e-6 * fabs(u)); sum+=r;
+ if (fabs(u - su) > 1e-6 + 1e-6 * fabs(u))
+ printf("broken jacobian %g\n", r);
+ }
+ printf("avg r = %g\n", sum/(n*n));
+ }
+#endif
+
+ for (i = 0; i < n ; i++)
+ {
+ residual += fabs(gsl_vector_get(s->f, i));
+ }
+
+ gsl_multiroot_fdfsolver_free (s);
+ gsl_matrix_free(J);
+ gsl_vector_free(x);
+
+ gsl_test(status, "%s on %s (%g), %u iterations, residual = %.2g", T->name, desc, factor, iter, residual);
+
+ return status;
+}
+
+
+int
+test_f (const char * desc, gsl_multiroot_function_fdf * fdf,
+ initpt_function initpt, double factor,
+ const gsl_multiroot_fsolver_type * T)
+{
+ int status;
+ size_t i, n = fdf->n, iter = 0;
+ double residual = 0;
+
+ gsl_vector *x;
+
+ gsl_multiroot_fsolver *s;
+ gsl_multiroot_function function;
+
+ function.f = fdf->f;
+ function.params = fdf->params;
+ function.n = n ;
+
+ x = gsl_vector_alloc (n);
+
+ (*initpt) (x);
+
+ if (factor != 1.0) scale(x, factor);
+
+ s = gsl_multiroot_fsolver_alloc (T, n);
+ gsl_multiroot_fsolver_set (s, &function, x);
+
+/* printf("x "); gsl_vector_fprintf (stdout, s->x, "%g"); printf("\n"); */
+/* printf("f "); gsl_vector_fprintf (stdout, s->f, "%g"); printf("\n"); */
+
+ do
+ {
+ iter++;
+ status = gsl_multiroot_fsolver_iterate (s);
+
+ if (status)
+ break ;
+
+ status = gsl_multiroot_test_residual (s->f, 0.0000001);
+ }
+ while (status == GSL_CONTINUE && iter < 1000);
+
+#ifdef DEBUG
+ printf("x "); gsl_vector_fprintf (stdout, s->x, "%g"); printf("\n");
+ printf("f "); gsl_vector_fprintf (stdout, s->f, "%g"); printf("\n");
+#endif
+
+ for (i = 0; i < n ; i++)
+ {
+ residual += fabs(gsl_vector_get(s->f, i));
+ }
+
+ gsl_multiroot_fsolver_free (s);
+ gsl_vector_free(x);
+
+ gsl_test(status, "%s on %s (%g), %u iterations, residual = %.2g", T->name, desc, factor, iter, residual);
+
+ return status;
+}
diff --git a/gsl-1.9/multiroots/test_funcs.c b/gsl-1.9/multiroots/test_funcs.c
new file mode 100644
index 0000000..2edb2bb
--- /dev/null
+++ b/gsl-1.9/multiroots/test_funcs.c
@@ -0,0 +1,744 @@
+/* multiroots/test_funcs.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_multiroots.h>
+
+#include "test_funcs.h"
+
+/* For information on testing see the following paper,
+
+ J.J More, B.S. Garbow, K.E. Hillstrom, "Testing Unconstrained
+ Optimization Software", ACM Transactions on Mathematical Software,
+ Vol 7, No 1, (1981) p 17-41
+
+ */
+
+/* Rosenbrock Function */
+
+gsl_multiroot_function_fdf rosenbrock =
+{&rosenbrock_f,
+ &rosenbrock_df,
+ &rosenbrock_fdf,
+ 2, 0};
+
+void
+rosenbrock_initpt (gsl_vector * x)
+{
+ gsl_vector_set (x, 0, -1.2);
+ gsl_vector_set (x, 1, 1.0);
+}
+
+int
+rosenbrock_f (const gsl_vector * x, void *params, gsl_vector * f)
+{
+ double x0 = gsl_vector_get (x, 0);
+ double x1 = gsl_vector_get (x, 1);
+
+ double y0 = 1 - x0;
+ double y1 = 10 * (x1 - x0 * x0);
+
+ gsl_vector_set (f, 0, y0);
+ gsl_vector_set (f, 1, y1);
+
+ params = 0; /* avoid warning about unused parameters */
+
+ return GSL_SUCCESS;
+}
+
+int
+rosenbrock_df (const gsl_vector * x, void *params, gsl_matrix * df)
+{
+ double x0 = gsl_vector_get (x, 0);
+
+ double df00 = -1;
+ double df01 = 0;
+ double df10 = -20 * x0;
+ double df11 = 10;
+
+ gsl_matrix_set (df, 0, 0, df00);
+ gsl_matrix_set (df, 0, 1, df01);
+ gsl_matrix_set (df, 1, 0, df10);
+ gsl_matrix_set (df, 1, 1, df11);
+
+ params = 0; /* avoid warning about unused parameters */
+
+ return GSL_SUCCESS;
+}
+
+int
+rosenbrock_fdf (const gsl_vector * x, void *params,
+ gsl_vector * f, gsl_matrix * df)
+{
+ rosenbrock_f (x, params, f);
+ rosenbrock_df (x, params, df);
+
+ return GSL_SUCCESS;
+}
+
+
+/* Freudenstein and Roth function */
+
+gsl_multiroot_function_fdf roth =
+{&roth_f,
+ &roth_df,
+ &roth_fdf,
+ 2, 0};
+
+void
+roth_initpt (gsl_vector * x)
+{
+ gsl_vector_set (x, 0, 4.5); /* changed from the value in the paper */
+ gsl_vector_set (x, 1, 3.5); /* otherwise the problem is too hard */
+}
+
+int
+roth_f (const gsl_vector * x, void *params, gsl_vector * f)
+{
+ double x0 = gsl_vector_get (x, 0);
+ double x1 = gsl_vector_get (x, 1);
+
+ double y0 = -13.0 + x0 + ((5.0 - x1)*x1 - 2.0)*x1;
+ double y1 = -29.0 + x0 + ((x1 + 1.0)*x1 - 14.0)*x1;
+
+ gsl_vector_set (f, 0, y0);
+ gsl_vector_set (f, 1, y1);
+
+ params = 0; /* avoid warning about unused parameters */
+
+ return GSL_SUCCESS;
+}
+
+int
+roth_df (const gsl_vector * x, void *params, gsl_matrix * df)
+{
+ double x1 = gsl_vector_get (x, 1);
+
+ double df00 = 1;
+ double df01 = -3 * x1 * x1 + 10 * x1 - 2;
+ double df10 = 1;
+ double df11 = 3 * x1 * x1 + 2 * x1 - 14;
+
+ gsl_matrix_set (df, 0, 0, df00);
+ gsl_matrix_set (df, 0, 1, df01);
+ gsl_matrix_set (df, 1, 0, df10);
+ gsl_matrix_set (df, 1, 1, df11);
+
+ params = 0; /* avoid warning about unused parameters */
+
+ return GSL_SUCCESS;
+}
+
+int
+roth_fdf (const gsl_vector * x, void *params,
+ gsl_vector * f, gsl_matrix * df)
+{
+ roth_f (x, params, f);
+ roth_df (x, params, df);
+
+ return GSL_SUCCESS;
+}
+
+
+
+/* Powell badly scaled function */
+
+gsl_multiroot_function_fdf powellscal =
+{&powellscal_f,
+ &powellscal_df,
+ &powellscal_fdf,
+ 2, 0};
+
+void
+powellscal_initpt (gsl_vector * x)
+{
+ gsl_vector_set (x, 0, 0.0);
+ gsl_vector_set (x, 1, 1.0);
+}
+
+int
+powellscal_f (const gsl_vector * x, void *params, gsl_vector * f)
+{
+ double x0 = gsl_vector_get (x, 0);
+ double x1 = gsl_vector_get (x, 1);
+
+ double y0 = 10000.0 * x0 * x1 - 1.0;
+ double y1 = exp (-x0) + exp (-x1) - 1.0001;
+
+ gsl_vector_set (f, 0, y0);
+ gsl_vector_set (f, 1, y1);
+
+ params = 0; /* avoid warning about unused parameters */
+
+ return GSL_SUCCESS;
+}
+
+int
+powellscal_df (const gsl_vector * x, void *params, gsl_matrix * df)
+{
+ double x0 = gsl_vector_get (x, 0);
+ double x1 = gsl_vector_get (x, 1);
+
+ double df00 = 10000.0 * x1, df01 = 10000.0 * x0;
+ double df10 = -exp (-x0), df11 = -exp (-x1);
+
+ gsl_matrix_set (df, 0, 0, df00);
+ gsl_matrix_set (df, 0, 1, df01);
+ gsl_matrix_set (df, 1, 0, df10);
+ gsl_matrix_set (df, 1, 1, df11);
+
+ params = 0; /* avoid warning about unused parameters */
+
+ return GSL_SUCCESS;
+}
+
+int
+powellscal_fdf (const gsl_vector * x, void *params,
+ gsl_vector * f, gsl_matrix * df)
+{
+ powellscal_f (x, params, f);
+ powellscal_df (x, params, df);
+
+ return GSL_SUCCESS;
+}
+
+
+/* Brown badly scaled function */
+
+gsl_multiroot_function_fdf brownscal =
+{&brownscal_f,
+ &brownscal_df,
+ &brownscal_fdf,
+ 2, 0};
+
+void
+brownscal_initpt (gsl_vector * x)
+{
+ gsl_vector_set (x, 0, 1.0);
+ gsl_vector_set (x, 1, 1.0);
+}
+
+int
+brownscal_f (const gsl_vector * x, void *params, gsl_vector * f)
+{
+ double x0 = gsl_vector_get (x, 0);
+ double x1 = gsl_vector_get (x, 1);
+
+ double y0 = x0 - 1e6;
+ double y1 = x0 * x1 - 2;
+
+ gsl_vector_set (f, 0, y0);
+ gsl_vector_set (f, 1, y1);
+
+ params = 0; /* avoid warning about unused parameters */
+
+ return GSL_SUCCESS;
+}
+
+int
+brownscal_df (const gsl_vector * x, void *params, gsl_matrix * df)
+{
+ double x0 = gsl_vector_get (x, 0);
+ double x1 = gsl_vector_get (x, 1);
+
+ double df00 = 1.0, df01 = 0.0;
+ double df10 = x1, df11 = x0;
+
+ gsl_matrix_set (df, 0, 0, df00);
+ gsl_matrix_set (df, 0, 1, df01);
+ gsl_matrix_set (df, 1, 0, df10);
+ gsl_matrix_set (df, 1, 1, df11);
+
+ params = 0; /* avoid warning about unused parameters */
+
+ return GSL_SUCCESS;
+}
+
+int
+brownscal_fdf (const gsl_vector * x, void *params,
+ gsl_vector * f, gsl_matrix * df)
+{
+ brownscal_f (x, params, f);
+ brownscal_df (x, params, df);
+
+ return GSL_SUCCESS;
+}
+
+
+/* Powell Singular Function */
+
+gsl_multiroot_function_fdf powellsing =
+{&powellsing_f,
+ &powellsing_df,
+ &powellsing_fdf,
+ 4, 0};
+
+void
+powellsing_initpt (gsl_vector * x)
+{
+ gsl_vector_set (x, 0, 3.0);
+ gsl_vector_set (x, 1, -1.0);
+ gsl_vector_set (x, 2, 0.0);
+ gsl_vector_set (x, 3, 1.0);
+}
+
+int
+powellsing_f (const gsl_vector * x, void *params, gsl_vector * f)
+{
+ double x0 = gsl_vector_get (x, 0);
+ double x1 = gsl_vector_get (x, 1);
+ double x2 = gsl_vector_get (x, 2);
+ double x3 = gsl_vector_get (x, 3);
+
+ double y0 = x0 + 10 * x1;
+ double y1 = sqrt (5.0) * (x2 - x3);
+ double y2 = pow (x1 - 2 * x2, 2.0);
+ double y3 = sqrt (10.0) * pow (x0 - x3, 2.0);
+
+ gsl_vector_set (f, 0, y0);
+ gsl_vector_set (f, 1, y1);
+ gsl_vector_set (f, 2, y2);
+ gsl_vector_set (f, 3, y3);
+
+ params = 0; /* avoid warning about unused parameters */
+
+ return GSL_SUCCESS;
+}
+
+int
+powellsing_df (const gsl_vector * x, void *params, gsl_matrix * df)
+{
+ double x0 = gsl_vector_get (x, 0);
+ double x1 = gsl_vector_get (x, 1);
+ double x2 = gsl_vector_get (x, 2);
+ double x3 = gsl_vector_get (x, 3);
+
+ double df00 = 1, df01 = 10, df02 = 0, df03 = 0;
+ double df10 = 0, df11 = 0, df12 = sqrt (5.0), df13 = -df12;
+ double df20 = 0, df21 = 2 * (x1 - 2 * x2), df22 = -2 * df21, df23 = 0;
+ double df30 = 2 * sqrt (10.0) * (x0 - x3), df31 = 0, df32 = 0, df33 = -df30;
+
+ gsl_matrix_set (df, 0, 0, df00);
+ gsl_matrix_set (df, 0, 1, df01);
+ gsl_matrix_set (df, 0, 2, df02);
+ gsl_matrix_set (df, 0, 3, df03);
+
+ gsl_matrix_set (df, 1, 0, df10);
+ gsl_matrix_set (df, 1, 1, df11);
+ gsl_matrix_set (df, 1, 2, df12);
+ gsl_matrix_set (df, 1, 3, df13);
+
+ gsl_matrix_set (df, 2, 0, df20);
+ gsl_matrix_set (df, 2, 1, df21);
+ gsl_matrix_set (df, 2, 2, df22);
+ gsl_matrix_set (df, 2, 3, df23);
+
+ gsl_matrix_set (df, 3, 0, df30);
+ gsl_matrix_set (df, 3, 1, df31);
+ gsl_matrix_set (df, 3, 2, df32);
+ gsl_matrix_set (df, 3, 3, df33);
+
+ params = 0; /* avoid warning about unused parameters */
+
+ return GSL_SUCCESS;
+}
+
+int
+powellsing_fdf (const gsl_vector * x, void *params,
+ gsl_vector * f, gsl_matrix * df)
+{
+ powellsing_f (x, params, f);
+ powellsing_df (x, params, df);
+
+ return GSL_SUCCESS;
+}
+
+
+/* Wood function */
+
+gsl_multiroot_function_fdf wood =
+{&wood_f,
+ &wood_df,
+ &wood_fdf,
+ 4, 0};
+
+void
+wood_initpt (gsl_vector * x)
+{
+ gsl_vector_set (x, 0, -3.0);
+ gsl_vector_set (x, 1, -1.0);
+ gsl_vector_set (x, 2, -3.0);
+ gsl_vector_set (x, 3, -1.0);
+}
+
+int
+wood_f (const gsl_vector * x, void *params, gsl_vector * f)
+{
+ double x0 = gsl_vector_get (x, 0);
+ double x1 = gsl_vector_get (x, 1);
+ double x2 = gsl_vector_get (x, 2);
+ double x3 = gsl_vector_get (x, 3);
+
+ double t1 = x1 - x0 * x0;
+ double t2 = x3 - x2 * x2;
+
+ double y0 = -200.0 * x0 * t1 - (1 - x0);
+ double y1 = 200.0 * t1 + 20.2 * (x1 - 1) + 19.8 * (x3 - 1);
+ double y2 = -180.0 * x2 * t2 - (1 - x2);
+ double y3 = 180.0 * t2 + 20.2 * (x3 - 1) + 19.8 * (x1 - 1);
+
+ gsl_vector_set (f, 0, y0);
+ gsl_vector_set (f, 1, y1);
+ gsl_vector_set (f, 2, y2);
+ gsl_vector_set (f, 3, y3);
+
+ params = 0; /* avoid warning about unused parameters */
+
+ return GSL_SUCCESS;
+}
+
+int
+wood_df (const gsl_vector * x, void *params, gsl_matrix * df)
+{
+ double x0 = gsl_vector_get (x, 0);
+ double x1 = gsl_vector_get (x, 1);
+ double x2 = gsl_vector_get (x, 2);
+ double x3 = gsl_vector_get (x, 3);
+
+ double t1 = x1 - 3 * x0 * x0;
+ double t2 = x3 - 3 * x2 * x2;
+
+ double df00 = -200.0 * t1 + 1, df01 = -200.0 * x0, df02 = 0, df03 = 0;
+ double df10 = -400.0*x0, df11 = 200.0 + 20.2, df12 = 0, df13 = 19.8;
+ double df20 = 0, df21 = 0, df22 = -180.0 * t2 + 1, df23 = -180.0 * x2;
+ double df30 = 0, df31 = 19.8, df32 = -2 * 180 * x2, df33 = 180.0 + 20.2;
+
+ gsl_matrix_set (df, 0, 0, df00);
+ gsl_matrix_set (df, 0, 1, df01);
+ gsl_matrix_set (df, 0, 2, df02);
+ gsl_matrix_set (df, 0, 3, df03);
+
+ gsl_matrix_set (df, 1, 0, df10);
+ gsl_matrix_set (df, 1, 1, df11);
+ gsl_matrix_set (df, 1, 2, df12);
+ gsl_matrix_set (df, 1, 3, df13);
+
+ gsl_matrix_set (df, 2, 0, df20);
+ gsl_matrix_set (df, 2, 1, df21);
+ gsl_matrix_set (df, 2, 2, df22);
+ gsl_matrix_set (df, 2, 3, df23);
+
+ gsl_matrix_set (df, 3, 0, df30);
+ gsl_matrix_set (df, 3, 1, df31);
+ gsl_matrix_set (df, 3, 2, df32);
+ gsl_matrix_set (df, 3, 3, df33);
+
+ params = 0; /* avoid warning about unused parameters */
+
+ return GSL_SUCCESS;
+}
+
+int
+wood_fdf (const gsl_vector * x, void *params,
+ gsl_vector * f, gsl_matrix * df)
+{
+ wood_f (x, params, f);
+ wood_df (x, params, df);
+
+ return GSL_SUCCESS;
+}
+
+
+/* Helical Valley Function */
+
+gsl_multiroot_function_fdf helical =
+{&helical_f,
+ &helical_df,
+ &helical_fdf,
+ 3, 0};
+
+void
+helical_initpt (gsl_vector * x)
+{
+ gsl_vector_set (x, 0, -1.0);
+ gsl_vector_set (x, 1, 0.0);
+ gsl_vector_set (x, 2, 0.0);
+}
+
+int
+helical_f (const gsl_vector * x, void *params, gsl_vector * f)
+{
+ double x0 = gsl_vector_get (x, 0);
+ double x1 = gsl_vector_get (x, 1);
+ double x2 = gsl_vector_get (x, 2);
+
+ double t1, t2;
+ double y0, y1, y2;
+
+ if (x0 > 0)
+ {
+ t1 = atan(x1/x0) / (2.0 * M_PI);
+ }
+ else if (x0 < 0)
+ {
+ t1 = 0.5 + atan(x1/x0) / (2.0 * M_PI);
+ }
+ else
+ {
+ t1 = 0.25 * (x1 > 0 ? +1 : -1);
+ }
+
+ t2 = sqrt(x0*x0 + x1*x1) ;
+
+ y0 = 10 * (x2 - 10 * t1);
+ y1 = 10 * (t2 - 1);
+ y2 = x2 ;
+
+ gsl_vector_set (f, 0, y0);
+ gsl_vector_set (f, 1, y1);
+ gsl_vector_set (f, 2, y2);
+
+ params = 0; /* avoid warning about unused parameters */
+
+ return GSL_SUCCESS;
+}
+
+int
+helical_df (const gsl_vector * x, void *params, gsl_matrix * df)
+{
+ double x0 = gsl_vector_get (x, 0);
+ double x1 = gsl_vector_get (x, 1);
+
+ double t = x0 * x0 + x1 * x1 ;
+ double t1 = 2 * M_PI * t ;
+ double t2 = sqrt(t) ;
+
+ double df00 = 100*x1/t1, df01 = -100.0 * x0/t1, df02 = 10.0;
+ double df10 = 10*x0/t2, df11 = 10*x1/t2, df12 = 0;
+ double df20 = 0, df21 = 0, df22 = 1.0;
+
+ gsl_matrix_set (df, 0, 0, df00);
+ gsl_matrix_set (df, 0, 1, df01);
+ gsl_matrix_set (df, 0, 2, df02);
+
+ gsl_matrix_set (df, 1, 0, df10);
+ gsl_matrix_set (df, 1, 1, df11);
+ gsl_matrix_set (df, 1, 2, df12);
+
+ gsl_matrix_set (df, 2, 0, df20);
+ gsl_matrix_set (df, 2, 1, df21);
+ gsl_matrix_set (df, 2, 2, df22);
+
+ params = 0; /* avoid warning about unused parameters */
+
+ return GSL_SUCCESS;
+}
+
+int
+helical_fdf (const gsl_vector * x, void *params,
+ gsl_vector * f, gsl_matrix * df)
+{
+ helical_f (x, params, f);
+ helical_df (x, params, df);
+
+ return GSL_SUCCESS;
+}
+
+
+/* Discrete Boundary Value Function */
+
+#define N 10
+
+gsl_multiroot_function_fdf dbv =
+{&dbv_f,
+ &dbv_df,
+ &dbv_fdf,
+ N, 0};
+
+void
+dbv_initpt (gsl_vector * x)
+{
+ size_t i;
+ double h = 1.0 / (N + 1.0);
+
+ for (i = 0; i < N; i++)
+ {
+ double t = (i + 1) * h;
+ double z = t * (t - 1);
+ gsl_vector_set (x, i, z);
+ }
+}
+
+int
+dbv_f (const gsl_vector * x, void *params, gsl_vector * f)
+{
+ size_t i;
+
+ double h = 1.0 / (N + 1.0);
+
+ for (i = 0; i < N; i++)
+ {
+ double z, ti = (i + 1) * h;
+ double xi = 0, xim1 = 0, xip1 = 0;
+
+ xi = gsl_vector_get (x, i);
+
+ if (i > 0)
+ xim1 = gsl_vector_get (x, i - 1);
+
+ if (i < N - 1)
+ xip1 = gsl_vector_get (x, i + 1);
+
+ z = 2 * xi - xim1 - xip1 + h * h * pow(xi + ti + 1, 3.0) / 2.0;
+
+ gsl_vector_set (f, i, z);
+
+ }
+
+ params = 0; /* avoid warning about unused parameters */
+
+ return GSL_SUCCESS;
+}
+
+int
+dbv_df (const gsl_vector * x, void *params, gsl_matrix * df)
+{
+ size_t i, j;
+
+ double h = 1.0 / (N + 1.0);
+
+ for (i = 0; i < N; i++)
+ for (j = 0; j < N; j++)
+ gsl_matrix_set (df, i, j, 0.0);
+
+ for (i = 0; i < N; i++)
+ {
+ double dz_dxi, ti = (i + 1) * h;
+
+ double xi = gsl_vector_get (x, i);
+
+ dz_dxi = 2.0 + (3.0 / 2.0) * h * h * pow(xi + ti + 1, 2.0) ;
+
+ gsl_matrix_set (df, i, i, dz_dxi);
+
+ if (i > 0)
+ gsl_matrix_set (df, i, i-1, -1.0);
+
+ if (i < N - 1)
+ gsl_matrix_set (df, i, i+1, -1.0);
+
+ }
+
+ params = 0; /* avoid warning about unused parameters */
+
+ return GSL_SUCCESS;
+}
+
+int
+dbv_fdf (const gsl_vector * x, void *params,
+ gsl_vector * f, gsl_matrix * df)
+{
+ dbv_f (x, params, f);
+ dbv_df (x, params, df);
+
+ return GSL_SUCCESS;
+}
+
+/* Trigonometric Function */
+
+gsl_multiroot_function_fdf trig =
+{&trig_f,
+ &trig_df,
+ &trig_fdf,
+ N, 0};
+
+void
+trig_initpt (gsl_vector * x)
+{
+ size_t i;
+
+ for (i = 0; i < N; i++) /* choose an initial point which converges */
+ {
+ gsl_vector_set (x, i, 0.05);
+ }
+}
+
+int
+trig_f (const gsl_vector * x, void *params, gsl_vector * f)
+{
+ size_t i;
+ double sum = 0;
+
+ for (i = 0; i < N; i++)
+ {
+ sum += cos(gsl_vector_get(x,i));
+ }
+
+ for (i = 0; i < N; i++)
+ {
+ double xi = gsl_vector_get (x,i);
+ double z = N - sum + (i + 1) * (1 - cos(xi)) - sin(xi);
+
+ gsl_vector_set (f, i, z);
+ }
+
+ params = 0; /* avoid warning about unused parameters */
+
+ return GSL_SUCCESS;
+}
+
+int
+trig_df (const gsl_vector * x, void *params, gsl_matrix * df)
+{
+ size_t i, j;
+
+ for (i = 0; i < N; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ double dz;
+ double xi = gsl_vector_get(x, i);
+ double xj = gsl_vector_get(x, j);
+
+ if (j == i)
+ dz = sin(xi) + (i + 1) * sin(xi) - cos(xi);
+ else
+ dz = sin(xj);
+
+ gsl_matrix_set(df, i, j, dz);
+ }
+ }
+
+ params = 0; /* avoid warning about unused parameters */
+
+ return GSL_SUCCESS;
+}
+
+int
+trig_fdf (const gsl_vector * x, void *params,
+ gsl_vector * f, gsl_matrix * df)
+{
+ trig_f (x, params, f);
+ trig_df (x, params, df);
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/multiroots/test_funcs.h b/gsl-1.9/multiroots/test_funcs.h
new file mode 100644
index 0000000..ba7ee48
--- /dev/null
+++ b/gsl-1.9/multiroots/test_funcs.h
@@ -0,0 +1,76 @@
+/* multiroots/test_funcs.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+
+typedef void (*initpt_function) (gsl_vector * x);
+
+extern gsl_multiroot_function_fdf rosenbrock;
+void rosenbrock_initpt (gsl_vector * x);
+int rosenbrock_f (const gsl_vector * x, void *params, gsl_vector * f);
+int rosenbrock_df (const gsl_vector * x, void *params, gsl_matrix * df);
+int rosenbrock_fdf (const gsl_vector * x, void *params, gsl_vector * f, gsl_matrix * df);
+
+extern gsl_multiroot_function_fdf roth;
+void roth_initpt (gsl_vector * x);
+int roth_f (const gsl_vector * x, void *params, gsl_vector * f);
+int roth_df (const gsl_vector * x, void *params, gsl_matrix * df);
+int roth_fdf (const gsl_vector * x, void *params, gsl_vector * f, gsl_matrix * df);
+
+extern gsl_multiroot_function_fdf brownscal;
+void brownscal_initpt (gsl_vector * x);
+int brownscal_f (const gsl_vector * x, void *params, gsl_vector * f);
+int brownscal_df (const gsl_vector * x, void *params, gsl_matrix * df);
+int brownscal_fdf (const gsl_vector * x, void *params, gsl_vector * f, gsl_matrix * df);
+
+extern gsl_multiroot_function_fdf powellscal;
+void powellscal_initpt (gsl_vector * x);
+int powellscal_f (const gsl_vector * x, void *params, gsl_vector * f);
+int powellscal_df (const gsl_vector * x, void *params, gsl_matrix * df);
+int powellscal_fdf (const gsl_vector * x, void *params, gsl_vector * f, gsl_matrix * df);
+
+extern gsl_multiroot_function_fdf powellsing;
+void powellsing_initpt (gsl_vector * x);
+int powellsing_f (const gsl_vector * x, void *params, gsl_vector * f);
+int powellsing_df (const gsl_vector * x, void *params, gsl_matrix * df);
+int powellsing_fdf (const gsl_vector * x, void *params, gsl_vector * f, gsl_matrix * df);
+
+extern gsl_multiroot_function_fdf wood;
+void wood_initpt (gsl_vector * x);
+int wood_f (const gsl_vector * x, void *params, gsl_vector * f);
+int wood_df (const gsl_vector * x, void *params, gsl_matrix * df);
+int wood_fdf (const gsl_vector * x, void *params, gsl_vector * f, gsl_matrix * df);
+
+extern gsl_multiroot_function_fdf helical;
+void helical_initpt (gsl_vector * x);
+int helical_f (const gsl_vector * x, void *params, gsl_vector * f);
+int helical_df (const gsl_vector * x, void *params, gsl_matrix * df);
+int helical_fdf (const gsl_vector * x, void *params, gsl_vector * f, gsl_matrix * df);
+
+extern gsl_multiroot_function_fdf dbv;
+void dbv_initpt (gsl_vector * x);
+int dbv_f (const gsl_vector * x, void *params, gsl_vector * f);
+int dbv_df (const gsl_vector * x, void *params, gsl_matrix * df);
+int dbv_fdf (const gsl_vector * x, void *params, gsl_vector * f, gsl_matrix * df);
+
+extern gsl_multiroot_function_fdf trig;
+void trig_initpt (gsl_vector * x);
+int trig_f (const gsl_vector * x, void *params, gsl_vector * f);
+int trig_df (const gsl_vector * x, void *params, gsl_matrix * df);
+int trig_fdf (const gsl_vector * x, void *params, gsl_vector * f, gsl_matrix * df);
+
diff --git a/gsl-1.9/ntuple/ChangeLog b/gsl-1.9/ntuple/ChangeLog
new file mode 100644
index 0000000..16e0993
--- /dev/null
+++ b/gsl-1.9/ntuple/ChangeLog
@@ -0,0 +1,5 @@
+2004-05-30 Brian Gough <bjg@network-theory.co.uk>
+
+ * ntuple/test.c (main): choose ratio 1/(i+1.5) to avoid values
+ exactly on test cutoff x=0.1
+
diff --git a/gsl-1.9/ntuple/Makefile.am b/gsl-1.9/ntuple/Makefile.am
new file mode 100644
index 0000000..1334a8a
--- /dev/null
+++ b/gsl-1.9/ntuple/Makefile.am
@@ -0,0 +1,22 @@
+noinst_LTLIBRARIES = libgslntuple.la
+
+pkginclude_HEADERS = gsl_ntuple.h
+
+INCLUDES= -I$(top_builddir)
+
+libgslntuple_la_SOURCES = ntuple.c
+
+TESTS = $(check_PROGRAMS)
+
+check_PROGRAMS = test #demo demo1
+
+test_SOURCES = test.c
+test_LDADD = libgslntuple.la ../histogram/libgslhistogram.la ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+
+#demo_SOURCES = demo.c
+#demo_LDADD = libgslntuple.la ../histogram/libgslhistogram.la ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+
+#demo1_SOURCES = demo1.c
+#demo1_LDADD = libgslntuple.la ../histogram/libgslhistogram.la ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+
+CLEANFILES = test.dat
diff --git a/gsl-1.9/ntuple/Makefile.in b/gsl-1.9/ntuple/Makefile.in
new file mode 100644
index 0000000..d981fbf
--- /dev/null
+++ b/gsl-1.9/ntuple/Makefile.in
@@ -0,0 +1,552 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = test$(EXEEXT)
+subdir = ntuple
+DIST_COMMON = $(pkginclude_HEADERS) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in ChangeLog
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgslntuple_la_LIBADD =
+am_libgslntuple_la_OBJECTS = ntuple.lo
+libgslntuple_la_OBJECTS = $(am_libgslntuple_la_OBJECTS)
+am_test_OBJECTS = test.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = libgslntuple.la ../histogram/libgslhistogram.la \
+ ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la \
+ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \
+ ../utils/libutils.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgslntuple_la_SOURCES) $(test_SOURCES)
+DIST_SOURCES = $(libgslntuple_la_SOURCES) $(test_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libgslntuple.la
+pkginclude_HEADERS = gsl_ntuple.h
+INCLUDES = -I$(top_builddir)
+libgslntuple_la_SOURCES = ntuple.c
+TESTS = $(check_PROGRAMS)
+test_SOURCES = test.c
+test_LDADD = libgslntuple.la ../histogram/libgslhistogram.la ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+
+#demo_SOURCES = demo.c
+#demo_LDADD = libgslntuple.la ../histogram/libgslhistogram.la ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+
+#demo1_SOURCES = demo1.c
+#demo1_LDADD = libgslntuple.la ../histogram/libgslhistogram.la ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+CLEANFILES = test.dat
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps ntuple/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps ntuple/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgslntuple.la: $(libgslntuple_la_OBJECTS) $(libgslntuple_la_DEPENDENCIES)
+ $(LINK) $(libgslntuple_la_LDFLAGS) $(libgslntuple_la_OBJECTS) $(libgslntuple_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkgincludeHEADERS
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/ntuple/gsl_ntuple.h b/gsl-1.9/ntuple/gsl_ntuple.h
new file mode 100644
index 0000000..14789a4
--- /dev/null
+++ b/gsl-1.9/ntuple/gsl_ntuple.h
@@ -0,0 +1,82 @@
+/* histogram/ntuple.h
+ *
+ * Copyright (C) 2000 Simone Piccardi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+/* Jan/2001 Modified by Brian Gough. Minor changes for GSL */
+
+#ifndef __GSL_NTUPLE_H__
+#define __GSL_NTUPLE_H__
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_histogram.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+typedef struct {
+ FILE * file;
+ void * ntuple_data;
+ size_t size;
+} gsl_ntuple;
+
+typedef struct {
+ int (* function) (void * ntuple_data, void * params);
+ void * params;
+} gsl_ntuple_select_fn;
+
+typedef struct {
+ double (* function) (void * ntuple_data, void * params);
+ void * params;
+} gsl_ntuple_value_fn;
+
+gsl_ntuple *
+gsl_ntuple_open (char * filename, void * ntuple_data, size_t size);
+
+gsl_ntuple *
+gsl_ntuple_create (char * filename, void * ntuple_data, size_t size);
+
+int gsl_ntuple_write (gsl_ntuple * ntuple);
+int gsl_ntuple_read (gsl_ntuple * ntuple);
+
+int gsl_ntuple_bookdata (gsl_ntuple * ntuple); /* synonym for write */
+
+int gsl_ntuple_project (gsl_histogram * h, gsl_ntuple * ntuple,
+ gsl_ntuple_value_fn *value_func,
+ gsl_ntuple_select_fn *select_func);
+
+int gsl_ntuple_close (gsl_ntuple * ntuple);
+
+__END_DECLS
+
+#endif /* __GSL_NTUPLE_H__ */
+
+
+
+
diff --git a/gsl-1.9/ntuple/ntuple.c b/gsl-1.9/ntuple/ntuple.c
new file mode 100644
index 0000000..5055a8c
--- /dev/null
+++ b/gsl-1.9/ntuple/ntuple.c
@@ -0,0 +1,202 @@
+/* histogram/ntuple.c
+ *
+ * Copyright (C) 2000 Simone Piccardi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Jan/2001 Modified by Brian Gough. Minor changes for GSL */
+
+#include <config.h>
+#include <errno.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_ntuple.h>
+
+/*
+ * gsl_ntuple_open:
+ * Initialize an ntuple structure and create the related file
+ */
+
+gsl_ntuple *
+gsl_ntuple_create (char *filename, void *ntuple_data, size_t size)
+{
+ gsl_ntuple *ntuple = (gsl_ntuple *)malloc (sizeof (gsl_ntuple));
+
+ if (ntuple == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for ntuple struct",
+ GSL_ENOMEM, 0);
+ }
+
+ ntuple->ntuple_data = ntuple_data;
+ ntuple->size = size;
+
+ ntuple->file = fopen (filename, "wb");
+
+ if (ntuple->file == 0)
+ {
+ free (ntuple);
+ GSL_ERROR_VAL ("unable to create ntuple file", GSL_EFAILED, 0);
+ }
+
+ return ntuple;
+}
+
+/*
+ * gsl_ntuple_open:
+ * Initialize an ntuple structure and open the related file
+ */
+
+gsl_ntuple *
+gsl_ntuple_open (char *filename, void *ntuple_data, size_t size)
+{
+ gsl_ntuple *ntuple = (gsl_ntuple *)malloc (sizeof (gsl_ntuple));
+
+ if (ntuple == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for ntuple struct",
+ GSL_ENOMEM, 0);
+ }
+
+ ntuple->ntuple_data = ntuple_data;
+ ntuple->size = size;
+
+ ntuple->file = fopen (filename, "rb");
+
+ if (ntuple->file == 0)
+ {
+ free (ntuple);
+ GSL_ERROR_VAL ("unable to open ntuple file for reading",
+ GSL_EFAILED, 0);
+ }
+
+ return ntuple;
+}
+
+/*
+ * gsl_ntuple_write:
+ * write to file a data row, must be used in a loop!
+ */
+
+int
+gsl_ntuple_write (gsl_ntuple * ntuple)
+{
+ size_t nwrite;
+
+ nwrite = fwrite (ntuple->ntuple_data, ntuple->size,
+ 1, ntuple->file);
+
+ if (nwrite != 1)
+ {
+ GSL_ERROR ("failed to write ntuple entry to file", GSL_EFAILED);
+ }
+
+ return GSL_SUCCESS;
+}
+
+/* the following function is a synonym for gsl_ntuple_write */
+
+int
+gsl_ntuple_bookdata (gsl_ntuple * ntuple)
+{
+ return gsl_ntuple_write (ntuple);
+}
+
+/*
+ * gsl_ntuple_read:
+ * read form file a data row, must be used in a loop!
+ */
+
+int
+gsl_ntuple_read (gsl_ntuple * ntuple)
+{
+ size_t nread;
+
+ nread = fread (ntuple->ntuple_data, ntuple->size, 1, ntuple->file);
+
+ if (nread == 0 && feof(ntuple->file))
+ {
+ return GSL_EOF;
+ }
+
+ if (nread != 1)
+ {
+ GSL_ERROR ("failed to read ntuple entry from file", GSL_EFAILED);
+ }
+
+ return GSL_SUCCESS;
+}
+
+/*
+ * gsl_ntuple_project:
+ * fill an histogram with an ntuple file contents, use
+ * SelVal and SelFunc user defined functions to get
+ * the value to book and the selection funtion
+ */
+
+#define EVAL(f,x) ((*((f)->function))(x,(f)->params))
+
+int
+gsl_ntuple_project (gsl_histogram * h, gsl_ntuple * ntuple,
+ gsl_ntuple_value_fn * value_func,
+ gsl_ntuple_select_fn * select_func)
+{
+ size_t nread;
+
+ do
+ {
+ nread = fread (ntuple->ntuple_data, ntuple->size,
+ 1, ntuple->file);
+
+ if (nread == 0 && feof(ntuple->file))
+ {
+ break ;
+ }
+
+ if (nread != 1)
+ {
+ GSL_ERROR ("failed to read ntuple for projection", GSL_EFAILED);
+ }
+
+ if (EVAL(select_func, ntuple->ntuple_data))
+ {
+ gsl_histogram_increment (h, EVAL(value_func, ntuple->ntuple_data));
+ }
+ }
+ while (1);
+
+ return GSL_SUCCESS;
+}
+
+
+/*
+ * gsl_ntuple_close:
+ * close the ntuple file and free the memory
+ */
+
+int
+gsl_ntuple_close (gsl_ntuple * ntuple)
+{
+ int status = fclose (ntuple->file);
+
+ if (status)
+ {
+ GSL_ERROR ("failed to close ntuple file", GSL_EFAILED);
+ }
+
+ free (ntuple);
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/ntuple/test.c b/gsl-1.9/ntuple/test.c
new file mode 100644
index 0000000..68e7dca
--- /dev/null
+++ b/gsl-1.9/ntuple/test.c
@@ -0,0 +1,162 @@
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_ntuple.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+
+struct data
+{
+ int num;
+ double x;
+ double y;
+ double z;
+};
+int sel_func (void *ntuple_data, void * params);
+double val_func (void *ntuple_data, void * params);
+
+int
+main (void)
+{
+ struct data ntuple_row;
+ int i;
+
+ double x[1000], y[1000], z[1000], f[100];
+
+ gsl_ntuple_select_fn S;
+ gsl_ntuple_value_fn V;
+
+ double scale = 1.5;
+
+ gsl_ieee_env_setup ();
+
+ S.function = &sel_func;
+ S.params = &scale;
+
+ V.function = &val_func;
+ V.params = &scale;
+
+ {
+ gsl_ntuple *ntuple = gsl_ntuple_create ("test.dat", &ntuple_row,
+ sizeof (ntuple_row));
+
+ int status = 0;
+
+ for (i = 0; i < 100; i++) f[i] = 0;
+
+ for (i = 0; i < 1000; i++)
+ {
+ double xi = 1.0 / (i + 1.5);
+ double yi = xi * xi ;
+ double zi = xi * xi * xi;
+
+ ntuple_row.x = xi;
+ ntuple_row.y = yi;
+ ntuple_row.z = zi;
+ ntuple_row.num = i;
+
+ x[i] = xi; y[i] = yi; z[i] = zi;
+
+ if (xi * scale < 0.1)
+ {
+ double v = xi + yi + zi;
+ int k = (int)(100.0*v*scale);
+ f[k]++;
+ }
+
+ /* printf ("x,y,z = %f,%f,%f; n=%x \n", ntuple_row.x,
+ ntuple_row.y, ntuple_row.z, ntuple_row.num); */
+
+ {
+ int s = gsl_ntuple_bookdata (ntuple);
+
+ if (s != GSL_SUCCESS)
+ {
+ status = 1;
+ }
+ }
+ }
+
+ gsl_ntuple_close (ntuple);
+
+ gsl_test (status, "writing ntuples");
+ }
+
+ {
+ gsl_ntuple *ntuple = gsl_ntuple_open ("test.dat", &ntuple_row,
+ sizeof (ntuple_row));
+ int status = 0;
+
+ for (i = 0; i < 1000; i++)
+ {
+ gsl_ntuple_read (ntuple);
+
+ status = (ntuple_row.num != i);
+ status |= (ntuple_row.x != x[i]);
+ status |= (ntuple_row.y != y[i]);
+ status |= (ntuple_row.z != z[i]);
+
+ /* printf ("x,y,z = %f,%f,%f; n=%d\n", ntuple_row.x,
+ ntuple_row.y, ntuple_row.z, ntuple_row.num); */
+ }
+ gsl_ntuple_close (ntuple);
+
+ gsl_test (status, "reading ntuples");
+ }
+
+ {
+ int status = 0;
+
+ gsl_ntuple *ntuple = gsl_ntuple_open ("test.dat", &ntuple_row,
+ sizeof (ntuple_row));
+
+ gsl_histogram *h = gsl_histogram_calloc_uniform (100, 0., 1.);
+
+ gsl_ntuple_project (h, ntuple, &V, &S);
+
+ gsl_ntuple_close (ntuple);
+
+ /* gsl_histogram_fprintf (stdout, h, "%f", "%f"); */
+
+ for (i = 0; i < 100; i++)
+ {
+ /* printf ("h %g f %g\n", h->bin[i], f[i]); */
+
+ if (h->bin[i] != f[i])
+ {
+ status = 1;
+ }
+ }
+
+ gsl_test (status, "histogramming ntuples");
+
+ gsl_histogram_free (h);
+ }
+
+ exit (gsl_test_summary());
+}
+
+int
+sel_func (void *ntuple_data, void * params)
+{
+ double x, y, z, scale;
+ scale = *(double *)params;
+
+ x = ((struct data *) ntuple_data)->x;
+ y = ((struct data *) ntuple_data)->y;
+ z = ((struct data *) ntuple_data)->z;
+
+ return (x*scale < 0.1);
+}
+
+double
+val_func (void *ntuple_data, void * params)
+{
+ double x, y, z, scale;
+ scale = *(double *)params;
+
+ x = ((struct data *) ntuple_data)->x;
+ y = ((struct data *) ntuple_data)->y;
+ z = ((struct data *) ntuple_data)->z;
+
+ return (x + y + z) * scale;
+}
diff --git a/gsl-1.9/ode-initval/ChangeLog b/gsl-1.9/ode-initval/ChangeLog
new file mode 100644
index 0000000..0834907
--- /dev/null
+++ b/gsl-1.9/ode-initval/ChangeLog
@@ -0,0 +1,146 @@
+2006-07-29 Brian Gough <bjg@network-theory.co.uk>
+
+ * evolve.c (gsl_odeiv_evolve_apply): notify user of step-size
+ which caused any failure by returning it
+
+2006-06-13 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_odeiv.h, control.c (gsl_odeiv_control_hadjust): change y0 to
+ y in prototype to avoid conflict with bessel y0() in math.h
+
+ * test.c (test_odeiv_stepper): change y0 to ystart
+
+2005-04-08 Brian Gough <bjg@network-theory.co.uk>
+
+ * Fixed all functions to consistently return status instead of
+ GSL_EBADFUNC.
+
+2004-12-29 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c (test_compare_vanderpol): avoid variable size array
+ (test_compare_oregonator): as above
+
+2004-12-23 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c (test_evolve_xsin): changed description from "failures"
+ to "errors"
+
+2004-12-22 Brian Gough <bjg@network-theory.co.uk>
+
+ * rk2simp.c (rk2simp_step): added missing static declaration
+
+ * gear1.c (gear1_step): added missing static declaration
+
+ * gear2.c (gear2_step): added missing static declaration
+
+ * rk4imp.c (rk4imp_step): added missing static declaration
+
+ * rk4.c (rk4_step): added missing static declaration
+
+ * rk2imp.c (rk2imp_step): added missing static declaration
+
+2004-12-01 Brian Gough <bjg@network-theory.co.uk>
+
+ * updated all solvers to ensure correct handling of error codes
+ from user defined functions
+
+ * test.c (rhs_xsin): added a test which includes failures of the
+ function itself and jacobian
+
+2004-11-25 Brian Gough <bjg@network-theory.co.uk>
+
+ * gear2.c (gear2_alloc): added check for non-allocation of primer,
+ and two-step error estimation
+
+2004-11-23 Brian Gough <bjg@network-theory.co.uk>
+
+ * gear1.c (gear1_apply): use 90% error bound
+
+ * rk2imp.c (rk2imp_apply): use 90% error bound
+
+ * rk2simp.c (rk2simp_apply): use 90% error bound
+
+2004-11-18 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c: new test program (Tuomo Keskitalo)
+
+2004-11-12 Brian Gough <bjg@network-theory.co.uk>
+
+ * evolve.c (gsl_odeiv_evolve_apply): check for internal stepper
+ failure (Tuomo Keskitalo)
+
+ * bsimp.c: gives exact dydt_out (Tuomo Keskitalo)
+
+ * rk2simp.c: new semi-implicit solver (Tuomo Keskitalo)
+
+ * gear1.c rkf45.c rkck.c rk8pd.c rk4imp.c rk2imp.c rk2.c rk4.c:
+ fix error estimate, exact derivatives on output (Tuomo Keskitalo)
+
+2004-05-28 Brian Gough <bjg@network-theory.co.uk>
+
+ * bsimp.c (bsimp_apply): fix prototype of function to match
+ definition in typedef by removing const on double args.
+
+Sat Aug 3 19:02:37 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * cscal.c (struct): use matlab style error control, with scalar
+ relative error and vector absolute error
+
+Wed Oct 3 13:19:28 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * evolve.c (gsl_odeiv_evolve_apply): report error if step
+ direction does not match interval direction
+
+ * cstd.c (std_control_hadjust): allow for negative step-sizes
+
+ * evolve.c (gsl_odeiv_evolve_apply): allow for integrating
+ backwards in time
+
+Sat Sep 29 21:02:36 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * bsimp.c: use the condition |D^-1 Delta| >> 1 to detect
+ singularities, as described in the paper and implemented in METAN1
+ by Deuflhard et al.
+
+ * evolve.c (gsl_odeiv_evolve_apply): reset the final_step flag
+ whenever the step size is decreased
+
+Sun Jul 1 22:42:02 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * bsimp.c: modified to use new-style vector views
+
+Fri Jun 22 11:59:24 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * evolve.c: keep track of failed step count
+
+Tue Jun 12 11:34:23 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * rkf45.c: added Runge-Kutta Fehlberg method, RKF45
+
+ * reorganized to use standard gsl conventions
+
+Mon Apr 23 10:26:22 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * unified error handling conventions to _e for error handling
+ functions and no suffix for plain functions, so _impl functions
+ are no longer needed.
+
+ * removed tests for EFAULT, since EFAULT should only apply to
+ invalid non-null pointers.
+
+2000-05-14 Steve Robbins <steve@nyongwa.montreal.qc.ca>
+
+ * Makefile.am (test_LDADD): put libgslpermutation ahead of
+ libgslvector in the link beccause the former uses
+ `gsl_check_range' which is defined in the latter.
+
+Tue Apr 11 19:59:01 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * bsimp.c (bsimp_step_local): changed gsl_la prefix to gsl_linalg,
+ new naming convention
+
+
+Fri Oct 1 15:46:13 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * bsimp.c: converted to use new-style block/vector code
+
diff --git a/gsl-1.9/ode-initval/Makefile.am b/gsl-1.9/ode-initval/Makefile.am
new file mode 100644
index 0000000..db492b5
--- /dev/null
+++ b/gsl-1.9/ode-initval/Makefile.am
@@ -0,0 +1,18 @@
+noinst_LTLIBRARIES = libgslodeiv.la
+
+pkginclude_HEADERS = gsl_odeiv.h
+
+INCLUDES= -I$(top_builddir)
+
+libgslodeiv_la_SOURCES = control.c cstd.c cscal.c evolve.c step.c rk2.c rk2imp.c rk2simp.c rk4.c rk4imp.c rkf45.c rk8pd.c rkck.c bsimp.c gear1.c gear2.c
+
+noinst_HEADERS = odeiv_util.h
+
+check_PROGRAMS = test
+
+TESTS = $(check_PROGRAMS)
+
+test_LDADD = libgslodeiv.la ../linalg/libgsllinalg.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../matrix/libgslmatrix.la ../permutation/libgslpermutation.la ../vector/libgslvector.la ../block/libgslblock.la ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+
+test_SOURCES = test.c
+
diff --git a/gsl-1.9/ode-initval/Makefile.in b/gsl-1.9/ode-initval/Makefile.in
new file mode 100644
index 0000000..b419246
--- /dev/null
+++ b/gsl-1.9/ode-initval/Makefile.in
@@ -0,0 +1,550 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = test$(EXEEXT)
+subdir = ode-initval
+DIST_COMMON = $(noinst_HEADERS) $(pkginclude_HEADERS) \
+ $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog TODO
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgslodeiv_la_LIBADD =
+am_libgslodeiv_la_OBJECTS = control.lo cstd.lo cscal.lo evolve.lo \
+ step.lo rk2.lo rk2imp.lo rk2simp.lo rk4.lo rk4imp.lo rkf45.lo \
+ rk8pd.lo rkck.lo bsimp.lo gear1.lo gear2.lo
+libgslodeiv_la_OBJECTS = $(am_libgslodeiv_la_OBJECTS)
+am_test_OBJECTS = test.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = libgslodeiv.la ../linalg/libgsllinalg.la \
+ ../blas/libgslblas.la ../cblas/libgslcblas.la \
+ ../matrix/libgslmatrix.la ../permutation/libgslpermutation.la \
+ ../vector/libgslvector.la ../block/libgslblock.la \
+ ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la \
+ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \
+ ../utils/libutils.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgslodeiv_la_SOURCES) $(test_SOURCES)
+DIST_SOURCES = $(libgslodeiv_la_SOURCES) $(test_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libgslodeiv.la
+pkginclude_HEADERS = gsl_odeiv.h
+INCLUDES = -I$(top_builddir)
+libgslodeiv_la_SOURCES = control.c cstd.c cscal.c evolve.c step.c rk2.c rk2imp.c rk2simp.c rk4.c rk4imp.c rkf45.c rk8pd.c rkck.c bsimp.c gear1.c gear2.c
+noinst_HEADERS = odeiv_util.h
+TESTS = $(check_PROGRAMS)
+test_LDADD = libgslodeiv.la ../linalg/libgsllinalg.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../matrix/libgslmatrix.la ../permutation/libgslpermutation.la ../vector/libgslvector.la ../block/libgslblock.la ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+test_SOURCES = test.c
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps ode-initval/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps ode-initval/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgslodeiv.la: $(libgslodeiv_la_OBJECTS) $(libgslodeiv_la_DEPENDENCIES)
+ $(LINK) $(libgslodeiv_la_LDFLAGS) $(libgslodeiv_la_OBJECTS) $(libgslodeiv_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkgincludeHEADERS
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/ode-initval/TODO b/gsl-1.9/ode-initval/TODO
new file mode 100644
index 0000000..b06d9a3
--- /dev/null
+++ b/gsl-1.9/ode-initval/TODO
@@ -0,0 +1,78 @@
+* Add a higher level interface which accepts a
+
+start point,
+end point,
+result array (size N, y0, y1, y2 ... ,y(N-1))
+desired relative and absolute errors epsrel and epsabs
+
+it should have its own workspace which is a wrapper around the
+existing workspaces
+
+* Implement other stepping methods from well-known packages such as
+RKSUITE, etc
+
+* Roundoff error needs to be taken into account to prevent the
+step-size being made arbitrarily small
+
+* The entry below has been downgraded from a bug. We use the
+coefficients given in the original paper by Prince and Dormand, and it
+is true that these are inexact (the values in the paper are said to be
+accurate 18 figures). If somebody publishes exact versions we will
+use them, but at present it is better to stick with the published
+versions of the coefficients them use our own.
+----------------------------------------------------------------------
+BUG#8 -- inexact coefficients in rk8pd.c
+
+From: Luc Maisonobe <Luc.Maisonobe@c-s.fr>
+To: gsl-discuss@sources.redhat.com
+Subject: further thoughts about Dormand-Prince 8 (RK8PD)
+Date: Wed, 14 Aug 2002 10:50:49 +0200
+
+I was looking for some references concerning Runge-Kutta methods when I
+noticed GSL had an high order one. I also found a question in the list
+archive (April 2002) about the references of this method which is
+implemented in rk8pd.c. It was said the coefficients were taken from the
+"Numerical Algorithms with C" book by Engeln-Mullges and Uhlig.
+
+I have checked the coefficients somewhat with a little java tool I have
+developped (see http://www.spaceroots.org/archive.htm#RKCheckSoftware)
+and found they were not exact. I think this method is really the method
+that is already in rksuite (http://www.netlib.org/ode/rksuite/) were the
+coefficients are given as real values with 30 decimal digits. The
+coefficients have probably been approximated as fractions later on.
+However, these approximations are not perfect, they are good only for
+the first 16 or 18 digits depending on the coefficient.
+
+This has no consequence for practical purposes since they are stored in
+double variables, but give a false impression of beeing exact
+expressions. Well, there are even some coefficients that should really
+be rational numbers but for which wrong numerators and denominators are
+given. As an example, the first and fourth elements of the b7 array are
+given as 29443841.0 / 614563906.0 and 77736538.0 / 692538347, hence the
+sum off all elements of the b7 array (which should theoretically be
+equal to ah[5]) only approximate this. For these two coefficients, this
+could have been avoided using 215595617.0 / 4500000000.0 and
+202047683.0 / 1800000000.0, which also looks more coherent with the
+other coefficients.
+
+The rksuite comments say this method is described in this paper :
+
+ High Order Embedded Runge-Kutta Formulae
+ P.J. Prince and J.R. Dormand
+ J. Comp. Appl. Math.,7, pp. 67-75, 1981
+
+It also says the method is an 8(7) method (i.e. the coefficients set
+used to advance integration is order 8 and error estimation is order 7).
+If I use my tool to check the order, I am forced to check the order
+conditions numerically with a tolerance since I do not have an exact
+expression of the coefficients. Since even if some conditions are not
+mathematically met, the residuals are small and could be below the
+tolerance. There are tolerance values for which such numerical test
+dedeuce the method is of order 9, as is said in GSL. However, I am not
+convinced, there are to few parameters for the large number of order
+conditions needed at order 9.
+
+I would suggest to correct the coefficients in rk8pd.c (just put the
+literal constants of rksuite) and to add the reference to the article.
+
+----------------------------------------------------------------------
diff --git a/gsl-1.9/ode-initval/bsimp.c b/gsl-1.9/ode-initval/bsimp.c
new file mode 100644
index 0000000..2355195
--- /dev/null
+++ b/gsl-1.9/ode-initval/bsimp.c
@@ -0,0 +1,567 @@
+/* ode-initval/bsimp.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Bulirsch-Stoer Implicit */
+
+/* Author: G. Jungman
+ */
+/* Bader-Deuflhard implicit extrapolative stepper.
+ * [Numer. Math., 41, 373 (1983)]
+ */
+#include <config.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_linalg.h>
+#include <gsl/gsl_odeiv.h>
+
+#include "odeiv_util.h"
+
+#define SEQUENCE_COUNT 8
+#define SEQUENCE_MAX 7
+
+/* Bader-Deuflhard extrapolation sequence */
+static const int bd_sequence[SEQUENCE_COUNT] =
+ { 2, 6, 10, 14, 22, 34, 50, 70 };
+
+typedef struct
+{
+ gsl_matrix *d; /* workspace for extrapolation */
+ gsl_matrix *a_mat; /* workspace for linear system matrix */
+ gsl_permutation *p_vec; /* workspace for LU permutation */
+
+ double x[SEQUENCE_MAX]; /* workspace for extrapolation */
+
+ /* state info */
+ size_t k_current;
+ size_t k_choice;
+ double h_next;
+ double eps;
+
+ /* workspace for extrapolation step */
+ double *yp;
+ double *y_save;
+ double *yerr_save;
+ double *y_extrap_save;
+ double *y_extrap_sequence;
+ double *extrap_work;
+ double *dfdt;
+ double *y_temp;
+ double *delta_temp;
+ double *weight;
+ gsl_matrix *dfdy;
+
+ /* workspace for the basic stepper */
+ double *rhs_temp;
+ double *delta;
+
+ /* order of last step */
+ size_t order;
+}
+bsimp_state_t;
+
+/* Compute weighting factor */
+
+static void
+compute_weights (const double y[], double w[], size_t dim)
+{
+ size_t i;
+ for (i = 0; i < dim; i++)
+ {
+ double u = fabs(y[i]);
+ w[i] = (u > 0.0) ? u : 1.0;
+ }
+}
+
+/* Calculate a choice for the "order" of the method, using the
+ * Deuflhard criteria.
+ */
+
+static size_t
+bsimp_deuf_kchoice (double eps, size_t dimension)
+{
+ const double safety_f = 0.25;
+ const double small_eps = safety_f * eps;
+
+ double a_work[SEQUENCE_COUNT];
+ double alpha[SEQUENCE_MAX][SEQUENCE_MAX];
+
+ int i, k;
+
+ a_work[0] = bd_sequence[0] + 1.0;
+
+ for (k = 0; k < SEQUENCE_MAX; k++)
+ {
+ a_work[k + 1] = a_work[k] + bd_sequence[k + 1];
+ }
+
+ for (i = 0; i < SEQUENCE_MAX; i++)
+ {
+ alpha[i][i] = 1.0;
+ for (k = 0; k < i; k++)
+ {
+ const double tmp1 = a_work[k + 1] - a_work[i + 1];
+ const double tmp2 = (a_work[i + 1] - a_work[0] + 1.0) * (2 * k + 1);
+ alpha[k][i] = pow (small_eps, tmp1 / tmp2);
+ }
+ }
+
+ a_work[0] += dimension;
+
+ for (k = 0; k < SEQUENCE_MAX; k++)
+ {
+ a_work[k + 1] = a_work[k] + bd_sequence[k + 1];
+ }
+
+ for (k = 0; k < SEQUENCE_MAX - 1; k++)
+ {
+ if (a_work[k + 2] > a_work[k + 1] * alpha[k][k + 1])
+ break;
+ }
+
+ return k;
+}
+
+static void
+poly_extrap (gsl_matrix * d,
+ const double x[],
+ const unsigned int i_step,
+ const double x_i,
+ const double y_i[],
+ double y_0[], double y_0_err[], double work[], const size_t dim)
+{
+ size_t j, k;
+
+ DBL_MEMCPY (y_0_err, y_i, dim);
+ DBL_MEMCPY (y_0, y_i, dim);
+
+ if (i_step == 0)
+ {
+ for (j = 0; j < dim; j++)
+ {
+ gsl_matrix_set (d, 0, j, y_i[j]);
+ }
+ }
+ else
+ {
+ DBL_MEMCPY (work, y_i, dim);
+
+ for (k = 0; k < i_step; k++)
+ {
+ double delta = 1.0 / (x[i_step - k - 1] - x_i);
+ const double f1 = delta * x_i;
+ const double f2 = delta * x[i_step - k - 1];
+
+ for (j = 0; j < dim; j++)
+ {
+ const double q_kj = gsl_matrix_get (d, k, j);
+ gsl_matrix_set (d, k, j, y_0_err[j]);
+ delta = work[j] - q_kj;
+ y_0_err[j] = f1 * delta;
+ work[j] = f2 * delta;
+ y_0[j] += y_0_err[j];
+ }
+ }
+
+ for (j = 0; j < dim; j++)
+ {
+ gsl_matrix_set (d, i_step, j, y_0_err[j]);
+ }
+ }
+}
+
+/* Basic implicit Bulirsch-Stoer step. Divide the step h_total into
+ * n_step smaller steps and do the Bader-Deuflhard semi-implicit
+ * iteration. */
+
+static int
+bsimp_step_local (void *vstate,
+ size_t dim,
+ const double t0,
+ const double h_total,
+ const unsigned int n_step,
+ const double y[],
+ const double yp[],
+ const double dfdt[],
+ const gsl_matrix * dfdy,
+ double y_out[],
+ const gsl_odeiv_system * sys)
+{
+ bsimp_state_t *state = (bsimp_state_t *) vstate;
+
+ gsl_matrix *const a_mat = state->a_mat;
+ gsl_permutation *const p_vec = state->p_vec;
+
+ double *const delta = state->delta;
+ double *const y_temp = state->y_temp;
+ double *const delta_temp = state->delta_temp;
+ double *const rhs_temp = state->rhs_temp;
+ double *const w = state->weight;
+
+ gsl_vector_view y_temp_vec = gsl_vector_view_array (y_temp, dim);
+ gsl_vector_view delta_temp_vec = gsl_vector_view_array (delta_temp, dim);
+ gsl_vector_view rhs_temp_vec = gsl_vector_view_array (rhs_temp, dim);
+
+ const double h = h_total / n_step;
+ double t = t0 + h;
+
+ double sum;
+
+ /* This is the factor sigma referred to in equation 3.4 of the
+ paper. A relative change in y exceeding sigma indicates a
+ runaway behavior. According to the authors suitable values for
+ sigma are >>1. I have chosen a value of 100*dim. BJG */
+
+ const double max_sum = 100.0 * dim;
+
+ int signum, status;
+ size_t i, j;
+ size_t n_inter;
+
+ /* Calculate the matrix for the linear system. */
+ for (i = 0; i < dim; i++)
+ {
+ for (j = 0; j < dim; j++)
+ {
+ gsl_matrix_set (a_mat, i, j, -h * gsl_matrix_get (dfdy, i, j));
+ }
+ gsl_matrix_set (a_mat, i, i, gsl_matrix_get (a_mat, i, i) + 1.0);
+ }
+
+ /* LU decomposition for the linear system. */
+
+ gsl_linalg_LU_decomp (a_mat, p_vec, &signum);
+
+ /* Compute weighting factors */
+
+ compute_weights (y, w, dim);
+
+ /* Initial step. */
+
+ for (i = 0; i < dim; i++)
+ {
+ y_temp[i] = h * (yp[i] + h * dfdt[i]);
+ }
+
+ gsl_linalg_LU_solve (a_mat, p_vec, &y_temp_vec.vector, &delta_temp_vec.vector);
+
+ sum = 0.0;
+
+ for (i = 0; i < dim; i++)
+ {
+ const double di = delta_temp[i];
+ delta[i] = di;
+ y_temp[i] = y[i] + di;
+ sum += fabs(di) / w[i];
+ }
+
+ if (sum > max_sum)
+ {
+ return GSL_EFAILED ;
+ }
+
+ /* Intermediate steps. */
+
+ status = GSL_ODEIV_FN_EVAL (sys, t, y_temp, y_out);
+
+ if (status)
+ {
+ return status;
+ }
+
+ for (n_inter = 1; n_inter < n_step; n_inter++)
+ {
+ for (i = 0; i < dim; i++)
+ {
+ rhs_temp[i] = h * y_out[i] - delta[i];
+ }
+
+ gsl_linalg_LU_solve (a_mat, p_vec, &rhs_temp_vec.vector, &delta_temp_vec.vector);
+
+ sum = 0.0;
+
+ for (i = 0; i < dim; i++)
+ {
+ delta[i] += 2.0 * delta_temp[i];
+ y_temp[i] += delta[i];
+ sum += fabs(delta[i]) / w[i];
+ }
+
+ if (sum > max_sum)
+ {
+ return GSL_EFAILED ;
+ }
+
+ t += h;
+
+ status = GSL_ODEIV_FN_EVAL (sys, t, y_temp, y_out);
+
+ if (status)
+ {
+ return status;
+ }
+ }
+
+
+ /* Final step. */
+
+ for (i = 0; i < dim; i++)
+ {
+ rhs_temp[i] = h * y_out[i] - delta[i];
+ }
+
+ gsl_linalg_LU_solve (a_mat, p_vec, &rhs_temp_vec.vector, &delta_temp_vec.vector);
+
+ sum = 0.0;
+
+ for (i = 0; i < dim; i++)
+ {
+ y_out[i] = y_temp[i] + delta_temp[i];
+ sum += fabs(delta_temp[i]) / w[i];
+ }
+
+ if (sum > max_sum)
+ {
+ return GSL_EFAILED ;
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+static void *
+bsimp_alloc (size_t dim)
+{
+ bsimp_state_t *state = (bsimp_state_t *) malloc (sizeof (bsimp_state_t));
+
+ state->d = gsl_matrix_alloc (SEQUENCE_MAX, dim);
+ state->a_mat = gsl_matrix_alloc (dim, dim);
+ state->p_vec = gsl_permutation_alloc (dim);
+
+ state->yp = (double *) malloc (dim * sizeof (double));
+ state->y_save = (double *) malloc (dim * sizeof (double));
+ state->yerr_save = (double *) malloc (dim * sizeof (double));
+ state->y_extrap_save = (double *) malloc (dim * sizeof (double));
+ state->y_extrap_sequence = (double *) malloc (dim * sizeof (double));
+ state->extrap_work = (double *) malloc (dim * sizeof (double));
+ state->dfdt = (double *) malloc (dim * sizeof (double));
+ state->y_temp = (double *) malloc (dim * sizeof (double));
+ state->delta_temp = (double *) malloc (dim * sizeof(double));
+ state->weight = (double *) malloc (dim * sizeof(double));
+
+ state->dfdy = gsl_matrix_alloc (dim, dim);
+
+ state->rhs_temp = (double *) malloc (dim * sizeof(double));
+ state->delta = (double *) malloc (dim * sizeof (double));
+
+ {
+ size_t k_choice = bsimp_deuf_kchoice (GSL_SQRT_DBL_EPSILON, dim); /*FIXME: choice of epsilon? */
+ state->k_choice = k_choice;
+ state->k_current = k_choice;
+ state->order = 2 * k_choice;
+ }
+
+ state->h_next = -GSL_SQRT_DBL_MAX;
+
+ return state;
+}
+
+/* Perform the basic semi-implicit extrapolation
+ * step, of size h, at a Deuflhard determined order.
+ */
+static int
+bsimp_apply (void *vstate,
+ size_t dim,
+ double t,
+ double h,
+ double y[],
+ double yerr[],
+ const double dydt_in[],
+ double dydt_out[],
+ const gsl_odeiv_system * sys)
+{
+ bsimp_state_t *state = (bsimp_state_t *) vstate;
+
+ double *const x = state->x;
+ double *const yp = state->yp;
+ double *const y_save = state->y_save;
+ double *const yerr_save = state->yerr_save;
+ double *const y_extrap_sequence = state->y_extrap_sequence;
+ double *const y_extrap_save = state->y_extrap_save;
+ double *const extrap_work = state->extrap_work;
+ double *const dfdt = state->dfdt;
+ gsl_matrix *d = state->d;
+ gsl_matrix *dfdy = state->dfdy;
+
+ const double t_local = t;
+ size_t i, k;
+
+ if (h + t_local == t_local)
+ {
+ return GSL_EUNDRFLW; /* FIXME: error condition */
+ }
+
+ DBL_MEMCPY (y_extrap_save, y, dim);
+
+ /* Save inputs */
+ DBL_MEMCPY (y_save, y, dim);
+ DBL_MEMCPY (yerr_save, yerr, dim);
+
+ /* Evaluate the derivative. */
+ if (dydt_in != NULL)
+ {
+ DBL_MEMCPY (yp, dydt_in, dim);
+ }
+ else
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t_local, y, yp);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+
+ /* Evaluate the Jacobian for the system. */
+ {
+ int s = GSL_ODEIV_JA_EVAL (sys, t_local, y, dfdy->data, dfdt);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+
+ /* Make a series of refined extrapolations,
+ * up to the specified maximum order, which
+ * was calculated based on the Deuflhard
+ * criterion upon state initialization. */
+ for (k = 0; k <= state->k_current; k++)
+ {
+ const unsigned int N = bd_sequence[k];
+ const double r = (h / N);
+ const double x_k = r * r;
+
+ int status = bsimp_step_local (state,
+ dim, t_local, h, N,
+ y_extrap_save, yp,
+ dfdt, dfdy,
+ y_extrap_sequence,
+ sys);
+
+ if (status == GSL_EFAILED)
+ {
+ /* If the local step fails, set the error to infinity in
+ order to force a reduction in the step size */
+
+ for (i = 0; i < dim; i++)
+ {
+ yerr[i] = GSL_POSINF;
+ }
+
+ break;
+ }
+
+ else if (status != GSL_SUCCESS)
+ {
+ return status;
+ }
+
+ x[k] = x_k;
+
+ poly_extrap (d, x, k, x_k, y_extrap_sequence, y, yerr, extrap_work, dim);
+ }
+
+ /* Evaluate dydt_out[]. */
+
+ if (dydt_out != NULL)
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t + h, y, dydt_out);
+
+ if (s != GSL_SUCCESS)
+ {
+ DBL_MEMCPY (y, y_save, dim);
+ DBL_MEMCPY (yerr, yerr_save, dim);
+ return s;
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+static unsigned int
+bsimp_order (void *vstate)
+{
+ bsimp_state_t *state = (bsimp_state_t *) vstate;
+ return state->order;
+}
+
+static int
+bsimp_reset (void *vstate, size_t dim)
+{
+ bsimp_state_t *state = (bsimp_state_t *) vstate;
+
+ state->h_next = 0;
+
+ DBL_ZERO_MEMSET (state->yp, dim);
+
+ return GSL_SUCCESS;
+}
+
+
+static void
+bsimp_free (void * vstate)
+{
+ bsimp_state_t *state = (bsimp_state_t *) vstate;
+
+ free (state->delta);
+ free (state->rhs_temp);
+
+ gsl_matrix_free (state->dfdy);
+
+ free (state->weight);
+ free (state->delta_temp);
+ free (state->y_temp);
+ free (state->dfdt);
+ free (state->extrap_work);
+ free (state->y_extrap_sequence);
+ free (state->y_extrap_save);
+ free (state->y_save);
+ free (state->yerr_save);
+ free (state->yp);
+
+ gsl_permutation_free (state->p_vec);
+ gsl_matrix_free (state->a_mat);
+ gsl_matrix_free (state->d);
+ free (state);
+}
+
+static const gsl_odeiv_step_type bsimp_type = {
+ "bsimp", /* name */
+ 1, /* can use dydt_in */
+ 1, /* gives exact dydt_out */
+ &bsimp_alloc,
+ &bsimp_apply,
+ &bsimp_reset,
+ &bsimp_order,
+ &bsimp_free
+};
+
+const gsl_odeiv_step_type *gsl_odeiv_step_bsimp = &bsimp_type;
diff --git a/gsl-1.9/ode-initval/control.c b/gsl-1.9/ode-initval/control.c
new file mode 100644
index 0000000..dcbff06
--- /dev/null
+++ b/gsl-1.9/ode-initval/control.c
@@ -0,0 +1,80 @@
+/* ode-initval/control.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_odeiv.h>
+
+gsl_odeiv_control *
+gsl_odeiv_control_alloc(const gsl_odeiv_control_type * T)
+{
+ gsl_odeiv_control * c =
+ (gsl_odeiv_control *) malloc(sizeof(gsl_odeiv_control));
+
+ if(c == 0)
+ {
+ GSL_ERROR_NULL ("failed to allocate space for control struct",
+ GSL_ENOMEM);
+ };
+
+ c->type = T;
+ c->state = c->type->alloc();
+
+ if (c->state == 0)
+ {
+ free (c); /* exception in constructor, avoid memory leak */
+
+ GSL_ERROR_NULL ("failed to allocate space for control state",
+ GSL_ENOMEM);
+ };
+
+ return c;
+}
+
+int
+gsl_odeiv_control_init(gsl_odeiv_control * c,
+ double eps_abs, double eps_rel,
+ double a_y, double a_dydt)
+{
+ return c->type->init (c->state, eps_abs, eps_rel, a_y, a_dydt);
+}
+
+void
+gsl_odeiv_control_free(gsl_odeiv_control * c)
+{
+ c->type->free(c->state);
+ free(c);
+}
+
+const char *
+gsl_odeiv_control_name(const gsl_odeiv_control * c)
+{
+ return c->type->name;
+}
+
+int
+gsl_odeiv_control_hadjust (gsl_odeiv_control * c, gsl_odeiv_step * s, const double y[], const double yerr[], const double dydt[], double * h)
+{
+ return c->type->hadjust(c->state, s->dimension, s->type->order(s->state),
+ y, yerr, dydt, h);
+}
diff --git a/gsl-1.9/ode-initval/cscal.c b/gsl-1.9/ode-initval/cscal.c
new file mode 100644
index 0000000..f7eea07
--- /dev/null
+++ b/gsl-1.9/ode-initval/cscal.c
@@ -0,0 +1,193 @@
+/* ode-initval/cscal.c
+ *
+ * Copyright (C) 2002 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_odeiv.h>
+
+typedef struct
+{
+ double eps_abs;
+ double eps_rel;
+ double a_y;
+ double a_dydt;
+ double * scale_abs;
+}
+sc_control_state_t;
+
+static void *
+sc_control_alloc (void)
+{
+ sc_control_state_t * s =
+ (sc_control_state_t *) malloc (sizeof(sc_control_state_t));
+
+ if (s == 0)
+ {
+ GSL_ERROR_NULL ("failed to allocate space for sc_control_state",
+ GSL_ENOMEM);
+ }
+
+ return s;
+}
+
+static int
+sc_control_init (void * vstate,
+ double eps_abs, double eps_rel, double a_y, double a_dydt)
+{
+ sc_control_state_t * s = (sc_control_state_t *) vstate;
+
+ if (eps_abs < 0)
+ {
+ GSL_ERROR ("eps_abs is negative", GSL_EINVAL);
+ }
+ else if (eps_rel < 0)
+ {
+ GSL_ERROR ("eps_rel is negative", GSL_EINVAL);
+ }
+ else if (a_y < 0)
+ {
+ GSL_ERROR ("a_y is negative", GSL_EINVAL);
+ }
+ else if (a_dydt < 0)
+ {
+ GSL_ERROR ("a_dydt is negative", GSL_EINVAL);
+ }
+
+ s->eps_rel = eps_rel;
+ s->eps_abs = eps_abs;
+ s->a_y = a_y;
+ s->a_dydt = a_dydt;
+
+ return GSL_SUCCESS;
+}
+
+static int
+sc_control_hadjust(void * vstate, size_t dim, unsigned int ord, const double y[], const double yerr[], const double yp[], double * h)
+{
+ sc_control_state_t *state = (sc_control_state_t *) vstate;
+
+ const double eps_abs = state->eps_abs;
+ const double eps_rel = state->eps_rel;
+ const double a_y = state->a_y;
+ const double a_dydt = state->a_dydt;
+ const double * scale_abs = state->scale_abs;
+
+ const double S = 0.9;
+ const double h_old = *h;
+
+ double rmax = DBL_MIN;
+ size_t i;
+
+ for(i=0; i<dim; i++) {
+ const double D0 =
+ eps_rel * (a_y * fabs(y[i]) + a_dydt * fabs(h_old * yp[i]))
+ + eps_abs * scale_abs[i];
+ const double r = fabs(yerr[i]) / fabs(D0);
+ rmax = GSL_MAX_DBL(r, rmax);
+ }
+
+ if(rmax > 1.1) {
+ /* decrease step, no more than factor of 5, but a fraction S more
+ than scaling suggests (for better accuracy) */
+ double r = S / pow(rmax, 1.0/ord);
+
+ if (r < 0.2)
+ r = 0.2;
+
+ *h = r * h_old;
+
+ return GSL_ODEIV_HADJ_DEC;
+ }
+ else if(rmax < 0.5) {
+ /* increase step, no more than factor of 5 */
+ double r = S / pow(rmax, 1.0/(ord+1.0));
+
+ if (r > 5.0)
+ r = 5.0;
+
+ if (r < 1.0) /* don't allow any decrease caused by S<1 */
+ r = 1.0;
+
+ *h = r * h_old;
+
+ return GSL_ODEIV_HADJ_INC;
+ }
+ else {
+ /* no change */
+ return GSL_ODEIV_HADJ_NIL;
+ }
+}
+
+
+static void
+sc_control_free (void * vstate)
+{
+ sc_control_state_t *state = (sc_control_state_t *) vstate;
+ free (state->scale_abs);
+ free (state);
+}
+
+static const gsl_odeiv_control_type sc_control_type =
+{"scaled", /* name */
+ &sc_control_alloc,
+ &sc_control_init,
+ &sc_control_hadjust,
+ &sc_control_free};
+
+const gsl_odeiv_control_type *gsl_odeiv_control_scaled = &sc_control_type;
+
+
+gsl_odeiv_control *
+gsl_odeiv_control_scaled_new(double eps_abs, double eps_rel,
+ double a_y, double a_dydt,
+ const double scale_abs[],
+ size_t dim)
+{
+ gsl_odeiv_control * c =
+ gsl_odeiv_control_alloc (gsl_odeiv_control_scaled);
+
+ int status = gsl_odeiv_control_init (c, eps_abs, eps_rel, a_y, a_dydt);
+
+ if (status != GSL_SUCCESS)
+ {
+ gsl_odeiv_control_free (c);
+ GSL_ERROR_NULL ("error trying to initialize control", status);
+ }
+
+ {
+ sc_control_state_t * s = (sc_control_state_t *) c->state;
+
+ s->scale_abs = (double *)malloc(dim * sizeof(double));
+
+ if (s->scale_abs == 0)
+ {
+ free (s);
+ GSL_ERROR_NULL ("failed to allocate space for scale_abs",
+ GSL_ENOMEM);
+ }
+
+ memcpy(s->scale_abs, scale_abs, dim * sizeof(double));
+ }
+
+ return c;
+}
diff --git a/gsl-1.9/ode-initval/cstd.c b/gsl-1.9/ode-initval/cstd.c
new file mode 100644
index 0000000..e4cf4a9
--- /dev/null
+++ b/gsl-1.9/ode-initval/cstd.c
@@ -0,0 +1,184 @@
+/* ode-initval/cstd.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_odeiv.h>
+
+typedef struct
+{
+ double eps_abs;
+ double eps_rel;
+ double a_y;
+ double a_dydt;
+}
+std_control_state_t;
+
+static void *
+std_control_alloc (void)
+{
+ std_control_state_t * s =
+ (std_control_state_t *) malloc (sizeof(std_control_state_t));
+
+ if (s == 0)
+ {
+ GSL_ERROR_NULL ("failed to allocate space for std_control_state",
+ GSL_ENOMEM);
+ }
+
+ return s;
+}
+
+static int
+std_control_init (void * vstate,
+ double eps_abs, double eps_rel, double a_y, double a_dydt)
+{
+ std_control_state_t * s = (std_control_state_t *) vstate;
+
+ if (eps_abs < 0)
+ {
+ GSL_ERROR ("eps_abs is negative", GSL_EINVAL);
+ }
+ else if (eps_rel < 0)
+ {
+ GSL_ERROR ("eps_rel is negative", GSL_EINVAL);
+ }
+ else if (a_y < 0)
+ {
+ GSL_ERROR ("a_y is negative", GSL_EINVAL);
+ }
+ else if (a_dydt < 0)
+ {
+ GSL_ERROR ("a_dydt is negative", GSL_EINVAL);
+ }
+
+ s->eps_rel = eps_rel;
+ s->eps_abs = eps_abs;
+ s->a_y = a_y;
+ s->a_dydt = a_dydt;
+
+ return GSL_SUCCESS;
+}
+
+static int
+std_control_hadjust(void * vstate, size_t dim, unsigned int ord, const double y[], const double yerr[], const double yp[], double * h)
+{
+ std_control_state_t *state = (std_control_state_t *) vstate;
+
+ const double eps_abs = state->eps_abs;
+ const double eps_rel = state->eps_rel;
+ const double a_y = state->a_y;
+ const double a_dydt = state->a_dydt;
+
+ const double S = 0.9;
+ const double h_old = *h;
+
+ double rmax = DBL_MIN;
+ size_t i;
+
+ for(i=0; i<dim; i++) {
+ const double D0 =
+ eps_rel * (a_y * fabs(y[i]) + a_dydt * fabs(h_old * yp[i])) + eps_abs;
+ const double r = fabs(yerr[i]) / fabs(D0);
+ rmax = GSL_MAX_DBL(r, rmax);
+ }
+
+ if(rmax > 1.1) {
+ /* decrease step, no more than factor of 5, but a fraction S more
+ than scaling suggests (for better accuracy) */
+ double r = S / pow(rmax, 1.0/ord);
+
+ if (r < 0.2)
+ r = 0.2;
+
+ *h = r * h_old;
+
+ return GSL_ODEIV_HADJ_DEC;
+ }
+ else if(rmax < 0.5) {
+ /* increase step, no more than factor of 5 */
+ double r = S / pow(rmax, 1.0/(ord+1.0));
+
+ if (r > 5.0)
+ r = 5.0;
+
+ if (r < 1.0) /* don't allow any decrease caused by S<1 */
+ r = 1.0;
+
+ *h = r * h_old;
+
+ return GSL_ODEIV_HADJ_INC;
+ }
+ else {
+ /* no change */
+ return GSL_ODEIV_HADJ_NIL;
+ }
+}
+
+
+static void
+std_control_free (void * vstate)
+{
+ std_control_state_t *state = (std_control_state_t *) vstate;
+ free (state);
+}
+
+static const gsl_odeiv_control_type std_control_type =
+{"standard", /* name */
+ &std_control_alloc,
+ &std_control_init,
+ &std_control_hadjust,
+ &std_control_free};
+
+const gsl_odeiv_control_type *gsl_odeiv_control_standard = &std_control_type;
+
+
+gsl_odeiv_control *
+gsl_odeiv_control_standard_new(double eps_abs, double eps_rel,
+ double a_y, double a_dydt)
+{
+ gsl_odeiv_control * c =
+ gsl_odeiv_control_alloc (gsl_odeiv_control_standard);
+
+ int status = gsl_odeiv_control_init (c, eps_abs, eps_rel, a_y, a_dydt);
+
+ if (status != GSL_SUCCESS)
+ {
+ gsl_odeiv_control_free (c);
+ GSL_ERROR_NULL ("error trying to initialize control", status);
+ }
+
+ return c;
+}
+
+gsl_odeiv_control *
+gsl_odeiv_control_y_new(double eps_abs, double eps_rel)
+{
+ return gsl_odeiv_control_standard_new(eps_abs, eps_rel, 1.0, 0.0);
+}
+
+
+gsl_odeiv_control *
+gsl_odeiv_control_yp_new(double eps_abs, double eps_rel)
+{
+ return gsl_odeiv_control_standard_new(eps_abs, eps_rel, 0.0, 1.0);
+}
diff --git a/gsl-1.9/ode-initval/evolve.c b/gsl-1.9/ode-initval/evolve.c
new file mode 100644
index 0000000..668ee9a
--- /dev/null
+++ b/gsl-1.9/ode-initval/evolve.c
@@ -0,0 +1,217 @@
+/* ode-initval/evolve.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman
+ */
+#include <config.h>
+#include <string.h>
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_odeiv.h>
+
+#include "odeiv_util.h"
+
+gsl_odeiv_evolve *
+gsl_odeiv_evolve_alloc (size_t dim)
+{
+ gsl_odeiv_evolve *e =
+ (gsl_odeiv_evolve *) malloc (sizeof (gsl_odeiv_evolve));
+
+ if (e == 0)
+ {
+ GSL_ERROR_NULL ("failed to allocate space for evolve struct",
+ GSL_ENOMEM);
+ }
+
+ e->y0 = (double *) malloc (dim * sizeof (double));
+
+ if (e->y0 == 0)
+ {
+ free (e);
+ GSL_ERROR_NULL ("failed to allocate space for y0", GSL_ENOMEM);
+ }
+
+ e->yerr = (double *) malloc (dim * sizeof (double));
+
+ if (e->yerr == 0)
+ {
+ free (e->y0);
+ free (e);
+ GSL_ERROR_NULL ("failed to allocate space for yerr", GSL_ENOMEM);
+ }
+
+ e->dydt_in = (double *) malloc (dim * sizeof (double));
+
+ if (e->dydt_in == 0)
+ {
+ free (e->yerr);
+ free (e->y0);
+ free (e);
+ GSL_ERROR_NULL ("failed to allocate space for dydt_in", GSL_ENOMEM);
+ }
+
+ e->dydt_out = (double *) malloc (dim * sizeof (double));
+
+ if (e->dydt_out == 0)
+ {
+ free (e->dydt_in);
+ free (e->yerr);
+ free (e->y0);
+ free (e);
+ GSL_ERROR_NULL ("failed to allocate space for dydt_out", GSL_ENOMEM);
+ }
+
+ e->dimension = dim;
+ e->count = 0;
+ e->failed_steps = 0;
+ e->last_step = 0.0;
+
+ return e;
+}
+
+int
+gsl_odeiv_evolve_reset (gsl_odeiv_evolve * e)
+{
+ e->count = 0;
+ e->failed_steps = 0;
+ e->last_step = 0.0;
+ return GSL_SUCCESS;
+}
+
+void
+gsl_odeiv_evolve_free (gsl_odeiv_evolve * e)
+{
+ free (e->dydt_out);
+ free (e->dydt_in);
+ free (e->yerr);
+ free (e->y0);
+ free (e);
+}
+
+/* Evolution framework method.
+ *
+ * Uses an adaptive step control object
+ */
+int
+gsl_odeiv_evolve_apply (gsl_odeiv_evolve * e,
+ gsl_odeiv_control * con,
+ gsl_odeiv_step * step,
+ const gsl_odeiv_system * dydt,
+ double *t, double t1, double *h, double y[])
+{
+ const double t0 = *t;
+ double h0 = *h;
+ int step_status;
+ int final_step = 0;
+ double dt = t1 - t0; /* remaining time, possibly less than h */
+
+ if (e->dimension != step->dimension)
+ {
+ GSL_ERROR ("step dimension must match evolution size", GSL_EINVAL);
+ }
+
+ if ((dt < 0.0 && h0 > 0.0) || (dt > 0.0 && h0 < 0.0))
+ {
+ GSL_ERROR ("step direction must match interval direction", GSL_EINVAL);
+ }
+
+ /* No need to copy if we cannot control the step size. */
+
+ if (con != NULL)
+ {
+ DBL_MEMCPY (e->y0, y, e->dimension);
+ }
+
+ /* Calculate initial dydt once if the method can benefit. */
+
+ if (step->type->can_use_dydt_in)
+ {
+ int status = GSL_ODEIV_FN_EVAL (dydt, t0, y, e->dydt_in);
+
+ if (status)
+ {
+ return status;
+ }
+ }
+
+try_step:
+
+ if ((dt >= 0.0 && h0 > dt) || (dt < 0.0 && h0 < dt))
+ {
+ h0 = dt;
+ final_step = 1;
+ }
+ else
+ {
+ final_step = 0;
+ }
+
+ if (step->type->can_use_dydt_in)
+ {
+ step_status =
+ gsl_odeiv_step_apply (step, t0, h0, y, e->yerr, e->dydt_in,
+ e->dydt_out, dydt);
+ }
+ else
+ {
+ step_status =
+ gsl_odeiv_step_apply (step, t0, h0, y, e->yerr, NULL, e->dydt_out,
+ dydt);
+ }
+
+ /* Check for stepper internal failure */
+
+ if (step_status != GSL_SUCCESS)
+ {
+ *h = h0; /* notify user of step-size which caused the failure */
+ return step_status;
+ }
+
+ e->count++;
+ e->last_step = h0;
+
+ if (final_step)
+ {
+ *t = t1;
+ }
+ else
+ {
+ *t = t0 + h0;
+ }
+
+ if (con != NULL)
+ {
+ /* Check error and attempt to adjust the step. */
+ const int hadjust_status
+ = gsl_odeiv_control_hadjust (con, step, y, e->yerr, e->dydt_out, &h0);
+
+ if (hadjust_status == GSL_ODEIV_HADJ_DEC)
+ {
+ /* Step was decreased. Undo and go back to try again. */
+ DBL_MEMCPY (y, e->y0, dydt->dimension);
+ e->failed_steps++;
+ goto try_step;
+ }
+ }
+
+ *h = h0; /* suggest step size for next time-step */
+
+ return step_status;
+}
diff --git a/gsl-1.9/ode-initval/gear1.c b/gsl-1.9/ode-initval/gear1.c
new file mode 100644
index 0000000..1cb58aa
--- /dev/null
+++ b/gsl-1.9/ode-initval/gear1.c
@@ -0,0 +1,272 @@
+/* ode-initval/gear1.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Gear 1. This is the implicit Euler a.k.a backward Euler method. */
+
+/* Author: G. Jungman
+ */
+
+/* Error estimation by step doubling, see eg. Ascher, U.M., Petzold,
+ L.R., Computer methods for ordinary differential and
+ differential-algebraic equations, SIAM, Philadelphia, 1998.
+ The method is also described in eg. this reference.
+*/
+
+#include <config.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_odeiv.h>
+
+#include "odeiv_util.h"
+
+typedef struct
+{
+ double *k;
+ double *y0;
+ double *y0_orig;
+ double *y_onestep;
+}
+gear1_state_t;
+
+static void *
+gear1_alloc (size_t dim)
+{
+ gear1_state_t *state = (gear1_state_t *) malloc (sizeof (gear1_state_t));
+
+ if (state == 0)
+ {
+ GSL_ERROR_NULL ("failed to allocate space for gear1_state", GSL_ENOMEM);
+ }
+
+ state->k = (double *) malloc (dim * sizeof (double));
+
+ if (state->k == 0)
+ {
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for k", GSL_ENOMEM);
+ }
+
+ state->y0 = (double *) malloc (dim * sizeof (double));
+
+ if (state->y0 == 0)
+ {
+ free (state->k);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for y0", GSL_ENOMEM);
+ }
+
+ state->y0_orig = (double *) malloc (dim * sizeof (double));
+
+ if (state->y0_orig == 0)
+ {
+ free (state->y0);
+ free (state->k);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for y0_orig", GSL_ENOMEM);
+ }
+
+ state->y_onestep = (double *) malloc (dim * sizeof (double));
+
+ if (state->y_onestep == 0)
+ {
+ free (state->y0_orig);
+ free (state->y0);
+ free (state->k);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for y_onestep", GSL_ENOMEM);
+ }
+
+ return state;
+}
+
+static int
+gear1_step (double *y, gear1_state_t *state,
+ const double h, const double t,
+ const size_t dim, const gsl_odeiv_system *sys)
+{
+ /* Makes an implicit Euler advance with step size h.
+ y0 is the initial values of variables y.
+
+ The implicit matrix equations to solve are:
+
+ k = y0 + h * f(t + h, k)
+
+ y = y0 + h * f(t + h, k)
+ */
+
+ const int iter_steps = 3;
+ int nu;
+ size_t i;
+ double *y0 = state->y0;
+ double *k = state->k;
+
+ /* Iterative solution of k = y0 + h * f(t + h, k)
+
+ Note: This method does not check for convergence of the
+ iterative solution!
+ */
+
+ for (nu = 0; nu < iter_steps; nu++)
+ {
+ int s = GSL_ODEIV_FN_EVAL(sys, t + h, y, k);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+
+ for (i=0; i<dim; i++)
+ {
+ y[i] = y0[i] + h * k[i];
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+static int
+gear1_apply(void * vstate,
+ size_t dim,
+ double t,
+ double h,
+ double y[],
+ double yerr[],
+ const double dydt_in[],
+ double dydt_out[],
+ const gsl_odeiv_system * sys)
+{
+ gear1_state_t *state = (gear1_state_t *) vstate;
+
+ size_t i;
+
+ double *y0 = state->y0;
+ double *y0_orig = state->y0_orig;
+ double *y_onestep = state->y_onestep;
+
+ /* initialization */
+ DBL_MEMCPY(y0, y, dim);
+
+ /* Save initial values for possible failures */
+ DBL_MEMCPY (y0_orig, y, dim);
+
+ /* First traverse h with one step (save to y_onestep) */
+ DBL_MEMCPY (y_onestep, y, dim);
+
+ {
+ int s = gear1_step (y_onestep, state, h, t, dim, sys);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+
+ /* Then with two steps with half step length (save to y) */
+ {
+ int s = gear1_step (y, state, h / 2.0, t, dim, sys);
+
+ if (s != GSL_SUCCESS)
+ {
+ /* Restore original y vector */
+ DBL_MEMCPY (y, y0_orig, dim);
+ return s;
+ }
+ }
+
+ DBL_MEMCPY (y0, y, dim);
+
+ {
+ int s = gear1_step (y, state, h / 2.0, t + h / 2.0, dim, sys);
+
+ if (s != GSL_SUCCESS)
+ {
+ /* Restore original y vector */
+ DBL_MEMCPY (y, y0_orig, dim);
+ return s;
+ }
+ }
+
+ /* Cleanup update */
+
+ if (dydt_out != NULL)
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t + h, y, dydt_out);
+
+ if (s != GSL_SUCCESS)
+ {
+ /* Restore original y vector */
+ DBL_MEMCPY (y, y0_orig, dim);
+ return s;
+ }
+ }
+
+ /* Error estimation */
+
+ for (i = 0; i < dim; i++)
+ {
+ yerr[i] = 4.0 * (y[i] - y_onestep[i]);
+ }
+
+ return GSL_SUCCESS;
+}
+
+static int
+gear1_reset (void *vstate, size_t dim)
+{
+ gear1_state_t *state = (gear1_state_t *) vstate;
+
+ DBL_ZERO_MEMSET (state->y_onestep, dim);
+ DBL_ZERO_MEMSET (state->y0_orig, dim);
+ DBL_ZERO_MEMSET (state->y0, dim);
+ DBL_ZERO_MEMSET (state->k, dim);
+ return GSL_SUCCESS;
+}
+
+static unsigned int
+gear1_order (void *vstate)
+{
+ gear1_state_t *state = (gear1_state_t *) vstate;
+ state = 0; /* prevent warnings about unused parameters */
+ return 1;
+}
+
+static void
+gear1_free (void *vstate)
+{
+ gear1_state_t *state = (gear1_state_t *) vstate;
+ free (state->y_onestep);
+ free (state->y0_orig);
+ free (state->y0);
+ free (state->k);
+ free (state);
+}
+
+static const gsl_odeiv_step_type gear1_type = { "gear1", /* name */
+ 0, /* can use dydt_in? */
+ 1, /* gives exact dydt_out? */
+ &gear1_alloc,
+ &gear1_apply,
+ &gear1_reset,
+ &gear1_order,
+ &gear1_free
+};
+
+const gsl_odeiv_step_type *gsl_odeiv_step_gear1 = &gear1_type;
diff --git a/gsl-1.9/ode-initval/gear2.c b/gsl-1.9/ode-initval/gear2.c
new file mode 100644
index 0000000..e1afe21
--- /dev/null
+++ b/gsl-1.9/ode-initval/gear2.c
@@ -0,0 +1,343 @@
+/* ode-initval/gear2.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Gear 2 */
+
+/* Author: G. Jungman
+ */
+#include <config.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include "odeiv_util.h"
+#include <gsl/gsl_odeiv.h>
+
+
+/* gear2 state object */
+typedef struct
+{
+ int primed; /* flag indicating that yim1 is ready */
+ double t_primed; /* system was primed for this value of t */
+ double last_h; /* last step size */
+ gsl_odeiv_step *primer; /* stepper to use for priming */
+ double *yim1; /* y_{i-1} */
+ double *k; /* work space */
+ double *y0; /* work space */
+ double *y0_orig;
+ double *y_onestep;
+ int stutter;
+}
+gear2_state_t;
+
+static void *
+gear2_alloc (size_t dim)
+{
+ gear2_state_t *state = (gear2_state_t *) malloc (sizeof (gear2_state_t));
+
+ if (state == 0)
+ {
+ GSL_ERROR_NULL ("failed to allocate space for gear2_state", GSL_ENOMEM);
+ }
+
+ state->yim1 = (double *) malloc (dim * sizeof (double));
+
+ if (state->yim1 == 0)
+ {
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for yim1", GSL_ENOMEM);
+ }
+
+ state->k = (double *) malloc (dim * sizeof (double));
+
+ if (state->k == 0)
+ {
+ free (state->yim1);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for k", GSL_ENOMEM);
+ }
+
+ state->y0 = (double *) malloc (dim * sizeof (double));
+
+ if (state->y0 == 0)
+ {
+ free (state->k);
+ free (state->yim1);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for y0", GSL_ENOMEM);
+ }
+
+ state->y0_orig = (double *) malloc (dim * sizeof (double));
+
+ if (state->y0_orig == 0)
+ {
+ free (state->y0);
+ free (state->k);
+ free (state->yim1);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for y0_orig", GSL_ENOMEM);
+ }
+
+ state->y_onestep = (double *) malloc (dim * sizeof (double));
+
+ if (state->y_onestep == 0)
+ {
+ free (state->y0_orig);
+ free (state->y0);
+ free (state->k);
+ free (state->yim1);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for y0_orig", GSL_ENOMEM);
+ }
+
+ state->primed = 0;
+ state->primer = gsl_odeiv_step_alloc (gsl_odeiv_step_rk4imp, dim);
+
+ if (state->primer == 0)
+ {
+ free (state->y_onestep);
+ free (state->y0_orig);
+ free (state->y0);
+ free (state->k);
+ free (state->yim1);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for primer", GSL_ENOMEM);
+ }
+
+ state->last_h = 0.0;
+
+ return state;
+}
+
+static int
+gear2_step (double *y, gear2_state_t * state,
+ const double h, const double t,
+ const size_t dim, const gsl_odeiv_system * sys)
+{
+ /* Makes a Gear2 advance with step size h.
+ y0 is the initial values of variables y.
+ The implicit matrix equations to solve are:
+ k = y0 + h * f(t + h, k)
+ y = y0 + h * f(t + h, k)
+ */
+
+ const int iter_steps = 3;
+ int nu;
+ size_t i;
+ double *y0 = state->y0;
+ double *yim1 = state->yim1;
+ double *k = state->k;
+
+ /* Iterative solution of k = y0 + h * f(t + h, k)
+ Note: This method does not check for convergence of the
+ iterative solution!
+ */
+
+ for (nu = 0; nu < iter_steps; nu++)
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t + h, y, k);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+
+ for (i = 0; i < dim; i++)
+ {
+ y[i] = ((4.0 * y0[i] - yim1[i]) + 2.0 * h * k[i]) / 3.0;
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+static int
+gear2_apply (void *vstate,
+ size_t dim,
+ double t,
+ double h,
+ double y[],
+ double yerr[],
+ const double dydt_in[],
+ double dydt_out[], const gsl_odeiv_system * sys)
+{
+ gear2_state_t *state = (gear2_state_t *) vstate;
+
+ state->stutter = 0;
+
+ if (state->primed == 0 || t == state->t_primed || h != state->last_h)
+ {
+ /* Execute a single-step method to prime the process. Note that
+ * we do this if the step size changes, so frequent step size
+ * changes will cause the method to stutter.
+ *
+ * Note that we reuse this method if the time has not changed,
+ * which can occur when the adaptive driver is attempting to find
+ * an appropriate step-size on its first iteration */
+
+ int status;
+ DBL_MEMCPY (state->yim1, y, dim);
+
+ status =
+ gsl_odeiv_step_apply (state->primer, t, h, y, yerr, dydt_in, dydt_out,
+ sys);
+
+ /* Make note of step size and indicate readiness for a Gear step. */
+
+ state->primed = 1;
+ state->t_primed = t;
+ state->last_h = h;
+ state->stutter = 1;
+
+ return status;
+ }
+ else
+ {
+ /* We have a previous y value in the buffer, and the step
+ * sizes match, so we go ahead with the Gear step.
+ */
+
+ double *const k = state->k;
+ double *const y0 = state->y0;
+ double *const y0_orig = state->y0_orig;
+ double *const yim1 = state->yim1;
+ double *y_onestep = state->y_onestep;
+
+ int s;
+ size_t i;
+
+ DBL_MEMCPY (y0, y, dim);
+
+ /* iterative solution */
+
+ if (dydt_out != NULL)
+ {
+ DBL_MEMCPY (k, dydt_out, dim);
+ }
+
+ /* First traverse h with one step (save to y_onestep) */
+
+ DBL_MEMCPY (y_onestep, y, dim);
+
+ s = gear2_step (y_onestep, state, h, t, dim, sys);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+
+ /* Then with two steps with half step length (save to y) */
+
+ s = gear2_step (y, state, h / 2.0, t, dim, sys);
+
+ if (s != GSL_SUCCESS)
+ {
+ /* Restore original y vector */
+ DBL_MEMCPY (y, y0_orig, dim);
+ return s;
+ }
+
+ DBL_MEMCPY (y0, y, dim);
+
+ s = gear2_step (y, state, h / 2.0, t + h / 2.0, dim, sys);
+
+ if (s != GSL_SUCCESS)
+ {
+ /* Restore original y vector */
+ DBL_MEMCPY (y, y0_orig, dim);
+ return s;
+ }
+
+ /* Cleanup update */
+
+ if (dydt_out != NULL)
+ {
+ s = GSL_ODEIV_FN_EVAL (sys, t + h, y, dydt_out);
+
+ if (s != GSL_SUCCESS)
+ {
+ /* Restore original y vector */
+ DBL_MEMCPY (y, y0_orig, dim);
+ return s;
+ }
+ }
+
+ /* Estimate error and update the state buffer. */
+
+ for (i = 0; i < dim; i++)
+ {
+ yerr[i] = 4.0 * (y[i] - y_onestep[i]);
+ yim1[i] = y0[i];
+ }
+
+ /* Make note of step size. */
+ state->last_h = h;
+
+ return 0;
+ }
+}
+
+static int
+gear2_reset (void *vstate, size_t dim)
+{
+ gear2_state_t *state = (gear2_state_t *) vstate;
+
+ DBL_ZERO_MEMSET (state->yim1, dim);
+ DBL_ZERO_MEMSET (state->k, dim);
+ DBL_ZERO_MEMSET (state->y0, dim);
+
+ state->primed = 0;
+ state->last_h = 0.0;
+ return GSL_SUCCESS;
+}
+
+static unsigned int
+gear2_order (void *vstate)
+{
+ gear2_state_t *state = (gear2_state_t *) vstate;
+ state = 0; /* prevent warnings about unused parameters */
+ return 3;
+}
+
+static void
+gear2_free (void *vstate)
+{
+ gear2_state_t *state = (gear2_state_t *) vstate;
+
+ free (state->yim1);
+ free (state->k);
+ free (state->y0);
+ free (state->y0_orig);
+ free (state->y_onestep);
+ gsl_odeiv_step_free (state->primer);
+
+ free (state);
+}
+
+static const gsl_odeiv_step_type gear2_type = { "gear2", /* name */
+ 1, /* can use dydt_in */
+ 0, /* gives exact dydt_out */
+ &gear2_alloc,
+ &gear2_apply,
+ &gear2_reset,
+ &gear2_order,
+ &gear2_free
+};
+
+const gsl_odeiv_step_type *gsl_odeiv_step_gear2 = &gear2_type;
diff --git a/gsl-1.9/ode-initval/gsl_odeiv.h b/gsl-1.9/ode-initval/gsl_odeiv.h
new file mode 100644
index 0000000..7d11cc4
--- /dev/null
+++ b/gsl-1.9/ode-initval/gsl_odeiv.h
@@ -0,0 +1,230 @@
+/* ode-initval/gsl_odeiv.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman
+ */
+#ifndef __GSL_ODEIV_H__
+#define __GSL_ODEIV_H__
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <gsl/gsl_types.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+
+/* Description of a system of ODEs.
+ *
+ * y' = f(t,y) = dydt(t, y)
+ *
+ * The system is specified by giving the right-hand-side
+ * of the equation and possibly a jacobian function.
+ *
+ * Some methods require the jacobian function, which calculates
+ * the matrix dfdy and the vector dfdt. The matrix dfdy conforms
+ * to the GSL standard, being a continuous range of floating point
+ * values, in row-order.
+ *
+ * As with GSL function objects, user-supplied parameter
+ * data is also present.
+ */
+
+typedef struct
+{
+ int (* function) (double t, const double y[], double dydt[], void * params);
+ int (* jacobian) (double t, const double y[], double * dfdy, double dfdt[], void * params);
+ size_t dimension;
+ void * params;
+}
+gsl_odeiv_system;
+
+#define GSL_ODEIV_FN_EVAL(S,t,y,f) (*((S)->function))(t,y,f,(S)->params)
+#define GSL_ODEIV_JA_EVAL(S,t,y,dfdy,dfdt) (*((S)->jacobian))(t,y,dfdy,dfdt,(S)->params)
+
+
+/* General stepper object.
+ *
+ * Opaque object for stepping an ODE system from t to t+h.
+ * In general the object has some state which facilitates
+ * iterating the stepping operation.
+ */
+
+typedef struct
+{
+ const char * name;
+ int can_use_dydt_in;
+ int gives_exact_dydt_out;
+ void * (*alloc) (size_t dim);
+ int (*apply) (void * state, size_t dim, double t, double h, double y[], double yerr[], const double dydt_in[], double dydt_out[], const gsl_odeiv_system * dydt);
+ int (*reset) (void * state, size_t dim);
+ unsigned int (*order) (void * state);
+ void (*free) (void * state);
+}
+gsl_odeiv_step_type;
+
+typedef struct {
+ const gsl_odeiv_step_type * type;
+ size_t dimension;
+ void * state;
+}
+gsl_odeiv_step;
+
+
+/* Available stepper types.
+ *
+ * rk2 : embedded 2nd(3rd) Runge-Kutta
+ * rk4 : 4th order (classical) Runge-Kutta
+ * rkck : embedded 4th(5th) Runge-Kutta, Cash-Karp
+ * rk8pd : embedded 8th(9th) Runge-Kutta, Prince-Dormand
+ * rk2imp : implicit 2nd order Runge-Kutta at Gaussian points
+ * rk4imp : implicit 4th order Runge-Kutta at Gaussian points
+ * gear1 : M=1 implicit Gear method
+ * gear2 : M=2 implicit Gear method
+ */
+
+GSL_VAR const gsl_odeiv_step_type *gsl_odeiv_step_rk2;
+GSL_VAR const gsl_odeiv_step_type *gsl_odeiv_step_rk4;
+GSL_VAR const gsl_odeiv_step_type *gsl_odeiv_step_rkf45;
+GSL_VAR const gsl_odeiv_step_type *gsl_odeiv_step_rkck;
+GSL_VAR const gsl_odeiv_step_type *gsl_odeiv_step_rk8pd;
+GSL_VAR const gsl_odeiv_step_type *gsl_odeiv_step_rk2imp;
+GSL_VAR const gsl_odeiv_step_type *gsl_odeiv_step_rk2simp;
+GSL_VAR const gsl_odeiv_step_type *gsl_odeiv_step_rk4imp;
+GSL_VAR const gsl_odeiv_step_type *gsl_odeiv_step_bsimp;
+GSL_VAR const gsl_odeiv_step_type *gsl_odeiv_step_gear1;
+GSL_VAR const gsl_odeiv_step_type *gsl_odeiv_step_gear2;
+
+
+/* Constructor for specialized stepper objects.
+ */
+gsl_odeiv_step * gsl_odeiv_step_alloc(const gsl_odeiv_step_type * T, size_t dim);
+int gsl_odeiv_step_reset(gsl_odeiv_step * s);
+void gsl_odeiv_step_free(gsl_odeiv_step * s);
+
+/* General stepper object methods.
+ */
+const char * gsl_odeiv_step_name(const gsl_odeiv_step *);
+unsigned int gsl_odeiv_step_order(const gsl_odeiv_step * s);
+
+int gsl_odeiv_step_apply(gsl_odeiv_step *, double t, double h, double y[], double yerr[], const double dydt_in[], double dydt_out[], const gsl_odeiv_system * dydt);
+
+/* General step size control object.
+ *
+ * The hadjust() method controls the adjustment of
+ * step size given the result of a step and the error.
+ * Valid hadjust() methods must return one of the codes below.
+ *
+ * The general data can be used by specializations
+ * to store state and control their heuristics.
+ */
+
+typedef struct
+{
+ const char * name;
+ void * (*alloc) (void);
+ int (*init) (void * state, double eps_abs, double eps_rel, double a_y, double a_dydt);
+ int (*hadjust) (void * state, size_t dim, unsigned int ord, const double y[], const double yerr[], const double yp[], double * h);
+ void (*free) (void * state);
+}
+gsl_odeiv_control_type;
+
+typedef struct
+{
+ const gsl_odeiv_control_type * type;
+ void * state;
+}
+gsl_odeiv_control;
+
+/* Possible return values for an hadjust() evolution method.
+ */
+#define GSL_ODEIV_HADJ_INC 1 /* step was increased */
+#define GSL_ODEIV_HADJ_NIL 0 /* step unchanged */
+#define GSL_ODEIV_HADJ_DEC (-1) /* step decreased */
+
+gsl_odeiv_control * gsl_odeiv_control_alloc(const gsl_odeiv_control_type * T);
+int gsl_odeiv_control_init(gsl_odeiv_control * c, double eps_abs, double eps_rel, double a_y, double a_dydt);
+void gsl_odeiv_control_free(gsl_odeiv_control * c);
+int gsl_odeiv_control_hadjust (gsl_odeiv_control * c, gsl_odeiv_step * s, const double y[], const double yerr[], const double dydt[], double * h);
+const char * gsl_odeiv_control_name(const gsl_odeiv_control * c);
+
+/* Available control object constructors.
+ *
+ * The standard control object is a four parameter heuristic
+ * defined as follows:
+ * D0 = eps_abs + eps_rel * (a_y |y| + a_dydt h |y'|)
+ * D1 = |yerr|
+ * q = consistency order of method (q=4 for 4(5) embedded RK)
+ * S = safety factor (0.9 say)
+ *
+ * / (D0/D1)^(1/(q+1)) D0 >= D1
+ * h_NEW = S h_OLD * |
+ * \ (D0/D1)^(1/q) D0 < D1
+ *
+ * This encompasses all the standard error scaling methods.
+ *
+ * The y method is the standard method with a_y=1, a_dydt=0.
+ * The yp method is the standard method with a_y=0, a_dydt=1.
+ */
+
+gsl_odeiv_control * gsl_odeiv_control_standard_new(double eps_abs, double eps_rel, double a_y, double a_dydt);
+gsl_odeiv_control * gsl_odeiv_control_y_new(double eps_abs, double eps_rel);
+gsl_odeiv_control * gsl_odeiv_control_yp_new(double eps_abs, double eps_rel);
+
+/* This controller computes errors using different absolute errors for
+ * each component
+ *
+ * D0 = eps_abs * scale_abs[i] + eps_rel * (a_y |y| + a_dydt h |y'|)
+ */
+gsl_odeiv_control * gsl_odeiv_control_scaled_new(double eps_abs, double eps_rel, double a_y, double a_dydt, const double scale_abs[], size_t dim);
+
+/* General evolution object.
+ */
+typedef struct {
+ size_t dimension;
+ double * y0;
+ double * yerr;
+ double * dydt_in;
+ double * dydt_out;
+ double last_step;
+ unsigned long int count;
+ unsigned long int failed_steps;
+}
+gsl_odeiv_evolve;
+
+/* Evolution object methods.
+ */
+gsl_odeiv_evolve * gsl_odeiv_evolve_alloc(size_t dim);
+int gsl_odeiv_evolve_apply(gsl_odeiv_evolve *, gsl_odeiv_control * con, gsl_odeiv_step * step, const gsl_odeiv_system * dydt, double * t, double t1, double * h, double y[]);
+int gsl_odeiv_evolve_reset(gsl_odeiv_evolve *);
+void gsl_odeiv_evolve_free(gsl_odeiv_evolve *);
+
+
+__END_DECLS
+
+#endif /* __GSL_ODEIV_H__ */
diff --git a/gsl-1.9/ode-initval/odeiv_util.h b/gsl-1.9/ode-initval/odeiv_util.h
new file mode 100644
index 0000000..5288b35
--- /dev/null
+++ b/gsl-1.9/ode-initval/odeiv_util.h
@@ -0,0 +1,2 @@
+#define DBL_MEMCPY(dest,src,n) memcpy((dest),(src),(n)*sizeof(double))
+#define DBL_ZERO_MEMSET(dest,n) memset((dest),0,(n)*sizeof(double))
diff --git a/gsl-1.9/ode-initval/rk2.c b/gsl-1.9/ode-initval/rk2.c
new file mode 100644
index 0000000..e7696d1
--- /dev/null
+++ b/gsl-1.9/ode-initval/rk2.c
@@ -0,0 +1,250 @@
+/* ode-initval/rk2.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Runge-Kutta 2(3), Euler-Cauchy */
+
+/* Author: G. Jungman
+ */
+
+/* Reference: Abramowitz & Stegun, section 25.5. Runge-Kutta 2nd (25.5.7)
+ and 3rd (25.5.8) order methods */
+
+#include <config.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_odeiv.h>
+
+#include "odeiv_util.h"
+
+typedef struct
+{
+ double *k1;
+ double *k2;
+ double *k3;
+ double *ytmp;
+}
+rk2_state_t;
+
+static void *
+rk2_alloc (size_t dim)
+{
+ rk2_state_t *state = (rk2_state_t *) malloc (sizeof (rk2_state_t));
+
+ if (state == 0)
+ {
+ GSL_ERROR_NULL ("failed to allocate space for rk2_state", GSL_ENOMEM);
+ }
+
+ state->k1 = (double *) malloc (dim * sizeof (double));
+
+ if (state->k1 == 0)
+ {
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for k1", GSL_ENOMEM);
+ }
+
+ state->k2 = (double *) malloc (dim * sizeof (double));
+
+ if (state->k2 == 0)
+ {
+ free (state->k1);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for k2", GSL_ENOMEM);
+ }
+
+ state->k3 = (double *) malloc (dim * sizeof (double));
+
+ if (state->k3 == 0)
+ {
+ free (state->k2);
+ free (state->k1);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for k2", GSL_ENOMEM);
+ }
+
+ state->ytmp = (double *) malloc (dim * sizeof (double));
+
+ if (state->ytmp == 0)
+ {
+ free (state->k3);
+ free (state->k2);
+ free (state->k1);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for k2", GSL_ENOMEM);
+ }
+
+ return state;
+}
+
+
+static int
+rk2_apply (void *vstate,
+ size_t dim,
+ double t,
+ double h,
+ double y[],
+ double yerr[],
+ const double dydt_in[],
+ double dydt_out[],
+ const gsl_odeiv_system * sys)
+{
+ rk2_state_t *state = (rk2_state_t *) vstate;
+
+ size_t i;
+
+ double *const k1 = state->k1;
+ double *const k2 = state->k2;
+ double *const k3 = state->k3;
+ double *const ytmp = state->ytmp;
+
+ /* k1 step */
+ /* k1 = f(t,y) */
+
+ if (dydt_in != NULL)
+ {
+ DBL_MEMCPY (k1, dydt_in, dim);
+ }
+ else
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t, y, k1);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+
+ /* k2 step */
+ /* k2 = f(t + 0.5*h, y + 0.5*k1) */
+
+ for (i = 0; i < dim; i++)
+ {
+ ytmp[i] = y[i] + 0.5 * h * k1[i];
+ }
+
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t + 0.5 * h, ytmp, k2);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+
+ /* k3 step */
+ /* for 3rd order estimates, is used for error estimation
+ k3 = f(t + h, y - k1 + 2*k2) */
+
+ for (i = 0; i < dim; i++)
+ {
+ ytmp[i] = y[i] + h * (-k1[i] + 2.0 * k2[i]);
+ }
+
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t + h, ytmp, k3);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+
+ /* final sum */
+
+ for (i = 0; i < dim; i++)
+ {
+ /* Save original values if derivative evaluation below fails */
+ ytmp[i] = y[i];
+
+ {
+ const double ksum3 = (k1[i] + 4.0 * k2[i] + k3[i]) / 6.0;
+ y[i] += h * ksum3;
+ }
+ }
+
+ /* Derivatives at output */
+
+ if (dydt_out != NULL)
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t + h, y, dydt_out);
+
+ if (s != GSL_SUCCESS)
+ {
+ /* Restore original values */
+ DBL_MEMCPY (y, ytmp, dim);
+
+ return s;
+ }
+ }
+
+ /* Error estimation */
+
+ for (i = 0; i < dim; i++)
+ {
+ const double ksum3 = (k1[i] + 4.0 * k2[i] + k3[i]) / 6.0;
+ yerr[i] = h * (k2[i] - ksum3);
+ }
+
+ return GSL_SUCCESS;
+}
+
+static int
+rk2_reset (void *vstate, size_t dim)
+{
+ rk2_state_t *state = (rk2_state_t *) vstate;
+
+ DBL_ZERO_MEMSET (state->k1, dim);
+ DBL_ZERO_MEMSET (state->k2, dim);
+ DBL_ZERO_MEMSET (state->k3, dim);
+ DBL_ZERO_MEMSET (state->ytmp, dim);
+
+ return GSL_SUCCESS;
+}
+
+static unsigned int
+rk2_order (void *vstate)
+{
+ rk2_state_t *state = (rk2_state_t *) vstate;
+ state = 0; /* prevent warnings about unused parameters */
+ return 2;
+}
+
+static void
+rk2_free (void *vstate)
+{
+ rk2_state_t *state = (rk2_state_t *) vstate;
+ free (state->k1);
+ free (state->k2);
+ free (state->k3);
+ free (state->ytmp);
+ free (state);
+}
+
+static const gsl_odeiv_step_type rk2_type = { "rk2", /* name */
+ 1, /* can use dydt_in */
+ 1, /* gives exact dydt_out */
+ &rk2_alloc,
+ &rk2_apply,
+ &rk2_reset,
+ &rk2_order,
+ &rk2_free
+};
+
+const gsl_odeiv_step_type *gsl_odeiv_step_rk2 = &rk2_type;
diff --git a/gsl-1.9/ode-initval/rk2imp.c b/gsl-1.9/ode-initval/rk2imp.c
new file mode 100644
index 0000000..53c31c4
--- /dev/null
+++ b/gsl-1.9/ode-initval/rk2imp.c
@@ -0,0 +1,336 @@
+/* ode-initval/rk2imp.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Runge-Kutta 2, Gaussian implicit. Also known as the implicit
+ midpoint rule. */
+
+/* Author: G. Jungman */
+
+/* Error estimation by step doubling, see eg. Ascher, U.M., Petzold,
+ L.R., Computer methods for ordinary differential and
+ differential-algebraic equations, SIAM, Philadelphia, 1998.
+ The method is also described in eg. this reference.
+*/
+
+#include <config.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_odeiv.h>
+
+#include "odeiv_util.h"
+
+typedef struct
+{
+ double *Y1;
+ double *y0;
+ double *ytmp;
+ double *y_onestep;
+ double *y0_orig;
+}
+rk2imp_state_t;
+
+static void *
+rk2imp_alloc (size_t dim)
+{
+ rk2imp_state_t *state = (rk2imp_state_t *) malloc (sizeof (rk2imp_state_t));
+
+ if (state == 0)
+ {
+ GSL_ERROR_NULL ("failed to allocate space for rk2imp_state",
+ GSL_ENOMEM);
+ }
+
+ state->Y1 = (double *) malloc (dim * sizeof (double));
+
+ if (state->Y1 == 0)
+ {
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for Y1", GSL_ENOMEM);
+ }
+
+ state->ytmp = (double *) malloc (dim * sizeof (double));
+
+ if (state->ytmp == 0)
+ {
+ free (state->Y1);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for ytmp", GSL_ENOMEM);
+ }
+
+ state->y0 = (double *) malloc (dim * sizeof (double));
+
+ if (state->y0 == 0)
+ {
+ free (state->Y1);
+ free (state->ytmp);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for y0", GSL_ENOMEM);
+ }
+
+ state->y_onestep = (double *) malloc (dim * sizeof (double));
+
+ if (state->y_onestep == 0)
+ {
+ free (state->Y1);
+ free (state->ytmp);
+ free (state->y0);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for y_onestep", GSL_ENOMEM);
+ }
+
+ state->y0_orig = (double *) malloc (dim * sizeof (double));
+
+ if (state->y0_orig == 0)
+ {
+ free (state->y_onestep);
+ free (state->Y1);
+ free (state->ytmp);
+ free (state->y0);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for y0_orig", GSL_ENOMEM);
+ }
+
+ return state;
+}
+
+static int
+rk2imp_step (double *y, rk2imp_state_t *state,
+ const double h, const double t,
+ const size_t dim, const gsl_odeiv_system *sys)
+{
+ /* Makes a Runge-Kutta 2nd order implicit advance with step size h.
+ y0 is initial values of variables y.
+
+ The implicit matrix equations to solve are:
+
+ Y1 = y0 + h/2 * f(t + h/2, Y1)
+
+ y = y0 + h * f(t + h/2, Y1)
+ */
+
+ const double *y0 = state->y0;
+ double *Y1 = state->Y1;
+ double *ytmp = state->ytmp;
+ int max_iter=3;
+ int nu;
+ size_t i;
+
+ /* iterative solution of Y1 = y0 + h/2 * f(t + h/2, Y1)
+ Y1 should include initial values at call.
+
+ Note: This method does not check for convergence of the
+ iterative solution!
+ */
+
+ for (nu = 0; nu < max_iter; nu++)
+ {
+ for (i = 0; i < dim; i++)
+ {
+ ytmp[i] = y0[i] + 0.5 * h * Y1[i];
+ }
+
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t + 0.5 * h, ytmp, Y1);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+ }
+
+ /* assignment */
+
+ for (i = 0; i < dim; i++)
+ {
+ y[i] = y0[i] + h * Y1[i];
+ }
+
+ return GSL_SUCCESS;
+}
+
+static int
+rk2imp_apply (void *vstate,
+ size_t dim,
+ double t,
+ double h,
+ double y[],
+ double yerr[],
+ const double dydt_in[],
+ double dydt_out[], const gsl_odeiv_system * sys)
+{
+ rk2imp_state_t *state = (rk2imp_state_t *) vstate;
+
+ size_t i;
+
+ double *Y1 = state->Y1;
+ double *y0 = state->y0;
+ double *y_onestep = state->y_onestep;
+ double *y0_orig = state->y0_orig;
+
+ /* Error estimation is done by step doubling procedure */
+
+ /* initialization step */
+
+ DBL_MEMCPY (y0, y, dim);
+
+ /* Save initial values for possible failures */
+ DBL_MEMCPY (y0_orig, y, dim);
+
+ if (dydt_in != NULL)
+ {
+ DBL_MEMCPY (Y1, dydt_in, dim);
+ }
+
+ else
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t, y, Y1);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+
+ /* First traverse h with one step (save to y_onestep) */
+
+ DBL_MEMCPY (y_onestep, y, dim);
+
+ {
+ int s = rk2imp_step (y_onestep, state, h, t, dim, sys);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+
+ /* Then with two steps with half step length (save to y) */
+
+ {
+ int s = rk2imp_step (y, state, h / 2.0, t, dim, sys);
+
+ if (s != GSL_SUCCESS)
+ {
+ /* Restore original y vector */
+ DBL_MEMCPY (y, y0_orig, dim);
+
+ return s;
+ }
+ }
+
+ DBL_MEMCPY (y0, y, dim);
+
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t + h / 2.0, y, Y1);
+
+ if (s != GSL_SUCCESS)
+ {
+ /* Restore original y vector */
+ DBL_MEMCPY (y, y0_orig, dim);
+
+ return s;
+ }
+ }
+
+ {
+ int s = rk2imp_step (y, state, h / 2.0, t + h / 2.0, dim, sys);
+
+ if (s != GSL_SUCCESS)
+ {
+ /* Restore original y vector */
+ DBL_MEMCPY (y, y0_orig, dim);
+
+ return s;
+ }
+ }
+
+ /* Derivatives at output */
+
+ if (dydt_out != NULL)
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t + h, y, dydt_out);
+
+ if (s != GSL_SUCCESS)
+ {
+ /* Restore original y vector */
+ DBL_MEMCPY (y, y0_orig, dim);
+
+ return s;
+ }
+ }
+
+ /* Error estimation */
+
+ for (i = 0; i < dim; i++)
+ {
+ yerr[i] = 4.0 * (y[i] - y_onestep[i]) / 3.0;
+ }
+
+ return GSL_SUCCESS;
+}
+
+static int
+rk2imp_reset (void *vstate, size_t dim)
+{
+ rk2imp_state_t *state = (rk2imp_state_t *) vstate;
+
+ DBL_ZERO_MEMSET (state->Y1, dim);
+ DBL_ZERO_MEMSET (state->ytmp, dim);
+ DBL_ZERO_MEMSET (state->y0, dim);
+ DBL_ZERO_MEMSET (state->y_onestep, dim);
+ DBL_ZERO_MEMSET (state->y0_orig, dim);
+
+ return GSL_SUCCESS;
+}
+
+static unsigned int
+rk2imp_order (void *vstate)
+{
+ rk2imp_state_t *state = (rk2imp_state_t *) vstate;
+ state = 0; /* prevent warnings about unused parameters */
+ return 2;
+}
+
+static void
+rk2imp_free (void *vstate)
+{
+ rk2imp_state_t *state = (rk2imp_state_t *) vstate;
+
+ free (state->Y1);
+ free (state->ytmp);
+ free (state->y0);
+ free (state->y_onestep);
+ free (state->y0_orig);
+ free (state);
+}
+
+static const gsl_odeiv_step_type rk2imp_type = { "rk2imp", /* name */
+ 1, /* can use dydt_in */
+ 1, /* gives exact dydt_out */
+ &rk2imp_alloc,
+ &rk2imp_apply,
+ &rk2imp_reset,
+ &rk2imp_order,
+ &rk2imp_free
+};
+
+const gsl_odeiv_step_type *gsl_odeiv_step_rk2imp = &rk2imp_type;
diff --git a/gsl-1.9/ode-initval/rk2simp.c b/gsl-1.9/ode-initval/rk2simp.c
new file mode 100644
index 0000000..61248ac
--- /dev/null
+++ b/gsl-1.9/ode-initval/rk2simp.c
@@ -0,0 +1,382 @@
+/* ode-initval/rk2simp.c
+ *
+ * Copyright (C) 2004 Tuomo Keskitalo
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Runge-Kutta 2, Gaussian implicit. Also known as implicit midpoint rule.
+
+ Non-linear equations solved by linearization, LU-decomposition
+ and matrix inversion. For reference, see eg.
+
+ Ascher, U.M., Petzold, L.R., Computer methods for ordinary
+ differential and differential-algebraic equations, SIAM,
+ Philadelphia, 1998.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_odeiv.h>
+#include <gsl/gsl_linalg.h>
+
+#include "odeiv_util.h"
+
+typedef struct
+{
+ double *Y1;
+ double *y0;
+ double *y0_orig;
+ double *ytmp;
+ double *dfdy; /* Jacobian */
+ double *dfdt; /* time derivatives, not used */
+ double *y_onestep;
+ gsl_permutation *p;
+}
+rk2simp_state_t;
+
+static void *
+rk2simp_alloc (size_t dim)
+{
+ rk2simp_state_t *state =
+ (rk2simp_state_t *) malloc (sizeof (rk2simp_state_t));
+
+ if (state == 0)
+ {
+ GSL_ERROR_NULL ("failed to allocate space for rk2simp_state",
+ GSL_ENOMEM);
+ }
+
+ state->Y1 = (double *) malloc (dim * sizeof (double));
+
+ if (state->Y1 == 0)
+ {
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for Y1", GSL_ENOMEM);
+ }
+
+ state->y0 = (double *) malloc (dim * sizeof (double));
+
+ if (state->y0 == 0)
+ {
+ free (state->Y1);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for y0", GSL_ENOMEM);
+ }
+
+ state->y0_orig = (double *) malloc (dim * sizeof (double));
+
+ if (state->y0_orig == 0)
+ {
+ free (state->Y1);
+ free (state->y0);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for y0_orig", GSL_ENOMEM);
+ }
+
+ state->ytmp = (double *) malloc (dim * sizeof (double));
+
+ if (state->ytmp == 0)
+ {
+ free (state->Y1);
+ free (state->y0);
+ free (state->y0_orig);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for ytmp", GSL_ENOMEM);
+ }
+
+ state->dfdy = (double *) malloc (dim * dim * sizeof (double));
+
+ if (state->dfdy == 0)
+ {
+ free (state->Y1);
+ free (state->y0);
+ free (state->y0_orig);
+ free (state->ytmp);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for dfdy", GSL_ENOMEM);
+ }
+
+ state->dfdt = (double *) malloc (dim * sizeof (double));
+
+ if (state->dfdt == 0)
+ {
+ free (state->Y1);
+ free (state->y0);
+ free (state->y0_orig);
+ free (state->ytmp);
+ free (state->dfdy);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for dfdt", GSL_ENOMEM);
+ }
+
+ state->y_onestep = (double *) malloc (dim * sizeof (double));
+
+ if (state->y_onestep == 0)
+ {
+ free (state->Y1);
+ free (state->y0);
+ free (state->y0_orig);
+ free (state->ytmp);
+ free (state->dfdy);
+ free (state->dfdt);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for y_onestep", GSL_ENOMEM);
+ }
+
+ state->p = gsl_permutation_alloc (dim);
+
+ if (state->p == 0)
+ {
+ free (state->Y1);
+ free (state->y0);
+ free (state->y0_orig);
+ free (state->ytmp);
+ free (state->dfdy);
+ free (state->dfdt);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for p", GSL_ENOMEM);
+ }
+
+ return state;
+}
+
+
+static int
+rk2simp_step (double *y, rk2simp_state_t * state,
+ const double h, const double t,
+ const size_t dim, const gsl_odeiv_system * sys)
+{
+ /* Makes a Runge-Kutta 2nd order semi-implicit advance with step size h.
+ y0 is initial values of variables y.
+
+ The linearized semi-implicit equations to calculate are:
+
+ Y1 = y0 + h/2 * (1 - h/2 * df/dy)^(-1) * f(t + h/2, y0)
+
+ y = y0 + h * f(t + h/2, Y1)
+ */
+
+ const double *y0 = state->y0;
+ double *Y1 = state->Y1;
+ double *ytmp = state->ytmp;
+
+ size_t i;
+ int s, ps;
+
+ gsl_matrix_view J = gsl_matrix_view_array (state->dfdy, dim, dim);
+
+ /* First solve Y1.
+ Calculate the inverse matrix (1 - h/2 * df/dy)^-1
+ */
+
+ /* Create matrix to J */
+
+ s = GSL_ODEIV_JA_EVAL (sys, t, y0, state->dfdy, state->dfdt);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+
+ gsl_matrix_scale (&J.matrix, -h / 2.0);
+ gsl_matrix_add_diagonal(&J.matrix, 1.0);
+
+ /* Invert it by LU-decomposition to invmat */
+
+ s += gsl_linalg_LU_decomp (&J.matrix, state->p, &ps);
+
+ if (s != GSL_SUCCESS)
+ {
+ return GSL_EFAILED;
+ }
+
+ /* Evaluate f(t + h/2, y0) */
+
+ s = GSL_ODEIV_FN_EVAL (sys, t + 0.5 * h, y0, ytmp);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+
+ /* Calculate Y1 = y0 + h/2 * ((1-h/2 * df/dy)^-1) ytmp */
+
+ {
+ gsl_vector_const_view y0_view = gsl_vector_const_view_array(y0, dim);
+ gsl_vector_view ytmp_view = gsl_vector_view_array(ytmp, dim);
+ gsl_vector_view Y1_view = gsl_vector_view_array(Y1, dim);
+
+ s = gsl_linalg_LU_solve (&J.matrix, state->p,
+ &ytmp_view.vector, &Y1_view.vector);
+
+ gsl_vector_scale (&Y1_view.vector, 0.5 * h);
+ gsl_vector_add (&Y1_view.vector, &y0_view.vector);
+ }
+
+ /* And finally evaluation of f(t + h/2, Y1) and calculation of y */
+
+ s = GSL_ODEIV_FN_EVAL (sys, t + 0.5 * h, Y1, ytmp);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+
+ for (i = 0; i < dim; i++)
+ {
+ y[i] = y0[i] + h * ytmp[i];
+ }
+
+ return s;
+}
+
+static int
+rk2simp_apply (void *vstate, size_t dim, double t, double h,
+ double y[], double yerr[], const double dydt_in[],
+ double dydt_out[], const gsl_odeiv_system * sys)
+{
+ rk2simp_state_t *state = (rk2simp_state_t *) vstate;
+
+ size_t i;
+
+ double *y0 = state->y0;
+ double *y0_orig = state->y0_orig;
+ double *y_onestep = state->y_onestep;
+
+ /* Error estimation is done by step doubling procedure */
+
+ DBL_MEMCPY (y0, y, dim);
+
+ /* Save initial values in case of failure */
+ DBL_MEMCPY (y0_orig, y, dim);
+
+ /* First traverse h with one step (save to y_onestep) */
+ DBL_MEMCPY (y_onestep, y, dim);
+
+ {
+ int s = rk2simp_step (y_onestep, state, h, t, dim, sys);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+
+ /* Then with two steps with half step length (save to y) */
+
+ {
+ int s = rk2simp_step (y, state, h / 2.0, t, dim, sys);
+
+ if (s != GSL_SUCCESS)
+ {
+ /* Restore original y vector */
+ DBL_MEMCPY (y, y0_orig, dim);
+ return s;
+ }
+ }
+
+ DBL_MEMCPY (y0, y, dim);
+
+ {
+ int s = rk2simp_step (y, state, h / 2.0, t + h / 2.0, dim, sys);
+
+ if (s != GSL_SUCCESS)
+ {
+ /* Restore original y vector */
+ DBL_MEMCPY (y, y0_orig, dim);
+ return s;
+ }
+ }
+
+ /* Derivatives at output */
+
+ if (dydt_out != NULL)
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t + h, y, dydt_out);
+
+ if (s != GSL_SUCCESS)
+ {
+ /* Restore original y vector */
+ DBL_MEMCPY (y, y0_orig, dim);
+ return s;
+ }
+ }
+
+ /* Error estimation */
+
+ for (i = 0; i < dim; i++)
+ {
+ yerr[i] = 4.0 * (y[i] - y_onestep[i]) / 3.0;
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+static int
+rk2simp_reset (void *vstate, size_t dim)
+{
+ rk2simp_state_t *state = (rk2simp_state_t *) vstate;
+
+ DBL_ZERO_MEMSET (state->Y1, dim);
+ DBL_ZERO_MEMSET (state->y0, dim);
+ DBL_ZERO_MEMSET (state->y0_orig, dim);
+ DBL_ZERO_MEMSET (state->ytmp, dim);
+ DBL_ZERO_MEMSET (state->dfdt, dim * dim);
+ DBL_ZERO_MEMSET (state->dfdt, dim);
+ DBL_ZERO_MEMSET (state->y_onestep, dim);
+
+ return GSL_SUCCESS;
+}
+
+static unsigned int
+rk2simp_order (void *vstate)
+{
+ rk2simp_state_t *state = (rk2simp_state_t *) vstate;
+ state = 0; /* prevent warnings about unused parameters */
+ return 2;
+}
+
+static void
+rk2simp_free (void *vstate)
+{
+ rk2simp_state_t *state = (rk2simp_state_t *) vstate;
+ free (state->Y1);
+ free (state->y0);
+ free (state->y0_orig);
+ free (state->ytmp);
+ free (state->dfdy);
+ free (state->dfdt);
+ free (state->y_onestep);
+ gsl_permutation_free (state->p);
+ free (state);
+}
+
+static const gsl_odeiv_step_type rk2simp_type = {
+ "rk2simp", /* name */
+ 0, /* can use dydt_in? */
+ 1, /* gives exact dydt_out? */
+ &rk2simp_alloc,
+ &rk2simp_apply,
+ &rk2simp_reset,
+ &rk2simp_order,
+ &rk2simp_free
+};
+
+const gsl_odeiv_step_type *gsl_odeiv_step_rk2simp = &rk2simp_type;
diff --git a/gsl-1.9/ode-initval/rk4.c b/gsl-1.9/ode-initval/rk4.c
new file mode 100644
index 0000000..3327f8e
--- /dev/null
+++ b/gsl-1.9/ode-initval/rk4.c
@@ -0,0 +1,365 @@
+/* ode-initval/rk4.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Runge-Kutta 4th order, Classical */
+
+/* Author: G. Jungman
+ */
+
+/* Reference: Abramowitz & Stegun, section 25.5. equation 25.5.10
+
+ Error estimation by step doubling, see eg. Ascher, U.M., Petzold,
+ L.R., Computer methods for ordinary differential and
+ differential-algebraic equations, SIAM, Philadelphia, 1998.
+*/
+
+#include <config.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_odeiv.h>
+
+#include "odeiv_util.h"
+
+typedef struct
+{
+ double *k;
+ double *k1;
+ double *y0;
+ double *ytmp;
+ double *y_onestep;
+}
+rk4_state_t;
+
+static void *
+rk4_alloc (size_t dim)
+{
+ rk4_state_t *state = (rk4_state_t *) malloc (sizeof (rk4_state_t));
+
+ if (state == 0)
+ {
+ GSL_ERROR_NULL ("failed to allocate space for rk4_state", GSL_ENOMEM);
+ }
+
+ state->k = (double *) malloc (dim * sizeof (double));
+
+ if (state->k == 0)
+ {
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for k", GSL_ENOMEM);
+ }
+
+ state->k1 = (double *) malloc (dim * sizeof (double));
+
+ if (state->k1 == 0)
+ {
+ free (state);
+ free (state->k);
+ GSL_ERROR_NULL ("failed to allocate space for k1", GSL_ENOMEM);
+ }
+
+ state->y0 = (double *) malloc (dim * sizeof (double));
+
+ if (state->y0 == 0)
+ {
+ free (state->k);
+ free (state->k1);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for y0", GSL_ENOMEM);
+ }
+
+ state->ytmp = (double *) malloc (dim * sizeof (double));
+
+ if (state->ytmp == 0)
+ {
+ free (state->y0);
+ free (state->k);
+ free (state->k1);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for ytmp", GSL_ENOMEM);
+ }
+
+ state->y_onestep = (double *) malloc (dim * sizeof (double));
+
+ if (state->y_onestep == 0)
+ {
+ free (state->ytmp);
+ free (state->y0);
+ free (state->k);
+ free (state->k1);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for ytmp", GSL_ENOMEM);
+ }
+
+ return state;
+}
+
+static int
+rk4_step (double *y, const rk4_state_t *state,
+ const double h, const double t, const size_t dim,
+ const gsl_odeiv_system *sys)
+{
+ /* Makes a Runge-Kutta 4th order advance with step size h. */
+
+ /* initial values of variables y. */
+ const double *y0 = state->y0;
+
+ /* work space */
+ double *ytmp = state->ytmp;
+
+ /* Runge-Kutta coefficients. Contains values of coefficient k1
+ in the beginning
+ */
+ double *k = state->k;
+
+ size_t i;
+
+ /* k1 step */
+
+ for (i = 0; i < dim; i++)
+ {
+ y[i] += h / 6.0 * k[i];
+ ytmp[i] = y0[i] + 0.5 * h * k[i];
+ }
+
+ /* k2 step */
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t + 0.5 * h, ytmp, k);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+
+ for (i = 0; i < dim; i++)
+ {
+ y[i] += h / 3.0 * k[i];
+ ytmp[i] = y0[i] + 0.5 * h * k[i];
+ }
+
+ /* k3 step */
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t + 0.5 * h, ytmp, k);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+
+ for (i = 0; i < dim; i++)
+ {
+ y[i] += h / 3.0 * k[i];
+ ytmp[i] = y0[i] + h * k[i];
+ }
+
+ /* k4 step */
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t + h, ytmp, k);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+
+ for (i = 0; i < dim; i++)
+ {
+ y[i] += h / 6.0 * k[i];
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+static int
+rk4_apply (void *vstate,
+ size_t dim,
+ double t,
+ double h,
+ double y[],
+ double yerr[],
+ const double dydt_in[],
+ double dydt_out[],
+ const gsl_odeiv_system * sys)
+{
+ rk4_state_t *state = (rk4_state_t *) vstate;
+
+ size_t i;
+
+ double *const k = state->k;
+ double *const k1 = state->k1;
+ double *const y0 = state->y0;
+ double *const y_onestep = state->y_onestep;
+
+ DBL_MEMCPY (y0, y, dim);
+
+ if (dydt_in != NULL)
+ {
+ DBL_MEMCPY (k, dydt_in, dim);
+ }
+ else
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t, y0, k);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+
+ /* Error estimation is done by step doubling procedure */
+
+ /* Save first point derivatives*/
+
+ DBL_MEMCPY (k1, k, dim);
+
+ /* First traverse h with one step (save to y_onestep) */
+
+ DBL_MEMCPY (y_onestep, y, dim);
+
+ {
+ int s = rk4_step (y_onestep, state, h, t, dim, sys);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+
+ /* Then with two steps with half step length (save to y) */
+
+ DBL_MEMCPY (k, k1, dim);
+
+ {
+ int s = rk4_step (y, state, h/2.0, t, dim, sys);
+
+ if (s != GSL_SUCCESS)
+ {
+ /* Restore original values */
+ DBL_MEMCPY (y, y0, dim);
+ return s;
+ }
+ }
+
+ /* Update before second step */
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t + h/2.0, y, k);
+
+ if (s != GSL_SUCCESS)
+ {
+ /* Restore original values */
+ DBL_MEMCPY (y, y0, dim);
+ return s;
+ }
+ }
+
+ /* Save original y0 to k1 for possible failures */
+ DBL_MEMCPY (k1, y0, dim);
+
+ /* Update y0 for second step */
+ DBL_MEMCPY (y0, y, dim);
+
+ {
+ int s = rk4_step (y, state, h/2.0, t + h/2.0, dim, sys);
+
+ if (s != GSL_SUCCESS)
+ {
+ /* Restore original values */
+ DBL_MEMCPY (y, k1, dim);
+ return s;
+ }
+ }
+
+ /* Derivatives at output */
+
+ if (dydt_out != NULL) {
+ int s = GSL_ODEIV_FN_EVAL (sys, t + h, y, dydt_out);
+
+ if (s != GSL_SUCCESS)
+ {
+ /* Restore original values */
+ DBL_MEMCPY (y, k1, dim);
+ return s;
+ }
+ }
+
+ /* Error estimation
+
+ yerr = C * 0.5 * | y(onestep) - y(twosteps) | / (2^order - 1)
+
+ constant C is approximately 8.0 to ensure 90% of samples lie within
+ the error (assuming a gaussian distribution with prior p(sigma)=1/sigma.)
+
+ */
+
+ for (i = 0; i < dim; i++)
+ {
+ yerr[i] = 4.0 * (y[i] - y_onestep[i]) / 15.0;
+ }
+
+ return GSL_SUCCESS;
+}
+
+static int
+rk4_reset (void *vstate, size_t dim)
+{
+ rk4_state_t *state = (rk4_state_t *) vstate;
+
+ DBL_ZERO_MEMSET (state->k, dim);
+ DBL_ZERO_MEMSET (state->k1, dim);
+ DBL_ZERO_MEMSET (state->y0, dim);
+ DBL_ZERO_MEMSET (state->ytmp, dim);
+ DBL_ZERO_MEMSET (state->y_onestep, dim);
+
+ return GSL_SUCCESS;
+}
+
+static unsigned int
+rk4_order (void *vstate)
+{
+ rk4_state_t *state = (rk4_state_t *) vstate;
+ state = 0; /* prevent warnings about unused parameters */
+ return 4;
+}
+
+static void
+rk4_free (void *vstate)
+{
+ rk4_state_t *state = (rk4_state_t *) vstate;
+ free (state->k);
+ free (state->k1);
+ free (state->y0);
+ free (state->ytmp);
+ free (state->y_onestep);
+ free (state);
+}
+
+static const gsl_odeiv_step_type rk4_type = { "rk4", /* name */
+ 1, /* can use dydt_in */
+ 1, /* gives exact dydt_out */
+ &rk4_alloc,
+ &rk4_apply,
+ &rk4_reset,
+ &rk4_order,
+ &rk4_free
+};
+
+const gsl_odeiv_step_type *gsl_odeiv_step_rk4 = &rk4_type;
diff --git a/gsl-1.9/ode-initval/rk4imp.c b/gsl-1.9/ode-initval/rk4imp.c
new file mode 100644
index 0000000..2350d54
--- /dev/null
+++ b/gsl-1.9/ode-initval/rk4imp.c
@@ -0,0 +1,390 @@
+/* ode-initval/rk4imp.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Runge-Kutta 4, Gaussian implicit */
+
+/* Author: G. Jungman
+*/
+
+/* Error estimation by step doubling, see eg. Ascher, U.M., Petzold,
+ L.R., Computer methods for ordinary differential and
+ differential-algebraic equations, SIAM, Philadelphia, 1998.
+ Method coefficients can also be found in it.
+*/
+
+#include <config.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_odeiv.h>
+
+#include "odeiv_util.h"
+
+typedef struct
+{
+ double *k1nu;
+ double *k2nu;
+ double *ytmp1;
+ double *ytmp2;
+ double *y0;
+ double *y0_orig;
+ double *y_onestep;
+}
+rk4imp_state_t;
+
+static void *
+rk4imp_alloc (size_t dim)
+{
+ rk4imp_state_t *state = (rk4imp_state_t *) malloc (sizeof (rk4imp_state_t));
+
+ if (state == 0)
+ {
+ GSL_ERROR_NULL ("failed to allocate space for rk4imp_state",
+ GSL_ENOMEM);
+ }
+
+ state->k1nu = (double *) malloc (dim * sizeof (double));
+
+ if (state->k1nu == 0)
+ {
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for k1nu", GSL_ENOMEM);
+ }
+
+ state->k2nu = (double *) malloc (dim * sizeof (double));
+
+ if (state->k2nu == 0)
+ {
+ free (state->k1nu);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for k2nu", GSL_ENOMEM);
+ }
+
+ state->ytmp1 = (double *) malloc (dim * sizeof (double));
+
+ if (state->ytmp1 == 0)
+ {
+ free (state->k2nu);
+ free (state->k1nu);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for ytmp1", GSL_ENOMEM);
+ }
+
+ state->ytmp2 = (double *) malloc (dim * sizeof (double));
+
+ if (state->ytmp2 == 0)
+ {
+ free (state->ytmp1);
+ free (state->k2nu);
+ free (state->k1nu);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for ytmp2", GSL_ENOMEM);
+ }
+
+ state->y0 = (double *) malloc (dim * sizeof (double));
+
+ if (state->y0 == 0)
+ {
+ free (state->ytmp2);
+ free (state->ytmp1);
+ free (state->k2nu);
+ free (state->k1nu);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for y0", GSL_ENOMEM);
+ }
+
+ state->y0_orig = (double *) malloc (dim * sizeof (double));
+
+ if (state->y0_orig == 0)
+ {
+ free (state->y0);
+ free (state->ytmp2);
+ free (state->ytmp1);
+ free (state->k2nu);
+ free (state->k1nu);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for y0_orig", GSL_ENOMEM);
+ }
+
+ state->y_onestep = (double *) malloc (dim * sizeof (double));
+
+ if (state->y_onestep == 0)
+ {
+ free (state->y0_orig);
+ free (state->y0);
+ free (state->ytmp2);
+ free (state->ytmp1);
+ free (state->k2nu);
+ free (state->k1nu);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for y_onestep", GSL_ENOMEM);
+ }
+
+ return state;
+}
+
+static int
+rk4imp_step (double *y, rk4imp_state_t *state,
+ const double h, const double t,
+ const size_t dim, const gsl_odeiv_system *sys)
+{
+ /* Makes a Runge-Kutta 4th order implicit advance with step size h.
+ y0 is initial values of variables y.
+
+ The implicit matrix equations to solve are:
+
+ Y1 = y0 + h * a11 * f(t + h * c1, Y1) + h * a12 * f(t + h * c2, Y2)
+ Y2 = y0 + h * a21 * f(t + h * c1, Y1) + h * a22 * f(t + h * c2, Y2)
+
+ y = y0 + h * b1 * f(t + h * c1, Y1) + h * b2 * f(t + h * c2, Y2)
+
+ with constant coefficients a, b and c. For this method
+ they are: b=[0.5 0.5] c=[(3-sqrt(3))/6 (3+sqrt(3))/6]
+ a11=1/4, a12=(3-2*sqrt(3))/12, a21=(3+2*sqrt(3))/12 and a22=1/4
+ */
+
+ const double ir3 = 1.0 / M_SQRT3;
+ const int iter_steps = 3;
+ int nu;
+ size_t i;
+
+ double *const k1nu = state->k1nu;
+ double *const k2nu = state->k2nu;
+ double *const ytmp1 = state->ytmp1;
+ double *const ytmp2 = state->ytmp2;
+
+ /* iterative solution of Y1 and Y2.
+
+ Note: This method does not check for convergence of the
+ iterative solution!
+ */
+
+ for (nu = 0; nu < iter_steps; nu++)
+ {
+ for (i = 0; i < dim; i++)
+ {
+ ytmp1[i] =
+ y[i] + h * (0.25 * k1nu[i] + 0.5 * (0.5 - ir3) * k2nu[i]);
+ ytmp2[i] =
+ y[i] + h * (0.25 * k2nu[i] + 0.5 * (0.5 + ir3) * k1nu[i]);
+ }
+ {
+ int s =
+ GSL_ODEIV_FN_EVAL (sys, t + 0.5 * h * (1.0 - ir3), ytmp1, k1nu);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+ {
+ int s =
+ GSL_ODEIV_FN_EVAL (sys, t + 0.5 * h * (1.0 + ir3), ytmp2, k2nu);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+ }
+
+ /* assignment */
+
+ for (i = 0; i < dim; i++)
+ {
+ const double d_i = 0.5 * (k1nu[i] + k2nu[i]);
+ y[i] += h * d_i;
+ }
+
+ return GSL_SUCCESS;
+}
+
+static int
+rk4imp_apply (void *vstate,
+ size_t dim,
+ double t,
+ double h,
+ double y[],
+ double yerr[],
+ const double dydt_in[],
+ double dydt_out[],
+ const gsl_odeiv_system * sys)
+{
+ rk4imp_state_t *state = (rk4imp_state_t *) vstate;
+
+ size_t i;
+
+ double *y0 = state->y0;
+ double *y0_orig = state->y0_orig;
+ double *y_onestep = state->y_onestep;
+ double *k1nu = state->k1nu;
+ double *k2nu = state->k2nu;
+
+ /* Initialization step */
+ DBL_MEMCPY (y0, y, dim);
+
+ /* Save initial values in case of failure */
+ DBL_MEMCPY (y0_orig, y, dim);
+
+ if (dydt_in != 0)
+ {
+ DBL_MEMCPY (k1nu, dydt_in, dim);
+ }
+ else
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t, y, k1nu);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+
+ DBL_MEMCPY (k2nu, k1nu, dim);
+
+ /* First traverse h with one step (save to y_onestep) */
+
+ DBL_MEMCPY (y_onestep, y, dim);
+
+ {
+ int s = rk4imp_step (y_onestep, state, h, t, dim, sys);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+
+ /* Then with two steps with half step length (save to y) */
+
+ {
+ int s = rk4imp_step (y, state, h/2.0, t, dim, sys);
+
+ if (s != GSL_SUCCESS)
+ {
+ /* Restore original y vector */
+ DBL_MEMCPY (y, y0_orig, dim);
+ return s;
+ }
+ }
+
+ DBL_MEMCPY (y0, y, dim);
+
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t + h/2.0, y, k1nu);
+
+ if (s != GSL_SUCCESS)
+ {
+ /* Restore original y vector */
+ DBL_MEMCPY (y, y0_orig, dim);
+ return s;
+ }
+ }
+
+ DBL_MEMCPY (k2nu, k1nu, dim);
+
+ {
+ int s = rk4imp_step (y, state, h/2.0, t + h/2.0, dim, sys);
+
+ if (s != GSL_SUCCESS)
+ {
+ /* Restore original y vector */
+ DBL_MEMCPY (y, y0_orig, dim);
+ return s;
+ }
+ }
+
+ /* Derivatives at output */
+
+ if (dydt_out != NULL)
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t + h, y, dydt_out);
+
+ if (s != GSL_SUCCESS) {
+ /* Restore original y vector */
+ DBL_MEMCPY (y, y0_orig, dim);
+ return s;
+ }
+ }
+
+ /* Error estimation */
+
+ /* Denominator in step doubling error equation
+ * yerr = 0.5 * | y(onestep) - y(twosteps) | / (2^order - 1)
+ */
+
+ for (i = 0; i < dim; i++)
+ {
+ yerr[i] = 8.0 * 0.5 * (y[i] - y_onestep[i]) / 15.0;
+ }
+
+ return GSL_SUCCESS;
+}
+
+static int
+rk4imp_reset (void *vstate, size_t dim)
+{
+ rk4imp_state_t *state = (rk4imp_state_t *) vstate;
+
+ DBL_ZERO_MEMSET (state->y_onestep, dim);
+ DBL_ZERO_MEMSET (state->y0_orig, dim);
+ DBL_ZERO_MEMSET (state->y0, dim);
+ DBL_ZERO_MEMSET (state->k1nu, dim);
+ DBL_ZERO_MEMSET (state->k2nu, dim);
+ DBL_ZERO_MEMSET (state->ytmp1, dim);
+ DBL_ZERO_MEMSET (state->ytmp2, dim);
+
+ return GSL_SUCCESS;
+}
+
+static unsigned int
+rk4imp_order (void *vstate)
+{
+ rk4imp_state_t *state = (rk4imp_state_t *) vstate;
+ state = 0; /* prevent warnings about unused parameters */
+ return 4;
+}
+
+static void
+rk4imp_free (void *vstate)
+{
+ rk4imp_state_t *state = (rk4imp_state_t *) vstate;
+
+ free (state->y_onestep);
+ free (state->y0_orig);
+ free (state->y0);
+ free (state->k1nu);
+ free (state->k2nu);
+ free (state->ytmp1);
+ free (state->ytmp2);
+ free (state);
+}
+
+static const gsl_odeiv_step_type rk4imp_type = { "rk4imp", /* name */
+ 1, /* can use dydt_in? */
+ 1, /* gives exact dydt_out? */
+ &rk4imp_alloc,
+ &rk4imp_apply,
+ &rk4imp_reset,
+ &rk4imp_order,
+ &rk4imp_free
+};
+
+const gsl_odeiv_step_type *gsl_odeiv_step_rk4imp = &rk4imp_type;
diff --git a/gsl-1.9/ode-initval/rk8pd.c b/gsl-1.9/ode-initval/rk8pd.c
new file mode 100644
index 0000000..37bffe9
--- /dev/null
+++ b/gsl-1.9/ode-initval/rk8pd.c
@@ -0,0 +1,537 @@
+/* ode-initval/rk8pd.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Runge-Kutta 8(9), Prince-Dormand
+ *
+ * High Order Embedded Runge-Kutta Formulae
+ * P.J. Prince and J.R. Dormand
+ * J. Comp. Appl. Math.,7, pp. 67-75, 1981
+ */
+
+/* Author: G. Jungman
+ */
+#include <config.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_odeiv.h>
+
+#include "odeiv_util.h"
+
+/* Prince-Dormand constants */
+
+static const double Abar[] = {
+ 14005451.0 / 335480064.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ -59238493.0 / 1068277825.0,
+ 181606767.0 / 758867731.0,
+ 561292985.0 / 797845732.0,
+ -1041891430.0 / 1371343529.0,
+ 760417239.0 / 1151165299.0,
+ 118820643.0 / 751138087.0,
+ -528747749.0 / 2220607170.0,
+ 1.0 / 4.0
+};
+
+static const double A[] = {
+ 13451932.0 / 455176623.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ -808719846.0 / 976000145.0,
+ 1757004468.0 / 5645159321.0,
+ 656045339.0 / 265891186.0,
+ -3867574721.0 / 1518517206.0,
+ 465885868.0 / 322736535.0,
+ 53011238.0 / 667516719.0,
+ 2.0 / 45.0
+};
+
+static const double ah[] = {
+ 1.0 / 18.0,
+ 1.0 / 12.0,
+ 1.0 / 8.0,
+ 5.0 / 16.0,
+ 3.0 / 8.0,
+ 59.0 / 400.0,
+ 93.0 / 200.0,
+ 5490023248.0 / 9719169821.0,
+ 13.0 / 20.0,
+ 1201146811.0 / 1299019798.0
+};
+
+static const double b21 = 1.0 / 18.0;
+static const double b3[] = { 1.0 / 48.0, 1.0 / 16.0 };
+static const double b4[] = { 1.0 / 32.0, 0.0, 3.0 / 32.0 };
+static const double b5[] = { 5.0 / 16.0, 0.0, -75.0 / 64.0, 75.0 / 64.0 };
+static const double b6[] = { 3.0 / 80.0, 0.0, 0.0, 3.0 / 16.0, 3.0 / 20.0 };
+static const double b7[] = {
+ 29443841.0 / 614563906.0,
+ 0.0,
+ 0.0,
+ 77736538.0 / 692538347.0,
+ -28693883.0 / 1125000000.0,
+ 23124283.0 / 1800000000.0
+};
+static const double b8[] = {
+ 16016141.0 / 946692911.0,
+ 0.0,
+ 0.0,
+ 61564180.0 / 158732637.0,
+ 22789713.0 / 633445777.0,
+ 545815736.0 / 2771057229.0,
+ -180193667.0 / 1043307555.0
+};
+static const double b9[] = {
+ 39632708.0 / 573591083.0,
+ 0.0,
+ 0.0,
+ -433636366.0 / 683701615.0,
+ -421739975.0 / 2616292301.0,
+ 100302831.0 / 723423059.0,
+ 790204164.0 / 839813087.0,
+ 800635310.0 / 3783071287.0
+};
+static const double b10[] = {
+ 246121993.0 / 1340847787.0,
+ 0.0,
+ 0.0,
+ -37695042795.0 / 15268766246.0,
+ -309121744.0 / 1061227803.0,
+ -12992083.0 / 490766935.0,
+ 6005943493.0 / 2108947869.0,
+ 393006217.0 / 1396673457.0,
+ 123872331.0 / 1001029789.0
+};
+static const double b11[] = {
+ -1028468189.0 / 846180014.0,
+ 0.0,
+ 0.0,
+ 8478235783.0 / 508512852.0,
+ 1311729495.0 / 1432422823.0,
+ -10304129995.0 / 1701304382.0,
+ -48777925059.0 / 3047939560.0,
+ 15336726248.0 / 1032824649.0,
+ -45442868181.0 / 3398467696.0,
+ 3065993473.0 / 597172653.0
+};
+static const double b12[] = {
+ 185892177.0 / 718116043.0,
+ 0.0,
+ 0.0,
+ -3185094517.0 / 667107341.0,
+ -477755414.0 / 1098053517.0,
+ -703635378.0 / 230739211.0,
+ 5731566787.0 / 1027545527.0,
+ 5232866602.0 / 850066563.0,
+ -4093664535.0 / 808688257.0,
+ 3962137247.0 / 1805957418.0,
+ 65686358.0 / 487910083.0
+};
+static const double b13[] = {
+ 403863854.0 / 491063109.0,
+ 0.0,
+ 0.0,
+ -5068492393.0 / 434740067.0,
+ -411421997.0 / 543043805.0,
+ 652783627.0 / 914296604.0,
+ 11173962825.0 / 925320556.0,
+ -13158990841.0 / 6184727034.0,
+ 3936647629.0 / 1978049680.0,
+ -160528059.0 / 685178525.0,
+ 248638103.0 / 1413531060.0,
+ 0.0
+};
+
+typedef struct
+{
+ double *k[13];
+ double *ytmp;
+ double *y0;
+}
+rk8pd_state_t;
+
+static void *
+rk8pd_alloc (size_t dim)
+{
+ rk8pd_state_t *state = (rk8pd_state_t *) malloc (sizeof (rk8pd_state_t));
+ int i, j;
+
+ if (state == 0)
+ {
+ GSL_ERROR_NULL ("failed to allocate space for rk8pd_state", GSL_ENOMEM);
+ }
+
+ state->ytmp = (double *) malloc (dim * sizeof (double));
+
+ if (state->ytmp == 0)
+ {
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for ytmp", GSL_ENOMEM);
+ }
+
+ state->y0 = (double *) malloc (dim * sizeof (double));
+
+ if (state->y0 == 0)
+ {
+ free (state->ytmp);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for y0", GSL_ENOMEM);
+ }
+
+ for (i = 0; i < 13; i++)
+ {
+ state->k[i] = (double *) malloc (dim * sizeof (double));
+
+ if (state->k[i] == 0)
+ {
+ for (j = 0; j < i; j++)
+ {
+ free (state->k[j]);
+ }
+ free (state->y0);
+ free (state->ytmp);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for k's", GSL_ENOMEM);
+ }
+ }
+
+ return state;
+}
+
+
+static int
+rk8pd_apply (void *vstate,
+ size_t dim,
+ double t,
+ double h,
+ double y[],
+ double yerr[],
+ const double dydt_in[],
+ double dydt_out[], const gsl_odeiv_system * sys)
+{
+ rk8pd_state_t *state = (rk8pd_state_t *) vstate;
+
+ size_t i;
+
+ double *const ytmp = state->ytmp;
+ double *const y0 = state->y0;
+ /* Note that k1 is stored in state->k[0] due to zero-based indexing */
+ double *const k1 = state->k[0];
+ double *const k2 = state->k[1];
+ double *const k3 = state->k[2];
+ double *const k4 = state->k[3];
+ double *const k5 = state->k[4];
+ double *const k6 = state->k[5];
+ double *const k7 = state->k[6];
+ double *const k8 = state->k[7];
+ double *const k9 = state->k[8];
+ double *const k10 = state->k[9];
+ double *const k11 = state->k[10];
+ double *const k12 = state->k[11];
+ double *const k13 = state->k[12];
+
+ DBL_MEMCPY (y0, y, dim);
+
+ /* k1 step */
+ if (dydt_in != NULL)
+ {
+ DBL_MEMCPY (k1, dydt_in, dim);
+ }
+ else
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t, y, k1);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+
+ for (i = 0; i < dim; i++)
+ ytmp[i] = y[i] + b21 * h * k1[i];
+
+ /* k2 step */
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t + ah[0] * h, ytmp, k2);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+
+ for (i = 0; i < dim; i++)
+ ytmp[i] = y[i] + h * (b3[0] * k1[i] + b3[1] * k2[i]);
+
+ /* k3 step */
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t + ah[1] * h, ytmp, k3);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+
+ for (i = 0; i < dim; i++)
+ ytmp[i] = y[i] + h * (b4[0] * k1[i] + b4[2] * k3[i]);
+
+ /* k4 step */
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t + ah[2] * h, ytmp, k4);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+
+ for (i = 0; i < dim; i++)
+ ytmp[i] = y[i] + h * (b5[0] * k1[i] + b5[2] * k3[i] + b5[3] * k4[i]);
+
+ /* k5 step */
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t + ah[3] * h, ytmp, k5);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+
+ for (i = 0; i < dim; i++)
+ ytmp[i] = y[i] + h * (b6[0] * k1[i] + b6[3] * k4[i] + b6[4] * k5[i]);
+
+ /* k6 step */
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t + ah[4] * h, ytmp, k6);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+
+ for (i = 0; i < dim; i++)
+ ytmp[i] =
+ y[i] + h * (b7[0] * k1[i] + b7[3] * k4[i] + b7[4] * k5[i] +
+ b7[5] * k6[i]);
+
+ /* k7 step */
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t + ah[5] * h, ytmp, k7);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+
+ for (i = 0; i < dim; i++)
+ ytmp[i] =
+ y[i] + h * (b8[0] * k1[i] + b8[3] * k4[i] + b8[4] * k5[i] +
+ b8[5] * k6[i] + b8[6] * k7[i]);
+
+ /* k8 step */
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t + ah[6] * h, ytmp, k8);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+
+ for (i = 0; i < dim; i++)
+ ytmp[i] =
+ y[i] + h * (b9[0] * k1[i] + b9[3] * k4[i] + b9[4] * k5[i] +
+ b9[5] * k6[i] + b9[6] * k7[i] + b9[7] * k8[i]);
+
+ /* k9 step */
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t + ah[7] * h, ytmp, k9);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+
+ for (i = 0; i < dim; i++)
+ ytmp[i] =
+ y[i] + h * (b10[0] * k1[i] + b10[3] * k4[i] + b10[4] * k5[i] +
+ b10[5] * k6[i] + b10[6] * k7[i] + b10[7] * k8[i] +
+ b10[8] * k9[i]);
+
+ /* k10 step */
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t + ah[8] * h, ytmp, k10);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+
+ for (i = 0; i < dim; i++)
+ ytmp[i] =
+ y[i] + h * (b11[0] * k1[i] + b11[3] * k4[i] + b11[4] * k5[i] +
+ b11[5] * k6[i] + b11[6] * k7[i] + b11[7] * k8[i] +
+ b11[8] * k9[i] + b11[9] * k10[i]);
+
+ /* k11 step */
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t + ah[9] * h, ytmp, k11);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+
+ for (i = 0; i < dim; i++)
+ ytmp[i] =
+ y[i] + h * (b12[0] * k1[i] + b12[3] * k4[i] + b12[4] * k5[i] +
+ b12[5] * k6[i] + b12[6] * k7[i] + b12[7] * k8[i] +
+ b12[8] * k9[i] + b12[9] * k10[i] + b12[10] * k11[i]);
+
+ /* k12 step */
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t + h, ytmp, k12);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+
+ for (i = 0; i < dim; i++)
+ ytmp[i] =
+ y[i] + h * (b13[0] * k1[i] + b13[3] * k4[i] + b13[4] * k5[i] +
+ b13[5] * k6[i] + b13[6] * k7[i] + b13[7] * k8[i] +
+ b13[8] * k9[i] + b13[9] * k10[i] + b13[10] * k11[i] +
+ b13[11] * k12[i]);
+
+ /* k13 step */
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t + h, ytmp, k13);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+
+ /* final sum */
+ for (i = 0; i < dim; i++)
+ {
+ const double ksum8 =
+ Abar[0] * k1[i] + Abar[5] * k6[i] + Abar[6] * k7[i] +
+ Abar[7] * k8[i] + Abar[8] * k9[i] + Abar[9] * k10[i] +
+ Abar[10] * k11[i] + Abar[11] * k12[i] + Abar[12] * k13[i];
+ y[i] += h * ksum8;
+ }
+
+ /* Evaluate dydt_out[]. */
+
+ if (dydt_out != NULL)
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t + h, y, dydt_out);
+
+ if (s != GSL_SUCCESS)
+ {
+ /* Restore initial values */
+ DBL_MEMCPY (y, y0, dim);
+ return s;
+ }
+ }
+
+ /* error estimate */
+ for (i = 0; i < dim; i++)
+ {
+ const double ksum8 =
+ Abar[0] * k1[i] + Abar[5] * k6[i] + Abar[6] * k7[i] +
+ Abar[7] * k8[i] + Abar[8] * k9[i] + Abar[9] * k10[i] +
+ Abar[10] * k11[i] + Abar[11] * k12[i] + Abar[12] * k13[i];
+ const double ksum7 =
+ A[0] * k1[i] + A[5] * k6[i] + A[6] * k7[i] + A[7] * k8[i] +
+ A[8] * k9[i] + A[9] * k10[i] + A[10] * k11[i] + A[11] * k12[i];
+ yerr[i] = h * (ksum7 - ksum8);
+ }
+
+ return GSL_SUCCESS;
+}
+
+static int
+rk8pd_reset (void *vstate, size_t dim)
+{
+ rk8pd_state_t *state = (rk8pd_state_t *) vstate;
+
+ int i;
+
+ for (i = 0; i < 13; i++)
+ {
+ DBL_ZERO_MEMSET (state->k[i], dim);
+ }
+
+ DBL_ZERO_MEMSET (state->y0, dim);
+ DBL_ZERO_MEMSET (state->ytmp, dim);
+
+ return GSL_SUCCESS;
+}
+
+static unsigned int
+rk8pd_order (void *vstate)
+{
+ rk8pd_state_t *state = (rk8pd_state_t *) vstate;
+ state = 0; /* prevent warnings about unused parameters */
+ return 8;
+}
+
+static void
+rk8pd_free (void *vstate)
+{
+ rk8pd_state_t *state = (rk8pd_state_t *) vstate;
+ int i;
+
+ for (i = 0; i < 13; i++)
+ {
+ free (state->k[i]);
+ }
+ free (state->y0);
+ free (state->ytmp);
+ free (state);
+}
+
+static const gsl_odeiv_step_type rk8pd_type = { "rk8pd", /* name */
+ 1, /* can use dydt_in */
+ 1, /* gives exact dydt_out */
+ &rk8pd_alloc,
+ &rk8pd_apply,
+ &rk8pd_reset,
+ &rk8pd_order,
+ &rk8pd_free
+};
+
+const gsl_odeiv_step_type *gsl_odeiv_step_rk8pd = &rk8pd_type;
diff --git a/gsl-1.9/ode-initval/rkck.c b/gsl-1.9/ode-initval/rkck.c
new file mode 100644
index 0000000..9a15b07
--- /dev/null
+++ b/gsl-1.9/ode-initval/rkck.c
@@ -0,0 +1,371 @@
+/* ode-initval/rkck.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Runge-Kutta 4(5), Cash-Karp */
+
+/* Reference: Cash, J.R., Karp, A.H., ACM Transactions of Mathematical
+ Software, vol. 16 (1990) 201-222. */
+
+/* Author: G. Jungman
+ */
+#include <config.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_odeiv.h>
+
+#include "odeiv_util.h"
+
+/* Cash-Karp constants */
+static const double ah[] = { 1.0 / 5.0, 0.3, 3.0 / 5.0, 1.0, 7.0 / 8.0 };
+static const double b21 = 1.0 / 5.0;
+static const double b3[] = { 3.0 / 40.0, 9.0 / 40.0 };
+static const double b4[] = { 0.3, -0.9, 1.2 };
+static const double b5[] = { -11.0 / 54.0, 2.5, -70.0 / 27.0, 35.0 / 27.0 };
+static const double b6[] =
+ { 1631.0 / 55296.0, 175.0 / 512.0, 575.0 / 13824.0, 44275.0 / 110592.0,
+ 253.0 / 4096.0 };
+static const double c1 = 37.0 / 378.0;
+static const double c3 = 250.0 / 621.0;
+static const double c4 = 125.0 / 594.0;
+static const double c6 = 512.0 / 1771.0;
+
+/* These are the differences of fifth and fourth order coefficients
+ for error estimation */
+
+static const double ec[] = { 0.0,
+ 37.0 / 378.0 - 2825.0 / 27648.0,
+ 0.0,
+ 250.0 / 621.0 - 18575.0 / 48384.0,
+ 125.0 / 594.0 - 13525.0 / 55296.0,
+ -277.0 / 14336.0,
+ 512.0 / 1771.0 - 0.25
+};
+
+typedef struct
+{
+ double *k1;
+ double *k2;
+ double *k3;
+ double *k4;
+ double *k5;
+ double *k6;
+ double *y0;
+ double *ytmp;
+}
+rkck_state_t;
+
+static void *
+rkck_alloc (size_t dim)
+{
+ rkck_state_t *state = (rkck_state_t *) malloc (sizeof (rkck_state_t));
+
+ if (state == 0)
+ {
+ GSL_ERROR_NULL ("failed to allocate space for rkck_state", GSL_ENOMEM);
+ }
+
+ state->k1 = (double *) malloc (dim * sizeof (double));
+
+ if (state->k1 == 0)
+ {
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for k1", GSL_ENOMEM);
+ }
+
+ state->k2 = (double *) malloc (dim * sizeof (double));
+
+ if (state->k2 == 0)
+ {
+ free (state->k1);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for k2", GSL_ENOMEM);
+ }
+
+ state->k3 = (double *) malloc (dim * sizeof (double));
+
+ if (state->k3 == 0)
+ {
+ free (state->k2);
+ free (state->k1);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for k3", GSL_ENOMEM);
+ }
+
+ state->k4 = (double *) malloc (dim * sizeof (double));
+
+ if (state->k4 == 0)
+ {
+ free (state->k3);
+ free (state->k2);
+ free (state->k1);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for k4", GSL_ENOMEM);
+ }
+
+ state->k5 = (double *) malloc (dim * sizeof (double));
+
+ if (state->k5 == 0)
+ {
+ free (state->k4);
+ free (state->k3);
+ free (state->k2);
+ free (state->k1);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for k5", GSL_ENOMEM);
+ }
+
+ state->k6 = (double *) malloc (dim * sizeof (double));
+
+ if (state->k6 == 0)
+ {
+ free (state->k5);
+ free (state->k4);
+ free (state->k3);
+ free (state->k2);
+ free (state->k1);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for k6", GSL_ENOMEM);
+ }
+
+ state->y0 = (double *) malloc (dim * sizeof (double));
+
+ if (state->y0 == 0)
+ {
+ free (state->k6);
+ free (state->k5);
+ free (state->k4);
+ free (state->k3);
+ free (state->k2);
+ free (state->k1);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for y0", GSL_ENOMEM);
+ }
+
+ state->ytmp = (double *) malloc (dim * sizeof (double));
+
+ if (state->ytmp == 0)
+ {
+ free (state->y0);
+ free (state->k6);
+ free (state->k5);
+ free (state->k4);
+ free (state->k3);
+ free (state->k2);
+ free (state->k1);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for ytmp", GSL_ENOMEM);
+ }
+
+ return state;
+}
+
+
+static int
+rkck_apply (void *vstate,
+ size_t dim,
+ double t,
+ double h,
+ double y[],
+ double yerr[],
+ const double dydt_in[],
+ double dydt_out[], const gsl_odeiv_system * sys)
+{
+ rkck_state_t *state = (rkck_state_t *) vstate;
+
+ size_t i;
+
+ double *const k1 = state->k1;
+ double *const k2 = state->k2;
+ double *const k3 = state->k3;
+ double *const k4 = state->k4;
+ double *const k5 = state->k5;
+ double *const k6 = state->k6;
+ double *const ytmp = state->ytmp;
+ double *const y0 = state->y0;
+
+ DBL_MEMCPY (y0, y, dim);
+
+ /* k1 step */
+ if (dydt_in != NULL)
+ {
+ DBL_MEMCPY (k1, dydt_in, dim);
+ }
+ else
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t, y, k1);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+
+ for (i = 0; i < dim; i++)
+ ytmp[i] = y[i] + b21 * h * k1[i];
+
+ /* k2 step */
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t + ah[0] * h, ytmp, k2);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+
+ for (i = 0; i < dim; i++)
+ ytmp[i] = y[i] + h * (b3[0] * k1[i] + b3[1] * k2[i]);
+
+ /* k3 step */
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t + ah[1] * h, ytmp, k3);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+
+ for (i = 0; i < dim; i++)
+ ytmp[i] = y[i] + h * (b4[0] * k1[i] + b4[1] * k2[i] + b4[2] * k3[i]);
+
+ /* k4 step */
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t + ah[2] * h, ytmp, k4);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+
+ for (i = 0; i < dim; i++)
+ ytmp[i] =
+ y[i] + h * (b5[0] * k1[i] + b5[1] * k2[i] + b5[2] * k3[i] +
+ b5[3] * k4[i]);
+
+ /* k5 step */
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t + ah[3] * h, ytmp, k5);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+
+ for (i = 0; i < dim; i++)
+ ytmp[i] =
+ y[i] + h * (b6[0] * k1[i] + b6[1] * k2[i] + b6[2] * k3[i] +
+ b6[3] * k4[i] + b6[4] * k5[i]);
+
+ /* k6 step and final sum */
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t + ah[4] * h, ytmp, k6);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+
+ for (i = 0; i < dim; i++)
+ {
+ const double d_i = c1 * k1[i] + c3 * k3[i] + c4 * k4[i] + c6 * k6[i];
+ y[i] += h * d_i;
+ }
+
+ /* Evaluate dydt_out[]. */
+
+ if (dydt_out != NULL)
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t + h, y, dydt_out);
+
+ if (s != GSL_SUCCESS)
+ {
+ /* Restore initial values */
+ DBL_MEMCPY (y, y0, dim);
+ return s;
+ }
+ }
+
+ /* difference between 4th and 5th order */
+ for (i = 0; i < dim; i++)
+ {
+ yerr[i] = h * (ec[1] * k1[i] + ec[3] * k3[i] + ec[4] * k4[i]
+ + ec[5] * k5[i] + ec[6] * k6[i]);
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+static int
+rkck_reset (void *vstate, size_t dim)
+{
+ rkck_state_t *state = (rkck_state_t *) vstate;
+
+ DBL_ZERO_MEMSET (state->k1, dim);
+ DBL_ZERO_MEMSET (state->k2, dim);
+ DBL_ZERO_MEMSET (state->k3, dim);
+ DBL_ZERO_MEMSET (state->k4, dim);
+ DBL_ZERO_MEMSET (state->k5, dim);
+ DBL_ZERO_MEMSET (state->k6, dim);
+ DBL_ZERO_MEMSET (state->ytmp, dim);
+ DBL_ZERO_MEMSET (state->y0, dim);
+
+ return GSL_SUCCESS;
+}
+
+static unsigned int
+rkck_order (void *vstate)
+{
+ rkck_state_t *state = (rkck_state_t *) vstate;
+ state = 0; /* prevent warnings about unused parameters */
+ return 5; /* FIXME: should this be 4? */
+}
+
+static void
+rkck_free (void *vstate)
+{
+ rkck_state_t *state = (rkck_state_t *) vstate;
+
+ free (state->ytmp);
+ free (state->y0);
+ free (state->k6);
+ free (state->k5);
+ free (state->k4);
+ free (state->k3);
+ free (state->k2);
+ free (state->k1);
+ free (state);
+}
+
+static const gsl_odeiv_step_type rkck_type = { "rkck", /* name */
+ 1, /* can use dydt_in */
+ 1, /* gives exact dydt_out */
+ &rkck_alloc,
+ &rkck_apply,
+ &rkck_reset,
+ &rkck_order,
+ &rkck_free
+};
+
+const gsl_odeiv_step_type *gsl_odeiv_step_rkck = &rkck_type;
diff --git a/gsl-1.9/ode-initval/rkf45.c b/gsl-1.9/ode-initval/rkf45.c
new file mode 100644
index 0000000..7750144
--- /dev/null
+++ b/gsl-1.9/ode-initval/rkf45.c
@@ -0,0 +1,372 @@
+/* ode-initval/rkf45.c
+ *
+ * Copyright (C) 2001, 2004 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Runge-Kutta-Fehlberg 4(5)*/
+
+/* Reference eg. Hairer, E., Norsett S.P., Wanner, G. Solving ordinary
+ differential equations I, Nonstiff Problems, 2nd revised edition,
+ Springer, 2000.
+*/
+
+#include <config.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_odeiv.h>
+
+#include "odeiv_util.h"
+
+/* Runge-Kutta-Fehlberg coefficients. Zero elements left out */
+
+static const double ah[] = { 1.0/4.0, 3.0/8.0, 12.0/13.0, 1.0, 1.0/2.0 };
+static const double b3[] = { 3.0/32.0, 9.0/32.0 };
+static const double b4[] = { 1932.0/2197.0, -7200.0/2197.0, 7296.0/2197.0};
+static const double b5[] = { 8341.0/4104.0, -32832.0/4104.0, 29440.0/4104.0, -845.0/4104.0};
+static const double b6[] = { -6080.0/20520.0, 41040.0/20520.0, -28352.0/20520.0, 9295.0/20520.0, -5643.0/20520.0};
+
+static const double c1 = 902880.0/7618050.0;
+static const double c3 = 3953664.0/7618050.0;
+static const double c4 = 3855735.0/7618050.0;
+static const double c5 = -1371249.0/7618050.0;
+static const double c6 = 277020.0/7618050.0;
+
+/* These are the differences of fifth and fourth order coefficients
+ for error estimation */
+
+static const double ec[] = { 0.0,
+ 1.0 / 360.0,
+ 0.0,
+ -128.0 / 4275.0,
+ -2197.0 / 75240.0,
+ 1.0 / 50.0,
+ 2.0 / 55.0
+};
+
+typedef struct
+{
+ double *k1;
+ double *k2;
+ double *k3;
+ double *k4;
+ double *k5;
+ double *k6;
+ double *y0;
+ double *ytmp;
+}
+rkf45_state_t;
+
+static void *
+rkf45_alloc (size_t dim)
+{
+ rkf45_state_t *state = (rkf45_state_t *) malloc (sizeof (rkf45_state_t));
+
+ if (state == 0)
+ {
+ GSL_ERROR_NULL ("failed to allocate space for rkf45_state", GSL_ENOMEM);
+ }
+
+ state->k1 = (double *) malloc (dim * sizeof (double));
+
+ if (state->k1 == 0)
+ {
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for k1", GSL_ENOMEM);
+ }
+
+ state->k2 = (double *) malloc (dim * sizeof (double));
+
+ if (state->k2 == 0)
+ {
+ free (state->k1);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for k2", GSL_ENOMEM);
+ }
+
+ state->k3 = (double *) malloc (dim * sizeof (double));
+
+ if (state->k3 == 0)
+ {
+ free (state->k2);
+ free (state->k1);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for k3", GSL_ENOMEM);
+ }
+
+ state->k4 = (double *) malloc (dim * sizeof (double));
+
+ if (state->k4 == 0)
+ {
+ free (state->k3);
+ free (state->k2);
+ free (state->k1);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for k4", GSL_ENOMEM);
+ }
+
+ state->k5 = (double *) malloc (dim * sizeof (double));
+
+ if (state->k5 == 0)
+ {
+ free (state->k4);
+ free (state->k3);
+ free (state->k2);
+ free (state->k1);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for k5", GSL_ENOMEM);
+ }
+
+ state->k6 = (double *) malloc (dim * sizeof (double));
+
+ if (state->k6 == 0)
+ {
+ free (state->k5);
+ free (state->k4);
+ free (state->k3);
+ free (state->k2);
+ free (state->k1);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for k6", GSL_ENOMEM);
+ }
+
+ state->y0 = (double *) malloc (dim * sizeof (double));
+
+ if (state->y0 == 0)
+ {
+ free (state->k6);
+ free (state->k5);
+ free (state->k4);
+ free (state->k3);
+ free (state->k2);
+ free (state->k1);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for y0", GSL_ENOMEM);
+ }
+
+ state->ytmp = (double *) malloc (dim * sizeof (double));
+
+ if (state->ytmp == 0)
+ {
+ free (state->y0);
+ free (state->k6);
+ free (state->k5);
+ free (state->k4);
+ free (state->k3);
+ free (state->k2);
+ free (state->k1);
+ free (state);
+ GSL_ERROR_NULL ("failed to allocate space for ytmp", GSL_ENOMEM);
+ }
+
+ return state;
+}
+
+
+static int
+rkf45_apply (void *vstate,
+ size_t dim,
+ double t,
+ double h,
+ double y[],
+ double yerr[],
+ const double dydt_in[],
+ double dydt_out[], const gsl_odeiv_system * sys)
+{
+ rkf45_state_t *state = (rkf45_state_t *) vstate;
+
+ size_t i;
+
+ double *const k1 = state->k1;
+ double *const k2 = state->k2;
+ double *const k3 = state->k3;
+ double *const k4 = state->k4;
+ double *const k5 = state->k5;
+ double *const k6 = state->k6;
+ double *const ytmp = state->ytmp;
+ double *const y0 = state->y0;
+
+ DBL_MEMCPY (y0, y, dim);
+
+ /* k1 step */
+ if (dydt_in != NULL)
+ {
+ DBL_MEMCPY (k1, dydt_in, dim);
+ }
+ else
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t, y, k1);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+
+ for (i = 0; i < dim; i++)
+ ytmp[i] = y[i] + ah[0] * h * k1[i];
+
+ /* k2 step */
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t + ah[0] * h, ytmp, k2);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+
+ for (i = 0; i < dim; i++)
+ ytmp[i] = y[i] + h * (b3[0] * k1[i] + b3[1] * k2[i]);
+
+ /* k3 step */
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t + ah[1] * h, ytmp, k3);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+
+ for (i = 0; i < dim; i++)
+ ytmp[i] = y[i] + h * (b4[0] * k1[i] + b4[1] * k2[i] + b4[2] * k3[i]);
+
+ /* k4 step */
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t + ah[2] * h, ytmp, k4);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+
+ for (i = 0; i < dim; i++)
+ ytmp[i] =
+ y[i] + h * (b5[0] * k1[i] + b5[1] * k2[i] + b5[2] * k3[i] +
+ b5[3] * k4[i]);
+
+ /* k5 step */
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t + ah[3] * h, ytmp, k5);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+
+ for (i = 0; i < dim; i++)
+ ytmp[i] =
+ y[i] + h * (b6[0] * k1[i] + b6[1] * k2[i] + b6[2] * k3[i] +
+ b6[3] * k4[i] + b6[4] * k5[i]);
+
+ /* k6 step and final sum */
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t + ah[4] * h, ytmp, k6);
+
+ if (s != GSL_SUCCESS)
+ {
+ return s;
+ }
+ }
+
+ for (i = 0; i < dim; i++)
+ {
+ const double d_i = c1 * k1[i] + c3 * k3[i] + c4 * k4[i] + c5 * k5[i] + c6 * k6[i];
+ y[i] += h * d_i;
+ }
+
+ /* Derivatives at output */
+
+ if (dydt_out != NULL)
+ {
+ int s = GSL_ODEIV_FN_EVAL (sys, t + h, y, dydt_out);
+
+ if (s != GSL_SUCCESS)
+ {
+ /* Restore initial values */
+ DBL_MEMCPY (y, y0, dim);
+
+ return s;
+ }
+ }
+
+ /* difference between 4th and 5th order */
+ for (i = 0; i < dim; i++)
+ {
+ yerr[i] = h * (ec[1] * k1[i] + ec[3] * k3[i] + ec[4] * k4[i]
+ + ec[5] * k5[i] + ec[6] * k6[i]);
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+static int
+rkf45_reset (void *vstate, size_t dim)
+{
+ rkf45_state_t *state = (rkf45_state_t *) vstate;
+
+ DBL_ZERO_MEMSET (state->k1, dim);
+ DBL_ZERO_MEMSET (state->k2, dim);
+ DBL_ZERO_MEMSET (state->k3, dim);
+ DBL_ZERO_MEMSET (state->k4, dim);
+ DBL_ZERO_MEMSET (state->k5, dim);
+ DBL_ZERO_MEMSET (state->k6, dim);
+ DBL_ZERO_MEMSET (state->ytmp, dim);
+ DBL_ZERO_MEMSET (state->y0, dim);
+
+ return GSL_SUCCESS;
+}
+
+static unsigned int
+rkf45_order (void *vstate)
+{
+ rkf45_state_t *state = (rkf45_state_t *) vstate;
+ state = 0; /* prevent warnings about unused parameters */
+ return 5;
+}
+
+static void
+rkf45_free (void *vstate)
+{
+ rkf45_state_t *state = (rkf45_state_t *) vstate;
+
+ free (state->ytmp);
+ free (state->y0);
+ free (state->k6);
+ free (state->k5);
+ free (state->k4);
+ free (state->k3);
+ free (state->k2);
+ free (state->k1);
+ free (state);
+}
+
+static const gsl_odeiv_step_type rkf45_type = { "rkf45", /* name */
+ 1, /* can use dydt_in */
+ 0, /* gives exact dydt_out */
+ &rkf45_alloc,
+ &rkf45_apply,
+ &rkf45_reset,
+ &rkf45_order,
+ &rkf45_free
+};
+
+const gsl_odeiv_step_type *gsl_odeiv_step_rkf45 = &rkf45_type;
diff --git a/gsl-1.9/ode-initval/step.c b/gsl-1.9/ode-initval/step.c
new file mode 100644
index 0000000..6b55a13
--- /dev/null
+++ b/gsl-1.9/ode-initval/step.c
@@ -0,0 +1,89 @@
+/* ode-initval/odeiv.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman
+ */
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_odeiv.h>
+
+gsl_odeiv_step *
+gsl_odeiv_step_alloc(const gsl_odeiv_step_type * T, size_t dim)
+{
+ gsl_odeiv_step *s = (gsl_odeiv_step *) malloc (sizeof (gsl_odeiv_step));
+
+ if (s == 0)
+ {
+ GSL_ERROR_NULL ("failed to allocate space for ode struct", GSL_ENOMEM);
+ };
+
+ s->type = T;
+ s->dimension = dim;
+
+ s->state = s->type->alloc(dim);
+
+ if (s->state == 0)
+ {
+ free (s); /* exception in constructor, avoid memory leak */
+
+ GSL_ERROR_NULL ("failed to allocate space for ode state", GSL_ENOMEM);
+ };
+
+ return s;
+}
+
+const char *
+gsl_odeiv_step_name(const gsl_odeiv_step * s)
+{
+ return s->type->name;
+}
+
+unsigned int
+gsl_odeiv_step_order(const gsl_odeiv_step * s)
+{
+ return s->type->order(s->state);
+}
+
+int
+gsl_odeiv_step_apply(
+ gsl_odeiv_step * s,
+ double t,
+ double h,
+ double y[],
+ double yerr[],
+ const double dydt_in[],
+ double dydt_out[],
+ const gsl_odeiv_system * dydt)
+{
+ return s->type->apply(s->state, s->dimension, t, h, y, yerr, dydt_in, dydt_out, dydt);
+}
+
+int
+gsl_odeiv_step_reset(gsl_odeiv_step * s)
+{
+ return s->type->reset(s->state, s->dimension);
+}
+
+void
+gsl_odeiv_step_free(gsl_odeiv_step * s)
+{
+ s->type->free(s->state);
+ free(s);
+}
diff --git a/gsl-1.9/ode-initval/test.c b/gsl-1.9/ode-initval/test.c
new file mode 100644
index 0000000..7fb6001
--- /dev/null
+++ b/gsl-1.9/ode-initval/test.c
@@ -0,0 +1,1030 @@
+/* ode-initval/test_odeiv.c
+ *
+ * Copyright (C) 2004 Tuomo Keskitalo
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Some functions and tests based on test.c by G. Jungman.
+*/
+
+#include <config.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <math.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_linalg.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_odeiv.h>
+#include "odeiv_util.h"
+
+/* Maximum number of ODE equations */
+#define MAXEQ 4
+
+/* RHS for f=2. Solution y = 2 * t + t0 */
+
+int
+rhs_linear (double t, const double y[], double f[], void *params)
+{
+ f[0] = 2.0;
+
+ return GSL_SUCCESS;
+}
+
+int
+jac_linear (double t, const double y[], double *dfdy, double dfdt[],
+ void *params)
+{
+ dfdy[0] = 0.0;
+ dfdt[0] = 0.0;
+
+ return GSL_SUCCESS;
+}
+
+gsl_odeiv_system rhs_func_lin = {
+ rhs_linear,
+ jac_linear,
+ 1,
+ 0
+};
+
+/* RHS for f=y. Equals y=exp(t) with initial value y(0)=1.0 */
+
+int
+rhs_exp (double t, const double y[], double f[], void *params)
+{
+ f[0] = y[0];
+
+ return GSL_SUCCESS;
+}
+
+int
+jac_exp (double t, const double y[], double *dfdy, double dfdt[],
+ void *params)
+{
+ dfdy[0] = y[0];
+ dfdt[0] = 0.0;
+
+ return GSL_SUCCESS;
+}
+
+gsl_odeiv_system rhs_func_exp = {
+ rhs_exp,
+ jac_exp,
+ 1,
+ 0
+};
+
+/* RHS for f0 = -y1, f1 = y0
+ equals y = [cos(t), sin(t)] with initial values [1, 0]
+*/
+
+int
+rhs_sin (double t, const double y[], double f[], void *params)
+{
+ f[0] = -y[1];
+ f[1] = y[0];
+
+ return GSL_SUCCESS;
+}
+
+int
+jac_sin (double t, const double y[], double *dfdy, double dfdt[],
+ void *params)
+{
+ dfdy[0] = 0.0;
+ dfdy[1] = -1.0;
+ dfdy[2] = 1.0;
+ dfdy[3] = 0.0;
+
+ dfdt[0] = 0.0;
+ dfdt[1] = 0.0;
+
+ return GSL_SUCCESS;
+}
+
+gsl_odeiv_system rhs_func_sin = {
+ rhs_sin,
+ jac_sin,
+ 2,
+ 0
+};
+
+/* Sine/cosine with random failures */
+
+int
+rhs_xsin (double t, const double y[], double f[], void *params)
+{
+ static int n = 0;
+
+ n++;
+
+ if (n > 40 && n < 65) {
+ f[0] = GSL_NAN;
+ f[1] = GSL_NAN;
+ return GSL_EFAILED;
+ }
+
+ f[0] = -y[1];
+ f[1] = y[0];
+
+ return GSL_SUCCESS;
+}
+
+int
+jac_xsin (double t, const double y[], double *dfdy, double dfdt[],
+ void *params)
+{
+ static int n = 0;
+
+ n++;
+
+ if (n > 50 && n < 55) {
+ dfdy[0] = GSL_NAN;
+ dfdy[1] = GSL_NAN;
+ dfdy[2] = GSL_NAN;
+ dfdy[3] = GSL_NAN;
+
+ dfdt[0] = GSL_NAN;
+ dfdt[1] = GSL_NAN;
+ return GSL_EFAILED;
+ }
+
+ dfdy[0] = 0.0;
+ dfdy[1] = -1.0;
+ dfdy[2] = 1.0;
+ dfdy[3] = 0.0;
+
+ dfdt[0] = 0.0;
+ dfdt[1] = 0.0;
+
+ return GSL_SUCCESS;
+}
+
+gsl_odeiv_system rhs_func_xsin = {
+ rhs_xsin,
+ jac_xsin,
+ 2,
+ 0
+};
+
+
+/* RHS for classic stiff example
+ dy0 / dt = 998 * y0 + 1998 * y1 y0(0) = 1.0
+ dy1 / dt = -999 * y0 - 1999 * y1 y1(0) = 0.0
+
+ solution is
+ y0 = 2 * exp(-t) - exp(-1000 * t)
+ y1 = - exp(-t) + exp(-1000 * t)
+*/
+
+int
+rhs_stiff (double t, const double y[], double f[], void *params)
+{
+ f[0] = 998.0 * y[0] + 1998.0 * y[1];
+ f[1] = -999.0 * y[0] - 1999.0 * y[1];
+
+ return GSL_SUCCESS;
+}
+
+int
+jac_stiff (double t, const double y[], double *dfdy, double dfdt[],
+ void *params)
+{
+ dfdy[0] = 998.0;
+ dfdy[1] = 1998.0;
+ dfdy[2] = -999.0;
+ dfdy[3] = -1999.0;
+
+ dfdt[0] = 0.0;
+ dfdt[1] = 0.0;
+
+ return GSL_SUCCESS;
+}
+
+gsl_odeiv_system rhs_func_stiff = {
+ rhs_stiff,
+ jac_stiff,
+ 2,
+ 0
+};
+
+/* van Der Pol oscillator:
+ f0 = y1 y0(0) = 1.0
+ f1 = -y0 + mu * y1 * (1 - y0^2) y1(0) = 0.0
+*/
+
+int
+rhs_vanderpol (double t, const double y[], double f[], void *params)
+{
+ const double mu = 10.0;
+
+ f[0] = y[1];
+ f[1] = -y[0] + mu * y[1] * (1.0 - y[0]*y[0]);
+
+ return GSL_SUCCESS;
+}
+
+int
+jac_vanderpol (double t, const double y[], double *dfdy, double dfdt[],
+ void *params)
+{
+ const double mu = 10.0;
+
+ dfdy[0] = 0.0;
+ dfdy[1] = 1.0;
+ dfdy[2] = -2.0 * mu * y[0] * y[1] - 1.0;
+ dfdy[3] = mu * (1.0 - y[0] * y[0]);
+
+ dfdt[0] = 0.0;
+ dfdt[1] = 0.0;
+
+ return GSL_SUCCESS;
+}
+
+gsl_odeiv_system rhs_func_vanderpol = {
+ rhs_vanderpol,
+ jac_vanderpol,
+ 2,
+ 0
+};
+
+/* The Oregonator - chemical Belusov-Zhabotinskii reaction
+ y0(0) = 1.0, y1(0) = 2.0, y2(0) = 3.0
+*/
+
+int
+rhs_oregonator (double t, const double y[], double f[], void *params)
+{
+ const double c1=77.27;
+ const double c2=8.375e-6;
+ const double c3=0.161;
+
+ f[0] = c1 * (y[1] + y[0] * (1 - c2 * y[0] - y[1]));
+ f[1] = 1/c1 * (y[2] - y[1] * (1 + y[0]));
+ f[2] = c3 * (y[0] - y[2]);
+
+ return GSL_SUCCESS;
+}
+
+int
+jac_oregonator (double t, const double y[], double *dfdy, double dfdt[],
+ void *params)
+{
+ const double c1=77.27;
+ const double c2=8.375e-6;
+ const double c3=0.161;
+
+ dfdy[0] = c1 * (1 - 2 * c2 * y[0] - y[1]);
+ dfdy[1] = c1 * (1 - y[0]);
+ dfdy[2] = 0.0;
+
+ dfdy[3] = 1/c1 * (-y[1]);
+ dfdy[4] = 1/c1 * (-1 - y[0]);
+ dfdy[5] = 1/c1;
+
+ dfdy[6] = c3;
+ dfdy[7] = 0.0;
+ dfdy[8] = -c3;
+
+ dfdt[0] = 0.0;
+ dfdt[1] = 0.0;
+ dfdt[2] = 0.0;
+
+ return GSL_SUCCESS;
+}
+
+gsl_odeiv_system rhs_func_oregonator = {
+ rhs_oregonator,
+ jac_oregonator,
+ 3,
+ 0
+};
+
+/* Volterra-Lotka predator-prey model
+
+ f0 = (a - b * y1) * y0 y0(0) = 3.0
+ f1 = (-c + d * y0) * y1 y1(0) = 1.0
+ */
+
+int
+rhs_vl (double t, const double y[], double f[], void *params)
+{
+ const double a = 1.0;
+ const double b = 1.0;
+ const double c = 1.0;
+ const double d = 1.0;
+
+ f[0] = (a - b * y[1]) * y[0];
+ f[1] = (-c + d * y[0]) * y[1];
+
+ return GSL_SUCCESS;
+}
+
+int
+jac_vl (double t, const double y[], double *dfdy, double dfdt[],
+ void *params)
+{
+ const double a = 1.0;
+ const double b = 1.0;
+ const double c = 1.0;
+ const double d = 1.0;
+
+ dfdy[0] = a - b * y[1];
+ dfdy[1] = -b * y[0];
+ dfdy[2] = d * y[1];
+ dfdy[3] = -c + d * y[0];
+
+ dfdt[0] = 0.0;
+ dfdt[1] = 0.0;
+
+ return GSL_SUCCESS;
+}
+
+gsl_odeiv_system rhs_func_vl = {
+ rhs_vl,
+ jac_vl,
+ 2,
+ 0
+};
+
+/* Stiff trigonometric example
+
+ f0 = -50 * (y0 - cos(t)) y0(0) = 0.0
+ */
+
+int
+rhs_stifftrig (double t, const double y[], double f[], void *params)
+{
+ f[0] = -50 * (y[0] - cos(t));
+
+ return GSL_SUCCESS;
+}
+
+int
+jac_stifftrig (double t, const double y[], double *dfdy, double dfdt[],
+ void *params)
+{
+ dfdy[0] = -50;
+
+ dfdt[0] = -50 * sin(t);
+
+ return GSL_SUCCESS;
+}
+
+gsl_odeiv_system rhs_func_stifftrig = {
+ rhs_stifftrig,
+ jac_stifftrig,
+ 1,
+ 0
+};
+
+/* E5 - a stiff badly scaled chemical problem by Enright, Hull &
+ Lindberg (1975): Comparing numerical methods for stiff systems of
+ ODEs. BIT, vol. 15, pp. 10-48.
+
+ f0 = -a * y0 - b * y0 * y2 y0(0) = 1.76e-3
+ f1 = a * y0 - m * c * y1 * y2 y1(0) = 0.0
+ f2 = a * y0 - b * y0 * y2 - m * c * y1 * y2 + c * y3 y2(0) = 0.0
+ f3 = b * y0 * y2 - c * y3 y3(0) = 0.0
+ */
+
+int
+rhs_e5 (double t, const double y[], double f[], void *params)
+{
+ const double a = 7.89e-10;
+ const double b = 1.1e7;
+ const double c = 1.13e3;
+ const double m = 1.0e6;
+
+ f[0] = -a * y[0] - b * y[0] * y[2];
+ f[1] = a * y[0] - m * c * y[1] * y[2];
+ f[3] = b * y[0] * y[2] - c * y[3];
+ f[2] = f[1] - f[3];
+
+ return GSL_SUCCESS;
+}
+
+int
+jac_e5 (double t, const double y[], double *dfdy, double dfdt[],
+ void *params)
+{
+ const double a = 7.89e-10;
+ const double b = 1.1e7;
+ const double c = 1.13e3;
+ const double m = 1.0e6;
+
+ dfdy[0] = -a - b * y[2];
+ dfdy[1] = 0.0;
+ dfdy[2] = -b * y[0];
+ dfdy[3] = 0.0;
+
+ dfdy[4] = a;
+ dfdy[5] = -m * c * y[2];
+ dfdy[6] = -m * c * y[1];
+ dfdy[7] = 0.0;
+
+ dfdy[8] = a - b * y[2];
+ dfdy[9] = -m * c * y[2];
+ dfdy[10] = -b * y[0] - m * c * y[1];
+ dfdy[11] = c;
+
+ dfdy[12] = b * y[2];
+ dfdy[13] = 0.0;
+ dfdy[14] = b * y[0];
+ dfdy[15] = -c;
+
+ dfdt[0] = 0.0;
+ dfdt[1] = 0.0;
+ dfdt[2] = 0.0;
+ dfdt[3] = 0.0;
+
+ return GSL_SUCCESS;
+}
+
+gsl_odeiv_system rhs_func_e5 = {
+ rhs_e5,
+ jac_e5,
+ 4,
+ 0
+};
+
+void
+test_odeiv_stepper (const gsl_odeiv_step_type *T, const gsl_odeiv_system *sys,
+ const double h, const double t, const char desc[],
+ const double ystart[], const double yfin[],
+ const double relerr)
+{
+ /* tests stepper T with one fixed length step advance of system sys
+ and compares with given values yfin
+ */
+
+ double y[MAXEQ] = {0.0};
+ double yerr[MAXEQ] = {0.0};
+ size_t ne = sys->dimension;
+ size_t i;
+
+ gsl_odeiv_step *step = gsl_odeiv_step_alloc (T, ne);
+
+ DBL_MEMCPY (y, ystart, MAXEQ);
+
+ {
+ int s = gsl_odeiv_step_apply (step, t, h, y, yerr, 0, 0, sys);
+ if (s != GSL_SUCCESS)
+ {
+ gsl_test(s, "test_odeiv_stepper: %s step_apply returned %d", desc, s);
+ }
+ }
+
+ for (i = 0; i < ne; i++)
+ {
+ gsl_test_rel (y[i], yfin[i], relerr,
+ "%s %s step(%d)",
+ gsl_odeiv_step_name (step), desc,i);
+ }
+
+ gsl_odeiv_step_free (step);
+}
+
+void
+test_stepper (const gsl_odeiv_step_type *T)
+{
+ /* Tests stepper T with a step of selected systems */
+
+ double y[MAXEQ] = {0.0};
+ double yfin[MAXEQ] = {0.0};
+
+ /* Step length */
+ double h;
+
+ /* Required tolerance */
+ double err_target;
+
+ /* linear */
+ h = 1e-1;
+ err_target = 1e-10;
+ y[0] = 0.58;
+ yfin[0] = y[0] + 2 * h;
+ test_odeiv_stepper (T, &rhs_func_lin, h, 0.0, "linear",
+ y, yfin, err_target);
+
+ /* exponential */
+ h = 1e-4;
+ err_target = 1e-8;
+ y[0] = exp(2.7);
+ yfin[0] = exp(2.7 + h);
+ test_odeiv_stepper (T, &rhs_func_exp, h, 2.7, "exponential",
+ y, yfin, err_target);
+ /* cosine-sine */
+ h = 1e-3;
+ err_target = 1e-6;
+ y[0] = cos(1.2);
+ y[1] = sin(1.2);
+ yfin[0] = cos(1.2 + h);
+ yfin[1] = sin(1.2 + h);
+ test_odeiv_stepper (T, &rhs_func_sin, h, 1.2, "cosine-sine",
+ y, yfin, err_target);
+
+ /* classic stiff */
+ h = 1e-7;
+ err_target = 1e-4;
+ y[0] = 1.0;
+ y[1] = 0.0;
+
+ {
+ const double e1 = exp (-h);
+ const double e2 = exp (-1000.0 * h);
+ yfin[0] = 2.0 * e1 - e2;
+ yfin[1] = -e1 + e2;
+ }
+
+ test_odeiv_stepper (T, &rhs_func_stiff, h, 0.0, "classic_stiff",
+ y, yfin, err_target);
+}
+
+void
+test_evolve_system (const gsl_odeiv_step_type * T,
+ const gsl_odeiv_system * sys,
+ double t0, double t1, double hstart,
+ double y[], double yfin[],
+ double err_target, const char *desc)
+{
+ /* Tests system sys with stepper T. Step length is controlled by
+ error estimation from the stepper.
+ */
+
+ int steps = 0;
+ size_t i;
+
+ double t = t0;
+ double h = hstart;
+
+ /* Tolerance factor in testing errors */
+ const double factor = 10;
+
+ gsl_odeiv_step * step = gsl_odeiv_step_alloc (T, sys->dimension);
+
+ gsl_odeiv_control *c =
+ gsl_odeiv_control_standard_new (err_target, err_target, 1.0, 0.0);
+
+ gsl_odeiv_evolve *e = gsl_odeiv_evolve_alloc (sys->dimension);
+
+ while (t < t1)
+ {
+ int s = gsl_odeiv_evolve_apply (e, c, step, sys, &t, t1, &h, y);
+
+ if (s != GSL_SUCCESS && sys != &rhs_func_xsin)
+ {
+ gsl_test(s, "%s evolve_apply returned %d",
+ gsl_odeiv_step_name (step), s);
+ break;
+ }
+
+ if (steps > 100000)
+ {
+ gsl_test(GSL_EFAILED,
+ "%s evolve_apply reached maxiter",
+ gsl_odeiv_step_name (step));
+ break;
+ }
+
+ steps++;
+ }
+
+ /* err_target is target error of one step. Test if stepper has made
+ larger error than (tolerance factor times) the number of steps
+ times the err_target */
+
+ for (i = 0; i < sys->dimension; i++)
+ {
+ gsl_test_abs (y[i], yfin[i], factor * e->count * err_target,
+ "%s %s evolve(%d)",
+ gsl_odeiv_step_name (step), desc, i);
+ }
+
+ gsl_odeiv_evolve_free (e);
+ gsl_odeiv_control_free (c);
+ gsl_odeiv_step_free (step);
+}
+
+int
+sys_driver (const gsl_odeiv_step_type * T,
+ const gsl_odeiv_system * sys,
+ double t0, double t1, double hstart,
+ double y[], double epsabs, double epsrel,
+ const char desc[])
+{
+ /* This function evolves a system sys with stepper T from t0 to t1.
+ Step length is varied via error control with possibly different
+ absolute and relative error tolerances.
+ */
+
+ int s = 0;
+ int steps = 0;
+
+ double t = t0;
+ double h = hstart;
+
+ gsl_odeiv_step * step = gsl_odeiv_step_alloc (T, sys->dimension);
+
+ gsl_odeiv_control *c =
+ gsl_odeiv_control_standard_new (epsabs, epsrel, 1.0, 0.0);
+ gsl_odeiv_evolve *e = gsl_odeiv_evolve_alloc (sys->dimension);
+
+ while (t < t1)
+ {
+ s = gsl_odeiv_evolve_apply (e, c, step, sys, &t, t1, &h, y);
+
+ if (s != GSL_SUCCESS)
+ {
+ gsl_test(s, "sys_driver: %s evolve_apply returned %d",
+ gsl_odeiv_step_name (step), s);
+ break;
+ }
+
+ if (steps > 1e7)
+ {
+ gsl_test(GSL_EMAXITER,
+ "sys_driver: %s evolve_apply reached maxiter at t=%g",
+ gsl_odeiv_step_name (step), t);
+ s = GSL_EMAXITER;
+ break;
+ }
+
+ steps++;
+ }
+
+ gsl_test(s, "%s %s [%g,%g], %d steps completed",
+ gsl_odeiv_step_name (step), desc, t0, t1, steps);
+
+ gsl_odeiv_evolve_free (e);
+ gsl_odeiv_control_free (c);
+ gsl_odeiv_step_free (step);
+
+ return s;
+}
+
+void
+test_compare_vanderpol (void)
+{
+ /* Compares output of van Der Pol oscillator with several steppers */
+
+ /* system dimension */
+ const size_t sd = 2;
+
+ const gsl_odeiv_step_type *steppers[20];
+ const gsl_odeiv_step_type **T;
+
+ /* Required error tolerance for each stepper. */
+ double err_target[20];
+
+ /* number of ODE solvers */
+ const size_t ns = 11;
+
+ /* initial values for each ode-solver */
+ double y[11][2];
+ double *yp = &y[0][0];
+
+ size_t i, j, k;
+ int status = 0;
+
+ /* Parameters for the problem and stepper */
+ const double start = 0.0;
+ const double end = 100.0;
+ const double epsabs = 1e-8;
+ const double epsrel = 1e-8;
+ const double initstepsize = 1e-5;
+
+ /* Initialize */
+
+ steppers[0] = gsl_odeiv_step_rk2;
+ err_target[0] = 1e-6;
+ steppers[1] = gsl_odeiv_step_rk4;
+ err_target[1] = 1e-6;
+ steppers[2] = gsl_odeiv_step_rkf45;
+ err_target[2] = 1e-6;
+ steppers[3] = gsl_odeiv_step_rkck;
+ err_target[3] = 1e-6;
+ steppers[4] = gsl_odeiv_step_rk8pd;
+ err_target[4] = 1e-6;
+ steppers[5] = gsl_odeiv_step_rk2imp;
+ err_target[5] = 1e-5;
+ steppers[6] = gsl_odeiv_step_rk2simp;
+ err_target[6] = 1e-5;
+ steppers[7] = gsl_odeiv_step_rk4imp;
+ err_target[7] = 1e-6;
+ steppers[8] = gsl_odeiv_step_bsimp;
+ err_target[8] = 1e-7;
+ steppers[9] = gsl_odeiv_step_gear1;
+ err_target[9] = 1e-2;
+ steppers[10] = gsl_odeiv_step_gear2;
+ err_target[10] = 1e-6;
+ steppers[11] = 0;
+
+ T = steppers;
+
+ for (i = 0; i < ns; i++)
+ {
+ y[i][0] = 1.0;
+ y[i][1] = 0.0;
+ }
+
+ /* Call each solver for the problem */
+
+ i = 0;
+ while (*T != 0)
+ {
+ {
+ int s = sys_driver (*T, &rhs_func_vanderpol,
+ start, end, initstepsize, &yp[i],
+ epsabs, epsrel, "vanderpol");
+ if (s != GSL_SUCCESS)
+ {
+ status++;
+ }
+ }
+
+ T++;
+ i += sd;
+ }
+
+ if (status != GSL_SUCCESS)
+ {
+ return;
+ }
+
+ /* Compare results */
+
+ T = steppers;
+
+ for (i = 0; i < ns; i++)
+ for (j = i+1; j < ns; j++)
+ for (k = 0; k < sd; k++)
+ {
+ const double val1 = yp[sd * i + k];
+ const double val2 = yp[sd * j + k];
+ gsl_test_abs (val1, val2,
+ ( GSL_MAX(err_target[i], err_target[j]) ),
+ "%s/%s vanderpol",
+ T[i]->name, T[j]->name);
+ }
+
+}
+
+void
+test_compare_oregonator (void)
+{
+ /* Compares output of the Oregonator with several steppers */
+
+ /* system dimension */
+ const size_t sd = 3;
+
+ const gsl_odeiv_step_type *steppers[20];
+ const gsl_odeiv_step_type **T;
+
+ /* Required error tolerance for each stepper. */
+ double err_target[20];
+
+ /* number of ODE solvers */
+ const size_t ns = 2;
+
+ /* initial values for each ode-solver */
+ double y[2][3];
+ double *yp = &y[0][0];
+
+ size_t i, j, k;
+ int status = 0;
+
+ /* Parameters for the problem and stepper */
+ const double start = 0.0;
+ const double end = 360.0;
+ const double epsabs = 1e-8;
+ const double epsrel = 1e-8;
+ const double initstepsize = 1e-5;
+
+ /* Initialize */
+
+ steppers[0] = gsl_odeiv_step_rk2simp;
+ err_target[0] = 1e-6;
+ steppers[1] = gsl_odeiv_step_bsimp;
+ err_target[1] = 1e-6;
+ steppers[2] = 0;
+
+ T = steppers;
+
+ for (i = 0; i < ns; i++)
+ {
+ y[i][0] = 1.0;
+ y[i][1] = 2.0;
+ y[i][2] = 3.0;
+ }
+
+ /* Call each solver for the problem */
+
+ i = 0;
+ while (*T != 0)
+ {
+ {
+ int s = sys_driver (*T, &rhs_func_oregonator,
+ start, end, initstepsize, &yp[i],
+ epsabs, epsrel, "oregonator");
+
+ if (s != GSL_SUCCESS)
+ {
+ status++;
+ }
+ }
+
+ T++;
+ i += sd;
+ }
+
+ if (status != GSL_SUCCESS)
+ {
+ return;
+ }
+
+ /* Compare results */
+
+ T = steppers;
+
+ for (i = 0; i < ns; i++)
+ for (j = i+1; j < ns; j++)
+ for (k = 0; k < sd; k++)
+ {
+ const double val1 = yp[sd * i + k];
+ const double val2 = yp[sd * j + k];
+ gsl_test_rel (val1, val2,
+ ( GSL_MAX(err_target[i], err_target[j]) ),
+ "%s/%s oregonator",
+ T[i]->name, T[j]->name);
+ }
+
+}
+
+void
+test_evolve_linear (const gsl_odeiv_step_type * T, double h, double err)
+{
+ double y[1];
+ double yfin[1];
+
+ y[0] = 1.0;
+ yfin[0] = 9.0;
+ test_evolve_system (T, &rhs_func_lin, 0.0, 4.0, h, y, yfin, err,
+ "linear[0,4]");
+}
+
+void
+test_evolve_exp (const gsl_odeiv_step_type * T, double h, double err)
+{
+ double y[1];
+ double yfin[1];
+
+ y[0] = 1.0;
+ yfin[0] = exp (2.0);
+ test_evolve_system (T, &rhs_func_exp, 0.0, 2.0, h, y, yfin, err,
+ "exp[0,2]");
+}
+
+void
+test_evolve_sin (const gsl_odeiv_step_type * T, double h, double err)
+{
+ double y[2];
+ double yfin[2];
+
+ y[0] = 1.0;
+ y[1] = 0.0;
+ yfin[0] = cos (2.0);
+ yfin[1] = sin (2.0);
+ test_evolve_system (T, &rhs_func_sin, 0.0, 2.0, h, y, yfin, err,
+ "sine[0,2]");
+}
+
+void
+test_evolve_xsin (const gsl_odeiv_step_type * T, double h, double err)
+{
+ double y[2];
+ double yfin[2];
+
+ y[0] = 1.0;
+ y[1] = 0.0;
+ yfin[0] = cos (2.0);
+ yfin[1] = sin (2.0);
+ test_evolve_system (T, &rhs_func_xsin, 0.0, 2.0, h, y, yfin, err,
+ "sine[0,2] w/errors");
+}
+
+
+void
+test_evolve_stiff1 (const gsl_odeiv_step_type * T, double h, double err)
+{
+ double y[2];
+ double yfin[2];
+
+ y[0] = 1.0;
+ y[1] = 0.0;
+ {
+ double arg = 1.0;
+ double e1 = exp (-arg);
+ double e2 = exp (-1000.0 * arg);
+ yfin[0] = 2.0 * e1 - e2;
+ yfin[1] = -e1 + e2;
+ }
+ test_evolve_system (T, &rhs_func_stiff, 0.0, 1.0, h, y, yfin, err,
+ "stiff[0,1]");
+}
+
+void
+test_evolve_stiff5 (const gsl_odeiv_step_type * T, double h, double err)
+{
+ double y[2];
+ double yfin[2];
+
+ y[0] = 1.0;
+ y[1] = 0.0;
+ {
+ double arg = 5.0;
+ double e1 = exp (-arg);
+ double e2 = exp (-1000.0 * arg);
+ yfin[0] = 2.0 * e1 - e2;
+ yfin[1] = -e1 + e2;
+ }
+ test_evolve_system (T, &rhs_func_stiff, 0.0, 5.0, h, y, yfin, err,
+ "stiff[0,5]");
+}
+
+
+int
+main (void)
+{
+ int i;
+
+ struct ptype
+ {
+ const gsl_odeiv_step_type *type;
+ double h;
+ }
+ p[20];
+
+ p[0].type = gsl_odeiv_step_rk2;
+ p[0].h = 1.0e-3;
+ p[1].type = gsl_odeiv_step_rk4;
+ p[1].h = 1.0e-3;
+ p[2].type = gsl_odeiv_step_rkf45;
+ p[2].h = 1.0e-3;
+ p[3].type = gsl_odeiv_step_rkck;
+ p[3].h = 1.0e-3;
+ p[4].type = gsl_odeiv_step_rk8pd;
+ p[4].h = 1.0e-3;
+ p[5].type = gsl_odeiv_step_rk2imp;
+ p[5].h = 1.0e-3;
+ p[6].type = gsl_odeiv_step_rk2simp;
+ p[6].h = 1.0e-3;
+ p[7].type = gsl_odeiv_step_rk4imp;
+ p[7].h = 1.0e-3;
+ p[8].type = gsl_odeiv_step_bsimp;
+ p[8].h = 1.0e-3;
+ p[9].type = gsl_odeiv_step_gear1;
+ p[9].h = 1.0e-3;
+ p[10].type = gsl_odeiv_step_gear2;
+ p[10].h = 1.0e-3;
+ p[11].type = 0;
+
+ gsl_ieee_env_setup ();
+
+ for (i = 0; p[i].type != 0; i++)
+ {
+ test_stepper(p[i].type);
+ }
+
+ for (i = 0; p[i].type != 0; i++)
+ {
+ test_evolve_linear (p[i].type, p[i].h, 1e-10);
+ test_evolve_exp (p[i].type, p[i].h, 1e-6);
+ test_evolve_sin (p[i].type, p[i].h, 1e-8);
+ test_evolve_xsin (p[i].type, p[i].h, 1e-8);
+ test_evolve_stiff1 (p[i].type, p[i].h, 1e-7);
+ test_evolve_stiff5 (p[i].type, p[i].h, 1e-7);
+ }
+
+ test_compare_vanderpol();
+ test_compare_oregonator();
+
+ exit (gsl_test_summary ());
+}
diff --git a/gsl-1.9/permutation/ChangeLog b/gsl-1.9/permutation/ChangeLog
new file mode 100644
index 0000000..b18e7e6
--- /dev/null
+++ b/gsl-1.9/permutation/ChangeLog
@@ -0,0 +1,60 @@
+2003-02-17 Brian Gough <bjg@network-theory.co.uk>
+
+ * canonical.c (gsl_permutation_canonical_to_linear): fixed bug
+ confusing input and output (swapped pp and qq)
+
+Sat Apr 6 19:08:40 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c (main): added tests for canonical representation
+ functions
+
+ * canonical.c: functions for canonical representations
+ (Nicolas Darnis)
+
+Mon Apr 1 17:29:49 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * permutation.c (gsl_permutation_mul): added function for
+ combining permutations (Nicolas Darnis)
+
+Sat Feb 9 18:17:53 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * permutation.c (gsl_permutation_memcpy): added memcpy function
+
+Tue Sep 4 17:22:06 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * added permutations of complex arrays and vectors
+
+ * permute_source.c: added permutations of complex arrays and
+ vectors
+
+Sat Dec 30 21:30:16 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c: added the start of a test program
+
+ * permutation.c: added gsl_permutation_next and
+ gsl_permutation_prev as in STL, from vattervi@msu.edu
+
+Mon Apr 24 20:54:03 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_permutation.h: renamed gsl_permutation_invert to
+ gsl_permutation_inverse
+
+Mon Apr 10 14:31:01 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * added functions for permuting data and vectors
+
+Thu Feb 24 17:53:55 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * permutation.c (gsl_permutation_invert): add an inverse function
+ for permutations
+
+Sat Feb 19 12:04:32 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * permutation.c (gsl_permutation_reverse): changed from return
+ type int to void, since no errors can occur.
+
+Fri Feb 18 12:06:13 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * permutation.c: added valid and reverse methods
+ (gsl_permutation_reverse): fixed bug in reverse
+
diff --git a/gsl-1.9/permutation/Makefile.am b/gsl-1.9/permutation/Makefile.am
new file mode 100644
index 0000000..5e6c64c
--- /dev/null
+++ b/gsl-1.9/permutation/Makefile.am
@@ -0,0 +1,21 @@
+noinst_LTLIBRARIES = libgslpermutation.la
+
+pkginclude_HEADERS = gsl_permutation.h gsl_permute.h gsl_permute_char.h gsl_permute_complex_double.h gsl_permute_complex_float.h gsl_permute_complex_long_double.h gsl_permute_double.h gsl_permute_float.h gsl_permute_int.h gsl_permute_long.h gsl_permute_long_double.h gsl_permute_short.h gsl_permute_uchar.h gsl_permute_uint.h gsl_permute_ulong.h gsl_permute_ushort.h gsl_permute_vector.h gsl_permute_vector_char.h gsl_permute_vector_complex_double.h gsl_permute_vector_complex_float.h gsl_permute_vector_complex_long_double.h gsl_permute_vector_double.h gsl_permute_vector_float.h gsl_permute_vector_int.h gsl_permute_vector_long.h gsl_permute_vector_long_double.h gsl_permute_vector_short.h gsl_permute_vector_uchar.h gsl_permute_vector_uint.h gsl_permute_vector_ulong.h gsl_permute_vector_ushort.h
+
+INCLUDES= -I$(top_builddir) -I$(top_srcdir)
+
+libgslpermutation_la_SOURCES = init.c file.c permutation.c permute.c canonical.c
+
+noinst_HEADERS = permute_source.c
+
+TESTS = $(check_PROGRAMS)
+
+check_PROGRAMS = test
+
+test_SOURCES = test.c
+
+test_LDADD = libgslpermutation.la ../vector/libgslvector.la ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+
+#CLEANFILES = test.txt test.dat
+
+
diff --git a/gsl-1.9/permutation/Makefile.in b/gsl-1.9/permutation/Makefile.in
new file mode 100644
index 0000000..0935467
--- /dev/null
+++ b/gsl-1.9/permutation/Makefile.in
@@ -0,0 +1,548 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = test$(EXEEXT)
+subdir = permutation
+DIST_COMMON = $(noinst_HEADERS) $(pkginclude_HEADERS) \
+ $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgslpermutation_la_LIBADD =
+am_libgslpermutation_la_OBJECTS = init.lo file.lo permutation.lo \
+ permute.lo canonical.lo
+libgslpermutation_la_OBJECTS = $(am_libgslpermutation_la_OBJECTS)
+am_test_OBJECTS = test.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = libgslpermutation.la ../vector/libgslvector.la \
+ ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la \
+ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \
+ ../utils/libutils.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgslpermutation_la_SOURCES) $(test_SOURCES)
+DIST_SOURCES = $(libgslpermutation_la_SOURCES) $(test_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libgslpermutation.la
+pkginclude_HEADERS = gsl_permutation.h gsl_permute.h gsl_permute_char.h gsl_permute_complex_double.h gsl_permute_complex_float.h gsl_permute_complex_long_double.h gsl_permute_double.h gsl_permute_float.h gsl_permute_int.h gsl_permute_long.h gsl_permute_long_double.h gsl_permute_short.h gsl_permute_uchar.h gsl_permute_uint.h gsl_permute_ulong.h gsl_permute_ushort.h gsl_permute_vector.h gsl_permute_vector_char.h gsl_permute_vector_complex_double.h gsl_permute_vector_complex_float.h gsl_permute_vector_complex_long_double.h gsl_permute_vector_double.h gsl_permute_vector_float.h gsl_permute_vector_int.h gsl_permute_vector_long.h gsl_permute_vector_long_double.h gsl_permute_vector_short.h gsl_permute_vector_uchar.h gsl_permute_vector_uint.h gsl_permute_vector_ulong.h gsl_permute_vector_ushort.h
+INCLUDES = -I$(top_builddir) -I$(top_srcdir)
+libgslpermutation_la_SOURCES = init.c file.c permutation.c permute.c canonical.c
+noinst_HEADERS = permute_source.c
+TESTS = $(check_PROGRAMS)
+test_SOURCES = test.c
+test_LDADD = libgslpermutation.la ../vector/libgslvector.la ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps permutation/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps permutation/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgslpermutation.la: $(libgslpermutation_la_OBJECTS) $(libgslpermutation_la_DEPENDENCIES)
+ $(LINK) $(libgslpermutation_la_LDFLAGS) $(libgslpermutation_la_OBJECTS) $(libgslpermutation_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkgincludeHEADERS
+
+
+#CLEANFILES = test.txt test.dat
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/permutation/canonical.c b/gsl-1.9/permutation/canonical.c
new file mode 100644
index 0000000..080c8ee
--- /dev/null
+++ b/gsl-1.9/permutation/canonical.c
@@ -0,0 +1,194 @@
+/* permutation/permutation.c
+ *
+ * Copyright (C) 2001, 2002 Nicolas Darnis
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Modified for GSL by Brian Gough.
+ * Use in-place algorithms, no need for workspace
+ * Use conventions for canonical form given in Knuth (opposite of Sedgewick)
+ */
+
+#include <config.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+
+int
+gsl_permutation_linear_to_canonical (gsl_permutation * q,
+ const gsl_permutation * p)
+{
+ const size_t n = p->size;
+ size_t i, k, s;
+ size_t t = n;
+
+ const size_t *const pp = p->data;
+ size_t *const qq = q->data;
+
+ if (q->size != p->size)
+ {
+ GSL_ERROR ("size of q does not match size of p", GSL_EINVAL);
+ }
+
+ for (i = 0; i < n; i++)
+ {
+
+ k = pp[i];
+ s = 1;
+
+ while (k > i)
+ {
+ k = pp[k];
+ s++;
+ }
+
+ if (k < i)
+ continue;
+
+ /* Now have k == i, i.e the least in its cycle, and s == cycle length */
+
+ t -= s;
+
+ qq[t] = i;
+
+ k = pp[i];
+ s = 1;
+
+ while (k > i)
+ {
+ qq[t + s] = k;
+ k = pp[k];
+ s++;
+ }
+
+ if (t == 0)
+ break;
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+gsl_permutation_canonical_to_linear (gsl_permutation * p,
+ const gsl_permutation * q)
+{
+ size_t i, k, kk, first;
+ const size_t n = p->size;
+
+ size_t *const pp = p->data;
+ const size_t *const qq = q->data;
+
+ if (q->size != p->size)
+ {
+ GSL_ERROR ("size of q does not match size of p", GSL_EINVAL);
+ }
+
+ for (i = 0; i < n; i++)
+ {
+ pp[i] = i;
+ }
+
+ k = qq[0];
+ first = pp[k];
+
+ for (i = 1; i < n; i++)
+ {
+ kk = qq[i];
+
+ if (kk > first)
+ {
+ pp[k] = pp[kk];
+ k = kk;
+ }
+ else
+ {
+ pp[k] = first;
+ k = kk;
+ first = pp[kk];
+ }
+ }
+
+ pp[k] = first;
+
+ return GSL_SUCCESS;
+}
+
+
+size_t
+gsl_permutation_inversions (const gsl_permutation * p)
+{
+ size_t count = 0;
+ size_t i, j;
+ const size_t size = p->size;
+
+ for (i = 0; i < size - 1; i++)
+ {
+ for (j = i + 1; j < size; j++)
+ {
+ if (p->data[i] > p->data[j])
+ {
+ count++;
+ }
+ }
+ }
+
+ return count;
+}
+
+size_t
+gsl_permutation_linear_cycles (const gsl_permutation * p)
+{
+ size_t i, k;
+ size_t count = 0;
+ const size_t size = p->size;
+
+ for (i = 0; i < size; i++)
+ {
+
+ k = p->data[i];
+
+ while (k > i)
+ {
+ k = p->data[k];
+ }
+
+ if (k < i)
+ continue;
+
+ count++;
+ }
+
+ return count;
+}
+
+size_t
+gsl_permutation_canonical_cycles (const gsl_permutation * p)
+{
+ size_t i;
+ size_t count = 1;
+ size_t min = p->data[0];
+
+ for (i = 0; i < p->size; i++)
+ {
+ if (p->data[i] < min)
+ {
+ min = p->data[i];
+ count++;
+ }
+ }
+
+ return count;
+}
+
diff --git a/gsl-1.9/permutation/file.c b/gsl-1.9/permutation/file.c
new file mode 100644
index 0000000..dcb21f5
--- /dev/null
+++ b/gsl-1.9/permutation/file.c
@@ -0,0 +1,113 @@
+/* permutation/file.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+
+#define IN_FORMAT "%lu"
+
+int
+gsl_permutation_fread (FILE * stream, gsl_permutation * p)
+{
+ size_t n = p->size ;
+
+ size_t * data = p->data ;
+
+ size_t items = fread (data, sizeof (size_t), n, stream);
+
+ if (items != n)
+ {
+ GSL_ERROR ("fread failed", GSL_EFAILED);
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+gsl_permutation_fwrite (FILE * stream, const gsl_permutation * p)
+{
+ size_t n = p->size ;
+
+ size_t * data = p->data ;
+
+ size_t items = fwrite (data, sizeof (size_t), n, stream);
+
+ if (items != n)
+ {
+ GSL_ERROR ("fwrite failed", GSL_EFAILED);
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+gsl_permutation_fprintf (FILE * stream, const gsl_permutation * p, const char *format)
+{
+ size_t n = p->size ;
+
+ size_t * data = p->data ;
+
+ size_t i;
+
+ for (i = 0; i < n; i++)
+ {
+ int status = fprintf (stream, format, data[i]);
+
+ if (status < 0)
+ {
+ GSL_ERROR ("fprintf failed", GSL_EFAILED);
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+gsl_permutation_fscanf (FILE * stream, gsl_permutation * p)
+{
+ size_t n = p->size ;
+
+ size_t * data = p->data ;
+
+ size_t i;
+
+ for (i = 0; i < n; i++)
+ {
+ unsigned long j ;
+
+ /* FIXME: what if size_t != unsigned long ???
+
+ want read in size_t but have to read in unsigned long to avoid
+ error from compiler */
+
+ int status = fscanf (stream, IN_FORMAT, &j);
+
+ if (status != 1)
+ {
+ GSL_ERROR ("fscanf failed", GSL_EFAILED);
+ }
+
+ data[i] = j;
+ }
+
+ return GSL_SUCCESS;
+}
+
diff --git a/gsl-1.9/permutation/gsl_permutation.h b/gsl-1.9/permutation/gsl_permutation.h
new file mode 100644
index 0000000..b78e05c
--- /dev/null
+++ b/gsl-1.9/permutation/gsl_permutation.h
@@ -0,0 +1,98 @@
+/* permutation/gsl_permutation.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_PERMUTATION_H__
+#define __GSL_PERMUTATION_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_types.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_check_range.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+struct gsl_permutation_struct
+{
+ size_t size;
+ size_t *data;
+};
+
+typedef struct gsl_permutation_struct gsl_permutation;
+
+gsl_permutation *gsl_permutation_alloc (const size_t n);
+gsl_permutation *gsl_permutation_calloc (const size_t n);
+void gsl_permutation_init (gsl_permutation * p);
+void gsl_permutation_free (gsl_permutation * p);
+int gsl_permutation_memcpy (gsl_permutation * dest, const gsl_permutation * src);
+
+int gsl_permutation_fread (FILE * stream, gsl_permutation * p);
+int gsl_permutation_fwrite (FILE * stream, const gsl_permutation * p);
+int gsl_permutation_fscanf (FILE * stream, gsl_permutation * p);
+int gsl_permutation_fprintf (FILE * stream, const gsl_permutation * p, const char *format);
+
+size_t gsl_permutation_size (const gsl_permutation * p);
+size_t * gsl_permutation_data (const gsl_permutation * p);
+
+size_t gsl_permutation_get (const gsl_permutation * p, const size_t i);
+int gsl_permutation_swap (gsl_permutation * p, const size_t i, const size_t j);
+
+int gsl_permutation_valid (gsl_permutation * p);
+void gsl_permutation_reverse (gsl_permutation * p);
+int gsl_permutation_inverse (gsl_permutation * inv, const gsl_permutation * p);
+int gsl_permutation_next (gsl_permutation * p);
+int gsl_permutation_prev (gsl_permutation * p);
+int gsl_permutation_mul (gsl_permutation * p, const gsl_permutation * pa, const gsl_permutation * pb);
+
+int gsl_permutation_linear_to_canonical (gsl_permutation * q, const gsl_permutation * p);
+int gsl_permutation_canonical_to_linear (gsl_permutation * p, const gsl_permutation * q);
+
+size_t gsl_permutation_inversions (const gsl_permutation * p);
+size_t gsl_permutation_linear_cycles (const gsl_permutation * p);
+size_t gsl_permutation_canonical_cycles (const gsl_permutation * q);
+
+#ifdef HAVE_INLINE
+
+extern inline
+size_t
+gsl_permutation_get (const gsl_permutation * p, const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= p->size)
+ {
+ GSL_ERROR_VAL ("index out of range", GSL_EINVAL, 0);
+ }
+#endif
+ return p->data[i];
+}
+
+#endif /* HAVE_INLINE */
+
+__END_DECLS
+
+#endif /* __GSL_PERMUTATION_H__ */
diff --git a/gsl-1.9/permutation/gsl_permute.h b/gsl-1.9/permutation/gsl_permute.h
new file mode 100644
index 0000000..23f09a6
--- /dev/null
+++ b/gsl-1.9/permutation/gsl_permute.h
@@ -0,0 +1,24 @@
+#ifndef __GSL_PERMUTE_H__
+#define __GSL_PERMUTE_H__
+
+#include <gsl/gsl_permute_complex_long_double.h>
+#include <gsl/gsl_permute_complex_double.h>
+#include <gsl/gsl_permute_complex_float.h>
+
+#include <gsl/gsl_permute_long_double.h>
+#include <gsl/gsl_permute_double.h>
+#include <gsl/gsl_permute_float.h>
+
+#include <gsl/gsl_permute_ulong.h>
+#include <gsl/gsl_permute_long.h>
+
+#include <gsl/gsl_permute_uint.h>
+#include <gsl/gsl_permute_int.h>
+
+#include <gsl/gsl_permute_ushort.h>
+#include <gsl/gsl_permute_short.h>
+
+#include <gsl/gsl_permute_uchar.h>
+#include <gsl/gsl_permute_char.h>
+
+#endif /* __GSL_PERMUTE_H__ */
diff --git a/gsl-1.9/permutation/gsl_permute_char.h b/gsl-1.9/permutation/gsl_permute_char.h
new file mode 100644
index 0000000..c89df1e
--- /dev/null
+++ b/gsl-1.9/permutation/gsl_permute_char.h
@@ -0,0 +1,44 @@
+/* permutation/gsl_permute_char.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_PERMUTE_CHAR_H__
+#define __GSL_PERMUTE_CHAR_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+int gsl_permute_char (const size_t * p, char * data, const size_t stride, const size_t n);
+int gsl_permute_char_inverse (const size_t * p, char * data, const size_t stride, const size_t n);
+
+__END_DECLS
+
+#endif /* __GSL_PERMUTE_CHAR_H__ */
diff --git a/gsl-1.9/permutation/gsl_permute_complex_double.h b/gsl-1.9/permutation/gsl_permute_complex_double.h
new file mode 100644
index 0000000..4a1803b
--- /dev/null
+++ b/gsl-1.9/permutation/gsl_permute_complex_double.h
@@ -0,0 +1,45 @@
+/* permutation/gsl_permute_complex_double.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_PERMUTE_COMPLEX_DOUBLE_H__
+#define __GSL_PERMUTE_COMPLEX_DOUBLE_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_complex.h>
+#include <gsl/gsl_permutation.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+int gsl_permute_complex (const size_t * p, double * data, const size_t stride, const size_t n);
+int gsl_permute_complex_inverse (const size_t * p, double * data, const size_t stride, const size_t n);
+
+__END_DECLS
+
+#endif /* __GSL_PERMUTE_COMPLEX_DOUBLE_H__ */
diff --git a/gsl-1.9/permutation/gsl_permute_complex_float.h b/gsl-1.9/permutation/gsl_permute_complex_float.h
new file mode 100644
index 0000000..9dfb1d3
--- /dev/null
+++ b/gsl-1.9/permutation/gsl_permute_complex_float.h
@@ -0,0 +1,45 @@
+/* permutation/gsl_permute_complex_float.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_PERMUTE_COMPLEX_FLOAT_H__
+#define __GSL_PERMUTE_COMPLEX_FLOAT_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_complex.h>
+#include <gsl/gsl_permutation.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+int gsl_permute_complex_float (const size_t * p, float * data, const size_t stride, const size_t n);
+int gsl_permute_complex_float_inverse (const size_t * p, float * data, const size_t stride, const size_t n);
+
+__END_DECLS
+
+#endif /* __GSL_PERMUTE_COMPLEX_FLOAT_H__ */
diff --git a/gsl-1.9/permutation/gsl_permute_complex_long_double.h b/gsl-1.9/permutation/gsl_permute_complex_long_double.h
new file mode 100644
index 0000000..0346eaf
--- /dev/null
+++ b/gsl-1.9/permutation/gsl_permute_complex_long_double.h
@@ -0,0 +1,45 @@
+/* permutation/gsl_permute_complex_long_double.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_PERMUTE_COMPLEX_LONG_DOUBLE_H__
+#define __GSL_PERMUTE_COMPLEX_LONG_DOUBLE_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_complex.h>
+#include <gsl/gsl_permutation.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+int gsl_permute_complex_long_double (const size_t * p, long double * data, const size_t stride, const size_t n);
+int gsl_permute_complex_long_double_inverse (const size_t * p, long double * data, const size_t stride, const size_t n);
+
+__END_DECLS
+
+#endif /* __GSL_PERMUTE_COMPLEX_LONG_DOUBLE_H__ */
diff --git a/gsl-1.9/permutation/gsl_permute_double.h b/gsl-1.9/permutation/gsl_permute_double.h
new file mode 100644
index 0000000..d58c044
--- /dev/null
+++ b/gsl-1.9/permutation/gsl_permute_double.h
@@ -0,0 +1,44 @@
+/* permutation/gsl_permute_double.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_PERMUTE_DOUBLE_H__
+#define __GSL_PERMUTE_DOUBLE_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+int gsl_permute (const size_t * p, double * data, const size_t stride, const size_t n);
+int gsl_permute_inverse (const size_t * p, double * data, const size_t stride, const size_t n);
+
+__END_DECLS
+
+#endif /* __GSL_PERMUTE_DOUBLE_H__ */
diff --git a/gsl-1.9/permutation/gsl_permute_float.h b/gsl-1.9/permutation/gsl_permute_float.h
new file mode 100644
index 0000000..fc4e559
--- /dev/null
+++ b/gsl-1.9/permutation/gsl_permute_float.h
@@ -0,0 +1,44 @@
+/* permutation/gsl_permute_float.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_PERMUTE_FLOAT_H__
+#define __GSL_PERMUTE_FLOAT_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+int gsl_permute_float (const size_t * p, float * data, const size_t stride, const size_t n);
+int gsl_permute_float_inverse (const size_t * p, float * data, const size_t stride, const size_t n);
+
+__END_DECLS
+
+#endif /* __GSL_PERMUTE_FLOAT_H__ */
diff --git a/gsl-1.9/permutation/gsl_permute_int.h b/gsl-1.9/permutation/gsl_permute_int.h
new file mode 100644
index 0000000..650fb82
--- /dev/null
+++ b/gsl-1.9/permutation/gsl_permute_int.h
@@ -0,0 +1,44 @@
+/* permutation/gsl_permute_int.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_PERMUTE_INT_H__
+#define __GSL_PERMUTE_INT_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+int gsl_permute_int (const size_t * p, int * data, const size_t stride, const size_t n);
+int gsl_permute_int_inverse (const size_t * p, int * data, const size_t stride, const size_t n);
+
+__END_DECLS
+
+#endif /* __GSL_PERMUTE_INT_H__ */
diff --git a/gsl-1.9/permutation/gsl_permute_long.h b/gsl-1.9/permutation/gsl_permute_long.h
new file mode 100644
index 0000000..bccc151
--- /dev/null
+++ b/gsl-1.9/permutation/gsl_permute_long.h
@@ -0,0 +1,44 @@
+/* permutation/gsl_permute_long.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_PERMUTE_LONG_H__
+#define __GSL_PERMUTE_LONG_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+int gsl_permute_long (const size_t * p, long * data, const size_t stride, const size_t n);
+int gsl_permute_long_inverse (const size_t * p, long * data, const size_t stride, const size_t n);
+
+__END_DECLS
+
+#endif /* __GSL_PERMUTE_LONG_H__ */
diff --git a/gsl-1.9/permutation/gsl_permute_long_double.h b/gsl-1.9/permutation/gsl_permute_long_double.h
new file mode 100644
index 0000000..3bec38c
--- /dev/null
+++ b/gsl-1.9/permutation/gsl_permute_long_double.h
@@ -0,0 +1,44 @@
+/* permutation/gsl_permute_long_double.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_PERMUTE_LONG_DOUBLE_H__
+#define __GSL_PERMUTE_LONG_DOUBLE_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+int gsl_permute_long_double (const size_t * p, long double * data, const size_t stride, const size_t n);
+int gsl_permute_long_double_inverse (const size_t * p, long double * data, const size_t stride, const size_t n);
+
+__END_DECLS
+
+#endif /* __GSL_PERMUTE_LONG_DOUBLE_H__ */
diff --git a/gsl-1.9/permutation/gsl_permute_short.h b/gsl-1.9/permutation/gsl_permute_short.h
new file mode 100644
index 0000000..59f3b37
--- /dev/null
+++ b/gsl-1.9/permutation/gsl_permute_short.h
@@ -0,0 +1,44 @@
+/* permutation/gsl_permute_short.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_PERMUTE_SHORT_H__
+#define __GSL_PERMUTE_SHORT_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+int gsl_permute_short (const size_t * p, short * data, const size_t stride, const size_t n);
+int gsl_permute_short_inverse (const size_t * p, short * data, const size_t stride, const size_t n);
+
+__END_DECLS
+
+#endif /* __GSL_PERMUTE_SHORT_H__ */
diff --git a/gsl-1.9/permutation/gsl_permute_uchar.h b/gsl-1.9/permutation/gsl_permute_uchar.h
new file mode 100644
index 0000000..4c573b3
--- /dev/null
+++ b/gsl-1.9/permutation/gsl_permute_uchar.h
@@ -0,0 +1,44 @@
+/* permutation/gsl_permute_uchar.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_PERMUTE_UCHAR_H__
+#define __GSL_PERMUTE_UCHAR_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+int gsl_permute_uchar (const size_t * p, unsigned char * data, const size_t stride, const size_t n);
+int gsl_permute_uchar_inverse (const size_t * p, unsigned char * data, const size_t stride, const size_t n);
+
+__END_DECLS
+
+#endif /* __GSL_PERMUTE_UCHAR_H__ */
diff --git a/gsl-1.9/permutation/gsl_permute_uint.h b/gsl-1.9/permutation/gsl_permute_uint.h
new file mode 100644
index 0000000..ebc5eb2
--- /dev/null
+++ b/gsl-1.9/permutation/gsl_permute_uint.h
@@ -0,0 +1,44 @@
+/* permutation/gsl_permute_uint.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_PERMUTE_UINT_H__
+#define __GSL_PERMUTE_UINT_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+int gsl_permute_uint (const size_t * p, unsigned int * data, const size_t stride, const size_t n);
+int gsl_permute_uint_inverse (const size_t * p, unsigned int * data, const size_t stride, const size_t n);
+
+__END_DECLS
+
+#endif /* __GSL_PERMUTE_UINT_H__ */
diff --git a/gsl-1.9/permutation/gsl_permute_ulong.h b/gsl-1.9/permutation/gsl_permute_ulong.h
new file mode 100644
index 0000000..4712f76
--- /dev/null
+++ b/gsl-1.9/permutation/gsl_permute_ulong.h
@@ -0,0 +1,44 @@
+/* permutation/gsl_permute_ulong.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_PERMUTE_ULONG_H__
+#define __GSL_PERMUTE_ULONG_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+int gsl_permute_ulong (const size_t * p, unsigned long * data, const size_t stride, const size_t n);
+int gsl_permute_ulong_inverse (const size_t * p, unsigned long * data, const size_t stride, const size_t n);
+
+__END_DECLS
+
+#endif /* __GSL_PERMUTE_ULONG_H__ */
diff --git a/gsl-1.9/permutation/gsl_permute_ushort.h b/gsl-1.9/permutation/gsl_permute_ushort.h
new file mode 100644
index 0000000..665ce13
--- /dev/null
+++ b/gsl-1.9/permutation/gsl_permute_ushort.h
@@ -0,0 +1,44 @@
+/* permutation/gsl_permute_ushort.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_PERMUTE_USHORT_H__
+#define __GSL_PERMUTE_USHORT_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+int gsl_permute_ushort (const size_t * p, unsigned short * data, const size_t stride, const size_t n);
+int gsl_permute_ushort_inverse (const size_t * p, unsigned short * data, const size_t stride, const size_t n);
+
+__END_DECLS
+
+#endif /* __GSL_PERMUTE_USHORT_H__ */
diff --git a/gsl-1.9/permutation/gsl_permute_vector.h b/gsl-1.9/permutation/gsl_permute_vector.h
new file mode 100644
index 0000000..4369e49
--- /dev/null
+++ b/gsl-1.9/permutation/gsl_permute_vector.h
@@ -0,0 +1,24 @@
+#ifndef __GSL_PERMUTE_VECTOR_H__
+#define __GSL_PERMUTE_VECTOR_H__
+
+#include <gsl/gsl_permute_vector_complex_long_double.h>
+#include <gsl/gsl_permute_vector_complex_double.h>
+#include <gsl/gsl_permute_vector_complex_float.h>
+
+#include <gsl/gsl_permute_vector_long_double.h>
+#include <gsl/gsl_permute_vector_double.h>
+#include <gsl/gsl_permute_vector_float.h>
+
+#include <gsl/gsl_permute_vector_ulong.h>
+#include <gsl/gsl_permute_vector_long.h>
+
+#include <gsl/gsl_permute_vector_uint.h>
+#include <gsl/gsl_permute_vector_int.h>
+
+#include <gsl/gsl_permute_vector_ushort.h>
+#include <gsl/gsl_permute_vector_short.h>
+
+#include <gsl/gsl_permute_vector_uchar.h>
+#include <gsl/gsl_permute_vector_char.h>
+
+#endif /* __GSL_PERMUTE_VECTOR_H__ */
diff --git a/gsl-1.9/permutation/gsl_permute_vector_char.h b/gsl-1.9/permutation/gsl_permute_vector_char.h
new file mode 100644
index 0000000..154a54d
--- /dev/null
+++ b/gsl-1.9/permutation/gsl_permute_vector_char.h
@@ -0,0 +1,45 @@
+/* permutation/gsl_permute_vector_char.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_PERMUTE_VECTOR_CHAR_H__
+#define __GSL_PERMUTE_VECTOR_CHAR_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+#include <gsl/gsl_vector_char.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+int gsl_permute_vector_char (const gsl_permutation * p, gsl_vector_char * v);
+int gsl_permute_vector_char_inverse (const gsl_permutation * p, gsl_vector_char * v);
+
+__END_DECLS
+
+#endif /* __GSL_PERMUTE_VECTOR_CHAR_H__ */
diff --git a/gsl-1.9/permutation/gsl_permute_vector_complex_double.h b/gsl-1.9/permutation/gsl_permute_vector_complex_double.h
new file mode 100644
index 0000000..7e7bc7d
--- /dev/null
+++ b/gsl-1.9/permutation/gsl_permute_vector_complex_double.h
@@ -0,0 +1,45 @@
+/* permutation/gsl_permute_vector_complex_double.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_PERMUTE_VECTOR_COMPLEX_DOUBLE_H__
+#define __GSL_PERMUTE_VECTOR_COMPLEX_DOUBLE_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+#include <gsl/gsl_vector_complex_double.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+int gsl_permute_vector_complex (const gsl_permutation * p, gsl_vector_complex * v);
+int gsl_permute_vector_complex_inverse (const gsl_permutation * p, gsl_vector_complex * v);
+
+__END_DECLS
+
+#endif /* __GSL_PERMUTE_VECTOR_COMPLEX_DOUBLE_H__ */
diff --git a/gsl-1.9/permutation/gsl_permute_vector_complex_float.h b/gsl-1.9/permutation/gsl_permute_vector_complex_float.h
new file mode 100644
index 0000000..11c2ac3
--- /dev/null
+++ b/gsl-1.9/permutation/gsl_permute_vector_complex_float.h
@@ -0,0 +1,45 @@
+/* permutation/gsl_permute_vector_complex_float.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_PERMUTE_VECTOR_COMPLEX_FLOAT_H__
+#define __GSL_PERMUTE_VECTOR_COMPLEX_FLOAT_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+#include <gsl/gsl_vector_complex_float.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+int gsl_permute_vector_complex_float (const gsl_permutation * p, gsl_vector_complex_float * v);
+int gsl_permute_vector_complex_float_inverse (const gsl_permutation * p, gsl_vector_complex_float * v);
+
+__END_DECLS
+
+#endif /* __GSL_PERMUTE_VECTOR_COMPLEX_FLOAT_H__ */
diff --git a/gsl-1.9/permutation/gsl_permute_vector_complex_long_double.h b/gsl-1.9/permutation/gsl_permute_vector_complex_long_double.h
new file mode 100644
index 0000000..b4c634a
--- /dev/null
+++ b/gsl-1.9/permutation/gsl_permute_vector_complex_long_double.h
@@ -0,0 +1,45 @@
+/* permutation/gsl_permute_vector_complex_long_double.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_PERMUTE_VECTOR_COMPLEX_LONG_DOUBLE_H__
+#define __GSL_PERMUTE_VECTOR_COMPLEX_LONG_DOUBLE_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+#include <gsl/gsl_vector_complex_long_double.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+int gsl_permute_vector_complex_long_double (const gsl_permutation * p, gsl_vector_complex_long_double * v);
+int gsl_permute_vector_complex_long_double_inverse (const gsl_permutation * p, gsl_vector_complex_long_double * v);
+
+__END_DECLS
+
+#endif /* __GSL_PERMUTE_VECTOR_COMPLEX_LONG_DOUBLE_H__ */
diff --git a/gsl-1.9/permutation/gsl_permute_vector_double.h b/gsl-1.9/permutation/gsl_permute_vector_double.h
new file mode 100644
index 0000000..0c4c956
--- /dev/null
+++ b/gsl-1.9/permutation/gsl_permute_vector_double.h
@@ -0,0 +1,45 @@
+/* permutation/gsl_permute_vector_double.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_PERMUTE_VECTOR_DOUBLE_H__
+#define __GSL_PERMUTE_VECTOR_DOUBLE_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+#include <gsl/gsl_vector_double.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+int gsl_permute_vector (const gsl_permutation * p, gsl_vector * v);
+int gsl_permute_vector_inverse (const gsl_permutation * p, gsl_vector * v);
+
+__END_DECLS
+
+#endif /* __GSL_PERMUTE_VECTOR_DOUBLE_H__ */
diff --git a/gsl-1.9/permutation/gsl_permute_vector_float.h b/gsl-1.9/permutation/gsl_permute_vector_float.h
new file mode 100644
index 0000000..6a3d322
--- /dev/null
+++ b/gsl-1.9/permutation/gsl_permute_vector_float.h
@@ -0,0 +1,45 @@
+/* permutation/gsl_permute_vector_float.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_PERMUTE_VECTOR_FLOAT_H__
+#define __GSL_PERMUTE_VECTOR_FLOAT_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+#include <gsl/gsl_vector_float.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+int gsl_permute_vector_float (const gsl_permutation * p, gsl_vector_float * v);
+int gsl_permute_vector_float_inverse (const gsl_permutation * p, gsl_vector_float * v);
+
+__END_DECLS
+
+#endif /* __GSL_PERMUTE_VECTOR_FLOAT_H__ */
diff --git a/gsl-1.9/permutation/gsl_permute_vector_int.h b/gsl-1.9/permutation/gsl_permute_vector_int.h
new file mode 100644
index 0000000..30af628
--- /dev/null
+++ b/gsl-1.9/permutation/gsl_permute_vector_int.h
@@ -0,0 +1,45 @@
+/* permutation/gsl_permute_vector_int.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_PERMUTE_VECTOR_INT_H__
+#define __GSL_PERMUTE_VECTOR_INT_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+#include <gsl/gsl_vector_int.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+int gsl_permute_vector_int (const gsl_permutation * p, gsl_vector_int * v);
+int gsl_permute_vector_int_inverse (const gsl_permutation * p, gsl_vector_int * v);
+
+__END_DECLS
+
+#endif /* __GSL_PERMUTE_VECTOR_INT_H__ */
diff --git a/gsl-1.9/permutation/gsl_permute_vector_long.h b/gsl-1.9/permutation/gsl_permute_vector_long.h
new file mode 100644
index 0000000..bba5280
--- /dev/null
+++ b/gsl-1.9/permutation/gsl_permute_vector_long.h
@@ -0,0 +1,45 @@
+/* permutation/gsl_permute_vector_long.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_PERMUTE_VECTOR_LONG_H__
+#define __GSL_PERMUTE_VECTOR_LONG_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+#include <gsl/gsl_vector_long.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+int gsl_permute_vector_long (const gsl_permutation * p, gsl_vector_long * v);
+int gsl_permute_vector_long_inverse (const gsl_permutation * p, gsl_vector_long * v);
+
+__END_DECLS
+
+#endif /* __GSL_PERMUTE_VECTOR_LONG_H__ */
diff --git a/gsl-1.9/permutation/gsl_permute_vector_long_double.h b/gsl-1.9/permutation/gsl_permute_vector_long_double.h
new file mode 100644
index 0000000..840143d
--- /dev/null
+++ b/gsl-1.9/permutation/gsl_permute_vector_long_double.h
@@ -0,0 +1,45 @@
+/* permutation/gsl_permute_vector_long_double.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_PERMUTE_VECTOR_LONG_DOUBLE_H__
+#define __GSL_PERMUTE_VECTOR_LONG_DOUBLE_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+#include <gsl/gsl_vector_long_double.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+int gsl_permute_vector_long_double (const gsl_permutation * p, gsl_vector_long_double * v);
+int gsl_permute_vector_long_double_inverse (const gsl_permutation * p, gsl_vector_long_double * v);
+
+__END_DECLS
+
+#endif /* __GSL_PERMUTE_VECTOR_LONG_DOUBLE_H__ */
diff --git a/gsl-1.9/permutation/gsl_permute_vector_short.h b/gsl-1.9/permutation/gsl_permute_vector_short.h
new file mode 100644
index 0000000..1850427
--- /dev/null
+++ b/gsl-1.9/permutation/gsl_permute_vector_short.h
@@ -0,0 +1,45 @@
+/* permutation/gsl_permute_vector_short.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_PERMUTE_VECTOR_SHORT_H__
+#define __GSL_PERMUTE_VECTOR_SHORT_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+#include <gsl/gsl_vector_short.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+int gsl_permute_vector_short (const gsl_permutation * p, gsl_vector_short * v);
+int gsl_permute_vector_short_inverse (const gsl_permutation * p, gsl_vector_short * v);
+
+__END_DECLS
+
+#endif /* __GSL_PERMUTE_VECTOR_SHORT_H__ */
diff --git a/gsl-1.9/permutation/gsl_permute_vector_uchar.h b/gsl-1.9/permutation/gsl_permute_vector_uchar.h
new file mode 100644
index 0000000..9e95d51
--- /dev/null
+++ b/gsl-1.9/permutation/gsl_permute_vector_uchar.h
@@ -0,0 +1,45 @@
+/* permutation/gsl_permute_vector_uchar.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_PERMUTE_VECTOR_UCHAR_H__
+#define __GSL_PERMUTE_VECTOR_UCHAR_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+#include <gsl/gsl_vector_uchar.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+int gsl_permute_vector_uchar (const gsl_permutation * p, gsl_vector_uchar * v);
+int gsl_permute_vector_uchar_inverse (const gsl_permutation * p, gsl_vector_uchar * v);
+
+__END_DECLS
+
+#endif /* __GSL_PERMUTE_VECTOR_UCHAR_H__ */
diff --git a/gsl-1.9/permutation/gsl_permute_vector_uint.h b/gsl-1.9/permutation/gsl_permute_vector_uint.h
new file mode 100644
index 0000000..db2a3ba
--- /dev/null
+++ b/gsl-1.9/permutation/gsl_permute_vector_uint.h
@@ -0,0 +1,45 @@
+/* permutation/gsl_permute_vector_uint.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_PERMUTE_VECTOR_UINT_H__
+#define __GSL_PERMUTE_VECTOR_UINT_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+#include <gsl/gsl_vector_uint.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+int gsl_permute_vector_uint (const gsl_permutation * p, gsl_vector_uint * v);
+int gsl_permute_vector_uint_inverse (const gsl_permutation * p, gsl_vector_uint * v);
+
+__END_DECLS
+
+#endif /* __GSL_PERMUTE_VECTOR_UINT_H__ */
diff --git a/gsl-1.9/permutation/gsl_permute_vector_ulong.h b/gsl-1.9/permutation/gsl_permute_vector_ulong.h
new file mode 100644
index 0000000..4a5a98a
--- /dev/null
+++ b/gsl-1.9/permutation/gsl_permute_vector_ulong.h
@@ -0,0 +1,45 @@
+/* permutation/gsl_permute_vector_ulong.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_PERMUTE_VECTOR_ULONG_H__
+#define __GSL_PERMUTE_VECTOR_ULONG_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+#include <gsl/gsl_vector_ulong.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+int gsl_permute_vector_ulong (const gsl_permutation * p, gsl_vector_ulong * v);
+int gsl_permute_vector_ulong_inverse (const gsl_permutation * p, gsl_vector_ulong * v);
+
+__END_DECLS
+
+#endif /* __GSL_PERMUTE_VECTOR_ULONG_H__ */
diff --git a/gsl-1.9/permutation/gsl_permute_vector_ushort.h b/gsl-1.9/permutation/gsl_permute_vector_ushort.h
new file mode 100644
index 0000000..d10f064
--- /dev/null
+++ b/gsl-1.9/permutation/gsl_permute_vector_ushort.h
@@ -0,0 +1,45 @@
+/* permutation/gsl_permute_vector_ushort.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_PERMUTE_VECTOR_USHORT_H__
+#define __GSL_PERMUTE_VECTOR_USHORT_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+#include <gsl/gsl_vector_ushort.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+int gsl_permute_vector_ushort (const gsl_permutation * p, gsl_vector_ushort * v);
+int gsl_permute_vector_ushort_inverse (const gsl_permutation * p, gsl_vector_ushort * v);
+
+__END_DECLS
+
+#endif /* __GSL_PERMUTE_VECTOR_USHORT_H__ */
diff --git a/gsl-1.9/permutation/init.c b/gsl-1.9/permutation/init.c
new file mode 100644
index 0000000..570794f
--- /dev/null
+++ b/gsl-1.9/permutation/init.c
@@ -0,0 +1,98 @@
+/* permutation/init.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+
+gsl_permutation *
+gsl_permutation_alloc (const size_t n)
+{
+ gsl_permutation * p;
+
+ if (n == 0)
+ {
+ GSL_ERROR_VAL ("permutation length n must be positive integer",
+ GSL_EDOM, 0);
+ }
+
+ p = (gsl_permutation *) malloc (sizeof (gsl_permutation));
+
+ if (p == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for permutation struct",
+ GSL_ENOMEM, 0);
+ }
+
+ p->data = (size_t *) malloc (n * sizeof (size_t));
+
+ if (p->data == 0)
+ {
+ free (p); /* exception in constructor, avoid memory leak */
+
+ GSL_ERROR_VAL ("failed to allocate space for permutation data",
+ GSL_ENOMEM, 0);
+ }
+
+ p->size = n;
+
+ return p;
+}
+
+gsl_permutation *
+gsl_permutation_calloc (const size_t n)
+{
+ size_t i;
+
+ gsl_permutation * p = gsl_permutation_alloc (n);
+
+ if (p == 0)
+ return 0;
+
+ /* initialize permutation to identity */
+
+ for (i = 0; i < n; i++)
+ {
+ p->data[i] = i;
+ }
+
+ return p;
+}
+
+void
+gsl_permutation_init (gsl_permutation * p)
+{
+ const size_t n = p->size ;
+ size_t i;
+
+ /* initialize permutation to identity */
+
+ for (i = 0; i < n; i++)
+ {
+ p->data[i] = i;
+ }
+}
+
+void
+gsl_permutation_free (gsl_permutation * p)
+{
+ free (p->data);
+ free (p);
+}
diff --git a/gsl-1.9/permutation/permutation.c b/gsl-1.9/permutation/permutation.c
new file mode 100644
index 0000000..e3fafdf
--- /dev/null
+++ b/gsl-1.9/permutation/permutation.c
@@ -0,0 +1,291 @@
+/* permutation/permutation.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+
+size_t
+gsl_permutation_size (const gsl_permutation * p)
+{
+ return p->size ;
+}
+
+size_t *
+gsl_permutation_data (const gsl_permutation * p)
+{
+ return p->data ;
+}
+
+#ifndef HIDE_INLINE_STATIC
+size_t
+gsl_permutation_get (const gsl_permutation * p, const size_t i)
+{
+ if (gsl_check_range)
+ {
+ if (i >= p->size) /* size_t is unsigned, can't be negative */
+ {
+ GSL_ERROR_VAL ("index out of range", GSL_EINVAL, 0);
+ }
+ }
+
+ return p->data[i];
+}
+#endif
+
+int
+gsl_permutation_swap (gsl_permutation * p, const size_t i, const size_t j)
+{
+ const size_t size = p->size ;
+
+ if (i >= size)
+ {
+ GSL_ERROR("first index is out of range", GSL_EINVAL);
+ }
+
+ if (j >= size)
+ {
+ GSL_ERROR("second index is out of range", GSL_EINVAL);
+ }
+
+ if (i != j)
+ {
+ size_t tmp = p->data[i];
+ p->data[i] = p->data[j];
+ p->data[j] = tmp;
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+int
+gsl_permutation_valid (gsl_permutation * p)
+{
+ const size_t size = p->size ;
+
+ size_t i, j ;
+
+ for (i = 0; i < size; i++)
+ {
+ if (p->data[i] >= size)
+ {
+ GSL_ERROR("permutation index outside range", GSL_FAILURE) ;
+ }
+
+ for (j = 0; j < i; j++)
+ {
+ if (p->data[i] == p->data[j])
+ {
+ GSL_ERROR("duplicate permutation index", GSL_FAILURE) ;
+ }
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+void
+gsl_permutation_reverse (gsl_permutation * p)
+{
+ const size_t size = p->size ;
+
+ size_t i ;
+
+ for (i = 0; i < (size / 2); i++)
+ {
+ size_t j = size - i - 1;
+
+ size_t tmp = p->data[i] ;
+ p->data[i] = p->data[j] ;
+ p->data[j] = tmp ;
+ }
+}
+
+int
+gsl_permutation_inverse (gsl_permutation * inv, const gsl_permutation * p)
+{
+ const size_t size = p->size ;
+
+ size_t i ;
+
+ if (inv->size != size)
+ {
+ GSL_ERROR("permutation lengths are not equal", GSL_EBADLEN);
+ }
+
+ for (i = 0; i < size; i++)
+ {
+ inv->data[p->data[i]] = i ;
+ }
+
+ return GSL_SUCCESS ;
+}
+
+int
+gsl_permutation_next (gsl_permutation * p)
+{
+ /* Replaces p with the next permutation (in the standard lexicographical
+ * ordering). Returns GSL_FAILURE if there is no next permutation.
+ */
+ const size_t size = p->size;
+ size_t i, j, k;
+
+ if (size < 2)
+ {
+ return GSL_FAILURE;
+ }
+
+ i = size - 2;
+
+ while ((p->data[i] > p->data[i+1]) && (i != 0))
+ {
+ i--;
+ }
+
+ if ((i == 0) && (p->data[0] > p->data[1]))
+ {
+ return GSL_FAILURE;
+ }
+
+ k = i + 1;
+
+ for (j = i + 2; j < size; j++ )
+ {
+ if ((p->data[j] > p->data[i]) && (p->data[j] < p->data[k]))
+ {
+ k = j;
+ }
+ }
+
+ /* swap i and k */
+
+ {
+ size_t tmp = p->data[i];
+ p->data[i] = p->data[k];
+ p->data[k] = tmp;
+ }
+
+ for (j = i + 1; j <= ((size + i) / 2); j++)
+ {
+ size_t tmp = p->data[j];
+ p->data[j] = p->data[size + i - j];
+ p->data[size + i - j] = tmp;
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+gsl_permutation_prev (gsl_permutation * p)
+{
+ const size_t size = p->size;
+ size_t i, j, k;
+
+ if (size < 2)
+ {
+ return GSL_FAILURE;
+ }
+
+ i = size - 2;
+
+ while ((p->data[i] < p->data[i+1]) && (i != 0))
+ {
+ i--;
+ }
+
+ if ((i == 0) && (p->data[0] < p->data[1]))
+ {
+ return GSL_FAILURE;
+ }
+
+ k = i + 1;
+
+ for (j = i + 2; j < size; j++ )
+ {
+ if ((p->data[j] < p->data[i]) && (p->data[j] > p->data[k]))
+ {
+ k = j;
+ }
+ }
+
+ /* swap i and k */
+
+ {
+ size_t tmp = p->data[i];
+ p->data[i] = p->data[k];
+ p->data[k] = tmp;
+ }
+
+ for (j = i + 1; j <= ((size + i) / 2); j++)
+ {
+ size_t tmp = p->data[j];
+ p->data[j] = p->data[size + i - j];
+ p->data[size + i - j] = tmp;
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+gsl_permutation_mul (gsl_permutation * p, const gsl_permutation * pa, const gsl_permutation * pb)
+{
+ size_t i;
+ const size_t size = p->size;
+
+ if (pa->size != size)
+ {
+ GSL_ERROR("size of result does not match size of pa", GSL_EINVAL);
+ }
+
+ if (pb->size != size)
+ {
+ GSL_ERROR("size of result does not match size of pb", GSL_EINVAL);
+ }
+
+ for (i = 0; i < size; i++)
+ {
+ p->data[i] = pb->data[pa->data[i]];
+ }
+
+ return GSL_SUCCESS;
+}
+int
+gsl_permutation_memcpy (gsl_permutation * dest,
+ const gsl_permutation * src)
+{
+ const size_t src_size = src->size;
+ const size_t dest_size = dest->size;
+
+ if (src_size != dest_size)
+ {
+ GSL_ERROR ("permutation lengths are not equal", GSL_EBADLEN);
+ }
+
+ {
+ size_t j;
+
+ for (j = 0; j < src_size; j++)
+ {
+ dest->data[j] = src->data[j];
+ }
+ }
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/permutation/permute.c b/gsl-1.9/permutation/permute.c
new file mode 100644
index 0000000..5859b71
--- /dev/null
+++ b/gsl-1.9/permutation/permute.c
@@ -0,0 +1,89 @@
+#include <config.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_permute.h>
+#include <gsl/gsl_permute_vector.h>
+
+#define BASE_GSL_COMPLEX_LONG
+#include "templates_on.h"
+#include "permute_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_LONG
+
+#define BASE_GSL_COMPLEX
+#include "templates_on.h"
+#include "permute_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX
+
+#define BASE_GSL_COMPLEX_FLOAT
+#include "templates_on.h"
+#include "permute_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_FLOAT
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "permute_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "permute_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "permute_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "permute_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "permute_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "permute_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "permute_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "permute_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "permute_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "permute_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "permute_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
diff --git a/gsl-1.9/permutation/permute_source.c b/gsl-1.9/permutation/permute_source.c
new file mode 100644
index 0000000..6a35c4d
--- /dev/null
+++ b/gsl-1.9/permutation/permute_source.c
@@ -0,0 +1,163 @@
+/* permutation/permute_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* In-place Permutations
+
+ permute: OUT[i] = IN[perm[i]] i = 0 .. N-1
+ invpermute: OUT[perm[i]] = IN[i] i = 0 .. N-1
+
+ PERM is an index map, i.e. a vector which contains a permutation of
+ the integers 0 .. N-1.
+
+ From Knuth "Sorting and Searching", Volume 3 (3rd ed), Section 5.2
+ Exercise 10 (answers), p 617
+
+ FIXME: these have not been fully tested.
+*/
+
+int
+TYPE (gsl_permute) (const size_t * p, ATOMIC * data, const size_t stride, const size_t n)
+{
+ size_t i, k, pk;
+
+ for (i = 0; i < n; i++)
+ {
+ k = p[i];
+
+ while (k > i)
+ k = p[k];
+
+ if (k < i)
+ continue ;
+
+ /* Now have k == i, i.e the least in its cycle */
+
+ pk = p[k];
+
+ if (pk == i)
+ continue ;
+
+ /* shuffle the elements of the cycle */
+
+ {
+ unsigned int a;
+
+ ATOMIC t[MULTIPLICITY];
+
+ for (a = 0; a < MULTIPLICITY; a++)
+ t[a] = data[i*stride*MULTIPLICITY + a];
+
+ while (pk != i)
+ {
+ for (a = 0; a < MULTIPLICITY; a++)
+ {
+ ATOMIC r1 = data[pk*stride*MULTIPLICITY + a];
+ data[k*stride*MULTIPLICITY + a] = r1;
+ }
+ k = pk;
+ pk = p[k];
+ };
+
+ for (a = 0; a < MULTIPLICITY; a++)
+ data[k*stride*MULTIPLICITY + a] = t[a];
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+FUNCTION (gsl_permute,inverse) (const size_t * p, ATOMIC * data, const size_t stride, const size_t n)
+{
+ size_t i, k, pk;
+
+ for (i = 0; i < n; i++)
+ {
+ k = p[i];
+
+ while (k > i)
+ k = p[k];
+
+ if (k < i)
+ continue ;
+
+ /* Now have k == i, i.e the least in its cycle */
+
+ pk = p[k];
+
+ if (pk == i)
+ continue ;
+
+ /* shuffle the elements of the cycle in the inverse direction */
+
+ {
+ unsigned int a;
+
+ ATOMIC t[MULTIPLICITY];
+
+ for (a = 0; a < MULTIPLICITY; a++)
+ t[a] = data[k*stride*MULTIPLICITY+a];
+
+ while (pk != i)
+ {
+ for (a = 0; a < MULTIPLICITY; a++)
+ {
+ ATOMIC r1 = data[pk*stride*MULTIPLICITY + a];
+ data[pk*stride*MULTIPLICITY + a] = t[a];
+ t[a] = r1;
+ }
+
+ k = pk;
+ pk = p[k];
+ };
+
+ for (a = 0; a < MULTIPLICITY; a++)
+ data[pk*stride*MULTIPLICITY+a] = t[a];
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+int
+TYPE (gsl_permute_vector) (const gsl_permutation * p, TYPE (gsl_vector) * v)
+{
+ if (v->size != p->size)
+ {
+ GSL_ERROR ("vector and permutation must be the same length", GSL_EBADLEN);
+ }
+
+ TYPE (gsl_permute) (p->data, v->data, v->stride, v->size) ;
+
+ return GSL_SUCCESS;
+}
+
+int
+FUNCTION (gsl_permute_vector,inverse) (const gsl_permutation * p, TYPE (gsl_vector) * v)
+{
+ if (v->size != p->size)
+ {
+ GSL_ERROR ("vector and permutation must be the same length", GSL_EBADLEN);
+ }
+
+ FUNCTION (gsl_permute,inverse) (p->data, v->data, v->stride, v->size) ;
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/permutation/test.c b/gsl-1.9/permutation/test.c
new file mode 100644
index 0000000..9e76e56
--- /dev/null
+++ b/gsl-1.9/permutation/test.c
@@ -0,0 +1,300 @@
+/* permutation/test.c
+ *
+ * Copyright (C) 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <gsl/gsl_permutation.h>
+#include <gsl/gsl_permute_double.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+
+unsigned int p5[120][5] = {
+ {0, 1, 2, 3, 4}, {0, 1, 2, 4, 3}, {0, 1, 3, 2, 4}, {0, 1, 3, 4, 2},
+ {0, 1, 4, 2, 3}, {0, 1, 4, 3, 2}, {0, 2, 1, 3, 4}, {0, 2, 1, 4, 3},
+ {0, 2, 3, 1, 4}, {0, 2, 3, 4, 1}, {0, 2, 4, 1, 3}, {0, 2, 4, 3, 1},
+ {0, 3, 1, 2, 4}, {0, 3, 1, 4, 2}, {0, 3, 2, 1, 4}, {0, 3, 2, 4, 1},
+ {0, 3, 4, 1, 2}, {0, 3, 4, 2, 1}, {0, 4, 1, 2, 3}, {0, 4, 1, 3, 2},
+ {0, 4, 2, 1, 3}, {0, 4, 2, 3, 1}, {0, 4, 3, 1, 2}, {0, 4, 3, 2, 1},
+ {1, 0, 2, 3, 4}, {1, 0, 2, 4, 3}, {1, 0, 3, 2, 4}, {1, 0, 3, 4, 2},
+ {1, 0, 4, 2, 3}, {1, 0, 4, 3, 2}, {1, 2, 0, 3, 4}, {1, 2, 0, 4, 3},
+ {1, 2, 3, 0, 4}, {1, 2, 3, 4, 0}, {1, 2, 4, 0, 3}, {1, 2, 4, 3, 0},
+ {1, 3, 0, 2, 4}, {1, 3, 0, 4, 2}, {1, 3, 2, 0, 4}, {1, 3, 2, 4, 0},
+ {1, 3, 4, 0, 2}, {1, 3, 4, 2, 0}, {1, 4, 0, 2, 3}, {1, 4, 0, 3, 2},
+ {1, 4, 2, 0, 3}, {1, 4, 2, 3, 0}, {1, 4, 3, 0, 2}, {1, 4, 3, 2, 0},
+ {2, 0, 1, 3, 4}, {2, 0, 1, 4, 3}, {2, 0, 3, 1, 4}, {2, 0, 3, 4, 1},
+ {2, 0, 4, 1, 3}, {2, 0, 4, 3, 1}, {2, 1, 0, 3, 4}, {2, 1, 0, 4, 3},
+ {2, 1, 3, 0, 4}, {2, 1, 3, 4, 0}, {2, 1, 4, 0, 3}, {2, 1, 4, 3, 0},
+ {2, 3, 0, 1, 4}, {2, 3, 0, 4, 1}, {2, 3, 1, 0, 4}, {2, 3, 1, 4, 0},
+ {2, 3, 4, 0, 1}, {2, 3, 4, 1, 0}, {2, 4, 0, 1, 3}, {2, 4, 0, 3, 1},
+ {2, 4, 1, 0, 3}, {2, 4, 1, 3, 0}, {2, 4, 3, 0, 1}, {2, 4, 3, 1, 0},
+ {3, 0, 1, 2, 4}, {3, 0, 1, 4, 2}, {3, 0, 2, 1, 4}, {3, 0, 2, 4, 1},
+ {3, 0, 4, 1, 2}, {3, 0, 4, 2, 1}, {3, 1, 0, 2, 4}, {3, 1, 0, 4, 2},
+ {3, 1, 2, 0, 4}, {3, 1, 2, 4, 0}, {3, 1, 4, 0, 2}, {3, 1, 4, 2, 0},
+ {3, 2, 0, 1, 4}, {3, 2, 0, 4, 1}, {3, 2, 1, 0, 4}, {3, 2, 1, 4, 0},
+ {3, 2, 4, 0, 1}, {3, 2, 4, 1, 0}, {3, 4, 0, 1, 2}, {3, 4, 0, 2, 1},
+ {3, 4, 1, 0, 2}, {3, 4, 1, 2, 0}, {3, 4, 2, 0, 1}, {3, 4, 2, 1, 0},
+ {4, 0, 1, 2, 3}, {4, 0, 1, 3, 2}, {4, 0, 2, 1, 3}, {4, 0, 2, 3, 1},
+ {4, 0, 3, 1, 2}, {4, 0, 3, 2, 1}, {4, 1, 0, 2, 3}, {4, 1, 0, 3, 2},
+ {4, 1, 2, 0, 3}, {4, 1, 2, 3, 0}, {4, 1, 3, 0, 2}, {4, 1, 3, 2, 0},
+ {4, 2, 0, 1, 3}, {4, 2, 0, 3, 1}, {4, 2, 1, 0, 3}, {4, 2, 1, 3, 0},
+ {4, 2, 3, 0, 1}, {4, 2, 3, 1, 0}, {4, 3, 0, 1, 2}, {4, 3, 0, 2, 1},
+ {4, 3, 1, 0, 2}, {4, 3, 1, 2, 0}, {4, 3, 2, 0, 1}, {4, 3, 2, 1, 0}
+} ;
+
+unsigned int c5[120][5] = {
+ {4, 3, 2, 1, 0}, {3, 4, 2, 1, 0}, {4, 2, 3, 1, 0}, {2, 3, 4, 1, 0},
+ {2, 4, 3, 1, 0}, {3, 2, 4, 1, 0}, {4, 3, 1, 2, 0}, {3, 4, 1, 2, 0},
+ {4, 1, 2, 3, 0}, {1, 2, 3, 4, 0}, {1, 2, 4, 3, 0}, {3, 1, 2, 4, 0},
+ {4, 1, 3, 2, 0}, {1, 3, 4, 2, 0}, {4, 2, 1, 3, 0}, {2, 1, 3, 4, 0},
+ {2, 4, 1, 3, 0}, {1, 3, 2, 4, 0}, {1, 4, 3, 2, 0}, {3, 1, 4, 2, 0},
+ {2, 1, 4, 3, 0}, {3, 2, 1, 4, 0}, {1, 4, 2, 3, 0}, {2, 3, 1, 4, 0},
+ {4, 3, 2, 0, 1}, {3, 4, 2, 0, 1}, {4, 2, 3, 0, 1}, {2, 3, 4, 0, 1},
+ {2, 4, 3, 0, 1}, {3, 2, 4, 0, 1}, {4, 3, 0, 1, 2}, {3, 4, 0, 1, 2},
+ {4, 0, 1, 2, 3}, {0, 1, 2, 3, 4}, {0, 1, 2, 4, 3}, {3, 0, 1, 2, 4},
+ {4, 0, 1, 3, 2}, {0, 1, 3, 4, 2}, {4, 2, 0, 1, 3}, {2, 0, 1, 3, 4},
+ {2, 4, 0, 1, 3}, {0, 1, 3, 2, 4}, {0, 1, 4, 3, 2}, {3, 0, 1, 4, 2},
+ {2, 0, 1, 4, 3}, {3, 2, 0, 1, 4}, {0, 1, 4, 2, 3}, {2, 3, 0, 1, 4},
+ {4, 3, 0, 2, 1}, {3, 4, 0, 2, 1}, {4, 0, 2, 3, 1}, {0, 2, 3, 4, 1},
+ {0, 2, 4, 3, 1}, {3, 0, 2, 4, 1}, {4, 3, 1, 0, 2}, {3, 4, 1, 0, 2},
+ {4, 1, 0, 2, 3}, {1, 0, 2, 3, 4}, {1, 0, 2, 4, 3}, {3, 1, 0, 2, 4},
+ {4, 1, 3, 0, 2}, {1, 3, 4, 0, 2}, {4, 0, 2, 1, 3}, {0, 2, 1, 3, 4},
+ {0, 2, 4, 1, 3}, {1, 3, 0, 2, 4}, {1, 4, 3, 0, 2}, {3, 1, 4, 0, 2},
+ {0, 2, 1, 4, 3}, {3, 0, 2, 1, 4}, {1, 4, 0, 2, 3}, {0, 2, 3, 1, 4},
+ {4, 0, 3, 2, 1}, {0, 3, 4, 2, 1}, {4, 2, 0, 3, 1}, {2, 0, 3, 4, 1},
+ {2, 4, 0, 3, 1}, {0, 3, 2, 4, 1}, {4, 1, 0, 3, 2}, {1, 0, 3, 4, 2},
+ {4, 2, 1, 0, 3}, {2, 1, 0, 3, 4}, {2, 4, 1, 0, 3}, {1, 0, 3, 2, 4},
+ {4, 0, 3, 1, 2}, {0, 3, 4, 1, 2}, {4, 1, 2, 0, 3}, {1, 2, 0, 3, 4},
+ {1, 2, 4, 0, 3}, {0, 3, 1, 2, 4}, {0, 3, 1, 4, 2}, {1, 4, 0, 3, 2},
+ {1, 4, 2, 0, 3}, {0, 3, 2, 1, 4}, {2, 1, 4, 0, 3}, {2, 0, 3, 1, 4},
+ {0, 4, 3, 2, 1}, {3, 0, 4, 2, 1}, {2, 0, 4, 3, 1}, {3, 2, 0, 4, 1},
+ {0, 4, 2, 3, 1}, {2, 3, 0, 4, 1}, {1, 0, 4, 3, 2}, {3, 1, 0, 4, 2},
+ {2, 1, 0, 4, 3}, {3, 2, 1, 0, 4}, {1, 0, 4, 2, 3}, {2, 3, 1, 0, 4},
+ {0, 4, 3, 1, 2}, {3, 0, 4, 1, 2}, {1, 2, 0, 4, 3}, {3, 1, 2, 0, 4},
+ {0, 4, 1, 2, 3}, {1, 2, 3, 0, 4}, {1, 3, 0, 4, 2}, {0, 4, 1, 3, 2},
+ {0, 4, 2, 1, 3}, {1, 3, 2, 0, 4}, {2, 0, 4, 1, 3}, {2, 1, 3, 0, 4}
+} ;
+
+unsigned int cycles[120] = {
+ 5, 4, 4, 3, 3, 4, 4, 3, 3, 2,
+ 2, 3, 3, 2, 4, 3, 3, 2, 2, 3,
+ 3, 4, 2, 3, 4, 3, 3, 2, 2, 3,
+ 3, 2, 2, 1, 1, 2, 2, 1, 3, 2,
+ 2, 1, 1, 2, 2, 3, 1, 2, 3, 2,
+ 2, 1, 1, 2, 4, 3, 3, 2, 2, 3,
+ 3, 2, 2, 1, 1, 2, 2, 3, 1, 2,
+ 2, 1, 2, 1, 3, 2, 2, 1, 3, 2,
+ 4, 3, 3, 2, 2, 1, 3, 2, 2, 1,
+ 1, 2, 2, 1, 3, 2, 1, 2, 2, 3,
+ 1, 2, 2, 3, 3, 4, 2, 3, 1, 2,
+ 2, 3, 1, 2, 2, 1, 1, 2, 2, 3
+} ;
+
+unsigned int inversions[120] = {
+ 0, 1, 1, 2, 2, 3, 1, 2, 2, 3,
+ 3, 4, 2, 3, 3, 4, 4, 5, 3, 4,
+ 4, 5, 5, 6, 1, 2, 2, 3, 3, 4,
+ 2, 3, 3, 4, 4, 5, 3, 4, 4, 5,
+ 5, 6, 4, 5, 5, 6, 6, 7, 2, 3,
+ 3, 4, 4, 5, 3, 4, 4, 5, 5, 6,
+ 4, 5, 5, 6, 6, 7, 5, 6, 6, 7,
+ 7, 8, 3, 4, 4, 5, 5, 6, 4, 5,
+ 5, 6, 6, 7, 5, 6, 6, 7, 7, 8,
+ 6, 7, 7, 8, 8, 9, 4, 5, 5, 6,
+ 6, 7, 5, 6, 6, 7, 7, 8, 6, 7,
+ 7, 8, 8, 9, 7, 8, 8, 9, 9, 10
+} ;
+
+int
+main (void)
+{
+ gsl_ieee_env_setup ();
+
+ {
+ int i = 0, j, status = 0;
+
+ gsl_permutation * p ;
+
+ p = gsl_permutation_alloc (5);
+
+ gsl_permutation_init (p);
+
+ do
+ {
+ for (j = 0; j < 5; j++)
+ {
+ status |= (p->data[j] != p5[i][j]);
+ }
+
+ i++;
+ }
+ while (gsl_permutation_next(p) == GSL_SUCCESS);
+
+ gsl_test(status, "gsl_permutation_next, 5-th order permutation, 120 steps");
+
+ do
+ {
+ i--;
+
+ for (j = 0; j < 5; j++)
+ {
+ status |= (p->data[j] != p5[i][j]);
+ }
+ }
+ while (gsl_permutation_prev(p) == GSL_SUCCESS);
+
+ gsl_test(status, "gsl_permutation_prev, 5-th order permutation, 120 steps");
+
+ gsl_permutation_free (p);
+ }
+
+#ifdef JUNK
+ {
+ int i;
+ int status = 0 ;
+
+ gsl_permutation * p1 = gsl_permutation_alloc (5);
+ gsl_permutation * p2 = gsl_permutation_alloc (5);
+ gsl_permutation * p = gsl_permutation_alloc (5);
+
+ double v[5] = { 100.0, 101.0, 102.0, 103.0, 104.0 } ;
+
+ gsl_permutation_init (p1);
+
+ do
+ {
+ gsl_permutation_init (p2);
+
+ do
+ {
+ double x[5], y[5];
+
+ /* Compute x= p1 p2 v */
+ memcpy (x, v, 5 * sizeof(double));
+ gsl_permute (p2->data, x, 1, 5);
+ gsl_permute (p1->data, x, 1, 5);
+
+ /* Compute P= p1 p2, y = P v */
+ gsl_permutation_mul (p, p1, p2);
+ memcpy (y, v, 5 * sizeof(double));
+ gsl_permute (p->data, y, 1, 5);
+
+ for (i = 0; i < 5; i++)
+ {
+ if (x[i] != y[i])
+ status = 1;
+ }
+
+ if (status == 1)
+ break;
+ }
+ while (gsl_permutation_next(p2) == GSL_SUCCESS);
+
+ if (status == 1)
+ break;
+ }
+ while (gsl_permutation_next(p1) == GSL_SUCCESS);
+
+ gsl_permutation_free (p1);
+ gsl_permutation_free (p2);
+ gsl_permutation_free (p);
+
+ gsl_test(status, "gsl_permutation_mul, all 5-th order combinations");
+ }
+#endif
+
+ /* testing cycles representations */
+ {
+ int i = 0, j, status = 0;
+
+ gsl_permutation * p = gsl_permutation_alloc (5);
+
+ gsl_permutation * plin = gsl_permutation_alloc (5);
+ gsl_permutation * pcan = gsl_permutation_alloc (5);
+
+ gsl_permutation_init (p);
+
+ do
+ {
+ gsl_permutation_memcpy (plin, p);
+
+ for (j = 0; j < 5; j++)
+ {
+ pcan->data[j] = 0;
+ }
+
+ gsl_permutation_linear_to_canonical (pcan, plin);
+
+ for (j = 0; j < 5; j++)
+ {
+ status |= (pcan->data[j] != c5[i][j]);
+ }
+
+ status |= (gsl_permutation_canonical_cycles (pcan) != cycles[i]);
+
+ status |= (gsl_permutation_linear_cycles (plin) != cycles[i]);
+
+ for (j = 0; j < 5; j++)
+ {
+ plin->data[j] = 0;
+ }
+
+ gsl_permutation_canonical_to_linear (plin, pcan);
+
+ for (j = 0; j < 5; j++)
+ {
+ status |= (plin->data[j] != p5[i][j]);
+ }
+
+ i++;
+ }
+ while (gsl_permutation_next(p) == GSL_SUCCESS);
+
+ gsl_permutation_free (p);
+ gsl_permutation_free (plin);
+ gsl_permutation_free (pcan);
+
+ gsl_test (status, "gsl_permutation canonical conversion, 5-th order permutation, 120 steps");
+ }
+
+ /* testing number of inversions */
+ {
+ int i = 0, status = 0;
+
+ gsl_permutation * p = gsl_permutation_alloc (5);
+
+ gsl_permutation_init (p);
+
+ do
+ {
+ status |= gsl_permutation_inversions (p) != inversions[i];
+ i++;
+ }
+ while (gsl_permutation_next(p) == GSL_SUCCESS);
+
+ gsl_permutation_free (p);
+
+ gsl_test (status, "gsl_permutation_inversions, 5-th order permutation, 120 steps");
+ }
+
+
+ exit (gsl_test_summary());
+}
+
diff --git a/gsl-1.9/poly/ChangeLog b/gsl-1.9/poly/ChangeLog
new file mode 100644
index 0000000..87b227d
--- /dev/null
+++ b/gsl-1.9/poly/ChangeLog
@@ -0,0 +1,72 @@
+2005-07-03 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c (main): added tests for linear case
+
+ * zsolve_quadratic.c (gsl_poly_complex_solve_quadratic): handle
+ the linear case
+
+ * solve_quadratic.c (gsl_poly_solve_quadratic): handle the linear
+ case
+
+2005-05-19 Brian Gough <bjg@network-theory.co.uk>
+
+ * Makefile.am (noinst_HEADERS): removed norm.c (unused)
+
+Sun Dec 2 22:02:31 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * dd.c: added divided differences code from Dan, Ho-Jin
+
+Wed Oct 31 18:42:10 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * qr.c (qr_companion): increased maximum number of iterations from
+ 30 to 60
+
+Thu Jun 28 11:24:51 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c (main): fixed a subtle bug in the test where the array
+ for the complex results was too small by a factor of two
+
+Mon Apr 30 12:36:08 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * eval.c (gsl_poly_eval): added eval function from specfunc
+
+Tue Aug 24 12:02:47 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * zsolve.c: added general solver using QR method
+
+1999-08-22 Mark Galassi <rosalia@lanl.gov>
+
+ * Makefile.am (libgslpoly_a_SOURCES): for now commented out
+ zsolve.c, since it has some strange errors that make it look like
+ it was not committed.
+
+Tue Aug 17 14:23:47 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * zsolve_cubic.c (gsl_poly_complex_solve_cubic): compute the
+ discriminant without division so that it is exact for exact inputs
+
+ * solve_cubic.c (gsl_poly_solve_cubic): compute the discriminant
+ without division so that it is exact for exact inputs
+
+ * changed the way roots are counted to make all the routines
+ consistent. Conincident roots are no longer a special case, now
+ they are made up of separate roots which happen to have the same
+ values.
+
+ * zsolve_quadratic.c (gsl_poly_complex_solve_quadratic): in the
+ case of a multiple root set all the returned values r0 = r1 =
+ root, rather than just setting one and leaving the others
+ potentially unset.
+
+ * solve_quadratic.c (gsl_poly_solve_quadratic): ditto
+
+Tue Aug 3 19:36:26 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_poly.h: changed all functions to take separate variables for
+ roots (z0, z1, z2) of variable-length arrays
+
+Sat Feb 20 12:13:46 1999 Brian Gough <bjg@netsci.freeserve.co.uk>
+
+ * split out polynomial root finding algorithms into a new poly/
+ directory
+
diff --git a/gsl-1.9/poly/Makefile.am b/gsl-1.9/poly/Makefile.am
new file mode 100644
index 0000000..7de94ac
--- /dev/null
+++ b/gsl-1.9/poly/Makefile.am
@@ -0,0 +1,17 @@
+noinst_LTLIBRARIES = libgslpoly.la
+
+pkginclude_HEADERS = gsl_poly.h
+
+INCLUDES= -I$(top_builddir)
+
+libgslpoly_la_SOURCES = dd.c eval.c solve_quadratic.c solve_cubic.c zsolve_quadratic.c zsolve_cubic.c zsolve.c zsolve_init.c
+
+noinst_HEADERS = balance.c companion.c qr.c
+
+TESTS = $(check_PROGRAMS)
+
+check_PROGRAMS = test
+
+test_SOURCES = test.c
+test_LDADD = libgslpoly.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+
diff --git a/gsl-1.9/poly/Makefile.in b/gsl-1.9/poly/Makefile.in
new file mode 100644
index 0000000..e0c9645
--- /dev/null
+++ b/gsl-1.9/poly/Makefile.in
@@ -0,0 +1,546 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = test$(EXEEXT)
+subdir = poly
+DIST_COMMON = $(noinst_HEADERS) $(pkginclude_HEADERS) \
+ $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog TODO
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgslpoly_la_LIBADD =
+am_libgslpoly_la_OBJECTS = dd.lo eval.lo solve_quadratic.lo \
+ solve_cubic.lo zsolve_quadratic.lo zsolve_cubic.lo zsolve.lo \
+ zsolve_init.lo
+libgslpoly_la_OBJECTS = $(am_libgslpoly_la_OBJECTS)
+am_test_OBJECTS = test.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = libgslpoly.la ../ieee-utils/libgslieeeutils.la \
+ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \
+ ../utils/libutils.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgslpoly_la_SOURCES) $(test_SOURCES)
+DIST_SOURCES = $(libgslpoly_la_SOURCES) $(test_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libgslpoly.la
+pkginclude_HEADERS = gsl_poly.h
+INCLUDES = -I$(top_builddir)
+libgslpoly_la_SOURCES = dd.c eval.c solve_quadratic.c solve_cubic.c zsolve_quadratic.c zsolve_cubic.c zsolve.c zsolve_init.c
+noinst_HEADERS = balance.c companion.c qr.c
+TESTS = $(check_PROGRAMS)
+test_SOURCES = test.c
+test_LDADD = libgslpoly.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps poly/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps poly/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgslpoly.la: $(libgslpoly_la_OBJECTS) $(libgslpoly_la_DEPENDENCIES)
+ $(LINK) $(libgslpoly_la_LDFLAGS) $(libgslpoly_la_OBJECTS) $(libgslpoly_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkgincludeHEADERS
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/poly/TODO b/gsl-1.9/poly/TODO
new file mode 100644
index 0000000..dbbc4c7
--- /dev/null
+++ b/gsl-1.9/poly/TODO
@@ -0,0 +1,130 @@
+* Estimate error on general poly roots using Newton method? Allow for
+multiple roots and higher derivatives
+
+* Newton-Maehly (Newton with implicit deflation)
+
+* Jenkins-Traub
+
+* Brian Smith's adaptation of Laguerre's method
+
+* Hirano's method, SIAM J Num Anal 19 (1982) 793-99 by Murota
+
+* Carstensen, Petkovic, "On iteration methods without derivatives for
+the simultaneous determination of polynomial zeros", J. Comput. Appl.
+Math., 45 (1993) 251-267
+
+* Investigate this,
+
+ > NA Digest Sunday, July 11, 1999 Volume 99 : Issue 28
+ >
+ > From: Murakami Hiroshi <nadigest@tmca.ac.jp>
+ > Date: Sun, 11 Jul 1999 18:56:54 +0900 (JST)
+ > Subject: Code for Wilf's Complex Bisection Method
+ >
+ > A sample demo source of root finding method for the general complex
+ > coefficient polynomial is placed to URL <ftp://ftp.tmca.ac.jp/wilf.taz>.
+ > It is about 8KB in size and is a tar and gnu-zipped file.
+ > The algorithm is taken from the following reference:
+ > HERBERT S.WILF,"A Global Bisection Algorithm for Computing the Zeros
+ > of Polynomials in the Complex Plane",ACM.vol.25,No.3,July 1978,pp.415-420.
+ >
+ > The Wilf's method is the complex plane version of the Sturm bi-section
+ > method for the real polynomial. And theoretically very interesting.
+ > For the given complex interval (complex rectilinear region and sides are
+ > parallel to the x-y axis), the procedure gives the count of the complex
+ > roots of the polynomial inside the interval. Thus, successive bi-section
+ > or quad-section of the interval can give the sequence of the shrinking
+ > intervals containing the root inside to attain the required accuracies.
+ > The source code is written mostly Fortran77 language, however some
+ > violations are intensionally left as: 1: The DO-ENDDO loop structure.
+ > 2: The longer than 6 letter names. 3: The use of under-score letter.
+ > 4: The use of include statement.
+ > The code will be placed in the public domain.
+ >
+
+* Investigate this
+
+From: "Steven G. Johnson" <stevenj@alum.mit.edu>
+To: help-gsl@gnu.org
+Subject: [Help-gsl] (in)accuracy of gsl_poly_complex_solve for repeated
+ roots?
+Date: Sun, 05 Jun 2005 16:25:40 -0400
+Precedence: list
+Envelope-to: bjg@network-theory.co.uk
+
+Hi, I noticed that gsl_poly_complex_solve seems to be surprisingly
+inaccurate. For example, if you ask it for the roots of 1 + 4x + 6x^2 +
+4x^3 + x^4, which should have x = -1 as a four-fold root (note that the
+coefficients and solutions are exactly representable), it gives roots:
+
+-0.999903+9.66605e-05i
+-0.999903-9.66605e-05i
+-1.0001+9.66834e-05i
+-1.0001-9.66834e-05i
+
+i.e. it is accurate to only 4 significant digits. (On the other hand,
+when I have 4 distinct real roots it seems to be accurate to machine
+precision.)
+
+If this kind of catastrophic accuracy loss is intrinsic to the algorithm
+when repeated roots are encountered, please note it in the manual.
+
+However, I suspect that there may be algorithms to obtain higher
+accuracy for multiple roots. I found the below references in a
+literature search on the topic, which you may want to look into. (The
+first reference can be found online at
+http://www.neiu.edu/~zzeng/multroot.htm)
+
+Cordially,
+Steven G. Johnson
+
+---------------------------------------------------------------------
+Algorithm 835: MULTROOT - a Matlab package for computing polynomial
+roots and multiplicities
+Zeng, Z. (Dept. of Math., Northeastern Illinois Univ., Chicago, IL, USA)
+Source: ACM Transactions on Mathematical Software, v 30, n 2, June 2004,
+p 218-36
+ISSN: 0098-3500 CODEN: ACMSCU
+Publisher: ACM, USA
+
+Abstract: MULTROOT is a collection of Matlab modules for accurate
+computation of polynomial roots, especially roots with nontrivial
+multiplicities. As a blackbox-type software, MULTROOT requires the
+polynomial coefficients as the only input, and outputs the computed
+roots, multiplicities, backward error, estimated forward error, and the
+structure-preserving condition number. The most significant features of
+MULTROOT are the multiplicity identification capability and high
+accuracy on multiple roots without using multiprecision arithmetic, even
+if the polynomial coefficients are inexact. A comprehensive test suite
+of polynomials that are collected from the literature is included for
+numerical experiments and performance comparison (21 refs.)
+
+---------------------------------------------------------------------
+Ten methods to bound multiple roots of polynomials
+Rump, S.M. (Inst. fur Informatik III, Tech. Univ. Hamburg-Harburg,
+Hamburg, Germany) Source: Journal of Computational and Applied
+Mathematics, v 156, n 2, 15 July 2003, p 403-32
+ISSN: 0377-0427 CODEN: JCAMDI
+Publisher: Elsevier, Netherlands
+
+Abstract: Given a univariate polynomial P with a k-fold multiple root or
+a k-fold root cluster near some z, we discuss nine different methods to
+compute a disc near z which either contains exactly or contains at least
+k roots of P. Many of the presented methods are known and of those some
+are new. We are especially interested in the behavior of methods when
+implemented in a rigorous way, that is, when taking into account all
+possible effects of rounding errors. In other words, every result shall
+be mathematically correct. We display extensive test sets comparing the
+methods under different circumstances. Based on the results, we present
+a tenth, hybrid method combining five of the previous methods which, for
+give z, (i) detects the number k of roots near z and (ii) computes an
+including disc with in most cases a radius of the order of the numerical
+sensitivity of the root cluster. Therefore, the resulting discs are
+numerically nearly optimal
+
+
+
+_______________________________________________
+Help-gsl mailing list
+Help-gsl@gnu.org
+http://lists.gnu.org/mailman/listinfo/help-gsl
diff --git a/gsl-1.9/poly/balance.c b/gsl-1.9/poly/balance.c
new file mode 100644
index 0000000..a1f7916
--- /dev/null
+++ b/gsl-1.9/poly/balance.c
@@ -0,0 +1,127 @@
+/* poly/balance.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+static void balance_companion_matrix (double *m, size_t n);
+
+#define RADIX 2
+#define RADIX2 (RADIX*RADIX)
+
+static void
+balance_companion_matrix (double *m, size_t nc)
+{
+ int not_converged = 1;
+
+ double row_norm = 0;
+ double col_norm = 0;
+
+ while (not_converged)
+ {
+ size_t i, j;
+ double g, f, s;
+
+ not_converged = 0;
+
+ for (i = 0; i < nc; i++)
+ {
+ /* column norm, excluding the diagonal */
+
+ if (i != nc - 1)
+ {
+ col_norm = fabs (MAT (m, i + 1, i, nc));
+ }
+ else
+ {
+ col_norm = 0;
+
+ for (j = 0; j < nc - 1; j++)
+ {
+ col_norm += fabs (MAT (m, j, nc - 1, nc));
+ }
+ }
+
+ /* row norm, excluding the diagonal */
+
+ if (i == 0)
+ {
+ row_norm = fabs (MAT (m, 0, nc - 1, nc));
+ }
+ else if (i == nc - 1)
+ {
+ row_norm = fabs (MAT (m, i, i - 1, nc));
+ }
+ else
+ {
+ row_norm = (fabs (MAT (m, i, i - 1, nc))
+ + fabs (MAT (m, i, nc - 1, nc)));
+ }
+
+ if (col_norm == 0 || row_norm == 0)
+ {
+ continue;
+ }
+
+ g = row_norm / RADIX;
+ f = 1;
+ s = col_norm + row_norm;
+
+ while (col_norm < g)
+ {
+ f *= RADIX;
+ col_norm *= RADIX2;
+ }
+
+ g = row_norm * RADIX;
+
+ while (col_norm > g)
+ {
+ f /= RADIX;
+ col_norm /= RADIX2;
+ }
+
+ if ((row_norm + col_norm) < 0.95 * s * f)
+ {
+ not_converged = 1;
+
+ g = 1 / f;
+
+ if (i == 0)
+ {
+ MAT (m, 0, nc - 1, nc) *= g;
+ }
+ else
+ {
+ MAT (m, i, i - 1, nc) *= g;
+ MAT (m, i, nc - 1, nc) *= g;
+ }
+
+ if (i == nc - 1)
+ {
+ for (j = 0; j < nc; j++)
+ {
+ MAT (m, j, i, nc) *= f;
+ }
+ }
+ else
+ {
+ MAT (m, i + 1, i, nc) *= f;
+ }
+ }
+ }
+ }
+}
diff --git a/gsl-1.9/poly/companion.c b/gsl-1.9/poly/companion.c
new file mode 100644
index 0000000..736483f
--- /dev/null
+++ b/gsl-1.9/poly/companion.c
@@ -0,0 +1,36 @@
+/* poly/companion.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+static void set_companion_matrix (const double *a, size_t n, double *m);
+
+static void
+set_companion_matrix (const double *a, size_t nc, double *m)
+{
+ size_t i, j;
+
+ for (i = 0; i < nc; i++)
+ for (j = 0; j < nc; j++)
+ MAT (m, i, j, nc) = 0.0;
+
+ for (i = 1; i < nc; i++)
+ MAT (m, i, i - 1, nc) = 1.0;
+
+ for (i = 0; i < nc; i++)
+ MAT (m, i, nc - 1, nc) = -a[i] / a[nc];
+}
diff --git a/gsl-1.9/poly/dd.c b/gsl-1.9/poly/dd.c
new file mode 100644
index 0000000..47bff2c
--- /dev/null
+++ b/gsl-1.9/poly/dd.c
@@ -0,0 +1,101 @@
+/* interpolation/interp_poly.c
+ *
+ * Copyright (C) 2001 DAN, HO-JIN
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Modified for standalone use in polynomial directory, B.Gough 2001 */
+
+#include <config.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_poly.h>
+
+int
+gsl_poly_dd_init (double dd[], const double xa[], const double ya[],
+ size_t size)
+{
+ size_t i, j;
+
+ /* Newton's divided differences */
+
+ dd[0] = ya[0];
+
+ for (j = size - 1; j >= 1; j--)
+ {
+ dd[j] = (ya[j] - ya[j - 1]) / (xa[j] - xa[j - 1]);
+ }
+
+ for (i = 2; i < size; i++)
+ {
+ for (j = size - 1; j >= i; j--)
+ {
+ dd[j] = (dd[j] - dd[j - 1]) / (xa[j] - xa[j - i]);
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+#ifndef HIDE_INLINE_STATIC
+double
+gsl_poly_dd_eval (const double dd[], const double xa[], const size_t size, const double x)
+{
+ size_t i;
+ double y = dd[size - 1];
+
+ for (i = size - 1; i--;)
+ {
+ y = dd[i] + (x - xa[i]) * y;
+ }
+
+ return y;
+}
+#endif
+
+int
+gsl_poly_dd_taylor (double c[], double xp,
+ const double dd[], const double xa[], size_t size,
+ double w[])
+{
+ size_t i, j;
+
+ for (i = 0; i < size; i++)
+ {
+ c[i] = 0.0;
+ w[i] = 0.0;
+ }
+
+ w[size - 1] = 1.0;
+
+ c[0] = dd[0];
+
+ for (i = size - 1; i > 0 && i--;)
+ {
+ w[i] = -w[i + 1] * (xa[size - 2 - i] - xp);
+
+ for (j = i + 1; j < size - 1; j++)
+ {
+ w[j] = w[j] - w[j + 1] * (xa[size - 2 - i] - xp);
+ }
+
+ for (j = i; j < size; j++)
+ {
+ c[j - i] += w[j] * dd[size - i - 1];
+ }
+ }
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/poly/eval.c b/gsl-1.9/poly/eval.c
new file mode 100644
index 0000000..84f6120
--- /dev/null
+++ b/gsl-1.9/poly/eval.c
@@ -0,0 +1,36 @@
+/* poly/eval.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_poly.h>
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*-*/
+
+/* checked OK [GJ] Tue May 5 12:19:56 MDT 1998 */
+
+#ifndef HIDE_INLINE_STATIC
+double
+gsl_poly_eval(const double c[], const int len, const double x)
+{
+ int i;
+ double ans = c[len-1];
+ for(i=len-1; i>0; i--) ans = c[i-1] + x * ans;
+ return ans;
+}
+#endif
diff --git a/gsl-1.9/poly/gsl_poly.h b/gsl-1.9/poly/gsl_poly.h
new file mode 100644
index 0000000..57eda42
--- /dev/null
+++ b/gsl-1.9/poly/gsl_poly.h
@@ -0,0 +1,132 @@
+/* poly/gsl_poly.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_POLY_H__
+#define __GSL_POLY_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_complex.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+
+/* Evaluate polynomial
+ *
+ * c[0] + c[1] x + c[2] x^2 + ... + c[len-1] x^(len-1)
+ *
+ * exceptions: none
+ */
+double gsl_poly_eval(const double c[], const int len, const double x);
+
+
+#ifdef HAVE_INLINE
+extern inline
+double gsl_poly_eval(const double c[], const int len, const double x)
+{
+ int i;
+ double ans = c[len-1];
+ for(i=len-1; i>0; i--) ans = c[i-1] + x * ans;
+ return ans;
+}
+#endif /* HAVE_INLINE */
+
+/* Work with divided-difference polynomials, Abramowitz & Stegun 25.2.26 */
+
+int
+gsl_poly_dd_init (double dd[], const double x[], const double y[],
+ size_t size);
+
+double
+gsl_poly_dd_eval (const double dd[], const double xa[], const size_t size, const double x);
+
+#ifdef HAVE_INLINE
+extern inline
+double gsl_poly_dd_eval(const double dd[], const double xa[], const size_t size, const double x)
+{
+ size_t i;
+ double y = dd[size - 1];
+ for (i = size - 1; i--;) y = dd[i] + (x - xa[i]) * y;
+ return y;
+}
+#endif /* HAVE_INLINE */
+
+
+int
+gsl_poly_dd_taylor (double c[], double xp,
+ const double dd[], const double x[], size_t size,
+ double w[]);
+
+/* Solve for real or complex roots of the standard quadratic equation,
+ * returning the number of real roots.
+ *
+ * Roots are returned ordered.
+ */
+int gsl_poly_solve_quadratic (double a, double b, double c,
+ double * x0, double * x1);
+
+int
+gsl_poly_complex_solve_quadratic (double a, double b, double c,
+ gsl_complex * z0, gsl_complex * z1);
+
+
+/* Solve for real roots of the cubic equation
+ * x^3 + a x^2 + b x + c = 0, returning the
+ * number of real roots.
+ *
+ * Roots are returned ordered.
+ */
+int gsl_poly_solve_cubic (double a, double b, double c,
+ double * x0, double * x1, double * x2);
+
+int
+gsl_poly_complex_solve_cubic (double a, double b, double c,
+ gsl_complex * z0, gsl_complex * z1,
+ gsl_complex * z2);
+
+
+/* Solve for the complex roots of a general real polynomial */
+
+typedef struct
+{
+ size_t nc ;
+ double * matrix ;
+}
+gsl_poly_complex_workspace ;
+
+gsl_poly_complex_workspace * gsl_poly_complex_workspace_alloc (size_t n);
+void gsl_poly_complex_workspace_free (gsl_poly_complex_workspace * w);
+
+int
+gsl_poly_complex_solve (const double * a, size_t n,
+ gsl_poly_complex_workspace * w,
+ gsl_complex_packed_ptr z);
+
+__END_DECLS
+
+#endif /* __GSL_POLY_H__ */
diff --git a/gsl-1.9/poly/qr.c b/gsl-1.9/poly/qr.c
new file mode 100644
index 0000000..23e7bfb
--- /dev/null
+++ b/gsl-1.9/poly/qr.c
@@ -0,0 +1,245 @@
+/* poly/qr.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+static int qr_companion (double *h, size_t nc, gsl_complex_packed_ptr z);
+
+static int
+qr_companion (double *h, size_t nc, gsl_complex_packed_ptr zroot)
+{
+ double t = 0.0;
+
+ size_t iterations, e, i, j, k, m;
+
+ double w, x, y, s, z;
+
+ double p = 0, q = 0, r = 0;
+
+ /* FIXME: if p,q,r, are not set to zero then the compiler complains
+ that they ``might be used uninitialized in this
+ function''. Looking at the code this does seem possible, so this
+ should be checked. */
+
+ int notlast;
+
+ size_t n = nc;
+
+next_root:
+
+ if (n == 0)
+ return GSL_SUCCESS ;
+
+ iterations = 0;
+
+next_iteration:
+
+ for (e = n; e >= 2; e--)
+ {
+ double a1 = fabs (FMAT (h, e, e - 1, nc));
+ double a2 = fabs (FMAT (h, e - 1, e - 1, nc));
+ double a3 = fabs (FMAT (h, e, e, nc));
+
+ if (a1 <= GSL_DBL_EPSILON * (a2 + a3))
+ break;
+ }
+
+ x = FMAT (h, n, n, nc);
+
+ if (e == n)
+ {
+ GSL_SET_COMPLEX_PACKED (zroot, n-1, x + t, 0); /* one real root */
+ n--;
+ goto next_root;
+ /*continue;*/
+ }
+
+ y = FMAT (h, n - 1, n - 1, nc);
+ w = FMAT (h, n - 1, n, nc) * FMAT (h, n, n - 1, nc);
+
+ if (e == n - 1)
+ {
+ p = (y - x) / 2;
+ q = p * p + w;
+ y = sqrt (fabs (q));
+
+ x += t;
+
+ if (q > 0) /* two real roots */
+ {
+ if (p < 0)
+ y = -y;
+ y += p;
+
+ GSL_SET_COMPLEX_PACKED (zroot, n-1, x - w / y, 0);
+ GSL_SET_COMPLEX_PACKED (zroot, n-2, x + y, 0);
+ }
+ else
+ {
+ GSL_SET_COMPLEX_PACKED (zroot, n-1, x + p, -y);
+ GSL_SET_COMPLEX_PACKED (zroot, n-2, x + p, y);
+ }
+ n -= 2;
+
+ goto next_root;
+ /*continue;*/
+ }
+
+ /* No more roots found yet, do another iteration */
+
+ if (iterations == 60) /* increased from 30 to 60 */
+ {
+ /* too many iterations - give up! */
+
+ return GSL_FAILURE ;
+ }
+
+ if (iterations % 10 == 0 && iterations > 0)
+ {
+ /* use an exceptional shift */
+
+ t += x;
+
+ for (i = 1; i <= n; i++)
+ {
+ FMAT (h, i, i, nc) -= x;
+ }
+
+ s = fabs (FMAT (h, n, n - 1, nc)) + fabs (FMAT (h, n - 1, n - 2, nc));
+ y = 0.75 * s;
+ x = y;
+ w = -0.4375 * s * s;
+ }
+
+ iterations++;
+
+ for (m = n - 2; m >= e; m--)
+ {
+ double a1, a2, a3;
+
+ z = FMAT (h, m, m, nc);
+ r = x - z;
+ s = y - z;
+ p = FMAT (h, m, m + 1, nc) + (r * s - w) / FMAT (h, m + 1, m, nc);
+ q = FMAT (h, m + 1, m + 1, nc) - z - r - s;
+ r = FMAT (h, m + 2, m + 1, nc);
+ s = fabs (p) + fabs (q) + fabs (r);
+ p /= s;
+ q /= s;
+ r /= s;
+
+ if (m == e)
+ break;
+
+ a1 = fabs (FMAT (h, m, m - 1, nc));
+ a2 = fabs (FMAT (h, m - 1, m - 1, nc));
+ a3 = fabs (FMAT (h, m + 1, m + 1, nc));
+
+ if (a1 * (fabs (q) + fabs (r)) <= GSL_DBL_EPSILON * fabs (p) * (a2 + a3))
+ break;
+ }
+
+ for (i = m + 2; i <= n; i++)
+ {
+ FMAT (h, i, i - 2, nc) = 0;
+ }
+
+ for (i = m + 3; i <= n; i++)
+ {
+ FMAT (h, i, i - 3, nc) = 0;
+ }
+
+ /* double QR step */
+
+ for (k = m; k <= n - 1; k++)
+ {
+ notlast = (k != n - 1);
+
+ if (k != m)
+ {
+ p = FMAT (h, k, k - 1, nc);
+ q = FMAT (h, k + 1, k - 1, nc);
+ r = notlast ? FMAT (h, k + 2, k - 1, nc) : 0.0;
+
+ x = fabs (p) + fabs (q) + fabs (r);
+
+ if (x == 0)
+ continue; /* FIXME????? */
+
+ p /= x;
+ q /= x;
+ r /= x;
+ }
+
+ s = sqrt (p * p + q * q + r * r);
+
+ if (p < 0)
+ s = -s;
+
+ if (k != m)
+ {
+ FMAT (h, k, k - 1, nc) = -s * x;
+ }
+ else if (e != m)
+ {
+ FMAT (h, k, k - 1, nc) *= -1;
+ }
+
+ p += s;
+ x = p / s;
+ y = q / s;
+ z = r / s;
+ q /= p;
+ r /= p;
+
+ /* do row modifications */
+
+ for (j = k; j <= n; j++)
+ {
+ p = FMAT (h, k, j, nc) + q * FMAT (h, k + 1, j, nc);
+
+ if (notlast)
+ {
+ p += r * FMAT (h, k + 2, j, nc);
+ FMAT (h, k + 2, j, nc) -= p * z;
+ }
+
+ FMAT (h, k + 1, j, nc) -= p * y;
+ FMAT (h, k, j, nc) -= p * x;
+ }
+
+ j = (k + 3 < n) ? (k + 3) : n;
+
+ /* do column modifications */
+
+ for (i = e; i <= j; i++)
+ {
+ p = x * FMAT (h, i, k, nc) + y * FMAT (h, i, k + 1, nc);
+
+ if (notlast)
+ {
+ p += z * FMAT (h, i, k + 2, nc);
+ FMAT (h, i, k + 2, nc) -= p * r;
+ }
+ FMAT (h, i, k + 1, nc) -= p * q;
+ FMAT (h, i, k, nc) -= p;
+ }
+ }
+
+ goto next_iteration;
+}
+
diff --git a/gsl-1.9/poly/solve_cubic.c b/gsl-1.9/poly/solve_cubic.c
new file mode 100644
index 0000000..979e56a
--- /dev/null
+++ b/gsl-1.9/poly/solve_cubic.c
@@ -0,0 +1,110 @@
+/* poly/solve_cubic.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* solve_cubic.c - finds the real roots of x^3 + a x^2 + b x + c = 0 */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_poly.h>
+
+#define SWAP(a,b) do { double tmp = b ; b = a ; a = tmp ; } while(0)
+
+int
+gsl_poly_solve_cubic (double a, double b, double c,
+ double *x0, double *x1, double *x2)
+{
+ double q = (a * a - 3 * b);
+ double r = (2 * a * a * a - 9 * a * b + 27 * c);
+
+ double Q = q / 9;
+ double R = r / 54;
+
+ double Q3 = Q * Q * Q;
+ double R2 = R * R;
+
+ double CR2 = 729 * r * r;
+ double CQ3 = 2916 * q * q * q;
+
+ if (R == 0 && Q == 0)
+ {
+ *x0 = - a / 3 ;
+ *x1 = - a / 3 ;
+ *x2 = - a / 3 ;
+ return 3 ;
+ }
+ else if (CR2 == CQ3)
+ {
+ /* this test is actually R2 == Q3, written in a form suitable
+ for exact computation with integers */
+
+ /* Due to finite precision some double roots may be missed, and
+ considered to be a pair of complex roots z = x +/- epsilon i
+ close to the real axis. */
+
+ double sqrtQ = sqrt (Q);
+
+ if (R > 0)
+ {
+ *x0 = -2 * sqrtQ - a / 3;
+ *x1 = sqrtQ - a / 3;
+ *x2 = sqrtQ - a / 3;
+ }
+ else
+ {
+ *x0 = - sqrtQ - a / 3;
+ *x1 = - sqrtQ - a / 3;
+ *x2 = 2 * sqrtQ - a / 3;
+ }
+ return 3 ;
+ }
+ else if (CR2 < CQ3) /* equivalent to R2 < Q3 */
+ {
+ double sqrtQ = sqrt (Q);
+ double sqrtQ3 = sqrtQ * sqrtQ * sqrtQ;
+ double theta = acos (R / sqrtQ3);
+ double norm = -2 * sqrtQ;
+ *x0 = norm * cos (theta / 3) - a / 3;
+ *x1 = norm * cos ((theta + 2.0 * M_PI) / 3) - a / 3;
+ *x2 = norm * cos ((theta - 2.0 * M_PI) / 3) - a / 3;
+
+ /* Sort *x0, *x1, *x2 into increasing order */
+
+ if (*x0 > *x1)
+ SWAP(*x0, *x1) ;
+
+ if (*x1 > *x2)
+ {
+ SWAP(*x1, *x2) ;
+
+ if (*x0 > *x1)
+ SWAP(*x0, *x1) ;
+ }
+
+ return 3;
+ }
+ else
+ {
+ double sgnR = (R >= 0 ? 1 : -1);
+ double A = -sgnR * pow (fabs (R) + sqrt (R2 - Q3), 1.0/3.0);
+ double B = Q / A ;
+ *x0 = A + B - a / 3;
+ return 1;
+ }
+}
diff --git a/gsl-1.9/poly/solve_quadratic.c b/gsl-1.9/poly/solve_quadratic.c
new file mode 100644
index 0000000..8af69db
--- /dev/null
+++ b/gsl-1.9/poly/solve_quadratic.c
@@ -0,0 +1,85 @@
+/* poly/solve_quadratic.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* solve_quadratic.c - finds the real roots of a x^2 + b x + c = 0 */
+
+#include <config.h>
+#include <math.h>
+
+#include <gsl/gsl_poly.h>
+
+int
+gsl_poly_solve_quadratic (double a, double b, double c,
+ double *x0, double *x1)
+{
+ double disc = b * b - 4 * a * c;
+
+ if (a == 0) /* Handle linear case */
+ {
+ if (b == 0)
+ {
+ return 0;
+ }
+ else
+ {
+ *x0 = -c / b;
+ return 1;
+ };
+ }
+
+ if (disc > 0)
+ {
+ if (b == 0)
+ {
+ double r = fabs (0.5 * sqrt (disc) / a);
+ *x0 = -r;
+ *x1 = r;
+ }
+ else
+ {
+ double sgnb = (b > 0 ? 1 : -1);
+ double temp = -0.5 * (b + sgnb * sqrt (disc));
+ double r1 = temp / a ;
+ double r2 = c / temp ;
+
+ if (r1 < r2)
+ {
+ *x0 = r1 ;
+ *x1 = r2 ;
+ }
+ else
+ {
+ *x0 = r2 ;
+ *x1 = r1 ;
+ }
+ }
+ return 2;
+ }
+ else if (disc == 0)
+ {
+ *x0 = -0.5 * b / a ;
+ *x1 = -0.5 * b / a ;
+ return 2 ;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
diff --git a/gsl-1.9/poly/test.c b/gsl-1.9/poly/test.c
new file mode 100644
index 0000000..bd0e141
--- /dev/null
+++ b/gsl-1.9/poly/test.c
@@ -0,0 +1,508 @@
+/* poly/test.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_poly.h>
+
+int
+main (void)
+{
+ const double eps = 100.0 * GSL_DBL_EPSILON;
+
+ gsl_ieee_env_setup ();
+
+ {
+ double x, y;
+ double c[3] = { 1.0, 0.5, 0.3 };
+ x = 0.5;
+ y = gsl_poly_eval (c, 3, x);
+ gsl_test_rel (y, 1 + 0.5 * x + 0.3 * x * x, eps,
+ "gsl_poly_eval({1, 0.5, 0.3}, 0.5)");
+ }
+
+ {
+ double x, y;
+ double d[11] = { 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1 };
+ x = 1.0;
+ y = gsl_poly_eval (d, 11, x);
+ gsl_test_rel (y, 1.0, eps,
+ "gsl_poly_eval({1,-1, 1, -1, 1, -1, 1, -1, 1, -1, 1}, 1.0)");
+
+ }
+
+ /* Quadratic */
+
+ {
+ double x0, x1;
+
+ int n = gsl_poly_solve_quadratic (4.0, -20.0, 26.0, &x0, &x1);
+
+ gsl_test (n != 0, "gsl_poly_solve_quadratic, no roots, (2x - 5)^2 = -1");
+ }
+
+ {
+ double x0, x1;
+
+ int n = gsl_poly_solve_quadratic (4.0, -20.0, 25.0, &x0, &x1);
+
+ gsl_test (n != 2, "gsl_poly_solve_quadratic, one root, (2x - 5)^2 = 0");
+ gsl_test_rel (x0, 2.5, 1e-9, "x0, (2x - 5)^2 = 0");
+ gsl_test_rel (x1, 2.5, 1e-9, "x1, (2x - 5)^2 = 0");
+ gsl_test (x0 != x1, "x0 == x1, (2x - 5)^2 = 0");
+ }
+
+ {
+ double x0, x1;
+
+ int n = gsl_poly_solve_quadratic (4.0, -20.0, 21.0, &x0, &x1);
+
+ gsl_test (n != 2, "gsl_poly_solve_quadratic, two roots, (2x - 5)^2 = 4");
+ gsl_test_rel (x0, 1.5, 1e-9, "x0, (2x - 5)^2 = 4");
+ gsl_test_rel (x1, 3.5, 1e-9, "x1, (2x - 5)^2 = 4");
+ }
+
+ {
+ double x0, x1;
+
+ int n = gsl_poly_solve_quadratic (4.0, 7.0, 0.0, &x0, &x1);
+
+ gsl_test (n != 2, "gsl_poly_solve_quadratic, two roots, x(4x + 7) = 0");
+ gsl_test_rel (x0, -1.75, 1e-9, "x0, x(4x + 7) = 0");
+ gsl_test_rel (x1, 0.0, 1e-9, "x1, x(4x + 7) = 0");
+ }
+
+ {
+ double x0, x1;
+
+ int n = gsl_poly_solve_quadratic (5.0, 0.0, -20.0, &x0, &x1);
+
+ gsl_test (n != 2,
+ "gsl_poly_solve_quadratic, two roots b = 0, 5 x^2 = 20");
+ gsl_test_rel (x0, -2.0, 1e-9, "x0, 5 x^2 = 20");
+ gsl_test_rel (x1, 2.0, 1e-9, "x1, 5 x^2 = 20");
+ }
+
+
+ {
+ double x0, x1;
+
+ int n = gsl_poly_solve_quadratic (0.0, 3.0, -21.0, &x0, &x1);
+
+ gsl_test (n != 1,
+ "gsl_poly_solve_quadratic, one root (linear) 3 x - 21 = 0");
+ gsl_test_rel (x0, 7.0, 1e-9, "x0, 3x - 21 = 0");
+ }
+
+
+ {
+ double x0, x1;
+ int n = gsl_poly_solve_quadratic (0.0, 0.0, 1.0, &x0, &x1);
+
+ gsl_test (n != 0,
+ "gsl_poly_solve_quadratic, no roots 1 = 0");
+ }
+
+
+ /* Cubic */
+
+ {
+ double x0, x1, x2;
+
+ int n = gsl_poly_solve_cubic (0.0, 0.0, -27.0, &x0, &x1, &x2);
+
+ gsl_test (n != 1, "gsl_poly_solve_cubic, one root, x^3 = 27");
+ gsl_test_rel (x0, 3.0, 1e-9, "x0, x^3 = 27");
+ }
+
+ {
+ double x0, x1, x2;
+
+ int n = gsl_poly_solve_cubic (-51.0, 867.0, -4913.0, &x0, &x1, &x2);
+
+ gsl_test (n != 3, "gsl_poly_solve_cubic, three roots, (x-17)^3=0");
+ gsl_test_rel (x0, 17.0, 1e-9, "x0, (x-17)^3=0");
+ gsl_test_rel (x1, 17.0, 1e-9, "x1, (x-17)^3=0");
+ gsl_test_rel (x2, 17.0, 1e-9, "x2, (x-17)^3=0");
+ }
+
+ {
+ double x0, x1, x2;
+
+ int n = gsl_poly_solve_cubic (-57.0, 1071.0, -6647.0, &x0, &x1, &x2);
+
+ gsl_test (n != 3,
+ "gsl_poly_solve_cubic, three roots, (x-17)(x-17)(x-23)=0");
+ gsl_test_rel (x0, 17.0, 1e-9, "x0, (x-17)(x-17)(x-23)=0");
+ gsl_test_rel (x1, 17.0, 1e-9, "x1, (x-17)(x-17)(x-23)=0");
+ gsl_test_rel (x2, 23.0, 1e-9, "x2, (x-17)(x-17)(x-23)=0");
+ }
+
+ {
+ double x0, x1, x2;
+
+ int n = gsl_poly_solve_cubic (-11.0, -493.0, +6647.0, &x0, &x1, &x2);
+
+ gsl_test (n != 3,
+ "gsl_poly_solve_cubic, three roots, (x+23)(x-17)(x-17)=0");
+ gsl_test_rel (x0, -23.0, 1e-9, "x0, (x+23)(x-17)(x-17)=0");
+ gsl_test_rel (x1, 17.0, 1e-9, "x1, (x+23)(x-17)(x-17)=0");
+ gsl_test_rel (x2, 17.0, 1e-9, "x2, (x+23)(x-17)(x-17)=0");
+ }
+
+ {
+ double x0, x1, x2;
+
+ int n = gsl_poly_solve_cubic (-143.0, 5087.0, -50065.0, &x0, &x1, &x2);
+
+ gsl_test (n != 3,
+ "gsl_poly_solve_cubic, three roots, (x-17)(x-31)(x-95)=0");
+ gsl_test_rel (x0, 17.0, 1e-9, "x0, (x-17)(x-31)(x-95)=0");
+ gsl_test_rel (x1, 31.0, 1e-9, "x1, (x-17)(x-31)(x-95)=0");
+ gsl_test_rel (x2, 95.0, 1e-9, "x2, (x-17)(x-31)(x-95)=0");
+ }
+
+ {
+ double x0, x1, x2;
+
+ int n = gsl_poly_solve_cubic (-109.0, 803.0, 50065.0, &x0, &x1, &x2);
+
+ gsl_test (n != 3,
+ "gsl_poly_solve_cubic, three roots, (x+17)(x-31)(x-95)=0");
+ gsl_test_rel (x0, -17.0, 1e-9, "x0, (x+17)(x-31)(x-95)=0");
+ gsl_test_rel (x1, 31.0, 1e-9, "x1, (x+17)(x-31)(x-95)=0");
+ gsl_test_rel (x2, 95.0, 1e-9, "x2, (x+17)(x-31)(x-95)=0");
+ }
+
+ /* Quadratic with complex roots */
+
+ {
+ gsl_complex z0, z1;
+
+ int n = gsl_poly_complex_solve_quadratic (4.0, -20.0, 26.0, &z0, &z1);
+
+ gsl_test (n != 2,
+ "gsl_poly_complex_solve_quadratic, 2 roots (2x - 5)^2 = -1");
+ gsl_test_rel (GSL_REAL (z0), 2.5, 1e-9, "z0.real, (2x - 5)^2 = -1");
+ gsl_test_rel (GSL_IMAG (z0), -0.5, 1e-9, "z0.imag, (2x - 5)^2 = -1");
+
+ gsl_test_rel (GSL_REAL (z1), 2.5, 1e-9, "z1.real, (2x - 5)^2 = -1");
+ gsl_test_rel (GSL_IMAG (z1), 0.5, 1e-9, "z1.imag, (2x - 5)^2 = -1");
+ }
+
+ {
+ gsl_complex z0, z1;
+
+ int n = gsl_poly_complex_solve_quadratic (4.0, -20.0, 25.0, &z0, &z1);
+
+ gsl_test (n != 2,
+ "gsl_poly_complex_solve_quadratic, one root, (2x - 5)^2 = 0");
+ gsl_test_rel (GSL_REAL (z0), 2.5, 1e-9, "z0.real, (2x - 5)^2 = 0");
+ gsl_test_rel (GSL_IMAG (z0), 0.0, 1e-9, "z0.imag (2x - 5)^2 = 0");
+ gsl_test_rel (GSL_REAL (z1), 2.5, 1e-9, "z1.real, (2x - 5)^2 = 0");
+ gsl_test_rel (GSL_IMAG (z1), 0.0, 1e-9, "z1.imag (2x - 5)^2 = 0");
+ gsl_test (GSL_REAL (z0) != GSL_REAL (z1),
+ "z0.real == z1.real, (2x - 5)^2 = 0");
+ gsl_test (GSL_IMAG (z0) != GSL_IMAG (z1),
+ "z0.imag == z1.imag, (2x - 5)^2 = 0");
+ }
+
+ {
+ gsl_complex z0, z1;
+
+ int n = gsl_poly_complex_solve_quadratic (4.0, -20.0, 21.0, &z0, &z1);
+
+ gsl_test (n != 2,
+ "gsl_poly_complex_solve_quadratic, two roots, (2x - 5)^2 = 4");
+ gsl_test_rel (GSL_REAL (z0), 1.5, 1e-9, "z0.real, (2x - 5)^2 = 4");
+ gsl_test_rel (GSL_IMAG (z0), 0.0, 1e-9, "z0.imag, (2x - 5)^2 = 4");
+ gsl_test_rel (GSL_REAL (z1), 3.5, 1e-9, "z1.real, (2x - 5)^2 = 4");
+ gsl_test_rel (GSL_IMAG (z1), 0.0, 1e-9, "z1.imag, (2x - 5)^2 = 4");
+ }
+
+ {
+ gsl_complex z0, z1;
+
+ int n = gsl_poly_complex_solve_quadratic (4.0, 7.0, 0.0, &z0, &z1);
+
+ gsl_test (n != 2,
+ "gsl_poly_complex_solve_quadratic, two roots, x(4x + 7) = 0");
+ gsl_test_rel (GSL_REAL (z0), -1.75, 1e-9, "z0.real, x(4x + 7) = 0");
+ gsl_test_rel (GSL_IMAG (z0), 0.0, 1e-9, "z0.imag, x(4x + 7) = 0");
+ gsl_test_rel (GSL_REAL (z1), 0.0, 1e-9, "z1.real, x(4x + 7) = 0");
+ gsl_test_rel (GSL_IMAG (z1), 0.0, 1e-9, "z1.imag, x(4x + 7) = 0");
+ }
+
+ {
+ gsl_complex z0, z1;
+
+ int n = gsl_poly_complex_solve_quadratic (5.0, 0.0, -20.0, &z0, &z1);
+
+ gsl_test (n != 2,
+ "gsl_poly_complex_solve_quadratic, two roots b = 0, 5 x^2 = 20");
+ gsl_test_rel (GSL_REAL (z0), -2.0, 1e-9, "z0.real, 5 x^2 = 20");
+ gsl_test_rel (GSL_IMAG (z0), 0.0, 1e-9, "z0.imag, 5 x^2 = 20");
+ gsl_test_rel (GSL_REAL (z1), 2.0, 1e-9, "z1.real, 5 x^2 = 20");
+ gsl_test_rel (GSL_IMAG (z1), 0.0, 1e-9, "z1.imag, 5 x^2 = 20");
+ }
+
+ {
+ gsl_complex z0, z1;
+
+ int n = gsl_poly_complex_solve_quadratic (5.0, 0.0, 20.0, &z0, &z1);
+
+ gsl_test (n != 2,
+ "gsl_poly_complex_solve_quadratic, two roots b = 0, 5 x^2 = -20");
+ gsl_test_rel (GSL_REAL (z0), 0.0, 1e-9, "z0.real, 5 x^2 = -20");
+ gsl_test_rel (GSL_IMAG (z0), -2.0, 1e-9, "z0.imag, 5 x^2 = -20");
+ gsl_test_rel (GSL_REAL (z1), 0.0, 1e-9, "z1.real, 5 x^2 = -20");
+ gsl_test_rel (GSL_IMAG (z1), 2.0, 1e-9, "z1.imag, 5 x^2 = -20");
+ }
+
+
+ {
+ gsl_complex z0, z1;
+
+ int n = gsl_poly_complex_solve_quadratic (0.0, 3.0, -21.0, &z0, &z1);
+
+ gsl_test (n != 1,
+ "gsl_poly_complex_solve_quadratic, one root (linear) 3 x - 21 = 0");
+
+ gsl_test_rel (GSL_REAL (z0), 7.0, 1e-9, "z0.real, 3x - 21 = 0");
+ gsl_test_rel (GSL_IMAG (z0), 0.0, 1e-9, "z0.imag, 3x - 21 = 0");
+ }
+
+
+ {
+ gsl_complex z0, z1;
+
+ int n = gsl_poly_complex_solve_quadratic (0.0, 0.0, 1.0, &z0, &z1);
+ gsl_test (n != 0,
+ "gsl_poly_complex_solve_quadratic, no roots 1 = 0");
+ }
+
+
+
+ /* Cubic with complex roots */
+
+ {
+ gsl_complex z0, z1, z2;
+
+ int n = gsl_poly_complex_solve_cubic (0.0, 0.0, -27.0, &z0, &z1, &z2);
+
+ gsl_test (n != 3, "gsl_poly_complex_solve_cubic, three root, x^3 = 27");
+ gsl_test_rel (GSL_REAL (z0), -1.5, 1e-9, "z0.real, x^3 = 27");
+ gsl_test_rel (GSL_IMAG (z0), -1.5 * sqrt (3.0), 1e-9,
+ "z0.imag, x^3 = 27");
+ gsl_test_rel (GSL_REAL (z1), -1.5, 1e-9, "z1.real, x^3 = 27");
+ gsl_test_rel (GSL_IMAG (z1), 1.5 * sqrt (3.0), 1e-9, "z1.imag, x^3 = 27");
+ gsl_test_rel (GSL_REAL (z2), 3.0, 1e-9, "z2.real, x^3 = 27");
+ gsl_test_rel (GSL_IMAG (z2), 0.0, 1e-9, "z2.imag, x^3 = 27");
+ }
+
+ {
+ gsl_complex z0, z1, z2;
+
+ int n = gsl_poly_complex_solve_cubic (-1.0, 1.0, 39.0, &z0, &z1, &z2);
+
+ gsl_test (n != 3,
+ "gsl_poly_complex_solve_cubic, three root, (x+3)(x^2-4x+13) = 0");
+ gsl_test_rel (GSL_REAL (z0), -3.0, 1e-9, "z0.real, (x+3)(x^2+1) = 0");
+ gsl_test_rel (GSL_IMAG (z0), 0.0, 1e-9, "z0.imag, (x+3)(x^2+1) = 0");
+ gsl_test_rel (GSL_REAL (z1), 2.0, 1e-9, "z1.real, (x+3)(x^2+1) = 0");
+ gsl_test_rel (GSL_IMAG (z1), -3.0, 1e-9, "z1.imag, (x+3)(x^2+1) = 0");
+ gsl_test_rel (GSL_REAL (z2), 2.0, 1e-9, "z2.real, (x+3)(x^2+1) = 0");
+ gsl_test_rel (GSL_IMAG (z2), 3.0, 1e-9, "z2.imag, (x+3)(x^2+1) = 0");
+ }
+
+ {
+ gsl_complex z0, z1, z2;
+
+ int n =
+ gsl_poly_complex_solve_cubic (-51.0, 867.0, -4913.0, &z0, &z1, &z2);
+
+ gsl_test (n != 3,
+ "gsl_poly_complex_solve_cubic, three roots, (x-17)^3=0");
+ gsl_test_rel (GSL_REAL (z0), 17.0, 1e-9, "z0.real, (x-17)^3=0");
+ gsl_test_rel (GSL_IMAG (z0), 0.0, 1e-9, "z0.imag, (x-17)^3=0");
+ gsl_test_rel (GSL_REAL (z1), 17.0, 1e-9, "z1.real, (x-17)^3=0");
+ gsl_test_rel (GSL_IMAG (z1), 0.0, 1e-9, "z1.imag, (x-17)^3=0");
+ gsl_test_rel (GSL_REAL (z2), 17.0, 1e-9, "z2.real, (x-17)^3=0");
+ gsl_test_rel (GSL_IMAG (z2), 0.0, 1e-9, "z2.imag, (x-17)^3=0");
+ }
+
+ {
+ gsl_complex z0, z1, z2;
+
+ int n =
+ gsl_poly_complex_solve_cubic (-57.0, 1071.0, -6647.0, &z0, &z1, &z2);
+
+ gsl_test (n != 3,
+ "gsl_poly_complex_solve_cubic, three roots, (x-17)(x-17)(x-23)=0");
+ gsl_test_rel (GSL_REAL (z0), 17.0, 1e-9, "z0.real, (x-17)(x-17)(x-23)=0");
+ gsl_test_rel (GSL_IMAG (z0), 0.0, 1e-9, "z0.imag, (x-17)(x-17)(x-23)=0");
+ gsl_test_rel (GSL_REAL (z1), 17.0, 1e-9, "z1.real, (x-17)(x-17)(x-23)=0");
+ gsl_test_rel (GSL_IMAG (z1), 0.0, 1e-9, "z1.imag, (x-17)(x-17)(x-23)=0");
+ gsl_test_rel (GSL_REAL (z2), 23.0, 1e-9, "z2.real, (x-17)(x-17)(x-23)=0");
+ gsl_test_rel (GSL_IMAG (z2), 0.0, 1e-9, "z2.imag, (x-17)(x-17)(x-23)=0");
+ }
+
+ {
+ gsl_complex z0, z1, z2;
+
+ int n =
+ gsl_poly_complex_solve_cubic (-11.0, -493.0, +6647.0, &z0, &z1, &z2);
+
+ gsl_test (n != 3,
+ "gsl_poly_complex_solve_cubic, three roots, (x+23)(x-17)(x-17)=0");
+ gsl_test_rel (GSL_REAL (z0), -23.0, 1e-9,
+ "z0.real, (x+23)(x-17)(x-17)=0");
+ gsl_test_rel (GSL_IMAG (z0), 0.0, 1e-9, "z0.imag, (x+23)(x-17)(x-17)=0");
+ gsl_test_rel (GSL_REAL (z1), 17.0, 1e-9, "z1.real, (x+23)(x-17)(x-17)=0");
+ gsl_test_rel (GSL_IMAG (z1), 0.0, 1e-9, "z1.imag, (x+23)(x-17)(x-17)=0");
+ gsl_test_rel (GSL_REAL (z2), 17.0, 1e-9, "z2.real, (x+23)(x-17)(x-17)=0");
+ gsl_test_rel (GSL_IMAG (z2), 0.0, 1e-9, "z2.imag, (x+23)(x-17)(x-17)=0");
+ }
+
+
+ {
+ gsl_complex z0, z1, z2;
+
+ int n =
+ gsl_poly_complex_solve_cubic (-143.0, 5087.0, -50065.0, &z0, &z1, &z2);
+
+ gsl_test (n != 3,
+ "gsl_poly_complex_solve_cubic, three roots, (x-17)(x-31)(x-95)=0");
+ gsl_test_rel (GSL_REAL (z0), 17.0, 1e-9, "z0.real, (x-17)(x-31)(x-95)=0");
+ gsl_test_rel (GSL_IMAG (z0), 0.0, 1e-9, "z0.imag, (x-17)(x-31)(x-95)=0");
+ gsl_test_rel (GSL_REAL (z1), 31.0, 1e-9, "z1.real, (x-17)(x-31)(x-95)=0");
+ gsl_test_rel (GSL_IMAG (z1), 0.0, 1e-9, "z1.imag, (x-17)(x-31)(x-95)=0");
+ gsl_test_rel (GSL_REAL (z2), 95.0, 1e-9, "z2.real, (x-17)(x-31)(x-95)=0");
+ gsl_test_rel (GSL_IMAG (z2), 0.0, 1e-9, "z2.imag, (x-17)(x-31)(x-95)=0");
+ }
+
+
+ {
+ /* Wilkinson polynomial: y = (x-1)(x-2)(x-3)(x-4)(x-5) */
+
+ double a[6] = { -120, 274, -225, 85, -15, 1 };
+ double z[6*2];
+
+ gsl_poly_complex_workspace *w = gsl_poly_complex_workspace_alloc (6);
+
+ int status = gsl_poly_complex_solve (a, 6, w, z);
+
+ gsl_poly_complex_workspace_free (w);
+
+ gsl_test (status,
+ "gsl_poly_complex_solve, 5th-order Wilkinson polynomial");
+ gsl_test_rel (z[0], 1.0, 1e-9, "z0.real, 5th-order polynomial");
+ gsl_test_rel (z[1], 0.0, 1e-9, "z0.imag, 5th-order polynomial");
+ gsl_test_rel (z[2], 2.0, 1e-9, "z1.real, 5th-order polynomial");
+ gsl_test_rel (z[3], 0.0, 1e-9, "z1.imag, 5th-order polynomial");
+ gsl_test_rel (z[4], 3.0, 1e-9, "z2.real, 5th-order polynomial");
+ gsl_test_rel (z[5], 0.0, 1e-9, "z2.imag, 5th-order polynomial");
+ gsl_test_rel (z[6], 4.0, 1e-9, "z3.real, 5th-order polynomial");
+ gsl_test_rel (z[7], 0.0, 1e-9, "z3.imag, 5th-order polynomial");
+ gsl_test_rel (z[8], 5.0, 1e-9, "z4.real, 5th-order polynomial");
+ gsl_test_rel (z[9], 0.0, 1e-9, "z4.imag, 5th-order polynomial");
+ }
+
+ {
+ /* : 8-th order polynomial y = x^8 + x^4 + 1 */
+
+ double a[9] = { 1, 0, 0, 0, 1, 0, 0, 0, 1 };
+ double z[8*2];
+
+ double C = 0.5;
+ double S = sqrt (3.0) / 2.0;
+
+ gsl_poly_complex_workspace *w = gsl_poly_complex_workspace_alloc (9);
+
+ int status = gsl_poly_complex_solve (a, 9, w, z);
+
+ gsl_poly_complex_workspace_free (w);
+
+ gsl_test (status, "gsl_poly_complex_solve, 8th-order polynomial");
+
+ gsl_test_rel (z[0], -S, 1e-9, "z0.real, 8th-order polynomial");
+ gsl_test_rel (z[1], C, 1e-9, "z0.imag, 8th-order polynomial");
+ gsl_test_rel (z[2], -S, 1e-9, "z1.real, 8th-order polynomial");
+ gsl_test_rel (z[3], -C, 1e-9, "z1.imag, 8th-order polynomial");
+ gsl_test_rel (z[4], -C, 1e-9, "z2.real, 8th-order polynomial");
+ gsl_test_rel (z[5], S, 1e-9, "z2.imag, 8th-order polynomial");
+ gsl_test_rel (z[6], -C, 1e-9, "z3.real, 8th-order polynomial");
+ gsl_test_rel (z[7], -S, 1e-9, "z3.imag, 8th-order polynomial");
+ gsl_test_rel (z[8], C, 1e-9, "z4.real, 8th-order polynomial");
+ gsl_test_rel (z[9], S, 1e-9, "z4.imag, 8th-order polynomial");
+ gsl_test_rel (z[10], C, 1e-9, "z5.real, 8th-order polynomial");
+ gsl_test_rel (z[11], -S, 1e-9, "z5.imag, 8th-order polynomial");
+ gsl_test_rel (z[12], S, 1e-9, "z6.real, 8th-order polynomial");
+ gsl_test_rel (z[13], C, 1e-9, "z6.imag, 8th-order polynomial");
+ gsl_test_rel (z[14], S, 1e-9, "z7.real, 8th-order polynomial");
+ gsl_test_rel (z[15], -C, 1e-9, "z7.imag, 8th-order polynomial");
+
+ }
+
+ {
+ int i;
+
+ double xa[7] = {0.16, 0.97, 1.94, 2.74, 3.58, 3.73, 4.70 };
+ double ya[7] = {0.73, 1.11, 1.49, 1.84, 2.30, 2.41, 3.07 };
+
+ double dd_expected[7] = { 7.30000000000000e-01,
+ 4.69135802469136e-01,
+ -4.34737219941284e-02,
+ 2.68681098870099e-02,
+ -3.22937056934996e-03,
+ 6.12763259971375e-03,
+ -6.45402453527083e-03 };
+
+ double dd[7], coeff[7], work[7];
+
+ gsl_poly_dd_init (dd, xa, ya, 7);
+
+ for (i = 0; i < 7; i++)
+ {
+ gsl_test_rel (dd[i], dd_expected[i], 1e-10, "divided difference dd[%d]", i);
+ }
+
+ for (i = 0; i < 7; i++)
+ {
+ double y = gsl_poly_dd_eval(dd, xa, 7, xa[i]);
+ gsl_test_rel (y, ya[i], 1e-10, "divided difference y[%d]", i);
+ }
+
+ gsl_poly_dd_taylor (coeff, 1.5, dd, xa, 7, work);
+
+ for (i = 0; i < 7; i++)
+ {
+ double y = gsl_poly_eval(coeff, 7, xa[i] - 1.5);
+ gsl_test_rel (y, ya[i], 1e-10, "taylor expansion about 1.5 y[%d]", i);
+ }
+ }
+
+
+ /* now summarize the results */
+
+ exit (gsl_test_summary ());
+}
diff --git a/gsl-1.9/poly/zsolve.c b/gsl-1.9/poly/zsolve.c
new file mode 100644
index 0000000..ae2aa51
--- /dev/null
+++ b/gsl-1.9/poly/zsolve.c
@@ -0,0 +1,85 @@
+/* poly/zsolve.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* zsolve.c - finds the complex roots of = 0 */
+
+#include <config.h>
+#include <math.h>
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_complex.h>
+#include <gsl/gsl_poly.h>
+
+/* C-style matrix elements */
+#define MAT(m,i,j,n) ((m)[(i)*(n) + (j)])
+
+/* Fortran-style matrix elements */
+#define FMAT(m,i,j,n) ((m)[((i)-1)*(n) + ((j)-1)])
+
+#include "companion.c"
+#include "balance.c"
+#include "qr.c"
+
+int
+gsl_poly_complex_solve (const double *a, size_t n,
+ gsl_poly_complex_workspace * w,
+ gsl_complex_packed_ptr z)
+{
+ int status;
+ double *m;
+
+ if (n == 0)
+ {
+ GSL_ERROR ("number of terms must be a positive integer", GSL_EINVAL);
+ }
+
+ if (n == 1)
+ {
+ GSL_ERROR ("cannot solve for only one term", GSL_EINVAL);
+ }
+
+ if (a[n - 1] == 0)
+ {
+ GSL_ERROR ("leading term of polynomial must be non-zero", GSL_EINVAL) ;
+ }
+
+ if (w->nc != n - 1)
+ {
+ GSL_ERROR ("size of workspace does not match polynomial", GSL_EINVAL);
+ }
+
+ m = w->matrix;
+
+ set_companion_matrix (a, n - 1, m);
+
+ balance_companion_matrix (m, n - 1);
+
+ status = qr_companion (m, n - 1, z);
+
+ if (status)
+ {
+ GSL_ERROR("root solving qr method failed to converge", GSL_EFAILED);
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+
diff --git a/gsl-1.9/poly/zsolve_cubic.c b/gsl-1.9/poly/zsolve_cubic.c
new file mode 100644
index 0000000..548423e
--- /dev/null
+++ b/gsl-1.9/poly/zsolve_cubic.c
@@ -0,0 +1,153 @@
+/* poly/zsolve_cubic.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* zsolve_cubic.c - finds the complex roots of x^3 + a x^2 + b x + c = 0 */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_complex.h>
+#include <gsl/gsl_poly.h>
+
+#define SWAP(a,b) do { double tmp = b ; b = a ; a = tmp ; } while(0)
+
+int
+gsl_poly_complex_solve_cubic (double a, double b, double c,
+ gsl_complex *z0, gsl_complex *z1,
+ gsl_complex *z2)
+{
+ double q = (a * a - 3 * b);
+ double r = (2 * a * a * a - 9 * a * b + 27 * c);
+
+ double Q = q / 9;
+ double R = r / 54;
+
+ double Q3 = Q * Q * Q;
+ double R2 = R * R;
+
+ double CR2 = 729 * r * r;
+ double CQ3 = 2916 * q * q * q;
+
+ if (R == 0 && Q == 0)
+ {
+ GSL_REAL (*z0) = -a / 3;
+ GSL_IMAG (*z0) = 0;
+ GSL_REAL (*z1) = -a / 3;
+ GSL_IMAG (*z1) = 0;
+ GSL_REAL (*z2) = -a / 3;
+ GSL_IMAG (*z2) = 0;
+ return 3;
+ }
+ else if (CR2 == CQ3)
+ {
+ /* this test is actually R2 == Q3, written in a form suitable
+ for exact computation with integers */
+
+ /* Due to finite precision some double roots may be missed, and
+ will be considered to be a pair of complex roots z = x +/-
+ epsilon i close to the real axis. */
+
+ double sqrtQ = sqrt (Q);
+
+ if (R > 0)
+ {
+ GSL_REAL (*z0) = -2 * sqrtQ - a / 3;
+ GSL_IMAG (*z0) = 0;
+ GSL_REAL (*z1) = sqrtQ - a / 3;
+ GSL_IMAG (*z1) = 0;
+ GSL_REAL (*z2) = sqrtQ - a / 3;
+ GSL_IMAG (*z2) = 0;
+ }
+ else
+ {
+ GSL_REAL (*z0) = -sqrtQ - a / 3;
+ GSL_IMAG (*z0) = 0;
+ GSL_REAL (*z1) = -sqrtQ - a / 3;
+ GSL_IMAG (*z1) = 0;
+ GSL_REAL (*z2) = 2 * sqrtQ - a / 3;
+ GSL_IMAG (*z2) = 0;
+ }
+ return 3;
+ }
+ else if (CR2 < CQ3) /* equivalent to R2 < Q3 */
+ {
+ double sqrtQ = sqrt (Q);
+ double sqrtQ3 = sqrtQ * sqrtQ * sqrtQ;
+ double theta = acos (R / sqrtQ3);
+ double norm = -2 * sqrtQ;
+ double r0 = norm * cos (theta / 3) - a / 3;
+ double r1 = norm * cos ((theta + 2.0 * M_PI) / 3) - a / 3;
+ double r2 = norm * cos ((theta - 2.0 * M_PI) / 3) - a / 3;
+
+ /* Sort r0, r1, r2 into increasing order */
+
+ if (r0 > r1)
+ SWAP (r0, r1);
+
+ if (r1 > r2)
+ {
+ SWAP (r1, r2);
+
+ if (r0 > r1)
+ SWAP (r0, r1);
+ }
+
+ GSL_REAL (*z0) = r0;
+ GSL_IMAG (*z0) = 0;
+
+ GSL_REAL (*z1) = r1;
+ GSL_IMAG (*z1) = 0;
+
+ GSL_REAL (*z2) = r2;
+ GSL_IMAG (*z2) = 0;
+
+ return 3;
+ }
+ else
+ {
+ double sgnR = (R >= 0 ? 1 : -1);
+ double A = -sgnR * pow (fabs (R) + sqrt (R2 - Q3), 1.0 / 3.0);
+ double B = Q / A;
+
+ if (A + B < 0)
+ {
+ GSL_REAL (*z0) = A + B - a / 3;
+ GSL_IMAG (*z0) = 0;
+
+ GSL_REAL (*z1) = -0.5 * (A + B) - a / 3;
+ GSL_IMAG (*z1) = -(sqrt (3.0) / 2.0) * fabs(A - B);
+
+ GSL_REAL (*z2) = -0.5 * (A + B) - a / 3;
+ GSL_IMAG (*z2) = (sqrt (3.0) / 2.0) * fabs(A - B);
+ }
+ else
+ {
+ GSL_REAL (*z0) = -0.5 * (A + B) - a / 3;
+ GSL_IMAG (*z0) = -(sqrt (3.0) / 2.0) * fabs(A - B);
+
+ GSL_REAL (*z1) = -0.5 * (A + B) - a / 3;
+ GSL_IMAG (*z1) = (sqrt (3.0) / 2.0) * fabs(A - B);
+
+ GSL_REAL (*z2) = A + B - a / 3;
+ GSL_IMAG (*z2) = 0;
+ }
+
+ return 3;
+ }
+}
diff --git a/gsl-1.9/poly/zsolve_init.c b/gsl-1.9/poly/zsolve_init.c
new file mode 100644
index 0000000..5c181db
--- /dev/null
+++ b/gsl-1.9/poly/zsolve_init.c
@@ -0,0 +1,69 @@
+/* poly/zsolve_init.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_complex.h>
+#include <gsl/gsl_poly.h>
+#include <gsl/gsl_errno.h>
+
+gsl_poly_complex_workspace *
+gsl_poly_complex_workspace_alloc (size_t n)
+{
+ size_t nc ;
+
+ gsl_poly_complex_workspace * w ;
+
+ if (n == 0)
+ {
+ GSL_ERROR_VAL ("matrix size n must be positive integer", GSL_EDOM, 0);
+ }
+
+ w = (gsl_poly_complex_workspace *)
+ malloc (sizeof(gsl_poly_complex_workspace));
+
+ if (w == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for struct", GSL_ENOMEM, 0);
+ }
+
+ nc = n - 1;
+
+ w->nc = nc;
+
+ w->matrix = (double *) malloc (nc * nc * sizeof(double));
+
+ if (w->matrix == 0)
+ {
+ free (w) ; /* error in constructor, avoid memory leak */
+
+ GSL_ERROR_VAL ("failed to allocate space for workspace matrix",
+ GSL_ENOMEM, 0);
+ }
+
+ return w ;
+}
+
+void
+gsl_poly_complex_workspace_free (gsl_poly_complex_workspace * w)
+{
+ free(w->matrix) ;
+ free(w);
+}
diff --git a/gsl-1.9/poly/zsolve_quadratic.c b/gsl-1.9/poly/zsolve_quadratic.c
new file mode 100644
index 0000000..dcdeec0
--- /dev/null
+++ b/gsl-1.9/poly/zsolve_quadratic.c
@@ -0,0 +1,103 @@
+/* poly/zsolve_quadratic.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* complex_solve_quadratic.c - finds complex roots of a x^2 + b x + c = 0 */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_complex.h>
+#include <gsl/gsl_poly.h>
+
+int
+gsl_poly_complex_solve_quadratic (double a, double b, double c,
+ gsl_complex *z0, gsl_complex *z1)
+{
+ double disc = b * b - 4 * a * c;
+
+ if (a == 0) /* Handle linear case */
+ {
+ if (b == 0)
+ {
+ return 0;
+ }
+ else
+ {
+ GSL_REAL(*z0) = -c / b;
+ GSL_IMAG(*z0) = 0;
+ return 1;
+ };
+ }
+
+ if (disc > 0)
+ {
+ if (b == 0)
+ {
+ double s = fabs (0.5 * sqrt (disc) / a);
+ GSL_REAL (*z0) = -s;
+ GSL_IMAG (*z0) = 0;
+ GSL_REAL (*z1) = s;
+ GSL_IMAG (*z1) = 0;
+ }
+ else
+ {
+ double sgnb = (b > 0 ? 1 : -1);
+ double temp = -0.5 * (b + sgnb * sqrt (disc));
+ double r1 = temp / a;
+ double r2 = c / temp;
+
+ if (r1 < r2)
+ {
+ GSL_REAL (*z0) = r1;
+ GSL_IMAG (*z0) = 0;
+ GSL_REAL (*z1) = r2;
+ GSL_IMAG (*z1) = 0;
+ }
+ else
+ {
+ GSL_REAL (*z0) = r2;
+ GSL_IMAG (*z0) = 0;
+ GSL_REAL (*z1) = r1;
+ GSL_IMAG (*z1) = 0;
+ }
+ }
+ return 2;
+ }
+ else if (disc == 0)
+ {
+ GSL_REAL (*z0) = -0.5 * b / a;
+ GSL_IMAG (*z0) = 0;
+
+ GSL_REAL (*z1) = -0.5 * b / a;
+ GSL_IMAG (*z1) = 0;
+
+ return 2;
+ }
+ else
+ {
+ double s = fabs (0.5 * sqrt (-disc) / a);
+
+ GSL_REAL (*z0) = -0.5 * b / a;
+ GSL_IMAG (*z0) = -s;
+
+ GSL_REAL (*z1) = -0.5 * b / a;
+ GSL_IMAG (*z1) = s;
+
+ return 2;
+ }
+}
diff --git a/gsl-1.9/qrng/ChangeLog b/gsl-1.9/qrng/ChangeLog
new file mode 100644
index 0000000..e46c87f
--- /dev/null
+++ b/gsl-1.9/qrng/ChangeLog
@@ -0,0 +1,23 @@
+2006-04-21 Brian Gough <bjg@network-theory.co.uk>
+
+ * qrng.c gsl_qrng.h: use q instead of r in all prototypes
+
+2004-05-26 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c: added <stdlib.h> for exit()
+
+2002-11-16 Brian Gough <bjg@network-theory.co.uk>
+
+ * niederreiter-2.c (calculate_cj): clear uninitialized memory
+
+Mon Apr 22 19:20:05 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c: output results for each individual test
+
+ * qrng.c (gsl_qrng_init): added missing init function
+
+Mon Oct 23 19:59:46 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * qrng.c (gsl_qrng_get): use an array type for the array
+ arguments, rather than a pointer
+
diff --git a/gsl-1.9/qrng/Makefile.am b/gsl-1.9/qrng/Makefile.am
new file mode 100644
index 0000000..b33787a
--- /dev/null
+++ b/gsl-1.9/qrng/Makefile.am
@@ -0,0 +1,14 @@
+noinst_LTLIBRARIES = libgslqrng.la
+
+pkginclude_HEADERS = gsl_qrng.h
+
+INCLUDES= -I$(top_builddir)
+
+libgslqrng_la_SOURCES = gsl_qrng.h qrng.c niederreiter-2.c sobol.c
+
+TESTS = $(check_PROGRAMS)
+check_PROGRAMS = test
+
+test_SOURCES = test.c
+test_LDADD = libgslqrng.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+
diff --git a/gsl-1.9/qrng/Makefile.in b/gsl-1.9/qrng/Makefile.in
new file mode 100644
index 0000000..7847ef7
--- /dev/null
+++ b/gsl-1.9/qrng/Makefile.in
@@ -0,0 +1,543 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = test$(EXEEXT)
+subdir = qrng
+DIST_COMMON = $(pkginclude_HEADERS) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in ChangeLog TODO
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgslqrng_la_LIBADD =
+am_libgslqrng_la_OBJECTS = qrng.lo niederreiter-2.lo sobol.lo
+libgslqrng_la_OBJECTS = $(am_libgslqrng_la_OBJECTS)
+am_test_OBJECTS = test.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = libgslqrng.la ../ieee-utils/libgslieeeutils.la \
+ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \
+ ../utils/libutils.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgslqrng_la_SOURCES) $(test_SOURCES)
+DIST_SOURCES = $(libgslqrng_la_SOURCES) $(test_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libgslqrng.la
+pkginclude_HEADERS = gsl_qrng.h
+INCLUDES = -I$(top_builddir)
+libgslqrng_la_SOURCES = gsl_qrng.h qrng.c niederreiter-2.c sobol.c
+TESTS = $(check_PROGRAMS)
+test_SOURCES = test.c
+test_LDADD = libgslqrng.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps qrng/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps qrng/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgslqrng.la: $(libgslqrng_la_OBJECTS) $(libgslqrng_la_DEPENDENCIES)
+ $(LINK) $(libgslqrng_la_LDFLAGS) $(libgslqrng_la_OBJECTS) $(libgslqrng_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkgincludeHEADERS
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/qrng/TODO b/gsl-1.9/qrng/TODO
new file mode 100644
index 0000000..50ca918
--- /dev/null
+++ b/gsl-1.9/qrng/TODO
@@ -0,0 +1,10 @@
+* Sort out "const" in prototypes, it looks odd since there are consts
+for many functions which modify the state. (Applies to both qrng and rng)
+
+* It would be useful to include functions to generate quasi-random
+ number distributions (at least the Gaussian distribution)? obviously
+ the Box-Mueller algorithm cannot be used to maintain the low
+ discrepancy characteristics of the sequence, there are several
+ methods suggested in the literature but it isn't at all my field so
+ I'm not sure which is to be preferred. (DENISON Francis
+ <francis.denison@irsn.fr>)
diff --git a/gsl-1.9/qrng/gsl_qrng.h b/gsl-1.9/qrng/gsl_qrng.h
new file mode 100644
index 0000000..889799a
--- /dev/null
+++ b/gsl-1.9/qrng/gsl_qrng.h
@@ -0,0 +1,110 @@
+/* Author: G. Jungman
+ */
+#ifndef __GSL_QRNG_H__
+#define __GSL_QRNG_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_types.h>
+#include <gsl/gsl_errno.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+
+/* Once again, more inane C-style OOP... kill me now. */
+
+/* Structure describing a type of generator.
+ */
+typedef struct
+{
+ const char * name;
+ unsigned int max_dimension;
+ size_t (*state_size) (unsigned int dimension);
+ int (*init_state) (void * state, unsigned int dimension);
+ int (*get) (void * state, unsigned int dimension, double x[]);
+}
+gsl_qrng_type;
+
+/* Structure describing a generator instance of a
+ * specified type, with generator-specific state info
+ * and dimension-specific info.
+ */
+typedef struct
+{
+ const gsl_qrng_type * type;
+ unsigned int dimension;
+ size_t state_size;
+ void * state;
+}
+gsl_qrng;
+
+
+/* Supported generator types.
+ */
+GSL_VAR const gsl_qrng_type * gsl_qrng_niederreiter_2;
+GSL_VAR const gsl_qrng_type * gsl_qrng_sobol;
+
+
+/* Allocate and initialize a generator
+ * of the specified type, in the given
+ * space dimension.
+ */
+gsl_qrng * gsl_qrng_alloc (const gsl_qrng_type * T, unsigned int dimension);
+
+
+/* Copy a generator. */
+int gsl_qrng_memcpy (gsl_qrng * dest, const gsl_qrng * src);
+
+
+/* Clone a generator. */
+gsl_qrng * gsl_qrng_clone (const gsl_qrng * q);
+
+
+/* Free a generator. */
+void gsl_qrng_free (gsl_qrng * q);
+
+
+/* Intialize a generator. */
+void gsl_qrng_init (gsl_qrng * q);
+
+
+/* Get the standardized name of the generator. */
+const char * gsl_qrng_name (const gsl_qrng * q);
+
+
+/* ISN'T THIS CONFUSING FOR PEOPLE?
+ WHAT IF SOMEBODY TRIES TO COPY WITH THIS ???
+ */
+size_t gsl_qrng_size (const gsl_qrng * q);
+
+
+void * gsl_qrng_state (const gsl_qrng * q);
+
+
+/* Retrieve next vector in sequence. */
+int gsl_qrng_get (const gsl_qrng * q, double x[]);
+
+
+#ifdef HAVE_INLINE
+extern inline int gsl_qrng_get (const gsl_qrng * q, double x[]);
+extern inline int gsl_qrng_get (const gsl_qrng * q, double x[])
+{
+ return (q->type->get) (q->state, q->dimension, x);
+}
+
+#endif /* HAVE_INLINE */
+
+
+__END_DECLS
+
+
+#endif /* !__GSL_QRNG_H__ */
diff --git a/gsl-1.9/qrng/niederreiter-2.c b/gsl-1.9/qrng/niederreiter-2.c
new file mode 100644
index 0000000..1a28009
--- /dev/null
+++ b/gsl-1.9/qrng/niederreiter-2.c
@@ -0,0 +1,353 @@
+/* Author: G. Jungman
+ */
+/* Implement Niederreiter base 2 generator.
+ * See:
+ * Bratley, Fox, Niederreiter, ACM Trans. Model. Comp. Sim. 2, 195 (1992)
+ */
+#include <config.h>
+#include <gsl/gsl_qrng.h>
+
+
+#define NIED2_CHARACTERISTIC 2
+#define NIED2_BASE 2
+
+#define NIED2_MAX_DIMENSION 12
+#define NIED2_MAX_PRIM_DEGREE 5
+#define NIED2_MAX_DEGREE 50
+
+#define NIED2_BIT_COUNT 30
+#define NIED2_NBITS (NIED2_BIT_COUNT+1)
+
+#define MAXV (NIED2_NBITS + NIED2_MAX_DEGREE)
+
+/* Z_2 field operations */
+#define NIED2_ADD(x,y) (((x)+(y))%2)
+#define NIED2_MUL(x,y) (((x)*(y))%2)
+#define NIED2_SUB(x,y) NIED2_ADD((x),(y))
+
+
+static size_t nied2_state_size(unsigned int dimension);
+static int nied2_init(void * state, unsigned int dimension);
+static int nied2_get(void * state, unsigned int dimension, double * v);
+
+
+static const gsl_qrng_type nied2_type =
+{
+ "niederreiter-base-2",
+ NIED2_MAX_DIMENSION,
+ nied2_state_size,
+ nied2_init,
+ nied2_get
+};
+
+const gsl_qrng_type * gsl_qrng_niederreiter_2 = &nied2_type;
+
+/* primitive polynomials in binary encoding */
+static const int primitive_poly[NIED2_MAX_DIMENSION+1][NIED2_MAX_PRIM_DEGREE+1] =
+{
+ { 1, 0, 0, 0, 0, 0 }, /* 1 */
+ { 0, 1, 0, 0, 0, 0 }, /* x */
+ { 1, 1, 0, 0, 0, 0 }, /* 1 + x */
+ { 1, 1, 1, 0, 0, 0 }, /* 1 + x + x^2 */
+ { 1, 1, 0, 1, 0, 0 }, /* 1 + x + x^3 */
+ { 1, 0, 1, 1, 0, 0 }, /* 1 + x^2 + x^3 */
+ { 1, 1, 0, 0, 1, 0 }, /* 1 + x + x^4 */
+ { 1, 0, 0, 1, 1, 0 }, /* 1 + x^3 + x^4 */
+ { 1, 1, 1, 1, 1, 0 }, /* 1 + x + x^2 + x^3 + x^4 */
+ { 1, 0, 1, 0, 0, 1 }, /* 1 + x^2 + x^5 */
+ { 1, 0, 0, 1, 0, 1 }, /* 1 + x^3 + x^5 */
+ { 1, 1, 1, 1, 0, 1 }, /* 1 + x + x^2 + x^3 + x^5 */
+ { 1, 1, 1, 0, 1, 1 } /* 1 + x + x^2 + x^4 + x^5 */
+};
+
+/* degrees of primitive polynomials */
+static const int poly_degree[NIED2_MAX_DIMENSION+1] =
+{
+ 0, 1, 1, 2, 3, 3, 4, 4, 4, 5, 5, 5, 5
+};
+
+
+typedef struct
+{
+ unsigned int sequence_count;
+ int cj[NIED2_NBITS][NIED2_MAX_DIMENSION];
+ int nextq[NIED2_MAX_DIMENSION];
+} nied2_state_t;
+
+
+static size_t nied2_state_size(unsigned int dimension)
+{
+ return sizeof(nied2_state_t);
+}
+
+
+/* Multiply polynomials over Z_2.
+ * Notice use of a temporary vector,
+ * side-stepping aliasing issues when
+ * one of inputs is the same as the output
+ * [especially important in the original fortran version, I guess].
+ */
+static void poly_multiply(
+ const int pa[], int pa_degree,
+ const int pb[], int pb_degree,
+ int pc[], int * pc_degree
+ )
+{
+ int j, k;
+ int pt[NIED2_MAX_DEGREE+1];
+ int pt_degree = pa_degree + pb_degree;
+
+ for(k=0; k<=pt_degree; k++) {
+ int term = 0;
+ for(j=0; j<=k; j++) {
+ const int conv_term = NIED2_MUL(pa[k-j], pb[j]);
+ term = NIED2_ADD(term, conv_term);
+ }
+ pt[k] = term;
+ }
+
+ for(k=0; k<=pt_degree; k++) {
+ pc[k] = pt[k];
+ }
+ for(k=pt_degree+1; k<=NIED2_MAX_DEGREE; k++) {
+ pc[k] = 0;
+ }
+
+ *pc_degree = pt_degree;
+}
+
+
+/* Calculate the values of the constants V(J,R) as
+ * described in BFN section 3.3.
+ *
+ * px = appropriate irreducible polynomial for current dimension
+ * pb = polynomial defined in section 2.3 of BFN.
+ * pb is modified
+ */
+static void calculate_v(
+ const int px[], int px_degree,
+ int pb[], int * pb_degree,
+ int v[], int maxv
+ )
+{
+ const int nonzero_element = 1; /* nonzero element of Z_2 */
+ const int arbitrary_element = 1; /* arbitray element of Z_2 */
+
+ /* The polynomial ph is px**(J-1), which is the value of B on arrival.
+ * In section 3.3, the values of Hi are defined with a minus sign:
+ * don't forget this if you use them later !
+ */
+ int ph[NIED2_MAX_DEGREE+1];
+ /* int ph_degree = *pb_degree; */
+ int bigm = *pb_degree; /* m from section 3.3 */
+ int m; /* m from section 2.3 */
+ int r, k, kj;
+
+ for(k=0; k<=NIED2_MAX_DEGREE; k++) {
+ ph[k] = pb[k];
+ }
+
+ /* Now multiply B by PX so B becomes PX**J.
+ * In section 2.3, the values of Bi are defined with a minus sign :
+ * don't forget this if you use them later !
+ */
+ poly_multiply(px, px_degree, pb, *pb_degree, pb, pb_degree);
+ m = *pb_degree;
+
+ /* Now choose a value of Kj as defined in section 3.3.
+ * We must have 0 <= Kj < E*J = M.
+ * The limit condition on Kj does not seem very relevant
+ * in this program.
+ */
+ /* Quoting from BFN: "Our program currently sets each K_q
+ * equal to eq. This has the effect of setting all unrestricted
+ * values of v to 1."
+ * Actually, it sets them to the arbitrary chosen value.
+ * Whatever.
+ */
+ kj = bigm;
+
+ /* Now choose values of V in accordance with
+ * the conditions in section 3.3.
+ */
+ for(r=0; r<kj; r++) {
+ v[r] = 0;
+ }
+ v[kj] = 1;
+
+
+ if(kj >= bigm) {
+ for(r=kj+1; r<m; r++) {
+ v[r] = arbitrary_element;
+ }
+ }
+ else {
+ /* This block is never reached. */
+
+ int term = NIED2_SUB(0, ph[kj]);
+
+ for(r=kj+1; r<bigm; r++) {
+ v[r] = arbitrary_element;
+
+ /* Check the condition of section 3.3,
+ * remembering that the H's have the opposite sign. [????????]
+ */
+ term = NIED2_SUB(term, NIED2_MUL(ph[r], v[r]));
+ }
+
+ /* Now v[bigm] != term. */
+ v[bigm] = NIED2_ADD(nonzero_element, term);
+
+ for(r=bigm+1; r<m; r++) {
+ v[r] = arbitrary_element;
+ }
+ }
+
+ /* Calculate the remaining V's using the recursion of section 2.3,
+ * remembering that the B's have the opposite sign.
+ */
+ for(r=0; r<=maxv-m; r++) {
+ int term = 0;
+ for(k=0; k<m; k++) {
+ term = NIED2_SUB(term, NIED2_MUL(pb[k], v[r+k]));
+ }
+ v[r+m] = term;
+ }
+}
+
+
+static void calculate_cj(nied2_state_t * ns, unsigned int dimension)
+{
+ int ci[NIED2_NBITS][NIED2_NBITS];
+ int v[MAXV+1];
+ int r;
+ unsigned int i_dim;
+
+ for(i_dim=0; i_dim<dimension; i_dim++) {
+
+ const int poly_index = i_dim + 1;
+ int j, k;
+
+ /* Niederreiter (page 56, after equation (7), defines two
+ * variables Q and U. We do not need Q explicitly, but we
+ * do need U.
+ */
+ int u = 0;
+
+ /* For each dimension, we need to calculate powers of an
+ * appropriate irreducible polynomial, see Niederreiter
+ * page 65, just below equation (19).
+ * Copy the appropriate irreducible polynomial into PX,
+ * and its degree into E. Set polynomial B = PX ** 0 = 1.
+ * M is the degree of B. Subsequently B will hold higher
+ * powers of PX.
+ */
+ int pb[NIED2_MAX_DEGREE+1];
+ int px[NIED2_MAX_DEGREE+1];
+ int px_degree = poly_degree[poly_index];
+ int pb_degree = 0;
+
+ for(k=0; k<=px_degree; k++) {
+ px[k] = primitive_poly[poly_index][k];
+ pb[k] = 0;
+ }
+
+ for (;k<NIED2_MAX_DEGREE+1;k++) {
+ px[k] = 0;
+ pb[k] = 0;
+ }
+
+ pb[0] = 1;
+
+ for(j=0; j<NIED2_NBITS; j++) {
+
+ /* If U = 0, we need to set B to the next power of PX
+ * and recalculate V.
+ */
+ if(u == 0) calculate_v(px, px_degree, pb, &pb_degree, v, MAXV);
+
+ /* Now C is obtained from V. Niederreiter
+ * obtains A from V (page 65, near the bottom), and then gets
+ * C from A (page 56, equation (7)). However this can be done
+ * in one step. Here CI(J,R) corresponds to
+ * Niederreiter's C(I,J,R).
+ */
+ for(r=0; r<NIED2_NBITS; r++) {
+ ci[r][j] = v[r+u];
+ }
+
+ /* Advance Niederreiter's state variables. */
+ ++u;
+ if(u == px_degree) u = 0;
+ }
+
+ /* The array CI now holds the values of C(I,J,R) for this value
+ * of I. We pack them into array CJ so that CJ(I,R) holds all
+ * the values of C(I,J,R) for J from 1 to NBITS.
+ */
+ for(r=0; r<NIED2_NBITS; r++) {
+ int term = 0;
+ for(j=0; j<NIED2_NBITS; j++) {
+ term = 2*term + ci[r][j];
+ }
+ ns->cj[r][i_dim] = term;
+ }
+
+ }
+}
+
+
+static int nied2_init(void * state, unsigned int dimension)
+{
+ nied2_state_t * n_state = (nied2_state_t *) state;
+ unsigned int i_dim;
+
+ if(dimension < 1 || dimension > NIED2_MAX_DIMENSION) return GSL_EINVAL;
+
+ calculate_cj(n_state, dimension);
+
+ for(i_dim=0; i_dim<dimension; i_dim++) n_state->nextq[i_dim] = 0;
+ n_state->sequence_count = 0;
+
+ return GSL_SUCCESS;
+}
+
+
+static int nied2_get(void * state, unsigned int dimension, double * v)
+{
+ static const double recip = 1.0/(double)(1U << NIED2_NBITS); /* 2^(-nbits) */
+ nied2_state_t * n_state = (nied2_state_t *) state;
+ int r;
+ int c;
+ unsigned int i_dim;
+
+ /* Load the result from the saved state. */
+ for(i_dim=0; i_dim<dimension; i_dim++) {
+ v[i_dim] = n_state->nextq[i_dim] * recip;
+ }
+
+ /* Find the position of the least-significant zero in sequence_count.
+ * This is the bit that changes in the Gray-code representation as
+ * the count is advanced.
+ */
+ r = 0;
+ c = n_state->sequence_count;
+ while(1) {
+ if((c % 2) == 1) {
+ ++r;
+ c /= 2;
+ }
+ else break;
+ }
+
+ if(r >= NIED2_NBITS) return GSL_EFAILED; /* FIXME: better error code here */
+
+ /* Calculate the next state. */
+ for(i_dim=0; i_dim<dimension; i_dim++) {
+ n_state->nextq[i_dim] ^= n_state->cj[r][i_dim];
+ }
+
+ n_state->sequence_count++;
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/qrng/qrng.c b/gsl-1.9/qrng/qrng.c
new file mode 100644
index 0000000..d85eccf
--- /dev/null
+++ b/gsl-1.9/qrng/qrng.c
@@ -0,0 +1,127 @@
+/* Author: G. Jungman
+ */
+#include <config.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_qrng.h>
+
+
+gsl_qrng *
+gsl_qrng_alloc (const gsl_qrng_type * T, unsigned int dimension)
+{
+
+ gsl_qrng * q = (gsl_qrng *) malloc (sizeof (gsl_qrng));
+
+ if (q == 0)
+ {
+ GSL_ERROR_VAL ("allocation failed for qrng struct",
+ GSL_ENOMEM, 0);
+ };
+
+ q->dimension = dimension;
+ q->state_size = T->state_size(dimension);
+ q->state = malloc (q->state_size);
+
+ if (q->state == 0)
+ {
+ free (q);
+ GSL_ERROR_VAL ("allocation failed for qrng state",
+ GSL_ENOMEM, 0);
+ };
+
+ q->type = T;
+
+ T->init_state(q->state, q->dimension);
+
+ return q;
+}
+
+void
+gsl_qrng_init (gsl_qrng * q)
+{
+ (q->type->init_state) (q->state, q->dimension);
+}
+
+int
+gsl_qrng_memcpy (gsl_qrng * dest, const gsl_qrng * src)
+{
+ if (dest->type != src->type)
+ {
+ GSL_ERROR ("generators must be of the same type", GSL_EINVAL);
+ }
+
+ dest->dimension = src->dimension;
+ dest->state_size = src->state_size;
+ memcpy (dest->state, src->state, src->state_size);
+
+ return GSL_SUCCESS;
+}
+
+
+gsl_qrng *
+gsl_qrng_clone (const gsl_qrng * q)
+{
+ gsl_qrng * r = (gsl_qrng *) malloc (sizeof (gsl_qrng));
+
+ if (r == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for rng struct",
+ GSL_ENOMEM, 0);
+ };
+
+ r->dimension = q->dimension;
+ r->state_size = q->state_size;
+ r->state = malloc (r->state_size);
+
+ if (r->state == 0)
+ {
+ free (r);
+ GSL_ERROR_VAL ("failed to allocate space for rng state",
+ GSL_ENOMEM, 0);
+ };
+
+ r->type = q->type;
+
+ memcpy (r->state, q->state, q->state_size);
+
+ return r;
+}
+
+#ifndef HIDE_INLINE_STATIC
+int
+gsl_qrng_get (const gsl_qrng * q, double x[])
+{
+ return (q->type->get) (q->state, q->dimension, x);
+}
+#endif
+
+const char *
+gsl_qrng_name (const gsl_qrng * q)
+{
+ return q->type->name;
+}
+
+
+size_t
+gsl_qrng_size (const gsl_qrng * q)
+{
+ return q->state_size;
+}
+
+
+void *
+gsl_qrng_state (const gsl_qrng * q)
+{
+ return q->state;
+}
+
+
+void
+gsl_qrng_free (gsl_qrng * q)
+{
+ if(q != 0) {
+ if(q->state != 0) free (q->state);
+ free (q);
+ }
+}
diff --git a/gsl-1.9/qrng/sobol.c b/gsl-1.9/qrng/sobol.c
new file mode 100644
index 0000000..51c9baa
--- /dev/null
+++ b/gsl-1.9/qrng/sobol.c
@@ -0,0 +1,231 @@
+/* Author: G. Jungman
+ */
+/* Implementation for Sobol generator.
+ * See
+ * [Bratley+Fox, TOMS 14, 88 (1988)]
+ * [Antonov+Saleev, USSR Comput. Maths. Math. Phys. 19, 252 (1980)]
+ */
+#include <config.h>
+#include <gsl/gsl_qrng.h>
+
+
+/* maximum allowed space dimension */
+#define SOBOL_MAX_DIMENSION 40
+
+/* bit count; assumes sizeof(int) >= 32-bit */
+#define SOBOL_BIT_COUNT 30
+
+/* prototypes for generator type functions */
+static size_t sobol_state_size(unsigned int dimension);
+static int sobol_init(void * state, unsigned int dimension);
+static int sobol_get(void * state, unsigned int dimension, double * v);
+
+/* global Sobol generator type object */
+static const gsl_qrng_type sobol_type =
+{
+ "sobol",
+ SOBOL_MAX_DIMENSION,
+ sobol_state_size,
+ sobol_init,
+ sobol_get
+};
+const gsl_qrng_type * gsl_qrng_sobol = &sobol_type;
+
+
+/* primitive polynomials in binary encoding
+ */
+static const int primitive_polynomials[SOBOL_MAX_DIMENSION] =
+{
+ 1, 3, 7, 11, 13, 19, 25, 37, 59, 47,
+ 61, 55, 41, 67, 97, 91, 109, 103, 115, 131,
+ 193, 137, 145, 143, 241, 157, 185, 167, 229, 171,
+ 213, 191, 253, 203, 211, 239, 247, 285, 369, 299
+};
+
+/* degrees of the primitive polynomials */
+static const int degree_table[SOBOL_MAX_DIMENSION] =
+{
+ 0, 1, 2, 3, 3, 4, 4, 5, 5, 5,
+ 5, 5, 5, 6, 6, 6, 6, 6, 6, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 8, 8, 8
+};
+
+
+/* initial values for direction tables, following
+ * Bratley+Fox, taken from [Sobol+Levitan, preprint 1976]
+ */
+static const int v_init[8][SOBOL_MAX_DIMENSION] =
+{
+ {
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+ },
+ {
+ 0, 0, 1, 3, 1, 3, 1, 3, 3, 1,
+ 3, 1, 3, 1, 3, 1, 1, 3, 1, 3,
+ 1, 3, 1, 3, 3, 1, 3, 1, 3, 1,
+ 3, 1, 1, 3, 1, 3, 1, 3, 1, 3
+ },
+ {
+ 0, 0, 0, 7, 5, 1, 3, 3, 7, 5,
+ 5, 7, 7, 1, 3, 3, 7, 5, 1, 1,
+ 5, 3, 3, 1, 7, 5, 1, 3, 3, 7,
+ 5, 1, 1, 5, 7, 7, 5, 1, 3, 3
+ },
+ {
+ 0, 0, 0, 0, 0, 1, 7, 9, 13, 11,
+ 1, 3, 7, 9, 5, 13, 13, 11, 3, 15,
+ 5, 3, 15, 7, 9, 13, 9, 1, 11, 7,
+ 5, 15, 1, 15, 11, 5, 3, 1, 7, 9
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 9, 3, 27,
+ 15, 29, 21, 23, 19, 11, 25, 7, 13, 17,
+ 1, 25, 29, 3, 31, 11, 5, 23, 27, 19,
+ 21, 5, 1, 17, 13, 7, 15, 9, 31, 9
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 37, 33, 7, 5, 11, 39, 63,
+ 27, 17, 15, 23, 29, 3, 21, 13, 31, 25,
+ 9, 49, 33, 19, 29, 11, 19, 27, 15, 25
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 13,
+ 33, 115, 41, 79, 17, 29, 119, 75, 73, 105,
+ 7, 59, 65, 21, 3, 113, 61, 89, 45, 107
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 7, 23, 39
+ }
+};
+
+
+/* Sobol generator state.
+ * sequence_count = number of calls with this generator
+ * last_numerator_vec = last generated numerator vector
+ * last_denominator_inv = 1/denominator for last numerator vector
+ * v_direction = direction number table
+ */
+typedef struct
+{
+ unsigned int sequence_count;
+ double last_denominator_inv;
+ int last_numerator_vec[SOBOL_MAX_DIMENSION];
+ int v_direction[SOBOL_BIT_COUNT][SOBOL_MAX_DIMENSION];
+} sobol_state_t;
+
+/* NOTE: I fixed the size for the preliminary implementation.
+ This could/should be relaxed, as an optimization.
+ */
+
+static size_t sobol_state_size(unsigned int dimension)
+{
+ return sizeof(sobol_state_t);
+}
+
+
+static int sobol_init(void * state, unsigned int dimension)
+{
+ sobol_state_t * s_state = (sobol_state_t *) state;
+ unsigned int i_dim;
+ int j, k;
+ int ell;
+
+ if(dimension < 1 || dimension > SOBOL_MAX_DIMENSION) {
+ return GSL_EINVAL;
+ }
+
+ /* Initialize direction table in dimension 0. */
+ for(k=0; k<SOBOL_BIT_COUNT; k++) s_state->v_direction[k][0] = 1;
+
+ /* Initialize in remaining dimensions. */
+ for(i_dim=1; i_dim<dimension; i_dim++) {
+
+ const int poly_index = i_dim;
+ const int degree_i = degree_table[poly_index];
+ int includ[8];
+
+ /* Expand the polynomial bit pattern to separate
+ * components of the logical array includ[].
+ */
+ int p_i = primitive_polynomials[poly_index];
+ for(k = degree_i-1; k >= 0; k--) {
+ includ[k] = ((p_i % 2) == 1);
+ p_i /= 2;
+ }
+
+ /* Leading elements for dimension i come from v_init[][]. */
+ for(j=0; j<degree_i; j++) s_state->v_direction[j][i_dim] = v_init[j][i_dim];
+
+ /* Calculate remaining elements for this dimension,
+ * as explained in Bratley+Fox, section 2.
+ */
+ for(j=degree_i; j<SOBOL_BIT_COUNT; j++) {
+ int newv = s_state->v_direction[j-degree_i][i_dim];
+ ell = 1;
+ for(k=0; k<degree_i; k++) {
+ ell *= 2;
+ if(includ[k]) newv ^= (ell * s_state->v_direction[j-k-1][i_dim]);
+ }
+ s_state->v_direction[j][i_dim] = newv;
+ }
+ }
+
+ /* Multiply columns of v by appropriate power of 2. */
+ ell = 1;
+ for(j=SOBOL_BIT_COUNT-1-1; j>=0; j--) {
+ ell *= 2;
+ for(i_dim=0; i_dim<dimension; i_dim++) {
+ s_state->v_direction[j][i_dim] *= ell;
+ }
+ }
+
+ /* 1/(common denominator of the elements in v_direction) */
+ s_state->last_denominator_inv = 1.0 /(2.0 * ell);
+
+ /* final setup */
+ s_state->sequence_count = 0;
+ for(i_dim=0; i_dim<dimension; i_dim++) s_state->last_numerator_vec[i_dim] = 0;
+
+ return GSL_SUCCESS;
+}
+
+
+static int sobol_get(void * state, unsigned int dimension, double * v)
+{
+ sobol_state_t * s_state = (sobol_state_t *) state;
+
+ unsigned int i_dimension;
+
+ /* Find the position of the least-significant zero in count. */
+ int ell = 0;
+ int c = s_state->sequence_count;
+ while(1) {
+ ++ell;
+ if((c % 2) == 1) c /= 2;
+ else break;
+ }
+
+ /* Check for exhaustion. */
+ if(ell > SOBOL_BIT_COUNT) return GSL_EFAILED; /* FIXME: good return code here */
+
+ for(i_dimension=0; i_dimension<dimension; i_dimension++) {
+ const int direction_i = s_state->v_direction[ell-1][i_dimension];
+ const int old_numerator_i = s_state->last_numerator_vec[i_dimension];
+ const int new_numerator_i = old_numerator_i ^ direction_i;
+ s_state->last_numerator_vec[i_dimension] = new_numerator_i;
+ v[i_dimension] = new_numerator_i * s_state->last_denominator_inv;
+ }
+
+ s_state->sequence_count++;
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/qrng/test.c b/gsl-1.9/qrng/test.c
new file mode 100644
index 0000000..4b7d08f
--- /dev/null
+++ b/gsl-1.9/qrng/test.c
@@ -0,0 +1,122 @@
+/* Author: G. Jungman
+ */
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_ieee_utils.h>
+
+#include <gsl/gsl_qrng.h>
+#include <gsl/gsl_test.h>
+
+void test_sobol(void)
+{
+ int status = 0;
+ double v[3];
+ /* int i; */
+
+ /* test in dimension 2 */
+ gsl_qrng * g = gsl_qrng_alloc(gsl_qrng_sobol, 2);
+ gsl_qrng_get(g, v);
+ gsl_qrng_get(g, v);
+ gsl_qrng_get(g, v);
+ status += ( v[0] != 0.25 || v[1] != 0.75 );
+ gsl_qrng_get(g, v);
+ status += ( v[0] != 0.375 || v[1] != 0.375 );
+ gsl_qrng_free(g);
+
+ gsl_test (status, "Sobol d=2");
+
+ status = 0;
+ /* test in dimension 3 */
+ g = gsl_qrng_alloc(gsl_qrng_sobol, 3);
+ gsl_qrng_get(g, v);
+ gsl_qrng_get(g, v);
+ gsl_qrng_get(g, v);
+ status += ( v[0] != 0.25 || v[1] != 0.75 || v[2] != 0.25 );
+ gsl_qrng_get(g, v);
+ status += ( v[0] != 0.375 || v[1] != 0.375 || v[2] != 0.625 );
+
+ gsl_test (status, "Sobol d=3");
+
+ status = 0;
+ gsl_qrng_init(g);
+ gsl_qrng_get(g, v);
+ gsl_qrng_get(g, v);
+ gsl_qrng_get(g, v);
+ status += ( v[0] != 0.25 || v[1] != 0.75 || v[2] != 0.25 );
+ gsl_qrng_get(g, v);
+ status += ( v[0] != 0.375 || v[1] != 0.375 || v[2] != 0.625 );
+ gsl_qrng_free(g);
+
+ gsl_test (status, "Sobol d=3 (reinitialized)");
+}
+
+
+void test_nied2(void)
+{
+ int status = 0;
+ double v[3];
+ /* int i; */
+
+ /* test in dimension 2 */
+ gsl_qrng * g = gsl_qrng_alloc(gsl_qrng_niederreiter_2, 2);
+ gsl_qrng_get(g, v);
+ gsl_qrng_get(g, v);
+ gsl_qrng_get(g, v);
+ status += ( v[0] != 0.75 || v[1] != 0.25 );
+ gsl_qrng_get(g, v);
+ status += ( v[0] != 0.25 || v[1] != 0.75 );
+ gsl_qrng_get(g, v);
+ gsl_qrng_get(g, v);
+ gsl_qrng_get(g, v);
+ status += ( v[0] != 0.625 || v[1] != 0.125 );
+ gsl_qrng_free(g);
+
+ gsl_test (status, "Niederreiter d=2");
+
+ status = 0;
+
+ /* test in dimension 3 */
+ g = gsl_qrng_alloc(gsl_qrng_niederreiter_2, 3);
+ gsl_qrng_get(g, v);
+ gsl_qrng_get(g, v);
+ gsl_qrng_get(g, v);
+ status += ( v[0] != 0.75 || v[1] != 0.25 || v[2] != 0.3125 );
+ gsl_qrng_get(g, v);
+ status += ( v[0] != 0.25 || v[1] != 0.75 || v[2] != 0.5625 );
+ gsl_qrng_get(g, v);
+ gsl_qrng_get(g, v);
+ gsl_qrng_get(g, v);
+ status += ( v[0] != 0.625 || v[1] != 0.125 || v[2] != 0.6875 );
+
+ gsl_test (status, "Niederreiter d=3");
+
+ status = 0;
+
+ gsl_qrng_init(g);
+ gsl_qrng_get(g, v);
+ gsl_qrng_get(g, v);
+ gsl_qrng_get(g, v);
+ status += ( v[0] != 0.75 || v[1] != 0.25 || v[2] != 0.3125 );
+ gsl_qrng_get(g, v);
+ status += ( v[0] != 0.25 || v[1] != 0.75 || v[2] != 0.5625 );
+ gsl_qrng_get(g, v);
+ gsl_qrng_get(g, v);
+ gsl_qrng_get(g, v);
+ status += ( v[0] != 0.625 || v[1] != 0.125 || v[2] != 0.6875 );
+ gsl_qrng_free(g);
+
+
+ gsl_test (status, "Niederreiter d=3 (reinitialized)");
+}
+
+
+int main()
+{
+
+ gsl_ieee_env_setup ();
+
+ test_sobol();
+ test_nied2();
+
+ exit (gsl_test_summary ());
+}
diff --git a/gsl-1.9/randist/ChangeLog b/gsl-1.9/randist/ChangeLog
new file mode 100644
index 0000000..fb727e8
--- /dev/null
+++ b/gsl-1.9/randist/ChangeLog
@@ -0,0 +1,437 @@
+2007-02-20 Brian Gough <bjg@network-theory.co.uk>
+
+ * gamma.c (gsl_ran_gamma): avoid an unnecessary function call to
+ gsl_ran_gamma_mt, since that maps back to gsl_ran_gamma now
+
+2007-02-14 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c (testPDF): reduce the test sensitivity to avoid failures
+ caused by weaknesses in the underlying rng
+
+2007-01-26 Brian Gough <bjg@network-theory.co.uk>
+
+ * gamma.c (gsl_ran_gamma): the Marsaglia Tsang method is now the
+ default
+ (gsl_ran_gamma_knuth): new function name, preserving the original
+ gsl_ran_gamma
+
+2006-08-30 Brian Gough <bjg@network-theory.co.uk>
+
+ * discrete.c (gsl_ran_discrete_preproc): use GSL_ENOMEM instead of
+ ENOMEM
+
+2006-04-18 Brian Gough <bjg@network-theory.co.uk>
+
+ * gausszig.c (gsl_ran_gaussian_ziggurat): fix prototype const
+
+2006-03-26 Brian Gough <bjg@network-theory.co.uk>
+
+ * multinomial.c (gsl_ran_multinomial_lnpdf): use gsl_sf_lnfact
+ instead of gsl_sf_lngamma for an integer argument
+
+2006-03-17 Brian Gough <bjg@network-theory.co.uk>
+
+ * binomial_tpe.c (gsl_ran_binomial): cast return values to
+ unsigned
+
+2006-02-27 Brian Gough <bjg@network-theory.co.uk>
+
+ * beta.c (gsl_ran_beta_pdf): work with logs avoid
+ underflow/overflow
+
+2006-02-19 Brian Gough <bjg@network-theory.co.uk>
+
+ * gauss.c (gsl_ran_gaussian): reject case where x=-1 || y=-1
+ for true symmetry
+ (gsl_ran_gaussian_ratio_method): add Leva bounds
+
+ * exppow.c (gsl_ran_exppow): added faster rejection methods
+
+2006-02-01 Brian Gough <bjg@network-theory.co.uk>
+
+ * gausszig.c: added ziggurat gaussian (Jochen Voss)
+
+2006-01-20 Brian Gough <bjg@network-theory.co.uk>
+
+ * binomial.c (gsl_ran_binomial_pdf): handle the cases p=0 and p=1
+ (gsl_ran_binomial_pdf): use log1p to calculate more accurately
+ near k=0,p=0
+
+2005-08-31 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c (main): free allocated memory before exit
+
+2005-08-22 Brian Gough <bjg@network-theory.co.uk>
+
+ * binomial_tpe.c (gsl_ran_binomial): switch to the TPE algorithm
+ as the default
+
+ * binomial.c (gsl_ran_binomial_knuth): rename the original
+ binomial function to ..._knuth
+
+2004-05-30 Brian Gough <bjg@network-theory.co.uk>
+
+ * landau.c (gsl_ran_landau): fix potential array bounds overflow
+ by extending array.
+
+2004-04-22 Brian Gough <bjg@network-theory.co.uk>
+
+ * sphere.c (gsl_ran_dir_3d): removed unnecessary check for s==0.0
+
+2003-07-25 Brian Gough <bjg@network-theory.co.uk>
+
+ * dirichlet.c: include gsl_sf_gamma.h instead of gsl_sf.h
+
+2003-07-24 Brian Gough <bjg@network-theory.co.uk>
+
+ * binomial_tpe.c (gsl_ran_binomial_tpe): convert to double to
+ avoid possible signed/unsigned problems in comparison (ix > n)
+ (Stirling): removed spurious trailing ;
+
+2003-05-14 Brian Gough <bjg@network-theory.co.uk>
+
+ * binomial_tpe.c: fast binomial algorithm using TPE method
+
+ * test.c: added the tests for the fast Binomial TPE routine
+
+2003-02-09 Brian Gough <bjg@network-theory.co.uk>
+
+ * discrete.c (gsl_ran_discrete_preproc): fixed bug reported by
+ ahoward <ahoward@pollux.usc.edu>
+
+2003-01-25 Brian Gough <brian.gough@network-theory.co.uk>
+
+ * chisq.c: corrected comments
+
+2002-12-10 Brian Gough <bjg@network-theory.co.uk>
+
+ * multinomial.c (gsl_ran_multinomial): added multinomial
+ distribution
+
+ * dirichlet.c (gsl_ran_dirichlet_lnpdf): added logpdf function for
+ accuracy
+
+Tue Aug 27 19:08:33 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * dirichlet.c: added dirichlet distribution
+
+Sat Aug 18 22:21:07 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl-randist.c: moved to top-level directory
+
+Wed Jul 18 12:57:55 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * landau.c: added Landau distribution from Dave Morrison
+
+Sat Jun 23 12:30:38 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * gausstail.c (gsl_ran_gaussian_tail): allow negative values for
+ the tail cutoff parameter.
+
+Mon May 21 12:17:07 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * shuffle.c (gsl_ran_choose): removed void * return value
+ (gsl_ran_sample): removed void * return value
+
+Tue Apr 24 17:10:47 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * bernoulli.c (gsl_ran_bernoulli_pdf): removed unnecessary
+ reference to gsl_sf.h
+
+Mon Apr 23 10:25:44 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * changed calls to old specfunc _impl functions to use new error
+ handling conventions
+
+Tue Apr 17 19:57:59 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * weibull.c (gsl_ran_weibull): changed parameter mu to a, since it
+ is not the mean
+ (gsl_ran_weibull_pdf): changed parameter mu to a, since it
+ is not the mean
+
+ * logistic.c (gsl_ran_logistic): changed parameter mu to a, since it
+ is not the mean
+ (gsl_ran_logistic_pdf): changed parameter mu to a, since it
+ is not the mean
+
+ * laplace.c (gsl_ran_laplace): changed parameter mu to a, since it
+ is not the mean
+ (gsl_ran_laplace_pdf): changed parameter mu to a, since it
+ is not the mean
+
+ * exppow.c (gsl_ran_exppow): changed parameter mu to a, since it
+ is not the mean
+ (gsl_ran_exppow_pdf): changed parameter mu to a, since it
+ is not the mean
+
+ * cauchy.c (gsl_ran_cauchy): changed parameter mu to a, since it
+ is not the mean
+ (gsl_ran_cauchy_pdf): changed parameter mu to a, since it
+ is not the mean
+
+Tue Feb 20 11:14:00 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * levy.c: added the skew symmetric routine from Keith Briggs,
+ changed the definition of the original function to match and not
+ use mu as a scale parameter.
+
+2000-10-17 Brian Gough <bjg@inweb.aethos.co.uk>
+
+ * shuffle.c (gsl_ran_shuffle): replaced calls of the form
+ N*gsl_rng_uniform(r) with the integer form gsl_rng_uniform(r, N)
+
+Thu Sep 21 18:41:53 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * pareto.c (gsl_ran_pareto): made arguments and documentation
+ consistent
+
+Wed May 10 14:55:43 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl-randist.c (main): fixed bug for lognormal (it was calling
+ exppow) Tadhg O'Meara <tadhg@net-cs.ucd.ie>
+
+ * gsl-randist.c (main): print out all the dimensions for dir-nd,
+ not just the first
+
+Tue Apr 25 20:45:14 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * shuffle.c (gsl_ran_sample): lifted the restriction that sampling
+ with replacement could only be done less than n times for n objects.
+
+Tue Mar 14 21:31:46 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * logistic.c (gsl_ran_logistic_pdf): prevent overflow in
+ computation of pdf for x < 0
+
+Thu Oct 7 12:55:40 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * discrete.c (gsl_ran_discrete_free): removed unreachable code
+ "return 0";
+
+Fri Aug 6 16:02:08 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * sphere.c (gsl_ran_dir_nd): number of dimensions is now unsigned
+ (size_t)
+
+ * logarithmic.c (gsl_ran_logarithmic_pdf): removed warning about
+ passing arg 2 of `pow' as floating rather than integer due to
+ prototype
+
+Sun Aug 1 20:29:43 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * discrete.c: converted to GSL_ERROR macros for error handling
+
+Tue Jul 27 14:14:38 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * sphere.c (gsl_ran_dir_3d): use the Knop method only -- it is the
+ best.
+ (gsl_ran_dir_2d_trig_method): split out the trig method as an
+ alternative for those platforms where it is faster
+
+ * bigauss.c: split out the bivariate gaussian into its own source
+ file
+
+1999-06-30 Mark Galassi <rosalia@lanl.gov>
+
+ * discrete.c: (thanks to Frederick W. Wheeler
+ <wheeler@cipr.rpi.edu>) changed the type stack_t to gsl_stack_t to
+ avoid a conflict on HPUX.
+
+Sun Feb 28 20:41:18 1999 Brian Gough <bjg@netsci.freeserve.co.uk>
+
+ * gsl-randist.c (main): change cfree() to free(), which is
+ standard.
+
+ * discrete.c (gsl_ran_discrete_preproc): removed warning, pTotal
+ is now initialized to zero.
+
+1999-01-31 James Theiler <jt@lanl.gov>
+ * gauss.c added a new function gsl_ran_ugaussian_tail() which
+ provides random numbers out on the tail of a gaussian. I also
+ added (but then #ifdef'd out) a second implementation of ordinary
+ gaussian numbers. This second implementation passes the tests
+ okay, but it is a touch slower on my home Pentium.
+ * gsl_randist.h added prototypes
+ * test.c added tests for new gaussian tail function; also altered
+ testMoment's ugaussian range (-1,1) value from .68 to a more
+ accurate value.
+ * ../doc/random.texi further updated
+
+1999-01-30 James Theiler <jt@lanl.gov>
+ * discrete.c added implementation of Walker's algorithm for
+ rapidly choosing a random integer k where the k's are distributed
+ by a user-supplied array of probabilities P[k]. This includes
+ functions gsl_ran_discrete(), gsl_ran_discrete_preproc(),
+ gsl_ran_discrete_free(), and gsl_ran_discrete_pdf().
+ * gsl_randist.h added definition of structure gsl_ran_discrete_t,
+ also prototypes of new functions defined in discrete.c
+ * test.c added tests for gsl_ran_discrete(), also
+ * test.c made some essentially cosmetic changes:
+ 1/ redefined FUNC and FUNC2 macros so now output looks like
+ "test gsl_ran_poisson" instead of "gsl_ran_test_poisson"
+ 2/ changed names of toplevel tests, eg test_moments->testMoments,
+ test_pdf->testPDF, etc, to distinguish them from all the individual
+ functions test_poisson, test_binomial, etc.
+ hope that's ok.
+ * ../doc/random.texi updated to reflect the new discrete functions,
+ as well as the new implementations of the sphere.c routines.
+
+1999-01-28 James Theiler <jt@lanl.gov>
+ * sphere.c modified gsl_ran_dir_3d, to speed it up about 2x
+ also modified gsl_ran_dir_2d, providing alternative algorithms
+ (#ifdef'd appropriately). which is faster is machine dependent.
+ also gsl_ran_dir_nd for n-dimensional direction, using
+ gaussian random variables, normalized to the unit sphere
+ also added ref's to Knuth and others describing the algorithms
+ * gsl_randist.h added gsl_ran_dir_nd() prototype
+ * gsl-randist.c added dir-nd option
+
+Tue Dec 15 23:08:57 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * updated all the functions depending on gsl_sf to use the new
+ special function interface, based on gsl_sf_result
+
+Tue Nov 17 17:02:54 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * added #include <config.h> to all top-level source files
+
+1998-11-06 <bjg@ancho.lanl.gov>
+
+ * test.c: ensured that M_PI is available by #include <gsl_math.h>
+
+Wed Sep 16 14:44:08 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * rayleigh.c: added rayleigh tail distribution
+
+Sat Sep 12 13:03:19 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * rayleigh.c: added rayleigh distribution
+
+Mon Aug 31 James Theiler <jt@lanl.gov>
+
+ * Makefile.am: added ../utils/libutils.a to some LDADD's
+
+Mon Aug 17 14:31:55 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * gsl_randist.h: renamed discrete probability distribution
+ parameters to use consistent k,n notation (k = sample, n = total,
+ e.g. p(k) = function(k,n) )
+
+Wed Aug 12 14:02:31 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * lognormal.c: added zeta and sigma (location and scale parameters)
+
+ * logarithmic.c (gsl_ran_logarithmic): added logarithmic distribution
+
+Mon Aug 10 14:41:15 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * gsl-randist.c: added random direction functions
+
+ * gamma.c: added the scale paramter for the gamma distribution
+
+Thu Aug 6 12:19:59 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * gauss.c (gsl_ran_bivariate_gaussian): added bivariate with
+ correlations.
+
+ * hyperg.c: renamed variables, fixed bug
+
+Wed Aug 5 11:21:45 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * gsl-dist.c: renamed gsl-dist.c to gsl-randist.c, for
+ consistency
+
+Tue Aug 4 12:29:17 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * gsl-dist.c: a program for generating samples from the
+ distributions
+
+ * levy.c (gsl_ran_levy): take care of special case, a=1
+
+ * logistic.c: allow scale parameter, mu
+
+ * weibull.c: allow scale parameter, mu
+
+ * pareto.c: allow scale parameter, mu
+
+ * exppow.c: handle the case a<1 using a transformation of the
+ gamma distribution.
+
+ * gamma.c (gsl_ran_gamma_int): removed the check for
+ GSL_LOGINIFINITY since underflow can't occur for 32-bit random
+ numbers in double precision.
+
+Mon Aug 3 13:09:39 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * test.c: added tests for shuffle and choose
+
+ * pascal.c: added the Pascal distribution
+
+ * hyperg.c: added the hypergeometric distribution
+
+Fri Jul 31 12:52:12 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * gsl_randist.h: renamed gsl_ran_two_sided_exponential to
+ gsl_ran_laplace
+
+1998-07-26 Mark Galassi <rosalia@cygnus.com>
+
+ * Makefile.am (INCLUDES): added -I$(top_srcdir), since gsl_math.h
+ is needed, and that is in the top level source directory. This is
+ necessary for using a separate build directory.
+
+Tue Jul 14 12:39:30 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * nbinomial.c: added Negative Binomial distribution
+
+ * bernoulli.c: added Bernoulli distribution
+
+ * poisson.c (gsl_ran_poisson): fixed a serious bug in the unrolled
+ recursion which led to an incorrect result being returned for the
+ large t case. This shows the importance of tests that cover all
+ possible branches!!!
+
+ * erlang.c (gsl_ran_erlang_pdf): renamed mu to a for consistency
+
+Thu Jul 2 15:47:05 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * added some extra distributions, lognormal.c gaussian.c
+ logistic.c pareto.c geometric.c erlang.c chisq.c weibull.c,
+ although they aren't finished yet
+
+Wed Jul 1 11:56:06 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * replace do { u = gsl_rng_uniform(r) } while (u == 0) by a direct
+ call to gsl_rng_uniform_pos.
+
+Sun Jun 28 14:21:13 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * converted everything to work with rng style generators
+
+Sun Apr 19 19:06:59 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * made the 'gsl-dist' programs just output a single column of
+ their random numbers (previously some of the programs printed both
+ the uniform variate and the transformed number)
+
+ * got rid of the 'bench-' programs. We will have a full testing
+ suite soon.
+
+ * renamed the installed programs from 'dist' to 'gsl-dist' so that
+ they don't overwrite anything, e.g. it's possible the user might
+ have other programs called 'gauss' or 'gamma' installed in
+ /usr/local
+
+Sat Mar 21 16:09:16 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * laplace.c (gsl_ran_laplace): added a Laplace distribution
+ (two-sided exponential)
+
+ * lorentz.c (gsl_ran_lorentzian): added a Lorentz distribution
+
+1998-01-30 Mark Galassi <rosalia@cygnus.com>
+
+ * Makefile.am (lib_LIBRARIES): now it creates libgslrandist.a so
+ that we have gaussian and poisson distributions.
+
diff --git a/gsl-1.9/randist/Makefile.am b/gsl-1.9/randist/Makefile.am
new file mode 100644
index 0000000..6a69f1f
--- /dev/null
+++ b/gsl-1.9/randist/Makefile.am
@@ -0,0 +1,16 @@
+noinst_LTLIBRARIES = libgslrandist.la
+
+pkginclude_HEADERS= gsl_randist.h
+
+INCLUDES= -I$(top_builddir)
+
+libgslrandist_la_SOURCES = bernoulli.c beta.c bigauss.c binomial.c cauchy.c chisq.c dirichlet.c discrete.c erlang.c exponential.c exppow.c fdist.c flat.c gamma.c gauss.c gausszig.c gausstail.c geometric.c gumbel.c hyperg.c laplace.c levy.c logarithmic.c logistic.c lognormal.c multinomial.c nbinomial.c pareto.c pascal.c poisson.c rayleigh.c shuffle.c sphere.c tdist.c weibull.c landau.c binomial_tpe.c
+
+TESTS = $(check_PROGRAMS)
+
+check_PROGRAMS = test
+
+test_SOURCES = test.c
+test_LDADD = libgslrandist.la ../rng/libgslrng.la ../specfunc/libgslspecfunc.la ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+
+
diff --git a/gsl-1.9/randist/Makefile.in b/gsl-1.9/randist/Makefile.in
new file mode 100644
index 0000000..def5139
--- /dev/null
+++ b/gsl-1.9/randist/Makefile.in
@@ -0,0 +1,551 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = test$(EXEEXT)
+subdir = randist
+DIST_COMMON = $(pkginclude_HEADERS) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in ChangeLog TODO
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgslrandist_la_LIBADD =
+am_libgslrandist_la_OBJECTS = bernoulli.lo beta.lo bigauss.lo \
+ binomial.lo cauchy.lo chisq.lo dirichlet.lo discrete.lo \
+ erlang.lo exponential.lo exppow.lo fdist.lo flat.lo gamma.lo \
+ gauss.lo gausszig.lo gausstail.lo geometric.lo gumbel.lo \
+ hyperg.lo laplace.lo levy.lo logarithmic.lo logistic.lo \
+ lognormal.lo multinomial.lo nbinomial.lo pareto.lo pascal.lo \
+ poisson.lo rayleigh.lo shuffle.lo sphere.lo tdist.lo \
+ weibull.lo landau.lo binomial_tpe.lo
+libgslrandist_la_OBJECTS = $(am_libgslrandist_la_OBJECTS)
+am_test_OBJECTS = test.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = libgslrandist.la ../rng/libgslrng.la \
+ ../specfunc/libgslspecfunc.la ../complex/libgslcomplex.la \
+ ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la \
+ ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgslrandist_la_SOURCES) $(test_SOURCES)
+DIST_SOURCES = $(libgslrandist_la_SOURCES) $(test_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libgslrandist.la
+pkginclude_HEADERS = gsl_randist.h
+INCLUDES = -I$(top_builddir)
+libgslrandist_la_SOURCES = bernoulli.c beta.c bigauss.c binomial.c cauchy.c chisq.c dirichlet.c discrete.c erlang.c exponential.c exppow.c fdist.c flat.c gamma.c gauss.c gausszig.c gausstail.c geometric.c gumbel.c hyperg.c laplace.c levy.c logarithmic.c logistic.c lognormal.c multinomial.c nbinomial.c pareto.c pascal.c poisson.c rayleigh.c shuffle.c sphere.c tdist.c weibull.c landau.c binomial_tpe.c
+TESTS = $(check_PROGRAMS)
+test_SOURCES = test.c
+test_LDADD = libgslrandist.la ../rng/libgslrng.la ../specfunc/libgslspecfunc.la ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps randist/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps randist/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgslrandist.la: $(libgslrandist_la_OBJECTS) $(libgslrandist_la_DEPENDENCIES)
+ $(LINK) $(libgslrandist_la_LDFLAGS) $(libgslrandist_la_OBJECTS) $(libgslrandist_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkgincludeHEADERS
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/randist/TODO b/gsl-1.9/randist/TODO
new file mode 100644
index 0000000..4257730
--- /dev/null
+++ b/gsl-1.9/randist/TODO
@@ -0,0 +1,58 @@
+* add Erlang dist back in?
+
+* DONE, for mu.
+
+ Note that we need to get rid of mu when it is not the mean.
+
+ From: Brian Gough <bjg@network-theory.co.uk>
+ To: briggsk@info.bt.co.uk
+ Cc: gsl-discuss@sourceware.cygnus.com
+ Subject: Re: Pareto Distribution
+ Date: Sun, 9 Jul 2000 20:05:03 +0100 (BST)
+
+ Yes, we should adopt the conventions from a standard reference book --
+ the existing functions are drawn from a variety of sources, mostly
+ Devroye's book on Random Variates (which is public domain, but not
+ available electronically unfortunately). Maybe the three volumes of
+ Johnson & Kotz on Univariate Distributions would do, for
+ example. Patches are welcome from anyone who wants sort this out.
+
+ Keith Briggs writes:
+ > Another thing to think about: some of the other distributions
+ > have a argument `mu' to the C function which is a parameter
+ > which is not the mean. This is non-standard and confusing.
+ > (Also, in the Pareto function, `a' is normally called beta,
+ > `b' is normally called alpha.)
+ >
+ > Keith
+ >
+ > +-------------------------------------------------------------------+
+ > | Dr. Keith M. Briggs, Complexity Research Group, BT Research Labs. |
+ > | Adastral Park admin2 pp5, Martlesham Heath, IP5 3RE, Suffolk, UK |
+ > | Tel. 01473 641 911 Fax. 01473 647 410. Home tel: 01473 625 972 |
+ > | www.bt.com | personal homepage: www.labs.bt.com/people/briggsk2/ |
+ > +-------------------------------------------------------------------+
+
+
+* The exponential power distribution method could be speeded up by
+using a rational function approximation for the rejection scaling
+parameter.
+
+* Do something about the possibility of the user providing invalid
+parameters (e.g. negative variance etc). Not sure what to do though,
+since returning an error code is not possible. Maybe just return zero.
+ We should return NAN in this case, and for the CDFs.
+
+* Add the triangular distribution.
+
+* Look at Marsaglia & Tsang, "The Monte Python Method for generating
+random variables", ACM TOMS Vol 24, No 3, p341
+
+and the paper on the Ziggurat Method: Journal of Statistical Software,
+Volume 05 Issue 08. George Marsaglia and Wai Wan Tsang. "The ziggurat
+method for generating random variables"
+
+* Should 0 be included in distributions such as the exponential
+distribution? If we want a consistent behaviour, is it included in
+others? Note that 1-gsl_rng_uniform() can have a slight loss of
+precision when the random float is small.
diff --git a/gsl-1.9/randist/bernoulli.c b/gsl-1.9/randist/bernoulli.c
new file mode 100644
index 0000000..3bed22b
--- /dev/null
+++ b/gsl-1.9/randist/bernoulli.c
@@ -0,0 +1,61 @@
+/* randist/bernoulli.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+
+/* The bernoulli distribution has the form,
+
+ prob(0) = 1-p, prob(1) = p
+
+ */
+
+unsigned int
+gsl_ran_bernoulli (const gsl_rng * r, double p)
+{
+ double u = gsl_rng_uniform (r) ;
+
+ if (u < p)
+ {
+ return 1 ;
+ }
+ else
+ {
+ return 0 ;
+ }
+}
+
+double
+gsl_ran_bernoulli_pdf (const unsigned int k, double p)
+{
+ if (k == 0)
+ {
+ return 1 - p ;
+ }
+ else if (k == 1)
+ {
+ return p ;
+ }
+ else
+ {
+ return 0 ;
+ }
+}
diff --git a/gsl-1.9/randist/beta.c b/gsl-1.9/randist/beta.c
new file mode 100644
index 0000000..d7fe353
--- /dev/null
+++ b/gsl-1.9/randist/beta.c
@@ -0,0 +1,68 @@
+/* randist/beta.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+#include <gsl/gsl_sf_gamma.h>
+
+/* The beta distribution has the form
+
+ p(x) dx = (Gamma(a + b)/(Gamma(a) Gamma(b))) x^(a-1) (1-x)^(b-1) dx
+
+ The method used here is the one described in Knuth */
+
+double
+gsl_ran_beta (const gsl_rng * r, const double a, const double b)
+{
+ double x1 = gsl_ran_gamma (r, a, 1.0);
+ double x2 = gsl_ran_gamma (r, b, 1.0);
+
+ return x1 / (x1 + x2);
+}
+
+double
+gsl_ran_beta_pdf (const double x, const double a, const double b)
+{
+ if (x < 0 || x > 1)
+ {
+ return 0 ;
+ }
+ else
+ {
+ double p;
+
+ double gab = gsl_sf_lngamma (a + b);
+ double ga = gsl_sf_lngamma (a);
+ double gb = gsl_sf_lngamma (b);
+
+ if (x == 0.0 || x == 1.0)
+ {
+ p = exp (gab - ga - gb) * pow (x, a - 1) * pow (1 - x, b - 1);
+ }
+ else
+ {
+ p = exp (gab - ga - gb + log(x) * (a - 1) + log1p(-x) * (b - 1));
+ }
+
+ return p;
+ }
+}
diff --git a/gsl-1.9/randist/bigauss.c b/gsl-1.9/randist/bigauss.c
new file mode 100644
index 0000000..c77b524
--- /dev/null
+++ b/gsl-1.9/randist/bigauss.c
@@ -0,0 +1,70 @@
+/* randist/bigauss.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+
+/* The Bivariate Gaussian probability distribution is
+
+ p(x,y) dxdy = (1/(2 pi sigma_x sigma_y sqrt(c)))
+ exp(-((x/sigma_x)^2 + (y/sigma_y)^2 - 2 r (x/sigma_x)(y/sigma_y))/2c) dxdy
+
+ where c = 1-r^2
+*/
+
+void
+gsl_ran_bivariate_gaussian (const gsl_rng * r,
+ double sigma_x, double sigma_y, double rho,
+ double *x, double *y)
+{
+ double u, v, r2, scale;
+
+ do
+ {
+ /* choose x,y in uniform square (-1,-1) to (+1,+1) */
+
+ u = -1 + 2 * gsl_rng_uniform (r);
+ v = -1 + 2 * gsl_rng_uniform (r);
+
+ /* see if it is in the unit circle */
+ r2 = u * u + v * v;
+ }
+ while (r2 > 1.0 || r2 == 0);
+
+ scale = sqrt (-2.0 * log (r2) / r2);
+
+ *x = sigma_x * u * scale;
+ *y = sigma_y * (rho * u + sqrt(1 - rho*rho) * v) * scale;
+}
+
+double
+gsl_ran_bivariate_gaussian_pdf (const double x, const double y,
+ const double sigma_x, const double sigma_y,
+ const double rho)
+{
+ double u = x / sigma_x ;
+ double v = y / sigma_y ;
+ double c = 1 - rho*rho ;
+ double p = (1 / (2 * M_PI * sigma_x * sigma_y * sqrt(c)))
+ * exp (-(u * u - 2 * rho * u * v + v * v) / (2 * c));
+ return p;
+}
diff --git a/gsl-1.9/randist/binomial.c b/gsl-1.9/randist/binomial.c
new file mode 100644
index 0000000..f47765d
--- /dev/null
+++ b/gsl-1.9/randist/binomial.c
@@ -0,0 +1,100 @@
+/* randist/binomial.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_sys.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+#include <gsl/gsl_sf_gamma.h>
+
+/* The binomial distribution has the form,
+
+ prob(k) = n!/(k!(n-k)!) * p^k (1-p)^(n-k) for k = 0, 1, ..., n
+
+ This is the algorithm from Knuth */
+
+/* Default binomial generator is now in binomial_tpe.c */
+
+unsigned int
+gsl_ran_binomial_knuth (const gsl_rng * r, double p, unsigned int n)
+{
+ unsigned int i, a, b, k = 0;
+
+ while (n > 10) /* This parameter is tunable */
+ {
+ double X;
+ a = 1 + (n / 2);
+ b = 1 + n - a;
+
+ X = gsl_ran_beta (r, (double) a, (double) b);
+
+ if (X >= p)
+ {
+ n = a - 1;
+ p /= X;
+ }
+ else
+ {
+ k += a;
+ n = b - 1;
+ p = (p - X) / (1 - X);
+ }
+ }
+
+ for (i = 0; i < n; i++)
+ {
+ double u = gsl_rng_uniform (r);
+ if (u < p)
+ k++;
+ }
+
+ return k;
+}
+
+double
+gsl_ran_binomial_pdf (const unsigned int k, const double p,
+ const unsigned int n)
+{
+ if (k > n)
+ {
+ return 0;
+ }
+ else
+ {
+ double P;
+
+ if (p == 0)
+ {
+ P = (k == 0) ? 1 : 0;
+ }
+ else if (p == 1)
+ {
+ P = (k == n) ? 1 : 0;
+ }
+ else
+ {
+ double ln_Cnk = gsl_sf_lnchoose (n, k);
+ P = ln_Cnk + k * log (p) + (n - k) * log1p (-p);
+ P = exp (P);
+ }
+
+ return P;
+ }
+}
diff --git a/gsl-1.9/randist/binomial_tpe.c b/gsl-1.9/randist/binomial_tpe.c
new file mode 100644
index 0000000..40af697
--- /dev/null
+++ b/gsl-1.9/randist/binomial_tpe.c
@@ -0,0 +1,381 @@
+/* randist/binomial_tpe.c
+ *
+ * Copyright (C) 1996-2003 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+#include <gsl/gsl_pow_int.h>
+#include <gsl/gsl_sf_gamma.h>
+
+/* The binomial distribution has the form,
+
+ f(x) = n!/(x!(n-x)!) * p^x (1-p)^(n-x) for integer 0 <= x <= n
+ = 0 otherwise
+
+ This implementation follows the public domain ranlib function
+ "ignbin", the bulk of which is the BTPE (Binomial Triangle
+ Parallelogram Exponential) algorithm introduced in
+ Kachitvichyanukul and Schmeiser[1]. It has been translated to use
+ modern C coding standards.
+
+ If n is small and/or p is near 0 or near 1 (specifically, if
+ n*min(p,1-p) < SMALL_MEAN), then a different algorithm, called
+ BINV, is used which has an average runtime that scales linearly
+ with n*min(p,1-p).
+
+ But for larger problems, the BTPE algorithm takes the form of two
+ functions b(x) and t(x) -- "bottom" and "top" -- for which b(x) <
+ f(x)/f(M) < t(x), with M = floor(n*p+p). b(x) defines a triangular
+ region, and t(x) includes a parallelogram and two tails. Details
+ (including a nice drawing) are in the paper.
+
+ [1] Kachitvichyanukul, V. and Schmeiser, B. W. Binomial Random
+ Variate Generation. Communications of the ACM, 31, 2 (February,
+ 1988) 216.
+
+ Note, Bruce Schmeiser (personal communication) points out that if
+ you want very fast binomial deviates, and you are happy with
+ approximate results, and/or n and n*p are both large, then you can
+ just use gaussian estimates: mean=n*p, variance=n*p*(1-p).
+
+ This implementation by James Theiler, April 2003, after obtaining
+ permission -- and some good advice -- from Drs. Kachitvichyanukul
+ and Schmeiser to use their code as a starting point, and then doing
+ a little bit of tweaking.
+
+ Additional polishing for GSL coding standards by Brian Gough. */
+
+#define SMALL_MEAN 14 /* If n*p < SMALL_MEAN then use BINV
+ algorithm. The ranlib
+ implementation used cutoff=30; but
+ on my computer 14 works better */
+
+#define BINV_CUTOFF 110 /* In BINV, do not permit ix too large */
+
+#define FAR_FROM_MEAN 20 /* If ix-n*p is larger than this, then
+ use the "squeeze" algorithm.
+ Ranlib used 20, and this seems to
+ be the best choice on my machine as
+ well */
+
+#define LNFACT(x) gsl_sf_lnfact(x)
+
+inline static double
+Stirling (double y1)
+{
+ double y2 = y1 * y1;
+ double s =
+ (13860.0 -
+ (462.0 - (132.0 - (99.0 - 140.0 / y2) / y2) / y2) / y2) / y1 / 166320.0;
+ return s;
+}
+
+unsigned int
+gsl_ran_binomial_tpe (const gsl_rng * rng, double p, unsigned int n)
+{
+ return gsl_ran_binomial (rng, p, n);
+}
+
+unsigned int
+gsl_ran_binomial (const gsl_rng * rng, double p, unsigned int n)
+{
+ int ix; /* return value */
+ int flipped = 0;
+ double q, s, np;
+
+ if (n == 0)
+ return 0;
+
+ if (p > 0.5)
+ {
+ p = 1.0 - p; /* work with small p */
+ flipped = 1;
+ }
+
+ q = 1 - p;
+ s = p / q;
+ np = n * p;
+
+ /* Inverse cdf logic for small mean (BINV in K+S) */
+
+ if (np < SMALL_MEAN)
+ {
+ double f0 = gsl_pow_int (q, n); /* f(x), starting with x=0 */
+
+ while (1)
+ {
+ /* This while(1) loop will almost certainly only loop once; but
+ * if u=1 to within a few epsilons of machine precision, then it
+ * is possible for roundoff to prevent the main loop over ix to
+ * achieve its proper value. following the ranlib implementation,
+ * we introduce a check for that situation, and when it occurs,
+ * we just try again.
+ */
+
+ double f = f0;
+ double u = gsl_rng_uniform (rng);
+
+ for (ix = 0; ix <= BINV_CUTOFF; ++ix)
+ {
+ if (u < f)
+ goto Finish;
+ u -= f;
+ /* Use recursion f(x+1) = f(x)*[(n-x)/(x+1)]*[p/(1-p)] */
+ f *= s * (n - ix) / (ix + 1);
+ }
+
+ /* It should be the case that the 'goto Finish' was encountered
+ * before this point was ever reached. But if we have reached
+ * this point, then roundoff has prevented u from decreasing
+ * all the way to zero. This can happen only if the initial u
+ * was very nearly equal to 1, which is a rare situation. In
+ * that rare situation, we just try again.
+ *
+ * Note, following the ranlib implementation, we loop ix only to
+ * a hardcoded value of SMALL_MEAN_LARGE_N=110; we could have
+ * looped to n, and 99.99...% of the time it won't matter. This
+ * choice, I think is a little more robust against the rare
+ * roundoff error. If n>LARGE_N, then it is technically
+ * possible for ix>LARGE_N, but it is astronomically rare, and
+ * if ix is that large, it is more likely due to roundoff than
+ * probability, so better to nip it at LARGE_N than to take a
+ * chance that roundoff will somehow conspire to produce an even
+ * larger (and more improbable) ix. If n<LARGE_N, then once
+ * ix=n, f=0, and the loop will continue until ix=LARGE_N.
+ */
+ }
+ }
+ else
+ {
+ /* For n >= SMALL_MEAN, we invoke the BTPE algorithm */
+
+ int k;
+
+ double ffm = np + p; /* ffm = n*p+p */
+ int m = (int) ffm; /* m = int floor[n*p+p] */
+ double fm = m; /* fm = double m; */
+ double xm = fm + 0.5; /* xm = half integer mean (tip of triangle) */
+ double npq = np * q; /* npq = n*p*q */
+
+ /* Compute cumulative area of tri, para, exp tails */
+
+ /* p1: radius of triangle region; since height=1, also: area of region */
+ /* p2: p1 + area of parallelogram region */
+ /* p3: p2 + area of left tail */
+ /* p4: p3 + area of right tail */
+ /* pi/p4: probability of i'th area (i=1,2,3,4) */
+
+ /* Note: magic numbers 2.195, 4.6, 0.134, 20.5, 15.3 */
+ /* These magic numbers are not adjustable...at least not easily! */
+
+ double p1 = floor (2.195 * sqrt (npq) - 4.6 * q) + 0.5;
+
+ /* xl, xr: left and right edges of triangle */
+ double xl = xm - p1;
+ double xr = xm + p1;
+
+ /* Parameter of exponential tails */
+ /* Left tail: t(x) = c*exp(-lambda_l*[xl - (x+0.5)]) */
+ /* Right tail: t(x) = c*exp(-lambda_r*[(x+0.5) - xr]) */
+
+ double c = 0.134 + 20.5 / (15.3 + fm);
+ double p2 = p1 * (1.0 + c + c);
+
+ double al = (ffm - xl) / (ffm - xl * p);
+ double lambda_l = al * (1.0 + 0.5 * al);
+ double ar = (xr - ffm) / (xr * q);
+ double lambda_r = ar * (1.0 + 0.5 * ar);
+ double p3 = p2 + c / lambda_l;
+ double p4 = p3 + c / lambda_r;
+
+ double var, accept;
+ double u, v; /* random variates */
+
+ TryAgain:
+
+ /* generate random variates, u specifies which region: Tri, Par, Tail */
+ u = gsl_rng_uniform (rng) * p4;
+ v = gsl_rng_uniform (rng);
+
+ if (u <= p1)
+ {
+ /* Triangular region */
+ ix = (int) (xm - p1 * v + u);
+ goto Finish;
+ }
+ else if (u <= p2)
+ {
+ /* Parallelogram region */
+ double x = xl + (u - p1) / c;
+ v = v * c + 1.0 - fabs (x - xm) / p1;
+ if (v > 1.0 || v <= 0.0)
+ goto TryAgain;
+ ix = (int) x;
+ }
+ else if (u <= p3)
+ {
+ /* Left tail */
+ ix = (int) (xl + log (v) / lambda_l);
+ if (ix < 0)
+ goto TryAgain;
+ v *= ((u - p2) * lambda_l);
+ }
+ else
+ {
+ /* Right tail */
+ ix = (int) (xr - log (v) / lambda_r);
+ if (ix > (double) n)
+ goto TryAgain;
+ v *= ((u - p3) * lambda_r);
+ }
+
+ /* At this point, the goal is to test whether v <= f(x)/f(m)
+ *
+ * v <= f(x)/f(m) = (m!(n-m)! / (x!(n-x)!)) * (p/q)^{x-m}
+ *
+ */
+
+ /* Here is a direct test using logarithms. It is a little
+ * slower than the various "squeezing" computations below, but
+ * if things are working, it should give exactly the same answer
+ * (given the same random number seed). */
+
+#ifdef DIRECT
+ var = log (v);
+
+ accept =
+ LNFACT (m) + LNFACT (n - m) - LNFACT (ix) - LNFACT (n - ix)
+ + (ix - m) * log (p / q);
+
+#else /* SQUEEZE METHOD */
+
+ /* More efficient determination of whether v < f(x)/f(M) */
+
+ k = abs (ix - m);
+
+ if (k <= FAR_FROM_MEAN)
+ {
+ /*
+ * If ix near m (ie, |ix-m|<FAR_FROM_MEAN), then do
+ * explicit evaluation using recursion relation for f(x)
+ */
+ double g = (n + 1) * s;
+ double f = 1.0;
+
+ var = v;
+
+ if (m < ix)
+ {
+ int i;
+ for (i = m + 1; i <= ix; i++)
+ {
+ f *= (g / i - s);
+ }
+ }
+ else if (m > ix)
+ {
+ int i;
+ for (i = ix + 1; i <= m; i++)
+ {
+ f /= (g / i - s);
+ }
+ }
+
+ accept = f;
+ }
+ else
+ {
+ /* If ix is far from the mean m: k=ABS(ix-m) large */
+
+ var = log (v);
+
+ if (k < npq / 2 - 1)
+ {
+ /* "Squeeze" using upper and lower bounds on
+ * log(f(x)) The squeeze condition was derived
+ * under the condition k < npq/2-1 */
+ double amaxp =
+ k / npq * ((k * (k / 3.0 + 0.625) + (1.0 / 6.0)) / npq + 0.5);
+ double ynorm = -(k * k / (2.0 * npq));
+ if (var < ynorm - amaxp)
+ goto Finish;
+ if (var > ynorm + amaxp)
+ goto TryAgain;
+ }
+
+ /* Now, again: do the test log(v) vs. log f(x)/f(M) */
+
+#if USE_EXACT
+ /* This is equivalent to the above, but is a little (~20%) slower */
+ /* There are five log's vs three above, maybe that's it? */
+
+ accept = LNFACT (m) + LNFACT (n - m)
+ - LNFACT (ix) - LNFACT (n - ix) + (ix - m) * log (p / q);
+
+#else /* USE STIRLING */
+ /* The "#define Stirling" above corresponds to the first five
+ * terms in asymptoic formula for
+ * log Gamma (y) - (y-0.5)log(y) + y - 0.5 log(2*pi);
+ * See Abramowitz and Stegun, eq 6.1.40
+ */
+
+ /* Note below: two Stirling's are added, and two are
+ * subtracted. In both K+S, and in the ranlib
+ * implementation, all four are added. I (jt) believe that
+ * is a mistake -- this has been confirmed by personal
+ * correspondence w/ Dr. Kachitvichyanukul. Note, however,
+ * the corrections are so small, that I couldn't find an
+ * example where it made a difference that could be
+ * observed, let alone tested. In fact, define'ing Stirling
+ * to be zero gave identical results!! In practice, alv is
+ * O(1), ranging 0 to -10 or so, while the Stirling
+ * correction is typically O(10^{-5}) ...setting the
+ * correction to zero gives about a 2% performance boost;
+ * might as well keep it just to be pendantic. */
+
+ {
+ double x1 = ix + 1.0;
+ double w1 = n - ix + 1.0;
+ double f1 = fm + 1.0;
+ double z1 = n + 1.0 - fm;
+
+ accept = xm * log (f1 / x1) + (n - m + 0.5) * log (z1 / w1)
+ + (ix - m) * log (w1 * p / (x1 * q))
+ + Stirling (f1) + Stirling (z1) - Stirling (x1) - Stirling (w1);
+ }
+#endif
+#endif
+ }
+
+
+ if (var <= accept)
+ {
+ goto Finish;
+ }
+ else
+ {
+ goto TryAgain;
+ }
+ }
+
+Finish:
+
+ return (flipped) ? (n - ix) : (unsigned int)ix;
+}
diff --git a/gsl-1.9/randist/cauchy.c b/gsl-1.9/randist/cauchy.c
new file mode 100644
index 0000000..7fffd68
--- /dev/null
+++ b/gsl-1.9/randist/cauchy.c
@@ -0,0 +1,51 @@
+/* randist/cauchy.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+
+/* The Cauchy probability distribution is
+
+ p(x) dx = (1/(pi a)) (1 + (x/a)^2)^(-1) dx
+
+ It is also known as the Lorentzian probability distribution */
+
+double
+gsl_ran_cauchy (const gsl_rng * r, const double a)
+{
+ double u;
+ do
+ {
+ u = gsl_rng_uniform (r);
+ }
+ while (u == 0.5);
+
+ return a * tan (M_PI * u);
+}
+
+double
+gsl_ran_cauchy_pdf (const double x, const double a)
+{
+ double u = x / a;
+ double p = (1 / (M_PI * a)) / (1 + u * u);
+ return p;
+}
diff --git a/gsl-1.9/randist/chisq.c b/gsl-1.9/randist/chisq.c
new file mode 100644
index 0000000..291d58b
--- /dev/null
+++ b/gsl-1.9/randist/chisq.c
@@ -0,0 +1,54 @@
+/* randist/chisq.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_sf_gamma.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+
+/* The chisq distribution has the form
+
+ p(x) dx = (1/(2*Gamma(nu/2))) (x/2)^(nu/2 - 1) exp(-x/2) dx
+
+ for x = 0 ... +infty */
+
+double
+gsl_ran_chisq (const gsl_rng * r, const double nu)
+{
+ double chisq = 2 * gsl_ran_gamma (r, nu / 2, 1.0);
+ return chisq;
+}
+
+double
+gsl_ran_chisq_pdf (const double x, const double nu)
+{
+ if (x <= 0)
+ {
+ return 0 ;
+ }
+ else
+ {
+ double p;
+ double lngamma = gsl_sf_lngamma (nu / 2);
+
+ p = exp ((nu / 2 - 1) * log (x/2) - x/2 - lngamma) / 2;
+ return p;
+ }
+}
diff --git a/gsl-1.9/randist/dirichlet.c b/gsl-1.9/randist/dirichlet.c
new file mode 100644
index 0000000..ad136e1
--- /dev/null
+++ b/gsl-1.9/randist/dirichlet.c
@@ -0,0 +1,103 @@
+/* randist/dirichlet.c
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+#include <gsl/gsl_sf_gamma.h>
+
+
+/* The Dirichlet probability distribution of order K-1 is
+
+ p(\theta_1,...,\theta_K) d\theta_1 ... d\theta_K =
+ (1/Z) \prod_i=1,K \theta_i^{alpha_i - 1} \delta(1 -\sum_i=1,K \theta_i)
+
+ The normalization factor Z can be expressed in terms of gamma functions:
+
+ Z = {\prod_i=1,K \Gamma(\alpha_i)} / {\Gamma( \sum_i=1,K \alpha_i)}
+
+ The K constants, \alpha_1,...,\alpha_K, must be positive. The K parameters,
+ \theta_1,...,\theta_K are nonnegative and sum to 1.
+
+ The random variates are generated by sampling K values from gamma
+ distributions with parameters a=\alpha_i, b=1, and renormalizing.
+ See A.M. Law, W.D. Kelton, Simulation Modeling and Analysis (1991).
+
+ Gavin E. Crooks <gec@compbio.berkeley.edu> (2002)
+*/
+
+void
+gsl_ran_dirichlet (const gsl_rng * r, const size_t K,
+ const double alpha[], double theta[])
+{
+ size_t i;
+ double norm = 0.0;
+
+ for (i = 0; i < K; i++)
+ {
+ theta[i] = gsl_ran_gamma (r, alpha[i], 1.0);
+ }
+
+ for (i = 0; i < K; i++)
+ {
+ norm += theta[i];
+ }
+
+ for (i = 0; i < K; i++)
+ {
+ theta[i] /= norm;
+ }
+}
+
+
+double
+gsl_ran_dirichlet_pdf (const size_t K,
+ const double alpha[], const double theta[])
+{
+ return exp (gsl_ran_dirichlet_lnpdf (K, alpha, theta));
+}
+
+double
+gsl_ran_dirichlet_lnpdf (const size_t K,
+ const double alpha[], const double theta[])
+{
+ /*We calculate the log of the pdf to minimize the possibility of overflow */
+ size_t i;
+ double log_p = 0.0;
+ double sum_alpha = 0.0;
+
+ for (i = 0; i < K; i++)
+ {
+ log_p += (alpha[i] - 1.0) * log (theta[i]);
+ }
+
+ for (i = 0; i < K; i++)
+ {
+ sum_alpha += alpha[i];
+ }
+
+ log_p += gsl_sf_lngamma (sum_alpha);
+
+ for (i = 0; i < K; i++)
+ {
+ log_p -= gsl_sf_lngamma (alpha[i]);
+ }
+
+ return log_p;
+}
diff --git a/gsl-1.9/randist/discrete.c b/gsl-1.9/randist/discrete.c
new file mode 100644
index 0000000..94f69ee
--- /dev/null
+++ b/gsl-1.9/randist/discrete.c
@@ -0,0 +1,398 @@
+/* randist/discrete.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/*
+ Random Discrete Events
+
+ Given K discrete events with different probabilities P[k]
+ produce a value k consistent with its probability.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details. You should have received
+ a copy of the GNU General Public License along with this program;
+ if not, write to the Free Foundation, Inc., 59 Temple Place, Suite
+ 330, Boston, MA 02111-1307 USA
+*/
+
+/*
+ * Based on: Alastair J Walker, An efficient method for generating
+ * discrete random variables with general distributions, ACM Trans
+ * Math Soft 3, 253-256 (1977). See also: D. E. Knuth, The Art of
+ * Computer Programming, Volume 2 (Seminumerical algorithms), 3rd
+ * edition, Addison-Wesley (1997), p120.
+
+ * Walker's algorithm does some preprocessing, and provides two
+ * arrays: floating point F[k] and integer A[k]. A value k is chosen
+ * from 0..K-1 with equal likelihood, and then a uniform random number
+ * u is compared to F[k]. If it is less than F[k], then k is
+ * returned. Otherwise, A[k] is returned.
+
+ * Walker's original paper describes an O(K^2) algorithm for setting
+ * up the F and A arrays. I found this disturbing since I wanted to
+ * use very large values of K. I'm sure I'm not the first to realize
+ * this, but in fact the preprocessing can be done in O(K) steps.
+
+ * A figure of merit for the preprocessing is the average value for
+ * the F[k]'s (that is, SUM_k F[k]/K); this corresponds to the
+ * probability that k is returned, instead of A[k], thereby saving a
+ * redirection. Walker's O(K^2) preprocessing will generally improve
+ * that figure of merit, compared to my cheaper O(K) method; from some
+ * experiments with a perl script, I get values of around 0.6 for my
+ * method and just under 0.75 for Walker's. Knuth has pointed out
+ * that finding _the_ optimum lookup tables, which maximize the
+ * average F[k], is a combinatorially difficult problem. But any
+ * valid preprocessing will still provide O(1) time for the call to
+ * gsl_ran_discrete(). I find that if I artificially set F[k]=1 --
+ * ie, better than optimum! -- I get a speedup of maybe 20%, so that's
+ * the maximum I could expect from the most expensive preprocessing.
+ * Folding in the difference of 0.6 vs 0.75, I'd estimate that the
+ * speedup would be less than 10%.
+
+ * I've not implemented it here, but one compromise is to sort the
+ * probabilities once, and then work from the two ends inward. This
+ * requires O(K log K), still lots cheaper than O(K^2), and from my
+ * experiments with the perl script, the figure of merit is within
+ * about 0.01 for K up to 1000, and no sign of diverging (in fact,
+ * they seemed to be converging, but it's hard to say with just a
+ * handful of runs).
+
+ * The O(K) algorithm goes through all the p_k's and decides if they
+ * are "smalls" or "bigs" according to whether they are less than or
+ * greater than the mean value 1/K. The indices to the smalls and the
+ * bigs are put in separate stacks, and then we work through the
+ * stacks together. For each small, we pair it up with the next big
+ * in the stack (Walker always wanted to pair up the smallest small
+ * with the biggest big). The small "borrows" from the big just
+ * enough to bring the small up to mean. This reduces the size of the
+ * big, so the (smaller) big is compared again to the mean, and if it
+ * is smaller, it gets "popped" from the big stack and "pushed" to the
+ * small stack. Otherwise, it stays put. Since every time we pop a
+ * small, we are able to deal with it right then and there, and we
+ * never have to pop more than K smalls, then the algorithm is O(K).
+
+ * This implementation sets up two separate stacks, and allocates K
+ * elements between them. Since neither stack ever grows, we do an
+ * extra O(K) pass through the data to determine how many smalls and
+ * bigs there are to begin with and allocate appropriately. In all
+ * there are 2*K*sizeof(double) transient bytes of memory that are
+ * used than returned, and K*(sizeof(int)+sizeof(double)) bytes used
+ * in the lookup table.
+
+ * Walker spoke of using two random numbers (an integer 0..K-1, and a
+ * floating point u in [0,1]), but Knuth points out that one can just
+ * use the integer and fractional parts of K*u where u is in [0,1].
+ * In fact, Knuth further notes that taking F'[k]=(k+F[k])/K, one can
+ * directly compare u to F'[k] without having to explicitly set
+ * u=K*u-int(K*u).
+
+ * Usage:
+
+ * Starting with an array of probabilities P, initialize and do
+ * preprocessing with a call to:
+
+ * gsl_rng *r;
+ * gsl_ran_discrete_t *f;
+ * f = gsl_ran_discrete_preproc(K,P);
+
+ * Then, whenever a random index 0..K-1 is desired, use
+
+ * k = gsl_ran_discrete(r,f);
+
+ * Note that several different randevent struct's can be
+ * simultaneously active.
+
+ * Aside: A very clever alternative approach is described in
+ * Abramowitz and Stegun, p 950, citing: Marsaglia, Random variables
+ * and computers, Proc Third Prague Conference in Probability Theory,
+ * 1962. A more accesible reference is: G. Marsaglia, Generating
+ * discrete random numbers in a computer, Comm ACM 6, 37-38 (1963).
+ * If anybody is interested, I (jt) have also coded up this version as
+ * part of another software package. However, I've done some
+ * comparisons, and the Walker method is both faster and more stingy
+ * with memory. So, in the end I decided not to include it with the
+ * GSL package.
+
+ * Written 26 Jan 1999, James Theiler, jt@lanl.gov
+ * Adapted to GSL, 30 Jan 1999, jt
+
+ */
+
+#include <config.h>
+#include <stdio.h> /* used for NULL, also fprintf(stderr,...) */
+#include <stdlib.h> /* used for malloc's */
+#include <math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+#define DEBUG 0
+#define KNUTH_CONVENTION 1 /* Saves a few steps of arithmetic
+ * in the call to gsl_ran_discrete()
+ */
+
+/*** Begin Stack (this code is used just in this file) ***/
+
+/* Stack code converted to use unsigned indices (i.e. s->i == 0 now
+ means an empty stack, instead of -1), for consistency and to give a
+ bigger allowable range. BJG */
+
+typedef struct {
+ size_t N; /* max number of elts on stack */
+ size_t *v; /* array of values on the stack */
+ size_t i; /* index of top of stack */
+} gsl_stack_t;
+
+static gsl_stack_t *
+new_stack(size_t N) {
+ gsl_stack_t *s;
+ s = (gsl_stack_t *)malloc(sizeof(gsl_stack_t));
+ s->N = N;
+ s->i = 0; /* indicates stack is empty */
+ s->v = (size_t *)malloc(sizeof(size_t)*N);
+ return s;
+}
+
+static void
+push_stack(gsl_stack_t *s, size_t v)
+{
+ if ((s->i) >= (s->N)) {
+ fprintf(stderr,"Cannot push stack!\n");
+ abort(); /* FIXME: fatal!! */
+ }
+ (s->v)[s->i] = v;
+ s->i += 1;
+}
+
+static size_t pop_stack(gsl_stack_t *s)
+{
+ if ((s->i) == 0) {
+ fprintf(stderr,"Cannot pop stack!\n");
+ abort(); /* FIXME: fatal!! */
+ }
+ s->i -= 1;
+ return ((s->v)[s->i]);
+}
+
+static inline size_t size_stack(const gsl_stack_t *s)
+{
+ return s->i;
+}
+
+static void free_stack(gsl_stack_t *s)
+{
+ free((char *)(s->v));
+ free((char *)s);
+}
+
+/*** End Stack ***/
+
+
+/*** Begin Walker's Algorithm ***/
+
+gsl_ran_discrete_t *
+gsl_ran_discrete_preproc(size_t Kevents, const double *ProbArray)
+{
+ size_t k,b,s;
+ gsl_ran_discrete_t *g;
+ size_t nBigs, nSmalls;
+ gsl_stack_t *Bigs;
+ gsl_stack_t *Smalls;
+ double *E;
+ double pTotal = 0.0, mean, d;
+
+ if (Kevents < 1) {
+ /* Could probably treat Kevents=1 as a special case */
+
+ GSL_ERROR_VAL ("number of events must be a positive integer",
+ GSL_EINVAL, 0);
+ }
+
+ /* Make sure elements of ProbArray[] are positive.
+ * Won't enforce that sum is unity; instead will just normalize
+ */
+
+ for (k=0; k<Kevents; ++k) {
+ if (ProbArray[k] < 0) {
+ GSL_ERROR_VAL ("probabilities must be non-negative",
+ GSL_EINVAL, 0) ;
+ }
+ pTotal += ProbArray[k];
+ }
+
+ /* Begin setting up the main "object" (just a struct, no steroids) */
+ g = (gsl_ran_discrete_t *)malloc(sizeof(gsl_ran_discrete_t));
+ g->K = Kevents;
+ g->F = (double *)malloc(sizeof(double)*Kevents);
+ g->A = (size_t *)malloc(sizeof(size_t)*Kevents);
+
+ E = (double *)malloc(sizeof(double)*Kevents);
+
+ if (E==NULL) {
+ GSL_ERROR_VAL ("Cannot allocate memory for randevent", GSL_ENOMEM, 0);
+ }
+
+ for (k=0; k<Kevents; ++k) {
+ E[k] = ProbArray[k]/pTotal;
+ }
+
+ /* Now create the Bigs and the Smalls */
+ mean = 1.0/Kevents;
+ nSmalls=nBigs=0;
+ for (k=0; k<Kevents; ++k) {
+ if (E[k] < mean) ++nSmalls;
+ else ++nBigs;
+ }
+ Bigs = new_stack(nBigs);
+ Smalls = new_stack(nSmalls);
+ for (k=0; k<Kevents; ++k) {
+ if (E[k] < mean) {
+ push_stack(Smalls,k);
+ }
+ else {
+ push_stack(Bigs,k);
+ }
+ }
+ /* Now work through the smalls */
+ while (size_stack(Smalls) > 0) {
+ s = pop_stack(Smalls);
+ if (size_stack(Bigs) == 0) {
+ (g->A)[s]=s;
+ (g->F)[s]=1.0;
+ continue;
+ }
+ b = pop_stack(Bigs);
+ (g->A)[s]=b;
+ (g->F)[s]=Kevents*E[s];
+#if DEBUG
+ fprintf(stderr,"s=%2d, A=%2d, F=%.4f\n",s,(g->A)[s],(g->F)[s]);
+#endif
+ d = mean - E[s];
+ E[s] += d; /* now E[s] == mean */
+ E[b] -= d;
+ if (E[b] < mean) {
+ push_stack(Smalls,b); /* no longer big, join ranks of the small */
+ }
+ else if (E[b] > mean) {
+ push_stack(Bigs,b); /* still big, put it back where you found it */
+ }
+ else {
+ /* E[b]==mean implies it is finished too */
+ (g->A)[b]=b;
+ (g->F)[b]=1.0;
+ }
+ }
+ while (size_stack(Bigs) > 0) {
+ b = pop_stack(Bigs);
+ (g->A)[b]=b;
+ (g->F)[b]=1.0;
+ }
+ /* Stacks have been emptied, and A and F have been filled */
+
+ if ( size_stack(Smalls) != 0) {
+ GSL_ERROR_VAL ("Smalls stack has not been emptied",
+ GSL_ESANITY, 0 );
+ }
+
+#if 0
+ /* if 1, then artificially set all F[k]'s to unity. This will
+ * give wrong answers, but you'll get them faster. But, not
+ * that much faster (I get maybe 20%); that's an upper bound
+ * on what the optimal preprocessing would give.
+ */
+ for (k=0; k<Kevents; ++k) {
+ (g->F)[k] = 1.0;
+ }
+#endif
+
+#if KNUTH_CONVENTION
+ /* For convenience, set F'[k]=(k+F[k])/K */
+ /* This saves some arithmetic in gsl_ran_discrete(); I find that
+ * it doesn't actually make much difference.
+ */
+ for (k=0; k<Kevents; ++k) {
+ (g->F)[k] += k;
+ (g->F)[k] /= Kevents;
+ }
+#endif
+
+ free_stack(Bigs);
+ free_stack(Smalls);
+ free((char *)E);
+
+ return g;
+}
+
+size_t
+gsl_ran_discrete(const gsl_rng *r, const gsl_ran_discrete_t *g)
+{
+ size_t c=0;
+ double u,f;
+ u = gsl_rng_uniform(r);
+#if KNUTH_CONVENTION
+ c = (u*(g->K));
+#else
+ u *= g->K;
+ c = u;
+ u -= c;
+#endif
+ f = (g->F)[c];
+ /* fprintf(stderr,"c,f,u: %d %.4f %f\n",c,f,u); */
+ if (f == 1.0) return c;
+
+ if (u < f) {
+ return c;
+ }
+ else {
+ return (g->A)[c];
+ }
+}
+
+void gsl_ran_discrete_free(gsl_ran_discrete_t *g)
+{
+ free((char *)(g->A));
+ free((char *)(g->F));
+ free((char *)g);
+}
+
+double
+gsl_ran_discrete_pdf(size_t k, const gsl_ran_discrete_t *g)
+{
+ size_t i,K;
+ double f,p=0;
+ K= g->K;
+ if (k>K) return 0;
+ for (i=0; i<K; ++i) {
+ f = (g->F)[i];
+#if KNUTH_CONVENTION
+ f = K*f-i;
+#endif
+ if (i==k) {
+ p += f;
+ } else if (k == (g->A)[i]) {
+ p += 1.0 - f;
+ }
+ }
+ return p/K;
+}
diff --git a/gsl-1.9/randist/erlang.c b/gsl-1.9/randist/erlang.c
new file mode 100644
index 0000000..a990403
--- /dev/null
+++ b/gsl-1.9/randist/erlang.c
@@ -0,0 +1,54 @@
+/* randist/erlang.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_sf_gamma.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+
+/* The sum of N samples from an exponential distribution gives an
+ Erlang distribution
+
+ p(x) dx = x^(n-1) exp (-x/a) / ((n-1)!a^n) dx
+
+ for x = 0 ... +infty */
+
+double
+gsl_ran_erlang (const gsl_rng * r, const double a, const double n)
+{
+ return gsl_ran_gamma (r, n, a);
+}
+
+double
+gsl_ran_erlang_pdf (const double x, const double a, const double n)
+{
+ if (x <= 0)
+ {
+ return 0 ;
+ }
+ else
+ {
+ double p;
+ double lngamma = gsl_sf_lngamma (n);
+
+ p = exp ((n - 1) * log (x/a) - x/a - lngamma) / a;
+ return p;
+ }
+}
diff --git a/gsl-1.9/randist/exponential.c b/gsl-1.9/randist/exponential.c
new file mode 100644
index 0000000..dcc74be
--- /dev/null
+++ b/gsl-1.9/randist/exponential.c
@@ -0,0 +1,52 @@
+/* randist/exponential.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+
+/* The exponential distribution has the form
+
+ p(x) dx = exp(-x/mu) dx/mu
+
+ for x = 0 ... +infty */
+
+double
+gsl_ran_exponential (const gsl_rng * r, const double mu)
+{
+ double u = gsl_rng_uniform_pos (r);
+
+ return -mu * log (u);
+}
+
+double
+gsl_ran_exponential_pdf (const double x, const double mu)
+{
+ if (x < 0)
+ {
+ return 0 ;
+ }
+ else
+ {
+ double p = exp (-x/mu)/mu;
+
+ return p;
+ }
+}
diff --git a/gsl-1.9/randist/exppow.c b/gsl-1.9/randist/exppow.c
new file mode 100644
index 0000000..c307e4c
--- /dev/null
+++ b/gsl-1.9/randist/exppow.c
@@ -0,0 +1,122 @@
+/* randist/exppow.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2006 James Theiler, Brian Gough
+ * Copyright (C) 2006 Giulio Bottazzi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_sf_gamma.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+
+/* The exponential power probability distribution is
+
+ p(x) dx = (1/(2 a Gamma(1+1/b))) * exp(-|x/a|^b) dx
+
+ for -infty < x < infty. For b = 1 it reduces to the Laplace
+ distribution.
+
+ The exponential power distribution is related to the gamma
+ distribution by E = a * pow(G(1/b),1/b), where E is an exponential
+ power variate and G is a gamma variate.
+
+ We use this relation for b < 1. For b >=1 we use rejection methods
+ based on the laplace and gaussian distributions which should be
+ faster. For b>4 we revert to the gamma method.
+
+ See P. R. Tadikamalla, "Random Sampling from the Exponential Power
+ Distribution", Journal of the American Statistical Association,
+ September 1980, Volume 75, Number 371, pages 683-686.
+
+*/
+
+double
+gsl_ran_exppow (const gsl_rng * r, const double a, const double b)
+{
+ if (b < 1 || b > 4)
+ {
+ double u = gsl_rng_uniform (r);
+ double v = gsl_ran_gamma (r, 1 / b, 1.0);
+ double z = a * pow (v, 1 / b);
+
+ if (u > 0.5)
+ {
+ return z;
+ }
+ else
+ {
+ return -z;
+ }
+ }
+ else if (b == 1)
+ {
+ /* Laplace distribution */
+ return gsl_ran_laplace (r, a);
+ }
+ else if (b < 2)
+ {
+ /* Use laplace distribution for rejection method, from Tadikamalla */
+
+ double x, h, u;
+
+ double B = pow (1 / b, 1 / b);
+
+ do
+ {
+ x = gsl_ran_laplace (r, B);
+ u = gsl_rng_uniform_pos (r);
+ h = -pow (fabs (x), b) + fabs (x) / B - 1 + (1 / b);
+ }
+ while (log (u) > h);
+
+ return a * x;
+ }
+ else if (b == 2)
+ {
+ /* Gaussian distribution */
+ return gsl_ran_gaussian (r, a / sqrt (2.0));
+ }
+ else
+ {
+ /* Use gaussian for rejection method, from Tadikamalla */
+
+ double x, h, u;
+
+ double B = pow (1 / b, 1 / b);
+
+ do
+ {
+ x = gsl_ran_gaussian (r, B);
+ u = gsl_rng_uniform_pos (r);
+ h = -pow (fabs (x), b) + (x * x) / (2 * B * B) + (1 / b) - 0.5;
+ }
+ while (log (u) > h);
+
+ return a * x;
+ }
+}
+
+double
+gsl_ran_exppow_pdf (const double x, const double a, const double b)
+{
+ double p;
+ double lngamma = gsl_sf_lngamma (1 + 1 / b);
+ p = (1 / (2 * a)) * exp (-pow (fabs (x / a), b) - lngamma);
+ return p;
+}
diff --git a/gsl-1.9/randist/fdist.c b/gsl-1.9/randist/fdist.c
new file mode 100644
index 0000000..b23e004
--- /dev/null
+++ b/gsl-1.9/randist/fdist.c
@@ -0,0 +1,67 @@
+/* randist/fdist.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_sf_gamma.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+
+/* The F distribution has the form
+
+ p(x) dx = (nu1^(nu1/2) nu2^(nu2/2) Gamma((nu1 + nu2)/2) /
+ Gamma(nu1/2) Gamma(nu2/2)) *
+ x^(nu1/2 - 1) (nu2 + nu1 * x)^(-nu1/2 -nu2/2) dx
+
+ The method used here is the one described in Knuth */
+
+double
+gsl_ran_fdist (const gsl_rng * r, const double nu1, const double nu2)
+{
+
+ double Y1 = gsl_ran_gamma (r, nu1 / 2, 2.0);
+ double Y2 = gsl_ran_gamma (r, nu2 / 2, 2.0);
+
+ double f = (Y1 * nu2) / (Y2 * nu1);
+
+ return f;
+}
+
+double
+gsl_ran_fdist_pdf (const double x, const double nu1, const double nu2)
+{
+ if (x < 0)
+ {
+ return 0 ;
+ }
+ else
+ {
+ double p;
+ double lglg = (nu1 / 2) * log (nu1) + (nu2 / 2) * log (nu2) ;
+
+ double lg12 = gsl_sf_lngamma ((nu1 + nu2) / 2);
+ double lg1 = gsl_sf_lngamma (nu1 / 2);
+ double lg2 = gsl_sf_lngamma (nu2 / 2);
+
+ p = exp (lglg + lg12 - lg1 - lg2)
+ * pow (x, nu1 / 2 - 1) * pow (nu2 + nu1 * x, -nu1 / 2 - nu2 / 2);
+
+ return p;
+ }
+}
diff --git a/gsl-1.9/randist/flat.c b/gsl-1.9/randist/flat.c
new file mode 100644
index 0000000..6bae5a4
--- /dev/null
+++ b/gsl-1.9/randist/flat.c
@@ -0,0 +1,53 @@
+/* randist/flat.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+
+/* This is the uniform distribution in the range [a, b)
+
+ p(x) dx = 1/(b-a) dx if a <= x < b
+ ..... = 0 otherwise
+
+ */
+
+double
+gsl_ran_flat (const gsl_rng * r, const double a, const double b)
+{
+ double u = gsl_rng_uniform (r);
+
+ /* A uniform distribution over [a,b] */
+
+ return a * (1 - u) + b * u;
+}
+
+double
+gsl_ran_flat_pdf (double x, const double a, const double b)
+{
+ if (x < b && x >= a)
+ {
+ return 1 / (b - a);
+ }
+ else
+ {
+ return 0;
+ }
+}
diff --git a/gsl-1.9/randist/gamma.c b/gsl-1.9/randist/gamma.c
new file mode 100644
index 0000000..37d167c
--- /dev/null
+++ b/gsl-1.9/randist/gamma.c
@@ -0,0 +1,220 @@
+/* randist/gamma.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_sf_gamma.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+
+static double gamma_large (const gsl_rng * r, const double a);
+static double gamma_frac (const gsl_rng * r, const double a);
+
+/* The Gamma distribution of order a>0 is defined by:
+
+ p(x) dx = {1 / \Gamma(a) b^a } x^{a-1} e^{-x/b} dx
+
+ for x>0. If X and Y are independent gamma-distributed random
+ variables of order a1 and a2 with the same scale parameter b, then
+ X+Y has gamma distribution of order a1+a2.
+
+ The algorithms below are from Knuth, vol 2, 2nd ed, p. 129. */
+
+double
+gsl_ran_gamma_knuth (const gsl_rng * r, const double a, const double b)
+{
+ /* assume a > 0 */
+ unsigned int na = floor (a);
+
+ if (a == na)
+ {
+ return b * gsl_ran_gamma_int (r, na);
+ }
+ else if (na == 0)
+ {
+ return b * gamma_frac (r, a);
+ }
+ else
+ {
+ return b * (gsl_ran_gamma_int (r, na) + gamma_frac (r, a - na)) ;
+ }
+}
+
+double
+gsl_ran_gamma_int (const gsl_rng * r, const unsigned int a)
+{
+ if (a < 12)
+ {
+ unsigned int i;
+ double prod = 1;
+
+ for (i = 0; i < a; i++)
+ {
+ prod *= gsl_rng_uniform_pos (r);
+ }
+
+ /* Note: for 12 iterations we are safe against underflow, since
+ the smallest positive random number is O(2^-32). This means
+ the smallest possible product is 2^(-12*32) = 10^-116 which
+ is within the range of double precision. */
+
+ return -log (prod);
+ }
+ else
+ {
+ return gamma_large (r, (double) a);
+ }
+}
+
+static double
+gamma_large (const gsl_rng * r, const double a)
+{
+ /* Works only if a > 1, and is most efficient if a is large
+
+ This algorithm, reported in Knuth, is attributed to Ahrens. A
+ faster one, we are told, can be found in: J. H. Ahrens and
+ U. Dieter, Computing 12 (1974) 223-246. */
+
+ double sqa, x, y, v;
+ sqa = sqrt (2 * a - 1);
+ do
+ {
+ do
+ {
+ y = tan (M_PI * gsl_rng_uniform (r));
+ x = sqa * y + a - 1;
+ }
+ while (x <= 0);
+ v = gsl_rng_uniform (r);
+ }
+ while (v > (1 + y * y) * exp ((a - 1) * log (x / (a - 1)) - sqa * y));
+
+ return x;
+}
+
+static double
+gamma_frac (const gsl_rng * r, const double a)
+{
+ /* This is exercise 16 from Knuth; see page 135, and the solution is
+ on page 551. */
+
+ double p, q, x, u, v;
+ p = M_E / (a + M_E);
+ do
+ {
+ u = gsl_rng_uniform (r);
+ v = gsl_rng_uniform_pos (r);
+
+ if (u < p)
+ {
+ x = exp ((1 / a) * log (v));
+ q = exp (-x);
+ }
+ else
+ {
+ x = 1 - log (v);
+ q = exp ((a - 1) * log (x));
+ }
+ }
+ while (gsl_rng_uniform (r) >= q);
+
+ return x;
+}
+
+double
+gsl_ran_gamma_pdf (const double x, const double a, const double b)
+{
+ if (x < 0)
+ {
+ return 0 ;
+ }
+ else if (x == 0)
+ {
+ if (a == 1)
+ return 1/b ;
+ else
+ return 0 ;
+ }
+ else if (a == 1)
+ {
+ return exp(-x/b)/b ;
+ }
+ else
+ {
+ double p;
+ double lngamma = gsl_sf_lngamma (a);
+ p = exp ((a - 1) * log (x/b) - x/b - lngamma)/b;
+ return p;
+ }
+}
+
+
+/* New version based on Marsaglia and Tsang, "A Simple Method for
+ * generating gamma variables", ACM Transactions on Mathematical
+ * Software, Vol 26, No 3 (2000), p363-372.
+ *
+ * Implemented by J.D.Lamb@btinternet.com, minor modifications for GSL
+ * by Brian Gough
+ */
+
+double
+gsl_ran_gamma_mt (const gsl_rng * r, const double a, const double b)
+{
+ return gsl_ran_gamma (r, a, b);
+}
+
+double
+gsl_ran_gamma (const gsl_rng * r, const double a, const double b)
+{
+ /* assume a > 0 */
+
+ if (a < 1)
+ {
+ double u = gsl_rng_uniform_pos (r);
+ return gsl_ran_gamma (r, 1.0 + a, b) * pow (u, 1.0 / a);
+ }
+
+ {
+ double x, v, u;
+ double d = a - 1.0 / 3.0;
+ double c = (1.0 / 3.0) / sqrt (d);
+
+ while (1)
+ {
+ do
+ {
+ x = gsl_ran_gaussian_ziggurat (r, 1.0);
+ v = 1.0 + c * x;
+ }
+ while (v <= 0);
+
+ v = v * v * v;
+ u = gsl_rng_uniform_pos (r);
+
+ if (u < 1 - 0.0331 * x * x * x * x)
+ break;
+
+ if (log (u) < 0.5 * x * x + d * (1 - v + log (v)))
+ break;
+ }
+
+ return b * d * v;
+ }
+}
diff --git a/gsl-1.9/randist/gauss.c b/gsl-1.9/randist/gauss.c
new file mode 100644
index 0000000..2ceb804
--- /dev/null
+++ b/gsl-1.9/randist/gauss.c
@@ -0,0 +1,143 @@
+/* randist/gauss.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2006 James Theiler, Brian Gough
+ * Copyright (C) 2006 Charles Karney
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+
+/* Of the two methods provided below, I think the Polar method is more
+ * efficient, but only when you are actually producing two random
+ * deviates. We don't produce two, because then we'd have to save one
+ * in a static variable for the next call, and that would screws up
+ * re-entrant or threaded code, so we only produce one. This makes
+ * the Ratio method suddenly more appealing.
+ *
+ * [Added by Charles Karney] We use Leva's implementation of the Ratio
+ * method which avoids calling log() nearly all the time and makes the
+ * Ratio method faster than the Polar method (when it produces just one
+ * result per call). Timing per call (gcc -O2 on 866MHz Pentium,
+ * average over 10^8 calls)
+ *
+ * Polar method: 660 ns
+ * Ratio method: 368 ns
+ *
+ */
+
+/* Polar (Box-Mueller) method; See Knuth v2, 3rd ed, p122 */
+
+double
+gsl_ran_gaussian (const gsl_rng * r, const double sigma)
+{
+ double x, y, r2;
+
+ do
+ {
+ /* choose x,y in uniform square (-1,-1) to (+1,+1) */
+ x = -1 + 2 * gsl_rng_uniform_pos (r);
+ y = -1 + 2 * gsl_rng_uniform_pos (r);
+
+ /* see if it is in the unit circle */
+ r2 = x * x + y * y;
+ }
+ while (r2 > 1.0 || r2 == 0);
+
+ /* Box-Muller transform */
+ return sigma * y * sqrt (-2.0 * log (r2) / r2);
+}
+
+/* Ratio method (Kinderman-Monahan); see Knuth v2, 3rd ed, p130.
+ * K+M, ACM Trans Math Software 3 (1977) 257-260.
+ *
+ * [Added by Charles Karney] This is an implementation of Leva's
+ * modifications to the original K+M method; see:
+ * J. L. Leva, ACM Trans Math Software 18 (1992) 449-453 and 454-455. */
+
+double
+gsl_ran_gaussian_ratio_method (const gsl_rng * r, const double sigma)
+{
+ double u, v, x, y, Q;
+ const double s = 0.449871; /* Constants from Leva */
+ const double t = -0.386595;
+ const double a = 0.19600;
+ const double b = 0.25472;
+ const double r1 = 0.27597;
+ const double r2 = 0.27846;
+
+ do /* This loop is executed 1.369 times on average */
+ {
+ /* Generate a point P = (u, v) uniform in a rectangle enclosing
+ the K+M region v^2 <= - 4 u^2 log(u). */
+
+ /* u in (0, 1] to avoid singularity at u = 0 */
+ u = 1 - gsl_rng_uniform (r);
+
+ /* v is in the asymmetric interval [-0.5, 0.5). However v = -0.5
+ is rejected in the last part of the while clause. The
+ resulting normal deviate is strictly symmetric about 0
+ (provided that v is symmetric once v = -0.5 is excluded). */
+ v = gsl_rng_uniform (r) - 0.5;
+
+ /* Constant 1.7156 > sqrt(8/e) (for accuracy); but not by too
+ much (for efficiency). */
+ v *= 1.7156;
+
+ /* Compute Leva's quadratic form Q */
+ x = u - s;
+ y = fabs (v) - t;
+ Q = x * x + y * (a * y - b * x);
+
+ /* Accept P if Q < r1 (Leva) */
+ /* Reject P if Q > r2 (Leva) */
+ /* Accept if v^2 <= -4 u^2 log(u) (K+M) */
+ /* This final test is executed 0.012 times on average. */
+ }
+ while (Q >= r1 && (Q > r2 || v * v > -4 * u * u * log (u)));
+
+ return sigma * (v / u); /* Return slope */
+}
+
+double
+gsl_ran_gaussian_pdf (const double x, const double sigma)
+{
+ double u = x / fabs (sigma);
+ double p = (1 / (sqrt (2 * M_PI) * fabs (sigma))) * exp (-u * u / 2);
+ return p;
+}
+
+double
+gsl_ran_ugaussian (const gsl_rng * r)
+{
+ return gsl_ran_gaussian (r, 1.0);
+}
+
+double
+gsl_ran_ugaussian_ratio_method (const gsl_rng * r)
+{
+ return gsl_ran_gaussian_ratio_method (r, 1.0);
+}
+
+double
+gsl_ran_ugaussian_pdf (const double x)
+{
+ return gsl_ran_gaussian_pdf (x, 1.0);
+}
+
diff --git a/gsl-1.9/randist/gausstail.c b/gsl-1.9/randist/gausstail.c
new file mode 100644
index 0000000..a5b4727
--- /dev/null
+++ b/gsl-1.9/randist/gausstail.c
@@ -0,0 +1,107 @@
+/* randist/gausstail.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+#include <gsl/gsl_sf_erf.h>
+
+double
+gsl_ran_gaussian_tail (const gsl_rng * r, const double a, const double sigma)
+{
+ /* Returns a gaussian random variable larger than a
+ * This implementation does one-sided upper-tailed deviates.
+ */
+
+ double s = a / sigma;
+
+ if (s < 1)
+ {
+ /* For small s, use a direct rejection method. The limit s < 1
+ can be adjusted to optimise the overall efficiency */
+
+ double x;
+
+ do
+ {
+ x = gsl_ran_gaussian (r, 1.0);
+ }
+ while (x < s);
+ return x * sigma;
+ }
+ else
+ {
+ /* Use the "supertail" deviates from the last two steps
+ * of Marsaglia's rectangle-wedge-tail method, as described
+ * in Knuth, v2, 3rd ed, pp 123-128. (See also exercise 11, p139,
+ * and the solution, p586.)
+ */
+
+ double u, v, x;
+
+ do
+ {
+ u = gsl_rng_uniform (r);
+ do
+ {
+ v = gsl_rng_uniform (r);
+ }
+ while (v == 0.0);
+ x = sqrt (s * s - 2 * log (v));
+ }
+ while (x * u > s);
+ return x * sigma;
+ }
+}
+
+double
+gsl_ran_gaussian_tail_pdf (const double x, const double a, const double sigma)
+{
+ if (x < a)
+ {
+ return 0;
+ }
+ else
+ {
+ double N, p;
+ double u = x / sigma ;
+
+ double f = gsl_sf_erfc (a / (sqrt (2.0) * sigma));
+
+ N = 0.5 * f;
+
+ p = (1 / (N * sqrt (2 * M_PI) * sigma)) * exp (-u * u / 2);
+
+ return p;
+ }
+}
+
+double
+gsl_ran_ugaussian_tail (const gsl_rng * r, const double a)
+{
+ return gsl_ran_gaussian_tail (r, a, 1.0) ;
+}
+
+double
+gsl_ran_ugaussian_tail_pdf (const double x, const double a)
+{
+ return gsl_ran_gaussian_tail_pdf (x, a, 1.0) ;
+}
diff --git a/gsl-1.9/randist/gausszig.c b/gsl-1.9/randist/gausszig.c
new file mode 100644
index 0000000..df335d5
--- /dev/null
+++ b/gsl-1.9/randist/gausszig.c
@@ -0,0 +1,207 @@
+/* gauss.c - gaussian random numbers, using the Ziggurat method
+ *
+ * Copyright (C) 2005 Jochen Voss.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/*
+ * This routine is based on the following article, with a couple of
+ * modifications which simplify the implementation.
+ *
+ * George Marsaglia, Wai Wan Tsang
+ * The Ziggurat Method for Generating Random Variables
+ * Journal of Statistical Software, vol. 5 (2000), no. 8
+ * http://www.jstatsoft.org/v05/i08/
+ *
+ * The modifications are:
+ *
+ * 1) use 128 steps instead of 256 to decrease the amount of static
+ * data necessary.
+ *
+ * 2) use an acceptance sampling from an exponential wedge
+ * exp(-R*(x-R/2)) for the tail of the base strip to simplify the
+ * implementation. The area of exponential wedge is used in
+ * calculating 'v' and the coefficients in ziggurat table, so the
+ * coefficients differ slightly from those in the Marsaglia and Tsang
+ * paper.
+ *
+ * See also Leong et al, "A Comment on the Implementation of the
+ * Ziggurat Method", Journal of Statistical Software, vol 5 (2005), no 7.
+ *
+ */
+
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+
+/* position of right-most step */
+#define PARAM_R 3.44428647676
+
+/* tabulated values for the heigt of the Ziggurat levels */
+static const double ytab[128] = {
+ 1, 0.963598623011, 0.936280813353, 0.913041104253,
+ 0.892278506696, 0.873239356919, 0.855496407634, 0.838778928349,
+ 0.822902083699, 0.807732738234, 0.793171045519, 0.779139726505,
+ 0.765577436082, 0.752434456248, 0.739669787677, 0.727249120285,
+ 0.715143377413, 0.703327646455, 0.691780377035, 0.68048276891,
+ 0.669418297233, 0.65857233912, 0.647931876189, 0.637485254896,
+ 0.62722199145, 0.617132611532, 0.607208517467, 0.597441877296,
+ 0.587825531465, 0.578352913803, 0.569017984198, 0.559815170911,
+ 0.550739320877, 0.541785656682, 0.532949739145, 0.524227434628,
+ 0.515614886373, 0.507108489253, 0.498704867478, 0.490400854812,
+ 0.482193476986, 0.47407993601, 0.466057596125, 0.458123971214,
+ 0.450276713467, 0.442513603171, 0.434832539473, 0.427231532022,
+ 0.419708693379, 0.41226223212, 0.404890446548, 0.397591718955,
+ 0.390364510382, 0.383207355816, 0.376118859788, 0.369097692334,
+ 0.362142585282, 0.355252328834, 0.348425768415, 0.341661801776,
+ 0.334959376311, 0.328317486588, 0.321735172063, 0.31521151497,
+ 0.308745638367, 0.302336704338, 0.29598391232, 0.289686497571,
+ 0.283443729739, 0.27725491156, 0.271119377649, 0.265036493387,
+ 0.259005653912, 0.253026283183, 0.247097833139, 0.241219782932,
+ 0.235391638239, 0.229612930649, 0.223883217122, 0.218202079518,
+ 0.212569124201, 0.206983981709, 0.201446306496, 0.195955776745,
+ 0.190512094256, 0.185114984406, 0.179764196185, 0.174459502324,
+ 0.169200699492, 0.1639876086, 0.158820075195, 0.153697969964,
+ 0.148621189348, 0.143589656295, 0.138603321143, 0.133662162669,
+ 0.128766189309, 0.123915440582, 0.119109988745, 0.114349940703,
+ 0.10963544023, 0.104966670533, 0.100343857232, 0.0957672718266,
+ 0.0912372357329, 0.0867541250127, 0.082318375932, 0.0779304915295,
+ 0.0735910494266, 0.0693007111742, 0.065060233529, 0.0608704821745,
+ 0.056732448584, 0.05264727098, 0.0486162607163, 0.0446409359769,
+ 0.0407230655415, 0.0368647267386, 0.0330683839378, 0.0293369977411,
+ 0.0256741818288, 0.0220844372634, 0.0185735200577, 0.0151490552854,
+ 0.0118216532614, 0.00860719483079, 0.00553245272614, 0.00265435214565
+};
+
+/* tabulated values for 2^24 times x[i]/x[i+1],
+ * used to accept for U*x[i+1]<=x[i] without any floating point operations */
+static const unsigned long ktab[128] = {
+ 0, 12590644, 14272653, 14988939,
+ 15384584, 15635009, 15807561, 15933577,
+ 16029594, 16105155, 16166147, 16216399,
+ 16258508, 16294295, 16325078, 16351831,
+ 16375291, 16396026, 16414479, 16431002,
+ 16445880, 16459343, 16471578, 16482744,
+ 16492970, 16502368, 16511031, 16519039,
+ 16526459, 16533352, 16539769, 16545755,
+ 16551348, 16556584, 16561493, 16566101,
+ 16570433, 16574511, 16578353, 16581977,
+ 16585398, 16588629, 16591685, 16594575,
+ 16597311, 16599901, 16602354, 16604679,
+ 16606881, 16608968, 16610945, 16612818,
+ 16614592, 16616272, 16617861, 16619363,
+ 16620782, 16622121, 16623383, 16624570,
+ 16625685, 16626730, 16627708, 16628619,
+ 16629465, 16630248, 16630969, 16631628,
+ 16632228, 16632768, 16633248, 16633671,
+ 16634034, 16634340, 16634586, 16634774,
+ 16634903, 16634972, 16634980, 16634926,
+ 16634810, 16634628, 16634381, 16634066,
+ 16633680, 16633222, 16632688, 16632075,
+ 16631380, 16630598, 16629726, 16628757,
+ 16627686, 16626507, 16625212, 16623794,
+ 16622243, 16620548, 16618698, 16616679,
+ 16614476, 16612071, 16609444, 16606571,
+ 16603425, 16599973, 16596178, 16591995,
+ 16587369, 16582237, 16576520, 16570120,
+ 16562917, 16554758, 16545450, 16534739,
+ 16522287, 16507638, 16490152, 16468907,
+ 16442518, 16408804, 16364095, 16301683,
+ 16207738, 16047994, 15704248, 15472926
+};
+
+/* tabulated values of 2^{-24}*x[i] */
+static const double wtab[128] = {
+ 1.62318314817e-08, 2.16291505214e-08, 2.54246305087e-08, 2.84579525938e-08,
+ 3.10340022482e-08, 3.33011726243e-08, 3.53439060345e-08, 3.72152672658e-08,
+ 3.8950989572e-08, 4.05763964764e-08, 4.21101548915e-08, 4.35664624904e-08,
+ 4.49563968336e-08, 4.62887864029e-08, 4.75707945735e-08, 4.88083237257e-08,
+ 5.00063025384e-08, 5.11688950428e-08, 5.22996558616e-08, 5.34016475624e-08,
+ 5.44775307871e-08, 5.55296344581e-08, 5.65600111659e-08, 5.75704813695e-08,
+ 5.85626690412e-08, 5.95380306862e-08, 6.04978791776e-08, 6.14434034901e-08,
+ 6.23756851626e-08, 6.32957121259e-08, 6.42043903937e-08, 6.51025540077e-08,
+ 6.59909735447e-08, 6.68703634341e-08, 6.77413882848e-08, 6.8604668381e-08,
+ 6.94607844804e-08, 7.03102820203e-08, 7.11536748229e-08, 7.1991448372e-08,
+ 7.2824062723e-08, 7.36519550992e-08, 7.44755422158e-08, 7.52952223703e-08,
+ 7.61113773308e-08, 7.69243740467e-08, 7.77345662086e-08, 7.85422956743e-08,
+ 7.93478937793e-08, 8.01516825471e-08, 8.09539758128e-08, 8.17550802699e-08,
+ 8.25552964535e-08, 8.33549196661e-08, 8.41542408569e-08, 8.49535474601e-08,
+ 8.57531242006e-08, 8.65532538723e-08, 8.73542180955e-08, 8.8156298059e-08,
+ 8.89597752521e-08, 8.97649321908e-08, 9.05720531451e-08, 9.138142487e-08,
+ 9.21933373471e-08, 9.30080845407e-08, 9.38259651738e-08, 9.46472835298e-08,
+ 9.54723502847e-08, 9.63014833769e-08, 9.71350089201e-08, 9.79732621669e-08,
+ 9.88165885297e-08, 9.96653446693e-08, 1.00519899658e-07, 1.0138063623e-07,
+ 1.02247952126e-07, 1.03122261554e-07, 1.04003996769e-07, 1.04893609795e-07,
+ 1.05791574313e-07, 1.06698387725e-07, 1.07614573423e-07, 1.08540683296e-07,
+ 1.09477300508e-07, 1.1042504257e-07, 1.11384564771e-07, 1.12356564007e-07,
+ 1.13341783071e-07, 1.14341015475e-07, 1.15355110887e-07, 1.16384981291e-07,
+ 1.17431607977e-07, 1.18496049514e-07, 1.19579450872e-07, 1.20683053909e-07,
+ 1.21808209468e-07, 1.2295639141e-07, 1.24129212952e-07, 1.25328445797e-07,
+ 1.26556042658e-07, 1.27814163916e-07, 1.29105209375e-07, 1.30431856341e-07,
+ 1.31797105598e-07, 1.3320433736e-07, 1.34657379914e-07, 1.36160594606e-07,
+ 1.37718982103e-07, 1.39338316679e-07, 1.41025317971e-07, 1.42787873535e-07,
+ 1.44635331499e-07, 1.4657889173e-07, 1.48632138436e-07, 1.50811780719e-07,
+ 1.53138707402e-07, 1.55639532047e-07, 1.58348931426e-07, 1.61313325908e-07,
+ 1.64596952856e-07, 1.68292495203e-07, 1.72541128694e-07, 1.77574279496e-07,
+ 1.83813550477e-07, 1.92166040885e-07, 2.05295471952e-07, 2.22600839893e-07
+};
+
+
+double
+gsl_ran_gaussian_ziggurat (const gsl_rng * r, const double sigma)
+{
+ unsigned long int i, j;
+ int sign;
+ double x, y;
+
+ while (1)
+ {
+ i = gsl_rng_uniform_int (r, 256); /* choose the step */
+ j = gsl_rng_uniform_int (r, 16777216); /* sample from 2^24 */
+ sign = (i & 0x80) ? +1 : -1;
+ i &= 0x7f;
+
+ x = j * wtab[i];
+
+ if (j < ktab[i])
+ break;
+
+ if (i < 127)
+ {
+ double y0, y1, U1;
+ y0 = ytab[i];
+ y1 = ytab[i + 1];
+ U1 = gsl_rng_uniform (r);
+ y = y1 + (y0 - y1) * U1;
+ }
+ else
+ {
+ double U1, U2;
+ U1 = 1.0 - gsl_rng_uniform (r);
+ U2 = gsl_rng_uniform (r);
+ x = PARAM_R - log (U1) / PARAM_R;
+ y = exp (-PARAM_R * (x - 0.5 * PARAM_R)) * U2;
+ }
+
+ if (y < exp (-0.5 * x * x))
+ break;
+ }
+
+ return sign * sigma * x;
+}
diff --git a/gsl-1.9/randist/geometric.c b/gsl-1.9/randist/geometric.c
new file mode 100644
index 0000000..ce6c40d
--- /dev/null
+++ b/gsl-1.9/randist/geometric.c
@@ -0,0 +1,67 @@
+/* randist/geometric.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+
+/* Geometric distribution (bernoulli trial with probability p)
+
+ prob(k) = p (1 - p)^(k-1) for n = 1, 2, 3, ...
+
+ It gives the distribution of "waiting times" for an event that
+ occurs with probability p. */
+
+unsigned int
+gsl_ran_geometric (const gsl_rng * r, const double p)
+{
+ double u = gsl_rng_uniform_pos (r);
+
+ unsigned int k;
+
+ if (p == 1)
+ {
+ k = 1;
+ }
+ else
+ {
+ k = log (u) / log (1 - p) + 1;
+ }
+
+ return k;
+}
+
+double
+gsl_ran_geometric_pdf (const unsigned int k, const double p)
+{
+ if (k == 0)
+ {
+ return 0 ;
+ }
+ else if (k == 1)
+ {
+ return p ;
+ }
+ else
+ {
+ double P = p * pow (1 - p, k - 1.0);
+ return P;
+ }
+}
diff --git a/gsl-1.9/randist/gsl_randist.h b/gsl-1.9/randist/gsl_randist.h
new file mode 100644
index 0000000..49775bd
--- /dev/null
+++ b/gsl-1.9/randist/gsl_randist.h
@@ -0,0 +1,185 @@
+/* randist/gsl_randist.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_RANDIST_H__
+#define __GSL_RANDIST_H__
+#include <gsl/gsl_rng.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+unsigned int gsl_ran_bernoulli (const gsl_rng * r, double p);
+double gsl_ran_bernoulli_pdf (const unsigned int k, double p);
+
+double gsl_ran_beta (const gsl_rng * r, const double a, const double b);
+double gsl_ran_beta_pdf (const double x, const double a, const double b);
+
+unsigned int gsl_ran_binomial (const gsl_rng * r, double p, unsigned int n);
+unsigned int gsl_ran_binomial_knuth (const gsl_rng * r, double p, unsigned int n);
+unsigned int gsl_ran_binomial_tpe (const gsl_rng * r, double p, unsigned int n);
+double gsl_ran_binomial_pdf (const unsigned int k, const double p, const unsigned int n);
+
+double gsl_ran_exponential (const gsl_rng * r, const double mu);
+double gsl_ran_exponential_pdf (const double x, const double mu);
+
+double gsl_ran_exppow (const gsl_rng * r, const double a, const double b);
+double gsl_ran_exppow_pdf (const double x, const double a, const double b);
+
+double gsl_ran_cauchy (const gsl_rng * r, const double a);
+double gsl_ran_cauchy_pdf (const double x, const double a);
+
+double gsl_ran_chisq (const gsl_rng * r, const double nu);
+double gsl_ran_chisq_pdf (const double x, const double nu);
+
+void gsl_ran_dirichlet (const gsl_rng * r, const size_t K, const double alpha[], double theta[]);
+double gsl_ran_dirichlet_pdf (const size_t K, const double alpha[], const double theta[]);
+double gsl_ran_dirichlet_lnpdf (const size_t K, const double alpha[], const double theta[]);
+
+double gsl_ran_erlang (const gsl_rng * r, const double a, const double n);
+double gsl_ran_erlang_pdf (const double x, const double a, const double n);
+
+double gsl_ran_fdist (const gsl_rng * r, const double nu1, const double nu2);
+double gsl_ran_fdist_pdf (const double x, const double nu1, const double nu2);
+
+double gsl_ran_flat (const gsl_rng * r, const double a, const double b);
+double gsl_ran_flat_pdf (double x, const double a, const double b);
+
+double gsl_ran_gamma (const gsl_rng * r, const double a, const double b);
+double gsl_ran_gamma_int (const gsl_rng * r, const unsigned int a);
+double gsl_ran_gamma_pdf (const double x, const double a, const double b);
+double gsl_ran_gamma_mt (const gsl_rng * r, const double a, const double b);
+double gsl_ran_gamma_knuth (const gsl_rng * r, const double a, const double b);
+
+double gsl_ran_gaussian (const gsl_rng * r, const double sigma);
+double gsl_ran_gaussian_ratio_method (const gsl_rng * r, const double sigma);
+double gsl_ran_gaussian_ziggurat (const gsl_rng * r, const double sigma);
+double gsl_ran_gaussian_pdf (const double x, const double sigma);
+
+double gsl_ran_ugaussian (const gsl_rng * r);
+double gsl_ran_ugaussian_ratio_method (const gsl_rng * r);
+double gsl_ran_ugaussian_pdf (const double x);
+
+double gsl_ran_gaussian_tail (const gsl_rng * r, const double a, const double sigma);
+double gsl_ran_gaussian_tail_pdf (const double x, const double a, const double sigma);
+
+double gsl_ran_ugaussian_tail (const gsl_rng * r, const double a);
+double gsl_ran_ugaussian_tail_pdf (const double x, const double a);
+
+void gsl_ran_bivariate_gaussian (const gsl_rng * r, double sigma_x, double sigma_y, double rho, double *x, double *y);
+double gsl_ran_bivariate_gaussian_pdf (const double x, const double y, const double sigma_x, const double sigma_y, const double rho);
+
+double gsl_ran_landau (const gsl_rng * r);
+double gsl_ran_landau_pdf (const double x);
+
+unsigned int gsl_ran_geometric (const gsl_rng * r, const double p);
+double gsl_ran_geometric_pdf (const unsigned int k, const double p);
+
+unsigned int gsl_ran_hypergeometric (const gsl_rng * r, unsigned int n1, unsigned int n2, unsigned int t);
+double gsl_ran_hypergeometric_pdf (const unsigned int k, const unsigned int n1, const unsigned int n2, unsigned int t);
+
+double gsl_ran_gumbel1 (const gsl_rng * r, const double a, const double b);
+double gsl_ran_gumbel1_pdf (const double x, const double a, const double b);
+
+double gsl_ran_gumbel2 (const gsl_rng * r, const double a, const double b);
+double gsl_ran_gumbel2_pdf (const double x, const double a, const double b);
+
+double gsl_ran_logistic (const gsl_rng * r, const double a);
+double gsl_ran_logistic_pdf (const double x, const double a);
+
+double gsl_ran_lognormal (const gsl_rng * r, const double zeta, const double sigma);
+double gsl_ran_lognormal_pdf (const double x, const double zeta, const double sigma);
+
+unsigned int gsl_ran_logarithmic (const gsl_rng * r, const double p);
+double gsl_ran_logarithmic_pdf (const unsigned int k, const double p);
+
+void gsl_ran_multinomial (const gsl_rng * r, const size_t K,
+ const unsigned int N, const double p[],
+ unsigned int n[] );
+double gsl_ran_multinomial_pdf (const size_t K,
+ const double p[], const unsigned int n[] );
+double gsl_ran_multinomial_lnpdf (const size_t K,
+ const double p[], const unsigned int n[] );
+
+
+unsigned int gsl_ran_negative_binomial (const gsl_rng * r, double p, double n);
+double gsl_ran_negative_binomial_pdf (const unsigned int k, const double p, double n);
+
+unsigned int gsl_ran_pascal (const gsl_rng * r, double p, unsigned int n);
+double gsl_ran_pascal_pdf (const unsigned int k, const double p, unsigned int n);
+
+double gsl_ran_pareto (const gsl_rng * r, double a, const double b);
+double gsl_ran_pareto_pdf (const double x, const double a, const double b);
+
+unsigned int gsl_ran_poisson (const gsl_rng * r, double mu);
+void gsl_ran_poisson_array (const gsl_rng * r, size_t n, unsigned int array[],
+ double mu);
+double gsl_ran_poisson_pdf (const unsigned int k, const double mu);
+
+double gsl_ran_rayleigh (const gsl_rng * r, const double sigma);
+double gsl_ran_rayleigh_pdf (const double x, const double sigma);
+
+double gsl_ran_rayleigh_tail (const gsl_rng * r, const double a, const double sigma);
+double gsl_ran_rayleigh_tail_pdf (const double x, const double a, const double sigma);
+
+double gsl_ran_tdist (const gsl_rng * r, const double nu);
+double gsl_ran_tdist_pdf (const double x, const double nu);
+
+double gsl_ran_laplace (const gsl_rng * r, const double a);
+double gsl_ran_laplace_pdf (const double x, const double a);
+
+double gsl_ran_levy (const gsl_rng * r, const double c, const double alpha);
+double gsl_ran_levy_skew (const gsl_rng * r, const double c, const double alpha, const double beta);
+
+double gsl_ran_weibull (const gsl_rng * r, const double a, const double b);
+double gsl_ran_weibull_pdf (const double x, const double a, const double b);
+
+void gsl_ran_dir_2d (const gsl_rng * r, double * x, double * y);
+void gsl_ran_dir_2d_trig_method (const gsl_rng * r, double * x, double * y);
+void gsl_ran_dir_3d (const gsl_rng * r, double * x, double * y, double * z);
+void gsl_ran_dir_nd (const gsl_rng * r, size_t n, double * x);
+
+void gsl_ran_shuffle (const gsl_rng * r, void * base, size_t nmembm, size_t size);
+int gsl_ran_choose (const gsl_rng * r, void * dest, size_t k, void * src, size_t n, size_t size) ;
+void gsl_ran_sample (const gsl_rng * r, void * dest, size_t k, void * src, size_t n, size_t size) ;
+
+
+typedef struct { /* struct for Walker algorithm */
+ size_t K;
+ size_t *A;
+ double *F;
+} gsl_ran_discrete_t;
+
+gsl_ran_discrete_t * gsl_ran_discrete_preproc (size_t K, const double *P);
+void gsl_ran_discrete_free(gsl_ran_discrete_t *g);
+size_t gsl_ran_discrete (const gsl_rng *r, const gsl_ran_discrete_t *g);
+double gsl_ran_discrete_pdf (size_t k, const gsl_ran_discrete_t *g);
+
+
+__END_DECLS
+
+#endif /* __GSL_RANDIST_H__ */
diff --git a/gsl-1.9/randist/gumbel.c b/gsl-1.9/randist/gumbel.c
new file mode 100644
index 0000000..65aff8d
--- /dev/null
+++ b/gsl-1.9/randist/gumbel.c
@@ -0,0 +1,78 @@
+/* randist/gumbel.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+
+/* The Type I Gumbel distribution has the form,
+
+ p(x) dx = a b exp(-(b exp(-ax) + ax)) dx
+
+ and the Type II Gumbel distribution has the form,
+
+ p(x) dx = b a x^-(a+1) exp(-b x^-a)) dx
+
+ */
+
+double
+gsl_ran_gumbel1 (const gsl_rng * r, const double a, const double b)
+{
+ double x = gsl_rng_uniform_pos (r);
+
+ double z = (log(b) - log(-log(x))) / a;
+
+ return z;
+}
+
+double
+gsl_ran_gumbel1_pdf (const double x, const double a, const double b)
+{
+ double p = a * b * exp (-(b * exp(-a * x) + a * x));
+ return p;
+}
+
+double
+gsl_ran_gumbel2 (const gsl_rng * r, const double a, const double b)
+{
+ double x = gsl_rng_uniform_pos (r);
+
+ double z = pow(-b / log(x), 1/a);
+
+ return z;
+}
+
+double
+gsl_ran_gumbel2_pdf (const double x, const double a, const double b)
+{
+ if (x <= 0)
+ {
+ return 0 ;
+ }
+ else
+ {
+ double p = b * a * pow(x,-(a+1)) * exp (-b * pow(x, -a));
+ return p;
+ }
+}
+
+
+
+
diff --git a/gsl-1.9/randist/hyperg.c b/gsl-1.9/randist/hyperg.c
new file mode 100644
index 0000000..c15de09
--- /dev/null
+++ b/gsl-1.9/randist/hyperg.c
@@ -0,0 +1,124 @@
+/* randist/hyperg.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+#include <gsl/gsl_sf_gamma.h>
+
+/* The hypergeometric distribution has the form,
+
+ prob(k) = choose(n1,t) choose(n2, t-k) / choose(n1+n2,t)
+
+ where choose(a,b) = a!/(b!(a-b)!)
+
+ n1 + n2 is the total population (tagged plus untagged)
+ n1 is the tagged population
+ t is the number of samples taken (without replacement)
+ k is the number of tagged samples found
+
+*/
+
+unsigned int
+gsl_ran_hypergeometric (const gsl_rng * r, unsigned int n1, unsigned int n2,
+ unsigned int t)
+{
+ const unsigned int n = n1 + n2;
+
+ unsigned int i = 0;
+ unsigned int a = n1;
+ unsigned int b = n1 + n2;
+ unsigned int k = 0;
+
+ if (t > n)
+ {
+ t = n ;
+ }
+
+ if (t < n / 2)
+ {
+ for (i = 0 ; i < t ; i++)
+ {
+ double u = gsl_rng_uniform(r) ;
+
+ if (b * u < a)
+ {
+ k++ ;
+ if (k == n1)
+ return k ;
+ a-- ;
+ }
+ b-- ;
+ }
+ return k;
+ }
+ else
+ {
+ for (i = 0 ; i < n - t ; i++)
+ {
+ double u = gsl_rng_uniform(r) ;
+
+ if (b * u < a)
+ {
+ k++ ;
+ if (k == n1)
+ return n1 - k ;
+ a-- ;
+ }
+ b-- ;
+ }
+ return n1 - k;
+ }
+
+
+}
+
+double
+gsl_ran_hypergeometric_pdf (const unsigned int k,
+ const unsigned int n1,
+ const unsigned int n2,
+ unsigned int t)
+{
+ if (t > n1 + n2)
+ {
+ t = n1 + n2 ;
+ }
+
+ if (k > n1 || k > t)
+ {
+ return 0 ;
+ }
+ else if (t > n2 && k + n2 < t )
+ {
+ return 0 ;
+ }
+ else
+ {
+ double p;
+
+ double c1 = gsl_sf_lnchoose(n1,k);
+ double c2 = gsl_sf_lnchoose(n2,t-k);
+ double c3 = gsl_sf_lnchoose(n1+n2,t);
+
+ p = exp(c1 + c2 - c3) ;
+
+ return p;
+ }
+}
diff --git a/gsl-1.9/randist/landau.c b/gsl-1.9/randist/landau.c
new file mode 100644
index 0000000..9d1195f
--- /dev/null
+++ b/gsl-1.9/randist/landau.c
@@ -0,0 +1,565 @@
+/* randist/landau.c
+ *
+ * Copyright (C) 2001, 2004 David Morrison
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Adapted from the CERN library routines DENLAN, RANLAN, and DISLAN
+ * as described in http://consult.cern.ch/shortwrups/g110/top.html.
+ * Original author: K.S. K\"olbig.
+ *
+ * The distribution is given by the complex path integral,
+ *
+ * p(x) = (1/(2 pi i)) \int_{c-i\inf}^{c+i\inf} ds exp(s log(s) + x s)
+ *
+ * which can be converted into a real integral over [0,+\inf]
+ *
+ * p(x) = (1/pi) \int_0^\inf dt \exp(-t log(t) - x t) sin(pi t)
+ *
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+
+double
+gsl_ran_landau_pdf(const double x)
+{
+ static double P1[5] =
+ {
+ 0.4259894875E0, -0.1249762550E0, 0.3984243700E-1,
+ -0.6298287635E-2, 0.1511162253E-2
+ };
+ static double P2[5] =
+ {
+ 0.1788541609E0, 0.1173957403E0, 0.1488850518E-1,
+ -0.1394989411E-2, 0.1283617211E-3
+ };
+ static double P3[5] =
+ {
+ 0.1788544503E0, 0.9359161662E-1, 0.6325387654E-2,
+ 0.6611667319E-4, -0.2031049101E-5
+ };
+ static double P4[5] =
+ {
+ 0.9874054407E0, 0.1186723273E3, 0.8492794360E3,
+ -0.7437792444E3, 0.4270262186E3
+ };
+ static double P5[5] =
+ {
+ 0.1003675074E1, 0.1675702434E3, 0.4789711289E4,
+ 0.2121786767E5, -0.2232494910E5
+ };
+ static double P6[5] =
+ {
+ 0.1000827619E1, 0.6649143136E3, 0.6297292665E5,
+ 0.4755546998E6, -0.5743609109E7
+ };
+
+ static double Q1[5] =
+ {
+ 1.0, -0.3388260629E0, 0.9594393323E-1,
+ -0.1608042283E-1, 0.3778942063E-2
+ };
+ static double Q2[5] =
+ {
+ 1.0, 0.7428795082E0, 0.3153932961E0,
+ 0.6694219548E-1, 0.8790609714E-2
+ };
+ static double Q3[5] =
+ {
+ 1.0, 0.6097809921E0, 0.2560616665E0,
+ 0.4746722384E-1, 0.6957301675E-2
+ };
+ static double Q4[5] =
+ {
+ 1.0, 0.1068615961E3, 0.3376496214E3,
+ 0.2016712389E4, 0.1597063511E4
+ };
+ static double Q5[5] =
+ {
+ 1.0, 0.1569424537E3, 0.3745310488E4,
+ 0.9834698876E4, 0.6692428357E5
+ };
+ static double Q6[5] =
+ {
+ 1.0, 0.6514101098E3, 0.5697473333E5,
+ 0.1659174725E6, -0.2815759939E7
+ };
+
+ static double A1[3] =
+ {
+ 0.4166666667E-1, -0.1996527778E-1, 0.2709538966E-1
+ };
+ static double A2[2] =
+ {
+ -0.1845568670E1, -0.4284640743E1
+ };
+
+ double U, V, DENLAN;
+
+ V = x;
+ if (V < -5.5)
+ {
+ U = exp(V + 1.0);
+ DENLAN = 0.3989422803 * (exp( -1 / U) / sqrt(U)) *
+ (1 + (A1[0] + (A1[1] + A1[2] * U) * U) * U);
+ }
+ else if (V < -1)
+ {
+ U = exp( -V - 1);
+ DENLAN = exp( -U) * sqrt(U) *
+ (P1[0] + (P1[1] + (P1[2] + (P1[3] + P1[4] * V) * V) * V) * V) /
+ (Q1[0] + (Q1[1] + (Q1[2] + (Q1[3] + Q1[4] * V) * V) * V) * V);
+ }
+ else if (V < 1)
+ {
+ DENLAN = (P2[0] + (P2[1] + (P2[2] + (P2[3] + P2[4] * V) * V) * V) * V) /
+ (Q2[0] + (Q2[1] + (Q2[2] + (Q2[3] + Q2[4] * V) * V) * V) * V);
+ }
+ else if (V < 5)
+ {
+ DENLAN = (P3[0] + (P3[1] + (P3[2] + (P3[3] + P3[4] * V) * V) * V) * V) /
+ (Q3[0] + (Q3[1] + (Q3[2] + (Q3[3] + Q3[4] * V) * V) * V) * V);
+ }
+ else if (V < 12)
+ {
+ U = 1 / V;
+ DENLAN = U * U *
+ (P4[0] + (P4[1] + (P4[2] + (P4[3] + P4[4] * U) * U) * U) * U) /
+ (Q4[0] + (Q4[1] + (Q4[2] + (Q4[3] + Q4[4] * U) * U) * U) * U);
+ }
+ else if (V < 50)
+ {
+ U = 1 / V;
+ DENLAN = U * U *
+ (P5[0] + (P5[1] + (P5[2] + (P5[3] + P5[4] * U) * U) * U) * U) /
+ (Q5[0] + (Q5[1] + (Q5[2] + (Q5[3] + Q5[4] * U) * U) * U) * U);
+ }
+ else if (V < 300)
+ {
+ U = 1 / V;
+ DENLAN = U * U *
+ (P6[0] + (P6[1] + (P6[2] + (P6[3] + P6[4] * U) * U) * U) * U) /
+ (Q6[0] + (Q6[1] + (Q6[2] + (Q6[3] + Q6[4] * U) * U) * U) * U);
+ }
+ else
+ {
+ U = 1 / (V - V * log(V) / (V + 1));
+ DENLAN = U * U * (1 + (A2[0] + A2[1] * U) * U);
+ }
+
+ return DENLAN;
+}
+
+#if 0 /* Not needed yet */
+/* This function is a translation from the original Fortran of the
+ * CERN library routine DISLAN, the integral from -inf to x of the
+ * Landau p.d.f.
+ */
+static
+double
+gsl_ran_landau_dislan(const double x)
+{
+ static double P1[5] =
+ {
+ 0.2514091491E0, -0.6250580444E-1,
+ 0.1458381230E-1, -0.2108817737E-2,
+ 0.7411247290E-3
+ };
+
+ static double P2[4] =
+ {
+ 0.2868328584E0, 0.3564363231E0,
+ 0.1523518695E0, 0.2251304883E-1
+ };
+
+ static double P3[4] =
+ {
+ 0.2868329066E0, 0.3003828436E0,
+ 0.9950951941E-1, 0.8733827185E-2
+ };
+
+ static double P4[4] =
+ {
+ 0.1000351630E1, 0.4503592498E1,
+ 0.1085883880E2, 0.7536052269E1
+ };
+
+ static double P5[4] =
+ {
+ 0.1000006517E1, 0.4909414111E2,
+ 0.8505544753E2, 0.1532153455E3
+ };
+
+ static double P6[4] =
+ {
+ 0.1000000983E1, 0.1329868456E3,
+ 0.9162149244E3, -0.9605054274E3
+ };
+
+ static double Q1[5] =
+ {
+ 1.0, -0.5571175625E-2,
+ 0.6225310236E-1, -0.3137378427E-2,
+ 0.1931496439E-2
+ };
+
+ static double Q2[4] =
+ {
+ 1.0, 0.6191136137E0,
+ 0.1720721448E0, 0.2278594771E-1
+ };
+
+ static double Q3[4] =
+ {
+ 1.0, 0.4237190502E0,
+ 0.1095631512E0, 0.8693851567E-2
+ };
+
+ static double Q4[4] =
+ {
+ 1.0, 0.5539969678E1,
+ 0.1933581111E2, 0.2721321508E2
+ };
+
+ static double Q5[4] =
+ {
+ 1.0, 0.5009928881E2,
+ 0.1399819104E3, 0.4200002909E3
+ };
+
+ static double Q6[4] =
+ {
+ 1.0, 0.1339887843E3,
+ 0.1055990413E4, 0.5532224619E3
+ };
+
+ static double A1[3] =
+ {
+ -0.4583333333E0, 0.6675347222E0, -0.1641741416E1
+ };
+
+ static double A2[3] =
+ {
+ 1.0, -0.4227843351E0, -0.2043403138E1
+ };
+
+ double U, V, DISLAN;
+
+ V = x;
+ if (V < -5.5)
+ {
+ U = exp(V + 1);
+ DISLAN = 0.3989422803 * exp( -1 / U) * sqrt(U) *
+ (1 + (A1[0] + (A1[1] + A1[2] * U) * U) * U);
+ }
+ else if (V < -1)
+ {
+ U = exp( -V - 1);
+ DISLAN = (exp( -U) / sqrt(U)) *
+ (P1[0] + (P1[1] + (P1[2] + (P1[3] + P1[4] * V) * V) * V) * V) /
+ (Q1[0] + (Q1[1] + (Q1[2] + (Q1[3] + Q1[4] * V) * V) * V) * V);
+ }
+ else if (V < 1)
+ {
+ DISLAN = (P2[0] + (P2[1] + (P2[2] + P2[3] * V) * V) * V) /
+ (Q2[0] + (Q2[1] + (Q2[2] + Q2[3] * V) * V) * V);
+ }
+ else if (V < 4)
+ {
+ DISLAN = (P3[0] + (P3[1] + (P3[2] + P3[3] * V) * V) * V) /
+ (Q3[0] + (Q3[1] + (Q3[2] + Q3[3] * V) * V) * V);
+ }
+ else if (V < 12)
+ {
+ U = 1 / V;
+ DISLAN = (P4[0] + (P4[1] + (P4[2] + P4[3] * U) * U) * U) /
+ (Q4[0] + (Q4[1] + (Q4[2] + Q4[3] * U) * U) * U);
+ }
+ else if (V < 50)
+ {
+ U = 1 / V;
+ DISLAN = (P5[0] + (P5[1] + (P5[2] + P5[3] * U) * U) * U) /
+ (Q5[0] + (Q5[1] + (Q5[2] + Q5[3] * U) * U) * U);
+ }
+ else if (V < 300)
+ {
+ U = 1 / V;
+ DISLAN = (P6[0] + (P6[1] + (P6[2] + P6[3] * U) * U) * U) /
+ (Q6[0] + (Q6[1] + (Q6[2] + Q6[3] * U) * U) * U);
+ }
+ else
+ {
+ U = 1 / (V - V * log(V) / (V + 1));
+ DISLAN = 1 - (A2[0] + (A2[1] + A2[2] * U) * U) * U;
+ }
+
+ return DISLAN;
+}
+#endif
+
+double
+gsl_ran_landau(const gsl_rng * r)
+{
+ static double F[983] =
+ {
+ 0.0000000, /* Add empty element [0] to account for difference
+ between C and Fortran convention for lower bound. */
+ 00.000000, 00.000000, 00.000000, 00.000000, 00.000000,
+ -2.244733, -2.204365, -2.168163, -2.135219, -2.104898,
+ -2.076740, -2.050397, -2.025605, -2.002150, -1.979866,
+ -1.958612, -1.938275, -1.918760, -1.899984, -1.881879,
+ -1.864385, -1.847451, -1.831030, -1.815083, -1.799574,
+ -1.784473, -1.769751, -1.755383, -1.741346, -1.727620,
+ -1.714187, -1.701029, -1.688130, -1.675477, -1.663057,
+ -1.650858, -1.638868, -1.627078, -1.615477, -1.604058,
+ -1.592811, -1.581729, -1.570806, -1.560034, -1.549407,
+ -1.538919, -1.528565, -1.518339, -1.508237, -1.498254,
+ -1.488386, -1.478628, -1.468976, -1.459428, -1.449979,
+ -1.440626, -1.431365, -1.422195, -1.413111, -1.404112,
+ -1.395194, -1.386356, -1.377594, -1.368906, -1.360291,
+ -1.351746, -1.343269, -1.334859, -1.326512, -1.318229,
+ -1.310006, -1.301843, -1.293737, -1.285688, -1.277693,
+ -1.269752, -1.261863, -1.254024, -1.246235, -1.238494,
+ -1.230800, -1.223153, -1.215550, -1.207990, -1.200474,
+ -1.192999, -1.185566, -1.178172, -1.170817, -1.163500,
+ -1.156220, -1.148977, -1.141770, -1.134598, -1.127459,
+ -1.120354, -1.113282, -1.106242, -1.099233, -1.092255,
+ -1.085306, -1.078388, -1.071498, -1.064636, -1.057802,
+ -1.050996, -1.044215, -1.037461, -1.030733, -1.024029,
+ -1.017350, -1.010695, -1.004064, -0.997456, -0.990871,
+ -0.984308, -0.977767, -0.971247, -0.964749, -0.958271,
+ -0.951813, -0.945375, -0.938957, -0.932558, -0.926178,
+ -0.919816, -0.913472, -0.907146, -0.900838, -0.894547,
+ -0.888272, -0.882014, -0.875773, -0.869547, -0.863337,
+ -0.857142, -0.850963, -0.844798, -0.838648, -0.832512,
+ -0.826390, -0.820282, -0.814187, -0.808106, -0.802038,
+ -0.795982, -0.789940, -0.783909, -0.777891, -0.771884,
+ -0.765889, -0.759906, -0.753934, -0.747973, -0.742023,
+ -0.736084, -0.730155, -0.724237, -0.718328, -0.712429,
+ -0.706541, -0.700661, -0.694791, -0.688931, -0.683079,
+ -0.677236, -0.671402, -0.665576, -0.659759, -0.653950,
+ -0.648149, -0.642356, -0.636570, -0.630793, -0.625022,
+ -0.619259, -0.613503, -0.607754, -0.602012, -0.596276,
+ -0.590548, -0.584825, -0.579109, -0.573399, -0.567695,
+ -0.561997, -0.556305, -0.550618, -0.544937, -0.539262,
+ -0.533592, -0.527926, -0.522266, -0.516611, -0.510961,
+ -0.505315, -0.499674, -0.494037, -0.488405, -0.482777,
+ -0.477153, -0.471533, -0.465917, -0.460305, -0.454697,
+ -0.449092, -0.443491, -0.437893, -0.432299, -0.426707,
+ -0.421119, -0.415534, -0.409951, -0.404372, -0.398795,
+ -0.393221, -0.387649, -0.382080, -0.376513, -0.370949,
+ -0.365387, -0.359826, -0.354268, -0.348712, -0.343157,
+ -0.337604, -0.332053, -0.326503, -0.320955, -0.315408,
+ -0.309863, -0.304318, -0.298775, -0.293233, -0.287692,
+ -0.282152, -0.276613, -0.271074, -0.265536, -0.259999,
+ -0.254462, -0.248926, -0.243389, -0.237854, -0.232318,
+ -0.226783, -0.221247, -0.215712, -0.210176, -0.204641,
+ -0.199105, -0.193568, -0.188032, -0.182495, -0.176957,
+ -0.171419, -0.165880, -0.160341, -0.154800, -0.149259,
+ -0.143717, -0.138173, -0.132629, -0.127083, -0.121537,
+ -0.115989, -0.110439, -0.104889, -0.099336, -0.093782,
+ -0.088227, -0.082670, -0.077111, -0.071550, -0.065987,
+ -0.060423, -0.054856, -0.049288, -0.043717, -0.038144,
+ -0.032569, -0.026991, -0.021411, -0.015828, -0.010243,
+ -0.004656, 00.000934, 00.006527, 00.012123, 00.017722,
+ 00.023323, 00.028928, 00.034535, 00.040146, 00.045759,
+ 00.051376, 00.056997, 00.062620, 00.068247, 00.073877,
+ 00.079511, 00.085149, 00.090790, 00.096435, 00.102083,
+ 00.107736, 00.113392, 00.119052, 00.124716, 00.130385,
+ 00.136057, 00.141734, 00.147414, 00.153100, 00.158789,
+ 00.164483, 00.170181, 00.175884, 00.181592, 00.187304,
+ 00.193021, 00.198743, 00.204469, 00.210201, 00.215937,
+ 00.221678, 00.227425, 00.233177, 00.238933, 00.244696,
+ 00.250463, 00.256236, 00.262014, 00.267798, 00.273587,
+ 00.279382, 00.285183, 00.290989, 00.296801, 00.302619,
+ 00.308443, 00.314273, 00.320109, 00.325951, 00.331799,
+ 00.337654, 00.343515, 00.349382, 00.355255, 00.361135,
+ 00.367022, 00.372915, 00.378815, 00.384721, 00.390634,
+ 00.396554, 00.402481, 00.408415, 00.414356, 00.420304,
+ 00.426260, 00.432222, 00.438192, 00.444169, 00.450153,
+ 00.456145, 00.462144, 00.468151, 00.474166, 00.480188,
+ 00.486218, 00.492256, 00.498302, 00.504356, 00.510418,
+ 00.516488, 00.522566, 00.528653, 00.534747, 00.540850,
+ 00.546962, 00.553082, 00.559210, 00.565347, 00.571493,
+ 00.577648, 00.583811, 00.589983, 00.596164, 00.602355,
+ 00.608554, 00.614762, 00.620980, 00.627207, 00.633444,
+ 00.639689, 00.645945, 00.652210, 00.658484, 00.664768,
+ 00.671062, 00.677366, 00.683680, 00.690004, 00.696338,
+ 00.702682, 00.709036, 00.715400, 00.721775, 00.728160,
+ 00.734556, 00.740963, 00.747379, 00.753807, 00.760246,
+ 00.766695, 00.773155, 00.779627, 00.786109, 00.792603,
+ 00.799107, 00.805624, 00.812151, 00.818690, 00.825241,
+ 00.831803, 00.838377, 00.844962, 00.851560, 00.858170,
+ 00.864791, 00.871425, 00.878071, 00.884729, 00.891399,
+ 00.898082, 00.904778, 00.911486, 00.918206, 00.924940,
+ 00.931686, 00.938446, 00.945218, 00.952003, 00.958802,
+ 00.965614, 00.972439, 00.979278, 00.986130, 00.992996,
+ 00.999875, 01.006769, 01.013676, 01.020597, 01.027533,
+ 01.034482, 01.041446, 01.048424, 01.055417, 01.062424,
+ 01.069446, 01.076482, 01.083534, 01.090600, 01.097681,
+ 01.104778, 01.111889, 01.119016, 01.126159, 01.133316,
+ 01.140490, 01.147679, 01.154884, 01.162105, 01.169342,
+ 01.176595, 01.183864, 01.191149, 01.198451, 01.205770,
+ 01.213105, 01.220457, 01.227826, 01.235211, 01.242614,
+ 01.250034, 01.257471, 01.264926, 01.272398, 01.279888,
+ 01.287395, 01.294921, 01.302464, 01.310026, 01.317605,
+ 01.325203, 01.332819, 01.340454, 01.348108, 01.355780,
+ 01.363472, 01.371182, 01.378912, 01.386660, 01.394429,
+ 01.402216, 01.410024, 01.417851, 01.425698, 01.433565,
+ 01.441453, 01.449360, 01.457288, 01.465237, 01.473206,
+ 01.481196, 01.489208, 01.497240, 01.505293, 01.513368,
+ 01.521465, 01.529583, 01.537723, 01.545885, 01.554068,
+ 01.562275, 01.570503, 01.578754, 01.587028, 01.595325,
+ 01.603644, 01.611987, 01.620353, 01.628743, 01.637156,
+ 01.645593, 01.654053, 01.662538, 01.671047, 01.679581,
+ 01.688139, 01.696721, 01.705329, 01.713961, 01.722619,
+ 01.731303, 01.740011, 01.748746, 01.757506, 01.766293,
+ 01.775106, 01.783945, 01.792810, 01.801703, 01.810623,
+ 01.819569, 01.828543, 01.837545, 01.846574, 01.855631,
+ 01.864717, 01.873830, 01.882972, 01.892143, 01.901343,
+ 01.910572, 01.919830, 01.929117, 01.938434, 01.947781,
+ 01.957158, 01.966566, 01.976004, 01.985473, 01.994972,
+ 02.004503, 02.014065, 02.023659, 02.033285, 02.042943,
+ 02.052633, 02.062355, 02.072110, 02.081899, 02.091720,
+ 02.101575, 02.111464, 02.121386, 02.131343, 02.141334,
+ 02.151360, 02.161421, 02.171517, 02.181648, 02.191815,
+ 02.202018, 02.212257, 02.222533, 02.232845, 02.243195,
+ 02.253582, 02.264006, 02.274468, 02.284968, 02.295507,
+ 02.306084, 02.316701, 02.327356, 02.338051, 02.348786,
+ 02.359562, 02.370377, 02.381234, 02.392131, 02.403070,
+ 02.414051, 02.425073, 02.436138, 02.447246, 02.458397,
+ 02.469591, 02.480828, 02.492110, 02.503436, 02.514807,
+ 02.526222, 02.537684, 02.549190, 02.560743, 02.572343,
+ 02.583989, 02.595682, 02.607423, 02.619212, 02.631050,
+ 02.642936, 02.654871, 02.666855, 02.678890, 02.690975,
+ 02.703110, 02.715297, 02.727535, 02.739825, 02.752168,
+ 02.764563, 02.777012, 02.789514, 02.802070, 02.814681,
+ 02.827347, 02.840069, 02.852846, 02.865680, 02.878570,
+ 02.891518, 02.904524, 02.917588, 02.930712, 02.943894,
+ 02.957136, 02.970439, 02.983802, 02.997227, 03.010714,
+ 03.024263, 03.037875, 03.051551, 03.065290, 03.079095,
+ 03.092965, 03.106900, 03.120902, 03.134971, 03.149107,
+ 03.163312, 03.177585, 03.191928, 03.206340, 03.220824,
+ 03.235378, 03.250005, 03.264704, 03.279477, 03.294323,
+ 03.309244, 03.324240, 03.339312, 03.354461, 03.369687,
+ 03.384992, 03.400375, 03.415838, 03.431381, 03.447005,
+ 03.462711, 03.478500, 03.494372, 03.510328, 03.526370,
+ 03.542497, 03.558711, 03.575012, 03.591402, 03.607881,
+ 03.624450, 03.641111, 03.657863, 03.674708, 03.691646,
+ 03.708680, 03.725809, 03.743034, 03.760357, 03.777779,
+ 03.795300, 03.812921, 03.830645, 03.848470, 03.866400,
+ 03.884434, 03.902574, 03.920821, 03.939176, 03.957640,
+ 03.976215, 03.994901, 04.013699, 04.032612, 04.051639,
+ 04.070783, 04.090045, 04.109425, 04.128925, 04.148547,
+ 04.168292, 04.188160, 04.208154, 04.228275, 04.248524,
+ 04.268903, 04.289413, 04.310056, 04.330832, 04.351745,
+ 04.372794, 04.393982, 04.415310, 04.436781, 04.458395,
+ 04.480154, 04.502060, 04.524114, 04.546319, 04.568676,
+ 04.591187, 04.613854, 04.636678, 04.659662, 04.682807,
+ 04.706116, 04.729590, 04.753231, 04.777041, 04.801024,
+ 04.825179, 04.849511, 04.874020, 04.898710, 04.923582,
+ 04.948639, 04.973883, 04.999316, 05.024942, 05.050761,
+ 05.076778, 05.102993, 05.129411, 05.156034, 05.182864,
+ 05.209903, 05.237156, 05.264625, 05.292312, 05.320220,
+ 05.348354, 05.376714, 05.405306, 05.434131, 05.463193,
+ 05.492496, 05.522042, 05.551836, 05.581880, 05.612178,
+ 05.642734, 05.673552, 05.704634, 05.735986, 05.767610,
+ 05.799512, 05.831694, 05.864161, 05.896918, 05.929968,
+ 05.963316, 05.996967, 06.030925, 06.065194, 06.099780,
+ 06.134687, 06.169921, 06.205486, 06.241387, 06.277630,
+ 06.314220, 06.351163, 06.388465, 06.426130, 06.464166,
+ 06.502578, 06.541371, 06.580553, 06.620130, 06.660109,
+ 06.700495, 06.741297, 06.782520, 06.824173, 06.866262,
+ 06.908795, 06.951780, 06.995225, 07.039137, 07.083525,
+ 07.128398, 07.173764, 07.219632, 07.266011, 07.312910,
+ 07.360339, 07.408308, 07.456827, 07.505905, 07.555554,
+ 07.605785, 07.656608, 07.708035, 07.760077, 07.812747,
+ 07.866057, 07.920019, 07.974647, 08.029953, 08.085952,
+ 08.142657, 08.200083, 08.258245, 08.317158, 08.376837,
+ 08.437300, 08.498562, 08.560641, 08.623554, 08.687319,
+ 08.751955, 08.817481, 08.883916, 08.951282, 09.019600,
+ 09.088889, 09.159174, 09.230477, 09.302822, 09.376233,
+ 09.450735, 09.526355, 09.603118, 09.681054, 09.760191,
+ 09.840558, 09.922186, 10.005107, 10.089353, 10.174959,
+ 10.261958, 10.350389, 10.440287, 10.531693, 10.624646,
+ 10.719188, 10.815362, 10.913214, 11.012789, 11.114137,
+ 11.217307, 11.322352, 11.429325, 11.538283, 11.649285,
+ 11.762390, 11.877664, 11.995170, 12.114979, 12.237161,
+ 12.361791, 12.488946, 12.618708, 12.751161, 12.886394,
+ 13.024498, 13.165570, 13.309711, 13.457026, 13.607625,
+ 13.761625, 13.919145, 14.080314, 14.245263, 14.414134,
+ 14.587072, 14.764233, 14.945778, 15.131877, 15.322712,
+ 15.518470, 15.719353, 15.925570, 16.137345, 16.354912,
+ 16.578520, 16.808433, 17.044929, 17.288305, 17.538873,
+ 17.796967, 18.062943, 18.337176, 18.620068, 18.912049,
+ 19.213574, 19.525133, 19.847249, 20.180480, 20.525429,
+ 20.882738, 21.253102, 21.637266, 22.036036, 22.450278,
+ 22.880933, 23.329017, 23.795634, 24.281981, 24.789364,
+ 25.319207, 25.873062, 26.452634, 27.059789, 27.696581,
+ 28.365274, 29.068370, 29.808638, 30.589157, 31.413354,
+ 32.285060, 33.208568, 34.188705, 35.230920, 36.341388,
+ 37.527131, 38.796172, 40.157721, 41.622399, 43.202525,
+ 44.912465, 46.769077, 48.792279, 51.005773, 53.437996,
+ 56.123356, 59.103894
+ };
+ double X, U, V, RANLAN;
+ int I;
+
+ X = gsl_rng_uniform_pos(r);
+ U = 1000.0 * X;
+ I = U;
+ U = U - I;
+
+ if (I >= 70 && I <= 800)
+ {
+ RANLAN = F[I] + U * (F[I + 1] - F[I]);
+ }
+ else if (I >= 7 && I <= 980)
+ {
+ RANLAN = F[I]
+ + U * (F[I + 1] - F[I]
+ - 0.25 * (1 - U) * (F[I + 2] - F[I + 1] - F[I] + F[I - 1]));
+ }
+ else if (I < 7)
+ {
+ V = log(X);
+ U = 1 / V;
+ RANLAN = ((0.99858950 + (3.45213058E1 + 1.70854528E1 * U) * U) /
+ (1 + (3.41760202E1 + 4.01244582 * U) * U)) *
+ ( -log( -0.91893853 - V) - 1);
+ }
+ else
+ {
+ U = 1 - X;
+ V = U * U;
+ if (X <= 0.999)
+ {
+ RANLAN = (1.00060006 + 2.63991156E2 * U + 4.37320068E3 * V) /
+ ((1 + 2.57368075E2 * U + 3.41448018E3 * V) * U);
+ }
+ else
+ {
+ RANLAN = (1.00001538 + 6.07514119E3 * U + 7.34266409E5 * V) /
+ ((1 + 6.06511919E3 * U + 6.94021044E5 * V) * U);
+ }
+ }
+
+ return RANLAN;
+}
+
diff --git a/gsl-1.9/randist/laplace.c b/gsl-1.9/randist/laplace.c
new file mode 100644
index 0000000..c13f793
--- /dev/null
+++ b/gsl-1.9/randist/laplace.c
@@ -0,0 +1,57 @@
+/* randist/laplace.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+
+/* The two-sided exponential probability distribution is
+
+ p(x) dx = (1/(2 a)) * exp(-|x/a|) dx
+
+ for -infty < x < infty. It is also known as the Laplace distribution. */
+
+double
+gsl_ran_laplace (const gsl_rng * r, const double a)
+{
+ double u;
+ do
+ {
+ u = 2 * gsl_rng_uniform (r) - 1.0;
+ }
+ while (u == 0.0);
+
+ if (u < 0)
+ {
+ return a * log (-u);
+ }
+ else
+ {
+ return -a * log (u);
+ }
+}
+
+double
+gsl_ran_laplace_pdf (const double x, const double a)
+{
+ double p = (1/(2*a)) * exp (-fabs (x)/a);
+ return p;
+}
+
diff --git a/gsl-1.9/randist/levy.c b/gsl-1.9/randist/levy.c
new file mode 100644
index 0000000..b3909c9
--- /dev/null
+++ b/gsl-1.9/randist/levy.c
@@ -0,0 +1,136 @@
+/* randist/levy.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+
+/* The stable Levy probability distributions have the form
+
+ p(x) dx = (1/(2 pi)) \int dt exp(- it x - |c t|^alpha)
+
+ with 0 < alpha <= 2.
+
+ For alpha = 1, we get the Cauchy distribution
+ For alpha = 2, we get the Gaussian distribution with sigma = sqrt(2) c.
+
+ Fromn Chapter 5 of Bratley, Fox and Schrage "A Guide to
+ Simulation". The original reference given there is,
+
+ J.M. Chambers, C.L. Mallows and B. W. Stuck. "A method for
+ simulating stable random variates". Journal of the American
+ Statistical Association, JASA 71 340-344 (1976).
+
+ */
+
+double
+gsl_ran_levy (const gsl_rng * r, const double c, const double alpha)
+{
+ double u, v, t, s;
+
+ u = M_PI * (gsl_rng_uniform_pos (r) - 0.5);
+
+ if (alpha == 1) /* cauchy case */
+ {
+ t = tan (u);
+ return c * t;
+ }
+
+ do
+ {
+ v = gsl_ran_exponential (r, 1.0);
+ }
+ while (v == 0);
+
+ if (alpha == 2) /* gaussian case */
+ {
+ t = 2 * sin (u) * sqrt(v);
+ return c * t;
+ }
+
+ /* general case */
+
+ t = sin (alpha * u) / pow (cos (u), 1 / alpha);
+ s = pow (cos ((1 - alpha) * u) / v, (1 - alpha) / alpha);
+
+ return c * t * s;
+}
+
+
+/* The following routine for the skew-symmetric case was provided by
+ Keith Briggs.
+
+ The stable Levy probability distributions have the form
+
+ 2*pi* p(x) dx
+
+ = \int dt exp(mu*i*t-|sigma*t|^alpha*(1-i*beta*sign(t)*tan(pi*alpha/2))) for alpha!=1
+ = \int dt exp(mu*i*t-|sigma*t|^alpha*(1+i*beta*sign(t)*2/pi*log(|t|))) for alpha==1
+
+ with 0<alpha<=2, -1<=beta<=1, sigma>0.
+
+ For beta=0, sigma=c, mu=0, we get gsl_ran_levy above.
+
+ For alpha = 1, beta=0, we get the Lorentz distribution
+ For alpha = 2, beta=0, we get the Gaussian distribution
+
+ See A. Weron and R. Weron: Computer simulation of Lévy alpha-stable
+ variables and processes, preprint Technical University of Wroclaw.
+ http://www.im.pwr.wroc.pl/~hugo/Publications.html
+
+*/
+
+double
+gsl_ran_levy_skew (const gsl_rng * r, const double c,
+ const double alpha, const double beta)
+{
+ double V, W, X;
+
+ if (beta == 0) /* symmetric case */
+ {
+ return gsl_ran_levy (r, c, alpha);
+ }
+
+ V = M_PI * (gsl_rng_uniform_pos (r) - 0.5);
+
+ do
+ {
+ W = gsl_ran_exponential (r, 1.0);
+ }
+ while (W == 0);
+
+ if (alpha == 1)
+ {
+ X = ((M_PI_2 + beta * V) * tan (V) -
+ beta * log (M_PI_2 * W * cos (V) / (M_PI_2 + beta * V))) / M_PI_2;
+ return c * (X + beta * log (c) / M_PI_2);
+ }
+ else
+ {
+ double t = beta * tan (M_PI_2 * alpha);
+ double B = atan (t) / alpha;
+ double S = pow (1 + t * t, 1/(2 * alpha));
+
+ X = S * sin (alpha * (V + B)) / pow (cos (V), 1 / alpha)
+ * pow (cos (V - alpha * (V + B)) / W, (1 - alpha) / alpha);
+ return c * X;
+ }
+}
diff --git a/gsl-1.9/randist/logarithmic.c b/gsl-1.9/randist/logarithmic.c
new file mode 100644
index 0000000..58b5ea9
--- /dev/null
+++ b/gsl-1.9/randist/logarithmic.c
@@ -0,0 +1,76 @@
+/* randist/logarithmic.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+
+/* Logarithmic distribution
+
+ prob(n) = p^n / (n log(1/(1-p)) for n = 1, 2, 3, ...
+
+ We use Kemp's second accelerated generator, from Luc Devroye's book
+ on "Non-Uniform Random Variate Generation", Springer */
+
+unsigned int
+gsl_ran_logarithmic (const gsl_rng * r, const double p)
+{
+ double c = log (1-p) ;
+
+ double v = gsl_rng_uniform_pos (r);
+
+ if (v >= p)
+ {
+ return 1 ;
+ }
+ else
+ {
+ double u = gsl_rng_uniform_pos (r);
+ double q = 1 - exp (c * u);
+
+ if (v <= q*q)
+ {
+ double x = 1 + log(v)/log(q) ;
+ return x ;
+ }
+ else if (v <= q)
+ {
+ return 2;
+ }
+ else
+ {
+ return 1 ;
+ }
+ }
+}
+
+double
+gsl_ran_logarithmic_pdf (const unsigned int k, const double p)
+{
+ if (k == 0)
+ {
+ return 0 ;
+ }
+ else
+ {
+ double P = pow(p, (double)k) / (double) k / log(1/(1-p)) ;
+ return P;
+ }
+}
diff --git a/gsl-1.9/randist/logistic.c b/gsl-1.9/randist/logistic.c
new file mode 100644
index 0000000..be72019
--- /dev/null
+++ b/gsl-1.9/randist/logistic.c
@@ -0,0 +1,53 @@
+/* randist/logistic.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+
+/* The logistic distribution has the form,
+
+ p(x) dx = (1/a) exp(-x/a) / (1 + exp(-x/a))^2 dx
+
+ for -infty < x < infty */
+
+double
+gsl_ran_logistic (const gsl_rng * r, const double a)
+{
+ double x, z;
+
+ do
+ {
+ x = gsl_rng_uniform_pos (r);
+ }
+ while (x == 1);
+
+ z = log (x / (1 - x));
+
+ return a * z;
+}
+
+double
+gsl_ran_logistic_pdf (const double x, const double a)
+{
+ double u = exp (-fabs(x)/a);
+ double p = u / (fabs(a) * (1 + u) * (1 + u));
+ return p;
+}
diff --git a/gsl-1.9/randist/lognormal.c b/gsl-1.9/randist/lognormal.c
new file mode 100644
index 0000000..2dc215a
--- /dev/null
+++ b/gsl-1.9/randist/lognormal.c
@@ -0,0 +1,70 @@
+/* randist/lognormal.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+
+/* The lognormal distribution has the form
+
+ p(x) dx = 1/(x * sqrt(2 pi sigma^2)) exp(-(ln(x) - zeta)^2/2 sigma^2) dx
+
+ for x > 0. Lognormal random numbers are the exponentials of
+ gaussian random numbers */
+
+double
+gsl_ran_lognormal (const gsl_rng * r, const double zeta, const double sigma)
+{
+ double u, v, r2, normal, z;
+
+ do
+ {
+ /* choose x,y in uniform square (-1,-1) to (+1,+1) */
+
+ u = -1 + 2 * gsl_rng_uniform (r);
+ v = -1 + 2 * gsl_rng_uniform (r);
+
+ /* see if it is in the unit circle */
+ r2 = u * u + v * v;
+ }
+ while (r2 > 1.0 || r2 == 0);
+
+ normal = u * sqrt (-2.0 * log (r2) / r2);
+
+ z = exp (sigma * normal + zeta);
+
+ return z;
+}
+
+double
+gsl_ran_lognormal_pdf (const double x, const double zeta, const double sigma)
+{
+ if (x <= 0)
+ {
+ return 0 ;
+ }
+ else
+ {
+ double u = (log (x) - zeta)/sigma;
+ double p = 1 / (x * fabs(sigma) * sqrt (2 * M_PI)) * exp (-(u * u) /2);
+ return p;
+ }
+}
diff --git a/gsl-1.9/randist/multinomial.c b/gsl-1.9/randist/multinomial.c
new file mode 100644
index 0000000..321e172
--- /dev/null
+++ b/gsl-1.9/randist/multinomial.c
@@ -0,0 +1,121 @@
+/* randist/multinomial.c
+ *
+ * Copyright (C) 2002 Gavin E. Crooks <gec@compbio.berkeley.edu>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+#include <gsl/gsl_sf_gamma.h>
+
+/* The multinomial distribution has the form
+
+ N! n_1 n_2 n_K
+ prob(n_1, n_2, ... n_K) = -------------------- p_1 p_2 ... p_K
+ (n_1! n_2! ... n_K!)
+
+ where n_1, n_2, ... n_K are nonnegative integers, sum_{k=1,K} n_k = N,
+ and p = (p_1, p_2, ..., p_K) is a probability distribution.
+
+ Random variates are generated using the conditional binomial method.
+ This scales well with N and does not require a setup step.
+
+ Ref:
+ C.S. David, The computer generation of multinomial random variates,
+ Comp. Stat. Data Anal. 16 (1993) 205-217
+*/
+
+void
+gsl_ran_multinomial (const gsl_rng * r, const size_t K,
+ const unsigned int N, const double p[], unsigned int n[])
+{
+ size_t k;
+ double norm = 0.0;
+ double sum_p = 0.0;
+
+ unsigned int sum_n = 0;
+
+ /* p[k] may contain non-negative weights that do not sum to 1.0.
+ * Even a probability distribution will not exactly sum to 1.0
+ * due to rounding errors.
+ */
+
+ for (k = 0; k < K; k++)
+ {
+ norm += p[k];
+ }
+
+ for (k = 0; k < K; k++)
+ {
+ if (p[k] > 0.0)
+ {
+ n[k] = gsl_ran_binomial (r, p[k] / (norm - sum_p), N - sum_n);
+ }
+ else
+ {
+ n[k] = 0;
+ }
+
+ sum_p += p[k];
+ sum_n += n[k];
+ }
+
+}
+
+
+double
+gsl_ran_multinomial_pdf (const size_t K,
+ const double p[], const unsigned int n[])
+{
+ return exp (gsl_ran_multinomial_lnpdf (K, p, n));
+}
+
+
+double
+gsl_ran_multinomial_lnpdf (const size_t K,
+ const double p[], const unsigned int n[])
+{
+ size_t k;
+ unsigned int N = 0;
+ double log_pdf = 0.0;
+ double norm = 0.0;
+
+ for (k = 0; k < K; k++)
+ {
+ N += n[k];
+ }
+
+ for (k = 0; k < K; k++)
+ {
+ norm += p[k];
+ }
+
+ log_pdf = gsl_sf_lnfact (N);
+
+ for (k = 0; k < K; k++)
+ {
+ log_pdf -= gsl_sf_lnfact (n[k]);
+ }
+
+ for (k = 0; k < K; k++)
+ {
+ log_pdf += log (p[k] / norm) * n[k];
+ }
+
+ return log_pdf;
+}
diff --git a/gsl-1.9/randist/nbinomial.c b/gsl-1.9/randist/nbinomial.c
new file mode 100644
index 0000000..e1ac49a
--- /dev/null
+++ b/gsl-1.9/randist/nbinomial.c
@@ -0,0 +1,54 @@
+/* randist/nbinomial.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+#include <gsl/gsl_sf_gamma.h>
+
+/* The negative binomial distribution has the form,
+
+ prob(k) = Gamma(n + k)/(Gamma(n) Gamma(k + 1)) p^n (1-p)^k
+
+ for k = 0, 1, ... . Note that n does not have to be an integer.
+
+ This is the Leger's algorithm (given in the answers in Knuth) */
+
+unsigned int
+gsl_ran_negative_binomial (const gsl_rng * r, double p, double n)
+{
+ double X = gsl_ran_gamma (r, n, 1.0) ;
+ unsigned int k = gsl_ran_poisson (r, X*(1-p)/p) ;
+ return k ;
+}
+
+double
+gsl_ran_negative_binomial_pdf (const unsigned int k, const double p, double n)
+{
+ double P;
+
+ double f = gsl_sf_lngamma (k + n) ;
+ double a = gsl_sf_lngamma (n) ;
+ double b = gsl_sf_lngamma (k + 1.0) ;
+
+ P = exp(f-a-b) * pow (p, n) * pow (1 - p, (double)k);
+
+ return P;
+}
diff --git a/gsl-1.9/randist/pareto.c b/gsl-1.9/randist/pareto.c
new file mode 100644
index 0000000..75aaac6
--- /dev/null
+++ b/gsl-1.9/randist/pareto.c
@@ -0,0 +1,54 @@
+/* randist/pareto.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+
+/* The Pareto distribution has the form,
+
+ p(x) dx = (a/b) / (x/b)^(a+1) dx for x >= b
+
+ */
+
+double
+gsl_ran_pareto (const gsl_rng * r, double a, const double b)
+{
+ double x = gsl_rng_uniform_pos (r);
+
+ double z = pow (x, -1 / a);
+
+ return b * z;
+}
+
+double
+gsl_ran_pareto_pdf (const double x, const double a, const double b)
+{
+ if (x >= b)
+ {
+ double p = (a/b) / pow (x/b, a + 1);
+ return p;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
diff --git a/gsl-1.9/randist/pascal.c b/gsl-1.9/randist/pascal.c
new file mode 100644
index 0000000..58e25b5
--- /dev/null
+++ b/gsl-1.9/randist/pascal.c
@@ -0,0 +1,50 @@
+/* randist/pascal.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+
+/* The Pascal distribution is a negative binomial with valued integer n
+
+ prob(k) = (n - 1 + k)!/(n!(k - 1)!) * p^n (1-p)^k for k = 0, 1, ..., n
+
+ */
+
+unsigned int
+gsl_ran_pascal (const gsl_rng * r, double p, unsigned int n)
+{
+ /* This is a separate interface for the pascal distribution so that
+ it can be optimized differently from the negative binomial in
+ future.
+
+ e.g. if n < 10 it might be faster to generate the Pascal
+ distributions as the sum of geometric variates directly. */
+
+ unsigned int k = gsl_ran_negative_binomial (r, p, (double) n);
+ return k;
+}
+
+double
+gsl_ran_pascal_pdf (const unsigned int k, const double p, unsigned int n)
+{
+ double P = gsl_ran_negative_binomial_pdf (k, p, (double) n);
+ return P;
+}
diff --git a/gsl-1.9/randist/poisson.c b/gsl-1.9/randist/poisson.c
new file mode 100644
index 0000000..34501f8
--- /dev/null
+++ b/gsl-1.9/randist/poisson.c
@@ -0,0 +1,93 @@
+/* randist/poisson.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_sf_gamma.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+
+/* The poisson distribution has the form
+
+ p(n) = (mu^n / n!) exp(-mu)
+
+ for n = 0, 1, 2, ... . The method used here is the one from Knuth. */
+
+unsigned int
+gsl_ran_poisson (const gsl_rng * r, double mu)
+{
+ double emu;
+ double prod = 1.0;
+ unsigned int k = 0;
+
+ while (mu > 10)
+ {
+ unsigned int m = mu * (7.0 / 8.0);
+
+ double X = gsl_ran_gamma_int (r, m);
+
+ if (X >= mu)
+ {
+ return k + gsl_ran_binomial (r, mu / X, m - 1);
+ }
+ else
+ {
+ k += m;
+ mu -= X;
+ }
+ }
+
+ /* This following method works well when mu is small */
+
+ emu = exp (-mu);
+
+ do
+ {
+ prod *= gsl_rng_uniform (r);
+ k++;
+ }
+ while (prod > emu);
+
+ return k - 1;
+
+}
+
+void
+gsl_ran_poisson_array (const gsl_rng * r, size_t n, unsigned int array[],
+ double mu)
+{
+ size_t i;
+
+ for (i = 0; i < n; i++)
+ {
+ array[i] = gsl_ran_poisson (r, mu);
+ }
+
+ return;
+}
+
+double
+gsl_ran_poisson_pdf (const unsigned int k, const double mu)
+{
+ double p;
+ double lf = gsl_sf_lnfact (k);
+
+ p = exp (log (mu) * k - lf - mu);
+ return p;
+}
diff --git a/gsl-1.9/randist/rayleigh.c b/gsl-1.9/randist/rayleigh.c
new file mode 100644
index 0000000..fd365bf
--- /dev/null
+++ b/gsl-1.9/randist/rayleigh.c
@@ -0,0 +1,85 @@
+/* randist/rayleigh.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+
+/* The Rayleigh distribution has the form
+
+ p(x) dx = (x / sigma^2) exp(-x^2/(2 sigma^2)) dx
+
+ for x = 0 ... +infty */
+
+double
+gsl_ran_rayleigh (const gsl_rng * r, const double sigma)
+{
+ double u = gsl_rng_uniform_pos (r);
+
+ return sigma * sqrt(-2.0 * log (u));
+}
+
+double
+gsl_ran_rayleigh_pdf (const double x, const double sigma)
+{
+ if (x < 0)
+ {
+ return 0 ;
+ }
+ else
+ {
+ double u = x / sigma ;
+ double p = (u / sigma) * exp(-u * u / 2.0) ;
+
+ return p;
+ }
+}
+
+/* The Rayleigh tail distribution has the form
+
+ p(x) dx = (x / sigma^2) exp((a^2 - x^2)/(2 sigma^2)) dx
+
+ for x = a ... +infty */
+
+double
+gsl_ran_rayleigh_tail (const gsl_rng * r, const double a, const double sigma)
+{
+ double u = gsl_rng_uniform_pos (r);
+
+ return sqrt(a * a - 2.0 * sigma * sigma * log (u));
+}
+
+double
+gsl_ran_rayleigh_tail_pdf (const double x, const double a, const double sigma)
+{
+ if (x < a)
+ {
+ return 0 ;
+ }
+ else
+ {
+ double u = x / sigma ;
+ double v = a / sigma ;
+
+ double p = (u / sigma) * exp((v + u) * (v - u) / 2.0) ;
+
+ return p;
+ }
+}
diff --git a/gsl-1.9/randist/shuffle.c b/gsl-1.9/randist/shuffle.c
new file mode 100644
index 0000000..2ab34d7
--- /dev/null
+++ b/gsl-1.9/randist/shuffle.c
@@ -0,0 +1,124 @@
+/* randist/shuffle.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <math.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+
+/* Inline swap and copy functions for moving objects around */
+
+static inline
+void swap (void * base, size_t size, size_t i, size_t j)
+{
+ register char * a = size * i + (char *) base ;
+ register char * b = size * j + (char *) base ;
+ register size_t s = size ;
+
+ if (i == j)
+ return ;
+
+ do
+ {
+ char tmp = *a;
+ *a++ = *b;
+ *b++ = tmp;
+ }
+ while (--s > 0);
+}
+
+static inline void
+copy (void * dest, size_t i, void * src, size_t j, size_t size)
+{
+ register char * a = size * i + (char *) dest ;
+ register char * b = size * j + (char *) src ;
+ register size_t s = size ;
+
+ do
+ {
+ *a++ = *b++;
+ }
+ while (--s > 0);
+}
+
+/* Randomly permute (shuffle) N indices
+
+ Supply an array x[N] with nmemb members, each of size size and on
+ return it will be shuffled into a random order. The algorithm is
+ from Knuth, SemiNumerical Algorithms, v2, p139, who cites Moses and
+ Oakford, and Durstenfeld */
+
+void
+gsl_ran_shuffle (const gsl_rng * r, void * base, size_t n, size_t size)
+{
+ size_t i ;
+
+ for (i = n - 1; i > 0; i--)
+ {
+ size_t j = gsl_rng_uniform_int(r, i+1); /* originally (i + 1) * gsl_rng_uniform (r) */
+
+ swap (base, size, i, j) ;
+ }
+}
+
+int
+gsl_ran_choose (const gsl_rng * r, void * dest, size_t k, void * src,
+ size_t n, size_t size)
+{
+ size_t i, j = 0;
+
+ /* Choose k out of n items, return an array x[] of the k items.
+ These items will prevserve the relative order of the original
+ input -- you can use shuffle() to randomize the output if you
+ wish */
+
+ if (k > n)
+ {
+ GSL_ERROR ("k is greater than n, cannot sample more than n items",
+ GSL_EINVAL) ;
+ }
+
+ for (i = 0; i < n && j < k; i++)
+ {
+ if ((n - i) * gsl_rng_uniform (r) < k - j)
+ {
+ copy (dest, j, src, i, size) ;
+ j++ ;
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+void
+gsl_ran_sample (const gsl_rng * r, void * dest, size_t k, void * src,
+ size_t n, size_t size)
+{
+ size_t i, j = 0;
+
+ /* Choose k out of n items, with replacement */
+
+ for (i = 0; i < k; i++)
+ {
+ j = gsl_rng_uniform_int (r, n); /* originally n * gsl_rng_uniform (r) */
+
+ copy (dest, i, src, j, size) ;
+ }
+}
diff --git a/gsl-1.9/randist/sphere.c b/gsl-1.9/randist/sphere.c
new file mode 100644
index 0000000..f60c3e4
--- /dev/null
+++ b/gsl-1.9/randist/sphere.c
@@ -0,0 +1,119 @@
+/* randist/sphere.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+
+void
+gsl_ran_dir_2d (const gsl_rng * r, double *x, double *y)
+{
+ /* This method avoids trig, but it does take an average of 8/pi =
+ * 2.55 calls to the RNG, instead of one for the direct
+ * trigonometric method. */
+
+ double u, v, s;
+ do
+ {
+ u = -1 + 2 * gsl_rng_uniform (r);
+ v = -1 + 2 * gsl_rng_uniform (r);
+ s = u * u + v * v;
+ }
+ while (s > 1.0 || s == 0.0);
+
+ /* This is the Von Neumann trick. See Knuth, v2, 3rd ed, p140
+ * (exercise 23). Note, no sin, cos, or sqrt ! */
+
+ *x = (u * u - v * v) / s;
+ *y = 2 * u * v / s;
+
+ /* Here is the more straightforward approach,
+ * s = sqrt (s); *x = u / s; *y = v / s;
+ * It has fewer total operations, but one of them is a sqrt */
+}
+
+void
+gsl_ran_dir_2d_trig_method (const gsl_rng * r, double *x, double *y)
+{
+ /* This is the obvious solution... */
+ /* It ain't clever, but since sin/cos are often hardware accelerated,
+ * it can be faster -- it is on my home Pentium -- than von Neumann's
+ * solution, or slower -- as it is on my Sun Sparc 20 at work
+ */
+ double t = 6.2831853071795864 * gsl_rng_uniform (r); /* 2*PI */
+ *x = cos (t);
+ *y = sin (t);
+}
+
+void
+gsl_ran_dir_3d (const gsl_rng * r, double *x, double *y, double *z)
+{
+ double s, a;
+
+ /* This is a variant of the algorithm for computing a random point
+ * on the unit sphere; the algorithm is suggested in Knuth, v2,
+ * 3rd ed, p136; and attributed to Robert E Knop, CACM, 13 (1970),
+ * 326.
+ */
+
+ /* Begin with the polar method for getting x,y inside a unit circle
+ */
+ do
+ {
+ *x = -1 + 2 * gsl_rng_uniform (r);
+ *y = -1 + 2 * gsl_rng_uniform (r);
+ s = (*x) * (*x) + (*y) * (*y);
+ }
+ while (s > 1.0);
+
+ *z = -1 + 2 * s; /* z uniformly distributed from -1 to 1 */
+ a = 2 * sqrt (1 - s); /* factor to adjust x,y so that x^2+y^2
+ * is equal to 1-z^2 */
+ *x *= a;
+ *y *= a;
+}
+
+void
+gsl_ran_dir_nd (const gsl_rng * r, size_t n, double *x)
+{
+ double d;
+ size_t i;
+ /* See Knuth, v2, 3rd ed, p135-136. The method is attributed to
+ * G. W. Brown, in Modern Mathematics for the Engineer (1956).
+ * The idea is that gaussians G(x) have the property that
+ * G(x)G(y)G(z)G(...) is radially symmetric, a function only
+ * r = sqrt(x^2+y^2+...)
+ */
+ d = 0;
+ do
+ {
+ for (i = 0; i < n; ++i)
+ {
+ x[i] = gsl_ran_gaussian (r, 1.0);
+ d += x[i] * x[i];
+ }
+ }
+ while (d == 0);
+ d = sqrt (d);
+ for (i = 0; i < n; ++i)
+ {
+ x[i] /= d;
+ }
+}
diff --git a/gsl-1.9/randist/tdist.c b/gsl-1.9/randist/tdist.c
new file mode 100644
index 0000000..f2703c8
--- /dev/null
+++ b/gsl-1.9/randist/tdist.c
@@ -0,0 +1,80 @@
+/* randist/tdist.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_sf_gamma.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+
+/* The t-distribution has the form
+
+ p(x) dx = (Gamma((nu + 1)/2)/(sqrt(pi nu) Gamma(nu/2))
+ * (1 + (x^2)/nu)^-((nu + 1)/2) dx
+
+ The method used here is the one described in Knuth */
+
+double
+gsl_ran_tdist (const gsl_rng * r, const double nu)
+{
+ if (nu <= 2)
+ {
+ double Y1 = gsl_ran_ugaussian (r);
+ double Y2 = gsl_ran_chisq (r, nu);
+
+ double t = Y1 / sqrt (Y2 / nu);
+
+ return t;
+ }
+ else
+ {
+ double Y1, Y2, Z, t;
+ do
+ {
+ Y1 = gsl_ran_ugaussian (r);
+ Y2 = gsl_ran_exponential (r, 1 / (nu/2 - 1));
+
+ Z = Y1 * Y1 / (nu - 2);
+ }
+ while (1 - Z < 0 || exp (-Y2 - Z) > (1 - Z));
+
+ /* Note that there is a typo in Knuth's formula, the line below
+ is taken from the original paper of Marsaglia, Mathematics of
+ Computation, 34 (1980), p 234-256 */
+
+ t = Y1 / sqrt ((1 - 2 / nu) * (1 - Z));
+ return t;
+ }
+}
+
+double
+gsl_ran_tdist_pdf (const double x, const double nu)
+{
+ double p;
+
+ double lg1 = gsl_sf_lngamma (nu / 2);
+ double lg2 = gsl_sf_lngamma ((nu + 1) / 2);
+
+ p = ((exp (lg2 - lg1) / sqrt (M_PI * nu))
+ * pow ((1 + x * x / nu), -(nu + 1) / 2));
+ return p;
+}
+
+
diff --git a/gsl-1.9/randist/test.c b/gsl-1.9/randist/test.c
new file mode 100644
index 0000000..540d0eb
--- /dev/null
+++ b/gsl-1.9/randist/test.c
@@ -0,0 +1,1968 @@
+/* randist/test.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_randist.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+
+#define N 100000
+
+/* Convient test dimension for multivariant distributions */
+#define MULTI_DIM 10
+
+
+void testMoments (double (*f) (void), const char *name,
+ double a, double b, double p);
+void testPDF (double (*f) (void), double (*pdf) (double), const char *name);
+void testDiscretePDF (double (*f) (void), double (*pdf) (unsigned int),
+ const char *name);
+
+void test_shuffle (void);
+void test_choose (void);
+double test_beta (void);
+double test_beta_pdf (double x);
+double test_bernoulli (void);
+double test_bernoulli_pdf (unsigned int n);
+
+double test_binomial (void);
+double test_binomial_pdf (unsigned int n);
+double test_binomial_large (void);
+double test_binomial_large_pdf (unsigned int n);
+double test_binomial_huge (void);
+double test_binomial_huge_pdf (unsigned int n);
+double test_binomial0 (void);
+double test_binomial0_pdf (unsigned int n);
+double test_binomial1 (void);
+double test_binomial1_pdf (unsigned int n);
+
+
+
+double test_binomial_knuth (void);
+double test_binomial_knuth_pdf (unsigned int n);
+double test_binomial_large_knuth (void);
+double test_binomial_large_knuth_pdf (unsigned int n);
+double test_binomial_huge_knuth (void);
+double test_binomial_huge_knuth_pdf (unsigned int n);
+
+double test_cauchy (void);
+double test_cauchy_pdf (double x);
+double test_chisq (void);
+double test_chisq_pdf (double x);
+double test_dirichlet (void);
+double test_dirichlet_pdf (double x);
+void test_dirichlet_moments (void);
+double test_discrete1 (void);
+double test_discrete1_pdf (unsigned int n);
+double test_discrete2 (void);
+double test_discrete2_pdf (unsigned int n);
+double test_discrete3 (void);
+double test_discrete3_pdf (unsigned int n);
+double test_erlang (void);
+double test_erlang_pdf (double x);
+double test_exponential (void);
+double test_exponential_pdf (double x);
+double test_exppow0 (void);
+double test_exppow0_pdf (double x);
+double test_exppow1 (void);
+double test_exppow1_pdf (double x);
+double test_exppow1a (void);
+double test_exppow1a_pdf (double x);
+double test_exppow2 (void);
+double test_exppow2_pdf (double x);
+double test_exppow2a (void);
+double test_exppow2a_pdf (double x);
+double test_exppow2b (void);
+double test_exppow2b_pdf (double x);
+double test_fdist (void);
+double test_fdist_pdf (double x);
+double test_flat (void);
+double test_flat_pdf (double x);
+double test_gamma (void);
+double test_gamma_pdf (double x);
+double test_gamma1 (void);
+double test_gamma1_pdf (double x);
+double test_gamma_int (void);
+double test_gamma_int_pdf (double x);
+double test_gamma_large (void);
+double test_gamma_large_pdf (double x);
+double test_gamma_small (void);
+double test_gamma_small_pdf (double x);
+double test_gamma_mt (void);
+double test_gamma_mt_pdf (double x);
+double test_gamma_mt1 (void);
+double test_gamma_mt1_pdf (double x);
+double test_gamma_mt_int (void);
+double test_gamma_mt_int_pdf (double x);
+double test_gamma_mt_large (void);
+double test_gamma_mt_large_pdf (double x);
+double test_gamma_mt_small (void);
+double test_gamma_mt_small_pdf (double x);
+double test_gaussian (void);
+double test_gaussian_pdf (double x);
+double test_gaussian_ratio_method (void);
+double test_gaussian_ratio_method_pdf (double x);
+double test_gaussian_ziggurat (void);
+double test_gaussian_ziggurat_pdf (double x);
+double test_gaussian_tail (void);
+double test_gaussian_tail_pdf (double x);
+double test_gaussian_tail1 (void);
+double test_gaussian_tail1_pdf (double x);
+double test_gaussian_tail2 (void);
+double test_gaussian_tail2_pdf (double x);
+double test_ugaussian (void);
+double test_ugaussian_pdf (double x);
+double test_ugaussian_ratio_method (void);
+double test_ugaussian_ratio_method_pdf (double x);
+double test_ugaussian_tail (void);
+double test_ugaussian_tail_pdf (double x);
+double test_bivariate_gaussian1 (void);
+double test_bivariate_gaussian1_pdf (double x);
+double test_bivariate_gaussian2 (void);
+double test_bivariate_gaussian2_pdf (double x);
+double test_bivariate_gaussian3 (void);
+double test_bivariate_gaussian3_pdf (double x);
+double test_bivariate_gaussian4 (void);
+double test_bivariate_gaussian4_pdf (double x);
+double test_gumbel1 (void);
+double test_gumbel1_pdf (double x);
+double test_gumbel2 (void);
+double test_gumbel2_pdf (double x);
+double test_geometric (void);
+double test_geometric_pdf (unsigned int x);
+double test_geometric1 (void);
+double test_geometric1_pdf (unsigned int x);
+double test_hypergeometric1 (void);
+double test_hypergeometric1_pdf (unsigned int x);
+double test_hypergeometric2 (void);
+double test_hypergeometric2_pdf (unsigned int x);
+double test_hypergeometric3 (void);
+double test_hypergeometric3_pdf (unsigned int x);
+double test_hypergeometric4 (void);
+double test_hypergeometric4_pdf (unsigned int x);
+double test_hypergeometric5 (void);
+double test_hypergeometric5_pdf (unsigned int x);
+double test_hypergeometric6 (void);
+double test_hypergeometric6_pdf (unsigned int x);
+double test_landau (void);
+double test_landau_pdf (double x);
+double test_levy1 (void);
+double test_levy1_pdf (double x);
+double test_levy2 (void);
+double test_levy2_pdf (double x);
+double test_levy1a (void);
+double test_levy1a_pdf (double x);
+double test_levy2a (void);
+double test_levy2a_pdf (double x);
+double test_levy_skew1 (void);
+double test_levy_skew1_pdf (double x);
+double test_levy_skew2 (void);
+double test_levy_skew2_pdf (double x);
+double test_levy_skew1a (void);
+double test_levy_skew1a_pdf (double x);
+double test_levy_skew2a (void);
+double test_levy_skew2a_pdf (double x);
+double test_levy_skew1b (void);
+double test_levy_skew1b_pdf (double x);
+double test_levy_skew2b (void);
+double test_levy_skew2b_pdf (double x);
+double test_logistic (void);
+double test_logistic_pdf (double x);
+double test_lognormal (void);
+double test_lognormal_pdf (double x);
+double test_logarithmic (void);
+double test_logarithmic_pdf (unsigned int n);
+double test_multinomial (void);
+double test_multinomial_pdf (unsigned int n);
+double test_multinomial_large (void);
+double test_multinomial_large_pdf (unsigned int n);
+void test_multinomial_moments (void);
+double test_negative_binomial (void);
+double test_negative_binomial_pdf (unsigned int n);
+double test_pascal (void);
+double test_pascal_pdf (unsigned int n);
+double test_pareto (void);
+double test_pareto_pdf (double x);
+double test_poisson (void);
+double test_poisson_pdf (unsigned int x);
+double test_poisson_large (void);
+double test_poisson_large_pdf (unsigned int x);
+double test_dir2d (void);
+double test_dir2d_pdf (double x);
+double test_dir2d_trig_method (void);
+double test_dir2d_trig_method_pdf (double x);
+double test_dir3dxy (void);
+double test_dir3dxy_pdf (double x);
+double test_dir3dyz (void);
+double test_dir3dyz_pdf (double x);
+double test_dir3dzx (void);
+double test_dir3dzx_pdf (double x);
+double test_rayleigh (void);
+double test_rayleigh_pdf (double x);
+double test_rayleigh_tail (void);
+double test_rayleigh_tail_pdf (double x);
+double test_tdist1 (void);
+double test_tdist1_pdf (double x);
+double test_tdist2 (void);
+double test_tdist2_pdf (double x);
+double test_laplace (void);
+double test_laplace_pdf (double x);
+double test_weibull (void);
+double test_weibull_pdf (double x);
+double test_weibull1 (void);
+double test_weibull1_pdf (double x);
+
+gsl_rng *r_global;
+
+static gsl_ran_discrete_t *g1 = NULL;
+static gsl_ran_discrete_t *g2 = NULL;
+static gsl_ran_discrete_t *g3 = NULL;
+
+int
+main (void)
+{
+ gsl_ieee_env_setup ();
+
+ gsl_rng_env_setup ();
+ r_global = gsl_rng_alloc (gsl_rng_default);
+
+#define FUNC(x) test_ ## x, "test gsl_ran_" #x
+#define FUNC2(x) test_ ## x, test_ ## x ## _pdf, "test gsl_ran_" #x
+
+ test_shuffle ();
+ test_choose ();
+
+ testMoments (FUNC (ugaussian), 0.0, 100.0, 0.5);
+ testMoments (FUNC (ugaussian), -1.0, 1.0, 0.6826895);
+ testMoments (FUNC (ugaussian), 3.0, 3.5, 0.0011172689);
+ testMoments (FUNC (ugaussian_tail), 3.0, 3.5, 0.0011172689 / 0.0013498981);
+ testMoments (FUNC (exponential), 0.0, 1.0, 1 - exp (-0.5));
+ testMoments (FUNC (cauchy), 0.0, 10000.0, 0.5);
+
+ testMoments (FUNC (discrete1), -0.5, 0.5, 0.59);
+ testMoments (FUNC (discrete1), 0.5, 1.5, 0.40);
+ testMoments (FUNC (discrete1), 1.5, 3.5, 0.01);
+
+ testMoments (FUNC (discrete2), -0.5, 0.5, 1.0/45.0 );
+ testMoments (FUNC (discrete2), 8.5, 9.5, 0 );
+
+ testMoments (FUNC (discrete3), -0.5, 0.5, 0.05 );
+ testMoments (FUNC (discrete3), 0.5, 1.5, 0.05 );
+ testMoments (FUNC (discrete3), -0.5, 9.5, 0.5 );
+
+ test_dirichlet_moments ();
+ test_multinomial_moments ();
+
+ testPDF (FUNC2 (beta));
+ testPDF (FUNC2 (cauchy));
+ testPDF (FUNC2 (chisq));
+ testPDF (FUNC2 (dirichlet));
+ testPDF (FUNC2 (erlang));
+ testPDF (FUNC2 (exponential));
+
+ testPDF (FUNC2 (exppow0));
+ testPDF (FUNC2 (exppow1));
+ testPDF (FUNC2 (exppow1a));
+ testPDF (FUNC2 (exppow2));
+ testPDF (FUNC2 (exppow2a));
+ testPDF (FUNC2 (exppow2b));
+
+ testPDF (FUNC2 (fdist));
+ testPDF (FUNC2 (flat));
+ testPDF (FUNC2 (gamma));
+ testPDF (FUNC2 (gamma1));
+ testPDF (FUNC2 (gamma_int));
+ testPDF (FUNC2 (gamma_large));
+ testPDF (FUNC2 (gamma_small));
+ testPDF (FUNC2 (gamma_mt));
+ testPDF (FUNC2 (gamma_mt1));
+ testPDF (FUNC2 (gamma_mt_int));
+ testPDF (FUNC2 (gamma_mt_large));
+ testPDF (FUNC2 (gamma_mt_small));
+ testPDF (FUNC2 (gaussian));
+ testPDF (FUNC2 (gaussian_ratio_method));
+ testPDF (FUNC2 (gaussian_ziggurat));
+ testPDF (FUNC2 (ugaussian));
+ testPDF (FUNC2 (ugaussian_ratio_method));
+ testPDF (FUNC2 (gaussian_tail));
+ testPDF (FUNC2 (gaussian_tail1));
+ testPDF (FUNC2 (gaussian_tail2));
+ testPDF (FUNC2 (ugaussian_tail));
+
+ testPDF (FUNC2 (bivariate_gaussian1));
+ testPDF (FUNC2 (bivariate_gaussian2));
+ testPDF (FUNC2 (bivariate_gaussian3));
+ testPDF (FUNC2 (bivariate_gaussian4));
+
+ testPDF (FUNC2 (gumbel1));
+ testPDF (FUNC2 (gumbel2));
+ testPDF (FUNC2 (landau));
+ testPDF (FUNC2 (levy1));
+ testPDF (FUNC2 (levy2));
+ testPDF (FUNC2 (levy1a));
+ testPDF (FUNC2 (levy2a));
+ testPDF (FUNC2 (levy_skew1));
+ testPDF (FUNC2 (levy_skew2));
+ testPDF (FUNC2 (levy_skew1a));
+ testPDF (FUNC2 (levy_skew2a));
+ testPDF (FUNC2 (levy_skew1b));
+ testPDF (FUNC2 (levy_skew2b));
+ testPDF (FUNC2 (logistic));
+ testPDF (FUNC2 (lognormal));
+ testPDF (FUNC2 (pareto));
+ testPDF (FUNC2 (rayleigh));
+ testPDF (FUNC2 (rayleigh_tail));
+ testPDF (FUNC2 (tdist1));
+ testPDF (FUNC2 (tdist2));
+ testPDF (FUNC2 (laplace));
+ testPDF (FUNC2 (weibull));
+ testPDF (FUNC2 (weibull1));
+
+ testPDF (FUNC2 (dir2d));
+ testPDF (FUNC2 (dir2d_trig_method));
+ testPDF (FUNC2 (dir3dxy));
+ testPDF (FUNC2 (dir3dyz));
+ testPDF (FUNC2 (dir3dzx));
+
+ testDiscretePDF (FUNC2 (discrete1));
+ testDiscretePDF (FUNC2 (discrete2));
+ testDiscretePDF (FUNC2 (discrete3));
+ testDiscretePDF (FUNC2 (poisson));
+ testDiscretePDF (FUNC2 (poisson_large));
+ testDiscretePDF (FUNC2 (bernoulli));
+ testDiscretePDF (FUNC2 (binomial));
+ testDiscretePDF (FUNC2 (binomial0));
+ testDiscretePDF (FUNC2 (binomial1));
+ testDiscretePDF (FUNC2 (binomial_knuth));
+ testDiscretePDF (FUNC2 (binomial_large));
+ testDiscretePDF (FUNC2 (binomial_large_knuth));
+ testDiscretePDF (FUNC2 (binomial_huge));
+ testDiscretePDF (FUNC2 (binomial_huge_knuth));
+ testDiscretePDF (FUNC2 (geometric));
+ testDiscretePDF (FUNC2 (geometric1));
+ testDiscretePDF (FUNC2 (hypergeometric1));
+ testDiscretePDF (FUNC2 (hypergeometric2));
+ testDiscretePDF (FUNC2 (hypergeometric3));
+ testDiscretePDF (FUNC2 (hypergeometric4));
+ testDiscretePDF (FUNC2 (hypergeometric5));
+ testDiscretePDF (FUNC2 (hypergeometric6));
+ testDiscretePDF (FUNC2 (logarithmic));
+ testDiscretePDF (FUNC2 (multinomial));
+ testDiscretePDF (FUNC2 (multinomial_large));
+ testDiscretePDF (FUNC2 (negative_binomial));
+ testDiscretePDF (FUNC2 (pascal));
+
+ gsl_rng_free (r_global);
+ gsl_ran_discrete_free (g1);
+ gsl_ran_discrete_free (g2);
+ gsl_ran_discrete_free (g3);
+
+ exit (gsl_test_summary ());
+}
+
+void
+test_shuffle (void)
+{
+ double count[10][10];
+ int x[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
+ int i, j, status = 0;
+
+ for (i = 0; i < 10; i++)
+ {
+ for (j = 0; j < 10; j++)
+ {
+ count[i][j] = 0;
+ }
+ }
+
+ for (i = 0; i < N; i++)
+ {
+ for (j = 0; j < 10; j++)
+ x[j] = j;
+
+ gsl_ran_shuffle (r_global, x, 10, sizeof (int));
+
+ for (j = 0; j < 10; j++)
+ count[x[j]][j]++;
+ }
+
+ for (i = 0; i < 10; i++)
+ {
+ for (j = 0; j < 10; j++)
+ {
+ double expected = N / 10.0;
+ double d = fabs (count[i][j] - expected);
+ double sigma = d / sqrt (expected);
+ if (sigma > 5 && d > 1)
+ {
+ status = 1;
+ gsl_test (status,
+ "gsl_ran_shuffle %d,%d (%g observed vs %g expected)",
+ i, j, count[i][j] / N, 0.1);
+ }
+ }
+ }
+
+ gsl_test (status, "gsl_ran_shuffle on {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}");
+
+}
+
+void
+test_choose (void)
+{
+ double count[10];
+ int x[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
+ int y[3] = { 0, 1, 2 };
+ int i, j, status = 0;
+
+ for (i = 0; i < 10; i++)
+ {
+ count[i] = 0;
+ }
+
+ for (i = 0; i < N; i++)
+ {
+ for (j = 0; j < 10; j++)
+ x[j] = j;
+
+ gsl_ran_choose (r_global, y, 3, x, 10, sizeof (int));
+
+ for (j = 0; j < 3; j++)
+ count[y[j]]++;
+ }
+
+ for (i = 0; i < 10; i++)
+ {
+ double expected = 3.0 * N / 10.0;
+ double d = fabs (count[i] - expected);
+ double sigma = d / sqrt (expected);
+ if (sigma > 5 && d > 1)
+ {
+ status = 1;
+ gsl_test (status,
+ "gsl_ran_choose %d (%g observed vs %g expected)",
+ i, count[i] / N, 0.1);
+ }
+ }
+
+ gsl_test (status, "gsl_ran_choose (3) on {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}");
+
+}
+
+
+
+
+void
+testMoments (double (*f) (void), const char *name,
+ double a, double b, double p)
+{
+ int i;
+ double count = 0, expected, sigma;
+ int status;
+
+ for (i = 0; i < N; i++)
+ {
+ double r = f ();
+ if (r < b && r > a)
+ count++;
+ }
+
+ expected = p * N;
+ sigma = fabs (count - expected) / sqrt (expected);
+
+ status = (sigma > 3);
+
+ gsl_test (status, "%s [%g,%g] (%g observed vs %g expected)",
+ name, a, b, count / N, p);
+}
+
+#define BINS 100
+
+void
+testPDF (double (*f) (void), double (*pdf) (double), const char *name)
+{
+ double count[BINS], p[BINS];
+ double a = -5.0, b = +5.0;
+ double dx = (b - a) / BINS;
+ int i, j, status = 0, status_i = 0;
+
+ for (i = 0; i < BINS; i++)
+ count[i] = 0;
+
+ for (i = 0; i < N; i++)
+ {
+ double r = f ();
+ if (r < b && r > a)
+ {
+ j = (int) ((r - a) / dx);
+ count[j]++;
+ }
+ }
+
+ for (i = 0; i < BINS; i++)
+ {
+ /* Compute an approximation to the integral of p(x) from x to
+ x+dx using Simpson's rule */
+
+ double x = a + i * dx;
+#define STEPS 100
+ double sum = 0;
+
+ if (fabs (x) < 1e-10) /* hit the origin exactly */
+ x = 0.0;
+
+ for (j = 1; j < STEPS; j++)
+ sum += pdf (x + j * dx / STEPS);
+
+ p[i] = 0.5 * (pdf (x) + 2 * sum + pdf (x + dx - 1e-7)) * dx / STEPS;
+ }
+
+ for (i = 0; i < BINS; i++)
+ {
+ double x = a + i * dx;
+ double d = fabs (count[i] - N * p[i]);
+ if (p[i] != 0)
+ {
+ double s = d / sqrt (N * p[i]);
+ status_i = (s > 5) && (d > 2);
+ }
+ else
+ {
+ status_i = (count[i] != 0);
+ }
+ status |= status_i;
+ if (status_i)
+ gsl_test (status_i, "%s [%g,%g) (%g/%d=%g observed vs %g expected)",
+ name, x, x + dx, count[i], N, count[i] / N, p[i]);
+ }
+
+ if (status == 0)
+ gsl_test (status, "%s, sampling against pdf over range [%g,%g) ",
+ name, a, b);
+}
+
+void
+testDiscretePDF (double (*f) (void), double (*pdf) (unsigned int),
+ const char *name)
+{
+ double count[BINS], p[BINS];
+ unsigned int i;
+ int status = 0, status_i = 0;
+
+ for (i = 0; i < BINS; i++)
+ count[i] = 0;
+
+ for (i = 0; i < N; i++)
+ {
+ int r = (int) (f ());
+ if (r >= 0 && r < BINS)
+ count[r]++;
+ }
+
+ for (i = 0; i < BINS; i++)
+ p[i] = pdf (i);
+
+ for (i = 0; i < BINS; i++)
+ {
+ double d = fabs (count[i] - N * p[i]);
+ if (p[i] != 0)
+ {
+ double s = d / sqrt (N * p[i]);
+ status_i = (s > 5) && (d > 1);
+ }
+ else
+ {
+ status_i = (count[i] != 0);
+ }
+ status |= status_i;
+ if (status_i)
+ gsl_test (status_i, "%s i=%d (%g observed vs %g expected)",
+ name, i, count[i] / N, p[i]);
+ }
+
+ if (status == 0)
+ gsl_test (status, "%s, sampling against pdf over range [%d,%d) ",
+ name, 0, BINS);
+}
+
+
+
+double
+test_beta (void)
+{
+ return gsl_ran_beta (r_global, 2.0, 3.0);
+}
+
+double
+test_beta_pdf (double x)
+{
+ return gsl_ran_beta_pdf (x, 2.0, 3.0);
+}
+
+double
+test_bernoulli (void)
+{
+ return gsl_ran_bernoulli (r_global, 0.3);
+}
+
+double
+test_bernoulli_pdf (unsigned int n)
+{
+ return gsl_ran_bernoulli_pdf (n, 0.3);
+}
+
+double
+test_binomial (void)
+{
+ return gsl_ran_binomial (r_global, 0.3, 5);
+}
+
+double
+test_binomial_pdf (unsigned int n)
+{
+ return gsl_ran_binomial_pdf (n, 0.3, 5);
+}
+
+double
+test_binomial0 (void)
+{
+ return gsl_ran_binomial (r_global, 0, 8);
+}
+
+double
+test_binomial0_pdf (unsigned int n)
+{
+ return gsl_ran_binomial_pdf (n, 0, 8);
+}
+
+double
+test_binomial1 (void)
+{
+ return gsl_ran_binomial (r_global, 1, 8);
+}
+
+double
+test_binomial1_pdf (unsigned int n)
+{
+ return gsl_ran_binomial_pdf (n, 1, 8);
+}
+
+double
+test_binomial_knuth (void)
+{
+ return gsl_ran_binomial_knuth (r_global, 0.3, 5);
+}
+
+double
+test_binomial_knuth_pdf (unsigned int n)
+{
+ return gsl_ran_binomial_pdf (n, 0.3, 5);
+}
+
+
+double
+test_binomial_large (void)
+{
+ return gsl_ran_binomial (r_global, 0.3, 55);
+}
+
+double
+test_binomial_large_pdf (unsigned int n)
+{
+ return gsl_ran_binomial_pdf (n, 0.3, 55);
+}
+
+double
+test_binomial_large_knuth (void)
+{
+ return gsl_ran_binomial_knuth (r_global, 0.3, 55);
+}
+
+double
+test_binomial_large_knuth_pdf (unsigned int n)
+{
+ return gsl_ran_binomial_pdf (n, 0.3, 55);
+}
+
+
+double
+test_binomial_huge (void)
+{
+ return gsl_ran_binomial (r_global, 0.3, 5500);
+}
+
+double
+test_binomial_huge_pdf (unsigned int n)
+{
+ return gsl_ran_binomial_pdf (n, 0.3, 5500);
+}
+
+double
+test_binomial_huge_knuth (void)
+{
+ return gsl_ran_binomial_knuth (r_global, 0.3, 5500);
+}
+
+double
+test_binomial_huge_knuth_pdf (unsigned int n)
+{
+ return gsl_ran_binomial_pdf (n, 0.3, 5500);
+}
+
+double
+test_cauchy (void)
+{
+ return gsl_ran_cauchy (r_global, 2.0);
+}
+
+double
+test_cauchy_pdf (double x)
+{
+ return gsl_ran_cauchy_pdf (x, 2.0);
+}
+
+double
+test_chisq (void)
+{
+ return gsl_ran_chisq (r_global, 13.0);
+}
+
+double
+test_chisq_pdf (double x)
+{
+ return gsl_ran_chisq_pdf (x, 13.0);
+}
+
+double
+test_dir2d (void)
+{
+ double x = 0, y = 0, theta;
+ gsl_ran_dir_2d (r_global, &x, &y);
+ theta = atan2 (x, y);
+ return theta;
+}
+
+double
+test_dir2d_pdf (double x)
+{
+ if (x > -M_PI && x <= M_PI)
+ {
+ return 1 / (2 * M_PI);
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+double
+test_dir2d_trig_method (void)
+{
+ double x = 0, y = 0, theta;
+ gsl_ran_dir_2d_trig_method (r_global, &x, &y);
+ theta = atan2 (x, y);
+ return theta;
+}
+
+double
+test_dir2d_trig_method_pdf (double x)
+{
+ if (x > -M_PI && x <= M_PI)
+ {
+ return 1 / (2 * M_PI);
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+double
+test_dir3dxy (void)
+{
+ double x = 0, y = 0, z = 0, theta;
+ gsl_ran_dir_3d (r_global, &x, &y, &z);
+ theta = atan2 (x, y);
+ return theta;
+}
+
+double
+test_dir3dxy_pdf (double x)
+{
+ if (x > -M_PI && x <= M_PI)
+ {
+ return 1 / (2 * M_PI);
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+double
+test_dir3dyz (void)
+{
+ double x = 0, y = 0, z = 0, theta;
+ gsl_ran_dir_3d (r_global, &x, &y, &z);
+ theta = atan2 (y, z);
+ return theta;
+}
+
+double
+test_dir3dyz_pdf (double x)
+{
+ if (x > -M_PI && x <= M_PI)
+ {
+ return 1 / (2 * M_PI);
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+double
+test_dir3dzx (void)
+{
+ double x = 0, y = 0, z = 0, theta;
+ gsl_ran_dir_3d (r_global, &x, &y, &z);
+ theta = atan2 (z, x);
+ return theta;
+}
+
+double
+test_dir3dzx_pdf (double x)
+{
+ if (x > -M_PI && x <= M_PI)
+ {
+ return 1 / (2 * M_PI);
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+double
+test_dirichlet (void)
+{
+ /* This is a bit of a lame test, since when K=2, the Dirichlet distribution
+ becomes a beta distribution */
+ size_t K = 2;
+ double alpha[2] = { 2.5, 5.0 };
+ double theta[2] = { 0.0, 0.0 };
+
+ gsl_ran_dirichlet (r_global, K, alpha, theta);
+
+ return theta[0];
+}
+
+double
+test_dirichlet_pdf (double x)
+{
+ size_t K = 2;
+ double alpha[2] = { 2.5, 5.0 };
+ double theta[2];
+
+ if (x <= 0.0 || x >= 1.0)
+ return 0.0; /* Out of range */
+
+ theta[0] = x;
+ theta[1] = 1.0 - x;
+
+ return gsl_ran_dirichlet_pdf (K, alpha, theta);
+}
+
+
+/* Check that the observed means of the Dirichlet variables are
+ within reasonable statistical errors of their correct values. */
+
+#define DIRICHLET_K 10
+
+void
+test_dirichlet_moments (void)
+{
+ double alpha[DIRICHLET_K];
+ double theta[DIRICHLET_K];
+ double theta_sum[DIRICHLET_K];
+
+ double alpha_sum = 0.0;
+ double mean, obs_mean, sd, sigma;
+ int status, k, n;
+
+ for (k = 0; k < DIRICHLET_K; k++)
+ {
+ alpha[k] = gsl_ran_exponential (r_global, 0.1);
+ alpha_sum += alpha[k];
+ theta_sum[k] = 0.0;
+ }
+
+ for (n = 0; n < N; n++)
+ {
+ gsl_ran_dirichlet (r_global, DIRICHLET_K, alpha, theta);
+ for (k = 0; k < DIRICHLET_K; k++)
+ theta_sum[k] += theta[k];
+ }
+
+ for (k = 0; k < DIRICHLET_K; k++)
+ {
+ mean = alpha[k] / alpha_sum;
+ sd =
+ sqrt ((alpha[k] * (1. - alpha[k] / alpha_sum)) /
+ (alpha_sum * (alpha_sum + 1.)));
+ obs_mean = theta_sum[k] / N;
+ sigma = sqrt ((double) N) * fabs (mean - obs_mean) / sd;
+
+ status = (sigma > 3.0);
+
+ gsl_test (status,
+ "test gsl_ran_dirichlet: mean (%g observed vs %g expected)",
+ obs_mean, mean);
+ }
+}
+
+
+/* Check that the observed means of the multinomial variables are
+ within reasonable statistical errors of their correct values. */
+
+void
+test_multinomial_moments (void)
+{
+ const unsigned int sum_n = 100;
+
+ const double p[MULTI_DIM] ={ 0.2, 0.20, 0.17, 0.14, 0.12,
+ 0.07, 0.05, 0.02, 0.02, 0.01 };
+
+ unsigned int x[MULTI_DIM];
+ double x_sum[MULTI_DIM];
+
+ double mean, obs_mean, sd, sigma;
+ int status, k, n;
+
+ for (k = 0; k < MULTI_DIM; k++)
+ x_sum[k] =0.0;
+
+ for (n = 0; n < N; n++)
+ {
+ gsl_ran_multinomial (r_global, MULTI_DIM, sum_n, p, x);
+ for (k = 0; k < MULTI_DIM; k++)
+ x_sum[k] += x[k];
+ }
+
+ for (k = 0; k < MULTI_DIM; k++)
+ {
+ mean = p[k] * sum_n;
+ sd = p[k] * (1.-p[k]) * sum_n;
+
+ obs_mean = x_sum[k] / N;
+ sigma = sqrt ((double) N) * fabs (mean - obs_mean) / sd;
+
+ status = (sigma > 3.0);
+
+ gsl_test (status,
+ "test gsl_ran_multinomial: mean (%g observed vs %g expected)",
+ obs_mean, mean);
+ }
+}
+
+
+double
+test_discrete1 (void)
+{
+ static double P[3] = { 0.59, 0.4, 0.01 };
+ if (g1 == NULL)
+ {
+ g1 = gsl_ran_discrete_preproc (3, P);
+ }
+ return gsl_ran_discrete (r_global, g1);
+}
+
+double
+test_discrete1_pdf (unsigned int n)
+{
+ return gsl_ran_discrete_pdf ((size_t) n, g1);
+}
+
+double
+test_discrete2 (void)
+{
+ static double P[10] = { 1, 9, 3, 4, 5, 8, 6, 7, 2, 0 };
+ if (g2 == NULL)
+ {
+ g2 = gsl_ran_discrete_preproc (10, P);
+ }
+ return gsl_ran_discrete (r_global, g2);
+}
+
+double
+test_discrete2_pdf (unsigned int n)
+{
+ return gsl_ran_discrete_pdf ((size_t) n, g2);
+}
+double
+test_discrete3 (void)
+{
+ static double P[20];
+ if (g3 == NULL)
+ { int i;
+ for (i=0; i<20; ++i) P[i]=1.0/20;
+ g3 = gsl_ran_discrete_preproc (20, P);
+ }
+ return gsl_ran_discrete (r_global, g3);
+}
+
+double
+test_discrete3_pdf (unsigned int n)
+{
+ return gsl_ran_discrete_pdf ((size_t) n, g3);
+}
+
+
+double
+test_erlang (void)
+{
+ return gsl_ran_erlang (r_global, 3.0, 4.0);
+}
+
+double
+test_erlang_pdf (double x)
+{
+ return gsl_ran_erlang_pdf (x, 3.0, 4.0);
+}
+
+double
+test_exponential (void)
+{
+ return gsl_ran_exponential (r_global, 2.0);
+}
+
+double
+test_exponential_pdf (double x)
+{
+ return gsl_ran_exponential_pdf (x, 2.0);
+}
+
+double
+test_exppow0 (void)
+{
+ return gsl_ran_exppow (r_global, 3.7, 0.3);
+}
+
+double
+test_exppow0_pdf (double x)
+{
+ return gsl_ran_exppow_pdf (x, 3.7, 0.3);
+}
+
+double
+test_exppow1 (void)
+{
+ return gsl_ran_exppow (r_global, 3.7, 1.0);
+}
+
+double
+test_exppow1_pdf (double x)
+{
+ return gsl_ran_exppow_pdf (x, 3.7, 1.0);
+}
+
+double
+test_exppow1a (void)
+{
+ return gsl_ran_exppow (r_global, 3.7, 1.9);
+}
+
+double
+test_exppow1a_pdf (double x)
+{
+ return gsl_ran_exppow_pdf (x, 3.7, 1.9);
+}
+
+double
+test_exppow2 (void)
+{
+ return gsl_ran_exppow (r_global, 3.7, 2.0);
+}
+
+double
+test_exppow2_pdf (double x)
+{
+ return gsl_ran_exppow_pdf (x, 3.7, 2.0);
+}
+
+
+double
+test_exppow2a (void)
+{
+ return gsl_ran_exppow (r_global, 3.7, 3.5);
+}
+
+double
+test_exppow2a_pdf (double x)
+{
+ return gsl_ran_exppow_pdf (x, 3.7, 3.5);
+}
+
+double
+test_exppow2b (void)
+{
+ return gsl_ran_exppow (r_global, 3.7, 7.5);
+}
+
+double
+test_exppow2b_pdf (double x)
+{
+ return gsl_ran_exppow_pdf (x, 3.7, 7.5);
+}
+
+double
+test_fdist (void)
+{
+ return gsl_ran_fdist (r_global, 3.0, 4.0);
+}
+
+double
+test_fdist_pdf (double x)
+{
+ return gsl_ran_fdist_pdf (x, 3.0, 4.0);
+}
+
+double
+test_flat (void)
+{
+ return gsl_ran_flat (r_global, 3.0, 4.0);
+}
+
+double
+test_flat_pdf (double x)
+{
+ return gsl_ran_flat_pdf (x, 3.0, 4.0);
+}
+
+double
+test_gamma (void)
+{
+ return gsl_ran_gamma (r_global, 2.5, 2.17);
+}
+
+double
+test_gamma_pdf (double x)
+{
+ return gsl_ran_gamma_pdf (x, 2.5, 2.17);
+}
+
+double
+test_gamma1 (void)
+{
+ return gsl_ran_gamma (r_global, 1.0, 2.17);
+}
+
+double
+test_gamma1_pdf (double x)
+{
+ return gsl_ran_gamma_pdf (x, 1.0, 2.17);
+}
+
+
+double
+test_gamma_int (void)
+{
+ return gsl_ran_gamma (r_global, 10.0, 2.17);
+}
+
+double
+test_gamma_int_pdf (double x)
+{
+ return gsl_ran_gamma_pdf (x, 10.0, 2.17);
+}
+
+
+double
+test_gamma_large (void)
+{
+ return gsl_ran_gamma (r_global, 20.0, 2.17);
+}
+
+double
+test_gamma_large_pdf (double x)
+{
+ return gsl_ran_gamma_pdf (x, 20.0, 2.17);
+}
+
+double
+test_gamma_small (void)
+{
+ return gsl_ran_gamma (r_global, 0.92, 2.17);
+}
+
+double
+test_gamma_small_pdf (double x)
+{
+ return gsl_ran_gamma_pdf (x, 0.92, 2.17);
+}
+
+
+double
+test_gamma_mt (void)
+{
+ return gsl_ran_gamma_mt (r_global, 2.5, 2.17);
+}
+
+double
+test_gamma_mt_pdf (double x)
+{
+ return gsl_ran_gamma_pdf (x, 2.5, 2.17);
+}
+
+double
+test_gamma_mt1 (void)
+{
+ return gsl_ran_gamma_mt (r_global, 1.0, 2.17);
+}
+
+double
+test_gamma_mt1_pdf (double x)
+{
+ return gsl_ran_gamma_pdf (x, 1.0, 2.17);
+}
+
+
+double
+test_gamma_mt_int (void)
+{
+ return gsl_ran_gamma_mt (r_global, 10.0, 2.17);
+}
+
+double
+test_gamma_mt_int_pdf (double x)
+{
+ return gsl_ran_gamma_pdf (x, 10.0, 2.17);
+}
+
+
+double
+test_gamma_mt_large (void)
+{
+ return gsl_ran_gamma_mt (r_global, 20.0, 2.17);
+}
+
+double
+test_gamma_mt_large_pdf (double x)
+{
+ return gsl_ran_gamma_pdf (x, 20.0, 2.17);
+}
+
+
+double
+test_gamma_mt_small (void)
+{
+ return gsl_ran_gamma_mt (r_global, 0.92, 2.17);
+}
+
+double
+test_gamma_mt_small_pdf (double x)
+{
+ return gsl_ran_gamma_pdf (x, 0.92, 2.17);
+}
+
+
+double
+test_gaussian (void)
+{
+ return gsl_ran_gaussian (r_global, 3.0);
+}
+
+double
+test_gaussian_pdf (double x)
+{
+ return gsl_ran_gaussian_pdf (x, 3.0);
+}
+
+double
+test_gaussian_ratio_method (void)
+{
+ return gsl_ran_gaussian_ratio_method (r_global, 3.0);
+}
+
+double
+test_gaussian_ratio_method_pdf (double x)
+{
+ return gsl_ran_gaussian_pdf (x, 3.0);
+}
+
+double
+test_gaussian_ziggurat (void)
+{
+ return gsl_ran_gaussian_ziggurat (r_global, 3.12);
+}
+
+double
+test_gaussian_ziggurat_pdf (double x)
+{
+ return gsl_ran_gaussian_pdf (x, 3.12);
+}
+
+double
+test_gaussian_tail (void)
+{
+ return gsl_ran_gaussian_tail (r_global, 1.7, 0.25);
+}
+
+double
+test_gaussian_tail_pdf (double x)
+{
+ return gsl_ran_gaussian_tail_pdf (x, 1.7, 0.25);
+}
+
+double
+test_gaussian_tail1 (void)
+{
+ return gsl_ran_gaussian_tail (r_global, -1.7, 5.0);
+}
+
+double
+test_gaussian_tail1_pdf (double x)
+{
+ return gsl_ran_gaussian_tail_pdf (x, -1.7, 5.0);
+}
+
+double
+test_gaussian_tail2 (void)
+{
+ return gsl_ran_gaussian_tail (r_global, 0.1, 2.0);
+}
+
+double
+test_gaussian_tail2_pdf (double x)
+{
+ return gsl_ran_gaussian_tail_pdf (x, 0.1, 2.0);
+}
+
+
+double
+test_ugaussian (void)
+{
+ return gsl_ran_ugaussian (r_global);
+}
+
+double
+test_ugaussian_pdf (double x)
+{
+ return gsl_ran_ugaussian_pdf (x);
+}
+
+double
+test_ugaussian_ratio_method (void)
+{
+ return gsl_ran_ugaussian_ratio_method (r_global);
+}
+
+double
+test_ugaussian_ratio_method_pdf (double x)
+{
+ return gsl_ran_ugaussian_pdf (x);
+}
+
+double
+test_ugaussian_tail (void)
+{
+ return gsl_ran_ugaussian_tail (r_global, 3.0);
+}
+
+double
+test_ugaussian_tail_pdf (double x)
+{
+ return gsl_ran_ugaussian_tail_pdf (x, 3.0);
+}
+
+double
+test_bivariate_gaussian1 (void)
+{
+ double x = 0, y = 0;
+ gsl_ran_bivariate_gaussian (r_global, 3.0, 2.0, 0.3, &x, &y);
+ return x;
+}
+
+double
+test_bivariate_gaussian1_pdf (double x)
+{
+ return gsl_ran_gaussian_pdf (x, 3.0);
+}
+
+double
+test_bivariate_gaussian2 (void)
+{
+ double x = 0, y = 0;
+ gsl_ran_bivariate_gaussian (r_global, 3.0, 2.0, 0.3, &x, &y);
+ return y;
+}
+
+double
+test_bivariate_gaussian2_pdf (double y)
+{
+ int i, n = 10;
+ double sum = 0;
+ double a = -10, b = 10, dx = (b - a) / n;
+ for (i = 0; i < n; i++)
+ {
+ double x = a + i * dx;
+ sum += gsl_ran_bivariate_gaussian_pdf (x, y, 3.0, 2.0, 0.3) * dx;
+ }
+ return sum;
+}
+
+
+double
+test_bivariate_gaussian3 (void)
+{
+ double x = 0, y = 0;
+ gsl_ran_bivariate_gaussian (r_global, 3.0, 2.0, 0.3, &x, &y);
+ return x + y;
+}
+
+double
+test_bivariate_gaussian3_pdf (double x)
+{
+ double sx = 3.0, sy = 2.0, r = 0.3;
+ double su = (sx + r * sy);
+ double sv = sy * sqrt (1 - r * r);
+ double sigma = sqrt (su * su + sv * sv);
+
+ return gsl_ran_gaussian_pdf (x, sigma);
+}
+
+double
+test_bivariate_gaussian4 (void)
+{
+ double x = 0, y = 0;
+ gsl_ran_bivariate_gaussian (r_global, 3.0, 2.0, -0.5, &x, &y);
+ return x + y;
+}
+
+double
+test_bivariate_gaussian4_pdf (double x)
+{
+ double sx = 3.0, sy = 2.0, r = -0.5;
+ double su = (sx + r * sy);
+ double sv = sy * sqrt (1 - r * r);
+ double sigma = sqrt (su * su + sv * sv);
+
+ return gsl_ran_gaussian_pdf (x, sigma);
+}
+
+
+double
+test_geometric (void)
+{
+ return gsl_ran_geometric (r_global, 0.5);
+}
+
+double
+test_geometric_pdf (unsigned int n)
+{
+ return gsl_ran_geometric_pdf (n, 0.5);
+}
+
+double
+test_geometric1 (void)
+{
+ return gsl_ran_geometric (r_global, 1.0);
+}
+
+double
+test_geometric1_pdf (unsigned int n)
+{
+ return gsl_ran_geometric_pdf (n, 1.0);
+}
+
+double
+test_hypergeometric1 (void)
+{
+ return gsl_ran_hypergeometric (r_global, 5, 7, 4);
+}
+
+double
+test_hypergeometric1_pdf (unsigned int n)
+{
+ return gsl_ran_hypergeometric_pdf (n, 5, 7, 4);
+}
+
+
+double
+test_hypergeometric2 (void)
+{
+ return gsl_ran_hypergeometric (r_global, 5, 7, 11);
+}
+
+double
+test_hypergeometric2_pdf (unsigned int n)
+{
+ return gsl_ran_hypergeometric_pdf (n, 5, 7, 11);
+}
+
+double
+test_hypergeometric3 (void)
+{
+ return gsl_ran_hypergeometric (r_global, 5, 7, 1);
+}
+
+double
+test_hypergeometric3_pdf (unsigned int n)
+{
+ return gsl_ran_hypergeometric_pdf (n, 5, 7, 1);
+}
+
+double
+test_hypergeometric4 (void)
+{
+ return gsl_ran_hypergeometric (r_global, 5, 7, 20);
+}
+
+double
+test_hypergeometric4_pdf (unsigned int n)
+{
+ return gsl_ran_hypergeometric_pdf (n, 5, 7, 20);
+}
+
+double
+test_hypergeometric5 (void)
+{
+ return gsl_ran_hypergeometric (r_global, 2, 7, 5);
+}
+
+double
+test_hypergeometric5_pdf (unsigned int n)
+{
+ return gsl_ran_hypergeometric_pdf (n, 2, 7, 5);
+}
+
+
+double
+test_hypergeometric6 (void)
+{
+ return gsl_ran_hypergeometric (r_global, 2, 10, 3);
+}
+
+double
+test_hypergeometric6_pdf (unsigned int n)
+{
+ return gsl_ran_hypergeometric_pdf (n, 2, 10, 3);
+}
+
+
+
+
+double
+test_gumbel1 (void)
+{
+ return gsl_ran_gumbel1 (r_global, 3.12, 4.56);
+}
+
+double
+test_gumbel1_pdf (double x)
+{
+ return gsl_ran_gumbel1_pdf (x, 3.12, 4.56);
+}
+
+double
+test_gumbel2 (void)
+{
+ return gsl_ran_gumbel2 (r_global, 3.12, 4.56);
+}
+
+double
+test_gumbel2_pdf (double x)
+{
+ return gsl_ran_gumbel2_pdf (x, 3.12, 4.56);
+}
+
+double
+test_landau (void)
+{
+ return gsl_ran_landau (r_global);
+}
+
+double
+test_landau_pdf (double x)
+{
+ return gsl_ran_landau_pdf (x);
+}
+
+double
+test_levy1 (void)
+{
+ return gsl_ran_levy (r_global, 5.0, 1.0);
+}
+
+double
+test_levy1_pdf (double x)
+{
+ return gsl_ran_cauchy_pdf (x, 5.0);
+}
+
+double
+test_levy2 (void)
+{
+ return gsl_ran_levy (r_global, 5.0, 2.0);
+}
+
+double
+test_levy2_pdf (double x)
+{
+ return gsl_ran_gaussian_pdf (x, sqrt (2.0) * 5.0);
+}
+
+double
+test_levy1a (void)
+{
+ return gsl_ran_levy (r_global, 5.0, 1.01);
+}
+
+double
+test_levy1a_pdf (double x)
+{
+ return gsl_ran_cauchy_pdf (x, 5.0);
+}
+
+double
+test_levy2a (void)
+{
+ return gsl_ran_levy (r_global, 5.0, 1.99);
+}
+
+double
+test_levy2a_pdf (double x)
+{
+ return gsl_ran_gaussian_pdf (x, sqrt (2.0) * 5.0);
+}
+
+
+double
+test_levy_skew1 (void)
+{
+ return gsl_ran_levy_skew (r_global, 5.0, 1.0, 0.0);
+}
+
+double
+test_levy_skew1_pdf (double x)
+{
+ return gsl_ran_cauchy_pdf (x, 5.0);
+}
+
+double
+test_levy_skew2 (void)
+{
+ return gsl_ran_levy_skew (r_global, 5.0, 2.0, 0.0);
+}
+
+double
+test_levy_skew2_pdf (double x)
+{
+ return gsl_ran_gaussian_pdf (x, sqrt (2.0) * 5.0);
+}
+
+double
+test_levy_skew1a (void)
+{
+ return gsl_ran_levy_skew (r_global, 5.0, 1.01, 0.0);
+}
+
+double
+test_levy_skew1a_pdf (double x)
+{
+ return gsl_ran_cauchy_pdf (x, 5.0);
+}
+
+double
+test_levy_skew2a (void)
+{
+ return gsl_ran_levy_skew (r_global, 5.0, 1.99, 0.0);
+}
+
+double
+test_levy_skew2a_pdf (double x)
+{
+ return gsl_ran_gaussian_pdf (x, sqrt (2.0) * 5.0);
+}
+
+double
+test_levy_skew1b (void)
+{
+ return gsl_ran_levy_skew (r_global, 5.0, 1.01, 0.001);
+}
+
+double
+test_levy_skew1b_pdf (double x)
+{
+ return gsl_ran_cauchy_pdf (x, 5.0);
+}
+
+double
+test_levy_skew2b (void)
+{
+ return gsl_ran_levy_skew (r_global, 5.0, 1.99, 0.001);
+}
+
+double
+test_levy_skew2b_pdf (double x)
+{
+ return gsl_ran_gaussian_pdf (x, sqrt (2.0) * 5.0);
+}
+
+
+double
+test_logistic (void)
+{
+ return gsl_ran_logistic (r_global, 3.1);
+}
+
+double
+test_logistic_pdf (double x)
+{
+ return gsl_ran_logistic_pdf (x, 3.1);
+}
+
+double
+test_logarithmic (void)
+{
+ return gsl_ran_logarithmic (r_global, 0.4);
+}
+
+double
+test_logarithmic_pdf (unsigned int n)
+{
+ return gsl_ran_logarithmic_pdf (n, 0.4);
+}
+
+
+double
+test_lognormal (void)
+{
+ return gsl_ran_lognormal (r_global, 2.7, 1.3);
+}
+
+double
+test_lognormal_pdf (double x)
+{
+ return gsl_ran_lognormal_pdf (x, 2.7, 1.3);
+}
+
+double
+test_multinomial (void)
+{
+ const size_t K = 3;
+ const unsigned int sum_n = BINS;
+ unsigned int n[3];
+ /* Test use of weights instead of probabilities. */
+ const double p[] = { 2., 7., 1.};
+
+ gsl_ran_multinomial ( r_global, K, sum_n, p, n);
+
+ return n[0];
+}
+
+double
+test_multinomial_pdf (unsigned int n_0)
+{
+ /* The margional distribution of just 1 variate is binomial. */
+ size_t K = 2;
+ /* Test use of weights instead of probabilities */
+ double p[] = { 0.4, 1.6};
+ const unsigned int sum_n = BINS;
+ unsigned int n[2];
+
+ n[0] = n_0;
+ n[1] =sum_n - n_0;
+
+ return gsl_ran_multinomial_pdf (K, p, n);
+}
+
+
+double
+test_multinomial_large (void)
+{
+ const unsigned int sum_n = BINS;
+ unsigned int n[MULTI_DIM];
+ const double p[MULTI_DIM] = { 0.2, 0.20, 0.17, 0.14, 0.12,
+ 0.07, 0.05, 0.04, 0.01, 0.00 };
+
+ gsl_ran_multinomial ( r_global, MULTI_DIM, sum_n, p, n);
+
+ return n[0];
+}
+
+double
+test_multinomial_large_pdf (unsigned int n_0)
+{
+ return test_multinomial_pdf(n_0);
+}
+
+double
+test_negative_binomial (void)
+{
+ return gsl_ran_negative_binomial (r_global, 0.3, 20.0);
+}
+
+double
+test_negative_binomial_pdf (unsigned int n)
+{
+ return gsl_ran_negative_binomial_pdf (n, 0.3, 20.0);
+}
+
+double
+test_pascal (void)
+{
+ return gsl_ran_pascal (r_global, 0.8, 3);
+}
+
+double
+test_pascal_pdf (unsigned int n)
+{
+ return gsl_ran_pascal_pdf (n, 0.8, 3);
+}
+
+
+double
+test_pareto (void)
+{
+ return gsl_ran_pareto (r_global, 1.9, 2.75);
+}
+
+double
+test_pareto_pdf (double x)
+{
+ return gsl_ran_pareto_pdf (x, 1.9, 2.75);
+}
+
+double
+test_rayleigh (void)
+{
+ return gsl_ran_rayleigh (r_global, 1.9);
+}
+
+double
+test_rayleigh_pdf (double x)
+{
+ return gsl_ran_rayleigh_pdf (x, 1.9);
+}
+
+double
+test_rayleigh_tail (void)
+{
+ return gsl_ran_rayleigh_tail (r_global, 2.7, 1.9);
+}
+
+double
+test_rayleigh_tail_pdf (double x)
+{
+ return gsl_ran_rayleigh_tail_pdf (x, 2.7, 1.9);
+}
+
+
+double
+test_poisson (void)
+{
+ return gsl_ran_poisson (r_global, 5.0);
+}
+
+double
+test_poisson_pdf (unsigned int n)
+{
+ return gsl_ran_poisson_pdf (n, 5.0);
+}
+
+double
+test_poisson_large (void)
+{
+ return gsl_ran_poisson (r_global, 30.0);
+}
+
+double
+test_poisson_large_pdf (unsigned int n)
+{
+ return gsl_ran_poisson_pdf (n, 30.0);
+}
+
+
+double
+test_tdist1 (void)
+{
+ return gsl_ran_tdist (r_global, 1.75);
+}
+
+double
+test_tdist1_pdf (double x)
+{
+ return gsl_ran_tdist_pdf (x, 1.75);
+}
+
+double
+test_tdist2 (void)
+{
+ return gsl_ran_tdist (r_global, 12.75);
+}
+
+double
+test_tdist2_pdf (double x)
+{
+ return gsl_ran_tdist_pdf (x, 12.75);
+}
+
+
+double
+test_laplace (void)
+{
+ return gsl_ran_laplace (r_global, 2.75);
+}
+
+double
+test_laplace_pdf (double x)
+{
+ return gsl_ran_laplace_pdf (x, 2.75);
+}
+
+double
+test_weibull (void)
+{
+ return gsl_ran_weibull (r_global, 3.14, 2.75);
+}
+
+double
+test_weibull_pdf (double x)
+{
+ return gsl_ran_weibull_pdf (x, 3.14, 2.75);
+}
+
+
+double
+test_weibull1 (void)
+{
+ return gsl_ran_weibull (r_global, 2.97, 1.0);
+}
+
+double
+test_weibull1_pdf (double x)
+{
+ return gsl_ran_weibull_pdf (x, 2.97, 1.0);
+}
diff --git a/gsl-1.9/randist/weibull.c b/gsl-1.9/randist/weibull.c
new file mode 100644
index 0000000..99f101f
--- /dev/null
+++ b/gsl-1.9/randist/weibull.c
@@ -0,0 +1,64 @@
+/* randist/weibull.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+
+/* The Weibull distribution has the form,
+
+ p(x) dx = (b/a) (x/a)^(b-1) exp(-(x/a)^b) dx
+
+ */
+
+double
+gsl_ran_weibull (const gsl_rng * r, const double a, const double b)
+{
+ double x = gsl_rng_uniform_pos (r);
+
+ double z = pow (-log (x), 1 / b);
+
+ return a * z;
+}
+
+double
+gsl_ran_weibull_pdf (const double x, const double a, const double b)
+{
+ if (x < 0)
+ {
+ return 0 ;
+ }
+ else if (x == 0)
+ {
+ if (b == 1)
+ return 1/a ;
+ else
+ return 0 ;
+ }
+ else if (b == 1)
+ {
+ return exp(-x/a)/a ;
+ }
+ else
+ {
+ double p = (b/a) * exp (-pow (x/a, b) + (b - 1) * log (x/a));
+ return p;
+ }
+}
diff --git a/gsl-1.9/rng/ChangeLog b/gsl-1.9/rng/ChangeLog
new file mode 100644
index 0000000..de53658
--- /dev/null
+++ b/gsl-1.9/rng/ChangeLog
@@ -0,0 +1,377 @@
+2007-01-28 Brian Gough <bjg@network-theory.co.uk>
+
+ * knuthran2002.c: added revised version from 9th printing
+
+2007-01-04 Brian Gough <bjg@network-theory.co.uk>
+
+ * default.c (gsl_rng_env_setup): send newline to stderr not stdout
+
+2006-04-13 Brian Gough <bjg@network-theory.co.uk>
+
+ * default.c (gsl_rng_env_setup): print a newline after list of
+ generators in error message
+
+2006-03-16 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c (main): added taus2 test
+
+2006-02-19 Brian Gough <bjg@network-theory.co.uk>
+
+ * rng.c: added note about why range=max-min not max-min+1
+
+2005-12-16 Brian Gough <bjg@network-theory.co.uk>
+
+ * rng.c (gsl_rng_uniform_int): catch the case n = 0 and return an
+ error
+
+2003-07-23 Brian Gough <bjg@network-theory.co.uk>
+
+ * file.c: added fwrite/fread functions
+
+2003-06-12 Brian Gough <bjg@network-theory.co.uk>
+
+ * Makefile.am: removed benchmark programs from default build
+
+2003-06-02 Brian Gough <bjg@network-theory.co.uk>
+
+ * waterman14.c: increased RAND_MIN to 1
+
+ * lecuyer21.c: corrections to RAND_MIN, RAND_MAX, floating point
+ denominator and seeding modulus
+
+ * fishman20.c (ran_get): use schrage multiplication to avoid
+ overflow
+
+ * coveyou.c: corrected value of RAND_MIN to 1 and RAND_MAX to 2^32-1
+
+ * borosh13.c: increased RAND_MIN to 1
+
+ * knuthran2.c (ran_get): use schrage multiplication to avoid
+ overflow in intermediate results
+
+ * fishman2x.c (ran_get): use schrage multiplication to avoid
+ overflow in intermediate results
+
+ * fishman18.c (ran_get): use schrage multiplication to avoid
+ overflow in intermediate results
+
+ * schrage.c (schrage): utility functions for multiplication of
+ long integers
+
+ * test.c (main): updated incorrect test values for
+ gsl_rng_fishman18 gsl_rng_fishman2x gsl_rng_knuthran2
+
+Mon Nov 25 19:27:10 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * taus.c (taus2_set): fixed bug in seeding for s3 (test should be
+ for s3<16, not s3<8)
+
+Sun Nov 3 14:40:43 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * taus.c (taus2_set): fixed bug in seeding for s2 < 8
+
+Mon Jun 17 21:04:10 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * mt.c (mt_set): ensure state counter mti is initialised by
+ seeding routine
+
+Wed May 29 21:52:11 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * randu.c: removed unused variable m
+
+Tue May 7 22:34:52 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * mt.c (mt_1999_set): updated seeding procedure according to new
+ release of MT19937 from the original authors.
+
+Fri Apr 26 21:17:05 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * taus.c (taus2_set): added alternate seeding procedure as
+ described in erratum to P.L'Ecuyer's paper.
+
+Wed Apr 17 19:37:49 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c (main): added missing test for gsl_rng_mt19937_1998
+
+ * gsl_rng.h: added missing declaration for gsl_rng_mt19937_1998
+
+Sun Dec 2 15:45:24 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * Added new generators borosh13, coveyou, fishman18, fishman20,
+ fishman2x, knuthran, knuthran2, lecuyer21, waterman14 from Knuth's
+ Seminumerical Algorithms 3rd Ed. Implemented by Carlo Perassi.
+
+ * gfsr4.c (gfsr4_get_double): increased divisor for double to
+ 2^32, avoids generating exact result of 1.0 as specified in the
+ documentation
+
+Mon Sep 3 10:32:01 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * mt.c (mt_1998_set): renamed macro to avoid duplicate definition
+
+Fri Aug 31 17:49:37 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * mt.c (mt_1998_set): added the original (buggy) MT19937 seeding
+ routine as mt19937_1998 for compatibility.
+
+Wed May 2 15:35:38 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * ran1.c (ran1_get_double): use float constants for comparison
+ for compatibility with original Numerical Recipes routines
+
+ * ran2.c (ran2_get_double): ditto
+
+Fri Apr 27 18:47:07 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * types.c (gsl_rng_types_setup): added void to make prototype
+ valid in ansi c
+
+Mon Apr 16 20:03:07 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * default.c (gsl_rng_env_setup): removed spurious argument to
+ fprintf
+
+Tue Jan 23 13:24:26 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * types.c (gsl_rng_types_setup): provide a function that returns a
+ list of all the generator types
+
+ * default.c (gsl_rng_env_setup): get the list of generators from a
+ function rather than having a list in the code itself. Display a
+ list of the valid generators if the user provides an incorrect one.
+
+Fri Dec 8 20:30:58 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * ranlxs.c: renamed internal function ranlxs_set_impl to
+ ranlxs_set
+
+ * ranlxd.c: renamed internal function ranlxd_set_impl to
+ ranlxd_set
+
+ * ranlux.c: renamed internal function ranlux_set_impl to
+ ranlux_set
+
+ * random.c: renamed internal function random_get_impl function to
+ random_get
+
+Sat Jul 29 14:29:54 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c (main): updated test value for MT19937 for new seeding
+ procedure
+
+ * mt.c: The seeding procedure has been updated to match the 10/99
+ release of MT19937.
+
+Wed Mar 8 16:04:34 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * rng.c (gsl_rng_memcpy): generators must now be of the same type
+ for a copy from one to the other to work.
+
+Thu Feb 24 16:41:48 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * ran3.c (ran3_set): initialize unused zeroth element of state to
+ zero for consistency.
+
+Mon Feb 14 13:28:26 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * made all internal functions static
+
+Mon Dec 6 16:21:05 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c (main): rewrote the tests to loop over all the generators
+
+Wed Aug 11 20:57:10 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * ranlxd.c, ranlxs.c: added ranlxd and ranlxs, second generation
+ RANLUX generators from Martin Luescher.
+
+Mon Mar 1 21:12:28 1999 Brian Gough <bjg@netsci.freeserve.co.uk>
+
+ * test.c (rng_parallel_state_test): added some extra tests to fill
+ a few holes in the net
+
+ * gsl_rng.h: moved static class information (max, min, etc) out of
+ the instance data. Originally I avoided this because of the
+ overhead of the extra indirection (r->type->get vs r->get) for
+ every get function call, but that turns out to be only about 10%
+ at worst so it's worth the slight speed cost to make the code
+ safer.
+
+Tue Nov 17 17:09:31 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * gfsr4.c: added #include <config.h> which was missing
+
+1998-11-04 <bjg@ancho.lanl.gov>
+
+ * ranf.c: fix portability problems on alpha, by ensuring that
+ shorts are correctly promoted to longs at the appropriate points
+
+ * rand48.c: fix portability problems by ensuring that shorts are
+ correctly promoted to longs at the appropriate points
+
+ * rng-dump.c (main): write out file correctly by using chars
+ instead of unsigned long ints, since these can vary in size on
+ different architectures
+
+Wed Oct 28 15:02:22 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * rng.c: added #include <string.h> to get prototype for memcpy
+
+Mon Sep 14 20:53:09 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * default.c (gsl_rng_env_setup): added gfsr4
+
+1998-09-10 James Theiler <jt@lanl.gov>
+
+ * gfsr4.c: added new random number generator
+
+ * Makefile.am: added gfsr4.c to SOURCES list
+
+ * gsl_rng.h: added gfsr4
+
+ * test.c: added gfsr4
+
+ * benchmark.c: added gfsr4
+
+Mon Aug 10 22:12:13 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * rng-dump.c: program to write out 3 million random numbers,
+ suitable for testing with DIEHARD.
+
+Tue Aug 4 19:51:57 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * default.c (gsl_rng_env_setup): send default/enviroment output to
+ stderr
+
+Mon Aug 3 18:25:52 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * mt.c: made constants static since they shouldn't be exported,
+ added some speed improvements from Cokus' code (not all of them
+ since they seemed to use more registers than available on the
+ pentium).
+
+Thu Jul 9 13:56:20 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * slatec.c: renamed cmlib.c to slatec.c
+
+ * transputer.c: renamed tds.c to transputer.c so the name is a bit
+ more obvious
+
+ * random.c: renamed random0 functions to random8, since obviously
+ we can't have 0 bytes of state
+
+ * default.c (gsl_rng_env_setup): made gsl_rng_mt19937 the default
+ generator
+
+Wed Jul 8 17:06:54 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * added random() functions. There are three(!) versions: the
+ original BSD, linux libc5 (had a typo in the multiplier, but got
+ installed on millions of machines so is now a defacto standard)
+ and GNU glibc2 (fixes the typo and has an improved seeding
+ procedure)
+
+Sun Jul 5 15:59:29 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * rand.c: renamed rand.c to cmlib.c and bsdrand.c to rand.c.
+
+ * ranf.c: added CRAY RANF, 48 bit generator
+
+ * rand48.c: added the standard unix rand48()
+
+ * changed all the routines to allow an additional callback for
+ returning doubles. Now we can implement numerical recipes with its
+ non-standard checks on the floating point results and also access
+ the full state for getting 48-bit doubles out of rand48.
+
+Sat Jul 4 11:14:49 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * ranmar.c: added the RANMAR generator
+
+ * tds.c: added the INMOS Transputer RNG
+
+ * test.c (rng_min_test): added a test for RAND_MIN, to make sure
+ none of the generators go below it. Statistically the test is not
+ much good since it's very unlikely that an off-by-one error would
+ show up unless we ran the test for > 4 billion numbers. However,
+ the test might detect a gross error like a typo in RAND_MIN or a
+ degeneracy 0,0,0,... for a multiplicative generator.
+
+ * uni.c: fixed RAND_MAX here too
+
+ * uni32.c: fixed RAND_MAX to m1-1, not m1 (since it's modulo m1 so
+ m1 can't occur, only m1-1)
+
+Fri Jul 3 15:55:34 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * rng.c (gsl_rng_uniform_gt0_lt1): added a function which returns
+ numbers in the range (0,1), i.e. excluding 0.0 and 1.0
+
+ * renamed bad_randu.c to randu.c
+
+ * renamed bad_rand.c to bsdrand.c
+
+Mon Jun 29 18:11:08 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * added implementations of the numerical recipes algorithms ran0,
+ ran1, ran2, ran3
+
+Sun Jun 28 11:51:48 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * gsl_rng.h: added gsl_rng_uniform_pos which guarantees positive
+ numbers, (0,1]
+
+ * added a RAND_MIN entry to the gsl_rng/gsl_rng_type structs
+
+ * gsl_rng.h: renamed gsl_rng_get_uni to gsl_rng_uniform
+
+Wed Jun 24 12:10:23 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * gsl_rng.h: added inline versions of gsl_rng_get and
+ gsl_rng_get_uni
+
+ * benchmark.c: added a simple benchmark program to measure rng's
+ per second
+
+ * test.c (N2): reduced the number of tests from 1 million to 100k
+ to speed things up a bit
+
+ * changed the generic seeding algorithm to s -> (69069*s) &
+ 0xFFFFFFFF which covers all 32 bits.
+
+Sun Jun 21 23:24:36 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * added the MT19937 and TT880 mersenne prime generators
+
+Sat Jun 20 13:58:40 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * ensured that 32 bit quantities are defined as 'long', as
+ required by ANSI. On a 16 bit platform 'int' is usually just 16
+ bits.
+
+ * ranlux.c: added the RANLUX generator
+
+Fri Jun 19 11:12:06 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * removed the gsl- prefix from generator name strings
+
+Thu Jun 18 12:17:16 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * test.c: added a 10000 iteration check for cmrg
+
+ * got rid of init_state values. It's simpler to generate them
+ directly from the seed, the cost of creating an rng is not usually
+ a big deal.
+
+ * rng.c: eliminated the gsl_rng_internal struct since it was not
+ really necessary
+
+Wed Jun 17 17:31:27 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * minstd.c: added Park and Millers MINSTD generator
+
+Thu Jun 11 18:08:40 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * this will be an alternate, thread-safe interface to the random
+ number generators.
+
diff --git a/gsl-1.9/rng/Makefile.am b/gsl-1.9/rng/Makefile.am
new file mode 100644
index 0000000..5c6e528
--- /dev/null
+++ b/gsl-1.9/rng/Makefile.am
@@ -0,0 +1,22 @@
+noinst_LTLIBRARIES = libgslrng.la
+
+pkginclude_HEADERS = gsl_rng.h
+
+INCLUDES= -I$(top_builddir)
+
+libgslrng_la_SOURCES = borosh13.c cmrg.c coveyou.c default.c file.c fishman18.c fishman20.c fishman2x.c gfsr4.c knuthran2.c knuthran.c knuthran2002.c lecuyer21.c minstd.c mrg.c mt.c r250.c ran0.c ran1.c ran2.c ran3.c rand48.c rand.c random.c randu.c ranf.c ranlux.c ranlxd.c ranlxs.c ranmar.c rng.c slatec.c taus.c taus113.c transputer.c tt.c types.c uni32.c uni.c vax.c waterman14.c zuf.c
+
+CLEANFILES = test.dat
+
+noinst_HEADERS = schrage.c
+
+test_SOURCES = test.c
+test_LDADD = libgslrng.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+
+TESTS = $(check_PROGRAMS)
+check_PROGRAMS = test
+
+# benchmark_SOURCES = benchmark.c
+# benchmark_LDADD = libgslrng.la ../err/libgslerr.la ../utils/libutils.la
+# rng_dump_SOURCES = rng-dump.c
+# rng_dump_LDADD = libgslrng.la ../err/libgslerr.la ../utils/libutils.la
diff --git a/gsl-1.9/rng/Makefile.in b/gsl-1.9/rng/Makefile.in
new file mode 100644
index 0000000..5f4851e
--- /dev/null
+++ b/gsl-1.9/rng/Makefile.in
@@ -0,0 +1,558 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = test$(EXEEXT)
+subdir = rng
+DIST_COMMON = $(noinst_HEADERS) $(pkginclude_HEADERS) \
+ $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog TODO
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgslrng_la_LIBADD =
+am_libgslrng_la_OBJECTS = borosh13.lo cmrg.lo coveyou.lo default.lo \
+ file.lo fishman18.lo fishman20.lo fishman2x.lo gfsr4.lo \
+ knuthran2.lo knuthran.lo knuthran2002.lo lecuyer21.lo \
+ minstd.lo mrg.lo mt.lo r250.lo ran0.lo ran1.lo ran2.lo ran3.lo \
+ rand48.lo rand.lo random.lo randu.lo ranf.lo ranlux.lo \
+ ranlxd.lo ranlxs.lo ranmar.lo rng.lo slatec.lo taus.lo \
+ taus113.lo transputer.lo tt.lo types.lo uni32.lo uni.lo vax.lo \
+ waterman14.lo zuf.lo
+libgslrng_la_OBJECTS = $(am_libgslrng_la_OBJECTS)
+am_test_OBJECTS = test.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = libgslrng.la ../ieee-utils/libgslieeeutils.la \
+ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \
+ ../utils/libutils.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgslrng_la_SOURCES) $(test_SOURCES)
+DIST_SOURCES = $(libgslrng_la_SOURCES) $(test_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libgslrng.la
+pkginclude_HEADERS = gsl_rng.h
+INCLUDES = -I$(top_builddir)
+libgslrng_la_SOURCES = borosh13.c cmrg.c coveyou.c default.c file.c fishman18.c fishman20.c fishman2x.c gfsr4.c knuthran2.c knuthran.c knuthran2002.c lecuyer21.c minstd.c mrg.c mt.c r250.c ran0.c ran1.c ran2.c ran3.c rand48.c rand.c random.c randu.c ranf.c ranlux.c ranlxd.c ranlxs.c ranmar.c rng.c slatec.c taus.c taus113.c transputer.c tt.c types.c uni32.c uni.c vax.c waterman14.c zuf.c
+CLEANFILES = test.dat
+noinst_HEADERS = schrage.c
+test_SOURCES = test.c
+test_LDADD = libgslrng.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+TESTS = $(check_PROGRAMS)
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps rng/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps rng/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgslrng.la: $(libgslrng_la_OBJECTS) $(libgslrng_la_DEPENDENCIES)
+ $(LINK) $(libgslrng_la_LDFLAGS) $(libgslrng_la_OBJECTS) $(libgslrng_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkgincludeHEADERS
+
+
+# benchmark_SOURCES = benchmark.c
+# benchmark_LDADD = libgslrng.la ../err/libgslerr.la ../utils/libutils.la
+# rng_dump_SOURCES = rng-dump.c
+# rng_dump_LDADD = libgslrng.la ../err/libgslerr.la ../utils/libutils.la
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/rng/TODO b/gsl-1.9/rng/TODO
new file mode 100644
index 0000000..4967b04
--- /dev/null
+++ b/gsl-1.9/rng/TODO
@@ -0,0 +1,97 @@
+* gfsr: for consistency (Charles A. Wemple). Make this change in 2.0
+
+ 127a142
+> state->nd = i-1;
+133,134c148,149
+< for (i=0; i<32; ++i) {
+< int k=7+i*3;
+---
+> for (i=0; i<32; i++) {
+> int k=7*i+3;
+141d155
+< state->nd = i;
+
+
+* Sort out "const" in prototypes, it looks odd since there are consts
+for many functions which modify the state. (Applies to both qrng and rng)
+
+* New 64 bit generators in "Tables of 64-bit Mersenne Twisters",
+Takuji Nishimura, ACM Transactions on Modeling and Computer
+Simulation, Volumen 10, No 4, October 2000, p 348--357
+
+* Need to run tests over the space of seeds, in addition to serial
+tests (DIEHARD) for the default seed. The congruences used for
+seeding will give poor initial vectors for some seed values, e.g. 2^n.
+Improve the seeding procedure by using a high-quality generator
+(e.g. hash functions, md5 or sha) to generate the initial vectors.
+Even if this is moderately expensive it is worthwhile since the
+seeding is usually a one-off cost at program initialization, and the
+results of all subsequent calls to the generator depend on it. The
+GSFR4 generator is particularly likely to benefit from this procedure.
+
+* Add SWNS generator Phys.Rev.E 50 (2) p. 1607-1615 (1994), Phys.Rev.E
+60 (6), p.7626-7628 (1999)
+
+* Add get_array type methods which can provide optimized versions of
+each function (?). We should offer the possibility of eliminating
+function call overhead -- there are various possible ways to implement
+it.
+
+* Add ISAAC generator (??)
+
+* Add (A)RC4 and hash based random number generators MD5, SHA. This
+should give crypto quality randomness, and guarantee different
+sequences for each seed. Make the state (seed, count) where count
+increments on each call of the generator. Implement count as a big
+integer stored in separate unsigned integers so that the period is
+sufficiently long (e.g. 2^64 or 2^96). The generator would return
+HASH(seed, count) on each call.
+
+* Check that RANLXS will work on machines with non-standard width of
+float/dbl (original has checks for DBL_MANT_DIG ..)
+
+* mention more clearly why not all Cokus used (or recheck MT pages for
+improvements)
+
+* run the DIEHARD tests on all the generators, especially the ones we
+are listing as "Simulation Quality" -- some of those are a bit old and
+might fail one or two diehard tests.
+
+* Add NAG, missing, gave up!
+ CDC 48-bit missing
+
+* Check out the bug fix to mrand48 that was made in glibc2, pr757
+
+* Check out the following paper,
+
+ On the anomaly of ran1() in Monte Carlo pricing of financial
+ derivatives; Akira Tajima , Syoiti Ninomiya , and Shu Tezuka ; Winter
+ simulation , 1996, Page 360, from ACM
+
+* The following papers have been published, I think we refer to them
+(or could do),
+
+ Pierre L'Ecuyer, "Tables of Linear Congruential Generators of different
+ size and good lattice structure", Mathematics of Computation, Vol 68,
+ No 225, Jan 1999, p249-260
+
+ Pierre L'Ecuyer, "Tables of Maximally equidistributed combined LSFR
+ generators", ibid, p261-270
+
+* Look at this paper: I. Vattulainen, "Framework for testing random numbers
+ in parallel calculations", Phys. Rev. E, 59, 6, June 1999, p7200
+
+----------------------------------------------------------------------
+DONE
+
+x1. Improve the seeding for routines that use the LCG seed generator.
+It can only generate 130,000 different initial states. We should
+change it to provide 2^31 different initial states (this will also
+prevent the high bits being zero). DONE - we now use a 32-bit
+generator.
+
+x8. Get the macros from the faster MT19937 generator and use them. We
+need to make MT be the fastest of the simulation quality generators if
+it is the default. DONE. It didn't improve the speed on other
+platforms, so I just used the tricks which also worked on the pentium
+(e.g. changing mag[x&1] to x&1 ? mag[1] : mag[0])
diff --git a/gsl-1.9/rng/borosh13.c b/gsl-1.9/rng/borosh13.c
new file mode 100644
index 0000000..d0957f8
--- /dev/null
+++ b/gsl-1.9/rng/borosh13.c
@@ -0,0 +1,92 @@
+/* rng/borosh13.c
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/*
+ * This generator is taken from
+ *
+ * Donald E. Knuth
+ * The Art of Computer Programming
+ * Volume 2
+ * Third Edition
+ * Addison-Wesley
+ * Page 106-108
+ *
+ * It is called "Borosh - Niederreiter"
+ *
+ * This implementation copyright (C) 2001 Carlo Perassi and
+ * (C) 2003 Heiko Bauke.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_rng.h>
+
+#define AA 1812433253UL
+#define MM 0xffffffffUL /* 2 ^ 32 - 1 */
+
+static inline unsigned long int ran_get (void *vstate);
+static double ran_get_double (void *vstate);
+static void ran_set (void *state, unsigned long int s);
+
+typedef struct
+{
+ unsigned long int x;
+}
+ran_state_t;
+
+static inline unsigned long int
+ran_get (void *vstate)
+{
+ ran_state_t *state = (ran_state_t *) vstate;
+
+ state->x = (AA * state->x) & MM;
+
+ return state->x;
+}
+
+static double
+ran_get_double (void *vstate)
+{
+ ran_state_t *state = (ran_state_t *) vstate;
+
+ return ran_get (state) / 4294967296.0;
+}
+
+static void
+ran_set (void *vstate, unsigned long int s)
+{
+ ran_state_t *state = (ran_state_t *) vstate;
+
+ if (s == 0)
+ s = 1; /* default seed is 1 */
+
+ state->x = s & MM;
+
+ return;
+}
+
+static const gsl_rng_type ran_type = {
+ "borosh13", /* name */
+ MM, /* RAND_MAX */
+ 1, /* RAND_MIN */
+ sizeof (ran_state_t),
+ &ran_set,
+ &ran_get,
+ &ran_get_double
+};
+
+const gsl_rng_type *gsl_rng_borosh13 = &ran_type;
diff --git a/gsl-1.9/rng/cmrg.c b/gsl-1.9/rng/cmrg.c
new file mode 100644
index 0000000..60cca64
--- /dev/null
+++ b/gsl-1.9/rng/cmrg.c
@@ -0,0 +1,197 @@
+/* rng/cmrg.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_rng.h>
+
+/* This is a combined multiple recursive generator. The sequence is,
+
+ z_n = (x_n - y_n) mod m1
+
+ where the two underlying generators x and y are,
+
+ x_n = (a_{1} x_{n-1} + a_{2} x_{n-2} + a_{3} x_{n-3}) mod m1
+ y_n = (b_{1} y_{n-1} + b_{2} y_{n-2} + b_{3} y_{n-3}) mod m2
+
+ with coefficients a11 ... a23,
+
+ a_{1} = 0, a_{2} = 63308, a_{3} = -183326
+ b_{1} = 86098, b_{2} = 0, b_{3} = -539608
+
+ and moduli m1, m2,
+
+ m1 = 2^31 - 1 = 2147483647
+ m2 = 2^31 - 2000169 = 2145483479
+
+ We initialize the generator with
+
+ x_1 = s_1 MOD m1, x_2 = s_2 MOD m1, x_3 = s_3 MOD m1
+ y_1 = s_4 MOD m2, y_2 = s_5 MOD m2, y_3 = s_6 MOD m2
+
+ where s_n = (69069 * s_{n-1}) mod 2^32 and s_0 = s is the
+ user-supplied seed.
+
+ NOTE: According to the paper the initial values for x_n must lie in
+ the range 0 <= x_n <= (m1 - 1) and the initial values for y_n must
+ lie in the range 0 <= y_n <= (m2 - 1), with at least one non-zero
+ value -- our seeding procedure satisfies these constraints.
+
+ We then use 7 iterations of the generator to "warm up" the internal
+ state.
+
+ The theoretical value of z_{10008} is 719452880. The subscript 10008
+ means (1) seed the generator with s=1, (2) do the seven warm-up
+ iterations that are part of the seeding process, (3) then do 10000
+ actual iterations.
+
+ The period of this generator is about 2^205.
+
+ From: P. L'Ecuyer, "Combined Multiple Recursive Random Number
+ Generators," Operations Research, 44, 5 (1996), 816--822.
+
+ This is available on the net from L'Ecuyer's home page,
+
+ http://www.iro.umontreal.ca/~lecuyer/myftp/papers/combmrg.ps
+ ftp://ftp.iro.umontreal.ca/pub/simulation/lecuyer/papers/combmrg.ps */
+
+static inline unsigned long int cmrg_get (void *vstate);
+static double cmrg_get_double (void *vstate);
+static void cmrg_set (void *state, unsigned long int s);
+
+static const long int m1 = 2147483647, m2 = 2145483479;
+
+static const long int a2 = 63308, qa2 = 33921, ra2 = 12979;
+static const long int a3 = -183326, qa3 = 11714, ra3 = 2883;
+static const long int b1 = 86098, qb1 = 24919, rb1 = 7417;
+static const long int b3 = -539608, qb3 = 3976, rb3 = 2071;
+
+typedef struct
+ {
+ long int x1, x2, x3; /* first component */
+ long int y1, y2, y3; /* second component */
+ }
+cmrg_state_t;
+
+static inline unsigned long int
+cmrg_get (void *vstate)
+{
+ cmrg_state_t *state = (cmrg_state_t *) vstate;
+
+ /* Component 1 */
+
+ {
+ long int h3 = state->x3 / qa3;
+ long int p3 = -a3 * (state->x3 - h3 * qa3) - h3 * ra3;
+
+ long int h2 = state->x2 / qa2;
+ long int p2 = a2 * (state->x2 - h2 * qa2) - h2 * ra2;
+
+ if (p3 < 0)
+ p3 += m1;
+ if (p2 < 0)
+ p2 += m1;
+
+ state->x3 = state->x2;
+ state->x2 = state->x1;
+ state->x1 = p2 - p3;
+ if (state->x1 < 0)
+ state->x1 += m1;
+ }
+
+ /* Component 2 */
+
+ {
+ long int h3 = state->y3 / qb3;
+ long int p3 = -b3 * (state->y3 - h3 * qb3) - h3 * rb3;
+
+ long int h1 = state->y1 / qb1;
+ long int p1 = b1 * (state->y1 - h1 * qb1) - h1 * rb1;
+
+ if (p3 < 0)
+ p3 += m2;
+ if (p1 < 0)
+ p1 += m2;
+
+ state->y3 = state->y2;
+ state->y2 = state->y1;
+ state->y1 = p1 - p3;
+ if (state->y1 < 0)
+ state->y1 += m2;
+ }
+
+ if (state->x1 < state->y1)
+ return (state->x1 - state->y1 + m1);
+ else
+ return (state->x1 - state->y1);
+}
+
+static double
+cmrg_get_double (void *vstate)
+{
+ return cmrg_get (vstate) / 2147483647.0 ;
+}
+
+
+static void
+cmrg_set (void *vstate, unsigned long int s)
+{
+ /* An entirely adhoc way of seeding! This does **not** come from
+ L'Ecuyer et al */
+
+ cmrg_state_t *state = (cmrg_state_t *) vstate;
+
+ if (s == 0)
+ s = 1; /* default seed is 1 */
+
+#define LCG(n) ((69069 * n) & 0xffffffffUL)
+ s = LCG (s);
+ state->x1 = s % m1;
+ s = LCG (s);
+ state->x2 = s % m1;
+ s = LCG (s);
+ state->x3 = s % m1;
+
+ s = LCG (s);
+ state->y1 = s % m2;
+ s = LCG (s);
+ state->y2 = s % m2;
+ s = LCG (s);
+ state->y3 = s % m2;
+
+ /* "warm it up" */
+ cmrg_get (state);
+ cmrg_get (state);
+ cmrg_get (state);
+ cmrg_get (state);
+ cmrg_get (state);
+ cmrg_get (state);
+ cmrg_get (state);
+}
+
+static const gsl_rng_type cmrg_type =
+{"cmrg", /* name */
+ 2147483646, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (cmrg_state_t),
+ &cmrg_set,
+ &cmrg_get,
+ &cmrg_get_double};
+
+const gsl_rng_type *gsl_rng_cmrg = &cmrg_type;
diff --git a/gsl-1.9/rng/coveyou.c b/gsl-1.9/rng/coveyou.c
new file mode 100644
index 0000000..8732990
--- /dev/null
+++ b/gsl-1.9/rng/coveyou.c
@@ -0,0 +1,92 @@
+/* rng/coveyou.c
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/*
+ * This generator is taken from
+ *
+ * Donald E. Knuth
+ * The Art of Computer Programming
+ * Volume 2
+ * Third Edition
+ * Addison-Wesley
+ * Section 3.2.2
+ *
+ * This implementation copyright (C) 2001 Carlo Perassi
+ * and (C) 2003 Heiko Bauke.
+ * Carlo Perassi reorganized the code to use the rng framework of GSL.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_rng.h>
+
+#define MM 0xffffffffUL /* 2 ^ 32 - 1 */
+
+static inline unsigned long int ran_get (void *vstate);
+static double ran_get_double (void *vstate);
+static void ran_set (void *state, unsigned long int s);
+
+typedef struct
+{
+ unsigned long int x;
+}
+ran_state_t;
+
+static inline unsigned long int
+ran_get (void *vstate)
+{
+ ran_state_t *state = (ran_state_t *) vstate;
+
+ state->x = (state->x * (state->x + 1)) & MM;
+
+ return state->x;
+}
+
+static double
+ran_get_double (void *vstate)
+{
+ ran_state_t *state = (ran_state_t *) vstate;
+
+ return ran_get (state) / 4294967296.0;
+}
+
+static void
+ran_set (void *vstate, unsigned long int s)
+{
+ ran_state_t *state = (ran_state_t *) vstate;
+
+ unsigned long int diff = ((s % 4UL) - 2UL) % MM;
+
+ if (diff)
+ state->x = (s - diff) & MM;
+ else
+ state->x = s & MM;
+
+ return;
+}
+
+static const gsl_rng_type ran_type = {
+ "coveyou", /* name */
+ MM-1, /* RAND_MAX */
+ 2, /* RAND_MIN */
+ sizeof (ran_state_t),
+ &ran_set,
+ &ran_get,
+ &ran_get_double
+};
+
+const gsl_rng_type *gsl_rng_coveyou = &ran_type;
diff --git a/gsl-1.9/rng/default.c b/gsl-1.9/rng/default.c
new file mode 100644
index 0000000..1da0e8a
--- /dev/null
+++ b/gsl-1.9/rng/default.c
@@ -0,0 +1,93 @@
+/* rng/default.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_errno.h>
+
+/* The initial defaults are defined in the file mt.c, so we can get
+ access to the static parts of the default generator. */
+
+const gsl_rng_type *
+gsl_rng_env_setup (void)
+{
+ unsigned long int seed = 0;
+ const char *p = getenv ("GSL_RNG_TYPE");
+
+ if (p)
+ {
+ const gsl_rng_type **t, **t0 = gsl_rng_types_setup ();
+
+ gsl_rng_default = 0;
+
+ /* check GSL_RNG_TYPE against the names of all the generators */
+
+ for (t = t0; *t != 0; t++)
+ {
+ if (strcmp (p, (*t)->name) == 0)
+ {
+ gsl_rng_default = *t;
+ break;
+ }
+ }
+
+ if (gsl_rng_default == 0)
+ {
+ int i = 0;
+
+ fprintf (stderr, "GSL_RNG_TYPE=%s not recognized\n", p);
+ fprintf (stderr, "Valid generator types are:\n");
+
+ for (t = t0; *t != 0; t++)
+ {
+ fprintf (stderr, " %18s", (*t)->name);
+
+ if ((++i) % 4 == 0)
+ {
+ fputc ('\n', stderr);
+ }
+ }
+
+ fputc ('\n', stderr);
+
+ GSL_ERROR_VAL ("unknown generator", GSL_EINVAL, 0);
+ }
+
+ fprintf (stderr, "GSL_RNG_TYPE=%s\n", gsl_rng_default->name);
+ }
+ else
+ {
+ gsl_rng_default = gsl_rng_mt19937;
+ }
+
+ p = getenv ("GSL_RNG_SEED");
+
+ if (p)
+ {
+ seed = strtoul (p, 0, 0);
+ fprintf (stderr, "GSL_RNG_SEED=%lu\n", seed);
+ };
+
+ gsl_rng_default_seed = seed;
+
+ return gsl_rng_default;
+}
diff --git a/gsl-1.9/rng/file.c b/gsl-1.9/rng/file.c
new file mode 100644
index 0000000..a18797d
--- /dev/null
+++ b/gsl-1.9/rng/file.c
@@ -0,0 +1,57 @@
+/* rng/file.c
+ *
+ * Copyright (C) 2003 Olaf Lenz
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_rng.h>
+
+int
+gsl_rng_fread (FILE * stream, gsl_rng * r)
+{
+ size_t n = r->type->size ;
+
+ char * state = r->state;
+
+ size_t items = fread (state, 1, n, stream);
+
+ if (items != n)
+ {
+ GSL_ERROR ("fread failed", GSL_EFAILED);
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+gsl_rng_fwrite (FILE * stream, const gsl_rng * r)
+{
+ size_t n = r->type->size ;
+
+ char * state = r->state;
+
+ size_t items = fwrite (state, 1, n, stream);
+
+ if (items != n)
+ {
+ GSL_ERROR ("fwrite failed", GSL_EFAILED);
+ }
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/rng/fishman18.c b/gsl-1.9/rng/fishman18.c
new file mode 100644
index 0000000..e57406f
--- /dev/null
+++ b/gsl-1.9/rng/fishman18.c
@@ -0,0 +1,95 @@
+/* rng/fishman18.c
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/*
+ * This generator is taken from
+ *
+ * Donald E. Knuth
+ * The Art of Computer Programming
+ * Volume 2
+ * Third Edition
+ * Addison-Wesley
+ * Page 106-108
+ *
+ * It is called "Fishman - Moore III".
+ *
+ * This implementation copyright (C) 2001 Carlo Perassi
+ * and (C) 2003 Heiko Bauke.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_rng.h>
+
+#include "schrage.c"
+
+#define AA 62089911UL
+#define MM 0x7fffffffUL /* 2 ^ 31 - 1 */
+#define CEIL_SQRT_MM 46341UL /* ceil(sqrt(2 ^ 31 - 1)) */
+
+static inline unsigned long int ran_get (void *vstate);
+static double ran_get_double (void *vstate);
+static void ran_set (void *state, unsigned long int s);
+
+typedef struct
+{
+ unsigned long int x;
+}
+ran_state_t;
+
+static inline unsigned long int
+ran_get (void *vstate)
+{
+ ran_state_t *state = (ran_state_t *) vstate;
+
+ state->x = schrage_mult (AA, state->x, MM, CEIL_SQRT_MM);
+
+ return state->x;
+}
+
+static double
+ran_get_double (void *vstate)
+{
+ ran_state_t *state = (ran_state_t *) vstate;
+
+ return ran_get (state) / 2147483647.0;
+}
+
+static void
+ran_set (void *vstate, unsigned long int s)
+{
+ ran_state_t *state = (ran_state_t *) vstate;
+
+ if ((s % MM) == 0)
+ s = 1; /* default seed is 1 */
+
+ state->x = s % MM;
+
+ return;
+}
+
+static const gsl_rng_type ran_type = {
+ "fishman18", /* name */
+ MM - 1, /* RAND_MAX */
+ 1, /* RAND_MIN */
+ sizeof (ran_state_t),
+ &ran_set,
+ &ran_get,
+ &ran_get_double
+};
+
+const gsl_rng_type *gsl_rng_fishman18 = &ran_type;
diff --git a/gsl-1.9/rng/fishman20.c b/gsl-1.9/rng/fishman20.c
new file mode 100644
index 0000000..9851f13
--- /dev/null
+++ b/gsl-1.9/rng/fishman20.c
@@ -0,0 +1,103 @@
+/* rng/fishman20.c
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/*
+ * This generator is taken from
+ *
+ * Donald E. Knuth
+ * The Art of Computer Programming
+ * Volume 2
+ * Third Edition
+ * Addison-Wesley
+ * Page 108
+ *
+ * It is called "Fishman"
+ *
+ * This implementation copyright (C) 2001 Carlo Perassi
+ * and (C) 2003 Heiko Bauke.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_rng.h>
+
+static inline unsigned long int ran_get (void *vstate);
+static double ran_get_double (void *vstate);
+static void ran_set (void *state, unsigned long int s);
+
+static const long int m = 2147483647, a = 48271, q = 44488, r = 3399;
+
+typedef struct
+{
+ unsigned long int x;
+}
+ran_state_t;
+
+static inline unsigned long int
+ran_get (void *vstate)
+{
+ ran_state_t *state = (ran_state_t *) vstate;
+
+ const unsigned long int x = state->x;
+
+ const long int h = x / q;
+ const long int t = a * (x - h * q) - h * r;
+
+ if (t < 0)
+ {
+ state->x = t + m;
+ }
+ else
+ {
+ state->x = t;
+ }
+
+ return state->x;
+}
+
+static double
+ran_get_double (void *vstate)
+{
+ ran_state_t *state = (ran_state_t *) vstate;
+
+ return ran_get (state) / 2147483647.0;
+}
+
+static void
+ran_set (void *vstate, unsigned long int s)
+{
+ ran_state_t *state = (ran_state_t *) vstate;
+
+ if ((s%m) == 0)
+ s = 1; /* default seed is 1 */
+
+ state->x = s & m;
+
+ return;
+}
+
+static const gsl_rng_type ran_type = {
+ "fishman20", /* name */
+ 2147483646, /* RAND_MAX */
+ 1, /* RAND_MIN */
+ sizeof (ran_state_t),
+ &ran_set,
+ &ran_get,
+ &ran_get_double
+};
+
+const gsl_rng_type *gsl_rng_fishman20 = &ran_type;
diff --git a/gsl-1.9/rng/fishman2x.c b/gsl-1.9/rng/fishman2x.c
new file mode 100644
index 0000000..afe0c27
--- /dev/null
+++ b/gsl-1.9/rng/fishman2x.c
@@ -0,0 +1,121 @@
+/* rng/fishman2x.c
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/*
+ * This generator is taken from
+ *
+ * Donald E. Knuth
+ * The Art of Computer Programming
+ * Volume 2
+ * Third Edition
+ * Addison-Wesley
+ * Page 108
+ *
+ * It is called "Fishman - L'Ecuyer"
+ *
+ * This implementation copyright (C) 2001 Carlo Perassi
+ * and (C) 2003 Heiko Bauke.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_rng.h>
+
+/* Fishman */
+#define AAA_F 48271UL
+#define MMM_F 0x7fffffffUL /* 2 ^ 31 - 1 */
+#define QQQ_F 44488UL
+#define RRR_F 3399UL
+
+/* L'Ecuyer */
+#define AAA_L 40692UL
+#define MMM_L 0x7fffff07UL /* 2 ^ 31 - 249 */
+#define QQQ_L 52774UL
+#define RRR_L 3791UL
+
+static inline unsigned long int ran_get (void *vstate);
+static double ran_get_double (void *vstate);
+static void ran_set (void *state, unsigned long int s);
+
+typedef struct
+{
+ unsigned long int x;
+ unsigned long int y;
+ unsigned long int z;
+}
+ran_state_t;
+
+static inline unsigned long int
+ran_get (void *vstate)
+{
+ ran_state_t *state = (ran_state_t *) vstate;
+
+ long int y, r;
+
+ r = RRR_F * (state->x / QQQ_F);
+ y = AAA_F * (state->x % QQQ_F) - r;
+ if (y < 0)
+ y += MMM_F;
+ state->x = y;
+
+ r = RRR_L * (state->y / QQQ_L);
+ y = AAA_L * (state->y % QQQ_L) - r;
+ if (y < 0)
+ y += MMM_L;
+ state->y = y;
+
+ state->z = (state->x > state->y) ? (state->x - state->y) :
+ MMM_F + state->x - state->y;
+
+ return state->z;
+}
+
+static double
+ran_get_double (void *vstate)
+{
+ ran_state_t *state = (ran_state_t *) vstate;
+
+ return ran_get (state) / 2147483647.0;
+}
+
+static void
+ran_set (void *vstate, unsigned long int s)
+{
+ ran_state_t *state = (ran_state_t *) vstate;
+
+ if ((s % MMM_F) == 0 || (s % MMM_L) == 0)
+ s = 1; /* default seed is 1 */
+
+ state->x = s % MMM_F;
+ state->y = s % MMM_L;
+ state->z = (state->x > state->y) ? (state->x - state->y) :
+ MMM_F + state->x - state->y;
+
+ return;
+}
+
+static const gsl_rng_type ran_type = {
+ "fishman2x", /* name */
+ MMM_F - 1, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (ran_state_t),
+ &ran_set,
+ &ran_get,
+ &ran_get_double
+};
+
+const gsl_rng_type *gsl_rng_fishman2x = &ran_type;
diff --git a/gsl-1.9/rng/gfsr4.c b/gsl-1.9/rng/gfsr4.c
new file mode 100644
index 0000000..c3bf594
--- /dev/null
+++ b/gsl-1.9/rng/gfsr4.c
@@ -0,0 +1,165 @@
+/* This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details. You should have received
+ a copy of the GNU General Public License along with this program;
+ if not, write to the Free Foundation, Inc., 59 Temple Place, Suite
+ 330, Boston, MA 02111-1307 USA
+
+ From Robert M. Ziff, "Four-tap shift-register-sequence
+ random-number generators," Computers in Physics 12(4), Jul/Aug
+ 1998, pp 385-392. A generalized feedback shift-register (GFSR)
+ is basically an xor-sum of particular past lagged values. A
+ four-tap register looks like:
+ ra[nd] = ra[nd-A] ^ ra[nd-B] ^ ra[nd-C] ^ ra[nd-D]
+
+ Ziff notes that "it is now widely known" that two-tap registers
+ have serious flaws, the most obvious one being the three-point
+ correlation that comes from the defn of the generator. Nice
+ mathematical properties can be derived for GFSR's, and numerics
+ bears out the claim that 4-tap GFSR's with appropriately chosen
+ offsets are as random as can be measured, using the author's test.
+
+ This implementation uses the values suggested the the author's
+ example on p392, but altered to fit the GSL framework. The "state"
+ is 2^14 longs, or 64Kbytes; 2^14 is the smallest power of two that
+ is larger than D, the largest offset. We really only need a state
+ with the last D values, but by going to a power of two, we can do a
+ masking operation instead of a modulo, and this is presumably
+ faster, though I haven't actually tried it. The article actually
+ suggested a short/fast hack:
+
+ #define RandomInteger (++nd, ra[nd&M]=ra[(nd-A)&M]\
+ ^ra[(nd-B)&M]^ra[(nd-C)&M]^ra[(nd-D)&M])
+
+ so that (as long as you've defined nd,ra[M+1]), then you ca do things
+ like: 'if (RandomInteger < p) {...}'.
+
+ Note that n&M varies from 0 to M, *including* M, so that the
+ array has to be of size M+1. Since M+1 is a power of two, n&M
+ is a potentially quicker implementation of the equivalent n%(M+1).
+
+ This implementation copyright (C) 1998 James Theiler, based on
+ the example mt.c in the GSL, as implemented by Brian Gough.
+*/
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_rng.h>
+
+static inline unsigned long int gfsr4_get (void *vstate);
+static double gfsr4_get_double (void *vstate);
+static void gfsr4_set (void *state, unsigned long int s);
+
+/* Magic numbers */
+#define A 471
+#define B 1586
+#define C 6988
+#define D 9689
+#define M 16383 /* = 2^14-1 */
+/* #define M 0x0003fff */
+
+typedef struct
+ {
+ int nd;
+ unsigned long ra[M+1];
+ }
+gfsr4_state_t;
+
+static inline unsigned long
+gfsr4_get (void *vstate)
+{
+ gfsr4_state_t *state = (gfsr4_state_t *) vstate;
+
+ state->nd = ((state->nd)+1)&M;
+ return state->ra[(state->nd)] =
+ state->ra[((state->nd)+(M+1-A))&M]^
+ state->ra[((state->nd)+(M+1-B))&M]^
+ state->ra[((state->nd)+(M+1-C))&M]^
+ state->ra[((state->nd)+(M+1-D))&M];
+
+}
+
+static double
+gfsr4_get_double (void * vstate)
+{
+ return gfsr4_get (vstate) / 4294967296.0 ;
+}
+
+static void
+gfsr4_set (void *vstate, unsigned long int s)
+{
+ gfsr4_state_t *state = (gfsr4_state_t *) vstate;
+ int i, j;
+ /* Masks for turning on the diagonal bit and turning off the
+ leftmost bits */
+ unsigned long int msb = 0x80000000UL;
+ unsigned long int mask = 0xffffffffUL;
+
+ if (s == 0)
+ s = 4357; /* the default seed is 4357 */
+
+ /* We use the congruence s_{n+1} = (69069*s_n) mod 2^32 to
+ initialize the state. This works because ANSI-C unsigned long
+ integer arithmetic is automatically modulo 2^32 (or a higher
+ power of two), so we can safely ignore overflow. */
+
+#define LCG(n) ((69069 * n) & 0xffffffffUL)
+
+ /* Brian Gough suggests this to avoid low-order bit correlations */
+ for (i = 0; i <= M; i++)
+ {
+ unsigned long t = 0 ;
+ unsigned long bit = msb ;
+ for (j = 0; j < 32; j++)
+ {
+ s = LCG(s) ;
+ if (s & msb)
+ t |= bit ;
+ bit >>= 1 ;
+ }
+ state->ra[i] = t ;
+ }
+
+ /* Perform the "orthogonalization" of the matrix */
+ /* Based on the orthogonalization used in r250, as suggested initially
+ * by Kirkpatrick and Stoll, and pointed out to me by Brian Gough
+ */
+
+ /* BJG: note that this orthogonalisation doesn't have any effect
+ here because the the initial 6695 elements do not participate in
+ the calculation. For practical purposes this orthogonalisation
+ is somewhat irrelevant, because the probability of the original
+ sequence being degenerate should be exponentially small. */
+
+ for (i=0; i<32; ++i) {
+ int k=7+i*3;
+ state->ra[k] &= mask; /* Turn off bits left of the diagonal */
+ state->ra[k] |= msb; /* Turn on the diagonal bit */
+ mask >>= 1;
+ msb >>= 1;
+ }
+
+ state->nd = i;
+}
+
+static const gsl_rng_type gfsr4_type =
+{"gfsr4", /* name */
+ 0xffffffffUL, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (gfsr4_state_t),
+ &gfsr4_set,
+ &gfsr4_get,
+ &gfsr4_get_double};
+
+const gsl_rng_type *gsl_rng_gfsr4 = &gfsr4_type;
+
+
+
+
+
diff --git a/gsl-1.9/rng/gsl_rng.h b/gsl-1.9/rng/gsl_rng.h
new file mode 100644
index 0000000..a7c3a49
--- /dev/null
+++ b/gsl-1.9/rng/gsl_rng.h
@@ -0,0 +1,218 @@
+/* rng/gsl_rng.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_RNG_H__
+#define __GSL_RNG_H__
+#include <stdlib.h>
+#include <gsl/gsl_types.h>
+#include <gsl/gsl_errno.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+typedef struct
+ {
+ const char *name;
+ unsigned long int max;
+ unsigned long int min;
+ size_t size;
+ void (*set) (void *state, unsigned long int seed);
+ unsigned long int (*get) (void *state);
+ double (*get_double) (void *state);
+ }
+gsl_rng_type;
+
+typedef struct
+ {
+ const gsl_rng_type * type;
+ void *state;
+ }
+gsl_rng;
+
+
+/* These structs also need to appear in default.c so you can select
+ them via the environment variable GSL_RNG_TYPE */
+
+GSL_VAR const gsl_rng_type *gsl_rng_borosh13;
+GSL_VAR const gsl_rng_type *gsl_rng_coveyou;
+GSL_VAR const gsl_rng_type *gsl_rng_cmrg;
+GSL_VAR const gsl_rng_type *gsl_rng_fishman18;
+GSL_VAR const gsl_rng_type *gsl_rng_fishman20;
+GSL_VAR const gsl_rng_type *gsl_rng_fishman2x;
+GSL_VAR const gsl_rng_type *gsl_rng_gfsr4;
+GSL_VAR const gsl_rng_type *gsl_rng_knuthran;
+GSL_VAR const gsl_rng_type *gsl_rng_knuthran2;
+GSL_VAR const gsl_rng_type *gsl_rng_knuthran2002;
+GSL_VAR const gsl_rng_type *gsl_rng_lecuyer21;
+GSL_VAR const gsl_rng_type *gsl_rng_minstd;
+GSL_VAR const gsl_rng_type *gsl_rng_mrg;
+GSL_VAR const gsl_rng_type *gsl_rng_mt19937;
+GSL_VAR const gsl_rng_type *gsl_rng_mt19937_1999;
+GSL_VAR const gsl_rng_type *gsl_rng_mt19937_1998;
+GSL_VAR const gsl_rng_type *gsl_rng_r250;
+GSL_VAR const gsl_rng_type *gsl_rng_ran0;
+GSL_VAR const gsl_rng_type *gsl_rng_ran1;
+GSL_VAR const gsl_rng_type *gsl_rng_ran2;
+GSL_VAR const gsl_rng_type *gsl_rng_ran3;
+GSL_VAR const gsl_rng_type *gsl_rng_rand;
+GSL_VAR const gsl_rng_type *gsl_rng_rand48;
+GSL_VAR const gsl_rng_type *gsl_rng_random128_bsd;
+GSL_VAR const gsl_rng_type *gsl_rng_random128_glibc2;
+GSL_VAR const gsl_rng_type *gsl_rng_random128_libc5;
+GSL_VAR const gsl_rng_type *gsl_rng_random256_bsd;
+GSL_VAR const gsl_rng_type *gsl_rng_random256_glibc2;
+GSL_VAR const gsl_rng_type *gsl_rng_random256_libc5;
+GSL_VAR const gsl_rng_type *gsl_rng_random32_bsd;
+GSL_VAR const gsl_rng_type *gsl_rng_random32_glibc2;
+GSL_VAR const gsl_rng_type *gsl_rng_random32_libc5;
+GSL_VAR const gsl_rng_type *gsl_rng_random64_bsd;
+GSL_VAR const gsl_rng_type *gsl_rng_random64_glibc2;
+GSL_VAR const gsl_rng_type *gsl_rng_random64_libc5;
+GSL_VAR const gsl_rng_type *gsl_rng_random8_bsd;
+GSL_VAR const gsl_rng_type *gsl_rng_random8_glibc2;
+GSL_VAR const gsl_rng_type *gsl_rng_random8_libc5;
+GSL_VAR const gsl_rng_type *gsl_rng_random_bsd;
+GSL_VAR const gsl_rng_type *gsl_rng_random_glibc2;
+GSL_VAR const gsl_rng_type *gsl_rng_random_libc5;
+GSL_VAR const gsl_rng_type *gsl_rng_randu;
+GSL_VAR const gsl_rng_type *gsl_rng_ranf;
+GSL_VAR const gsl_rng_type *gsl_rng_ranlux;
+GSL_VAR const gsl_rng_type *gsl_rng_ranlux389;
+GSL_VAR const gsl_rng_type *gsl_rng_ranlxd1;
+GSL_VAR const gsl_rng_type *gsl_rng_ranlxd2;
+GSL_VAR const gsl_rng_type *gsl_rng_ranlxs0;
+GSL_VAR const gsl_rng_type *gsl_rng_ranlxs1;
+GSL_VAR const gsl_rng_type *gsl_rng_ranlxs2;
+GSL_VAR const gsl_rng_type *gsl_rng_ranmar;
+GSL_VAR const gsl_rng_type *gsl_rng_slatec;
+GSL_VAR const gsl_rng_type *gsl_rng_taus;
+GSL_VAR const gsl_rng_type *gsl_rng_taus2;
+GSL_VAR const gsl_rng_type *gsl_rng_taus113;
+GSL_VAR const gsl_rng_type *gsl_rng_transputer;
+GSL_VAR const gsl_rng_type *gsl_rng_tt800;
+GSL_VAR const gsl_rng_type *gsl_rng_uni;
+GSL_VAR const gsl_rng_type *gsl_rng_uni32;
+GSL_VAR const gsl_rng_type *gsl_rng_vax;
+GSL_VAR const gsl_rng_type *gsl_rng_waterman14;
+GSL_VAR const gsl_rng_type *gsl_rng_zuf;
+
+const gsl_rng_type ** gsl_rng_types_setup(void);
+
+GSL_VAR const gsl_rng_type *gsl_rng_default;
+GSL_VAR unsigned long int gsl_rng_default_seed;
+
+gsl_rng *gsl_rng_alloc (const gsl_rng_type * T);
+int gsl_rng_memcpy (gsl_rng * dest, const gsl_rng * src);
+gsl_rng *gsl_rng_clone (const gsl_rng * r);
+
+void gsl_rng_free (gsl_rng * r);
+
+void gsl_rng_set (const gsl_rng * r, unsigned long int seed);
+unsigned long int gsl_rng_max (const gsl_rng * r);
+unsigned long int gsl_rng_min (const gsl_rng * r);
+const char *gsl_rng_name (const gsl_rng * r);
+
+int gsl_rng_fread (FILE * stream, gsl_rng * r);
+int gsl_rng_fwrite (FILE * stream, const gsl_rng * r);
+
+size_t gsl_rng_size (const gsl_rng * r);
+void * gsl_rng_state (const gsl_rng * r);
+
+void gsl_rng_print_state (const gsl_rng * r);
+
+const gsl_rng_type * gsl_rng_env_setup (void);
+
+unsigned long int gsl_rng_get (const gsl_rng * r);
+double gsl_rng_uniform (const gsl_rng * r);
+double gsl_rng_uniform_pos (const gsl_rng * r);
+unsigned long int gsl_rng_uniform_int (const gsl_rng * r, unsigned long int n);
+
+
+#ifdef HAVE_INLINE
+extern inline unsigned long int gsl_rng_get (const gsl_rng * r);
+
+extern inline unsigned long int
+gsl_rng_get (const gsl_rng * r)
+{
+ return (r->type->get) (r->state);
+}
+
+extern inline double gsl_rng_uniform (const gsl_rng * r);
+
+extern inline double
+gsl_rng_uniform (const gsl_rng * r)
+{
+ return (r->type->get_double) (r->state);
+}
+
+extern inline double gsl_rng_uniform_pos (const gsl_rng * r);
+
+extern inline double
+gsl_rng_uniform_pos (const gsl_rng * r)
+{
+ double x ;
+ do
+ {
+ x = (r->type->get_double) (r->state) ;
+ }
+ while (x == 0) ;
+
+ return x ;
+}
+
+extern inline unsigned long int gsl_rng_uniform_int (const gsl_rng * r, unsigned long int n);
+
+extern inline unsigned long int
+gsl_rng_uniform_int (const gsl_rng * r, unsigned long int n)
+{
+ unsigned long int offset = r->type->min;
+ unsigned long int range = r->type->max - offset;
+ unsigned long int scale;
+ unsigned long int k;
+
+ if (n > range || n == 0)
+ {
+ GSL_ERROR_VAL ("invalid n, either 0 or exceeds maximum value of generator",
+ GSL_EINVAL, 0) ;
+ }
+
+ scale = range / n;
+
+ do
+ {
+ k = (((r->type->get) (r->state)) - offset) / scale;
+ }
+ while (k >= n);
+
+ return k;
+}
+#endif /* HAVE_INLINE */
+
+__END_DECLS
+
+#endif /* __GSL_RNG_H__ */
diff --git a/gsl-1.9/rng/knuthran.c b/gsl-1.9/rng/knuthran.c
new file mode 100644
index 0000000..e83678b
--- /dev/null
+++ b/gsl-1.9/rng/knuthran.c
@@ -0,0 +1,177 @@
+/* rng/knuthran.c
+ *
+ * Copyright (C) 2001 Brian Gough, Carlo Perassi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/*
+ * This generator is taken from
+ *
+ * Donald E. Knuth
+ * The Art of Computer Programming
+ * Volume 2
+ * Third Edition
+ * Addison-Wesley
+ * Section 3.6
+ *
+ * The comments are taken from the book
+ * Our comments are signed
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_rng.h>
+
+#define BUFLEN 2009 /* [Brian]: length of the buffer aa[] */
+#define KK 100 /* the long lag */
+#define LL 37 /* the short lag */
+#define MM (1L << 30) /* the modulus */
+#define TT 70 /* guaranteed separation between streams */
+
+#define evenize(x) ((x) & (MM - 2)) /* make x even */
+#define is_odd(x) ((x) & 1) /* the units bit of x */
+#define mod_diff(x, y) (((x) - (y)) & (MM - 1)) /* (x - y) mod MM */
+
+static inline void ran_array (unsigned long int aa[], unsigned int n,
+ unsigned long int ran_x[]);
+static inline unsigned long int ran_get (void *vstate);
+static double ran_get_double (void *vstate);
+static void ran_set (void *state, unsigned long int s);
+
+typedef struct
+{
+ unsigned int i;
+ unsigned long int aa[BUFLEN]; /* [Carlo]: I can't pass n to ran_array like
+ Knuth does */
+ unsigned long int ran_x[KK]; /* the generator state */
+}
+ran_state_t;
+
+static inline void
+ran_array (unsigned long int aa[], unsigned int n, unsigned long int ran_x[])
+{
+ unsigned int i;
+ unsigned int j;
+
+ for (j = 0; j < KK; j++)
+ aa[j] = ran_x[j];
+
+ for (; j < n; j++)
+ aa[j] = mod_diff (aa[j - KK], aa[j - LL]);
+
+ for (i = 0; i < LL; i++, j++)
+ ran_x[i] = mod_diff (aa[j - KK], aa[j - LL]);
+
+ for (; i < KK; i++, j++)
+ ran_x[i] = mod_diff (aa[j - KK], ran_x[i - LL]);
+}
+
+static inline unsigned long int
+ran_get (void *vstate)
+{
+ ran_state_t *state = (ran_state_t *) vstate;
+
+ unsigned int i = state->i;
+
+ if (i == 0)
+ {
+ /* fill buffer with new random numbers */
+ ran_array (state->aa, BUFLEN, state->ran_x);
+ }
+
+ state->i = (i + 1) % BUFLEN;
+
+ return state->aa[i];
+}
+
+static double
+ran_get_double (void *vstate)
+{
+ ran_state_t *state = (ran_state_t *) vstate;
+
+ return ran_get (state) / 1073741824.0; /* [Carlo]: RAND_MAX + 1 */
+}
+
+static void
+ran_set (void *vstate, unsigned long int s)
+{
+ ran_state_t *state = (ran_state_t *) vstate;
+
+ long x[KK + KK - 1]; /* the preparation buffer */
+
+ register int j;
+ register int t;
+ register long ss = evenize (s + 2);
+
+ for (j = 0; j < KK; j++)
+ {
+ x[j] = ss; /* bootstrap the buffer */
+ ss <<= 1;
+ if (ss >= MM) /* cyclic shift 29 bits */
+ ss -= MM - 2;
+ }
+ for (; j < KK + KK - 1; j++)
+ x[j] = 0;
+ x[1]++; /* make x[1] (and only x[1]) odd */
+ ss = s & (MM - 1);
+ t = TT - 1;
+ while (t)
+ {
+ for (j = KK - 1; j > 0; j--) /* square */
+ x[j + j] = x[j];
+ for (j = KK + KK - 2; j > KK - LL; j -= 2)
+ x[KK + KK - 1 - j] = evenize (x[j]);
+ for (j = KK + KK - 2; j >= KK; j--)
+ if (is_odd (x[j]))
+ {
+ x[j - (KK - LL)] = mod_diff (x[j - (KK - LL)], x[j]);
+ x[j - KK] = mod_diff (x[j - KK], x[j]);
+ }
+ if (is_odd (ss))
+ { /* multiply by "z" */
+ for (j = KK; j > 0; j--)
+ x[j] = x[j - 1];
+ x[0] = x[KK]; /* shift the buffer cyclically */
+ if (is_odd (x[KK]))
+ x[LL] = mod_diff (x[LL], x[KK]);
+ }
+ if (ss)
+ ss >>= 1;
+ else
+ t--;
+ }
+
+ state->i = 0;
+
+ for (j = 0; j < LL; j++)
+ state->ran_x[j + KK - LL] = x[j];
+ for (; j < KK; j++)
+ state->ran_x[j - LL] = x[j];
+
+ return;
+}
+
+static const gsl_rng_type ran_type = {
+ "knuthran", /* name */
+ 0x3fffffffUL, /* RAND_MAX *//* [Carlo]: (2 ^ 30) - 1 */
+ 0, /* RAND_MIN */
+ sizeof (ran_state_t),
+ &ran_set,
+ &ran_get,
+ &ran_get_double
+};
+
+const gsl_rng_type *gsl_rng_knuthran = &ran_type;
diff --git a/gsl-1.9/rng/knuthran2.c b/gsl-1.9/rng/knuthran2.c
new file mode 100644
index 0000000..30cd9d2
--- /dev/null
+++ b/gsl-1.9/rng/knuthran2.c
@@ -0,0 +1,103 @@
+/* rng/knuthran2.c
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/*
+ * This generator is taken from
+ *
+ * Donald E. Knuth
+ * The Art of Computer Programming
+ * Volume 2
+ * Third Edition
+ * Addison-Wesley
+ * Page 108
+ *
+ * This implementation copyright (C) 2001 Carlo Perassi
+ * and (C) 2003 Heiko Bauke.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_rng.h>
+
+#include "schrage.c"
+
+#define AA1 271828183UL
+#define AA2 1833324378UL /* = -314159269 mod (2 ^ 31 -1) */
+#define MM 0x7fffffffUL /* 2 ^ 31 - 1 */
+#define CEIL_SQRT_MM 46341UL /* sqrt(2 ^ 31 - 1) */
+
+static inline unsigned long int ran_get (void *vstate);
+static double ran_get_double (void *vstate);
+static void ran_set (void *state, unsigned long int s);
+
+typedef struct
+{
+ unsigned long int x0;
+ unsigned long int x1;
+}
+ran_state_t;
+
+static inline unsigned long int
+ran_get (void *vstate)
+{
+ ran_state_t *state = (ran_state_t *) vstate;
+
+ const unsigned long int xtmp = state->x1;
+ state->x1 = schrage_mult (AA1, state->x1, MM, CEIL_SQRT_MM)
+ + schrage_mult (AA2, state->x0, MM, CEIL_SQRT_MM);
+
+ if (state->x1 >= MM)
+ state->x1 -= MM;
+
+ state->x0 = xtmp;
+
+ return state->x1;
+}
+
+static double
+ran_get_double (void *vstate)
+{
+ ran_state_t *state = (ran_state_t *) vstate;
+
+ return ran_get (state) / 2147483647.0;
+}
+
+static void
+ran_set (void *vstate, unsigned long int s)
+{
+ ran_state_t *state = (ran_state_t *) vstate;
+
+ if ((s % MM) == 0)
+ s = 1; /* default seed is 1 */
+
+ state->x0 = s % MM;
+ state->x1 = s % MM;
+
+ return;
+}
+
+static const gsl_rng_type ran_type = {
+ "knuthran2", /* name */
+ MM - 1L, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (ran_state_t),
+ &ran_set,
+ &ran_get,
+ &ran_get_double
+};
+
+const gsl_rng_type *gsl_rng_knuthran2 = &ran_type;
diff --git a/gsl-1.9/rng/knuthran2002.c b/gsl-1.9/rng/knuthran2002.c
new file mode 100644
index 0000000..838b351
--- /dev/null
+++ b/gsl-1.9/rng/knuthran2002.c
@@ -0,0 +1,189 @@
+/* rng/knuthran2002.c
+ *
+ * Copyright (C) 2007 Brian Gough
+ * Copyright (C) 2001 Brian Gough, Carlo Perassi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/*
+ * This generator is taken from
+ *
+ * Donald E. Knuth, The Art of Computer Programming, Volume 2, Section 3.6
+ * Third Edition, Addison-Wesley,
+ *
+ * The modifications introduced in the 9th printing (2002) are
+ * included here; there's no backwards compatibility with the
+ * original. [ see http://www-cs-faculty.stanford.edu/~knuth/taocp.html ]
+ *
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_rng.h>
+
+#define BUFLEN 1009 /* length of the buffer aa[] */
+#define KK 100 /* the long lag */
+#define LL 37 /* the short lag */
+#define MM (1L << 30) /* the modulus */
+#define TT 70 /* guaranteed separation between streams */
+
+#define is_odd(x) ((x) & 1) /* the units bit of x */
+#define mod_diff(x, y) (((x) - (y)) & (MM - 1)) /* (x - y) mod MM */
+
+static inline void ran_array (long int aa[], unsigned int n,
+ long int ran_x[]);
+static inline unsigned long int ran_get (void *vstate);
+static double ran_get_double (void *vstate);
+static void ran_set (void *state, unsigned long int s);
+
+typedef struct
+{
+ unsigned int i;
+ long int aa[BUFLEN];
+ long int ran_x[KK]; /* the generator state */
+}
+ran_state_t;
+
+static inline void
+ran_array (long int aa[], unsigned int n, long int ran_x[])
+{
+ unsigned int i;
+ unsigned int j;
+
+ for (j = 0; j < KK; j++)
+ aa[j] = ran_x[j];
+
+ for (; j < n; j++)
+ aa[j] = mod_diff (aa[j - KK], aa[j - LL]);
+
+ for (i = 0; i < LL; i++, j++)
+ ran_x[i] = mod_diff (aa[j - KK], aa[j - LL]);
+
+ for (; i < KK; i++, j++)
+ ran_x[i] = mod_diff (aa[j - KK], ran_x[i - LL]);
+}
+
+static inline unsigned long int
+ran_get (void *vstate)
+{
+ ran_state_t *state = (ran_state_t *) vstate;
+
+ unsigned int i = state->i;
+ unsigned long int v;
+
+ if (i == 0)
+ {
+ /* fill buffer with new random numbers */
+ ran_array (state->aa, BUFLEN, state->ran_x);
+ }
+
+ v = state->aa[i];
+
+ state->i = (i + 1) % KK;
+
+ return v;
+}
+
+static double
+ran_get_double (void *vstate)
+{
+ ran_state_t *state = (ran_state_t *) vstate;
+
+ return ran_get (state) / 1073741824.0; /* RAND_MAX + 1 */
+}
+
+static void
+ran_set (void *vstate, unsigned long int s)
+{
+ ran_state_t *state = (ran_state_t *) vstate;
+
+ long x[KK + KK - 1]; /* the preparation buffer */
+
+ register int j;
+ register int t;
+ register long ss;
+
+ if (s == 0 )
+ s = 314159; /* default seed used by Knuth */
+
+ ss = (s + 2)&(MM-2);
+
+ for (j = 0; j < KK; j++)
+ {
+ x[j] = ss; /* bootstrap the buffer */
+ ss <<= 1;
+ if (ss >= MM) /* cyclic shift 29 bits */
+ ss -= MM - 2;
+ }
+ x[1]++; /* make x[1] (and only x[1]) odd */
+
+ ss = s & (MM - 1);
+ t = TT - 1;
+ while (t)
+ {
+ for (j = KK - 1; j > 0; j--) /* square */
+ {
+ x[j + j] = x[j];
+ x[j + j - 1] = 0;
+ }
+
+ for (j = KK + KK - 2; j >= KK; j--)
+ {
+ x[j - (KK - LL)] = mod_diff (x[j - (KK - LL)], x[j]);
+ x[j - KK] = mod_diff (x[j - KK], x[j]);
+ }
+
+ if (is_odd (ss))
+ { /* multiply by "z" */
+ for (j = KK; j > 0; j--)
+ {
+ x[j] = x[j - 1];
+ }
+ x[0] = x[KK]; /* shift the buffer cyclically */
+ x[LL] = mod_diff (x[LL], x[KK]);
+ }
+
+ if (ss)
+ ss >>= 1;
+ else
+ t--;
+ }
+
+ for (j = 0; j < LL; j++)
+ state->ran_x[j + KK - LL] = x[j];
+ for (; j < KK; j++)
+ state->ran_x[j - LL] = x[j];
+
+
+ for (j = 0; j< 10; j++)
+ ran_array(x, KK+KK-1, state->ran_x); /* warm things up */
+
+ state->i = 0;
+
+ return;
+}
+
+static const gsl_rng_type ran_type = {
+ "knuthran2002", /* name */
+ 0x3fffffffUL, /* RAND_MAX = (2 ^ 30) - 1 */
+ 0, /* RAND_MIN */
+ sizeof (ran_state_t),
+ &ran_set,
+ &ran_get,
+ &ran_get_double
+};
+
+const gsl_rng_type *gsl_rng_knuthran2002 = &ran_type;
diff --git a/gsl-1.9/rng/lecuyer21.c b/gsl-1.9/rng/lecuyer21.c
new file mode 100644
index 0000000..ee58128
--- /dev/null
+++ b/gsl-1.9/rng/lecuyer21.c
@@ -0,0 +1,99 @@
+/* rng/lecuyer21.c
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/*
+ * This generator is taken from
+ *
+ * Donald E. Knuth
+ * The Art of Computer Programming
+ * Volume 2
+ * Third Edition
+ * Addison-Wesley
+ * Page 108
+ *
+ * This implementation copyright (C) 2001 Brian Gough, Carlo Perassi
+ * and (C) 2003 Heiko Bauke.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_rng.h>
+
+#define AAA 40692
+#define MMM 2147483399UL
+#define QQQ 52774
+#define RRR 3791
+
+static inline unsigned long int ran_get (void *vstate);
+static double ran_get_double (void *vstate);
+static void ran_set (void *state, unsigned long int s);
+
+typedef struct
+{
+ unsigned long int x;
+}
+ran_state_t;
+
+static inline unsigned long int
+ran_get (void *vstate)
+{
+ ran_state_t *state = (ran_state_t *) vstate;
+
+ long int y = state->x;
+ long int r = RRR * (y / QQQ);
+
+ y = AAA * (y % QQQ) - r;
+ if (y < 0)
+ y += MMM;
+
+ state->x = y;
+
+ return state->x;
+}
+
+static double
+ran_get_double (void *vstate)
+{
+ ran_state_t *state = (ran_state_t *) vstate;
+
+ return ran_get (state) / 2147483399.0;
+}
+
+static void
+ran_set (void *vstate, unsigned long int s)
+{
+ ran_state_t *state = (ran_state_t *) vstate;
+
+ if ((s%MMM) == 0)
+ s = 1; /* default seed is 1 */
+
+ state->x = s % MMM;
+
+ return;
+}
+
+static const gsl_rng_type ran_type = {
+ "lecuyer21", /* name */
+ MMM-1, /* RAND_MAX */
+ 1, /* RAND_MIN */
+ sizeof (ran_state_t),
+ &ran_set,
+ &ran_get,
+ &ran_get_double
+};
+
+const gsl_rng_type *gsl_rng_lecuyer21 = &ran_type;
diff --git a/gsl-1.9/rng/minstd.c b/gsl-1.9/rng/minstd.c
new file mode 100644
index 0000000..b3efa9e
--- /dev/null
+++ b/gsl-1.9/rng/minstd.c
@@ -0,0 +1,109 @@
+/* rng/minstd.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_rng.h>
+
+/* MINSTD is Park and Miller's minimal standard generator (i.e. it's
+ not particularly good).
+
+ The sequence is
+
+ x_{n+1} = (a x_n) mod m
+
+ with a = 16807 and m = 2^31 - 1 = 2147483647. The seed specifies
+ the initial value, x_1.
+
+ The theoretical value of x_{10001} is 1043618065, starting with a
+ seed of x_1 = 1.
+
+ The period of this generator is 2^31.
+
+ It is used as the RNUN subroutine in the IMSL Library and the RAND
+ function in MATLAB. The generator is sometimes known by the acronym
+ "GGL" (I'm not sure what that stands for).
+
+ From: Park and Miller, "Random Number Generators: Good ones are
+ hard to find" Communications of the ACM, October 1988, Volume 31,
+ No 10, pages 1192-1201. */
+
+static inline unsigned long int minstd_get (void *vstate);
+static double minstd_get_double (void *vstate);
+static void minstd_set (void *state, unsigned long int s);
+
+static const long int m = 2147483647, a = 16807, q = 127773, r = 2836;
+
+typedef struct
+ {
+ unsigned long int x;
+ }
+minstd_state_t;
+
+static inline unsigned long int
+minstd_get (void *vstate)
+{
+ minstd_state_t *state = (minstd_state_t *) vstate;
+
+ const unsigned long int x = state->x;
+
+ const long int h = x / q;
+ const long int t = a * (x - h * q) - h * r;
+
+ if (t < 0)
+ {
+ state->x = t + m;
+ }
+ else
+ {
+ state->x = t;
+ }
+
+ return state->x;
+}
+
+static double
+minstd_get_double (void *vstate)
+{
+ return minstd_get (vstate) / 2147483647.0;
+}
+
+static void
+minstd_set (void *vstate, unsigned long int s)
+{
+ minstd_state_t *state = (minstd_state_t *) vstate;
+
+ if (s == 0)
+ s = 1; /* default seed is 1 */
+
+ state->x = s;
+
+ return;
+}
+
+static const gsl_rng_type minstd_type =
+{"minstd", /* name */
+ 2147483646, /* RAND_MAX */
+ 1, /* RAND_MIN */
+ sizeof (minstd_state_t),
+ &minstd_set,
+ &minstd_get,
+ &minstd_get_double};
+
+const gsl_rng_type *gsl_rng_minstd = &minstd_type;
diff --git a/gsl-1.9/rng/mrg.c b/gsl-1.9/rng/mrg.c
new file mode 100644
index 0000000..cb44b11
--- /dev/null
+++ b/gsl-1.9/rng/mrg.c
@@ -0,0 +1,149 @@
+/* rng/mrg.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_rng.h>
+
+/* This is a fifth-order multiple recursive generator. The sequence is,
+
+ x_n = (a_1 x_{n-1} + a_5 x_{n-5}) mod m
+
+ with a_1 = 107374182, a_2 = a_3 = a_4 = 0, a_5 = 104480 and m = 2^31-1.
+
+ We initialize the generator with x_n = s_n MOD m for n = 1..5,
+ where s_n = (69069 * s_{n-1}) mod 2^32, and s_0 = s is the
+ user-supplied seed.
+
+ NOTE: According to the paper the seeds must lie in the range [0,
+ 2^31 - 2] with at least one non-zero value -- our seeding procedure
+ satisfies these constraints.
+
+ We then use 6 iterations of the generator to "warm up" the internal
+ state.
+
+ With this initialization procedure the theoretical value of
+ z_{10006} is 2064828650 for s = 1. The subscript 10006 means (1)
+ seed the generator with s = 1, (2) do the 6 warm-up iterations
+ that are part of the seeding process, (3) then do 10000 actual
+ iterations.
+
+ The period of this generator is about 2^155.
+
+ From: P. L'Ecuyer, F. Blouin, and R. Coutre, "A search for good
+ multiple recursive random number generators", ACM Transactions on
+ Modeling and Computer Simulation 3, 87-98 (1993). */
+
+static inline unsigned long int mrg_get (void *vstate);
+static double mrg_get_double (void *vstate);
+static void mrg_set (void *state, unsigned long int s);
+
+static const long int m = 2147483647;
+static const long int a1 = 107374182, q1 = 20, r1 = 7;
+static const long int a5 = 104480, q5 = 20554, r5 = 1727;
+
+typedef struct
+ {
+ long int x1, x2, x3, x4, x5;
+ }
+mrg_state_t;
+
+static inline unsigned long int
+mrg_get (void *vstate)
+{
+ mrg_state_t *state = (mrg_state_t *) vstate;
+
+ long int p1, h1, p5, h5;
+
+ h5 = state->x5 / q5;
+ p5 = a5 * (state->x5 - h5 * q5) - h5 * r5;
+ if (p5 > 0)
+ p5 -= m;
+
+ h1 = state->x1 / q1;
+ p1 = a1 * (state->x1 - h1 * q1) - h1 * r1;
+ if (p1 < 0)
+ p1 += m;
+
+ state->x5 = state->x4;
+ state->x4 = state->x3;
+ state->x3 = state->x2;
+ state->x2 = state->x1;
+
+ state->x1 = p1 + p5;
+
+ if (state->x1 < 0)
+ state->x1 += m;
+
+ return state->x1;
+}
+
+static double
+mrg_get_double (void *vstate)
+{
+ return mrg_get (vstate) / 2147483647.0 ;
+}
+
+
+static void
+mrg_set (void *vstate, unsigned long int s)
+{
+ /* An entirely adhoc way of seeding! This does **not** come from
+ L'Ecuyer et al */
+
+ mrg_state_t *state = (mrg_state_t *) vstate;
+
+ if (s == 0)
+ s = 1; /* default seed is 1 */
+
+#define LCG(n) ((69069 * n) & 0xffffffffUL)
+ s = LCG (s);
+ state->x1 = s % m;
+ s = LCG (s);
+ state->x2 = s % m;
+ s = LCG (s);
+ state->x3 = s % m;
+ s = LCG (s);
+ state->x4 = s % m;
+ s = LCG (s);
+ state->x5 = s % m;
+
+ /* "warm it up" with at least 5 calls to go through
+ all the x values */
+
+ mrg_get (state);
+ mrg_get (state);
+ mrg_get (state);
+ mrg_get (state);
+ mrg_get (state);
+ mrg_get (state);
+
+ return;
+}
+
+static const gsl_rng_type mrg_type =
+{"mrg", /* name */
+ 2147483646, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (mrg_state_t),
+ &mrg_set,
+ &mrg_get,
+ &mrg_get_double};
+
+const gsl_rng_type *gsl_rng_mrg = &mrg_type;
diff --git a/gsl-1.9/rng/mt.c b/gsl-1.9/rng/mt.c
new file mode 100644
index 0000000..46de635
--- /dev/null
+++ b/gsl-1.9/rng/mt.c
@@ -0,0 +1,241 @@
+/* This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details. You should have received
+ a copy of the GNU General Public License along with this program;
+ if not, write to the Free Foundation, Inc., 59 Temple Place, Suite
+ 330, Boston, MA 02111-1307 USA
+
+ Original implementation was copyright (C) 1997 Makoto Matsumoto and
+ Takuji Nishimura. Coded by Takuji Nishimura, considering the
+ suggestions by Topher Cooper and Marc Rieffel in July-Aug. 1997, "A
+ C-program for MT19937: Integer version (1998/4/6)"
+
+ This implementation copyright (C) 1998 Brian Gough. I reorganized
+ the code to use the module framework of GSL. The license on this
+ implementation was changed from LGPL to GPL, following paragraph 3
+ of the LGPL, version 2.
+
+ Update:
+
+ The seeding procedure has been updated to match the 10/99 release
+ of MT19937.
+
+ Update:
+
+ The seeding procedure has been updated again to match the 2002
+ release of MT19937
+
+ The original code included the comment: "When you use this, send an
+ email to: matumoto@math.keio.ac.jp with an appropriate reference to
+ your work".
+
+ Makoto Matsumoto has a web page with more information about the
+ generator, http://www.math.keio.ac.jp/~matumoto/emt.html.
+
+ The paper below has details of the algorithm.
+
+ From: Makoto Matsumoto and Takuji Nishimura, "Mersenne Twister: A
+ 623-dimensionally equidistributerd uniform pseudorandom number
+ generator". ACM Transactions on Modeling and Computer Simulation,
+ Vol. 8, No. 1 (Jan. 1998), Pages 3-30
+
+ You can obtain the paper directly from Makoto Matsumoto's web page.
+
+ The period of this generator is 2^{19937} - 1.
+
+*/
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_rng.h>
+
+static inline unsigned long int mt_get (void *vstate);
+static double mt_get_double (void *vstate);
+static void mt_set (void *state, unsigned long int s);
+
+#define N 624 /* Period parameters */
+#define M 397
+
+/* most significant w-r bits */
+static const unsigned long UPPER_MASK = 0x80000000UL;
+
+/* least significant r bits */
+static const unsigned long LOWER_MASK = 0x7fffffffUL;
+
+typedef struct
+ {
+ unsigned long mt[N];
+ int mti;
+ }
+mt_state_t;
+
+static inline unsigned long
+mt_get (void *vstate)
+{
+ mt_state_t *state = (mt_state_t *) vstate;
+
+ unsigned long k ;
+ unsigned long int *const mt = state->mt;
+
+#define MAGIC(y) (((y)&0x1) ? 0x9908b0dfUL : 0)
+
+ if (state->mti >= N)
+ { /* generate N words at one time */
+ int kk;
+
+ for (kk = 0; kk < N - M; kk++)
+ {
+ unsigned long y = (mt[kk] & UPPER_MASK) | (mt[kk + 1] & LOWER_MASK);
+ mt[kk] = mt[kk + M] ^ (y >> 1) ^ MAGIC(y);
+ }
+ for (; kk < N - 1; kk++)
+ {
+ unsigned long y = (mt[kk] & UPPER_MASK) | (mt[kk + 1] & LOWER_MASK);
+ mt[kk] = mt[kk + (M - N)] ^ (y >> 1) ^ MAGIC(y);
+ }
+
+ {
+ unsigned long y = (mt[N - 1] & UPPER_MASK) | (mt[0] & LOWER_MASK);
+ mt[N - 1] = mt[M - 1] ^ (y >> 1) ^ MAGIC(y);
+ }
+
+ state->mti = 0;
+ }
+
+ /* Tempering */
+
+ k = mt[state->mti];
+ k ^= (k >> 11);
+ k ^= (k << 7) & 0x9d2c5680UL;
+ k ^= (k << 15) & 0xefc60000UL;
+ k ^= (k >> 18);
+
+ state->mti++;
+
+ return k;
+}
+
+static double
+mt_get_double (void * vstate)
+{
+ return mt_get (vstate) / 4294967296.0 ;
+}
+
+static void
+mt_set (void *vstate, unsigned long int s)
+{
+ mt_state_t *state = (mt_state_t *) vstate;
+ int i;
+
+ if (s == 0)
+ s = 4357; /* the default seed is 4357 */
+
+ state->mt[0]= s & 0xffffffffUL;
+
+ for (i = 1; i < N; i++)
+ {
+ /* See Knuth's "Art of Computer Programming" Vol. 2, 3rd
+ Ed. p.106 for multiplier. */
+
+ state->mt[i] =
+ (1812433253UL * (state->mt[i-1] ^ (state->mt[i-1] >> 30)) + i);
+
+ state->mt[i] &= 0xffffffffUL;
+ }
+
+ state->mti = i;
+}
+
+static void
+mt_1999_set (void *vstate, unsigned long int s)
+{
+ mt_state_t *state = (mt_state_t *) vstate;
+ int i;
+
+ if (s == 0)
+ s = 4357; /* the default seed is 4357 */
+
+ /* This is the October 1999 version of the seeding procedure. It
+ was updated by the original developers to avoid the periodicity
+ in the simple congruence originally used.
+
+ Note that an ANSI-C unsigned long integer arithmetic is
+ automatically modulo 2^32 (or a higher power of two), so we can
+ safely ignore overflow. */
+
+#define LCG(x) ((69069 * x) + 1) &0xffffffffUL
+
+ for (i = 0; i < N; i++)
+ {
+ state->mt[i] = s & 0xffff0000UL;
+ s = LCG(s);
+ state->mt[i] |= (s &0xffff0000UL) >> 16;
+ s = LCG(s);
+ }
+
+ state->mti = i;
+}
+
+/* This is the original version of the seeding procedure, no longer
+ used but available for compatibility with the original MT19937. */
+
+static void
+mt_1998_set (void *vstate, unsigned long int s)
+{
+ mt_state_t *state = (mt_state_t *) vstate;
+ int i;
+
+ if (s == 0)
+ s = 4357; /* the default seed is 4357 */
+
+ state->mt[0] = s & 0xffffffffUL;
+
+#define LCG1998(n) ((69069 * n) & 0xffffffffUL)
+
+ for (i = 1; i < N; i++)
+ state->mt[i] = LCG1998 (state->mt[i - 1]);
+
+ state->mti = i;
+}
+
+static const gsl_rng_type mt_type =
+{"mt19937", /* name */
+ 0xffffffffUL, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (mt_state_t),
+ &mt_set,
+ &mt_get,
+ &mt_get_double};
+
+static const gsl_rng_type mt_1999_type =
+{"mt19937_1999", /* name */
+ 0xffffffffUL, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (mt_state_t),
+ &mt_1999_set,
+ &mt_get,
+ &mt_get_double};
+
+static const gsl_rng_type mt_1998_type =
+{"mt19937_1998", /* name */
+ 0xffffffffUL, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (mt_state_t),
+ &mt_1998_set,
+ &mt_get,
+ &mt_get_double};
+
+const gsl_rng_type *gsl_rng_mt19937 = &mt_type;
+const gsl_rng_type *gsl_rng_mt19937_1999 = &mt_1999_type;
+const gsl_rng_type *gsl_rng_mt19937_1998 = &mt_1998_type;
+
+/* MT19937 is the default generator, so define that here too */
+
+const gsl_rng_type *gsl_rng_default = &mt_type;
+unsigned long int gsl_rng_default_seed = 0;
diff --git a/gsl-1.9/rng/r250.c b/gsl-1.9/rng/r250.c
new file mode 100644
index 0000000..e5b4df1
--- /dev/null
+++ b/gsl-1.9/rng/r250.c
@@ -0,0 +1,172 @@
+/* rng/r250.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_rng.h>
+
+/* This is a shift-register random number generator. The sequence is
+
+ x_n = x_{n-103} ^ x_{n-250} ("^" means XOR)
+
+ defined on 32-bit words.
+
+ BJG: Note that this implementation actually uses the sequence, x_n
+ = x_{n-147} ^ x_{n-250} which generates the outputs in
+ time-reversed order but is otherwise completely equivalent.
+
+ The first 250 elements x_1 .. x_250 are first initialized as x_n =
+ s_n, where s_n = (69069*s_{n-1}) mod 2^32 and s_0=s is the
+ user-supplied seed. To ensure that the sequence does not lie on a
+ subspace we force 32 of the entries to be linearly independent. We
+ take the 32 elements x[3], x[10], x[17], x[24], ..., 213 and apply
+ the following operations,
+
+ x[3] &= 11111111111111111111111111111111
+ x[3] |= 10000000000000000000000000000000
+ x[10] &= 01111111111111111111111111111111
+ x[10] |= 01000000000000000000000000000000
+ x[17] &= 00111111111111111111111111111111
+ x[17] |= 00100000000000000000000000000000
+ .... ...
+ x[206] &= 00000000000000000000000000000111
+ x[206] |= 00000000000000000000000000000100
+ x[213] &= 00000000000000000000000000000011
+ x[213] |= 00000000000000000000000000000010
+ x[220] &= 00000000000000000000000000000001
+ x[220] |= 00000000000000000000000000000001
+
+ i.e. if we consider the bits of the 32 elements as forming a 32x32
+ array then we are setting the diagonal bits of the array to one and
+ masking the lower triangle below the diagonal to zero.
+
+ With this initialization procedure the theoretical value of
+ x_{10001} is 1100653588 for s = 1 (Actually I got this by running
+ the original code). The subscript 10001 means (1) seed the
+ generator with s = 1 and then do 10000 actual iterations.
+
+ The period of this generator is about 2^250.
+
+ The algorithm works for any number of bits. It is implemented here
+ for 32 bits.
+
+ From: S. Kirkpatrick and E. Stoll, "A very fast shift-register
+ sequence random number generator", Journal of Computational Physics,
+ 40, 517-526 (1981). */
+
+static inline unsigned long int r250_get (void *vstate);
+static double r250_get_double (void *vstate);
+static void r250_set (void *state, unsigned long int s);
+
+typedef struct
+ {
+ int i;
+ unsigned long x[250];
+ }
+r250_state_t;
+
+static inline unsigned long int
+r250_get (void *vstate)
+{
+ r250_state_t *state = (r250_state_t *) vstate;
+ unsigned long int k;
+ int j;
+
+ int i = state->i;
+
+ if (i >= 147)
+ {
+ j = i - 147;
+ }
+ else
+ {
+ j = i + 103;
+ }
+
+ k = state->x[i] ^ state->x[j];
+ state->x[i] = k;
+
+ if (i >= 249)
+ {
+ state->i = 0;
+ }
+ else
+ {
+ state->i = i + 1;
+ }
+
+ return k;
+}
+
+static double
+r250_get_double (void *vstate)
+{
+ return r250_get (vstate) / 4294967296.0 ;
+}
+
+static void
+r250_set (void *vstate, unsigned long int s)
+{
+ r250_state_t *state = (r250_state_t *) vstate;
+
+ int i;
+
+ if (s == 0)
+ s = 1; /* default seed is 1 */
+
+ state->i = 0;
+
+#define LCG(n) ((69069 * n) & 0xffffffffUL)
+
+ for (i = 0; i < 250; i++) /* Fill the buffer */
+ {
+ s = LCG (s);
+ state->x[i] = s;
+ }
+
+ {
+ /* Masks for turning on the diagonal bit and turning off the
+ leftmost bits */
+
+ unsigned long int msb = 0x80000000UL;
+ unsigned long int mask = 0xffffffffUL;
+
+ for (i = 0; i < 32; i++)
+ {
+ int k = 7 * i + 3; /* Select a word to operate on */
+ state->x[k] &= mask; /* Turn off bits left of the diagonal */
+ state->x[k] |= msb; /* Turn on the diagonal bit */
+ mask >>= 1;
+ msb >>= 1;
+ }
+ }
+
+ return;
+}
+
+static const gsl_rng_type r250_type =
+{"r250", /* name */
+ 0xffffffffUL, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (r250_state_t),
+ &r250_set,
+ &r250_get,
+ &r250_get_double};
+
+const gsl_rng_type *gsl_rng_r250 = &r250_type;
diff --git a/gsl-1.9/rng/ran0.c b/gsl-1.9/rng/ran0.c
new file mode 100644
index 0000000..108a905
--- /dev/null
+++ b/gsl-1.9/rng/ran0.c
@@ -0,0 +1,100 @@
+/* rng/ran0.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_rng.h>
+
+/* This is an implementation of the algorithm used in Numerical
+ Recipe's ran0 generator. It is the same as MINSTD with an XOR mask
+ of 123459876 on the seed.
+
+ The period of this generator is 2^31.
+
+ Note, if you choose a seed of 123459876 it would give a degenerate
+ series 0,0,0,0, ... I've made that into an error. */
+
+static inline unsigned long int ran0_get (void *vstate);
+static double ran0_get_double (void *vstate);
+static void ran0_set (void *state, unsigned long int s);
+
+static const long int m = 2147483647, a = 16807, q = 127773, r = 2836;
+static const unsigned long int mask = 123459876;
+
+typedef struct
+ {
+ unsigned long int x;
+ }
+ran0_state_t;
+
+static inline unsigned long int
+ran0_get (void *vstate)
+{
+ ran0_state_t *state = (ran0_state_t *) vstate;
+
+ const unsigned long int x = state->x;
+
+ const long int h = x / q;
+ const long int t = a * (x - h * q) - h * r;
+
+ if (t < 0)
+ {
+ state->x = t + m;
+ }
+ else
+ {
+ state->x = t;
+ }
+
+ return state->x;
+}
+
+static double
+ran0_get_double (void *vstate)
+{
+ return ran0_get (vstate) / 2147483647.0 ;
+}
+
+static void
+ran0_set (void *vstate, unsigned long int s)
+{
+ ran0_state_t *state = (ran0_state_t *) vstate;
+
+ if (s == mask)
+ {
+ GSL_ERROR_VOID ("ran0 should not use seed == mask",
+ GSL_EINVAL);
+ }
+
+ state->x = s ^ mask;
+
+ return;
+}
+
+static const gsl_rng_type ran0_type =
+{"ran0", /* name */
+ 2147483646, /* RAND_MAX */
+ 1, /* RAND_MIN */
+ sizeof (ran0_state_t),
+ &ran0_set,
+ &ran0_get,
+ &ran0_get_double};
+
+const gsl_rng_type *gsl_rng_ran0 = &ran0_type;
diff --git a/gsl-1.9/rng/ran1.c b/gsl-1.9/rng/ran1.c
new file mode 100644
index 0000000..0802ad2
--- /dev/null
+++ b/gsl-1.9/rng/ran1.c
@@ -0,0 +1,130 @@
+/* rng/ran1.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_rng.h>
+
+/* This is an implementation of the algorithm used in Numerical
+ Recipe's ran1 generator. It is MINSTD with a 32-element
+ shuffle-box. */
+
+static inline unsigned long int ran1_get (void *vstate);
+static double ran1_get_double (void *vstate);
+static void ran1_set (void *state, unsigned long int s);
+
+static const long int m = 2147483647, a = 16807, q = 127773, r = 2836;
+
+#define N_SHUFFLE 32
+#define N_DIV (1 + 2147483646/N_SHUFFLE)
+
+typedef struct
+ {
+ unsigned long int x;
+ unsigned long int n;
+ unsigned long int shuffle[N_SHUFFLE];
+ }
+ran1_state_t;
+
+static inline unsigned long int
+ran1_get (void *vstate)
+{
+ ran1_state_t *state = (ran1_state_t *) vstate;
+
+ const unsigned long int x = state->x;
+
+ const long int h = x / q;
+ const long int t = a * (x - h * q) - h * r;
+
+ if (t < 0)
+ {
+ state->x = t + m;
+ }
+ else
+ {
+ state->x = t;
+ }
+
+ {
+ unsigned long int j = state->n / N_DIV;
+ state->n = state->shuffle[j];
+ state->shuffle[j] = state->x;
+ }
+
+ return state->n;
+}
+
+static double
+ran1_get_double (void *vstate)
+{
+ float x_max = 1 - 1.2e-7f ; /* Numerical Recipes version of 1-FLT_EPS */
+
+ float x = ran1_get (vstate) / 2147483647.0f ;
+
+ if (x > x_max)
+ return x_max ;
+
+ return x ;
+}
+
+
+static void
+ran1_set (void *vstate, unsigned long int s)
+{
+ ran1_state_t *state = (ran1_state_t *) vstate;
+ int i;
+
+ if (s == 0)
+ s = 1; /* default seed is 1 */
+
+ for (i = 0; i < 8; i++)
+ {
+ long int h = s / q;
+ long int t = a * (s - h * q) - h * r;
+ if (t < 0)
+ t += m;
+ s = t;
+ }
+
+ for (i = N_SHUFFLE - 1; i >= 0; i--)
+ {
+ long int h = s / q;
+ long int t = a * (s - h * q) - h * r;
+ if (t < 0)
+ t += m;
+ s = t;
+ state->shuffle[i] = s;
+ }
+
+ state->x = s;
+ state->n = s;
+
+ return;
+}
+
+static const gsl_rng_type ran1_type =
+{"ran1", /* name */
+ 2147483646, /* RAND_MAX */
+ 1, /* RAND_MIN */
+ sizeof (ran1_state_t),
+ &ran1_set,
+ &ran1_get,
+ &ran1_get_double};
+
+const gsl_rng_type *gsl_rng_ran1 = &ran1_type;
diff --git a/gsl-1.9/rng/ran2.c b/gsl-1.9/rng/ran2.c
new file mode 100644
index 0000000..ec6d38d
--- /dev/null
+++ b/gsl-1.9/rng/ran2.c
@@ -0,0 +1,146 @@
+/* rng/ran2.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_rng.h>
+
+/* This is an implementation of the algorithm used in Numerical
+ Recipe's ran2 generator. It is a L'Ecuyer combined recursive
+ generator with a 32-element shuffle-box.
+
+ As far as I can tell, in general the effects of adding a shuffle
+ box cannot be proven theoretically, so the period of this generator
+ is unknown.
+
+ The period of the underlying combined generator is O(2^60). */
+
+static inline unsigned long int ran2_get (void *vstate);
+static double ran2_get_double (void *vstate);
+static void ran2_set (void *state, unsigned long int s);
+
+static const long int m1 = 2147483563, a1 = 40014, q1 = 53668, r1 = 12211;
+static const long int m2 = 2147483399, a2 = 40692, q2 = 52774, r2 = 3791;
+
+#define N_SHUFFLE 32
+#define N_DIV (1 + 2147483562/N_SHUFFLE)
+
+typedef struct
+ {
+ unsigned long int x;
+ unsigned long int y;
+ unsigned long int n;
+ unsigned long int shuffle[N_SHUFFLE];
+ }
+ran2_state_t;
+
+static inline unsigned long int
+ran2_get (void *vstate)
+{
+ ran2_state_t *state = (ran2_state_t *) vstate;
+
+ const unsigned long int x = state->x;
+ const unsigned long int y = state->y;
+
+ long int h1 = x / q1;
+ long int t1 = a1 * (x - h1 * q1) - h1 * r1;
+
+ long int h2 = y / q2;
+ long int t2 = a2 * (y - h2 * q2) - h2 * r2;
+
+ if (t1 < 0)
+ t1 += m1;
+
+ if (t2 < 0)
+ t2 += m2;
+
+ state->x = t1;
+ state->y = t2;
+
+ {
+ unsigned long int j = state->n / N_DIV;
+ long int delta = state->shuffle[j] - t2;
+ if (delta < 1)
+ delta += m1 - 1;
+ state->n = delta;
+ state->shuffle[j] = t1;
+ }
+
+ return state->n;
+}
+
+static double
+ran2_get_double (void *vstate)
+{
+ float x_max = 1 - 1.2e-7f ; /* Numerical Recipes version of 1-FLT_EPS */
+
+ float x = ran2_get (vstate) / 2147483563.0f ;
+
+ if (x > x_max)
+ return x_max ;
+
+ return x ;
+}
+
+static void
+ran2_set (void *vstate, unsigned long int s)
+{
+ ran2_state_t *state = (ran2_state_t *) vstate;
+ int i;
+
+ if (s == 0)
+ s = 1; /* default seed is 1 */
+
+ state->y = s;
+
+ for (i = 0; i < 8; i++)
+ {
+ long int h = s / q1;
+ long int t = a1 * (s - h * q1) - h * r1;
+ if (t < 0)
+ t += m1;
+ s = t;
+ }
+
+ for (i = N_SHUFFLE - 1; i >= 0; i--)
+ {
+ long int h = s / q1;
+ long int t = a1 * (s - h * q1) - h * r1;
+ if (t < 0)
+ t += m1;
+ s = t;
+ state->shuffle[i] = s;
+ }
+
+ state->x = s;
+ state->n = s;
+
+ return;
+}
+
+static const gsl_rng_type ran2_type =
+{"ran2", /* name */
+ 2147483562, /* RAND_MAX */
+ 1, /* RAND_MIN */
+ sizeof (ran2_state_t),
+ &ran2_set,
+ &ran2_get,
+ &ran2_get_double};
+
+const gsl_rng_type *gsl_rng_ran2 = &ran2_type;
diff --git a/gsl-1.9/rng/ran3.c b/gsl-1.9/rng/ran3.c
new file mode 100644
index 0000000..7ccc47c
--- /dev/null
+++ b/gsl-1.9/rng/ran3.c
@@ -0,0 +1,132 @@
+/* rng/ran3.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_rng.h>
+
+/* This is an implementation of the algorithm used in Knuths's
+ subtractive generator, with the Numerical Recipe's ran3 paramters.
+ It is a subtractive lagged fibonnaci generator. */
+
+static inline unsigned long int ran3_get (void *vstate);
+static double ran3_get_double (void *vstate);
+static void ran3_set (void *state, unsigned long int s);
+
+#define M_BIG 1000000000
+#define M_SEED 161803398
+
+typedef struct
+ {
+ unsigned int x;
+ unsigned int y;
+ unsigned long int buffer[56];
+ }
+ran3_state_t;
+
+static inline unsigned long int
+ran3_get (void *vstate)
+{
+ ran3_state_t *state = (ran3_state_t *) vstate;
+ long int j;
+
+ state->x++;
+
+ if (state->x == 56)
+ state->x = 1;
+
+ state->y++;
+
+ if (state->y == 56)
+ state->y = 1;
+
+ j = state->buffer[state->x] - state->buffer[state->y];
+
+ if (j < 0)
+ j += M_BIG;
+
+ state->buffer[state->x] = j;
+
+ return j;
+}
+
+static double
+ran3_get_double (void *vstate)
+{
+ return ran3_get (vstate) / (double) M_BIG ;
+}
+
+static void
+ran3_set (void *vstate, unsigned long int s)
+{
+ ran3_state_t *state = (ran3_state_t *) vstate;
+ int i, i1;
+ long int j, k;
+
+ if (s == 0)
+ s = 1; /* default seed is 1 */
+
+ j = (M_SEED - s) % M_BIG;
+
+ /* the zeroth element is never used, but we initialize it for
+ consistency between states */
+
+ state->buffer[0] = 0;
+
+ state->buffer[55] = j;
+
+ k = 1;
+ for (i = 1; i < 55; i++)
+ {
+ int n = (21 * i) % 55;
+ state->buffer[n] = k;
+ k = j - k;
+ if (k < 0)
+ k += M_BIG;
+ j = state->buffer[n];
+
+ }
+
+ for (i1 = 0; i1 < 4; i1++)
+ {
+ for (i = 1; i < 56; i++)
+ {
+ long int t = state->buffer[i] - state->buffer[1 + (i + 30) % 55];
+ if (t < 0)
+ t += M_BIG;
+ state->buffer[i] = t;
+ }
+ }
+
+ state->x = 0;
+ state->y = 31;
+
+ return;
+}
+
+static const gsl_rng_type ran3_type =
+{"ran3", /* name */
+ M_BIG, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (ran3_state_t),
+ &ran3_set,
+ &ran3_get,
+ &ran3_get_double};
+
+const gsl_rng_type *gsl_rng_ran3 = &ran3_type;
diff --git a/gsl-1.9/rng/rand.c b/gsl-1.9/rng/rand.c
new file mode 100644
index 0000000..4c50a62
--- /dev/null
+++ b/gsl-1.9/rng/rand.c
@@ -0,0 +1,85 @@
+/* rng/rand.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_rng.h>
+
+/* This is the old BSD rand() generator. The sequence is
+
+ x_{n+1} = (a x_n + c) mod m
+
+ with a = 1103515245, c = 12345 and m = 2^31 = 2147483648. The seed
+ specifies the initial value, x_1.
+
+ The theoretical value of x_{10001} is 1910041713.
+
+ The period of this generator is 2^31.
+
+ The rand() generator is not very good -- the low bits of successive
+ numbers are correlated. */
+
+static inline unsigned long int rand_get (void *vstate);
+static double rand_get_double (void *vstate);
+static void rand_set (void *state, unsigned long int s);
+
+typedef struct
+ {
+ unsigned long int x;
+ }
+rand_state_t;
+
+static inline unsigned long int
+rand_get (void *vstate)
+{
+ rand_state_t *state = (rand_state_t *) vstate;
+
+ /* The following line relies on unsigned 32-bit arithmetic */
+
+ state->x = (1103515245 * state->x + 12345) & 0x7fffffffUL;
+
+ return state->x;
+}
+
+static double
+rand_get_double (void *vstate)
+{
+ return rand_get (vstate) / 2147483648.0 ;
+}
+
+static void
+rand_set (void *vstate, unsigned long int s)
+{
+ rand_state_t *state = (rand_state_t *) vstate;
+
+ state->x = s;
+
+ return;
+}
+
+static const gsl_rng_type rand_type =
+{"rand", /* name */
+ 0x7fffffffUL, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (rand_state_t),
+ &rand_set,
+ &rand_get,
+ &rand_get_double};
+
+const gsl_rng_type *gsl_rng_rand = &rand_type;
diff --git a/gsl-1.9/rng/rand48.c b/gsl-1.9/rng/rand48.c
new file mode 100644
index 0000000..f01a351
--- /dev/null
+++ b/gsl-1.9/rng/rand48.c
@@ -0,0 +1,143 @@
+/* rng/rand48.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <stdlib.h>
+#include <gsl/gsl_sys.h>
+#include <gsl/gsl_rng.h>
+
+/* This is the Unix rand48() generator. The generator returns the
+ upper 32 bits from each term of the sequence,
+
+ x_{n+1} = (a x_n + c) mod m
+
+ using 48-bit unsigned arithmetic, with a = 0x5DEECE66D , c = 0xB
+ and m = 2^48. The seed specifies the upper 32 bits of the initial
+ value, x_1, with the lower 16 bits set to 0x330E.
+
+ The theoretical value of x_{10001} is 244131582646046.
+
+ The period of this generator is ? FIXME (probably around 2^48). */
+
+static inline void rand48_advance (void *vstate);
+static unsigned long int rand48_get (void *vstate);
+static double rand48_get_double (void *vstate);
+static void rand48_set (void *state, unsigned long int s);
+
+static const unsigned short int a0 = 0xE66D ;
+static const unsigned short int a1 = 0xDEEC ;
+static const unsigned short int a2 = 0x0005 ;
+
+static const unsigned short int c0 = 0x000B ;
+
+typedef struct
+ {
+ unsigned short int x0, x1, x2;
+ }
+rand48_state_t;
+
+static inline void
+rand48_advance (void *vstate)
+{
+ rand48_state_t *state = (rand48_state_t *) vstate;
+
+ /* work with unsigned long ints throughout to get correct integer
+ promotions of any unsigned short ints */
+
+ const unsigned long int x0 = (unsigned long int) state->x0 ;
+ const unsigned long int x1 = (unsigned long int) state->x1 ;
+ const unsigned long int x2 = (unsigned long int) state->x2 ;
+
+ unsigned long int a ;
+
+ a = a0 * x0 + c0 ;
+ state->x0 = (a & 0xFFFF) ;
+
+ a >>= 16 ;
+
+ /* although the next line may overflow we only need the top 16 bits
+ in the following stage, so it does not matter */
+
+ a += a0 * x1 + a1 * x0 ;
+ state->x1 = (a & 0xFFFF) ;
+
+ a >>= 16 ;
+ a += a0 * x2 + a1 * x1 + a2 * x0 ;
+ state->x2 = (a & 0xFFFF) ;
+}
+
+static unsigned long int
+rand48_get (void *vstate)
+{
+ unsigned long int x1, x2;
+
+ rand48_state_t *state = (rand48_state_t *) vstate;
+ rand48_advance (state) ;
+
+ x2 = (unsigned long int) state->x2;
+ x1 = (unsigned long int) state->x1;
+
+ return (x2 << 16) + x1;
+}
+
+static double
+rand48_get_double (void * vstate)
+{
+ rand48_state_t *state = (rand48_state_t *) vstate;
+
+ rand48_advance (state) ;
+
+ return (ldexp((double) state->x2, -16)
+ + ldexp((double) state->x1, -32)
+ + ldexp((double) state->x0, -48)) ;
+}
+
+static void
+rand48_set (void *vstate, unsigned long int s)
+{
+ rand48_state_t *state = (rand48_state_t *) vstate;
+
+ if (s == 0) /* default seed */
+ {
+ state->x0 = 0x330E ;
+ state->x1 = 0xABCD ;
+ state->x2 = 0x1234 ;
+ }
+ else
+ {
+ state->x0 = 0x330E ;
+ state->x1 = s & 0xFFFF ;
+ state->x2 = (s >> 16) & 0xFFFF ;
+ }
+
+ return;
+}
+
+static const gsl_rng_type rand48_type =
+{"rand48", /* name */
+ 0xffffffffUL, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (rand48_state_t),
+ &rand48_set,
+ &rand48_get,
+ &rand48_get_double
+};
+
+const gsl_rng_type *gsl_rng_rand48 = &rand48_type;
diff --git a/gsl-1.9/rng/random.c b/gsl-1.9/rng/random.c
new file mode 100644
index 0000000..08697a9
--- /dev/null
+++ b/gsl-1.9/rng/random.c
@@ -0,0 +1,656 @@
+/* rng/random.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_rng.h>
+
+/* This file provides support for random() generators. There are three
+ versions in widespread use today,
+
+ - The original BSD version, e.g. on SunOS 4.1 and FreeBSD.
+
+ - The Linux libc5 version, which is differs from the BSD version in
+ its seeding procedure, possibly due to the introduction of a typo
+ in the multiplier.
+
+ - The GNU glibc2 version, which has a new (and better) seeding
+ procedure.
+
+ They all produce different numbers, due to the different seeding
+ algorithms, but the algorithm for the generator is the same in each
+ case.
+
+ */
+
+static inline long int random_get (int * i, int * j, int n, long int * x);
+
+static inline unsigned long int random8_get (void *vstate);
+static inline unsigned long int random32_get (void *vstate);
+static inline unsigned long int random64_get (void *vstate);
+static inline unsigned long int random128_get (void *vstate);
+static inline unsigned long int random256_get (void *vstate);
+
+static double random8_get_double (void *vstate);
+static double random32_get_double (void *vstate);
+static double random64_get_double (void *vstate);
+static double random128_get_double (void *vstate);
+static double random256_get_double (void *vstate);
+
+static void random8_glibc2_set (void *state, unsigned long int s);
+static void random32_glibc2_set (void *state, unsigned long int s);
+static void random64_glibc2_set (void *state, unsigned long int s);
+static void random128_glibc2_set (void *state, unsigned long int s);
+static void random256_glibc2_set (void *state, unsigned long int s);
+
+static void random8_libc5_set (void *state, unsigned long int s);
+static void random32_libc5_set (void *state, unsigned long int s);
+static void random64_libc5_set (void *state, unsigned long int s);
+static void random128_libc5_set (void *state, unsigned long int s);
+static void random256_libc5_set (void *state, unsigned long int s);
+
+static void random8_bsd_set (void *state, unsigned long int s);
+static void random32_bsd_set (void *state, unsigned long int s);
+static void random64_bsd_set (void *state, unsigned long int s);
+static void random128_bsd_set (void *state, unsigned long int s);
+static void random256_bsd_set (void *state, unsigned long int s);
+
+static void bsd_initialize (long int * x, int n, unsigned long int s);
+static void libc5_initialize (long int * x, int n, unsigned long int s);
+static void glibc2_initialize (long int * x, int n, unsigned long int s);
+
+typedef struct
+ {
+ long int x;
+ }
+random8_state_t;
+
+typedef struct
+ {
+ int i, j;
+ long int x[7];
+ }
+random32_state_t;
+
+typedef struct
+ {
+ int i, j;
+ long int x[15];
+ }
+random64_state_t;
+
+typedef struct
+ {
+ int i, j;
+ long int x[31];
+ }
+random128_state_t;
+
+typedef struct
+ {
+ int i, j;
+ long int x[63];
+ }
+random256_state_t;
+
+static inline unsigned long int
+random8_get (void *vstate)
+{
+ random8_state_t *state = (random8_state_t *) vstate;
+
+ state->x = (1103515245 * state->x + 12345) & 0x7fffffffUL;
+ return state->x;
+}
+
+static inline long int
+random_get (int * i, int * j, int n, long int * x)
+{
+ long int k ;
+
+ x[*i] += x[*j] ;
+ k = (x[*i] >> 1) & 0x7FFFFFFF ;
+
+ (*i)++ ;
+ if (*i == n)
+ *i = 0 ;
+
+ (*j)++ ;
+ if (*j == n)
+ *j = 0 ;
+
+ return k ;
+}
+
+static inline unsigned long int
+random32_get (void *vstate)
+{
+ random32_state_t *state = (random32_state_t *) vstate;
+ unsigned long int k = random_get (&state->i, &state->j, 7, state->x) ;
+ return k ;
+}
+
+static inline unsigned long int
+random64_get (void *vstate)
+{
+ random64_state_t *state = (random64_state_t *) vstate;
+ long int k = random_get (&state->i, &state->j, 15, state->x) ;
+ return k ;
+}
+
+static inline unsigned long int
+random128_get (void *vstate)
+{
+ random128_state_t *state = (random128_state_t *) vstate;
+ unsigned long int k = random_get (&state->i, &state->j, 31, state->x) ;
+ return k ;
+}
+
+static inline unsigned long int
+random256_get (void *vstate)
+{
+ random256_state_t *state = (random256_state_t *) vstate;
+ long int k = random_get (&state->i, &state->j, 63, state->x) ;
+ return k ;
+}
+
+static double
+random8_get_double (void *vstate)
+{
+ return random8_get (vstate) / 2147483648.0 ;
+}
+
+static double
+random32_get_double (void *vstate)
+{
+ return random32_get (vstate) / 2147483648.0 ;
+}
+
+static double
+random64_get_double (void *vstate)
+{
+ return random64_get (vstate) / 2147483648.0 ;
+}
+
+static double
+random128_get_double (void *vstate)
+{
+ return random128_get (vstate) / 2147483648.0 ;
+}
+
+static double
+random256_get_double (void *vstate)
+{
+ return random256_get (vstate) / 2147483648.0 ;
+}
+
+static void
+random8_bsd_set (void *vstate, unsigned long int s)
+{
+ random8_state_t *state = (random8_state_t *) vstate;
+
+ if (s == 0)
+ s = 1;
+
+ state->x = s;
+}
+
+static void
+random32_bsd_set (void *vstate, unsigned long int s)
+{
+ random32_state_t *state = (random32_state_t *) vstate;
+ int i;
+
+ bsd_initialize (state->x, 7, s) ;
+
+ state->i = 3;
+ state->j = 0;
+
+ for (i = 0 ; i < 10 * 7 ; i++)
+ random32_get (state) ;
+}
+
+static void
+random64_bsd_set (void *vstate, unsigned long int s)
+{
+ random64_state_t *state = (random64_state_t *) vstate;
+ int i;
+
+ bsd_initialize (state->x, 15, s) ;
+
+ state->i = 1;
+ state->j = 0;
+
+ for (i = 0 ; i < 10 * 15 ; i++)
+ random64_get (state) ;
+}
+
+static void
+random128_bsd_set (void *vstate, unsigned long int s)
+{
+ random128_state_t *state = (random128_state_t *) vstate;
+ int i;
+
+ bsd_initialize (state->x, 31, s) ;
+
+ state->i = 3;
+ state->j = 0;
+
+ for (i = 0 ; i < 10 * 31 ; i++)
+ random128_get (state) ;
+}
+
+static void
+random256_bsd_set (void *vstate, unsigned long int s)
+{
+ random256_state_t *state = (random256_state_t *) vstate;
+ int i;
+
+ bsd_initialize (state->x, 63, s) ;
+
+ state->i = 1;
+ state->j = 0;
+
+ for (i = 0 ; i < 10 * 63 ; i++)
+ random256_get (state) ;
+}
+
+static void
+bsd_initialize (long int * x, int n, unsigned long int s)
+{
+ int i;
+
+ if (s == 0)
+ s = 1 ;
+
+ x[0] = s;
+
+ for (i = 1 ; i < n ; i++)
+ x[i] = 1103515245 * x[i-1] + 12345 ;
+}
+
+static void
+libc5_initialize (long int * x, int n, unsigned long int s)
+{
+ int i;
+
+ if (s == 0)
+ s = 1 ;
+
+ x[0] = s;
+
+ for (i = 1 ; i < n ; i++)
+ x[i] = 1103515145 * x[i-1] + 12345 ;
+}
+
+static void
+glibc2_initialize (long int * x, int n, unsigned long int s)
+{
+ int i;
+
+ if (s == 0)
+ s = 1 ;
+
+ x[0] = s;
+
+ for (i = 1 ; i < n ; i++)
+ {
+ const long int h = s / 127773;
+ const long int t = 16807 * (s - h * 127773) - h * 2836;
+ if (t < 0)
+ {
+ s = t + 2147483647 ;
+ }
+ else
+ {
+ s = t ;
+ }
+
+ x[i] = s ;
+ }
+}
+
+static void
+random8_glibc2_set (void *vstate, unsigned long int s)
+{
+ random8_state_t *state = (random8_state_t *) vstate;
+
+ if (s == 0)
+ s = 1;
+
+ state->x = s;
+}
+
+static void
+random32_glibc2_set (void *vstate, unsigned long int s)
+{
+ random32_state_t *state = (random32_state_t *) vstate;
+ int i;
+
+ glibc2_initialize (state->x, 7, s) ;
+
+ state->i = 3;
+ state->j = 0;
+
+ for (i = 0 ; i < 10 * 7 ; i++)
+ random32_get (state) ;
+}
+
+static void
+random64_glibc2_set (void *vstate, unsigned long int s)
+{
+ random64_state_t *state = (random64_state_t *) vstate;
+ int i;
+
+ glibc2_initialize (state->x, 15, s) ;
+
+ state->i = 1;
+ state->j = 0;
+
+ for (i = 0 ; i < 10 * 15 ; i++)
+ random64_get (state) ;
+}
+
+static void
+random128_glibc2_set (void *vstate, unsigned long int s)
+{
+ random128_state_t *state = (random128_state_t *) vstate;
+ int i;
+
+ glibc2_initialize (state->x, 31, s) ;
+
+ state->i = 3;
+ state->j = 0;
+
+ for (i = 0 ; i < 10 * 31 ; i++)
+ random128_get (state) ;
+}
+
+static void
+random256_glibc2_set (void *vstate, unsigned long int s)
+{
+ random256_state_t *state = (random256_state_t *) vstate;
+ int i;
+
+ glibc2_initialize (state->x, 63, s) ;
+
+ state->i = 1;
+ state->j = 0;
+
+ for (i = 0 ; i < 10 * 63 ; i++)
+ random256_get (state) ;
+}
+
+
+static void
+random8_libc5_set (void *vstate, unsigned long int s)
+{
+ random8_state_t *state = (random8_state_t *) vstate;
+
+ if (s == 0)
+ s = 1;
+
+ state->x = s;
+}
+
+static void
+random32_libc5_set (void *vstate, unsigned long int s)
+{
+ random32_state_t *state = (random32_state_t *) vstate;
+ int i;
+
+ libc5_initialize (state->x, 7, s) ;
+
+ state->i = 3;
+ state->j = 0;
+
+ for (i = 0 ; i < 10 * 7 ; i++)
+ random32_get (state) ;
+}
+
+static void
+random64_libc5_set (void *vstate, unsigned long int s)
+{
+ random64_state_t *state = (random64_state_t *) vstate;
+ int i;
+
+ libc5_initialize (state->x, 15, s) ;
+
+ state->i = 1;
+ state->j = 0;
+
+ for (i = 0 ; i < 10 * 15 ; i++)
+ random64_get (state) ;
+}
+
+static void
+random128_libc5_set (void *vstate, unsigned long int s)
+{
+ random128_state_t *state = (random128_state_t *) vstate;
+ int i;
+
+ libc5_initialize (state->x, 31, s) ;
+
+ state->i = 3;
+ state->j = 0;
+
+ for (i = 0 ; i < 10 * 31 ; i++)
+ random128_get (state) ;
+}
+
+static void
+random256_libc5_set (void *vstate, unsigned long int s)
+{
+ random256_state_t *state = (random256_state_t *) vstate;
+ int i;
+
+ libc5_initialize (state->x, 63, s) ;
+
+ state->i = 1;
+ state->j = 0;
+
+ for (i = 0 ; i < 10 * 63 ; i++)
+ random256_get (state) ;
+}
+
+static const gsl_rng_type random_glibc2_type =
+{"random-glibc2", /* name */
+ 0x7fffffffUL, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (random128_state_t),
+ &random128_glibc2_set,
+ &random128_get,
+ &random128_get_double};
+
+static const gsl_rng_type random8_glibc2_type =
+{"random8-glibc2", /* name */
+ 0x7fffffffUL, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (random8_state_t),
+ &random8_glibc2_set,
+ &random8_get,
+ &random8_get_double};
+
+static const gsl_rng_type random32_glibc2_type =
+{"random32-glibc2", /* name */
+ 0x7fffffffUL, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (random32_state_t),
+ &random32_glibc2_set,
+ &random32_get,
+ &random32_get_double};
+
+static const gsl_rng_type random64_glibc2_type =
+{"random64-glibc2", /* name */
+ 0x7fffffffUL, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (random64_state_t),
+ &random64_glibc2_set,
+ &random64_get,
+ &random64_get_double};
+
+static const gsl_rng_type random128_glibc2_type =
+{"random128-glibc2", /* name */
+ 0x7fffffffUL, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (random128_state_t),
+ &random128_glibc2_set,
+ &random128_get,
+ &random128_get_double};
+
+static const gsl_rng_type random256_glibc2_type =
+{"random256-glibc2", /* name */
+ 0x7fffffffUL, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (random256_state_t),
+ &random256_glibc2_set,
+ &random256_get,
+ &random256_get_double};
+
+static const gsl_rng_type random_libc5_type =
+{"random-libc5", /* name */
+ 0x7fffffffUL, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (random128_state_t),
+ &random128_libc5_set,
+ &random128_get,
+ &random128_get_double};
+
+static const gsl_rng_type random8_libc5_type =
+{"random8-libc5", /* name */
+ 0x7fffffffUL, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (random8_state_t),
+ &random8_libc5_set,
+ &random8_get,
+ &random8_get_double};
+
+static const gsl_rng_type random32_libc5_type =
+{"random32-libc5", /* name */
+ 0x7fffffffUL, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (random32_state_t),
+ &random32_libc5_set,
+ &random32_get,
+ &random32_get_double};
+
+static const gsl_rng_type random64_libc5_type =
+{"random64-libc5", /* name */
+ 0x7fffffffUL, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (random64_state_t),
+ &random64_libc5_set,
+ &random64_get,
+ &random64_get_double};
+
+static const gsl_rng_type random128_libc5_type =
+{"random128-libc5", /* name */
+ 0x7fffffffUL, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (random128_state_t),
+ &random128_libc5_set,
+ &random128_get,
+ &random128_get_double};
+
+static const gsl_rng_type random256_libc5_type =
+{"random256-libc5", /* name */
+ 0x7fffffffUL, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (random256_state_t),
+ &random256_libc5_set,
+ &random256_get,
+ &random256_get_double};
+
+static const gsl_rng_type random_bsd_type =
+{"random-bsd", /* name */
+ 0x7fffffffUL, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (random128_state_t),
+ &random128_bsd_set,
+ &random128_get,
+ &random128_get_double};
+
+static const gsl_rng_type random8_bsd_type =
+{"random8-bsd", /* name */
+ 0x7fffffffUL, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (random8_state_t),
+ &random8_bsd_set,
+ &random8_get,
+ &random8_get_double};
+
+static const gsl_rng_type random32_bsd_type =
+{"random32-bsd", /* name */
+ 0x7fffffffUL, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (random32_state_t),
+ &random32_bsd_set,
+ &random32_get,
+ &random32_get_double};
+
+static const gsl_rng_type random64_bsd_type =
+{"random64-bsd", /* name */
+ 0x7fffffffUL, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (random64_state_t),
+ &random64_bsd_set,
+ &random64_get,
+ &random64_get_double};
+
+static const gsl_rng_type random128_bsd_type =
+{"random128-bsd", /* name */
+ 0x7fffffffUL, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (random128_state_t),
+ &random128_bsd_set,
+ &random128_get,
+ &random128_get_double};
+
+static const gsl_rng_type random256_bsd_type =
+{"random256-bsd", /* name */
+ 0x7fffffffUL, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (random256_state_t),
+ &random256_bsd_set,
+ &random256_get,
+ &random256_get_double};
+
+const gsl_rng_type *gsl_rng_random_libc5 = &random_libc5_type;
+const gsl_rng_type *gsl_rng_random8_libc5 = &random8_libc5_type;
+const gsl_rng_type *gsl_rng_random32_libc5 = &random32_libc5_type;
+const gsl_rng_type *gsl_rng_random64_libc5 = &random64_libc5_type;
+const gsl_rng_type *gsl_rng_random128_libc5 = &random128_libc5_type;
+const gsl_rng_type *gsl_rng_random256_libc5 = &random256_libc5_type;
+
+const gsl_rng_type *gsl_rng_random_glibc2 = &random_glibc2_type;
+const gsl_rng_type *gsl_rng_random8_glibc2 = &random8_glibc2_type;
+const gsl_rng_type *gsl_rng_random32_glibc2 = &random32_glibc2_type;
+const gsl_rng_type *gsl_rng_random64_glibc2 = &random64_glibc2_type;
+const gsl_rng_type *gsl_rng_random128_glibc2 = &random128_glibc2_type;
+const gsl_rng_type *gsl_rng_random256_glibc2 = &random256_glibc2_type;
+
+const gsl_rng_type *gsl_rng_random_bsd = &random_bsd_type;
+const gsl_rng_type *gsl_rng_random8_bsd = &random8_bsd_type;
+const gsl_rng_type *gsl_rng_random32_bsd = &random32_bsd_type;
+const gsl_rng_type *gsl_rng_random64_bsd = &random64_bsd_type;
+const gsl_rng_type *gsl_rng_random128_bsd = &random128_bsd_type;
+const gsl_rng_type *gsl_rng_random256_bsd = &random256_bsd_type;
+
+
+
+
diff --git a/gsl-1.9/rng/randu.c b/gsl-1.9/rng/randu.c
new file mode 100644
index 0000000..acd9ea1
--- /dev/null
+++ b/gsl-1.9/rng/randu.c
@@ -0,0 +1,95 @@
+/* rng/randu.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_rng.h>
+
+/* This is a reincarnation of the infamously bad RANDU generator.
+ The sequence is,
+
+ x_{n+1} = (a x_n) mod m
+
+ with a = 65539 and m = 2^31 = 2147483648. The seed specifies
+ the initial value, x_1.
+
+ The theoretical value of x_{10001} is 1623524161.
+
+ The period of this generator is 2^29.
+
+ Note: Knuth describes this generator as "really horrible".
+
+ From: Park and Miller, "Random Number Generators: Good ones are
+ hard to find" Communications of the ACM, October 1988, Volume 31,
+ No 10, pages 1192-1201. */
+
+static inline unsigned long int randu_get (void *vstate);
+static double randu_get_double (void *vstate);
+static void randu_set (void *state, unsigned long int s);
+
+static const long int a = 65539;
+/* static const unsigned long int m = 2147483648UL; */
+
+typedef struct
+ {
+ unsigned long int x;
+ }
+randu_state_t;
+
+static inline unsigned long int
+randu_get (void *vstate)
+{
+ randu_state_t *state = (randu_state_t *) vstate;
+
+ /* The following line relies on unsigned 32-bit arithmetic */
+
+ state->x = (a * state->x) & 0x7fffffffUL;
+
+ return state->x;
+}
+
+static double
+randu_get_double (void *vstate)
+{
+ return randu_get (vstate) / 2147483648.0 ;
+}
+
+static void
+randu_set (void *vstate, unsigned long int s)
+{
+ randu_state_t *state = (randu_state_t *) vstate;
+
+ if (s == 0)
+ s = 1; /* default seed is 1 */
+
+ state->x = s;
+
+ return;
+}
+
+static const gsl_rng_type randu_type =
+{"randu", /* name */
+ 0x7fffffffUL, /* RAND_MAX */
+ 1, /* RAND_MIN */
+ sizeof (randu_state_t),
+ &randu_set,
+ &randu_get,
+ &randu_get_double};
+
+const gsl_rng_type *gsl_rng_randu = &randu_type;
diff --git a/gsl-1.9/rng/ranf.c b/gsl-1.9/rng/ranf.c
new file mode 100644
index 0000000..cc5ac41
--- /dev/null
+++ b/gsl-1.9/rng/ranf.c
@@ -0,0 +1,161 @@
+/* rng/ranf.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <stdlib.h>
+#include <gsl/gsl_rng.h>
+
+/* This is the CRAY RANF generator. The generator returns the
+ upper 32 bits from each term of the sequence,
+
+ x_{n+1} = (a x_n) mod m
+
+ using 48-bit unsigned arithmetic, with a = 0x2875A2E7B175 and m =
+ 2^48. The seed specifies the lower 32 bits of the initial value,
+ x_1, with the lowest bit set (to prevent the seed taking an even
+ value), and the upper 16 bits set to 0.
+
+ There is a subtlety in the implementation of the seed. The initial
+ state is put one step back by multiplying by the modular inverse of
+ a mod m. This is done for compatibility with the original CRAY
+ implementation.
+
+ Note, you can only seed the generator with integers up to 2^32,
+ while the CRAY uses wide integers which can cover all 2^48 states
+ of the generator.
+
+ The theoretical value of x_{10001} is 141091827447341.
+
+ The period of this generator is 2^{46}. */
+
+static inline void ranf_advance (void *vstate);
+static unsigned long int ranf_get (void *vstate);
+static double ranf_get_double (void *vstate);
+static void ranf_set (void *state, unsigned long int s);
+
+static const unsigned short int a0 = 0xB175 ;
+static const unsigned short int a1 = 0xA2E7 ;
+static const unsigned short int a2 = 0x2875 ;
+
+typedef struct
+ {
+ unsigned short int x0, x1, x2;
+ }
+ranf_state_t;
+
+static inline void
+ranf_advance (void *vstate)
+{
+ ranf_state_t *state = (ranf_state_t *) vstate;
+
+ const unsigned long int x0 = (unsigned long int) state->x0 ;
+ const unsigned long int x1 = (unsigned long int) state->x1 ;
+ const unsigned long int x2 = (unsigned long int) state->x2 ;
+
+ unsigned long int r ;
+
+ r = a0 * x0 ;
+ state->x0 = (r & 0xFFFF) ;
+
+ r >>= 16 ;
+ r += a0 * x1 + a1 * x0 ;
+ state->x1 = (r & 0xFFFF) ;
+
+ r >>= 16 ;
+ r += a0 * x2 + a1 * x1 + a2 * x0 ;
+ state->x2 = (r & 0xFFFF) ;
+}
+
+static unsigned long int
+ranf_get (void *vstate)
+{
+ unsigned long int x1, x2;
+
+ ranf_state_t *state = (ranf_state_t *) vstate;
+ ranf_advance (state) ;
+
+ x1 = (unsigned long int) state->x1;
+ x2 = (unsigned long int) state->x2;
+
+ return (x2 << 16) + x1;
+}
+
+static double
+ranf_get_double (void * vstate)
+{
+ ranf_state_t *state = (ranf_state_t *) vstate;
+
+ ranf_advance (state) ;
+
+ return (ldexp((double) state->x2, -16)
+ + ldexp((double) state->x1, -32)
+ + ldexp((double) state->x0, -48)) ;
+}
+
+static void
+ranf_set (void *vstate, unsigned long int s)
+{
+ ranf_state_t *state = (ranf_state_t *) vstate;
+
+ unsigned short int x0, x1, x2 ;
+ unsigned long int r ;
+
+ unsigned long int b0 = 0xD6DD ;
+ unsigned long int b1 = 0xB894 ;
+ unsigned long int b2 = 0x5CEE ;
+
+ if (s == 0) /* default seed */
+ {
+ x0 = 0x9CD1 ;
+ x1 = 0x53FC ;
+ x2 = 0x9482 ;
+ }
+ else
+ {
+ x0 = (s | 1) & 0xFFFF ;
+ x1 = s >> 16 & 0xFFFF ;
+ x2 = 0 ;
+ }
+
+ r = b0 * x0 ;
+ state->x0 = (r & 0xFFFF) ;
+
+ r >>= 16 ;
+ r += b0 * x1 + b1 * x0 ;
+ state->x1 = (r & 0xFFFF) ;
+
+ r >>= 16 ;
+ r += b0 * x2 + b1 * x1 + b2 * x0 ;
+ state->x2 = (r & 0xFFFF) ;
+
+ return;
+}
+
+static const gsl_rng_type ranf_type =
+{"ranf", /* name */
+ 0xffffffffUL, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (ranf_state_t),
+ &ranf_set,
+ &ranf_get,
+ &ranf_get_double
+};
+
+const gsl_rng_type *gsl_rng_ranf = &ranf_type;
diff --git a/gsl-1.9/rng/ranlux.c b/gsl-1.9/rng/ranlux.c
new file mode 100644
index 0000000..b5e681d
--- /dev/null
+++ b/gsl-1.9/rng/ranlux.c
@@ -0,0 +1,222 @@
+/* rng/ranlux.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_rng.h>
+
+/* This is a lagged fibonacci generator with skipping developed by Luescher.
+ The sequence is a series of 24-bit integers, x_n,
+
+ x_n = d_n + b_n
+
+ where d_n = x_{n-10} - x_{n-24} - c_{n-1}, b_n = 0 if d_n >= 0 and
+ b_n = 2^24 if d_n < 0, c_n = 0 if d_n >= 0 and c_n = 1 if d_n < 0,
+ where after 24 samples a group of p integers are "skipped", to
+ reduce correlations. By default p = 199, but can be increased to
+ 365.
+
+ The period of the generator is around 10^171.
+
+ From: M. Luescher, "A portable high-quality random number generator
+ for lattice field theory calculations", Computer Physics
+ Communications, 79 (1994) 100-110.
+
+ Available on the net as hep-lat/9309020 at http://xxx.lanl.gov/
+
+ See also,
+
+ F. James, "RANLUX: A Fortran implementation of the high-quality
+ pseudo-random number generator of Luscher", Computer Physics
+ Communications, 79 (1994) 111-114
+
+ Kenneth G. Hamilton, F. James, "Acceleration of RANLUX", Computer
+ Physics Communications, 101 (1997) 241-248
+
+ Kenneth G. Hamilton, "Assembler RANLUX for PCs", Computer Physics
+ Communications, 101 (1997) 249-253 */
+
+static inline unsigned long int ranlux_get (void *vstate);
+static double ranlux_get_double (void *vstate);
+static void ranlux_set_lux (void *state, unsigned long int s, unsigned int luxury);
+static void ranlux_set (void *state, unsigned long int s);
+static void ranlux389_set (void *state, unsigned long int s);
+
+static const unsigned long int mask_lo = 0x00ffffffUL; /* 2^24 - 1 */
+static const unsigned long int mask_hi = ~0x00ffffffUL;
+static const unsigned long int two24 = 16777216; /* 2^24 */
+
+typedef struct
+ {
+ unsigned int i;
+ unsigned int j;
+ unsigned int n;
+ unsigned int skip;
+ unsigned int carry;
+ unsigned long int u[24];
+ }
+ranlux_state_t;
+
+static inline unsigned long int increment_state (ranlux_state_t * state);
+
+static inline unsigned long int
+increment_state (ranlux_state_t * state)
+{
+ unsigned int i = state->i;
+ unsigned int j = state->j;
+ long int delta = state->u[j] - state->u[i] - state->carry;
+
+ if (delta & mask_hi)
+ {
+ state->carry = 1;
+ delta &= mask_lo;
+ }
+ else
+ {
+ state->carry = 0;
+ }
+
+ state->u[i] = delta;
+
+ if (i == 0)
+ {
+ i = 23;
+ }
+ else
+ {
+ i--;
+ }
+
+ state->i = i;
+
+ if (j == 0)
+ {
+ j = 23;
+ }
+ else
+ {
+ j--;
+ }
+
+ state->j = j;
+
+ return delta;
+}
+
+static inline unsigned long int
+ranlux_get (void *vstate)
+{
+ ranlux_state_t *state = (ranlux_state_t *) vstate;
+ const unsigned int skip = state->skip;
+ unsigned long int r = increment_state (state);
+
+ state->n++;
+
+ if (state->n == 24)
+ {
+ unsigned int i;
+ state->n = 0;
+ for (i = 0; i < skip; i++)
+ increment_state (state);
+ }
+
+ return r;
+}
+
+static double
+ranlux_get_double (void *vstate)
+{
+ return ranlux_get (vstate) / 16777216.0;
+}
+
+static void
+ranlux_set_lux (void *vstate, unsigned long int s, unsigned int luxury)
+{
+ ranlux_state_t *state = (ranlux_state_t *) vstate;
+ int i;
+
+ long int seed;
+
+ if (s == 0)
+ s = 314159265; /* default seed is 314159265 */
+
+ seed = s;
+
+ /* This is the initialization algorithm of F. James, widely in use
+ for RANLUX. */
+
+ for (i = 0; i < 24; i++)
+ {
+ unsigned long int k = seed / 53668;
+ seed = 40014 * (seed - k * 53668) - k * 12211;
+ if (seed < 0)
+ {
+ seed += 2147483563;
+ }
+ state->u[i] = seed % two24;
+ }
+
+ state->i = 23;
+ state->j = 9;
+ state->n = 0;
+ state->skip = luxury - 24;
+
+ if (state->u[23] & mask_hi)
+ {
+ state->carry = 1;
+ }
+ else
+ {
+ state->carry = 0;
+ }
+}
+
+static void
+ranlux_set (void *vstate, unsigned long int s)
+{
+ ranlux_set_lux (vstate, s, 223);
+}
+
+static void
+ranlux389_set (void *vstate, unsigned long int s)
+{
+ ranlux_set_lux (vstate, s, 389);
+}
+
+
+static const gsl_rng_type ranlux_type =
+{"ranlux", /* name */
+ 0x00ffffffUL, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (ranlux_state_t),
+ &ranlux_set,
+ &ranlux_get,
+ &ranlux_get_double};
+
+static const gsl_rng_type ranlux389_type =
+{"ranlux389", /* name */
+ 0x00ffffffUL, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (ranlux_state_t),
+ &ranlux389_set,
+ &ranlux_get,
+ &ranlux_get_double};
+
+const gsl_rng_type *gsl_rng_ranlux = &ranlux_type;
+const gsl_rng_type *gsl_rng_ranlux389 = &ranlux389_type;
diff --git a/gsl-1.9/rng/ranlxd.c b/gsl-1.9/rng/ranlxd.c
new file mode 100644
index 0000000..a7f3b0e
--- /dev/null
+++ b/gsl-1.9/rng/ranlxd.c
@@ -0,0 +1,249 @@
+/* rng/ranlxd.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_rng.h>
+
+/* This is an implementation of Martin Luescher's second generation
+ double-precision (48-bit) version of the RANLUX generator.
+
+ Thanks to Martin Luescher for providing information on this
+ generator.
+
+*/
+
+static inline unsigned long int ranlxd_get (void *vstate);
+static double ranlxd_get_double (void *vstate);
+static void ranlxd_set_lux (void *state, unsigned long int s, unsigned int luxury);
+static void ranlxd1_set (void *state, unsigned long int s);
+static void ranlxd2_set (void *state, unsigned long int s);
+
+static const int next[12] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0};
+
+static const double one_bit = 1.0 / 281474976710656.0; /* 1/2^48 */
+
+#define RANLUX_STEP(x1,x2,i1,i2,i3) \
+ x1=xdbl[i1] - xdbl[i2]; \
+ if (x2 < 0) \
+ { \
+ x1-=one_bit; \
+ x2+=1; \
+ } \
+ xdbl[i3]=x2
+
+typedef struct
+ {
+ double xdbl[12];
+ double carry;
+ unsigned int ir;
+ unsigned int jr;
+ unsigned int ir_old;
+ unsigned int pr;
+ }
+ranlxd_state_t;
+
+static inline void increment_state (ranlxd_state_t * state);
+
+static inline void
+increment_state (ranlxd_state_t * state)
+{
+ int k, kmax;
+ double y1, y2, y3;
+
+ double *xdbl = state->xdbl;
+ double carry = state->carry;
+ unsigned int ir = state->ir;
+ unsigned int jr = state->jr;
+
+ for (k = 0; ir > 0; ++k)
+ {
+ y1 = xdbl[jr] - xdbl[ir];
+ y2 = y1 - carry;
+ if (y2 < 0)
+ {
+ carry = one_bit;
+ y2 += 1;
+ }
+ else
+ {
+ carry = 0;
+ }
+ xdbl[ir] = y2;
+ ir = next[ir];
+ jr = next[jr];
+ }
+
+ kmax = state->pr - 12;
+
+ for (; k <= kmax; k += 12)
+ {
+ y1 = xdbl[7] - xdbl[0];
+ y1 -= carry;
+
+ RANLUX_STEP (y2, y1, 8, 1, 0);
+ RANLUX_STEP (y3, y2, 9, 2, 1);
+ RANLUX_STEP (y1, y3, 10, 3, 2);
+ RANLUX_STEP (y2, y1, 11, 4, 3);
+ RANLUX_STEP (y3, y2, 0, 5, 4);
+ RANLUX_STEP (y1, y3, 1, 6, 5);
+ RANLUX_STEP (y2, y1, 2, 7, 6);
+ RANLUX_STEP (y3, y2, 3, 8, 7);
+ RANLUX_STEP (y1, y3, 4, 9, 8);
+ RANLUX_STEP (y2, y1, 5, 10, 9);
+ RANLUX_STEP (y3, y2, 6, 11, 10);
+
+ if (y3 < 0)
+ {
+ carry = one_bit;
+ y3 += 1;
+ }
+ else
+ {
+ carry = 0;
+ }
+ xdbl[11] = y3;
+ }
+
+ kmax = state->pr;
+
+ for (; k < kmax; ++k)
+ {
+ y1 = xdbl[jr] - xdbl[ir];
+ y2 = y1 - carry;
+ if (y2 < 0)
+ {
+ carry = one_bit;
+ y2 += 1;
+ }
+ else
+ {
+ carry = 0;
+ }
+ xdbl[ir] = y2;
+ ir = next[ir];
+ jr = next[jr];
+ }
+ state->ir = ir;
+ state->ir_old = ir;
+ state->jr = jr;
+ state->carry = carry;
+}
+
+static inline unsigned long int
+ranlxd_get (void *vstate)
+{
+ return ranlxd_get_double (vstate) * 4294967296.0; /* 2^32 */
+}
+
+static double
+ranlxd_get_double (void *vstate)
+{
+ ranlxd_state_t *state = (ranlxd_state_t *) vstate;
+
+ int ir = state->ir;
+
+ state->ir = next[ir];
+
+ if (state->ir == state->ir_old)
+ increment_state (state);
+
+ return state->xdbl[state->ir];
+}
+
+static void
+ranlxd_set_lux (void *vstate, unsigned long int s, unsigned int luxury)
+{
+ ranlxd_state_t *state = (ranlxd_state_t *) vstate;
+
+ int ibit, jbit, i, k, l, xbit[31];
+ double x, y;
+
+ long int seed;
+
+ if (s == 0)
+ s = 1; /* default seed is 1 */
+
+ seed = s;
+
+ i = seed & 0xFFFFFFFFUL;
+
+ for (k = 0; k < 31; ++k)
+ {
+ xbit[k] = i % 2;
+ i /= 2;
+ }
+
+ ibit = 0;
+ jbit = 18;
+
+ for (k = 0; k < 12; ++k)
+ {
+ x = 0;
+
+ for (l = 1; l <= 48; ++l)
+ {
+ y = (double) ((xbit[ibit] + 1) % 2);
+ x += x + y;
+ xbit[ibit] = (xbit[ibit] + xbit[jbit]) % 2;
+ ibit = (ibit + 1) % 31;
+ jbit = (jbit + 1) % 31;
+ }
+ state->xdbl[k] = one_bit * x;
+ }
+
+ state->carry = 0;
+ state->ir = 11;
+ state->jr = 7;
+ state->ir_old = 0;
+ state->pr = luxury;
+}
+
+static void
+ranlxd1_set (void *vstate, unsigned long int s)
+{
+ ranlxd_set_lux (vstate, s, 202);
+}
+
+static void
+ranlxd2_set (void *vstate, unsigned long int s)
+{
+ ranlxd_set_lux (vstate, s, 397);
+}
+
+static const gsl_rng_type ranlxd1_type =
+{"ranlxd1", /* name */
+ 0xffffffffUL, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (ranlxd_state_t),
+ &ranlxd1_set,
+ &ranlxd_get,
+ &ranlxd_get_double};
+
+static const gsl_rng_type ranlxd2_type =
+{"ranlxd2", /* name */
+ 0xffffffffUL, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (ranlxd_state_t),
+ &ranlxd2_set,
+ &ranlxd_get,
+ &ranlxd_get_double};
+
+const gsl_rng_type *gsl_rng_ranlxd1 = &ranlxd1_type;
+const gsl_rng_type *gsl_rng_ranlxd2 = &ranlxd2_type;
diff --git a/gsl-1.9/rng/ranlxs.c b/gsl-1.9/rng/ranlxs.c
new file mode 100644
index 0000000..923aa39
--- /dev/null
+++ b/gsl-1.9/rng/ranlxs.c
@@ -0,0 +1,302 @@
+/* rng/ranlxs.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_rng.h>
+
+/* This is an implementation of M. Luescher's second generation
+ version of the RANLUX generator.
+
+ Thanks to Martin Luescher for providing information on this
+ generator.
+
+ */
+
+static unsigned long int ranlxs_get (void *vstate);
+static inline double ranlxs_get_double (void *vstate);
+static void ranlxs_set_lux (void *state, unsigned long int s, unsigned int luxury);
+static void ranlxs0_set (void *state, unsigned long int s);
+static void ranlxs1_set (void *state, unsigned long int s);
+static void ranlxs2_set (void *state, unsigned long int s);
+
+static const int next[12] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0};
+static const int snext[24] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
+ 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 0};
+
+static const double sbase = 16777216.0; /* 2^24 */
+static const double sone_bit = 1.0 / 16777216.0; /* 1/2^24 */
+static const double one_bit = 1.0 / 281474976710656.0; /* 1/2^48 */
+
+static const double shift = 268435456.0; /* 2^28 */
+
+#define RANLUX_STEP(x1,x2,i1,i2,i3) \
+ x1=xdbl[i1] - xdbl[i2]; \
+ if (x2 < 0) \
+ { \
+ x1-=one_bit; \
+ x2+=1; \
+ } \
+ xdbl[i3]=x2
+
+typedef struct
+ {
+ double xdbl[12], ydbl[12]; /* doubles first so they are 8-byte aligned */
+ double carry;
+ float xflt[24];
+ unsigned int ir;
+ unsigned int jr;
+ unsigned int is;
+ unsigned int is_old;
+ unsigned int pr;
+ }
+ranlxs_state_t;
+
+static void increment_state (ranlxs_state_t * state);
+
+static void
+increment_state (ranlxs_state_t * state)
+{
+ int k, kmax, m;
+ double x, y1, y2, y3;
+
+ float *xflt = state->xflt;
+ double *xdbl = state->xdbl;
+ double *ydbl = state->ydbl;
+ double carry = state->carry;
+ unsigned int ir = state->ir;
+ unsigned int jr = state->jr;
+
+ for (k = 0; ir > 0; ++k)
+ {
+ y1 = xdbl[jr] - xdbl[ir];
+ y2 = y1 - carry;
+ if (y2 < 0)
+ {
+ carry = one_bit;
+ y2 += 1;
+ }
+ else
+ {
+ carry = 0;
+ }
+ xdbl[ir] = y2;
+ ir = next[ir];
+ jr = next[jr];
+ }
+
+ kmax = state->pr - 12;
+
+ for (; k <= kmax; k += 12)
+ {
+ y1 = xdbl[7] - xdbl[0];
+ y1 -= carry;
+
+ RANLUX_STEP (y2, y1, 8, 1, 0);
+ RANLUX_STEP (y3, y2, 9, 2, 1);
+ RANLUX_STEP (y1, y3, 10, 3, 2);
+ RANLUX_STEP (y2, y1, 11, 4, 3);
+ RANLUX_STEP (y3, y2, 0, 5, 4);
+ RANLUX_STEP (y1, y3, 1, 6, 5);
+ RANLUX_STEP (y2, y1, 2, 7, 6);
+ RANLUX_STEP (y3, y2, 3, 8, 7);
+ RANLUX_STEP (y1, y3, 4, 9, 8);
+ RANLUX_STEP (y2, y1, 5, 10, 9);
+ RANLUX_STEP (y3, y2, 6, 11, 10);
+
+ if (y3 < 0)
+ {
+ carry = one_bit;
+ y3 += 1;
+ }
+ else
+ {
+ carry = 0;
+ }
+ xdbl[11] = y3;
+ }
+
+ kmax = state->pr;
+
+ for (; k < kmax; ++k)
+ {
+ y1 = xdbl[jr] - xdbl[ir];
+ y2 = y1 - carry;
+ if (y2 < 0)
+ {
+ carry = one_bit;
+ y2 += 1;
+ }
+ else
+ {
+ carry = 0;
+ }
+ xdbl[ir] = y2;
+ ydbl[ir] = y2 + shift;
+ ir = next[ir];
+ jr = next[jr];
+ }
+
+ ydbl[ir] = xdbl[ir] + shift;
+
+ for (k = next[ir]; k > 0;)
+ {
+ ydbl[k] = xdbl[k] + shift;
+ k = next[k];
+ }
+
+ for (k = 0, m = 0; k < 12; ++k)
+ {
+ x = xdbl[k];
+ y2 = ydbl[k] - shift;
+ if (y2 > x)
+ y2 -= sone_bit;
+ y1 = (x - y2) * sbase;
+
+ xflt[m++] = (float) y1;
+ xflt[m++] = (float) y2;
+ }
+
+ state->ir = ir;
+ state->is = 2 * ir;
+ state->is_old = 2 * ir;
+ state->jr = jr;
+ state->carry = carry;
+}
+
+
+static inline double
+ranlxs_get_double (void *vstate)
+{
+ ranlxs_state_t *state = (ranlxs_state_t *) vstate;
+
+ const unsigned int is = snext[state->is];
+
+ state->is = is;
+
+ if (is == state->is_old)
+ increment_state (state);
+
+ return state->xflt[state->is];
+}
+
+static unsigned long int
+ranlxs_get (void *vstate)
+{
+ return ranlxs_get_double (vstate) * 16777216.0; /* 2^24 */
+}
+
+static void
+ranlxs_set_lux (void *vstate, unsigned long int s, unsigned int luxury)
+{
+ ranlxs_state_t *state = (ranlxs_state_t *) vstate;
+
+ int ibit, jbit, i, k, m, xbit[31];
+ double x, y;
+
+ long int seed;
+
+ if (s == 0)
+ s = 1; /* default seed is 1 */
+
+ seed = s;
+
+ i = seed & 0xFFFFFFFFUL;
+
+ for (k = 0; k < 31; ++k)
+ {
+ xbit[k] = i % 2;
+ i /= 2;
+ }
+
+ ibit = 0;
+ jbit = 18;
+
+ for (k = 0; k < 12; ++k)
+ {
+ x = 0;
+
+ for (m = 1; m <= 48; ++m)
+ {
+ y = (double) xbit[ibit];
+ x += x + y;
+ xbit[ibit] = (xbit[ibit] + xbit[jbit]) % 2;
+ ibit = (ibit + 1) % 31;
+ jbit = (jbit + 1) % 31;
+ }
+ state->xdbl[k] = one_bit * x;
+ }
+
+ state->carry = 0;
+ state->ir = 0;
+ state->jr = 7;
+ state->is = 23;
+ state->is_old = 0;
+ state->pr = luxury;
+}
+
+static void
+ranlxs0_set (void *vstate, unsigned long int s)
+{
+ ranlxs_set_lux (vstate, s, 109);
+}
+
+void
+ranlxs1_set (void *vstate, unsigned long int s)
+{
+ ranlxs_set_lux (vstate, s, 202);
+}
+
+static void
+ranlxs2_set (void *vstate, unsigned long int s)
+{
+ ranlxs_set_lux (vstate, s, 397);
+}
+
+
+static const gsl_rng_type ranlxs0_type =
+{"ranlxs0", /* name */
+ 0x00ffffffUL, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (ranlxs_state_t),
+ &ranlxs0_set,
+ &ranlxs_get,
+ &ranlxs_get_double};
+
+static const gsl_rng_type ranlxs1_type =
+{"ranlxs1", /* name */
+ 0x00ffffffUL, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (ranlxs_state_t),
+ &ranlxs1_set,
+ &ranlxs_get,
+ &ranlxs_get_double};
+
+static const gsl_rng_type ranlxs2_type =
+{"ranlxs2", /* name */
+ 0x00ffffffUL, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (ranlxs_state_t),
+ &ranlxs2_set,
+ &ranlxs_get,
+ &ranlxs_get_double};
+
+const gsl_rng_type *gsl_rng_ranlxs0 = &ranlxs0_type;
+const gsl_rng_type *gsl_rng_ranlxs1 = &ranlxs1_type;
+const gsl_rng_type *gsl_rng_ranlxs2 = &ranlxs2_type;
diff --git a/gsl-1.9/rng/ranmar.c b/gsl-1.9/rng/ranmar.c
new file mode 100644
index 0000000..fd53cb5
--- /dev/null
+++ b/gsl-1.9/rng/ranmar.c
@@ -0,0 +1,173 @@
+/* rng/ranmar.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_rng.h>
+
+/* This is the RANMAR lagged fibonacci generator of Marsaglia, Zaman
+ and Tsang. The sequence is a series of 24-bit integers, x_n,
+
+ x_n = (y_n - c_n + 2^24) mod 2^24
+
+ where,
+
+ y_n = (y_{n-97) - y_{n-33} + 2^24) mod 2^24
+ c_n = (c_{n-1} - 7654321 + 2^24 - 3) mod (2^24 - 3)
+
+ The period of this generator is 2^144.
+
+ The generator provides about 900 million different subsequences
+ each of length O(10^30). Thus each seed up to 900,000,000 gives an
+ independent sequence.
+
+ Although it was good in its day this generator now has known
+ statistical defects and has been superseded by RANLUX.
+
+ From: F. James, "A Review of Pseudorandom number generators",
+ Computer Physics Communications 60, 329 (1990).
+
+ G. Marsaglia, A. Zaman and W.W. Tsang, Stat. Prob. Lett. 9, 35 (1990) */
+
+static inline unsigned long int ranmar_get (void *vstate);
+static double ranmar_get_double (void *vstate);
+static void ranmar_set (void *state, unsigned long int s);
+
+static const unsigned long int two24 = 16777216; /* 2^24 */
+
+typedef struct
+ {
+ unsigned int i;
+ unsigned int j;
+ long int carry;
+ unsigned long int u[97];
+ }
+ranmar_state_t;
+
+static inline unsigned long int
+ranmar_get (void *vstate)
+{
+ ranmar_state_t *state = (ranmar_state_t *) vstate;
+
+ unsigned int i = state->i;
+ unsigned int j = state->j;
+ long int carry = state->carry;
+
+ long int delta = state->u[i] - state->u[j];
+
+ if (delta < 0)
+ delta += two24 ;
+
+ state->u[i] = delta;
+
+ if (i == 0)
+ {
+ i = 96;
+ }
+ else
+ {
+ i--;
+ }
+
+ state->i = i;
+
+ if (j == 0)
+ {
+ j = 96;
+ }
+ else
+ {
+ j--;
+ }
+
+ state->j = j;
+
+ carry += - 7654321 ;
+
+ if (carry < 0)
+ carry += two24 - 3;
+
+ state->carry = carry ;
+
+ delta += - carry ;
+
+ if (delta < 0)
+ delta += two24 ;
+
+ return delta;
+}
+
+static double
+ranmar_get_double (void *vstate)
+{
+ return ranmar_get (vstate) / 16777216.0 ;
+}
+
+static void
+ranmar_set (void *vstate, unsigned long int s)
+{
+ ranmar_state_t *state = (ranmar_state_t *) vstate;
+
+ unsigned long int ij = s / 30082 ;
+ unsigned long int kl = s % 30082 ;
+
+ int i = (ij / 177) % 177 + 2 ;
+ int j = (ij % 177) + 2 ;
+ int k = (kl / 169) % 178 + 1 ;
+ int l = (kl % 169) ;
+
+ int a, b;
+
+ for (a = 0; a < 97; a++)
+ {
+ unsigned long int sum = 0 ;
+ unsigned long int t = two24 ;
+
+ for (b = 0; b < 24; b++)
+ {
+ unsigned long int m = (((i * j) % 179) * k) % 179 ;
+ i = j ;
+ j = k ;
+ k = m ;
+ l = (53 * l + 1) % 169 ;
+ t >>= 1 ;
+
+ if ((l * m) % 64 >= 32)
+ sum += t ;
+ }
+
+ state->u[a] = sum ;
+ }
+
+ state->i = 96;
+ state->j = 32;
+ state->carry = 362436 ;
+
+}
+
+static const gsl_rng_type ranmar_type =
+{"ranmar", /* name */
+ 0x00ffffffUL, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (ranmar_state_t),
+ &ranmar_set,
+ &ranmar_get,
+ &ranmar_get_double};
+
+const gsl_rng_type *gsl_rng_ranmar = &ranmar_type;
diff --git a/gsl-1.9/rng/rng.c b/gsl-1.9/rng/rng.c
new file mode 100644
index 0000000..eafdefb
--- /dev/null
+++ b/gsl-1.9/rng/rng.c
@@ -0,0 +1,211 @@
+/* rng/rng.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_rng.h>
+
+gsl_rng *
+gsl_rng_alloc (const gsl_rng_type * T)
+{
+
+ gsl_rng *r = (gsl_rng *) malloc (sizeof (gsl_rng));
+
+ if (r == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for rng struct",
+ GSL_ENOMEM, 0);
+ };
+
+ r->state = malloc (T->size);
+
+ if (r->state == 0)
+ {
+ free (r); /* exception in constructor, avoid memory leak */
+
+ GSL_ERROR_VAL ("failed to allocate space for rng state",
+ GSL_ENOMEM, 0);
+ };
+
+ r->type = T;
+
+ gsl_rng_set (r, gsl_rng_default_seed); /* seed the generator */
+
+ return r;
+}
+
+int
+gsl_rng_memcpy (gsl_rng * dest, const gsl_rng * src)
+{
+ if (dest->type != src->type)
+ {
+ GSL_ERROR ("generators must be of the same type", GSL_EINVAL);
+ }
+
+ memcpy (dest->state, src->state, src->type->size);
+
+ return GSL_SUCCESS;
+}
+
+gsl_rng *
+gsl_rng_clone (const gsl_rng * q)
+{
+ gsl_rng *r = (gsl_rng *) malloc (sizeof (gsl_rng));
+
+ if (r == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for rng struct",
+ GSL_ENOMEM, 0);
+ };
+
+ r->state = malloc (q->type->size);
+
+ if (r->state == 0)
+ {
+ free (r); /* exception in constructor, avoid memory leak */
+
+ GSL_ERROR_VAL ("failed to allocate space for rng state",
+ GSL_ENOMEM, 0);
+ };
+
+ r->type = q->type;
+
+ memcpy (r->state, q->state, q->type->size);
+
+ return r;
+}
+
+void
+gsl_rng_set (const gsl_rng * r, unsigned long int seed)
+{
+ (r->type->set) (r->state, seed);
+}
+
+#ifndef HIDE_INLINE_STATIC
+unsigned long int
+gsl_rng_get (const gsl_rng * r)
+{
+ return (r->type->get) (r->state);
+}
+
+double
+gsl_rng_uniform (const gsl_rng * r)
+{
+ return (r->type->get_double) (r->state);
+}
+
+double
+gsl_rng_uniform_pos (const gsl_rng * r)
+{
+ double x ;
+ do
+ {
+ x = (r->type->get_double) (r->state) ;
+ }
+ while (x == 0) ;
+
+ return x ;
+}
+
+/* Note: to avoid integer overflow in (range+1) we work with scale =
+ range/n = (max-min)/n rather than scale=(max-min+1)/n, this reduces
+ efficiency slightly but avoids having to check for the out of range
+ value. Note that range is typically O(2^32) so the addition of 1
+ is negligible in most usage. */
+
+unsigned long int
+gsl_rng_uniform_int (const gsl_rng * r, unsigned long int n)
+{
+ unsigned long int offset = r->type->min;
+ unsigned long int range = r->type->max - offset;
+ unsigned long int scale;
+ unsigned long int k;
+
+ if (n > range || n == 0)
+ {
+ GSL_ERROR_VAL ("invalid n, either 0 or exceeds maximum value of generator",
+ GSL_EINVAL, 0) ;
+ }
+
+ scale = range / n;
+
+ do
+ {
+ k = (((r->type->get) (r->state)) - offset) / scale;
+ }
+ while (k >= n);
+
+ return k;
+}
+#endif
+
+unsigned long int
+gsl_rng_max (const gsl_rng * r)
+{
+ return r->type->max;
+}
+
+unsigned long int
+gsl_rng_min (const gsl_rng * r)
+{
+ return r->type->min;
+}
+
+const char *
+gsl_rng_name (const gsl_rng * r)
+{
+ return r->type->name;
+}
+
+size_t
+gsl_rng_size (const gsl_rng * r)
+{
+ return r->type->size;
+}
+
+void *
+gsl_rng_state (const gsl_rng * r)
+{
+ return r->state;
+}
+
+void
+gsl_rng_print_state (const gsl_rng * r)
+{
+ size_t i;
+ unsigned char *p = (unsigned char *) (r->state);
+ const size_t n = r->type->size;
+
+ for (i = 0; i < n; i++)
+ {
+ /* FIXME: we're assuming that a char is 8 bits */
+ printf ("%.2x", *(p + i));
+ }
+
+}
+
+void
+gsl_rng_free (gsl_rng * r)
+{
+ free (r->state);
+ free (r);
+}
diff --git a/gsl-1.9/rng/schrage.c b/gsl-1.9/rng/schrage.c
new file mode 100644
index 0000000..413ff78
--- /dev/null
+++ b/gsl-1.9/rng/schrage.c
@@ -0,0 +1,51 @@
+/* rng/schrage.c
+ * Copyright (C) 2003 Carlo Perassi and Heiko Bauke.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+static inline unsigned long int
+schrage (unsigned long int a, unsigned long int b, unsigned long int m)
+{
+ /* This is a modified version of Schrage's method. It ensures that no
+ * overflow or underflow occurs even if a=ceil(sqrt(m)). Usual
+ * Schrage's method works only until a=floor(sqrt(m)).
+ */
+ unsigned long int q, t;
+ if (a == 0UL)
+ return 0UL;
+ q = m / a;
+ t = 2 * m - (m % a) * (b / q);
+ if (t >= m)
+ t -= m;
+ t += a * (b % q);
+ return (t >= m) ? (t - m) : t;
+}
+
+static inline unsigned long int
+schrage_mult (unsigned long int a, unsigned long int b,
+ unsigned long int m,
+ unsigned long int sqrtm)
+{
+ /* To multiply a and b use Schrage's method 3 times.
+ * represent a in base ceil(sqrt(m)) a = a1*ceil(sqrt(m)) + a0
+ * a*b = (a1*ceil(sqrt(m)) + a0)*b = a1*ceil(sqrt(m))*b + a0*b
+ */
+ unsigned long int t0 = schrage (sqrtm, b, m);
+ unsigned long int t1 = schrage (a / sqrtm, t0, m);
+ unsigned long int t2 = schrage (a % sqrtm, b, m);
+ unsigned long int t = t1 + t2;
+ return (t >= m) ? (t - m) : t;
+}
diff --git a/gsl-1.9/rng/slatec.c b/gsl-1.9/rng/slatec.c
new file mode 100644
index 0000000..57e9ffb
--- /dev/null
+++ b/gsl-1.9/rng/slatec.c
@@ -0,0 +1,205 @@
+/* rng/slatec.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/**
+
+* ======================================================================
+* NIST Guide to Available Math Software.
+* Source for module RAND from package CMLIB.
+* Retrieved from TIBER on Fri Oct 11 11:43:42 1996.
+* ======================================================================
+ FUNCTION RAND(R)
+C***BEGIN PROLOGUE RAND
+C***DATE WRITTEN 770401 (YYMMDD)
+C***REVISION DATE 820801 (YYMMDD)
+C***CATEGORY NO. L6A21
+C***KEYWORDS RANDOM NUMBER,SPECIAL FUNCTION,UNIFORM
+C***AUTHOR FULLERTON, W., (LANL)
+C***PURPOSE Generates a uniformly distributed random number.
+C***DESCRIPTION
+C
+C This pseudo-random number generator is portable among a wide
+C variety of computers. RAND(R) undoubtedly is not as good as many
+C readily available installation dependent versions, and so this
+C routine is not recommended for widespread usage. Its redeeming
+C feature is that the exact same random numbers (to within final round-
+C off error) can be generated from machine to machine. Thus, programs
+C that make use of random numbers can be easily transported to and
+C checked in a new environment.
+C The random numbers are generated by the linear congruential
+C method described, e.g., by Knuth in Seminumerical Methods (p.9),
+C Addison-Wesley, 1969. Given the I-th number of a pseudo-random
+C sequence, the I+1 -st number is generated from
+C X(I+1) = (A*X(I) + C) MOD M,
+C where here M = 2**22 = 4194304, C = 1731 and several suitable values
+C of the multiplier A are discussed below. Both the multiplier A and
+C random number X are represented in double precision as two 11-bit
+C words. The constants are chosen so that the period is the maximum
+C possible, 4194304.
+C In order that the same numbers be generated from machine to
+C machine, it is necessary that 23-bit integers be reducible modulo
+C 2**11 exactly, that 23-bit integers be added exactly, and that 11-bit
+C integers be multiplied exactly. Furthermore, if the restart option
+C is used (where R is between 0 and 1), then the product R*2**22 =
+C R*4194304 must be correct to the nearest integer.
+C The first four random numbers should be .0004127026,
+C .6750836372, .1614754200, and .9086198807. The tenth random number
+C is .5527787209, and the hundredth is .3600893021 . The thousandth
+C number should be .2176990509 .
+C In order to generate several effectively independent sequences
+C with the same generator, it is necessary to know the random number
+C for several widely spaced calls. The I-th random number times 2**22,
+C where I=K*P/8 and P is the period of the sequence (P = 2**22), is
+C still of the form L*P/8. In particular we find the I-th random
+C number multiplied by 2**22 is given by
+C I = 0 1*P/8 2*P/8 3*P/8 4*P/8 5*P/8 6*P/8 7*P/8 8*P/8
+C RAND= 0 5*P/8 2*P/8 7*P/8 4*P/8 1*P/8 6*P/8 3*P/8 0
+C Thus the 4*P/8 = 2097152 random number is 2097152/2**22.
+C Several multipliers have been subjected to the spectral test
+C (see Knuth, p. 82). Four suitable multipliers roughly in order of
+C goodness according to the spectral test are
+C 3146757 = 1536*2048 + 1029 = 2**21 + 2**20 + 2**10 + 5
+C 2098181 = 1024*2048 + 1029 = 2**21 + 2**10 + 5
+C 3146245 = 1536*2048 + 517 = 2**21 + 2**20 + 2**9 + 5
+C 2776669 = 1355*2048 + 1629 = 5**9 + 7**7 + 1
+C
+C In the table below LOG10(NU(I)) gives roughly the number of
+C random decimal digits in the random numbers considered I at a time.
+C C is the primary measure of goodness. In both cases bigger is better.
+C
+C LOG10 NU(I) C(I)
+C A I=2 I=3 I=4 I=5 I=2 I=3 I=4 I=5
+C
+C 3146757 3.3 2.0 1.6 1.3 3.1 1.3 4.6 2.6
+C 2098181 3.3 2.0 1.6 1.2 3.2 1.3 4.6 1.7
+C 3146245 3.3 2.2 1.5 1.1 3.2 4.2 1.1 0.4
+C 2776669 3.3 2.1 1.6 1.3 2.5 2.0 1.9 2.6
+C Best
+C Possible 3.3 2.3 1.7 1.4 3.6 5.9 9.7 14.9
+C
+C Input Argument --
+C R If R=0., the next random number of the sequence is generated.
+C If R .LT. 0., the last generated number will be returned for
+C possible use in a restart procedure.
+C If R .GT. 0., the sequence of random numbers will start with
+C the seed R mod 1. This seed is also returned as the value of
+C RAND provided the arithmetic is done exactly.
+C
+C Output Value --
+C RAND a pseudo-random number between 0. and 1.
+C***REFERENCES (NONE)
+C***ROUTINES CALLED (NONE)
+C***END PROLOGUE RAND
+ DATA IA1, IA0, IA1MA0 /1536, 1029, 507/
+ DATA IC /1731/
+ DATA IX1, IX0 /0, 0/
+C***FIRST EXECUTABLE STATEMENT RAND
+ IF (R.LT.0.) GO TO 10
+ IF (R.GT.0.) GO TO 20
+C
+C A*X = 2**22*IA1*IX1 + 2**11*(IA1*IX1 + (IA1-IA0)*(IX0-IX1)
+C + IA0*IX0) + IA0*IX0
+C
+ IY0 = IA0*IX0
+ IY1 = IA1*IX1 + IA1MA0*(IX0-IX1) + IY0
+ IY0 = IY0 + IC
+ IX0 = MOD (IY0, 2048)
+ IY1 = IY1 + (IY0-IX0)/2048
+ IX1 = MOD (IY1, 2048)
+C
+ 10 RAND = IX1*2048 + IX0
+ RAND = RAND / 4194304.
+ RETURN
+C
+ 20 IX1 = AMOD(R,1.)*4194304. + 0.5
+ IX0 = MOD (IX1, 2048)
+ IX1 = (IX1-IX0)/2048
+ GO TO 10
+C
+ END
+
+ **/
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_rng.h>
+
+static inline unsigned long int slatec_get (void *vstate);
+static double slatec_get_double (void *vstate);
+static void slatec_set (void *state, unsigned long int s);
+
+typedef struct
+ {
+ long int x0, x1;
+ }
+slatec_state_t;
+
+static const long P = 4194304;
+static const long a1 = 1536;
+static const long a0 = 1029;
+static const long a1ma0 = 507;
+static const long c = 1731;
+
+static inline unsigned long int
+slatec_get (void *vstate)
+{
+ long y0, y1;
+ slatec_state_t *state = (slatec_state_t *) vstate;
+
+ y0 = a0 * state->x0;
+ y1 = a1 * state->x1 + a1ma0 * (state->x0 - state->x1) + y0;
+ y0 = y0 + c;
+ state->x0 = y0 % 2048;
+ y1 = y1 + (y0 - state->x0) / 2048;
+ state->x1 = y1 % 2048;
+
+ return state->x1 * 2048 + state->x0;
+}
+
+static double
+slatec_get_double (void *vstate)
+{
+ return slatec_get (vstate) / 4194304.0 ;
+}
+
+static void
+slatec_set (void *vstate, unsigned long int s)
+{
+ slatec_state_t *state = (slatec_state_t *) vstate;
+
+ /* Only eight seeds are permitted. This is pretty limiting, but
+ at least we are guaranteed that the eight sequences are different */
+
+ s = s % 8;
+ s *= P / 8;
+
+ state->x0 = s % 2048;
+ state->x1 = (s - state->x0) / 2048;
+}
+
+static const gsl_rng_type slatec_type =
+{"slatec", /* name */
+ 4194303, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (slatec_state_t),
+ &slatec_set,
+ &slatec_get,
+ &slatec_get_double};
+
+const gsl_rng_type *gsl_rng_slatec = &slatec_type;
diff --git a/gsl-1.9/rng/taus.c b/gsl-1.9/rng/taus.c
new file mode 100644
index 0000000..fd039f5
--- /dev/null
+++ b/gsl-1.9/rng/taus.c
@@ -0,0 +1,184 @@
+/* rng/taus.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_rng.h>
+
+/* This is a maximally equidistributed combined Tausworthe
+ generator. The sequence is,
+
+ x_n = (s1_n ^ s2_n ^ s3_n)
+
+ s1_{n+1} = (((s1_n & 4294967294) <<12) ^ (((s1_n <<13) ^ s1_n) >>19))
+ s2_{n+1} = (((s2_n & 4294967288) << 4) ^ (((s2_n << 2) ^ s2_n) >>25))
+ s3_{n+1} = (((s3_n & 4294967280) <<17) ^ (((s3_n << 3) ^ s3_n) >>11))
+
+ computed modulo 2^32. In the three formulas above '^' means
+ exclusive-or (C-notation), not exponentiation. Note that the
+ algorithm relies on the properties of 32-bit unsigned integers (it
+ is formally defined on bit-vectors of length 32). I have added a
+ bitmask to make it work on 64 bit machines.
+
+ We initialize the generator with s1_1 .. s3_1 = s_n MOD m, where
+ s_n = (69069 * s_{n-1}) mod 2^32, and s_0 = s is the user-supplied
+ seed.
+
+ The theoretical value of x_{10007} is 2733957125. The subscript
+ 10007 means (1) seed the generator with s=1 (2) do six warm-up
+ iterations, (3) then do 10000 actual iterations.
+
+ The period of this generator is about 2^88.
+
+ From: P. L'Ecuyer, "Maximally Equidistributed Combined Tausworthe
+ Generators", Mathematics of Computation, 65, 213 (1996), 203--213.
+
+ This is available on the net from L'Ecuyer's home page,
+
+ http://www.iro.umontreal.ca/~lecuyer/myftp/papers/tausme.ps
+ ftp://ftp.iro.umontreal.ca/pub/simulation/lecuyer/papers/tausme.ps
+
+ Update: April 2002
+
+ There is an erratum in the paper "Tables of Maximally
+ Equidistributed Combined LFSR Generators", Mathematics of
+ Computation, 68, 225 (1999), 261--269:
+ http://www.iro.umontreal.ca/~lecuyer/myftp/papers/tausme2.ps
+
+ ... the k_j most significant bits of z_j must be non-
+ zero, for each j. (Note: this restriction also applies to the
+ computer code given in [4], but was mistakenly not mentioned in
+ that paper.)
+
+ This affects the seeding procedure by imposing the requirement
+ s1 > 1, s2 > 7, s3 > 15.
+
+ The generator taus2 has been added to satisfy this requirement.
+ The original taus generator is unchanged.
+
+ Update: November 2002
+
+ There was a bug in the correction to the seeding procedure for s2.
+ It affected the following seeds 254679140 1264751179 1519430319
+ 2274823218 2529502358 3284895257 3539574397 (s2 < 8).
+
+*/
+
+static inline unsigned long int taus_get (void *vstate);
+static double taus_get_double (void *vstate);
+static void taus_set (void *state, unsigned long int s);
+
+typedef struct
+ {
+ unsigned long int s1, s2, s3;
+ }
+taus_state_t;
+
+static inline unsigned long
+taus_get (void *vstate)
+{
+ taus_state_t *state = (taus_state_t *) vstate;
+
+#define MASK 0xffffffffUL
+#define TAUSWORTHE(s,a,b,c,d) (((s &c) <<d) &MASK) ^ ((((s <<a) &MASK)^s) >>b)
+
+ state->s1 = TAUSWORTHE (state->s1, 13, 19, 4294967294UL, 12);
+ state->s2 = TAUSWORTHE (state->s2, 2, 25, 4294967288UL, 4);
+ state->s3 = TAUSWORTHE (state->s3, 3, 11, 4294967280UL, 17);
+
+ return (state->s1 ^ state->s2 ^ state->s3);
+}
+
+static double
+taus_get_double (void *vstate)
+{
+ return taus_get (vstate) / 4294967296.0 ;
+}
+
+static void
+taus_set (void *vstate, unsigned long int s)
+{
+ taus_state_t *state = (taus_state_t *) vstate;
+
+ if (s == 0)
+ s = 1; /* default seed is 1 */
+
+#define LCG(n) ((69069 * n) & 0xffffffffUL)
+ state->s1 = LCG (s);
+ state->s2 = LCG (state->s1);
+ state->s3 = LCG (state->s2);
+
+ /* "warm it up" */
+ taus_get (state);
+ taus_get (state);
+ taus_get (state);
+ taus_get (state);
+ taus_get (state);
+ taus_get (state);
+ return;
+}
+
+static void
+taus2_set (void *vstate, unsigned long int s)
+{
+ taus_state_t *state = (taus_state_t *) vstate;
+
+ if (s == 0)
+ s = 1; /* default seed is 1 */
+
+#define LCG(n) ((69069 * n) & 0xffffffffUL)
+ state->s1 = LCG (s);
+ if (state->s1 < 2) state->s1 += 2UL;
+ state->s2 = LCG (state->s1);
+ if (state->s2 < 8) state->s2 += 8UL;
+ state->s3 = LCG (state->s2);
+ if (state->s3 < 16) state->s3 += 16UL;
+
+ /* "warm it up" */
+ taus_get (state);
+ taus_get (state);
+ taus_get (state);
+ taus_get (state);
+ taus_get (state);
+ taus_get (state);
+ return;
+}
+
+
+static const gsl_rng_type taus_type =
+{"taus", /* name */
+ 0xffffffffUL, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (taus_state_t),
+ &taus_set,
+ &taus_get,
+ &taus_get_double};
+
+const gsl_rng_type *gsl_rng_taus = &taus_type;
+
+static const gsl_rng_type taus2_type =
+{"taus2", /* name */
+ 0xffffffffUL, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (taus_state_t),
+ &taus2_set,
+ &taus_get,
+ &taus_get_double};
+
+const gsl_rng_type *gsl_rng_taus2 = &taus2_type;
diff --git a/gsl-1.9/rng/taus113.c b/gsl-1.9/rng/taus113.c
new file mode 100644
index 0000000..68cfc9e
--- /dev/null
+++ b/gsl-1.9/rng/taus113.c
@@ -0,0 +1,168 @@
+/* rng/taus113.c
+ * Copyright (C) 2002 Atakan Gurkan
+ * Based on the file taus.c which has the notice
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* This is a maximally equidistributed combined, collision free
+ Tausworthe generator, with a period ~2^{113}. The sequence is,
+
+ x_n = (z1_n ^ z2_n ^ z3_n ^ z4_n)
+
+ b = (((z1_n << 6) ^ z1_n) >> 13)
+ z1_{n+1} = (((z1_n & 4294967294) << 18) ^ b)
+ b = (((z2_n << 2) ^ z2_n) >> 27)
+ z2_{n+1} = (((z2_n & 4294967288) << 2) ^ b)
+ b = (((z3_n << 13) ^ z3_n) >> 21)
+ z3_{n+1} = (((z3_n & 4294967280) << 7) ^ b)
+ b = (((z4_n << 3) ^ z4_n) >> 12)
+ z4_{n+1} = (((z4_n & 4294967168) << 13) ^ b)
+
+ computed modulo 2^32. In the formulas above '^' means exclusive-or
+ (C-notation), not exponentiation.
+ The algorithm is for 32-bit integers, hence a bitmask is used to clear
+ all but least significant 32 bits, after left shifts, to make the code
+ work on architectures where integers are 64-bit.
+
+ The generator is initialized with
+ zi = (69069 * z{i+1}) MOD 2^32 where z0 is the seed provided
+ During initialization a check is done to make sure that the initial seeds
+ have a required number of their most significant bits set.
+ After this, the state is passed through the RNG 10 times to ensure the
+ state satisfies a recurrence relation.
+
+ References:
+ P. L'Ecuyer, "Tables of Maximally-Equidistributed Combined LFSR Generators",
+ Mathematics of Computation, 68, 225 (1999), 261--269.
+ http://www.iro.umontreal.ca/~lecuyer/myftp/papers/tausme2.ps
+ P. L'Ecuyer, "Maximally Equidistributed Combined Tausworthe Generators",
+ Mathematics of Computation, 65, 213 (1996), 203--213.
+ http://www.iro.umontreal.ca/~lecuyer/myftp/papers/tausme.ps
+ the online version of the latter contains corrections to the print version.
+*/
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_rng.h>
+
+#define LCG(n) ((69069UL * n) & 0xffffffffUL)
+#define MASK 0xffffffffUL
+
+static inline unsigned long int taus113_get (void *vstate);
+static double taus113_get_double (void *vstate);
+static void taus113_set (void *state, unsigned long int s);
+
+typedef struct
+{
+ unsigned long int z1, z2, z3, z4;
+}
+taus113_state_t;
+
+static inline unsigned long
+taus113_get (void *vstate)
+{
+ taus113_state_t *state = (taus113_state_t *) vstate;
+ unsigned long b1, b2, b3, b4;
+
+ b1 = ((((state->z1 << 6UL) & MASK) ^ state->z1) >> 13UL);
+ state->z1 = ((((state->z1 & 4294967294UL) << 18UL) & MASK) ^ b1);
+
+ b2 = ((((state->z2 << 2UL) & MASK) ^ state->z2) >> 27UL);
+ state->z2 = ((((state->z2 & 4294967288UL) << 2UL) & MASK) ^ b2);
+
+ b3 = ((((state->z3 << 13UL) & MASK) ^ state->z3) >> 21UL);
+ state->z3 = ((((state->z3 & 4294967280UL) << 7UL) & MASK) ^ b3);
+
+ b4 = ((((state->z4 << 3UL) & MASK) ^ state->z4) >> 12UL);
+ state->z4 = ((((state->z4 & 4294967168UL) << 13UL) & MASK) ^ b4);
+
+ return (state->z1 ^ state->z2 ^ state->z3 ^ state->z4);
+
+}
+
+static double
+taus113_get_double (void *vstate)
+{
+ return taus113_get (vstate) / 4294967296.0;
+}
+
+static void
+taus113_set (void *vstate, unsigned long int s)
+{
+ taus113_state_t *state = (taus113_state_t *) vstate;
+
+ if (!s)
+ s = 1UL; /* default seed is 1 */
+
+ state->z1 = LCG (s);
+ if (state->z1 < 2UL)
+ state->z1 += 2UL;
+ state->z2 = LCG (state->z1);
+ if (state->z2 < 8UL)
+ state->z2 += 8UL;
+ state->z3 = LCG (state->z2);
+ if (state->z3 < 16UL)
+ state->z3 += 16UL;
+ state->z4 = LCG (state->z3);
+ if (state->z4 < 128UL)
+ state->z4 += 128UL;
+
+ /* Calling RNG ten times to satify recurrence condition */
+ taus113_get (state);
+ taus113_get (state);
+ taus113_get (state);
+ taus113_get (state);
+ taus113_get (state);
+ taus113_get (state);
+ taus113_get (state);
+ taus113_get (state);
+ taus113_get (state);
+ taus113_get (state);
+
+ return;
+}
+
+static const gsl_rng_type taus113_type = {
+ "taus113", /* name */
+ 0xffffffffUL, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (taus113_state_t),
+ &taus113_set,
+ &taus113_get,
+ &taus113_get_double
+};
+
+const gsl_rng_type *gsl_rng_taus113 = &taus113_type;
+
+
+/* Rules for analytic calculations using GNU Emacs Calc:
+ (used to find the values for the test program)
+
+ [ LCG(n) := n * 69069 mod (2^32) ]
+
+ [ b1(x) := rsh(xor(lsh(x, 6), x), 13),
+ q1(x) := xor(lsh(and(x, 4294967294), 18), b1(x)),
+ b2(x) := rsh(xor(lsh(x, 2), x), 27),
+ q2(x) := xor(lsh(and(x, 4294967288), 2), b2(x)),
+ b3(x) := rsh(xor(lsh(x, 13), x), 21),
+ q3(x) := xor(lsh(and(x, 4294967280), 7), b3(x)),
+ b4(x) := rsh(xor(lsh(x, 3), x), 12),
+ q4(x) := xor(lsh(and(x, 4294967168), 13), b4(x))
+ ]
+
+ [ S([z1,z2,z3,z4]) := [q1(z1), q2(z2), q3(z3), q4(z4)] ]
+*/
diff --git a/gsl-1.9/rng/test.c b/gsl-1.9/rng/test.c
new file mode 100644
index 0000000..8b267a2
--- /dev/null
+++ b/gsl-1.9/rng/test.c
@@ -0,0 +1,602 @@
+/* rng/test.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+
+void rng_test (const gsl_rng_type * T, unsigned long int seed, unsigned int n,
+ unsigned long int result);
+void rng_float_test (const gsl_rng_type * T);
+void generic_rng_test (const gsl_rng_type * T);
+void rng_state_test (const gsl_rng_type * T);
+void rng_parallel_state_test (const gsl_rng_type * T);
+void rng_read_write_test (const gsl_rng_type * T);
+int rng_max_test (gsl_rng * r, unsigned long int *kmax, unsigned long int ran_max) ;
+int rng_min_test (gsl_rng * r, unsigned long int *kmin, unsigned long int ran_min, unsigned long int ran_max) ;
+int rng_sum_test (gsl_rng * r, double *sigma);
+int rng_bin_test (gsl_rng * r, double *sigma);
+
+#define N 10000
+#define N2 200000
+
+int
+main (void)
+{
+ const gsl_rng_type ** rngs = gsl_rng_types_setup(); /* get all rng types */
+
+ const gsl_rng_type ** r ;
+
+ gsl_ieee_env_setup ();
+
+ gsl_rng_env_setup ();
+
+ /* specific tests of known results for 10000 iterations with seed = 1 */
+
+ rng_test (gsl_rng_rand, 1, 10000, 1910041713);
+ rng_test (gsl_rng_randu, 1, 10000, 1623524161);
+ rng_test (gsl_rng_cmrg, 1, 10000, 719452880);
+ rng_test (gsl_rng_minstd, 1, 10000, 1043618065);
+ rng_test (gsl_rng_mrg, 1, 10000, 2064828650);
+ rng_test (gsl_rng_taus, 1, 10000, 2733957125UL);
+ rng_test (gsl_rng_taus2, 1, 10000, 2733957125UL);
+ rng_test (gsl_rng_taus113, 1, 1000, 1925420673UL);
+ rng_test (gsl_rng_transputer, 1, 10000, 1244127297UL);
+ rng_test (gsl_rng_vax, 1, 10000, 3051034865UL);
+
+ /* Borosh13 test value from PARI: (1812433253^10000)%(2^32) */
+ rng_test (gsl_rng_borosh13, 1, 10000, 2513433025UL);
+
+ /* Fishman18 test value from PARI: (62089911^10000)%(2^31-1) */
+ rng_test (gsl_rng_fishman18, 1, 10000, 330402013UL);
+
+ /* Fishman2x test value from PARI:
+ ((48271^10000)%(2^31-1) - (40692^10000)%(2^31-249))%(2^31-1) */
+ rng_test (gsl_rng_fishman2x, 1, 10000, 540133597UL);
+
+ /* Knuthran2 test value from PARI:
+ { xn1=1; xn2=1; for (n=1,10000,
+ xn = (271828183*xn1 - 314159269*xn2)%(2^31-1);
+ xn2=xn1; xn1=xn; print(xn); ) } */
+ rng_test (gsl_rng_knuthran2, 1, 10000, 1084477620UL);
+
+ /* Knuthran test value taken from p188 in Knuth Vol 2. 3rd Ed */
+ rng_test (gsl_rng_knuthran, 310952, 1009 * 2009 + 1, 461390032);
+
+ /* Knuthran improved test value from Knuth's source */
+ rng_test (gsl_rng_knuthran2002, 310952, 1, 708622036);
+ rng_test (gsl_rng_knuthran2002, 310952, 2, 1005450560);
+ rng_test (gsl_rng_knuthran2002, 310952, 100 * 2009 + 1, 995235265);
+ rng_test (gsl_rng_knuthran2002, 310952, 1009 * 2009 + 1, 704987132);
+
+ /* Lecuyer21 test value from PARI: (40692^10000)%(2^31-249) */
+ rng_test (gsl_rng_lecuyer21, 1, 10000, 2006618587UL);
+
+ /* Waterman14 test value from PARI: (1566083941^10000)%(2^32) */
+ rng_test (gsl_rng_waterman14, 1, 10000, 3776680385UL);
+
+ /* specific tests of known results for 10000 iterations with seed = 6 */
+
+ /* Coveyou test value from PARI:
+ x=6; for(n=1,10000,x=(x*(x+1))%(2^32);print(x);) */
+
+ rng_test (gsl_rng_coveyou, 6, 10000, 1416754246UL);
+
+ /* Fishman20 test value from PARI: (6*48271^10000)%(2^31-1) */
+ rng_test (gsl_rng_fishman20, 6, 10000, 248127575UL);
+
+ /* FIXME: the ranlux tests below were made by running the fortran code and
+ getting the expected value from that. An analytic calculation
+ would be preferable. */
+
+ rng_test (gsl_rng_ranlux, 314159265, 10000, 12077992);
+ rng_test (gsl_rng_ranlux389, 314159265, 10000, 165942);
+
+ rng_test (gsl_rng_ranlxs0, 1, 10000, 11904320);
+ /* 0.709552764892578125 * ldexp(1.0,24) */
+
+ rng_test (gsl_rng_ranlxs1, 1, 10000, 8734328);
+ /* 0.520606517791748047 * ldexp(1.0,24) */
+
+ rng_test (gsl_rng_ranlxs2, 1, 10000, 6843140);
+ /* 0.407882928848266602 * ldexp(1.0,24) */
+
+ rng_test (gsl_rng_ranlxd1, 1, 10000, 1998227290UL);
+ /* 0.465248546261094020 * ldexp(1.0,32) */
+
+ rng_test (gsl_rng_ranlxd2, 1, 10000, 3949287736UL);
+ /* 0.919515205581550532 * ldexp(1.0,32) */
+
+ /* FIXME: the tests below were made by running the original code in
+ the ../random directory and getting the expected value from
+ that. An analytic calculation would be preferable. */
+
+ rng_test (gsl_rng_slatec, 1, 10000, 45776);
+ rng_test (gsl_rng_uni, 1, 10000, 9214);
+ rng_test (gsl_rng_uni32, 1, 10000, 1155229825);
+ rng_test (gsl_rng_zuf, 1, 10000, 3970);
+
+ /* The tests below were made by running the original code and
+ getting the expected value from that. An analytic calculation
+ would be preferable. */
+
+ rng_test (gsl_rng_r250, 1, 10000, 1100653588);
+ rng_test (gsl_rng_mt19937, 4357, 1000, 1186927261);
+ rng_test (gsl_rng_mt19937_1999, 4357, 1000, 1030650439);
+ rng_test (gsl_rng_mt19937_1998, 4357, 1000, 1309179303);
+ rng_test (gsl_rng_tt800, 0, 10000, 2856609219UL);
+
+ rng_test (gsl_rng_ran0, 0, 10000, 1115320064);
+ rng_test (gsl_rng_ran1, 0, 10000, 1491066076);
+ rng_test (gsl_rng_ran2, 0, 10000, 1701364455);
+ rng_test (gsl_rng_ran3, 0, 10000, 186340785);
+
+ rng_test (gsl_rng_ranmar, 1, 10000, 14428370);
+
+ rng_test (gsl_rng_rand48, 0, 10000, 0xDE095043UL);
+ rng_test (gsl_rng_rand48, 1, 10000, 0xEDA54977UL);
+
+ rng_test (gsl_rng_random_glibc2, 0, 10000, 1908609430);
+ rng_test (gsl_rng_random8_glibc2, 0, 10000, 1910041713);
+ rng_test (gsl_rng_random32_glibc2, 0, 10000, 1587395585);
+ rng_test (gsl_rng_random64_glibc2, 0, 10000, 52848624);
+ rng_test (gsl_rng_random128_glibc2, 0, 10000, 1908609430);
+ rng_test (gsl_rng_random256_glibc2, 0, 10000, 179943260);
+
+ rng_test (gsl_rng_random_bsd, 0, 10000, 1457025928);
+ rng_test (gsl_rng_random8_bsd, 0, 10000, 1910041713);
+ rng_test (gsl_rng_random32_bsd, 0, 10000, 1663114331);
+ rng_test (gsl_rng_random64_bsd, 0, 10000, 864469165);
+ rng_test (gsl_rng_random128_bsd, 0, 10000, 1457025928);
+ rng_test (gsl_rng_random256_bsd, 0, 10000, 1216357476);
+
+ rng_test (gsl_rng_random_libc5, 0, 10000, 428084942);
+ rng_test (gsl_rng_random8_libc5, 0, 10000, 1910041713);
+ rng_test (gsl_rng_random32_libc5, 0, 10000, 1967452027);
+ rng_test (gsl_rng_random64_libc5, 0, 10000, 2106639801);
+ rng_test (gsl_rng_random128_libc5, 0, 10000, 428084942);
+ rng_test (gsl_rng_random256_libc5, 0, 10000, 116367984);
+
+ rng_test (gsl_rng_ranf, 0, 10000, 2152890433UL);
+ rng_test (gsl_rng_ranf, 2, 10000, 339327233);
+
+ /* Test constant relationship between int and double functions */
+
+ for (r = rngs ; *r != 0; r++)
+ rng_float_test (*r);
+
+ /* Test save/restore functions */
+
+ for (r = rngs ; *r != 0; r++)
+ rng_state_test (*r);
+
+ for (r = rngs ; *r != 0; r++)
+ rng_parallel_state_test (*r);
+
+ for (r = rngs ; *r != 0; r++)
+ rng_read_write_test (*r);
+
+ /* generic statistical tests (these are just to make sure that we
+ don't get any crazy results back from the generator, i.e. they
+ aren't a test of the algorithm, just the implementation) */
+
+ for (r = rngs ; *r != 0; r++)
+ generic_rng_test (*r);
+
+ exit (gsl_test_summary ());
+}
+
+
+void
+rng_test (const gsl_rng_type * T, unsigned long int seed, unsigned int n,
+ unsigned long int result)
+{
+ gsl_rng *r = gsl_rng_alloc (T);
+ unsigned int i;
+ unsigned long int k = 0;
+ int status;
+
+ if (seed != 0)
+ {
+ gsl_rng_set (r, seed);
+ }
+
+ for (i = 0; i < n; i++)
+ {
+ k = gsl_rng_get (r);
+ }
+
+ status = (k != result);
+ gsl_test (status, "%s, %u steps (%u observed vs %u expected)",
+ gsl_rng_name (r), n, k, result);
+
+ gsl_rng_free (r);
+}
+
+void
+rng_float_test (const gsl_rng_type * T)
+{
+ gsl_rng *ri = gsl_rng_alloc (T);
+ gsl_rng *rf = gsl_rng_alloc (T);
+
+ double u, c ;
+ unsigned int i;
+ unsigned long int k = 0;
+ int status = 0 ;
+
+ do
+ {
+ k = gsl_rng_get (ri);
+ u = gsl_rng_get (rf);
+ }
+ while (k == 0) ;
+
+ c = k / u ;
+ for (i = 0; i < N2; i++)
+ {
+ k = gsl_rng_get (ri);
+ u = gsl_rng_get (rf);
+ if (c*k != u)
+ {
+ status = 1 ;
+ break ;
+ }
+ }
+
+ gsl_test (status, "%s, ratio of int to double (%g observed vs %g expected)",
+ gsl_rng_name (ri), c, k/u);
+
+ gsl_rng_free (ri);
+ gsl_rng_free (rf);
+}
+
+
+void
+rng_state_test (const gsl_rng_type * T)
+{
+ unsigned long int test_a[N], test_b[N];
+
+ int i;
+
+ gsl_rng *r = gsl_rng_alloc (T);
+ gsl_rng *r_save = gsl_rng_alloc (T);
+
+ for (i = 0; i < N; ++i)
+ {
+ gsl_rng_get (r); /* throw away N iterations */
+ }
+
+ gsl_rng_memcpy (r_save, r); /* save the intermediate state */
+
+ for (i = 0; i < N; ++i)
+ {
+ test_a[i] = gsl_rng_get (r);
+ }
+
+ gsl_rng_memcpy (r, r_save); /* restore the intermediate state */
+ gsl_rng_free (r_save);
+
+ for (i = 0; i < N; ++i)
+ {
+ test_b[i] = gsl_rng_get (r);
+ }
+
+ {
+ int status = 0;
+ for (i = 0; i < N; ++i)
+ {
+ status |= (test_b[i] != test_a[i]);
+ }
+ gsl_test (status, "%s, random number state consistency",
+ gsl_rng_name (r));
+ }
+
+ gsl_rng_free (r);
+}
+
+
+void
+rng_parallel_state_test (const gsl_rng_type * T)
+{
+ unsigned long int test_a[N], test_b[N];
+ unsigned long int test_c[N], test_d[N];
+ double test_e[N], test_f[N];
+
+ int i;
+
+ gsl_rng *r1 = gsl_rng_alloc (T);
+ gsl_rng *r2 = gsl_rng_alloc (T);
+
+ for (i = 0; i < N; ++i)
+ {
+ gsl_rng_get (r1); /* throw away N iterations */
+ }
+
+ gsl_rng_memcpy (r2, r1); /* save the intermediate state */
+
+ for (i = 0; i < N; ++i)
+ {
+ /* check that there is no hidden state intermixed between r1 and r2 */
+ test_a[i] = gsl_rng_get (r1);
+ test_b[i] = gsl_rng_get (r2);
+ test_c[i] = gsl_rng_uniform_int (r1, 1234);
+ test_d[i] = gsl_rng_uniform_int (r2, 1234);
+ test_e[i] = gsl_rng_uniform (r1);
+ test_f[i] = gsl_rng_uniform (r2);
+ }
+
+ {
+ int status = 0;
+ for (i = 0; i < N; ++i)
+ {
+ status |= (test_b[i] != test_a[i]);
+ status |= (test_c[i] != test_d[i]);
+ status |= (test_e[i] != test_f[i]);
+ }
+ gsl_test (status, "%s, parallel random number state consistency",
+ gsl_rng_name (r1));
+ }
+
+ gsl_rng_free (r1);
+ gsl_rng_free (r2);
+
+}
+
+void
+rng_read_write_test (const gsl_rng_type * T)
+{
+ unsigned long int test_a[N], test_b[N];
+
+ int i;
+
+ gsl_rng *r = gsl_rng_alloc (T);
+
+ for (i = 0; i < N; ++i)
+ {
+ gsl_rng_get (r); /* throw away N iterations */
+ }
+
+ { /* save the state to a binary file */
+ FILE *f = fopen("test.dat", "wb");
+ gsl_rng_fwrite(f, r);
+ fclose(f);
+ }
+
+ for (i = 0; i < N; ++i)
+ {
+ test_a[i] = gsl_rng_get (r);
+ }
+
+ { /* read the state from a binary file */
+ FILE *f = fopen("test.dat", "rb");
+ gsl_rng_fread(f, r);
+ fclose(f);
+ }
+
+ for (i = 0; i < N; ++i)
+ {
+ test_b[i] = gsl_rng_get (r);
+ }
+
+ {
+ int status = 0;
+ for (i = 0; i < N; ++i)
+ {
+ status |= (test_b[i] != test_a[i]);
+ }
+ gsl_test (status, "%s, random number generator read and write",
+ gsl_rng_name (r));
+ }
+
+ gsl_rng_free (r);
+}
+
+void
+generic_rng_test (const gsl_rng_type * T)
+{
+ gsl_rng *r = gsl_rng_alloc (T);
+ const char *name = gsl_rng_name (r);
+ unsigned long int kmax = 0, kmin = 1000;
+ double sigma = 0;
+ const unsigned long int ran_max = gsl_rng_max (r);
+ const unsigned long int ran_min = gsl_rng_min (r);
+
+ int status = rng_max_test (r, &kmax, ran_max);
+
+ gsl_test (status,
+ "%s, observed vs theoretical maximum (%lu vs %lu)",
+ name, kmax, ran_max);
+
+ status = rng_min_test (r, &kmin, ran_min, ran_max);
+
+ gsl_test (status,
+ "%s, observed vs theoretical minimum (%lu vs %lu)",
+ name, kmin, ran_min);
+
+ status = rng_sum_test (r, &sigma);
+
+ gsl_test (status,
+ "%s, sum test within acceptable sigma (observed %.2g sigma)",
+ name, sigma);
+
+ status = rng_bin_test (r, &sigma);
+
+ gsl_test (status,
+ "%s, bin test within acceptable chisq (observed %.2g sigma)",
+ name, sigma);
+
+ gsl_rng_set (r, 1); /* set seed to 1 */
+ status = rng_max_test (r, &kmax, ran_max);
+
+ gsl_rng_set (r, 1); /* set seed to 1 */
+ status |= rng_min_test (r, &kmin, ran_min, ran_max);
+
+ gsl_rng_set (r, 1); /* set seed to 1 */
+ status |= rng_sum_test (r, &sigma);
+
+ gsl_test (status, "%s, maximum and sum tests for seed=1", name);
+
+ gsl_rng_set (r, 12345); /* set seed to a "typical" value */
+ status = rng_max_test (r, &kmax, ran_max);
+
+ gsl_rng_set (r, 12345); /* set seed to a "typical" value */
+ status |= rng_min_test (r, &kmin, ran_min, ran_max);
+
+ gsl_rng_set (r, 12345); /* set seed to a "typical" value */
+ status |= rng_sum_test (r, &sigma);
+
+ gsl_test (status, "%s, maximum and sum tests for non-default seeds", name);
+
+ gsl_rng_free (r);
+}
+
+int
+rng_max_test (gsl_rng * r, unsigned long int *kmax, unsigned long int ran_max)
+{
+ unsigned long int actual_uncovered;
+ double expect_uncovered;
+ int status;
+ unsigned long int max = 0;
+ int i;
+
+ for (i = 0; i < N2; ++i)
+ {
+ unsigned long int k = gsl_rng_get (r);
+ if (k > max)
+ max = k;
+ }
+
+ *kmax = max;
+
+ actual_uncovered = ran_max - max;
+ expect_uncovered = (double) ran_max / (double) N2;
+
+ status = (max > ran_max) || (actual_uncovered > 7 * expect_uncovered) ;
+
+ return status;
+}
+
+int
+rng_min_test (gsl_rng * r, unsigned long int *kmin,
+ unsigned long int ran_min, unsigned long int ran_max)
+{
+ unsigned long int actual_uncovered;
+ double expect_uncovered;
+ int status;
+ unsigned long int min = 1000000000UL;
+ int i;
+
+ for (i = 0; i < N2; ++i)
+ {
+ unsigned long int k = gsl_rng_get (r);
+ if (k < min)
+ min = k;
+ }
+
+ *kmin = min;
+
+ actual_uncovered = min - ran_min;
+ expect_uncovered = (double) ran_max / (double) N2;
+
+ status = (min < ran_min) || (actual_uncovered > 7 * expect_uncovered);
+
+ return status;
+}
+
+int
+rng_sum_test (gsl_rng * r, double *sigma)
+{
+ double sum = 0;
+ int i, status;
+
+ for (i = 0; i < N2; ++i)
+ {
+ double x = gsl_rng_uniform (r) - 0.5;
+ sum += x;
+ }
+
+ sum /= N2;
+
+ /* expect the average to have a variance of 1/(12 n) */
+
+ *sigma = sum * sqrt (12.0 * N2);
+
+ /* more than 3 sigma is an error (increased to 3.1 to avoid false alarms) */
+
+ status = (fabs (*sigma) > 3.1 || fabs(*sigma) < 0.003);
+
+ if (status) {
+ fprintf(stderr,"sum=%g, sigma=%g\n",sum,*sigma);
+ }
+
+ return status;
+}
+
+#define BINS 17
+#define EXTRA 10
+int
+rng_bin_test (gsl_rng * r, double *sigma)
+{
+ int count[BINS+EXTRA];
+ double chisq = 0;
+ int i, status;
+
+ for (i = 0; i < BINS+EXTRA; i++)
+ count[i] = 0 ;
+
+
+ for (i = 0; i < N2; i++)
+ {
+ int j = gsl_rng_uniform_int (r, BINS);
+ count[j]++ ;
+ }
+
+ chisq = 0 ;
+ for (i = 0; i < BINS; i++)
+ {
+ double x = (double)N2/(double)BINS ;
+ double d = (count[i] - x) ;
+ chisq += (d*d) / x;
+ }
+
+ *sigma = sqrt(chisq/BINS) ;
+
+ /* more than 3 sigma is an error */
+
+ status = (fabs (*sigma) > 3 || fabs(*sigma) < 0.003);
+
+ for (i = BINS; i < BINS+EXTRA; i++)
+ {
+ if (count[i] != 0)
+ {
+ status = 1 ;
+ gsl_test (status,
+ "%s, wrote outside range in bin test "
+ "(%d observed vs %d expected)",
+ gsl_rng_name(r), i, BINS - 1);
+ }
+ }
+
+ return status;
+}
+
diff --git a/gsl-1.9/rng/transputer.c b/gsl-1.9/rng/transputer.c
new file mode 100644
index 0000000..0bad215
--- /dev/null
+++ b/gsl-1.9/rng/transputer.c
@@ -0,0 +1,83 @@
+/* rng/transputer.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_rng.h>
+
+/* This is the INMOS Transputer Development System generator. The sequence is,
+
+ x_{n+1} = (a x_n) mod m
+
+ with a = 1664525 and m = 2^32. The seed specifies the initial
+ value, x_1.
+
+ The theoretical value of x_{10001} is 1244127297.
+
+ The period of this generator is 2^30. */
+
+static inline unsigned long int transputer_get (void *vstate);
+static double transputer_get_double (void *vstate);
+static void transputer_set (void *state, unsigned long int s);
+
+typedef struct
+ {
+ unsigned long int x;
+ }
+transputer_state_t;
+
+static unsigned long int
+transputer_get (void *vstate)
+{
+ transputer_state_t *state = (transputer_state_t *) vstate;
+
+ state->x = (1664525 * state->x) & 0xffffffffUL;
+
+ return state->x;
+}
+
+static double
+transputer_get_double (void *vstate)
+{
+ return transputer_get (vstate) / 4294967296.0 ;
+}
+
+static void
+transputer_set (void *vstate, unsigned long int s)
+{
+ transputer_state_t *state = (transputer_state_t *) vstate;
+
+ if (s == 0)
+ s = 1 ; /* default seed is 1. */
+
+ state->x = s;
+
+ return;
+}
+
+static const gsl_rng_type transputer_type =
+{"transputer", /* name */
+ 0xffffffffUL, /* RAND_MAX */
+ 1, /* RAND_MIN */
+ sizeof (transputer_state_t),
+ &transputer_set,
+ &transputer_get,
+ &transputer_get_double};
+
+const gsl_rng_type *gsl_rng_transputer = &transputer_type;
diff --git a/gsl-1.9/rng/tt.c b/gsl-1.9/rng/tt.c
new file mode 100644
index 0000000..11f3bde
--- /dev/null
+++ b/gsl-1.9/rng/tt.c
@@ -0,0 +1,143 @@
+/* rng/tt.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_rng.h>
+
+/* This is the TT800 twisted GSFR generator for 32 bit integers. It
+ has been superceded by MT19937 (mt.c). The period is 2^800.
+
+ This implementation is based on tt800.c, July 8th 1996 version by
+ M. Matsumoto, email: matumoto@math.keio.ac.jp
+
+ From: Makoto Matsumoto and Yoshiharu Kurita, "Twisted GFSR
+ Generators II", ACM Transactions on Modelling and Computer
+ Simulation, Vol. 4, No. 3, 1994, pages 254-266. */
+
+static inline unsigned long int tt_get (void *vstate);
+static double tt_get_double (void *vstate);
+static void tt_set (void *state, unsigned long int s);
+
+#define N 25
+#define M 7
+
+typedef struct
+ {
+ int n;
+ unsigned long int x[N];
+ }
+tt_state_t;
+
+static inline unsigned long int
+tt_get (void *vstate)
+{
+ tt_state_t *state = (tt_state_t *) vstate;
+
+ /* this is the magic vector, a */
+
+ const unsigned long mag01[2] =
+ {0x00000000, 0x8ebfd028UL};
+ unsigned long int y;
+ unsigned long int *const x = state->x;
+ int n = state->n;
+
+ if (n >= N)
+ {
+ int i;
+ for (i = 0; i < N - M; i++)
+ {
+ x[i] = x[i + M] ^ (x[i] >> 1) ^ mag01[x[i] % 2];
+ }
+ for (; i < N; i++)
+ {
+ x[i] = x[i + (M - N)] ^ (x[i] >> 1) ^ mag01[x[i] % 2];
+ };
+ n = 0;
+ }
+
+ y = x[n];
+ y ^= (y << 7) & 0x2b5b2500UL; /* s and b, magic vectors */
+ y ^= (y << 15) & 0xdb8b0000UL; /* t and c, magic vectors */
+ y &= 0xffffffffUL; /* you may delete this line if word size = 32 */
+
+ /* The following line was added by Makoto Matsumoto in the 1996
+ version to improve lower bit's correlation. Delete this line
+ to use the code published in 1994. */
+
+ y ^= (y >> 16); /* added to the 1994 version */
+
+ state->n = n + 1;
+
+ return y;
+}
+
+static double
+tt_get_double (void * vstate)
+{
+ return tt_get (vstate) / 4294967296.0 ;
+}
+
+static void
+tt_set (void *vstate, unsigned long int s)
+{
+ tt_state_t *state = (tt_state_t *) vstate;
+
+ const tt_state_t init_state =
+ {0,
+ {0x95f24dabUL, 0x0b685215UL, 0xe76ccae7UL,
+ 0xaf3ec239UL, 0x715fad23UL, 0x24a590adUL,
+ 0x69e4b5efUL, 0xbf456141UL, 0x96bc1b7bUL,
+ 0xa7bdf825UL, 0xc1de75b7UL, 0x8858a9c9UL,
+ 0x2da87693UL, 0xb657f9ddUL, 0xffdc8a9fUL,
+ 0x8121da71UL, 0x8b823ecbUL, 0x885d05f5UL,
+ 0x4e20cd47UL, 0x5a9ad5d9UL, 0x512c0c03UL,
+ 0xea857ccdUL, 0x4cc1d30fUL, 0x8891a8a1UL,
+ 0xa6b7aadbUL}};
+
+
+ if (s == 0) /* default seed is given explicitly in the original code */
+ {
+ *state = init_state;
+ }
+ else
+ {
+ int i;
+
+ state->n = 0;
+
+ state->x[0] = s & 0xffffffffUL;
+
+ for (i = 1; i < N; i++)
+ state->x[i] = (69069 * state->x[i - 1]) & 0xffffffffUL;
+ }
+
+ return;
+}
+
+static const gsl_rng_type tt_type =
+{"tt800", /* name */
+ 0xffffffffUL, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (tt_state_t),
+ &tt_set,
+ &tt_get,
+ &tt_get_double};
+
+const gsl_rng_type *gsl_rng_tt800 = &tt_type;
diff --git a/gsl-1.9/rng/types.c b/gsl-1.9/rng/types.c
new file mode 100644
index 0000000..e8946ec
--- /dev/null
+++ b/gsl-1.9/rng/types.c
@@ -0,0 +1,101 @@
+/* rng/types.c
+ *
+ * Copyright (C) 2001 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_rng.h>
+
+#define N 100
+
+const gsl_rng_type * gsl_rng_generator_types[N];
+
+#define ADD(t) {if (i==N) abort(); gsl_rng_generator_types[i] = (t); i++; };
+
+const gsl_rng_type **
+gsl_rng_types_setup (void)
+{
+ int i = 0;
+
+ ADD(gsl_rng_borosh13);
+ ADD(gsl_rng_cmrg);
+ ADD(gsl_rng_coveyou);
+ ADD(gsl_rng_fishman18);
+ ADD(gsl_rng_fishman20);
+ ADD(gsl_rng_fishman2x);
+ ADD(gsl_rng_gfsr4);
+ ADD(gsl_rng_knuthran);
+ ADD(gsl_rng_knuthran2);
+ ADD(gsl_rng_knuthran2002);
+ ADD(gsl_rng_lecuyer21);
+ ADD(gsl_rng_minstd);
+ ADD(gsl_rng_mrg);
+ ADD(gsl_rng_mt19937);
+ ADD(gsl_rng_mt19937_1999);
+ ADD(gsl_rng_mt19937_1998);
+ ADD(gsl_rng_r250);
+ ADD(gsl_rng_ran0);
+ ADD(gsl_rng_ran1);
+ ADD(gsl_rng_ran2);
+ ADD(gsl_rng_ran3);
+ ADD(gsl_rng_rand);
+ ADD(gsl_rng_rand48);
+ ADD(gsl_rng_random128_bsd);
+ ADD(gsl_rng_random128_glibc2);
+ ADD(gsl_rng_random128_libc5);
+ ADD(gsl_rng_random256_bsd);
+ ADD(gsl_rng_random256_glibc2);
+ ADD(gsl_rng_random256_libc5);
+ ADD(gsl_rng_random32_bsd);
+ ADD(gsl_rng_random32_glibc2);
+ ADD(gsl_rng_random32_libc5);
+ ADD(gsl_rng_random64_bsd);
+ ADD(gsl_rng_random64_glibc2);
+ ADD(gsl_rng_random64_libc5);
+ ADD(gsl_rng_random8_bsd);
+ ADD(gsl_rng_random8_glibc2);
+ ADD(gsl_rng_random8_libc5);
+ ADD(gsl_rng_random_bsd);
+ ADD(gsl_rng_random_glibc2);
+ ADD(gsl_rng_random_libc5);
+ ADD(gsl_rng_randu);
+ ADD(gsl_rng_ranf);
+ ADD(gsl_rng_ranlux);
+ ADD(gsl_rng_ranlux389);
+ ADD(gsl_rng_ranlxd1);
+ ADD(gsl_rng_ranlxd2);
+ ADD(gsl_rng_ranlxs0);
+ ADD(gsl_rng_ranlxs1);
+ ADD(gsl_rng_ranlxs2);
+ ADD(gsl_rng_ranmar);
+ ADD(gsl_rng_slatec);
+ ADD(gsl_rng_taus);
+ ADD(gsl_rng_taus2);
+ ADD(gsl_rng_taus113);
+ ADD(gsl_rng_transputer);
+ ADD(gsl_rng_tt800);
+ ADD(gsl_rng_uni);
+ ADD(gsl_rng_uni32);
+ ADD(gsl_rng_vax);
+ ADD(gsl_rng_waterman14);
+ ADD(gsl_rng_zuf);
+ ADD(0);
+
+ return gsl_rng_generator_types;
+}
+
diff --git a/gsl-1.9/rng/uni.c b/gsl-1.9/rng/uni.c
new file mode 100644
index 0000000..c43cfa1
--- /dev/null
+++ b/gsl-1.9/rng/uni.c
@@ -0,0 +1,201 @@
+/* rng/uni.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/**
+ This is a lagged Fibonacci generator which supposedly excellent
+ statistical properties (I do not concur)
+
+ I got it from the net and translated into C.
+
+* ======================================================================
+* NIST Guide to Available Math Software.
+* Fullsource for module UNI from package CMLIB.
+* Retrieved from CAMSUN on Tue Oct 8 14:04:10 1996.
+* ======================================================================
+
+C***BEGIN PROLOGUE UNI
+C***DATE WRITTEN 810915
+C***REVISION DATE 830805
+C***CATEGORY NO. L6A21
+C***KEYWORDS RANDOM NUMBERS, UNIFORM RANDOM NUMBERS
+C***AUTHOR BLUE, JAMES, SCIENTIFIC COMPUTING DIVISION, NBS
+C KAHANER, DAVID, SCIENTIFIC COMPUTING DIVISION, NBS
+C MARSAGLIA, GEORGE, COMPUTER SCIENCE DEPT., WASH STATE UNIV
+C
+C***PURPOSE THIS ROUTINE GENERATES QUASI UNIFORM RANDOM NUMBERS ON [0,1
+C AND CAN BE USED ON ANY COMPUTER WITH WHICH ALLOWS INTEGERS
+C AT LEAST AS LARGE AS 32767.
+C***DESCRIPTION
+C
+C THIS ROUTINE GENERATES QUASI UNIFORM RANDOM NUMBERS ON THE INTER
+C [0,1). IT CAN BE USED WITH ANY COMPUTER WHICH ALLOWS
+C INTEGERS AT LEAST AS LARGE AS 32767.
+C
+C
+C USE
+C FIRST TIME....
+C Z = UNI(JD)
+C HERE JD IS ANY N O N - Z E R O INTEGER.
+C THIS CAUSES INITIALIZATION OF THE PROGRAM
+C AND THE FIRST RANDOM NUMBER TO BE RETURNED AS Z.
+C SUBSEQUENT TIMES...
+C Z = UNI(0)
+C CAUSES THE NEXT RANDOM NUMBER TO BE RETURNED AS Z.
+C
+C
+C..................................................................
+C NOTE: USERS WHO WISH TO TRANSPORT THIS PROGRAM FROM ONE COMPUTER
+C TO ANOTHER SHOULD READ THE FOLLOWING INFORMATION.....
+C
+C MACHINE DEPENDENCIES...
+C MDIG = A LOWER BOUND ON THE NUMBER OF BINARY DIGITS AVAILABLE
+C FOR REPRESENTING INTEGERS, INCLUDING THE SIGN BIT.
+C THIS VALUE MUST BE AT LEAST 16, BUT MAY BE INCREASED
+C IN LINE WITH REMARK A BELOW.
+C
+C REMARKS...
+C A. THIS PROGRAM CAN BE USED IN TWO WAYS:
+C (1) TO OBTAIN REPEATABLE RESULTS ON DIFFERENT COMPUTERS,
+C SET 'MDIG' TO THE SMALLEST OF ITS VALUES ON EACH, OR,
+C (2) TO ALLOW THE LONGEST SEQUENCE OF RANDOM NUMBERS TO BE
+C GENERATED WITHOUT CYCLING (REPEATING) SET 'MDIG' TO THE
+C LARGEST POSSIBLE VALUE.
+C B. THE SEQUENCE OF NUMBERS GENERATED DEPENDS ON THE INITIAL
+C INPUT 'JD' AS WELL AS THE VALUE OF 'MDIG'.
+C IF MDIG=16 ONE SHOULD FIND THAT
+ Editors Note: set the seed using 152 in order to get uni(305)
+ -jt
+C THE FIRST EVALUATION
+C Z=UNI(305) GIVES Z=.027832881...
+C THE SECOND EVALUATION
+C Z=UNI(0) GIVES Z=.56102176...
+C THE THIRD EVALUATION
+C Z=UNI(0) GIVES Z=.41456343...
+C THE THOUSANDTH EVALUATION
+C Z=UNI(0) GIVES Z=.19797357...
+C
+C***REFERENCES MARSAGLIA G., "COMMENTS ON THE PERFECT UNIFORM RANDOM
+C NUMBER GENERATOR", UNPUBLISHED NOTES, WASH S. U.
+C***ROUTINES CALLED I1MACH,XERROR
+C***END PROLOGUE UNI
+
+ **/
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_rng.h>
+
+static inline unsigned long int uni_get (void *vstate);
+static double uni_get_double (void *vstate);
+static void uni_set (void *state, unsigned long int s);
+
+static const unsigned int MDIG = 16; /* Machine digits in int */
+static const unsigned int m1 = 32767; /* 2^(MDIG-1) - 1 */
+static const unsigned int m2 = 256; /* 2^(MDIG/2) */
+
+typedef struct
+ {
+ int i, j;
+ unsigned long m[17];
+ }
+uni_state_t;
+
+static inline unsigned long
+uni_get (void *vstate)
+{
+ uni_state_t *state = (uni_state_t *) vstate;
+ const int i = state->i;
+ const int j = state->j;
+
+ /* important k not be unsigned */
+ long k = state->m[i] - state->m[j];
+
+ if (k < 0)
+ k += m1;
+ state->m[j] = k;
+
+ if (i == 0)
+ {
+ state->i = 16;
+ }
+ else
+ {
+ (state->i)--;
+ }
+
+ if (j == 0)
+ {
+ state->j = 16;
+ }
+ else
+ {
+ (state->j)--;
+ }
+
+ return k;
+}
+
+static double
+uni_get_double (void *vstate)
+{
+ return uni_get (vstate) / 32767.0 ;
+}
+
+static void
+uni_set (void *vstate, unsigned long int s)
+{
+ unsigned int i, seed, k0, k1, j0, j1;
+
+ uni_state_t *state = (uni_state_t *) vstate;
+
+ /* For this routine, the seeding is very elaborate! */
+ /* A flaw in this approach is that seeds 1,2 give exactly the
+ same random number sequence! */
+
+ s = 2 * s + 1; /* enforce seed be odd */
+ seed = (s < m1 ? s : m1); /* seed should be less than m1 */
+
+ k0 = 9069 % m2;
+ k1 = 9069 / m2;
+ j0 = seed % m2;
+ j1 = seed / m2;
+
+ for (i = 0; i < 17; ++i)
+ {
+ seed = j0 * k0;
+ j1 = (seed / m2 + j0 * k1 + j1 * k0) % (m2 / 2);
+ j0 = seed % m2;
+ state->m[i] = j0 + m2 * j1;
+ }
+ state->i = 4;
+ state->j = 16;
+
+ return;
+}
+
+static const gsl_rng_type uni_type =
+{"uni", /* name */
+ 32766, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (uni_state_t),
+ &uni_set,
+ &uni_get,
+ &uni_get_double};
+
+const gsl_rng_type *gsl_rng_uni = &uni_type;
diff --git a/gsl-1.9/rng/uni32.c b/gsl-1.9/rng/uni32.c
new file mode 100644
index 0000000..ba5536a
--- /dev/null
+++ b/gsl-1.9/rng/uni32.c
@@ -0,0 +1,203 @@
+/* rng/uni32.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/**
+ This is a lagged Fibonacci generator which supposedly excellent
+ statistical properties (I do not concur)
+
+ I got it from the net and translated into C.
+
+* ======================================================================
+* NIST Guide to Available Math Software.
+* Fullsource for module UNI from package CMLIB.
+* Retrieved from CAMSUN on Tue Oct 8 14:04:10 1996.
+* ======================================================================
+
+C***BEGIN PROLOGUE UNI
+C***DATE WRITTEN 810915
+C***REVISION DATE 830805
+C***CATEGORY NO. L6A21
+C***KEYWORDS RANDOM NUMBERS, UNIFORM RANDOM NUMBERS
+C***AUTHOR BLUE, JAMES, SCIENTIFIC COMPUTING DIVISION, NBS
+C KAHANER, DAVID, SCIENTIFIC COMPUTING DIVISION, NBS
+C MARSAGLIA, GEORGE, COMPUTER SCIENCE DEPT., WASH STATE UNIV
+C
+C***PURPOSE THIS ROUTINE GENERATES QUASI UNIFORM RANDOM NUMBERS ON [0,1
+C AND CAN BE USED ON ANY COMPUTER WITH WHICH ALLOWS INTEGERS
+C AT LEAST AS LARGE AS 32767.
+C***DESCRIPTION
+C
+C THIS ROUTINE GENERATES QUASI UNIFORM RANDOM NUMBERS ON THE INTER
+C [0,1). IT CAN BE USED WITH ANY COMPUTER WHICH ALLOWS
+C INTEGERS AT LEAST AS LARGE AS 32767.
+C
+C
+C USE
+C FIRST TIME....
+C Z = UNI(JD)
+C HERE JD IS ANY N O N - Z E R O INTEGER.
+C THIS CAUSES INITIALIZATION OF THE PROGRAM
+C AND THE FIRST RANDOM NUMBER TO BE RETURNED AS Z.
+C SUBSEQUENT TIMES...
+C Z = UNI(0)
+C CAUSES THE NEXT RANDOM NUMBER TO BE RETURNED AS Z.
+C
+C
+C..................................................................
+C NOTE: USERS WHO WISH TO TRANSPORT THIS PROGRAM FROM ONE COMPUTER
+C TO ANOTHER SHOULD READ THE FOLLOWING INFORMATION.....
+C
+C MACHINE DEPENDENCIES...
+C MDIG = A LOWER BOUND ON THE NUMBER OF BINARY DIGITS AVAILABLE
+C FOR REPRESENTING INTEGERS, INCLUDING THE SIGN BIT.
+C THIS VALUE MUST BE AT LEAST 16, BUT MAY BE INCREASED
+C IN LINE WITH REMARK A BELOW.
+C
+C REMARKS...
+C A. THIS PROGRAM CAN BE USED IN TWO WAYS:
+C (1) TO OBTAIN REPEATABLE RESULTS ON DIFFERENT COMPUTERS,
+C SET 'MDIG' TO THE SMALLEST OF ITS VALUES ON EACH, OR,
+C (2) TO ALLOW THE LONGEST SEQUENCE OF RANDOM NUMBERS TO BE
+C GENERATED WITHOUT CYCLING (REPEATING) SET 'MDIG' TO THE
+C LARGEST POSSIBLE VALUE.
+C B. THE SEQUENCE OF NUMBERS GENERATED DEPENDS ON THE INITIAL
+C INPUT 'JD' AS WELL AS THE VALUE OF 'MDIG'.
+C IF MDIG=16 ONE SHOULD FIND THAT
+ Editors Note: set the seed using 152 in order to get uni(305)
+ -jt
+C THE FIRST EVALUATION
+C Z=UNI(305) GIVES Z=.027832881...
+C THE SECOND EVALUATION
+C Z=UNI(0) GIVES Z=.56102176...
+C THE THIRD EVALUATION
+C Z=UNI(0) GIVES Z=.41456343...
+C THE THOUSANDTH EVALUATION
+C Z=UNI(0) GIVES Z=.19797357...
+C
+C***REFERENCES MARSAGLIA G., "COMMENTS ON THE PERFECT UNIFORM RANDOM
+C NUMBER GENERATOR", UNPUBLISHED NOTES, WASH S. U.
+C***ROUTINES CALLED I1MACH,XERROR
+C***END PROLOGUE UNI
+
+ **/
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_rng.h>
+
+static inline unsigned long int uni32_get (void *vstate);
+static double uni32_get_double (void *vstate);
+static void uni32_set (void *state, unsigned long int s);
+
+static const unsigned long int MDIG = 32; /* Machine digits in int */
+static const unsigned long int m1 = 2147483647; /* 2^(MDIG-1) - 1 */
+static const unsigned long int m2 = 65536; /* 2^(MDIG/2) */
+
+typedef struct
+ {
+ int i, j;
+ unsigned long m[17];
+ }
+uni32_state_t;
+
+static inline unsigned long
+uni32_get (void *vstate)
+{
+ uni32_state_t *state = (uni32_state_t *) vstate;
+ const long int i = state->i;
+ const long int j = state->j;
+
+ /* important k not be unsigned */
+ long int k = state->m[i] - state->m[j];
+
+ if (k < 0)
+ k += m1;
+ state->m[j] = k;
+
+ if (i == 0)
+ {
+ state->i = 16;
+ }
+ else
+ {
+ (state->i)--;
+ }
+
+ if (j == 0)
+ {
+ state->j = 16;
+ }
+ else
+ {
+ (state->j)--;
+ }
+
+ return k;
+}
+
+static double
+uni32_get_double (void *vstate)
+{
+ return uni32_get (vstate) / 2147483647.0 ;
+}
+
+static void
+uni32_set (void *vstate, unsigned long int s)
+{
+ long int seed, k0, k1, j0, j1;
+ int i;
+
+ uni32_state_t *state = (uni32_state_t *) vstate;
+
+ /* For this routine, the seeding is very elaborate! */
+ /* A flaw in this approach is that seeds 1,2 give exactly the
+ same random number sequence! */
+
+ /*s = 2*s+1; *//* enforce seed be odd */
+ seed = (s < m1 ? s : m1); /* seed should be less than m1 */
+ seed -= (seed % 2 == 0 ? 1 : 0);
+
+ k0 = 9069 % m2;
+ k1 = 9069 / m2;
+ j0 = seed % m2;
+ j1 = seed / m2;
+
+ for (i = 0; i < 17; i++)
+ {
+ seed = j0 * k0;
+ j1 = (seed / m2 + j0 * k1 + j1 * k0) % (m2 / 2);
+ j0 = seed % m2;
+ state->m[i] = j0 + m2 * j1;
+ }
+ state->i = 4;
+ state->j = 16;
+
+ return;
+}
+
+static const gsl_rng_type uni32_type =
+{"uni32", /* name */
+ 2147483646, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (uni32_state_t),
+ &uni32_set,
+ &uni32_get,
+ &uni32_get_double};
+
+const gsl_rng_type *gsl_rng_uni32 = &uni32_type;
diff --git a/gsl-1.9/rng/vax.c b/gsl-1.9/rng/vax.c
new file mode 100644
index 0000000..8c0f725
--- /dev/null
+++ b/gsl-1.9/rng/vax.c
@@ -0,0 +1,83 @@
+/* rng/vax.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_rng.h>
+
+/* This is the old vax generator MTH$RANDOM. The sequence is,
+
+ x_{n+1} = (a x_n + c) mod m
+
+ with a = 69069, c = 1 and m = 2^32. The seed specifies the initial
+ value, x_1.
+
+ The theoretical value of x_{10001} is 3051034865.
+
+ The period of this generator is 2^32. */
+
+static inline unsigned long int vax_get (void *vstate);
+static double vax_get_double (void *vstate);
+static void vax_set (void *state, unsigned long int s);
+
+typedef struct
+ {
+ unsigned long int x;
+ }
+vax_state_t;
+
+static inline unsigned long int
+vax_get (void *vstate)
+{
+ vax_state_t *state = (vax_state_t *) vstate;
+
+ state->x = (69069 * state->x + 1) & 0xffffffffUL;
+
+ return state->x;
+}
+
+static double
+vax_get_double (void *vstate)
+{
+ return vax_get (vstate) / 4294967296.0 ;
+}
+
+static void
+vax_set (void *vstate, unsigned long int s)
+{
+ vax_state_t *state = (vax_state_t *) vstate;
+
+ /* default seed is 0. The constant term c stops the series from
+ collapsing to 0,0,0,0,0,... */
+
+ state->x = s;
+
+ return;
+}
+
+static const gsl_rng_type vax_type =
+{"vax", /* name */
+ 0xffffffffUL, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (vax_state_t),
+ &vax_set,
+ &vax_get,
+ &vax_get_double};
+
+const gsl_rng_type *gsl_rng_vax = &vax_type;
diff --git a/gsl-1.9/rng/waterman14.c b/gsl-1.9/rng/waterman14.c
new file mode 100644
index 0000000..070129b
--- /dev/null
+++ b/gsl-1.9/rng/waterman14.c
@@ -0,0 +1,92 @@
+/* rng/waterman14.c
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/*
+ * This generator is taken from
+ *
+ * Donald E. Knuth
+ * The Art of Computer Programming
+ * Volume 2
+ * Third Edition
+ * Addison-Wesley
+ * Page 106-108
+ *
+ * It is called "Waterman".
+ *
+ * This implementation copyright (C) 2001 Carlo Perassi
+ * and (C) 2003 Heiko Bauke.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_rng.h>
+
+#define AA 1566083941UL
+#define MM 0xffffffffUL /* 2 ^ 32 - 1 */
+
+static inline unsigned long int ran_get (void *vstate);
+static double ran_get_double (void *vstate);
+static void ran_set (void *state, unsigned long int s);
+
+typedef struct
+{
+ unsigned long int x;
+}
+ran_state_t;
+
+static inline unsigned long int
+ran_get (void *vstate)
+{
+ ran_state_t *state = (ran_state_t *) vstate;
+
+ state->x = (AA * state->x) & MM;
+
+ return state->x;
+}
+
+static double
+ran_get_double (void *vstate)
+{
+ ran_state_t *state = (ran_state_t *) vstate;
+
+ return ran_get (state) / 4294967296.0;
+}
+
+static void
+ran_set (void *vstate, unsigned long int s)
+{
+ ran_state_t *state = (ran_state_t *) vstate;
+
+ if (s == 0)
+ s = 1; /* default seed is 1 */
+
+ state->x = s & MM;
+
+ return;
+}
+
+static const gsl_rng_type ran_type = {
+ "waterman14", /* name */
+ MM, /* RAND_MAX */
+ 1, /* RAND_MIN */
+ sizeof (ran_state_t),
+ &ran_set,
+ &ran_get,
+ &ran_get_double
+};
+
+const gsl_rng_type *gsl_rng_waterman14 = &ran_type;
diff --git a/gsl-1.9/rng/zuf.c b/gsl-1.9/rng/zuf.c
new file mode 100644
index 0000000..6996b5e
--- /dev/null
+++ b/gsl-1.9/rng/zuf.c
@@ -0,0 +1,141 @@
+/* rng/zuf.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 James Theiler, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_rng.h>
+
+/* It is crucial that m == n-273 mod 607 at all times;
+ For speed of execution, however, this is never enforced.
+ Instead is is set in the initializer: note 607-273=334
+ Note also that the state.u[607] is not initialized */
+
+static inline unsigned long int zuf_get (void *vstate);
+static double zuf_get_double (void *vstate);
+static void zuf_set (void *state, unsigned long int s);
+
+static const unsigned long int zuf_randmax = 16777216; /* 2^24 */
+
+typedef struct
+ {
+ int n;
+ unsigned long int u[607];
+ }
+zuf_state_t;
+
+/* The zufall package was implemented with float's, which is to say 24
+ bits of precision. Since I'm using long's instead, my RANDMAX
+ reflects this. */
+
+static inline unsigned long int
+zuf_get (void *vstate)
+{
+ zuf_state_t *state = (zuf_state_t *) vstate;
+ const int n = state->n;
+ const int m = (n - 273 + 607) % 607;
+ unsigned long int t = state->u[n] + state->u[m];
+
+ while (t > zuf_randmax)
+ t -= zuf_randmax;
+
+ state->u[n] = t;
+
+ if (n == 606)
+ {
+ state->n = 0;
+ }
+ else
+ {
+ state->n = n + 1;
+ }
+
+ return t;
+}
+
+static double
+zuf_get_double (void *vstate)
+{
+ return zuf_get (vstate) / 16777216.0 ;
+}
+
+static void
+zuf_set (void *vstate, unsigned long int s)
+{
+ /* A very elaborate seeding procedure is provided with the
+ zufall package; this is virtually a copy of that procedure */
+
+ /* Initialized data */
+
+ long int kl = 9373;
+ long int ij = 1802;
+
+ /* Local variables */
+ long int i, j, k, l, m;
+ double x, y;
+ long int ii, jj;
+
+ zuf_state_t *state = (zuf_state_t *) vstate;
+
+ state->n = 0;
+
+/* generates initial seed buffer by linear congruential */
+/* method. Taken from Marsaglia, FSU report FSU-SCRI-87-50 */
+/* variable seed should be 0 < seed <31328 */
+
+ if (s == 0)
+ s = 1802; /* default seed is 1802 */
+
+ ij = s;
+
+ i = ij / 177 % 177 + 2;
+ j = ij % 177 + 2;
+ k = kl / 169 % 178 + 1;
+ l = kl % 169;
+ for (ii = 0; ii < 607; ++ii)
+ {
+ x = 0.0;
+ y = 0.5;
+ /* 24 bits?? */
+ for (jj = 1; jj <= 24; ++jj)
+ {
+ m = i * j % 179 * k % 179;
+ i = j;
+ j = k;
+ k = m;
+ l = (l * 53 + 1) % 169;
+ if (l * m % 64 >= 32)
+ {
+ x += y;
+ }
+ y *= 0.5;
+ }
+ state->u[ii] = (unsigned long int) (x * zuf_randmax);
+ }
+}
+
+static const gsl_rng_type zuf_type =
+{"zuf", /* name */
+ 0x00ffffffUL, /* RAND_MAX */
+ 0, /* RAND_MIN */
+ sizeof (zuf_state_t),
+ &zuf_set,
+ &zuf_get,
+ &zuf_get_double};
+
+const gsl_rng_type *gsl_rng_zuf = &zuf_type;
diff --git a/gsl-1.9/roots/ChangeLog b/gsl-1.9/roots/ChangeLog
new file mode 100644
index 0000000..aa00c09
--- /dev/null
+++ b/gsl-1.9/roots/ChangeLog
@@ -0,0 +1,159 @@
+2007-01-04 Brian Gough <bjg@network-theory.co.uk>
+
+ * convergence.c (gsl_root_test_delta): added termination
+ alternative condition x1==x0
+
+2005-03-02 Brian Gough <bjg@network-theory.co.uk>
+
+ * steffenson.c (steffenson_iterate): improved wording of error messages
+
+ * secant.c (secant_iterate): improved wording of error messages
+
+ * roots.h (SAFE_FUNC_CALL): improved wording of error message
+
+ * newton.c (newton_iterate): improved wording of error messages
+
+ * utility.c: removed, not needed any more
+
+Sun Jul 15 17:53:48 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * removed interval type
+
+Sun May 6 14:26:59 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c: removed tests for macros, which are now in sys/.
+
+Mon Apr 16 20:17:04 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * fsolver.c (gsl_root_fsolver_alloc): removed unnecessary status
+ variable
+
+Sun Feb 18 15:35:25 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * fdfsolver.c fsolver.c: changed so that the solver _alloc
+ function no longer calls _set, the user must do that separately.
+
+Wed May 17 11:37:15 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * test_macros.c (test_macros): use GSL_POSINF and GSL_NAN macros
+ instead of 1/0 and 0/0
+
+Mon Feb 14 13:05:30 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * removed definition of isinf macro (no longer needed)
+
+ * made all internal functions static
+
+Wed Nov 3 11:59:35 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * fixed test failures
+
+ * test.c (main): added a call to gsl_ieee_env_setup for testing
+
+ * test_roots.c: increased the maximum number of iterations to 150
+ so that the tests still work on the difficult cases.
+
+ * steffenson.c (steffenson_iterate): add a check to avoid division
+ by zero
+
+Sat Oct 16 19:43:14 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * removed GSL_ROOT_EPSILON_BUFFER, not needed anymore
+
+Wed Jul 21 18:47:01 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_roots.h, convergence.c: changed order of relative and
+ absolute errors to make them the same as quadpack routines
+ (abs,rel)
+
+Wed Jul 21 16:30:56 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * brent.c (brent_iterate): fixed bug where bounding interval could
+ be incorrect and not include root.
+
+Mon Mar 1 15:38:06 1999 Brian Gough <bjg@netsci.freeserve.co.uk>
+
+ * moved static class data out of gsl_root_fsolver and
+ gsl_root_fdfsolver and into gsl_root_fsolver_type and
+ gsl_root_fdfsolver_type
+
+
+Mon Mar 1 15:38:06 1999 Brian Gough <bjg@netsci.freeserve.co.uk>
+
+ * renamed f_solver to fsolver and fdf_solver to fdfsolver, since
+ these look neater
+
+Sun Feb 28 21:11:21 1999 Brian Gough <bjg@netsci.freeserve.co.uk>
+
+ * rewrote the root finding functions in an iterative framework
+
+Tue Nov 17 16:47:09 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * secant.c, falsepos.c newton.c: added gsl_math.h to included
+ headers to import GSL_MAX and GSL_MIN
+
+Mon Nov 9 21:21:45 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * roots.h: got rid of local MAX(a,b) and MIN(a,b) definitions
+ since they are now in config.h
+
+Wed Nov 4 16:08:32 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * test.c (test_brent): allow the brent tests to run for more
+ iterations since they take longer on the pathological cases.
+
+ * brent.c (gsl_root_brent): on each iteration keep track of
+ current best estimates of the root and the bounds so that they are
+ returned to the user if the function exits prematurely.
+
+ clean up the brent algorithm based on remarks in the original
+ paper
+
+Mon Oct 26 16:31:21 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * in all routines with upper and lower bounds if a root is found
+ exactly then the bracket is collapsed onto the root instead of
+ being untouched.
+
+Thu Oct 15 13:59:30 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * bisection.c, falsepos.c, secant.c: reordered the tests so that
+ the minimum number of function evaluations are performed when
+ there is an early exit due to one of the supplied limits lying on
+ a root.
+
+Fri Aug 21 14:48:13 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * test.c: clean up of tests to get rid of warnings
+
+Thu Aug 20 10:21:15 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * roots.h (_WITHIN_TOL): added extra parens in macro definition,
+ for safety
+
+ * falsepos.c (gsl_root_falsepos): removed test for absolute
+ equality and replaced by a flag indicating which variables
+ changed.
+
+ * test.c (main): simplified the tests, removed command line
+ arguments (can use the debugger to select which ones to run)
+
+Mon Jun 15 22:22:54 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * started to eliminate void * arguments for function types (they
+ are not a good idea and can easily be specified)
+
+1998-02-09 Mark Galassi <rosalia@cygnus.com>
+
+ * test.c (main): added an extra argument so that the $(srcdir) can
+ be passed along when "make check" is run in a separate build
+ directory.
+
+ * test-macros, test-secant, test-bisection, test-newton,
+ test-falsepos: modified these to use build and source directories
+ explicitly. Now "make check" in a separate build directory works.
+
+1998-02-02 Mark Galassi <rosalia@cygnus.com>
+
+ * Makefile.am (TESTS): added $(srcdir) before these scripts, since
+ the TESTS target picks things from the build directory.
diff --git a/gsl-1.9/roots/Makefile.am b/gsl-1.9/roots/Makefile.am
new file mode 100644
index 0000000..2ea5015
--- /dev/null
+++ b/gsl-1.9/roots/Makefile.am
@@ -0,0 +1,19 @@
+# -*-makefile-*-
+
+noinst_LTLIBRARIES = libgslroots.la
+
+pkginclude_HEADERS = gsl_roots.h
+
+noinst_HEADERS = roots.h
+
+INCLUDES= -I$(top_builddir)
+
+libgslroots_la_SOURCES = bisection.c brent.c falsepos.c newton.c secant.c steffenson.c convergence.c fsolver.c fdfsolver.c
+
+check_PROGRAMS = test
+
+TESTS = $(check_PROGRAMS)
+
+test_SOURCES = test.c test_funcs.c test.h
+test_LDADD = libgslroots.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+
diff --git a/gsl-1.9/roots/Makefile.in b/gsl-1.9/roots/Makefile.in
new file mode 100644
index 0000000..66a22c7
--- /dev/null
+++ b/gsl-1.9/roots/Makefile.in
@@ -0,0 +1,548 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# -*-makefile-*-
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = test$(EXEEXT)
+subdir = roots
+DIST_COMMON = $(noinst_HEADERS) $(pkginclude_HEADERS) \
+ $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog TODO
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgslroots_la_LIBADD =
+am_libgslroots_la_OBJECTS = bisection.lo brent.lo falsepos.lo \
+ newton.lo secant.lo steffenson.lo convergence.lo fsolver.lo \
+ fdfsolver.lo
+libgslroots_la_OBJECTS = $(am_libgslroots_la_OBJECTS)
+am_test_OBJECTS = test.$(OBJEXT) test_funcs.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = libgslroots.la ../ieee-utils/libgslieeeutils.la \
+ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \
+ ../utils/libutils.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgslroots_la_SOURCES) $(test_SOURCES)
+DIST_SOURCES = $(libgslroots_la_SOURCES) $(test_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libgslroots.la
+pkginclude_HEADERS = gsl_roots.h
+noinst_HEADERS = roots.h
+INCLUDES = -I$(top_builddir)
+libgslroots_la_SOURCES = bisection.c brent.c falsepos.c newton.c secant.c steffenson.c convergence.c fsolver.c fdfsolver.c
+TESTS = $(check_PROGRAMS)
+test_SOURCES = test.c test_funcs.c test.h
+test_LDADD = libgslroots.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps roots/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps roots/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgslroots.la: $(libgslroots_la_OBJECTS) $(libgslroots_la_DEPENDENCIES)
+ $(LINK) $(libgslroots_la_LDFLAGS) $(libgslroots_la_OBJECTS) $(libgslroots_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkgincludeHEADERS
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/roots/TODO b/gsl-1.9/roots/TODO
new file mode 100644
index 0000000..06f17c5
--- /dev/null
+++ b/gsl-1.9/roots/TODO
@@ -0,0 +1,9 @@
+* Add an inline version of the iterate method for speed? Perhaps not,
+the time taken for each iteration surely dominated by the convergence
+test.
+
+* Numerical derivatives? Maybe have a function to manufacture an fdf
+from an f and optionally a df. (We'll need to approximate the
+derivative if it is not provided; this is something which should be
+done outside the root finding package.)
+
diff --git a/gsl-1.9/roots/bisection.c b/gsl-1.9/roots/bisection.c
new file mode 100644
index 0000000..e337ab0
--- /dev/null
+++ b/gsl-1.9/roots/bisection.c
@@ -0,0 +1,134 @@
+/* roots/bisection.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Reid Priedhorsky, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+
+/* bisection.c -- bisection root finding algorithm */
+
+#include <config.h>
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <float.h>
+
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_roots.h>
+
+#include "roots.h"
+
+typedef struct
+ {
+ double f_lower, f_upper;
+ }
+bisection_state_t;
+
+static int bisection_init (void * vstate, gsl_function * f, double * root, double x_lower, double x_upper);
+static int bisection_iterate (void * vstate, gsl_function * f, double * root, double * x_lower, double * x_upper);
+
+static int
+bisection_init (void * vstate, gsl_function * f, double * root, double x_lower, double x_upper)
+{
+ bisection_state_t * state = (bisection_state_t *) vstate;
+
+ double f_lower, f_upper ;
+
+ *root = 0.5 * (x_lower + x_upper) ;
+
+ SAFE_FUNC_CALL (f, x_lower, &f_lower);
+ SAFE_FUNC_CALL (f, x_upper, &f_upper);
+
+ state->f_lower = f_lower;
+ state->f_upper = f_upper;
+
+ if ((f_lower < 0.0 && f_upper < 0.0) || (f_lower > 0.0 && f_upper > 0.0))
+ {
+ GSL_ERROR ("endpoints do not straddle y=0", GSL_EINVAL);
+ }
+
+ return GSL_SUCCESS;
+
+}
+
+static int
+bisection_iterate (void * vstate, gsl_function * f, double * root, double * x_lower, double * x_upper)
+{
+ bisection_state_t * state = (bisection_state_t *) vstate;
+
+ double x_bisect, f_bisect;
+
+ const double x_left = *x_lower ;
+ const double x_right = *x_upper ;
+
+ const double f_lower = state->f_lower;
+ const double f_upper = state->f_upper;
+
+ if (f_lower == 0.0)
+ {
+ *root = x_left ;
+ *x_upper = x_left;
+ return GSL_SUCCESS;
+ }
+
+ if (f_upper == 0.0)
+ {
+ *root = x_right ;
+ *x_lower = x_right;
+ return GSL_SUCCESS;
+ }
+
+ x_bisect = (x_left + x_right) / 2.0;
+
+ SAFE_FUNC_CALL (f, x_bisect, &f_bisect);
+
+ if (f_bisect == 0.0)
+ {
+ *root = x_bisect;
+ *x_lower = x_bisect;
+ *x_upper = x_bisect;
+ return GSL_SUCCESS;
+ }
+
+ /* Discard the half of the interval which doesn't contain the root. */
+
+ if ((f_lower > 0.0 && f_bisect < 0.0) || (f_lower < 0.0 && f_bisect > 0.0))
+ {
+ *root = 0.5 * (x_left + x_bisect) ;
+ *x_upper = x_bisect;
+ state->f_upper = f_bisect;
+ }
+ else
+ {
+ *root = 0.5 * (x_bisect + x_right) ;
+ *x_lower = x_bisect;
+ state->f_lower = f_bisect;
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+static const gsl_root_fsolver_type bisection_type =
+{"bisection", /* name */
+ sizeof (bisection_state_t),
+ &bisection_init,
+ &bisection_iterate};
+
+const gsl_root_fsolver_type * gsl_root_fsolver_bisection = &bisection_type;
diff --git a/gsl-1.9/roots/brent.c b/gsl-1.9/roots/brent.c
new file mode 100644
index 0000000..5cd5275
--- /dev/null
+++ b/gsl-1.9/roots/brent.c
@@ -0,0 +1,244 @@
+/* roots/brent.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Reid Priedhorsky, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* brent.c -- brent root finding algorithm */
+
+#include <config.h>
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <float.h>
+
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_roots.h>
+
+#include "roots.h"
+
+
+typedef struct
+ {
+ double a, b, c, d, e;
+ double fa, fb, fc;
+ }
+brent_state_t;
+
+static int brent_init (void * vstate, gsl_function * f, double * root, double x_lower, double x_upper);
+static int brent_iterate (void * vstate, gsl_function * f, double * root, double * x_lower, double * x_upper);
+
+
+static int
+brent_init (void * vstate, gsl_function * f, double * root, double x_lower, double x_upper)
+{
+ brent_state_t * state = (brent_state_t *) vstate;
+
+ double f_lower, f_upper ;
+
+ *root = 0.5 * (x_lower + x_upper) ;
+
+ SAFE_FUNC_CALL (f, x_lower, &f_lower);
+ SAFE_FUNC_CALL (f, x_upper, &f_upper);
+
+ state->a = x_lower;
+ state->fa = f_lower;
+
+ state->b = x_upper;
+ state->fb = f_upper;
+
+ state->c = x_upper;
+ state->fc = f_upper;
+
+ state->d = x_upper - x_lower ;
+ state->e = x_upper - x_lower ;
+
+ if ((f_lower < 0.0 && f_upper < 0.0) || (f_lower > 0.0 && f_upper > 0.0))
+ {
+ GSL_ERROR ("endpoints do not straddle y=0", GSL_EINVAL);
+ }
+
+ return GSL_SUCCESS;
+
+}
+
+static int
+brent_iterate (void * vstate, gsl_function * f, double * root, double * x_lower, double * x_upper)
+{
+ brent_state_t * state = (brent_state_t *) vstate;
+
+ double tol, m;
+
+ int ac_equal = 0;
+
+ double a = state->a, b = state->b, c = state->c;
+ double fa = state->fa, fb = state->fb, fc = state->fc;
+ double d = state->d, e = state->e;
+
+ if ((fb < 0 && fc < 0) || (fb > 0 && fc > 0))
+ {
+ ac_equal = 1;
+ c = a;
+ fc = fa;
+ d = b - a;
+ e = b - a;
+ }
+
+ if (fabs (fc) < fabs (fb))
+ {
+ ac_equal = 1;
+ a = b;
+ b = c;
+ c = a;
+ fa = fb;
+ fb = fc;
+ fc = fa;
+ }
+
+ tol = 0.5 * GSL_DBL_EPSILON * fabs (b);
+ m = 0.5 * (c - b);
+
+ if (fb == 0)
+ {
+ *root = b;
+ *x_lower = b;
+ *x_upper = b;
+
+ return GSL_SUCCESS;
+ }
+
+ if (fabs (m) <= tol)
+ {
+ *root = b;
+
+ if (b < c)
+ {
+ *x_lower = b;
+ *x_upper = c;
+ }
+ else
+ {
+ *x_lower = c;
+ *x_upper = b;
+ }
+
+ return GSL_SUCCESS;
+ }
+
+ if (fabs (e) < tol || fabs (fa) <= fabs (fb))
+ {
+ d = m; /* use bisection */
+ e = m;
+ }
+ else
+ {
+ double p, q, r; /* use inverse cubic interpolation */
+ double s = fb / fa;
+
+ if (ac_equal)
+ {
+ p = 2 * m * s;
+ q = 1 - s;
+ }
+ else
+ {
+ q = fa / fc;
+ r = fb / fc;
+ p = s * (2 * m * q * (q - r) - (b - a) * (r - 1));
+ q = (q - 1) * (r - 1) * (s - 1);
+ }
+
+ if (p > 0)
+ {
+ q = -q;
+ }
+ else
+ {
+ p = -p;
+ }
+
+ if (2 * p < GSL_MIN (3 * m * q - fabs (tol * q), fabs (e * q)))
+ {
+ e = d;
+ d = p / q;
+ }
+ else
+ {
+ /* interpolation failed, fall back to bisection */
+
+ d = m;
+ e = m;
+ }
+ }
+
+ a = b;
+ fa = fb;
+
+ if (fabs (d) > tol)
+ {
+ b += d;
+ }
+ else
+ {
+ b += (m > 0 ? +tol : -tol);
+ }
+
+ SAFE_FUNC_CALL (f, b, &fb);
+
+ state->a = a ;
+ state->b = b ;
+ state->c = c ;
+ state->d = d ;
+ state->e = e ;
+ state->fa = fa ;
+ state->fb = fb ;
+ state->fc = fc ;
+
+ /* Update the best estimate of the root and bounds on each
+ iteration */
+
+ *root = b;
+
+ if ((fb < 0 && fc < 0) || (fb > 0 && fc > 0))
+ {
+ c = a;
+ }
+
+ if (b < c)
+ {
+ *x_lower = b;
+ *x_upper = c;
+ }
+ else
+ {
+ *x_lower = c;
+ *x_upper = b;
+ }
+
+ return GSL_SUCCESS ;
+}
+
+
+static const gsl_root_fsolver_type brent_type =
+{"brent", /* name */
+ sizeof (brent_state_t),
+ &brent_init,
+ &brent_iterate};
+
+const gsl_root_fsolver_type * gsl_root_fsolver_brent = &brent_type;
diff --git a/gsl-1.9/roots/convergence.c b/gsl-1.9/roots/convergence.c
new file mode 100644
index 0000000..34a78fe
--- /dev/null
+++ b/gsl-1.9/roots/convergence.c
@@ -0,0 +1,87 @@
+/* roots/convergence.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Reid Priedhorsky, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_roots.h>
+
+int
+gsl_root_test_interval (double x_lower, double x_upper, double epsabs, double epsrel)
+{
+ const double abs_lower = fabs(x_lower) ;
+ const double abs_upper = fabs(x_upper) ;
+
+ double min_abs, tolerance;
+
+ if (epsrel < 0.0)
+ GSL_ERROR ("relative tolerance is negative", GSL_EBADTOL);
+
+ if (epsabs < 0.0)
+ GSL_ERROR ("absolute tolerance is negative", GSL_EBADTOL);
+
+ if (x_lower > x_upper)
+ GSL_ERROR ("lower bound larger than upper bound", GSL_EINVAL);
+
+ if ((x_lower > 0.0 && x_upper > 0.0) || (x_lower < 0.0 && x_upper < 0.0))
+ {
+ min_abs = GSL_MIN_DBL(abs_lower, abs_upper) ;
+ }
+ else
+ {
+ min_abs = 0;
+ }
+
+ tolerance = epsabs + epsrel * min_abs ;
+
+ if (fabs(x_upper - x_lower) < tolerance)
+ return GSL_SUCCESS;
+
+ return GSL_CONTINUE ;
+}
+
+int
+gsl_root_test_delta (double x1, double x0, double epsabs, double epsrel)
+{
+ const double tolerance = epsabs + epsrel * fabs(x1) ;
+
+ if (epsrel < 0.0)
+ GSL_ERROR ("relative tolerance is negative", GSL_EBADTOL);
+
+ if (epsabs < 0.0)
+ GSL_ERROR ("absolute tolerance is negative", GSL_EBADTOL);
+
+ if (fabs(x1 - x0) < tolerance || x1 == x0)
+ return GSL_SUCCESS;
+
+ return GSL_CONTINUE ;
+}
+
+int
+gsl_root_test_residual (double f, double epsabs)
+{
+ if (epsabs < 0.0)
+ GSL_ERROR ("absolute tolerance is negative", GSL_EBADTOL);
+
+ if (fabs(f) < epsabs)
+ return GSL_SUCCESS;
+
+ return GSL_CONTINUE ;
+}
+
diff --git a/gsl-1.9/roots/falsepos.c b/gsl-1.9/roots/falsepos.c
new file mode 100644
index 0000000..d264f69
--- /dev/null
+++ b/gsl-1.9/roots/falsepos.c
@@ -0,0 +1,178 @@
+/* roots/falsepos.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Reid Priedhorsky, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* falsepos.c -- falsepos root finding algorithm
+
+ The false position algorithm uses bracketing by linear interpolation.
+
+ If a linear interpolation step would decrease the size of the
+ bracket by less than a bisection step would then the algorithm
+ takes a bisection step instead.
+
+ The last linear interpolation estimate of the root is used. If a
+ bisection step causes it to fall outside the brackets then it is
+ replaced by the bisection estimate (x_upper + x_lower)/2.
+
+*/
+
+#include <config.h>
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <float.h>
+
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_roots.h>
+
+#include "roots.h"
+
+typedef struct
+ {
+ double f_lower, f_upper;
+ }
+falsepos_state_t;
+
+static int falsepos_init (void * vstate, gsl_function * f, double * root, double x_lower, double x_upper);
+static int falsepos_iterate (void * vstate, gsl_function * f, double * root, double * x_lower, double * x_upper);
+
+static int
+falsepos_init (void * vstate, gsl_function * f, double * root, double x_lower, double x_upper)
+{
+ falsepos_state_t * state = (falsepos_state_t *) vstate;
+
+ double f_lower, f_upper ;
+
+ *root = 0.5 * (x_lower + x_upper);
+
+ SAFE_FUNC_CALL (f, x_lower, &f_lower);
+ SAFE_FUNC_CALL (f, x_upper, &f_upper);
+
+ state->f_lower = f_lower;
+ state->f_upper = f_upper;
+
+ if ((f_lower < 0.0 && f_upper < 0.0) || (f_lower > 0.0 && f_upper > 0.0))
+ {
+ GSL_ERROR ("endpoints do not straddle y=0", GSL_EINVAL);
+ }
+
+ return GSL_SUCCESS;
+
+}
+
+static int
+falsepos_iterate (void * vstate, gsl_function * f, double * root, double * x_lower, double * x_upper)
+{
+ falsepos_state_t * state = (falsepos_state_t *) vstate;
+
+ double x_linear, f_linear;
+ double x_bisect, f_bisect;
+
+ double x_left = *x_lower ;
+ double x_right = *x_upper ;
+
+ double f_lower = state->f_lower;
+ double f_upper = state->f_upper;
+
+ double w ;
+
+ if (f_lower == 0.0)
+ {
+ *root = x_left ;
+ *x_upper = x_left;
+ return GSL_SUCCESS;
+ }
+
+ if (f_upper == 0.0)
+ {
+ *root = x_right ;
+ *x_lower = x_right;
+ return GSL_SUCCESS;
+ }
+
+ /* Draw a line between f(*lower_bound) and f(*upper_bound) and
+ note where it crosses the X axis; that's where we will
+ split the interval. */
+
+ x_linear = x_right - (f_upper * (x_left - x_right) / (f_lower - f_upper));
+
+ SAFE_FUNC_CALL (f, x_linear, &f_linear);
+
+ if (f_linear == 0.0)
+ {
+ *root = x_linear;
+ *x_lower = x_linear;
+ *x_upper = x_linear;
+ return GSL_SUCCESS;
+ }
+
+ /* Discard the half of the interval which doesn't contain the root. */
+
+ if ((f_lower > 0.0 && f_linear < 0.0) || (f_lower < 0.0 && f_linear > 0.0))
+ {
+ *root = x_linear ;
+ *x_upper = x_linear;
+ state->f_upper = f_linear;
+ w = x_linear - x_left ;
+ }
+ else
+ {
+ *root = x_linear ;
+ *x_lower = x_linear;
+ state->f_lower = f_linear;
+ w = x_right - x_linear;
+ }
+
+ if (w < 0.5 * (x_right - x_left))
+ {
+ return GSL_SUCCESS ;
+ }
+
+ x_bisect = 0.5 * (x_left + x_right);
+
+ SAFE_FUNC_CALL (f, x_bisect, &f_bisect);
+
+ if ((f_lower > 0.0 && f_bisect < 0.0) || (f_lower < 0.0 && f_bisect > 0.0))
+ {
+ *x_upper = x_bisect;
+ state->f_upper = f_bisect;
+ if (*root > x_bisect)
+ *root = 0.5 * (x_left + x_bisect) ;
+ }
+ else
+ {
+ *x_lower = x_bisect;
+ state->f_lower = f_bisect;
+ if (*root < x_bisect)
+ *root = 0.5 * (x_bisect + x_right) ;
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+static const gsl_root_fsolver_type falsepos_type =
+{"falsepos", /* name */
+ sizeof (falsepos_state_t),
+ &falsepos_init,
+ &falsepos_iterate};
+
+const gsl_root_fsolver_type * gsl_root_fsolver_falsepos = &falsepos_type;
diff --git a/gsl-1.9/roots/fdfsolver.c b/gsl-1.9/roots/fdfsolver.c
new file mode 100644
index 0000000..07d0b27
--- /dev/null
+++ b/gsl-1.9/roots/fdfsolver.c
@@ -0,0 +1,88 @@
+/* roots/fdfsolver.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Reid Priedhorsky, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_roots.h>
+
+gsl_root_fdfsolver *
+gsl_root_fdfsolver_alloc (const gsl_root_fdfsolver_type * T)
+{
+
+ gsl_root_fdfsolver * s = (gsl_root_fdfsolver *) malloc (sizeof (gsl_root_fdfsolver));
+
+ if (s == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for root solver struct",
+ GSL_ENOMEM, 0);
+ };
+
+ s->state = malloc (T->size);
+
+ if (s->state == 0)
+ {
+ free (s); /* exception in constructor, avoid memory leak */
+
+ GSL_ERROR_VAL ("failed to allocate space for root solver state",
+ GSL_ENOMEM, 0);
+ };
+
+ s->type = T ;
+ s->fdf = NULL;
+
+ return s;
+}
+
+int
+gsl_root_fdfsolver_set (gsl_root_fdfsolver * s, gsl_function_fdf * f, double root)
+{
+ s->fdf = f;
+ s->root = root;
+
+ return (s->type->set) (s->state, s->fdf, &(s->root));
+}
+
+int
+gsl_root_fdfsolver_iterate (gsl_root_fdfsolver * s)
+{
+ return (s->type->iterate) (s->state, s->fdf, &(s->root));
+}
+
+void
+gsl_root_fdfsolver_free (gsl_root_fdfsolver * s)
+{
+ free (s->state);
+ free (s);
+}
+
+const char *
+gsl_root_fdfsolver_name (const gsl_root_fdfsolver * s)
+{
+ return s->type->name;
+}
+
+double
+gsl_root_fdfsolver_root (const gsl_root_fdfsolver * s)
+{
+ return s->root;
+}
+
+
diff --git a/gsl-1.9/roots/fsolver.c b/gsl-1.9/roots/fsolver.c
new file mode 100644
index 0000000..039c554
--- /dev/null
+++ b/gsl-1.9/roots/fsolver.c
@@ -0,0 +1,107 @@
+/* roots/fsolver.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Reid Priedhorsky, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_roots.h>
+
+gsl_root_fsolver *
+gsl_root_fsolver_alloc (const gsl_root_fsolver_type * T)
+{
+ gsl_root_fsolver * s = (gsl_root_fsolver *) malloc (sizeof (gsl_root_fsolver));
+
+ if (s == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for root solver struct",
+ GSL_ENOMEM, 0);
+ };
+
+ s->state = malloc (T->size);
+
+ if (s->state == 0)
+ {
+ free (s); /* exception in constructor, avoid memory leak */
+
+ GSL_ERROR_VAL ("failed to allocate space for root solver state",
+ GSL_ENOMEM, 0);
+ };
+
+ s->type = T ;
+ s->function = NULL ;
+
+ return s;
+}
+
+int
+gsl_root_fsolver_set (gsl_root_fsolver * s, gsl_function * f, double x_lower, double x_upper)
+{
+ if (x_lower > x_upper)
+ {
+ GSL_ERROR ("invalid interval (lower > upper)", GSL_EINVAL);
+ }
+
+ s->function = f;
+ s->root = 0.5 * (x_lower + x_upper); /* initial estimate */
+ s->x_lower = x_lower;
+ s->x_upper = x_upper;
+
+ return (s->type->set) (s->state, s->function, &(s->root), x_lower, x_upper);
+}
+
+int
+gsl_root_fsolver_iterate (gsl_root_fsolver * s)
+{
+ return (s->type->iterate) (s->state,
+ s->function, &(s->root),
+ &(s->x_lower), &(s->x_upper));
+}
+
+void
+gsl_root_fsolver_free (gsl_root_fsolver * s)
+{
+ free (s->state);
+ free (s);
+}
+
+const char *
+gsl_root_fsolver_name (const gsl_root_fsolver * s)
+{
+ return s->type->name;
+}
+
+double
+gsl_root_fsolver_root (const gsl_root_fsolver * s)
+{
+ return s->root;
+}
+
+double
+gsl_root_fsolver_x_lower (const gsl_root_fsolver * s)
+{
+ return s->x_lower;
+}
+
+double
+gsl_root_fsolver_x_upper (const gsl_root_fsolver * s)
+{
+ return s->x_upper;
+}
+
diff --git a/gsl-1.9/roots/gsl_roots.h b/gsl-1.9/roots/gsl_roots.h
new file mode 100644
index 0000000..7103418
--- /dev/null
+++ b/gsl-1.9/roots/gsl_roots.h
@@ -0,0 +1,127 @@
+/* roots/gsl_roots.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Reid Priedhorsky, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_ROOTS_H__
+#define __GSL_ROOTS_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_types.h>
+#include <gsl/gsl_math.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+typedef struct
+ {
+ const char *name;
+ size_t size;
+ int (*set) (void *state, gsl_function * f, double * root, double x_lower, double x_upper);
+ int (*iterate) (void *state, gsl_function * f, double * root, double * x_lower, double * x_upper);
+ }
+gsl_root_fsolver_type;
+
+typedef struct
+ {
+ const gsl_root_fsolver_type * type;
+ gsl_function * function ;
+ double root ;
+ double x_lower;
+ double x_upper;
+ void *state;
+ }
+gsl_root_fsolver;
+
+typedef struct
+ {
+ const char *name;
+ size_t size;
+ int (*set) (void *state, gsl_function_fdf * f, double * root);
+ int (*iterate) (void *state, gsl_function_fdf * f, double * root);
+ }
+gsl_root_fdfsolver_type;
+
+typedef struct
+ {
+ const gsl_root_fdfsolver_type * type;
+ gsl_function_fdf * fdf ;
+ double root ;
+ void *state;
+ }
+gsl_root_fdfsolver;
+
+gsl_root_fsolver *
+gsl_root_fsolver_alloc (const gsl_root_fsolver_type * T);
+void gsl_root_fsolver_free (gsl_root_fsolver * s);
+
+int gsl_root_fsolver_set (gsl_root_fsolver * s,
+ gsl_function * f,
+ double x_lower, double x_upper);
+
+int gsl_root_fsolver_iterate (gsl_root_fsolver * s);
+
+const char * gsl_root_fsolver_name (const gsl_root_fsolver * s);
+double gsl_root_fsolver_root (const gsl_root_fsolver * s);
+double gsl_root_fsolver_x_lower (const gsl_root_fsolver * s);
+double gsl_root_fsolver_x_upper (const gsl_root_fsolver * s);
+
+
+gsl_root_fdfsolver *
+gsl_root_fdfsolver_alloc (const gsl_root_fdfsolver_type * T);
+
+int
+gsl_root_fdfsolver_set (gsl_root_fdfsolver * s,
+ gsl_function_fdf * fdf, double root);
+
+int
+gsl_root_fdfsolver_iterate (gsl_root_fdfsolver * s);
+
+void
+gsl_root_fdfsolver_free (gsl_root_fdfsolver * s);
+
+const char * gsl_root_fdfsolver_name (const gsl_root_fdfsolver * s);
+double gsl_root_fdfsolver_root (const gsl_root_fdfsolver * s);
+
+int
+gsl_root_test_interval (double x_lower, double x_upper, double epsabs, double epsrel);
+
+int
+gsl_root_test_residual (double f, double epsabs);
+
+int
+gsl_root_test_delta (double x1, double x0, double epsabs, double epsrel);
+
+GSL_VAR const gsl_root_fsolver_type * gsl_root_fsolver_bisection;
+GSL_VAR const gsl_root_fsolver_type * gsl_root_fsolver_brent;
+GSL_VAR const gsl_root_fsolver_type * gsl_root_fsolver_falsepos;
+GSL_VAR const gsl_root_fdfsolver_type * gsl_root_fdfsolver_newton;
+GSL_VAR const gsl_root_fdfsolver_type * gsl_root_fdfsolver_secant;
+GSL_VAR const gsl_root_fdfsolver_type * gsl_root_fdfsolver_steffenson;
+
+__END_DECLS
+
+#endif /* __GSL_ROOTS_H__ */
diff --git a/gsl-1.9/roots/newton.c b/gsl-1.9/roots/newton.c
new file mode 100644
index 0000000..09a4351
--- /dev/null
+++ b/gsl-1.9/roots/newton.c
@@ -0,0 +1,106 @@
+/* roots/newton.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Reid Priedhorsky, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* newton.c -- newton root finding algorithm
+
+ This is the classical Newton-Raphson iteration.
+
+ x[i+1] = x[i] - f(x[i])/f'(x[i])
+
+*/
+
+#include <config.h>
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <float.h>
+
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_roots.h>
+
+#include "roots.h"
+
+typedef struct
+ {
+ double f, df;
+ }
+newton_state_t;
+
+static int newton_init (void * vstate, gsl_function_fdf * fdf, double * root);
+static int newton_iterate (void * vstate, gsl_function_fdf * fdf, double * root);
+
+static int
+newton_init (void * vstate, gsl_function_fdf * fdf, double * root)
+{
+ newton_state_t * state = (newton_state_t *) vstate;
+
+ const double x = *root ;
+
+ state->f = GSL_FN_FDF_EVAL_F (fdf, x);
+ state->df = GSL_FN_FDF_EVAL_DF (fdf, x) ;
+
+ return GSL_SUCCESS;
+
+}
+
+static int
+newton_iterate (void * vstate, gsl_function_fdf * fdf, double * root)
+{
+ newton_state_t * state = (newton_state_t *) vstate;
+
+ double root_new, f_new, df_new;
+
+ if (state->df == 0.0)
+ {
+ GSL_ERROR("derivative is zero", GSL_EZERODIV);
+ }
+
+ root_new = *root - (state->f / state->df);
+
+ *root = root_new ;
+
+ GSL_FN_FDF_EVAL_F_DF(fdf, root_new, &f_new, &df_new);
+
+ state->f = f_new ;
+ state->df = df_new ;
+
+ if (!finite(f_new))
+ {
+ GSL_ERROR ("function value is not finite", GSL_EBADFUNC);
+ }
+
+ if (!finite (df_new))
+ {
+ GSL_ERROR ("derivative value is not finite", GSL_EBADFUNC);
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+static const gsl_root_fdfsolver_type newton_type =
+{"newton", /* name */
+ sizeof (newton_state_t),
+ &newton_init,
+ &newton_iterate};
+
+const gsl_root_fdfsolver_type * gsl_root_fdfsolver_newton = &newton_type;
diff --git a/gsl-1.9/roots/roots.h b/gsl-1.9/roots/roots.h
new file mode 100644
index 0000000..7b6245e
--- /dev/null
+++ b/gsl-1.9/roots/roots.h
@@ -0,0 +1,37 @@
+/* roots/roots.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Reid Priedhorsky, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* roots.h -- declarations for internal root finding and RF support stuff. */
+
+#ifndef __ROOTS_H__
+#define __ROOTS_H__
+
+/* Call the pointed-to function with argument x, put its result in y, and
+ return an error if the function value is Inf/Nan. */
+
+#define SAFE_FUNC_CALL(f, x, yp) \
+do { \
+ *yp = GSL_FN_EVAL(f,x); \
+ if (!finite(*yp)) \
+ GSL_ERROR("function value is not finite", GSL_EBADFUNC); \
+} while (0)
+
+#endif /* __ROOTS_H__ */
+
+
diff --git a/gsl-1.9/roots/secant.c b/gsl-1.9/roots/secant.c
new file mode 100644
index 0000000..c44eea5
--- /dev/null
+++ b/gsl-1.9/roots/secant.c
@@ -0,0 +1,117 @@
+/* roots/secant.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Reid Priedhorsky, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* secant.c -- secant root finding algorithm
+
+ The secant algorithm is a variant of the Newton algorithm with the
+ derivative term replaced by a numerical estimate from the last two
+ function evaluations.
+
+ x[i+1] = x[i] - f(x[i]) / f'_est
+
+ where f'_est = (f(x[i]) - f(x[i-1])) / (x[i] - x[i-1])
+
+ The exact derivative is used for the initial value of f'_est.
+
+*/
+
+#include <config.h>
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <float.h>
+
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_roots.h>
+
+#include "roots.h"
+
+typedef struct
+ {
+ double f;
+ double df;
+ }
+secant_state_t;
+
+static int secant_init (void * vstate, gsl_function_fdf * fdf, double * root);
+static int secant_iterate (void * vstate, gsl_function_fdf * fdf, double * root);
+
+static int
+secant_init (void * vstate, gsl_function_fdf * fdf, double * root)
+{
+ secant_state_t * state = (secant_state_t *) vstate;
+
+ const double x = *root;
+
+ GSL_FN_FDF_EVAL_F_DF (fdf, x, &(state->f), &(state->df));
+
+ return GSL_SUCCESS;
+
+}
+
+static int
+secant_iterate (void * vstate, gsl_function_fdf * fdf, double * root)
+{
+ secant_state_t * state = (secant_state_t *) vstate;
+
+ const double x = *root ;
+ const double f = state->f;
+ const double df = state->df;
+
+ double x_new, f_new, df_new;
+
+ if (state->df == 0.0)
+ {
+ GSL_ERROR("derivative is zero", GSL_EZERODIV);
+ }
+
+ x_new = x - (f / df);
+
+ f_new = GSL_FN_FDF_EVAL_F(fdf, x_new) ;
+ df_new = (f_new - f) / (x_new - x) ;
+
+ *root = x_new ;
+
+ state->f = f_new ;
+ state->df = df_new ;
+
+ if (!finite (f_new))
+ {
+ GSL_ERROR ("function value is not finite", GSL_EBADFUNC);
+ }
+
+ if (!finite (df_new))
+ {
+ GSL_ERROR ("derivative value is not finite", GSL_EBADFUNC);
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+static const gsl_root_fdfsolver_type secant_type =
+{"secant", /* name */
+ sizeof (secant_state_t),
+ &secant_init,
+ &secant_iterate};
+
+const gsl_root_fdfsolver_type * gsl_root_fdfsolver_secant = &secant_type;
diff --git a/gsl-1.9/roots/steffenson.c b/gsl-1.9/roots/steffenson.c
new file mode 100644
index 0000000..e4169f6
--- /dev/null
+++ b/gsl-1.9/roots/steffenson.c
@@ -0,0 +1,144 @@
+/* roots/steffenson.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Reid Priedhorsky, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* steffenson.c -- steffenson root finding algorithm
+
+ This is Newton's method with an Aitken "delta-squared"
+ acceleration of the iterates. This can improve the convergence on
+ multiple roots where the ordinary Newton algorithm is slow.
+
+ x[i+1] = x[i] - f(x[i]) / f'(x[i])
+
+ x_accelerated[i] = x[i] - (x[i+1] - x[i])**2 / (x[i+2] - 2*x[i+1] + x[i])
+
+ We can only use the accelerated estimate after three iterations,
+ and use the unaccelerated value until then.
+
+ */
+
+#include <config.h>
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <float.h>
+
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_roots.h>
+
+#include "roots.h"
+
+typedef struct
+ {
+ double f, df;
+ double x;
+ double x_1;
+ double x_2;
+ int count;
+ }
+steffenson_state_t;
+
+static int steffenson_init (void * vstate, gsl_function_fdf * fdf, double * root);
+static int steffenson_iterate (void * vstate, gsl_function_fdf * fdf, double * root);
+
+static int
+steffenson_init (void * vstate, gsl_function_fdf * fdf, double * root)
+{
+ steffenson_state_t * state = (steffenson_state_t *) vstate;
+
+ const double x = *root ;
+
+ state->f = GSL_FN_FDF_EVAL_F (fdf, x);
+ state->df = GSL_FN_FDF_EVAL_DF (fdf, x) ;
+
+ state->x = x;
+ state->x_1 = 0.0;
+ state->x_2 = 0.0;
+
+ state->count = 1;
+
+ return GSL_SUCCESS;
+
+}
+
+static int
+steffenson_iterate (void * vstate, gsl_function_fdf * fdf, double * root)
+{
+ steffenson_state_t * state = (steffenson_state_t *) vstate;
+
+ double x_new, f_new, df_new;
+
+ double x_1 = state->x_1 ;
+ double x = state->x ;
+
+ if (state->df == 0.0)
+ {
+ GSL_ERROR("derivative is zero", GSL_EZERODIV);
+ }
+
+ x_new = x - (state->f / state->df);
+
+ GSL_FN_FDF_EVAL_F_DF(fdf, x_new, &f_new, &df_new);
+
+ state->x_2 = x_1 ;
+ state->x_1 = x ;
+ state->x = x_new;
+
+ state->f = f_new ;
+ state->df = df_new ;
+
+ if (!finite (f_new))
+ {
+ GSL_ERROR ("function value is not finite", GSL_EBADFUNC);
+ }
+
+ if (state->count < 3)
+ {
+ *root = x_new ;
+ state->count++ ;
+ }
+ else
+ {
+ double u = (x - x_1) ;
+ double v = (x_new - 2 * x + x_1);
+
+ if (v == 0)
+ *root = x_new; /* avoid division by zero */
+ else
+ *root = x_1 - u * u / v ; /* accelerated value */
+ }
+
+ if (!finite (df_new))
+ {
+ GSL_ERROR ("derivative value is not finite", GSL_EBADFUNC);
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+static const gsl_root_fdfsolver_type steffenson_type =
+{"steffenson", /* name */
+ sizeof (steffenson_state_t),
+ &steffenson_init,
+ &steffenson_iterate};
+
+const gsl_root_fdfsolver_type * gsl_root_fdfsolver_steffenson = &steffenson_type;
diff --git a/gsl-1.9/roots/test.c b/gsl-1.9/roots/test.c
new file mode 100644
index 0000000..4e9b94b
--- /dev/null
+++ b/gsl-1.9/roots/test.c
@@ -0,0 +1,315 @@
+/* roots/test.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Reid Priedhorsky, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_roots.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_ieee_utils.h>
+
+#include "roots.h"
+#include "test.h"
+
+/* stopping parameters */
+const double EPSREL = (10 * GSL_DBL_EPSILON);
+const double EPSABS = (10 * GSL_DBL_EPSILON);
+const unsigned int MAX_ITERATIONS = 150;
+
+void my_error_handler (const char *reason, const char *file,
+ int line, int err);
+
+#define WITHIN_TOL(a, b, epsrel, epsabs) \
+ ((fabs((a) - (b)) < (epsrel) * GSL_MIN(fabs(a), fabs(b)) + (epsabs)))
+
+int
+main (void)
+{
+ gsl_function F_sin, F_cos, F_func1, F_func2, F_func3, F_func4,
+ F_func5, F_func6;
+
+ gsl_function_fdf FDF_sin, FDF_cos, FDF_func1, FDF_func2, FDF_func3, FDF_func4,
+ FDF_func5, FDF_func6;
+
+ const gsl_root_fsolver_type * fsolver[4] ;
+ const gsl_root_fdfsolver_type * fdfsolver[4] ;
+
+ const gsl_root_fsolver_type ** T;
+ const gsl_root_fdfsolver_type ** S;
+
+ gsl_ieee_env_setup();
+
+ fsolver[0] = gsl_root_fsolver_bisection;
+ fsolver[1] = gsl_root_fsolver_brent;
+ fsolver[2] = gsl_root_fsolver_falsepos;
+ fsolver[3] = 0;
+
+ fdfsolver[0] = gsl_root_fdfsolver_newton;
+ fdfsolver[1] = gsl_root_fdfsolver_secant;
+ fdfsolver[2] = gsl_root_fdfsolver_steffenson;
+ fdfsolver[3] = 0;
+
+ F_sin = create_function (sin_f) ;
+ F_cos = create_function (cos_f) ;
+ F_func1 = create_function (func1) ;
+ F_func2 = create_function (func2) ;
+ F_func3 = create_function (func3) ;
+ F_func4 = create_function (func4) ;
+ F_func5 = create_function (func5) ;
+ F_func6 = create_function (func6) ;
+
+ FDF_sin = create_fdf (sin_f, sin_df, sin_fdf) ;
+ FDF_cos = create_fdf (cos_f, cos_df, cos_fdf) ;
+ FDF_func1 = create_fdf (func1, func1_df, func1_fdf) ;
+ FDF_func2 = create_fdf (func2, func2_df, func2_fdf) ;
+ FDF_func3 = create_fdf (func3, func3_df, func3_fdf) ;
+ FDF_func4 = create_fdf (func4, func4_df, func4_fdf) ;
+ FDF_func5 = create_fdf (func5, func5_df, func5_fdf) ;
+ FDF_func6 = create_fdf (func6, func6_df, func6_fdf) ;
+
+ gsl_set_error_handler (&my_error_handler);
+
+ for (T = fsolver ; *T != 0 ; T++)
+ {
+ test_f (*T, "sin(x) [3, 4]", &F_sin, 3.0, 4.0, M_PI);
+ test_f (*T, "sin(x) [-4, -3]", &F_sin, -4.0, -3.0, -M_PI);
+ test_f (*T, "sin(x) [-1/3, 1]", &F_sin, -1.0 / 3.0, 1.0, 0.0);
+ test_f (*T, "cos(x) [0, 3]", &F_cos, 0.0, 3.0, M_PI / 2.0);
+ test_f (*T, "cos(x) [-3, 0]", &F_cos, -3.0, 0.0, -M_PI / 2.0);
+ test_f (*T, "x^20 - 1 [0.1, 2]", &F_func1, 0.1, 2.0, 1.0);
+ test_f (*T, "sqrt(|x|)*sgn(x)", &F_func2, -1.0 / 3.0, 1.0, 0.0);
+ test_f (*T, "x^2 - 1e-8 [0, 1]", &F_func3, 0.0, 1.0, sqrt (1e-8));
+ test_f (*T, "x exp(-x) [-1/3, 2]", &F_func4, -1.0 / 3.0, 2.0, 0.0);
+ test_f (*T, "(x - 1)^7 [0.9995, 1.0002]", &F_func6, 0.9995, 1.0002, 1.0);
+
+ test_f_e (*T, "invalid range check [4, 0]", &F_sin, 4.0, 0.0, M_PI);
+ test_f_e (*T, "invalid range check [1, 1]", &F_sin, 1.0, 1.0, M_PI);
+ test_f_e (*T, "invalid range check [0.1, 0.2]", &F_sin, 0.1, 0.2, M_PI);
+ }
+
+ for (S = fdfsolver ; *S != 0 ; S++)
+ {
+ test_fdf (*S,"sin(x) {3.4}", &FDF_sin, 3.4, M_PI);
+ test_fdf (*S,"sin(x) {-3.3}", &FDF_sin, -3.3, -M_PI);
+ test_fdf (*S,"sin(x) {0.5}", &FDF_sin, 0.5, 0.0);
+ test_fdf (*S,"cos(x) {0.6}", &FDF_cos, 0.6, M_PI / 2.0);
+ test_fdf (*S,"cos(x) {-2.5}", &FDF_cos, -2.5, -M_PI / 2.0);
+ test_fdf (*S,"x^{20} - 1 {0.9}", &FDF_func1, 0.9, 1.0);
+ test_fdf (*S,"x^{20} - 1 {1.1}", &FDF_func1, 1.1, 1.0);
+ test_fdf (*S,"sqrt(|x|)*sgn(x) {1.001}", &FDF_func2, 0.001, 0.0);
+ test_fdf (*S,"x^2 - 1e-8 {1}", &FDF_func3, 1.0, sqrt (1e-8));
+ test_fdf (*S,"x exp(-x) {-2}", &FDF_func4, -2.0, 0.0);
+ test_fdf_e (*S,"max iterations x -> +Inf, x exp(-x) {2}", &FDF_func4, 2.0, 0.0);
+ test_fdf_e (*S,"max iterations x -> -Inf, 1/(1 + exp(-x)) {0}", &FDF_func5, 0.0, 0.0);
+ }
+
+ test_fdf (gsl_root_fdfsolver_steffenson,
+ "(x - 1)^7 {0.9}", &FDF_func6, 0.9, 1.0);
+
+ /* now summarize the results */
+
+ exit (gsl_test_summary ());
+}
+
+
+/* Using gsl_root_bisection, find the root of the function pointed to by f,
+ using the interval [lower_bound, upper_bound]. Check if f succeeded and
+ that it was accurate enough. */
+
+void
+test_f (const gsl_root_fsolver_type * T, const char * description, gsl_function *f,
+ double lower_bound, double upper_bound, double correct_root)
+{
+ int status;
+ size_t iterations = 0;
+ double r, a, b;
+ double x_lower, x_upper;
+ gsl_root_fsolver * s;
+
+ x_lower = lower_bound;
+ x_upper = upper_bound;
+
+ s = gsl_root_fsolver_alloc(T);
+ gsl_root_fsolver_set(s, f, x_lower, x_upper) ;
+
+ do
+ {
+ iterations++ ;
+
+ gsl_root_fsolver_iterate (s);
+
+ r = gsl_root_fsolver_root(s);
+
+ a = gsl_root_fsolver_x_lower(s);
+ b = gsl_root_fsolver_x_upper(s);
+
+ if (a > b)
+ gsl_test (GSL_FAILURE, "interval is invalid (%g,%g)", a, b);
+
+ if (r < a || r > b)
+ gsl_test (GSL_FAILURE, "r lies outside interval %g (%g,%g)", r, a, b);
+
+ status = gsl_root_test_interval (a,b, EPSABS, EPSREL);
+ }
+ while (status == GSL_CONTINUE && iterations < MAX_ITERATIONS);
+
+
+ gsl_test (status, "%s, %s (%g obs vs %g expected) ",
+ gsl_root_fsolver_name(s), description,
+ gsl_root_fsolver_root(s), correct_root);
+
+ if (iterations == MAX_ITERATIONS)
+ {
+ gsl_test (GSL_FAILURE, "exceeded maximum number of iterations");
+ }
+
+ /* check the validity of the returned result */
+
+ if (!WITHIN_TOL (r, correct_root, EPSREL, EPSABS))
+ {
+ gsl_test (GSL_FAILURE, "incorrect precision (%g obs vs %g expected)",
+ r, correct_root);
+
+ }
+
+ gsl_root_fsolver_free(s);
+}
+
+void
+test_f_e (const gsl_root_fsolver_type * T,
+ const char * description, gsl_function *f,
+ double lower_bound, double upper_bound, double correct_root)
+{
+ int status;
+ size_t iterations = 0;
+ double x_lower, x_upper;
+ gsl_root_fsolver * s;
+
+ x_lower = lower_bound;
+ x_upper = upper_bound;
+
+ s = gsl_root_fsolver_alloc(T);
+ status = gsl_root_fsolver_set(s, f, x_lower, x_upper) ;
+
+ gsl_test (status != GSL_EINVAL, "%s (set), %s", T->name, description);
+
+ if (status == GSL_EINVAL)
+ {
+ gsl_root_fsolver_free(s);
+ return ;
+ }
+
+ do
+ {
+ iterations++ ;
+ gsl_root_fsolver_iterate (s);
+ x_lower = gsl_root_fsolver_x_lower(s);
+ x_upper = gsl_root_fsolver_x_lower(s);
+ status = gsl_root_test_interval (x_lower, x_upper,
+ EPSABS, EPSREL);
+ }
+ while (status == GSL_CONTINUE && iterations < MAX_ITERATIONS);
+
+ gsl_test (!status, "%s, %s", gsl_root_fsolver_name(s), description,
+ gsl_root_fsolver_root(s) - correct_root);
+
+ gsl_root_fsolver_free(s);
+}
+
+void
+test_fdf (const gsl_root_fdfsolver_type * T, const char * description,
+ gsl_function_fdf *fdf, double root, double correct_root)
+{
+ int status;
+ size_t iterations = 0;
+ double prev = 0 ;
+
+ gsl_root_fdfsolver * s = gsl_root_fdfsolver_alloc(T);
+ gsl_root_fdfsolver_set (s, fdf, root) ;
+
+ do
+ {
+ iterations++ ;
+ prev = gsl_root_fdfsolver_root(s);
+ gsl_root_fdfsolver_iterate (s);
+ status = gsl_root_test_delta(gsl_root_fdfsolver_root(s), prev,
+ EPSABS, EPSREL);
+ }
+ while (status == GSL_CONTINUE && iterations < MAX_ITERATIONS);
+
+ gsl_test (status, "%s, %s (%g obs vs %g expected) ",
+ gsl_root_fdfsolver_name(s), description,
+ gsl_root_fdfsolver_root(s), correct_root);
+
+ if (iterations == MAX_ITERATIONS)
+ {
+ gsl_test (GSL_FAILURE, "exceeded maximum number of iterations");
+ }
+
+ /* check the validity of the returned result */
+
+ if (!WITHIN_TOL (gsl_root_fdfsolver_root(s), correct_root,
+ EPSREL, EPSABS))
+ {
+ gsl_test (GSL_FAILURE, "incorrect precision (%g obs vs %g expected)",
+ gsl_root_fdfsolver_root(s), correct_root);
+
+ }
+ gsl_root_fdfsolver_free(s);
+}
+
+void
+test_fdf_e (const gsl_root_fdfsolver_type * T,
+ const char * description, gsl_function_fdf *fdf,
+ double root, double correct_root)
+{
+ int status;
+ size_t iterations = 0;
+ double prev = 0 ;
+
+ gsl_root_fdfsolver * s = gsl_root_fdfsolver_alloc(T);
+ status = gsl_root_fdfsolver_set (s, fdf, root) ;
+
+ gsl_test (status, "%s (set), %s", T->name, description);
+
+ do
+ {
+ iterations++ ;
+ prev = gsl_root_fdfsolver_root(s);
+ gsl_root_fdfsolver_iterate (s);
+ status = gsl_root_test_delta(gsl_root_fdfsolver_root(s), prev,
+ EPSABS, EPSREL);
+ }
+ while (status == GSL_CONTINUE && iterations < MAX_ITERATIONS);
+
+ gsl_test (!status, "%s, %s", gsl_root_fdfsolver_name(s),
+ description, gsl_root_fdfsolver_root(s) - correct_root);
+ gsl_root_fdfsolver_free(s);
+}
+
+void
+my_error_handler (const char *reason, const char *file, int line, int err)
+{
+ if (0)
+ printf ("(caught [%s:%d: %s (%d)])\n", file, line, reason, err);
+}
+
+
+
diff --git a/gsl-1.9/roots/test.h b/gsl-1.9/roots/test.h
new file mode 100644
index 0000000..c00febf
--- /dev/null
+++ b/gsl-1.9/roots/test.h
@@ -0,0 +1,129 @@
+/* roots/test.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Reid Priedhorsky, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+gsl_function create_function (double (*f)(double, void *)) ;
+gsl_function_fdf create_fdf (double (*f)(double, void *),
+ double (*df)(double, void *),
+ void (*fdf)(double, void *, double *, double *));
+
+void
+ test_macros (void);
+
+void
+ test_roots (void);
+
+void
+ test_poly (void);
+
+void
+test_f (const gsl_root_fsolver_type * T,
+ const char * description, gsl_function *f,
+ double lower_bound, double upper_bound, double correct_root);
+
+void
+test_f_e (const gsl_root_fsolver_type * T, const char * description,
+ gsl_function *f,
+ double lower_bound, double upper_bound, double correct_root);
+
+void
+test_fdf (const gsl_root_fdfsolver_type * T, const char * description,
+ gsl_function_fdf *fdf, double root, double correct_root);
+
+void
+test_fdf_e (const gsl_root_fdfsolver_type * T, const char * description,
+ gsl_function_fdf *fdf, double root, double correct_root);
+
+
+void
+ usage (void);
+
+void
+ error_handler (const char *reason, const char *file, int line);
+
+double
+ func1 (double x, void * p);
+
+double
+ func1_df (double x, void * p);
+
+void
+ func1_fdf (double x, void * p, double *y, double *yprime);
+
+double
+ func2 (double x, void * p);
+
+double
+ func2_df (double x, void * p);
+
+void
+ func2_fdf (double x, void * p, double *y, double *yprime);
+
+double
+ func3 (double x, void * p);
+
+double
+ func3_df (double x, void * p);
+
+void
+ func3_fdf (double x, void * p, double *y, double *yprime);
+
+double
+ func4 (double x, void * p);
+
+double
+ func4_df (double x, void * p);
+
+void
+ func4_fdf (double x, void * p, double *y, double *yprime);
+
+double
+ func5 (double x, void * p);
+
+double
+ func5_df (double x, void * p);
+
+void
+ func5_fdf (double x, void * p, double *y, double *yprime);
+
+double
+ func6 (double x, void * p);
+
+double
+ func6_df (double x, void * p);
+
+void
+ func6_fdf (double x, void * p, double *y, double *yprime);
+
+double
+ sin_f (double x, void * p);
+
+double
+ sin_df (double x, void * p);
+
+void
+ sin_fdf (double x, void * p, double *y, double *yprime);
+
+double
+ cos_f (double x, void * p);
+
+double
+ cos_df (double x, void * p);
+
+void
+ cos_fdf (double x, void * p, double *y, double *yprime);
diff --git a/gsl-1.9/roots/test_funcs.c b/gsl-1.9/roots/test_funcs.c
new file mode 100644
index 0000000..b9773a3
--- /dev/null
+++ b/gsl-1.9/roots/test_funcs.c
@@ -0,0 +1,229 @@
+/* roots/test_funcs.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Reid Priedhorsky, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_roots.h>
+
+#include "test.h"
+
+gsl_function create_function (double (*f)(double, void *))
+{
+ gsl_function F ;
+ F.function = f;
+ F.params = 0;
+ return F ;
+}
+
+gsl_function_fdf create_fdf (double (*f)(double, void *),
+ double (*df)(double, void *),
+ void (*fdf)(double, void *, double *, double *))
+{
+ gsl_function_fdf FDF ;
+ FDF.f = f ;
+ FDF.df = df ;
+ FDF.fdf = fdf ;
+ FDF.params = 0 ;
+ return FDF ;
+}
+
+/* f(x) = x^{20} - 1 */
+/* f'(x) = 20x^{19} */
+/* zero at x = 1 or -1 */
+
+double
+func1 (double x, void *p)
+{
+ return pow (x, 20.0) - 1;
+}
+
+double
+func1_df (double x, void * p)
+{
+ return 20.0 * pow (x, 19.0);
+}
+
+void
+func1_fdf (double x, void * p, double *y, double *yprime)
+{
+ *y = func1 (x, p);
+ *yprime = 20.0 * pow (x, 19.0);
+}
+
+/* f(x) = sqrt(abs(x))*sgn(x) */
+/* f'(x) = 1 / sqrt(abs(x) */
+/* zero at x = 0 */
+double
+func2 (double x, void * p)
+{
+ double delta;
+
+ if (x > 0)
+ delta = 1.0;
+ else if (x < 0)
+ delta = -1.0;
+ else
+ delta = 0.0;
+
+ return sqrt (fabs (x)) * delta;
+}
+
+double
+func2_df (double x, void * p)
+{
+ return 1 / sqrt (fabs (x));
+}
+
+void
+func2_fdf (double x, void * p, double *y, double *yprime)
+{
+ *y = func2 (x, p);
+ *yprime = 1 / sqrt (fabs (x));
+}
+
+
+/* f(x) = x^2 - 1e-8 */
+/* f'(x) = 2x */
+/* zero at x = sqrt(1e-8) or -sqrt(1e-8) */
+double
+func3 (double x, void * p)
+{
+ return pow (x, 2.0) - 1e-8;
+}
+
+double
+func3_df (double x, void * p)
+{
+ return 2 * x;
+}
+
+void
+func3_fdf (double x, void * p, double *y, double *yprime)
+{
+ *y = func3 (x, p);
+ *yprime = 2 * x;
+}
+
+/* f(x) = x exp(-x) */
+/* f'(x) = exp(-x) - x exp(-x) */
+/* zero at x = 0 */
+double
+func4 (double x, void * p)
+{
+ return x * exp (-x);
+}
+
+double
+func4_df (double x, void * p)
+{
+ return exp (-x) - x * exp (-x);
+}
+
+void
+func4_fdf (double x, void * p, double *y, double *yprime)
+{
+ *y = func4 (x, p);
+ *yprime = exp (-x) - x * exp (-x);
+}
+
+/* f(x) = 1/(1+exp(x)) */
+/* f'(x) = -exp(x) / (1 + exp(x))^2 */
+/* no roots! */
+double
+func5 (double x, void * p)
+{
+ return 1 / (1 + exp (x));
+}
+
+double
+func5_df (double x, void * p)
+{
+ return -exp (x) / pow (1 + exp (x), 2.0);
+}
+
+void
+func5_fdf (double x, void * p, double *y, double *yprime)
+{
+ *y = func5 (x, p);
+ *yprime = -exp (x) / pow (1 + exp (x), 2.0);
+}
+
+/* f(x) = (x - 1)^7 */
+/* f'(x) = 7 * (x - 1)^6 */
+/* zero at x = 1 */
+double
+func6 (double x, void * p)
+{
+ return pow (x - 1, 7.0);
+}
+
+double
+func6_df (double x, void * p)
+{
+ return 7.0 * pow (x - 1, 6.0);
+}
+
+void
+func6_fdf (double x, void * p, double *y, double *yprime)
+{
+ *y = func6 (x, p);
+ *yprime = 7.0 * pow (x - 1, 6.0);
+}
+
+/* sin(x) packaged up nicely. */
+double
+sin_f (double x, void * p)
+{
+ return sin (x);
+}
+
+double
+sin_df (double x, void * p)
+{
+ return cos (x);
+}
+
+void
+sin_fdf (double x, void * p, double *y, double *yprime)
+{
+ *y = sin (x);
+ *yprime = cos (x);
+}
+
+/* cos(x) packaged up nicely. */
+double
+cos_f (double x, void * p)
+{
+ return cos (x);
+}
+
+double
+cos_df (double x, void * p)
+{
+ return -sin (x);
+}
+
+void
+cos_fdf (double x, void * p, double *y, double *yprime)
+{
+ *y = cos (x);
+ *yprime = -sin (x);
+}
diff --git a/gsl-1.9/siman/ChangeLog b/gsl-1.9/siman/ChangeLog
new file mode 100644
index 0000000..4c47769
--- /dev/null
+++ b/gsl-1.9/siman/ChangeLog
@@ -0,0 +1,120 @@
+2006-03-08 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c (square): removed inline since it causes problems with
+ some compilers
+
+2005-11-14 Brian Gough <bjg@network-theory.co.uk>
+
+ * siman.c (safe_exp): added a safe_exp function to avoid underflow
+ for large uphill steps
+
+2003-03-31 Brian Gough <bjg@network-theory.co.uk>
+
+ * siman.c (gsl_siman_solve): avoid reevaluation for best_E
+ (gsl_siman_solve): loop over param.iters_fixed_T not
+ params.n_tries
+ (gsl_siman_solve): initialise energy at start
+
+Sat Aug 3 20:32:38 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * siman.c (gsl_siman_solve): fix acceptance criterion to match
+ documentation (Peter S. Christopher)
+
+Thu Jun 13 20:57:00 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * siman.c (gsl_siman_solve): keep track of the best result
+
+2002-02-07 Mark Galassi <rosalia@galassi.org>
+
+ * siman.c (gsl_siman_solve): bug fix in the destructor for x and
+ new_x which was being called on &x and &new_x instead of x and
+ new_x; thanks to Karsten Howes <karsten@videotron.ca>
+
+Thu Jul 12 21:50:07 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_siman.h: changed renamed gsl_Efunc_t to gsl_siman_Efunc_t,
+ in accordance with namespace conventions
+
+2000-12-15 Mark Galassi <rosalia@galassi.org>
+
+ * siman.c (gsl_siman_solve): reversed a small change I had made
+ earlier and went back to taking Boltzmann-conditional steps when
+ the new energy is equal to the previous one. This allows you to
+ move around if you are stuck on a plateau.
+
+ * gsl_siman.h, siman.c, siman_test.c, siman_tsp.c, test.c: changed
+ the siman_solve API to allow for more general search spaces. The
+ problem was that we assumed that points in the search space were
+ data structures that were allocated in continguous memory, so they
+ could not be linked structures. I replaced the malloc(), memcpy()
+ and free() calls with copy_constructor(), copyfunc() and
+ copy_destructor() functions. The user passes these functions,
+ which means that siman_solve() now takes three more arguments of
+ type gsl_siman_copy_t, gsl_siman_copy_construct_t and
+ gsl_siman_destroy_t. If these arguments are NULL (and all three
+ of them have to be NULL together), the traditional memcpy()
+ approach is used.
+
+1999-02-14 Mark Galassi <rosalia@cygnus.com>
+
+ * minor fixes.
+
+Tue Nov 17 17:22:14 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * added #include <config.h> to all top-level source files
+
+Sun Nov 8 20:40:28 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * siman_tsp.c: clean up for make strict
+
+1998-11-06 <bjg@ancho.lanl.gov>
+
+ * test.c: added prototype for memcpy using #include <string.h>
+
+ * siman_test.c: added prototype for memcpy using #include <string.h>
+
+Wed Oct 28 15:06:58 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * siman.c: added #include <string.h> for memcpy
+
+Thu Aug 20 12:22:28 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * siman.c: use (char *) judiciously to avoid warnings about void
+ pointer arithmetic (see randist/shuffle.c for similar examples)
+
+ * siman_test.c: perform several tests, using the exact answer as
+ the comparison value, rather than checking for stationarity.
+
+Sun Jun 28 14:11:04 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * Converted to work with rng-style random number generators
+
+ * gsl_siman.h: gsl_siman_step_t type functions now take a gsl_rng
+ random number generator as their first argument
+
+ * siman.c (gsl_siman_solve): Now takes a gsl_rng random number
+ generator as the first argument
+
+Fri Jun 19 11:17:24 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * siman.c (gsl_siman_solve_many): changed the variable 'throw' to
+ 'u' (for uniform-random-number) so that we can compile with c++
+ where throw is a reserved word.
+
+Sat May 23 13:59:55 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * siman.c: made the solving functions deterministic by removing
+ the random seed, gsl_ran_seed(time(0L)). When the function is
+ non-deterministic it is hard to debug and test (about 1 time in 20
+ the test would fail due to the randomness). We can let the user do
+ the seeding if they need that.
+
+1998-02-09 Mark Galassi <rosalia@nis.lanl.gov>
+
+ * siman_test_driver.sh (LAST_ENERGY): fixed a typo; the tests now
+ report well when they converge.
+
+1998-01-30 Mark Galassi <rosalia@cygnus.com>
+
+ * siman_test_driver.sh, Makefile.am (TESTS): added a test driver
+ so that now "make check" does something interesting.
diff --git a/gsl-1.9/siman/Makefile.am b/gsl-1.9/siman/Makefile.am
new file mode 100644
index 0000000..352ee4f
--- /dev/null
+++ b/gsl-1.9/siman/Makefile.am
@@ -0,0 +1,21 @@
+## Process this file with automake to produce Makefile.in
+
+check_PROGRAMS = test
+noinst_PROGRAMS = siman_tsp
+noinst_LTLIBRARIES = libgslsiman.la
+
+TESTS = $(check_PROGRAMS)
+EXTRA_DIST = siman_test_driver.sh
+
+test_SOURCES = test.c
+test_LDADD = libgslsiman.la ../rng/libgslrng.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+
+siman_tsp_SOURCES = siman_tsp.c
+siman_tsp_LDADD = libgslsiman.la ../rng/libgslrng.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../sys/libgslsys.la ../utils/libutils.la
+
+CLEANFILES = siman_test.out
+
+libgslsiman_la_SOURCES = siman.c
+pkginclude_HEADERS = gsl_siman.h
+
+INCLUDES= -I$(top_builddir)
diff --git a/gsl-1.9/siman/Makefile.in b/gsl-1.9/siman/Makefile.in
new file mode 100644
index 0000000..cda48c5
--- /dev/null
+++ b/gsl-1.9/siman/Makefile.in
@@ -0,0 +1,568 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = test$(EXEEXT)
+noinst_PROGRAMS = siman_tsp$(EXEEXT)
+subdir = siman
+DIST_COMMON = $(pkginclude_HEADERS) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in ChangeLog TODO
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgslsiman_la_LIBADD =
+am_libgslsiman_la_OBJECTS = siman.lo
+libgslsiman_la_OBJECTS = $(am_libgslsiman_la_OBJECTS)
+PROGRAMS = $(noinst_PROGRAMS)
+am_siman_tsp_OBJECTS = siman_tsp.$(OBJEXT)
+siman_tsp_OBJECTS = $(am_siman_tsp_OBJECTS)
+siman_tsp_DEPENDENCIES = libgslsiman.la ../rng/libgslrng.la \
+ ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la \
+ ../sys/libgslsys.la ../utils/libutils.la
+am_test_OBJECTS = test.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = libgslsiman.la ../rng/libgslrng.la \
+ ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la \
+ ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgslsiman_la_SOURCES) $(siman_tsp_SOURCES) \
+ $(test_SOURCES)
+DIST_SOURCES = $(libgslsiman_la_SOURCES) $(siman_tsp_SOURCES) \
+ $(test_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libgslsiman.la
+TESTS = $(check_PROGRAMS)
+EXTRA_DIST = siman_test_driver.sh
+test_SOURCES = test.c
+test_LDADD = libgslsiman.la ../rng/libgslrng.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+siman_tsp_SOURCES = siman_tsp.c
+siman_tsp_LDADD = libgslsiman.la ../rng/libgslrng.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../sys/libgslsys.la ../utils/libutils.la
+CLEANFILES = siman_test.out
+libgslsiman_la_SOURCES = siman.c
+pkginclude_HEADERS = gsl_siman.h
+INCLUDES = -I$(top_builddir)
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps siman/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps siman/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgslsiman.la: $(libgslsiman_la_OBJECTS) $(libgslsiman_la_DEPENDENCIES)
+ $(LINK) $(libgslsiman_la_LDFLAGS) $(libgslsiman_la_OBJECTS) $(libgslsiman_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+
+clean-noinstPROGRAMS:
+ @list='$(noinst_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+siman_tsp$(EXEEXT): $(siman_tsp_OBJECTS) $(siman_tsp_DEPENDENCIES)
+ @rm -f siman_tsp$(EXEEXT)
+ $(LINK) $(siman_tsp_LDFLAGS) $(siman_tsp_OBJECTS) $(siman_tsp_LDADD) $(LIBS)
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES clean-noinstPROGRAMS mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES clean-noinstPROGRAMS ctags distclean \
+ distclean-compile distclean-generic distclean-libtool \
+ distclean-tags distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-exec \
+ install-exec-am install-info install-info-am install-man \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkgincludeHEADERS
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/siman/TODO b/gsl-1.9/siman/TODO
new file mode 100644
index 0000000..ba605ac
--- /dev/null
+++ b/gsl-1.9/siman/TODO
@@ -0,0 +1,6 @@
+* Reorganize siman interfaces to allow iterative use.
+
+* Maybe the routines can be made to work with pointers instead of structs
+ so that only pointer manipulation is done by the siman algorithm and
+ there is no need for malloc. A call would look something like
+ siman(&start,&result, ...)
diff --git a/gsl-1.9/siman/gsl_siman.h b/gsl-1.9/siman/gsl_siman.h
new file mode 100644
index 0000000..d04333a
--- /dev/null
+++ b/gsl-1.9/siman/gsl_siman.h
@@ -0,0 +1,82 @@
+/* siman/gsl_siman.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Mark Galassi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_SIMAN_H__
+#define __GSL_SIMAN_H__
+#include <stdlib.h>
+#include <gsl/gsl_rng.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+/* types for the function pointers passed to gsl_siman_solve */
+
+typedef double (*gsl_siman_Efunc_t) (void *xp);
+typedef void (*gsl_siman_step_t) (const gsl_rng *r, void *xp, double step_size);
+typedef double (*gsl_siman_metric_t) (void *xp, void *yp);
+typedef void (*gsl_siman_print_t) (void *xp);
+typedef void (*gsl_siman_copy_t) (void *source, void *dest);
+typedef void * (*gsl_siman_copy_construct_t) (void *xp);
+typedef void (*gsl_siman_destroy_t) (void *xp);
+
+/* this structure contains all the information needed to structure the
+ search, beyond the energy function, the step function and the
+ initial guess. */
+
+typedef struct {
+ int n_tries; /* how many points to try for each step */
+ int iters_fixed_T; /* how many iterations at each temperature? */
+ double step_size; /* max step size in the random walk */
+ /* the following parameters are for the Boltzmann distribution */
+ double k, t_initial, mu_t, t_min;
+} gsl_siman_params_t;
+
+/* prototype for the workhorse function */
+
+void gsl_siman_solve(const gsl_rng * r,
+ void *x0_p, gsl_siman_Efunc_t Ef,
+ gsl_siman_step_t take_step,
+ gsl_siman_metric_t distance,
+ gsl_siman_print_t print_position,
+ gsl_siman_copy_t copyfunc,
+ gsl_siman_copy_construct_t copy_constructor,
+ gsl_siman_destroy_t destructor,
+ size_t element_size,
+ gsl_siman_params_t params);
+
+void
+gsl_siman_solve_many (const gsl_rng * r, void *x0_p, gsl_siman_Efunc_t Ef,
+ gsl_siman_step_t take_step,
+ gsl_siman_metric_t distance,
+ gsl_siman_print_t print_position,
+ size_t element_size,
+ gsl_siman_params_t params);
+
+__END_DECLS
+
+#endif /* __GSL_SIMAN_H__ */
diff --git a/gsl-1.9/siman/siman.c b/gsl-1.9/siman/siman.c
new file mode 100644
index 0000000..051c235
--- /dev/null
+++ b/gsl-1.9/siman/siman.c
@@ -0,0 +1,266 @@
+/* siman/siman.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Mark Galassi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#include <gsl/gsl_machine.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_siman.h>
+
+static inline
+double safe_exp (double x) /* avoid underflow errors for large uphill steps */
+{
+ return (x < GSL_LOG_DBL_MIN) ? 0.0 : exp(x);
+}
+
+/* implementation of a basic simulated annealing algorithm */
+
+void
+gsl_siman_solve (const gsl_rng * r, void *x0_p, gsl_siman_Efunc_t Ef,
+ gsl_siman_step_t take_step,
+ gsl_siman_metric_t distance,
+ gsl_siman_print_t print_position,
+ gsl_siman_copy_t copyfunc,
+ gsl_siman_copy_construct_t copy_constructor,
+ gsl_siman_destroy_t destructor,
+ size_t element_size,
+ gsl_siman_params_t params)
+{
+ void *x, *new_x, *best_x;
+ double E, new_E, best_E;
+ int i, done;
+ double T;
+ int n_evals = 1, n_iter = 0, n_accepts, n_rejects, n_eless;
+
+ /* this function requires that either the dynamic functions (copy,
+ copy_constructor and destrcutor) are passed, or that an element
+ size is given */
+ assert((copyfunc != NULL && copy_constructor != NULL && destructor != NULL)
+ || (element_size != 0));
+
+ distance = 0 ; /* This parameter is not currently used */
+ E = Ef(x0_p);
+
+ if (copyfunc) {
+ x = copy_constructor(x0_p);
+ new_x = copy_constructor(x0_p);
+ best_x = copy_constructor(x0_p);
+ } else {
+ x = (void *) malloc (element_size);
+ memcpy (x, x0_p, element_size);
+ new_x = (void *) malloc (element_size);
+ best_x = (void *) malloc (element_size);
+ memcpy (best_x, x0_p, element_size);
+ }
+
+ best_E = E;
+
+ T = params.t_initial;
+ done = 0;
+
+ if (print_position) {
+ printf ("#-iter #-evals temperature position energy\n");
+ }
+
+ while (!done) {
+
+ n_accepts = 0;
+ n_rejects = 0;
+ n_eless = 0;
+ for (i = 0; i < params.iters_fixed_T; ++i) {
+ if (copyfunc) {
+ copyfunc(x, new_x);
+ } else {
+ memcpy (new_x, x, element_size);
+ }
+
+ take_step (r, new_x, params.step_size);
+ new_E = Ef (new_x);
+
+ if(new_E <= best_E){
+ if (copyfunc) {
+ copyfunc(new_x,best_x);
+ } else {
+ memcpy (best_x, new_x, element_size);
+ }
+ best_E=new_E;
+ }
+
+ ++n_evals; /* keep track of Ef() evaluations */
+ /* now take the crucial step: see if the new point is accepted
+ or not, as determined by the boltzman probability */
+ if (new_E < E) {
+ /* yay! take a step */
+ if (copyfunc) {
+ copyfunc(new_x, x);
+ } else {
+ memcpy (x, new_x, element_size);
+ }
+ E = new_E;
+ ++n_eless;
+ } else if (gsl_rng_uniform(r) < safe_exp (-(new_E - E)/(params.k * T)) ) {
+ /* yay! take a step */
+ if (copyfunc) {
+ copyfunc(new_x, x);
+ } else {
+ memcpy(x, new_x, element_size);
+ }
+ E = new_E;
+ ++n_accepts;
+ } else {
+ ++n_rejects;
+ }
+ }
+
+ if (print_position) {
+ /* see if we need to print stuff as we go */
+ /* printf("%5d %12g %5d %3d %3d %3d", n_iter, T, n_evals, */
+ /* 100*n_eless/n_steps, 100*n_accepts/n_steps, */
+ /* 100*n_rejects/n_steps); */
+ printf ("%5d %7d %12g", n_iter, n_evals, T);
+ print_position (x);
+ printf (" %12g\n", E);
+ }
+
+ /* apply the cooling schedule to the temperature */
+ /* FIXME: I should also introduce a cooling schedule for the iters */
+ T /= params.mu_t;
+ ++n_iter;
+ if (T < params.t_min) {
+ done = 1;
+ }
+ }
+
+ /* at the end, copy the result onto the initial point, so we pass it
+ back to the caller */
+ if (copyfunc) {
+ copyfunc(best_x, x0_p);
+ } else {
+ memcpy (x0_p, best_x, element_size);
+ }
+
+ if (copyfunc) {
+ destructor(x);
+ destructor(new_x);
+ destructor(best_x);
+ } else {
+ free (x);
+ free (new_x);
+ free (best_x);
+ }
+}
+
+/* implementation of a simulated annealing algorithm with many tries */
+
+void
+gsl_siman_solve_many (const gsl_rng * r, void *x0_p, gsl_siman_Efunc_t Ef,
+ gsl_siman_step_t take_step,
+ gsl_siman_metric_t distance,
+ gsl_siman_print_t print_position,
+ size_t element_size,
+ gsl_siman_params_t params)
+{
+ /* the new set of trial points, and their energies and probabilities */
+ void *x, *new_x;
+ double *energies, *probs, *sum_probs;
+ double Ex; /* energy of the chosen point */
+ double T; /* the temperature */
+ int i, done;
+ double u; /* throw the die to choose a new "x" */
+ int n_iter;
+
+ if (print_position) {
+ printf ("#-iter temperature position");
+ printf (" delta_pos energy\n");
+ }
+
+ x = (void *) malloc (params.n_tries * element_size);
+ new_x = (void *) malloc (params.n_tries * element_size);
+ energies = (double *) malloc (params.n_tries * sizeof (double));
+ probs = (double *) malloc (params.n_tries * sizeof (double));
+ sum_probs = (double *) malloc (params.n_tries * sizeof (double));
+
+ T = params.t_initial;
+/* memcpy (x, x0_p, element_size); */
+ memcpy (x, x0_p, element_size);
+ done = 0;
+
+ n_iter = 0;
+ while (!done)
+ {
+ Ex = Ef (x);
+ for (i = 0; i < params.n_tries - 1; ++i)
+ { /* only go to N_TRIES-2 */
+ /* center the new_x[] around x, then pass it to take_step() */
+ sum_probs[i] = 0;
+ memcpy ((char *)new_x + i * element_size, x, element_size);
+ take_step (r, (char *)new_x + i * element_size, params.step_size);
+ energies[i] = Ef ((char *)new_x + i * element_size);
+ probs[i] = safe_exp (-(energies[i] - Ex) / (params.k * T));
+ }
+ /* now add in the old value of "x", so it is a contendor */
+ memcpy ((char *)new_x + (params.n_tries - 1) * element_size, x, element_size);
+ energies[params.n_tries - 1] = Ex;
+ probs[params.n_tries - 1] = safe_exp (-(energies[i] - Ex) / (params.k * T));
+
+ /* now throw biased die to see which new_x[i] we choose */
+ sum_probs[0] = probs[0];
+ for (i = 1; i < params.n_tries; ++i)
+ {
+ sum_probs[i] = sum_probs[i - 1] + probs[i];
+ }
+ u = gsl_rng_uniform (r) * sum_probs[params.n_tries - 1];
+ for (i = 0; i < params.n_tries; ++i)
+ {
+ if (u < sum_probs[i])
+ {
+ memcpy (x, (char *)new_x + i * element_size, element_size);
+ break;
+ }
+ }
+ if (print_position)
+ {
+ printf ("%5d\t%12g\t", n_iter, T);
+ print_position (x);
+ printf ("\t%12g\t%12g\n", distance (x, x0_p), Ex);
+ }
+ T /= params.mu_t;
+ ++n_iter;
+ if (T < params.t_min)
+ {
+ done = 1;
+ }
+ }
+
+ /* now return the value via x0_p */
+ memcpy (x0_p, x, element_size);
+
+ /* printf("the result is: %g (E=%g)\n", x, Ex); */
+
+ free (x);
+ free (new_x);
+ free (energies);
+ free (probs);
+ free (sum_probs);
+}
diff --git a/gsl-1.9/siman/siman_test_driver.sh b/gsl-1.9/siman/siman_test_driver.sh
new file mode 100755
index 0000000..21b393c
--- /dev/null
+++ b/gsl-1.9/siman/siman_test_driver.sh
@@ -0,0 +1,22 @@
+#! /bin/sh
+
+# assume good result from tests; increment it if any test fails
+EXIT_STATUS=0
+
+for seed in "" 12345 ;
+do
+./siman_test > siman_test.out 2>&1
+SECOND_LAST_ENERGY=`tail -2 siman_test.out1 | head -1 | awk '{print $4}'`
+LAST_ENERGY=`tail -1 siman_test.out1 | awk '{print $4}'`
+# echo " " $SECOND_LAST_ENERGY $LAST_ENERGY
+if [ $SECOND_LAST_ENERGY = $LAST_ENERGY ];
+then
+ echo -n "PASS: "
+else
+ echo -n "FAIL: "
+ EXIT_STATUS=`expr $EXIT_STATUS + 1`
+fi
+echo "simulated annealing test (travelling salesman problem) seed=${seed:-default}"
+done
+
+exit $EXIT_STATUS
diff --git a/gsl-1.9/siman/siman_tsp.c b/gsl-1.9/siman/siman_tsp.c
new file mode 100644
index 0000000..1efcc77
--- /dev/null
+++ b/gsl-1.9/siman/siman_tsp.c
@@ -0,0 +1,329 @@
+/* siman/siman_tsp.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Mark Galassi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <string.h>
+#include <stdio.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_siman.h>
+#include <gsl/gsl_ieee_utils.h>
+
+/* set up parameters for this simulated annealing run */
+
+#define N_TRIES 200 /* how many points do we try before stepping */
+#define ITERS_FIXED_T 2000 /* how many iterations for each T? */
+#define STEP_SIZE 1.0 /* max step size in random walk */
+#define K 1.0 /* Boltzmann constant */
+#define T_INITIAL 5000.0 /* initial temperature */
+#define MU_T 1.002 /* damping factor for temperature */
+#define T_MIN 5.0e-1
+
+gsl_siman_params_t params = {N_TRIES, ITERS_FIXED_T, STEP_SIZE,
+ K, T_INITIAL, MU_T, T_MIN};
+
+struct s_tsp_city {
+ const char * name;
+ double lat, longitude; /* coordinates */
+};
+typedef struct s_tsp_city Stsp_city;
+
+void prepare_distance_matrix(void);
+void exhaustive_search(void);
+void print_distance_matrix(void);
+double city_distance(Stsp_city c1, Stsp_city c2);
+double Etsp(void *xp);
+double Mtsp(void *xp, void *yp);
+void Stsp(const gsl_rng * r, void *xp, double step_size);
+void Ptsp(void *xp);
+
+/* in this table, latitude and longitude are obtained from the US
+ Census Bureau, at http://www.census.gov/cgi-bin/gazetteer */
+
+Stsp_city cities[] = {{"Santa Fe", 35.68, 105.95},
+ {"Phoenix", 33.54, 112.07},
+ {"Albuquerque", 35.12, 106.62},
+ {"Clovis", 34.41, 103.20},
+ {"Durango", 37.29, 107.87},
+ {"Dallas", 32.79, 96.77},
+ {"Tesuque", 35.77, 105.92},
+ {"Grants", 35.15, 107.84},
+ {"Los Alamos", 35.89, 106.28},
+ {"Las Cruces", 32.34, 106.76},
+ {"Cortez", 37.35, 108.58},
+ {"Gallup", 35.52, 108.74}};
+
+#define N_CITIES (sizeof(cities)/sizeof(Stsp_city))
+
+double distance_matrix[N_CITIES][N_CITIES];
+
+/* distance between two cities */
+double city_distance(Stsp_city c1, Stsp_city c2)
+{
+ const double earth_radius = 6375.000; /* 6000KM approximately */
+ /* sin and cos of lat and long; must convert to radians */
+ double sla1 = sin(c1.lat*M_PI/180), cla1 = cos(c1.lat*M_PI/180),
+ slo1 = sin(c1.longitude*M_PI/180), clo1 = cos(c1.longitude*M_PI/180);
+ double sla2 = sin(c2.lat*M_PI/180), cla2 = cos(c2.lat*M_PI/180),
+ slo2 = sin(c2.longitude*M_PI/180), clo2 = cos(c2.longitude*M_PI/180);
+
+ double x1 = cla1*clo1;
+ double x2 = cla2*clo2;
+
+ double y1 = cla1*slo1;
+ double y2 = cla2*slo2;
+
+ double z1 = sla1;
+ double z2 = sla2;
+
+ double dot_product = x1*x2 + y1*y2 + z1*z2;
+
+ double angle = acos(dot_product);
+
+ /* distance is the angle (in radians) times the earth radius */
+ return angle*earth_radius;
+}
+
+/* energy for the travelling salesman problem */
+double Etsp(void *xp)
+{
+ /* an array of N_CITIES integers describing the order */
+ int *route = (int *) xp;
+ double E = 0;
+ unsigned int i;
+
+ for (i = 0; i < N_CITIES; ++i) {
+ /* use the distance_matrix to optimize this calculation; it had
+ better be allocated!! */
+ E += distance_matrix[route[i]][route[(i + 1) % N_CITIES]];
+ }
+
+ return E;
+}
+
+double Mtsp(void *xp, void *yp)
+{
+ int *route1 = (int *) xp, *route2 = (int *) yp;
+ double distance = 0;
+ unsigned int i;
+
+ for (i = 0; i < N_CITIES; ++i) {
+ distance += ((route1[i] == route2[i]) ? 0 : 1);
+ }
+
+ return distance;
+}
+
+/* take a step through the TSP space */
+void Stsp(const gsl_rng * r, void *xp, double step_size)
+{
+ int x1, x2, dummy;
+ int *route = (int *) xp;
+
+ step_size = 0 ; /* prevent warnings about unused parameter */
+
+ /* pick the two cities to swap in the matrix; we leave the first
+ city fixed */
+ x1 = (gsl_rng_get (r) % (N_CITIES-1)) + 1;
+ do {
+ x2 = (gsl_rng_get (r) % (N_CITIES-1)) + 1;
+ } while (x2 == x1);
+
+ dummy = route[x1];
+ route[x1] = route[x2];
+ route[x2] = dummy;
+}
+
+void Ptsp(void *xp)
+{
+ unsigned int i;
+ int *route = (int *) xp;
+ printf(" [");
+ for (i = 0; i < N_CITIES; ++i) {
+ printf(" %d ", route[i]);
+ }
+ printf("] ");
+}
+
+int main(void)
+{
+ int x_initial[N_CITIES];
+ unsigned int i;
+
+ const gsl_rng * r = gsl_rng_alloc (gsl_rng_env_setup()) ;
+
+ gsl_ieee_env_setup ();
+
+ prepare_distance_matrix();
+
+ /* set up a trivial initial route */
+ printf("# initial order of cities:\n");
+ for (i = 0; i < N_CITIES; ++i) {
+ printf("# \"%s\"\n", cities[i].name);
+ x_initial[i] = i;
+ }
+
+ printf("# distance matrix is:\n");
+ print_distance_matrix();
+
+ printf("# initial coordinates of cities (longitude and latitude)\n");
+ /* this can be plotted with */
+ /* ./siman_tsp > hhh ; grep city_coord hhh | awk '{print $2 " " $3}' | xyplot -ps -d "xy" > c.eps */
+ for (i = 0; i < N_CITIES+1; ++i) {
+ printf("###initial_city_coord: %g %g \"%s\"\n",
+ -cities[x_initial[i % N_CITIES]].longitude,
+ cities[x_initial[i % N_CITIES]].lat,
+ cities[x_initial[i % N_CITIES]].name);
+ }
+
+/* exhaustive_search(); */
+
+ gsl_siman_solve(r, x_initial, Etsp, Stsp, Mtsp, Ptsp, NULL, NULL, NULL,
+ N_CITIES*sizeof(int), params);
+
+ printf("# final order of cities:\n");
+ for (i = 0; i < N_CITIES; ++i) {
+ printf("# \"%s\"\n", cities[x_initial[i]].name);
+ }
+
+ printf("# final coordinates of cities (longitude and latitude)\n");
+ /* this can be plotted with */
+ /* ./siman_tsp > hhh ; grep city_coord hhh | awk '{print $2 " " $3}' | xyplot -ps -d "xy" > c.eps */
+ for (i = 0; i < N_CITIES+1; ++i) {
+ printf("###final_city_coord: %g %g %s\n",
+ -cities[x_initial[i % N_CITIES]].longitude,
+ cities[x_initial[i % N_CITIES]].lat,
+ cities[x_initial[i % N_CITIES]].name);
+ }
+
+ printf("# ");
+ fflush(stdout);
+#if 0
+ system("date");
+#endif /* 0 */
+ fflush(stdout);
+
+ return 0;
+}
+
+void prepare_distance_matrix()
+{
+ unsigned int i, j;
+ double dist;
+
+ for (i = 0; i < N_CITIES; ++i) {
+ for (j = 0; j < N_CITIES; ++j) {
+ if (i == j) {
+ dist = 0;
+ } else {
+ dist = city_distance(cities[i], cities[j]);
+ }
+ distance_matrix[i][j] = dist;
+ }
+ }
+}
+
+void print_distance_matrix()
+{
+ unsigned int i, j;
+
+ for (i = 0; i < N_CITIES; ++i) {
+ printf("# ");
+ for (j = 0; j < N_CITIES; ++j) {
+ printf("%15.8f ", distance_matrix[i][j]);
+ }
+ printf("\n");
+ }
+}
+
+/* [only works for 12] search the entire space for solutions */
+static double best_E = 1.0e100, second_E = 1.0e100, third_E = 1.0e100;
+static int best_route[N_CITIES];
+static int second_route[N_CITIES];
+static int third_route[N_CITIES];
+static void do_all_perms(int *route, int n);
+
+void exhaustive_search()
+{
+ static int initial_route[N_CITIES] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
+ printf("\n# ");
+ fflush(stdout);
+#if 0
+ system("date");
+#endif
+ fflush(stdout);
+ do_all_perms(initial_route, 1);
+ printf("\n# ");
+ fflush(stdout);
+#if 0
+ system("date");
+#endif /* 0 */
+ fflush(stdout);
+
+ printf("# exhaustive best route: ");
+ Ptsp(best_route);
+ printf("\n# its energy is: %g\n", best_E);
+
+ printf("# exhaustive second_best route: ");
+ Ptsp(second_route);
+ printf("\n# its energy is: %g\n", second_E);
+
+ printf("# exhaustive third_best route: ");
+ Ptsp(third_route);
+ printf("\n# its energy is: %g\n", third_E);
+}
+
+/* James Theiler's recursive algorithm for generating all routes */
+static void do_all_perms(int *route, int n)
+{
+ if (n == (N_CITIES-1)) {
+ /* do it! calculate the energy/cost for that route */
+ double E;
+ E = Etsp(route); /* TSP energy function */
+ /* now save the best 3 energies and routes */
+ if (E < best_E) {
+ third_E = second_E;
+ memcpy(third_route, second_route, N_CITIES*sizeof(*route));
+ second_E = best_E;
+ memcpy(second_route, best_route, N_CITIES*sizeof(*route));
+ best_E = E;
+ memcpy(best_route, route, N_CITIES*sizeof(*route));
+ } else if (E < second_E) {
+ third_E = second_E;
+ memcpy(third_route, second_route, N_CITIES*sizeof(*route));
+ second_E = E;
+ memcpy(second_route, route, N_CITIES*sizeof(*route));
+ } else if (E < third_E) {
+ third_E = E;
+ memcpy(route, third_route, N_CITIES*sizeof(*route));
+ }
+ } else {
+ int new_route[N_CITIES];
+ unsigned int j;
+ int swap_tmp;
+ memcpy(new_route, route, N_CITIES*sizeof(*route));
+ for (j = n; j < N_CITIES; ++j) {
+ swap_tmp = new_route[j];
+ new_route[j] = new_route[n];
+ new_route[n] = swap_tmp;
+ do_all_perms(new_route, n+1);
+ }
+ }
+}
diff --git a/gsl-1.9/siman/test.c b/gsl-1.9/siman/test.c
new file mode 100644
index 0000000..95c9570
--- /dev/null
+++ b/gsl-1.9/siman/test.c
@@ -0,0 +1,162 @@
+/* siman/test.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Mark Galassi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_siman.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <stdio.h>
+
+/* set up parameters for this simulated annealing run */
+#define N_TRIES 200 /* how many points do we try before stepping */
+#define ITERS_FIXED_T 1000 /* how many iterations for each T? */
+#define STEP_SIZE 1.0 /* max step size in random walk */
+#define K 1.0 /* Boltzmann constant */
+#define T_INITIAL 0.008 /* initial temperature */
+#define MU_T 1.003 /* damping factor for temperature */
+#define T_MIN 2.0e-6
+
+gsl_siman_params_t params = {N_TRIES, ITERS_FIXED_T, STEP_SIZE,
+ K, T_INITIAL, MU_T, T_MIN};
+
+double square (double x) ;
+double square (double x) { return x * x ; }
+
+double E1(void *xp);
+double M1(void *xp, void *yp);
+void S1(const gsl_rng * r, void *xp, double step_size);
+void P1(void *xp);
+
+/* now some functions to test in one dimension */
+double E1(void *xp)
+{
+ double x = * ((double *) xp);
+
+ return exp(-square(x-1))*sin(8*x) - exp(-square(x-1000))*0.89;
+}
+
+double M1(void *xp, void *yp)
+{
+ double x = *((double *) xp);
+ double y = *((double *) yp);
+
+ return fabs(x - y);
+}
+
+void S1(const gsl_rng * r, void *xp, double step_size)
+{
+ double old_x = *((double *) xp);
+ double new_x;
+
+ new_x = gsl_rng_uniform(r)*2*step_size - step_size + old_x;
+
+ memcpy(xp, &new_x, sizeof(new_x));
+}
+
+void P1(void *xp)
+{
+ printf(" %12g ", *((double *) xp));
+}
+
+int main(void)
+{
+ double x_min = 1.36312999455315182 ;
+ double x ;
+
+ gsl_rng * r = gsl_rng_alloc (gsl_rng_env_setup()) ;
+
+ gsl_ieee_env_setup ();
+
+ /* The function tested here has multiple mimima.
+ The global minimum is at x = 1.36312999, (f = -0.87287)
+ There is a local minimum at x = 0.60146196, (f = -0.84893) */
+
+ x = -10.0 ;
+ gsl_siman_solve(r, &x, E1, S1, M1, NULL, NULL, NULL, NULL,
+ sizeof(double), params);
+ gsl_test_rel(x, x_min, 1e-3, "f(x)= exp(-(x-1)^2) sin(8x), x0=-10") ;
+
+ x = +10.0 ;
+ gsl_siman_solve(r, &x, E1, S1, M1, NULL, NULL, NULL, NULL,
+ sizeof(double), params);
+ gsl_test_rel(x, x_min, 1e-3, "f(x)= exp(-(x-1)^2) sin(8x), x0=10") ;
+
+ /* Start at the false minimum */
+
+ x = +0.6 ;
+ gsl_siman_solve(r, &x, E1, S1, M1, NULL, NULL, NULL, NULL,
+ sizeof(double), params);
+ gsl_test_rel(x, x_min, 1e-3, "f(x)= exp(-(x-1)^2) sin(8x), x0=0.6") ;
+
+ x = +0.5 ;
+ gsl_siman_solve(r, &x, E1, S1, M1, NULL, NULL, NULL, NULL,
+ sizeof(double), params);
+ gsl_test_rel(x, x_min, 1e-3, "f(x)= exp(-(x-1)^2) sin(8x), x0=0.5") ;
+
+ x = +0.4 ;
+ gsl_siman_solve(r, &x, E1, S1, M1, NULL, NULL, NULL, NULL,
+ sizeof(double), params);
+ gsl_test_rel(x, x_min, 1e-3, "f(x)= exp(-(x-1)^2) sin(8x), x0=0.4") ;
+
+ gsl_rng_free(r);
+ exit (gsl_test_summary ());
+
+#ifdef JUNK
+ x0.D1 = 12.0;
+ printf("#one dimensional problem, x0 = %f\n", x0.D1);
+ gsl_siman_Usolve(r, &x0, test_E_1D, test_step_1D, distance_1D,
+ print_pos_1D, params);
+
+
+ x0.D2[0] = 12.0;
+ x0.D2[1] = 5.5;
+ printf("#two dimensional problem, (x0,y0) = (%f,%f)\n",
+ x0.D2[0], x0.D2[1]);
+ gsl_siman_Usolve(r, &x0, test_E_2D, test_step_2D, distance_2D,
+ print_pos_2D, params);
+
+ x0.D3[0] = 12.2;
+ x0.D3[1] = 5.5;
+ x0.D3[2] = -15.5;
+ printf("#three dimensional problem, (x0,y0,z0) = (%f,%f,%f)\n",
+ x0.D3[0], x0.D3[1], x0.D3[2]);
+ gsl_siman_Usolve(r, &x0, test_E_3D, test_step_3D, distance_3D,
+ print_pos_3D, params);
+
+ x0.D2[0] = 12.2;
+ x0.D2[1] = 5.5;
+
+ gsl_siman_solve(r, &x0, test_E_2D, test_step_2D, distance_2D, print_pos_2D, params);
+
+ x0.D3[0] = 12.2;
+ x0.D3[1] = 5.5;
+ x0.D3[2] = -15.5;
+
+ gsl_siman_solve(r, &x0, test_E_3D, test_step_3D, distance_3D, print_pos_3D, params);
+
+ return 0;
+#endif
+}
+
+
+
diff --git a/gsl-1.9/sort/ChangeLog b/gsl-1.9/sort/ChangeLog
new file mode 100644
index 0000000..1eff586
--- /dev/null
+++ b/gsl-1.9/sort/ChangeLog
@@ -0,0 +1,58 @@
+2005-08-31 Brian Gough <bjg@network-theory.co.uk>
+
+ * test_source.c: free index memory as well
+
+2005-04-08 Brian Gough <bjg@network-theory.co.uk>
+
+ * sortvecind_source.c sortvec_source.c: write tests in such a way
+ as to avoid an infinite loop if nan, by always comparing in the
+ same direction (note that nan < x and nan > x are both false)
+
+Tue Jun 26 12:06:58 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * subset_source. subsetind_source.c: make prototypes match header
+ file
+
+Sun Jan 21 18:36:04 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * subset.c, subsetind.c: added functions for selecting subsets
+ (k-th smallest or largest values)
+
+Mon Mar 13 13:57:33 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * sortind.c (gsl_heapsort_index): changed to use an array of
+ size_t's directly instead of gsl_permutation
+
+Mon Feb 28 20:30:06 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * renamed gsl_sort to gsl_heapsort, since this is more meaningful
+ and gsl_sort, gsl_sort_float, ... is now used for sorting of
+ arrays.
+
+ * added support for sorting of arrays, without going through a
+ gsl_vector object (gsl_sort_vector is now implemented in terms of
+ these functions)
+
+Sat Feb 26 14:47:36 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * added support for indirect sorting of objects
+
+ * fixed bug in indirect sorting from use of BASE type instead of
+ size_t for index.
+
+ * reorganized directory
+
+Fri Feb 25 19:30:08 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * sortind_source.c: changed return type of indirect sort to int,
+ to allow error return code in case where permutation and vector
+ sizes do not match
+
+Sat Feb 19 12:18:28 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * sortind_source.c: added indirect sorting
+
+Fri Feb 18 10:48:24 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * initial GPL sources from Thomas Walter
+ <walter@pctc.chemie.uni-erlangen.de>
diff --git a/gsl-1.9/sort/Makefile.am b/gsl-1.9/sort/Makefile.am
new file mode 100644
index 0000000..ddd010d
--- /dev/null
+++ b/gsl-1.9/sort/Makefile.am
@@ -0,0 +1,16 @@
+noinst_LTLIBRARIES = libgslsort.la
+
+pkginclude_HEADERS = gsl_heapsort.h gsl_sort.h gsl_sort_char.h gsl_sort_double.h gsl_sort_float.h gsl_sort_int.h gsl_sort_long.h gsl_sort_long_double.h gsl_sort_short.h gsl_sort_uchar.h gsl_sort_uint.h gsl_sort_ulong.h gsl_sort_ushort.h gsl_sort_vector.h gsl_sort_vector_char.h gsl_sort_vector_double.h gsl_sort_vector_float.h gsl_sort_vector_int.h gsl_sort_vector_long.h gsl_sort_vector_long_double.h gsl_sort_vector_short.h gsl_sort_vector_uchar.h gsl_sort_vector_uint.h gsl_sort_vector_ulong.h gsl_sort_vector_ushort.h
+
+INCLUDES= -I$(top_builddir) -I$(top_srcdir)
+
+libgslsort_la_SOURCES = sort.c sortind.c sortvec.c sortvecind.c subset.c subsetind.c
+noinst_HEADERS = sortvec_source.c sortvecind_source.c subset_source.c subsetind_source.c test_source.c test_heapsort.c
+
+TESTS = $(check_PROGRAMS)
+
+check_PROGRAMS = test
+
+test_SOURCES = test.c
+test_LDADD = libgslsort.la ../permutation/libgslpermutation.la ../vector/libgslvector.la ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la
+
diff --git a/gsl-1.9/sort/Makefile.in b/gsl-1.9/sort/Makefile.in
new file mode 100644
index 0000000..f9fd060
--- /dev/null
+++ b/gsl-1.9/sort/Makefile.in
@@ -0,0 +1,546 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = test$(EXEEXT)
+subdir = sort
+DIST_COMMON = $(noinst_HEADERS) $(pkginclude_HEADERS) \
+ $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog TODO
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgslsort_la_LIBADD =
+am_libgslsort_la_OBJECTS = sort.lo sortind.lo sortvec.lo sortvecind.lo \
+ subset.lo subsetind.lo
+libgslsort_la_OBJECTS = $(am_libgslsort_la_OBJECTS)
+am_test_OBJECTS = test.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = libgslsort.la ../permutation/libgslpermutation.la \
+ ../vector/libgslvector.la ../block/libgslblock.la \
+ ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la \
+ ../test/libgsltest.la ../sys/libgslsys.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgslsort_la_SOURCES) $(test_SOURCES)
+DIST_SOURCES = $(libgslsort_la_SOURCES) $(test_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libgslsort.la
+pkginclude_HEADERS = gsl_heapsort.h gsl_sort.h gsl_sort_char.h gsl_sort_double.h gsl_sort_float.h gsl_sort_int.h gsl_sort_long.h gsl_sort_long_double.h gsl_sort_short.h gsl_sort_uchar.h gsl_sort_uint.h gsl_sort_ulong.h gsl_sort_ushort.h gsl_sort_vector.h gsl_sort_vector_char.h gsl_sort_vector_double.h gsl_sort_vector_float.h gsl_sort_vector_int.h gsl_sort_vector_long.h gsl_sort_vector_long_double.h gsl_sort_vector_short.h gsl_sort_vector_uchar.h gsl_sort_vector_uint.h gsl_sort_vector_ulong.h gsl_sort_vector_ushort.h
+INCLUDES = -I$(top_builddir) -I$(top_srcdir)
+libgslsort_la_SOURCES = sort.c sortind.c sortvec.c sortvecind.c subset.c subsetind.c
+noinst_HEADERS = sortvec_source.c sortvecind_source.c subset_source.c subsetind_source.c test_source.c test_heapsort.c
+TESTS = $(check_PROGRAMS)
+test_SOURCES = test.c
+test_LDADD = libgslsort.la ../permutation/libgslpermutation.la ../vector/libgslvector.la ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps sort/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps sort/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgslsort.la: $(libgslsort_la_OBJECTS) $(libgslsort_la_DEPENDENCIES)
+ $(LINK) $(libgslsort_la_LDFLAGS) $(libgslsort_la_OBJECTS) $(libgslsort_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkgincludeHEADERS
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/sort/TODO b/gsl-1.9/sort/TODO
new file mode 100644
index 0000000..4312ed6
--- /dev/null
+++ b/gsl-1.9/sort/TODO
@@ -0,0 +1,36 @@
+* Routines for selecting the k largest or smallest values could use
+heapsort for speed O(N log k) rather than insertion O(N k).
+
+* Sorting of complex arrarys without using additional memory. We try
+to avoid allocating memory internally in GSL, so internally computing
+the magnitudes and storing them in a temporary array is undesirable.
+
+Obviously a complex array can be sorted using sqrt(x*x + y*y) <=>
+sqrt(u*u + v*v) (written in a numerically stable way) for every
+comparison, but this may be unacceptably slow. Maybe not? It is just a
+constant factor. The square roots could sometimes be avoided by
+optimization,
+
+ (x,y) = (MAX(|x|,|y|), MIN(|x|,|y|))
+ (u,v) = (MAX(|u|,|v|), MIN(|u|,|v|))
+
+ if (x < u/sqrt(2)) /* This part is optional optimization */
+ return -1
+ if (x > u*sqrt(2))
+ return +1
+
+ if (x == 0 && u == 0) ...
+ if (x == 0) ...
+ if (u == 0) ...
+
+ t = u*sqrt((1+(v/u)^2)/(1+(y/x)^2))
+
+ if (x < t)
+ return -1
+ if (x > t)
+ return +1
+ else
+ return 0
+
+but this does depend on the data having sufficient range for the
+optimization to be worthwhile, otherwise it is an extra cost.
diff --git a/gsl-1.9/sort/gsl_heapsort.h b/gsl-1.9/sort/gsl_heapsort.h
new file mode 100644
index 0000000..29a9b79
--- /dev/null
+++ b/gsl-1.9/sort/gsl_heapsort.h
@@ -0,0 +1,44 @@
+/* sort/gsl_heapsort.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Thomas Walter, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_HEAPSORT_H__
+#define __GSL_HEAPSORT_H__
+
+#include <gsl/gsl_permutation.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+typedef int (*gsl_comparison_fn_t) (const void *, const void *);
+
+void gsl_heapsort (void * array, size_t count, size_t size, gsl_comparison_fn_t compare);
+int gsl_heapsort_index (size_t * p, const void * array, size_t count, size_t size, gsl_comparison_fn_t compare);
+
+__END_DECLS
+
+#endif /* __GSL_HEAPSORT_H__ */
diff --git a/gsl-1.9/sort/gsl_sort.h b/gsl-1.9/sort/gsl_sort.h
new file mode 100644
index 0000000..b1496c2
--- /dev/null
+++ b/gsl-1.9/sort/gsl_sort.h
@@ -0,0 +1,20 @@
+#ifndef __GSL_SORT_H__
+#define __GSL_SORT_H__
+
+#include <gsl/gsl_sort_long_double.h>
+#include <gsl/gsl_sort_double.h>
+#include <gsl/gsl_sort_float.h>
+
+#include <gsl/gsl_sort_ulong.h>
+#include <gsl/gsl_sort_long.h>
+
+#include <gsl/gsl_sort_uint.h>
+#include <gsl/gsl_sort_int.h>
+
+#include <gsl/gsl_sort_ushort.h>
+#include <gsl/gsl_sort_short.h>
+
+#include <gsl/gsl_sort_uchar.h>
+#include <gsl/gsl_sort_char.h>
+
+#endif /* __GSL_SORT_H__ */
diff --git a/gsl-1.9/sort/gsl_sort_char.h b/gsl-1.9/sort/gsl_sort_char.h
new file mode 100644
index 0000000..0ea3060
--- /dev/null
+++ b/gsl-1.9/sort/gsl_sort_char.h
@@ -0,0 +1,50 @@
+/* sort/gsl_sort_char.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Thomas Walter, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_SORT_CHAR_H__
+#define __GSL_SORT_CHAR_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+void gsl_sort_char (char * data, const size_t stride, const size_t n);
+void gsl_sort_char_index (size_t * p, const char * data, const size_t stride, const size_t n);
+
+int gsl_sort_char_smallest (char * dest, const size_t k, const char * src, const size_t stride, const size_t n);
+int gsl_sort_char_smallest_index (size_t * p, const size_t k, const char * src, const size_t stride, const size_t n);
+
+int gsl_sort_char_largest (char * dest, const size_t k, const char * src, const size_t stride, const size_t n);
+int gsl_sort_char_largest_index (size_t * p, const size_t k, const char * src, const size_t stride, const size_t n);
+
+__END_DECLS
+
+#endif /* __GSL_SORT_CHAR_H__ */
diff --git a/gsl-1.9/sort/gsl_sort_double.h b/gsl-1.9/sort/gsl_sort_double.h
new file mode 100644
index 0000000..aa35bc3
--- /dev/null
+++ b/gsl-1.9/sort/gsl_sort_double.h
@@ -0,0 +1,50 @@
+/* sort/gsl_sort_double.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Thomas Walter, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_SORT_DOUBLE_H__
+#define __GSL_SORT_DOUBLE_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+void gsl_sort (double * data, const size_t stride, const size_t n);
+void gsl_sort_index (size_t * p, const double * data, const size_t stride, const size_t n);
+
+int gsl_sort_smallest (double * dest, const size_t k, const double * src, const size_t stride, const size_t n);
+int gsl_sort_smallest_index (size_t * p, const size_t k, const double * src, const size_t stride, const size_t n);
+
+int gsl_sort_largest (double * dest, const size_t k, const double * src, const size_t stride, const size_t n);
+int gsl_sort_largest_index (size_t * p, const size_t k, const double * src, const size_t stride, const size_t n);
+
+__END_DECLS
+
+#endif /* __GSL_SORT_DOUBLE_H__ */
diff --git a/gsl-1.9/sort/gsl_sort_float.h b/gsl-1.9/sort/gsl_sort_float.h
new file mode 100644
index 0000000..80ab4a8
--- /dev/null
+++ b/gsl-1.9/sort/gsl_sort_float.h
@@ -0,0 +1,50 @@
+/* sort/gsl_sort_float.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Thomas Walter, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_SORT_FLOAT_H__
+#define __GSL_SORT_FLOAT_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+void gsl_sort_float (float * data, const size_t stride, const size_t n);
+void gsl_sort_float_index (size_t * p, const float * data, const size_t stride, const size_t n);
+
+int gsl_sort_float_smallest (float * dest, const size_t k, const float * src, const size_t stride, const size_t n);
+int gsl_sort_float_smallest_index (size_t * p, const size_t k, const float * src, const size_t stride, const size_t n);
+
+int gsl_sort_float_largest (float * dest, const size_t k, const float * src, const size_t stride, const size_t n);
+int gsl_sort_float_largest_index (size_t * p, const size_t k, const float * src, const size_t stride, const size_t n);
+
+__END_DECLS
+
+#endif /* __GSL_SORT_FLOAT_H__ */
diff --git a/gsl-1.9/sort/gsl_sort_int.h b/gsl-1.9/sort/gsl_sort_int.h
new file mode 100644
index 0000000..350e54c
--- /dev/null
+++ b/gsl-1.9/sort/gsl_sort_int.h
@@ -0,0 +1,50 @@
+/* sort/gsl_sort_int.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Thomas Walter, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_SORT_INT_H__
+#define __GSL_SORT_INT_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+void gsl_sort_int (int * data, const size_t stride, const size_t n);
+void gsl_sort_int_index (size_t * p, const int * data, const size_t stride, const size_t n);
+
+int gsl_sort_int_smallest (int * dest, const size_t k, const int * src, const size_t stride, const size_t n);
+int gsl_sort_int_smallest_index (size_t * p, const size_t k, const int * src, const size_t stride, const size_t n);
+
+int gsl_sort_int_largest (int * dest, const size_t k, const int * src, const size_t stride, const size_t n);
+int gsl_sort_int_largest_index (size_t * p, const size_t k, const int * src, const size_t stride, const size_t n);
+
+__END_DECLS
+
+#endif /* __GSL_SORT_INT_H__ */
diff --git a/gsl-1.9/sort/gsl_sort_long.h b/gsl-1.9/sort/gsl_sort_long.h
new file mode 100644
index 0000000..2d79914
--- /dev/null
+++ b/gsl-1.9/sort/gsl_sort_long.h
@@ -0,0 +1,50 @@
+/* sort/gsl_sort_long.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Thomas Walter, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_SORT_LONG_H__
+#define __GSL_SORT_LONG_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+void gsl_sort_long (long * data, const size_t stride, const size_t n);
+void gsl_sort_long_index (size_t * p, const long * data, const size_t stride, const size_t n);
+
+int gsl_sort_long_smallest (long * dest, const size_t k, const long * src, const size_t stride, const size_t n);
+int gsl_sort_long_smallest_index (size_t * p, const size_t k, const long * src, const size_t stride, const size_t n);
+
+int gsl_sort_long_largest (long * dest, const size_t k, const long * src, const size_t stride, const size_t n);
+int gsl_sort_long_largest_index (size_t * p, const size_t k, const long * src, const size_t stride, const size_t n);
+
+__END_DECLS
+
+#endif /* __GSL_SORT_LONG_H__ */
diff --git a/gsl-1.9/sort/gsl_sort_long_double.h b/gsl-1.9/sort/gsl_sort_long_double.h
new file mode 100644
index 0000000..8ba3418
--- /dev/null
+++ b/gsl-1.9/sort/gsl_sort_long_double.h
@@ -0,0 +1,50 @@
+/* sort/gsl_sort_long_double.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Thomas Walter, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_SORT_LONG_DOUBLE_H__
+#define __GSL_SORT_LONG_DOUBLE_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+void gsl_sort_long_double (long double * data, const size_t stride, const size_t n);
+void gsl_sort_long_double_index (size_t * p, const long double * data, const size_t stride, const size_t n);
+
+int gsl_sort_long_double_smallest (long double * dest, const size_t k, const long double * src, const size_t stride, const size_t n);
+int gsl_sort_long_double_smallest_index (size_t * p, const size_t k, const long double * src, const size_t stride, const size_t n);
+
+int gsl_sort_long_double_largest (long double * dest, const size_t k, const long double * src, const size_t stride, const size_t n);
+int gsl_sort_long_double_largest_index (size_t * p, const size_t k, const long double * src, const size_t stride, const size_t n);
+
+__END_DECLS
+
+#endif /* __GSL_SORT_LONG_DOUBLE_H__ */
diff --git a/gsl-1.9/sort/gsl_sort_short.h b/gsl-1.9/sort/gsl_sort_short.h
new file mode 100644
index 0000000..f0af319
--- /dev/null
+++ b/gsl-1.9/sort/gsl_sort_short.h
@@ -0,0 +1,50 @@
+/* sort/gsl_sort_short.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Thomas Walter, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_SORT_SHORT_H__
+#define __GSL_SORT_SHORT_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+void gsl_sort_short (short * data, const size_t stride, const size_t n);
+void gsl_sort_short_index (size_t * p, const short * data, const size_t stride, const size_t n);
+
+int gsl_sort_short_smallest (short * dest, const size_t k, const short * src, const size_t stride, const size_t n);
+int gsl_sort_short_smallest_index (size_t * p, const size_t k, const short * src, const size_t stride, const size_t n);
+
+int gsl_sort_short_largest (short * dest, const size_t k, const short * src, const size_t stride, const size_t n);
+int gsl_sort_short_largest_index (size_t * p, const size_t k, const short * src, const size_t stride, const size_t n);
+
+__END_DECLS
+
+#endif /* __GSL_SORT_SHORT_H__ */
diff --git a/gsl-1.9/sort/gsl_sort_uchar.h b/gsl-1.9/sort/gsl_sort_uchar.h
new file mode 100644
index 0000000..f3159a6
--- /dev/null
+++ b/gsl-1.9/sort/gsl_sort_uchar.h
@@ -0,0 +1,50 @@
+/* sort/gsl_sort_uchar.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Thomas Walter, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_SORT_UCHAR_H__
+#define __GSL_SORT_UCHAR_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+void gsl_sort_uchar (unsigned char * data, const size_t stride, const size_t n);
+void gsl_sort_uchar_index (size_t * p, const unsigned char * data, const size_t stride, const size_t n);
+
+int gsl_sort_uchar_smallest (unsigned char * dest, const size_t k, const unsigned char * src, const size_t stride, const size_t n);
+int gsl_sort_uchar_smallest_index (size_t * p, const size_t k, const unsigned char * src, const size_t stride, const size_t n);
+
+int gsl_sort_uchar_largest (unsigned char * dest, const size_t k, const unsigned char * src, const size_t stride, const size_t n);
+int gsl_sort_uchar_largest_index (size_t * p, const size_t k, const unsigned char * src, const size_t stride, const size_t n);
+
+__END_DECLS
+
+#endif /* __GSL_SORT_UCHAR_H__ */
diff --git a/gsl-1.9/sort/gsl_sort_uint.h b/gsl-1.9/sort/gsl_sort_uint.h
new file mode 100644
index 0000000..2397b9e
--- /dev/null
+++ b/gsl-1.9/sort/gsl_sort_uint.h
@@ -0,0 +1,50 @@
+/* sort/gsl_sort_uint.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Thomas Walter, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_SORT_UINT_H__
+#define __GSL_SORT_UINT_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+void gsl_sort_uint (unsigned int * data, const size_t stride, const size_t n);
+void gsl_sort_uint_index (size_t * p, const unsigned int * data, const size_t stride, const size_t n);
+
+int gsl_sort_uint_smallest (unsigned int * dest, const size_t k, const unsigned int * src, const size_t stride, const size_t n);
+int gsl_sort_uint_smallest_index (size_t * p, const size_t k, const unsigned int * src, const size_t stride, const size_t n);
+
+int gsl_sort_uint_largest (unsigned int * dest, const size_t k, const unsigned int * src, const size_t stride, const size_t n);
+int gsl_sort_uint_largest_index (size_t * p, const size_t k, const unsigned int * src, const size_t stride, const size_t n);
+
+__END_DECLS
+
+#endif /* __GSL_SORT_UINT_H__ */
diff --git a/gsl-1.9/sort/gsl_sort_ulong.h b/gsl-1.9/sort/gsl_sort_ulong.h
new file mode 100644
index 0000000..36b2158
--- /dev/null
+++ b/gsl-1.9/sort/gsl_sort_ulong.h
@@ -0,0 +1,50 @@
+/* sort/gsl_sort_ulong.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Thomas Walter, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_SORT_ULONG_H__
+#define __GSL_SORT_ULONG_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+void gsl_sort_ulong (unsigned long * data, const size_t stride, const size_t n);
+void gsl_sort_ulong_index (size_t * p, const unsigned long * data, const size_t stride, const size_t n);
+
+int gsl_sort_ulong_smallest (unsigned long * dest, const size_t k, const unsigned long * src, const size_t stride, const size_t n);
+int gsl_sort_ulong_smallest_index (size_t * p, const size_t k, const unsigned long * src, const size_t stride, const size_t n);
+
+int gsl_sort_ulong_largest (unsigned long * dest, const size_t k, const unsigned long * src, const size_t stride, const size_t n);
+int gsl_sort_ulong_largest_index (size_t * p, const size_t k, const unsigned long * src, const size_t stride, const size_t n);
+
+__END_DECLS
+
+#endif /* __GSL_SORT_ULONG_H__ */
diff --git a/gsl-1.9/sort/gsl_sort_ushort.h b/gsl-1.9/sort/gsl_sort_ushort.h
new file mode 100644
index 0000000..a5f56c9
--- /dev/null
+++ b/gsl-1.9/sort/gsl_sort_ushort.h
@@ -0,0 +1,50 @@
+/* sort/gsl_sort_ushort.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Thomas Walter, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_SORT_USHORT_H__
+#define __GSL_SORT_USHORT_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+void gsl_sort_ushort (unsigned short * data, const size_t stride, const size_t n);
+void gsl_sort_ushort_index (size_t * p, const unsigned short * data, const size_t stride, const size_t n);
+
+int gsl_sort_ushort_smallest (unsigned short * dest, const size_t k, const unsigned short * src, const size_t stride, const size_t n);
+int gsl_sort_ushort_smallest_index (size_t * p, const size_t k, const unsigned short * src, const size_t stride, const size_t n);
+
+int gsl_sort_ushort_largest (unsigned short * dest, const size_t k, const unsigned short * src, const size_t stride, const size_t n);
+int gsl_sort_ushort_largest_index (size_t * p, const size_t k, const unsigned short * src, const size_t stride, const size_t n);
+
+__END_DECLS
+
+#endif /* __GSL_SORT_USHORT_H__ */
diff --git a/gsl-1.9/sort/gsl_sort_vector.h b/gsl-1.9/sort/gsl_sort_vector.h
new file mode 100644
index 0000000..d65a9ee
--- /dev/null
+++ b/gsl-1.9/sort/gsl_sort_vector.h
@@ -0,0 +1,20 @@
+#ifndef __GSL_SORT_VECTOR_H__
+#define __GSL_SORT_VECTOR_H__
+
+#include <gsl/gsl_sort_vector_long_double.h>
+#include <gsl/gsl_sort_vector_double.h>
+#include <gsl/gsl_sort_vector_float.h>
+
+#include <gsl/gsl_sort_vector_ulong.h>
+#include <gsl/gsl_sort_vector_long.h>
+
+#include <gsl/gsl_sort_vector_uint.h>
+#include <gsl/gsl_sort_vector_int.h>
+
+#include <gsl/gsl_sort_vector_ushort.h>
+#include <gsl/gsl_sort_vector_short.h>
+
+#include <gsl/gsl_sort_vector_uchar.h>
+#include <gsl/gsl_sort_vector_char.h>
+
+#endif /* __GSL_SORT_VECTOR_H__ */
diff --git a/gsl-1.9/sort/gsl_sort_vector_char.h b/gsl-1.9/sort/gsl_sort_vector_char.h
new file mode 100644
index 0000000..c602856
--- /dev/null
+++ b/gsl-1.9/sort/gsl_sort_vector_char.h
@@ -0,0 +1,51 @@
+/* sort/gsl_sort_vector_char.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Thomas Walter, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_SORT_VECTOR_CHAR_H__
+#define __GSL_SORT_VECTOR_CHAR_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+#include <gsl/gsl_vector_char.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+void gsl_sort_vector_char (gsl_vector_char * v);
+int gsl_sort_vector_char_index (gsl_permutation * p, const gsl_vector_char * v);
+
+int gsl_sort_vector_char_smallest (char * dest, const size_t k, const gsl_vector_char * v);
+int gsl_sort_vector_char_largest (char * dest, const size_t k, const gsl_vector_char * v);
+
+int gsl_sort_vector_char_smallest_index (size_t * p, const size_t k, const gsl_vector_char * v);
+int gsl_sort_vector_char_largest_index (size_t * p, const size_t k, const gsl_vector_char * v);
+
+__END_DECLS
+
+#endif /* __GSL_SORT_VECTOR_CHAR_H__ */
diff --git a/gsl-1.9/sort/gsl_sort_vector_double.h b/gsl-1.9/sort/gsl_sort_vector_double.h
new file mode 100644
index 0000000..92662f4
--- /dev/null
+++ b/gsl-1.9/sort/gsl_sort_vector_double.h
@@ -0,0 +1,51 @@
+/* sort/gsl_sort_vector_double.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Thomas Walter, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_SORT_VECTOR_DOUBLE_H__
+#define __GSL_SORT_VECTOR_DOUBLE_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+#include <gsl/gsl_vector_double.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+void gsl_sort_vector (gsl_vector * v);
+int gsl_sort_vector_index (gsl_permutation * p, const gsl_vector * v);
+
+int gsl_sort_vector_smallest (double * dest, const size_t k, const gsl_vector * v);
+int gsl_sort_vector_largest (double * dest, const size_t k, const gsl_vector * v);
+
+int gsl_sort_vector_smallest_index (size_t * p, const size_t k, const gsl_vector * v);
+int gsl_sort_vector_largest_index (size_t * p, const size_t k, const gsl_vector * v);
+
+__END_DECLS
+
+#endif /* __GSL_SORT_VECTOR_DOUBLE_H__ */
diff --git a/gsl-1.9/sort/gsl_sort_vector_float.h b/gsl-1.9/sort/gsl_sort_vector_float.h
new file mode 100644
index 0000000..a90ae3e
--- /dev/null
+++ b/gsl-1.9/sort/gsl_sort_vector_float.h
@@ -0,0 +1,51 @@
+/* sort/gsl_sort_vector_float.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Thomas Walter, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_SORT_VECTOR_FLOAT_H__
+#define __GSL_SORT_VECTOR_FLOAT_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+#include <gsl/gsl_vector_float.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+void gsl_sort_vector_float (gsl_vector_float * v);
+int gsl_sort_vector_float_index (gsl_permutation * p, const gsl_vector_float * v);
+
+int gsl_sort_vector_float_smallest (float * dest, const size_t k, const gsl_vector_float * v);
+int gsl_sort_vector_float_largest (float * dest, const size_t k, const gsl_vector_float * v);
+
+int gsl_sort_vector_float_smallest_index (size_t * p, const size_t k, const gsl_vector_float * v);
+int gsl_sort_vector_float_largest_index (size_t * p, const size_t k, const gsl_vector_float * v);
+
+__END_DECLS
+
+#endif /* __GSL_SORT_VECTOR_FLOAT_H__ */
diff --git a/gsl-1.9/sort/gsl_sort_vector_int.h b/gsl-1.9/sort/gsl_sort_vector_int.h
new file mode 100644
index 0000000..9c52cbe
--- /dev/null
+++ b/gsl-1.9/sort/gsl_sort_vector_int.h
@@ -0,0 +1,51 @@
+/* sort/gsl_sort_vector_int.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Thomas Walter, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_SORT_VECTOR_INT_H__
+#define __GSL_SORT_VECTOR_INT_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+#include <gsl/gsl_vector_int.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+void gsl_sort_vector_int (gsl_vector_int * v);
+int gsl_sort_vector_int_index (gsl_permutation * p, const gsl_vector_int * v);
+
+int gsl_sort_vector_int_smallest (int * dest, const size_t k, const gsl_vector_int * v);
+int gsl_sort_vector_int_largest (int * dest, const size_t k, const gsl_vector_int * v);
+
+int gsl_sort_vector_int_smallest_index (size_t * p, const size_t k, const gsl_vector_int * v);
+int gsl_sort_vector_int_largest_index (size_t * p, const size_t k, const gsl_vector_int * v);
+
+__END_DECLS
+
+#endif /* __GSL_SORT_VECTOR_INT_H__ */
diff --git a/gsl-1.9/sort/gsl_sort_vector_long.h b/gsl-1.9/sort/gsl_sort_vector_long.h
new file mode 100644
index 0000000..df6eb36
--- /dev/null
+++ b/gsl-1.9/sort/gsl_sort_vector_long.h
@@ -0,0 +1,51 @@
+/* sort/gsl_sort_vector_long.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Thomas Walter, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_SORT_VECTOR_LONG_H__
+#define __GSL_SORT_VECTOR_LONG_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+#include <gsl/gsl_vector_long.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+void gsl_sort_vector_long (gsl_vector_long * v);
+int gsl_sort_vector_long_index (gsl_permutation * p, const gsl_vector_long * v);
+
+int gsl_sort_vector_long_smallest (long * dest, const size_t k, const gsl_vector_long * v);
+int gsl_sort_vector_long_largest (long * dest, const size_t k, const gsl_vector_long * v);
+
+int gsl_sort_vector_long_smallest_index (size_t * p, const size_t k, const gsl_vector_long * v);
+int gsl_sort_vector_long_largest_index (size_t * p, const size_t k, const gsl_vector_long * v);
+
+__END_DECLS
+
+#endif /* __GSL_SORT_VECTOR_LONG_H__ */
diff --git a/gsl-1.9/sort/gsl_sort_vector_long_double.h b/gsl-1.9/sort/gsl_sort_vector_long_double.h
new file mode 100644
index 0000000..b2a23a9
--- /dev/null
+++ b/gsl-1.9/sort/gsl_sort_vector_long_double.h
@@ -0,0 +1,51 @@
+/* sort/gsl_sort_vector_long_double.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Thomas Walter, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_SORT_VECTOR_LONG_DOUBLE_H__
+#define __GSL_SORT_VECTOR_LONG_DOUBLE_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+#include <gsl/gsl_vector_long_double.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+void gsl_sort_vector_long_double (gsl_vector_long_double * v);
+int gsl_sort_vector_long_double_index (gsl_permutation * p, const gsl_vector_long_double * v);
+
+int gsl_sort_vector_long_double_smallest (long double * dest, const size_t k, const gsl_vector_long_double * v);
+int gsl_sort_vector_long_double_largest (long double * dest, const size_t k, const gsl_vector_long_double * v);
+
+int gsl_sort_vector_long_double_smallest_index (size_t * p, const size_t k, const gsl_vector_long_double * v);
+int gsl_sort_vector_long_double_largest_index (size_t * p, const size_t k, const gsl_vector_long_double * v);
+
+__END_DECLS
+
+#endif /* __GSL_SORT_VECTOR_LONG_DOUBLE_H__ */
diff --git a/gsl-1.9/sort/gsl_sort_vector_short.h b/gsl-1.9/sort/gsl_sort_vector_short.h
new file mode 100644
index 0000000..0037754
--- /dev/null
+++ b/gsl-1.9/sort/gsl_sort_vector_short.h
@@ -0,0 +1,51 @@
+/* sort/gsl_sort_vector_short.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Thomas Walter, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_SORT_VECTOR_SHORT_H__
+#define __GSL_SORT_VECTOR_SHORT_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+#include <gsl/gsl_vector_short.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+void gsl_sort_vector_short (gsl_vector_short * v);
+int gsl_sort_vector_short_index (gsl_permutation * p, const gsl_vector_short * v);
+
+int gsl_sort_vector_short_smallest (short * dest, const size_t k, const gsl_vector_short * v);
+int gsl_sort_vector_short_largest (short * dest, const size_t k, const gsl_vector_short * v);
+
+int gsl_sort_vector_short_smallest_index (size_t * p, const size_t k, const gsl_vector_short * v);
+int gsl_sort_vector_short_largest_index (size_t * p, const size_t k, const gsl_vector_short * v);
+
+__END_DECLS
+
+#endif /* __GSL_SORT_VECTOR_SHORT_H__ */
diff --git a/gsl-1.9/sort/gsl_sort_vector_uchar.h b/gsl-1.9/sort/gsl_sort_vector_uchar.h
new file mode 100644
index 0000000..975f624
--- /dev/null
+++ b/gsl-1.9/sort/gsl_sort_vector_uchar.h
@@ -0,0 +1,51 @@
+/* sort/gsl_sort_vector_uchar.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Thomas Walter, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_SORT_VECTOR_UCHAR_H__
+#define __GSL_SORT_VECTOR_UCHAR_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+#include <gsl/gsl_vector_uchar.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+void gsl_sort_vector_uchar (gsl_vector_uchar * v);
+int gsl_sort_vector_uchar_index (gsl_permutation * p, const gsl_vector_uchar * v);
+
+int gsl_sort_vector_uchar_smallest (unsigned char * dest, const size_t k, const gsl_vector_uchar * v);
+int gsl_sort_vector_uchar_largest (unsigned char * dest, const size_t k, const gsl_vector_uchar * v);
+
+int gsl_sort_vector_uchar_smallest_index (size_t * p, const size_t k, const gsl_vector_uchar * v);
+int gsl_sort_vector_uchar_largest_index (size_t * p, const size_t k, const gsl_vector_uchar * v);
+
+__END_DECLS
+
+#endif /* __GSL_SORT_VECTOR_UCHAR_H__ */
diff --git a/gsl-1.9/sort/gsl_sort_vector_uint.h b/gsl-1.9/sort/gsl_sort_vector_uint.h
new file mode 100644
index 0000000..df9e25f
--- /dev/null
+++ b/gsl-1.9/sort/gsl_sort_vector_uint.h
@@ -0,0 +1,51 @@
+/* sort/gsl_sort_vector_uint.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Thomas Walter, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_SORT_VECTOR_UINT_H__
+#define __GSL_SORT_VECTOR_UINT_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+#include <gsl/gsl_vector_uint.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+void gsl_sort_vector_uint (gsl_vector_uint * v);
+int gsl_sort_vector_uint_index (gsl_permutation * p, const gsl_vector_uint * v);
+
+int gsl_sort_vector_uint_smallest (unsigned int * dest, const size_t k, const gsl_vector_uint * v);
+int gsl_sort_vector_uint_largest (unsigned int * dest, const size_t k, const gsl_vector_uint * v);
+
+int gsl_sort_vector_uint_smallest_index (size_t * p, const size_t k, const gsl_vector_uint * v);
+int gsl_sort_vector_uint_largest_index (size_t * p, const size_t k, const gsl_vector_uint * v);
+
+__END_DECLS
+
+#endif /* __GSL_SORT_VECTOR_UINT_H__ */
diff --git a/gsl-1.9/sort/gsl_sort_vector_ulong.h b/gsl-1.9/sort/gsl_sort_vector_ulong.h
new file mode 100644
index 0000000..a1fee7e
--- /dev/null
+++ b/gsl-1.9/sort/gsl_sort_vector_ulong.h
@@ -0,0 +1,51 @@
+/* sort/gsl_sort_vector_ulong.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Thomas Walter, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_SORT_VECTOR_ULONG_H__
+#define __GSL_SORT_VECTOR_ULONG_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+#include <gsl/gsl_vector_ulong.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+void gsl_sort_vector_ulong (gsl_vector_ulong * v);
+int gsl_sort_vector_ulong_index (gsl_permutation * p, const gsl_vector_ulong * v);
+
+int gsl_sort_vector_ulong_smallest (unsigned long * dest, const size_t k, const gsl_vector_ulong * v);
+int gsl_sort_vector_ulong_largest (unsigned long * dest, const size_t k, const gsl_vector_ulong * v);
+
+int gsl_sort_vector_ulong_smallest_index (size_t * p, const size_t k, const gsl_vector_ulong * v);
+int gsl_sort_vector_ulong_largest_index (size_t * p, const size_t k, const gsl_vector_ulong * v);
+
+__END_DECLS
+
+#endif /* __GSL_SORT_VECTOR_ULONG_H__ */
diff --git a/gsl-1.9/sort/gsl_sort_vector_ushort.h b/gsl-1.9/sort/gsl_sort_vector_ushort.h
new file mode 100644
index 0000000..6b4bc16
--- /dev/null
+++ b/gsl-1.9/sort/gsl_sort_vector_ushort.h
@@ -0,0 +1,51 @@
+/* sort/gsl_sort_vector_ushort.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Thomas Walter, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_SORT_VECTOR_USHORT_H__
+#define __GSL_SORT_VECTOR_USHORT_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_permutation.h>
+#include <gsl/gsl_vector_ushort.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+void gsl_sort_vector_ushort (gsl_vector_ushort * v);
+int gsl_sort_vector_ushort_index (gsl_permutation * p, const gsl_vector_ushort * v);
+
+int gsl_sort_vector_ushort_smallest (unsigned short * dest, const size_t k, const gsl_vector_ushort * v);
+int gsl_sort_vector_ushort_largest (unsigned short * dest, const size_t k, const gsl_vector_ushort * v);
+
+int gsl_sort_vector_ushort_smallest_index (size_t * p, const size_t k, const gsl_vector_ushort * v);
+int gsl_sort_vector_ushort_largest_index (size_t * p, const size_t k, const gsl_vector_ushort * v);
+
+__END_DECLS
+
+#endif /* __GSL_SORT_VECTOR_USHORT_H__ */
diff --git a/gsl-1.9/sort/sort.c b/gsl-1.9/sort/sort.c
new file mode 100644
index 0000000..9e86ab0
--- /dev/null
+++ b/gsl-1.9/sort/sort.c
@@ -0,0 +1,114 @@
+/*
+ * Implement Heap sort -- direct and indirect sorting
+ * Based on descriptions in Sedgewick "Algorithms in C"
+ *
+ * Copyright (C) 1999 Thomas Walter
+ *
+ * 18 February 2000: Modified for GSL by Brian Gough
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2, or (at your option) any
+ * later version.
+ *
+ * This source is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_heapsort.h>
+
+static inline void swap (void *base, size_t size, size_t i, size_t j);
+static inline void downheap (void *data, const size_t size, const size_t N, size_t k, gsl_comparison_fn_t compare);
+
+/* Inline swap function for moving objects around */
+
+static inline void
+swap (void *base, size_t size, size_t i, size_t j)
+{
+ register char *a = size * i + (char *) base;
+ register char *b = size * j + (char *) base;
+ register size_t s = size;
+
+ if (i == j)
+ return;
+
+ do
+ {
+ char tmp = *a;
+ *a++ = *b;
+ *b++ = tmp;
+ }
+ while (--s > 0);
+}
+
+#define CMP(data,size,j,k) (compare((char *)(data) + (size) * (j), (char *)(data) + (size) * (k)))
+
+static inline void
+downheap (void *data, const size_t size, const size_t N, size_t k, gsl_comparison_fn_t compare)
+{
+ while (k <= N / 2)
+ {
+ size_t j = 2 * k;
+
+ if (j < N && CMP (data, size, j, j + 1) < 0)
+ {
+ j++;
+ }
+
+ if (CMP (data, size, k, j) < 0)
+ {
+ swap (data, size, j, k);
+ }
+ else
+ {
+ break;
+ }
+
+ k = j;
+ }
+}
+
+void
+gsl_heapsort (void *data, size_t count, size_t size, gsl_comparison_fn_t compare)
+{
+ /* Sort the array in ascending order. This is a true inplace
+ algorithm with N log N operations. Worst case (an already sorted
+ array) is something like 20% slower */
+
+ size_t N;
+ size_t k;
+
+ if (count == 0)
+ {
+ return; /* No data to sort */
+ }
+
+ /* We have n_data elements, last element is at 'n_data-1', first at
+ '0' Set N to the last element number. */
+
+ N = count - 1;
+
+ k = N / 2;
+ k++; /* Compensate the first use of 'k--' */
+ do
+ {
+ k--;
+ downheap (data, size, N, k, compare);
+ }
+ while (k > 0);
+
+ while (N > 0)
+ {
+ /* first swap the elements */
+ swap (data, size, 0, N);
+
+ /* then process the heap */
+ N--;
+
+ downheap (data, size, N, 0, compare);
+ }
+}
diff --git a/gsl-1.9/sort/sortind.c b/gsl-1.9/sort/sortind.c
new file mode 100644
index 0000000..52cdc47
--- /dev/null
+++ b/gsl-1.9/sort/sortind.c
@@ -0,0 +1,101 @@
+/*
+ * Implement Heap sort -- direct and indirect sorting
+ * Based on descriptions in Sedgewick "Algorithms in C"
+ * Copyright (C) 1999 Thomas Walter
+ *
+ * 18 February 2000: Modified for GSL by Brian Gough
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2, or (at your option) any
+ * later version.
+ *
+ * This source is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_heapsort.h>
+
+static inline void downheap (size_t * p, const void *data, const size_t size, const size_t N, size_t k, gsl_comparison_fn_t compare);
+
+#define CMP(data,size,j,k) (compare((const char *)(data) + (size) * (j), (const char *)(data) + (size) * (k)))
+
+static inline void
+downheap (size_t * p, const void *data, const size_t size, const size_t N, size_t k, gsl_comparison_fn_t compare)
+{
+ const size_t pki = p[k];
+
+ while (k <= N / 2)
+ {
+ size_t j = 2 * k;
+
+ if (j < N && CMP (data, size, p[j], p[j + 1]) < 0)
+ {
+ j++;
+ }
+
+ if (CMP (data, size, pki, p[j]) >= 0)
+ {
+ break;
+ }
+
+ p[k] = p[j];
+
+ k = j;
+ }
+
+ p[k] = pki;
+}
+
+int
+gsl_heapsort_index (size_t * p, const void *data, size_t count, size_t size, gsl_comparison_fn_t compare)
+{
+ /* Sort the array in ascending order. This is a true inplace
+ algorithm with N log N operations. Worst case (an already sorted
+ array) is something like 20% slower */
+
+ size_t i, k, N;
+
+ if (count == 0)
+ {
+ return GSL_SUCCESS; /* No data to sort */
+ }
+
+ for (i = 0; i < count; i++)
+ {
+ p[i] = i ; /* set permutation to identity */
+ }
+
+ /* We have n_data elements, last element is at 'n_data-1', first at
+ '0' Set N to the last element number. */
+
+ N = count - 1;
+
+ k = N / 2;
+ k++; /* Compensate the first use of 'k--' */
+ do
+ {
+ k--;
+ downheap (p, data, size, N, k, compare);
+ }
+ while (k > 0);
+
+ while (N > 0)
+ {
+ /* first swap the elements */
+ size_t tmp = p[0];
+ p[0] = p[N];
+ p[N] = tmp;
+
+ /* then process the heap */
+ N--;
+
+ downheap (p, data, size, N, 0, compare);
+ }
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/sort/sortvec.c b/gsl-1.9/sort/sortvec.c
new file mode 100644
index 0000000..e949c71
--- /dev/null
+++ b/gsl-1.9/sort/sortvec.c
@@ -0,0 +1,90 @@
+/*
+ * Implement Heap sort -- direct and indirect sorting
+ * Based on descriptions in Sedgewick "Algorithms in C"
+ *
+ * Copyright (C) 1999 Thomas Walter
+ *
+ * 18 February 2000: Modified for GSL by Brian Gough
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2, or (at your option) any
+ * later version.
+ *
+ * This source is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ */
+
+#include <config.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_sort.h>
+#include <gsl/gsl_sort_vector.h>
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "sortvec_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "sortvec_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "sortvec_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "sortvec_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "sortvec_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "sortvec_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "sortvec_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "sortvec_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "sortvec_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "sortvec_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "sortvec_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
diff --git a/gsl-1.9/sort/sortvec_source.c b/gsl-1.9/sort/sortvec_source.c
new file mode 100644
index 0000000..59dfa63
--- /dev/null
+++ b/gsl-1.9/sort/sortvec_source.c
@@ -0,0 +1,93 @@
+/*
+ * Implement Heap sort -- direct and indirect sorting
+ * Based on descriptions in Sedgewick "Algorithms in C"
+ *
+ * Copyright (C) 1999 Thomas Walter
+ *
+ * 18 February 2000: Modified for GSL by Brian Gough
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2, or (at your option) any
+ * later version.
+ *
+ * This source is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ */
+
+static inline void FUNCTION (my, downheap) (BASE * data, const size_t stride, const size_t N, size_t k);
+
+static inline void
+FUNCTION (my, downheap) (BASE * data, const size_t stride, const size_t N, size_t k)
+{
+ BASE v = data[k * stride];
+
+ while (k <= N / 2)
+ {
+ size_t j = 2 * k;
+
+ if (j < N && data[j * stride] < data[(j + 1) * stride])
+ {
+ j++;
+ }
+
+ if (!(v < data[j * stride])) /* avoid infinite loop if nan */
+ {
+ break;
+ }
+
+ data[k * stride] = data[j * stride];
+
+ k = j;
+ }
+
+ data[k * stride] = v;
+}
+
+void
+TYPE (gsl_sort) (BASE * data, const size_t stride, const size_t n)
+{
+ size_t N;
+ size_t k;
+
+ if (n == 0)
+ {
+ return; /* No data to sort */
+ }
+
+ /* We have n_data elements, last element is at 'n_data-1', first at
+ '0' Set N to the last element number. */
+
+ N = n - 1;
+
+ k = N / 2;
+ k++; /* Compensate the first use of 'k--' */
+ do
+ {
+ k--;
+ FUNCTION (my, downheap) (data, stride, N, k);
+ }
+ while (k > 0);
+
+ while (N > 0)
+ {
+ /* first swap the elements */
+ BASE tmp = data[0 * stride];
+ data[0 * stride] = data[N * stride];
+ data[N * stride] = tmp;
+
+ /* then process the heap */
+ N--;
+
+ FUNCTION (my, downheap) (data, stride, N, 0);
+ }
+}
+
+void
+TYPE (gsl_sort_vector) (TYPE (gsl_vector) * v)
+{
+ TYPE (gsl_sort) (v->data, v->stride, v->size) ;
+}
+
diff --git a/gsl-1.9/sort/sortvecind.c b/gsl-1.9/sort/sortvecind.c
new file mode 100644
index 0000000..a79f906
--- /dev/null
+++ b/gsl-1.9/sort/sortvecind.c
@@ -0,0 +1,90 @@
+/*
+ * Implement Heap sort -- direct and indirect sorting
+ * Based on descriptions in Sedgewick "Algorithms in C"
+ *
+ * Copyright (C) 1999 Thomas Walter
+ *
+ * 18 February 2000: Modified for GSL by Brian Gough
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2, or (at your option) any
+ * later version.
+ *
+ * This source is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ */
+
+#include <config.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_sort.h>
+#include <gsl/gsl_sort_vector.h>
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "sortvecind_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "sortvecind_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "sortvecind_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "sortvecind_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "sortvecind_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "sortvecind_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "sortvecind_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "sortvecind_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "sortvecind_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "sortvecind_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "sortvecind_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
diff --git a/gsl-1.9/sort/sortvecind_source.c b/gsl-1.9/sort/sortvecind_source.c
new file mode 100644
index 0000000..04769ee
--- /dev/null
+++ b/gsl-1.9/sort/sortvecind_source.c
@@ -0,0 +1,106 @@
+/*
+ * Implement Heap sort -- direct and indirect sorting
+ * Based on descriptions in Sedgewick "Algorithms in C"
+ *
+ * Copyright (C) 1999 Thomas Walter
+ *
+ * 18 February 2000: Modified for GSL by Brian Gough
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2, or (at your option) any
+ * later version.
+ *
+ * This source is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ */
+
+static inline void FUNCTION (index, downheap) (size_t * p, const BASE * data, const size_t stride, const size_t N, size_t k);
+
+static inline void
+FUNCTION (index, downheap) (size_t * p, const BASE * data, const size_t stride, const size_t N, size_t k)
+{
+ const size_t pki = p[k];
+
+ while (k <= N / 2)
+ {
+ size_t j = 2 * k;
+
+ if (j < N && data[p[j] * stride] < data[p[j + 1] * stride])
+ {
+ j++;
+ }
+
+ if (!(data[pki * stride] < data[p[j] * stride])) /* avoid infinite loop if nan */
+ {
+ break;
+ }
+
+ p[k] = p[j];
+
+ k = j;
+ }
+
+ p[k] = pki;
+}
+
+void
+FUNCTION (gsl_sort, index) (size_t * p, const BASE * data, const size_t stride, const size_t n)
+{
+ size_t N;
+ size_t i, k;
+
+ if (n == 0)
+ {
+ return; /* No data to sort */
+ }
+
+ /* set permutation to identity */
+
+ for (i = 0 ; i < n ; i++)
+ {
+ p[i] = i ;
+ }
+
+ /* We have n_data elements, last element is at 'n_data-1', first at
+ '0' Set N to the last element number. */
+
+ N = n - 1;
+
+ k = N / 2;
+ k++; /* Compensate the first use of 'k--' */
+ do
+ {
+ k--;
+ FUNCTION (index, downheap) (p, data, stride, N, k);
+ }
+ while (k > 0);
+
+ while (N > 0)
+ {
+ /* first swap the elements */
+ size_t tmp = p[0];
+ p[0] = p[N];
+ p[N] = tmp;
+
+ /* then process the heap */
+ N--;
+
+ FUNCTION (index, downheap) (p, data, stride, N, 0);
+ }
+}
+
+int
+FUNCTION (gsl_sort_vector, index) (gsl_permutation * permutation, const TYPE (gsl_vector) * v)
+{
+ if (permutation->size != v->size)
+ {
+ GSL_ERROR ("permutation and vector lengths are not equal", GSL_EBADLEN);
+ }
+
+ FUNCTION (gsl_sort, index) (permutation->data, v->data, v->stride, v->size) ;
+
+ return GSL_SUCCESS ;
+}
diff --git a/gsl-1.9/sort/subset.c b/gsl-1.9/sort/subset.c
new file mode 100644
index 0000000..436dc7d
--- /dev/null
+++ b/gsl-1.9/sort/subset.c
@@ -0,0 +1,86 @@
+/* sort/subset.c
+ *
+ * Copyright (C) 2001 Brian Gough
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2, or (at your option) any
+ * later version.
+ *
+ * This source is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ */
+
+#include <config.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_sort.h>
+#include <gsl/gsl_sort_vector.h>
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "subset_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "subset_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "subset_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "subset_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "subset_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "subset_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "subset_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "subset_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "subset_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "subset_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "subset_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
diff --git a/gsl-1.9/sort/subset_source.c b/gsl-1.9/sort/subset_source.c
new file mode 100644
index 0000000..8d02426
--- /dev/null
+++ b/gsl-1.9/sort/subset_source.c
@@ -0,0 +1,146 @@
+/* sort/subset_source.c
+ *
+ * Copyright (C) 1999,2000,2001 Thomas Walter, Brian Gough
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2, or (at your option) any
+ * later version.
+ *
+ * This source is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ */
+
+/* find the k-th smallest elements of the vector data, in ascending order */
+
+int
+FUNCTION (gsl_sort, smallest) (BASE * dest, const size_t k,
+ const BASE * src, const size_t stride,
+ const size_t n)
+{
+ size_t i, j;
+ BASE xbound;
+
+ if (k > n)
+ {
+ GSL_ERROR ("subset length k exceeds vector length n", GSL_EINVAL);
+ }
+
+ if (k == 0 || n == 0)
+ {
+ return GSL_SUCCESS;
+ }
+
+ /* take the first element */
+
+ j = 1;
+ xbound = src[0 * stride];
+ dest[0] = xbound;
+
+ /* examine the remaining elements */
+
+ for (i = 1; i < n; i++)
+ {
+ size_t i1;
+
+ BASE xi = src[i * stride];
+
+ if (j < k)
+ {
+ j++;
+ }
+ else if (xi >= xbound)
+ {
+ continue;
+ }
+
+ for (i1 = j - 1; i1 > 0 ; i1--)
+ {
+ if (xi > dest[i1 - 1])
+ break;
+
+ dest[i1] = dest[i1 - 1];
+ }
+
+ dest[i1] = xi;
+
+ xbound = dest[j-1];
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+int
+FUNCTION (gsl_sort_vector,smallest) (BASE * dest, const size_t k,
+ const TYPE (gsl_vector) * v)
+{
+ return FUNCTION (gsl_sort, smallest) (dest, k, v->data, v->stride, v->size);
+}
+
+int
+FUNCTION (gsl_sort, largest) (BASE * dest, const size_t k,
+ const BASE * src, const size_t stride,
+ const size_t n)
+{
+ size_t i, j;
+ BASE xbound;
+
+ if (k > n)
+ {
+ GSL_ERROR ("subset length k exceeds vector length n", GSL_EINVAL);
+ }
+
+ if (k == 0 || n == 0)
+ {
+ return GSL_SUCCESS;
+ }
+
+ /* take the first element */
+
+ j = 1;
+ xbound = src[0 * stride];
+ dest[0] = xbound;
+
+ /* examine the remaining elements */
+
+ for (i = 1; i < n; i++)
+ {
+ size_t i1;
+
+ BASE xi = src[i * stride];
+
+ if (j < k)
+ {
+ j++;
+ }
+ else if (xi <= xbound)
+ {
+ continue;
+ }
+
+ for (i1 = j - 1; i1 > 0 ; i1--)
+ {
+ if (xi < dest[i1 - 1])
+ break;
+
+ dest[i1] = dest[i1 - 1];
+ }
+
+ dest[i1] = xi;
+
+ xbound = dest[j-1];
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+int
+FUNCTION (gsl_sort_vector,largest) (BASE * dest, const size_t k,
+ const TYPE (gsl_vector) * v)
+{
+ return FUNCTION (gsl_sort, largest) (dest, k, v->data, v->stride, v->size);
+}
diff --git a/gsl-1.9/sort/subsetind.c b/gsl-1.9/sort/subsetind.c
new file mode 100644
index 0000000..cc01e99
--- /dev/null
+++ b/gsl-1.9/sort/subsetind.c
@@ -0,0 +1,86 @@
+/* sort/subsetind.c
+ *
+ * Copyright (C) 2001 Brian Gough
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2, or (at your option) any
+ * later version.
+ *
+ * This source is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ */
+
+#include <config.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_sort.h>
+#include <gsl/gsl_sort_vector.h>
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "subsetind_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "subsetind_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "subsetind_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "subsetind_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "subsetind_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "subsetind_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "subsetind_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "subsetind_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "subsetind_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "subsetind_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "subsetind_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
diff --git a/gsl-1.9/sort/subsetind_source.c b/gsl-1.9/sort/subsetind_source.c
new file mode 100644
index 0000000..5505fdf
--- /dev/null
+++ b/gsl-1.9/sort/subsetind_source.c
@@ -0,0 +1,146 @@
+/* sort/subsetind_source.c
+ *
+ * Copyright (C) 1999,2000,2001 Thomas Walter, Brian Gough
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2, or (at your option) any
+ * later version.
+ *
+ * This source is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ */
+
+/* find the k-th smallest elements of the vector data, in ascending order */
+
+int
+FUNCTION (gsl_sort, smallest_index) (size_t * p, const size_t k,
+ const BASE * src, const size_t stride,
+ const size_t n)
+{
+ size_t i, j;
+ BASE xbound;
+
+ if (k > n)
+ {
+ GSL_ERROR ("subset length k exceeds vector length n", GSL_EINVAL);
+ }
+
+ if (k == 0 || n == 0)
+ {
+ return GSL_SUCCESS;
+ }
+
+ /* take the first element */
+
+ j = 1;
+ xbound = src[0 * stride];
+ p[0] = 0;
+
+ /* examine the remaining elements */
+
+ for (i = 1; i < n; i++)
+ {
+ size_t i1;
+
+ BASE xi = src[i * stride];
+
+ if (j < k)
+ {
+ j++;
+ }
+ else if (xi >= xbound)
+ {
+ continue;
+ }
+
+ for (i1 = j - 1; i1 > 0 ; i1--)
+ {
+ if (xi > src[p[i1 - 1] * stride])
+ break;
+
+ p[i1] = p[i1 - 1];
+ }
+
+ p[i1] = i;
+
+ xbound = src[p[j-1] * stride];
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+int
+FUNCTION (gsl_sort_vector,smallest_index) (size_t * p, const size_t k,
+ const TYPE (gsl_vector) * v)
+{
+ return FUNCTION (gsl_sort, smallest_index) (p, k, v->data, v->stride, v->size);
+}
+
+int
+FUNCTION (gsl_sort, largest_index) (size_t * p, const size_t k,
+ const BASE * src, const size_t stride,
+ const size_t n)
+{
+ size_t i, j;
+ BASE xbound;
+
+ if (k > n)
+ {
+ GSL_ERROR ("subset length k exceeds vector length n", GSL_EINVAL);
+ }
+
+ if (k == 0 || n == 0)
+ {
+ return GSL_SUCCESS;
+ }
+
+ /* take the first element */
+
+ j = 1;
+ xbound = src[0 * stride];
+ p[0] = 0;
+
+ /* examine the remaining elements */
+
+ for (i = 1; i < n; i++)
+ {
+ size_t i1;
+
+ BASE xi = src[i * stride];
+
+ if (j < k)
+ {
+ j++;
+ }
+ else if (xi <= xbound)
+ {
+ continue;
+ }
+
+ for (i1 = j - 1; i1 > 0 ; i1--)
+ {
+ if (xi < src[stride * p[i1 - 1]])
+ break;
+
+ p[i1] = p[i1 - 1];
+ }
+
+ p[i1] = i;
+
+ xbound = src[stride * p[j-1]];
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+int
+FUNCTION (gsl_sort_vector,largest_index) (size_t * p, const size_t k,
+ const TYPE (gsl_vector) * v)
+{
+ return FUNCTION (gsl_sort, largest_index) (p, k, v->data, v->stride, v->size);
+}
diff --git a/gsl-1.9/sort/test.c b/gsl-1.9/sort/test.c
new file mode 100644
index 0000000..24d3bc3
--- /dev/null
+++ b/gsl-1.9/sort/test.c
@@ -0,0 +1,140 @@
+/* sort/test.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Thomas Walter, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_heapsort.h>
+#include <gsl/gsl_sort.h>
+#include <gsl/gsl_sort_vector.h>
+#include <gsl/gsl_ieee_utils.h>
+
+size_t urand (size_t);
+
+#include "test_heapsort.c"
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "test_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "test_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "test_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "test_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "test_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "test_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "test_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "test_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "test_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "test_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "test_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
+
+int
+main (void)
+{
+ size_t i, s;
+
+ gsl_ieee_env_setup ();
+
+ /* Test for lengths of 1 ... 31, then 32, 64, 128, 256, ... */
+
+ for (i = 1; i < 1024; i = (i < 32) ? i + 1 : 2 * i)
+ test_heapsort (i);
+
+ for (i = 1; i < 1024; i = (i < 32) ? i + 1 : 2 * i)
+ {
+ for (s = 1; s < 4; s++)
+ {
+ test_sort_vector (i, s);
+ test_sort_vector_float (i, s);
+ test_sort_vector_long_double (i, s);
+ test_sort_vector_ulong (i, s);
+ test_sort_vector_long (i, s);
+ test_sort_vector_uint (i, s);
+ test_sort_vector_int (i, s);
+ test_sort_vector_ushort (i, s);
+ test_sort_vector_short (i, s);
+ test_sort_vector_uchar (i, s);
+ test_sort_vector_char (i, s);
+ }
+ }
+
+ exit (gsl_test_summary ());
+}
+
+size_t
+urand (size_t N)
+{
+ static unsigned long int x = 1;
+ x = (1103515245 * x + 12345) & 0x7fffffffUL;
+ return (size_t) ((x / 2147483648.0) * N);
+}
diff --git a/gsl-1.9/sort/test_heapsort.c b/gsl-1.9/sort/test_heapsort.c
new file mode 100644
index 0000000..a93a7dd
--- /dev/null
+++ b/gsl-1.9/sort/test_heapsort.c
@@ -0,0 +1,183 @@
+/* sort/test_heapsort.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Thomas Walter, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+int cmp_dbl (const void *a, const void *b);
+void test_heapsort (size_t N);
+void initialize (double *data, size_t N);
+void cpy (double *dest, double *src, size_t N);
+void randomize (double *data, size_t n);
+void reverse (double *data, size_t N);
+int check (double *data, double *orig, size_t N);
+int pcheck (size_t * p, double *data, double *orig, size_t N);
+
+void
+test_heapsort (size_t N)
+{
+ int status;
+
+ double *orig = (double *) malloc (N * sizeof (double));
+ double *data = (double *) malloc (N * sizeof (double));
+ size_t *p = (size_t *) malloc (N * sizeof(size_t));
+
+ initialize (orig, N);
+
+ /* Already sorted */
+ cpy (data, orig, N);
+
+ status = gsl_heapsort_index (p, data, N, sizeof (double), (gsl_comparison_fn_t) & cmp_dbl);
+ status |= pcheck (p, data, orig, N);
+ gsl_test (status, "indexing array, n = %u, ordered", N);
+
+ gsl_heapsort (data, N, sizeof (double), (gsl_comparison_fn_t) & cmp_dbl);
+ status = check (data, orig, N);
+
+ gsl_test (status, "sorting, array, n = %u, ordered", N);
+
+ /* Reverse the data */
+
+ cpy (data, orig, N);
+ reverse (data, N);
+
+ status = gsl_heapsort_index (p, data, N, sizeof (double), (gsl_comparison_fn_t) & cmp_dbl);
+ status |= pcheck (p, data, orig, N);
+ gsl_test (status, "indexing array, n = %u, reversed", N);
+
+ gsl_heapsort (data, N, sizeof (double), (gsl_comparison_fn_t) & cmp_dbl);
+ status = check (data, orig, N);
+
+ gsl_test (status, "sorting, array, n = %u, reversed", N);
+
+ /* Perform some shuffling */
+
+ cpy (data, orig, N);
+ randomize (data, N);
+
+ status = gsl_heapsort_index (p, data, N, sizeof (double), (gsl_comparison_fn_t) & cmp_dbl);
+ status |= pcheck (p, data, orig, N);
+ gsl_test (status, "indexing array, n = %u, randomized", N);
+
+ gsl_heapsort (data, N, sizeof (double), (gsl_comparison_fn_t) & cmp_dbl);
+ status = check (data, orig, N);
+
+ gsl_test (status, "sorting, array, n = %u, randomized", N);
+
+ free (orig);
+ free (data);
+ free (p);
+}
+
+void
+initialize (double *data, size_t N)
+{
+ size_t i;
+
+ for (i = 0; i < N; i++)
+ {
+ data[i] = i;
+ }
+}
+
+void
+cpy (double *dest, double *src, size_t N)
+{
+ size_t i;
+
+ for (i = 0; i < N; i++)
+ {
+ dest[i] = src[i];
+ }
+}
+
+void
+randomize (double *data, size_t N)
+{
+ size_t i;
+
+ for (i = 0; i < N; i++)
+ {
+ size_t j = urand (N);
+ double tmp = data[i];
+ data[i] = data[j];
+ data[j] = tmp;
+ }
+}
+
+void
+reverse (double *data, size_t N)
+{
+ size_t i;
+
+ for (i = 0; i < N / 2; i++)
+ {
+ size_t j = N - i - 1;
+
+ {
+ double tmp = data[i];
+ data[i] = data[j];
+ data[j] = tmp;
+ }
+ }
+}
+
+int
+check (double *data, double *orig, size_t N)
+{
+ size_t i;
+
+ for (i = 0; i < N; i++)
+ {
+ if (data[i] != orig[i])
+ {
+ return GSL_FAILURE;
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+pcheck (size_t * p, double *data, double *orig, size_t N)
+{
+ size_t i;
+
+ for (i = 0; i < N; i++)
+ {
+ if (data[p[i]] != orig[i])
+ {
+ return GSL_FAILURE;
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+
+int
+cmp_dbl (const void *a, const void *b)
+{
+ const double x = *(const double *) a;
+ const double y = *(const double *) b;
+ if (x > y)
+ return 1;
+ if (x == y)
+ return 0;
+ else
+ return -1;
+}
diff --git a/gsl-1.9/sort/test_source.c b/gsl-1.9/sort/test_source.c
new file mode 100644
index 0000000..bf2f598
--- /dev/null
+++ b/gsl-1.9/sort/test_source.c
@@ -0,0 +1,292 @@
+/* sort/test_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Thomas Walter, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+void TYPE (test_sort_vector) (size_t N, size_t stride);
+void FUNCTION (my, initialize) (TYPE (gsl_vector) * v);
+void FUNCTION (my, randomize) (TYPE (gsl_vector) * v);
+int FUNCTION (my, check) (TYPE (gsl_vector) * data, TYPE (gsl_vector) * orig);
+int FUNCTION (my, pcheck) (gsl_permutation * p, TYPE (gsl_vector) * data, TYPE (gsl_vector) * orig);
+int FUNCTION (my, scheck) (BASE * x, size_t k, TYPE (gsl_vector) * data);
+int FUNCTION (my, lcheck) (BASE * x, size_t k, TYPE (gsl_vector) * data);
+int FUNCTION (my, sicheck) (size_t * p, size_t k, gsl_permutation * perm,
+ TYPE (gsl_vector) * data);
+int FUNCTION (my, licheck) (size_t * p, size_t k, gsl_permutation * perm,
+ TYPE (gsl_vector) * data);
+
+void
+TYPE (test_sort_vector) (size_t N, size_t stride)
+{
+ int status;
+ size_t k = N/2;
+
+ TYPE (gsl_block) * b1 = FUNCTION (gsl_block, calloc) (N * stride);
+ TYPE (gsl_block) * b2 = FUNCTION (gsl_block, calloc) (N * stride);
+ TYPE (gsl_block) * b3 = FUNCTION (gsl_block, calloc) (N * stride);
+
+ TYPE (gsl_vector) * orig = FUNCTION (gsl_vector, alloc_from_block) (b1, 0, N, stride);
+ TYPE (gsl_vector) * data = FUNCTION (gsl_vector, alloc_from_block) (b2, 0, N, stride);
+ TYPE (gsl_vector) * data2 = FUNCTION (gsl_vector, alloc_from_block) (b3, 0, N, stride);
+
+ BASE * small = malloc(k * sizeof(BASE));
+ BASE * large = malloc(k * sizeof(BASE));
+ size_t * index = malloc(k * sizeof(size_t));
+
+ gsl_permutation *p = gsl_permutation_alloc (N);
+
+ FUNCTION (my, initialize) (orig);
+
+ /* Already sorted */
+ FUNCTION (gsl_vector, memcpy) (data, orig);
+
+ status = FUNCTION (gsl_sort_vector, index) (p, data);
+ status |= FUNCTION (my, pcheck) (p, data, orig);
+ gsl_test (status, "indexing " NAME (gsl_vector) ", n = %u, stride = %u, ordered", N, stride);
+
+ TYPE (gsl_sort_vector) (data);
+ status = FUNCTION (my, check) (data, orig);
+ gsl_test (status, "sorting, " NAME (gsl_vector) ", n = %u, stride = %u, ordered", N, stride);
+
+ FUNCTION (gsl_sort_vector, smallest) (small, k, data);
+ status = FUNCTION (my, scheck) (small, k, orig);
+ gsl_test (status, "smallest, " NAME (gsl_vector) ", n = %u, stride = %u, ordered", N, stride);
+
+ FUNCTION (gsl_sort_vector, largest) (large, k, data);
+ status = FUNCTION (my, lcheck) (large, k, orig);
+ gsl_test (status, "largest, " NAME (gsl_vector) ", n = %u, stride = %u, ordered", N, stride);
+
+ FUNCTION (gsl_sort_vector, smallest_index) (index, k, data);
+ status = FUNCTION (my, sicheck) (index, k, p, data);
+ gsl_test (status, "smallest index, " NAME (gsl_vector) ", n = %u, stride = %u, ordered", N, stride);
+
+ FUNCTION (gsl_sort_vector, largest_index) (index, k, data);
+ status = FUNCTION (my, licheck) (index, k, p, data);
+ gsl_test (status, "largest index, " NAME (gsl_vector) ", n = %u, stride = %u, ordered", N, stride);
+
+ /* Reverse the data */
+
+ FUNCTION (gsl_vector, memcpy) (data, orig);
+ FUNCTION (gsl_vector, reverse) (data);
+
+ status = FUNCTION (gsl_sort_vector, index) (p, data);
+ status |= FUNCTION (my, pcheck) (p, data, orig);
+ gsl_test (status, "indexing " NAME (gsl_vector) ", n = %u, stride = %u, reversed", N, stride);
+
+ TYPE (gsl_sort_vector) (data);
+ status = FUNCTION (my, check) (data, orig);
+ gsl_test (status, "sorting, " NAME (gsl_vector) ", n = %u, stride = %u, reversed", N, stride);
+
+ FUNCTION (gsl_vector, memcpy) (data, orig);
+ FUNCTION (gsl_vector, reverse) (data);
+
+ FUNCTION (gsl_sort_vector, smallest) (small, k, data);
+ status = FUNCTION (my, scheck) (small, k, orig);
+ gsl_test (status, "smallest, " NAME (gsl_vector) ", n = %u, stride = %u, reversed", N, stride);
+
+ FUNCTION (gsl_sort_vector, largest) (large, k, data);
+ status = FUNCTION (my, lcheck) (large, k, orig);
+ gsl_test (status, "largest, " NAME (gsl_vector) ", n = %u, stride = %u, reversed", N, stride);
+
+ FUNCTION (gsl_sort_vector, smallest_index) (index, k, data);
+ status = FUNCTION (my, sicheck) (index, k, p, data);
+ gsl_test (status, "smallest index, " NAME (gsl_vector) ", n = %u, stride = %u, reversed", N, stride);
+
+ FUNCTION (gsl_sort_vector, largest_index) (index, k, data);
+ status = FUNCTION (my, licheck) (index, k, p, data);
+ gsl_test (status, "largest index, " NAME (gsl_vector) ", n = %u, stride = %u, reversed", N, stride);
+
+ /* Perform some shuffling */
+
+ FUNCTION (gsl_vector, memcpy) (data, orig);
+ FUNCTION (my, randomize) (data);
+ FUNCTION (gsl_vector, memcpy) (data2, data);
+
+ status = FUNCTION (gsl_sort_vector, index) (p, data);
+ status |= FUNCTION (my, pcheck) (p, data, orig);
+ gsl_test (status, "indexing " NAME (gsl_vector) ", n = %u, stride = %u, randomized", N, stride);
+
+ TYPE (gsl_sort_vector) (data);
+ status = FUNCTION (my, check) (data, orig);
+ gsl_test (status, "sorting, " NAME (gsl_vector) ", n = %u, stride = %u, randomized", N, stride);
+
+ FUNCTION (gsl_vector, memcpy) (data, data2);
+
+ FUNCTION (gsl_sort_vector, smallest) (small, k, data);
+ status = FUNCTION (my, scheck) (small, k, orig);
+ gsl_test (status, "smallest, " NAME (gsl_vector) ", n = %u, stride = %u, randomized", N, stride);
+
+ FUNCTION (gsl_sort_vector, largest) (large, k, data);
+ status = FUNCTION (my, lcheck) (large, k, orig);
+ gsl_test (status, "largest, " NAME (gsl_vector) ", n = %u, stride = %u, randomized", N, stride);
+
+ FUNCTION (gsl_sort_vector, smallest_index) (index, k, data);
+ status = FUNCTION (my, sicheck) (index, k, p, data);
+ gsl_test (status, "smallest index, " NAME (gsl_vector) ", n = %u, stride = %u, randomized", N, stride);
+
+ FUNCTION (gsl_sort_vector, largest_index) (index, k, data);
+ status = FUNCTION (my, licheck) (index, k, p, data);
+ gsl_test (status, "largest index, " NAME (gsl_vector) ", n = %u, stride = %u, randomized", N, stride);
+
+ FUNCTION (gsl_vector, free) (orig);
+ FUNCTION (gsl_vector, free) (data);
+ FUNCTION (gsl_vector, free) (data2);
+ FUNCTION (gsl_block, free) (b1);
+ FUNCTION (gsl_block, free) (b2);
+ FUNCTION (gsl_block, free) (b3);
+ gsl_permutation_free (p);
+ free (small);
+ free (large);
+ free (index);
+}
+
+
+void
+FUNCTION (my, initialize) (TYPE (gsl_vector) * v)
+{
+ size_t i;
+ ATOMIC k = 0, kk;
+
+ /* Must be sorted initially */
+
+ for (i = 0; i < v->size; i++)
+ {
+ kk = k;
+ k++;
+ if (k < kk) /* prevent overflow */
+ k = kk;
+ FUNCTION (gsl_vector, set) (v, i, k);
+ }
+}
+
+void
+FUNCTION (my, randomize) (TYPE (gsl_vector) * v)
+{
+ size_t i;
+
+ for (i = 0; i < v->size; i++)
+ {
+ size_t j = urand (v->size);
+ FUNCTION (gsl_vector, swap_elements) (v, i, j);
+ }
+}
+
+int
+FUNCTION (my, check) (TYPE (gsl_vector) * data, TYPE (gsl_vector) * orig)
+{
+ size_t i;
+
+ for (i = 0; i < data->size; i++)
+ {
+ if (FUNCTION (gsl_vector, get) (data, i) != FUNCTION (gsl_vector, get) (orig, i))
+ {
+ return GSL_FAILURE;
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+FUNCTION (my, pcheck) (gsl_permutation * p, TYPE (gsl_vector) * data, TYPE (gsl_vector) * orig)
+{
+ size_t i;
+
+ for (i = 0; i < p->size; i++)
+ {
+ if (FUNCTION (gsl_vector, get) (data, p->data[i]) != FUNCTION (gsl_vector, get) (orig, i))
+ {
+ return GSL_FAILURE;
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+FUNCTION (my, scheck) (BASE * x, size_t k, TYPE (gsl_vector) * data)
+{
+ size_t i;
+
+ for (i = 0; i < k; i++)
+ {
+ if (x[i] != FUNCTION (gsl_vector, get) (data, i))
+ {
+ return GSL_FAILURE;
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+
+int
+FUNCTION (my, lcheck) (BASE * x, size_t k, TYPE (gsl_vector) * data)
+{
+ size_t i;
+
+ for (i = 0; i < k; i++)
+ {
+ if (x[i] != FUNCTION (gsl_vector, get) (data, data->size - i - 1))
+ {
+ return GSL_FAILURE;
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+int
+FUNCTION (my, sicheck) (size_t * p1, size_t k, gsl_permutation * p,
+ TYPE (gsl_vector) * data)
+{
+ size_t i;
+
+ for (i = 0; i < k; i++)
+ {
+ if (FUNCTION(gsl_vector,get)(data,p1[i])
+ != FUNCTION(gsl_vector,get)(data, p->data[i]))
+ {
+ return GSL_FAILURE;
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+FUNCTION (my, licheck) (size_t * p1, size_t k, gsl_permutation * p,
+ TYPE (gsl_vector) * data)
+{
+ size_t i;
+
+ for (i = 0; i < k; i++)
+ {
+ if (FUNCTION(gsl_vector,get)(data,p1[i])
+ != FUNCTION(gsl_vector,get)(data, p->data[p->size - i - 1]))
+ {
+ return GSL_FAILURE;
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+
diff --git a/gsl-1.9/specfunc/ChangeLog b/gsl-1.9/specfunc/ChangeLog
new file mode 100644
index 0000000..68223d6
--- /dev/null
+++ b/gsl-1.9/specfunc/ChangeLog
@@ -0,0 +1,620 @@
+2007-02-17 Brian Gough <bjg@network-theory.co.uk>
+
+ * log.c (gsl_sf_log_e): removed HIDE_INLINE_STATIC
+
+ * exp.c (gsl_sf_exp_e): removed HIDE_INLINE_STATIC
+
+2007-02-14 Brian Gough <bjg@network-theory.co.uk>
+
+ * mathieu_charv.c: made solve_cubic static
+
+2007-02-12 Brian Gough <bjg@network-theory.co.uk>
+
+ * mathieu_charv.c (figi): ensure that e[ii] is set when
+ e2[ii]==0.0 and there is no error condition, as per the original
+ eispack routine
+
+2007-02-09 Brian Gough <bjg@network-theory.co.uk>
+
+ * ellint.c (gsl_sf_ellint_F_e): do argument reduction for phi>pi/2
+ (gsl_sf_ellint_E_e): do argument reduction for phi>pi/2
+ (gsl_sf_ellint_P_e): do argument reduction for phi>pi/2
+ (gsl_sf_ellint_D_e): do argument reduction for phi>pi/2
+ (gsl_sf_ellint_Dcomp_e): added complete D integral
+ (gsl_sf_ellint_Pcomp_e): added complete P integral
+
+2007-01-31 Brian Gough <bjg@network-theory.co.uk>
+
+ * beta.c (gsl_sf_lnbeta_sgn_e): added to support calculations with
+ negative a,b
+ (gsl_sf_lnbeta_e): rewritten in terms of gsl_sf_lnbeta_sgn_e
+ (gsl_sf_beta_e): handle negative a,b
+
+ * gamma.c (gsl_sf_lngamma_sgn_e): make error calculations an exact
+ copy of gsl_sf_lngamma_e (these functions could be merged to avoid
+ duplication)
+
+2007-01-29 Brian Gough <bjg@network-theory.co.uk>
+
+ * test_legendre.c (test_legendre): added extra test cases for
+ underflow
+
+2007-01-26 Brian Gough <bjg@network-theory.co.uk>
+
+ * expint.c (expint_E2_impl): handle x==0.0 as a special case
+ (expint_E2_impl): corrected error term
+
+ * gsl_sf_log.h: removed inline version of log
+
+ * gsl_sf_exp.h: removed inline version of exp
+
+2007-01-23 Brian Gough <bjg@network-theory.co.uk>
+
+ * hyperg_1F1.c (hyperg_1F1_1_series): increase accuracy by factor
+ of 4 in sum, tighter convergence condition, increase error
+ estimate to allow for accumulated roundoff
+ (hyperg_1F1_1): use series when |x| > |b|
+ (gsl_sf_hyperg_1F1_e): only use Kummer when |x| < 100 otherwise
+ exponential takes extreme value
+
+ * hyperg.c (gsl_sf_hyperg_1F1_series_e): allow 10000 iterations in
+ series to extend valid range
+ (gsl_sf_hyperg_1F1_series_e): increase accuracy by factor of 4 in
+ sum, tighter convergence condition
+
+2007-01-19 Brian Gough <bjg@network-theory.co.uk>
+
+ * laguerre.c (laguerre_large_n): use the second term in the
+ asymptotic expansion from Slater, p.73.
+
+2007-01-17 Brian Gough <bjg@network-theory.co.uk>
+
+ * hyperg_1F1.c (hyperg_1F1_largebx): asymptotic expansion for
+ large b and x, with |x|<|b| from Slater 4.3.7
+ (hyperg_1F1_1): use new asymptotic expansion for |x|<|b|
+ (hyperg_1F1_small_a_bgt0): use new asymptotic expansion for |x|<|b|
+ (hyperg_1F1_renorm_b0): add neglected terms in expansion for AS13.3.7
+
+2007-01-14 Brian Gough <bjg@network-theory.co.uk>
+
+ * legendre_poly.c (gsl_sf_legendre_sphPlm_e): added explicit
+ computation of error term to allow for case when final term is
+ zero.
+
+2007-01-12 Brian Gough <bjg@network-theory.co.uk>
+
+ * trig.c (gsl_sf_angle_restrict_symm_err_e): compute edge cases
+ more reliably, return NaN when total loss of precision
+ (gsl_sf_angle_restrict_pos_err_e): as above
+
+ * legendre_poly.c (gsl_sf_legendre_Pl_e): improve error estimate
+ for large l by including rounding error at each step of recurrence
+
+2006-10-03 Brian Gough <bjg@network-theory.co.uk>
+
+ * poch.c (gsl_sf_lnpoch_e, gsl_sf_lnpoch_sgn_e): corrected
+ result->val to 0.0 for x==0, previously returned incorrect value
+ 1.0
+
+2006-09-24 Brian Gough <bjg@network-theory.co.uk>
+
+ * laguerre.c (laguerre_large_n): work with small angles to avoid
+ cancellation error, computer angular reduction exactly for integer
+ eta.
+
+2006-09-22 Brian Gough <bjg@network-theory.co.uk>
+
+ * zeta.c (gsl_sf_zeta_e): make sin_term exactly zero for negative
+ even integers
+ (gsl_sf_zetam1_int_e): return value is -1 for zetam1_int with
+ negative even integers
+
+2006-03-26 Brian Gough <bjg@network-theory.co.uk>
+
+ * fermi_dirac.c (fd_neg): initialize s to zero (avoid spurious
+ warning from compiler)
+
+2006-02-23 Brian Gough <bjg@network-theory.co.uk>
+
+ * coulomb.c (gsl_sf_coulomb_wave_FG_e): fixed sign of F_lam_min,
+ covers case when k_lam_G is nonzero and F_lam_min and F_lam differ
+ in sign.
+
+2006-01-21 Brian Gough <bjg@network-theory.co.uk>
+
+ * synchrotron.c (gsl_sf_synchrotron_1_e): added first order
+ correction term for the taylor expansion
+ (gsl_sf_synchrotron_2_e): added first order correction term for
+ the taylor expansion
+
+2006-01-20 Brian Gough <bjg@network-theory.co.uk>
+
+ * bessel_j.c (gsl_sf_bessel_jl_e): limit the use of
+ gsl_sf_bessel_Jnu_asympx_e to the range x>100*l*l to satisfy
+ the requirement x>>l*l in the asymptotic expansion
+
+ * bessel_In.c (gsl_sf_bessel_In_scaled_e): limit the use of
+ gsl_sf_bessel_I_CF1_ser to the region where the continued
+ converges with the allowed 20000 terms (|x|<1e7)
+
+2005-12-20 Brian Gough <bjg@network-theory.co.uk>
+
+ * debye.c (gsl_sf_debye_5_e, gsl_sf_debye_6_e): added n=5,6
+ (R. J. Mathar)
+
+2005-11-15 Brian Gough <bjg@network-theory.co.uk>
+
+ * dilog.c (dilog_xge0): fix calculation of error estimate
+
+2005-08-04 Brian Gough <bjg@network-theory.co.uk>
+
+ * coulomb.c (gsl_sf_coulomb_wave_sphF_array): fix warning about
+ variable shadowing for k
+
+2005-07-29 Brian Gough <bjg@network-theory.co.uk>
+
+ * gamma_inc.c (gsl_sf_gamma_inc_Q_e): use continued fraction close
+ to peak of the integrand x > a - sqrt(a)
+
+2005-07-28 Brian Gough <bjg@network-theory.co.uk>
+
+ * elljac.c (gsl_sf_elljac_e): use separate iterations to avoid
+ division by zero, new algorithm from Bulirsch avoids inverse trig
+ functions.
+
+2005-07-03 Brian Gough <bjg@network-theory.co.uk>
+
+ * legendre_poly.c (gsl_sf_legendre_sphPlm_e): compute exponential
+ internally to avoid underflow error when calling gsl_sf_exp_err
+
+2005-07-02 Brian Gough <bjg@network-theory.co.uk>
+
+ * bessel_i.c (gsl_sf_bessel_il_scaled_array): handle x==0 as a
+ special case
+
+ * bessel_k.c (gsl_sf_bessel_kl_scaled_array): added lmax==0 as a
+ special case
+
+ * bessel_y.c (gsl_sf_bessel_yl_array): added lmax==0 as a special
+ case
+
+ * transport.c (gsl_sf_transport_2_e): improve error estimate for
+ small x
+
+2005-06-26 Brian Gough <bjg@network-theory.co.uk>
+
+ * test_sf.c (test_jac): added tests over the full period for
+ elljac functions
+
+2005-05-23 Brian Gough <bjg@network-theory.co.uk>
+
+ * test_bessel.c (test_bessel): added test for steed(99,1,...)
+
+ * legendre_H3d.c (legendre_H3d_CF1): use hypot
+ (legendre_H3d_CF1_ser): use hypot
+ (gsl_sf_legendre_H3d_e): use hypot
+ (gsl_sf_legendre_H3d_e): use hypot
+ (gsl_sf_legendre_H3d_array): use hypot
+
+ * dilog.c (dilogc_unitdisk): use hypot
+
+ * coulomb.c (gsl_sf_coulomb_CL_array): use hypot
+ (coulomb_F_recur): use hypot
+ (coulomb_G_recur): use hypot
+ (coulomb_jwkb): use hypot
+ (gsl_sf_coulomb_wave_F_array): use hypot
+ (gsl_sf_coulomb_wave_FG_array): use hypot
+ (gsl_sf_coulomb_wave_FGp_array): use hypot
+
+ * bessel_j.c (gsl_sf_bessel_jl_steed_array): use hypot
+
+ * bessel.c (gsl_sf_bessel_Inu_scaled_asymp_unif_e): use hypot
+ (gsl_sf_bessel_Knu_scaled_asymp_unif_e): use hypot
+
+2005-03-02 Brian Gough <bjg@network-theory.co.uk>
+
+ * coulomb_bound.c (gsl_sf_hydrogenicR_e): don't check for
+ underflow when function is known to be zero (e.g. r=0 l>0 or at
+ zeroes of the laguerre polynomial).
+
+2004-12-29 Brian Gough <bjg@network-theory.co.uk>
+
+ * dilog.c (gsl_sf_complex_dilog_e): use const consistently in
+ arguments of declaration and definition
+ (gsl_sf_complex_dilog_xy_e): as above
+
+2004-12-26 Brian Gough <bjg@network-theory.co.uk>
+
+ * gamma_inc.c (gamma_inc_D): improve error estimate for case of
+ u=x/a to include cancellation errors and only use it when x < 0.5*a
+ since the cancellation errors are significant for x/a ~ 1
+
+2004-12-23 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_sf_coupling.h: fixed declaration to
+ gsl_sf_coupling_6j_INCORRECT instead of
+ gsl_sf_coupling_INCORRECT_6j
+
+2004-11-12 Brian Gough <bjg@network-theory.co.uk>
+
+ * psi.c (gsl_sf_psi_1): added missing function definition
+ gsl_sf_psi_1
+
+2004-10-11 Brian Gough <bjg@network-theory.co.uk>
+
+ * expint.c (gsl_sf_expint_Ei_scaled): fixed call to incorrect
+ function gsl_sf_expint_Ei_e
+
+2004-06-03 Brian Gough <bjg@network-theory.co.uk>
+
+ * psi.c (psi_n_xg0): added missing return type int
+
+2003-11-30 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_sf_log.h: added missing headers for inline functions
+
+2003-08-11 Brian Gough <bjg@network-theory.co.uk>
+
+ * test_sf.c: added preprocessor definitions TEST_FACTOR and
+ TEST_SIGMA to allow larger tolerances on released versions (to
+ reduce the number of spurious bug reports).
+
+2003-07-24 Brian Gough <bjg@network-theory.co.uk>
+
+ * gamma.c (gsl_sf_choose_e): declare k as unsigned int instead of
+ int
+ (gsl_sf_gamma_e): avoid shadowed declaration of sgn
+
+ * bessel_sequence.c (gsl_sf_bessel_sequence_Jnu_e): declare i as
+ size_t instead of int
+
+2003-06-11 Brian Gough <bjg@network-theory.co.uk>
+
+ * coupling.c (gsl_sf_coupling_6j_INCORRECT_e): fixed typo in test
+ for two_jf < 0
+ (gsl_sf_coupling_6j_e): moved the implementation from the
+ INCORRECT function into the correct function
+
+2003-06-05 Brian Gough <bjg@network-theory.co.uk>
+
+ * test_sf.c (test_coupling): added some regression tests for
+ coupling functions
+
+2003-06-02 Brian Gough <bjg@network-theory.co.uk>
+
+ * gamma_inc.c (gamma_inc_D): handle x<a, a>10 as a special case
+
+2003-04-18 Brian Gough <bjg@network-theory.co.uk>
+
+ * gamma.c (gsl_sf_gammainv_e): handle any singularities in
+ gamma(x) up front and return zero directly
+
+2003-04-12 Brian Gough <bjg@network-theory.co.uk>
+
+ * psi.c: changed value of psi(1,1) in table psi_1_table to be
+ positive ((-)^2 * 1! * zeta(2)), in accordance with Abramowitz &
+ Stegun 6.4.2.
+
+2003-04-08 G. Jungman
+
+ * erfc.c, gsl_sf_erf.h: added gsl_sf_hazard_e() and
+ gsl_sf_hazard() functions
+
+2003-04-07 G. Jungman
+
+ * gamma_inc.c, gsl_sf_gamma.h: added gsl_sf_gamma_inc_e() and
+ gsl_sf_gamma_inc(), implmentations of the non-normalized incomplete
+ gamma function
+
+2003-03-09 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_sf_legendre.h: added missing const to formal parameter on
+ gsl_sf_legendre_sphPlm_deriv_array
+
+2003-01-25 Brian Gough <brian.gough@network-theory.co.uk>
+
+ * test_gamma.c (test_gamma): added a test for
+ gamma_inc_P(10,1e-16) (BUG#12)
+
+Sat Sep 7 15:56:15 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * test_sf.h (TEST_FACTOR): include an overall factor in the test
+ tolerances, otherwise there are too many bug reports for minor
+ failures.
+
+Sun Sep 1 17:34:27 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * test_legendre.c (test_legendre): increased tolerance on test
+
+Sat Jul 13 23:11:37 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * ellint.c (gsl_sf_ellint_Kcomp_e): improved error estimate to
+ take cancellation of y=1-k^2 into account near k=1
+
+Sun Jul 7 21:39:12 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * test_bessel.c (test_bessel): increased tolerance on test of
+ bessel_Jn_array
+
+Tue May 28 21:04:29 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * psi.c (gsl_sf_psi_1piy_e): changed log(y) to log(ay) since
+ function is even and can be extended to negative y
+
+Mon Jan 28 19:02:42 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * gamma_inc.c (gamma_inc_Q_CF): express 'small' constant in terms
+ of GSL_DBL_EPSILON
+ (gamma_inc_Q_CF): patch for more reliable series from Hans Plesser
+
+Sat Jan 26 17:33:29 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * test_gamma.c (test_gamma): increased tolerance on a test
+
+ * test_hyperg.c (test_hyperg): increased tolerance on a couple of
+ tests
+
+Fri Jan 18 15:12:30 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * test_airy.c (test_airy): increased tolerance on test
+
+Tue Jan 8 14:31:04 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * test_legendre.c (test_legendre): increased tolerance by one
+ level on _array tests
+
+ * hyperg_1F1.c (hyperg_1F1_small_a_bgt0): fix branch for a==1
+
+Fri Dec 7 12:38:40 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * laguerre.c (laguerre_n_cp): catch internal error, not global
+ error
+
+ * error.h (INTERNAL_OVERFLOW_ERROR): added internal error macros
+ which do not call the error handler.
+
+Wed Dec 5 19:25:26 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * gamma.c (gamma_xgthalf): return gamma(x) exactly when x is an
+ integer
+
+ * hyperg_1F1.c (hyperg_1F1_ab_posint): fix bug in recurrence
+ initialisation, as done for hyperg_1F1_ab_pos
+
+Thu Oct 18 11:37:25 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * coulomb.c (gsl_sf_coulomb_CL_array): renamed from
+ gsl_sf_coulomb_CL_list for consistency
+
+Sat Oct 13 15:55:56 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * cheb_eval.c (cheb_eval_e): keep track of cancellation error to
+ prevent underestimates of total error.
+
+Fri Oct 12 16:39:27 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * test_hyperg.c (test_hyperg): increased tolerance from TOL0 to
+ TOL1 on one test to allow it to pass under different optimizations
+
+Thu Oct 11 14:21:34 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * gegenbauer.c (gsl_sf_gegenpoly_n_e): initialize variable gk to
+ zero to avoid warning
+
+ * bessel_i.c (gsl_sf_bessel_il_scaled_e): initialize variable
+ iellm1 to zero to avoid warning
+
+ * bessel_Jnu.c (gsl_sf_bessel_Jnu_e): initialize variable Ynp1 to
+ zero to avoid warning
+
+ * legendre_poly.c (gsl_sf_legendre_sphPlm_e): initialize variables
+ p_ell, y_ell to zero to avoid warning
+
+Thu Sep 6 10:38:51 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * clausen.c: added missing initialiser to cheb_series struct
+
+ * pow_int.c (gsl_sf_pow_int_e): handle the case x == 0, n < 0
+
+ * legendre_poly.c (gsl_sf_legendre_array_size): added missing
+ static version of this inline function
+
+Wed Aug 15 20:18:43 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * hyperg_1F1.c (hyperg_1F1_ab_pos): fix bug in recurrence
+ initialisation
+ (hyperg_1F1_ab_neg): if all else fails, try the series.
+
+Wed Aug 8 19:55:34 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * test_sf.c (test_coupling): used analytic expressions for the
+ exact values to problems with insufficient precision
+
+Thu Jul 12 15:25:04 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * test_legendre.c (test_legendre): corrected tests to use exact
+ floating point arguments near singularities.
+
+ * legendre_Qn.c (gsl_sf_legendre_Q0_e): removed unnecessary error
+ terms that I added
+ (gsl_sf_legendre_Q1_e): removed unnecessary error terms that I
+ added
+
+Wed Jul 11 16:06:45 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * error.h: moved domain, overflow and underflow errors into
+ macros, return Nan for domain error, Inf for overflow.
+
+Tue Jul 10 22:00:55 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * erfc.c (gsl_sf_log_erfc_e): introduce an additional log(erfc)
+ branch to prevent loss of accuracy for small x
+
+ * test_sf.c (test_zeta): increased tolerance on zeta function test
+ to take into account differences in rounding
+
+2001-07-10 Brian Gough <bjg@hppav.local>
+
+ * legendre_Qn.c (gsl_sf_legendre_Q0_e): use (log1p(x) - log1p(-x))
+ instead of log((1+x)/(1-x)), for accuracy
+ (gsl_sf_legendre_Q1_e): use (log1p(x) - log1p(-x)) instead of
+ log((1+x)/(1-x)), for accuracy
+ (gsl_sf_legendre_Q0_e): improve error estimate near singular
+ points
+ (gsl_sf_legendre_Q1_e): improve error estimate near singular
+ points
+ (gsl_sf_legendre_Q0_e): fixed incorrect factor of 2 in asymptotic
+ expansion
+
+ * check.h (CHECK_UNDERFLOW): provide macro for checking results
+ for underflow
+
+Fri Jul 6 20:16:19 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * zeta.c (riemann_zeta1m_slt0): added a function to compute
+ zeta(1-s) without loss of accuracy for s near zero, as used by the
+ reflection formula. This fixes a bug in the accuracy of results
+ of zeta(-x) for small x, where loss of precision previously
+ occurred by evaluating 1-x.
+
+2001-07-06 Brian Gough <bjg@network-theory.co.uk>
+
+ * bessel_I0.c (gsl_sf_bessel_I0_scaled_e): added missing scaling
+ factor of exp(-x) for case x<2sqrt(epsilon)
+
+Thu Jul 5 16:16:13 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * erfc.c (gsl_sf_erfc_e): corrected case of -10<x<-5 to take into
+ account that chebyshev fit is defined in terms of positive x.
+
+Tue Jul 3 12:09:33 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * eval.h (EVAL_DOUBLE): avoid returning the status value as a
+ numerical result
+
+2001-06-28 Brian Gough <bjg@network-theory.co.uk>
+
+ * elementary.c (gsl_sf_multiply_e): use GSL_COERCE_DBL macro to
+ deal with extended register problem
+
+ * coupling.c: include stdlib.h for prototype of abs()
+
+Wed Jun 27 21:20:22 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * test_sf.c (test_fermidirac): increased tolerance on test of
+ gsl_sf_fermi_dirac_int(9,500) by factor of two to allow for MSVC
+
+Tue Jun 26 12:10:17 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_sf_gamma.h: added const to prototype, to match function
+ definition
+
+Sun May 6 13:01:01 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * test_sf.c: initialize message_buff to null string to prevent
+ random segmentation faults
+
+ * test_sf.h: simplified test macros to reduce stack usage
+
+Mon Apr 30 12:38:15 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * airy_zero.c bessel_zero.c: zeros are now counted using an
+ unsigned int
+
+ * poly.c: moved poly_eval function into poly/ directory
+
+Wed Apr 25 17:28:48 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * trig.c (gsl_sf_polar_to_rect): dropped _e from polar/rect
+ conversion functions
+
+Tue Apr 24 17:05:22 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * split out chebyshev functions into their own cheb/ directory,
+ leaving behind an internal cheb struct and cheb evaluation
+ function.
+
+Mon Apr 23 10:21:06 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * changed tests for EFAULT into a commented-out macro, since
+ EFAULT should only apply to invalid non-null pointers, but it
+ might be useful to keep the tests around for debugging in this
+ directory.
+
+ * unified error handling conventions to _e for error handling
+ functions and no suffix for plain functions, so _impl functions
+ are no longer needed.
+
+1999-08-02 Mark Galassi <rosalia@lanl.gov>
+
+ * fermi_dirac.c: took out the use of some "const int" constants
+ which were being used to size arrays, since this is not portable
+ (thanks to Bernd Petrovitsch <bernd@ict.tuwien.ac.at> for pointing
+ this out).
+
+1999-01-02 Mark Galassi <rosalia@cygnus.com>
+
+ * trig.c (gsl_sf_rect_to_polar_impl): introduced an #ifdef
+ HAVE_HYPOT for systems that do not have the hypot() routine.
+
+Sun Feb 14 20:59:50 1999 Brian Gough <bjg@netsci.freeserve.co.uk>
+
+ * Makefile.am (include_HEADERS): added gsl_sf_result.h
+
+1998-12-05 Mark Galassi <rosalia@cygnus.com>
+
+ * Makefile.am: t-erf.c was commented out, which is a problem
+ (pointed out by automake-1.3b). Moved the commented-out t-erf.c
+ line to the end of the long list of files.
+
+ * legendre_poly.c (gsl_sf_legendre_Pl_impl):
+ * legendre_con.c (gsl_sf_conicalP_xgt1_neg_mu_largetau_impl):
+ added an ugly fix to the invocation of gsl_sf_bessel_Jn_impl() to
+ give it two bogus arguments so that it builds. I hope Jerry fixes
+ it up soon!
+
+ * gsl_sf_airy.h: added an include of gsl_precision.h so that
+ gsl_prec_t is defined.
+
+Tue Nov 17 17:29:31 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * added #include <config.h> to all top-level source files
+
+ * chebyshev.c (gsl_sf_cheb_eval_n): changed local gslMIN and
+ gslMAX to the standard GSL_MIN and GSL_MAX macros
+
+Tue Aug 18 13:36:15 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * coulomb.c (C0sq): changed to using gsl_sf_expm1_impl instead of
+ expm1, since the latter is a GNU extension.
+
+Mon Aug 3 14:43:16 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * bessel_amp_phase.h: undefined consts are now declared extern
+
+Mon Jul 13 12:40:27 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * gamma.c: changed all the factorial functions to take unsigned
+ int arguments, since negative values are not allowed.
+ (gsl_sf_choose): fixed off by one error in call to factorial.
+
+Sun Jul 12 13:21:41 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * gsl_sf_legendre.h, gsl_sf_poly.h, gsl_sf_pow_int.h: added
+ HAVE_INLINE around some inline definitions in the header files
+
+ * gamma.c: implemented the natural versions of gsl_sf_lnchoose and
+ gsl_sf_choose.
+
+Wed Apr 15 21:27:48 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * added the return code as the second argument of GSL_WARNING, so
+ we can filter on the error number or output a standard message for
+ each one.
+
+1998-02-02 Mark Galassi <rosalia@cygnus.com>
+
+ * Makefile.am (include_HEADERS): added gsl_specfunc.h so it gets
+ into the distribution.
+ (INCLUDES): added -I$(top_srcdir) so that bessel.c can find
+ gsl_math.h
diff --git a/gsl-1.9/specfunc/Makefile.am b/gsl-1.9/specfunc/Makefile.am
new file mode 100644
index 0000000..b41d2ed
--- /dev/null
+++ b/gsl-1.9/specfunc/Makefile.am
@@ -0,0 +1,19 @@
+noinst_LTLIBRARIES = libgslspecfunc.la
+
+pkginclude_HEADERS = gsl_sf.h gsl_sf_airy.h gsl_sf_bessel.h gsl_sf_clausen.h gsl_sf_coulomb.h gsl_sf_coupling.h gsl_sf_dawson.h gsl_sf_debye.h gsl_sf_dilog.h gsl_sf_elementary.h gsl_sf_ellint.h gsl_sf_elljac.h gsl_sf_erf.h gsl_sf_exp.h gsl_sf_expint.h gsl_sf_fermi_dirac.h gsl_sf_gamma.h gsl_sf_gegenbauer.h gsl_sf_hyperg.h gsl_sf_laguerre.h gsl_sf_lambert.h gsl_sf_legendre.h gsl_sf_log.h gsl_sf_mathieu.h gsl_sf_pow_int.h gsl_sf_psi.h gsl_sf_result.h gsl_sf_synchrotron.h gsl_sf_transport.h gsl_sf_trig.h gsl_sf_zeta.h gsl_specfunc.h
+
+noinst_HEADERS = bessel_amp_phase.h bessel_olver.h bessel_temme.h bessel.h hyperg.h legendre.h eval.h chebyshev.h cheb_eval.c cheb_eval_mode.c check.h error.h
+
+INCLUDES= -I$(top_builddir)
+
+libgslspecfunc_la_SOURCES = airy.c airy_der.c airy_zero.c atanint.c bessel.c bessel.h bessel_I0.c bessel_I1.c bessel_In.c bessel_Inu.c bessel_J0.c bessel_J1.c bessel_Jn.c bessel_Jnu.c bessel_K0.c bessel_K1.c bessel_Kn.c bessel_Knu.c bessel_Y0.c bessel_Y1.c bessel_Yn.c bessel_Ynu.c bessel_amp_phase.c bessel_amp_phase.h bessel_i.c bessel_j.c bessel_k.c bessel_olver.c bessel_temme.c bessel_y.c bessel_zero.c bessel_sequence.c beta.c beta_inc.c clausen.c coulomb.c coupling.c coulomb_bound.c dawson.c debye.c dilog.c elementary.c ellint.c elljac.c erfc.c exp.c expint.c expint3.c fermi_dirac.c gegenbauer.c gamma.c gamma_inc.c hyperg_0F1.c hyperg_2F0.c hyperg_1F1.c hyperg_2F1.c hyperg_U.c hyperg.c laguerre.c lambert.c legendre_H3d.c legendre_Qn.c legendre_con.c legendre_poly.c log.c mathieu_angfunc.c mathieu_charv.c mathieu_coeff.c mathieu_radfunc.c mathieu_workspace.c poch.c pow_int.c psi.c recurse.h result.c shint.c sinint.c synchrotron.c transport.c trig.c zeta.c
+
+TESTS = $(check_PROGRAMS)
+
+check_PROGRAMS = test
+
+test_LDADD = libgslspecfunc.la ../eigen/libgsleigen.la ../linalg/libgsllinalg.la ../sort/libgslsort.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../block/libgslblock.la ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+
+test_SOURCES = test_sf.c test_sf.h test_airy.c test_bessel.c test_coulomb.c test_dilog.c test_gamma.c test_hyperg.c test_legendre.c test_mathieu.c
+
+
diff --git a/gsl-1.9/specfunc/Makefile.in b/gsl-1.9/specfunc/Makefile.in
new file mode 100644
index 0000000..9964698
--- /dev/null
+++ b/gsl-1.9/specfunc/Makefile.in
@@ -0,0 +1,569 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = test$(EXEEXT)
+subdir = specfunc
+DIST_COMMON = $(noinst_HEADERS) $(pkginclude_HEADERS) \
+ $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog TODO
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgslspecfunc_la_LIBADD =
+am_libgslspecfunc_la_OBJECTS = airy.lo airy_der.lo airy_zero.lo \
+ atanint.lo bessel.lo bessel_I0.lo bessel_I1.lo bessel_In.lo \
+ bessel_Inu.lo bessel_J0.lo bessel_J1.lo bessel_Jn.lo \
+ bessel_Jnu.lo bessel_K0.lo bessel_K1.lo bessel_Kn.lo \
+ bessel_Knu.lo bessel_Y0.lo bessel_Y1.lo bessel_Yn.lo \
+ bessel_Ynu.lo bessel_amp_phase.lo bessel_i.lo bessel_j.lo \
+ bessel_k.lo bessel_olver.lo bessel_temme.lo bessel_y.lo \
+ bessel_zero.lo bessel_sequence.lo beta.lo beta_inc.lo \
+ clausen.lo coulomb.lo coupling.lo coulomb_bound.lo dawson.lo \
+ debye.lo dilog.lo elementary.lo ellint.lo elljac.lo erfc.lo \
+ exp.lo expint.lo expint3.lo fermi_dirac.lo gegenbauer.lo \
+ gamma.lo gamma_inc.lo hyperg_0F1.lo hyperg_2F0.lo \
+ hyperg_1F1.lo hyperg_2F1.lo hyperg_U.lo hyperg.lo laguerre.lo \
+ lambert.lo legendre_H3d.lo legendre_Qn.lo legendre_con.lo \
+ legendre_poly.lo log.lo mathieu_angfunc.lo mathieu_charv.lo \
+ mathieu_coeff.lo mathieu_radfunc.lo mathieu_workspace.lo \
+ poch.lo pow_int.lo psi.lo result.lo shint.lo sinint.lo \
+ synchrotron.lo transport.lo trig.lo zeta.lo
+libgslspecfunc_la_OBJECTS = $(am_libgslspecfunc_la_OBJECTS)
+am_test_OBJECTS = test_sf.$(OBJEXT) test_airy.$(OBJEXT) \
+ test_bessel.$(OBJEXT) test_coulomb.$(OBJEXT) \
+ test_dilog.$(OBJEXT) test_gamma.$(OBJEXT) \
+ test_hyperg.$(OBJEXT) test_legendre.$(OBJEXT) \
+ test_mathieu.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = libgslspecfunc.la ../eigen/libgsleigen.la \
+ ../linalg/libgsllinalg.la ../sort/libgslsort.la \
+ ../matrix/libgslmatrix.la ../vector/libgslvector.la \
+ ../blas/libgslblas.la ../cblas/libgslcblas.la \
+ ../block/libgslblock.la ../complex/libgslcomplex.la \
+ ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la \
+ ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgslspecfunc_la_SOURCES) $(test_SOURCES)
+DIST_SOURCES = $(libgslspecfunc_la_SOURCES) $(test_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libgslspecfunc.la
+pkginclude_HEADERS = gsl_sf.h gsl_sf_airy.h gsl_sf_bessel.h gsl_sf_clausen.h gsl_sf_coulomb.h gsl_sf_coupling.h gsl_sf_dawson.h gsl_sf_debye.h gsl_sf_dilog.h gsl_sf_elementary.h gsl_sf_ellint.h gsl_sf_elljac.h gsl_sf_erf.h gsl_sf_exp.h gsl_sf_expint.h gsl_sf_fermi_dirac.h gsl_sf_gamma.h gsl_sf_gegenbauer.h gsl_sf_hyperg.h gsl_sf_laguerre.h gsl_sf_lambert.h gsl_sf_legendre.h gsl_sf_log.h gsl_sf_mathieu.h gsl_sf_pow_int.h gsl_sf_psi.h gsl_sf_result.h gsl_sf_synchrotron.h gsl_sf_transport.h gsl_sf_trig.h gsl_sf_zeta.h gsl_specfunc.h
+noinst_HEADERS = bessel_amp_phase.h bessel_olver.h bessel_temme.h bessel.h hyperg.h legendre.h eval.h chebyshev.h cheb_eval.c cheb_eval_mode.c check.h error.h
+INCLUDES = -I$(top_builddir)
+libgslspecfunc_la_SOURCES = airy.c airy_der.c airy_zero.c atanint.c bessel.c bessel.h bessel_I0.c bessel_I1.c bessel_In.c bessel_Inu.c bessel_J0.c bessel_J1.c bessel_Jn.c bessel_Jnu.c bessel_K0.c bessel_K1.c bessel_Kn.c bessel_Knu.c bessel_Y0.c bessel_Y1.c bessel_Yn.c bessel_Ynu.c bessel_amp_phase.c bessel_amp_phase.h bessel_i.c bessel_j.c bessel_k.c bessel_olver.c bessel_temme.c bessel_y.c bessel_zero.c bessel_sequence.c beta.c beta_inc.c clausen.c coulomb.c coupling.c coulomb_bound.c dawson.c debye.c dilog.c elementary.c ellint.c elljac.c erfc.c exp.c expint.c expint3.c fermi_dirac.c gegenbauer.c gamma.c gamma_inc.c hyperg_0F1.c hyperg_2F0.c hyperg_1F1.c hyperg_2F1.c hyperg_U.c hyperg.c laguerre.c lambert.c legendre_H3d.c legendre_Qn.c legendre_con.c legendre_poly.c log.c mathieu_angfunc.c mathieu_charv.c mathieu_coeff.c mathieu_radfunc.c mathieu_workspace.c poch.c pow_int.c psi.c recurse.h result.c shint.c sinint.c synchrotron.c transport.c trig.c zeta.c
+TESTS = $(check_PROGRAMS)
+test_LDADD = libgslspecfunc.la ../eigen/libgsleigen.la ../linalg/libgsllinalg.la ../sort/libgslsort.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../block/libgslblock.la ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+test_SOURCES = test_sf.c test_sf.h test_airy.c test_bessel.c test_coulomb.c test_dilog.c test_gamma.c test_hyperg.c test_legendre.c test_mathieu.c
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps specfunc/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps specfunc/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgslspecfunc.la: $(libgslspecfunc_la_OBJECTS) $(libgslspecfunc_la_DEPENDENCIES)
+ $(LINK) $(libgslspecfunc_la_LDFLAGS) $(libgslspecfunc_la_OBJECTS) $(libgslspecfunc_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkgincludeHEADERS
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/specfunc/TODO b/gsl-1.9/specfunc/TODO
new file mode 100644
index 0000000..94306a3
--- /dev/null
+++ b/gsl-1.9/specfunc/TODO
@@ -0,0 +1,673 @@
+* Could probably return immediately for exact zeros in 3j,6j,9j
+functions. Easiest to implement for 3j.
+
+ Note from Serge Winitzki <serge@cosmos.phy.tufts.edu>:
+
+ The package "matpack" (www.matpack.de) includes many special functions,
+ also the 3j symbols. They refer to some quite complicated numerical
+ methods using recursion relations to get the right answers for large
+ momenta, and to 1975-1976 papers by Schulten and Gordon for the
+ description of the algorithms. The papers can be downloaded for free at
+ http://www.ks.uiuc.edu/Publications/Papers/
+
+ http://www.ks.uiuc.edu/Publications/Papers/abstract.cgi?tbcode=SCHU76B
+ http://www.ks.uiuc.edu/Publications/Papers/abstract.cgi?tbcode=SCHU75A
+ http://www.ks.uiuc.edu/Publications/Papers/abstract.cgi?tbcode=SCHU75
+
+* add Fresnel Integrals to specfunc. See TOMS 723 + 2 subsequent
+errata.
+
+* make mode variables consistent in specfunc -- some seem to be
+unnecessary from performance point of view since the speed difference
+is negligible.
+
+* From: "Alexander Babansky" <babansky@mail.ru>
+To: "Brian Gough" <bjg@network-theory.co.uk>
+Subject: Re: gsl-1.2
+Date: Sun, 3 Nov 2002 14:15:15 -0500
+
+Hi Brian,
+May I suggest you to add another function to gsl-1.2 ?
+It's a modified Ei(x) function:
+
+Em(x)=exp(-x)*Ei(x);
+
+As u might know, Ei(x) raises as e^x on the negative interval.
+Therefore, Ei(100) is very very large.
+But Ei(100)*exp(-100) = 0.010;
+
+Unfortunately, if u try x=800 u'll get overflow in Ei(800).
+but Ei(800)*exp(-800) should be around 0.0001;
+
+Modified function Em(x) is used in cos, sin integrals such as:
+int_0^\infinity dx sin(bx)/(x^2+z^2)=(1/2z)*(Em(bz)-Em(-bz));
+
+int_0^\infinity dx x cos(bx)/(x^2+z^2)=(1/2)*(Em(bz)+Em(-bz));
+
+One of possible ways to add it to the library is:
+Em(x) = - PV int_0^\infinity e^(-t)/(t+x) dt
+
+Sincerely,
+Alex
+
+DONE: Wed Nov 6 13:06:42 MST 2002 [GJ]
+
+
+----------------------------------------------------------------------
+
+The following should be finished before a 1.0 level release.
+
+* Implement the conicalP_sph_reg() functions.
+ DONE: Fri Nov 6 23:33:53 MST 1998 [GJ]
+
+* Irregular (Q) Legendre functions, at least
+ the integer order ones. More general cases
+ can probably wait.
+ DONE: Sat Nov 7 15:47:35 MST 1998 [GJ]
+
+* Make hyperg_1F1() work right.
+ This is the last remaining source of test failures.
+ The problem is with an unstable recursion in certain cases.
+ Look for the recursion with the variable named "start_pair";
+ this is stupid hack to keep track of when the recursion
+ result is going the wrong way for awhile by remembering the
+ minimum value. An error estimate is amde from that. But it
+ is just a hack. Somethign must be done abou that case.
+
+* Clean-up Coulomb wave functions. This does not
+ mean completing a fully controlled low-energy
+ evaluation, which is a larger project.
+ DONE: Sun May 16 13:49:47 MDT 1999 [GJ]
+
+* Clean-up the Fermi-Dirac code. The full Fermi-Dirac
+ functions can probably wait until a later release,
+ but we should have at least the common j = integer and
+ j = 1/2-integer cases for the 1.0 release. These
+ are not too hard.
+ DONE: Sat Nov 7 19:46:27 MST 1998 [GJ]
+
+* Go over the tests and make sure nothing is left out.
+
+* Sanitize all the error-checking, error-estimation,
+ algorithm tuning, etc.
+
+* Fill out our scorecard, working from Lozier's
+ "Software Needs in Special Functions" paper.
+
+* Final Seal of Approval
+ This section has itself gone through several
+ revisions (sigh), proving that the notion of
+ done-ness is ill-defined. So it is worth
+ stating the criteria for done-ness explicitly:
+ o interfaces stabilized
+ o error-estimation in place
+ o all deprecated constructs removed
+ o passes tests
+
+
+ - airy.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - airy_der.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - airy_zero.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - atanint.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - bessel.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - bessel_I0.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - bessel_I1.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - bessel_In.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - bessel_Inu.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - bessel_J0.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - bessel_J1.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - bessel_Jn.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - bessel_Jnu.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - bessel_K0.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - bessel_K1.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - bessel_Kn.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - bessel_Knu.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - bessel_Y0.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - bessel_Y1.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - bessel_Yn.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - bessel_Ynu.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - bessel_amp_phase.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - bessel_i.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - bessel_j.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - bessel_k.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - bessel_olver.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - bessel_sequence.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - bessel_temme.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - bessel_y.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - bessel_zero.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - beta.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - chebyshev.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - clausen.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - coulomb.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - coulomb_bound.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - coupling.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - dawson.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - debye.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - dilog.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - elementary.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - ellint.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - elljac.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - erfc.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - exp.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - expint.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - expint3.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - fermi_dirac.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - gamma.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - gamma_inc.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - gegenbauer.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - hyperg.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - hyperg_0F1.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - hyperg_1F1.c
+
+ - hyperg_2F0.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - hyperg_2F1.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - hyperg_U.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - laguerre.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - legendre_H3d.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - legendre_Qn.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - legendre_con.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - legendre_poly.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - log.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - poch.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - poly.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - pow_int.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - psi.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - result.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - shint.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - sinint.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - synchrotron.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - transport.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - trig.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+ - zeta.c
+ INTERFACES:
+ ERRORESTIM:
+ DEPRECATED:
+ PASSTESTS:
+
+
+
+----------------------------------------------------------------------
+
+The following are important but probably will
+not see completion before a 1.0 level release.
+
+* Incomplete Fermi-Dirac functions.
+ Other Fermi-Dirac functions, including the
+ generic 1/2-integer case, which was not done.
+
+* Implement the low-energy regime for the Coulomb
+ wave functions. This is fairly well understood in
+ the recent literature but will require some
+ detailed work. Specifically this means creating
+ a drop-in replacement for coulomb_jwkb() which
+ is controlled and extensible.
+
+* General Legendre functions (at least on the cut).
+ This subsumes the toroidal functions, so we need not
+ consider those separately. SLATEC code exists (originally
+ due to Olver+Smith).
+
+* Characterize the algorithms. A significant fraction of
+ the code is home-grown and it should be reviewed by
+ other parties.
+
+
+----------------------------------------------------------------------
+
+The following are extra features which need not
+be implemented for a version 1.0 release.
+
+* Spheroidal wave functions.
+
+* Mathieu functions.
+
+* Weierstrass elliptic functions.
+
+
+----------------------------------------------------------------------
+
+Improve accuracy of ERF
+
+NNTP-Posting-Date: Thu, 11 Sep 2003 07:41:42 -0500
+From: "George Marsaglia" <geo@stat.fsu.edu>
+Newsgroups: comp.lang.c
+References: <t4J7b.18514$98.4310@nwrddc03.gnilink.net>
+Subject: Re: When (32-bit) double precision isn't precise enough
+Date: Thu, 11 Sep 2003 08:41:40 -0400
+X-Priority: 3
+X-MSMail-Priority: Normal
+X-Newsreader: Microsoft Outlook Express 6.00.2800.1158
+X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1165
+Message-ID: <wq2dnQBikNwb8P2iU-KYvg@comcast.com>
+Lines: 265
+NNTP-Posting-Host: 68.35.247.101
+X-Trace: sv3-4YY+jkhhdeQvGKAREa99vDBFHJoKVqVBdUTSuRxA71OwlgxX0uUFnKYs54FlnUs0Xb6BRngKigkd75d!tKin8l8rAQKylaP+4vzTI3AO33bivOw1lKDZUUtXe4lUMW1qn+goUp/Pfksstg==
+X-Complaints-To: abuse@comcast.net
+X-DMCA-Complaints-To: dmca@comcast.net
+X-Abuse-and-DMCA-Info: Please be sure to forward a copy of ALL headers
+X-Abuse-and-DMCA-Info: Otherwise we will be unable to process your complaint properly
+X-Postfilter: 1.1
+
+
+Why most of those who deal with the normal integral in probability
+theory are still stuck with the historical baggage of the error function
+is a puzzle to me, as is the poor quality of the results one gets from
+standard library implementations of erf(). (One of the most common
+ is based on ALGORITHM AS66, APPL. STATIST.(1973) Vol.22, .424 by HILL,
+ which gives only 6-8 digit accuracy).
+
+Here is a listing of my method:
+
+/*
+Marsaglia Complementary Normal Distribution Function
+ cPhi(x) = integral from x to infinity of exp(-.5*t^2)/sqrt(2*pi), x<15
+ 15-digit accuracy for x<15, returns 0 for x>15.
+#include <math.h>
+*/
+
+double cPhi(double x){
+long double v[]={0.,.65567954241879847154L,
+.42136922928805447322L,.30459029871010329573L,
+.23665238291356067062L,.19280810471531576488L,
+.16237766089686746182L,.14010418345305024160L,
+.12313196325793229628L,.10978728257830829123L,
+.99028596471731921395e-1L,.90175675501064682280e-1L,
+.82766286501369177252e-1L,.76475761016248502993e-1L,
+.71069580538852107091e-1L,.66374235823250173591e-1L};
+long double h,a,b,z,t,sum,pwr;
+int i,j;
+ if(x>15.) return (0.);
+ if(x<-15.) return (1.);
+ j=fabs(x)+1.;
+ z=j;
+ h=fabs(x)-z;
+ a=v[j];
+ b=z*a-1.;
+ pwr=1.;
+ sum=a+h*b;
+ for(i=2;i<60;i+=2){
+ a=(a+z*b)/i;
+ b=(b+z*a)/(i+1);
+ pwr=pwr*h*h;
+ t=sum;
+ sum=sum+pwr*(a+h*b);
+ if(sum==t) break; }
+ sum=sum*exp(-.5*x*x-.91893853320467274178L);
+ if(x<0.) sum=1.-sum;
+ return ((double) sum);
+ }
+*/
+ end of listing
+*/
+
+The method is based on defining phi(x)=exp(-x^2)/sqrt(2pi) and
+
+ R(x)=cPhi(x)/phi(x).
+
+The function R(x) is well-behaved and terms of its Taylor
+series are readily obtained by a two-term recursion. With an accurate
+representation of R(x) at ,say, x=0,1,2,...,15, a simple evaluation
+of the Taylor series at intermediate points provides up to
+15 digits of accuracy.
+An article describing the method will be in the new version of
+my Diehard CDROM. A new version of the Diehard tests
+of randomness (but not yet the new DVDROM) is at
+ http://www.csis.hku.hk/~diehard/
+
+
+ George Marsaglia \ No newline at end of file
diff --git a/gsl-1.9/specfunc/airy.c b/gsl-1.9/specfunc/airy.c
new file mode 100644
index 0000000..8ec9f55
--- /dev/null
+++ b/gsl-1.9/specfunc/airy.c
@@ -0,0 +1,869 @@
+/* specfunc/airy.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_trig.h>
+#include <gsl/gsl_sf_airy.h>
+
+#include "error.h"
+#include "check.h"
+
+#include "chebyshev.h"
+#include "cheb_eval_mode.c"
+
+/*-*-*-*-*-*-*-*-*-*-*-* Private Section *-*-*-*-*-*-*-*-*-*-*-*/
+
+
+/* chebyshev expansions for Airy modulus and phase
+ based on SLATEC r9aimp()
+
+ Series for AM21 on the interval -1.25000D-01 to 0.
+ with weighted error 2.89E-17
+ log weighted error 16.54
+ significant figures required 14.15
+ decimal places required 17.34
+
+ Series for ATH1 on the interval -1.25000D-01 to 0.
+ with weighted error 2.53E-17
+ log weighted error 16.60
+ significant figures required 15.15
+ decimal places required 17.38
+
+ Series for AM22 on the interval -1.00000D+00 to -1.25000D-01
+ with weighted error 2.99E-17
+ log weighted error 16.52
+ significant figures required 14.57
+ decimal places required 17.28
+
+ Series for ATH2 on the interval -1.00000D+00 to -1.25000D-01
+ with weighted error 2.57E-17
+ log weighted error 16.59
+ significant figures required 15.07
+ decimal places required 17.34
+*/
+
+static double am21_data[37] = {
+ 0.0065809191761485,
+ 0.0023675984685722,
+ 0.0001324741670371,
+ 0.0000157600904043,
+ 0.0000027529702663,
+ 0.0000006102679017,
+ 0.0000001595088468,
+ 0.0000000471033947,
+ 0.0000000152933871,
+ 0.0000000053590722,
+ 0.0000000020000910,
+ 0.0000000007872292,
+ 0.0000000003243103,
+ 0.0000000001390106,
+ 0.0000000000617011,
+ 0.0000000000282491,
+ 0.0000000000132979,
+ 0.0000000000064188,
+ 0.0000000000031697,
+ 0.0000000000015981,
+ 0.0000000000008213,
+ 0.0000000000004296,
+ 0.0000000000002284,
+ 0.0000000000001232,
+ 0.0000000000000675,
+ 0.0000000000000374,
+ 0.0000000000000210,
+ 0.0000000000000119,
+ 0.0000000000000068,
+ 0.0000000000000039,
+ 0.0000000000000023,
+ 0.0000000000000013,
+ 0.0000000000000008,
+ 0.0000000000000005,
+ 0.0000000000000003,
+ 0.0000000000000001,
+ 0.0000000000000001
+};
+static cheb_series am21_cs = {
+ am21_data,
+ 36,
+ -1, 1,
+ 20
+};
+
+static double ath1_data[36] = {
+ -0.07125837815669365,
+ -0.00590471979831451,
+ -0.00012114544069499,
+ -0.00000988608542270,
+ -0.00000138084097352,
+ -0.00000026142640172,
+ -0.00000006050432589,
+ -0.00000001618436223,
+ -0.00000000483464911,
+ -0.00000000157655272,
+ -0.00000000055231518,
+ -0.00000000020545441,
+ -0.00000000008043412,
+ -0.00000000003291252,
+ -0.00000000001399875,
+ -0.00000000000616151,
+ -0.00000000000279614,
+ -0.00000000000130428,
+ -0.00000000000062373,
+ -0.00000000000030512,
+ -0.00000000000015239,
+ -0.00000000000007758,
+ -0.00000000000004020,
+ -0.00000000000002117,
+ -0.00000000000001132,
+ -0.00000000000000614,
+ -0.00000000000000337,
+ -0.00000000000000188,
+ -0.00000000000000105,
+ -0.00000000000000060,
+ -0.00000000000000034,
+ -0.00000000000000020,
+ -0.00000000000000011,
+ -0.00000000000000007,
+ -0.00000000000000004,
+ -0.00000000000000002
+};
+static cheb_series ath1_cs = {
+ ath1_data,
+ 35,
+ -1, 1,
+ 15
+};
+
+static double am22_data[33] = {
+ -0.01562844480625341,
+ 0.00778336445239681,
+ 0.00086705777047718,
+ 0.00015696627315611,
+ 0.00003563962571432,
+ 0.00000924598335425,
+ 0.00000262110161850,
+ 0.00000079188221651,
+ 0.00000025104152792,
+ 0.00000008265223206,
+ 0.00000002805711662,
+ 0.00000000976821090,
+ 0.00000000347407923,
+ 0.00000000125828132,
+ 0.00000000046298826,
+ 0.00000000017272825,
+ 0.00000000006523192,
+ 0.00000000002490471,
+ 0.00000000000960156,
+ 0.00000000000373448,
+ 0.00000000000146417,
+ 0.00000000000057826,
+ 0.00000000000022991,
+ 0.00000000000009197,
+ 0.00000000000003700,
+ 0.00000000000001496,
+ 0.00000000000000608,
+ 0.00000000000000248,
+ 0.00000000000000101,
+ 0.00000000000000041,
+ 0.00000000000000017,
+ 0.00000000000000007,
+ 0.00000000000000002
+};
+static cheb_series am22_cs = {
+ am22_data,
+ 32,
+ -1, 1,
+ 15
+};
+
+static double ath2_data[32] = {
+ 0.00440527345871877,
+ -0.03042919452318455,
+ -0.00138565328377179,
+ -0.00018044439089549,
+ -0.00003380847108327,
+ -0.00000767818353522,
+ -0.00000196783944371,
+ -0.00000054837271158,
+ -0.00000016254615505,
+ -0.00000005053049981,
+ -0.00000001631580701,
+ -0.00000000543420411,
+ -0.00000000185739855,
+ -0.00000000064895120,
+ -0.00000000023105948,
+ -0.00000000008363282,
+ -0.00000000003071196,
+ -0.00000000001142367,
+ -0.00000000000429811,
+ -0.00000000000163389,
+ -0.00000000000062693,
+ -0.00000000000024260,
+ -0.00000000000009461,
+ -0.00000000000003716,
+ -0.00000000000001469,
+ -0.00000000000000584,
+ -0.00000000000000233,
+ -0.00000000000000093,
+ -0.00000000000000037,
+ -0.00000000000000015,
+ -0.00000000000000006,
+ -0.00000000000000002
+};
+static cheb_series ath2_cs = {
+ ath2_data,
+ 31,
+ -1, 1,
+ 16
+};
+
+
+/* Airy modulus and phase for x < -1 */
+static
+int
+airy_mod_phase(const double x, gsl_mode_t mode, gsl_sf_result * mod, gsl_sf_result * phase)
+{
+ gsl_sf_result result_m;
+ gsl_sf_result result_p;
+ double m, p;
+ double sqx;
+
+ if(x < -2.0) {
+ double z = 16.0/(x*x*x) + 1.0;
+ cheb_eval_mode_e(&am21_cs, z, mode, &result_m);
+ cheb_eval_mode_e(&ath1_cs, z, mode, &result_p);
+ }
+ else if(x <= -1.0) {
+ double z = (16.0/(x*x*x) + 9.0)/7.0;
+ cheb_eval_mode_e(&am22_cs, z, mode, &result_m);
+ cheb_eval_mode_e(&ath2_cs, z, mode, &result_p);
+ }
+ else {
+ mod->val = 0.0;
+ mod->err = 0.0;
+ phase->val = 0.0;
+ phase->err = 0.0;
+ GSL_ERROR ("x is greater than 1.0", GSL_EDOM);
+ }
+
+ m = 0.3125 + result_m.val;
+ p = -0.625 + result_p.val;
+
+ sqx = sqrt(-x);
+
+ mod->val = sqrt(m/sqx);
+ mod->err = fabs(mod->val) * (GSL_DBL_EPSILON + fabs(result_m.err/result_m.val));
+ phase->val = M_PI_4 - x*sqx * p;
+ phase->err = fabs(phase->val) * (GSL_DBL_EPSILON + fabs(result_p.err/result_p.val));
+
+ return GSL_SUCCESS;
+}
+
+
+
+/* Chebyshev series for Ai(x) with x in [-1,1]
+ based on SLATEC ai(x)
+
+ series for aif on the interval -1.00000d+00 to 1.00000d+00
+ with weighted error 1.09e-19
+ log weighted error 18.96
+ significant figures required 17.76
+ decimal places required 19.44
+
+ series for aig on the interval -1.00000d+00 to 1.00000d+00
+ with weighted error 1.51e-17
+ log weighted error 16.82
+ significant figures required 15.19
+ decimal places required 17.27
+ */
+static double ai_data_f[9] = {
+ -0.03797135849666999750,
+ 0.05919188853726363857,
+ 0.00098629280577279975,
+ 0.00000684884381907656,
+ 0.00000002594202596219,
+ 0.00000000006176612774,
+ 0.00000000000010092454,
+ 0.00000000000000012014,
+ 0.00000000000000000010
+};
+static cheb_series aif_cs = {
+ ai_data_f,
+ 8,
+ -1, 1,
+ 8
+};
+
+static double ai_data_g[8] = {
+ 0.01815236558116127,
+ 0.02157256316601076,
+ 0.00025678356987483,
+ 0.00000142652141197,
+ 0.00000000457211492,
+ 0.00000000000952517,
+ 0.00000000000001392,
+ 0.00000000000000001
+};
+static cheb_series aig_cs = {
+ ai_data_g,
+ 7,
+ -1, 1,
+ 7
+};
+
+
+/* Chebvyshev series for Bi(x) with x in [-1,1]
+ based on SLATEC bi(x)
+
+ series for bif on the interval -1.00000d+00 to 1.00000d+00
+ with weighted error 1.88e-19
+ log weighted error 18.72
+ significant figures required 17.74
+ decimal places required 19.20
+
+ series for big on the interval -1.00000d+00 to 1.00000d+00
+ with weighted error 2.61e-17
+ log weighted error 16.58
+ significant figures required 15.17
+ decimal places required 17.03
+ */
+static double data_bif[9] = {
+ -0.01673021647198664948,
+ 0.10252335834249445610,
+ 0.00170830925073815165,
+ 0.00001186254546774468,
+ 0.00000004493290701779,
+ 0.00000000010698207143,
+ 0.00000000000017480643,
+ 0.00000000000000020810,
+ 0.00000000000000000018
+};
+static cheb_series bif_cs = {
+ data_bif,
+ 8,
+ -1, 1,
+ 8
+};
+
+static double data_big[8] = {
+ 0.02246622324857452,
+ 0.03736477545301955,
+ 0.00044476218957212,
+ 0.00000247080756363,
+ 0.00000000791913533,
+ 0.00000000001649807,
+ 0.00000000000002411,
+ 0.00000000000000002
+};
+static cheb_series big_cs = {
+ data_big,
+ 7,
+ -1, 1,
+ 7
+};
+
+
+/* Chebyshev series for Bi(x) with x in [1,8]
+ based on SLATEC bi(x)
+ */
+static double data_bif2[10] = {
+ 0.0998457269381604100,
+ 0.4786249778630055380,
+ 0.0251552119604330118,
+ 0.0005820693885232645,
+ 0.0000074997659644377,
+ 0.0000000613460287034,
+ 0.0000000003462753885,
+ 0.0000000000014288910,
+ 0.0000000000000044962,
+ 0.0000000000000000111
+};
+static cheb_series bif2_cs = {
+ data_bif2,
+ 9,
+ -1, 1,
+ 9
+};
+
+static double data_big2[10] = {
+ 0.033305662145514340,
+ 0.161309215123197068,
+ 0.0063190073096134286,
+ 0.0001187904568162517,
+ 0.0000013045345886200,
+ 0.0000000093741259955,
+ 0.0000000000474580188,
+ 0.0000000000001783107,
+ 0.0000000000000005167,
+ 0.0000000000000000011
+};
+static cheb_series big2_cs = {
+ data_big2,
+ 9,
+ -1, 1,
+ 9
+};
+
+
+/* chebyshev for Ai(x) asymptotic factor
+ based on SLATEC aie()
+
+ Series for AIP on the interval 0. to 1.00000D+00
+ with weighted error 5.10E-17
+ log weighted error 16.29
+ significant figures required 14.41
+ decimal places required 17.06
+
+ [GJ] Sun Apr 19 18:14:31 EDT 1998
+ There was something wrong with these coefficients. I was getting
+ errors after 3 or 4 digits. So I recomputed this table. Now I get
+ double precision agreement with Mathematica. But it does not seem
+ possible that the small differences here would account for the
+ original discrepancy. There must have been something wrong with my
+ original usage...
+*/
+static double data_aip[36] = {
+ -0.0187519297793867540198,
+ -0.0091443848250055004725,
+ 0.0009010457337825074652,
+ -0.0001394184127221491507,
+ 0.0000273815815785209370,
+ -0.0000062750421119959424,
+ 0.0000016064844184831521,
+ -0.0000004476392158510354,
+ 0.0000001334635874651668,
+ -0.0000000420735334263215,
+ 0.0000000139021990246364,
+ -0.0000000047831848068048,
+ 0.0000000017047897907465,
+ -0.0000000006268389576018,
+ 0.0000000002369824276612,
+ -0.0000000000918641139267,
+ 0.0000000000364278543037,
+ -0.0000000000147475551725,
+ 0.0000000000060851006556,
+ -0.0000000000025552772234,
+ 0.0000000000010906187250,
+ -0.0000000000004725870319,
+ 0.0000000000002076969064,
+ -0.0000000000000924976214,
+ 0.0000000000000417096723,
+ -0.0000000000000190299093,
+ 0.0000000000000087790676,
+ -0.0000000000000040927557,
+ 0.0000000000000019271068,
+ -0.0000000000000009160199,
+ 0.0000000000000004393567,
+ -0.0000000000000002125503,
+ 0.0000000000000001036735,
+ -0.0000000000000000509642,
+ 0.0000000000000000252377,
+ -0.0000000000000000125793
+/*
+ -.0187519297793868
+ -.0091443848250055,
+ .0009010457337825,
+ -.0001394184127221,
+ .0000273815815785,
+ -.0000062750421119,
+ .0000016064844184,
+ -.0000004476392158,
+ .0000001334635874,
+ -.0000000420735334,
+ .0000000139021990,
+ -.0000000047831848,
+ .0000000017047897,
+ -.0000000006268389,
+ .0000000002369824,
+ -.0000000000918641,
+ .0000000000364278,
+ -.0000000000147475,
+ .0000000000060851,
+ -.0000000000025552,
+ .0000000000010906,
+ -.0000000000004725,
+ .0000000000002076,
+ -.0000000000000924,
+ .0000000000000417,
+ -.0000000000000190,
+ .0000000000000087,
+ -.0000000000000040,
+ .0000000000000019,
+ -.0000000000000009,
+ .0000000000000004,
+ -.0000000000000002,
+ .0000000000000001,
+ -.0000000000000000
+*/
+};
+static cheb_series aip_cs = {
+ data_aip,
+ 35,
+ -1, 1,
+ 17
+};
+
+
+/* chebyshev for Bi(x) asymptotic factor
+ based on SLATEC bie()
+
+ Series for BIP on the interval 1.25000D-01 to 3.53553D-01
+ with weighted error 1.91E-17
+ log weighted error 16.72
+ significant figures required 15.35
+ decimal places required 17.41
+
+ Series for BIP2 on the interval 0. to 1.25000D-01
+ with weighted error 1.05E-18
+ log weighted error 17.98
+ significant figures required 16.74
+ decimal places required 18.71
+*/
+static double data_bip[24] = {
+ -0.08322047477943447,
+ 0.01146118927371174,
+ 0.00042896440718911,
+ -0.00014906639379950,
+ -0.00001307659726787,
+ 0.00000632759839610,
+ -0.00000042226696982,
+ -0.00000019147186298,
+ 0.00000006453106284,
+ -0.00000000784485467,
+ -0.00000000096077216,
+ 0.00000000070004713,
+ -0.00000000017731789,
+ 0.00000000002272089,
+ 0.00000000000165404,
+ -0.00000000000185171,
+ 0.00000000000059576,
+ -0.00000000000012194,
+ 0.00000000000001334,
+ 0.00000000000000172,
+ -0.00000000000000145,
+ 0.00000000000000049,
+ -0.00000000000000011,
+ 0.00000000000000001
+};
+static cheb_series bip_cs = {
+ data_bip,
+ 23,
+ -1, 1,
+ 14
+};
+
+static double data_bip2[29] = {
+ -0.113596737585988679,
+ 0.0041381473947881595,
+ 0.0001353470622119332,
+ 0.0000104273166530153,
+ 0.0000013474954767849,
+ 0.0000001696537405438,
+ -0.0000000100965008656,
+ -0.0000000167291194937,
+ -0.0000000045815364485,
+ 0.0000000003736681366,
+ 0.0000000005766930320,
+ 0.0000000000621812650,
+ -0.0000000000632941202,
+ -0.0000000000149150479,
+ 0.0000000000078896213,
+ 0.0000000000024960513,
+ -0.0000000000012130075,
+ -0.0000000000003740493,
+ 0.0000000000002237727,
+ 0.0000000000000474902,
+ -0.0000000000000452616,
+ -0.0000000000000030172,
+ 0.0000000000000091058,
+ -0.0000000000000009814,
+ -0.0000000000000016429,
+ 0.0000000000000005533,
+ 0.0000000000000002175,
+ -0.0000000000000001737,
+ -0.0000000000000000010
+};
+static cheb_series bip2_cs = {
+ data_bip2,
+ 28,
+ -1, 1,
+ 10
+};
+
+
+/* assumes x >= 1.0 */
+inline static int
+airy_aie(const double x, gsl_mode_t mode, gsl_sf_result * result)
+{
+ double sqx = sqrt(x);
+ double z = 2.0/(x*sqx) - 1.0;
+ double y = sqrt(sqx);
+ gsl_sf_result result_c;
+ cheb_eval_mode_e(&aip_cs, z, mode, &result_c);
+ result->val = (0.28125 + result_c.val)/y;
+ result->err = result_c.err/y + GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+}
+
+/* assumes x >= 2.0 */
+static int airy_bie(const double x, gsl_mode_t mode, gsl_sf_result * result)
+{
+ const double ATR = 8.7506905708484345;
+ const double BTR = -2.0938363213560543;
+
+ if(x < 4.0) {
+ double sqx = sqrt(x);
+ double z = ATR/(x*sqx) + BTR;
+ double y = sqrt(sqx);
+ gsl_sf_result result_c;
+ cheb_eval_mode_e(&bip_cs, z, mode, &result_c);
+ result->val = (0.625 + result_c.val)/y;
+ result->err = result_c.err/y + GSL_DBL_EPSILON * fabs(result->val);
+ }
+ else {
+ double sqx = sqrt(x);
+ double z = 16.0/(x*sqx) - 1.0;
+ double y = sqrt(sqx);
+ gsl_sf_result result_c;
+ cheb_eval_mode_e(&bip2_cs, z, mode, &result_c);
+ result->val = (0.625 + result_c.val)/y;
+ result->err = result_c.err/y + GSL_DBL_EPSILON * fabs(result->val);
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int
+gsl_sf_airy_Ai_e(const double x, const gsl_mode_t mode, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x < -1.0) {
+ gsl_sf_result mod;
+ gsl_sf_result theta;
+ gsl_sf_result cos_result;
+ int stat_mp = airy_mod_phase(x, mode, &mod, &theta);
+ int stat_cos = gsl_sf_cos_err_e(theta.val, theta.err, &cos_result);
+ result->val = mod.val * cos_result.val;
+ result->err = fabs(mod.val * cos_result.err) + fabs(cos_result.val * mod.err);
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_ERROR_SELECT_2(stat_mp, stat_cos);
+ }
+ else if(x <= 1.0) {
+ const double z = x*x*x;
+ gsl_sf_result result_c0;
+ gsl_sf_result result_c1;
+ cheb_eval_mode_e(&aif_cs, z, mode, &result_c0);
+ cheb_eval_mode_e(&aig_cs, z, mode, &result_c1);
+ result->val = 0.375 + (result_c0.val - x*(0.25 + result_c1.val));
+ result->err = result_c0.err + fabs(x*result_c1.err);
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ double x32 = x * sqrt(x);
+ double s = exp(-2.0*x32/3.0);
+ gsl_sf_result result_aie;
+ int stat_aie = airy_aie(x, mode, &result_aie);
+ result->val = result_aie.val * s;
+ result->err = result_aie.err * s + result->val * x32 * GSL_DBL_EPSILON;
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+ CHECK_UNDERFLOW(result);
+ return stat_aie;
+ }
+}
+
+
+int
+gsl_sf_airy_Ai_scaled_e(const double x, gsl_mode_t mode, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x < -1.0) {
+ gsl_sf_result mod;
+ gsl_sf_result theta;
+ gsl_sf_result cos_result;
+ int stat_mp = airy_mod_phase(x, mode, &mod, &theta);
+ int stat_cos = gsl_sf_cos_err_e(theta.val, theta.err, &cos_result);
+ result->val = mod.val * cos_result.val;
+ result->err = fabs(mod.val * cos_result.err) + fabs(cos_result.val * mod.err);
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_ERROR_SELECT_2(stat_mp, stat_cos);
+ }
+ else if(x <= 1.0) {
+ const double z = x*x*x;
+ gsl_sf_result result_c0;
+ gsl_sf_result result_c1;
+ cheb_eval_mode_e(&aif_cs, z, mode, &result_c0);
+ cheb_eval_mode_e(&aig_cs, z, mode, &result_c1);
+ result->val = 0.375 + (result_c0.val - x*(0.25 + result_c1.val));
+ result->err = result_c0.err + fabs(x*result_c1.err);
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+
+ if(x > 0.0) {
+ const double scale = exp(2.0/3.0 * sqrt(z));
+ result->val *= scale;
+ result->err *= scale;
+ }
+
+ return GSL_SUCCESS;
+ }
+ else {
+ return airy_aie(x, mode, result);
+ }
+}
+
+
+int gsl_sf_airy_Bi_e(const double x, gsl_mode_t mode, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+ if(x < -1.0) {
+ gsl_sf_result mod;
+ gsl_sf_result theta;
+ gsl_sf_result sin_result;
+ int stat_mp = airy_mod_phase(x, mode, &mod, &theta);
+ int stat_sin = gsl_sf_sin_err_e(theta.val, theta.err, &sin_result);
+ result->val = mod.val * sin_result.val;
+ result->err = fabs(mod.val * sin_result.err) + fabs(sin_result.val * mod.err);
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_ERROR_SELECT_2(stat_mp, stat_sin);
+ }
+ else if(x < 1.0) {
+ const double z = x*x*x;
+ gsl_sf_result result_c0;
+ gsl_sf_result result_c1;
+ cheb_eval_mode_e(&bif_cs, z, mode, &result_c0);
+ cheb_eval_mode_e(&big_cs, z, mode, &result_c1);
+ result->val = 0.625 + result_c0.val + x*(0.4375 + result_c1.val);
+ result->err = result_c0.err + fabs(x * result_c1.err);
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x <= 2.0) {
+ const double z = (2.0*x*x*x - 9.0)/7.0;
+ gsl_sf_result result_c0;
+ gsl_sf_result result_c1;
+ cheb_eval_mode_e(&bif2_cs, z, mode, &result_c0);
+ cheb_eval_mode_e(&big2_cs, z, mode, &result_c1);
+ result->val = 1.125 + result_c0.val + x*(0.625 + result_c1.val);
+ result->err = result_c0.err + fabs(x * result_c1.err);
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ const double y = 2.0*x*sqrt(x)/3.0;
+ const double s = exp(y);
+
+ if(y > GSL_LOG_DBL_MAX - 1.0) {
+ OVERFLOW_ERROR(result);
+ }
+ else {
+ gsl_sf_result result_bie;
+ int stat_bie = airy_bie(x, mode, &result_bie);
+ result->val = result_bie.val * s;
+ result->err = result_bie.err * s + fabs(1.5*y * (GSL_DBL_EPSILON * result->val));
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+ return stat_bie;
+ }
+ }
+}
+
+
+int
+gsl_sf_airy_Bi_scaled_e(const double x, gsl_mode_t mode, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x < -1.0) {
+ gsl_sf_result mod;
+ gsl_sf_result theta;
+ gsl_sf_result sin_result;
+ int stat_mp = airy_mod_phase(x, mode, &mod, &theta);
+ int stat_sin = gsl_sf_sin_err_e(theta.val, theta.err, &sin_result);
+ result->val = mod.val * sin_result.val;
+ result->err = fabs(mod.val * sin_result.err) + fabs(sin_result.val * mod.err);
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_ERROR_SELECT_2(stat_mp, stat_sin);
+ }
+ else if(x < 1.0) {
+ const double z = x*x*x;
+ gsl_sf_result result_c0;
+ gsl_sf_result result_c1;
+ cheb_eval_mode_e(&bif_cs, z, mode, &result_c0);
+ cheb_eval_mode_e(&big_cs, z, mode, &result_c1);
+ result->val = 0.625 + result_c0.val + x*(0.4375 + result_c1.val);
+ result->err = result_c0.err + fabs(x * result_c1.err);
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+ if(x > 0.0) {
+ const double scale = exp(-2.0/3.0 * sqrt(z));
+ result->val *= scale;
+ result->err *= scale;
+ }
+ return GSL_SUCCESS;
+ }
+ else if(x <= 2.0) {
+ const double x3 = x*x*x;
+ const double z = (2.0*x3 - 9.0)/7.0;
+ const double s = exp(-2.0/3.0 * sqrt(x3));
+ gsl_sf_result result_c0;
+ gsl_sf_result result_c1;
+ cheb_eval_mode_e(&bif2_cs, z, mode, &result_c0);
+ cheb_eval_mode_e(&big2_cs, z, mode, &result_c1);
+ result->val = s * (1.125 + result_c0.val + x*(0.625 + result_c1.val));
+ result->err = s * (result_c0.err + fabs(x * result_c1.err));
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ return airy_bie(x, mode, result);
+ }
+}
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_airy_Ai(const double x, gsl_mode_t mode)
+{
+ EVAL_RESULT(gsl_sf_airy_Ai_e(x, mode, &result));
+}
+
+double gsl_sf_airy_Ai_scaled(const double x, gsl_mode_t mode)
+{
+ EVAL_RESULT(gsl_sf_airy_Ai_scaled_e(x, mode, &result));
+}
+
+double gsl_sf_airy_Bi(const double x, gsl_mode_t mode)
+{
+ EVAL_RESULT(gsl_sf_airy_Bi_e(x, mode, &result));
+}
+
+double gsl_sf_airy_Bi_scaled(const double x, gsl_mode_t mode)
+{
+ EVAL_RESULT(gsl_sf_airy_Bi_scaled_e(x, mode, &result));
+}
+
+
diff --git a/gsl-1.9/specfunc/airy_der.c b/gsl-1.9/specfunc/airy_der.c
new file mode 100644
index 0000000..3830875
--- /dev/null
+++ b/gsl-1.9/specfunc/airy_der.c
@@ -0,0 +1,888 @@
+/* specfunc/airy_der.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_exp.h>
+#include <gsl/gsl_sf_airy.h>
+
+#include "error.h"
+
+#include "chebyshev.h"
+#include "cheb_eval_mode.c"
+
+/*-*-*-*-*-*-*-*-*-*-*-* Private Section *-*-*-*-*-*-*-*-*-*-*-*/
+
+
+/* based on SLATEC aide.f, bide.f, aid.f, bid.f, r9admp.f */
+
+/*
+ series for aif on the interval -1.00000e+00 to 1.00000e+00
+ with weighted error 5.22e-18
+ log weighted error 17.28
+ significant figures required 16.01
+ decimal places required 17.73
+*/
+static double aif_data[8] = {
+ 0.10527461226531408809,
+ 0.01183613628152997844,
+ 0.00012328104173225664,
+ 0.00000062261225638140,
+ 0.00000000185298887844,
+ 0.00000000000363328873,
+ 0.00000000000000504622,
+ 0.00000000000000000522
+};
+static cheb_series aif_cs = {
+ aif_data,
+ 7,
+ -1, 1,
+ 7
+};
+
+/*
+ series for aig on the interval -1.00000e+00 to 1.00000e+00
+ with weighted error 3.14e-19
+ log weighted error 18.50
+ significant figures required 17.44
+ decimal places required 18.98
+*/
+static double aig_data[9] = {
+ 0.021233878150918666852,
+ 0.086315930335214406752,
+ 0.001797594720383231358,
+ 0.000014265499875550693,
+ 0.000000059437995283683,
+ 0.000000000152403366479,
+ 0.000000000000264587660,
+ 0.000000000000000331562,
+ 0.000000000000000000314
+};
+static cheb_series aig_cs = {
+ aig_data,
+ 8,
+ -1, 1,
+ 8
+};
+
+/*
+ series for aip2 on the interval 0.00000e+00 to 1.25000e-01
+ with weighted error 2.15e-17
+ log weighted error 16.67
+ significant figures required 14.27
+ decimal places required 17.26
+*/
+static double aip2_data[15] = {
+ 0.0065457691989713757,
+ 0.0023833724120774592,
+ -0.0000430700770220586,
+ 0.0000015629125858629,
+ -0.0000000815417186163,
+ 0.0000000054103738057,
+ -0.0000000004284130883,
+ 0.0000000000389497963,
+ -0.0000000000039623161,
+ 0.0000000000004428184,
+ -0.0000000000000536297,
+ 0.0000000000000069650,
+ -0.0000000000000009620,
+ 0.0000000000000001403,
+ -0.0000000000000000215
+};
+static cheb_series aip2_cs = {
+ aip2_data,
+ 14,
+ -1, 1,
+ 9
+};
+
+/*
+ series for aip1 on the interval 1.25000e-01 to 1.00000e+00
+ with weighted error 2.60e-17
+ log weighted error 16.58
+ significant figures required 14.91
+ decimal places required 17.28
+*/
+static double aip1_data[25] = {
+ 0.0358865097808301538,
+ 0.0114668575627764899,
+ -0.0007592073583861400,
+ 0.0000869517610893841,
+ -0.0000128237294298592,
+ 0.0000022062695681038,
+ -0.0000004222295185921,
+ 0.0000000874686415726,
+ -0.0000000192773588418,
+ 0.0000000044668460054,
+ -0.0000000010790108052,
+ 0.0000000002700029447,
+ -0.0000000000696480108,
+ 0.0000000000184489907,
+ -0.0000000000050027817,
+ 0.0000000000013852243,
+ -0.0000000000003908218,
+ 0.0000000000001121536,
+ -0.0000000000000326862,
+ 0.0000000000000096619,
+ -0.0000000000000028935,
+ 0.0000000000000008770,
+ -0.0000000000000002688,
+ 0.0000000000000000832,
+ -0.0000000000000000260
+};
+static cheb_series aip1_cs = {
+ aip1_data,
+ 24,
+ -1, 1,
+ 14
+};
+
+
+/*
+ series for bif on the interval -1.00000e+00 to 1.00000e+00
+ with weighted error 9.05e-18
+ log weighted error 17.04
+ significant figures required 15.83
+ decimal places required 17.49
+*/
+static double bif_data[8] = {
+ 0.1153536790828570243,
+ 0.0205007894049192875,
+ 0.0002135290278902876,
+ 0.0000010783960614677,
+ 0.0000000032094708833,
+ 0.0000000000062930407,
+ 0.0000000000000087403,
+ 0.0000000000000000090
+};
+static cheb_series bif_cs = {
+ bif_data,
+ 7,
+ -1, 1,
+ 7
+};
+
+/*
+ series for big on the interval -1.00000e+00 to 1.00000e+00
+ with weighted error 5.44e-19
+ log weighted error 18.26
+ significant figures required 17.46
+ decimal places required 18.74
+*/
+static double big_data[9] = {
+ -0.097196440416443537390,
+ 0.149503576843167066571,
+ 0.003113525387121326042,
+ 0.000024708570579821297,
+ 0.000000102949627731379,
+ 0.000000000263970373987,
+ 0.000000000000458279271,
+ 0.000000000000000574283,
+ 0.000000000000000000544
+};
+static cheb_series big_cs = {
+ big_data,
+ 8,
+ -1, 1,
+ 8
+};
+
+/*
+ series for bif2 on the interval 1.00000e+00 to 8.00000e+00
+ with weighted error 3.82e-19
+ log weighted error 18.42
+ significant figures required 17.68
+ decimal places required 18.92
+*/
+static double bif2_data[10] = {
+ 0.323493987603522033521,
+ 0.086297871535563559139,
+ 0.002994025552655397426,
+ 0.000051430528364661637,
+ 0.000000525840250036811,
+ 0.000000003561751373958,
+ 0.000000000017146864007,
+ 0.000000000000061663520,
+ 0.000000000000000171911,
+ 0.000000000000000000382
+};
+static cheb_series bif2_cs = {
+ bif2_data,
+ 9,
+ -1, 1,
+ 9
+};
+
+/*
+ series for big2 on the interval 1.00000e+00 to 8.00000e+00
+ with weighted error 3.35e-17
+ log weighted error 16.48
+ significant figures required 16.52
+ decimal places required 16.98
+*/
+static double big2_data[10] = {
+ 1.6062999463621294578,
+ 0.7449088819876088652,
+ 0.0470138738610277380,
+ 0.0012284422062548239,
+ 0.0000173222412256624,
+ 0.0000001521901652368,
+ 0.0000000009113560249,
+ 0.0000000000039547918,
+ 0.0000000000000130017,
+ 0.0000000000000000335
+};
+static cheb_series big2_cs = {
+ big2_data,
+ 9,
+ -1, 1,
+ 9
+};
+
+/*
+ series for bip2 on the interval 0.00000e+00 to 1.25000e-01
+ with weighted error 2.07e-18
+ log weighted error 17.69
+ significant figures required 16.51
+ decimal places required 18.42
+*/
+static double bip2_data[29] = {
+ -0.13269705443526630495,
+ -0.00568443626045977481,
+ -0.00015643601119611610,
+ -0.00001136737203679562,
+ -0.00000143464350991284,
+ -0.00000018098531185164,
+ 0.00000000926177343611,
+ 0.00000001710005490721,
+ 0.00000000476698163504,
+ -0.00000000035195022023,
+ -0.00000000058890614316,
+ -0.00000000006678499608,
+ 0.00000000006395565102,
+ 0.00000000001554529427,
+ -0.00000000000792397000,
+ -0.00000000000258326243,
+ 0.00000000000121655048,
+ 0.00000000000038707207,
+ -0.00000000000022487045,
+ -0.00000000000004953477,
+ 0.00000000000004563782,
+ 0.00000000000000332998,
+ -0.00000000000000921750,
+ 0.00000000000000094157,
+ 0.00000000000000167154,
+ -0.00000000000000055134,
+ -0.00000000000000022369,
+ 0.00000000000000017487,
+ 0.00000000000000000207
+};
+static cheb_series bip2_cs = {
+ bip2_data,
+ 28,
+ -1, 1,
+ 14
+};
+
+/*
+ series for bip1 on the interval 1.25000e-01 to 3.53553e-01
+ with weighted error 1.86e-17
+ log weighted error 16.73
+ significant figures required 15.67
+ decimal places required 17.42
+*/
+static double bip1_data[24] = {
+ -0.1729187351079553719,
+ -0.0149358492984694364,
+ -0.0005471104951678566,
+ 0.0001537966292958408,
+ 0.0000154353476192179,
+ -0.0000065434113851906,
+ 0.0000003728082407879,
+ 0.0000002072078388189,
+ -0.0000000658173336470,
+ 0.0000000074926746354,
+ 0.0000000011101336884,
+ -0.0000000007265140553,
+ 0.0000000001782723560,
+ -0.0000000000217346352,
+ -0.0000000000020302035,
+ 0.0000000000019311827,
+ -0.0000000000006044953,
+ 0.0000000000001209450,
+ -0.0000000000000125109,
+ -0.0000000000000019917,
+ 0.0000000000000015154,
+ -0.0000000000000004977,
+ 0.0000000000000001155,
+ -0.0000000000000000186
+};
+static cheb_series bip1_cs = {
+ bip1_data,
+ 23,
+ -1, 1,
+ 13
+};
+
+/*
+ series for an22 on the interval -1.00000e+00 to -1.25000e-01
+ with weighted error 3.30e-17
+ log weighted error 16.48
+ significant figures required 14.95
+ decimal places required 17.24
+*/
+static double an22_data[33] = {
+ 0.0537418629629794329,
+ -0.0126661435859883193,
+ -0.0011924334106593007,
+ -0.0002032327627275655,
+ -0.0000446468963075164,
+ -0.0000113359036053123,
+ -0.0000031641352378546,
+ -0.0000009446708886149,
+ -0.0000002966562236472,
+ -0.0000000969118892024,
+ -0.0000000326822538653,
+ -0.0000000113144618964,
+ -0.0000000040042691002,
+ -0.0000000014440333684,
+ -0.0000000005292853746,
+ -0.0000000001967763374,
+ -0.0000000000740800096,
+ -0.0000000000282016314,
+ -0.0000000000108440066,
+ -0.0000000000042074801,
+ -0.0000000000016459150,
+ -0.0000000000006486827,
+ -0.0000000000002574095,
+ -0.0000000000001027889,
+ -0.0000000000000412846,
+ -0.0000000000000166711,
+ -0.0000000000000067657,
+ -0.0000000000000027585,
+ -0.0000000000000011296,
+ -0.0000000000000004645,
+ -0.0000000000000001917,
+ -0.0000000000000000794,
+ -0.0000000000000000330
+};
+static cheb_series an22_cs = {
+ an22_data,
+ 32,
+ -1, 1,
+ 18
+};
+
+/*
+ series for an21 on the interval -1.25000e-01 to -1.56250e-02
+ with weighted error 3.43e-17
+ log weighted error 16.47
+ significant figures required 14.48
+ decimal places required 17.16
+*/
+static double an21_data[24] = {
+ 0.0198313155263169394,
+ -0.0029376249067087533,
+ -0.0001136260695958196,
+ -0.0000100554451087156,
+ -0.0000013048787116563,
+ -0.0000002123881993151,
+ -0.0000000402270833384,
+ -0.0000000084996745953,
+ -0.0000000019514839426,
+ -0.0000000004783865344,
+ -0.0000000001236733992,
+ -0.0000000000334137486,
+ -0.0000000000093702824,
+ -0.0000000000027130128,
+ -0.0000000000008075954,
+ -0.0000000000002463214,
+ -0.0000000000000767656,
+ -0.0000000000000243883,
+ -0.0000000000000078831,
+ -0.0000000000000025882,
+ -0.0000000000000008619,
+ -0.0000000000000002908,
+ -0.0000000000000000993,
+ -0.0000000000000000343
+};
+static cheb_series an21_cs = {
+ an21_data,
+ 23,
+ -1, 1,
+ 12
+};
+
+/*
+ series for an20 on the interval -1.56250e-02 to 0.00000e+00
+ with weighted error 4.41e-17
+ log weighted error 16.36
+ significant figures required 14.16
+ decimal places required 16.96
+*/
+static double an20_data[16] = {
+ 0.0126732217145738027,
+ -0.0005212847072615621,
+ -0.0000052672111140370,
+ -0.0000001628202185026,
+ -0.0000000090991442687,
+ -0.0000000007438647126,
+ -0.0000000000795494752,
+ -0.0000000000104050944,
+ -0.0000000000015932426,
+ -0.0000000000002770648,
+ -0.0000000000000535343,
+ -0.0000000000000113062,
+ -0.0000000000000025772,
+ -0.0000000000000006278,
+ -0.0000000000000001621,
+ -0.0000000000000000441
+};
+static cheb_series an20_cs = {
+ an20_data,
+ 15,
+ -1, 1,
+ 8
+};
+
+/*
+ series for aph2 on the interval -1.00000e+00 to -1.25000e-01
+ with weighted error 2.94e-17
+ log weighted error 16.53
+ significant figures required 15.58
+ decimal places required 17.28
+*/
+static double aph2_data[32] = {
+ -0.2057088719781465107,
+ 0.0422196961357771922,
+ 0.0020482560511207275,
+ 0.0002607800735165006,
+ 0.0000474824268004729,
+ 0.0000105102756431612,
+ 0.0000026353534014668,
+ 0.0000007208824863499,
+ 0.0000002103236664473,
+ 0.0000000644975634555,
+ 0.0000000205802377264,
+ 0.0000000067836273921,
+ 0.0000000022974015284,
+ 0.0000000007961306765,
+ 0.0000000002813860610,
+ 0.0000000001011749057,
+ 0.0000000000369306738,
+ 0.0000000000136615066,
+ 0.0000000000051142751,
+ 0.0000000000019351689,
+ 0.0000000000007393607,
+ 0.0000000000002849792,
+ 0.0000000000001107281,
+ 0.0000000000000433412,
+ 0.0000000000000170801,
+ 0.0000000000000067733,
+ 0.0000000000000027017,
+ 0.0000000000000010835,
+ 0.0000000000000004367,
+ 0.0000000000000001769,
+ 0.0000000000000000719,
+ 0.0000000000000000294
+};
+static cheb_series aph2_cs = {
+ aph2_data,
+ 31,
+ -1, 1,
+ 16
+};
+
+/*
+ series for aph1 on the interval -1.25000e-01 to -1.56250e-02
+ with weighted error 6.38e-17
+ log weighted error 16.20
+ significant figures required 14.91
+ decimal places required 16.87
+*/
+static double aph1_data[22] = {
+ -0.1024172908077571694,
+ 0.0071697275146591248,
+ 0.0001209959363122329,
+ 0.0000073361512841220,
+ 0.0000007535382954272,
+ 0.0000001041478171741,
+ 0.0000000174358728519,
+ 0.0000000033399795033,
+ 0.0000000007073075174,
+ 0.0000000001619187515,
+ 0.0000000000394539982,
+ 0.0000000000101192282,
+ 0.0000000000027092778,
+ 0.0000000000007523806,
+ 0.0000000000002156369,
+ 0.0000000000000635283,
+ 0.0000000000000191757,
+ 0.0000000000000059143,
+ 0.0000000000000018597,
+ 0.0000000000000005950,
+ 0.0000000000000001934,
+ 0.0000000000000000638
+};
+static cheb_series aph1_cs = {
+ aph1_data,
+ 21,
+ -1, 1,
+ 10
+};
+
+/*
+ series for aph0 on the interval -1.56250e-02 to 0.00000e+00
+ with weighted error 2.29e-17
+ log weighted error 16.64
+ significant figures required 15.27
+ decimal places required 17.23
+*/
+static double aph0_data[15] = {
+ -0.0855849241130933257,
+ 0.0011214378867065261,
+ 0.0000042721029353664,
+ 0.0000000817607381483,
+ 0.0000000033907645000,
+ 0.0000000002253264423,
+ 0.0000000000206284209,
+ 0.0000000000023858763,
+ 0.0000000000003301618,
+ 0.0000000000000527010,
+ 0.0000000000000094555,
+ 0.0000000000000018709,
+ 0.0000000000000004024,
+ 0.0000000000000000930,
+ 0.0000000000000000229
+};
+static cheb_series aph0_cs = {
+ aph0_data,
+ 14,
+ -1, 1,
+ 7
+};
+
+
+static
+int
+airy_deriv_mod_phase(const double x, gsl_mode_t mode,
+ gsl_sf_result * ampl, gsl_sf_result * phi)
+{
+ const double pi34 = 2.356194490192344928847;
+ gsl_sf_result result_a;
+ gsl_sf_result result_p;
+ double a, p;
+ double sqx;
+ double x32;
+
+ if(x <= -4.0) {
+ double z = 128.0/(x*x*x) + 1.0;
+ cheb_eval_mode_e(&an20_cs, z, mode, &result_a);
+ cheb_eval_mode_e(&aph0_cs, z, mode, &result_p);
+ }
+ else if(x <= -2.0) {
+ double z = (128.0/(x*x*x) + 9.0) / 7.0;
+ cheb_eval_mode_e(&an21_cs, z, mode, &result_a);
+ cheb_eval_mode_e(&aph1_cs, z, mode, &result_p);
+ }
+ else if(x <= -1.0) {
+ double z = (16.0/(x*x*x) + 9.0) / 7.0;
+ cheb_eval_mode_e(&an22_cs, z, mode, &result_a);
+ cheb_eval_mode_e(&aph2_cs, z, mode, &result_p);
+ }
+ else {
+ ampl->val = 0.0;
+ ampl->err = 0.0;
+ phi->val = 0.0;
+ phi->err = 0.0;
+ GSL_ERROR ("x is greater than 1.0", GSL_EDOM);
+ }
+
+ a = 0.3125 + result_a.val;
+ p = -0.625 + result_p.val;
+
+ sqx = sqrt(-x);
+ x32 = x*sqx;
+
+ ampl->val = sqrt(a * sqx);
+ ampl->err = fabs(ampl->val) * (GSL_DBL_EPSILON + fabs(result_a.err/result_a.val));
+ phi->val = pi34 - x * sqx * p;
+ phi->err = fabs(phi->val) * (GSL_DBL_EPSILON + fabs(result_p.err/result_p.val));
+
+ return GSL_SUCCESS;
+}
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int
+gsl_sf_airy_Ai_deriv_scaled_e(const double x, gsl_mode_t mode, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x < -1.0) {
+ gsl_sf_result a;
+ gsl_sf_result p;
+ int status_ap = airy_deriv_mod_phase(x, mode, &a, &p);
+ double c = cos(p.val);
+ result->val = a.val * c;
+ result->err = fabs(result->val * p.err) + fabs(c * a.err);
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+ return status_ap;
+ }
+ else if(x <= 1.0) {
+ const double x3 = x*x*x;
+ const double x2 = x*x;
+ gsl_sf_result result_c0;
+ gsl_sf_result result_c1;
+ cheb_eval_mode_e(&aif_cs, x3, mode, &result_c0);
+ cheb_eval_mode_e(&aig_cs, x3, mode, &result_c1);
+
+ result->val = (x2*(0.125 + result_c0.val) - result_c1.val) - 0.25;
+ result->err = fabs(x2*result_c0.val) + result_c1.err;
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+
+ if(x > GSL_ROOT3_DBL_EPSILON*GSL_ROOT3_DBL_EPSILON) {
+ /* scale only if x is positive */
+ double s = exp(2.0*x*sqrt(x)/3.0);
+ result->val *= s;
+ result->err *= s;
+ }
+
+ return GSL_SUCCESS;
+ }
+ else if(x <= 4.0) {
+ const double sqrtx = sqrt(x);
+ const double z = (16.0/(x*sqrtx) - 9.0)/7.0;
+ const double s = sqrt(sqrtx);
+ gsl_sf_result result_c0;
+ cheb_eval_mode_e(&aip1_cs, z, mode, &result_c0);
+ result->val = -(0.28125 + result_c0.val) * s;
+ result->err = result_c0.err * s;
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ const double sqrtx = sqrt(x);
+ const double z = 16.0/(x*sqrtx) - 1.0;
+ const double s = sqrt(sqrtx);
+ gsl_sf_result result_c0;
+ cheb_eval_mode_e(&aip2_cs, z, mode, &result_c0);
+ result->val = -(0.28125 + result_c0.val) * s;
+ result->err = result_c0.err * s;
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+}
+
+
+int
+gsl_sf_airy_Ai_deriv_e(const double x, gsl_mode_t mode, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x < -1.0) {
+ gsl_sf_result a;
+ gsl_sf_result p;
+ int status_ap = airy_deriv_mod_phase(x, mode, &a, &p);
+ double c = cos(p.val);
+ result->val = a.val * c;
+ result->err = fabs(result->val * p.err) + fabs(c * a.err);
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+ return status_ap;
+ }
+ else if(x < 1.0) {
+ const double x3 = x*x*x;
+ gsl_sf_result result_c1;
+ gsl_sf_result result_c2;
+ cheb_eval_mode_e(&aif_cs, x3, mode, &result_c1);
+ cheb_eval_mode_e(&aig_cs, x3, mode, &result_c2);
+ result->val = (x*x*(0.125 + result_c1.val) - result_c2.val) - 0.25;
+ result->err = fabs(x*x*result_c1.err) + result_c2.err;
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x*x*x < 9.0/4.0 * GSL_LOG_DBL_MIN*GSL_LOG_DBL_MIN) {
+ gsl_sf_result result_aps;
+ const double arg = -2.0*x*sqrt(x)/3.0;
+ const int stat_a = gsl_sf_airy_Ai_deriv_scaled_e(x, mode, &result_aps);
+ const int stat_e = gsl_sf_exp_mult_err_e(arg, 1.5*fabs(arg*GSL_DBL_EPSILON),
+ result_aps.val, result_aps.err,
+ result);
+ return GSL_ERROR_SELECT_2(stat_e, stat_a);
+ }
+ else {
+ UNDERFLOW_ERROR(result);
+ }
+}
+
+
+int
+gsl_sf_airy_Bi_deriv_scaled_e(const double x, gsl_mode_t mode, gsl_sf_result * result)
+{
+ const double atr = 8.7506905708484345; /* 16./(sqrt(8)-1) */
+ const double btr = -2.0938363213560543; /* -(sqrt(8)+1)/(sqrt(8)-1) */
+
+ /* CHECK_POINTER(result) */
+
+ if(x < -1.0) {
+ gsl_sf_result a;
+ gsl_sf_result p;
+ int status_ap = airy_deriv_mod_phase(x, mode, &a, &p);
+ double s = sin(p.val);
+ result->val = a.val * s;
+ result->err = fabs(result->val * p.err) + fabs(s * a.err);
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+ return status_ap;
+ }
+ else if(x < 1.0) {
+ const double x3 = x*x*x;
+ const double x2 = x*x;
+ gsl_sf_result result_c1;
+ gsl_sf_result result_c2;
+ cheb_eval_mode_e(&bif_cs, x3, mode, &result_c1);
+ cheb_eval_mode_e(&big_cs, x3, mode, &result_c2);
+ result->val = x2 * (result_c1.val + 0.25) + result_c2.val + 0.5;
+ result->err = x2 * result_c1.err + result_c2.err;
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+
+ if(x > GSL_ROOT3_DBL_EPSILON*GSL_ROOT3_DBL_EPSILON) {
+ /* scale only if x is positive */
+ const double s = exp(-2.0*x*sqrt(x)/3.0);
+ result->val *= s;
+ result->err *= s;
+ }
+
+ return GSL_SUCCESS;
+ }
+ else if(x < 2.0) {
+ const double z = (2.0*x*x*x - 9.0) / 7.0;
+ const double s = exp(-2.0*x*sqrt(x)/3.0);
+ gsl_sf_result result_c0;
+ gsl_sf_result result_c1;
+ cheb_eval_mode_e(&bif2_cs, z, mode, &result_c0);
+ cheb_eval_mode_e(&big2_cs, z, mode, &result_c1);
+ result->val = s * (x*x * (0.25 + result_c0.val) + 0.5 + result_c1.val);
+ result->err = s * (x*x * result_c0.err + result_c1.err);
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x < 4.0) {
+ const double sqrtx = sqrt(x);
+ const double z = atr/(x*sqrtx) + btr;
+ const double s = sqrt(sqrtx);
+ gsl_sf_result result_c0;
+ cheb_eval_mode_e(&bip1_cs, z, mode, &result_c0);
+ result->val = s * (0.625 + result_c0.val);
+ result->err = s * result_c0.err;
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ const double sqrtx = sqrt(x);
+ const double z = 16.0/(x*sqrtx) - 1.0;
+ const double s = sqrt(sqrtx);
+ gsl_sf_result result_c0;
+ cheb_eval_mode_e(&bip2_cs, z, mode, &result_c0);
+ result->val = s * (0.625 + result_c0.val);
+ result->err = s * result_c0.err;
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+}
+
+
+int
+gsl_sf_airy_Bi_deriv_e(const double x, gsl_mode_t mode, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x < -1.0) {
+ gsl_sf_result a;
+ gsl_sf_result p;
+ int status_ap = airy_deriv_mod_phase(x, mode, &a, &p);
+ double s = sin(p.val);
+ result->val = a.val * s;
+ result->err = fabs(result->val * p.err) + fabs(s * a.err);
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+ return status_ap;
+ }
+ else if(x < 1.0) {
+ const double x3 = x*x*x;
+ const double x2 = x*x;
+ gsl_sf_result result_c1;
+ gsl_sf_result result_c2;
+ cheb_eval_mode_e(&bif_cs, x3, mode, &result_c1);
+ cheb_eval_mode_e(&big_cs, x3, mode, &result_c2);
+ result->val = x2 * (result_c1.val + 0.25) + result_c2.val + 0.5;
+ result->err = x2 * result_c1.err + result_c2.err;
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x < 2.0) {
+ const double z = (2.0*x*x*x - 9.0) / 7.0;
+ gsl_sf_result result_c1;
+ gsl_sf_result result_c2;
+ cheb_eval_mode_e(&bif2_cs, z, mode, &result_c1);
+ cheb_eval_mode_e(&big2_cs, z, mode, &result_c2);
+ result->val = x*x * (result_c1.val + 0.25) + result_c2.val + 0.5;
+ result->err = x*x * result_c1.err + result_c2.err;
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x < GSL_ROOT3_DBL_MAX*GSL_ROOT3_DBL_MAX) {
+ gsl_sf_result result_bps;
+ const double arg = 2.0*(x*sqrt(x)/3.0);
+ int stat_b = gsl_sf_airy_Bi_deriv_scaled_e(x, mode, &result_bps);
+ int stat_e = gsl_sf_exp_mult_err_e(arg, 1.5*fabs(arg*GSL_DBL_EPSILON),
+ result_bps.val, result_bps.err,
+ result);
+ return GSL_ERROR_SELECT_2(stat_e, stat_b);
+ }
+ else {
+ OVERFLOW_ERROR(result);
+ }
+}
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_airy_Ai_deriv_scaled(const double x, gsl_mode_t mode)
+{
+ EVAL_RESULT(gsl_sf_airy_Ai_deriv_scaled_e(x, mode, &result));
+}
+
+double gsl_sf_airy_Ai_deriv(const double x, gsl_mode_t mode)
+{
+ EVAL_RESULT(gsl_sf_airy_Ai_deriv_e(x, mode, &result));
+}
+
+double gsl_sf_airy_Bi_deriv_scaled(const double x, gsl_mode_t mode)
+{
+ EVAL_RESULT(gsl_sf_airy_Bi_deriv_scaled_e(x, mode, &result));
+}
+
+double gsl_sf_airy_Bi_deriv(const double x, gsl_mode_t mode)
+{
+ EVAL_RESULT(gsl_sf_airy_Bi_deriv_e(x, mode, &result));
+}
diff --git a/gsl-1.9/specfunc/airy_zero.c b/gsl-1.9/specfunc/airy_zero.c
new file mode 100644
index 0000000..3f10001
--- /dev/null
+++ b/gsl-1.9/specfunc/airy_zero.c
@@ -0,0 +1,546 @@
+/* specfunc/airy_zero.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_airy.h>
+
+#include "error.h"
+
+static const double zero_Ai[] = {
+ 0,
+ -2.338107410459767039,
+ -4.087949444130970617,
+ -5.520559828095551059,
+ -6.786708090071758999,
+ -7.944133587120853123,
+ -9.022650853340980380,
+ -10.04017434155808593,
+ -11.00852430373326289,
+ -11.93601556323626252,
+ -12.82877675286575720,
+ -13.69148903521071793,
+ -14.52782995177533498,
+ -15.34075513597799686,
+ -16.13268515694577144,
+ -16.90563399742994263,
+ -17.661300105697057509,
+ -18.401132599207115416,
+ -19.126380474246952144,
+ -19.838129891721499701,
+ -20.537332907677566360,
+ -21.224829943642096955,
+ -21.901367595585130707,
+ -22.567612917496502831,
+ -23.224165001121681061,
+ -23.871564455535918567,
+ -24.510301236589677490,
+ -25.140821166148963748,
+ -25.763531400982756459,
+ -26.378805052137232374,
+ -26.986985111606367686,
+ -27.588387809882444812,
+ -28.183305502632644923,
+ -28.772009165237435382,
+ -29.354750558766287963,
+ -29.931764119086555913,
+ -30.503268611418505287,
+ -31.069468585183755604,
+ -31.63055565801265934,
+ -32.18670965295205069,
+ -32.73809960900026913,
+ -33.28488468190140188,
+ -33.82721494950865194,
+ -34.36523213386365906,
+ -34.89907025034531210,
+ -35.42885619274788846,
+ -35.95471026189862926,
+ -36.47674664437480896,
+ -36.99507384699450161,
+ -37.50979509200501613,
+ -38.02100867725525443,
+ -38.52880830509424882,
+ -39.03328338327251391,
+ -39.53451930072301805,
+ -40.03259768075417603,
+ -40.52759661388971821,
+ -41.01959087233248966,
+ -41.50865210780525018,
+ -41.99484903432643004,
+ -42.47824759730839188,
+ -42.95891113021656009,
+ -43.43690049989685412,
+ -43.91227424156370168,
+ -44.38508868433939023,
+ -44.85539806814583243,
+ -45.32325465267043011,
+ -45.78870881905730086,
+ -46.25180916491254629,
+ -46.71260259315651633,
+ -47.17113439520631705,
+ -47.62744832892739292,
+ -48.08158669175325711,
+ -48.53359038933679845,
+ -48.98349900006458366,
+ -49.43135083573678341,
+ -49.87718299868941729,
+ -50.32103143561221860,
+ -50.76293098829428522,
+ -51.20291544151056412,
+ -51.64101756824489758,
+ -52.07726917242964943,
+ -52.51170112936766183,
+ -52.94434342398931824,
+ -53.37522518708567514,
+ -53.80437472964785717,
+ -54.23181957543308298,
+ -54.65758649186871111,
+ -55.08170151939748312,
+ -55.50418999935962251,
+ -55.92507660050055598,
+ -56.34438534418670066,
+ -56.76213962840595327,
+ -57.17836225062417808,
+ -57.59307542956407782,
+ -58.00630082596830627,
+ -58.41805956240450934,
+ -58.82837224216613231,
+ -59.23725896731927534,
+ -59.64473935594259360,
+ -60.05083255860419805,
+ -60.45555727411669871
+};
+static const size_t size_zero_Ai = sizeof(zero_Ai)/sizeof(double);
+
+
+static const double zero_Bi[] = {
+ 0,
+ -1.173713222709127925,
+ -3.271093302836352716,
+ -4.830737841662015933,
+ -6.169852128310251260,
+ -7.376762079367763714,
+ -8.491948846509388013,
+ -9.538194379346238887,
+ -10.52991350670535792,
+ -11.47695355127877944,
+ -12.38641713858273875,
+ -13.26363952294180555,
+ -14.11275680906865779,
+ -14.93705741215416404,
+ -15.739210351190482771,
+ -16.521419550634379054,
+ -17.285531624581242533,
+ -18.033113287225001572,
+ -18.765508284480081041,
+ -19.483880132989234014,
+ -20.189244785396202420,
+ -20.882495994193175768,
+ -21.564425284712977653,
+ -22.235737881803385167,
+ -22.897065554219793474,
+ -23.548977079642448269,
+ -24.191986850649000086,
+ -24.826562012152892172,
+ -25.453128427085131994,
+ -26.072075698466804494,
+ -26.683761425120990449,
+ -27.288514830076298204,
+ -27.886639871735962459,
+ -28.478417925678661737,
+ -29.064110107777650305,
+ -29.643959295918396591,
+ -30.218191897047274645,
+ -30.787019397921766297,
+ -31.350639731255585371,
+ -31.90923848358456965,
+ -32.46298996683685318,
+ -33.01205817205683814,
+ -33.55659762084006113,
+ -34.09675412765602851,
+ -34.63266548426775468,
+ -35.16446207582101720,
+ -35.69226743681080479,
+ -36.21619875398748222,
+ -36.73636732230120657,
+ -37.25287895916828697,
+ -37.76583438165180116,
+ -38.27532955056003997,
+ -38.78145598496327279,
+ -39.28430105019802461,
+ -39.78394822205711298,
+ -40.28047732954369150,
+ -40.77396477829068148,
+ -41.26448375650675678,
+ -41.75210442510106287,
+ -42.23689409345656643,
+ -42.71891738216253539,
+ -43.19823637387693118,
+ -43.67491075336673948,
+ -44.14899793766617113,
+ -44.62055319719727274,
+ -45.08962976861312825,
+ -45.55627896004907928,
+ -46.02055024940102076,
+ -46.48249137619078661,
+ -46.94214842752602207,
+ -47.39956591861496210,
+ -47.85478686825452176,
+ -48.30785286967246692,
+ -48.75880415707066192,
+ -49.20767966818603897,
+ -49.65451710315861501,
+ -50.09935297997125482,
+ -50.54222268670364757,
+ -50.98316053082286586,
+ -51.42219978571468262,
+ -51.85937273464332870,
+ -52.29471071231240525,
+ -52.72824414418606069,
+ -53.16000258371716397,
+ -53.59001474761792882,
+ -54.01830854929815828,
+ -54.44491113058688729,
+ -54.86984889184461534,
+ -55.29314752056546491,
+ -55.71483201856140365,
+ -56.13492672781406761,
+ -56.55345535507366411,
+ -56.97044099527886475,
+ -57.38590615386647834,
+ -57.79987276803497897,
+ -58.21236222702161974,
+ -58.62339539144885603,
+ -59.03299261179210306,
+ -59.44117374601743460,
+ -59.84795817643466996,
+ -60.25336482580837088
+};
+static const size_t size_zero_Bi = sizeof(zero_Bi)/sizeof(double);
+
+
+static const double zero_Aip[] = {
+ 0,
+ -1.018792971647471089,
+ -3.248197582179836738,
+ -4.820099211178735639,
+ -6.163307355639486822,
+ -7.372177255047770177,
+ -8.488486734019722133,
+ -9.535449052433547471,
+ -10.52766039695740728,
+ -11.47505663348024529,
+ -12.384788371845747325,
+ -13.262218961665210382,
+ -14.111501970462995282,
+ -14.935937196720517467,
+ -15.738201373692538303,
+ -16.520503825433793542,
+ -17.284695050216437357,
+ -18.032344622504393395,
+ -18.764798437665954740,
+ -19.483221656567231178,
+ -20.188631509463373154,
+ -20.881922755516737701,
+ -21.563887723198974958,
+ -22.235232285348913331,
+ -22.896588738874619001,
+ -23.548526295928801574,
+ -24.191559709526353841,
+ -24.826156425921155001,
+ -25.452742561777649948,
+ -26.071707935173912515,
+ -26.683410328322449767,
+ -27.288179121523985029,
+ -27.886318408768461192,
+ -28.478109683102278108,
+ -29.063814162638199090,
+ -29.643674814632015921,
+ -30.217918124468574603,
+ -30.786755648012502519,
+ -31.350385379083034671,
+ -31.90899295843046320,
+ -32.46275274623847982,
+ -33.01182877663428709,
+ -33.55637560978942190,
+ -34.09653909480913771,
+ -34.63245705463586589,
+ -35.16425990255340758,
+ -35.69207119851046870,
+ -36.21600815233519918,
+ -36.73618207994680321,
+ -37.25269881785414827,
+ -37.76565910053887108,
+ -38.27515890473087933,
+ -38.78128976408036876,
+ -39.28413905729859644,
+ -39.78379027246823278,
+ -40.28032324990371935,
+ -40.77381440566486637,
+ -41.26433693758643383,
+ -41.75196101547722703,
+ -42.23675395695976012,
+ -42.71878039026198233,
+ -43.19810240513270670,
+ -43.67477969292950869,
+ -44.14886967681966886,
+ -44.62042763293925724,
+ -45.08950680327102630,
+ -45.55615850092696446,
+ -46.02043220845493728,
+ -46.48237566972975615,
+ -46.94203497593635633,
+ -47.39945464610575493,
+ -47.85467770262241617,
+ -48.30774574208398774,
+ -48.75869900186057804,
+ -49.20757642267037247,
+ -49.65441570746105074,
+ -50.09925337686182515,
+ -50.54212482144867502,
+ -50.98306435104524282,
+ -51.42210524126365311,
+ -51.85927977747301469,
+ -52.29461929636838876,
+ -52.72815422529939506,
+ -53.15991411950524351,
+ -53.58992769739169611,
+ -54.01822287397517367,
+ -54.44482679260982599,
+ -54.86976585510479430,
+ -55.29306575033103518,
+ -55.71475148140987392,
+ -56.13484739156885235,
+ -56.55337718874437424,
+ -56.97036396900508167,
+ -57.38583023886477265,
+ -57.79979793654895377,
+ -58.21228845227477578,
+ -58.62332264760009139,
+ -59.03292087389367419,
+ -59.44110298997521892,
+ -59.84788837897058171,
+ -60.25329596442479317
+};
+static const size_t size_zero_Aip = sizeof(zero_Aip)/sizeof(double);
+
+
+static const double zero_Bip[] = {
+ 0,
+ -2.294439682614123247,
+ -4.073155089071828216,
+ -5.512395729663599496,
+ -6.781294445990305390,
+ -7.940178689168578927,
+ -9.019583358794239067,
+ -10.037696334908545802,
+ -11.006462667712289940,
+ -11.934261645014844663,
+ -12.827258309177217640,
+ -13.690155826835049101,
+ -14.526645763485711410,
+ -15.339693082242404109,
+ -16.131724782385900578,
+ -16.904759411889649958,
+ -17.660498743114976102,
+ -18.400394367181703280,
+ -19.125697156412638066,
+ -19.837494718415910503,
+ -20.536740241453273980,
+ -21.224275044889266569,
+ -21.900846445139208281,
+ -22.567122080497200470,
+ -23.223701521208962116,
+ -23.871125771677973595,
+ -24.509885117016242729,
+ -25.140425655367878908,
+ -25.763154776913454319,
+ -26.378445791146615697,
+ -26.986641859775034987,
+ -27.588059359225600573,
+ -28.182990771292975456,
+ -28.771707180886056250,
+ -29.354460444612957224,
+ -29.931485082026055160,
+ -30.502999931936645516,
+ -31.069209608721234058,
+ -31.63030578754333679,
+ -32.18646834257807369,
+ -32.73786635840274752,
+ -33.28465903151424981,
+ -33.82699647630635587,
+ -34.36502044767239631,
+ -34.89886499060196419,
+ -35.42865702564380962,
+ -35.95451687785511190,
+ -36.47655875580547918,
+ -36.99489118631672770,
+ -37.50961740986809593,
+ -38.02083574095788210
+};
+static const size_t size_zero_Bip = sizeof(zero_Bip)/sizeof(double);
+
+
+
+/* [Abramowitz+Stegun, 10.4.105] */
+static double
+zero_f(double z)
+{
+ const double pre = pow(z, 2.0/3.0);
+ const double zi2 = 1.0/(z*z);
+ const double zi4 = zi2 * zi2;
+ const double t1 = 5.0/48.0 * zi2;
+ const double t2 = -5.0/36.0 * zi4;
+ const double t3 = 77125.0/82944.0 * zi4 * zi2;
+ const double t4 = -108056875.0/6967296.0 * zi4 * zi4;
+ return pre * (1.0 + t1 + t2 + t3 + t4);
+
+}
+static double
+zero_g(double z)
+{
+ const double pre = pow(z, 2.0/3.0);
+ const double zi2 = 1.0/(z*z);
+ const double zi4 = zi2 * zi2;
+ const double t1 = -7.0/48.0 * zi2;
+ const double t2 = 35.0/288.0 * zi4;
+ const double t3 = -181223.0/207360.0 * zi4 * zi2;
+ const double t4 = 18683371.0/1244160.0 * zi4 * zi4;
+ return pre * (1.0 + t1 + t2 + t3 + t4);
+}
+
+
+
+int
+gsl_sf_airy_zero_Ai_e(unsigned int s, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(s < 1) {
+ DOMAIN_ERROR_MSG("s is less than 1", result);
+ }
+ else if(s < size_zero_Ai) {
+ result->val = zero_Ai[s];
+ result->err = GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ const double z = 3.0*M_PI/8.0 * (4.0*s - 1.0);
+ const double f = zero_f(z);
+ result->val = -f;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+}
+
+
+int
+gsl_sf_airy_zero_Bi_e(unsigned int s, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(s < 1) {
+ DOMAIN_ERROR_MSG("s is less than 1", result);
+ }
+ else if(s < size_zero_Bi) {
+ result->val = zero_Bi[s];
+ result->err = GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ const double z = 3.0*M_PI/8.0 * (4.0*s - 3.0);
+ const double f = zero_f(z);
+ result->val = -f;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+}
+
+
+int
+gsl_sf_airy_zero_Ai_deriv_e(unsigned int s, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(s < 1) {
+ DOMAIN_ERROR_MSG("s is less than 1", result);
+ }
+ else if(s < size_zero_Aip) {
+ result->val = zero_Aip[s];
+ result->err = GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ const double z = 3.0*M_PI/8.0 * (4.0*s - 3.0);
+ const double g = zero_g(z);
+ result->val = -g;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+}
+
+
+int
+gsl_sf_airy_zero_Bi_deriv_e(unsigned int s, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(s < 1) {
+ DOMAIN_ERROR_MSG("s is less than 1", result);
+ }
+ else if(s < size_zero_Bip) {
+ result->val = zero_Bip[s];
+ result->err = GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ const double z = 3.0*M_PI/8.0 * (4.0*s - 1.0);
+ const double g = zero_g(z);
+ result->val = -g;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+}
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_airy_zero_Ai(unsigned int s)
+{
+ EVAL_RESULT(gsl_sf_airy_zero_Ai_e(s, &result));
+}
+
+double gsl_sf_airy_zero_Bi(unsigned int s)
+{
+ EVAL_RESULT(gsl_sf_airy_zero_Bi_e(s, &result));
+}
+
+double gsl_sf_airy_zero_Ai_deriv(unsigned int s)
+{
+ EVAL_RESULT(gsl_sf_airy_zero_Ai_deriv_e(s, &result));
+}
+
+double gsl_sf_airy_zero_Bi_deriv(unsigned int s)
+{
+ EVAL_RESULT(gsl_sf_airy_zero_Bi_deriv_e(s, &result));
+}
diff --git a/gsl-1.9/specfunc/atanint.c b/gsl-1.9/specfunc/atanint.c
new file mode 100644
index 0000000..e068929
--- /dev/null
+++ b/gsl-1.9/specfunc/atanint.c
@@ -0,0 +1,115 @@
+/* specfunc/atanint.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_mode.h>
+#include <gsl/gsl_sf_expint.h>
+
+#include "chebyshev.h"
+#include "cheb_eval.c"
+
+
+static double atanint_data[21] = {
+ 1.91040361296235937512,
+ -0.4176351437656746940e-01,
+ 0.275392550786367434e-02,
+ -0.25051809526248881e-03,
+ 0.2666981285121171e-04,
+ -0.311890514107001e-05,
+ 0.38833853132249e-06,
+ -0.5057274584964e-07,
+ 0.681225282949e-08,
+ -0.94212561654e-09,
+ 0.13307878816e-09,
+ -0.1912678075e-10,
+ 0.278912620e-11,
+ -0.41174820e-12,
+ 0.6142987e-13,
+ -0.924929e-14,
+ 0.140387e-14,
+ -0.21460e-15,
+ 0.3301e-16,
+ -0.511e-17,
+ 0.79e-18,
+};
+static cheb_series atanint_cs = {
+ atanint_data,
+ 20,
+ -1, 1,
+ 10
+};
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*/
+
+int
+gsl_sf_atanint_e(const double x, gsl_sf_result * result)
+{
+ const double ax = fabs(x);
+ const double sgn = GSL_SIGN(x);
+
+ /* CHECK_POINTER(result) */
+
+ if(ax == 0.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(ax < 0.5*GSL_SQRT_DBL_EPSILON) {
+ result->val = x;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(ax <= 1.0) {
+ const double t = 2.0 * (x*x - 0.5);
+ gsl_sf_result result_c;
+ cheb_eval_e(&atanint_cs, t, &result_c);
+ result->val = x * result_c.val;
+ result->err = x * result_c.err;
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(ax < 1.0/GSL_SQRT_DBL_EPSILON) {
+ const double t = 2.0 * (1.0/(x*x) - 0.5);
+ gsl_sf_result result_c;
+ cheb_eval_e(&atanint_cs, t, &result_c);
+ result->val = sgn * (0.5*M_PI*log(ax) + result_c.val/ax);
+ result->err = result_c.err/ax + fabs(result->val*GSL_DBL_EPSILON);
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ result->val = sgn * 0.5*M_PI*log(ax);
+ result->err = 2.0 * fabs(result->val * GSL_DBL_EPSILON);
+ return GSL_SUCCESS;
+ }
+}
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_atanint(const double x)
+{
+ EVAL_RESULT(gsl_sf_atanint_e(x, &result));
+}
diff --git a/gsl-1.9/specfunc/bessel.c b/gsl-1.9/specfunc/bessel.c
new file mode 100644
index 0000000..6129a2d
--- /dev/null
+++ b/gsl-1.9/specfunc/bessel.c
@@ -0,0 +1,938 @@
+/* specfunc/bessel.c
+ *
+ * Copyright (C) 1996,1997,1998,1999,2000,2001,2002,2003 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+/* Miscellaneous support functions for Bessel function evaluations.
+ */
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_airy.h>
+#include <gsl/gsl_sf_elementary.h>
+#include <gsl/gsl_sf_exp.h>
+#include <gsl/gsl_sf_gamma.h>
+#include <gsl/gsl_sf_trig.h>
+
+#include "error.h"
+
+#include "bessel_amp_phase.h"
+#include "bessel_temme.h"
+#include "bessel.h"
+
+#define CubeRoot2_ 1.25992104989487316476721060728
+
+
+
+/* Debye functions [Abramowitz+Stegun, 9.3.9-10] */
+
+inline static double
+debye_u1(const double * tpow)
+{
+ return (3.0*tpow[1] - 5.0*tpow[3])/24.0;
+}
+
+inline static double
+debye_u2(const double * tpow)
+{
+ return (81.0*tpow[2] - 462.0*tpow[4] + 385.0*tpow[6])/1152.0;
+}
+
+inline
+static double debye_u3(const double * tpow)
+{
+ return (30375.0*tpow[3] - 369603.0*tpow[5] + 765765.0*tpow[7] - 425425.0*tpow[9])/414720.0;
+}
+
+inline
+static double debye_u4(const double * tpow)
+{
+ return (4465125.0*tpow[4] - 94121676.0*tpow[6] + 349922430.0*tpow[8] -
+ 446185740.0*tpow[10] + 185910725.0*tpow[12])/39813120.0;
+}
+
+inline
+static double debye_u5(const double * tpow)
+{
+ return (1519035525.0*tpow[5] - 49286948607.0*tpow[7] +
+ 284499769554.0*tpow[9] - 614135872350.0*tpow[11] +
+ 566098157625.0*tpow[13] - 188699385875.0*tpow[15])/6688604160.0;
+}
+
+#if 0
+inline
+static double debye_u6(const double * tpow)
+{
+ return (2757049477875.0*tpow[6] - 127577298354750.0*tpow[8] +
+ 1050760774457901.0*tpow[10] - 3369032068261860.0*tpow[12] +
+ 5104696716244125.0*tpow[14] - 3685299006138750.0*tpow[16] +
+ 1023694168371875.0*tpow[18])/4815794995200.0;
+}
+#endif
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int
+gsl_sf_bessel_IJ_taylor_e(const double nu, const double x,
+ const int sign,
+ const int kmax,
+ const double threshold,
+ gsl_sf_result * result
+ )
+{
+ /* CHECK_POINTER(result) */
+
+ if(nu < 0.0 || x < 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x == 0.0) {
+ if(nu == 0.0) {
+ result->val = 1.0;
+ result->err = 0.0;
+ }
+ else {
+ result->val = 0.0;
+ result->err = 0.0;
+ }
+ return GSL_SUCCESS;
+ }
+ else {
+ gsl_sf_result prefactor; /* (x/2)^nu / Gamma(nu+1) */
+ gsl_sf_result sum;
+
+ int stat_pre;
+ int stat_sum;
+ int stat_mul;
+
+ if(nu == 0.0) {
+ prefactor.val = 1.0;
+ prefactor.err = 0.0;
+ stat_pre = GSL_SUCCESS;
+ }
+ else if(nu < INT_MAX-1) {
+ /* Separate the integer part and use
+ * y^nu / Gamma(nu+1) = y^N /N! y^f / (N+1)_f,
+ * to control the error.
+ */
+ const int N = (int)floor(nu + 0.5);
+ const double f = nu - N;
+ gsl_sf_result poch_factor;
+ gsl_sf_result tc_factor;
+ const int stat_poch = gsl_sf_poch_e(N+1.0, f, &poch_factor);
+ const int stat_tc = gsl_sf_taylorcoeff_e(N, 0.5*x, &tc_factor);
+ const double p = pow(0.5*x,f);
+ prefactor.val = tc_factor.val * p / poch_factor.val;
+ prefactor.err = tc_factor.err * p / poch_factor.val;
+ prefactor.err += fabs(prefactor.val) / poch_factor.val * poch_factor.err;
+ prefactor.err += 2.0 * GSL_DBL_EPSILON * fabs(prefactor.val);
+ stat_pre = GSL_ERROR_SELECT_2(stat_tc, stat_poch);
+ }
+ else {
+ gsl_sf_result lg;
+ const int stat_lg = gsl_sf_lngamma_e(nu+1.0, &lg);
+ const double term1 = nu*log(0.5*x);
+ const double term2 = lg.val;
+ const double ln_pre = term1 - term2;
+ const double ln_pre_err = GSL_DBL_EPSILON * (fabs(term1)+fabs(term2)) + lg.err;
+ const int stat_ex = gsl_sf_exp_err_e(ln_pre, ln_pre_err, &prefactor);
+ stat_pre = GSL_ERROR_SELECT_2(stat_ex, stat_lg);
+ }
+
+ /* Evaluate the sum.
+ * [Abramowitz+Stegun, 9.1.10]
+ * [Abramowitz+Stegun, 9.6.7]
+ */
+ {
+ const double y = sign * 0.25 * x*x;
+ double sumk = 1.0;
+ double term = 1.0;
+ int k;
+
+ for(k=1; k<=kmax; k++) {
+ term *= y/((nu+k)*k);
+ sumk += term;
+ if(fabs(term/sumk) < threshold) break;
+ }
+
+ sum.val = sumk;
+ sum.err = threshold * fabs(sumk);
+
+ stat_sum = ( k >= kmax ? GSL_EMAXITER : GSL_SUCCESS );
+ }
+
+ stat_mul = gsl_sf_multiply_err_e(prefactor.val, prefactor.err,
+ sum.val, sum.err,
+ result);
+
+ return GSL_ERROR_SELECT_3(stat_mul, stat_pre, stat_sum);
+ }
+}
+
+
+/* x >> nu*nu+1
+ * error ~ O( ((nu*nu+1)/x)^4 )
+ *
+ * empirical error analysis:
+ * choose GSL_ROOT4_MACH_EPS * x > (nu*nu + 1)
+ *
+ * This is not especially useful. When the argument gets
+ * large enough for this to apply, the cos() and sin()
+ * start loosing digits. However, this seems inevitable
+ * for this particular method.
+ *
+ * Wed Jun 25 14:39:38 MDT 2003 [GJ]
+ * This function was inconsistent since the Q term did not
+ * go to relative order eps^2. That's why the error estimate
+ * originally given was screwy (it didn't make sense that the
+ * "empirical" error was coming out O(eps^3)).
+ * With Q to proper order, the error is O(eps^4).
+ */
+int
+gsl_sf_bessel_Jnu_asympx_e(const double nu, const double x, gsl_sf_result * result)
+{
+ double mu = 4.0*nu*nu;
+ double mum1 = mu-1.0;
+ double mum9 = mu-9.0;
+ double mum25 = mu-25.0;
+ double chi = x - (0.5*nu + 0.25)*M_PI;
+ double P = 1.0 - mum1*mum9/(128.0*x*x);
+ double Q = mum1/(8.0*x) * (1.0 - mum9*mum25/(384.0*x*x));
+ double pre = sqrt(2.0/(M_PI*x));
+ double c = cos(chi);
+ double s = sin(chi);
+ double r = mu/x;
+ result->val = pre * (c*P - s*Q);
+ result->err = pre * GSL_DBL_EPSILON * (1.0 + fabs(x)) * (fabs(c*P) + fabs(s*Q));
+ result->err += pre * fabs(0.1*r*r*r*r);
+ return GSL_SUCCESS;
+}
+
+
+/* x >> nu*nu+1
+ */
+int
+gsl_sf_bessel_Ynu_asympx_e(const double nu, const double x, gsl_sf_result * result)
+{
+ double ampl;
+ double theta;
+ double alpha = x;
+ double beta = -0.5*nu*M_PI;
+ int stat_a = gsl_sf_bessel_asymp_Mnu_e(nu, x, &ampl);
+ int stat_t = gsl_sf_bessel_asymp_thetanu_corr_e(nu, x, &theta);
+ double sin_alpha = sin(alpha);
+ double cos_alpha = cos(alpha);
+ double sin_chi = sin(beta + theta);
+ double cos_chi = cos(beta + theta);
+ double sin_term = sin_alpha * cos_chi + sin_chi * cos_alpha;
+ double sin_term_mag = fabs(sin_alpha * cos_chi) + fabs(sin_chi * cos_alpha);
+ result->val = ampl * sin_term;
+ result->err = fabs(ampl) * GSL_DBL_EPSILON * sin_term_mag;
+ result->err += fabs(result->val) * 2.0 * GSL_DBL_EPSILON;
+
+ if(fabs(alpha) > 1.0/GSL_DBL_EPSILON) {
+ result->err *= 0.5 * fabs(alpha);
+ }
+ else if(fabs(alpha) > 1.0/GSL_SQRT_DBL_EPSILON) {
+ result->err *= 256.0 * fabs(alpha) * GSL_SQRT_DBL_EPSILON;
+ }
+
+ return GSL_ERROR_SELECT_2(stat_t, stat_a);
+}
+
+
+/* x >> nu*nu+1
+ */
+int
+gsl_sf_bessel_Inu_scaled_asympx_e(const double nu, const double x, gsl_sf_result * result)
+{
+ double mu = 4.0*nu*nu;
+ double mum1 = mu-1.0;
+ double mum9 = mu-9.0;
+ double pre = 1.0/sqrt(2.0*M_PI*x);
+ double r = mu/x;
+ result->val = pre * (1.0 - mum1/(8.0*x) + mum1*mum9/(128.0*x*x));
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val) + pre * fabs(0.1*r*r*r);
+ return GSL_SUCCESS;
+}
+
+/* x >> nu*nu+1
+ */
+int
+gsl_sf_bessel_Knu_scaled_asympx_e(const double nu, const double x, gsl_sf_result * result)
+{
+ double mu = 4.0*nu*nu;
+ double mum1 = mu-1.0;
+ double mum9 = mu-9.0;
+ double pre = sqrt(M_PI/(2.0*x));
+ double r = nu/x;
+ result->val = pre * (1.0 + mum1/(8.0*x) + mum1*mum9/(128.0*x*x));
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val) + pre * fabs(0.1*r*r*r);
+ return GSL_SUCCESS;
+}
+
+
+/* nu -> Inf; uniform in x > 0 [Abramowitz+Stegun, 9.7.7]
+ *
+ * error:
+ * The error has the form u_N(t)/nu^N where 0 <= t <= 1.
+ * It is not hard to show that |u_N(t)| is small for such t.
+ * We have N=6 here, and |u_6(t)| < 0.025, so the error is clearly
+ * bounded by 0.025/nu^6. This gives the asymptotic bound on nu
+ * seen below as nu ~ 100. For general MACH_EPS it will be
+ * nu > 0.5 / MACH_EPS^(1/6)
+ * When t is small, the bound is even better because |u_N(t)| vanishes
+ * as t->0. In fact u_N(t) ~ C t^N as t->0, with C ~= 0.1.
+ * We write
+ * err_N <= min(0.025, C(1/(1+(x/nu)^2))^3) / nu^6
+ * therefore
+ * min(0.29/nu^2, 0.5/(nu^2+x^2)) < MACH_EPS^{1/3}
+ * and this is the general form.
+ *
+ * empirical error analysis, assuming 14 digit requirement:
+ * choose x > 50.000 nu ==> nu > 3
+ * choose x > 10.000 nu ==> nu > 15
+ * choose x > 2.000 nu ==> nu > 50
+ * choose x > 1.000 nu ==> nu > 75
+ * choose x > 0.500 nu ==> nu > 80
+ * choose x > 0.100 nu ==> nu > 83
+ *
+ * This makes sense. For x << nu, the error will be of the form u_N(1)/nu^N,
+ * since the polynomial term will be evaluated near t=1, so the bound
+ * on nu will become constant for small x. Furthermore, increasing x with
+ * nu fixed will decrease the error.
+ */
+int
+gsl_sf_bessel_Inu_scaled_asymp_unif_e(const double nu, const double x, gsl_sf_result * result)
+{
+ int i;
+ double z = x/nu;
+ double root_term = hypot(1.0,z);
+ double pre = 1.0/sqrt(2.0*M_PI*nu * root_term);
+ double eta = root_term + log(z/(1.0+root_term));
+ double ex_arg = ( z < 1.0/GSL_ROOT3_DBL_EPSILON ? nu*(-z + eta) : -0.5*nu/z*(1.0 - 1.0/(12.0*z*z)) );
+ gsl_sf_result ex_result;
+ int stat_ex = gsl_sf_exp_e(ex_arg, &ex_result);
+ if(stat_ex == GSL_SUCCESS) {
+ double t = 1.0/root_term;
+ double sum;
+ double tpow[16];
+ tpow[0] = 1.0;
+ for(i=1; i<16; i++) tpow[i] = t * tpow[i-1];
+ sum = 1.0 + debye_u1(tpow)/nu + debye_u2(tpow)/(nu*nu) + debye_u3(tpow)/(nu*nu*nu)
+ + debye_u4(tpow)/(nu*nu*nu*nu) + debye_u5(tpow)/(nu*nu*nu*nu*nu);
+ result->val = pre * ex_result.val * sum;
+ result->err = pre * ex_result.val / (nu*nu*nu*nu*nu*nu);
+ result->err += pre * ex_result.err * fabs(sum);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ result->val = 0.0;
+ result->err = 0.0;
+ return stat_ex;
+ }
+}
+
+
+/* nu -> Inf; uniform in x > 0 [Abramowitz+Stegun, 9.7.8]
+ *
+ * error:
+ * identical to that above for Inu_scaled
+ */
+int
+gsl_sf_bessel_Knu_scaled_asymp_unif_e(const double nu, const double x, gsl_sf_result * result)
+{
+ int i;
+ double z = x/nu;
+ double root_term = hypot(1.0,z);
+ double pre = sqrt(M_PI/(2.0*nu*root_term));
+ double eta = root_term + log(z/(1.0+root_term));
+ double ex_arg = ( z < 1.0/GSL_ROOT3_DBL_EPSILON ? nu*(z - eta) : 0.5*nu/z*(1.0 + 1.0/(12.0*z*z)) );
+ gsl_sf_result ex_result;
+ int stat_ex = gsl_sf_exp_e(ex_arg, &ex_result);
+ if(stat_ex == GSL_SUCCESS) {
+ double t = 1.0/root_term;
+ double sum;
+ double tpow[16];
+ tpow[0] = 1.0;
+ for(i=1; i<16; i++) tpow[i] = t * tpow[i-1];
+ sum = 1.0 - debye_u1(tpow)/nu + debye_u2(tpow)/(nu*nu) - debye_u3(tpow)/(nu*nu*nu)
+ + debye_u4(tpow)/(nu*nu*nu*nu) - debye_u5(tpow)/(nu*nu*nu*nu*nu);
+ result->val = pre * ex_result.val * sum;
+ result->err = pre * ex_result.err * fabs(sum);
+ result->err += pre * ex_result.val / (nu*nu*nu*nu*nu*nu);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ result->val = 0.0;
+ result->err = 0.0;
+ return stat_ex;
+ }
+}
+
+
+/* Evaluate J_mu(x),J_{mu+1}(x) and Y_mu(x),Y_{mu+1}(x) for |mu| < 1/2
+ */
+int
+gsl_sf_bessel_JY_mu_restricted(const double mu, const double x,
+ gsl_sf_result * Jmu, gsl_sf_result * Jmup1,
+ gsl_sf_result * Ymu, gsl_sf_result * Ymup1)
+{
+ /* CHECK_POINTER(Jmu) */
+ /* CHECK_POINTER(Jmup1) */
+ /* CHECK_POINTER(Ymu) */
+ /* CHECK_POINTER(Ymup1) */
+
+ if(x < 0.0 || fabs(mu) > 0.5) {
+ Jmu->val = 0.0;
+ Jmu->err = 0.0;
+ Jmup1->val = 0.0;
+ Jmup1->err = 0.0;
+ Ymu->val = 0.0;
+ Ymu->err = 0.0;
+ Ymup1->val = 0.0;
+ Ymup1->err = 0.0;
+ GSL_ERROR ("error", GSL_EDOM);
+ }
+ else if(x == 0.0) {
+ if(mu == 0.0) {
+ Jmu->val = 1.0;
+ Jmu->err = 0.0;
+ }
+ else {
+ Jmu->val = 0.0;
+ Jmu->err = 0.0;
+ }
+ Jmup1->val = 0.0;
+ Jmup1->err = 0.0;
+ Ymu->val = 0.0;
+ Ymu->err = 0.0;
+ Ymup1->val = 0.0;
+ Ymup1->err = 0.0;
+ GSL_ERROR ("error", GSL_EDOM);
+ }
+ else {
+ int stat_Y;
+ int stat_J;
+
+ if(x < 2.0) {
+ /* Use Taylor series for J and the Temme series for Y.
+ * The Taylor series for J requires nu > 0, so we shift
+ * up one and use the recursion relation to get Jmu, in
+ * case mu < 0.
+ */
+ gsl_sf_result Jmup2;
+ int stat_J1 = gsl_sf_bessel_IJ_taylor_e(mu+1.0, x, -1, 100, GSL_DBL_EPSILON, Jmup1);
+ int stat_J2 = gsl_sf_bessel_IJ_taylor_e(mu+2.0, x, -1, 100, GSL_DBL_EPSILON, &Jmup2);
+ double c = 2.0*(mu+1.0)/x;
+ Jmu->val = c * Jmup1->val - Jmup2.val;
+ Jmu->err = c * Jmup1->err + Jmup2.err;
+ Jmu->err += 2.0 * GSL_DBL_EPSILON * fabs(Jmu->val);
+ stat_J = GSL_ERROR_SELECT_2(stat_J1, stat_J2);
+ stat_Y = gsl_sf_bessel_Y_temme(mu, x, Ymu, Ymup1);
+ return GSL_ERROR_SELECT_2(stat_J, stat_Y);
+ }
+ else if(x < 1000.0) {
+ double P, Q;
+ double J_ratio;
+ double J_sgn;
+ const int stat_CF1 = gsl_sf_bessel_J_CF1(mu, x, &J_ratio, &J_sgn);
+ const int stat_CF2 = gsl_sf_bessel_JY_steed_CF2(mu, x, &P, &Q);
+ double Jprime_J_ratio = mu/x - J_ratio;
+ double gamma = (P - Jprime_J_ratio)/Q;
+ Jmu->val = J_sgn * sqrt(2.0/(M_PI*x) / (Q + gamma*(P-Jprime_J_ratio)));
+ Jmu->err = 4.0 * GSL_DBL_EPSILON * fabs(Jmu->val);
+ Jmup1->val = J_ratio * Jmu->val;
+ Jmup1->err = fabs(J_ratio) * Jmu->err;
+ Ymu->val = gamma * Jmu->val;
+ Ymu->err = fabs(gamma) * Jmu->err;
+ Ymup1->val = Ymu->val * (mu/x - P - Q/gamma);
+ Ymup1->err = Ymu->err * fabs(mu/x - P - Q/gamma) + 4.0*GSL_DBL_EPSILON*fabs(Ymup1->val);
+ return GSL_ERROR_SELECT_2(stat_CF1, stat_CF2);
+ }
+ else {
+ /* Use asymptotics for large argument.
+ */
+ const int stat_J0 = gsl_sf_bessel_Jnu_asympx_e(mu, x, Jmu);
+ const int stat_J1 = gsl_sf_bessel_Jnu_asympx_e(mu+1.0, x, Jmup1);
+ const int stat_Y0 = gsl_sf_bessel_Ynu_asympx_e(mu, x, Ymu);
+ const int stat_Y1 = gsl_sf_bessel_Ynu_asympx_e(mu+1.0, x, Ymup1);
+ stat_J = GSL_ERROR_SELECT_2(stat_J0, stat_J1);
+ stat_Y = GSL_ERROR_SELECT_2(stat_Y0, stat_Y1);
+ return GSL_ERROR_SELECT_2(stat_J, stat_Y);
+ }
+ }
+}
+
+
+int
+gsl_sf_bessel_J_CF1(const double nu, const double x,
+ double * ratio, double * sgn)
+{
+ const double RECUR_BIG = GSL_SQRT_DBL_MAX;
+ const int maxiter = 10000;
+ int n = 1;
+ double Anm2 = 1.0;
+ double Bnm2 = 0.0;
+ double Anm1 = 0.0;
+ double Bnm1 = 1.0;
+ double a1 = x/(2.0*(nu+1.0));
+ double An = Anm1 + a1*Anm2;
+ double Bn = Bnm1 + a1*Bnm2;
+ double an;
+ double fn = An/Bn;
+ double dn = a1;
+ double s = 1.0;
+
+ while(n < maxiter) {
+ double old_fn;
+ double del;
+ n++;
+ Anm2 = Anm1;
+ Bnm2 = Bnm1;
+ Anm1 = An;
+ Bnm1 = Bn;
+ an = -x*x/(4.0*(nu+n-1.0)*(nu+n));
+ An = Anm1 + an*Anm2;
+ Bn = Bnm1 + an*Bnm2;
+
+ if(fabs(An) > RECUR_BIG || fabs(Bn) > RECUR_BIG) {
+ An /= RECUR_BIG;
+ Bn /= RECUR_BIG;
+ Anm1 /= RECUR_BIG;
+ Bnm1 /= RECUR_BIG;
+ Anm2 /= RECUR_BIG;
+ Bnm2 /= RECUR_BIG;
+ }
+
+ old_fn = fn;
+ fn = An/Bn;
+ del = old_fn/fn;
+
+ dn = 1.0 / (2.0*(nu+n)/x - dn);
+ if(dn < 0.0) s = -s;
+
+ if(fabs(del - 1.0) < 2.0*GSL_DBL_EPSILON) break;
+ }
+
+ *ratio = fn;
+ *sgn = s;
+
+ if(n >= maxiter)
+ GSL_ERROR ("error", GSL_EMAXITER);
+ else
+ return GSL_SUCCESS;
+}
+
+
+
+/* Evaluate the continued fraction CF1 for J_{nu+1}/J_nu
+ * using Gautschi (Euler) equivalent series.
+ * This exhibits an annoying problem because the
+ * a_k are not positive definite (in fact they are all negative).
+ * There are cases when rho_k blows up. Example: nu=1,x=4.
+ */
+#if 0
+int
+gsl_sf_bessel_J_CF1_ser(const double nu, const double x,
+ double * ratio, double * sgn)
+{
+ const int maxk = 20000;
+ double tk = 1.0;
+ double sum = 1.0;
+ double rhok = 0.0;
+ double dk = 0.0;
+ double s = 1.0;
+ int k;
+
+ for(k=1; k<maxk; k++) {
+ double ak = -0.25 * (x/(nu+k)) * x/(nu+k+1.0);
+ rhok = -ak*(1.0 + rhok)/(1.0 + ak*(1.0 + rhok));
+ tk *= rhok;
+ sum += tk;
+
+ dk = 1.0 / (2.0/x - (nu+k-1.0)/(nu+k) * dk);
+ if(dk < 0.0) s = -s;
+
+ if(fabs(tk/sum) < GSL_DBL_EPSILON) break;
+ }
+
+ *ratio = x/(2.0*(nu+1.0)) * sum;
+ *sgn = s;
+
+ if(k == maxk)
+ GSL_ERROR ("error", GSL_EMAXITER);
+ else
+ return GSL_SUCCESS;
+}
+#endif
+
+
+/* Evaluate the continued fraction CF1 for I_{nu+1}/I_nu
+ * using Gautschi (Euler) equivalent series.
+ */
+int
+gsl_sf_bessel_I_CF1_ser(const double nu, const double x, double * ratio)
+{
+ const int maxk = 20000;
+ double tk = 1.0;
+ double sum = 1.0;
+ double rhok = 0.0;
+ int k;
+
+ for(k=1; k<maxk; k++) {
+ double ak = 0.25 * (x/(nu+k)) * x/(nu+k+1.0);
+ rhok = -ak*(1.0 + rhok)/(1.0 + ak*(1.0 + rhok));
+ tk *= rhok;
+ sum += tk;
+ if(fabs(tk/sum) < GSL_DBL_EPSILON) break;
+ }
+
+ *ratio = x/(2.0*(nu+1.0)) * sum;
+
+ if(k == maxk)
+ GSL_ERROR ("error", GSL_EMAXITER);
+ else
+ return GSL_SUCCESS;
+}
+
+
+int
+gsl_sf_bessel_JY_steed_CF2(const double nu, const double x,
+ double * P, double * Q)
+{
+ const int max_iter = 10000;
+ const double SMALL = 1.0e-100;
+
+ int i = 1;
+
+ double x_inv = 1.0/x;
+ double a = 0.25 - nu*nu;
+ double p = -0.5*x_inv;
+ double q = 1.0;
+ double br = 2.0*x;
+ double bi = 2.0;
+ double fact = a*x_inv/(p*p + q*q);
+ double cr = br + q*fact;
+ double ci = bi + p*fact;
+ double den = br*br + bi*bi;
+ double dr = br/den;
+ double di = -bi/den;
+ double dlr = cr*dr - ci*di;
+ double dli = cr*di + ci*dr;
+ double temp = p*dlr - q*dli;
+ q = p*dli + q*dlr;
+ p = temp;
+ for (i=2; i<=max_iter; i++) {
+ a += 2*(i-1);
+ bi += 2.0;
+ dr = a*dr + br;
+ di = a*di + bi;
+ if(fabs(dr)+fabs(di) < SMALL) dr = SMALL;
+ fact = a/(cr*cr+ci*ci);
+ cr = br + cr*fact;
+ ci = bi - ci*fact;
+ if(fabs(cr)+fabs(ci) < SMALL) cr = SMALL;
+ den = dr*dr + di*di;
+ dr /= den;
+ di /= -den;
+ dlr = cr*dr - ci*di;
+ dli = cr*di + ci*dr;
+ temp = p*dlr - q*dli;
+ q = p*dli + q*dlr;
+ p = temp;
+ if(fabs(dlr-1.0)+fabs(dli) < GSL_DBL_EPSILON) break;
+ }
+
+ *P = p;
+ *Q = q;
+
+ if(i == max_iter)
+ GSL_ERROR ("error", GSL_EMAXITER);
+ else
+ return GSL_SUCCESS;
+}
+
+
+/* Evaluate continued fraction CF2, using Thompson-Barnett-Temme method,
+ * to obtain values of exp(x)*K_nu and exp(x)*K_{nu+1}.
+ *
+ * This is unstable for small x; x > 2 is a good cutoff.
+ * Also requires |nu| < 1/2.
+ */
+int
+gsl_sf_bessel_K_scaled_steed_temme_CF2(const double nu, const double x,
+ double * K_nu, double * K_nup1,
+ double * Kp_nu)
+{
+ const int maxiter = 10000;
+
+ int i = 1;
+ double bi = 2.0*(1.0 + x);
+ double di = 1.0/bi;
+ double delhi = di;
+ double hi = di;
+
+ double qi = 0.0;
+ double qip1 = 1.0;
+
+ double ai = -(0.25 - nu*nu);
+ double a1 = ai;
+ double ci = -ai;
+ double Qi = -ai;
+
+ double s = 1.0 + Qi*delhi;
+
+ for(i=2; i<=maxiter; i++) {
+ double dels;
+ double tmp;
+ ai -= 2.0*(i-1);
+ ci = -ai*ci/i;
+ tmp = (qi - bi*qip1)/ai;
+ qi = qip1;
+ qip1 = tmp;
+ Qi += ci*qip1;
+ bi += 2.0;
+ di = 1.0/(bi + ai*di);
+ delhi = (bi*di - 1.0) * delhi;
+ hi += delhi;
+ dels = Qi*delhi;
+ s += dels;
+ if(fabs(dels/s) < GSL_DBL_EPSILON) break;
+ }
+
+ hi *= -a1;
+
+ *K_nu = sqrt(M_PI/(2.0*x)) / s;
+ *K_nup1 = *K_nu * (nu + x + 0.5 - hi)/x;
+ *Kp_nu = - *K_nup1 + nu/x * *K_nu;
+ if(i == maxiter)
+ GSL_ERROR ("error", GSL_EMAXITER);
+ else
+ return GSL_SUCCESS;
+}
+
+
+int gsl_sf_bessel_cos_pi4_e(double y, double eps, gsl_sf_result * result)
+{
+ const double sy = sin(y);
+ const double cy = cos(y);
+ const double s = sy + cy;
+ const double d = sy - cy;
+ const double abs_sum = fabs(cy) + fabs(sy);
+ double seps;
+ double ceps;
+ if(fabs(eps) < GSL_ROOT5_DBL_EPSILON) {
+ const double e2 = eps*eps;
+ seps = eps * (1.0 - e2/6.0 * (1.0 - e2/20.0));
+ ceps = 1.0 - e2/2.0 * (1.0 - e2/12.0);
+ }
+ else {
+ seps = sin(eps);
+ ceps = cos(eps);
+ }
+ result->val = (ceps * s - seps * d)/ M_SQRT2;
+ result->err = 2.0 * GSL_DBL_EPSILON * (fabs(ceps) + fabs(seps)) * abs_sum / M_SQRT2;
+
+ /* Try to account for error in evaluation of sin(y), cos(y).
+ * This is a little sticky because we don't really know
+ * how the library routines are doing their argument reduction.
+ * However, we will make a reasonable guess.
+ * FIXME ?
+ */
+ if(y > 1.0/GSL_DBL_EPSILON) {
+ result->err *= 0.5 * y;
+ }
+ else if(y > 1.0/GSL_SQRT_DBL_EPSILON) {
+ result->err *= 256.0 * y * GSL_SQRT_DBL_EPSILON;
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+int gsl_sf_bessel_sin_pi4_e(double y, double eps, gsl_sf_result * result)
+{
+ const double sy = sin(y);
+ const double cy = cos(y);
+ const double s = sy + cy;
+ const double d = sy - cy;
+ const double abs_sum = fabs(cy) + fabs(sy);
+ double seps;
+ double ceps;
+ if(fabs(eps) < GSL_ROOT5_DBL_EPSILON) {
+ const double e2 = eps*eps;
+ seps = eps * (1.0 - e2/6.0 * (1.0 - e2/20.0));
+ ceps = 1.0 - e2/2.0 * (1.0 - e2/12.0);
+ }
+ else {
+ seps = sin(eps);
+ ceps = cos(eps);
+ }
+ result->val = (ceps * d + seps * s)/ M_SQRT2;
+ result->err = 2.0 * GSL_DBL_EPSILON * (fabs(ceps) + fabs(seps)) * abs_sum / M_SQRT2;
+
+ /* Try to account for error in evaluation of sin(y), cos(y).
+ * See above.
+ * FIXME ?
+ */
+ if(y > 1.0/GSL_DBL_EPSILON) {
+ result->err *= 0.5 * y;
+ }
+ else if(y > 1.0/GSL_SQRT_DBL_EPSILON) {
+ result->err *= 256.0 * y * GSL_SQRT_DBL_EPSILON;
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+/************************************************************************
+ * *
+ Asymptotic approximations 8.11.5, 8.12.5, and 8.42.7 from
+ G.N.Watson, A Treatise on the Theory of Bessel Functions,
+ 2nd Edition (Cambridge University Press, 1944).
+ Higher terms in expansion for x near l given by
+ Airey in Phil. Mag. 31, 520 (1916).
+
+ This approximation is accurate to near 0.1% at the boundaries
+ between the asymptotic regions; well away from the boundaries
+ the accuracy is better than 10^{-5}.
+ * *
+ ************************************************************************/
+#if 0
+double besselJ_meissel(double nu, double x)
+{
+ double beta = pow(nu, 0.325);
+ double result;
+
+ /* Fitted matching points. */
+ double llimit = 1.1 * beta;
+ double ulimit = 1.3 * beta;
+
+ double nu2 = nu * nu;
+
+ if (nu < 5. && x < 1.)
+ {
+ /* Small argument and order. Use a Taylor expansion. */
+ int k;
+ double xo2 = 0.5 * x;
+ double gamfactor = pow(nu,nu) * exp(-nu) * sqrt(nu * 2. * M_PI)
+ * (1. + 1./(12.*nu) + 1./(288.*nu*nu));
+ double prefactor = pow(xo2, nu) / gamfactor;
+ double C[5];
+
+ C[0] = 1.;
+ C[1] = -C[0] / (nu+1.);
+ C[2] = -C[1] / (2.*(nu+2.));
+ C[3] = -C[2] / (3.*(nu+3.));
+ C[4] = -C[3] / (4.*(nu+4.));
+
+ result = 0.;
+ for(k=0; k<5; k++)
+ result += C[k] * pow(xo2, 2.*k);
+
+ result *= prefactor;
+ }
+ else if(x < nu - llimit)
+ {
+ /* Small x region: x << l. */
+ double z = x / nu;
+ double z2 = z*z;
+ double rtomz2 = sqrt(1.-z2);
+ double omz2_2 = (1.-z2)*(1.-z2);
+
+ /* Calculate Meissel exponent. */
+ double term1 = 1./(24.*nu) * ((2.+3.*z2)/((1.-z2)*rtomz2) -2.);
+ double term2 = - z2*(4. + z2)/(16.*nu2*(1.-z2)*omz2_2);
+ double V_nu = term1 + term2;
+
+ /* Calculate the harmless prefactor. */
+ double sterlingsum = 1. + 1./(12.*nu) + 1./(288*nu2);
+ double harmless = 1. / (sqrt(rtomz2*2.*M_PI*nu) * sterlingsum);
+
+ /* Calculate the logarithm of the nu dependent prefactor. */
+ double ln_nupre = rtomz2 + log(z) - log(1. + rtomz2);
+
+ result = harmless * exp(nu*ln_nupre - V_nu);
+ }
+ else if(x < nu + ulimit)
+ {
+ /* Intermediate region 1: x near nu. */
+ double eps = 1.-nu/x;
+ double eps_x = eps * x;
+ double eps_x_2 = eps_x * eps_x;
+ double xo6 = x/6.;
+ double B[6];
+ static double gam[6] = {2.67894, 1.35412, 1., 0.89298, 0.902745, 1.};
+ static double sf[6] = {0.866025, 0.866025, 0., -0.866025, -0.866025, 0.};
+
+ /* Some terms are identically zero, because sf[] can be zero.
+ * Some terms do not appear in the result.
+ */
+ B[0] = 1.;
+ B[1] = eps_x;
+ /* B[2] = 0.5 * eps_x_2 - 1./20.; */
+ B[3] = eps_x * (eps_x_2/6. - 1./15.);
+ B[4] = eps_x_2 * (eps_x_2 - 1.)/24. + 1./280.;
+ /* B[5] = eps_x * (eps_x_2*(0.5*eps_x_2 - 1.)/60. + 43./8400.); */
+
+ result = B[0] * gam[0] * sf[0] / pow(xo6, 1./3.);
+ result += B[1] * gam[1] * sf[1] / pow(xo6, 2./3.);
+ result += B[3] * gam[3] * sf[3] / pow(xo6, 4./3.);
+ result += B[4] * gam[4] * sf[4] / pow(xo6, 5./3.);
+
+ result /= (3.*M_PI);
+ }
+ else
+ {
+ /* Region of very large argument. Use expansion
+ * for x>>l, and we need not be very exacting.
+ */
+ double secb = x/nu;
+ double sec2b= secb*secb;
+
+ double cotb = 1./sqrt(sec2b-1.); /* cotb=cot(beta) */
+
+ double beta = acos(nu/x);
+ double trigarg = nu/cotb - nu*beta - 0.25 * M_PI;
+
+ double cot3b = cotb * cotb * cotb;
+ double cot6b = cot3b * cot3b;
+
+ double sum1, sum2, expterm, prefactor, trigcos;
+
+ sum1 = 2.0 + 3.0 * sec2b;
+ trigarg -= sum1 * cot3b / (24.0 * nu);
+
+ trigcos = cos(trigarg);
+
+ sum2 = 4.0 + sec2b;
+ expterm = sum2 * sec2b * cot6b / (16.0 * nu2);
+
+ expterm = exp(-expterm);
+ prefactor = sqrt(2. * cotb / (nu * M_PI));
+
+ result = prefactor * expterm * trigcos;
+ }
+
+ return result;
+}
+#endif
diff --git a/gsl-1.9/specfunc/bessel.h b/gsl-1.9/specfunc/bessel.h
new file mode 100644
index 0000000..94f6d31
--- /dev/null
+++ b/gsl-1.9/specfunc/bessel.h
@@ -0,0 +1,92 @@
+/* specfunc/bessel.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#ifndef _BESSEL_H_
+#define _BESSEL_H_
+
+#include <gsl/gsl_sf_result.h>
+
+
+/* Taylor expansion for J_nu(x) or I_nu(x)
+ * sign = -1 ==> Jnu
+ * sign = +1 ==> Inu
+ */
+int gsl_sf_bessel_IJ_taylor_e(const double nu, const double x,
+ const int sign,
+ const int kmax,
+ const double threshold,
+ gsl_sf_result * result
+ );
+
+int gsl_sf_bessel_Jnu_asympx_e(const double nu, const double x, gsl_sf_result * result);
+int gsl_sf_bessel_Ynu_asympx_e(const double nu, const double x, gsl_sf_result * result);
+
+int gsl_sf_bessel_Inu_scaled_asympx_e(const double nu, const double x, gsl_sf_result * result);
+int gsl_sf_bessel_Knu_scaled_asympx_e(const double nu, const double x, gsl_sf_result * result);
+
+int gsl_sf_bessel_Inu_scaled_asymp_unif_e(const double nu, const double x, gsl_sf_result * result);
+int gsl_sf_bessel_Knu_scaled_asymp_unif_e(const double nu, const double x, gsl_sf_result * result);
+
+
+/* ratio = J_{nu+1}(x) / J_nu(x)
+ * sgn = sgn(J_nu(x))
+ */
+int
+gsl_sf_bessel_J_CF1(const double nu, const double x, double * ratio, double * sgn);
+
+
+/* ratio = I_{nu+1}(x) / I_nu(x)
+ */
+int
+gsl_sf_bessel_I_CF1_ser(const double nu, const double x, double * ratio);
+
+
+/* Evaluate the Steed method continued fraction CF2 for
+ *
+ * (J' + i Y')/(J + i Y) := P + i Q
+ */
+int
+gsl_sf_bessel_JY_steed_CF2(const double nu, const double x,
+ double * P, double * Q);
+
+
+int
+gsl_sf_bessel_JY_mu_restricted(const double mu, const double x,
+ gsl_sf_result * Jmu, gsl_sf_result * Jmup1,
+ gsl_sf_result * Ymu, gsl_sf_result * Ymup1);
+
+
+int
+gsl_sf_bessel_K_scaled_steed_temme_CF2(const double nu, const double x,
+ double * K_nu, double * K_nup1,
+ double * Kp_nu);
+
+
+/* These are of use in calculating the oscillating
+ * Bessel functions.
+ * cos(y - pi/4 + eps)
+ * sin(y - pi/4 + eps)
+ */
+int gsl_sf_bessel_cos_pi4_e(double y, double eps, gsl_sf_result * result);
+int gsl_sf_bessel_sin_pi4_e(double y, double eps, gsl_sf_result * result);
+
+
+#endif /* !_BESSEL_H_ */
diff --git a/gsl-1.9/specfunc/bessel_I0.c b/gsl-1.9/specfunc/bessel_I0.c
new file mode 100644
index 0000000..564b093
--- /dev/null
+++ b/gsl-1.9/specfunc/bessel_I0.c
@@ -0,0 +1,232 @@
+/* specfunc/bessel_I0.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_bessel.h>
+
+#include "error.h"
+
+#include "chebyshev.h"
+#include "cheb_eval.c"
+
+/*-*-*-*-*-*-*-*-*-*-*-* Private Section *-*-*-*-*-*-*-*-*-*-*-*/
+
+
+/* based on SLATEC besi0 */
+
+/* chebyshev expansions
+
+ series for bi0 on the interval 0. to 9.00000d+00
+ with weighted error 2.46e-18
+ log weighted error 17.61
+ significant figures required 17.90
+ decimal places required 18.15
+
+ series for ai0 on the interval 1.25000d-01 to 3.33333d-01
+ with weighted error 7.87e-17
+ log weighted error 16.10
+ significant figures required 14.69
+ decimal places required 16.76
+
+
+ series for ai02 on the interval 0. to 1.25000d-01
+ with weighted error 3.79e-17
+ log weighted error 16.42
+ significant figures required 14.86
+ decimal places required 17.09
+*/
+
+static double bi0_data[12] = {
+ -.07660547252839144951,
+ 1.92733795399380827000,
+ .22826445869203013390,
+ .01304891466707290428,
+ .00043442709008164874,
+ .00000942265768600193,
+ .00000014340062895106,
+ .00000000161384906966,
+ .00000000001396650044,
+ .00000000000009579451,
+ .00000000000000053339,
+ .00000000000000000245
+};
+static cheb_series bi0_cs = {
+ bi0_data,
+ 11,
+ -1, 1,
+ 11
+};
+
+static double ai0_data[21] = {
+ .07575994494023796,
+ .00759138081082334,
+ .00041531313389237,
+ .00001070076463439,
+ -.00000790117997921,
+ -.00000078261435014,
+ .00000027838499429,
+ .00000000825247260,
+ -.00000001204463945,
+ .00000000155964859,
+ .00000000022925563,
+ -.00000000011916228,
+ .00000000001757854,
+ .00000000000112822,
+ -.00000000000114684,
+ .00000000000027155,
+ -.00000000000002415,
+ -.00000000000000608,
+ .00000000000000314,
+ -.00000000000000071,
+ .00000000000000007
+};
+static cheb_series ai0_cs = {
+ ai0_data,
+ 20,
+ -1, 1,
+ 13
+};
+
+static double ai02_data[22] = {
+ .05449041101410882,
+ .00336911647825569,
+ .00006889758346918,
+ .00000289137052082,
+ .00000020489185893,
+ .00000002266668991,
+ .00000000339623203,
+ .00000000049406022,
+ .00000000001188914,
+ -.00000000003149915,
+ -.00000000001321580,
+ -.00000000000179419,
+ .00000000000071801,
+ .00000000000038529,
+ .00000000000001539,
+ -.00000000000004151,
+ -.00000000000000954,
+ .00000000000000382,
+ .00000000000000176,
+ -.00000000000000034,
+ -.00000000000000027,
+ .00000000000000003
+};
+static cheb_series ai02_cs = {
+ ai02_data,
+ 21,
+ -1, 1,
+ 11
+};
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int gsl_sf_bessel_I0_scaled_e(const double x, gsl_sf_result * result)
+{
+ double y = fabs(x);
+
+ /* CHECK_POINTER(result) */
+
+ if(y < 2.0 * GSL_SQRT_DBL_EPSILON) {
+ result->val = 1.0 - y;
+ result->err = 0.5*y*y;
+ return GSL_SUCCESS;
+ }
+ else if(y <= 3.0) {
+ const double ey = exp(-y);
+ gsl_sf_result c;
+ cheb_eval_e(&bi0_cs, y*y/4.5-1.0, &c);
+ result->val = ey * (2.75 + c.val);
+ result->err = GSL_DBL_EPSILON * fabs(result->val) + ey * c.err;
+ return GSL_SUCCESS;
+ }
+ else if(y <= 8.0) {
+ const double sy = sqrt(y);
+ gsl_sf_result c;
+ cheb_eval_e(&ai0_cs, (48.0/y-11.0)/5.0, &c);
+ result->val = (0.375 + c.val) / sy;
+ result->err = 2.0 * GSL_DBL_EPSILON * (0.375 + fabs(c.val)) / sy;
+ result->err += c.err / sy;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ const double sy = sqrt(y);
+ gsl_sf_result c;
+ cheb_eval_e(&ai02_cs, 16.0/y-1.0, &c);
+ result->val = (0.375 + c.val) / sy;
+ result->err = 2.0 * GSL_DBL_EPSILON * (0.375 + fabs(c.val)) / sy;
+ result->err += c.err / sy;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+}
+
+
+int gsl_sf_bessel_I0_e(const double x, gsl_sf_result * result)
+{
+ double y = fabs(x);
+
+ /* CHECK_POINTER(result) */
+
+ if(y < 2.0 * GSL_SQRT_DBL_EPSILON) {
+ result->val = 1.0;
+ result->err = 0.5*y*y;
+ return GSL_SUCCESS;
+ }
+ else if(y <= 3.0) {
+ gsl_sf_result c;
+ cheb_eval_e(&bi0_cs, y*y/4.5-1.0, &c);
+ result->val = 2.75 + c.val;
+ result->err = GSL_DBL_EPSILON * (2.75 + fabs(c.val));
+ result->err += c.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(y < GSL_LOG_DBL_MAX - 1.0) {
+ const double ey = exp(y);
+ gsl_sf_result b_scaled;
+ gsl_sf_bessel_I0_scaled_e(x, &b_scaled);
+ result->val = ey * b_scaled.val;
+ result->err = ey * b_scaled.err + y*GSL_DBL_EPSILON*fabs(result->val);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ OVERFLOW_ERROR(result);
+ }
+}
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_bessel_I0_scaled(const double x)
+{
+ EVAL_RESULT(gsl_sf_bessel_I0_scaled_e(x, &result); )
+}
+
+double gsl_sf_bessel_I0(const double x)
+{
+ EVAL_RESULT(gsl_sf_bessel_I0_e(x, &result); )
+}
diff --git a/gsl-1.9/specfunc/bessel_I1.c b/gsl-1.9/specfunc/bessel_I1.c
new file mode 100644
index 0000000..18b2c0e
--- /dev/null
+++ b/gsl-1.9/specfunc/bessel_I1.c
@@ -0,0 +1,258 @@
+/* specfunc/bessel_I1.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_bessel.h>
+
+#include "error.h"
+
+#include "chebyshev.h"
+#include "cheb_eval.c"
+
+#define ROOT_EIGHT (2.0*M_SQRT2)
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Private Section *-*-*-*-*-*-*-*-*-*-*-*/
+
+/* based on SLATEC besi1(), besi1e() */
+
+/* chebyshev expansions
+
+ series for bi1 on the interval 0. to 9.00000d+00
+ with weighted error 2.40e-17
+ log weighted error 16.62
+ significant figures required 16.23
+ decimal places required 17.14
+
+ series for ai1 on the interval 1.25000d-01 to 3.33333d-01
+ with weighted error 6.98e-17
+ log weighted error 16.16
+ significant figures required 14.53
+ decimal places required 16.82
+
+ series for ai12 on the interval 0. to 1.25000d-01
+ with weighted error 3.55e-17
+ log weighted error 16.45
+ significant figures required 14.69
+ decimal places required 17.12
+*/
+
+static double bi1_data[11] = {
+ -0.001971713261099859,
+ 0.407348876675464810,
+ 0.034838994299959456,
+ 0.001545394556300123,
+ 0.000041888521098377,
+ 0.000000764902676483,
+ 0.000000010042493924,
+ 0.000000000099322077,
+ 0.000000000000766380,
+ 0.000000000000004741,
+ 0.000000000000000024
+};
+static cheb_series bi1_cs = {
+ bi1_data,
+ 10,
+ -1, 1,
+ 10
+};
+
+static double ai1_data[21] = {
+ -0.02846744181881479,
+ -0.01922953231443221,
+ -0.00061151858579437,
+ -0.00002069971253350,
+ 0.00000858561914581,
+ 0.00000104949824671,
+ -0.00000029183389184,
+ -0.00000001559378146,
+ 0.00000001318012367,
+ -0.00000000144842341,
+ -0.00000000029085122,
+ 0.00000000012663889,
+ -0.00000000001664947,
+ -0.00000000000166665,
+ 0.00000000000124260,
+ -0.00000000000027315,
+ 0.00000000000002023,
+ 0.00000000000000730,
+ -0.00000000000000333,
+ 0.00000000000000071,
+ -0.00000000000000006
+};
+static cheb_series ai1_cs = {
+ ai1_data,
+ 20,
+ -1, 1,
+ 11
+};
+
+static double ai12_data[22] = {
+ 0.02857623501828014,
+ -0.00976109749136147,
+ -0.00011058893876263,
+ -0.00000388256480887,
+ -0.00000025122362377,
+ -0.00000002631468847,
+ -0.00000000383538039,
+ -0.00000000055897433,
+ -0.00000000001897495,
+ 0.00000000003252602,
+ 0.00000000001412580,
+ 0.00000000000203564,
+ -0.00000000000071985,
+ -0.00000000000040836,
+ -0.00000000000002101,
+ 0.00000000000004273,
+ 0.00000000000001041,
+ -0.00000000000000382,
+ -0.00000000000000186,
+ 0.00000000000000033,
+ 0.00000000000000028,
+ -0.00000000000000003
+};
+static cheb_series ai12_cs = {
+ ai12_data,
+ 21,
+ -1, 1,
+ 9
+};
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int gsl_sf_bessel_I1_scaled_e(const double x, gsl_sf_result * result)
+{
+ const double xmin = 2.0 * GSL_DBL_MIN;
+ const double x_small = ROOT_EIGHT * GSL_SQRT_DBL_EPSILON;
+ const double y = fabs(x);
+
+ /* CHECK_POINTER(result) */
+
+ if(y == 0.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(y < xmin) {
+ UNDERFLOW_ERROR(result);
+ }
+ else if(y < x_small) {
+ result->val = 0.5*x;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(y <= 3.0) {
+ const double ey = exp(-y);
+ gsl_sf_result c;
+ cheb_eval_e(&bi1_cs, y*y/4.5-1.0, &c);
+ result->val = x * ey * (0.875 + c.val);
+ result->err = ey * c.err + y * GSL_DBL_EPSILON * fabs(result->val);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(y <= 8.0) {
+ const double sy = sqrt(y);
+ gsl_sf_result c;
+ double b;
+ double s;
+ cheb_eval_e(&ai1_cs, (48.0/y-11.0)/5.0, &c);
+ b = (0.375 + c.val) / sy;
+ s = (x > 0.0 ? 1.0 : -1.0);
+ result->val = s * b;
+ result->err = c.err / sy;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ const double sy = sqrt(y);
+ gsl_sf_result c;
+ double b;
+ double s;
+ cheb_eval_e(&ai12_cs, 16.0/y-1.0, &c);
+ b = (0.375 + c.val) / sy;
+ s = (x > 0.0 ? 1.0 : -1.0);
+ result->val = s * b;
+ result->err = c.err / sy;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+}
+
+
+int gsl_sf_bessel_I1_e(const double x, gsl_sf_result * result)
+{
+ const double xmin = 2.0 * GSL_DBL_MIN;
+ const double x_small = ROOT_EIGHT * GSL_SQRT_DBL_EPSILON;
+ const double y = fabs(x);
+
+ /* CHECK_POINTER(result) */
+
+ if(y == 0.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(y < xmin) {
+ UNDERFLOW_ERROR(result);
+ }
+ else if(y < x_small) {
+ result->val = 0.5*x;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(y <= 3.0) {
+ gsl_sf_result c;
+ cheb_eval_e(&bi1_cs, y*y/4.5-1.0, &c);
+ result->val = x * (0.875 + c.val);
+ result->err = y * c.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(y < GSL_LOG_DBL_MAX) {
+ const double ey = exp(y);
+ gsl_sf_result I1_scaled;
+ gsl_sf_bessel_I1_scaled_e(x, &I1_scaled);
+ result->val = ey * I1_scaled.val;
+ result->err = ey * I1_scaled.err + y * GSL_DBL_EPSILON * fabs(result->val);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ OVERFLOW_ERROR(result);
+ }
+}
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_bessel_I1_scaled(const double x)
+{
+ EVAL_RESULT(gsl_sf_bessel_I1_scaled_e(x, &result));
+}
+
+double gsl_sf_bessel_I1(const double x)
+{
+ EVAL_RESULT(gsl_sf_bessel_I1_e(x, &result));
+}
diff --git a/gsl-1.9/specfunc/bessel_In.c b/gsl-1.9/specfunc/bessel_In.c
new file mode 100644
index 0000000..ea4e18b
--- /dev/null
+++ b/gsl-1.9/specfunc/bessel_In.c
@@ -0,0 +1,225 @@
+/* specfunc/bessel_In.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_bessel.h>
+
+#include "error.h"
+
+#include "bessel.h"
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+
+int
+gsl_sf_bessel_In_scaled_e(int n, const double x, gsl_sf_result * result)
+{
+ const double ax = fabs(x);
+
+ n = abs(n); /* I(-n, z) = I(n, z) */
+
+ /* CHECK_POINTER(result) */
+
+ if(n == 0) {
+ return gsl_sf_bessel_I0_scaled_e(x, result);
+ }
+ else if(n == 1) {
+ return gsl_sf_bessel_I1_scaled_e(x, result);
+ }
+ else if(x == 0.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(x*x < 10.0*(n+1.0)/M_E) {
+ gsl_sf_result t;
+ double ex = exp(-ax);
+ int stat_In = gsl_sf_bessel_IJ_taylor_e((double)n, ax, 1, 50, GSL_DBL_EPSILON, &t);
+ result->val = t.val * ex;
+ result->err = t.err * ex;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ if(x < 0.0 && GSL_IS_ODD(n)) result->val = -result->val;
+ return stat_In;
+ }
+ else if(n < 150 && ax < 1e7) {
+ gsl_sf_result I0_scaled;
+ int stat_I0 = gsl_sf_bessel_I0_scaled_e(ax, &I0_scaled);
+ double rat;
+ int stat_CF1 = gsl_sf_bessel_I_CF1_ser((double)n, ax, &rat);
+ double Ikp1 = rat * GSL_SQRT_DBL_MIN;
+ double Ik = GSL_SQRT_DBL_MIN;
+ double Ikm1;
+ int k;
+ for(k=n; k >= 1; k--) {
+ Ikm1 = Ikp1 + 2.0*k/ax * Ik;
+ Ikp1 = Ik;
+ Ik = Ikm1;
+ }
+ result->val = I0_scaled.val * (GSL_SQRT_DBL_MIN / Ik);
+ result->err = I0_scaled.err * (GSL_SQRT_DBL_MIN / Ik);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ if(x < 0.0 && GSL_IS_ODD(n)) result->val = -result->val;
+ return GSL_ERROR_SELECT_2(stat_I0, stat_CF1);
+ }
+ else if( GSL_MIN( 0.29/(n*n), 0.5/(n*n + x*x) ) < 0.5*GSL_ROOT3_DBL_EPSILON) {
+ int stat_as = gsl_sf_bessel_Inu_scaled_asymp_unif_e((double)n, ax, result);
+ if(x < 0.0 && GSL_IS_ODD(n)) result->val = -result->val;
+ return stat_as;
+ }
+ else {
+ const int nhi = 2 + (int) (1.2 / GSL_ROOT6_DBL_EPSILON);
+ gsl_sf_result r_Ikp1;
+ gsl_sf_result r_Ik;
+ int stat_a1 = gsl_sf_bessel_Inu_scaled_asymp_unif_e(nhi+1.0, ax, &r_Ikp1);
+ int stat_a2 = gsl_sf_bessel_Inu_scaled_asymp_unif_e((double)nhi, ax, &r_Ik);
+ double Ikp1 = r_Ikp1.val;
+ double Ik = r_Ik.val;
+ double Ikm1;
+ int k;
+ for(k=nhi; k > n; k--) {
+ Ikm1 = Ikp1 + 2.0*k/ax * Ik;
+ Ikp1 = Ik;
+ Ik = Ikm1;
+ }
+ result->val = Ik;
+ result->err = Ik * (r_Ikp1.err/r_Ikp1.val + r_Ik.err/r_Ik.val);
+ if(x < 0.0 && GSL_IS_ODD(n)) result->val = -result->val;
+ return GSL_ERROR_SELECT_2(stat_a1, stat_a2);
+ }
+}
+
+
+int
+gsl_sf_bessel_In_scaled_array(const int nmin, const int nmax, const double x, double * result_array)
+{
+ /* CHECK_POINTER(result_array) */
+
+ if(nmax < nmin || nmin < 0) {
+ int j;
+ for(j=0; j<=nmax-nmin; j++) result_array[j] = 0.0;
+ GSL_ERROR ("domain error", GSL_EDOM);
+ }
+ else if(x == 0.0) {
+ int j;
+ for(j=0; j<=nmax-nmin; j++) result_array[j] = 0.0;
+ if(nmin == 0) result_array[0] = 1.0;
+ return GSL_SUCCESS;
+ }
+ else if(nmax == 0) {
+ gsl_sf_result I0_scaled;
+ int stat = gsl_sf_bessel_I0_scaled_e(x, &I0_scaled);
+ result_array[0] = I0_scaled.val;
+ return stat;
+ }
+ else {
+ const double ax = fabs(x);
+ const double two_over_x = 2.0/ax;
+
+ /* starting values */
+ gsl_sf_result r_Inp1;
+ gsl_sf_result r_In;
+ int stat_0 = gsl_sf_bessel_In_scaled_e(nmax+1, ax, &r_Inp1);
+ int stat_1 = gsl_sf_bessel_In_scaled_e(nmax, ax, &r_In);
+ double Inp1 = r_Inp1.val;
+ double In = r_In.val;
+ double Inm1;
+ int n;
+
+ for(n=nmax; n>=nmin; n--) {
+ result_array[n-nmin] = In;
+ Inm1 = Inp1 + n * two_over_x * In;
+ Inp1 = In;
+ In = Inm1;
+ }
+
+ /* deal with signs */
+ if(x < 0.0) {
+ for(n=nmin; n<=nmax; n++) {
+ if(GSL_IS_ODD(n)) result_array[n-nmin] = -result_array[n-nmin];
+ }
+ }
+
+ return GSL_ERROR_SELECT_2(stat_0, stat_1);
+ }
+}
+
+
+int
+gsl_sf_bessel_In_e(const int n_in, const double x, gsl_sf_result * result)
+{
+ const double ax = fabs(x);
+ const int n = abs(n_in); /* I(-n, z) = I(n, z) */
+ gsl_sf_result In_scaled;
+ const int stat_In_scaled = gsl_sf_bessel_In_scaled_e(n, ax, &In_scaled);
+
+ /* In_scaled is always less than 1,
+ * so this overflow check is conservative.
+ */
+ if(ax > GSL_LOG_DBL_MAX - 1.0) {
+ OVERFLOW_ERROR(result);
+ }
+ else {
+ const double ex = exp(ax);
+ result->val = ex * In_scaled.val;
+ result->err = ex * In_scaled.err;
+ result->err += ax * GSL_DBL_EPSILON * fabs(result->val);
+ if(x < 0.0 && GSL_IS_ODD(n)) result->val = -result->val;
+ return stat_In_scaled;
+ }
+}
+
+
+int
+gsl_sf_bessel_In_array(const int nmin, const int nmax, const double x, double * result_array)
+{
+ double ax = fabs(x);
+
+ /* CHECK_POINTER(result_array) */
+
+ if(ax > GSL_LOG_DBL_MAX - 1.0) {
+ int j;
+ for(j=0; j<=nmax-nmin; j++) result_array[j] = 0.0; /* FIXME: should be Inf */
+ GSL_ERROR ("overflow", GSL_EOVRFLW);
+ }
+ else {
+ int j;
+ double eax = exp(ax);
+ int status = gsl_sf_bessel_In_scaled_array(nmin, nmax, x, result_array);
+ for(j=0; j<=nmax-nmin; j++) result_array[j] *= eax;
+ return status;
+ }
+}
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_bessel_In_scaled(const int n, const double x)
+{
+ EVAL_RESULT(gsl_sf_bessel_In_scaled_e(n, x, &result));
+}
+
+double gsl_sf_bessel_In(const int n, const double x)
+{
+ EVAL_RESULT(gsl_sf_bessel_In_e(n, x, &result));
+}
diff --git a/gsl-1.9/specfunc/bessel_Inu.c b/gsl-1.9/specfunc/bessel_Inu.c
new file mode 100644
index 0000000..aa6d06a
--- /dev/null
+++ b/gsl-1.9/specfunc/bessel_Inu.c
@@ -0,0 +1,122 @@
+/* specfunc/bessel_Inu.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_exp.h>
+#include <gsl/gsl_sf_gamma.h>
+#include <gsl/gsl_sf_bessel.h>
+
+#include "error.h"
+
+#include "bessel.h"
+#include "bessel_temme.h"
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int
+gsl_sf_bessel_Inu_scaled_e(double nu, double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x < 0.0 || nu < 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x*x < 10.0*(nu+1.0)) {
+ gsl_sf_result b;
+ double ex = exp(-x);
+ int stat = gsl_sf_bessel_IJ_taylor_e(nu, x, 1, 100, GSL_DBL_EPSILON, &b);
+ result->val = b.val * ex;
+ result->err = b.err * ex;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return stat;
+ }
+ else if(0.5/(nu*nu + x*x) < GSL_ROOT3_DBL_EPSILON) {
+ return gsl_sf_bessel_Inu_scaled_asymp_unif_e(nu, x, result);
+ }
+ else {
+ int N = (int)(nu + 0.5);
+ double mu = nu - N; /* -1/2 <= mu <= 1/2 */
+ double K_mu, K_mup1, Kp_mu;
+ double K_nu, K_nup1, K_num1;
+ double I_nu_ratio;
+ int stat_Irat;
+ int stat_Kmu;
+ int n;
+
+ /* obtain K_mu, K_mup1 */
+ if(x < 2.0) {
+ stat_Kmu = gsl_sf_bessel_K_scaled_temme(mu, x, &K_mu, &K_mup1, &Kp_mu);
+ }
+ else {
+ stat_Kmu = gsl_sf_bessel_K_scaled_steed_temme_CF2(mu, x, &K_mu, &K_mup1, &Kp_mu);
+ }
+
+ /* recurse forward to obtain K_num1, K_nu */
+ K_nu = K_mu;
+ K_nup1 = K_mup1;
+
+ for(n=0; n<N; n++) {
+ K_num1 = K_nu;
+ K_nu = K_nup1;
+ K_nup1 = 2.0*(mu+n+1)/x * K_nu + K_num1;
+ }
+
+ /* calculate I_{nu+1}/I_nu */
+ stat_Irat = gsl_sf_bessel_I_CF1_ser(nu, x, &I_nu_ratio);
+
+ /* solve for I_nu */
+ result->val = 1.0/(x * (K_nup1 + I_nu_ratio * K_nu));
+ result->err = GSL_DBL_EPSILON * (0.5*N + 2.0) * fabs(result->val);
+
+ return GSL_ERROR_SELECT_2(stat_Kmu, stat_Irat);
+ }
+}
+
+
+int
+gsl_sf_bessel_Inu_e(double nu, double x, gsl_sf_result * result)
+{
+ gsl_sf_result b;
+ int stat_I = gsl_sf_bessel_Inu_scaled_e(nu, x, &b);
+ int stat_e = gsl_sf_exp_mult_err_e(x, fabs(x*GSL_DBL_EPSILON),
+ b.val, b.err,
+ result);
+ return GSL_ERROR_SELECT_2(stat_e, stat_I);
+}
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_bessel_Inu_scaled(double nu, double x)
+{
+ EVAL_RESULT(gsl_sf_bessel_Inu_scaled_e(nu, x, &result));
+}
+
+
+double gsl_sf_bessel_Inu(double nu, double x)
+{
+ EVAL_RESULT(gsl_sf_bessel_Inu_e(nu, x, &result));
+}
diff --git a/gsl-1.9/specfunc/bessel_J0.c b/gsl-1.9/specfunc/bessel_J0.c
new file mode 100644
index 0000000..24969f6
--- /dev/null
+++ b/gsl-1.9/specfunc/bessel_J0.c
@@ -0,0 +1,111 @@
+/* specfunc/bessel_J0.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_mode.h>
+#include "bessel.h"
+#include "bessel_amp_phase.h"
+#include <gsl/gsl_sf_trig.h>
+#include <gsl/gsl_sf_bessel.h>
+
+#include "cheb_eval.c"
+
+/*-*-*-*-*-*-*-*-*-*-*-* Private Section *-*-*-*-*-*-*-*-*-*-*-*/
+
+
+/* based on SLATEC besj0, 1977 version, w. fullerton */
+
+/* chebyshev expansions for Bessel functions
+
+ series for bj0 on the interval 0. to 1.60000d+01
+ with weighted error 7.47e-18
+ log weighted error 17.13
+ significant figures required 16.98
+ decimal places required 17.68
+
+*/
+
+static double bj0_data[13] = {
+ 0.100254161968939137,
+ -0.665223007764405132,
+ 0.248983703498281314,
+ -0.0332527231700357697,
+ 0.0023114179304694015,
+ -0.0000991127741995080,
+ 0.0000028916708643998,
+ -0.0000000612108586630,
+ 0.0000000009838650793,
+ -0.0000000000124235515,
+ 0.0000000000001265433,
+ -0.0000000000000010619,
+ 0.0000000000000000074,
+};
+static cheb_series bj0_cs = {
+ bj0_data,
+ 12,
+ -1, 1,
+ 9
+};
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int gsl_sf_bessel_J0_e(const double x, gsl_sf_result * result)
+{
+ double y = fabs(x);
+
+ /* CHECK_POINTER(result) */
+
+ if(y < 2.0*GSL_SQRT_DBL_EPSILON) {
+ result->val = 1.0;
+ result->err = y*y;
+ return GSL_SUCCESS;
+ }
+ else if(y <= 4.0) {
+ return cheb_eval_e(&bj0_cs, 0.125*y*y - 1.0, result);
+ }
+ else {
+ const double z = 32.0/(y*y) - 1.0;
+ gsl_sf_result ca;
+ gsl_sf_result ct;
+ gsl_sf_result cp;
+ const int stat_ca = cheb_eval_e(&_gsl_sf_bessel_amp_phase_bm0_cs, z, &ca);
+ const int stat_ct = cheb_eval_e(&_gsl_sf_bessel_amp_phase_bth0_cs, z, &ct);
+ const int stat_cp = gsl_sf_bessel_cos_pi4_e(y, ct.val/y, &cp);
+ const double sqrty = sqrt(y);
+ const double ampl = (0.75 + ca.val) / sqrty;
+ result->val = ampl * cp.val;
+ result->err = fabs(cp.val) * ca.err/sqrty + fabs(ampl) * cp.err;
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_ERROR_SELECT_3(stat_ca, stat_ct, stat_cp);
+ }
+}
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_bessel_J0(const double x)
+{
+ EVAL_RESULT(gsl_sf_bessel_J0_e(x, &result));
+}
diff --git a/gsl-1.9/specfunc/bessel_J1.c b/gsl-1.9/specfunc/bessel_J1.c
new file mode 100644
index 0000000..2df29d2
--- /dev/null
+++ b/gsl-1.9/specfunc/bessel_J1.c
@@ -0,0 +1,128 @@
+/* specfunc/bessel_J1.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_trig.h>
+#include <gsl/gsl_sf_bessel.h>
+
+#include "error.h"
+
+#include "bessel.h"
+#include "bessel_amp_phase.h"
+#include "cheb_eval.c"
+
+#define ROOT_EIGHT (2.0*M_SQRT2)
+
+/*-*-*-*-*-*-*-*-*-*-*-* Private Section *-*-*-*-*-*-*-*-*-*-*-*/
+
+
+/* based on SLATEC besj1, 1983 version, w. fullerton */
+
+/* chebyshev expansions
+
+ series for bj1 on the interval 0. to 1.60000d+01
+ with weighted error 4.48e-17
+ log weighted error 16.35
+ significant figures required 15.77
+ decimal places required 16.89
+
+*/
+static double bj1_data[12] = {
+ -0.11726141513332787,
+ -0.25361521830790640,
+ 0.050127080984469569,
+ -0.004631514809625081,
+ 0.000247996229415914,
+ -0.000008678948686278,
+ 0.000000214293917143,
+ -0.000000003936093079,
+ 0.000000000055911823,
+ -0.000000000000632761,
+ 0.000000000000005840,
+ -0.000000000000000044,
+};
+static cheb_series bj1_cs = {
+ bj1_data,
+ 11,
+ -1, 1,
+ 8
+};
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int gsl_sf_bessel_J1_e(const double x, gsl_sf_result * result)
+{
+ double y = fabs(x);
+
+ /* CHECK_POINTER(result) */
+
+ if(y == 0.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(y < 2.0*GSL_DBL_MIN) {
+ UNDERFLOW_ERROR(result);
+ }
+ else if(y < ROOT_EIGHT * GSL_SQRT_DBL_EPSILON) {
+ result->val = 0.5*x;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(y < 4.0) {
+ gsl_sf_result c;
+ cheb_eval_e(&bj1_cs, 0.125*y*y-1.0, &c);
+ result->val = x * (0.25 + c.val);
+ result->err = fabs(x * c.err);
+ return GSL_SUCCESS;
+ }
+ else {
+ /* Because the leading term in the phase is y,
+ * which we assume is exactly known, the error
+ * in the cos() evaluation is bounded.
+ */
+ const double z = 32.0/(y*y) - 1.0;
+ gsl_sf_result ca;
+ gsl_sf_result ct;
+ gsl_sf_result sp;
+ const int stat_ca = cheb_eval_e(&_gsl_sf_bessel_amp_phase_bm1_cs, z, &ca);
+ const int stat_ct = cheb_eval_e(&_gsl_sf_bessel_amp_phase_bth1_cs, z, &ct);
+ const int stat_sp = gsl_sf_bessel_sin_pi4_e(y, ct.val/y, &sp);
+ const double sqrty = sqrt(y);
+ const double ampl = (0.75 + ca.val) / sqrty;
+ result->val = (x < 0.0 ? -ampl : ampl) * sp.val;
+ result->err = fabs(sp.val) * ca.err/sqrty + fabs(ampl) * sp.err;
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_ERROR_SELECT_3(stat_ca, stat_ct, stat_sp);
+ }
+}
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_bessel_J1(const double x)
+{
+ EVAL_RESULT(gsl_sf_bessel_J1_e(x, &result));
+}
diff --git a/gsl-1.9/specfunc/bessel_Jn.c b/gsl-1.9/specfunc/bessel_Jn.c
new file mode 100644
index 0000000..a79ded4
--- /dev/null
+++ b/gsl-1.9/specfunc/bessel_Jn.c
@@ -0,0 +1,199 @@
+/* specfunc/bessel_Jn.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_pow_int.h>
+#include "bessel.h"
+#include "bessel_amp_phase.h"
+#include "bessel_olver.h"
+#include <gsl/gsl_sf_bessel.h>
+
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+
+int gsl_sf_bessel_Jn_e(int n, double x, gsl_sf_result * result)
+{
+ int sign = 1;
+
+ if(n < 0) {
+ /* reduce to case n >= 0 */
+ n = -n;
+ if(GSL_IS_ODD(n)) sign = -sign;
+ }
+
+ if(x < 0.0) {
+ /* reduce to case x >= 0. */
+ x = -x;
+ if(GSL_IS_ODD(n)) sign = -sign;
+ }
+
+ /* CHECK_POINTER(result) */
+
+ if(n == 0) {
+ gsl_sf_result b0;
+ int stat_J0 = gsl_sf_bessel_J0_e(x, &b0);
+ result->val = sign * b0.val;
+ result->err = b0.err;
+ return stat_J0;
+ }
+ else if(n == 1) {
+ gsl_sf_result b1;
+ int stat_J1 = gsl_sf_bessel_J1_e(x, &b1);
+ result->val = sign * b1.val;
+ result->err = b1.err;
+ return stat_J1;
+ }
+ else {
+ if(x == 0.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(x*x < 10.0*(n+1.0)*GSL_ROOT5_DBL_EPSILON) {
+ gsl_sf_result b;
+ int status = gsl_sf_bessel_IJ_taylor_e((double)n, x, -1, 50, GSL_DBL_EPSILON, &b);
+ result->val = sign * b.val;
+ result->err = b.err;
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+ return status;
+ }
+ else if(GSL_ROOT4_DBL_EPSILON * x > (n*n+1.0)) {
+ int status = gsl_sf_bessel_Jnu_asympx_e((double)n, x, result);
+ result->val *= sign;
+ return status;
+ }
+ else if(n > 50) {
+ int status = gsl_sf_bessel_Jnu_asymp_Olver_e((double)n, x, result);
+ result->val *= sign;
+ return status;
+ }
+ else if(x > 1000.0)
+ {
+ /* We need this to avoid feeding large x to CF1; note that
+ * due to the above check, we know that n <= 50.
+ */
+ int status = gsl_sf_bessel_Jnu_asympx_e((double)n, x, result);
+ result->val *= sign;
+ return status;
+ }
+ else {
+ double ans;
+ double err;
+ double ratio;
+ double sgn;
+ int stat_b;
+ int stat_CF1 = gsl_sf_bessel_J_CF1((double)n, x, &ratio, &sgn);
+
+ /* backward recurrence */
+ double Jkp1 = GSL_SQRT_DBL_MIN * ratio;
+ double Jk = GSL_SQRT_DBL_MIN;
+ double Jkm1;
+ int k;
+
+ for(k=n; k>0; k--) {
+ Jkm1 = 2.0*k/x * Jk - Jkp1;
+ Jkp1 = Jk;
+ Jk = Jkm1;
+ }
+
+ if(fabs(Jkp1) > fabs(Jk)) {
+ gsl_sf_result b1;
+ stat_b = gsl_sf_bessel_J1_e(x, &b1);
+ ans = b1.val/Jkp1 * GSL_SQRT_DBL_MIN;
+ err = b1.err/Jkp1 * GSL_SQRT_DBL_MIN;
+ }
+ else {
+ gsl_sf_result b0;
+ stat_b = gsl_sf_bessel_J0_e(x, &b0);
+ ans = b0.val/Jk * GSL_SQRT_DBL_MIN;
+ err = b0.err/Jk * GSL_SQRT_DBL_MIN;
+ }
+
+ result->val = sign * ans;
+ result->err = fabs(err);
+ return GSL_ERROR_SELECT_2(stat_CF1, stat_b);
+ }
+ }
+}
+
+
+int
+gsl_sf_bessel_Jn_array(int nmin, int nmax, double x, double * result_array)
+{
+ /* CHECK_POINTER(result_array) */
+
+ if(nmin < 0 || nmax < nmin) {
+ int n;
+ for(n=nmax; n>=nmin; n--) {
+ result_array[n-nmin] = 0.0;
+ }
+ GSL_ERROR ("domain error", GSL_EDOM);
+ }
+ else if(x == 0.0) {
+ int n;
+ for(n=nmax; n>=nmin; n--) {
+ result_array[n-nmin] = 0.0;
+ }
+ if(nmin == 0) result_array[0] = 1.0;
+ return GSL_SUCCESS;
+ }
+ else {
+ gsl_sf_result r_Jnp1;
+ gsl_sf_result r_Jn;
+ int stat_np1 = gsl_sf_bessel_Jn_e(nmax+1, x, &r_Jnp1);
+ int stat_n = gsl_sf_bessel_Jn_e(nmax, x, &r_Jn);
+ int stat = GSL_ERROR_SELECT_2(stat_np1, stat_n);
+
+ double Jnp1 = r_Jnp1.val;
+ double Jn = r_Jn.val;
+ double Jnm1;
+ int n;
+
+ if(stat == GSL_SUCCESS) {
+ for(n=nmax; n>=nmin; n--) {
+ result_array[n-nmin] = Jn;
+ Jnm1 = -Jnp1 + 2.0*n/x * Jn;
+ Jnp1 = Jn;
+ Jn = Jnm1;
+ }
+ }
+ else {
+ for(n=nmax; n>=nmin; n--) {
+ result_array[n-nmin] = 0.0;
+ }
+ }
+
+ return stat;
+ }
+}
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_bessel_Jn(const int n, const double x)
+{
+ EVAL_RESULT(gsl_sf_bessel_Jn_e(n, x, &result));
+}
diff --git a/gsl-1.9/specfunc/bessel_Jnu.c b/gsl-1.9/specfunc/bessel_Jnu.c
new file mode 100644
index 0000000..81763a4
--- /dev/null
+++ b/gsl-1.9/specfunc/bessel_Jnu.c
@@ -0,0 +1,185 @@
+/* specfunc/bessel_Jnu.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_bessel.h>
+
+#include "error.h"
+
+#include "bessel.h"
+#include "bessel_olver.h"
+#include "bessel_temme.h"
+
+
+/* Evaluate at large enough nu to apply asymptotic
+ * results and apply backward recurrence.
+ */
+#if 0
+static
+int
+bessel_J_recur_asymp(const double nu, const double x,
+ gsl_sf_result * Jnu, gsl_sf_result * Jnup1)
+{
+ const double nu_cut = 25.0;
+ int n;
+ int steps = ceil(nu_cut - nu) + 1;
+
+ gsl_sf_result r_Jnp1;
+ gsl_sf_result r_Jn;
+ int stat_O1 = gsl_sf_bessel_Jnu_asymp_Olver_e(nu + steps + 1.0, x, &r_Jnp1);
+ int stat_O2 = gsl_sf_bessel_Jnu_asymp_Olver_e(nu + steps, x, &r_Jn);
+ double r_fe = fabs(r_Jnp1.err/r_Jnp1.val) + fabs(r_Jn.err/r_Jn.val);
+ double Jnp1 = r_Jnp1.val;
+ double Jn = r_Jn.val;
+ double Jnm1;
+ double Jnp1_save;
+
+ for(n=steps; n>0; n--) {
+ Jnm1 = 2.0*(nu+n)/x * Jn - Jnp1;
+ Jnp1 = Jn;
+ Jnp1_save = Jn;
+ Jn = Jnm1;
+ }
+
+ Jnu->val = Jn;
+ Jnu->err = (r_fe + GSL_DBL_EPSILON * (steps + 1.0)) * fabs(Jn);
+ Jnup1->val = Jnp1_save;
+ Jnup1->err = (r_fe + GSL_DBL_EPSILON * (steps + 1.0)) * fabs(Jnp1_save);
+
+ return GSL_ERROR_SELECT_2(stat_O1, stat_O2);
+}
+#endif
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int
+gsl_sf_bessel_Jnu_e(const double nu, const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x < 0.0 || nu < 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x == 0.0) {
+ if(nu == 0.0) {
+ result->val = 1.0;
+ result->err = 0.0;
+ }
+ else {
+ result->val = 0.0;
+ result->err = 0.0;
+ }
+ return GSL_SUCCESS;
+ }
+ else if(x*x < 10.0*(nu+1.0)) {
+ return gsl_sf_bessel_IJ_taylor_e(nu, x, -1, 100, GSL_DBL_EPSILON, result);
+ }
+ else if(nu > 50.0) {
+ return gsl_sf_bessel_Jnu_asymp_Olver_e(nu, x, result);
+ }
+ else if(x > 1000.0)
+ {
+ /* We need this to avoid feeding large x to CF1; note that
+ * due to the above check, we know that n <= 50. See similar
+ * block in bessel_Jn.c.
+ */
+ return gsl_sf_bessel_Jnu_asympx_e(nu, x, result);
+ }
+ else {
+ /* -1/2 <= mu <= 1/2 */
+ int N = (int)(nu + 0.5);
+ double mu = nu - N;
+
+ /* Determine the J ratio at nu.
+ */
+ double Jnup1_Jnu;
+ double sgn_Jnu;
+ const int stat_CF1 = gsl_sf_bessel_J_CF1(nu, x, &Jnup1_Jnu, &sgn_Jnu);
+
+ if(x < 2.0) {
+ /* Determine Y_mu, Y_mup1 directly and recurse forward to nu.
+ * Then use the CF1 information to solve for J_nu and J_nup1.
+ */
+ gsl_sf_result Y_mu, Y_mup1;
+ const int stat_mu = gsl_sf_bessel_Y_temme(mu, x, &Y_mu, &Y_mup1);
+
+ double Ynm1 = Y_mu.val;
+ double Yn = Y_mup1.val;
+ double Ynp1 = 0.0;
+ int n;
+ for(n=1; n<N; n++) {
+ Ynp1 = 2.0*(mu+n)/x * Yn - Ynm1;
+ Ynm1 = Yn;
+ Yn = Ynp1;
+ }
+
+ result->val = 2.0/(M_PI*x) / (Jnup1_Jnu*Yn - Ynp1);
+ result->err = GSL_DBL_EPSILON * (N + 2.0) * fabs(result->val);
+ return GSL_ERROR_SELECT_2(stat_mu, stat_CF1);
+ }
+ else {
+ /* Recurse backward from nu to mu, determining the J ratio
+ * at mu. Use this together with a Steed method CF2 to
+ * determine the actual J_mu, and thus obtain the normalization.
+ */
+ double Jmu;
+ double Jmup1_Jmu;
+ double sgn_Jmu;
+ double Jmuprime_Jmu;
+ double P, Q;
+ const int stat_CF2 = gsl_sf_bessel_JY_steed_CF2(mu, x, &P, &Q);
+ double gamma;
+
+ double Jnp1 = sgn_Jnu * GSL_SQRT_DBL_MIN * Jnup1_Jnu;
+ double Jn = sgn_Jnu * GSL_SQRT_DBL_MIN;
+ double Jnm1;
+ int n;
+ for(n=N; n>0; n--) {
+ Jnm1 = 2.0*(mu+n)/x * Jn - Jnp1;
+ Jnp1 = Jn;
+ Jn = Jnm1;
+ }
+ Jmup1_Jmu = Jnp1/Jn;
+ sgn_Jmu = GSL_SIGN(Jn);
+ Jmuprime_Jmu = mu/x - Jmup1_Jmu;
+
+ gamma = (P - Jmuprime_Jmu)/Q;
+ Jmu = sgn_Jmu * sqrt(2.0/(M_PI*x) / (Q + gamma*(P-Jmuprime_Jmu)));
+
+ result->val = Jmu * (sgn_Jnu * GSL_SQRT_DBL_MIN) / Jn;
+ result->err = 2.0 * GSL_DBL_EPSILON * (N + 2.0) * fabs(result->val);
+
+ return GSL_ERROR_SELECT_2(stat_CF2, stat_CF1);
+ }
+ }
+}
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_bessel_Jnu(const double nu, const double x)
+{
+ EVAL_RESULT(gsl_sf_bessel_Jnu_e(nu, x, &result));
+}
diff --git a/gsl-1.9/specfunc/bessel_K0.c b/gsl-1.9/specfunc/bessel_K0.c
new file mode 100644
index 0000000..ebbb0a1
--- /dev/null
+++ b/gsl-1.9/specfunc/bessel_K0.c
@@ -0,0 +1,214 @@
+/* specfunc/bessel_K0.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_exp.h>
+#include <gsl/gsl_sf_bessel.h>
+
+#include "error.h"
+
+#include "chebyshev.h"
+#include "cheb_eval.c"
+
+/*-*-*-*-*-*-*-*-*-*-*-* Private Section *-*-*-*-*-*-*-*-*-*-*-*/
+
+/* based on SLATEC bk0(), bk0e() */
+
+/* chebyshev expansions
+
+ series for bk0 on the interval 0. to 4.00000d+00
+ with weighted error 3.57e-19
+ log weighted error 18.45
+ significant figures required 17.99
+ decimal places required 18.97
+
+ series for ak0 on the interval 1.25000d-01 to 5.00000d-01
+ with weighted error 5.34e-17
+ log weighted error 16.27
+ significant figures required 14.92
+ decimal places required 16.89
+
+ series for ak02 on the interval 0. to 1.25000d-01
+ with weighted error 2.34e-17
+ log weighted error 16.63
+ significant figures required 14.67
+ decimal places required 17.20
+*/
+
+static double bk0_data[11] = {
+ -0.03532739323390276872,
+ 0.3442898999246284869,
+ 0.03597993651536150163,
+ 0.00126461541144692592,
+ 0.00002286212103119451,
+ 0.00000025347910790261,
+ 0.00000000190451637722,
+ 0.00000000001034969525,
+ 0.00000000000004259816,
+ 0.00000000000000013744,
+ 0.00000000000000000035
+};
+static cheb_series bk0_cs = {
+ bk0_data,
+ 10,
+ -1, 1,
+ 10
+};
+
+static double ak0_data[17] = {
+ -0.07643947903327941,
+ -0.02235652605699819,
+ 0.00077341811546938,
+ -0.00004281006688886,
+ 0.00000308170017386,
+ -0.00000026393672220,
+ 0.00000002563713036,
+ -0.00000000274270554,
+ 0.00000000031694296,
+ -0.00000000003902353,
+ 0.00000000000506804,
+ -0.00000000000068895,
+ 0.00000000000009744,
+ -0.00000000000001427,
+ 0.00000000000000215,
+ -0.00000000000000033,
+ 0.00000000000000005
+};
+static cheb_series ak0_cs = {
+ ak0_data,
+ 16,
+ -1, 1,
+ 10
+};
+
+static double ak02_data[14] = {
+ -0.01201869826307592,
+ -0.00917485269102569,
+ 0.00014445509317750,
+ -0.00000401361417543,
+ 0.00000015678318108,
+ -0.00000000777011043,
+ 0.00000000046111825,
+ -0.00000000003158592,
+ 0.00000000000243501,
+ -0.00000000000020743,
+ 0.00000000000001925,
+ -0.00000000000000192,
+ 0.00000000000000020,
+ -0.00000000000000002
+};
+static cheb_series ak02_cs = {
+ ak02_data,
+ 13,
+ -1, 1,
+ 8
+};
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int gsl_sf_bessel_K0_scaled_e(const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x <= 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x <= 2.0) {
+ const double lx = log(x);
+ const double ex = exp(x);
+ int stat_I0;
+ gsl_sf_result I0;
+ gsl_sf_result c;
+ cheb_eval_e(&bk0_cs, 0.5*x*x-1.0, &c);
+ stat_I0 = gsl_sf_bessel_I0_e(x, &I0);
+ result->val = ex * ((-lx+M_LN2)*I0.val - 0.25 + c.val);
+ result->err = ex * ((M_LN2+fabs(lx))*I0.err + c.err);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return stat_I0;
+ }
+ else if(x <= 8.0) {
+ const double sx = sqrt(x);
+ gsl_sf_result c;
+ cheb_eval_e(&ak0_cs, (16.0/x-5.0)/3.0, &c);
+ result->val = (1.25 + c.val) / sx;
+ result->err = c.err / sx;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ const double sx = sqrt(x);
+ gsl_sf_result c;
+ cheb_eval_e(&ak02_cs, 16.0/x-1.0, &c);
+ result->val = (1.25 + c.val) / sx;
+ result->err = (c.err + GSL_DBL_EPSILON) / sx;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+}
+
+
+int gsl_sf_bessel_K0_e(const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x <= 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x <= 2.0) {
+ const double lx = log(x);
+ int stat_I0;
+ gsl_sf_result I0;
+ gsl_sf_result c;
+ cheb_eval_e(&bk0_cs, 0.5*x*x-1.0, &c);
+ stat_I0 = gsl_sf_bessel_I0_e(x, &I0);
+ result->val = (-lx+M_LN2)*I0.val - 0.25 + c.val;
+ result->err = (fabs(lx) + M_LN2) * I0.err + c.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return stat_I0;
+ }
+ else {
+ gsl_sf_result K0_scaled;
+ int stat_K0 = gsl_sf_bessel_K0_scaled_e(x, &K0_scaled);
+ int stat_e = gsl_sf_exp_mult_err_e(-x, GSL_DBL_EPSILON*fabs(x),
+ K0_scaled.val, K0_scaled.err,
+ result);
+ return GSL_ERROR_SELECT_2(stat_e, stat_K0);
+ }
+}
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_bessel_K0_scaled(const double x)
+{
+ EVAL_RESULT(gsl_sf_bessel_K0_scaled_e(x, &result));
+}
+
+double gsl_sf_bessel_K0(const double x)
+{
+ EVAL_RESULT(gsl_sf_bessel_K0_e(x, &result));
+}
+
diff --git a/gsl-1.9/specfunc/bessel_K1.c b/gsl-1.9/specfunc/bessel_K1.c
new file mode 100644
index 0000000..8531714
--- /dev/null
+++ b/gsl-1.9/specfunc/bessel_K1.c
@@ -0,0 +1,220 @@
+/* specfunc/bessel_K1.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_exp.h>
+#include <gsl/gsl_sf_bessel.h>
+
+#include "error.h"
+
+#include "chebyshev.h"
+#include "cheb_eval.c"
+
+/*-*-*-*-*-*-*-*-*-*-*-* Private Section *-*-*-*-*-*-*-*-*-*-*-*/
+
+/* based on SLATEC besk1(), besk1e() */
+
+/* chebyshev expansions
+
+ series for bk1 on the interval 0. to 4.00000d+00
+ with weighted error 7.02e-18
+ log weighted error 17.15
+ significant figures required 16.73
+ decimal places required 17.67
+
+ series for ak1 on the interval 1.25000d-01 to 5.00000d-01
+ with weighted error 6.06e-17
+ log weighted error 16.22
+ significant figures required 15.41
+ decimal places required 16.83
+
+ series for ak12 on the interval 0. to 1.25000d-01
+ with weighted error 2.58e-17
+ log weighted error 16.59
+ significant figures required 15.22
+ decimal places required 17.16
+*/
+
+static double bk1_data[11] = {
+ 0.0253002273389477705,
+ -0.3531559607765448760,
+ -0.1226111808226571480,
+ -0.0069757238596398643,
+ -0.0001730288957513052,
+ -0.0000024334061415659,
+ -0.0000000221338763073,
+ -0.0000000001411488392,
+ -0.0000000000006666901,
+ -0.0000000000000024274,
+ -0.0000000000000000070
+};
+
+static cheb_series bk1_cs = {
+ bk1_data,
+ 10,
+ -1, 1,
+ 8
+};
+
+static double ak1_data[17] = {
+ 0.27443134069738830,
+ 0.07571989953199368,
+ -0.00144105155647540,
+ 0.00006650116955125,
+ -0.00000436998470952,
+ 0.00000035402774997,
+ -0.00000003311163779,
+ 0.00000000344597758,
+ -0.00000000038989323,
+ 0.00000000004720819,
+ -0.00000000000604783,
+ 0.00000000000081284,
+ -0.00000000000011386,
+ 0.00000000000001654,
+ -0.00000000000000248,
+ 0.00000000000000038,
+ -0.00000000000000006
+};
+static cheb_series ak1_cs = {
+ ak1_data,
+ 16,
+ -1, 1,
+ 9
+};
+
+static double ak12_data[14] = {
+ 0.06379308343739001,
+ 0.02832887813049721,
+ -0.00024753706739052,
+ 0.00000577197245160,
+ -0.00000020689392195,
+ 0.00000000973998344,
+ -0.00000000055853361,
+ 0.00000000003732996,
+ -0.00000000000282505,
+ 0.00000000000023720,
+ -0.00000000000002176,
+ 0.00000000000000215,
+ -0.00000000000000022,
+ 0.00000000000000002
+};
+static cheb_series ak12_cs = {
+ ak12_data,
+ 13,
+ -1, 1,
+ 7
+};
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int gsl_sf_bessel_K1_scaled_e(const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x <= 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x < 2.0*GSL_DBL_MIN) {
+ OVERFLOW_ERROR(result);
+ }
+ else if(x <= 2.0) {
+ const double lx = log(x);
+ const double ex = exp(x);
+ int stat_I1;
+ gsl_sf_result I1;
+ gsl_sf_result c;
+ cheb_eval_e(&bk1_cs, 0.5*x*x-1.0, &c);
+ stat_I1 = gsl_sf_bessel_I1_e(x, &I1);
+ result->val = ex * ((lx-M_LN2)*I1.val + (0.75 + c.val)/x);
+ result->err = ex * (c.err/x + fabs(lx)*I1.err);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return stat_I1;
+ }
+ else if(x <= 8.0) {
+ const double sx = sqrt(x);
+ gsl_sf_result c;
+ cheb_eval_e(&ak1_cs, (16.0/x-5.0)/3.0, &c);
+ result->val = (1.25 + c.val) / sx;
+ result->err = c.err / sx;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ const double sx = sqrt(x);
+ gsl_sf_result c;
+ cheb_eval_e(&ak12_cs, 16.0/x-1.0, &c);
+ result->val = (1.25 + c.val) / sx;
+ result->err = c.err / sx;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+}
+
+
+int gsl_sf_bessel_K1_e(const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x <= 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x < 2.0*GSL_DBL_MIN) {
+ OVERFLOW_ERROR(result);
+ }
+ else if(x <= 2.0) {
+ const double lx = log(x);
+ int stat_I1;
+ gsl_sf_result I1;
+ gsl_sf_result c;
+ cheb_eval_e(&bk1_cs, 0.5*x*x-1.0, &c);
+ stat_I1 = gsl_sf_bessel_I1_e(x, &I1);
+ result->val = (lx-M_LN2)*I1.val + (0.75 + c.val)/x;
+ result->err = c.err/x + fabs(lx)*I1.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return stat_I1;
+ }
+ else {
+ gsl_sf_result K1_scaled;
+ int stat_K1 = gsl_sf_bessel_K1_scaled_e(x, &K1_scaled);
+ int stat_e = gsl_sf_exp_mult_err_e(-x, 0.0,
+ K1_scaled.val, K1_scaled.err,
+ result);
+ result->err = fabs(result->val) * (GSL_DBL_EPSILON*fabs(x) + K1_scaled.err/K1_scaled.val);
+ return GSL_ERROR_SELECT_2(stat_e, stat_K1);
+ }
+}
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_bessel_K1_scaled(const double x)
+{
+ EVAL_RESULT(gsl_sf_bessel_K1_scaled_e(x, &result));
+}
+
+double gsl_sf_bessel_K1(const double x)
+{
+ EVAL_RESULT(gsl_sf_bessel_K1_e(x, &result));
+}
diff --git a/gsl-1.9/specfunc/bessel_Kn.c b/gsl-1.9/specfunc/bessel_Kn.c
new file mode 100644
index 0000000..bb8e774
--- /dev/null
+++ b/gsl-1.9/specfunc/bessel_Kn.c
@@ -0,0 +1,240 @@
+/* specfunc/bessel_Kn.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_gamma.h>
+#include <gsl/gsl_sf_psi.h>
+#include <gsl/gsl_sf_bessel.h>
+
+#include "error.h"
+
+#include "bessel.h"
+
+/*-*-*-*-*-*-*-*-*-*-*-* Private Section *-*-*-*-*-*-*-*-*-*-*-*/
+
+/* [Abramowitz+Stegun, 9.6.11]
+ * assumes n >= 1
+ */
+static
+int
+bessel_Kn_scaled_small_x(const int n, const double x, gsl_sf_result * result)
+{
+ int k;
+ double y = 0.25 * x * x;
+ double ln_x_2 = log(0.5*x);
+ double ex = exp(x);
+ gsl_sf_result ln_nm1_fact;
+ double k_term;
+ double term1, sum1, ln_pre1;
+ double term2, sum2, pre2;
+
+ gsl_sf_lnfact_e((unsigned int)(n-1), &ln_nm1_fact);
+
+ ln_pre1 = -n*ln_x_2 + ln_nm1_fact.val;
+ if(ln_pre1 > GSL_LOG_DBL_MAX - 3.0) GSL_ERROR ("error", GSL_EOVRFLW);
+
+ sum1 = 1.0;
+ k_term = 1.0;
+ for(k=1; k<=n-1; k++) {
+ k_term *= -y/(k * (n-k));
+ sum1 += k_term;
+ }
+ term1 = 0.5 * exp(ln_pre1) * sum1;
+
+ pre2 = 0.5 * exp(n*ln_x_2);
+ if(pre2 > 0.0) {
+ const int KMAX = 20;
+ gsl_sf_result psi_n;
+ gsl_sf_result npk_fact;
+ double yk = 1.0;
+ double k_fact = 1.0;
+ double psi_kp1 = -M_EULER;
+ double psi_npkp1;
+ gsl_sf_psi_int_e(n, &psi_n);
+ gsl_sf_fact_e((unsigned int)n, &npk_fact);
+ psi_npkp1 = psi_n.val + 1.0/n;
+ sum2 = (psi_kp1 + psi_npkp1 - 2.0*ln_x_2)/npk_fact.val;
+ for(k=1; k<KMAX; k++) {
+ psi_kp1 += 1.0/k;
+ psi_npkp1 += 1.0/(n+k);
+ k_fact *= k;
+ npk_fact.val *= n+k;
+ yk *= y;
+ k_term = yk*(psi_kp1 + psi_npkp1 - 2.0*ln_x_2)/(k_fact*npk_fact.val);
+ sum2 += k_term;
+ }
+ term2 = ( GSL_IS_ODD(n) ? -1.0 : 1.0 ) * pre2 * sum2;
+ }
+ else {
+ term2 = 0.0;
+ }
+
+ result->val = ex * (term1 + term2);
+ result->err = ex * GSL_DBL_EPSILON * (fabs(ln_pre1)*fabs(term1) + fabs(term2));
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+
+ return GSL_SUCCESS;
+}
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int gsl_sf_bessel_Kn_scaled_e(int n, const double x, gsl_sf_result * result)
+{
+ n = abs(n); /* K(-n, z) = K(n, z) */
+
+ /* CHECK_POINTER(result) */
+
+ if(x <= 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(n == 0) {
+ return gsl_sf_bessel_K0_scaled_e(x, result);
+ }
+ else if(n == 1) {
+ return gsl_sf_bessel_K1_scaled_e(x, result);
+ }
+ else if(x <= 5.0) {
+ return bessel_Kn_scaled_small_x(n, x, result);
+ }
+ else if(GSL_ROOT3_DBL_EPSILON * x > 0.25 * (n*n + 1)) {
+ return gsl_sf_bessel_Knu_scaled_asympx_e((double)n, x, result);
+ }
+ else if(GSL_MIN(0.29/(n*n), 0.5/(n*n + x*x)) < GSL_ROOT3_DBL_EPSILON) {
+ return gsl_sf_bessel_Knu_scaled_asymp_unif_e((double)n, x, result);
+ }
+ else {
+ /* Upward recurrence. [Gradshteyn + Ryzhik, 8.471.1] */
+ double two_over_x = 2.0/x;
+ gsl_sf_result r_b_jm1;
+ gsl_sf_result r_b_j;
+ int stat_0 = gsl_sf_bessel_K0_scaled_e(x, &r_b_jm1);
+ int stat_1 = gsl_sf_bessel_K1_scaled_e(x, &r_b_j);
+ double b_jm1 = r_b_jm1.val;
+ double b_j = r_b_j.val;
+ double b_jp1;
+ int j;
+
+ for(j=1; j<n; j++) {
+ b_jp1 = b_jm1 + j * two_over_x * b_j;
+ b_jm1 = b_j;
+ b_j = b_jp1;
+ }
+
+ result->val = b_j;
+ result->err = n * (fabs(b_j) * (fabs(r_b_jm1.err/r_b_jm1.val) + fabs(r_b_j.err/r_b_j.val)));
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+
+ return GSL_ERROR_SELECT_2(stat_0, stat_1);
+ }
+}
+
+
+int gsl_sf_bessel_Kn_e(const int n, const double x, gsl_sf_result * result)
+{
+ const int status = gsl_sf_bessel_Kn_scaled_e(n, x, result);
+ const double ex = exp(-x);
+ result->val *= ex;
+ result->err *= ex;
+ result->err += x * GSL_DBL_EPSILON * fabs(result->val);
+ return status;
+}
+
+
+int gsl_sf_bessel_Kn_scaled_array(const int nmin, const int nmax, const double x, double * result_array)
+{
+ /* CHECK_POINTER(result_array) */
+
+ if(nmin < 0 || nmax < nmin || x <= 0.0) {
+ int j;
+ for(j=0; j<=nmax-nmin; j++) result_array[j] = 0.0;
+ GSL_ERROR ("domain error", GSL_EDOM);
+ }
+ else if(nmax == 0) {
+ gsl_sf_result b;
+ int stat = gsl_sf_bessel_K0_scaled_e(x, &b);
+ result_array[0] = b.val;
+ return stat;
+ }
+ else {
+ double two_over_x = 2.0/x;
+ gsl_sf_result r_Knm1;
+ gsl_sf_result r_Kn;
+ int stat_0 = gsl_sf_bessel_Kn_scaled_e(nmin, x, &r_Knm1);
+ int stat_1 = gsl_sf_bessel_Kn_scaled_e(nmin+1, x, &r_Kn);
+ int stat = GSL_ERROR_SELECT_2(stat_0, stat_1);
+ double Knp1;
+ double Kn = r_Kn.val;
+ double Knm1 = r_Knm1.val;
+ int n;
+
+ for(n=nmin+1; n<=nmax+1; n++) {
+ if(Knm1 < GSL_DBL_MAX) {
+ result_array[n-1-nmin] = Knm1;
+ Knp1 = Knm1 + n * two_over_x * Kn;
+ Knm1 = Kn;
+ Kn = Knp1;
+ }
+ else {
+ /* Overflow. Set the rest of the elements to
+ * zero and bug out.
+ * FIXME: Note: this relies on the convention
+ * that the test x < DBL_MIN fails for x not
+ * a number. This may be only an IEEE convention,
+ * so the portability is unclear.
+ */
+ int j;
+ for(j=n; j<=nmax+1; j++) result_array[j-1-nmin] = 0.0;
+ GSL_ERROR ("overflow", GSL_EOVRFLW);
+ }
+ }
+
+ return stat;
+ }
+}
+
+
+int
+gsl_sf_bessel_Kn_array(const int nmin, const int nmax, const double x, double * result_array)
+{
+ int status = gsl_sf_bessel_Kn_scaled_array(nmin, nmax, x, result_array);
+ double ex = exp(-x);
+ int i;
+ for(i=0; i<=nmax-nmin; i++) result_array[i] *= ex;
+ return status;
+}
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_bessel_Kn_scaled(const int n, const double x)
+{
+ EVAL_RESULT(gsl_sf_bessel_Kn_scaled_e(n, x, &result));
+}
+
+double gsl_sf_bessel_Kn(const int n, const double x)
+{
+ EVAL_RESULT(gsl_sf_bessel_Kn_e(n, x, &result));
+}
diff --git a/gsl-1.9/specfunc/bessel_Knu.c b/gsl-1.9/specfunc/bessel_Knu.c
new file mode 100644
index 0000000..c9d5b85
--- /dev/null
+++ b/gsl-1.9/specfunc/bessel_Knu.c
@@ -0,0 +1,164 @@
+/* specfunc/bessel_Knu.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_exp.h>
+#include <gsl/gsl_sf_gamma.h>
+#include <gsl/gsl_sf_bessel.h>
+
+#include "error.h"
+
+#include "bessel.h"
+#include "bessel_temme.h"
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int
+gsl_sf_bessel_Knu_scaled_e(const double nu, const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x <= 0.0 || nu < 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else {
+ int N = (int)(nu + 0.5);
+ double mu = nu - N; /* -1/2 <= mu <= 1/2 */
+ double K_mu, K_mup1, Kp_mu;
+ double K_nu, K_nup1, K_num1;
+ int n;
+
+ if(x < 2.0) {
+ gsl_sf_bessel_K_scaled_temme(mu, x, &K_mu, &K_mup1, &Kp_mu);
+ }
+ else {
+ gsl_sf_bessel_K_scaled_steed_temme_CF2(mu, x, &K_mu, &K_mup1, &Kp_mu);
+ }
+
+ /* recurse forward to obtain K_num1, K_nu */
+ K_nu = K_mu;
+ K_nup1 = K_mup1;
+
+ for(n=0; n<N; n++) {
+ K_num1 = K_nu;
+ K_nu = K_nup1;
+ K_nup1 = 2.0*(mu+n+1)/x * K_nu + K_num1;
+ }
+
+ result->val = K_nu;
+ result->err = 2.0 * GSL_DBL_EPSILON * (N + 4.0) * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+}
+
+
+int
+gsl_sf_bessel_Knu_e(const double nu, const double x, gsl_sf_result * result)
+{
+ gsl_sf_result b;
+ int stat_K = gsl_sf_bessel_Knu_scaled_e(nu, x, &b);
+ int stat_e = gsl_sf_exp_mult_err_e(-x, 0.0, b.val, b.err, result);
+ return GSL_ERROR_SELECT_2(stat_e, stat_K);
+}
+
+
+int
+gsl_sf_bessel_lnKnu_e(const double nu, const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x <= 0.0 || nu < 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(nu == 0.0) {
+ gsl_sf_result K_scaled;
+ /* This cannot underflow, and
+ * it will not throw GSL_EDOM
+ * since that is already checked.
+ */
+ gsl_sf_bessel_K0_scaled_e(x, &K_scaled);
+ result->val = -x + log(fabs(K_scaled.val));
+ result->err = GSL_DBL_EPSILON * fabs(x) + fabs(K_scaled.err/K_scaled.val);
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x < 2.0 && nu > 1.0) {
+ /* Make use of the inequality
+ * Knu(x) <= 1/2 (2/x)^nu Gamma(nu),
+ * which follows from the integral representation
+ * [Abramowitz+Stegun, 9.6.23 (2)]. With this
+ * we decide whether or not there is an overflow
+ * problem because x is small.
+ */
+ double ln_bound;
+ gsl_sf_result lg_nu;
+ gsl_sf_lngamma_e(nu, &lg_nu);
+ ln_bound = -M_LN2 - nu*log(0.5*x) + lg_nu.val;
+ if(ln_bound > GSL_LOG_DBL_MAX - 20.0) {
+ /* x must be very small or nu very large (or both).
+ */
+ double xi = 0.25*x*x;
+ double sum = 1.0 - xi/(nu-1.0);
+ if(nu > 2.0) sum += (xi/(nu-1.0)) * (xi/(nu-2.0));
+ result->val = ln_bound + log(sum);
+ result->err = lg_nu.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ /* can drop-through here */
+ }
+
+
+ {
+ /* We passed the above tests, so no problem.
+ * Evaluate as usual. Note the possible drop-through
+ * in the above code!
+ */
+ gsl_sf_result K_scaled;
+ gsl_sf_bessel_Knu_scaled_e(nu, x, &K_scaled);
+ result->val = -x + log(fabs(K_scaled.val));
+ result->err = GSL_DBL_EPSILON * fabs(x) + fabs(K_scaled.err/K_scaled.val);
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+}
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_bessel_Knu_scaled(const double nu, const double x)
+{
+ EVAL_RESULT(gsl_sf_bessel_Knu_scaled_e(nu, x, &result));
+}
+
+double gsl_sf_bessel_Knu(const double nu, const double x)
+{
+ EVAL_RESULT(gsl_sf_bessel_Knu_e(nu, x, &result));
+}
+
+double gsl_sf_bessel_lnKnu(const double nu, const double x)
+{
+ EVAL_RESULT(gsl_sf_bessel_lnKnu_e(nu, x, &result));
+}
diff --git a/gsl-1.9/specfunc/bessel_Y0.c b/gsl-1.9/specfunc/bessel_Y0.c
new file mode 100644
index 0000000..0ed50ef
--- /dev/null
+++ b/gsl-1.9/specfunc/bessel_Y0.c
@@ -0,0 +1,122 @@
+/* specfunc/bessel_Y0.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_trig.h>
+#include <gsl/gsl_sf_bessel.h>
+
+#include "error.h"
+
+#include "bessel.h"
+#include "bessel_amp_phase.h"
+#include "cheb_eval.c"
+
+/*-*-*-*-*-*-*-*-*-*-*-* Private Section *-*-*-*-*-*-*-*-*-*-*-*/
+
+/* based on SLATEC besy0, 1980 version, w. fullerton */
+
+/* chebyshev expansions
+
+ series for by0 on the interval 0. to 1.60000d+01
+ with weighted error 1.20e-17
+ log weighted error 16.92
+ significant figures required 16.15
+ decimal places required 17.48
+*/
+
+static double by0_data[13] = {
+ -0.011277839392865573,
+ -0.128345237560420350,
+ -0.104378847997942490,
+ 0.023662749183969695,
+ -0.002090391647700486,
+ 0.000103975453939057,
+ -0.000003369747162423,
+ 0.000000077293842676,
+ -0.000000001324976772,
+ 0.000000000017648232,
+ -0.000000000000188105,
+ 0.000000000000001641,
+ -0.000000000000000011
+};
+static cheb_series by0_cs = {
+ by0_data,
+ 12,
+ -1, 1,
+ 8
+};
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int gsl_sf_bessel_Y0_e(const double x, gsl_sf_result * result)
+{
+ const double two_over_pi = 2.0/M_PI;
+ const double xmax = 1.0/GSL_DBL_EPSILON;
+
+ /* CHECK_POINTER(result) */
+
+ if (x <= 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x < 4.0) {
+ gsl_sf_result J0;
+ gsl_sf_result c;
+ int stat_J0 = gsl_sf_bessel_J0_e(x, &J0);
+ cheb_eval_e(&by0_cs, 0.125*x*x-1.0, &c);
+ result->val = two_over_pi*(-M_LN2 + log(x))*J0.val + 0.375 + c.val;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val) + c.err;
+ return stat_J0;
+ }
+ else if(x < xmax) {
+ /* Leading behaviour of phase is x, which is exact,
+ * so the error is bounded.
+ */
+ const double z = 32.0/(x*x) - 1.0;
+ gsl_sf_result c1;
+ gsl_sf_result c2;
+ gsl_sf_result sp;
+ const int stat_c1 = cheb_eval_e(&_gsl_sf_bessel_amp_phase_bm0_cs, z, &c1);
+ const int stat_c2 = cheb_eval_e(&_gsl_sf_bessel_amp_phase_bth0_cs, z, &c2);
+ const int stat_sp = gsl_sf_bessel_sin_pi4_e(x, c2.val/x, &sp);
+ const double sqrtx = sqrt(x);
+ const double ampl = (0.75 + c1.val) / sqrtx;
+ result->val = ampl * sp.val;
+ result->err = fabs(sp.val) * c1.err/sqrtx + fabs(ampl) * sp.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_ERROR_SELECT_3(stat_sp, stat_c1, stat_c2);
+ }
+ else {
+ UNDERFLOW_ERROR(result);
+ }
+}
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_bessel_Y0(const double x)
+{
+ EVAL_RESULT(gsl_sf_bessel_Y0_e(x, &result));
+}
diff --git a/gsl-1.9/specfunc/bessel_Y1.c b/gsl-1.9/specfunc/bessel_Y1.c
new file mode 100644
index 0000000..205eed3
--- /dev/null
+++ b/gsl-1.9/specfunc/bessel_Y1.c
@@ -0,0 +1,137 @@
+/* specfunc/bessel_Y1.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_trig.h>
+#include <gsl/gsl_sf_bessel.h>
+
+#include "error.h"
+
+#include "bessel.h"
+#include "bessel_amp_phase.h"
+#include "cheb_eval.c"
+
+/*-*-*-*-*-*-*-*-*-*-*-* Private Section *-*-*-*-*-*-*-*-*-*-*-*/
+
+/* based on SLATEC besy1, 1977 version, w. fullerton */
+
+/* chebyshev expansions
+
+ series for by1 on the interval 0. to 1.60000d+01
+ with weighted error 1.87e-18
+ log weighted error 17.73
+ significant figures required 17.83
+ decimal places required 18.30
+*/
+
+static double by1_data[14] = {
+ 0.03208047100611908629,
+ 1.262707897433500450,
+ 0.00649996189992317500,
+ -0.08936164528860504117,
+ 0.01325088122175709545,
+ -0.00089790591196483523,
+ 0.00003647361487958306,
+ -0.00000100137438166600,
+ 0.00000001994539657390,
+ -0.00000000030230656018,
+ 0.00000000000360987815,
+ -0.00000000000003487488,
+ 0.00000000000000027838,
+ -0.00000000000000000186
+};
+static cheb_series by1_cs = {
+ by1_data,
+ 13,
+ -1, 1,
+ 10
+};
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int gsl_sf_bessel_Y1_e(const double x, gsl_sf_result * result)
+{
+ const double two_over_pi = 2.0/M_PI;
+ const double xmin = 1.571*GSL_DBL_MIN; /*exp ( amax1(alog(r1mach(1)), -alog(r1mach(2)))+.01) */
+ const double x_small = 2.0 * GSL_SQRT_DBL_EPSILON;
+ const double xmax = 1.0/GSL_DBL_EPSILON;
+
+ /* CHECK_POINTER(result) */
+
+ if(x <= 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x < xmin) {
+ OVERFLOW_ERROR(result);
+ }
+ else if(x < x_small) {
+ const double lnterm = log(0.5*x);
+ gsl_sf_result J1;
+ gsl_sf_result c;
+ int status = gsl_sf_bessel_J1_e(x, &J1);
+ cheb_eval_e(&by1_cs, -1.0, &c);
+ result->val = two_over_pi * lnterm * J1.val + (0.5 + c.val)/x;
+ result->err = fabs(lnterm) * (fabs(GSL_DBL_EPSILON * J1.val) + J1.err) + c.err/x;
+ return status;
+ }
+ else if(x < 4.0) {
+ const double lnterm = log(0.5*x);
+ int status;
+ gsl_sf_result J1;
+ gsl_sf_result c;
+ cheb_eval_e(&by1_cs, 0.125*x*x-1.0, &c);
+ status = gsl_sf_bessel_J1_e(x, &J1);
+ result->val = two_over_pi * lnterm * J1.val + (0.5 + c.val)/x;
+ result->err = fabs(lnterm) * (fabs(GSL_DBL_EPSILON * J1.val) + J1.err) + c.err/x;
+ return status;
+ }
+ else if(x < xmax) {
+ const double z = 32.0/(x*x) - 1.0;
+ gsl_sf_result ca;
+ gsl_sf_result ct;
+ gsl_sf_result cp;
+ const int stat_ca = cheb_eval_e(&_gsl_sf_bessel_amp_phase_bm1_cs, z, &ca);
+ const int stat_ct = cheb_eval_e(&_gsl_sf_bessel_amp_phase_bth1_cs, z, &ct);
+ const int stat_cp = gsl_sf_bessel_cos_pi4_e(x, ct.val/x, &cp);
+ const double sqrtx = sqrt(x);
+ const double ampl = (0.75 + ca.val) / sqrtx;
+ result->val = -ampl * cp.val;
+ result->err = fabs(cp.val) * ca.err/sqrtx + fabs(ampl) * cp.err;
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_ERROR_SELECT_3(stat_ca, stat_ct, stat_cp);
+ }
+ else {
+ UNDERFLOW_ERROR(result);
+ }
+}
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_bessel_Y1(const double x)
+{
+ EVAL_RESULT(gsl_sf_bessel_Y1_e(x, &result));
+}
diff --git a/gsl-1.9/specfunc/bessel_Yn.c b/gsl-1.9/specfunc/bessel_Yn.c
new file mode 100644
index 0000000..c3140e5
--- /dev/null
+++ b/gsl-1.9/specfunc/bessel_Yn.c
@@ -0,0 +1,217 @@
+/* specfunc/bessel_Yn.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_gamma.h>
+#include <gsl/gsl_sf_psi.h>
+#include <gsl/gsl_sf_bessel.h>
+
+#include "error.h"
+
+#include "bessel.h"
+#include "bessel_amp_phase.h"
+#include "bessel_olver.h"
+
+/*-*-*-*-*-*-*-*-*-*-*-* Private Section *-*-*-*-*-*-*-*-*-*-*-*/
+
+/* assumes n >= 1 */
+static int bessel_Yn_small_x(const int n, const double x, gsl_sf_result * result)
+{
+ int k;
+ double y = 0.25 * x * x;
+ double ln_x_2 = log(0.5*x);
+ gsl_sf_result ln_nm1_fact;
+ double k_term;
+ double term1, sum1, ln_pre1;
+ double term2, sum2, pre2;
+
+ gsl_sf_lnfact_e((unsigned int)(n-1), &ln_nm1_fact);
+
+ ln_pre1 = -n*ln_x_2 + ln_nm1_fact.val;
+ if(ln_pre1 > GSL_LOG_DBL_MAX - 3.0) GSL_ERROR ("error", GSL_EOVRFLW);
+
+ sum1 = 1.0;
+ k_term = 1.0;
+ for(k=1; k<=n-1; k++) {
+ k_term *= y/(k * (n-k));
+ sum1 += k_term;
+ }
+ term1 = -exp(ln_pre1) * sum1 / M_PI;
+
+ pre2 = -exp(n*ln_x_2) / M_PI;
+ if(fabs(pre2) > 0.0) {
+ const int KMAX = 20;
+ gsl_sf_result psi_n;
+ gsl_sf_result npk_fact;
+ double yk = 1.0;
+ double k_fact = 1.0;
+ double psi_kp1 = -M_EULER;
+ double psi_npkp1;
+ gsl_sf_psi_int_e(n, &psi_n);
+ gsl_sf_fact_e((unsigned int)n, &npk_fact);
+ psi_npkp1 = psi_n.val + 1.0/n;
+ sum2 = (psi_kp1 + psi_npkp1 - 2.0*ln_x_2)/npk_fact.val;
+ for(k=1; k<KMAX; k++) {
+ psi_kp1 += 1./k;
+ psi_npkp1 += 1./(n+k);
+ k_fact *= k;
+ npk_fact.val *= n+k;
+ yk *= -y;
+ k_term = yk*(psi_kp1 + psi_npkp1 - 2.0*ln_x_2)/(k_fact*npk_fact.val);
+ sum2 += k_term;
+ }
+ term2 = pre2 * sum2;
+ }
+ else {
+ term2 = 0.0;
+ }
+
+ result->val = term1 + term2;
+ result->err = GSL_DBL_EPSILON * (fabs(ln_pre1)*fabs(term1) + fabs(term2));
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+
+ return GSL_SUCCESS;
+}
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+
+int
+gsl_sf_bessel_Yn_e(int n, const double x, gsl_sf_result * result)
+{
+ int sign = 1;
+
+ if(n < 0) {
+ /* reduce to case n >= 0 */
+ n = -n;
+ if(GSL_IS_ODD(n)) sign = -1;
+ }
+
+ /* CHECK_POINTER(result) */
+
+ if(n == 0) {
+ int status = gsl_sf_bessel_Y0_e(x, result);
+ result->val *= sign;
+ return status;
+ }
+ else if(n == 1) {
+ int status = gsl_sf_bessel_Y1_e(x, result);
+ result->val *= sign;
+ return status;
+ }
+ else {
+ if(x <= 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ if(x < 5.0) {
+ int status = bessel_Yn_small_x(n, x, result);
+ result->val *= sign;
+ return status;
+ }
+ else if(GSL_ROOT3_DBL_EPSILON * x > (n*n + 1.0)) {
+ int status = gsl_sf_bessel_Ynu_asympx_e((double)n, x, result);
+ result->val *= sign;
+ return status;
+ }
+ else if(n > 50) {
+ int status = gsl_sf_bessel_Ynu_asymp_Olver_e((double)n, x, result);
+ result->val *= sign;
+ return status;
+ }
+ else {
+ double two_over_x = 2.0/x;
+ gsl_sf_result r_by;
+ gsl_sf_result r_bym;
+ int stat_1 = gsl_sf_bessel_Y1_e(x, &r_by);
+ int stat_0 = gsl_sf_bessel_Y0_e(x, &r_bym);
+ double bym = r_bym.val;
+ double by = r_by.val;
+ double byp;
+ int j;
+
+ for(j=1; j<n; j++) {
+ byp = j*two_over_x*by - bym;
+ bym = by;
+ by = byp;
+ }
+ result->val = sign * by;
+ result->err = fabs(result->val) * (fabs(r_by.err/r_by.val) + fabs(r_bym.err/r_bym.val));
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+
+ return GSL_ERROR_SELECT_2(stat_1, stat_0);
+ }
+ }
+}
+
+
+int
+gsl_sf_bessel_Yn_array(const int nmin, const int nmax, const double x, double * result_array)
+{
+ /* CHECK_POINTER(result_array) */
+
+ if(nmin < 0 || nmax < nmin || x <= 0.0) {
+ int j;
+ for(j=0; j<=nmax-nmin; j++) result_array[j] = 0.0;
+ GSL_ERROR ("error", GSL_EDOM);
+ }
+ else {
+ gsl_sf_result r_Ynm1;
+ gsl_sf_result r_Yn;
+ int stat_nm1 = gsl_sf_bessel_Yn_e(nmin, x, &r_Ynm1);
+ int stat_n = gsl_sf_bessel_Yn_e(nmin+1, x, &r_Yn);
+ double Ynp1;
+ double Yn = r_Yn.val;
+ double Ynm1 = r_Ynm1.val;
+ int n;
+
+ int stat = GSL_ERROR_SELECT_2(stat_nm1, stat_n);
+
+ if(stat == GSL_SUCCESS) {
+ for(n=nmin+1; n<=nmax+1; n++) {
+ result_array[n-nmin-1] = Ynm1;
+ Ynp1 = -Ynm1 + 2.0*n/x * Yn;
+ Ynm1 = Yn;
+ Yn = Ynp1;
+ }
+ }
+ else {
+ for(n=nmin; n<=nmax; n++) {
+ result_array[n-nmin] = 0.0;
+ }
+ }
+
+ return stat;
+ }
+}
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_bessel_Yn(const int n, const double x)
+{
+ EVAL_RESULT(gsl_sf_bessel_Yn_e(n, x, &result));
+}
+
diff --git a/gsl-1.9/specfunc/bessel_Ynu.c b/gsl-1.9/specfunc/bessel_Ynu.c
new file mode 100644
index 0000000..1abcf7b
--- /dev/null
+++ b/gsl-1.9/specfunc/bessel_Ynu.c
@@ -0,0 +1,131 @@
+/* specfunc/bessel_Ynu.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_bessel.h>
+
+#include "error.h"
+
+#include "bessel.h"
+#include "bessel_olver.h"
+#include "bessel_temme.h"
+
+/* Perform forward recurrence for Y_nu(x) and Y'_nu(x)
+ *
+ * Y_{nu+1} = nu/x Y_nu - Y'_nu
+ * Y'_{nu+1} = -(nu+1)/x Y_{nu+1} + Y_nu
+ */
+#if 0
+static
+int
+bessel_Y_recur(const double nu_min, const double x, const int kmax,
+ const double Y_start, const double Yp_start,
+ double * Y_end, double * Yp_end)
+{
+ double x_inv = 1.0/x;
+ double nu = nu_min;
+ double Y_nu = Y_start;
+ double Yp_nu = Yp_start;
+ int k;
+
+ for(k=1; k<=kmax; k++) {
+ double nuox = nu*x_inv;
+ double Y_nu_save = Y_nu;
+ Y_nu = -Yp_nu + nuox * Y_nu;
+ Yp_nu = Y_nu_save - (nuox+x_inv) * Y_nu;
+ nu += 1.0;
+ }
+ *Y_end = Y_nu;
+ *Yp_end = Yp_nu;
+ return GSL_SUCCESS;
+}
+#endif
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int
+gsl_sf_bessel_Ynu_e(double nu, double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x <= 0.0 || nu < 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(nu > 50.0) {
+ return gsl_sf_bessel_Ynu_asymp_Olver_e(nu, x, result);
+ }
+ else {
+ /* -1/2 <= mu <= 1/2 */
+ int N = (int)(nu + 0.5);
+ double mu = nu - N;
+
+ gsl_sf_result Y_mu, Y_mup1;
+ int stat_mu;
+ double Ynm1;
+ double Yn;
+ double Ynp1;
+ int n;
+
+ if(x < 2.0) {
+ /* Determine Ymu, Ymup1 directly. This is really
+ * an optimization since this case could as well
+ * be handled by a call to gsl_sf_bessel_JY_mu_restricted(),
+ * as below.
+ */
+ stat_mu = gsl_sf_bessel_Y_temme(mu, x, &Y_mu, &Y_mup1);
+ }
+ else {
+ /* Determine Ymu, Ymup1 and Jmu, Jmup1.
+ */
+ gsl_sf_result J_mu, J_mup1;
+ stat_mu = gsl_sf_bessel_JY_mu_restricted(mu, x, &J_mu, &J_mup1, &Y_mu, &Y_mup1);
+ }
+
+ /* Forward recursion to get Ynu, Ynup1.
+ */
+ Ynm1 = Y_mu.val;
+ Yn = Y_mup1.val;
+ for(n=1; n<=N; n++) {
+ Ynp1 = 2.0*(mu+n)/x * Yn - Ynm1;
+ Ynm1 = Yn;
+ Yn = Ynp1;
+ }
+
+ result->val = Ynm1; /* Y_nu */
+ result->err = (N + 1.0) * fabs(Ynm1) * (fabs(Y_mu.err/Y_mu.val) + fabs(Y_mup1.err/Y_mup1.val));
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(Ynm1);
+
+ return stat_mu;
+ }
+}
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_bessel_Ynu(const double nu, const double x)
+{
+ EVAL_RESULT(gsl_sf_bessel_Ynu_e(nu, x, &result));
+}
diff --git a/gsl-1.9/specfunc/bessel_amp_phase.c b/gsl-1.9/specfunc/bessel_amp_phase.c
new file mode 100644
index 0000000..b1099b5
--- /dev/null
+++ b/gsl-1.9/specfunc/bessel_amp_phase.c
@@ -0,0 +1,188 @@
+/* specfunc/bessel_amp_phase.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_bessel.h>
+#include "bessel_amp_phase.h"
+
+/* chebyshev expansions for amplitude and phase
+ functions used in bessel evaluations
+
+ These are the same for J0,Y0 and for J1,Y1, so
+ they sit outside those functions.
+*/
+
+static double bm0_data[21] = {
+ 0.09284961637381644,
+ -0.00142987707403484,
+ 0.00002830579271257,
+ -0.00000143300611424,
+ 0.00000012028628046,
+ -0.00000001397113013,
+ 0.00000000204076188,
+ -0.00000000035399669,
+ 0.00000000007024759,
+ -0.00000000001554107,
+ 0.00000000000376226,
+ -0.00000000000098282,
+ 0.00000000000027408,
+ -0.00000000000008091,
+ 0.00000000000002511,
+ -0.00000000000000814,
+ 0.00000000000000275,
+ -0.00000000000000096,
+ 0.00000000000000034,
+ -0.00000000000000012,
+ 0.00000000000000004
+};
+const cheb_series _gsl_sf_bessel_amp_phase_bm0_cs = {
+ bm0_data,
+ 20,
+ -1, 1,
+ 10
+};
+
+static double bth0_data[24] = {
+ -0.24639163774300119,
+ 0.001737098307508963,
+ -0.000062183633402968,
+ 0.000004368050165742,
+ -0.000000456093019869,
+ 0.000000062197400101,
+ -0.000000010300442889,
+ 0.000000001979526776,
+ -0.000000000428198396,
+ 0.000000000102035840,
+ -0.000000000026363898,
+ 0.000000000007297935,
+ -0.000000000002144188,
+ 0.000000000000663693,
+ -0.000000000000215126,
+ 0.000000000000072659,
+ -0.000000000000025465,
+ 0.000000000000009229,
+ -0.000000000000003448,
+ 0.000000000000001325,
+ -0.000000000000000522,
+ 0.000000000000000210,
+ -0.000000000000000087,
+ 0.000000000000000036
+};
+const cheb_series _gsl_sf_bessel_amp_phase_bth0_cs = {
+ bth0_data,
+ 23,
+ -1, 1,
+ 12
+};
+
+
+static double bm1_data[21] = {
+ 0.1047362510931285,
+ 0.00442443893702345,
+ -0.00005661639504035,
+ 0.00000231349417339,
+ -0.00000017377182007,
+ 0.00000001893209930,
+ -0.00000000265416023,
+ 0.00000000044740209,
+ -0.00000000008691795,
+ 0.00000000001891492,
+ -0.00000000000451884,
+ 0.00000000000116765,
+ -0.00000000000032265,
+ 0.00000000000009450,
+ -0.00000000000002913,
+ 0.00000000000000939,
+ -0.00000000000000315,
+ 0.00000000000000109,
+ -0.00000000000000039,
+ 0.00000000000000014,
+ -0.00000000000000005,
+};
+const cheb_series _gsl_sf_bessel_amp_phase_bm1_cs = {
+ bm1_data,
+ 20,
+ -1, 1,
+ 10
+};
+
+static double bth1_data[24] = {
+ 0.74060141026313850,
+ -0.004571755659637690,
+ 0.000119818510964326,
+ -0.000006964561891648,
+ 0.000000655495621447,
+ -0.000000084066228945,
+ 0.000000013376886564,
+ -0.000000002499565654,
+ 0.000000000529495100,
+ -0.000000000124135944,
+ 0.000000000031656485,
+ -0.000000000008668640,
+ 0.000000000002523758,
+ -0.000000000000775085,
+ 0.000000000000249527,
+ -0.000000000000083773,
+ 0.000000000000029205,
+ -0.000000000000010534,
+ 0.000000000000003919,
+ -0.000000000000001500,
+ 0.000000000000000589,
+ -0.000000000000000237,
+ 0.000000000000000097,
+ -0.000000000000000040,
+};
+const cheb_series _gsl_sf_bessel_amp_phase_bth1_cs = {
+ bth1_data,
+ 23,
+ -1, 1,
+ 12
+};
+
+
+int
+gsl_sf_bessel_asymp_Mnu_e(const double nu, const double x, double * result)
+{
+ const double r = 2.0*nu/x;
+ const double r2 = r*r;
+ const double x2 = x*x;
+ const double term1 = (r2-1.0/x2)/8.0;
+ const double term2 = (r2-1.0/x2)*(r2-9.0/x2)*3.0/128.0;
+ const double Mnu2_c = 2.0/(M_PI) * (1.0 + term1 + term2);
+ *result = sqrt(Mnu2_c)/sqrt(x); /* will never underflow this way */
+ return GSL_SUCCESS;
+}
+
+
+int
+gsl_sf_bessel_asymp_thetanu_corr_e(const double nu, const double x, double * result)
+{
+ const double r = 2.0*nu/x;
+ const double r2 = r*r;
+ const double x2 = x*x;
+ const double term1 = x*(r2 - 1.0/x2)/8.0;
+ const double term2 = x*(r2 - 1.0/x2)*(r2 - 25.0/x2)/384.0;
+ *result = (-0.25*M_PI + term1 + term2);
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/specfunc/bessel_amp_phase.h b/gsl-1.9/specfunc/bessel_amp_phase.h
new file mode 100644
index 0000000..cf30ca4
--- /dev/null
+++ b/gsl-1.9/specfunc/bessel_amp_phase.h
@@ -0,0 +1,45 @@
+/* specfunc/bessel_amp_phase.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#ifndef _BESSEL_AMP_PHASE_H_
+#define _BESSEL_AMP_PHASE_H_
+
+
+#include "chebyshev.h"
+
+extern const cheb_series _gsl_sf_bessel_amp_phase_bm0_cs;
+extern const cheb_series _gsl_sf_bessel_amp_phase_bth0_cs;
+
+extern const cheb_series _gsl_sf_bessel_amp_phase_bm1_cs;
+extern const cheb_series _gsl_sf_bessel_amp_phase_bth1_cs;
+
+
+/* large argument expansions [Abramowitz+Stegun, 9.2.28-29]
+ *
+ * thetanu_corr = thetanu - x + 1/2 nu Pi
+ *
+ * assumes x > 0
+ */
+int gsl_sf_bessel_asymp_Mnu_e(const double nu, const double x, double * result);
+int gsl_sf_bessel_asymp_thetanu_corr_e(const double nu, const double x, double * result); /* w/o x term */
+
+
+#endif /* !_BESSEL_AMP_PHASE_H_ */
diff --git a/gsl-1.9/specfunc/bessel_i.c b/gsl-1.9/specfunc/bessel_i.c
new file mode 100644
index 0000000..2d39f2c
--- /dev/null
+++ b/gsl-1.9/specfunc/bessel_i.c
@@ -0,0 +1,329 @@
+/* specfunc/bessel_i.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_pow_int.h>
+#include <gsl/gsl_sf_bessel.h>
+
+#include "error.h"
+
+#include "bessel.h"
+
+
+/* i_{l+1}/i_l
+ */
+static
+int
+bessel_il_CF1(const int l, const double x, const double threshold, double * ratio)
+{
+ const int kmax = 2000;
+ double tk = 1.0;
+ double sum = 1.0;
+ double rhok = 0.0;
+ int k;
+
+ for(k=1; k<=kmax; k++) {
+ double ak = (x/(2.0*l+1.0+2.0*k)) * (x/(2.0*l+3.0+2.0*k));
+ rhok = -ak*(1.0 + rhok)/(1.0 + ak*(1.0 + rhok));
+ tk *= rhok;
+ sum += tk;
+ if(fabs(tk/sum) < threshold) break;
+ }
+
+ *ratio = x/(2.0*l+3.0) * sum;
+
+ if(k == kmax)
+ GSL_ERROR ("error", GSL_EMAXITER);
+ else
+ return GSL_SUCCESS;
+}
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int gsl_sf_bessel_i0_scaled_e(const double x, gsl_sf_result * result)
+{
+ double ax = fabs(x);
+
+ /* CHECK_POINTER(result) */
+
+ if(x == 0.0) {
+ result->val = 1.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(ax < 0.2) {
+ const double eax = exp(-ax);
+ const double y = ax*ax;
+ const double c1 = 1.0/6.0;
+ const double c2 = 1.0/120.0;
+ const double c3 = 1.0/5040.0;
+ const double c4 = 1.0/362880.0;
+ const double c5 = 1.0/39916800.0;
+ const double sum = 1.0 + y*(c1 + y*(c2 + y*(c3 + y*(c4 + y*c5))));
+ result->val = eax * sum;
+ result->err = 2.0 * GSL_DBL_EPSILON * result->val;
+ }
+ else if(ax < -0.5*GSL_LOG_DBL_EPSILON) {
+ result->val = (1.0 - exp(-2.0*ax))/(2.0*ax);
+ result->err = 2.0 * GSL_DBL_EPSILON * result->val;
+ }
+ else {
+ result->val = 1.0/(2.0*ax);
+ result->err = 2.0 * GSL_DBL_EPSILON * result->val;
+ }
+ return GSL_SUCCESS;
+}
+
+
+int gsl_sf_bessel_i1_scaled_e(const double x, gsl_sf_result * result)
+{
+ double ax = fabs(x);
+
+ /* CHECK_POINTER(result) */
+
+ if(x == 0.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(ax < 3.0*GSL_DBL_MIN) {
+ UNDERFLOW_ERROR(result);
+ }
+ else if(ax < 0.25) {
+ const double eax = exp(-ax);
+ const double y = x*x;
+ const double c1 = 1.0/10.0;
+ const double c2 = 1.0/280.0;
+ const double c3 = 1.0/15120.0;
+ const double c4 = 1.0/1330560.0;
+ const double c5 = 1.0/172972800.0;
+ const double sum = 1.0 + y*(c1 + y*(c2 + y*(c3 + y*(c4 + y*c5))));
+ result->val = eax * x/3.0 * sum;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ double ex = exp(-2.0*ax);
+ result->val = 0.5 * (ax*(1.0+ex) - (1.0-ex)) / (ax*ax);
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ if(x < 0.0) result->val = -result->val;
+ return GSL_SUCCESS;
+ }
+}
+
+
+int gsl_sf_bessel_i2_scaled_e(const double x, gsl_sf_result * result)
+{
+ double ax = fabs(x);
+
+ /* CHECK_POINTER(result) */
+
+ if(x == 0.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(ax < 4.0*GSL_SQRT_DBL_MIN) {
+ UNDERFLOW_ERROR(result);
+ }
+ else if(ax < 0.25) {
+ const double y = x*x;
+ const double c1 = 1.0/14.0;
+ const double c2 = 1.0/504.0;
+ const double c3 = 1.0/33264.0;
+ const double c4 = 1.0/3459456.0;
+ const double c5 = 1.0/518918400.0;
+ const double sum = 1.0 + y*(c1 + y*(c2 + y*(c3 + y*(c4 + y*c5))));
+ const double pre = exp(-ax) * x*x/15.0;
+ result->val = pre * sum;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ double ex = exp(-2.0*ax);
+ double x2 = x*x;
+ result->val = 0.5 * ((3.0+x2)*(1.0-ex) - 3.0*ax*(1.0+ex))/(ax*ax*ax);
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+}
+
+
+int gsl_sf_bessel_il_scaled_e(const int l, double x, gsl_sf_result * result)
+{
+ double sgn = 1.0;
+ double ax = fabs(x);
+
+ if(x < 0.0) {
+ /* i_l(-x) = (-1)^l i_l(x) */
+ sgn = ( GSL_IS_ODD(l) ? -1.0 : 1.0 );
+ x = -x;
+ }
+
+ if(l < 0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x == 0.0) {
+ result->val = ( l == 0 ? 1.0 : 0.0 );
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(l == 0) {
+ gsl_sf_result il;
+ int stat_il = gsl_sf_bessel_i0_scaled_e(x, &il);
+ result->val = sgn * il.val;
+ result->err = il.err;
+ return stat_il;
+ }
+ else if(l == 1) {
+ gsl_sf_result il;
+ int stat_il = gsl_sf_bessel_i1_scaled_e(x, &il);
+ result->val = sgn * il.val;
+ result->err = il.err;
+ return stat_il;
+ }
+ else if(l == 2) {
+ gsl_sf_result il;
+ int stat_il = gsl_sf_bessel_i2_scaled_e(x, &il);
+ result->val = sgn * il.val;
+ result->err = il.err;
+ return stat_il;
+ }
+ else if(x*x < 10.0*(l+1.5)/M_E) {
+ gsl_sf_result b;
+ int stat = gsl_sf_bessel_IJ_taylor_e(l+0.5, x, 1, 50, GSL_DBL_EPSILON, &b);
+ double pre = exp(-ax) * sqrt((0.5*M_PI)/x);
+ result->val = sgn * pre * b.val;
+ result->err = pre * b.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return stat;
+ }
+ else if(l < 150) {
+ gsl_sf_result i0_scaled;
+ int stat_i0 = gsl_sf_bessel_i0_scaled_e(ax, &i0_scaled);
+ double rat;
+ int stat_CF1 = bessel_il_CF1(l, ax, GSL_DBL_EPSILON, &rat);
+ double iellp1 = rat * GSL_SQRT_DBL_MIN;
+ double iell = GSL_SQRT_DBL_MIN;
+ double iellm1;
+ int ell;
+ for(ell = l; ell >= 1; ell--) {
+ iellm1 = iellp1 + (2*ell + 1)/x * iell;
+ iellp1 = iell;
+ iell = iellm1;
+ }
+ result->val = sgn * i0_scaled.val * (GSL_SQRT_DBL_MIN / iell);
+ result->err = i0_scaled.err * (GSL_SQRT_DBL_MIN / iell);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_ERROR_SELECT_2(stat_i0, stat_CF1);
+ }
+ else if(GSL_MIN(0.29/(l*l+1.0), 0.5/(l*l+1.0+x*x)) < 0.5*GSL_ROOT3_DBL_EPSILON) {
+ int status = gsl_sf_bessel_Inu_scaled_asymp_unif_e(l + 0.5, x, result);
+ double pre = sqrt((0.5*M_PI)/x);
+ result->val *= sgn * pre;
+ result->err *= pre;
+ return status;
+ }
+ else {
+ /* recurse down from safe values */
+ double rt_term = sqrt((0.5*M_PI)/x);
+ const int LMAX = 2 + (int) (1.2 / GSL_ROOT6_DBL_EPSILON);
+ gsl_sf_result r_iellp1;
+ gsl_sf_result r_iell;
+ int stat_a1 = gsl_sf_bessel_Inu_scaled_asymp_unif_e(LMAX + 1 + 0.5, x, &r_iellp1);
+ int stat_a2 = gsl_sf_bessel_Inu_scaled_asymp_unif_e(LMAX + 0.5, x, &r_iell);
+ double iellp1 = r_iellp1.val;
+ double iell = r_iell.val;
+ double iellm1 = 0.0;
+ int ell;
+ iellp1 *= rt_term;
+ iell *= rt_term;
+ for(ell = LMAX; ell >= l+1; ell--) {
+ iellm1 = iellp1 + (2*ell + 1)/x * iell;
+ iellp1 = iell;
+ iell = iellm1;
+ }
+ result->val = sgn * iellm1;
+ result->err = fabs(result->val)*(GSL_DBL_EPSILON + fabs(r_iellp1.err/r_iellp1.val) + fabs(r_iell.err/r_iell.val));
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+
+ return GSL_ERROR_SELECT_2(stat_a1, stat_a2);
+ }
+}
+
+
+int gsl_sf_bessel_il_scaled_array(const int lmax, const double x, double * result_array)
+{
+ if(x == 0.0) {
+ int ell;
+ result_array[0] = 1.0;
+ for (ell = lmax; ell >= 1; ell--) {
+ result_array[ell] = 0.0;
+ };
+ return GSL_SUCCESS;
+ } else {
+ int ell;
+ gsl_sf_result r_iellp1;
+ gsl_sf_result r_iell;
+ int stat_0 = gsl_sf_bessel_il_scaled_e(lmax+1, x, &r_iellp1);
+ int stat_1 = gsl_sf_bessel_il_scaled_e(lmax, x, &r_iell);
+ double iellp1 = r_iellp1.val;
+ double iell = r_iell.val;
+ double iellm1;
+ result_array[lmax] = iell;
+ for(ell = lmax; ell >= 1; ell--) {
+ iellm1 = iellp1 + (2*ell + 1)/x * iell;
+ iellp1 = iell;
+ iell = iellm1;
+ result_array[ell-1] = iellm1;
+ }
+ return GSL_ERROR_SELECT_2(stat_0, stat_1);
+ }
+}
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_bessel_i0_scaled(const double x)
+{
+ EVAL_RESULT(gsl_sf_bessel_i0_scaled_e(x, &result));
+}
+
+double gsl_sf_bessel_i1_scaled(const double x)
+{
+ EVAL_RESULT(gsl_sf_bessel_i1_scaled_e(x, &result));
+}
+
+double gsl_sf_bessel_i2_scaled(const double x)
+{
+ EVAL_RESULT(gsl_sf_bessel_i2_scaled_e(x, &result));
+}
+
+double gsl_sf_bessel_il_scaled(const int l, const double x)
+{
+ EVAL_RESULT(gsl_sf_bessel_il_scaled_e(l, x, &result));
+}
+
diff --git a/gsl-1.9/specfunc/bessel_j.c b/gsl-1.9/specfunc/bessel_j.c
new file mode 100644
index 0000000..4612020
--- /dev/null
+++ b/gsl-1.9/specfunc/bessel_j.c
@@ -0,0 +1,397 @@
+/* specfunc/bessel_j.c
+ *
+ * Copyright (C) 1996,1997,1998,1999,2000,2001,2002,2003 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_pow_int.h>
+#include <gsl/gsl_sf_trig.h>
+#include <gsl/gsl_sf_bessel.h>
+
+#include "error.h"
+
+#include "bessel.h"
+#include "bessel_olver.h"
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int gsl_sf_bessel_j0_e(const double x, gsl_sf_result * result)
+{
+ double ax = fabs(x);
+
+ /* CHECK_POINTER(result) */
+
+ if(ax < 0.5) {
+ const double y = x*x;
+ const double c1 = -1.0/6.0;
+ const double c2 = 1.0/120.0;
+ const double c3 = -1.0/5040.0;
+ const double c4 = 1.0/362880.0;
+ const double c5 = -1.0/39916800.0;
+ const double c6 = 1.0/6227020800.0;
+ result->val = 1.0 + y*(c1 + y*(c2 + y*(c3 + y*(c4 + y*(c5 + y*c6)))));
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ gsl_sf_result sin_result;
+ const int stat = gsl_sf_sin_e(x, &sin_result);
+ result->val = sin_result.val/x;
+ result->err = fabs(sin_result.err/x);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return stat;
+ }
+}
+
+
+int gsl_sf_bessel_j1_e(const double x, gsl_sf_result * result)
+{
+ double ax = fabs(x);
+
+ /* CHECK_POINTER(result) */
+
+ if(x == 0.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(ax < 3.1*GSL_DBL_MIN) {
+ UNDERFLOW_ERROR(result);
+ }
+ else if(ax < 0.25) {
+ const double y = x*x;
+ const double c1 = -1.0/10.0;
+ const double c2 = 1.0/280.0;
+ const double c3 = -1.0/15120.0;
+ const double c4 = 1.0/1330560.0;
+ const double c5 = -1.0/172972800.0;
+ const double sum = 1.0 + y*(c1 + y*(c2 + y*(c3 + y*(c4 + y*c5))));
+ result->val = x/3.0 * sum;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ gsl_sf_result cos_result;
+ gsl_sf_result sin_result;
+ const int stat_cos = gsl_sf_cos_e(x, &cos_result);
+ const int stat_sin = gsl_sf_sin_e(x, &sin_result);
+ const double cos_x = cos_result.val;
+ const double sin_x = sin_result.val;
+ result->val = (sin_x/x - cos_x)/x;
+ result->err = (fabs(sin_result.err/x) + fabs(cos_result.err))/fabs(x);
+ result->err += 2.0 * GSL_DBL_EPSILON * (fabs(sin_x/(x*x)) + fabs(cos_x/x));
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_ERROR_SELECT_2(stat_cos, stat_sin);
+ }
+}
+
+
+int gsl_sf_bessel_j2_e(const double x, gsl_sf_result * result)
+{
+ double ax = fabs(x);
+
+ /* CHECK_POINTER(result) */
+
+ if(x == 0.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(ax < 4.0*GSL_SQRT_DBL_MIN) {
+ UNDERFLOW_ERROR(result);
+ }
+ else if(ax < 1.3) {
+ const double y = x*x;
+ const double c1 = -1.0/14.0;
+ const double c2 = 1.0/504.0;
+ const double c3 = -1.0/33264.0;
+ const double c4 = 1.0/3459456.0;
+ const double c5 = -1.0/518918400;
+ const double c6 = 1.0/105859353600.0;
+ const double c7 = -1.0/28158588057600.0;
+ const double c8 = 1.0/9461285587353600.0;
+ const double c9 = -1.0/3916972233164390400.0;
+ const double sum = 1.0+y*(c1+y*(c2+y*(c3+y*(c4+y*(c5+y*(c6+y*(c7+y*(c8+y*c9))))))));
+ result->val = y/15.0 * sum;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ gsl_sf_result cos_result;
+ gsl_sf_result sin_result;
+ const int stat_cos = gsl_sf_cos_e(x, &cos_result);
+ const int stat_sin = gsl_sf_sin_e(x, &sin_result);
+ const double cos_x = cos_result.val;
+ const double sin_x = sin_result.val;
+ const double f = (3.0/(x*x) - 1.0);
+ result->val = (f * sin_x - 3.0*cos_x/x)/x;
+ result->err = fabs(f * sin_result.err/x) + fabs((3.0*cos_result.err/x)/x);
+ result->err += 2.0 * GSL_DBL_EPSILON * (fabs(f*sin_x/x) + 3.0*fabs(cos_x/(x*x)));
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_ERROR_SELECT_2(stat_cos, stat_sin);
+ }
+}
+
+
+int
+gsl_sf_bessel_jl_e(const int l, const double x, gsl_sf_result * result)
+{
+ if(l < 0 || x < 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x == 0.0) {
+ result->val = ( l > 0 ? 0.0 : 1.0 );
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(l == 0) {
+ return gsl_sf_bessel_j0_e(x, result);
+ }
+ else if(l == 1) {
+ return gsl_sf_bessel_j1_e(x, result);
+ }
+ else if(l == 2) {
+ return gsl_sf_bessel_j2_e(x, result);
+ }
+ else if(x*x < 10.0*(l+0.5)/M_E) {
+ gsl_sf_result b;
+ int status = gsl_sf_bessel_IJ_taylor_e(l+0.5, x, -1, 50, GSL_DBL_EPSILON, &b);
+ double pre = sqrt((0.5*M_PI)/x);
+ result->val = pre * b.val;
+ result->err = pre * b.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return status;
+ }
+ else if(GSL_ROOT4_DBL_EPSILON * x > (l*l + l + 1.0)) {
+ gsl_sf_result b;
+ int status = gsl_sf_bessel_Jnu_asympx_e(l + 0.5, x, &b);
+ double pre = sqrt((0.5*M_PI)/x);
+ result->val = pre * b.val;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val) + pre * b.err;
+ return status;
+ }
+ else if(l > 1.0/GSL_ROOT6_DBL_EPSILON) {
+ gsl_sf_result b;
+ int status = gsl_sf_bessel_Jnu_asymp_Olver_e(l + 0.5, x, &b);
+ double pre = sqrt((0.5*M_PI)/x);
+ result->val = pre * b.val;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val) + pre * b.err;
+ return status;
+ }
+ else if(x > 1000.0 && x > 100.0*l*l)
+ {
+ /* We need this to avoid feeding large x to CF1; note that
+ * due to the above check, we know that n <= 50.
+ */
+ gsl_sf_result b;
+ int status = gsl_sf_bessel_Jnu_asympx_e(l + 0.5, x, &b);
+ double pre = sqrt((0.5*M_PI)/x);
+ result->val = pre * b.val;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val) + pre * b.err;
+ return status;
+ }
+ else {
+ double sgn;
+ double ratio;
+ int stat_CF1 = gsl_sf_bessel_J_CF1(l+0.5, x, &ratio, &sgn);
+ double jellp1 = GSL_SQRT_DBL_EPSILON * ratio;
+ double jell = GSL_SQRT_DBL_EPSILON;
+ double jellm1;
+ int ell;
+ for(ell = l; ell > 0; ell--) {
+ jellm1 = -jellp1 + (2*ell + 1)/x * jell;
+ jellp1 = jell;
+ jell = jellm1;
+ }
+
+ if(fabs(jell) > fabs(jellp1)) {
+ gsl_sf_result j0_result;
+ int stat_j0 = gsl_sf_bessel_j0_e(x, &j0_result);
+ double pre = GSL_SQRT_DBL_EPSILON / jell;
+ result->val = j0_result.val * pre;
+ result->err = j0_result.err * fabs(pre);
+ result->err += 2.0 * GSL_DBL_EPSILON * (0.5*l + 1.0) * fabs(result->val);
+ return GSL_ERROR_SELECT_2(stat_j0, stat_CF1);
+ }
+ else {
+ gsl_sf_result j1_result;
+ int stat_j1 = gsl_sf_bessel_j1_e(x, &j1_result);
+ double pre = GSL_SQRT_DBL_EPSILON / jellp1;
+ result->val = j1_result.val * pre;
+ result->err = j1_result.err * fabs(pre);
+ result->err += 2.0 * GSL_DBL_EPSILON * (0.5*l + 1.0) * fabs(result->val);
+ return GSL_ERROR_SELECT_2(stat_j1, stat_CF1);
+ }
+ }
+}
+
+
+int
+gsl_sf_bessel_jl_array(const int lmax, const double x, double * result_array)
+{
+ /* CHECK_POINTER(result_array) */
+
+ if(lmax < 0 || x < 0.0) {
+ int j;
+ for(j=0; j<=lmax; j++) result_array[j] = 0.0;
+ GSL_ERROR ("error", GSL_EDOM);
+ }
+ else if(x == 0.0) {
+ int j;
+ for(j=1; j<=lmax; j++) result_array[j] = 0.0;
+ result_array[0] = 1.0;
+ return GSL_SUCCESS;
+ }
+ else {
+ gsl_sf_result r_jellp1;
+ gsl_sf_result r_jell;
+ int stat_0 = gsl_sf_bessel_jl_e(lmax+1, x, &r_jellp1);
+ int stat_1 = gsl_sf_bessel_jl_e(lmax, x, &r_jell);
+ double jellp1 = r_jellp1.val;
+ double jell = r_jell.val;
+ double jellm1;
+ int ell;
+
+ result_array[lmax] = jell;
+ for(ell = lmax; ell >= 1; ell--) {
+ jellm1 = -jellp1 + (2*ell + 1)/x * jell;
+ jellp1 = jell;
+ jell = jellm1;
+ result_array[ell-1] = jellm1;
+ }
+
+ return GSL_ERROR_SELECT_2(stat_0, stat_1);
+ }
+}
+
+
+int gsl_sf_bessel_jl_steed_array(const int lmax, const double x, double * jl_x)
+{
+ /* CHECK_POINTER(jl_x) */
+
+ if(lmax < 0 || x < 0.0) {
+ int j;
+ for(j=0; j<=lmax; j++) jl_x[j] = 0.0;
+ GSL_ERROR ("error", GSL_EDOM);
+ }
+ else if(x == 0.0) {
+ int j;
+ for(j=1; j<=lmax; j++) jl_x[j] = 0.0;
+ jl_x[0] = 1.0;
+ return GSL_SUCCESS;
+ }
+ else if(x < 2.0*GSL_ROOT4_DBL_EPSILON) {
+ /* first two terms of Taylor series */
+ double inv_fact = 1.0; /* 1/(1 3 5 ... (2l+1)) */
+ double x_l = 1.0; /* x^l */
+ int l;
+ for(l=0; l<=lmax; l++) {
+ jl_x[l] = x_l * inv_fact;
+ jl_x[l] *= 1.0 - 0.5*x*x/(2.0*l+3.0);
+ inv_fact /= 2.0*l+3.0;
+ x_l *= x;
+ }
+ return GSL_SUCCESS;
+ }
+ else {
+ /* Steed/Barnett algorithm [Comp. Phys. Comm. 21, 297 (1981)] */
+ double x_inv = 1.0/x;
+ double W = 2.0*x_inv;
+ double F = 1.0;
+ double FP = (lmax+1.0) * x_inv;
+ double B = 2.0*FP + x_inv;
+ double end = B + 20000.0*W;
+ double D = 1.0/B;
+ double del = -D;
+
+ FP += del;
+
+ /* continued fraction */
+ do {
+ B += W;
+ D = 1.0/(B-D);
+ del *= (B*D - 1.);
+ FP += del;
+ if(D < 0.0) F = -F;
+ if(B > end) {
+ GSL_ERROR ("error", GSL_EMAXITER);
+ }
+ }
+ while(fabs(del) >= fabs(FP) * GSL_DBL_EPSILON);
+
+ FP *= F;
+
+ if(lmax > 0) {
+ /* downward recursion */
+ double XP2 = FP;
+ double PL = lmax * x_inv;
+ int L = lmax;
+ int LP;
+ jl_x[lmax] = F;
+ for(LP = 1; LP<=lmax; LP++) {
+ jl_x[L-1] = PL * jl_x[L] + XP2;
+ FP = PL*jl_x[L-1] - jl_x[L];
+ XP2 = FP;
+ PL -= x_inv;
+ --L;
+ }
+ F = jl_x[0];
+ }
+
+ /* normalization */
+ W = x_inv / hypot(FP, F);
+ jl_x[0] = W*F;
+ if(lmax > 0) {
+ int L;
+ for(L=1; L<=lmax; L++) {
+ jl_x[L] *= W;
+ }
+ }
+
+ return GSL_SUCCESS;
+ }
+}
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_bessel_j0(const double x)
+{
+ EVAL_RESULT(gsl_sf_bessel_j0_e(x, &result));
+}
+
+double gsl_sf_bessel_j1(const double x)
+{
+ EVAL_RESULT(gsl_sf_bessel_j1_e(x, &result));
+}
+
+double gsl_sf_bessel_j2(const double x)
+{
+ EVAL_RESULT(gsl_sf_bessel_j2_e(x, &result));
+}
+
+double gsl_sf_bessel_jl(const int l, const double x)
+{
+ EVAL_RESULT(gsl_sf_bessel_jl_e(l, x, &result));
+}
+
diff --git a/gsl-1.9/specfunc/bessel_k.c b/gsl-1.9/specfunc/bessel_k.c
new file mode 100644
index 0000000..b9f1369
--- /dev/null
+++ b/gsl-1.9/specfunc/bessel_k.c
@@ -0,0 +1,248 @@
+/* specfunc/bessel_k.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_pow_int.h>
+#include <gsl/gsl_sf_gamma.h>
+#include <gsl/gsl_sf_bessel.h>
+
+#include "error.h"
+#include "check.h"
+
+#include "bessel.h"
+
+/*-*-*-*-*-*-*-*-*-*-*-* Private Section *-*-*-*-*-*-*-*-*-*-*-*/
+
+/* [Abramowitz+Stegun, 10.2.4 + 10.2.6]
+ * with lmax=15, precision ~ 15D for x < 3
+ *
+ * assumes l >= 1
+ */
+static int bessel_kl_scaled_small_x(int l, const double x, gsl_sf_result * result)
+{
+ gsl_sf_result num_fact;
+ double den = gsl_sf_pow_int(x, l+1);
+ int stat_df = gsl_sf_doublefact_e((unsigned int) (2*l-1), &num_fact);
+
+ if(stat_df != GSL_SUCCESS || den == 0.0) {
+ OVERFLOW_ERROR(result);
+ }
+ else {
+ const int lmax = 50;
+ gsl_sf_result ipos_term;
+ double ineg_term;
+ double sgn = (GSL_IS_ODD(l) ? -1.0 : 1.0);
+ double ex = exp(x);
+ double t = 0.5*x*x;
+ double sum = 1.0;
+ double t_coeff = 1.0;
+ double t_power = 1.0;
+ double delta;
+ int stat_il;
+ int i;
+
+ for(i=1; i<lmax; i++) {
+ t_coeff /= i*(2*(i-l) - 1);
+ t_power *= t;
+ delta = t_power*t_coeff;
+ sum += delta;
+ if(fabs(delta/sum) < GSL_DBL_EPSILON) break;
+ }
+
+ stat_il = gsl_sf_bessel_il_scaled_e(l, x, &ipos_term);
+ ineg_term = sgn * num_fact.val/den * sum;
+ result->val = -sgn * 0.5*M_PI * (ex*ipos_term.val - ineg_term);
+ result->val *= ex;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return stat_il;
+ }
+}
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int gsl_sf_bessel_k0_scaled_e(const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x <= 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else {
+ result->val = M_PI/(2.0*x);
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ CHECK_UNDERFLOW(result);
+ return GSL_SUCCESS;
+ }
+}
+
+
+int gsl_sf_bessel_k1_scaled_e(const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x <= 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x < (M_SQRTPI+1.0)/(M_SQRT2*GSL_SQRT_DBL_MAX)) {
+ OVERFLOW_ERROR(result);
+ }
+ else {
+ result->val = M_PI/(2.0*x) * (1.0 + 1.0/x);
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ CHECK_UNDERFLOW(result);
+ return GSL_SUCCESS;
+ }
+}
+
+
+int gsl_sf_bessel_k2_scaled_e(const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x <= 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x < 2.0/GSL_ROOT3_DBL_MAX) {
+ OVERFLOW_ERROR(result);
+ }
+ else {
+ result->val = M_PI/(2.0*x) * (1.0 + 3.0/x * (1.0 + 1.0/x));
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ CHECK_UNDERFLOW(result);
+ return GSL_SUCCESS;
+ }
+}
+
+
+int gsl_sf_bessel_kl_scaled_e(int l, const double x, gsl_sf_result * result)
+{
+ if(l < 0 || x <= 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(l == 0) {
+ return gsl_sf_bessel_k0_scaled_e(x, result);
+ }
+ else if(l == 1) {
+ return gsl_sf_bessel_k1_scaled_e(x, result);
+ }
+ else if(l == 2) {
+ return gsl_sf_bessel_k2_scaled_e(x, result);
+ }
+ else if(x < 3.0) {
+ return bessel_kl_scaled_small_x(l, x, result);
+ }
+ else if(GSL_ROOT3_DBL_EPSILON * x > (l*l + l + 1)) {
+ int status = gsl_sf_bessel_Knu_scaled_asympx_e(l + 0.5, x, result);
+ double pre = sqrt((0.5*M_PI)/x);
+ result->val *= pre;
+ result->err *= pre;
+ return status;
+ }
+ else if(GSL_MIN(0.29/(l*l+1.0), 0.5/(l*l+1.0+x*x)) < GSL_ROOT3_DBL_EPSILON) {
+ int status = gsl_sf_bessel_Knu_scaled_asymp_unif_e(l + 0.5, x, result);
+ double pre = sqrt((0.5*M_PI)/x);
+ result->val *= pre;
+ result->err *= pre;
+ return status;
+ }
+ else {
+ /* recurse upward */
+ gsl_sf_result r_bk;
+ gsl_sf_result r_bkm;
+ int stat_1 = gsl_sf_bessel_k1_scaled_e(x, &r_bk);
+ int stat_0 = gsl_sf_bessel_k0_scaled_e(x, &r_bkm);
+ double bkp;
+ double bk = r_bk.val;
+ double bkm = r_bkm.val;
+ int j;
+ for(j=1; j<l; j++) {
+ bkp = (2*j+1)/x*bk + bkm;
+ bkm = bk;
+ bk = bkp;
+ }
+ result->val = bk;
+ result->err = fabs(bk) * (fabs(r_bk.err/r_bk.val) + fabs(r_bkm.err/r_bkm.val));
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+
+ return GSL_ERROR_SELECT_2(stat_1, stat_0);
+ }
+}
+
+int
+gsl_sf_bessel_kl_scaled_array(const int lmax, const double x, double * result_array)
+{
+ if(lmax < 0 || x <= 0.0) {
+ GSL_ERROR("domain error", GSL_EDOM);
+ } else if (lmax == 0) {
+ gsl_sf_result result;
+ int stat = gsl_sf_bessel_k0_scaled_e(x, &result);
+ result_array[0] = result.val;
+ return stat;
+ } else {
+ int ell;
+ double kellp1, kell, kellm1;
+ gsl_sf_result r_kell;
+ gsl_sf_result r_kellm1;
+ gsl_sf_bessel_k1_scaled_e(x, &r_kell);
+ gsl_sf_bessel_k0_scaled_e(x, &r_kellm1);
+ kell = r_kell.val;
+ kellm1 = r_kellm1.val;
+ result_array[0] = kellm1;
+ result_array[1] = kell;
+ for(ell = 1; ell < lmax; ell++) {
+ kellp1 = (2*ell+1)/x * kell + kellm1;
+ result_array[ell+1] = kellp1;
+ kellm1 = kell;
+ kell = kellp1;
+ }
+ return GSL_SUCCESS;
+ }
+}
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_bessel_k0_scaled(const double x)
+{
+ EVAL_RESULT(gsl_sf_bessel_k0_scaled_e(x, &result));
+}
+
+double gsl_sf_bessel_k1_scaled(const double x)
+{
+ EVAL_RESULT(gsl_sf_bessel_k1_scaled_e(x, &result));
+}
+
+double gsl_sf_bessel_k2_scaled(const double x)
+{
+ EVAL_RESULT(gsl_sf_bessel_k2_scaled_e(x, &result));
+}
+
+double gsl_sf_bessel_kl_scaled(const int l, const double x)
+{
+ EVAL_RESULT(gsl_sf_bessel_kl_scaled_e(l, x, &result));
+}
+
+
diff --git a/gsl-1.9/specfunc/bessel_olver.c b/gsl-1.9/specfunc/bessel_olver.c
new file mode 100644
index 0000000..f7be551
--- /dev/null
+++ b/gsl-1.9/specfunc/bessel_olver.c
@@ -0,0 +1,982 @@
+/* specfunc/bessel_olver.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_airy.h>
+
+#include "error.h"
+
+#include "bessel.h"
+#include "bessel_olver.h"
+
+#include "chebyshev.h"
+#include "cheb_eval.c"
+
+/* fit for f(x) = zofmzeta((x+1)/2), 0 <= mzeta <= 1 */
+static double zofmzeta_a_data[20] = {
+ 2.9332563730829348990,
+ 0.4896518224847036624,
+ 0.0228637617355380860,
+ -0.0001715731377284693,
+ -0.0000105927538148751,
+ 1.0595602530419e-6,
+ -4.68016051691e-8,
+ 5.8310020e-12,
+ 1.766537581e-10,
+ -1.45034640e-11,
+ 4.357772e-13,
+ 4.60971e-14,
+ -2.57571e-14,
+ 2.26468e-14,
+ -2.22053e-14,
+ 2.08593e-14,
+ -1.84454e-14,
+ 1.50150e-14,
+ -1.06506e-14,
+ 5.5375e-15
+};
+static cheb_series zofmzeta_a_cs = {
+ zofmzeta_a_data,
+ 19,
+ -1,1,
+ 8
+};
+
+
+/* fit for f(x) = zofmzeta((9x+11)/2), 1 <= mzeta <= 10 */
+static double zofmzeta_b_data[30] = {
+ 22.40725276466303489,
+ 10.39808258825165581,
+ 1.092050144486018425,
+ -0.071111274777921604,
+ 0.008990125336059704,
+ -0.001201950338088875,
+ 0.000106686807968315,
+ 0.000017406491576830,
+ -0.000014946669657805,
+ 6.189984487752e-6,
+ -2.049466715178e-6,
+ 5.87189458020e-7,
+ -1.46077514157e-7,
+ 2.9803936132e-8,
+ -3.817692108e-9,
+ -4.66980416e-10,
+ 5.83860334e-10,
+ -2.78825299e-10,
+ 1.01682688e-10,
+ -3.1209928e-11,
+ 8.111122e-12,
+ -1.663986e-12,
+ 1.81364e-13,
+ 5.3414e-14,
+ -4.7234e-14,
+ 2.1689e-14,
+ -7.815e-15,
+ 2.371e-15,
+ -6.04e-16,
+ 1.20e-16
+};
+static cheb_series zofmzeta_b_cs = {
+ zofmzeta_b_data,
+ 29,
+ -1,1,
+ 15
+};
+
+
+/* fit for f(x) = zofmzeta(mz(x))/mz(x)^(3/2),
+ * mz(x) = (2/(x+1))^(2/3) 10
+ * 10 <= mzeta <= Inf
+ */
+static double zofmzeta_c_data[11] = {
+ 1.3824761227122911500,
+ 0.0244856101686774245,
+ -0.0000842866496282540,
+ 1.4656076569771e-6,
+ -3.14874099476e-8,
+ 7.561134833e-10,
+ -1.94531643e-11,
+ 5.245878e-13,
+ -1.46380e-14,
+ 4.192e-16,
+ -1.23e-17
+};
+static cheb_series zofmzeta_c_cs = {
+ zofmzeta_c_data,
+ 10,
+ -1,1,
+ 6
+};
+
+
+/* Invert [Abramowitz+Stegun, 9.3.39].
+ * Assumes minus_zeta >= 0.
+ */
+double
+gsl_sf_bessel_Olver_zofmzeta(double minus_zeta)
+{
+ if(minus_zeta < 1.0) {
+ const double x = 2.0*minus_zeta - 1.0;
+ gsl_sf_result c;
+ cheb_eval_e(&zofmzeta_a_cs, x, &c);
+ return c.val;
+ }
+ else if(minus_zeta < 10.0) {
+ const double x = (2.0*minus_zeta - 11.0)/9.0;
+ gsl_sf_result c;
+ cheb_eval_e(&zofmzeta_b_cs, x, &c);
+ return c.val;
+ }
+ else {
+ const double TEN_32 = 31.62277660168379332; /* 10^(3/2) */
+ const double p = pow(minus_zeta, 3.0/2.0);
+ const double x = 2.0*TEN_32/p - 1.0;
+ gsl_sf_result c;
+ cheb_eval_e(&zofmzeta_c_cs, x, &c);
+ return c.val * p;
+ }
+}
+
+
+/* Chebyshev fit for f(x) = z(x)^6 A_3(z(x)), z(x) = 22/(10(x+1)) */
+static double A3_gt1_data[31] = {
+ -0.123783199829515294670493131190,
+ 0.104636462534700704670877382304,
+ -0.067500816575851826744877535903,
+ 0.035563362418888483652711005520,
+ -0.0160738524035979408472979609051,
+ 0.0064497878252851092073278056238,
+ -0.00235408261133449663958121821593,
+ 0.00079545702851302155411892534965,
+ -0.00025214920745855079895784825637,
+ 0.00007574004596069392921153301833,
+ -0.00002172917966339623434407978263,
+ 5.9914810727868915476543145465e-06,
+ -1.5958781571808992162953719817e-06,
+ 4.1232986512903717525448312012e-07,
+ -1.0369725993417659101913919101e-07,
+ 2.5457982304266541145999235022e-08,
+ -6.1161715053791743082427422443e-09,
+ 1.4409346199138658887871461320e-09,
+ -3.3350445956255561668232014995e-10,
+ 7.5950686572918996453336138108e-11,
+ -1.7042296334409430377389900278e-11,
+ 3.7723525020626230919721640081e-12,
+ -8.2460237635733980528416501227e-13,
+ 1.7816961527997797696251868875e-13,
+ -3.8084101506541792942694560802e-14,
+ 8.0593669930916099079755351563e-15,
+ -1.6896565961641739017452636964e-15,
+ 3.5115651805888443184822853595e-16,
+ -7.2384771938569255638904297651e-17,
+ 1.4806598977677176106283840244e-17,
+ -3.0069285750787303634897997963e-18
+};
+static cheb_series A3_gt1_cs = {
+ A3_gt1_data,
+ 30,
+ -1,1,
+ 17
+};
+
+/* chebyshev expansion for f(x) = z(x)^8 A_4(z(x)), z(x) = 12/(5(x+1)) */
+static double A4_gt1_data[30] = {
+ 1.15309329391198493586724229008,
+ -1.01812701728669338904729927846,
+ 0.71964022270555684403652781941,
+ -0.42359963977172689685150061355,
+ 0.215024488759339557817435404261,
+ -0.096751915348145944032096342479,
+ 0.039413982058824310099856035361,
+ -0.014775225692561697963781115014,
+ 0.005162114514159370516947823271,
+ -0.00169783446445524322560925166335,
+ 0.00052995667873006847211519193478,
+ -0.00015802027574996477115667974856,
+ 0.000045254366680989687988902825193,
+ -0.000012503722965474638015488600967,
+ 3.3457656998119148699124716204e-06,
+ -8.6981575241150758412492331833e-07,
+ 2.2030895484325645640823940625e-07,
+ -5.4493369492600677068285936533e-08,
+ 1.3190457281724829107139385556e-08,
+ -3.1301560183377379158951191769e-09,
+ 7.2937802527123344842593076131e-10,
+ -1.6712080137945140407348940109e-10,
+ 3.7700053248213600430503521194e-11,
+ -8.3824538848817227637828899571e-12,
+ 1.8388741910049766865274037194e-12,
+ -3.9835919980753778560117573063e-13,
+ 8.5288827136546615604290389711e-14,
+ -1.8060227869114416998653266836e-14,
+ 3.7849342199690728470461022877e-15,
+ -7.8552867468122209577151823365e-16
+};
+static cheb_series A4_gt1_cs = {
+ A4_gt1_data,
+ 17, /* 29, */
+ -1, 1,
+ 17
+};
+
+/* Chebyshev fit for f(x) = z(x)^3 B_2(z(x)), z(x) = 12/(5(x+1)) */
+static double B2_gt1_data[40] = {
+ 0.00118587147272683864479328868589,
+ 0.00034820459990648274622193981840,
+ -0.00030411304425639768103075864567,
+ 0.00002812066284012343531484682886,
+ 0.00004493525295901613184489898748,
+ -0.00003037629997093072196779489677,
+ 0.00001125979647123875721949743970,
+ -2.4832533969517775991951008218e-06,
+ -9.9003813640537799587086928278e-08,
+ 4.9259859656183110299492296029e-07,
+ -3.7644120964426705960749504975e-07,
+ 2.2887828521334625189639122509e-07,
+ -1.3202687370822203731489855050e-07,
+ 7.7019669092537400811434860763e-08,
+ -4.6589706973010511603890144294e-08,
+ 2.9396476233013923711978522963e-08,
+ -1.9293230611988282919101954538e-08,
+ 1.3099107013728717842406906896e-08,
+ -9.1509111940885962831104149355e-09,
+ 6.5483472971925614347299375295e-09,
+ -4.7831253582139967461241674569e-09,
+ 3.5562625457426178152760148639e-09,
+ -2.6853389444008414186916562103e-09,
+ 2.0554738667134200145781857289e-09,
+ -1.5923172019517426277886522758e-09,
+ 1.2465923213464381457319481498e-09,
+ -9.8494846881180588507969988989e-10,
+ 7.8438674499372126663957464312e-10,
+ -6.2877567918342950225937136855e-10,
+ 5.0662318868755257959686944117e-10,
+ -4.0962270881243451160378710952e-10,
+ 3.3168684677374908553161911299e-10,
+ -2.6829406619847450633596163305e-10,
+ 2.1603988122184568375561077873e-10,
+ -1.7232373309560278402012124481e-10,
+ 1.3512709089611470626617830434e-10,
+ -1.0285354732538663013167579792e-10,
+ 7.4211345443901713467637018423e-11,
+ -4.8124980266864320351456993068e-11,
+ 2.3666534694476306077416831958e-11
+};
+static cheb_series B2_gt1_cs = {
+ B2_gt1_data,
+ 39,
+ -1, 1,
+ 30
+};
+
+
+/* Chebyshev fit for f(x) = z(x)^6 B_3(z(x)), z(x) = 12/(5(x+1)) */
+static double B3_gt1_data[30] = {
+ -0.0102445379362695740863663926486,
+ 0.0036618484329295342954730801917,
+ 0.0026154252498599303282569321117,
+ -0.0036187389410353156728771706336,
+ 0.0021878564157692275944613452462,
+ -0.0008219952303590803584426516821,
+ 0.0001281773889155631494321316520,
+ 0.0001000944653368032985720548637,
+ -0.0001288293344663774273453147788,
+ 0.00010136264202696513867821487205,
+ -0.00007000275849659556221916572733,
+ 0.00004694886396757430431607955146,
+ -0.00003190003869717837686356945696,
+ 0.00002231453668447775219665947479,
+ -0.00001611102197712439539300336438,
+ 0.00001196634424990735214466633513,
+ -9.0986920398931223804111374679e-06,
+ 7.0492613694235423068926562567e-06,
+ -5.5425216624642184684300615394e-06,
+ 4.4071884714230296614449244106e-06,
+ -3.5328595506791663127928952625e-06,
+ 2.84594975572077091520522824686e-06,
+ -2.29592697828824392391071619788e-06,
+ 1.84714740375289956396370322228e-06,
+ -1.47383331248116454652025598620e-06,
+ 1.15687781098593231076084710267e-06,
+ -8.8174688524627071175315084910e-07,
+ 6.3705856964426840441434605593e-07,
+ -4.1358791499961929237755474814e-07,
+ 2.0354151158738819867477996807e-07
+};
+static cheb_series B3_gt1_cs = {
+ B3_gt1_data,
+ 29,
+ -1, 1,
+ 29
+};
+
+
+/* Chebyshev fit for f(x) = z(x) B_2(z(x)), z(x) = 2(x+1)/5 */
+static double B2_lt1_data[40] = {
+ 0.00073681565841337130021924199490,
+ 0.00033803599647571227535304316937,
+ -0.00008251723219239754024210552679,
+ -0.00003390879948656432545900779710,
+ 0.00001961398056848881816694014889,
+ -2.35593745904151401624656805567e-06,
+ -1.79055017080406086541563835433e-06,
+ 1.33129571185610681090725934031e-06,
+ -5.38879444715436544130673956170e-07,
+ 1.49603056041381416881299945557e-07,
+ -1.83377228267274327911131293091e-08,
+ -1.33191430762944336526965187651e-08,
+ 1.60642096463700438411396889489e-08,
+ -1.28932576330421806740136816643e-08,
+ 9.6169275086179165484403221944e-09,
+ -7.1818502280703532276832887290e-09,
+ 5.4744009217215145730697754561e-09,
+ -4.2680446690508456935030086136e-09,
+ 3.3941665009266174865683284781e-09,
+ -2.7440714072221673882163135170e-09,
+ 2.2488361522108255229193038962e-09,
+ -1.8638240716608748862087923337e-09,
+ 1.5592350940805373500866440401e-09,
+ -1.3145743937732330609242633070e-09,
+ 1.1153716777215047842790244968e-09,
+ -9.5117576805266622854647303110e-10,
+ 8.1428799553234876296804561100e-10,
+ -6.9893770813548773664326279169e-10,
+ 6.0073113636087448745018831981e-10,
+ -5.1627434258513453901420776514e-10,
+ 4.4290993195074905891788459756e-10,
+ -3.7852978599966867611179315200e-10,
+ 3.2143959338863177145307610452e-10,
+ -2.7025926680620777594992221143e-10,
+ 2.2384857772457918539228234321e-10,
+ -1.8125071664276678046551271701e-10,
+ 1.4164870008713668767293008546e-10,
+ -1.0433101857132782485813325981e-10,
+ 6.8663910168392483929411418190e-11,
+ -3.4068313177952244040559740439e-11
+};
+static cheb_series B2_lt1_cs = {
+ B2_lt1_data,
+ 39,
+ -1, 1,
+ 39
+};
+
+
+/* Chebyshev fit for f(x) = B_3(2(x+1)/5) */
+static double B3_lt1_data[40] = {
+ -0.00137160820526992057354001614451,
+ -0.00025474937951101049982680561302,
+ 0.00024762975547895881652073467771,
+ 0.00005229657281480196749313930265,
+ -0.00007488354272621512385016593760,
+ 0.00001416880012891046449980449746,
+ 0.00001528986060172183690742576230,
+ -0.00001668672297078590514293325326,
+ 0.00001061765189536459018739585094,
+ -5.8220577442406209989680801335e-06,
+ 3.3322423743855900506302033234e-06,
+ -2.23292405803003860894449897815e-06,
+ 1.74816651036678291794777245325e-06,
+ -1.49581306041395051804547535093e-06,
+ 1.32759146107893129050610165582e-06,
+ -1.19376077392564467408373553343e-06,
+ 1.07878303863211630544654040875e-06,
+ -9.7743335011819134006676476250e-07,
+ 8.8729318903693324226127054792e-07,
+ -8.0671146292125665050876015280e-07,
+ 7.3432860378667354971042255937e-07,
+ -6.6897926072697370325310483359e-07,
+ 6.0966619703735610352576581485e-07,
+ -5.5554095284507959561958605420e-07,
+ 5.0588335673197236002812826526e-07,
+ -4.6008146297767601862670079590e-07,
+ 4.1761348515688145911438168306e-07,
+ -3.7803230006989446874174476515e-07,
+ 3.4095248501364300041684648230e-07,
+ -3.0603959751354749520615015472e-07,
+ 2.7300134179365690589640458993e-07,
+ -2.4158028250762304756044254231e-07,
+ 2.1154781038298751985689113868e-07,
+ -1.8269911328756771201465223313e-07,
+ 1.5484895085808513749026173074e-07,
+ -1.2782806851555809369226440495e-07,
+ 1.0148011725394892565174207341e-07,
+ -7.5658969771439627809239950461e-08,
+ 5.0226342286491286957075289622e-08,
+ -2.5049645660259882970547555831e-08
+};
+static cheb_series B3_lt1_cs = {
+ B3_lt1_data,
+ 39,
+ -1, 1,
+ 39
+};
+
+
+/* Chebyshev fit for f(x) = A_3(9(x+1)/20) */
+static double A3_lt1_data[40] = {
+ -0.00017982561472134418587634980117,
+ -0.00036558603837525275836608884064,
+ -0.00002819398055929628850294406363,
+ 0.00016704539863875736769812786067,
+ -0.00007098969970347674307623044850,
+ -8.4470843942344237748899879940e-06,
+ 0.0000273413090343147765148014327150,
+ -0.0000199073838489821681991178018081,
+ 0.0000100004176278235088881096950105,
+ -3.9739852013143676487867902026e-06,
+ 1.2265357766449574306882693267e-06,
+ -1.88755584306424047416914864854e-07,
+ -1.37482206060161206336523452036e-07,
+ 2.10326379301853336795686477738e-07,
+ -2.05583778245412633433934301948e-07,
+ 1.82377384812654863038691147988e-07,
+ -1.58130247846381041027699152436e-07,
+ 1.36966982725588978654041029615e-07,
+ -1.19250280944620257443805710485e-07,
+ 1.04477169029350256435316644493e-07,
+ -9.2064832489437534542041040184e-08,
+ 8.1523798290458784610230199344e-08,
+ -7.2471794980050867512294061891e-08,
+ 6.4614432955971132569968860233e-08,
+ -5.7724095125560946811081322985e-08,
+ 5.1623107567436835158110947901e-08,
+ -4.6171250746798606260216486042e-08,
+ 4.1256621998650164023254101585e-08,
+ -3.6788925543159819135102047082e-08,
+ 3.2694499457951844422299750661e-08,
+ -2.89125899697964696586521743928e-08,
+ 2.53925288725374047626589488217e-08,
+ -2.20915707933726481321465184207e-08,
+ 1.89732166352720474944407102940e-08,
+ -1.60058977893259856012119939554e-08,
+ 1.31619294542205876946742394494e-08,
+ -1.04166651771938038563454275883e-08,
+ 7.7478015858156185064152078434e-09,
+ -5.1347942579352613057675111787e-09,
+ 2.5583541594586723967261504321e-09
+};
+static cheb_series A3_lt1_cs = {
+ A3_lt1_data,
+ 39,
+ -1, 1,
+ 39
+};
+
+/* chebyshev fit for f(x) = A_4(2(x+1)/5) */
+static double A4_lt1_data[30] = {
+ 0.00009054703770051610946958226736,
+ 0.00033066000498098017589672988293,
+ 0.00019737453734363989127226073272,
+ -0.00015490809725932037720034762889,
+ -0.00004514948935538730085479280454,
+ 0.00007976881782603940889444573924,
+ -0.00003314566154544740986264993251,
+ -1.88212148790135672249935711657e-06,
+ 0.0000114788756505519986352882940648,
+ -9.2263039911196207101468331210e-06,
+ 5.1401128250377780476084336340e-06,
+ -2.38418218951722002658891397905e-06,
+ 1.00664292214481531598338960828e-06,
+ -4.23224678096490060264249970540e-07,
+ 2.00132031535793489976535190025e-07,
+ -1.18689501178886741400633921047e-07,
+ 8.7819524319114212999768013738e-08,
+ -7.3964150324206644900787216386e-08,
+ 6.5780431507637165113885884236e-08,
+ -5.9651053193022652369837650411e-08,
+ 5.4447762662767276209052293773e-08,
+ -4.9802057381568863702541294988e-08,
+ 4.5571368194694340198117635845e-08,
+ -4.1682117173547642845382848197e-08,
+ 3.8084701352766049815367147717e-08,
+ -3.4740302885185237434662649907e-08,
+ 3.1616557064701510611273692060e-08,
+ -2.8685739487689556252374879267e-08,
+ 2.5923752117132254429002796600e-08,
+ -2.3309428552190587304662883477e-08
+};
+static cheb_series A4_lt1_cs = {
+ A4_lt1_data,
+ 29,
+ -1, 1,
+ 29
+};
+
+
+static double olver_B0(double z, double abs_zeta)
+{
+ if(z < 0.98) {
+ const double t = 1.0/sqrt(1.0-z*z);
+ return -5.0/(48.0*abs_zeta*abs_zeta) + t*(-3.0 + 5.0*t*t)/(24.0*sqrt(abs_zeta));
+ }
+ else if(z < 1.02) {
+ const double a = 1.0-z;
+ const double c0 = 0.0179988721413553309252458658183;
+ const double c1 = 0.0111992982212877614645974276203;
+ const double c2 = 0.0059404069786014304317781160605;
+ const double c3 = 0.0028676724516390040844556450173;
+ const double c4 = 0.0012339189052567271708525111185;
+ const double c5 = 0.0004169250674535178764734660248;
+ const double c6 = 0.0000330173385085949806952777365;
+ const double c7 = -0.0001318076238578203009990106425;
+ const double c8 = -0.0001906870370050847239813945647;
+ return c0 + a*(c1 + a*(c2 + a*(c3 + a*(c4 + a*(c5 + a*(c6 + a*(c7 + a*c8)))))));
+ }
+ else {
+ const double t = 1.0/(z*sqrt(1.0 - 1.0/(z*z)));
+ return -5.0/(48.0*abs_zeta*abs_zeta) + t*(3.0 + 5.0*t*t)/(24.0*sqrt(abs_zeta));
+ }
+}
+
+
+static double olver_B1(double z, double abs_zeta)
+{
+ if(z < 0.88) {
+ const double t = 1.0/sqrt(1.0-z*z);
+ const double t2 = t*t;
+ const double rz = sqrt(abs_zeta);
+ const double z32 = rz*rz*rz;
+ const double z92 = z32*z32*z32;
+ const double term1 = t*t*t * (30375.0 - 369603.0*t2 + 765765.0*t2*t2 - 425425.0*t2*t2*t2)/414720.0;
+ const double term2 = 85085.0/(663552.0*z92);
+ const double term3 = 385.0/110592.*t*(3.0-5.0*t2)/(abs_zeta*abs_zeta*abs_zeta);
+ const double term4 = 5.0/55296.0*t2*(81.0 - 462.0*t2 + 385.0*t2*t2)/z32;
+ return -(term1 + term2 + term3 + term4)/rz;
+ }
+ else if(z < 1.12) {
+ const double a = 1.0-z;
+ const double c0 = -0.00149282953213429172050073403334;
+ const double c1 = -0.00175640941909277865678308358128;
+ const double c2 = -0.00113346148874174912576929663517;
+ const double c3 = -0.00034691090981382974689396961817;
+ const double c4 = 0.00022752516104839243675693256916;
+ const double c5 = 0.00051764145724244846447294636552;
+ const double c6 = 0.00058906174858194233998714243010;
+ const double c7 = 0.00053485514521888073087240392846;
+ const double c8 = 0.00042891792986220150647633418796;
+ const double c9 = 0.00031639765900613633260381972850;
+ const double c10 = 0.00021908147678699592975840749194;
+ return c0+a*(c1+a*(c2+a*(c3+a*(c4+a*(c5+a*(c6+a*(c7+a*(c8+a*(c9+a*c10)))))))));
+ }
+ else {
+ const double t = 1.0/(z*sqrt(1.0 - 1.0/(z*z)));
+ const double t2 = t*t;
+ const double rz = sqrt(abs_zeta);
+ const double z32 = rz*rz*rz;
+ const double z92 = z32*z32*z32;
+ const double term1 = -t2*t * (30375.0 + 369603.0*t2 + 765765.0*t2*t2 + 425425.0*t2*t2*t2)/414720.0;
+ const double term2 = 85085.0/(663552.0*z92);
+ const double term3 = -385.0/110592.0*t*(3.0+5.0*t2)/(abs_zeta*abs_zeta*abs_zeta);
+ const double term4 = 5.0/55296.0*t2*(81.0 + 462.0*t2 + 385.0*t2*t2)/z32;
+ return (term1 + term2 + term3 + term4)/rz;
+ }
+}
+
+
+static double olver_B2(double z, double abs_zeta)
+{
+ if(z < 0.8) {
+ const double x = 5.0*z/2.0 - 1.0;
+ gsl_sf_result c;
+ cheb_eval_e(&B2_lt1_cs, x, &c);
+ return c.val / z;
+ }
+ else if(z <= 1.2) {
+ const double a = 1.0-z;
+ const double c0 = 0.00055221307672129279005986982501;
+ const double c1 = 0.00089586516310476929281129228969;
+ const double c2 = 0.00067015003441569770883539158863;
+ const double c3 = 0.00010166263361949045682945811828;
+ const double c4 = -0.00044086345133806887291336488582;
+ const double c5 = -0.00073963081508788743392883072523;
+ const double c6 = -0.00076745494377839561259903887331;
+ const double c7 = -0.00060829038106040362291568012663;
+ const double c8 = -0.00037128707528893496121336168683;
+ const double c9 = -0.00014116325105702609866850307176;
+ return c0+a*(c1+a*(c2+a*(c3+a*(c4+a*(c5+a*(c6+a*(c7+a*(c8+a*c9))))))));
+ }
+ else {
+ const double zi = 1.0/z;
+ const double x = 12.0/5.0 * zi - 1.0;
+ gsl_sf_result c;
+ cheb_eval_e(&B2_gt1_cs, x, &c);
+ return c.val * zi*zi*zi;
+ }
+}
+
+
+static double olver_B3(double z, double abs_zeta)
+{
+ if(z < 0.8) {
+ const double x = 5.0*z/2.0 - 1.0;
+ gsl_sf_result c;
+ cheb_eval_e(&B3_lt1_cs, x, &c);
+ return c.val;
+ }
+ else if(z < 1.2) {
+ const double a = 1.0-z;
+ const double c0 = -0.00047461779655995980754441833105;
+ const double c1 = -0.00095572913429464297452176811898;
+ const double c2 = -0.00080369634512082892655558133973;
+ const double c3 = -0.00000727921669154784138080600339;
+ const double c4 = 0.00093162500331581345235746518994;
+ const double c5 = 0.00149848796913751497227188612403;
+ const double c6 = 0.00148406039675949727870390426462;
+ return c0 + a*(c1 + a*(c2 + a*(c3 + a*(c4 + a*(c5 + a*c6)))));
+ }
+ else {
+ const double x = 12.0/(5.0*z) - 1.0;
+ const double zi2 = 1.0/(z*z);
+ gsl_sf_result c;
+ cheb_eval_e(&B3_gt1_cs, x, &c);
+ return c.val * zi2*zi2*zi2;
+ }
+}
+
+
+static double olver_A1(double z, double abs_zeta, double * err)
+{
+ if(z < 0.98) {
+ double t = 1.0/sqrt(1.0-z*z);
+ double rz = sqrt(abs_zeta);
+ double t2 = t*t;
+ double term1 = t2*(81.0 - 462.0*t2 + 385.0*t2*t2)/1152.0;
+ double term2 = -455.0/(4608.0*abs_zeta*abs_zeta*abs_zeta);
+ double term3 = 7.0*t*(-3.0 + 5.0*t2)/(1152.0*rz*rz*rz);
+ *err = 2.0 * GSL_DBL_EPSILON * (fabs(term1) + fabs(term2) + fabs(term3));
+ return term1 + term2 + term3;
+ }
+ else if(z < 1.02) {
+ const double a = 1.0-z;
+ const double c0 = -0.00444444444444444444444444444444;
+ const double c1 = -0.00184415584415584415584415584416;
+ const double c2 = 0.00056812076812076812076812076812;
+ const double c3 = 0.00168137865661675185484709294233;
+ const double c4 = 0.00186744042139000122193399504324;
+ const double c5 = 0.00161330105833747826430066790326;
+ const double c6 = 0.00123177312220625816558607537838;
+ const double c7 = 0.00087334711007377573881689318421;
+ const double c8 = 0.00059004942455353250141217015410;
+ const double sum = c0+a*(c1+a*(c2+a*(c3+a*(c4+a*(c5+a*(c6+a*(c7+a*c8)))))));
+ *err = 2.0 * GSL_DBL_EPSILON * fabs(sum);
+ return sum;
+ }
+ else {
+ const double t = 1.0/(z*sqrt(1.0 - 1.0/(z*z)));
+ const double rz = sqrt(abs_zeta);
+ const double t2 = t*t;
+ const double term1 = -t2*(81.0 + 462.0*t2 + 385.0*t2*t2)/1152.0;
+ const double term2 = 455.0/(4608.0*abs_zeta*abs_zeta*abs_zeta);
+ const double term3 = -7.0*t*(3.0 + 5.0*t2)/(1152.0*rz*rz*rz);
+ *err = 2.0 * GSL_DBL_EPSILON * (fabs(term1) + fabs(term2) + fabs(term3));
+ return term1 + term2 + term3;
+ }
+}
+
+
+static double olver_A2(double z, double abs_zeta)
+{
+ if(z < 0.88) {
+ double t = 1.0/sqrt(1.0-z*z);
+ double t2 = t*t;
+ double t4 = t2*t2;
+ double t6 = t4*t2;
+ double t8 = t4*t4;
+ double rz = sqrt(abs_zeta);
+ double z3 = abs_zeta*abs_zeta*abs_zeta;
+ double z32 = rz*rz*rz;
+ double z92 = z3*z32;
+ double term1 = t4*(4465125.0 - 94121676.0*t2 + 349922430.0*t4 - 446185740.0*t6 + 185910725.0*t8)/39813120.0;
+ double term2 = -40415375.0/(127401984.0*z3*z3);
+ double term3 = -95095.0/15925248.0*t*(3.0-5.0*t2)/z92;
+ double term4 = -455.0/5308416.0 *t2*(81.0 - 462.0*t2 + 385.0*t4)/z3;
+ double term5 = -7.0/19906560.0*t*t2*(30375.0 - 369603.0*t2 + 765765.0*t4 - 425425.0*t6)/z32;
+ return term1 + term2 + term3 + term4 + term5;
+ }
+ else if(z < 1.12) {
+ double a = 1.0-z;
+ const double c0 = 0.000693735541354588973636592684210;
+ const double c1 = 0.000464483490365843307019777608010;
+ const double c2 = -0.000289036254605598132482570468291;
+ const double c3 = -0.000874764943953712638574497548110;
+ const double c4 = -0.001029716376139865629968584679350;
+ const double c5 = -0.000836857329713810600584714031650;
+ const double c6 = -0.000488910893527218954998270124540;
+ const double c7 = -0.000144236747940817220502256810151;
+ const double c8 = 0.000114363800986163478038576460325;
+ const double c9 = 0.000266806881492777536223944807117;
+ const double c10 = -0.011975517576151069627471048587000;
+ return c0+a*(c1+a*(c2+a*(c3+a*(c4+a*(c5+a*(c6+a*(c7+a*(c8+a*(c9+a*c10)))))))));
+ }
+ else {
+ const double t = 1.0/(z*sqrt(1.0 - 1.0/(z*z)));
+ const double t2 = t*t;
+ const double t4 = t2*t2;
+ const double t6 = t4*t2;
+ const double t8 = t4*t4;
+ const double rz = sqrt(abs_zeta);
+ const double z3 = abs_zeta*abs_zeta*abs_zeta;
+ const double z32 = rz*rz*rz;
+ const double z92 = z3*z32;
+ const double term1 = t4*(4465125.0 + 94121676.0*t2 + 349922430.0*t4 + 446185740.0*t6 + 185910725.0*t8)/39813120.0;
+ const double term2 = -40415375.0/(127401984.0*z3*z3);
+ const double term3 = 95095.0/15925248.0*t*(3.0+5.0*t2)/z92;
+ const double term4 = -455.0/5308416.0 *t2*(81.0 + 462.0*t2 + 385.0*t4)/z3;
+ const double term5 = 7.0/19906560.0*t*t2*(30375.0 + 369603.0*t2 + 765765.0*t4 + 425425.0*t6)/z32;
+ return term1 + term2 + term3 + term4 + term5;
+ }
+}
+
+
+static double olver_A3(double z, double abs_zeta)
+{
+ if(z < 0.9) {
+ const double x = 20.0*z/9.0 - 1.0;
+ gsl_sf_result c;
+ cheb_eval_e(&A3_lt1_cs, x, &c);
+ return c.val;
+ }
+ else if(z < 1.1) {
+ double a = 1.0-z;
+ const double c0 = -0.000354211971457743840771125759200;
+ const double c1 = -0.000312322527890318832782774881353;
+ const double c2 = 0.000277947465383133980329617631915;
+ const double c3 = 0.000919803044747966977054155192400;
+ const double c4 = 0.001147600388275977640983696906320;
+ const double c5 = 0.000869239326123625742931772044544;
+ const double c6 = 0.000287392257282507334785281718027;
+ return c0 + a*(c1 + a*(c2 + a*(c3 + a*(c4 + a*(c5 + a*c6)))));
+ }
+ else {
+ const double x = 11.0/(5.0*z) - 1.0;
+ const double zi2 = 1.0/(z*z);
+ gsl_sf_result c;
+ cheb_eval_e(&A3_gt1_cs, x, &c);
+ return c.val * zi2*zi2*zi2;
+ }
+}
+
+
+static double olver_A4(double z, double abs_zeta)
+{
+ if(z < 0.8) {
+ const double x = 5.0*z/2.0 - 1.0;
+ gsl_sf_result c;
+ cheb_eval_e(&A4_lt1_cs, x, &c);
+ return c.val;
+ }
+ else if(z < 1.2) {
+ double a = 1.0-z;
+ const double c0 = 0.00037819419920177291402661228437;
+ const double c1 = 0.00040494390552363233477213857527;
+ const double c2 = -0.00045764735528936113047289344569;
+ const double c3 = -0.00165361044229650225813161341879;
+ const double c4 = -0.00217527517983360049717137015539;
+ const double c5 = -0.00152003287866490735107772795537;
+ return c0 + a*(c1 + a*(c2 + a*(c3 + a*(c4 + a*c5))));
+ }
+ else {
+ const double x = 12.0/(5.0*z) - 1.0;
+ const double zi2 = 1.0/(z*z);
+ gsl_sf_result c;
+ cheb_eval_e(&A4_gt1_cs, x, &c);
+ return c.val * zi2*zi2*zi2*zi2;
+ }
+}
+
+inline
+static double olver_Asum(double nu, double z, double abs_zeta, double * err)
+{
+ double nu2 = nu*nu;
+ double A1_err;
+ double A1 = olver_A1(z, abs_zeta, &A1_err);
+ double A2 = olver_A2(z, abs_zeta);
+ double A3 = olver_A3(z, abs_zeta);
+ double A4 = olver_A4(z, abs_zeta);
+ *err = A1_err/nu2 + GSL_DBL_EPSILON;
+ return 1.0 + A1/nu2 + A2/(nu2*nu2) + A3/(nu2*nu2*nu2) + A4/(nu2*nu2*nu2*nu2);
+}
+
+inline
+static double olver_Bsum(double nu, double z, double abs_zeta)
+{
+ double nu2 = nu*nu;
+ double B0 = olver_B0(z, abs_zeta);
+ double B1 = olver_B1(z, abs_zeta);
+ double B2 = olver_B2(z, abs_zeta);
+ double B3 = olver_B3(z, abs_zeta);
+ return B0 + B1/nu2 + B2/(nu2*nu2) + B3/(nu2*nu2*nu2*nu2);
+}
+
+
+/* uniform asymptotic, nu -> Inf, [Abramowitz+Stegun, 9.3.35]
+ *
+ * error:
+ * nu = 2: uniformly good to > 6D
+ * nu = 5: uniformly good to > 8D
+ * nu = 10: uniformly good to > 10D
+ * nu = 20: uniformly good to > 13D
+ *
+ */
+int gsl_sf_bessel_Jnu_asymp_Olver_e(double nu, double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x <= 0.0 || nu <= 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else {
+ double zeta, abs_zeta;
+ double arg;
+ double pre;
+ double asum, bsum, asum_err;
+ gsl_sf_result ai;
+ gsl_sf_result aip;
+ double z = x/nu;
+ double crnu = pow(nu, 1.0/3.0);
+ double nu3 = nu*nu*nu;
+ double nu11 = nu3*nu3*nu3*nu*nu;
+ int stat_a, stat_ap;
+
+ if(fabs(1.0-z) < 0.02) {
+ const double a = 1.0-z;
+ const double c0 = 1.25992104989487316476721060728;
+ const double c1 = 0.37797631496846194943016318218;
+ const double c2 = 0.230385563409348235843147082474;
+ const double c3 = 0.165909603649648694839821892031;
+ const double c4 = 0.12931387086451008907;
+ const double c5 = 0.10568046188858133991;
+ const double c6 = 0.08916997952268186978;
+ const double c7 = 0.07700014900618802456;
+ pre = c0 + a*(c1 + a*(c2 + a*(c3 + a*(c4 + a*(c5 + a*(c6 + a*c7))))));
+ zeta = a * pre;
+ pre = sqrt(2.0*sqrt(pre/(1.0+z)));
+ abs_zeta = fabs(zeta);
+ }
+ else if(z < 1.0) {
+ double rt = sqrt(1.0 - z*z);
+ abs_zeta = pow(1.5*(log((1.0+rt)/z) - rt), 2.0/3.0);
+ zeta = abs_zeta;
+ pre = sqrt(2.0*sqrt(abs_zeta/(rt*rt)));
+ }
+ else {
+ /* z > 1 */
+ double rt = z * sqrt(1.0 - 1.0/(z*z));
+ abs_zeta = pow(1.5*(rt - acos(1.0/z)), 2.0/3.0);
+ zeta = -abs_zeta;
+ pre = sqrt(2.0*sqrt(abs_zeta/(rt*rt)));
+ }
+
+ asum = olver_Asum(nu, z, abs_zeta, &asum_err);
+ bsum = olver_Bsum(nu, z, abs_zeta);
+
+ arg = crnu*crnu * zeta;
+ stat_a = gsl_sf_airy_Ai_e(arg, GSL_MODE_DEFAULT, &ai);
+ stat_ap = gsl_sf_airy_Ai_deriv_e(arg, GSL_MODE_DEFAULT, &aip);
+
+ result->val = pre * (ai.val*asum/crnu + aip.val*bsum/(nu*crnu*crnu));
+ result->err = pre * (ai.err * fabs(asum/crnu));
+ result->err += pre * fabs(ai.val) * asum_err / crnu;
+ result->err += pre * fabs(ai.val * asum) / (crnu*nu11);
+ result->err += 8.0 * GSL_DBL_EPSILON * fabs(result->val);
+
+ return GSL_ERROR_SELECT_2(stat_a, stat_ap);
+ }
+}
+
+
+/* uniform asymptotic, nu -> Inf, [Abramowitz+Stegun, 9.3.36]
+ *
+ * error:
+ * nu = 2: uniformly good to > 6D
+ * nu = 5: uniformly good to > 8D
+ * nu = 10: uniformly good to > 10D
+ * nu = 20: uniformly good to > 13D
+ */
+int gsl_sf_bessel_Ynu_asymp_Olver_e(double nu, double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x <= 0.0 || nu <= 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else {
+ double zeta, abs_zeta;
+ double arg;
+ double pre;
+ double asum, bsum, asum_err;
+ gsl_sf_result bi;
+ gsl_sf_result bip;
+ double z = x/nu;
+ double crnu = pow(nu, 1.0/3.0);
+ double nu3 = nu*nu*nu;
+ double nu11 = nu3*nu3*nu3*nu*nu;
+ int stat_b, stat_d;
+
+ if(fabs(1.0-z) < 0.02) {
+ const double a = 1.0-z;
+ const double c0 = 1.25992104989487316476721060728;
+ const double c1 = 0.37797631496846194943016318218;
+ const double c2 = 0.230385563409348235843147082474;
+ const double c3 = 0.165909603649648694839821892031;
+ const double c4 = 0.12931387086451008907;
+ const double c5 = 0.10568046188858133991;
+ const double c6 = 0.08916997952268186978;
+ const double c7 = 0.07700014900618802456;
+ pre = c0 + a*(c1 + a*(c2 + a*(c3 + a*(c4 + a*(c5 + a*(c6 + a*c7))))));
+ zeta = a * pre;
+ pre = sqrt(2.0*sqrt(pre/(1.0+z)));
+ abs_zeta = fabs(zeta);
+ }
+ else if(z < 1.0) {
+ double rt = sqrt(1.0 - z*z);
+ abs_zeta = pow(1.5*(log((1.0+rt)/z) - rt), 2.0/3.0);
+ zeta = abs_zeta;
+ pre = sqrt(2.0*sqrt(abs_zeta/(rt*rt)));
+ }
+ else {
+ /* z > 1 */
+ double rt = z * sqrt(1.0 - 1.0/(z*z));
+ double ac = acos(1.0/z);
+ abs_zeta = pow(1.5*(rt - ac), 2.0/3.0);
+ zeta = -abs_zeta;
+ pre = sqrt(2.0*sqrt(abs_zeta)/rt);
+ }
+
+ asum = olver_Asum(nu, z, abs_zeta, &asum_err);
+ bsum = olver_Bsum(nu, z, abs_zeta);
+
+ arg = crnu*crnu * zeta;
+ stat_b = gsl_sf_airy_Bi_e(arg, GSL_MODE_DEFAULT, &bi);
+ stat_d = gsl_sf_airy_Bi_deriv_e(arg, GSL_MODE_DEFAULT, &bip);
+
+ result->val = -pre * (bi.val*asum/crnu + bip.val*bsum/(nu*crnu*crnu));
+ result->err = pre * (bi.err * fabs(asum/crnu));
+ result->err += pre * fabs(bi.val) * asum_err / crnu;
+ result->err += pre * fabs(bi.val*asum) / (crnu*nu11);
+ result->err += 8.0 * GSL_DBL_EPSILON * fabs(result->val);
+
+ return GSL_ERROR_SELECT_2(stat_b, stat_d);
+ }
+}
diff --git a/gsl-1.9/specfunc/bessel_olver.h b/gsl-1.9/specfunc/bessel_olver.h
new file mode 100644
index 0000000..bfea208
--- /dev/null
+++ b/gsl-1.9/specfunc/bessel_olver.h
@@ -0,0 +1,33 @@
+/* specfunc/bessel_olver.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#ifndef BESSEL_OLVER_H_
+#define BESSEL_OLVER_H_
+
+#include <gsl/gsl_sf_result.h>
+
+int gsl_sf_bessel_Jnu_asymp_Olver_e(double nu, double x, gsl_sf_result * result);
+int gsl_sf_bessel_Ynu_asymp_Olver_e(double nu, double x, gsl_sf_result * result);
+
+double gsl_sf_bessel_Olver_zofmzeta(double minus_zeta);
+
+
+#endif /* !BESSEL_OLVER_H_ */
diff --git a/gsl-1.9/specfunc/bessel_sequence.c b/gsl-1.9/specfunc/bessel_sequence.c
new file mode 100644
index 0000000..c816a33
--- /dev/null
+++ b/gsl-1.9/specfunc/bessel_sequence.c
@@ -0,0 +1,154 @@
+/* specfunc/bessel_sequence.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_bessel.h>
+
+
+#define DYDX_p(p,u,x) (-(p)/(x) + (((nu)*(nu))/((x)*(x))-1.0)*(u))
+#define DYDX_u(p,u,x) (p)
+
+static int
+rk_step(double nu, double x, double dx, double * Jp, double * J)
+{
+ double p_0 = *Jp;
+ double u_0 = *J;
+
+ double p_1 = dx * DYDX_p(p_0, u_0, x);
+ double u_1 = dx * DYDX_u(p_0, u_0, x);
+
+ double p_2 = dx * DYDX_p(p_0 + 0.5*p_1, u_0 + 0.5*u_1, x + 0.5*dx);
+ double u_2 = dx * DYDX_u(p_0 + 0.5*p_1, u_0 + 0.5*u_1, x + 0.5*dx);
+
+ double p_3 = dx * DYDX_p(p_0 + 0.5*p_2, u_0 + 0.5*u_2, x + 0.5*dx);
+ double u_3 = dx * DYDX_u(p_0 + 0.5*p_2, u_0 + 0.5*u_2, x + 0.5*dx);
+
+ double p_4 = dx * DYDX_p(p_0 + p_3, u_0 + u_3, x + dx);
+ double u_4 = dx * DYDX_u(p_0 + p_3, u_0 + u_3, x + dx);
+
+ *Jp = p_0 + p_1/6.0 + p_2/3.0 + p_3/3.0 + p_4/6.0;
+ *J = u_0 + u_1/6.0 + u_2/3.0 + u_3/3.0 + u_4/6.0;
+
+ return GSL_SUCCESS;
+}
+
+
+int
+gsl_sf_bessel_sequence_Jnu_e(double nu, gsl_mode_t mode, size_t size, double * v)
+{
+ /* CHECK_POINTER(v) */
+
+ if(nu < 0.0) {
+ GSL_ERROR ("domain error", GSL_EDOM);
+ }
+ else if(size == 0) {
+ GSL_ERROR ("error", GSL_EINVAL);
+ }
+ else {
+ const gsl_prec_t goal = GSL_MODE_PREC(mode);
+ const double dx_array[] = { 0.001, 0.03, 0.1 }; /* double, single, approx */
+ const double dx_nominal = dx_array[goal];
+
+ const int cnu = (int) ceil(nu);
+ const double nu13 = pow(nu,1.0/3.0);
+ const double smalls[] = { 0.01, 0.02, 0.4, 0.7, 1.3, 2.0, 2.5, 3.2, 3.5, 4.5, 6.0 };
+ const double x_small = ( nu >= 10.0 ? nu - nu13 : smalls[cnu] );
+
+ gsl_sf_result J0, J1;
+ double Jp, J;
+ double x;
+ size_t i = 0;
+
+ /* Calculate the first point. */
+ x = v[0];
+ gsl_sf_bessel_Jnu_e(nu, x, &J0);
+ v[0] = J0.val;
+ ++i;
+
+ /* Step over the idiot case where the
+ * first point was actually zero.
+ */
+ if(x == 0.0) {
+ if(v[1] <= x) {
+ /* Strict ordering failure. */
+ GSL_ERROR ("error", GSL_EFAILED);
+ }
+ x = v[1];
+ gsl_sf_bessel_Jnu_e(nu, x, &J0);
+ v[1] = J0.val;
+ ++i;
+ }
+
+ /* Calculate directly as long as the argument
+ * is small. This is necessary because the
+ * integration is not very good there.
+ */
+ while(v[i] < x_small && i < size) {
+ if(v[i] <= x) {
+ /* Strict ordering failure. */
+ GSL_ERROR ("error", GSL_EFAILED);
+ }
+ x = v[i];
+ gsl_sf_bessel_Jnu_e(nu, x, &J0);
+ v[i] = J0.val;
+ ++i;
+ }
+
+ /* At this point we are ready to integrate.
+ * The value of x is the last calculated
+ * point, which has the value J0; v[i] is
+ * the next point we need to calculate. We
+ * calculate nu+1 at x as well to get
+ * the derivative, then we go forward.
+ */
+ gsl_sf_bessel_Jnu_e(nu+1.0, x, &J1);
+ J = J0.val;
+ Jp = -J1.val + nu/x * J0.val;
+
+ while(i < size) {
+ const double dv = v[i] - x;
+ const int Nd = (int) ceil(dv/dx_nominal);
+ const double dx = dv / Nd;
+ double xj;
+ int j;
+
+ if(v[i] <= x) {
+ /* Strict ordering failure. */
+ GSL_ERROR ("error", GSL_EFAILED);
+ }
+
+ /* Integrate over interval up to next sample point.
+ */
+ for(j=0, xj=x; j<Nd; j++, xj += dx) {
+ rk_step(nu, xj, dx, &Jp, &J);
+ }
+
+ /* Go to next interval. */
+ x = v[i];
+ v[i] = J;
+ ++i;
+ }
+
+ return GSL_SUCCESS;
+ }
+}
diff --git a/gsl-1.9/specfunc/bessel_temme.c b/gsl-1.9/specfunc/bessel_temme.c
new file mode 100644
index 0000000..0f2adf3
--- /dev/null
+++ b/gsl-1.9/specfunc/bessel_temme.c
@@ -0,0 +1,219 @@
+/* specfunc/bessel_temme.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+/* Calculate series for Y_nu and K_nu for small x and nu.
+ * This is applicable for x < 2 and |nu|<=1/2.
+ * These functions assume x > 0.
+ */
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_mode.h>
+#include "bessel_temme.h"
+
+#include "chebyshev.h"
+#include "cheb_eval.c"
+
+/* nu = (x+1)/4, -1<x<1, 1/(2nu)(1/Gamma[1-nu]-1/Gamma[1+nu]) */
+static double g1_dat[14] = {
+ -1.14516408366268311786898152867,
+ 0.00636085311347084238122955495,
+ 0.00186245193007206848934643657,
+ 0.000152833085873453507081227824,
+ 0.000017017464011802038795324732,
+ -6.4597502923347254354668326451e-07,
+ -5.1819848432519380894104312968e-08,
+ 4.5189092894858183051123180797e-10,
+ 3.2433227371020873043666259180e-11,
+ 6.8309434024947522875432400828e-13,
+ 2.8353502755172101513119628130e-14,
+ -7.9883905769323592875638087541e-16,
+ -3.3726677300771949833341213457e-17,
+ -3.6586334809210520744054437104e-20
+};
+static cheb_series g1_cs = {
+ g1_dat,
+ 13,
+ -1, 1,
+ 7
+};
+
+/* nu = (x+1)/4, -1<x<1, 1/2 (1/Gamma[1-nu]+1/Gamma[1+nu]) */
+static double g2_dat[15] =
+{
+ 1.882645524949671835019616975350,
+ -0.077490658396167518329547945212,
+ -0.018256714847324929419579340950,
+ 0.0006338030209074895795923971731,
+ 0.0000762290543508729021194461175,
+ -9.5501647561720443519853993526e-07,
+ -8.8927268107886351912431512955e-08,
+ -1.9521334772319613740511880132e-09,
+ -9.4003052735885162111769579771e-11,
+ 4.6875133849532393179290879101e-12,
+ 2.2658535746925759582447545145e-13,
+ -1.1725509698488015111878735251e-15,
+ -7.0441338200245222530843155877e-17,
+ -2.4377878310107693650659740228e-18,
+ -7.5225243218253901727164675011e-20
+};
+static cheb_series g2_cs = {
+ g2_dat,
+ 14,
+ -1, 1,
+ 8
+};
+
+
+static
+int
+gsl_sf_temme_gamma(const double nu, double * g_1pnu, double * g_1mnu, double * g1, double * g2)
+{
+ const double anu = fabs(nu); /* functions are even */
+ const double x = 4.0*anu - 1.0;
+ gsl_sf_result r_g1;
+ gsl_sf_result r_g2;
+ cheb_eval_e(&g1_cs, x, &r_g1);
+ cheb_eval_e(&g2_cs, x, &r_g2);
+ *g1 = r_g1.val;
+ *g2 = r_g2.val;
+ *g_1mnu = 1.0/(r_g2.val + nu * r_g1.val);
+ *g_1pnu = 1.0/(r_g2.val - nu * r_g1.val);
+ return GSL_SUCCESS;
+}
+
+
+int
+gsl_sf_bessel_Y_temme(const double nu, const double x,
+ gsl_sf_result * Ynu,
+ gsl_sf_result * Ynup1)
+{
+ const int max_iter = 15000;
+
+ const double half_x = 0.5 * x;
+ const double ln_half_x = log(half_x);
+ const double half_x_nu = exp(nu*ln_half_x);
+ const double pi_nu = M_PI * nu;
+ const double alpha = pi_nu / 2.0;
+ const double sigma = -nu * ln_half_x;
+ const double sinrat = (fabs(pi_nu) < GSL_DBL_EPSILON ? 1.0 : pi_nu/sin(pi_nu));
+ const double sinhrat = (fabs(sigma) < GSL_DBL_EPSILON ? 1.0 : sinh(sigma)/sigma);
+ const double sinhalf = (fabs(alpha) < GSL_DBL_EPSILON ? 1.0 : sin(alpha)/alpha);
+ const double sin_sqr = nu*M_PI*M_PI*0.5 * sinhalf*sinhalf;
+
+ double sum0, sum1;
+ double fk, pk, qk, hk, ck;
+ int k = 0;
+ int stat_iter;
+
+ double g_1pnu, g_1mnu, g1, g2;
+ int stat_g = gsl_sf_temme_gamma(nu, &g_1pnu, &g_1mnu, &g1, &g2);
+
+ fk = 2.0/M_PI * sinrat * (cosh(sigma)*g1 - sinhrat*ln_half_x*g2);
+ pk = 1.0/M_PI /half_x_nu * g_1pnu;
+ qk = 1.0/M_PI *half_x_nu * g_1mnu;
+ hk = pk;
+ ck = 1.0;
+
+ sum0 = fk + sin_sqr * qk;
+ sum1 = pk;
+
+ while(k < max_iter) {
+ double del0;
+ double del1;
+ double gk;
+ k++;
+ fk = (k*fk + pk + qk)/(k*k-nu*nu);
+ ck *= -half_x*half_x/k;
+ pk /= (k - nu);
+ qk /= (k + nu);
+ gk = fk + sin_sqr * qk;
+ hk = -k*gk + pk;
+ del0 = ck * gk;
+ del1 = ck * hk;
+ sum0 += del0;
+ sum1 += del1;
+ if(fabs(del0) < 0.5*(1.0 + fabs(sum0))*GSL_DBL_EPSILON) break;
+ }
+
+ Ynu->val = -sum0;
+ Ynu->err = (2.0 + 0.5*k) * GSL_DBL_EPSILON * fabs(Ynu->val);
+ Ynup1->val = -sum1 * 2.0/x;
+ Ynup1->err = (2.0 + 0.5*k) * GSL_DBL_EPSILON * fabs(Ynup1->val);
+
+ stat_iter = ( k >= max_iter ? GSL_EMAXITER : GSL_SUCCESS );
+ return GSL_ERROR_SELECT_2(stat_iter, stat_g);
+}
+
+
+int
+gsl_sf_bessel_K_scaled_temme(const double nu, const double x,
+ double * K_nu, double * K_nup1, double * Kp_nu)
+{
+ const int max_iter = 15000;
+
+ const double half_x = 0.5 * x;
+ const double ln_half_x = log(half_x);
+ const double half_x_nu = exp(nu*ln_half_x);
+ const double pi_nu = M_PI * nu;
+ const double sigma = -nu * ln_half_x;
+ const double sinrat = (fabs(pi_nu) < GSL_DBL_EPSILON ? 1.0 : pi_nu/sin(pi_nu));
+ const double sinhrat = (fabs(sigma) < GSL_DBL_EPSILON ? 1.0 : sinh(sigma)/sigma);
+ const double ex = exp(x);
+
+ double sum0, sum1;
+ double fk, pk, qk, hk, ck;
+ int k = 0;
+ int stat_iter;
+
+ double g_1pnu, g_1mnu, g1, g2;
+ int stat_g = gsl_sf_temme_gamma(nu, &g_1pnu, &g_1mnu, &g1, &g2);
+
+ fk = sinrat * (cosh(sigma)*g1 - sinhrat*ln_half_x*g2);
+ pk = 0.5/half_x_nu * g_1pnu;
+ qk = 0.5*half_x_nu * g_1mnu;
+ hk = pk;
+ ck = 1.0;
+ sum0 = fk;
+ sum1 = hk;
+ while(k < max_iter) {
+ double del0;
+ double del1;
+ k++;
+ fk = (k*fk + pk + qk)/(k*k-nu*nu);
+ ck *= half_x*half_x/k;
+ pk /= (k - nu);
+ qk /= (k + nu);
+ hk = -k*fk + pk;
+ del0 = ck * fk;
+ del1 = ck * hk;
+ sum0 += del0;
+ sum1 += del1;
+ if(fabs(del0) < 0.5*fabs(sum0)*GSL_DBL_EPSILON) break;
+ }
+
+ *K_nu = sum0 * ex;
+ *K_nup1 = sum1 * 2.0/x * ex;
+ *Kp_nu = - *K_nup1 + nu/x * *K_nu;
+
+ stat_iter = ( k == max_iter ? GSL_EMAXITER : GSL_SUCCESS );
+ return GSL_ERROR_SELECT_2(stat_iter, stat_g);
+}
diff --git a/gsl-1.9/specfunc/bessel_temme.h b/gsl-1.9/specfunc/bessel_temme.h
new file mode 100644
index 0000000..7a2c539
--- /dev/null
+++ b/gsl-1.9/specfunc/bessel_temme.h
@@ -0,0 +1,38 @@
+/* specfunc/bessel_temme.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#ifndef BESSEL_TEMME_H_
+#define BESSEL_TEMME_H_
+
+#include <gsl/gsl_sf_result.h>
+
+
+int
+gsl_sf_bessel_Y_temme(const double nu, const double x,
+ gsl_sf_result * Y_nu,
+ gsl_sf_result * Y_nup1);
+
+int
+gsl_sf_bessel_K_scaled_temme(const double nu, const double x,
+ double * K_nu, double * K_nup1, double * Kp_nu);
+
+
+#endif /* !BESSEL_TEMME_H_ */
diff --git a/gsl-1.9/specfunc/bessel_y.c b/gsl-1.9/specfunc/bessel_y.c
new file mode 100644
index 0000000..e15c670
--- /dev/null
+++ b/gsl-1.9/specfunc/bessel_y.c
@@ -0,0 +1,292 @@
+/* specfunc/bessel_y.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_pow_int.h>
+#include <gsl/gsl_sf_gamma.h>
+#include <gsl/gsl_sf_trig.h>
+#include <gsl/gsl_sf_bessel.h>
+
+#include "error.h"
+
+#include "bessel.h"
+#include "bessel_olver.h"
+
+/*-*-*-*-*-*-*-*-*-*-*-* Private Section *-*-*-*-*-*-*-*-*-*-*-*/
+
+/* [Abramowitz+Stegun, 10.1.3]
+ * with lmax=15, precision ~ 15D for x < 3
+ *
+ * checked OK [GJ] Wed May 13 15:41:25 MDT 1998
+ */
+static int bessel_yl_small_x(int l, const double x, gsl_sf_result * result)
+{
+ gsl_sf_result num_fact;
+ double den = gsl_sf_pow_int(x, l+1);
+ int stat_df = gsl_sf_doublefact_e(2*l-1, &num_fact);
+
+ if(stat_df != GSL_SUCCESS || den == 0.0) {
+ OVERFLOW_ERROR(result);
+ }
+ else {
+ const int lmax = 200;
+ double t = -0.5*x*x;
+ double sum = 1.0;
+ double t_coeff = 1.0;
+ double t_power = 1.0;
+ double delta;
+ int i;
+ for(i=1; i<=lmax; i++) {
+ t_coeff /= i*(2*(i-l) - 1);
+ t_power *= t;
+ delta = t_power*t_coeff;
+ sum += delta;
+ if(fabs(delta/sum) < 0.5*GSL_DBL_EPSILON) break;
+ }
+ result->val = -num_fact.val/den * sum;
+ result->err = GSL_DBL_EPSILON * fabs(result->val);
+
+ return GSL_SUCCESS;
+ }
+}
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+
+int gsl_sf_bessel_y0_e(const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x <= 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(1.0/GSL_DBL_MAX > 0.0 && x < 1.0/GSL_DBL_MAX) {
+ OVERFLOW_ERROR(result);
+ }
+ else {
+ gsl_sf_result cos_result;
+ const int stat = gsl_sf_cos_e(x, &cos_result);
+ result->val = -cos_result.val/x;
+ result->err = fabs(cos_result.err/x);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return stat;
+ }
+}
+
+
+int gsl_sf_bessel_y1_e(const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x <= 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x < 1.0/GSL_SQRT_DBL_MAX) {
+ OVERFLOW_ERROR(result);
+ }
+ else if(x < 0.25) {
+ const double y = x*x;
+ const double c1 = 1.0/2.0;
+ const double c2 = -1.0/8.0;
+ const double c3 = 1.0/144.0;
+ const double c4 = -1.0/5760.0;
+ const double c5 = 1.0/403200.0;
+ const double c6 = -1.0/43545600.0;
+ const double sum = 1.0 + y*(c1 + y*(c2 + y*(c3 + y*(c4 + y*(c5 + y*c6)))));
+ result->val = -sum/y;
+ result->err = GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ gsl_sf_result cos_result;
+ gsl_sf_result sin_result;
+ const int stat_cos = gsl_sf_cos_e(x, &cos_result);
+ const int stat_sin = gsl_sf_sin_e(x, &sin_result);
+ const double cx = cos_result.val;
+ const double sx = sin_result.val;
+ result->val = -(cx/x + sx)/x;
+ result->err = (fabs(cos_result.err/x) + sin_result.err)/fabs(x);
+ result->err += GSL_DBL_EPSILON * (fabs(sx/x) + fabs(cx/(x*x)));
+ return GSL_ERROR_SELECT_2(stat_cos, stat_sin);
+ }
+}
+
+
+int gsl_sf_bessel_y2_e(const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x <= 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x < 1.0/GSL_ROOT3_DBL_MAX) {
+ OVERFLOW_ERROR(result);
+ }
+ else if(x < 0.5) {
+ const double y = x*x;
+ const double c1 = 1.0/6.0;
+ const double c2 = 1.0/24.0;
+ const double c3 = -1.0/144.0;
+ const double c4 = 1.0/3456.0;
+ const double c5 = -1.0/172800.0;
+ const double c6 = 1.0/14515200.0;
+ const double c7 = -1.0/1828915200.0;
+ const double sum = 1.0 + y*(c1 + y*(c2 + y*(c3 + y*(c4 + y*(c5 + y*(c6 + y*c7))))));
+ result->val = -3.0/(x*x*x) * sum;
+ result->err = GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ gsl_sf_result cos_result;
+ gsl_sf_result sin_result;
+ const int stat_cos = gsl_sf_cos_e(x, &cos_result);
+ const int stat_sin = gsl_sf_sin_e(x, &sin_result);
+ const double sx = sin_result.val;
+ const double cx = cos_result.val;
+ const double a = 3.0/(x*x);
+ result->val = (1.0 - a)/x * cx - a * sx;
+ result->err = cos_result.err * fabs((1.0 - a)/x) + sin_result.err * fabs(a);
+ result->err += GSL_DBL_EPSILON * (fabs(cx/x) + fabs(sx/(x*x)));
+ return GSL_ERROR_SELECT_2(stat_cos, stat_sin);
+ }
+}
+
+
+int gsl_sf_bessel_yl_e(int l, const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(l < 0 || x <= 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(l == 0) {
+ return gsl_sf_bessel_y0_e(x, result);
+ }
+ else if(l == 1) {
+ return gsl_sf_bessel_y1_e(x, result);
+ }
+ else if(l == 2) {
+ return gsl_sf_bessel_y2_e(x, result);
+ }
+ else if(x < 3.0) {
+ return bessel_yl_small_x(l, x, result);
+ }
+ else if(GSL_ROOT3_DBL_EPSILON * x > (l*l + l + 1.0)) {
+ int status = gsl_sf_bessel_Ynu_asympx_e(l + 0.5, x, result);
+ double pre = sqrt((0.5*M_PI)/x);
+ result->val *= pre;
+ result->err *= pre;
+ return status;
+ }
+ else if(l > 40) {
+ int status = gsl_sf_bessel_Ynu_asymp_Olver_e(l + 0.5, x, result);
+ double pre = sqrt((0.5*M_PI)/x);
+ result->val *= pre;
+ result->err *= pre;
+ return status;
+ }
+ else {
+ /* recurse upward */
+ gsl_sf_result r_by;
+ gsl_sf_result r_bym;
+ int stat_1 = gsl_sf_bessel_y1_e(x, &r_by);
+ int stat_0 = gsl_sf_bessel_y0_e(x, &r_bym);
+ double bym = r_bym.val;
+ double by = r_by.val;
+ double byp;
+ int j;
+ for(j=1; j<l; j++) {
+ byp = (2*j+1)/x*by - bym;
+ bym = by;
+ by = byp;
+ }
+ result->val = by;
+ result->err = fabs(result->val) * (GSL_DBL_EPSILON + fabs(r_by.err/r_by.val) + fabs(r_bym.err/r_bym.val));
+
+ return GSL_ERROR_SELECT_2(stat_1, stat_0);
+ }
+}
+
+
+int gsl_sf_bessel_yl_array(const int lmax, const double x, double * result_array)
+{
+ /* CHECK_POINTER(result_array) */
+
+ if(lmax < 0 || x <= 0.0) {
+ GSL_ERROR ("error", GSL_EDOM);
+ } else if (lmax == 0) {
+ gsl_sf_result result;
+ int stat = gsl_sf_bessel_y0_e(x, &result);
+ result_array[0] = result.val;
+ return stat;
+ } else {
+ gsl_sf_result r_yell;
+ gsl_sf_result r_yellm1;
+ int stat_1 = gsl_sf_bessel_y1_e(x, &r_yell);
+ int stat_0 = gsl_sf_bessel_y0_e(x, &r_yellm1);
+ double yellp1;
+ double yell = r_yell.val;
+ double yellm1 = r_yellm1.val;
+ int ell;
+
+ result_array[0] = yellm1;
+ result_array[1] = yell;
+
+ for(ell = 1; ell < lmax; ell++) {
+ yellp1 = (2*ell+1)/x * yell - yellm1;
+ result_array[ell+1] = yellp1;
+ yellm1 = yell;
+ yell = yellp1;
+ }
+
+ return GSL_ERROR_SELECT_2(stat_0, stat_1);
+ }
+}
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_bessel_y0(const double x)
+{
+ EVAL_RESULT(gsl_sf_bessel_y0_e(x, &result));
+}
+
+double gsl_sf_bessel_y1(const double x)
+{
+ EVAL_RESULT(gsl_sf_bessel_y1_e(x, &result));
+}
+
+double gsl_sf_bessel_y2(const double x)
+{
+ EVAL_RESULT(gsl_sf_bessel_y2_e(x, &result));
+}
+
+double gsl_sf_bessel_yl(const int l, const double x)
+{
+ EVAL_RESULT(gsl_sf_bessel_yl_e(l, x, &result));
+}
+
+
diff --git a/gsl-1.9/specfunc/bessel_zero.c b/gsl-1.9/specfunc/bessel_zero.c
new file mode 100644
index 0000000..7ff8f7e
--- /dev/null
+++ b/gsl-1.9/specfunc/bessel_zero.c
@@ -0,0 +1,1219 @@
+/* specfunc/bessel_zero.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_airy.h>
+#include <gsl/gsl_sf_pow_int.h>
+#include <gsl/gsl_sf_bessel.h>
+
+#include "error.h"
+
+#include "bessel_olver.h"
+
+/* For Chebyshev expansions of the roots as functions of nu,
+ * see [G. Nemeth, Mathematical Approximation of Special Functions].
+ * This gives the fits for all nu and s <= 10.
+ * I made the fits for other values of s myself [GJ].
+ */
+
+/* Chebyshev expansion: j_{nu,1} = c_k T_k*(nu/2), nu <= 2 */
+static const double coef_jnu1_a[] = {
+ 3.801775243633476,
+ 1.360704737511120,
+ -0.030707710261106,
+ 0.004526823746202,
+ -0.000808682832134,
+ 0.000159218792489,
+ -0.000033225189761,
+ 0.000007205599763,
+ -0.000001606110397,
+ 0.000000365439424,
+ -0.000000084498039,
+ 0.000000019793815,
+ -0.000000004687054,
+ 0.000000001120052,
+ -0.000000000269767,
+ 0.000000000065420,
+ -0.000000000015961,
+ 0.000000000003914,
+ -0.000000000000965,
+ 0.000000000000239,
+ -0.000000000000059,
+ 0.000000000000015,
+ -0.000000000000004,
+ 0.000000000000001
+};
+
+
+/* Chebyshev expansion: j_{nu,1} = nu c_k T_k*((2/nu)^(2/3)), nu >= 2 */
+static const double coef_jnu1_b[] = {
+ 1.735063412537096,
+ 0.784478100951978,
+ 0.048881473180370,
+ -0.000578279783021,
+ -0.000038984957864,
+ 0.000005758297879,
+ -0.000000327583229,
+ -0.000000003853878,
+ 0.000000002284653,
+ -0.000000000153079,
+ -0.000000000000895,
+ 0.000000000000283,
+ 0.000000000000043,
+ 0.000000000000010,
+ -0.000000000000003
+};
+
+
+/* Chebyshev expansion: j_{nu,2} = c_k T_k*(nu/2), nu <= 2 */
+static const double coef_jnu2_a[] = {
+ 6.992370244046161,
+ 1.446379282056534,
+ -0.023458616207293,
+ 0.002172149448700,
+ -0.000246262775620,
+ 0.000030990180959,
+ -0.000004154183047,
+ 0.000000580766328,
+ -0.000000083648175,
+ 0.000000012317355,
+ -0.000000001844887,
+ 0.000000000280076,
+ -0.000000000042986,
+ 0.000000000006658,
+ -0.000000000001039,
+ 0.000000000000163,
+ -0.000000000000026,
+ 0.000000000000004,
+ -0.000000000000001
+};
+
+
+/* Chebyshev expansion: j_{nu,2} = nu c_k T_k*((2/nu)^(2/3)), nu >= 2 */
+static const double coef_jnu2_b[] = {
+ 2.465611864263400,
+ 1.607952988471069,
+ 0.138758034431497,
+ -0.003687791182054,
+ -0.000051276007868,
+ 0.000045113570749,
+ -0.000007579172152,
+ 0.000000736469208,
+ -0.000000011118527,
+ -0.000000011919884,
+ 0.000000002696788,
+ -0.000000000314488,
+ 0.000000000008124,
+ 0.000000000005211,
+ -0.000000000001292,
+ 0.000000000000158,
+ -0.000000000000004,
+ -0.000000000000003,
+ 0.000000000000001
+};
+
+
+/* Chebyshev expansion: j_{nu,3} = c_k T_k*(nu/3), nu <= 3 */
+static const double coef_jnu3_a[] = {
+ 10.869647065239236,
+ 2.177524286141710,
+ -0.034822817125293,
+ 0.003167249102413,
+ -0.000353960349344,
+ 0.000044039086085,
+ -0.000005851380981,
+ 0.000000812575483,
+ -0.000000116463617,
+ 0.000000017091246,
+ -0.000000002554376,
+ 0.000000000387335,
+ -0.000000000059428,
+ 0.000000000009207,
+ -0.000000000001438,
+ 0.000000000000226,
+ -0.000000000000036,
+ 0.000000000000006,
+ -0.000000000000001
+};
+
+
+/* Chebyshev expansion: j_{nu,3} = nu c_k T_k*((3/nu)^(2/3)), nu >= 3 */
+static const double coef_jnu3_b[] = {
+ 2.522816775173244,
+ 1.673199424973720,
+ 0.146431617506314,
+ -0.004049001763912,
+ -0.000039517767244,
+ 0.000048781729288,
+ -0.000008729705695,
+ 0.000000928737310,
+ -0.000000028388244,
+ -0.000000012927432,
+ 0.000000003441008,
+ -0.000000000471695,
+ 0.000000000025590,
+ 0.000000000005502,
+ -0.000000000001881,
+ 0.000000000000295,
+ -0.000000000000020,
+ -0.000000000000003,
+ 0.000000000000001
+};
+
+
+/* Chebyshev expansion: j_{nu,4} = c_k T_k*(nu/4), nu <= 4 */
+static const double coef_jnu4_a[] = {
+ 14.750310252773009,
+ 2.908010932941708,
+ -0.046093293420315,
+ 0.004147172321412,
+ -0.000459092310473,
+ 0.000056646951906,
+ -0.000007472351546,
+ 0.000001031210065,
+ -0.000000147008137,
+ 0.000000021475218,
+ -0.000000003197208,
+ 0.000000000483249,
+ -0.000000000073946,
+ 0.000000000011431,
+ -0.000000000001782,
+ 0.000000000000280,
+ -0.000000000000044,
+ 0.000000000000007,
+ -0.000000000000001
+};
+
+
+/* Chebyshev expansion: j_{nu,4} = nu c_k T_k*((4/nu)^(2/3)), nu >= 4 */
+static const double coef_jnu4_b[] = {
+ 2.551681323117914,
+ 1.706177978336572,
+ 0.150357658406131,
+ -0.004234001378590,
+ -0.000033854229898,
+ 0.000050763551485,
+ -0.000009337464057,
+ 0.000001029717834,
+ -0.000000037474196,
+ -0.000000013450153,
+ 0.000000003836180,
+ -0.000000000557404,
+ 0.000000000035748,
+ 0.000000000005487,
+ -0.000000000002187,
+ 0.000000000000374,
+ -0.000000000000031,
+ -0.000000000000003,
+ 0.000000000000001
+};
+
+
+
+/* Chebyshev expansion: j_{nu,5} = c_k T_k*(nu/5), nu <= 5 */
+static const double coef_jnu5_a[] = {
+ 18.632261081028211,
+ 3.638249012596966,
+ -0.057329705998828,
+ 0.005121709126820,
+ -0.000563325259487,
+ 0.000069100826174,
+ -0.000009066603030,
+ 0.000001245181383,
+ -0.000000176737282,
+ 0.000000025716695,
+ -0.000000003815184,
+ 0.000000000574839,
+ -0.000000000087715,
+ 0.000000000013526,
+ -0.000000000002104,
+ 0.000000000000330,
+ -0.000000000000052,
+ 0.000000000000008,
+ -0.000000000000001
+};
+
+
+/* Chebyshev expansion: j_{nu,5} = nu c_k T_k*((5/nu)^(2/3)), nu >= 5 */
+/* FIXME: There is something wrong with this fit, in about the
+ * 9th or 10th decimal place.
+ */
+static const double coef_jnu5_b[] = {
+ 2.569079487591442,
+ 1.726073360882134,
+ 0.152740776809531,
+ -0.004346449660148,
+ -0.000030512461856,
+ 0.000052000821080,
+ -0.000009713343981,
+ 0.000001091997863,
+ -0.000000043061707,
+ -0.000000013779413,
+ 0.000000004082870,
+ -0.000000000611259,
+ 0.000000000042242,
+ 0.000000000005448,
+ -0.000000000002377,
+ 0.000000000000424,
+ -0.000000000000038,
+ -0.000000000000002,
+ 0.000000000000002
+};
+
+
+/* Chebyshev expansion: j_{nu,6} = c_k T_k*(nu/6), nu <= 6 */
+static const double coef_jnu6_a[] = {
+ 22.514836143374042,
+ 4.368367257557198,
+ -0.068550155285562,
+ 0.006093776505822,
+ -0.000667152784957,
+ 0.000081486022398,
+ -0.000010649011647,
+ 0.000001457089679,
+ -0.000000206105082,
+ 0.000000029894724,
+ -0.000000004422012,
+ 0.000000000664471,
+ -0.000000000101140,
+ 0.000000000015561,
+ -0.000000000002416,
+ 0.000000000000378,
+ -0.000000000000060,
+ 0.000000000000009,
+ -0.000000000000002
+};
+
+
+/* Chebyshev expansion: j_{nu,6} = nu c_k T_k*((6/nu)^(2/3)), nu >= 6 */
+static const double coef_jnu6_b[] = {
+ 2.580710285494837,
+ 1.739380728566154,
+ 0.154340696401691,
+ -0.004422028860168,
+ -0.000028305272624,
+ 0.000052845975269,
+ -0.000009968794373,
+ 0.000001134252926,
+ -0.000000046841241,
+ -0.000000014007555,
+ 0.000000004251816,
+ -0.000000000648213,
+ 0.000000000046728,
+ 0.000000000005414,
+ -0.000000000002508,
+ 0.000000000000459,
+ -0.000000000000043,
+ -0.000000000000002,
+ 0.000000000000002
+};
+
+
+/* Chebyshev expansion: j_{nu,7} = c_k T_k*(nu/7), nu <= 7 */
+static const double coef_jnu7_a[] = {
+ 26.397760539730869,
+ 5.098418721711790,
+ -0.079761896398948,
+ 0.007064521280487,
+ -0.000770766522482,
+ 0.000093835449636,
+ -0.000012225308542,
+ 0.000001667939800,
+ -0.000000235288157,
+ 0.000000034040347,
+ -0.000000005023142,
+ 0.000000000753101,
+ -0.000000000114389,
+ 0.000000000017564,
+ -0.000000000002722,
+ 0.000000000000425,
+ -0.000000000000067,
+ 0.000000000000011,
+ -0.000000000000002
+};
+
+
+/* Chebyshev expansion: j_{nu,7} = nu c_k T_k*((7/nu)^(2/3)), nu >= 7 */
+static const double coef_jnu7_b[] = {
+ 2.589033335856773,
+ 1.748907007612678,
+ 0.155488900387653,
+ -0.004476317805688,
+ -0.000026737952924,
+ 0.000053459680946,
+ -0.000010153699240,
+ 0.000001164804272,
+ -0.000000049566917,
+ -0.000000014175403,
+ 0.000000004374840,
+ -0.000000000675135,
+ 0.000000000050004,
+ 0.000000000005387,
+ -0.000000000002603,
+ 0.000000000000485,
+ -0.000000000000047,
+ -0.000000000000002,
+ 0.000000000000002
+};
+
+
+/* Chebyshev expansion: j_{nu,8} = c_k T_k*(nu/8), nu <= 8 */
+static const double coef_jnu8_a[] = {
+ 30.280900001606662,
+ 5.828429205461221,
+ -0.090968381181069,
+ 0.008034479731033,
+ -0.000874254899080,
+ 0.000106164151611,
+ -0.000013798098749,
+ 0.000001878187386,
+ -0.000000264366627,
+ 0.000000038167685,
+ -0.000000005621060,
+ 0.000000000841165,
+ -0.000000000127538,
+ 0.000000000019550,
+ -0.000000000003025,
+ 0.000000000000472,
+ -0.000000000000074,
+ 0.000000000000012,
+ -0.000000000000002
+};
+
+
+/* Chebyshev expansion: j_{nu,8} = nu c_k T_k*((8/nu)^(2/3)), nu >= 8 */
+static const double coef_jnu8_b[] = {
+ 2.595283877150078,
+ 1.756063044986928,
+ 0.156352972371030,
+ -0.004517201896761,
+ -0.000025567187878,
+ 0.000053925472558,
+ -0.000010293734486,
+ 0.000001187923085,
+ -0.000000051625122,
+ -0.000000014304212,
+ 0.000000004468450,
+ -0.000000000695620,
+ 0.000000000052500,
+ 0.000000000005367,
+ -0.000000000002676,
+ 0.000000000000505,
+ -0.000000000000050,
+ -0.000000000000002,
+ 0.000000000000002
+};
+
+
+/* Chebyshev expansion: j_{nu,9} = c_k T_k*(nu/9), nu <= 9 */
+static const double coef_jnu9_a[] = {
+ 34.164181213238386,
+ 6.558412747925228,
+ -0.102171455365016,
+ 0.009003934361201,
+ -0.000977663914535,
+ 0.000118479876579,
+ -0.000015368714220,
+ 0.000002088064285,
+ -0.000000293381154,
+ 0.000000042283900,
+ -0.000000006217033,
+ 0.000000000928887,
+ -0.000000000140627,
+ 0.000000000021526,
+ -0.000000000003326,
+ 0.000000000000518,
+ -0.000000000000081,
+ 0.000000000000013,
+ -0.000000000000002
+};
+
+
+/* Chebyshev expansion: j_{nu,9} = nu c_k T_k*((9/nu)^(2/3)), nu >= 9 */
+static const double coef_jnu9_b[] = {
+ 2.600150240905079,
+ 1.761635491694032,
+ 0.157026743724010,
+ -0.004549100368716,
+ -0.000024659248617,
+ 0.000054291035068,
+ -0.000010403464334,
+ 0.000001206027524,
+ -0.000000053234089,
+ -0.000000014406241,
+ 0.000000004542078,
+ -0.000000000711728,
+ 0.000000000054464,
+ 0.000000000005350,
+ -0.000000000002733,
+ 0.000000000000521,
+ -0.000000000000052,
+ -0.000000000000002,
+ 0.000000000000002
+};
+
+
+/* Chebyshev expansion: j_{nu,10} = c_k T_k*(nu/10), nu <= 10 */
+static const double coef_jnu10_a[] = {
+ 38.047560766184647,
+ 7.288377637926008,
+ -0.113372193277897,
+ 0.009973047509098,
+ -0.001081019701335,
+ 0.000130786983847,
+ -0.000016937898538,
+ 0.000002297699179,
+ -0.000000322354218,
+ 0.000000046392941,
+ -0.000000006811759,
+ 0.000000001016395,
+ -0.000000000153677,
+ 0.000000000023486,
+ -0.000000000003616,
+ 0.000000000000561,
+ -0.000000000000095,
+ 0.000000000000027,
+ -0.000000000000013,
+ 0.000000000000005
+};
+
+
+/* Chebyshev expansion: j_{nu,10} = nu c_k T_k*((10/nu)^(2/3)), nu >= 10 */
+static const double coef_jnu10_b[] = {
+ 2.604046346867949,
+ 1.766097596481182,
+ 0.157566834446511,
+ -0.004574682244089,
+ -0.000023934500688,
+ 0.000054585558231,
+ -0.000010491765415,
+ 0.000001220589364,
+ -0.000000054526331,
+ -0.000000014489078,
+ 0.000000004601510,
+ -0.000000000724727,
+ 0.000000000056049,
+ 0.000000000005337,
+ -0.000000000002779,
+ 0.000000000000533,
+ -0.000000000000054,
+ -0.000000000000002,
+ 0.000000000000002
+};
+
+
+/* Chebyshev expansion: j_{nu,11} = c_k T_k*(nu/22), nu <= 22 */
+static const double coef_jnu11_a[] = {
+ 49.5054081076848637,
+ 15.33692279367165101,
+ -0.33677234163517130,
+ 0.04623235772920729,
+ -0.00781084960665093,
+ 0.00147217395434708,
+ -0.00029695043846867,
+ 0.00006273356860235,
+ -0.00001370575125628,
+ 3.07171282012e-6,
+ -7.0235041249e-7,
+ 1.6320559339e-7,
+ -3.843117306e-8,
+ 9.15083800e-9,
+ -2.19957642e-9,
+ 5.3301703e-10,
+ -1.3007541e-10,
+ 3.193827e-11,
+ -7.88605e-12,
+ 1.95918e-12,
+ -4.9020e-13,
+ 1.2207e-13,
+ -2.820e-14,
+ 5.25e-15,
+ -1.88e-15,
+ 2.80e-15,
+ -2.45e-15
+};
+
+
+/* Chebyshev expansion: j_{nu,12} = c_k T_k*(nu/24), nu <= 24 */
+static const double coef_jnu12_a[] = {
+ 54.0787833216641519,
+ 16.7336367772863598,
+ -0.36718411124537953,
+ 0.05035523375053820,
+ -0.00849884978867533,
+ 0.00160027692813434,
+ -0.00032248114889921,
+ 0.00006806354127199,
+ -0.00001485665901339,
+ 3.32668783672e-6,
+ -7.5998952729e-7,
+ 1.7644939709e-7,
+ -4.151538210e-8,
+ 9.87722772e-9,
+ -2.37230133e-9,
+ 5.7442875e-10,
+ -1.4007767e-10,
+ 3.437166e-11,
+ -8.48215e-12,
+ 2.10554e-12,
+ -5.2623e-13,
+ 1.3189e-13,
+ -3.175e-14,
+ 5.73e-15,
+ 5.6e-16,
+ -8.7e-16,
+ -6.5e-16
+};
+
+
+/* Chebyshev expansion: j_{nu,13} = c_k T_k*(nu/26), nu <= 26 */
+static const double coef_jnu13_a[] = {
+ 58.6521941921708890,
+ 18.1303398137970284,
+ -0.39759381380126650,
+ 0.05447765240465494,
+ -0.00918674227679980,
+ 0.00172835361420579,
+ -0.00034800528297612,
+ 0.00007339183835188,
+ -0.00001600713368099,
+ 3.58154960392e-6,
+ -8.1759873497e-7,
+ 1.8968523220e-7,
+ -4.459745253e-8,
+ 1.060304419e-8,
+ -2.54487624e-9,
+ 6.1580214e-10,
+ -1.5006751e-10,
+ 3.679707e-11,
+ -9.07159e-12,
+ 2.24713e-12,
+ -5.5943e-13,
+ 1.4069e-13,
+ -3.679e-14,
+ 1.119e-14,
+ -4.99e-15,
+ 3.43e-15,
+ -2.85e-15,
+ 2.3e-15,
+ -1.7e-15,
+ 8.7e-16
+};
+
+
+/* Chebyshev expansion: j_{nu,14} = c_k T_k*(nu/28), nu <= 28 */
+static const double coef_jnu14_a[] = {
+ 63.2256329577315566,
+ 19.5270342832914901,
+ -0.42800190567884337,
+ 0.05859971627729398,
+ -0.00987455163523582,
+ 0.00185641011402081,
+ -0.00037352439419968,
+ 0.00007871886257265,
+ -0.00001715728110045,
+ 3.83632624437e-6,
+ -8.7518558668e-7,
+ 2.0291515353e-7,
+ -4.767795233e-8,
+ 1.132844415e-8,
+ -2.71734219e-9,
+ 6.5714886e-10,
+ -1.6005342e-10,
+ 3.922557e-11,
+ -9.66637e-12,
+ 2.39379e-12,
+ -5.9541e-13,
+ 1.4868e-13,
+ -3.726e-14,
+ 9.37e-15,
+ -2.36e-15,
+ 6.0e-16
+};
+
+
+/* Chebyshev expansion: j_{nu,15} = c_k T_k*(nu/30), nu <= 30 */
+static const double coef_jnu15_a[] = {
+ 67.7990939565631635,
+ 20.9237219226859859,
+ -0.45840871823085836,
+ 0.06272149946755639,
+ -0.01056229551143042,
+ 0.00198445078693100,
+ -0.00039903958650729,
+ 0.00008404489865469,
+ -0.00001830717574922,
+ 4.09103745566e-6,
+ -9.3275533309e-7,
+ 2.1614056403e-7,
+ -5.075725222e-8,
+ 1.205352081e-8,
+ -2.88971837e-9,
+ 6.9846848e-10,
+ -1.7002946e-10,
+ 4.164941e-11,
+ -1.025859e-11,
+ 2.53921e-12,
+ -6.3128e-13,
+ 1.5757e-13,
+ -3.947e-14,
+ 9.92e-15,
+ -2.50e-15,
+ 6.3e-16
+};
+
+
+/* Chebyshev expansion: j_{nu,16} = c_k T_k*(nu/32), nu <= 32 */
+static const double coef_jnu16_a[] = {
+ 72.3725729616724770,
+ 22.32040402918608585,
+ -0.48881449782358690,
+ 0.06684305681828766,
+ -0.01124998690363398,
+ 0.00211247882775445,
+ -0.00042455166484632,
+ 0.00008937015316346,
+ -0.00001945687139551,
+ 4.34569739281e-6,
+ -9.9031173548e-7,
+ 2.2936247195e-7,
+ -5.383562595e-8,
+ 1.277835103e-8,
+ -3.06202860e-9,
+ 7.3977037e-10,
+ -1.8000071e-10,
+ 4.407196e-11,
+ -1.085046e-11,
+ 2.68453e-12,
+ -6.6712e-13,
+ 1.6644e-13,
+ -4.168e-14,
+ 1.047e-14,
+ -2.64e-15,
+ 6.7e-16
+};
+
+
+/* Chebyshev expansion: j_{nu,17} = c_k T_k*(nu/34), nu <= 34 */
+static const double coef_jnu17_a[] = {
+ 76.9460667535209549,
+ 23.71708159112252670,
+ -0.51921943142405352,
+ 0.07096442978067622,
+ -0.01193763559341369,
+ 0.00224049662974902,
+ -0.00045006122941781,
+ 0.00009469477941684,
+ -0.00002060640777107,
+ 4.60031647195e-6,
+ -1.04785755046e-6,
+ 2.4258161247e-7,
+ -5.691327087e-8,
+ 1.350298805e-8,
+ -3.23428733e-9,
+ 7.8105847e-10,
+ -1.8996825e-10,
+ 4.649350e-11,
+ -1.144205e-11,
+ 2.82979e-12,
+ -7.0294e-13,
+ 1.7531e-13,
+ -4.388e-14,
+ 1.102e-14,
+ -2.78e-15,
+ 7.0e-16
+};
+
+
+/* Chebyshev expansion: j_{nu,18} = c_k T_k*(nu/36), nu <= 36 */
+static const double coef_jnu18_a[] = {
+ 81.5195728368096659,
+ 25.11375537470259305,
+ -0.54962366347317668,
+ 0.07508565026117689,
+ -0.01262524908033818,
+ 0.00236850602019778,
+ -0.00047556873651929,
+ 0.00010001889347161,
+ -0.00002175581482429,
+ 4.85490251239e-6,
+ -1.10539483940e-6,
+ 2.5579853343e-7,
+ -5.999033352e-8,
+ 1.422747129e-8,
+ -3.40650521e-9,
+ 8.2233565e-10,
+ -1.9993286e-10,
+ 4.891426e-11,
+ -1.203343e-11,
+ 2.97498e-12,
+ -7.3875e-13,
+ 1.8418e-13,
+ -4.608e-14,
+ 1.157e-14,
+ -2.91e-15,
+ 7.4e-16
+};
+
+
+/* Chebyshev expansion: j_{nu,19} = c_k T_k*(nu/38), nu <= 38 */
+static const double coef_jnu19_a[] = {
+ 86.0930892477047512,
+ 26.51042598308271729,
+ -0.58002730731948358,
+ 0.07920674321589394,
+ -0.01331283320930301,
+ 0.00249650841778073,
+ -0.00050107453900793,
+ 0.00010534258471335,
+ -0.00002290511552874,
+ 5.10946148897e-6,
+ -1.16292517157e-6,
+ 2.6901365037e-7,
+ -6.306692473e-8,
+ 1.495183048e-8,
+ -3.57869025e-9,
+ 8.6360410e-10,
+ -2.0989514e-10,
+ 5.133439e-11,
+ -1.262465e-11,
+ 3.12013e-12,
+ -7.7455e-13,
+ 1.9304e-13,
+ -4.829e-14,
+ 1.212e-14,
+ -3.05e-15,
+ 7.7e-16
+};
+
+
+/* Chebyshev expansion: j_{nu,20} = c_k T_k*(nu/40), nu <= 40 */
+static const double coef_jnu20_a[] = {
+ 90.6666144195163770,
+ 27.9070938975436823,
+ -0.61043045315390591,
+ 0.08332772844325554,
+ -0.01400039260208282,
+ 0.00262450494035660,
+ -0.00052657891389470,
+ 0.00011066592304919,
+ -0.00002405432778364,
+ 5.36399803946e-6,
+ -1.22044976064e-6,
+ 2.8222728362e-7,
+ -6.614312964e-8,
+ 1.567608839e-8,
+ -3.75084856e-9,
+ 9.0486546e-10,
+ -2.1985553e-10,
+ 5.375401e-11,
+ -1.321572e-11,
+ 3.26524e-12,
+ -8.1033e-13,
+ 2.0190e-13,
+ -5.049e-14,
+ 1.267e-14,
+ -3.19e-15,
+ 8.0e-16,
+ -2.0e-16
+};
+
+
+static const double * coef_jnu_a[] = {
+ 0,
+ coef_jnu1_a,
+ coef_jnu2_a,
+ coef_jnu3_a,
+ coef_jnu4_a,
+ coef_jnu5_a,
+ coef_jnu6_a,
+ coef_jnu7_a,
+ coef_jnu8_a,
+ coef_jnu9_a,
+ coef_jnu10_a,
+ coef_jnu11_a,
+ coef_jnu12_a,
+ coef_jnu13_a,
+ coef_jnu14_a,
+ coef_jnu15_a,
+ coef_jnu16_a,
+ coef_jnu17_a,
+ coef_jnu18_a,
+ coef_jnu19_a,
+ coef_jnu20_a
+};
+
+static const size_t size_jnu_a[] = {
+ 0,
+ sizeof(coef_jnu1_a)/sizeof(double),
+ sizeof(coef_jnu2_a)/sizeof(double),
+ sizeof(coef_jnu3_a)/sizeof(double),
+ sizeof(coef_jnu4_a)/sizeof(double),
+ sizeof(coef_jnu5_a)/sizeof(double),
+ sizeof(coef_jnu6_a)/sizeof(double),
+ sizeof(coef_jnu7_a)/sizeof(double),
+ sizeof(coef_jnu8_a)/sizeof(double),
+ sizeof(coef_jnu9_a)/sizeof(double),
+ sizeof(coef_jnu10_a)/sizeof(double),
+ sizeof(coef_jnu11_a)/sizeof(double),
+ sizeof(coef_jnu12_a)/sizeof(double),
+ sizeof(coef_jnu13_a)/sizeof(double),
+ sizeof(coef_jnu14_a)/sizeof(double),
+ sizeof(coef_jnu15_a)/sizeof(double),
+ sizeof(coef_jnu16_a)/sizeof(double),
+ sizeof(coef_jnu17_a)/sizeof(double),
+ sizeof(coef_jnu18_a)/sizeof(double),
+ sizeof(coef_jnu19_a)/sizeof(double),
+ sizeof(coef_jnu20_a)/sizeof(double)
+};
+
+
+static const double * coef_jnu_b[] = {
+ 0,
+ coef_jnu1_b,
+ coef_jnu2_b,
+ coef_jnu3_b,
+ coef_jnu4_b,
+ coef_jnu5_b,
+ coef_jnu6_b,
+ coef_jnu7_b,
+ coef_jnu8_b,
+ coef_jnu9_b,
+ coef_jnu10_b
+};
+
+static const size_t size_jnu_b[] = {
+ 0,
+ sizeof(coef_jnu1_b)/sizeof(double),
+ sizeof(coef_jnu2_b)/sizeof(double),
+ sizeof(coef_jnu3_b)/sizeof(double),
+ sizeof(coef_jnu4_b)/sizeof(double),
+ sizeof(coef_jnu5_b)/sizeof(double),
+ sizeof(coef_jnu6_b)/sizeof(double),
+ sizeof(coef_jnu7_b)/sizeof(double),
+ sizeof(coef_jnu8_b)/sizeof(double),
+ sizeof(coef_jnu9_b)/sizeof(double),
+ sizeof(coef_jnu10_b)/sizeof(double)
+};
+
+
+
+/* Evaluate Clenshaw recurrence for
+ * a T* Chebyshev series.
+ * sizeof(c) = N+1
+ */
+static double
+clenshaw(const double * c, int N, double u)
+{
+ double B_np1 = 0.0;
+ double B_n = c[N];
+ double B_nm1;
+ int n;
+ for(n=N; n>0; n--) {
+ B_nm1 = 2.0*(2.0*u-1.0) * B_n - B_np1 + c[n-1];
+ B_np1 = B_n;
+ B_n = B_nm1;
+ }
+ return B_n - (2.0*u-1.0)*B_np1;
+}
+
+
+
+/* correction terms to leading McMahon expansion
+ * [Abramowitz+Stegun 9.5.12]
+ * [Olver, Royal Society Math. Tables, v. 7]
+ * We factor out a beta, so that this is a multiplicative
+ * correction:
+ * j_{nu,s} = beta(s,nu) * mcmahon_correction(nu, beta(s,nu))
+ * macmahon_correction --> 1 as s --> Inf
+ */
+static double
+mcmahon_correction(const double mu, const double beta)
+{
+ const double eb = 8.0*beta;
+ const double ebsq = eb*eb;
+
+ if(mu < GSL_DBL_EPSILON) {
+ /* Prevent division by zero below. */
+ const double term1 = 1.0/ebsq;
+ const double term2 = -4.0*31.0/(3*ebsq*ebsq);
+ const double term3 = 32.0*3779.0/(15.0*ebsq*ebsq*ebsq);
+ const double term4 = -64.0*6277237.0/(105.0*ebsq*ebsq*ebsq*ebsq);
+ const double term5 = 512.0*2092163573.0/(315.0*ebsq*ebsq*ebsq*ebsq*ebsq);
+ return 1.0 + 8.0*(term1 + term2 + term3 + term4 + term5);
+ }
+ else {
+ /* Here we do things in terms of 1/mu, which
+ * is purely to prevent overflow in the very
+ * unlikely case that mu is really big.
+ */
+ const double mi = 1.0/mu;
+ const double r = mu/ebsq;
+ const double n2 = 4.0/3.0 * (7.0 - 31.0*mi);
+ const double n3 = 32.0/15.0 * (83.0 + (-982.0 + 3779.0*mi)*mi);
+ const double n4 = 64.0/105.0 * (6949.0 + (-153855.0 + (1585743.0 - 6277237.0*mi)*mi)*mi);
+ const double n5 = 512.0/315.0 * (70197.0 + (-2479316.0 + (48010494.0 + (-512062548.0 + 2092163573.0*mi)*mi)*mi)*mi);
+ const double n6 = 2048.0/3465.0 * (5592657.0 + (-287149133.0 + (8903961290.0 + (-179289628602.0 + (1982611456181.0 - 8249725736393.0*mi)*mi)*mi)*mi)*mi);
+ const double term1 = (1.0 - mi) * r;
+ const double term2 = term1 * n2 * r;
+ const double term3 = term1 * n3 * r*r;
+ const double term4 = term1 * n4 * r*r*r;
+ const double term5 = term1 * n5 * r*r*r*r;
+ const double term6 = term1 * n6 * r*r*r*r*r;
+ return 1.0 - 8.0*(term1 + term2 + term3 + term4 + term5 + term6);
+ }
+}
+
+
+/* Assumes z >= 1.0 */
+static double
+olver_b0(double z, double minus_zeta)
+{
+ if(z < 1.02) {
+ const double a = 1.0-z;
+ const double c0 = 0.0179988721413553309252458658183;
+ const double c1 = 0.0111992982212877614645974276203;
+ const double c2 = 0.0059404069786014304317781160605;
+ const double c3 = 0.0028676724516390040844556450173;
+ const double c4 = 0.0012339189052567271708525111185;
+ const double c5 = 0.0004169250674535178764734660248;
+ const double c6 = 0.0000330173385085949806952777365;
+ const double c7 = -0.0001318076238578203009990106425;
+ const double c8 = -0.0001906870370050847239813945647;
+ return c0 + a*(c1 + a*(c2 + a*(c3 + a*(c4 + a*(c5 + a*(c6 + a*(c7 + a*c8)))))));
+ }
+ else {
+ const double abs_zeta = minus_zeta;
+ const double t = 1.0/(z*sqrt(1.0 - 1.0/(z*z)));
+ return -5.0/(48.0*abs_zeta*abs_zeta) + t*(3.0 + 5.0*t*t)/(24.0*sqrt(abs_zeta));
+ }
+}
+
+
+inline
+static double
+olver_f1(double z, double minus_zeta)
+{
+ const double b0 = olver_b0(z, minus_zeta);
+ const double h2 = sqrt(4.0*minus_zeta/(z*z-1.0)); /* FIXME */
+ return 0.5 * z * h2 * b0;
+}
+
+
+int
+gsl_sf_bessel_zero_J0_e(unsigned int s, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(s == 0){
+ result->val = 0.0;
+ result->err = 0.0;
+ GSL_ERROR ("error", GSL_EINVAL);
+ }
+ else {
+ /* See [F. Lether, J. Comp. Appl .Math. 67, 167 (1996)]. */
+
+ static const double P[] = { 1567450796.0/12539606369.0,
+ 8903660.0/2365861.0,
+ 10747040.0/536751.0,
+ 17590991.0/1696654.0
+ };
+ static const double Q[] = { 1.0,
+ 29354255.0/954518.0,
+ 76900001.0/431847.0,
+ 67237052.0/442411.0
+ };
+
+ const double beta = (s - 0.25) * M_PI;
+ const double bi2 = 1.0/(beta*beta);
+ const double R33num = P[0] + bi2 * (P[1] + bi2 * (P[2] + P[3] * bi2));
+ const double R33den = Q[0] + bi2 * (Q[1] + bi2 * (Q[2] + Q[3] * bi2));
+ const double R33 = R33num/R33den;
+ result->val = beta + R33/beta;
+ result->err = fabs(3.0e-15 * result->val);
+ return GSL_SUCCESS;
+ }
+}
+
+
+int
+gsl_sf_bessel_zero_J1_e(unsigned int s, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(s == 0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else {
+ /* See [M. Branders et al., J. Comp. Phys. 42, 403 (1981)]. */
+
+ static const double a[] = { -0.362804405737084,
+ 0.120341279038597,
+ 0.439454547101171e-01,
+ 0.159340088474713e-02
+ };
+ static const double b[] = { 1.0,
+ -0.325641790801361,
+ -0.117453445968927,
+ -0.424906902601794e-02
+ };
+
+ const double beta = (s + 0.25) * M_PI;
+ const double bi2 = 1.0/(beta*beta);
+ const double Rnum = a[3] + bi2 * (a[2] + bi2 * (a[1] + bi2 * a[0]));
+ const double Rden = b[3] + bi2 * (b[2] + bi2 * (b[1] + bi2 * b[0]));
+ const double R = Rnum/Rden;
+ result->val = beta * (1.0 + R*bi2);
+ result->err = fabs(2.0e-14 * result->val);
+ return GSL_SUCCESS;
+ }
+}
+
+
+int
+gsl_sf_bessel_zero_Jnu_e(double nu, unsigned int s, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(nu <= -1.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(s == 0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ if (nu == 0.0) {
+ GSL_ERROR ("no zero-th root for nu = 0.0", GSL_EINVAL);
+ }
+ return GSL_SUCCESS;
+ }
+ else if(nu < 0.0) {
+ /* This can be done, I'm just lazy now. */
+ result->val = 0.0;
+ result->err = 0.0;
+ GSL_ERROR("unimplemented", GSL_EUNIMPL);
+ }
+ else if(s == 1) {
+ /* Chebyshev fits for the first positive zero.
+ * For some reason Nemeth made this different from the others.
+ */
+ if(nu < 2.0) {
+ const double * c = coef_jnu_a[s];
+ const size_t L = size_jnu_a[s];
+ const double arg = nu/2.0;
+ const double chb = clenshaw(c, L-1, arg);
+ result->val = chb;
+ result->err = 2.0e-15 * result->val;
+ }
+ else {
+ const double * c = coef_jnu_b[s];
+ const size_t L = size_jnu_b[s];
+ const double arg = pow(2.0/nu, 2.0/3.0);
+ const double chb = clenshaw(c, L-1, arg);
+ result->val = nu * chb;
+ result->err = 2.0e-15 * result->val;
+ }
+ return GSL_SUCCESS;
+ }
+ else if(s <= 10) {
+ /* Chebyshev fits for the first 10 positive zeros. */
+ if(nu < s) {
+ const double * c = coef_jnu_a[s];
+ const size_t L = size_jnu_a[s];
+ const double arg = nu/s;
+ const double chb = clenshaw(c, L-1, arg);
+ result->val = chb;
+ result->err = 2.0e-15 * result->val;
+ }
+ else {
+ const double * c = coef_jnu_b[s];
+ const size_t L = size_jnu_b[s];
+ const double arg = pow(s/nu, 2.0/3.0);
+ const double chb = clenshaw(c, L-1, arg);
+ result->val = nu * chb;
+ result->err = 2.0e-15 * result->val;
+
+ /* FIXME: truth in advertising for the screwed up
+ * s = 5 fit. Need to fix that.
+ */
+ if(s == 5) {
+ result->err *= 5.0e+06;
+ }
+ }
+ return GSL_SUCCESS;
+ }
+ else if(s > 0.5*nu && s <= 20) {
+ /* Chebyshev fits for 10 < s <= 20. */
+ const double * c = coef_jnu_a[s];
+ const size_t L = size_jnu_a[s];
+ const double arg = nu/(2.0*s);
+ const double chb = clenshaw(c, L-1, arg);
+ result->val = chb;
+ result->err = 4.0e-15 * chb;
+ return GSL_SUCCESS;
+ }
+ else if(s > 2.0 * nu) {
+ /* McMahon expansion if s is large compared to nu. */
+ const double beta = (s + 0.5*nu - 0.25) * M_PI;
+ const double mc = mcmahon_correction(4.0*nu*nu, beta);
+ gsl_sf_result rat12;
+ gsl_sf_pow_int_e(nu/beta, 14, &rat12);
+ result->val = beta * mc;
+ result->err = 4.0 * fabs(beta) * rat12.val;
+ result->err += 4.0 * fabs(GSL_DBL_EPSILON * result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ /* Olver uniform asymptotic. */
+ gsl_sf_result as;
+ const int stat_as = gsl_sf_airy_zero_Ai_e(s, &as);
+ const double minus_zeta = -pow(nu,-2.0/3.0) * as.val;
+ const double z = gsl_sf_bessel_Olver_zofmzeta(minus_zeta);
+ const double f1 = olver_f1(z, minus_zeta);
+ result->val = nu * (z + f1/(nu*nu));
+ result->err = 0.001/(nu*nu*nu);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return stat_as;
+ }
+}
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_bessel_zero_J0(unsigned int s)
+{
+ EVAL_RESULT(gsl_sf_bessel_zero_J0_e(s, &result));
+}
+
+double gsl_sf_bessel_zero_J1(unsigned int s)
+{
+ EVAL_RESULT(gsl_sf_bessel_zero_J1_e(s, &result));
+}
+
+double gsl_sf_bessel_zero_Jnu(double nu, unsigned int s)
+{
+ EVAL_RESULT(gsl_sf_bessel_zero_Jnu_e(nu, s, &result));
+}
diff --git a/gsl-1.9/specfunc/beta.c b/gsl-1.9/specfunc/beta.c
new file mode 100644
index 0000000..47801a4
--- /dev/null
+++ b/gsl-1.9/specfunc/beta.c
@@ -0,0 +1,169 @@
+/* specfunc/beta.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_exp.h>
+#include <gsl/gsl_sf_log.h>
+#include <gsl/gsl_sf_psi.h>
+#include <gsl/gsl_sf_gamma.h>
+
+#include "error.h"
+
+static double
+isnegint (const double x)
+{
+ return (x < 0) && (x == floor(x));
+}
+
+int
+gsl_sf_lnbeta_e(const double x, const double y, gsl_sf_result * result)
+{
+ double sgn;
+ int status = gsl_sf_lnbeta_sgn_e(x,y,result,&sgn);
+ if (sgn == -1) {
+ DOMAIN_ERROR(result);
+ }
+ return status;
+}
+
+int
+gsl_sf_lnbeta_sgn_e(const double x, const double y, gsl_sf_result * result, double * sgn)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x == 0.0 || y == 0.0) {
+ *sgn = 0.0;
+ DOMAIN_ERROR(result);
+ } else if (isnegint(x) || isnegint(y)) {
+ *sgn = 0.0;
+ DOMAIN_ERROR(result); /* not defined for negative integers */
+ }
+
+ /* See if we can handle the postive case with min/max < 0.2 */
+
+ if (x > 0 && y > 0) {
+ const double max = GSL_MAX(x,y);
+ const double min = GSL_MIN(x,y);
+ const double rat = min/max;
+
+ if(rat < 0.2) {
+ /* min << max, so be careful
+ * with the subtraction
+ */
+ double lnpre_val;
+ double lnpre_err;
+ double lnpow_val;
+ double lnpow_err;
+ double t1, t2, t3;
+ gsl_sf_result lnopr;
+ gsl_sf_result gsx, gsy, gsxy;
+ gsl_sf_gammastar_e(x, &gsx);
+ gsl_sf_gammastar_e(y, &gsy);
+ gsl_sf_gammastar_e(x+y, &gsxy);
+ gsl_sf_log_1plusx_e(rat, &lnopr);
+ lnpre_val = log(gsx.val*gsy.val/gsxy.val * M_SQRT2*M_SQRTPI);
+ lnpre_err = gsx.err/gsx.val + gsy.err/gsy.val + gsxy.err/gsxy.val;
+ t1 = min*log(rat);
+ t2 = 0.5*log(min);
+ t3 = (x+y-0.5)*lnopr.val;
+ lnpow_val = t1 - t2 - t3;
+ lnpow_err = GSL_DBL_EPSILON * (fabs(t1) + fabs(t2) + fabs(t3));
+ lnpow_err += fabs(x+y-0.5) * lnopr.err;
+ result->val = lnpre_val + lnpow_val;
+ result->err = lnpre_err + lnpow_err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ *sgn = 1.0;
+ return GSL_SUCCESS;
+ }
+ }
+
+ /* General case - Fallback */
+ {
+ gsl_sf_result lgx, lgy, lgxy;
+ double sgx, sgy, sgxy, xy = x+y;
+ int stat_gx = gsl_sf_lngamma_sgn_e(x, &lgx, &sgx);
+ int stat_gy = gsl_sf_lngamma_sgn_e(y, &lgy, &sgy);
+ int stat_gxy = gsl_sf_lngamma_sgn_e(xy, &lgxy, &sgxy);
+ *sgn = sgx * sgy * sgxy;
+ result->val = lgx.val + lgy.val - lgxy.val;
+ result->err = lgx.err + lgy.err + lgxy.err;
+ result->err += GSL_DBL_EPSILON * (fabs(lgx.val) + fabs(lgy.val) + fabs(lgxy.val));
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_ERROR_SELECT_3(stat_gx, stat_gy, stat_gxy);
+ }
+}
+
+
+int
+gsl_sf_beta_e(const double x, const double y, gsl_sf_result * result)
+{
+ if((x > 0 && y > 0) && x < 50.0 && y < 50.0) {
+ /* Handle the easy case */
+ gsl_sf_result gx, gy, gxy;
+ gsl_sf_gamma_e(x, &gx);
+ gsl_sf_gamma_e(y, &gy);
+ gsl_sf_gamma_e(x+y, &gxy);
+ result->val = (gx.val*gy.val)/gxy.val;
+ result->err = gx.err * fabs(gy.val/gxy.val);
+ result->err += gy.err * fabs(gx.val/gxy.val);
+ result->err += fabs((gx.val*gy.val)/(gxy.val*gxy.val)) * gxy.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if (isnegint(x) || isnegint(y)) {
+ DOMAIN_ERROR(result);
+ } else if (isnegint(x+y)) { /* infinity in the denominator */
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ } else {
+ gsl_sf_result lb;
+ double sgn;
+ int stat_lb = gsl_sf_lnbeta_sgn_e(x, y, &lb, &sgn);
+ if(stat_lb == GSL_SUCCESS) {
+ int status = gsl_sf_exp_err_e(lb.val, lb.err, result);
+ result->val *= sgn;
+ return status;
+ }
+ else {
+ result->val = 0.0;
+ result->err = 0.0;
+ return stat_lb;
+ }
+ }
+}
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_lnbeta(const double x, const double y)
+{
+ EVAL_RESULT(gsl_sf_lnbeta_e(x, y, &result));
+}
+
+double gsl_sf_beta(const double x, const double y)
+{
+ EVAL_RESULT(gsl_sf_beta_e(x, y, &result));
+}
diff --git a/gsl-1.9/specfunc/beta_inc.c b/gsl-1.9/specfunc/beta_inc.c
new file mode 100644
index 0000000..bd840b6
--- /dev/null
+++ b/gsl-1.9/specfunc/beta_inc.c
@@ -0,0 +1,180 @@
+/* specfunc/beta_inc.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_log.h>
+#include <gsl/gsl_sf_exp.h>
+#include <gsl/gsl_sf_gamma.h>
+
+#include "error.h"
+#include "check.h"
+
+static
+int
+beta_cont_frac(
+ const double a,
+ const double b,
+ const double x,
+ gsl_sf_result * result
+ )
+{
+ const unsigned int max_iter = 512; /* control iterations */
+ const double cutoff = 2.0 * GSL_DBL_MIN; /* control the zero cutoff */
+ unsigned int iter_count = 0;
+ double cf;
+
+ /* standard initialization for continued fraction */
+ double num_term = 1.0;
+ double den_term = 1.0 - (a+b)*x/(a+1.0);
+ if (fabs(den_term) < cutoff) den_term = cutoff;
+ den_term = 1.0/den_term;
+ cf = den_term;
+
+ while(iter_count < max_iter) {
+ const int k = iter_count + 1;
+ double coeff = k*(b-k)*x/(((a-1.0)+2*k)*(a+2*k));
+ double delta_frac;
+
+ /* first step */
+ den_term = 1.0 + coeff*den_term;
+ num_term = 1.0 + coeff/num_term;
+ if(fabs(den_term) < cutoff) den_term = cutoff;
+ if(fabs(num_term) < cutoff) num_term = cutoff;
+ den_term = 1.0/den_term;
+
+ delta_frac = den_term * num_term;
+ cf *= delta_frac;
+
+ coeff = -(a+k)*(a+b+k)*x/((a+2*k)*(a+2*k+1.0));
+
+ /* second step */
+ den_term = 1.0 + coeff*den_term;
+ num_term = 1.0 + coeff/num_term;
+ if(fabs(den_term) < cutoff) den_term = cutoff;
+ if(fabs(num_term) < cutoff) num_term = cutoff;
+ den_term = 1.0/den_term;
+
+ delta_frac = den_term*num_term;
+ cf *= delta_frac;
+
+ if(fabs(delta_frac-1.0) < 2.0*GSL_DBL_EPSILON) break;
+
+ ++iter_count;
+ }
+
+ result->val = cf;
+ result->err = iter_count * 4.0 * GSL_DBL_EPSILON * fabs(cf);
+
+ if(iter_count >= max_iter)
+ GSL_ERROR ("error", GSL_EMAXITER);
+ else
+ return GSL_SUCCESS;
+}
+
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int
+gsl_sf_beta_inc_e(
+ const double a,
+ const double b,
+ const double x,
+ gsl_sf_result * result
+ )
+{
+ if(a <= 0.0 || b <= 0.0 || x < 0.0 || x > 1.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x == 0.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(x == 1.0) {
+ result->val = 1.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else {
+ gsl_sf_result ln_beta;
+ gsl_sf_result ln_x;
+ gsl_sf_result ln_1mx;
+ gsl_sf_result prefactor;
+ const int stat_ln_beta = gsl_sf_lnbeta_e(a, b, &ln_beta);
+ const int stat_ln_1mx = gsl_sf_log_1plusx_e(-x, &ln_1mx);
+ const int stat_ln_x = gsl_sf_log_e(x, &ln_x);
+ const int stat_ln = GSL_ERROR_SELECT_3(stat_ln_beta, stat_ln_1mx, stat_ln_x);
+
+ const double ln_pre_val = -ln_beta.val + a * ln_x.val + b * ln_1mx.val;
+ const double ln_pre_err = ln_beta.err + fabs(a*ln_x.err) + fabs(b*ln_1mx.err);
+ const int stat_exp = gsl_sf_exp_err_e(ln_pre_val, ln_pre_err, &prefactor);
+
+ if(stat_ln != GSL_SUCCESS) {
+ result->val = 0.0;
+ result->err = 0.0;
+ GSL_ERROR ("error", GSL_ESANITY);
+ }
+
+ if(x < (a + 1.0)/(a+b+2.0)) {
+ /* Apply continued fraction directly. */
+ gsl_sf_result cf;
+ const int stat_cf = beta_cont_frac(a, b, x, &cf);
+ int stat;
+ result->val = prefactor.val * cf.val / a;
+ result->err = (fabs(prefactor.err * cf.val) + fabs(prefactor.val * cf.err))/a;
+
+ stat = GSL_ERROR_SELECT_2(stat_exp, stat_cf);
+ if(stat == GSL_SUCCESS) {
+ CHECK_UNDERFLOW(result);
+ }
+ return stat;
+ }
+ else {
+ /* Apply continued fraction after hypergeometric transformation. */
+ gsl_sf_result cf;
+ const int stat_cf = beta_cont_frac(b, a, 1.0-x, &cf);
+ int stat;
+ const double term = prefactor.val * cf.val / b;
+ result->val = 1.0 - term;
+ result->err = fabs(prefactor.err * cf.val)/b;
+ result->err += fabs(prefactor.val * cf.err)/b;
+ result->err += 2.0 * GSL_DBL_EPSILON * (1.0 + fabs(term));
+ stat = GSL_ERROR_SELECT_2(stat_exp, stat_cf);
+ if(stat == GSL_SUCCESS) {
+ CHECK_UNDERFLOW(result);
+ }
+ return stat;
+ }
+ }
+}
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_beta_inc(const double a, const double b, const double x)
+{
+ EVAL_RESULT(gsl_sf_beta_inc_e(a, b, x, &result));
+}
diff --git a/gsl-1.9/specfunc/cheb_eval.c b/gsl-1.9/specfunc/cheb_eval.c
new file mode 100644
index 0000000..a659ecb
--- /dev/null
+++ b/gsl-1.9/specfunc/cheb_eval.c
@@ -0,0 +1,34 @@
+
+static inline int
+cheb_eval_e(const cheb_series * cs,
+ const double x,
+ gsl_sf_result * result)
+{
+ int j;
+ double d = 0.0;
+ double dd = 0.0;
+
+ double y = (2.0*x - cs->a - cs->b) / (cs->b - cs->a);
+ double y2 = 2.0 * y;
+
+ double e = 0.0;
+
+ for(j = cs->order; j>=1; j--) {
+ double temp = d;
+ d = y2*d - dd + cs->c[j];
+ e += fabs(y2*temp) + fabs(dd) + fabs(cs->c[j]);
+ dd = temp;
+ }
+
+ {
+ double temp = d;
+ d = y*d - dd + 0.5 * cs->c[0];
+ e += fabs(y*temp) + fabs(dd) + 0.5 * fabs(cs->c[0]);
+ }
+
+ result->val = d;
+ result->err = GSL_DBL_EPSILON * e + fabs(cs->c[cs->order]);
+
+ return GSL_SUCCESS;
+}
+
diff --git a/gsl-1.9/specfunc/cheb_eval_mode.c b/gsl-1.9/specfunc/cheb_eval_mode.c
new file mode 100644
index 0000000..80127de
--- /dev/null
+++ b/gsl-1.9/specfunc/cheb_eval_mode.c
@@ -0,0 +1,30 @@
+static inline int
+cheb_eval_mode_e(const cheb_series * cs,
+ const double x,
+ gsl_mode_t mode,
+ gsl_sf_result * result)
+{
+ int j;
+ double d = 0.0;
+ double dd = 0.0;
+
+ double y = (2.*x - cs->a - cs->b) / (cs->b - cs->a);
+ double y2 = 2.0 * y;
+
+ int eval_order;
+
+ if(GSL_MODE_PREC(mode) == GSL_PREC_DOUBLE)
+ eval_order = cs->order;
+ else
+ eval_order = cs->order_sp;
+
+ for(j = eval_order; j>=1; j--) {
+ double temp = d;
+ d = y2*d - dd + cs->c[j];
+ dd = temp;
+ }
+
+ result->val = y*d - dd + 0.5 * cs->c[0];
+ result->err = GSL_DBL_EPSILON * fabs(result->val) + fabs(cs->c[eval_order]);
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/specfunc/chebyshev.h b/gsl-1.9/specfunc/chebyshev.h
new file mode 100644
index 0000000..a820d66
--- /dev/null
+++ b/gsl-1.9/specfunc/chebyshev.h
@@ -0,0 +1,31 @@
+/* specfunc/chebyshev.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* data for a Chebyshev series over a given interval */
+
+struct cheb_series_struct {
+ double * c; /* coefficients */
+ int order; /* order of expansion */
+ double a; /* lower interval point */
+ double b; /* upper interval point */
+ int order_sp; /* effective single precision order */
+};
+typedef struct cheb_series_struct cheb_series;
+
+
diff --git a/gsl-1.9/specfunc/check.h b/gsl-1.9/specfunc/check.h
new file mode 100644
index 0000000..df6eee6
--- /dev/null
+++ b/gsl-1.9/specfunc/check.h
@@ -0,0 +1,3 @@
+/* check for underflow */
+
+#define CHECK_UNDERFLOW(r) if (fabs((r)->val) < GSL_DBL_MIN) GSL_ERROR("underflow", GSL_EUNDRFLW);
diff --git a/gsl-1.9/specfunc/clausen.c b/gsl-1.9/specfunc/clausen.c
new file mode 100644
index 0000000..87632f1
--- /dev/null
+++ b/gsl-1.9/specfunc/clausen.c
@@ -0,0 +1,111 @@
+/* specfunc/clausen.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_trig.h>
+#include <gsl/gsl_sf_clausen.h>
+
+#include "chebyshev.h"
+#include "cheb_eval.c"
+
+static double aclaus_data[15] = {
+ 2.142694363766688447e+00,
+ 0.723324281221257925e-01,
+ 0.101642475021151164e-02,
+ 0.3245250328531645e-04,
+ 0.133315187571472e-05,
+ 0.6213240591653e-07,
+ 0.313004135337e-08,
+ 0.16635723056e-09,
+ 0.919659293e-11,
+ 0.52400462e-12,
+ 0.3058040e-13,
+ 0.18197e-14,
+ 0.1100e-15,
+ 0.68e-17,
+ 0.4e-18
+};
+static cheb_series aclaus_cs = {
+ aclaus_data,
+ 14,
+ -1, 1,
+ 8 /* FIXME: this is a guess, correct value needed here BJG */
+};
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int gsl_sf_clausen_e(double x, gsl_sf_result *result)
+{
+ const double x_cut = M_PI * GSL_SQRT_DBL_EPSILON;
+
+ double sgn = 1.0;
+ int status_red;
+
+ if(x < 0.0) {
+ x = -x;
+ sgn = -1.0;
+ }
+
+ /* Argument reduction to [0, 2pi) */
+ status_red = gsl_sf_angle_restrict_pos_e(&x);
+
+ /* Further reduction to [0,pi) */
+ if(x > M_PI) {
+ /* simulated extra precision: 2PI = p0 + p1 */
+ const double p0 = 6.28125;
+ const double p1 = 0.19353071795864769253e-02;
+ x = (p0 - x) + p1;
+ sgn = -sgn;
+ }
+
+ if(x == 0.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ }
+ else if(x < x_cut) {
+ result->val = x * (1.0 - log(x));
+ result->err = x * GSL_DBL_EPSILON;
+ }
+ else {
+ const double t = 2.0*(x*x / (M_PI*M_PI) - 0.5);
+ gsl_sf_result result_c;
+ cheb_eval_e(&aclaus_cs, t, &result_c);
+ result->val = x * (result_c.val - log(x));
+ result->err = x * (result_c.err + GSL_DBL_EPSILON);
+ }
+
+ result->val *= sgn;
+
+ return status_red;
+}
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_clausen(const double x)
+{
+ EVAL_RESULT(gsl_sf_clausen_e(x, &result));
+}
diff --git a/gsl-1.9/specfunc/coulomb.c b/gsl-1.9/specfunc/coulomb.c
new file mode 100644
index 0000000..7c68076
--- /dev/null
+++ b/gsl-1.9/specfunc/coulomb.c
@@ -0,0 +1,1417 @@
+/* specfunc/coulomb.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+/* Evaluation of Coulomb wave functions F_L(eta, x), G_L(eta, x),
+ * and their derivatives. A combination of Steed's method, asymptotic
+ * results, and power series.
+ *
+ * Steed's method:
+ * [Barnett, CPC 21, 297 (1981)]
+ * Power series and other methods:
+ * [Biedenharn et al., PR 97, 542 (1954)]
+ * [Bardin et al., CPC 3, 73 (1972)]
+ * [Abad+Sesma, CPC 71, 110 (1992)]
+ */
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_exp.h>
+#include <gsl/gsl_sf_psi.h>
+#include <gsl/gsl_sf_airy.h>
+#include <gsl/gsl_sf_pow_int.h>
+#include <gsl/gsl_sf_gamma.h>
+#include <gsl/gsl_sf_coulomb.h>
+
+#include "error.h"
+
+/* the L=0 normalization constant
+ * [Abramowitz+Stegun 14.1.8]
+ */
+static
+double
+C0sq(double eta)
+{
+ double twopieta = 2.0*M_PI*eta;
+
+ if(fabs(eta) < GSL_DBL_EPSILON) {
+ return 1.0;
+ }
+ else if(twopieta > GSL_LOG_DBL_MAX) {
+ return 0.0;
+ }
+ else {
+ gsl_sf_result scale;
+ gsl_sf_expm1_e(twopieta, &scale);
+ return twopieta/scale.val;
+ }
+}
+
+
+/* the full definition of C_L(eta) for any valid L and eta
+ * [Abramowitz and Stegun 14.1.7]
+ * This depends on the complex gamma function. For large
+ * arguments the phase of the complex gamma function is not
+ * very accurately determined. However the modulus is, and that
+ * is all that we need to calculate C_L.
+ *
+ * This is not valid for L <= -3/2 or L = -1.
+ */
+static
+int
+CLeta(double L, double eta, gsl_sf_result * result)
+{
+ gsl_sf_result ln1; /* log of numerator Gamma function */
+ gsl_sf_result ln2; /* log of denominator Gamma function */
+ double sgn = 1.0;
+ double arg_val, arg_err;
+
+ if(fabs(eta/(L+1.0)) < GSL_DBL_EPSILON) {
+ gsl_sf_lngamma_e(L+1.0, &ln1);
+ }
+ else {
+ gsl_sf_result p1; /* phase of numerator Gamma -- not used */
+ gsl_sf_lngamma_complex_e(L+1.0, eta, &ln1, &p1); /* should be ok */
+ }
+
+ gsl_sf_lngamma_e(2.0*(L+1.0), &ln2);
+ if(L < -1.0) sgn = -sgn;
+
+ arg_val = L*M_LN2 - 0.5*eta*M_PI + ln1.val - ln2.val;
+ arg_err = ln1.err + ln2.err;
+ arg_err += GSL_DBL_EPSILON * (fabs(L*M_LN2) + fabs(0.5*eta*M_PI));
+ return gsl_sf_exp_err_e(arg_val, arg_err, result);
+}
+
+
+int
+gsl_sf_coulomb_CL_e(double lam, double eta, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(lam <= -1.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(fabs(lam) < GSL_DBL_EPSILON) {
+ /* saves a calculation of complex_lngamma(), otherwise not necessary */
+ result->val = sqrt(C0sq(eta));
+ result->err = 2.0 * GSL_DBL_EPSILON * result->val;
+ return GSL_SUCCESS;
+ }
+ else {
+ return CLeta(lam, eta, result);
+ }
+}
+
+
+/* cl[0] .. cl[kmax] = C_{lam_min}(eta) .. C_{lam_min+kmax}(eta)
+ */
+int
+gsl_sf_coulomb_CL_array(double lam_min, int kmax, double eta, double * cl)
+{
+ int k;
+ gsl_sf_result cl_0;
+ gsl_sf_coulomb_CL_e(lam_min, eta, &cl_0);
+ cl[0] = cl_0.val;
+
+ for(k=1; k<=kmax; k++) {
+ double L = lam_min + k;
+ cl[k] = cl[k-1] * hypot(L, eta)/(L*(2.0*L+1.0));
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+/* Evaluate the series for Phi_L(eta,x) and Phi_L*(eta,x)
+ * [Abramowitz+Stegun 14.1.5]
+ * [Abramowitz+Stegun 14.1.13]
+ *
+ * The sequence of coefficients A_k^L is
+ * manifestly well-controlled for L >= -1/2
+ * and eta < 10.
+ *
+ * This makes sense since this is the region
+ * away from threshold, and you expect
+ * the evaluation to become easier as you
+ * get farther from threshold.
+ *
+ * Empirically, this is quite well-behaved for
+ * L >= -1/2
+ * eta < 10
+ * x < 10
+ */
+#if 0
+static
+int
+coulomb_Phi_series(const double lam, const double eta, const double x,
+ double * result, double * result_star)
+{
+ int kmin = 5;
+ int kmax = 200;
+ int k;
+ double Akm2 = 1.0;
+ double Akm1 = eta/(lam+1.0);
+ double Ak;
+
+ double xpow = x;
+ double sum = Akm2 + Akm1*x;
+ double sump = (lam+1.0)*Akm2 + (lam+2.0)*Akm1*x;
+ double prev_abs_del = fabs(Akm1*x);
+ double prev_abs_del_p = (lam+2.0) * prev_abs_del;
+
+ for(k=2; k<kmax; k++) {
+ double del;
+ double del_p;
+ double abs_del;
+ double abs_del_p;
+
+ Ak = (2.0*eta*Akm1 - Akm2)/(k*(2.0*lam + 1.0 + k));
+
+ xpow *= x;
+ del = Ak*xpow;
+ del_p = (k+lam+1.0)*del;
+ sum += del;
+ sump += del_p;
+
+ abs_del = fabs(del);
+ abs_del_p = fabs(del_p);
+
+ if( abs_del/(fabs(sum)+abs_del) < GSL_DBL_EPSILON
+ && prev_abs_del/(fabs(sum)+prev_abs_del) < GSL_DBL_EPSILON
+ && abs_del_p/(fabs(sump)+abs_del_p) < GSL_DBL_EPSILON
+ && prev_abs_del_p/(fabs(sump)+prev_abs_del_p) < GSL_DBL_EPSILON
+ && k > kmin
+ ) break;
+
+ /* We need to keep track of the previous delta because when
+ * eta is near zero the odd terms of the sum are very small
+ * and this could lead to premature termination.
+ */
+ prev_abs_del = abs_del;
+ prev_abs_del_p = abs_del_p;
+
+ Akm2 = Akm1;
+ Akm1 = Ak;
+ }
+
+ *result = sum;
+ *result_star = sump;
+
+ if(k==kmax) {
+ GSL_ERROR ("error", GSL_EMAXITER);
+ }
+ else {
+ return GSL_SUCCESS;
+ }
+}
+#endif /* 0 */
+
+
+/* Determine the connection phase, phi_lambda.
+ * See coulomb_FG_series() below. We have
+ * to be careful about sin(phi)->0. Note that
+ * there is an underflow condition for large
+ * positive eta in any case.
+ */
+static
+int
+coulomb_connection(const double lam, const double eta,
+ double * cos_phi, double * sin_phi)
+{
+ if(eta > -GSL_LOG_DBL_MIN/2.0*M_PI-1.0) {
+ *cos_phi = 1.0;
+ *sin_phi = 0.0;
+ GSL_ERROR ("error", GSL_EUNDRFLW);
+ }
+ else if(eta > -GSL_LOG_DBL_EPSILON/(4.0*M_PI)) {
+ const double eps = 2.0 * exp(-2.0*M_PI*eta);
+ const double tpl = tan(M_PI * lam);
+ const double dth = eps * tpl / (tpl*tpl + 1.0);
+ *cos_phi = -1.0 + 0.5 * dth*dth;
+ *sin_phi = -dth;
+ return GSL_SUCCESS;
+ }
+ else {
+ double X = tanh(M_PI * eta) / tan(M_PI * lam);
+ double phi = -atan(X) - (lam + 0.5) * M_PI;
+ *cos_phi = cos(phi);
+ *sin_phi = sin(phi);
+ return GSL_SUCCESS;
+ }
+}
+
+
+/* Evaluate the Frobenius series for F_lam(eta,x) and G_lam(eta,x).
+ * Homegrown algebra. Evaluates the series for F_{lam} and
+ * F_{-lam-1}, then uses
+ * G_{lam} = (F_{lam} cos(phi) - F_{-lam-1}) / sin(phi)
+ * where
+ * phi = Arg[Gamma[1+lam+I eta]] - Arg[Gamma[-lam + I eta]] - (lam+1/2)Pi
+ * = Arg[Sin[Pi(-lam+I eta)] - (lam+1/2)Pi
+ * = atan2(-cos(lam Pi)sinh(eta Pi), -sin(lam Pi)cosh(eta Pi)) - (lam+1/2)Pi
+ *
+ * = -atan(X) - (lam+1/2) Pi, X = tanh(eta Pi)/tan(lam Pi)
+ *
+ * Not appropriate for lam <= -1/2, lam = 0, or lam >= 1/2.
+ */
+static
+int
+coulomb_FG_series(const double lam, const double eta, const double x,
+ gsl_sf_result * F, gsl_sf_result * G)
+{
+ const int max_iter = 800;
+ gsl_sf_result ClamA;
+ gsl_sf_result ClamB;
+ int stat_A = CLeta(lam, eta, &ClamA);
+ int stat_B = CLeta(-lam-1.0, eta, &ClamB);
+ const double tlp1 = 2.0*lam + 1.0;
+ const double pow_x = pow(x, lam);
+ double cos_phi_lam;
+ double sin_phi_lam;
+
+ double uA_mm2 = 1.0; /* uA sum is for F_{lam} */
+ double uA_mm1 = x*eta/(lam+1.0);
+ double uA_m;
+ double uB_mm2 = 1.0; /* uB sum is for F_{-lam-1} */
+ double uB_mm1 = -x*eta/lam;
+ double uB_m;
+ double A_sum = uA_mm2 + uA_mm1;
+ double B_sum = uB_mm2 + uB_mm1;
+ double A_abs_del_prev = fabs(A_sum);
+ double B_abs_del_prev = fabs(B_sum);
+ gsl_sf_result FA, FB;
+ int m = 2;
+
+ int stat_conn = coulomb_connection(lam, eta, &cos_phi_lam, &sin_phi_lam);
+
+ if(stat_conn == GSL_EUNDRFLW) {
+ F->val = 0.0; /* FIXME: should this be set to Inf too like G? */
+ F->err = 0.0;
+ OVERFLOW_ERROR(G);
+ }
+
+ while(m < max_iter) {
+ double abs_dA;
+ double abs_dB;
+ uA_m = x*(2.0*eta*uA_mm1 - x*uA_mm2)/(m*(m+tlp1));
+ uB_m = x*(2.0*eta*uB_mm1 - x*uB_mm2)/(m*(m-tlp1));
+ A_sum += uA_m;
+ B_sum += uB_m;
+ abs_dA = fabs(uA_m);
+ abs_dB = fabs(uB_m);
+ if(m > 15) {
+ /* Don't bother checking until we have gone out a little ways;
+ * a minor optimization. Also make sure to check both the
+ * current and the previous increment because the odd and even
+ * terms of the sum can have very different behaviour, depending
+ * on the value of eta.
+ */
+ double max_abs_dA = GSL_MAX(abs_dA, A_abs_del_prev);
+ double max_abs_dB = GSL_MAX(abs_dB, B_abs_del_prev);
+ double abs_A = fabs(A_sum);
+ double abs_B = fabs(B_sum);
+ if( max_abs_dA/(max_abs_dA + abs_A) < 4.0*GSL_DBL_EPSILON
+ && max_abs_dB/(max_abs_dB + abs_B) < 4.0*GSL_DBL_EPSILON
+ ) break;
+ }
+ A_abs_del_prev = abs_dA;
+ B_abs_del_prev = abs_dB;
+ uA_mm2 = uA_mm1;
+ uA_mm1 = uA_m;
+ uB_mm2 = uB_mm1;
+ uB_mm1 = uB_m;
+ m++;
+ }
+
+ FA.val = A_sum * ClamA.val * pow_x * x;
+ FA.err = fabs(A_sum) * ClamA.err * pow_x * x + 2.0*GSL_DBL_EPSILON*fabs(FA.val);
+ FB.val = B_sum * ClamB.val / pow_x;
+ FB.err = fabs(B_sum) * ClamB.err / pow_x + 2.0*GSL_DBL_EPSILON*fabs(FB.val);
+
+ F->val = FA.val;
+ F->err = FA.err;
+
+ G->val = (FA.val * cos_phi_lam - FB.val)/sin_phi_lam;
+ G->err = (FA.err * fabs(cos_phi_lam) + FB.err)/fabs(sin_phi_lam);
+
+ if(m >= max_iter)
+ GSL_ERROR ("error", GSL_EMAXITER);
+ else
+ return GSL_ERROR_SELECT_2(stat_A, stat_B);
+}
+
+
+/* Evaluate the Frobenius series for F_0(eta,x) and G_0(eta,x).
+ * See [Bardin et al., CPC 3, 73 (1972), (14)-(17)];
+ * note the misprint in (17): nu_0=1 is correct, not nu_0=0.
+ */
+static
+int
+coulomb_FG0_series(const double eta, const double x,
+ gsl_sf_result * F, gsl_sf_result * G)
+{
+ const int max_iter = 800;
+ const double x2 = x*x;
+ const double tex = 2.0*eta*x;
+ gsl_sf_result C0;
+ int stat_CL = CLeta(0.0, eta, &C0);
+ gsl_sf_result r1pie;
+ int psi_stat = gsl_sf_psi_1piy_e(eta, &r1pie);
+ double u_mm2 = 0.0; /* u_0 */
+ double u_mm1 = x; /* u_1 */
+ double u_m;
+ double v_mm2 = 1.0; /* nu_0 */
+ double v_mm1 = tex*(2.0*M_EULER-1.0+r1pie.val); /* nu_1 */
+ double v_m;
+ double u_sum = u_mm2 + u_mm1;
+ double v_sum = v_mm2 + v_mm1;
+ double u_abs_del_prev = fabs(u_sum);
+ double v_abs_del_prev = fabs(v_sum);
+ int m = 2;
+ double u_sum_err = 2.0 * GSL_DBL_EPSILON * fabs(u_sum);
+ double v_sum_err = 2.0 * GSL_DBL_EPSILON * fabs(v_sum);
+ double ln2x = log(2.0*x);
+
+ while(m < max_iter) {
+ double abs_du;
+ double abs_dv;
+ double m_mm1 = m*(m-1.0);
+ u_m = (tex*u_mm1 - x2*u_mm2)/m_mm1;
+ v_m = (tex*v_mm1 - x2*v_mm2 - 2.0*eta*(2*m-1)*u_m)/m_mm1;
+ u_sum += u_m;
+ v_sum += v_m;
+ abs_du = fabs(u_m);
+ abs_dv = fabs(v_m);
+ u_sum_err += 2.0 * GSL_DBL_EPSILON * abs_du;
+ v_sum_err += 2.0 * GSL_DBL_EPSILON * abs_dv;
+ if(m > 15) {
+ /* Don't bother checking until we have gone out a little ways;
+ * a minor optimization. Also make sure to check both the
+ * current and the previous increment because the odd and even
+ * terms of the sum can have very different behaviour, depending
+ * on the value of eta.
+ */
+ double max_abs_du = GSL_MAX(abs_du, u_abs_del_prev);
+ double max_abs_dv = GSL_MAX(abs_dv, v_abs_del_prev);
+ double abs_u = fabs(u_sum);
+ double abs_v = fabs(v_sum);
+ if( max_abs_du/(max_abs_du + abs_u) < 40.0*GSL_DBL_EPSILON
+ && max_abs_dv/(max_abs_dv + abs_v) < 40.0*GSL_DBL_EPSILON
+ ) break;
+ }
+ u_abs_del_prev = abs_du;
+ v_abs_del_prev = abs_dv;
+ u_mm2 = u_mm1;
+ u_mm1 = u_m;
+ v_mm2 = v_mm1;
+ v_mm1 = v_m;
+ m++;
+ }
+
+ F->val = C0.val * u_sum;
+ F->err = C0.err * fabs(u_sum);
+ F->err += fabs(C0.val) * u_sum_err;
+ F->err += 2.0 * GSL_DBL_EPSILON * fabs(F->val);
+
+ G->val = (v_sum + 2.0*eta*u_sum * ln2x) / C0.val;
+ G->err = (fabs(v_sum) + fabs(2.0*eta*u_sum * ln2x)) / fabs(C0.val) * fabs(C0.err/C0.val);
+ G->err += (v_sum_err + fabs(2.0*eta*u_sum_err*ln2x)) / fabs(C0.val);
+ G->err += 2.0 * GSL_DBL_EPSILON * fabs(G->val);
+
+ if(m == max_iter)
+ GSL_ERROR ("error", GSL_EMAXITER);
+ else
+ return GSL_ERROR_SELECT_2(psi_stat, stat_CL);
+}
+
+
+/* Evaluate the Frobenius series for F_{-1/2}(eta,x) and G_{-1/2}(eta,x).
+ * Homegrown algebra.
+ */
+static
+int
+coulomb_FGmhalf_series(const double eta, const double x,
+ gsl_sf_result * F, gsl_sf_result * G)
+{
+ const int max_iter = 800;
+ const double rx = sqrt(x);
+ const double x2 = x*x;
+ const double tex = 2.0*eta*x;
+ gsl_sf_result Cmhalf;
+ int stat_CL = CLeta(-0.5, eta, &Cmhalf);
+ double u_mm2 = 1.0; /* u_0 */
+ double u_mm1 = tex * u_mm2; /* u_1 */
+ double u_m;
+ double v_mm2, v_mm1, v_m;
+ double f_sum, g_sum;
+ double tmp1;
+ gsl_sf_result rpsi_1pe;
+ gsl_sf_result rpsi_1p2e;
+ int m = 2;
+
+ gsl_sf_psi_1piy_e(eta, &rpsi_1pe);
+ gsl_sf_psi_1piy_e(2.0*eta, &rpsi_1p2e);
+
+ v_mm2 = 2.0*M_EULER - M_LN2 - rpsi_1pe.val + 2.0*rpsi_1p2e.val;
+ v_mm1 = tex*(v_mm2 - 2.0*u_mm2);
+
+ f_sum = u_mm2 + u_mm1;
+ g_sum = v_mm2 + v_mm1;
+
+ while(m < max_iter) {
+ double m2 = m*m;
+ u_m = (tex*u_mm1 - x2*u_mm2)/m2;
+ v_m = (tex*v_mm1 - x2*v_mm2 - 2.0*m*u_m)/m2;
+ f_sum += u_m;
+ g_sum += v_m;
+ if( f_sum != 0.0
+ && g_sum != 0.0
+ && (fabs(u_m/f_sum) + fabs(v_m/g_sum) < 10.0*GSL_DBL_EPSILON)) break;
+ u_mm2 = u_mm1;
+ u_mm1 = u_m;
+ v_mm2 = v_mm1;
+ v_mm1 = v_m;
+ m++;
+ }
+
+ F->val = Cmhalf.val * rx * f_sum;
+ F->err = Cmhalf.err * fabs(rx * f_sum) + 2.0*GSL_DBL_EPSILON*fabs(F->val);
+
+ tmp1 = f_sum*log(x);
+ G->val = -rx*(tmp1 + g_sum)/Cmhalf.val;
+ G->err = fabs(rx)*(fabs(tmp1) + fabs(g_sum))/fabs(Cmhalf.val) * fabs(Cmhalf.err/Cmhalf.val);
+
+ if(m == max_iter)
+ GSL_ERROR ("error", GSL_EMAXITER);
+ else
+ return stat_CL;
+}
+
+
+/* Evolve the backwards recurrence for F,F'.
+ *
+ * F_{lam-1} = (S_lam F_lam + F_lam') / R_lam
+ * F_{lam-1}' = (S_lam F_{lam-1} - R_lam F_lam)
+ * where
+ * R_lam = sqrt(1 + (eta/lam)^2)
+ * S_lam = lam/x + eta/lam
+ *
+ */
+static
+int
+coulomb_F_recur(double lam_min, int kmax,
+ double eta, double x,
+ double F_lam_max, double Fp_lam_max,
+ double * F_lam_min, double * Fp_lam_min
+ )
+{
+ double x_inv = 1.0/x;
+ double fcl = F_lam_max;
+ double fpl = Fp_lam_max;
+ double lam_max = lam_min + kmax;
+ double lam = lam_max;
+ int k;
+
+ for(k=kmax-1; k>=0; k--) {
+ double el = eta/lam;
+ double rl = hypot(1.0, el);
+ double sl = el + lam*x_inv;
+ double fc_lm1;
+ fc_lm1 = (fcl*sl + fpl)/rl;
+ fpl = fc_lm1*sl - fcl*rl;
+ fcl = fc_lm1;
+ lam -= 1.0;
+ }
+
+ *F_lam_min = fcl;
+ *Fp_lam_min = fpl;
+ return GSL_SUCCESS;
+}
+
+
+/* Evolve the forward recurrence for G,G'.
+ *
+ * G_{lam+1} = (S_lam G_lam - G_lam')/R_lam
+ * G_{lam+1}' = R_{lam+1} G_lam - S_lam G_{lam+1}
+ *
+ * where S_lam and R_lam are as above in the F recursion.
+ */
+static
+int
+coulomb_G_recur(const double lam_min, const int kmax,
+ const double eta, const double x,
+ const double G_lam_min, const double Gp_lam_min,
+ double * G_lam_max, double * Gp_lam_max
+ )
+{
+ double x_inv = 1.0/x;
+ double gcl = G_lam_min;
+ double gpl = Gp_lam_min;
+ double lam = lam_min + 1.0;
+ int k;
+
+ for(k=1; k<=kmax; k++) {
+ double el = eta/lam;
+ double rl = hypot(1.0, el);
+ double sl = el + lam*x_inv;
+ double gcl1 = (sl*gcl - gpl)/rl;
+ gpl = rl*gcl - sl*gcl1;
+ gcl = gcl1;
+ lam += 1.0;
+ }
+
+ *G_lam_max = gcl;
+ *Gp_lam_max = gpl;
+ return GSL_SUCCESS;
+}
+
+
+/* Evaluate the first continued fraction, giving
+ * the ratio F'/F at the upper lambda value.
+ * We also determine the sign of F at that point,
+ * since it is the sign of the last denominator
+ * in the continued fraction.
+ */
+static
+int
+coulomb_CF1(double lambda,
+ double eta, double x,
+ double * fcl_sign,
+ double * result,
+ int * count
+ )
+{
+ const double CF1_small = 1.e-30;
+ const double CF1_abort = 1.0e+05;
+ const double CF1_acc = 2.0*GSL_DBL_EPSILON;
+ const double x_inv = 1.0/x;
+ const double px = lambda + 1.0 + CF1_abort;
+
+ double pk = lambda + 1.0;
+ double F = eta/pk + pk*x_inv;
+ double D, C;
+ double df;
+
+ *fcl_sign = 1.0;
+ *count = 0;
+
+ if(fabs(F) < CF1_small) F = CF1_small;
+ D = 0.0;
+ C = F;
+
+ do {
+ double pk1 = pk + 1.0;
+ double ek = eta / pk;
+ double rk2 = 1.0 + ek*ek;
+ double tk = (pk + pk1)*(x_inv + ek/pk1);
+ D = tk - rk2 * D;
+ C = tk - rk2 / C;
+ if(fabs(C) < CF1_small) C = CF1_small;
+ if(fabs(D) < CF1_small) D = CF1_small;
+ D = 1.0/D;
+ df = D * C;
+ F = F * df;
+ if(D < 0.0) {
+ /* sign of result depends on sign of denominator */
+ *fcl_sign = - *fcl_sign;
+ }
+ pk = pk1;
+ if( pk > px ) {
+ *result = F;
+ GSL_ERROR ("error", GSL_ERUNAWAY);
+ }
+ ++(*count);
+ }
+ while(fabs(df-1.0) > CF1_acc);
+
+ *result = F;
+ return GSL_SUCCESS;
+}
+
+
+#if 0
+static
+int
+old_coulomb_CF1(const double lambda,
+ double eta, double x,
+ double * fcl_sign,
+ double * result
+ )
+{
+ const double CF1_abort = 1.e5;
+ const double CF1_acc = 10.0*GSL_DBL_EPSILON;
+ const double x_inv = 1.0/x;
+ const double px = lambda + 1.0 + CF1_abort;
+
+ double pk = lambda + 1.0;
+
+ double D;
+ double df;
+
+ double F;
+ double p;
+ double pk1;
+ double ek;
+
+ double fcl = 1.0;
+
+ double tk;
+
+ while(1) {
+ ek = eta/pk;
+ F = (ek + pk*x_inv)*fcl + (fcl - 1.0)*x_inv;
+ pk1 = pk + 1.0;
+ if(fabs(eta*x + pk*pk1) > CF1_acc) break;
+ fcl = (1.0 + ek*ek)/(1.0 + eta*eta/(pk1*pk1));
+ pk = 2.0 + pk;
+ }
+
+ D = 1.0/((pk + pk1)*(x_inv + ek/pk1));
+ df = -fcl*(1.0 + ek*ek)*D;
+
+ if(fcl != 1.0) fcl = -1.0;
+ if(D < 0.0) fcl = -fcl;
+
+ F = F + df;
+
+ p = 1.0;
+ do {
+ pk = pk1;
+ pk1 = pk + 1.0;
+ ek = eta / pk;
+ tk = (pk + pk1)*(x_inv + ek/pk1);
+ D = tk - D*(1.0+ek*ek);
+ if(fabs(D) < sqrt(CF1_acc)) {
+ p += 1.0;
+ if(p > 2.0) {
+ printf("HELP............\n");
+ }
+ }
+ D = 1.0/D;
+ if(D < 0.0) {
+ /* sign of result depends on sign of denominator */
+ fcl = -fcl;
+ }
+ df = df*(D*tk - 1.0);
+ F = F + df;
+ if( pk > px ) {
+ GSL_ERROR ("error", GSL_ERUNAWAY);
+ }
+ }
+ while(fabs(df) > fabs(F)*CF1_acc);
+
+ *fcl_sign = fcl;
+ *result = F;
+ return GSL_SUCCESS;
+}
+#endif /* 0 */
+
+
+/* Evaluate the second continued fraction to
+ * obtain the ratio
+ * (G' + i F')/(G + i F) := P + i Q
+ * at the specified lambda value.
+ */
+static
+int
+coulomb_CF2(const double lambda, const double eta, const double x,
+ double * result_P, double * result_Q, int * count
+ )
+{
+ int status = GSL_SUCCESS;
+
+ const double CF2_acc = 4.0*GSL_DBL_EPSILON;
+ const double CF2_abort = 2.0e+05;
+
+ const double wi = 2.0*eta;
+ const double x_inv = 1.0/x;
+ const double e2mm1 = eta*eta + lambda*(lambda + 1.0);
+
+ double ar = -e2mm1;
+ double ai = eta;
+
+ double br = 2.0*(x - eta);
+ double bi = 2.0;
+
+ double dr = br/(br*br + bi*bi);
+ double di = -bi/(br*br + bi*bi);
+
+ double dp = -x_inv*(ar*di + ai*dr);
+ double dq = x_inv*(ar*dr - ai*di);
+
+ double A, B, C, D;
+
+ double pk = 0.0;
+ double P = 0.0;
+ double Q = 1.0 - eta*x_inv;
+
+ *count = 0;
+
+ do {
+ P += dp;
+ Q += dq;
+ pk += 2.0;
+ ar += pk;
+ ai += wi;
+ bi += 2.0;
+ D = ar*dr - ai*di + br;
+ di = ai*dr + ar*di + bi;
+ C = 1.0/(D*D + di*di);
+ dr = C*D;
+ di = -C*di;
+ A = br*dr - bi*di - 1.;
+ B = bi*dr + br*di;
+ C = dp*A - dq*B;
+ dq = dp*B + dq*A;
+ dp = C;
+ if(pk > CF2_abort) {
+ status = GSL_ERUNAWAY;
+ break;
+ }
+ ++(*count);
+ }
+ while(fabs(dp)+fabs(dq) > (fabs(P)+fabs(Q))*CF2_acc);
+
+ if(Q < CF2_abort*GSL_DBL_EPSILON*fabs(P)) {
+ status = GSL_ELOSS;
+ }
+
+ *result_P = P;
+ *result_Q = Q;
+ return status;
+}
+
+
+/* WKB evaluation of F, G. Assumes 0 < x < turning point.
+ * Overflows are trapped, GSL_EOVRFLW is signalled,
+ * and an exponent is returned such that:
+ *
+ * result_F = fjwkb * exp(-exponent)
+ * result_G = gjwkb * exp( exponent)
+ *
+ * See [Biedenharn et al. Phys. Rev. 97, 542-554 (1955), Section IV]
+ *
+ * Unfortunately, this is not very accurate in general. The
+ * test cases typically have 3-4 digits of precision. One could
+ * argue that this is ok for general use because, for instance,
+ * F is exponentially small in this region and so the absolute
+ * accuracy is still roughly acceptable. But it would be better
+ * to have a systematic method for improving the precision. See
+ * the Abad+Sesma method discussion below.
+ */
+static
+int
+coulomb_jwkb(const double lam, const double eta, const double x,
+ gsl_sf_result * fjwkb, gsl_sf_result * gjwkb,
+ double * exponent)
+{
+ const double llp1 = lam*(lam+1.0) + 6.0/35.0;
+ const double llp1_eff = GSL_MAX(llp1, 0.0);
+ const double rho_ghalf = sqrt(x*(2.0*eta - x) + llp1_eff);
+ const double sinh_arg = sqrt(llp1_eff/(eta*eta+llp1_eff)) * rho_ghalf / x;
+ const double sinh_inv = log(sinh_arg + hypot(1.0,sinh_arg));
+
+ const double phi = fabs(rho_ghalf - eta*atan2(rho_ghalf,x-eta) - sqrt(llp1_eff) * sinh_inv);
+
+ const double zeta_half = pow(3.0*phi/2.0, 1.0/3.0);
+ const double prefactor = sqrt(M_PI*phi*x/(6.0 * rho_ghalf));
+
+ double F = prefactor * 3.0/zeta_half;
+ double G = prefactor * 3.0/zeta_half; /* Note the sqrt(3) from Bi normalization */
+ double F_exp;
+ double G_exp;
+
+ const double airy_scale_exp = phi;
+ gsl_sf_result ai;
+ gsl_sf_result bi;
+ gsl_sf_airy_Ai_scaled_e(zeta_half*zeta_half, GSL_MODE_DEFAULT, &ai);
+ gsl_sf_airy_Bi_scaled_e(zeta_half*zeta_half, GSL_MODE_DEFAULT, &bi);
+ F *= ai.val;
+ G *= bi.val;
+ F_exp = log(F) - airy_scale_exp;
+ G_exp = log(G) + airy_scale_exp;
+
+ if(G_exp >= GSL_LOG_DBL_MAX) {
+ fjwkb->val = F;
+ gjwkb->val = G;
+ fjwkb->err = 1.0e-3 * fabs(F); /* FIXME: real error here ... could be smaller */
+ gjwkb->err = 1.0e-3 * fabs(G);
+ *exponent = airy_scale_exp;
+ GSL_ERROR ("error", GSL_EOVRFLW);
+ }
+ else {
+ fjwkb->val = exp(F_exp);
+ gjwkb->val = exp(G_exp);
+ fjwkb->err = 1.0e-3 * fabs(fjwkb->val);
+ gjwkb->err = 1.0e-3 * fabs(gjwkb->val);
+ *exponent = 0.0;
+ return GSL_SUCCESS;
+ }
+}
+
+
+/* Asymptotic evaluation of F and G below the minimal turning point.
+ *
+ * This is meant to be a drop-in replacement for coulomb_jwkb().
+ * It uses the expressions in [Abad+Sesma]. This requires some
+ * work because I am not sure where it is valid. They mumble
+ * something about |x| < |lam|^(-1/2) or 8|eta x| > lam when |x| < 1.
+ * This seems true, but I thought the result was based on a uniform
+ * expansion and could be controlled by simply using more terms.
+ */
+#if 0
+static
+int
+coulomb_AS_xlt2eta(const double lam, const double eta, const double x,
+ gsl_sf_result * f_AS, gsl_sf_result * g_AS,
+ double * exponent)
+{
+ /* no time to do this now... */
+}
+#endif /* 0 */
+
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int
+gsl_sf_coulomb_wave_FG_e(const double eta, const double x,
+ const double lam_F,
+ const int k_lam_G, /* lam_G = lam_F - k_lam_G */
+ gsl_sf_result * F, gsl_sf_result * Fp,
+ gsl_sf_result * G, gsl_sf_result * Gp,
+ double * exp_F, double * exp_G)
+{
+ const double lam_G = lam_F - k_lam_G;
+
+ if(x < 0.0 || lam_F <= -0.5 || lam_G <= -0.5) {
+ GSL_SF_RESULT_SET(F, 0.0, 0.0);
+ GSL_SF_RESULT_SET(Fp, 0.0, 0.0);
+ GSL_SF_RESULT_SET(G, 0.0, 0.0);
+ GSL_SF_RESULT_SET(Gp, 0.0, 0.0);
+ *exp_F = 0.0;
+ *exp_G = 0.0;
+ GSL_ERROR ("domain error", GSL_EDOM);
+ }
+ else if(x == 0.0) {
+ gsl_sf_result C0;
+ CLeta(0.0, eta, &C0);
+ GSL_SF_RESULT_SET(F, 0.0, 0.0);
+ GSL_SF_RESULT_SET(Fp, 0.0, 0.0);
+ GSL_SF_RESULT_SET(G, 0.0, 0.0); /* FIXME: should be Inf */
+ GSL_SF_RESULT_SET(Gp, 0.0, 0.0); /* FIXME: should be Inf */
+ *exp_F = 0.0;
+ *exp_G = 0.0;
+ if(lam_F == 0.0){
+ GSL_SF_RESULT_SET(Fp, C0.val, C0.err);
+ }
+ if(lam_G == 0.0) {
+ GSL_SF_RESULT_SET(Gp, 1.0/C0.val, fabs(C0.err/C0.val)/fabs(C0.val));
+ }
+ GSL_ERROR ("domain error", GSL_EDOM);
+ /* After all, since we are asking for G, this is a domain error... */
+ }
+ else if(x < 1.2 && 2.0*M_PI*eta < 0.9*(-GSL_LOG_DBL_MIN) && fabs(eta*x) < 10.0) {
+ /* Reduce to a small lambda value and use the series
+ * representations for F and G. We cannot allow eta to
+ * be large and positive because the connection formula
+ * for G_lam is badly behaved due to an underflow in sin(phi_lam)
+ * [see coulomb_FG_series() and coulomb_connection() above].
+ * Note that large negative eta is ok however.
+ */
+ const double SMALL = GSL_SQRT_DBL_EPSILON;
+ const int N = (int)(lam_F + 0.5);
+ const int span = GSL_MAX(k_lam_G, N);
+ const double lam_min = lam_F - N; /* -1/2 <= lam_min < 1/2 */
+ double F_lam_F, Fp_lam_F;
+ double G_lam_G, Gp_lam_G;
+ double F_lam_F_err, Fp_lam_F_err;
+ double Fp_over_F_lam_F;
+ double F_sign_lam_F;
+ double F_lam_min_unnorm, Fp_lam_min_unnorm;
+ double Fp_over_F_lam_min;
+ gsl_sf_result F_lam_min;
+ gsl_sf_result G_lam_min, Gp_lam_min;
+ double F_scale;
+ double Gerr_frac;
+ double F_scale_frac_err;
+ double F_unnorm_frac_err;
+
+ /* Determine F'/F at lam_F. */
+ int CF1_count;
+ int stat_CF1 = coulomb_CF1(lam_F, eta, x, &F_sign_lam_F, &Fp_over_F_lam_F, &CF1_count);
+
+ int stat_ser;
+ int stat_Fr;
+ int stat_Gr;
+
+ /* Recurse down with unnormalized F,F' values. */
+ F_lam_F = SMALL;
+ Fp_lam_F = Fp_over_F_lam_F * F_lam_F;
+ if(span != 0) {
+ stat_Fr = coulomb_F_recur(lam_min, span, eta, x,
+ F_lam_F, Fp_lam_F,
+ &F_lam_min_unnorm, &Fp_lam_min_unnorm
+ );
+ }
+ else {
+ F_lam_min_unnorm = F_lam_F;
+ Fp_lam_min_unnorm = Fp_lam_F;
+ stat_Fr = GSL_SUCCESS;
+ }
+
+ /* Determine F and G at lam_min. */
+ if(lam_min == -0.5) {
+ stat_ser = coulomb_FGmhalf_series(eta, x, &F_lam_min, &G_lam_min);
+ }
+ else if(lam_min == 0.0) {
+ stat_ser = coulomb_FG0_series(eta, x, &F_lam_min, &G_lam_min);
+ }
+ else if(lam_min == 0.5) {
+ /* This cannot happen. */
+ F->val = F_lam_F;
+ F->err = 2.0 * GSL_DBL_EPSILON * fabs(F->val);
+ Fp->val = Fp_lam_F;
+ Fp->err = 2.0 * GSL_DBL_EPSILON * fabs(Fp->val);
+ G->val = G_lam_G;
+ G->err = 2.0 * GSL_DBL_EPSILON * fabs(G->val);
+ Gp->val = Gp_lam_G;
+ Gp->err = 2.0 * GSL_DBL_EPSILON * fabs(Gp->val);
+ *exp_F = 0.0;
+ *exp_G = 0.0;
+ GSL_ERROR ("error", GSL_ESANITY);
+ }
+ else {
+ stat_ser = coulomb_FG_series(lam_min, eta, x, &F_lam_min, &G_lam_min);
+ }
+
+ /* Determine remaining quantities. */
+ Fp_over_F_lam_min = Fp_lam_min_unnorm / F_lam_min_unnorm;
+ Gp_lam_min.val = Fp_over_F_lam_min*G_lam_min.val - 1.0/F_lam_min.val;
+ Gp_lam_min.err = fabs(Fp_over_F_lam_min)*G_lam_min.err;
+ Gp_lam_min.err += fabs(1.0/F_lam_min.val) * fabs(F_lam_min.err/F_lam_min.val);
+ F_scale = F_lam_min.val / F_lam_min_unnorm;
+
+ /* Apply scale to the original F,F' values. */
+ F_scale_frac_err = fabs(F_lam_min.err/F_lam_min.val);
+ F_unnorm_frac_err = 2.0*GSL_DBL_EPSILON*(CF1_count+span+1);
+ F_lam_F *= F_scale;
+ F_lam_F_err = fabs(F_lam_F) * (F_unnorm_frac_err + F_scale_frac_err);
+ Fp_lam_F *= F_scale;
+ Fp_lam_F_err = fabs(Fp_lam_F) * (F_unnorm_frac_err + F_scale_frac_err);
+
+ /* Recurse up to get the required G,G' values. */
+ stat_Gr = coulomb_G_recur(lam_min, GSL_MAX(N-k_lam_G,0), eta, x,
+ G_lam_min.val, Gp_lam_min.val,
+ &G_lam_G, &Gp_lam_G
+ );
+
+ F->val = F_lam_F;
+ F->err = F_lam_F_err;
+ F->err += 2.0 * GSL_DBL_EPSILON * fabs(F_lam_F);
+
+ Fp->val = Fp_lam_F;
+ Fp->err = Fp_lam_F_err;
+ Fp->err += 2.0 * GSL_DBL_EPSILON * fabs(Fp_lam_F);
+
+ Gerr_frac = fabs(G_lam_min.err/G_lam_min.val) + fabs(Gp_lam_min.err/Gp_lam_min.val);
+
+ G->val = G_lam_G;
+ G->err = Gerr_frac * fabs(G_lam_G);
+ G->err += 2.0 * (CF1_count+1) * GSL_DBL_EPSILON * fabs(G->val);
+
+ Gp->val = Gp_lam_G;
+ Gp->err = Gerr_frac * fabs(Gp->val);
+ Gp->err += 2.0 * (CF1_count+1) * GSL_DBL_EPSILON * fabs(Gp->val);
+
+ *exp_F = 0.0;
+ *exp_G = 0.0;
+
+ return GSL_ERROR_SELECT_4(stat_ser, stat_CF1, stat_Fr, stat_Gr);
+ }
+ else if(x < 2.0*eta) {
+ /* Use WKB approximation to obtain F and G at the two
+ * lambda values, and use the Wronskian and the
+ * continued fractions for F'/F to obtain F' and G'.
+ */
+ gsl_sf_result F_lam_F, G_lam_F;
+ gsl_sf_result F_lam_G, G_lam_G;
+ double exp_lam_F, exp_lam_G;
+ int stat_lam_F;
+ int stat_lam_G;
+ int stat_CF1_lam_F;
+ int stat_CF1_lam_G;
+ int CF1_count;
+ double Fp_over_F_lam_F;
+ double Fp_over_F_lam_G;
+ double F_sign_lam_F;
+ double F_sign_lam_G;
+
+ stat_lam_F = coulomb_jwkb(lam_F, eta, x, &F_lam_F, &G_lam_F, &exp_lam_F);
+ if(k_lam_G == 0) {
+ stat_lam_G = stat_lam_F;
+ F_lam_G = F_lam_F;
+ G_lam_G = G_lam_F;
+ exp_lam_G = exp_lam_F;
+ }
+ else {
+ stat_lam_G = coulomb_jwkb(lam_G, eta, x, &F_lam_G, &G_lam_G, &exp_lam_G);
+ }
+
+ stat_CF1_lam_F = coulomb_CF1(lam_F, eta, x, &F_sign_lam_F, &Fp_over_F_lam_F, &CF1_count);
+ if(k_lam_G == 0) {
+ stat_CF1_lam_G = stat_CF1_lam_F;
+ F_sign_lam_G = F_sign_lam_F;
+ Fp_over_F_lam_G = Fp_over_F_lam_F;
+ }
+ else {
+ stat_CF1_lam_G = coulomb_CF1(lam_G, eta, x, &F_sign_lam_G, &Fp_over_F_lam_G, &CF1_count);
+ }
+
+ F->val = F_lam_F.val;
+ F->err = F_lam_F.err;
+
+ G->val = G_lam_G.val;
+ G->err = G_lam_G.err;
+
+ Fp->val = Fp_over_F_lam_F * F_lam_F.val;
+ Fp->err = fabs(Fp_over_F_lam_F) * F_lam_F.err;
+ Fp->err += 2.0*GSL_DBL_EPSILON*fabs(Fp->val);
+
+ Gp->val = Fp_over_F_lam_G * G_lam_G.val - 1.0/F_lam_G.val;
+ Gp->err = fabs(Fp_over_F_lam_G) * G_lam_G.err;
+ Gp->err += fabs(1.0/F_lam_G.val) * fabs(F_lam_G.err/F_lam_G.val);
+
+ *exp_F = exp_lam_F;
+ *exp_G = exp_lam_G;
+
+ if(stat_lam_F == GSL_EOVRFLW || stat_lam_G == GSL_EOVRFLW) {
+ GSL_ERROR ("overflow", GSL_EOVRFLW);
+ }
+ else {
+ return GSL_ERROR_SELECT_2(stat_lam_F, stat_lam_G);
+ }
+ }
+ else {
+ /* x > 2 eta, so we know that we can find a lambda value such
+ * that x is above the turning point. We do this, evaluate
+ * using Steed's method at that oscillatory point, then
+ * use recursion on F and G to obtain the required values.
+ *
+ * lam_0 = a value of lambda such that x is below the turning point
+ * lam_min = minimum of lam_0 and the requested lam_G, since
+ * we must go at least as low as lam_G
+ */
+ const double SMALL = GSL_SQRT_DBL_EPSILON;
+ const double C = sqrt(1.0 + 4.0*x*(x-2.0*eta));
+ const int N = ceil(lam_F - C + 0.5);
+ const double lam_0 = lam_F - GSL_MAX(N, 0);
+ const double lam_min = GSL_MIN(lam_0, lam_G);
+ double F_lam_F, Fp_lam_F;
+ double G_lam_G, Gp_lam_G;
+ double F_lam_min_unnorm, Fp_lam_min_unnorm;
+ double F_lam_min, Fp_lam_min;
+ double G_lam_min, Gp_lam_min;
+ double Fp_over_F_lam_F;
+ double Fp_over_F_lam_min;
+ double F_sign_lam_F, F_sign_lam_min;
+ double P_lam_min, Q_lam_min;
+ double alpha;
+ double gamma;
+ double F_scale;
+
+ int CF1_count;
+ int CF2_count;
+ int stat_CF1 = coulomb_CF1(lam_F, eta, x, &F_sign_lam_F, &Fp_over_F_lam_F, &CF1_count);
+ int stat_CF2;
+ int stat_Fr;
+ int stat_Gr;
+
+ int F_recur_count;
+ int G_recur_count;
+
+ double err_amplify;
+
+ F_lam_F = F_sign_lam_F * SMALL; /* unnormalized */
+ Fp_lam_F = Fp_over_F_lam_F * F_lam_F;
+
+ /* Backward recurrence to get F,Fp at lam_min */
+ F_recur_count = GSL_MAX(k_lam_G, N);
+ stat_Fr = coulomb_F_recur(lam_min, F_recur_count, eta, x,
+ F_lam_F, Fp_lam_F,
+ &F_lam_min_unnorm, &Fp_lam_min_unnorm
+ );
+ Fp_over_F_lam_min = Fp_lam_min_unnorm / F_lam_min_unnorm;
+
+ /* Steed evaluation to complete evaluation of F,Fp,G,Gp at lam_min */
+ stat_CF2 = coulomb_CF2(lam_min, eta, x, &P_lam_min, &Q_lam_min, &CF2_count);
+ alpha = Fp_over_F_lam_min - P_lam_min;
+ gamma = alpha/Q_lam_min;
+
+ F_sign_lam_min = GSL_SIGN(F_lam_min_unnorm) ;
+
+ F_lam_min = F_sign_lam_min / sqrt(alpha*alpha/Q_lam_min + Q_lam_min);
+ Fp_lam_min = Fp_over_F_lam_min * F_lam_min;
+ G_lam_min = gamma * F_lam_min;
+ Gp_lam_min = (P_lam_min * gamma - Q_lam_min) * F_lam_min;
+
+ /* Apply scale to values of F,Fp at lam_F (the top). */
+ F_scale = F_lam_min / F_lam_min_unnorm;
+ F_lam_F *= F_scale;
+ Fp_lam_F *= F_scale;
+
+ /* Forward recurrence to get G,Gp at lam_G (the top). */
+ G_recur_count = GSL_MAX(N-k_lam_G,0);
+ stat_Gr = coulomb_G_recur(lam_min, G_recur_count, eta, x,
+ G_lam_min, Gp_lam_min,
+ &G_lam_G, &Gp_lam_G
+ );
+
+ err_amplify = CF1_count + CF2_count + F_recur_count + G_recur_count + 1;
+
+ F->val = F_lam_F;
+ F->err = 8.0*err_amplify*GSL_DBL_EPSILON * fabs(F->val);
+
+ Fp->val = Fp_lam_F;
+ Fp->err = 8.0*err_amplify*GSL_DBL_EPSILON * fabs(Fp->val);
+
+ G->val = G_lam_G;
+ G->err = 8.0*err_amplify*GSL_DBL_EPSILON * fabs(G->val);
+
+ Gp->val = Gp_lam_G;
+ Gp->err = 8.0*err_amplify*GSL_DBL_EPSILON * fabs(Gp->val);
+
+ *exp_F = 0.0;
+ *exp_G = 0.0;
+
+ return GSL_ERROR_SELECT_4(stat_CF1, stat_CF2, stat_Fr, stat_Gr);
+ }
+}
+
+
+int
+gsl_sf_coulomb_wave_F_array(double lam_min, int kmax,
+ double eta, double x,
+ double * fc_array,
+ double * F_exp)
+{
+ if(x == 0.0) {
+ int k;
+ *F_exp = 0.0;
+ for(k=0; k<=kmax; k++) {
+ fc_array[k] = 0.0;
+ }
+ if(lam_min == 0.0){
+ gsl_sf_result f_0;
+ CLeta(0.0, eta, &f_0);
+ fc_array[0] = f_0.val;
+ }
+ return GSL_SUCCESS;
+ }
+ else {
+ const double x_inv = 1.0/x;
+ const double lam_max = lam_min + kmax;
+ gsl_sf_result F, Fp;
+ gsl_sf_result G, Gp;
+ double G_exp;
+
+ int stat_FG = gsl_sf_coulomb_wave_FG_e(eta, x, lam_max, 0,
+ &F, &Fp, &G, &Gp, F_exp, &G_exp);
+
+ double fcl = F.val;
+ double fpl = Fp.val;
+ double lam = lam_max;
+ int k;
+
+ fc_array[kmax] = F.val;
+
+ for(k=kmax-1; k>=0; k--) {
+ double el = eta/lam;
+ double rl = hypot(1.0, el);
+ double sl = el + lam*x_inv;
+ double fc_lm1 = (fcl*sl + fpl)/rl;
+ fc_array[k] = fc_lm1;
+ fpl = fc_lm1*sl - fcl*rl;
+ fcl = fc_lm1;
+ lam -= 1.0;
+ }
+
+ return stat_FG;
+ }
+}
+
+
+int
+gsl_sf_coulomb_wave_FG_array(double lam_min, int kmax,
+ double eta, double x,
+ double * fc_array, double * gc_array,
+ double * F_exp, double * G_exp)
+{
+ const double x_inv = 1.0/x;
+ const double lam_max = lam_min + kmax;
+ gsl_sf_result F, Fp;
+ gsl_sf_result G, Gp;
+
+ int stat_FG = gsl_sf_coulomb_wave_FG_e(eta, x, lam_max, kmax,
+ &F, &Fp, &G, &Gp, F_exp, G_exp);
+
+ double fcl = F.val;
+ double fpl = Fp.val;
+ double lam = lam_max;
+ int k;
+
+ double gcl, gpl;
+
+ fc_array[kmax] = F.val;
+
+ for(k=kmax-1; k>=0; k--) {
+ double el = eta/lam;
+ double rl = hypot(1.0, el);
+ double sl = el + lam*x_inv;
+ double fc_lm1;
+ fc_lm1 = (fcl*sl + fpl)/rl;
+ fc_array[k] = fc_lm1;
+ fpl = fc_lm1*sl - fcl*rl;
+ fcl = fc_lm1;
+ lam -= 1.0;
+ }
+
+ gcl = G.val;
+ gpl = Gp.val;
+ lam = lam_min + 1.0;
+
+ gc_array[0] = G.val;
+
+ for(k=1; k<=kmax; k++) {
+ double el = eta/lam;
+ double rl = hypot(1.0, el);
+ double sl = el + lam*x_inv;
+ double gcl1 = (sl*gcl - gpl)/rl;
+ gc_array[k] = gcl1;
+ gpl = rl*gcl - sl*gcl1;
+ gcl = gcl1;
+ lam += 1.0;
+ }
+
+ return stat_FG;
+}
+
+
+int
+gsl_sf_coulomb_wave_FGp_array(double lam_min, int kmax,
+ double eta, double x,
+ double * fc_array, double * fcp_array,
+ double * gc_array, double * gcp_array,
+ double * F_exp, double * G_exp)
+
+{
+ const double x_inv = 1.0/x;
+ const double lam_max = lam_min + kmax;
+ gsl_sf_result F, Fp;
+ gsl_sf_result G, Gp;
+
+ int stat_FG = gsl_sf_coulomb_wave_FG_e(eta, x, lam_max, kmax,
+ &F, &Fp, &G, &Gp, F_exp, G_exp);
+
+ double fcl = F.val;
+ double fpl = Fp.val;
+ double lam = lam_max;
+ int k;
+
+ double gcl, gpl;
+
+ fc_array[kmax] = F.val;
+ fcp_array[kmax] = Fp.val;
+
+ for(k=kmax-1; k>=0; k--) {
+ double el = eta/lam;
+ double rl = hypot(1.0, el);
+ double sl = el + lam*x_inv;
+ double fc_lm1;
+ fc_lm1 = (fcl*sl + fpl)/rl;
+ fc_array[k] = fc_lm1;
+ fpl = fc_lm1*sl - fcl*rl;
+ fcp_array[k] = fpl;
+ fcl = fc_lm1;
+ lam -= 1.0;
+ }
+
+ gcl = G.val;
+ gpl = Gp.val;
+ lam = lam_min + 1.0;
+
+ gc_array[0] = G.val;
+ gcp_array[0] = Gp.val;
+
+ for(k=1; k<=kmax; k++) {
+ double el = eta/lam;
+ double rl = hypot(1.0, el);
+ double sl = el + lam*x_inv;
+ double gcl1 = (sl*gcl - gpl)/rl;
+ gc_array[k] = gcl1;
+ gpl = rl*gcl - sl*gcl1;
+ gcp_array[k] = gpl;
+ gcl = gcl1;
+ lam += 1.0;
+ }
+
+ return stat_FG;
+}
+
+
+int
+gsl_sf_coulomb_wave_sphF_array(double lam_min, int kmax,
+ double eta, double x,
+ double * fc_array,
+ double * F_exp)
+{
+ if(x < 0.0 || lam_min < -0.5) {
+ GSL_ERROR ("domain error", GSL_EDOM);
+ }
+ else if(x < 10.0/GSL_DBL_MAX) {
+ int k;
+ for(k=0; k<=kmax; k++) {
+ fc_array[k] = 0.0;
+ }
+ if(lam_min == 0.0) {
+ fc_array[0] = sqrt(C0sq(eta));
+ }
+ *F_exp = 0.0;
+ if(x == 0.0)
+ return GSL_SUCCESS;
+ else
+ GSL_ERROR ("underflow", GSL_EUNDRFLW);
+ }
+ else {
+ int k;
+ int stat_F = gsl_sf_coulomb_wave_F_array(lam_min, kmax,
+ eta, x,
+ fc_array,
+ F_exp);
+
+ for(k=0; k<=kmax; k++) {
+ fc_array[k] = fc_array[k] / x;
+ }
+ return stat_F;
+ }
+}
+
+
diff --git a/gsl-1.9/specfunc/coulomb_bound.c b/gsl-1.9/specfunc/coulomb_bound.c
new file mode 100644
index 0000000..473c246
--- /dev/null
+++ b/gsl-1.9/specfunc/coulomb_bound.c
@@ -0,0 +1,120 @@
+/* specfunc/coulomb_bound.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_exp.h>
+#include <gsl/gsl_sf_gamma.h>
+#include <gsl/gsl_sf_pow_int.h>
+#include <gsl/gsl_sf_laguerre.h>
+#include <gsl/gsl_sf_coulomb.h>
+
+#include "error.h"
+#include "check.h"
+
+/* normalization for hydrogenic wave functions */
+static
+int
+R_norm(const int n, const int l, const double Z, gsl_sf_result * result)
+{
+ double A = 2.0*Z/n;
+ double pre = sqrt(A*A*A /(2.0*n));
+ gsl_sf_result ln_a, ln_b;
+ gsl_sf_result ex;
+ int stat_a = gsl_sf_lnfact_e(n+l, &ln_a);
+ int stat_b = gsl_sf_lnfact_e(n-l-1, &ln_b);
+ double diff_val = 0.5*(ln_b.val - ln_a.val);
+ double diff_err = 0.5*(ln_b.err + ln_a.err) + GSL_DBL_EPSILON * fabs(diff_val);
+ int stat_e = gsl_sf_exp_err_e(diff_val, diff_err, &ex);
+ result->val = pre * ex.val;
+ result->err = pre * ex.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_ERROR_SELECT_3(stat_e, stat_a, stat_b);
+}
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int
+gsl_sf_hydrogenicR_1_e(const double Z, const double r, gsl_sf_result * result)
+{
+ if(Z > 0.0 && r >= 0.0) {
+ double A = 2.0*Z;
+ double norm = A*sqrt(Z);
+ double ea = exp(-Z*r);
+ result->val = norm*ea;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val) * fabs(Z*r);
+ CHECK_UNDERFLOW(result);
+ return GSL_SUCCESS;
+ }
+ else {
+ DOMAIN_ERROR(result);
+ }
+}
+
+
+int
+gsl_sf_hydrogenicR_e(const int n, const int l,
+ const double Z, const double r,
+ gsl_sf_result * result)
+{
+ if(n < 1 || l > n-1 || Z <= 0.0 || r < 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else {
+ double A = 2.0*Z/n;
+ gsl_sf_result norm;
+ int stat_norm = R_norm(n, l, Z, &norm);
+ double rho = A*r;
+ double ea = exp(-0.5*rho);
+ double pp = gsl_sf_pow_int(rho, l);
+ gsl_sf_result lag;
+ int stat_lag = gsl_sf_laguerre_n_e(n-l-1, 2*l+1, rho, &lag);
+ double W_val = norm.val * ea * pp;
+ double W_err = norm.err * ea * pp;
+ W_err += norm.val * ((0.5*rho + 1.0) * GSL_DBL_EPSILON) * ea * pp;
+ W_err += norm.val * ea * ((l+1.0) * GSL_DBL_EPSILON) * pp;
+ result->val = W_val * lag.val;
+ result->err = W_val * lag.err + W_err * fabs(lag.val);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ if ((l == 0 || (r > 0 && l > 0)) && lag.val != 0.0
+ && stat_lag == GSL_SUCCESS && stat_norm == GSL_SUCCESS) {
+ CHECK_UNDERFLOW(result);
+ };
+ return GSL_ERROR_SELECT_2(stat_lag, stat_norm);
+ }
+}
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_hydrogenicR_1(const double Z, const double r)
+{
+ EVAL_RESULT(gsl_sf_hydrogenicR_1_e(Z, r, &result));
+}
+
+
+double gsl_sf_hydrogenicR(const int n, const int l, const double Z, const double r)
+{
+ EVAL_RESULT(gsl_sf_hydrogenicR_e(n, l, Z, r, &result));
+}
diff --git a/gsl-1.9/specfunc/coupling.c b/gsl-1.9/specfunc/coupling.c
new file mode 100644
index 0000000..b7ae4d0
--- /dev/null
+++ b/gsl-1.9/specfunc/coupling.c
@@ -0,0 +1,439 @@
+/* specfunc/coupling.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_gamma.h>
+#include <gsl/gsl_sf_coupling.h>
+
+#include "error.h"
+
+inline
+static
+int locMax3(const int a, const int b, const int c)
+{
+ int d = GSL_MAX(a, b);
+ return GSL_MAX(d, c);
+}
+
+inline
+static
+int locMin3(const int a, const int b, const int c)
+{
+ int d = GSL_MIN(a, b);
+ return GSL_MIN(d, c);
+}
+
+inline
+static
+int locMin5(const int a, const int b, const int c, const int d, const int e)
+{
+ int f = GSL_MIN(a, b);
+ int g = GSL_MIN(c, d);
+ int h = GSL_MIN(f, g);
+ return GSL_MIN(e, h);
+}
+
+
+/* See: [Thompson, Atlas for Computing Mathematical Functions] */
+
+static
+int
+delta(int ta, int tb, int tc, gsl_sf_result * d)
+{
+ gsl_sf_result f1, f2, f3, f4;
+ int status = 0;
+ status += gsl_sf_fact_e((ta + tb - tc)/2, &f1);
+ status += gsl_sf_fact_e((ta + tc - tb)/2, &f2);
+ status += gsl_sf_fact_e((tb + tc - ta)/2, &f3);
+ status += gsl_sf_fact_e((ta + tb + tc)/2 + 1, &f4);
+ if(status != 0) {
+ OVERFLOW_ERROR(d);
+ }
+ d->val = f1.val * f2.val * f3.val / f4.val;
+ d->err = 4.0 * GSL_DBL_EPSILON * fabs(d->val);
+ return GSL_SUCCESS;
+}
+
+
+static
+int
+triangle_selection_fails(int two_ja, int two_jb, int two_jc)
+{
+ return ((two_jb < abs(two_ja - two_jc)) || (two_jb > two_ja + two_jc));
+}
+
+
+static
+int
+m_selection_fails(int two_ja, int two_jb, int two_jc,
+ int two_ma, int two_mb, int two_mc)
+{
+ return (
+ abs(two_ma) > two_ja
+ || abs(two_mb) > two_jb
+ || abs(two_mc) > two_jc
+ || GSL_IS_ODD(two_ja + two_ma)
+ || GSL_IS_ODD(two_jb + two_mb)
+ || GSL_IS_ODD(two_jc + two_mc)
+ || (two_ma + two_mb + two_mc) != 0
+ );
+}
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+
+int
+gsl_sf_coupling_3j_e (int two_ja, int two_jb, int two_jc,
+ int two_ma, int two_mb, int two_mc,
+ gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(two_ja < 0 || two_jb < 0 || two_jc < 0) {
+ DOMAIN_ERROR(result);
+ }
+ else if ( triangle_selection_fails(two_ja, two_jb, two_jc)
+ || m_selection_fails(two_ja, two_jb, two_jc, two_ma, two_mb, two_mc)
+ ) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else {
+ int jca = (-two_ja + two_jb + two_jc) / 2,
+ jcb = ( two_ja - two_jb + two_jc) / 2,
+ jcc = ( two_ja + two_jb - two_jc) / 2,
+ jmma = ( two_ja - two_ma) / 2,
+ jmmb = ( two_jb - two_mb) / 2,
+ jmmc = ( two_jc - two_mc) / 2,
+ jpma = ( two_ja + two_ma) / 2,
+ jpmb = ( two_jb + two_mb) / 2,
+ jpmc = ( two_jc + two_mc) / 2,
+ jsum = ( two_ja + two_jb + two_jc) / 2,
+ kmin = locMax3 (0, jpmb - jmmc, jmma - jpmc),
+ kmax = locMin3 (jcc, jmma, jpmb),
+ k, sign = GSL_IS_ODD (kmin - jpma + jmmb) ? -1 : 1,
+ status = 0;
+ double sum_pos = 0.0, sum_neg = 0.0, norm, term;
+ gsl_sf_result bc1, bc2, bc3, bcn1, bcn2, bcd1, bcd2, bcd3, bcd4;
+
+ status += gsl_sf_choose_e (two_ja, jcc , &bcn1);
+ status += gsl_sf_choose_e (two_jb, jcc , &bcn2);
+ status += gsl_sf_choose_e (jsum+1, jcc , &bcd1);
+ status += gsl_sf_choose_e (two_ja, jmma, &bcd2);
+ status += gsl_sf_choose_e (two_jb, jmmb, &bcd3);
+ status += gsl_sf_choose_e (two_jc, jpmc, &bcd4);
+
+ if (status != 0) {
+ OVERFLOW_ERROR (result);
+ }
+
+ norm = sqrt (bcn1.val * bcn2.val)
+ / sqrt (bcd1.val * bcd2.val * bcd3.val * bcd4.val * ((double) two_jc + 1.0));
+
+ for (k = kmin; k <= kmax; k++) {
+ status += gsl_sf_choose_e (jcc, k, &bc1);
+ status += gsl_sf_choose_e (jcb, jmma - k, &bc2);
+ status += gsl_sf_choose_e (jca, jpmb - k, &bc3);
+
+ if (status != 0) {
+ OVERFLOW_ERROR (result);
+ }
+
+ term = bc1.val * bc2.val * bc3.val;
+
+ if (sign < 0) {
+ sum_neg += norm * term;
+ } else {
+ sum_pos += norm * term;
+ }
+
+ sign = -sign;
+ }
+
+ result->val = sum_pos - sum_neg;
+ result->err = 2.0 * GSL_DBL_EPSILON * (sum_pos + sum_neg);
+ result->err += 2.0 * GSL_DBL_EPSILON * (kmax - kmin) * fabs(result->val);
+
+ return GSL_SUCCESS;
+ }
+}
+
+int
+gsl_sf_coupling_6j_INCORRECT_e(int two_ja, int two_jb, int two_jc,
+ int two_jd, int two_je, int two_jf,
+ gsl_sf_result * result)
+{
+ return gsl_sf_coupling_6j_e(two_ja, two_jb, two_je, two_jd, two_jc, two_jf, result);
+}
+
+
+int
+gsl_sf_coupling_6j_e(int two_ja, int two_jb, int two_jc,
+ int two_jd, int two_je, int two_jf,
+ gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if( two_ja < 0 || two_jb < 0 || two_jc < 0
+ || two_jd < 0 || two_je < 0 || two_jf < 0
+ ) {
+ DOMAIN_ERROR(result);
+ }
+ else if( triangle_selection_fails(two_ja, two_jb, two_jc)
+ || triangle_selection_fails(two_ja, two_je, two_jf)
+ || triangle_selection_fails(two_jb, two_jd, two_jf)
+ || triangle_selection_fails(two_je, two_jd, two_jc)
+ ) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else {
+ gsl_sf_result n1;
+ gsl_sf_result d1, d2, d3, d4, d5, d6;
+ double norm;
+ int tk, tkmin, tkmax;
+ double phase;
+ double sum_pos = 0.0;
+ double sum_neg = 0.0;
+ double sumsq_err = 0.0;
+ int status = 0;
+ status += delta(two_ja, two_jb, two_jc, &d1);
+ status += delta(two_ja, two_je, two_jf, &d2);
+ status += delta(two_jb, two_jd, two_jf, &d3);
+ status += delta(two_je, two_jd, two_jc, &d4);
+ if(status != GSL_SUCCESS) {
+ OVERFLOW_ERROR(result);
+ }
+ norm = sqrt(d1.val) * sqrt(d2.val) * sqrt(d3.val) * sqrt(d4.val);
+
+ tkmin = locMax3(0,
+ two_ja + two_jd - two_jc - two_jf,
+ two_jb + two_je - two_jc - two_jf);
+
+ tkmax = locMin5(two_ja + two_jb + two_je + two_jd + 2,
+ two_ja + two_jb - two_jc,
+ two_je + two_jd - two_jc,
+ two_ja + two_je - two_jf,
+ two_jb + two_jd - two_jf);
+
+ phase = GSL_IS_ODD((two_ja + two_jb + two_je + two_jd + tkmin)/2)
+ ? -1.0
+ : 1.0;
+
+ for(tk=tkmin; tk<=tkmax; tk += 2) {
+ double term;
+ double term_err;
+ gsl_sf_result den_1, den_2;
+ gsl_sf_result d1_a, d1_b;
+ status = 0;
+
+ status += gsl_sf_fact_e((two_ja + two_jb + two_je + two_jd - tk)/2 + 1, &n1);
+ status += gsl_sf_fact_e(tk/2, &d1_a);
+ status += gsl_sf_fact_e((two_jc + two_jf - two_ja - two_jd + tk)/2, &d1_b);
+ status += gsl_sf_fact_e((two_jc + two_jf - two_jb - two_je + tk)/2, &d2);
+ status += gsl_sf_fact_e((two_ja + two_jb - two_jc - tk)/2, &d3);
+ status += gsl_sf_fact_e((two_je + two_jd - two_jc - tk)/2, &d4);
+ status += gsl_sf_fact_e((two_ja + two_je - two_jf - tk)/2, &d5);
+ status += gsl_sf_fact_e((two_jb + two_jd - two_jf - tk)/2, &d6);
+
+ if(status != GSL_SUCCESS) {
+ OVERFLOW_ERROR(result);
+ }
+
+ d1.val = d1_a.val * d1_b.val;
+ d1.err = d1_a.err * fabs(d1_b.val) + fabs(d1_a.val) * d1_b.err;
+
+ den_1.val = d1.val*d2.val*d3.val;
+ den_1.err = d1.err * fabs(d2.val*d3.val);
+ den_1.err += d2.err * fabs(d1.val*d3.val);
+ den_1.err += d3.err * fabs(d1.val*d2.val);
+
+ den_2.val = d4.val*d5.val*d6.val;
+ den_2.err = d4.err * fabs(d5.val*d6.val);
+ den_2.err += d5.err * fabs(d4.val*d6.val);
+ den_2.err += d6.err * fabs(d4.val*d5.val);
+
+ term = phase * n1.val / den_1.val / den_2.val;
+ phase = -phase;
+ term_err = n1.err / fabs(den_1.val) / fabs(den_2.val);
+ term_err += fabs(term / den_1.val) * den_1.err;
+ term_err += fabs(term / den_2.val) * den_2.err;
+
+ if(term >= 0.0) {
+ sum_pos += norm*term;
+ }
+ else {
+ sum_neg -= norm*term;
+ }
+
+ sumsq_err += norm*norm * term_err*term_err;
+ }
+
+ result->val = sum_pos - sum_neg;
+ result->err = 2.0 * GSL_DBL_EPSILON * (sum_pos + sum_neg);
+ result->err += sqrt(sumsq_err / (0.5*(tkmax-tkmin)+1.0));
+ result->err += 2.0 * GSL_DBL_EPSILON * (tkmax - tkmin + 2.0) * fabs(result->val);
+
+ return GSL_SUCCESS;
+ }
+}
+
+
+int
+gsl_sf_coupling_RacahW_e(int two_ja, int two_jb, int two_jc,
+ int two_jd, int two_je, int two_jf,
+ gsl_sf_result * result)
+{
+ int status = gsl_sf_coupling_6j_e(two_ja, two_jb, two_je, two_jd, two_jc, two_jf, result);
+ int phase_sum = (two_ja + two_jb + two_jc + two_jd)/2;
+ result->val *= ( GSL_IS_ODD(phase_sum) ? -1.0 : 1.0 );
+ return status;
+}
+
+
+int
+gsl_sf_coupling_9j_e(int two_ja, int two_jb, int two_jc,
+ int two_jd, int two_je, int two_jf,
+ int two_jg, int two_jh, int two_ji,
+ gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if( two_ja < 0 || two_jb < 0 || two_jc < 0
+ || two_jd < 0 || two_je < 0 || two_jf < 0
+ || two_jg < 0 || two_jh < 0 || two_ji < 0
+ ) {
+ DOMAIN_ERROR(result);
+ }
+ else if( triangle_selection_fails(two_ja, two_jb, two_jc)
+ || triangle_selection_fails(two_jd, two_je, two_jf)
+ || triangle_selection_fails(two_jg, two_jh, two_ji)
+ || triangle_selection_fails(two_ja, two_jd, two_jg)
+ || triangle_selection_fails(two_jb, two_je, two_jh)
+ || triangle_selection_fails(two_jc, two_jf, two_ji)
+ ) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else {
+ int tk;
+ int tkmin = locMax3(abs(two_ja-two_ji), abs(two_jh-two_jd), abs(two_jb-two_jf));
+ int tkmax = locMin3(two_ja + two_ji, two_jh + two_jd, two_jb + two_jf);
+ double sum_pos = 0.0;
+ double sum_neg = 0.0;
+ double sumsq_err = 0.0;
+ double phase;
+ for(tk=tkmin; tk<=tkmax; tk += 2) {
+ gsl_sf_result s1, s2, s3;
+ double term;
+ double term_err;
+ int status = 0;
+
+ status += gsl_sf_coupling_6j_e(two_ja, two_ji, tk, two_jh, two_jd, two_jg, &s1);
+ status += gsl_sf_coupling_6j_e(two_jb, two_jf, tk, two_jd, two_jh, two_je, &s2);
+ status += gsl_sf_coupling_6j_e(two_ja, two_ji, tk, two_jf, two_jb, two_jc, &s3);
+
+ if(status != GSL_SUCCESS) {
+ OVERFLOW_ERROR(result);
+ }
+ term = s1.val * s2.val * s3.val;
+ term_err = s1.err * fabs(s2.val*s3.val);
+ term_err += s2.err * fabs(s1.val*s3.val);
+ term_err += s3.err * fabs(s1.val*s2.val);
+
+ if(term >= 0.0) {
+ sum_pos += (tk + 1) * term;
+ }
+ else {
+ sum_neg -= (tk + 1) * term;
+ }
+
+ sumsq_err += ((tk+1) * term_err) * ((tk+1) * term_err);
+ }
+
+ phase = GSL_IS_ODD(tkmin) ? -1.0 : 1.0;
+
+ result->val = phase * (sum_pos - sum_neg);
+ result->err = 2.0 * GSL_DBL_EPSILON * (sum_pos + sum_neg);
+ result->err += sqrt(sumsq_err / (0.5*(tkmax-tkmin)+1.0));
+ result->err += 2.0 * GSL_DBL_EPSILON * (tkmax-tkmin + 2.0) * fabs(result->val);
+
+ return GSL_SUCCESS;
+ }
+}
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_coupling_3j(int two_ja, int two_jb, int two_jc,
+ int two_ma, int two_mb, int two_mc)
+{
+ EVAL_RESULT(gsl_sf_coupling_3j_e(two_ja, two_jb, two_jc,
+ two_ma, two_mb, two_mc,
+ &result));
+}
+
+
+double gsl_sf_coupling_6j_INCORRECT(int two_ja, int two_jb, int two_jc,
+ int two_jd, int two_je, int two_jf)
+{
+ EVAL_RESULT(gsl_sf_coupling_6j_INCORRECT_e(two_ja, two_jb, two_jc,
+ two_jd, two_je, two_jf,
+ &result));
+}
+
+
+double gsl_sf_coupling_6j(int two_ja, int two_jb, int two_jc,
+ int two_jd, int two_je, int two_jf)
+{
+ EVAL_RESULT(gsl_sf_coupling_6j_e(two_ja, two_jb, two_jc,
+ two_jd, two_je, two_jf,
+ &result));
+}
+
+
+double gsl_sf_coupling_RacahW(int two_ja, int two_jb, int two_jc,
+ int two_jd, int two_je, int two_jf)
+{
+ EVAL_RESULT(gsl_sf_coupling_RacahW_e(two_ja, two_jb, two_jc,
+ two_jd, two_je, two_jf,
+ &result));
+}
+
+
+double gsl_sf_coupling_9j(int two_ja, int two_jb, int two_jc,
+ int two_jd, int two_je, int two_jf,
+ int two_jg, int two_jh, int two_ji)
+{
+ EVAL_RESULT(gsl_sf_coupling_9j_e(two_ja, two_jb, two_jc,
+ two_jd, two_je, two_jf,
+ two_jg, two_jh, two_ji,
+ &result));
+}
diff --git a/gsl-1.9/specfunc/dawson.c b/gsl-1.9/specfunc/dawson.c
new file mode 100644
index 0000000..a4ccb4b
--- /dev/null
+++ b/gsl-1.9/specfunc/dawson.c
@@ -0,0 +1,281 @@
+/* specfunc/dawson.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_dawson.h>
+
+#include "error.h"
+#include "chebyshev.h"
+#include "cheb_eval.c"
+
+/* Based on ddaws.f, Fullerton, W., (LANL) */
+
+
+/* Chebyshev expansions
+
+ Series for DAW on the interval 0. to 1.00000E+00
+ with weighted error 8.95E-32
+ log weighted error 31.05
+ significant figures required 30.41
+ decimal places required 31.71
+
+ Series for DAW2 on the interval 0. to 1.60000E+01
+ with weighted error 1.61E-32
+ log weighted error 31.79
+ significant figures required 31.40
+ decimal places required 32.62
+
+ Series for DAWA on the interval 0. to 6.25000E-02
+ with weighted error 1.97E-32
+ log weighted error 31.71
+ significant figures required 29.79
+ decimal places required 32.64
+*/
+static double daw_data[21] = {
+ -0.6351734375145949201065127736293e-02,
+ -0.2294071479677386939899824125866e+00,
+ 0.2213050093908476441683979161786e-01,
+ -0.1549265453892985046743057753375e-02,
+ 0.8497327715684917456777542948066e-04,
+ -0.3828266270972014924994099521309e-05,
+ 0.1462854806250163197757148949539e-06,
+ -0.4851982381825991798846715425114e-08,
+ 0.1421463577759139790347568183304e-09,
+ -0.3728836087920596525335493054088e-11,
+ 0.8854942961778203370194565231369e-13,
+ -0.1920757131350206355421648417493e-14,
+ 0.3834325867246327588241074439253e-16,
+ -0.7089154168175881633584099327999e-18,
+ 0.1220552135889457674416901120000e-19,
+ -0.1966204826605348760299451733333e-21,
+ 0.2975845541376597189113173333333e-23,
+ -0.4247069514800596951039999999999e-25,
+ 0.5734270767391742798506666666666e-27,
+ -0.7345836823178450261333333333333e-29,
+ 0.8951937667516552533333333333333e-31
+};
+static cheb_series daw_cs = {
+ daw_data,
+ 15, /* 20, */
+ -1, 1,
+ 9
+};
+
+static double daw2_data[45] = {
+ -0.56886544105215527114160533733674e-01,
+ -0.31811346996168131279322878048822e+00,
+ 0.20873845413642236789741580198858e+00,
+ -0.12475409913779131214073498314784e+00,
+ 0.67869305186676777092847516423676e-01,
+ -0.33659144895270939503068230966587e-01,
+ 0.15260781271987971743682460381640e-01,
+ -0.63483709625962148230586094788535e-02,
+ 0.24326740920748520596865966109343e-02,
+ -0.86219541491065032038526983549637e-03,
+ 0.28376573336321625302857636538295e-03,
+ -0.87057549874170423699396581464335e-04,
+ 0.24986849985481658331800044137276e-04,
+ -0.67319286764160294344603050339520e-05,
+ 0.17078578785573543710504524047844e-05,
+ -0.40917551226475381271896592490038e-06,
+ 0.92828292216755773260751785312273e-07,
+ -0.19991403610147617829845096332198e-07,
+ 0.40963490644082195241210487868917e-08,
+ -0.80032409540993168075706781753561e-09,
+ 0.14938503128761465059143225550110e-09,
+ -0.26687999885622329284924651063339e-10,
+ 0.45712216985159458151405617724103e-11,
+ -0.75187305222043565872243727326771e-12,
+ 0.11893100052629681879029828987302e-12,
+ -0.18116907933852346973490318263084e-13,
+ 0.26611733684358969193001612199626e-14,
+ -0.37738863052129419795444109905930e-15,
+ 0.51727953789087172679680082229329e-16,
+ -0.68603684084077500979419564670102e-17,
+ 0.88123751354161071806469337321745e-18,
+ -0.10974248249996606292106299624652e-18,
+ 0.13261199326367178513595545891635e-19,
+ -0.15562732768137380785488776571562e-20,
+ 0.17751425583655720607833415570773e-21,
+ -0.19695006967006578384953608765439e-22,
+ 0.21270074896998699661924010120533e-23,
+ -0.22375398124627973794182113962666e-24,
+ 0.22942768578582348946971383125333e-25,
+ -0.22943788846552928693329592319999e-26,
+ 0.22391702100592453618342297600000e-27,
+ -0.21338230616608897703678225066666e-28,
+ 0.19866196585123531518028458666666e-29,
+ -0.18079295866694391771955199999999e-30,
+ 0.16090686015283030305450666666666e-31
+};
+static cheb_series daw2_cs = {
+ daw2_data,
+ 32, /* 44, */
+ -1, 1,
+ 21
+};
+
+static double dawa_data[75] = {
+ 0.1690485637765703755422637438849e-01,
+ 0.8683252278406957990536107850768e-02,
+ 0.2424864042417715453277703459889e-03,
+ 0.1261182399572690001651949240377e-04,
+ 0.1066453314636176955705691125906e-05,
+ 0.1358159794790727611348424505728e-06,
+ 0.2171042356577298398904312744743e-07,
+ 0.2867010501805295270343676804813e-08,
+ -0.1901336393035820112282492378024e-09,
+ -0.3097780484395201125532065774268e-09,
+ -0.1029414876057509247398132286413e-09,
+ -0.6260356459459576150417587283121e-11,
+ 0.8563132497446451216262303166276e-11,
+ 0.3033045148075659292976266276257e-11,
+ -0.2523618306809291372630886938826e-12,
+ -0.4210604795440664513175461934510e-12,
+ -0.4431140826646238312143429452036e-13,
+ 0.4911210272841205205940037065117e-13,
+ 0.1235856242283903407076477954739e-13,
+ -0.5788733199016569246955765071069e-14,
+ -0.2282723294807358620978183957030e-14,
+ 0.7637149411014126476312362917590e-15,
+ 0.3851546883566811728777594002095e-15,
+ -0.1199932056928290592803237283045e-15,
+ -0.6313439150094572347334270285250e-16,
+ 0.2239559965972975375254912790237e-16,
+ 0.9987925830076495995132891200749e-17,
+ -0.4681068274322495334536246507252e-17,
+ -0.1436303644349721337241628751534e-17,
+ 0.1020822731410541112977908032130e-17,
+ 0.1538908873136092072837389822372e-18,
+ -0.2189157877645793888894790926056e-18,
+ 0.2156879197938651750392359152517e-20,
+ 0.4370219827442449851134792557395e-19,
+ -0.8234581460977207241098927905177e-20,
+ -0.7498648721256466222903202835420e-20,
+ 0.3282536720735671610957612930039e-20,
+ 0.8858064309503921116076561515151e-21,
+ -0.9185087111727002988094460531485e-21,
+ 0.2978962223788748988314166045791e-22,
+ 0.1972132136618471883159505468041e-21,
+ -0.5974775596362906638089584995117e-22,
+ -0.2834410031503850965443825182441e-22,
+ 0.2209560791131554514777150489012e-22,
+ -0.5439955741897144300079480307711e-25,
+ -0.5213549243294848668017136696470e-23,
+ 0.1702350556813114199065671499076e-23,
+ 0.6917400860836148343022185660197e-24,
+ -0.6540941793002752512239445125802e-24,
+ 0.6093576580439328960371824654636e-25,
+ 0.1408070432905187461501945080272e-24,
+ -0.6785886121054846331167674943755e-25,
+ -0.9799732036214295711741583102225e-26,
+ 0.2121244903099041332598960939160e-25,
+ -0.5954455022548790938238802154487e-26,
+ -0.3093088861875470177838847232049e-26,
+ 0.2854389216344524682400691986104e-26,
+ -0.3951289447379305566023477271811e-27,
+ -0.5906000648607628478116840894453e-27,
+ 0.3670236964668687003647889980609e-27,
+ -0.4839958238042276256598303038941e-29,
+ -0.9799265984210443869597404017022e-28,
+ 0.4684773732612130606158908804300e-28,
+ 0.5030877696993461051647667603155e-29,
+ -0.1547395051706028239247552068295e-28,
+ 0.6112180185086419243976005662714e-29,
+ 0.1357913399124811650343602736158e-29,
+ -0.2417687752768673088385304299044e-29,
+ 0.8369074582074298945292887587291e-30,
+ 0.2665413042788979165838319401566e-30,
+ -0.3811653692354890336935691003712e-30,
+ 0.1230054721884951464371706872585e-30,
+ 0.4622506399041493508805536929983e-31,
+ -0.6120087296881677722911435593001e-31,
+ 0.1966024640193164686956230217896e-31
+};
+static cheb_series dawa_cs = {
+ dawa_data,
+ 34, /* 74, */
+ -1, 1,
+ 12
+};
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int
+gsl_sf_dawson_e(double x, gsl_sf_result * result)
+{
+ const double xsml = 1.225 * GSL_SQRT_DBL_EPSILON;
+ const double xbig = 1.0/(M_SQRT2*GSL_SQRT_DBL_EPSILON);
+ const double xmax = 0.1 * GSL_DBL_MAX;
+
+ const double y = fabs(x);
+
+ if(y < xsml) {
+ result->val = x;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(y < 1.0) {
+ gsl_sf_result result_c;
+ cheb_eval_e(&daw_cs, 2.0*y*y - 1.0, &result_c);
+ result->val = x * (0.75 + result_c.val);
+ result->err = y * result_c.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(y < 4.0) {
+ gsl_sf_result result_c;
+ cheb_eval_e(&daw2_cs, 0.125*y*y - 1.0, &result_c);
+ result->val = x * (0.25 + result_c.val);
+ result->err = y * result_c.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(y < xbig) {
+ gsl_sf_result result_c;
+ cheb_eval_e(&dawa_cs, 32.0/(y*y) - 1.0, &result_c);
+ result->val = (0.5 + result_c.val) / x;
+ result->err = result_c.err / y;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(y < xmax) {
+ result->val = 0.5/x;
+ result->err = 2.0 * GSL_DBL_EPSILON * result->val;
+ return GSL_SUCCESS;
+ }
+ else {
+ UNDERFLOW_ERROR(result);
+ }
+}
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_dawson(double x)
+{
+ EVAL_RESULT(gsl_sf_dawson_e(x, &result));
+}
diff --git a/gsl-1.9/specfunc/debye.c b/gsl-1.9/specfunc/debye.c
new file mode 100644
index 0000000..07c2f57
--- /dev/null
+++ b/gsl-1.9/specfunc/debye.c
@@ -0,0 +1,566 @@
+/* specfunc/debye.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+/* augmented to n=5 and 6 2005-11-08 by R. J. Mathar, http://www.strw.leidenuniv.nl/~mathar */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_debye.h>
+
+#include "error.h"
+#include "check.h"
+
+#include "chebyshev.h"
+#include "cheb_eval.c"
+
+static double adeb1_data[17] = {
+ 2.4006597190381410194,
+ 0.1937213042189360089,
+ -0.62329124554895770e-02,
+ 0.3511174770206480e-03,
+ -0.228222466701231e-04,
+ 0.15805467875030e-05,
+ -0.1135378197072e-06,
+ 0.83583361188e-08,
+ -0.6264424787e-09,
+ 0.476033489e-10,
+ -0.36574154e-11,
+ 0.2835431e-12,
+ -0.221473e-13,
+ 0.17409e-14,
+ -0.1376e-15,
+ 0.109e-16,
+ -0.9e-18
+};
+static cheb_series adeb1_cs = {
+ adeb1_data,
+ 16,
+ -1.0, 1.0,
+ 9
+};
+
+static double adeb2_data[18] = {
+ 2.5943810232570770282,
+ 0.2863357204530719834,
+ -0.102062656158046713e-01,
+ 0.6049109775346844e-03,
+ -0.405257658950210e-04,
+ 0.28633826328811e-05,
+ -0.2086394303065e-06,
+ 0.155237875826e-07,
+ -0.11731280087e-08,
+ 0.897358589e-10,
+ -0.69317614e-11,
+ 0.5398057e-12,
+ -0.423241e-13,
+ 0.33378e-14,
+ -0.2645e-15,
+ 0.211e-16,
+ -0.17e-17,
+ 0.1e-18
+};
+static cheb_series adeb2_cs = {
+ adeb2_data,
+ 17,
+ -1.0, 1.0,
+ 10
+};
+
+static double adeb3_data[17] = {
+ 2.707737068327440945,
+ 0.340068135211091751,
+ -0.12945150184440869e-01,
+ 0.7963755380173816e-03,
+ -0.546360009590824e-04,
+ 0.39243019598805e-05,
+ -0.2894032823539e-06,
+ 0.217317613962e-07,
+ -0.16542099950e-08,
+ 0.1272796189e-09,
+ -0.987963460e-11,
+ 0.7725074e-12,
+ -0.607797e-13,
+ 0.48076e-14,
+ -0.3820e-15,
+ 0.305e-16,
+ -0.24e-17
+};
+static cheb_series adeb3_cs = {
+ adeb3_data,
+ 16,
+ -1.0, 1.0,
+ 10
+};
+
+static double adeb4_data[17] = {
+ 2.781869415020523460,
+ 0.374976783526892863,
+ -0.14940907399031583e-01,
+ 0.945679811437042e-03,
+ -0.66132916138933e-04,
+ 0.4815632982144e-05,
+ -0.3588083958759e-06,
+ 0.271601187416e-07,
+ -0.20807099122e-08,
+ 0.1609383869e-09,
+ -0.125470979e-10,
+ 0.9847265e-12,
+ -0.777237e-13,
+ 0.61648e-14,
+ -0.4911e-15,
+ 0.393e-16,
+ -0.32e-17
+};
+static cheb_series adeb4_cs = {
+ adeb4_data,
+ 16,
+ -1.0, 1.0,
+ 10
+};
+
+static double adeb5_data[17] = {
+ 2.8340269546834530149,
+ 0.3994098857106266445,
+ -0.164566764773099646e-1,
+ 0.10652138340664541e-2,
+ -0.756730374875418e-4,
+ 0.55745985240273e-5,
+ -0.4190692330918e-6,
+ 0.319456143678e-7,
+ -0.24613318171e-8,
+ 0.1912801633e-9,
+ -0.149720049e-10,
+ 0.11790312e-11,
+ -0.933329e-13,
+ 0.74218e-14,
+ -0.5925e-15,
+ 0.475e-16,
+ -0.39e-17
+};
+static cheb_series adeb5_cs = {
+ adeb5_data,
+ 16,
+ -1.0, 1.0,
+ 10
+};
+
+static double adeb6_data[17] = {
+ 2.8726727134130122113,
+ 0.4174375352339027746,
+ -0.176453849354067873e-1,
+ 0.11629852733494556e-2,
+ -0.837118027357117e-4,
+ 0.62283611596189e-5,
+ -0.4718644465636e-6,
+ 0.361950397806e-7,
+ -0.28030368010e-8,
+ 0.2187681983e-9,
+ -0.171857387e-10,
+ 0.13575809e-11,
+ -0.1077580e-12,
+ 0.85893e-14,
+ -0.6872e-15,
+ 0.552e-16,
+ -0.44e-17
+};
+static cheb_series adeb6_cs = {
+ adeb6_data,
+ 16,
+ -1.0, 1.0,
+ 10
+};
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int gsl_sf_debye_1_e(const double x, gsl_sf_result * result)
+{
+ const double val_infinity = 1.64493406684822644;
+ const double xcut = -GSL_LOG_DBL_MIN;
+
+ /* CHECK_POINTER(result) */
+
+ if(x < 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x < 2.0*GSL_SQRT_DBL_EPSILON) {
+ result->val = 1.0 - 0.25*x + x*x/36.0;
+ result->err = GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x <= 4.0) {
+ const double t = x*x/8.0 - 1.0;
+ gsl_sf_result c;
+ cheb_eval_e(&adeb1_cs, t, &c);
+ result->val = c.val - 0.25 * x;
+ result->err = c.err + 0.25 * x * GSL_DBL_EPSILON;
+ return GSL_SUCCESS;
+ }
+ else if(x < -(M_LN2 + GSL_LOG_DBL_EPSILON)) {
+ const int nexp = floor(xcut/x);
+ const double ex = exp(-x);
+ double sum = 0.0;
+ double xk = nexp * x;
+ double rk = nexp;
+ int i;
+ for(i=nexp; i>=1; i--) {
+ sum *= ex;
+ sum += (1.0 + 1.0/xk)/rk;
+ rk -= 1.0;
+ xk -= x;
+ }
+ result->val = val_infinity/x - sum*ex;
+ result->err = GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x < xcut) {
+ result->val = (val_infinity - exp(-x)*(x+1.0)) / x;
+ result->err = GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ result->val = val_infinity/x;
+ result->err = GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+}
+
+
+int gsl_sf_debye_2_e(const double x, gsl_sf_result * result)
+{
+ const double val_infinity = 4.80822761263837714;
+ const double xcut = -GSL_LOG_DBL_MIN;
+
+ /* CHECK_POINTER(result) */
+
+ if(x < 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x < 2.0*M_SQRT2*GSL_SQRT_DBL_EPSILON) {
+ result->val = 1.0 - x/3.0 + x*x/24.0;
+ result->err = GSL_DBL_EPSILON * result->val;
+ return GSL_SUCCESS;
+ }
+ else if(x <= 4.0) {
+ const double t = x*x/8.0 - 1.0;
+ gsl_sf_result c;
+ cheb_eval_e(&adeb2_cs, t, &c);
+ result->val = c.val - x/3.0;
+ result->err = c.err + GSL_DBL_EPSILON * x/3.0;
+ return GSL_SUCCESS;
+ }
+ else if(x < -(M_LN2 + GSL_LOG_DBL_EPSILON)) {
+ const int nexp = floor(xcut/x);
+ const double ex = exp(-x);
+ double xk = nexp * x;
+ double rk = nexp;
+ double sum = 0.0;
+ int i;
+ for(i=nexp; i>=1; i--) {
+ sum *= ex;
+ sum += (1.0 + 2.0/xk + 2.0/(xk*xk)) / rk;
+ rk -= 1.0;
+ xk -= x;
+ }
+ result->val = val_infinity/(x*x) - 2.0 * sum * ex;
+ result->err = GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x < xcut) {
+ const double x2 = x*x;
+ const double sum = 2.0 + 2.0*x + x2;
+ result->val = (val_infinity - 2.0 * sum * exp(-x)) / x2;
+ result->err = GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ result->val = (val_infinity/x)/x;
+ result->err = GSL_DBL_EPSILON * result->val;
+ CHECK_UNDERFLOW(result);
+ return GSL_SUCCESS;
+ }
+}
+
+
+int gsl_sf_debye_3_e(const double x, gsl_sf_result * result)
+{
+ const double val_infinity = 19.4818182068004875;
+ const double xcut = -GSL_LOG_DBL_MIN;
+
+ /* CHECK_POINTER(result) */
+
+ if(x < 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x < 2.0*M_SQRT2*GSL_SQRT_DBL_EPSILON) {
+ result->val = 1.0 - 3.0*x/8.0 + x*x/20.0;
+ result->err = GSL_DBL_EPSILON * result->val;
+ return GSL_SUCCESS;
+ }
+ else if(x <= 4.0) {
+ const double t = x*x/8.0 - 1.0;
+ gsl_sf_result c;
+ cheb_eval_e(&adeb3_cs, t, &c);
+ result->val = c.val - 0.375*x;
+ result->err = c.err + GSL_DBL_EPSILON * 0.375*x;
+ return GSL_SUCCESS;
+ }
+ else if(x < -(M_LN2 + GSL_LOG_DBL_EPSILON)) {
+ const int nexp = floor(xcut/x);
+ const double ex = exp(-x);
+ double xk = nexp * x;
+ double rk = nexp;
+ double sum = 0.0;
+ int i;
+ for(i=nexp; i>=1; i--) {
+ double xk_inv = 1.0/xk;
+ sum *= ex;
+ sum += (((6.0*xk_inv + 6.0)*xk_inv + 3.0)*xk_inv + 1.0) / rk;
+ rk -= 1.0;
+ xk -= x;
+ }
+ result->val = val_infinity/(x*x*x) - 3.0 * sum * ex;
+ result->err = GSL_DBL_EPSILON * result->val;
+ return GSL_SUCCESS;
+ }
+ else if(x < xcut) {
+ const double x3 = x*x*x;
+ const double sum = 6.0 + 6.0*x + 3.0*x*x + x3;
+ result->val = (val_infinity - 3.0 * sum * exp(-x)) / x3;
+ result->err = GSL_DBL_EPSILON * result->val;
+ return GSL_SUCCESS;
+ }
+ else {
+ result->val = ((val_infinity/x)/x)/x;
+ result->err = GSL_DBL_EPSILON * result->val;
+ CHECK_UNDERFLOW(result);
+ return GSL_SUCCESS;
+ }
+}
+
+
+int gsl_sf_debye_4_e(const double x, gsl_sf_result * result)
+{
+ const double val_infinity = 99.5450644937635129;
+ const double xcut = -GSL_LOG_DBL_MIN;
+
+ /* CHECK_POINTER(result) */
+
+ if(x < 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x < 2.0*M_SQRT2*GSL_SQRT_DBL_EPSILON) {
+ result->val = 1.0 - 2.0*x/5.0 + x*x/18.0;
+ result->err = GSL_DBL_EPSILON * result->val;
+ return GSL_SUCCESS;
+ }
+ else if(x <= 4.0) {
+ const double t = x*x/8.0 - 1.0;
+ gsl_sf_result c;
+ cheb_eval_e(&adeb4_cs, t, &c);
+ result->val = c.val - 2.0*x/5.0;
+ result->err = c.err + GSL_DBL_EPSILON * 2.0*x/5.0;
+ return GSL_SUCCESS;
+ }
+ else if(x < -(M_LN2 + GSL_LOG_DBL_EPSILON)) {
+ const int nexp = floor(xcut/x);
+ const double ex = exp(-x);
+ double xk = nexp * x;
+ double rk = nexp;
+ double sum = 0.0;
+ int i;
+ for(i=nexp; i>=1; i--) {
+ double xk_inv = 1.0/xk;
+ sum *= ex;
+ sum += ((((24.0*xk_inv + 24.0)*xk_inv + 12.0)*xk_inv + 4.0)*xk_inv + 1.0) / rk;
+ rk -= 1.0;
+ xk -= x;
+ }
+ result->val = val_infinity/(x*x*x*x) - 4.0 * sum * ex;
+ result->err = GSL_DBL_EPSILON * result->val;
+ return GSL_SUCCESS;
+ }
+ else if(x < xcut) {
+ const double x2 = x*x;
+ const double x4 = x2*x2;
+ const double sum = 24.0 + 24.0*x + 12.0*x2 + 4.0*x2*x + x4;
+ result->val = (val_infinity - 4.0 * sum * exp(-x)) / x4;
+ result->err = GSL_DBL_EPSILON * result->val;
+ return GSL_SUCCESS;
+ }
+ else {
+ result->val = (((val_infinity/x)/x)/x)/x;
+ result->err = GSL_DBL_EPSILON * result->val;
+ CHECK_UNDERFLOW(result);
+ return GSL_SUCCESS;
+ }
+}
+
+int gsl_sf_debye_5_e(const double x, gsl_sf_result * result)
+{
+ const double val_infinity = 610.405837190669483828710757875 ;
+ const double xcut = -GSL_LOG_DBL_MIN;
+
+ /* CHECK_POINTER(result) */
+
+ if(x < 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x < 2.0*M_SQRT2*GSL_SQRT_DBL_EPSILON) {
+ result->val = 1.0 - 5.0*x/12.0 + 5.0*x*x/84.0;
+ result->err = GSL_DBL_EPSILON * result->val;
+ return GSL_SUCCESS;
+ }
+ else if(x <= 4.0) {
+ const double t = x*x/8.0 - 1.0;
+ gsl_sf_result c;
+ cheb_eval_e(&adeb5_cs, t, &c);
+ result->val = c.val - 5.0*x/12.0;
+ result->err = c.err + GSL_DBL_EPSILON * 5.0*x/12.0;
+ return GSL_SUCCESS;
+ }
+ else if(x < -(M_LN2 + GSL_LOG_DBL_EPSILON)) {
+ const int nexp = floor(xcut/x);
+ const double ex = exp(-x);
+ double xk = nexp * x;
+ double rk = nexp;
+ double sum = 0.0;
+ int i;
+ for(i=nexp; i>=1; i--) {
+ double xk_inv = 1.0/xk;
+ sum *= ex;
+ sum += (((((120.0*xk_inv + 120.0)*xk_inv + 60.0)*xk_inv + 20.0)*xk_inv + 5.0)*xk_inv+ 1.0) / rk;
+ rk -= 1.0;
+ xk -= x;
+ }
+ result->val = val_infinity/(x*x*x*x*x) - 5.0 * sum * ex;
+ result->err = GSL_DBL_EPSILON * result->val;
+ return GSL_SUCCESS;
+ }
+ else if(x < xcut) {
+ const double x2 = x*x;
+ const double x4 = x2*x2;
+ const double x5 = x4*x;
+ const double sum = 120.0 + 120.0*x + 60.0*x2 + 20.0*x2*x + 5.0*x4 + x5;
+ result->val = (val_infinity - 5.0 * sum * exp(-x)) / x5;
+ result->err = GSL_DBL_EPSILON * result->val;
+ return GSL_SUCCESS;
+ }
+ else {
+ result->val = ((((val_infinity/x)/x)/x)/x)/x;
+ result->err = GSL_DBL_EPSILON * result->val;
+ CHECK_UNDERFLOW(result);
+ return GSL_SUCCESS;
+ }
+}
+
+int gsl_sf_debye_6_e(const double x, gsl_sf_result * result)
+{
+ const double val_infinity = 4356.06887828990661194792541535 ;
+ const double xcut = -GSL_LOG_DBL_MIN;
+
+ /* CHECK_POINTER(result) */
+
+ if(x < 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x < 2.0*M_SQRT2*GSL_SQRT_DBL_EPSILON) {
+ result->val = 1.0 - 3.0*x/7.0 + x*x/16.0;
+ result->err = GSL_DBL_EPSILON * result->val;
+ return GSL_SUCCESS;
+ }
+ else if(x <= 4.0) {
+ const double t = x*x/8.0 - 1.0;
+ gsl_sf_result c;
+ cheb_eval_e(&adeb6_cs, t, &c);
+ result->val = c.val - 3.0*x/7.0;
+ result->err = c.err + GSL_DBL_EPSILON * 3.0*x/7.0;
+ return GSL_SUCCESS;
+ }
+ else if(x < -(M_LN2 + GSL_LOG_DBL_EPSILON)) {
+ const int nexp = floor(xcut/x);
+ const double ex = exp(-x);
+ double xk = nexp * x;
+ double rk = nexp;
+ double sum = 0.0;
+ int i;
+ for(i=nexp; i>=1; i--) {
+ double xk_inv = 1.0/xk;
+ sum *= ex;
+ sum += ((((((720.0*xk_inv + 720.0)*xk_inv + 360.0)*xk_inv + 120.0)*xk_inv + 30.0)*xk_inv+ 6.0)*xk_inv+ 1.0) / rk;
+ rk -= 1.0;
+ xk -= x;
+ }
+ result->val = val_infinity/(x*x*x*x*x*x) - 6.0 * sum * ex;
+ result->err = GSL_DBL_EPSILON * result->val;
+ return GSL_SUCCESS;
+ }
+ else if(x < xcut) {
+ const double x2 = x*x;
+ const double x4 = x2*x2;
+ const double x6 = x4*x2;
+ const double sum = 720.0 + 720.0*x + 360.0*x2 + 120.0*x2*x + 30.0*x4 + 6.0*x4*x +x6 ;
+ result->val = (val_infinity - 6.0 * sum * exp(-x)) / x6;
+ result->err = GSL_DBL_EPSILON * result->val;
+ return GSL_SUCCESS;
+ }
+ else {
+ result->val = (((((val_infinity/x)/x)/x)/x)/x)/x ;
+ result->err = GSL_DBL_EPSILON * result->val;
+ CHECK_UNDERFLOW(result);
+ return GSL_SUCCESS;
+ }
+}
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_debye_1(const double x)
+{
+ EVAL_RESULT(gsl_sf_debye_1_e(x, &result));
+}
+
+double gsl_sf_debye_2(const double x)
+{
+ EVAL_RESULT(gsl_sf_debye_2_e(x, &result));
+}
+
+double gsl_sf_debye_3(const double x)
+{
+ EVAL_RESULT(gsl_sf_debye_3_e(x, &result));
+}
+
+double gsl_sf_debye_4(const double x)
+{
+ EVAL_RESULT(gsl_sf_debye_4_e(x, &result));
+}
+
+double gsl_sf_debye_5(const double x)
+{
+ EVAL_RESULT(gsl_sf_debye_5_e(x, &result));
+}
+
+double gsl_sf_debye_6(const double x)
+{
+ EVAL_RESULT(gsl_sf_debye_6_e(x, &result));
+}
diff --git a/gsl-1.9/specfunc/dilog.c b/gsl-1.9/specfunc/dilog.c
new file mode 100644
index 0000000..1d8a7b1
--- /dev/null
+++ b/gsl-1.9/specfunc/dilog.c
@@ -0,0 +1,662 @@
+/* specfunc/dilog.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_clausen.h>
+#include <gsl/gsl_sf_trig.h>
+#include <gsl/gsl_sf_log.h>
+#include <gsl/gsl_sf_dilog.h>
+
+
+/* Evaluate series for real dilog(x)
+ * Sum[ x^k / k^2, {k,1,Infinity}]
+ *
+ * Converges rapidly for |x| < 1/2.
+ */
+static
+int
+dilog_series_1(const double x, gsl_sf_result * result)
+{
+ const int kmax = 1000;
+ double sum = x;
+ double term = x;
+ int k;
+ for(k=2; k<kmax; k++) {
+ const double rk = (k-1.0)/k;
+ term *= x;
+ term *= rk*rk;
+ sum += term;
+ if(fabs(term/sum) < GSL_DBL_EPSILON) break;
+ }
+
+ result->val = sum;
+ result->err = 2.0 * fabs(term);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+
+ if(k == kmax)
+ GSL_ERROR ("error", GSL_EMAXITER);
+ else
+ return GSL_SUCCESS;
+}
+
+
+/* Compute the associated series
+ *
+ * sum_{k=1}{infty} r^k / (k^2 (k+1))
+ *
+ * This is a series which appears in the one-step accelerated
+ * method, which splits out one elementary function from the
+ * full definition of Li_2(x). See below.
+ */
+static int
+series_2(double r, gsl_sf_result * result)
+{
+ static const int kmax = 100;
+ double rk = r;
+ double sum = 0.5 * r;
+ int k;
+ for(k=2; k<10; k++)
+ {
+ double ds;
+ rk *= r;
+ ds = rk/(k*k*(k+1.0));
+ sum += ds;
+ }
+ for(; k<kmax; k++)
+ {
+ double ds;
+ rk *= r;
+ ds = rk/(k*k*(k+1.0));
+ sum += ds;
+ if(fabs(ds/sum) < 0.5*GSL_DBL_EPSILON) break;
+ }
+
+ result->val = sum;
+ result->err = 2.0 * kmax * GSL_DBL_EPSILON * fabs(sum);
+
+ return GSL_SUCCESS;
+}
+
+
+/* Compute Li_2(x) using the accelerated series representation.
+ *
+ * Li_2(x) = 1 + (1-x)ln(1-x)/x + series_2(x)
+ *
+ * assumes: -1 < x < 1
+ */
+static int
+dilog_series_2(double x, gsl_sf_result * result)
+{
+ const int stat_s3 = series_2(x, result);
+ double t;
+ if(x > 0.01)
+ t = (1.0 - x) * log(1.0-x) / x;
+ else
+ {
+ static const double c3 = 1.0/3.0;
+ static const double c4 = 1.0/4.0;
+ static const double c5 = 1.0/5.0;
+ static const double c6 = 1.0/6.0;
+ static const double c7 = 1.0/7.0;
+ static const double c8 = 1.0/8.0;
+ const double t68 = c6 + x*(c7 + x*c8);
+ const double t38 = c3 + x *(c4 + x *(c5 + x * t68));
+ t = (x - 1.0) * (1.0 + x*(0.5 + x*t38));
+ }
+ result->val += 1.0 + t;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(t);
+ return stat_s3;
+}
+
+
+/* Calculates Li_2(x) for real x. Assumes x >= 0.0.
+ */
+static
+int
+dilog_xge0(const double x, gsl_sf_result * result)
+{
+ if(x > 2.0) {
+ gsl_sf_result ser;
+ const int stat_ser = dilog_series_2(1.0/x, &ser);
+ const double log_x = log(x);
+ const double t1 = M_PI*M_PI/3.0;
+ const double t2 = ser.val;
+ const double t3 = 0.5*log_x*log_x;
+ result->val = t1 - t2 - t3;
+ result->err = GSL_DBL_EPSILON * fabs(log_x) + ser.err;
+ result->err += GSL_DBL_EPSILON * (fabs(t1) + fabs(t2) + fabs(t3));
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return stat_ser;
+ }
+ else if(x > 1.01) {
+ gsl_sf_result ser;
+ const int stat_ser = dilog_series_2(1.0 - 1.0/x, &ser);
+ const double log_x = log(x);
+ const double log_term = log_x * (log(1.0-1.0/x) + 0.5*log_x);
+ const double t1 = M_PI*M_PI/6.0;
+ const double t2 = ser.val;
+ const double t3 = log_term;
+ result->val = t1 + t2 - t3;
+ result->err = GSL_DBL_EPSILON * fabs(log_x) + ser.err;
+ result->err += GSL_DBL_EPSILON * (fabs(t1) + fabs(t2) + fabs(t3));
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return stat_ser;
+ }
+ else if(x > 1.0) {
+ /* series around x = 1.0 */
+ const double eps = x - 1.0;
+ const double lne = log(eps);
+ const double c0 = M_PI*M_PI/6.0;
+ const double c1 = 1.0 - lne;
+ const double c2 = -(1.0 - 2.0*lne)/4.0;
+ const double c3 = (1.0 - 3.0*lne)/9.0;
+ const double c4 = -(1.0 - 4.0*lne)/16.0;
+ const double c5 = (1.0 - 5.0*lne)/25.0;
+ const double c6 = -(1.0 - 6.0*lne)/36.0;
+ const double c7 = (1.0 - 7.0*lne)/49.0;
+ const double c8 = -(1.0 - 8.0*lne)/64.0;
+ result->val = c0+eps*(c1+eps*(c2+eps*(c3+eps*(c4+eps*(c5+eps*(c6+eps*(c7+eps*c8)))))));
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x == 1.0) {
+ result->val = M_PI*M_PI/6.0;
+ result->err = 2.0 * GSL_DBL_EPSILON * M_PI*M_PI/6.0;
+ return GSL_SUCCESS;
+ }
+ else if(x > 0.5) {
+ gsl_sf_result ser;
+ const int stat_ser = dilog_series_2(1.0-x, &ser);
+ const double log_x = log(x);
+ const double t1 = M_PI*M_PI/6.0;
+ const double t2 = ser.val;
+ const double t3 = log_x*log(1.0-x);
+ result->val = t1 - t2 - t3;
+ result->err = GSL_DBL_EPSILON * fabs(log_x) + ser.err;
+ result->err += GSL_DBL_EPSILON * (fabs(t1) + fabs(t2) + fabs(t3));
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return stat_ser;
+ }
+ else if(x > 0.25) {
+ return dilog_series_2(x, result);
+ }
+ else if(x > 0.0) {
+ return dilog_series_1(x, result);
+ }
+ else {
+ /* x == 0.0 */
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+}
+
+
+/* Evaluate the series representation for Li2(z):
+ *
+ * Li2(z) = Sum[ |z|^k / k^2 Exp[i k arg(z)], {k,1,Infinity}]
+ * |z| = r
+ * arg(z) = theta
+ *
+ * Assumes 0 < r < 1.
+ * It is used only for small r.
+ */
+static
+int
+dilogc_series_1(
+ const double r,
+ const double x,
+ const double y,
+ gsl_sf_result * real_result,
+ gsl_sf_result * imag_result
+ )
+{
+ const double cos_theta = x/r;
+ const double sin_theta = y/r;
+ const double alpha = 1.0 - cos_theta;
+ const double beta = sin_theta;
+ double ck = cos_theta;
+ double sk = sin_theta;
+ double rk = r;
+ double real_sum = r*ck;
+ double imag_sum = r*sk;
+ const int kmax = 50 + (int)(22.0/(-log(r))); /* tuned for double-precision */
+ int k;
+ for(k=2; k<kmax; k++) {
+ double dr, di;
+ double ck_tmp = ck;
+ ck = ck - (alpha*ck + beta*sk);
+ sk = sk - (alpha*sk - beta*ck_tmp);
+ rk *= r;
+ dr = rk/((double)k*k) * ck;
+ di = rk/((double)k*k) * sk;
+ real_sum += dr;
+ imag_sum += di;
+ if(fabs((dr*dr + di*di)/(real_sum*real_sum + imag_sum*imag_sum)) < GSL_DBL_EPSILON*GSL_DBL_EPSILON) break;
+ }
+
+ real_result->val = real_sum;
+ real_result->err = 2.0 * kmax * GSL_DBL_EPSILON * fabs(real_sum);
+ imag_result->val = imag_sum;
+ imag_result->err = 2.0 * kmax * GSL_DBL_EPSILON * fabs(imag_sum);
+
+ return GSL_SUCCESS;
+}
+
+
+/* Compute
+ *
+ * sum_{k=1}{infty} z^k / (k^2 (k+1))
+ *
+ * This is a series which appears in the one-step accelerated
+ * method, which splits out one elementary function from the
+ * full definition of Li_2.
+ */
+static int
+series_2_c(
+ double r,
+ double x,
+ double y,
+ gsl_sf_result * sum_re,
+ gsl_sf_result * sum_im
+ )
+{
+ const double cos_theta = x/r;
+ const double sin_theta = y/r;
+ const double alpha = 1.0 - cos_theta;
+ const double beta = sin_theta;
+ double ck = cos_theta;
+ double sk = sin_theta;
+ double rk = r;
+ double real_sum = 0.5 * r*ck;
+ double imag_sum = 0.5 * r*sk;
+ const int kmax = 30 + (int)(18.0/(-log(r))); /* tuned for double-precision */
+ int k;
+ for(k=2; k<kmax; k++)
+ {
+ double dr, di;
+ const double ck_tmp = ck;
+ ck = ck - (alpha*ck + beta*sk);
+ sk = sk - (alpha*sk - beta*ck_tmp);
+ rk *= r;
+ dr = rk/((double)k*k*(k+1.0)) * ck;
+ di = rk/((double)k*k*(k+1.0)) * sk;
+ real_sum += dr;
+ imag_sum += di;
+ if(fabs((dr*dr + di*di)/(real_sum*real_sum + imag_sum*imag_sum)) < GSL_DBL_EPSILON*GSL_DBL_EPSILON) break;
+ }
+
+ sum_re->val = real_sum;
+ sum_re->err = 2.0 * kmax * GSL_DBL_EPSILON * fabs(real_sum);
+ sum_im->val = imag_sum;
+ sum_im->err = 2.0 * kmax * GSL_DBL_EPSILON * fabs(imag_sum);
+
+ return GSL_SUCCESS;
+}
+
+
+/* Compute Li_2(z) using the one-step accelerated series.
+ *
+ * Li_2(z) = 1 + (1-z)ln(1-z)/z + series_2_c(z)
+ *
+ * z = r exp(i theta)
+ * assumes: r < 1
+ * assumes: r > epsilon, so that we take no special care with log(1-z)
+ */
+static
+int
+dilogc_series_2(
+ const double r,
+ const double x,
+ const double y,
+ gsl_sf_result * real_dl,
+ gsl_sf_result * imag_dl
+ )
+{
+ if(r == 0.0)
+ {
+ real_dl->val = 0.0;
+ imag_dl->val = 0.0;
+ real_dl->err = 0.0;
+ imag_dl->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ gsl_sf_result sum_re;
+ gsl_sf_result sum_im;
+ const int stat_s3 = series_2_c(r, x, y, &sum_re, &sum_im);
+
+ /* t = ln(1-z)/z */
+ gsl_sf_result ln_omz_r;
+ gsl_sf_result ln_omz_theta;
+ const int stat_log = gsl_sf_complex_log_e(1.0-x, -y, &ln_omz_r, &ln_omz_theta);
+ const double t_x = ( ln_omz_r.val * x + ln_omz_theta.val * y)/(r*r);
+ const double t_y = (-ln_omz_r.val * y + ln_omz_theta.val * x)/(r*r);
+
+ /* r = (1-z) ln(1-z)/z */
+ const double r_x = (1.0 - x) * t_x + y * t_y;
+ const double r_y = (1.0 - x) * t_y - y * t_x;
+
+ real_dl->val = sum_re.val + r_x + 1.0;
+ imag_dl->val = sum_im.val + r_y;
+ real_dl->err = sum_re.err + 2.0*GSL_DBL_EPSILON*(fabs(real_dl->val) + fabs(r_x));
+ imag_dl->err = sum_im.err + 2.0*GSL_DBL_EPSILON*(fabs(imag_dl->val) + fabs(r_y));
+ return GSL_ERROR_SELECT_2(stat_s3, stat_log);
+ }
+}
+
+
+/* Evaluate a series for Li_2(z) when |z| is near 1.
+ * This is uniformly good away from z=1.
+ *
+ * Li_2(z) = Sum[ a^n/n! H_n(theta), {n, 0, Infinity}]
+ *
+ * where
+ * H_n(theta) = Sum[ e^(i m theta) m^n / m^2, {m, 1, Infinity}]
+ * a = ln(r)
+ *
+ * H_0(t) = Gl_2(t) + i Cl_2(t)
+ * H_1(t) = 1/2 ln(2(1-c)) + I atan2(-s, 1-c)
+ * H_2(t) = -1/2 + I/2 s/(1-c)
+ * H_3(t) = -1/2 /(1-c)
+ * H_4(t) = -I/2 s/(1-c)^2
+ * H_5(t) = 1/2 (2 + c)/(1-c)^2
+ * H_6(t) = I/2 s/(1-c)^5 (8(1-c) - s^2 (3 + c))
+ */
+static
+int
+dilogc_series_3(
+ const double r,
+ const double x,
+ const double y,
+ gsl_sf_result * real_result,
+ gsl_sf_result * imag_result
+ )
+{
+ const double theta = atan2(y, x);
+ const double cos_theta = x/r;
+ const double sin_theta = y/r;
+ const double a = log(r);
+ const double omc = 1.0 - cos_theta;
+ const double omc2 = omc*omc;
+ double H_re[7];
+ double H_im[7];
+ double an, nfact;
+ double sum_re, sum_im;
+ gsl_sf_result Him0;
+ int n;
+
+ H_re[0] = M_PI*M_PI/6.0 + 0.25*(theta*theta - 2.0*M_PI*fabs(theta));
+ gsl_sf_clausen_e(theta, &Him0);
+ H_im[0] = Him0.val;
+
+ H_re[1] = -0.5*log(2.0*omc);
+ H_im[1] = -atan2(-sin_theta, omc);
+
+ H_re[2] = -0.5;
+ H_im[2] = 0.5 * sin_theta/omc;
+
+ H_re[3] = -0.5/omc;
+ H_im[3] = 0.0;
+
+ H_re[4] = 0.0;
+ H_im[4] = -0.5*sin_theta/omc2;
+
+ H_re[5] = 0.5 * (2.0 + cos_theta)/omc2;
+ H_im[5] = 0.0;
+
+ H_re[6] = 0.0;
+ H_im[6] = 0.5 * sin_theta/(omc2*omc2*omc) * (8.0*omc - sin_theta*sin_theta*(3.0 + cos_theta));
+
+ sum_re = H_re[0];
+ sum_im = H_im[0];
+ an = 1.0;
+ nfact = 1.0;
+ for(n=1; n<=6; n++) {
+ double t;
+ an *= a;
+ nfact *= n;
+ t = an/nfact;
+ sum_re += t * H_re[n];
+ sum_im += t * H_im[n];
+ }
+
+ real_result->val = sum_re;
+ real_result->err = 2.0 * 6.0 * GSL_DBL_EPSILON * fabs(sum_re) + fabs(an/nfact);
+ imag_result->val = sum_im;
+ imag_result->err = 2.0 * 6.0 * GSL_DBL_EPSILON * fabs(sum_im) + Him0.err + fabs(an/nfact);
+
+ return GSL_SUCCESS;
+}
+
+
+/* Calculate complex dilogarithm Li_2(z) in the fundamental region,
+ * which we take to be the intersection of the unit disk with the
+ * half-space x < MAGIC_SPLIT_VALUE. It turns out that 0.732 is a
+ * nice choice for MAGIC_SPLIT_VALUE since then points mapped out
+ * of the x > MAGIC_SPLIT_VALUE region and into another part of the
+ * unit disk are bounded in radius by MAGIC_SPLIT_VALUE itself.
+ *
+ * If |z| < 0.98 we use a direct series summation. Otherwise z is very
+ * near the unit circle, and the series_2 expansion is used; see above.
+ * Because the fundamental region is bounded away from z = 1, this
+ * works well.
+ */
+static
+int
+dilogc_fundamental(double r, double x, double y, gsl_sf_result * real_dl, gsl_sf_result * imag_dl)
+{
+ if(r > 0.98)
+ return dilogc_series_3(r, x, y, real_dl, imag_dl);
+ else if(r > 0.25)
+ return dilogc_series_2(r, x, y, real_dl, imag_dl);
+ else
+ return dilogc_series_1(r, x, y, real_dl, imag_dl);
+}
+
+
+/* Compute Li_2(z) for z in the unit disk, |z| < 1. If z is outside
+ * the fundamental region, which means that it is too close to z = 1,
+ * then it is reflected into the fundamental region using the identity
+ *
+ * Li2(z) = -Li2(1-z) + zeta(2) - ln(z) ln(1-z).
+ */
+static
+int
+dilogc_unitdisk(double x, double y, gsl_sf_result * real_dl, gsl_sf_result * imag_dl)
+{
+ static const double MAGIC_SPLIT_VALUE = 0.732;
+ static const double zeta2 = M_PI*M_PI/6.0;
+ const double r = hypot(x, y);
+
+ if(x > MAGIC_SPLIT_VALUE)
+ {
+ /* Reflect away from z = 1 if we are too close. The magic value
+ * insures that the reflected value of the radius satisfies the
+ * related inequality r_tmp < MAGIC_SPLIT_VALUE.
+ */
+ const double x_tmp = 1.0 - x;
+ const double y_tmp = - y;
+ const double r_tmp = hypot(x_tmp, y_tmp);
+ /* const double cos_theta_tmp = x_tmp/r_tmp; */
+ /* const double sin_theta_tmp = y_tmp/r_tmp; */
+
+ gsl_sf_result result_re_tmp;
+ gsl_sf_result result_im_tmp;
+
+ const int stat_dilog = dilogc_fundamental(r_tmp, x_tmp, y_tmp, &result_re_tmp, &result_im_tmp);
+
+ const double lnz = log(r); /* log(|z|) */
+ const double lnomz = log(r_tmp); /* log(|1-z|) */
+ const double argz = atan2(y, x); /* arg(z) assuming principal branch */
+ const double argomz = atan2(y_tmp, x_tmp); /* arg(1-z) */
+ real_dl->val = -result_re_tmp.val + zeta2 - lnz*lnomz + argz*argomz;
+ real_dl->err = result_re_tmp.err;
+ real_dl->err += 2.0 * GSL_DBL_EPSILON * (zeta2 + fabs(lnz*lnomz) + fabs(argz*argomz));
+ imag_dl->val = -result_im_tmp.val - argz*lnomz - argomz*lnz;
+ imag_dl->err = result_im_tmp.err;
+ imag_dl->err += 2.0 * GSL_DBL_EPSILON * (fabs(argz*lnomz) + fabs(argomz*lnz));
+
+ return stat_dilog;
+ }
+ else
+ {
+ return dilogc_fundamental(r, x, y, real_dl, imag_dl);
+ }
+}
+
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+
+int
+gsl_sf_dilog_e(const double x, gsl_sf_result * result)
+{
+ if(x >= 0.0) {
+ return dilog_xge0(x, result);
+ }
+ else {
+ gsl_sf_result d1, d2;
+ int stat_d1 = dilog_xge0( -x, &d1);
+ int stat_d2 = dilog_xge0(x*x, &d2);
+ result->val = -d1.val + 0.5 * d2.val;
+ result->err = d1.err + 0.5 * d2.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_ERROR_SELECT_2(stat_d1, stat_d2);
+ }
+}
+
+
+int
+gsl_sf_complex_dilog_xy_e(
+ const double x,
+ const double y,
+ gsl_sf_result * real_dl,
+ gsl_sf_result * imag_dl
+ )
+{
+ const double zeta2 = M_PI*M_PI/6.0;
+ const double r2 = x*x + y*y;
+
+ if(y == 0.0)
+ {
+ if(x >= 1.0)
+ {
+ imag_dl->val = -M_PI * log(x);
+ imag_dl->err = 2.0 * GSL_DBL_EPSILON * fabs(imag_dl->val);
+ }
+ else
+ {
+ imag_dl->val = 0.0;
+ imag_dl->err = 0.0;
+ }
+ return gsl_sf_dilog_e(x, real_dl);
+ }
+ else if(fabs(r2 - 1.0) < GSL_DBL_EPSILON)
+ {
+ /* Lewin A.2.4.1 and A.2.4.2 */
+
+ const double theta = atan2(y, x);
+ const double term1 = theta*theta/4.0;
+ const double term2 = M_PI*fabs(theta)/2.0;
+ real_dl->val = zeta2 + term1 - term2;
+ real_dl->err = 2.0 * GSL_DBL_EPSILON * (zeta2 + term1 + term2);
+ return gsl_sf_clausen_e(theta, imag_dl);
+ }
+ else if(r2 < 1.0)
+ {
+ return dilogc_unitdisk(x, y, real_dl, imag_dl);
+ }
+ else
+ {
+ /* Reduce argument to unit disk. */
+ const double r = sqrt(r2);
+ const double x_tmp = x/r2;
+ const double y_tmp = -y/r2;
+ /* const double r_tmp = 1.0/r; */
+ gsl_sf_result result_re_tmp, result_im_tmp;
+
+ const int stat_dilog =
+ dilogc_unitdisk(x_tmp, y_tmp, &result_re_tmp, &result_im_tmp);
+
+ /* Unwind the inversion.
+ *
+ * Li_2(z) + Li_2(1/z) = -zeta(2) - 1/2 ln(-z)^2
+ */
+ const double theta = atan2(y, x);
+ const double theta_abs = fabs(theta);
+ const double theta_sgn = ( theta < 0.0 ? -1.0 : 1.0 );
+ const double ln_minusz_re = log(r);
+ const double ln_minusz_im = theta_sgn * (theta_abs - M_PI);
+ const double lmz2_re = ln_minusz_re*ln_minusz_re - ln_minusz_im*ln_minusz_im;
+ const double lmz2_im = 2.0*ln_minusz_re*ln_minusz_im;
+ real_dl->val = -result_re_tmp.val - 0.5 * lmz2_re - zeta2;
+ real_dl->err = result_re_tmp.err + 2.0*GSL_DBL_EPSILON*(0.5 * fabs(lmz2_re) + zeta2);
+ imag_dl->val = -result_im_tmp.val - 0.5 * lmz2_im;
+ imag_dl->err = result_im_tmp.err + 2.0*GSL_DBL_EPSILON*fabs(lmz2_im);
+ return stat_dilog;
+ }
+}
+
+
+int
+gsl_sf_complex_dilog_e(
+ const double r,
+ const double theta,
+ gsl_sf_result * real_dl,
+ gsl_sf_result * imag_dl
+ )
+{
+ const double cos_theta = cos(theta);
+ const double sin_theta = sin(theta);
+ const double x = r * cos_theta;
+ const double y = r * sin_theta;
+ return gsl_sf_complex_dilog_xy_e(x, y, real_dl, imag_dl);
+}
+
+
+int
+gsl_sf_complex_spence_xy_e(
+ const double x,
+ const double y,
+ gsl_sf_result * real_sp,
+ gsl_sf_result * imag_sp
+ )
+{
+ const double oms_x = 1.0 - x;
+ const double oms_y = - y;
+ return gsl_sf_complex_dilog_xy_e(oms_x, oms_y, real_sp, imag_sp);
+}
+
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_dilog(const double x)
+{
+ EVAL_RESULT(gsl_sf_dilog_e(x, &result));
+}
diff --git a/gsl-1.9/specfunc/elementary.c b/gsl-1.9/specfunc/elementary.c
new file mode 100644
index 0000000..3d8a36d
--- /dev/null
+++ b/gsl-1.9/specfunc/elementary.c
@@ -0,0 +1,86 @@
+/* specfunc/elementary.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_elementary.h>
+
+#include "error.h"
+#include "check.h"
+
+int
+gsl_sf_multiply_e(const double x, const double y, gsl_sf_result * result)
+{
+ const double ax = fabs(x);
+ const double ay = fabs(y);
+
+ if(x == 0.0 || y == 0.0) {
+ /* It is necessary to eliminate this immediately.
+ */
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if((ax <= 1.0 && ay >= 1.0) || (ay <= 1.0 && ax >= 1.0)) {
+ /* Straddling 1.0 is always safe.
+ */
+ result->val = x*y;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ const double f = 1.0 - 2.0 * GSL_DBL_EPSILON;
+ const double min = GSL_MIN_DBL(fabs(x), fabs(y));
+ const double max = GSL_MAX_DBL(fabs(x), fabs(y));
+ if(max < 0.9 * GSL_SQRT_DBL_MAX || min < (f * DBL_MAX)/max) {
+ result->val = GSL_COERCE_DBL(x*y);
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ CHECK_UNDERFLOW(result);
+ return GSL_SUCCESS;
+ }
+ else {
+ OVERFLOW_ERROR(result);
+ }
+ }
+}
+
+
+int
+gsl_sf_multiply_err_e(const double x, const double dx,
+ const double y, const double dy,
+ gsl_sf_result * result)
+{
+ int status = gsl_sf_multiply_e(x, y, result);
+ result->err += fabs(dx*y) + fabs(dy*x);
+ return status;
+}
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_multiply(const double x, const double y)
+{
+ EVAL_RESULT(gsl_sf_multiply_e(x, y, &result));
+}
+
diff --git a/gsl-1.9/specfunc/ellint.c b/gsl-1.9/specfunc/ellint.c
new file mode 100644
index 0000000..50ec03e
--- /dev/null
+++ b/gsl-1.9/specfunc/ellint.c
@@ -0,0 +1,625 @@
+/* specfunc/ellint.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_precision.h>
+#include <gsl/gsl_sf_ellint.h>
+
+#include "error.h"
+
+/*-*-*-*-*-*-*-*-*-*-*-* Private Section *-*-*-*-*-*-*-*-*-*-*-*/
+
+inline
+static double locMAX3(double x, double y, double z)
+{
+ double xy = GSL_MAX(x, y);
+ return GSL_MAX(xy, z);
+}
+
+inline
+static double locMAX4(double x, double y, double z, double w)
+{
+ double xy = GSL_MAX(x, y);
+ double xyz = GSL_MAX(xy, z);
+ return GSL_MAX(xyz, w);
+}
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+
+/* based on Carlson's algorithms:
+ [B. C. Carlson Numer. Math. 33, 1 (1979)]
+
+ see also:
+ [B.C. Carlson, Special Functions of Applied Mathematics (1977)]
+ */
+
+/* According to Carlson's algorithm, the errtol parameter
+ typically effects the relative error in the following way:
+
+ relative error < 16 errtol^6 / (1 - 2 errtol)
+
+ errtol precision
+ ------ ----------
+ 0.001 1.0e-17
+ 0.003 2.0e-14
+ 0.01 2.0e-11
+ 0.03 2.0e-8
+ 0.1 2.0e-5
+*/
+
+
+int
+gsl_sf_ellint_RC_e(double x, double y, gsl_mode_t mode, gsl_sf_result * result)
+{
+ const double lolim = 5.0 * GSL_DBL_MIN;
+ const double uplim = 0.2 * GSL_DBL_MAX;
+ const gsl_prec_t goal = GSL_MODE_PREC(mode);
+ const double errtol = ( goal == GSL_PREC_DOUBLE ? 0.001 : 0.03 );
+ const double prec = gsl_prec_eps[goal];
+
+ if(x < 0.0 || y < 0.0 || x + y < lolim) {
+ DOMAIN_ERROR(result);
+ }
+ else if(GSL_MAX(x, y) < uplim) {
+ const double c1 = 1.0 / 7.0;
+ const double c2 = 9.0 / 22.0;
+ double xn = x;
+ double yn = y;
+ double mu, sn, lamda, s;
+ while(1) {
+ mu = (xn + yn + yn) / 3.0;
+ sn = (yn + mu) / mu - 2.0;
+ if (fabs(sn) < errtol) break;
+ lamda = 2.0 * sqrt(xn) * sqrt(yn) + yn;
+ xn = (xn + lamda) * 0.25;
+ yn = (yn + lamda) * 0.25;
+ }
+ s = sn * sn * (0.3 + sn * (c1 + sn * (0.375 + sn * c2)));
+ result->val = (1.0 + s) / sqrt(mu);
+ result->err = prec * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ DOMAIN_ERROR(result);
+ }
+}
+
+
+int
+gsl_sf_ellint_RD_e(double x, double y, double z, gsl_mode_t mode, gsl_sf_result * result)
+{
+ const gsl_prec_t goal = GSL_MODE_PREC(mode);
+ const double errtol = ( goal == GSL_PREC_DOUBLE ? 0.001 : 0.03 );
+ const double prec = gsl_prec_eps[goal];
+ const double lolim = 2.0/pow(GSL_DBL_MAX, 2.0/3.0);
+ const double uplim = pow(0.1*errtol/GSL_DBL_MIN, 2.0/3.0);
+
+ if(GSL_MIN(x,y) < 0.0 || GSL_MIN(x+y,z) < lolim) {
+ DOMAIN_ERROR(result);
+ }
+ else if(locMAX3(x,y,z) < uplim) {
+ const double c1 = 3.0 / 14.0;
+ const double c2 = 1.0 / 6.0;
+ const double c3 = 9.0 / 22.0;
+ const double c4 = 3.0 / 26.0;
+ double xn = x;
+ double yn = y;
+ double zn = z;
+ double sigma = 0.0;
+ double power4 = 1.0;
+ double ea, eb, ec, ed, ef, s1, s2;
+ double mu, xndev, yndev, zndev;
+ while(1) {
+ double xnroot, ynroot, znroot, lamda;
+ double epslon;
+ mu = (xn + yn + 3.0 * zn) * 0.2;
+ xndev = (mu - xn) / mu;
+ yndev = (mu - yn) / mu;
+ zndev = (mu - zn) / mu;
+ epslon = locMAX3(fabs(xndev), fabs(yndev), fabs(zndev));
+ if (epslon < errtol) break;
+ xnroot = sqrt(xn);
+ ynroot = sqrt(yn);
+ znroot = sqrt(zn);
+ lamda = xnroot * (ynroot + znroot) + ynroot * znroot;
+ sigma += power4 / (znroot * (zn + lamda));
+ power4 *= 0.25;
+ xn = (xn + lamda) * 0.25;
+ yn = (yn + lamda) * 0.25;
+ zn = (zn + lamda) * 0.25;
+ }
+ ea = xndev * yndev;
+ eb = zndev * zndev;
+ ec = ea - eb;
+ ed = ea - 6.0 * eb;
+ ef = ed + ec + ec;
+ s1 = ed * (- c1 + 0.25 * c3 * ed - 1.5 * c4 * zndev * ef);
+ s2 = zndev * (c2 * ef + zndev * (- c3 * ec + zndev * c4 * ea));
+ result->val = 3.0 * sigma + power4 * (1.0 + s1 + s2) / (mu * sqrt(mu));
+ result->err = prec * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ DOMAIN_ERROR(result);
+ }
+}
+
+
+int
+gsl_sf_ellint_RF_e(double x, double y, double z, gsl_mode_t mode, gsl_sf_result * result)
+{
+ const double lolim = 5.0 * GSL_DBL_MIN;
+ const double uplim = 0.2 * GSL_DBL_MAX;
+ const gsl_prec_t goal = GSL_MODE_PREC(mode);
+ const double errtol = ( goal == GSL_PREC_DOUBLE ? 0.001 : 0.03 );
+ const double prec = gsl_prec_eps[goal];
+
+ if(x < 0.0 || y < 0.0 || z < 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x+y < lolim || x+z < lolim || y+z < lolim) {
+ DOMAIN_ERROR(result);
+ }
+ else if(locMAX3(x,y,z) < uplim) {
+ const double c1 = 1.0 / 24.0;
+ const double c2 = 3.0 / 44.0;
+ const double c3 = 1.0 / 14.0;
+ double xn = x;
+ double yn = y;
+ double zn = z;
+ double mu, xndev, yndev, zndev, e2, e3, s;
+ while(1) {
+ double epslon, lamda;
+ double xnroot, ynroot, znroot;
+ mu = (xn + yn + zn) / 3.0;
+ xndev = 2.0 - (mu + xn) / mu;
+ yndev = 2.0 - (mu + yn) / mu;
+ zndev = 2.0 - (mu + zn) / mu;
+ epslon = locMAX3(fabs(xndev), fabs(yndev), fabs(zndev));
+ if (epslon < errtol) break;
+ xnroot = sqrt(xn);
+ ynroot = sqrt(yn);
+ znroot = sqrt(zn);
+ lamda = xnroot * (ynroot + znroot) + ynroot * znroot;
+ xn = (xn + lamda) * 0.25;
+ yn = (yn + lamda) * 0.25;
+ zn = (zn + lamda) * 0.25;
+ }
+ e2 = xndev * yndev - zndev * zndev;
+ e3 = xndev * yndev * zndev;
+ s = 1.0 + (c1 * e2 - 0.1 - c2 * e3) * e2 + c3 * e3;
+ result->val = s / sqrt(mu);
+ result->err = prec * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ DOMAIN_ERROR(result);
+ }
+}
+
+
+int
+gsl_sf_ellint_RJ_e(double x, double y, double z, double p, gsl_mode_t mode, gsl_sf_result * result)
+{
+ const gsl_prec_t goal = GSL_MODE_PREC(mode);
+ const double errtol = ( goal == GSL_PREC_DOUBLE ? 0.001 : 0.03 );
+ const double prec = gsl_prec_eps[goal];
+ const double lolim = pow(5.0 * GSL_DBL_MIN, 1.0/3.0);
+ const double uplim = 0.3 * pow(0.2 * GSL_DBL_MAX, 1.0/3.0);
+
+ if(x < 0.0 || y < 0.0 || z < 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x + y < lolim || x + z < lolim || y + z < lolim || p < lolim) {
+ DOMAIN_ERROR(result);
+ }
+ else if(locMAX4(x,y,z,p) < uplim) {
+ const double c1 = 3.0 / 14.0;
+ const double c2 = 1.0 / 3.0;
+ const double c3 = 3.0 / 22.0;
+ const double c4 = 3.0 / 26.0;
+ double xn = x;
+ double yn = y;
+ double zn = z;
+ double pn = p;
+ double sigma = 0.0;
+ double power4 = 1.0;
+ double mu, xndev, yndev, zndev, pndev;
+ double ea, eb, ec, e2, e3, s1, s2, s3;
+ while(1) {
+ double xnroot, ynroot, znroot;
+ double lamda, alfa, beta;
+ double epslon;
+ gsl_sf_result rcresult;
+ int rcstatus;
+ mu = (xn + yn + zn + pn + pn) * 0.2;
+ xndev = (mu - xn) / mu;
+ yndev = (mu - yn) / mu;
+ zndev = (mu - zn) / mu;
+ pndev = (mu - pn) / mu;
+ epslon = locMAX4(fabs(xndev), fabs(yndev), fabs(zndev), fabs(pndev));
+ if(epslon < errtol) break;
+ xnroot = sqrt(xn);
+ ynroot = sqrt(yn);
+ znroot = sqrt(zn);
+ lamda = xnroot * (ynroot + znroot) + ynroot * znroot;
+ alfa = pn * (xnroot + ynroot + znroot) + xnroot * ynroot * znroot;
+ alfa = alfa * alfa;
+ beta = pn * (pn + lamda) * (pn + lamda);
+ rcstatus = gsl_sf_ellint_RC_e(alfa, beta, mode, &rcresult);
+ if(rcstatus != GSL_SUCCESS) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return rcstatus;
+ }
+ sigma += power4 * rcresult.val;
+ power4 *= 0.25;
+ xn = (xn + lamda) * 0.25;
+ yn = (yn + lamda) * 0.25;
+ zn = (zn + lamda) * 0.25;
+ pn = (pn + lamda) * 0.25;
+ }
+
+ ea = xndev * (yndev + zndev) + yndev * zndev;
+ eb = xndev * yndev * zndev;
+ ec = pndev * pndev;
+ e2 = ea - 3.0 * ec;
+ e3 = eb + 2.0 * pndev * (ea - ec);
+ s1 = 1.0 + e2 * (- c1 + 0.75 * c3 * e2 - 1.5 * c4 * e3);
+ s2 = eb * (0.5 * c2 + pndev * (- c3 - c3 + pndev * c4));
+ s3 = pndev * ea * (c2 - pndev * c3) - c2 * pndev * ec;
+ result->val = 3.0 * sigma + power4 * (s1 + s2 + s3) / (mu * sqrt(mu));
+ result->err = prec * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ DOMAIN_ERROR(result);
+ }
+}
+
+
+/* [Carlson, Numer. Math. 33 (1979) 1, (4.1)] */
+int
+gsl_sf_ellint_F_e(double phi, double k, gsl_mode_t mode, gsl_sf_result * result)
+{
+ /* Angular reduction to -pi/2 < phi < pi/2 (we should really use an
+ exact reduction but this will have to do for now) BJG */
+
+ double nc = floor(phi/M_PI + 0.5);
+ double phi_red = phi - nc * M_PI;
+ phi = phi_red;
+
+ {
+ double sin_phi = sin(phi);
+ double sin2_phi = sin_phi*sin_phi;
+ double x = 1.0 - sin2_phi;
+ double y = 1.0 - k*k*sin2_phi;
+ gsl_sf_result rf;
+ int status = gsl_sf_ellint_RF_e(x, y, 1.0, mode, &rf);
+ result->val = sin_phi * rf.val;
+ result->err = GSL_DBL_EPSILON * fabs(result->val) + fabs(sin_phi*rf.err);
+ if (nc == 0) {
+ return status;
+ } else {
+ gsl_sf_result rk; /* add extra terms from periodicity */
+ const int rkstatus = gsl_sf_ellint_Kcomp_e(k, mode, &rk);
+ result->val += 2*nc*rk.val;
+ result->err += 2*fabs(nc)*rk.err;
+ return GSL_ERROR_SELECT_2(status, rkstatus);
+ }
+ }
+}
+
+
+/* [Carlson, Numer. Math. 33 (1979) 1, (4.2)] */
+int
+gsl_sf_ellint_E_e(double phi, double k, gsl_mode_t mode, gsl_sf_result * result)
+{
+ /* Angular reduction to -pi/2 < phi < pi/2 (we should really use an
+ exact reduction but this will have to do for now) BJG */
+
+ double nc = floor(phi/M_PI + 0.5);
+ double phi_red = phi - nc * M_PI;
+ phi = phi_red;
+
+ {
+ const double sin_phi = sin(phi);
+ const double sin2_phi = sin_phi * sin_phi;
+ const double x = 1.0 - sin2_phi;
+ const double y = 1.0 - k*k*sin2_phi;
+
+ if(x < GSL_DBL_EPSILON) {
+ gsl_sf_result re;
+ const int status = gsl_sf_ellint_Ecomp_e(k, mode, &re);
+ /* could use A&S 17.4.14 to improve the value below */
+ result->val = 2*nc*re.val + GSL_SIGN(sin_phi) * re.val;
+ result->err = 2*fabs(nc)*re.err + re.err;
+ return status;
+ }
+ else {
+ gsl_sf_result rf, rd;
+ const double sin3_phi = sin2_phi * sin_phi;
+ const int rfstatus = gsl_sf_ellint_RF_e(x, y, 1.0, mode, &rf);
+ const int rdstatus = gsl_sf_ellint_RD_e(x, y, 1.0, mode, &rd);
+ result->val = sin_phi * rf.val - k*k/3.0 * sin3_phi * rd.val;
+ result->err = GSL_DBL_EPSILON * fabs(sin_phi * rf.val);
+ result->err += fabs(sin_phi*rf.err);
+ result->err += k*k/3.0 * GSL_DBL_EPSILON * fabs(sin3_phi * rd.val);
+ result->err += k*k/3.0 * fabs(sin3_phi*rd.err);
+ if (nc == 0) {
+ return GSL_ERROR_SELECT_2(rfstatus, rdstatus);
+ } else {
+ gsl_sf_result re; /* add extra terms from periodicity */
+ const int restatus = gsl_sf_ellint_Ecomp_e(k, mode, &re);
+ result->val += 2*nc*re.val;
+ result->err += 2*fabs(nc)*re.err;
+ return GSL_ERROR_SELECT_3(rfstatus, rdstatus, restatus);
+ }
+ }
+ }
+}
+
+
+/* [Carlson, Numer. Math. 33 (1979) 1, (4.3)] */
+int
+gsl_sf_ellint_P_e(double phi, double k, double n, gsl_mode_t mode, gsl_sf_result * result)
+{
+ /* Angular reduction to -pi/2 < phi < pi/2 (we should really use an
+ exact reduction but this will have to do for now) BJG */
+
+ double nc = floor(phi/M_PI + 0.5);
+ double phi_red = phi - nc * M_PI;
+ phi = phi_red;
+
+ /* FIXME: need to handle the case of small x, as for E,F */
+
+ {
+ const double sin_phi = sin(phi);
+ const double sin2_phi = sin_phi * sin_phi;
+ const double sin3_phi = sin2_phi * sin_phi;
+ const double x = 1.0 - sin2_phi;
+ const double y = 1.0 - k*k*sin2_phi;
+ gsl_sf_result rf;
+ gsl_sf_result rj;
+ const int rfstatus = gsl_sf_ellint_RF_e(x, y, 1.0, mode, &rf);
+ const int rjstatus = gsl_sf_ellint_RJ_e(x, y, 1.0, 1.0 + n*sin2_phi, mode, &rj);
+ result->val = sin_phi * rf.val - n/3.0*sin3_phi * rj.val;
+ result->err = GSL_DBL_EPSILON * fabs(sin_phi * rf.val);
+ result->err += n/3.0 * fabs(sin3_phi*rj.err);
+ if (nc == 0) {
+ return GSL_ERROR_SELECT_2(rfstatus, rjstatus);
+ } else {
+ gsl_sf_result rp; /* add extra terms from periodicity */
+ const int rpstatus = gsl_sf_ellint_Pcomp_e(k, n, mode, &rp);
+ result->val += 2*nc*rp.val;
+ result->err += 2*fabs(nc)*rp.err;
+ return GSL_ERROR_SELECT_3(rfstatus, rjstatus, rpstatus);
+ }
+ }
+}
+
+
+/* [Carlson, Numer. Math. 33 (1979) 1, (4.4)] */
+int
+gsl_sf_ellint_D_e(double phi, double k, double n, gsl_mode_t mode, gsl_sf_result * result)
+{
+ /* Angular reduction to -pi/2 < phi < pi/2 (we should really use an
+ exact reduction but this will have to do for now) BJG */
+
+ double nc = floor(phi/M_PI + 0.5);
+ double phi_red = phi - nc * M_PI;
+ phi = phi_red;
+
+ /* FIXME: need to handle the case of small x, as for E,F */
+ {
+ const double sin_phi = sin(phi);
+ const double sin2_phi = sin_phi * sin_phi;
+ const double sin3_phi = sin2_phi * sin_phi;
+ const double x = 1.0 - sin2_phi;
+ const double y = 1.0 - k*k*sin2_phi;
+ gsl_sf_result rd;
+ const int status = gsl_sf_ellint_RD_e(x, y, 1.0, mode, &rd);
+ result->val = sin3_phi/3.0 * rd.val;
+ result->err = GSL_DBL_EPSILON * fabs(result->val) + fabs(sin3_phi/3.0 * rd.err);
+ if (nc == 0) {
+ return status;
+ } else {
+ gsl_sf_result rd; /* add extra terms from periodicity */
+ const int rdstatus = gsl_sf_ellint_Dcomp_e(k, mode, &rd);
+ result->val += 2*nc*rd.val;
+ result->err += 2*fabs(nc)*rd.err;
+ return GSL_ERROR_SELECT_2(status, rdstatus);
+ }
+ }
+}
+
+int
+gsl_sf_ellint_Dcomp_e(double k, gsl_mode_t mode, gsl_sf_result * result)
+{
+ if(k*k >= 1.0) {
+ DOMAIN_ERROR(result);
+ } else {
+ const double y = 1.0 - k*k; /* FIXME: still need to handle k~=~1 */
+ gsl_sf_result rd;
+ const int status = gsl_sf_ellint_RD_e(0.0, y, 1.0, mode, &rd);
+ result->val = (1.0/3.0) * rd.val;
+ result->err = GSL_DBL_EPSILON * fabs(result->val) + fabs(1.0/3.0 * rd.err);
+ return status;
+ }
+}
+
+
+/* [Carlson, Numer. Math. 33 (1979) 1, (4.5)] */
+int
+gsl_sf_ellint_Kcomp_e(double k, gsl_mode_t mode, gsl_sf_result * result)
+{
+ if(k*k >= 1.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(k*k >= 1.0 - GSL_SQRT_DBL_EPSILON) {
+ /* [Abramowitz+Stegun, 17.3.33] */
+ const double y = 1.0 - k*k;
+ const double a[] = { 1.38629436112, 0.09666344259, 0.03590092383 };
+ const double b[] = { 0.5, 0.12498593597, 0.06880248576 };
+ const double ta = a[0] + y*(a[1] + y*a[2]);
+ const double tb = -log(y) * (b[0] * y*(b[1] + y*b[2]));
+ result->val = ta + tb;
+ result->err = 2.0 * GSL_DBL_EPSILON * result->val;
+ return GSL_SUCCESS;
+ }
+ else {
+ /* This was previously computed as,
+
+ return gsl_sf_ellint_RF_e(0.0, 1.0 - k*k, 1.0, mode, result);
+
+ but this underestimated the total error for small k, since the
+ argument y=1-k^2 is not exact (there is an absolute error of
+ GSL_DBL_EPSILON near y=0 due to cancellation in the subtraction).
+ Taking the singular behavior of -log(y) above gives an error
+ of 0.5*epsilon/y near y=0. (BJG) */
+
+ double y = 1.0 - k*k;
+ int status = gsl_sf_ellint_RF_e(0.0, y, 1.0, mode, result);
+ result->err += 0.5 * GSL_DBL_EPSILON / y;
+ return status ;
+ }
+}
+
+
+/* [Carlson, Numer. Math. 33 (1979) 1, (4.6)] */
+int
+gsl_sf_ellint_Ecomp_e(double k, gsl_mode_t mode, gsl_sf_result * result)
+{
+ if(k*k >= 1.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(k*k >= 1.0 - GSL_SQRT_DBL_EPSILON) {
+ /* [Abramowitz+Stegun, 17.3.36] */
+ const double y = 1.0 - k*k;
+ const double a[] = { 0.44325141463, 0.06260601220, 0.04757383546 };
+ const double b[] = { 0.24998368310, 0.09200180037, 0.04069697526 };
+ const double ta = 1.0 + y*(a[0] + y*(a[1] + a[2]*y));
+ const double tb = -y*log(y) * (b[0] + y*(b[1] + b[2]*y));
+ result->val = ta + tb;
+ result->err = 2.0 * GSL_DBL_EPSILON * result->val;
+ return GSL_SUCCESS;
+ }
+ else {
+ gsl_sf_result rf;
+ gsl_sf_result rd;
+ const double y = 1.0 - k*k;
+ const int rfstatus = gsl_sf_ellint_RF_e(0.0, y, 1.0, mode, &rf);
+ const int rdstatus = gsl_sf_ellint_RD_e(0.0, y, 1.0, mode, &rd);
+ result->val = rf.val - k*k/3.0 * rd.val;
+ result->err = rf.err + k*k/3.0 * rd.err;
+ return GSL_ERROR_SELECT_2(rfstatus, rdstatus);
+ }
+}
+
+/* [Carlson, Numer. Math. 33 (1979) 1, (4.6)] */
+int
+gsl_sf_ellint_Pcomp_e(double k, double n, gsl_mode_t mode, gsl_sf_result * result)
+{
+ if(k*k >= 1.0 || n >= 1.0) {
+ DOMAIN_ERROR(result);
+ }
+ /* FIXME: need to handle k ~=~ 1 cancellations */
+ else {
+ gsl_sf_result rf;
+ gsl_sf_result rj;
+ const double y = 1.0 - k*k;
+ const int rfstatus = gsl_sf_ellint_RF_e(0.0, y, 1.0, mode, &rf);
+ const int rjstatus = gsl_sf_ellint_RJ_e(0.0, y, 1.0, 1.0 + n, mode, &rj);
+ result->val = rf.val - (n/3.0) * rj.val;
+ result->err = rf.err + fabs(n/3.0) * rj.err;
+ return GSL_ERROR_SELECT_2(rfstatus, rjstatus);
+ }
+}
+
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_ellint_Kcomp(double k, gsl_mode_t mode)
+{
+ EVAL_RESULT(gsl_sf_ellint_Kcomp_e(k, mode, &result));
+}
+
+double gsl_sf_ellint_Ecomp(double k, gsl_mode_t mode)
+{
+ EVAL_RESULT(gsl_sf_ellint_Ecomp_e(k, mode, &result));
+}
+
+double gsl_sf_ellint_Pcomp(double k, double n, gsl_mode_t mode)
+{
+ EVAL_RESULT(gsl_sf_ellint_Pcomp_e(k, n, mode, &result));
+}
+
+double gsl_sf_ellint_Dcomp(double k, gsl_mode_t mode)
+{
+ EVAL_RESULT(gsl_sf_ellint_Dcomp_e(k, mode, &result));
+}
+
+double gsl_sf_ellint_F(double phi, double k, gsl_mode_t mode)
+{
+ EVAL_RESULT(gsl_sf_ellint_F_e(phi, k, mode, &result));
+}
+
+double gsl_sf_ellint_E(double phi, double k, gsl_mode_t mode)
+{
+ EVAL_RESULT(gsl_sf_ellint_E_e(phi, k, mode, &result));
+}
+
+double gsl_sf_ellint_P(double phi, double k, double n, gsl_mode_t mode)
+{
+ EVAL_RESULT(gsl_sf_ellint_P_e(phi, k, n, mode, &result));
+}
+
+double gsl_sf_ellint_D(double phi, double k, double n, gsl_mode_t mode)
+{
+ EVAL_RESULT(gsl_sf_ellint_D_e(phi, k, n, mode, &result));
+}
+
+double gsl_sf_ellint_RC(double x, double y, gsl_mode_t mode)
+{
+ EVAL_RESULT(gsl_sf_ellint_RC_e(x, y, mode, &result));
+}
+
+double gsl_sf_ellint_RD(double x, double y, double z, gsl_mode_t mode)
+{
+ EVAL_RESULT(gsl_sf_ellint_RD_e(x, y, z, mode, &result));
+}
+
+double gsl_sf_ellint_RF(double x, double y, double z, gsl_mode_t mode)
+{
+ EVAL_RESULT(gsl_sf_ellint_RF_e(x, y, z, mode, &result));
+}
+
+double gsl_sf_ellint_RJ(double x, double y, double z, double p, gsl_mode_t mode)
+{
+ EVAL_RESULT(gsl_sf_ellint_RJ_e(x, y, z, p, mode, &result));
+}
diff --git a/gsl-1.9/specfunc/elljac.c b/gsl-1.9/specfunc/elljac.c
new file mode 100644
index 0000000..1fa24f9
--- /dev/null
+++ b/gsl-1.9/specfunc/elljac.c
@@ -0,0 +1,128 @@
+/* specfunc/elljac.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_pow_int.h>
+#include <gsl/gsl_sf_elljac.h>
+
+
+/* GJ: See [Thompson, Atlas for Computing Mathematical Functions] */
+
+/* BJG 2005-07: New algorithm based on Algorithm 5 from Numerische
+ Mathematik 7, 78-90 (1965) "Numerical Calculation of Elliptic
+ Integrals and Elliptic Functions" R. Bulirsch.
+
+ Minor tweak is to avoid division by zero when sin(x u_l) = 0 by
+ computing reflected values sn(K-u) cn(K-u) dn(K-u) and using
+ transformation from Abramowitz & Stegun table 16.8 column "K-u"*/
+
+int
+gsl_sf_elljac_e(double u, double m, double * sn, double * cn, double * dn)
+{
+ if(fabs(m) > 1.0) {
+ *sn = 0.0;
+ *cn = 0.0;
+ *dn = 0.0;
+ GSL_ERROR ("|m| > 1.0", GSL_EDOM);
+ }
+ else if(fabs(m) < 2.0*GSL_DBL_EPSILON) {
+ *sn = sin(u);
+ *cn = cos(u);
+ *dn = 1.0;
+ return GSL_SUCCESS;
+ }
+ else if(fabs(m - 1.0) < 2.0*GSL_DBL_EPSILON) {
+ *sn = tanh(u);
+ *cn = 1.0/cosh(u);
+ *dn = *cn;
+ return GSL_SUCCESS;
+ }
+ else {
+ int status = GSL_SUCCESS;
+ const int N = 16;
+ double mu[16];
+ double nu[16];
+ double c[16];
+ double d[16];
+ double sin_umu, cos_umu, t, r;
+ int n = 0;
+
+ mu[0] = 1.0;
+ nu[0] = sqrt(1.0 - m);
+
+ while( fabs(mu[n] - nu[n]) > 4.0 * GSL_DBL_EPSILON * fabs(mu[n]+nu[n])) {
+ mu[n+1] = 0.5 * (mu[n] + nu[n]);
+ nu[n+1] = sqrt(mu[n] * nu[n]);
+ ++n;
+ if(n >= N - 1) {
+ status = GSL_EMAXITER;
+ break;
+ }
+ }
+
+ sin_umu = sin(u * mu[n]);
+ cos_umu = cos(u * mu[n]);
+
+ /* Since sin(u*mu(n)) can be zero we switch to computing sn(K-u),
+ cn(K-u), dn(K-u) when |sin| < |cos| */
+
+ if (fabs(sin_umu) < fabs(cos_umu))
+ {
+ t = sin_umu / cos_umu;
+
+ c[n] = mu[n] * t;
+ d[n] = 1.0;
+
+ while(n > 0) {
+ n--;
+ c[n] = d[n+1] * c[n+1];
+ r = (c[n+1] * c[n+1]) / mu[n+1];
+ d[n] = (r + nu[n]) / (r + mu[n]);
+ }
+
+ *dn = sqrt(1.0-m) / d[n];
+ *cn = (*dn) * GSL_SIGN(cos_umu) / gsl_hypot(1.0, c[n]);
+ *sn = (*cn) * c[n] /sqrt(1.0-m);
+ }
+ else
+ {
+ t = cos_umu / sin_umu;
+
+ c[n] = mu[n] * t;
+ d[n] = 1.0;
+
+ while(n > 0) {
+ --n;
+ c[n] = d[n+1] * c[n+1];
+ r = (c[n+1] * c[n+1]) / mu[n+1];
+ d[n] = (r + nu[n]) / (r + mu[n]);
+ }
+
+ *dn = d[n];
+ *sn = GSL_SIGN(sin_umu) / gsl_hypot(1.0, c[n]);
+ *cn = c[n] * (*sn);
+ }
+
+ return status;
+ }
+}
diff --git a/gsl-1.9/specfunc/erfc.c b/gsl-1.9/specfunc/erfc.c
new file mode 100644
index 0000000..2e2cff5
--- /dev/null
+++ b/gsl-1.9/specfunc/erfc.c
@@ -0,0 +1,465 @@
+/* specfunc/erfc.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: J. Theiler (modifications by G. Jungman) */
+
+/*
+ * See Hart et al, Computer Approximations, John Wiley and Sons, New York (1968)
+ * (This applies only to the erfc8 stuff, which is the part
+ * of the original code that survives. I have replaced much of
+ * the other stuff with Chebyshev fits. These are simpler and
+ * more precise than the original approximations. [GJ])
+ */
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_exp.h>
+#include <gsl/gsl_sf_erf.h>
+
+#include "check.h"
+
+#include "chebyshev.h"
+#include "cheb_eval.c"
+
+#define LogRootPi_ 0.57236494292470008706
+
+
+static double erfc8_sum(double x)
+{
+ /* estimates erfc(x) valid for 8 < x < 100 */
+ /* This is based on index 5725 in Hart et al */
+
+ static double P[] = {
+ 2.97886562639399288862,
+ 7.409740605964741794425,
+ 6.1602098531096305440906,
+ 5.019049726784267463450058,
+ 1.275366644729965952479585264,
+ 0.5641895835477550741253201704
+ };
+ static double Q[] = {
+ 3.3690752069827527677,
+ 9.608965327192787870698,
+ 17.08144074746600431571095,
+ 12.0489519278551290360340491,
+ 9.396034016235054150430579648,
+ 2.260528520767326969591866945,
+ 1.0
+ };
+ double num=0.0, den=0.0;
+ int i;
+
+ num = P[5];
+ for (i=4; i>=0; --i) {
+ num = x*num + P[i];
+ }
+ den = Q[6];
+ for (i=5; i>=0; --i) {
+ den = x*den + Q[i];
+ }
+
+ return num/den;
+}
+
+inline
+static double erfc8(double x)
+{
+ double e;
+ e = erfc8_sum(x);
+ e *= exp(-x*x);
+ return e;
+}
+
+inline
+static double log_erfc8(double x)
+{
+ double e;
+ e = erfc8_sum(x);
+ e = log(e) - x*x;
+ return e;
+}
+
+#if 0
+/* Abramowitz+Stegun, 7.2.14 */
+static double erfcasympsum(double x)
+{
+ int i;
+ double e = 1.;
+ double coef = 1.;
+ for (i=1; i<5; ++i) {
+ /* coef *= -(2*i-1)/(2*x*x); ??? [GJ] */
+ coef *= -(2*i+1)/(i*(4*x*x*x*x));
+ e += coef;
+ /*
+ if (fabs(coef) < 1.0e-15) break;
+ if (fabs(coef) > 1.0e10) break;
+
+ [GJ]: These tests are not useful. This function is only
+ used below. Took them out; they gum up the pipeline.
+ */
+ }
+ return e;
+}
+#endif /* 0 */
+
+
+/* Abramowitz+Stegun, 7.1.5 */
+static int erfseries(double x, gsl_sf_result * result)
+{
+ double coef = x;
+ double e = coef;
+ double del;
+ int k;
+ for (k=1; k<30; ++k) {
+ coef *= -x*x/k;
+ del = coef/(2.0*k+1.0);
+ e += del;
+ }
+ result->val = 2.0 / M_SQRTPI * e;
+ result->err = 2.0 / M_SQRTPI * (fabs(del) + GSL_DBL_EPSILON);
+ return GSL_SUCCESS;
+}
+
+
+/* Chebyshev fit for erfc((t+1)/2), -1 < t < 1
+ */
+static double erfc_xlt1_data[20] = {
+ 1.06073416421769980345174155056,
+ -0.42582445804381043569204735291,
+ 0.04955262679620434040357683080,
+ 0.00449293488768382749558001242,
+ -0.00129194104658496953494224761,
+ -0.00001836389292149396270416979,
+ 0.00002211114704099526291538556,
+ -5.23337485234257134673693179020e-7,
+ -2.78184788833537885382530989578e-7,
+ 1.41158092748813114560316684249e-8,
+ 2.72571296330561699984539141865e-9,
+ -2.06343904872070629406401492476e-10,
+ -2.14273991996785367924201401812e-11,
+ 2.22990255539358204580285098119e-12,
+ 1.36250074650698280575807934155e-13,
+ -1.95144010922293091898995913038e-14,
+ -6.85627169231704599442806370690e-16,
+ 1.44506492869699938239521607493e-16,
+ 2.45935306460536488037576200030e-18,
+ -9.29599561220523396007359328540e-19
+};
+static cheb_series erfc_xlt1_cs = {
+ erfc_xlt1_data,
+ 19,
+ -1, 1,
+ 12
+};
+
+/* Chebyshev fit for erfc(x) exp(x^2), 1 < x < 5, x = 2t + 3, -1 < t < 1
+ */
+static double erfc_x15_data[25] = {
+ 0.44045832024338111077637466616,
+ -0.143958836762168335790826895326,
+ 0.044786499817939267247056666937,
+ -0.013343124200271211203618353102,
+ 0.003824682739750469767692372556,
+ -0.001058699227195126547306482530,
+ 0.000283859419210073742736310108,
+ -0.000073906170662206760483959432,
+ 0.000018725312521489179015872934,
+ -4.62530981164919445131297264430e-6,
+ 1.11558657244432857487884006422e-6,
+ -2.63098662650834130067808832725e-7,
+ 6.07462122724551777372119408710e-8,
+ -1.37460865539865444777251011793e-8,
+ 3.05157051905475145520096717210e-9,
+ -6.65174789720310713757307724790e-10,
+ 1.42483346273207784489792999706e-10,
+ -3.00141127395323902092018744545e-11,
+ 6.22171792645348091472914001250e-12,
+ -1.26994639225668496876152836555e-12,
+ 2.55385883033257575402681845385e-13,
+ -5.06258237507038698392265499770e-14,
+ 9.89705409478327321641264227110e-15,
+ -1.90685978789192181051961024995e-15,
+ 3.50826648032737849245113757340e-16
+};
+static cheb_series erfc_x15_cs = {
+ erfc_x15_data,
+ 24,
+ -1, 1,
+ 16
+};
+
+/* Chebyshev fit for erfc(x) x exp(x^2), 5 < x < 10, x = (5t + 15)/2, -1 < t < 1
+ */
+static double erfc_x510_data[20] = {
+ 1.11684990123545698684297865808,
+ 0.003736240359381998520654927536,
+ -0.000916623948045470238763619870,
+ 0.000199094325044940833965078819,
+ -0.000040276384918650072591781859,
+ 7.76515264697061049477127605790e-6,
+ -1.44464794206689070402099225301e-6,
+ 2.61311930343463958393485241947e-7,
+ -4.61833026634844152345304095560e-8,
+ 8.00253111512943601598732144340e-9,
+ -1.36291114862793031395712122089e-9,
+ 2.28570483090160869607683087722e-10,
+ -3.78022521563251805044056974560e-11,
+ 6.17253683874528285729910462130e-12,
+ -9.96019290955316888445830597430e-13,
+ 1.58953143706980770269506726000e-13,
+ -2.51045971047162509999527428316e-14,
+ 3.92607828989125810013581287560e-15,
+ -6.07970619384160374392535453420e-16,
+ 9.12600607264794717315507477670e-17
+};
+static cheb_series erfc_x510_cs = {
+ erfc_x510_data,
+ 19,
+ -1, 1,
+ 12
+};
+
+#if 0
+inline
+static double
+erfc_asymptotic(double x)
+{
+ return exp(-x*x)/x * erfcasympsum(x) / M_SQRTPI;
+}
+inline
+static double
+log_erfc_asymptotic(double x)
+{
+ return log(erfcasympsum(x)/x) - x*x - LogRootPi_;
+}
+#endif /* 0 */
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int gsl_sf_erfc_e(double x, gsl_sf_result * result)
+{
+ const double ax = fabs(x);
+ double e_val, e_err;
+
+ /* CHECK_POINTER(result) */
+
+ if(ax <= 1.0) {
+ double t = 2.0*ax - 1.0;
+ gsl_sf_result c;
+ cheb_eval_e(&erfc_xlt1_cs, t, &c);
+ e_val = c.val;
+ e_err = c.err;
+ }
+ else if(ax <= 5.0) {
+ double ex2 = exp(-x*x);
+ double t = 0.5*(ax-3.0);
+ gsl_sf_result c;
+ cheb_eval_e(&erfc_x15_cs, t, &c);
+ e_val = ex2 * c.val;
+ e_err = ex2 * (c.err + 2.0*fabs(x)*GSL_DBL_EPSILON);
+ }
+ else if(ax < 10.0) {
+ double exterm = exp(-x*x) / ax;
+ double t = (2.0*ax - 15.0)/5.0;
+ gsl_sf_result c;
+ cheb_eval_e(&erfc_x510_cs, t, &c);
+ e_val = exterm * c.val;
+ e_err = exterm * (c.err + 2.0*fabs(x)*GSL_DBL_EPSILON + GSL_DBL_EPSILON);
+ }
+ else {
+ e_val = erfc8(ax);
+ e_err = (x*x + 1.0) * GSL_DBL_EPSILON * fabs(e_val);
+ }
+
+ if(x < 0.0) {
+ result->val = 2.0 - e_val;
+ result->err = e_err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ }
+ else {
+ result->val = e_val;
+ result->err = e_err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+int gsl_sf_log_erfc_e(double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x*x < 10.0*GSL_ROOT6_DBL_EPSILON) {
+ const double y = x / M_SQRTPI;
+ /* series for -1/2 Log[Erfc[Sqrt[Pi] y]] */
+ const double c3 = (4.0 - M_PI)/3.0;
+ const double c4 = 2.0*(1.0 - M_PI/3.0);
+ const double c5 = -0.001829764677455021; /* (96.0 - 40.0*M_PI + 3.0*M_PI*M_PI)/30.0 */
+ const double c6 = 0.02629651521057465; /* 2.0*(120.0 - 60.0*M_PI + 7.0*M_PI*M_PI)/45.0 */
+ const double c7 = -0.01621575378835404;
+ const double c8 = 0.00125993961762116;
+ const double c9 = 0.00556964649138;
+ const double c10 = -0.0045563339802;
+ const double c11 = 0.0009461589032;
+ const double c12 = 0.0013200243174;
+ const double c13 = -0.00142906;
+ const double c14 = 0.00048204;
+ double series = c8 + y*(c9 + y*(c10 + y*(c11 + y*(c12 + y*(c13 + c14*y)))));
+ series = y*(1.0 + y*(1.0 + y*(c3 + y*(c4 + y*(c5 + y*(c6 + y*(c7 + y*series)))))));
+ result->val = -2.0 * series;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ /*
+ don't like use of log1p(); added above series stuff for small x instead, should be ok [GJ]
+ else if (fabs(x) < 1.0) {
+ gsl_sf_result result_erf;
+ gsl_sf_erf_e(x, &result_erf);
+ result->val = log1p(-result_erf.val);
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ */
+ else if(x > 8.0) {
+ result->val = log_erfc8(x);
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ gsl_sf_result result_erfc;
+ gsl_sf_erfc_e(x, &result_erfc);
+ result->val = log(result_erfc.val);
+ result->err = fabs(result_erfc.err / result_erfc.val);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+}
+
+
+int gsl_sf_erf_e(double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(fabs(x) < 1.0) {
+ return erfseries(x, result);
+ }
+ else {
+ gsl_sf_result result_erfc;
+ gsl_sf_erfc_e(x, &result_erfc);
+ result->val = 1.0 - result_erfc.val;
+ result->err = result_erfc.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+}
+
+
+int gsl_sf_erf_Z_e(double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ {
+ const double ex2 = exp(-x*x/2.0);
+ result->val = ex2 / (M_SQRT2 * M_SQRTPI);
+ result->err = fabs(x * result->val) * GSL_DBL_EPSILON;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ CHECK_UNDERFLOW(result);
+ return GSL_SUCCESS;
+ }
+}
+
+
+int gsl_sf_erf_Q_e(double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ {
+ gsl_sf_result result_erfc;
+ int stat = gsl_sf_erfc_e(x/M_SQRT2, &result_erfc);
+ result->val = 0.5 * result_erfc.val;
+ result->err = 0.5 * result_erfc.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return stat;
+ }
+}
+
+
+int gsl_sf_hazard_e(double x, gsl_sf_result * result)
+{
+ if(x < 25.0)
+ {
+ gsl_sf_result result_ln_erfc;
+ const int stat_l = gsl_sf_log_erfc_e(x/M_SQRT2, &result_ln_erfc);
+ const double lnc = -0.22579135264472743236; /* ln(sqrt(2/pi)) */
+ const double arg = lnc - 0.5*x*x - result_ln_erfc.val;
+ const int stat_e = gsl_sf_exp_e(arg, result);
+ result->err += 3.0 * (1.0 + fabs(x)) * GSL_DBL_EPSILON * fabs(result->val);
+ result->err += fabs(result_ln_erfc.err * result->val);
+ return GSL_ERROR_SELECT_2(stat_l, stat_e);
+ }
+ else
+ {
+ const double ix2 = 1.0/(x*x);
+ const double corrB = 1.0 - 9.0*ix2 * (1.0 - 11.0*ix2);
+ const double corrM = 1.0 - 5.0*ix2 * (1.0 - 7.0*ix2 * corrB);
+ const double corrT = 1.0 - ix2 * (1.0 - 3.0*ix2*corrM);
+ result->val = x / corrT;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+}
+
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_erfc(double x)
+{
+ EVAL_RESULT(gsl_sf_erfc_e(x, &result));
+}
+
+double gsl_sf_log_erfc(double x)
+{
+ EVAL_RESULT(gsl_sf_log_erfc_e(x, &result));
+}
+
+double gsl_sf_erf(double x)
+{
+ EVAL_RESULT(gsl_sf_erf_e(x, &result));
+}
+
+double gsl_sf_erf_Z(double x)
+{
+ EVAL_RESULT(gsl_sf_erf_Z_e(x, &result));
+}
+
+double gsl_sf_erf_Q(double x)
+{
+ EVAL_RESULT(gsl_sf_erf_Q_e(x, &result));
+}
+
+double gsl_sf_hazard(double x)
+{
+ EVAL_RESULT(gsl_sf_hazard_e(x, &result));
+}
+
diff --git a/gsl-1.9/specfunc/error.h b/gsl-1.9/specfunc/error.h
new file mode 100644
index 0000000..b041b20
--- /dev/null
+++ b/gsl-1.9/specfunc/error.h
@@ -0,0 +1,27 @@
+#define OVERFLOW_ERROR(result) do { (result)->val = GSL_POSINF; (result)->err = GSL_POSINF; GSL_ERROR ("overflow", GSL_EOVRFLW); } while(0)
+
+#define UNDERFLOW_ERROR(result) do { (result)->val = 0.0; (result)->err = GSL_DBL_MIN; GSL_ERROR ("underflow", GSL_EUNDRFLW); } while(0)
+
+#define INTERNAL_OVERFLOW_ERROR(result) do { (result)->val = GSL_POSINF; (result)->err = GSL_POSINF; return GSL_EOVRFLW; } while(0)
+
+#define INTERNAL_UNDERFLOW_ERROR(result) do { (result)->val = 0.0; (result)->err = GSL_DBL_MIN; return GSL_EUNDRFLW; } while(0)
+
+#define DOMAIN_ERROR(result) do { (result)->val = GSL_NAN; (result)->err = GSL_NAN; GSL_ERROR ("domain error", GSL_EDOM); } while(0)
+
+#define DOMAIN_ERROR_MSG(msg, result) do { (result)->val = GSL_NAN; (result)->err = GSL_NAN; GSL_ERROR ((msg), GSL_EDOM); } while(0)
+
+#define DOMAIN_ERROR_E10(result) do { (result)->val = GSL_NAN; (result)->err = GSL_NAN; (result)->e10 = 0 ; GSL_ERROR ("domain error", GSL_EDOM); } while(0)
+
+#define OVERFLOW_ERROR_E10(result) do { (result)->val = GSL_POSINF; (result)->err = GSL_POSINF; (result)->e10 = 0; GSL_ERROR ("overflow", GSL_EOVRFLW); } while(0)
+#define UNDERFLOW_ERROR_E10(result) do { (result)->val = 0.0; (result)->err = GSL_DBL_MIN; (result)->e10 = 0; GSL_ERROR ("underflow", GSL_EUNDRFLW); } while(0)
+
+
+#define OVERFLOW_ERROR_2(r1,r2) do { (r1)->val = GSL_POSINF; (r1)->err = GSL_POSINF; (r2)->val = GSL_POSINF ; (r2)->err=GSL_POSINF; GSL_ERROR ("overflow", GSL_EOVRFLW); } while(0)
+
+#define UNDERFLOW_ERROR_2(r1,r2) do { (r1)->val = 0.0; (r1)->err = GSL_DBL_MIN; (r2)->val = 0.0 ; (r2)->err = GSL_DBL_MIN; GSL_ERROR ("underflow", GSL_EUNDRFLW); } while(0)
+
+#define DOMAIN_ERROR_2(r1,r2) do { (r1)->val = GSL_NAN; (r1)->err = GSL_NAN; (r2)->val = GSL_NAN; (r2)->err = GSL_NAN; GSL_ERROR ("domain error", GSL_EDOM); } while(0)
+
+
+
+
diff --git a/gsl-1.9/specfunc/eval.h b/gsl-1.9/specfunc/eval.h
new file mode 100644
index 0000000..00ddfed
--- /dev/null
+++ b/gsl-1.9/specfunc/eval.h
@@ -0,0 +1,17 @@
+/* evaluate a function discarding the status value in a modifiable way */
+
+#define EVAL_RESULT(fn) \
+ gsl_sf_result result; \
+ int status = fn; \
+ if (status != GSL_SUCCESS) { \
+ GSL_ERROR_VAL(#fn, status, result.val); \
+ } ; \
+ return result.val;
+
+#define EVAL_DOUBLE(fn) \
+ int status = fn; \
+ if (status != GSL_SUCCESS) { \
+ GSL_ERROR_VAL(#fn, status, result); \
+ } ; \
+ return result;
+
diff --git a/gsl-1.9/specfunc/exp.c b/gsl-1.9/specfunc/exp.c
new file mode 100644
index 0000000..02030d0
--- /dev/null
+++ b/gsl-1.9/specfunc/exp.c
@@ -0,0 +1,608 @@
+/* specfunc/exp.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_gamma.h>
+#include <gsl/gsl_sf_exp.h>
+
+#include "error.h"
+
+/* Evaluate the continued fraction for exprel.
+ * [Abramowitz+Stegun, 4.2.41]
+ */
+static
+int
+exprel_n_CF(const int N, const double x, gsl_sf_result * result)
+{
+ const double RECUR_BIG = GSL_SQRT_DBL_MAX;
+ const int maxiter = 5000;
+ int n = 1;
+ double Anm2 = 1.0;
+ double Bnm2 = 0.0;
+ double Anm1 = 0.0;
+ double Bnm1 = 1.0;
+ double a1 = 1.0;
+ double b1 = 1.0;
+ double a2 = -x;
+ double b2 = N+1;
+ double an, bn;
+
+ double fn;
+
+ double An = b1*Anm1 + a1*Anm2; /* A1 */
+ double Bn = b1*Bnm1 + a1*Bnm2; /* B1 */
+
+ /* One explicit step, before we get to the main pattern. */
+ n++;
+ Anm2 = Anm1;
+ Bnm2 = Bnm1;
+ Anm1 = An;
+ Bnm1 = Bn;
+ An = b2*Anm1 + a2*Anm2; /* A2 */
+ Bn = b2*Bnm1 + a2*Bnm2; /* B2 */
+
+ fn = An/Bn;
+
+ while(n < maxiter) {
+ double old_fn;
+ double del;
+ n++;
+ Anm2 = Anm1;
+ Bnm2 = Bnm1;
+ Anm1 = An;
+ Bnm1 = Bn;
+ an = ( GSL_IS_ODD(n) ? ((n-1)/2)*x : -(N+(n/2)-1)*x );
+ bn = N + n - 1;
+ An = bn*Anm1 + an*Anm2;
+ Bn = bn*Bnm1 + an*Bnm2;
+
+ if(fabs(An) > RECUR_BIG || fabs(Bn) > RECUR_BIG) {
+ An /= RECUR_BIG;
+ Bn /= RECUR_BIG;
+ Anm1 /= RECUR_BIG;
+ Bnm1 /= RECUR_BIG;
+ Anm2 /= RECUR_BIG;
+ Bnm2 /= RECUR_BIG;
+ }
+
+ old_fn = fn;
+ fn = An/Bn;
+ del = old_fn/fn;
+
+ if(fabs(del - 1.0) < 2.0*GSL_DBL_EPSILON) break;
+ }
+
+ result->val = fn;
+ result->err = 2.0*(n+1.0)*GSL_DBL_EPSILON*fabs(fn);
+
+ if(n == maxiter)
+ GSL_ERROR ("error", GSL_EMAXITER);
+ else
+ return GSL_SUCCESS;
+}
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int gsl_sf_exp_e(const double x, gsl_sf_result * result)
+{
+ if(x > GSL_LOG_DBL_MAX) {
+ OVERFLOW_ERROR(result);
+ }
+ else if(x < GSL_LOG_DBL_MIN) {
+ UNDERFLOW_ERROR(result);
+ }
+ else {
+ result->val = exp(x);
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+}
+
+int gsl_sf_exp_e10_e(const double x, gsl_sf_result_e10 * result)
+{
+ if(x > INT_MAX-1) {
+ OVERFLOW_ERROR_E10(result);
+ }
+ else if(x < INT_MIN+1) {
+ UNDERFLOW_ERROR_E10(result);
+ }
+ else {
+ const int N = (int) floor(x/M_LN10);
+ result->val = exp(x-N*M_LN10);
+ result->err = 2.0 * (fabs(x)+1.0) * GSL_DBL_EPSILON * fabs(result->val);
+ result->e10 = N;
+ return GSL_SUCCESS;
+ }
+}
+
+
+int gsl_sf_exp_mult_e(const double x, const double y, gsl_sf_result * result)
+{
+ const double ay = fabs(y);
+
+ if(y == 0.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if( ( x < 0.5*GSL_LOG_DBL_MAX && x > 0.5*GSL_LOG_DBL_MIN)
+ && (ay < 0.8*GSL_SQRT_DBL_MAX && ay > 1.2*GSL_SQRT_DBL_MIN)
+ ) {
+ const double ex = exp(x);
+ result->val = y * ex;
+ result->err = (2.0 + fabs(x)) * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ const double ly = log(ay);
+ const double lnr = x + ly;
+
+ if(lnr > GSL_LOG_DBL_MAX - 0.01) {
+ OVERFLOW_ERROR(result);
+ }
+ else if(lnr < GSL_LOG_DBL_MIN + 0.01) {
+ UNDERFLOW_ERROR(result);
+ }
+ else {
+ const double sy = GSL_SIGN(y);
+ const double M = floor(x);
+ const double N = floor(ly);
+ const double a = x - M;
+ const double b = ly - N;
+ const double berr = 2.0 * GSL_DBL_EPSILON * (fabs(ly) + fabs(N));
+ result->val = sy * exp(M+N) * exp(a+b);
+ result->err = berr * fabs(result->val);
+ result->err += 2.0 * GSL_DBL_EPSILON * (M + N + 1.0) * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ }
+}
+
+
+int gsl_sf_exp_mult_e10_e(const double x, const double y, gsl_sf_result_e10 * result)
+{
+ const double ay = fabs(y);
+
+ if(y == 0.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ result->e10 = 0;
+ return GSL_SUCCESS;
+ }
+ else if( ( x < 0.5*GSL_LOG_DBL_MAX && x > 0.5*GSL_LOG_DBL_MIN)
+ && (ay < 0.8*GSL_SQRT_DBL_MAX && ay > 1.2*GSL_SQRT_DBL_MIN)
+ ) {
+ const double ex = exp(x);
+ result->val = y * ex;
+ result->err = (2.0 + fabs(x)) * GSL_DBL_EPSILON * fabs(result->val);
+ result->e10 = 0;
+ return GSL_SUCCESS;
+ }
+ else {
+ const double ly = log(ay);
+ const double l10_val = (x + ly)/M_LN10;
+
+ if(l10_val > INT_MAX-1) {
+ OVERFLOW_ERROR_E10(result);
+ }
+ else if(l10_val < INT_MIN+1) {
+ UNDERFLOW_ERROR_E10(result);
+ }
+ else {
+ const double sy = GSL_SIGN(y);
+ const int N = (int) floor(l10_val);
+ const double arg_val = (l10_val - N) * M_LN10;
+ const double arg_err = 2.0 * GSL_DBL_EPSILON * fabs(ly);
+
+ result->val = sy * exp(arg_val);
+ result->err = arg_err * fabs(result->val);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ result->e10 = N;
+
+ return GSL_SUCCESS;
+ }
+ }
+}
+
+
+int gsl_sf_exp_mult_err_e(const double x, const double dx,
+ const double y, const double dy,
+ gsl_sf_result * result)
+{
+ const double ay = fabs(y);
+
+ if(y == 0.0) {
+ result->val = 0.0;
+ result->err = fabs(dy * exp(x));
+ return GSL_SUCCESS;
+ }
+ else if( ( x < 0.5*GSL_LOG_DBL_MAX && x > 0.5*GSL_LOG_DBL_MIN)
+ && (ay < 0.8*GSL_SQRT_DBL_MAX && ay > 1.2*GSL_SQRT_DBL_MIN)
+ ) {
+ double ex = exp(x);
+ result->val = y * ex;
+ result->err = ex * (fabs(dy) + fabs(y*dx));
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ const double ly = log(ay);
+ const double lnr = x + ly;
+
+ if(lnr > GSL_LOG_DBL_MAX - 0.01) {
+ OVERFLOW_ERROR(result);
+ }
+ else if(lnr < GSL_LOG_DBL_MIN + 0.01) {
+ UNDERFLOW_ERROR(result);
+ }
+ else {
+ const double sy = GSL_SIGN(y);
+ const double M = floor(x);
+ const double N = floor(ly);
+ const double a = x - M;
+ const double b = ly - N;
+ const double eMN = exp(M+N);
+ const double eab = exp(a+b);
+ result->val = sy * eMN * eab;
+ result->err = eMN * eab * 2.0*GSL_DBL_EPSILON;
+ result->err += eMN * eab * fabs(dy/y);
+ result->err += eMN * eab * fabs(dx);
+ return GSL_SUCCESS;
+ }
+ }
+}
+
+
+int gsl_sf_exp_mult_err_e10_e(const double x, const double dx,
+ const double y, const double dy,
+ gsl_sf_result_e10 * result)
+{
+ const double ay = fabs(y);
+
+ if(y == 0.0) {
+ result->val = 0.0;
+ result->err = fabs(dy * exp(x));
+ result->e10 = 0;
+ return GSL_SUCCESS;
+ }
+ else if( ( x < 0.5*GSL_LOG_DBL_MAX && x > 0.5*GSL_LOG_DBL_MIN)
+ && (ay < 0.8*GSL_SQRT_DBL_MAX && ay > 1.2*GSL_SQRT_DBL_MIN)
+ ) {
+ const double ex = exp(x);
+ result->val = y * ex;
+ result->err = ex * (fabs(dy) + fabs(y*dx));
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ result->e10 = 0;
+ return GSL_SUCCESS;
+ }
+ else {
+ const double ly = log(ay);
+ const double l10_val = (x + ly)/M_LN10;
+
+ if(l10_val > INT_MAX-1) {
+ OVERFLOW_ERROR_E10(result);
+ }
+ else if(l10_val < INT_MIN+1) {
+ UNDERFLOW_ERROR_E10(result);
+ }
+ else {
+ const double sy = GSL_SIGN(y);
+ const int N = (int) floor(l10_val);
+ const double arg_val = (l10_val - N) * M_LN10;
+ const double arg_err = dy/fabs(y) + dx + 2.0*GSL_DBL_EPSILON*fabs(arg_val);
+
+ result->val = sy * exp(arg_val);
+ result->err = arg_err * fabs(result->val);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ result->e10 = N;
+
+ return GSL_SUCCESS;
+ }
+ }
+}
+
+
+int gsl_sf_expm1_e(const double x, gsl_sf_result * result)
+{
+ const double cut = 0.002;
+
+ if(x < GSL_LOG_DBL_MIN) {
+ result->val = -1.0;
+ result->err = GSL_DBL_EPSILON;
+ return GSL_SUCCESS;
+ }
+ else if(x < -cut) {
+ result->val = exp(x) - 1.0;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x < cut) {
+ result->val = x * (1.0 + 0.5*x*(1.0 + x/3.0*(1.0 + 0.25*x*(1.0 + 0.2*x))));
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x < GSL_LOG_DBL_MAX) {
+ result->val = exp(x) - 1.0;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ OVERFLOW_ERROR(result);
+ }
+}
+
+
+int gsl_sf_exprel_e(const double x, gsl_sf_result * result)
+{
+ const double cut = 0.002;
+
+ if(x < GSL_LOG_DBL_MIN) {
+ result->val = -1.0/x;
+ result->err = GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x < -cut) {
+ result->val = (exp(x) - 1.0)/x;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x < cut) {
+ result->val = (1.0 + 0.5*x*(1.0 + x/3.0*(1.0 + 0.25*x*(1.0 + 0.2*x))));
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x < GSL_LOG_DBL_MAX) {
+ result->val = (exp(x) - 1.0)/x;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ OVERFLOW_ERROR(result);
+ }
+}
+
+
+int gsl_sf_exprel_2_e(double x, gsl_sf_result * result)
+{
+ const double cut = 0.002;
+
+ if(x < GSL_LOG_DBL_MIN) {
+ result->val = -2.0/x*(1.0 + 1.0/x);
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x < -cut) {
+ result->val = 2.0*(exp(x) - 1.0 - x)/(x*x);
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x < cut) {
+ result->val = (1.0 + 1.0/3.0*x*(1.0 + 0.25*x*(1.0 + 0.2*x*(1.0 + 1.0/6.0*x))));
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x < GSL_LOG_DBL_MAX) {
+ result->val = 2.0*(exp(x) - 1.0 - x)/(x*x);
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ OVERFLOW_ERROR(result);
+ }
+}
+
+
+int
+gsl_sf_exprel_n_e(const int N, const double x, gsl_sf_result * result)
+{
+ if(N < 0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x == 0.0) {
+ result->val = 1.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(fabs(x) < GSL_ROOT3_DBL_EPSILON * N) {
+ result->val = 1.0 + x/(N+1) * (1.0 + x/(N+2));
+ result->err = 2.0 * GSL_DBL_EPSILON;
+ return GSL_SUCCESS;
+ }
+ else if(N == 0) {
+ return gsl_sf_exp_e(x, result);
+ }
+ else if(N == 1) {
+ return gsl_sf_exprel_e(x, result);
+ }
+ else if(N == 2) {
+ return gsl_sf_exprel_2_e(x, result);
+ }
+ else {
+ if(x > N && (-x + N*(1.0 + log(x/N)) < GSL_LOG_DBL_EPSILON)) {
+ /* x is much larger than n.
+ * Ignore polynomial part, so
+ * exprel_N(x) ~= e^x N!/x^N
+ */
+ gsl_sf_result lnf_N;
+ double lnr_val;
+ double lnr_err;
+ double lnterm;
+ gsl_sf_lnfact_e(N, &lnf_N);
+ lnterm = N*log(x);
+ lnr_val = x + lnf_N.val - lnterm;
+ lnr_err = GSL_DBL_EPSILON * (fabs(x) + fabs(lnf_N.val) + fabs(lnterm));
+ lnr_err += lnf_N.err;
+ return gsl_sf_exp_err_e(lnr_val, lnr_err, result);
+ }
+ else if(x > N) {
+ /* Write the identity
+ * exprel_n(x) = e^x n! / x^n (1 - Gamma[n,x]/Gamma[n])
+ * then use the asymptotic expansion
+ * Gamma[n,x] ~ x^(n-1) e^(-x) (1 + (n-1)/x + (n-1)(n-2)/x^2 + ...)
+ */
+ double ln_x = log(x);
+ gsl_sf_result lnf_N;
+ double lg_N;
+ double lnpre_val;
+ double lnpre_err;
+ gsl_sf_lnfact_e(N, &lnf_N); /* log(N!) */
+ lg_N = lnf_N.val - log(N); /* log(Gamma(N)) */
+ lnpre_val = x + lnf_N.val - N*ln_x;
+ lnpre_err = GSL_DBL_EPSILON * (fabs(x) + fabs(lnf_N.val) + fabs(N*ln_x));
+ lnpre_err += lnf_N.err;
+ if(lnpre_val < GSL_LOG_DBL_MAX - 5.0) {
+ int stat_eG;
+ gsl_sf_result bigG_ratio;
+ gsl_sf_result pre;
+ int stat_ex = gsl_sf_exp_err_e(lnpre_val, lnpre_err, &pre);
+ double ln_bigG_ratio_pre = -x + (N-1)*ln_x - lg_N;
+ double bigGsum = 1.0;
+ double term = 1.0;
+ int k;
+ for(k=1; k<N; k++) {
+ term *= (N-k)/x;
+ bigGsum += term;
+ }
+ stat_eG = gsl_sf_exp_mult_e(ln_bigG_ratio_pre, bigGsum, &bigG_ratio);
+ if(stat_eG == GSL_SUCCESS) {
+ result->val = pre.val * (1.0 - bigG_ratio.val);
+ result->err = pre.val * (2.0*GSL_DBL_EPSILON + bigG_ratio.err);
+ result->err += pre.err * fabs(1.0 - bigG_ratio.val);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return stat_ex;
+ }
+ else {
+ result->val = 0.0;
+ result->err = 0.0;
+ return stat_eG;
+ }
+ }
+ else {
+ OVERFLOW_ERROR(result);
+ }
+ }
+ else if(x > -10.0*N) {
+ return exprel_n_CF(N, x, result);
+ }
+ else {
+ /* x -> -Inf asymptotic:
+ * exprel_n(x) ~ e^x n!/x^n - n/x (1 + (n-1)/x + (n-1)(n-2)/x + ...)
+ * ~ - n/x (1 + (n-1)/x + (n-1)(n-2)/x + ...)
+ */
+ double sum = 1.0;
+ double term = 1.0;
+ int k;
+ for(k=1; k<N; k++) {
+ term *= (N-k)/x;
+ sum += term;
+ }
+ result->val = -N/x * sum;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ }
+}
+
+
+int
+gsl_sf_exp_err_e(const double x, const double dx, gsl_sf_result * result)
+{
+ const double adx = fabs(dx);
+
+ /* CHECK_POINTER(result) */
+
+ if(x + adx > GSL_LOG_DBL_MAX) {
+ OVERFLOW_ERROR(result);
+ }
+ else if(x - adx < GSL_LOG_DBL_MIN) {
+ UNDERFLOW_ERROR(result);
+ }
+ else {
+ const double ex = exp(x);
+ const double edx = exp(adx);
+ result->val = ex;
+ result->err = ex * GSL_MAX_DBL(GSL_DBL_EPSILON, edx - 1.0/edx);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+}
+
+
+int
+gsl_sf_exp_err_e10_e(const double x, const double dx, gsl_sf_result_e10 * result)
+{
+ const double adx = fabs(dx);
+
+ /* CHECK_POINTER(result) */
+
+ if(x + adx > INT_MAX - 1) {
+ OVERFLOW_ERROR_E10(result);
+ }
+ else if(x - adx < INT_MIN + 1) {
+ UNDERFLOW_ERROR_E10(result);
+ }
+ else {
+ const int N = (int)floor(x/M_LN10);
+ const double ex = exp(x-N*M_LN10);
+ result->val = ex;
+ result->err = ex * (2.0 * GSL_DBL_EPSILON * (fabs(x) + 1.0) + adx);
+ result->e10 = N;
+ return GSL_SUCCESS;
+ }
+}
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_exp(const double x)
+{
+ EVAL_RESULT(gsl_sf_exp_e(x, &result));
+}
+
+double gsl_sf_exp_mult(const double x, const double y)
+{
+ EVAL_RESULT(gsl_sf_exp_mult_e(x, y, &result));
+}
+
+double gsl_sf_expm1(const double x)
+{
+ EVAL_RESULT(gsl_sf_expm1_e(x, &result));
+}
+
+double gsl_sf_exprel(const double x)
+{
+ EVAL_RESULT(gsl_sf_exprel_e(x, &result));
+}
+
+double gsl_sf_exprel_2(const double x)
+{
+ EVAL_RESULT(gsl_sf_exprel_2_e(x, &result));
+}
+
+double gsl_sf_exprel_n(const int n, const double x)
+{
+ EVAL_RESULT(gsl_sf_exprel_n_e(n, x, &result));
+}
diff --git a/gsl-1.9/specfunc/expint.c b/gsl-1.9/specfunc/expint.c
new file mode 100644
index 0000000..45957ea
--- /dev/null
+++ b/gsl-1.9/specfunc/expint.c
@@ -0,0 +1,518 @@
+/* specfunc/expint.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_expint.h>
+
+#include "error.h"
+
+#include "chebyshev.h"
+#include "cheb_eval.c"
+
+/*-*-*-*-*-*-*-*-*-*-*-* Private Section *-*-*-*-*-*-*-*-*-*-*-*/
+
+/*
+ Chebyshev expansions: based on SLATEC e1.f, W. Fullerton
+
+ Series for AE11 on the interval -1.00000D-01 to 0.
+ with weighted error 1.76E-17
+ log weighted error 16.75
+ significant figures required 15.70
+ decimal places required 17.55
+
+
+ Series for AE12 on the interval -2.50000D-01 to -1.00000D-01
+ with weighted error 5.83E-17
+ log weighted error 16.23
+ significant figures required 15.76
+ decimal places required 16.93
+
+
+ Series for E11 on the interval -4.00000D+00 to -1.00000D+00
+ with weighted error 1.08E-18
+ log weighted error 17.97
+ significant figures required 19.02
+ decimal places required 18.61
+
+
+ Series for E12 on the interval -1.00000D+00 to 1.00000D+00
+ with weighted error 3.15E-18
+ log weighted error 17.50
+ approx significant figures required 15.8
+ decimal places required 18.10
+
+
+ Series for AE13 on the interval 2.50000D-01 to 1.00000D+00
+ with weighted error 2.34E-17
+ log weighted error 16.63
+ significant figures required 16.14
+ decimal places required 17.33
+
+
+ Series for AE14 on the interval 0. to 2.50000D-01
+ with weighted error 5.41E-17
+ log weighted error 16.27
+ significant figures required 15.38
+ decimal places required 16.97
+*/
+
+static double AE11_data[39] = {
+ 0.121503239716065790,
+ -0.065088778513550150,
+ 0.004897651357459670,
+ -0.000649237843027216,
+ 0.000093840434587471,
+ 0.000000420236380882,
+ -0.000008113374735904,
+ 0.000002804247688663,
+ 0.000000056487164441,
+ -0.000000344809174450,
+ 0.000000058209273578,
+ 0.000000038711426349,
+ -0.000000012453235014,
+ -0.000000005118504888,
+ 0.000000002148771527,
+ 0.000000000868459898,
+ -0.000000000343650105,
+ -0.000000000179796603,
+ 0.000000000047442060,
+ 0.000000000040423282,
+ -0.000000000003543928,
+ -0.000000000008853444,
+ -0.000000000000960151,
+ 0.000000000001692921,
+ 0.000000000000607990,
+ -0.000000000000224338,
+ -0.000000000000200327,
+ -0.000000000000006246,
+ 0.000000000000045571,
+ 0.000000000000016383,
+ -0.000000000000005561,
+ -0.000000000000006074,
+ -0.000000000000000862,
+ 0.000000000000001223,
+ 0.000000000000000716,
+ -0.000000000000000024,
+ -0.000000000000000201,
+ -0.000000000000000082,
+ 0.000000000000000017
+};
+static cheb_series AE11_cs = {
+ AE11_data,
+ 38,
+ -1, 1,
+ 20
+};
+
+static double AE12_data[25] = {
+ 0.582417495134726740,
+ -0.158348850905782750,
+ -0.006764275590323141,
+ 0.005125843950185725,
+ 0.000435232492169391,
+ -0.000143613366305483,
+ -0.000041801320556301,
+ -0.000002713395758640,
+ 0.000001151381913647,
+ 0.000000420650022012,
+ 0.000000066581901391,
+ 0.000000000662143777,
+ -0.000000002844104870,
+ -0.000000000940724197,
+ -0.000000000177476602,
+ -0.000000000015830222,
+ 0.000000000002905732,
+ 0.000000000001769356,
+ 0.000000000000492735,
+ 0.000000000000093709,
+ 0.000000000000010707,
+ -0.000000000000000537,
+ -0.000000000000000716,
+ -0.000000000000000244,
+ -0.000000000000000058
+};
+static cheb_series AE12_cs = {
+ AE12_data,
+ 24,
+ -1, 1,
+ 15
+};
+
+static double E11_data[19] = {
+ -16.11346165557149402600,
+ 7.79407277874268027690,
+ -1.95540581886314195070,
+ 0.37337293866277945612,
+ -0.05692503191092901938,
+ 0.00721107776966009185,
+ -0.00078104901449841593,
+ 0.00007388093356262168,
+ -0.00000620286187580820,
+ 0.00000046816002303176,
+ -0.00000003209288853329,
+ 0.00000000201519974874,
+ -0.00000000011673686816,
+ 0.00000000000627627066,
+ -0.00000000000031481541,
+ 0.00000000000001479904,
+ -0.00000000000000065457,
+ 0.00000000000000002733,
+ -0.00000000000000000108
+};
+static cheb_series E11_cs = {
+ E11_data,
+ 18,
+ -1, 1,
+ 13
+};
+
+static double E12_data[16] = {
+ -0.03739021479220279500,
+ 0.04272398606220957700,
+ -0.13031820798497005440,
+ 0.01441912402469889073,
+ -0.00134617078051068022,
+ 0.00010731029253063780,
+ -0.00000742999951611943,
+ 0.00000045377325690753,
+ -0.00000002476417211390,
+ 0.00000000122076581374,
+ -0.00000000005485141480,
+ 0.00000000000226362142,
+ -0.00000000000008635897,
+ 0.00000000000000306291,
+ -0.00000000000000010148,
+ 0.00000000000000000315
+};
+static cheb_series E12_cs = {
+ E12_data,
+ 15,
+ -1, 1,
+ 10
+};
+
+static double AE13_data[25] = {
+ -0.605773246640603460,
+ -0.112535243483660900,
+ 0.013432266247902779,
+ -0.001926845187381145,
+ 0.000309118337720603,
+ -0.000053564132129618,
+ 0.000009827812880247,
+ -0.000001885368984916,
+ 0.000000374943193568,
+ -0.000000076823455870,
+ 0.000000016143270567,
+ -0.000000003466802211,
+ 0.000000000758754209,
+ -0.000000000168864333,
+ 0.000000000038145706,
+ -0.000000000008733026,
+ 0.000000000002023672,
+ -0.000000000000474132,
+ 0.000000000000112211,
+ -0.000000000000026804,
+ 0.000000000000006457,
+ -0.000000000000001568,
+ 0.000000000000000383,
+ -0.000000000000000094,
+ 0.000000000000000023
+};
+static cheb_series AE13_cs = {
+ AE13_data,
+ 24,
+ -1, 1,
+ 15
+};
+
+static double AE14_data[26] = {
+ -0.18929180007530170,
+ -0.08648117855259871,
+ 0.00722410154374659,
+ -0.00080975594575573,
+ 0.00010999134432661,
+ -0.00001717332998937,
+ 0.00000298562751447,
+ -0.00000056596491457,
+ 0.00000011526808397,
+ -0.00000002495030440,
+ 0.00000000569232420,
+ -0.00000000135995766,
+ 0.00000000033846628,
+ -0.00000000008737853,
+ 0.00000000002331588,
+ -0.00000000000641148,
+ 0.00000000000181224,
+ -0.00000000000052538,
+ 0.00000000000015592,
+ -0.00000000000004729,
+ 0.00000000000001463,
+ -0.00000000000000461,
+ 0.00000000000000148,
+ -0.00000000000000048,
+ 0.00000000000000016,
+ -0.00000000000000005
+};
+static cheb_series AE14_cs = {
+ AE14_data,
+ 25,
+ -1, 1,
+ 13
+};
+
+
+
+/* implementation for E1, allowing for scaling by exp(x) */
+static
+int expint_E1_impl(const double x, gsl_sf_result * result, const int scale)
+{
+ const double xmaxt = -GSL_LOG_DBL_MIN; /* XMAXT = -LOG (R1MACH(1)) */
+ const double xmax = xmaxt - log(xmaxt); /* XMAX = XMAXT - LOG(XMAXT) */
+
+ /* CHECK_POINTER(result) */
+
+ if(x < -xmax && !scale) {
+ OVERFLOW_ERROR(result);
+ }
+ else if(x <= -10.0) {
+ const double s = 1.0/x * ( scale ? 1.0 : exp(-x) );
+ gsl_sf_result result_c;
+ cheb_eval_e(&AE11_cs, 20.0/x+1.0, &result_c);
+ result->val = s * (1.0 + result_c.val);
+ result->err = s * result_c.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * (fabs(x) + 1.0) * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x <= -4.0) {
+ const double s = 1.0/x * ( scale ? 1.0 : exp(-x) );
+ gsl_sf_result result_c;
+ cheb_eval_e(&AE12_cs, (40.0/x+7.0)/3.0, &result_c);
+ result->val = s * (1.0 + result_c.val);
+ result->err = s * result_c.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x <= -1.0) {
+ const double ln_term = -log(fabs(x));
+ const double scale_factor = ( scale ? exp(x) : 1.0 );
+ gsl_sf_result result_c;
+ cheb_eval_e(&E11_cs, (2.0*x+5.0)/3.0, &result_c);
+ result->val = scale_factor * (ln_term + result_c.val);
+ result->err = scale_factor * (result_c.err + GSL_DBL_EPSILON * fabs(ln_term));
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x == 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x <= 1.0) {
+ const double ln_term = -log(fabs(x));
+ const double scale_factor = ( scale ? exp(x) : 1.0 );
+ gsl_sf_result result_c;
+ cheb_eval_e(&E12_cs, x, &result_c);
+ result->val = scale_factor * (ln_term - 0.6875 + x + result_c.val);
+ result->err = scale_factor * (result_c.err + GSL_DBL_EPSILON * fabs(ln_term));
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x <= 4.0) {
+ const double s = 1.0/x * ( scale ? 1.0 : exp(-x) );
+ gsl_sf_result result_c;
+ cheb_eval_e(&AE13_cs, (8.0/x-5.0)/3.0, &result_c);
+ result->val = s * (1.0 + result_c.val);
+ result->err = s * result_c.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x <= xmax || scale) {
+ const double s = 1.0/x * ( scale ? 1.0 : exp(-x) );
+ gsl_sf_result result_c;
+ cheb_eval_e(&AE14_cs, 8.0/x-1.0, &result_c);
+ result->val = s * (1.0 + result_c.val);
+ result->err = s * (GSL_DBL_EPSILON + result_c.err);
+ result->err += 2.0 * (x + 1.0) * GSL_DBL_EPSILON * fabs(result->val);
+ if(result->val == 0.0)
+ UNDERFLOW_ERROR(result);
+ else
+ return GSL_SUCCESS;
+ }
+ else {
+ UNDERFLOW_ERROR(result);
+ }
+}
+
+
+static
+int expint_E2_impl(const double x, gsl_sf_result * result, const int scale)
+{
+ const double xmaxt = -GSL_LOG_DBL_MIN;
+ const double xmax = xmaxt - log(xmaxt);
+
+ /* CHECK_POINTER(result) */
+
+ if(x < -xmax && !scale) {
+ OVERFLOW_ERROR(result);
+ }
+ else if (x == 0.0) {
+ result->val = (scale ? 1.0 : 1.0);
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ } else if(x < 100.0) {
+ const double ex = ( scale ? 1.0 : exp(-x) );
+ gsl_sf_result result_E1;
+ int stat_E1 = expint_E1_impl(x, &result_E1, scale);
+ result->val = ex - x*result_E1.val;
+ result->err = GSL_DBL_EPSILON*ex + fabs(x) * result_E1.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return stat_E1;
+ }
+ else if(x < xmax || scale) {
+ const double s = ( scale ? 1.0 : exp(-x) );
+ const double c1 = -2.0;
+ const double c2 = 6.0;
+ const double c3 = -24.0;
+ const double c4 = 120.0;
+ const double c5 = -720.0;
+ const double c6 = 5040.0;
+ const double c7 = -40320.0;
+ const double c8 = 362880.0;
+ const double c9 = -3628800.0;
+ const double c10 = 39916800.0;
+ const double c11 = -479001600.0;
+ const double c12 = 6227020800.0;
+ const double c13 = -87178291200.0;
+ const double y = 1.0/x;
+ const double sum6 = c6+y*(c7+y*(c8+y*(c9+y*(c10+y*(c11+y*(c12+y*c13))))));
+ const double sum = y*(c1+y*(c2+y*(c3+y*(c4+y*(c5+y*sum6)))));
+ result->val = s * (1.0 + sum)/x;
+ result->err = 2.0 * (x + 1.0) * GSL_DBL_EPSILON * result->val;
+ if(result->val == 0.0)
+ UNDERFLOW_ERROR(result);
+ else
+ return GSL_SUCCESS;
+ }
+ else {
+ UNDERFLOW_ERROR(result);
+ }
+}
+
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+
+int gsl_sf_expint_E1_e(const double x, gsl_sf_result * result)
+{
+ return expint_E1_impl(x, result, 0);
+}
+
+
+int gsl_sf_expint_E1_scaled_e(const double x, gsl_sf_result * result)
+{
+ return expint_E1_impl(x, result, 1);
+}
+
+
+int gsl_sf_expint_E2_e(const double x, gsl_sf_result * result)
+{
+ return expint_E2_impl(x, result, 0);
+}
+
+
+int gsl_sf_expint_E2_scaled_e(const double x, gsl_sf_result * result)
+{
+ return expint_E2_impl(x, result, 1);
+}
+
+
+int gsl_sf_expint_Ei_e(const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ {
+ int status = gsl_sf_expint_E1_e(-x, result);
+ result->val = -result->val;
+ return status;
+ }
+}
+
+
+int gsl_sf_expint_Ei_scaled_e(const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ {
+ int status = gsl_sf_expint_E1_scaled_e(-x, result);
+ result->val = -result->val;
+ return status;
+ }
+}
+
+
+#if 0
+static double recurse_En(int n, double x, double E1)
+{
+ int i;
+ double En = E1;
+ double ex = exp(-x);
+ for(i=2; i<=n; i++) {
+ En = 1./(i-1) * (ex - x * En);
+ }
+ return En;
+}
+#endif
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_expint_E1(const double x)
+{
+ EVAL_RESULT(gsl_sf_expint_E1_e(x, &result));
+}
+
+double gsl_sf_expint_E1_scaled(const double x)
+{
+ EVAL_RESULT(gsl_sf_expint_E1_scaled_e(x, &result));
+}
+
+double gsl_sf_expint_E2(const double x)
+{
+ EVAL_RESULT(gsl_sf_expint_E2_e(x, &result));
+}
+
+double gsl_sf_expint_E2_scaled(const double x)
+{
+ EVAL_RESULT(gsl_sf_expint_E2_scaled_e(x, &result));
+}
+
+double gsl_sf_expint_Ei(const double x)
+{
+ EVAL_RESULT(gsl_sf_expint_Ei_e(x, &result));
+}
+
+double gsl_sf_expint_Ei_scaled(const double x)
+{
+ EVAL_RESULT(gsl_sf_expint_Ei_scaled_e(x, &result));
+}
diff --git a/gsl-1.9/specfunc/expint3.c b/gsl-1.9/specfunc/expint3.c
new file mode 100644
index 0000000..4f17901
--- /dev/null
+++ b/gsl-1.9/specfunc/expint3.c
@@ -0,0 +1,146 @@
+/* specfunc/expint3.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_expint.h>
+
+#include "error.h"
+
+#include "chebyshev.h"
+#include "cheb_eval.c"
+
+static double expint3_data[24] = {
+ 1.269198414221126014,
+ -0.248846446384140982,
+ 0.80526220717231041e-01,
+ -0.25772733251968330e-01,
+ 0.7599878873073774e-02,
+ -0.2030695581940405e-02,
+ 0.490834586699330e-03,
+ -0.107682239142021e-03,
+ 0.21551726264290e-04,
+ -0.3956705137384e-05,
+ 0.6699240933896e-06,
+ -0.105132180807e-06,
+ 0.15362580199e-07,
+ -0.20990960364e-08,
+ 0.2692109538e-09,
+ -0.325195242e-10,
+ 0.37114816e-11,
+ -0.4013652e-12,
+ 0.412334e-13,
+ -0.40338e-14,
+ 0.3766e-15,
+ -0.336e-16,
+ 0.29e-17,
+ -0.2e-18
+};
+static cheb_series expint3_cs = {
+ expint3_data,
+ 23,
+ -1.0, 1.0,
+ 15
+};
+
+static double expint3a_data[23] = {
+ 1.9270464955068273729,
+ -0.349293565204813805e-01,
+ 0.14503383718983009e-02,
+ -0.8925336718327903e-04,
+ 0.70542392191184e-05,
+ -0.6671727454761e-06,
+ 0.724267589982e-07,
+ -0.87825825606e-08,
+ 0.11672234428e-08,
+ -0.1676631281e-09,
+ 0.257550158e-10,
+ -0.41957888e-11,
+ 0.7201041e-12,
+ -0.1294906e-12,
+ 0.24287e-13,
+ -0.47331e-14,
+ 0.95531e-15,
+ -0.1991e-15,
+ 0.428e-16,
+ -0.94e-17,
+ 0.21e-17,
+ -0.5e-18,
+ 0.1e-18
+};
+static cheb_series expint3a_cs = {
+ expint3a_data,
+ 22,
+ -1.0, 1.0,
+ 10
+};
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int gsl_sf_expint_3_e(const double x, gsl_sf_result * result)
+{
+ const double val_infinity = 0.892979511569249211;
+
+ /* CHECK_POINTER(result) */
+
+ if(x < 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x < 1.6*GSL_ROOT3_DBL_EPSILON) {
+ result->val = x;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(x <= 2.0) {
+ const double t = x*x*x/4.0 - 1.0;
+ gsl_sf_result result_c;
+ cheb_eval_e(&expint3_cs, t, &result_c);
+ result->val = x * result_c.val;
+ result->err = x * result_c.err;
+ return GSL_SUCCESS;
+ }
+ else if(x < pow(-GSL_LOG_DBL_EPSILON, 1.0/3.0)) {
+ const double t = 16.0/(x*x*x) - 1.0;
+ const double s = exp(-x*x*x)/(3.0*x*x);
+ gsl_sf_result result_c;
+ cheb_eval_e(&expint3a_cs, t, &result_c);
+ result->val = val_infinity - result_c.val * s;
+ result->err = val_infinity * GSL_DBL_EPSILON + s * result_c.err;
+ return GSL_SUCCESS;
+ }
+ else {
+ result->val = val_infinity;
+ result->err = val_infinity * GSL_DBL_EPSILON;
+ return GSL_SUCCESS;
+ }
+}
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_expint_3(double x)
+{
+ EVAL_RESULT(gsl_sf_expint_3_e(x, &result));
+}
diff --git a/gsl-1.9/specfunc/fermi_dirac.c b/gsl-1.9/specfunc/fermi_dirac.c
new file mode 100644
index 0000000..66808af
--- /dev/null
+++ b/gsl-1.9/specfunc/fermi_dirac.c
@@ -0,0 +1,1633 @@
+/* specfunc/fermi_dirac.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_exp.h>
+#include <gsl/gsl_sf_gamma.h>
+#include <gsl/gsl_sf_hyperg.h>
+#include <gsl/gsl_sf_pow_int.h>
+#include <gsl/gsl_sf_zeta.h>
+#include <gsl/gsl_sf_fermi_dirac.h>
+
+#include "error.h"
+
+#include "chebyshev.h"
+#include "cheb_eval.c"
+
+#define locEPS (1000.0*GSL_DBL_EPSILON)
+
+
+/* Chebyshev fit for F_{1}(t); -1 < t < 1, -1 < x < 1
+ */
+static double fd_1_a_data[22] = {
+ 1.8949340668482264365,
+ 0.7237719066890052793,
+ 0.1250000000000000000,
+ 0.0101065196435973942,
+ 0.0,
+ -0.0000600615242174119,
+ 0.0,
+ 6.816528764623e-7,
+ 0.0,
+ -9.5895779195e-9,
+ 0.0,
+ 1.515104135e-10,
+ 0.0,
+ -2.5785616e-12,
+ 0.0,
+ 4.62270e-14,
+ 0.0,
+ -8.612e-16,
+ 0.0,
+ 1.65e-17,
+ 0.0,
+ -3.e-19
+};
+static cheb_series fd_1_a_cs = {
+ fd_1_a_data,
+ 21,
+ -1, 1,
+ 12
+};
+
+
+/* Chebyshev fit for F_{1}(3/2(t+1) + 1); -1 < t < 1, 1 < x < 4
+ */
+static double fd_1_b_data[22] = {
+ 10.409136795234611872,
+ 3.899445098225161947,
+ 0.513510935510521222,
+ 0.010618736770218426,
+ -0.001584468020659694,
+ 0.000146139297161640,
+ -1.408095734499e-6,
+ -2.177993899484e-6,
+ 3.91423660640e-7,
+ -2.3860262660e-8,
+ -4.138309573e-9,
+ 1.283965236e-9,
+ -1.39695990e-10,
+ -4.907743e-12,
+ 4.399878e-12,
+ -7.17291e-13,
+ 2.4320e-14,
+ 1.4230e-14,
+ -3.446e-15,
+ 2.93e-16,
+ 3.7e-17,
+ -1.6e-17
+};
+static cheb_series fd_1_b_cs = {
+ fd_1_b_data,
+ 21,
+ -1, 1,
+ 11
+};
+
+
+/* Chebyshev fit for F_{1}(3(t+1) + 4); -1 < t < 1, 4 < x < 10
+ */
+static double fd_1_c_data[23] = {
+ 56.78099449124299762,
+ 21.00718468237668011,
+ 2.24592457063193457,
+ 0.00173793640425994,
+ -0.00058716468739423,
+ 0.00016306958492437,
+ -0.00003817425583020,
+ 7.64527252009e-6,
+ -1.31348500162e-6,
+ 1.9000646056e-7,
+ -2.141328223e-8,
+ 1.23906372e-9,
+ 2.1848049e-10,
+ -1.0134282e-10,
+ 2.484728e-11,
+ -4.73067e-12,
+ 7.3555e-13,
+ -8.740e-14,
+ 4.85e-15,
+ 1.23e-15,
+ -5.6e-16,
+ 1.4e-16,
+ -3.e-17
+};
+static cheb_series fd_1_c_cs = {
+ fd_1_c_data,
+ 22,
+ -1, 1,
+ 13
+};
+
+
+/* Chebyshev fit for F_{1}(x) / x^2
+ * 10 < x < 30
+ * -1 < t < 1
+ * t = 1/10 (x-10) - 1 = x/10 - 2
+ * x = 10(t+2)
+ */
+static double fd_1_d_data[30] = {
+ 1.0126626021151374442,
+ -0.0063312525536433793,
+ 0.0024837319237084326,
+ -0.0008764333697726109,
+ 0.0002913344438921266,
+ -0.0000931877907705692,
+ 0.0000290151342040275,
+ -8.8548707259955e-6,
+ 2.6603474114517e-6,
+ -7.891415690452e-7,
+ 2.315730237195e-7,
+ -6.73179452963e-8,
+ 1.94048035606e-8,
+ -5.5507129189e-9,
+ 1.5766090896e-9,
+ -4.449310875e-10,
+ 1.248292745e-10,
+ -3.48392894e-11,
+ 9.6791550e-12,
+ -2.6786240e-12,
+ 7.388852e-13,
+ -2.032828e-13,
+ 5.58115e-14,
+ -1.52987e-14,
+ 4.1886e-15,
+ -1.1458e-15,
+ 3.132e-16,
+ -8.56e-17,
+ 2.33e-17,
+ -5.9e-18
+};
+static cheb_series fd_1_d_cs = {
+ fd_1_d_data,
+ 29,
+ -1, 1,
+ 14
+};
+
+
+/* Chebyshev fit for F_{1}(x) / x^2
+ * 30 < x < Inf
+ * -1 < t < 1
+ * t = 60/x - 1
+ * x = 60/(t+1)
+ */
+static double fd_1_e_data[10] = {
+ 1.0013707783890401683,
+ 0.0009138522593601060,
+ 0.0002284630648400133,
+ -1.57e-17,
+ -1.27e-17,
+ -9.7e-18,
+ -6.9e-18,
+ -4.6e-18,
+ -2.9e-18,
+ -1.7e-18
+};
+static cheb_series fd_1_e_cs = {
+ fd_1_e_data,
+ 9,
+ -1, 1,
+ 4
+};
+
+
+/* Chebyshev fit for F_{2}(t); -1 < t < 1, -1 < x < 1
+ */
+static double fd_2_a_data[21] = {
+ 2.1573661917148458336,
+ 0.8849670334241132182,
+ 0.1784163467613519713,
+ 0.0208333333333333333,
+ 0.0012708226459768508,
+ 0.0,
+ -5.0619314244895e-6,
+ 0.0,
+ 4.32026533989e-8,
+ 0.0,
+ -4.870544166e-10,
+ 0.0,
+ 6.4203740e-12,
+ 0.0,
+ -9.37424e-14,
+ 0.0,
+ 1.4715e-15,
+ 0.0,
+ -2.44e-17,
+ 0.0,
+ 4.e-19
+};
+static cheb_series fd_2_a_cs = {
+ fd_2_a_data,
+ 20,
+ -1, 1,
+ 12
+};
+
+
+/* Chebyshev fit for F_{2}(3/2(t+1) + 1); -1 < t < 1, 1 < x < 4
+ */
+static double fd_2_b_data[22] = {
+ 16.508258811798623599,
+ 7.421719394793067988,
+ 1.458309885545603821,
+ 0.128773850882795229,
+ 0.001963612026198147,
+ -0.000237458988738779,
+ 0.000018539661382641,
+ -1.92805649479e-7,
+ -2.01950028452e-7,
+ 3.2963497518e-8,
+ -1.885817092e-9,
+ -2.72632744e-10,
+ 8.0554561e-11,
+ -8.313223e-12,
+ -2.24489e-13,
+ 2.18778e-13,
+ -3.4290e-14,
+ 1.225e-15,
+ 5.81e-16,
+ -1.37e-16,
+ 1.2e-17,
+ 1.e-18
+};
+static cheb_series fd_2_b_cs = {
+ fd_2_b_data,
+ 21,
+ -1, 1,
+ 12
+};
+
+
+/* Chebyshev fit for F_{1}(3(t+1) + 4); -1 < t < 1, 4 < x < 10
+ */
+static double fd_2_c_data[20] = {
+ 168.87129776686440711,
+ 81.80260488091659458,
+ 15.75408505947931513,
+ 1.12325586765966440,
+ 0.00059057505725084,
+ -0.00016469712946921,
+ 0.00003885607810107,
+ -7.89873660613e-6,
+ 1.39786238616e-6,
+ -2.1534528656e-7,
+ 2.831510953e-8,
+ -2.94978583e-9,
+ 1.6755082e-10,
+ 2.234229e-11,
+ -1.035130e-11,
+ 2.41117e-12,
+ -4.3531e-13,
+ 6.447e-14,
+ -7.39e-15,
+ 4.3e-16
+};
+static cheb_series fd_2_c_cs = {
+ fd_2_c_data,
+ 19,
+ -1, 1,
+ 12
+};
+
+
+/* Chebyshev fit for F_{1}(x) / x^3
+ * 10 < x < 30
+ * -1 < t < 1
+ * t = 1/10 (x-10) - 1 = x/10 - 2
+ * x = 10(t+2)
+ */
+static double fd_2_d_data[30] = {
+ 0.3459960518965277589,
+ -0.00633136397691958024,
+ 0.00248382959047594408,
+ -0.00087651191884005114,
+ 0.00029139255351719932,
+ -0.00009322746111846199,
+ 0.00002904021914564786,
+ -8.86962264810663e-6,
+ 2.66844972574613e-6,
+ -7.9331564996004e-7,
+ 2.3359868615516e-7,
+ -6.824790880436e-8,
+ 1.981036528154e-8,
+ -5.71940426300e-9,
+ 1.64379426579e-9,
+ -4.7064937566e-10,
+ 1.3432614122e-10,
+ -3.823400534e-11,
+ 1.085771994e-11,
+ -3.07727465e-12,
+ 8.7064848e-13,
+ -2.4595431e-13,
+ 6.938531e-14,
+ -1.954939e-14,
+ 5.50162e-15,
+ -1.54657e-15,
+ 4.3429e-16,
+ -1.2178e-16,
+ 3.394e-17,
+ -8.81e-18
+};
+static cheb_series fd_2_d_cs = {
+ fd_2_d_data,
+ 29,
+ -1, 1,
+ 14
+};
+
+
+/* Chebyshev fit for F_{2}(x) / x^3
+ * 30 < x < Inf
+ * -1 < t < 1
+ * t = 60/x - 1
+ * x = 60/(t+1)
+ */
+static double fd_2_e_data[4] = {
+ 0.3347041117223735227,
+ 0.00091385225936012645,
+ 0.00022846306484003205,
+ 5.2e-19
+};
+static cheb_series fd_2_e_cs = {
+ fd_2_e_data,
+ 3,
+ -1, 1,
+ 3
+};
+
+
+/* Chebyshev fit for F_{-1/2}(t); -1 < t < 1, -1 < x < 1
+ */
+static double fd_mhalf_a_data[20] = {
+ 1.2663290042859741974,
+ 0.3697876251911153071,
+ 0.0278131011214405055,
+ -0.0033332848565672007,
+ -0.0004438108265412038,
+ 0.0000616495177243839,
+ 8.7589611449897e-6,
+ -1.2622936986172e-6,
+ -1.837464037221e-7,
+ 2.69495091400e-8,
+ 3.9760866257e-9,
+ -5.894468795e-10,
+ -8.77321638e-11,
+ 1.31016571e-11,
+ 1.9621619e-12,
+ -2.945887e-13,
+ -4.43234e-14,
+ 6.6816e-15,
+ 1.0084e-15,
+ -1.561e-16
+};
+static cheb_series fd_mhalf_a_cs = {
+ fd_mhalf_a_data,
+ 19,
+ -1, 1,
+ 12
+};
+
+
+/* Chebyshev fit for F_{-1/2}(3/2(t+1) + 1); -1 < t < 1, 1 < x < 4
+ */
+static double fd_mhalf_b_data[20] = {
+ 3.270796131942071484,
+ 0.5809004935853417887,
+ -0.0299313438794694987,
+ -0.0013287935412612198,
+ 0.0009910221228704198,
+ -0.0001690954939688554,
+ 6.5955849946915e-6,
+ 3.5953966033618e-6,
+ -9.430672023181e-7,
+ 8.75773958291e-8,
+ 1.06247652607e-8,
+ -4.9587006215e-9,
+ 7.160432795e-10,
+ 4.5072219e-12,
+ -2.3695425e-11,
+ 4.9122208e-12,
+ -2.905277e-13,
+ -9.59291e-14,
+ 3.00028e-14,
+ -3.4970e-15
+};
+static cheb_series fd_mhalf_b_cs = {
+ fd_mhalf_b_data,
+ 19,
+ -1, 1,
+ 12
+};
+
+
+/* Chebyshev fit for F_{-1/2}(3(t+1) + 4); -1 < t < 1, 4 < x < 10
+ */
+static double fd_mhalf_c_data[25] = {
+ 5.828283273430595507,
+ 0.677521118293264655,
+ -0.043946248736481554,
+ 0.005825595781828244,
+ -0.000864858907380668,
+ 0.000110017890076539,
+ -6.973305225404e-6,
+ -1.716267414672e-6,
+ 8.59811582041e-7,
+ -2.33066786976e-7,
+ 4.8503191159e-8,
+ -8.130620247e-9,
+ 1.021068250e-9,
+ -5.3188423e-11,
+ -1.9430559e-11,
+ 8.750506e-12,
+ -2.324897e-12,
+ 4.83102e-13,
+ -8.1207e-14,
+ 1.0132e-14,
+ -4.64e-16,
+ -2.24e-16,
+ 9.7e-17,
+ -2.6e-17,
+ 5.e-18
+};
+static cheb_series fd_mhalf_c_cs = {
+ fd_mhalf_c_data,
+ 24,
+ -1, 1,
+ 13
+};
+
+
+/* Chebyshev fit for F_{-1/2}(x) / x^(1/2)
+ * 10 < x < 30
+ * -1 < t < 1
+ * t = 1/10 (x-10) - 1 = x/10 - 2
+ */
+static double fd_mhalf_d_data[30] = {
+ 2.2530744202862438709,
+ 0.0018745152720114692,
+ -0.0007550198497498903,
+ 0.0002759818676644382,
+ -0.0000959406283465913,
+ 0.0000324056855537065,
+ -0.0000107462396145761,
+ 3.5126865219224e-6,
+ -1.1313072730092e-6,
+ 3.577454162766e-7,
+ -1.104926666238e-7,
+ 3.31304165692e-8,
+ -9.5837381008e-9,
+ 2.6575790141e-9,
+ -7.015201447e-10,
+ 1.747111336e-10,
+ -4.04909605e-11,
+ 8.5104999e-12,
+ -1.5261885e-12,
+ 1.876851e-13,
+ 1.00574e-14,
+ -1.82002e-14,
+ 8.6634e-15,
+ -3.2058e-15,
+ 1.0572e-15,
+ -3.259e-16,
+ 9.60e-17,
+ -2.74e-17,
+ 7.6e-18,
+ -1.9e-18
+};
+static cheb_series fd_mhalf_d_cs = {
+ fd_mhalf_d_data,
+ 29,
+ -1, 1,
+ 15
+};
+
+
+/* Chebyshev fit for F_{1/2}(t); -1 < t < 1, -1 < x < 1
+ */
+static double fd_half_a_data[23] = {
+ 1.7177138871306189157,
+ 0.6192579515822668460,
+ 0.0932802275119206269,
+ 0.0047094853246636182,
+ -0.0004243667967864481,
+ -0.0000452569787686193,
+ 5.2426509519168e-6,
+ 6.387648249080e-7,
+ -8.05777004848e-8,
+ -1.04290272415e-8,
+ 1.3769478010e-9,
+ 1.847190359e-10,
+ -2.51061890e-11,
+ -3.4497818e-12,
+ 4.784373e-13,
+ 6.68828e-14,
+ -9.4147e-15,
+ -1.3333e-15,
+ 1.898e-16,
+ 2.72e-17,
+ -3.9e-18,
+ -6.e-19,
+ 1.e-19
+};
+static cheb_series fd_half_a_cs = {
+ fd_half_a_data,
+ 22,
+ -1, 1,
+ 11
+};
+
+
+/* Chebyshev fit for F_{1/2}(3/2(t+1) + 1); -1 < t < 1, 1 < x < 4
+ */
+static double fd_half_b_data[20] = {
+ 7.651013792074984027,
+ 2.475545606866155737,
+ 0.218335982672476128,
+ -0.007730591500584980,
+ -0.000217443383867318,
+ 0.000147663980681359,
+ -0.000021586361321527,
+ 8.07712735394e-7,
+ 3.28858050706e-7,
+ -7.9474330632e-8,
+ 6.940207234e-9,
+ 6.75594681e-10,
+ -3.10200490e-10,
+ 4.2677233e-11,
+ -2.1696e-14,
+ -1.170245e-12,
+ 2.34757e-13,
+ -1.4139e-14,
+ -3.864e-15,
+ 1.202e-15
+};
+static cheb_series fd_half_b_cs = {
+ fd_half_b_data,
+ 19,
+ -1, 1,
+ 12
+};
+
+
+/* Chebyshev fit for F_{1/2}(3(t+1) + 4); -1 < t < 1, 4 < x < 10
+ */
+static double fd_half_c_data[23] = {
+ 29.584339348839816528,
+ 8.808344283250615592,
+ 0.503771641883577308,
+ -0.021540694914550443,
+ 0.002143341709406890,
+ -0.000257365680646579,
+ 0.000027933539372803,
+ -1.678525030167e-6,
+ -2.78100117693e-7,
+ 1.35218065147e-7,
+ -3.3740425009e-8,
+ 6.474834942e-9,
+ -1.009678978e-9,
+ 1.20057555e-10,
+ -6.636314e-12,
+ -1.710566e-12,
+ 7.75069e-13,
+ -1.97973e-13,
+ 3.9414e-14,
+ -6.374e-15,
+ 7.77e-16,
+ -4.0e-17,
+ -1.4e-17
+};
+static cheb_series fd_half_c_cs = {
+ fd_half_c_data,
+ 22,
+ -1, 1,
+ 13
+};
+
+
+/* Chebyshev fit for F_{1/2}(x) / x^(3/2)
+ * 10 < x < 30
+ * -1 < t < 1
+ * t = 1/10 (x-10) - 1 = x/10 - 2
+ */
+static double fd_half_d_data[30] = {
+ 1.5116909434145508537,
+ -0.0036043405371630468,
+ 0.0014207743256393359,
+ -0.0005045399052400260,
+ 0.0001690758006957347,
+ -0.0000546305872688307,
+ 0.0000172223228484571,
+ -5.3352603788706e-6,
+ 1.6315287543662e-6,
+ -4.939021084898e-7,
+ 1.482515450316e-7,
+ -4.41552276226e-8,
+ 1.30503160961e-8,
+ -3.8262599802e-9,
+ 1.1123226976e-9,
+ -3.204765534e-10,
+ 9.14870489e-11,
+ -2.58778946e-11,
+ 7.2550731e-12,
+ -2.0172226e-12,
+ 5.566891e-13,
+ -1.526247e-13,
+ 4.16121e-14,
+ -1.12933e-14,
+ 3.0537e-15,
+ -8.234e-16,
+ 2.215e-16,
+ -5.95e-17,
+ 1.59e-17,
+ -4.0e-18
+};
+static cheb_series fd_half_d_cs = {
+ fd_half_d_data,
+ 29,
+ -1, 1,
+ 15
+};
+
+
+
+/* Chebyshev fit for F_{3/2}(t); -1 < t < 1, -1 < x < 1
+ */
+static double fd_3half_a_data[20] = {
+ 2.0404775940601704976,
+ 0.8122168298093491444,
+ 0.1536371165644008069,
+ 0.0156174323847845125,
+ 0.0005943427879290297,
+ -0.0000429609447738365,
+ -3.8246452994606e-6,
+ 3.802306180287e-7,
+ 4.05746157593e-8,
+ -4.5530360159e-9,
+ -5.306873139e-10,
+ 6.37297268e-11,
+ 7.8403674e-12,
+ -9.840241e-13,
+ -1.255952e-13,
+ 1.62617e-14,
+ 2.1318e-15,
+ -2.825e-16,
+ -3.78e-17,
+ 5.1e-18
+};
+static cheb_series fd_3half_a_cs = {
+ fd_3half_a_data,
+ 19,
+ -1, 1,
+ 11
+};
+
+
+/* Chebyshev fit for F_{3/2}(3/2(t+1) + 1); -1 < t < 1, 1 < x < 4
+ */
+static double fd_3half_b_data[22] = {
+ 13.403206654624176674,
+ 5.574508357051880924,
+ 0.931228574387527769,
+ 0.054638356514085862,
+ -0.001477172902737439,
+ -0.000029378553381869,
+ 0.000018357033493246,
+ -2.348059218454e-6,
+ 8.3173787440e-8,
+ 2.6826486956e-8,
+ -6.011244398e-9,
+ 4.94345981e-10,
+ 3.9557340e-11,
+ -1.7894930e-11,
+ 2.348972e-12,
+ -1.2823e-14,
+ -5.4192e-14,
+ 1.0527e-14,
+ -6.39e-16,
+ -1.47e-16,
+ 4.5e-17,
+ -5.e-18
+};
+static cheb_series fd_3half_b_cs = {
+ fd_3half_b_data,
+ 21,
+ -1, 1,
+ 12
+};
+
+
+/* Chebyshev fit for F_{3/2}(3(t+1) + 4); -1 < t < 1, 4 < x < 10
+ */
+static double fd_3half_c_data[21] = {
+ 101.03685253378877642,
+ 43.62085156043435883,
+ 6.62241373362387453,
+ 0.25081415008708521,
+ -0.00798124846271395,
+ 0.00063462245101023,
+ -0.00006392178890410,
+ 6.04535131939e-6,
+ -3.4007683037e-7,
+ -4.072661545e-8,
+ 1.931148453e-8,
+ -4.46328355e-9,
+ 7.9434717e-10,
+ -1.1573569e-10,
+ 1.304658e-11,
+ -7.4114e-13,
+ -1.4181e-13,
+ 6.491e-14,
+ -1.597e-14,
+ 3.05e-15,
+ -4.8e-16
+};
+static cheb_series fd_3half_c_cs = {
+ fd_3half_c_data,
+ 20,
+ -1, 1,
+ 12
+};
+
+
+/* Chebyshev fit for F_{3/2}(x) / x^(5/2)
+ * 10 < x < 30
+ * -1 < t < 1
+ * t = 1/10 (x-10) - 1 = x/10 - 2
+ */
+static double fd_3half_d_data[25] = {
+ 0.6160645215171852381,
+ -0.0071239478492671463,
+ 0.0027906866139659846,
+ -0.0009829521424317718,
+ 0.0003260229808519545,
+ -0.0001040160912910890,
+ 0.0000322931223232439,
+ -9.8243506588102e-6,
+ 2.9420132351277e-6,
+ -8.699154670418e-7,
+ 2.545460071999e-7,
+ -7.38305056331e-8,
+ 2.12545670310e-8,
+ -6.0796532462e-9,
+ 1.7294556741e-9,
+ -4.896540687e-10,
+ 1.380786037e-10,
+ -3.88057305e-11,
+ 1.08753212e-11,
+ -3.0407308e-12,
+ 8.485626e-13,
+ -2.364275e-13,
+ 6.57636e-14,
+ -1.81807e-14,
+ 4.6884e-15
+};
+static cheb_series fd_3half_d_cs = {
+ fd_3half_d_data,
+ 24,
+ -1, 1,
+ 16
+};
+
+
+/* Goano's modification of the Levin-u implementation.
+ * This is a simplification of the original WHIZ algorithm.
+ * See [Fessler et al., ACM Toms 9, 346 (1983)].
+ */
+static
+int
+fd_whiz(const double term, const int iterm,
+ double * qnum, double * qden,
+ double * result, double * s)
+{
+ if(iterm == 0) *s = 0.0;
+
+ *s += term;
+
+ qden[iterm] = 1.0/(term*(iterm+1.0)*(iterm+1.0));
+ qnum[iterm] = *s * qden[iterm];
+
+ if(iterm > 0) {
+ double factor = 1.0;
+ double ratio = iterm/(iterm+1.0);
+ int j;
+ for(j=iterm-1; j>=0; j--) {
+ double c = factor * (j+1.0) / (iterm+1.0);
+ factor *= ratio;
+ qden[j] = qden[j+1] - c * qden[j];
+ qnum[j] = qnum[j+1] - c * qnum[j];
+ }
+ }
+
+ *result = qnum[0] / qden[0];
+ return GSL_SUCCESS;
+}
+
+
+/* Handle case of integer j <= -2.
+ */
+static
+int
+fd_nint(const int j, const double x, gsl_sf_result * result)
+{
+/* const int nsize = 100 + 1; */
+ enum {
+ nsize = 100+1
+ };
+ double qcoeff[nsize];
+
+ if(j >= -1) {
+ result->val = 0.0;
+ result->err = 0.0;
+ GSL_ERROR ("error", GSL_ESANITY);
+ }
+ else if(j < -(nsize)) {
+ result->val = 0.0;
+ result->err = 0.0;
+ GSL_ERROR ("error", GSL_EUNIMPL);
+ }
+ else {
+ double a, p, f;
+ int i, k;
+ int n = -(j+1);
+
+ qcoeff[1] = 1.0;
+
+ for(k=2; k<=n; k++) {
+ qcoeff[k] = -qcoeff[k-1];
+ for(i=k-1; i>=2; i--) {
+ qcoeff[i] = i*qcoeff[i] - (k-(i-1))*qcoeff[i-1];
+ }
+ }
+
+ if(x >= 0.0) {
+ a = exp(-x);
+ f = qcoeff[1];
+ for(i=2; i<=n; i++) {
+ f = f*a + qcoeff[i];
+ }
+ }
+ else {
+ a = exp(x);
+ f = qcoeff[n];
+ for(i=n-1; i>=1; i--) {
+ f = f*a + qcoeff[i];
+ }
+ }
+
+ p = gsl_sf_pow_int(1.0+a, j);
+ result->val = f*a*p;
+ result->err = 3.0 * GSL_DBL_EPSILON * fabs(f*a*p);
+ return GSL_SUCCESS;
+ }
+}
+
+
+/* x < 0
+ */
+static
+int
+fd_neg(const double j, const double x, gsl_sf_result * result)
+{
+ enum {
+ itmax = 100,
+ qsize = 100+1
+ };
+/* const int itmax = 100; */
+/* const int qsize = 100 + 1; */
+ double qnum[qsize], qden[qsize];
+
+ if(x < GSL_LOG_DBL_MIN) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(x < -1.0 && x < -fabs(j+1.0)) {
+ /* Simple series implementation. Avoid the
+ * complexity and extra work of the series
+ * acceleration method below.
+ */
+ double ex = exp(x);
+ double term = ex;
+ double sum = term;
+ int n;
+ for(n=2; n<100; n++) {
+ double rat = (n-1.0)/n;
+ double p = pow(rat, j+1.0);
+ term *= -ex * p;
+ sum += term;
+ if(fabs(term/sum) < GSL_DBL_EPSILON) break;
+ }
+ result->val = sum;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(sum);
+ return GSL_SUCCESS;
+ }
+ else {
+ double s = 0.0;
+ double xn = x;
+ double ex = -exp(x);
+ double enx = -ex;
+ double f = 0.0;
+ double f_previous;
+ int jterm;
+ for(jterm=0; jterm<=itmax; jterm++) {
+ double p = pow(jterm+1.0, j+1.0);
+ double term = enx/p;
+ f_previous = f;
+ fd_whiz(term, jterm, qnum, qden, &f, &s);
+ xn += x;
+ if(fabs(f-f_previous) < fabs(f)*2.0*GSL_DBL_EPSILON || xn < GSL_LOG_DBL_MIN) break;
+ enx *= ex;
+ }
+
+ result->val = f;
+ result->err = fabs(f-f_previous);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(f);
+
+ if(jterm == itmax)
+ GSL_ERROR ("error", GSL_EMAXITER);
+ else
+ return GSL_SUCCESS;
+ }
+}
+
+
+/* asymptotic expansion
+ * j + 2.0 > 0.0
+ */
+static
+int
+fd_asymp(const double j, const double x, gsl_sf_result * result)
+{
+ const int j_integer = ( fabs(j - floor(j+0.5)) < 100.0*GSL_DBL_EPSILON );
+ const int itmax = 200;
+ gsl_sf_result lg;
+ int stat_lg = gsl_sf_lngamma_e(j + 2.0, &lg);
+ double seqn_val = 0.5;
+ double seqn_err = 0.0;
+ double xm2 = (1.0/x)/x;
+ double xgam = 1.0;
+ double add = GSL_DBL_MAX;
+ double cos_term;
+ double ln_x;
+ double ex_term_1;
+ double ex_term_2;
+ gsl_sf_result fneg;
+ gsl_sf_result ex_arg;
+ gsl_sf_result ex;
+ int stat_fneg;
+ int stat_e;
+ int n;
+ for(n=1; n<=itmax; n++) {
+ double add_previous = add;
+ gsl_sf_result eta;
+ gsl_sf_eta_int_e(2*n, &eta);
+ xgam = xgam * xm2 * (j + 1.0 - (2*n-2)) * (j + 1.0 - (2*n-1));
+ add = eta.val * xgam;
+ if(!j_integer && fabs(add) > fabs(add_previous)) break;
+ if(fabs(add/seqn_val) < GSL_DBL_EPSILON) break;
+ seqn_val += add;
+ seqn_err += 2.0 * GSL_DBL_EPSILON * fabs(add);
+ }
+ seqn_err += fabs(add);
+
+ stat_fneg = fd_neg(j, -x, &fneg);
+ ln_x = log(x);
+ ex_term_1 = (j+1.0)*ln_x;
+ ex_term_2 = lg.val;
+ ex_arg.val = ex_term_1 - ex_term_2; /*(j+1.0)*ln_x - lg.val; */
+ ex_arg.err = GSL_DBL_EPSILON*(fabs(ex_term_1) + fabs(ex_term_2)) + lg.err;
+ stat_e = gsl_sf_exp_err_e(ex_arg.val, ex_arg.err, &ex);
+ cos_term = cos(j*M_PI);
+ result->val = cos_term * fneg.val + 2.0 * seqn_val * ex.val;
+ result->err = fabs(2.0 * ex.err * seqn_val);
+ result->err += fabs(2.0 * ex.val * seqn_err);
+ result->err += fabs(cos_term) * fneg.err;
+ result->err += 4.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_ERROR_SELECT_3(stat_e, stat_fneg, stat_lg);
+}
+
+
+/* Series evaluation for small x, generic j.
+ * [Goano (8)]
+ */
+#if 0
+static
+int
+fd_series(const double j, const double x, double * result)
+{
+ const int nmax = 1000;
+ int n;
+ double sum = 0.0;
+ double prev;
+ double pow_factor = 1.0;
+ double eta_factor;
+ gsl_sf_eta_e(j + 1.0, &eta_factor);
+ prev = pow_factor * eta_factor;
+ sum += prev;
+ for(n=1; n<nmax; n++) {
+ double term;
+ gsl_sf_eta_e(j+1.0-n, &eta_factor);
+ pow_factor *= x/n;
+ term = pow_factor * eta_factor;
+ sum += term;
+ if(fabs(term/sum) < GSL_DBL_EPSILON && fabs(prev/sum) < GSL_DBL_EPSILON) break;
+ prev = term;
+ }
+
+ *result = sum;
+ return GSL_SUCCESS;
+}
+#endif /* 0 */
+
+
+/* Series evaluation for small x > 0, integer j > 0; x < Pi.
+ * [Goano (8)]
+ */
+static
+int
+fd_series_int(const int j, const double x, gsl_sf_result * result)
+{
+ int n;
+ double sum = 0.0;
+ double del;
+ double pow_factor = 1.0;
+ gsl_sf_result eta_factor;
+ gsl_sf_eta_int_e(j + 1, &eta_factor);
+ del = pow_factor * eta_factor.val;
+ sum += del;
+
+ /* Sum terms where the argument
+ * of eta() is positive.
+ */
+ for(n=1; n<=j+2; n++) {
+ gsl_sf_eta_int_e(j+1-n, &eta_factor);
+ pow_factor *= x/n;
+ del = pow_factor * eta_factor.val;
+ sum += del;
+ if(fabs(del/sum) < GSL_DBL_EPSILON) break;
+ }
+
+ /* Now sum the terms where eta() is negative.
+ * The argument of eta() must be odd as well,
+ * so it is convenient to transform the series
+ * as follows:
+ *
+ * Sum[ eta(j+1-n) x^n / n!, {n,j+4,Infinity}]
+ * = x^j / j! Sum[ eta(1-2m) x^(2m) j! / (2m+j)! , {m,2,Infinity}]
+ *
+ * We do not need to do this sum if j is large enough.
+ */
+ if(j < 32) {
+ int m;
+ gsl_sf_result jfact;
+ double sum2;
+ double pre2;
+
+ gsl_sf_fact_e((unsigned int)j, &jfact);
+ pre2 = gsl_sf_pow_int(x, j) / jfact.val;
+
+ gsl_sf_eta_int_e(-3, &eta_factor);
+ pow_factor = x*x*x*x / ((j+4)*(j+3)*(j+2)*(j+1));
+ sum2 = eta_factor.val * pow_factor;
+
+ for(m=3; m<24; m++) {
+ gsl_sf_eta_int_e(1-2*m, &eta_factor);
+ pow_factor *= x*x / ((j+2*m)*(j+2*m-1));
+ sum2 += eta_factor.val * pow_factor;
+ }
+
+ sum += pre2 * sum2;
+ }
+
+ result->val = sum;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(sum);
+
+ return GSL_SUCCESS;
+}
+
+
+/* series of hypergeometric functions for integer j > 0, x > 0
+ * [Goano (7)]
+ */
+static
+int
+fd_UMseries_int(const int j, const double x, gsl_sf_result * result)
+{
+ const int nmax = 2000;
+ double pre;
+ double lnpre_val;
+ double lnpre_err;
+ double sum_even_val = 1.0;
+ double sum_even_err = 0.0;
+ double sum_odd_val = 0.0;
+ double sum_odd_err = 0.0;
+ int stat_sum;
+ int stat_e;
+ int stat_h = GSL_SUCCESS;
+ int n;
+
+ if(x < 500.0 && j < 80) {
+ double p = gsl_sf_pow_int(x, j+1);
+ gsl_sf_result g;
+ gsl_sf_fact_e(j+1, &g); /* Gamma(j+2) */
+ lnpre_val = 0.0;
+ lnpre_err = 0.0;
+ pre = p/g.val;
+ }
+ else {
+ double lnx = log(x);
+ gsl_sf_result lg;
+ gsl_sf_lngamma_e(j + 2.0, &lg);
+ lnpre_val = (j+1.0)*lnx - lg.val;
+ lnpre_err = 2.0 * GSL_DBL_EPSILON * fabs((j+1.0)*lnx) + lg.err;
+ pre = 1.0;
+ }
+
+ /* Add up the odd terms of the sum.
+ */
+ for(n=1; n<nmax; n+=2) {
+ double del_val;
+ double del_err;
+ gsl_sf_result U;
+ gsl_sf_result M;
+ int stat_h_U = gsl_sf_hyperg_U_int_e(1, j+2, n*x, &U);
+ int stat_h_F = gsl_sf_hyperg_1F1_int_e(1, j+2, -n*x, &M);
+ stat_h = GSL_ERROR_SELECT_3(stat_h, stat_h_U, stat_h_F);
+ del_val = ((j+1.0)*U.val - M.val);
+ del_err = (fabs(j+1.0)*U.err + M.err);
+ sum_odd_val += del_val;
+ sum_odd_err += del_err;
+ if(fabs(del_val/sum_odd_val) < GSL_DBL_EPSILON) break;
+ }
+
+ /* Add up the even terms of the sum.
+ */
+ for(n=2; n<nmax; n+=2) {
+ double del_val;
+ double del_err;
+ gsl_sf_result U;
+ gsl_sf_result M;
+ int stat_h_U = gsl_sf_hyperg_U_int_e(1, j+2, n*x, &U);
+ int stat_h_F = gsl_sf_hyperg_1F1_int_e(1, j+2, -n*x, &M);
+ stat_h = GSL_ERROR_SELECT_3(stat_h, stat_h_U, stat_h_F);
+ del_val = ((j+1.0)*U.val - M.val);
+ del_err = (fabs(j+1.0)*U.err + M.err);
+ sum_even_val -= del_val;
+ sum_even_err += del_err;
+ if(fabs(del_val/sum_even_val) < GSL_DBL_EPSILON) break;
+ }
+
+ stat_sum = ( n >= nmax ? GSL_EMAXITER : GSL_SUCCESS );
+ stat_e = gsl_sf_exp_mult_err_e(lnpre_val, lnpre_err,
+ pre*(sum_even_val + sum_odd_val),
+ pre*(sum_even_err + sum_odd_err),
+ result);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+
+ return GSL_ERROR_SELECT_3(stat_e, stat_h, stat_sum);
+}
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+/* [Goano (4)] */
+int gsl_sf_fermi_dirac_m1_e(const double x, gsl_sf_result * result)
+{
+ if(x < GSL_LOG_DBL_MIN) {
+ UNDERFLOW_ERROR(result);
+ }
+ else if(x < 0.0) {
+ const double ex = exp(x);
+ result->val = ex/(1.0+ex);
+ result->err = 2.0 * (fabs(x) + 1.0) * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ double ex = exp(-x);
+ result->val = 1.0/(1.0 + ex);
+ result->err = 2.0 * GSL_DBL_EPSILON * (x + 1.0) * ex;
+ return GSL_SUCCESS;
+ }
+}
+
+
+/* [Goano (3)] */
+int gsl_sf_fermi_dirac_0_e(const double x, gsl_sf_result * result)
+{
+ if(x < GSL_LOG_DBL_MIN) {
+ UNDERFLOW_ERROR(result);
+ }
+ else if(x < -5.0) {
+ double ex = exp(x);
+ double ser = 1.0 - ex*(0.5 - ex*(1.0/3.0 - ex*(1.0/4.0 - ex*(1.0/5.0 - ex/6.0))));
+ result->val = ex * ser;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x < 10.0) {
+ result->val = log(1.0 + exp(x));
+ result->err = fabs(x * GSL_DBL_EPSILON);
+ return GSL_SUCCESS;
+ }
+ else {
+ double ex = exp(-x);
+ result->val = x + ex * (1.0 - 0.5*ex + ex*ex/3.0 - ex*ex*ex/4.0);
+ result->err = (x + ex) * GSL_DBL_EPSILON;
+ return GSL_SUCCESS;
+ }
+}
+
+
+int gsl_sf_fermi_dirac_1_e(const double x, gsl_sf_result * result)
+{
+ if(x < GSL_LOG_DBL_MIN) {
+ UNDERFLOW_ERROR(result);
+ }
+ else if(x < -1.0) {
+ /* series [Goano (6)]
+ */
+ double ex = exp(x);
+ double term = ex;
+ double sum = term;
+ int n;
+ for(n=2; n<100 ; n++) {
+ double rat = (n-1.0)/n;
+ term *= -ex * rat * rat;
+ sum += term;
+ if(fabs(term/sum) < GSL_DBL_EPSILON) break;
+ }
+ result->val = sum;
+ result->err = 2.0 * fabs(sum) * GSL_DBL_EPSILON;
+ return GSL_SUCCESS;
+ }
+ else if(x < 1.0) {
+ return cheb_eval_e(&fd_1_a_cs, x, result);
+ }
+ else if(x < 4.0) {
+ double t = 2.0/3.0*(x-1.0) - 1.0;
+ return cheb_eval_e(&fd_1_b_cs, t, result);
+ }
+ else if(x < 10.0) {
+ double t = 1.0/3.0*(x-4.0) - 1.0;
+ return cheb_eval_e(&fd_1_c_cs, t, result);
+ }
+ else if(x < 30.0) {
+ double t = 0.1*x - 2.0;
+ gsl_sf_result c;
+ cheb_eval_e(&fd_1_d_cs, t, &c);
+ result->val = c.val * x*x;
+ result->err = c.err * x*x + GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x < 1.0/GSL_SQRT_DBL_EPSILON) {
+ double t = 60.0/x - 1.0;
+ gsl_sf_result c;
+ cheb_eval_e(&fd_1_e_cs, t, &c);
+ result->val = c.val * x*x;
+ result->err = c.err * x*x + GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x < GSL_SQRT_DBL_MAX) {
+ result->val = 0.5 * x*x;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ OVERFLOW_ERROR(result);
+ }
+}
+
+
+int gsl_sf_fermi_dirac_2_e(const double x, gsl_sf_result * result)
+{
+ if(x < GSL_LOG_DBL_MIN) {
+ UNDERFLOW_ERROR(result);
+ }
+ else if(x < -1.0) {
+ /* series [Goano (6)]
+ */
+ double ex = exp(x);
+ double term = ex;
+ double sum = term;
+ int n;
+ for(n=2; n<100 ; n++) {
+ double rat = (n-1.0)/n;
+ term *= -ex * rat * rat * rat;
+ sum += term;
+ if(fabs(term/sum) < GSL_DBL_EPSILON) break;
+ }
+ result->val = sum;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(sum);
+ return GSL_SUCCESS;
+ }
+ else if(x < 1.0) {
+ return cheb_eval_e(&fd_2_a_cs, x, result);
+ }
+ else if(x < 4.0) {
+ double t = 2.0/3.0*(x-1.0) - 1.0;
+ return cheb_eval_e(&fd_2_b_cs, t, result);
+ }
+ else if(x < 10.0) {
+ double t = 1.0/3.0*(x-4.0) - 1.0;
+ return cheb_eval_e(&fd_2_c_cs, t, result);
+ }
+ else if(x < 30.0) {
+ double t = 0.1*x - 2.0;
+ gsl_sf_result c;
+ cheb_eval_e(&fd_2_d_cs, t, &c);
+ result->val = c.val * x*x*x;
+ result->err = c.err * x*x*x + 3.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x < 1.0/GSL_ROOT3_DBL_EPSILON) {
+ double t = 60.0/x - 1.0;
+ gsl_sf_result c;
+ cheb_eval_e(&fd_2_e_cs, t, &c);
+ result->val = c.val * x*x*x;
+ result->err = c.err * x*x*x + 3.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x < GSL_ROOT3_DBL_MAX) {
+ result->val = 1.0/6.0 * x*x*x;
+ result->err = 3.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ OVERFLOW_ERROR(result);
+ }
+}
+
+
+int gsl_sf_fermi_dirac_int_e(const int j, const double x, gsl_sf_result * result)
+{
+ if(j < -1) {
+ return fd_nint(j, x, result);
+ }
+ else if (j == -1) {
+ return gsl_sf_fermi_dirac_m1_e(x, result);
+ }
+ else if(j == 0) {
+ return gsl_sf_fermi_dirac_0_e(x, result);
+ }
+ else if(j == 1) {
+ return gsl_sf_fermi_dirac_1_e(x, result);
+ }
+ else if(j == 2) {
+ return gsl_sf_fermi_dirac_2_e(x, result);
+ }
+ else if(x < 0.0) {
+ return fd_neg(j, x, result);
+ }
+ else if(x == 0.0) {
+ return gsl_sf_eta_int_e(j+1, result);
+ }
+ else if(x < 1.5) {
+ return fd_series_int(j, x, result);
+ }
+ else {
+ gsl_sf_result fasymp;
+ int stat_asymp = fd_asymp(j, x, &fasymp);
+
+ if(stat_asymp == GSL_SUCCESS) {
+ result->val = fasymp.val;
+ result->err = fasymp.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return stat_asymp;
+ }
+ else {
+ return fd_UMseries_int(j, x, result);
+ }
+ }
+}
+
+
+int gsl_sf_fermi_dirac_mhalf_e(const double x, gsl_sf_result * result)
+{
+ if(x < GSL_LOG_DBL_MIN) {
+ UNDERFLOW_ERROR(result);
+ }
+ else if(x < -1.0) {
+ /* series [Goano (6)]
+ */
+ double ex = exp(x);
+ double term = ex;
+ double sum = term;
+ int n;
+ for(n=2; n<200 ; n++) {
+ double rat = (n-1.0)/n;
+ term *= -ex * sqrt(rat);
+ sum += term;
+ if(fabs(term/sum) < GSL_DBL_EPSILON) break;
+ }
+ result->val = sum;
+ result->err = 2.0 * fabs(sum) * GSL_DBL_EPSILON;
+ return GSL_SUCCESS;
+ }
+ else if(x < 1.0) {
+ return cheb_eval_e(&fd_mhalf_a_cs, x, result);
+ }
+ else if(x < 4.0) {
+ double t = 2.0/3.0*(x-1.0) - 1.0;
+ return cheb_eval_e(&fd_mhalf_b_cs, t, result);
+ }
+ else if(x < 10.0) {
+ double t = 1.0/3.0*(x-4.0) - 1.0;
+ return cheb_eval_e(&fd_mhalf_c_cs, t, result);
+ }
+ else if(x < 30.0) {
+ double rtx = sqrt(x);
+ double t = 0.1*x - 2.0;
+ gsl_sf_result c;
+ cheb_eval_e(&fd_mhalf_d_cs, t, &c);
+ result->val = c.val * rtx;
+ result->err = c.err * rtx + 0.5 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ return fd_asymp(-0.5, x, result);
+ }
+}
+
+
+int gsl_sf_fermi_dirac_half_e(const double x, gsl_sf_result * result)
+{
+ if(x < GSL_LOG_DBL_MIN) {
+ UNDERFLOW_ERROR(result);
+ }
+ else if(x < -1.0) {
+ /* series [Goano (6)]
+ */
+ double ex = exp(x);
+ double term = ex;
+ double sum = term;
+ int n;
+ for(n=2; n<100 ; n++) {
+ double rat = (n-1.0)/n;
+ term *= -ex * rat * sqrt(rat);
+ sum += term;
+ if(fabs(term/sum) < GSL_DBL_EPSILON) break;
+ }
+ result->val = sum;
+ result->err = 2.0 * fabs(sum) * GSL_DBL_EPSILON;
+ return GSL_SUCCESS;
+ }
+ else if(x < 1.0) {
+ return cheb_eval_e(&fd_half_a_cs, x, result);
+ }
+ else if(x < 4.0) {
+ double t = 2.0/3.0*(x-1.0) - 1.0;
+ return cheb_eval_e(&fd_half_b_cs, t, result);
+ }
+ else if(x < 10.0) {
+ double t = 1.0/3.0*(x-4.0) - 1.0;
+ return cheb_eval_e(&fd_half_c_cs, t, result);
+ }
+ else if(x < 30.0) {
+ double x32 = x*sqrt(x);
+ double t = 0.1*x - 2.0;
+ gsl_sf_result c;
+ cheb_eval_e(&fd_half_d_cs, t, &c);
+ result->val = c.val * x32;
+ result->err = c.err * x32 + 1.5 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ return fd_asymp(0.5, x, result);
+ }
+}
+
+
+int gsl_sf_fermi_dirac_3half_e(const double x, gsl_sf_result * result)
+{
+ if(x < GSL_LOG_DBL_MIN) {
+ UNDERFLOW_ERROR(result);
+ }
+ else if(x < -1.0) {
+ /* series [Goano (6)]
+ */
+ double ex = exp(x);
+ double term = ex;
+ double sum = term;
+ int n;
+ for(n=2; n<100 ; n++) {
+ double rat = (n-1.0)/n;
+ term *= -ex * rat * rat * sqrt(rat);
+ sum += term;
+ if(fabs(term/sum) < GSL_DBL_EPSILON) break;
+ }
+ result->val = sum;
+ result->err = 2.0 * fabs(sum) * GSL_DBL_EPSILON;
+ return GSL_SUCCESS;
+ }
+ else if(x < 1.0) {
+ return cheb_eval_e(&fd_3half_a_cs, x, result);
+ }
+ else if(x < 4.0) {
+ double t = 2.0/3.0*(x-1.0) - 1.0;
+ return cheb_eval_e(&fd_3half_b_cs, t, result);
+ }
+ else if(x < 10.0) {
+ double t = 1.0/3.0*(x-4.0) - 1.0;
+ return cheb_eval_e(&fd_3half_c_cs, t, result);
+ }
+ else if(x < 30.0) {
+ double x52 = x*x*sqrt(x);
+ double t = 0.1*x - 2.0;
+ gsl_sf_result c;
+ cheb_eval_e(&fd_3half_d_cs, t, &c);
+ result->val = c.val * x52;
+ result->err = c.err * x52 + 2.5 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ return fd_asymp(1.5, x, result);
+ }
+}
+
+/* [Goano p. 222] */
+int gsl_sf_fermi_dirac_inc_0_e(const double x, const double b, gsl_sf_result * result)
+{
+ if(b < 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else {
+ double arg = b - x;
+ gsl_sf_result f0;
+ int status = gsl_sf_fermi_dirac_0_e(arg, &f0);
+ result->val = f0.val - arg;
+ result->err = f0.err + GSL_DBL_EPSILON * (fabs(x) + fabs(b));
+ return status;
+ }
+}
+
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_fermi_dirac_m1(const double x)
+{
+ EVAL_RESULT(gsl_sf_fermi_dirac_m1_e(x, &result));
+}
+
+double gsl_sf_fermi_dirac_0(const double x)
+{
+ EVAL_RESULT(gsl_sf_fermi_dirac_0_e(x, &result));
+}
+
+double gsl_sf_fermi_dirac_1(const double x)
+{
+ EVAL_RESULT(gsl_sf_fermi_dirac_1_e(x, &result));
+}
+
+double gsl_sf_fermi_dirac_2(const double x)
+{
+ EVAL_RESULT(gsl_sf_fermi_dirac_2_e(x, &result));
+}
+
+double gsl_sf_fermi_dirac_int(const int j, const double x)
+{
+ EVAL_RESULT(gsl_sf_fermi_dirac_int_e(j, x, &result));
+}
+
+double gsl_sf_fermi_dirac_mhalf(const double x)
+{
+ EVAL_RESULT(gsl_sf_fermi_dirac_mhalf_e(x, &result));
+}
+
+double gsl_sf_fermi_dirac_half(const double x)
+{
+ EVAL_RESULT(gsl_sf_fermi_dirac_half_e(x, &result));
+}
+
+double gsl_sf_fermi_dirac_3half(const double x)
+{
+ EVAL_RESULT(gsl_sf_fermi_dirac_3half_e(x, &result));
+}
+
+double gsl_sf_fermi_dirac_inc_0(const double x, const double b)
+{
+ EVAL_RESULT(gsl_sf_fermi_dirac_inc_0_e(x, b, &result));
+}
diff --git a/gsl-1.9/specfunc/gamma.c b/gsl-1.9/specfunc/gamma.c
new file mode 100644
index 0000000..4703cee
--- /dev/null
+++ b/gsl-1.9/specfunc/gamma.c
@@ -0,0 +1,1685 @@
+/* specfunc/gamma.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_exp.h>
+#include <gsl/gsl_sf_log.h>
+#include <gsl/gsl_sf_psi.h>
+#include <gsl/gsl_sf_trig.h>
+#include <gsl/gsl_sf_gamma.h>
+
+#include "error.h"
+#include "check.h"
+
+#include "chebyshev.h"
+#include "cheb_eval.c"
+
+#define LogRootTwoPi_ 0.9189385332046727418
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Private Section *-*-*-*-*-*-*-*-*-*-*-*/
+
+static struct {int n; double f; long i; } fact_table[GSL_SF_FACT_NMAX + 1] = {
+ { 0, 1.0, 1L },
+ { 1, 1.0, 1L },
+ { 2, 2.0, 2L },
+ { 3, 6.0, 6L },
+ { 4, 24.0, 24L },
+ { 5, 120.0, 120L },
+ { 6, 720.0, 720L },
+ { 7, 5040.0, 5040L },
+ { 8, 40320.0, 40320L },
+
+ { 9, 362880.0, 362880L },
+ { 10, 3628800.0, 3628800L },
+ { 11, 39916800.0, 39916800L },
+ { 12, 479001600.0, 479001600L },
+
+ { 13, 6227020800.0, 0 },
+ { 14, 87178291200.0, 0 },
+ { 15, 1307674368000.0, 0 },
+ { 16, 20922789888000.0, 0 },
+ { 17, 355687428096000.0, 0 },
+ { 18, 6402373705728000.0, 0 },
+ { 19, 121645100408832000.0, 0 },
+ { 20, 2432902008176640000.0, 0 },
+ { 21, 51090942171709440000.0, 0 },
+ { 22, 1124000727777607680000.0, 0 },
+ { 23, 25852016738884976640000.0, 0 },
+ { 24, 620448401733239439360000.0, 0 },
+ { 25, 15511210043330985984000000.0, 0 },
+ { 26, 403291461126605635584000000.0, 0 },
+ { 27, 10888869450418352160768000000.0, 0 },
+ { 28, 304888344611713860501504000000.0, 0 },
+ { 29, 8841761993739701954543616000000.0, 0 },
+ { 30, 265252859812191058636308480000000.0, 0 },
+ { 31, 8222838654177922817725562880000000.0, 0 },
+ { 32, 263130836933693530167218012160000000.0, 0 },
+ { 33, 8683317618811886495518194401280000000.0, 0 },
+ { 34, 2.95232799039604140847618609644e38, 0 },
+ { 35, 1.03331479663861449296666513375e40, 0 },
+ { 36, 3.71993326789901217467999448151e41, 0 },
+ { 37, 1.37637530912263450463159795816e43, 0 },
+ { 38, 5.23022617466601111760007224100e44, 0 },
+ { 39, 2.03978820811974433586402817399e46, 0 },
+ { 40, 8.15915283247897734345611269600e47, 0 },
+ { 41, 3.34525266131638071081700620534e49, 0 },
+ { 42, 1.40500611775287989854314260624e51, 0 },
+ { 43, 6.04152630633738356373551320685e52, 0 },
+ { 44, 2.65827157478844876804362581101e54, 0 },
+ { 45, 1.19622220865480194561963161496e56, 0 },
+ { 46, 5.50262215981208894985030542880e57, 0 },
+ { 47, 2.58623241511168180642964355154e59, 0 },
+ { 48, 1.24139155925360726708622890474e61, 0 },
+ { 49, 6.08281864034267560872252163321e62, 0 },
+ { 50, 3.04140932017133780436126081661e64, 0 },
+ { 51, 1.55111875328738228022424301647e66, 0 },
+ { 52, 8.06581751709438785716606368564e67, 0 },
+ { 53, 4.27488328406002556429801375339e69, 0 },
+ { 54, 2.30843697339241380472092742683e71, 0 },
+ { 55, 1.26964033536582759259651008476e73, 0 },
+ { 56, 7.10998587804863451854045647464e74, 0 },
+ { 57, 4.05269195048772167556806019054e76, 0 },
+ { 58, 2.35056133128287857182947491052e78, 0 },
+ { 59, 1.38683118545689835737939019720e80, 0 },
+ { 60, 8.32098711274139014427634118320e81, 0 },
+ { 61, 5.07580213877224798800856812177e83, 0 },
+ { 62, 3.14699732603879375256531223550e85, 0 },
+ { 63, 1.982608315404440064116146708360e87, 0 },
+ { 64, 1.268869321858841641034333893350e89, 0 },
+ { 65, 8.247650592082470666723170306800e90, 0 },
+ { 66, 5.443449390774430640037292402480e92, 0 },
+ { 67, 3.647111091818868528824985909660e94, 0 },
+ { 68, 2.480035542436830599600990418570e96, 0 },
+ { 69, 1.711224524281413113724683388810e98, 0 },
+ { 70, 1.197857166996989179607278372170e100, 0 },
+ { 71, 8.504785885678623175211676442400e101, 0 },
+ { 72, 6.123445837688608686152407038530e103, 0 },
+ { 73, 4.470115461512684340891257138130e105, 0 },
+ { 74, 3.307885441519386412259530282210e107, 0 },
+ { 75, 2.480914081139539809194647711660e109, 0 },
+ { 76, 1.885494701666050254987932260860e111, 0 },
+ { 77, 1.451830920282858696340707840860e113, 0 },
+ { 78, 1.132428117820629783145752115870e115, 0 },
+ { 79, 8.946182130782975286851441715400e116, 0 },
+ { 80, 7.156945704626380229481153372320e118, 0 },
+ { 81, 5.797126020747367985879734231580e120, 0 },
+ { 82, 4.753643337012841748421382069890e122, 0 },
+ { 83, 3.945523969720658651189747118010e124, 0 },
+ { 84, 3.314240134565353266999387579130e126, 0 },
+ { 85, 2.817104114380550276949479442260e128, 0 },
+ { 86, 2.422709538367273238176552320340e130, 0 },
+ { 87, 2.107757298379527717213600518700e132, 0 },
+ { 88, 1.854826422573984391147968456460e134, 0 },
+ { 89, 1.650795516090846108121691926250e136, 0 },
+ { 90, 1.485715964481761497309522733620e138, 0 },
+ { 91, 1.352001527678402962551665687590e140, 0 },
+ { 92, 1.243841405464130725547532432590e142, 0 },
+ { 93, 1.156772507081641574759205162310e144, 0 },
+ { 94, 1.087366156656743080273652852570e146, 0 },
+ { 95, 1.032997848823905926259970209940e148, 0 },
+ { 96, 9.916779348709496892095714015400e149, 0 },
+ { 97, 9.619275968248211985332842594960e151, 0 },
+ { 98, 9.426890448883247745626185743100e153, 0 },
+ { 99, 9.332621544394415268169923885600e155, 0 },
+ { 100, 9.33262154439441526816992388563e157, 0 },
+ { 101, 9.42594775983835942085162312450e159, 0 },
+ { 102, 9.61446671503512660926865558700e161, 0 },
+ { 103, 9.90290071648618040754671525458e163, 0 },
+ { 104, 1.02990167451456276238485838648e166, 0 },
+ { 105, 1.08139675824029090050410130580e168, 0 },
+ { 106, 1.146280563734708354534347384148e170, 0 },
+ { 107, 1.226520203196137939351751701040e172, 0 },
+ { 108, 1.324641819451828974499891837120e174, 0 },
+ { 109, 1.443859583202493582204882102460e176, 0 },
+ { 110, 1.588245541522742940425370312710e178, 0 },
+ { 111, 1.762952551090244663872161047110e180, 0 },
+ { 112, 1.974506857221074023536820372760e182, 0 },
+ { 113, 2.231192748659813646596607021220e184, 0 },
+ { 114, 2.543559733472187557120132004190e186, 0 },
+ { 115, 2.925093693493015690688151804820e188, 0 },
+ { 116, 3.393108684451898201198256093590e190, 0 },
+ { 117, 3.96993716080872089540195962950e192, 0 },
+ { 118, 4.68452584975429065657431236281e194, 0 },
+ { 119, 5.57458576120760588132343171174e196, 0 },
+ { 120, 6.68950291344912705758811805409e198, 0 },
+ { 121, 8.09429852527344373968162284545e200, 0 },
+ { 122, 9.87504420083360136241157987140e202, 0 },
+ { 123, 1.21463043670253296757662432419e205, 0 },
+ { 124, 1.50614174151114087979501416199e207, 0 },
+ { 125, 1.88267717688892609974376770249e209, 0 },
+ { 126, 2.37217324288004688567714730514e211, 0 },
+ { 127, 3.01266001845765954480997707753e213, 0 },
+ { 128, 3.85620482362580421735677065923e215, 0 },
+ { 129, 4.97450422247728744039023415041e217, 0 },
+ { 130, 6.46685548922047367250730439554e219, 0 },
+ { 131, 8.47158069087882051098456875820e221, 0 },
+ { 132, 1.11824865119600430744996307608e224, 0 },
+ { 133, 1.48727070609068572890845089118e226, 0 },
+ { 134, 1.99294274616151887673732419418e228, 0 },
+ { 135, 2.69047270731805048359538766215e230, 0 },
+ { 136, 3.65904288195254865768972722052e232, 0 },
+ { 137, 5.01288874827499166103492629211e234, 0 },
+ { 138, 6.91778647261948849222819828311e236, 0 },
+ { 139, 9.61572319694108900419719561353e238, 0 },
+ { 140, 1.34620124757175246058760738589e241, 0 },
+ { 141, 1.89814375907617096942852641411e243, 0 },
+ { 142, 2.69536413788816277658850750804e245, 0 },
+ { 143, 3.85437071718007277052156573649e247, 0 },
+ { 144, 5.55029383273930478955105466055e249, 0 },
+ { 145, 8.04792605747199194484902925780e251, 0 },
+ { 146, 1.17499720439091082394795827164e254, 0 },
+ { 147, 1.72724589045463891120349865931e256, 0 },
+ { 148, 2.55632391787286558858117801578e258, 0 },
+ { 149, 3.80892263763056972698595524351e260, 0 },
+ { 150, 5.71338395644585459047893286526e262, 0 },
+ { 151, 8.62720977423324043162318862650e264, 0 },
+ { 152, 1.31133588568345254560672467123e267, 0 },
+ { 153, 2.00634390509568239477828874699e269, 0 },
+ { 154, 3.08976961384735088795856467036e271, 0 },
+ { 155, 4.78914290146339387633577523906e273, 0 },
+ { 156, 7.47106292628289444708380937294e275, 0 },
+ { 157, 1.17295687942641442819215807155e278, 0 },
+ { 158, 1.85327186949373479654360975305e280, 0 },
+ { 159, 2.94670227249503832650433950735e282, 0 },
+ { 160, 4.71472363599206132240694321176e284, 0 },
+ { 161, 7.59070505394721872907517857094e286, 0 },
+ { 162, 1.22969421873944943411017892849e289, 0 },
+ { 163, 2.00440157654530257759959165344e291, 0 },
+ { 164, 3.28721858553429622726333031164e293, 0 },
+ { 165, 5.42391066613158877498449501421e295, 0 },
+ { 166, 9.00369170577843736647426172359e297, 0 },
+ { 167, 1.50361651486499904020120170784e300, 0 },
+ { 168, 2.52607574497319838753801886917e302, 0 },
+ { 169, 4.26906800900470527493925188890e304, 0 },
+ { 170, 7.25741561530799896739672821113e306, 0 },
+
+ /*
+ { 171, 1.24101807021766782342484052410e309, 0 },
+ { 172, 2.13455108077438865629072570146e311, 0 },
+ { 173, 3.69277336973969237538295546352e313, 0 },
+ { 174, 6.42542566334706473316634250653e315, 0 },
+ { 175, 1.12444949108573632830410993864e318, 0 },
+ { 176, 1.97903110431089593781523349201e320, 0 },
+ { 177, 3.50288505463028580993296328086e322, 0 },
+ { 178, 6.23513539724190874168067463993e324, 0 },
+ { 179, 1.11608923610630166476084076055e327, 0 },
+ { 180, 2.00896062499134299656951336898e329, 0 },
+ { 181, 3.63621873123433082379081919786e331, 0 },
+ { 182, 6.61791809084648209929929094011e333, 0 },
+ { 183, 1.21107901062490622417177024204e336, 0 },
+ { 184, 2.22838537954982745247605724535e338, 0 },
+ { 185, 4.12251295216718078708070590390e340, 0 },
+ { 186, 7.66787409103095626397011298130e342, 0 },
+ { 187, 1.43389245502278882136241112750e345, 0 },
+ { 188, 2.69571781544284298416133291969e347, 0 },
+ { 189, 5.09490667118697324006491921822e349, 0 },
+ { 190, 9.68032267525524915612334651460e351, 0 },
+ { 191, 1.84894163097375258881955918429e354, 0 },
+ { 192, 3.54996793146960497053355363384e356, 0 },
+ { 193, 6.85143810773633759312975851330e358, 0 },
+ { 194, 1.32917899290084949306717315158e361, 0 },
+ { 195, 2.59189903615665651148098764559e363, 0 },
+ { 196, 5.08012211086704676250273578535e365, 0 },
+ { 197, 1.00078405584080821221303894971e368, 0 },
+ { 198, 1.98155243056480026018181712043e370, 0 },
+ { 199, 3.94328933682395251776181606966e372, 0 },
+ { 200, 7.88657867364790503552363213932e374, 0 }
+ */
+};
+
+static struct {int n; double f; long i; } doub_fact_table[GSL_SF_DOUBLEFACT_NMAX + 1] = {
+ { 0, 1.000000000000000000000000000, 1L },
+ { 1, 1.000000000000000000000000000, 1L },
+ { 2, 2.000000000000000000000000000, 2L },
+ { 3, 3.000000000000000000000000000, 3L },
+ { 4, 8.000000000000000000000000000, 8L },
+ { 5, 15.00000000000000000000000000, 15L },
+ { 6, 48.00000000000000000000000000, 48L },
+ { 7, 105.0000000000000000000000000, 105L },
+ { 8, 384.0000000000000000000000000, 384L },
+ { 9, 945.0000000000000000000000000, 945L },
+ { 10, 3840.000000000000000000000000, 3840L },
+ { 11, 10395.00000000000000000000000, 10395L },
+ { 12, 46080.00000000000000000000000, 46080L },
+ { 13, 135135.0000000000000000000000, 135135L },
+ { 14, 645120.00000000000000000000000, 645120L },
+ { 15, 2.02702500000000000000000000000e6, 2027025L },
+ { 16, 1.03219200000000000000000000000e7, 10321920L },
+ { 17, 3.4459425000000000000000000000e7, 34459425L },
+ { 18, 1.85794560000000000000000000000e8, 185794560L },
+ { 19, 6.5472907500000000000000000000e8, 0 },
+ { 20, 3.7158912000000000000000000000e9, 0 },
+ { 21, 1.37493105750000000000000000000e10, 0 },
+ { 22, 8.1749606400000000000000000000e10, 0 },
+ { 23, 3.1623414322500000000000000000e11, 0 },
+ { 24, 1.96199055360000000000000000000e12, 0 },
+ { 25, 7.9058535806250000000000000000e12, 0 },
+ { 26, 5.1011754393600000000000000000e13, 0 },
+ { 27, 2.13458046676875000000000000000e14, 0 },
+ { 28, 1.42832912302080000000000000000e15, 0 },
+ { 29, 6.1902833536293750000000000000e15, 0 },
+ { 30, 4.2849873690624000000000000000e16, 0 },
+ { 31, 1.91898783962510625000000000000e17, 0 },
+ { 32, 1.37119595809996800000000000000e18, 0 },
+ { 33, 6.3326598707628506250000000000e18, 0 },
+ { 34, 4.6620662575398912000000000000e19, 0 },
+ { 35, 2.21643095476699771875000000000e20, 0 },
+ { 36, 1.67834385271436083200000000000e21, 0 },
+ { 37, 8.2007945326378915593750000000e21, 0 },
+ { 38, 6.3777066403145711616000000000e22, 0 },
+ { 39, 3.1983098677287777081562500000e23, 0 },
+ { 40, 2.55108265612582846464000000000e24, 0 },
+ { 41, 1.31130704576879886034406250000e25, 0 },
+ { 42, 1.07145471557284795514880000000e26, 0 },
+ { 43, 5.6386202968058350994794687500e26, 0 },
+ { 44, 4.7144007485205310026547200000e27, 0 },
+ { 45, 2.53737913356262579476576093750e28, 0 },
+ { 46, 2.16862434431944426122117120000e29, 0 },
+ { 47, 1.19256819277443412353990764062e30, 0 },
+ { 48, 1.04093968527333324538616217600e31, 0 },
+ { 49, 5.8435841445947272053455474391e31, 0 },
+ { 50, 5.2046984263666662269308108800e32, 0 },
+ { 51, 2.98022791374331087472622919392e33, 0 },
+ { 52, 2.70644318171066643800402165760e34, 0 },
+ { 53, 1.57952079428395476360490147278e35, 0 },
+ { 54, 1.46147931812375987652217169510e36, 0 },
+ { 55, 8.6873643685617511998269581003e36, 0 },
+ { 56, 8.1842841814930553085241614926e37, 0 },
+ { 57, 4.9517976900801981839013661172e38, 0 },
+ { 58, 4.7468848252659720789440136657e39, 0 },
+ { 59, 2.92156063714731692850180600912e40, 0 },
+ { 60, 2.84813089515958324736640819942e41, 0 },
+ { 61, 1.78215198865986332638610166557e42, 0 },
+ { 62, 1.76584115499894161336717308364e43, 0 },
+ { 63, 1.12275575285571389562324404931e44, 0 },
+ { 64, 1.13013833919932263255499077353e45, 0 },
+ { 65, 7.2979123935621403215510863205e45, 0 },
+ { 66, 7.4589130387155293748629391053e46, 0 },
+ { 67, 4.8896013036866340154392278347e47, 0 },
+ { 68, 5.0720608663265599749067985916e48, 0 },
+ { 69, 3.3738248995437774706530672060e49, 0 },
+ { 70, 3.5504426064285919824347590141e50, 0 },
+ { 71, 2.39541567867608200416367771623e51, 0 },
+ { 72, 2.55631867662858622735302649017e52, 0 },
+ { 73, 1.74865344543353986303948473285e53, 0 },
+ { 74, 1.89167582070515380824123960272e54, 0 },
+ { 75, 1.31149008407515489727961354964e55, 0 },
+ { 76, 1.43767362373591689426334209807e56, 0 },
+ { 77, 1.00984736473786927090530243322e57, 0 },
+ { 78, 1.12138542651401517752540683649e58, 0 },
+ { 79, 7.9777941814291672401518892225e58, 0 },
+ { 80, 8.9710834121121214202032546920e59, 0 },
+ { 81, 6.4620132869576254645230302702e60, 0 },
+ { 82, 7.3562883979319395645666688474e61, 0 },
+ { 83, 5.3634710281748291355541151243e62, 0 },
+ { 84, 6.1792822542628292342360018318e63, 0 },
+ { 85, 4.5589503739486047652209978556e64, 0 },
+ { 86, 5.3141827386660331414429615754e65, 0 },
+ { 87, 3.9662868253352861457422681344e66, 0 },
+ { 88, 4.6764808100261091644698061863e67, 0 },
+ { 89, 3.5299952745484046697106186396e68, 0 },
+ { 90, 4.2088327290234982480228255677e69, 0 },
+ { 91, 3.2122956998390482494366629620e70, 0 },
+ { 92, 3.8721261107016183881809995223e71, 0 },
+ { 93, 2.98743500085031487197609655470e72, 0 },
+ { 94, 3.6397985440595212848901395509e73, 0 },
+ { 95, 2.83806325080779912837729172696e74, 0 },
+ { 96, 3.4942066022971404334945339689e75, 0 },
+ { 97, 2.75292135328356515452597297515e76, 0 },
+ { 98, 3.4243224702511976248246432895e77, 0 },
+ { 99, 2.72539213975072950298071324540e78, 0 },
+ { 100, 3.4243224702511976248246432895e79, 0 },
+ { 101, 2.75264606114823679801052037785e80, 0 },
+ { 102, 3.4928089196562215773211361553e81, 0 },
+ { 103, 2.83522544298268390195083598919e82, 0 },
+ { 104, 3.6325212764424704404139816015e83, 0 },
+ { 105, 2.97698671513181809704837778865e84, 0 },
+ { 106, 3.8504725530290186668388204976e85, 0 },
+ { 107, 3.1853757851910453638417642339e86, 0 },
+ { 108, 4.1585103572713401601859261374e87, 0 },
+ { 109, 3.4720596058582394465875230149e88, 0 },
+ { 110, 4.5743613929984741762045187512e89, 0 },
+ { 111, 3.8539861625026457857121505465e90, 0 },
+ { 112, 5.1232847601582910773490610013e91, 0 },
+ { 113, 4.3550043636279897378547301176e92, 0 },
+ { 114, 5.8405446265804518281779295415e93, 0 },
+ { 115, 5.0082550181721881985329396352e94, 0 },
+ { 116, 6.7750317668333241206863982681e95, 0 },
+ { 117, 5.8596583712614601922835393732e96, 0 },
+ { 118, 7.9945374848633224624099499564e97, 0 },
+ { 119, 6.9729934618011376288174118541e98, 0 },
+ { 120, 9.5934449818359869548919399477e99, 0 },
+ { 121, 8.4373220887793765308690683435e100, 0 },
+ { 122, 1.17040028778399040849681667362e102, 0 },
+ { 123, 1.03779061691986331329689540625e103, 0 },
+ { 124, 1.45129635685214810653605267528e104, 0 },
+ { 125, 1.29723827114982914162111925781e105, 0 },
+ { 126, 1.82863340963370661423542637086e106, 0 },
+ { 127, 1.64749260436028300985882145742e107, 0 },
+ { 128, 2.34065076433114446622134575470e108, 0 },
+ { 129, 2.12526545962476508271787968008e109, 0 },
+ { 130, 3.04284599363048780608774948111e110, 0 },
+ { 131, 2.78409775210844225836042238090e111, 0 },
+ { 132, 4.0165567115922439040358293151e112, 0 },
+ { 133, 3.7028500103042282036193617666e113, 0 },
+ { 134, 5.3821859935336068314080112822e114, 0 },
+ { 135, 4.9988475139107080748861383849e115, 0 },
+ { 136, 7.3197729512057052907148953438e116, 0 },
+ { 137, 6.8484210940576700625940095873e117, 0 },
+ { 138, 1.01012866726638733011865555744e119, 0 },
+ { 139, 9.5193053207401613870056733264e119, 0 },
+ { 140, 1.41418013417294226216611778042e121, 0 },
+ { 141, 1.34222205022436275556779993902e122, 0 },
+ { 142, 2.00813579052557801227588724819e123, 0 },
+ { 143, 1.91937753182083874046195391280e124, 0 },
+ { 144, 2.89171553835683233767727763739e125, 0 },
+ { 145, 2.78309742114021617366983317355e126, 0 },
+ { 146, 4.2219046860009752130088253506e127, 0 },
+ { 147, 4.0911532090761177752946547651e128, 0 },
+ { 148, 6.2484189352814433152530615189e129, 0 },
+ { 149, 6.0958182815234154851890356000e130, 0 },
+ { 150, 9.3726284029221649728795922783e131, 0 },
+ { 151, 9.2046856051003573826354437561e132, 0 },
+ { 152, 1.42463951724416907587769802630e134, 0 },
+ { 153, 1.40831689758035467954322289468e135, 0 },
+ { 154, 2.19394485655602037685165496051e136, 0 },
+ { 155, 2.18289119124954975329199548675e137, 0 },
+ { 156, 3.4225539762273917878885817384e138, 0 },
+ { 157, 3.4271391702617931126684329142e139, 0 },
+ { 158, 5.4076352824392790248639591467e140, 0 },
+ { 159, 5.4491512807162510491428083336e141, 0 },
+ { 160, 8.6522164519028464397823346347e142, 0 },
+ { 161, 8.7731335619531641891199214170e143, 0 },
+ { 162, 1.40165906520826112324473821082e145, 0 },
+ { 163, 1.43002077059836576282654719098e146, 0 },
+ { 164, 2.29872086694154824212137066574e147, 0 },
+ { 165, 2.35953427148730350866380286512e148, 0 },
+ { 166, 3.8158766391229700819214753051e149, 0 },
+ { 167, 3.9404222333837968594685507847e150, 0 },
+ { 168, 6.4106727537265897376280785126e151, 0 },
+ { 169, 6.6593135744186166925018508262e152, 0 },
+ { 170, 1.08981436813352025539677334714e154, 0 },
+ { 171, 1.13874262122558345441781649128e155, 0 },
+ { 172, 1.87448071318965483928245015709e156, 0 },
+ { 173, 1.97002473472025937614282252992e157, 0 },
+ { 174, 3.2615964409499994203514632733e158, 0 },
+ { 175, 3.4475432857604539082499394274e159, 0 },
+ { 176, 5.7404097360719989798185753611e160, 0 },
+ { 177, 6.1021516157960034176023927864e161, 0 },
+ { 178, 1.02179293302081581840770641427e163, 0 },
+ { 179, 1.09228513922748461175082830877e164, 0 },
+ { 180, 1.83922727943746847313387154568e165, 0 },
+ { 181, 1.97703610200174714726899923887e166, 0 },
+ { 182, 3.3473936485761926211036462131e167, 0 },
+ { 183, 3.6179760666631972795022686071e168, 0 },
+ { 184, 6.1592043133801944228307090322e169, 0 },
+ { 185, 6.6932557233269149670791969232e170, 0 },
+ { 186, 1.14561200228871616264651187999e172, 0 },
+ { 187, 1.25163882026213309884380982464e173, 0 },
+ { 188, 2.15375056430278638577544233437e174, 0 },
+ { 189, 2.36559737029543155681480056857e175, 0 },
+ { 190, 4.0921260721752941329733404353e176, 0 },
+ { 191, 4.5182909772642742735162690860e177, 0 },
+ { 192, 7.8568820585765647353088136358e178, 0 },
+ { 193, 8.7203015861200493478863993359e179, 0 },
+ { 194, 1.52423511936385355864990984535e181, 0 },
+ { 195, 1.70045880929340962283784787050e182, 0 },
+ { 196, 2.98750083395315297495382329688e183, 0 },
+ { 197, 3.3499038543080169569905603049e184, 0 },
+ { 198, 5.9152516512272428904085701278e185, 0 },
+ { 199, 6.6663086700729537444112150067e186, 0 },
+ { 200, 1.18305033024544857808171402556e188, 0 },
+ { 201, 1.33992804268466370262665421635e189, 0 },
+ { 202, 2.38976166709580612772506233164e190, 0 },
+ { 203, 2.72005392664986731633210805920e191, 0 },
+ { 204, 4.8751138008754445005591271565e192, 0 },
+ { 205, 5.5761105496322279984808215214e193, 0 },
+ { 206, 1.00427344298034156711518019425e195, 0 },
+ { 207, 1.15425488377387119568553005492e196, 0 },
+ { 208, 2.08888876139911045959957480403e197, 0 },
+ { 209, 2.41239270708739079898275781478e198, 0 },
+ { 210, 4.3866663989381319651591070885e199, 0 },
+ { 211, 5.0901486119543945858536189892e200, 0 },
+ { 212, 9.2997327657488397661373070276e201, 0 },
+ { 213, 1.08420165434628604678682084470e203, 0 },
+ { 214, 1.99014281187025170995338370390e204, 0 },
+ { 215, 2.33103355684451500059166481610e205, 0 },
+ { 216, 4.2987084736397436934993088004e206, 0 },
+ { 217, 5.0583428183525975512839126509e207, 0 },
+ { 218, 9.3711844725346412518284931849e208, 0 },
+ { 219, 1.10777707721921886373117687056e210, 0 },
+ { 220, 2.06166058395762107540226850068e211, 0 },
+ { 221, 2.44818734065447368884590088393e212, 0 },
+ { 222, 4.5768864963859187873930360715e213, 0 },
+ { 223, 5.4594577696594763261263589712e214, 0 },
+ { 224, 1.02522257519044580837604008002e216, 0 },
+ { 225, 1.22837799817338217337843076851e217, 0 },
+ { 226, 2.31700301993040752692985058084e218, 0 },
+ { 227, 2.78841805585357753356903784452e219, 0 },
+ { 228, 5.2827668854413291614000593243e220, 0 },
+ { 229, 6.3854773479046925518730966640e221, 0 },
+ { 230, 1.21503638365150570712201364459e223, 0 },
+ { 231, 1.47504526736598397948268532937e224, 0 },
+ { 232, 2.81888441007149324052307165546e225, 0 },
+ { 233, 3.4368554729627426721946568174e226, 0 },
+ { 234, 6.5961895195672941828239876738e227, 0 },
+ { 235, 8.0766103614624452796574435210e228, 0 },
+ { 236, 1.55670072661788142714646109101e230, 0 },
+ { 237, 1.91415665566659953127881411447e231, 0 },
+ { 238, 3.7049477293505577966085773966e232, 0 },
+ { 239, 4.5748344070431728797563657336e233, 0 },
+ { 240, 8.8918745504413387118605857518e234, 0 },
+ { 241, 1.10253509209740466402128414180e236, 0 },
+ { 242, 2.15183364120680396827026175195e237, 0 },
+ { 243, 2.67916027379669333357172046456e238, 0 },
+ { 244, 5.2504740845446016825794386748e239, 0 },
+ { 245, 6.5639426708018986672507151382e240, 0 },
+ { 246, 1.29161662479797201391454191399e242, 0 },
+ { 247, 1.62129383968806897081092663913e243, 0 },
+ { 248, 3.2032092294989705945080639467e244, 0 },
+ { 249, 4.0370216608232917373192073314e245, 0 },
+ { 250, 8.0080230737474264862701598667e246, 0 },
+ { 251, 1.01329243686664622606712104019e248, 0 },
+ { 252, 2.01802181458435147454008028642e249, 0 },
+ { 253, 2.56362986527261495194981623168e250, 0 },
+ { 254, 5.1257754090442527453318039275e251, 0 },
+ { 255, 6.5372561564451681274720313908e252, 0 },
+ { 256, 1.31219850471532870280494180544e254, 0 },
+ { 257, 1.68007483220640820876031206743e255, 0 },
+ { 258, 3.3854721421655480532367498580e256, 0 },
+ { 259, 4.3513938154145972606892082546e257, 0 },
+ { 260, 8.8022275696304249384155496309e258, 0 },
+ { 261, 1.13571378582320988503988335446e260, 0 },
+ { 262, 2.30618362324317133386487400329e261, 0 },
+ { 263, 2.98692725671504199765489322224e262, 0 },
+ { 264, 6.0883247653619723214032673687e263, 0 },
+ { 265, 7.9153572302948612937854670389e264, 0 },
+ { 266, 1.61949438758628463749326912007e266, 0 },
+ { 267, 2.11340038048872796544071969939e267, 0 },
+ { 268, 4.3402449587312428284819612418e268, 0 },
+ { 269, 5.6850470235146782270355359914e269, 0 },
+ { 270, 1.17186613885743556369012953528e271, 0 },
+ { 271, 1.54064774337247779952663025366e272, 0 },
+ { 272, 3.1874758976922247332371523360e273, 0 },
+ { 273, 4.2059683394068643927077005925e274, 0 },
+ { 274, 8.7336839596766957690697974006e275, 0 },
+ { 275, 1.15664129333688770799461766294e277, 0 },
+ { 276, 2.41049677287076803226326408256e278, 0 },
+ { 277, 3.2038963825431789511450909263e279, 0 },
+ { 278, 6.7011810285807351296918741495e280, 0 },
+ { 279, 8.9388709072954692736948036845e281, 0 },
+ { 280, 1.87633068800260583631372476186e283, 0 },
+ { 281, 2.51182272495002686590823983534e284, 0 },
+ { 282, 5.2912525401673484584047038284e285, 0 },
+ { 283, 7.1084583116085760305203187340e286, 0 },
+ { 284, 1.50271572140752696218693588728e288, 0 },
+ { 285, 2.02591061880844416869829083919e289, 0 },
+ { 286, 4.2977669632255271118546366376e290, 0 },
+ { 287, 5.8143634759802347641640947085e291, 0 },
+ { 288, 1.23775688540895180821413535163e293, 0 },
+ { 289, 1.68035104455828784684342337075e294, 0 },
+ { 290, 3.5894949676859602438209925197e295, 0 },
+ { 291, 4.8898215396646176343143620089e296, 0 },
+ { 292, 1.04813253056430039119572981576e298, 0 },
+ { 293, 1.43271771112173296685410806860e299, 0 },
+ { 294, 3.08150963985904315011544565835e300, 0 },
+ { 295, 4.2265172478091122522196188024e301, 0 },
+ { 296, 9.1212685339827677243417191487e302, 0 },
+ { 297, 1.25527562259930633890922678431e304, 0 },
+ /*
+ { 298, 2.71813802312686478185383230631e305, 0 },
+ { 299, 3.7532741115719259533385880851e306, 0 },
+ { 300, 8.1544140693805943455614969189e307, }
+ */
+};
+
+
+/* Chebyshev coefficients for Gamma*(3/4(t+1)+1/2), -1<t<1
+ */
+static double gstar_a_data[30] = {
+ 2.16786447866463034423060819465,
+ -0.05533249018745584258035832802,
+ 0.01800392431460719960888319748,
+ -0.00580919269468937714480019814,
+ 0.00186523689488400339978881560,
+ -0.00059746524113955531852595159,
+ 0.00019125169907783353925426722,
+ -0.00006124996546944685735909697,
+ 0.00001963889633130842586440945,
+ -6.3067741254637180272515795142e-06,
+ 2.0288698405861392526872789863e-06,
+ -6.5384896660838465981983750582e-07,
+ 2.1108698058908865476480734911e-07,
+ -6.8260714912274941677892994580e-08,
+ 2.2108560875880560555583978510e-08,
+ -7.1710331930255456643627187187e-09,
+ 2.3290892983985406754602564745e-09,
+ -7.5740371598505586754890405359e-10,
+ 2.4658267222594334398525312084e-10,
+ -8.0362243171659883803428749516e-11,
+ 2.6215616826341594653521346229e-11,
+ -8.5596155025948750540420068109e-12,
+ 2.7970831499487963614315315444e-12,
+ -9.1471771211886202805502562414e-13,
+ 2.9934720198063397094916415927e-13,
+ -9.8026575909753445931073620469e-14,
+ 3.2116773667767153777571410671e-14,
+ -1.0518035333878147029650507254e-14,
+ 3.4144405720185253938994854173e-15,
+ -1.0115153943081187052322643819e-15
+};
+static cheb_series gstar_a_cs = {
+ gstar_a_data,
+ 29,
+ -1, 1,
+ 17
+};
+
+
+/* Chebyshev coefficients for
+ * x^2(Gamma*(x) - 1 - 1/(12x)), x = 4(t+1)+2, -1 < t < 1
+ */
+static double gstar_b_data[] = {
+ 0.0057502277273114339831606096782,
+ 0.0004496689534965685038254147807,
+ -0.0001672763153188717308905047405,
+ 0.0000615137014913154794776670946,
+ -0.0000223726551711525016380862195,
+ 8.0507405356647954540694800545e-06,
+ -2.8671077107583395569766746448e-06,
+ 1.0106727053742747568362254106e-06,
+ -3.5265558477595061262310873482e-07,
+ 1.2179216046419401193247254591e-07,
+ -4.1619640180795366971160162267e-08,
+ 1.4066283500795206892487241294e-08,
+ -4.6982570380537099016106141654e-09,
+ 1.5491248664620612686423108936e-09,
+ -5.0340936319394885789686867772e-10,
+ 1.6084448673736032249959475006e-10,
+ -5.0349733196835456497619787559e-11,
+ 1.5357154939762136997591808461e-11,
+ -4.5233809655775649997667176224e-12,
+ 1.2664429179254447281068538964e-12,
+ -3.2648287937449326771785041692e-13,
+ 7.1528272726086133795579071407e-14,
+ -9.4831735252566034505739531258e-15,
+ -2.3124001991413207293120906691e-15,
+ 2.8406613277170391482590129474e-15,
+ -1.7245370321618816421281770927e-15,
+ 8.6507923128671112154695006592e-16,
+ -3.9506563665427555895391869919e-16,
+ 1.6779342132074761078792361165e-16,
+ -6.0483153034414765129837716260e-17
+};
+static cheb_series gstar_b_cs = {
+ gstar_b_data,
+ 29,
+ -1, 1,
+ 18
+};
+
+
+/* coefficients for gamma=7, kmax=8 Lanczos method */
+static double lanczos_7_c[9] = {
+ 0.99999999999980993227684700473478,
+ 676.520368121885098567009190444019,
+ -1259.13921672240287047156078755283,
+ 771.3234287776530788486528258894,
+ -176.61502916214059906584551354,
+ 12.507343278686904814458936853,
+ -0.13857109526572011689554707,
+ 9.984369578019570859563e-6,
+ 1.50563273514931155834e-7
+};
+
+/* complex version of Lanczos method; this is not safe for export
+ * since it becomes bad in the left half-plane
+ */
+static
+int
+lngamma_lanczos_complex(double zr, double zi, gsl_sf_result * yr, gsl_sf_result * yi)
+{
+ int k;
+ gsl_sf_result log1_r, log1_i;
+ gsl_sf_result logAg_r, logAg_i;
+ double Ag_r, Ag_i;
+ double yi_tmp_val, yi_tmp_err;
+
+ zr -= 1.0; /* Lanczos writes z! instead of Gamma(z) */
+
+ Ag_r = lanczos_7_c[0];
+ Ag_i = 0.0;
+ for(k=1; k<=8; k++) {
+ double R = zr + k;
+ double I = zi;
+ double a = lanczos_7_c[k] / (R*R + I*I);
+ Ag_r += a * R;
+ Ag_i -= a * I;
+ }
+
+ gsl_sf_complex_log_e(zr + 7.5, zi, &log1_r, &log1_i);
+ gsl_sf_complex_log_e(Ag_r, Ag_i, &logAg_r, &logAg_i);
+
+ /* (z+0.5)*log(z+7.5) - (z+7.5) + LogRootTwoPi_ + log(Ag(z)) */
+ yr->val = (zr+0.5)*log1_r.val - zi*log1_i.val - (zr+7.5) + LogRootTwoPi_ + logAg_r.val;
+ yi->val = zi*log1_r.val + (zr+0.5)*log1_i.val - zi + logAg_i.val;
+ yr->err = 4.0 * GSL_DBL_EPSILON * fabs(yr->val);
+ yi->err = 4.0 * GSL_DBL_EPSILON * fabs(yi->val);
+ yi_tmp_val = yi->val;
+ yi_tmp_err = yi->err;
+ gsl_sf_angle_restrict_symm_err_e(yi_tmp_val, yi);
+ yi->err += yi_tmp_err;
+ return GSL_SUCCESS;
+}
+
+
+/* Lanczos method for real x > 0;
+ * gamma=7, truncated at 1/(z+8)
+ * [J. SIAM Numer. Anal, Ser. B, 1 (1964) 86]
+ */
+static
+int
+lngamma_lanczos(double x, gsl_sf_result * result)
+{
+ int k;
+ double Ag;
+ double term1, term2;
+
+ x -= 1.0; /* Lanczos writes z! instead of Gamma(z) */
+
+ Ag = lanczos_7_c[0];
+ for(k=1; k<=8; k++) { Ag += lanczos_7_c[k]/(x+k); }
+
+ /* (x+0.5)*log(x+7.5) - (x+7.5) + LogRootTwoPi_ + log(Ag(x)) */
+ term1 = (x+0.5)*log((x+7.5)/M_E);
+ term2 = LogRootTwoPi_ + log(Ag);
+ result->val = term1 + (term2 - 7.0);
+ result->err = 2.0 * GSL_DBL_EPSILON * (fabs(term1) + fabs(term2) + 7.0);
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+
+ return GSL_SUCCESS;
+}
+
+/* x = eps near zero
+ * gives double-precision for |eps| < 0.02
+ */
+static
+int
+lngamma_sgn_0(double eps, gsl_sf_result * lng, double * sgn)
+{
+ /* calculate series for g(eps) = Gamma(eps) eps - 1/(1+eps) - eps/2 */
+ const double c1 = -0.07721566490153286061;
+ const double c2 = -0.01094400467202744461;
+ const double c3 = 0.09252092391911371098;
+ const double c4 = -0.01827191316559981266;
+ const double c5 = 0.01800493109685479790;
+ const double c6 = -0.00685088537872380685;
+ const double c7 = 0.00399823955756846603;
+ const double c8 = -0.00189430621687107802;
+ const double c9 = 0.00097473237804513221;
+ const double c10 = -0.00048434392722255893;
+ const double g6 = c6+eps*(c7+eps*(c8 + eps*(c9 + eps*c10)));
+ const double g = eps*(c1+eps*(c2+eps*(c3+eps*(c4+eps*(c5+eps*g6)))));
+
+ /* calculate Gamma(eps) eps, a positive quantity */
+ const double gee = g + 1.0/(1.0+eps) + 0.5*eps;
+
+ lng->val = log(gee/fabs(eps));
+ lng->err = 4.0 * GSL_DBL_EPSILON * fabs(lng->val);
+ *sgn = GSL_SIGN(eps);
+
+ return GSL_SUCCESS;
+}
+
+
+/* x near a negative integer
+ * Calculates sign as well as log(|gamma(x)|).
+ * x = -N + eps
+ * assumes N >= 1
+ */
+static
+int
+lngamma_sgn_sing(int N, double eps, gsl_sf_result * lng, double * sgn)
+{
+ if(eps == 0.0) {
+ lng->val = 0.0;
+ lng->err = 0.0;
+ *sgn = 0.0;
+ GSL_ERROR ("error", GSL_EDOM);
+ }
+ else if(N == 1) {
+ /* calculate series for
+ * g = eps gamma(-1+eps) + 1 + eps/2 (1+3eps)/(1-eps^2)
+ * double-precision for |eps| < 0.02
+ */
+ const double c0 = 0.07721566490153286061;
+ const double c1 = 0.08815966957356030521;
+ const double c2 = -0.00436125434555340577;
+ const double c3 = 0.01391065882004640689;
+ const double c4 = -0.00409427227680839100;
+ const double c5 = 0.00275661310191541584;
+ const double c6 = -0.00124162645565305019;
+ const double c7 = 0.00065267976121802783;
+ const double c8 = -0.00032205261682710437;
+ const double c9 = 0.00016229131039545456;
+ const double g5 = c5 + eps*(c6 + eps*(c7 + eps*(c8 + eps*c9)));
+ const double g = eps*(c0 + eps*(c1 + eps*(c2 + eps*(c3 + eps*(c4 + eps*g5)))));
+
+ /* calculate eps gamma(-1+eps), a negative quantity */
+ const double gam_e = g - 1.0 - 0.5*eps*(1.0+3.0*eps)/(1.0 - eps*eps);
+
+ lng->val = log(fabs(gam_e)/fabs(eps));
+ lng->err = 2.0 * GSL_DBL_EPSILON * fabs(lng->val);
+ *sgn = ( eps > 0.0 ? -1.0 : 1.0 );
+ return GSL_SUCCESS;
+ }
+ else {
+ double g;
+
+ /* series for sin(Pi(N+1-eps))/(Pi eps) modulo the sign
+ * double-precision for |eps| < 0.02
+ */
+ const double cs1 = -1.6449340668482264365;
+ const double cs2 = 0.8117424252833536436;
+ const double cs3 = -0.1907518241220842137;
+ const double cs4 = 0.0261478478176548005;
+ const double cs5 = -0.0023460810354558236;
+ const double e2 = eps*eps;
+ const double sin_ser = 1.0 + e2*(cs1+e2*(cs2+e2*(cs3+e2*(cs4+e2*cs5))));
+
+ /* calculate series for ln(gamma(1+N-eps))
+ * double-precision for |eps| < 0.02
+ */
+ double aeps = fabs(eps);
+ double c1, c2, c3, c4, c5, c6, c7;
+ double lng_ser;
+ gsl_sf_result c0;
+ gsl_sf_result psi_0;
+ gsl_sf_result psi_1;
+ gsl_sf_result psi_2;
+ gsl_sf_result psi_3;
+ gsl_sf_result psi_4;
+ gsl_sf_result psi_5;
+ gsl_sf_result psi_6;
+ psi_2.val = 0.0;
+ psi_3.val = 0.0;
+ psi_4.val = 0.0;
+ psi_5.val = 0.0;
+ psi_6.val = 0.0;
+ gsl_sf_lnfact_e(N, &c0);
+ gsl_sf_psi_int_e(N+1, &psi_0);
+ gsl_sf_psi_1_int_e(N+1, &psi_1);
+ if(aeps > 0.00001) gsl_sf_psi_n_e(2, N+1.0, &psi_2);
+ if(aeps > 0.0002) gsl_sf_psi_n_e(3, N+1.0, &psi_3);
+ if(aeps > 0.001) gsl_sf_psi_n_e(4, N+1.0, &psi_4);
+ if(aeps > 0.005) gsl_sf_psi_n_e(5, N+1.0, &psi_5);
+ if(aeps > 0.01) gsl_sf_psi_n_e(6, N+1.0, &psi_6);
+ c1 = psi_0.val;
+ c2 = psi_1.val/2.0;
+ c3 = psi_2.val/6.0;
+ c4 = psi_3.val/24.0;
+ c5 = psi_4.val/120.0;
+ c6 = psi_5.val/720.0;
+ c7 = psi_6.val/5040.0;
+ lng_ser = c0.val-eps*(c1-eps*(c2-eps*(c3-eps*(c4-eps*(c5-eps*(c6-eps*c7))))));
+
+ /* calculate
+ * g = ln(|eps gamma(-N+eps)|)
+ * = -ln(gamma(1+N-eps)) + ln(|eps Pi/sin(Pi(N+1+eps))|)
+ */
+ g = -lng_ser - log(sin_ser);
+
+ lng->val = g - log(fabs(eps));
+ lng->err = c0.err + 2.0 * GSL_DBL_EPSILON * (fabs(g) + fabs(lng->val));
+
+ *sgn = ( GSL_IS_ODD(N) ? -1.0 : 1.0 ) * ( eps > 0.0 ? 1.0 : -1.0 );
+
+ return GSL_SUCCESS;
+ }
+}
+
+
+/* This gets bad near the negative half axis. However, this
+ * region can be avoided by use of the reflection formula, as usual.
+ * Only the first two terms of the series are kept.
+ */
+#if 0
+static
+int
+lngamma_complex_stirling(const double zr, const double zi, double * lg_r, double * arg)
+{
+ double re_zinv, im_zinv;
+ double re_zinv2, im_zinv2;
+ double re_zinv3, im_zinv3;
+ double re_zhlnz, im_zhlnz;
+ double r, lnr, theta;
+ gsl_sf_complex_log_e(zr, zi, &lnr, &theta); /* z = r e^{i theta} */
+ r = exp(lnr);
+ re_zinv = (zr/r)/r;
+ im_zinv = -(zi/r)/r;
+ re_zinv2 = re_zinv*re_zinv - im_zinv*im_zinv;
+ re_zinv2 = 2.0*re_zinv*im_zinv;
+ re_zinv3 = re_zinv2*re_zinv - im_zinv2*im_zinv;
+ re_zinv3 = re_zinv2*im_zinv + im_zinv2*re_zinv;
+ re_zhlnz = (zr - 0.5)*lnr - zi*theta;
+ im_zhlnz = zi*lnr + zr*theta;
+ *lg_r = re_zhlnz - zr + 0.5*(M_LN2+M_LNPI) + re_zinv/12.0 - re_zinv3/360.0;
+ *arg = im_zhlnz - zi + 1.0/12.0*im_zinv - im_zinv3/360.0;
+ return GSL_SUCCESS;
+}
+#endif /* 0 */
+
+
+inline
+static
+int
+lngamma_1_pade(const double eps, gsl_sf_result * result)
+{
+ /* Use (2,2) Pade for Log[Gamma[1+eps]]/eps
+ * plus a correction series.
+ */
+ const double n1 = -1.0017419282349508699871138440;
+ const double n2 = 1.7364839209922879823280541733;
+ const double d1 = 1.2433006018858751556055436011;
+ const double d2 = 5.0456274100274010152489597514;
+ const double num = (eps + n1) * (eps + n2);
+ const double den = (eps + d1) * (eps + d2);
+ const double pade = 2.0816265188662692474880210318 * num / den;
+ const double c0 = 0.004785324257581753;
+ const double c1 = -0.01192457083645441;
+ const double c2 = 0.01931961413960498;
+ const double c3 = -0.02594027398725020;
+ const double c4 = 0.03141928755021455;
+ const double eps5 = eps*eps*eps*eps*eps;
+ const double corr = eps5 * (c0 + eps*(c1 + eps*(c2 + eps*(c3 + c4*eps))));
+ result->val = eps * (pade + corr);
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+}
+
+inline
+static
+int
+lngamma_2_pade(const double eps, gsl_sf_result * result)
+{
+ /* Use (2,2) Pade for Log[Gamma[2+eps]]/eps
+ * plus a correction series.
+ */
+ const double n1 = 1.000895834786669227164446568;
+ const double n2 = 4.209376735287755081642901277;
+ const double d1 = 2.618851904903217274682578255;
+ const double d2 = 10.85766559900983515322922936;
+ const double num = (eps + n1) * (eps + n2);
+ const double den = (eps + d1) * (eps + d2);
+ const double pade = 2.85337998765781918463568869 * num/den;
+ const double c0 = 0.0001139406357036744;
+ const double c1 = -0.0001365435269792533;
+ const double c2 = 0.0001067287169183665;
+ const double c3 = -0.0000693271800931282;
+ const double c4 = 0.0000407220927867950;
+ const double eps5 = eps*eps*eps*eps*eps;
+ const double corr = eps5 * (c0 + eps*(c1 + eps*(c2 + eps*(c3 + c4*eps))));
+ result->val = eps * (pade + corr);
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+}
+
+
+/* series for gammastar(x)
+ * double-precision for x > 10.0
+ */
+static
+int
+gammastar_ser(const double x, gsl_sf_result * result)
+{
+ /* Use the Stirling series for the correction to Log(Gamma(x)),
+ * which is better behaved and easier to compute than the
+ * regular Stirling series for Gamma(x).
+ */
+ const double y = 1.0/(x*x);
+ const double c0 = 1.0/12.0;
+ const double c1 = -1.0/360.0;
+ const double c2 = 1.0/1260.0;
+ const double c3 = -1.0/1680.0;
+ const double c4 = 1.0/1188.0;
+ const double c5 = -691.0/360360.0;
+ const double c6 = 1.0/156.0;
+ const double c7 = -3617.0/122400.0;
+ const double ser = c0 + y*(c1 + y*(c2 + y*(c3 + y*(c4 + y*(c5 + y*(c6 + y*c7))))));
+ result->val = exp(ser/x);
+ result->err = 2.0 * GSL_DBL_EPSILON * result->val * GSL_MAX_DBL(1.0, ser/x);
+ return GSL_SUCCESS;
+}
+
+
+/* Chebyshev expansion for log(gamma(x)/gamma(8))
+ * 5 < x < 10
+ * -1 < t < 1
+ */
+static double gamma_5_10_data[24] = {
+ -1.5285594096661578881275075214,
+ 4.8259152300595906319768555035,
+ 0.2277712320977614992970601978,
+ -0.0138867665685617873604917300,
+ 0.0012704876495201082588139723,
+ -0.0001393841240254993658962470,
+ 0.0000169709242992322702260663,
+ -2.2108528820210580075775889168e-06,
+ 3.0196602854202309805163918716e-07,
+ -4.2705675000079118380587357358e-08,
+ 6.2026423818051402794663551945e-09,
+ -9.1993973208880910416311405656e-10,
+ 1.3875551258028145778301211638e-10,
+ -2.1218861491906788718519522978e-11,
+ 3.2821736040381439555133562600e-12,
+ -5.1260001009953791220611135264e-13,
+ 8.0713532554874636696982146610e-14,
+ -1.2798522376569209083811628061e-14,
+ 2.0417711600852502310258808643e-15,
+ -3.2745239502992355776882614137e-16,
+ 5.2759418422036579482120897453e-17,
+ -8.5354147151695233960425725513e-18,
+ 1.3858639703888078291599886143e-18,
+ -2.2574398807738626571560124396e-19
+};
+static const cheb_series gamma_5_10_cs = {
+ gamma_5_10_data,
+ 23,
+ -1, 1,
+ 11
+};
+
+
+/* gamma(x) for x >= 1/2
+ * assumes x >= 1/2
+ */
+static
+int
+gamma_xgthalf(const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x == 0.5) {
+ result->val = 1.77245385090551602729817;
+ result->err = GSL_DBL_EPSILON * result->val;
+ return GSL_SUCCESS;
+ } else if (x <= (GSL_SF_FACT_NMAX + 1.0) && x == floor(x)) {
+ int n = (int) floor (x);
+ result->val = fact_table[n - 1].f;
+ result->err = GSL_DBL_EPSILON * result->val;
+ return GSL_SUCCESS;
+ }
+ else if(fabs(x - 1.0) < 0.01) {
+ /* Use series for Gamma[1+eps] - 1/(1+eps).
+ */
+ const double eps = x - 1.0;
+ const double c1 = 0.4227843350984671394;
+ const double c2 = -0.01094400467202744461;
+ const double c3 = 0.09252092391911371098;
+ const double c4 = -0.018271913165599812664;
+ const double c5 = 0.018004931096854797895;
+ const double c6 = -0.006850885378723806846;
+ const double c7 = 0.003998239557568466030;
+ result->val = 1.0/x + eps*(c1+eps*(c2+eps*(c3+eps*(c4+eps*(c5+eps*(c6+eps*c7))))));
+ result->err = GSL_DBL_EPSILON;
+ return GSL_SUCCESS;
+ }
+ else if(fabs(x - 2.0) < 0.01) {
+ /* Use series for Gamma[1 + eps].
+ */
+ const double eps = x - 2.0;
+ const double c1 = 0.4227843350984671394;
+ const double c2 = 0.4118403304264396948;
+ const double c3 = 0.08157691924708626638;
+ const double c4 = 0.07424901075351389832;
+ const double c5 = -0.00026698206874501476832;
+ const double c6 = 0.011154045718130991049;
+ const double c7 = -0.002852645821155340816;
+ const double c8 = 0.0021039333406973880085;
+ result->val = 1.0 + eps*(c1+eps*(c2+eps*(c3+eps*(c4+eps*(c5+eps*(c6+eps*(c7+eps*c8)))))));
+ result->err = GSL_DBL_EPSILON;
+ return GSL_SUCCESS;
+ }
+ else if(x < 5.0) {
+ /* Exponentiating the logarithm is fine, as
+ * long as the exponential is not so large
+ * that it greatly amplifies the error.
+ */
+ gsl_sf_result lg;
+ lngamma_lanczos(x, &lg);
+ result->val = exp(lg.val);
+ result->err = result->val * (lg.err + 2.0 * GSL_DBL_EPSILON);
+ return GSL_SUCCESS;
+ }
+ else if(x < 10.0) {
+ /* This is a sticky area. The logarithm
+ * is too large and the gammastar series
+ * is not good.
+ */
+ const double gamma_8 = 5040.0;
+ const double t = (2.0*x - 15.0)/5.0;
+ gsl_sf_result c;
+ cheb_eval_e(&gamma_5_10_cs, t, &c);
+ result->val = exp(c.val) * gamma_8;
+ result->err = result->val * c.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * result->val;
+ return GSL_SUCCESS;
+ }
+ else if(x < GSL_SF_GAMMA_XMAX) {
+ /* We do not want to exponentiate the logarithm
+ * if x is large because of the inevitable
+ * inflation of the error. So we carefully
+ * use pow() and exp() with exact quantities.
+ */
+ double p = pow(x, 0.5*x);
+ double e = exp(-x);
+ double q = (p * e) * p;
+ double pre = M_SQRT2 * M_SQRTPI * q/sqrt(x);
+ gsl_sf_result gstar;
+ int stat_gs = gammastar_ser(x, &gstar);
+ result->val = pre * gstar.val;
+ result->err = (x + 2.5) * GSL_DBL_EPSILON * result->val;
+ return stat_gs;
+ }
+ else {
+ OVERFLOW_ERROR(result);
+ }
+}
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+
+int gsl_sf_lngamma_e(double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(fabs(x - 1.0) < 0.01) {
+ /* Note that we must amplify the errors
+ * from the Pade evaluations because of
+ * the way we must pass the argument, i.e.
+ * writing (1-x) is a loss of precision
+ * when x is near 1.
+ */
+ int stat = lngamma_1_pade(x - 1.0, result);
+ result->err *= 1.0/(GSL_DBL_EPSILON + fabs(x - 1.0));
+ return stat;
+ }
+ else if(fabs(x - 2.0) < 0.01) {
+ int stat = lngamma_2_pade(x - 2.0, result);
+ result->err *= 1.0/(GSL_DBL_EPSILON + fabs(x - 2.0));
+ return stat;
+ }
+ else if(x >= 0.5) {
+ return lngamma_lanczos(x, result);
+ }
+ else if(x == 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(fabs(x) < 0.02) {
+ double sgn;
+ return lngamma_sgn_0(x, result, &sgn);
+ }
+ else if(x > -0.5/(GSL_DBL_EPSILON*M_PI)) {
+ /* Try to extract a fractional
+ * part from x.
+ */
+ double z = 1.0 - x;
+ double s = sin(M_PI*z);
+ double as = fabs(s);
+ if(s == 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(as < M_PI*0.015) {
+ /* x is near a negative integer, -N */
+ if(x < INT_MIN + 2.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ GSL_ERROR ("error", GSL_EROUND);
+ }
+ else {
+ int N = -(int)(x - 0.5);
+ double eps = x + N;
+ double sgn;
+ return lngamma_sgn_sing(N, eps, result, &sgn);
+ }
+ }
+ else {
+ gsl_sf_result lg_z;
+ lngamma_lanczos(z, &lg_z);
+ result->val = M_LNPI - (log(as) + lg_z.val);
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val) + lg_z.err;
+ return GSL_SUCCESS;
+ }
+ }
+ else {
+ /* |x| was too large to extract any fractional part */
+ result->val = 0.0;
+ result->err = 0.0;
+ GSL_ERROR ("error", GSL_EROUND);
+ }
+}
+
+
+int gsl_sf_lngamma_sgn_e(double x, gsl_sf_result * result_lg, double * sgn)
+{
+ if(fabs(x - 1.0) < 0.01) {
+ int stat = lngamma_1_pade(x - 1.0, result_lg);
+ result_lg->err *= 1.0/(GSL_DBL_EPSILON + fabs(x - 1.0));
+ *sgn = 1.0;
+ return stat;
+ }
+ else if(fabs(x - 2.0) < 0.01) {
+ int stat = lngamma_2_pade(x - 2.0, result_lg);
+ result_lg->err *= 1.0/(GSL_DBL_EPSILON + fabs(x - 2.0));
+ *sgn = 1.0;
+ return stat;
+ }
+ else if(x >= 0.5) {
+ *sgn = 1.0;
+ return lngamma_lanczos(x, result_lg);
+ }
+ else if(x == 0.0) {
+ *sgn = 0.0;
+ DOMAIN_ERROR(result_lg);
+ }
+ else if(fabs(x) < 0.02) {
+ return lngamma_sgn_0(x, result_lg, sgn);
+ }
+ else if(x > -0.5/(GSL_DBL_EPSILON*M_PI)) {
+ /* Try to extract a fractional
+ * part from x.
+ */
+ double z = 1.0 - x;
+ double s = sin(M_PI*x);
+ double as = fabs(s);
+ if(s == 0.0) {
+ *sgn = 0.0;
+ DOMAIN_ERROR(result_lg);
+ }
+ else if(as < M_PI*0.015) {
+ /* x is near a negative integer, -N */
+ if(x < INT_MIN + 2.0) {
+ result_lg->val = 0.0;
+ result_lg->err = 0.0;
+ *sgn = 0.0;
+ GSL_ERROR ("error", GSL_EROUND);
+ }
+ else {
+ int N = -(int)(x - 0.5);
+ double eps = x + N;
+ return lngamma_sgn_sing(N, eps, result_lg, sgn);
+ }
+ }
+ else {
+ gsl_sf_result lg_z;
+ lngamma_lanczos(z, &lg_z);
+ *sgn = (s > 0.0 ? 1.0 : -1.0);
+ result_lg->val = M_LNPI - (log(as) + lg_z.val);
+ result_lg->err = 2.0 * GSL_DBL_EPSILON * fabs(result_lg->val) + lg_z.err;
+ return GSL_SUCCESS;
+ }
+ }
+ else {
+ /* |x| was too large to extract any fractional part */
+ result_lg->val = 0.0;
+ result_lg->err = 0.0;
+ *sgn = 0.0;
+ GSL_ERROR ("error", GSL_EROUND);
+ }
+}
+
+
+int
+gsl_sf_gamma_e(const double x, gsl_sf_result * result)
+{
+ if(x < 0.5) {
+ int rint_x = (int)floor(x+0.5);
+ double f_x = x - rint_x;
+ double sgn_gamma = ( GSL_IS_EVEN(rint_x) ? 1.0 : -1.0 );
+ double sin_term = sgn_gamma * sin(M_PI * f_x) / M_PI;
+
+ if(sin_term == 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x > -169.0) {
+ gsl_sf_result g;
+ gamma_xgthalf(1.0-x, &g);
+ if(fabs(sin_term) * g.val * GSL_DBL_MIN < 1.0) {
+ result->val = 1.0/(sin_term * g.val);
+ result->err = fabs(g.err/g.val) * fabs(result->val);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ UNDERFLOW_ERROR(result);
+ }
+ }
+ else {
+ /* It is hard to control it here.
+ * We can only exponentiate the
+ * logarithm and eat the loss of
+ * precision.
+ */
+ gsl_sf_result lng;
+ double sgn;
+ int stat_lng = gsl_sf_lngamma_sgn_e(x, &lng, &sgn);
+ int stat_e = gsl_sf_exp_mult_err_e(lng.val, lng.err, sgn, 0.0, result);
+ return GSL_ERROR_SELECT_2(stat_e, stat_lng);
+ }
+ }
+ else {
+ return gamma_xgthalf(x, result);
+ }
+}
+
+
+int
+gsl_sf_gammastar_e(const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x <= 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x < 0.5) {
+ gsl_sf_result lg;
+ const int stat_lg = gsl_sf_lngamma_e(x, &lg);
+ const double lx = log(x);
+ const double c = 0.5*(M_LN2+M_LNPI);
+ const double lnr_val = lg.val - (x-0.5)*lx + x - c;
+ const double lnr_err = lg.err + 2.0 * GSL_DBL_EPSILON *((x+0.5)*fabs(lx) + c);
+ const int stat_e = gsl_sf_exp_err_e(lnr_val, lnr_err, result);
+ return GSL_ERROR_SELECT_2(stat_lg, stat_e);
+ }
+ else if(x < 2.0) {
+ const double t = 4.0/3.0*(x-0.5) - 1.0;
+ return cheb_eval_e(&gstar_a_cs, t, result);
+ }
+ else if(x < 10.0) {
+ const double t = 0.25*(x-2.0) - 1.0;
+ gsl_sf_result c;
+ cheb_eval_e(&gstar_b_cs, t, &c);
+ result->val = c.val/(x*x) + 1.0 + 1.0/(12.0*x);
+ result->err = c.err/(x*x);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x < 1.0/GSL_ROOT4_DBL_EPSILON) {
+ return gammastar_ser(x, result);
+ }
+ else if(x < 1.0/GSL_DBL_EPSILON) {
+ /* Use Stirling formula for Gamma(x).
+ */
+ const double xi = 1.0/x;
+ result->val = 1.0 + xi/12.0*(1.0 + xi/24.0*(1.0 - xi*(139.0/180.0 + 571.0/8640.0*xi)));
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ result->val = 1.0;
+ result->err = 1.0/x;
+ return GSL_SUCCESS;
+ }
+}
+
+
+int
+gsl_sf_gammainv_e(const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if (x <= 0.0 && x == floor(x)) { /* negative integer */
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ } else if(x < 0.5) {
+ gsl_sf_result lng;
+ double sgn;
+ int stat_lng = gsl_sf_lngamma_sgn_e(x, &lng, &sgn);
+ if(stat_lng == GSL_EDOM) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(stat_lng != GSL_SUCCESS) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return stat_lng;
+ }
+ else {
+ return gsl_sf_exp_mult_err_e(-lng.val, lng.err, sgn, 0.0, result);
+ }
+ }
+ else {
+ gsl_sf_result g;
+ int stat_g = gamma_xgthalf(x, &g);
+ if(stat_g == GSL_EOVRFLW) {
+ UNDERFLOW_ERROR(result);
+ }
+ else {
+ result->val = 1.0/g.val;
+ result->err = fabs(g.err/g.val) * fabs(result->val);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ CHECK_UNDERFLOW(result);
+ return GSL_SUCCESS;
+ }
+ }
+}
+
+
+int
+gsl_sf_lngamma_complex_e(double zr, double zi, gsl_sf_result * lnr, gsl_sf_result * arg)
+{
+ if(zr <= 0.5) {
+ /* Transform to right half plane using reflection;
+ * in fact we do a little better by stopping at 1/2.
+ */
+ double x = 1.0-zr;
+ double y = -zi;
+ gsl_sf_result a, b;
+ gsl_sf_result lnsin_r, lnsin_i;
+
+ int stat_l = lngamma_lanczos_complex(x, y, &a, &b);
+ int stat_s = gsl_sf_complex_logsin_e(M_PI*zr, M_PI*zi, &lnsin_r, &lnsin_i);
+
+ if(stat_s == GSL_SUCCESS) {
+ int stat_r;
+ lnr->val = M_LNPI - lnsin_r.val - a.val;
+ lnr->err = lnsin_r.err + a.err + 2.0 * GSL_DBL_EPSILON * fabs(lnr->val);
+ arg->val = -lnsin_i.val - b.val;
+ arg->err = lnsin_i.err + b.err + 2.0 * GSL_DBL_EPSILON * fabs(arg->val);
+ stat_r = gsl_sf_angle_restrict_symm_e(&(arg->val));
+ return GSL_ERROR_SELECT_2(stat_r, stat_l);
+ }
+ else {
+ DOMAIN_ERROR_2(lnr,arg);
+ }
+ }
+ else {
+ /* otherwise plain vanilla Lanczos */
+ return lngamma_lanczos_complex(zr, zi, lnr, arg);
+ }
+}
+
+
+int gsl_sf_taylorcoeff_e(const int n, const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x < 0.0 || n < 0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(n == 0) {
+ result->val = 1.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(n == 1) {
+ result->val = x;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(x == 0.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else {
+ const double log2pi = M_LNPI + M_LN2;
+ const double ln_test = n*(log(x)+1.0) + 1.0 - (n+0.5)*log(n+1.0) + 0.5*log2pi;
+
+ if(ln_test < GSL_LOG_DBL_MIN+1.0) {
+ UNDERFLOW_ERROR(result);
+ }
+ else if(ln_test > GSL_LOG_DBL_MAX-1.0) {
+ OVERFLOW_ERROR(result);
+ }
+ else {
+ double product = 1.0;
+ int k;
+ for(k=1; k<=n; k++) {
+ product *= (x/k);
+ }
+ result->val = product;
+ result->err = n * GSL_DBL_EPSILON * product;
+ CHECK_UNDERFLOW(result);
+ return GSL_SUCCESS;
+ }
+ }
+}
+
+
+int gsl_sf_fact_e(const unsigned int n, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(n < 18) {
+ result->val = fact_table[n].f;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(n <= GSL_SF_FACT_NMAX){
+ result->val = fact_table[n].f;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ OVERFLOW_ERROR(result);
+ }
+}
+
+
+int gsl_sf_doublefact_e(const unsigned int n, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(n < 26) {
+ result->val = doub_fact_table[n].f;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(n <= GSL_SF_DOUBLEFACT_NMAX){
+ result->val = doub_fact_table[n].f;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ OVERFLOW_ERROR(result);
+ }
+}
+
+
+int gsl_sf_lnfact_e(const unsigned int n, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(n <= GSL_SF_FACT_NMAX){
+ result->val = log(fact_table[n].f);
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ gsl_sf_lngamma_e(n+1.0, result);
+ return GSL_SUCCESS;
+ }
+}
+
+
+int gsl_sf_lndoublefact_e(const unsigned int n, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(n <= GSL_SF_DOUBLEFACT_NMAX){
+ result->val = log(doub_fact_table[n].f);
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(GSL_IS_ODD(n)) {
+ gsl_sf_result lg;
+ gsl_sf_lngamma_e(0.5*(n+2.0), &lg);
+ result->val = 0.5*(n+1.0) * M_LN2 - 0.5*M_LNPI + lg.val;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val) + lg.err;
+ return GSL_SUCCESS;
+ }
+ else {
+ gsl_sf_result lg;
+ gsl_sf_lngamma_e(0.5*n+1.0, &lg);
+ result->val = 0.5*n*M_LN2 + lg.val;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val) + lg.err;
+ return GSL_SUCCESS;
+ }
+}
+
+
+int gsl_sf_lnchoose_e(unsigned int n, unsigned int m, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(m > n) {
+ DOMAIN_ERROR(result);
+ }
+ else if(m == n || m == 0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else {
+ gsl_sf_result nf;
+ gsl_sf_result mf;
+ gsl_sf_result nmmf;
+ if(m*2 > n) m = n-m;
+ gsl_sf_lnfact_e(n, &nf);
+ gsl_sf_lnfact_e(m, &mf);
+ gsl_sf_lnfact_e(n-m, &nmmf);
+ result->val = nf.val - mf.val - nmmf.val;
+ result->err = nf.err + mf.err + nmmf.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+}
+
+
+int gsl_sf_choose_e(unsigned int n, unsigned int m, gsl_sf_result * result)
+{
+ if(m > n) {
+ DOMAIN_ERROR(result);
+ }
+ else if(m == n || m == 0) {
+ result->val = 1.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if (n <= GSL_SF_FACT_NMAX) {
+ result->val = (fact_table[n].f / fact_table[m].f) / fact_table[n-m].f;
+ result->err = 6.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ } else {
+ if(m*2 < n) m = n-m;
+
+ if (n - m < 64) /* compute product for a manageable number of terms */
+ {
+ double prod = 1.0;
+ unsigned int k;
+
+ for(k=n; k>=m+1; k--) {
+ double tk = (double)k / (double)(k-m);
+ if(tk > GSL_DBL_MAX/prod) {
+ OVERFLOW_ERROR(result);
+ }
+ prod *= tk;
+ }
+ result->val = prod;
+ result->err = 2.0 * GSL_DBL_EPSILON * prod * fabs(n-m);
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ gsl_sf_result lc;
+ const int stat_lc = gsl_sf_lnchoose_e (n, m, &lc);
+ const int stat_e = gsl_sf_exp_err_e(lc.val, lc.err, result);
+ return GSL_ERROR_SELECT_2(stat_lc, stat_e);
+ }
+ }
+}
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_fact(const unsigned int n)
+{
+ EVAL_RESULT(gsl_sf_fact_e(n, &result));
+}
+
+double gsl_sf_lnfact(const unsigned int n)
+{
+ EVAL_RESULT(gsl_sf_lnfact_e(n, &result));
+}
+
+double gsl_sf_doublefact(const unsigned int n)
+{
+ EVAL_RESULT(gsl_sf_doublefact_e(n, &result));
+}
+
+double gsl_sf_lndoublefact(const unsigned int n)
+{
+ EVAL_RESULT(gsl_sf_lndoublefact_e(n, &result));
+}
+
+double gsl_sf_lngamma(const double x)
+{
+ EVAL_RESULT(gsl_sf_lngamma_e(x, &result));
+}
+
+double gsl_sf_gamma(const double x)
+{
+ EVAL_RESULT(gsl_sf_gamma_e(x, &result));
+}
+
+double gsl_sf_gammastar(const double x)
+{
+ EVAL_RESULT(gsl_sf_gammastar_e(x, &result));
+}
+
+double gsl_sf_gammainv(const double x)
+{
+ EVAL_RESULT(gsl_sf_gammainv_e(x, &result));
+}
+
+double gsl_sf_taylorcoeff(const int n, const double x)
+{
+ EVAL_RESULT(gsl_sf_taylorcoeff_e(n, x, &result));
+}
+
+double gsl_sf_choose(unsigned int n, unsigned int m)
+{
+ EVAL_RESULT(gsl_sf_choose_e(n, m, &result));
+}
+
+double gsl_sf_lnchoose(unsigned int n, unsigned int m)
+{
+ EVAL_RESULT(gsl_sf_lnchoose_e(n, m, &result));
+}
diff --git a/gsl-1.9/specfunc/gamma_inc.c b/gsl-1.9/specfunc/gamma_inc.c
new file mode 100644
index 0000000..5ca728a
--- /dev/null
+++ b/gsl-1.9/specfunc/gamma_inc.c
@@ -0,0 +1,671 @@
+/* specfunc/gamma_inc.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_erf.h>
+#include <gsl/gsl_sf_exp.h>
+#include <gsl/gsl_sf_log.h>
+#include <gsl/gsl_sf_gamma.h>
+#include <gsl/gsl_sf_expint.h>
+
+#include "error.h"
+
+/* The dominant part,
+ * D(a,x) := x^a e^(-x) / Gamma(a+1)
+ */
+static
+int
+gamma_inc_D(const double a, const double x, gsl_sf_result * result)
+{
+ if(a < 10.0) {
+ double lnr;
+ gsl_sf_result lg;
+ gsl_sf_lngamma_e(a+1.0, &lg);
+ lnr = a * log(x) - x - lg.val;
+ result->val = exp(lnr);
+ result->err = 2.0 * GSL_DBL_EPSILON * (fabs(lnr) + 1.0) * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ gsl_sf_result gstar;
+ gsl_sf_result ln_term;
+ double term1;
+ if (x < 0.5*a) {
+ double u = x/a;
+ double ln_u = log(u);
+ ln_term.val = ln_u - u + 1.0;
+ ln_term.err = (fabs(ln_u) + fabs(u) + 1.0) * GSL_DBL_EPSILON;
+ } else {
+ double mu = (x-a)/a;
+ gsl_sf_log_1plusx_mx_e(mu, &ln_term); /* log(1+mu) - mu */
+ };
+ gsl_sf_gammastar_e(a, &gstar);
+ term1 = exp(a*ln_term.val)/sqrt(2.0*M_PI*a);
+ result->val = term1/gstar.val;
+ result->err = 2.0 * GSL_DBL_EPSILON * (fabs(a*ln_term.val) + 1.0) * fabs(result->val);
+ result->err += gstar.err/fabs(gstar.val) * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+
+}
+
+
+/* P series representation.
+ */
+static
+int
+gamma_inc_P_series(const double a, const double x, gsl_sf_result * result)
+{
+ const int nmax = 5000;
+
+ gsl_sf_result D;
+ int stat_D = gamma_inc_D(a, x, &D);
+
+ double sum = 1.0;
+ double term = 1.0;
+ int n;
+ for(n=1; n<nmax; n++) {
+ term *= x/(a+n);
+ sum += term;
+ if(fabs(term/sum) < GSL_DBL_EPSILON) break;
+ }
+
+ result->val = D.val * sum;
+ result->err = D.err * fabs(sum);
+ result->err += (1.0 + n) * GSL_DBL_EPSILON * fabs(result->val);
+
+ if(n == nmax)
+ GSL_ERROR ("error", GSL_EMAXITER);
+ else
+ return stat_D;
+}
+
+
+/* Q large x asymptotic
+ */
+static
+int
+gamma_inc_Q_large_x(const double a, const double x, gsl_sf_result * result)
+{
+ const int nmax = 5000;
+
+ gsl_sf_result D;
+ const int stat_D = gamma_inc_D(a, x, &D);
+
+ double sum = 1.0;
+ double term = 1.0;
+ double last = 1.0;
+ int n;
+ for(n=1; n<nmax; n++) {
+ term *= (a-n)/x;
+ if(fabs(term/last) > 1.0) break;
+ if(fabs(term/sum) < GSL_DBL_EPSILON) break;
+ sum += term;
+ last = term;
+ }
+
+ result->val = D.val * (a/x) * sum;
+ result->err = D.err * fabs((a/x) * sum);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+
+ if(n == nmax)
+ GSL_ERROR ("error in large x asymptotic", GSL_EMAXITER);
+ else
+ return stat_D;
+}
+
+
+/* Uniform asymptotic for x near a, a and x large.
+ * See [Temme, p. 285]
+ */
+static
+int
+gamma_inc_Q_asymp_unif(const double a, const double x, gsl_sf_result * result)
+{
+ const double rta = sqrt(a);
+ const double eps = (x-a)/a;
+
+ gsl_sf_result ln_term;
+ const int stat_ln = gsl_sf_log_1plusx_mx_e(eps, &ln_term); /* log(1+eps) - eps */
+ const double eta = GSL_SIGN(eps) * sqrt(-2.0*ln_term.val);
+
+ gsl_sf_result erfc;
+
+ double R;
+ double c0, c1;
+
+ /* This used to say erfc(eta*M_SQRT2*rta), which is wrong.
+ * The sqrt(2) is in the denominator. Oops.
+ * Fixed: [GJ] Mon Nov 15 13:25:32 MST 2004
+ */
+ gsl_sf_erfc_e(eta*rta/M_SQRT2, &erfc);
+
+ if(fabs(eps) < GSL_ROOT5_DBL_EPSILON) {
+ c0 = -1.0/3.0 + eps*(1.0/12.0 - eps*(23.0/540.0 - eps*(353.0/12960.0 - eps*589.0/30240.0)));
+ c1 = -1.0/540.0 - eps/288.0;
+ }
+ else {
+ const double rt_term = sqrt(-2.0 * ln_term.val/(eps*eps));
+ const double lam = x/a;
+ c0 = (1.0 - 1.0/rt_term)/eps;
+ c1 = -(eta*eta*eta * (lam*lam + 10.0*lam + 1.0) - 12.0 * eps*eps*eps) / (12.0 * eta*eta*eta*eps*eps*eps);
+ }
+
+ R = exp(-0.5*a*eta*eta)/(M_SQRT2*M_SQRTPI*rta) * (c0 + c1/a);
+
+ result->val = 0.5 * erfc.val + R;
+ result->err = GSL_DBL_EPSILON * fabs(R * 0.5 * a*eta*eta) + 0.5 * erfc.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+
+ return stat_ln;
+}
+
+
+/* Continued fraction which occurs in evaluation
+ * of Q(a,x) or Gamma(a,x).
+ *
+ * 1 (1-a)/x 1/x (2-a)/x 2/x (3-a)/x
+ * F(a,x) = ---- ------- ----- -------- ----- -------- ...
+ * 1 + 1 + 1 + 1 + 1 + 1 +
+ *
+ * Hans E. Plesser, 2002-01-22 (hans dot plesser at itf dot nlh dot no).
+ *
+ * Split out from gamma_inc_Q_CF() by GJ [Tue Apr 1 13:16:41 MST 2003].
+ * See gamma_inc_Q_CF() below.
+ *
+ */
+static int
+gamma_inc_F_CF(const double a, const double x, gsl_sf_result * result)
+{
+ const int nmax = 5000;
+ const double small = gsl_pow_3 (GSL_DBL_EPSILON);
+
+ double hn = 1.0; /* convergent */
+ double Cn = 1.0 / small;
+ double Dn = 1.0;
+ int n;
+
+ /* n == 1 has a_1, b_1, b_0 independent of a,x,
+ so that has been done by hand */
+ for ( n = 2 ; n < nmax ; n++ )
+ {
+ double an;
+ double delta;
+
+ if(GSL_IS_ODD(n))
+ an = 0.5*(n-1)/x;
+ else
+ an = (0.5*n-a)/x;
+
+ Dn = 1.0 + an * Dn;
+ if ( fabs(Dn) < small )
+ Dn = small;
+ Cn = 1.0 + an/Cn;
+ if ( fabs(Cn) < small )
+ Cn = small;
+ Dn = 1.0 / Dn;
+ delta = Cn * Dn;
+ hn *= delta;
+ if(fabs(delta-1.0) < GSL_DBL_EPSILON) break;
+ }
+
+ result->val = hn;
+ result->err = 2.0*GSL_DBL_EPSILON * fabs(hn);
+ result->err += GSL_DBL_EPSILON * (2.0 + 0.5*n) * fabs(result->val);
+
+ if(n == nmax)
+ GSL_ERROR ("error in CF for F(a,x)", GSL_EMAXITER);
+ else
+ return GSL_SUCCESS;
+}
+
+
+/* Continued fraction for Q.
+ *
+ * Q(a,x) = D(a,x) a/x F(a,x)
+ *
+ * Hans E. Plesser, 2002-01-22 (hans dot plesser at itf dot nlh dot no):
+ *
+ * Since the Gautschi equivalent series method for CF evaluation may lead
+ * to singularities, I have replaced it with the modified Lentz algorithm
+ * given in
+ *
+ * I J Thompson and A R Barnett
+ * Coulomb and Bessel Functions of Complex Arguments and Order
+ * J Computational Physics 64:490-509 (1986)
+ *
+ * In consequence, gamma_inc_Q_CF_protected() is now obsolete and has been
+ * removed.
+ *
+ * Identification of terms between the above equation for F(a, x) and
+ * the first equation in the appendix of Thompson&Barnett is as follows:
+ *
+ * b_0 = 0, b_n = 1 for all n > 0
+ *
+ * a_1 = 1
+ * a_n = (n/2-a)/x for n even
+ * a_n = (n-1)/(2x) for n odd
+ *
+ */
+static
+int
+gamma_inc_Q_CF(const double a, const double x, gsl_sf_result * result)
+{
+ gsl_sf_result D;
+ gsl_sf_result F;
+ const int stat_D = gamma_inc_D(a, x, &D);
+ const int stat_F = gamma_inc_F_CF(a, x, &F);
+
+ result->val = D.val * (a/x) * F.val;
+ result->err = D.err * fabs((a/x) * F.val) + fabs(D.val * a/x * F.err);
+
+ return GSL_ERROR_SELECT_2(stat_F, stat_D);
+}
+
+
+/* Useful for small a and x. Handles the subtraction analytically.
+ */
+static
+int
+gamma_inc_Q_series(const double a, const double x, gsl_sf_result * result)
+{
+ double term1; /* 1 - x^a/Gamma(a+1) */
+ double sum; /* 1 + (a+1)/(a+2)(-x)/2! + (a+1)/(a+3)(-x)^2/3! + ... */
+ int stat_sum;
+ double term2; /* a temporary variable used at the end */
+
+ {
+ /* Evaluate series for 1 - x^a/Gamma(a+1), small a
+ */
+ const double pg21 = -2.404113806319188570799476; /* PolyGamma[2,1] */
+ const double lnx = log(x);
+ const double el = M_EULER+lnx;
+ const double c1 = -el;
+ const double c2 = M_PI*M_PI/12.0 - 0.5*el*el;
+ const double c3 = el*(M_PI*M_PI/12.0 - el*el/6.0) + pg21/6.0;
+ const double c4 = -0.04166666666666666667
+ * (-1.758243446661483480 + lnx)
+ * (-0.764428657272716373 + lnx)
+ * ( 0.723980571623507657 + lnx)
+ * ( 4.107554191916823640 + lnx);
+ const double c5 = -0.0083333333333333333
+ * (-2.06563396085715900 + lnx)
+ * (-1.28459889470864700 + lnx)
+ * (-0.27583535756454143 + lnx)
+ * ( 1.33677371336239618 + lnx)
+ * ( 5.17537282427561550 + lnx);
+ const double c6 = -0.0013888888888888889
+ * (-2.30814336454783200 + lnx)
+ * (-1.65846557706987300 + lnx)
+ * (-0.88768082560020400 + lnx)
+ * ( 0.17043847751371778 + lnx)
+ * ( 1.92135970115863890 + lnx)
+ * ( 6.22578557795474900 + lnx);
+ const double c7 = -0.00019841269841269841
+ * (-2.5078657901291800 + lnx)
+ * (-1.9478900888958200 + lnx)
+ * (-1.3194837322612730 + lnx)
+ * (-0.5281322700249279 + lnx)
+ * ( 0.5913834939078759 + lnx)
+ * ( 2.4876819633378140 + lnx)
+ * ( 7.2648160783762400 + lnx);
+ const double c8 = -0.00002480158730158730
+ * (-2.677341544966400 + lnx)
+ * (-2.182810448271700 + lnx)
+ * (-1.649350342277400 + lnx)
+ * (-1.014099048290790 + lnx)
+ * (-0.191366955370652 + lnx)
+ * ( 0.995403817918724 + lnx)
+ * ( 3.041323283529310 + lnx)
+ * ( 8.295966556941250 + lnx);
+ const double c9 = -2.75573192239859e-6
+ * (-2.8243487670469080 + lnx)
+ * (-2.3798494322701120 + lnx)
+ * (-1.9143674728689960 + lnx)
+ * (-1.3814529102920370 + lnx)
+ * (-0.7294312810261694 + lnx)
+ * ( 0.1299079285269565 + lnx)
+ * ( 1.3873333251885240 + lnx)
+ * ( 3.5857258865210760 + lnx)
+ * ( 9.3214237073814600 + lnx);
+ const double c10 = -2.75573192239859e-7
+ * (-2.9540329644556910 + lnx)
+ * (-2.5491366926991850 + lnx)
+ * (-2.1348279229279880 + lnx)
+ * (-1.6741881076349450 + lnx)
+ * (-1.1325949616098420 + lnx)
+ * (-0.4590034650618494 + lnx)
+ * ( 0.4399352987435699 + lnx)
+ * ( 1.7702236517651670 + lnx)
+ * ( 4.1231539047474080 + lnx)
+ * ( 10.342627908148680 + lnx);
+
+ term1 = a*(c1+a*(c2+a*(c3+a*(c4+a*(c5+a*(c6+a*(c7+a*(c8+a*(c9+a*c10)))))))));
+ }
+
+ {
+ /* Evaluate the sum.
+ */
+ const int nmax = 5000;
+ double t = 1.0;
+ int n;
+ sum = 1.0;
+
+ for(n=1; n<nmax; n++) {
+ t *= -x/(n+1.0);
+ sum += (a+1.0)/(a+n+1.0)*t;
+ if(fabs(t/sum) < GSL_DBL_EPSILON) break;
+ }
+
+ if(n == nmax)
+ stat_sum = GSL_EMAXITER;
+ else
+ stat_sum = GSL_SUCCESS;
+ }
+
+ term2 = (1.0 - term1) * a/(a+1.0) * x * sum;
+ result->val = term1 + term2;
+ result->err = GSL_DBL_EPSILON * (fabs(term1) + 2.0*fabs(term2));
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return stat_sum;
+}
+
+
+/* series for small a and x, but not defined for a == 0 */
+static int
+gamma_inc_series(double a, double x, gsl_sf_result * result)
+{
+ gsl_sf_result Q;
+ gsl_sf_result G;
+ const int stat_Q = gamma_inc_Q_series(a, x, &Q);
+ const int stat_G = gsl_sf_gamma_e(a, &G);
+ result->val = Q.val * G.val;
+ result->err = fabs(Q.val * G.err) + fabs(Q.err * G.val);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+
+ return GSL_ERROR_SELECT_2(stat_Q, stat_G);
+}
+
+
+static int
+gamma_inc_a_gt_0(double a, double x, gsl_sf_result * result)
+{
+ /* x > 0 and a > 0; use result for Q */
+ gsl_sf_result Q;
+ gsl_sf_result G;
+ const int stat_Q = gsl_sf_gamma_inc_Q_e(a, x, &Q);
+ const int stat_G = gsl_sf_gamma_e(a, &G);
+
+ result->val = G.val * Q.val;
+ result->err = fabs(G.val * Q.err) + fabs(G.err * Q.val);
+ result->err += 2.0*GSL_DBL_EPSILON * fabs(result->val);
+
+ return GSL_ERROR_SELECT_2(stat_G, stat_Q);
+}
+
+
+static int
+gamma_inc_CF(double a, double x, gsl_sf_result * result)
+{
+ gsl_sf_result F;
+ gsl_sf_result pre;
+ const int stat_F = gamma_inc_F_CF(a, x, &F);
+ const int stat_E = gsl_sf_exp_e((a-1.0)*log(x) - x, &pre);
+
+ result->val = F.val * pre.val;
+ result->err = fabs(F.err * pre.val) + fabs(F.val * pre.err);
+ result->err += (2.0 + fabs(a)) * GSL_DBL_EPSILON * fabs(result->val);
+
+ return GSL_ERROR_SELECT_2(stat_F, stat_E);
+}
+
+
+/* evaluate Gamma(0,x), x > 0 */
+#define GAMMA_INC_A_0(x, result) gsl_sf_expint_E1_e(x, result)
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int
+gsl_sf_gamma_inc_Q_e(const double a, const double x, gsl_sf_result * result)
+{
+ if(a < 0.0 || x < 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x == 0.0) {
+ result->val = 1.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(a == 0.0)
+ {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(x <= 0.5*a) {
+ /* If the series is quick, do that. It is
+ * robust and simple.
+ */
+ gsl_sf_result P;
+ int stat_P = gamma_inc_P_series(a, x, &P);
+ result->val = 1.0 - P.val;
+ result->err = P.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return stat_P;
+ }
+ else if(a >= 1.0e+06 && (x-a)*(x-a) < a) {
+ /* Then try the difficult asymptotic regime.
+ * This is the only way to do this region.
+ */
+ return gamma_inc_Q_asymp_unif(a, x, result);
+ }
+ else if(a < 0.2 && x < 5.0) {
+ /* Cancellations at small a must be handled
+ * analytically; x should not be too big
+ * either since the series terms grow
+ * with x and log(x).
+ */
+ return gamma_inc_Q_series(a, x, result);
+ }
+ else if(a <= x) {
+ if(x <= 1.0e+06) {
+ /* Continued fraction is excellent for x >~ a.
+ * We do not let x be too large when x > a since
+ * it is somewhat pointless to try this there;
+ * the function is rapidly decreasing for
+ * x large and x > a, and it will just
+ * underflow in that region anyway. We
+ * catch that case in the standard
+ * large-x method.
+ */
+ return gamma_inc_Q_CF(a, x, result);
+ }
+ else {
+ return gamma_inc_Q_large_x(a, x, result);
+ }
+ }
+ else {
+ if(x > a - sqrt(a)) {
+ /* Continued fraction again. The convergence
+ * is a little slower here, but that is fine.
+ * We have to trade that off against the slow
+ * convergence of the series, which is the
+ * only other option.
+ */
+ return gamma_inc_Q_CF(a, x, result);
+ }
+ else {
+ gsl_sf_result P;
+ int stat_P = gamma_inc_P_series(a, x, &P);
+ result->val = 1.0 - P.val;
+ result->err = P.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return stat_P;
+ }
+ }
+}
+
+
+int
+gsl_sf_gamma_inc_P_e(const double a, const double x, gsl_sf_result * result)
+{
+ if(a <= 0.0 || x < 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x == 0.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(x < 20.0 || x < 0.5*a) {
+ /* Do the easy series cases. Robust and quick.
+ */
+ return gamma_inc_P_series(a, x, result);
+ }
+ else if(a > 1.0e+06 && (x-a)*(x-a) < a) {
+ /* Crossover region. Note that Q and P are
+ * roughly the same order of magnitude here,
+ * so the subtraction is stable.
+ */
+ gsl_sf_result Q;
+ int stat_Q = gamma_inc_Q_asymp_unif(a, x, &Q);
+ result->val = 1.0 - Q.val;
+ result->err = Q.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return stat_Q;
+ }
+ else if(a <= x) {
+ /* Q <~ P in this area, so the
+ * subtractions are stable.
+ */
+ gsl_sf_result Q;
+ int stat_Q;
+ if(a > 0.2*x) {
+ stat_Q = gamma_inc_Q_CF(a, x, &Q);
+ }
+ else {
+ stat_Q = gamma_inc_Q_large_x(a, x, &Q);
+ }
+ result->val = 1.0 - Q.val;
+ result->err = Q.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return stat_Q;
+ }
+ else {
+ if((x-a)*(x-a) < a) {
+ /* This condition is meant to insure
+ * that Q is not very close to 1,
+ * so the subtraction is stable.
+ */
+ gsl_sf_result Q;
+ int stat_Q = gamma_inc_Q_CF(a, x, &Q);
+ result->val = 1.0 - Q.val;
+ result->err = Q.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return stat_Q;
+ }
+ else {
+ return gamma_inc_P_series(a, x, result);
+ }
+ }
+}
+
+
+int
+gsl_sf_gamma_inc_e(const double a, const double x, gsl_sf_result * result)
+{
+ if(x < 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x == 0.0) {
+ return gsl_sf_gamma_e(a, result);
+ }
+ else if(a == 0.0)
+ {
+ return GAMMA_INC_A_0(x, result);
+ }
+ else if(a > 0.0)
+ {
+ return gamma_inc_a_gt_0(a, x, result);
+ }
+ else if(x > 0.25)
+ {
+ /* continued fraction seems to fail for x too small; otherwise
+ it is ok, independent of the value of |x/a|, because of the
+ non-oscillation in the expansion, i.e. the CF is
+ un-conditionally convergent for a < 0 and x > 0
+ */
+ return gamma_inc_CF(a, x, result);
+ }
+ else if(fabs(a) < 0.5)
+ {
+ return gamma_inc_series(a, x, result);
+ }
+ else
+ {
+ /* a = fa + da; da >= 0 */
+ const double fa = floor(a);
+ const double da = a - fa;
+
+ gsl_sf_result g_da;
+ const int stat_g_da = ( da > 0.0 ? gamma_inc_a_gt_0(da, x, &g_da)
+ : GAMMA_INC_A_0(x, &g_da));
+
+ double alpha = da;
+ double gax = g_da.val;
+
+ /* Gamma(alpha-1,x) = 1/(alpha-1) (Gamma(a,x) - x^(alpha-1) e^-x) */
+ do
+ {
+ const double shift = exp(-x + (alpha-1.0)*log(x));
+ gax = (gax - shift) / (alpha - 1.0);
+ alpha -= 1.0;
+ } while(alpha > a);
+
+ result->val = gax;
+ result->err = 2.0*(1.0 + fabs(a))*GSL_DBL_EPSILON*fabs(gax);
+ return stat_g_da;
+ }
+
+}
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_gamma_inc_P(const double a, const double x)
+{
+ EVAL_RESULT(gsl_sf_gamma_inc_P_e(a, x, &result));
+}
+
+double gsl_sf_gamma_inc_Q(const double a, const double x)
+{
+ EVAL_RESULT(gsl_sf_gamma_inc_Q_e(a, x, &result));
+}
+
+double gsl_sf_gamma_inc(const double a, const double x)
+{
+ EVAL_RESULT(gsl_sf_gamma_inc_e(a, x, &result));
+}
diff --git a/gsl-1.9/specfunc/gegenbauer.c b/gsl-1.9/specfunc/gegenbauer.c
new file mode 100644
index 0000000..7d3dfb4
--- /dev/null
+++ b/gsl-1.9/specfunc/gegenbauer.c
@@ -0,0 +1,194 @@
+/* specfunc/gegenbauer.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_gegenbauer.h>
+
+#include "error.h"
+
+/* See: [Thompson, Atlas for Computing Mathematical Functions] */
+
+
+int
+gsl_sf_gegenpoly_1_e(double lambda, double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(lambda == 0.0) {
+ result->val = 2.0*x;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ result->val = 2.0*lambda*x;
+ result->err = 4.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+}
+
+int
+gsl_sf_gegenpoly_2_e(double lambda, double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(lambda == 0.0) {
+ const double txx = 2.0*x*x;
+ result->val = -1.0 + txx;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(txx);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ result->val = lambda*(-1.0 + 2.0*(1.0+lambda)*x*x);
+ result->err = GSL_DBL_EPSILON * (2.0 * fabs(result->val) + fabs(lambda));
+ return GSL_SUCCESS;
+ }
+}
+
+int
+gsl_sf_gegenpoly_3_e(double lambda, double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(lambda == 0.0) {
+ result->val = x*(-2.0 + 4.0/3.0*x*x);
+ result->err = GSL_DBL_EPSILON * (2.0 * fabs(result->val) + fabs(x));
+ return GSL_SUCCESS;
+ }
+ else {
+ double c = 4.0 + lambda*(6.0 + 2.0*lambda);
+ result->val = 2.0*lambda * x * ( -1.0 - lambda + c*x*x/3.0 );
+ result->err = GSL_DBL_EPSILON * (2.0 * fabs(result->val) + fabs(lambda * x));
+ return GSL_SUCCESS;
+ }
+}
+
+
+int
+gsl_sf_gegenpoly_n_e(int n, double lambda, double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(lambda <= -0.5 || n < 0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(n == 0) {
+ result->val = 1.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(n == 1) {
+ return gsl_sf_gegenpoly_1_e(lambda, x, result);
+ }
+ else if(n == 2) {
+ return gsl_sf_gegenpoly_2_e(lambda, x, result);
+ }
+ else if(n == 3) {
+ return gsl_sf_gegenpoly_3_e(lambda, x, result);
+ }
+ else {
+ if(lambda == 0.0 && (x >= -1.0 || x <= 1.0)) {
+ /* 2 T_n(x)/n */
+ const double z = n * acos(x);
+ result->val = 2.0 * cos(z) / n;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(z * result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ int k;
+ gsl_sf_result g2;
+ gsl_sf_result g3;
+ int stat_g2 = gsl_sf_gegenpoly_2_e(lambda, x, &g2);
+ int stat_g3 = gsl_sf_gegenpoly_3_e(lambda, x, &g3);
+ int stat_g = GSL_ERROR_SELECT_2(stat_g2, stat_g3);
+ double gkm2 = g2.val;
+ double gkm1 = g3.val;
+ double gk = 0.0;
+ for(k=4; k<=n; k++) {
+ gk = (2.0*(k+lambda-1.0)*x*gkm1 - (k+2.0*lambda-2.0)*gkm2) / k;
+ gkm2 = gkm1;
+ gkm1 = gk;
+ }
+ result->val = gk;
+ result->err = 2.0 * GSL_DBL_EPSILON * 0.5 * n * fabs(gk);
+ return stat_g;
+ }
+ }
+}
+
+
+int
+gsl_sf_gegenpoly_array(int nmax, double lambda, double x, double * result_array)
+{
+ int k;
+
+ /* CHECK_POINTER(result_array) */
+
+ if(lambda <= -0.5 || nmax < 0) {
+ GSL_ERROR("domain error", GSL_EDOM);
+ }
+
+ /* n == 0 */
+ result_array[0] = 1.0;
+ if(nmax == 0) return GSL_SUCCESS;
+
+ /* n == 1 */
+ if(lambda == 0.0)
+ result_array[1] = 2.0*x;
+ else
+ result_array[1] = 2.0*lambda*x;
+
+ /* n <= nmax */
+ for(k=2; k<=nmax; k++) {
+ double term1 = 2.0*(k+lambda-1.0) * x * result_array[k-1];
+ double term2 = (k+2.0*lambda-2.0) * result_array[k-2];
+ result_array[k] = (term1 - term2) / k;
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_gegenpoly_1(double lambda, double x)
+{
+ EVAL_RESULT(gsl_sf_gegenpoly_1_e(lambda, x, &result));
+}
+
+double gsl_sf_gegenpoly_2(double lambda, double x)
+{
+ EVAL_RESULT(gsl_sf_gegenpoly_2_e(lambda, x, &result));
+}
+
+double gsl_sf_gegenpoly_3(double lambda, double x)
+{
+ EVAL_RESULT(gsl_sf_gegenpoly_3_e(lambda, x, &result));
+}
+
+double gsl_sf_gegenpoly_n(int n, double lambda, double x)
+{
+ EVAL_RESULT(gsl_sf_gegenpoly_n_e(n, lambda, x, &result));
+}
diff --git a/gsl-1.9/specfunc/gsl_sf.h b/gsl-1.9/specfunc/gsl_sf.h
new file mode 100644
index 0000000..643cf34
--- /dev/null
+++ b/gsl-1.9/specfunc/gsl_sf.h
@@ -0,0 +1,39 @@
+/* Author: G. Jungman */
+
+#ifndef __GSL_SF_H__
+#define __GSL_SF_H__
+
+#include <gsl/gsl_sf_result.h>
+
+#include <gsl/gsl_sf_airy.h>
+#include <gsl/gsl_sf_bessel.h>
+#include <gsl/gsl_sf_clausen.h>
+#include <gsl/gsl_sf_coupling.h>
+#include <gsl/gsl_sf_coulomb.h>
+#include <gsl/gsl_sf_dawson.h>
+#include <gsl/gsl_sf_debye.h>
+#include <gsl/gsl_sf_dilog.h>
+#include <gsl/gsl_sf_elementary.h>
+#include <gsl/gsl_sf_ellint.h>
+#include <gsl/gsl_sf_elljac.h>
+#include <gsl/gsl_sf_erf.h>
+#include <gsl/gsl_sf_exp.h>
+#include <gsl/gsl_sf_expint.h>
+#include <gsl/gsl_sf_fermi_dirac.h>
+#include <gsl/gsl_sf_gamma.h>
+#include <gsl/gsl_sf_gegenbauer.h>
+#include <gsl/gsl_sf_hyperg.h>
+#include <gsl/gsl_sf_laguerre.h>
+#include <gsl/gsl_sf_lambert.h>
+#include <gsl/gsl_sf_legendre.h>
+#include <gsl/gsl_sf_log.h>
+#include <gsl/gsl_sf_mathieu.h>
+#include <gsl/gsl_sf_pow_int.h>
+#include <gsl/gsl_sf_psi.h>
+#include <gsl/gsl_sf_synchrotron.h>
+#include <gsl/gsl_sf_transport.h>
+#include <gsl/gsl_sf_trig.h>
+#include <gsl/gsl_sf_zeta.h>
+
+
+#endif /* __GSL_SF_H__ */
diff --git a/gsl-1.9/specfunc/gsl_sf_airy.h b/gsl-1.9/specfunc/gsl_sf_airy.h
new file mode 100644
index 0000000..22c8db6
--- /dev/null
+++ b/gsl-1.9/specfunc/gsl_sf_airy.h
@@ -0,0 +1,139 @@
+/* specfunc/gsl_sf_airy.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#ifndef __GSL_SF_AIRY_H__
+#define __GSL_SF_AIRY_H__
+
+#include <gsl/gsl_mode.h>
+#include <gsl/gsl_sf_result.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+
+/* Airy function Ai(x)
+ *
+ * exceptions: GSL_EUNDRFLW
+ */
+int gsl_sf_airy_Ai_e(const double x, const gsl_mode_t mode, gsl_sf_result * result);
+double gsl_sf_airy_Ai(const double x, gsl_mode_t mode);
+
+
+/* Airy function Bi(x)
+ *
+ * exceptions: GSL_EOVRFLW
+ */
+int gsl_sf_airy_Bi_e(const double x, gsl_mode_t mode, gsl_sf_result * result);
+double gsl_sf_airy_Bi(const double x, gsl_mode_t mode);
+
+
+/* scaled Ai(x):
+ * Ai(x) x < 0
+ * exp(+2/3 x^{3/2}) Ai(x) x > 0
+ *
+ * exceptions: none
+ */
+int gsl_sf_airy_Ai_scaled_e(const double x, gsl_mode_t mode, gsl_sf_result * result);
+double gsl_sf_airy_Ai_scaled(const double x, gsl_mode_t mode);
+
+
+/* scaled Bi(x):
+ * Bi(x) x < 0
+ * exp(-2/3 x^{3/2}) Bi(x) x > 0
+ *
+ * exceptions: none
+ */
+int gsl_sf_airy_Bi_scaled_e(const double x, gsl_mode_t mode, gsl_sf_result * result);
+double gsl_sf_airy_Bi_scaled(const double x, gsl_mode_t mode);
+
+
+/* derivative Ai'(x)
+ *
+ * exceptions: GSL_EUNDRFLW
+ */
+int gsl_sf_airy_Ai_deriv_e(const double x, gsl_mode_t mode, gsl_sf_result * result);
+double gsl_sf_airy_Ai_deriv(const double x, gsl_mode_t mode);
+
+
+/* derivative Bi'(x)
+ *
+ * exceptions: GSL_EOVRFLW
+ */
+int gsl_sf_airy_Bi_deriv_e(const double x, gsl_mode_t mode, gsl_sf_result * result);
+double gsl_sf_airy_Bi_deriv(const double x, gsl_mode_t mode);
+
+
+/* scaled derivative Ai'(x):
+ * Ai'(x) x < 0
+ * exp(+2/3 x^{3/2}) Ai'(x) x > 0
+ *
+ * exceptions: none
+ */
+int gsl_sf_airy_Ai_deriv_scaled_e(const double x, gsl_mode_t mode, gsl_sf_result * result);
+double gsl_sf_airy_Ai_deriv_scaled(const double x, gsl_mode_t mode);
+
+
+/* scaled derivative:
+ * Bi'(x) x < 0
+ * exp(-2/3 x^{3/2}) Bi'(x) x > 0
+ *
+ * exceptions: none
+ */
+int gsl_sf_airy_Bi_deriv_scaled_e(const double x, gsl_mode_t mode, gsl_sf_result * result);
+double gsl_sf_airy_Bi_deriv_scaled(const double x, gsl_mode_t mode);
+
+
+/* Zeros of Ai(x)
+ */
+int gsl_sf_airy_zero_Ai_e(unsigned int s, gsl_sf_result * result);
+double gsl_sf_airy_zero_Ai(unsigned int s);
+
+
+/* Zeros of Bi(x)
+ */
+int gsl_sf_airy_zero_Bi_e(unsigned int s, gsl_sf_result * result);
+double gsl_sf_airy_zero_Bi(unsigned int s);
+
+
+/* Zeros of Ai'(x)
+ */
+int gsl_sf_airy_zero_Ai_deriv_e(unsigned int s, gsl_sf_result * result);
+double gsl_sf_airy_zero_Ai_deriv(unsigned int s);
+
+
+/* Zeros of Bi'(x)
+ */
+int gsl_sf_airy_zero_Bi_deriv_e(unsigned int s, gsl_sf_result * result);
+double gsl_sf_airy_zero_Bi_deriv(unsigned int s);
+
+
+__END_DECLS
+
+#endif /* __GSL_SF_AIRY_H__ */
diff --git a/gsl-1.9/specfunc/gsl_sf_bessel.h b/gsl-1.9/specfunc/gsl_sf_bessel.h
new file mode 100644
index 0000000..31d42f2
--- /dev/null
+++ b/gsl-1.9/specfunc/gsl_sf_bessel.h
@@ -0,0 +1,548 @@
+/* specfunc/gsl_sf_bessel.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#ifndef __GSL_SF_BESSEL_H__
+#define __GSL_SF_BESSEL_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_mode.h>
+#include <gsl/gsl_precision.h>
+#include <gsl/gsl_sf_result.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+
+/* Regular Bessel Function J_0(x)
+ *
+ * exceptions: none
+ */
+int gsl_sf_bessel_J0_e(const double x, gsl_sf_result * result);
+double gsl_sf_bessel_J0(const double x);
+
+
+/* Regular Bessel Function J_1(x)
+ *
+ * exceptions: GSL_EUNDRFLW
+ */
+int gsl_sf_bessel_J1_e(const double x, gsl_sf_result * result);
+double gsl_sf_bessel_J1(const double x);
+
+
+/* Regular Bessel Function J_n(x)
+ *
+ * exceptions: GSL_EUNDRFLW
+ */
+int gsl_sf_bessel_Jn_e(int n, double x, gsl_sf_result * result);
+double gsl_sf_bessel_Jn(const int n, const double x);
+
+
+/* Regular Bessel Function J_n(x), nmin <= n <= nmax
+ *
+ * exceptions: GSL_EDOM, GSL_EUNDRFLW
+ */
+int gsl_sf_bessel_Jn_array(int nmin, int nmax, double x, double * result_array);
+
+
+/* Irregular Bessel function Y_0(x)
+ *
+ * x > 0.0
+ * exceptions: GSL_EDOM, GSL_EUNDRFLW
+ */
+int gsl_sf_bessel_Y0_e(const double x, gsl_sf_result * result);
+double gsl_sf_bessel_Y0(const double x);
+
+
+/* Irregular Bessel function Y_1(x)
+ *
+ * x > 0.0
+ * exceptions: GSL_EDOM, GSL_EOVRFLW, GSL_EUNDRFLW
+ */
+int gsl_sf_bessel_Y1_e(const double x, gsl_sf_result * result);
+double gsl_sf_bessel_Y1(const double x);
+
+
+/* Irregular Bessel function Y_n(x)
+ *
+ * x > 0.0
+ * exceptions: GSL_EDOM, GSL_EOVRFLW, GSL_EUNDRFLW
+ */
+int gsl_sf_bessel_Yn_e(int n,const double x, gsl_sf_result * result);
+double gsl_sf_bessel_Yn(const int n,const double x);
+
+
+/* Irregular Bessel function Y_n(x), nmin <= n <= nmax
+ *
+ * x > 0.0
+ * exceptions: GSL_EDOM, GSL_EOVRFLW, GSL_EUNDRFLW
+ */
+int gsl_sf_bessel_Yn_array(const int nmin, const int nmax, const double x, double * result_array);
+
+
+/* Regular modified Bessel function I_0(x)
+ *
+ * exceptions: GSL_EOVRFLW
+ */
+int gsl_sf_bessel_I0_e(const double x, gsl_sf_result * result);
+double gsl_sf_bessel_I0(const double x);
+
+
+/* Regular modified Bessel function I_1(x)
+ *
+ * exceptions: GSL_EOVRFLW, GSL_EUNDRFLW
+ */
+int gsl_sf_bessel_I1_e(const double x, gsl_sf_result * result);
+double gsl_sf_bessel_I1(const double x);
+
+
+/* Regular modified Bessel function I_n(x)
+ *
+ * exceptions: GSL_EOVRFLW, GSL_EUNDRFLW
+ */
+int gsl_sf_bessel_In_e(const int n, const double x, gsl_sf_result * result);
+double gsl_sf_bessel_In(const int n, const double x);
+
+
+/* Regular modified Bessel function I_n(x) for n=nmin,...,nmax
+ *
+ * nmin >=0, nmax >= nmin
+ * exceptions: GSL_EDOM, GSL_EOVRFLW, GSL_EUNDRFLW
+ */
+int gsl_sf_bessel_In_array(const int nmin, const int nmax, const double x, double * result_array);
+
+
+/* Scaled regular modified Bessel function
+ * exp(-|x|) I_0(x)
+ *
+ * exceptions: none
+ */
+int gsl_sf_bessel_I0_scaled_e(const double x, gsl_sf_result * result);
+double gsl_sf_bessel_I0_scaled(const double x);
+
+
+/* Scaled regular modified Bessel function
+ * exp(-|x|) I_1(x)
+ *
+ * exceptions: GSL_EUNDRFLW
+ */
+int gsl_sf_bessel_I1_scaled_e(const double x, gsl_sf_result * result);
+double gsl_sf_bessel_I1_scaled(const double x);
+
+
+/* Scaled regular modified Bessel function
+ * exp(-|x|) I_n(x)
+ *
+ * exceptions: GSL_EUNDRFLW
+ */
+int gsl_sf_bessel_In_scaled_e(int n, const double x, gsl_sf_result * result);
+double gsl_sf_bessel_In_scaled(const int n, const double x);
+
+
+/* Scaled regular modified Bessel function
+ * exp(-|x|) I_n(x) for n=nmin,...,nmax
+ *
+ * nmin >=0, nmax >= nmin
+ * exceptions: GSL_EUNDRFLW
+ */
+int gsl_sf_bessel_In_scaled_array(const int nmin, const int nmax, const double x, double * result_array);
+
+
+/* Irregular modified Bessel function K_0(x)
+ *
+ * x > 0.0
+ * exceptions: GSL_EDOM, GSL_EUNDRFLW
+ */
+int gsl_sf_bessel_K0_e(const double x, gsl_sf_result * result);
+double gsl_sf_bessel_K0(const double x);
+
+
+/* Irregular modified Bessel function K_1(x)
+ *
+ * x > 0.0
+ * exceptions: GSL_EDOM, GSL_EOVRFLW, GSL_EUNDRFLW
+ */
+int gsl_sf_bessel_K1_e(const double x, gsl_sf_result * result);
+double gsl_sf_bessel_K1(const double x);
+
+
+/* Irregular modified Bessel function K_n(x)
+ *
+ * x > 0.0
+ * exceptions: GSL_EDOM, GSL_EOVRFLW, GSL_EUNDRFLW
+ */
+int gsl_sf_bessel_Kn_e(const int n, const double x, gsl_sf_result * result);
+double gsl_sf_bessel_Kn(const int n, const double x);
+
+
+/* Irregular modified Bessel function K_n(x) for n=nmin,...,nmax
+ *
+ * x > 0.0, nmin >=0, nmax >= nmin
+ * exceptions: GSL_EDOM, GSL_EOVRFLW, GSL_EUNDRFLW
+ */
+int gsl_sf_bessel_Kn_array(const int nmin, const int nmax, const double x, double * result_array);
+
+
+/* Scaled irregular modified Bessel function
+ * exp(x) K_0(x)
+ *
+ * x > 0.0
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_bessel_K0_scaled_e(const double x, gsl_sf_result * result);
+double gsl_sf_bessel_K0_scaled(const double x);
+
+
+/* Scaled irregular modified Bessel function
+ * exp(x) K_1(x)
+ *
+ * x > 0.0
+ * exceptions: GSL_EDOM, GSL_EUNDRFLW
+ */
+int gsl_sf_bessel_K1_scaled_e(const double x, gsl_sf_result * result);
+double gsl_sf_bessel_K1_scaled(const double x);
+
+
+/* Scaled irregular modified Bessel function
+ * exp(x) K_n(x)
+ *
+ * x > 0.0
+ * exceptions: GSL_EDOM, GSL_EUNDRFLW
+ */
+int gsl_sf_bessel_Kn_scaled_e(int n, const double x, gsl_sf_result * result);
+double gsl_sf_bessel_Kn_scaled(const int n, const double x);
+
+
+/* Scaled irregular modified Bessel function exp(x) K_n(x) for n=nmin,...,nmax
+ *
+ * x > 0.0, nmin >=0, nmax >= nmin
+ * exceptions: GSL_EDOM, GSL_EUNDRFLW
+ */
+int gsl_sf_bessel_Kn_scaled_array(const int nmin, const int nmax, const double x, double * result_array);
+
+
+/* Regular spherical Bessel function j_0(x) = sin(x)/x
+ *
+ * exceptions: none
+ */
+int gsl_sf_bessel_j0_e(const double x, gsl_sf_result * result);
+double gsl_sf_bessel_j0(const double x);
+
+
+/* Regular spherical Bessel function j_1(x) = (sin(x)/x - cos(x))/x
+ *
+ * exceptions: GSL_EUNDRFLW
+ */
+int gsl_sf_bessel_j1_e(const double x, gsl_sf_result * result);
+double gsl_sf_bessel_j1(const double x);
+
+
+/* Regular spherical Bessel function j_2(x) = ((3/x^2 - 1)sin(x) - 3cos(x)/x)/x
+ *
+ * exceptions: GSL_EUNDRFLW
+ */
+int gsl_sf_bessel_j2_e(const double x, gsl_sf_result * result);
+double gsl_sf_bessel_j2(const double x);
+
+
+/* Regular spherical Bessel function j_l(x)
+ *
+ * l >= 0, x >= 0.0
+ * exceptions: GSL_EDOM, GSL_EUNDRFLW
+ */
+int gsl_sf_bessel_jl_e(const int l, const double x, gsl_sf_result * result);
+double gsl_sf_bessel_jl(const int l, const double x);
+
+
+/* Regular spherical Bessel function j_l(x) for l=0,1,...,lmax
+ *
+ * exceptions: GSL_EDOM, GSL_EUNDRFLW
+ */
+int gsl_sf_bessel_jl_array(const int lmax, const double x, double * result_array);
+
+
+/* Regular spherical Bessel function j_l(x) for l=0,1,...,lmax
+ * Uses Steed's method.
+ *
+ * exceptions: GSL_EDOM, GSL_EUNDRFLW
+ */
+int gsl_sf_bessel_jl_steed_array(const int lmax, const double x, double * jl_x_array);
+
+
+/* Irregular spherical Bessel function y_0(x)
+ *
+ * exceptions: none
+ */
+int gsl_sf_bessel_y0_e(const double x, gsl_sf_result * result);
+double gsl_sf_bessel_y0(const double x);
+
+
+/* Irregular spherical Bessel function y_1(x)
+ *
+ * exceptions: GSL_EUNDRFLW
+ */
+int gsl_sf_bessel_y1_e(const double x, gsl_sf_result * result);
+double gsl_sf_bessel_y1(const double x);
+
+
+/* Irregular spherical Bessel function y_2(x)
+ *
+ * exceptions: GSL_EUNDRFLW
+ */
+int gsl_sf_bessel_y2_e(const double x, gsl_sf_result * result);
+double gsl_sf_bessel_y2(const double x);
+
+
+/* Irregular spherical Bessel function y_l(x)
+ *
+ * exceptions: GSL_EUNDRFLW
+ */
+int gsl_sf_bessel_yl_e(int l, const double x, gsl_sf_result * result);
+double gsl_sf_bessel_yl(const int l, const double x);
+
+
+/* Irregular spherical Bessel function y_l(x) for l=0,1,...,lmax
+ *
+ * exceptions: GSL_EUNDRFLW
+ */
+int gsl_sf_bessel_yl_array(const int lmax, const double x, double * result_array);
+
+
+/* Regular scaled modified spherical Bessel function
+ *
+ * Exp[-|x|] i_0(x)
+ *
+ * exceptions: none
+ */
+int gsl_sf_bessel_i0_scaled_e(const double x, gsl_sf_result * result);
+double gsl_sf_bessel_i0_scaled(const double x);
+
+
+/* Regular scaled modified spherical Bessel function
+ *
+ * Exp[-|x|] i_1(x)
+ *
+ * exceptions: GSL_EUNDRFLW
+ */
+int gsl_sf_bessel_i1_scaled_e(const double x, gsl_sf_result * result);
+double gsl_sf_bessel_i1_scaled(const double x);
+
+
+/* Regular scaled modified spherical Bessel function
+ *
+ * Exp[-|x|] i_2(x)
+ *
+ * exceptions: GSL_EUNDRFLW
+ */
+int gsl_sf_bessel_i2_scaled_e(const double x, gsl_sf_result * result);
+double gsl_sf_bessel_i2_scaled(const double x);
+
+
+/* Regular scaled modified spherical Bessel functions
+ *
+ * Exp[-|x|] i_l(x)
+ *
+ * i_l(x) = Sqrt[Pi/(2x)] BesselI[l+1/2,x]
+ *
+ * l >= 0
+ * exceptions: GSL_EDOM, GSL_EUNDRFLW
+ */
+int gsl_sf_bessel_il_scaled_e(const int l, double x, gsl_sf_result * result);
+double gsl_sf_bessel_il_scaled(const int l, const double x);
+
+
+/* Regular scaled modified spherical Bessel functions
+ *
+ * Exp[-|x|] i_l(x)
+ * for l=0,1,...,lmax
+ *
+ * exceptions: GSL_EUNDRFLW
+ */
+int gsl_sf_bessel_il_scaled_array(const int lmax, const double x, double * result_array);
+
+
+/* Irregular scaled modified spherical Bessel function
+ * Exp[x] k_0(x)
+ *
+ * x > 0.0
+ * exceptions: GSL_EDOM, GSL_EUNDRFLW
+ */
+int gsl_sf_bessel_k0_scaled_e(const double x, gsl_sf_result * result);
+double gsl_sf_bessel_k0_scaled(const double x);
+
+
+/* Irregular modified spherical Bessel function
+ * Exp[x] k_1(x)
+ *
+ * x > 0.0
+ * exceptions: GSL_EDOM, GSL_EUNDRFLW, GSL_EOVRFLW
+ */
+int gsl_sf_bessel_k1_scaled_e(const double x, gsl_sf_result * result);
+double gsl_sf_bessel_k1_scaled(const double x);
+
+
+/* Irregular modified spherical Bessel function
+ * Exp[x] k_2(x)
+ *
+ * x > 0.0
+ * exceptions: GSL_EDOM, GSL_EUNDRFLW, GSL_EOVRFLW
+ */
+int gsl_sf_bessel_k2_scaled_e(const double x, gsl_sf_result * result);
+double gsl_sf_bessel_k2_scaled(const double x);
+
+
+/* Irregular modified spherical Bessel function
+ * Exp[x] k_l[x]
+ *
+ * k_l(x) = Sqrt[Pi/(2x)] BesselK[l+1/2,x]
+ *
+ * exceptions: GSL_EDOM, GSL_EUNDRFLW
+ */
+int gsl_sf_bessel_kl_scaled_e(int l, const double x, gsl_sf_result * result);
+double gsl_sf_bessel_kl_scaled(const int l, const double x);
+
+
+/* Irregular scaled modified spherical Bessel function
+ * Exp[x] k_l(x)
+ *
+ * for l=0,1,...,lmax
+ * exceptions: GSL_EDOM, GSL_EUNDRFLW
+ */
+int gsl_sf_bessel_kl_scaled_array(const int lmax, const double x, double * result_array);
+
+
+/* Regular cylindrical Bessel function J_nu(x)
+ *
+ * exceptions: GSL_EDOM, GSL_EUNDRFLW
+ */
+int gsl_sf_bessel_Jnu_e(const double nu, const double x, gsl_sf_result * result);
+double gsl_sf_bessel_Jnu(const double nu, const double x);
+
+
+/* Irregular cylindrical Bessel function Y_nu(x)
+ *
+ * exceptions:
+ */
+int gsl_sf_bessel_Ynu_e(double nu, double x, gsl_sf_result * result);
+double gsl_sf_bessel_Ynu(const double nu, const double x);
+
+
+/* Regular cylindrical Bessel function J_nu(x)
+ * evaluated at a series of x values. The array
+ * contains the x values. They are assumed to be
+ * strictly ordered and positive. The array is
+ * over-written with the values of J_nu(x_i).
+ *
+ * exceptions: GSL_EDOM, GSL_EINVAL
+ */
+int gsl_sf_bessel_sequence_Jnu_e(double nu, gsl_mode_t mode, size_t size, double * v);
+
+
+/* Scaled modified cylindrical Bessel functions
+ *
+ * Exp[-|x|] BesselI[nu, x]
+ * x >= 0, nu >= 0
+ *
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_bessel_Inu_scaled_e(double nu, double x, gsl_sf_result * result);
+double gsl_sf_bessel_Inu_scaled(double nu, double x);
+
+
+/* Modified cylindrical Bessel functions
+ *
+ * BesselI[nu, x]
+ * x >= 0, nu >= 0
+ *
+ * exceptions: GSL_EDOM, GSL_EOVRFLW
+ */
+int gsl_sf_bessel_Inu_e(double nu, double x, gsl_sf_result * result);
+double gsl_sf_bessel_Inu(double nu, double x);
+
+
+/* Scaled modified cylindrical Bessel functions
+ *
+ * Exp[+|x|] BesselK[nu, x]
+ * x > 0, nu >= 0
+ *
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_bessel_Knu_scaled_e(const double nu, const double x, gsl_sf_result * result);
+double gsl_sf_bessel_Knu_scaled(const double nu, const double x);
+
+
+/* Modified cylindrical Bessel functions
+ *
+ * BesselK[nu, x]
+ * x > 0, nu >= 0
+ *
+ * exceptions: GSL_EDOM, GSL_EUNDRFLW
+ */
+int gsl_sf_bessel_Knu_e(const double nu, const double x, gsl_sf_result * result);
+double gsl_sf_bessel_Knu(const double nu, const double x);
+
+
+/* Logarithm of modified cylindrical Bessel functions.
+ *
+ * Log[BesselK[nu, x]]
+ * x > 0, nu >= 0
+ *
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_bessel_lnKnu_e(const double nu, const double x, gsl_sf_result * result);
+double gsl_sf_bessel_lnKnu(const double nu, const double x);
+
+
+/* s'th positive zero of the Bessel function J_0(x).
+ *
+ * exceptions:
+ */
+int gsl_sf_bessel_zero_J0_e(unsigned int s, gsl_sf_result * result);
+double gsl_sf_bessel_zero_J0(unsigned int s);
+
+
+/* s'th positive zero of the Bessel function J_1(x).
+ *
+ * exceptions:
+ */
+int gsl_sf_bessel_zero_J1_e(unsigned int s, gsl_sf_result * result);
+double gsl_sf_bessel_zero_J1(unsigned int s);
+
+
+/* s'th positive zero of the Bessel function J_nu(x).
+ *
+ * exceptions:
+ */
+int gsl_sf_bessel_zero_Jnu_e(double nu, unsigned int s, gsl_sf_result * result);
+double gsl_sf_bessel_zero_Jnu(double nu, unsigned int s);
+
+
+__END_DECLS
+
+#endif /* __GSL_SF_BESSEL_H__ */
diff --git a/gsl-1.9/specfunc/gsl_sf_clausen.h b/gsl-1.9/specfunc/gsl_sf_clausen.h
new file mode 100644
index 0000000..fc18962
--- /dev/null
+++ b/gsl-1.9/specfunc/gsl_sf_clausen.h
@@ -0,0 +1,52 @@
+/* specfunc/gsl_sf_clausen.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#ifndef __GSL_SF_CLAUSEN_H__
+#define __GSL_SF_CLAUSEN_H__
+
+#include <gsl/gsl_sf_result.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+
+/* Calculate the Clausen integral:
+ * Cl_2(x) := Integrate[-Log[2 Sin[t/2]], {t,0,x}]
+ *
+ * Relation to dilogarithm:
+ * Cl_2(theta) = Im[ Li_2(e^(i theta)) ]
+ */
+int gsl_sf_clausen_e(double x, gsl_sf_result * result);
+double gsl_sf_clausen(const double x);
+
+
+__END_DECLS
+
+#endif /* __GSL_SF_CLAUSEN_H__ */
diff --git a/gsl-1.9/specfunc/gsl_sf_coulomb.h b/gsl-1.9/specfunc/gsl_sf_coulomb.h
new file mode 100644
index 0000000..588bc91
--- /dev/null
+++ b/gsl-1.9/specfunc/gsl_sf_coulomb.h
@@ -0,0 +1,128 @@
+/* specfunc/gsl_sf_coulomb.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#ifndef __GSL_SF_COULOMB_H__
+#define __GSL_SF_COULOMB_H__
+
+#include <gsl/gsl_mode.h>
+#include <gsl/gsl_sf_result.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+
+/* Normalized hydrogenic bound states, radial dependence. */
+
+/* R_1 := 2Z sqrt(Z) exp(-Z r)
+ */
+int gsl_sf_hydrogenicR_1_e(const double Z, const double r, gsl_sf_result * result);
+double gsl_sf_hydrogenicR_1(const double Z, const double r);
+
+/* R_n := norm exp(-Z r/n) (2Z/n)^l Laguerre[n-l-1, 2l+1, 2Z/n r]
+ *
+ * normalization such that psi(n,l,r) = R_n Y_{lm}
+ */
+int gsl_sf_hydrogenicR_e(const int n, const int l, const double Z, const double r, gsl_sf_result * result);
+double gsl_sf_hydrogenicR(const int n, const int l, const double Z, const double r);
+
+
+/* Coulomb wave functions F_{lam_F}(eta,x), G_{lam_G}(eta,x)
+ * and their derivatives; lam_G := lam_F - k_lam_G
+ *
+ * lam_F, lam_G > -0.5
+ * x > 0.0
+ *
+ * Conventions of Abramowitz+Stegun.
+ *
+ * Because there can be a large dynamic range of values,
+ * overflows are handled gracefully. If an overflow occurs,
+ * GSL_EOVRFLW is signalled and exponent(s) are returned
+ * through exp_F, exp_G. These are such that
+ *
+ * F_L(eta,x) = fc[k_L] * exp(exp_F)
+ * G_L(eta,x) = gc[k_L] * exp(exp_G)
+ * F_L'(eta,x) = fcp[k_L] * exp(exp_F)
+ * G_L'(eta,x) = gcp[k_L] * exp(exp_G)
+ */
+int
+gsl_sf_coulomb_wave_FG_e(const double eta, const double x,
+ const double lam_F,
+ const int k_lam_G,
+ gsl_sf_result * F, gsl_sf_result * Fp,
+ gsl_sf_result * G, gsl_sf_result * Gp,
+ double * exp_F, double * exp_G);
+
+
+/* F_L(eta,x) as array */
+int gsl_sf_coulomb_wave_F_array(
+ double lam_min, int kmax,
+ double eta, double x,
+ double * fc_array,
+ double * F_exponent
+ );
+
+/* F_L(eta,x), G_L(eta,x) as arrays */
+int gsl_sf_coulomb_wave_FG_array(double lam_min, int kmax,
+ double eta, double x,
+ double * fc_array, double * gc_array,
+ double * F_exponent,
+ double * G_exponent
+ );
+
+/* F_L(eta,x), G_L(eta,x), F'_L(eta,x), G'_L(eta,x) as arrays */
+int gsl_sf_coulomb_wave_FGp_array(double lam_min, int kmax,
+ double eta, double x,
+ double * fc_array, double * fcp_array,
+ double * gc_array, double * gcp_array,
+ double * F_exponent,
+ double * G_exponent
+ );
+
+/* Coulomb wave function divided by the argument,
+ * F(eta, x)/x. This is the function which reduces to
+ * spherical Bessel functions in the limit eta->0.
+ */
+int gsl_sf_coulomb_wave_sphF_array(double lam_min, int kmax,
+ double eta, double x,
+ double * fc_array,
+ double * F_exponent
+ );
+
+
+/* Coulomb wave function normalization constant.
+ * [Abramowitz+Stegun 14.1.8, 14.1.9]
+ */
+int gsl_sf_coulomb_CL_e(double L, double eta, gsl_sf_result * result);
+int gsl_sf_coulomb_CL_array(double Lmin, int kmax, double eta, double * cl);
+
+
+__END_DECLS
+
+#endif /* __GSL_SF_COULOMB_H__ */
diff --git a/gsl-1.9/specfunc/gsl_sf_coupling.h b/gsl-1.9/specfunc/gsl_sf_coupling.h
new file mode 100644
index 0000000..cb2e0f6
--- /dev/null
+++ b/gsl-1.9/specfunc/gsl_sf_coupling.h
@@ -0,0 +1,125 @@
+/* specfunc/gsl_sf_coupling.h
+ *
+ * Copyright (C) 1996,1997,1998,1999,2000,2001,2002 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#ifndef __GSL_SF_COUPLING_H__
+#define __GSL_SF_COUPLING_H__
+
+#include <gsl/gsl_sf_result.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+
+/* 3j Symbols: / ja jb jc \
+ * \ ma mb mc /
+ *
+ * exceptions: GSL_EDOM, GSL_EOVRFLW
+ */
+int gsl_sf_coupling_3j_e(int two_ja, int two_jb, int two_jc,
+ int two_ma, int two_mb, int two_mc,
+ gsl_sf_result * result
+ );
+double gsl_sf_coupling_3j(int two_ja, int two_jb, int two_jc,
+ int two_ma, int two_mb, int two_mc
+ );
+
+
+/* 6j Symbols: / ja jb jc \
+ * \ jd je jf /
+ *
+ * exceptions: GSL_EDOM, GSL_EOVRFLW
+ */
+int gsl_sf_coupling_6j_e(int two_ja, int two_jb, int two_jc,
+ int two_jd, int two_je, int two_jf,
+ gsl_sf_result * result
+ );
+double gsl_sf_coupling_6j(int two_ja, int two_jb, int two_jc,
+ int two_jd, int two_je, int two_jf
+ );
+
+/* Racah W coefficients:
+ *
+ * W(a b c d; e f) = (-1)^{a+b+c+d} / a b e \
+ * \ d c f /
+ *
+ * exceptions: GSL_EDOM, GSL_EOVRFLW
+ */
+int gsl_sf_coupling_RacahW_e(int two_ja, int two_jb, int two_jc,
+ int two_jd, int two_je, int two_jf,
+ gsl_sf_result * result
+ );
+double gsl_sf_coupling_RacahW(int two_ja, int two_jb, int two_jc,
+ int two_jd, int two_je, int two_jf
+ );
+
+
+/* 9j Symbols: / ja jb jc \
+ * | jd je jf |
+ * \ jg jh ji /
+ *
+ * exceptions: GSL_EDOM, GSL_EOVRFLW
+ */
+int gsl_sf_coupling_9j_e(int two_ja, int two_jb, int two_jc,
+ int two_jd, int two_je, int two_jf,
+ int two_jg, int two_jh, int two_ji,
+ gsl_sf_result * result
+ );
+double gsl_sf_coupling_9j(int two_ja, int two_jb, int two_jc,
+ int two_jd, int two_je, int two_jf,
+ int two_jg, int two_jh, int two_ji
+ );
+
+
+/* INCORRECT version of 6j Symbols:
+ * This function actually calculates
+ * / ja jb je \
+ * \ jd jc jf /
+ * It represents the original implementation,
+ * which had the above permutation of the
+ * arguments. This was wrong and confusing,
+ * and I had to fix it. Sorry for the trouble.
+ * [GJ] Tue Nov 26 12:53:39 MST 2002
+ *
+ * exceptions: GSL_EDOM, GSL_EOVRFLW
+ */
+#ifndef GSL_DISABLE_DEPRECATED
+int gsl_sf_coupling_6j_INCORRECT_e(int two_ja, int two_jb, int two_jc,
+ int two_jd, int two_je, int two_jf,
+ gsl_sf_result * result
+ );
+double gsl_sf_coupling_6j_INCORRECT(int two_ja, int two_jb, int two_jc,
+ int two_jd, int two_je, int two_jf
+ );
+#endif /* !GSL_DISABLE_DEPRECATED */
+
+
+__END_DECLS
+
+#endif /* __GSL_SF_COUPLING_H__ */
diff --git a/gsl-1.9/specfunc/gsl_sf_dawson.h b/gsl-1.9/specfunc/gsl_sf_dawson.h
new file mode 100644
index 0000000..4169c11
--- /dev/null
+++ b/gsl-1.9/specfunc/gsl_sf_dawson.h
@@ -0,0 +1,52 @@
+/* specfunc/gsl_sf_dawson.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#ifndef __GSL_SF_DAWSON_H__
+#define __GSL_SF_DAWSON_H__
+
+#include <gsl/gsl_sf_result.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+
+/* Dawson's integral:
+ *
+ * Exp[-x^2] Integral[ Exp[t^2], {t,0,x}]
+ *
+ * exceptions: GSL_EUNDRFLW;
+ */
+int gsl_sf_dawson_e(double x, gsl_sf_result * result);
+double gsl_sf_dawson(double x);
+
+
+__END_DECLS
+
+#endif /* __GSL_SF_DAWSON_H__ */
diff --git a/gsl-1.9/specfunc/gsl_sf_debye.h b/gsl-1.9/specfunc/gsl_sf_debye.h
new file mode 100644
index 0000000..602d350
--- /dev/null
+++ b/gsl-1.9/specfunc/gsl_sf_debye.h
@@ -0,0 +1,91 @@
+/* specfunc/gsl_sf_debye.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+/* augmented by D_5(x) and D_6(x) by Richard J. Mathar, 2005-11-08 */
+
+#ifndef __GSL_SF_DEBYE_H__
+#define __GSL_SF_DEBYE_H__
+
+#include <gsl/gsl_sf_result.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+
+/* D_n(x) := n/x^n Integrate[t^n/(e^t - 1), {t,0,x}] */
+
+/* D_1(x)
+ *
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_debye_1_e(const double x, gsl_sf_result * result);
+double gsl_sf_debye_1(const double x);
+
+
+/* D_2(x)
+ *
+ * exceptions: GSL_EDOM, GSL_EUNDRFLW
+ */
+int gsl_sf_debye_2_e(const double x, gsl_sf_result * result);
+double gsl_sf_debye_2(const double x);
+
+
+/* D_3(x)
+ *
+ * exceptions: GSL_EDOM, GSL_EUNDRFLW
+ */
+int gsl_sf_debye_3_e(const double x, gsl_sf_result * result);
+double gsl_sf_debye_3(const double x);
+
+
+/* D_4(x)
+ *
+ * exceptions: GSL_EDOM, GSL_EUNDRFLW
+ */
+int gsl_sf_debye_4_e(const double x, gsl_sf_result * result);
+double gsl_sf_debye_4(const double x);
+
+/* D_5(x)
+ *
+ * exceptions: GSL_EDOM, GSL_EUNDRFLW
+ */
+int gsl_sf_debye_5_e(const double x, gsl_sf_result * result);
+double gsl_sf_debye_5(const double x);
+
+/* D_6(x)
+ *
+ * exceptions: GSL_EDOM, GSL_EUNDRFLW
+ */
+int gsl_sf_debye_6_e(const double x, gsl_sf_result * result);
+double gsl_sf_debye_6(const double x);
+
+
+__END_DECLS
+
+#endif /* __GSL_SF_DEBYE_H__ */
diff --git a/gsl-1.9/specfunc/gsl_sf_dilog.h b/gsl-1.9/specfunc/gsl_sf_dilog.h
new file mode 100644
index 0000000..4d4d8d7
--- /dev/null
+++ b/gsl-1.9/specfunc/gsl_sf_dilog.h
@@ -0,0 +1,130 @@
+/* specfunc/gsl_sf_dilog.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#ifndef __GSL_SF_DILOG_H__
+#define __GSL_SF_DILOG_H__
+
+#include <gsl/gsl_sf_result.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+
+/* Real part of DiLogarithm(x), for real argument.
+ * In Lewin's notation, this is Li_2(x).
+ *
+ * Li_2(x) = - Re[ Integrate[ Log[1-s] / s, {s, 0, x}] ]
+ *
+ * The function in the complex plane has a branch point
+ * at z = 1; we place the cut in the conventional way,
+ * on [1, +infty). This means that the value for real x > 1
+ * is a matter of definition; however, this choice does not
+ * affect the real part and so is not relevant to the
+ * interpretation of this implemented function.
+ */
+int gsl_sf_dilog_e(const double x, gsl_sf_result * result);
+double gsl_sf_dilog(const double x);
+
+
+/* DiLogarithm(z), for complex argument z = x + i y.
+ * Computes the principal branch.
+ *
+ * Recall that the branch cut is on the real axis with x > 1.
+ * The imaginary part of the computed value on the cut is given
+ * by -Pi*log(x), which is the limiting value taken approaching
+ * from y < 0. This is a conventional choice, though there is no
+ * true standardized choice.
+ *
+ * Note that there is no canonical way to lift the defining
+ * contour to the full Riemann surface because of the appearance
+ * of a "hidden branch point" at z = 0 on non-principal sheets.
+ * Experts will know the simple algebraic prescription for
+ * obtaining the sheet they want; non-experts will not want
+ * to know anything about it. This is why GSL chooses to compute
+ * only on the principal branch.
+ */
+int
+gsl_sf_complex_dilog_xy_e(
+ const double x,
+ const double y,
+ gsl_sf_result * result_re,
+ gsl_sf_result * result_im
+ );
+
+
+
+/* DiLogarithm(z), for complex argument z = r Exp[i theta].
+ * Computes the principal branch, thereby assuming an
+ * implicit reduction of theta to the range (-2 pi, 2 pi).
+ *
+ * If theta is identically zero, the imaginary part is computed
+ * as if approaching from y > 0. For other values of theta no
+ * special consideration is given, since it is assumed that
+ * no other machine representations of multiples of pi will
+ * produce y = 0 precisely. This assumption depends on some
+ * subtle properties of the machine arithmetic, such as
+ * correct rounding and monotonicity of the underlying
+ * implementation of sin() and cos().
+ *
+ * This function is ok, but the interface is confusing since
+ * it makes it appear that the branch structure is resolved.
+ * Furthermore the handling of values close to the branch
+ * cut is subtle. Perhap this interface should be deprecated.
+ */
+int
+gsl_sf_complex_dilog_e(
+ const double r,
+ const double theta,
+ gsl_sf_result * result_re,
+ gsl_sf_result * result_im
+ );
+
+
+
+/* Spence integral; spence(s) := Li_2(1-s)
+ *
+ * This function has a branch point at 0; we place the
+ * cut on (-infty,0). Because of our choice for the value
+ * of Li_2(z) on the cut, spence(s) is continuous as
+ * s approaches the cut from above. In other words,
+ * we define spence(x) = spence(x + i 0+).
+ */
+int
+gsl_sf_complex_spence_xy_e(
+ const double x,
+ const double y,
+ gsl_sf_result * real_sp,
+ gsl_sf_result * imag_sp
+ );
+
+
+__END_DECLS
+
+#endif /* __GSL_SF_DILOG_H__ */
diff --git a/gsl-1.9/specfunc/gsl_sf_elementary.h b/gsl-1.9/specfunc/gsl_sf_elementary.h
new file mode 100644
index 0000000..edc756b
--- /dev/null
+++ b/gsl-1.9/specfunc/gsl_sf_elementary.h
@@ -0,0 +1,57 @@
+/* specfunc/gsl_sf_elementary.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+/* Miscellaneous elementary functions and operations.
+ */
+#ifndef __GSL_SF_ELEMENTARY_H__
+#define __GSL_SF_ELEMENTARY_H__
+
+#include <gsl/gsl_sf_result.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+
+/* Multiplication.
+ *
+ * exceptions: GSL_EOVRFLW, GSL_EUNDRFLW
+ */
+int gsl_sf_multiply_e(const double x, const double y, gsl_sf_result * result);
+double gsl_sf_multiply(const double x, const double y);
+
+
+/* Multiplication of quantities with associated errors.
+ */
+int gsl_sf_multiply_err_e(const double x, const double dx, const double y, const double dy, gsl_sf_result * result);
+
+
+__END_DECLS
+
+#endif /* __GSL_SF_ELEMENTARY_H__ */
diff --git a/gsl-1.9/specfunc/gsl_sf_ellint.h b/gsl-1.9/specfunc/gsl_sf_ellint.h
new file mode 100644
index 0000000..ec75b9b
--- /dev/null
+++ b/gsl-1.9/specfunc/gsl_sf_ellint.h
@@ -0,0 +1,112 @@
+/* specfunc/gsl_sf_ellint.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#ifndef __GSL_SF_ELLINT_H__
+#define __GSL_SF_ELLINT_H__
+
+#include <gsl/gsl_mode.h>
+#include <gsl/gsl_sf_result.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+
+/* Legendre form of complete elliptic integrals
+ *
+ * K(k) = Integral[1/Sqrt[1 - k^2 Sin[t]^2], {t, 0, Pi/2}]
+ * E(k) = Integral[ Sqrt[1 - k^2 Sin[t]^2], {t, 0, Pi/2}]
+ *
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_ellint_Kcomp_e(double k, gsl_mode_t mode, gsl_sf_result * result);
+double gsl_sf_ellint_Kcomp(double k, gsl_mode_t mode);
+
+int gsl_sf_ellint_Ecomp_e(double k, gsl_mode_t mode, gsl_sf_result * result);
+double gsl_sf_ellint_Ecomp(double k, gsl_mode_t mode);
+
+int gsl_sf_ellint_Pcomp_e(double k, double n, gsl_mode_t mode, gsl_sf_result * result);
+double gsl_sf_ellint_Pcomp(double k, double n, gsl_mode_t mode);
+
+int gsl_sf_ellint_Dcomp_e(double k, gsl_mode_t mode, gsl_sf_result * result);
+double gsl_sf_ellint_Dcomp(double k, gsl_mode_t mode);
+
+
+/* Legendre form of incomplete elliptic integrals
+ *
+ * F(phi,k) = Integral[1/Sqrt[1 - k^2 Sin[t]^2], {t, 0, phi}]
+ * E(phi,k) = Integral[ Sqrt[1 - k^2 Sin[t]^2], {t, 0, phi}]
+ * P(phi,k,n) = Integral[(1 + n Sin[t]^2)^(-1)/Sqrt[1 - k^2 Sin[t]^2], {t, 0, phi}]
+ * D(phi,k,n) = R_D(1-Sin[phi]^2, 1-k^2 Sin[phi]^2, 1.0)
+ *
+ * F: [Carlson, Numerische Mathematik 33 (1979) 1, (4.1)]
+ * E: [Carlson, ", (4.2)]
+ * P: [Carlson, ", (4.3)]
+ * D: [Carlson, ", (4.4)]
+ *
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_ellint_F_e(double phi, double k, gsl_mode_t mode, gsl_sf_result * result);
+double gsl_sf_ellint_F(double phi, double k, gsl_mode_t mode);
+
+int gsl_sf_ellint_E_e(double phi, double k, gsl_mode_t mode, gsl_sf_result * result);
+double gsl_sf_ellint_E(double phi, double k, gsl_mode_t mode);
+
+int gsl_sf_ellint_P_e(double phi, double k, double n, gsl_mode_t mode, gsl_sf_result * result);
+double gsl_sf_ellint_P(double phi, double k, double n, gsl_mode_t mode);
+
+int gsl_sf_ellint_D_e(double phi, double k, double n, gsl_mode_t mode, gsl_sf_result * result);
+double gsl_sf_ellint_D(double phi, double k, double n, gsl_mode_t mode);
+
+
+/* Carlson's symmetric basis of functions
+ *
+ * RC(x,y) = 1/2 Integral[(t+x)^(-1/2) (t+y)^(-1)], {t,0,Inf}]
+ * RD(x,y,z) = 3/2 Integral[(t+x)^(-1/2) (t+y)^(-1/2) (t+z)^(-3/2), {t,0,Inf}]
+ * RF(x,y,z) = 1/2 Integral[(t+x)^(-1/2) (t+y)^(-1/2) (t+z)^(-1/2), {t,0,Inf}]
+ * RJ(x,y,z,p) = 3/2 Integral[(t+x)^(-1/2) (t+y)^(-1/2) (t+z)^(-1/2) (t+p)^(-1), {t,0,Inf}]
+ *
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_ellint_RC_e(double x, double y, gsl_mode_t mode, gsl_sf_result * result);
+double gsl_sf_ellint_RC(double x, double y, gsl_mode_t mode);
+
+int gsl_sf_ellint_RD_e(double x, double y, double z, gsl_mode_t mode, gsl_sf_result * result);
+double gsl_sf_ellint_RD(double x, double y, double z, gsl_mode_t mode);
+
+int gsl_sf_ellint_RF_e(double x, double y, double z, gsl_mode_t mode, gsl_sf_result * result);
+double gsl_sf_ellint_RF(double x, double y, double z, gsl_mode_t mode);
+
+int gsl_sf_ellint_RJ_e(double x, double y, double z, double p, gsl_mode_t mode, gsl_sf_result * result);
+double gsl_sf_ellint_RJ(double x, double y, double z, double p, gsl_mode_t mode);
+
+
+__END_DECLS
+
+#endif /* __GSL_SF_ELLINT_H__ */
diff --git a/gsl-1.9/specfunc/gsl_sf_elljac.h b/gsl-1.9/specfunc/gsl_sf_elljac.h
new file mode 100644
index 0000000..6e74a59
--- /dev/null
+++ b/gsl-1.9/specfunc/gsl_sf_elljac.h
@@ -0,0 +1,48 @@
+/* specfunc/gsl_sf_elljac.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#ifndef __GSL_SF_ELLJAC_H__
+#define __GSL_SF_ELLJAC_H__
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+
+/* Jacobian elliptic functions sn, dn, cn,
+ * by descending Landen transformations
+ *
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_elljac_e(double u, double m, double * sn, double * cn, double * dn);
+
+
+__END_DECLS
+
+#endif /* __GSL_SF_ELLJAC_H__ */
diff --git a/gsl-1.9/specfunc/gsl_sf_erf.h b/gsl-1.9/specfunc/gsl_sf_erf.h
new file mode 100644
index 0000000..677a72f
--- /dev/null
+++ b/gsl-1.9/specfunc/gsl_sf_erf.h
@@ -0,0 +1,91 @@
+/* specfunc/gsl_sf_erf.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#ifndef __GSL_SF_ERF_H__
+#define __GSL_SF_ERF_H__
+
+#include <gsl/gsl_sf_result.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+
+/* Complementary Error Function
+ * erfc(x) := 2/Sqrt[Pi] Integrate[Exp[-t^2], {t,x,Infinity}]
+ *
+ * exceptions: none
+ */
+int gsl_sf_erfc_e(double x, gsl_sf_result * result);
+double gsl_sf_erfc(double x);
+
+
+/* Log Complementary Error Function
+ *
+ * exceptions: none
+ */
+int gsl_sf_log_erfc_e(double x, gsl_sf_result * result);
+double gsl_sf_log_erfc(double x);
+
+
+/* Error Function
+ * erf(x) := 2/Sqrt[Pi] Integrate[Exp[-t^2], {t,0,x}]
+ *
+ * exceptions: none
+ */
+int gsl_sf_erf_e(double x, gsl_sf_result * result);
+double gsl_sf_erf(double x);
+
+
+/* Probability functions:
+ * Z(x) : Abramowitz+Stegun 26.2.1
+ * Q(x) : Abramowitz+Stegun 26.2.3
+ *
+ * exceptions: none
+ */
+int gsl_sf_erf_Z_e(double x, gsl_sf_result * result);
+int gsl_sf_erf_Q_e(double x, gsl_sf_result * result);
+double gsl_sf_erf_Z(double x);
+double gsl_sf_erf_Q(double x);
+
+
+/* Hazard function, also known as the inverse Mill's ratio.
+ *
+ * H(x) := Z(x)/Q(x)
+ * = Sqrt[2/Pi] Exp[-x^2 / 2] / Erfc[x/Sqrt[2]]
+ *
+ * exceptions: GSL_EUNDRFLW
+ */
+int gsl_sf_hazard_e(double x, gsl_sf_result * result);
+double gsl_sf_hazard(double x);
+
+
+__END_DECLS
+
+#endif /* __GSL_SF_ERF_H__ */
diff --git a/gsl-1.9/specfunc/gsl_sf_exp.h b/gsl-1.9/specfunc/gsl_sf_exp.h
new file mode 100644
index 0000000..4d7e67a
--- /dev/null
+++ b/gsl-1.9/specfunc/gsl_sf_exp.h
@@ -0,0 +1,132 @@
+/* specfunc/gsl_sf_exp.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#ifndef __GSL_SF_EXP_H__
+#define __GSL_SF_EXP_H__
+
+#include <gsl/gsl_sf_result.h>
+#include <gsl/gsl_precision.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+/* Provide an exp() function with GSL semantics,
+ * i.e. with proper error checking, etc.
+ *
+ * exceptions: GSL_EOVRFLW, GSL_EUNDRFLW
+ */
+int gsl_sf_exp_e(const double x, gsl_sf_result * result);
+double gsl_sf_exp(const double x);
+
+
+/* Exp(x)
+ *
+ * exceptions: GSL_EOVRFLW, GSL_EUNDRFLW
+ */
+int gsl_sf_exp_e10_e(const double x, gsl_sf_result_e10 * result);
+
+
+/* Exponentiate and multiply by a given factor: y * Exp(x)
+ *
+ * exceptions: GSL_EOVRFLW, GSL_EUNDRFLW
+ */
+int gsl_sf_exp_mult_e(const double x, const double y, gsl_sf_result * result);
+double gsl_sf_exp_mult(const double x, const double y);
+
+
+/* Exponentiate and multiply by a given factor: y * Exp(x)
+ *
+ * exceptions: GSL_EOVRFLW, GSL_EUNDRFLW
+ */
+int gsl_sf_exp_mult_e10_e(const double x, const double y, gsl_sf_result_e10 * result);
+
+
+/* exp(x)-1
+ *
+ * exceptions: GSL_EOVRFLW
+ */
+int gsl_sf_expm1_e(const double x, gsl_sf_result * result);
+double gsl_sf_expm1(const double x);
+
+
+/* (exp(x)-1)/x = 1 + x/2 + x^2/(2*3) + x^3/(2*3*4) + ...
+ *
+ * exceptions: GSL_EOVRFLW
+ */
+int gsl_sf_exprel_e(const double x, gsl_sf_result * result);
+double gsl_sf_exprel(const double x);
+
+
+/* 2(exp(x)-1-x)/x^2 = 1 + x/3 + x^2/(3*4) + x^3/(3*4*5) + ...
+ *
+ * exceptions: GSL_EOVRFLW
+ */
+int gsl_sf_exprel_2_e(double x, gsl_sf_result * result);
+double gsl_sf_exprel_2(const double x);
+
+
+/* Similarly for the N-th generalization of
+ * the above. The so-called N-relative exponential
+ *
+ * exprel_N(x) = N!/x^N (exp(x) - Sum[x^k/k!, {k,0,N-1}])
+ * = 1 + x/(N+1) + x^2/((N+1)(N+2)) + ...
+ * = 1F1(1,1+N,x)
+ */
+int gsl_sf_exprel_n_e(const int n, const double x, gsl_sf_result * result);
+double gsl_sf_exprel_n(const int n, const double x);
+
+
+/* Exponentiate a quantity with an associated error.
+ */
+int gsl_sf_exp_err_e(const double x, const double dx, gsl_sf_result * result);
+
+/* Exponentiate a quantity with an associated error.
+ */
+int gsl_sf_exp_err_e10_e(const double x, const double dx, gsl_sf_result_e10 * result);
+
+
+/* Exponentiate and multiply by a given factor: y * Exp(x),
+ * for quantities with associated errors.
+ *
+ * exceptions: GSL_EOVRFLW, GSL_EUNDRFLW
+ */
+int gsl_sf_exp_mult_err_e(const double x, const double dx, const double y, const double dy, gsl_sf_result * result);
+
+
+/* Exponentiate and multiply by a given factor: y * Exp(x),
+ * for quantities with associated errors.
+ *
+ * exceptions: GSL_EOVRFLW, GSL_EUNDRFLW
+ */
+int gsl_sf_exp_mult_err_e10_e(const double x, const double dx, const double y, const double dy, gsl_sf_result_e10 * result);
+
+__END_DECLS
+
+#endif /* __GSL_SF_EXP_H__ */
diff --git a/gsl-1.9/specfunc/gsl_sf_expint.h b/gsl-1.9/specfunc/gsl_sf_expint.h
new file mode 100644
index 0000000..207fba6
--- /dev/null
+++ b/gsl-1.9/specfunc/gsl_sf_expint.h
@@ -0,0 +1,149 @@
+/* specfunc/gsl_sf_expint.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#ifndef __GSL_SF_EXPINT_H__
+#define __GSL_SF_EXPINT_H__
+
+#include <gsl/gsl_sf_result.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+
+/* E_1(x) := Re[ Integrate[ Exp[-xt]/t, {t,1,Infinity}] ]
+ *
+ * x != 0.0
+ * exceptions: GSL_EDOM, GSL_EOVRFLW, GSL_EUNDRFLW
+ */
+int gsl_sf_expint_E1_e(const double x, gsl_sf_result * result);
+double gsl_sf_expint_E1(const double x);
+
+
+/* E_2(x) := Re[ Integrate[ Exp[-xt]/t^2, {t,1,Infinity}] ]
+ *
+ * x != 0.0
+ * exceptions: GSL_EDOM, GSL_EOVRFLW, GSL_EUNDRFLW
+ */
+int gsl_sf_expint_E2_e(const double x, gsl_sf_result * result);
+double gsl_sf_expint_E2(const double x);
+
+
+/* E_1_scaled(x) := exp(x) E_1(x)
+ *
+ * x != 0.0
+ * exceptions: GSL_EDOM, GSL_EOVRFLW, GSL_EUNDRFLW
+ */
+int gsl_sf_expint_E1_scaled_e(const double x, gsl_sf_result * result);
+double gsl_sf_expint_E1_scaled(const double x);
+
+
+/* E_2_scaled(x) := exp(x) E_2(x)
+ *
+ * x != 0.0
+ * exceptions: GSL_EDOM, GSL_EOVRFLW, GSL_EUNDRFLW
+ */
+int gsl_sf_expint_E2_scaled_e(const double x, gsl_sf_result * result);
+double gsl_sf_expint_E2_scaled(const double x);
+
+
+/* Ei(x) := - PV Integrate[ Exp[-t]/t, {t,-x,Infinity}]
+ * := PV Integrate[ Exp[t]/t, {t,-Infinity,x}]
+ *
+ * x != 0.0
+ * exceptions: GSL_EDOM, GSL_EOVRFLW, GSL_EUNDRFLW
+ */
+int gsl_sf_expint_Ei_e(const double x, gsl_sf_result * result);
+double gsl_sf_expint_Ei(const double x);
+
+
+/* Ei_scaled(x) := exp(-x) Ei(x)
+ *
+ * x != 0.0
+ * exceptions: GSL_EDOM, GSL_EOVRFLW, GSL_EUNDRFLW
+ */
+int gsl_sf_expint_Ei_scaled_e(const double x, gsl_sf_result * result);
+double gsl_sf_expint_Ei_scaled(const double x);
+
+
+/* Shi(x) := Integrate[ Sinh[t]/t, {t,0,x}]
+ *
+ * exceptions: GSL_EOVRFLW, GSL_EUNDRFLW
+ */
+int gsl_sf_Shi_e(const double x, gsl_sf_result * result);
+double gsl_sf_Shi(const double x);
+
+
+/* Chi(x) := Re[ M_EULER + log(x) + Integrate[(Cosh[t]-1)/t, {t,0,x}] ]
+ *
+ * x != 0.0
+ * exceptions: GSL_EDOM, GSL_EOVRFLW, GSL_EUNDRFLW
+ */
+int gsl_sf_Chi_e(const double x, gsl_sf_result * result);
+double gsl_sf_Chi(const double x);
+
+
+/* Ei_3(x) := Integral[ Exp[-t^3], {t,0,x}]
+ *
+ * x >= 0.0
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_expint_3_e(const double x, gsl_sf_result * result);
+double gsl_sf_expint_3(double x);
+
+
+/* Si(x) := Integrate[ Sin[t]/t, {t,0,x}]
+ *
+ * exceptions: none
+ */
+int gsl_sf_Si_e(const double x, gsl_sf_result * result);
+double gsl_sf_Si(const double x);
+
+
+/* Ci(x) := -Integrate[ Cos[t]/t, {t,x,Infinity}]
+ *
+ * x > 0.0
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_Ci_e(const double x, gsl_sf_result * result);
+double gsl_sf_Ci(const double x);
+
+
+/* AtanInt(x) := Integral[ Arctan[t]/t, {t,0,x}]
+ *
+ *
+ * exceptions:
+ */
+int gsl_sf_atanint_e(const double x, gsl_sf_result * result);
+double gsl_sf_atanint(const double x);
+
+
+__END_DECLS
+
+#endif /* __GSL_SF_EXPINT_H__ */
diff --git a/gsl-1.9/specfunc/gsl_sf_fermi_dirac.h b/gsl-1.9/specfunc/gsl_sf_fermi_dirac.h
new file mode 100644
index 0000000..970053e
--- /dev/null
+++ b/gsl-1.9/specfunc/gsl_sf_fermi_dirac.h
@@ -0,0 +1,126 @@
+/* specfunc/gsl_sf_fermi_dirac.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#ifndef __GSL_SF_FERMI_DIRAC_H__
+#define __GSL_SF_FERMI_DIRAC_H__
+
+#include <gsl/gsl_sf_result.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+
+/* Complete Fermi-Dirac Integrals:
+ *
+ * F_j(x) := 1/Gamma[j+1] Integral[ t^j /(Exp[t-x] + 1), {t,0,Infinity}]
+ *
+ *
+ * Incomplete Fermi-Dirac Integrals:
+ *
+ * F_j(x,b) := 1/Gamma[j+1] Integral[ t^j /(Exp[t-x] + 1), {t,b,Infinity}]
+ */
+
+
+/* Complete integral F_{-1}(x) = e^x / (1 + e^x)
+ *
+ * exceptions: GSL_EUNDRFLW
+ */
+int gsl_sf_fermi_dirac_m1_e(const double x, gsl_sf_result * result);
+double gsl_sf_fermi_dirac_m1(const double x);
+
+
+/* Complete integral F_0(x) = ln(1 + e^x)
+ *
+ * exceptions: GSL_EUNDRFLW
+ */
+int gsl_sf_fermi_dirac_0_e(const double x, gsl_sf_result * result);
+double gsl_sf_fermi_dirac_0(const double x);
+
+
+/* Complete integral F_1(x)
+ *
+ * exceptions: GSL_EUNDRFLW, GSL_EOVRFLW
+ */
+int gsl_sf_fermi_dirac_1_e(const double x, gsl_sf_result * result);
+double gsl_sf_fermi_dirac_1(const double x);
+
+
+/* Complete integral F_2(x)
+ *
+ * exceptions: GSL_EUNDRFLW, GSL_EOVRFLW
+ */
+int gsl_sf_fermi_dirac_2_e(const double x, gsl_sf_result * result);
+double gsl_sf_fermi_dirac_2(const double x);
+
+
+/* Complete integral F_j(x)
+ * for integer j
+ *
+ * exceptions: GSL_EUNDRFLW, GSL_EOVRFLW
+ */
+int gsl_sf_fermi_dirac_int_e(const int j, const double x, gsl_sf_result * result);
+double gsl_sf_fermi_dirac_int(const int j, const double x);
+
+
+/* Complete integral F_{-1/2}(x)
+ *
+ * exceptions: GSL_EUNDRFLW, GSL_EOVRFLW
+ */
+int gsl_sf_fermi_dirac_mhalf_e(const double x, gsl_sf_result * result);
+double gsl_sf_fermi_dirac_mhalf(const double x);
+
+
+/* Complete integral F_{1/2}(x)
+ *
+ * exceptions: GSL_EUNDRFLW, GSL_EOVRFLW
+ */
+int gsl_sf_fermi_dirac_half_e(const double x, gsl_sf_result * result);
+double gsl_sf_fermi_dirac_half(const double x);
+
+
+/* Complete integral F_{3/2}(x)
+ *
+ * exceptions: GSL_EUNDRFLW, GSL_EOVRFLW
+ */
+int gsl_sf_fermi_dirac_3half_e(const double x, gsl_sf_result * result);
+double gsl_sf_fermi_dirac_3half(const double x);
+
+
+/* Incomplete integral F_0(x,b) = ln(1 + e^(b-x)) - (b-x)
+ *
+ * exceptions: GSL_EUNDRFLW, GSL_EDOM
+ */
+int gsl_sf_fermi_dirac_inc_0_e(const double x, const double b, gsl_sf_result * result);
+double gsl_sf_fermi_dirac_inc_0(const double x, const double b);
+
+
+__END_DECLS
+
+#endif /* __GSL_SF_FERMI_DIRAC_H__ */
diff --git a/gsl-1.9/specfunc/gsl_sf_gamma.h b/gsl-1.9/specfunc/gsl_sf_gamma.h
new file mode 100644
index 0000000..b8fa713
--- /dev/null
+++ b/gsl-1.9/specfunc/gsl_sf_gamma.h
@@ -0,0 +1,293 @@
+/* specfunc/gsl_sf_gamma.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#ifndef __GSL_SF_GAMMA_H__
+#define __GSL_SF_GAMMA_H__
+
+#include <gsl/gsl_sf_result.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+
+/* Log[Gamma(x)], x not a negative integer
+ * Uses real Lanczos method.
+ * Returns the real part of Log[Gamma[x]] when x < 0,
+ * i.e. Log[|Gamma[x]|].
+ *
+ * exceptions: GSL_EDOM, GSL_EROUND
+ */
+int gsl_sf_lngamma_e(double x, gsl_sf_result * result);
+double gsl_sf_lngamma(const double x);
+
+
+/* Log[Gamma(x)], x not a negative integer
+ * Uses real Lanczos method. Determines
+ * the sign of Gamma[x] as well as Log[|Gamma[x]|] for x < 0.
+ * So Gamma[x] = sgn * Exp[result_lg].
+ *
+ * exceptions: GSL_EDOM, GSL_EROUND
+ */
+int gsl_sf_lngamma_sgn_e(double x, gsl_sf_result * result_lg, double *sgn);
+
+
+/* Gamma(x), x not a negative integer
+ * Uses real Lanczos method.
+ *
+ * exceptions: GSL_EDOM, GSL_EOVRFLW, GSL_EROUND
+ */
+int gsl_sf_gamma_e(const double x, gsl_sf_result * result);
+double gsl_sf_gamma(const double x);
+
+
+/* Regulated Gamma Function, x > 0
+ * Gamma^*(x) = Gamma(x)/(Sqrt[2Pi] x^(x-1/2) exp(-x))
+ * = (1 + 1/(12x) + ...), x->Inf
+ * A useful suggestion of Temme.
+ *
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_gammastar_e(const double x, gsl_sf_result * result);
+double gsl_sf_gammastar(const double x);
+
+
+/* 1/Gamma(x)
+ * Uses real Lanczos method.
+ *
+ * exceptions: GSL_EUNDRFLW, GSL_EROUND
+ */
+int gsl_sf_gammainv_e(const double x, gsl_sf_result * result);
+double gsl_sf_gammainv(const double x);
+
+
+/* Log[Gamma(z)] for z complex, z not a negative integer
+ * Uses complex Lanczos method. Note that the phase part (arg)
+ * is not well-determined when |z| is very large, due
+ * to inevitable roundoff in restricting to (-Pi,Pi].
+ * This will raise the GSL_ELOSS exception when it occurs.
+ * The absolute value part (lnr), however, never suffers.
+ *
+ * Calculates:
+ * lnr = log|Gamma(z)|
+ * arg = arg(Gamma(z)) in (-Pi, Pi]
+ *
+ * exceptions: GSL_EDOM, GSL_ELOSS
+ */
+int gsl_sf_lngamma_complex_e(double zr, double zi, gsl_sf_result * lnr, gsl_sf_result * arg);
+
+
+/* x^n / n!
+ *
+ * x >= 0.0, n >= 0
+ * exceptions: GSL_EDOM, GSL_EOVRFLW, GSL_EUNDRFLW
+ */
+int gsl_sf_taylorcoeff_e(const int n, const double x, gsl_sf_result * result);
+double gsl_sf_taylorcoeff(const int n, const double x);
+
+
+/* n!
+ *
+ * exceptions: GSL_EDOM, GSL_OVRFLW
+ */
+int gsl_sf_fact_e(const unsigned int n, gsl_sf_result * result);
+double gsl_sf_fact(const unsigned int n);
+
+
+/* n!! = n(n-2)(n-4) ...
+ *
+ * exceptions: GSL_EDOM, GSL_OVRFLW
+ */
+int gsl_sf_doublefact_e(const unsigned int n, gsl_sf_result * result);
+double gsl_sf_doublefact(const unsigned int n);
+
+
+/* log(n!)
+ * Faster than ln(Gamma(n+1)) for n < 170; defers for larger n.
+ *
+ * exceptions: none
+ */
+int gsl_sf_lnfact_e(const unsigned int n, gsl_sf_result * result);
+double gsl_sf_lnfact(const unsigned int n);
+
+
+/* log(n!!)
+ *
+ * exceptions: none
+ */
+int gsl_sf_lndoublefact_e(const unsigned int n, gsl_sf_result * result);
+double gsl_sf_lndoublefact(const unsigned int n);
+
+
+/* log(n choose m)
+ *
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_lnchoose_e(unsigned int n, unsigned int m, gsl_sf_result * result);
+double gsl_sf_lnchoose(unsigned int n, unsigned int m);
+
+
+/* n choose m
+ *
+ * exceptions: GSL_EDOM, GSL_EOVRFLW
+ */
+int gsl_sf_choose_e(unsigned int n, unsigned int m, gsl_sf_result * result);
+double gsl_sf_choose(unsigned int n, unsigned int m);
+
+
+/* Logarithm of Pochhammer (Apell) symbol
+ * log( (a)_x )
+ * where (a)_x := Gamma[a + x]/Gamma[a]
+ *
+ * a > 0, a+x > 0
+ *
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_lnpoch_e(const double a, const double x, gsl_sf_result * result);
+double gsl_sf_lnpoch(const double a, const double x);
+
+
+/* Logarithm of Pochhammer (Apell) symbol, with sign information.
+ * result = log( |(a)_x| )
+ * sgn = sgn( (a)_x )
+ * where (a)_x := Gamma[a + x]/Gamma[a]
+ *
+ * a != neg integer, a+x != neg integer
+ *
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_lnpoch_sgn_e(const double a, const double x, gsl_sf_result * result, double * sgn);
+
+
+/* Pochhammer (Apell) symbol
+ * (a)_x := Gamma[a + x]/Gamma[x]
+ *
+ * a != neg integer, a+x != neg integer
+ *
+ * exceptions: GSL_EDOM, GSL_EOVRFLW
+ */
+int gsl_sf_poch_e(const double a, const double x, gsl_sf_result * result);
+double gsl_sf_poch(const double a, const double x);
+
+
+/* Relative Pochhammer (Apell) symbol
+ * ((a,x) - 1)/x
+ * where (a,x) = (a)_x := Gamma[a + x]/Gamma[a]
+ *
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_pochrel_e(const double a, const double x, gsl_sf_result * result);
+double gsl_sf_pochrel(const double a, const double x);
+
+
+/* Normalized Incomplete Gamma Function
+ *
+ * Q(a,x) = 1/Gamma(a) Integral[ t^(a-1) e^(-t), {t,x,Infinity} ]
+ *
+ * a >= 0, x >= 0
+ * Q(a,0) := 1
+ * Q(0,x) := 0, x != 0
+ *
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_gamma_inc_Q_e(const double a, const double x, gsl_sf_result * result);
+double gsl_sf_gamma_inc_Q(const double a, const double x);
+
+
+/* Complementary Normalized Incomplete Gamma Function
+ *
+ * P(a,x) = 1/Gamma(a) Integral[ t^(a-1) e^(-t), {t,0,x} ]
+ *
+ * a > 0, x >= 0
+ *
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_gamma_inc_P_e(const double a, const double x, gsl_sf_result * result);
+double gsl_sf_gamma_inc_P(const double a, const double x);
+
+
+/* Non-normalized Incomplete Gamma Function
+ *
+ * Gamma(a,x) := Integral[ t^(a-1) e^(-t), {t,x,Infinity} ]
+ *
+ * x >= 0.0
+ * Gamma(a, 0) := Gamma(a)
+ *
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_gamma_inc_e(const double a, const double x, gsl_sf_result * result);
+double gsl_sf_gamma_inc(const double a, const double x);
+
+
+/* Logarithm of Beta Function
+ * Log[B(a,b)]
+ *
+ * a > 0, b > 0
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_lnbeta_e(const double a, const double b, gsl_sf_result * result);
+double gsl_sf_lnbeta(const double a, const double b);
+
+int gsl_sf_lnbeta_sgn_e(const double x, const double y, gsl_sf_result * result, double * sgn);
+
+
+/* Beta Function
+ * B(a,b)
+ *
+ * a > 0, b > 0
+ * exceptions: GSL_EDOM, GSL_EOVRFLW, GSL_EUNDRFLW
+ */
+int gsl_sf_beta_e(const double a, const double b, gsl_sf_result * result);
+double gsl_sf_beta(const double a, const double b);
+
+
+/* Normalized Incomplete Beta Function
+ * B_x(a,b)/B(a,b)
+ *
+ * a > 0, b > 0, 0 <= x <= 1
+ * exceptions: GSL_EDOM, GSL_EUNDRFLW
+ */
+int gsl_sf_beta_inc_e(const double a, const double b, const double x, gsl_sf_result * result);
+double gsl_sf_beta_inc(const double a, const double b, const double x);
+
+
+/* The maximum x such that gamma(x) is not
+ * considered an overflow.
+ */
+#define GSL_SF_GAMMA_XMAX 171.0
+
+/* The maximum n such that gsl_sf_fact(n) does not give an overflow. */
+#define GSL_SF_FACT_NMAX 170
+
+/* The maximum n such that gsl_sf_doublefact(n) does not give an overflow. */
+#define GSL_SF_DOUBLEFACT_NMAX 297
+
+__END_DECLS
+
+#endif /* __GSL_SF_GAMMA_H__ */
diff --git a/gsl-1.9/specfunc/gsl_sf_gegenbauer.h b/gsl-1.9/specfunc/gsl_sf_gegenbauer.h
new file mode 100644
index 0000000..9078077
--- /dev/null
+++ b/gsl-1.9/specfunc/gsl_sf_gegenbauer.h
@@ -0,0 +1,73 @@
+/* specfunc/gsl_sf_gegenbauer.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#ifndef __GSL_SF_GEGENBAUER_H__
+#define __GSL_SF_GEGENBAUER_H__
+
+#include <gsl/gsl_sf_result.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+
+/* Evaluate Gegenbauer polynomials
+ * using explicit representations.
+ *
+ * exceptions: none
+ */
+int gsl_sf_gegenpoly_1_e(double lambda, double x, gsl_sf_result * result);
+int gsl_sf_gegenpoly_2_e(double lambda, double x, gsl_sf_result * result);
+int gsl_sf_gegenpoly_3_e(double lambda, double x, gsl_sf_result * result);
+double gsl_sf_gegenpoly_1(double lambda, double x);
+double gsl_sf_gegenpoly_2(double lambda, double x);
+double gsl_sf_gegenpoly_3(double lambda, double x);
+
+
+/* Evaluate Gegenbauer polynomials.
+ *
+ * lambda > -1/2, n >= 0
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_gegenpoly_n_e(int n, double lambda, double x, gsl_sf_result * result);
+double gsl_sf_gegenpoly_n(int n, double lambda, double x);
+
+
+/* Calculate array of Gegenbauer polynomials
+ * for n = (0, 1, 2, ... nmax)
+ *
+ * lambda > -1/2, nmax >= 0
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_gegenpoly_array(int nmax, double lambda, double x, double * result_array);
+
+
+__END_DECLS
+
+#endif /* __GSL_SF_GEGENBAUER_H__ */
diff --git a/gsl-1.9/specfunc/gsl_sf_hyperg.h b/gsl-1.9/specfunc/gsl_sf_hyperg.h
new file mode 100644
index 0000000..38342b0
--- /dev/null
+++ b/gsl-1.9/specfunc/gsl_sf_hyperg.h
@@ -0,0 +1,154 @@
+/* specfunc/gsl_sf_hyperg.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#ifndef __GSL_SF_HYPERG_H__
+#define __GSL_SF_HYPERG_H__
+
+#include <gsl/gsl_sf_result.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+
+/* Hypergeometric function related to Bessel functions
+ * 0F1[c,x] =
+ * Gamma[c] x^(1/2(1-c)) I_{c-1}(2 Sqrt[x])
+ * Gamma[c] (-x)^(1/2(1-c)) J_{c-1}(2 Sqrt[-x])
+ *
+ * exceptions: GSL_EOVRFLW, GSL_EUNDRFLW
+ */
+int gsl_sf_hyperg_0F1_e(double c, double x, gsl_sf_result * result);
+double gsl_sf_hyperg_0F1(const double c, const double x);
+
+
+/* Confluent hypergeometric function for integer parameters.
+ * 1F1[m,n,x] = M(m,n,x)
+ *
+ * exceptions:
+ */
+int gsl_sf_hyperg_1F1_int_e(const int m, const int n, const double x, gsl_sf_result * result);
+double gsl_sf_hyperg_1F1_int(const int m, const int n, double x);
+
+
+/* Confluent hypergeometric function.
+ * 1F1[a,b,x] = M(a,b,x)
+ *
+ * exceptions:
+ */
+int gsl_sf_hyperg_1F1_e(const double a, const double b, const double x, gsl_sf_result * result);
+double gsl_sf_hyperg_1F1(double a, double b, double x);
+
+
+/* Confluent hypergeometric function for integer parameters.
+ * U(m,n,x)
+ *
+ * exceptions:
+ */
+int gsl_sf_hyperg_U_int_e(const int m, const int n, const double x, gsl_sf_result * result);
+double gsl_sf_hyperg_U_int(const int m, const int n, const double x);
+
+
+/* Confluent hypergeometric function for integer parameters.
+ * U(m,n,x)
+ *
+ * exceptions:
+ */
+int gsl_sf_hyperg_U_int_e10_e(const int m, const int n, const double x, gsl_sf_result_e10 * result);
+
+
+/* Confluent hypergeometric function.
+ * U(a,b,x)
+ *
+ * exceptions:
+ */
+int gsl_sf_hyperg_U_e(const double a, const double b, const double x, gsl_sf_result * result);
+double gsl_sf_hyperg_U(const double a, const double b, const double x);
+
+
+/* Confluent hypergeometric function.
+ * U(a,b,x)
+ *
+ * exceptions:
+ */
+int gsl_sf_hyperg_U_e10_e(const double a, const double b, const double x, gsl_sf_result_e10 * result);
+
+
+/* Gauss hypergeometric function 2F1[a,b,c,x]
+ * |x| < 1
+ *
+ * exceptions:
+ */
+int gsl_sf_hyperg_2F1_e(double a, double b, const double c, const double x, gsl_sf_result * result);
+double gsl_sf_hyperg_2F1(double a, double b, double c, double x);
+
+
+/* Gauss hypergeometric function
+ * 2F1[aR + I aI, aR - I aI, c, x]
+ * |x| < 1
+ *
+ * exceptions:
+ */
+int gsl_sf_hyperg_2F1_conj_e(const double aR, const double aI, const double c, const double x, gsl_sf_result * result);
+double gsl_sf_hyperg_2F1_conj(double aR, double aI, double c, double x);
+
+
+/* Renormalized Gauss hypergeometric function
+ * 2F1[a,b,c,x] / Gamma[c]
+ * |x| < 1
+ *
+ * exceptions:
+ */
+int gsl_sf_hyperg_2F1_renorm_e(const double a, const double b, const double c, const double x, gsl_sf_result * result);
+double gsl_sf_hyperg_2F1_renorm(double a, double b, double c, double x);
+
+
+/* Renormalized Gauss hypergeometric function
+ * 2F1[aR + I aI, aR - I aI, c, x] / Gamma[c]
+ * |x| < 1
+ *
+ * exceptions:
+ */
+int gsl_sf_hyperg_2F1_conj_renorm_e(const double aR, const double aI, const double c, const double x, gsl_sf_result * result);
+double gsl_sf_hyperg_2F1_conj_renorm(double aR, double aI, double c, double x);
+
+
+/* Mysterious hypergeometric function. The series representation
+ * is a divergent hypergeometric series. However, for x < 0 we
+ * have 2F0(a,b,x) = (-1/x)^a U(a,1+a-b,-1/x)
+ *
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_hyperg_2F0_e(const double a, const double b, const double x, gsl_sf_result * result);
+double gsl_sf_hyperg_2F0(const double a, const double b, const double x);
+
+
+__END_DECLS
+
+#endif /* __GSL_SF_HYPERG_H__ */
diff --git a/gsl-1.9/specfunc/gsl_sf_laguerre.h b/gsl-1.9/specfunc/gsl_sf_laguerre.h
new file mode 100644
index 0000000..70d26fe
--- /dev/null
+++ b/gsl-1.9/specfunc/gsl_sf_laguerre.h
@@ -0,0 +1,68 @@
+/* specfunc/gsl_sf_laguerre.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#ifndef __GSL_SF_LAGUERRE_H__
+#define __GSL_SF_LAGUERRE_H__
+
+#include <gsl/gsl_sf_result.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+
+/* L^a_n(x) = (a+1)_n / n! 1F1(-n,a+1,x) */
+
+
+/* Evaluate generalized Laguerre polynomials
+ * using explicit representations.
+ *
+ * exceptions: none
+ */
+int gsl_sf_laguerre_1_e(const double a, const double x, gsl_sf_result * result);
+int gsl_sf_laguerre_2_e(const double a, const double x, gsl_sf_result * result);
+int gsl_sf_laguerre_3_e(const double a, const double x, gsl_sf_result * result);
+double gsl_sf_laguerre_1(double a, double x);
+double gsl_sf_laguerre_2(double a, double x);
+double gsl_sf_laguerre_3(double a, double x);
+
+
+/* Evaluate generalized Laguerre polynomials.
+ *
+ * a > -1.0
+ * n >= 0
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_laguerre_n_e(const int n, const double a, const double x, gsl_sf_result * result);
+double gsl_sf_laguerre_n(int n, double a, double x);
+
+
+__END_DECLS
+
+#endif /* __GSL_SF_LAGUERRE_H__ */
diff --git a/gsl-1.9/specfunc/gsl_sf_lambert.h b/gsl-1.9/specfunc/gsl_sf_lambert.h
new file mode 100644
index 0000000..1cf880e
--- /dev/null
+++ b/gsl-1.9/specfunc/gsl_sf_lambert.h
@@ -0,0 +1,69 @@
+/* specfunc/gsl_sf_lambert.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#ifndef __GSL_SF_LAMBERT_H__
+#define __GSL_SF_LAMBERT_H__
+
+#include <gsl/gsl_sf_result.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+
+/* Lambert's Function W_0(x)
+ *
+ * W_0(x) is the principal branch of the
+ * implicit function defined by W e^W = x.
+ *
+ * -1/E < x < \infty
+ *
+ * exceptions: GSL_EMAXITER;
+ */
+int gsl_sf_lambert_W0_e(double x, gsl_sf_result * result);
+double gsl_sf_lambert_W0(double x);
+
+
+/* Lambert's Function W_{-1}(x)
+ *
+ * W_{-1}(x) is the second real branch of the
+ * implicit function defined by W e^W = x.
+ * It agrees with W_0(x) when x >= 0.
+ *
+ * -1/E < x < \infty
+ *
+ * exceptions: GSL_MAXITER;
+ */
+int gsl_sf_lambert_Wm1_e(double x, gsl_sf_result * result);
+double gsl_sf_lambert_Wm1(double x);
+
+
+__END_DECLS
+
+#endif /* __GSL_SF_LAMBERT_H__ */
diff --git a/gsl-1.9/specfunc/gsl_sf_legendre.h b/gsl-1.9/specfunc/gsl_sf_legendre.h
new file mode 100644
index 0000000..ed63262
--- /dev/null
+++ b/gsl-1.9/specfunc/gsl_sf_legendre.h
@@ -0,0 +1,326 @@
+/* specfunc/gsl_sf_legendre.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2004 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#ifndef __GSL_SF_LEGENDRE_H__
+#define __GSL_SF_LEGENDRE_H__
+
+#include <gsl/gsl_sf_result.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+
+/* P_l(x) l >= 0; |x| <= 1
+ *
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_legendre_Pl_e(const int l, const double x, gsl_sf_result * result);
+double gsl_sf_legendre_Pl(const int l, const double x);
+
+
+/* P_l(x) for l=0,...,lmax; |x| <= 1
+ *
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_legendre_Pl_array(
+ const int lmax, const double x,
+ double * result_array
+ );
+
+
+/* P_l(x) and P_l'(x) for l=0,...,lmax; |x| <= 1
+ *
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_legendre_Pl_deriv_array(
+ const int lmax, const double x,
+ double * result_array,
+ double * result_deriv_array
+ );
+
+
+/* P_l(x), l=1,2,3
+ *
+ * exceptions: none
+ */
+int gsl_sf_legendre_P1_e(double x, gsl_sf_result * result);
+int gsl_sf_legendre_P2_e(double x, gsl_sf_result * result);
+int gsl_sf_legendre_P3_e(double x, gsl_sf_result * result);
+double gsl_sf_legendre_P1(const double x);
+double gsl_sf_legendre_P2(const double x);
+double gsl_sf_legendre_P3(const double x);
+
+
+/* Q_0(x), x > -1, x != 1
+ *
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_legendre_Q0_e(const double x, gsl_sf_result * result);
+double gsl_sf_legendre_Q0(const double x);
+
+
+/* Q_1(x), x > -1, x != 1
+ *
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_legendre_Q1_e(const double x, gsl_sf_result * result);
+double gsl_sf_legendre_Q1(const double x);
+
+
+/* Q_l(x), x > -1, x != 1, l >= 0
+ *
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_legendre_Ql_e(const int l, const double x, gsl_sf_result * result);
+double gsl_sf_legendre_Ql(const int l, const double x);
+
+
+/* P_l^m(x) m >= 0; l >= m; |x| <= 1.0
+ *
+ * Note that this function grows combinatorially with l.
+ * Therefore we can easily generate an overflow for l larger
+ * than about 150.
+ *
+ * There is no trouble for small m, but when m and l are both large,
+ * then there will be trouble. Rather than allow overflows, these
+ * functions refuse to calculate when they can sense that l and m are
+ * too big.
+ *
+ * If you really want to calculate a spherical harmonic, then DO NOT
+ * use this. Instead use legendre_sphPlm() below, which uses a similar
+ * recursion, but with the normalized functions.
+ *
+ * exceptions: GSL_EDOM, GSL_EOVRFLW
+ */
+int gsl_sf_legendre_Plm_e(const int l, const int m, const double x, gsl_sf_result * result);
+double gsl_sf_legendre_Plm(const int l, const int m, const double x);
+
+
+/* P_l^m(x) m >= 0; l >= m; |x| <= 1.0
+ * l=|m|,...,lmax
+ *
+ * exceptions: GSL_EDOM, GSL_EOVRFLW
+ */
+int gsl_sf_legendre_Plm_array(
+ const int lmax, const int m, const double x,
+ double * result_array
+ );
+
+
+/* P_l^m(x) and d(P_l^m(x))/dx; m >= 0; lmax >= m; |x| <= 1.0
+ * l=|m|,...,lmax
+ *
+ * exceptions: GSL_EDOM, GSL_EOVRFLW
+ */
+int gsl_sf_legendre_Plm_deriv_array(
+ const int lmax, const int m, const double x,
+ double * result_array,
+ double * result_deriv_array
+ );
+
+
+/* P_l^m(x), normalized properly for use in spherical harmonics
+ * m >= 0; l >= m; |x| <= 1.0
+ *
+ * There is no overflow problem, as there is for the
+ * standard normalization of P_l^m(x).
+ *
+ * Specifically, it returns:
+ *
+ * sqrt((2l+1)/(4pi)) sqrt((l-m)!/(l+m)!) P_l^m(x)
+ *
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_legendre_sphPlm_e(const int l, int m, const double x, gsl_sf_result * result);
+double gsl_sf_legendre_sphPlm(const int l, const int m, const double x);
+
+
+/* sphPlm(l,m,x) values
+ * m >= 0; l >= m; |x| <= 1.0
+ * l=|m|,...,lmax
+ *
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_legendre_sphPlm_array(
+ const int lmax, int m, const double x,
+ double * result_array
+ );
+
+
+/* sphPlm(l,m,x) and d(sphPlm(l,m,x))/dx values
+ * m >= 0; l >= m; |x| <= 1.0
+ * l=|m|,...,lmax
+ *
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_legendre_sphPlm_deriv_array(
+ const int lmax, const int m, const double x,
+ double * result_array,
+ double * result_deriv_array
+ );
+
+
+
+/* size of result_array[] needed for the array versions of Plm
+ * (lmax - m + 1)
+ */
+int gsl_sf_legendre_array_size(const int lmax, const int m);
+
+
+/* Irregular Spherical Conical Function
+ * P^{1/2}_{-1/2 + I lambda}(x)
+ *
+ * x > -1.0
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_conicalP_half_e(const double lambda, const double x, gsl_sf_result * result);
+double gsl_sf_conicalP_half(const double lambda, const double x);
+
+
+/* Regular Spherical Conical Function
+ * P^{-1/2}_{-1/2 + I lambda}(x)
+ *
+ * x > -1.0
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_conicalP_mhalf_e(const double lambda, const double x, gsl_sf_result * result);
+double gsl_sf_conicalP_mhalf(const double lambda, const double x);
+
+
+/* Conical Function
+ * P^{0}_{-1/2 + I lambda}(x)
+ *
+ * x > -1.0
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_conicalP_0_e(const double lambda, const double x, gsl_sf_result * result);
+double gsl_sf_conicalP_0(const double lambda, const double x);
+
+
+/* Conical Function
+ * P^{1}_{-1/2 + I lambda}(x)
+ *
+ * x > -1.0
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_conicalP_1_e(const double lambda, const double x, gsl_sf_result * result);
+double gsl_sf_conicalP_1(const double lambda, const double x);
+
+
+/* Regular Spherical Conical Function
+ * P^{-1/2-l}_{-1/2 + I lambda}(x)
+ *
+ * x > -1.0, l >= -1
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_conicalP_sph_reg_e(const int l, const double lambda, const double x, gsl_sf_result * result);
+double gsl_sf_conicalP_sph_reg(const int l, const double lambda, const double x);
+
+
+/* Regular Cylindrical Conical Function
+ * P^{-m}_{-1/2 + I lambda}(x)
+ *
+ * x > -1.0, m >= -1
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_conicalP_cyl_reg_e(const int m, const double lambda, const double x, gsl_sf_result * result);
+double gsl_sf_conicalP_cyl_reg(const int m, const double lambda, const double x);
+
+
+/* The following spherical functions are specializations
+ * of Legendre functions which give the regular eigenfunctions
+ * of the Laplacian on a 3-dimensional hyperbolic space.
+ * Of particular interest is the flat limit, which is
+ * Flat-Lim := {lambda->Inf, eta->0, lambda*eta fixed}.
+ */
+
+/* Zeroth radial eigenfunction of the Laplacian on the
+ * 3-dimensional hyperbolic space.
+ *
+ * legendre_H3d_0(lambda,eta) := sin(lambda*eta)/(lambda*sinh(eta))
+ *
+ * Normalization:
+ * Flat-Lim legendre_H3d_0(lambda,eta) = j_0(lambda*eta)
+ *
+ * eta >= 0.0
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_legendre_H3d_0_e(const double lambda, const double eta, gsl_sf_result * result);
+double gsl_sf_legendre_H3d_0(const double lambda, const double eta);
+
+
+/* First radial eigenfunction of the Laplacian on the
+ * 3-dimensional hyperbolic space.
+ *
+ * legendre_H3d_1(lambda,eta) :=
+ * 1/sqrt(lambda^2 + 1) sin(lam eta)/(lam sinh(eta))
+ * (coth(eta) - lambda cot(lambda*eta))
+ *
+ * Normalization:
+ * Flat-Lim legendre_H3d_1(lambda,eta) = j_1(lambda*eta)
+ *
+ * eta >= 0.0
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_legendre_H3d_1_e(const double lambda, const double eta, gsl_sf_result * result);
+double gsl_sf_legendre_H3d_1(const double lambda, const double eta);
+
+
+/* l'th radial eigenfunction of the Laplacian on the
+ * 3-dimensional hyperbolic space.
+ *
+ * Normalization:
+ * Flat-Lim legendre_H3d_l(l,lambda,eta) = j_l(lambda*eta)
+ *
+ * eta >= 0.0, l >= 0
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_legendre_H3d_e(const int l, const double lambda, const double eta, gsl_sf_result * result);
+double gsl_sf_legendre_H3d(const int l, const double lambda, const double eta);
+
+
+/* Array of H3d(ell), 0 <= ell <= lmax
+ */
+int gsl_sf_legendre_H3d_array(const int lmax, const double lambda, const double eta, double * result_array);
+
+
+#ifdef HAVE_INLINE
+extern inline
+int
+gsl_sf_legendre_array_size(const int lmax, const int m)
+{
+ return lmax-m+1;
+}
+#endif /* HAVE_INLINE */
+
+
+__END_DECLS
+
+#endif /* __GSL_SF_LEGENDRE_H__ */
diff --git a/gsl-1.9/specfunc/gsl_sf_log.h b/gsl-1.9/specfunc/gsl_sf_log.h
new file mode 100644
index 0000000..4e574d1
--- /dev/null
+++ b/gsl-1.9/specfunc/gsl_sf_log.h
@@ -0,0 +1,82 @@
+/* specfunc/gsl_sf_log.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#ifndef __GSL_SF_LOG_H__
+#define __GSL_SF_LOG_H__
+
+#include <gsl/gsl_sf_result.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+
+/* Provide a logarithm function with GSL semantics.
+ *
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_log_e(const double x, gsl_sf_result * result);
+double gsl_sf_log(const double x);
+
+
+/* Log(|x|)
+ *
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_log_abs_e(const double x, gsl_sf_result * result);
+double gsl_sf_log_abs(const double x);
+
+
+/* Complex Logarithm
+ * exp(lnr + I theta) = zr + I zi
+ * Returns argument in [-pi,pi].
+ *
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_complex_log_e(const double zr, const double zi, gsl_sf_result * lnr, gsl_sf_result * theta);
+
+
+/* Log(1 + x)
+ *
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_log_1plusx_e(const double x, gsl_sf_result * result);
+double gsl_sf_log_1plusx(const double x);
+
+
+/* Log(1 + x) - x
+ *
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_log_1plusx_mx_e(const double x, gsl_sf_result * result);
+double gsl_sf_log_1plusx_mx(const double x);
+
+__END_DECLS
+
+#endif /* __GSL_SF_LOG_H__ */
diff --git a/gsl-1.9/specfunc/gsl_sf_mathieu.h b/gsl-1.9/specfunc/gsl_sf_mathieu.h
new file mode 100644
index 0000000..705c466
--- /dev/null
+++ b/gsl-1.9/specfunc/gsl_sf_mathieu.h
@@ -0,0 +1,107 @@
+/* specfunc/gsl_sf_mathieu.h
+ *
+ * Copyright (C) 2002 Lowell Johnson
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/* Author: L. Johnson */
+
+#ifndef __GSL_SF_MATHIEU_H__
+#define __GSL_SF_MATHIEU_H__
+
+#include <gsl/gsl_sf_result.h>
+#include <gsl/gsl_eigen.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+#define GSL_SF_MATHIEU_COEFF 100
+
+typedef struct
+{
+ size_t size;
+ size_t even_order;
+ size_t odd_order;
+ int extra_values;
+ double qa; /* allow for caching of results: not implemented yet */
+ double qb; /* allow for caching of results: not implemented yet */
+ double *aa;
+ double *bb;
+ double *dd;
+ double *ee;
+ double *tt;
+ double *e2;
+ double *zz;
+ gsl_vector *eval;
+ gsl_matrix *evec;
+ gsl_eigen_symmv_workspace *wmat;
+} gsl_sf_mathieu_workspace;
+
+
+/* Compute an array of characteristic (eigen) values from the recurrence
+ matrices for the Mathieu equations. */
+int gsl_sf_mathieu_a_array(int order_min, int order_max, double qq, gsl_sf_mathieu_workspace *work, double result_array[]);
+int gsl_sf_mathieu_b_array(int order_min, int order_max, double qq, gsl_sf_mathieu_workspace *work, double result_array[]);
+
+/* Compute the characteristic value for a Mathieu function of order n and
+ type ntype. */
+int gsl_sf_mathieu_a(int order, double qq, gsl_sf_result *result);
+int gsl_sf_mathieu_b(int order, double qq, gsl_sf_result *result);
+
+/* Compute the Fourier coefficients for a Mathieu function. */
+int gsl_sf_mathieu_a_coeff(int order, double qq, double aa, double coeff[]);
+int gsl_sf_mathieu_b_coeff(int order, double qq, double aa, double coeff[]);
+
+/* Allocate computational storage space for eigenvalue solution. */
+gsl_sf_mathieu_workspace *gsl_sf_mathieu_alloc(const size_t nn,
+ const double qq);
+void gsl_sf_mathieu_free(gsl_sf_mathieu_workspace *workspace);
+
+/* Compute an angular Mathieu function. */
+int gsl_sf_mathieu_ce(int order, double qq, double zz, gsl_sf_result *result);
+int gsl_sf_mathieu_se(int order, double qq, double zz, gsl_sf_result *result);
+int gsl_sf_mathieu_ce_array(int nmin, int nmax, double qq, double zz,
+ gsl_sf_mathieu_workspace *work,
+ double result_array[]);
+int gsl_sf_mathieu_se_array(int nmin, int nmax, double qq, double zz,
+ gsl_sf_mathieu_workspace *work,
+ double result_array[]);
+
+/* Compute a radial Mathieu function. */
+int gsl_sf_mathieu_Mc(int kind, int order, double qq, double zz,
+ gsl_sf_result *result);
+int gsl_sf_mathieu_Ms(int kind, int order, double qq, double zz,
+ gsl_sf_result *result);
+int gsl_sf_mathieu_Mc_array(int kind, int nmin, int nmax, double qq,
+ double zz, gsl_sf_mathieu_workspace *work,
+ double result_array[]);
+int gsl_sf_mathieu_Ms_array(int kind, int nmin, int nmax, double qq,
+ double zz, gsl_sf_mathieu_workspace *work,
+ double result_array[]);
+
+
+__END_DECLS
+
+#endif /* !__GSL_SF_MATHIEU_H__ */
diff --git a/gsl-1.9/specfunc/gsl_sf_pow_int.h b/gsl-1.9/specfunc/gsl_sf_pow_int.h
new file mode 100644
index 0000000..f3db2eb
--- /dev/null
+++ b/gsl-1.9/specfunc/gsl_sf_pow_int.h
@@ -0,0 +1,49 @@
+/* specfunc/gsl_sf_pow_int.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#ifndef __GSL_SF_POW_INT_H__
+#define __GSL_SF_POW_INT_H__
+
+#include <gsl/gsl_sf_result.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+
+/* Calculate x^n.
+ * Does not check for overflow/underflow.
+ */
+int gsl_sf_pow_int_e(double x, int n, gsl_sf_result * result);
+double gsl_sf_pow_int(const double x, const int n);
+
+
+__END_DECLS
+
+#endif /* __GSL_SF_POW_INT_H__ */
diff --git a/gsl-1.9/specfunc/gsl_sf_psi.h b/gsl-1.9/specfunc/gsl_sf_psi.h
new file mode 100644
index 0000000..07bb1b8
--- /dev/null
+++ b/gsl-1.9/specfunc/gsl_sf_psi.h
@@ -0,0 +1,113 @@
+/* specfunc/gsl_sf_psi.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#ifndef __GSL_SF_PSI_H__
+#define __GSL_SF_PSI_H__
+
+#include <gsl/gsl_sf_result.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+
+/* Poly-Gamma Functions
+ *
+ * psi(m,x) := (d/dx)^m psi(0,x) = (d/dx)^{m+1} log(gamma(x))
+ */
+
+
+/* Di-Gamma Function psi(n) = psi(0,n)
+ *
+ * n > 0
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_psi_int_e(const int n, gsl_sf_result * result);
+double gsl_sf_psi_int(const int n);
+
+
+/* Di-Gamma Function psi(x) = psi(0, x)
+ *
+ * x != 0.0, -1.0, -2.0, ...
+ * exceptions: GSL_EDOM, GSL_ELOSS
+ */
+int gsl_sf_psi_e(const double x, gsl_sf_result * result);
+double gsl_sf_psi(const double x);
+
+
+/* Di-Gamma Function Re[psi(1 + I y)]
+ *
+ * exceptions: none
+ */
+int gsl_sf_psi_1piy_e(const double y, gsl_sf_result * result);
+double gsl_sf_psi_1piy(const double y);
+
+
+/* Di-Gamma Function psi(z) for general complex argument z = x + iy
+ *
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_complex_psi_e(
+ const double x,
+ const double y,
+ gsl_sf_result * result_re,
+ gsl_sf_result * result_im
+ );
+
+
+/* Tri-Gamma Function psi^(1)(n)
+ *
+ * n > 0
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_psi_1_int_e(const int n, gsl_sf_result * result);
+double gsl_sf_psi_1_int(const int n);
+
+
+/* Tri-Gamma Function psi^(1)(x)
+ *
+ * x != 0.0, -1.0, -2.0, ...
+ * exceptions: GSL_EDOM, GSL_ELOSS
+ */
+int gsl_sf_psi_1_e(const double x, gsl_sf_result * result);
+double gsl_sf_psi_1(const double x);
+
+
+/* Poly-Gamma Function psi^(n)(x)
+ *
+ * n >= 0, x > 0.0
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_psi_n_e(const int n, const double x, gsl_sf_result * result);
+double gsl_sf_psi_n(const int n, const double x);
+
+
+__END_DECLS
+
+#endif /* __GSL_SF_PSI_H__ */
diff --git a/gsl-1.9/specfunc/gsl_sf_result.h b/gsl-1.9/specfunc/gsl_sf_result.h
new file mode 100644
index 0000000..5f23238
--- /dev/null
+++ b/gsl-1.9/specfunc/gsl_sf_result.h
@@ -0,0 +1,59 @@
+/* specfunc/gsl_sf_result.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#ifndef __GSL_SF_RESULT_H__
+#define __GSL_SF_RESULT_H__
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+struct gsl_sf_result_struct {
+ double val;
+ double err;
+};
+typedef struct gsl_sf_result_struct gsl_sf_result;
+
+#define GSL_SF_RESULT_SET(r,v,e) do { (r)->val=(v); (r)->err=(e); } while(0)
+
+
+struct gsl_sf_result_e10_struct {
+ double val;
+ double err;
+ int e10;
+};
+typedef struct gsl_sf_result_e10_struct gsl_sf_result_e10;
+
+
+int gsl_sf_result_smash_e(const gsl_sf_result_e10 * re, gsl_sf_result * r);
+
+
+__END_DECLS
+
+#endif /* __GSL_SF_RESULT_H__ */
diff --git a/gsl-1.9/specfunc/gsl_sf_synchrotron.h b/gsl-1.9/specfunc/gsl_sf_synchrotron.h
new file mode 100644
index 0000000..76ca4cd
--- /dev/null
+++ b/gsl-1.9/specfunc/gsl_sf_synchrotron.h
@@ -0,0 +1,60 @@
+/* specfunc/gsl_sf_synchrotron.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#ifndef __GSL_SF_SYNCHROTRON_H__
+#define __GSL_SF_SYNCHROTRON_H__
+
+#include <gsl/gsl_sf_result.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+
+/* First synchrotron function:
+ * synchrotron_1(x) = x Integral[ K_{5/3}(t), {t, x, Infinity}]
+ *
+ * exceptions: GSL_EDOM, GSL_EUNDRFLW
+ */
+int gsl_sf_synchrotron_1_e(const double x, gsl_sf_result * result);
+double gsl_sf_synchrotron_1(const double x);
+
+
+/* Second synchroton function:
+ * synchrotron_2(x) = x * K_{2/3}(x)
+ *
+ * exceptions: GSL_EDOM, GSL_EUNDRFLW
+ */
+int gsl_sf_synchrotron_2_e(const double x, gsl_sf_result * result);
+double gsl_sf_synchrotron_2(const double x);
+
+
+__END_DECLS
+
+#endif /* __GSL_SF_SYNCHROTRON_H__ */
diff --git a/gsl-1.9/specfunc/gsl_sf_transport.h b/gsl-1.9/specfunc/gsl_sf_transport.h
new file mode 100644
index 0000000..71fc72b
--- /dev/null
+++ b/gsl-1.9/specfunc/gsl_sf_transport.h
@@ -0,0 +1,78 @@
+/* specfunc/gsl_sf_transport.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#ifndef __GSL_SF_TRANSPORT_H__
+#define __GSL_SF_TRANSPORT_H__
+
+#include <gsl/gsl_sf_result.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+
+/* Transport function:
+ * J(n,x) := Integral[ t^n e^t /(e^t - 1)^2, {t,0,x}]
+ */
+
+/* J(2,x)
+ *
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_transport_2_e(const double x, gsl_sf_result * result);
+double gsl_sf_transport_2(const double x);
+
+
+/* J(3,x)
+ *
+ * exceptions: GSL_EDOM, GSL_EUNDRFLW
+ */
+int gsl_sf_transport_3_e(const double x, gsl_sf_result * result);
+double gsl_sf_transport_3(const double x);
+
+
+/* J(4,x)
+ *
+ * exceptions: GSL_EDOM, GSL_EUNDRFLW
+ */
+int gsl_sf_transport_4_e(const double x, gsl_sf_result * result);
+double gsl_sf_transport_4(const double x);
+
+
+/* J(5,x)
+ *
+ * exceptions: GSL_EDOM, GSL_EUNDRFLW
+ */
+int gsl_sf_transport_5_e(const double x, gsl_sf_result * result);
+double gsl_sf_transport_5(const double x);
+
+
+__END_DECLS
+
+#endif /* __GSL_SF_TRANSPORT_H__ */
diff --git a/gsl-1.9/specfunc/gsl_sf_trig.h b/gsl-1.9/specfunc/gsl_sf_trig.h
new file mode 100644
index 0000000..f6606e9
--- /dev/null
+++ b/gsl-1.9/specfunc/gsl_sf_trig.h
@@ -0,0 +1,152 @@
+/* specfunc/gsl_sf_trig.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#ifndef __GSL_SF_TRIG_H__
+#define __GSL_SF_TRIG_H__
+
+#include <gsl/gsl_sf_result.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+
+/* Sin(x) with GSL semantics. This is actually important
+ * because we want to control the error estimate, and trying
+ * to guess the error for the standard library implementation
+ * every time it is used would be a little goofy.
+ */
+int gsl_sf_sin_e(double x, gsl_sf_result * result);
+double gsl_sf_sin(const double x);
+
+
+/* Cos(x) with GSL semantics.
+ */
+int gsl_sf_cos_e(double x, gsl_sf_result * result);
+double gsl_sf_cos(const double x);
+
+
+/* Hypot(x,y) with GSL semantics.
+ */
+int gsl_sf_hypot_e(const double x, const double y, gsl_sf_result * result);
+double gsl_sf_hypot(const double x, const double y);
+
+
+/* Sin(z) for complex z
+ *
+ * exceptions: GSL_EOVRFLW
+ */
+int gsl_sf_complex_sin_e(const double zr, const double zi, gsl_sf_result * szr, gsl_sf_result * szi);
+
+
+/* Cos(z) for complex z
+ *
+ * exceptions: GSL_EOVRFLW
+ */
+int gsl_sf_complex_cos_e(const double zr, const double zi, gsl_sf_result * czr, gsl_sf_result * czi);
+
+
+/* Log(Sin(z)) for complex z
+ *
+ * exceptions: GSL_EDOM, GSL_ELOSS
+ */
+int gsl_sf_complex_logsin_e(const double zr, const double zi, gsl_sf_result * lszr, gsl_sf_result * lszi);
+
+
+/* Sinc(x) = sin(pi x) / (pi x)
+ *
+ * exceptions: none
+ */
+int gsl_sf_sinc_e(double x, gsl_sf_result * result);
+double gsl_sf_sinc(const double x);
+
+
+/* Log(Sinh(x)), x > 0
+ *
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_lnsinh_e(const double x, gsl_sf_result * result);
+double gsl_sf_lnsinh(const double x);
+
+
+/* Log(Cosh(x))
+ *
+ * exceptions: none
+ */
+int gsl_sf_lncosh_e(const double x, gsl_sf_result * result);
+double gsl_sf_lncosh(const double x);
+
+
+/* Convert polar to rectlinear coordinates.
+ *
+ * exceptions: GSL_ELOSS
+ */
+int gsl_sf_polar_to_rect(const double r, const double theta, gsl_sf_result * x, gsl_sf_result * y);
+
+/* Convert rectilinear to polar coordinates.
+ * return argument in range [-pi, pi]
+ *
+ * exceptions: GSL_EDOM
+ */
+int gsl_sf_rect_to_polar(const double x, const double y, gsl_sf_result * r, gsl_sf_result * theta);
+
+/* Sin(x) for quantity with an associated error.
+ */
+int gsl_sf_sin_err_e(const double x, const double dx, gsl_sf_result * result);
+
+
+/* Cos(x) for quantity with an associated error.
+ */
+int gsl_sf_cos_err_e(const double x, const double dx, gsl_sf_result * result);
+
+
+/* Force an angle to lie in the range (-pi,pi].
+ *
+ * exceptions: GSL_ELOSS
+ */
+int gsl_sf_angle_restrict_symm_e(double * theta);
+double gsl_sf_angle_restrict_symm(const double theta);
+
+
+/* Force an angle to lie in the range [0, 2pi)
+ *
+ * exceptions: GSL_ELOSS
+ */
+int gsl_sf_angle_restrict_pos_e(double * theta);
+double gsl_sf_angle_restrict_pos(const double theta);
+
+
+int gsl_sf_angle_restrict_symm_err_e(const double theta, gsl_sf_result * result);
+
+int gsl_sf_angle_restrict_pos_err_e(const double theta, gsl_sf_result * result);
+
+
+__END_DECLS
+
+#endif /* __GSL_SF_TRIG_H__ */
diff --git a/gsl-1.9/specfunc/gsl_sf_zeta.h b/gsl-1.9/specfunc/gsl_sf_zeta.h
new file mode 100644
index 0000000..7b67ca5
--- /dev/null
+++ b/gsl-1.9/specfunc/gsl_sf_zeta.h
@@ -0,0 +1,112 @@
+/* specfunc/gsl_sf_zeta.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#ifndef __GSL_SF_ZETA_H__
+#define __GSL_SF_ZETA_H__
+
+#include <gsl/gsl_sf_result.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+
+/* Riemann Zeta Function
+ * zeta(n) = Sum[ k^(-n), {k,1,Infinity} ]
+ *
+ * n=integer, n != 1
+ * exceptions: GSL_EDOM, GSL_EOVRFLW
+ */
+int gsl_sf_zeta_int_e(const int n, gsl_sf_result * result);
+double gsl_sf_zeta_int(const int n);
+
+
+/* Riemann Zeta Function
+ * zeta(x) = Sum[ k^(-s), {k,1,Infinity} ], s != 1.0
+ *
+ * s != 1.0
+ * exceptions: GSL_EDOM, GSL_EOVRFLW
+ */
+int gsl_sf_zeta_e(const double s, gsl_sf_result * result);
+double gsl_sf_zeta(const double s);
+
+
+/* Riemann Zeta Function minus 1
+ * useful for evaluating the fractional part
+ * of Riemann zeta for large argument
+ *
+ * s != 1.0
+ * exceptions: GSL_EDOM, GSL_EOVRFLW
+ */
+int gsl_sf_zetam1_e(const double s, gsl_sf_result * result);
+double gsl_sf_zetam1(const double s);
+
+
+/* Riemann Zeta Function minus 1 for integer arg
+ * useful for evaluating the fractional part
+ * of Riemann zeta for large argument
+ *
+ * s != 1.0
+ * exceptions: GSL_EDOM, GSL_EOVRFLW
+ */
+int gsl_sf_zetam1_int_e(const int s, gsl_sf_result * result);
+double gsl_sf_zetam1_int(const int s);
+
+
+/* Hurwitz Zeta Function
+ * zeta(s,q) = Sum[ (k+q)^(-s), {k,0,Infinity} ]
+ *
+ * s > 1.0, q > 0.0
+ * exceptions: GSL_EDOM, GSL_EUNDRFLW, GSL_EOVRFLW
+ */
+int gsl_sf_hzeta_e(const double s, const double q, gsl_sf_result * result);
+double gsl_sf_hzeta(const double s, const double q);
+
+
+/* Eta Function
+ * eta(n) = (1-2^(1-n)) zeta(n)
+ *
+ * exceptions: GSL_EUNDRFLW, GSL_EOVRFLW
+ */
+int gsl_sf_eta_int_e(int n, gsl_sf_result * result);
+double gsl_sf_eta_int(const int n);
+
+
+/* Eta Function
+ * eta(s) = (1-2^(1-s)) zeta(s)
+ *
+ * exceptions: GSL_EUNDRFLW, GSL_EOVRFLW
+ */
+int gsl_sf_eta_e(const double s, gsl_sf_result * result);
+double gsl_sf_eta(const double s);
+
+
+__END_DECLS
+
+#endif /* __GSL_SF_ZETA_H__ */
diff --git a/gsl-1.9/specfunc/gsl_specfunc.h b/gsl-1.9/specfunc/gsl_specfunc.h
new file mode 100644
index 0000000..e07b5aa
--- /dev/null
+++ b/gsl-1.9/specfunc/gsl_specfunc.h
@@ -0,0 +1,10 @@
+/* Author: G. Jungman */
+
+
+/* Convenience header */
+#ifndef __GSL_SPECFUNC_H__
+#define __GSL_SPECFUNC_H__
+
+#include <gsl/gsl_sf.h>
+
+#endif /* __GSL_SPECFUNC_H__ */
diff --git a/gsl-1.9/specfunc/hyperg.c b/gsl-1.9/specfunc/hyperg.c
new file mode 100644
index 0000000..624e05e
--- /dev/null
+++ b/gsl-1.9/specfunc/hyperg.c
@@ -0,0 +1,291 @@
+/* specfunc/hyperg.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+/* Miscellaneous implementations of use
+ * for evaluation of hypergeometric functions.
+ */
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_exp.h>
+#include <gsl/gsl_sf_gamma.h>
+
+#include "error.h"
+#include "hyperg.h"
+
+#define SUM_LARGE (1.0e-5*GSL_DBL_MAX)
+
+
+int
+gsl_sf_hyperg_1F1_series_e(const double a, const double b, const double x,
+ gsl_sf_result * result
+ )
+{
+ double an = a;
+ double bn = b;
+ double n = 1.0;
+ double del = 1.0;
+ double abs_del = 1.0;
+ double max_abs_del = 1.0;
+ double sum_val = 1.0;
+ double sum_err = 0.0;
+
+ while(abs_del/fabs(sum_val) > 0.25*GSL_DBL_EPSILON) {
+ double u, abs_u;
+
+ if(bn == 0.0) {
+ DOMAIN_ERROR(result);
+ }
+
+ if(an == 0.0) {
+ result->val = sum_val;
+ result->err = sum_err;
+ result->err += 2.0 * GSL_DBL_EPSILON * n * fabs(sum_val);
+ return GSL_SUCCESS;
+ }
+
+ if (n > 10000.0) {
+ result->val = sum_val;
+ result->err = sum_err;
+ GSL_ERROR ("hypergeometric series failed to converge", GSL_EFAILED);
+ }
+
+ u = x * (an/(bn*n));
+ abs_u = fabs(u);
+ if(abs_u > 1.0 && max_abs_del > GSL_DBL_MAX/abs_u) {
+ result->val = sum_val;
+ result->err = fabs(sum_val);
+ GSL_ERROR ("overflow", GSL_EOVRFLW);
+ }
+ del *= u;
+ sum_val += del;
+ if(fabs(sum_val) > SUM_LARGE) {
+ result->val = sum_val;
+ result->err = fabs(sum_val);
+ GSL_ERROR ("overflow", GSL_EOVRFLW);
+ }
+
+ abs_del = fabs(del);
+ max_abs_del = GSL_MAX_DBL(abs_del, max_abs_del);
+ sum_err += 2.0*GSL_DBL_EPSILON*abs_del;
+
+ an += 1.0;
+ bn += 1.0;
+ n += 1.0;
+ }
+
+ result->val = sum_val;
+ result->err = sum_err;
+ result->err += abs_del;
+ result->err += 2.0 * GSL_DBL_EPSILON * n * fabs(sum_val);
+
+ return GSL_SUCCESS;
+}
+
+
+int
+gsl_sf_hyperg_1F1_large_b_e(const double a, const double b, const double x, gsl_sf_result * result)
+{
+ if(fabs(x/b) < 1.0) {
+ const double u = x/b;
+ const double v = 1.0/(1.0-u);
+ const double pre = pow(v,a);
+ const double uv = u*v;
+ const double uv2 = uv*uv;
+ const double t1 = a*(a+1.0)/(2.0*b)*uv2;
+ const double t2a = a*(a+1.0)/(24.0*b*b)*uv2;
+ const double t2b = 12.0 + 16.0*(a+2.0)*uv + 3.0*(a+2.0)*(a+3.0)*uv2;
+ const double t2 = t2a*t2b;
+ result->val = pre * (1.0 - t1 + t2);
+ result->err = pre * GSL_DBL_EPSILON * (1.0 + fabs(t1) + fabs(t2));
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ DOMAIN_ERROR(result);
+ }
+}
+
+
+int
+gsl_sf_hyperg_U_large_b_e(const double a, const double b, const double x,
+ gsl_sf_result * result,
+ double * ln_multiplier
+ )
+{
+ double N = floor(b); /* b = N + eps */
+ double eps = b - N;
+
+ if(fabs(eps) < GSL_SQRT_DBL_EPSILON) {
+ double lnpre_val;
+ double lnpre_err;
+ gsl_sf_result M;
+ if(b > 1.0) {
+ double tmp = (1.0-b)*log(x);
+ gsl_sf_result lg_bm1;
+ gsl_sf_result lg_a;
+ gsl_sf_lngamma_e(b-1.0, &lg_bm1);
+ gsl_sf_lngamma_e(a, &lg_a);
+ lnpre_val = tmp + x + lg_bm1.val - lg_a.val;
+ lnpre_err = lg_bm1.err + lg_a.err + GSL_DBL_EPSILON * (fabs(x) + fabs(tmp));
+ gsl_sf_hyperg_1F1_large_b_e(1.0-a, 2.0-b, -x, &M);
+ }
+ else {
+ gsl_sf_result lg_1mb;
+ gsl_sf_result lg_1pamb;
+ gsl_sf_lngamma_e(1.0-b, &lg_1mb);
+ gsl_sf_lngamma_e(1.0+a-b, &lg_1pamb);
+ lnpre_val = lg_1mb.val - lg_1pamb.val;
+ lnpre_err = lg_1mb.err + lg_1pamb.err;
+ gsl_sf_hyperg_1F1_large_b_e(a, b, x, &M);
+ }
+
+ if(lnpre_val > GSL_LOG_DBL_MAX-10.0) {
+ result->val = M.val;
+ result->err = M.err;
+ *ln_multiplier = lnpre_val;
+ GSL_ERROR ("overflow", GSL_EOVRFLW);
+ }
+ else {
+ gsl_sf_result epre;
+ int stat_e = gsl_sf_exp_err_e(lnpre_val, lnpre_err, &epre);
+ result->val = epre.val * M.val;
+ result->err = epre.val * M.err + epre.err * fabs(M.val);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ *ln_multiplier = 0.0;
+ return stat_e;
+ }
+ }
+ else {
+ double omb_lnx = (1.0-b)*log(x);
+ gsl_sf_result lg_1mb; double sgn_1mb;
+ gsl_sf_result lg_1pamb; double sgn_1pamb;
+ gsl_sf_result lg_bm1; double sgn_bm1;
+ gsl_sf_result lg_a; double sgn_a;
+ gsl_sf_result M1, M2;
+ double lnpre1_val, lnpre2_val;
+ double lnpre1_err, lnpre2_err;
+ double sgpre1, sgpre2;
+ gsl_sf_hyperg_1F1_large_b_e( a, b, x, &M1);
+ gsl_sf_hyperg_1F1_large_b_e(1.0-a, 2.0-b, x, &M2);
+
+ gsl_sf_lngamma_sgn_e(1.0-b, &lg_1mb, &sgn_1mb);
+ gsl_sf_lngamma_sgn_e(1.0+a-b, &lg_1pamb, &sgn_1pamb);
+
+ gsl_sf_lngamma_sgn_e(b-1.0, &lg_bm1, &sgn_bm1);
+ gsl_sf_lngamma_sgn_e(a, &lg_a, &sgn_a);
+
+ lnpre1_val = lg_1mb.val - lg_1pamb.val;
+ lnpre1_err = lg_1mb.err + lg_1pamb.err;
+ lnpre2_val = lg_bm1.val - lg_a.val - omb_lnx - x;
+ lnpre2_err = lg_bm1.err + lg_a.err + GSL_DBL_EPSILON * (fabs(omb_lnx)+fabs(x));
+ sgpre1 = sgn_1mb * sgn_1pamb;
+ sgpre2 = sgn_bm1 * sgn_a;
+
+ if(lnpre1_val > GSL_LOG_DBL_MAX-10.0 || lnpre2_val > GSL_LOG_DBL_MAX-10.0) {
+ double max_lnpre_val = GSL_MAX(lnpre1_val,lnpre2_val);
+ double max_lnpre_err = GSL_MAX(lnpre1_err,lnpre2_err);
+ double lp1 = lnpre1_val - max_lnpre_val;
+ double lp2 = lnpre2_val - max_lnpre_val;
+ double t1 = sgpre1*exp(lp1);
+ double t2 = sgpre2*exp(lp2);
+ result->val = t1*M1.val + t2*M2.val;
+ result->err = fabs(t1)*M1.err + fabs(t2)*M2.err;
+ result->err += GSL_DBL_EPSILON * exp(max_lnpre_err) * (fabs(t1*M1.val) + fabs(t2*M2.val));
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ *ln_multiplier = max_lnpre_val;
+ GSL_ERROR ("overflow", GSL_EOVRFLW);
+ }
+ else {
+ double t1 = sgpre1*exp(lnpre1_val);
+ double t2 = sgpre2*exp(lnpre2_val);
+ result->val = t1*M1.val + t2*M2.val;
+ result->err = fabs(t1) * M1.err + fabs(t2)*M2.err;
+ result->err += GSL_DBL_EPSILON * (exp(lnpre1_err)*fabs(t1*M1.val) + exp(lnpre2_err)*fabs(t2*M2.val));
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ *ln_multiplier = 0.0;
+ return GSL_SUCCESS;
+ }
+ }
+}
+
+
+
+/* [Carlson, p.109] says the error in truncating this asymptotic series
+ * is less than the absolute value of the first neglected term.
+ *
+ * A termination argument is provided, so that the series will
+ * be summed at most up to n=n_trunc. If n_trunc is set negative,
+ * then the series is summed until it appears to start diverging.
+ */
+int
+gsl_sf_hyperg_2F0_series_e(const double a, const double b, const double x,
+ int n_trunc,
+ gsl_sf_result * result
+ )
+{
+ const int maxiter = 2000;
+ double an = a;
+ double bn = b;
+ double n = 1.0;
+ double sum = 1.0;
+ double del = 1.0;
+ double abs_del = 1.0;
+ double max_abs_del = 1.0;
+ double last_abs_del = 1.0;
+
+ while(abs_del/fabs(sum) > GSL_DBL_EPSILON && n < maxiter) {
+
+ double u = an * (bn/n * x);
+ double abs_u = fabs(u);
+
+ if(abs_u > 1.0 && (max_abs_del > GSL_DBL_MAX/abs_u)) {
+ result->val = sum;
+ result->err = fabs(sum);
+ GSL_ERROR ("overflow", GSL_EOVRFLW);
+ }
+
+ del *= u;
+ sum += del;
+
+ abs_del = fabs(del);
+
+ if(abs_del > last_abs_del) break; /* series is probably starting to grow */
+
+ last_abs_del = abs_del;
+ max_abs_del = GSL_MAX(abs_del, max_abs_del);
+
+ an += 1.0;
+ bn += 1.0;
+ n += 1.0;
+
+ if(an == 0.0 || bn == 0.0) break; /* series terminated */
+
+ if(n_trunc >= 0 && n >= n_trunc) break; /* reached requested timeout */
+ }
+
+ result->val = sum;
+ result->err = GSL_DBL_EPSILON * n + abs_del;
+ if(n >= maxiter)
+ GSL_ERROR ("error", GSL_EMAXITER);
+ else
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/specfunc/hyperg.h b/gsl-1.9/specfunc/hyperg.h
new file mode 100644
index 0000000..daf8fd4
--- /dev/null
+++ b/gsl-1.9/specfunc/hyperg.h
@@ -0,0 +1,78 @@
+/* specfunc/hyperg.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+/* Miscellaneous implementations of use
+ * for evaluation of hypergeometric functions.
+ */
+#ifndef _HYPERG_H_
+#define _HYPERG_H_
+
+#include <gsl/gsl_sf_result.h>
+
+
+/* Direct implementation of 1F1 series.
+ */
+int
+gsl_sf_hyperg_1F1_series_e(const double a, const double b, const double x, gsl_sf_result * result);
+
+
+/* Implementation of the 1F1 related to the
+ * incomplete gamma function: 1F1(1,b,x), b >= 1.
+ */
+int
+gsl_sf_hyperg_1F1_1_e(double b, double x, gsl_sf_result * result);
+
+
+/* 1F1(1,b,x) for integer b >= 1
+ */
+int
+gsl_sf_hyperg_1F1_1_int_e(int b, double x, gsl_sf_result * result);
+
+
+/* Implementation of large b asymptotic.
+ * [Bateman v. I, 6.13.3 (18)]
+ * [Luke, The Special Functions and Their Approximations v. I, p. 129, 4.8 (4)]
+ *
+ * a^2 << b, |x|/|b| < 1 - delta
+ */
+int
+gsl_sf_hyperg_1F1_large_b_e(const double a, const double b, const double x, gsl_sf_result * result);
+
+
+/* Implementation of large b asymptotic.
+ *
+ * Assumes a > 0 is small, x > 0, and |x|<|b|.
+ */
+int
+gsl_sf_hyperg_U_large_b_e(const double a, const double b, const double x,
+ gsl_sf_result * result,
+ double * ln_multiplier
+ );
+
+
+/* Implementation of 2F0 asymptotic series.
+ */
+int
+gsl_sf_hyperg_2F0_series_e(const double a, const double b, const double x, int n_trunc,
+ gsl_sf_result * result);
+
+
+#endif /* !_HYPERG_H_ */
diff --git a/gsl-1.9/specfunc/hyperg_0F1.c b/gsl-1.9/specfunc/hyperg_0F1.c
new file mode 100644
index 0000000..004466e
--- /dev/null
+++ b/gsl-1.9/specfunc/hyperg_0F1.c
@@ -0,0 +1,178 @@
+/* specfunc/hyperg_0F1.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_exp.h>
+#include <gsl/gsl_sf_gamma.h>
+#include <gsl/gsl_sf_bessel.h>
+#include <gsl/gsl_sf_hyperg.h>
+
+#include "error.h"
+
+#define locEPS (1000.0*GSL_DBL_EPSILON)
+
+
+/* Evaluate bessel_I(nu, x), allowing nu < 0.
+ * This is fine here because we do not not allow
+ * nu to be a negative integer.
+ * x > 0.
+ */
+static
+int
+hyperg_0F1_bessel_I(const double nu, const double x, gsl_sf_result * result)
+{
+ if(x > GSL_LOG_DBL_MAX) {
+ OVERFLOW_ERROR(result);
+ }
+
+ if(nu < 0.0) {
+ const double anu = -nu;
+ const double s = 2.0/M_PI * sin(anu*M_PI);
+ const double ex = exp(x);
+ gsl_sf_result I;
+ gsl_sf_result K;
+ int stat_I = gsl_sf_bessel_Inu_scaled_e(anu, x, &I);
+ int stat_K = gsl_sf_bessel_Knu_scaled_e(anu, x, &K);
+ result->val = ex * I.val + s * (K.val / ex);
+ result->err = ex * I.err + fabs(s * K.err/ex);
+ result->err += fabs(s * (K.val/ex)) * GSL_DBL_EPSILON * anu * M_PI;
+ return GSL_ERROR_SELECT_2(stat_K, stat_I);
+ }
+ else {
+ const double ex = exp(x);
+ gsl_sf_result I;
+ int stat_I = gsl_sf_bessel_Inu_scaled_e(nu, x, &I);
+ result->val = ex * I.val;
+ result->err = ex * I.err + GSL_DBL_EPSILON * fabs(result->val);
+ return stat_I;
+ }
+}
+
+
+/* Evaluate bessel_J(nu, x), allowing nu < 0.
+ * This is fine here because we do not not allow
+ * nu to be a negative integer.
+ * x > 0.
+ */
+static
+int
+hyperg_0F1_bessel_J(const double nu, const double x, gsl_sf_result * result)
+{
+ if(nu < 0.0) {
+ const double anu = -nu;
+ const double s = sin(anu*M_PI);
+ const double c = cos(anu*M_PI);
+ gsl_sf_result J;
+ gsl_sf_result Y;
+ int stat_J = gsl_sf_bessel_Jnu_e(anu, x, &J);
+ int stat_Y = gsl_sf_bessel_Ynu_e(anu, x, &Y);
+ result->val = c * J.val - s * Y.val;
+ result->err = fabs(c * J.err) + fabs(s * Y.err);
+ result->err += fabs(anu * M_PI) * GSL_DBL_EPSILON * fabs(J.val + Y.val);
+ return GSL_ERROR_SELECT_2(stat_Y, stat_J);
+ }
+ else {
+ return gsl_sf_bessel_Jnu_e(nu, x, result);
+ }
+}
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int
+gsl_sf_hyperg_0F1_e(double c, double x, gsl_sf_result * result)
+{
+ const double rintc = floor(c + 0.5);
+ const int c_neg_integer = (c < 0.0 && fabs(c - rintc) < locEPS);
+
+ /* CHECK_POINTER(result) */
+
+ if(c == 0.0 || c_neg_integer) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x < 0.0) {
+ gsl_sf_result Jcm1;
+ gsl_sf_result lg_c;
+ double sgn;
+ int stat_g = gsl_sf_lngamma_sgn_e(c, &lg_c, &sgn);
+ int stat_J = hyperg_0F1_bessel_J(c-1.0, 2.0*sqrt(-x), &Jcm1);
+ if(stat_g != GSL_SUCCESS) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return stat_g;
+ }
+ else if(Jcm1.val == 0.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return stat_J;
+ }
+ else {
+ const double tl = log(-x)*0.5*(1.0-c);
+ double ln_pre_val = lg_c.val + tl;
+ double ln_pre_err = lg_c.err + 2.0 * GSL_DBL_EPSILON * fabs(tl);
+ return gsl_sf_exp_mult_err_e(ln_pre_val, ln_pre_err,
+ sgn*Jcm1.val, Jcm1.err,
+ result);
+ }
+ }
+ else if(x == 0.0) {
+ result->val = 1.0;
+ result->err = 1.0;
+ return GSL_SUCCESS;
+ }
+ else {
+ gsl_sf_result Icm1;
+ gsl_sf_result lg_c;
+ double sgn;
+ int stat_g = gsl_sf_lngamma_sgn_e(c, &lg_c, &sgn);
+ int stat_I = hyperg_0F1_bessel_I(c-1.0, 2.0*sqrt(x), &Icm1);
+ if(stat_g != GSL_SUCCESS) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return stat_g;
+ }
+ else if(Icm1.val == 0.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return stat_I;
+ }
+ else {
+ const double tl = log(x)*0.5*(1.0-c);
+ const double ln_pre_val = lg_c.val + tl;
+ const double ln_pre_err = lg_c.err + 2.0 * GSL_DBL_EPSILON * fabs(tl);
+ return gsl_sf_exp_mult_err_e(ln_pre_val, ln_pre_err,
+ sgn*Icm1.val, Icm1.err,
+ result);
+ }
+ }
+}
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_hyperg_0F1(const double c, const double x)
+{
+ EVAL_RESULT(gsl_sf_hyperg_0F1_e(c, x, &result));
+}
diff --git a/gsl-1.9/specfunc/hyperg_1F1.c b/gsl-1.9/specfunc/hyperg_1F1.c
new file mode 100644
index 0000000..15ffd12
--- /dev/null
+++ b/gsl-1.9/specfunc/hyperg_1F1.c
@@ -0,0 +1,2064 @@
+/* specfunc/hyperg_1F1.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_elementary.h>
+#include <gsl/gsl_sf_exp.h>
+#include <gsl/gsl_sf_bessel.h>
+#include <gsl/gsl_sf_gamma.h>
+#include <gsl/gsl_sf_laguerre.h>
+#include <gsl/gsl_sf_hyperg.h>
+
+#include "error.h"
+#include "hyperg.h"
+
+#define _1F1_INT_THRESHOLD (100.0*GSL_DBL_EPSILON)
+
+
+/* Asymptotic result for 1F1(a, b, x) x -> -Infinity.
+ * Assumes b-a != neg integer and b != neg integer.
+ */
+static
+int
+hyperg_1F1_asymp_negx(const double a, const double b, const double x,
+ gsl_sf_result * result)
+{
+ gsl_sf_result lg_b;
+ gsl_sf_result lg_bma;
+ double sgn_b;
+ double sgn_bma;
+
+ int stat_b = gsl_sf_lngamma_sgn_e(b, &lg_b, &sgn_b);
+ int stat_bma = gsl_sf_lngamma_sgn_e(b-a, &lg_bma, &sgn_bma);
+
+ if(stat_b == GSL_SUCCESS && stat_bma == GSL_SUCCESS) {
+ gsl_sf_result F;
+ int stat_F = gsl_sf_hyperg_2F0_series_e(a, 1.0+a-b, -1.0/x, -1, &F);
+ if(F.val != 0) {
+ double ln_term_val = a*log(-x);
+ double ln_term_err = 2.0 * GSL_DBL_EPSILON * (fabs(a) + fabs(ln_term_val));
+ double ln_pre_val = lg_b.val - lg_bma.val - ln_term_val;
+ double ln_pre_err = lg_b.err + lg_bma.err + ln_term_err;
+ int stat_e = gsl_sf_exp_mult_err_e(ln_pre_val, ln_pre_err,
+ sgn_bma*sgn_b*F.val, F.err,
+ result);
+ return GSL_ERROR_SELECT_2(stat_e, stat_F);
+ }
+ else {
+ result->val = 0.0;
+ result->err = 0.0;
+ return stat_F;
+ }
+ }
+ else {
+ DOMAIN_ERROR(result);
+ }
+}
+
+
+/* Asymptotic result for 1F1(a, b, x) x -> +Infinity
+ * Assumes b != neg integer and a != neg integer
+ */
+static
+int
+hyperg_1F1_asymp_posx(const double a, const double b, const double x,
+ gsl_sf_result * result)
+{
+ gsl_sf_result lg_b;
+ gsl_sf_result lg_a;
+ double sgn_b;
+ double sgn_a;
+
+ int stat_b = gsl_sf_lngamma_sgn_e(b, &lg_b, &sgn_b);
+ int stat_a = gsl_sf_lngamma_sgn_e(a, &lg_a, &sgn_a);
+
+ if(stat_a == GSL_SUCCESS && stat_b == GSL_SUCCESS) {
+ gsl_sf_result F;
+ int stat_F = gsl_sf_hyperg_2F0_series_e(b-a, 1.0-a, 1.0/x, -1, &F);
+ if(stat_F == GSL_SUCCESS && F.val != 0) {
+ double lnx = log(x);
+ double ln_term_val = (a-b)*lnx;
+ double ln_term_err = 2.0 * GSL_DBL_EPSILON * (fabs(a) + fabs(b)) * fabs(lnx)
+ + 2.0 * GSL_DBL_EPSILON * fabs(a-b);
+ double ln_pre_val = lg_b.val - lg_a.val + ln_term_val + x;
+ double ln_pre_err = lg_b.err + lg_a.err + ln_term_err + 2.0 * GSL_DBL_EPSILON * fabs(x);
+ int stat_e = gsl_sf_exp_mult_err_e(ln_pre_val, ln_pre_err,
+ sgn_a*sgn_b*F.val, F.err,
+ result);
+ return GSL_ERROR_SELECT_2(stat_e, stat_F);
+ }
+ else {
+ result->val = 0.0;
+ result->err = 0.0;
+ return stat_F;
+ }
+ }
+ else {
+ DOMAIN_ERROR(result);
+ }
+}
+
+/* Asymptotic result from Slater 4.3.7
+ *
+ * To get the general series, write M(a,b,x) as
+ *
+ * M(a,b,x)=sum ((a)_n/(b)_n) (x^n / n!)
+ *
+ * and expand (b)_n in inverse powers of b as follows
+ *
+ * -log(1/(b)_n) = sum_(k=0)^(n-1) log(b+k)
+ * = n log(b) + sum_(k=0)^(n-1) log(1+k/b)
+ *
+ * Do a taylor expansion of the log in 1/b and sum the resulting terms
+ * using the standard algebraic formulas for finite sums of powers of
+ * k. This should then give
+ *
+ * M(a,b,x) = sum_(n=0)^(inf) (a_n/n!) (x/b)^n * (1 - n(n-1)/(2b)
+ * + (n-1)n(n+1)(3n-2)/(24b^2) + ...
+ *
+ * which can be summed explicitly. The trick for summing it is to take
+ * derivatives of sum_(i=0)^(inf) a_n*y^n/n! = (1-y)^(-a);
+ *
+ * [BJG 16/01/2007]
+ */
+
+static
+int
+hyperg_1F1_largebx(const double a, const double b, const double x, gsl_sf_result * result)
+{
+ double y = x/b;
+ double f = exp(-a*log1p(-y));
+ double t1 = -((a*(a+1.0))/(2*b))*pow((y/(1.0-y)),2.0);
+ double t2 = (1/(24*b*b))*((a*(a+1)*y*y)/pow(1-y,4))*(12+8*(2*a+1)*y+(3*a*a-a-2)*y*y);
+ double t3 = (-1/(48*b*b*b*pow(1-y,6)))*a*((a + 1)*((y*((a + 1)*(a*(y*(y*((y*(a - 2) + 16)*(a - 1)) + 72)) + 96)) + 24)*pow(y, 2)));
+ result->val = f * (1 + t1 + t2 + t3);
+ result->err = 2*fabs(f*t3) + 2*GSL_DBL_EPSILON*fabs(result->val);
+ return GSL_SUCCESS;
+}
+
+/* Asymptotic result for x < 2b-4a, 2b-4a large.
+ * [Abramowitz+Stegun, 13.5.21]
+ *
+ * assumes 0 <= x/(2b-4a) <= 1
+ */
+static
+int
+hyperg_1F1_large2bm4a(const double a, const double b, const double x, gsl_sf_result * result)
+{
+ double eta = 2.0*b - 4.0*a;
+ double cos2th = x/eta;
+ double sin2th = 1.0 - cos2th;
+ double th = acos(sqrt(cos2th));
+ double pre_h = 0.25*M_PI*M_PI*eta*eta*cos2th*sin2th;
+ gsl_sf_result lg_b;
+ int stat_lg = gsl_sf_lngamma_e(b, &lg_b);
+ double t1 = 0.5*(1.0-b)*log(0.25*x*eta);
+ double t2 = 0.25*log(pre_h);
+ double lnpre_val = lg_b.val + 0.5*x + t1 - t2;
+ double lnpre_err = lg_b.err + 2.0 * GSL_DBL_EPSILON * (fabs(0.5*x) + fabs(t1) + fabs(t2));
+#if SMALL_ANGLE
+ const double eps = asin(sqrt(cos2th)); /* theta = pi/2 - eps */
+ double s1 = (fmod(a, 1.0) == 0.0) ? 0.0 : sin(a*M_PI);
+ double eta_reduc = (fmod(eta + 1, 4.0) == 0.0) ? 0.0 : fmod(eta + 1, 8.0);
+ double phi1 = 0.25*eta_reduc*M_PI;
+ double phi2 = 0.25*eta*(2*eps + sin(2.0*eps));
+ double s2 = sin(phi1 - phi2);
+#else
+ double s1 = sin(a*M_PI);
+ double s2 = sin(0.25*eta*(2.0*th - sin(2.0*th)) + 0.25*M_PI);
+#endif
+ double ser_val = s1 + s2;
+ double ser_err = 2.0 * GSL_DBL_EPSILON * (fabs(s1) + fabs(s2));
+ int stat_e = gsl_sf_exp_mult_err_e(lnpre_val, lnpre_err,
+ ser_val, ser_err,
+ result);
+ return GSL_ERROR_SELECT_2(stat_e, stat_lg);
+}
+
+
+/* Luke's rational approximation.
+ * See [Luke, Algorithms for the Computation of Mathematical Functions, p.182]
+ *
+ * Like the case of the 2F1 rational approximations, these are
+ * probably guaranteed to converge for x < 0, barring gross
+ * numerical instability in the pre-asymptotic regime.
+ */
+static
+int
+hyperg_1F1_luke(const double a, const double c, const double xin,
+ gsl_sf_result * result)
+{
+ const double RECUR_BIG = 1.0e+50;
+ const int nmax = 5000;
+ int n = 3;
+ const double x = -xin;
+ const double x3 = x*x*x;
+ const double t0 = a/c;
+ const double t1 = (a+1.0)/(2.0*c);
+ const double t2 = (a+2.0)/(2.0*(c+1.0));
+ double F = 1.0;
+ double prec;
+
+ double Bnm3 = 1.0; /* B0 */
+ double Bnm2 = 1.0 + t1 * x; /* B1 */
+ double Bnm1 = 1.0 + t2 * x * (1.0 + t1/3.0 * x); /* B2 */
+
+ double Anm3 = 1.0; /* A0 */
+ double Anm2 = Bnm2 - t0 * x; /* A1 */
+ double Anm1 = Bnm1 - t0*(1.0 + t2*x)*x + t0 * t1 * (c/(c+1.0)) * x*x; /* A2 */
+
+ while(1) {
+ double npam1 = n + a - 1;
+ double npcm1 = n + c - 1;
+ double npam2 = n + a - 2;
+ double npcm2 = n + c - 2;
+ double tnm1 = 2*n - 1;
+ double tnm3 = 2*n - 3;
+ double tnm5 = 2*n - 5;
+ double F1 = (n-a-2) / (2*tnm3*npcm1);
+ double F2 = (n+a)*npam1 / (4*tnm1*tnm3*npcm2*npcm1);
+ double F3 = -npam2*npam1*(n-a-2) / (8*tnm3*tnm3*tnm5*(n+c-3)*npcm2*npcm1);
+ double E = -npam1*(n-c-1) / (2*tnm3*npcm2*npcm1);
+
+ double An = (1.0+F1*x)*Anm1 + (E + F2*x)*x*Anm2 + F3*x3*Anm3;
+ double Bn = (1.0+F1*x)*Bnm1 + (E + F2*x)*x*Bnm2 + F3*x3*Bnm3;
+ double r = An/Bn;
+
+ prec = fabs((F - r)/F);
+ F = r;
+
+ if(prec < GSL_DBL_EPSILON || n > nmax) break;
+
+ if(fabs(An) > RECUR_BIG || fabs(Bn) > RECUR_BIG) {
+ An /= RECUR_BIG;
+ Bn /= RECUR_BIG;
+ Anm1 /= RECUR_BIG;
+ Bnm1 /= RECUR_BIG;
+ Anm2 /= RECUR_BIG;
+ Bnm2 /= RECUR_BIG;
+ Anm3 /= RECUR_BIG;
+ Bnm3 /= RECUR_BIG;
+ }
+ else if(fabs(An) < 1.0/RECUR_BIG || fabs(Bn) < 1.0/RECUR_BIG) {
+ An *= RECUR_BIG;
+ Bn *= RECUR_BIG;
+ Anm1 *= RECUR_BIG;
+ Bnm1 *= RECUR_BIG;
+ Anm2 *= RECUR_BIG;
+ Bnm2 *= RECUR_BIG;
+ Anm3 *= RECUR_BIG;
+ Bnm3 *= RECUR_BIG;
+ }
+
+ n++;
+ Bnm3 = Bnm2;
+ Bnm2 = Bnm1;
+ Bnm1 = Bn;
+ Anm3 = Anm2;
+ Anm2 = Anm1;
+ Anm1 = An;
+ }
+
+ result->val = F;
+ result->err = 2.0 * fabs(F * prec);
+ result->err += 2.0 * GSL_DBL_EPSILON * (n-1.0) * fabs(F);
+
+ return GSL_SUCCESS;
+}
+
+/* Series for 1F1(1,b,x)
+ * b > 0
+ */
+static
+int
+hyperg_1F1_1_series(const double b, const double x, gsl_sf_result * result)
+{
+ double sum_val = 1.0;
+ double sum_err = 0.0;
+ double term = 1.0;
+ double n = 1.0;
+ while(fabs(term/sum_val) > 0.25*GSL_DBL_EPSILON) {
+ term *= x/(b+n-1);
+ sum_val += term;
+ sum_err += 8.0*GSL_DBL_EPSILON*fabs(term) + GSL_DBL_EPSILON*fabs(sum_val);
+ n += 1.0;
+ }
+ result->val = sum_val;
+ result->err = sum_err;
+ result->err += 2.0 * fabs(term);
+ return GSL_SUCCESS;
+}
+
+
+/* 1F1(1,b,x)
+ * b >= 1, b integer
+ */
+static
+int
+hyperg_1F1_1_int(const int b, const double x, gsl_sf_result * result)
+{
+ if(b < 1) {
+ DOMAIN_ERROR(result);
+ }
+ else if(b == 1) {
+ return gsl_sf_exp_e(x, result);
+ }
+ else if(b == 2) {
+ return gsl_sf_exprel_e(x, result);
+ }
+ else if(b == 3) {
+ return gsl_sf_exprel_2_e(x, result);
+ }
+ else {
+ return gsl_sf_exprel_n_e(b-1, x, result);
+ }
+}
+
+
+/* 1F1(1,b,x)
+ * b >=1, b real
+ *
+ * checked OK: [GJ] Thu Oct 1 16:46:35 MDT 1998
+ */
+static
+int
+hyperg_1F1_1(const double b, const double x, gsl_sf_result * result)
+{
+ double ax = fabs(x);
+ double ib = floor(b + 0.1);
+
+ if(b < 1.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(b == 1.0) {
+ return gsl_sf_exp_e(x, result);
+ }
+ else if(b >= 1.4*ax) {
+ return hyperg_1F1_1_series(b, x, result);
+ }
+ else if(fabs(b - ib) < _1F1_INT_THRESHOLD && ib < INT_MAX) {
+ return hyperg_1F1_1_int((int)ib, x, result);
+ }
+ else if(x > 0.0) {
+ if(x > 100.0 && b < 0.75*x) {
+ return hyperg_1F1_asymp_posx(1.0, b, x, result);
+ }
+ else if(b < 1.0e+05) {
+ /* Recurse backward on b, from a
+ * chosen offset point. For x > 0,
+ * which holds here, this should
+ * be a stable direction.
+ */
+ const double off = ceil(1.4*x-b) + 1.0;
+ double bp = b + off;
+ gsl_sf_result M;
+ int stat_s = hyperg_1F1_1_series(bp, x, &M);
+ const double err_rat = M.err / fabs(M.val);
+ while(bp > b+0.1) {
+ /* M(1,b-1) = x/(b-1) M(1,b) + 1 */
+ bp -= 1.0;
+ M.val = 1.0 + x/bp * M.val;
+ }
+ result->val = M.val;
+ result->err = err_rat * fabs(M.val);
+ result->err += 2.0 * GSL_DBL_EPSILON * (fabs(off)+1.0) * fabs(M.val);
+ return stat_s;
+ } else if (fabs(x) < fabs(b) && fabs(x) < sqrt(fabs(b)) * fabs(b-x)) {
+ return hyperg_1F1_largebx(1.0, b, x, result);
+ } else if (fabs(x) > fabs(b)) {
+ return hyperg_1F1_1_series(b, x, result);
+ } else {
+ return hyperg_1F1_large2bm4a(1.0, b, x, result);
+ }
+ }
+ else {
+ /* x <= 0 and b not large compared to |x|
+ */
+ if(ax < 10.0 && b < 10.0) {
+ return hyperg_1F1_1_series(b, x, result);
+ }
+ else if(ax >= 100.0 && GSL_MAX_DBL(fabs(2.0-b),1.0) < 0.99*ax) {
+ return hyperg_1F1_asymp_negx(1.0, b, x, result);
+ }
+ else {
+ return hyperg_1F1_luke(1.0, b, x, result);
+ }
+ }
+}
+
+
+/* 1F1(a,b,x)/Gamma(b) for b->0
+ * [limit of Abramowitz+Stegun 13.3.7]
+ */
+static
+int
+hyperg_1F1_renorm_b0(const double a, const double x, gsl_sf_result * result)
+{
+ double eta = a*x;
+ if(eta > 0.0) {
+ double root_eta = sqrt(eta);
+ gsl_sf_result I1_scaled;
+ int stat_I = gsl_sf_bessel_I1_scaled_e(2.0*root_eta, &I1_scaled);
+ if(I1_scaled.val <= 0.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_ERROR_SELECT_2(stat_I, GSL_EDOM);
+ }
+ else {
+ /* Note that 13.3.7 contains higher terms which are zeroth order
+ in b. These make a non-negligible contribution to the sum.
+ With the first correction term, the I1 above is replaced by
+ I1 + (2/3)*a*(x/(4a))**(3/2)*I2(2*root_eta). We will add
+ this as part of the result and error estimate. */
+
+ const double corr1 =(2.0/3.0)*a*pow(x/(4.0*a),1.5)*gsl_sf_bessel_In_scaled(2, 2.0*root_eta)
+ ;
+ const double lnr_val = 0.5*x + 0.5*log(eta) + fabs(2.0*root_eta) + log(I1_scaled.val+corr1);
+ const double lnr_err = GSL_DBL_EPSILON * (1.5*fabs(x) + 1.0) + fabs((I1_scaled.err+corr1)/I1_scaled.val);
+ return gsl_sf_exp_err_e(lnr_val, lnr_err, result);
+ }
+ }
+ else if(eta == 0.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else {
+ /* eta < 0 */
+ double root_eta = sqrt(-eta);
+ gsl_sf_result J1;
+ int stat_J = gsl_sf_bessel_J1_e(2.0*root_eta, &J1);
+ if(J1.val <= 0.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_ERROR_SELECT_2(stat_J, GSL_EDOM);
+ }
+ else {
+ const double t1 = 0.5*x;
+ const double t2 = 0.5*log(-eta);
+ const double t3 = fabs(x);
+ const double t4 = log(J1.val);
+ const double lnr_val = t1 + t2 + t3 + t4;
+ const double lnr_err = GSL_DBL_EPSILON * (1.5*fabs(x) + 1.0) + fabs(J1.err/J1.val);
+ gsl_sf_result ex;
+ int stat_e = gsl_sf_exp_err_e(lnr_val, lnr_err, &ex);
+ result->val = -ex.val;
+ result->err = ex.err;
+ return stat_e;
+ }
+ }
+
+}
+
+
+/* 1F1'(a,b,x)/1F1(a,b,x)
+ * Uses Gautschi's version of the CF.
+ * [Gautschi, Math. Comp. 31, 994 (1977)]
+ *
+ * Supposedly this suffers from the "anomalous convergence"
+ * problem when b < x. I have seen anomalous convergence
+ * in several of the continued fractions associated with
+ * 1F1(a,b,x). This particular CF formulation seems stable
+ * for b > x. However, it does display a painful artifact
+ * of the anomalous convergence; the convergence plateaus
+ * unless b >>> x. For example, even for b=1000, x=1, this
+ * method locks onto a ratio which is only good to about
+ * 4 digits. Apparently the rest of the digits are hiding
+ * way out on the plateau, but finite-precision lossage
+ * means you will never get them.
+ */
+#if 0
+static
+int
+hyperg_1F1_CF1_p(const double a, const double b, const double x, double * result)
+{
+ const double RECUR_BIG = GSL_SQRT_DBL_MAX;
+ const int maxiter = 5000;
+ int n = 1;
+ double Anm2 = 1.0;
+ double Bnm2 = 0.0;
+ double Anm1 = 0.0;
+ double Bnm1 = 1.0;
+ double a1 = 1.0;
+ double b1 = 1.0;
+ double An = b1*Anm1 + a1*Anm2;
+ double Bn = b1*Bnm1 + a1*Bnm2;
+ double an, bn;
+ double fn = An/Bn;
+
+ while(n < maxiter) {
+ double old_fn;
+ double del;
+ n++;
+ Anm2 = Anm1;
+ Bnm2 = Bnm1;
+ Anm1 = An;
+ Bnm1 = Bn;
+ an = (a+n)*x/((b-x+n-1)*(b-x+n));
+ bn = 1.0;
+ An = bn*Anm1 + an*Anm2;
+ Bn = bn*Bnm1 + an*Bnm2;
+
+ if(fabs(An) > RECUR_BIG || fabs(Bn) > RECUR_BIG) {
+ An /= RECUR_BIG;
+ Bn /= RECUR_BIG;
+ Anm1 /= RECUR_BIG;
+ Bnm1 /= RECUR_BIG;
+ Anm2 /= RECUR_BIG;
+ Bnm2 /= RECUR_BIG;
+ }
+
+ old_fn = fn;
+ fn = An/Bn;
+ del = old_fn/fn;
+
+ if(fabs(del - 1.0) < 10.0*GSL_DBL_EPSILON) break;
+ }
+
+ *result = a/(b-x) * fn;
+
+ if(n == maxiter)
+ GSL_ERROR ("error", GSL_EMAXITER);
+ else
+ return GSL_SUCCESS;
+}
+#endif /* 0 */
+
+
+/* 1F1'(a,b,x)/1F1(a,b,x)
+ * Uses Gautschi's series transformation of the
+ * continued fraction. This is apparently the best
+ * method for getting this ratio in the stable region.
+ * The convergence is monotone and supergeometric
+ * when b > x.
+ * Assumes a >= -1.
+ */
+static
+int
+hyperg_1F1_CF1_p_ser(const double a, const double b, const double x, double * result)
+{
+ if(a == 0.0) {
+ *result = 0.0;
+ return GSL_SUCCESS;
+ }
+ else {
+ const int maxiter = 5000;
+ double sum = 1.0;
+ double pk = 1.0;
+ double rhok = 0.0;
+ int k;
+ for(k=1; k<maxiter; k++) {
+ double ak = (a + k)*x/((b-x+k-1.0)*(b-x+k));
+ rhok = -ak*(1.0 + rhok)/(1.0 + ak*(1.0+rhok));
+ pk *= rhok;
+ sum += pk;
+ if(fabs(pk/sum) < 2.0*GSL_DBL_EPSILON) break;
+ }
+ *result = a/(b-x) * sum;
+ if(k == maxiter)
+ GSL_ERROR ("error", GSL_EMAXITER);
+ else
+ return GSL_SUCCESS;
+ }
+}
+
+
+/* 1F1(a+1,b,x)/1F1(a,b,x)
+ *
+ * I think this suffers from typical "anomalous convergence".
+ * I could not find a region where it was truly useful.
+ */
+#if 0
+static
+int
+hyperg_1F1_CF1(const double a, const double b, const double x, double * result)
+{
+ const double RECUR_BIG = GSL_SQRT_DBL_MAX;
+ const int maxiter = 5000;
+ int n = 1;
+ double Anm2 = 1.0;
+ double Bnm2 = 0.0;
+ double Anm1 = 0.0;
+ double Bnm1 = 1.0;
+ double a1 = b - a - 1.0;
+ double b1 = b - x - 2.0*(a+1.0);
+ double An = b1*Anm1 + a1*Anm2;
+ double Bn = b1*Bnm1 + a1*Bnm2;
+ double an, bn;
+ double fn = An/Bn;
+
+ while(n < maxiter) {
+ double old_fn;
+ double del;
+ n++;
+ Anm2 = Anm1;
+ Bnm2 = Bnm1;
+ Anm1 = An;
+ Bnm1 = Bn;
+ an = (a + n - 1.0) * (b - a - n);
+ bn = b - x - 2.0*(a+n);
+ An = bn*Anm1 + an*Anm2;
+ Bn = bn*Bnm1 + an*Bnm2;
+
+ if(fabs(An) > RECUR_BIG || fabs(Bn) > RECUR_BIG) {
+ An /= RECUR_BIG;
+ Bn /= RECUR_BIG;
+ Anm1 /= RECUR_BIG;
+ Bnm1 /= RECUR_BIG;
+ Anm2 /= RECUR_BIG;
+ Bnm2 /= RECUR_BIG;
+ }
+
+ old_fn = fn;
+ fn = An/Bn;
+ del = old_fn/fn;
+
+ if(fabs(del - 1.0) < 10.0*GSL_DBL_EPSILON) break;
+ }
+
+ *result = fn;
+ if(n == maxiter)
+ GSL_ERROR ("error", GSL_EMAXITER);
+ else
+ return GSL_SUCCESS;
+}
+#endif /* 0 */
+
+
+/* 1F1(a,b+1,x)/1F1(a,b,x)
+ *
+ * This seemed to suffer from "anomalous convergence".
+ * However, I have no theory for this recurrence.
+ */
+#if 0
+static
+int
+hyperg_1F1_CF1_b(const double a, const double b, const double x, double * result)
+{
+ const double RECUR_BIG = GSL_SQRT_DBL_MAX;
+ const int maxiter = 5000;
+ int n = 1;
+ double Anm2 = 1.0;
+ double Bnm2 = 0.0;
+ double Anm1 = 0.0;
+ double Bnm1 = 1.0;
+ double a1 = b + 1.0;
+ double b1 = (b + 1.0) * (b - x);
+ double An = b1*Anm1 + a1*Anm2;
+ double Bn = b1*Bnm1 + a1*Bnm2;
+ double an, bn;
+ double fn = An/Bn;
+
+ while(n < maxiter) {
+ double old_fn;
+ double del;
+ n++;
+ Anm2 = Anm1;
+ Bnm2 = Bnm1;
+ Anm1 = An;
+ Bnm1 = Bn;
+ an = (b + n) * (b + n - 1.0 - a) * x;
+ bn = (b + n) * (b + n - 1.0 - x);
+ An = bn*Anm1 + an*Anm2;
+ Bn = bn*Bnm1 + an*Bnm2;
+
+ if(fabs(An) > RECUR_BIG || fabs(Bn) > RECUR_BIG) {
+ An /= RECUR_BIG;
+ Bn /= RECUR_BIG;
+ Anm1 /= RECUR_BIG;
+ Bnm1 /= RECUR_BIG;
+ Anm2 /= RECUR_BIG;
+ Bnm2 /= RECUR_BIG;
+ }
+
+ old_fn = fn;
+ fn = An/Bn;
+ del = old_fn/fn;
+
+ if(fabs(del - 1.0) < 10.0*GSL_DBL_EPSILON) break;
+ }
+
+ *result = fn;
+ if(n == maxiter)
+ GSL_ERROR ("error", GSL_EMAXITER);
+ else
+ return GSL_SUCCESS;
+}
+#endif /* 0 */
+
+
+/* 1F1(a,b,x)
+ * |a| <= 1, b > 0
+ */
+static
+int
+hyperg_1F1_small_a_bgt0(const double a, const double b, const double x, gsl_sf_result * result)
+{
+ const double bma = b-a;
+ const double oma = 1.0-a;
+ const double ap1mb = 1.0+a-b;
+ const double abs_bma = fabs(bma);
+ const double abs_oma = fabs(oma);
+ const double abs_ap1mb = fabs(ap1mb);
+
+ const double ax = fabs(x);
+
+ if(a == 0.0) {
+ result->val = 1.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(a == 1.0 && b >= 1.0) {
+ return hyperg_1F1_1(b, x, result);
+ }
+ else if(a == -1.0) {
+ result->val = 1.0 + a/b * x;
+ result->err = GSL_DBL_EPSILON * (1.0 + fabs(a/b * x));
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(b >= 1.4*ax) {
+ return gsl_sf_hyperg_1F1_series_e(a, b, x, result);
+ }
+ else if(x > 0.0) {
+ if(x > 100.0 && abs_bma*abs_oma < 0.5*x) {
+ return hyperg_1F1_asymp_posx(a, b, x, result);
+ }
+ else if(b < 5.0e+06) {
+ /* Recurse backward on b from
+ * a suitably high point.
+ */
+ const double b_del = ceil(1.4*x-b) + 1.0;
+ double bp = b + b_del;
+ gsl_sf_result r_Mbp1;
+ gsl_sf_result r_Mb;
+ double Mbp1;
+ double Mb;
+ double Mbm1;
+ int stat_0 = gsl_sf_hyperg_1F1_series_e(a, bp+1.0, x, &r_Mbp1);
+ int stat_1 = gsl_sf_hyperg_1F1_series_e(a, bp, x, &r_Mb);
+ const double err_rat = fabs(r_Mbp1.err/r_Mbp1.val) + fabs(r_Mb.err/r_Mb.val);
+ Mbp1 = r_Mbp1.val;
+ Mb = r_Mb.val;
+ while(bp > b+0.1) {
+ /* Do backward recursion. */
+ Mbm1 = ((x+bp-1.0)*Mb - x*(bp-a)/bp*Mbp1)/(bp-1.0);
+ bp -= 1.0;
+ Mbp1 = Mb;
+ Mb = Mbm1;
+ }
+ result->val = Mb;
+ result->err = err_rat * (fabs(b_del)+1.0) * fabs(Mb);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(Mb);
+ return GSL_ERROR_SELECT_2(stat_0, stat_1);
+ }
+ else if (fabs(x) < fabs(b) && fabs(a*x) < sqrt(fabs(b)) * fabs(b-x)) {
+ return hyperg_1F1_largebx(a, b, x, result);
+ } else {
+ return hyperg_1F1_large2bm4a(a, b, x, result);
+ }
+ }
+ else {
+ /* x < 0 and b not large compared to |x|
+ */
+ if(ax < 10.0 && b < 10.0) {
+ return gsl_sf_hyperg_1F1_series_e(a, b, x, result);
+ }
+ else if(ax >= 100.0 && GSL_MAX(abs_ap1mb,1.0) < 0.99*ax) {
+ return hyperg_1F1_asymp_negx(a, b, x, result);
+ }
+ else {
+ return hyperg_1F1_luke(a, b, x, result);
+ }
+ }
+}
+
+
+/* 1F1(b+eps,b,x)
+ * |eps|<=1, b > 0
+ */
+static
+int
+hyperg_1F1_beps_bgt0(const double eps, const double b, const double x, gsl_sf_result * result)
+{
+ if(b > fabs(x) && fabs(eps) < GSL_SQRT_DBL_EPSILON) {
+ /* If b-a is very small and x/b is not too large we can
+ * use this explicit approximation.
+ *
+ * 1F1(b+eps,b,x) = exp(ax/b) (1 - eps x^2 (v2 + v3 x + ...) + ...)
+ *
+ * v2 = a/(2b^2(b+1))
+ * v3 = a(b-2a)/(3b^3(b+1)(b+2))
+ * ...
+ *
+ * See [Luke, Mathematical Functions and Their Approximations, p.292]
+ *
+ * This cannot be used for b near a negative integer or zero.
+ * Also, if x/b is large the deviation from exp(x) behaviour grows.
+ */
+ double a = b + eps;
+ gsl_sf_result exab;
+ int stat_e = gsl_sf_exp_e(a*x/b, &exab);
+ double v2 = a/(2.0*b*b*(b+1.0));
+ double v3 = a*(b-2.0*a)/(3.0*b*b*b*(b+1.0)*(b+2.0));
+ double v = v2 + v3 * x;
+ double f = (1.0 - eps*x*x*v);
+ result->val = exab.val * f;
+ result->err = exab.err * fabs(f);
+ result->err += fabs(exab.val) * GSL_DBL_EPSILON * (1.0 + fabs(eps*x*x*v));
+ result->err += 4.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return stat_e;
+ }
+ else {
+ /* Otherwise use a Kummer transformation to reduce
+ * it to the small a case.
+ */
+ gsl_sf_result Kummer_1F1;
+ int stat_K = hyperg_1F1_small_a_bgt0(-eps, b, -x, &Kummer_1F1);
+ if(Kummer_1F1.val != 0.0) {
+ int stat_e = gsl_sf_exp_mult_err_e(x, 2.0*GSL_DBL_EPSILON*fabs(x),
+ Kummer_1F1.val, Kummer_1F1.err,
+ result);
+ return GSL_ERROR_SELECT_2(stat_e, stat_K);
+ }
+ else {
+ result->val = 0.0;
+ result->err = 0.0;
+ return stat_K;
+ }
+ }
+}
+
+
+/* 1F1(a,2a,x) = Gamma(a + 1/2) E(x) (|x|/4)^(-a+1/2) scaled_I(a-1/2,|x|/2)
+ *
+ * E(x) = exp(x) x > 0
+ * = 1 x < 0
+ *
+ * a >= 1/2
+ */
+static
+int
+hyperg_1F1_beq2a_pos(const double a, const double x, gsl_sf_result * result)
+{
+ if(x == 0.0) {
+ result->val = 1.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else {
+ gsl_sf_result I;
+ int stat_I = gsl_sf_bessel_Inu_scaled_e(a-0.5, 0.5*fabs(x), &I);
+ gsl_sf_result lg;
+ int stat_g = gsl_sf_lngamma_e(a + 0.5, &lg);
+ double ln_term = (0.5-a)*log(0.25*fabs(x));
+ double lnpre_val = lg.val + GSL_MAX_DBL(x,0.0) + ln_term;
+ double lnpre_err = lg.err + GSL_DBL_EPSILON * (fabs(ln_term) + fabs(x));
+ int stat_e = gsl_sf_exp_mult_err_e(lnpre_val, lnpre_err,
+ I.val, I.err,
+ result);
+ return GSL_ERROR_SELECT_3(stat_e, stat_g, stat_I);
+ }
+}
+
+
+/* Determine middle parts of diagonal recursion along b=2a
+ * from two endpoints, i.e.
+ *
+ * given: M(a,b) and M(a+1,b+2)
+ * get: M(a+1,b+1) and M(a,b+1)
+ */
+#if 0
+inline
+static
+int
+hyperg_1F1_diag_step(const double a, const double b, const double x,
+ const double Mab, const double Map1bp2,
+ double * Map1bp1, double * Mabp1)
+{
+ if(a == b) {
+ *Map1bp1 = Mab;
+ *Mabp1 = Mab - x/(b+1.0) * Map1bp2;
+ }
+ else {
+ *Map1bp1 = Mab - x * (a-b)/(b*(b+1.0)) * Map1bp2;
+ *Mabp1 = (a * *Map1bp1 - b * Mab)/(a-b);
+ }
+ return GSL_SUCCESS;
+}
+#endif /* 0 */
+
+
+/* Determine endpoint of diagonal recursion.
+ *
+ * given: M(a,b) and M(a+1,b+2)
+ * get: M(a+1,b) and M(a+1,b+1)
+ */
+#if 0
+inline
+static
+int
+hyperg_1F1_diag_end_step(const double a, const double b, const double x,
+ const double Mab, const double Map1bp2,
+ double * Map1b, double * Map1bp1)
+{
+ *Map1bp1 = Mab - x * (a-b)/(b*(b+1.0)) * Map1bp2;
+ *Map1b = Mab + x/b * *Map1bp1;
+ return GSL_SUCCESS;
+}
+#endif /* 0 */
+
+
+/* Handle the case of a and b both positive integers.
+ * Assumes a > 0 and b > 0.
+ */
+static
+int
+hyperg_1F1_ab_posint(const int a, const int b, const double x, gsl_sf_result * result)
+{
+ double ax = fabs(x);
+
+ if(a == b) {
+ return gsl_sf_exp_e(x, result); /* 1F1(a,a,x) */
+ }
+ else if(a == 1) {
+ return gsl_sf_exprel_n_e(b-1, x, result); /* 1F1(1,b,x) */
+ }
+ else if(b == a + 1) {
+ gsl_sf_result K;
+ int stat_K = gsl_sf_exprel_n_e(a, -x, &K); /* 1F1(1,1+a,-x) */
+ int stat_e = gsl_sf_exp_mult_err_e(x, 2.0 * GSL_DBL_EPSILON * fabs(x),
+ K.val, K.err,
+ result);
+ return GSL_ERROR_SELECT_2(stat_e, stat_K);
+ }
+ else if(a == b + 1) {
+ gsl_sf_result ex;
+ int stat_e = gsl_sf_exp_e(x, &ex);
+ result->val = ex.val * (1.0 + x/b);
+ result->err = ex.err * (1.0 + x/b);
+ result->err += ex.val * GSL_DBL_EPSILON * (1.0 + fabs(x/b));
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return stat_e;
+ }
+ else if(a == b + 2) {
+ gsl_sf_result ex;
+ int stat_e = gsl_sf_exp_e(x, &ex);
+ double poly = (1.0 + x/b*(2.0 + x/(b+1.0)));
+ result->val = ex.val * poly;
+ result->err = ex.err * fabs(poly);
+ result->err += ex.val * GSL_DBL_EPSILON * (1.0 + fabs(x/b) * (2.0 + fabs(x/(b+1.0))));
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return stat_e;
+ }
+ else if(b == 2*a) {
+ return hyperg_1F1_beq2a_pos(a, x, result); /* 1F1(a,2a,x) */
+ }
+ else if( ( b < 10 && a < 10 && ax < 5.0 )
+ || ( b > a*ax )
+ || ( b > a && ax < 5.0 )
+ ) {
+ return gsl_sf_hyperg_1F1_series_e(a, b, x, result);
+ }
+ else if(b > a && b >= 2*a + x) {
+ /* Use the Gautschi CF series, then
+ * recurse backward to a=0 for normalization.
+ * This will work for either sign of x.
+ */
+ double rap;
+ int stat_CF1 = hyperg_1F1_CF1_p_ser(a, b, x, &rap);
+ double ra = 1.0 + x/a * rap;
+ double Ma = GSL_SQRT_DBL_MIN;
+ double Map1 = ra * Ma;
+ double Mnp1 = Map1;
+ double Mn = Ma;
+ double Mnm1;
+ int n;
+ for(n=a; n>0; n--) {
+ Mnm1 = (n * Mnp1 - (2*n-b+x) * Mn) / (b-n);
+ Mnp1 = Mn;
+ Mn = Mnm1;
+ }
+ result->val = Ma/Mn;
+ result->err = 2.0 * GSL_DBL_EPSILON * (fabs(a) + 1.0) * fabs(Ma/Mn);
+ return stat_CF1;
+ }
+ else if(b > a && b < 2*a + x && b > x) {
+ /* Use the Gautschi series representation of
+ * the continued fraction. Then recurse forward
+ * to the a=b line for normalization. This will
+ * work for either sign of x, although we do need
+ * to check for b > x, for when x is positive.
+ */
+ double rap;
+ int stat_CF1 = hyperg_1F1_CF1_p_ser(a, b, x, &rap);
+ double ra = 1.0 + x/a * rap;
+ gsl_sf_result ex;
+ int stat_ex;
+
+ double Ma = GSL_SQRT_DBL_MIN;
+ double Map1 = ra * Ma;
+ double Mnm1 = Ma;
+ double Mn = Map1;
+ double Mnp1;
+ int n;
+ for(n=a+1; n<b; n++) {
+ Mnp1 = ((b-n)*Mnm1 + (2*n-b+x)*Mn)/n;
+ Mnm1 = Mn;
+ Mn = Mnp1;
+ }
+
+ stat_ex = gsl_sf_exp_e(x, &ex); /* 1F1(b,b,x) */
+ result->val = ex.val * Ma/Mn;
+ result->err = ex.err * fabs(Ma/Mn);
+ result->err += 4.0 * GSL_DBL_EPSILON * (fabs(b-a)+1.0) * fabs(result->val);
+ return GSL_ERROR_SELECT_2(stat_ex, stat_CF1);
+ }
+ else if(x >= 0.0) {
+
+ if(b < a) {
+ /* The point b,b is below the b=2a+x line.
+ * Forward recursion on a from b,b+1 is possible.
+ * Note that a > b + 1 as well, since we already tried a = b + 1.
+ */
+ if(x + log(fabs(x/b)) < GSL_LOG_DBL_MAX-2.0) {
+ double ex = exp(x);
+ int n;
+ double Mnm1 = ex; /* 1F1(b,b,x) */
+ double Mn = ex * (1.0 + x/b); /* 1F1(b+1,b,x) */
+ double Mnp1;
+ for(n=b+1; n<a; n++) {
+ Mnp1 = ((b-n)*Mnm1 + (2*n-b+x)*Mn)/n;
+ Mnm1 = Mn;
+ Mn = Mnp1;
+ }
+ result->val = Mn;
+ result->err = (x + 1.0) * GSL_DBL_EPSILON * fabs(Mn);
+ result->err *= fabs(a-b)+1.0;
+ return GSL_SUCCESS;
+ }
+ else {
+ OVERFLOW_ERROR(result);
+ }
+ }
+ else {
+ /* b > a
+ * b < 2a + x
+ * b <= x (otherwise we would have finished above)
+ *
+ * Gautschi anomalous convergence region. However, we can
+ * recurse forward all the way from a=0,1 because we are
+ * always underneath the b=2a+x line.
+ */
+ gsl_sf_result r_Mn;
+ double Mnm1 = 1.0; /* 1F1(0,b,x) */
+ double Mn; /* 1F1(1,b,x) */
+ double Mnp1;
+ int n;
+ gsl_sf_exprel_n_e(b-1, x, &r_Mn);
+ Mn = r_Mn.val;
+ for(n=1; n<a; n++) {
+ Mnp1 = ((b-n)*Mnm1 + (2*n-b+x)*Mn)/n;
+ Mnm1 = Mn;
+ Mn = Mnp1;
+ }
+ result->val = Mn;
+ result->err = fabs(Mn) * (1.0 + fabs(a)) * fabs(r_Mn.err / r_Mn.val);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(Mn);
+ return GSL_SUCCESS;
+ }
+ }
+ else {
+ /* x < 0
+ * b < a (otherwise we would have tripped one of the above)
+ */
+
+ if(a <= 0.5*(b-x) || a >= -x) {
+ /* Gautschi continued fraction is in the anomalous region,
+ * so we must find another way. We recurse down in b,
+ * from the a=b line.
+ */
+ double ex = exp(x);
+ double Manp1 = ex;
+ double Man = ex * (1.0 + x/(a-1.0));
+ double Manm1;
+ int n;
+ for(n=a-1; n>b; n--) {
+ Manm1 = (-n*(1-n-x)*Man - x*(n-a)*Manp1)/(n*(n-1.0));
+ Manp1 = Man;
+ Man = Manm1;
+ }
+ result->val = Man;
+ result->err = (fabs(x) + 1.0) * GSL_DBL_EPSILON * fabs(Man);
+ result->err *= fabs(b-a)+1.0;
+ return GSL_SUCCESS;
+ }
+ else {
+ /* Pick a0 such that b ~= 2a0 + x, then
+ * recurse down in b from a0,a0 to determine
+ * the values near the line b=2a+x. Then recurse
+ * forward on a from a0.
+ */
+ int a0 = ceil(0.5*(b-x));
+ double Ma0b; /* M(a0,b) */
+ double Ma0bp1; /* M(a0,b+1) */
+ double Ma0p1b; /* M(a0+1,b) */
+ double Mnm1;
+ double Mn;
+ double Mnp1;
+ int n;
+ {
+ double ex = exp(x);
+ double Ma0np1 = ex;
+ double Ma0n = ex * (1.0 + x/(a0-1.0));
+ double Ma0nm1;
+ for(n=a0-1; n>b; n--) {
+ Ma0nm1 = (-n*(1-n-x)*Ma0n - x*(n-a0)*Ma0np1)/(n*(n-1.0));
+ Ma0np1 = Ma0n;
+ Ma0n = Ma0nm1;
+ }
+ Ma0bp1 = Ma0np1;
+ Ma0b = Ma0n;
+ Ma0p1b = (b*(a0+x)*Ma0b + x*(a0-b)*Ma0bp1)/(a0*b);
+ }
+
+ /* Initialise the recurrence correctly BJG */
+
+ if (a0 >= a)
+ {
+ Mn = Ma0b;
+ }
+ else if (a0 + 1>= a)
+ {
+ Mn = Ma0p1b;
+ }
+ else
+ {
+ Mnm1 = Ma0b;
+ Mn = Ma0p1b;
+
+ for(n=a0+1; n<a; n++) {
+ Mnp1 = ((b-n)*Mnm1 + (2*n-b+x)*Mn)/n;
+ Mnm1 = Mn;
+ Mn = Mnp1;
+ }
+ }
+
+ result->val = Mn;
+ result->err = (fabs(x) + 1.0) * GSL_DBL_EPSILON * fabs(Mn);
+ result->err *= fabs(b-a)+1.0;
+ return GSL_SUCCESS;
+ }
+ }
+}
+
+
+/* Evaluate a <= 0, a integer, cases directly. (Polynomial; Horner)
+ * When the terms are all positive, this
+ * must work. We will assume this here.
+ */
+static
+int
+hyperg_1F1_a_negint_poly(const int a, const double b, const double x, gsl_sf_result * result)
+{
+ if(a == 0) {
+ result->val = 1.0;
+ result->err = 1.0;
+ return GSL_SUCCESS;
+ }
+ else {
+ int N = -a;
+ double poly = 1.0;
+ int k;
+ for(k=N-1; k>=0; k--) {
+ double t = (a+k)/(b+k) * (x/(k+1));
+ double r = t + 1.0/poly;
+ if(r > 0.9*GSL_DBL_MAX/poly) {
+ OVERFLOW_ERROR(result);
+ }
+ else {
+ poly *= r; /* P_n = 1 + t_n P_{n-1} */
+ }
+ }
+ result->val = poly;
+ result->err = 2.0 * (sqrt(N) + 1.0) * GSL_DBL_EPSILON * fabs(poly);
+ return GSL_SUCCESS;
+ }
+}
+
+
+/* Evaluate negative integer a case by relation
+ * to Laguerre polynomials. This is more general than
+ * the direct polynomial evaluation, but is safe
+ * for all values of x.
+ *
+ * 1F1(-n,b,x) = n!/(b)_n Laguerre[n,b-1,x]
+ * = n B(b,n) Laguerre[n,b-1,x]
+ *
+ * assumes b is not a negative integer
+ */
+static
+int
+hyperg_1F1_a_negint_lag(const int a, const double b, const double x, gsl_sf_result * result)
+{
+ const int n = -a;
+
+ gsl_sf_result lag;
+ const int stat_l = gsl_sf_laguerre_n_e(n, b-1.0, x, &lag);
+ if(b < 0.0) {
+ gsl_sf_result lnfact;
+ gsl_sf_result lng1;
+ gsl_sf_result lng2;
+ double s1, s2;
+ const int stat_f = gsl_sf_lnfact_e(n, &lnfact);
+ const int stat_g1 = gsl_sf_lngamma_sgn_e(b + n, &lng1, &s1);
+ const int stat_g2 = gsl_sf_lngamma_sgn_e(b, &lng2, &s2);
+ const double lnpre_val = lnfact.val - (lng1.val - lng2.val);
+ const double lnpre_err = lnfact.err + lng1.err + lng2.err
+ + 2.0 * GSL_DBL_EPSILON * fabs(lnpre_val);
+ const int stat_e = gsl_sf_exp_mult_err_e(lnpre_val, lnpre_err,
+ s1*s2*lag.val, lag.err,
+ result);
+ return GSL_ERROR_SELECT_5(stat_e, stat_l, stat_g1, stat_g2, stat_f);
+ }
+ else {
+ gsl_sf_result lnbeta;
+ gsl_sf_lnbeta_e(b, n, &lnbeta);
+ if(fabs(lnbeta.val) < 0.1) {
+ /* As we have noted, when B(x,y) is near 1,
+ * evaluating log(B(x,y)) is not accurate.
+ * Instead we evaluate B(x,y) directly.
+ */
+ const double ln_term_val = log(1.25*n);
+ const double ln_term_err = 2.0 * GSL_DBL_EPSILON * ln_term_val;
+ gsl_sf_result beta;
+ int stat_b = gsl_sf_beta_e(b, n, &beta);
+ int stat_e = gsl_sf_exp_mult_err_e(ln_term_val, ln_term_err,
+ lag.val, lag.err,
+ result);
+ result->val *= beta.val/1.25;
+ result->err *= beta.val/1.25;
+ return GSL_ERROR_SELECT_3(stat_e, stat_l, stat_b);
+ }
+ else {
+ /* B(x,y) was not near 1, so it is safe to use
+ * the logarithmic values.
+ */
+ const double ln_n = log(n);
+ const double ln_term_val = lnbeta.val + ln_n;
+ const double ln_term_err = lnbeta.err + 2.0 * GSL_DBL_EPSILON * fabs(ln_n);
+ int stat_e = gsl_sf_exp_mult_err_e(ln_term_val, ln_term_err,
+ lag.val, lag.err,
+ result);
+ return GSL_ERROR_SELECT_2(stat_e, stat_l);
+ }
+ }
+}
+
+
+/* Handle negative integer a case for x > 0 and
+ * generic b.
+ *
+ * Combine [Abramowitz+Stegun, 13.6.9 + 13.6.27]
+ * M(-n,b,x) = (-1)^n / (b)_n U(-n,b,x) = n! / (b)_n Laguerre^(b-1)_n(x)
+ */
+#if 0
+static
+int
+hyperg_1F1_a_negint_U(const int a, const double b, const double x, gsl_sf_result * result)
+{
+ const int n = -a;
+ const double sgn = ( GSL_IS_ODD(n) ? -1.0 : 1.0 );
+ double sgpoch;
+ gsl_sf_result lnpoch;
+ gsl_sf_result U;
+ const int stat_p = gsl_sf_lnpoch_sgn_e(b, n, &lnpoch, &sgpoch);
+ const int stat_U = gsl_sf_hyperg_U_e(-n, b, x, &U);
+ const int stat_e = gsl_sf_exp_mult_err_e(-lnpoch.val, lnpoch.err,
+ sgn * sgpoch * U.val, U.err,
+ result);
+ return GSL_ERROR_SELECT_3(stat_e, stat_U, stat_p);
+}
+#endif
+
+
+/* Assumes a <= -1, b <= -1, and b <= a.
+ */
+static
+int
+hyperg_1F1_ab_negint(const int a, const int b, const double x, gsl_sf_result * result)
+{
+ if(x == 0.0) {
+ result->val = 1.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(x > 0.0) {
+ return hyperg_1F1_a_negint_poly(a, b, x, result);
+ }
+ else {
+ /* Apply a Kummer transformation to make x > 0 so
+ * we can evaluate the polynomial safely. Of course,
+ * this assumes b <= a, which must be true for
+ * a<0 and b<0, since otherwise the thing is undefined.
+ */
+ gsl_sf_result K;
+ int stat_K = hyperg_1F1_a_negint_poly(b-a, b, -x, &K);
+ int stat_e = gsl_sf_exp_mult_err_e(x, 2.0 * GSL_DBL_EPSILON * fabs(x),
+ K.val, K.err,
+ result);
+ return GSL_ERROR_SELECT_2(stat_e, stat_K);
+ }
+}
+
+
+/* [Abramowitz+Stegun, 13.1.3]
+ *
+ * M(a,b,x) = Gamma(1+a-b)/Gamma(2-b) x^(1-b) *
+ * { Gamma(b)/Gamma(a) M(1+a-b,2-b,x) - (b-1) U(1+a-b,2-b,x) }
+ *
+ * b not an integer >= 2
+ * a-b not a negative integer
+ */
+static
+int
+hyperg_1F1_U(const double a, const double b, const double x, gsl_sf_result * result)
+{
+ const double bp = 2.0 - b;
+ const double ap = a - b + 1.0;
+
+ gsl_sf_result lg_ap, lg_bp;
+ double sg_ap;
+ int stat_lg0 = gsl_sf_lngamma_sgn_e(ap, &lg_ap, &sg_ap);
+ int stat_lg1 = gsl_sf_lngamma_e(bp, &lg_bp);
+ int stat_lg2 = GSL_ERROR_SELECT_2(stat_lg0, stat_lg1);
+ double t1 = (bp-1.0) * log(x);
+ double lnpre_val = lg_ap.val - lg_bp.val + t1;
+ double lnpre_err = lg_ap.err + lg_bp.err + 2.0 * GSL_DBL_EPSILON * fabs(t1);
+
+ gsl_sf_result lg_2mbp, lg_1papmbp;
+ double sg_2mbp, sg_1papmbp;
+ int stat_lg3 = gsl_sf_lngamma_sgn_e(2.0-bp, &lg_2mbp, &sg_2mbp);
+ int stat_lg4 = gsl_sf_lngamma_sgn_e(1.0+ap-bp, &lg_1papmbp, &sg_1papmbp);
+ int stat_lg5 = GSL_ERROR_SELECT_2(stat_lg3, stat_lg4);
+ double lnc1_val = lg_2mbp.val - lg_1papmbp.val;
+ double lnc1_err = lg_2mbp.err + lg_1papmbp.err
+ + GSL_DBL_EPSILON * (fabs(lg_2mbp.val) + fabs(lg_1papmbp.val));
+
+ gsl_sf_result M;
+ gsl_sf_result_e10 U;
+ int stat_F = gsl_sf_hyperg_1F1_e(ap, bp, x, &M);
+ int stat_U = gsl_sf_hyperg_U_e10_e(ap, bp, x, &U);
+ int stat_FU = GSL_ERROR_SELECT_2(stat_F, stat_U);
+
+ gsl_sf_result_e10 term_M;
+ int stat_e0 = gsl_sf_exp_mult_err_e10_e(lnc1_val, lnc1_err,
+ sg_2mbp*sg_1papmbp*M.val, M.err,
+ &term_M);
+
+ const double ombp = 1.0 - bp;
+ const double Uee_val = U.e10*M_LN10;
+ const double Uee_err = 2.0 * GSL_DBL_EPSILON * fabs(Uee_val);
+ const double Mee_val = term_M.e10*M_LN10;
+ const double Mee_err = 2.0 * GSL_DBL_EPSILON * fabs(Mee_val);
+ int stat_e1;
+
+ /* Do a little dance with the exponential prefactors
+ * to avoid overflows in intermediate results.
+ */
+ if(Uee_val > Mee_val) {
+ const double factorM_val = exp(Mee_val-Uee_val);
+ const double factorM_err = 2.0 * GSL_DBL_EPSILON * (fabs(Mee_val-Uee_val)+1.0) * factorM_val;
+ const double inner_val = term_M.val*factorM_val - ombp*U.val;
+ const double inner_err =
+ term_M.err*factorM_val + fabs(ombp) * U.err
+ + fabs(term_M.val) * factorM_err
+ + GSL_DBL_EPSILON * (fabs(term_M.val*factorM_val) + fabs(ombp*U.val));
+ stat_e1 = gsl_sf_exp_mult_err_e(lnpre_val+Uee_val, lnpre_err+Uee_err,
+ sg_ap*inner_val, inner_err,
+ result);
+ }
+ else {
+ const double factorU_val = exp(Uee_val - Mee_val);
+ const double factorU_err = 2.0 * GSL_DBL_EPSILON * (fabs(Mee_val-Uee_val)+1.0) * factorU_val;
+ const double inner_val = term_M.val - ombp*factorU_val*U.val;
+ const double inner_err =
+ term_M.err + fabs(ombp*factorU_val*U.err)
+ + fabs(ombp*factorU_err*U.val)
+ + GSL_DBL_EPSILON * (fabs(term_M.val) + fabs(ombp*factorU_val*U.val));
+ stat_e1 = gsl_sf_exp_mult_err_e(lnpre_val+Mee_val, lnpre_err+Mee_err,
+ sg_ap*inner_val, inner_err,
+ result);
+ }
+
+ return GSL_ERROR_SELECT_5(stat_e1, stat_e0, stat_FU, stat_lg5, stat_lg2);
+}
+
+
+/* Handle case of generic positive a, b.
+ * Assumes b-a is not a negative integer.
+ */
+static
+int
+hyperg_1F1_ab_pos(const double a, const double b,
+ const double x,
+ gsl_sf_result * result)
+{
+ const double ax = fabs(x);
+
+ if( ( b < 10.0 && a < 10.0 && ax < 5.0 )
+ || ( b > a*ax )
+ || ( b > a && ax < 5.0 )
+ ) {
+ return gsl_sf_hyperg_1F1_series_e(a, b, x, result);
+ }
+ else if( x < -100.0
+ && GSL_MAX_DBL(fabs(a),1.0)*GSL_MAX_DBL(fabs(1.0+a-b),1.0) < 0.7*fabs(x)
+ ) {
+ /* Large negative x asymptotic.
+ */
+ return hyperg_1F1_asymp_negx(a, b, x, result);
+ }
+ else if( x > 100.0
+ && GSL_MAX_DBL(fabs(b-a),1.0)*GSL_MAX_DBL(fabs(1.0-a),1.0) < 0.7*fabs(x)
+ ) {
+ /* Large positive x asymptotic.
+ */
+ return hyperg_1F1_asymp_posx(a, b, x, result);
+ }
+ else if(fabs(b-a) <= 1.0) {
+ /* Directly handle b near a.
+ */
+ return hyperg_1F1_beps_bgt0(a-b, b, x, result); /* a = b + eps */
+ }
+
+ else if(b > a && b >= 2*a + x) {
+ /* Use the Gautschi CF series, then
+ * recurse backward to a near 0 for normalization.
+ * This will work for either sign of x.
+ */
+ double rap;
+ int stat_CF1 = hyperg_1F1_CF1_p_ser(a, b, x, &rap);
+ double ra = 1.0 + x/a * rap;
+
+ double Ma = GSL_SQRT_DBL_MIN;
+ double Map1 = ra * Ma;
+ double Mnp1 = Map1;
+ double Mn = Ma;
+ double Mnm1;
+ gsl_sf_result Mn_true;
+ int stat_Mt;
+ double n;
+ for(n=a; n>0.5; n -= 1.0) {
+ Mnm1 = (n * Mnp1 - (2.0*n-b+x) * Mn) / (b-n);
+ Mnp1 = Mn;
+ Mn = Mnm1;
+ }
+
+ stat_Mt = hyperg_1F1_small_a_bgt0(n, b, x, &Mn_true);
+
+ result->val = (Ma/Mn) * Mn_true.val;
+ result->err = fabs(Ma/Mn) * Mn_true.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * (fabs(a)+1.0) * fabs(result->val);
+ return GSL_ERROR_SELECT_2(stat_Mt, stat_CF1);
+ }
+ else if(b > a && b < 2*a + x && b > x) {
+ /* Use the Gautschi series representation of
+ * the continued fraction. Then recurse forward
+ * to near the a=b line for normalization. This will
+ * work for either sign of x, although we do need
+ * to check for b > x, which is relevant when x is positive.
+ */
+ gsl_sf_result Mn_true;
+ int stat_Mt;
+ double rap;
+ int stat_CF1 = hyperg_1F1_CF1_p_ser(a, b, x, &rap);
+ double ra = 1.0 + x/a * rap;
+ double Ma = GSL_SQRT_DBL_MIN;
+ double Mnm1 = Ma;
+ double Mn = ra * Mnm1;
+ double Mnp1;
+ double n;
+ for(n=a+1.0; n<b-0.5; n += 1.0) {
+ Mnp1 = ((b-n)*Mnm1 + (2*n-b+x)*Mn)/n;
+ Mnm1 = Mn;
+ Mn = Mnp1;
+ }
+ stat_Mt = hyperg_1F1_beps_bgt0(n-b, b, x, &Mn_true);
+ result->val = Ma/Mn * Mn_true.val;
+ result->err = fabs(Ma/Mn) * Mn_true.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * (fabs(b-a)+1.0) * fabs(result->val);
+ return GSL_ERROR_SELECT_2(stat_Mt, stat_CF1);
+ }
+ else if(x >= 0.0) {
+
+ if(b < a) {
+ /* Forward recursion on a from a=b+eps-1,b+eps.
+ */
+ double N = floor(a-b);
+ double eps = a - b - N;
+ gsl_sf_result r_M0;
+ gsl_sf_result r_M1;
+ int stat_0 = hyperg_1F1_beps_bgt0(eps-1.0, b, x, &r_M0);
+ int stat_1 = hyperg_1F1_beps_bgt0(eps, b, x, &r_M1);
+ double M0 = r_M0.val;
+ double M1 = r_M1.val;
+
+ double Mam1 = M0;
+ double Ma = M1;
+ double Map1;
+ double ap;
+ double start_pair = fabs(M0) + fabs(M1);
+ double minim_pair = GSL_DBL_MAX;
+ double pair_ratio;
+ double rat_0 = fabs(r_M0.err/r_M0.val);
+ double rat_1 = fabs(r_M1.err/r_M1.val);
+ for(ap=b+eps; ap<a-0.1; ap += 1.0) {
+ Map1 = ((b-ap)*Mam1 + (2.0*ap-b+x)*Ma)/ap;
+ Mam1 = Ma;
+ Ma = Map1;
+ minim_pair = GSL_MIN_DBL(fabs(Mam1) + fabs(Ma), minim_pair);
+ }
+ pair_ratio = start_pair/minim_pair;
+ result->val = Ma;
+ result->err = 2.0 * (rat_0 + rat_1 + GSL_DBL_EPSILON) * (fabs(b-a)+1.0) * fabs(Ma);
+ result->err += 2.0 * (rat_0 + rat_1) * pair_ratio*pair_ratio * fabs(Ma);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(Ma);
+ return GSL_ERROR_SELECT_2(stat_0, stat_1);
+ }
+ else {
+ /* b > a
+ * b < 2a + x
+ * b <= x
+ *
+ * Recurse forward on a from a=eps,eps+1.
+ */
+ double eps = a - floor(a);
+ gsl_sf_result r_Mnm1;
+ gsl_sf_result r_Mn;
+ int stat_0 = hyperg_1F1_small_a_bgt0(eps, b, x, &r_Mnm1);
+ int stat_1 = hyperg_1F1_small_a_bgt0(eps+1.0, b, x, &r_Mn);
+ double Mnm1 = r_Mnm1.val;
+ double Mn = r_Mn.val;
+ double Mnp1;
+
+ double n;
+ double start_pair = fabs(Mn) + fabs(Mnm1);
+ double minim_pair = GSL_DBL_MAX;
+ double pair_ratio;
+ double rat_0 = fabs(r_Mnm1.err/r_Mnm1.val);
+ double rat_1 = fabs(r_Mn.err/r_Mn.val);
+ for(n=eps+1.0; n<a-0.1; n++) {
+ Mnp1 = ((b-n)*Mnm1 + (2*n-b+x)*Mn)/n;
+ Mnm1 = Mn;
+ Mn = Mnp1;
+ minim_pair = GSL_MIN_DBL(fabs(Mn) + fabs(Mnm1), minim_pair);
+ }
+ pair_ratio = start_pair/minim_pair;
+ result->val = Mn;
+ result->err = 2.0 * (rat_0 + rat_1 + GSL_DBL_EPSILON) * (fabs(a)+1.0) * fabs(Mn);
+ result->err += 2.0 * (rat_0 + rat_1) * pair_ratio*pair_ratio * fabs(Mn);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(Mn);
+ return GSL_ERROR_SELECT_2(stat_0, stat_1);
+ }
+ }
+ else {
+ /* x < 0
+ * b < a
+ */
+
+ if(a <= 0.5*(b-x) || a >= -x) {
+ /* Recurse down in b, from near the a=b line, b=a+eps,a+eps-1.
+ */
+ double N = floor(a - b);
+ double eps = 1.0 + N - a + b;
+ gsl_sf_result r_Manp1;
+ gsl_sf_result r_Man;
+ int stat_0 = hyperg_1F1_beps_bgt0(-eps, a+eps, x, &r_Manp1);
+ int stat_1 = hyperg_1F1_beps_bgt0(1.0-eps, a+eps-1.0, x, &r_Man);
+ double Manp1 = r_Manp1.val;
+ double Man = r_Man.val;
+ double Manm1;
+
+ double n;
+ double start_pair = fabs(Manp1) + fabs(Man);
+ double minim_pair = GSL_DBL_MAX;
+ double pair_ratio;
+ double rat_0 = fabs(r_Manp1.err/r_Manp1.val);
+ double rat_1 = fabs(r_Man.err/r_Man.val);
+ for(n=a+eps-1.0; n>b+0.1; n -= 1.0) {
+ Manm1 = (-n*(1-n-x)*Man - x*(n-a)*Manp1)/(n*(n-1.0));
+ Manp1 = Man;
+ Man = Manm1;
+ minim_pair = GSL_MIN_DBL(fabs(Manp1) + fabs(Man), minim_pair);
+ }
+
+ /* FIXME: this is a nasty little hack; there is some
+ (transient?) instability in this recurrence for some
+ values. I can tell when it happens, which is when
+ this pair_ratio is large. But I do not know how to
+ measure the error in terms of it. I guessed quadratic
+ below, but it is probably worse than that.
+ */
+ pair_ratio = start_pair/minim_pair;
+ result->val = Man;
+ result->err = 2.0 * (rat_0 + rat_1 + GSL_DBL_EPSILON) * (fabs(b-a)+1.0) * fabs(Man);
+ result->err *= pair_ratio*pair_ratio + 1.0;
+ return GSL_ERROR_SELECT_2(stat_0, stat_1);
+ }
+ else {
+ /* Pick a0 such that b ~= 2a0 + x, then
+ * recurse down in b from a0,a0 to determine
+ * the values near the line b=2a+x. Then recurse
+ * forward on a from a0.
+ */
+ double epsa = a - floor(a);
+ double a0 = floor(0.5*(b-x)) + epsa;
+ double N = floor(a0 - b);
+ double epsb = 1.0 + N - a0 + b;
+ double Ma0b;
+ double Ma0bp1;
+ double Ma0p1b;
+ int stat_a0;
+ double Mnm1;
+ double Mn;
+ double Mnp1;
+ double n;
+ double err_rat;
+ {
+ gsl_sf_result r_Ma0np1;
+ gsl_sf_result r_Ma0n;
+ int stat_0 = hyperg_1F1_beps_bgt0(-epsb, a0+epsb, x, &r_Ma0np1);
+ int stat_1 = hyperg_1F1_beps_bgt0(1.0-epsb, a0+epsb-1.0, x, &r_Ma0n);
+ double Ma0np1 = r_Ma0np1.val;
+ double Ma0n = r_Ma0n.val;
+ double Ma0nm1;
+
+ err_rat = fabs(r_Ma0np1.err/r_Ma0np1.val) + fabs(r_Ma0n.err/r_Ma0n.val);
+
+ for(n=a0+epsb-1.0; n>b+0.1; n -= 1.0) {
+ Ma0nm1 = (-n*(1-n-x)*Ma0n - x*(n-a0)*Ma0np1)/(n*(n-1.0));
+ Ma0np1 = Ma0n;
+ Ma0n = Ma0nm1;
+ }
+ Ma0bp1 = Ma0np1;
+ Ma0b = Ma0n;
+ Ma0p1b = (b*(a0+x)*Ma0b+x*(a0-b)*Ma0bp1)/(a0*b); /* right-down hook */
+ stat_a0 = GSL_ERROR_SELECT_2(stat_0, stat_1);
+ }
+
+
+ /* Initialise the recurrence correctly BJG */
+
+ if (a0 >= a - 0.1)
+ {
+ Mn = Ma0b;
+ }
+ else if (a0 + 1>= a - 0.1)
+ {
+ Mn = Ma0p1b;
+ }
+ else
+ {
+ Mnm1 = Ma0b;
+ Mn = Ma0p1b;
+
+ for(n=a0+1.0; n<a-0.1; n += 1.0) {
+ Mnp1 = ((b-n)*Mnm1 + (2*n-b+x)*Mn)/n;
+ Mnm1 = Mn;
+ Mn = Mnp1;
+ }
+ }
+
+ result->val = Mn;
+ result->err = (err_rat + GSL_DBL_EPSILON) * (fabs(b-a)+1.0) * fabs(Mn);
+ return stat_a0;
+ }
+ }
+}
+
+
+/* Assumes b != integer
+ * Assumes a != integer when x > 0
+ * Assumes b-a != neg integer when x < 0
+ */
+static
+int
+hyperg_1F1_ab_neg(const double a, const double b, const double x,
+ gsl_sf_result * result)
+{
+ const double bma = b - a;
+ const double abs_x = fabs(x);
+ const double abs_a = fabs(a);
+ const double abs_b = fabs(b);
+ const double size_a = GSL_MAX(abs_a, 1.0);
+ const double size_b = GSL_MAX(abs_b, 1.0);
+ const int bma_integer = ( bma - floor(bma+0.5) < _1F1_INT_THRESHOLD );
+
+ if( (abs_a < 10.0 && abs_b < 10.0 && abs_x < 5.0)
+ || (b > 0.8*GSL_MAX(fabs(a),1.0)*fabs(x))
+ ) {
+ return gsl_sf_hyperg_1F1_series_e(a, b, x, result);
+ }
+ else if( x > 0.0
+ && size_b > size_a
+ && size_a*log(M_E*x/size_b) < GSL_LOG_DBL_EPSILON+7.0
+ ) {
+ /* Series terms are positive definite up until
+ * there is a sign change. But by then the
+ * terms are small due to the last condition.
+ */
+ return gsl_sf_hyperg_1F1_series_e(a, b, x, result);
+ }
+ else if( (abs_x < 5.0 && fabs(bma) < 10.0 && abs_b < 10.0)
+ || (b > 0.8*GSL_MAX_DBL(fabs(bma),1.0)*abs_x)
+ ) {
+ /* Use Kummer transformation to render series safe.
+ */
+ gsl_sf_result Kummer_1F1;
+ int stat_K = gsl_sf_hyperg_1F1_series_e(bma, b, -x, &Kummer_1F1);
+ int stat_e = gsl_sf_exp_mult_err_e(x, GSL_DBL_EPSILON * fabs(x),
+ Kummer_1F1.val, Kummer_1F1.err,
+ result);
+ return GSL_ERROR_SELECT_2(stat_e, stat_K);
+ }
+ else if( x < -30.0
+ && GSL_MAX_DBL(fabs(a),1.0)*GSL_MAX_DBL(fabs(1.0+a-b),1.0) < 0.99*fabs(x)
+ ) {
+ /* Large negative x asymptotic.
+ * Note that we do not check if b-a is a negative integer.
+ */
+ return hyperg_1F1_asymp_negx(a, b, x, result);
+ }
+ else if( x > 100.0
+ && GSL_MAX_DBL(fabs(bma),1.0)*GSL_MAX_DBL(fabs(1.0-a),1.0) < 0.99*fabs(x)
+ ) {
+ /* Large positive x asymptotic.
+ * Note that we do not check if a is a negative integer.
+ */
+ return hyperg_1F1_asymp_posx(a, b, x, result);
+ }
+ else if(x > 0.0 && !(bma_integer && bma > 0.0)) {
+ return hyperg_1F1_U(a, b, x, result);
+ }
+ else {
+ /* FIXME: if all else fails, try the series... BJG */
+ if (x < 0.0) {
+ /* Apply Kummer Transformation */
+ int status = gsl_sf_hyperg_1F1_series_e(b-a, b, -x, result);
+ double K_factor = exp(x);
+ result->val *= K_factor;
+ result->err *= K_factor;
+ return status;
+ } else {
+ int status = gsl_sf_hyperg_1F1_series_e(a, b, x, result);
+ return status;
+ }
+
+ /* Sadness... */
+ /* result->val = 0.0; */
+ /* result->err = 0.0; */
+ /* GSL_ERROR ("error", GSL_EUNIMPL); */
+ }
+}
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int
+gsl_sf_hyperg_1F1_int_e(const int a, const int b, const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x == 0.0) {
+ result->val = 1.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(a == b) {
+ return gsl_sf_exp_e(x, result);
+ }
+ else if(b == 0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(a == 0) {
+ result->val = 1.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(b < 0 && (a < b || a > 0)) {
+ /* Standard domain error due to singularity. */
+ DOMAIN_ERROR(result);
+ }
+ else if(x > 100.0 && GSL_MAX_DBL(1.0,fabs(b-a))*GSL_MAX_DBL(1.0,fabs(1-a)) < 0.5 * x) {
+ /* x -> +Inf asymptotic */
+ return hyperg_1F1_asymp_posx(a, b, x, result);
+ }
+ else if(x < -100.0 && GSL_MAX_DBL(1.0,fabs(a))*GSL_MAX_DBL(1.0,fabs(1+a-b)) < 0.5 * fabs(x)) {
+ /* x -> -Inf asymptotic */
+ return hyperg_1F1_asymp_negx(a, b, x, result);
+ }
+ else if(a < 0 && b < 0) {
+ return hyperg_1F1_ab_negint(a, b, x, result);
+ }
+ else if(a < 0 && b > 0) {
+ /* Use Kummer to reduce it to the positive integer case.
+ * Note that b > a, strictly, since we already trapped b = a.
+ */
+ gsl_sf_result Kummer_1F1;
+ int stat_K = hyperg_1F1_ab_posint(b-a, b, -x, &Kummer_1F1);
+ int stat_e = gsl_sf_exp_mult_err_e(x, GSL_DBL_EPSILON * fabs(x),
+ Kummer_1F1.val, Kummer_1F1.err,
+ result);
+ return GSL_ERROR_SELECT_2(stat_e, stat_K);
+ }
+ else {
+ /* a > 0 and b > 0 */
+ return hyperg_1F1_ab_posint(a, b, x, result);
+ }
+}
+
+
+int
+gsl_sf_hyperg_1F1_e(const double a, const double b, const double x,
+ gsl_sf_result * result
+ )
+{
+ const double bma = b - a;
+ const double rinta = floor(a + 0.5);
+ const double rintb = floor(b + 0.5);
+ const double rintbma = floor(bma + 0.5);
+ const int a_integer = ( fabs(a-rinta) < _1F1_INT_THRESHOLD && rinta > INT_MIN && rinta < INT_MAX );
+ const int b_integer = ( fabs(b-rintb) < _1F1_INT_THRESHOLD && rintb > INT_MIN && rintb < INT_MAX );
+ const int bma_integer = ( fabs(bma-rintbma) < _1F1_INT_THRESHOLD && rintbma > INT_MIN && rintbma < INT_MAX );
+ const int b_neg_integer = ( b < -0.1 && b_integer );
+ const int a_neg_integer = ( a < -0.1 && a_integer );
+ const int bma_neg_integer = ( bma < -0.1 && bma_integer );
+
+ /* CHECK_POINTER(result) */
+
+ if(x == 0.0) {
+ /* Testing for this before testing a and b
+ * is somewhat arbitrary. The result is that
+ * we have 1F1(a,0,0) = 1.
+ */
+ result->val = 1.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(b == 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(a == 0.0) {
+ result->val = 1.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(a == b) {
+ /* case: a==b; exp(x)
+ * It's good to test exact equality now.
+ * We also test approximate equality later.
+ */
+ return gsl_sf_exp_e(x, result);
+ } else if(fabs(b) < _1F1_INT_THRESHOLD && fabs(a) < _1F1_INT_THRESHOLD) {
+ /* a and b near zero: 1 + a/b (exp(x)-1)
+ */
+
+ /* Note that neither a nor b is zero, since
+ * we eliminated that with the above tests.
+ */
+
+ gsl_sf_result exm1;
+ int stat_e = gsl_sf_expm1_e(x, &exm1);
+ double sa = ( a > 0.0 ? 1.0 : -1.0 );
+ double sb = ( b > 0.0 ? 1.0 : -1.0 );
+ double lnab = log(fabs(a/b)); /* safe */
+ gsl_sf_result hx;
+ int stat_hx = gsl_sf_exp_mult_err_e(lnab, GSL_DBL_EPSILON * fabs(lnab),
+ sa * sb * exm1.val, exm1.err,
+ &hx);
+ result->val = (hx.val == GSL_DBL_MAX ? hx.val : 1.0 + hx.val); /* FIXME: excessive paranoia ? what is DBL_MAX+1 ?*/
+ result->err = hx.err;
+ return GSL_ERROR_SELECT_2(stat_hx, stat_e);
+ } else if (fabs(b) < _1F1_INT_THRESHOLD && fabs(x*a) < 1) {
+ /* b near zero and a not near zero
+ */
+ const double m_arg = 1.0/(0.5*b);
+ gsl_sf_result F_renorm;
+ int stat_F = hyperg_1F1_renorm_b0(a, x, &F_renorm);
+ int stat_m = gsl_sf_multiply_err_e(m_arg, 2.0 * GSL_DBL_EPSILON * m_arg,
+ 0.5*F_renorm.val, 0.5*F_renorm.err,
+ result);
+ return GSL_ERROR_SELECT_2(stat_m, stat_F);
+ }
+ else if(a_integer && b_integer) {
+ /* Check for reduction to the integer case.
+ * Relies on the arbitrary "near an integer" test.
+ */
+ return gsl_sf_hyperg_1F1_int_e((int)rinta, (int)rintb, x, result);
+ }
+ else if(b_neg_integer && !(a_neg_integer && a > b)) {
+ /* Standard domain error due to
+ * uncancelled singularity.
+ */
+ DOMAIN_ERROR(result);
+ }
+ else if(a_neg_integer) {
+ return hyperg_1F1_a_negint_lag((int)rinta, b, x, result);
+ }
+ else if(b > 0.0) {
+ if(-1.0 <= a && a <= 1.0) {
+ /* Handle small a explicitly.
+ */
+ return hyperg_1F1_small_a_bgt0(a, b, x, result);
+ }
+ else if(bma_neg_integer) {
+ /* Catch this now, to avoid problems in the
+ * generic evaluation code.
+ */
+ gsl_sf_result Kummer_1F1;
+ int stat_K = hyperg_1F1_a_negint_lag((int)rintbma, b, -x, &Kummer_1F1);
+ int stat_e = gsl_sf_exp_mult_err_e(x, GSL_DBL_EPSILON * fabs(x),
+ Kummer_1F1.val, Kummer_1F1.err,
+ result);
+ return GSL_ERROR_SELECT_2(stat_e, stat_K);
+ }
+ else if(a < 0.0 && fabs(x) < 100.0) {
+ /* Use Kummer to reduce it to the generic positive case.
+ * Note that b > a, strictly, since we already trapped b = a.
+ * Also b-(b-a)=a, and a is not a negative integer here,
+ * so the generic evaluation is safe.
+ */
+ gsl_sf_result Kummer_1F1;
+ int stat_K = hyperg_1F1_ab_pos(b-a, b, -x, &Kummer_1F1);
+ int stat_e = gsl_sf_exp_mult_err_e(x, GSL_DBL_EPSILON * fabs(x),
+ Kummer_1F1.val, Kummer_1F1.err,
+ result);
+ return GSL_ERROR_SELECT_2(stat_e, stat_K);
+ }
+ else if (a > 0) {
+ /* a > 0.0 */
+ return hyperg_1F1_ab_pos(a, b, x, result);
+ } else {
+ return gsl_sf_hyperg_1F1_series_e(a, b, x, result);
+ }
+ }
+ else {
+ /* b < 0.0 */
+
+ if(bma_neg_integer && x < 0.0) {
+ /* Handle this now to prevent problems
+ * in the generic evaluation.
+ */
+ gsl_sf_result K;
+ int stat_K;
+ int stat_e;
+ if(a < 0.0) {
+ /* Kummer transformed version of safe polynomial.
+ * The condition a < 0 is equivalent to b < b-a,
+ * which is the condition required for the series
+ * to be positive definite here.
+ */
+ stat_K = hyperg_1F1_a_negint_poly((int)rintbma, b, -x, &K);
+ }
+ else {
+ /* Generic eval for negative integer a. */
+ stat_K = hyperg_1F1_a_negint_lag((int)rintbma, b, -x, &K);
+ }
+ stat_e = gsl_sf_exp_mult_err_e(x, GSL_DBL_EPSILON * fabs(x),
+ K.val, K.err,
+ result);
+ return GSL_ERROR_SELECT_2(stat_e, stat_K);
+ }
+ else if(a > 0.0) {
+ /* Use Kummer to reduce it to the generic negative case.
+ */
+ gsl_sf_result K;
+ int stat_K = hyperg_1F1_ab_neg(b-a, b, -x, &K);
+ int stat_e = gsl_sf_exp_mult_err_e(x, GSL_DBL_EPSILON * fabs(x),
+ K.val, K.err,
+ result);
+ return GSL_ERROR_SELECT_2(stat_e, stat_K);
+ }
+ else {
+ return hyperg_1F1_ab_neg(a, b, x, result);
+ }
+ }
+}
+
+
+
+#if 0
+ /* Luke in the canonical case.
+ */
+ if(x < 0.0 && !a_neg_integer && !bma_neg_integer) {
+ double prec;
+ return hyperg_1F1_luke(a, b, x, result, &prec);
+ }
+
+
+ /* Luke with Kummer transformation.
+ */
+ if(x > 0.0 && !a_neg_integer && !bma_neg_integer) {
+ double prec;
+ double Kummer_1F1;
+ double ex;
+ int stat_F = hyperg_1F1_luke(b-a, b, -x, &Kummer_1F1, &prec);
+ int stat_e = gsl_sf_exp_e(x, &ex);
+ if(stat_F == GSL_SUCCESS && stat_e == GSL_SUCCESS) {
+ double lnr = log(fabs(Kummer_1F1)) + x;
+ if(lnr < GSL_LOG_DBL_MAX) {
+ *result = ex * Kummer_1F1;
+ return GSL_SUCCESS;
+ }
+ else {
+ *result = GSL_POSINF;
+ GSL_ERROR ("overflow", GSL_EOVRFLW);
+ }
+ }
+ else if(stat_F != GSL_SUCCESS) {
+ *result = 0.0;
+ return stat_F;
+ }
+ else {
+ *result = 0.0;
+ return stat_e;
+ }
+ }
+#endif
+
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_hyperg_1F1_int(const int m, const int n, double x)
+{
+ EVAL_RESULT(gsl_sf_hyperg_1F1_int_e(m, n, x, &result));
+}
+
+double gsl_sf_hyperg_1F1(double a, double b, double x)
+{
+ EVAL_RESULT(gsl_sf_hyperg_1F1_e(a, b, x, &result));
+}
diff --git a/gsl-1.9/specfunc/hyperg_2F0.c b/gsl-1.9/specfunc/hyperg_2F0.c
new file mode 100644
index 0000000..022b5cb
--- /dev/null
+++ b/gsl-1.9/specfunc/hyperg_2F0.c
@@ -0,0 +1,63 @@
+/* specfunc/hyperg_2F0.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_hyperg.h>
+
+#include "error.h"
+#include "hyperg.h"
+
+int
+gsl_sf_hyperg_2F0_e(const double a, const double b, const double x, gsl_sf_result * result)
+{
+ if(x < 0.0) {
+ /* Use "definition" 2F0(a,b,x) = (-1/x)^a U(a,1+a-b,-1/x).
+ */
+ gsl_sf_result U;
+ double pre = pow(-1.0/x, a);
+ int stat_U = gsl_sf_hyperg_U_e(a, 1.0+a-b, -1.0/x, &U);
+ result->val = pre * U.val;
+ result->err = GSL_DBL_EPSILON * fabs(result->val) + pre * U.err;
+ return stat_U;
+ }
+ else if(x == 0.0) {
+ result->val = 1.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else {
+ /* Use asymptotic series. ??
+ */
+ /* return hyperg_2F0_series(a, b, x, -1, result, &prec); */
+ DOMAIN_ERROR(result);
+ }
+}
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_hyperg_2F0(const double a, const double b, const double x)
+{
+ EVAL_RESULT(gsl_sf_hyperg_2F0_e(a, b, x, &result));
+}
diff --git a/gsl-1.9/specfunc/hyperg_2F1.c b/gsl-1.9/specfunc/hyperg_2F1.c
new file mode 100644
index 0000000..a186a22
--- /dev/null
+++ b/gsl-1.9/specfunc/hyperg_2F1.c
@@ -0,0 +1,915 @@
+/* specfunc/hyperg_2F1.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_exp.h>
+#include <gsl/gsl_sf_pow_int.h>
+#include <gsl/gsl_sf_gamma.h>
+#include <gsl/gsl_sf_psi.h>
+#include <gsl/gsl_sf_hyperg.h>
+
+#include "error.h"
+
+#define locEPS (1000.0*GSL_DBL_EPSILON)
+
+
+/* Assumes c != negative integer.
+ */
+static int
+hyperg_2F1_series(const double a, const double b, const double c,
+ const double x,
+ gsl_sf_result * result
+ )
+{
+ double sum_pos = 1.0;
+ double sum_neg = 0.0;
+ double del_pos = 1.0;
+ double del_neg = 0.0;
+ double del = 1.0;
+ double k = 0.0;
+ int i = 0;
+
+ if(fabs(c) < GSL_DBL_EPSILON) {
+ result->val = 0.0; /* FIXME: ?? */
+ result->err = 1.0;
+ GSL_ERROR ("error", GSL_EDOM);
+ }
+
+ do {
+ if(++i > 30000) {
+ result->val = sum_pos - sum_neg;
+ result->err = del_pos + del_neg;
+ result->err += 2.0 * GSL_DBL_EPSILON * (sum_pos + sum_neg);
+ result->err += 2.0 * GSL_DBL_EPSILON * (2.0*sqrt(k)+1.0) * fabs(result->val);
+ GSL_ERROR ("error", GSL_EMAXITER);
+ }
+ del *= (a+k)*(b+k) * x / ((c+k) * (k+1.0)); /* Gauss series */
+
+ if(del > 0.0) {
+ del_pos = del;
+ sum_pos += del;
+ }
+ else if(del == 0.0) {
+ /* Exact termination (a or b was a negative integer).
+ */
+ del_pos = 0.0;
+ del_neg = 0.0;
+ break;
+ }
+ else {
+ del_neg = -del;
+ sum_neg -= del;
+ }
+
+ k += 1.0;
+ } while(fabs((del_pos + del_neg)/(sum_pos-sum_neg)) > GSL_DBL_EPSILON);
+
+ result->val = sum_pos - sum_neg;
+ result->err = del_pos + del_neg;
+ result->err += 2.0 * GSL_DBL_EPSILON * (sum_pos + sum_neg);
+ result->err += 2.0 * GSL_DBL_EPSILON * (2.0*sqrt(k) + 1.0) * fabs(result->val);
+
+ return GSL_SUCCESS;
+}
+
+
+/* a = aR + i aI, b = aR - i aI */
+static
+int
+hyperg_2F1_conj_series(const double aR, const double aI, const double c,
+ double x,
+ gsl_sf_result * result)
+{
+ if(c == 0.0) {
+ result->val = 0.0; /* FIXME: should be Inf */
+ result->err = 0.0;
+ GSL_ERROR ("error", GSL_EDOM);
+ }
+ else {
+ double sum_pos = 1.0;
+ double sum_neg = 0.0;
+ double del_pos = 1.0;
+ double del_neg = 0.0;
+ double del = 1.0;
+ double k = 0.0;
+ do {
+ del *= ((aR+k)*(aR+k) + aI*aI)/((k+1.0)*(c+k)) * x;
+
+ if(del >= 0.0) {
+ del_pos = del;
+ sum_pos += del;
+ }
+ else {
+ del_neg = -del;
+ sum_neg -= del;
+ }
+
+ if(k > 30000) {
+ result->val = sum_pos - sum_neg;
+ result->err = del_pos + del_neg;
+ result->err += 2.0 * GSL_DBL_EPSILON * (sum_pos + sum_neg);
+ result->err += 2.0 * GSL_DBL_EPSILON * (2.0*sqrt(k)+1.0) * fabs(result->val);
+ GSL_ERROR ("error", GSL_EMAXITER);
+ }
+
+ k += 1.0;
+ } while(fabs((del_pos + del_neg)/(sum_pos - sum_neg)) > GSL_DBL_EPSILON);
+
+ result->val = sum_pos - sum_neg;
+ result->err = del_pos + del_neg;
+ result->err += 2.0 * GSL_DBL_EPSILON * (sum_pos + sum_neg);
+ result->err += 2.0 * GSL_DBL_EPSILON * (2.0*sqrt(k) + 1.0) * fabs(result->val);
+
+ return GSL_SUCCESS;
+ }
+}
+
+
+/* Luke's rational approximation. The most accesible
+ * discussion is in [Kolbig, CPC 23, 51 (1981)].
+ * The convergence is supposedly guaranteed for x < 0.
+ * You have to read Luke's books to see this and other
+ * results. Unfortunately, the stability is not so
+ * clear to me, although it seems very efficient when
+ * it works.
+ */
+static
+int
+hyperg_2F1_luke(const double a, const double b, const double c,
+ const double xin,
+ gsl_sf_result * result)
+{
+ int stat_iter;
+ const double RECUR_BIG = 1.0e+50;
+ const int nmax = 20000;
+ int n = 3;
+ const double x = -xin;
+ const double x3 = x*x*x;
+ const double t0 = a*b/c;
+ const double t1 = (a+1.0)*(b+1.0)/(2.0*c);
+ const double t2 = (a+2.0)*(b+2.0)/(2.0*(c+1.0));
+ double F = 1.0;
+ double prec;
+
+ double Bnm3 = 1.0; /* B0 */
+ double Bnm2 = 1.0 + t1 * x; /* B1 */
+ double Bnm1 = 1.0 + t2 * x * (1.0 + t1/3.0 * x); /* B2 */
+
+ double Anm3 = 1.0; /* A0 */
+ double Anm2 = Bnm2 - t0 * x; /* A1 */
+ double Anm1 = Bnm1 - t0*(1.0 + t2*x)*x + t0 * t1 * (c/(c+1.0)) * x*x; /* A2 */
+
+ while(1) {
+ double npam1 = n + a - 1;
+ double npbm1 = n + b - 1;
+ double npcm1 = n + c - 1;
+ double npam2 = n + a - 2;
+ double npbm2 = n + b - 2;
+ double npcm2 = n + c - 2;
+ double tnm1 = 2*n - 1;
+ double tnm3 = 2*n - 3;
+ double tnm5 = 2*n - 5;
+ double n2 = n*n;
+ double F1 = (3.0*n2 + (a+b-6)*n + 2 - a*b - 2*(a+b)) / (2*tnm3*npcm1);
+ double F2 = -(3.0*n2 - (a+b+6)*n + 2 - a*b)*npam1*npbm1/(4*tnm1*tnm3*npcm2*npcm1);
+ double F3 = (npam2*npam1*npbm2*npbm1*(n-a-2)*(n-b-2)) / (8*tnm3*tnm3*tnm5*(n+c-3)*npcm2*npcm1);
+ double E = -npam1*npbm1*(n-c-1) / (2*tnm3*npcm2*npcm1);
+
+ double An = (1.0+F1*x)*Anm1 + (E + F2*x)*x*Anm2 + F3*x3*Anm3;
+ double Bn = (1.0+F1*x)*Bnm1 + (E + F2*x)*x*Bnm2 + F3*x3*Bnm3;
+ double r = An/Bn;
+
+ prec = fabs((F - r)/F);
+ F = r;
+
+ if(prec < GSL_DBL_EPSILON || n > nmax) break;
+
+ if(fabs(An) > RECUR_BIG || fabs(Bn) > RECUR_BIG) {
+ An /= RECUR_BIG;
+ Bn /= RECUR_BIG;
+ Anm1 /= RECUR_BIG;
+ Bnm1 /= RECUR_BIG;
+ Anm2 /= RECUR_BIG;
+ Bnm2 /= RECUR_BIG;
+ Anm3 /= RECUR_BIG;
+ Bnm3 /= RECUR_BIG;
+ }
+ else if(fabs(An) < 1.0/RECUR_BIG || fabs(Bn) < 1.0/RECUR_BIG) {
+ An *= RECUR_BIG;
+ Bn *= RECUR_BIG;
+ Anm1 *= RECUR_BIG;
+ Bnm1 *= RECUR_BIG;
+ Anm2 *= RECUR_BIG;
+ Bnm2 *= RECUR_BIG;
+ Anm3 *= RECUR_BIG;
+ Bnm3 *= RECUR_BIG;
+ }
+
+ n++;
+ Bnm3 = Bnm2;
+ Bnm2 = Bnm1;
+ Bnm1 = Bn;
+ Anm3 = Anm2;
+ Anm2 = Anm1;
+ Anm1 = An;
+ }
+
+ result->val = F;
+ result->err = 2.0 * fabs(prec * F);
+ result->err += 2.0 * GSL_DBL_EPSILON * (n+1.0) * fabs(F);
+
+ /* FIXME: just a hack: there's a lot of shit going on here */
+ result->err *= 8.0 * (fabs(a) + fabs(b) + 1.0);
+
+ stat_iter = (n >= nmax ? GSL_EMAXITER : GSL_SUCCESS );
+
+ return stat_iter;
+}
+
+
+/* Luke's rational approximation for the
+ * case a = aR + i aI, b = aR - i aI.
+ */
+static
+int
+hyperg_2F1_conj_luke(const double aR, const double aI, const double c,
+ const double xin,
+ gsl_sf_result * result)
+{
+ int stat_iter;
+ const double RECUR_BIG = 1.0e+50;
+ const int nmax = 10000;
+ int n = 3;
+ const double x = -xin;
+ const double x3 = x*x*x;
+ const double atimesb = aR*aR + aI*aI;
+ const double apb = 2.0*aR;
+ const double t0 = atimesb/c;
+ const double t1 = (atimesb + apb + 1.0)/(2.0*c);
+ const double t2 = (atimesb + 2.0*apb + 4.0)/(2.0*(c+1.0));
+ double F = 1.0;
+ double prec;
+
+ double Bnm3 = 1.0; /* B0 */
+ double Bnm2 = 1.0 + t1 * x; /* B1 */
+ double Bnm1 = 1.0 + t2 * x * (1.0 + t1/3.0 * x); /* B2 */
+
+ double Anm3 = 1.0; /* A0 */
+ double Anm2 = Bnm2 - t0 * x; /* A1 */
+ double Anm1 = Bnm1 - t0*(1.0 + t2*x)*x + t0 * t1 * (c/(c+1.0)) * x*x; /* A2 */
+
+ while(1) {
+ double nm1 = n - 1;
+ double nm2 = n - 2;
+ double npam1_npbm1 = atimesb + nm1*apb + nm1*nm1;
+ double npam2_npbm2 = atimesb + nm2*apb + nm2*nm2;
+ double npcm1 = nm1 + c;
+ double npcm2 = nm2 + c;
+ double tnm1 = 2*n - 1;
+ double tnm3 = 2*n - 3;
+ double tnm5 = 2*n - 5;
+ double n2 = n*n;
+ double F1 = (3.0*n2 + (apb-6)*n + 2 - atimesb - 2*apb) / (2*tnm3*npcm1);
+ double F2 = -(3.0*n2 - (apb+6)*n + 2 - atimesb)*npam1_npbm1/(4*tnm1*tnm3*npcm2*npcm1);
+ double F3 = (npam2_npbm2*npam1_npbm1*(nm2*nm2 - nm2*apb + atimesb)) / (8*tnm3*tnm3*tnm5*(n+c-3)*npcm2*npcm1);
+ double E = -npam1_npbm1*(n-c-1) / (2*tnm3*npcm2*npcm1);
+
+ double An = (1.0+F1*x)*Anm1 + (E + F2*x)*x*Anm2 + F3*x3*Anm3;
+ double Bn = (1.0+F1*x)*Bnm1 + (E + F2*x)*x*Bnm2 + F3*x3*Bnm3;
+ double r = An/Bn;
+
+ prec = fabs(F - r)/fabs(F);
+ F = r;
+
+ if(prec < GSL_DBL_EPSILON || n > nmax) break;
+
+ if(fabs(An) > RECUR_BIG || fabs(Bn) > RECUR_BIG) {
+ An /= RECUR_BIG;
+ Bn /= RECUR_BIG;
+ Anm1 /= RECUR_BIG;
+ Bnm1 /= RECUR_BIG;
+ Anm2 /= RECUR_BIG;
+ Bnm2 /= RECUR_BIG;
+ Anm3 /= RECUR_BIG;
+ Bnm3 /= RECUR_BIG;
+ }
+ else if(fabs(An) < 1.0/RECUR_BIG || fabs(Bn) < 1.0/RECUR_BIG) {
+ An *= RECUR_BIG;
+ Bn *= RECUR_BIG;
+ Anm1 *= RECUR_BIG;
+ Bnm1 *= RECUR_BIG;
+ Anm2 *= RECUR_BIG;
+ Bnm2 *= RECUR_BIG;
+ Anm3 *= RECUR_BIG;
+ Bnm3 *= RECUR_BIG;
+ }
+
+ n++;
+ Bnm3 = Bnm2;
+ Bnm2 = Bnm1;
+ Bnm1 = Bn;
+ Anm3 = Anm2;
+ Anm2 = Anm1;
+ Anm1 = An;
+ }
+
+ result->val = F;
+ result->err = 2.0 * fabs(prec * F);
+ result->err += 2.0 * GSL_DBL_EPSILON * (n+1.0) * fabs(F);
+
+ /* FIXME: see above */
+ result->err *= 8.0 * (fabs(aR) + fabs(aI) + 1.0);
+
+ stat_iter = (n >= nmax ? GSL_EMAXITER : GSL_SUCCESS );
+
+ return stat_iter;
+}
+
+
+/* Do the reflection described in [Moshier, p. 334].
+ * Assumes a,b,c != neg integer.
+ */
+static
+int
+hyperg_2F1_reflect(const double a, const double b, const double c,
+ const double x, gsl_sf_result * result)
+{
+ const double d = c - a - b;
+ const int intd = floor(d+0.5);
+ const int d_integer = ( fabs(d - intd) < locEPS );
+
+ if(d_integer) {
+ const double ln_omx = log(1.0 - x);
+ const double ad = fabs(d);
+ int stat_F2 = GSL_SUCCESS;
+ double sgn_2;
+ gsl_sf_result F1;
+ gsl_sf_result F2;
+ double d1, d2;
+ gsl_sf_result lng_c;
+ gsl_sf_result lng_ad2;
+ gsl_sf_result lng_bd2;
+ int stat_c;
+ int stat_ad2;
+ int stat_bd2;
+
+ if(d >= 0.0) {
+ d1 = d;
+ d2 = 0.0;
+ }
+ else {
+ d1 = 0.0;
+ d2 = d;
+ }
+
+ stat_ad2 = gsl_sf_lngamma_e(a+d2, &lng_ad2);
+ stat_bd2 = gsl_sf_lngamma_e(b+d2, &lng_bd2);
+ stat_c = gsl_sf_lngamma_e(c, &lng_c);
+
+ /* Evaluate F1.
+ */
+ if(ad < GSL_DBL_EPSILON) {
+ /* d = 0 */
+ F1.val = 0.0;
+ F1.err = 0.0;
+ }
+ else {
+ gsl_sf_result lng_ad;
+ gsl_sf_result lng_ad1;
+ gsl_sf_result lng_bd1;
+ int stat_ad = gsl_sf_lngamma_e(ad, &lng_ad);
+ int stat_ad1 = gsl_sf_lngamma_e(a+d1, &lng_ad1);
+ int stat_bd1 = gsl_sf_lngamma_e(b+d1, &lng_bd1);
+
+ if(stat_ad1 == GSL_SUCCESS && stat_bd1 == GSL_SUCCESS && stat_ad == GSL_SUCCESS) {
+ /* Gamma functions in the denominator are ok.
+ * Proceed with evaluation.
+ */
+ int i;
+ double sum1 = 1.0;
+ double term = 1.0;
+ double ln_pre1_val = lng_ad.val + lng_c.val + d2*ln_omx - lng_ad1.val - lng_bd1.val;
+ double ln_pre1_err = lng_ad.err + lng_c.err + lng_ad1.err + lng_bd1.err + GSL_DBL_EPSILON * fabs(ln_pre1_val);
+ int stat_e;
+
+ /* Do F1 sum.
+ */
+ for(i=1; i<ad; i++) {
+ int j = i-1;
+ term *= (a + d2 + j) * (b + d2 + j) / (1.0 + d2 + j) / i * (1.0-x);
+ sum1 += term;
+ }
+
+ stat_e = gsl_sf_exp_mult_err_e(ln_pre1_val, ln_pre1_err,
+ sum1, GSL_DBL_EPSILON*fabs(sum1),
+ &F1);
+ if(stat_e == GSL_EOVRFLW) {
+ OVERFLOW_ERROR(result);
+ }
+ }
+ else {
+ /* Gamma functions in the denominator were not ok.
+ * So the F1 term is zero.
+ */
+ F1.val = 0.0;
+ F1.err = 0.0;
+ }
+ } /* end F1 evaluation */
+
+
+ /* Evaluate F2.
+ */
+ if(stat_ad2 == GSL_SUCCESS && stat_bd2 == GSL_SUCCESS) {
+ /* Gamma functions in the denominator are ok.
+ * Proceed with evaluation.
+ */
+ const int maxiter = 2000;
+ double psi_1 = -M_EULER;
+ gsl_sf_result psi_1pd;
+ gsl_sf_result psi_apd1;
+ gsl_sf_result psi_bpd1;
+ int stat_1pd = gsl_sf_psi_e(1.0 + ad, &psi_1pd);
+ int stat_apd1 = gsl_sf_psi_e(a + d1, &psi_apd1);
+ int stat_bpd1 = gsl_sf_psi_e(b + d1, &psi_bpd1);
+ int stat_dall = GSL_ERROR_SELECT_3(stat_1pd, stat_apd1, stat_bpd1);
+
+ double psi_val = psi_1 + psi_1pd.val - psi_apd1.val - psi_bpd1.val - ln_omx;
+ double psi_err = psi_1pd.err + psi_apd1.err + psi_bpd1.err + GSL_DBL_EPSILON*fabs(psi_val);
+ double fact = 1.0;
+ double sum2_val = psi_val;
+ double sum2_err = psi_err;
+ double ln_pre2_val = lng_c.val + d1*ln_omx - lng_ad2.val - lng_bd2.val;
+ double ln_pre2_err = lng_c.err + lng_ad2.err + lng_bd2.err + GSL_DBL_EPSILON * fabs(ln_pre2_val);
+ int stat_e;
+
+ int j;
+
+ /* Do F2 sum.
+ */
+ for(j=1; j<maxiter; j++) {
+ /* values for psi functions use recurrence; Abramowitz+Stegun 6.3.5 */
+ double term1 = 1.0/(double)j + 1.0/(ad+j);
+ double term2 = 1.0/(a+d1+j-1.0) + 1.0/(b+d1+j-1.0);
+ double delta = 0.0;
+ psi_val += term1 - term2;
+ psi_err += GSL_DBL_EPSILON * (fabs(term1) + fabs(term2));
+ fact *= (a+d1+j-1.0)*(b+d1+j-1.0)/((ad+j)*j) * (1.0-x);
+ delta = fact * psi_val;
+ sum2_val += delta;
+ sum2_err += fabs(fact * psi_err) + GSL_DBL_EPSILON*fabs(delta);
+ if(fabs(delta) < GSL_DBL_EPSILON * fabs(sum2_val)) break;
+ }
+
+ if(j == maxiter) stat_F2 = GSL_EMAXITER;
+
+ if(sum2_val == 0.0) {
+ F2.val = 0.0;
+ F2.err = 0.0;
+ }
+ else {
+ stat_e = gsl_sf_exp_mult_err_e(ln_pre2_val, ln_pre2_err,
+ sum2_val, sum2_err,
+ &F2);
+ if(stat_e == GSL_EOVRFLW) {
+ result->val = 0.0;
+ result->err = 0.0;
+ GSL_ERROR ("error", GSL_EOVRFLW);
+ }
+ }
+ stat_F2 = GSL_ERROR_SELECT_2(stat_F2, stat_dall);
+ }
+ else {
+ /* Gamma functions in the denominator not ok.
+ * So the F2 term is zero.
+ */
+ F2.val = 0.0;
+ F2.err = 0.0;
+ } /* end F2 evaluation */
+
+ sgn_2 = ( GSL_IS_ODD(intd) ? -1.0 : 1.0 );
+ result->val = F1.val + sgn_2 * F2.val;
+ result->err = F1.err + F2. err;
+ result->err += 2.0 * GSL_DBL_EPSILON * (fabs(F1.val) + fabs(F2.val));
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return stat_F2;
+ }
+ else {
+ /* d not an integer */
+
+ gsl_sf_result pre1, pre2;
+ double sgn1, sgn2;
+ gsl_sf_result F1, F2;
+ int status_F1, status_F2;
+
+ /* These gamma functions appear in the denominator, so we
+ * catch their harmless domain errors and set the terms to zero.
+ */
+ gsl_sf_result ln_g1ca, ln_g1cb, ln_g2a, ln_g2b;
+ double sgn_g1ca, sgn_g1cb, sgn_g2a, sgn_g2b;
+ int stat_1ca = gsl_sf_lngamma_sgn_e(c-a, &ln_g1ca, &sgn_g1ca);
+ int stat_1cb = gsl_sf_lngamma_sgn_e(c-b, &ln_g1cb, &sgn_g1cb);
+ int stat_2a = gsl_sf_lngamma_sgn_e(a, &ln_g2a, &sgn_g2a);
+ int stat_2b = gsl_sf_lngamma_sgn_e(b, &ln_g2b, &sgn_g2b);
+ int ok1 = (stat_1ca == GSL_SUCCESS && stat_1cb == GSL_SUCCESS);
+ int ok2 = (stat_2a == GSL_SUCCESS && stat_2b == GSL_SUCCESS);
+
+ gsl_sf_result ln_gc, ln_gd, ln_gmd;
+ double sgn_gc, sgn_gd, sgn_gmd;
+ gsl_sf_lngamma_sgn_e( c, &ln_gc, &sgn_gc);
+ gsl_sf_lngamma_sgn_e( d, &ln_gd, &sgn_gd);
+ gsl_sf_lngamma_sgn_e(-d, &ln_gmd, &sgn_gmd);
+
+ sgn1 = sgn_gc * sgn_gd * sgn_g1ca * sgn_g1cb;
+ sgn2 = sgn_gc * sgn_gmd * sgn_g2a * sgn_g2b;
+
+ if(ok1 && ok2) {
+ double ln_pre1_val = ln_gc.val + ln_gd.val - ln_g1ca.val - ln_g1cb.val;
+ double ln_pre2_val = ln_gc.val + ln_gmd.val - ln_g2a.val - ln_g2b.val + d*log(1.0-x);
+ double ln_pre1_err = ln_gc.err + ln_gd.err + ln_g1ca.err + ln_g1cb.err;
+ double ln_pre2_err = ln_gc.err + ln_gmd.err + ln_g2a.err + ln_g2b.err;
+ if(ln_pre1_val < GSL_LOG_DBL_MAX && ln_pre2_val < GSL_LOG_DBL_MAX) {
+ gsl_sf_exp_err_e(ln_pre1_val, ln_pre1_err, &pre1);
+ gsl_sf_exp_err_e(ln_pre2_val, ln_pre2_err, &pre2);
+ pre1.val *= sgn1;
+ pre2.val *= sgn2;
+ }
+ else {
+ OVERFLOW_ERROR(result);
+ }
+ }
+ else if(ok1 && !ok2) {
+ double ln_pre1_val = ln_gc.val + ln_gd.val - ln_g1ca.val - ln_g1cb.val;
+ double ln_pre1_err = ln_gc.err + ln_gd.err + ln_g1ca.err + ln_g1cb.err;
+ if(ln_pre1_val < GSL_LOG_DBL_MAX) {
+ gsl_sf_exp_err_e(ln_pre1_val, ln_pre1_err, &pre1);
+ pre1.val *= sgn1;
+ pre2.val = 0.0;
+ pre2.err = 0.0;
+ }
+ else {
+ OVERFLOW_ERROR(result);
+ }
+ }
+ else if(!ok1 && ok2) {
+ double ln_pre2_val = ln_gc.val + ln_gmd.val - ln_g2a.val - ln_g2b.val + d*log(1.0-x);
+ double ln_pre2_err = ln_gc.err + ln_gmd.err + ln_g2a.err + ln_g2b.err;
+ if(ln_pre2_val < GSL_LOG_DBL_MAX) {
+ pre1.val = 0.0;
+ pre1.err = 0.0;
+ gsl_sf_exp_err_e(ln_pre2_val, ln_pre2_err, &pre2);
+ pre2.val *= sgn2;
+ }
+ else {
+ OVERFLOW_ERROR(result);
+ }
+ }
+ else {
+ pre1.val = 0.0;
+ pre2.val = 0.0;
+ UNDERFLOW_ERROR(result);
+ }
+
+ status_F1 = hyperg_2F1_series( a, b, 1.0-d, 1.0-x, &F1);
+ status_F2 = hyperg_2F1_series(c-a, c-b, 1.0+d, 1.0-x, &F2);
+
+ result->val = pre1.val*F1.val + pre2.val*F2.val;
+ result->err = fabs(pre1.val*F1.err) + fabs(pre2.val*F2.err);
+ result->err += fabs(pre1.err*F1.val) + fabs(pre2.err*F2.val);
+ result->err += 2.0 * GSL_DBL_EPSILON * (fabs(pre1.val*F1.val) + fabs(pre2.val*F2.val));
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+
+ return GSL_SUCCESS;
+ }
+}
+
+
+static int pow_omx(const double x, const double p, gsl_sf_result * result)
+{
+ double ln_omx;
+ double ln_result;
+ if(fabs(x) < GSL_ROOT5_DBL_EPSILON) {
+ ln_omx = -x*(1.0 + x*(1.0/2.0 + x*(1.0/3.0 + x/4.0 + x*x/5.0)));
+ }
+ else {
+ ln_omx = log(1.0-x);
+ }
+ ln_result = p * ln_omx;
+ return gsl_sf_exp_err_e(ln_result, GSL_DBL_EPSILON * fabs(ln_result), result);
+}
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int
+gsl_sf_hyperg_2F1_e(double a, double b, const double c,
+ const double x,
+ gsl_sf_result * result)
+{
+ const double d = c - a - b;
+ const double rinta = floor(a + 0.5);
+ const double rintb = floor(b + 0.5);
+ const double rintc = floor(c + 0.5);
+ const int a_neg_integer = ( a < 0.0 && fabs(a - rinta) < locEPS );
+ const int b_neg_integer = ( b < 0.0 && fabs(b - rintb) < locEPS );
+ const int c_neg_integer = ( c < 0.0 && fabs(c - rintc) < locEPS );
+
+ result->val = 0.0;
+ result->err = 0.0;
+
+ if(x < -1.0 || 1.0 <= x) {
+ DOMAIN_ERROR(result);
+ }
+
+ if(c_neg_integer) {
+ if(! (a_neg_integer && a > c + 0.1)) DOMAIN_ERROR(result);
+ if(! (b_neg_integer && b > c + 0.1)) DOMAIN_ERROR(result);
+ }
+
+ if(fabs(c-b) < locEPS || fabs(c-a) < locEPS) {
+ return pow_omx(x, d, result); /* (1-x)^(c-a-b) */
+ }
+
+ if(a >= 0.0 && b >= 0.0 && c >=0.0 && x >= 0.0 && x < 0.995) {
+ /* Series has all positive definite
+ * terms and x is not close to 1.
+ */
+ return hyperg_2F1_series(a, b, c, x, result);
+ }
+
+ if(fabs(a) < 10.0 && fabs(b) < 10.0) {
+ /* a and b are not too large, so we attempt
+ * variations on the series summation.
+ */
+ if(a_neg_integer) {
+ return hyperg_2F1_series(rinta, b, c, x, result);
+ }
+ if(b_neg_integer) {
+ return hyperg_2F1_series(a, rintb, c, x, result);
+ }
+
+ if(x < -0.25) {
+ return hyperg_2F1_luke(a, b, c, x, result);
+ }
+ else if(x < 0.5) {
+ return hyperg_2F1_series(a, b, c, x, result);
+ }
+ else {
+ if(fabs(c) > 10.0) {
+ return hyperg_2F1_series(a, b, c, x, result);
+ }
+ else {
+ return hyperg_2F1_reflect(a, b, c, x, result);
+ }
+ }
+ }
+ else {
+ /* Either a or b or both large.
+ * Introduce some new variables ap,bp so that bp is
+ * the larger in magnitude.
+ */
+ double ap, bp;
+ if(fabs(a) > fabs(b)) {
+ bp = a;
+ ap = b;
+ }
+ else {
+ bp = b;
+ ap = a;
+ }
+
+ if(x < 0.0) {
+ /* What the hell, maybe Luke will converge.
+ */
+ return hyperg_2F1_luke(a, b, c, x, result);
+ }
+
+ if(GSL_MAX_DBL(fabs(a),1.0)*fabs(bp)*fabs(x) < 2.0*fabs(c)) {
+ /* If c is large enough or x is small enough,
+ * we can attempt the series anyway.
+ */
+ return hyperg_2F1_series(a, b, c, x, result);
+ }
+
+ if(fabs(bp*bp*x*x) < 0.001*fabs(bp) && fabs(a) < 10.0) {
+ /* The famous but nearly worthless "large b" asymptotic.
+ */
+ int stat = gsl_sf_hyperg_1F1_e(a, c, bp*x, result);
+ result->err = 0.001 * fabs(result->val);
+ return stat;
+ }
+
+ /* We give up. */
+ result->val = 0.0;
+ result->err = 0.0;
+ GSL_ERROR ("error", GSL_EUNIMPL);
+ }
+}
+
+
+int
+gsl_sf_hyperg_2F1_conj_e(const double aR, const double aI, const double c,
+ const double x,
+ gsl_sf_result * result)
+{
+ const double ax = fabs(x);
+ const double rintc = floor(c + 0.5);
+ const int c_neg_integer = ( c < 0.0 && fabs(c - rintc) < locEPS );
+
+ result->val = 0.0;
+ result->err = 0.0;
+
+ if(ax >= 1.0 || c_neg_integer || c == 0.0) {
+ DOMAIN_ERROR(result);
+ }
+
+ if( (ax < 0.25 && fabs(aR) < 20.0 && fabs(aI) < 20.0)
+ || (c > 0.0 && x > 0.0)
+ ) {
+ return hyperg_2F1_conj_series(aR, aI, c, x, result);
+ }
+ else if(fabs(aR) < 10.0 && fabs(aI) < 10.0) {
+ if(x < -0.25) {
+ return hyperg_2F1_conj_luke(aR, aI, c, x, result);
+ }
+ else {
+ return hyperg_2F1_conj_series(aR, aI, c, x, result);
+ }
+ }
+ else {
+ if(x < 0.0) {
+ /* What the hell, maybe Luke will converge.
+ */
+ return hyperg_2F1_conj_luke(aR, aI, c, x, result);
+ }
+
+ /* Give up. */
+ result->val = 0.0;
+ result->err = 0.0;
+ GSL_ERROR ("error", GSL_EUNIMPL);
+ }
+}
+
+
+int
+gsl_sf_hyperg_2F1_renorm_e(const double a, const double b, const double c,
+ const double x,
+ gsl_sf_result * result
+ )
+{
+ const double rinta = floor(a + 0.5);
+ const double rintb = floor(b + 0.5);
+ const double rintc = floor(c + 0.5);
+ const int a_neg_integer = ( a < 0.0 && fabs(a - rinta) < locEPS );
+ const int b_neg_integer = ( b < 0.0 && fabs(b - rintb) < locEPS );
+ const int c_neg_integer = ( c < 0.0 && fabs(c - rintc) < locEPS );
+
+ if(c_neg_integer) {
+ if((a_neg_integer && a > c+0.1) || (b_neg_integer && b > c+0.1)) {
+ /* 2F1 terminates early */
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else {
+ /* 2F1 does not terminate early enough, so something survives */
+ /* [Abramowitz+Stegun, 15.1.2] */
+ gsl_sf_result g1, g2, g3, g4, g5;
+ double s1, s2, s3, s4, s5;
+ int stat = 0;
+ stat += gsl_sf_lngamma_sgn_e(a-c+1, &g1, &s1);
+ stat += gsl_sf_lngamma_sgn_e(b-c+1, &g2, &s2);
+ stat += gsl_sf_lngamma_sgn_e(a, &g3, &s3);
+ stat += gsl_sf_lngamma_sgn_e(b, &g4, &s4);
+ stat += gsl_sf_lngamma_sgn_e(-c+2, &g5, &s5);
+ if(stat != 0) {
+ DOMAIN_ERROR(result);
+ }
+ else {
+ gsl_sf_result F;
+ int stat_F = gsl_sf_hyperg_2F1_e(a-c+1, b-c+1, -c+2, x, &F);
+ double ln_pre_val = g1.val + g2.val - g3.val - g4.val - g5.val;
+ double ln_pre_err = g1.err + g2.err + g3.err + g4.err + g5.err;
+ double sg = s1 * s2 * s3 * s4 * s5;
+ int stat_e = gsl_sf_exp_mult_err_e(ln_pre_val, ln_pre_err,
+ sg * F.val, F.err,
+ result);
+ return GSL_ERROR_SELECT_2(stat_e, stat_F);
+ }
+ }
+ }
+ else {
+ /* generic c */
+ gsl_sf_result F;
+ gsl_sf_result lng;
+ double sgn;
+ int stat_g = gsl_sf_lngamma_sgn_e(c, &lng, &sgn);
+ int stat_F = gsl_sf_hyperg_2F1_e(a, b, c, x, &F);
+ int stat_e = gsl_sf_exp_mult_err_e(-lng.val, lng.err,
+ sgn*F.val, F.err,
+ result);
+ return GSL_ERROR_SELECT_3(stat_e, stat_F, stat_g);
+ }
+}
+
+
+int
+gsl_sf_hyperg_2F1_conj_renorm_e(const double aR, const double aI, const double c,
+ const double x,
+ gsl_sf_result * result
+ )
+{
+ const double rintc = floor(c + 0.5);
+ const double rinta = floor(aR + 0.5);
+ const int a_neg_integer = ( aR < 0.0 && fabs(aR-rinta) < locEPS && aI == 0.0);
+ const int c_neg_integer = ( c < 0.0 && fabs(c - rintc) < locEPS );
+
+ if(c_neg_integer) {
+ if(a_neg_integer && aR > c+0.1) {
+ /* 2F1 terminates early */
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else {
+ /* 2F1 does not terminate early enough, so something survives */
+ /* [Abramowitz+Stegun, 15.1.2] */
+ gsl_sf_result g1, g2;
+ gsl_sf_result g3;
+ gsl_sf_result a1, a2;
+ int stat = 0;
+ stat += gsl_sf_lngamma_complex_e(aR-c+1, aI, &g1, &a1);
+ stat += gsl_sf_lngamma_complex_e(aR, aI, &g2, &a2);
+ stat += gsl_sf_lngamma_e(-c+2.0, &g3);
+ if(stat != 0) {
+ DOMAIN_ERROR(result);
+ }
+ else {
+ gsl_sf_result F;
+ int stat_F = gsl_sf_hyperg_2F1_conj_e(aR-c+1, aI, -c+2, x, &F);
+ double ln_pre_val = 2.0*(g1.val - g2.val) - g3.val;
+ double ln_pre_err = 2.0 * (g1.err + g2.err) + g3.err;
+ int stat_e = gsl_sf_exp_mult_err_e(ln_pre_val, ln_pre_err,
+ F.val, F.err,
+ result);
+ return GSL_ERROR_SELECT_2(stat_e, stat_F);
+ }
+ }
+ }
+ else {
+ /* generic c */
+ gsl_sf_result F;
+ gsl_sf_result lng;
+ double sgn;
+ int stat_g = gsl_sf_lngamma_sgn_e(c, &lng, &sgn);
+ int stat_F = gsl_sf_hyperg_2F1_conj_e(aR, aI, c, x, &F);
+ int stat_e = gsl_sf_exp_mult_err_e(-lng.val, lng.err,
+ sgn*F.val, F.err,
+ result);
+ return GSL_ERROR_SELECT_3(stat_e, stat_F, stat_g);
+ }
+}
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_hyperg_2F1(double a, double b, double c, double x)
+{
+ EVAL_RESULT(gsl_sf_hyperg_2F1_e(a, b, c, x, &result));
+}
+
+double gsl_sf_hyperg_2F1_conj(double aR, double aI, double c, double x)
+{
+ EVAL_RESULT(gsl_sf_hyperg_2F1_conj_e(aR, aI, c, x, &result));
+}
+
+double gsl_sf_hyperg_2F1_renorm(double a, double b, double c, double x)
+{
+ EVAL_RESULT(gsl_sf_hyperg_2F1_renorm_e(a, b, c, x, &result));
+}
+
+double gsl_sf_hyperg_2F1_conj_renorm(double aR, double aI, double c, double x)
+{
+ EVAL_RESULT(gsl_sf_hyperg_2F1_conj_renorm_e(aR, aI, c, x, &result));
+}
diff --git a/gsl-1.9/specfunc/hyperg_U.c b/gsl-1.9/specfunc/hyperg_U.c
new file mode 100644
index 0000000..9b28835
--- /dev/null
+++ b/gsl-1.9/specfunc/hyperg_U.c
@@ -0,0 +1,1406 @@
+/* specfunc/hyperg_U.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_exp.h>
+#include <gsl/gsl_sf_gamma.h>
+#include <gsl/gsl_sf_bessel.h>
+#include <gsl/gsl_sf_laguerre.h>
+#include <gsl/gsl_sf_pow_int.h>
+#include <gsl/gsl_sf_hyperg.h>
+
+#include "error.h"
+#include "hyperg.h"
+
+#define INT_THRESHOLD (1000.0*GSL_DBL_EPSILON)
+
+#define SERIES_EVAL_OK(a,b,x) ((fabs(a) < 5 && b < 5 && x < 2.0) || (fabs(a) < 10 && b < 10 && x < 1.0))
+
+#define ASYMP_EVAL_OK(a,b,x) (GSL_MAX_DBL(fabs(a),1.0)*GSL_MAX_DBL(fabs(1.0+a-b),1.0) < 0.99*fabs(x))
+
+
+/* Log[U(a,2a,x)]
+ * [Abramowitz+stegun, 13.6.21]
+ * Assumes x > 0, a > 1/2.
+ */
+static
+int
+hyperg_lnU_beq2a(const double a, const double x, gsl_sf_result * result)
+{
+ const double lx = log(x);
+ const double nu = a - 0.5;
+ const double lnpre = 0.5*(x - M_LNPI) - nu*lx;
+ gsl_sf_result lnK;
+ gsl_sf_bessel_lnKnu_e(nu, 0.5*x, &lnK);
+ result->val = lnpre + lnK.val;
+ result->err = 2.0 * GSL_DBL_EPSILON * (fabs(0.5*x) + 0.5*M_LNPI + fabs(nu*lx));
+ result->err += lnK.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+}
+
+
+/* Evaluate u_{N+1}/u_N by Steed's continued fraction method.
+ *
+ * u_N := Gamma[a+N]/Gamma[a] U(a + N, b, x)
+ *
+ * u_{N+1}/u_N = (a+N) U(a+N+1,b,x)/U(a+N,b,x)
+ */
+static
+int
+hyperg_U_CF1(const double a, const double b, const int N, const double x,
+ double * result, int * count)
+{
+ const double RECUR_BIG = GSL_SQRT_DBL_MAX;
+ const int maxiter = 20000;
+ int n = 1;
+ double Anm2 = 1.0;
+ double Bnm2 = 0.0;
+ double Anm1 = 0.0;
+ double Bnm1 = 1.0;
+ double a1 = -(a + N);
+ double b1 = (b - 2.0*a - x - 2.0*(N+1));
+ double An = b1*Anm1 + a1*Anm2;
+ double Bn = b1*Bnm1 + a1*Bnm2;
+ double an, bn;
+ double fn = An/Bn;
+
+ while(n < maxiter) {
+ double old_fn;
+ double del;
+ n++;
+ Anm2 = Anm1;
+ Bnm2 = Bnm1;
+ Anm1 = An;
+ Bnm1 = Bn;
+ an = -(a + N + n - b)*(a + N + n - 1.0);
+ bn = (b - 2.0*a - x - 2.0*(N+n));
+ An = bn*Anm1 + an*Anm2;
+ Bn = bn*Bnm1 + an*Bnm2;
+
+ if(fabs(An) > RECUR_BIG || fabs(Bn) > RECUR_BIG) {
+ An /= RECUR_BIG;
+ Bn /= RECUR_BIG;
+ Anm1 /= RECUR_BIG;
+ Bnm1 /= RECUR_BIG;
+ Anm2 /= RECUR_BIG;
+ Bnm2 /= RECUR_BIG;
+ }
+
+ old_fn = fn;
+ fn = An/Bn;
+ del = old_fn/fn;
+
+ if(fabs(del - 1.0) < 10.0*GSL_DBL_EPSILON) break;
+ }
+
+ *result = fn;
+ *count = n;
+
+ if(n == maxiter)
+ GSL_ERROR ("error", GSL_EMAXITER);
+ else
+ return GSL_SUCCESS;
+}
+
+
+/* Large x asymptotic for x^a U(a,b,x)
+ * Based on SLATEC D9CHU() [W. Fullerton]
+ *
+ * Uses a rational approximation due to Luke.
+ * See [Luke, Algorithms for the Computation of Special Functions, p. 252]
+ * [Luke, Utilitas Math. (1977)]
+ *
+ * z^a U(a,b,z) ~ 2F0(a,1+a-b,-1/z)
+ *
+ * This assumes that a is not a negative integer and
+ * that 1+a-b is not a negative integer. If one of them
+ * is, then the 2F0 actually terminates, the above
+ * relation is an equality, and the sum should be
+ * evaluated directly [see below].
+ */
+static
+int
+d9chu(const double a, const double b, const double x, gsl_sf_result * result)
+{
+ const double EPS = 8.0 * GSL_DBL_EPSILON; /* EPS = 4.0D0*D1MACH(4) */
+ const int maxiter = 500;
+ double aa[4], bb[4];
+ int i;
+
+ double bp = 1.0 + a - b;
+ double ab = a*bp;
+ double ct2 = 2.0 * (x - ab);
+ double sab = a + bp;
+
+ double ct3 = sab + 1.0 + ab;
+ double anbn = ct3 + sab + 3.0;
+ double ct1 = 1.0 + 2.0*x/anbn;
+
+ bb[0] = 1.0;
+ aa[0] = 1.0;
+
+ bb[1] = 1.0 + 2.0*x/ct3;
+ aa[1] = 1.0 + ct2/ct3;
+
+ bb[2] = 1.0 + 6.0*ct1*x/ct3;
+ aa[2] = 1.0 + 6.0*ab/anbn + 3.0*ct1*ct2/ct3;
+
+ for(i=4; i<maxiter; i++) {
+ int j;
+ double c2;
+ double d1z;
+ double g1, g2, g3;
+ double x2i1 = 2*i - 3;
+ ct1 = x2i1/(x2i1-2.0);
+ anbn += x2i1 + sab;
+ ct2 = (x2i1 - 1.0)/anbn;
+ c2 = x2i1*ct2 - 1.0;
+ d1z = 2.0*x2i1*x/anbn;
+
+ ct3 = sab*ct2;
+ g1 = d1z + ct1*(c2+ct3);
+ g2 = d1z - c2;
+ g3 = ct1*(1.0 - ct3 - 2.0*ct2);
+
+ bb[3] = g1*bb[2] + g2*bb[1] + g3*bb[0];
+ aa[3] = g1*aa[2] + g2*aa[1] + g3*aa[0];
+
+ if(fabs(aa[3]*bb[0]-aa[0]*bb[3]) < EPS*fabs(bb[3]*bb[0])) break;
+
+ for(j=0; j<3; j++) {
+ aa[j] = aa[j+1];
+ bb[j] = bb[j+1];
+ }
+ }
+
+ result->val = aa[3]/bb[3];
+ result->err = 8.0 * GSL_DBL_EPSILON * fabs(result->val);
+
+ if(i == maxiter) {
+ GSL_ERROR ("error", GSL_EMAXITER);
+ }
+ else {
+ return GSL_SUCCESS;
+ }
+}
+
+
+/* Evaluate asymptotic for z^a U(a,b,z) ~ 2F0(a,1+a-b,-1/z)
+ * We check for termination of the 2F0 as a special case.
+ * Assumes x > 0.
+ * Also assumes a,b are not too large compared to x.
+ */
+static
+int
+hyperg_zaU_asymp(const double a, const double b, const double x, gsl_sf_result *result)
+{
+ const double ap = a;
+ const double bp = 1.0 + a - b;
+ const double rintap = floor(ap + 0.5);
+ const double rintbp = floor(bp + 0.5);
+ const int ap_neg_int = ( ap < 0.0 && fabs(ap - rintap) < INT_THRESHOLD );
+ const int bp_neg_int = ( bp < 0.0 && fabs(bp - rintbp) < INT_THRESHOLD );
+
+ if(ap_neg_int || bp_neg_int) {
+ /* Evaluate 2F0 polynomial.
+ */
+ double mxi = -1.0/x;
+ double nmax = -(int)(GSL_MIN(ap,bp) - 0.1);
+ double tn = 1.0;
+ double sum = 1.0;
+ double n = 1.0;
+ double sum_err = 0.0;
+ while(n <= nmax) {
+ double apn = (ap+n-1.0);
+ double bpn = (bp+n-1.0);
+ tn *= ((apn/n)*mxi)*bpn;
+ sum += tn;
+ sum_err += 2.0 * GSL_DBL_EPSILON * fabs(tn);
+ n += 1.0;
+ }
+ result->val = sum;
+ result->err = sum_err;
+ result->err += 2.0 * GSL_DBL_EPSILON * (fabs(nmax)+1.0) * fabs(sum);
+ return GSL_SUCCESS;
+ }
+ else {
+ return d9chu(a,b,x,result);
+ }
+}
+
+
+/* Evaluate finite sum which appears below.
+ */
+static
+int
+hyperg_U_finite_sum(int N, double a, double b, double x, double xeps,
+ gsl_sf_result * result)
+{
+ int i;
+ double sum_val;
+ double sum_err;
+
+ if(N <= 0) {
+ double t_val = 1.0;
+ double t_err = 0.0;
+ gsl_sf_result poch;
+ int stat_poch;
+
+ sum_val = 1.0;
+ sum_err = 0.0;
+ for(i=1; i<= -N; i++) {
+ const double xi1 = i - 1;
+ const double mult = (a+xi1)*x/((b+xi1)*(xi1+1.0));
+ t_val *= mult;
+ t_err += fabs(mult) * t_err + fabs(t_val) * 8.0 * 2.0 * GSL_DBL_EPSILON;
+ sum_val += t_val;
+ sum_err += t_err;
+ }
+
+ stat_poch = gsl_sf_poch_e(1.0+a-b, -a, &poch);
+
+ result->val = sum_val * poch.val;
+ result->err = fabs(sum_val) * poch.err + sum_err * fabs(poch.val);
+ result->err += fabs(poch.val) * (fabs(N) + 2.0) * GSL_DBL_EPSILON * fabs(sum_val);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ result->err *= 2.0; /* FIXME: fudge factor... why is the error estimate too small? */
+ return stat_poch;
+ }
+ else {
+ const int M = N - 2;
+ if(M < 0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else {
+ gsl_sf_result gbm1;
+ gsl_sf_result gamr;
+ int stat_gbm1;
+ int stat_gamr;
+ double t_val = 1.0;
+ double t_err = 0.0;
+
+ sum_val = 1.0;
+ sum_err = 0.0;
+ for(i=1; i<=M; i++) {
+ const double mult = (a-b+i)*x/((1.0-b+i)*i);
+ t_val *= mult;
+ t_err += t_err * fabs(mult) + fabs(t_val) * 8.0 * 2.0 * GSL_DBL_EPSILON;
+ sum_val += t_val;
+ sum_err += t_err;
+ }
+
+ stat_gbm1 = gsl_sf_gamma_e(b-1.0, &gbm1);
+ stat_gamr = gsl_sf_gammainv_e(a, &gamr);
+
+ if(stat_gbm1 == GSL_SUCCESS) {
+ gsl_sf_result powx1N;
+ int stat_p = gsl_sf_pow_int_e(x, 1-N, &powx1N);
+ double pe_val = powx1N.val * xeps;
+ double pe_err = powx1N.err * fabs(xeps) + 2.0 * GSL_DBL_EPSILON * fabs(pe_val);
+ double coeff_val = gbm1.val * gamr.val * pe_val;
+ double coeff_err = gbm1.err * fabs(gamr.val * pe_val)
+ + gamr.err * fabs(gbm1.val * pe_val)
+ + fabs(gbm1.val * gamr.val) * pe_err
+ + 2.0 * GSL_DBL_EPSILON * fabs(coeff_val);
+
+ result->val = sum_val * coeff_val;
+ result->err = fabs(sum_val) * coeff_err + sum_err * fabs(coeff_val);
+ result->err += 2.0 * GSL_DBL_EPSILON * (M+2.0) * fabs(result->val);
+ result->err *= 2.0; /* FIXME: fudge factor... why is the error estimate too small? */
+ return stat_p;
+ }
+ else {
+ result->val = 0.0;
+ result->err = 0.0;
+ return stat_gbm1;
+ }
+ }
+ }
+}
+
+
+/* Based on SLATEC DCHU() [W. Fullerton]
+ * Assumes x > 0.
+ * This is just a series summation method, and
+ * it is not good for large a.
+ *
+ * I patched up the window for 1+a-b near zero. [GJ]
+ */
+static
+int
+hyperg_U_series(const double a, const double b, const double x, gsl_sf_result * result)
+{
+ const double EPS = 2.0 * GSL_DBL_EPSILON; /* EPS = D1MACH(3) */
+ const double SQRT_EPS = M_SQRT2 * GSL_SQRT_DBL_EPSILON;
+
+ if(fabs(1.0 + a - b) < SQRT_EPS) {
+ /* Original Comment: ALGORITHM IS BAD WHEN 1+A-B IS NEAR ZERO FOR SMALL X
+ */
+ /* We can however do the following:
+ * U(a,b,x) = U(a,a+1,x) when 1+a-b=0
+ * and U(a,a+1,x) = x^(-a).
+ */
+ double lnr = -a * log(x);
+ int stat_e = gsl_sf_exp_e(lnr, result);
+ result->err += 2.0 * SQRT_EPS * fabs(result->val);
+ return stat_e;
+ }
+ else {
+ double aintb = ( b < 0.0 ? ceil(b-0.5) : floor(b+0.5) );
+ double beps = b - aintb;
+ int N = aintb;
+
+ double lnx = log(x);
+ double xeps = exp(-beps*lnx);
+
+ /* Evaluate finite sum.
+ */
+ gsl_sf_result sum;
+ int stat_sum = hyperg_U_finite_sum(N, a, b, x, xeps, &sum);
+
+
+ /* Evaluate infinite sum. */
+
+ int istrt = ( N < 1 ? 1-N : 0 );
+ double xi = istrt;
+
+ gsl_sf_result gamr;
+ gsl_sf_result powx;
+ int stat_gamr = gsl_sf_gammainv_e(1.0+a-b, &gamr);
+ int stat_powx = gsl_sf_pow_int_e(x, istrt, &powx);
+ double sarg = beps*M_PI;
+ double sfact = ( sarg != 0.0 ? sarg/sin(sarg) : 1.0 );
+ double factor_val = sfact * ( GSL_IS_ODD(N) ? -1.0 : 1.0 ) * gamr.val * powx.val;
+ double factor_err = fabs(gamr.val) * powx.err + fabs(powx.val) * gamr.err
+ + 2.0 * GSL_DBL_EPSILON * fabs(factor_val);
+
+ gsl_sf_result pochai;
+ gsl_sf_result gamri1;
+ gsl_sf_result gamrni;
+ int stat_pochai = gsl_sf_poch_e(a, xi, &pochai);
+ int stat_gamri1 = gsl_sf_gammainv_e(xi + 1.0, &gamri1);
+ int stat_gamrni = gsl_sf_gammainv_e(aintb + xi, &gamrni);
+ int stat_gam123 = GSL_ERROR_SELECT_3(stat_gamr, stat_gamri1, stat_gamrni);
+ int stat_gamall = GSL_ERROR_SELECT_4(stat_sum, stat_gam123, stat_pochai, stat_powx);
+
+ gsl_sf_result pochaxibeps;
+ gsl_sf_result gamrxi1beps;
+ int stat_pochaxibeps = gsl_sf_poch_e(a, xi-beps, &pochaxibeps);
+ int stat_gamrxi1beps = gsl_sf_gammainv_e(xi + 1.0 - beps, &gamrxi1beps);
+
+ int stat_all = GSL_ERROR_SELECT_3(stat_gamall, stat_pochaxibeps, stat_gamrxi1beps);
+
+ double b0_val = factor_val * pochaxibeps.val * gamrni.val * gamrxi1beps.val;
+ double b0_err = fabs(factor_val * pochaxibeps.val * gamrni.val) * gamrxi1beps.err
+ + fabs(factor_val * pochaxibeps.val * gamrxi1beps.val) * gamrni.err
+ + fabs(factor_val * gamrni.val * gamrxi1beps.val) * pochaxibeps.err
+ + fabs(pochaxibeps.val * gamrni.val * gamrxi1beps.val) * factor_err
+ + 2.0 * GSL_DBL_EPSILON * fabs(b0_val);
+
+ if(fabs(xeps-1.0) < 0.5) {
+ /*
+ C X**(-BEPS) IS CLOSE TO 1.0D0, SO WE MUST BE
+ C CAREFUL IN EVALUATING THE DIFFERENCES.
+ */
+ int i;
+ gsl_sf_result pch1ai;
+ gsl_sf_result pch1i;
+ gsl_sf_result poch1bxibeps;
+ int stat_pch1ai = gsl_sf_pochrel_e(a + xi, -beps, &pch1ai);
+ int stat_pch1i = gsl_sf_pochrel_e(xi + 1.0 - beps, beps, &pch1i);
+ int stat_poch1bxibeps = gsl_sf_pochrel_e(b+xi, -beps, &poch1bxibeps);
+ double c0_t1_val = beps*pch1ai.val*pch1i.val;
+ double c0_t1_err = fabs(beps) * fabs(pch1ai.val) * pch1i.err
+ + fabs(beps) * fabs(pch1i.val) * pch1ai.err
+ + 2.0 * GSL_DBL_EPSILON * fabs(c0_t1_val);
+ double c0_t2_val = -poch1bxibeps.val + pch1ai.val - pch1i.val + c0_t1_val;
+ double c0_t2_err = poch1bxibeps.err + pch1ai.err + pch1i.err + c0_t1_err
+ + 2.0 * GSL_DBL_EPSILON * fabs(c0_t2_val);
+ double c0_val = factor_val * pochai.val * gamrni.val * gamri1.val * c0_t2_val;
+ double c0_err = fabs(factor_val * pochai.val * gamrni.val * gamri1.val) * c0_t2_err
+ + fabs(factor_val * pochai.val * gamrni.val * c0_t2_val) * gamri1.err
+ + fabs(factor_val * pochai.val * gamri1.val * c0_t2_val) * gamrni.err
+ + fabs(factor_val * gamrni.val * gamri1.val * c0_t2_val) * pochai.err
+ + fabs(pochai.val * gamrni.val * gamri1.val * c0_t2_val) * factor_err
+ + 2.0 * GSL_DBL_EPSILON * fabs(c0_val);
+ /*
+ C XEPS1 = (1.0 - X**(-BEPS))/BEPS = (X**(-BEPS) - 1.0)/(-BEPS)
+ */
+ gsl_sf_result dexprl;
+ int stat_dexprl = gsl_sf_exprel_e(-beps*lnx, &dexprl);
+ double xeps1_val = lnx * dexprl.val;
+ double xeps1_err = 2.0 * GSL_DBL_EPSILON * (1.0 + fabs(beps*lnx)) * fabs(dexprl.val)
+ + fabs(lnx) * dexprl.err
+ + 2.0 * GSL_DBL_EPSILON * fabs(xeps1_val);
+ double dchu_val = sum.val + c0_val + xeps1_val*b0_val;
+ double dchu_err = sum.err + c0_err
+ + fabs(xeps1_val)*b0_err + xeps1_err * fabs(b0_val)
+ + fabs(b0_val*lnx)*dexprl.err
+ + 2.0 * GSL_DBL_EPSILON * (fabs(sum.val) + fabs(c0_val) + fabs(xeps1_val*b0_val));
+ double xn = N;
+ double t_val;
+ double t_err;
+
+ stat_all = GSL_ERROR_SELECT_5(stat_all, stat_dexprl, stat_poch1bxibeps, stat_pch1i, stat_pch1ai);
+
+ for(i=1; i<2000; i++) {
+ const double xi = istrt + i;
+ const double xi1 = istrt + i - 1;
+ const double tmp = (a-1.0)*(xn+2.0*xi-1.0) + xi*(xi-beps);
+ const double b0_multiplier = (a+xi1-beps)*x/((xn+xi1)*(xi-beps));
+ const double c0_multiplier_1 = (a+xi1)*x/((b+xi1)*xi);
+ const double c0_multiplier_2 = tmp / (xi*(b+xi1)*(a+xi1-beps));
+ b0_val *= b0_multiplier;
+ b0_err += fabs(b0_multiplier) * b0_err + fabs(b0_val) * 8.0 * 2.0 * GSL_DBL_EPSILON;
+ c0_val = c0_multiplier_1 * c0_val - c0_multiplier_2 * b0_val;
+ c0_err = fabs(c0_multiplier_1) * c0_err
+ + fabs(c0_multiplier_2) * b0_err
+ + fabs(c0_val) * 8.0 * 2.0 * GSL_DBL_EPSILON
+ + fabs(b0_val * c0_multiplier_2) * 16.0 * 2.0 * GSL_DBL_EPSILON;
+ t_val = c0_val + xeps1_val*b0_val;
+ t_err = c0_err + fabs(xeps1_val)*b0_err;
+ t_err += fabs(b0_val*lnx) * dexprl.err;
+ t_err += fabs(b0_val)*xeps1_err;
+ dchu_val += t_val;
+ dchu_err += t_err;
+ if(fabs(t_val) < EPS*fabs(dchu_val)) break;
+ }
+
+ result->val = dchu_val;
+ result->err = 2.0 * dchu_err;
+ result->err += 2.0 * fabs(t_val);
+ result->err += 4.0 * GSL_DBL_EPSILON * (i+2.0) * fabs(dchu_val);
+ result->err *= 2.0; /* FIXME: fudge factor */
+
+ if(i >= 2000) {
+ GSL_ERROR ("error", GSL_EMAXITER);
+ }
+ else {
+ return stat_all;
+ }
+ }
+ else {
+ /*
+ C X**(-BEPS) IS VERY DIFFERENT FROM 1.0, SO THE
+ C STRAIGHTFORWARD FORMULATION IS STABLE.
+ */
+ int i;
+ double dchu_val;
+ double dchu_err;
+ double t_val;
+ double t_err;
+ gsl_sf_result dgamrbxi;
+ int stat_dgamrbxi = gsl_sf_gammainv_e(b+xi, &dgamrbxi);
+ double a0_val = factor_val * pochai.val * dgamrbxi.val * gamri1.val / beps;
+ double a0_err = fabs(factor_val * pochai.val * dgamrbxi.val / beps) * gamri1.err
+ + fabs(factor_val * pochai.val * gamri1.val / beps) * dgamrbxi.err
+ + fabs(factor_val * dgamrbxi.val * gamri1.val / beps) * pochai.err
+ + fabs(pochai.val * dgamrbxi.val * gamri1.val / beps) * factor_err
+ + 2.0 * GSL_DBL_EPSILON * fabs(a0_val);
+ stat_all = GSL_ERROR_SELECT_2(stat_all, stat_dgamrbxi);
+
+ b0_val = xeps * b0_val / beps;
+ b0_err = fabs(xeps / beps) * b0_err + 4.0 * GSL_DBL_EPSILON * fabs(b0_val);
+ dchu_val = sum.val + a0_val - b0_val;
+ dchu_err = sum.err + a0_err + b0_err
+ + 2.0 * GSL_DBL_EPSILON * (fabs(sum.val) + fabs(a0_val) + fabs(b0_val));
+
+ for(i=1; i<2000; i++) {
+ double xi = istrt + i;
+ double xi1 = istrt + i - 1;
+ double a0_multiplier = (a+xi1)*x/((b+xi1)*xi);
+ double b0_multiplier = (a+xi1-beps)*x/((aintb+xi1)*(xi-beps));
+ a0_val *= a0_multiplier;
+ a0_err += fabs(a0_multiplier) * a0_err;
+ b0_val *= b0_multiplier;
+ b0_err += fabs(b0_multiplier) * b0_err;
+ t_val = a0_val - b0_val;
+ t_err = a0_err + b0_err;
+ dchu_val += t_val;
+ dchu_err += t_err;
+ if(fabs(t_val) < EPS*fabs(dchu_val)) break;
+ }
+
+ result->val = dchu_val;
+ result->err = 2.0 * dchu_err;
+ result->err += 2.0 * fabs(t_val);
+ result->err += 4.0 * GSL_DBL_EPSILON * (i+2.0) * fabs(dchu_val);
+ result->err *= 2.0; /* FIXME: fudge factor */
+
+ if(i >= 2000) {
+ GSL_ERROR ("error", GSL_EMAXITER);
+ }
+ else {
+ return stat_all;
+ }
+ }
+ }
+}
+
+
+/* Assumes b > 0 and x > 0.
+ */
+static
+int
+hyperg_U_small_ab(const double a, const double b, const double x, gsl_sf_result * result)
+{
+ if(a == -1.0) {
+ /* U(-1,c+1,x) = Laguerre[c,0,x] = -b + x
+ */
+ result->val = -b + x;
+ result->err = 2.0 * GSL_DBL_EPSILON * (fabs(b) + fabs(x));
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(a == 0.0) {
+ /* U(0,c+1,x) = Laguerre[c,0,x] = 1
+ */
+ result->val = 1.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(ASYMP_EVAL_OK(a,b,x)) {
+ double p = pow(x, -a);
+ gsl_sf_result asymp;
+ int stat_asymp = hyperg_zaU_asymp(a, b, x, &asymp);
+ result->val = asymp.val * p;
+ result->err = asymp.err * p;
+ result->err += fabs(asymp.val) * GSL_DBL_EPSILON * fabs(a) * p;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return stat_asymp;
+ }
+ else {
+ return hyperg_U_series(a, b, x, result);
+ }
+}
+
+
+/* Assumes b > 0 and x > 0.
+ */
+static
+int
+hyperg_U_small_a_bgt0(const double a, const double b, const double x,
+ gsl_sf_result * result,
+ double * ln_multiplier
+ )
+{
+ if(a == 0.0) {
+ result->val = 1.0;
+ result->err = 1.0;
+ *ln_multiplier = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if( (b > 5000.0 && x < 0.90 * fabs(b))
+ || (b > 500.0 && x < 0.50 * fabs(b))
+ ) {
+ int stat = gsl_sf_hyperg_U_large_b_e(a, b, x, result, ln_multiplier);
+ if(stat == GSL_EOVRFLW)
+ return GSL_SUCCESS;
+ else
+ return stat;
+ }
+ else if(b > 15.0) {
+ /* Recurse up from b near 1.
+ */
+ double eps = b - floor(b);
+ double b0 = 1.0 + eps;
+ gsl_sf_result r_Ubm1;
+ gsl_sf_result r_Ub;
+ int stat_0 = hyperg_U_small_ab(a, b0, x, &r_Ubm1);
+ int stat_1 = hyperg_U_small_ab(a, b0+1.0, x, &r_Ub);
+ double Ubm1 = r_Ubm1.val;
+ double Ub = r_Ub.val;
+ double Ubp1;
+ double bp;
+
+ for(bp = b0+1.0; bp<b-0.1; bp += 1.0) {
+ Ubp1 = ((1.0+a-bp)*Ubm1 + (bp+x-1.0)*Ub)/x;
+ Ubm1 = Ub;
+ Ub = Ubp1;
+ }
+ result->val = Ub;
+ result->err = (fabs(r_Ubm1.err/r_Ubm1.val) + fabs(r_Ub.err/r_Ub.val)) * fabs(Ub);
+ result->err += 2.0 * GSL_DBL_EPSILON * (fabs(b-b0)+1.0) * fabs(Ub);
+ *ln_multiplier = 0.0;
+ return GSL_ERROR_SELECT_2(stat_0, stat_1);
+ }
+ else {
+ *ln_multiplier = 0.0;
+ return hyperg_U_small_ab(a, b, x, result);
+ }
+}
+
+
+/* We use this to keep track of large
+ * dynamic ranges in the recursions.
+ * This can be important because sometimes
+ * we want to calculate a very large and
+ * a very small number and the answer is
+ * the product, of order 1. This happens,
+ * for instance, when we apply a Kummer
+ * transform to make b positive and
+ * both x and b are large.
+ */
+#define RESCALE_2(u0,u1,factor,count) \
+do { \
+ double au0 = fabs(u0); \
+ if(au0 > factor) { \
+ u0 /= factor; \
+ u1 /= factor; \
+ count++; \
+ } \
+ else if(au0 < 1.0/factor) { \
+ u0 *= factor; \
+ u1 *= factor; \
+ count--; \
+ } \
+} while (0)
+
+
+/* Specialization to b >= 1, for integer parameters.
+ * Assumes x > 0.
+ */
+static
+int
+hyperg_U_int_bge1(const int a, const int b, const double x,
+ gsl_sf_result_e10 * result)
+{
+ if(a == 0) {
+ result->val = 1.0;
+ result->err = 0.0;
+ result->e10 = 0;
+ return GSL_SUCCESS;
+ }
+ else if(a == -1) {
+ result->val = -b + x;
+ result->err = 2.0 * GSL_DBL_EPSILON * (fabs(b) + fabs(x));
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ result->e10 = 0;
+ return GSL_SUCCESS;
+ }
+ else if(b == a + 1) {
+ /* U(a,a+1,x) = x^(-a)
+ */
+ return gsl_sf_exp_e10_e(-a*log(x), result);
+ }
+ else if(ASYMP_EVAL_OK(a,b,x)) {
+ const double ln_pre_val = -a*log(x);
+ const double ln_pre_err = 2.0 * GSL_DBL_EPSILON * fabs(ln_pre_val);
+ gsl_sf_result asymp;
+ int stat_asymp = hyperg_zaU_asymp(a, b, x, &asymp);
+ int stat_e = gsl_sf_exp_mult_err_e10_e(ln_pre_val, ln_pre_err,
+ asymp.val, asymp.err,
+ result);
+ return GSL_ERROR_SELECT_2(stat_e, stat_asymp);
+ }
+ else if(SERIES_EVAL_OK(a,b,x)) {
+ gsl_sf_result ser;
+ const int stat_ser = hyperg_U_series(a, b, x, &ser);
+ result->val = ser.val;
+ result->err = ser.err;
+ result->e10 = 0;
+ return stat_ser;
+ }
+ else if(a < 0) {
+ /* Recurse backward from a = -1,0.
+ */
+ int scale_count = 0;
+ const double scale_factor = GSL_SQRT_DBL_MAX;
+ gsl_sf_result lnm;
+ gsl_sf_result y;
+ double lnscale;
+ double Uap1 = 1.0; /* U(0,b,x) */
+ double Ua = -b + x; /* U(-1,b,x) */
+ double Uam1;
+ int ap;
+
+ for(ap=-1; ap>a; ap--) {
+ Uam1 = ap*(b-ap-1.0)*Uap1 + (x+2.0*ap-b)*Ua;
+ Uap1 = Ua;
+ Ua = Uam1;
+ RESCALE_2(Ua,Uap1,scale_factor,scale_count);
+ }
+
+ lnscale = log(scale_factor);
+ lnm.val = scale_count*lnscale;
+ lnm.err = 2.0 * GSL_DBL_EPSILON * fabs(lnm.val);
+ y.val = Ua;
+ y.err = 4.0 * GSL_DBL_EPSILON * (fabs(a)+1.0) * fabs(Ua);
+ return gsl_sf_exp_mult_err_e10_e(lnm.val, lnm.err, y.val, y.err, result);
+ }
+ else if(b >= 2.0*a + x) {
+ /* Recurse forward from a = 0,1.
+ */
+ int scale_count = 0;
+ const double scale_factor = GSL_SQRT_DBL_MAX;
+ gsl_sf_result r_Ua;
+ gsl_sf_result lnm;
+ gsl_sf_result y;
+ double lnscale;
+ double lm;
+ int stat_1 = hyperg_U_small_a_bgt0(1.0, b, x, &r_Ua, &lm); /* U(1,b,x) */
+ int stat_e;
+ double Uam1 = 1.0; /* U(0,b,x) */
+ double Ua = r_Ua.val;
+ double Uap1;
+ int ap;
+
+ Uam1 *= exp(-lm);
+
+ for(ap=1; ap<a; ap++) {
+ Uap1 = -(Uam1 + (b-2.0*ap-x)*Ua)/(ap*(1.0+ap-b));
+ Uam1 = Ua;
+ Ua = Uap1;
+ RESCALE_2(Ua,Uam1,scale_factor,scale_count);
+ }
+
+ lnscale = log(scale_factor);
+ lnm.val = lm + scale_count * lnscale;
+ lnm.err = 2.0 * GSL_DBL_EPSILON * (fabs(lm) + fabs(scale_count*lnscale));
+ y.val = Ua;
+ y.err = fabs(r_Ua.err/r_Ua.val) * fabs(Ua);
+ y.err += 2.0 * GSL_DBL_EPSILON * (fabs(a) + 1.0) * fabs(Ua);
+ stat_e = gsl_sf_exp_mult_err_e10_e(lnm.val, lnm.err, y.val, y.err, result);
+ return GSL_ERROR_SELECT_2(stat_e, stat_1);
+ }
+ else {
+ if(b <= x) {
+ /* Recurse backward either to the b=a+1 line
+ * or to a=0, whichever we hit.
+ */
+ const double scale_factor = GSL_SQRT_DBL_MAX;
+ int scale_count = 0;
+ int stat_CF1;
+ double ru;
+ int CF1_count;
+ int a_target;
+ double lnU_target;
+ double Ua;
+ double Uap1;
+ double Uam1;
+ int ap;
+
+ if(b < a + 1) {
+ a_target = b-1;
+ lnU_target = -a_target*log(x);
+ }
+ else {
+ a_target = 0;
+ lnU_target = 0.0;
+ }
+
+ stat_CF1 = hyperg_U_CF1(a, b, 0, x, &ru, &CF1_count);
+
+ Ua = 1.0;
+ Uap1 = ru/a * Ua;
+ for(ap=a; ap>a_target; ap--) {
+ Uam1 = -((b-2.0*ap-x)*Ua + ap*(1.0+ap-b)*Uap1);
+ Uap1 = Ua;
+ Ua = Uam1;
+ RESCALE_2(Ua,Uap1,scale_factor,scale_count);
+ }
+
+ if(Ua == 0.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ result->e10 = 0;
+ GSL_ERROR ("error", GSL_EZERODIV);
+ }
+ else {
+ double lnscl = -scale_count*log(scale_factor);
+ double lnpre_val = lnU_target + lnscl;
+ double lnpre_err = 2.0 * GSL_DBL_EPSILON * (fabs(lnU_target) + fabs(lnscl));
+ double oUa_err = 2.0 * (fabs(a_target-a) + CF1_count + 1.0) * GSL_DBL_EPSILON * fabs(1.0/Ua);
+ int stat_e = gsl_sf_exp_mult_err_e10_e(lnpre_val, lnpre_err,
+ 1.0/Ua, oUa_err,
+ result);
+ return GSL_ERROR_SELECT_2(stat_e, stat_CF1);
+ }
+ }
+ else {
+ /* Recurse backward to near the b=2a+x line, then
+ * determine normalization by either direct evaluation
+ * or by a forward recursion. The direct evaluation
+ * is needed when x is small (which is precisely
+ * when it is easy to do).
+ */
+ const double scale_factor = GSL_SQRT_DBL_MAX;
+ int scale_count_for = 0;
+ int scale_count_bck = 0;
+ int a0 = 1;
+ int a1 = a0 + ceil(0.5*(b-x) - a0);
+ double Ua1_bck_val;
+ double Ua1_bck_err;
+ double Ua1_for_val;
+ double Ua1_for_err;
+ int stat_for;
+ int stat_bck;
+ gsl_sf_result lm_for;
+
+ {
+ /* Recurse back to determine U(a1,b), sans normalization.
+ */
+ double ru;
+ int CF1_count;
+ int stat_CF1 = hyperg_U_CF1(a, b, 0, x, &ru, &CF1_count);
+ double Ua = 1.0;
+ double Uap1 = ru/a * Ua;
+ double Uam1;
+ int ap;
+ for(ap=a; ap>a1; ap--) {
+ Uam1 = -((b-2.0*ap-x)*Ua + ap*(1.0+ap-b)*Uap1);
+ Uap1 = Ua;
+ Ua = Uam1;
+ RESCALE_2(Ua,Uap1,scale_factor,scale_count_bck);
+ }
+ Ua1_bck_val = Ua;
+ Ua1_bck_err = 2.0 * GSL_DBL_EPSILON * (fabs(a1-a)+CF1_count+1.0) * fabs(Ua);
+ stat_bck = stat_CF1;
+ }
+
+ if(b == 2*a1 && a1 > 1) {
+ /* This can happen when x is small, which is
+ * precisely when we need to be careful with
+ * this evaluation.
+ */
+ hyperg_lnU_beq2a((double)a1, x, &lm_for);
+ Ua1_for_val = 1.0;
+ Ua1_for_err = 0.0;
+ stat_for = GSL_SUCCESS;
+ }
+ else if(b == 2*a1 - 1 && a1 > 1) {
+ /* Similar to the above. Happens when x is small.
+ * Use
+ * U(a,2a-1) = (x U(a,2a) - U(a-1,2(a-1))) / (2a - 2)
+ */
+ gsl_sf_result lnU00, lnU12;
+ gsl_sf_result U00, U12;
+ hyperg_lnU_beq2a(a1-1.0, x, &lnU00);
+ hyperg_lnU_beq2a(a1, x, &lnU12);
+ if(lnU00.val > lnU12.val) {
+ lm_for.val = lnU00.val;
+ lm_for.err = lnU00.err;
+ U00.val = 1.0;
+ U00.err = 0.0;
+ gsl_sf_exp_err_e(lnU12.val - lm_for.val, lnU12.err + lm_for.err, &U12);
+ }
+ else {
+ lm_for.val = lnU12.val;
+ lm_for.err = lnU12.err;
+ U12.val = 1.0;
+ U12.err = 0.0;
+ gsl_sf_exp_err_e(lnU00.val - lm_for.val, lnU00.err + lm_for.err, &U00);
+ }
+ Ua1_for_val = (x * U12.val - U00.val) / (2.0*a1 - 2.0);
+ Ua1_for_err = (fabs(x)*U12.err + U00.err) / fabs(2.0*a1 - 2.0);
+ Ua1_for_err += 2.0 * GSL_DBL_EPSILON * fabs(Ua1_for_val);
+ stat_for = GSL_SUCCESS;
+ }
+ else {
+ /* Recurse forward to determine U(a1,b) with
+ * absolute normalization.
+ */
+ gsl_sf_result r_Ua;
+ double Uam1 = 1.0; /* U(a0-1,b,x) = U(0,b,x) */
+ double Ua;
+ double Uap1;
+ int ap;
+ double lm_for_local;
+ stat_for = hyperg_U_small_a_bgt0(a0, b, x, &r_Ua, &lm_for_local); /* U(1,b,x) */
+ Ua = r_Ua.val;
+ Uam1 *= exp(-lm_for_local);
+ lm_for.val = lm_for_local;
+ lm_for.err = 0.0;
+
+ for(ap=a0; ap<a1; ap++) {
+ Uap1 = -(Uam1 + (b-2.0*ap-x)*Ua)/(ap*(1.0+ap-b));
+ Uam1 = Ua;
+ Ua = Uap1;
+ RESCALE_2(Ua,Uam1,scale_factor,scale_count_for);
+ }
+ Ua1_for_val = Ua;
+ Ua1_for_err = fabs(Ua) * fabs(r_Ua.err/r_Ua.val);
+ Ua1_for_err += 2.0 * GSL_DBL_EPSILON * (fabs(a1-a0)+1.0) * fabs(Ua1_for_val);
+ }
+
+ /* Now do the matching to produce the final result.
+ */
+ if(Ua1_bck_val == 0.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ result->e10 = 0;
+ GSL_ERROR ("error", GSL_EZERODIV);
+ }
+ else if(Ua1_for_val == 0.0) {
+ /* Should never happen. */
+ UNDERFLOW_ERROR_E10(result);
+ }
+ else {
+ double lns = (scale_count_for - scale_count_bck)*log(scale_factor);
+ double ln_for_val = log(fabs(Ua1_for_val));
+ double ln_for_err = GSL_DBL_EPSILON + fabs(Ua1_for_err/Ua1_for_val);
+ double ln_bck_val = log(fabs(Ua1_bck_val));
+ double ln_bck_err = GSL_DBL_EPSILON + fabs(Ua1_bck_err/Ua1_bck_val);
+ double lnr_val = lm_for.val + ln_for_val - ln_bck_val + lns;
+ double lnr_err = lm_for.err + ln_for_err + ln_bck_err
+ + 2.0 * GSL_DBL_EPSILON * (fabs(lm_for.val) + fabs(ln_for_val) + fabs(ln_bck_val) + fabs(lns));
+ double sgn = GSL_SIGN(Ua1_for_val) * GSL_SIGN(Ua1_bck_val);
+ int stat_e = gsl_sf_exp_err_e10_e(lnr_val, lnr_err, result);
+ result->val *= sgn;
+ return GSL_ERROR_SELECT_3(stat_e, stat_bck, stat_for);
+ }
+ }
+ }
+}
+
+
+/* Handle b >= 1 for generic a,b values.
+ */
+static
+int
+hyperg_U_bge1(const double a, const double b, const double x,
+ gsl_sf_result_e10 * result)
+{
+ const double rinta = floor(a+0.5);
+ const int a_neg_integer = (a < 0.0 && fabs(a - rinta) < INT_THRESHOLD);
+
+ if(a == 0.0) {
+ result->val = 1.0;
+ result->err = 0.0;
+ result->e10 = 0;
+ return GSL_SUCCESS;
+ }
+ else if(a_neg_integer && fabs(rinta) < INT_MAX) {
+ /* U(-n,b,x) = (-1)^n n! Laguerre[n,b-1,x]
+ */
+ const int n = -(int)rinta;
+ const double sgn = (GSL_IS_ODD(n) ? -1.0 : 1.0);
+ gsl_sf_result lnfact;
+ gsl_sf_result L;
+ const int stat_L = gsl_sf_laguerre_n_e(n, b-1.0, x, &L);
+ gsl_sf_lnfact_e(n, &lnfact);
+ {
+ const int stat_e = gsl_sf_exp_mult_err_e10_e(lnfact.val, lnfact.err,
+ sgn*L.val, L.err,
+ result);
+ return GSL_ERROR_SELECT_2(stat_e, stat_L);
+ }
+ }
+ else if(ASYMP_EVAL_OK(a,b,x)) {
+ const double ln_pre_val = -a*log(x);
+ const double ln_pre_err = 2.0 * GSL_DBL_EPSILON * fabs(ln_pre_val);
+ gsl_sf_result asymp;
+ int stat_asymp = hyperg_zaU_asymp(a, b, x, &asymp);
+ int stat_e = gsl_sf_exp_mult_err_e10_e(ln_pre_val, ln_pre_err,
+ asymp.val, asymp.err,
+ result);
+ return GSL_ERROR_SELECT_2(stat_e, stat_asymp);
+ }
+ else if(fabs(a) <= 1.0) {
+ gsl_sf_result rU;
+ double ln_multiplier;
+ int stat_U = hyperg_U_small_a_bgt0(a, b, x, &rU, &ln_multiplier);
+ int stat_e = gsl_sf_exp_mult_err_e10_e(ln_multiplier, 2.0*GSL_DBL_EPSILON*fabs(ln_multiplier), rU.val, rU.err, result);
+ return GSL_ERROR_SELECT_2(stat_U, stat_e);
+ }
+ else if(SERIES_EVAL_OK(a,b,x)) {
+ gsl_sf_result ser;
+ const int stat_ser = hyperg_U_series(a, b, x, &ser);
+ result->val = ser.val;
+ result->err = ser.err;
+ result->e10 = 0;
+ return stat_ser;
+ }
+ else if(a < 0.0) {
+ /* Recurse backward on a and then upward on b.
+ */
+ const double scale_factor = GSL_SQRT_DBL_MAX;
+ const double a0 = a - floor(a) - 1.0;
+ const double b0 = b - floor(b) + 1.0;
+ int scale_count = 0;
+ double lm_0, lm_1;
+ double lm_max;
+ gsl_sf_result r_Uap1;
+ gsl_sf_result r_Ua;
+ int stat_0 = hyperg_U_small_a_bgt0(a0+1.0, b0, x, &r_Uap1, &lm_0);
+ int stat_1 = hyperg_U_small_a_bgt0(a0, b0, x, &r_Ua, &lm_1);
+ int stat_e;
+ double Uap1 = r_Uap1.val;
+ double Ua = r_Ua.val;
+ double Uam1;
+ double ap;
+ lm_max = GSL_MAX(lm_0, lm_1);
+ Uap1 *= exp(lm_0-lm_max);
+ Ua *= exp(lm_1-lm_max);
+
+ /* Downward recursion on a.
+ */
+ for(ap=a0; ap>a+0.1; ap -= 1.0) {
+ Uam1 = ap*(b0-ap-1.0)*Uap1 + (x+2.0*ap-b0)*Ua;
+ Uap1 = Ua;
+ Ua = Uam1;
+ RESCALE_2(Ua,Uap1,scale_factor,scale_count);
+ }
+
+ if(b < 2.0) {
+ /* b == b0, so no recursion necessary
+ */
+ const double lnscale = log(scale_factor);
+ gsl_sf_result lnm;
+ gsl_sf_result y;
+ lnm.val = lm_max + scale_count * lnscale;
+ lnm.err = 2.0 * GSL_DBL_EPSILON * (fabs(lm_max) + scale_count * fabs(lnscale));
+ y.val = Ua;
+ y.err = fabs(r_Uap1.err/r_Uap1.val) * fabs(Ua);
+ y.err += fabs(r_Ua.err/r_Ua.val) * fabs(Ua);
+ y.err += 2.0 * GSL_DBL_EPSILON * (fabs(a-a0) + 1.0) * fabs(Ua);
+ y.err *= fabs(lm_0-lm_max) + 1.0;
+ y.err *= fabs(lm_1-lm_max) + 1.0;
+ stat_e = gsl_sf_exp_mult_err_e10_e(lnm.val, lnm.err, y.val, y.err, result);
+ }
+ else {
+ /* Upward recursion on b.
+ */
+ const double err_mult = fabs(b-b0) + fabs(a-a0) + 1.0;
+ const double lnscale = log(scale_factor);
+ gsl_sf_result lnm;
+ gsl_sf_result y;
+
+ double Ubm1 = Ua; /* U(a,b0) */
+ double Ub = (a*(b0-a-1.0)*Uap1 + (a+x)*Ua)/x; /* U(a,b0+1) */
+ double Ubp1;
+ double bp;
+ for(bp=b0+1.0; bp<b-0.1; bp += 1.0) {
+ Ubp1 = ((1.0+a-bp)*Ubm1 + (bp+x-1.0)*Ub)/x;
+ Ubm1 = Ub;
+ Ub = Ubp1;
+ RESCALE_2(Ub,Ubm1,scale_factor,scale_count);
+ }
+
+ lnm.val = lm_max + scale_count * lnscale;
+ lnm.err = 2.0 * GSL_DBL_EPSILON * (fabs(lm_max) + fabs(scale_count * lnscale));
+ y.val = Ub;
+ y.err = 2.0 * err_mult * fabs(r_Uap1.err/r_Uap1.val) * fabs(Ub);
+ y.err += 2.0 * err_mult * fabs(r_Ua.err/r_Ua.val) * fabs(Ub);
+ y.err += 2.0 * GSL_DBL_EPSILON * err_mult * fabs(Ub);
+ y.err *= fabs(lm_0-lm_max) + 1.0;
+ y.err *= fabs(lm_1-lm_max) + 1.0;
+ stat_e = gsl_sf_exp_mult_err_e10_e(lnm.val, lnm.err, y.val, y.err, result);
+ }
+ return GSL_ERROR_SELECT_3(stat_e, stat_0, stat_1);
+ }
+ else if(b >= 2*a + x) {
+ /* Recurse forward from a near zero.
+ * Note that we cannot cross the singularity at
+ * the line b=a+1, because the only way we could
+ * be in that little wedge is if a < 1. But we
+ * have already dealt with the small a case.
+ */
+ int scale_count = 0;
+ const double a0 = a - floor(a);
+ const double scale_factor = GSL_SQRT_DBL_MAX;
+ double lnscale;
+ double lm_0, lm_1, lm_max;
+ gsl_sf_result r_Uam1;
+ gsl_sf_result r_Ua;
+ int stat_0 = hyperg_U_small_a_bgt0(a0-1.0, b, x, &r_Uam1, &lm_0);
+ int stat_1 = hyperg_U_small_a_bgt0(a0, b, x, &r_Ua, &lm_1);
+ int stat_e;
+ gsl_sf_result lnm;
+ gsl_sf_result y;
+ double Uam1 = r_Uam1.val;
+ double Ua = r_Ua.val;
+ double Uap1;
+ double ap;
+ lm_max = GSL_MAX(lm_0, lm_1);
+ Uam1 *= exp(lm_0-lm_max);
+ Ua *= exp(lm_1-lm_max);
+
+ for(ap=a0; ap<a-0.1; ap += 1.0) {
+ Uap1 = -(Uam1 + (b-2.0*ap-x)*Ua)/(ap*(1.0+ap-b));
+ Uam1 = Ua;
+ Ua = Uap1;
+ RESCALE_2(Ua,Uam1,scale_factor,scale_count);
+ }
+
+ lnscale = log(scale_factor);
+ lnm.val = lm_max + scale_count * lnscale;
+ lnm.err = 2.0 * GSL_DBL_EPSILON * (fabs(lm_max) + fabs(scale_count * lnscale));
+ y.val = Ua;
+ y.err = fabs(r_Uam1.err/r_Uam1.val) * fabs(Ua);
+ y.err += fabs(r_Ua.err/r_Ua.val) * fabs(Ua);
+ y.err += 2.0 * GSL_DBL_EPSILON * (fabs(a-a0) + 1.0) * fabs(Ua);
+ y.err *= fabs(lm_0-lm_max) + 1.0;
+ y.err *= fabs(lm_1-lm_max) + 1.0;
+ stat_e = gsl_sf_exp_mult_err_e10_e(lnm.val, lnm.err, y.val, y.err, result);
+ return GSL_ERROR_SELECT_3(stat_e, stat_0, stat_1);
+ }
+ else {
+ if(b <= x) {
+ /* Recurse backward to a near zero.
+ */
+ const double a0 = a - floor(a);
+ const double scale_factor = GSL_SQRT_DBL_MAX;
+ int scale_count = 0;
+ gsl_sf_result lnm;
+ gsl_sf_result y;
+ double lnscale;
+ double lm_0;
+ double Uap1;
+ double Ua;
+ double Uam1;
+ gsl_sf_result U0;
+ double ap;
+ double ru;
+ double r;
+ int CF1_count;
+ int stat_CF1 = hyperg_U_CF1(a, b, 0, x, &ru, &CF1_count);
+ int stat_U0;
+ int stat_e;
+ r = ru/a;
+ Ua = GSL_SQRT_DBL_MIN;
+ Uap1 = r * Ua;
+ for(ap=a; ap>a0+0.1; ap -= 1.0) {
+ Uam1 = -((b-2.0*ap-x)*Ua + ap*(1.0+ap-b)*Uap1);
+ Uap1 = Ua;
+ Ua = Uam1;
+ RESCALE_2(Ua,Uap1,scale_factor,scale_count);
+ }
+
+ stat_U0 = hyperg_U_small_a_bgt0(a0, b, x, &U0, &lm_0);
+
+ lnscale = log(scale_factor);
+ lnm.val = lm_0 - scale_count * lnscale;
+ lnm.err = 2.0 * GSL_DBL_EPSILON * (fabs(lm_0) + fabs(scale_count * lnscale));
+ y.val = GSL_SQRT_DBL_MIN*(U0.val/Ua);
+ y.err = GSL_SQRT_DBL_MIN*(U0.err/fabs(Ua));
+ y.err += 2.0 * GSL_DBL_EPSILON * (fabs(a0-a) + CF1_count + 1.0) * fabs(y.val);
+ stat_e = gsl_sf_exp_mult_err_e10_e(lnm.val, lnm.err, y.val, y.err, result);
+ return GSL_ERROR_SELECT_3(stat_e, stat_U0, stat_CF1);
+ }
+ else {
+ /* Recurse backward to near the b=2a+x line, then
+ * forward from a near zero to get the normalization.
+ */
+ int scale_count_for = 0;
+ int scale_count_bck = 0;
+ const double scale_factor = GSL_SQRT_DBL_MAX;
+ const double eps = a - floor(a);
+ const double a0 = ( eps == 0.0 ? 1.0 : eps );
+ const double a1 = a0 + ceil(0.5*(b-x) - a0);
+ gsl_sf_result lnm;
+ gsl_sf_result y;
+ double lm_for;
+ double lnscale;
+ double Ua1_bck;
+ double Ua1_for;
+ int stat_for;
+ int stat_bck;
+ int stat_e;
+ int CF1_count;
+
+ {
+ /* Recurse back to determine U(a1,b), sans normalization.
+ */
+ double Uap1;
+ double Ua;
+ double Uam1;
+ double ap;
+ double ru;
+ double r;
+ int stat_CF1 = hyperg_U_CF1(a, b, 0, x, &ru, &CF1_count);
+ r = ru/a;
+ Ua = GSL_SQRT_DBL_MIN;
+ Uap1 = r * Ua;
+ for(ap=a; ap>a1+0.1; ap -= 1.0) {
+ Uam1 = -((b-2.0*ap-x)*Ua + ap*(1.0+ap-b)*Uap1);
+ Uap1 = Ua;
+ Ua = Uam1;
+ RESCALE_2(Ua,Uap1,scale_factor,scale_count_bck);
+ }
+ Ua1_bck = Ua;
+ stat_bck = stat_CF1;
+ }
+ {
+ /* Recurse forward to determine U(a1,b) with
+ * absolute normalization.
+ */
+ gsl_sf_result r_Uam1;
+ gsl_sf_result r_Ua;
+ double lm_0, lm_1;
+ int stat_0 = hyperg_U_small_a_bgt0(a0-1.0, b, x, &r_Uam1, &lm_0);
+ int stat_1 = hyperg_U_small_a_bgt0(a0, b, x, &r_Ua, &lm_1);
+ double Uam1 = r_Uam1.val;
+ double Ua = r_Ua.val;
+ double Uap1;
+ double ap;
+
+ lm_for = GSL_MAX(lm_0, lm_1);
+ Uam1 *= exp(lm_0 - lm_for);
+ Ua *= exp(lm_1 - lm_for);
+
+ for(ap=a0; ap<a1-0.1; ap += 1.0) {
+ Uap1 = -(Uam1 + (b-2.0*ap-x)*Ua)/(ap*(1.0+ap-b));
+ Uam1 = Ua;
+ Ua = Uap1;
+ RESCALE_2(Ua,Uam1,scale_factor,scale_count_for);
+ }
+ Ua1_for = Ua;
+ stat_for = GSL_ERROR_SELECT_2(stat_0, stat_1);
+ }
+
+ lnscale = log(scale_factor);
+ lnm.val = lm_for + (scale_count_for - scale_count_bck)*lnscale;
+ lnm.err = 2.0 * GSL_DBL_EPSILON * (fabs(lm_for) + fabs(scale_count_for - scale_count_bck)*fabs(lnscale));
+ y.val = GSL_SQRT_DBL_MIN*Ua1_for/Ua1_bck;
+ y.err = 2.0 * GSL_DBL_EPSILON * (fabs(a-a0) + CF1_count + 1.0) * fabs(y.val);
+ stat_e = gsl_sf_exp_mult_err_e10_e(lnm.val, lnm.err, y.val, y.err, result);
+ return GSL_ERROR_SELECT_3(stat_e, stat_bck, stat_for);
+ }
+ }
+}
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+
+int
+gsl_sf_hyperg_U_int_e10_e(const int a, const int b, const double x,
+ gsl_sf_result_e10 * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x <= 0.0) {
+ DOMAIN_ERROR_E10(result);
+ }
+ else {
+ if(b >= 1) {
+ return hyperg_U_int_bge1(a, b, x, result);
+ }
+ else {
+ /* Use the reflection formula
+ * U(a,b,x) = x^(1-b) U(1+a-b,2-b,x)
+ */
+ gsl_sf_result_e10 U;
+ double ln_x = log(x);
+ int ap = 1 + a - b;
+ int bp = 2 - b;
+ int stat_e;
+ int stat_U = hyperg_U_int_bge1(ap, bp, x, &U);
+ double ln_pre_val = (1.0-b)*ln_x;
+ double ln_pre_err = 2.0 * GSL_DBL_EPSILON * (fabs(b)+1.0) * fabs(ln_x);
+ ln_pre_err += 2.0 * GSL_DBL_EPSILON * fabs(1.0-b); /* error in log(x) */
+ stat_e = gsl_sf_exp_mult_err_e10_e(ln_pre_val + U.e10*M_LN10, ln_pre_err,
+ U.val, U.err,
+ result);
+ return GSL_ERROR_SELECT_2(stat_e, stat_U);
+ }
+ }
+}
+
+
+int
+gsl_sf_hyperg_U_e10_e(const double a, const double b, const double x,
+ gsl_sf_result_e10 * result)
+{
+ const double rinta = floor(a + 0.5);
+ const double rintb = floor(b + 0.5);
+ const int a_integer = ( fabs(a - rinta) < INT_THRESHOLD );
+ const int b_integer = ( fabs(b - rintb) < INT_THRESHOLD );
+
+ /* CHECK_POINTER(result) */
+
+ if(x <= 0.0) {
+ DOMAIN_ERROR_E10(result);
+ }
+ else if(a == 0.0) {
+ result->val = 1.0;
+ result->err = 0.0;
+ result->e10 = 0;
+ return GSL_SUCCESS;
+ }
+ else if(a_integer && b_integer) {
+ return gsl_sf_hyperg_U_int_e10_e(rinta, rintb, x, result);
+ }
+ else {
+ if(b >= 1.0) {
+ /* Use b >= 1 function.
+ */
+ return hyperg_U_bge1(a, b, x, result);
+ }
+ else {
+ /* Use the reflection formula
+ * U(a,b,x) = x^(1-b) U(1+a-b,2-b,x)
+ */
+ const double lnx = log(x);
+ const double ln_pre_val = (1.0-b)*lnx;
+ const double ln_pre_err = fabs(lnx) * 2.0 * GSL_DBL_EPSILON * (1.0 + fabs(b));
+ const double ap = 1.0 + a - b;
+ const double bp = 2.0 - b;
+ gsl_sf_result_e10 U;
+ int stat_U = hyperg_U_bge1(ap, bp, x, &U);
+ int stat_e = gsl_sf_exp_mult_err_e10_e(ln_pre_val + U.e10*M_LN10, ln_pre_err,
+ U.val, U.err,
+ result);
+ return GSL_ERROR_SELECT_2(stat_e, stat_U);
+ }
+ }
+}
+
+
+int
+gsl_sf_hyperg_U_int_e(const int a, const int b, const double x, gsl_sf_result * result)
+{
+ gsl_sf_result_e10 re;
+ int stat_U = gsl_sf_hyperg_U_int_e10_e(a, b, x, &re);
+ int stat_c = gsl_sf_result_smash_e(&re, result);
+ return GSL_ERROR_SELECT_2(stat_c, stat_U);
+}
+
+
+int
+gsl_sf_hyperg_U_e(const double a, const double b, const double x, gsl_sf_result * result)
+{
+ gsl_sf_result_e10 re;
+ int stat_U = gsl_sf_hyperg_U_e10_e(a, b, x, &re);
+ int stat_c = gsl_sf_result_smash_e(&re, result);
+ return GSL_ERROR_SELECT_2(stat_c, stat_U);
+}
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_hyperg_U_int(const int a, const int b, const double x)
+{
+ EVAL_RESULT(gsl_sf_hyperg_U_int_e(a, b, x, &result));
+}
+
+double gsl_sf_hyperg_U(const double a, const double b, const double x)
+{
+ EVAL_RESULT(gsl_sf_hyperg_U_e(a, b, x, &result));
+}
diff --git a/gsl-1.9/specfunc/laguerre.c b/gsl-1.9/specfunc/laguerre.c
new file mode 100644
index 0000000..355b35e
--- /dev/null
+++ b/gsl-1.9/specfunc/laguerre.c
@@ -0,0 +1,334 @@
+/* specfunc/laguerre.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_exp.h>
+#include <gsl/gsl_sf_gamma.h>
+#include <gsl/gsl_sf_laguerre.h>
+
+#include "error.h"
+
+/*-*-*-*-*-*-*-*-*-*-*-* Private Section *-*-*-*-*-*-*-*-*-*-*-*/
+
+
+/* based on the large 2b-4a asymptotic for 1F1
+ * [Abramowitz+Stegun, 13.5.21]
+ * L^a_n(x) = (a+1)_n / n! 1F1(-n,a+1,x)
+ *
+ * The second term (ser_term2) is from Slater,"The Confluent
+ * Hypergeometric Function" p.73. I think there may be an error in
+ * the first term of the expression given there, comparing with AS
+ * 13.5.21 (cf sin(a\pi+\Theta) vs sin(a\pi) + sin(\Theta)) - but the
+ * second term appears correct.
+ *
+ */
+static
+int
+laguerre_large_n(const int n, const double alpha, const double x,
+ gsl_sf_result * result)
+{
+ const double a = -n;
+ const double b = alpha + 1.0;
+ const double eta = 2.0*b - 4.0*a;
+ const double cos2th = x/eta;
+ const double sin2th = 1.0 - cos2th;
+ const double eps = asin(sqrt(cos2th)); /* theta = pi/2 - eps */
+ const double pre_h = 0.25*M_PI*M_PI*eta*eta*cos2th*sin2th;
+ gsl_sf_result lg_b;
+ gsl_sf_result lnfact;
+ int stat_lg = gsl_sf_lngamma_e(b+n, &lg_b);
+ int stat_lf = gsl_sf_lnfact_e(n, &lnfact);
+ double pre_term1 = 0.5*(1.0-b)*log(0.25*x*eta);
+ double pre_term2 = 0.25*log(pre_h);
+ double lnpre_val = lg_b.val - lnfact.val + 0.5*x + pre_term1 - pre_term2;
+ double lnpre_err = lg_b.err + lnfact.err + GSL_DBL_EPSILON * (fabs(pre_term1)+fabs(pre_term2));
+
+ double phi1 = 0.25*eta*(2*eps + sin(2.0*eps));
+ double ser_term1 = -sin(phi1);
+
+ double A1 = (1.0/12.0)*(5.0/(4.0*sin2th)+(3.0*b*b-6.0*b+2.0)*sin2th - 1.0);
+ double ser_term2 = -A1 * cos(phi1)/(0.25*eta*sin(2.0*eps));
+
+ double ser_val = ser_term1 + ser_term2;
+ double ser_err = ser_term2*ser_term2 + GSL_DBL_EPSILON * (fabs(ser_term1) + fabs(ser_term2));
+ int stat_e = gsl_sf_exp_mult_err_e(lnpre_val, lnpre_err, ser_val, ser_err, result);
+ result->err += 2.0 * GSL_SQRT_DBL_EPSILON * fabs(result->val);
+ return GSL_ERROR_SELECT_3(stat_e, stat_lf, stat_lg);
+}
+
+
+/* Evaluate polynomial based on confluent hypergeometric representation.
+ *
+ * L^a_n(x) = (a+1)_n / n! 1F1(-n,a+1,x)
+ *
+ * assumes n > 0 and a != negative integer greater than -n
+ */
+static
+int
+laguerre_n_cp(const int n, const double a, const double x, gsl_sf_result * result)
+{
+ gsl_sf_result lnfact;
+ gsl_sf_result lg1;
+ gsl_sf_result lg2;
+ double s1, s2;
+ int stat_f = gsl_sf_lnfact_e(n, &lnfact);
+ int stat_g1 = gsl_sf_lngamma_sgn_e(a+1.0+n, &lg1, &s1);
+ int stat_g2 = gsl_sf_lngamma_sgn_e(a+1.0, &lg2, &s2);
+ double poly_1F1_val = 1.0;
+ double poly_1F1_err = 0.0;
+ int stat_e;
+ int k;
+
+ double lnpre_val = (lg1.val - lg2.val) - lnfact.val;
+ double lnpre_err = lg1.err + lg2.err + lnfact.err + 2.0 * GSL_DBL_EPSILON * fabs(lnpre_val);
+
+ for(k=n-1; k>=0; k--) {
+ double t = (-n+k)/(a+1.0+k) * (x/(k+1));
+ double r = t + 1.0/poly_1F1_val;
+ if(r > 0.9*GSL_DBL_MAX/poly_1F1_val) {
+ /* internal error only, don't call the error handler */
+ INTERNAL_OVERFLOW_ERROR(result);
+ }
+ else {
+ /* Collect the Horner terms. */
+ poly_1F1_val = 1.0 + t * poly_1F1_val;
+ poly_1F1_err += GSL_DBL_EPSILON + fabs(t) * poly_1F1_err;
+ }
+ }
+
+ stat_e = gsl_sf_exp_mult_err_e(lnpre_val, lnpre_err,
+ poly_1F1_val, poly_1F1_err,
+ result);
+
+ return GSL_ERROR_SELECT_4(stat_e, stat_f, stat_g1, stat_g2);
+}
+
+
+/* Evaluate the polynomial based on the confluent hypergeometric
+ * function in a safe way, with no restriction on the arguments.
+ *
+ * assumes x != 0
+ */
+static
+int
+laguerre_n_poly_safe(const int n, const double a, const double x, gsl_sf_result * result)
+{
+ const double b = a + 1.0;
+ const double mx = -x;
+ const double tc_sgn = (x < 0.0 ? 1.0 : (GSL_IS_ODD(n) ? -1.0 : 1.0));
+ gsl_sf_result tc;
+ int stat_tc = gsl_sf_taylorcoeff_e(n, fabs(x), &tc);
+
+ if(stat_tc == GSL_SUCCESS) {
+ double term = tc.val * tc_sgn;
+ double sum_val = term;
+ double sum_err = tc.err;
+ int k;
+ for(k=n-1; k>=0; k--) {
+ term *= ((b+k)/(n-k))*(k+1.0)/mx;
+ sum_val += term;
+ sum_err += 4.0 * GSL_DBL_EPSILON * fabs(term);
+ }
+ result->val = sum_val;
+ result->err = sum_err + 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(stat_tc == GSL_EOVRFLW) {
+ result->val = 0.0; /* FIXME: should be Inf */
+ result->err = 0.0;
+ return stat_tc;
+ }
+ else {
+ result->val = 0.0;
+ result->err = 0.0;
+ return stat_tc;
+ }
+}
+
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*/
+
+int
+gsl_sf_laguerre_1_e(const double a, const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ {
+ result->val = 1.0 + a - x;
+ result->err = 2.0 * GSL_DBL_EPSILON * (1.0 + fabs(a) + fabs(x));
+ return GSL_SUCCESS;
+ }
+}
+
+int
+gsl_sf_laguerre_2_e(const double a, const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(a == -2.0) {
+ result->val = 0.5*x*x;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ double c0 = 0.5 * (2.0+a)*(1.0+a);
+ double c1 = -(2.0+a);
+ double c2 = -0.5/(2.0+a);
+ result->val = c0 + c1*x*(1.0 + c2*x);
+ result->err = 2.0 * GSL_DBL_EPSILON * (fabs(c0) + 2.0 * fabs(c1*x) * (1.0 + 2.0 * fabs(c2*x)));
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+}
+
+int
+gsl_sf_laguerre_3_e(const double a, const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(a == -2.0) {
+ double x2_6 = x*x/6.0;
+ result->val = x2_6 * (3.0 - x);
+ result->err = x2_6 * (3.0 + fabs(x)) * 2.0 * GSL_DBL_EPSILON;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(a == -3.0) {
+ result->val = -x*x/6.0;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ double c0 = (3.0+a)*(2.0+a)*(1.0+a) / 6.0;
+ double c1 = -c0 * 3.0 / (1.0+a);
+ double c2 = -1.0/(2.0+a);
+ double c3 = -1.0/(3.0*(3.0+a));
+ result->val = c0 + c1*x*(1.0 + c2*x*(1.0 + c3*x));
+ result->err = 1.0 + 2.0 * fabs(c3*x);
+ result->err = 1.0 + 2.0 * fabs(c2*x) * result->err;
+ result->err = 2.0 * GSL_DBL_EPSILON * (fabs(c0) + 2.0 * fabs(c1*x) * result->err);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+}
+
+
+int gsl_sf_laguerre_n_e(const int n, const double a, const double x,
+ gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(n < 0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(n == 0) {
+ result->val = 1.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(n == 1) {
+ result->val = 1.0 + a - x;
+ result->err = 2.0 * GSL_DBL_EPSILON * (1.0 + fabs(a) + fabs(x));
+ return GSL_SUCCESS;
+ }
+ else if(x == 0.0) {
+ double product = a + 1.0;
+ int k;
+ for(k=2; k<=n; k++) {
+ product *= (a + k)/k;
+ }
+ result->val = product;
+ result->err = 2.0 * (n + 1.0) * GSL_DBL_EPSILON * fabs(product) + GSL_DBL_EPSILON;
+ return GSL_SUCCESS;
+ }
+ else if(x < 0.0 && a > -1.0) {
+ /* In this case all the terms in the polynomial
+ * are of the same sign. Note that this also
+ * catches overflows correctly.
+ */
+ return laguerre_n_cp(n, a, x, result);
+ }
+ else if(n < 5 || (x > 0.0 && a < -n-1)) {
+ /* Either the polynomial will not lose too much accuracy
+ * or all the terms are negative. In any case,
+ * the error estimate here is good. We try both
+ * explicit summation methods, as they have different
+ * characteristics. One may underflow/overflow while the
+ * other does not.
+ */
+ if(laguerre_n_cp(n, a, x, result) == GSL_SUCCESS)
+ return GSL_SUCCESS;
+ else
+ return laguerre_n_poly_safe(n, a, x, result);
+ }
+ else if(n > 1.0e+07 && x > 0.0 && a > -1.0 && x < 2.0*(a+1.0)+4.0*n) {
+ return laguerre_large_n(n, a, x, result);
+ }
+ else if(a > 0.0 || (x > 0.0 && a < -n-1)) {
+ gsl_sf_result lg2;
+ int stat_lg2 = gsl_sf_laguerre_2_e(a, x, &lg2);
+ double Lkm1 = 1.0 + a - x;
+ double Lk = lg2.val;
+ double Lkp1;
+ int k;
+
+ for(k=2; k<n; k++) {
+ Lkp1 = (-(k+a)*Lkm1 + (2.0*k+a+1.0-x)*Lk)/(k+1.0);
+ Lkm1 = Lk;
+ Lk = Lkp1;
+ }
+ result->val = Lk;
+ result->err = (fabs(lg2.err/lg2.val) + GSL_DBL_EPSILON) * n * fabs(Lk);
+ return stat_lg2;
+ }
+ else {
+ /* Despair... or magic? */
+ return laguerre_n_poly_safe(n, a, x, result);
+ }
+}
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_laguerre_1(double a, double x)
+{
+ EVAL_RESULT(gsl_sf_laguerre_1_e(a, x, &result));
+}
+
+double gsl_sf_laguerre_2(double a, double x)
+{
+ EVAL_RESULT(gsl_sf_laguerre_2_e(a, x, &result));
+}
+
+double gsl_sf_laguerre_3(double a, double x)
+{
+ EVAL_RESULT(gsl_sf_laguerre_3_e(a, x, &result));
+}
+
+double gsl_sf_laguerre_n(int n, double a, double x)
+{
+ EVAL_RESULT(gsl_sf_laguerre_n_e(n, a, x, &result));
+}
diff --git a/gsl-1.9/specfunc/lambert.c b/gsl-1.9/specfunc/lambert.c
new file mode 100644
index 0000000..896ac58
--- /dev/null
+++ b/gsl-1.9/specfunc/lambert.c
@@ -0,0 +1,230 @@
+/* specfunc/lambert.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_lambert.h>
+
+/* Started with code donated by K. Briggs; added
+ * error estimates, GSL foo, and minor tweaks.
+ * Some Lambert-ology from
+ * [Corless, Gonnet, Hare, and Jeffrey, "On Lambert's W Function".]
+ */
+
+
+/* Halley iteration (eqn. 5.12, Corless et al) */
+static int
+halley_iteration(
+ double x,
+ double w_initial,
+ unsigned int max_iters,
+ gsl_sf_result * result
+ )
+{
+ double w = w_initial;
+ unsigned int i;
+
+ for(i=0; i<max_iters; i++) {
+ double tol;
+ const double e = exp(w);
+ const double p = w + 1.0;
+ double t = w*e - x;
+ /* printf("FOO: %20.16g %20.16g\n", w, t); */
+
+ if (w > 0) {
+ t = (t/p)/e; /* Newton iteration */
+ } else {
+ t /= e*p - 0.5*(p + 1.0)*t/p; /* Halley iteration */
+ };
+
+ w -= t;
+
+ tol = GSL_DBL_EPSILON * GSL_MAX_DBL(fabs(w), 1.0/(fabs(p)*e));
+
+ if(fabs(t) < tol)
+ {
+ result->val = w;
+ result->err = 2.0*tol;
+ return GSL_SUCCESS;
+ }
+ }
+
+ /* should never get here */
+ result->val = w;
+ result->err = fabs(w);
+ return GSL_EMAXITER;
+}
+
+
+/* series which appears for q near zero;
+ * only the argument is different for the different branches
+ */
+static double
+series_eval(double r)
+{
+ static const double c[12] = {
+ -1.0,
+ 2.331643981597124203363536062168,
+ -1.812187885639363490240191647568,
+ 1.936631114492359755363277457668,
+ -2.353551201881614516821543561516,
+ 3.066858901050631912893148922704,
+ -4.175335600258177138854984177460,
+ 5.858023729874774148815053846119,
+ -8.401032217523977370984161688514,
+ 12.250753501314460424,
+ -18.100697012472442755,
+ 27.029044799010561650
+ };
+ const double t_8 = c[8] + r*(c[9] + r*(c[10] + r*c[11]));
+ const double t_5 = c[5] + r*(c[6] + r*(c[7] + r*t_8));
+ const double t_1 = c[1] + r*(c[2] + r*(c[3] + r*(c[4] + r*t_5)));
+ return c[0] + r*t_1;
+}
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int
+gsl_sf_lambert_W0_e(double x, gsl_sf_result * result)
+{
+ const double one_over_E = 1.0/M_E;
+ const double q = x + one_over_E;
+
+ if(x == 0.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(q < 0.0) {
+ /* Strictly speaking this is an error. But because of the
+ * arithmetic operation connecting x and q, I am a little
+ * lenient in case of some epsilon overshoot. The following
+ * answer is quite accurate in that case. Anyway, we have
+ * to return GSL_EDOM.
+ */
+ result->val = -1.0;
+ result->err = sqrt(-q);
+ return GSL_EDOM;
+ }
+ else if(q == 0.0) {
+ result->val = -1.0;
+ result->err = GSL_DBL_EPSILON; /* cannot error is zero, maybe q == 0 by "accident" */
+ return GSL_SUCCESS;
+ }
+ else if(q < 1.0e-03) {
+ /* series near -1/E in sqrt(q) */
+ const double r = sqrt(q);
+ result->val = series_eval(r);
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ static const unsigned int MAX_ITERS = 10;
+ double w;
+
+ if (x < 1.0) {
+ /* obtain initial approximation from series near x=0;
+ * no need for extra care, since the Halley iteration
+ * converges nicely on this branch
+ */
+ const double p = sqrt(2.0 * M_E * q);
+ w = -1.0 + p*(1.0 + p*(-1.0/3.0 + p*11.0/72.0));
+ }
+ else {
+ /* obtain initial approximation from rough asymptotic */
+ w = log(x);
+ if(x > 3.0) w -= log(w);
+ }
+
+ return halley_iteration(x, w, MAX_ITERS, result);
+ }
+}
+
+
+int
+gsl_sf_lambert_Wm1_e(double x, gsl_sf_result * result)
+{
+ if(x > 0.0) {
+ return gsl_sf_lambert_W0_e(x, result);
+ }
+ else if(x == 0.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else {
+ static const unsigned int MAX_ITERS = 32;
+ const double one_over_E = 1.0/M_E;
+ const double q = x + one_over_E;
+ double w;
+
+ if (q < 0.0) {
+ /* As in the W0 branch above, return some reasonable answer anyway. */
+ result->val = -1.0;
+ result->err = sqrt(-q);
+ return GSL_EDOM;
+ }
+
+ if(x < -1.0e-6) {
+ /* Obtain initial approximation from series about q = 0,
+ * as long as we're not very close to x = 0.
+ * Use full series and try to bail out if q is too small,
+ * since the Halley iteration has bad convergence properties
+ * in finite arithmetic for q very small, because the
+ * increment alternates and p is near zero.
+ */
+ const double r = -sqrt(q);
+ w = series_eval(r);
+ if(q < 3.0e-3) {
+ /* this approximation is good enough */
+ result->val = w;
+ result->err = 5.0 * GSL_DBL_EPSILON * fabs(w);
+ return GSL_SUCCESS;
+ }
+ }
+ else {
+ /* Obtain initial approximation from asymptotic near zero. */
+ const double L_1 = log(-x);
+ const double L_2 = log(-L_1);
+ w = L_1 - L_2 + L_2/L_1;
+ }
+
+ return halley_iteration(x, w, MAX_ITERS, result);
+ }
+}
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_lambert_W0(double x)
+{
+ EVAL_RESULT(gsl_sf_lambert_W0_e(x, &result));
+}
+
+double gsl_sf_lambert_Wm1(double x)
+{
+ EVAL_RESULT(gsl_sf_lambert_Wm1_e(x, &result));
+}
diff --git a/gsl-1.9/specfunc/legendre.h b/gsl-1.9/specfunc/legendre.h
new file mode 100644
index 0000000..e82c0cf
--- /dev/null
+++ b/gsl-1.9/specfunc/legendre.h
@@ -0,0 +1,72 @@
+/* specfunc/legendre.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+/* Declare private but non-local support functions
+ * used in various Legendre function evaluations.
+ */
+
+#include <gsl/gsl_sf_result.h>
+
+
+/* Large negative mu asymptotic
+ * P^{-mu}_{-1/2 + I tau}, mu -> Inf
+ * |x| < 1
+ */
+int
+gsl_sf_conicalP_xlt1_large_neg_mu_e(double mu, double tau, double x,
+ gsl_sf_result * result, double * ln_multiplier);
+
+
+/* Large tau uniform asymptotics
+ * P^{-mu}_{-1/2 + I tau}, tau -> Inf
+ * 1 < x
+ */
+int
+gsl_sf_conicalP_xgt1_neg_mu_largetau_e(const double mu, const double tau,
+ const double x, double acosh_x,
+ gsl_sf_result * result, double * ln_multiplier);
+
+
+/* Large tau uniform asymptotics
+ * P^{-mu}_{-1/2 + I tau}, tau -> Inf
+ * -1 < x < 1
+ */
+int
+gsl_sf_conicalP_xlt1_neg_mu_largetau_e(const double mu, const double tau,
+ const double x, const double acos_x,
+ gsl_sf_result * result, double * ln_multiplier);
+
+
+/* P^{mu}_{-1/2 + I tau}
+ * x->Inf
+ *
+ * * This is effective to precision EPS for
+ *
+ * (mu^2 + tau^2)/((1 + tau^2)^(1/2) x^2) < EPS^{1/3}
+ *
+ * since it goes only to a fixed order, based on the
+ * representation in terms of hypegeometric functions
+ * of argument 1/x^2.
+ * [Zhurina+Karmazina, (3.8)]
+ */
+int
+gsl_sf_conicalP_large_x_e(const double mu, const double tau, const double x,
+ gsl_sf_result * result, double * ln_multiplier);
diff --git a/gsl-1.9/specfunc/legendre_H3d.c b/gsl-1.9/specfunc/legendre_H3d.c
new file mode 100644
index 0000000..feb6426
--- /dev/null
+++ b/gsl-1.9/specfunc/legendre_H3d.c
@@ -0,0 +1,568 @@
+/* specfunc/legendre_H3d.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_exp.h>
+#include <gsl/gsl_sf_gamma.h>
+#include <gsl/gsl_sf_trig.h>
+#include <gsl/gsl_sf_legendre.h>
+
+#include "error.h"
+
+#include "legendre.h"
+
+/* See [Abbott+Schaefer, Ap.J. 308, 546 (1986)] for
+ * enough details to follow what is happening here.
+ */
+
+
+/* Logarithm of normalization factor, Log[N(ell,lambda)].
+ * N(ell,lambda) = Product[ lambda^2 + n^2, {n,0,ell} ]
+ * = |Gamma(ell + 1 + I lambda)|^2 lambda sinh(Pi lambda) / Pi
+ * Assumes ell >= 0.
+ */
+static
+int
+legendre_H3d_lnnorm(const int ell, const double lambda, double * result)
+{
+ double abs_lam = fabs(lambda);
+
+ if(abs_lam == 0.0) {
+ *result = 0.0;
+ GSL_ERROR ("error", GSL_EDOM);
+ }
+ else if(lambda > (ell + 1.0)/GSL_ROOT3_DBL_EPSILON) {
+ /* There is a cancellation between the sinh(Pi lambda)
+ * term and the log(gamma(ell + 1 + i lambda) in the
+ * result below, so we show some care and save some digits.
+ * Note that the above guarantees that lambda is large,
+ * since ell >= 0. We use Stirling and a simple expansion
+ * of sinh.
+ */
+ double rat = (ell+1.0)/lambda;
+ double ln_lam2ell2 = 2.0*log(lambda) + log(1.0 + rat*rat);
+ double lg_corrected = -2.0*(ell+1.0) + M_LNPI + (ell+0.5)*ln_lam2ell2 + 1.0/(288.0*lambda*lambda);
+ double angle_terms = lambda * 2.0 * rat * (1.0 - rat*rat/3.0);
+ *result = log(abs_lam) + lg_corrected + angle_terms - M_LNPI;
+ return GSL_SUCCESS;
+ }
+ else {
+ gsl_sf_result lg_r;
+ gsl_sf_result lg_theta;
+ gsl_sf_result ln_sinh;
+ gsl_sf_lngamma_complex_e(ell+1.0, lambda, &lg_r, &lg_theta);
+ gsl_sf_lnsinh_e(M_PI * abs_lam, &ln_sinh);
+ *result = log(abs_lam) + ln_sinh.val + 2.0*lg_r.val - M_LNPI;
+ return GSL_SUCCESS;
+ }
+}
+
+
+/* Calculate series for small eta*lambda.
+ * Assumes eta > 0, lambda != 0.
+ *
+ * This is just the defining hypergeometric for the Legendre function.
+ *
+ * P^{mu}_{-1/2 + I lam}(z) = 1/Gamma(l+3/2) ((z+1)/(z-1)^(mu/2)
+ * 2F1(1/2 - I lam, 1/2 + I lam; l+3/2; (1-z)/2)
+ * We use
+ * z = cosh(eta)
+ * (z-1)/2 = sinh^2(eta/2)
+ *
+ * And recall
+ * H3d = sqrt(Pi Norm /(2 lam^2 sinh(eta))) P^{-l-1/2}_{-1/2 + I lam}(cosh(eta))
+ */
+static
+int
+legendre_H3d_series(const int ell, const double lambda, const double eta,
+ gsl_sf_result * result)
+{
+ const int nmax = 5000;
+ const double shheta = sinh(0.5*eta);
+ const double ln_zp1 = M_LN2 + log(1.0 + shheta*shheta);
+ const double ln_zm1 = M_LN2 + 2.0*log(shheta);
+ const double zeta = -shheta*shheta;
+ gsl_sf_result lg_lp32;
+ double term = 1.0;
+ double sum = 1.0;
+ double sum_err = 0.0;
+ gsl_sf_result lnsheta;
+ double lnN;
+ double lnpre_val, lnpre_err, lnprepow;
+ int stat_e;
+ int n;
+
+ gsl_sf_lngamma_e(ell + 3.0/2.0, &lg_lp32);
+ gsl_sf_lnsinh_e(eta, &lnsheta);
+ legendre_H3d_lnnorm(ell, lambda, &lnN);
+ lnprepow = 0.5*(ell + 0.5) * (ln_zm1 - ln_zp1);
+ lnpre_val = lnprepow + 0.5*(lnN + M_LNPI - M_LN2 - lnsheta.val) - lg_lp32.val - log(fabs(lambda));
+ lnpre_err = lnsheta.err + lg_lp32.err + GSL_DBL_EPSILON * fabs(lnpre_val);
+ lnpre_err += 2.0*GSL_DBL_EPSILON * (fabs(lnN) + M_LNPI + M_LN2);
+ lnpre_err += 2.0*GSL_DBL_EPSILON * (0.5*(ell + 0.5) * (fabs(ln_zm1) + fabs(ln_zp1)));
+ for(n=1; n<nmax; n++) {
+ double aR = n - 0.5;
+ term *= (aR*aR + lambda*lambda)*zeta/(ell + n + 0.5)/n;
+ sum += term;
+ sum_err += 2.0*GSL_DBL_EPSILON*fabs(term);
+ if(fabs(term/sum) < 2.0 * GSL_DBL_EPSILON) break;
+ }
+
+ stat_e = gsl_sf_exp_mult_err_e(lnpre_val, lnpre_err, sum, fabs(term)+sum_err, result);
+ return GSL_ERROR_SELECT_2(stat_e, (n==nmax ? GSL_EMAXITER : GSL_SUCCESS));
+}
+
+
+/* Evaluate legendre_H3d(ell+1)/legendre_H3d(ell)
+ * by continued fraction.
+ */
+#if 0
+static
+int
+legendre_H3d_CF1(const int ell, const double lambda, const double coth_eta,
+ gsl_sf_result * result)
+{
+ const double RECUR_BIG = GSL_SQRT_DBL_MAX;
+ const int maxiter = 5000;
+ int n = 1;
+ double Anm2 = 1.0;
+ double Bnm2 = 0.0;
+ double Anm1 = 0.0;
+ double Bnm1 = 1.0;
+ double a1 = hypot(lambda, ell+1.0);
+ double b1 = (2.0*ell + 3.0) * coth_eta;
+ double An = b1*Anm1 + a1*Anm2;
+ double Bn = b1*Bnm1 + a1*Bnm2;
+ double an, bn;
+ double fn = An/Bn;
+
+ while(n < maxiter) {
+ double old_fn;
+ double del;
+ n++;
+ Anm2 = Anm1;
+ Bnm2 = Bnm1;
+ Anm1 = An;
+ Bnm1 = Bn;
+ an = -(lambda*lambda + ((double)ell + n)*((double)ell + n));
+ bn = (2.0*ell + 2.0*n + 1.0) * coth_eta;
+ An = bn*Anm1 + an*Anm2;
+ Bn = bn*Bnm1 + an*Bnm2;
+
+ if(fabs(An) > RECUR_BIG || fabs(Bn) > RECUR_BIG) {
+ An /= RECUR_BIG;
+ Bn /= RECUR_BIG;
+ Anm1 /= RECUR_BIG;
+ Bnm1 /= RECUR_BIG;
+ Anm2 /= RECUR_BIG;
+ Bnm2 /= RECUR_BIG;
+ }
+
+ old_fn = fn;
+ fn = An/Bn;
+ del = old_fn/fn;
+
+ if(fabs(del - 1.0) < 4.0*GSL_DBL_EPSILON) break;
+ }
+
+ result->val = fn;
+ result->err = 2.0 * GSL_DBL_EPSILON * (sqrt(n)+1.0) * fabs(fn);
+
+ if(n >= maxiter)
+ GSL_ERROR ("error", GSL_EMAXITER);
+ else
+ return GSL_SUCCESS;
+}
+#endif /* 0 */
+
+
+/* Evaluate legendre_H3d(ell+1)/legendre_H3d(ell)
+ * by continued fraction. Use the Gautschi (Euler)
+ * equivalent series.
+ */
+ /* FIXME: Maybe we have to worry about this. The a_k are
+ * not positive and there can be a blow-up. It happened
+ * for J_nu once or twice. Then we should probably use
+ * the method above.
+ */
+static
+int
+legendre_H3d_CF1_ser(const int ell, const double lambda, const double coth_eta,
+ gsl_sf_result * result)
+{
+ const double pre = hypot(lambda, ell+1.0)/((2.0*ell+3)*coth_eta);
+ const int maxk = 20000;
+ double tk = 1.0;
+ double sum = 1.0;
+ double rhok = 0.0;
+ double sum_err = 0.0;
+ int k;
+
+ for(k=1; k<maxk; k++) {
+ double tlk = (2.0*ell + 1.0 + 2.0*k);
+ double l1k = (ell + 1.0 + k);
+ double ak = -(lambda*lambda + l1k*l1k)/(tlk*(tlk+2.0)*coth_eta*coth_eta);
+ rhok = -ak*(1.0 + rhok)/(1.0 + ak*(1.0 + rhok));
+ tk *= rhok;
+ sum += tk;
+ sum_err += 2.0 * GSL_DBL_EPSILON * k * fabs(tk);
+ if(fabs(tk/sum) < GSL_DBL_EPSILON) break;
+ }
+
+ result->val = pre * sum;
+ result->err = fabs(pre * tk);
+ result->err += fabs(pre * sum_err);
+ result->err += 4.0 * GSL_DBL_EPSILON * fabs(result->val);
+
+ if(k >= maxk)
+ GSL_ERROR ("error", GSL_EMAXITER);
+ else
+ return GSL_SUCCESS;
+}
+
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int
+gsl_sf_legendre_H3d_0_e(const double lambda, const double eta, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(eta < 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(eta == 0.0 || lambda == 0.0) {
+ result->val = 1.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else {
+ const double lam_eta = lambda * eta;
+ gsl_sf_result s;
+ gsl_sf_sin_err_e(lam_eta, 2.0*GSL_DBL_EPSILON * fabs(lam_eta), &s);
+ if(eta > -0.5*GSL_LOG_DBL_EPSILON) {
+ double f = 2.0 / lambda * exp(-eta);
+ result->val = f * s.val;
+ result->err = fabs(f * s.val) * (fabs(eta) + 1.0) * GSL_DBL_EPSILON;
+ result->err += fabs(f) * s.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ }
+ else {
+ double f = 1.0/(lambda*sinh(eta));
+ result->val = f * s.val;
+ result->err = fabs(f * s.val) * (fabs(eta) + 1.0) * GSL_DBL_EPSILON;
+ result->err += fabs(f) * s.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ }
+ return GSL_SUCCESS;
+ }
+}
+
+
+int
+gsl_sf_legendre_H3d_1_e(const double lambda, const double eta, gsl_sf_result * result)
+{
+ const double xi = fabs(eta*lambda);
+ const double lsq = lambda*lambda;
+ const double lsqp1 = lsq + 1.0;
+
+ /* CHECK_POINTER(result) */
+
+ if(eta < 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(eta == 0.0 || lambda == 0.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(xi < GSL_ROOT5_DBL_EPSILON && eta < GSL_ROOT5_DBL_EPSILON) {
+ double etasq = eta*eta;
+ double xisq = xi*xi;
+ double term1 = (etasq + xisq)/3.0;
+ double term2 = -(2.0*etasq*etasq + 5.0*etasq*xisq + 3.0*xisq*xisq)/90.0;
+ double sinh_term = 1.0 - eta*eta/6.0 * (1.0 - 7.0/60.0*eta*eta);
+ double pre = sinh_term/sqrt(lsqp1) / eta;
+ result->val = pre * (term1 + term2);
+ result->err = pre * GSL_DBL_EPSILON * (fabs(term1) + fabs(term2));
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ double sin_term; /* Sin(xi)/xi */
+ double cos_term; /* Cos(xi) */
+ double coth_term; /* eta/Tanh(eta) */
+ double sinh_term; /* eta/Sinh(eta) */
+ double sin_term_err;
+ double cos_term_err;
+ double t1;
+ double pre_val;
+ double pre_err;
+ double term1;
+ double term2;
+ if(xi < GSL_ROOT5_DBL_EPSILON) {
+ sin_term = 1.0 - xi*xi/6.0 * (1.0 - xi*xi/20.0);
+ cos_term = 1.0 - 0.5*xi*xi * (1.0 - xi*xi/12.0);
+ sin_term_err = GSL_DBL_EPSILON;
+ cos_term_err = GSL_DBL_EPSILON;
+ }
+ else {
+ gsl_sf_result sin_xi_result;
+ gsl_sf_result cos_xi_result;
+ gsl_sf_sin_e(xi, &sin_xi_result);
+ gsl_sf_cos_e(xi, &cos_xi_result);
+ sin_term = sin_xi_result.val/xi;
+ cos_term = cos_xi_result.val;
+ sin_term_err = sin_xi_result.err/fabs(xi);
+ cos_term_err = cos_xi_result.err;
+ }
+ if(eta < GSL_ROOT5_DBL_EPSILON) {
+ coth_term = 1.0 + eta*eta/3.0 * (1.0 - eta*eta/15.0);
+ sinh_term = 1.0 - eta*eta/6.0 * (1.0 - 7.0/60.0*eta*eta);
+ }
+ else {
+ coth_term = eta/tanh(eta);
+ sinh_term = eta/sinh(eta);
+ }
+ t1 = sqrt(lsqp1) * eta;
+ pre_val = sinh_term/t1;
+ pre_err = 2.0 * GSL_DBL_EPSILON * fabs(pre_val);
+ term1 = sin_term*coth_term;
+ term2 = cos_term;
+ result->val = pre_val * (term1 - term2);
+ result->err = pre_err * fabs(term1 - term2);
+ result->err += pre_val * (sin_term_err * coth_term + cos_term_err);
+ result->err += pre_val * fabs(term1-term2) * (fabs(eta) + 1.0) * GSL_DBL_EPSILON;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+}
+
+
+int
+gsl_sf_legendre_H3d_e(const int ell, const double lambda, const double eta,
+ gsl_sf_result * result)
+{
+ const double abs_lam = fabs(lambda);
+ const double lsq = abs_lam*abs_lam;
+ const double xi = abs_lam * eta;
+ const double cosh_eta = cosh(eta);
+
+ /* CHECK_POINTER(result) */
+
+ if(eta < 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(eta > GSL_LOG_DBL_MAX) {
+ /* cosh(eta) is too big. */
+ OVERFLOW_ERROR(result);
+ }
+ else if(ell == 0) {
+ return gsl_sf_legendre_H3d_0_e(lambda, eta, result);
+ }
+ else if(ell == 1) {
+ return gsl_sf_legendre_H3d_1_e(lambda, eta, result);
+ }
+ else if(eta == 0.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(xi < 1.0) {
+ return legendre_H3d_series(ell, lambda, eta, result);
+ }
+ else if((ell*ell+lsq)/sqrt(1.0+lsq)/(cosh_eta*cosh_eta) < 5.0*GSL_ROOT3_DBL_EPSILON) {
+ /* Large argument.
+ */
+ gsl_sf_result P;
+ double lm;
+ int stat_P = gsl_sf_conicalP_large_x_e(-ell-0.5, lambda, cosh_eta, &P, &lm);
+ if(P.val == 0.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return stat_P;
+ }
+ else {
+ double lnN;
+ gsl_sf_result lnsh;
+ double ln_abslam;
+ double lnpre_val, lnpre_err;
+ int stat_e;
+ gsl_sf_lnsinh_e(eta, &lnsh);
+ legendre_H3d_lnnorm(ell, lambda, &lnN);
+ ln_abslam = log(abs_lam);
+ lnpre_val = 0.5*(M_LNPI + lnN - M_LN2 - lnsh.val) - ln_abslam;
+ lnpre_err = lnsh.err;
+ lnpre_err += 2.0 * GSL_DBL_EPSILON * (0.5*(M_LNPI + M_LN2 + fabs(lnN)) + fabs(ln_abslam));
+ lnpre_err += 2.0 * GSL_DBL_EPSILON * fabs(lnpre_val);
+ stat_e = gsl_sf_exp_mult_err_e(lnpre_val + lm, lnpre_err, P.val, P.err, result);
+ return GSL_ERROR_SELECT_2(stat_e, stat_P);
+ }
+ }
+ else if(abs_lam > 1000.0*ell*ell) {
+ /* Large degree.
+ */
+ gsl_sf_result P;
+ double lm;
+ int stat_P = gsl_sf_conicalP_xgt1_neg_mu_largetau_e(ell+0.5,
+ lambda,
+ cosh_eta, eta,
+ &P, &lm);
+ if(P.val == 0.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return stat_P;
+ }
+ else {
+ double lnN;
+ gsl_sf_result lnsh;
+ double ln_abslam;
+ double lnpre_val, lnpre_err;
+ int stat_e;
+ gsl_sf_lnsinh_e(eta, &lnsh);
+ legendre_H3d_lnnorm(ell, lambda, &lnN);
+ ln_abslam = log(abs_lam);
+ lnpre_val = 0.5*(M_LNPI + lnN - M_LN2 - lnsh.val) - ln_abslam;
+ lnpre_err = lnsh.err;
+ lnpre_err += GSL_DBL_EPSILON * (0.5*(M_LNPI + M_LN2 + fabs(lnN)) + fabs(ln_abslam));
+ lnpre_err += 2.0 * GSL_DBL_EPSILON * fabs(lnpre_val);
+ stat_e = gsl_sf_exp_mult_err_e(lnpre_val + lm, lnpre_err, P.val, P.err, result);
+ return GSL_ERROR_SELECT_2(stat_e, stat_P);
+ }
+ }
+ else {
+ /* Backward recurrence.
+ */
+ const double coth_eta = 1.0/tanh(eta);
+ const double coth_err_mult = fabs(eta) + 1.0;
+ gsl_sf_result rH;
+ int stat_CF1 = legendre_H3d_CF1_ser(ell, lambda, coth_eta, &rH);
+ double Hlm1;
+ double Hl = GSL_SQRT_DBL_MIN;
+ double Hlp1 = rH.val * Hl;
+ int lp;
+ for(lp=ell; lp>0; lp--) {
+ double root_term_0 = hypot(lambda,lp);
+ double root_term_1 = hypot(lambda,lp+1.0);
+ Hlm1 = ((2.0*lp + 1.0)*coth_eta*Hl - root_term_1 * Hlp1)/root_term_0;
+ Hlp1 = Hl;
+ Hl = Hlm1;
+ }
+
+ if(fabs(Hl) > fabs(Hlp1)) {
+ gsl_sf_result H0;
+ int stat_H0 = gsl_sf_legendre_H3d_0_e(lambda, eta, &H0);
+ result->val = GSL_SQRT_DBL_MIN/Hl * H0.val;
+ result->err = GSL_SQRT_DBL_MIN/fabs(Hl) * H0.err;
+ result->err += fabs(rH.err/rH.val) * (ell+1.0) * coth_err_mult * fabs(result->val);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_ERROR_SELECT_2(stat_H0, stat_CF1);
+ }
+ else {
+ gsl_sf_result H1;
+ int stat_H1 = gsl_sf_legendre_H3d_1_e(lambda, eta, &H1);
+ result->val = GSL_SQRT_DBL_MIN/Hlp1 * H1.val;
+ result->err = GSL_SQRT_DBL_MIN/fabs(Hlp1) * H1.err;
+ result->err += fabs(rH.err/rH.val) * (ell+1.0) * coth_err_mult * fabs(result->val);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_ERROR_SELECT_2(stat_H1, stat_CF1);
+ }
+ }
+}
+
+
+int
+gsl_sf_legendre_H3d_array(const int lmax, const double lambda, const double eta, double * result_array)
+{
+ /* CHECK_POINTER(result_array) */
+
+ if(eta < 0.0 || lmax < 0) {
+ int ell;
+ for(ell=0; ell<=lmax; ell++) result_array[ell] = 0.0;
+ GSL_ERROR ("domain error", GSL_EDOM);
+ }
+ else if(eta > GSL_LOG_DBL_MAX) {
+ /* cosh(eta) is too big. */
+ int ell;
+ for(ell=0; ell<=lmax; ell++) result_array[ell] = 0.0;
+ GSL_ERROR ("overflow", GSL_EOVRFLW);
+ }
+ else if(lmax == 0) {
+ gsl_sf_result H0;
+ int stat = gsl_sf_legendre_H3d_e(0, lambda, eta, &H0);
+ result_array[0] = H0.val;
+ return stat;
+ }
+ else {
+ /* Not the most efficient method. But what the hell... it's simple.
+ */
+ gsl_sf_result r_Hlp1;
+ gsl_sf_result r_Hl;
+ int stat_lmax = gsl_sf_legendre_H3d_e(lmax, lambda, eta, &r_Hlp1);
+ int stat_lmaxm1 = gsl_sf_legendre_H3d_e(lmax-1, lambda, eta, &r_Hl);
+ int stat_max = GSL_ERROR_SELECT_2(stat_lmax, stat_lmaxm1);
+
+ const double coth_eta = 1.0/tanh(eta);
+ int stat_recursion = GSL_SUCCESS;
+ double Hlp1 = r_Hlp1.val;
+ double Hl = r_Hl.val;
+ double Hlm1;
+ int ell;
+
+ result_array[lmax] = Hlp1;
+ result_array[lmax-1] = Hl;
+
+ for(ell=lmax-1; ell>0; ell--) {
+ double root_term_0 = hypot(lambda,ell);
+ double root_term_1 = hypot(lambda,ell+1.0);
+ Hlm1 = ((2.0*ell + 1.0)*coth_eta*Hl - root_term_1 * Hlp1)/root_term_0;
+ result_array[ell-1] = Hlm1;
+ if(!(Hlm1 < GSL_DBL_MAX)) stat_recursion = GSL_EOVRFLW;
+ Hlp1 = Hl;
+ Hl = Hlm1;
+ }
+
+ return GSL_ERROR_SELECT_2(stat_recursion, stat_max);
+ }
+}
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_legendre_H3d_0(const double lambda, const double eta)
+{
+ EVAL_RESULT(gsl_sf_legendre_H3d_0_e(lambda, eta, &result));
+}
+
+double gsl_sf_legendre_H3d_1(const double lambda, const double eta)
+{
+ EVAL_RESULT(gsl_sf_legendre_H3d_1_e(lambda, eta, &result));
+}
+
+double gsl_sf_legendre_H3d(const int l, const double lambda, const double eta)
+{
+ EVAL_RESULT(gsl_sf_legendre_H3d_e(l, lambda, eta, &result));
+}
diff --git a/gsl-1.9/specfunc/legendre_Qn.c b/gsl-1.9/specfunc/legendre_Qn.c
new file mode 100644
index 0000000..2147f3c
--- /dev/null
+++ b/gsl-1.9/specfunc/legendre_Qn.c
@@ -0,0 +1,366 @@
+/* specfunc/legendre_Qn.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_bessel.h>
+#include <gsl/gsl_sf_elementary.h>
+#include <gsl/gsl_sf_exp.h>
+#include <gsl/gsl_sf_pow_int.h>
+#include <gsl/gsl_sf_legendre.h>
+
+#include "error.h"
+
+/* Evaluate f_{ell+1}/f_ell
+ * f_ell := Q^{b}_{a+ell}(x)
+ * x > 1
+ */
+static
+int
+legendreQ_CF1_xgt1(int ell, double a, double b, double x, double * result)
+{
+ const double RECUR_BIG = GSL_SQRT_DBL_MAX;
+ const int maxiter = 5000;
+ int n = 1;
+ double Anm2 = 1.0;
+ double Bnm2 = 0.0;
+ double Anm1 = 0.0;
+ double Bnm1 = 1.0;
+ double a1 = ell + 1.0 + a + b;
+ double b1 = (2.0*(ell+1.0+a) + 1.0) * x;
+ double An = b1*Anm1 + a1*Anm2;
+ double Bn = b1*Bnm1 + a1*Bnm2;
+ double an, bn;
+ double fn = An/Bn;
+
+ while(n < maxiter) {
+ double old_fn;
+ double del;
+ double lna;
+ n++;
+ Anm2 = Anm1;
+ Bnm2 = Bnm1;
+ Anm1 = An;
+ Bnm1 = Bn;
+ lna = ell + n + a;
+ an = b*b - lna*lna;
+ bn = (2.0*lna + 1.0) * x;
+ An = bn*Anm1 + an*Anm2;
+ Bn = bn*Bnm1 + an*Bnm2;
+
+ if(fabs(An) > RECUR_BIG || fabs(Bn) > RECUR_BIG) {
+ An /= RECUR_BIG;
+ Bn /= RECUR_BIG;
+ Anm1 /= RECUR_BIG;
+ Bnm1 /= RECUR_BIG;
+ Anm2 /= RECUR_BIG;
+ Bnm2 /= RECUR_BIG;
+ }
+
+ old_fn = fn;
+ fn = An/Bn;
+ del = old_fn/fn;
+
+ if(fabs(del - 1.0) < 4.0*GSL_DBL_EPSILON) break;
+ }
+
+ *result = fn;
+
+ if(n == maxiter)
+ GSL_ERROR ("error", GSL_EMAXITER);
+ else
+ return GSL_SUCCESS;
+}
+
+
+/* Uniform asymptotic for Q_l(x).
+ * Assumes x > -1.0 and x != 1.0.
+ * Discards second order and higher terms.
+ */
+static
+int
+legendre_Ql_asymp_unif(const double ell, const double x, gsl_sf_result * result)
+{
+ if(x < 1.0) {
+ double u = ell + 0.5;
+ double th = acos(x);
+ gsl_sf_result Y0, Y1;
+ int stat_Y0, stat_Y1;
+ int stat_m;
+ double pre;
+ double B00;
+ double sum;
+
+ /* B00 = 1/8 (1 - th cot(th) / th^2
+ * pre = sqrt(th/sin(th))
+ */
+ if(th < GSL_ROOT4_DBL_EPSILON) {
+ B00 = (1.0 + th*th/15.0)/24.0;
+ pre = 1.0 + th*th/12.0;
+ }
+ else {
+ double sin_th = sqrt(1.0 - x*x);
+ double cot_th = x / sin_th;
+ B00 = 1.0/8.0 * (1.0 - th * cot_th) / (th*th);
+ pre = sqrt(th/sin_th);
+ }
+
+ stat_Y0 = gsl_sf_bessel_Y0_e(u*th, &Y0);
+ stat_Y1 = gsl_sf_bessel_Y1_e(u*th, &Y1);
+
+ sum = -0.5*M_PI * (Y0.val + th/u * Y1.val * B00);
+
+ stat_m = gsl_sf_multiply_e(pre, sum, result);
+ result->err += 0.5*M_PI * fabs(pre) * (Y0.err + fabs(th/u*B00)*Y1.err);
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+
+ return GSL_ERROR_SELECT_3(stat_m, stat_Y0, stat_Y1);
+ }
+ else {
+ double u = ell + 0.5;
+ double xi = acosh(x);
+ gsl_sf_result K0_scaled, K1_scaled;
+ int stat_K0, stat_K1;
+ int stat_e;
+ double pre;
+ double B00;
+ double sum;
+
+ /* B00 = -1/8 (1 - xi coth(xi) / xi^2
+ * pre = sqrt(xi/sinh(xi))
+ */
+ if(xi < GSL_ROOT4_DBL_EPSILON) {
+ B00 = (1.0-xi*xi/15.0)/24.0;
+ pre = 1.0 - xi*xi/12.0;
+ }
+ else {
+ double sinh_xi = sqrt(x*x - 1.0);
+ double coth_xi = x / sinh_xi;
+ B00 = -1.0/8.0 * (1.0 - xi * coth_xi) / (xi*xi);
+ pre = sqrt(xi/sinh_xi);
+ }
+
+ stat_K0 = gsl_sf_bessel_K0_scaled_e(u*xi, &K0_scaled);
+ stat_K1 = gsl_sf_bessel_K1_scaled_e(u*xi, &K1_scaled);
+
+ sum = K0_scaled.val - xi/u * K1_scaled.val * B00;
+
+ stat_e = gsl_sf_exp_mult_e(-u*xi, pre * sum, result);
+ result->err = GSL_DBL_EPSILON * fabs(result->val) * fabs(u*xi);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+
+ return GSL_ERROR_SELECT_3(stat_e, stat_K0, stat_K1);
+ }
+}
+
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int
+gsl_sf_legendre_Q0_e(const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x <= -1.0 || x == 1.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x*x < GSL_ROOT6_DBL_EPSILON) { /* |x| <~ 0.05 */
+ const double c3 = 1.0/3.0;
+ const double c5 = 1.0/5.0;
+ const double c7 = 1.0/7.0;
+ const double c9 = 1.0/9.0;
+ const double c11 = 1.0/11.0;
+ const double y = x * x;
+ const double series = 1.0 + y*(c3 + y*(c5 + y*(c7 + y*(c9 + y*c11))));
+ result->val = x * series;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(x);
+ return GSL_SUCCESS;
+ }
+ else if(x < 1.0) {
+ result->val = 0.5 * log((1.0+x)/(1.0-x));
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x < 10.0) {
+ result->val = 0.5 * log((x+1.0)/(x-1.0));
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x*GSL_DBL_MIN < 2.0) {
+ const double y = 1.0/(x*x);
+ const double c1 = 1.0/3.0;
+ const double c2 = 1.0/5.0;
+ const double c3 = 1.0/7.0;
+ const double c4 = 1.0/9.0;
+ const double c5 = 1.0/11.0;
+ const double c6 = 1.0/13.0;
+ const double c7 = 1.0/15.0;
+ result->val = (1.0/x) * (1.0 + y*(c1 + y*(c2 + y*(c3 + y*(c4 + y*(c5 + y*(c6 + y*c7)))))));
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ UNDERFLOW_ERROR(result);
+ }
+}
+
+
+int
+gsl_sf_legendre_Q1_e(const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x <= -1.0 || x == 1.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x*x < GSL_ROOT6_DBL_EPSILON) { /* |x| <~ 0.05 */
+ const double c3 = 1.0/3.0;
+ const double c5 = 1.0/5.0;
+ const double c7 = 1.0/7.0;
+ const double c9 = 1.0/9.0;
+ const double c11 = 1.0/11.0;
+ const double y = x * x;
+ const double series = 1.0 + y*(c3 + y*(c5 + y*(c7 + y*(c9 + y*c11))));
+ result->val = x * x * series - 1.0;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x < 1.0){
+ result->val = 0.5 * x * (log((1.0+x)/(1.0-x))) - 1.0;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x < 6.0) {
+ result->val = 0.5 * x * log((x+1.0)/(x-1.0)) - 1.0;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x*GSL_SQRT_DBL_MIN < 0.99/M_SQRT3) {
+ const double y = 1/(x*x);
+ const double c1 = 3.0/5.0;
+ const double c2 = 3.0/7.0;
+ const double c3 = 3.0/9.0;
+ const double c4 = 3.0/11.0;
+ const double c5 = 3.0/13.0;
+ const double c6 = 3.0/15.0;
+ const double c7 = 3.0/17.0;
+ const double c8 = 3.0/19.0;
+ const double sum = 1.0 + y*(c1 + y*(c2 + y*(c3 + y*(c4 + y*(c5 + y*(c6 + y*(c7 + y*c8)))))));
+ result->val = sum / (3.0*x*x);
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ UNDERFLOW_ERROR(result);
+ }
+}
+
+
+int
+gsl_sf_legendre_Ql_e(const int l, const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x <= -1.0 || x == 1.0 || l < 0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(l == 0) {
+ return gsl_sf_legendre_Q0_e(x, result);
+ }
+ else if(l == 1) {
+ return gsl_sf_legendre_Q1_e(x, result);
+ }
+ else if(l > 100000) {
+ return legendre_Ql_asymp_unif(l, x, result);
+ }
+ else if(x < 1.0){
+ /* Forward recurrence.
+ */
+ gsl_sf_result Q0, Q1;
+ int stat_Q0 = gsl_sf_legendre_Q0_e(x, &Q0);
+ int stat_Q1 = gsl_sf_legendre_Q1_e(x, &Q1);
+ double Qellm1 = Q0.val;
+ double Qell = Q1.val;
+ double Qellp1;
+ int ell;
+ for(ell=1; ell<l; ell++) {
+ Qellp1 = (x*(2.0*ell + 1.0) * Qell - ell * Qellm1) / (ell + 1.0);
+ Qellm1 = Qell;
+ Qell = Qellp1;
+ }
+ result->val = Qell;
+ result->err = GSL_DBL_EPSILON * l * fabs(result->val);
+ return GSL_ERROR_SELECT_2(stat_Q0, stat_Q1);
+ }
+ else {
+ /* x > 1.0 */
+
+ double rat;
+ int stat_CF1 = legendreQ_CF1_xgt1(l, 0.0, 0.0, x, &rat);
+ int stat_Q;
+ double Qellp1 = rat * GSL_SQRT_DBL_MIN;
+ double Qell = GSL_SQRT_DBL_MIN;
+ double Qellm1;
+ int ell;
+ for(ell=l; ell>0; ell--) {
+ Qellm1 = (x * (2.0*ell + 1.0) * Qell - (ell+1.0) * Qellp1) / ell;
+ Qellp1 = Qell;
+ Qell = Qellm1;
+ }
+
+ if(fabs(Qell) > fabs(Qellp1)) {
+ gsl_sf_result Q0;
+ stat_Q = gsl_sf_legendre_Q0_e(x, &Q0);
+ result->val = GSL_SQRT_DBL_MIN * Q0.val / Qell;
+ result->err = l * GSL_DBL_EPSILON * fabs(result->val);
+ }
+ else {
+ gsl_sf_result Q1;
+ stat_Q = gsl_sf_legendre_Q1_e(x, &Q1);
+ result->val = GSL_SQRT_DBL_MIN * Q1.val / Qellp1;
+ result->err = l * GSL_DBL_EPSILON * fabs(result->val);
+ }
+
+ return GSL_ERROR_SELECT_2(stat_Q, stat_CF1);
+ }
+}
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_legendre_Q0(const double x)
+{
+ EVAL_RESULT(gsl_sf_legendre_Q0_e(x, &result));
+}
+
+double gsl_sf_legendre_Q1(const double x)
+{
+ EVAL_RESULT(gsl_sf_legendre_Q1_e(x, &result));
+}
+
+double gsl_sf_legendre_Ql(const int l, const double x)
+{
+ EVAL_RESULT(gsl_sf_legendre_Ql_e(l, x, &result));
+}
diff --git a/gsl-1.9/specfunc/legendre_con.c b/gsl-1.9/specfunc/legendre_con.c
new file mode 100644
index 0000000..6d60550
--- /dev/null
+++ b/gsl-1.9/specfunc/legendre_con.c
@@ -0,0 +1,1373 @@
+/* specfunc/legendre_con.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_poly.h>
+#include <gsl/gsl_sf_exp.h>
+#include <gsl/gsl_sf_trig.h>
+#include <gsl/gsl_sf_gamma.h>
+#include <gsl/gsl_sf_ellint.h>
+#include <gsl/gsl_sf_pow_int.h>
+#include <gsl/gsl_sf_bessel.h>
+#include <gsl/gsl_sf_hyperg.h>
+#include <gsl/gsl_sf_legendre.h>
+
+#include "error.h"
+#include "legendre.h"
+
+#define Root_2OverPi_ 0.797884560802865355879892
+#define locEPS (1000.0*GSL_DBL_EPSILON)
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Private Section *-*-*-*-*-*-*-*-*-*-*-*/
+
+
+#define RECURSE_LARGE (1.0e-5*GSL_DBL_MAX)
+#define RECURSE_SMALL (1.0e+5*GSL_DBL_MIN)
+
+
+/* Continued fraction for f_{ell+1}/f_ell
+ * f_ell := P^{-mu-ell}_{-1/2 + I tau}(x), x < 1.0
+ *
+ * Uses standard CF method from Temme's book.
+ */
+static
+int
+conicalP_negmu_xlt1_CF1(const double mu, const int ell, const double tau,
+ const double x, gsl_sf_result * result)
+{
+ const double RECUR_BIG = GSL_SQRT_DBL_MAX;
+ const int maxiter = 5000;
+ int n = 1;
+ double xi = x/(sqrt(1.0-x)*sqrt(1.0+x));
+ double Anm2 = 1.0;
+ double Bnm2 = 0.0;
+ double Anm1 = 0.0;
+ double Bnm1 = 1.0;
+ double a1 = 1.0;
+ double b1 = 2.0*(mu + ell + 1.0) * xi;
+ double An = b1*Anm1 + a1*Anm2;
+ double Bn = b1*Bnm1 + a1*Bnm2;
+ double an, bn;
+ double fn = An/Bn;
+
+ while(n < maxiter) {
+ double old_fn;
+ double del;
+ n++;
+ Anm2 = Anm1;
+ Bnm2 = Bnm1;
+ Anm1 = An;
+ Bnm1 = Bn;
+ an = tau*tau + (mu - 0.5 + ell + n)*(mu - 0.5 + ell + n);
+ bn = 2.0*(ell + mu + n) * xi;
+ An = bn*Anm1 + an*Anm2;
+ Bn = bn*Bnm1 + an*Bnm2;
+
+ if(fabs(An) > RECUR_BIG || fabs(Bn) > RECUR_BIG) {
+ An /= RECUR_BIG;
+ Bn /= RECUR_BIG;
+ Anm1 /= RECUR_BIG;
+ Bnm1 /= RECUR_BIG;
+ Anm2 /= RECUR_BIG;
+ Bnm2 /= RECUR_BIG;
+ }
+
+ old_fn = fn;
+ fn = An/Bn;
+ del = old_fn/fn;
+
+ if(fabs(del - 1.0) < 2.0*GSL_DBL_EPSILON) break;
+ }
+
+ result->val = fn;
+ result->err = 4.0 * GSL_DBL_EPSILON * (sqrt(n) + 1.0) * fabs(fn);
+
+ if(n >= maxiter)
+ GSL_ERROR ("error", GSL_EMAXITER);
+ else
+ return GSL_SUCCESS;
+}
+
+
+/* Continued fraction for f_{ell+1}/f_ell
+ * f_ell := P^{-mu-ell}_{-1/2 + I tau}(x), x >= 1.0
+ *
+ * Uses Gautschi (Euler) equivalent series.
+ */
+static
+int
+conicalP_negmu_xgt1_CF1(const double mu, const int ell, const double tau,
+ const double x, gsl_sf_result * result)
+{
+ const int maxk = 20000;
+ const double gamma = 1.0-1.0/(x*x);
+ const double pre = sqrt(x-1.0)*sqrt(x+1.0) / (x*(2.0*(ell+mu+1.0)));
+ double tk = 1.0;
+ double sum = 1.0;
+ double rhok = 0.0;
+ int k;
+
+ for(k=1; k<maxk; k++) {
+ double tlk = 2.0*(ell + mu + k);
+ double l1k = (ell + mu - 0.5 + 1.0 + k);
+ double ak = -(tau*tau + l1k*l1k)/(tlk*(tlk+2.0)) * gamma;
+ rhok = -ak*(1.0 + rhok)/(1.0 + ak*(1.0 + rhok));
+ tk *= rhok;
+ sum += tk;
+ if(fabs(tk/sum) < GSL_DBL_EPSILON) break;
+ }
+
+ result->val = pre * sum;
+ result->err = fabs(pre * tk);
+ result->err += 2.0 * GSL_DBL_EPSILON * (sqrt(k) + 1.0) * fabs(pre*sum);
+
+ if(k >= maxk)
+ GSL_ERROR ("error", GSL_EMAXITER);
+ else
+ return GSL_SUCCESS;
+}
+
+
+/* Implementation of large negative mu asymptotic
+ * [Dunster, Proc. Roy. Soc. Edinburgh 119A, 311 (1991), p. 326]
+ */
+
+inline
+static double olver_U1(double beta2, double p)
+{
+ return (p-1.0)/(24.0*(1.0+beta2)) * (3.0 + beta2*(2.0 + 5.0*p*(1.0+p)));
+}
+
+inline
+static double olver_U2(double beta2, double p)
+{
+ double beta4 = beta2*beta2;
+ double p2 = p*p;
+ double poly1 = 4.0*beta4 + 84.0*beta2 - 63.0;
+ double poly2 = 16.0*beta4 + 90.0*beta2 - 81.0;
+ double poly3 = beta2*p2*(97.0*beta2 - 432.0 + 77.0*p*(beta2-6.0) - 385.0*beta2*p2*(1.0 + p));
+ return (1.0-p)/(1152.0*(1.0+beta2)) * (poly1 + poly2 + poly3);
+}
+
+static const double U3c1[] = { -1307.0, -1647.0, 3375.0, 3675.0 };
+static const double U3c2[] = { 29366.0, 35835.0, -252360.0, -272630.0,
+ 276810.0, 290499.0 };
+static const double U3c3[] = { -29748.0, -8840.0, 1725295.0, 1767025.0,
+ -7313470.0, -754778.0, 6309875.0, 6480045.0 };
+static const double U3c4[] = { 2696.0, -16740.0, -524250.0, -183975.0,
+ 14670540.0, 14172939.0, -48206730.0, -48461985.0,
+ 36756720.0, 37182145.0 };
+static const double U3c5[] = { 9136.0, 22480.0, 12760.0,
+ -252480.0, -4662165.0, -1705341.0,
+ 92370135.0, 86244015.0, -263678415.0,
+ -260275015.0, 185910725.0, 185910725.0 };
+
+#if 0
+static double olver_U3(double beta2, double p)
+{
+ double beta4 = beta2*beta2;
+ double beta6 = beta4*beta2;
+ double opb2s = (1.0+beta2)*(1.0+beta2);
+ double den = 39813120.0 * opb2s*opb2s;
+ double poly1 = gsl_poly_eval(U3c1, 4, p);
+ double poly2 = gsl_poly_eval(U3c2, 6, p);
+ double poly3 = gsl_poly_eval(U3c3, 8, p);
+ double poly4 = gsl_poly_eval(U3c4, 10, p);
+ double poly5 = gsl_poly_eval(U3c5, 12, p);
+
+ return (p-1.0)*( 1215.0*poly1 + 324.0*beta2*poly2
+ + 54.0*beta4*poly3 + 12.0*beta6*poly4
+ + beta4*beta4*poly5
+ ) / den;
+}
+#endif /* 0 */
+
+
+/* Large negative mu asymptotic
+ * P^{-mu}_{-1/2 + I tau}, mu -> Inf
+ * |x| < 1
+ *
+ * [Dunster, Proc. Roy. Soc. Edinburgh 119A, 311 (1991), p. 326]
+ */
+int
+gsl_sf_conicalP_xlt1_large_neg_mu_e(double mu, double tau, double x,
+ gsl_sf_result * result, double * ln_multiplier)
+{
+ double beta = tau/mu;
+ double beta2 = beta*beta;
+ double S = beta * acos((1.0-beta2)/(1.0+beta2));
+ double p = x/sqrt(beta2*(1.0-x*x) + 1.0);
+ gsl_sf_result lg_mup1;
+ int lg_stat = gsl_sf_lngamma_e(mu+1.0, &lg_mup1);
+ double ln_pre_1 = 0.5*mu*(S - log(1.0+beta2) + log((1.0-p)/(1.0+p))) - lg_mup1.val;
+ double ln_pre_2 = -0.25 * log(1.0 + beta2*(1.0-x));
+ double ln_pre_3 = -tau * atan(p*beta);
+ double ln_pre = ln_pre_1 + ln_pre_2 + ln_pre_3;
+ double sum = 1.0 - olver_U1(beta2, p)/mu + olver_U2(beta2, p)/(mu*mu);
+
+ if(sum == 0.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ *ln_multiplier = 0.0;
+ return GSL_SUCCESS;
+ }
+ else {
+ int stat_e = gsl_sf_exp_mult_e(ln_pre, sum, result);
+ if(stat_e != GSL_SUCCESS) {
+ result->val = sum;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(sum);
+ *ln_multiplier = ln_pre;
+ }
+ else {
+ *ln_multiplier = 0.0;
+ }
+ return lg_stat;
+ }
+}
+
+
+/* Implementation of large tau asymptotic
+ *
+ * A_n^{-mu}, B_n^{-mu} [Olver, p.465, 469]
+ */
+
+inline
+static double olver_B0_xi(double mu, double xi)
+{
+ return (1.0 - 4.0*mu*mu)/(8.0*xi) * (1.0/tanh(xi) - 1.0/xi);
+}
+
+static double olver_A1_xi(double mu, double xi, double x)
+{
+ double B = olver_B0_xi(mu, xi);
+ double psi;
+ if(fabs(x - 1.0) < GSL_ROOT4_DBL_EPSILON) {
+ double y = x - 1.0;
+ double s = -1.0/3.0 + y*(2.0/15.0 - y *(61.0/945.0 - 452.0/14175.0*y));
+ psi = (4.0*mu*mu - 1.0)/16.0 * s;
+ }
+ else {
+ psi = (4.0*mu*mu - 1.0)/16.0 * (1.0/(x*x-1.0) - 1.0/(xi*xi));
+ }
+ return 0.5*xi*xi*B*B + (mu+0.5)*B - psi + mu/6.0*(0.25 - mu*mu);
+}
+
+inline
+static double olver_B0_th(double mu, double theta)
+{
+ return -(1.0 - 4.0*mu*mu)/(8.0*theta) * (1.0/tan(theta) - 1.0/theta);
+}
+
+static double olver_A1_th(double mu, double theta, double x)
+{
+ double B = olver_B0_th(mu, theta);
+ double psi;
+ if(fabs(x - 1.0) < GSL_ROOT4_DBL_EPSILON) {
+ double y = 1.0 - x;
+ double s = -1.0/3.0 + y*(2.0/15.0 - y *(61.0/945.0 - 452.0/14175.0*y));
+ psi = (4.0*mu*mu - 1.0)/16.0 * s;
+ }
+ else {
+ psi = (4.0*mu*mu - 1.0)/16.0 * (1.0/(x*x-1.0) + 1.0/(theta*theta));
+ }
+ return -0.5*theta*theta*B*B + (mu+0.5)*B - psi + mu/6.0*(0.25 - mu*mu);
+}
+
+
+/* Large tau uniform asymptotics
+ * P^{-mu}_{-1/2 + I tau}
+ * 1 < x
+ * tau -> Inf
+ * [Olver, p. 469]
+ */
+int
+gsl_sf_conicalP_xgt1_neg_mu_largetau_e(const double mu, const double tau,
+ const double x, double acosh_x,
+ gsl_sf_result * result, double * ln_multiplier)
+{
+ double xi = acosh_x;
+ double ln_xi_pre;
+ double ln_pre;
+ double sumA, sumB, sum;
+ double arg;
+ gsl_sf_result J_mup1;
+ gsl_sf_result J_mu;
+ double J_mum1;
+
+ if(xi < GSL_ROOT4_DBL_EPSILON) {
+ ln_xi_pre = -xi*xi/6.0; /* log(1.0 - xi*xi/6.0) */
+ }
+ else {
+ gsl_sf_result lnshxi;
+ gsl_sf_lnsinh_e(xi, &lnshxi);
+ ln_xi_pre = log(xi) - lnshxi.val; /* log(xi/sinh(xi) */
+ }
+
+ ln_pre = 0.5*ln_xi_pre - mu*log(tau);
+
+ arg = tau*xi;
+
+ gsl_sf_bessel_Jnu_e(mu + 1.0, arg, &J_mup1);
+ gsl_sf_bessel_Jnu_e(mu, arg, &J_mu);
+ J_mum1 = -J_mup1.val + 2.0*mu/arg*J_mu.val; /* careful of mu < 1 */
+
+ sumA = 1.0 - olver_A1_xi(-mu, xi, x)/(tau*tau);
+ sumB = olver_B0_xi(-mu, xi);
+ sum = J_mu.val * sumA - xi/tau * J_mum1 * sumB;
+
+ if(sum == 0.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ *ln_multiplier = 0.0;
+ return GSL_SUCCESS;
+ }
+ else {
+ int stat_e = gsl_sf_exp_mult_e(ln_pre, sum, result);
+ if(stat_e != GSL_SUCCESS) {
+ result->val = sum;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(sum);
+ *ln_multiplier = ln_pre;
+ }
+ else {
+ *ln_multiplier = 0.0;
+ }
+ return GSL_SUCCESS;
+ }
+}
+
+
+/* Large tau uniform asymptotics
+ * P^{-mu}_{-1/2 + I tau}
+ * -1 < x < 1
+ * tau -> Inf
+ * [Olver, p. 473]
+ */
+int
+gsl_sf_conicalP_xlt1_neg_mu_largetau_e(const double mu, const double tau,
+ const double x, const double acos_x,
+ gsl_sf_result * result, double * ln_multiplier)
+{
+ double theta = acos_x;
+ double ln_th_pre;
+ double ln_pre;
+ double sumA, sumB, sum, sumerr;
+ double arg;
+ gsl_sf_result I_mup1, I_mu;
+ double I_mum1;
+
+ if(theta < GSL_ROOT4_DBL_EPSILON) {
+ ln_th_pre = theta*theta/6.0; /* log(1.0 + theta*theta/6.0) */
+ }
+ else {
+ ln_th_pre = log(theta/sin(theta));
+ }
+
+ ln_pre = 0.5 * ln_th_pre - mu * log(tau);
+
+ arg = tau*theta;
+ gsl_sf_bessel_Inu_e(mu + 1.0, arg, &I_mup1);
+ gsl_sf_bessel_Inu_e(mu, arg, &I_mu);
+ I_mum1 = I_mup1.val + 2.0*mu/arg * I_mu.val; /* careful of mu < 1 */
+
+ sumA = 1.0 - olver_A1_th(-mu, theta, x)/(tau*tau);
+ sumB = olver_B0_th(-mu, theta);
+ sum = I_mu.val * sumA - theta/tau * I_mum1 * sumB;
+ sumerr = fabs(I_mu.err * sumA);
+ sumerr += fabs(I_mup1.err * theta/tau * sumB);
+ sumerr += fabs(I_mu.err * theta/tau * sumB * 2.0 * mu/arg);
+
+ if(sum == 0.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ *ln_multiplier = 0.0;
+ return GSL_SUCCESS;
+ }
+ else {
+ int stat_e = gsl_sf_exp_mult_e(ln_pre, sum, result);
+ if(stat_e != GSL_SUCCESS) {
+ result->val = sum;
+ result->err = sumerr;
+ result->err += GSL_DBL_EPSILON * fabs(sum);
+ *ln_multiplier = ln_pre;
+ }
+ else {
+ *ln_multiplier = 0.0;
+ }
+ return GSL_SUCCESS;
+ }
+}
+
+
+/* Hypergeometric function which appears in the
+ * large x expansion below:
+ *
+ * 2F1(1/4 - mu/2 - I tau/2, 3/4 - mu/2 - I tau/2, 1 - I tau, y)
+ *
+ * Note that for the usage below y = 1/x^2;
+ */
+static
+int
+conicalP_hyperg_large_x(const double mu, const double tau, const double y,
+ double * reF, double * imF)
+{
+ const int kmax = 1000;
+ const double re_a = 0.25 - 0.5*mu;
+ const double re_b = 0.75 - 0.5*mu;
+ const double re_c = 1.0;
+ const double im_a = -0.5*tau;
+ const double im_b = -0.5*tau;
+ const double im_c = -tau;
+
+ double re_sum = 1.0;
+ double im_sum = 0.0;
+ double re_term = 1.0;
+ double im_term = 0.0;
+ int k;
+
+ for(k=1; k<=kmax; k++) {
+ double re_ak = re_a + k - 1.0;
+ double re_bk = re_b + k - 1.0;
+ double re_ck = re_c + k - 1.0;
+ double im_ak = im_a;
+ double im_bk = im_b;
+ double im_ck = im_c;
+ double den = re_ck*re_ck + im_ck*im_ck;
+ double re_multiplier = ((re_ak*re_bk - im_ak*im_bk)*re_ck + im_ck*(im_ak*re_bk + re_ak*im_bk)) / den;
+ double im_multiplier = ((im_ak*re_bk + re_ak*im_bk)*re_ck - im_ck*(re_ak*re_bk - im_ak*im_bk)) / den;
+ double re_tmp = re_multiplier*re_term - im_multiplier*im_term;
+ double im_tmp = im_multiplier*re_term + re_multiplier*im_term;
+ double asum = fabs(re_sum) + fabs(im_sum);
+ re_term = y/k * re_tmp;
+ im_term = y/k * im_tmp;
+ if(fabs(re_term/asum) < GSL_DBL_EPSILON && fabs(im_term/asum) < GSL_DBL_EPSILON) break;
+ re_sum += re_term;
+ im_sum += im_term;
+ }
+
+ *reF = re_sum;
+ *imF = im_sum;
+
+ if(k == kmax)
+ GSL_ERROR ("error", GSL_EMAXITER);
+ else
+ return GSL_SUCCESS;
+}
+
+
+/* P^{mu}_{-1/2 + I tau}
+ * x->Inf
+ */
+int
+gsl_sf_conicalP_large_x_e(const double mu, const double tau, const double x,
+ gsl_sf_result * result, double * ln_multiplier)
+{
+ /* 2F1 term
+ */
+ double y = ( x < 0.5*GSL_SQRT_DBL_MAX ? 1.0/(x*x) : 0.0 );
+ double reF, imF;
+ int stat_F = conicalP_hyperg_large_x(mu, tau, y, &reF, &imF);
+
+ /* f = Gamma(+i tau)/Gamma(1/2 - mu + i tau)
+ * FIXME: shift so it's better for tau-> 0
+ */
+ gsl_sf_result lgr_num, lgth_num;
+ gsl_sf_result lgr_den, lgth_den;
+ int stat_gn = gsl_sf_lngamma_complex_e(0.0,tau,&lgr_num,&lgth_num);
+ int stat_gd = gsl_sf_lngamma_complex_e(0.5-mu,tau,&lgr_den,&lgth_den);
+
+ double angle = lgth_num.val - lgth_den.val + atan2(imF,reF);
+
+ double lnx = log(x);
+ double lnxp1 = log(x+1.0);
+ double lnxm1 = log(x-1.0);
+ double lnpre_const = 0.5*M_LN2 - 0.5*M_LNPI;
+ double lnpre_comm = (mu-0.5)*lnx - 0.5*mu*(lnxp1 + lnxm1);
+ double lnpre_err = GSL_DBL_EPSILON * (0.5*M_LN2 + 0.5*M_LNPI)
+ + GSL_DBL_EPSILON * fabs((mu-0.5)*lnx)
+ + GSL_DBL_EPSILON * fabs(0.5*mu)*(fabs(lnxp1)+fabs(lnxm1));
+
+ /* result = pre*|F|*|f| * cos(angle - tau * (log(x)+M_LN2))
+ */
+ gsl_sf_result cos_result;
+ int stat_cos = gsl_sf_cos_e(angle + tau*(log(x) + M_LN2), &cos_result);
+ int status = GSL_ERROR_SELECT_4(stat_cos, stat_gd, stat_gn, stat_F);
+ if(cos_result.val == 0.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return status;
+ }
+ else {
+ double lnFf_val = 0.5*log(reF*reF+imF*imF) + lgr_num.val - lgr_den.val;
+ double lnFf_err = lgr_num.err + lgr_den.err + GSL_DBL_EPSILON * fabs(lnFf_val);
+ double lnnoc_val = lnpre_const + lnpre_comm + lnFf_val;
+ double lnnoc_err = lnpre_err + lnFf_err + GSL_DBL_EPSILON * fabs(lnnoc_val);
+ int stat_e = gsl_sf_exp_mult_err_e(lnnoc_val, lnnoc_err,
+ cos_result.val, cos_result.err,
+ result);
+ if(stat_e == GSL_SUCCESS) {
+ *ln_multiplier = 0.0;
+ }
+ else {
+ result->val = cos_result.val;
+ result->err = cos_result.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ *ln_multiplier = lnnoc_val;
+ }
+ return status;
+ }
+}
+
+
+/* P^{mu}_{-1/2 + I tau} first hypergeometric representation
+ * -1 < x < 1
+ * This is more effective for |x| small, however it will work w/o
+ * reservation for any x < 0 because everything is positive
+ * definite in that case.
+ *
+ * [Kolbig, (3)] (note typo in args of gamma functions)
+ * [Bateman, (22)] (correct form)
+ */
+static
+int
+conicalP_xlt1_hyperg_A(double mu, double tau, double x, gsl_sf_result * result)
+{
+ double x2 = x*x;
+ double err_amp = 1.0 + 1.0/(GSL_DBL_EPSILON + fabs(1.0-fabs(x)));
+ double pre_val = M_SQRTPI / pow(0.5*sqrt(1-x2), mu);
+ double pre_err = err_amp * GSL_DBL_EPSILON * (fabs(mu)+1.0) * fabs(pre_val) ;
+ gsl_sf_result ln_g1, ln_g2, arg_g1, arg_g2;
+ gsl_sf_result F1, F2;
+ gsl_sf_result pre1, pre2;
+ double t1_val, t1_err;
+ double t2_val, t2_err;
+
+ int stat_F1 = gsl_sf_hyperg_2F1_conj_e(0.25 - 0.5*mu, 0.5*tau, 0.5, x2, &F1);
+ int stat_F2 = gsl_sf_hyperg_2F1_conj_e(0.75 - 0.5*mu, 0.5*tau, 1.5, x2, &F2);
+ int status = GSL_ERROR_SELECT_2(stat_F1, stat_F2);
+
+ gsl_sf_lngamma_complex_e(0.75 - 0.5*mu, -0.5*tau, &ln_g1, &arg_g1);
+ gsl_sf_lngamma_complex_e(0.25 - 0.5*mu, -0.5*tau, &ln_g2, &arg_g2);
+
+ gsl_sf_exp_err_e(-2.0*ln_g1.val, 2.0*ln_g1.err, &pre1);
+ gsl_sf_exp_err_e(-2.0*ln_g2.val, 2.0*ln_g2.err, &pre2);
+ pre2.val *= -2.0*x;
+ pre2.err *= 2.0*fabs(x);
+ pre2.err += GSL_DBL_EPSILON * fabs(pre2.val);
+
+ t1_val = pre1.val * F1.val;
+ t1_err = fabs(pre1.val) * F1.err + pre1.err * fabs(F1.val);
+ t2_val = pre2.val * F2.val;
+ t2_err = fabs(pre2.val) * F2.err + pre2.err * fabs(F2.val);
+
+ result->val = pre_val * (t1_val + t2_val);
+ result->err = pre_val * (t1_err + t2_err);
+ result->err += pre_err * fabs(t1_val + t2_val);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+
+ return status;
+}
+
+
+/* P^{mu}_{-1/2 + I tau}
+ * defining hypergeometric representation
+ * [Abramowitz+Stegun, 8.1.2]
+ * 1 < x < 3
+ * effective for x near 1
+ *
+ */
+#if 0
+static
+int
+conicalP_def_hyperg(double mu, double tau, double x, double * result)
+{
+ double F;
+ int stat_F = gsl_sf_hyperg_2F1_conj_renorm_e(0.5, tau, 1.0-mu, 0.5*(1.0-x), &F);
+ *result = pow((x+1.0)/(x-1.0), 0.5*mu) * F;
+ return stat_F;
+}
+#endif /* 0 */
+
+
+/* P^{mu}_{-1/2 + I tau} second hypergeometric representation
+ * [Zhurina+Karmazina, (3.1)]
+ * -1 < x < 3
+ * effective for x near 1
+ *
+ */
+#if 0
+static
+int
+conicalP_xnear1_hyperg_C(double mu, double tau, double x, double * result)
+{
+ double ln_pre, arg_pre;
+ double ln_g1, arg_g1;
+ double ln_g2, arg_g2;
+ double F;
+
+ int stat_F = gsl_sf_hyperg_2F1_conj_renorm_e(0.5+mu, tau, 1.0+mu, 0.5*(1.0-x), &F);
+
+ gsl_sf_lngamma_complex_e(0.5+mu, tau, &ln_g1, &arg_g1);
+ gsl_sf_lngamma_complex_e(0.5-mu, tau, &ln_g2, &arg_g2);
+
+ ln_pre = mu*M_LN2 - 0.5*mu*log(fabs(x*x-1.0)) + ln_g1 - ln_g2;
+ arg_pre = arg_g1 - arg_g2;
+
+ *result = exp(ln_pre) * F;
+ return stat_F;
+}
+#endif /* 0 */
+
+
+/* V0, V1 from Kolbig, m = 0
+ */
+static
+int
+conicalP_0_V(const double t, const double f, const double tau, const double sgn,
+ double * V0, double * V1)
+{
+ double C[8];
+ double T[8];
+ double H[8];
+ double V[12];
+ int i;
+ T[0] = 1.0;
+ H[0] = 1.0;
+ V[0] = 1.0;
+ for(i=1; i<=7; i++) {
+ T[i] = T[i-1] * t;
+ H[i] = H[i-1] * (t*f);
+ }
+ for(i=1; i<=11; i++) {
+ V[i] = V[i-1] * tau;
+ }
+
+ C[0] = 1.0;
+ C[1] = (H[1]-1.0)/(8.0*T[1]);
+ C[2] = (9.0*H[2] + 6.0*H[1] - 15.0 - sgn*8.0*T[2])/(128.0*T[2]);
+ C[3] = 5.0*(15.0*H[3] + 27.0*H[2] + 21.0*H[1] - 63.0 - sgn*T[2]*(16.0*H[1]+24.0))/(1024.0*T[3]);
+ C[4] = 7.0*(525.0*H[4] + 1500.0*H[3] + 2430.0*H[2] + 1980.0*H[1] - 6435.0
+ + 192.0*T[4] - sgn*T[2]*(720.0*H[2]+1600.0*H[1]+2160.0)
+ ) / (32768.0*T[4]);
+ C[5] = 21.0*(2835.0*H[5] + 11025.0*H[4] + 24750.0*H[3] + 38610.0*H[2]
+ + 32175.0*H[1] - 109395.0 + T[4]*(1984.0*H[1]+4032.0)
+ - sgn*T[2]*(4800.0*H[3]+15120.0*H[2]+26400.0*H[1]+34320.0)
+ ) / (262144.0*T[5]);
+ C[6] = 11.0*(218295.0*H[6] + 1071630.0*H[5] + 3009825.0*H[4] + 6142500.0*H[3]
+ + 9398025.0*H[2] + 7936110.0*H[1] - 27776385.0
+ + T[4]*(254016.0*H[2]+749952.0*H[1]+1100736.0)
+ - sgn*T[2]*(441000.0*H[4] + 1814400.0*H[3] + 4127760.0*H[2]
+ + 6552000.0*H[1] + 8353800.0 + 31232.0*T[4]
+ )
+ ) / (4194304.0*T[6]);
+
+ *V0 = C[0] + (-4.0*C[3]/T[1]+C[4])/V[4]
+ + (-192.0*C[5]/T[3]+144.0*C[6]/T[2])/V[8]
+ + sgn * (-C[2]/V[2]
+ + (-24.0*C[4]/T[2]+12.0*C[5]/T[1]-C[6])/V[6]
+ + (-1920.0*C[6]/T[4])/V[10]
+ );
+ *V1 = C[1]/V[1] + (8.0*(C[3]/T[2]-C[4]/T[1])+C[5])/V[5]
+ + (384.0*C[5]/T[4] - 768.0*C[6]/T[3])/V[9]
+ + sgn * ((2.0*C[2]/T[1]-C[3])/V[3]
+ + (48.0*C[4]/T[3]-72.0*C[5]/T[2] + 18.0*C[6]/T[1])/V[7]
+ + (3840.0*C[6]/T[5])/V[11]
+ );
+
+ return GSL_SUCCESS;
+}
+
+
+/* V0, V1 from Kolbig, m = 1
+ */
+static
+int
+conicalP_1_V(const double t, const double f, const double tau, const double sgn,
+ double * V0, double * V1)
+{
+ double Cm1;
+ double C[8];
+ double T[8];
+ double H[8];
+ double V[12];
+ int i;
+ T[0] = 1.0;
+ H[0] = 1.0;
+ V[0] = 1.0;
+ for(i=1; i<=7; i++) {
+ T[i] = T[i-1] * t;
+ H[i] = H[i-1] * (t*f);
+ }
+ for(i=1; i<=11; i++) {
+ V[i] = V[i-1] * tau;
+ }
+
+ Cm1 = -1.0;
+ C[0] = 3.0*(1.0-H[1])/(8.0*T[1]);
+ C[1] = (-15.0*H[2]+6.0*H[1]+9.0+sgn*8.0*T[2])/(128.0*T[2]);
+ C[2] = 3.0*(-35.0*H[3] - 15.0*H[2] + 15.0*H[1] + 35.0 + sgn*T[2]*(32.0*H[1]+8.0))/(1024.0*T[3]);
+ C[3] = (-4725.0*H[4] - 6300.0*H[3] - 3150.0*H[2] + 3780.0*H[1] + 10395.0
+ -1216.0*T[4] + sgn*T[2]*(6000.0*H[2]+5760.0*H[1]+1680.0)) / (32768.0*T[4]);
+ C[4] = 7.0*(-10395.0*H[5] - 23625.0*H[4] - 28350.0*H[3] - 14850.0*H[2]
+ +19305.0*H[1] + 57915.0 - T[4]*(6336.0*H[1]+6080.0)
+ + sgn*T[2]*(16800.0*H[3] + 30000.0*H[2] + 25920.0*H[1] + 7920.0)
+ ) / (262144.0*T[5]);
+ C[5] = (-2837835.0*H[6] - 9168390.0*H[5] - 16372125.0*H[4] - 18918900*H[3]
+ -10135125.0*H[2] + 13783770.0*H[1] + 43648605.0
+ -T[4]*(3044160.0*H[2] + 5588352.0*H[1] + 4213440.0)
+ +sgn*T[2]*(5556600.0*H[4] + 14817600.0*H[3] + 20790000.0*H[2]
+ + 17297280.0*H[1] + 5405400.0 + 323072.0*T[4]
+ )
+ ) / (4194304.0*T[6]);
+ C[6] = 0.0;
+
+ *V0 = C[0] + (-4.0*C[3]/T[1]+C[4])/V[4]
+ + (-192.0*C[5]/T[3]+144.0*C[6]/T[2])/V[8]
+ + sgn * (-C[2]/V[2]
+ + (-24.0*C[4]/T[2]+12.0*C[5]/T[1]-C[6])/V[6]
+ );
+ *V1 = C[1]/V[1] + (8.0*(C[3]/T[2]-C[4]/T[1])+C[5])/V[5]
+ + (384.0*C[5]/T[4] - 768.0*C[6]/T[3])/V[9]
+ + sgn * (Cm1*V[1] + (2.0*C[2]/T[1]-C[3])/V[3]
+ + (48.0*C[4]/T[3]-72.0*C[5]/T[2] + 18.0*C[6]/T[1])/V[7]
+ );
+
+ return GSL_SUCCESS;
+}
+
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+/* P^0_{-1/2 + I lambda}
+ */
+int
+gsl_sf_conicalP_0_e(const double lambda, const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x <= -1.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x == 1.0) {
+ result->val = 1.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(lambda == 0.0) {
+ gsl_sf_result K;
+ int stat_K;
+ if(x < 1.0) {
+ const double th = acos(x);
+ const double s = sin(0.5*th);
+ stat_K = gsl_sf_ellint_Kcomp_e(s, GSL_MODE_DEFAULT, &K);
+ result->val = 2.0/M_PI * K.val;
+ result->err = 2.0/M_PI * K.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return stat_K;
+ }
+ else {
+ const double xi = acosh(x);
+ const double c = cosh(0.5*xi);
+ const double t = tanh(0.5*xi);
+ stat_K = gsl_sf_ellint_Kcomp_e(t, GSL_MODE_DEFAULT, &K);
+ result->val = 2.0/M_PI / c * K.val;
+ result->err = 2.0/M_PI / c * K.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return stat_K;
+ }
+ }
+ else if( (x <= 0.0 && lambda < 1000.0)
+ || (x < 0.1 && lambda < 17.0)
+ || (x < 0.2 && lambda < 5.0 )
+ ) {
+ return conicalP_xlt1_hyperg_A(0.0, lambda, x, result);
+ }
+ else if( (x <= 0.2 && lambda < 17.0)
+ || (x <= 1.5 && lambda < 20.0)
+ ) {
+ return gsl_sf_hyperg_2F1_conj_e(0.5, lambda, 1.0, (1.0-x)/2, result);
+ }
+ else if(1.5 < x && lambda < GSL_MAX(x,20.0)) {
+ gsl_sf_result P;
+ double lm;
+ int stat_P = gsl_sf_conicalP_large_x_e(0.0, lambda, x,
+ &P, &lm
+ );
+ int stat_e = gsl_sf_exp_mult_err_e(lm, 2.0*GSL_DBL_EPSILON * fabs(lm),
+ P.val, P.err,
+ result);
+ return GSL_ERROR_SELECT_2(stat_e, stat_P);
+ }
+ else {
+ double V0, V1;
+ if(x < 1.0) {
+ double th = acos(x);
+ double sth = sqrt(1.0-x*x); /* sin(th) */
+ gsl_sf_result I0, I1;
+ int stat_I0 = gsl_sf_bessel_I0_scaled_e(th * lambda, &I0);
+ int stat_I1 = gsl_sf_bessel_I1_scaled_e(th * lambda, &I1);
+ int stat_I = GSL_ERROR_SELECT_2(stat_I0, stat_I1);
+ int stat_V = conicalP_0_V(th, x/sth, lambda, -1.0, &V0, &V1);
+ double bessterm = V0 * I0.val + V1 * I1.val;
+ double besserr = fabs(V0) * I0.err + fabs(V1) * I1.err;
+ double arg1 = th*lambda;
+ double sqts = sqrt(th/sth);
+ int stat_e = gsl_sf_exp_mult_err_e(arg1, 4.0 * GSL_DBL_EPSILON * fabs(arg1),
+ sqts * bessterm, sqts * besserr,
+ result);
+ return GSL_ERROR_SELECT_3(stat_e, stat_V, stat_I);
+ }
+ else {
+ double sh = sqrt(x-1.0)*sqrt(x+1.0); /* sinh(xi) */
+ double xi = log(x + sh); /* xi = acosh(x) */
+ gsl_sf_result J0, J1;
+ int stat_J0 = gsl_sf_bessel_J0_e(xi * lambda, &J0);
+ int stat_J1 = gsl_sf_bessel_J1_e(xi * lambda, &J1);
+ int stat_J = GSL_ERROR_SELECT_2(stat_J0, stat_J1);
+ int stat_V = conicalP_0_V(xi, x/sh, lambda, 1.0, &V0, &V1);
+ double bessterm = V0 * J0.val + V1 * J1.val;
+ double besserr = fabs(V0) * J0.err + fabs(V1) * J1.err;
+ double pre_val = sqrt(xi/sh);
+ double pre_err = 2.0 * fabs(pre_val);
+ result->val = pre_val * bessterm;
+ result->err = pre_val * besserr;
+ result->err += pre_err * fabs(bessterm);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_ERROR_SELECT_2(stat_V, stat_J);
+ }
+ }
+}
+
+
+/* P^1_{-1/2 + I lambda}
+ */
+int
+gsl_sf_conicalP_1_e(const double lambda, const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x <= -1.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(lambda == 0.0) {
+ gsl_sf_result K, E;
+ int stat_K, stat_E;
+ if(x == 1.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(x < 1.0) {
+ if(1.0-x < GSL_SQRT_DBL_EPSILON) {
+ double err_amp = GSL_MAX_DBL(1.0, 1.0/(GSL_DBL_EPSILON + fabs(1.0-x)));
+ result->val = 0.25/M_SQRT2 * sqrt(1.0-x) * (1.0 + 5.0/16.0 * (1.0-x));
+ result->err = err_amp * 3.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ const double th = acos(x);
+ const double s = sin(0.5*th);
+ const double c2 = 1.0 - s*s;
+ const double sth = sin(th);
+ const double pre = 2.0/(M_PI*sth);
+ stat_K = gsl_sf_ellint_Kcomp_e(s, GSL_MODE_DEFAULT, &K);
+ stat_E = gsl_sf_ellint_Ecomp_e(s, GSL_MODE_DEFAULT, &E);
+ result->val = pre * (E.val - c2 * K.val);
+ result->err = pre * (E.err + fabs(c2) * K.err);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return stat_K;
+ }
+ }
+ else {
+ if(x-1.0 < GSL_SQRT_DBL_EPSILON) {
+ double err_amp = GSL_MAX_DBL(1.0, 1.0/(GSL_DBL_EPSILON + fabs(1.0-x)));
+ result->val = -0.25/M_SQRT2 * sqrt(x-1.0) * (1.0 - 5.0/16.0 * (x-1.0));
+ result->err = err_amp * 3.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ const double xi = acosh(x);
+ const double c = cosh(0.5*xi);
+ const double t = tanh(0.5*xi);
+ const double sxi = sinh(xi);
+ const double pre = 2.0/(M_PI*sxi) * c;
+ stat_K = gsl_sf_ellint_Kcomp_e(t, GSL_MODE_DEFAULT, &K);
+ stat_E = gsl_sf_ellint_Ecomp_e(t, GSL_MODE_DEFAULT, &E);
+ result->val = pre * (E.val - K.val);
+ result->err = pre * (E.err + K.err);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return stat_K;
+ }
+ }
+ }
+ else if( (x <= 0.0 && lambda < 1000.0)
+ || (x < 0.1 && lambda < 17.0)
+ || (x < 0.2 && lambda < 5.0 )
+ ) {
+ return conicalP_xlt1_hyperg_A(1.0, lambda, x, result);
+ }
+ else if( (x <= 0.2 && lambda < 17.0)
+ || (x < 1.5 && lambda < 20.0)
+ ) {
+ const double arg = fabs(x*x - 1.0);
+ const double sgn = GSL_SIGN(1.0 - x);
+ const double pre = 0.5*(lambda*lambda + 0.25) * sgn * sqrt(arg);
+ gsl_sf_result F;
+ int stat_F = gsl_sf_hyperg_2F1_conj_e(1.5, lambda, 2.0, (1.0-x)/2, &F);
+ result->val = pre * F.val;
+ result->err = fabs(pre) * F.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return stat_F;
+ }
+ else if(1.5 <= x && lambda < GSL_MAX(x,20.0)) {
+ gsl_sf_result P;
+ double lm;
+ int stat_P = gsl_sf_conicalP_large_x_e(1.0, lambda, x,
+ &P, &lm
+ );
+ int stat_e = gsl_sf_exp_mult_err_e(lm, 2.0 * GSL_DBL_EPSILON * fabs(lm),
+ P.val, P.err,
+ result);
+ return GSL_ERROR_SELECT_2(stat_e, stat_P);
+ }
+ else {
+ double V0, V1;
+ if(x < 1.0) {
+ const double sqrt_1mx = sqrt(1.0 - x);
+ const double sqrt_1px = sqrt(1.0 + x);
+ const double th = acos(x);
+ const double sth = sqrt_1mx * sqrt_1px; /* sin(th) */
+ gsl_sf_result I0, I1;
+ int stat_I0 = gsl_sf_bessel_I0_scaled_e(th * lambda, &I0);
+ int stat_I1 = gsl_sf_bessel_I1_scaled_e(th * lambda, &I1);
+ int stat_I = GSL_ERROR_SELECT_2(stat_I0, stat_I1);
+ int stat_V = conicalP_1_V(th, x/sth, lambda, -1.0, &V0, &V1);
+ double bessterm = V0 * I0.val + V1 * I1.val;
+ double besserr = fabs(V0) * I0.err + fabs(V1) * I1.err
+ + 2.0 * GSL_DBL_EPSILON * fabs(V0 * I0.val)
+ + 2.0 * GSL_DBL_EPSILON * fabs(V1 * I1.val);
+ double arg1 = th * lambda;
+ double sqts = sqrt(th/sth);
+ int stat_e = gsl_sf_exp_mult_err_e(arg1, 2.0 * GSL_DBL_EPSILON * fabs(arg1),
+ sqts * bessterm, sqts * besserr,
+ result);
+ result->err *= 1.0/sqrt_1mx;
+ return GSL_ERROR_SELECT_3(stat_e, stat_V, stat_I);
+ }
+ else {
+ const double sqrt_xm1 = sqrt(x - 1.0);
+ const double sqrt_xp1 = sqrt(x + 1.0);
+ const double sh = sqrt_xm1 * sqrt_xp1; /* sinh(xi) */
+ const double xi = log(x + sh); /* xi = acosh(x) */
+ const double xi_lam = xi * lambda;
+ gsl_sf_result J0, J1;
+ const int stat_J0 = gsl_sf_bessel_J0_e(xi_lam, &J0);
+ const int stat_J1 = gsl_sf_bessel_J1_e(xi_lam, &J1);
+ const int stat_J = GSL_ERROR_SELECT_2(stat_J0, stat_J1);
+ const int stat_V = conicalP_1_V(xi, x/sh, lambda, 1.0, &V0, &V1);
+ const double bessterm = V0 * J0.val + V1 * J1.val;
+ const double besserr = fabs(V0) * J0.err + fabs(V1) * J1.err
+ + 512.0 * 2.0 * GSL_DBL_EPSILON * fabs(V0 * J0.val)
+ + 512.0 * 2.0 * GSL_DBL_EPSILON * fabs(V1 * J1.val)
+ + GSL_DBL_EPSILON * fabs(xi_lam * V0 * J1.val)
+ + GSL_DBL_EPSILON * fabs(xi_lam * V1 * J0.val);
+ const double pre = sqrt(xi/sh);
+ result->val = pre * bessterm;
+ result->err = pre * besserr * sqrt_xp1 / sqrt_xm1;
+ result->err += 4.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_ERROR_SELECT_2(stat_V, stat_J);
+ }
+ }
+}
+
+
+/* P^{1/2}_{-1/2 + I lambda} (x)
+ * [Abramowitz+Stegun 8.6.8, 8.6.12]
+ * checked OK [GJ] Fri May 8 12:24:36 MDT 1998
+ */
+int gsl_sf_conicalP_half_e(const double lambda, const double x,
+ gsl_sf_result * result
+ )
+{
+ /* CHECK_POINTER(result) */
+
+ if(x <= -1.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x < 1.0) {
+ double err_amp = 1.0 + 1.0/(GSL_DBL_EPSILON + fabs(1.0-fabs(x)));
+ double ac = acos(x);
+ double den = sqrt(sqrt(1.0-x)*sqrt(1.0+x));
+ result->val = Root_2OverPi_ / den * cosh(ac * lambda);
+ result->err = err_amp * 3.0 * GSL_DBL_EPSILON * fabs(result->val);
+ result->err *= fabs(ac * lambda) + 1.0;
+ return GSL_SUCCESS;
+ }
+ else if(x == 1.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else {
+ /* x > 1 */
+ double err_amp = 1.0 + 1.0/(GSL_DBL_EPSILON + fabs(1.0-fabs(x)));
+ double sq_term = sqrt(x-1.0)*sqrt(x+1.0);
+ double ln_term = log(x + sq_term);
+ double den = sqrt(sq_term);
+ double carg_val = lambda * ln_term;
+ double carg_err = 2.0 * GSL_DBL_EPSILON * fabs(carg_val);
+ gsl_sf_result cos_result;
+ int stat_cos = gsl_sf_cos_err_e(carg_val, carg_err, &cos_result);
+ result->val = Root_2OverPi_ / den * cos_result.val;
+ result->err = err_amp * Root_2OverPi_ / den * cos_result.err;
+ result->err += 4.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return stat_cos;
+ }
+}
+
+
+/* P^{-1/2}_{-1/2 + I lambda} (x)
+ * [Abramowitz+Stegun 8.6.9, 8.6.14]
+ * checked OK [GJ] Fri May 8 12:24:43 MDT 1998
+ */
+int gsl_sf_conicalP_mhalf_e(const double lambda, const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x <= -1.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x < 1.0) {
+ double ac = acos(x);
+ double den = sqrt(sqrt(1.0-x)*sqrt(1.0+x));
+ double arg = ac * lambda;
+ double err_amp = 1.0 + 1.0/(GSL_DBL_EPSILON + fabs(1.0-fabs(x)));
+ if(fabs(arg) < GSL_SQRT_DBL_EPSILON) {
+ result->val = Root_2OverPi_ / den * ac;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ result->err *= err_amp;
+ }
+ else {
+ result->val = Root_2OverPi_ / (den*lambda) * sinh(arg);
+ result->err = GSL_DBL_EPSILON * (fabs(arg)+1.0) * fabs(result->val);
+ result->err *= err_amp;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ }
+ return GSL_SUCCESS;
+ }
+ else if(x == 1.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else {
+ /* x > 1 */
+ double sq_term = sqrt(x-1.0)*sqrt(x+1.0);
+ double ln_term = log(x + sq_term);
+ double den = sqrt(sq_term);
+ double arg_val = lambda * ln_term;
+ double arg_err = 2.0 * GSL_DBL_EPSILON * fabs(arg_val);
+ if(arg_val < GSL_SQRT_DBL_EPSILON) {
+ result->val = Root_2OverPi_ / den * ln_term;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ gsl_sf_result sin_result;
+ int stat_sin = gsl_sf_sin_err_e(arg_val, arg_err, &sin_result);
+ result->val = Root_2OverPi_ / (den*lambda) * sin_result.val;
+ result->err = Root_2OverPi_ / fabs(den*lambda) * sin_result.err;
+ result->err += 3.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return stat_sin;
+ }
+ }
+}
+
+
+int gsl_sf_conicalP_sph_reg_e(const int l, const double lambda,
+ const double x,
+ gsl_sf_result * result
+ )
+{
+ /* CHECK_POINTER(result) */
+
+ if(x <= -1.0 || l < -1) {
+ DOMAIN_ERROR(result);
+ }
+ else if(l == -1) {
+ return gsl_sf_conicalP_half_e(lambda, x, result);
+ }
+ else if(l == 0) {
+ return gsl_sf_conicalP_mhalf_e(lambda, x, result);
+ }
+ else if(x == 1.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(x < 0.0) {
+ double c = 1.0/sqrt(1.0-x*x);
+ gsl_sf_result r_Pellm1;
+ gsl_sf_result r_Pell;
+ int stat_0 = gsl_sf_conicalP_half_e(lambda, x, &r_Pellm1); /* P^( 1/2) */
+ int stat_1 = gsl_sf_conicalP_mhalf_e(lambda, x, &r_Pell); /* P^(-1/2) */
+ int stat_P = GSL_ERROR_SELECT_2(stat_0, stat_1);
+ double Pellm1 = r_Pellm1.val;
+ double Pell = r_Pell.val;
+ double Pellp1;
+ int ell;
+
+ for(ell=0; ell<l; ell++) {
+ double d = (ell+1.0)*(ell+1.0) + lambda*lambda;
+ Pellp1 = (Pellm1 - (2.0*ell+1.0)*c*x * Pell) / d;
+ Pellm1 = Pell;
+ Pell = Pellp1;
+ }
+
+ result->val = Pell;
+ result->err = (0.5*l + 1.0) * GSL_DBL_EPSILON * fabs(Pell);
+ result->err += GSL_DBL_EPSILON * l * fabs(result->val);
+ return stat_P;
+ }
+ else if(x < 1.0) {
+ const double xi = x/(sqrt(1.0-x)*sqrt(1.0+x));
+ gsl_sf_result rat;
+ gsl_sf_result Phf;
+ int stat_CF1 = conicalP_negmu_xlt1_CF1(0.5, l, lambda, x, &rat);
+ int stat_Phf = gsl_sf_conicalP_half_e(lambda, x, &Phf);
+ double Pellp1 = rat.val * GSL_SQRT_DBL_MIN;
+ double Pell = GSL_SQRT_DBL_MIN;
+ double Pellm1;
+ int ell;
+
+ for(ell=l; ell>=0; ell--) {
+ double d = (ell+1.0)*(ell+1.0) + lambda*lambda;
+ Pellm1 = (2.0*ell+1.0)*xi * Pell + d * Pellp1;
+ Pellp1 = Pell;
+ Pell = Pellm1;
+ }
+
+ result->val = GSL_SQRT_DBL_MIN * Phf.val / Pell;
+ result->err = GSL_SQRT_DBL_MIN * Phf.err / fabs(Pell);
+ result->err += fabs(rat.err/rat.val) * (l + 1.0) * fabs(result->val);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+
+ return GSL_ERROR_SELECT_2(stat_Phf, stat_CF1);
+ }
+ else if(x == 1.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else {
+ /* x > 1.0 */
+
+ const double xi = x/sqrt((x-1.0)*(x+1.0));
+ gsl_sf_result rat;
+ int stat_CF1 = conicalP_negmu_xgt1_CF1(0.5, l, lambda, x, &rat);
+ int stat_P;
+ double Pellp1 = rat.val * GSL_SQRT_DBL_MIN;
+ double Pell = GSL_SQRT_DBL_MIN;
+ double Pellm1;
+ int ell;
+
+ for(ell=l; ell>=0; ell--) {
+ double d = (ell+1.0)*(ell+1.0) + lambda*lambda;
+ Pellm1 = (2.0*ell+1.0)*xi * Pell - d * Pellp1;
+ Pellp1 = Pell;
+ Pell = Pellm1;
+ }
+
+ if(fabs(Pell) > fabs(Pellp1)){
+ gsl_sf_result Phf;
+ stat_P = gsl_sf_conicalP_half_e(lambda, x, &Phf);
+ result->val = GSL_SQRT_DBL_MIN * Phf.val / Pell;
+ result->err = 2.0 * GSL_SQRT_DBL_MIN * Phf.err / fabs(Pell);
+ result->err += 2.0 * fabs(rat.err/rat.val) * (l + 1.0) * fabs(result->val);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ }
+ else {
+ gsl_sf_result Pmhf;
+ stat_P = gsl_sf_conicalP_mhalf_e(lambda, x, &Pmhf);
+ result->val = GSL_SQRT_DBL_MIN * Pmhf.val / Pellp1;
+ result->err = 2.0 * GSL_SQRT_DBL_MIN * Pmhf.err / fabs(Pellp1);
+ result->err += 2.0 * fabs(rat.err/rat.val) * (l + 1.0) * fabs(result->val);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ }
+
+ return GSL_ERROR_SELECT_2(stat_P, stat_CF1);
+ }
+}
+
+
+int gsl_sf_conicalP_cyl_reg_e(const int m, const double lambda,
+ const double x,
+ gsl_sf_result * result
+ )
+{
+ /* CHECK_POINTER(result) */
+
+ if(x <= -1.0 || m < -1) {
+ DOMAIN_ERROR(result);
+ }
+ else if(m == -1) {
+ return gsl_sf_conicalP_1_e(lambda, x, result);
+ }
+ else if(m == 0) {
+ return gsl_sf_conicalP_0_e(lambda, x, result);
+ }
+ else if(x == 1.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(x < 0.0) {
+ double c = 1.0/sqrt(1.0-x*x);
+ gsl_sf_result r_Pkm1;
+ gsl_sf_result r_Pk;
+ int stat_0 = gsl_sf_conicalP_1_e(lambda, x, &r_Pkm1); /* P^1 */
+ int stat_1 = gsl_sf_conicalP_0_e(lambda, x, &r_Pk); /* P^0 */
+ int stat_P = GSL_ERROR_SELECT_2(stat_0, stat_1);
+ double Pkm1 = r_Pkm1.val;
+ double Pk = r_Pk.val;
+ double Pkp1;
+ int k;
+
+ for(k=0; k<m; k++) {
+ double d = (k+0.5)*(k+0.5) + lambda*lambda;
+ Pkp1 = (Pkm1 - 2.0*k*c*x * Pk) / d;
+ Pkm1 = Pk;
+ Pk = Pkp1;
+ }
+
+ result->val = Pk;
+ result->err = (m + 2.0) * GSL_DBL_EPSILON * fabs(Pk);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+
+ return stat_P;
+ }
+ else if(x < 1.0) {
+ const double xi = x/(sqrt(1.0-x)*sqrt(1.0+x));
+ gsl_sf_result rat;
+ gsl_sf_result P0;
+ int stat_CF1 = conicalP_negmu_xlt1_CF1(0.0, m, lambda, x, &rat);
+ int stat_P0 = gsl_sf_conicalP_0_e(lambda, x, &P0);
+ double Pkp1 = rat.val * GSL_SQRT_DBL_MIN;
+ double Pk = GSL_SQRT_DBL_MIN;
+ double Pkm1;
+ int k;
+
+ for(k=m; k>0; k--) {
+ double d = (k+0.5)*(k+0.5) + lambda*lambda;
+ Pkm1 = 2.0*k*xi * Pk + d * Pkp1;
+ Pkp1 = Pk;
+ Pk = Pkm1;
+ }
+
+ result->val = GSL_SQRT_DBL_MIN * P0.val / Pk;
+ result->err = 2.0 * GSL_SQRT_DBL_MIN * P0.err / fabs(Pk);
+ result->err += 2.0 * fabs(rat.err/rat.val) * (m + 1.0) * fabs(result->val);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+
+ return GSL_ERROR_SELECT_2(stat_P0, stat_CF1);
+ }
+ else if(x == 1.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else {
+ /* x > 1.0 */
+
+ const double xi = x/sqrt((x-1.0)*(x+1.0));
+ gsl_sf_result rat;
+ int stat_CF1 = conicalP_negmu_xgt1_CF1(0.0, m, lambda, x, &rat);
+ int stat_P;
+ double Pkp1 = rat.val * GSL_SQRT_DBL_MIN;
+ double Pk = GSL_SQRT_DBL_MIN;
+ double Pkm1;
+ int k;
+
+ for(k=m; k>-1; k--) {
+ double d = (k+0.5)*(k+0.5) + lambda*lambda;
+ Pkm1 = 2.0*k*xi * Pk - d * Pkp1;
+ Pkp1 = Pk;
+ Pk = Pkm1;
+ }
+
+ if(fabs(Pk) > fabs(Pkp1)){
+ gsl_sf_result P1;
+ stat_P = gsl_sf_conicalP_1_e(lambda, x, &P1);
+ result->val = GSL_SQRT_DBL_MIN * P1.val / Pk;
+ result->err = 2.0 * GSL_SQRT_DBL_MIN * P1.err / fabs(Pk);
+ result->err += 2.0 * fabs(rat.err/rat.val) * (m+2.0) * fabs(result->val);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ }
+ else {
+ gsl_sf_result P0;
+ stat_P = gsl_sf_conicalP_0_e(lambda, x, &P0);
+ result->val = GSL_SQRT_DBL_MIN * P0.val / Pkp1;
+ result->err = 2.0 * GSL_SQRT_DBL_MIN * P0.err / fabs(Pkp1);
+ result->err += 2.0 * fabs(rat.err/rat.val) * (m+2.0) * fabs(result->val);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ }
+
+ return GSL_ERROR_SELECT_2(stat_P, stat_CF1);
+ }
+}
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_conicalP_0(const double lambda, const double x)
+{
+ EVAL_RESULT(gsl_sf_conicalP_0_e(lambda, x, &result));
+}
+
+double gsl_sf_conicalP_1(const double lambda, const double x)
+{
+ EVAL_RESULT(gsl_sf_conicalP_1_e(lambda, x, &result));
+}
+
+double gsl_sf_conicalP_half(const double lambda, const double x)
+{
+ EVAL_RESULT(gsl_sf_conicalP_half_e(lambda, x, &result));
+}
+
+double gsl_sf_conicalP_mhalf(const double lambda, const double x)
+{
+ EVAL_RESULT(gsl_sf_conicalP_mhalf_e(lambda, x, &result));
+}
+
+double gsl_sf_conicalP_sph_reg(const int l, const double lambda, const double x)
+{
+ EVAL_RESULT(gsl_sf_conicalP_sph_reg_e(l, lambda, x, &result));
+}
+
+double gsl_sf_conicalP_cyl_reg(const int m, const double lambda, const double x)
+{
+ EVAL_RESULT(gsl_sf_conicalP_cyl_reg_e(m, lambda, x, &result));
+}
diff --git a/gsl-1.9/specfunc/legendre_poly.c b/gsl-1.9/specfunc/legendre_poly.c
new file mode 100644
index 0000000..211a101
--- /dev/null
+++ b/gsl-1.9/specfunc/legendre_poly.c
@@ -0,0 +1,783 @@
+/* specfunc/legendre_poly.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_bessel.h>
+#include <gsl/gsl_sf_exp.h>
+#include <gsl/gsl_sf_gamma.h>
+#include <gsl/gsl_sf_log.h>
+#include <gsl/gsl_sf_pow_int.h>
+#include <gsl/gsl_sf_legendre.h>
+
+#include "error.h"
+
+
+
+/* Calculate P_m^m(x) from the analytic result:
+ * P_m^m(x) = (-1)^m (2m-1)!! (1-x^2)^(m/2) , m > 0
+ * = 1 , m = 0
+ */
+static double legendre_Pmm(int m, double x)
+{
+ if(m == 0)
+ {
+ return 1.0;
+ }
+ else
+ {
+ double p_mm = 1.0;
+ double root_factor = sqrt(1.0-x)*sqrt(1.0+x);
+ double fact_coeff = 1.0;
+ int i;
+ for(i=1; i<=m; i++)
+ {
+ p_mm *= -fact_coeff * root_factor;
+ fact_coeff += 2.0;
+ }
+ return p_mm;
+ }
+}
+
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int
+gsl_sf_legendre_P1_e(double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ {
+ result->val = x;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+}
+
+int
+gsl_sf_legendre_P2_e(double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ {
+ result->val = 0.5*(3.0*x*x - 1.0);
+ result->err = GSL_DBL_EPSILON * (fabs(3.0*x*x) + 1.0);
+ return GSL_SUCCESS;
+ }
+}
+
+int
+gsl_sf_legendre_P3_e(double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ {
+ result->val = 0.5*x*(5.0*x*x - 3.0);
+ result->err = GSL_DBL_EPSILON * (fabs(result->val) + 0.5 * fabs(x) * (fabs(5.0*x*x) + 3.0));
+ return GSL_SUCCESS;
+ }
+}
+
+
+int
+gsl_sf_legendre_Pl_e(const int l, const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(l < 0 || x < -1.0 || x > 1.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(l == 0) {
+ result->val = 1.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(l == 1) {
+ result->val = x;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(l == 2) {
+ result->val = 0.5 * (3.0*x*x - 1.0);
+ result->err = GSL_DBL_EPSILON * (fabs(3.0*x*x) + 1.0);
+ /*result->err = 3.0 * GSL_DBL_EPSILON * fabs(result->val);
+ removed this old bogus estimate [GJ]
+ */
+ return GSL_SUCCESS;
+ }
+ else if(x == 1.0) {
+ result->val = 1.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(x == -1.0) {
+ result->val = ( GSL_IS_ODD(l) ? -1.0 : 1.0 );
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(l < 100000) {
+ /* upward recurrence: l P_l = (2l-1) z P_{l-1} - (l-1) P_{l-2} */
+
+ double p_ellm2 = 1.0; /* P_0(x) */
+ double p_ellm1 = x; /* P_1(x) */
+ double p_ell = p_ellm1;
+
+ double e_ellm2 = GSL_DBL_EPSILON;
+ double e_ellm1 = fabs(x)*GSL_DBL_EPSILON;
+ double e_ell = e_ellm1;
+
+ int ell;
+
+ for(ell=2; ell <= l; ell++){
+ p_ell = (x*(2*ell-1)*p_ellm1 - (ell-1)*p_ellm2) / ell;
+ p_ellm2 = p_ellm1;
+ p_ellm1 = p_ell;
+
+ e_ell = 0.5*(fabs(x)*(2*ell-1.0) * e_ellm1 + (ell-1.0)*e_ellm2)/ell;
+ e_ellm2 = e_ellm1;
+ e_ellm1 = e_ell;
+ }
+
+ result->val = p_ell;
+ result->err = e_ell + l*fabs(p_ell)*GSL_DBL_EPSILON;
+ return GSL_SUCCESS;
+ }
+ else {
+ /* Asymptotic expansion.
+ * [Olver, p. 473]
+ */
+ double u = l + 0.5;
+ double th = acos(x);
+ gsl_sf_result J0;
+ gsl_sf_result Jm1;
+ int stat_J0 = gsl_sf_bessel_J0_e(u*th, &J0);
+ int stat_Jm1 = gsl_sf_bessel_Jn_e(-1, u*th, &Jm1);
+ double pre;
+ double B00;
+ double c1;
+
+ /* B00 = 1/8 (1 - th cot(th) / th^2
+ * pre = sqrt(th/sin(th))
+ */
+ if(th < GSL_ROOT4_DBL_EPSILON) {
+ B00 = (1.0 + th*th/15.0)/24.0;
+ pre = 1.0 + th*th/12.0;
+ }
+ else {
+ double sin_th = sqrt(1.0 - x*x);
+ double cot_th = x / sin_th;
+ B00 = 1.0/8.0 * (1.0 - th * cot_th) / (th*th);
+ pre = sqrt(th/sin_th);
+ }
+
+ c1 = th/u * B00;
+
+ result->val = pre * (J0.val + c1 * Jm1.val);
+ result->err = pre * (J0.err + fabs(c1) * Jm1.err);
+ result->err += GSL_SQRT_DBL_EPSILON * fabs(result->val);
+
+ return GSL_ERROR_SELECT_2(stat_J0, stat_Jm1);
+ }
+}
+
+
+int
+gsl_sf_legendre_Pl_array(const int lmax, const double x, double * result_array)
+{
+ /* CHECK_POINTER(result_array) */
+
+ if(lmax < 0 || x < -1.0 || x > 1.0) {
+ GSL_ERROR ("domain error", GSL_EDOM);
+ }
+ else if(lmax == 0) {
+ result_array[0] = 1.0;
+ return GSL_SUCCESS;
+ }
+ else if(lmax == 1) {
+ result_array[0] = 1.0;
+ result_array[1] = x;
+ return GSL_SUCCESS;
+ }
+ else {
+ /* upward recurrence: l P_l = (2l-1) z P_{l-1} - (l-1) P_{l-2} */
+
+ double p_ellm2 = 1.0; /* P_0(x) */
+ double p_ellm1 = x; /* P_1(x) */
+ double p_ell = p_ellm1;
+ int ell;
+
+ result_array[0] = 1.0;
+ result_array[1] = x;
+
+ for(ell=2; ell <= lmax; ell++){
+ p_ell = (x*(2*ell-1)*p_ellm1 - (ell-1)*p_ellm2) / ell;
+ p_ellm2 = p_ellm1;
+ p_ellm1 = p_ell;
+ result_array[ell] = p_ell;
+ }
+
+ return GSL_SUCCESS;
+ }
+}
+
+
+int
+gsl_sf_legendre_Pl_deriv_array(const int lmax, const double x, double * result_array, double * result_deriv_array)
+{
+ int stat_array = gsl_sf_legendre_Pl_array(lmax, x, result_array);
+
+ if(lmax >= 0) result_deriv_array[0] = 0.0;
+ if(lmax >= 1) result_deriv_array[1] = 1.0;
+
+ if(stat_array == GSL_SUCCESS)
+ {
+ int ell;
+
+ if(fabs(x - 1.0)*(lmax+1.0)*(lmax+1.0) < GSL_SQRT_DBL_EPSILON)
+ {
+ /* x is near 1 */
+ for(ell = 2; ell <= lmax; ell++)
+ {
+ const double pre = 0.5 * ell * (ell+1.0);
+ result_deriv_array[ell] = pre * (1.0 - 0.25 * (1.0-x) * (ell+2.0)*(ell-1.0));
+ }
+ }
+ else if(fabs(x + 1.0)*(lmax+1.0)*(lmax+1.0) < GSL_SQRT_DBL_EPSILON)
+ {
+ /* x is near -1 */
+ for(ell = 2; ell <= lmax; ell++)
+ {
+ const double sgn = ( GSL_IS_ODD(ell) ? 1.0 : -1.0 ); /* derivative is odd in x for even ell */
+ const double pre = sgn * 0.5 * ell * (ell+1.0);
+ result_deriv_array[ell] = pre * (1.0 - 0.25 * (1.0+x) * (ell+2.0)*(ell-1.0));
+ }
+ }
+ else
+ {
+ const double diff_a = 1.0 + x;
+ const double diff_b = 1.0 - x;
+ for(ell = 2; ell <= lmax; ell++)
+ {
+ result_deriv_array[ell] = - ell * (x * result_array[ell] - result_array[ell-1]) / (diff_a * diff_b);
+ }
+ }
+
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ return stat_array;
+ }
+}
+
+
+int
+gsl_sf_legendre_Plm_e(const int l, const int m, const double x, gsl_sf_result * result)
+{
+ /* If l is large and m is large, then we have to worry
+ * about overflow. Calculate an approximate exponent which
+ * measures the normalization of this thing.
+ */
+ const double dif = l-m;
+ const double sum = l+m;
+ const double t_d = ( dif == 0.0 ? 0.0 : 0.5 * dif * (log(dif)-1.0) );
+ const double t_s = ( dif == 0.0 ? 0.0 : 0.5 * sum * (log(sum)-1.0) );
+ const double exp_check = 0.5 * log(2.0*l+1.0) + t_d - t_s;
+
+ /* CHECK_POINTER(result) */
+
+ if(m < 0 || l < m || x < -1.0 || x > 1.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(exp_check < GSL_LOG_DBL_MIN + 10.0){
+ /* Bail out. */
+ OVERFLOW_ERROR(result);
+ }
+ else {
+ /* Account for the error due to the
+ * representation of 1-x.
+ */
+ const double err_amp = 1.0 / (GSL_DBL_EPSILON + fabs(1.0-fabs(x)));
+
+ /* P_m^m(x) and P_{m+1}^m(x) */
+ double p_mm = legendre_Pmm(m, x);
+ double p_mmp1 = x * (2*m + 1) * p_mm;
+
+ if(l == m){
+ result->val = p_mm;
+ result->err = err_amp * 2.0 * GSL_DBL_EPSILON * fabs(p_mm);
+ return GSL_SUCCESS;
+ }
+ else if(l == m + 1) {
+ result->val = p_mmp1;
+ result->err = err_amp * 2.0 * GSL_DBL_EPSILON * fabs(p_mmp1);
+ return GSL_SUCCESS;
+ }
+ else{
+ /* upward recurrence: (l-m) P(l,m) = (2l-1) z P(l-1,m) - (l+m-1) P(l-2,m)
+ * start at P(m,m), P(m+1,m)
+ */
+
+ double p_ellm2 = p_mm;
+ double p_ellm1 = p_mmp1;
+ double p_ell = 0.0;
+ int ell;
+
+ for(ell=m+2; ell <= l; ell++){
+ p_ell = (x*(2*ell-1)*p_ellm1 - (ell+m-1)*p_ellm2) / (ell-m);
+ p_ellm2 = p_ellm1;
+ p_ellm1 = p_ell;
+ }
+
+ result->val = p_ell;
+ result->err = err_amp * (0.5*(l-m) + 1.0) * GSL_DBL_EPSILON * fabs(p_ell);
+
+ return GSL_SUCCESS;
+ }
+ }
+}
+
+
+int
+gsl_sf_legendre_Plm_array(const int lmax, const int m, const double x, double * result_array)
+{
+ /* If l is large and m is large, then we have to worry
+ * about overflow. Calculate an approximate exponent which
+ * measures the normalization of this thing.
+ */
+ const double dif = lmax-m;
+ const double sum = lmax+m;
+ const double t_d = ( dif == 0.0 ? 0.0 : 0.5 * dif * (log(dif)-1.0) );
+ const double t_s = ( dif == 0.0 ? 0.0 : 0.5 * sum * (log(sum)-1.0) );
+ const double exp_check = 0.5 * log(2.0*lmax+1.0) + t_d - t_s;
+
+ /* CHECK_POINTER(result_array) */
+
+ if(m < 0 || lmax < m || x < -1.0 || x > 1.0) {
+ GSL_ERROR ("domain error", GSL_EDOM);
+ }
+ else if(m > 0 && (x == 1.0 || x == -1.0)) {
+ int ell;
+ for(ell=m; ell<=lmax; ell++) result_array[ell-m] = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(exp_check < GSL_LOG_DBL_MIN + 10.0){
+ /* Bail out. */
+ GSL_ERROR ("overflow", GSL_EOVRFLW);
+ }
+ else {
+ double p_mm = legendre_Pmm(m, x);
+ double p_mmp1 = x * (2.0*m + 1.0) * p_mm;
+
+ if(lmax == m){
+ result_array[0] = p_mm;
+ return GSL_SUCCESS;
+ }
+ else if(lmax == m + 1) {
+ result_array[0] = p_mm;
+ result_array[1] = p_mmp1;
+ return GSL_SUCCESS;
+ }
+ else {
+ double p_ellm2 = p_mm;
+ double p_ellm1 = p_mmp1;
+ double p_ell = 0.0;
+ int ell;
+
+ result_array[0] = p_mm;
+ result_array[1] = p_mmp1;
+
+ for(ell=m+2; ell <= lmax; ell++){
+ p_ell = (x*(2.0*ell-1.0)*p_ellm1 - (ell+m-1)*p_ellm2) / (ell-m);
+ p_ellm2 = p_ellm1;
+ p_ellm1 = p_ell;
+ result_array[ell-m] = p_ell;
+ }
+
+ return GSL_SUCCESS;
+ }
+ }
+}
+
+
+int
+gsl_sf_legendre_Plm_deriv_array(
+ const int lmax, const int m, const double x,
+ double * result_array,
+ double * result_deriv_array)
+{
+ if(m < 0 || m > lmax)
+ {
+ GSL_ERROR("m < 0 or m > lmax", GSL_EDOM);
+ }
+ else if(m == 0)
+ {
+ /* It is better to do m=0 this way, so we can more easily
+ * trap the divergent case which can occur when m == 1.
+ */
+ return gsl_sf_legendre_Pl_deriv_array(lmax, x, result_array, result_deriv_array);
+ }
+ else
+ {
+ int stat_array = gsl_sf_legendre_Plm_array(lmax, m, x, result_array);
+
+ if(stat_array == GSL_SUCCESS)
+ {
+ int ell;
+
+ if(m == 1 && (1.0 - fabs(x) < GSL_DBL_EPSILON))
+ {
+ /* This divergence is real and comes from the cusp-like
+ * behaviour for m = 1. For example, P[1,1] = - Sqrt[1-x^2].
+ */
+ GSL_ERROR("divergence near |x| = 1.0 since m = 1", GSL_EOVRFLW);
+ }
+ else if(m == 2 && (1.0 - fabs(x) < GSL_DBL_EPSILON))
+ {
+ /* m = 2 gives a finite nonzero result for |x| near 1 */
+ if(fabs(x - 1.0) < GSL_DBL_EPSILON)
+ {
+ for(ell = m; ell <= lmax; ell++) result_deriv_array[ell-m] = -0.25 * x * (ell - 1.0)*ell*(ell+1.0)*(ell+2.0);
+ }
+ else if(fabs(x + 1.0) < GSL_DBL_EPSILON)
+ {
+ for(ell = m; ell <= lmax; ell++)
+ {
+ const double sgn = ( GSL_IS_ODD(ell) ? 1.0 : -1.0 );
+ result_deriv_array[ell-m] = -0.25 * sgn * x * (ell - 1.0)*ell*(ell+1.0)*(ell+2.0);
+ }
+ }
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ /* m > 2 is easier to deal with since the endpoints always vanish */
+ if(1.0 - fabs(x) < GSL_DBL_EPSILON)
+ {
+ for(ell = m; ell <= lmax; ell++) result_deriv_array[ell-m] = 0.0;
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ const double diff_a = 1.0 + x;
+ const double diff_b = 1.0 - x;
+ result_deriv_array[0] = - m * x / (diff_a * diff_b) * result_array[0];
+ if(lmax-m >= 1) result_deriv_array[1] = (2.0 * m + 1.0) * (x * result_deriv_array[0] + result_array[0]);
+ for(ell = m+2; ell <= lmax; ell++)
+ {
+ result_deriv_array[ell-m] = - (ell * x * result_array[ell-m] - (ell+m) * result_array[ell-1-m]) / (diff_a * diff_b);
+ }
+ return GSL_SUCCESS;
+ }
+ }
+ }
+ else
+ {
+ return stat_array;
+ }
+ }
+}
+
+
+int
+gsl_sf_legendre_sphPlm_e(const int l, int m, const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(m < 0 || l < m || x < -1.0 || x > 1.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(m == 0) {
+ gsl_sf_result P;
+ int stat_P = gsl_sf_legendre_Pl_e(l, x, &P);
+ double pre = sqrt((2.0*l + 1.0)/(4.0*M_PI));
+ result->val = pre * P.val;
+ result->err = pre * P.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return stat_P;
+ }
+ else if(x == 1.0 || x == -1.0) {
+ /* m > 0 here */
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else {
+ /* m > 0 and |x| < 1 here */
+
+ /* Starting value for recursion.
+ * Y_m^m(x) = sqrt( (2m+1)/(4pi m) gamma(m+1/2)/gamma(m) ) (-1)^m (1-x^2)^(m/2) / pi^(1/4)
+ */
+ gsl_sf_result lncirc;
+ gsl_sf_result lnpoch;
+ double lnpre_val;
+ double lnpre_err;
+ gsl_sf_result ex_pre;
+ double sr;
+ const double sgn = ( GSL_IS_ODD(m) ? -1.0 : 1.0);
+ const double y_mmp1_factor = x * sqrt(2.0*m + 3.0);
+ double y_mm, y_mm_err;
+ double y_mmp1, y_mmp1_err;
+ gsl_sf_log_1plusx_e(-x*x, &lncirc);
+ gsl_sf_lnpoch_e(m, 0.5, &lnpoch); /* Gamma(m+1/2)/Gamma(m) */
+ lnpre_val = -0.25*M_LNPI + 0.5 * (lnpoch.val + m*lncirc.val);
+ lnpre_err = 0.25*M_LNPI*GSL_DBL_EPSILON + 0.5 * (lnpoch.err + fabs(m)*lncirc.err);
+ /* Compute exp(ln_pre) with error term, avoiding call to gsl_sf_exp_err BJG */
+ ex_pre.val = exp(lnpre_val);
+ ex_pre.err = 2.0*(sinh(lnpre_err) + GSL_DBL_EPSILON)*ex_pre.val;
+ sr = sqrt((2.0+1.0/m)/(4.0*M_PI));
+ y_mm = sgn * sr * ex_pre.val;
+ y_mm_err = 2.0 * GSL_DBL_EPSILON * fabs(y_mm) + sr * ex_pre.err;
+ y_mm_err *= 1.0 + 1.0/(GSL_DBL_EPSILON + fabs(1.0-x));
+ y_mmp1 = y_mmp1_factor * y_mm;
+ y_mmp1_err=fabs(y_mmp1_factor) * y_mm_err;
+
+ if(l == m){
+ result->val = y_mm;
+ result->err = y_mm_err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(y_mm);
+ return GSL_SUCCESS;
+ }
+ else if(l == m + 1) {
+ result->val = y_mmp1;
+ result->err = y_mmp1_err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(y_mmp1);
+ return GSL_SUCCESS;
+ }
+ else{
+ double y_ell = 0.0;
+ double y_ell_err;
+ int ell;
+
+ /* Compute Y_l^m, l > m+1, upward recursion on l. */
+ for(ell=m+2; ell <= l; ell++){
+ const double rat1 = (double)(ell-m)/(double)(ell+m);
+ const double rat2 = (ell-m-1.0)/(ell+m-1.0);
+ const double factor1 = sqrt(rat1*(2.0*ell+1.0)*(2.0*ell-1.0));
+ const double factor2 = sqrt(rat1*rat2*(2.0*ell+1.0)/(2.0*ell-3.0));
+ y_ell = (x*y_mmp1*factor1 - (ell+m-1.0)*y_mm*factor2) / (ell-m);
+ y_mm = y_mmp1;
+ y_mmp1 = y_ell;
+
+ y_ell_err = 0.5*(fabs(x*factor1)*y_mmp1_err + fabs((ell+m-1.0)*factor2)*y_mm_err) / fabs(ell-m);
+ y_mm_err = y_mmp1_err;
+ y_mmp1_err = y_ell_err;
+ }
+
+ result->val = y_ell;
+ result->err = y_ell_err + (0.5*(l-m) + 1.0) * GSL_DBL_EPSILON * fabs(y_ell);
+
+ return GSL_SUCCESS;
+ }
+ }
+}
+
+
+int
+gsl_sf_legendre_sphPlm_array(const int lmax, int m, const double x, double * result_array)
+{
+ /* CHECK_POINTER(result_array) */
+
+ if(m < 0 || lmax < m || x < -1.0 || x > 1.0) {
+ GSL_ERROR ("error", GSL_EDOM);
+ }
+ else if(m > 0 && (x == 1.0 || x == -1.0)) {
+ int ell;
+ for(ell=m; ell<=lmax; ell++) result_array[ell-m] = 0.0;
+ return GSL_SUCCESS;
+ }
+ else {
+ double y_mm;
+ double y_mmp1;
+
+ if(m == 0) {
+ y_mm = 0.5/M_SQRTPI; /* Y00 = 1/sqrt(4pi) */
+ y_mmp1 = x * M_SQRT3 * y_mm;
+ }
+ else {
+ /* |x| < 1 here */
+
+ gsl_sf_result lncirc;
+ gsl_sf_result lnpoch;
+ double lnpre;
+ const double sgn = ( GSL_IS_ODD(m) ? -1.0 : 1.0);
+ gsl_sf_log_1plusx_e(-x*x, &lncirc);
+ gsl_sf_lnpoch_e(m, 0.5, &lnpoch); /* Gamma(m+1/2)/Gamma(m) */
+ lnpre = -0.25*M_LNPI + 0.5 * (lnpoch.val + m*lncirc.val);
+ y_mm = sqrt((2.0+1.0/m)/(4.0*M_PI)) * sgn * exp(lnpre);
+ y_mmp1 = x * sqrt(2.0*m + 3.0) * y_mm;
+ }
+
+ if(lmax == m){
+ result_array[0] = y_mm;
+ return GSL_SUCCESS;
+ }
+ else if(lmax == m + 1) {
+ result_array[0] = y_mm;
+ result_array[1] = y_mmp1;
+ return GSL_SUCCESS;
+ }
+ else{
+ double y_ell;
+ int ell;
+
+ result_array[0] = y_mm;
+ result_array[1] = y_mmp1;
+
+ /* Compute Y_l^m, l > m+1, upward recursion on l. */
+ for(ell=m+2; ell <= lmax; ell++){
+ const double rat1 = (double)(ell-m)/(double)(ell+m);
+ const double rat2 = (ell-m-1.0)/(ell+m-1.0);
+ const double factor1 = sqrt(rat1*(2*ell+1)*(2*ell-1));
+ const double factor2 = sqrt(rat1*rat2*(2*ell+1)/(2*ell-3));
+ y_ell = (x*y_mmp1*factor1 - (ell+m-1)*y_mm*factor2) / (ell-m);
+ y_mm = y_mmp1;
+ y_mmp1 = y_ell;
+ result_array[ell-m] = y_ell;
+ }
+ }
+
+ return GSL_SUCCESS;
+ }
+}
+
+
+int
+gsl_sf_legendre_sphPlm_deriv_array(
+ const int lmax, const int m, const double x,
+ double * result_array,
+ double * result_deriv_array)
+{
+ if(m < 0 || lmax < m || x < -1.0 || x > 1.0)
+ {
+ GSL_ERROR ("domain", GSL_EDOM);
+ }
+ else if(m == 0)
+ {
+ /* m = 0 is easy to trap */
+ const int stat_array = gsl_sf_legendre_Pl_deriv_array(lmax, x, result_array, result_deriv_array);
+ int ell;
+ for(ell = 0; ell <= lmax; ell++)
+ {
+ const double prefactor = sqrt((2.0 * ell + 1.0)/(4.0*M_PI));
+ result_array[ell] *= prefactor;
+ result_deriv_array[ell] *= prefactor;
+ }
+ return stat_array;
+ }
+ else if(m == 1)
+ {
+ /* Trapping m = 1 is necessary because of the possible divergence.
+ * Recall that this divergence is handled properly in ..._Plm_deriv_array(),
+ * and the scaling factor is not large for small m, so we just scale.
+ */
+ const int stat_array = gsl_sf_legendre_Plm_deriv_array(lmax, m, x, result_array, result_deriv_array);
+ int ell;
+ for(ell = 1; ell <= lmax; ell++)
+ {
+ const double prefactor = sqrt((2.0 * ell + 1.0)/(ell + 1.0) / (4.0*M_PI*ell));
+ result_array[ell-1] *= prefactor;
+ result_deriv_array[ell-1] *= prefactor;
+ }
+ return stat_array;
+ }
+ else
+ {
+ /* as for the derivative of P_lm, everything is regular for m >= 2 */
+
+ int stat_array = gsl_sf_legendre_sphPlm_array(lmax, m, x, result_array);
+
+ if(stat_array == GSL_SUCCESS)
+ {
+ int ell;
+
+ if(1.0 - fabs(x) < GSL_DBL_EPSILON)
+ {
+ for(ell = m; ell <= lmax; ell++) result_deriv_array[ell-m] = 0.0;
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ const double diff_a = 1.0 + x;
+ const double diff_b = 1.0 - x;
+ result_deriv_array[0] = - m * x / (diff_a * diff_b) * result_array[0];
+ if(lmax-m >= 1) result_deriv_array[1] = sqrt(2.0 * m + 3.0) * (x * result_deriv_array[0] + result_array[0]);
+ for(ell = m+2; ell <= lmax; ell++)
+ {
+ const double c1 = sqrt(((2.0*ell+1.0)/(2.0*ell-1.0)) * ((double)(ell-m)/(double)(ell+m)));
+ result_deriv_array[ell-m] = - (ell * x * result_array[ell-m] - c1 * (ell+m) * result_array[ell-1-m]) / (diff_a * diff_b);
+ }
+ return GSL_SUCCESS;
+ }
+ }
+ else
+ {
+ return stat_array;
+ }
+ }
+}
+
+
+#ifndef HIDE_INLINE_STATIC
+int
+gsl_sf_legendre_array_size(const int lmax, const int m)
+{
+ return lmax-m+1;
+}
+#endif
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_legendre_P1(const double x)
+{
+ EVAL_RESULT(gsl_sf_legendre_P1_e(x, &result));
+}
+
+double gsl_sf_legendre_P2(const double x)
+{
+ EVAL_RESULT(gsl_sf_legendre_P2_e(x, &result));
+}
+
+double gsl_sf_legendre_P3(const double x)
+{
+ EVAL_RESULT(gsl_sf_legendre_P3_e(x, &result));
+}
+
+double gsl_sf_legendre_Pl(const int l, const double x)
+{
+ EVAL_RESULT(gsl_sf_legendre_Pl_e(l, x, &result));
+}
+
+double gsl_sf_legendre_Plm(const int l, const int m, const double x)
+{
+ EVAL_RESULT(gsl_sf_legendre_Plm_e(l, m, x, &result));
+}
+
+double gsl_sf_legendre_sphPlm(const int l, const int m, const double x)
+{
+ EVAL_RESULT(gsl_sf_legendre_sphPlm_e(l, m, x, &result));
+}
+
diff --git a/gsl-1.9/specfunc/log.c b/gsl-1.9/specfunc/log.c
new file mode 100644
index 0000000..0d400e5
--- /dev/null
+++ b/gsl-1.9/specfunc/log.c
@@ -0,0 +1,266 @@
+/* specfunc/log.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_log.h>
+
+#include "error.h"
+
+#include "chebyshev.h"
+#include "cheb_eval.c"
+
+/*-*-*-*-*-*-*-*-*-*-*-* Private Section *-*-*-*-*-*-*-*-*-*-*-*/
+
+/* Chebyshev expansion for log(1 + x(t))/x(t)
+ *
+ * x(t) = (4t-1)/(2(4-t))
+ * t(x) = (8x+1)/(2(x+2))
+ * -1/2 < x < 1/2
+ * -1 < t < 1
+ */
+static double lopx_data[21] = {
+ 2.16647910664395270521272590407,
+ -0.28565398551049742084877469679,
+ 0.01517767255690553732382488171,
+ -0.00200215904941415466274422081,
+ 0.00019211375164056698287947962,
+ -0.00002553258886105542567601400,
+ 2.9004512660400621301999384544e-06,
+ -3.8873813517057343800270917900e-07,
+ 4.7743678729400456026672697926e-08,
+ -6.4501969776090319441714445454e-09,
+ 8.2751976628812389601561347296e-10,
+ -1.1260499376492049411710290413e-10,
+ 1.4844576692270934446023686322e-11,
+ -2.0328515972462118942821556033e-12,
+ 2.7291231220549214896095654769e-13,
+ -3.7581977830387938294437434651e-14,
+ 5.1107345870861673561462339876e-15,
+ -7.0722150011433276578323272272e-16,
+ 9.7089758328248469219003866867e-17,
+ -1.3492637457521938883731579510e-17,
+ 1.8657327910677296608121390705e-18
+};
+static cheb_series lopx_cs = {
+ lopx_data,
+ 20,
+ -1, 1,
+ 10
+};
+
+/* Chebyshev expansion for (log(1 + x(t)) - x(t))/x(t)^2
+ *
+ * x(t) = (4t-1)/(2(4-t))
+ * t(x) = (8x+1)/(2(x+2))
+ * -1/2 < x < 1/2
+ * -1 < t < 1
+ */
+static double lopxmx_data[20] = {
+ -1.12100231323744103373737274541,
+ 0.19553462773379386241549597019,
+ -0.01467470453808083971825344956,
+ 0.00166678250474365477643629067,
+ -0.00018543356147700369785746902,
+ 0.00002280154021771635036301071,
+ -2.8031253116633521699214134172e-06,
+ 3.5936568872522162983669541401e-07,
+ -4.6241857041062060284381167925e-08,
+ 6.0822637459403991012451054971e-09,
+ -8.0339824424815790302621320732e-10,
+ 1.0751718277499375044851551587e-10,
+ -1.4445310914224613448759230882e-11,
+ 1.9573912180610336168921438426e-12,
+ -2.6614436796793061741564104510e-13,
+ 3.6402634315269586532158344584e-14,
+ -4.9937495922755006545809120531e-15,
+ 6.8802890218846809524646902703e-16,
+ -9.5034129794804273611403251480e-17,
+ 1.3170135013050997157326965813e-17
+};
+static cheb_series lopxmx_cs = {
+ lopxmx_data,
+ 19,
+ -1, 1,
+ 9
+};
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int
+gsl_sf_log_e(const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x <= 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else {
+ result->val = log(x);
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+}
+
+
+int
+gsl_sf_log_abs_e(const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x == 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else {
+ result->val = log(fabs(x));
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+}
+
+int
+gsl_sf_complex_log_e(const double zr, const double zi, gsl_sf_result * lnr, gsl_sf_result * theta)
+{
+ /* CHECK_POINTER(lnr) */
+ /* CHECK_POINTER(theta) */
+
+ if(zr != 0.0 || zi != 0.0) {
+ const double ax = fabs(zr);
+ const double ay = fabs(zi);
+ const double min = GSL_MIN(ax, ay);
+ const double max = GSL_MAX(ax, ay);
+ lnr->val = log(max) + 0.5 * log(1.0 + (min/max)*(min/max));
+ lnr->err = 2.0 * GSL_DBL_EPSILON * fabs(lnr->val);
+ theta->val = atan2(zi, zr);
+ theta->err = GSL_DBL_EPSILON * fabs(lnr->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ DOMAIN_ERROR_2(lnr, theta);
+ }
+}
+
+
+int
+gsl_sf_log_1plusx_e(const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x <= -1.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(fabs(x) < GSL_ROOT6_DBL_EPSILON) {
+ const double c1 = -0.5;
+ const double c2 = 1.0/3.0;
+ const double c3 = -1.0/4.0;
+ const double c4 = 1.0/5.0;
+ const double c5 = -1.0/6.0;
+ const double c6 = 1.0/7.0;
+ const double c7 = -1.0/8.0;
+ const double c8 = 1.0/9.0;
+ const double c9 = -1.0/10.0;
+ const double t = c5 + x*(c6 + x*(c7 + x*(c8 + x*c9)));
+ result->val = x * (1.0 + x*(c1 + x*(c2 + x*(c3 + x*(c4 + x*t)))));
+ result->err = GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(fabs(x) < 0.5) {
+ double t = 0.5*(8.0*x + 1.0)/(x+2.0);
+ gsl_sf_result c;
+ cheb_eval_e(&lopx_cs, t, &c);
+ result->val = x * c.val;
+ result->err = fabs(x * c.err);
+ return GSL_SUCCESS;
+ }
+ else {
+ result->val = log(1.0 + x);
+ result->err = GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+}
+
+
+int
+gsl_sf_log_1plusx_mx_e(const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x <= -1.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(fabs(x) < GSL_ROOT5_DBL_EPSILON) {
+ const double c1 = -0.5;
+ const double c2 = 1.0/3.0;
+ const double c3 = -1.0/4.0;
+ const double c4 = 1.0/5.0;
+ const double c5 = -1.0/6.0;
+ const double c6 = 1.0/7.0;
+ const double c7 = -1.0/8.0;
+ const double c8 = 1.0/9.0;
+ const double c9 = -1.0/10.0;
+ const double t = c5 + x*(c6 + x*(c7 + x*(c8 + x*c9)));
+ result->val = x*x * (c1 + x*(c2 + x*(c3 + x*(c4 + x*t))));
+ result->err = GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(fabs(x) < 0.5) {
+ double t = 0.5*(8.0*x + 1.0)/(x+2.0);
+ gsl_sf_result c;
+ cheb_eval_e(&lopxmx_cs, t, &c);
+ result->val = x*x * c.val;
+ result->err = x*x * c.err;
+ return GSL_SUCCESS;
+ }
+ else {
+ const double lterm = log(1.0 + x);
+ result->val = lterm - x;
+ result->err = GSL_DBL_EPSILON * (fabs(lterm) + fabs(x));
+ return GSL_SUCCESS;
+ }
+}
+
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_log(const double x)
+{
+ EVAL_RESULT(gsl_sf_log_e(x, &result));
+}
+
+double gsl_sf_log_abs(const double x)
+{
+ EVAL_RESULT(gsl_sf_log_abs_e(x, &result));
+}
+
+double gsl_sf_log_1plusx(const double x)
+{
+ EVAL_RESULT(gsl_sf_log_1plusx_e(x, &result));
+}
+
+double gsl_sf_log_1plusx_mx(const double x)
+{
+ EVAL_RESULT(gsl_sf_log_1plusx_mx_e(x, &result));
+}
diff --git a/gsl-1.9/specfunc/mathieu_angfunc.c b/gsl-1.9/specfunc/mathieu_angfunc.c
new file mode 100644
index 0000000..e572c22
--- /dev/null
+++ b/gsl-1.9/specfunc/mathieu_angfunc.c
@@ -0,0 +1,343 @@
+/* specfunc/mathieu_angfunc.c
+ *
+ * Copyright (C) 2002 Lowell Johnson
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/* Author: L. Johnson */
+
+#include <config.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_sf_mathieu.h>
+
+
+int gsl_sf_mathieu_ce(int order, double qq, double zz, gsl_sf_result *result)
+{
+ int even_odd, ii, status;
+ double coeff[GSL_SF_MATHIEU_COEFF], norm, fn, factor;
+ gsl_sf_result aa;
+
+
+ norm = 0.0;
+ even_odd = 0;
+ if (order % 2 != 0)
+ even_odd = 1;
+
+ /* Handle the trivial case where q = 0. */
+ if (qq == 0.0)
+ {
+ norm = 1.0;
+ if (order == 0)
+ norm = sqrt(2.0);
+
+ fn = cos(order*zz)/norm;
+
+ result->val = fn;
+ result->err = 2.0*GSL_DBL_EPSILON;
+ factor = fabs(fn);
+ if (factor > 1.0)
+ result->err *= factor;
+
+ return GSL_SUCCESS;
+ }
+
+ /* Use symmetry characteristics of the functions to handle cases with
+ negative order. */
+ if (order < 0)
+ order *= -1;
+
+ /* Compute the characteristic value. */
+ status = gsl_sf_mathieu_a(order, qq, &aa);
+ if (status != GSL_SUCCESS)
+ {
+ return status;
+ }
+
+ /* Compute the series coefficients. */
+ status = gsl_sf_mathieu_a_coeff(order, qq, aa.val, coeff);
+ if (status != GSL_SUCCESS)
+ {
+ return status;
+ }
+
+ if (even_odd == 0)
+ {
+ fn = 0.0;
+ norm = coeff[0]*coeff[0];
+ for (ii=0; ii<GSL_SF_MATHIEU_COEFF; ii++)
+ {
+ fn += coeff[ii]*cos(2.0*ii*zz);
+ norm += coeff[ii]*coeff[ii];
+ }
+ }
+ else
+ {
+ fn = 0.0;
+ for (ii=0; ii<GSL_SF_MATHIEU_COEFF; ii++)
+ {
+ fn += coeff[ii]*cos((2.0*ii + 1.0)*zz);
+ norm += coeff[ii]*coeff[ii];
+ }
+ }
+
+ norm = sqrt(norm);
+ fn /= norm;
+
+ result->val = fn;
+ result->err = 2.0*GSL_DBL_EPSILON;
+ factor = fabs(fn);
+ if (factor > 1.0)
+ result->err *= factor;
+
+ return GSL_SUCCESS;
+}
+
+
+int gsl_sf_mathieu_se(int order, double qq, double zz, gsl_sf_result *result)
+{
+ int even_odd, ii, status;
+ double coeff[GSL_SF_MATHIEU_COEFF], norm, fn, factor;
+ gsl_sf_result aa;
+
+
+ norm = 0.0;
+ even_odd = 0;
+ if (order % 2 != 0)
+ even_odd = 1;
+
+ /* Handle the trivial cases where order = 0 and/or q = 0. */
+ if (order == 0)
+ {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+
+ if (qq == 0.0)
+ {
+ norm = 1.0;
+ fn = sin(order*zz);
+
+ result->val = fn;
+ result->err = 2.0*GSL_DBL_EPSILON;
+ factor = fabs(fn);
+ if (factor > 1.0)
+ result->err *= factor;
+
+ return GSL_SUCCESS;
+ }
+
+ /* Use symmetry characteristics of the functions to handle cases with
+ negative order. */
+ if (order < 0)
+ order *= -1;
+
+ /* Compute the characteristic value. */
+ status = gsl_sf_mathieu_b(order, qq, &aa);
+ if (status != GSL_SUCCESS)
+ {
+ return status;
+ }
+
+ /* Compute the series coefficients. */
+ status = gsl_sf_mathieu_b_coeff(order, qq, aa.val, coeff);
+ if (status != GSL_SUCCESS)
+ {
+ return status;
+ }
+
+ if (even_odd == 0)
+ {
+ fn = 0.0;
+ for (ii=0; ii<GSL_SF_MATHIEU_COEFF; ii++)
+ {
+ norm += coeff[ii]*coeff[ii];
+ fn += coeff[ii]*sin(2.0*(ii + 1)*zz);
+ }
+ }
+ else
+ {
+ fn = 0.0;
+ for (ii=0; ii<GSL_SF_MATHIEU_COEFF; ii++)
+ {
+ norm += coeff[ii]*coeff[ii];
+ fn += coeff[ii]*sin((2.0*ii + 1)*zz);
+ }
+ }
+ norm = sqrt(norm);
+ fn /= norm;
+
+ result->val = fn;
+ result->err = 2.0*GSL_DBL_EPSILON;
+ factor = fabs(fn);
+ if (factor > 1.0)
+ result->err *= factor;
+
+ return GSL_SUCCESS;
+}
+
+
+int gsl_sf_mathieu_ce_array(int nmin, int nmax, double qq, double zz,
+ gsl_sf_mathieu_workspace *work,
+ double result_array[])
+{
+ int even_odd, order, ii, jj, status;
+ double coeff[GSL_SF_MATHIEU_COEFF], *aa = work->aa, norm;
+
+
+ /* Initialize the result array to zeroes. */
+ for (ii=0; ii<nmax-nmin+1; ii++)
+ result_array[ii] = 0.0;
+
+ /* Ensure that the workspace is large enough to accomodate. */
+ if (work->size < (unsigned int)nmax)
+ {
+ GSL_ERROR("Work space not large enough", GSL_EINVAL);
+ }
+
+ if (nmin < 0 || nmax < nmin)
+ {
+ GSL_ERROR("domain error", GSL_EDOM);
+ }
+
+ /* Compute all of the eigenvalues up to nmax. */
+ gsl_sf_mathieu_a_array(0, nmax, qq, work, aa);
+
+ for (ii=0, order=nmin; order<=nmax; ii++, order++)
+ {
+ norm = 0.0;
+ even_odd = 0;
+ if (order % 2 != 0)
+ even_odd = 1;
+
+ /* Handle the trivial case where q = 0. */
+ if (qq == 0.0)
+ {
+ norm = 1.0;
+ if (order == 0)
+ norm = sqrt(2.0);
+
+ result_array[ii] = cos(order*zz)/norm;
+
+ continue;
+ }
+
+ /* Compute the series coefficients. */
+ status = gsl_sf_mathieu_a_coeff(order, qq, aa[order], coeff);
+ if (status != GSL_SUCCESS)
+ return status;
+
+ if (even_odd == 0)
+ {
+ norm = coeff[0]*coeff[0];
+ for (jj=0; jj<GSL_SF_MATHIEU_COEFF; jj++)
+ {
+ result_array[ii] += coeff[jj]*cos(2.0*jj*zz);
+ norm += coeff[jj]*coeff[jj];
+ }
+ }
+ else
+ {
+ for (jj=0; jj<GSL_SF_MATHIEU_COEFF; jj++)
+ {
+ result_array[ii] += coeff[jj]*cos((2.0*jj + 1.0)*zz);
+ norm += coeff[jj]*coeff[jj];
+ }
+ }
+
+ norm = sqrt(norm);
+ result_array[ii] /= norm;
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+int gsl_sf_mathieu_se_array(int nmin, int nmax, double qq, double zz,
+ gsl_sf_mathieu_workspace *work,
+ double result_array[])
+{
+ int even_odd, order, ii, jj, status;
+ double coeff[GSL_SF_MATHIEU_COEFF], *bb = work->bb, norm;
+
+
+ /* Initialize the result array to zeroes. */
+ for (ii=0; ii<nmax-nmin+1; ii++)
+ result_array[ii] = 0.0;
+
+ /* Ensure that the workspace is large enough to accomodate. */
+ if (work->size < (unsigned int)nmax)
+ {
+ GSL_ERROR("Work space not large enough", GSL_EINVAL);
+ }
+
+ if (nmin < 0 || nmax < nmin)
+ {
+ GSL_ERROR("domain error", GSL_EDOM);
+ }
+
+ /* Compute all of the eigenvalues up to nmax. */
+ gsl_sf_mathieu_b_array(0, nmax, qq, work, bb);
+
+ for (ii=0, order=nmin; order<=nmax; ii++, order++)
+ {
+ norm = 0.0;
+ even_odd = 0;
+ if (order % 2 != 0)
+ even_odd = 1;
+
+ /* Handle the trivial case where q = 0. */
+ if (qq == 0.0)
+ {
+ norm = 1.0;
+ result_array[ii] = sin(order*zz);
+
+ continue;
+ }
+
+ /* Compute the series coefficients. */
+ status = gsl_sf_mathieu_b_coeff(order, qq, bb[order], coeff);
+ if (status != GSL_SUCCESS)
+ {
+ return status;
+ }
+
+ if (even_odd == 0)
+ {
+ for (jj=0; jj<GSL_SF_MATHIEU_COEFF; jj++)
+ {
+ result_array[ii] += coeff[jj]*sin(2.0*(jj + 1)*zz);
+ norm += coeff[jj]*coeff[jj];
+ }
+ }
+ else
+ {
+ for (jj=0; jj<GSL_SF_MATHIEU_COEFF; jj++)
+ {
+ result_array[ii] += coeff[jj]*sin((2.0*jj + 1.0)*zz);
+ norm += coeff[jj]*coeff[jj];
+ }
+ }
+
+ norm = sqrt(norm);
+ result_array[ii] /= norm;
+ }
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/specfunc/mathieu_charv.c b/gsl-1.9/specfunc/mathieu_charv.c
new file mode 100644
index 0000000..bf28413
--- /dev/null
+++ b/gsl-1.9/specfunc/mathieu_charv.c
@@ -0,0 +1,849 @@
+/* specfunc/mathieu_charv.c
+ *
+ * Copyright (C) 2002 Lowell Johnson
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/* Author: L. Johnson */
+
+#include <config.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_eigen.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_mathieu.h>
+
+
+/* prototypes */
+static double solve_cubic(double c2, double c1, double c0);
+
+
+static double ceer(int order, double qq, double aa, int nterms)
+{
+
+ double term, term1;
+ int ii, n1;
+
+
+ if (order == 0)
+ term = 0.0;
+ else
+ {
+ term = 2.0*qq*qq/aa;
+
+ if (order != 2)
+ {
+ n1 = order/2 - 1;
+
+ for (ii=0; ii<n1; ii++)
+ term = qq*qq/(aa - 4.0*(ii+1)*(ii+1) - term);
+ }
+ }
+
+ term += order*order;
+
+ term1 = 0.0;
+
+ for (ii=0; ii<nterms; ii++)
+ term1 = qq*qq/
+ (aa - (order + 2.0*(nterms - ii))*(order + 2.0*(nterms - ii)) - term1);
+
+ if (order == 0)
+ term1 *= 2.0;
+
+ return (term + term1 - aa);
+}
+
+
+static double ceor(int order, double qq, double aa, int nterms)
+{
+ double term, term1;
+ int ii, n1;
+
+ term = qq;
+ n1 = (int)((float)order/2.0 - 0.5);
+
+ for (ii=0; ii<n1; ii++)
+ term = qq*qq/(aa - (2.0*ii + 1.0)*(2.0*ii + 1.0) - term);
+ term += order*order;
+
+ term1 = 0.0;
+ for (ii=0; ii<nterms; ii++)
+ term1 = qq*qq/
+ (aa - (order + 2.0*(nterms - ii))*(order + 2.0*(nterms - ii)) - term1);
+
+ return (term + term1 - aa);
+}
+
+
+static double seer(int order, double qq, double aa, int nterms)
+{
+ double term, term1;
+ int ii, n1;
+
+ term = 0.0;
+ n1 = order/2 - 1;
+
+ for (ii=0; ii<n1; ii++)
+ term = qq*qq/(aa - 4.0*(ii + 1)*(ii + 1) - term);
+ term += order*order;
+
+ term1 = 0.0;
+ for (ii=0; ii<nterms; ii++)
+ term1 = qq*qq/
+ (aa - (order + 2.0*(nterms - ii))*(order + 2.0*(nterms - ii)) - term1);
+
+ return (term + term1 - aa);
+}
+
+
+static double seor(int order, double qq, double aa, int nterms)
+{
+ double term, term1;
+ int ii, n1;
+
+
+ term = -1.0*qq;
+ n1 = (int)((float)order/2.0 - 0.5);
+ for (ii=0; ii<n1; ii++)
+ term = qq*qq/(aa - (2.0*ii + 1.0)*(2.0*ii + 1.0) - term);
+ term += order*order;
+
+ term1 = 0.0;
+ for (ii=0; ii<nterms; ii++)
+ term1 = qq*qq/
+ (aa - (order + 2.0*(nterms - ii))*(order + 2.0*(nterms - ii)) - term1);
+
+ return (term + term1 - aa);
+}
+
+
+/*----------------------------------------------------------------------------
+ * Asymptotic and approximation routines for the characteristic value.
+ *
+ * Adapted from F.A. Alhargan's paper,
+ * "Algorithms for the Computation of All Mathieu Functions of Integer
+ * Orders," ACM Transactions on Mathematical Software, Vol. 26, No. 3,
+ * September 2000, pp. 390-407.
+ *--------------------------------------------------------------------------*/
+static double asymptotic(int order, double qq)
+{
+ double asymp;
+ double nn, n2, n4, n6;
+ double hh, ah, ah2, ah3, ah4, ah5;
+
+
+ /* Set up temporary variables to simplify the readability. */
+ nn = 2*order + 1;
+ n2 = nn*nn;
+ n4 = n2*n2;
+ n6 = n4*n2;
+
+ hh = 2*sqrt(qq);
+ ah = 16*hh;
+ ah2 = ah*ah;
+ ah3 = ah2*ah;
+ ah4 = ah3*ah;
+ ah5 = ah4*ah;
+
+ /* Equation 38, p. 397 of Alhargan's paper. */
+ asymp = -2*qq + nn*hh - 0.125*(n2 + 1);
+ asymp -= 0.25*nn*( n2 + 3)/ah;
+ asymp -= 0.25* ( 5*n4 + 34*n2 + 9)/ah2;
+ asymp -= 0.25*nn*( 33*n4 + 410*n2 + 405)/ah3;
+ asymp -= ( 63*n6 + 1260*n4 + 2943*n2 + 486)/ah4;
+ asymp -= nn*(527*n6 + 15617*n4 + 69001*n2 + 41607)/ah5;
+
+ return asymp;
+}
+
+
+/* Solve the cubic x^3 + c2*x^2 + c1*x + c0 = 0 */
+static double solve_cubic(double c2, double c1, double c0)
+{
+ double qq, rr, ww, ss, tt;
+
+
+ qq = (3*c1 - c2*c2)/9;
+ rr = (9*c2*c1 - 27*c0 - 2*c2*c2*c2)/54;
+ ww = qq*qq*qq + rr*rr;
+
+ if (ww >= 0)
+ {
+ double t1 = rr + sqrt(ww);
+ ss = fabs(t1)/t1*pow(fabs(t1), 1/3.);
+ t1 = rr - sqrt(ww);
+ tt = fabs(t1)/t1*pow(fabs(t1), 1/3.);
+ }
+ else
+ {
+ double theta = acos(rr/sqrt(-qq*qq*qq));
+ ss = 2*sqrt(-qq)*cos((theta + 4*M_PI)/3.);
+ tt = 0.0;
+ }
+
+ return (ss + tt - c2/3);
+}
+
+
+/* Compute an initial approximation for the characteristic value. */
+static double approx_c(int order, double qq)
+{
+ double approx;
+ double c0, c1, c2;
+
+
+ if (order < 0)
+ {
+ GSL_ERROR_VAL("Undefined order for Mathieu function", GSL_EINVAL, 0.0);
+ }
+
+ switch (order)
+ {
+ case 0:
+ if (qq <= 4)
+ return (2 - sqrt(4 + 2*qq*qq)); /* Eqn. 31 */
+ else
+ return asymptotic(order, qq);
+ break;
+
+ case 1:
+ if (qq <= 4)
+ return (5 + 0.5*(qq - sqrt(5*qq*qq - 16*qq + 64))); /* Eqn. 32 */
+ else
+ return asymptotic(order, qq);
+ break;
+
+ case 2:
+ if (qq <= 3)
+ {
+ c2 = -8.0; /* Eqn. 33 */
+ c1 = -48 - 3*qq*qq;
+ c0 = 20*qq*qq;
+ }
+ else
+ return asymptotic(order, qq);
+ break;
+
+ case 3:
+ if (qq <= 6.25)
+ {
+ c2 = -qq - 8; /* Eqn. 34 */
+ c1 = 16*qq - 128 - 2*qq*qq;
+ c0 = qq*qq*(qq + 8);
+ }
+ else
+ return asymptotic(order, qq);
+ break;
+
+ default:
+ if (order < 70)
+ {
+ if (1.7*order > 2*sqrt(qq))
+ {
+ /* Eqn. 30 */
+ double n2 = (double)(order*order);
+ double n22 = (double)((n2 - 1)*(n2 - 1));
+ double q2 = qq*qq;
+ double q4 = q2*q2;
+ approx = n2 + 0.5*q2/(n2 - 1);
+ approx += (5*n2 + 7)*q4/(32*n22*(n2 - 1)*(n2 - 4));
+ approx += (9*n2*n2 + 58*n2 + 29)*q4*q2/
+ (64*n22*n22*(n2 - 1)*(n2 - 4)*(n2 - 9));
+ if (1.4*order < 2*sqrt(qq))
+ {
+ approx += asymptotic(order, qq);
+ approx *= 0.5;
+ }
+ }
+ else
+ approx = asymptotic(order, qq);
+
+ return approx;
+ }
+ else
+ return order*order;
+ }
+
+ /* Solve the cubic x^3 + c2*x^2 + c1*x + c0 = 0 */
+ approx = solve_cubic(c2, c1, c0);
+
+ if ( approx < 0 && sqrt(qq) > 0.1*order )
+ return asymptotic(order-1, qq);
+ else
+ return (order*order + fabs(approx));
+}
+
+
+static double approx_s(int order, double qq)
+{
+ double approx;
+ double c0, c1, c2;
+
+
+ if (order < 1)
+ {
+ GSL_ERROR_VAL("Undefined order for Mathieu function", GSL_EINVAL, 0.0);
+ }
+
+ switch (order)
+ {
+ case 1:
+ if (qq <= 4)
+ return (5 - 0.5*(qq + sqrt(5*qq*qq + 16*qq + 64))); /* Eqn. 35 */
+ else
+ return asymptotic(order-1, qq);
+ break;
+
+ case 2:
+ if (qq <= 5)
+ return (10 - sqrt(36 + qq*qq)); /* Eqn. 36 */
+ else
+ return asymptotic(order-1, qq);
+ break;
+
+ case 3:
+ if (qq <= 6.25)
+ {
+ c2 = qq - 8; /* Eqn. 37 */
+ c1 = -128 - 16*qq - 2*qq*qq;
+ c0 = qq*qq*(8 - qq);
+ }
+ else
+ return asymptotic(order-1, qq);
+ break;
+
+ default:
+ if (order < 70)
+ {
+ if (1.7*order > 2*sqrt(qq))
+ {
+ /* Eqn. 30 */
+ double n2 = (double)(order*order);
+ double n22 = (double)((n2 - 1)*(n2 - 1));
+ double q2 = qq*qq;
+ double q4 = q2*q2;
+ approx = n2 + 0.5*q2/(n2 - 1);
+ approx += (5*n2 + 7)*q4/(32*n22*(n2 - 1)*(n2 - 4));
+ approx += (9*n2*n2 + 58*n2 + 29)*q4*q2/
+ (64*n22*n22*(n2 - 1)*(n2 - 4)*(n2 - 9));
+ if (1.4*order < 2*sqrt(qq))
+ {
+ approx += asymptotic(order-1, qq);
+ approx *= 0.5;
+ }
+ }
+ else
+ approx = asymptotic(order-1, qq);
+
+ return approx;
+ }
+ else
+ return order*order;
+ }
+
+ /* Solve the cubic x^3 + c2*x^2 + c1*x + c0 = 0 */
+ approx = solve_cubic(c2, c1, c0);
+
+ if ( approx < 0 && sqrt(qq) > 0.1*order )
+ return asymptotic(order-1, qq);
+ else
+ return (order*order + fabs(approx));
+}
+
+
+int gsl_sf_mathieu_a(int order, double qq, gsl_sf_result *result)
+{
+ int even_odd, nterms = 50, ii, counter = 0, maxcount = 200;
+ double a1, a2, fa, fa1, dela, aa_orig, da = 0.025, aa;
+
+
+ even_odd = 0;
+ if (order % 2 != 0)
+ even_odd = 1;
+
+ /* If the argument is 0, then the coefficient is simply the square of
+ the order. */
+ if (qq == 0)
+ {
+ result->val = order*order;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+
+ /* Use symmetry characteristics of the functions to handle cases with
+ negative order and/or argument q. See Abramowitz & Stegun, 20.8.3. */
+ if (order < 0)
+ order *= -1;
+ if (qq < 0.0)
+ {
+ if (even_odd == 0)
+ return gsl_sf_mathieu_a(order, -qq, result);
+ else
+ return gsl_sf_mathieu_b(order, -qq, result);
+ }
+
+ /* Compute an initial approximation for the characteristic value. */
+ aa = approx_c(order, qq);
+
+ /* Save the original approximation for later comparison. */
+ aa_orig = aa;
+
+ /* Loop as long as the final value is not near the approximate value
+ (with a max limit to avoid potential infinite loop). */
+ while (counter < maxcount)
+ {
+ a1 = aa + 0.001;
+ ii = 0;
+ if (even_odd == 0)
+ fa1 = ceer(order, qq, a1, nterms);
+ else
+ fa1 = ceor(order, qq, a1, nterms);
+
+ for (;;)
+ {
+ if (even_odd == 0)
+ fa = ceer(order, qq, aa, nterms);
+ else
+ fa = ceor(order, qq, aa, nterms);
+
+ a2 = a1;
+ a1 = aa;
+
+ if (fa == fa1)
+ {
+ result->err = GSL_DBL_EPSILON;
+ break;
+ }
+ aa -= (aa - a2)/(fa - fa1)*fa;
+ dela = fabs(aa - a2);
+ if (dela < GSL_DBL_EPSILON)
+ {
+ result->err = GSL_DBL_EPSILON;
+ break;
+ }
+ if (ii > 20)
+ {
+ result->err = dela;
+ break;
+ }
+ fa1 = fa;
+ ii++;
+ }
+
+ /* If the solution found is not near the original approximation,
+ tweak the approximate value, and try again. */
+ if (fabs(aa - aa_orig) > (3 + 0.01*order*fabs(aa_orig)))
+ {
+ counter++;
+ if (counter == maxcount)
+ {
+ result->err = fabs(aa - aa_orig);
+ break;
+ }
+ if (aa > aa_orig)
+ aa = aa_orig - da*counter;
+ else
+ aa = aa_orig + da*counter;
+
+ continue;
+ }
+ else
+ break;
+ }
+
+ result->val = aa;
+
+ /* If we went through the maximum number of retries and still didn't
+ find the solution, let us know. */
+ if (counter == maxcount)
+ {
+ GSL_ERROR("Wrong characteristic Mathieu value", GSL_EFAILED);
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+int gsl_sf_mathieu_b(int order, double qq, gsl_sf_result *result)
+{
+ int even_odd, nterms = 50, ii, counter = 0, maxcount = 200;
+ double a1, a2, fa, fa1, dela, aa_orig, da = 0.025, aa;
+
+
+ even_odd = 0;
+ if (order % 2 != 0)
+ even_odd = 1;
+
+ /* The order cannot be 0. */
+ if (order == 0)
+ {
+ GSL_ERROR("Characteristic value undefined for order 0", GSL_EFAILED);
+ }
+
+ /* If the argument is 0, then the coefficient is simply the square of
+ the order. */
+ if (qq == 0)
+ {
+ result->val = order*order;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+
+ /* Use symmetry characteristics of the functions to handle cases with
+ negative order and/or argument q. See Abramowitz & Stegun, 20.8.3. */
+ if (order < 0)
+ order *= -1;
+ if (qq < 0.0)
+ {
+ if (even_odd == 0)
+ return gsl_sf_mathieu_b(order, -qq, result);
+ else
+ return gsl_sf_mathieu_a(order, -qq, result);
+ }
+
+ /* Compute an initial approximation for the characteristic value. */
+ aa = approx_s(order, qq);
+
+ /* Save the original approximation for later comparison. */
+ aa_orig = aa;
+
+ /* Loop as long as the final value is not near the approximate value
+ (with a max limit to avoid potential infinite loop). */
+ while (counter < maxcount)
+ {
+ a1 = aa + 0.001;
+ ii = 0;
+ if (even_odd == 0)
+ fa1 = seer(order, qq, a1, nterms);
+ else
+ fa1 = seor(order, qq, a1, nterms);
+
+ for (;;)
+ {
+ if (even_odd == 0)
+ fa = seer(order, qq, aa, nterms);
+ else
+ fa = seor(order, qq, aa, nterms);
+
+ a2 = a1;
+ a1 = aa;
+
+ if (fa == fa1)
+ {
+ result->err = GSL_DBL_EPSILON;
+ break;
+ }
+ aa -= (aa - a2)/(fa - fa1)*fa;
+ dela = fabs(aa - a2);
+ if (dela < 1e-18)
+ {
+ result->err = GSL_DBL_EPSILON;
+ break;
+ }
+ if (ii > 20)
+ {
+ result->err = dela;
+ break;
+ }
+ fa1 = fa;
+ ii++;
+ }
+
+ /* If the solution found is not near the original approximation,
+ tweak the approximate value, and try again. */
+ if (fabs(aa - aa_orig) > (3 + 0.01*order*fabs(aa_orig)))
+ {
+ counter++;
+ if (counter == maxcount)
+ {
+ result->err = fabs(aa - aa_orig);
+ break;
+ }
+ if (aa > aa_orig)
+ aa = aa_orig - da*counter;
+ else
+ aa = aa_orig + da*counter;
+
+ continue;
+ }
+ else
+ break;
+ }
+
+ result->val = aa;
+
+ /* If we went through the maximum number of retries and still didn't
+ find the solution, let us know. */
+ if (counter == maxcount)
+ {
+ GSL_ERROR("Wrong characteristic Mathieu value", GSL_EFAILED);
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+/* Eigenvalue solutions for characteristic values below. */
+
+
+/* figi.c converted from EISPACK Fortran FIGI.F.
+ *
+ * given a nonsymmetric tridiagonal matrix such that the products
+ * of corresponding pairs of off-diagonal elements are all
+ * non-negative, this subroutine reduces it to a symmetric
+ * tridiagonal matrix with the same eigenvalues. if, further,
+ * a zero product only occurs when both factors are zero,
+ * the reduced matrix is similar to the original matrix.
+ *
+ * on input
+ *
+ * n is the order of the matrix.
+ *
+ * t contains the input matrix. its subdiagonal is
+ * stored in the last n-1 positions of the first column,
+ * its diagonal in the n positions of the second column,
+ * and its superdiagonal in the first n-1 positions of
+ * the third column. t(1,1) and t(n,3) are arbitrary.
+ *
+ * on output
+ *
+ * t is unaltered.
+ *
+ * d contains the diagonal elements of the symmetric matrix.
+ *
+ * e contains the subdiagonal elements of the symmetric
+ * matrix in its last n-1 positions. e(1) is not set.
+ *
+ * e2 contains the squares of the corresponding elements of e.
+ * e2 may coincide with e if the squares are not needed.
+ *
+ * ierr is set to
+ * zero for normal return,
+ * n+i if t(i,1)*t(i-1,3) is negative,
+ * -(3*n+i) if t(i,1)*t(i-1,3) is zero with one factor
+ * non-zero. in this case, the eigenvectors of
+ * the symmetric matrix are not simply related
+ * to those of t and should not be sought.
+ *
+ * questions and comments should be directed to burton s. garbow,
+ * mathematics and computer science div, argonne national laboratory
+ *
+ * this version dated august 1983.
+ */
+static int figi(int nn, double *tt, double *dd, double *ee,
+ double *e2)
+{
+ int ii;
+
+ for (ii=0; ii<nn; ii++)
+ {
+ if (ii != 0)
+ {
+ e2[ii] = tt[3*ii]*tt[3*(ii-1)+2];
+
+ if (e2[ii] < 0.0)
+ {
+ /* set error -- product of some pair of off-diagonal
+ elements is negative */
+ return (nn + ii);
+ }
+
+ if (e2[ii] == 0.0 && (tt[3*ii] != 0.0 || tt[3*(ii-1)+2] != 0.0))
+ {
+ /* set error -- product of some pair of off-diagonal
+ elements is zero with one member non-zero */
+ return (-1*(3*nn + ii));
+ }
+
+ ee[ii] = sqrt(e2[ii]);
+ }
+
+ dd[ii] = tt[3*ii+1];
+ }
+
+ return 0;
+}
+
+
+int gsl_sf_mathieu_a_array(int order_min, int order_max, double qq, gsl_sf_mathieu_workspace *work, double result_array[])
+{
+ unsigned int even_order = work->even_order, odd_order = work->odd_order,
+ extra_values = work->extra_values, ii, jj;
+ int status;
+ double *tt = work->tt, *dd = work->dd, *ee = work->ee, *e2 = work->e2,
+ *zz = work->zz, *aa = work->aa;
+ gsl_matrix_view mat, evec;
+ gsl_vector_view eval;
+ gsl_eigen_symmv_workspace *wmat = work->wmat;
+
+ if (order_max > work->size || order_max <= order_min || order_min < 0)
+ {
+ GSL_ERROR ("invalid range [order_min,order_max]", GSL_EINVAL);
+ }
+
+ /* Convert the nonsymmetric tridiagonal matrix to a symmetric tridiagonal
+ form. */
+
+ tt[0] = 0.0;
+ tt[1] = 0.0;
+ tt[2] = qq;
+ for (ii=1; ii<even_order-1; ii++)
+ {
+ tt[3*ii] = qq;
+ tt[3*ii+1] = 4*ii*ii;
+ tt[3*ii+2] = qq;
+ }
+ tt[3*even_order-3] = qq;
+ tt[3*even_order-2] = 4*(even_order - 1)*(even_order - 1);
+ tt[3*even_order-1] = 0.0;
+
+ tt[3] *= 2;
+
+ status = figi((signed int)even_order, tt, dd, ee, e2);
+
+ if (status)
+ {
+ GSL_ERROR("Internal error in tridiagonal Mathieu matrix", GSL_EFAILED);
+ }
+
+ /* Fill the period \pi matrix. */
+ for (ii=0; ii<even_order*even_order; ii++)
+ zz[ii] = 0.0;
+
+ zz[0] = dd[0];
+ zz[1] = ee[1];
+ for (ii=1; ii<even_order-1; ii++)
+ {
+ zz[ii*even_order+ii-1] = ee[ii];
+ zz[ii*even_order+ii] = dd[ii];
+ zz[ii*even_order+ii+1] = ee[ii+1];
+ }
+ zz[even_order*(even_order-1)+even_order-2] = ee[even_order-1];
+ zz[even_order*even_order-1] = dd[even_order-1];
+
+ /* Compute (and sort) the eigenvalues of the matrix. */
+ mat = gsl_matrix_view_array(zz, even_order, even_order);
+ eval = gsl_vector_subvector(work->eval, 0, even_order);
+ evec = gsl_matrix_submatrix(work->evec, 0, 0, even_order, even_order);
+ gsl_eigen_symmv(&mat.matrix, &eval.vector, &evec.matrix, wmat);
+ gsl_eigen_symmv_sort(&eval.vector, &evec.matrix, GSL_EIGEN_SORT_VAL_ASC);
+
+ for (ii=0; ii<even_order-extra_values; ii++)
+ aa[2*ii] = gsl_vector_get(&eval.vector, ii);
+
+ /* Fill the period 2\pi matrix. */
+ for (ii=0; ii<odd_order*odd_order; ii++)
+ zz[ii] = 0.0;
+ for (ii=0; ii<odd_order; ii++)
+ for (jj=0; jj<odd_order; jj++)
+ {
+ if (ii == jj)
+ zz[ii*odd_order+jj] = (2*ii + 1)*(2*ii + 1);
+ else if (ii == jj + 1 || ii + 1 == jj)
+ zz[ii*odd_order+jj] = qq;
+ }
+ zz[0] += qq;
+
+ /* Compute (and sort) the eigenvalues of the matrix. */
+ mat = gsl_matrix_view_array(zz, odd_order, odd_order);
+ eval = gsl_vector_subvector(work->eval, 0, odd_order);
+ evec = gsl_matrix_submatrix(work->evec, 0, 0, odd_order, odd_order);
+ gsl_eigen_symmv(&mat.matrix, &eval.vector, &evec.matrix, wmat);
+ gsl_eigen_symmv_sort(&eval.vector, &evec.matrix, GSL_EIGEN_SORT_VAL_ASC);
+
+ for (ii=0; ii<odd_order-extra_values; ii++)
+ aa[2*ii+1] = gsl_vector_get(&eval.vector, ii);
+
+ for (ii = order_min ; ii <= order_max ; ii++)
+ {
+ result_array[ii - order_min] = aa[ii];
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+int gsl_sf_mathieu_b_array(int order_min, int order_max, double qq, gsl_sf_mathieu_workspace *work, double result_array[])
+{
+ unsigned int even_order = work->even_order-1, odd_order = work->odd_order,
+ extra_values = work->extra_values, ii, jj;
+ double *zz = work->zz, *bb = work->bb;
+ gsl_matrix_view mat, evec;
+ gsl_vector_view eval;
+ gsl_eigen_symmv_workspace *wmat = work->wmat;
+
+ if (order_max > work->size || order_max <= order_min || order_min < 0)
+ {
+ GSL_ERROR ("invalid range [order_min,order_max]", GSL_EINVAL);
+ }
+
+ /* Fill the period \pi matrix. */
+ for (ii=0; ii<even_order*even_order; ii++)
+ zz[ii] = 0.0;
+ for (ii=0; ii<even_order; ii++)
+ for (jj=0; jj<even_order; jj++)
+ {
+ if (ii == jj)
+ zz[ii*even_order+jj] = 4*(ii + 1)*(ii + 1);
+ else if (ii == jj + 1 || ii + 1 == jj)
+ zz[ii*even_order+jj] = qq;
+ }
+
+ /* Compute (and sort) the eigenvalues of the matrix. */
+ mat = gsl_matrix_view_array(zz, even_order, even_order);
+ eval = gsl_vector_subvector(work->eval, 0, even_order);
+ evec = gsl_matrix_submatrix(work->evec, 0, 0, even_order, even_order);
+ gsl_eigen_symmv(&mat.matrix, &eval.vector, &evec.matrix, wmat);
+ gsl_eigen_symmv_sort(&eval.vector, &evec.matrix, GSL_EIGEN_SORT_VAL_ASC);
+
+ bb[0] = 0.0;
+ for (ii=0; ii<even_order-extra_values; ii++)
+ bb[2*(ii+1)] = gsl_vector_get(&eval.vector, ii);
+
+ /* Fill the period 2\pi matrix. */
+ for (ii=0; ii<odd_order*odd_order; ii++)
+ zz[ii] = 0.0;
+ for (ii=0; ii<odd_order; ii++)
+ for (jj=0; jj<odd_order; jj++)
+ {
+ if (ii == jj)
+ zz[ii*odd_order+jj] = (2*ii + 1)*(2*ii + 1);
+ else if (ii == jj + 1 || ii + 1 == jj)
+ zz[ii*odd_order+jj] = qq;
+ }
+
+ zz[0] -= qq;
+
+ /* Compute (and sort) the eigenvalues of the matrix. */
+ mat = gsl_matrix_view_array(zz, odd_order, odd_order);
+ eval = gsl_vector_subvector(work->eval, 0, odd_order);
+ evec = gsl_matrix_submatrix(work->evec, 0, 0, odd_order, odd_order);
+ gsl_eigen_symmv(&mat.matrix, &eval.vector, &evec.matrix, wmat);
+ gsl_eigen_symmv_sort(&eval.vector, &evec.matrix, GSL_EIGEN_SORT_VAL_ASC);
+
+ for (ii=0; ii<odd_order-extra_values; ii++)
+ bb[2*ii+1] = gsl_vector_get(&eval.vector, ii);
+
+ for (ii = order_min ; ii <= order_max ; ii++)
+ {
+ result_array[ii - order_min] = bb[ii];
+ }
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/specfunc/mathieu_coeff.c b/gsl-1.9/specfunc/mathieu_coeff.c
new file mode 100644
index 0000000..960b37e
--- /dev/null
+++ b/gsl-1.9/specfunc/mathieu_coeff.c
@@ -0,0 +1,348 @@
+/* specfunc/mathieu_coeff.c
+ *
+ * Copyright (C) 2002 Lowell Johnson
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/* Author: L. Johnson */
+
+#include <config.h>
+#include <stdlib.h>
+#include <math.h>
+#include <gsl/gsl_sf_mathieu.h>
+
+
+/*****************************************************************************
+ * backward_recurse
+ *
+ * Purpose:
+ ****************************************************************************/
+static void backward_recurse_c(double aa, double qq, double xx, double *ff,
+ double *gx, int even_odd, int ni)
+{
+ int ii, nn;
+ double g1;
+
+
+ g1 = *gx;
+ ff[ni] = xx;
+
+ if (even_odd == 0)
+ {
+ for (ii=0; ii<ni; ii++)
+ {
+ nn = GSL_SF_MATHIEU_COEFF - ii - 1;
+ ff[ni-ii-1] = -1.0/((4*nn*nn - aa)/qq + ff[ni-ii]);
+ }
+ if (ni == GSL_SF_MATHIEU_COEFF - 1)
+ ff[0] *= 2.0;
+ }
+ else
+ {
+ for (ii=0; ii<ni; ii++)
+ {
+ nn = GSL_SF_MATHIEU_COEFF - ii - 1;
+ ff[ni-ii-1] = -1.0/(((2*nn + 1)*(2*nn + 1) - aa)/qq + ff[ni-ii]);
+ }
+ }
+
+ *gx = ff[0] - g1;
+}
+
+
+static void backward_recurse_s(double aa, double qq, double xx, double *ff,
+ double *gx, int even_odd, int ni)
+{
+ int ii, nn;
+ double g1;
+
+
+ g1 = *gx;
+ ff[ni] = xx;
+
+ if (even_odd == 0)
+ {
+ for (ii=0; ii<ni; ii++)
+ {
+ nn = GSL_SF_MATHIEU_COEFF - ii - 1;
+ ff[ni-ii-1] = -1.0/((4*(nn + 1)*(nn + 1) - aa)/qq + ff[ni-ii]);
+ }
+ }
+ else
+ {
+ for (ii=0; ii<ni; ii++)
+ {
+ nn = GSL_SF_MATHIEU_COEFF - ii - 1;
+ ff[ni-ii-1] = -1.0/(((2*nn + 1)*(2*nn + 1) - aa)/qq + ff[ni-ii]);
+ }
+ }
+
+ *gx = ff[0] - g1;
+}
+
+
+int gsl_sf_mathieu_a_coeff(int order, double qq, double aa, double coeff[])
+{
+ int ni, nn, ii, even_odd;
+ double eps, g1, g2, x1, x2, e1, e2, de, xh, sum, ratio,
+ ff[GSL_SF_MATHIEU_COEFF];
+
+
+ eps = 1e-14;
+ coeff[0] = 1.0;
+
+ even_odd = 0;
+ if (order % 2 != 0)
+ even_odd = 1;
+
+ /* If the coefficient array is not large enough to hold all necessary
+ coefficients, error out. */
+ if (order > GSL_SF_MATHIEU_COEFF)
+ return GSL_FAILURE;
+
+ /* Handle the trivial case where q = 0. */
+ if (qq == 0.0)
+ {
+ for (ii=0; ii<GSL_SF_MATHIEU_COEFF; ii++)
+ coeff[ii] = 0.0;
+
+ coeff[order/2] = 1.0;
+
+ return GSL_SUCCESS;
+ }
+
+ if (order < 5)
+ {
+ nn = 0;
+ sum = 0.0;
+ if (even_odd == 0)
+ ratio = aa/qq;
+ else
+ ratio = (aa - 1 - qq)/qq;
+ }
+ else
+ {
+ if (even_odd == 0)
+ {
+ coeff[1] = aa/qq;
+ coeff[2] = (aa - 4)/qq*coeff[1] - 2;
+ sum = coeff[0] + coeff[1] + coeff[2];
+ for (ii=3; ii<order/2+1; ii++)
+ {
+ coeff[ii] = (aa - 4*(ii - 1)*(ii - 1))/qq*coeff[ii-1] -
+ coeff[ii-2];
+ sum += coeff[ii];
+ }
+ }
+ else
+ {
+ coeff[1] = (aa - 1)/qq - 1;
+ sum = coeff[0] + coeff[1];
+ for (ii=2; ii<order/2+1; ii++)
+ {
+ coeff[ii] = (aa - (2*ii - 1)*(2*ii - 1))/qq*coeff[ii-1] -
+ coeff[ii-2];
+ sum += coeff[ii];
+ }
+ }
+
+ nn = ii - 1;
+
+ ratio = coeff[nn]/coeff[nn-1];
+ }
+
+ ni = GSL_SF_MATHIEU_COEFF - nn - 1;
+
+ /* Compute first two points to start root-finding. */
+ if (even_odd == 0)
+ x1 = -qq/(4.0*GSL_SF_MATHIEU_COEFF*GSL_SF_MATHIEU_COEFF);
+ else
+ x1 = -qq/((2.0*GSL_SF_MATHIEU_COEFF + 1.0)*(2.0*GSL_SF_MATHIEU_COEFF + 1.0));
+ g1 = ratio;
+ backward_recurse_c(aa, qq, x1, ff, &g1, even_odd, ni);
+ x2 = g1;
+ g2 = ratio;
+ backward_recurse_c(aa, qq, x2, ff, &g2, even_odd, ni);
+
+ /* Find the root. */
+ while (1)
+ {
+ /* Compute the relative error. */
+ e1 = g1 - x1;
+ e2 = g2 - x2;
+ de = e1 - e2;
+
+ /* If we are close enough to the root, break... */
+ if (fabs(de) < eps)
+ break;
+
+ /* Otherwise, determine the next guess and try again. */
+ xh = (e1*x2 - e2*x1)/de;
+ x1 = x2;
+ g1 = g2;
+ x2 = xh;
+ g2 = ratio;
+ backward_recurse_c(aa, qq, x2, ff, &g2, even_odd, ni);
+ }
+
+ /* Compute the rest of the coefficients. */
+ sum += coeff[nn];
+ for (ii=nn+1; ii<GSL_SF_MATHIEU_COEFF; ii++)
+ {
+ coeff[ii] = ff[ii-nn-1]*coeff[ii-1];
+ sum += coeff[ii];
+
+ /* If the coefficients are getting really small, set the remainder
+ to zero. */
+ if (fabs(coeff[ii]) < 1e-20)
+ {
+ for (; ii<GSL_SF_MATHIEU_COEFF;)
+ coeff[ii++] = 0.0;
+ }
+ }
+
+ /* Normalize the coefficients. */
+ for (ii=0; ii<GSL_SF_MATHIEU_COEFF; ii++)
+ coeff[ii] /= sum;
+
+ return GSL_SUCCESS;
+}
+
+
+int gsl_sf_mathieu_b_coeff(int order, double qq, double aa, double coeff[])
+{
+ int ni, nn, ii, even_odd;
+ double eps, g1, g2, x1, x2, e1, e2, de, xh, sum, ratio,
+ ff[GSL_SF_MATHIEU_COEFF];
+
+
+ eps = 1e-10;
+ coeff[0] = 1.0;
+
+ even_odd = 0;
+ if (order % 2 != 0)
+ even_odd = 1;
+
+ /* If the coefficient array is not large enough to hold all necessary
+ coefficients, error out. */
+ if (order > GSL_SF_MATHIEU_COEFF)
+ return GSL_FAILURE;
+
+ /* Handle the trivial case where q = 0. */
+ if (qq == 0.0)
+ {
+ for (ii=0; ii<GSL_SF_MATHIEU_COEFF; ii++)
+ coeff[ii] = 0.0;
+
+ coeff[(order-1)/2] = 1.0;
+
+ return GSL_SUCCESS;
+ }
+
+ if (order < 5)
+ {
+ nn = 0;
+ sum = 0.0;
+ if (even_odd == 0)
+ ratio = (aa - 4)/qq;
+ else
+ ratio = (aa - 1 - qq)/qq;
+ }
+ else
+ {
+ if (even_odd == 0)
+ {
+ coeff[1] = (aa - 4)/qq;
+ sum = 2*coeff[0] + 4*coeff[1];
+ for (ii=2; ii<order/2; ii++)
+ {
+ coeff[ii] = (aa - 4*ii*ii)/qq*coeff[ii-1] - coeff[ii-2];
+ sum += 2*(ii + 1)*coeff[ii];
+ }
+ }
+ else
+ {
+ coeff[1] = (aa - 1)/qq + 1;
+ sum = coeff[0] + 3*coeff[1];
+ for (ii=2; ii<order/2+1; ii++)
+ {
+ coeff[ii] = (aa - (2*ii - 1)*(2*ii - 1))/qq*coeff[ii-1] -
+ coeff[ii-2];
+ sum += (2*(ii + 1) - 1)*coeff[ii];
+ }
+ }
+
+ nn = ii - 1;
+
+ ratio = coeff[nn]/coeff[nn-1];
+ }
+
+ ni = GSL_SF_MATHIEU_COEFF - nn - 1;
+
+ /* Compute first two points to start root-finding. */
+ if (even_odd == 0)
+ x1 = -qq/(4.0*(GSL_SF_MATHIEU_COEFF + 1.0)*(GSL_SF_MATHIEU_COEFF + 1.0));
+ else
+ x1 = -qq/((2.0*GSL_SF_MATHIEU_COEFF + 1.0)*(2.0*GSL_SF_MATHIEU_COEFF + 1.0));
+ g1 = ratio;
+ backward_recurse_s(aa, qq, x1, ff, &g1, even_odd, ni);
+ x2 = g1;
+ g2 = ratio;
+ backward_recurse_s(aa, qq, x2, ff, &g2, even_odd, ni);
+
+ /* Find the root. */
+ while (1)
+ {
+ /* Compute the relative error. */
+ e1 = g1 - x1;
+ e2 = g2 - x2;
+ de = e1 - e2;
+
+ /* If we are close enough to the root, break... */
+ if (fabs(de) < eps)
+ break;
+
+ /* Otherwise, determine the next guess and try again. */
+ xh = (e1*x2 - e2*x1)/de;
+ x1 = x2;
+ g1 = g2;
+ x2 = xh;
+ g2 = ratio;
+ backward_recurse_s(aa, qq, x2, ff, &g2, even_odd, ni);
+ }
+
+ /* Compute the rest of the coefficients. */
+ sum += 2*(nn + 1)*coeff[nn];
+ for (ii=nn+1; ii<GSL_SF_MATHIEU_COEFF; ii++)
+ {
+ coeff[ii] = ff[ii-nn-1]*coeff[ii-1];
+ sum += 2*(ii + 1)*coeff[ii];
+
+ /* If the coefficients are getting really small, set the remainder
+ to zero. */
+ if (fabs(coeff[ii]) < 1e-20)
+ {
+ for (; ii<GSL_SF_MATHIEU_COEFF;)
+ coeff[ii++] = 0.0;
+ }
+ }
+
+ /* Normalize the coefficients. */
+ for (ii=0; ii<GSL_SF_MATHIEU_COEFF; ii++)
+ coeff[ii] /= sum;
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/specfunc/mathieu_radfunc.c b/gsl-1.9/specfunc/mathieu_radfunc.c
new file mode 100644
index 0000000..844a0f4
--- /dev/null
+++ b/gsl-1.9/specfunc/mathieu_radfunc.c
@@ -0,0 +1,459 @@
+/* specfunc/mathieu_radfunc.c
+ *
+ * Copyright (C) 2002 Lowell Johnson
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/* Author: L. Johnson */
+
+#include <config.h>
+#include <stdlib.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_sf.h>
+#include <gsl/gsl_sf_mathieu.h>
+
+
+int gsl_sf_mathieu_Mc(int kind, int order, double qq, double zz,
+ gsl_sf_result *result)
+{
+ int even_odd, kk, mm, status;
+ double maxerr = 1e-14, amax, pi = M_PI, fn, factor;
+ double coeff[GSL_SF_MATHIEU_COEFF], fc;
+ double j1c, z2c, j1pc, z2pc;
+ double u1, u2;
+ gsl_sf_result aa;
+
+
+ /* Check for out of bounds parameters. */
+ if (qq <= 0.0)
+ {
+ GSL_ERROR("q must be greater than zero", GSL_EINVAL);
+ }
+ if (kind < 1 || kind > 2)
+ {
+ GSL_ERROR("kind must be 1 or 2", GSL_EINVAL);
+ }
+
+ mm = 0;
+ amax = 0.0;
+ fn = 0.0;
+ u1 = sqrt(qq)*exp(-1.0*zz);
+ u2 = sqrt(qq)*exp(zz);
+
+ even_odd = 0;
+ if (order % 2 != 0)
+ even_odd = 1;
+
+ /* Compute the characteristic value. */
+ status = gsl_sf_mathieu_a(order, qq, &aa);
+ if (status != GSL_SUCCESS)
+ {
+ return status;
+ }
+
+ /* Compute the series coefficients. */
+ status = gsl_sf_mathieu_a_coeff(order, qq, aa.val, coeff);
+ if (status != GSL_SUCCESS)
+ {
+ return status;
+ }
+
+ if (even_odd == 0)
+ {
+ for (kk=0; kk<GSL_SF_MATHIEU_COEFF; kk++)
+ {
+ amax = GSL_MAX(amax, fabs(coeff[kk]));
+ if (fabs(coeff[kk])/amax < maxerr)
+ break;
+
+ j1c = gsl_sf_bessel_Jn(kk, u1);
+ if (kind == 1)
+ {
+ z2c = gsl_sf_bessel_Jn(kk, u2);
+ }
+ else /* kind = 2 */
+ {
+ z2c = gsl_sf_bessel_Yn(kk, u2);
+ }
+
+ fc = pow(-1.0, 0.5*order+kk)*coeff[kk];
+ fn += fc*j1c*z2c;
+ }
+
+ fn *= sqrt(pi/2.0)/coeff[0];
+ }
+ else
+ {
+ for (kk=0; kk<GSL_SF_MATHIEU_COEFF; kk++)
+ {
+ amax = GSL_MAX(amax, fabs(coeff[kk]));
+ if (fabs(coeff[kk])/amax < maxerr)
+ break;
+
+ j1c = gsl_sf_bessel_Jn(kk, u1);
+ j1pc = gsl_sf_bessel_Jn(kk+1, u1);
+ if (kind == 1)
+ {
+ z2c = gsl_sf_bessel_Jn(kk, u2);
+ z2pc = gsl_sf_bessel_Jn(kk+1, u2);
+ }
+ else /* kind = 2 */
+ {
+ z2c = gsl_sf_bessel_Yn(kk, u2);
+ z2pc = gsl_sf_bessel_Yn(kk+1, u2);
+ }
+ fc = pow(-1.0, 0.5*(order-1)+kk)*coeff[kk];
+ fn += fc*(j1c*z2pc + j1pc*z2c);
+ }
+
+ fn *= sqrt(pi/2.0)/coeff[0];
+ }
+
+ result->val = fn;
+ result->err = 2.0*GSL_DBL_EPSILON;
+ factor = fabs(fn);
+ if (factor > 1.0)
+ result->err *= factor;
+
+ return GSL_SUCCESS;
+}
+
+
+int gsl_sf_mathieu_Ms(int kind, int order, double qq, double zz,
+ gsl_sf_result *result)
+{
+ int even_odd, kk, mm, status;
+ double maxerr = 1e-14, amax, pi = M_PI, fn, factor;
+ double coeff[GSL_SF_MATHIEU_COEFF], fc;
+ double j1c, z2c, j1mc, z2mc, j1pc, z2pc;
+ double u1, u2;
+ gsl_sf_result aa;
+
+
+ /* Check for out of bounds parameters. */
+ if (qq <= 0.0)
+ {
+ GSL_ERROR("q must be greater than zero", GSL_EINVAL);
+ }
+ if (kind < 1 || kind > 2)
+ {
+ GSL_ERROR("kind must be 1 or 2", GSL_EINVAL);
+ }
+
+ mm = 0;
+ amax = 0.0;
+ fn = 0.0;
+ u1 = sqrt(qq)*exp(-1.0*zz);
+ u2 = sqrt(qq)*exp(zz);
+
+ even_odd = 0;
+ if (order % 2 != 0)
+ even_odd = 1;
+
+ /* Compute the characteristic value. */
+ status = gsl_sf_mathieu_b(order, qq, &aa);
+ if (status != GSL_SUCCESS)
+ {
+ return status;
+ }
+
+ /* Compute the series coefficients. */
+ status = gsl_sf_mathieu_b_coeff(order, qq, aa.val, coeff);
+ if (status != GSL_SUCCESS)
+ {
+ return status;
+ }
+
+ if (even_odd == 0)
+ {
+ for (kk=0; kk<GSL_SF_MATHIEU_COEFF; kk++)
+ {
+ amax = GSL_MAX(amax, fabs(coeff[kk]));
+ if (fabs(coeff[kk])/amax < maxerr)
+ break;
+
+ j1mc = gsl_sf_bessel_Jn(kk, u1);
+ j1pc = gsl_sf_bessel_Jn(kk+2, u1);
+ if (kind == 1)
+ {
+ z2mc = gsl_sf_bessel_Jn(kk, u2);
+ z2pc = gsl_sf_bessel_Jn(kk+2, u2);
+ }
+ else /* kind = 2 */
+ {
+ z2mc = gsl_sf_bessel_Yn(kk, u2);
+ z2pc = gsl_sf_bessel_Yn(kk+2, u2);
+ }
+
+ fc = pow(-1.0, 0.5*order+kk+1)*coeff[kk];
+ fn += fc*(j1mc*z2pc - j1pc*z2mc);
+ }
+
+ fn *= sqrt(pi/2.0)/coeff[0];
+ }
+ else
+ {
+ for (kk=0; kk<GSL_SF_MATHIEU_COEFF; kk++)
+ {
+ amax = GSL_MAX(amax, fabs(coeff[kk]));
+ if (fabs(coeff[kk])/amax < maxerr)
+ break;
+
+ j1c = gsl_sf_bessel_Jn(kk, u1);
+ j1pc = gsl_sf_bessel_Jn(kk+1, u1);
+ if (kind == 1)
+ {
+ z2c = gsl_sf_bessel_Jn(kk, u2);
+ z2pc = gsl_sf_bessel_Jn(kk+1, u2);
+ }
+ else /* kind = 2 */
+ {
+ z2c = gsl_sf_bessel_Yn(kk, u2);
+ z2pc = gsl_sf_bessel_Yn(kk+1, u2);
+ }
+
+ fc = pow(-1.0, 0.5*(order-1)+kk)*coeff[kk];
+ fn += fc*(j1c*z2pc - j1pc*z2c);
+ }
+
+ fn *= sqrt(pi/2.0)/coeff[0];
+ }
+
+ result->val = fn;
+ result->err = 2.0*GSL_DBL_EPSILON;
+ factor = fabs(fn);
+ if (factor > 1.0)
+ result->err *= factor;
+
+ return GSL_SUCCESS;
+}
+
+
+int gsl_sf_mathieu_Mc_array(int kind, int nmin, int nmax, double qq,
+ double zz, gsl_sf_mathieu_workspace *work,
+ double result_array[])
+{
+ int even_odd, order, ii, kk, mm, status;
+ double maxerr = 1e-14, amax, pi = M_PI, fn;
+ double coeff[GSL_SF_MATHIEU_COEFF], fc;
+ double j1c, z2c, j1pc, z2pc;
+ double u1, u2;
+ double *aa = work->aa;
+
+
+ /* Initialize the result array to zeroes. */
+ for (ii=0; ii<nmax-nmin+1; ii++)
+ result_array[ii] = 0.0;
+
+ /* Check for out of bounds parameters. */
+ if (qq <= 0.0)
+ {
+ GSL_ERROR("q must be greater than zero", GSL_EINVAL);
+ }
+ if (kind < 1 || kind > 2)
+ {
+ GSL_ERROR("kind must be 1 or 2", GSL_EINVAL);
+ }
+
+ mm = 0;
+ amax = 0.0;
+ fn = 0.0;
+ u1 = sqrt(qq)*exp(-1.0*zz);
+ u2 = sqrt(qq)*exp(zz);
+
+ /* Compute all eigenvalues up to nmax. */
+ gsl_sf_mathieu_a_array(0, nmax, qq, work, aa);
+
+ for (ii=0, order=nmin; order<=nmax; ii++, order++)
+ {
+ even_odd = 0;
+ if (order % 2 != 0)
+ even_odd = 1;
+
+ /* Compute the series coefficients. */
+ status = gsl_sf_mathieu_a_coeff(order, qq, aa[order], coeff);
+ if (status != GSL_SUCCESS)
+ {
+ return status;
+ }
+
+ if (even_odd == 0)
+ {
+ for (kk=0; kk<GSL_SF_MATHIEU_COEFF; kk++)
+ {
+ amax = GSL_MAX(amax, fabs(coeff[kk]));
+ if (fabs(coeff[kk])/amax < maxerr)
+ break;
+
+ j1c = gsl_sf_bessel_Jn(kk, u1);
+ if (kind == 1)
+ {
+ z2c = gsl_sf_bessel_Jn(kk, u2);
+ }
+ else /* kind = 2 */
+ {
+ z2c = gsl_sf_bessel_Yn(kk, u2);
+ }
+
+ fc = pow(-1.0, 0.5*order+kk)*coeff[kk];
+ fn += fc*j1c*z2c;
+ }
+
+ fn *= sqrt(pi/2.0)/coeff[0];
+ }
+ else
+ {
+ for (kk=0; kk<GSL_SF_MATHIEU_COEFF; kk++)
+ {
+ amax = GSL_MAX(amax, fabs(coeff[kk]));
+ if (fabs(coeff[kk])/amax < maxerr)
+ break;
+
+ j1c = gsl_sf_bessel_Jn(kk, u1);
+ j1pc = gsl_sf_bessel_Jn(kk+1, u1);
+ if (kind == 1)
+ {
+ z2c = gsl_sf_bessel_Jn(kk, u2);
+ z2pc = gsl_sf_bessel_Jn(kk+1, u2);
+ }
+ else /* kind = 2 */
+ {
+ z2c = gsl_sf_bessel_Yn(kk, u2);
+ z2pc = gsl_sf_bessel_Yn(kk+1, u2);
+ }
+ fc = pow(-1.0, 0.5*(order-1)+kk)*coeff[kk];
+ fn += fc*(j1c*z2pc + j1pc*z2c);
+ }
+
+ fn *= sqrt(pi/2.0)/coeff[0];
+ }
+
+ result_array[ii] = fn;
+ } /* order loop */
+
+ return GSL_SUCCESS;
+}
+
+
+int gsl_sf_mathieu_Ms_array(int kind, int nmin, int nmax, double qq,
+ double zz, gsl_sf_mathieu_workspace *work,
+ double result_array[])
+{
+ int even_odd, order, ii, kk, mm, status;
+ double maxerr = 1e-14, amax, pi = M_PI, fn;
+ double coeff[GSL_SF_MATHIEU_COEFF], fc;
+ double j1c, z2c, j1mc, z2mc, j1pc, z2pc;
+ double u1, u2;
+ double *bb = work->bb;
+
+
+ /* Initialize the result array to zeroes. */
+ for (ii=0; ii<nmax-nmin+1; ii++)
+ result_array[ii] = 0.0;
+
+ /* Check for out of bounds parameters. */
+ if (qq <= 0.0)
+ {
+ GSL_ERROR("q must be greater than zero", GSL_EINVAL);
+ }
+ if (kind < 1 || kind > 2)
+ {
+ GSL_ERROR("kind must be 1 or 2", GSL_EINVAL);
+ }
+
+ mm = 0;
+ amax = 0.0;
+ fn = 0.0;
+ u1 = sqrt(qq)*exp(-1.0*zz);
+ u2 = sqrt(qq)*exp(zz);
+
+ /* Compute all eigenvalues up to nmax. */
+ gsl_sf_mathieu_b_array(0, nmax, qq, work, bb);
+
+ for (ii=0, order=nmin; order<=nmax; ii++, order++)
+ {
+ even_odd = 0;
+ if (order % 2 != 0)
+ even_odd = 1;
+
+ /* Compute the series coefficients. */
+ status = gsl_sf_mathieu_b_coeff(order, qq, bb[order], coeff);
+ if (status != GSL_SUCCESS)
+ {
+ return status;
+ }
+
+ if (even_odd == 0)
+ {
+ for (kk=0; kk<GSL_SF_MATHIEU_COEFF; kk++)
+ {
+ amax = GSL_MAX(amax, fabs(coeff[kk]));
+ if (fabs(coeff[kk])/amax < maxerr)
+ break;
+
+ j1mc = gsl_sf_bessel_Jn(kk, u1);
+ j1pc = gsl_sf_bessel_Jn(kk+2, u1);
+ if (kind == 1)
+ {
+ z2mc = gsl_sf_bessel_Jn(kk, u2);
+ z2pc = gsl_sf_bessel_Jn(kk+2, u2);
+ }
+ else /* kind = 2 */
+ {
+ z2mc = gsl_sf_bessel_Yn(kk, u2);
+ z2pc = gsl_sf_bessel_Yn(kk+2, u2);
+ }
+
+ fc = pow(-1.0, 0.5*order+kk+1)*coeff[kk];
+ fn += fc*(j1mc*z2pc - j1pc*z2mc);
+ }
+
+ fn *= sqrt(pi/2.0)/coeff[0];
+ }
+ else
+ {
+ for (kk=0; kk<GSL_SF_MATHIEU_COEFF; kk++)
+ {
+ amax = GSL_MAX(amax, fabs(coeff[kk]));
+ if (fabs(coeff[kk])/amax < maxerr)
+ break;
+
+ j1c = gsl_sf_bessel_Jn(kk, u1);
+ j1pc = gsl_sf_bessel_Jn(kk+1, u1);
+ if (kind == 1)
+ {
+ z2c = gsl_sf_bessel_Jn(kk, u2);
+ z2pc = gsl_sf_bessel_Jn(kk+1, u2);
+ }
+ else /* kind = 2 */
+ {
+ z2c = gsl_sf_bessel_Yn(kk, u2);
+ z2pc = gsl_sf_bessel_Yn(kk+1, u2);
+ }
+
+ fc = pow(-1.0, 0.5*(order-1)+kk)*coeff[kk];
+ fn += fc*(j1c*z2pc - j1pc*z2c);
+ }
+
+ fn *= sqrt(pi/2.0)/coeff[0];
+ }
+
+ result_array[ii] = fn;
+ } /* order loop */
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/specfunc/mathieu_workspace.c b/gsl-1.9/specfunc/mathieu_workspace.c
new file mode 100644
index 0000000..4b99180
--- /dev/null
+++ b/gsl-1.9/specfunc/mathieu_workspace.c
@@ -0,0 +1,202 @@
+/* specfunc/mathieu_workspace.c
+ *
+ * Copyright (C) 2003 Lowell Johnson
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/* Author: L. Johnson */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_mathieu.h>
+
+
+gsl_sf_mathieu_workspace *gsl_sf_mathieu_alloc(const size_t nn,
+ const double qq)
+{
+ gsl_sf_mathieu_workspace *workspace;
+ unsigned int even_order = nn/2 + 1, odd_order = (nn + 1)/2,
+ extra_values;
+
+ /* Compute the maximum number of extra terms required for 10^-18 root
+ accuracy for a given value of q (contributed by Brian Gladman). */
+ extra_values = (int)(2.1*pow(fabs(qq), 0.37)) + 9;
+
+ if (nn + 1 == 0)
+ {
+ GSL_ERROR_NULL("matrix dimension must be positive integer", GSL_EINVAL);
+ }
+
+ workspace =
+ (gsl_sf_mathieu_workspace *)malloc(sizeof(gsl_sf_mathieu_workspace));
+ if (workspace == NULL)
+ {
+ GSL_ERROR_NULL("failed to allocate space for workspace", GSL_ENOMEM);
+ }
+
+ /* Extend matrices to ensure accuracy. */
+ even_order += extra_values;
+ odd_order += extra_values;
+
+ workspace->size = nn;
+ workspace->even_order = even_order;
+ workspace->odd_order = odd_order;
+ workspace->extra_values = extra_values;
+
+ /* Allocate space for the characteristic values. */
+ workspace->aa = (double *)malloc((nn+1)*sizeof(double));
+ if (workspace->aa == NULL)
+ {
+ free(workspace);
+ GSL_ERROR_NULL("Error allocating memory for characteristic a values",
+ GSL_ENOMEM);
+ }
+
+ workspace->bb = (double *)malloc((nn+1)*sizeof(double));
+ if (workspace->bb == NULL)
+ {
+ free(workspace->aa);
+ free(workspace);
+ GSL_ERROR_NULL("Error allocating memory for characteristic b values",
+ GSL_ENOMEM);
+ }
+
+ /* Since even_order is always >= odd_order, dimension the arrays for
+ even_order. */
+
+ workspace->dd = (double *)malloc(even_order*sizeof(double));
+ if (workspace->dd == NULL)
+ {
+ free(workspace->aa);
+ free(workspace->bb);
+ free(workspace);
+ GSL_ERROR_NULL("failed to allocate space for diagonal", GSL_ENOMEM);
+ }
+
+ workspace->ee = (double *)malloc(even_order*sizeof(double));
+ if (workspace->ee == NULL)
+ {
+ free(workspace->dd);
+ free(workspace->aa);
+ free(workspace->bb);
+ free(workspace);
+ GSL_ERROR_NULL("failed to allocate space for diagonal", GSL_ENOMEM);
+ }
+
+ workspace->tt = (double *)malloc(3*even_order*sizeof(double));
+ if (workspace->tt == NULL)
+ {
+ free(workspace->ee);
+ free(workspace->dd);
+ free(workspace->aa);
+ free(workspace->bb);
+ free(workspace);
+ GSL_ERROR_NULL("failed to allocate space for diagonal", GSL_ENOMEM);
+ }
+
+ workspace->e2 = (double *)malloc(even_order*sizeof(double));
+ if (workspace->e2 == NULL)
+ {
+ free(workspace->tt);
+ free(workspace->ee);
+ free(workspace->dd);
+ free(workspace->aa);
+ free(workspace->bb);
+ free(workspace);
+ GSL_ERROR_NULL("failed to allocate space for diagonal", GSL_ENOMEM);
+ }
+
+ workspace->zz = (double *)malloc(even_order*even_order*sizeof(double));
+ if (workspace->zz == NULL)
+ {
+ free(workspace->e2);
+ free(workspace->tt);
+ free(workspace->ee);
+ free(workspace->dd);
+ free(workspace->aa);
+ free(workspace->bb);
+ free(workspace);
+ GSL_ERROR_NULL("failed to allocate space for diagonal", GSL_ENOMEM);
+ }
+
+ workspace->eval = gsl_vector_alloc(even_order);
+
+ if (workspace->eval == NULL)
+ {
+ free(workspace->zz);
+ free(workspace->e2);
+ free(workspace->tt);
+ free(workspace->ee);
+ free(workspace->dd);
+ free(workspace->aa);
+ free(workspace->bb);
+ free(workspace);
+ GSL_ERROR_NULL("failed to allocate space for eval", GSL_ENOMEM);
+ }
+
+ workspace->evec = gsl_matrix_alloc(even_order, even_order);
+
+ if (workspace->evec == NULL)
+ {
+ gsl_vector_free (workspace->eval);
+ free(workspace->zz);
+ free(workspace->e2);
+ free(workspace->tt);
+ free(workspace->ee);
+ free(workspace->dd);
+ free(workspace->aa);
+ free(workspace->bb);
+ free(workspace);
+ GSL_ERROR_NULL("failed to allocate space for evec", GSL_ENOMEM);
+ }
+
+ workspace->wmat = gsl_eigen_symmv_alloc(even_order);
+
+ if (workspace->wmat == NULL)
+ {
+ gsl_matrix_free (workspace->evec);
+ gsl_vector_free (workspace->eval);
+ free(workspace->zz);
+ free(workspace->e2);
+ free(workspace->tt);
+ free(workspace->ee);
+ free(workspace->dd);
+ free(workspace->aa);
+ free(workspace->bb);
+ free(workspace);
+ GSL_ERROR_NULL("failed to allocate space for wmat", GSL_ENOMEM);
+ }
+
+ return workspace;
+}
+
+
+void gsl_sf_mathieu_free(gsl_sf_mathieu_workspace *workspace)
+{
+ gsl_vector_free(workspace->eval);
+ gsl_matrix_free(workspace->evec);
+ gsl_eigen_symmv_free(workspace->wmat);
+ free(workspace->aa);
+ free(workspace->bb);
+ free(workspace->dd);
+ free(workspace->ee);
+ free(workspace->tt);
+ free(workspace->e2);
+ free(workspace->zz);
+ free(workspace);
+}
diff --git a/gsl-1.9/specfunc/poch.c b/gsl-1.9/specfunc/poch.c
new file mode 100644
index 0000000..782900e
--- /dev/null
+++ b/gsl-1.9/specfunc/poch.c
@@ -0,0 +1,435 @@
+/* specfunc/poch.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_exp.h>
+#include <gsl/gsl_sf_log.h>
+#include <gsl/gsl_sf_pow_int.h>
+#include <gsl/gsl_sf_psi.h>
+#include <gsl/gsl_sf_gamma.h>
+
+#include "error.h"
+
+static const double bern[21] = {
+ 0.0 /* no element 0 */,
+ +0.833333333333333333333333333333333e-01,
+ -0.138888888888888888888888888888888e-02,
+ +0.330687830687830687830687830687830e-04,
+ -0.826719576719576719576719576719576e-06,
+ +0.208767569878680989792100903212014e-07,
+ -0.528419013868749318484768220217955e-09,
+ +0.133825365306846788328269809751291e-10,
+ -0.338968029632258286683019539124944e-12,
+ +0.858606205627784456413590545042562e-14,
+ -0.217486869855806187304151642386591e-15,
+ +0.550900282836022951520265260890225e-17,
+ -0.139544646858125233407076862640635e-18,
+ +0.353470703962946747169322997780379e-20,
+ -0.895351742703754685040261131811274e-22,
+ +0.226795245233768306031095073886816e-23,
+ -0.574472439520264523834847971943400e-24,
+ +0.145517247561486490186626486727132e-26,
+ -0.368599494066531017818178247990866e-28,
+ +0.933673425709504467203255515278562e-30,
+ -0.236502241570062993455963519636983e-31
+};
+
+
+/* ((a)_x - 1)/x in the "small x" region where
+ * cancellation must be controlled.
+ *
+ * Based on SLATEC DPOCH1().
+ */
+/*
+C When ABS(X) is so small that substantial cancellation will occur if
+C the straightforward formula is used, we use an expansion due
+C to Fields and discussed by Y. L. Luke, The Special Functions and Their
+C Approximations, Vol. 1, Academic Press, 1969, page 34.
+C
+C The ratio POCH(A,X) = GAMMA(A+X)/GAMMA(A) is written by Luke as
+C (A+(X-1)/2)**X * polynomial in (A+(X-1)/2)**(-2) .
+C In order to maintain significance in POCH1, we write for positive a
+C (A+(X-1)/2)**X = EXP(X*LOG(A+(X-1)/2)) = EXP(Q)
+C = 1.0 + Q*EXPREL(Q) .
+C Likewise the polynomial is written
+C POLY = 1.0 + X*POLY1(A,X) .
+C Thus,
+C POCH1(A,X) = (POCH(A,X) - 1) / X
+C = EXPREL(Q)*(Q/X + Q*POLY1(A,X)) + POLY1(A,X)
+C
+*/
+static
+int
+pochrel_smallx(const double a, const double x, gsl_sf_result * result)
+{
+ /*
+ SQTBIG = 1.0D0/SQRT(24.0D0*D1MACH(1))
+ ALNEPS = LOG(D1MACH(3))
+ */
+ const double SQTBIG = 1.0/(2.0*M_SQRT2*M_SQRT3*GSL_SQRT_DBL_MIN);
+ const double ALNEPS = GSL_LOG_DBL_EPSILON - M_LN2;
+
+ if(x == 0.0) {
+ return gsl_sf_psi_e(a, result);
+ }
+ else {
+ const double bp = ( (a < -0.5) ? 1.0-a-x : a );
+ const int incr = ( (bp < 10.0) ? 11.0-bp : 0 );
+ const double b = bp + incr;
+ double dpoch1;
+ gsl_sf_result dexprl;
+ int stat_dexprl;
+ int i;
+
+ double var = b + 0.5*(x-1.0);
+ double alnvar = log(var);
+ double q = x*alnvar;
+
+ double poly1 = 0.0;
+
+ if(var < SQTBIG) {
+ const int nterms = (int)(-0.5*ALNEPS/alnvar + 1.0);
+ const double var2 = (1.0/var)/var;
+ const double rho = 0.5 * (x + 1.0);
+ double term = var2;
+ double gbern[24];
+ int k, j;
+
+ gbern[1] = 1.0;
+ gbern[2] = -rho/12.0;
+ poly1 = gbern[2] * term;
+
+ if(nterms > 20) {
+ /* NTERMS IS TOO BIG, MAYBE D1MACH(3) IS BAD */
+ /* nterms = 20; */
+ result->val = 0.0;
+ result->err = 0.0;
+ GSL_ERROR ("error", GSL_ESANITY);
+ }
+
+ for(k=2; k<=nterms; k++) {
+ double gbk = 0.0;
+ for(j=1; j<=k; j++) {
+ gbk += bern[k-j+1]*gbern[j];
+ }
+ gbern[k+1] = -rho*gbk/k;
+
+ term *= (2*k-2-x)*(2*k-1-x)*var2;
+ poly1 += gbern[k+1]*term;
+ }
+ }
+
+ stat_dexprl = gsl_sf_expm1_e(q, &dexprl);
+ if(stat_dexprl != GSL_SUCCESS) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return stat_dexprl;
+ }
+ dexprl.val = dexprl.val/q;
+ poly1 *= (x - 1.0);
+ dpoch1 = dexprl.val * (alnvar + q * poly1) + poly1;
+
+ for(i=incr-1; i >= 0; i--) {
+ /*
+ C WE HAVE DPOCH1(B,X), BUT BP IS SMALL, SO WE USE BACKWARDS RECURSION
+ C TO OBTAIN DPOCH1(BP,X).
+ */
+ double binv = 1.0/(bp+i);
+ dpoch1 = (dpoch1 - binv) / (1.0 + x*binv);
+ }
+
+ if(bp == a) {
+ result->val = dpoch1;
+ result->err = 2.0 * GSL_DBL_EPSILON * (fabs(incr) + 1.0) * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ /*
+ C WE HAVE DPOCH1(BP,X), BUT A IS LT -0.5. WE THEREFORE USE A
+ C REFLECTION FORMULA TO OBTAIN DPOCH1(A,X).
+ */
+ double sinpxx = sin(M_PI*x)/x;
+ double sinpx2 = sin(0.5*M_PI*x);
+ double t1 = sinpxx/tan(M_PI*b);
+ double t2 = 2.0*sinpx2*(sinpx2/x);
+ double trig = t1 - t2;
+ result->val = dpoch1 * (1.0 + x*trig) + trig;
+ result->err = (fabs(dpoch1*x) + 1.0) * GSL_DBL_EPSILON * (fabs(t1) + fabs(t2));
+ result->err += 2.0 * GSL_DBL_EPSILON * (fabs(incr) + 1.0) * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ }
+}
+
+
+/* Assumes a>0 and a+x>0.
+ */
+static
+int
+lnpoch_pos(const double a, const double x, gsl_sf_result * result)
+{
+ double absx = fabs(x);
+
+ if(absx > 0.1*a || absx*log(GSL_MAX_DBL(a,2.0)) > 0.1) {
+ if(a < GSL_SF_GAMMA_XMAX && a+x < GSL_SF_GAMMA_XMAX) {
+ /* If we can do it by calculating the gamma functions
+ * directly, then that will be more accurate than
+ * doing the subtraction of the logs.
+ */
+ gsl_sf_result g1;
+ gsl_sf_result g2;
+ gsl_sf_gammainv_e(a, &g1);
+ gsl_sf_gammainv_e(a+x, &g2);
+ result->val = -log(g2.val/g1.val);
+ result->err = g1.err/fabs(g1.val) + g2.err/fabs(g2.val);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ /* Otherwise we must do the subtraction.
+ */
+ gsl_sf_result lg1;
+ gsl_sf_result lg2;
+ int stat_1 = gsl_sf_lngamma_e(a, &lg1);
+ int stat_2 = gsl_sf_lngamma_e(a+x, &lg2);
+ result->val = lg2.val - lg1.val;
+ result->err = lg2.err + lg1.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_ERROR_SELECT_2(stat_1, stat_2);
+ }
+ }
+ else if(absx < 0.1*a && a > 15.0) {
+ /* Be careful about the implied subtraction.
+ * Note that both a+x and and a must be
+ * large here since a is not small
+ * and x is not relatively large.
+ * So we calculate using Stirling for Log[Gamma(z)].
+ *
+ * Log[Gamma(a+x)/Gamma(a)] = x(Log[a]-1) + (x+a-1/2)Log[1+x/a]
+ * + (1/(1+eps) - 1) / (12 a)
+ * - (1/(1+eps)^3 - 1) / (360 a^3)
+ * + (1/(1+eps)^5 - 1) / (1260 a^5)
+ * - (1/(1+eps)^7 - 1) / (1680 a^7)
+ * + ...
+ */
+ const double eps = x/a;
+ const double den = 1.0 + eps;
+ const double d3 = den*den*den;
+ const double d5 = d3*den*den;
+ const double d7 = d5*den*den;
+ const double c1 = -eps/den;
+ const double c3 = -eps*(3.0+eps*(3.0+eps))/d3;
+ const double c5 = -eps*(5.0+eps*(10.0+eps*(10.0+eps*(5.0+eps))))/d5;
+ const double c7 = -eps*(7.0+eps*(21.0+eps*(35.0+eps*(35.0+eps*(21.0+eps*(7.0+eps))))))/d7;
+ const double p8 = gsl_sf_pow_int(1.0+eps,8);
+ const double c8 = 1.0/p8 - 1.0; /* these need not */
+ const double c9 = 1.0/(p8*(1.0+eps)) - 1.0; /* be very accurate */
+ const double a4 = a*a*a*a;
+ const double a6 = a4*a*a;
+ const double ser_1 = c1 + c3/(30.0*a*a) + c5/(105.0*a4) + c7/(140.0*a6);
+ const double ser_2 = c8/(99.0*a6*a*a) - 691.0/360360.0 * c9/(a6*a4);
+ const double ser = (ser_1 + ser_2)/ (12.0*a);
+
+ double term1 = x * log(a/M_E);
+ double term2;
+ gsl_sf_result ln_1peps;
+ gsl_sf_log_1plusx_e(eps, &ln_1peps); /* log(1 + x/a) */
+ term2 = (x + a - 0.5) * ln_1peps.val;
+
+ result->val = term1 + term2 + ser;
+ result->err = GSL_DBL_EPSILON*fabs(term1);
+ result->err += fabs((x + a - 0.5)*ln_1peps.err);
+ result->err += fabs(ln_1peps.val) * GSL_DBL_EPSILON * (fabs(x) + fabs(a) + 0.5);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ gsl_sf_result poch_rel;
+ int stat_p = pochrel_smallx(a, x, &poch_rel);
+ double eps = x*poch_rel.val;
+ int stat_e = gsl_sf_log_1plusx_e(eps, result);
+ result->err = 2.0 * fabs(x * poch_rel.err / (1.0 + eps));
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_ERROR_SELECT_2(stat_e, stat_p);
+ }
+}
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int
+gsl_sf_lnpoch_e(const double a, const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(a <= 0.0 || a+x <= 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x == 0.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else {
+ return lnpoch_pos(a, x, result);
+ }
+}
+
+
+int
+gsl_sf_lnpoch_sgn_e(const double a, const double x,
+ gsl_sf_result * result, double * sgn)
+{
+ if(a == 0.0 || a+x == 0.0) {
+ *sgn = 0.0;
+ DOMAIN_ERROR(result);
+ }
+ else if(x == 0.0) {
+ *sgn = 1.0;
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(a > 0.0 && a+x > 0.0) {
+ *sgn = 1.0;
+ return lnpoch_pos(a, x, result);
+ }
+ else if(a < 0.0 && a+x < 0.0) {
+ /* Reduce to positive case using reflection.
+ */
+ double sin_1 = sin(M_PI * (1.0 - a));
+ double sin_2 = sin(M_PI * (1.0 - a - x));
+ if(sin_1 == 0.0 || sin_2 == 0.0) {
+ *sgn = 0.0;
+ DOMAIN_ERROR(result);
+ }
+ else {
+ gsl_sf_result lnp_pos;
+ int stat_pp = lnpoch_pos(1.0-a, -x, &lnp_pos);
+ double lnterm = log(fabs(sin_1/sin_2));
+ result->val = lnterm - lnp_pos.val;
+ result->err = lnp_pos.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * (fabs(1.0-a) + fabs(1.0-a-x)) * fabs(lnterm);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ *sgn = GSL_SIGN(sin_1*sin_2);
+ return stat_pp;
+ }
+ }
+ else {
+ /* Evaluate gamma ratio directly.
+ */
+ gsl_sf_result lg_apn;
+ gsl_sf_result lg_a;
+ double s_apn, s_a;
+ int stat_apn = gsl_sf_lngamma_sgn_e(a+x, &lg_apn, &s_apn);
+ int stat_a = gsl_sf_lngamma_sgn_e(a, &lg_a, &s_a);
+ if(stat_apn == GSL_SUCCESS && stat_a == GSL_SUCCESS) {
+ result->val = lg_apn.val - lg_a.val;
+ result->err = lg_apn.err + lg_a.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ *sgn = s_a * s_apn;
+ return GSL_SUCCESS;
+ }
+ else if(stat_apn == GSL_EDOM || stat_a == GSL_EDOM){
+ *sgn = 0.0;
+ DOMAIN_ERROR(result);
+ }
+ else {
+ result->val = 0.0;
+ result->err = 0.0;
+ *sgn = 0.0;
+ return GSL_FAILURE;
+ }
+ }
+}
+
+
+int
+gsl_sf_poch_e(const double a, const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x == 0.0) {
+ result->val = 1.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else {
+ gsl_sf_result lnpoch;
+ double sgn;
+ int stat_lnpoch = gsl_sf_lnpoch_sgn_e(a, x, &lnpoch, &sgn);
+ int stat_exp = gsl_sf_exp_err_e(lnpoch.val, lnpoch.err, result);
+ result->val *= sgn;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_ERROR_SELECT_2(stat_exp, stat_lnpoch);
+ }
+}
+
+
+int
+gsl_sf_pochrel_e(const double a, const double x, gsl_sf_result * result)
+{
+ const double absx = fabs(x);
+ const double absa = fabs(a);
+
+ /* CHECK_POINTER(result) */
+
+ if(absx > 0.1*absa || absx*log(GSL_MAX(absa,2.0)) > 0.1) {
+ gsl_sf_result lnpoch;
+ double sgn;
+ int stat_poch = gsl_sf_lnpoch_sgn_e(a, x, &lnpoch, &sgn);
+ if(lnpoch.val > GSL_LOG_DBL_MAX) {
+ OVERFLOW_ERROR(result);
+ }
+ else {
+ const double el = exp(lnpoch.val);
+ result->val = (sgn*el - 1.0)/x;
+ result->err = fabs(result->val) * (lnpoch.err + 2.0 * GSL_DBL_EPSILON);
+ result->err += 2.0 * GSL_DBL_EPSILON * (fabs(sgn*el) + 1.0) / fabs(x);
+ return stat_poch;
+ }
+ }
+ else {
+ return pochrel_smallx(a, x, result);
+ }
+}
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_lnpoch(const double a, const double x)
+{
+ EVAL_RESULT(gsl_sf_lnpoch_e(a, x, &result));
+}
+
+double gsl_sf_poch(const double a, const double x)
+{
+ EVAL_RESULT(gsl_sf_poch_e(a, x, &result));
+}
+
+double gsl_sf_pochrel(const double a, const double x)
+{
+ EVAL_RESULT(gsl_sf_pochrel_e(a, x, &result));
+}
diff --git a/gsl-1.9/specfunc/pow_int.c b/gsl-1.9/specfunc/pow_int.c
new file mode 100644
index 0000000..720b2e3
--- /dev/null
+++ b/gsl-1.9/specfunc/pow_int.c
@@ -0,0 +1,74 @@
+/* specfunc/pow_int.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_pow_int.h>
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions w/ Error handling *-*-*-*-*-*-*-*-*-*-*-*/
+
+int gsl_sf_pow_int_e(double x, int n, gsl_sf_result * result)
+{
+ double value = 1.0;
+ int count = 0;
+
+ /* CHECK_POINTER(result) */
+
+
+ if(n < 0) {
+ n = -n;
+
+ if(x == 0.0) {
+ double u = 1.0 / x;
+ result->val = (n % 2) ? u : (u * u) ; /* correct sign of infinity */
+ result->err = GSL_POSINF;
+ GSL_ERROR ("overflow", GSL_EOVRFLW);
+ }
+
+ x = 1.0/x;
+ }
+
+ /* repeated squaring method
+ * returns 0.0^0 = 1.0, so continuous in x
+ */
+ do {
+ if(GSL_IS_ODD(n)) value *= x;
+ n >>= 1;
+ x *= x;
+ ++count;
+ } while (n);
+
+ result->val = value;
+ result->err = 2.0 * GSL_DBL_EPSILON * (count + 1.0) * fabs(value);
+
+ return GSL_SUCCESS;
+}
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_pow_int(const double x, const int n)
+{
+ EVAL_RESULT(gsl_sf_pow_int_e(x, n, &result));
+}
diff --git a/gsl-1.9/specfunc/psi.c b/gsl-1.9/specfunc/psi.c
new file mode 100644
index 0000000..638d021
--- /dev/null
+++ b/gsl-1.9/specfunc/psi.c
@@ -0,0 +1,857 @@
+/* specfunc/psi.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004, 2005, 2006 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_exp.h>
+#include <gsl/gsl_sf_gamma.h>
+#include <gsl/gsl_sf_zeta.h>
+#include <gsl/gsl_sf_psi.h>
+#include <gsl/gsl_complex_math.h>
+
+#include <stdio.h>
+
+#include "error.h"
+
+#include "chebyshev.h"
+#include "cheb_eval.c"
+
+/*-*-*-*-*-*-*-*-*-*-*-* Private Section *-*-*-*-*-*-*-*-*-*-*-*/
+
+
+/* Chebyshev fit for f(y) = Re(Psi(1+Iy)) + M_EULER - y^2/(1+y^2) - y^2/(2(4+y^2))
+ * 1 < y < 10
+ * ==>
+ * y(x) = (9x + 11)/2, -1 < x < 1
+ * x(y) = (2y - 11)/9
+ *
+ * g(x) := f(y(x))
+ */
+static double r1py_data[] = {
+ 1.59888328244976954803168395603,
+ 0.67905625353213463845115658455,
+ -0.068485802980122530009506482524,
+ -0.005788184183095866792008831182,
+ 0.008511258167108615980419855648,
+ -0.004042656134699693434334556409,
+ 0.001352328406159402601778462956,
+ -0.000311646563930660566674525382,
+ 0.000018507563785249135437219139,
+ 0.000028348705427529850296492146,
+ -0.000019487536014574535567541960,
+ 8.0709788710834469408621587335e-06,
+ -2.2983564321340518037060346561e-06,
+ 3.0506629599604749843855962658e-07,
+ 1.3042238632418364610774284846e-07,
+ -1.2308657181048950589464690208e-07,
+ 5.7710855710682427240667414345e-08,
+ -1.8275559342450963966092636354e-08,
+ 3.1020471300626589420759518930e-09,
+ 6.8989327480593812470039430640e-10,
+ -8.7182290258923059852334818997e-10,
+ 4.4069147710243611798213548777e-10,
+ -1.4727311099198535963467200277e-10,
+ 2.7589682523262644748825844248e-11,
+ 4.1871826756975856411554363568e-12,
+ -6.5673460487260087541400767340e-12,
+ 3.4487900886723214020103638000e-12,
+ -1.1807251417448690607973794078e-12,
+ 2.3798314343969589258709315574e-13,
+ 2.1663630410818831824259465821e-15
+};
+static cheb_series r1py_cs = {
+ r1py_data,
+ 29,
+ -1,1,
+ 18
+};
+
+
+/* Chebyshev fits from SLATEC code for psi(x)
+
+ Series for PSI on the interval 0. to 1.00000D+00
+ with weighted error 2.03E-17
+ log weighted error 16.69
+ significant figures required 16.39
+ decimal places required 17.37
+
+ Series for APSI on the interval 0. to 2.50000D-01
+ with weighted error 5.54E-17
+ log weighted error 16.26
+ significant figures required 14.42
+ decimal places required 16.86
+
+*/
+
+static double psics_data[23] = {
+ -.038057080835217922,
+ .491415393029387130,
+ -.056815747821244730,
+ .008357821225914313,
+ -.001333232857994342,
+ .000220313287069308,
+ -.000037040238178456,
+ .000006283793654854,
+ -.000001071263908506,
+ .000000183128394654,
+ -.000000031353509361,
+ .000000005372808776,
+ -.000000000921168141,
+ .000000000157981265,
+ -.000000000027098646,
+ .000000000004648722,
+ -.000000000000797527,
+ .000000000000136827,
+ -.000000000000023475,
+ .000000000000004027,
+ -.000000000000000691,
+ .000000000000000118,
+ -.000000000000000020
+};
+static cheb_series psi_cs = {
+ psics_data,
+ 22,
+ -1, 1,
+ 17
+};
+
+static double apsics_data[16] = {
+ -.0204749044678185,
+ -.0101801271534859,
+ .0000559718725387,
+ -.0000012917176570,
+ .0000000572858606,
+ -.0000000038213539,
+ .0000000003397434,
+ -.0000000000374838,
+ .0000000000048990,
+ -.0000000000007344,
+ .0000000000001233,
+ -.0000000000000228,
+ .0000000000000045,
+ -.0000000000000009,
+ .0000000000000002,
+ -.0000000000000000
+};
+static cheb_series apsi_cs = {
+ apsics_data,
+ 15,
+ -1, 1,
+ 9
+};
+
+#define PSI_TABLE_NMAX 100
+static double psi_table[PSI_TABLE_NMAX+1] = {
+ 0.0, /* Infinity */ /* psi(0) */
+ -M_EULER, /* psi(1) */
+ 0.42278433509846713939348790992, /* ... */
+ 0.92278433509846713939348790992,
+ 1.25611766843180047272682124325,
+ 1.50611766843180047272682124325,
+ 1.70611766843180047272682124325,
+ 1.87278433509846713939348790992,
+ 2.01564147795560999653634505277,
+ 2.14064147795560999653634505277,
+ 2.25175258906672110764745616389,
+ 2.35175258906672110764745616389,
+ 2.44266167997581201673836525479,
+ 2.52599501330914535007169858813,
+ 2.60291809023222227314862166505,
+ 2.67434666166079370172005023648,
+ 2.74101332832746036838671690315,
+ 2.80351332832746036838671690315,
+ 2.86233685773922507426906984432,
+ 2.91789241329478062982462539988,
+ 2.97052399224214905087725697883,
+ 3.02052399224214905087725697883,
+ 3.06814303986119666992487602645,
+ 3.11359758531574212447033057190,
+ 3.15707584618530734186163491973,
+ 3.1987425128519740085283015864,
+ 3.2387425128519740085283015864,
+ 3.2772040513135124700667631249,
+ 3.3142410883505495071038001619,
+ 3.3499553740648352213895144476,
+ 3.3844381326855248765619282407,
+ 3.4177714660188582098952615740,
+ 3.4500295305349872421533260902,
+ 3.4812795305349872421533260902,
+ 3.5115825608380175451836291205,
+ 3.5409943255438998981248055911,
+ 3.5695657541153284695533770196,
+ 3.5973435318931062473311547974,
+ 3.6243705589201332743581818244,
+ 3.6506863483938174848844976139,
+ 3.6763273740348431259101386396,
+ 3.7013273740348431259101386396,
+ 3.7257176179372821503003825420,
+ 3.7495271417468059598241920658,
+ 3.7727829557002943319172153216,
+ 3.7955102284275670591899425943,
+ 3.8177324506497892814121648166,
+ 3.8394715810845718901078169905,
+ 3.8607481768292527411716467777,
+ 3.8815815101625860745049801110,
+ 3.9019896734278921969539597029,
+ 3.9219896734278921969539597029,
+ 3.9415975165651470989147440166,
+ 3.9608282857959163296839747858,
+ 3.9796962103242182164764276160,
+ 3.9982147288427367349949461345,
+ 4.0163965470245549168131279527,
+ 4.0342536898816977739559850956,
+ 4.0517975495308205809735289552,
+ 4.0690389288411654085597358518,
+ 4.0859880813835382899156680552,
+ 4.1026547480502049565823347218,
+ 4.1190481906731557762544658694,
+ 4.1351772229312202923834981274,
+ 4.1510502388042361653993711433,
+ 4.1666752388042361653993711433,
+ 4.1820598541888515500147557587,
+ 4.1972113693403667015299072739,
+ 4.2121367424746950597388624977,
+ 4.2268426248276362362094507330,
+ 4.2413353784508246420065521823,
+ 4.2556210927365389277208378966,
+ 4.2697055997787924488475984600,
+ 4.2835944886676813377364873489,
+ 4.2972931188046676391063503626,
+ 4.3108066323181811526198638761,
+ 4.3241399656515144859531972094,
+ 4.3372978603883565912163551041,
+ 4.3502848733753695782293421171,
+ 4.3631053861958823987421626300,
+ 4.3757636140439836645649474401,
+ 4.3882636140439836645649474401,
+ 4.4006092930563293435772931191,
+ 4.4128044150075488557724150703,
+ 4.4248526077786331931218126607,
+ 4.4367573696833950978837174226,
+ 4.4485220755657480390601880108,
+ 4.4601499825424922251066996387,
+ 4.4716442354160554434975042364,
+ 4.4830078717796918071338678728,
+ 4.4942438268358715824147667492,
+ 4.5053549379469826935258778603,
+ 4.5163439489359936825368668713,
+ 4.5272135141533849868846929582,
+ 4.5379662023254279976373811303,
+ 4.5486045001977684231692960239,
+ 4.5591308159872421073798223397,
+ 4.5695474826539087740464890064,
+ 4.5798567610044242379640147796,
+ 4.5900608426370772991885045755,
+ 4.6001618527380874001986055856
+};
+
+
+#define PSI_1_TABLE_NMAX 100
+static double psi_1_table[PSI_1_TABLE_NMAX+1] = {
+ 0.0, /* Infinity */ /* psi(1,0) */
+ M_PI*M_PI/6.0, /* psi(1,1) */
+ 0.644934066848226436472415, /* ... */
+ 0.394934066848226436472415,
+ 0.2838229557371153253613041,
+ 0.2213229557371153253613041,
+ 0.1813229557371153253613041,
+ 0.1535451779593375475835263,
+ 0.1331370146940314251345467,
+ 0.1175120146940314251345467,
+ 0.1051663356816857461222010,
+ 0.0951663356816857461222010,
+ 0.0869018728717683907503002,
+ 0.0799574284273239463058557,
+ 0.0740402686640103368384001,
+ 0.0689382278476838062261552,
+ 0.0644937834032393617817108,
+ 0.0605875334032393617817108,
+ 0.0571273257907826143768665,
+ 0.0540409060376961946237801,
+ 0.0512708229352031198315363,
+ 0.0487708229352031198315363,
+ 0.0465032492390579951149830,
+ 0.0444371335365786562720078,
+ 0.0425467743683366902984728,
+ 0.0408106632572255791873617,
+ 0.0392106632572255791873617,
+ 0.0377313733163971768204978,
+ 0.0363596312039143235969038,
+ 0.0350841209998326909438426,
+ 0.0338950603577399442137594,
+ 0.0327839492466288331026483,
+ 0.0317433665203020901265817,
+ 0.03076680402030209012658168,
+ 0.02984853037475571730748159,
+ 0.02898347847164153045627052,
+ 0.02816715194102928555831133,
+ 0.02739554700275768062003973,
+ 0.02666508681283803124093089,
+ 0.02597256603721476254286995,
+ 0.02531510384129102815759710,
+ 0.02469010384129102815759710,
+ 0.02409521984367056414807896,
+ 0.02352832641963428296894063,
+ 0.02298749353699501850166102,
+ 0.02247096461137518379091722,
+ 0.02197713745088135663042339,
+ 0.02150454765882086513703965,
+ 0.02105185413233829383780923,
+ 0.02061782635456051606003145,
+ 0.02020133322669712580597065,
+ 0.01980133322669712580597065,
+ 0.01941686571420193164987683,
+ 0.01904704322899483105816086,
+ 0.01869104465298913508094477,
+ 0.01834810912486842177504628,
+ 0.01801753061247172756017024,
+ 0.01769865306145131939690494,
+ 0.01739086605006319997554452,
+ 0.01709360088954001329302371,
+ 0.01680632711763538818529605,
+ 0.01652854933985761040751827,
+ 0.01625980437882562975715546,
+ 0.01599965869724394401313881,
+ 0.01574770606433893015574400,
+ 0.01550356543933893015574400,
+ 0.01526687904880638577704578,
+ 0.01503731063741979257227076,
+ 0.01481454387422086185273411,
+ 0.01459828089844231513993134,
+ 0.01438824099085987447620523,
+ 0.01418415935820681325171544,
+ 0.01398578601958352422176106,
+ 0.01379288478501562298719316,
+ 0.01360523231738567365335942,
+ 0.01342261726990576130858221,
+ 0.01324483949212798353080444,
+ 0.01307170929822216635628920,
+ 0.01290304679189732236910755,
+ 0.01273868124291638877278934,
+ 0.01257845051066194236996928,
+ 0.01242220051066194236996928,
+ 0.01226978472038606978956995,
+ 0.01212106372098095378719041,
+ 0.01197590477193174490346273,
+ 0.01183418141592267460867815,
+ 0.01169577311142440471248438,
+ 0.01156056489076458859566448,
+ 0.01142844704164317229232189,
+ 0.01129931481023821361463594,
+ 0.01117306812421372175754719,
+ 0.01104961133409026496742374,
+ 0.01092885297157366069257770,
+ 0.01081070552355853781923177,
+ 0.01069508522063334415522437,
+ 0.01058191183901270133041676,
+ 0.01047110851491297833872701,
+ 0.01036260157046853389428257,
+ 0.01025632035036012704977199, /* ... */
+ 0.01015219706839427948625679, /* psi(1,99) */
+ 0.01005016666333357139524567 /* psi(1,100) */
+};
+
+
+/* digamma for x both positive and negative; we do both
+ * cases here because of the way we use even/odd parts
+ * of the function
+ */
+static int
+psi_x(const double x, gsl_sf_result * result)
+{
+ const double y = fabs(x);
+
+ if(x == 0.0 || x == -1.0 || x == -2.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(y >= 2.0) {
+ const double t = 8.0/(y*y)-1.0;
+ gsl_sf_result result_c;
+ cheb_eval_e(&apsi_cs, t, &result_c);
+ if(x < 0.0) {
+ const double s = sin(M_PI*x);
+ const double c = cos(M_PI*x);
+ if(fabs(s) < 2.0*GSL_SQRT_DBL_MIN) {
+ DOMAIN_ERROR(result);
+ }
+ else {
+ result->val = log(y) - 0.5/x + result_c.val - M_PI * c/s;
+ result->err = M_PI*fabs(x)*GSL_DBL_EPSILON/(s*s);
+ result->err += result_c.err;
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ }
+ else {
+ result->val = log(y) - 0.5/x + result_c.val;
+ result->err = result_c.err;
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ }
+ else { /* -2 < x < 2 */
+ gsl_sf_result result_c;
+
+ if(x < -1.0) { /* x = -2 + v */
+ const double v = x + 2.0;
+ const double t1 = 1.0/x;
+ const double t2 = 1.0/(x+1.0);
+ const double t3 = 1.0/v;
+ cheb_eval_e(&psi_cs, 2.0*v-1.0, &result_c);
+
+ result->val = -(t1 + t2 + t3) + result_c.val;
+ result->err = GSL_DBL_EPSILON * (fabs(t1) + fabs(x/(t2*t2)) + fabs(x/(t3*t3)));
+ result->err += result_c.err;
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x < 0.0) { /* x = -1 + v */
+ const double v = x + 1.0;
+ const double t1 = 1.0/x;
+ const double t2 = 1.0/v;
+ cheb_eval_e(&psi_cs, 2.0*v-1.0, &result_c);
+
+ result->val = -(t1 + t2) + result_c.val;
+ result->err = GSL_DBL_EPSILON * (fabs(t1) + fabs(x/(t2*t2)));
+ result->err += result_c.err;
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x < 1.0) { /* x = v */
+ const double t1 = 1.0/x;
+ cheb_eval_e(&psi_cs, 2.0*x-1.0, &result_c);
+
+ result->val = -t1 + result_c.val;
+ result->err = GSL_DBL_EPSILON * t1;
+ result->err += result_c.err;
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else { /* x = 1 + v */
+ const double v = x - 1.0;
+ return cheb_eval_e(&psi_cs, 2.0*v-1.0, result);
+ }
+ }
+}
+
+
+/* psi(z) for large |z| in the right half-plane; [Abramowitz + Stegun, 6.3.18] */
+static
+gsl_complex
+psi_complex_asymp(gsl_complex z)
+{
+ /* coefficients in the asymptotic expansion for large z;
+ * let w = z^(-2) and write the expression in the form
+ *
+ * ln(z) - 1/(2z) - 1/12 w (1 + c1 w + c2 w + c3 w + ... )
+ */
+ static const double c1 = -0.1;
+ static const double c2 = 1.0/21.0;
+ static const double c3 = -0.05;
+
+ gsl_complex zi = gsl_complex_inverse(z);
+ gsl_complex w = gsl_complex_mul(zi, zi);
+ gsl_complex cs;
+
+ /* Horner method evaluation of term in parentheses */
+ gsl_complex sum;
+ sum = gsl_complex_mul_real(w, c3/c2);
+ sum = gsl_complex_add_real(sum, 1.0);
+ sum = gsl_complex_mul_real(sum, c2/c1);
+ sum = gsl_complex_mul(sum, w);
+ sum = gsl_complex_add_real(sum, 1.0);
+ sum = gsl_complex_mul_real(sum, c1);
+ sum = gsl_complex_mul(sum, w);
+ sum = gsl_complex_add_real(sum, 1.0);
+
+ /* correction added to log(z) */
+ cs = gsl_complex_mul(sum, w);
+ cs = gsl_complex_mul_real(cs, -1.0/12.0);
+ cs = gsl_complex_add(cs, gsl_complex_mul_real(zi, -0.5));
+
+ return gsl_complex_add(gsl_complex_log(z), cs);
+}
+
+
+
+/* psi(z) for complex z in the right half-plane */
+static int
+psi_complex_rhp(
+ gsl_complex z,
+ gsl_sf_result * result_re,
+ gsl_sf_result * result_im
+ )
+{
+ int n_recurse = 0;
+ int i;
+ gsl_complex a;
+
+ if(GSL_REAL(z) == 0.0 && GSL_IMAG(z) == 0.0)
+ {
+ result_re->val = 0.0;
+ result_im->val = 0.0;
+ result_re->err = 0.0;
+ result_im->err = 0.0;
+ return GSL_EDOM;
+ }
+
+ /* compute the number of recurrences to apply */
+ if(GSL_REAL(z) < 20.0 && fabs(GSL_IMAG(z)) < 20.0)
+ {
+ const double sp = sqrt(20.0 + GSL_IMAG(z));
+ const double sn = sqrt(20.0 - GSL_IMAG(z));
+ const double rhs = sp*sn - GSL_REAL(z);
+ if(rhs > 0.0) n_recurse = ceil(rhs);
+ }
+
+ /* compute asymptotic at the large value z + n_recurse */
+ a = psi_complex_asymp(gsl_complex_add_real(z, n_recurse));
+
+ /* descend recursively, if necessary */
+ for(i = n_recurse; i >= 1; --i)
+ {
+ gsl_complex zn = gsl_complex_add_real(z, i - 1.0);
+ gsl_complex zn_inverse = gsl_complex_inverse(zn);
+ a = gsl_complex_sub(a, zn_inverse);
+ }
+
+ result_re->val = GSL_REAL(a);
+ result_im->val = GSL_IMAG(a);
+ result_re->err = 2.0 * (1.0 + n_recurse) * GSL_DBL_EPSILON * fabs(result_re->val);
+ result_im->err = 2.0 * (1.0 + n_recurse) * GSL_DBL_EPSILON * fabs(result_im->val);
+
+ return GSL_SUCCESS;
+}
+
+
+
+/* generic polygamma; assumes n >= 0 and x > 0
+ */
+static int
+psi_n_xg0(const int n, const double x, gsl_sf_result * result)
+{
+ if(n == 0) {
+ return gsl_sf_psi_e(x, result);
+ }
+ else {
+ /* Abramowitz + Stegun 6.4.10 */
+ gsl_sf_result ln_nf;
+ gsl_sf_result hzeta;
+ int stat_hz = gsl_sf_hzeta_e(n+1.0, x, &hzeta);
+ int stat_nf = gsl_sf_lnfact_e((unsigned int) n, &ln_nf);
+ int stat_e = gsl_sf_exp_mult_err_e(ln_nf.val, ln_nf.err,
+ hzeta.val, hzeta.err,
+ result);
+ if(GSL_IS_EVEN(n)) result->val = -result->val;
+ return GSL_ERROR_SELECT_3(stat_e, stat_nf, stat_hz);
+ }
+}
+
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int gsl_sf_psi_int_e(const int n, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(n <= 0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(n <= PSI_TABLE_NMAX) {
+ result->val = psi_table[n];
+ result->err = GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ /* Abramowitz+Stegun 6.3.18 */
+ const double c2 = -1.0/12.0;
+ const double c3 = 1.0/120.0;
+ const double c4 = -1.0/252.0;
+ const double c5 = 1.0/240.0;
+ const double ni2 = (1.0/n)*(1.0/n);
+ const double ser = ni2 * (c2 + ni2 * (c3 + ni2 * (c4 + ni2*c5)));
+ result->val = log(n) - 0.5/n + ser;
+ result->err = GSL_DBL_EPSILON * (fabs(log(n)) + fabs(0.5/n) + fabs(ser));
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+}
+
+
+int gsl_sf_psi_e(const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+ return psi_x(x, result);
+}
+
+
+int
+gsl_sf_psi_1piy_e(const double y, gsl_sf_result * result)
+{
+ const double ay = fabs(y);
+
+ /* CHECK_POINTER(result) */
+
+ if(ay > 1000.0) {
+ /* [Abramowitz+Stegun, 6.3.19] */
+ const double yi2 = 1.0/(ay*ay);
+ const double lny = log(ay);
+ const double sum = yi2 * (1.0/12.0 + 1.0/120.0 * yi2 + 1.0/252.0 * yi2*yi2);
+ result->val = lny + sum;
+ result->err = 2.0 * GSL_DBL_EPSILON * (fabs(lny) + fabs(sum));
+ return GSL_SUCCESS;
+ }
+ else if(ay > 10.0) {
+ /* [Abramowitz+Stegun, 6.3.19] */
+ const double yi2 = 1.0/(ay*ay);
+ const double lny = log(ay);
+ const double sum = yi2 * (1.0/12.0 +
+ yi2 * (1.0/120.0 +
+ yi2 * (1.0/252.0 +
+ yi2 * (1.0/240.0 +
+ yi2 * (1.0/132.0 + 691.0/32760.0 * yi2)))));
+ result->val = lny + sum;
+ result->err = 2.0 * GSL_DBL_EPSILON * (fabs(lny) + fabs(sum));
+ return GSL_SUCCESS;
+ }
+ else if(ay > 1.0){
+ const double y2 = ay*ay;
+ const double x = (2.0*ay - 11.0)/9.0;
+ const double v = y2*(1.0/(1.0+y2) + 0.5/(4.0+y2));
+ gsl_sf_result result_c;
+ cheb_eval_e(&r1py_cs, x, &result_c);
+ result->val = result_c.val - M_EULER + v;
+ result->err = result_c.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * (fabs(v) + M_EULER + fabs(result_c.val));
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ result->err *= 5.0; /* FIXME: losing a digit somewhere... maybe at x=... ? */
+ return GSL_SUCCESS;
+ }
+ else {
+ /* [Abramowitz+Stegun, 6.3.17]
+ *
+ * -M_EULER + y^2 Sum[1/n 1/(n^2 + y^2), {n,1,M}]
+ * + Sum[1/n^3, {n,M+1,Infinity}]
+ * - y^2 Sum[1/n^5, {n,M+1,Infinity}]
+ * + y^4 Sum[1/n^7, {n,M+1,Infinity}]
+ * - y^6 Sum[1/n^9, {n,M+1,Infinity}]
+ * + O(y^8)
+ *
+ * We take M=50 for at least 15 digit precision.
+ */
+ const int M = 50;
+ const double y2 = y*y;
+ const double c0 = 0.00019603999466879846570;
+ const double c2 = 3.8426659205114376860e-08;
+ const double c4 = 1.0041592839497643554e-11;
+ const double c6 = 2.9516743763500191289e-15;
+ const double p = c0 + y2 *(-c2 + y2*(c4 - y2*c6));
+ double sum = 0.0;
+ double v;
+
+ int n;
+ for(n=1; n<=M; n++) {
+ sum += 1.0/(n * (n*n + y*y));
+ }
+
+ v = y2 * (sum + p);
+ result->val = -M_EULER + v;
+ result->err = GSL_DBL_EPSILON * (M_EULER + fabs(v));
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+}
+
+
+int gsl_sf_psi_1_int_e(const int n, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+ if(n <= 0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(n <= PSI_1_TABLE_NMAX) {
+ result->val = psi_1_table[n];
+ result->err = GSL_DBL_EPSILON * result->val;
+ return GSL_SUCCESS;
+ }
+ else {
+ /* Abramowitz+Stegun 6.4.12
+ * double-precision for n > 100
+ */
+ const double c0 = -1.0/30.0;
+ const double c1 = 1.0/42.0;
+ const double c2 = -1.0/30.0;
+ const double ni2 = (1.0/n)*(1.0/n);
+ const double ser = ni2*ni2 * (c0 + ni2*(c1 + c2*ni2));
+ result->val = (1.0 + 0.5/n + 1.0/(6.0*n*n) + ser) / n;
+ result->err = GSL_DBL_EPSILON * result->val;
+ return GSL_SUCCESS;
+ }
+}
+
+
+int gsl_sf_psi_1_e(const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x == 0.0 || x == -1.0 || x == -2.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x > 0.0)
+ {
+ return psi_n_xg0(1, x, result);
+ }
+ else if(x > -5.0)
+ {
+ /* Abramowitz + Stegun 6.4.6 */
+ int M = -floor(x);
+ double fx = x + M;
+ double sum = 0.0;
+ int m;
+
+ if(fx == 0.0)
+ DOMAIN_ERROR(result);
+
+ for(m = 0; m < M; ++m)
+ sum += 1.0/((x+m)*(x+m));
+
+ {
+ int stat_psi = psi_n_xg0(1, fx, result);
+ result->val += sum;
+ result->err += M * GSL_DBL_EPSILON * sum;
+ return stat_psi;
+ }
+ }
+ else
+ {
+ /* Abramowitz + Stegun 6.4.7 */
+ const double sin_px = sin(M_PI * x);
+ const double d = M_PI*M_PI/(sin_px*sin_px);
+ gsl_sf_result r;
+ int stat_psi = psi_n_xg0(1, 1.0-x, &r);
+ result->val = d - r.val;
+ result->err = r.err + 2.0*GSL_DBL_EPSILON*d;
+ return stat_psi;
+ }
+}
+
+
+int gsl_sf_psi_n_e(const int n, const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(n == 0)
+ {
+ return gsl_sf_psi_e(x, result);
+ }
+ else if(n == 1)
+ {
+ return gsl_sf_psi_1_e(x, result);
+ }
+ else if(n < 0 || x <= 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else {
+ gsl_sf_result ln_nf;
+ gsl_sf_result hzeta;
+ int stat_hz = gsl_sf_hzeta_e(n+1.0, x, &hzeta);
+ int stat_nf = gsl_sf_lnfact_e((unsigned int) n, &ln_nf);
+ int stat_e = gsl_sf_exp_mult_err_e(ln_nf.val, ln_nf.err,
+ hzeta.val, hzeta.err,
+ result);
+ if(GSL_IS_EVEN(n)) result->val = -result->val;
+ return GSL_ERROR_SELECT_3(stat_e, stat_nf, stat_hz);
+ }
+}
+
+
+int
+gsl_sf_complex_psi_e(
+ const double x,
+ const double y,
+ gsl_sf_result * result_re,
+ gsl_sf_result * result_im
+ )
+{
+ if(x >= 0.0)
+ {
+ gsl_complex z = gsl_complex_rect(x, y);
+ return psi_complex_rhp(z, result_re, result_im);
+ }
+ else
+ {
+ /* reflection formula [Abramowitz+Stegun, 6.3.7] */
+ gsl_complex z = gsl_complex_rect(x, y);
+ gsl_complex omz = gsl_complex_rect(1.0 - x, -y);
+ gsl_complex zpi = gsl_complex_mul_real(z, M_PI);
+ gsl_complex cotzpi = gsl_complex_cot(zpi);
+ int ret_val = psi_complex_rhp(omz, result_re, result_im);
+
+ if(GSL_IS_REAL(GSL_REAL(cotzpi)) && GSL_IS_REAL(GSL_IMAG(cotzpi)))
+ {
+ result_re->val -= M_PI * GSL_REAL(cotzpi);
+ result_im->val -= M_PI * GSL_IMAG(cotzpi);
+ return ret_val;
+ }
+ else
+ {
+ GSL_ERROR("singularity", GSL_EDOM);
+ }
+ }
+}
+
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_psi_int(const int n)
+{
+ EVAL_RESULT(gsl_sf_psi_int_e(n, &result));
+}
+
+double gsl_sf_psi(const double x)
+{
+ EVAL_RESULT(gsl_sf_psi_e(x, &result));
+}
+
+double gsl_sf_psi_1piy(const double x)
+{
+ EVAL_RESULT(gsl_sf_psi_1piy_e(x, &result));
+}
+
+double gsl_sf_psi_1_int(const int n)
+{
+ EVAL_RESULT(gsl_sf_psi_1_int_e(n, &result));
+}
+
+double gsl_sf_psi_1(const double x)
+{
+ EVAL_RESULT(gsl_sf_psi_1_e(x, &result));
+}
+
+double gsl_sf_psi_n(const int n, const double x)
+{
+ EVAL_RESULT(gsl_sf_psi_n_e(n, x, &result));
+}
diff --git a/gsl-1.9/specfunc/recurse.h b/gsl-1.9/specfunc/recurse.h
new file mode 100644
index 0000000..75ce9bc
--- /dev/null
+++ b/gsl-1.9/specfunc/recurse.h
@@ -0,0 +1,125 @@
+/* specfunc/recurse.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#ifndef _RECURSE_H_
+#define _RECURSE_H_
+
+#define CONCAT(a,b) a ## _ ## b
+
+
+/* n_max >= n_min + 2
+ * f[n+1] + a[n] f[n] + b[n] f[n-1] = 0
+ *
+ * Trivial forward recurrence.
+ */
+#define GEN_RECURSE_FORWARD_SIMPLE(func) \
+int CONCAT(recurse_forward_simple, func) ( \
+ const int n_max, const int n_min, \
+ const double parameters[], \
+ const double f_n_min, \
+ const double f_n_min_p1, \
+ double * f, \
+ double * f_n_max \
+ ) \
+{ \
+ int n; \
+ \
+ if(f == 0) { \
+ double f2 = f_n_min; \
+ double f1 = f_n_min_p1; \
+ double f0; \
+ for(n=n_min+2; n<=n_max; n++) { \
+ f0 = -REC_COEFF_A(n-1,parameters) * f1 - REC_COEFF_B(n-1, parameters) * f2; \
+ f2 = f1; \
+ f1 = f0; \
+ } \
+ *f_n_max = f0; \
+ } \
+ else { \
+ f[n_min] = f_n_min; \
+ f[n_min + 1] = f_n_min_p1; \
+ for(n=n_min+2; n<=n_max; n++) { \
+ f[n] = -REC_COEFF_A(n-1,parameters) * f[n-1] - REC_COEFF_B(n-1, parameters) * f[n-2]; \
+ } \
+ *f_n_max = f[n_max]; \
+ } \
+ \
+ return GSL_SUCCESS; \
+} \
+
+
+/* n_start >= n_max >= n_min
+ * f[n+1] + a[n] f[n] + b[n] f[n-1] = 0
+ *
+ * Generate the minimal solution of the above recursion relation,
+ * with the simplest form of the normalization condition, f[n_min] given.
+ * [Gautschi, SIAM Rev. 9, 24 (1967); (3.9) with s[n]=0]
+ */
+#define GEN_RECURSE_BACKWARD_MINIMAL_SIMPLE(func) \
+int CONCAT(recurse_backward_minimal_simple, func) ( \
+ const int n_start, \
+ const int n_max, const int n_min, \
+ const double parameters[], \
+ const double f_n_min, \
+ double * f, \
+ double * f_n_max \
+ ) \
+{ \
+ int n; \
+ double r_n = 0.; \
+ double r_nm1; \
+ double ratio; \
+ \
+ for(n=n_start; n > n_max; n--) { \
+ r_nm1 = -REC_COEFF_B(n, parameters) / (REC_COEFF_A(n, parameters) + r_n); \
+ r_n = r_nm1; \
+ } \
+ \
+ if(f != 0) { \
+ f[n_max] = 10.*DBL_MIN; \
+ for(n=n_max; n > n_min; n--) { \
+ r_nm1 = -REC_COEFF_B(n, parameters) / (REC_COEFF_A(n, parameters) + r_n); \
+ f[n-1] = f[n] / r_nm1; \
+ r_n = r_nm1; \
+ } \
+ ratio = f_n_min / f[n_min]; \
+ for(n=n_min; n<=n_max; n++) { \
+ f[n] *= ratio; \
+ } \
+ } \
+ else { \
+ double f_nm1; \
+ double f_n = 10.*DBL_MIN; \
+ *f_n_max = f_n; \
+ for(n=n_max; n > n_min; n--) { \
+ r_nm1 = -REC_COEFF_B(n, parameters) / (REC_COEFF_A(n, parameters) + r_n); \
+ f_nm1 = f_n / r_nm1; \
+ r_n = r_nm1; \
+ } \
+ ratio = f_n_min / f_nm1; \
+ *f_n_max *= ratio; \
+ } \
+ \
+ return GSL_SUCCESS; \
+} \
+
+
+#endif /* !_RECURSE_H_ */
diff --git a/gsl-1.9/specfunc/result.c b/gsl-1.9/specfunc/result.c
new file mode 100644
index 0000000..43ff3bb
--- /dev/null
+++ b/gsl-1.9/specfunc/result.c
@@ -0,0 +1,89 @@
+/* specfunc/result.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_exp.h>
+#include <gsl/gsl_sf_result.h>
+
+
+int
+gsl_sf_result_smash_e(const gsl_sf_result_e10 * re, gsl_sf_result * r)
+{
+ if(re->e10 == 0) {
+ /* nothing to smash */
+ r->val = re->val;
+ r->err = re->err;
+ return GSL_SUCCESS;
+ }
+ else {
+ const double av = fabs(re->val);
+ const double ae = fabs(re->err);
+
+ if( GSL_SQRT_DBL_MIN < av && av < GSL_SQRT_DBL_MAX
+ && GSL_SQRT_DBL_MIN < ae && ae < GSL_SQRT_DBL_MAX
+ && 0.49*GSL_LOG_DBL_MIN < re->e10 && re->e10 < 0.49*GSL_LOG_DBL_MAX
+ ) {
+ const double scale = exp(re->e10 * M_LN10);
+ r->val = re->val * scale;
+ r->err = re->err * scale;
+ return GSL_SUCCESS;
+ }
+ else {
+ return gsl_sf_exp_mult_err_e(re->e10*M_LN10, 0.0, re->val, re->err, r);
+ }
+ }
+/*
+ int stat_v;
+ int stat_e;
+
+ if(re->val == 0.0) {
+ r->val = 0.0;
+ stat_v = GSL_SUCCESS;
+ }
+ else {
+ gsl_sf_result r_val;
+ const double s = GSL_SIGN(re->val);
+ const double x_v = re->e10*M_LN10 + log(fabs(re->val));
+ stat_v = gsl_sf_exp_e(x_v, &r_val);
+ r->val = s * r_val.val;
+ }
+
+ if(re->err == 0.0) {
+ r->err = 0.0;
+ stat_e = GSL_SUCCESS;
+ }
+ else if(re->val != 0.0) {
+ r->err = fabs(r->val * re->err/re->val);
+ stat_e = GSL_SUCCESS;
+ }
+ else {
+ gsl_sf_result r_err;
+ const double x_e = re->e10*M_LN10 + log(fabs(re->err));
+ stat_e = gsl_sf_exp_e(x_e, &r_err);
+ r->err = r_err.val;
+ }
+
+ return GSL_ERROR_SELECT_2(stat_v, stat_e);
+*/
+}
+
diff --git a/gsl-1.9/specfunc/shint.c b/gsl-1.9/specfunc/shint.c
new file mode 100644
index 0000000..24deffc
--- /dev/null
+++ b/gsl-1.9/specfunc/shint.c
@@ -0,0 +1,135 @@
+/* specfunc/shint.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_expint.h>
+
+#include "error.h"
+
+#include "chebyshev.h"
+#include "cheb_eval.c"
+
+/*-*-*-*-*-*-*-*-*-*-*-* Private Section *-*-*-*-*-*-*-*-*-*-*-*/
+
+/* based on SLATEC shi.f, W. Fullerton
+
+ series for shi on the interval 0.00000e+00 to 1.40625e-01
+ with weighted error 4.67e-20
+ log weighted error 19.33
+ significant figures required 17.07
+ decimal places required 19.75
+*/
+static double shi_data[7] = {
+ 0.0078372685688900950695,
+ 0.0039227664934234563973,
+ 0.0000041346787887617267,
+ 0.0000000024707480372883,
+ 0.0000000000009379295591,
+ 0.0000000000000002451817,
+ 0.0000000000000000000467
+};
+static cheb_series shi_cs = {
+ shi_data,
+ 6,
+ -1, 1,
+ 6
+};
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int gsl_sf_Shi_e(const double x, gsl_sf_result * result)
+{
+ const double xsml = GSL_SQRT_DBL_EPSILON; /* sqrt (r1mach(3)) */
+ const double ax = fabs(x);
+
+ if(ax < xsml) {
+ result->val = x;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(ax <= 0.375) {
+ gsl_sf_result result_c;
+ cheb_eval_e(&shi_cs, 128.0*x*x/9.0-1.0, &result_c);
+ result->val = x * (1.0 + result_c.val);
+ result->err = x * result_c.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ gsl_sf_result result_Ei;
+ gsl_sf_result result_E1;
+ int status_Ei = gsl_sf_expint_Ei_e(x, &result_Ei);
+ int status_E1 = gsl_sf_expint_E1_e(x, &result_E1);
+ result->val = 0.5*(result_Ei.val + result_E1.val);
+ result->err = 0.5*(result_Ei.err + result_E1.err);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ if(status_Ei == GSL_EUNDRFLW && status_E1 == GSL_EUNDRFLW) {
+ GSL_ERROR ("underflow", GSL_EUNDRFLW);
+ }
+ else if(status_Ei == GSL_EOVRFLW || status_E1 == GSL_EOVRFLW) {
+ GSL_ERROR ("overflow", GSL_EOVRFLW);
+ }
+ else {
+ return GSL_SUCCESS;
+ }
+ }
+}
+
+
+int gsl_sf_Chi_e(const double x, gsl_sf_result * result)
+{
+ gsl_sf_result result_Ei;
+ gsl_sf_result result_E1;
+ int status_Ei = gsl_sf_expint_Ei_e(x, &result_Ei);
+ int status_E1 = gsl_sf_expint_E1_e(x, &result_E1);
+ if(status_Ei == GSL_EDOM || status_E1 == GSL_EDOM) {
+ DOMAIN_ERROR(result);
+ }
+ else if(status_Ei == GSL_EUNDRFLW && status_E1 == GSL_EUNDRFLW) {
+ UNDERFLOW_ERROR(result);
+ }
+ else if(status_Ei == GSL_EOVRFLW || status_E1 == GSL_EOVRFLW) {
+ OVERFLOW_ERROR(result);
+ }
+ else {
+ result->val = 0.5 * (result_Ei.val - result_E1.val);
+ result->err = 0.5 * (result_Ei.err + result_E1.err);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+}
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_Shi(const double x)
+{
+ EVAL_RESULT(gsl_sf_Shi_e(x, &result));
+}
+
+double gsl_sf_Chi(const double x)
+{
+ EVAL_RESULT(gsl_sf_Chi_e(x, &result));
+}
diff --git a/gsl-1.9/specfunc/sinint.c b/gsl-1.9/specfunc/sinint.c
new file mode 100644
index 0000000..0d56f12
--- /dev/null
+++ b/gsl-1.9/specfunc/sinint.c
@@ -0,0 +1,402 @@
+/* specfunc/sinint.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_trig.h>
+#include <gsl/gsl_sf_expint.h>
+
+#include "error.h"
+
+#include "chebyshev.h"
+#include "cheb_eval.c"
+
+/*-*-*-*-*-*-*-*-*-*-*-* Private Section *-*-*-*-*-*-*-*-*-*-*-*/
+
+/* based on SLATEC r9sifg.f, W. Fullerton */
+
+/*
+ series for f1 on the interval 2.00000e-02 to 6.25000e-02
+ with weighted error 2.82e-17
+ log weighted error 16.55
+ significant figures required 15.36
+ decimal places required 17.20
+*/
+static double f1_data[20] = {
+ -0.1191081969051363610,
+ -0.0247823144996236248,
+ 0.0011910281453357821,
+ -0.0000927027714388562,
+ 0.0000093373141568271,
+ -0.0000011058287820557,
+ 0.0000001464772071460,
+ -0.0000000210694496288,
+ 0.0000000032293492367,
+ -0.0000000005206529618,
+ 0.0000000000874878885,
+ -0.0000000000152176187,
+ 0.0000000000027257192,
+ -0.0000000000005007053,
+ 0.0000000000000940241,
+ -0.0000000000000180014,
+ 0.0000000000000035063,
+ -0.0000000000000006935,
+ 0.0000000000000001391,
+ -0.0000000000000000282
+};
+static cheb_series f1_cs = {
+ f1_data,
+ 19,
+ -1, 1,
+ 10
+};
+
+/*
+
+ series for f2 on the interval 0.00000e+00 to 2.00000e-02
+ with weighted error 4.32e-17
+ log weighted error 16.36
+ significant figures required 14.75
+ decimal places required 17.10
+*/
+static double f2_data[29] = {
+ -0.0348409253897013234,
+ -0.0166842205677959686,
+ 0.0006752901241237738,
+ -0.0000535066622544701,
+ 0.0000062693421779007,
+ -0.0000009526638801991,
+ 0.0000001745629224251,
+ -0.0000000368795403065,
+ 0.0000000087202677705,
+ -0.0000000022601970392,
+ 0.0000000006324624977,
+ -0.0000000001888911889,
+ 0.0000000000596774674,
+ -0.0000000000198044313,
+ 0.0000000000068641396,
+ -0.0000000000024731020,
+ 0.0000000000009226360,
+ -0.0000000000003552364,
+ 0.0000000000001407606,
+ -0.0000000000000572623,
+ 0.0000000000000238654,
+ -0.0000000000000101714,
+ 0.0000000000000044259,
+ -0.0000000000000019634,
+ 0.0000000000000008868,
+ -0.0000000000000004074,
+ 0.0000000000000001901,
+ -0.0000000000000000900,
+ 0.0000000000000000432
+};
+static cheb_series f2_cs = {
+ f2_data,
+ 28,
+ -1, 1,
+ 14
+};
+
+/*
+
+ series for g1 on the interval 2.00000e-02 to 6.25000e-02
+ with weighted error 5.48e-17
+ log weighted error 16.26
+ significant figures required 15.47
+ decimal places required 16.92
+*/
+static double g1_data[21] = {
+ -0.3040578798253495954,
+ -0.0566890984597120588,
+ 0.0039046158173275644,
+ -0.0003746075959202261,
+ 0.0000435431556559844,
+ -0.0000057417294453025,
+ 0.0000008282552104503,
+ -0.0000001278245892595,
+ 0.0000000207978352949,
+ -0.0000000035313205922,
+ 0.0000000006210824236,
+ -0.0000000001125215474,
+ 0.0000000000209088918,
+ -0.0000000000039715832,
+ 0.0000000000007690431,
+ -0.0000000000001514697,
+ 0.0000000000000302892,
+ -0.0000000000000061400,
+ 0.0000000000000012601,
+ -0.0000000000000002615,
+ 0.0000000000000000548
+};
+static cheb_series g1_cs = {
+ g1_data,
+ 20,
+ -1, 1,
+ 13
+};
+
+/*
+
+ series for g2 on the interval 0.00000e+00 to 2.00000e-02
+ with weighted error 5.01e-17
+ log weighted error 16.30
+ significant figures required 15.12
+ decimal places required 17.07
+*/
+static double g2_data[34] = {
+ -0.0967329367532432218,
+ -0.0452077907957459871,
+ 0.0028190005352706523,
+ -0.0002899167740759160,
+ 0.0000407444664601121,
+ -0.0000071056382192354,
+ 0.0000014534723163019,
+ -0.0000003364116512503,
+ 0.0000000859774367886,
+ -0.0000000238437656302,
+ 0.0000000070831906340,
+ -0.0000000022318068154,
+ 0.0000000007401087359,
+ -0.0000000002567171162,
+ 0.0000000000926707021,
+ -0.0000000000346693311,
+ 0.0000000000133950573,
+ -0.0000000000053290754,
+ 0.0000000000021775312,
+ -0.0000000000009118621,
+ 0.0000000000003905864,
+ -0.0000000000001708459,
+ 0.0000000000000762015,
+ -0.0000000000000346151,
+ 0.0000000000000159996,
+ -0.0000000000000075213,
+ 0.0000000000000035970,
+ -0.0000000000000017530,
+ 0.0000000000000008738,
+ -0.0000000000000004487,
+ 0.0000000000000002397,
+ -0.0000000000000001347,
+ 0.0000000000000000801,
+ -0.0000000000000000501
+};
+static cheb_series g2_cs = {
+ g2_data,
+ 33,
+ -1, 1,
+ 20
+};
+
+
+/* x >= 4.0 */
+static void fg_asymp(const double x, gsl_sf_result * f, gsl_sf_result * g)
+{
+ /*
+ xbig = sqrt (1.0/r1mach(3))
+ xmaxf = exp (amin1(-alog(r1mach(1)), alog(r1mach(2))) - 0.01)
+ xmaxg = 1.0/sqrt(r1mach(1))
+ xbnd = sqrt(50.0)
+ */
+ const double xbig = 1.0/GSL_SQRT_DBL_EPSILON;
+ const double xmaxf = 1.0/GSL_DBL_MIN;
+ const double xmaxg = 1.0/GSL_SQRT_DBL_MIN;
+ const double xbnd = 7.07106781187;
+
+ const double x2 = x*x;
+
+ if(x <= xbnd) {
+ gsl_sf_result result_c1;
+ gsl_sf_result result_c2;
+ cheb_eval_e(&f1_cs, (1.0/x2-0.04125)/0.02125, &result_c1);
+ cheb_eval_e(&g1_cs, (1.0/x2-0.04125)/0.02125, &result_c2);
+ f->val = (1.0 + result_c1.val)/x;
+ g->val = (1.0 + result_c2.val)/x2;
+ f->err = result_c1.err/x + 2.0 * GSL_DBL_EPSILON * fabs(f->val);
+ g->err = result_c2.err/x2 + 2.0 * GSL_DBL_EPSILON * fabs(g->val);
+ }
+ else if(x <= xbig) {
+ gsl_sf_result result_c1;
+ gsl_sf_result result_c2;
+ cheb_eval_e(&f2_cs, 100.0/x2-1.0, &result_c1);
+ cheb_eval_e(&g2_cs, 100.0/x2-1.0, &result_c2);
+ f->val = (1.0 + result_c1.val)/x;
+ g->val = (1.0 + result_c2.val)/x2;
+ f->err = result_c1.err/x + 2.0 * GSL_DBL_EPSILON * fabs(f->val);
+ g->err = result_c2.err/x2 + 2.0 * GSL_DBL_EPSILON * fabs(g->val);
+ }
+ else {
+ f->val = (x < xmaxf ? 1.0/x : 0.0);
+ g->val = (x < xmaxg ? 1.0/x2 : 0.0);
+ f->err = 2.0 * GSL_DBL_EPSILON * fabs(f->val);
+ g->err = 2.0 * GSL_DBL_EPSILON * fabs(g->val);
+ }
+
+ return;
+}
+
+
+/* based on SLATEC si.f, W. Fullerton
+
+ series for si on the interval 0.00000e+00 to 1.60000e+01
+ with weighted error 1.22e-17
+ log weighted error 16.91
+ significant figures required 16.37
+ decimal places required 17.45
+*/
+
+static double si_data[12] = {
+ -0.1315646598184841929,
+ -0.2776578526973601892,
+ 0.0354414054866659180,
+ -0.0025631631447933978,
+ 0.0001162365390497009,
+ -0.0000035904327241606,
+ 0.0000000802342123706,
+ -0.0000000013562997693,
+ 0.0000000000179440722,
+ -0.0000000000001908387,
+ 0.0000000000000016670,
+ -0.0000000000000000122
+};
+
+static cheb_series si_cs = {
+ si_data,
+ 11,
+ -1, 1,
+ 9
+};
+
+/*
+ series for ci on the interval 0.00000e+00 to 1.60000e+01
+ with weighted error 1.94e-18
+ log weighted error 17.71
+ significant figures required 17.74
+ decimal places required 18.27
+*/
+static double ci_data[13] = {
+ -0.34004281856055363156,
+ -1.03302166401177456807,
+ 0.19388222659917082877,
+ -0.01918260436019865894,
+ 0.00110789252584784967,
+ -0.00004157234558247209,
+ 0.00000109278524300229,
+ -0.00000002123285954183,
+ 0.00000000031733482164,
+ -0.00000000000376141548,
+ 0.00000000000003622653,
+ -0.00000000000000028912,
+ 0.00000000000000000194
+};
+static cheb_series ci_cs = {
+ ci_data,
+ 12,
+ -1, 1,
+ 9
+};
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int gsl_sf_Si_e(const double x, gsl_sf_result * result)
+{
+ double ax = fabs(x);
+
+ /* CHECK_POINTER(result) */
+
+ if(ax < GSL_SQRT_DBL_EPSILON) {
+ result->val = x;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(ax <= 4.0) {
+ gsl_sf_result result_c;
+ cheb_eval_e(&si_cs, (x*x-8.0)*0.125, &result_c);
+ result->val = x * (0.75 + result_c.val);
+ result->err = ax * result_c.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ /* Note there is no loss of precision
+ * here bcause of the leading constant.
+ */
+ gsl_sf_result f;
+ gsl_sf_result g;
+ fg_asymp(ax, &f, &g);
+ result->val = 0.5 * M_PI - f.val*cos(ax) - g.val*sin(ax);
+ result->err = f.err + g.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ if(x < 0.0) result->val = -result->val;
+ return GSL_SUCCESS;
+ }
+}
+
+
+int gsl_sf_Ci_e(const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x <= 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x <= 4.0) {
+ const double lx = log(x);
+ const double y = (x*x-8.0)*0.125;
+ gsl_sf_result result_c;
+ cheb_eval_e(&ci_cs, y, &result_c);
+ result->val = lx - 0.5 + result_c.val;
+ result->err = 2.0 * GSL_DBL_EPSILON * (fabs(lx) + 0.5) + result_c.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ gsl_sf_result sin_result;
+ gsl_sf_result cos_result;
+ int stat_sin = gsl_sf_sin_e(x, &sin_result);
+ int stat_cos = gsl_sf_cos_e(x, &cos_result);
+ gsl_sf_result f;
+ gsl_sf_result g;
+ fg_asymp(x, &f, &g);
+ result->val = f.val*sin_result.val - g.val*cos_result.val;
+ result->err = fabs(f.err*sin_result.val);
+ result->err += fabs(g.err*cos_result.val);
+ result->err += fabs(f.val*sin_result.err);
+ result->err += fabs(g.val*cos_result.err);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_ERROR_SELECT_2(stat_sin, stat_cos);
+ }
+}
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_Si(const double x)
+{
+ EVAL_RESULT(gsl_sf_Si_e(x, &result));
+}
+
+double gsl_sf_Ci(const double x)
+{
+ EVAL_RESULT(gsl_sf_Ci_e(x, &result));
+}
diff --git a/gsl-1.9/specfunc/synchrotron.c b/gsl-1.9/specfunc/synchrotron.c
new file mode 100644
index 0000000..d52b7b3
--- /dev/null
+++ b/gsl-1.9/specfunc/synchrotron.c
@@ -0,0 +1,285 @@
+/* specfunc/synchrotron.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_exp.h>
+#include <gsl/gsl_sf_pow_int.h>
+#include <gsl/gsl_sf_synchrotron.h>
+
+#include "error.h"
+
+#include "chebyshev.h"
+#include "cheb_eval.c"
+
+static double synchrotron1_data[13] = {
+ 30.364682982501076273,
+ 17.079395277408394574,
+ 4.560132133545072889,
+ 0.549281246730419979,
+ 0.372976075069301172e-01,
+ 0.161362430201041242e-02,
+ 0.481916772120371e-04,
+ 0.10512425288938e-05,
+ 0.174638504670e-07,
+ 0.22815486544e-09,
+ 0.240443082e-11,
+ 0.2086588e-13,
+ 0.15167e-15
+};
+static cheb_series synchrotron1_cs = {
+ synchrotron1_data,
+ 12,
+ -1.0, 1.0,
+ 9
+};
+
+static double synchrotron2_data[12] = {
+ 0.4490721623532660844,
+ 0.898353677994187218e-01,
+ 0.81044573772151290e-02,
+ 0.4261716991089162e-03,
+ 0.147609631270746e-04,
+ 0.3628633615300e-06,
+ 0.66634807498e-08,
+ 0.949077166e-10,
+ 0.1079125e-11,
+ 0.10022e-13,
+ 0.77e-16,
+ 0.5e-18
+};
+static cheb_series synchrotron2_cs = {
+ synchrotron2_data,
+ 11,
+ -1.0, 1.0,
+ 7
+};
+
+static double synchrotron1a_data[23] = {
+ 2.1329305161355000985,
+ 0.741352864954200240e-01,
+ 0.86968099909964198e-02,
+ 0.11703826248775692e-02,
+ 0.1645105798619192e-03,
+ 0.240201021420640e-04,
+ 0.35827756389389e-05,
+ 0.5447747626984e-06,
+ 0.838802856196e-07,
+ 0.13069882684e-07,
+ 0.2053099071e-08,
+ 0.325187537e-09,
+ 0.517914041e-10,
+ 0.83002988e-11,
+ 0.13352728e-11,
+ 0.2159150e-12,
+ 0.349967e-13,
+ 0.56994e-14,
+ 0.9291e-15,
+ 0.152e-15,
+ 0.249e-16,
+ 0.41e-17,
+ 0.7e-18
+};
+static cheb_series synchrotron1a_cs = {
+ synchrotron1a_data,
+ 22,
+ -1.0, 1.0,
+ 11
+};
+
+static double synchrotron21_data[13] = {
+ 38.617839923843085480,
+ 23.037715594963734597,
+ 5.3802499868335705968,
+ 0.6156793806995710776,
+ 0.406688004668895584e-01,
+ 0.17296274552648414e-02,
+ 0.51061258836577e-04,
+ 0.110459595022e-05,
+ 0.18235530206e-07,
+ 0.2370769803e-09,
+ 0.24887296e-11,
+ 0.21529e-13,
+ 0.156e-15
+};
+static cheb_series synchrotron21_cs = {
+ synchrotron21_data,
+ 12,
+ -1.0, 1.0,
+ 9
+};
+
+static double synchrotron22_data[13] = {
+ 7.9063148270660804288,
+ 3.1353463612853425684,
+ 0.4854879477453714538,
+ 0.394816675827237234e-01,
+ 0.19661622334808802e-02,
+ 0.659078932293042e-04,
+ 0.15857561349856e-05,
+ 0.286865301123e-07,
+ 0.4041202360e-09,
+ 0.45568444e-11,
+ 0.420459e-13,
+ 0.3232e-15,
+ 0.21e-17
+};
+static cheb_series synchrotron22_cs = {
+ synchrotron22_data,
+ 12,
+ -1.0, 1.0,
+ 8
+};
+
+static double synchrotron2a_data[17] = {
+ 2.020337094170713600,
+ 0.10956237121807404e-01,
+ 0.8542384730114676e-03,
+ 0.723430242132822e-04,
+ 0.63124427962699e-05,
+ 0.5648193141174e-06,
+ 0.512832480138e-07,
+ 0.47196532914e-08,
+ 0.4380744214e-09,
+ 0.410268149e-10,
+ 0.38623072e-11,
+ 0.3661323e-12,
+ 0.348023e-13,
+ 0.33301e-14,
+ 0.319e-15,
+ 0.307e-16,
+ 0.3e-17
+};
+static cheb_series synchrotron2a_cs = {
+ synchrotron2a_data,
+ 16,
+ -1.0, 1.0,
+ 8
+};
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int gsl_sf_synchrotron_1_e(const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x < 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x < 2.0*M_SQRT2 * GSL_SQRT_DBL_EPSILON) {
+ /* BJG: added first order correction term. The taylor series
+ is S1(x) = ((4pi)/(sqrt(3)gamma(1/3))) * (x/2)^(1/3)
+ * (1 - (gamma(1/3)/2)*(x/2)^2/3 + (3/4) * (x/2)^2 ....) */
+ double z = pow(x, 1.0/3.0);
+ double cf = 1 - 8.43812762813205e-01 * z * z;
+ result->val = 2.14952824153447863671 * z * cf;
+ result->err = GSL_DBL_EPSILON * result->val;
+ return GSL_SUCCESS;
+ }
+ else if(x <= 4.0) {
+ const double c0 = M_PI/M_SQRT3;
+ const double px = pow(x,1.0/3.0);
+ const double px11 = gsl_sf_pow_int(px,11);
+ const double t = x*x/8.0 - 1.0;
+ gsl_sf_result result_c1;
+ gsl_sf_result result_c2;
+ cheb_eval_e(&synchrotron1_cs, t, &result_c1);
+ cheb_eval_e(&synchrotron2_cs, t, &result_c2);
+ result->val = px * result_c1.val - px11 * result_c2.val - c0 * x;
+ result->err = px * result_c1.err + px11 * result_c2.err + c0 * x * GSL_DBL_EPSILON;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x < -8.0*GSL_LOG_DBL_MIN/7.0) {
+ const double c0 = 0.2257913526447274323630976; /* log(sqrt(pi/2)) */
+ const double t = (12.0 - x) / (x + 4.0);
+ gsl_sf_result result_c1;
+ cheb_eval_e(&synchrotron1a_cs, t, &result_c1);
+ result->val = sqrt(x) * result_c1.val * exp(c0 - x);
+ result->err = 2.0 * GSL_DBL_EPSILON * result->val * (fabs(c0-x)+1.0);
+ return GSL_SUCCESS;
+ }
+ else {
+ UNDERFLOW_ERROR(result);
+ }
+}
+
+
+int gsl_sf_synchrotron_2_e(const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x < 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x < 2.0*M_SQRT2*GSL_SQRT_DBL_EPSILON) {
+ /* BJG: added first order correction term. The taylor series
+ is S2(x) = ((2pi)/(sqrt(3)*gamma(1/3))) * (x/2)^(1/3)
+ * (1 - (gamma(1/3)/gamma(4/3))*(x/2)^(4/3) + (gamma(1/3)/gamma(4/3))*(x/2)^2...) */
+
+ double z = pow(x, 1.0/3.0);
+ double cf = 1 - 1.17767156510235e+00 * z * x;
+ result->val = 1.07476412076723931836 * z * cf ;
+ result->err = 2.0 * GSL_DBL_EPSILON * result->val;
+ return GSL_SUCCESS;
+ }
+ else if(x <= 4.0) {
+ const double px = pow(x, 1.0/3.0);
+ const double px5 = gsl_sf_pow_int(px,5);
+ const double t = x*x/8.0 - 1.0;
+ gsl_sf_result cheb1;
+ gsl_sf_result cheb2;
+ cheb_eval_e(&synchrotron21_cs, t, &cheb1);
+ cheb_eval_e(&synchrotron22_cs, t, &cheb2);
+ result->val = px * cheb1.val - px5 * cheb2.val;
+ result->err = px * cheb1.err + px5 * cheb2.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x < -8.0*GSL_LOG_DBL_MIN/7.0) {
+ const double c0 = 0.22579135264472743236; /* log(sqrt(pi/2)) */
+ const double t = (10.0 - x) / (x + 2.0);
+ gsl_sf_result cheb1;
+ cheb_eval_e(&synchrotron2a_cs, t, &cheb1);
+ result->val = sqrt(x) * exp(c0-x) * cheb1.val;
+ result->err = GSL_DBL_EPSILON * result->val * (fabs(c0-x)+1.0);
+ return GSL_SUCCESS;
+ }
+ else {
+ UNDERFLOW_ERROR(result);
+ }
+}
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_synchrotron_1(const double x)
+{
+ EVAL_RESULT(gsl_sf_synchrotron_1_e(x, &result));
+}
+
+double gsl_sf_synchrotron_2(const double x)
+{
+ EVAL_RESULT(gsl_sf_synchrotron_2_e(x, &result));
+}
diff --git a/gsl-1.9/specfunc/test_airy.c b/gsl-1.9/specfunc/test_airy.c
new file mode 100644
index 0000000..869576c
--- /dev/null
+++ b/gsl-1.9/specfunc/test_airy.c
@@ -0,0 +1,134 @@
+/* specfunc/test_airy.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_sf.h>
+#include "test_sf.h"
+
+
+int test_airy(void)
+{
+ int s = 0;
+ int m = GSL_MODE_DEFAULT;
+ gsl_sf_result r;
+
+ /** functions */
+
+ TEST_SF(s, gsl_sf_airy_Ai_e, (-500.0, m, &r), 0.0725901201040411396, TEST_TOL4, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_Ai_e, (-5.0, m, &r), 0.3507610090241142, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_Ai_e, (-0.3000000000000094, m, &r), 0.4309030952855831, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_Ai_e, (0.6999999999999907, m, &r), 0.1891624003981519, TEST_TOL0, GSL_SUCCESS);
+
+ /* This original value seemed to be slightly inaccurate in the last place.
+ I recomputed it with pari to get the new value which end in 885
+ instead of 882 */
+ /*
+ TEST_SF(s, gsl_sf_airy_Ai_e, (1.649999999999991, m, &r), 0.05831058618720882, TEST_TOL0, GSL_SUCCESS);
+ */
+
+ TEST_SF(s, gsl_sf_airy_Ai_e, (1.649999999999991, m, &r), 0.0583105861872088521, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_airy_Ai_e, (2.54999999999999, m, &r), 0.01446149513295428, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_Ai_e, (3.499999999999987, m, &r), 0.002584098786989702, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_Ai_e, (5.39999999999998, m, &r), 4.272986169411866e-05, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_airy_Ai_scaled_e, (-5.0, m, &r), 0.3507610090241142, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_Ai_scaled_e, (0.6999999999999907, m, &r), 0.2795125667681217, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_Ai_scaled_e, (1.649999999999991, m, &r), 0.2395493001442741, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_Ai_scaled_e, (2.54999999999999, m, &r), 0.2183658595899388, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_Ai_scaled_e, (3.499999999999987, m, &r), 0.2032920808163519, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_Ai_scaled_e, (5.39999999999998, m, &r), 0.1836050093282229, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_airy_Bi_e, (-500.0, m, &r), -0.094688570132991028, TEST_TOL4, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_Bi_e, (-5.0, m, &r), -0.1383691349016005, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_Bi_e, (0.6999999999999907, m, &r), 0.9733286558781599, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_Bi_e, (1.649999999999991, m, &r), 2.196407956850028, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_Bi_e, (2.54999999999999, m, &r), 6.973628612493443, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_Bi_e, (3.499999999999987, m, &r), 33.05550675461069, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_Bi_e, (5.39999999999998, m, &r), 1604.476078241272, TEST_TOL1, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_airy_Bi_scaled_e, (-5.0, m, &r), -0.1383691349016005, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_Bi_scaled_e, (0.6999999999999907, m, &r), 0.6587080754582302, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_Bi_scaled_e, (1.649999999999991, m, &r), 0.5346449995597539, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_Bi_scaled_e, (2.54999999999999, m, &r), 0.461835455542297, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_Bi_scaled_e, (3.499999999999987, m, &r), 0.4201771882353061, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_Bi_scaled_e, (5.39999999999998, m, &r), 0.3734050675720473, TEST_TOL0, GSL_SUCCESS);
+
+
+ /** derivatives */
+
+ TEST_SF(s, gsl_sf_airy_Ai_deriv_e, (-5.0, m, &r), 0.3271928185544435, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_Ai_deriv_e, (-0.5500000000000094, m, &r), -0.1914604987143629, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_Ai_deriv_e, (0.4999999999999906, m, &r), -0.2249105326646850, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_Ai_deriv_e, (1.899999999999992, m, &r), -0.06043678178575718, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_Ai_deriv_e, (3.249999999999988, m, &r), -0.007792687926790889, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_Ai_deriv_e, (5.199999999999981, m, &r), -0.0001589434526459543, TEST_TOL1, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_airy_Ai_deriv_scaled_e, (-5.0, m, &r), 0.3271928185544435, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_Ai_deriv_scaled_e, (0.5499999999999906, m, &r), -0.2874057279170166, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_Ai_deriv_scaled_e, (1.499999999999991, m, &r), -0.3314199796863637, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_Ai_deriv_scaled_e, (2.49999999999999, m, &r), -0.3661089384751620, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_Ai_deriv_scaled_e, (3.649999999999986, m, &r), -0.3974033831453963, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_Ai_deriv_scaled_e, (6.299999999999977, m, &r), -0.4508799189585947, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_airy_Bi_deriv_e, (-5.0, m, &r), 0.778411773001899, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_Bi_deriv_e, (-0.5500000000000094, m, &r), 0.5155785358765014, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_Bi_deriv_e, (0.4999999999999906, m, &r), 0.5445725641405883, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_Bi_deriv_e, (1.899999999999992, m, &r), 3.495165862891568, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_Bi_deriv_e, (3.249999999999988, m, &r), 36.55485149250338, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_Bi_deriv_e, (5.199999999999981, m, &r), 2279.748293583233, TEST_TOL1, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_airy_Bi_deriv_scaled_e, (-5.0, m, &r), 0.778411773001899, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_Bi_deriv_scaled_e, (0.5499999999999906, m, &r), 0.4322811281817566, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_Bi_deriv_scaled_e, (1.499999999999991, m, &r), 0.5542307563918037, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_Bi_deriv_scaled_e, (2.49999999999999, m, &r), 0.6755384441644985, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_Bi_deriv_scaled_e, (3.649999999999986, m, &r), 0.7613959373000228, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_Bi_deriv_scaled_e, (6.299999999999977, m, &r), 0.8852064139737571, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_airy_zero_Ai_e, (2, &r), -4.087949444130970617, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_zero_Ai_e, (50, &r), -38.02100867725525443, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_zero_Ai_e, (100, &r), -60.45555727411669871, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_zero_Ai_e, (110, &r), -64.43135670991324811, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_airy_zero_Bi_e, (2, &r), -3.271093302836352716, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_zero_Bi_e, (50, &r), -37.76583438165180116, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_zero_Bi_e, (100, &r), -60.25336482580837088, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_zero_Bi_e, (110, &r), -64.2355167606561537, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_zero_Bi_e, (111, &r), -64.6268994819519378, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_zero_Bi_e, (200, &r), -95.88699147356682665, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_airy_zero_Ai_deriv_e, (2, &r), -3.248197582179836561, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_zero_Ai_deriv_e, (50, &r), -37.76565910053887108, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_zero_Ai_deriv_e, (100, &r), -60.25329596442479317, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_zero_Ai_deriv_e, (110, &r), -64.23545617243546956, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_zero_Ai_deriv_e, (1000, &r), -280.9378080358935071, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_airy_zero_Bi_deriv_e, (2, &r), -4.073155089071828216, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_zero_Bi_deriv_e, (50, &r), -38.02083574095788210, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_zero_Bi_deriv_e, (100, &r), -60.45548887257140819, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_zero_Bi_deriv_e, (110, &r), -64.43129648944845060, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_zero_Bi_deriv_e, (111, &r), -64.82208737584206093, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_zero_Bi_deriv_e, (200, &r), -96.04731050310324450, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_airy_zero_Bi_deriv_e, (1000, &r), -281.0315164471118527, TEST_TOL0, GSL_SUCCESS);
+
+ return s;
+}
diff --git a/gsl-1.9/specfunc/test_bessel.c b/gsl-1.9/specfunc/test_bessel.c
new file mode 100644
index 0000000..4425d32
--- /dev/null
+++ b/gsl-1.9/specfunc/test_bessel.c
@@ -0,0 +1,600 @@
+/* specfunc/test_bessel.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_sf.h>
+#include "test_sf.h"
+
+static double J[100];
+static double Y[100];
+static double I[100];
+static double K[100];
+
+int test_bessel(void)
+{
+ gsl_sf_result r;
+ int i;
+ int s = 0;
+ int sa;
+
+ TEST_SF(s, gsl_sf_bessel_J0_e, (0.1, &r), 0.99750156206604003230, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_J0_e, (2.0, &r), 0.22389077914123566805, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_J0_e, (100.0, &r), 0.019985850304223122424, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_J0_e, (1.0e+10, &r), 2.1755917502468917269e-06, TEST_SQRT_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_J1_e, (0.1, &r), 0.04993752603624199756, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_J1_e, (2.0, &r), 0.57672480775687338720, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_J1_e, (100.0, &r), -0.07714535201411215803, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_J1_e, (1.0e+10, &r), -7.676508175684157103e-06, TEST_TOL4, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_Jn_e, (4, 0.1, &r), 2.6028648545684032338e-07, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Jn_e, (5, 2.0, &r), 0.007039629755871685484, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Jn_e, (10, 20.0, &r), 0.18648255802394508321, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Jn_e, (100, 100.0, &r), 0.09636667329586155967, TEST_TOL0, GSL_SUCCESS);
+
+ /* exercise the BUG#3 problem */
+ TEST_SF(s, gsl_sf_bessel_Jn_e, (2, 900.0, &r), -0.019974345269680646400, TEST_TOL4, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Jn_e, (2, 15000.0, &r), -0.0020455820181216382666, TEST_TOL4, GSL_SUCCESS);
+
+#ifdef TEST_LARGE
+ TEST_SF(s, gsl_sf_bessel_Jn_e, (0, 1.0e+10, &r), 2.1755917502468917269e-06, TEST_SQRT_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Jn_e, (1, 1.0e+10, &r), -7.676508175684157103e-06, TEST_TOL4, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Jn_e, (0, 20000, &r), -7.676508175684157103e-06, TEST_TOL4, GSL_SUCCESS);
+#endif
+
+ TEST_SF(s, gsl_sf_bessel_Y0_e, (0.1, &r), -1.5342386513503668441, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Y0_e, (2, &r), 0.5103756726497451196, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Y0_e, (256.0, &r), -0.03381290171792454909 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Y0_e, (4294967296.0, &r), 3.657903190017678681e-06, TEST_SQRT_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_Y1_e, (0.1, &r), -6.45895109470202698800, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Y1_e, (2, &r), -0.10703243154093754689, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Y1_e, (100.0, &r), -0.020372312002759793305, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Y1_e, (4294967296.0, &r), 0.000011612249378370766284, TEST_TOL4, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_Yn_e, (4, 0.1, &r), -305832.29793353160319, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Yn_e, (5, 2, &r), -9.935989128481974981, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Yn_e, (100, 100.0, &r), -0.16692141141757650654, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Yn_e, (100, 4294967296.0, &r), 3.657889671577715808e-06, TEST_SQRT_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Yn_e, (1000, 4294967296.0, &r), 3.656551321485397501e-06, 2.0e-05, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_Yn_e, (2, 15000.0, &r), -0.006185217273358617849, TEST_TOL4, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_I0_scaled_e, (1e-10, &r), 0.99999999990000000001, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_I0_scaled_e, (0.1, &r), 0.90710092578230109640, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_I0_scaled_e, (2, &r), 0.30850832255367103953, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_I0_scaled_e, (100.0, &r), 0.03994437929909668265, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_I0_scaled_e, (65536.0, &r), 0.0015583712551952223537, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_I1_scaled_e, (0.1, &r), 0.04529844680880932501, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_I1_scaled_e, (2, &r), 0.21526928924893765916, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_I1_scaled_e, (100.0, &r), 0.03974415302513025267, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_I1_scaled_e, (65536.0, &r), 0.0015583593657207350452, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_In_scaled_e, ( -4, 0.1, &r), 2.3575258620054605307e-07, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_In_scaled_e, ( 4, 0.1, &r), 2.3575258620054605307e-07, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_In_scaled_e, ( 5, 2.0, &r), 0.0013297610941881578142, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_In_scaled_e, ( 100, 100.0, &r), 1.7266862628167695785e-22, TEST_TOL0, GSL_SUCCESS);
+
+ /* BJG: the "exact" values in the following two tests were originally computed from the
+ taylor series for I_nu using "long double" and rescaling. The last few digits
+ were inaccurate due to cumulative roundoff.
+
+ BJG: 2006/05 I have now replaced these with the term asymptotic
+ expansion from A&S 9.7.1 which should be fully accurate. */
+
+ TEST_SF(s, gsl_sf_bessel_In_scaled_e, ( 2, 1e7, &r), 1.261566024466416433e-4, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_In_scaled_e, ( 2, 1e8, &r), 3.989422729212649531e-5, TEST_TOL2, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_I0_e, (0.1, &r), 1.0025015629340956014, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_I0_e, (2.0, &r), 2.2795853023360672674, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_I0_e, (100.0, &r), 1.0737517071310738235e+42, TEST_TOL2, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_I1_e, (0.1, &r), 0.05006252604709269211, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_I1_e, (2.0, &r), 1.59063685463732906340, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_I1_e, (100.0, &r), 1.0683693903381624812e+42, TEST_TOL2, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_In_e, ( 4, 0.1, &r), 2.6054690212996573677e-07, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_In_e, ( 5, 2.0, &r), 0.009825679323131702321, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_In_e, ( 100, 100.0, &r), 4.641534941616199114e+21, TEST_TOL2, GSL_SUCCESS);
+
+
+ TEST_SF(s, gsl_sf_bessel_K0_scaled_e, (0.1, &r), 2.6823261022628943831, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_K0_scaled_e, (2.0, &r), 0.8415682150707714179, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_K0_scaled_e, (100.0, &r), 0.1251756216591265789, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_K1_scaled_e, (0.1, &r), 10.890182683049696574, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_K1_scaled_e, (2.0, &r), 1.0334768470686885732, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_K1_scaled_e, (100.0, &r), 0.1257999504795785293, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_Kn_scaled_e, ( 4, 0.1, &r), 530040.2483725626207, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Kn_scaled_e, ( 5, 2.0, &r), 69.68655087607675118, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Kn_scaled_e, ( 100, 100.0, &r), 2.0475736731166756813e+19, TEST_TOL1, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_K0_e, (0.1, &r), 2.4270690247020166125, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_K0_e, (2.0, &r), 0.11389387274953343565, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_K0_e, (100.0, &r), 4.656628229175902019e-45, TEST_TOL2, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_K1_e, (0.1, &r), 9.853844780870606135, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_K1_e, (2.0, &r), 0.13986588181652242728, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_K1_e, (100.0, &r), 4.679853735636909287e-45, TEST_TOL2, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_Kn_e, ( 4, 0.1, &r), 479600.2497925682849, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Kn_e, ( 5, 2.0, &r), 9.431049100596467443, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Kn_e, ( 100, 100.0, &r), 7.617129630494085416e-25, TEST_TOL2, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_j0_e, (-10.0, &r), -0.05440211108893698134, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_j0_e, (0.001, &r), 0.9999998333333416667, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_j0_e, ( 1.0, &r), 0.84147098480789650670, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_j0_e, ( 10.0, &r), -0.05440211108893698134, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_j0_e, (100.0, &r), -0.005063656411097587937, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_j0_e, (1048576.0, &r), 3.1518281938718287624e-07, TEST_TOL2, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_j1_e, (-10.0, &r), -0.07846694179875154709, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_j1_e, (0.01, &r), 0.003333300000119047399, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_j1_e, ( 1.0, &r), 0.30116867893975678925, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_j1_e, ( 10.0, &r), 0.07846694179875154709, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_j1_e, (100.0, &r), -0.008673825286987815220, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_j1_e, (1048576.0, &r), -9.000855242905546158e-07, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_j2_e, (-10.0, &r), 0.07794219362856244547, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_j2_e, (0.01, &r), 6.666619047751322551e-06, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_j2_e, ( 1.0, &r), 0.06203505201137386110, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_j2_e, ( 10.0, &r), 0.07794219362856244547, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_j2_e, (100.0, &r), 0.004803441652487953480, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_j2_e, (1048576.0, &r), -3.1518539455252413111e-07, TEST_TOL2, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_jl_e, (0, 0.0, &r), 1.0, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_jl_e, (1, 10.0, &r), 0.07846694179875154709000, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_jl_e, (5, 1.0, &r), 0.00009256115861125816357, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_jl_e, (10, 10.0, &r), 0.06460515449256426427, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_jl_e, (100, 100.0, &r), 0.010880477011438336539, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_jl_e, (2000, 1048576.0, &r), 7.449384239168568534e-07, TEST_SQRT_TOL0, GSL_SUCCESS);
+
+ /* related to BUG#3 problem */
+ TEST_SF(s, gsl_sf_bessel_jl_e, (2, 900.0, &r), -0.0011089115568832940086, TEST_TOL4, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_jl_e, (2, 15000.0, &r), -0.00005955592033075750554, TEST_TOL4, GSL_SUCCESS);
+
+ /* Bug report by Mario Santos, value computed from AS 10.1.8 */
+ TEST_SF(s, gsl_sf_bessel_jl_e, (100, 1000.0, &r), -0.00025326311230945818285, TEST_TOL4, GSL_SUCCESS);
+
+
+ TEST_SF(s, gsl_sf_bessel_y0_e, (0.001, &r), -999.99950000004166670, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_y0_e, ( 1.0, &r), -0.5403023058681397174, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_y0_e, ( 10.0, &r), 0.08390715290764524523, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_y0_e, (100.0, &r), -0.008623188722876839341, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_y0_e, (65536.0, &r), 0.000011014324202158573930, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_y0_e, (4294967296.0, &r), 2.0649445131370357007e-10, TEST_SQRT_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_y1_e, ( 0.01, &r), -10000.499987500069444, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_y1_e, ( 1.0, &r), -1.3817732906760362241, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_y1_e, ( 10.0, &r), 0.06279282637970150586, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_y1_e, (100.0, &r), 0.004977424523868819543, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_y1_e, (4294967296.0, &r), 1.0756463271573404688e-10, TEST_SQRT_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_y2_e, ( 0.01, &r), -3.0000500012499791668e+06, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_y2_e, ( 1.0, &r), -3.605017566159968955, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_y2_e, ( 10.0, &r), -0.06506930499373479347, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_y2_e, (100.0, &r), 0.008772511458592903927, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_y2_e, (4294967296.0, &r), -2.0649445123857054207e-10, TEST_SQRT_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_yl_e, (0, 0.01, &r), -99.995000041666528, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_yl_e, (0, 1.0, &r), -0.54030230586813972, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_yl_e, (1, 10.0, &r), 0.062792826379701506, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_yl_e, (5, 1.0, &r), -999.44034339223641, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_yl_e, (10, 0.01, &r), -6.5473079797378378e+30, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_yl_e, (10, 10.0, &r), -0.172453672088057849, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_yl_e, (100, 1.0, &r), -6.6830794632586775e+186, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_yl_e, (100, 100.0, &r), -0.0229838504915622811, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_yl_e, (2000, 1048576.0, &r), 5.9545201447146155e-07, TEST_SQRT_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_i0_scaled_e, (0.0, &r), 1.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_i0_scaled_e, (0.1, &r), 0.9063462346100907067, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_i0_scaled_e, (2.0, &r), 0.24542109027781645493, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_i0_scaled_e, (100.0, &r), 0.005000000000000000000, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_i1_scaled_e, (0.0, &r), 0.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_i1_scaled_e, (0.1, &r), 0.030191419289002226846, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_i1_scaled_e, (2.0, &r), 0.131868364583275317610, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_i1_scaled_e, (100.0, &r), 0.004950000000000000000, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_i2_scaled_e, (0.0, &r), 0.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_i2_scaled_e, (0.1, &r), 0.0006036559400239012567, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_i2_scaled_e, (2.0, &r), 0.0476185434029034785100, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_i2_scaled_e, (100.0, &r), 0.0048515000000000000000, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_il_scaled_e, ( 0, 0.0, &r), 1.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_il_scaled_e, ( 1, 0.0, &r), 0.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_il_scaled_e, ( 4, 0.001, &r), 1.0571434341190365013e-15, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_il_scaled_e, ( 4, 0.1, &r), 9.579352242057134927e-08, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_il_scaled_e, ( 5, 2.0, &r), 0.0004851564602127540059, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_il_scaled_e, ( 5, 100.0, &r), 0.004300446777500000000, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_il_scaled_e, ( 100, 100.0, &r), 1.3898161964299132789e-23, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_k0_scaled_e, (0.1, &r), 15.707963267948966192, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_k0_scaled_e, (2.0, &r), 0.7853981633974483096, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_k0_scaled_e, (100.0, &r), 0.015707963267948966192, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_k1_scaled_e, (0.1, &r), 172.78759594743862812, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_k1_scaled_e, (2.0, &r), 1.1780972450961724644, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_k1_scaled_e, (100.0, &r), 0.015865042900628455854, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_k2_scaled_e, (0.1, &r), 5199.335841691107810, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_k2_scaled_e, (2.0, &r), 2.5525440310417070063, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_k2_scaled_e, (100.0, &r), 0.016183914554967819868, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_kl_scaled_e, ( 4, 1.0/256.0, &r), 1.8205599816961954439e+14, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_kl_scaled_e, ( 4, 1.0/8.0, &r), 6.1173217814406597530e+06, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_kl_scaled_e, ( 5, 2.0, &r), 138.10735829492005119, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_kl_scaled_e, ( 100, 100.0, &r), 3.985930768060258219e+18, TEST_TOL1, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_Jnu_e, (0.0001, 1.0, &r), 0.7652115411876708497, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Jnu_e, (0.0001, 10.0, &r), -0.2459270166445205, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Jnu_e, (0.0009765625, 10.0, &r), -0.2458500798634692, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Jnu_e, (0.75, 1.0, &r), 0.5586524932048917478, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Jnu_e, (0.75, 10.0, &r), -0.04968928974751508135, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Jnu_e, ( 1.0, 0.001, &r), 0.0004999999375000026, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Jnu_e, ( 1.0, 1.0, &r), 0.4400505857449335160, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Jnu_e, ( 1.75, 1.0, &r), 0.168593922545763170103, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Jnu_e, (30.0, 1.0, &r), 3.482869794251482902e-42, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Jnu_e, (30.0, 100.0, &r), 0.08146012958117222297, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Jnu_e, (10.0, 1.0, &r), 2.6306151236874532070e-10, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Jnu_e, (10.0, 100.0, &r), -0.05473217693547201474, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Jnu_e, (10.2, 100.0, &r), -0.03548919161046526864, TEST_TOL2, GSL_SUCCESS);
+
+ /* related to BUG#3 problem */
+ TEST_SF(s, gsl_sf_bessel_Jnu_e, (2.0, 900.0, &r), -0.019974345269680646400, TEST_TOL4, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Jnu_e, (2.0, 15000.0, &r), -0.0020455820181216382666, TEST_TOL4, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_Ynu_e, (0.0001, 1.0, &r), 0.08813676933044478439, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Ynu_e, (0.0001,10.0, &r), 0.05570979797521875261, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Ynu_e, ( 0.75, 1.0, &r), -0.6218694174429746383, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Ynu_e, ( 0.75, 10.0, &r), 0.24757063446760384953, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Ynu_e, ( 1.0, 0.001, &r), -636.6221672311394281, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Ynu_e, ( 1.0, 1.0, &r), -0.7812128213002887165, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Ynu_e, (30.0, 1.0, &r), -3.0481287832256432162e+39, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Ynu_e, (30.0, 100.0, &r), 0.006138839212010033452, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Ynu_e, (10.0, 1.0, &r), -1.2161801427868918929e+08, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Ynu_e, (10.0, 100.0, &r), 0.05833157423641492875, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Ynu_e, (10.2, 100.0, &r), 0.07169383985546287091, TEST_TOL2, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_Inu_scaled_e, (0.0001,10.0, &r), 0.12783333709581669672, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Inu_scaled_e, ( 1.0, 0.001, &r), 0.0004995003123542213370, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Inu_scaled_e, ( 1.0, 1.0, &r), 0.20791041534970844887, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Inu_scaled_e, (30.0, 1.0, &r), 1.3021094983785914437e-42, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Inu_scaled_e, (30.0, 100.0, &r), 0.0004486987756920986146, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Inu_scaled_e, (10.0, 1.0, &r), 1.0127529864692066036e-10, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Inu_scaled_e, (10.0, 100.0, &r), 0.024176682718258828365, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Inu_scaled_e, (10.2, 100.0, &r), 0.023691628843913810043, TEST_TOL3, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_Inu_e, (0.0001,10.0, &r), 2815.7166269770030352, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Inu_e, ( 1.0, 0.001, &r), 0.0005000000625000026042, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Inu_e, ( 1.0, 1.0, &r), 0.5651591039924850272, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Inu_e, (30.0, 1.0, &r), 3.539500588106447747e-42, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Inu_e, (30.0, 100.0, &r), 1.2061548704498434006e+40, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Inu_e, (10.0, 1.0, &r), 2.7529480398368736252e-10, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Inu_e, (10.0, 100.0, &r), 6.498975524720147799e+41, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Inu_e, (10.2, 100.0, &r), 6.368587361287030443e+41, TEST_TOL2, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_Knu_scaled_e, (0.0001,10.0, &r), 0.3916319346235421817, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Knu_scaled_e, ( 1.0, 0.001, &r), 1000.9967345590684524, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Knu_scaled_e, ( 1.0, 1.0, &r), 1.6361534862632582465, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Knu_scaled_e, (30.0, 1.0, &r), 1.2792629867539753925e+40, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Knu_scaled_e, (30.0, 100.0, &r), 10.673443449954850040, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Knu_scaled_e, (10.0, 1.0, &r), 4.912296520990198599e+08, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Knu_scaled_e, (10.0, 100.0, &r), 0.20578687173955779807, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Knu_scaled_e, (10.0, 1000.0, &r), 0.04165905142800565788, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Knu_scaled_e, (10.0, 1.0e+8, &r), 0.00012533147624060789938, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Knu_scaled_e, (10.2, 100.0, &r), 0.20995808355244385075, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_Knu_e, (0.0001,0.001, &r), 7.023689431812884141, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Knu_e, (0.0001,10.0, &r), 0.000017780062324654874306, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Knu_e, ( 1.0, 0.001, &r), 999.9962381560855743, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Knu_e, ( 1.0, 1.0, &r), 0.6019072301972345747, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Knu_e, (10.0, 0.001, &r), 1.8579455483904008064e+38, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Knu_e, (10.0, 1.0, &r), 1.8071328990102945469e+08, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Knu_e, (10.0, 100.0, &r), 7.655427977388100611e-45, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Knu_e, (10.2, 100.0, &r), 7.810600225948217841e-45, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Knu_e, (30.0, 1.0, &r), 4.706145526783626883e+39, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_Knu_e, (30.0, 100.0, &r), 3.970602055959398739e-43, TEST_TOL2, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_lnKnu_e, (0.0001,1.0e-100, &r), 5.439794449319847, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_lnKnu_e, (0.0001,0.0001, &r), 2.232835507214331, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_lnKnu_e, (0.0001,10.0, &r), -10.93743282256098, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_lnKnu_e, ( 1.0, 1.0e-100, &r), 230.2585092994045, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_lnKnu_e, ( 1.0, 1.0e-10, &r), 23.025850929940456840, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_lnKnu_e, ( 1.0, 0.001, &r), 6.907751517131146, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_lnKnu_e, ( 1.0, 1.0, &r), -0.5076519482107523309, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_lnKnu_e, (30.0, 1.0e-100, &r), 6999.113586185543475, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_lnKnu_e, (30.0, 1.0, &r), 91.34968784026325464, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_lnKnu_e, (30.0, 100.0, &r), -97.63224126416760932, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_lnKnu_e, (100.0, 1.0e-100, &r), 23453.606706185466825, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_lnKnu_e, (100.0, 1.0, &r), 427.7532510250188083, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_lnKnu_e, (100.0, 100.0, &r), -55.53422771502921431, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_lnKnu_e, (1000.0, 1.0e-100, &r), 236856.183755993135, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_lnKnu_e, (10000.0, 1.0e-100, &r), 2.39161558914890695e+06, TEST_TOL0, GSL_SUCCESS);
+
+ sa = 0;
+ gsl_sf_bessel_Jn_array(3, 38, 1.0, J);
+ sa += ( test_sf_frac_diff(J[0], 0.0195633539826684059190 ) > TEST_TOL1);
+ sa += ( test_sf_frac_diff(J[1], 0.0024766389641099550438 ) > TEST_TOL1);
+ sa += ( test_sf_frac_diff(J[10], 1.9256167644801728904e-14 ) > TEST_TOL1);
+ sa += ( test_sf_frac_diff(J[35], 6.911232970971626272e-57 ) > TEST_TOL1);
+ gsl_test(sa, " gsl_sf_bessel_Jn_array");
+ s += sa;
+
+ sa = 0;
+ gsl_sf_bessel_Yn_array(3, 38, 1.0, Y);
+ sa += ( test_sf_frac_diff(Y[0], -5.821517605964728848 ) > TEST_TOL0 );
+ sa += ( test_sf_frac_diff(Y[1], -33.27842302897211870 ) > TEST_TOL0 );
+ sa += ( test_sf_frac_diff(Y[10], -1.2753618701519837595e+12 ) > TEST_TOL0 );
+ sa += ( test_sf_frac_diff(Y[35], -1.2124435663593357154e+54 ) > TEST_TOL0 );
+ gsl_test(sa, " gsl_sf_bessel_Yn_array");
+ s += sa;
+
+ sa = 0;
+ gsl_sf_bessel_In_scaled_array(3, 38, 1.0, I);
+ sa += ( test_sf_frac_diff(I[0], 0.0081553077728142938170 ) > TEST_TOL0 );
+ sa += ( test_sf_frac_diff(I[1], 0.0010069302573377758637 ) > TEST_TOL0 );
+ sa += ( test_sf_frac_diff(I[10], 7.341518665628926244e-15 ) > TEST_TOL0 );
+ sa += ( test_sf_frac_diff(I[35], 2.5753065298357542893e-57 ) > TEST_TOL0 );
+ gsl_test(sa, " gsl_sf_bessel_In_scaled_array");
+ s += sa;
+
+ sa = 0;
+ gsl_sf_bessel_In_array(3, 38, 1.0, Y);
+ sa += ( test_sf_frac_diff(Y[0], 0.0221684249243319024760 ) > TEST_TOL0 );
+ sa += ( test_sf_frac_diff(Y[1], 0.0027371202210468663251 ) > TEST_TOL0 );
+ sa += ( test_sf_frac_diff(Y[10], 1.9956316782072007564e-14 ) > TEST_TOL0 );
+ sa += ( test_sf_frac_diff(Y[35], 7.000408942764452901e-57 ) > TEST_TOL0 );
+ gsl_test(sa, " gsl_sf_bessel_In_array");
+ s += sa;
+
+ sa = 0;
+ gsl_sf_bessel_Kn_array(3, 38, 1.0, K);
+ sa += ( test_sf_frac_diff(K[0], 7.101262824737944506 ) > TEST_TOL0 );
+ sa += ( test_sf_frac_diff(K[1], 44.23241584706284452 ) > TEST_TOL0 );
+ sa += ( test_sf_frac_diff(K[10], 1.9215763927929940846e+12 ) > TEST_TOL0 );
+ sa += ( test_sf_frac_diff(K[35], 1.8789385023806051223e+54 ) > TEST_TOL0 );
+ gsl_test(sa, " gsl_sf_bessel_Kn_array");
+ s += sa;
+
+ sa = 0;
+ gsl_sf_bessel_Kn_scaled_array(3, 38, 1.0, K);
+ sa += ( test_sf_frac_diff(K[0], 19.303233695596904277 ) > TEST_TOL0 );
+ sa += ( test_sf_frac_diff(K[1], 120.23617222591483717 ) > TEST_TOL0 );
+ sa += ( test_sf_frac_diff(K[10], 5.223386190525076473e+12 ) > TEST_TOL0 );
+ sa += ( test_sf_frac_diff(K[35], 5.107484387813251411e+54 ) > TEST_TOL0 );
+ gsl_test(sa, " gsl_sf_bessel_Kn_scaled_array");
+ s += sa;
+
+ sa = 0;
+ gsl_sf_bessel_jl_array(50, 1.0, J);
+ sa += ( test_sf_frac_diff(J[0], 0.84147098480789650670 ) > TEST_TOL2 );
+ sa += ( test_sf_frac_diff(J[1], 0.30116867893975678925 ) > TEST_TOL2 );
+ sa += ( test_sf_frac_diff(J[10], 7.116552640047313024e-11 ) > TEST_TOL2 );
+ sa += ( test_sf_frac_diff(J[50], 3.615274717489787311e-81 ) > TEST_TOL2 );
+ gsl_test(sa, " gsl_sf_bessel_jl_array");
+ s += sa;
+
+ sa = 0;
+ gsl_sf_bessel_jl_steed_array(99, 1.0, J);
+ sa += ( test_sf_frac_diff(J[0], 0.84147098480789650670 ) > TEST_TOL0 );
+ sa += ( test_sf_frac_diff(J[1], 0.30116867893975678925 ) > TEST_TOL0 );
+ sa += ( test_sf_frac_diff(J[10], 7.116552640047313024e-11 ) > TEST_TOL0 );
+ sa += ( test_sf_frac_diff(J[50], 3.615274717489787311e-81 ) > TEST_TOL0 );
+ sa += ( test_sf_frac_diff(J[80], 1.136352423414503264e-144 ) > TEST_TOL1 );
+ gsl_test(sa, " gsl_sf_bessel_jl_steed_array");
+ s += sa;
+
+ sa = 0;
+ gsl_sf_bessel_yl_array(50, 1.0, Y);
+ sa += ( test_sf_frac_diff(Y[0], -0.5403023058681397174 ) > TEST_TOL0 );
+ sa += ( test_sf_frac_diff(Y[1], -1.3817732906760362241 ) > TEST_TOL0 );
+ sa += ( test_sf_frac_diff(Y[10], -6.722150082562084436e+08 ) > TEST_TOL0 );
+ sa += ( test_sf_frac_diff(Y[50], -2.7391922846297571576e+78 ) > TEST_TOL0 );
+ gsl_test(sa, " gsl_sf_bessel_yl_array");
+ s += sa;
+
+ {
+ double Y0[1];
+ sa = 0;
+ gsl_sf_bessel_yl_array(0, 1.0, Y0);
+ sa += ( test_sf_frac_diff(Y0[0], -0.5403023058681397174 ) > TEST_TOL0 );
+ gsl_test(sa, " gsl_sf_bessel_yl_array (lmax=0)");
+ s += sa;
+ }
+
+ sa = 0;
+ gsl_sf_bessel_il_scaled_array(50, 1.0, I);
+ sa += ( test_sf_frac_diff(I[0], 0.43233235838169365410 ) > TEST_TOL2 );
+ sa += ( test_sf_frac_diff(I[1], 0.13533528323661269189 ) > TEST_TOL2 );
+ sa += ( test_sf_frac_diff(I[10], 2.7343719371837065460e-11 ) > TEST_TOL2 );
+ sa += ( test_sf_frac_diff(I[50], 1.3429606061892023653e-81 ) > TEST_TOL2 );
+ gsl_test(sa, " gsl_sf_bessel_il_scaled_array");
+ s += sa;
+
+ sa = 0;
+ gsl_sf_bessel_il_scaled_array(50, 0.0, I);
+ sa += ( test_sf_frac_diff(I[0], 1.0 ) > TEST_TOL2 );
+ sa += ( test_sf_frac_diff(I[1], 0.0 ) > TEST_TOL2 );
+ sa += ( test_sf_frac_diff(I[10], 0.0 ) > TEST_TOL2 );
+ sa += ( test_sf_frac_diff(I[50], 0.0 ) > TEST_TOL2 );
+ gsl_test(sa, " gsl_sf_bessel_il_scaled_array (L=0)");
+ s += sa;
+
+ sa = 0;
+ gsl_sf_bessel_kl_scaled_array(50, 1.0, K);
+ sa += ( test_sf_frac_diff(K[0], 1.5707963267948966192 ) > TEST_TOL0 );
+ sa += ( test_sf_frac_diff(K[1], 3.1415926535897932385 ) > TEST_TOL0 );
+ sa += ( test_sf_frac_diff(K[10], 2.7231075458948147010e+09 ) > TEST_TOL0 );
+ sa += ( test_sf_frac_diff(K[50], 1.1578440432804522544e+79 ) > TEST_TOL0 );
+ gsl_test(sa, " gsl_sf_bessel_kl_scaled_array");
+ s += sa;
+
+ {
+ double K0[1];
+ sa = 0;
+ gsl_sf_bessel_kl_scaled_array(0, 1.0, K0);
+ sa += ( test_sf_frac_diff(K[0], 1.5707963267948966192 ) > TEST_TOL0 );
+ gsl_test(sa, " gsl_sf_bessel_kl_scaled_array (lmax=0)");
+ s += sa;
+ }
+
+ sa = 0;
+ sa += ( gsl_sf_bessel_zero_J0_e(0, &r) != GSL_EINVAL );
+ sa += ( r.val != 0.0 );
+ s += sa;
+ TEST_SF(s, gsl_sf_bessel_zero_J0_e, ( 1, &r), 2.404825557695771, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_J0_e, ( 2, &r), 5.520078110286304, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_J0_e, (20, &r), 62.048469190227081, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_J0_e, (25, &r), 77.756025630388058, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_J0_e, (100, &r), 313.37426607752784, TEST_TOL1, GSL_SUCCESS);
+
+ sa = 0;
+ sa += ( gsl_sf_bessel_zero_J1_e(0, &r) != GSL_SUCCESS );
+ sa += ( r.val != 0.0 );
+ s += sa;
+ TEST_SF(s, gsl_sf_bessel_zero_J1_e, ( 1, &r), 3.831705970207512, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_J1_e, ( 2, &r), 7.015586669815619, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_J1_e, (20, &r), 63.61135669848124, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_J1_e, (25, &r), 79.32048717547630, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_J1_e, (100, &r), 314.9434728377672, TEST_TOL2, GSL_SUCCESS);
+
+ sa = 0;
+ sa += ( gsl_sf_bessel_zero_Jnu_e(0.0, 0, &r) != GSL_EINVAL );
+ sa += ( r.val != 0.0 );
+ s += sa;
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, (0.0, 1, &r), 2.404825557695771, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, (0.0, 2, &r), 5.520078110286304, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, (0.0, 20, &r), 62.048469190227081, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, (0.0, 25, &r), 77.756025630388058, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, (0.0, 100, &r), 313.37426607752784, TEST_TOL1, GSL_SUCCESS);
+
+ sa = 0;
+ sa += ( gsl_sf_bessel_zero_Jnu_e(1.0, 0, &r) != GSL_SUCCESS );
+ sa += (r.val != 0.0);
+ s += sa;
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, ( 1.5, 1, &r), 4.4934094579090641, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, ( 5.0, 1, &r), 8.7714838159599540, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, ( 1.5, 2, &r), 7.7252518369377072, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, ( 5.0, 2, &r), 12.338604197466944, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, ( 1.5, 3, &r), 10.904121659428900, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, ( 5.0, 3, &r), 15.700174079711671, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, ( 1.5, 4, &r), 14.066193912831473, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, ( 5.0, 4, &r), 18.980133875179921, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, ( 1.5, 5, &r), 17.220755271930768, TEST_TOL1, GSL_SUCCESS);
+
+ /* Something wrong with the tolerances on these */
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, ( 5.0, 5, &r), 22.217799896561268, TEST_SQRT_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, ( 8.0, 5, &r), 26.266814641176644, TEST_SQRT_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, (20.0, 5, &r), 41.413065513892636, TEST_SQRT_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, ( 1.5, 6, &r), 20.371302959287563, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, ( 5.0, 6, &r), 25.430341154222704, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, ( 8.0, 6, &r), 29.545659670998550, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, ( 1.5, 7, &r), 23.519452498689007, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, ( 5.0, 7, &r), 28.626618307291138, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, ( 8.0, 7, &r), 32.795800037341462, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, ( 1.5, 8, &r), 26.666054258812674, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, ( 5.0, 8, &r), 31.811716724047763, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, (10.0, 8, &r), 38.761807017881651, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, ( 1.5, 9, &r), 29.811598790892959, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, ( 5.0, 9, &r), 34.988781294559295, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, (10.0, 9, &r), 42.004190236671805, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, ( 1.5, 10, &r), 32.956389039822477, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, ( 5.0, 10, &r), 38.159868561967132, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, (15.0, 10, &r), 52.017241278881633, TEST_TOL1, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, ( 5.0, 11, &r), 41.326383254047406, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, (15.0, 11, &r), 55.289204146560061, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, ( 5.0, 12, &r), 44.4893191232197314, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, (15.0, 12, &r), 58.5458289043850856, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, ( 5.0, 13, &r), 47.6493998066970948, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, (15.0, 13, &r), 61.7897598959450550, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, ( 5.0, 14, &r), 50.8071652030063595, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, (15.0, 14, &r), 65.0230502510422545, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, ( 5.0, 15, &r), 53.9630265583781707, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, (15.0, 15, &r), 68.2473219964207837, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, ( 5.0, 16, &r), 57.1173027815042647, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, (15.0, 16, &r), 71.4638758850226630, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, ( 5.0, 17, &r), 60.2702450729428077, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, (15.0, 17, &r), 74.6737687121404241, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, ( 5.0, 18, &r), 63.4220540458757799, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, (15.0, 18, &r), 77.8778689734863729, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, ( 5.0, 19, &r), 66.5728918871182703, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, (15.0, 19, &r), 81.0768977206328326, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, ( 5.0, 20, &r), 69.722891161716742, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, (15.0, 20, &r), 84.271459069716442, TEST_TOL1, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, ( 23.0, 11, &r), 65.843393469524653, TEST_TOL6, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, ( 30.0, 11, &r), 74.797306585175426, TEST_TOL6, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, ( 32.0, 15, &r), 90.913637691861741, TEST_TOL6, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, ( 50.0, 15, &r), 113.69747988073942, TEST_TOL6, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, ( 5.0, 22, &r), 76.020793430591605, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, ( 10.0, 22, &r), 83.439189796105756, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, ( 12.0, 22, &r), 86.345496520534055, TEST_TOL6, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, (100.0, 22, &r), 199.82150220122519, TEST_TOL4, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_bessel_zero_Jnu_e, (500.0, 22, &r), 649.34132440891735, TEST_TOL2, GSL_SUCCESS);
+
+ sa = 0;
+ for(i=0; i<100; i++) {
+ J[i] = i/10.0;
+ }
+ gsl_sf_bessel_sequence_Jnu_e(2.0, GSL_MODE_DEFAULT, 100, J);
+ sa += ( test_sf_frac_diff(J[1], 0.0012489586587999188454 ) > TEST_TOL1 );
+ sa += ( test_sf_frac_diff(J[20], 0.3528340286156377192 ) > TEST_TOL4 );
+ sa += ( test_sf_frac_diff(J[50], 0.0465651162777522155 ) > TEST_TOL4 );
+ gsl_test(sa, " gsl_sf_sequence_Jnu_e(2)");
+ s += sa;
+
+ sa = 0;
+ for(i=0; i<100; i++) {
+ J[i] = i;
+ }
+ gsl_sf_bessel_sequence_Jnu_e(12.0, GSL_MODE_DEFAULT, 100, J);
+ sa += ( test_sf_frac_diff(J[1], 4.999718179448405289e-13 ) > TEST_TOL1 );
+ sa += ( test_sf_frac_diff(J[5], 7.627813166084551355e-05 ) > TEST_TOL1 );
+ sa += ( test_sf_frac_diff(J[7], 2.655620035894568062e-03 ) > TEST_TOL3 );
+ sa += ( test_sf_frac_diff(J[10], 6.337025497015601509e-02 ) > TEST_TOL3 );
+ sa += ( test_sf_frac_diff(J[15], 0.23666584405476805591 ) > TEST_TOL3 );
+ sa += ( test_sf_frac_diff(J[30], 0.14825335109966010021 ) > TEST_TOL3 );
+ sa += ( test_sf_frac_diff(J[70], 0.04109913716555364262 ) > TEST_TOL4 );
+ sa += ( test_sf_frac_diff(J[99], -0.0015052760501176728 ) > TEST_TOL5 );
+ gsl_test(sa, " gsl_sf_sequence_Jnu_e(12)");
+ s += sa;
+
+ sa = 0;
+ for(i=0; i<100; i++) {
+ J[i] = i * 20;
+ }
+ gsl_sf_bessel_sequence_Jnu_e(1000.0, GSL_MODE_DEFAULT, 100, J);
+ sa += ( test_sf_frac_diff(J[50], 0.04473067294796404088 ) > TEST_TOL5 );
+ sa += ( test_sf_frac_diff(J[99], 0.01400619760349853902 ) > TEST_TOL6 );
+ gsl_test(sa, " gsl_sf_sequence_Jnu_e(1000)");
+ s += sa;
+
+
+ return s;
+}
diff --git a/gsl-1.9/specfunc/test_coulomb.c b/gsl-1.9/specfunc/test_coulomb.c
new file mode 100644
index 0000000..feabffe
--- /dev/null
+++ b/gsl-1.9/specfunc/test_coulomb.c
@@ -0,0 +1,412 @@
+/* specfunc/test_coulomb.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_sf.h>
+#include "test_sf.h"
+
+#define PRINT(n) printf("%22.18g %22.18g %22.18g %22.18g\n", F[n], Fp[n], G[n], Gp[n])
+
+#define WKB_TOL (1.0e+04 * TEST_SQRT_TOL0)
+
+
+int test_coulomb(void)
+{
+ gsl_sf_result r;
+ int status = 0;
+ int s = 0;
+
+ char message_buff[2048];
+
+ /* const int kmax = 20; */
+ /* double F[kmax+1], Fp[kmax+1], G[kmax+1], Gp[kmax+1]; */
+ gsl_sf_result F, Fp, G, Gp;
+ double Fe, Ge;
+ double lam_min;
+ double lam_F;
+ double eta, x;
+ int k_G;
+
+ TEST_SF(s, gsl_sf_hydrogenicR_1_e, (3.0, 2.0, &r), 0.025759948256148471036, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hydrogenicR_1_e, (3.0, 10.0, &r), 9.724727052062819704e-13, TEST_TOL1, GSL_SUCCESS);
+ status += s;
+
+ TEST_SF(s, gsl_sf_hydrogenicR_e, (4, 1, 3.0, 0.0, &r), 0.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hydrogenicR_e, (4, 0, 3.0, 2.0, &r), -0.03623182256981820062, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hydrogenicR_e, (4, 1, 3.0, 2.0, &r), -0.028065049083129581005, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hydrogenicR_e, (4, 2, 3.0, 2.0, &r), 0.14583027278668431009, TEST_TOL0, GSL_SUCCESS);
+ status += s;
+
+ TEST_SF(s, gsl_sf_hydrogenicR_e, (100, 0, 3.0, 2.0, &r), -0.00007938950980052281367, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hydrogenicR_e, (100, 10, 3.0, 2.0, &r), 7.112823375353605977e-12, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hydrogenicR_e, (100, 90, 3.0, 2.0, &r), 5.845231751418131548e-245, TEST_TOL2, GSL_SUCCESS);
+ status += s;
+
+ lam_F = 0.0;
+ k_G = 0;
+ eta = 1.0;
+ x = 5.0;
+ gsl_sf_coulomb_wave_FG_e(eta, x, lam_F, k_G, &F, &Fp, &G, &Gp, &Fe, &Ge);
+ s = 0;
+ message_buff[0] = 0;
+ s += test_sf_check_result(message_buff, F, 0.6849374120059439677, TEST_TOL3);
+ s += test_sf_check_result(message_buff, Fp, -0.7236423862556063963, TEST_TOL3);
+ s += test_sf_check_result(message_buff, G, -0.8984143590920205487, TEST_TOL3);
+ s += test_sf_check_result(message_buff, Gp, -0.5108047585190350106, TEST_TOL3);
+ printf("%s", message_buff);
+ gsl_test(s," gsl_sf_coulomb_wave_FG_e(1.0, 5.0, lam_F=0, lam_G=0)");
+ status += s;
+
+ lam_F = 10.0;
+ k_G = 2;
+ eta = 1.0;
+ x = 5.0;
+ gsl_sf_coulomb_wave_FG_e(eta, x, lam_F, k_G, &F, &Fp, &G, &Gp, &Fe, &Ge);
+ s = 0;
+ message_buff[0] = 0;
+ s += test_sf_check_result(message_buff, F, 0.0006423773354915823698, TEST_TOL3);
+ s += test_sf_check_result(message_buff, Fp, 0.0013299570958719702545, TEST_TOL3);
+ s += test_sf_check_result(message_buff, G, 33.27615734455096130, TEST_TOL3);
+ s += test_sf_check_result(message_buff, Gp, -45.49180102261540580, TEST_TOL3);
+ printf("%s", message_buff);
+ gsl_test(s," gsl_sf_coulomb_wave_FG_e(1.0, 5.0, lam_F=10, lam_G=8)");
+ status += s;
+
+ lam_F = 4.0;
+ k_G = 2;
+ eta = 50.0;
+ x = 120.0;
+ gsl_sf_coulomb_wave_FG_e(eta, x, lam_F, k_G, &F, &Fp, &G, &Gp, &Fe, &Ge);
+ s = 0;
+ message_buff[0] = 0;
+ s += test_sf_check_result(message_buff, F, 0.0735194711823798495, TEST_TOL3);
+ s += test_sf_check_result(message_buff, Fp, 0.6368149124126783325, TEST_TOL3);
+ /*
+ s += test_sf_check_result(message_buff, G, , TEST_TOL5);
+ s += test_sf_check_result(message_buff, Gp, , TEST_TOL5);
+ */
+ printf("%s", message_buff);
+ gsl_test(s," gsl_sf_coulomb_wave_FG_e(50.0, 120.0, lam_F=4, lam_G=2)");
+ status += s;
+
+ lam_F = 0.0;
+ k_G = 0;
+ eta = -1000.0;
+ x = 1.0;
+ gsl_sf_coulomb_wave_FG_e(eta, x, lam_F, k_G, &F, &Fp, &G, &Gp, &Fe, &Ge);
+ s = 0;
+ message_buff[0] = 0;
+ s += test_sf_check_result(message_buff, F, 9.68222518991341e-02, TEST_TOL3);
+ s += test_sf_check_result(message_buff, Fp, 5.12063396274631e+00, TEST_TOL3);
+ s += test_sf_check_result(message_buff, G, 1.13936784379472e-01, TEST_TOL3);
+ s += test_sf_check_result(message_buff, Gp, -4.30243486522438e+00, TEST_TOL3);
+ printf("%s", message_buff);
+ gsl_test(s, " gsl_sf_coulomb_wave_FG_e(-1000.0, 1.0, lam_F=0, lam_G=0)");
+ status += s;
+
+ lam_min = 0.0;
+ eta = -50.0;
+ x = 5.0;
+ gsl_sf_coulomb_wave_FG_e(eta, x, lam_F, k_G, &F, &Fp, &G, &Gp, &Fe, &Ge);
+ s = 0;
+ message_buff[0] = 0;
+ s += test_sf_check_result(message_buff, F, 1.52236975714236e-01, TEST_TOL3);
+ s += test_sf_check_result(message_buff, Fp, 2.03091041166137e+00, TEST_TOL3);
+ s += test_sf_check_result(message_buff, G, 4.41680690236251e-01, TEST_TOL3);
+ s += test_sf_check_result(message_buff, Gp, -6.76485374766869e-01, TEST_TOL3);
+ printf("%s", message_buff);
+ gsl_test(s, " gsl_sf_coulomb_wave_FG_e(-50.0, 5.0, lam_F=0, lam_G=0)");
+ status += s;
+
+ lam_min = 0.0;
+ eta = -50.0;
+ x = 1000.0;
+ gsl_sf_coulomb_wave_FG_e(eta, x, lam_F, k_G, &F, &Fp, &G, &Gp, &Fe, &Ge);
+ s = 0;
+ message_buff[0] = 0;
+ s += test_sf_check_result(message_buff, F, -0.2267212182760888523, TEST_TOL3);
+ s += test_sf_check_result(message_buff, Fp, -0.9961306810018401525, TEST_TOL3);
+ s += test_sf_check_result(message_buff, G, -0.9497684438900352186, TEST_TOL3);
+ s += test_sf_check_result(message_buff, Gp, 0.2377656295411961399, TEST_TOL3);
+ printf("%s", message_buff);
+ gsl_test(s, " gsl_sf_coulomb_wave_FG_e(-50.0, 1000.0, lam_F=0, lam_G=0)");
+ status += s;
+
+ lam_F = 10.0;
+ k_G = 0;
+ eta = -50.0;
+ x = 5.0;
+ gsl_sf_coulomb_wave_FG_e(eta, x, lam_F, k_G, &F, &Fp, &G, &Gp, &Fe, &Ge);
+ s = 0;
+ message_buff[0] = 0;
+ s += test_sf_check_result(message_buff, F, -3.681143602184922e-01, TEST_TOL3);
+ s += test_sf_check_result(message_buff, Fp, 1.338467510317215e+00, TEST_TOL3);
+ s += test_sf_check_result(message_buff, G, 3.315883246109351e-01, TEST_TOL3);
+ s += test_sf_check_result(message_buff, Gp, 1.510888628136180e+00, TEST_TOL3);
+ printf("%s", message_buff);
+ gsl_test(s, " gsl_sf_coulomb_wave_FG_e(-50.0, 5.0, lam_F=10, lam_G=10)");
+ status += s;
+
+ lam_F = 0.0;
+ k_G = 0;
+ eta = -4.0;
+ x = 5.0;
+ gsl_sf_coulomb_wave_FG_e(eta, x, lam_F, k_G, &F, &Fp, &G, &Gp, &Fe, &Ge);
+ s = 0;
+ message_buff[0] = 0;
+ s += test_sf_check_result(message_buff, F, 4.078627230056172e-01, TEST_TOL3);
+ s += test_sf_check_result(message_buff, Fp, 1.098212336357310e+00, TEST_TOL3);
+ s += test_sf_check_result(message_buff, G, 6.743270353832442e-01, TEST_TOL3);
+ s += test_sf_check_result(message_buff, Gp, -6.361104272804447e-01, TEST_TOL3);
+ printf("%s", message_buff);
+ gsl_test(s, " gsl_sf_coulomb_wave_FG_e(-4.0, 5.0, lam_F=0, lam_G=0");
+ status += s;
+
+ lam_F = 3.0;
+ k_G = 0;
+ eta = -4.0;
+ x = 5.0;
+ gsl_sf_coulomb_wave_FG_e(eta, x, lam_F, k_G, &F, &Fp, &G, &Gp, &Fe, &Ge);
+ s = 0;
+ message_buff[0] = 0;
+ s += test_sf_check_result(message_buff, F, -2.568630935581323e-01, TEST_TOL3);
+ s += test_sf_check_result(message_buff, Fp, 1.143229422014827e+00, TEST_TOL3);
+ s += test_sf_check_result(message_buff, G, 7.879899223927996e-01, TEST_TOL3);
+ s += test_sf_check_result(message_buff, Gp, 3.859905878106713e-01, TEST_TOL3);
+ printf("%s", message_buff);
+ gsl_test(s, " gsl_sf_coulomb_wave_FG_e(-4.0, 5.0, lam_F=3, lam_G=3");
+ status += s;
+
+ lam_F = 0.0;
+ k_G = 0;
+ eta = 1.0;
+ x = 2.0;
+ gsl_sf_coulomb_wave_FG_e(eta, x, lam_F, k_G, &F, &Fp, &G, &Gp, &Fe, &Ge);
+ s = 0;
+ message_buff[0] = 0;
+ s += test_sf_check_result(message_buff, F, 6.61781613832681e-01, TEST_TOL3);
+ s += test_sf_check_result(message_buff, Fp, 4.81557455709949e-01, TEST_TOL3);
+ s += test_sf_check_result(message_buff, G, 1.27577878476828e+00, TEST_TOL3);
+ s += test_sf_check_result(message_buff, Gp, -5.82728813097184e-01, TEST_TOL3);
+ printf("%s", message_buff);
+ gsl_test(s, " gsl_sf_coulomb_wave_FG_e(1.0, 2.0, lam_F=0, lam_G=0)");
+ status += s;
+
+ lam_F = 0.0;
+ k_G = 0;
+ eta = 1.0;
+ x = 0.5;
+ gsl_sf_coulomb_wave_FG_e(eta, x, lam_F, k_G, &F, &Fp, &G, &Gp, &Fe, &Ge);
+ s = 0;
+ message_buff[0] = 0;
+ s += test_sf_check_result(message_buff, F, 0.08315404535022023302, TEST_TOL3);
+ s += test_sf_check_result(message_buff, Fp, 0.22693874616222787568, TEST_TOL3);
+ s += test_sf_check_result(message_buff, G, 3.1060069279548875140, TEST_TOL3);
+ s += test_sf_check_result(message_buff, Gp, -3.549156038719924236, TEST_TOL3);
+ printf("%s", message_buff);
+ gsl_test(s, " gsl_sf_coulomb_wave_FG_e(1.0, 0.5, lam_F=0, lam_G=0)");
+ status += s;
+
+ lam_F = 0.5;
+ k_G = 0;
+ eta = 1.0;
+ x = 0.5;
+ gsl_sf_coulomb_wave_FG_e(eta, x, lam_F, k_G, &F, &Fp, &G, &Gp, &Fe, &Ge);
+ s = 0;
+ message_buff[0] = 0;
+ s += test_sf_check_result(message_buff, F, 0.04049078073829290935, TEST_TOL3);
+ s += test_sf_check_result(message_buff, Fp, 0.14194939168094778795, TEST_TOL3);
+ s += test_sf_check_result(message_buff, G, 4.720553853049677897, TEST_TOL3);
+ s += test_sf_check_result(message_buff, Gp, -8.148033852319180005, TEST_TOL3);
+ printf("%s", message_buff);
+ gsl_test(s, " gsl_sf_coulomb_wave_FG_e(1.0, 0.5, lam_F=0.5, lam_G=0.5)");
+ status += s;
+
+ lam_F = 0.1;
+ k_G = 0;
+ eta = 1.0;
+ x = 0.5;
+ gsl_sf_coulomb_wave_FG_e(eta, x, lam_F, k_G, &F, &Fp, &G, &Gp, &Fe, &Ge);
+ s = 0;
+ message_buff[0] = 0;
+ s += test_sf_check_result(message_buff, F, 0.07365466672379703418, TEST_TOL5);
+ s += test_sf_check_result(message_buff, Fp, 0.21147121807178518647, TEST_TOL5);
+ s += test_sf_check_result(message_buff, G, 3.306705446241024890, TEST_TOL5);
+ s += test_sf_check_result(message_buff, Gp, -4.082931670935696644, TEST_TOL5);
+ printf("%s", message_buff);
+ gsl_test(s, " gsl_sf_coulomb_wave_FG_e(1.0, 0.5, lam_F=0.1, lam_G=0.1)");
+ status += s;
+
+ lam_F = 0.0;
+ k_G = 0;
+ eta = 8.0;
+ x = 1.05;
+ gsl_sf_coulomb_wave_FG_e(eta, x, lam_F, k_G, &F, &Fp, &G, &Gp, &Fe, &Ge);
+ s = 0;
+ message_buff[0] = 0;
+ s += test_sf_check_result(message_buff, F, 9.882706082810274357e-09, TEST_TOL5);
+ s += test_sf_check_result(message_buff, Fp, 4.005167028235547770e-08, TEST_TOL5);
+ s += test_sf_check_result(message_buff, G, 1.333127992006686320e+07, TEST_SQRT_TOL0);
+ s += test_sf_check_result(message_buff, Gp, -4.715914530842402330e+07, TEST_SQRT_TOL0);
+ printf("%s", message_buff);
+ gsl_test(s, " gsl_sf_coulomb_wave_FG_e(8.0, 1.05, lam_F=0, lam_G=0)");
+ status += s;
+
+ lam_F = 0.1;
+ k_G = 0;
+ eta = 8.0;
+ x = 1.05;
+ gsl_sf_coulomb_wave_FG_e(eta, x, lam_F, k_G, &F, &Fp, &G, &Gp, &Fe, &Ge);
+ s = 0;
+ message_buff[0] = 0;
+ s += test_sf_check_result(message_buff, F, 9.611416736061987761e-09, TEST_TOL5);
+ s += test_sf_check_result(message_buff, Fp, 3.909628126126824140e-08, TEST_TOL5);
+ s += test_sf_check_result(message_buff, G, 1.365928464219262581e+07, 4.0*TEST_SQRT_TOL0);
+ s += test_sf_check_result(message_buff, Gp, -4.848117385783386850e+07, 4.0*TEST_SQRT_TOL0);
+ printf("%s", message_buff);
+ gsl_test(s, " gsl_sf_coulomb_wave_FG_e(8.0, 1.05, lam_F=0.1, lam_G=0.1)");
+ status += s;
+
+ lam_F = 0.0;
+ k_G = 0;
+ eta = 50.0;
+ x = 0.1;
+ gsl_sf_coulomb_wave_FG_e(eta, x, lam_F, k_G, &F, &Fp, &G, &Gp, &Fe, &Ge);
+ s = 0;
+ message_buff[0] = 0;
+ s += test_sf_check_result(message_buff, F, 2.807788027954216071e-67, TEST_TOL5);
+ s += test_sf_check_result(message_buff, Fp, 9.677600748751576606e-66, TEST_TOL5);
+ s += test_sf_check_result(message_buff, G, 5.579810686998358766e+64, TEST_SQRT_TOL0);
+ s += test_sf_check_result(message_buff, Gp, -1.638329512756321424e+66, TEST_SQRT_TOL0);
+ printf("%s", message_buff);
+ gsl_test(s, " gsl_sf_coulomb_wave_FG_e(50.0, 0.1, lam_F=0, lam_G=0)");
+ status += s;
+
+ lam_F = 0.0;
+ k_G = 0;
+ eta = 10.0;
+ x = 5.0;
+ gsl_sf_coulomb_wave_FG_e(eta, x, lam_F, k_G, &F, &Fp, &G, &Gp, &Fe, &Ge);
+ s = 0;
+ message_buff[0] = 0;
+ s += test_sf_check_result(message_buff, F, 1.7207454091787930614e-06, 10.0*WKB_TOL);
+ s += test_sf_check_result(message_buff, Fp, 3.0975994706405458046e-06, 10.0*WKB_TOL);
+ s += test_sf_check_result(message_buff, G, 167637.56609459967623, 10.0*WKB_TOL);
+ s += test_sf_check_result(message_buff, Gp, -279370.76655361803075, 10.0*WKB_TOL);
+ printf("%s", message_buff);
+ gsl_test(s, " gsl_sf_coulomb_wave_FG_e(10.0, 5.0, lam_F=0, lam_G=0)");
+ status += s;
+
+ lam_F = 0.0;
+ k_G = 0;
+ eta = 25.0;
+ x = 10.0;
+ gsl_sf_coulomb_wave_FG_e(eta, x, lam_F, k_G, &F, &Fp, &G, &Gp, &Fe, &Ge);
+ s = 0;
+ message_buff[0] = 0;
+ s += test_sf_check_result(message_buff, F, 1.5451274501076114315e-16, 5.0*WKB_TOL);
+ s += test_sf_check_result(message_buff, Fp, 3.1390869393378630928e-16, 5.0*WKB_TOL);
+ s += test_sf_check_result(message_buff, G, 1.6177129008336318136e+15, 5.0*WKB_TOL);
+ s += test_sf_check_result(message_buff, Gp, -3.1854062013149740860e+15, 5.0*WKB_TOL);
+ printf("%s", message_buff);
+ gsl_test(s, " gsl_sf_coulomb_wave_FG_e(25.0, 10.0, lam_F=0, lam_G=0)");
+ status += s;
+
+ lam_F = 0.0;
+ k_G = 0;
+ eta = 1.0;
+ x = 9.2;
+ gsl_sf_coulomb_wave_FG_e(eta, x, lam_F, k_G, &F, &Fp, &G, &Gp, &Fe, &Ge);
+ s = 0;
+ message_buff[0] = 0;
+ s += test_sf_check_result(message_buff, F, -0.25632012319757955655, TEST_TOL5);
+ s += test_sf_check_result(message_buff, Fp, 0.91518792286724220370, TEST_TOL5);
+ s += test_sf_check_result(message_buff, G, 1.03120585918973466110, TEST_SQRT_TOL0);
+ s += test_sf_check_result(message_buff, Gp, 0.21946326717491250193, TEST_SQRT_TOL0);
+ printf("%s", message_buff);
+ gsl_test(s, " gsl_sf_coulomb_wave_FG_e(1.0, 9.2, lam_F=0, lam_G=0)");
+ status += s;
+
+ lam_F = 0.0;
+ eta = 10.0;
+ x = 10.0;
+ gsl_sf_coulomb_wave_FG_e(eta, x, lam_F, k_G, &F, &Fp, &G, &Gp, &Fe, &Ge);
+ s = 0;
+ message_buff[0] = 0;
+ s += test_sf_check_result(message_buff, F, 0.0016262711250135878249, WKB_TOL);
+ s += test_sf_check_result(message_buff, Fp, 0.0017060476320792806014, WKB_TOL);
+ s += test_sf_check_result(message_buff, G, 307.87321661090837987, WKB_TOL);
+ s += test_sf_check_result(message_buff, Gp, -291.92772380826822871, WKB_TOL);
+ printf("%s", message_buff);
+ gsl_test(s, " gsl_sf_coulomb_wave_FG_e(10.0, 10.0, lam_F=0, lam_G=0)");
+ status += s;
+
+ lam_F = 0.0;
+ eta = 100.0;
+ x = 1.0;
+ gsl_sf_coulomb_wave_FG_e(eta, x, lam_F, k_G, &F, &Fp, &G, &Gp, &Fe, &Ge);
+ s = 0;
+ message_buff[0] = 0;
+ s += test_sf_check_result(message_buff, F, 8.999367996930662705e-126, 10.0*WKB_TOL);
+ s += test_sf_check_result(message_buff, Fp, 1.292746745757069321e-124, 10.0*WKB_TOL);
+ s += test_sf_check_result(message_buff, G, 3.936654148133683610e+123, 10.0*WKB_TOL);
+ s += test_sf_check_result(message_buff, Gp, -5.456942268061526371e+124, 10.0*WKB_TOL);
+ printf("%s", message_buff);
+ gsl_test(s, " gsl_sf_coulomb_wave_FG_e(100.0, 1.0, lam_F=0, lam_G=0)");
+ status += s;
+
+ /* compute F_1(eta=0,x=3.25), F'_1 and G_1(eta=0,x=3.25), G'_1 */
+
+ lam_F = 1.0;
+ eta = 0.0;
+ x = 3.25;
+ k_G = 0;
+ gsl_sf_coulomb_wave_FG_e(eta, x, lam_F, k_G, &F, &Fp, &G, &Gp, &Fe, &Ge);
+ s = 0;
+ message_buff[0] = 0;
+ s += test_sf_check_result(message_buff, F, sin(x)/x - cos(x), TEST_TOL3);
+ s += test_sf_check_result(message_buff, Fp, -sin(x)/(x*x) + cos(x)/x +sin(x), TEST_TOL3);
+ s += test_sf_check_result(message_buff, G, cos(x)/x + sin(x), TEST_TOL3);
+ s += test_sf_check_result(message_buff, Gp, -cos(x)/(x*x) - sin(x)/x + cos(x), TEST_TOL3);
+ printf("%s", message_buff);
+ gsl_test(s, " gsl_sf_coulomb_wave_FG_e(3.25, 0.0, lam_F=1, lam_G=1)");
+ status += s;
+
+ /* compute F_1(eta=0,x=3.25), F'_1 and G_0(eta=0,x=3.25), G'_0 */
+
+ lam_F = 1.0;
+ eta = 0.0;
+ x = 3.25;
+ k_G = 1;
+ gsl_sf_coulomb_wave_FG_e(eta, x, lam_F, k_G, &F, &Fp, &G, &Gp, &Fe, &Ge);
+ s = 0;
+ message_buff[0] = 0;
+ s += test_sf_check_result(message_buff, F, sin(x)/x - cos(x), TEST_TOL3);
+ s += test_sf_check_result(message_buff, Fp, -sin(x)/(x*x) + cos(x)/x +sin(x), TEST_TOL3);
+ s += test_sf_check_result(message_buff, G, cos(x), TEST_TOL3);
+ s += test_sf_check_result(message_buff, Gp, -sin(x), TEST_TOL3);
+ printf("%s", message_buff);
+ gsl_test(s, " gsl_sf_coulomb_wave_FG_e(3.25, 0.0, lam_F=1, lam_G=0)");
+ status += s;
+
+ return status;
+}
diff --git a/gsl-1.9/specfunc/test_dilog.c b/gsl-1.9/specfunc/test_dilog.c
new file mode 100644
index 0000000..7e73121
--- /dev/null
+++ b/gsl-1.9/specfunc/test_dilog.c
@@ -0,0 +1,310 @@
+/* specfunc/test_dilog.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_sf.h>
+#include "test_sf.h"
+
+
+int test_dilog(void)
+{
+ gsl_sf_result r;
+ gsl_sf_result r1, r2;
+ int s = 0;
+
+ /* real dilog */
+
+ TEST_SF(s, gsl_sf_dilog_e, (-3.0, &r), -1.9393754207667089531, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_dilog_e, (-0.5, &r), -0.4484142069236462024, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_dilog_e, (-0.001, &r), -0.0009997501110486510834, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_dilog_e, (0.1, &r), 0.1026177910993911, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_dilog_e, (0.7, &r), 0.8893776242860387386, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_dilog_e, (1.0, &r), 1.6449340668482260, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_dilog_e, (1.5, &r), 2.3743952702724802007, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_dilog_e, (2.0, &r), 2.4674011002723397, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_dilog_e, ( 5.0, &r), 1.7837191612666306277, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_dilog_e, ( 11.0, &r), 0.3218540439999117111, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_dilog_e, (12.59, &r), 0.0010060918167266208634, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_dilog_e, (12.595, &r), 0.00003314826006436236810, TEST_TOL5, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_dilog_e, (13.0, &r), -0.07806971248458575855, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_dilog_e, (20.0, &r), -1.2479770861745251168, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_dilog_e, (150.0, &r), -9.270042702348657270, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_dilog_e, (1100.0, &r), -21.232504073931749553, TEST_TOL0, GSL_SUCCESS);
+
+
+ /* complex dilog */
+
+ TEST_SF_2(s, gsl_sf_complex_dilog_e, (0.99999, M_PI/2.0, &r1, &r2),
+ -0.20561329262779687646, TEST_TOL0,
+ 0.91595774018131512060, TEST_TOL0,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_dilog_e, (0.991, M_PI/2.0, &r1, &r2),
+ -0.20250384721077806127, TEST_TOL0,
+ 0.90888544355846447810, TEST_TOL0,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_dilog_e, (0.98, M_PI/2.0, &r1, &r2),
+ -0.19871638377785918403, TEST_TOL2,
+ 0.90020045882981847610, TEST_TOL2,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_dilog_e, (0.98, -M_PI/2.0, &r1, &r2),
+ -0.19871638377785918403, TEST_TOL2,
+ -0.90020045882981847610, TEST_TOL2,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_dilog_e, (0.95, M_PI/2.0, &r1, &r2),
+ -0.18848636456893572091, TEST_TOL1,
+ 0.87633754133420277830, TEST_TOL1,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_dilog_e, (0.8, M_PI/2.0, &r1, &r2),
+ -0.13980800855429037810, TEST_TOL0,
+ 0.75310609092419884460, TEST_TOL0,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_dilog_e, (0.8, -M_PI/2.0, &r1, &r2),
+ -0.13980800855429037810, TEST_TOL0,
+ -0.75310609092419884460, TEST_TOL0,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_dilog_e, (0.5, M_PI/2.0, &r1, &r2),
+ -0.05897507442156586346, TEST_TOL1,
+ 0.48722235829452235710, TEST_TOL1,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_dilog_e, (0.5, -M_PI/2.0, &r1, &r2),
+ -0.05897507442156586346, TEST_TOL1,
+ -0.48722235829452235710, TEST_TOL1,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_dilog_e, (0.01, M_PI/2.0, &r1, &r2),
+ -0.000024999375027776215378, TEST_TOL3,
+ 0.009999888892888684820, TEST_TOL3,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_dilog_e, (0.01, -M_PI/2.0, &r1, &r2),
+ -0.000024999375027776215378, TEST_TOL3,
+ -0.009999888892888684820, TEST_TOL3,
+ GSL_SUCCESS);
+
+
+ TEST_SF_2(s, gsl_sf_complex_dilog_e, (0.99, M_PI/4.0, &r1, &r2),
+ 0.56273366219795547757, TEST_TOL3,
+ 0.97009284079274560384, TEST_TOL3,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_dilog_e, (0.99, -M_PI/4.0, &r1, &r2),
+ 0.56273366219795547757, TEST_TOL3,
+ -0.97009284079274560384, TEST_TOL3,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_dilog_e, (0.99, 3.0*M_PI/4.0, &r1, &r2),
+ -0.66210902664245926235, TEST_TOL1,
+ 0.51995305609998319025, TEST_TOL1,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_dilog_e, (0.99, 5.0*M_PI/4.0, &r1, &r2),
+ -0.66210902664245926235, TEST_TOL1,
+ -0.51995305609998319025, TEST_TOL1,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_dilog_e, (0.99, 3.0*M_PI/2.0, &r1, &r2),
+ -0.20215874509123277909, TEST_TOL1,
+ -0.90809733095648731408, TEST_TOL1,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_dilog_e, (0.25, 3.0*M_PI/2.0, &r1, &r2),
+ -0.01538741178141053563, TEST_TOL1,
+ -0.24830175098230686908, TEST_TOL1,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_dilog_e, (0.25, 15.0/8.0*M_PI, &r1, &r2),
+ 0.24266162342377302235, TEST_TOL1,
+ -0.10860883369274445067, TEST_TOL1,
+ GSL_SUCCESS);
+
+
+ TEST_SF_2(s, gsl_sf_complex_dilog_e, (0.99, M_PI/8.0, &r1, &r2),
+ 1.0571539648820244720, TEST_TOL0,
+ 0.7469145254610851318, TEST_TOL0,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_dilog_e, (0.99, M_PI/64.0, &r1, &r2),
+ 1.5381800285902999666, TEST_TOL0,
+ 0.1825271634987756651, TEST_TOL0,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_dilog_e, (0.99, -M_PI/8.0, &r1, &r2),
+ 1.05715396488202447202, TEST_TOL1,
+ -0.74691452546108513176, TEST_TOL1,
+ GSL_SUCCESS);
+
+
+ TEST_SF_2(s, gsl_sf_complex_dilog_e, (1.00001, M_PI/2.0, &r1, &r2),
+ -0.20562022409960237363, TEST_TOL1,
+ 0.91597344814458309320, TEST_TOL1,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_dilog_e, (10.0, M_PI/2.0, &r1, &r2),
+ -3.0596887943287347304, TEST_TOL0,
+ 3.7167814930680685900, TEST_TOL0,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_dilog_e, (100.0, M_PI/2.0, &r1, &r2),
+ -11.015004738293824854, TEST_TOL0,
+ 7.2437843013083534970, TEST_TOL0,
+ GSL_SUCCESS);
+
+
+ /** tests brought up by Jim McElwaine bug report */
+
+ TEST_SF_2(s, gsl_sf_complex_dilog_e, (1.1, -M_PI/2.0, &r1, &r2),
+ -0.24099184177382733037, TEST_TOL1,
+ -0.99309132538137822631, TEST_TOL1,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_dilog_e, (1.1, 3.0*M_PI/2.0, &r1, &r2),
+ -0.24099184177382733037, TEST_TOL1,
+ -0.99309132538137822631, TEST_TOL1,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_dilog_e, (1.1, -3.0*M_PI/2.0, &r1, &r2),
+ -0.24099184177382733037, TEST_TOL1,
+ 0.99309132538137822631, TEST_TOL1,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_dilog_e, (1.1, -M_PI - 0.25*M_PI, &r1, &r2),
+ -0.72908565537087935118, TEST_TOL1,
+ 0.56225783937234862649, TEST_TOL1,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_dilog_e, (1.1, M_PI + 0.25*M_PI, &r1, &r2),
+ -0.72908565537087935118, TEST_TOL1,
+ -0.56225783937234862649, TEST_TOL1,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_dilog_e, (1.1, -M_PI/128.0, &r1, &r2),
+ 1.8881719454909716580, TEST_TOL1,
+ -0.3556738764969238976, TEST_TOL1,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_dilog_e, (1.1, M_PI/128.0, &r1, &r2),
+ 1.8881719454909716580, TEST_TOL1,
+ 0.3556738764969238976, TEST_TOL1,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_dilog_e, (1.5, M_PI/8.0, &r1, &r2),
+ 1.3498525763442498343, TEST_TOL1,
+ 1.4976532712229749493, TEST_TOL1,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_dilog_e, (1.5, -M_PI/8.0, &r1, &r2),
+ 1.3498525763442498343, TEST_TOL1,
+ -1.4976532712229749493, TEST_TOL1,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_dilog_e, (1.5, 2.0*M_PI + M_PI/8.0, &r1, &r2),
+ 1.3498525763442498343, TEST_TOL1,
+ 1.4976532712229749493, TEST_TOL1,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_dilog_e, (1.5, 2.0*M_PI - M_PI/8.0, &r1, &r2),
+ 1.3498525763442498343, TEST_TOL1,
+ -1.4976532712229749493, TEST_TOL1,
+ GSL_SUCCESS);
+
+
+ /* tests of the (x,y) function, which is now the underlying implementation */
+
+ TEST_SF_2(s, gsl_sf_complex_dilog_xy_e, (0.0, 0.5, &r1, &r2),
+ -0.05897507442156586346, TEST_TOL1,
+ 0.48722235829452235710, TEST_TOL1,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_dilog_xy_e, (0.0, -0.5, &r1, &r2),
+ -0.05897507442156586346, TEST_TOL1,
+ -0.48722235829452235710, TEST_TOL1,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_dilog_xy_e, (0.91464073718617389108, 0.37885659804143889673, &r1, &r2),
+ 1.0571539648820244720, TEST_TOL0,
+ 0.7469145254610851318, TEST_TOL0,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_dilog_xy_e, (0.91464073718617389108, -0.37885659804143889673, &r1, &r2),
+ 1.05715396488202447202, TEST_TOL1,
+ -0.74691452546108513176, TEST_TOL1,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_dilog_xy_e, (-1.5, 0.0, &r1, &r2),
+ -1.1473806603755707541, TEST_TOL1,
+ 0.0, TEST_TOL1,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_dilog_xy_e, (0.5, 0.0, &r1, &r2),
+ 0.58224052646501250590, TEST_TOL1,
+ 0.0, TEST_TOL1,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_dilog_xy_e, (1.5, 0.0, &r1, &r2),
+ 2.3743952702724802007, TEST_TOL1,
+ -1.2738062049196005309, TEST_TOL1,
+ GSL_SUCCESS);
+
+
+ /* small set of spence tests, mostly to check the value on the cut */
+
+ TEST_SF_2(s, gsl_sf_complex_spence_xy_e, (1.5, 0.0, &r1, &r2),
+ -0.44841420692364620244, TEST_TOL1,
+ 0.0, TEST_TOL1,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_spence_xy_e, (0.5, 0.0, &r1, &r2),
+ 0.58224052646501250590, TEST_TOL1,
+ 0.0, TEST_TOL1,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_spence_xy_e, (0.0, 0.0, &r1, &r2),
+ 1.6449340668482264365, TEST_TOL1,
+ 0.0, TEST_TOL1,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_spence_xy_e, (-0.5, 0.0, &r1, &r2),
+ 2.3743952702724802007, TEST_TOL1,
+ -1.2738062049196005309, TEST_TOL1,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_spence_xy_e, (-0.5, 1.0/1024.0, &r1, &r2),
+ 2.3723507455234125018, TEST_TOL1,
+ -1.2742581376517839070, TEST_TOL1,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_spence_xy_e, (-0.5, -1.0/1024.0, &r1, &r2),
+ 2.3723507455234125018, TEST_TOL1,
+ 1.2742581376517839070, TEST_TOL1,
+ GSL_SUCCESS);
+
+
+ return s;
+}
diff --git a/gsl-1.9/specfunc/test_gamma.c b/gsl-1.9/specfunc/test_gamma.c
new file mode 100644
index 0000000..fe8341f
--- /dev/null
+++ b/gsl-1.9/specfunc/test_gamma.c
@@ -0,0 +1,343 @@
+/* specfunc/test_gamma.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_sf.h>
+#include "test_sf.h"
+
+
+int test_gamma(void)
+{
+ gsl_sf_result r;
+ gsl_sf_result r1, r2;
+ double sgn;
+ int s = 0;
+
+ TEST_SF(s, gsl_sf_lngamma_e, (-0.1, &r), 2.368961332728788655 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lngamma_e, (-1.0/256.0, &r), 5.547444766967471595 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lngamma_e, (1.0e-08, &r), 18.420680738180208905 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lngamma_e, (0.1, &r), 2.252712651734205 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lngamma_e, (1.0 + 1.0/256.0, &r), -0.0022422226599611501448 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lngamma_e, (2.0 + 1.0/256.0, &r), 0.0016564177556961728692 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lngamma_e, (100.0, &r), 359.1342053695753 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lngamma_e, (-1.0-1.0/65536.0, &r), 11.090348438090047844 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lngamma_e, (-1.0-1.0/268435456.0, &r), 19.408121054103474300 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lngamma_e, (-100.5, &r), -364.9009683094273518 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lngamma_e, (-100-1.0/65536.0, &r), -352.6490910117097874 , TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF_SGN(s, gsl_sf_lngamma_sgn_e, (0.7, &r, &sgn), 0.26086724653166651439, TEST_TOL1, 1.0, GSL_SUCCESS);
+ TEST_SF_SGN(s, gsl_sf_lngamma_sgn_e, (0.1, &r, &sgn), 2.2527126517342059599, TEST_TOL0, 1.0, GSL_SUCCESS);
+ TEST_SF_SGN(s, gsl_sf_lngamma_sgn_e, (-0.1, &r, &sgn), 2.368961332728788655, TEST_TOL0, -1.0, GSL_SUCCESS);
+ TEST_SF_SGN(s, gsl_sf_lngamma_sgn_e, (-1.0-1.0/65536.0, &r, &sgn), 11.090348438090047844, TEST_TOL0, 1.0, GSL_SUCCESS);
+ TEST_SF_SGN(s, gsl_sf_lngamma_sgn_e, (-2.0-1.0/256.0, &r, &sgn), 4.848447725860607213, TEST_TOL0, -1.0, GSL_SUCCESS);
+ TEST_SF_SGN(s, gsl_sf_lngamma_sgn_e, (-2.0-1.0/65536.0, &r, &sgn), 10.397193628164674967, TEST_TOL0, -1.0, GSL_SUCCESS);
+ TEST_SF_SGN(s, gsl_sf_lngamma_sgn_e, (-3.0-1.0/8.0, &r, &sgn), 0.15431112768404182427, TEST_TOL2, 1.0, GSL_SUCCESS);
+ TEST_SF_SGN(s, gsl_sf_lngamma_sgn_e, (-100.5, &r, &sgn), -364.9009683094273518, TEST_TOL0, -1.0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_gamma_e, (1.0 + 1.0/4096.0, &r), 0.9998591371459403421 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_e, (1.0 + 1.0/32.0, &r), 0.9829010992836269148 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_e, (2.0 + 1.0/256.0, &r), 1.0016577903733583299 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_e, (9.0, &r), 40320.0 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_e, (10.0, &r), 362880.0 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_e, (100.0, &r), 9.332621544394415268e+155 , TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_e, (170.0, &r), 4.269068009004705275e+304 , TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_e, (171.0, &r), 7.257415615307998967e+306 , TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_e, (-10.5, &r), -2.640121820547716316e-07 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_e, (-11.25, &r), 6.027393816261931672e-08 , TEST_TOL0, GSL_SUCCESS); /* exp()... not my fault */
+ TEST_SF(s, gsl_sf_gamma_e, (-1.0+1.0/65536.0, &r), -65536.42280587818970 , TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_gammastar_e, (1.0e-08, &r), 3989.423555759890865 , TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gammastar_e, (1.0e-05, &r), 126.17168469882690233 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gammastar_e, (0.001, &r), 12.708492464364073506 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gammastar_e, (1.5, &r), 1.0563442442685598666 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gammastar_e, (3.0, &r), 1.0280645179187893045 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gammastar_e, (9.0, &r), 1.0092984264218189715 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gammastar_e, (11.0, &r), 1.0076024283104962850 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gammastar_e, (100.0, &r), 1.0008336778720121418 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gammastar_e, (1.0e+05, &r), 1.0000008333336805529 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gammastar_e, (1.0e+20, &r), 1.0 , TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_gammainv_e, (1.0, &r), 1.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gammainv_e, (2.0, &r), 1.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gammainv_e, (3.0, &r), 0.5, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gammainv_e, (4.0, &r), 1.0/6.0, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_gammainv_e, (10.0, &r), 1.0/362880.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gammainv_e, (100.0, &r), 1.0715102881254669232e-156, TEST_TOL2, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_gammainv_e, (0.0, &r), 0.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gammainv_e, (-1.0, &r), 0.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gammainv_e, (-2.0, &r), 0.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gammainv_e, (-3.0, &r), 0.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gammainv_e, (-4.0, &r), 0.0, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_gammainv_e, (-10.5, &r), -1.0/2.640121820547716316e-07, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gammainv_e, (-11.25, &r), 1.0/6.027393816261931672e-08, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gammainv_e, (-1.0+1.0/65536.0, &r), -1.0/65536.42280587818970 , TEST_TOL1, GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_lngamma_complex_e, (5.0, 2.0, &r1, &r2),
+ 2.7487017561338026749, TEST_TOL0,
+ 3.0738434100497007915, TEST_TOL0,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_lngamma_complex_e, (100.0, 100.0, &r1, &r2),
+ 315.07804459949331323, TEST_TOL1,
+ 2.0821801804113110099, TEST_TOL3,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_lngamma_complex_e, (100.0, -1000.0, &r1, &r2),
+ -882.3920483010362817000, TEST_TOL1,
+ -2.1169293725678813270, TEST_TOL3,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_lngamma_complex_e, (-100.0, -1.0, &r1, &r2),
+ -365.0362469529239516000, TEST_TOL1,
+ -3.0393820262864361140, TEST_TOL1,
+ GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_taylorcoeff_e, (10, 1.0/1048576.0, &r), 1.7148961854776073928e-67 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_taylorcoeff_e, (10, 1.0/1024.0, &r), 2.1738891788497900281e-37 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_taylorcoeff_e, (10, 1.0, &r), 2.7557319223985890653e-07 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_taylorcoeff_e, (10, 5.0, &r), 2.6911444554673721340 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_taylorcoeff_e, (10, 500.0, &r), 2.6911444554673721340e+20 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_taylorcoeff_e, (100, 100.0, &r), 1.0715102881254669232e+42 , TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_taylorcoeff_e, (1000, 200.0, &r), 2.6628790558154746898e-267 , TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_taylorcoeff_e, (1000, 500.0, &r), 2.3193170139740855074e+131 , TEST_TOL1, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_fact_e, (0, &r), 1.0 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fact_e, (1, &r), 1.0 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fact_e, (7, &r), 5040.0 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fact_e, (33, &r), 8.683317618811886496e+36 , TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_doublefact_e, (0, &r), 1.0 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_doublefact_e, (1, &r), 1.0 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_doublefact_e, (7, &r), 105.0 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_doublefact_e, (33, &r), 6.332659870762850625e+18 , TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_lnfact_e, (0, &r), 0.0 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lnfact_e, (1, &r), 0.0 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lnfact_e, (7, &r), 8.525161361065414300 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lnfact_e, (33, &r), 85.05446701758151741 , TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_lndoublefact_e, (0, &r), 0.0 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lndoublefact_e, (7, &r), 4.653960350157523371 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lndoublefact_e, (33, &r), 43.292252022541719660 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lndoublefact_e, (34, &r), 45.288575519655959140 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lndoublefact_e, (1034, &r), 3075.6383796271197707 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lndoublefact_e, (1035, &r), 3078.8839081731809169 , TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_lnchoose_e, (7,3, &r), 3.555348061489413680 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lnchoose_e, (5,2, &r), 2.302585092994045684 , TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_choose_e, (7,3, &r), 35.0 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_choose_e, (7,4, &r), 35.0 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_choose_e, (5,2, &r), 10.0 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_choose_e, (5,3, &r), 10.0 , TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_choose_e, (500,495, &r), 255244687600.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_choose_e, (500,5, &r), 255244687600.0, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_choose_e, (500,200, &r), 5.054949849935532221e+144 , TEST_TOL5, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_choose_e, (500,300, &r), 5.054949849935532221e+144 , TEST_TOL5, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_lnpoch_e, (5, 0.0, &r), 0.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lnpoch_e, (5, 1.0/65536.0, &r), 0.000022981557571259389129, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lnpoch_e, (5, 1.0/256.0, &r), 0.005884960217985189004, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lnpoch_e, (7,3, &r), 6.222576268071368616, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lnpoch_e, (5,2, &r), 3.401197381662155375, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF_SGN(s, gsl_sf_lnpoch_sgn_e, (5.0, 0.0, &r, &sgn), 0.0, TEST_TOL1, 1.0, GSL_SUCCESS);
+ TEST_SF_SGN(s, gsl_sf_lnpoch_sgn_e, (-4.5, 0.25, &r, &sgn), 0.7430116475119920117, TEST_TOL1, 1.0, GSL_SUCCESS);
+ TEST_SF_SGN(s, gsl_sf_lnpoch_sgn_e, (-4.5, 1.25, &r, &sgn), 2.1899306304483174731, TEST_TOL1, -1.0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_poch_e, (5, 0.0, &r), 1.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_poch_e, (7,3, &r), 504.0 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_poch_e, (5,2, &r), 30.0 , TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_poch_e, (5,1.0/256.0, &r), 1.0059023106151364982 , TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_pochrel_e, (5,0, &r), 1.506117668431800472, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_pochrel_e, (7,3, &r), 503.0/3.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_pochrel_e, (5,2, &r), 29.0/2.0, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_pochrel_e, (5,0.01, &r), 1.5186393661368275330, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_pochrel_e, (-5.5,0.01, &r), 1.8584945633829063516, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_pochrel_e, (-5.5,-1.0/8.0, &r), 1.0883319303552135488, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_pochrel_e, (-5.5,-1.0/256.0, &r), 1.7678268037726177453, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_pochrel_e, (-5.5,-11.0, &r), 0.09090909090939652475, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_gamma_inc_P_e, (1e-100, 0.001, &r), 1.0, TEST_TOL0, GSL_SUCCESS) ;
+ TEST_SF(s, gsl_sf_gamma_inc_P_e, (0.001, 0.001, &r), 0.9936876467088602902, TEST_TOL0, GSL_SUCCESS) ;
+ TEST_SF(s, gsl_sf_gamma_inc_P_e, (0.001, 1.0, &r), 0.9997803916424144436, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_P_e, (0.001, 10.0, &r), 0.9999999958306921828, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_P_e, (1.0, 0.001, &r), 0.0009995001666250083319, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_P_e, (1.0, 1.01, &r), 0.6357810204284766802, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_P_e, (1.0, 10.0, &r), 0.9999546000702375151, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_P_e, (10.0, 10.01, &r), 0.5433207586693410570, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_P_e, (10.0, 20.0, &r), 0.9950045876916924128, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_P_e, (1000.0, 1000.1, &r), 0.5054666401440661753, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_P_e, (1000.0, 2000.0, &r), 1.0, TEST_TOL0, GSL_SUCCESS);
+ /* Test for failure of the Gautschi recurrence (now fixed) for x = a - 2 */
+ TEST_SF(s, gsl_sf_gamma_inc_P_e, (34.0, 32.0, &r), 0.3849626436463866776322932129, TEST_TOL2, GSL_SUCCESS);
+ /* and the next test is gamma_inc_P(37,35-20*eps) */
+ TEST_SF(s, gsl_sf_gamma_inc_P_e, (37.0, 3.499999999999999289e+01, &r), 0.3898035054195570860969333039, TEST_TOL2, GSL_SUCCESS);
+
+ /* Regression test Martin Jansche <jansche@ling.ohio-state.edu> BUG#12 */
+ TEST_SF(s, gsl_sf_gamma_inc_P_e, (10, 1e-16, &r), 2.755731922398588814734648067e-167, TEST_TOL2, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_gamma_inc_Q_e, (0.0, 0.001, &r), 0.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_Q_e, (0.001, 0.001, &r), 0.006312353291139709793, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_Q_e, (0.001, 1.0, &r), 0.00021960835758555639171, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_Q_e, (0.001, 2.0, &r), 0.00004897691783098147880, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_Q_e, (0.001, 5.0, &r), 1.1509813397308608541e-06, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_Q_e, (1.0, 0.001, &r), 0.9990004998333749917, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_Q_e, (1.0, 1.01, &r), 0.3642189795715233198, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_Q_e, (1.0, 10.0, &r), 0.00004539992976248485154, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_Q_e, (10.0, 10.01, &r), 0.4566792413306589430, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_Q_e, (10.0, 100.0, &r), 1.1253473960842733885e-31, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_Q_e, (1000.0, 1000.1, &r), 0.4945333598559338247, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_Q_e, (1000.0, 2000.0, &r), 6.847349459614753180e-136, TEST_TOL2, GSL_SUCCESS);
+
+
+ /* designed to trap the a-x=1 problem */
+ TEST_SF(s, gsl_sf_gamma_inc_Q_e, (100, 99.0, &r), 0.5266956696005394, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_Q_e, (200, 199.0, &r), 0.5188414119121281, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_P_e, (100, 99.0, &r), 0.4733043303994607, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_P_e, (200, 199.0, &r), 0.4811585880878718, TEST_TOL2, GSL_SUCCESS);
+
+ /* Test for x86 cancellation problems */
+ TEST_SF(s, gsl_sf_gamma_inc_P_e, (5670, 4574, &r), 3.063972328743934e-55, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_Q_e, (5670, 4574, &r), 1.0000000000000000, TEST_TOL2, GSL_SUCCESS);
+
+
+ /* test suggested by Michel Lespinasse [gsl-discuss Sat, 13 Nov 2004] */
+ TEST_SF(s, gsl_sf_gamma_inc_Q_e, (1.0e+06-1.0, 1.0e+06-2.0, &r), 0.50026596175224547004, TEST_TOL3, GSL_SUCCESS);
+
+ /* tests in asymptotic regime related to Lespinasse test */
+ TEST_SF(s, gsl_sf_gamma_inc_Q_e, (1.0e+06+2.0, 1.0e+06+1.0, &r), 0.50026596135330304336, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_Q_e, (1.0e+06, 1.0e+06-2.0, &r), 0.50066490399940144811, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_Q_e, (1.0e+07, 1.0e+07-2.0, &r), 0.50021026104978614908, TEST_TOL2, GSL_SUCCESS);
+
+ /* non-normalized "Q" function */
+ TEST_SF(s, gsl_sf_gamma_inc_e, (-1.0/1048576.0, 1.0/1048576.0, &r), 13.285819596290624271, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_e, (-0.001, 1.0/1048576.0, &r), 13.381275128625328858, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_e, (-1.0, 1.0/1048576.0, &r), 1.0485617142715768655e+06, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_e, (-0.00001,0.001, &r), 6.3317681434563592142, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_e, (-0.0001,0.001, &r), 6.3338276439767189385, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_e, (-0.001, 0.001, &r), 6.3544709102510843793, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_e, (-0.5, 0.001, &r), 59.763880515942196981, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_e, (-1.0, 0.001, &r), 992.66896046923884234, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_e, (-3.5, 0.001, &r), 9.0224404490639003706e+09, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_e, (-10.5, 0.001, &r), 3.0083661558184815656e+30, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_e, (-0.001, 0.1, &r), 1.8249109609418620068, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_e, (-0.5, 0.1, &r), 3.4017693366916154163, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_e, (-10.0, 0.1, &r), 8.9490757483586989181e+08, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_e, (-10.5, 0.1, &r), 2.6967403834226421766e+09, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_e, (-0.001, 1.0, &r), 0.21928612679072766340, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_e, (-0.5, 1.0, &r), 0.17814771178156069019, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_e, (-1.0, 1.0, &r), 0.14849550677592204792, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_e, (-2.5, 1.0, &r), 0.096556648631275160264, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_e, (-1.0, 10.0, &r), 3.8302404656316087616e-07, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_e, (-0.001, 10.0, &r), 4.1470562324807320961e-06, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_e, (-0.5, 10.0, &r), 1.2609042613241570681e-06, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_e, (-1.0, 10.0, &r), 3.8302404656316087616e-07, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_e, (-10.5, 10.0, &r), 6.8404927328441566785e-17, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_e, (-100.0, 10.0, &r), 4.1238327669858313997e-107, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_e, (-200.0, 10.0, &r), 2.1614091830529343423e-207, TEST_TOL2, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_gamma_inc_e, ( 0.0, 0.001, &r), 6.3315393641361493320, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_e, ( 0.001, 0.001, &r), 6.3087159394864007261, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_e, ( 1.0, 0.001, &r), 0.99900049983337499167, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_e, ( 10.0, 0.001, &r), 362880.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_e, ( 0.0, 1.0, &r), 0.21938393439552027368, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_e, ( 0.001, 1.0, &r), 0.21948181320730279613, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_e, ( 1.0, 1.0, &r), 0.36787944117144232160, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_e, ( 10.0, 1.0, &r), 362879.95956592242045, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_e, (100.0, 1.0, &r), 9.3326215443944152682e+155, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_e, ( 0.0, 100.0, &r), 3.6835977616820321802e-46, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_e, ( 0.001, 100.0, &r), 3.7006367674063550631e-46, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_e, ( 1.0, 100.0, &r), 3.7200759760208359630e-44, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_e, ( 10.0, 100.0, &r), 4.0836606309106112723e-26, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gamma_inc_e, (100.0, 100.0, &r), 4.5421981208626694294e+155, TEST_TOL1, GSL_SUCCESS);
+
+
+ TEST_SF(s, gsl_sf_lnbeta_e, (1.0e-8, 1.0e-8, &r), 19.113827924512310617 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lnbeta_e, (1.0e-8, 0.01, &r), 18.420681743788563403 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lnbeta_e, (1.0e-8, 1.0, &r), 18.420680743952365472 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lnbeta_e, (1.0e-8, 10.0, &r), 18.420680715662683009 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lnbeta_e, (1.0e-8, 1000.0, &r), 18.420680669107656949 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lnbeta_e, (0.1, 0.1, &r), 2.9813614810376273949 , TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lnbeta_e, (0.1, 1.0, &r), 2.3025850929940456840 , TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lnbeta_e, (0.1, 100.0, &r), 1.7926462324527931217 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lnbeta_e, (0.1, 1000, &r), 1.5619821298353164928 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lnbeta_e, (1.0, 1.00025, &r), -0.0002499687552073570, TEST_TOL4, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lnbeta_e, (1.0, 1.01, &r), -0.009950330853168082848 , TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lnbeta_e, (1.0, 1000.0, &r), -6.907755278982137052 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lnbeta_e, (100.0, 100.0, &r), -139.66525908670663927 , TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lnbeta_e, (100.0, 1000.0, &r), -336.4348576477366051 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lnbeta_e, (100.0, 1.0e+8, &r), -1482.9339185256447309 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_beta_e, (1.0, 1.0, &r), 1.0 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_beta_e, (1.0, 1.001, &r), 0.9990009990009990010 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_beta_e, (1.0, 5.0, &r), 0.2 , TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_beta_e, (1.0, 100.0, &r), 0.01 , TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_beta_e, (10.0, 100.0, &r), 2.3455339739604649879e-15 , TEST_TOL2, GSL_SUCCESS);
+
+ /* Test negative arguments */
+ TEST_SF(s, gsl_sf_beta_e, (2.5, -0.1, &r), -11.43621278354402041480, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_beta_e, (2.5, -1.1, &r), 14.555179906328753255202, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_beta_e, (-0.25, -0.1, &r), -13.238937960945229110, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_beta_e, (-1.25, -0.1, &r), -14.298052997820847439, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_beta_e, (-100.1, -99.1, &r), -1.005181917797644630375787297e60, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_beta_e, (-100.1, 99.3, &r), 0.0004474258199579694011200969001, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_beta_e, (100.1, -99.3, &r), 1.328660939628876472028853747, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_beta_e, (-100.1, 1.2, &r), 0.00365530364287960795444856281, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_beta_e, (100.1, -1.2, &r), 1203.895236907821059270698160, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_beta_e, (-100.1, -1.2, &r), -3236.073671884748847700283841, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_beta_e, (-100.001, 0.0099, &r), -853.946649365611147996495177, TEST_TOL2, GSL_SUCCESS);
+
+
+ /* Other test cases */
+ TEST_SF(s, gsl_sf_beta_e, (1e-32, 1.5, &r), 1e32, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_beta_e, (1e-6, 0.5, &r), 1000001.386293677092419390336, TEST_TOL2, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_beta_e, (-1.5, 0.5, &r), 0.0, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_beta_inc_e, (1.0, 1.0, 0.0, &r), 0.0, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_beta_inc_e, (1.0, 1.0, 1.0, &r), 1.0, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_beta_inc_e, (0.1, 0.1, 1.0, &r), 1.0, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_beta_inc_e, ( 1.0, 1.0, 0.5, &r), 0.5, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_beta_inc_e, ( 0.1, 1.0, 0.5, &r), 0.9330329915368074160, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_beta_inc_e, (10.0, 1.0, 0.5, &r), 0.0009765625000000000000, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_beta_inc_e, (50.0, 1.0, 0.5, &r), 8.881784197001252323e-16, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_beta_inc_e, ( 1.0, 0.1, 0.5, &r), 0.06696700846319258402, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_beta_inc_e, ( 1.0, 10.0, 0.5, &r), 0.99902343750000000000, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_beta_inc_e, ( 1.0, 50.0, 0.5, &r), 0.99999999999999911180, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_beta_inc_e, ( 1.0, 1.0, 0.1, &r), 0.10, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_beta_inc_e, ( 1.0, 2.0, 0.1, &r), 0.19, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_beta_inc_e, ( 1.0, 2.0, 0.9, &r), 0.99, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_beta_inc_e, (50.0, 60.0, 0.5, &r), 0.8309072939016694143, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_beta_inc_e, (90.0, 90.0, 0.5, &r), 0.5, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_beta_inc_e, ( 500.0, 500.0, 0.6, &r), 0.9999999999157549630, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_beta_inc_e, (5000.0, 5000.0, 0.4, &r), 4.518543727260666383e-91, TEST_TOL5, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_beta_inc_e, (5000.0, 5000.0, 0.6, &r), 1.0, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_beta_inc_e, (5000.0, 2000.0, 0.6, &r), 8.445388773903332659e-89, TEST_TOL5, GSL_SUCCESS);
+
+ return s;
+}
diff --git a/gsl-1.9/specfunc/test_hyperg.c b/gsl-1.9/specfunc/test_hyperg.c
new file mode 100644
index 0000000..3c526b0
--- /dev/null
+++ b/gsl-1.9/specfunc/test_hyperg.c
@@ -0,0 +1,506 @@
+/* specfunc/test_hyperg.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_sf.h>
+#include "test_sf.h"
+
+
+int test_hyperg(void)
+{
+ gsl_sf_result r;
+ int s = 0;
+
+ /* 0F1 */
+
+ TEST_SF(s, gsl_sf_hyperg_0F1_e, (1, 0.5, &r), 1.5660829297563505373, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_0F1_e, (5, 0.5, &r), 1.1042674404828684574, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_0F1_e, (100, 30, &r), 1.3492598639485110176, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_0F1_e, (-0.5, 3, &r), -39.29137997543434276, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_0F1_e, (-100.5, 50, &r), 0.6087930289227538496, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_0F1_e, (1, -5.0, &r), -0.3268752818235339109, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_0F1_e, (-0.5, -5.0, &r),-4.581634759005381184, TEST_TOL1, GSL_SUCCESS);
+
+
+ /* 1F1 for integer parameters */
+
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (1, 1, 0.5, &r), 1.6487212707001281468, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (1, 2, 500.0, &r), 2.8071844357056748215e+214, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (1, 2, -500.0, &r), 0.002, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (8, 1, 0.5, &r), 13.108875178030540372, TEST_TOL0, GSL_SUCCESS);
+
+
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (10, 1, 1.0, &r), 131.63017574352619931, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (10, 1, 10.0, &r), 8.514625476546280796e+09, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (10, 1, 100.0, &r), 1.5671363646800353320e+56, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (10, 20, 1.0, &r), 1.6585618002669675465, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (10, 20, 10.0, &r), 265.26686430340188871, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (10, 20, 100.0, &r), 3.640477355063227129e+34, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (10, 100, 1.0, &r), 1.1056660194025527099, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (10, 100, 10.0, &r), 2.8491063634727594206, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (10, 100, 40.0, &r), 133.85880835831230986, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (10, 100, 80.0, &r), 310361.16228011433406, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (10, 100, 100.0, &r), 8.032171336754168282e+07, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (10, 100, 500.0, &r), 7.633961202528731426e+123, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (100, 1, 1.0, &r), 6.892842729046469965e+07, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (100, 1, 10.0, &r), 2.4175917112200409098e+28, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (100, 1, 100.0, &r), 1.9303216896309102993e+110, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (100, 200, 1.0, &r), 1.6497469106162459226, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (100, 200, 10.0, &r), 157.93286197349321981, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (100, 200, 100.0, &r), 2.1819577501255075240e+24, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (100, 200, 400.0, &r), 3.728975529926573300e+119, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (100, 400, 10.0, &r), 12.473087623658878813, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (100, 400, 100.0, &r), 9.071230376818550241e+11, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (100, 400, 150.0, &r), 7.160949515742170775e+18, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (100, 400, 200.0, &r), 2.7406690412731576823e+26, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (100, 400, 300.0, &r), 6.175110613473276193e+43, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (100, 400, 400.0, &r), 1.1807417662711371440e+64, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (100, 400, 600.0, &r), 2.4076076354888886030e+112, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (10, 1, -1.0, &r), 0.11394854824644542810, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (10, 1, -10.0, &r), 0.0006715506365396127863, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (10, 1, -100.0, &r), -4.208138537480269868e-32, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (10, 50, -1.0, &r), 0.820006196079380, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (10, 100, -10.0, &r), 0.38378859043466243, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (10, 100, -100.0, &r), 0.0008460143401464189061, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (10, 100, -500.0, &r), 1.1090822141973655929e-08, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (10, 100, -10000.0, &r), 5.173783508088272292e-21, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (50, 1, -90.0, &r), -1.6624258547648311554e-21, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (50, 1, -100.0, &r), 4.069661775122048204e-24, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (50, 1, -110.0, &r), 1.0072444993946236025e-25, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (100, 10, -100.0, &r), -2.7819353611733941962e-37, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (100, 1, -90.0, &r), 7.501705041159802854e-22, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (100, 1, -100.0, &r), 6.305128893152291187e-25, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (100, 1, -110.0, &r), -7.007122115422439755e-26, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (100, 10, -100.0, &r), -2.7819353611733941962e-37, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (200, 50, -1.0, &r), 0.016087060191732290813, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (200, 50, -300.0, &r), -4.294975979706421471e-121, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (200, 100, -1.0, &r), 0.13397521083325179687, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (200, 100, -10.0, &r), 5.835134393749807387e-10, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (200, 100, -100.0, &r), 4.888460453078914804e-74, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (200, 100, -500.0, &r), -1.4478509059582015053e-195, TEST_TOL2, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (-1, 1, 2.0, &r), -1.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (-1, -2, 2.0, &r), 2.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (-2, -3, 2.0, &r), 3.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (-10, 1, 1.0, &r), 0.4189459325396825397, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (-10, 1, 10.0, &r), 27.984126984126984127, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (-10, 1, 100.0, &r), 9.051283795429571429e+12, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (-100, 20, 1.0, &r), 0.0020203016320697069566, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (-10, -20, 1.0, &r), 1.6379141878548080173, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (-10, -20, 10.0, &r), 78.65202404521289970, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (-10, -20, 100.0, &r), 4.416169713262624315e+08, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (-10, -100, 1.0, &r), 1.1046713999681950919, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (-10, -100, 10.0, &r), 2.6035952191039006838, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (-10, -100, 100.0, &r), 1151.6852040836932392, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (-100, -200, 1.0, &r), 1.6476859702535324743, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (-100, -200, 10.0, &r), 139.38026829540687270, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (-100, -200, 100.0, &r), 1.1669433576237933752e+19, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (-10, -20, -1.0, &r), 0.6025549561148035735, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (-10, -20, -10.0, &r), 0.00357079636732993491, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (-10, -20, -100.0, &r), 1.64284868563391159e-35, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (-10, -100, -1.0, &r), 0.90442397250313899, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (-10, -100, -10.0, &r), 0.35061515251367215, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (-10, -100, -100.0, &r), 8.19512187960476424e-09, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (-100, -200, -1.0, &r), 0.6061497939628952629, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (-100, -200, -10.0, &r), 0.0063278543908877674, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (-100, -200, -100.0, &r), 4.34111795007336552e-25, TEST_TOL2, GSL_SUCCESS);
+
+
+ /* 1F1 */
+
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (1, 1.5, 1, &r), 2.0300784692787049755, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (1, 1.5, 10, &r), 6172.859561078406855, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (1, 1.5, 100, &r), 2.3822817898485692114e+42, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (1, 1.5, 500, &r), 5.562895351723513581e+215, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (1.5, 2.5, 1, &r), 1.8834451238277954398, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (1.5, 2.5, 10, &r), 3128.7352996840916381, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (10, 1.1, 1, &r), 110.17623733873889579, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (10, 1.1, 10, &r), 6.146657975268385438e+09, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (10, 1.1, 100, &r), 9.331833897230312331e+55, TEST_TOL2, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (10, 1.1, 500, &r), 4.519403368795715843e+235, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (10, 50.1, 2, &r), 1.5001295507968071788, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (10, 50.1, 10, &r), 8.713385849265044908, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (10, 50.1, 100, &r), 5.909423932273380330e+18, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (10, 50.1, 500, &r), 9.740060618457198900e+165, TEST_TOL2, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (100, 1.1, 1, &r), 5.183531067116809033e+07, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (100, 1.1, 10, &r), 1.6032649110096979462e+28, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (100, 1.1, 100, &r), 1.1045151213192280064e+110, TEST_TOL2, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (100, 50.1, 1, &r), 7.222953133216603757, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (100, 50.1, 10, &r), 1.0998696410887171538e+08, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (100, 50.1, 100, &r), 7.235304862322283251e+63, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (1, 1.5, -1, &r), 0.5380795069127684191, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (1, 1.5, -10, &r), 0.05303758099290164485, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (1, 1.5, -100, &r), 0.005025384718759852803, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (1, 1.5, -500, &r), 0.0010010030151059555322, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (1, 1.1, -500, &r), 0.00020036137599690208265, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (10, 1.1, -1, &r), 0.07227645648935938168, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (10, 1.1, -10, &r), 0.0003192415409695588126, TEST_TOL1, GSL_SUCCESS);
+ /*
+ sensitive to the pair_ratio hack in hyperg_1F1.c
+ TEST_SF_RLX(s, gsl_sf_hyperg_1F1_e, (10, 1.1, -100, &r), -8.293425316123158950e-16, 50.0*TEST_SNGL, GSL_SUCCESS);
+ */
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (10, 1.1, -500, &r), -3.400379216707701408e-23, TEST_TOL2, GSL_SUCCESS);
+
+ TEST_SF_RLX(s, gsl_sf_hyperg_1F1_e, (50, 1.1, -90, &r), -7.843129411802921440e-22, TEST_SQRT_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (50, 1.1, -100, &r), 4.632883869540640460e-24, TEST_SQRT_TOL0, GSL_SUCCESS);
+
+ /* FIXME:
+ tolerance is poor, but is consistent within reported error
+ */
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (50, 1.1, -110.0, &r), 5.642684651305310023e-26, 0.03, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (100, 1.1, -1, &r), 0.0811637344096042096, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (100, 1.1, -10, &r), 0.00025945610092231574387, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (100, 1.1, -50, &r), 2.4284830988994084452e-13, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (100, 1.1, -90, &r), 2.4468224638378426461e-22, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (100, 1.1, -99, &r), 1.0507096272617608461e-23, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (100, 1.1, -100, &r), 1.8315497474210138602e-24, TEST_TOL2, GSL_SUCCESS);
+
+ /* FIXME:
+ Reported error is too small.
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (100, 1.1, -101, &r), -2.3916306291344452490e-24, 0.04, GSL_SUCCESS);
+ */
+
+ /* FIXME:
+ Reported error is too small.
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (100, 1.1, -110, &r), -4.517581986037732280e-26, TEST_TOL0, GSL_SUCCESS);
+ */
+
+ /* FIXME:
+ Result is terrible, but reported error is very large, so consistent.
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (100, 10.1, -220, &r), -4.296130300021696573e-64, TEST_TOL1, GSL_SUCCESS);
+ */
+
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (-10, -10.1, 10.0, &r), 10959.603204633058116, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (-10, -10.1, 1000.0, &r), 2.0942691895502242831e+23, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (-10, -100.1, 10.0, &r), 2.6012036337980078062, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (-1000, -1000.1, 10.0, &r), 22004.341698908631636, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (-1000, -1000.1, 200.0, &r), 7.066514294896245043e+86, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (-8.1, -10.1, -10.0, &r), 0.00018469685276347199258, TEST_TOL0, GSL_SUCCESS);
+ /* TEST_SF(s, gsl_sf_hyperg_1F1_e, (-8.1, -1000.1, -10.0, &r), 0.9218280185080036020, TEST_TOL0, GSL_SUCCESS); */
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (-10, -5.1, 1, &r), 16.936141866089601635, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (-10, -5.1, 10, &r), 771534.0349543820541, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (-10, -5.1, 100, &r), 2.2733956505084964469e+17, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (-100, -50.1, -1, &r), 0.13854540373629275583, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (-100, -50.1, -10, &r), -9.142260314353376284e+19, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (-100, -50.1, -100, &r), -1.7437371339223929259e+87, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (-100, -50.1, 1, &r), 7.516831748170351173, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (-100, -50.1, 10, &r), 1.0551632286359671976e+11, TEST_SQRT_TOL0, GSL_SUCCESS);
+ /*
+ These come out way off. On the other hand, the error estimates
+ are also very large; so much so that the answers are consistent
+ within the reported error. Something will need to be done about
+ this eventually
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (-100, -50.1, 50, &r), -7.564755600940346649e+36, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (-100, -50.1, 100, &r), 4.218776962675977e+55, TEST_TOL3, GSL_SUCCESS);
+ */
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (-10.5, -8.1, 0.1, &r), 1.1387201443786421724, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (-10.5, -11.1, 1, &r), 2.5682766147138452362, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (-100.5, -80.1, 10, &r), 355145.4517305220603, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (-100.5, -102.1, 10, &r), 18678.558725244365016, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (-100.5, -500.1, 10, &r), 7.342209011101454, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (-100.5, -500.1, 100, &r), 1.2077443075367177662e+8, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (-500.5, -80.1, 2, &r), 774057.8541325341699, TEST_TOL4, GSL_SUCCESS);
+ /*
+ UNIMPL
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (100, -10.1, 1, &r), -2.1213846338338567395e+12, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (100, -10.1, 10, &r), -6.624849346145112398e+39, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (100, -10.1, 100, &r), -1.2413466759089171904e+129, TEST_TOL0, GSL_SUCCESS);
+ */
+ /*
+ UNIMPL
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (100, -10.1, -1, &r), 34456.29405305551691, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (100, -10.1, -10, &r), -7.809224251467710833e+07, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (100, -10.1, -100, &r), -5.214065452753988395e-07, TEST_TOL0, GSL_SUCCESS);
+ */
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (-100, 1.1, 1, &r), 0.21519810496314438414, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (-100, 1.1, 10, &r), 8.196123715597869948, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (-100, 1.1, 100, &r), -1.4612966715976530293e+20, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (-100, 20.1, 1, &r), 0.0021267655527278456412, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (-100, 20.1, 10, &r), 2.0908665169032186979e-11, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (-100, 20.1, 100, &r), -0.04159447537001340412, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (-100, 1.1, -1, &r), 2.1214770215694685282e+07, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (-100, 1.1, -10, &r), 1.0258848879387572642e+24, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (-100, 1.1, -100, &r), 1.1811367147091759910e+67, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (-100, 50.1, -1, &r), 6.965259317271427390, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (-100, 50.1, -10, &r), 1.0690052487716998389e+07, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (-100, 50.1, -100, &r), 6.889644435777096248e+36, TEST_TOL3, GSL_SUCCESS);
+
+
+ /* Bug report from Fernando Pilotto */
+
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (-2.05, 1.0, 5.05, &r), 3.79393389516785e+00, TEST_TOL3, GSL_SUCCESS);
+
+
+ /* Bug reports from Ivan Liu */
+
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (-26, 2.0, 100.0, &r), 1.444786781107436954e+19, TEST_TOL3, GSL_SUCCESS);
+
+#if 0
+ /* This one is computed with a huge error, there is loss of
+ precision but the error estimate flags the problem (assuming the
+ user looks at it). We should probably trap any return with
+ err>|val| and signal loss of precision */
+
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (-26.1, 2.0, 100.0, &r), 1.341557199575986995e+19, TEST_TOL3, GSL_SUCCESS);
+#endif
+
+ /* Bug report H.Moseby */
+
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (1.2, 1.1e-15, 1.5, &r), 8254503159672429.02, TEST_TOL3, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (1.0, 1000000.5, 0.8e6 + 0.5, &r), 4.999922505099443804e+00, TEST_TOL3, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (1.0, 1000000.5, 1001000.5, &r), 3480.3699557431856166, TEST_TOL4, GSL_SUCCESS);
+
+#if 0 /* FIX THESE NEXT RELEASE */
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (1.1, 1000000.5, 1001000.5, &r), 7304.6126942641350122, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (0.9, 1000000.5, 1001000.5, &r), 1645.4879293475410982, TEST_TOL3, GSL_SUCCESS);
+#endif
+
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (-1.1, 1000000.5, 1001000.5, &r), -5.30066488697455e-04, TEST_TOL3, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (1.5, 1000000.5, 0.8e6 + 0.5, &r), 11.18001288977894650469927615, TEST_TOL3, GSL_SUCCESS);
+
+ /* U for integer parameters */
+
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (1, 1, 0.0001, &r), 8.634088070212725330, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (1, 1, 0.01, &r), 4.078511443456425847, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (1, 1, 0.5, &r), 0.9229106324837304688, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (1, 1, 2.0, &r), 0.3613286168882225847, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (1, 1, 100, &r), 0.009901942286733018406, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (1, 1, 1000, &r), 0.0009990019940238807150, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (1, 8, 0.01, &r), 7.272361203006010000e+16, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (1, 8, 1, &r), 1957.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (1, 8, 5, &r), 1.042496, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (1, 8, 8, &r), 0.3207168579101562500, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (1, 8, 50, &r), 0.022660399001600000000, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (1, 8, 100, &r), 0.010631236727200000000, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (1, 8, 1000, &r), 0.0010060301203607207200, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (1, 20, 1, &r), 1.7403456103284421000e+16, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (1, 20, 20, &r), 0.22597813610531052969, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (1, 50, 1, &r), 3.374452117521520758e+61, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (1, 50, 50, &r), 0.15394136814987651785, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (1, 100, 0.1, &r), 1.0418325171990852858e+253, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (1, 100, 1, &r), 2.5624945006073464385e+154, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (1, 100, 50, &r), 3.0978624160896431391e+07, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (1, 100, 100, &r), 0.11323192555773717475, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (1, 100, 200, &r), 0.009715680951406713589, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (1, 100, 1000, &r), 0.0011085142546061528661, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (1, 1000, 2000, &r), 0.0009970168547036318206, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (1, -1, 1, &r), 0.29817368116159703717, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (1, -1, 10, &r), 0.07816669698940409380, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (1, -10, 1, &r), 0.08271753756946041959, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (1, -10, 5, &r), 0.06127757419425055261, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (1, -10, 10, &r), 0.04656199948873187212, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (1, -10, 20, &r), 0.031606421847946077709, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (1, -100, 0.01, &r), 0.009900000099999796950, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (1, -100, 1, &r), 0.009802970197050404429, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (1, -100, 10, &r), 0.009001648897173103447, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (1, -100, 20, &r), 0.008253126487166557546, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (1, -100, 50, &r), 0.006607993916432051008, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (1, -100, 90, &r), 0.005222713769726871937, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (1, -100, 110, &r), 0.004727658137692606210, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF_RLX(s, gsl_sf_hyperg_U_int_e, (1, -1000, 1, &r), 0.0009980029970019970050, TEST_SQRT_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (1, -1000, 1010, &r), 0.0004971408839859245170, TEST_TOL4, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (8, 1, 0.001, &r), 0.0007505359326875706975, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (8, 1, 0.5, &r), 6.449509938973479986e-06, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (8, 1, 8, &r), 6.190694573035761284e-10, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (8, 1, 20, &r), 3.647213845460374016e-12, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (8, 8, 1, &r), 0.12289755012652317578, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (8, 8, 10, &r), 5.687710359507564272e-09, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (8, 8, 20, &r), 2.8175404594901039724e-11, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (100, 100, 0.01, &r), 1.0099979491941914867e+196, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (100, 100, 0.1, &r), 1.0090713562719862833e+97, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (100, 100, 1, &r), 0.009998990209084729106, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (100, 100, 20, &r), 1.3239363905866130603e-131, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (-10, 1, 0.01, &r), 3.274012540759009536e+06, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (-10, 1, 1, &r), 1.5202710000000000000e+06, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (-10, 1, 10, &r), 1.0154880000000000000e+08, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (-10, 1, 100, &r), 3.284529863685482880e+19, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (-10, 10, 1, &r), 1.1043089864100000000e+11, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (-10, 100, 1, &r), 1.3991152402448957897e+20, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (-10, 100, 10, &r), 5.364469916567136000e+19, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (-10, 100, 100, &r), 3.909797568000000000e+12, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (-10, 100, 500, &r), 8.082625576697984130e+25, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (-50, 1, 0.01, &r), 1.6973422555823855798e+64, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (-50, 1, 1, &r), 7.086160198304780325e+63, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (-50, 1, 10, &r), 5.332862895528712200e+65, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (-50, 10, 1, &r), -7.106713471565790573e+71, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (-50, 100, 1, &r), 2.4661377199407186476e+104, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (-50, 10, 10, &r), 5.687538583671241287e+68, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (-50, 100, 10, &r), 1.7880761664553373445e+102, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (-90, 1, 0.01, &r), 4.185245354032917715e+137, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (-90, 1, 0.1, &r), 2.4234043408007841358e+137, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (-90, 1, 10, &r), -1.8987677149221888807e+139, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (-90, 10, 10, &r), -5.682999988842066677e+143, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (-90, 100, 10, &r), 2.3410029853990624280e+189, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (-90, 1000, 10, &r), 1.9799451517572225316e+271, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (-50, -1, 10, &r), -9.083195466262584149e+64, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (-50, -10, 10, &r), -1.4418257327071634407e+62, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (-50, -100, 0.01, &r), 3.0838993811468983931e+93, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (-50, -100, 10, &r), 4.014552630378340665e+95, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (-100, -100, 10, &r), 2.0556466922347982030e+162, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (-100, -200, 10, &r), 1.1778399522973555582e+219, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (-100, -200, 100, &r), 9.861313408898201873e+235, TEST_TOL3, GSL_SUCCESS);
+
+
+ /* U */
+
+ TEST_SF(s, gsl_sf_hyperg_U_e, (0.0001, 0.0001, 0.0001, &r), 1.0000576350699863577, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (0.0001, 0.0001, 1.0, &r), 0.9999403679233247536, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (0.0001, 0.0001, 100.0, &r), 0.9995385992657260887, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (0.0001, 1, 0.0001, &r), 1.0009210608660065989, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (0.0001, 1.0, 1.0, &r), 0.9999999925484179084, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (0.0001, 10, 1, &r), 13.567851006281412726, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF_RLX(s, gsl_sf_hyperg_U_e, (0.0001, 10, 5, &r), 1.0006265020064596364, TEST_SQRT_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (0.0001, 10, 10, &r), 0.9999244381454633265, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF_RLX(s, gsl_sf_hyperg_U_e, (0.0001, 100, 1, &r), 2.5890615708804247881e+150, TEST_SQRT_TOL0, GSL_SUCCESS);
+ TEST_SF_RLX(s, gsl_sf_hyperg_U_e, (0.0001, 100, 10, &r), 2.3127845417739661466e+55, TEST_SQRT_TOL0, GSL_SUCCESS);
+ TEST_SF_RLX(s, gsl_sf_hyperg_U_e, (0.0001, 100, 50, &r), 6402.818715083582554, TEST_SQRT_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (0.0001, 100, 98, &r), 0.9998517867411840044, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF_RLX(s, gsl_sf_hyperg_U_e, (0.0001, 1000, 300, &r), 2.5389557274938010716e+213, TEST_SQRT_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (0.0001, 1000, 999, &r), 0.9997195294193261604, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (0.0001, 1000, 1100, &r), 0.9995342990014584713, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF_RLX(s, gsl_sf_hyperg_U_e, (0.5, 1000, 300, &r), 1.1977955438214207486e+217, TEST_SQRT_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (0.5, 1000, 800, &r), 9.103916020464797207e+08, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (0.5, 1000, 998, &r), 0.21970269691801966806, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (0.5, 0.5, 1.0, &r), 0.7578721561413121060, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (1, 0.0001, 0.0001, &r), 0.9992361337764090785, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (1, 0.0001, 1, &r), 0.4036664068111504538, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (1, 0.0001, 100, &r), 0.009805780851264329587, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (1, 1.2, 2.0, &r), 0.3835044780075602550, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (1, -0.0001, 1, &r), 0.4036388693605999482, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (8, 10.5, 1, &r), 27.981926466707438538, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (8, 10.5, 10, &r), 2.4370135607662056809e-8, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (8, 10.5, 100, &r), 1.1226567526311488330e-16, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (10, -2.5, 10, &r), 6.734690720346560349e-14, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (10, 2.5, 10, &r), 6.787780794037971638e-13, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (10, 2.5, 50, &r), 2.4098720076596087125e-18, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-10.5, 1.1, 1, &r), -3.990841457734147e+6, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-10.5, 1.1, 10, &r), 1.307472052129343e+8, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-10.5, 1.1, 50, &r), 3.661978424114088e+16, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-10.5, 1.1, 90, &r), 8.09469542130868e+19, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-10.5, 1.1, 99, &r), 2.546328328942063e+20, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-10.5, 1.1, 100, &r), 2.870463201832814e+20, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-10.5, 1.1, 200, &r), 8.05143453769373e+23, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-10.5, 10.1, 0.1, &r), -3.043016255306515e+20, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-10.5, 10.1, 1, &r), -3.194745265896115e+12, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-10.5, 10.1, 4, &r), -6.764203430361954e+07, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-10.5, 10.1, 10, &r), -2.067399425480545e+09, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-10.5, 10.1, 50, &r), 4.661837330822824e+14, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-10.5, 100.4, 10, &r), -6.805460513724838e+66, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-10.5, 100.4, 50, &r), -2.081052558162805e+18, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-10.5, 100.4, 80, &r), 2.034113191014443e+14, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-10.5, 100.4, 100, &r), 6.85047268436107e+13, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-10.5, 100.4, 200, &r), 1.430815706105649e+20, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-19.5, 82.1, 10, &r), 5.464313196201917432e+60, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-50.5, 100.1, 10, &r), -5.5740216266953e+126, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-50.5, 100.1, 40, &r), 5.937463786613894e+91, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-50.5, 100.1, 50, &r), -1.631898534447233e+89, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-50.5, 100.1, 70, &r), 3.249026971618851e+84, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-50.5, 100.1, 100, &r), 1.003401902126641e+85, TEST_TOL1, GSL_SUCCESS);
+
+
+ /* 2F1 */
+
+ TEST_SF(s, gsl_sf_hyperg_2F1_e, (1, 1, 1, 0.5, &r), 2.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_e, (8, 8, 1, 0.5, &r), 12451584.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_e, (8, -8, 1, 0.5, &r), 0.13671875, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_e, (8, -8.1, 1, 0.5, &r), 0.14147385378899930422, TEST_TOL4, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_e, (8, -8, 1, -0.5, &r), 4945.136718750000000, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_e, (8, -8, -5.5, 0.5, &r), -906.6363636363636364, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_e, (8, -8, -5.5, -0.5, &r), 24565.363636363636364, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_e, (8, 8, 1, -0.5, &r), -0.006476312098196747669, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_e, (8, 8, 5, 0.5, &r), 4205.714285714285714, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_e, (8, 8, 5, -0.5, &r), 0.0028489656290296436616, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_e, (9, 9, 1, 0.99, &r), 1.2363536673577259280e+38 , TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_e, (9, 9, -1.5, 0.99, &r), 3.796186436458346579e+46, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_e, (9, 9, -1.5, -0.99, &r), 0.14733409946001025146, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_e, (9, 9, -8.5, 0.99, &r), -1.1301780432998743440e+65, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_e, (9, 9, -8.5, -0.99, &r), -8.856462606575344483, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_e, (9, 9, -21.5, 0.99, &r), 2.0712920991876073253e+95, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_e, (9, 9, -21.5, -0.99, &r), -74.30517015382249216, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_e, (9, 9, -100.5, 0.99, &r), -3.186778061428268980e+262, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_e, (9, 9, -100.5, -0.99, &r), 2.4454358338375677520, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_e, (25, 25, 1, -0.5, &r), -2.9995530823639545027e-06, TEST_SQRT_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_hyperg_2F1_e, (1.5, 0.5, 2.0, 1.0-1.0/64.0, &r), 3.17175539044729373926, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_e, (1.5, 0.5, 2.0, 1.0-1.0/128.0, &r), 3.59937243502024563424, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_e, (1.5, 0.5, 2.0, 1.0-1.0/256.0, &r), 4.03259299524392504369, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_e, (1.5, 0.5, 2.0, 1.0-1.0/1024.0, &r), 4.90784159359675398250, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_e, (1.5, 0.5, 2.0, 1.0-1.0/65536.0, &r), 7.552266033399683914, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_e, (1.5, 0.5, 2.0, 1.0-1.0/16777216.0, &r), 11.08235454026043830363, TEST_TOL1, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_hyperg_2F1_e, (1.5, 0.5, 2.0, -1.0+1.0/1024.0, &r), 0.762910940909954974527, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_e, (1.5, 0.5, 2.0, -1.0+1.0/65536.0, &r), 0.762762124908845424449, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_e, (1.5, 0.5, 2.0, -1.0+1.0/1048576.0, &r), 0.762759911089064738044, TEST_TOL0, GSL_SUCCESS);
+
+
+ /* 2F1 conj */
+
+ TEST_SF(s, gsl_sf_hyperg_2F1_conj_e, (1, 1, 1, 0.5, &r), 3.352857095662929028, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_conj_e, (8, 8, 1, 0.5, &r), 1.7078067538891293983e+09, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_conj_e, (8, 8, 5, 0.5, &r), 285767.15696901140627, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_conj_e, (8, 8, 1, -0.5, &r), 0.007248196261471276276, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_conj_e, (8, 8, 5, -0.5, &r), 0.00023301916814505902809, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_conj_e, (25, 25, 1, -0.5, &r), 5.1696944096e-06, TEST_SQRT_TOL0, GSL_SUCCESS);
+
+ /* FIXME: the "true" values here may not be so good */
+ /*
+ TEST_SF(s, gsl_sf_hyperg_2F0_e, (0.01, 1.0, -0.02, &r), 0.999803886708565 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F0_e, (0.1, 0.5, -0.02, &r), 0.999015947934831 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F0_e, (1, 1, -0.02, &r), 0.980755496569062 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F0_e, (8, 8, -0.02, &r), 0.3299059284994299 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F0_e, (50, 50, -0.02, &r), 2.688995263773233e-13, TEST_TOL0, GSL_SUCCESS);
+ */
+
+
+ /* 2F1 renorm */
+
+ TEST_SF(s, gsl_sf_hyperg_2F1_renorm_e, (1, 1, 1, 0.5, &r), 2.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_renorm_e, (8, 8, 1, 0.5, &r), 12451584.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_renorm_e, (8, -8, 1, 0.5, &r), 0.13671875, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_renorm_e, (8, -8, 1, -0.5, &r), 4945.13671875, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_renorm_e, (8, -8, -5.5, 0.5, &r), -83081.19167659493609, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_renorm_e, (8, -8, -5.5, -0.5, &r), 2.2510895952730178518e+06, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_renorm_e, (8, 8, 5, 0.5, &r), 175.2380952380952381, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_renorm_e, (9, 9, -1.5, 0.99, &r), 1.6063266334913066551e+46, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_renorm_e, (9, 9, -1.5, -0.99, &r), 0.06234327316254516616, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_renorm_e, (5, 5, -1, 0.5, &r), 4949760.0, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_renorm_e, (5, 5, -10, 0.5, &r), 139408493229637632000.0, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_renorm_e, (5, 5, -100, 0.5, &r), 3.0200107544594411315e+206, TEST_TOL3, GSL_SUCCESS);
+
+ /* 2F1 conj renorm */
+
+ TEST_SF(s, gsl_sf_hyperg_2F1_conj_renorm_e, (9, 9, -1.5, 0.99, &r), 5.912269095984229412e+49, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_conj_renorm_e, (9, 9, -1.5, -0.99, &r), 0.10834020229476124874, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_conj_renorm_e, (5, 5, -1, 0.5, &r), 1.4885106335357933625e+08, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_conj_renorm_e, (5, 5, -10, 0.5, &r), 7.968479361426355095e+21, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_2F1_conj_renorm_e, (5, 5, -100, 0.5, &r), 3.1113180227052313057e+208, TEST_TOL3, GSL_SUCCESS);
+
+
+ return s;
+}
diff --git a/gsl-1.9/specfunc/test_legendre.c b/gsl-1.9/specfunc/test_legendre.c
new file mode 100644
index 0000000..80dd099
--- /dev/null
+++ b/gsl-1.9/specfunc/test_legendre.c
@@ -0,0 +1,549 @@
+/* specfunc/test_legendre.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2004 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_sf.h>
+#include "test_sf.h"
+
+
+int test_legendre(void)
+{
+ gsl_sf_result r;
+ double L[256], DL[256];
+ int s = 0;
+ int sa;
+
+ TEST_SF(s, gsl_sf_legendre_P1_e, (-0.5, &r), -0.5, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_P1_e, ( 0.5, &r), 0.5, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_legendre_P2_e, (0.0, &r), -0.5 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_P2_e, (0.5, &r), -0.125, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_P2_e, (1.0, &r), 1.0 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_P2_e, (100.0, &r), 14999.5 , TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_legendre_P3_e, ( -0.5, &r), 0.4375, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_P3_e, ( 0.5, &r), -0.4375, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_P3_e, ( 1.0, &r), 1.0 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_P3_e, (100.0, &r), 2.49985e+06, TEST_TOL0, GSL_SUCCESS);
+
+
+ TEST_SF(s, gsl_sf_legendre_Pl_e, (1, -0.5, &r), -0.5, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Pl_e, (1, 1.0e-8, &r), 1.0e-08, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Pl_e, (1, 0.5, &r), 0.5, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Pl_e, (1, 1.0, &r), 1.0, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_legendre_Pl_e, (10, -0.5, &r), -0.1882286071777345, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Pl_e, (10, 1.0e-8, &r), -0.24609374999999864648, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Pl_e, (10, 0.5, &r), -0.18822860717773437500, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Pl_e, (10, 1.0, &r), 1.0, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_legendre_Pl_e, (99, -0.5, &r), 0.08300778172138770477, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Pl_e, (99, 1.0e-8, &r), -7.958923738716563193e-08, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Pl_e, (99, 0.5, &r), -0.08300778172138770477, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Pl_e, (99, 0.999, &r), -0.3317727359254778874, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Pl_e, (99, 1.0, &r), 1.0, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_legendre_Pl_e, (1000, -0.5, &r), -0.019168251091650277878, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Pl_e, (1000, 1.0e-8, &r), 0.0252250181770982897470252620, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Pl_e, (1000, 0.5, &r), -0.019168251091650277878, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Pl_e, (1000, 1.0, &r), 1.0, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_legendre_Pl_e, (4000, -0.5, &r), -0.009585404456573080972, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Pl_e, (4000, 0.5, &r), -0.009585404456573080972, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Pl_e, (4000, 1.0, &r), 1.0, TEST_TOL0, GSL_SUCCESS);
+
+ sa = 0;
+ gsl_sf_legendre_Pl_array(100, 0.5, L);
+ TEST_SF_VAL(sa, L[0], +0.0, 1.0, TEST_TOL1);
+ TEST_SF_VAL(sa, L[10], +0.0, -0.18822860717773437500, TEST_TOL1);
+ TEST_SF_VAL(sa, L[100], +0.0, -0.06051802596186118687, TEST_TOL1);
+ gsl_test(sa, "gsl_sf_legendre_Pl_array(100, 0.5)");
+ s += sa;
+
+ sa = 0;
+ gsl_sf_legendre_Pl_deriv_array(100, 0.5, L, DL);
+ TEST_SF_VAL(sa, DL[0], +0.0, 0.0, TEST_TOL1);
+ TEST_SF_VAL(sa, DL[1], +0.0, 1.0, TEST_TOL1);
+ TEST_SF_VAL(sa, DL[10], +0.0, -2.3171234130859375000, TEST_TOL1);
+ TEST_SF_VAL(sa, DL[100], +0.0, -7.0331691653942815112, TEST_TOL1);
+ gsl_test(sa, "gsl_sf_legendre_Pl_deriv_array(100, 0.5)");
+ s += sa;
+ sa = 0;
+
+ gsl_sf_legendre_Pl_deriv_array(10, 1.0, L, DL);
+ TEST_SF_VAL(sa, DL[0], +0.0, 0.0, TEST_TOL1);
+ TEST_SF_VAL(sa, DL[1], +0.0, 1.0, TEST_TOL1);
+ TEST_SF_VAL(sa, DL[10], +0.0, 55.0, TEST_TOL1);
+ gsl_test(sa, "gsl_sf_legendre_Pl_deriv_array(10, 1.0)");
+ s += sa;
+
+ gsl_sf_legendre_Pl_deriv_array(10, 1.0 - 1.0e-11, L, DL);
+ TEST_SF_VAL(sa, DL[0], +0.0, 0.0, TEST_TOL1);
+ TEST_SF_VAL(sa, DL[1], +0.0, 1.0, TEST_TOL1);
+ TEST_SF_VAL(sa, DL[10], +0.0, 54.999999985150000001, TEST_TOL1);
+ gsl_test(sa, "gsl_sf_legendre_Pl_deriv_array(10, 1.0 - 1.0e-11)");
+ s += sa;
+
+ gsl_sf_legendre_Pl_deriv_array(10, -1.0, L, DL);
+ TEST_SF_VAL(sa, DL[0], +0.0, 0.0, TEST_TOL1);
+ TEST_SF_VAL(sa, DL[1], +0.0, 1.0, TEST_TOL1);
+ TEST_SF_VAL(sa, DL[10], +0.0, -55.0, TEST_TOL1);
+ gsl_test(sa, "gsl_sf_legendre_Pl_deriv_array(10, -1.0)");
+ s += sa;
+
+ gsl_sf_legendre_Pl_deriv_array(10, -1.0 + 1.0e-11, L, DL);
+ TEST_SF_VAL(sa, DL[0], +0.0, 0.0, TEST_TOL1);
+ TEST_SF_VAL(sa, DL[1], +0.0, 1.0, TEST_TOL1);
+ TEST_SF_VAL(sa, DL[10], +0.0, -54.999999985150000001, TEST_TOL1);
+ gsl_test(sa, "gsl_sf_legendre_Pl_deriv_array(10, -1.0 + 1.0e-11)");
+ s += sa;
+
+
+ TEST_SF(s, gsl_sf_legendre_Plm_e, (10, 0, -0.5, &r), -0.18822860717773437500, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Plm_e, (10, 0, 1.0e-08, &r), -0.24609374999999864648, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Plm_e, (10, 0, 0.5, &r), -0.18822860717773437500, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_legendre_Plm_e, (10, 1, -0.5, &r), -2.0066877394361256516, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Plm_e, (10, 1, 1.0e-08, &r), -2.7070312499999951725e-07, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Plm_e, (10, 1, 0.5, &r), 2.0066877394361256516, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_legendre_Plm_e, (10, 5, -0.5, &r), -30086.169706116174977, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Plm_e, (10, 5, 1.0e-08, &r), -0.0025337812499999964949, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Plm_e, (10, 5, 0.5, &r), 30086.169706116174977, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Plm_e, (10, 5, 0.999, &r), -0.5036411489013270406, TEST_TOL1, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_legendre_Plm_e, (100, 5, -0.5, &r), -6.617107444248382171e+08, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Plm_e, (100, 5, 1.0e-08, &r), 817.8987598063712851, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Plm_e, (100, 5, 0.5, &r), 6.617107444248382171e+08, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Plm_e, (100, 5, 0.999, &r), -1.9831610803806212189e+09, TEST_TOL2, GSL_SUCCESS);
+
+
+ sa = 0;
+ gsl_sf_legendre_Plm_deriv_array(100, 2, -1.0 + 1.0/1125899906842624.0, L, DL);
+ TEST_SF_VAL(sa, L[0], +0.0, 5.3290705182007490275e-15, TEST_TOL1);
+ TEST_SF_VAL(sa, L[1], +0.0, -2.6645352591003721471e-14, TEST_TOL1);
+ TEST_SF_VAL(sa, L[98], +0.0, 2.2646284847349109694e-08, TEST_TOL2);
+ gsl_test(sa, "gsl_sf_legendre_Plm_deriv_array(100, 2, -1.0 + 2^(-50)");
+ s += sa;
+
+ sa = 0;
+ gsl_sf_legendre_Plm_deriv_array(100, 2, 1.0 - 1.0/1125899906842624.0, L, DL);
+ TEST_SF_VAL(sa, L[0], +0.0, 5.3290705182007490275e-15, TEST_TOL1);
+ TEST_SF_VAL(sa, L[1], +0.0, 2.6645352591003721471e-14, TEST_TOL1);
+ TEST_SF_VAL(sa, L[10], +0.0, 5.3343995887188313290e-12, TEST_TOL1);
+ TEST_SF_VAL(sa, L[98], +0.0, 2.2646284847349109694e-08, TEST_TOL2);
+ gsl_test(sa, "gsl_sf_legendre_Plm_deriv_array(100, 2, 1.0 - 2^(-50)");
+ s += sa;
+
+ sa = 0;
+ gsl_sf_legendre_Plm_array(100, 5, 0.5, L);
+ TEST_SF_VAL(sa, L[0], +0.0, -460.3466286991656682, TEST_TOL1);
+ TEST_SF_VAL(sa, L[10], +0.0, 38852.51334152290535, TEST_TOL1 );
+ TEST_SF_VAL(sa, L[95], +0.0, 6.617107444248382171e+08, TEST_TOL1);
+ gsl_test(sa, "gsl_sf_legendre_Plm_array(100, 5, 0.5)");
+ s += sa;
+
+ sa = 0;
+ gsl_sf_legendre_Plm_array(100, 5, 0.999, L);
+ TEST_SF_VAL(sa, L[0], +0.0, -0.00016883550990916552255, TEST_TOL2);
+ TEST_SF_VAL(sa, L[10], +0.0, -30.651334850159821525, TEST_TOL2 );
+ TEST_SF_VAL(sa, L[95], +0.0, -1.9831610803806212189e+09, TEST_TOL2);
+ gsl_test(sa, "gsl_sf_legendre_Plm_array(100, 5, 0.999)");
+ s += sa;
+
+ sa = 0;
+ gsl_sf_legendre_Plm_array(100, 5, -0.999, L);
+ TEST_SF_VAL(sa, L[0], +0.0, -0.00016883550990916552255, TEST_TOL2);
+ TEST_SF_VAL(sa, L[10], +0.0, -30.651334850159821525, TEST_TOL2 );
+ TEST_SF_VAL(sa, L[95], +0.0, 1.9831610803806212189e+09, TEST_TOL2);
+ gsl_test(sa, "gsl_sf_legendre_Plm_array(100, 5, -0.999)");
+ s += sa;
+
+ sa = 0;
+ gsl_sf_legendre_Plm_deriv_array(100, 2, 0.999, L, DL);
+ TEST_SF_VAL(sa, L[0], +0.0, 0.00599700000000000000, TEST_TOL1);
+ TEST_SF_VAL(sa, L[1], +0.0, 0.02995501500000000000, TEST_TOL1 );
+ TEST_SF_VAL(sa, DL[0], +0.0, -5.9940000000000000000, TEST_TOL1);
+ TEST_SF_VAL(sa, DL[1], +0.0, -29.910045000000000000, TEST_TOL1 );
+ TEST_SF_VAL(sa, DL[2], +0.0, -89.490629790000000000, TEST_TOL1 );
+ TEST_SF_VAL(sa, DL[10], +0.0, -5703.9461633355291972, TEST_TOL1 );
+ TEST_SF_VAL(sa, DL[95], +0.0, 6.4518473603456858414E+06, TEST_TOL3);
+ gsl_test(sa, "gsl_sf_legendre_Plm_deriv_array(100, 2, 0.999)");
+ s += sa;
+
+ sa = 0;
+ gsl_sf_legendre_Plm_deriv_array(100, 2, 1.0 - 1.0e-15, L, DL);
+ TEST_SF_VAL(sa, DL[0], +0.0, -5.9999999999999940000, TEST_TOL1);
+ TEST_SF_VAL(sa, DL[1], +0.0, -29.999999999999910000, TEST_TOL1 );
+ TEST_SF_VAL(sa, DL[2], +0.0, -89.999999999999490000, TEST_TOL1 );
+ TEST_SF_VAL(sa, DL[10], +0.0, -6005.9999999996936940, TEST_TOL1 );
+ TEST_SF_VAL(sa, DL[95], +0.0, -2.2586255999928454270e+07, TEST_TOL3);
+ gsl_test(sa, "gsl_sf_legendre_Plm_deriv_array(100, 2, 1.0 - 1.0e-15)");
+ s += sa;
+
+ sa = 0;
+ gsl_sf_legendre_Plm_deriv_array(100, 2, -1.0 + 1.0e-15, L, DL);
+ TEST_SF_VAL(sa, DL[0], +0.0, 5.9999999999999940000, TEST_TOL1);
+ TEST_SF_VAL(sa, DL[1], +0.0, -29.999999999999910000, TEST_TOL1 );
+ TEST_SF_VAL(sa, DL[95], +0.0, -2.2586255999928454270e+07, TEST_TOL3);
+ gsl_test(sa, "gsl_sf_legendre_Plm_deriv_array(100, 2, -1.0 + 1.0e-15)");
+ s += sa;
+
+ sa = 0;
+ gsl_sf_legendre_Plm_deriv_array(100, 5, 0.999, L, DL);
+ TEST_SF_VAL(sa, DL[0], +0.0, 0.42187762481054616565, TEST_TOL1);
+ TEST_SF_VAL(sa, DL[1], +0.0, 4.6341560284340909936, TEST_TOL1 );
+ TEST_SF_VAL(sa, DL[2], +0.0, 27.759505566959219127, TEST_TOL1 );
+ TEST_SF_VAL(sa, DL[10], +0.0, 76051.795860179545484, TEST_TOL1 );
+ TEST_SF_VAL(sa, DL[95], +0.0, 3.0344503083851936814e+12, TEST_TOL3);
+ gsl_test(sa, "gsl_sf_legendre_Plm_deriv_array(100, 5, 0.999)");
+ s += sa;
+
+ TEST_SF(s, gsl_sf_legendre_sphPlm_e, (10, 0, -0.5, &r), -0.24332702369300133776, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_sphPlm_e, (10, 0, 0.5, &r), -0.24332702369300133776, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_sphPlm_e, (10, 0, 0.999, &r), 1.2225754122797385990, TEST_TOL1, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_legendre_sphPlm_e, (10, 5, -0.5, &r), -0.3725739049803293972, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_sphPlm_e, (10, 5, 1.0e-08, &r), -3.1377233589376792243e-08, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_sphPlm_e, (10, 5, 0.5, &r), 0.3725739049803293972, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_sphPlm_e, (10, 5, 0.999, &r), -6.236870674727370094e-06, TEST_TOL2, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_legendre_sphPlm_e, (10, 10, -0.5, &r), 0.12876871185785724117, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_sphPlm_e, (10, 10, 0.5, &r), 0.12876871185785724117, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_sphPlm_e, (10, 10, 0.999, &r), 1.7320802307583118647e-14, TEST_TOL2, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_legendre_sphPlm_e, (200, 1, -0.5, &r), 0.3302975570099492931, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_sphPlm_e, (200, 1, 0.5, &r), -0.3302975570099492931, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_sphPlm_e, (200, 1, 0.999, &r), -1.4069792055546256912, TEST_TOL2, GSL_SUCCESS);
+
+
+
+ /* Test case from alberto@physik.fu-berlin.de */
+
+ TEST_SF(s, gsl_sf_legendre_sphPlm_e, (3, 1, 0.0, &r), 0.323180184114150653007, TEST_TOL2, GSL_SUCCESS);
+
+ /* Other test cases */
+
+ TEST_SF(s, gsl_sf_legendre_sphPlm_e, (200, 1, -0.5, &r), 0.3302975570099492931418227583, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_sphPlm_e, (140,135,1,&r), 0.0, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_sphPlm_e, (140,135,0.99998689456491752,&r), -6.54265253269093276310395668335e-305, TEST_TOL6, GSL_SUCCESS);
+
+ sa = 0;
+ gsl_sf_legendre_sphPlm_array(100, 5, 0.5, L);
+ TEST_SF_VAL(sa, L[0], +0.0, -0.22609703187800460722, TEST_TOL1);
+ TEST_SF_VAL(sa, L[10], +0.0, 0.07452710323813558940, TEST_TOL1);
+ TEST_SF_VAL(sa, L[95], +0.0, 0.25865355990880161717, TEST_TOL1);
+ gsl_test(sa, "gsl_sf_legendre_sphPlm_array(100, 5, 0.5)");
+ s += sa;
+
+ sa = 0;
+ gsl_sf_legendre_sphPlm_array(100, 2, 1.0 - 1.0/1125899906842624.0, L);
+ TEST_SF_VAL(sa, L[0], +0.0, 6.8616082064776657177e-16, TEST_TOL2);
+ TEST_SF_VAL(sa, L[10], +0.0, 4.8543150313086787324e-14, TEST_TOL2);
+ TEST_SF_VAL(sa, L[95], +0.0, 8.3138984963650838973e-12, TEST_TOL2);
+ gsl_test(sa, "gsl_sf_legendre_sphPlm_array(100, 2, 1.0 - 2^(-50))");
+ s += sa;
+
+ sa = 0;
+ gsl_sf_legendre_sphPlm_array(100, 2, -1.0 + 1.0/1125899906842624.0, L);
+ TEST_SF_VAL(sa, L[0], +0.0, 6.8616082064776657177e-16, TEST_TOL2);
+ TEST_SF_VAL(sa, L[95], +0.0, -8.3138984963650838973e-12, TEST_TOL2);
+ gsl_test(sa, "gsl_sf_legendre_sphPlm_array(100, 2, -1.0 + 2^(-50))");
+ s += sa;
+
+ sa = 0;
+ gsl_sf_legendre_sphPlm_deriv_array(100, 0, 0.5, L, DL);
+ TEST_SF_VAL(sa, DL[0], +0.0, 0.0, TEST_TOL1);
+ TEST_SF_VAL(sa, DL[10], +0.0, -2.9953934850252897591, TEST_TOL1);
+ TEST_SF_VAL(sa, DL[95], +0.0, -36.411811015111761007, TEST_TOL1);
+ gsl_test(sa, "gsl_sf_legendre_sphPlm_deriv_array(100, 0, 0.5)");
+ s += sa;
+
+ sa = 0;
+ gsl_sf_legendre_sphPlm_deriv_array(100, 1, 0.5, L, DL);
+ TEST_SF_VAL(sa, DL[0], +0.0, 0.19947114020071633897, TEST_TOL1);
+ TEST_SF_VAL(sa, DL[1], +0.0, -0.44603102903819277863, TEST_TOL1);
+ TEST_SF_VAL(sa, DL[10], +0.0, 1.3658895325030216565, TEST_TOL1);
+ TEST_SF_VAL(sa, DL[99], +0.0, -27.925571865639037118, TEST_TOL1);
+ gsl_test(sa, "gsl_sf_legendre_sphPlm_deriv_array(100, 1, 0.5)");
+ s += sa;
+
+ sa = 0;
+ gsl_sf_legendre_sphPlm_deriv_array(100, 1, 1.0 - 1.0/1125899906842624.0, L, DL);
+ TEST_SF_VAL(sa, DL[0], +0.0, 8.1973898803378530946e+06, TEST_TOL1);
+ TEST_SF_VAL(sa, DL[1], +0.0, 1.8329921010504257405e+07, TEST_TOL1);
+ TEST_SF_VAL(sa, DL[10], +0.0, 1.8439572562895384115e+08, TEST_TOL1);
+ TEST_SF_VAL(sa, DL[99], +0.0, 4.7682463136232210552e+09, TEST_TOL3);
+ gsl_test(sa, "gsl_sf_legendre_sphPlm_deriv_array(100, 1, 1.0 - 2^(-50))");
+ s += sa;
+
+ sa = 0;
+ gsl_sf_legendre_sphPlm_deriv_array(100, 2, 0.5, L, DL);
+ TEST_SF_VAL(sa, DL[0], +0.0, -0.38627420202318958034, TEST_TOL1);
+ TEST_SF_VAL(sa, DL[1], +0.0, 0.25549636910832059085, TEST_TOL1);
+ TEST_SF_VAL(sa, DL[2], +0.0, 1.5053547230039006279, TEST_TOL1);
+ TEST_SF_VAL(sa, DL[10], +0.0, 0.73576559668648243477, TEST_TOL1);
+ TEST_SF_VAL(sa, DL[98], +0.0, 28.444589950264378407, TEST_TOL1);
+ gsl_test(sa, "gsl_sf_legendre_sphPlm_deriv_array(100, 2, 0.5)");
+ s += sa;
+
+ sa = 0;
+ gsl_sf_legendre_sphPlm_deriv_array(100, 5, 0.5, L, DL);
+ TEST_SF_VAL(sa, DL[0], +0.0, 0.75365677292668202407, TEST_TOL1);
+ TEST_SF_VAL(sa, DL[1], +0.0, 0.54346962777757450534, TEST_TOL1);
+ TEST_SF_VAL(sa, DL[2], +0.0, -0.98309969029001383773, TEST_TOL1);
+ TEST_SF_VAL(sa, DL[3], +0.0, -2.7728270988954534293, TEST_TOL1);
+ TEST_SF_VAL(sa, DL[10], +0.0, -5.7407133315443482193, TEST_TOL1);
+ TEST_SF_VAL(sa, DL[95], +0.0, -25.893934624747394561, TEST_TOL1);
+ gsl_test(sa, "gsl_sf_legendre_sphPlm_deriv_array(100, 5, 0.5)");
+ s += sa;
+ sa = 0;
+
+ gsl_sf_legendre_sphPlm_deriv_array(100, 5, 1.0 - 1.0/1125899906842624.0, L, DL);
+ TEST_SF_VAL(sa, DL[0], +0.0, 1.7374288379067753301e-22, TEST_TOL1);
+ TEST_SF_VAL(sa, DL[1], +0.0, 6.2643887625426827113e-22, TEST_TOL1);
+ TEST_SF_VAL(sa, DL[2], +0.0, 1.6482697200734667281e-21, TEST_TOL1);
+ TEST_SF_VAL(sa, DL[95], +0.0, 3.9890549466071349506e-15, TEST_TOL2);
+ gsl_test(sa, "gsl_sf_legendre_sphPlm_deriv_array(100, 5, 1.0 - 2^(-50))");
+ s += sa;
+
+ gsl_sf_legendre_sphPlm_deriv_array(100, 5, -1.0 + 1.0/1125899906842624.0, L, DL);
+ TEST_SF_VAL(sa, DL[0], +0.0, -1.7374288379067753301e-22, TEST_TOL1);
+ TEST_SF_VAL(sa, DL[1], +0.0, 6.2643887625426827113e-22, TEST_TOL1);
+ TEST_SF_VAL(sa, DL[2], +0.0, -1.6482697200734667281e-21, TEST_TOL1);
+ TEST_SF_VAL(sa, DL[95], +0.0, 3.9890549466071349506e-15, TEST_TOL3);
+ gsl_test(sa, "gsl_sf_legendre_sphPlm_deriv_array(100, 5, -1.0 + 2^(-50))");
+ s += sa;
+
+ TEST_SF(s, gsl_sf_conicalP_half_e, (0.0, -0.5, &r), 0.8573827581049917129, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_half_e, (0.0, 0.5, &r), 0.8573827581049917129, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_half_e, (0.0, 2.0, &r), 0.6062611623284649811, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_half_e, (0.0, 100.0, &r), 0.07979045091636735635, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_conicalP_half_e, (10.0, -0.5, &r), 5.345484922591867188e+08, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_half_e, (10.0, 0.5, &r), 15137.910380385258370, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_half_e, (10.0, 2.0, &r), 0.4992680691891618544, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_half_e, (10.0, 100.0, &r), -0.07272008163718195685, TEST_TOL2, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_conicalP_half_e, (200.0, -1.0e-3, &r), 1.3347639529084185010e+136, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_half_e, (200.0, 1.0e-8, &r), 1.0928098010940058507e+136, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_half_e, (200.0, 0.5, &r), 3.895546021611205442e+90, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_half_e, (200.0, 10.0, &r), -0.04308567180833581268, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_half_e, (200.0, 100.0, &r), -0.04694669186576399194, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_half_e, (200.0, 1000.0, &r), 0.023698140704121273277, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_half_e, (200.0, 1.0e+8, &r), -0.00006790983312124277891, TEST_TOL3, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_conicalP_half_e, (1.0e+8, 1.1, &r), 1.1599311133054742944, TEST_SQRT_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_half_e, (1.0e+8, 100.0, &r), 0.07971967557381557875, TEST_SQRT_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_conicalP_mhalf_e, (0.0, -0.5, &r), 1.7956982494514644808, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_mhalf_e, (0.0, 0.5, &r), 0.8978491247257322404, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_mhalf_e, (0.0, 2.0, &r), 0.7984204253272901551, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_mhalf_e, (0.0, 100.0, &r), 0.4227531369388072584, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_conicalP_mhalf_e, (10.0, -0.5, &r), 5.345484922591867181e+07, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_mhalf_e, (10.0, 0.5, &r), 1513.7910356104985334, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_mhalf_e, (10.0, 2.0, &r), 0.03439243987215615642, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_mhalf_e, (10.0, 100.0, &r), 0.003283756665952609624, TEST_TOL2, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_conicalP_mhalf_e, (200.0, -0.5, &r), 1.7699538115312304280e+179, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_mhalf_e, (200.0, 1.0e-8, &r), 5.464049005470029253e+133, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_mhalf_e, (200.0, 0.5, &r), 1.9477730108056027211e+88, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_mhalf_e, (200.0, 10.0, &r), 0.0012462575917716355362, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_mhalf_e, (200.0, 100.0, &r), -0.0003225881344802625149, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_mhalf_e, (200.0, 1000.0, &r), -0.00004330652890886567623, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_mhalf_e, (200.0, 1.0e+8, &r), 2.0943091278037078483e-07, TEST_TOL3, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_conicalP_mhalf_e, (1.0e+8, 1.1, &r), 2.092320445620989618e-09, 16.0*TEST_SQRT_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_mhalf_e, (1.0e+8, 100.0, &r), -3.359967833599016923e-11, 256.0*TEST_SQRT_TOL0, GSL_SUCCESS);
+
+
+ TEST_SF(s, gsl_sf_conicalP_0_e, (0.0, -0.5, &r), 1.3728805006183501647, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_0_e, (0.0, 0.5, &r), 1.0731820071493643751, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_0_e, (0.0, 2.0, &r), 0.9012862993604472987, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_0_e, (0.0, 100.0, &r), 0.30091748588199264556, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_conicalP_0_e, (10.0, -0.5, &r), 1.6795592815421804669e+08, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_0_e, (10.0, 0.5, &r), 4826.034132009618240, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_0_e, (10.0, 2.0, &r), 0.18798468917758716146, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_0_e, (10.0, 100.0, &r), -0.008622130749987962529, TEST_TOL2, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_conicalP_0_e, (200.0, -0.5, &r), 2.502194818646823e+180, TEST_TOL4, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_conicalP_0_e, (1000.0, 100.0, &r), 0.0017908817653497715844, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_0_e, (1000.0, 1000.0, &r), -0.0006566893804926284301, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_0_e, (1000.0, 1.0e+8, &r), 2.3167213561756390068e-06, TEST_TOL4, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_conicalP_1_e, (0.0, -0.5, &r), 0.4939371126656998499, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_1_e, (0.0, 0.5, &r), 0.14933621085538265636, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_1_e, (0.0, 2.0, &r), -0.13666874968871549533, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_1_e, (0.0, 100.0, &r), -0.10544528203156629098, TEST_TOL2, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_conicalP_1_e, (10.0, -0.5, &r), 1.7253802958788312520e+09, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_1_e, (10.0, 0.5, &r), 46781.02294059967988, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_1_e, (10.0, 2.0, &r), 0.26613342643657444400, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_1_e, (10.0, 100.0, &r), -0.23281959695501029796, TEST_TOL2, GSL_SUCCESS);
+
+
+ /* FIXME: Mathematica gets some brain-damaged numbers for
+ * these x < 0 points. I have checked what I am doing in detail,
+ * and it must be right because you can do it by summing
+ * manifestly positive definite quantities.
+ */
+ TEST_SF(s, gsl_sf_conicalP_1_e, (200.0, -0.999, &r), 2.71635193199341135e+270, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_1_e, (200.0, -0.9, &r), 4.2952493176812905e+234, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_1_e, (200.0, -0.5, &r), 5.01159205956053439e+182, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_1_e, (200.0, 0.999, &r), 195733.0396081538, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_1_e, (200.0, 10.0, &r), -2.9272610662414349553, TEST_TOL2, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_conicalP_1_e, (1000.0, 100.0, &r), -1.7783258105862399857, TEST_TOL6, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_1_e, (1000.0, 1000.0, &r), 0.4535161075156427179, TEST_TOL4, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_1_e, (1000.0, 1.0e+8, &r), 0.0009983414549874888478, TEST_SQRT_TOL0, GSL_SUCCESS);
+
+
+ TEST_SF(s, gsl_sf_conicalP_sph_reg_e, (2, 1.0, -0.5, &r), 1.6406279287008789526, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_sph_reg_e, (10, 1.0, -0.5, &r), 0.000029315266725049129448, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_sph_reg_e, (20, 1.0, -0.5, &r), 7.335769429462034431e-15, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_sph_reg_e, (30, 1.0, -0.5, &r), 1.3235612394267378871e-26, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_sph_reg_e, (10, 1.0, 0.5, &r), 2.7016087199857873954e-10, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_sph_reg_e, (20, 1.0, 0.5, &r), 1.1782569701435933399e-24, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_sph_reg_e, (30, 1.0, 0.5, &r), 3.636240588303797919e-41, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_sph_reg_e, (10, 1.0, 2.0, &r), 2.4934929626284934483e-10, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_sph_reg_e, (20, 1.0, 2.0, &r), 1.1284762488012616191e-24, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_sph_reg_e, (30, 100.0, 100.0, &r), -1.6757772087159526048e-64, TEST_TOL6, GSL_SUCCESS);
+
+
+ TEST_SF(s, gsl_sf_conicalP_cyl_reg_e, (2, 1.0, -0.5, &r), 2.2048510472375258708, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_cyl_reg_e, (10, 1.0, -0.5, &r), 0.00007335034531618655690, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_cyl_reg_e, (20, 1.0, -0.5, &r), 2.5419860619212164696e-14, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_cyl_reg_e, (30, 1.0, -0.5, &r), 5.579714972260536827e-26, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_cyl_reg_e, (10, 1.0, 0.5, &r), 1.1674078819646475282e-09, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_cyl_reg_e, (20, 1.0, 0.5, &r), 7.066408031229072207e-24, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_cyl_reg_e, (30, 1.0, 0.5, &r), 2.6541973286862588488e-40, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_cyl_reg_e, (10, 1.0, 2.0, &r), 1.0736109751890863051e-09, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_cyl_reg_e, (20, 1.0, 2.0, &r), 6.760965304863386741e-24, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_conicalP_cyl_reg_e, (30, 100.0, 100.0, &r), -4.268753482520651007e-63, TEST_TOL4, GSL_SUCCESS);
+
+
+ TEST_SF(s, gsl_sf_legendre_H3d_0_e, (1.0e-06, 1.0e-06, &r), 0.9999999999998333333 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_H3d_0_e, (1.0, 0.0, &r), 1.0 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_H3d_0_e, (1.0, 1.0, &r), 0.7160229153604338713 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_H3d_0_e, (1.0, 100.0, &r), -3.767437313149604566e-44 , TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_H3d_0_e, (1.0, 500.0, &r), -6.665351935878582205e-218, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_H3d_0_e, (100.0, 1.0, &r), -0.004308757035378200029 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_H3d_0_e, (100.0, 10.0, &r), 7.508054627912986427e-07 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_H3d_0_e, (1000.0, 1.0, &r), 0.0007036067909088818319 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_H3d_0_e, (1.0e+08, 1.0, &r), 7.927485371429105968e-09 , TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_H3d_0_e, (1.0e+08, 100.0, &r), -3.627118904186918957e-52 , 32.0*TEST_SQRT_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_legendre_H3d_1_e, (1.0e-06, 1.0e-06, &r), 3.333333333334222222e-07, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_H3d_1_e, (1.0, 1.0e-10, &r), 4.714045207910316829e-11, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_H3d_1_e, (1.0, 1.0, &r), 0.3397013994799344639, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_H3d_1_e, (1.0, 100.0, &r), -7.200624449531811272e-44, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_H3d_1_e, (1.0, 500.0, &r), 4.192260336821728677e-218, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_H3d_1_e, (100.0, 0.01, &r), 0.30117664944267412324 , TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_H3d_1_e, (100.0, 1.0, &r), -0.007393833425336299309 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_H3d_1_e, (100.0, 10.0, &r), -5.031062029821254982e-07 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_H3d_1_e, (1000.0, 0.001, &r), 0.30116875865090396421 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_H3d_1_e, (1000.0, 1.0, &r), -0.0004776144516074971885 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_H3d_1_e, (1.0e+08, 1.0e-08, &r), 0.30116867893975679722 , TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_H3d_1_e, (1.0e+08, 1.0, &r), 3.0921097047369081582e-09, TEST_TOL4, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_H3d_1_e, (1.0e+08, 100.0, &r), -6.496142701296286936e-52 , 32.0*TEST_SQRT_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_legendre_H3d_e, (5, 1.0e-06, 1.0e-06, &r), 1.1544011544013627977e-32, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_H3d_e, (5, 1.0, 1.0e-10, &r), 2.0224912016958766992e-52, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_H3d_e, (5, 1.0, 1.0, &r), 0.011498635037491577728, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_H3d_e, (5, 1.0, 5.0, &r), 0.0020696945662545205776, TEST_TOL4, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_H3d_e, (5, 1.0, 7.0, &r), -0.0017555303787488993676, TEST_TOL4, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_H3d_e, (5, 1.0, 10.0, &r), 0.00008999979724504887101, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_H3d_e, (5, 1.0, 100.0, &r), -4.185397793298567945e-44, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_H3d_e, (5, 1.0, 500.0, &r), 1.4235113901091961263e-217, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_H3d_e, (5, 100.0, 0.001, &r), 9.642762597222417946e-10, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_H3d_e, (5, 100.0, 0.002, &r), 3.0821201254308036109e-08, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_H3d_e, (5, 100.0, 0.01, &r), 0.00009281069019005840532, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_H3d_e, (5, 100.0, 1.0, &r), -0.008043100696178624653, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_H3d_e, (5, 100.0, 10.0, &r), -3.927678432813974207e-07, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_H3d_e, (5, 1000.0, 0.001, &r), 0.00009256365284253254503, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_H3d_e, (5, 1000.0, 0.01, &r), -0.05553733815473079983, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_H3d_e, (5, 1.0e+08, 1.0e-08, &r), 0.00009256115861125841299, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_H3d_e, (5, 1.0e+08, 100.0, &r), -6.496143209092860765e-52 , 128.0*TEST_SQRT_TOL0, GSL_SUCCESS);
+
+#if 0
+ sa = 0;
+ gsl_sf_legendre_H3d_array(100, 1.0, 3.0, L);
+ TEST_SF_VAL(sa, L[0], +0.0, gsl_sf_legendre_H3d(0, 1.0, 3.0), 1.0e-12);
+ TEST_SF_VAL(sa, L[1], +0.0, gsl_sf_legendre_H3d(1, 1.0, 3.0), 1.0e-12);
+ TEST_SF_VAL(sa, L[10], +0.0, gsl_sf_legendre_H3d(10, 1.0, 3.0), 1.0e-12);
+ TEST_SF_VAL(sa, L[100], +0.0, gsl_sf_legendre_H3d(100, 1.0, 3.0), 1.0e-12);
+ gsl_test(sa, " gsl_sf_legendre_H3d_array(100, 1.0, 3.0)");
+ s += sa;
+#endif
+
+ /* x = -1 + 2^-16 */
+ TEST_SF(s, gsl_sf_legendre_Q0_e, (-0.9999847412109375, &r), -5.8917472200477175158028143531855, TEST_TOL4, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Q0_e, (-0.5, &r), -0.5493061443340548457, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Q0_e, (-1e-10, &r), -1.000000000000000000e-10, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Q0_e, (0.0, &r), 0.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Q0_e, (1e-10, &r), 1.000000000000000000e-10, TEST_TOL0, GSL_SUCCESS);
+ /* x = 1 - 2^-16 */
+ TEST_SF(s, gsl_sf_legendre_Q0_e, (0.9999847412109375, &r), 5.8917472200477175158028143531855, TEST_TOL4, GSL_SUCCESS);
+ /* x = 1 + 2^-16 */
+ TEST_SF(s, gsl_sf_legendre_Q0_e, ( 1.0000152587890625, &r), 5.8917548494422489138325509750429, TEST_TOL4, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Q0_e, ( 1.5, &r), 0.8047189562170501873, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Q0_e, ( 9.99, &r), 0.1004364599660005447, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Q0_e, ( 10.0, &r), 0.1003353477310755806, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Q0_e, ( 10.01, &r), 0.1002344395571710243, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Q0_e, ( 100, &r), 0.010000333353334762015, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Q0_e, ( 1e10, &r), 1.000000000000000000e-10, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_legendre_Q1_e, (-0.9999847412109375, &r), 4.8916573191196772369, TEST_TOL4, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Q1_e, (-0.5, &r), -0.7253469278329725772, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Q1_e, (-0.01, &r), -0.9998999966664666524, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Q1_e, (-1e-10, &r), -0.999999999999999999, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Q1_e, (0.0, &r), -1.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Q1_e, (1e-10, &r), -0.999999999999999999, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Q1_e, (0.0001, &r), -0.9999999899999999667, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Q1_e, (0.01, &r), -0.9998999966664666524, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Q1_e, (0.5, &r), -0.7253469278329725772, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Q1_e, (0.9999847412109375, &r), 4.8916573191196772369, TEST_TOL4, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Q1_e, (1.0000152587890625, &r), 4.8918447504867045145, TEST_TOL4, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Q1_e, ( 1.5, &r), 0.20707843432557528095, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Q1_e, ( 9.99, &r), 3.360235060345441639e-3, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Q1_e, ( 10.0, &r), 3.353477310755806357e-3, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Q1_e, ( 10.01, &r), 3.346739967281953346e-3, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Q1_e, ( 100.0, &r), 3.333533347620158821e-5, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Q1_e, ( 1e10, &r), 3.333333333333333333e-21, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_legendre_Ql_e, (10, -0.5, &r), -0.29165813966586752393, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Ql_e, (10, 0.5, &r), 0.29165813966586752393, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Ql_e, (10, 1.5, &r), 0.000014714232718207477406, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_legendre_Ql_e, (100, -0.5, &r), -0.09492507395207282096, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Ql_e, (100, 0.5, &r), 0.09492507395207282096, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Ql_e, (100, 1.5, &r), 1.1628163435044121988e-43, TEST_TOL2, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_legendre_Ql_e, (1000, -0.5, &r), -0.030105074974005303500, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Ql_e, (1000, 0.5, &r), 0.030105074974005303500, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_legendre_Ql_e, (1000, 1.1, &r), 1.0757258447825356443e-194, TEST_TOL3, GSL_SUCCESS);
+
+ return s;
+}
diff --git a/gsl-1.9/specfunc/test_mathieu.c b/gsl-1.9/specfunc/test_mathieu.c
new file mode 100644
index 0000000..9143825
--- /dev/null
+++ b/gsl-1.9/specfunc/test_mathieu.c
@@ -0,0 +1,213 @@
+/* specfunc/test_mathieu.c
+ *
+ * Copyright (C) 2003 Lowell Johnson
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/* Author: L. Johnson */
+
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_sf.h>
+#include "test_sf.h"
+
+#define NVAL 100
+
+static double c[NVAL];
+static double s[NVAL];
+
+int test_mathieu(void)
+{
+ gsl_sf_result r;
+ gsl_sf_mathieu_workspace *work;
+ int s = 0;
+ int sa;
+
+ TEST_SF(s, gsl_sf_mathieu_ce, (0, 0.0, 0.0, &r),
+ 0.7071067811865475, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (0, 0.0, M_PI_2, &r),
+ 0.7071067811865475, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (0, 5.0, 0.0, &r),
+ 0.04480018165188902, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (0, 5.0, M_PI_2, &r),
+ 1.334848674698019, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (0, 10.0, 0.0, &r),
+ 0.007626517570935782, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (0, 10.0, M_PI_2, &r),
+ 1.468660470712856, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (0, 15.0, 0.0, &r),
+ 0.001932508315204592, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (0, 15.0, M_PI_2, &r),
+ 1.550108146686649, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (0, 20.0, 0.0, &r),
+ 0.0006037438292242197, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (0, 20.0, M_PI_2, &r),
+ 1.609890857395926, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (0, 25.0, 0.0, &r),
+ 0.0002158630184146612, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (0, 25.0, M_PI_2, &r),
+ 1.657510298323475, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (1, 0.0, 0.0, &r),
+ 1.00000000, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (1, 5.0, 0.0, &r),
+ 0.2565428793223637, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (1, 10.0, 0.0, &r),
+ 0.05359874774717657, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (1, 15.0, 0.0, &r),
+ 0.01504006645382623, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (1, 20.0, 0.0, &r),
+ 0.005051813764712904, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (1, 25.0, 0.0, &r),
+ 0.001911051506657645, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_se, (1, 0.0, M_PI_2, &r),
+ 1.0000000, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_se, (1, 5.0, M_PI_2, &r),
+ 1.337433887022345, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_se, (1, 10.0, M_PI_2, &r),
+ 1.468755664102938, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_se, (1, 15.0, M_PI_2, &r),
+ 1.550115074357552, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_se, (1, 20.0, M_PI_2, &r),
+ 1.609891592603772, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_se, (1, 25.0, M_PI_2, &r),
+ 1.657510398374516, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (2, 0.0, 0.0, &r),
+ 1.00000000, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (2, 0.0, M_PI_2, &r),
+ -1.00000000, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (2, 5.0, 0.0, &r),
+ 0.7352943084006845, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (2, 5.0, M_PI_2, &r),
+ -0.7244881519676682, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (2, 10.0, 0.0, &r),
+ 0.2458883492913189, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (2, 10.0, M_PI_2, &r),
+ -0.9267592641263211, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (2, 15.0, 0.0, &r),
+ 0.07879282784639313, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (2, 15.0, M_PI_2, &r),
+ -1.019966226030262, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (2, 20.0, 0.0, &r),
+ 0.02864894314707431, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (2, 20.0, M_PI_2, &r),
+ -1.075293228779687, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (2, 25.0, 0.0, &r),
+ 0.0115128663308875, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (2, 25.0, M_PI_2, &r),
+ -1.116278953295253, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (5, 0.0, 0.0, &r),
+ 1.00000000, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (5, 5.0, 0.0, &r),
+ 1.12480725063848, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (5, 10.0, 0.0, &r),
+ 1.258019941308287, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (5, 15.0, 0.0, &r),
+ 1.193432230413072, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (5, 20.0, 0.0, &r),
+ 0.9365755314226215, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (5, 25.0, 0.0, &r),
+ 0.6106943100506986, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_se, (5, 0.0, M_PI_2, &r),
+ 1.0000000, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_se, (5, 5.0, M_PI_2, &r),
+ 0.9060779302023551, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_se, (5, 10.0, M_PI_2, &r),
+ 0.8460384335355106, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_se, (5, 15.0, M_PI_2, &r),
+ 0.837949340012484, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_se, (5, 20.0, M_PI_2, &r),
+ 0.8635431218533667, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_se, (5, 25.0, M_PI_2, &r),
+ 0.8992683245108413, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (10, 0.0, 0.0, &r),
+ 1.00000000, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (10, 0.0, M_PI_2, &r),
+ -1.00000000, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (10, 5.0, 0.0, &r),
+ 1.025995027089438, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (10, 5.0, M_PI_2, &r),
+ -0.975347487235964, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (10, 10.0, 0.0, &r),
+ 1.053815992100935, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (10, 10.0, M_PI_2, &r),
+ -0.9516453181789554, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (10, 15.0, 0.0, &r),
+ 1.084106311839221, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (10, 15.0, M_PI_2, &r),
+ -0.9285480638845388, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (10, 20.0, 0.0, &r),
+ 1.117788631259397, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (10, 20.0, M_PI_2, &r),
+ -0.9057107845940974, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (10, 25.0, 0.0, &r),
+ 1.156239918632239, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (10, 25.0, M_PI_2, &r),
+ -0.8826919105636903, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (15, 0.0, 0.0, &r),
+ 1.00000000, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (15, 5.0, 0.0, &r),
+ 1.011293732529566, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (15, 10.0, 0.0, &r),
+ 1.022878282438181, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (15, 15.0, 0.0, &r),
+ 1.034793652236873, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (15, 20.0, 0.0, &r),
+ 1.047084344162887, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_ce, (15, 25.0, 0.0, &r),
+ 1.059800441813937, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_se, (15, 0.0, M_PI_2, &r),
+ -1.0000000, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_se, (15, 5.0, M_PI_2, &r),
+ -0.9889607027406357, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_se, (15, 10.0, M_PI_2, &r),
+ -0.9781423471832157, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_se, (15, 15.0, M_PI_2, &r),
+ -0.9675137031854538, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_se, (15, 20.0, M_PI_2, &r),
+ -0.9570452540612817, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_mathieu_se, (15, 25.0, M_PI_2, &r),
+ -0.9467086958780897, TEST_SNGL, GSL_SUCCESS);
+
+ work = gsl_sf_mathieu_alloc(NVAL, 20.0);
+ sa = 0;
+ gsl_sf_mathieu_ce_array(0, 5, 0.0, M_PI_2, work, c);
+ sa += (test_sf_frac_diff(c[0], 0.7071067811865475) > TEST_SNGL);
+ sa += (test_sf_frac_diff(c[2], -1.0) > TEST_SNGL);
+ sa += (test_sf_frac_diff(c[4], 1.0) > TEST_SNGL);
+ gsl_test(sa, "gsl_sf_mathieu_ce_array");
+ s += sa;
+
+ sa = 0;
+ gsl_sf_mathieu_ce_array(0, 15, 20.0, 0.0, work, c);
+ sa += (test_sf_frac_diff(c[0], 0.0006037438292242197) > TEST_SNGL);
+ sa += (test_sf_frac_diff(c[1], 0.005051813764712904) > TEST_SNGL);
+ sa += (test_sf_frac_diff(c[2], 0.02864894314707431) > TEST_SNGL);
+ sa += (test_sf_frac_diff(c[5], 0.9365755314226215) > TEST_SNGL);
+ sa += (test_sf_frac_diff(c[10], 1.117788631259397) > TEST_SNGL);
+ sa += (test_sf_frac_diff(c[15], 1.047084344162887) > TEST_SNGL);
+ gsl_test(sa, "gsl_sf_mathieu_ce_array");
+ s += sa;
+
+ sa = 0;
+ gsl_sf_mathieu_se_array(1, 15, 20.0, M_PI_2, work, c);
+ sa += (test_sf_frac_diff(c[0], 1.609891592603772) > TEST_SNGL);
+ sa += (test_sf_frac_diff(c[4], 0.8635431218533667) > TEST_SNGL);
+ sa += (test_sf_frac_diff(c[14], -0.9570452540612817) > TEST_SNGL);
+ gsl_test(sa, "gsl_sf_mathieu_se_array");
+ s += sa;
+
+ gsl_sf_mathieu_free(work);
+ return s;
+}
diff --git a/gsl-1.9/specfunc/test_sf.c b/gsl-1.9/specfunc/test_sf.c
new file mode 100644
index 0000000..31fab29
--- /dev/null
+++ b/gsl-1.9/specfunc/test_sf.c
@@ -0,0 +1,2538 @@
+/* specfunc/test_sf.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2004 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_ieee_utils.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_sf.h>
+#include "test_sf.h"
+
+
+double
+test_sf_frac_diff(double x1, double x2)
+{
+ if(x1 == 0.0 && x2 == 0.0) {
+ return 0.0;
+ }
+ else if (x1 == 0.0) {
+ return fabs(x2);
+ } else if(x1 <= DBL_MAX && x2 <= DBL_MAX && (x1 + x2 != 0.0)) {
+ return fabs((x1-x2)/(x1+x2));
+ }
+ else {
+ return 1.0;
+ }
+}
+
+
+/* Check a result against a given value and tolerance.
+ */
+int
+test_sf_check_result(char * message_buff, gsl_sf_result r, double val, double tol)
+{
+ int s = 0;
+ double f = 0;
+
+ if (gsl_isnan(r.val) || gsl_isnan(val))
+ {
+ s = (gsl_isnan(r.val) != gsl_isnan(val)) ? TEST_SF_INCONS : s;
+ }
+ else if (gsl_isinf(r.val) || gsl_isinf(val))
+ {
+ s = (gsl_isinf(r.val) != gsl_isinf(val)) ? TEST_SF_INCONS : s;
+ }
+ else
+ {
+ f = test_sf_frac_diff(val, r.val);
+
+ if(fabs(val - r.val) > 2.0 * TEST_SIGMA * r.err) s |= TEST_SF_INCONS;
+ if(r.err < 0.0) s |= TEST_SF_ERRNEG;
+ if(gsl_isinf(r.err)) s |= TEST_SF_ERRBAD;
+ if(f > TEST_FACTOR * tol) s |= TEST_SF_TOLBAD;
+ }
+
+ if(s != 0) {
+ char buff[2048];
+ sprintf(buff, " expected: %20.16g\n", val);
+ strcat(message_buff, buff);
+ sprintf(buff, " obtained: %20.16g +/- %.16g (rel=%g)\n", r.val, r.err, r.err/(fabs(r.val) + r.err));
+ strcat(message_buff, buff);
+ sprintf(buff, " fracdiff: %20.16g\n", f);
+ strcat(message_buff, buff);
+ }
+
+ if(s & TEST_SF_INCONS) {
+ strcat(message_buff, " value/expected not consistent within reported error\n");
+ }
+ if(s & TEST_SF_ERRNEG) {
+ strcat(message_buff, " reported error negative\n");
+ }
+ if(s & TEST_SF_ERRBAD) {
+ strcat(message_buff, " reported error is bad\n");
+ }
+ if(s & TEST_SF_TOLBAD) {
+ strcat(message_buff, " value not within tolerance of expected value\n");
+ }
+
+ return s;
+}
+
+int
+test_sf_check_val(char * message_buff, double rval, double val, double tol)
+{
+ int s = 0;
+ double f = test_sf_frac_diff(val, rval);
+
+ if(f > TEST_FACTOR * tol) s |= TEST_SF_TOLBAD;
+
+ if(s != 0) {
+ char buff[2048];
+ sprintf(buff, " expected: %20.16g\n", val);
+ strcat(message_buff, buff);
+ sprintf(buff, " obtained: %20.16g\n", rval);
+ strcat(message_buff, buff);
+ sprintf(buff, " fracdiff: %20.16g\n", f);
+ strcat(message_buff, buff);
+ }
+
+ if(s & TEST_SF_TOLBAD) {
+ strcat(message_buff, " value not within tolerance of expected value\n");
+ }
+
+ return s;
+}
+
+
+/* Relax the condition on the agreement and on the usefulness
+ * of the error estimate.
+ */
+int
+test_sf_check_result_relax(char * message_buff, gsl_sf_result r, double val, double tol)
+{
+ int s = 0;
+ double f = test_sf_frac_diff(val, r.val);
+
+ if(f > GSL_MAX_DBL(TEST_SNGL, TEST_FACTOR * tol)) s |= TEST_SF_INCONS;
+ if(r.err < 0.0) s |= TEST_SF_ERRNEG;
+ if(gsl_isinf(r.err)) s |= TEST_SF_ERRBAD;
+ if(f > TEST_FACTOR * tol) s |= TEST_SF_TOLBAD;
+
+ if(s != 0) {
+ char buff[2048];
+ sprintf(buff, " expected: %20.16g\n", val);
+ strcat(message_buff, buff);
+ sprintf(buff, " obtained: %20.16g +/- %.16g (rel=%g)\n", r.val, r.err, r.err/(fabs(r.val) + r.err));
+ strcat(message_buff, buff);
+ sprintf(buff, " fracdiff: %20.16g\n", f);
+ strcat(message_buff, buff);
+ }
+
+ if(s & TEST_SF_INCONS) {
+ strcat(message_buff, " value/expected not consistent MAX(tol,SINGLE_PREC)\n");
+ }
+ if(s & TEST_SF_ERRNEG) {
+ strcat(message_buff, " reported error negative\n");
+ }
+ if(s & TEST_SF_ERRBAD) {
+ strcat(message_buff, " reported error is bad\n");
+ }
+ if(s & TEST_SF_TOLBAD) {
+ strcat(message_buff, " value not within tolerance of expected value\n");
+ }
+
+ return s;
+}
+
+
+/* Check a return value.
+ */
+int
+test_sf_check_return(char * message_buff, int val_return, int expected_return)
+{
+ if(val_return != expected_return) {
+ char buff[256];
+ sprintf(buff, " unexpected return code: %d\n", val_return);
+ strcat(message_buff, buff);
+ return TEST_SF_RETBAD;
+ }
+ else {
+ return 0;
+ }
+}
+
+
+int
+test_sf (gsl_sf_result r, double val_in, double tol, int status,
+ int expect_return, const char * desc)
+{
+ char message_buff[4096];
+ int local_s = 0;
+
+ message_buff[0] = '\0';
+
+ local_s |= test_sf_check_result(message_buff, r, val_in, tol);
+ local_s |= test_sf_check_return(message_buff, status, expect_return);
+
+ gsl_test(local_s, desc);
+ if(local_s != 0) {
+ /* printf(" %s %d\n", __FILE__, __LINE__); */
+ printf("%s", message_buff);
+ printf(" %22.18g %22.18g\n", r.val, r.err);
+ }
+ return local_s;
+}
+
+int
+test_sf_val (double val, double val_in, double tol, const char * desc)
+{
+ char message_buff[4096];
+ int local_s = 0;
+
+ message_buff[0] = '\0';
+
+ local_s |= test_sf_check_val(message_buff, val, val_in, tol);
+
+ gsl_test(local_s, desc);
+ if(local_s != 0) {
+ /* printf(" %s %d\n", __FILE__, __LINE__); */
+ printf("%s", message_buff);
+ printf(" %22.18g\n", val);
+ }
+ return local_s;
+}
+
+
+int
+test_sf_rlx (gsl_sf_result r, double val_in, double tol, int status,
+ int expect_return, const char * desc)
+{
+ char message_buff[4096];
+ int local_s = 0;
+
+ message_buff[0] = '\0';
+
+ local_s |= test_sf_check_result_relax(message_buff, r, val_in, tol);
+ local_s |= test_sf_check_return(message_buff, status, expect_return);
+
+ gsl_test(local_s, desc);
+ if(local_s != 0) {
+ /* printf(" %s %d\n", __FILE__, __LINE__); */
+ printf("%s", message_buff);
+ printf(" %22.18g %22.18g\n", r.val, r.err);
+ }
+ return local_s;
+}
+
+
+int
+test_sf_2 (gsl_sf_result r1, double val1, double tol1,
+ gsl_sf_result r2, double val2, double tol2,
+ int status, int expect_return, const char * desc)
+{
+ char message_buff[4096];
+ int local_s = 0;
+
+ message_buff[0] = '\0';
+
+ local_s |= test_sf_check_result(message_buff, r1, val1, tol1);
+ local_s |= test_sf_check_result(message_buff, r2, val2, tol2);
+ local_s |= test_sf_check_return(message_buff, status, expect_return);
+
+ gsl_test(local_s, desc);
+ if(local_s != 0) {
+ /* printf(" %s %d\n", __FILE__, __LINE__); */
+ printf("%s", message_buff);
+ printf(" %22.18g %22.18g\n", r1.val, r1.err);
+ printf(" %22.18g %22.18g\n", r2.val, r2.err);
+ }
+ return local_s;
+}
+
+int
+test_sf_sgn (gsl_sf_result r, double sgn, double val_in, double tol, double expect_sgn, int status,
+ int expect_return, const char * desc)
+{
+ char message_buff[4096];
+ gsl_sf_result local_r;
+ int local_s = 0;
+
+ message_buff[0] = '\0';
+
+ local_r.val = sgn;
+ local_r.err = 0.0;
+ local_s |= test_sf_check_result(message_buff, r, val_in, tol);
+ local_s |= test_sf_check_result(message_buff, local_r, expect_sgn, 0.0);
+ local_s |= test_sf_check_return(message_buff, status, expect_return);
+
+ gsl_test(local_s, desc);
+ if(local_s != 0) {
+ /* printf(" %s %d\n", __FILE__, __LINE__); */
+ printf("%s", message_buff);
+ printf(" %22.18g %22.18g\n", r.val, r.err);
+ }
+ return local_s;
+}
+
+int test_clausen(void)
+{
+ gsl_sf_result r;
+ int s = 0;
+
+ TEST_SF(s, gsl_sf_clausen_e, (M_PI/20.0, &r), 0.4478882448133546, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_clausen_e, (M_PI/6.0, &r), 0.8643791310538927, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_clausen_e, (M_PI/3.0, &r), 1.0149416064096535, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_clausen_e, ( 2.0*M_PI + M_PI/3.0, &r), 1.0149416064096535, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_clausen_e, (100.0*M_PI + M_PI/3.0, &r), 1.0149416064096535, TEST_TOL0, GSL_SUCCESS);
+
+ return s;
+}
+
+
+int test_coupling(void)
+{
+ gsl_sf_result r;
+ int s = 0;
+
+ /* Test 3j */
+
+ TEST_SF(s, gsl_sf_coupling_3j_e, (0, 1, 1, 0, 1, -1, &r), sqrt(1.0/2.0), TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_coupling_3j_e, (1, 1, 2, 1, -1, 0, &r), sqrt(1.0/6.0), TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_coupling_3j_e, (2, 4, 6, 0, 2, -2, &r), sqrt(8.0/105.0), TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_coupling_3j_e, (4, 4, 8, 0, 0, 0, &r), sqrt(2.0/35.0), TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_coupling_3j_e, (4, 4, 8, 2, -2, 0, &r), 2.0/3.0*sqrt(2.0/35.0), TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_coupling_3j_e, (4, 4, 8, 4, -4, 0, &r), 1.0/(3.0*sqrt(70.0)), TEST_TOL2, GSL_SUCCESS);
+
+ /* Test 3j error checking */
+
+ TEST_SF(s, gsl_sf_coupling_3j_e, (-1, 1, 2, 1, -1, 0, &r), GSL_NAN, GSL_NAN, GSL_EDOM);
+ TEST_SF(s, gsl_sf_coupling_3j_e, (1, -1, 2, 1, -1, 0, &r), GSL_NAN, GSL_NAN, GSL_EDOM);
+ TEST_SF(s, gsl_sf_coupling_3j_e, (1, 1, -2, 1, -1, 0, &r), GSL_NAN, GSL_NAN, GSL_EDOM);
+
+ /* Test |m_i|<=j_i */
+
+ TEST_SF(s, gsl_sf_coupling_3j_e, (1, 1, 2, 2, -1, 0, &r), 0, 0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_coupling_3j_e, (1, 1, 2, 1, -2, 0, &r), 0, 0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_coupling_3j_e, (1, 1, 2, 1, -1, 3, &r), 0, 0, GSL_SUCCESS);
+
+ /* Test triangle condition j1 + j2 >= j, j >= j2 - j1, j>= j1 - j2 */
+
+ TEST_SF(s, gsl_sf_coupling_3j_e, (1, 1, 3, 1, -1, 0, &r), 0, 0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_coupling_3j_e, (1, 4, 2, 1, -1, 0, &r), 0, 0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_coupling_3j_e, (4, 1, 2, 1, -1, 0, &r), 0, 0, GSL_SUCCESS);
+
+ /* Test 6j */
+
+ TEST_SF(s, gsl_sf_coupling_6j_e, (2, 2, 4, 2, 2, 2, &r), 1.0/6.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_coupling_6j_e, (4, 4, 2, 4, 4, 4, &r), -1.0/10.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_coupling_6j_e, (4, 4, 2, 4, 4, 2, &r), 1.0/6.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_coupling_6j_e, (4, 4, 2, 2, 2, 2, &r), -0.5/sqrt(5.0), TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_coupling_6j_e, (4, 4, 4, 2, 2, 2, &r), sqrt(7.0/3.0)/10.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_coupling_6j_e, (6, 6, 6, 4, 4, 4, &r), -sqrt(3.0/5.0)/14.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_coupling_6j_e, (6, 6, 6, 4, 4, 2, &r), -sqrt(3.0/5.0)/7.0, TEST_TOL0, GSL_SUCCESS);
+
+ /* Test 6j error checking */
+
+ TEST_SF(s, gsl_sf_coupling_6j_e, (-2, 2, 4, 2, 2, 2, &r), GSL_NAN, GSL_NAN, GSL_EDOM);
+ TEST_SF(s, gsl_sf_coupling_6j_e, (2, -2, 4, 2, 2, 2, &r), GSL_NAN, GSL_NAN, GSL_EDOM);
+ TEST_SF(s, gsl_sf_coupling_6j_e, (2, 2, -4, 2, 2, 2, &r), GSL_NAN, GSL_NAN, GSL_EDOM);
+ TEST_SF(s, gsl_sf_coupling_6j_e, (2, 2, 4, -2, 2, 2, &r), GSL_NAN, GSL_NAN, GSL_EDOM);
+ TEST_SF(s, gsl_sf_coupling_6j_e, (2, 2, 4, 2, -2, 2, &r), GSL_NAN, GSL_NAN, GSL_EDOM);
+ TEST_SF(s, gsl_sf_coupling_6j_e, (2, 2, 4, 2, 2, -2, &r), GSL_NAN, GSL_NAN, GSL_EDOM);
+
+ /* Test 6j triangle conditions */
+
+ TEST_SF(s, gsl_sf_coupling_6j_e, (2, 2, 4, 2, 2, 7, &r), 0, 0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_coupling_6j_e, (2, 2, 4, 2, 7, 2, &r), 0, 0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_coupling_6j_e, (2, 2, 4, 7, 2, 2, &r), 0, 0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_coupling_6j_e, (2, 2, 7, 2, 2, 2, &r), 0, 0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_coupling_6j_e, (2, 7, 4, 2, 2, 2, &r), 0, 0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_coupling_6j_e, (7, 2, 4, 2, 2, 2, &r), 0, 0, GSL_SUCCESS);
+
+ /* Test 9j */
+
+ TEST_SF(s, gsl_sf_coupling_9j_e, (4, 2, 4, 3, 3, 2, 1, 1, 2, &r), -sqrt(1.0/6.0)/10.0, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_coupling_9j_e, (8, 4, 10, 7, 3, 8, 1, 1, 2, &r), sqrt(7.0/3.0)/60.0, TEST_TOL2, GSL_SUCCESS);
+
+ /* Test 9j error checking */
+
+ TEST_SF(s, gsl_sf_coupling_9j_e, (-4, 2, 4, 3, 3, 2, 1, 1, 2, &r), GSL_NAN, GSL_NAN, GSL_EDOM);
+ TEST_SF(s, gsl_sf_coupling_9j_e, (4, -2, 4, 3, 3, 2, 1, 1, 2, &r), GSL_NAN, GSL_NAN, GSL_EDOM);
+ TEST_SF(s, gsl_sf_coupling_9j_e, (4, 2, -4, 3, 3, 2, 1, 1, 2, &r), GSL_NAN, GSL_NAN, GSL_EDOM);
+ TEST_SF(s, gsl_sf_coupling_9j_e, (4, 2, 4, -3, 3, 2, 1, 1, 2, &r), GSL_NAN, GSL_NAN, GSL_EDOM);
+ TEST_SF(s, gsl_sf_coupling_9j_e, (4, 2, 4, 3, -3, 2, 1, 1, 2, &r), GSL_NAN, GSL_NAN, GSL_EDOM);
+ TEST_SF(s, gsl_sf_coupling_9j_e, (4, 2, 4, 3, 3, -2, 1, 1, 2, &r), GSL_NAN, GSL_NAN, GSL_EDOM);
+ TEST_SF(s, gsl_sf_coupling_9j_e, (4, 2, 4, 3, 3, 2, -1, 1, 2, &r), GSL_NAN, GSL_NAN, GSL_EDOM);
+ TEST_SF(s, gsl_sf_coupling_9j_e, (4, 2, 4, 3, 3, 2, 1, -1, 2, &r), GSL_NAN, GSL_NAN, GSL_EDOM);
+ TEST_SF(s, gsl_sf_coupling_9j_e, (4, 2, 4, 3, 3, 2, 1, 1, -2, &r), GSL_NAN, GSL_NAN, GSL_EDOM);
+
+ TEST_SF(s, gsl_sf_coupling_9j_e, (10, 2, 4, 3, 3, 2, 1, 1, 2, &r), 0, 0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_coupling_9j_e, (4, 10, 4, 3, 3, 2, 1, 1, 2, &r), 0, 0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_coupling_9j_e, (4, 2, 10, 3, 3, 2, 1, 1, 2, &r), 0, 0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_coupling_9j_e, (4, 2, 4, 10, 3, 2, 1, 1, 2, &r), 0, 0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_coupling_9j_e, (4, 2, 4, 3, 10, 2, 1, 1, 2, &r), 0, 0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_coupling_9j_e, (4, 2, 4, 3, 3, 10, 1, 1, 2, &r), 0, 0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_coupling_9j_e, (4, 2, 4, 3, 3, 2, 10, 1, 2, &r), 0, 0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_coupling_9j_e, (4, 2, 4, 3, 3, 2, 1, 10, 2, &r), 0, 0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_coupling_9j_e, (4, 2, 4, 3, 3, 2, 1, 1, 10, &r), 0, 0, GSL_SUCCESS);
+ return s;
+}
+
+int test_dawson(void)
+{
+ gsl_sf_result r;
+ int s = 0;
+
+ TEST_SF(s, gsl_sf_dawson_e, (1.0e-15, &r), 1.0e-15, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_dawson_e, (0.5, &r), 0.4244363835020222959, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_dawson_e, (2.0, &r), 0.30134038892379196603, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_dawson_e, (1000.0, &r), 0.0005000002500003750009, TEST_TOL0, GSL_SUCCESS);
+
+ return s;
+}
+
+int test_debye(void)
+{
+ gsl_sf_result r;
+ int s = 0;
+
+ TEST_SF(s, gsl_sf_debye_1_e, (0.1, &r), 0.975277750004723276, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_debye_1_e, (1.0, &r), 0.777504634112248239, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_debye_1_e, (10.0, &r), 0.164443465679946027, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_debye_2_e, (0.1, &r), 0.967083287045302664, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_debye_2_e, (1.0, &r), 0.70787847562782924, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_debye_2_e, (10.0, &r), 0.0479714980201218708, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_debye_3_e, (0.1, &r), 0.962999940487211048, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_debye_3_e, (1.0, &r), 0.674415564077814667, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_debye_3_e, (10.0, &r), 0.0192957656903454886, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_debye_4_e, (0.1, &r), 0.960555486124335944, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_debye_4_e, (1.0, &r), 0.654874068886737049, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_debye_4_e, (10.0, &r), 0.00967367556027115896, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_debye_5_e, (0.1, &r), 0.95892849428310568745, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_debye_5_e, (1.0, &r), 0.6421002580217790246, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_debye_5_e, (10.0, &r), 0.005701535852992908538, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_debye_6_e, (0.1, &r), 0.95776777382605465878, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_debye_6_e, (1.0, &r), 0.63311142583495107588, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_debye_6_e, (10.0, &r), 3.7938493294615955279e-3, TEST_TOL0, GSL_SUCCESS);
+
+ return s;
+}
+
+
+int test_elementary(void)
+{
+ gsl_sf_result r;
+ double x = 0.2*DBL_MAX;
+ int s = 0;
+
+ TEST_SF(s, gsl_sf_multiply_e, (-3.0,2.0, &r), -6.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_multiply_e, (x, 1.0/x, &r), 1.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_multiply_e, (x, 0.2, &r), 0.04*DBL_MAX, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_multiply_e, (x, 4.0, &r), 0.8*DBL_MAX, TEST_TOL1, GSL_SUCCESS);
+ s += ( gsl_sf_multiply_e(DBL_MAX, 1.1, &r) != GSL_EOVRFLW);
+ s += ( gsl_sf_multiply_e(DBL_MIN, DBL_MIN, &r) != GSL_EUNDRFLW);
+ s += ( gsl_sf_multiply_e(DBL_MIN, -DBL_MIN, &r) != GSL_EUNDRFLW);
+
+ return s;
+}
+
+
+int test_ellint(void)
+{
+ gsl_sf_result r;
+ gsl_mode_t mode = GSL_MODE_DEFAULT;
+ int s = 0;
+
+ TEST_SF(s, gsl_sf_ellint_Kcomp_e, ( 0.99, mode, &r), 3.3566005233611923760, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_Kcomp_e, ( 0.50, mode, &r), 1.6857503548125960429, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_Kcomp_e, (0.010, mode, &r), 1.5708355989121522360, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_Ecomp_e, (0.99, mode, &r), 1.0284758090288040010, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_Ecomp_e, (0.50, mode, &r), 1.4674622093394271555, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_Ecomp_e, (0.01, mode, &r), 1.5707570561503852873, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_Pcomp_e, (0.99, 0.1, mode, &r), 3.13792612351836506315593, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_Pcomp_e, (0.50, 0.1, mode, &r), 1.60455249360848890075108, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_Pcomp_e, (0.01, 0.1, mode, &r), 1.49773208536003801277453, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_Dcomp_e, (0.99, mode, &r), 2.375395076351788975665323192, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_Dcomp_e, (0.50, mode, &r), 0.8731525818926755496456335628, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_Dcomp_e, (0.01, mode, &r), 0.7854276176694868932799393751, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_F_e, (M_PI/3.0, 0.99, mode, &r), 1.3065333392738766762, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_F_e, (M_PI/3.0, 0.50, mode, &r), 1.0895506700518854093, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_F_e, (M_PI/3.0, 0.01, mode, &r), 1.0472129063770918952, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_E_e, (M_PI/3.0, 0.99, mode, &r), 0.8704819220377943536, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_E_e, (M_PI/3.0, 0.50, mode, &r), 1.0075555551444720293, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_E_e, (M_PI/3.0, 0.01, mode, &r), 1.0471821963889481104, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_P_e, (M_PI/3.0, 0.99, 0.5, mode, &r), 1.1288726598764099882, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_P_e, (M_PI/3.0, 0.50, 0.5, mode, &r), 0.9570574331323584890, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_P_e, (M_PI/3.0, 0.01, 0.5, mode, &r), 0.9228868127118118465, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_RF_e, (5.0e-11, 1.0e-10, 1.0, mode, &r), 12.36441982979439, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_RF_e, (1.0, 2.0, 3.0, mode, &r), 0.7269459354689082, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_RD_e, (5.0e-11, 1.0e-10, 1.0, mode, &r), 34.0932594919337362, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_RD_e, (1.0, 2.0, 3.0, mode, &r), 0.2904602810289906, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_RC_e, (1.0, 2.0, mode, &r), 0.7853981633974482, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_RJ_e, (2.0, 3.0, 4.0, 5.0, mode, &r), 0.1429757966715675, TEST_TOL0, GSL_SUCCESS);
+
+ /* E, argument phi > pi/2 */
+
+ TEST_SF(s, gsl_sf_ellint_E_e, (M_PI/2.0, 0.99, mode, &r), 1.02847580902880400098389, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_E_e, (M_PI/2.0, 0.50, mode, &r), 1.46746220933942715545980, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_E_e, (M_PI/2.0, 0.01, mode, &r), 1.57075705615038528733708, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_E_e, (2*M_PI/3.0, 0.99, mode, &r), 1.18646969601981364833972, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_E_e, (2*M_PI/3.0, 0.50, mode, &r), 1.92736886353438228163734, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_E_e, (2*M_PI/3.0, 0.01, mode, &r), 2.09433191591182246425715, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_E_e, (M_PI, 0.99, mode, &r), 2.05695161805760800196777, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_E_e, (M_PI, 0.50, mode, &r), 2.93492441867885431091959, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_E_e, (M_PI, 0.01, mode, &r), 3.14151411230077057467416, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_E_e, (4*M_PI/3, 0.99, mode, &r), 2.92743354009540235559582, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_E_e, (4*M_PI/3, 0.50, mode, &r), 3.94247997382332634020184, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_E_e, (4*M_PI/3, 0.01, mode, &r), 4.18869630868971868509117, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_E_e, (3*M_PI/2.0, 0.99, mode, &r), 3.08542742708641200295166, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_E_e, (3*M_PI/2.0, 0.50, mode, &r), 4.40238662801828146637939, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_E_e, (3*M_PI/2.0, 0.01, mode, &r), 4.71227116845115586201123, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_E_e, (5*M_PI/3, 0.99, mode, &r), 3.24342131407742165030750, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_E_e, (5*M_PI/3, 0.50, mode, &r), 4.86229328221323659255693, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_E_e, (5*M_PI/3, 0.01, mode, &r), 5.23584602821259303893130, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_E_e, (2*M_PI, 0.99, mode, &r), 4.11390323611521600393555, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_E_e, (2*M_PI, 0.50, mode, &r), 5.86984883735770862183918, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_E_e, (2*M_PI, 0.01, mode, &r), 6.28302822460154114934831, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_E_e, (7*M_PI/3.0, 0.99, mode, &r), 4.98438515815301035756360, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_E_e, (7*M_PI/3.0, 0.50, mode, &r), 6.87740439250218065112143, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_E_e, (7*M_PI/3.0, 0.01, mode, &r), 7.33021042099048925976532, TEST_TOL0, GSL_SUCCESS);
+
+ /* Test some negative arguments, phi < 0 */
+
+ TEST_SF(s, gsl_sf_ellint_E_e, (-M_PI/2.0, 0.99, mode, &r), -1.02847580902880400098389, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_E_e, (-M_PI/2.0, 0.50, mode, &r), -1.46746220933942715545980, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_E_e, (-M_PI/2.0, 0.01, mode, &r), -1.57075705615038528733708, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_E_e, (-2*M_PI/3.0, 0.99, mode, &r), -1.18646969601981364833972, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_E_e, (-2*M_PI/3.0, 0.50, mode, &r), -1.92736886353438228163734, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_E_e, (-2*M_PI/3.0, 0.01, mode, &r), -2.09433191591182246425715, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_E_e, (-M_PI, 0.99, mode, &r), -2.05695161805760800196777, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_E_e, (-M_PI, 0.50, mode, &r), -2.93492441867885431091959, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_E_e, (-M_PI, 0.01, mode, &r), -3.14151411230077057467416, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_E_e, (-4*M_PI/3, 0.99, mode, &r), -2.92743354009540235559582, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_E_e, (-4*M_PI/3, 0.50, mode, &r), -3.94247997382332634020184, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_E_e, (-4*M_PI/3, 0.01, mode, &r), -4.18869630868971868509117, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_E_e, (-3*M_PI/2.0, 0.99, mode, &r), -3.08542742708641200295166, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_E_e, (-3*M_PI/2.0, 0.50, mode, &r), -4.40238662801828146637939, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_E_e, (-3*M_PI/2.0, 0.01, mode, &r), -4.71227116845115586201123, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_E_e, (-5*M_PI/3, 0.99, mode, &r), -3.24342131407742165030750, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_E_e, (-5*M_PI/3, 0.50, mode, &r), -4.86229328221323659255693, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_E_e, (-5*M_PI/3, 0.01, mode, &r), -5.23584602821259303893130, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_E_e, (-2*M_PI, 0.99, mode, &r), -4.11390323611521600393555, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_E_e, (-2*M_PI, 0.50, mode, &r), -5.86984883735770862183918, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_E_e, (-2*M_PI, 0.01, mode, &r), -6.28302822460154114934831, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_E_e, (-7*M_PI/3.0, 0.99, mode, &r), -4.98438515815301035756360, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_E_e, (-7*M_PI/3.0, 0.50, mode, &r), -6.87740439250218065112143, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_E_e, (-7*M_PI/3.0, 0.01, mode, &r), -7.33021042099048925976532, TEST_TOL0, GSL_SUCCESS);
+
+
+ /* F, argument phi > pi/2 */
+
+ TEST_SF(s, gsl_sf_ellint_F_e, (M_PI/2.0, 0.99, mode, &r), 3.35660052336119237603347, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_F_e, (M_PI/2.0, 0.50, mode, &r), 1.68575035481259604287120, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_F_e, (M_PI/2.0, 0.01, mode, &r), 1.57083559891215223602641, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_F_e, (2*M_PI/3.0, 0.99, mode, &r), 5.40666770744850807588478, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_F_e, (2*M_PI/3.0, 0.50, mode, &r), 2.28195003957330667648585, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_F_e, (2*M_PI/3.0, 0.01, mode, &r), 2.09445829144721257687207, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_F_e, (M_PI, 0.99, mode, &r), 6.71320104672238475206694, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_F_e, (M_PI, 0.50, mode, &r), 3.37150070962519208574241, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_F_e, (M_PI, 0.01, mode, &r), 3.14167119782430447205281, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_F_e, (4*M_PI/3, 0.99, mode, &r), 8.01973438599626142824910, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_F_e, (4*M_PI/3, 0.50, mode, &r), 4.46105137967707749499897, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_F_e, (4*M_PI/3, 0.01, mode, &r), 4.18888410420139636723356, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_F_e, (3*M_PI/2.0, 0.99, mode, &r), 10.0698015700835771281004, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_F_e, (3*M_PI/2.0, 0.50, mode, &r), 5.05725106443778812861361, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_F_e, (3*M_PI/2.0, 0.01, mode, &r), 4.71250679673645670807922, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_F_e, (5*M_PI/3, 0.99, mode, &r), 12.1198687541708928279517, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_F_e, (5*M_PI/3, 0.50, mode, &r), 5.65345074919849876222825, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_F_e, (5*M_PI/3, 0.01, mode, &r), 5.23612948927151704892488, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_F_e, (2*M_PI, 0.99, mode, &r), 13.4264020934447695041339, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_F_e, (2*M_PI, 0.50, mode, &r), 6.74300141925038417148481, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_F_e, (2*M_PI, 0.01, mode, &r), 6.28334239564860894410562, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_F_e, (7*M_PI/3.0, 0.99, mode, &r), 14.7329354327186461803160, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_F_e, (7*M_PI/3.0, 0.50, mode, &r), 7.83255208930226958074138, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_F_e, (7*M_PI/3.0, 0.01, mode, &r), 7.33055530202570083928637, TEST_TOL0, GSL_SUCCESS);
+
+ /* F, negative argument phi < 0 */
+
+ TEST_SF(s, gsl_sf_ellint_F_e, (-M_PI/2.0, 0.99, mode, &r), -3.35660052336119237603347, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_F_e, (-M_PI/2.0, 0.50, mode, &r), -1.68575035481259604287120, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_F_e, (-M_PI/2.0, 0.01, mode, &r), -1.57083559891215223602641, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_F_e, (-2*M_PI/3.0, 0.99, mode, &r), -5.40666770744850807588478, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_F_e, (-2*M_PI/3.0, 0.50, mode, &r), -2.28195003957330667648585, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_F_e, (-2*M_PI/3.0, 0.01, mode, &r), -2.09445829144721257687207, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_F_e, (-M_PI, 0.99, mode, &r), -6.71320104672238475206694, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_F_e, (-M_PI, 0.50, mode, &r), -3.37150070962519208574241, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_F_e, (-M_PI, 0.01, mode, &r), -3.14167119782430447205281, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_F_e, (-4*M_PI/3, 0.99, mode, &r), -8.01973438599626142824910, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_F_e, (-4*M_PI/3, 0.50, mode, &r), -4.46105137967707749499897, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_F_e, (-4*M_PI/3, 0.01, mode, &r), -4.18888410420139636723356, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_F_e, (-3*M_PI/2.0, 0.99, mode, &r), -10.0698015700835771281004, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_F_e, (-3*M_PI/2.0, 0.50, mode, &r), -5.05725106443778812861361, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_F_e, (-3*M_PI/2.0, 0.01, mode, &r), -4.71250679673645670807922, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_F_e, (-5*M_PI/3, 0.99, mode, &r), -12.1198687541708928279517, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_F_e, (-5*M_PI/3, 0.50, mode, &r), -5.65345074919849876222825, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_F_e, (-5*M_PI/3, 0.01, mode, &r), -5.23612948927151704892488, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_F_e, (-2*M_PI, 0.99, mode, &r), -13.4264020934447695041339, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_F_e, (-2*M_PI, 0.50, mode, &r), -6.74300141925038417148481, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_F_e, (-2*M_PI, 0.01, mode, &r), -6.28334239564860894410562, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_F_e, (-7*M_PI/3.0, 0.99, mode, &r), -14.7329354327186461803160, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_F_e, (-7*M_PI/3.0, 0.50, mode, &r), -7.83255208930226958074138, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_F_e, (-7*M_PI/3.0, 0.01, mode, &r), -7.33055530202570083928637, TEST_TOL0, GSL_SUCCESS);
+
+ /* P, argument phi > pi/2 */
+
+ TEST_SF(s, gsl_sf_ellint_P_e, (M_PI/2.0, 0.99, -0.1, mode, &r), 3.61678162163246646783050, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_P_e, (M_PI/2.0, 0.50, -0.1, mode, &r), 1.78030349465454812629168, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_P_e, (M_PI/2.0, 0.01, -0.1, mode, &r), 1.65580719756898353270922, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_P_e, (2*M_PI/3.0, 0.99, -0.1, mode, &r), 5.88008918207571119911983, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_P_e, (2*M_PI/3.0, 0.50, -0.1, mode, &r), 2.43655207300356008717867, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_P_e, (2*M_PI/3.0, 0.01, -0.1, mode, &r), 2.23211110528200554950903, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_P_e, (M_PI, 0.99, -0.1, mode, &r), 7.23356324326493293566099, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_P_e, (M_PI, 0.50, -0.1, mode, &r), 3.56060698930909625258336, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_P_e, (M_PI, 0.01, -0.1, mode, &r), 3.31161439513796706541844, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_P_e, (4*M_PI/3, 0.99, -0.1, mode, &r), 8.58703730445415467220216, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_P_e, (4*M_PI/3, 0.50, -0.1, mode, &r), 4.68466190561463241798805, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_P_e, (4*M_PI/3, 0.01, -0.1, mode, &r), 4.39111768499392858132786, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_P_e, (3*M_PI/2.0, 0.99, -0.1, mode, &r), 10.8503448648973994034915, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_P_e, (3*M_PI/2.0, 0.50, -0.1, mode, &r), 5.34091048396364437887504, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_P_e, (3*M_PI/2.0, 0.01, -0.1, mode, &r), 4.96742159270695059812767, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_P_e, (5*M_PI/3, 0.99, -0.1, mode, &r), 13.1136524253406441347808, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_P_e, (5*M_PI/3, 0.50, -0.1, mode, &r), 5.99715906231265633976204, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_P_e, (5*M_PI/3, 0.01, -0.1, mode, &r), 5.54372550041997261492747, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_P_e, (2*M_PI, 0.99, -0.1, mode, &r), 14.4671264865298658713220, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_P_e, (2*M_PI, 0.50, -0.1, mode, &r), 7.12121397861819250516672, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_P_e, (2*M_PI, 0.01, -0.1, mode, &r), 6.62322879027593413083689, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_P_e, (7*M_PI/3.0, 0.99, -0.1, mode, &r), 15.8206005477190876078631, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_P_e, (7*M_PI/3.0, 0.50, -0.1, mode, &r), 8.24526889492372867057141, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_P_e, (7*M_PI/3.0, 0.01, -0.1, mode, &r), 7.70273208013189564674630, TEST_TOL0, GSL_SUCCESS);
+
+ /* P, negative argument phi < 0 */
+
+ TEST_SF(s, gsl_sf_ellint_P_e, (-M_PI/2.0, 0.99, -0.1, mode, &r), -3.61678162163246646783050, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_P_e, (-M_PI/2.0, 0.50, -0.1, mode, &r), -1.78030349465454812629168, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_P_e, (-M_PI/2.0, 0.01, -0.1, mode, &r), -1.65580719756898353270922, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_P_e, (-2*M_PI/3.0, 0.99, -0.1, mode, &r), -5.88008918207571119911983, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_P_e, (-2*M_PI/3.0, 0.50, -0.1, mode, &r), -2.43655207300356008717867, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_P_e, (-2*M_PI/3.0, 0.01, -0.1, mode, &r), -2.23211110528200554950903, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_P_e, (-M_PI, 0.99, -0.1, mode, &r), -7.23356324326493293566099, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_P_e, (-M_PI, 0.50, -0.1, mode, &r), -3.56060698930909625258336, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_P_e, (-M_PI, 0.01, -0.1, mode, &r), -3.31161439513796706541844, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_P_e, (-4*M_PI/3, 0.99, -0.1, mode, &r), -8.58703730445415467220216, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_P_e, (-4*M_PI/3, 0.50, -0.1, mode, &r), -4.68466190561463241798805, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_P_e, (-4*M_PI/3, 0.01, -0.1, mode, &r), -4.39111768499392858132786, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_P_e, (-3*M_PI/2.0, 0.99, -0.1, mode, &r), -10.8503448648973994034915, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_P_e, (-3*M_PI/2.0, 0.50, -0.1, mode, &r), -5.34091048396364437887504, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_P_e, (-3*M_PI/2.0, 0.01, -0.1, mode, &r), -4.96742159270695059812767, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_P_e, (-5*M_PI/3, 0.99, -0.1, mode, &r), -13.1136524253406441347808, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_P_e, (-5*M_PI/3, 0.50, -0.1, mode, &r), -5.99715906231265633976204, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_P_e, (-5*M_PI/3, 0.01, -0.1, mode, &r), -5.54372550041997261492747, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_P_e, (-2*M_PI, 0.99, -0.1, mode, &r), -14.4671264865298658713220, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_P_e, (-2*M_PI, 0.50, -0.1, mode, &r), -7.12121397861819250516672, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_P_e, (-2*M_PI, 0.01, -0.1, mode, &r), -6.62322879027593413083689, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_P_e, (-7*M_PI/3.0, 0.99, -0.1, mode, &r), -15.8206005477190876078631, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_P_e, (-7*M_PI/3.0, 0.50, -0.1, mode, &r), -8.24526889492372867057141, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_P_e, (-7*M_PI/3.0, 0.01, -0.1, mode, &r), -7.70273208013189564674630, TEST_TOL0, GSL_SUCCESS);
+
+ /* D, argument phi > pi/2 */
+
+ TEST_SF(s, gsl_sf_ellint_D_e, (M_PI/2.0, 0.99, 0, mode, &r), 2.375395076351788975665323192, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_D_e, (M_PI/2.0, 0.50, 0, mode, &r), 0.8731525818926755496456335628, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_D_e, (M_PI/2.0, 0.01, 0, mode, &r), 0.7854276176694868932799393751, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_D_e, (2*M_PI/3.0, 0.99, 0, mode, &r), 4.305885125424644860264320635, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_D_e, (2*M_PI/3.0, 0.50, 0, mode, &r), 1.418324704155697579394036402, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_D_e, (2*M_PI/3.0, 0.01, 0, mode, &r), 1.263755353901126149206022061, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_D_e, (M_PI, 0.99, 0, mode, &r), 4.750790152703577951330646444, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_D_e, (M_PI, 0.50, 0, mode, &r), 1.746305163785351099291267125, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_D_e, (M_PI, 0.01, 0, mode, &r), 1.570855235338973786559878750, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_D_e, (4*M_PI/3, 0.99, 0, mode, &r), 5.195695179982511042396972113, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_D_e, (4*M_PI/3, 0.50, 0, mode, &r), 2.074285623415004619188497818, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_D_e, (4*M_PI/3, 0.01, 0, mode, &r), 1.877955116776821423913735408, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_D_e, (3*M_PI/2.0, 0.99, 0, mode, &r), 7.126185229055366926995969476, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_D_e, (3*M_PI/2.0, 0.50, 0, mode, &r), 2.619457745678026648936900687, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_D_e, (3*M_PI/2.0, 0.01, 0, mode, &r), 2.356282853008460679839818125, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_D_e, (5*M_PI/3, 0.99, 0, mode, &r), 9.056675278128222811594967044, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_D_e, (5*M_PI/3, 0.50, 0, mode, &r), 3.164629867941048678685303509, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_D_e, (5*M_PI/3, 0.01, 0, mode, &r), 2.834610589240099935765900794, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_D_e, (2*M_PI, 0.99, 0, mode, &r), 9.501580305407155902661292832, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_D_e, (2*M_PI, 0.50, 0, mode, &r), 3.492610327570702198582534249, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_D_e, (2*M_PI, 0.01, 0, mode, &r), 3.141710470677947573119757500, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_D_e, (7*M_PI/3.0, 0.99, 0, mode, &r), 9.946485332686088993727618315, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_D_e, (7*M_PI/3.0, 0.50, 0, mode, &r), 3.820590787200355718479764901, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_D_e, (7*M_PI/3.0, 0.01, 0, mode, &r), 3.448810352115795210473614120, TEST_TOL0, GSL_SUCCESS);
+
+ /* P, negative argument phi < 0 */
+
+ TEST_SF(s, gsl_sf_ellint_D_e, (-M_PI/2.0, 0.99, 0, mode, &r), -2.375395076351788975665323192, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_D_e, (-M_PI/2.0, 0.50, 0, mode, &r), -0.8731525818926755496456335628, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_D_e, (-M_PI/2.0, 0.01, 0, mode, &r), -0.7854276176694868932799393751, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_D_e, (-2*M_PI/3.0, 0.99, 0, mode, &r), -4.305885125424644860264320635, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_D_e, (-2*M_PI/3.0, 0.50, 0, mode, &r), -1.418324704155697579394036402, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_D_e, (-2*M_PI/3.0, 0.01, 0, mode, &r), -1.263755353901126149206022061, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_D_e, (-M_PI, 0.99, 0, mode, &r), -4.750790152703577951330646444, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_D_e, (-M_PI, 0.50, 0, mode, &r), -1.746305163785351099291267125, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_D_e, (-M_PI, 0.01, 0, mode, &r), -1.570855235338973786559878750, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_D_e, (-4*M_PI/3, 0.99, 0, mode, &r), -5.195695179982511042396972113, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_D_e, (-4*M_PI/3, 0.50, 0, mode, &r), -2.074285623415004619188497818, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_D_e, (-4*M_PI/3, 0.01, 0, mode, &r), -1.877955116776821423913735408, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_D_e, (-3*M_PI/2.0, 0.99, 0, mode, &r), -7.126185229055366926995969476, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_D_e, (-3*M_PI/2.0, 0.50, 0, mode, &r), -2.619457745678026648936900687, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_D_e, (-3*M_PI/2.0, 0.01, 0, mode, &r), -2.356282853008460679839818125, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_D_e, (-5*M_PI/3, 0.99, 0, mode, &r), -9.056675278128222811594967044, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_D_e, (-5*M_PI/3, 0.50, 0, mode, &r), -3.164629867941048678685303509, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_D_e, (-5*M_PI/3, 0.01, 0, mode, &r), -2.834610589240099935765900794, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_D_e, (-2*M_PI, 0.99, 0, mode, &r), -9.501580305407155902661292832, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_D_e, (-2*M_PI, 0.50, 0, mode, &r), -3.492610327570702198582534249, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_D_e, (-2*M_PI, 0.01, 0, mode, &r), -3.141710470677947573119757500, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_ellint_D_e, (-7*M_PI/3.0, 0.99, 0, mode, &r), -9.946485332686088993727618315, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_D_e, (-7*M_PI/3.0, 0.50, 0, mode, &r), -3.820590787200355718479764901, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_ellint_D_e, (-7*M_PI/3.0, 0.01, 0, mode, &r), -3.448810352115795210473614120, TEST_TOL0, GSL_SUCCESS);
+
+ return s;
+}
+
+
+int test_erf(void)
+{
+ gsl_sf_result r;
+ int s = 0;
+
+ TEST_SF(s, gsl_sf_erfc_e, (-10.0, &r), 2.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_erfc_e, (-5.0000002, &r), 1.9999999999984625433, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_erfc_e, (-5.0, &r), 1.9999999999984625402, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_erfc_e, (-1.0, &r), 1.8427007929497148693, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_erfc_e, (-0.5, &r), 1.5204998778130465377, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_erfc_e, (1.0, &r), 0.15729920705028513066, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_erfc_e, (3.0, &r), 0.000022090496998585441373, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_erfc_e, (7.0, &r), 4.183825607779414399e-23, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_erfc_e, (10.0, &r), 2.0884875837625447570e-45, TEST_TOL2, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_log_erfc_e, (-1.0, &r), log(1.842700792949714869), TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_log_erfc_e, (-0.1, &r), 0.106576400586522485015, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_log_erfc_e, (-1e-10, &r), 1.1283791670318505967e-10, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_log_erfc_e, (0.0, &r), log(1.0), TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_log_erfc_e, (1e-10, &r), -1.128379167159174551e-10, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_log_erfc_e, (0.001, &r), -0.0011290158896213548027, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_log_erfc_e, (0.1, &r), -0.119304973737395598329, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_log_erfc_e, (1.0, &r), log(0.15729920705028513066), TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_log_erfc_e, (10.0, &r), log(2.0884875837625447570e-45), TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_erf_e, (-10.0, &r), -1.0000000000000000000, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_erf_e, (0.5, &r), 0.5204998778130465377, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_erf_e, (1.0, &r), 0.8427007929497148693, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_erf_e, (10.0, &r), 1.0000000000000000000, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_erf_Z_e, (1.0, &r), 0.24197072451914334980, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_erf_Q_e, (10.0, &r), 7.619853024160526066e-24, TEST_TOL2, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_hazard_e, (-20.0, &r), 5.5209483621597631896e-88, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hazard_e, (-10.0, &r), 7.6945986267064193463e-23, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hazard_e, (-1.0, &r), 0.28759997093917836123, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hazard_e, ( 0.0, &r), 0.79788456080286535588, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hazard_e, ( 1.0, &r), 1.5251352761609812091, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hazard_e, (10.0, &r), 10.098093233962511963, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hazard_e, (20.0, &r), 20.049753068527850542, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hazard_e, (30.0, &r), 30.033259667433677037, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hazard_e, (50.0, &r), 50.019984031905639809, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hazard_e, (80.0, &r), 80.012496096798234468, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hazard_e, (150.0, &r), 150.00666607420571802, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hazard_e, (300.0, &r), 300.00333325926337415, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hazard_e, (900.0, &r), 900.00111110836764382, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hazard_e, (1001.0, &r), 1001.0009989990049990, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hazard_e, (2000.0, &r), 2000.0004999997500003, TEST_TOL0, GSL_SUCCESS);
+
+ return s;
+}
+
+
+int test_exp(void)
+{
+ gsl_sf_result r;
+ gsl_sf_result_e10 re;
+ double x;
+ int sa;
+ int s = 0;
+
+ TEST_SF(s, gsl_sf_exp_e, (-10.0, &r), exp(-10.0), TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exp_e, ( 10.0, &r), exp( 10.0), TEST_TOL0, GSL_SUCCESS);
+
+ sa = 0;
+ sa += gsl_sf_exp_e10_e(1.0, &re);
+ sa += ( test_sf_frac_diff(re.val, M_E ) > TEST_TOL0 );
+ sa += ( re.err > TEST_TOL1 );
+ sa += ( re.e10 != 0 );
+ gsl_test(sa, " gsl_sf_exp_e10_e(1.0, &re)");
+
+ sa = 0;
+ sa += gsl_sf_exp_e10_e(2000.0, &re);
+ sa += ( test_sf_frac_diff(re.val, 3.88118019428363725 ) > TEST_TOL3 );
+ sa += ( re.err > TEST_TOL5 );
+ sa += ( re.e10 != 868 );
+ gsl_test(sa, " gsl_sf_exp_e10_e(2000.0, &re)");
+
+
+ TEST_SF(s, gsl_sf_exp_err_e, (-10.0, TEST_TOL1, &r), exp(-10.0), TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exp_err_e, ( 10.0, TEST_TOL1, &r), exp( 10.0), TEST_TOL1, GSL_SUCCESS);
+
+ sa = 0;
+ sa += gsl_sf_exp_err_e10_e(1.0, TEST_SQRT_TOL0, &re);
+ sa += ( test_sf_frac_diff(re.val, M_E ) > TEST_TOL1 );
+ sa += ( re.err > 32.0 * TEST_SQRT_TOL0 );
+ sa += ( re.e10 != 0 );
+ gsl_test(sa, " gsl_sf_exp_err_e10_e(1.0, TEST_SQRT_TOL0, &re)");
+
+ sa = 0;
+ sa += gsl_sf_exp_err_e10_e(2000.0, 1.0e-10, &re);
+ sa += ( test_sf_frac_diff(re.val, 3.88118019428363725 ) > TEST_TOL3 );
+ sa += ( re.err > 1.0e-07 );
+ sa += ( re.e10 != 868 );
+ gsl_test(sa, " gsl_sf_exp_err_e10_e(2000.0, 1.0e-10, &re)");
+
+
+ x = 0.8*GSL_LOG_DBL_MAX;
+ TEST_SF(s, gsl_sf_exp_mult_e, (-10.0, 1.0e-06, &r), 1.0e-06*exp(-10.0), TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exp_mult_e, (-10.0, 2.0, &r), 2.0*exp(-10.0), TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exp_mult_e, (-10.0, -2.0, &r), -2.0*exp(-10.0), TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exp_mult_e, ( 10.0, 1.0e-06, &r), 1.0e-06*exp( 10.0), TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exp_mult_e, ( 10.0, -2.0, &r), -2.0*exp( 10.0), TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exp_mult_e, (x, 1.00001, &r), 1.00001*exp(x), TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exp_mult_e, (x, 1.000001, &r), 1.000001*exp(x), TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exp_mult_e, (x, 1.000000001, &r), 1.000000001*exp(x), TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exp_mult_e, (x, 100.0, &r), 100.0*exp(x), TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exp_mult_e, (x, 1.0e+20, &r), 1.0e+20*exp(x), TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exp_mult_e, (x, exp(-x)*exp(M_LN2), &r), 2.0, TEST_TOL4, GSL_SUCCESS );
+
+ TEST_SF(s, gsl_sf_exp_mult_err_e, (-10.0, TEST_SQRT_TOL0, 2.0, TEST_SQRT_TOL0, &r), 2.0*exp(-10.0), TEST_SQRT_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exp_mult_err_e, (x, TEST_SQRT_TOL0*x, exp(-x)*exp(M_LN2), TEST_SQRT_TOL0*x, &r), 2.0, TEST_SQRT_TOL0, GSL_SUCCESS );
+
+ sa = 0;
+ sa += gsl_sf_exp_mult_e10_e(1.0, 1.0, &re);
+ sa += ( test_sf_frac_diff(re.val, M_E ) > TEST_TOL0 );
+ sa += ( re.err > TEST_TOL2 );
+ sa += ( re.e10 != 0 );
+ gsl_test(sa, "gsl_sf_exp_mult_e10_e(1.0, 1.0, &re)");
+
+ sa = 0;
+ sa += gsl_sf_exp_mult_e10_e(1000.0, 1.0e+200, &re);
+ sa += ( test_sf_frac_diff(re.val, 1.9700711140165661 ) > TEST_TOL3 );
+ sa += ( re.err > 1.0e-12 );
+ sa += ( re.e10 != 634 );
+ gsl_test(sa, "gsl_sf_exp_mult_e10_e(1000.0, 1.0e+200, &re)");
+
+ sa = 0;
+ sa += gsl_sf_exp_mult_err_e10_e(1.0, TEST_TOL0, 1.0, TEST_TOL0, &re);
+ sa += ( test_sf_frac_diff(re.val, M_E ) > TEST_TOL0 );
+ sa += ( re.err > TEST_TOL2 );
+ sa += ( re.e10 != 0 );
+ gsl_test(sa, "gsl_sf_exp_mult_e10_e(1.0, TEST_TOL0, 1.0, TEST_TOL0, &re)");
+
+ sa = 0;
+ sa += gsl_sf_exp_mult_err_e10_e(1000.0, 1.0e-12, 1.0e+200, 1.0e+190, &re);
+ sa += ( test_sf_frac_diff(re.val, 1.9700711140165661 ) > TEST_TOL3 );
+ sa += ( re.err > 1.0e-09 );
+ sa += ( re.e10 != 634 );
+ gsl_test(sa, "gsl_sf_exp_mult_err_e10_e(1.0e-12, 1.0e+200, &re)");
+
+ TEST_SF(s, gsl_sf_expm1_e, (-10.0, &r), exp(-10.0)-1.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expm1_e, (-0.001, &r), -0.00099950016662500845, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expm1_e, (-1.0e-8, &r), -1.0e-08 + 0.5e-16, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expm1_e, ( 1.0e-8, &r), 1.0e-08 + 0.5e-16, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expm1_e, ( 0.001, &r), 0.0010005001667083417, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expm1_e, ( 10.0, &r), exp(10.0)-1.0, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_exprel_e, (-10.0, &r), 0.0999954600070237515, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_e, (-0.001, &r), 0.9995001666250084, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_e, (-1.0e-8, &r), 1.0 - 0.5e-08, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_e, ( 1.0e-8, &r), 1.0 + 0.5e-08, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_e, ( 0.001, &r), 1.0005001667083417, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_e, ( 10.0, &r), 2202.5465794806716517, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_exprel_2_e, (-10.0, &r), 0.18000090799859524970, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_2_e, (-0.001, &r), 0.9996667499833361107, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_2_e, (-1.0e-8, &r), 0.9999999966666666750, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_2_e, ( 1.0e-8, &r), 1.0000000033333333417, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_2_e, ( 0.001, &r), 1.0003334166833361115, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_2_e, ( 10.0, &r), 440.3093158961343303, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_exprel_n_e, (3, -1000.0, &r), 0.00299400600000000000, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_n_e, (3, -100.0, &r), 0.02940600000000000000, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_n_e, (3, -10.0, &r), 0.24599972760042142509, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_n_e, (3, -3.0, &r), 0.5444917625849191238, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_n_e, (3, -0.001, &r), 0.9997500499916678570, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_n_e, (3, -1.0e-8, &r), 0.9999999975000000050, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_n_e, (3, 1.0e-8, &r), 1.0000000025000000050, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_n_e, (3, 0.001, &r), 1.0002500500083345240, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_n_e, (3, 3.0, &r), 2.5745637607083706091, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_n_e, (3, 3.1, &r), 2.6772417068460206247, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_n_e, (3, 10.0, &r), 131.79279476884029910, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_n_e, (3, 100.0, &r), 1.6128702850896812690e+38, TEST_TOL2, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_exprel_n_e, (50, -1000.0, &r), 0.04766231609253975959, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_n_e, (50, -100.0, &r), 0.3348247572345889317, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_n_e, (50, -10.0, &r), 0.8356287051853286482, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_n_e, (50, -3.0, &r), 0.9443881609152163615, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_n_e, (50, -1.0, &r), 0.980762245565660617, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_n_e, (50, -1.0e-8, &r), 1.0 -1.0e-8/51.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_n_e, (50, 1.0e-8, &r), 1.0 +1.0e-8/51.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_n_e, (50, 1.0, &r), 1.01999216583666790, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_n_e, (50, 3.0, &r), 1.0624205757460368307, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_n_e, (50, 48.0, &r), 7.499573876877194416, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_n_e, (50, 50.1, &r), 9.311803306230992272, TEST_TOL4, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_n_e, (50, 100.0, &r), 8.175664432485807634e+07, TEST_TOL4, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_n_e, (50, 500.0, &r), 4.806352370663185330e+146, TEST_TOL3, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_exprel_n_e, (500, -1000.0, &r), 0.3334815803127619256, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_n_e, (500, -100.0, &r), 0.8335646217536183909, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_n_e, (500, -10.0, &r), 0.9804297803131823066, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_n_e, (500, -3.0, &r), 0.9940475488850672997, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_n_e, (500, -1.0, &r), 0.9980079602383488808, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_n_e, (500, -1.0e-8, &r), 1.0 -1.0e-8/501.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_n_e, (500, 1.0e-8, &r), 1.0 +1.0e-8/501.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_n_e, (500, 1.0, &r), 1.0019999920160634252, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_n_e, (500, 3.0, &r), 1.0060240236632444934, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_n_e, (500, 48.0, &r), 1.1059355517981272174, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_n_e, (500, 100.0, &r), 1.2492221464878287204, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_n_e, (500, 500.0, &r), 28.363019877927630858, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_n_e, (500, 1000.0, &r), 2.4037563160335300322e+68, TEST_TOL4, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_exprel_n_e, (500, 1600.0, &r), 7.899293535320607403e+226, TEST_TOL4, GSL_SUCCESS);
+
+ return s;
+}
+
+
+int test_expint(void)
+{
+ gsl_sf_result r;
+ int s = 0;
+
+ TEST_SF(s, gsl_sf_expint_E1_e, (-1.0, &r), -1.8951178163559367555, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_E1_e, (1.0e-10, &r), 22.448635265138923980, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_E1_e, (1.0e-05, &r), 10.935719800043695615, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_E1_e, (0.1, &r), 1.82292395841939066610, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_E1_e, (1.0, &r), 0.21938393439552027368, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_E1_e, (10.0, &r), 4.156968929685324277e-06, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_E1_e, (50.0, &r), 3.783264029550459019e-24, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_E1_e, (300.0, &r), 1.710384276804510115e-133, TEST_TOL2, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_expint_E2_e, (-1.0, &r), 0.8231640121031084799, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_E2_e, (0.0, &r), 1.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_E2_e, (1.0/4294967296.0, &r), 0.9999999947372139168, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_E2_e, (1.0/65536.0, &r), 0.9998243233207178845, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_E2_e, (0.1, &r), 0.7225450221940205066, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_E2_e, (1.0, &r), 0.14849550677592204792, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_E2_e, (10.0, &r), 3.830240465631608762e-06, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_E2_e, (50.0, &r), 3.711783318868827367e-24, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_E2_e, (300.0, &r), 1.7047391998483433998e-133, TEST_TOL2, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_expint_Ei_e, (-1.0, &r), -0.21938393439552027368, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_Ei_e, (1.0/4294967296.0, &r), -21.603494112783886397, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_Ei_e, (1.0, &r), 1.8951178163559367555, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_expint_E1_scaled_e, (-10000.0, &r), -0.00010001000200060024012, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_E1_scaled_e, (-1000.0, &r), -0.0010010020060241207251, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_E1_scaled_e, (-10.0, &r), -0.11314702047341077803, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_E1_scaled_e, (-1.0, &r), -0.69717488323506606877, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_E1_scaled_e, (1.0e-10, &r), 22.448635267383787506, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_E1_scaled_e, (1.0e-05, &r), 10.935829157788483865, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_E1_scaled_e, (0.1, &r), 2.0146425447084516791, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_E1_scaled_e, (1.0, &r), 0.59634736232319407434, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_E1_scaled_e, (10.0, &r), 0.091563333939788081876, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_E1_scaled_e, (50.0, &r), 0.019615109930114870365, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_E1_scaled_e, (300.0, &r), 0.0033222955652707070644, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_E1_scaled_e, (1000.0, &r), 0.00099900199402388071500, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_E1_scaled_e, (10000.0, &r), 0.000099990001999400239880, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_expint_E2_scaled_e, (-10000.0, &r), -0.00010002000600240120072, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_E2_scaled_e, (-1000.0, &r), -0.0010020060241207250807, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_E2_scaled_e, (-10.0, &r), -0.13147020473410778034, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_E2_scaled_e, (-1.0, &r), 0.30282511676493393123, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_E2_scaled_e, (0.0, &r), 1.0, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_E2_scaled_e, (1.0/4294967296.0, &r), 0.99999999497004455927, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_E2_scaled_e, (1.0/65536.0, &r), 0.99983957954556245453, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_E2_scaled_e, (0.1, &r), 0.79853574552915483209, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_E2_scaled_e, (1.0, &r), 0.40365263767680592566, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_E2_scaled_e, (10.0, &r), 0.084366660602119181239, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_E2_scaled_e, (50.0, &r), 0.019244503494256481735, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_E2_scaled_e, (300.0, &r), 0.0033113304187878806691, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_E2_scaled_e, (1000.0, &r), 0.00099800597611928500004, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_E2_scaled_e, (10000.0, &r), 0.000099980005997601199281, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_expint_Ei_scaled_e, (-1000.0, &r), -0.00099900199402388071500, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_Ei_scaled_e, (-1.0, &r), -0.59634736232319407434, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_Ei_scaled_e, (1.0/4294967296.0, &r), -21.603494107753930958, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_Ei_scaled_e, (1.0, &r), 0.69717488323506606877, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_Ei_scaled_e, (1000.0, &r), 0.0010010020060241207251, TEST_TOL0, GSL_SUCCESS);
+
+
+ TEST_SF(s, gsl_sf_Shi_e, (-1.0, &r), -1.0572508753757285146, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_Shi_e, (1.0/4294967296.0, &r), 2.3283064365386962891e-10, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_Shi_e, (1.0/65536.0, &r), 0.00001525878906269737298, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_Shi_e, (0.1, &r), 0.1000555722250569955, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_Shi_e, (1.0, &r), 1.0572508753757285146, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_Shi_e, (10.0, &r), 1246.1144901994233444, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_Shi_e, (50.0, &r), 5.292818448565845482e+19, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_Shi_e, (300.0, &r), 3.248241254044332895e+127, TEST_TOL2, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_Chi_e, (-1.0, &r), 0.8378669409802082409, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_Chi_e, (1.0/4294967296.0, &r), -21.603494113016717041, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_Chi_e, (1.0/65536.0, &r), -10.513139223999384429, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_Chi_e, (1.0/8.0, &r), -1.4983170827635760646, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_Chi_e, (1.0, &r), 0.8378669409802082409, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_Chi_e, (10.0, &r), 1246.1144860424544147, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_Chi_e, (50.0, &r), 5.292818448565845482e+19, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_Chi_e, (300.0, &r), 3.248241254044332895e+127, TEST_TOL2, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_expint_3_e, (1.0e-10, &r), 1.0e-10, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_3_e, (1.0e-05, &r), 9.9999999999999975e-06, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_3_e, (0.1, &r), 0.09997500714119079665122, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_3_e, (0.5, &r), 0.48491714311363971332427, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_3_e, (1.0, &r), 0.80751118213967145285833, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_3_e, (2.0, &r), 0.89295351429387631138208, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_3_e, (5.0, &r), 0.89297951156924921121856, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_3_e, (10.0, &r), 0.89297951156924921121856, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_expint_3_e, (100.0, &r), 0.89297951156924921121856, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_Si_e, (-1.0, &r), -0.9460830703671830149, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_Si_e, (1.0e-10, &r), 1.0e-10, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_Si_e, (1.0e-05, &r), 9.999999999944444444e-06, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_Si_e, (0.1, &r), 0.09994446110827695016, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_Si_e, (1.0, &r), 0.9460830703671830149, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_Si_e, (10.0, &r), 1.6583475942188740493, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_Si_e, (50.0, &r), 1.5516170724859358947, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_Si_e, (300.0, &r), 1.5708810882137495193, TEST_TOL0, GSL_SUCCESS);
+ /*
+ TEST_SF(s, gsl_sf_Si_e, (1.0e+20, &r), 1.5707963267948966192, TEST_TOL0, GSL_SUCCESS);
+ */
+
+ TEST_SF(s, gsl_sf_Ci_e, (1.0/4294967296.0, &r), -21.603494113016717041, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_Ci_e, (1.0/65536.0, &r), -10.513139224115799751, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_Ci_e, (1.0/8.0, &r), -1.5061295845296396649, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_Ci_e, (1.0, &r), 0.3374039229009681347, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_Ci_e, (10.0, &r), -0.04545643300445537263, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_Ci_e, (50.0, &r), -0.005628386324116305440, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_Ci_e, (300.0, &r), -0.003332199918592111780, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_Ci_e, (65536.0, &r), 0.000010560248837656279453, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_Ci_e, (4294967296.0, &r), -1.0756463261957757485e-10, TEST_SQRT_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_Ci_e, (1099511627776.0, &r), -3.689865584710764214e-13, 1024.0*TEST_SQRT_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_atanint_e, (1.0e-10, &r), 1.0e-10, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_atanint_e, (1.0e-05, &r), 9.99999999988888888889e-06, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_atanint_e, (0.1, &r), 0.09988928686033618404, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_atanint_e, (1.0, &r), 0.91596559417721901505, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_atanint_e, (2.0, &r), 1.57601540344632342236, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_atanint_e, (10.0, &r), 3.71678149306806859029, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_atanint_e, (50.0, &r), 6.16499047850274874222, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_atanint_e, (300.0, &r), 8.96281388924518959990, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_atanint_e, (1.0e+5, &r), 18.084471031038661920, TEST_TOL0, GSL_SUCCESS);
+
+ return s;
+}
+
+
+int test_fermidirac(void)
+{
+ gsl_sf_result r;
+ int s = 0;
+
+ TEST_SF(s, gsl_sf_fermi_dirac_m1_e, (-10.0, &r), 0.00004539786870243439450, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_m1_e, ( -1.0, &r), 0.26894142136999512075, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_m1_e, ( 1.0, &r), 0.7310585786300048793, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_m1_e, ( 10.0, &r), 0.9999546021312975656, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_fermi_dirac_0_e, (-10.0, &r), 0.00004539889921686464677, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_0_e, ( -1.0, &r), 0.31326168751822283405, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_0_e, ( 1.0, &r), 1.3132616875182228340, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_0_e, ( 10.0, &r), 10.000045398899216865, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_fermi_dirac_1_e, (-10.0, &r), 0.00004539941448447633524, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_1_e, ( -2.0, &r), 0.13101248471442377127, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_1_e, ( -1.0, &r), 0.3386479964034521798, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_1_e, ( -0.4, &r), 0.5825520806897909028, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_1_e, ( 0.4, &r), 1.1423819861584355337, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_1_e, ( 1.0, &r), 1.8062860704447742567, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_1_e, ( 1.5, &r), 2.5581520872227806402, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_1_e, ( 2.5, &r), 4.689474797599761667, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_1_e, ( 10.0, &r), 51.64488866743374196, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_1_e, ( 12.0, &r), 73.64492792264531092, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_1_e, ( 20.0, &r), 201.64493406478707282, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_1_e, ( 50.0, &r), 1251.6449340668482264, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_fermi_dirac_2_e, (-10.0, &r), 0.00004539967212174776662, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_2_e, ( -2.0, &r), 0.13313272938565030508, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_2_e, ( -1.0, &r), 0.3525648792978077590, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_2_e, ( -0.4, &r), 0.6229402647001272120, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_2_e, ( 0.4, &r), 1.2915805581060844533, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_2_e, ( 1.0, &r), 2.1641656128127008622, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_2_e, ( 1.5, &r), 3.247184513920792475, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_2_e, ( 2.5, &r), 6.797764392735056317, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_2_e, ( 10.0, &r), 183.11605273482105278, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_2_e, ( 12.0, &r), 307.73921494638635166, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_2_e, ( 20.0, &r), 1366.2320146723590157, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_2_e, ( 50.0, &r), 20915.580036675744655, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_2_e, (200.0, &r), 1.3336623201467029786e+06, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_fermi_dirac_mhalf_e, (-10.0, &r), 0.00004539847236080549532, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_mhalf_e, ( -2.0, &r), 0.12366562180120994266, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_mhalf_e, ( -1.0, &r), 0.29402761761145122022, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_mhalf_e, ( -0.4, &r), 0.4631755336886027800, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_mhalf_e, ( 0.4, &r), 0.7654084737661656915, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_mhalf_e, ( 1.0, &r), 1.0270571254743506890, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_mhalf_e, ( 1.5, &r), 1.2493233478527122008, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_mhalf_e, ( 2.5, &r), 1.6663128834358313625, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_mhalf_e, ( 10.0, &r), 3.552779239536617160, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_mhalf_e, ( 12.0, &r), 3.897268231925439359, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_mhalf_e, ( 20.0, &r), 5.041018507535328603, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_mhalf_e, ( 50.0, &r), 7.977530858581869960, TEST_TOL1, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_fermi_dirac_half_e, (-10.0, &r), 0.00004539920105264132755, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_half_e, ( -2.0, &r), 0.12929851332007559106, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_half_e, ( -1.0, &r), 0.3277951592607115477, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_half_e, ( -0.4, &r), 0.5522452153690688947, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_half_e, ( 0.4, &r), 1.0386797503389389277, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_half_e, ( 1.0, &r), 1.5756407761513002308, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_half_e, ( 1.5, &r), 2.1448608775831140360, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_half_e, ( 2.5, &r), 3.606975377950373251, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_half_e, ( 10.0, &r), 24.084656964637653615, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_half_e, ( 12.0, &r), 31.540203287044242593, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_half_e, ( 20.0, &r), 67.49151222165892049, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_half_e, ( 50.0, &r), 266.09281252136259343, TEST_TOL1, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_fermi_dirac_3half_e, (-10.0, &r), 0.00004539956540456176333, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_3half_e, ( -2.0, &r), 0.13224678225177236685, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_3half_e, ( -1.0, &r), 0.3466747947990574170, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_3half_e, ( -0.4, &r), 0.6056120213305040910, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_3half_e, ( 0.4, &r), 1.2258236403963668282, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_3half_e, ( 1.0, &r), 2.0022581487784644573, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_3half_e, ( 1.5, &r), 2.9277494127932173068, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_3half_e, ( 2.5, &r), 5.768879312210516582, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_3half_e, ( 10.0, &r), 101.00510084332600020, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_3half_e, ( 12.0, &r), 156.51518642795728036, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_3half_e, ( 20.0, &r), 546.5630100657601959, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_3half_e, ( 50.0, &r), 5332.353566687145552, TEST_TOL1, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (3, -2.0, &r), 0.1342199155038680215, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (3, 0.0, &r), 0.9470328294972459176, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (3, 0.1, &r), 1.0414170610956165759, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (3, 1.0, &r), 2.3982260822489407070, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (3, 3.0, &r), 12.621635313399690724, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (3, 100.0, &r), 4.174893231066566793e+06, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (3, 500.0, &r), 2.604372285319088354e+09, TEST_TOL1, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (5, -2.0, &r), 0.13505242246823676478, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (5, 0.0, &r), 0.9855510912974351041, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (5, 0.1, &r), 1.0876519750101492782, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (5, 1.0, &r), 2.6222337848692390539, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (5, 3.0, &r), 17.008801618012113022, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (5, 100.0, &r), 1.3957522531334869874e+09, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (5, 500.0, &r), 2.1705672808114817955e+13, TEST_TOL2, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (7, -2.0, &r), 0.1352641105671255851, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (7, 0.0, &r), 0.9962330018526478992, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (7, 0.1, &r), 1.1005861815180315485, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (7, 1.0, &r), 2.6918878172003129203, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (7, 3.0, &r), 19.033338976999367642, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (7, 10.0, &r), 5654.530932873610014, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (7, 50.0, &r), 1.005005069985066278e+09, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (7, 500.0, &r), 9.691690268341569514e+16, TEST_TOL3, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (9, -2.0, &r), 0.1353174385330242691, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (9, 0.0, &r), 0.9990395075982715656, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (9, 0.1, &r), 1.1039997234712941212, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (9, 1.0, &r), 2.7113648898129249947, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (9, 3.0, &r), 19.768544008138602223, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (9, 10.0, &r), 10388.990167312912478, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (9, 50.0, &r), 2.85466960802601649e+10, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (9, 500.0, &r), 2.69273849842695876e+20, 2*TEST_TOL1, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (10, -2.0, &r), 0.13532635396712288092, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (10, 0.0, &r), 0.9995171434980607541, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (10, 0.1, &r), 1.1045818238852612296, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (10, 1.0, &r), 2.7147765350346120647, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (10, 3.0, &r), 19.917151938411675171, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (10, 10.0, &r), 12790.918595516495955, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (10, 50.0, &r), 1.3147703201869657654e+11, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (10, 500.0, &r), 1.2241331244469204398e+22, TEST_TOL2, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (11, -2.0, &r), 0.1353308162894847149, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (11, 0.0, &r), 0.9997576851438581909, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (11, 0.1, &r), 1.1048751811565850418, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (11, 1.0, &r), 2.7165128749007313436, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (11, 3.0, &r), 19.997483022044603065, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (11, 10.0, &r), 14987.996005901818036, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (11, 50.0, &r), 5.558322924078990628e+11, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (11, 500.0, &r), 5.101293089606198280e+23, TEST_TOL2, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (20, -2.0, &r), 0.13533527450327238373, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (20, 0.0, &r), 0.9999995232582155428, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (20, 0.1, &r), 1.1051703357941368203, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (20, 1.0, &r), 2.7182783069905721654, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (20, 3.0, &r), 20.085345296028242734, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (20, 10.0, &r), 21898.072920149606475, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (20, 50.0, &r), 1.236873256595717618e+16, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_fermi_dirac_int_e, (20, 500.0, &r), 9.358938204369557277e+36, TEST_TOL2, GSL_SUCCESS);
+
+
+ return s;
+}
+
+
+int test_gegen(void)
+{
+ gsl_sf_result r;
+ double ga[100];
+ int s = 0;
+ int sa;
+
+ TEST_SF(s, gsl_sf_gegenpoly_1_e, (-0.2, 1.0, &r), -0.4, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gegenpoly_1_e, ( 0.0, 1.0, &r), 2.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gegenpoly_1_e, ( 1.0, 1.0, &r), 2.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gegenpoly_1_e, ( 1.0, 0.5, &r), 1.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gegenpoly_1_e, ( 5.0, 1.0, &r), 10.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gegenpoly_1_e, ( 100.0, 0.5, &r), 100.0, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_gegenpoly_2_e, (-0.2, 0.5, &r), 0.12, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gegenpoly_2_e, ( 0.0, 1.0, &r), 1.00, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gegenpoly_2_e, ( 1.0, 1.0, &r), 3.00, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gegenpoly_2_e, ( 1.0, 0.1, &r), -0.96, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gegenpoly_2_e, ( 5.0, 1.0, &r), 55.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gegenpoly_2_e, ( 100.0, 0.5, &r), 4950.0, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_gegenpoly_3_e, (-0.2, 0.5, &r), 0.112, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gegenpoly_3_e, ( 0.0, 1.0, &r), -2.0/3.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gegenpoly_3_e, ( 1.0, 1.0, &r), 4.000, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gegenpoly_3_e, ( 1.0, 0.1, &r), -0.392, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gegenpoly_3_e, ( 5.0, 1.0, &r), 220.000, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gegenpoly_3_e, ( 100.0, 0.5, &r), 161600.000, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_gegenpoly_n_e, (1, 1.0, 1.0, &r), 2.000 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gegenpoly_n_e, (10, 1.0, 1.0, &r), 11.000 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gegenpoly_n_e, (10, 1.0, 0.1, &r), -0.4542309376 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gegenpoly_n_e, (10, 5.0, 1.0, &r), 9.23780e+4 , TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gegenpoly_n_e, (10, 100.0, 0.5, &r), 1.5729338392690000e+13, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gegenpoly_n_e, (1000, 100.0, 1.0, &r), 3.3353666135627322e+232, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gegenpoly_n_e, (100, 2000.0, 1.0, &r), 5.8753432034937579e+202, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gegenpoly_n_e, (103, 207.0, 2.0, &r), 1.4210272202235983e+145, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_gegenpoly_n_e, (103, -0.4, 0.3, &r), -1.64527498094522e-04, TEST_TOL1, GSL_SUCCESS);
+
+ sa = 0;
+ gsl_sf_gegenpoly_array(99, 5.0, 1.0, ga);
+ sa += ( test_sf_frac_diff( ga[1], 10.0 ) > TEST_TOL0 );
+ sa += ( test_sf_frac_diff( ga[10], 9.23780e+4 ) > TEST_TOL0 );
+ gsl_test(sa, " gsl_sf_gegenpoly_array");
+ s += sa;
+
+ return s;
+}
+
+
+int test_jac(void)
+{
+ double u, m;
+ double sn, cn, dn;
+ int stat_ej;
+ int s = 0;
+ int sa;
+
+ u = 0.5;
+ m = 0.5;
+ sa = 0;
+ stat_ej = gsl_sf_elljac_e(u, m, &sn, &cn, &dn);
+ sa += test_sf_val(sn, 0.4707504736556572833, TEST_TOL0, "gsl_sf_elljac_e(0.5|0.5) sn");
+ sa += test_sf_val(cn, 0.8822663948904402865, TEST_TOL0, "gsl_sf_elljac_e(0.5|0.5) cn");
+ sa += test_sf_val(dn, 0.9429724257773856873, TEST_TOL0, "gsl_sf_elljac_e(0.5|0.5) dn");
+ gsl_test(s, " gsl_sf_elljac_e(0.5|0.5)");
+ s += sa;
+
+ u = 1.0;
+ m = 0.3;
+ sa = 0;
+ stat_ej = gsl_sf_elljac_e(u, m, &sn, &cn, &dn);
+ sa += test_sf_val(sn, 0.8187707145344889190, TEST_TOL0, "gsl_sf_elljac_e(1.0|0.3) sn");
+ sa += test_sf_val(cn, 0.5741206467465548795, TEST_TOL0, "gsl_sf_elljac_e(1.0|0.3) cn");
+ sa += test_sf_val(dn, 0.8938033089590823040, TEST_TOL0, "gsl_sf_elljac_e(1.0|0.3) dn");
+ gsl_test(sa, " gsl_sf_elljac_e(1.0|0.3)");
+ s += sa;
+
+ u = 1.0;
+ m = 0.6;
+ sa = 0;
+ stat_ej = gsl_sf_elljac_e(u, m, &sn, &cn, &dn);
+ sa += test_sf_val(sn, 0.7949388393365780943, TEST_TOL0, "gsl_sf_elljac_e(1.0|0.6) sn");
+ sa += test_sf_val(cn, 0.6066895760718277578, TEST_TOL0, "gsl_sf_elljac_e(1.0|0.6) cn");
+ sa += test_sf_val(dn, 0.7879361300438814425, TEST_TOL0, "gsl_sf_elljac_e(1.0|0.6) dn");
+ gsl_test(sa, " gsl_sf_elljac_e(1.0|0.6)");
+ s += sa;
+
+ u = 3.0;
+ m = 0.6;
+ sa = 0;
+ stat_ej = gsl_sf_elljac_e(u, m, &sn, &cn, &dn);
+ sa += test_sf_val(sn, 0.7432676860864044186, TEST_TOL0, " gsl_sf_elljac_e(3.0|0.6) sn");
+ sa += test_sf_val(cn, -0.6689941306317733154, TEST_TOL0, " gsl_sf_elljac_e(3.0|0.6) cn");
+ sa += test_sf_val(dn, 0.8176379933025723259, TEST_TOL0, " gsl_sf_elljac_e(3.0|0.6) dn");
+ gsl_test(sa, " gsl_sf_elljac_e(3.0|0.6)");
+ s += sa;
+
+ u = 2.0;
+ m = 0.999999;
+ sa = 0;
+ stat_ej = gsl_sf_elljac_e(u, m, &sn, &cn, &dn);
+ sa += test_sf_val(sn, 0.96402778575700186570, TEST_TOL1, "gsl_sf_elljac_e(2.0|0.999999) sn");
+ sa += test_sf_val(cn, 0.26580148285600686381, TEST_TOL1, "gsl_sf_elljac_e(2.0|0.999999) cn");
+ sa += test_sf_val(dn, 0.26580323105264131136, TEST_TOL1, "gsl_sf_elljac_e(2.0|0.999999) dn");
+ gsl_test(sa, " gsl_sf_elljac_e(2.0|0.999999)");
+ s += sa;
+
+ /* test supplied by Ivan Panchenko */
+ u = 1.69695970624443;
+ m = 0.270378013104138;
+ sa = 0;
+ stat_ej = gsl_sf_elljac_e(u, m, &sn, &cn, &dn);
+ sa += test_sf_val(sn, 1.0, TEST_TOL0, "gsl_sf_elljac_e(1.69..|0.27..) sn");
+ sa += test_sf_val(cn, 0.0, TEST_TOL1, "gsl_sf_elljac_e(1.69..|0.27..) cn");
+ sa += test_sf_val(dn, 0.8541791304497336, TEST_TOL1, "gsl_sf_elljac_e(1.69..|0.27..) dn");
+ gsl_test(sa, " gsl_sf_elljac_e(1.69695970624443|0.270378013104138)");
+ s += sa;
+
+
+
+ /* Check known values from Abramowitz & Stegun, Table 16.5 */
+ u = 0;
+ m = 0.1;
+
+ {
+ double mc = 1 - m;
+ /* quarter period K is (pi/2)/agm(1,mc) */
+ double K = (M_PI_2)/ 0.9741726903999478375938128316;
+
+ double A = 1.0 / sqrt(1+sqrt(mc));
+ double B = pow(mc, 0.25) / sqrt(1+sqrt(mc));
+ double C = pow(mc, 0.25);
+ double C2 = sqrt(mc);
+
+ double eps = 1e-10;
+
+ sa = 0;
+ stat_ej = gsl_sf_elljac_e(0.0, m, &sn, &cn, &dn);
+ sa += test_sf_val(sn, 0.0, TEST_TOL0, "gsl_sf_elljac_e(0|0.1) sn");
+ sa += test_sf_val(cn, 1.0, TEST_TOL0, "gsl_sf_elljac_e(0|0.1) cn");
+ sa += test_sf_val(dn, 1.0, TEST_TOL0, "gsl_sf_elljac_e(0|0.1) dn");
+ gsl_test(sa, " gsl_sf_elljac_e(0|0.1)");
+ s += sa;
+
+ sa = 0;
+ stat_ej = gsl_sf_elljac_e(-eps, m, &sn, &cn, &dn);
+ sa += test_sf_val(sn, -eps, TEST_TOL0, "gsl_sf_elljac_e(-1e-10|0.1) sn");
+ sa += test_sf_val(cn, 1.0, TEST_TOL0, "gsl_sf_elljac_e(-1e-10|0.1) cn");
+ sa += test_sf_val(dn, 1.0, TEST_TOL0, "gsl_sf_elljac_e(-1e-10|0.1) dn");
+ gsl_test(sa, " gsl_sf_elljac_e(-1e-10|0.1)");
+ s += sa;
+
+ sa = 0;
+ stat_ej = gsl_sf_elljac_e(eps, m, &sn, &cn, &dn);
+ sa += test_sf_val(sn, eps, TEST_TOL0, "gsl_sf_elljac_e(1e-10|0.1) sn");
+ sa += test_sf_val(cn, 1.0, TEST_TOL0, "gsl_sf_elljac_e(1e-10|0.1) cn");
+ sa += test_sf_val(dn, 1.0, TEST_TOL0, "gsl_sf_elljac_e(1e-10|0.1) dn");
+ gsl_test(sa, " gsl_sf_elljac_e(1e-10|0.1)");
+ s += sa;
+
+ sa = 0;
+ stat_ej = gsl_sf_elljac_e(1e-30, m, &sn, &cn, &dn);
+ sa += test_sf_val(sn, 1e-30, TEST_TOL0, "gsl_sf_elljac_e(1e-30|0.1) sn");
+ sa += test_sf_val(cn, 1.0, TEST_TOL0, "gsl_sf_elljac_e(1e-30|0.1) cn");
+ sa += test_sf_val(dn, 1.0, TEST_TOL0, "gsl_sf_elljac_e(1e-30|0.1) dn");
+ gsl_test(sa, " gsl_sf_elljac_e(1e-30|0.1)");
+ s += sa;
+
+ sa = 0;
+ stat_ej = gsl_sf_elljac_e(K / 2.0 - eps, m, &sn, &cn, &dn);
+ sa += test_sf_val(sn, A - eps*B*C, TEST_TOL2, "gsl_sf_elljac_e(K/2-1e-10|0.1) sn");
+ sa += test_sf_val(cn, B + eps*A*C, TEST_TOL2, "gsl_sf_elljac_e(K/2-1e-10|0.1) cn");
+ sa += test_sf_val(dn, C + m*eps*A*B, TEST_TOL2, "gsl_sf_elljac_e(K/2-1e-10|0.1) dn");
+ gsl_test(sa, " gsl_sf_elljac_e(K/2-1e-10|0.1)");
+ s += sa;
+
+ sa = 0;
+ stat_ej = gsl_sf_elljac_e(K / 2.0, m, &sn, &cn, &dn);
+ sa += test_sf_val(sn, A, TEST_TOL2, "gsl_sf_elljac_e(K/2|0.1) sn");
+ sa += test_sf_val(cn, B, TEST_TOL2, "gsl_sf_elljac_e(K/2|0.1) cn");
+ sa += test_sf_val(dn, C, TEST_TOL2, "gsl_sf_elljac_e(K/2|0.1) dn");
+ gsl_test(sa, " gsl_sf_elljac_e(K/2|0.1)");
+ s += sa;
+
+ sa = 0;
+ stat_ej = gsl_sf_elljac_e(K / 2.0 + eps, m, &sn, &cn, &dn);
+ sa += test_sf_val(sn, A + eps*B*C, TEST_TOL2, "gsl_sf_elljac_e(K/2+1e-10|0.1) sn");
+ sa += test_sf_val(cn, B - eps*A*C, TEST_TOL2, "gsl_sf_elljac_e(K/2+1e-10|0.1) cn");
+ sa += test_sf_val(dn, C - m*eps*A*B, TEST_TOL2, "gsl_sf_elljac_e(K/2+1e-10|0.1) dn");
+ gsl_test(sa, " gsl_sf_elljac_e(K/2+1e-10|0.1)");
+ s += sa;
+
+ sa = 0;
+ stat_ej = gsl_sf_elljac_e(K - eps, m, &sn, &cn, &dn);
+ sa += test_sf_val(sn, 1.0, TEST_TOL1, "gsl_sf_elljac_e(K-1e-10|0.1) sn");
+ sa += test_sf_val(cn, eps*C2, 10*TEST_SNGL, "gsl_sf_elljac_e(K-1e-10|0.1) cn");
+ sa += test_sf_val(dn, C2, TEST_TOL2, "gsl_sf_elljac_e(K-1e-10|0.1) dn");
+ gsl_test(sa, " gsl_sf_elljac_e(K-1e-10|0.1)");
+ s += sa;
+
+ sa = 0;
+ stat_ej = gsl_sf_elljac_e(K, m, &sn, &cn, &dn);
+ sa += test_sf_val(sn, 1.0, TEST_TOL1, "gsl_sf_elljac_e(K|0.1) sn");
+ sa += test_sf_val(cn, 0.0, TEST_TOL1, "gsl_sf_elljac_e(K|0.1) cn");
+ sa += test_sf_val(dn, C2, TEST_TOL2, "gsl_sf_elljac_e(K|0.1) dn");
+ gsl_test(sa, " gsl_sf_elljac_e(K|0.1)");
+ s += sa;
+
+ sa = 0;
+ stat_ej = gsl_sf_elljac_e(K + eps, m, &sn, &cn, &dn);
+ sa += test_sf_val(sn, 1.0, TEST_TOL1, "gsl_sf_elljac_e(K+1e-10|0.1) sn");
+ sa += test_sf_val(cn, -eps*C2, 10*TEST_SNGL, "gsl_sf_elljac_e(K+1e-10|0.1) cn");
+ sa += test_sf_val(dn, C2, TEST_TOL2, "gsl_sf_elljac_e(K+1e-10|0.1) dn");
+ gsl_test(sa, " gsl_sf_elljac_e(K+1e-10|0.1)");
+ s += sa;
+
+ sa = 0;
+ stat_ej = gsl_sf_elljac_e(3.0*K / 2.0, m, &sn, &cn, &dn);
+ sa += test_sf_val(sn, A, TEST_TOL2, "gsl_sf_elljac_e(3K/2|0.1) sn");
+ sa += test_sf_val(cn, -B, TEST_TOL2, "gsl_sf_elljac_e(3K/2|0.1) cn");
+ sa += test_sf_val(dn, C, TEST_TOL2, "gsl_sf_elljac_e(3K/2|0.1) dn");
+ gsl_test(sa, " gsl_sf_elljac_e(3K/2|0.1)");
+ s += sa;
+
+
+ sa = 0;
+ stat_ej = gsl_sf_elljac_e(2.0*K - eps, m, &sn, &cn, &dn);
+ sa += test_sf_val(sn, eps, 10*TEST_SNGL, "gsl_sf_elljac_e(2K-1e-10|0.1) sn");
+ sa += test_sf_val(cn, -1.0, TEST_TOL1, "gsl_sf_elljac_e(2K-1e-10|0.1) cn");
+ sa += test_sf_val(dn, 1.0, TEST_TOL1, "gsl_sf_elljac_e(2K-1e-10|0.1) dn");
+ gsl_test(sa, " gsl_sf_elljac_e(2K-1e-10|0.1)");
+ s += sa;
+
+ sa = 0;
+ stat_ej = gsl_sf_elljac_e(2.0*K, m, &sn, &cn, &dn);
+ sa += test_sf_val(sn, 0.0, TEST_TOL1, "gsl_sf_elljac_e(2K|0.1) sn");
+ sa += test_sf_val(cn, -1.0, TEST_TOL1, "gsl_sf_elljac_e(2K|0.1) cn");
+ sa += test_sf_val(dn, 1.0, TEST_TOL1, "gsl_sf_elljac_e(2K|0.1) dn");
+ gsl_test(sa, " gsl_sf_elljac_e(2K|0.1)");
+ s += sa;
+
+ sa = 0;
+ stat_ej = gsl_sf_elljac_e(2.0*K + eps, m, &sn, &cn, &dn);
+ sa += test_sf_val(sn, -eps, 10*TEST_SNGL, "gsl_sf_elljac_e(2K+1e-10|0.1) sn");
+ sa += test_sf_val(cn, -1.0, TEST_TOL1, "gsl_sf_elljac_e(2K+1e-10|0.1) cn");
+ sa += test_sf_val(dn, 1.0, TEST_TOL1, "gsl_sf_elljac_e(2K+1e-10|0.1) dn");
+ gsl_test(sa, " gsl_sf_elljac_e(2K+1e-10|0.1)");
+ s += sa;
+
+ sa = 0;
+ stat_ej = gsl_sf_elljac_e(5.0*K / 2.0, m, &sn, &cn, &dn);
+ sa += test_sf_val(sn, -A, TEST_TOL2, "gsl_sf_elljac_e(5K/2|0.1) sn");
+ sa += test_sf_val(cn, -B, TEST_TOL2, "gsl_sf_elljac_e(5K/2|0.1) cn");
+ sa += test_sf_val(dn, C, TEST_TOL2, "gsl_sf_elljac_e(5K/2|0.1) dn");
+ gsl_test(sa, " gsl_sf_elljac_e(5K/2|0.1)");
+ s += sa;
+
+ sa = 0;
+ stat_ej = gsl_sf_elljac_e(3.0*K - eps, m, &sn, &cn, &dn);
+ sa += test_sf_val(sn, -1.0, TEST_TOL1, "gsl_sf_elljac_e(3K-1e-10|0.1) sn");
+ sa += test_sf_val(cn, -C2 * eps, 10*TEST_SNGL, "gsl_sf_elljac_e(3K-1e-10|0.1) cn");
+ sa += test_sf_val(dn, C2, TEST_TOL2, "gsl_sf_elljac_e(3K-1e-10|0.1) dn");
+ gsl_test(sa, " gsl_sf_elljac_e(3K-1e-10|0.1)");
+ s += sa;
+
+ sa = 0;
+ stat_ej = gsl_sf_elljac_e(3.0*K, m, &sn, &cn, &dn);
+ sa += test_sf_val(sn, -1.0, TEST_TOL1, "gsl_sf_elljac_e(3K|0.1) sn");
+ sa += test_sf_val(cn, 0.0, TEST_TOL1, "gsl_sf_elljac_e(3K|0.1) cn");
+ sa += test_sf_val(dn, C2, TEST_TOL2, "gsl_sf_elljac_e(3K|0.1) dn");
+ gsl_test(sa, " gsl_sf_elljac_e(3K|0.1)");
+ s += sa;
+
+ sa = 0;
+ stat_ej = gsl_sf_elljac_e(3.0*K + eps, m, &sn, &cn, &dn);
+ sa += test_sf_val(sn, -1.0, TEST_TOL1, "gsl_sf_elljac_e(3K+1e-10|0.1) sn");
+ sa += test_sf_val(cn, +C2 * eps, 10*TEST_SNGL, "gsl_sf_elljac_e(3K+1e-10|0.1) cn");
+ sa += test_sf_val(dn, C2, TEST_TOL2, "gsl_sf_elljac_e(3K+1e-10|0.1) dn");
+ gsl_test(sa, " gsl_sf_elljac_e(3K+1e-10|0.1)");
+ s += sa;
+
+ sa = 0;
+ stat_ej = gsl_sf_elljac_e(7.0*K / 2.0, m, &sn, &cn, &dn);
+ sa += test_sf_val(sn, -A, TEST_TOL2, "gsl_sf_elljac_e(7K/2|0.1) sn");
+ sa += test_sf_val(cn, B, TEST_TOL2, "gsl_sf_elljac_e(7K/2|0.1) cn");
+ sa += test_sf_val(dn, C, TEST_TOL2, "gsl_sf_elljac_e(7K/2|0.1) dn");
+ gsl_test(sa, " gsl_sf_elljac_e(7K/2|0.1)");
+ s += sa;
+
+ sa = 0;
+ stat_ej = gsl_sf_elljac_e(4.0*K - eps, m, &sn, &cn, &dn);
+ sa += test_sf_val(sn, -eps, 10*TEST_SNGL, "gsl_sf_elljac_e(4K-1e-10|0.1) sn");
+ sa += test_sf_val(cn, 1.0, TEST_TOL1, "gsl_sf_elljac_e(4K-1e-10|0.1) cn");
+ sa += test_sf_val(dn, 1.0, TEST_TOL1, "gsl_sf_elljac_e(4K-1e-10|0.1) dn");
+ gsl_test(sa, " gsl_sf_elljac_e(4K-1e-10|0.1)");
+ s += sa;
+
+ sa = 0;
+ stat_ej = gsl_sf_elljac_e(4.0*K, m, &sn, &cn, &dn);
+ sa += test_sf_val(sn, 0.0, TEST_TOL1, "gsl_sf_elljac_e(4K|0.1) sn");
+ sa += test_sf_val(cn, 1.0, TEST_TOL1, "gsl_sf_elljac_e(4K|0.1) cn");
+ sa += test_sf_val(dn, 1.0, TEST_TOL1, "gsl_sf_elljac_e(4K|0.1) dn");
+ gsl_test(sa, " gsl_sf_elljac_e(4K|0.1)");
+ s += sa;
+
+ sa = 0;
+ stat_ej = gsl_sf_elljac_e(9.0 * K / 2.0, m, &sn, &cn, &dn);
+ sa += test_sf_val(sn, A, TEST_TOL2, "gsl_sf_elljac_e(9K/2|0.1) sn");
+ sa += test_sf_val(cn, B, TEST_TOL2, "gsl_sf_elljac_e(9K/2|0.1) cn");
+ sa += test_sf_val(dn, C, TEST_TOL2, "gsl_sf_elljac_e(9K/2|0.1) dn");
+ gsl_test(sa, " gsl_sf_elljac_e(9K/2|0.1)");
+ s += sa;
+
+ sa = 0;
+ stat_ej = gsl_sf_elljac_e(-K / 2.0, m, &sn, &cn, &dn);
+ sa += test_sf_val(sn, -A, TEST_TOL2, "gsl_sf_elljac_e(-K/2|0.1) sn");
+ sa += test_sf_val(cn, B, TEST_TOL2, "gsl_sf_elljac_e(-K/2|0.1) cn");
+ sa += test_sf_val(dn, C, TEST_TOL2, "gsl_sf_elljac_e(-K/2|0.1) dn");
+ gsl_test(sa, " gsl_sf_elljac_e(-K/2|0.1)");
+ s += sa;
+
+ sa = 0;
+ stat_ej = gsl_sf_elljac_e(-K, m, &sn, &cn, &dn);
+ sa += test_sf_val(sn, -1.0, TEST_TOL1, "gsl_sf_elljac_e(-K|0.1) sn");
+ sa += test_sf_val(cn, 0.0, TEST_TOL1, "gsl_sf_elljac_e(-K|0.1) cn");
+ sa += test_sf_val(dn, C2, TEST_TOL2, "gsl_sf_elljac_e(-K|0.1) dn");
+ gsl_test(sa, " gsl_sf_elljac_e(-K|0.1)");
+ s += sa;
+
+ sa = 0;
+ stat_ej = gsl_sf_elljac_e(-3.0*K / 2.0, m, &sn, &cn, &dn);
+ sa += test_sf_val(sn, -A, TEST_TOL2, "gsl_sf_elljac_e(-3K/2|0.1) sn");
+ sa += test_sf_val(cn, -B, TEST_TOL2, "gsl_sf_elljac_e(-3K/2|0.1) cn");
+ sa += test_sf_val(dn, C, TEST_TOL2, "gsl_sf_elljac_e(-3K/2|0.1) dn");
+ gsl_test(sa, " gsl_sf_elljac_e(-3K/2|0.1)");
+ s += sa;
+
+ sa = 0;
+ stat_ej = gsl_sf_elljac_e(-2.0*K, m, &sn, &cn, &dn);
+ sa += test_sf_val(sn, 0.0, TEST_TOL1, "gsl_sf_elljac_e(-2K|0.1) sn");
+ sa += test_sf_val(cn, -1.0, TEST_TOL1, "gsl_sf_elljac_e(-2K|0.1) cn");
+ sa += test_sf_val(dn, 1.0, TEST_TOL1, "gsl_sf_elljac_e(-2K|0.1) dn");
+ gsl_test(sa, " gsl_sf_elljac_e(-2K|0.1)");
+ s += sa;
+
+ sa = 0;
+ stat_ej = gsl_sf_elljac_e(-5.0*K / 2.0, m, &sn, &cn, &dn);
+ sa += test_sf_val(sn, A, TEST_TOL2, "gsl_sf_elljac_e(-5K/2|0.1) sn");
+ sa += test_sf_val(cn, -B, TEST_TOL2, "gsl_sf_elljac_e(-5K/2|0.1) cn");
+ sa += test_sf_val(dn, C, TEST_TOL2, "gsl_sf_elljac_e(-5K/2|0.1) dn");
+ gsl_test(sa, " gsl_sf_elljac_e(-5K/2|0.1)");
+ s += sa;
+
+ sa = 0;
+ stat_ej = gsl_sf_elljac_e(-3.0*K, m, &sn, &cn, &dn);
+ sa += test_sf_val(sn, 1.0, TEST_TOL1, "gsl_sf_elljac_e(-3K|0.1) sn");
+ sa += test_sf_val(cn, 0.0, TEST_TOL1, "gsl_sf_elljac_e(-3K|0.1) cn");
+ sa += test_sf_val(dn, C2, TEST_TOL2, "gsl_sf_elljac_e(-3K|0.1) dn");
+ gsl_test(sa, " gsl_sf_elljac_e(-3K|0.1)");
+ s += sa;
+
+ sa = 0;
+ stat_ej = gsl_sf_elljac_e(-7.0*K / 2.0, m, &sn, &cn, &dn);
+ sa += test_sf_val(sn, A, TEST_TOL2, "gsl_sf_elljac_e(-7K/2|0.1) sn");
+ sa += test_sf_val(cn, B, TEST_TOL2, "gsl_sf_elljac_e(-7K/2|0.1) cn");
+ sa += test_sf_val(dn, C, TEST_TOL2, "gsl_sf_elljac_e(-7K/2|0.1) dn");
+ gsl_test(sa, " gsl_sf_elljac_e(-7K/2|0.1)");
+ s += sa;
+
+ sa = 0;
+ stat_ej = gsl_sf_elljac_e(-4.0*K, m, &sn, &cn, &dn);
+ sa += test_sf_val(sn, 0.0, TEST_TOL1, "gsl_sf_elljac_e(-4K|0.1) sn");
+ sa += test_sf_val(cn, 1.0, TEST_TOL1, "gsl_sf_elljac_e(-4K|0.1) cn");
+ sa += test_sf_val(dn, 1.0, TEST_TOL1, "gsl_sf_elljac_e(-4K|0.1) dn");
+ gsl_test(sa, " gsl_sf_elljac_e(-4K|0.1)");
+ s += sa;
+ }
+
+
+ return s;
+}
+
+
+int test_laguerre(void)
+{
+ gsl_sf_result r;
+ int s = 0;
+
+ TEST_SF(s, gsl_sf_laguerre_1_e, (0.5, -1.0, &r), 2.5, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_1_e, (0.5, 1.0, &r), 0.5, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_1_e, (1.0, 1.0, &r), 1.0, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_laguerre_2_e, ( 0.5, -1.0, &r), 4.875, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_2_e, ( 0.5, 1.0, &r), -0.125, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_2_e, ( 1.0, 1.0, &r), 0.5, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_2_e, (-1.0, 1.0, &r), -0.5, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_2_e, (-2.0, 1.0, &r), 0.5, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_2_e, (-3.0, 1.0, &r), 2.5, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_laguerre_3_e, (0.5, -1.0, &r), 8.479166666666666667, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_3_e, (0.5, 1.0, &r), -0.6041666666666666667, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_3_e, (1.0, 1.0, &r), -0.16666666666666666667, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_3_e, ( 2.0, 1.0, &r), 2.3333333333333333333, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_3_e, (-2.0, 1.0, &r), 1.0/3.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_3_e, (-3.0, 1.0, &r), -1.0/6.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_3_e, (-4.0, 1.0, &r), -8.0/3.0, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_laguerre_n_e, (1, 0.5, 1.0, &r), 0.5, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (2, 1.0, 1.0, &r), 0.5, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (3, 2.0, 1.0, &r), 2.3333333333333333333, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (4, 2.0, 0.5, &r), 6.752604166666666667, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (90, 2.0, 0.5, &r), -48.79047157201507897, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (90, 2.0, -100.0, &r), 2.5295879275042410902e+63, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (90, 2.0, 100.0, &r), -2.0929042259546928670e+20, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (100, 2.0, -0.5, &r), 2.2521795545919391405e+07, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (100, 2.0, 0.5, &r), -28.764832945909097418, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (1000, 2.0, -0.5, &r), 2.4399915170947549589e+21, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (1000, 2.0, 0.5, &r), -306.77440254315317525, TEST_TOL2, GSL_SUCCESS); /**/
+ TEST_SF(s, gsl_sf_laguerre_n_e, (100000, 2.0, 1.0, &r), 5107.73491348319, TEST_TOL4, GSL_SUCCESS);
+
+ /* Compute these with the recurrence
+ * L(0,alpha,x)=1;
+ * L(1,alpha,x)=1+alpha-x;
+ * L(n,alpha,x)=((2*n-1+alpha-x)*L(n-1,alpha,x)-(n+alpha-1)*L(n-2,alpha,x))/k
+ */
+
+ TEST_SF(s, gsl_sf_laguerre_n_e, (1e5, 2.5, 2.5, &r), -0.41491680394598644969113795e5, TEST_TOL4, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (1e5+1, 2.5, 2.5, &r), -0.41629446949552321027514888e5, TEST_TOL4, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (1e6+1, 2.5, 2.5, &r), -0.48017961545391273151977118e6, TEST_TOL4, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (5e6+1, 2.5, 2.5, &r), -0.15174037401611122446089494e7, TEST_TOL4, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (8e6+1, 2.5, 2.5, &r), 0.63251509472091810994286362e6, TEST_TOL6, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (1e7+1, 2.5, 2.5, &r), 0.15299484685632983178033887e7, TEST_TOL6, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (1e8+1, 2.5, 2.5, &r), 0.23645341644922756725290777e8, TEST_SNGL, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (1e9+1, 2.5, 2.5, &r), -0.17731002248958790286185878e8, 100*TEST_SNGL, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_laguerre_n_e, (1, -2.0, 1.0, &r), -2.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (2, -2.0, 1.0, &r), 0.5, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (3, -2.0, 1.0, &r), 1.0/3.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (10, -2.0, 1.0, &r), -0.04654954805996472663, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (10, -5.0, 1.0, &r), -0.0031385030864197530864, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (10, -9.0, 1.0, &r), -2.480158730158730159e-06, TEST_TOL5, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (10, -11.0, 1.0, &r), 2.7182818011463844797, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (10, -11.0, -1.0, &r), 0.3678794642857142857, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (100, -2.0, 1.0, &r), -0.0027339992019526273866, TEST_SQRT_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (100, -2.0, -1.0, &r), 229923.09193402028290, TEST_TOL5, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (100, -10.0, 1.0, &r), 3.25966665871244092e-11, TEST_TOL6, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (100, -10.0, -1.0, &r), 0.00016484365618205810025, TEST_TOL6, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (100, -20.0, 1.0, &r), 5.09567630343671251e-21, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (100, -30.0, 1.0, &r), 3.46063150272466192e-34, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (100, -50.0, 1.0, &r), 1.20981872933162889e-65, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (100, -50.0, -1.0, &r), 8.60763477742332922e-65, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (100, -50.5, 1.0, &r), 4.84021010426688393e-31, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (100, -50.5, -1.0, &r), 8.49861345212160618e-33, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (100, -101.0, 1.0, &r), 2.7182818284590452354, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (100, -101.0, -1.0, &r), 0.3678794411714423216, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (100, -102.0, 1.0, &r), 271.8281828459045235, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (100, -102.0, -1.0, &r), 37.52370299948711680, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (100, -110.0, 1.0, &r), 1.0666955248998831554e+13, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (100, -110.0, -1.0, &r), 1.7028306108058225871e+12, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (100, -200.0, 1.0, &r), 7.47851889721356628e+58, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (100, -200.0, -1.0, &r), 2.73740299754732273e+58, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (100, -50.0, 10.0, &r), 4.504712811317745591e-21, TEST_SQRT_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_laguerre_n_e, (100, -50.0, -10.0, &r), 1.475165520610679937e-11, TEST_TOL1, GSL_SUCCESS);
+
+
+ return s;
+}
+
+
+int test_lambert(void)
+{
+ gsl_sf_result r;
+ int s = 0;
+
+ TEST_SF(s, gsl_sf_lambert_W0_e, (0.0, &r), 0.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lambert_W0_e, (1.0, &r), 0.567143290409783872999969, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lambert_W0_e, (2.0, &r), 0.852605502013725491346472, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lambert_W0_e, (20.0, &r), 2.205003278024059970493066, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lambert_W0_e, (1000.0, &r), 5.24960285240159622712606, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lambert_W0_e, (1.0e+6, &r), 11.38335808614005262200016, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lambert_W0_e, (1.0e+12, &r), 24.43500440493491313826305, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lambert_W0_e, (1.0e+308, &r), 702.641362034106812081125, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_lambert_W0_e, (-1.0/M_E - GSL_DBL_EPSILON, &r), -1.0, TEST_TOL0, GSL_EDOM);
+ TEST_SF(s, gsl_sf_lambert_W0_e, (-1.0/M_E + 1.0/(1024.0*1024.0*1024.0), &r), -0.999928845560308370714970, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lambert_W0_e, (-1.0/M_E + 1.0/(1024.0*1024.0), &r), -0.997724730359774141620354, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lambert_W0_e, (-1.0/M_E + 1.0/512.0, &r), -0.900335676696088773044678, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lambert_W0_e, (-1.0/M_E + 0.25, &r), -0.1349044682661213545487599, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_lambert_Wm1_e, (0.0, &r), 0.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lambert_Wm1_e, (1.0, &r), 0.567143290409783872999969, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lambert_Wm1_e, (2.0, &r), 0.852605502013725491346472, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lambert_Wm1_e, (20.0, &r), 2.205003278024059970493066, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_lambert_Wm1_e, (-1.0/M_E - GSL_DBL_EPSILON, &r), -1.0, TEST_TOL0, GSL_EDOM);
+ TEST_SF(s, gsl_sf_lambert_Wm1_e, (-1.0/M_E + 1.0/(1024.0*1024.0*1024.0), &r), -1.000071157815154608049055, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lambert_Wm1_e, (-1.0/M_E + 1.0/(1024.0*1024.0), &r), -1.002278726118593023934693, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lambert_Wm1_e, (-1.0/M_E + 1.0/512.0, &r), -1.106761200865743124599130, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lambert_Wm1_e, (-1.0/M_E + 1.0/64.0, &r), -1.324240940341812125489772, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lambert_Wm1_e, (-1.0/M_E + 0.25, &r), -3.345798131120112, TEST_TOL1, GSL_SUCCESS);
+
+ return s;
+}
+
+
+int test_log(void)
+{
+ gsl_sf_result r;
+ gsl_sf_result r1, r2;
+ int s = 0;
+
+ TEST_SF(s, gsl_sf_log_e, (0.1, &r), -2.3025850929940456840, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_log_e, (1.1, &r), 0.09531017980432486004, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_log_e, (1000.0, &r), 6.907755278982137052, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_log_abs_e, (-0.1, &r), -2.3025850929940456840, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_log_abs_e, (-1.1, &r), 0.09531017980432486004, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_log_abs_e, (-1000.0, &r), 6.907755278982137052, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_log_abs_e, (0.1, &r), -2.3025850929940456840, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_log_abs_e, (1.1, &r), 0.09531017980432486004, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_log_abs_e, (1000.0, &r), 6.907755278982137052, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_log_e, (1.0, 1.0, &r1, &r2),
+ 0.3465735902799726547, TEST_TOL0,
+ 0.7853981633974483096, TEST_TOL0,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_log_e, (1.0, -1.0, &r1, &r2),
+ 0.3465735902799726547, TEST_TOL0,
+ -0.7853981633974483096, TEST_TOL0,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_log_e, (1.0, 100.0, &r1, &r2),
+ 4.605220183488258022, TEST_TOL0,
+ 1.560796660108231381, TEST_TOL0,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_log_e, (-1000.0, -1.0, &r1, &r2),
+ 6.907755778981887052, TEST_TOL0,
+ -3.1405926539231263718, TEST_TOL0,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_log_e, (-1.0, 0.0, &r1, &r2),
+ 0.0, TEST_TOL0,
+ 3.1415926535897932385, TEST_TOL0,
+ GSL_SUCCESS);
+
+
+ TEST_SF(s, gsl_sf_log_1plusx_e, (1.0e-10, &r), 9.999999999500000000e-11, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_log_1plusx_e, (1.0e-8, &r), 9.999999950000000333e-09, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_log_1plusx_e, (1.0e-4, &r), 0.00009999500033330833533, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_log_1plusx_e, (0.1, &r), 0.09531017980432486004, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_log_1plusx_e, (0.49, &r), 0.3987761199573677730, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_log_1plusx_e, (-0.49, &r), -0.6733445532637655964, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_log_1plusx_e, (1.0, &r), M_LN2, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_log_1plusx_e, (-0.99, &r), -4.605170185988091368, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_log_1plusx_mx_e, (1.0e-10, &r), -4.999999999666666667e-21, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_log_1plusx_mx_e, (1.0e-8, &r), -4.999999966666666917e-17, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_log_1plusx_mx_e, (1.0e-4, &r), -4.999666691664666833e-09, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_log_1plusx_mx_e, (0.1, &r), -0.004689820195675139956, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_log_1plusx_mx_e, (0.49, &r), -0.09122388004263222704, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_log_1plusx_mx_e, (-0.49, &r), -0.18334455326376559639, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_log_1plusx_mx_e, (1.0, &r), M_LN2-1.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_log_1plusx_mx_e, (-0.99, &r), -3.615170185988091368, TEST_TOL0, GSL_SUCCESS);
+
+ return s;
+}
+
+
+int test_pow_int(void)
+{
+ gsl_sf_result r;
+ int status = 0;
+ int s = 0;
+
+ TEST_SF(s, gsl_sf_pow_int_e, (2.0, 3, &r), 8.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_pow_int_e, (-2.0, 3, &r), -8.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_pow_int_e, (2.0, -3, &r), 1.0/8.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_pow_int_e, (-2.0, -3, &r), -1.0/8.0, TEST_TOL0, GSL_SUCCESS);
+
+
+ TEST_SF(s, gsl_sf_pow_int_e, (10.0, 4, &r), 1.0e+4, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_pow_int_e, (10.0, -4, &r), 1.0e-4, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_pow_int_e, (-10.0, 4, &r), 1.0e+4, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_pow_int_e, (-10.0, -4, &r), 1.0e-4, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_pow_int_e, (10.0, 40, &r), 1.0e+40, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_pow_int_e, (8.0, -40, &r), 7.523163845262640051e-37, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_pow_int_e, (-10.0, 40, &r), 1.0e+40, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_pow_int_e, (-8.0, -40, &r), 7.523163845262640051e-37, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_pow_int_e, (10.0, 41, &r), 1.0e+41, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_pow_int_e, (8.0, -41, &r), 9.403954806578300064e-38, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_pow_int_e, (-10.0, 41, &r), -1.0e+41, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_pow_int_e, (-8.0, -41, &r), -9.403954806578300064e-38, TEST_TOL0, GSL_SUCCESS);
+
+ return status;
+}
+
+int test_psi(void)
+{
+ gsl_sf_result r;
+ int s = 0;
+
+ /* Test values taken 1-4 from gp-pari */
+
+ TEST_SF(s, gsl_sf_psi_int_e, (1, &r), -0.57721566490153286060, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_int_e, (2, &r), 0.42278433509846713939, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_int_e, (3, &r), 0.92278433509846713939, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_int_e, (4, &r), 1.2561176684318004727, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_psi_int_e, (5, &r), 1.5061176684318004727, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_int_e, (100, &r), 4.600161852738087400, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_int_e, (110, &r), 4.695928024251535633, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_int_e, (5000, &r), 8.517093188082904107, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_psi_e, (5000.0, &r), 8.517093188082904107, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_e, (5.0, &r), 1.5061176684318004727, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_e, (-10.5, &r), 2.3982391295357816134, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_e, (-100.5, &r), 4.615124601338064117, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_e, (-1.0e+5-0.5, &r), 11.512935464924395337, 4.0*TEST_TOL4, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_e, (-262144.0-0.5, &r), 12.476653064769611581, 4.0*TEST_TOL4, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_psi_1piy_e, (0.8, &r), -0.07088340212750589223, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_1piy_e, (1.0, &r), 0.09465032062247697727, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_1piy_e, (5.0, &r), 1.6127848446157465854, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_1piy_e, (100.0, &r), 4.605178519404762003, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_1piy_e, (2000.0, &r), 7.600902480375416216, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_psi_1piy_e, (-0.8, &r), -0.07088340212750589223, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_1piy_e, (-1.0, &r), 0.09465032062247697727, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_1piy_e, (-5.0, &r), 1.6127848446157465854, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_1piy_e, (-100.0, &r), 4.605178519404762003, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_1piy_e, (-2000.0, &r), 7.600902480375416216, TEST_TOL0, GSL_SUCCESS);
+
+ /* Additional test values 1-4 computed using gp-pari and
+ Abramowitz & Stegun 6.4.6 */
+
+ TEST_SF(s, gsl_sf_psi_1_int_e, (1, &r), 1.6449340668482264364, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_1_int_e, (2, &r), 0.64493406684822643647, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_1_int_e, (3, &r), 0.39493406684822643647, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_1_int_e, (4, &r), 0.28382295573711532536, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_psi_1_int_e, (1, &r), 1.6449340668482264365, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_1_int_e, (5, &r), 0.22132295573711532536, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_1_int_e, (100, &r), 0.010050166663333571395, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_1_int_e, (110, &r), 0.009132356622022545705, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_1_int_e, (500, &r), 0.0020020013333322666697, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_psi_1_e, (1.0/32.0, &r), 1025.5728544782377089, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_1_e, (1.0, &r), 1.6449340668482264365, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_1_e, (5.0, &r), 0.22132295573711532536, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_1_e, (100.0, &r), 0.010050166663333571395, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_1_e, (110.0, &r), 0.009132356622022545705, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_1_e, (500.0, &r), 0.0020020013333322666697, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_psi_1_e, (-1.0 - 1.0/128.0, &r), 16386.648472598746587, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_1_e, (-1.50, &r), 9.3792466449891237539, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_1_e, (-10.5, &r), 9.7787577398148123845, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_1_e, (-15.5, &r), 9.8071247184113896201, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_1_e, (-50.5, &r), 9.8499971860824842274, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_1_e, (-1000.5, &r), 9.8686054001734414233, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_psi_n_e, (1, 1, &r), 1.6449340668482264364, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_n_e, (1, 2, &r), 0.64493406684822643647, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_n_e, (1, 3, &r), 0.39493406684822643647, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_n_e, (1, 4, &r), 0.28382295573711532536, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_psi_n_e, (1, 5, &r), 0.22132295573711532536, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_n_e, (1, 100, &r), 0.010050166663333571395, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_n_e, (1, 110, &r), 0.009132356622022545705, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_n_e, (1, 500, &r), 0.0020020013333322666697, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_psi_n_e, (3, 5.0, &r), 0.021427828192755075022, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_n_e, (3, 500.0, &r), 1.6048063999872000683e-08, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_n_e, (10, 5.0, &r), -0.08675107579196581317, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_n_e, (10, 50.0, &r), -4.101091112731268288e-12, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_psi_n_e, (0, -1.5, &r), 0.70315664064524318723, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_psi_n_e, (1, -1.5, &r), 9.3792466449891237539, TEST_TOL0, GSL_SUCCESS);
+
+ return s;
+}
+
+
+int test_psi_complex(void)
+{
+ gsl_sf_result r1;
+ gsl_sf_result r2;
+ int s = 0;
+
+ TEST_SF_2(s, gsl_sf_complex_psi_e, (1.0e+07, 1.0e+06, &r1, &r2),
+ 16.1230707668799525, TEST_TOL0,
+ 0.09966865744165720, TEST_TOL0,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_psi_e, (10.0, 50.0, &r1, &r2),
+ 3.92973987174863660, TEST_TOL0,
+ 1.38302847985210276, TEST_TOL0,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_psi_e, (2.0, 21.0, &r1, &r2),
+ 3.04697388853248195, TEST_TOL0,
+ 1.49947549076817824, TEST_TOL0,
+ GSL_SUCCESS);
+
+ gsl_sf_complex_psi_e(1.5, 0.0, &r1, &r2);
+ TEST_SF_VAL(s, 0.0364899739785765206, +0.0, r1.val, TEST_TOL0);
+
+ TEST_SF_2(s, gsl_sf_complex_psi_e, (1.0, 5.0, &r1, &r2),
+ 1.612784844615747, TEST_TOL0,
+ 1.470796326794968, TEST_TOL0,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_psi_e, (-1.5, 5.0, &r1, &r2),
+ 1.68260717336484070, TEST_TOL0,
+ 1.95230236730713338, TEST_TOL0,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_psi_e, (-20.5, -20.5, &r1, &r2),
+ 3.37919358657933066, TEST_TOL0,
+ -2.36829046481731091, TEST_TOL0,
+ GSL_SUCCESS);
+
+ return s;
+}
+
+
+
+
+int test_synch(void)
+{
+ gsl_sf_result r;
+ int s = 0;
+
+ TEST_SF(s, gsl_sf_synchrotron_1_e, (0.01, &r), 0.444972504114210632, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_synchrotron_1_e, (1.0, &r), 0.651422815355364504, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_synchrotron_1_e, (10.0, &r), 0.000192238264300868882, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_synchrotron_1_e, (100.0, &r), 4.69759366592220221e-43, TEST_TOL1, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_synchrotron_2_e, (0.01, &r), 0.23098077342226277732, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_synchrotron_2_e, (1.0, &r), 0.4944750621042082670, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_synchrotron_2_e, (10.0, &r), 0.00018161187569530204281, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_synchrotron_2_e, (256.0, &r), 1.3272635474353774058e-110, TEST_TOL4, GSL_SUCCESS); /* exp()... not my fault */
+
+ return s;
+}
+
+
+int test_transport(void)
+{
+ gsl_sf_result r;
+ int s = 0;
+
+ TEST_SF(s, gsl_sf_transport_2_e, (1.0e-10, &r), 9.9999999999999999999e-11, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_transport_2_e, (1.0, &r), 0.97303256135517012845, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_transport_2_e, (3.0, &r), 2.41105004901695346199, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_transport_2_e, (10.0, &r), 3.28432911449795173575, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_transport_2_e, (100.0, &r), 3.28986813369645287294, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_transport_2_e, (1.0e+05, &r), 3.28986813369645287294, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_transport_3_e, (1.0e-10, &r), 4.999999999999999999997e-21, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_transport_3_e, (1.0, &r), 0.479841006572417499939, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_transport_3_e, (3.0, &r), 3.210604662942246772338, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_transport_3_e, (5.0, &r), 5.614386613842273228585, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_transport_3_e, (10.0, &r), 7.150322712008592975030, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_transport_3_e, (30.0, &r), 7.212341416160946511930, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_transport_3_e, (100.0, &r), 7.212341418957565712398, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_transport_3_e, (1.0e+05, &r), 7.212341418957565712398, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_transport_4_e, (1.0e-10, &r), 3.33333333333333333333e-31, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_transport_4_e, (1.0e-07, &r), 3.33333333333333166666e-22, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_transport_4_e, (1.0e-04, &r), 3.33333333166666666726e-13, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_transport_4_e, (0.1, &r), 0.000333166726172109903824, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_transport_4_e, (1.0, &r), 0.31724404523442648241, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_transport_4_e, (3.0, &r), 5.96482239737147652446, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_transport_4_e, (5.0, &r), 15.3597843168821829816, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_transport_4_e, (10.0, &r), 25.2736676770304417334, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_transport_4_e, (30.0, &r), 25.9757575220840937469, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_transport_4_e, (100.0, &r), 25.9757576090673165963, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_transport_4_e, (1.0e+05, &r), 25.9757576090673165963, TEST_TOL2, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_transport_5_e, (1.0e-10, &r), 2.49999999999999999999e-41, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_transport_5_e, (1.0e-07, &r), 2.49999999999999861111e-29, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_transport_5_e, (1.0e-04, &r), 2.49999999861111111163e-17, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_transport_5_e, (0.1, &r), 0.000024986116317791487410, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_transport_5_e, (1.0, &r), 0.236615879239094789259153, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_transport_5_e, (3.0, &r), 12.77055769104415951115760, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_transport_5_e, (5.0, &r), 50.26309221817518778543615, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_transport_5_e, (10.0, &r), 116.3807454024207107698556, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_transport_5_e, (30.0, &r), 124.4313279083858954839911, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_transport_5_e, (100.0, &r), 124.4313306172043911597639, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_transport_5_e, (1.0e+05, &r), 124.43133061720439115976, TEST_TOL0, GSL_SUCCESS);
+
+ return s;
+}
+
+
+int test_trig(void)
+{
+ gsl_sf_result r;
+ gsl_sf_result r1, r2;
+ double theta;
+ int s = 0;
+ int sa;
+
+ TEST_SF(s, gsl_sf_sin_e, (-10.0, &r), 0.5440211108893698134, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_sin_e, (1.0, &r), 0.8414709848078965067, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_sin_e, (1000.0, &r), 0.8268795405320025603, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_sin_e, (1048576.75, &r), 0.8851545351115651914, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_sin_e, (62831853.75, &r), 0.6273955953485000827, TEST_TOL3, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_sin_e, (1073741822.5, &r), -0.8284043541754465988, TEST_SQRT_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_sin_e, (1073741824.0, &r), -0.6173264150460421708, TEST_SQRT_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_sin_e, (1073741825.5, &r), 0.7410684679436226926, TEST_SQRT_TOL0, GSL_SUCCESS);
+ /*
+ TEST_SF(s, gsl_sf_sin_e, (1099511627776.0, &r), -0.4057050115328287198, 32.0*TEST_SQRT_TOL0, GSL_SUCCESS);
+ */
+
+ TEST_SF(s, gsl_sf_cos_e, (-10.0, &r), -0.8390715290764524523, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_cos_e, (1.0, &r), 0.5403023058681397174, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_cos_e, (1000.0, &r), 0.5623790762907029911, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_cos_e, (1048576.75, &r), 0.4652971620066351799, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_cos_e, (62831853.75, &r), 0.7787006914966116436, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_cos_e, (1073741822.5, &r), -0.5601305436977716102, TEST_SQRT_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_cos_e, (1073741824.0, &r), 0.7867071229411881196, TEST_SQRT_TOL0, GSL_SUCCESS);
+ /*
+ TEST_SF(s, gsl_sf_cos_e, (1099511627776.0, &r), -0.9140040719915570023, 128.0*TEST_SQRT_TOL0, GSL_SUCCESS);
+ */
+
+ TEST_SF(s, gsl_sf_sinc_e, (1.0/1024.0, &r), 0.9999984312693665404, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_sinc_e, (1.0/2.0, &r), 2.0/M_PI, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_sinc_e, (80.5, &r), 0.0039541600768172754, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_sinc_e, (100.5, &r), 0.0031672625490924445, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_sinc_e, (1.0e+06 + 0.5, &r), 3.18309727028927157e-07, TEST_TOL0, GSL_SUCCESS);
+
+ /*
+ TEST_SF(s, gsl_sf_sin_pi_x_e, (1000.5, &r), 1.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_sin_pi_x_e, (10000.0 + 1.0/65536.0, &r), 0.00004793689960306688455, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_sin_pi_x_e, (1099511627776.0 + 1 + 0.125, &r), -0.3826834323650897717, TEST_TOL0, GSL_SUCCESS);
+ */
+
+ TEST_SF_2(s, gsl_sf_complex_sin_e, (1.0, 5.0, &r1, &r2),
+ 62.44551846769653403, TEST_TOL0,
+ 40.09216577799840254, TEST_TOL0,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_cos_e, (1.0, 5.0, &r1, &r2),
+ 40.09580630629882573, TEST_TOL0,
+ -62.43984868079963017, TEST_TOL0,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_logsin_e, (1.0, 100.0, &r1, &r2),
+ 99.3068528194400546900, TEST_TOL0,
+ 0.5707963267948966192, TEST_TOL0,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_logsin_e, (1.0, -100.0, &r1, &r2),
+ 99.3068528194400546900, TEST_TOL1,
+ -0.5707963267948966192, TEST_TOL1,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_complex_logsin_e, (5.0, 5.0, &r1, &r2),
+ 4.3068909128079757420, TEST_TOL0,
+ 2.8540063315538773952, TEST_TOL0,
+ GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_lnsinh_e, (0.1, &r), -2.3009189815304652235, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lnsinh_e, (1.0, &r), 0.16143936157119563361, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lnsinh_e, (5.0, &r), 4.306807418479684201, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lnsinh_e, (100.0, &r), 99.30685281944005469, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_lncosh_e, (0.125, &r), 0.007792239318898252791, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lncosh_e, (1.0, &r), 0.4337808304830271870, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lncosh_e, (5.0, &r), 4.306898218339271555, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_lncosh_e, (100.0, &r), 99.30685281944005469, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_polar_to_rect, (10.0, M_PI/6.0, &r1, &r2),
+ (10.0 * sqrt(3) / 2.0), TEST_TOL0,
+ (10.0 * 0.5), TEST_TOL0,
+ GSL_SUCCESS);
+
+ TEST_SF_2(s, gsl_sf_polar_to_rect, (10.0, -2.0/3.0*M_PI, &r1, &r2),
+ (10.0 * (-0.5)), TEST_TOL1,
+ (10.0 * (-sqrt(3.0)/2.0)), TEST_TOL1,
+ GSL_SUCCESS);
+
+ /* In double precision M_PI = \pi - 1.2246467991473531772e-16,
+ i.e. the nearest machine number is slightly below the exact value
+ of \pi. The true value of \pi satisfies
+
+ M_PI < \pi < nextafter(M_PI,+Inf)
+
+ where nextafter(M_PI,+Inf) = M_PI + 2*DBL_EPSILON
+
+ This also means that 2*M_PI is less than \pi by 2.449e-16. The
+ true value of 2\pi satisfies
+
+ 2*M_PI < 2\pi < nextafter(2*M_PI,+Inf)
+
+ where nextafter(2*M_PI,+Inf) = 2*M_PI + 4*DBL_EPSILON
+
+ BJG 25/9/06
+ */
+
+#define DELTA (1.2246467991473531772e-16)
+
+ TEST_SF_THETA(s, gsl_sf_angle_restrict_pos_e, (2.0*M_PI), 2*M_PI, TEST_TOL1);
+ TEST_SF_THETA(s, gsl_sf_angle_restrict_pos_e, (-2.0*M_PI), 2*DELTA, TEST_TOL1);
+
+ TEST_SF_THETA(s, gsl_sf_angle_restrict_pos_e, (2.0*M_PI+4*GSL_DBL_EPSILON), 4*GSL_DBL_EPSILON-2*DELTA, TEST_TOL1);
+ TEST_SF_THETA(s, gsl_sf_angle_restrict_pos_e, (-2.0*M_PI-4*GSL_DBL_EPSILON), 2*M_PI-4*GSL_DBL_EPSILON+2*DELTA, TEST_TOL1);
+
+ TEST_SF_THETA(s, gsl_sf_angle_restrict_pos_e, (4.0*M_PI+8*GSL_DBL_EPSILON), 8*GSL_DBL_EPSILON-4*DELTA, TEST_TOL1);
+ TEST_SF_THETA(s, gsl_sf_angle_restrict_pos_e, (-4.0*M_PI-8*GSL_DBL_EPSILON), 2*M_PI-8*GSL_DBL_EPSILON+4*DELTA, TEST_TOL1);
+
+ TEST_SF_THETA(s, gsl_sf_angle_restrict_pos_e, (1e9), 0.5773954235013851694, TEST_TOL1);
+ TEST_SF_THETA(s, gsl_sf_angle_restrict_pos_e, (1e12), 5.625560548042800009446, TEST_SNGL);
+
+ TEST_SF_THETA(s, gsl_sf_angle_restrict_pos_e, (-1e9), 5.7057898836782013075, TEST_TOL1);
+ TEST_SF_THETA(s, gsl_sf_angle_restrict_pos_e, (-1e12), 0.6576247591367864674792517289, TEST_SNGL);
+
+#ifdef EXTENDED
+ TEST_SF_THETA(s, gsl_sf_angle_restrict_pos_e, (1e15), 2.1096981170701125979, TEST_TOL1);
+ TEST_SF_THETA(s, gsl_sf_angle_restrict_pos_e, (-1e15), 4.1734871901094738790, TEST_TOL1);
+#endif
+
+ TEST_SF(s, gsl_sf_angle_restrict_pos_err_e, (2.0*M_PI, &r), 2*M_PI, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_angle_restrict_pos_err_e, (-2.0*M_PI, &r), 2*DELTA, TEST_TOL1, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_angle_restrict_pos_err_e, (1e9, &r), 0.5773954235013851694, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_angle_restrict_pos_err_e, (1e12, &r), 5.625560548042800009446, TEST_SNGL, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_angle_restrict_pos_err_e, (-1e9, &r), 5.7057898836782013075, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_angle_restrict_pos_err_e, (-1e12, &r), 0.6576247591367864674792517289, TEST_SNGL, GSL_SUCCESS);
+
+ TEST_SF (s, gsl_sf_angle_restrict_pos_err_e, (1e15, &r), GSL_NAN, TEST_TOL1, GSL_ELOSS);
+ TEST_SF (s, gsl_sf_angle_restrict_pos_err_e, (-1e15, &r), GSL_NAN, TEST_TOL1, GSL_ELOSS);
+
+ TEST_SF_THETA(s, gsl_sf_angle_restrict_symm_e, (2.0*M_PI), -2*DELTA, TEST_TOL1);
+ TEST_SF_THETA(s, gsl_sf_angle_restrict_symm_e, (-2.0*M_PI), 2*DELTA, TEST_TOL1);
+
+ TEST_SF_THETA(s, gsl_sf_angle_restrict_symm_e, (M_PI), M_PI, TEST_TOL1);
+ TEST_SF_THETA(s, gsl_sf_angle_restrict_symm_e, (-M_PI), -M_PI, TEST_TOL1);
+
+ TEST_SF_THETA(s, gsl_sf_angle_restrict_symm_e, (M_PI+2*GSL_DBL_EPSILON), -M_PI+2*(GSL_DBL_EPSILON-DELTA), TEST_TOL1);
+ TEST_SF_THETA(s, gsl_sf_angle_restrict_symm_e, (-M_PI-2*GSL_DBL_EPSILON), M_PI-2*(GSL_DBL_EPSILON-DELTA), TEST_TOL1);
+
+ TEST_SF_THETA(s, gsl_sf_angle_restrict_symm_e, (3*M_PI+6*GSL_DBL_EPSILON), -M_PI+6*GSL_DBL_EPSILON-4*DELTA, TEST_TOL1);
+ TEST_SF_THETA(s, gsl_sf_angle_restrict_symm_e, (-3*M_PI-6*GSL_DBL_EPSILON), M_PI-6*GSL_DBL_EPSILON+4*DELTA, TEST_TOL1);
+
+
+ TEST_SF_THETA(s, gsl_sf_angle_restrict_symm_e, (1e9), 0.5773954235013851694, TEST_TOL1);
+ TEST_SF_THETA(s, gsl_sf_angle_restrict_symm_e, (1e12), -0.6576247591367864674792517289, TEST_SNGL);
+
+ TEST_SF_THETA(s, gsl_sf_angle_restrict_symm_e, (-1e9), -0.5773954235013851694, TEST_TOL1);
+ TEST_SF_THETA(s, gsl_sf_angle_restrict_symm_e, (-1e12), 0.6576247591367864674792517289, TEST_SNGL);
+
+#ifdef EXTENDED
+ TEST_SF_THETA(s, gsl_sf_angle_restrict_symm_e, (1e15), 2.1096981170701125979, TEST_TOL1);
+ TEST_SF_THETA(s, gsl_sf_angle_restrict_symm_e, (-1e15), -2.1096981170701125979, TEST_TOL1);
+#endif
+
+ TEST_SF (s, gsl_sf_angle_restrict_symm_err_e, (2.0*M_PI, &r), -2*DELTA, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF (s, gsl_sf_angle_restrict_symm_err_e, (-2.0*M_PI, &r), 2*DELTA, TEST_TOL1, GSL_SUCCESS);
+
+
+ TEST_SF(s, gsl_sf_angle_restrict_symm_err_e, (1e9, &r), 0.5773954235013851694, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_angle_restrict_symm_err_e, (1e12, &r), -0.6576247591367864674792517289, TEST_SNGL, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_angle_restrict_symm_err_e, (-1e9, &r), -0.5773954235013851694, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_angle_restrict_symm_err_e, (-1e12, &r), 0.6576247591367864674792517289, TEST_SNGL, GSL_SUCCESS);
+
+ TEST_SF (s, gsl_sf_angle_restrict_symm_err_e, (1e15, &r), GSL_NAN, TEST_TOL1, GSL_ELOSS);
+ TEST_SF (s, gsl_sf_angle_restrict_symm_err_e, (-1e15, &r), GSL_NAN, TEST_TOL1, GSL_ELOSS);
+
+ theta = 5.0*M_PI + 5*DELTA + M_PI/2.0;
+ gsl_sf_angle_restrict_pos_e(&theta);
+ sa = 0;
+ sa += ( test_sf_frac_diff( theta, 3.0/2.0*M_PI ) > TEST_TOL0 );
+ gsl_test(sa, " gsl_angle_restrict_pos_e: theta = 11/2 Pi");
+ s += sa;
+
+ theta = -5.0*M_PI - 5*DELTA - M_PI/2.0;
+ gsl_sf_angle_restrict_pos_e(&theta);
+ sa = 0;
+ sa += ( test_sf_frac_diff( theta, M_PI/2.0 ) > 2.0*TEST_TOL0 );
+ gsl_test(sa, " gsl_angle_restrict_pos_e: theta = -11/2 Pi");
+ s += sa;
+
+ theta = 50000.0 + 1.0/65536.0;
+ gsl_sf_angle_restrict_pos_e(&theta);
+ sa = 0;
+ sa += ( test_sf_frac_diff( theta, 4.6945260308194656055 ) > TEST_TOL0 );
+ gsl_test(sa, " gsl_angle_restrict_pos_e: theta = 50000.0 + 1.0/65536.0");
+ s += sa;
+
+ theta = 5000000.0 + 1.0/65536.0;
+ gsl_sf_angle_restrict_pos_e(&theta);
+ sa = 0;
+ sa += ( test_sf_frac_diff( theta, 4.49537973053997376 ) > TEST_TOL0 );
+ gsl_test(sa, " gsl_angle_restrict_pos_e: theta = 5000000.0 + 1.0/65536.0");
+ s += sa;
+
+ /*
+ theta = 140737488355328.0;
+ gsl_sf_angle_restrict_pos_e(&theta);
+ sa = 0;
+ sa += ( test_sf_frac_diff( theta, 3.20652300406795792638 ) > TEST_TOL0 );
+ gsl_test(sa, " gsl_angle_restrict_pos_e: theta = 2^47");
+ s += sa;
+ */
+
+ theta = 5.0*M_PI + (5.5*DELTA + M_PI/2.0);
+ gsl_sf_angle_restrict_symm_e(&theta);
+ sa = 0;
+ sa += ( test_sf_frac_diff( theta, -M_PI/2.0 ) > 2.0*TEST_TOL0 );
+ gsl_test(sa, " gsl_angle_restrict_symm_e: theta = 11/2 Pi");
+ s += sa;
+
+ theta = -5.0*M_PI - (5.5*DELTA + M_PI/2.0);
+ gsl_sf_angle_restrict_symm_e(&theta);
+ sa = 0;
+ sa += ( test_sf_frac_diff( theta, M_PI/2.0 ) > 2.0*TEST_TOL0 );
+ gsl_test(sa, " gsl_angle_restrict_symm_e: theta = -11/2 Pi");
+ s += sa;
+
+ theta = 5.0*M_PI + 5*DELTA - M_PI/2.0;
+ gsl_sf_angle_restrict_symm_e(&theta);
+ sa = 0;
+ sa += ( test_sf_frac_diff( theta, M_PI/2.0 ) > TEST_TOL0 );
+ gsl_test(sa, " gsl_angle_restrict_symm_e: theta = -9/2 Pi");
+ s += sa;
+
+ theta = 3.0/2.0*M_PI + 3.0/2.0*DELTA;
+ gsl_sf_angle_restrict_symm_e(&theta);
+ sa = 0;
+ sa += ( test_sf_frac_diff( theta, -M_PI/2.0 ) > TEST_TOL0 );
+ gsl_test(sa, " gsl_angle_restrict_symm_e: theta = 3/2 Pi");
+ s += sa;
+
+ theta = -3.0/2.0*M_PI;
+ gsl_sf_angle_restrict_symm_e(&theta);
+ sa = 0;
+ sa += ( test_sf_frac_diff( theta, M_PI/2.0 ) > TEST_TOL0 );
+ gsl_test(sa, " gsl_angle_restrict_symm_e: theta = -3/2 Pi");
+ s += sa;
+
+ theta = 50000.0 + 1.0/65536.0;
+ gsl_sf_angle_restrict_symm_e(&theta);
+ sa = 0;
+ sa += ( test_sf_frac_diff( theta, -1.5886592763601208714 ) > TEST_TOL0 );
+ gsl_test(sa, " gsl_angle_restrict_symm_e: theta = 50000.0 + 1.0/65536.0");
+ s += sa;
+
+ return s;
+}
+
+
+/* I computed the values of zeta for s = -1e-10, 0, 1e-10 using the
+ Jensen formula,
+
+ zeta(s) = -1/2 + 1/(1-s)
+ + integ(sin(s arctan(t))/((1+t^2)^(s/2)(exp(2pi*t)-1)), t, 0, inf)
+
+ transforming the integral from a semi-infinite range to the range
+ [0,pi/2] using the substitution t = tan(u). After Taylor expansion
+ in s and numerical evaluation of the integrals this gave,
+
+ zeta(s) = 1/2 + 1/(1-s)
+ + (0.0810614667944862 +/- 2e-16) s
+ + (-3.17822795429232e-3 +/- 2e-17) s^2
+ + ....
+
+ for an expansion about s = 0 [BJG 7/01]
+*/
+
+int test_zeta(void)
+{
+ gsl_sf_result r;
+ int s = 0;
+
+ TEST_SF(s, gsl_sf_zeta_int_e, (-61.0, &r), -3.30660898765775767257e+34, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_zeta_int_e, (-8, &r), 0.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zeta_int_e, (-6, &r), 0.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zeta_int_e, (-5.0, &r), -0.003968253968253968253968, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_zeta_int_e, (-4, &r), 0.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zeta_int_e, (-3, &r), 1.0/120.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zeta_int_e, (-2, &r), 0.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zeta_int_e, (-1, &r), -1.0/12.0, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_zeta_int_e, ( 5.0, &r), 1.0369277551433699263313655, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zeta_int_e, (31.0, &r), 1.0000000004656629065033784, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_zetam1_int_e, (-61.0, &r), -3.30660898765775767257e+34, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zetam1_int_e, (-5.0, &r), -1.003968253968253968253968, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_zetam1_int_e, (-8, &r), -1.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zetam1_int_e, (-6, &r), -1.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zetam1_int_e, (-4, &r), -1.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zetam1_int_e, (-3, &r), -119.0/120.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zetam1_int_e, (-2, &r), -1.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zetam1_int_e, (-1, &r), -13.0/12.0, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_zetam1_int_e, ( 5.0, &r), 0.0369277551433699263313655, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zetam1_int_e, (31.0, &r), 0.0000000004656629065033784, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_zeta_e, (-151, &r), 8.195215221831378294e+143, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zeta_e, (-51, &r), 9.68995788746359406565e+24, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zeta_e, (-5, &r), -0.003968253968253968253968, TEST_TOL1, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_zeta_e, (-8, &r), 0.0, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zeta_e, (-6, &r), 0.0, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zeta_e, (-4, &r), 0.0, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zeta_e, (-3, &r), 1.0/120.0, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zeta_e, (-2, &r), 0.0, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zeta_e, (-1, &r), -1.0/12.0, TEST_TOL1, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_zeta_e, (-0.5, &r), -0.207886224977354566017307, TEST_TOL1, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_zeta_e, (-1e-10, &r), -0.49999999990810614668948, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zeta_e, (0.0, &r), -0.5, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zeta_e, (1e-10, &r), -0.50000000009189385333058, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_zeta_e, (0.5, &r), -1.460354508809586812889499, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zeta_e, (1.0-1.0/1024.0, &r), -1023.4228554489429787, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zeta_e, (1.0+1.0/1048576, &r), 1.0485765772157343441e+06, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zeta_e, (5.0, &r), 1.036927755143369926331365, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zeta_e, (25.5, &r), 1.000000021074106110269959, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_zetam1_e, (-8, &r), -1.0, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zetam1_e, (-6, &r), -1.0, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zetam1_e, (-4, &r), -1.0, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zetam1_e, (-3, &r), -119.0/120.0, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zetam1_e, (-2, &r), -1.0, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zetam1_e, (-1, &r), -13.0/12.0, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zetam1_e, (-0.5, &r), -1.207886224977354566017307, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zetam1_e, (-1e-10, &r), -1.49999999990810614668948, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zetam1_e, (0.0, &r), -1.5, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zetam1_e, (1e-10, &r), -1.50000000009189385333058, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_zetam1_e, (0.5, &r), -2.460354508809586812889499, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zetam1_e, (2.0, &r), 0.64493406684822643647, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zetam1_e, (3.0, &r), 0.20205690315959428540, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zetam1_e, (5.0, &r), 0.0369277551433699263314, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zetam1_e, (9.5, &r), 0.0014125906121736622712, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zetam1_e, (10.5, &r), 0.000700842641736155219500, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zetam1_e, (12.5, &r), 0.000173751733643178193390, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zetam1_e, (13.5, &r), 0.000086686727462338155188, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zetam1_e, (15.5, &r), 0.000021619904246069108133, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zetam1_e, (16.5, &r), 0.000010803124900178547671, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_zetam1_e, (25.5, &r), 0.000000021074106110269959, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_hzeta_e, (2, 1.0, &r), 1.6449340668482264365, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hzeta_e, (2, 10.0, &r), 0.1051663356816857461, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hzeta_e, (5, 1.0, &r), 1.0369277551433699263, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hzeta_e, (5, 10.0, &r), 0.000030413798676470276, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hzeta_e, (9, 0.1, &r), 1.0000000004253980e+09, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hzeta_e, (30, 0.5, &r), 1.0737418240000053e+09, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hzeta_e, (30, 0.9, &r), 2.3589824880264765e+01, TEST_TOL1, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hzeta_e, (75, 0.25, &r), 1.4272476927059599e+45, TEST_TOL1, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_eta_int_e, (-91, &r), -4.945598888750002040e+94, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_eta_int_e, (-51, &r), -4.363969073121683116e+40, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_eta_int_e, (-5, &r), 0.25, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_eta_int_e, (-1, &r), 0.25, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_eta_int_e, ( 0, &r), 0.5, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_eta_int_e, ( 5, &r), 0.9721197704469093059, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_eta_int_e, ( 6, &r), 0.9855510912974351041, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_eta_int_e, ( 20, &r), 0.9999990466115815221, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_eta_int_e, ( 1000, &r), 1.0, TEST_TOL0, GSL_SUCCESS);
+
+ TEST_SF(s, gsl_sf_eta_e, (-51.5, &r), -1.2524184036924703656e+41, TEST_TOL2, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_eta_e, (-5, &r), 0.25, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_eta_e, (0.5, &r), 0.6048986434216303702, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_eta_e, (0.999, &r), 0.6929872789683383574, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_eta_e, (1.0, &r), 0.6931471805599453094, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_eta_e, (1.0+1.0e-10, &r), 0.6931471805759321998, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_eta_e, ( 5, &r), 0.9721197704469093059, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_eta_e, ( 5.2, &r), 0.9755278712546684682, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_eta_e, ( 6, &r), 0.9855510912974351041, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_eta_e, ( 20, &r), 0.9999990466115815221, TEST_TOL0, GSL_SUCCESS);
+
+ return s;
+}
+
+int test_results(void)
+{
+ int s = 0;
+
+ gsl_sf_result_e10 re;
+ gsl_sf_result r;
+
+ re.val = -1.0;
+ re.err = 0.5;
+ re.e10 = 0;
+ gsl_sf_result_smash_e(&re, &r);
+ s += ( test_sf_frac_diff(r.val, -1.0) > TEST_TOL0 );
+ s += ( test_sf_frac_diff(r.err, 0.5) > TEST_TOL0 );
+
+ re.val = -1.0;
+ re.err = 0.5;
+ re.e10 = 10;
+ gsl_sf_result_smash_e(&re, &r);
+ s += ( test_sf_frac_diff(r.val, -1.0e+10) > TEST_TOL1 );
+ s += ( test_sf_frac_diff(r.err, 0.5e+10) > TEST_TOL1 );
+
+ re.val = 1.0;
+ re.err = 0.5;
+ re.e10 = 10000;
+ s += ( gsl_sf_result_smash_e(&re, &r) != GSL_EOVRFLW );
+
+ re.val = 1.0;
+ re.err = 0.5;
+ re.e10 = -10000;
+ s += ( gsl_sf_result_smash_e(&re, &r) != GSL_EUNDRFLW );
+
+ return s;
+}
+
+
+int main(int argc, char * argv[])
+{
+ gsl_ieee_env_setup ();
+ gsl_set_error_handler_off ();
+
+ gsl_test(test_airy(), "Airy Functions");
+ gsl_test(test_bessel(), "Bessel Functions");
+ gsl_test(test_clausen(), "Clausen Integral");
+ gsl_test(test_coulomb(), "Coulomb Wave Functions");
+ gsl_test(test_coupling(), "Coupling Coefficients");
+ gsl_test(test_dawson(), "Dawson Integral");
+ gsl_test(test_debye(), "Debye Functions");
+ gsl_test(test_dilog(), "Dilogarithm");
+ gsl_test(test_elementary(), "Elementary Functions (Misc)");
+ gsl_test(test_ellint(), "Elliptic Integrals");
+ gsl_test(test_jac(), "Elliptic Functions (Jacobi)");
+ gsl_test(test_erf(), "Error Functions");
+ gsl_test(test_exp(), "Exponential Functions");
+ gsl_test(test_expint(), "Exponential/Sine/Cosine Integrals");
+ gsl_test(test_fermidirac(), "Fermi-Dirac Functions");
+ gsl_test(test_gamma(), "Gamma Functions");
+ gsl_test(test_gegen(), "Gegenbauer Polynomials");
+ gsl_test(test_hyperg(), "Hypergeometric Functions");
+ gsl_test(test_laguerre(), "Laguerre Polynomials");
+ gsl_test(test_lambert(), "Lambert W Functions");
+ gsl_test(test_legendre(), "Legendre Functions");
+ gsl_test(test_log(), "Logarithm");
+ gsl_test(test_mathieu(), "Mathieu Functions");
+ gsl_test(test_pow_int(), "Integer Powers");
+ gsl_test(test_psi(), "Psi Functions");
+ gsl_test(test_psi_complex(), "Psi Function for complex argument");
+ gsl_test(test_synch(), "Synchrotron Functions");
+ gsl_test(test_transport(), "Transport Functions");
+ gsl_test(test_trig(), "Trigonometric and Related Functions");
+ gsl_test(test_zeta(), "Zeta Functions");
+
+ gsl_test(test_results(), "Result Methods");
+
+ exit (gsl_test_summary());
+}
diff --git a/gsl-1.9/specfunc/test_sf.h b/gsl-1.9/specfunc/test_sf.h
new file mode 100644
index 0000000..639d1b9
--- /dev/null
+++ b/gsl-1.9/specfunc/test_sf.h
@@ -0,0 +1,101 @@
+/* specfunc/test_sf.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#ifndef TEST_SF_H
+#define TEST_SF_H
+
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_machine.h>
+#include <gsl/gsl_sf_result.h>
+
+double test_sf_frac_diff(double x1, double x2);
+int test_sf_check_result(char * message_buff, gsl_sf_result r, double val, double tol);
+int test_sf_check_val(char * message_buff, double rval, double val, double tol);
+int test_sf_check_return(char * message_buff, int val_return, int expected_return);
+int test_sf_check_result_relax(char * message_buff, gsl_sf_result r, double val, double tol);
+
+/* Include an overall test factor to allow for differences between
+ compilers, otherwise there are too many bug reports on the released
+ versions. Turn this value down to 1.0 for development purposes */
+
+
+#ifndef TEST_FACTOR
+#if RELEASED
+#define TEST_FACTOR 100.0
+#else
+#define TEST_FACTOR 1.0
+#endif
+#endif
+
+#ifndef TEST_SIGMA
+#if RELEASED
+#define TEST_SIGMA 1.5
+#else
+#define TEST_SIGMA 1.0
+#endif
+#endif
+
+#define TEST_TOL0 (2.0*GSL_DBL_EPSILON)
+#define TEST_TOL1 (16.0*GSL_DBL_EPSILON)
+#define TEST_TOL2 (256.0*GSL_DBL_EPSILON)
+#define TEST_TOL3 (2048.0*GSL_DBL_EPSILON)
+#define TEST_TOL4 (16384.0*GSL_DBL_EPSILON)
+#define TEST_TOL5 (131072.0*GSL_DBL_EPSILON)
+#define TEST_TOL6 (1048576.0*GSL_DBL_EPSILON)
+#define TEST_SQRT_TOL0 (2.0*GSL_SQRT_DBL_EPSILON)
+#define TEST_SNGL (1.0e-06)
+
+#define TEST_SF_INCONS 1
+#define TEST_SF_ERRNEG 2
+#define TEST_SF_TOLBAD 4
+#define TEST_SF_RETBAD 8
+#define TEST_SF_ERRBAD 16
+
+int test_sf (gsl_sf_result r, double val_in, double tol, int status, int expect_return, const char * desc);
+int test_sf_val (double val, double val_in, double tol, const char * desc);
+int test_sf_rlx (gsl_sf_result r, double val_in, double tol, int status, int expect_return, const char * desc);
+int test_sf_2 (gsl_sf_result r1, double val1, double tol1, gsl_sf_result r2, double val2, double tol2, int status, int expect_return, const char * desc);
+int test_sf_sgn (gsl_sf_result r, double sgn, double val_in, double tol, double expect_sgn, int status, int expect_return, const char * desc);
+
+#define TEST_SF(stat, func, args, val_in, tol, expect_return) { int status = func args; stat += test_sf(r, val_in, tol, status, expect_return, #func #args); }
+
+#define TEST_SF_VAL(stat, func, args, val_in, tol) { double val = func args; stat += test_sf_val(val, val_in, tol, #func #args); }
+
+#define TEST_SF_RLX(stat, func, args, val_in, tol, expect_return) { int status = func args; stat += test_sf_rlx(r, val_in, tol, status, expect_return, #func #args); }
+
+#define TEST_SF_2(stat, func, args, val1, tol1, val2, tol2, expect_return) { int status = func args; stat += test_sf_2(r1, val1, tol1, r2, val2, tol2, status, expect_return, #func #args); }
+
+#define TEST_SF_SGN(stat, func, args, val_in, tol, expect_sgn, expect_return) { int status = func args; stat += test_sf_sgn(r, sgn, val_in, tol, expect_sgn, status, expect_return, #func #args); }
+
+#define TEST_SF_THETA(stat, func, args, val_in, tol) { int status; theta=args; status = func (&theta); stat += test_sf_val(theta, val_in, tol, #func #args); }
+
+int test_airy(void);
+int test_bessel(void);
+int test_coulomb(void);
+int test_dilog(void);
+int test_gamma(void);
+int test_mathieu(void);
+int test_hyperg(void);
+int test_legendre(void);
+
+
+#endif /* !TEST_SF_H */
diff --git a/gsl-1.9/specfunc/transport.c b/gsl-1.9/specfunc/transport.c
new file mode 100644
index 0000000..52dfe55
--- /dev/null
+++ b/gsl-1.9/specfunc/transport.c
@@ -0,0 +1,492 @@
+/* specfunc/transport.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_transport.h>
+
+#include "error.h"
+#include "check.h"
+
+#include "chebyshev.h"
+#include "cheb_eval.c"
+
+static double transport2_data[18] = {
+ 1.671760446434538503,
+ -0.147735359946794490,
+ 0.148213819946936338e-01,
+ -0.14195330326305613e-02,
+ 0.1306541324415708e-03,
+ -0.117155795867579e-04,
+ 0.10333498445756e-05,
+ -0.901911304223e-07,
+ 0.78177169833e-08,
+ -0.6744565684e-09,
+ 0.579946394e-10,
+ -0.49747619e-11,
+ 0.425961e-12,
+ -0.36422e-13,
+ 0.3111e-14,
+ -0.265e-15,
+ 0.23e-16,
+ -0.19e-17
+};
+static cheb_series transport2_cs = {
+ transport2_data,
+ 17,
+ -1, 1,
+ 9
+};
+
+static double transport3_data[18] = {
+ 0.762012543243872007,
+ -0.105674387705058533,
+ 0.119778084819657810e-01,
+ -0.12144015203698307e-02,
+ 0.1155099769392855e-03,
+ -0.105815992124423e-04,
+ 0.9474663385302e-06,
+ -0.836221212858e-07,
+ 0.73109099278e-08,
+ -0.6350594779e-09,
+ 0.549118282e-10,
+ -0.47321395e-11,
+ 0.4067695e-12,
+ -0.348971e-13,
+ 0.29892e-14,
+ -0.256e-15,
+ 0.219e-16,
+ -0.19e-17
+};
+static cheb_series transport3_cs = {
+ transport3_data,
+ 17,
+ -1, 1,
+ 9
+};
+
+
+static double transport4_data[18] = {
+ 0.4807570994615110579,
+ -0.8175378810321083956e-01,
+ 0.1002700665975162973e-01,
+ -0.10599339359820151e-02,
+ 0.1034506245030405e-03,
+ -0.96442705485899e-05,
+ 0.8745544408515e-06,
+ -0.779321207981e-07,
+ 0.68649886141e-08,
+ -0.5999571076e-09,
+ 0.521366241e-10,
+ -0.45118382e-11,
+ 0.3892159e-12,
+ -0.334936e-13,
+ 0.28767e-14,
+ -0.2467e-15,
+ 0.211e-16,
+ -0.18e-17
+};
+static cheb_series transport4_cs = {
+ transport4_data,
+ 17,
+ -1, 1,
+ 9
+};
+
+
+static double transport5_data[18] = {
+ 0.347777777133910789,
+ -0.66456988976050428e-01,
+ 0.8611072656883309e-02,
+ -0.9396682223755538e-03,
+ 0.936324806081513e-04,
+ -0.88571319340833e-05,
+ 0.811914989145e-06,
+ -0.72957654233e-07,
+ 0.646971455e-08,
+ -0.568490283e-09,
+ 0.49625598e-10,
+ -0.4310940e-11,
+ 0.373100e-12,
+ -0.32198e-13,
+ 0.2772e-14,
+ -0.238e-15,
+ 0.21e-16,
+ -0.18e-17
+};
+static cheb_series transport5_cs = {
+ transport5_data,
+ 17,
+ -1, 1,
+ 9
+};
+
+
+static
+double
+transport_sumexp(const int numexp, const int order, const double t, double x)
+{
+ double rk = (double)numexp;
+ double sumexp = 0.0;
+ int k;
+ for(k=1; k<=numexp; k++) {
+ double sum2 = 1.0;
+ double xk = 1.0/(rk*x);
+ double xk1 = 1.0;
+ int j;
+ for(j=1; j<=order; j++) {
+ sum2 = sum2*xk1*xk + 1.0;
+ xk1 += 1.0;
+ }
+ sumexp *= t;
+ sumexp += sum2;
+ rk -= 1.0;
+ }
+ return sumexp;
+}
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+int
+gsl_sf_transport_2_e(const double x, gsl_sf_result * result)
+{
+ const double val_infinity = 3.289868133696452873;
+
+ /* CHECK_POINTER(result) */
+
+ if(x < 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x < 3.0*GSL_SQRT_DBL_EPSILON) {
+ result->val = x;
+ result->err = GSL_DBL_EPSILON*fabs(x) + x*x/2.0;
+ return GSL_SUCCESS;
+ }
+ else if(x <= 4.0) {
+ double t = (x*x/8.0 - 0.5) - 0.5;
+ gsl_sf_result result_c;
+ cheb_eval_e(&transport2_cs, t, &result_c);
+ result->val = x * result_c.val;
+ result->err = x * result_c.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x < -GSL_LOG_DBL_EPSILON) {
+ const int numexp = (int)((-GSL_LOG_DBL_EPSILON)/x) + 1;
+ const double sumexp = transport_sumexp(numexp, 2, exp(-x), x);
+ const double t = 2.0 * log(x) - x + log(sumexp);
+ if(t < GSL_LOG_DBL_EPSILON) {
+ result->val = val_infinity;
+ result->err = 2.0 * GSL_DBL_EPSILON * val_infinity;
+ }
+ else {
+ const double et = exp(t);
+ result->val = val_infinity - et;
+ result->err = 2.0 * GSL_DBL_EPSILON * (val_infinity + fabs(t) * et);
+ }
+ return GSL_SUCCESS;
+ }
+ else if(x < 2.0/GSL_DBL_EPSILON) {
+ const int numexp = 1;
+ const double sumexp = transport_sumexp(numexp, 2, 1.0, x);
+ const double t = 2.0 * log(x) - x + log(sumexp);
+ if(t < GSL_LOG_DBL_EPSILON) {
+ result->val = val_infinity;
+ result->err = 2.0 * GSL_DBL_EPSILON * val_infinity;
+ }
+ else {
+ const double et = exp(t);
+ result->val = val_infinity - et;
+ result->err = 2.0 * GSL_DBL_EPSILON * (val_infinity + (fabs(t)+1.0) * et);
+ }
+ return GSL_SUCCESS;
+ }
+ else {
+ const double t = 2.0 * log(x) - x;
+ if(t < GSL_LOG_DBL_EPSILON) {
+ result->val = val_infinity;
+ result->err = 2.0 * GSL_DBL_EPSILON * val_infinity;
+ }
+ else {
+ const double et = exp(t);
+ result->val = val_infinity - et;
+ result->err = 2.0 * GSL_DBL_EPSILON * (val_infinity + (fabs(t)+1.0) * et);
+ }
+ return GSL_SUCCESS;
+ }
+}
+
+
+int
+gsl_sf_transport_3_e(const double x, gsl_sf_result * result)
+{
+ const double val_infinity = 7.212341418957565712;
+
+ /* CHECK_POINTER(result) */
+
+ if(x < 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x == 0.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(x < 3.0*GSL_SQRT_DBL_EPSILON) {
+ result->val = 0.5*x*x;
+ result->err = 2.0 * GSL_DBL_EPSILON * result->val;
+ CHECK_UNDERFLOW(result);
+ return GSL_SUCCESS;
+ }
+ else if(x <= 4.0) {
+ const double x2 = x*x;
+ const double t = (x2/8.0 - 0.5) - 0.5;
+ gsl_sf_result result_c;
+ cheb_eval_e(&transport3_cs, t, &result_c);
+ result->val = x2 * result_c.val;
+ result->err = x2 * result_c.err;
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x < -GSL_LOG_DBL_EPSILON) {
+ const int numexp = (int)((-GSL_LOG_DBL_EPSILON)/x) + 1;
+ const double sumexp = transport_sumexp(numexp, 3, exp(-x), x);
+ const double t = 3.0 * log(x) - x + log(sumexp);
+ if(t < GSL_LOG_DBL_EPSILON) {
+ result->val = val_infinity;
+ result->err = 2.0 * GSL_DBL_EPSILON * val_infinity;
+ }
+ else {
+ const double et = exp(t);
+ result->val = val_infinity - et;
+ result->err = 2.0 * GSL_DBL_EPSILON * (val_infinity + fabs(t) * et);
+ }
+ return GSL_SUCCESS;
+ }
+ else if(x < 3.0/GSL_DBL_EPSILON) {
+ const int numexp = 1;
+ const double sumexp = transport_sumexp(numexp, 3, 1.0, x);
+ const double t = 3.0 * log(x) - x + log(sumexp);
+ if(t < GSL_LOG_DBL_EPSILON) {
+ result->val = val_infinity;
+ result->err = 2.0 * GSL_DBL_EPSILON * val_infinity;
+ }
+ else {
+ const double et = exp(t);
+ result->val = val_infinity - et;
+ result->err = 2.0 * GSL_DBL_EPSILON * (val_infinity + (fabs(t)+1.0) * et);
+ }
+ return GSL_SUCCESS;
+ }
+ else {
+ const double t = 3.0 * log(x) - x;
+ if(t < GSL_LOG_DBL_EPSILON) {
+ result->val = val_infinity;
+ result->err = 2.0 * GSL_DBL_EPSILON * val_infinity;
+ }
+ else {
+ const double et = exp(t);
+ result->val = val_infinity - et;
+ result->err = 2.0 * GSL_DBL_EPSILON * (val_infinity + (fabs(t)+1.0) * et);
+ }
+ return GSL_SUCCESS;
+ }
+}
+
+
+int
+gsl_sf_transport_4_e(const double x, gsl_sf_result * result)
+{
+ const double val_infinity = 25.97575760906731660;
+
+ /* CHECK_POINTER(result) */
+
+ if(x < 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x == 0.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(x < 3.0*GSL_SQRT_DBL_EPSILON) {
+ result->val = x*x*x/3.0;
+ result->err = 3.0 * GSL_DBL_EPSILON * result->val;
+ CHECK_UNDERFLOW(result);
+ return GSL_SUCCESS;
+ }
+ else if(x <= 4.0) {
+ const double x2 = x*x;
+ const double t = (x2/8.0 - 0.5) - 0.5;
+ gsl_sf_result result_c;
+ cheb_eval_e(&transport4_cs, t, &result_c);
+ result->val = x2*x * result_c.val;
+ result->err = x2*x * result_c.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x < -GSL_LOG_DBL_EPSILON) {
+ const int numexp = (int)((-GSL_LOG_DBL_EPSILON)/x) + 1;
+ const double sumexp = transport_sumexp(numexp, 4, exp(-x), x);
+ const double t = 4.0 * log(x) - x + log(sumexp);
+ if(t < GSL_LOG_DBL_EPSILON) {
+ result->val = val_infinity;
+ result->err = 2.0 * GSL_DBL_EPSILON * val_infinity;
+ }
+ else {
+ const double et = exp(t);
+ result->val = val_infinity - et;
+ result->err = 2.0 * GSL_DBL_EPSILON * (val_infinity + (fabs(t)+1.0) * et);
+ }
+ return GSL_SUCCESS;
+ }
+ else if(x < 3.0/GSL_DBL_EPSILON) {
+ const int numexp = 1;
+ const double sumexp = transport_sumexp(numexp, 4, 1.0, x);
+ const double t = 4.0 * log(x) - x + log(sumexp);
+ if(t < GSL_LOG_DBL_EPSILON) {
+ result->val = val_infinity;
+ result->err = 2.0 * GSL_DBL_EPSILON * val_infinity;
+ }
+ else {
+ const double et = exp(t);
+ result->val = val_infinity - et;
+ result->err = 2.0 * GSL_DBL_EPSILON * (val_infinity + (fabs(t)+1.0) * et);
+ }
+ return GSL_SUCCESS;
+ }
+ else {
+ const double t = 4.0 * log(x) - x;
+ if(t < GSL_LOG_DBL_EPSILON) {
+ result->val = val_infinity;
+ result->err = 2.0 * GSL_DBL_EPSILON * val_infinity;
+ }
+ else {
+ const double et = exp(t);
+ result->val = val_infinity - et;
+ result->err = 2.0 * GSL_DBL_EPSILON * (val_infinity + (fabs(t)+1.0) * et);
+ }
+ return GSL_SUCCESS;
+ }
+}
+
+
+int
+gsl_sf_transport_5_e(const double x, gsl_sf_result * result)
+{
+ const double val_infinity = 124.4313306172043912;
+
+ /* CHECK_POINTER(result) */
+
+ if(x < 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(x == 0.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(x < 3.0*GSL_SQRT_DBL_EPSILON) {
+ result->val = x*x*x*x/4.0;
+ result->err = 4.0 * GSL_DBL_EPSILON * result->val;
+ CHECK_UNDERFLOW(result);
+ return GSL_SUCCESS;
+ }
+ else if(x <= 4.0) {
+ const double x2 = x*x;
+ const double t = (x2/8.0 - 0.5) - 0.5;
+ gsl_sf_result result_c;
+ cheb_eval_e(&transport5_cs, t, &result_c);
+ result->val = x2*x2 * result_c.val;
+ result->err = x2*x2 * result_c.err;
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x < -GSL_LOG_DBL_EPSILON) {
+ const int numexp = (int)((-GSL_LOG_DBL_EPSILON)/x) + 1;
+ const double sumexp = transport_sumexp(numexp, 5, exp(-x), x);
+ const double t = 5.0 * log(x) - x + log(sumexp);
+ if(t < GSL_LOG_DBL_EPSILON) {
+ result->val = val_infinity;
+ result->err = 2.0 * GSL_DBL_EPSILON * val_infinity;
+ }
+ else {
+ const double et = exp(t);
+ result->val = val_infinity - et;
+ result->err = 2.0 * GSL_DBL_EPSILON * (val_infinity + (fabs(t)+1.0) * et);
+ }
+ return GSL_SUCCESS;
+ }
+ else if(x < 3.0/GSL_DBL_EPSILON) {
+ const int numexp = 1;
+ const double sumexp = transport_sumexp(numexp, 5, 1.0, x);
+ const double t = 5.0 * log(x) - x + log(sumexp);
+ if(t < GSL_LOG_DBL_EPSILON) {
+ result->val = val_infinity;
+ result->err = 2.0 * GSL_DBL_EPSILON * val_infinity;
+ }
+ else {
+ const double et = exp(t);
+ result->val = val_infinity - et;
+ result->err = 2.0 * GSL_DBL_EPSILON * (val_infinity + (fabs(t)+1.0) * et);
+ }
+ return GSL_SUCCESS;
+ }
+ else {
+ const double t = 5.0 * log(x) - x;
+ if(t < GSL_LOG_DBL_EPSILON) {
+ result->val = val_infinity;
+ result->err = 2.0 * GSL_DBL_EPSILON * val_infinity;
+ }
+ else {
+ const double et = exp(t);
+ result->val = val_infinity - et;
+ result->err = 2.0 * GSL_DBL_EPSILON * (val_infinity + (fabs(t)+1.0) * et);
+ }
+ return GSL_SUCCESS;
+ }
+}
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_transport_2(const double x)
+{
+ EVAL_RESULT(gsl_sf_transport_2_e(x, &result));
+}
+
+double gsl_sf_transport_3(const double x)
+{
+ EVAL_RESULT(gsl_sf_transport_3_e(x, &result));
+}
+
+double gsl_sf_transport_4(const double x)
+{
+ EVAL_RESULT(gsl_sf_transport_4_e(x, &result));
+}
+
+double gsl_sf_transport_5(const double x)
+{
+ EVAL_RESULT(gsl_sf_transport_5_e(x, &result));
+}
diff --git a/gsl-1.9/specfunc/trig.c b/gsl-1.9/specfunc/trig.c
new file mode 100644
index 0000000..a604cd8
--- /dev/null
+++ b/gsl-1.9/specfunc/trig.c
@@ -0,0 +1,771 @@
+/* specfunc/trig.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_log.h>
+#include <gsl/gsl_sf_trig.h>
+
+#include "error.h"
+
+#include "chebyshev.h"
+#include "cheb_eval.c"
+
+/* sinh(x) series
+ * double-precision for |x| < 1.0
+ */
+inline
+static
+int
+sinh_series(const double x, double * result)
+{
+ const double y = x*x;
+ const double c0 = 1.0/6.0;
+ const double c1 = 1.0/120.0;
+ const double c2 = 1.0/5040.0;
+ const double c3 = 1.0/362880.0;
+ const double c4 = 1.0/39916800.0;
+ const double c5 = 1.0/6227020800.0;
+ const double c6 = 1.0/1307674368000.0;
+ const double c7 = 1.0/355687428096000.0;
+ *result = x*(1.0 + y*(c0+y*(c1+y*(c2+y*(c3+y*(c4+y*(c5+y*(c6+y*c7))))))));
+ return GSL_SUCCESS;
+}
+
+
+/* cosh(x)-1 series
+ * double-precision for |x| < 1.0
+ */
+inline
+static
+int
+cosh_m1_series(const double x, double * result)
+{
+ const double y = x*x;
+ const double c0 = 0.5;
+ const double c1 = 1.0/24.0;
+ const double c2 = 1.0/720.0;
+ const double c3 = 1.0/40320.0;
+ const double c4 = 1.0/3628800.0;
+ const double c5 = 1.0/479001600.0;
+ const double c6 = 1.0/87178291200.0;
+ const double c7 = 1.0/20922789888000.0;
+ const double c8 = 1.0/6402373705728000.0;
+ *result = y*(c0+y*(c1+y*(c2+y*(c3+y*(c4+y*(c5+y*(c6+y*(c7+y*c8))))))));
+ return GSL_SUCCESS;
+}
+
+
+/* Chebyshev expansion for f(t) = sinc((t+1)/2), -1 < t < 1
+ */
+static double sinc_data[17] = {
+ 1.133648177811747875422,
+ -0.532677564732557348781,
+ -0.068293048346633177859,
+ 0.033403684226353715020,
+ 0.001485679893925747818,
+ -0.000734421305768455295,
+ -0.000016837282388837229,
+ 0.000008359950146618018,
+ 0.000000117382095601192,
+ -0.000000058413665922724,
+ -0.000000000554763755743,
+ 0.000000000276434190426,
+ 0.000000000001895374892,
+ -0.000000000000945237101,
+ -0.000000000000004900690,
+ 0.000000000000002445383,
+ 0.000000000000000009925
+};
+static cheb_series sinc_cs = {
+ sinc_data,
+ 16,
+ -1, 1,
+ 10
+};
+
+
+/* Chebyshev expansion for f(t) = g((t+1)Pi/8), -1<t<1
+ * g(x) = (sin(x)/x - 1)/(x*x)
+ */
+static double sin_data[12] = {
+ -0.3295190160663511504173,
+ 0.0025374284671667991990,
+ 0.0006261928782647355874,
+ -4.6495547521854042157541e-06,
+ -5.6917531549379706526677e-07,
+ 3.7283335140973803627866e-09,
+ 3.0267376484747473727186e-10,
+ -1.7400875016436622322022e-12,
+ -1.0554678305790849834462e-13,
+ 5.3701981409132410797062e-16,
+ 2.5984137983099020336115e-17,
+ -1.1821555255364833468288e-19
+};
+static cheb_series sin_cs = {
+ sin_data,
+ 11,
+ -1, 1,
+ 11
+};
+
+/* Chebyshev expansion for f(t) = g((t+1)Pi/8), -1<t<1
+ * g(x) = (2(cos(x) - 1)/(x^2) + 1) / x^2
+ */
+static double cos_data[11] = {
+ 0.165391825637921473505668118136,
+ -0.00084852883845000173671196530195,
+ -0.000210086507222940730213625768083,
+ 1.16582269619760204299639757584e-6,
+ 1.43319375856259870334412701165e-7,
+ -7.4770883429007141617951330184e-10,
+ -6.0969994944584252706997438007e-11,
+ 2.90748249201909353949854872638e-13,
+ 1.77126739876261435667156490461e-14,
+ -7.6896421502815579078577263149e-17,
+ -3.7363121133079412079201377318e-18
+};
+static cheb_series cos_cs = {
+ cos_data,
+ 10,
+ -1, 1,
+ 10
+};
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+/* I would have prefered just using the library sin() function.
+ * But after some experimentation I decided that there was
+ * no good way to understand the error; library sin() is just a black box.
+ * So we have to roll our own.
+ */
+int
+gsl_sf_sin_e(double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ {
+ const double P1 = 7.85398125648498535156e-1;
+ const double P2 = 3.77489470793079817668e-8;
+ const double P3 = 2.69515142907905952645e-15;
+
+ const double sgn_x = GSL_SIGN(x);
+ const double abs_x = fabs(x);
+
+ if(abs_x < GSL_ROOT4_DBL_EPSILON) {
+ const double x2 = x*x;
+ result->val = x * (1.0 - x2/6.0);
+ result->err = fabs(x*x2*x2 / 100.0);
+ return GSL_SUCCESS;
+ }
+ else {
+ double sgn_result = sgn_x;
+ double y = floor(abs_x/(0.25*M_PI));
+ int octant = y - ldexp(floor(ldexp(y,-3)),3);
+ int stat_cs;
+ double z;
+
+ if(GSL_IS_ODD(octant)) {
+ octant += 1;
+ octant &= 07;
+ y += 1.0;
+ }
+
+ if(octant > 3) {
+ octant -= 4;
+ sgn_result = -sgn_result;
+ }
+
+ z = ((abs_x - y * P1) - y * P2) - y * P3;
+
+ if(octant == 0) {
+ gsl_sf_result sin_cs_result;
+ const double t = 8.0*fabs(z)/M_PI - 1.0;
+ stat_cs = cheb_eval_e(&sin_cs, t, &sin_cs_result);
+ result->val = z * (1.0 + z*z * sin_cs_result.val);
+ }
+ else { /* octant == 2 */
+ gsl_sf_result cos_cs_result;
+ const double t = 8.0*fabs(z)/M_PI - 1.0;
+ stat_cs = cheb_eval_e(&cos_cs, t, &cos_cs_result);
+ result->val = 1.0 - 0.5*z*z * (1.0 - z*z * cos_cs_result.val);
+ }
+
+ result->val *= sgn_result;
+
+ if(abs_x > 1.0/GSL_DBL_EPSILON) {
+ result->err = fabs(result->val);
+ }
+ else if(abs_x > 100.0/GSL_SQRT_DBL_EPSILON) {
+ result->err = 2.0 * abs_x * GSL_DBL_EPSILON * fabs(result->val);
+ }
+ else if(abs_x > 0.1/GSL_SQRT_DBL_EPSILON) {
+ result->err = 2.0 * GSL_SQRT_DBL_EPSILON * fabs(result->val);
+ }
+ else {
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ }
+
+ return stat_cs;
+ }
+ }
+}
+
+
+int
+gsl_sf_cos_e(double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ {
+ const double P1 = 7.85398125648498535156e-1;
+ const double P2 = 3.77489470793079817668e-8;
+ const double P3 = 2.69515142907905952645e-15;
+
+ const double abs_x = fabs(x);
+
+ if(abs_x < GSL_ROOT4_DBL_EPSILON) {
+ const double x2 = x*x;
+ result->val = 1.0 - 0.5*x2;
+ result->err = fabs(x2*x2/12.0);
+ return GSL_SUCCESS;
+ }
+ else {
+ double sgn_result = 1.0;
+ double y = floor(abs_x/(0.25*M_PI));
+ int octant = y - ldexp(floor(ldexp(y,-3)),3);
+ int stat_cs;
+ double z;
+
+ if(GSL_IS_ODD(octant)) {
+ octant += 1;
+ octant &= 07;
+ y += 1.0;
+ }
+
+ if(octant > 3) {
+ octant -= 4;
+ sgn_result = -sgn_result;
+ }
+
+ if(octant > 1) {
+ sgn_result = -sgn_result;
+ }
+
+ z = ((abs_x - y * P1) - y * P2) - y * P3;
+
+ if(octant == 0) {
+ gsl_sf_result cos_cs_result;
+ const double t = 8.0*fabs(z)/M_PI - 1.0;
+ stat_cs = cheb_eval_e(&cos_cs, t, &cos_cs_result);
+ result->val = 1.0 - 0.5*z*z * (1.0 - z*z * cos_cs_result.val);
+ }
+ else { /* octant == 2 */
+ gsl_sf_result sin_cs_result;
+ const double t = 8.0*fabs(z)/M_PI - 1.0;
+ stat_cs = cheb_eval_e(&sin_cs, t, &sin_cs_result);
+ result->val = z * (1.0 + z*z * sin_cs_result.val);
+ }
+
+ result->val *= sgn_result;
+
+ if(abs_x > 1.0/GSL_DBL_EPSILON) {
+ result->err = fabs(result->val);
+ }
+ else if(abs_x > 100.0/GSL_SQRT_DBL_EPSILON) {
+ result->err = 2.0 * abs_x * GSL_DBL_EPSILON * fabs(result->val);
+ }
+ else if(abs_x > 0.1/GSL_SQRT_DBL_EPSILON) {
+ result->err = 2.0 * GSL_SQRT_DBL_EPSILON * fabs(result->val);
+ }
+ else {
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ }
+
+ return stat_cs;
+ }
+ }
+}
+
+
+int
+gsl_sf_hypot_e(const double x, const double y, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x == 0.0 && y == 0.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else {
+ const double a = fabs(x);
+ const double b = fabs(y);
+ const double min = GSL_MIN_DBL(a,b);
+ const double max = GSL_MAX_DBL(a,b);
+ const double rat = min/max;
+ const double root_term = sqrt(1.0 + rat*rat);
+
+ if(max < GSL_DBL_MAX/root_term) {
+ result->val = max * root_term;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ OVERFLOW_ERROR(result);
+ }
+ }
+}
+
+
+int
+gsl_sf_complex_sin_e(const double zr, const double zi,
+ gsl_sf_result * szr, gsl_sf_result * szi)
+{
+ /* CHECK_POINTER(szr) */
+ /* CHECK_POINTER(szi) */
+
+ if(fabs(zi) < 1.0) {
+ double ch_m1, sh;
+ sinh_series(zi, &sh);
+ cosh_m1_series(zi, &ch_m1);
+ szr->val = sin(zr)*(ch_m1 + 1.0);
+ szi->val = cos(zr)*sh;
+ szr->err = 2.0 * GSL_DBL_EPSILON * fabs(szr->val);
+ szi->err = 2.0 * GSL_DBL_EPSILON * fabs(szi->val);
+ return GSL_SUCCESS;
+ }
+ else if(fabs(zi) < GSL_LOG_DBL_MAX) {
+ double ex = exp(zi);
+ double ch = 0.5*(ex+1.0/ex);
+ double sh = 0.5*(ex-1.0/ex);
+ szr->val = sin(zr)*ch;
+ szi->val = cos(zr)*sh;
+ szr->err = 2.0 * GSL_DBL_EPSILON * fabs(szr->val);
+ szi->err = 2.0 * GSL_DBL_EPSILON * fabs(szi->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ OVERFLOW_ERROR_2(szr, szi);
+ }
+}
+
+
+int
+gsl_sf_complex_cos_e(const double zr, const double zi,
+ gsl_sf_result * czr, gsl_sf_result * czi)
+{
+ /* CHECK_POINTER(czr) */
+ /* CHECK_POINTER(czi) */
+
+ if(fabs(zi) < 1.0) {
+ double ch_m1, sh;
+ sinh_series(zi, &sh);
+ cosh_m1_series(zi, &ch_m1);
+ czr->val = cos(zr)*(ch_m1 + 1.0);
+ czi->val = -sin(zr)*sh;
+ czr->err = 2.0 * GSL_DBL_EPSILON * fabs(czr->val);
+ czi->err = 2.0 * GSL_DBL_EPSILON * fabs(czi->val);
+ return GSL_SUCCESS;
+ }
+ else if(fabs(zi) < GSL_LOG_DBL_MAX) {
+ double ex = exp(zi);
+ double ch = 0.5*(ex+1.0/ex);
+ double sh = 0.5*(ex-1.0/ex);
+ czr->val = cos(zr)*ch;
+ czi->val = -sin(zr)*sh;
+ czr->err = 2.0 * GSL_DBL_EPSILON * fabs(czr->val);
+ czi->err = 2.0 * GSL_DBL_EPSILON * fabs(czi->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ OVERFLOW_ERROR_2(czr,czi);
+ }
+}
+
+
+int
+gsl_sf_complex_logsin_e(const double zr, const double zi,
+ gsl_sf_result * lszr, gsl_sf_result * lszi)
+{
+ /* CHECK_POINTER(lszr) */
+ /* CHECK_POINTER(lszi) */
+
+ if(zi > 60.0) {
+ lszr->val = -M_LN2 + zi;
+ lszi->val = 0.5*M_PI - zr;
+ lszr->err = 2.0 * GSL_DBL_EPSILON * fabs(lszr->val);
+ lszi->err = 2.0 * GSL_DBL_EPSILON * fabs(lszi->val);
+ }
+ else if(zi < -60.0) {
+ lszr->val = -M_LN2 - zi;
+ lszi->val = -0.5*M_PI + zr;
+ lszr->err = 2.0 * GSL_DBL_EPSILON * fabs(lszr->val);
+ lszi->err = 2.0 * GSL_DBL_EPSILON * fabs(lszi->val);
+ }
+ else {
+ gsl_sf_result sin_r, sin_i;
+ int status;
+ gsl_sf_complex_sin_e(zr, zi, &sin_r, &sin_i); /* ok by construction */
+ status = gsl_sf_complex_log_e(sin_r.val, sin_i.val, lszr, lszi);
+ if(status == GSL_EDOM) {
+ DOMAIN_ERROR_2(lszr, lszi);
+ }
+ }
+ return gsl_sf_angle_restrict_symm_e(&(lszi->val));
+}
+
+
+int
+gsl_sf_lnsinh_e(const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(x <= 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(fabs(x) < 1.0) {
+ double eps;
+ sinh_series(x, &eps);
+ result->val = log(eps);
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(x < -0.5*GSL_LOG_DBL_EPSILON) {
+ result->val = x + log(0.5*(1.0 - exp(-2.0*x)));
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ result->val = -M_LN2 + x;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+}
+
+
+int gsl_sf_lncosh_e(const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(fabs(x) < 1.0) {
+ double eps;
+ cosh_m1_series(x, &eps);
+ return gsl_sf_log_1plusx_e(eps, result);
+ }
+ else if(x < -0.5*GSL_LOG_DBL_EPSILON) {
+ result->val = x + log(0.5*(1.0 + exp(-2.0*x)));
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ result->val = -M_LN2 + x;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+}
+
+
+/*
+inline int gsl_sf_sincos_e(const double theta, double * s, double * c)
+{
+ double tan_half = tan(0.5 * theta);
+ double den = 1. + tan_half*tan_half;
+ double cos_theta = (1.0 - tan_half*tan_half) / den;
+ double sin_theta = 2.0 * tan_half / den;
+}
+*/
+
+int
+gsl_sf_polar_to_rect(const double r, const double theta,
+ gsl_sf_result * x, gsl_sf_result * y)
+{
+ double t = theta;
+ int status = gsl_sf_angle_restrict_symm_e(&t);
+ double c = cos(t);
+ double s = sin(t);
+ x->val = r * cos(t);
+ y->val = r * sin(t);
+ x->err = r * fabs(s * GSL_DBL_EPSILON * t);
+ x->err += 2.0 * GSL_DBL_EPSILON * fabs(x->val);
+ y->err = r * fabs(c * GSL_DBL_EPSILON * t);
+ y->err += 2.0 * GSL_DBL_EPSILON * fabs(y->val);
+ return status;
+}
+
+
+int
+gsl_sf_rect_to_polar(const double x, const double y,
+ gsl_sf_result * r, gsl_sf_result * theta)
+{
+ int stat_h = gsl_sf_hypot_e(x, y, r);
+ if(r->val > 0.0) {
+ theta->val = atan2(y, x);
+ theta->err = 2.0 * GSL_DBL_EPSILON * fabs(theta->val);
+ return stat_h;
+ }
+ else {
+ DOMAIN_ERROR(theta);
+ }
+}
+
+
+int gsl_sf_angle_restrict_symm_err_e(const double theta, gsl_sf_result * result)
+{
+ /* synthetic extended precision constants */
+ const double P1 = 4 * 7.8539812564849853515625e-01;
+ const double P2 = 4 * 3.7748947079307981766760e-08;
+ const double P3 = 4 * 2.6951514290790594840552e-15;
+ const double TwoPi = 2*(P1 + P2 + P3);
+
+ const double y = GSL_SIGN(theta) * 2 * floor(fabs(theta)/TwoPi);
+ double r = ((theta - y*P1) - y*P2) - y*P3;
+
+ if(r > M_PI) { r = (((r-2*P1)-2*P2)-2*P3); } /* r-TwoPi */
+ else if (r < -M_PI) r = (((r+2*P1)+2*P2)+2*P3); /* r+TwoPi */
+
+ result->val = r;
+
+ if(fabs(theta) > 0.0625/GSL_DBL_EPSILON) {
+ result->val = GSL_NAN;
+ result->err = GSL_NAN;
+ GSL_ERROR ("error", GSL_ELOSS);
+ }
+ else if(fabs(theta) > 0.0625/GSL_SQRT_DBL_EPSILON) {
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val - theta);
+ return GSL_SUCCESS;
+ }
+ else {
+ double delta = fabs(result->val - theta);
+ result->err = 2.0 * GSL_DBL_EPSILON * ((delta < M_PI) ? delta : M_PI);
+ return GSL_SUCCESS;
+ }
+}
+
+
+int gsl_sf_angle_restrict_pos_err_e(const double theta, gsl_sf_result * result)
+{
+ /* synthetic extended precision constants */
+ const double P1 = 4 * 7.85398125648498535156e-01;
+ const double P2 = 4 * 3.77489470793079817668e-08;
+ const double P3 = 4 * 2.69515142907905952645e-15;
+ const double TwoPi = 2*(P1 + P2 + P3);
+
+ const double y = 2*floor(theta/TwoPi);
+
+ double r = ((theta - y*P1) - y*P2) - y*P3;
+
+ if(r > TwoPi) {r = (((r-2*P1)-2*P2)-2*P3); } /* r-TwoPi */
+ else if (r < 0) { /* may happen due to FP rounding */
+ r = (((r+2*P1)+2*P2)+2*P3); /* r+TwoPi */
+ }
+
+ result->val = r;
+
+ if(fabs(theta) > 0.0625/GSL_DBL_EPSILON) {
+ result->val = GSL_NAN;
+ result->err = fabs(result->val);
+ GSL_ERROR ("error", GSL_ELOSS);
+ }
+ else if(fabs(theta) > 0.0625/GSL_SQRT_DBL_EPSILON) {
+ result->err = GSL_DBL_EPSILON * fabs(result->val - theta);
+ return GSL_SUCCESS;
+ }
+ else {
+ double delta = fabs(result->val - theta);
+ result->err = 2.0 * GSL_DBL_EPSILON * ((delta < M_PI) ? delta : M_PI);
+ return GSL_SUCCESS;
+ }
+}
+
+
+int gsl_sf_angle_restrict_symm_e(double * theta)
+{
+ gsl_sf_result r;
+ int stat = gsl_sf_angle_restrict_symm_err_e(*theta, &r);
+ *theta = r.val;
+ return stat;
+}
+
+
+int gsl_sf_angle_restrict_pos_e(double * theta)
+{
+ gsl_sf_result r;
+ int stat = gsl_sf_angle_restrict_pos_err_e(*theta, &r);
+ *theta = r.val;
+ return stat;
+}
+
+
+int gsl_sf_sin_err_e(const double x, const double dx, gsl_sf_result * result)
+{
+ int stat_s = gsl_sf_sin_e(x, result);
+ result->err += fabs(cos(x) * dx);
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+ return stat_s;
+}
+
+
+int gsl_sf_cos_err_e(const double x, const double dx, gsl_sf_result * result)
+{
+ int stat_c = gsl_sf_cos_e(x, result);
+ result->err += fabs(sin(x) * dx);
+ result->err += GSL_DBL_EPSILON * fabs(result->val);
+ return stat_c;
+}
+
+
+#if 0
+int
+gsl_sf_sin_pi_x_e(const double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(-100.0 < x && x < 100.0) {
+ result->val = sin(M_PI * x) / (M_PI * x);
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ const double N = floor(x + 0.5);
+ const double f = x - N;
+
+ if(N < INT_MAX && N > INT_MIN) {
+ /* Make it an integer if we can. Saves another
+ * call to floor().
+ */
+ const int intN = (int)N;
+ const double sign = ( GSL_IS_ODD(intN) ? -1.0 : 1.0 );
+ result->val = sign * sin(M_PI * f);
+ result->err = GSL_DBL_EPSILON * fabs(result->val);
+ }
+ else if(N > 2.0/GSL_DBL_EPSILON || N < -2.0/GSL_DBL_EPSILON) {
+ /* All integer-valued floating point numbers
+ * bigger than 2/eps=2^53 are actually even.
+ */
+ result->val = 0.0;
+ result->err = 0.0;
+ }
+ else {
+ const double resN = N - 2.0*floor(0.5*N); /* 0 for even N, 1 for odd N */
+ const double sign = ( fabs(resN) > 0.5 ? -1.0 : 1.0 );
+ result->val = sign * sin(M_PI*f);
+ result->err = GSL_DBL_EPSILON * fabs(result->val);
+ }
+
+ return GSL_SUCCESS;
+ }
+}
+#endif
+
+
+int gsl_sf_sinc_e(double x, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ {
+ const double ax = fabs(x);
+
+ if(ax < 0.8) {
+ /* Do not go to the limit of the fit since
+ * there is a zero there and the Chebyshev
+ * accuracy will go to zero.
+ */
+ return cheb_eval_e(&sinc_cs, 2.0*ax-1.0, result);
+ }
+ else if(ax < 100.0) {
+ /* Small arguments are no problem.
+ * We trust the library sin() to
+ * roughly machine precision.
+ */
+ result->val = sin(M_PI * ax)/(M_PI * ax);
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ /* Large arguments must be handled separately.
+ */
+ const double r = M_PI*ax;
+ gsl_sf_result s;
+ int stat_s = gsl_sf_sin_e(r, &s);
+ result->val = s.val/r;
+ result->err = s.err/r + 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return stat_s;
+ }
+ }
+}
+
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_sin(const double x)
+{
+ EVAL_RESULT(gsl_sf_sin_e(x, &result));
+}
+
+double gsl_sf_cos(const double x)
+{
+ EVAL_RESULT(gsl_sf_cos_e(x, &result));
+}
+
+double gsl_sf_hypot(const double x, const double y)
+{
+ EVAL_RESULT(gsl_sf_hypot_e(x, y, &result));
+}
+
+double gsl_sf_lnsinh(const double x)
+{
+ EVAL_RESULT(gsl_sf_lnsinh_e(x, &result));
+}
+
+double gsl_sf_lncosh(const double x)
+{
+ EVAL_RESULT(gsl_sf_lncosh_e(x, &result));
+}
+
+double gsl_sf_angle_restrict_symm(const double theta)
+{
+ double result = theta;
+ EVAL_DOUBLE(gsl_sf_angle_restrict_symm_e(&result));
+}
+
+double gsl_sf_angle_restrict_pos(const double theta)
+{
+ double result = theta;
+ EVAL_DOUBLE(gsl_sf_angle_restrict_pos_e(&result));
+}
+
+#if 0
+double gsl_sf_sin_pi_x(const double x)
+{
+ EVAL_RESULT(gsl_sf_sin_pi_x_e(x, &result));
+}
+#endif
+
+double gsl_sf_sinc(const double x)
+{
+ EVAL_RESULT(gsl_sf_sinc_e(x, &result));
+}
diff --git a/gsl-1.9/specfunc/zeta.c b/gsl-1.9/specfunc/zeta.c
new file mode 100644
index 0000000..078d7d3
--- /dev/null
+++ b/gsl-1.9/specfunc/zeta.c
@@ -0,0 +1,1050 @@
+/* specfunc/zeta.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sf_elementary.h>
+#include <gsl/gsl_sf_exp.h>
+#include <gsl/gsl_sf_gamma.h>
+#include <gsl/gsl_sf_pow_int.h>
+#include <gsl/gsl_sf_zeta.h>
+
+#include "error.h"
+
+#include "chebyshev.h"
+#include "cheb_eval.c"
+
+#define LogTwoPi_ 1.8378770664093454835606594728111235279723
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Private Section *-*-*-*-*-*-*-*-*-*-*-*/
+
+/* chebyshev fit for (s(t)-1)Zeta[s(t)]
+ * s(t)= (t+1)/2
+ * -1 <= t <= 1
+ */
+static double zeta_xlt1_data[14] = {
+ 1.48018677156931561235192914649,
+ 0.25012062539889426471999938167,
+ 0.00991137502135360774243761467,
+ -0.00012084759656676410329833091,
+ -4.7585866367662556504652535281e-06,
+ 2.2229946694466391855561441361e-07,
+ -2.2237496498030257121309056582e-09,
+ -1.0173226513229028319420799028e-10,
+ 4.3756643450424558284466248449e-12,
+ -6.2229632593100551465504090814e-14,
+ -6.6116201003272207115277520305e-16,
+ 4.9477279533373912324518463830e-17,
+ -1.0429819093456189719660003522e-18,
+ 6.9925216166580021051464412040e-21,
+};
+static cheb_series zeta_xlt1_cs = {
+ zeta_xlt1_data,
+ 13,
+ -1, 1,
+ 8
+};
+
+/* chebyshev fit for (s(t)-1)Zeta[s(t)]
+ * s(t)= (19t+21)/2
+ * -1 <= t <= 1
+ */
+static double zeta_xgt1_data[30] = {
+ 19.3918515726724119415911269006,
+ 9.1525329692510756181581271500,
+ 0.2427897658867379985365270155,
+ -0.1339000688262027338316641329,
+ 0.0577827064065028595578410202,
+ -0.0187625983754002298566409700,
+ 0.0039403014258320354840823803,
+ -0.0000581508273158127963598882,
+ -0.0003756148907214820704594549,
+ 0.0001892530548109214349092999,
+ -0.0000549032199695513496115090,
+ 8.7086484008939038610413331863e-6,
+ 6.4609477924811889068410083425e-7,
+ -9.6749773915059089205835337136e-7,
+ 3.6585400766767257736982342461e-7,
+ -8.4592516427275164351876072573e-8,
+ 9.9956786144497936572288988883e-9,
+ 1.4260036420951118112457144842e-9,
+ -1.1761968823382879195380320948e-9,
+ 3.7114575899785204664648987295e-10,
+ -7.4756855194210961661210215325e-11,
+ 7.8536934209183700456512982968e-12,
+ 9.9827182259685539619810406271e-13,
+ -7.5276687030192221587850302453e-13,
+ 2.1955026393964279988917878654e-13,
+ -4.1934859852834647427576319246e-14,
+ 4.6341149635933550715779074274e-15,
+ 2.3742488509048340106830309402e-16,
+ -2.7276516388124786119323824391e-16,
+ 7.8473570134636044722154797225e-17
+};
+static cheb_series zeta_xgt1_cs = {
+ zeta_xgt1_data,
+ 29,
+ -1, 1,
+ 17
+};
+
+
+/* chebyshev fit for Ln[Zeta[s(t)] - 1 - 2^(-s(t))]
+ * s(t)= 10 + 5t
+ * -1 <= t <= 1; 5 <= s <= 15
+ */
+static double zetam1_inter_data[24] = {
+ -21.7509435653088483422022339374,
+ -5.63036877698121782876372020472,
+ 0.0528041358684229425504861579635,
+ -0.0156381809179670789342700883562,
+ 0.00408218474372355881195080781927,
+ -0.0010264867349474874045036628282,
+ 0.000260469880409886900143834962387,
+ -0.0000676175847209968878098566819447,
+ 0.0000179284472587833525426660171124,
+ -4.83238651318556188834107605116e-6,
+ 1.31913788964999288471371329447e-6,
+ -3.63760500656329972578222188542e-7,
+ 1.01146847513194744989748396574e-7,
+ -2.83215225141806501619105289509e-8,
+ 7.97733710252021423361012829496e-9,
+ -2.25850168553956886676250696891e-9,
+ 6.42269392950164306086395744145e-10,
+ -1.83363861846127284505060843614e-10,
+ 5.25309763895283179960368072104e-11,
+ -1.50958687042589821074710575446e-11,
+ 4.34997545516049244697776942981e-12,
+ -1.25597782748190416118082322061e-12,
+ 3.61280740072222650030134104162e-13,
+ -9.66437239205745207188920348801e-14
+};
+static cheb_series zetam1_inter_cs = {
+ zetam1_inter_data,
+ 22,
+ -1, 1,
+ 12
+};
+
+
+
+/* assumes s >= 0 and s != 1.0 */
+inline
+static int
+riemann_zeta_sgt0(double s, gsl_sf_result * result)
+{
+ if(s < 1.0) {
+ gsl_sf_result c;
+ cheb_eval_e(&zeta_xlt1_cs, 2.0*s - 1.0, &c);
+ result->val = c.val / (s - 1.0);
+ result->err = c.err / fabs(s-1.0) + GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(s <= 20.0) {
+ double x = (2.0*s - 21.0)/19.0;
+ gsl_sf_result c;
+ cheb_eval_e(&zeta_xgt1_cs, x, &c);
+ result->val = c.val / (s - 1.0);
+ result->err = c.err / (s - 1.0) + GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ double f2 = 1.0 - pow(2.0,-s);
+ double f3 = 1.0 - pow(3.0,-s);
+ double f5 = 1.0 - pow(5.0,-s);
+ double f7 = 1.0 - pow(7.0,-s);
+ result->val = 1.0/(f2*f3*f5*f7);
+ result->err = 3.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+}
+
+
+inline
+static int
+riemann_zeta1ms_slt0(double s, gsl_sf_result * result)
+{
+ if(s > -19.0) {
+ double x = (-19 - 2.0*s)/19.0;
+ gsl_sf_result c;
+ cheb_eval_e(&zeta_xgt1_cs, x, &c);
+ result->val = c.val / (-s);
+ result->err = c.err / (-s) + GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ double f2 = 1.0 - pow(2.0,-(1.0-s));
+ double f3 = 1.0 - pow(3.0,-(1.0-s));
+ double f5 = 1.0 - pow(5.0,-(1.0-s));
+ double f7 = 1.0 - pow(7.0,-(1.0-s));
+ result->val = 1.0/(f2*f3*f5*f7);
+ result->err = 3.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+}
+
+
+/* works for 5 < s < 15*/
+static int
+riemann_zeta_minus_1_intermediate_s(double s, gsl_sf_result * result)
+{
+ double t = (s - 10.0)/5.0;
+ gsl_sf_result c;
+ cheb_eval_e(&zetam1_inter_cs, t, &c);
+ result->val = exp(c.val) + pow(2.0, -s);
+ result->err = (c.err + 2.0*GSL_DBL_EPSILON)*result->val;
+ return GSL_SUCCESS;
+}
+
+
+/* assumes s is large and positive
+ * write: zeta(s) - 1 = zeta(s) * (1 - 1/zeta(s))
+ * and expand a few terms of the product formula to evaluate 1 - 1/zeta(s)
+ *
+ * works well for s > 15
+ */
+static int
+riemann_zeta_minus1_large_s(double s, gsl_sf_result * result)
+{
+ double a = pow( 2.0,-s);
+ double b = pow( 3.0,-s);
+ double c = pow( 5.0,-s);
+ double d = pow( 7.0,-s);
+ double e = pow(11.0,-s);
+ double f = pow(13.0,-s);
+ double t1 = a + b + c + d + e + f;
+ double t2 = a*(b+c+d+e+f) + b*(c+d+e+f) + c*(d+e+f) + d*(e+f) + e*f;
+ /*
+ double t3 = a*(b*(c+d+e+f) + c*(d+e+f) + d*(e+f) + e*f) +
+ b*(c*(d+e+f) + d*(e+f) + e*f) +
+ c*(d*(e+f) + e*f) +
+ d*e*f;
+ double t4 = a*(b*(c*(d + e + f) + d*(e + f) + e*f) + c*(d*(e+f) + e*f) + d*e*f) +
+ b*(c*(d*(e+f) + e*f) + d*e*f) +
+ c*d*e*f;
+ double t5 = b*c*d*e*f + a*c*d*e*f+ a*b*d*e*f+ a*b*c*e*f+ a*b*c*d*f+ a*b*c*d*e;
+ double t6 = a*b*c*d*e*f;
+ */
+ double numt = t1 - t2 /* + t3 - t4 + t5 - t6 */;
+ double zeta = 1.0/((1.0-a)*(1.0-b)*(1.0-c)*(1.0-d)*(1.0-e)*(1.0-f));
+ result->val = numt*zeta;
+ result->err = (15.0/s + 1.0) * 6.0*GSL_DBL_EPSILON*result->val;
+ return GSL_SUCCESS;
+}
+
+
+#if 0
+/* zeta(n) */
+#define ZETA_POS_TABLE_NMAX 100
+static double zeta_pos_int_table_OLD[ZETA_POS_TABLE_NMAX+1] = {
+ -0.50000000000000000000000000000, /* zeta(0) */
+ 0.0 /* FIXME: DirectedInfinity() */, /* zeta(1) */
+ 1.64493406684822643647241516665, /* ... */
+ 1.20205690315959428539973816151,
+ 1.08232323371113819151600369654,
+ 1.03692775514336992633136548646,
+ 1.01734306198444913971451792979,
+ 1.00834927738192282683979754985,
+ 1.00407735619794433937868523851,
+ 1.00200839282608221441785276923,
+ 1.00099457512781808533714595890,
+ 1.00049418860411946455870228253,
+ 1.00024608655330804829863799805,
+ 1.00012271334757848914675183653,
+ 1.00006124813505870482925854511,
+ 1.00003058823630702049355172851,
+ 1.00001528225940865187173257149,
+ 1.00000763719763789976227360029,
+ 1.00000381729326499983985646164,
+ 1.00000190821271655393892565696,
+ 1.00000095396203387279611315204,
+ 1.00000047693298678780646311672,
+ 1.00000023845050272773299000365,
+ 1.00000011921992596531107306779,
+ 1.00000005960818905125947961244,
+ 1.00000002980350351465228018606,
+ 1.00000001490155482836504123466,
+ 1.00000000745071178983542949198,
+ 1.00000000372533402478845705482,
+ 1.00000000186265972351304900640,
+ 1.00000000093132743241966818287,
+ 1.00000000046566290650337840730,
+ 1.00000000023283118336765054920,
+ 1.00000000011641550172700519776,
+ 1.00000000005820772087902700889,
+ 1.00000000002910385044497099687,
+ 1.00000000001455192189104198424,
+ 1.00000000000727595983505748101,
+ 1.00000000000363797954737865119,
+ 1.00000000000181898965030706595,
+ 1.00000000000090949478402638893,
+ 1.00000000000045474737830421540,
+ 1.00000000000022737368458246525,
+ 1.00000000000011368684076802278,
+ 1.00000000000005684341987627586,
+ 1.00000000000002842170976889302,
+ 1.00000000000001421085482803161,
+ 1.00000000000000710542739521085,
+ 1.00000000000000355271369133711,
+ 1.00000000000000177635684357912,
+ 1.00000000000000088817842109308,
+ 1.00000000000000044408921031438,
+ 1.00000000000000022204460507980,
+ 1.00000000000000011102230251411,
+ 1.00000000000000005551115124845,
+ 1.00000000000000002775557562136,
+ 1.00000000000000001387778780973,
+ 1.00000000000000000693889390454,
+ 1.00000000000000000346944695217,
+ 1.00000000000000000173472347605,
+ 1.00000000000000000086736173801,
+ 1.00000000000000000043368086900,
+ 1.00000000000000000021684043450,
+ 1.00000000000000000010842021725,
+ 1.00000000000000000005421010862,
+ 1.00000000000000000002710505431,
+ 1.00000000000000000001355252716,
+ 1.00000000000000000000677626358,
+ 1.00000000000000000000338813179,
+ 1.00000000000000000000169406589,
+ 1.00000000000000000000084703295,
+ 1.00000000000000000000042351647,
+ 1.00000000000000000000021175824,
+ 1.00000000000000000000010587912,
+ 1.00000000000000000000005293956,
+ 1.00000000000000000000002646978,
+ 1.00000000000000000000001323489,
+ 1.00000000000000000000000661744,
+ 1.00000000000000000000000330872,
+ 1.00000000000000000000000165436,
+ 1.00000000000000000000000082718,
+ 1.00000000000000000000000041359,
+ 1.00000000000000000000000020680,
+ 1.00000000000000000000000010340,
+ 1.00000000000000000000000005170,
+ 1.00000000000000000000000002585,
+ 1.00000000000000000000000001292,
+ 1.00000000000000000000000000646,
+ 1.00000000000000000000000000323,
+ 1.00000000000000000000000000162,
+ 1.00000000000000000000000000081,
+ 1.00000000000000000000000000040,
+ 1.00000000000000000000000000020,
+ 1.00000000000000000000000000010,
+ 1.00000000000000000000000000005,
+ 1.00000000000000000000000000003,
+ 1.00000000000000000000000000001,
+ 1.00000000000000000000000000001,
+ 1.00000000000000000000000000000,
+ 1.00000000000000000000000000000,
+ 1.00000000000000000000000000000
+};
+#endif /* 0 */
+
+
+/* zeta(n) - 1 */
+#define ZETA_POS_TABLE_NMAX 100
+static double zetam1_pos_int_table[ZETA_POS_TABLE_NMAX+1] = {
+ -1.5, /* zeta(0) */
+ 0.0, /* FIXME: Infinity */ /* zeta(1) - 1 */
+ 0.644934066848226436472415166646, /* zeta(2) - 1 */
+ 0.202056903159594285399738161511,
+ 0.082323233711138191516003696541,
+ 0.036927755143369926331365486457,
+ 0.017343061984449139714517929790,
+ 0.008349277381922826839797549849,
+ 0.004077356197944339378685238508,
+ 0.002008392826082214417852769232,
+ 0.000994575127818085337145958900,
+ 0.000494188604119464558702282526,
+ 0.000246086553308048298637998047,
+ 0.000122713347578489146751836526,
+ 0.000061248135058704829258545105,
+ 0.000030588236307020493551728510,
+ 0.000015282259408651871732571487,
+ 7.6371976378997622736002935630e-6,
+ 3.8172932649998398564616446219e-6,
+ 1.9082127165539389256569577951e-6,
+ 9.5396203387279611315203868344e-7,
+ 4.7693298678780646311671960437e-7,
+ 2.3845050272773299000364818675e-7,
+ 1.1921992596531107306778871888e-7,
+ 5.9608189051259479612440207935e-8,
+ 2.9803503514652280186063705069e-8,
+ 1.4901554828365041234658506630e-8,
+ 7.4507117898354294919810041706e-9,
+ 3.7253340247884570548192040184e-9,
+ 1.8626597235130490064039099454e-9,
+ 9.3132743241966818287176473502e-10,
+ 4.6566290650337840729892332512e-10,
+ 2.3283118336765054920014559759e-10,
+ 1.1641550172700519775929738354e-10,
+ 5.8207720879027008892436859891e-11,
+ 2.9103850444970996869294252278e-11,
+ 1.4551921891041984235929632245e-11,
+ 7.2759598350574810145208690123e-12,
+ 3.6379795473786511902372363558e-12,
+ 1.8189896503070659475848321007e-12,
+ 9.0949478402638892825331183869e-13,
+ 4.5474737830421540267991120294e-13,
+ 2.2737368458246525152268215779e-13,
+ 1.1368684076802278493491048380e-13,
+ 5.6843419876275856092771829675e-14,
+ 2.8421709768893018554550737049e-14,
+ 1.4210854828031606769834307141e-14,
+ 7.1054273952108527128773544799e-15,
+ 3.5527136913371136732984695340e-15,
+ 1.7763568435791203274733490144e-15,
+ 8.8817842109308159030960913863e-16,
+ 4.4408921031438133641977709402e-16,
+ 2.2204460507980419839993200942e-16,
+ 1.1102230251410661337205445699e-16,
+ 5.5511151248454812437237365905e-17,
+ 2.7755575621361241725816324538e-17,
+ 1.3877787809725232762839094906e-17,
+ 6.9388939045441536974460853262e-18,
+ 3.4694469521659226247442714961e-18,
+ 1.7347234760475765720489729699e-18,
+ 8.6736173801199337283420550673e-19,
+ 4.3368086900206504874970235659e-19,
+ 2.1684043449972197850139101683e-19,
+ 1.0842021724942414063012711165e-19,
+ 5.4210108624566454109187004043e-20,
+ 2.7105054312234688319546213119e-20,
+ 1.3552527156101164581485233996e-20,
+ 6.7762635780451890979952987415e-21,
+ 3.3881317890207968180857031004e-21,
+ 1.6940658945097991654064927471e-21,
+ 8.4703294725469983482469926091e-22,
+ 4.2351647362728333478622704833e-22,
+ 2.1175823681361947318442094398e-22,
+ 1.0587911840680233852265001539e-22,
+ 5.2939559203398703238139123029e-23,
+ 2.6469779601698529611341166842e-23,
+ 1.3234889800848990803094510250e-23,
+ 6.6174449004244040673552453323e-24,
+ 3.3087224502121715889469563843e-24,
+ 1.6543612251060756462299236771e-24,
+ 8.2718061255303444036711056167e-25,
+ 4.1359030627651609260093824555e-25,
+ 2.0679515313825767043959679193e-25,
+ 1.0339757656912870993284095591e-25,
+ 5.1698788284564313204101332166e-26,
+ 2.5849394142282142681277617708e-26,
+ 1.2924697071141066700381126118e-26,
+ 6.4623485355705318034380021611e-27,
+ 3.2311742677852653861348141180e-27,
+ 1.6155871338926325212060114057e-27,
+ 8.0779356694631620331587381863e-28,
+ 4.0389678347315808256222628129e-28,
+ 2.0194839173657903491587626465e-28,
+ 1.0097419586828951533619250700e-28,
+ 5.0487097934144756960847711725e-29,
+ 2.5243548967072378244674341938e-29,
+ 1.2621774483536189043753999660e-29,
+ 6.3108872417680944956826093943e-30,
+ 3.1554436208840472391098412184e-30,
+ 1.5777218104420236166444327830e-30,
+ 7.8886090522101180735205378276e-31
+};
+
+
+#define ZETA_NEG_TABLE_NMAX 99
+#define ZETA_NEG_TABLE_SIZE 50
+static double zeta_neg_int_table[ZETA_NEG_TABLE_SIZE] = {
+ -0.083333333333333333333333333333, /* zeta(-1) */
+ 0.008333333333333333333333333333, /* zeta(-3) */
+ -0.003968253968253968253968253968, /* ... */
+ 0.004166666666666666666666666667,
+ -0.007575757575757575757575757576,
+ 0.021092796092796092796092796093,
+ -0.083333333333333333333333333333,
+ 0.44325980392156862745098039216,
+ -3.05395433027011974380395433027,
+ 26.4562121212121212121212121212,
+ -281.460144927536231884057971014,
+ 3607.5105463980463980463980464,
+ -54827.583333333333333333333333,
+ 974936.82385057471264367816092,
+ -2.0052695796688078946143462272e+07,
+ 4.7238486772162990196078431373e+08,
+ -1.2635724795916666666666666667e+10,
+ 3.8087931125245368811553022079e+11,
+ -1.2850850499305083333333333333e+13,
+ 4.8241448354850170371581670362e+14,
+ -2.0040310656516252738108421663e+16,
+ 9.1677436031953307756992753623e+17,
+ -4.5979888343656503490437943262e+19,
+ 2.5180471921451095697089023320e+21,
+ -1.5001733492153928733711440151e+23,
+ 9.6899578874635940656497942895e+24,
+ -6.7645882379292820990945242302e+26,
+ 5.0890659468662289689766332916e+28,
+ -4.1147288792557978697665486068e+30,
+ 3.5666582095375556109684574609e+32,
+ -3.3066089876577576725680214670e+34,
+ 3.2715634236478716264211227016e+36,
+ -3.4473782558278053878256455080e+38,
+ 3.8614279832705258893092720200e+40,
+ -4.5892974432454332168863989006e+42,
+ 5.7775386342770431824884825688e+44,
+ -7.6919858759507135167410075972e+46,
+ 1.0813635449971654696354033351e+49,
+ -1.6029364522008965406067102346e+51,
+ 2.5019479041560462843656661499e+53,
+ -4.1067052335810212479752045004e+55,
+ 7.0798774408494580617452972433e+57,
+ -1.2804546887939508790190849756e+60,
+ 2.4267340392333524078020892067e+62,
+ -4.8143218874045769355129570066e+64,
+ 9.9875574175727530680652777408e+66,
+ -2.1645634868435185631335136160e+69,
+ 4.8962327039620553206849224516e+71, /* ... */
+ -1.1549023923963519663954271692e+74, /* zeta(-97) */
+ 2.8382249570693706959264156336e+76 /* zeta(-99) */
+};
+
+
+/* coefficients for Maclaurin summation in hzeta()
+ * B_{2j}/(2j)!
+ */
+static double hzeta_c[15] = {
+ 1.00000000000000000000000000000,
+ 0.083333333333333333333333333333,
+ -0.00138888888888888888888888888889,
+ 0.000033068783068783068783068783069,
+ -8.2671957671957671957671957672e-07,
+ 2.0876756987868098979210090321e-08,
+ -5.2841901386874931848476822022e-10,
+ 1.3382536530684678832826980975e-11,
+ -3.3896802963225828668301953912e-13,
+ 8.5860620562778445641359054504e-15,
+ -2.1748686985580618730415164239e-16,
+ 5.5090028283602295152026526089e-18,
+ -1.3954464685812523340707686264e-19,
+ 3.5347070396294674716932299778e-21,
+ -8.9535174270375468504026113181e-23
+};
+
+#define ETA_POS_TABLE_NMAX 100
+static double eta_pos_int_table[ETA_POS_TABLE_NMAX+1] = {
+0.50000000000000000000000000000, /* eta(0) */
+M_LN2, /* eta(1) */
+0.82246703342411321823620758332, /* ... */
+0.90154267736969571404980362113,
+0.94703282949724591757650323447,
+0.97211977044690930593565514355,
+0.98555109129743510409843924448,
+0.99259381992283028267042571313,
+0.99623300185264789922728926008,
+0.99809429754160533076778303185,
+0.99903950759827156563922184570,
+0.99951714349806075414409417483,
+0.99975768514385819085317967871,
+0.99987854276326511549217499282,
+0.99993917034597971817095419226,
+0.99996955121309923808263293263,
+0.99998476421490610644168277496,
+0.99999237829204101197693787224,
+0.99999618786961011347968922641,
+0.99999809350817167510685649297,
+0.99999904661158152211505084256,
+0.99999952325821554281631666433,
+0.99999976161323082254789720494,
+0.99999988080131843950322382485,
+0.99999994039889239462836140314,
+0.99999997019885696283441513311,
+0.99999998509923199656878766181,
+0.99999999254955048496351585274,
+0.99999999627475340010872752767,
+0.99999999813736941811218674656,
+0.99999999906868228145397862728,
+0.99999999953434033145421751469,
+0.99999999976716989595149082282,
+0.99999999988358485804603047265,
+0.99999999994179239904531592388,
+0.99999999997089618952980952258,
+0.99999999998544809143388476396,
+0.99999999999272404460658475006,
+0.99999999999636202193316875550,
+0.99999999999818101084320873555,
+0.99999999999909050538047887809,
+0.99999999999954525267653087357,
+0.99999999999977262633369589773,
+0.99999999999988631316532476488,
+0.99999999999994315658215465336,
+0.99999999999997157829090808339,
+0.99999999999998578914539762720,
+0.99999999999999289457268000875,
+0.99999999999999644728633373609,
+0.99999999999999822364316477861,
+0.99999999999999911182158169283,
+0.99999999999999955591079061426,
+0.99999999999999977795539522974,
+0.99999999999999988897769758908,
+0.99999999999999994448884878594,
+0.99999999999999997224442439010,
+0.99999999999999998612221219410,
+0.99999999999999999306110609673,
+0.99999999999999999653055304826,
+0.99999999999999999826527652409,
+0.99999999999999999913263826204,
+0.99999999999999999956631913101,
+0.99999999999999999978315956551,
+0.99999999999999999989157978275,
+0.99999999999999999994578989138,
+0.99999999999999999997289494569,
+0.99999999999999999998644747284,
+0.99999999999999999999322373642,
+0.99999999999999999999661186821,
+0.99999999999999999999830593411,
+0.99999999999999999999915296705,
+0.99999999999999999999957648353,
+0.99999999999999999999978824176,
+0.99999999999999999999989412088,
+0.99999999999999999999994706044,
+0.99999999999999999999997353022,
+0.99999999999999999999998676511,
+0.99999999999999999999999338256,
+0.99999999999999999999999669128,
+0.99999999999999999999999834564,
+0.99999999999999999999999917282,
+0.99999999999999999999999958641,
+0.99999999999999999999999979320,
+0.99999999999999999999999989660,
+0.99999999999999999999999994830,
+0.99999999999999999999999997415,
+0.99999999999999999999999998708,
+0.99999999999999999999999999354,
+0.99999999999999999999999999677,
+0.99999999999999999999999999838,
+0.99999999999999999999999999919,
+0.99999999999999999999999999960,
+0.99999999999999999999999999980,
+0.99999999999999999999999999990,
+0.99999999999999999999999999995,
+0.99999999999999999999999999997,
+0.99999999999999999999999999999,
+0.99999999999999999999999999999,
+1.00000000000000000000000000000,
+1.00000000000000000000000000000,
+1.00000000000000000000000000000,
+};
+
+
+#define ETA_NEG_TABLE_NMAX 99
+#define ETA_NEG_TABLE_SIZE 50
+static double eta_neg_int_table[ETA_NEG_TABLE_SIZE] = {
+ 0.25000000000000000000000000000, /* eta(-1) */
+-0.12500000000000000000000000000, /* eta(-3) */
+ 0.25000000000000000000000000000, /* ... */
+-1.06250000000000000000000000000,
+ 7.75000000000000000000000000000,
+-86.3750000000000000000000000000,
+ 1365.25000000000000000000000000,
+-29049.0312500000000000000000000,
+ 800572.750000000000000000000000,
+-2.7741322625000000000000000000e+7,
+ 1.1805291302500000000000000000e+9,
+-6.0523980051687500000000000000e+10,
+ 3.6794167785377500000000000000e+12,
+-2.6170760990658387500000000000e+14,
+ 2.1531418140800295250000000000e+16,
+-2.0288775575173015930156250000e+18,
+ 2.1708009902623770590275000000e+20,
+-2.6173826968455814932120125000e+22,
+ 3.5324148876863877826668602500e+24,
+-5.3042033406864906641493838981e+26,
+ 8.8138218364311576767253114668e+28,
+-1.6128065107490778547354654864e+31,
+ 3.2355470001722734208527794569e+33,
+-7.0876727476537493198506645215e+35,
+ 1.6890450341293965779175629389e+38,
+-4.3639690731216831157655651358e+40,
+ 1.2185998827061261322605065672e+43,
+-3.6670584803153006180101262324e+45,
+ 1.1859898526302099104271449748e+48,
+-4.1120769493584015047981746438e+50,
+ 1.5249042436787620309090168687e+53,
+-6.0349693196941307074572991901e+55,
+ 2.5437161764210695823197691519e+58,
+-1.1396923802632287851130360170e+61,
+ 5.4180861064753979196802726455e+63,
+-2.7283654799994373847287197104e+66,
+ 1.4529750514918543238511171663e+69,
+-8.1705519371067450079777183386e+71,
+ 4.8445781606678367790247757259e+74,
+-3.0246694206649519336179448018e+77,
+ 1.9858807961690493054169047970e+80,
+-1.3694474620720086994386818232e+83,
+ 9.9070382984295807826303785989e+85,
+-7.5103780796592645925968460677e+88,
+ 5.9598418264260880840077992227e+91,
+-4.9455988887500020399263196307e+94,
+ 4.2873596927020241277675775935e+97,
+-3.8791952037716162900707994047e+100,
+ 3.6600317773156342245401829308e+103,
+-3.5978775704117283875784869570e+106 /* eta(-99) */
+};
+
+
+/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
+
+
+int gsl_sf_hzeta_e(const double s, const double q, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(s <= 1.0 || q <= 0.0) {
+ DOMAIN_ERROR(result);
+ }
+ else {
+ const double max_bits = 54.0;
+ const double ln_term0 = -s * log(q);
+
+ if(ln_term0 < GSL_LOG_DBL_MIN + 1.0) {
+ UNDERFLOW_ERROR(result);
+ }
+ else if(ln_term0 > GSL_LOG_DBL_MAX - 1.0) {
+ OVERFLOW_ERROR (result);
+ }
+ else if((s > max_bits && q < 1.0) || (s > 0.5*max_bits && q < 0.25)) {
+ result->val = pow(q, -s);
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else if(s > 0.5*max_bits && q < 1.0) {
+ const double p1 = pow(q, -s);
+ const double p2 = pow(q/(1.0+q), s);
+ const double p3 = pow(q/(2.0+q), s);
+ result->val = p1 * (1.0 + p2 + p3);
+ result->err = GSL_DBL_EPSILON * (0.5*s + 2.0) * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ /* Euler-Maclaurin summation formula
+ * [Moshier, p. 400, with several typo corrections]
+ */
+ const int jmax = 12;
+ const int kmax = 10;
+ int j, k;
+ const double pmax = pow(kmax + q, -s);
+ double scp = s;
+ double pcp = pmax / (kmax + q);
+ double ans = pmax*((kmax+q)/(s-1.0) + 0.5);
+
+ for(k=0; k<kmax; k++) {
+ ans += pow(k + q, -s);
+ }
+
+ for(j=0; j<=jmax; j++) {
+ double delta = hzeta_c[j+1] * scp * pcp;
+ ans += delta;
+ if(fabs(delta/ans) < 0.5*GSL_DBL_EPSILON) break;
+ scp *= (s+2*j+1)*(s+2*j+2);
+ pcp /= (kmax + q)*(kmax + q);
+ }
+
+ result->val = ans;
+ result->err = 2.0 * (jmax + 1.0) * GSL_DBL_EPSILON * fabs(ans);
+ return GSL_SUCCESS;
+ }
+ }
+}
+
+
+int gsl_sf_zeta_e(const double s, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(s == 1.0) {
+ DOMAIN_ERROR(result);
+ }
+ else if(s >= 0.0) {
+ return riemann_zeta_sgt0(s, result);
+ }
+ else {
+ /* reflection formula, [Abramowitz+Stegun, 23.2.5] */
+
+ gsl_sf_result zeta_one_minus_s;
+ const int stat_zoms = riemann_zeta1ms_slt0(s, &zeta_one_minus_s);
+ const double sin_term = (fmod(s,2.0) == 0.0) ? 0.0 : sin(0.5*M_PI*fmod(s,4.0))/M_PI;
+
+ if(sin_term == 0.0) {
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(s > -170) {
+ /* We have to be careful about losing digits
+ * in calculating pow(2 Pi, s). The gamma
+ * function is fine because we were careful
+ * with that implementation.
+ * We keep an array of (2 Pi)^(10 n).
+ */
+ const double twopi_pow[18] = { 1.0,
+ 9.589560061550901348e+007,
+ 9.195966217409212684e+015,
+ 8.818527036583869903e+023,
+ 8.456579467173150313e+031,
+ 8.109487671573504384e+039,
+ 7.776641909496069036e+047,
+ 7.457457466828644277e+055,
+ 7.151373628461452286e+063,
+ 6.857852693272229709e+071,
+ 6.576379029540265771e+079,
+ 6.306458169130020789e+087,
+ 6.047615938853066678e+095,
+ 5.799397627482402614e+103,
+ 5.561367186955830005e+111,
+ 5.333106466365131227e+119,
+ 5.114214477385391780e+127,
+ 4.904306689854036836e+135
+ };
+ const int n = floor((-s)/10.0);
+ const double fs = s + 10.0*n;
+ const double p = pow(2.0*M_PI, fs) / twopi_pow[n];
+
+ gsl_sf_result g;
+ const int stat_g = gsl_sf_gamma_e(1.0-s, &g);
+ result->val = p * g.val * sin_term * zeta_one_minus_s.val;
+ result->err = fabs(p * g.val * sin_term) * zeta_one_minus_s.err;
+ result->err += fabs(p * sin_term * zeta_one_minus_s.val) * g.err;
+ result->err += GSL_DBL_EPSILON * (fabs(s)+2.0) * fabs(result->val);
+ return GSL_ERROR_SELECT_2(stat_g, stat_zoms);
+ }
+ else {
+ /* The actual zeta function may or may not
+ * overflow here. But we have no easy way
+ * to calculate it when the prefactor(s)
+ * overflow. Trying to use log's and exp
+ * is no good because we loose a couple
+ * digits to the exp error amplification.
+ * When we gather a little more patience,
+ * we can implement something here. Until
+ * then just give up.
+ */
+ OVERFLOW_ERROR(result);
+ }
+ }
+}
+
+
+int gsl_sf_zeta_int_e(const int n, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(n < 0) {
+ if(!GSL_IS_ODD(n)) {
+ result->val = 0.0; /* exactly zero at even negative integers */
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(n > -ZETA_NEG_TABLE_NMAX) {
+ result->val = zeta_neg_int_table[-(n+1)/2];
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ return gsl_sf_zeta_e((double)n, result);
+ }
+ }
+ else if(n == 1){
+ DOMAIN_ERROR(result);
+ }
+ else if(n <= ZETA_POS_TABLE_NMAX){
+ result->val = 1.0 + zetam1_pos_int_table[n];
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ result->val = 1.0;
+ result->err = GSL_DBL_EPSILON;
+ return GSL_SUCCESS;
+ }
+}
+
+
+int gsl_sf_zetam1_e(const double s, gsl_sf_result * result)
+{
+ if(s <= 5.0)
+ {
+ int stat = gsl_sf_zeta_e(s, result);
+ result->val = result->val - 1.0;
+ return stat;
+ }
+ else if(s < 15.0)
+ {
+ return riemann_zeta_minus_1_intermediate_s(s, result);
+ }
+ else
+ {
+ return riemann_zeta_minus1_large_s(s, result);
+ }
+}
+
+
+int gsl_sf_zetam1_int_e(const int n, gsl_sf_result * result)
+{
+ if(n < 0) {
+ if(!GSL_IS_ODD(n)) {
+ result->val = -1.0; /* at even negative integers zetam1 == -1 since zeta is exactly zero */
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(n > -ZETA_NEG_TABLE_NMAX) {
+ result->val = zeta_neg_int_table[-(n+1)/2] - 1.0;
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ /* could use gsl_sf_zetam1_e here but subtracting 1 makes no difference
+ for such large values, so go straight to the result */
+ return gsl_sf_zeta_e((double)n, result);
+ }
+ }
+ else if(n == 1){
+ DOMAIN_ERROR(result);
+ }
+ else if(n <= ZETA_POS_TABLE_NMAX){
+ result->val = zetam1_pos_int_table[n];
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ return gsl_sf_zetam1_e(n, result);
+ }
+}
+
+
+int gsl_sf_eta_int_e(int n, gsl_sf_result * result)
+{
+ if(n > ETA_POS_TABLE_NMAX) {
+ result->val = 1.0;
+ result->err = GSL_DBL_EPSILON;
+ return GSL_SUCCESS;
+ }
+ else if(n >= 0) {
+ result->val = eta_pos_int_table[n];
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ /* n < 0 */
+
+ if(!GSL_IS_ODD(n)) {
+ /* exactly zero at even negative integers */
+ result->val = 0.0;
+ result->err = 0.0;
+ return GSL_SUCCESS;
+ }
+ else if(n > -ETA_NEG_TABLE_NMAX) {
+ result->val = eta_neg_int_table[-(n+1)/2];
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ gsl_sf_result z;
+ gsl_sf_result p;
+ int stat_z = gsl_sf_zeta_int_e(n, &z);
+ int stat_p = gsl_sf_exp_e((1.0-n)*M_LN2, &p);
+ int stat_m = gsl_sf_multiply_e(-p.val, z.val, result);
+ result->err = fabs(p.err * (M_LN2*(1.0-n)) * z.val) + z.err * fabs(p.val);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_ERROR_SELECT_3(stat_m, stat_p, stat_z);
+ }
+ }
+}
+
+
+int gsl_sf_eta_e(const double s, gsl_sf_result * result)
+{
+ /* CHECK_POINTER(result) */
+
+ if(s > 100.0) {
+ result->val = 1.0;
+ result->err = GSL_DBL_EPSILON;
+ return GSL_SUCCESS;
+ }
+ else if(fabs(s-1.0) < 10.0*GSL_ROOT5_DBL_EPSILON) {
+ double del = s-1.0;
+ double c0 = M_LN2;
+ double c1 = M_LN2 * (M_EULER - 0.5*M_LN2);
+ double c2 = -0.0326862962794492996;
+ double c3 = 0.0015689917054155150;
+ double c4 = 0.00074987242112047532;
+ result->val = c0 + del * (c1 + del * (c2 + del * (c3 + del * c4)));
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_SUCCESS;
+ }
+ else {
+ gsl_sf_result z;
+ gsl_sf_result p;
+ int stat_z = gsl_sf_zeta_e(s, &z);
+ int stat_p = gsl_sf_exp_e((1.0-s)*M_LN2, &p);
+ int stat_m = gsl_sf_multiply_e(1.0-p.val, z.val, result);
+ result->err = fabs(p.err * (M_LN2*(1.0-s)) * z.val) + z.err * fabs(p.val);
+ result->err += 2.0 * GSL_DBL_EPSILON * fabs(result->val);
+ return GSL_ERROR_SELECT_3(stat_m, stat_p, stat_z);
+ }
+}
+
+
+/*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
+
+#include "eval.h"
+
+double gsl_sf_zeta(const double s)
+{
+ EVAL_RESULT(gsl_sf_zeta_e(s, &result));
+}
+
+double gsl_sf_hzeta(const double s, const double a)
+{
+ EVAL_RESULT(gsl_sf_hzeta_e(s, a, &result));
+}
+
+double gsl_sf_zeta_int(const int s)
+{
+ EVAL_RESULT(gsl_sf_zeta_int_e(s, &result));
+}
+
+double gsl_sf_zetam1(const double s)
+{
+ EVAL_RESULT(gsl_sf_zetam1_e(s, &result));
+}
+
+double gsl_sf_zetam1_int(const int s)
+{
+ EVAL_RESULT(gsl_sf_zetam1_int_e(s, &result));
+}
+
+double gsl_sf_eta_int(const int s)
+{
+ EVAL_RESULT(gsl_sf_eta_int_e(s, &result));
+}
+
+double gsl_sf_eta(const double s)
+{
+ EVAL_RESULT(gsl_sf_eta_e(s, &result));
+}
diff --git a/gsl-1.9/statistics/ChangeLog b/gsl-1.9/statistics/ChangeLog
new file mode 100644
index 0000000..43a04ed
--- /dev/null
+++ b/gsl-1.9/statistics/ChangeLog
@@ -0,0 +1,118 @@
+2006-01-07 Brian Gough <bjg@network-theory.co.uk>
+
+ * test_float_source.c: additional tests for NaNs
+
+ * minmax_source.c: handle NaNs correctly, if any element is NaN
+ then the max and min are NaN
+
+Sat Jul 15 12:23:09 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * test_nist.c: added url/reference to the original NIST datasets
+
+Thu May 4 15:11:11 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * covariance.c: added covariance function
+
+Wed Mar 8 15:29:19 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * Function Name Reorganization: The function suffix "_with_mean"
+ has been changed to "_m", the function suffix "_with_mean_and_sd"
+ has been changed to "_m_sd". The variance function est_variance
+ has been changed to simply _variance, (similarly for est_sd, which
+ is now _sd), while the function _variance is now
+ _variance_with_fixed_mean (and _sd is _sd_with_fixed_mean).
+
+Wed Mar 1 11:09:21 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * wabsdev.c wabsdev_source.c wkurtosis.c wkurtosis_source.c
+ wmean.c wmean_source.c wskew.c wskew_source.c wvariance.c
+ wvariance_source.c: added support for weighted statistics
+
+ * removed source.h (no longer used)
+
+Tue Feb 29 10:35:23 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * changed arguments of pvariance and ttest to have consistent form
+ (DATA,STRIDE,SIZE)
+
+Mon Feb 28 20:29:08 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * removed sort function since this is now available in the sort
+ directory.
+
+ * converted all functions to take a stride argument, in
+ preparation for supporting statistics on vectors
+
+1998-11-06 <bjg@ancho.lanl.gov>
+
+ * test.c: added prototype for memcpy using #include <string.h>
+
+Wed Aug 12 12:34:24 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * quantiles.c: Renamed percentile to quantile throughout. This is
+ the correct name for the quantity, mathematically speaking.
+
+Wed Aug 5 12:34:58 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * mkheaders.pl: script to generate all the headers from
+ gsl_statistics_int.h
+
+ * test.h: removed test.h, not needed
+
+ * test.c: added tests for all types
+
+ * converted functions to use 'long double' for internal calculations,
+ for extra range.
+
+ * converted all the functions to use templates_on.h and
+ templates_off.h
+
+Mon Jun 1 23:47:23 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * lag1_source.c: added a new function to compute the
+ lag1-autocorrelation
+
+ * test_nist.c: added some numerical accuracy tests from NIST
+
+Fri Apr 10 15:11:51 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * renamed pooled_variance.c, etc to p_variance to avoid linker
+ complaints about long filenames on some platforms
+
+Wed Apr 8 18:11:48 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * Added a new recurrence algorithm for the mean, variance, skew
+ and kurtosis. It uses a running value which is less likely to
+ overflow than a global sum.
+
+Mon Mar 30 22:18:59 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * completely reorganised the source system to use macros as
+ a primitive form of templates.
+
+Sun Mar 29 16:25:24 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * make everything const where possible (to reduce the chance of errors)
+
+Sun Mar 22 23:34:05 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * skew.c: compute the skewness of a dataset
+
+ * percentiles.c: find a given percentile from a sorted dataset
+
+ * minmax.c: allow the user to find the indices of the max/min
+ data points, in addition to the max/min values
+
+ * median.c: compute the median of a sorted dataset
+
+ * kurtosis.c: compute the kurtosis
+
+ * absdev.c: compute absolute deviations
+
+ * split statistics functions into double versions (gsl_stats) and
+ integer versions (gsl_stats_int). There is a script
+ (convert_double_to_int.pl) to make the integer versions from the
+ double versions.
+
+
+
diff --git a/gsl-1.9/statistics/Makefile.am b/gsl-1.9/statistics/Makefile.am
new file mode 100644
index 0000000..f2c3adc
--- /dev/null
+++ b/gsl-1.9/statistics/Makefile.am
@@ -0,0 +1,19 @@
+## Process this file with automake to produce Makefile.in
+
+noinst_LTLIBRARIES = libgslstatistics.la
+
+pkginclude_HEADERS = gsl_statistics.h gsl_statistics_char.h gsl_statistics_double.h gsl_statistics_float.h gsl_statistics_int.h gsl_statistics_long.h gsl_statistics_long_double.h gsl_statistics_short.h gsl_statistics_uchar.h gsl_statistics_uint.h gsl_statistics_ulong.h gsl_statistics_ushort.h
+
+INCLUDES= -I$(top_builddir) -I$(top_srcdir)
+
+libgslstatistics_la_SOURCES = mean.c variance.c absdev.c skew.c kurtosis.c lag1.c p_variance.c minmax.c ttest.c median.c covariance.c quantiles.c wmean.c wvariance.c wabsdev.c wskew.c wkurtosis.c
+
+noinst_HEADERS = mean_source.c variance_source.c covariance_source.c absdev_source.c skew_source.c kurtosis_source.c lag1_source.c p_variance_source.c minmax_source.c ttest_source.c median_source.c quantiles_source.c wmean_source.c wvariance_source.c wabsdev_source.c wskew_source.c wkurtosis_source.c test_float_source.c test_int_source.c
+
+check_PROGRAMS = test
+TESTS = $(check_PROGRAMS)
+
+test_SOURCES = test.c test_nist.c
+test_LDADD = libgslstatistics.la ../sort/libgslsort.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+
+
diff --git a/gsl-1.9/statistics/Makefile.in b/gsl-1.9/statistics/Makefile.in
new file mode 100644
index 0000000..049dde5
--- /dev/null
+++ b/gsl-1.9/statistics/Makefile.in
@@ -0,0 +1,547 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = test$(EXEEXT)
+subdir = statistics
+DIST_COMMON = $(noinst_HEADERS) $(pkginclude_HEADERS) \
+ $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog TODO
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgslstatistics_la_LIBADD =
+am_libgslstatistics_la_OBJECTS = mean.lo variance.lo absdev.lo skew.lo \
+ kurtosis.lo lag1.lo p_variance.lo minmax.lo ttest.lo median.lo \
+ covariance.lo quantiles.lo wmean.lo wvariance.lo wabsdev.lo \
+ wskew.lo wkurtosis.lo
+libgslstatistics_la_OBJECTS = $(am_libgslstatistics_la_OBJECTS)
+am_test_OBJECTS = test.$(OBJEXT) test_nist.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = libgslstatistics.la ../sort/libgslsort.la \
+ ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la \
+ ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgslstatistics_la_SOURCES) $(test_SOURCES)
+DIST_SOURCES = $(libgslstatistics_la_SOURCES) $(test_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libgslstatistics.la
+pkginclude_HEADERS = gsl_statistics.h gsl_statistics_char.h gsl_statistics_double.h gsl_statistics_float.h gsl_statistics_int.h gsl_statistics_long.h gsl_statistics_long_double.h gsl_statistics_short.h gsl_statistics_uchar.h gsl_statistics_uint.h gsl_statistics_ulong.h gsl_statistics_ushort.h
+INCLUDES = -I$(top_builddir) -I$(top_srcdir)
+libgslstatistics_la_SOURCES = mean.c variance.c absdev.c skew.c kurtosis.c lag1.c p_variance.c minmax.c ttest.c median.c covariance.c quantiles.c wmean.c wvariance.c wabsdev.c wskew.c wkurtosis.c
+noinst_HEADERS = mean_source.c variance_source.c covariance_source.c absdev_source.c skew_source.c kurtosis_source.c lag1_source.c p_variance_source.c minmax_source.c ttest_source.c median_source.c quantiles_source.c wmean_source.c wvariance_source.c wabsdev_source.c wskew_source.c wkurtosis_source.c test_float_source.c test_int_source.c
+TESTS = $(check_PROGRAMS)
+test_SOURCES = test.c test_nist.c
+test_LDADD = libgslstatistics.la ../sort/libgslsort.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps statistics/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps statistics/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgslstatistics.la: $(libgslstatistics_la_OBJECTS) $(libgslstatistics_la_DEPENDENCIES)
+ $(LINK) $(libgslstatistics_la_LDFLAGS) $(libgslstatistics_la_OBJECTS) $(libgslstatistics_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkgincludeHEADERS
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/statistics/TODO b/gsl-1.9/statistics/TODO
new file mode 100644
index 0000000..ca5a984
--- /dev/null
+++ b/gsl-1.9/statistics/TODO
@@ -0,0 +1,102 @@
+* From: James Theiler <jt@lanl.gov>
+To: John Lamb <J.D.Lamb@btinternet.com>
+Cc: gsl-discuss@sources.redhat.com
+Subject: Re: Collecting statistics for time dependent data?
+Date: Thu, 9 Dec 2004 14:18:36 -0700 (MST)
+
+On Thu, 9 Dec 2004, John Lamb wrote:
+
+] Raimondo Giammanco wrote:
+] > Hello,
+] >
+] > I was wondering if there is a way to compute "running" statistics with
+] > gsl.
+] >
+] Yes you can do it, but there's nothing in GSL that does it and its eay
+] enough that you don't need GSL. Something like (untested)
+]
+] double update_mean( double* mean, int* n, double x ){
+] if( *n == 1 )
+] *mean = x;
+] else
+] *mean = (1 - (double)1 / *n ) * *mean + x / n;
+] }
+]
+] will work and you can derive a similar method for updating the variance
+] using the usual textbook formula.
+]
+] var[x] = (1/n) sum x^2_i - mean(x)^2
+]
+] I don't know if there is a method that avoids the rounding errors. I
+] don't know why so many textbooks repeat this formula without the
+] slightest warning that it can go so badly wrong.
+]
+]
+
+Stably updating mean and variance is remarkably nontrivial. There was
+a series of papers in Comm ACM that discussed the issue; the final one
+(that I know of) refers back to the earlier ones, and it can be found
+in D.H.D. West, Updating mean and variance estimates: an improved
+method, Comm ACM 22:9, 532 (1979) [* I see Luke Stras just sent this
+reference! *]. I'll just copy out the pseudocode since the paper is
+old enough that it might not be easy to find. This, by the way, is
+generalized for weighted data, so it assumes that you get a weight and
+a data value (W_i and X_i) that you use to update the estimates XBAR
+and S2:
+
+ SUMW = W_1
+ M = X_1
+ T = 0
+ For i=2,3,...,n
+ {
+ Q = X_i - M
+ TEMP = SUM + W_i // typo: He meant SUMW
+ R = Q*W_i/TEMP
+ M = M + R
+ T = T + R*SUMW*Q
+ SUMW = TEMP
+ }
+ XBAR = M
+ S2 = T*n/((n-1)*SUMW)
+
+
+
+jt
+
+--
+James Theiler Space and Remote Sensing Sciences
+MS-B244, ISR-2, LANL Los Alamos National Laboratory
+Los Alamos, NM 87545 http://nis-www.lanl.gov/~jt
+
+
+* Look at STARPAC ftp://ftp.ucar.edu/starpac/ and Statlib
+http://lib.stat.cmu.edu/ for more ideas
+
+* Try using the Kahan summation formula to improve accuracy for the
+NIST tests (see Brian for details, below is a sketch of the algorithm).
+
+ sum = x(1)
+ c = 0
+
+ DO i = 2, 1000000, 1
+ y = x(i) - c
+ t = sum + y
+ c = (t - sum) - y
+ sum = t
+ ENDDO
+
+* Prevent incorrect use of unsorted data for quartile calculations
+using a typedef for sorted data (?)
+
+* Rejection of outliers
+
+* Time series. Auto correlation, cross-correlation, smoothing (moving
+average), detrending, various econometric things. Integrated
+quantities (area under the curve). Interpolation of noisy data/fitting
+-- maybe add that to the existing interpolation stuff.What about
+missing data and gaps?
+
+ There is a new GNU package called gretl which does econometrics
+
+* Statistical tests (equal means, equal variance, etc).
+
diff --git a/gsl-1.9/statistics/absdev.c b/gsl-1.9/statistics/absdev.c
new file mode 100644
index 0000000..eb2bde9
--- /dev/null
+++ b/gsl-1.9/statistics/absdev.c
@@ -0,0 +1,70 @@
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_statistics.h>
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "absdev_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "absdev_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "absdev_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "absdev_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "absdev_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "absdev_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "absdev_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "absdev_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "absdev_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "absdev_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "absdev_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
+
diff --git a/gsl-1.9/statistics/absdev_source.c b/gsl-1.9/statistics/absdev_source.c
new file mode 100644
index 0000000..b0d94b6
--- /dev/null
+++ b/gsl-1.9/statistics/absdev_source.c
@@ -0,0 +1,49 @@
+/* statistics/absdev_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Jim Davies, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+double
+FUNCTION(gsl_stats,absdev) (const BASE data[], const size_t stride, const size_t n)
+{
+ const double mean = FUNCTION(gsl_stats,mean)(data, stride, n);
+ return FUNCTION(gsl_stats,absdev_m)(data, stride, n, mean);
+}
+
+double
+FUNCTION(gsl_stats,absdev_m) (const BASE data[],
+ const size_t stride,
+ const size_t n,
+ const double mean)
+{
+ /* takes a dataset and finds the absolute deviation */
+
+ double sum = 0, absdev;
+ size_t i;
+
+ /* find the sum of the absolute deviations */
+ for (i = 0; i < n; i++)
+ {
+ const double delta = fabs(data[i * stride] - mean);
+ sum += delta;
+ }
+
+ absdev = sum / n;
+
+ return absdev;
+}
+
diff --git a/gsl-1.9/statistics/covariance.c b/gsl-1.9/statistics/covariance.c
new file mode 100644
index 0000000..4538f75
--- /dev/null
+++ b/gsl-1.9/statistics/covariance.c
@@ -0,0 +1,72 @@
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_statistics.h>
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "covariance_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "covariance_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "covariance_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "covariance_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "covariance_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "covariance_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "covariance_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "covariance_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "covariance_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "covariance_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "covariance_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
+
+
+
diff --git a/gsl-1.9/statistics/covariance_source.c b/gsl-1.9/statistics/covariance_source.c
new file mode 100644
index 0000000..411e347
--- /dev/null
+++ b/gsl-1.9/statistics/covariance_source.c
@@ -0,0 +1,77 @@
+/* statistics/covar_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Jim Davies, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+static double
+FUNCTION(compute,covariance) (const BASE data1[], const size_t stride1,
+ const BASE data2[], const size_t stride2,
+ const size_t n,
+ const double mean1, const double mean2);
+
+static double
+FUNCTION(compute,covariance) (const BASE data1[], const size_t stride1,
+ const BASE data2[], const size_t stride2,
+ const size_t n,
+ const double mean1, const double mean2)
+{
+ /* takes a dataset and finds the covariance */
+
+ long double covariance = 0 ;
+
+ size_t i;
+
+ /* find the sum of the squares */
+ for (i = 0; i < n; i++)
+ {
+ const long double delta1 = (data1[i * stride1] - mean1);
+ const long double delta2 = (data2[i * stride2] - mean2);
+ covariance += (delta1 * delta2 - covariance) / (i + 1);
+ }
+
+ return covariance ;
+}
+
+double
+FUNCTION(gsl_stats,covariance_m) (const BASE data1[], const size_t stride1,
+ const BASE data2[], const size_t stride2,
+ const size_t n,
+ const double mean1, const double mean2)
+{
+ const double covariance = FUNCTION(compute,covariance) (data1, stride1,
+ data2, stride2,
+ n,
+ mean1, mean2);
+
+ return covariance * ((double)n / (double)(n - 1));
+}
+
+double
+FUNCTION(gsl_stats,covariance) (const BASE data1[], const size_t stride1,
+ const BASE data2[], const size_t stride2,
+ const size_t n)
+{
+ const double mean1 = FUNCTION(gsl_stats,mean) (data1, stride1, n);
+ const double mean2 = FUNCTION(gsl_stats,mean) (data2, stride2, n);
+
+ return FUNCTION(gsl_stats,covariance_m)(data1, stride1,
+ data2, stride2,
+ n,
+ mean1, mean2);
+}
+
+
diff --git a/gsl-1.9/statistics/gsl_statistics.h b/gsl-1.9/statistics/gsl_statistics.h
new file mode 100644
index 0000000..9fb414f
--- /dev/null
+++ b/gsl-1.9/statistics/gsl_statistics.h
@@ -0,0 +1,20 @@
+#ifndef __GSL_STATISTICS_H__
+#define __GSL_STATISTICS_H__
+
+#include <gsl/gsl_statistics_long_double.h>
+#include <gsl/gsl_statistics_double.h>
+#include <gsl/gsl_statistics_float.h>
+
+#include <gsl/gsl_statistics_ulong.h>
+#include <gsl/gsl_statistics_long.h>
+
+#include <gsl/gsl_statistics_uint.h>
+#include <gsl/gsl_statistics_int.h>
+
+#include <gsl/gsl_statistics_ushort.h>
+#include <gsl/gsl_statistics_short.h>
+
+#include <gsl/gsl_statistics_uchar.h>
+#include <gsl/gsl_statistics_char.h>
+
+#endif /* __GSL_STATISTICS_H__ */
diff --git a/gsl-1.9/statistics/gsl_statistics_char.h b/gsl-1.9/statistics/gsl_statistics_char.h
new file mode 100644
index 0000000..92f7e1b
--- /dev/null
+++ b/gsl-1.9/statistics/gsl_statistics_char.h
@@ -0,0 +1,75 @@
+/* statistics/gsl_statistics_char.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Jim Davies, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_STATISTICS_CHAR_H__
+#define __GSL_STATISTICS_CHAR_H__
+
+#include <stddef.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+double gsl_stats_char_mean (const char data[], const size_t stride, const size_t n);
+double gsl_stats_char_variance (const char data[], const size_t stride, const size_t n);
+double gsl_stats_char_sd (const char data[], const size_t stride, const size_t n);
+double gsl_stats_char_variance_with_fixed_mean (const char data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_char_sd_with_fixed_mean (const char data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_char_absdev (const char data[], const size_t stride, const size_t n);
+double gsl_stats_char_skew (const char data[], const size_t stride, const size_t n);
+double gsl_stats_char_kurtosis (const char data[], const size_t stride, const size_t n);
+double gsl_stats_char_lag1_autocorrelation (const char data[], const size_t stride, const size_t n);
+
+double gsl_stats_char_covariance (const char data1[], const size_t stride1,const char data2[], const size_t stride2, const size_t n);
+
+double gsl_stats_char_variance_m (const char data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_char_sd_m (const char data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_char_absdev_m (const char data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_char_skew_m_sd (const char data[], const size_t stride, const size_t n, const double mean, const double sd);
+double gsl_stats_char_kurtosis_m_sd (const char data[], const size_t stride, const size_t n, const double mean, const double sd);
+double gsl_stats_char_lag1_autocorrelation_m (const char data[], const size_t stride, const size_t n, const double mean);
+
+double gsl_stats_char_covariance_m (const char data1[], const size_t stride1,const char data2[], const size_t stride2, const size_t n, const double mean1, const double mean2);
+
+
+double gsl_stats_char_pvariance (const char data1[], const size_t stride1, const size_t n1, const char data2[], const size_t stride2, const size_t n2);
+double gsl_stats_char_ttest (const char data1[], const size_t stride1, const size_t n1, const char data2[], const size_t stride2, const size_t n2);
+
+char gsl_stats_char_max (const char data[], const size_t stride, const size_t n);
+char gsl_stats_char_min (const char data[], const size_t stride, const size_t n);
+void gsl_stats_char_minmax (char * min, char * max, const char data[], const size_t stride, const size_t n);
+
+size_t gsl_stats_char_max_index (const char data[], const size_t stride, const size_t n);
+size_t gsl_stats_char_min_index (const char data[], const size_t stride, const size_t n);
+void gsl_stats_char_minmax_index (size_t * min_index, size_t * max_index, const char data[], const size_t stride, const size_t n);
+
+double gsl_stats_char_median_from_sorted_data (const char sorted_data[], const size_t stride, const size_t n) ;
+double gsl_stats_char_quantile_from_sorted_data (const char sorted_data[], const size_t stride, const size_t n, const double f) ;
+
+__END_DECLS
+
+#endif /* __GSL_STATISTICS_CHAR_H__ */
diff --git a/gsl-1.9/statistics/gsl_statistics_double.h b/gsl-1.9/statistics/gsl_statistics_double.h
new file mode 100644
index 0000000..f0005c5
--- /dev/null
+++ b/gsl-1.9/statistics/gsl_statistics_double.h
@@ -0,0 +1,93 @@
+/* statistics/gsl_statistics_double.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Jim Davies, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_STATISTICS_DOUBLE_H__
+#define __GSL_STATISTICS_DOUBLE_H__
+
+#include <stddef.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+double gsl_stats_mean (const double data[], const size_t stride, const size_t n);
+double gsl_stats_variance (const double data[], const size_t stride, const size_t n);
+double gsl_stats_sd (const double data[], const size_t stride, const size_t n);
+double gsl_stats_variance_with_fixed_mean (const double data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_sd_with_fixed_mean (const double data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_absdev (const double data[], const size_t stride, const size_t n);
+double gsl_stats_skew (const double data[], const size_t stride, const size_t n);
+double gsl_stats_kurtosis (const double data[], const size_t stride, const size_t n);
+double gsl_stats_lag1_autocorrelation (const double data[], const size_t stride, const size_t n);
+
+double gsl_stats_covariance (const double data1[], const size_t stride1,const double data2[], const size_t stride2, const size_t n);
+
+double gsl_stats_variance_m (const double data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_sd_m (const double data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_absdev_m (const double data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_skew_m_sd (const double data[], const size_t stride, const size_t n, const double mean, const double sd);
+double gsl_stats_kurtosis_m_sd (const double data[], const size_t stride, const size_t n, const double mean, const double sd);
+double gsl_stats_lag1_autocorrelation_m (const double data[], const size_t stride, const size_t n, const double mean);
+
+double gsl_stats_covariance_m (const double data1[], const size_t stride1,const double data2[], const size_t stride2, const size_t n, const double mean1, const double mean2);
+
+/* DEFINED FOR FLOATING POINT TYPES ONLY */
+
+double gsl_stats_wmean (const double w[], const size_t wstride, const double data[], const size_t stride, const size_t n);
+double gsl_stats_wvariance (const double w[], const size_t wstride, const double data[], const size_t stride, const size_t n);
+double gsl_stats_wsd (const double w[], const size_t wstride, const double data[], const size_t stride, const size_t n);
+double gsl_stats_wvariance_with_fixed_mean (const double w[], const size_t wstride, const double data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_wsd_with_fixed_mean (const double w[], const size_t wstride, const double data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_wabsdev (const double w[], const size_t wstride, const double data[], const size_t stride, const size_t n);
+double gsl_stats_wskew (const double w[], const size_t wstride, const double data[], const size_t stride, const size_t n);
+double gsl_stats_wkurtosis (const double w[], const size_t wstride, const double data[], const size_t stride, const size_t n);
+
+double gsl_stats_wvariance_m (const double w[], const size_t wstride, const double data[], const size_t stride, const size_t n, const double wmean);
+double gsl_stats_wsd_m (const double w[], const size_t wstride, const double data[], const size_t stride, const size_t n, const double wmean);
+double gsl_stats_wabsdev_m (const double w[], const size_t wstride, const double data[], const size_t stride, const size_t n, const double wmean);
+double gsl_stats_wskew_m_sd (const double w[], const size_t wstride, const double data[], const size_t stride, const size_t n, const double wmean, const double wsd);
+double gsl_stats_wkurtosis_m_sd (const double w[], const size_t wstride, const double data[], const size_t stride, const size_t n, const double wmean, const double wsd);
+
+/* END OF FLOATING POINT TYPES */
+
+double gsl_stats_pvariance (const double data1[], const size_t stride1, const size_t n1, const double data2[], const size_t stride2, const size_t n2);
+double gsl_stats_ttest (const double data1[], const size_t stride1, const size_t n1, const double data2[], const size_t stride2, const size_t n2);
+
+double gsl_stats_max (const double data[], const size_t stride, const size_t n);
+double gsl_stats_min (const double data[], const size_t stride, const size_t n);
+void gsl_stats_minmax (double * min, double * max, const double data[], const size_t stride, const size_t n);
+
+size_t gsl_stats_max_index (const double data[], const size_t stride, const size_t n);
+size_t gsl_stats_min_index (const double data[], const size_t stride, const size_t n);
+void gsl_stats_minmax_index (size_t * min_index, size_t * max_index, const double data[], const size_t stride, const size_t n);
+
+double gsl_stats_median_from_sorted_data (const double sorted_data[], const size_t stride, const size_t n) ;
+double gsl_stats_quantile_from_sorted_data (const double sorted_data[], const size_t stride, const size_t n, const double f) ;
+
+__END_DECLS
+
+#endif /* __GSL_STATISTICS_DOUBLE_H__ */
diff --git a/gsl-1.9/statistics/gsl_statistics_float.h b/gsl-1.9/statistics/gsl_statistics_float.h
new file mode 100644
index 0000000..657af7e
--- /dev/null
+++ b/gsl-1.9/statistics/gsl_statistics_float.h
@@ -0,0 +1,93 @@
+/* statistics/gsl_statistics_float.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Jim Davies, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_STATISTICS_FLOAT_H__
+#define __GSL_STATISTICS_FLOAT_H__
+
+#include <stddef.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+double gsl_stats_float_mean (const float data[], const size_t stride, const size_t n);
+double gsl_stats_float_variance (const float data[], const size_t stride, const size_t n);
+double gsl_stats_float_sd (const float data[], const size_t stride, const size_t n);
+double gsl_stats_float_variance_with_fixed_mean (const float data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_float_sd_with_fixed_mean (const float data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_float_absdev (const float data[], const size_t stride, const size_t n);
+double gsl_stats_float_skew (const float data[], const size_t stride, const size_t n);
+double gsl_stats_float_kurtosis (const float data[], const size_t stride, const size_t n);
+double gsl_stats_float_lag1_autocorrelation (const float data[], const size_t stride, const size_t n);
+
+double gsl_stats_float_covariance (const float data1[], const size_t stride1,const float data2[], const size_t stride2, const size_t n);
+
+double gsl_stats_float_variance_m (const float data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_float_sd_m (const float data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_float_absdev_m (const float data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_float_skew_m_sd (const float data[], const size_t stride, const size_t n, const double mean, const double sd);
+double gsl_stats_float_kurtosis_m_sd (const float data[], const size_t stride, const size_t n, const double mean, const double sd);
+double gsl_stats_float_lag1_autocorrelation_m (const float data[], const size_t stride, const size_t n, const double mean);
+
+double gsl_stats_float_covariance_m (const float data1[], const size_t stride1,const float data2[], const size_t stride2, const size_t n, const double mean1, const double mean2);
+
+/* DEFINED FOR FLOATING POINT TYPES ONLY */
+
+double gsl_stats_float_wmean (const float w[], const size_t wstride, const float data[], const size_t stride, const size_t n);
+double gsl_stats_float_wvariance (const float w[], const size_t wstride, const float data[], const size_t stride, const size_t n);
+double gsl_stats_float_wsd (const float w[], const size_t wstride, const float data[], const size_t stride, const size_t n);
+double gsl_stats_float_wvariance_with_fixed_mean (const float w[], const size_t wstride, const float data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_float_wsd_with_fixed_mean (const float w[], const size_t wstride, const float data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_float_wabsdev (const float w[], const size_t wstride, const float data[], const size_t stride, const size_t n);
+double gsl_stats_float_wskew (const float w[], const size_t wstride, const float data[], const size_t stride, const size_t n);
+double gsl_stats_float_wkurtosis (const float w[], const size_t wstride, const float data[], const size_t stride, const size_t n);
+
+double gsl_stats_float_wvariance_m (const float w[], const size_t wstride, const float data[], const size_t stride, const size_t n, const double wmean);
+double gsl_stats_float_wsd_m (const float w[], const size_t wstride, const float data[], const size_t stride, const size_t n, const double wmean);
+double gsl_stats_float_wabsdev_m (const float w[], const size_t wstride, const float data[], const size_t stride, const size_t n, const double wmean);
+double gsl_stats_float_wskew_m_sd (const float w[], const size_t wstride, const float data[], const size_t stride, const size_t n, const double wmean, const double wsd);
+double gsl_stats_float_wkurtosis_m_sd (const float w[], const size_t wstride, const float data[], const size_t stride, const size_t n, const double wmean, const double wsd);
+
+/* END OF FLOATING POINT TYPES */
+
+double gsl_stats_float_pvariance (const float data1[], const size_t stride1, const size_t n1, const float data2[], const size_t stride2, const size_t n2);
+double gsl_stats_float_ttest (const float data1[], const size_t stride1, const size_t n1, const float data2[], const size_t stride2, const size_t n2);
+
+float gsl_stats_float_max (const float data[], const size_t stride, const size_t n);
+float gsl_stats_float_min (const float data[], const size_t stride, const size_t n);
+void gsl_stats_float_minmax (float * min, float * max, const float data[], const size_t stride, const size_t n);
+
+size_t gsl_stats_float_max_index (const float data[], const size_t stride, const size_t n);
+size_t gsl_stats_float_min_index (const float data[], const size_t stride, const size_t n);
+void gsl_stats_float_minmax_index (size_t * min_index, size_t * max_index, const float data[], const size_t stride, const size_t n);
+
+double gsl_stats_float_median_from_sorted_data (const float sorted_data[], const size_t stride, const size_t n) ;
+double gsl_stats_float_quantile_from_sorted_data (const float sorted_data[], const size_t stride, const size_t n, const double f) ;
+
+__END_DECLS
+
+#endif /* __GSL_STATISTICS_FLOAT_H__ */
diff --git a/gsl-1.9/statistics/gsl_statistics_int.h b/gsl-1.9/statistics/gsl_statistics_int.h
new file mode 100644
index 0000000..62ff3d1
--- /dev/null
+++ b/gsl-1.9/statistics/gsl_statistics_int.h
@@ -0,0 +1,75 @@
+/* statistics/gsl_statistics_int.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Jim Davies, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_STATISTICS_INT_H__
+#define __GSL_STATISTICS_INT_H__
+
+#include <stddef.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+double gsl_stats_int_mean (const int data[], const size_t stride, const size_t n);
+double gsl_stats_int_variance (const int data[], const size_t stride, const size_t n);
+double gsl_stats_int_sd (const int data[], const size_t stride, const size_t n);
+double gsl_stats_int_variance_with_fixed_mean (const int data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_int_sd_with_fixed_mean (const int data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_int_absdev (const int data[], const size_t stride, const size_t n);
+double gsl_stats_int_skew (const int data[], const size_t stride, const size_t n);
+double gsl_stats_int_kurtosis (const int data[], const size_t stride, const size_t n);
+double gsl_stats_int_lag1_autocorrelation (const int data[], const size_t stride, const size_t n);
+
+double gsl_stats_int_covariance (const int data1[], const size_t stride1,const int data2[], const size_t stride2, const size_t n);
+
+double gsl_stats_int_variance_m (const int data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_int_sd_m (const int data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_int_absdev_m (const int data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_int_skew_m_sd (const int data[], const size_t stride, const size_t n, const double mean, const double sd);
+double gsl_stats_int_kurtosis_m_sd (const int data[], const size_t stride, const size_t n, const double mean, const double sd);
+double gsl_stats_int_lag1_autocorrelation_m (const int data[], const size_t stride, const size_t n, const double mean);
+
+double gsl_stats_int_covariance_m (const int data1[], const size_t stride1,const int data2[], const size_t stride2, const size_t n, const double mean1, const double mean2);
+
+
+double gsl_stats_int_pvariance (const int data1[], const size_t stride1, const size_t n1, const int data2[], const size_t stride2, const size_t n2);
+double gsl_stats_int_ttest (const int data1[], const size_t stride1, const size_t n1, const int data2[], const size_t stride2, const size_t n2);
+
+int gsl_stats_int_max (const int data[], const size_t stride, const size_t n);
+int gsl_stats_int_min (const int data[], const size_t stride, const size_t n);
+void gsl_stats_int_minmax (int * min, int * max, const int data[], const size_t stride, const size_t n);
+
+size_t gsl_stats_int_max_index (const int data[], const size_t stride, const size_t n);
+size_t gsl_stats_int_min_index (const int data[], const size_t stride, const size_t n);
+void gsl_stats_int_minmax_index (size_t * min_index, size_t * max_index, const int data[], const size_t stride, const size_t n);
+
+double gsl_stats_int_median_from_sorted_data (const int sorted_data[], const size_t stride, const size_t n) ;
+double gsl_stats_int_quantile_from_sorted_data (const int sorted_data[], const size_t stride, const size_t n, const double f) ;
+
+__END_DECLS
+
+#endif /* __GSL_STATISTICS_INT_H__ */
diff --git a/gsl-1.9/statistics/gsl_statistics_long.h b/gsl-1.9/statistics/gsl_statistics_long.h
new file mode 100644
index 0000000..870922f
--- /dev/null
+++ b/gsl-1.9/statistics/gsl_statistics_long.h
@@ -0,0 +1,75 @@
+/* statistics/gsl_statistics_long.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Jim Davies, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_STATISTICS_LONG_H__
+#define __GSL_STATISTICS_LONG_H__
+
+#include <stddef.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+double gsl_stats_long_mean (const long data[], const size_t stride, const size_t n);
+double gsl_stats_long_variance (const long data[], const size_t stride, const size_t n);
+double gsl_stats_long_sd (const long data[], const size_t stride, const size_t n);
+double gsl_stats_long_variance_with_fixed_mean (const long data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_long_sd_with_fixed_mean (const long data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_long_absdev (const long data[], const size_t stride, const size_t n);
+double gsl_stats_long_skew (const long data[], const size_t stride, const size_t n);
+double gsl_stats_long_kurtosis (const long data[], const size_t stride, const size_t n);
+double gsl_stats_long_lag1_autocorrelation (const long data[], const size_t stride, const size_t n);
+
+double gsl_stats_long_covariance (const long data1[], const size_t stride1,const long data2[], const size_t stride2, const size_t n);
+
+double gsl_stats_long_variance_m (const long data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_long_sd_m (const long data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_long_absdev_m (const long data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_long_skew_m_sd (const long data[], const size_t stride, const size_t n, const double mean, const double sd);
+double gsl_stats_long_kurtosis_m_sd (const long data[], const size_t stride, const size_t n, const double mean, const double sd);
+double gsl_stats_long_lag1_autocorrelation_m (const long data[], const size_t stride, const size_t n, const double mean);
+
+double gsl_stats_long_covariance_m (const long data1[], const size_t stride1,const long data2[], const size_t stride2, const size_t n, const double mean1, const double mean2);
+
+
+double gsl_stats_long_pvariance (const long data1[], const size_t stride1, const size_t n1, const long data2[], const size_t stride2, const size_t n2);
+double gsl_stats_long_ttest (const long data1[], const size_t stride1, const size_t n1, const long data2[], const size_t stride2, const size_t n2);
+
+long gsl_stats_long_max (const long data[], const size_t stride, const size_t n);
+long gsl_stats_long_min (const long data[], const size_t stride, const size_t n);
+void gsl_stats_long_minmax (long * min, long * max, const long data[], const size_t stride, const size_t n);
+
+size_t gsl_stats_long_max_index (const long data[], const size_t stride, const size_t n);
+size_t gsl_stats_long_min_index (const long data[], const size_t stride, const size_t n);
+void gsl_stats_long_minmax_index (size_t * min_index, size_t * max_index, const long data[], const size_t stride, const size_t n);
+
+double gsl_stats_long_median_from_sorted_data (const long sorted_data[], const size_t stride, const size_t n) ;
+double gsl_stats_long_quantile_from_sorted_data (const long sorted_data[], const size_t stride, const size_t n, const double f) ;
+
+__END_DECLS
+
+#endif /* __GSL_STATISTICS_LONG_H__ */
diff --git a/gsl-1.9/statistics/gsl_statistics_long_double.h b/gsl-1.9/statistics/gsl_statistics_long_double.h
new file mode 100644
index 0000000..5cc3255
--- /dev/null
+++ b/gsl-1.9/statistics/gsl_statistics_long_double.h
@@ -0,0 +1,93 @@
+/* statistics/gsl_statistics_long_double.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Jim Davies, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_STATISTICS_LONG_DOUBLE_H__
+#define __GSL_STATISTICS_LONG_DOUBLE_H__
+
+#include <stddef.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+double gsl_stats_long_double_mean (const long double data[], const size_t stride, const size_t n);
+double gsl_stats_long_double_variance (const long double data[], const size_t stride, const size_t n);
+double gsl_stats_long_double_sd (const long double data[], const size_t stride, const size_t n);
+double gsl_stats_long_double_variance_with_fixed_mean (const long double data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_long_double_sd_with_fixed_mean (const long double data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_long_double_absdev (const long double data[], const size_t stride, const size_t n);
+double gsl_stats_long_double_skew (const long double data[], const size_t stride, const size_t n);
+double gsl_stats_long_double_kurtosis (const long double data[], const size_t stride, const size_t n);
+double gsl_stats_long_double_lag1_autocorrelation (const long double data[], const size_t stride, const size_t n);
+
+double gsl_stats_long_double_covariance (const long double data1[], const size_t stride1,const long double data2[], const size_t stride2, const size_t n);
+
+double gsl_stats_long_double_variance_m (const long double data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_long_double_sd_m (const long double data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_long_double_absdev_m (const long double data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_long_double_skew_m_sd (const long double data[], const size_t stride, const size_t n, const double mean, const double sd);
+double gsl_stats_long_double_kurtosis_m_sd (const long double data[], const size_t stride, const size_t n, const double mean, const double sd);
+double gsl_stats_long_double_lag1_autocorrelation_m (const long double data[], const size_t stride, const size_t n, const double mean);
+
+double gsl_stats_long_double_covariance_m (const long double data1[], const size_t stride1,const long double data2[], const size_t stride2, const size_t n, const double mean1, const double mean2);
+
+/* DEFINED FOR FLOATING POINT TYPES ONLY */
+
+double gsl_stats_long_double_wmean (const long double w[], const size_t wstride, const long double data[], const size_t stride, const size_t n);
+double gsl_stats_long_double_wvariance (const long double w[], const size_t wstride, const long double data[], const size_t stride, const size_t n);
+double gsl_stats_long_double_wsd (const long double w[], const size_t wstride, const long double data[], const size_t stride, const size_t n);
+double gsl_stats_long_double_wvariance_with_fixed_mean (const long double w[], const size_t wstride, const long double data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_long_double_wsd_with_fixed_mean (const long double w[], const size_t wstride, const long double data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_long_double_wabsdev (const long double w[], const size_t wstride, const long double data[], const size_t stride, const size_t n);
+double gsl_stats_long_double_wskew (const long double w[], const size_t wstride, const long double data[], const size_t stride, const size_t n);
+double gsl_stats_long_double_wkurtosis (const long double w[], const size_t wstride, const long double data[], const size_t stride, const size_t n);
+
+double gsl_stats_long_double_wvariance_m (const long double w[], const size_t wstride, const long double data[], const size_t stride, const size_t n, const double wmean);
+double gsl_stats_long_double_wsd_m (const long double w[], const size_t wstride, const long double data[], const size_t stride, const size_t n, const double wmean);
+double gsl_stats_long_double_wabsdev_m (const long double w[], const size_t wstride, const long double data[], const size_t stride, const size_t n, const double wmean);
+double gsl_stats_long_double_wskew_m_sd (const long double w[], const size_t wstride, const long double data[], const size_t stride, const size_t n, const double wmean, const double wsd);
+double gsl_stats_long_double_wkurtosis_m_sd (const long double w[], const size_t wstride, const long double data[], const size_t stride, const size_t n, const double wmean, const double wsd);
+
+/* END OF FLOATING POINT TYPES */
+
+double gsl_stats_long_double_pvariance (const long double data1[], const size_t stride1, const size_t n1, const long double data2[], const size_t stride2, const size_t n2);
+double gsl_stats_long_double_ttest (const long double data1[], const size_t stride1, const size_t n1, const long double data2[], const size_t stride2, const size_t n2);
+
+long double gsl_stats_long_double_max (const long double data[], const size_t stride, const size_t n);
+long double gsl_stats_long_double_min (const long double data[], const size_t stride, const size_t n);
+void gsl_stats_long_double_minmax (long double * min, long double * max, const long double data[], const size_t stride, const size_t n);
+
+size_t gsl_stats_long_double_max_index (const long double data[], const size_t stride, const size_t n);
+size_t gsl_stats_long_double_min_index (const long double data[], const size_t stride, const size_t n);
+void gsl_stats_long_double_minmax_index (size_t * min_index, size_t * max_index, const long double data[], const size_t stride, const size_t n);
+
+double gsl_stats_long_double_median_from_sorted_data (const long double sorted_data[], const size_t stride, const size_t n) ;
+double gsl_stats_long_double_quantile_from_sorted_data (const long double sorted_data[], const size_t stride, const size_t n, const double f) ;
+
+__END_DECLS
+
+#endif /* __GSL_STATISTICS_LONG_DOUBLE_H__ */
diff --git a/gsl-1.9/statistics/gsl_statistics_short.h b/gsl-1.9/statistics/gsl_statistics_short.h
new file mode 100644
index 0000000..b4aebe1
--- /dev/null
+++ b/gsl-1.9/statistics/gsl_statistics_short.h
@@ -0,0 +1,75 @@
+/* statistics/gsl_statistics_short.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Jim Davies, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_STATISTICS_SHORT_H__
+#define __GSL_STATISTICS_SHORT_H__
+
+#include <stddef.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+double gsl_stats_short_mean (const short data[], const size_t stride, const size_t n);
+double gsl_stats_short_variance (const short data[], const size_t stride, const size_t n);
+double gsl_stats_short_sd (const short data[], const size_t stride, const size_t n);
+double gsl_stats_short_variance_with_fixed_mean (const short data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_short_sd_with_fixed_mean (const short data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_short_absdev (const short data[], const size_t stride, const size_t n);
+double gsl_stats_short_skew (const short data[], const size_t stride, const size_t n);
+double gsl_stats_short_kurtosis (const short data[], const size_t stride, const size_t n);
+double gsl_stats_short_lag1_autocorrelation (const short data[], const size_t stride, const size_t n);
+
+double gsl_stats_short_covariance (const short data1[], const size_t stride1,const short data2[], const size_t stride2, const size_t n);
+
+double gsl_stats_short_variance_m (const short data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_short_sd_m (const short data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_short_absdev_m (const short data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_short_skew_m_sd (const short data[], const size_t stride, const size_t n, const double mean, const double sd);
+double gsl_stats_short_kurtosis_m_sd (const short data[], const size_t stride, const size_t n, const double mean, const double sd);
+double gsl_stats_short_lag1_autocorrelation_m (const short data[], const size_t stride, const size_t n, const double mean);
+
+double gsl_stats_short_covariance_m (const short data1[], const size_t stride1,const short data2[], const size_t stride2, const size_t n, const double mean1, const double mean2);
+
+
+double gsl_stats_short_pvariance (const short data1[], const size_t stride1, const size_t n1, const short data2[], const size_t stride2, const size_t n2);
+double gsl_stats_short_ttest (const short data1[], const size_t stride1, const size_t n1, const short data2[], const size_t stride2, const size_t n2);
+
+short gsl_stats_short_max (const short data[], const size_t stride, const size_t n);
+short gsl_stats_short_min (const short data[], const size_t stride, const size_t n);
+void gsl_stats_short_minmax (short * min, short * max, const short data[], const size_t stride, const size_t n);
+
+size_t gsl_stats_short_max_index (const short data[], const size_t stride, const size_t n);
+size_t gsl_stats_short_min_index (const short data[], const size_t stride, const size_t n);
+void gsl_stats_short_minmax_index (size_t * min_index, size_t * max_index, const short data[], const size_t stride, const size_t n);
+
+double gsl_stats_short_median_from_sorted_data (const short sorted_data[], const size_t stride, const size_t n) ;
+double gsl_stats_short_quantile_from_sorted_data (const short sorted_data[], const size_t stride, const size_t n, const double f) ;
+
+__END_DECLS
+
+#endif /* __GSL_STATISTICS_SHORT_H__ */
diff --git a/gsl-1.9/statistics/gsl_statistics_uchar.h b/gsl-1.9/statistics/gsl_statistics_uchar.h
new file mode 100644
index 0000000..f51f745
--- /dev/null
+++ b/gsl-1.9/statistics/gsl_statistics_uchar.h
@@ -0,0 +1,75 @@
+/* statistics/gsl_statistics_uchar.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Jim Davies, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_STATISTICS_UCHAR_H__
+#define __GSL_STATISTICS_UCHAR_H__
+
+#include <stddef.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+double gsl_stats_uchar_mean (const unsigned char data[], const size_t stride, const size_t n);
+double gsl_stats_uchar_variance (const unsigned char data[], const size_t stride, const size_t n);
+double gsl_stats_uchar_sd (const unsigned char data[], const size_t stride, const size_t n);
+double gsl_stats_uchar_variance_with_fixed_mean (const unsigned char data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_uchar_sd_with_fixed_mean (const unsigned char data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_uchar_absdev (const unsigned char data[], const size_t stride, const size_t n);
+double gsl_stats_uchar_skew (const unsigned char data[], const size_t stride, const size_t n);
+double gsl_stats_uchar_kurtosis (const unsigned char data[], const size_t stride, const size_t n);
+double gsl_stats_uchar_lag1_autocorrelation (const unsigned char data[], const size_t stride, const size_t n);
+
+double gsl_stats_uchar_covariance (const unsigned char data1[], const size_t stride1,const unsigned char data2[], const size_t stride2, const size_t n);
+
+double gsl_stats_uchar_variance_m (const unsigned char data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_uchar_sd_m (const unsigned char data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_uchar_absdev_m (const unsigned char data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_uchar_skew_m_sd (const unsigned char data[], const size_t stride, const size_t n, const double mean, const double sd);
+double gsl_stats_uchar_kurtosis_m_sd (const unsigned char data[], const size_t stride, const size_t n, const double mean, const double sd);
+double gsl_stats_uchar_lag1_autocorrelation_m (const unsigned char data[], const size_t stride, const size_t n, const double mean);
+
+double gsl_stats_uchar_covariance_m (const unsigned char data1[], const size_t stride1,const unsigned char data2[], const size_t stride2, const size_t n, const double mean1, const double mean2);
+
+
+double gsl_stats_uchar_pvariance (const unsigned char data1[], const size_t stride1, const size_t n1, const unsigned char data2[], const size_t stride2, const size_t n2);
+double gsl_stats_uchar_ttest (const unsigned char data1[], const size_t stride1, const size_t n1, const unsigned char data2[], const size_t stride2, const size_t n2);
+
+unsigned char gsl_stats_uchar_max (const unsigned char data[], const size_t stride, const size_t n);
+unsigned char gsl_stats_uchar_min (const unsigned char data[], const size_t stride, const size_t n);
+void gsl_stats_uchar_minmax (unsigned char * min, unsigned char * max, const unsigned char data[], const size_t stride, const size_t n);
+
+size_t gsl_stats_uchar_max_index (const unsigned char data[], const size_t stride, const size_t n);
+size_t gsl_stats_uchar_min_index (const unsigned char data[], const size_t stride, const size_t n);
+void gsl_stats_uchar_minmax_index (size_t * min_index, size_t * max_index, const unsigned char data[], const size_t stride, const size_t n);
+
+double gsl_stats_uchar_median_from_sorted_data (const unsigned char sorted_data[], const size_t stride, const size_t n) ;
+double gsl_stats_uchar_quantile_from_sorted_data (const unsigned char sorted_data[], const size_t stride, const size_t n, const double f) ;
+
+__END_DECLS
+
+#endif /* __GSL_STATISTICS_UCHAR_H__ */
diff --git a/gsl-1.9/statistics/gsl_statistics_uint.h b/gsl-1.9/statistics/gsl_statistics_uint.h
new file mode 100644
index 0000000..0dba69f
--- /dev/null
+++ b/gsl-1.9/statistics/gsl_statistics_uint.h
@@ -0,0 +1,75 @@
+/* statistics/gsl_statistics_uint.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Jim Davies, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_STATISTICS_UINT_H__
+#define __GSL_STATISTICS_UINT_H__
+
+#include <stddef.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+double gsl_stats_uint_mean (const unsigned int data[], const size_t stride, const size_t n);
+double gsl_stats_uint_variance (const unsigned int data[], const size_t stride, const size_t n);
+double gsl_stats_uint_sd (const unsigned int data[], const size_t stride, const size_t n);
+double gsl_stats_uint_variance_with_fixed_mean (const unsigned int data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_uint_sd_with_fixed_mean (const unsigned int data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_uint_absdev (const unsigned int data[], const size_t stride, const size_t n);
+double gsl_stats_uint_skew (const unsigned int data[], const size_t stride, const size_t n);
+double gsl_stats_uint_kurtosis (const unsigned int data[], const size_t stride, const size_t n);
+double gsl_stats_uint_lag1_autocorrelation (const unsigned int data[], const size_t stride, const size_t n);
+
+double gsl_stats_uint_covariance (const unsigned int data1[], const size_t stride1,const unsigned int data2[], const size_t stride2, const size_t n);
+
+double gsl_stats_uint_variance_m (const unsigned int data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_uint_sd_m (const unsigned int data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_uint_absdev_m (const unsigned int data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_uint_skew_m_sd (const unsigned int data[], const size_t stride, const size_t n, const double mean, const double sd);
+double gsl_stats_uint_kurtosis_m_sd (const unsigned int data[], const size_t stride, const size_t n, const double mean, const double sd);
+double gsl_stats_uint_lag1_autocorrelation_m (const unsigned int data[], const size_t stride, const size_t n, const double mean);
+
+double gsl_stats_uint_covariance_m (const unsigned int data1[], const size_t stride1,const unsigned int data2[], const size_t stride2, const size_t n, const double mean1, const double mean2);
+
+
+double gsl_stats_uint_pvariance (const unsigned int data1[], const size_t stride1, const size_t n1, const unsigned int data2[], const size_t stride2, const size_t n2);
+double gsl_stats_uint_ttest (const unsigned int data1[], const size_t stride1, const size_t n1, const unsigned int data2[], const size_t stride2, const size_t n2);
+
+unsigned int gsl_stats_uint_max (const unsigned int data[], const size_t stride, const size_t n);
+unsigned int gsl_stats_uint_min (const unsigned int data[], const size_t stride, const size_t n);
+void gsl_stats_uint_minmax (unsigned int * min, unsigned int * max, const unsigned int data[], const size_t stride, const size_t n);
+
+size_t gsl_stats_uint_max_index (const unsigned int data[], const size_t stride, const size_t n);
+size_t gsl_stats_uint_min_index (const unsigned int data[], const size_t stride, const size_t n);
+void gsl_stats_uint_minmax_index (size_t * min_index, size_t * max_index, const unsigned int data[], const size_t stride, const size_t n);
+
+double gsl_stats_uint_median_from_sorted_data (const unsigned int sorted_data[], const size_t stride, const size_t n) ;
+double gsl_stats_uint_quantile_from_sorted_data (const unsigned int sorted_data[], const size_t stride, const size_t n, const double f) ;
+
+__END_DECLS
+
+#endif /* __GSL_STATISTICS_UINT_H__ */
diff --git a/gsl-1.9/statistics/gsl_statistics_ulong.h b/gsl-1.9/statistics/gsl_statistics_ulong.h
new file mode 100644
index 0000000..761101e
--- /dev/null
+++ b/gsl-1.9/statistics/gsl_statistics_ulong.h
@@ -0,0 +1,75 @@
+/* statistics/gsl_statistics_ulong.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Jim Davies, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_STATISTICS_ULONG_H__
+#define __GSL_STATISTICS_ULONG_H__
+
+#include <stddef.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+double gsl_stats_ulong_mean (const unsigned long data[], const size_t stride, const size_t n);
+double gsl_stats_ulong_variance (const unsigned long data[], const size_t stride, const size_t n);
+double gsl_stats_ulong_sd (const unsigned long data[], const size_t stride, const size_t n);
+double gsl_stats_ulong_variance_with_fixed_mean (const unsigned long data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_ulong_sd_with_fixed_mean (const unsigned long data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_ulong_absdev (const unsigned long data[], const size_t stride, const size_t n);
+double gsl_stats_ulong_skew (const unsigned long data[], const size_t stride, const size_t n);
+double gsl_stats_ulong_kurtosis (const unsigned long data[], const size_t stride, const size_t n);
+double gsl_stats_ulong_lag1_autocorrelation (const unsigned long data[], const size_t stride, const size_t n);
+
+double gsl_stats_ulong_covariance (const unsigned long data1[], const size_t stride1,const unsigned long data2[], const size_t stride2, const size_t n);
+
+double gsl_stats_ulong_variance_m (const unsigned long data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_ulong_sd_m (const unsigned long data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_ulong_absdev_m (const unsigned long data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_ulong_skew_m_sd (const unsigned long data[], const size_t stride, const size_t n, const double mean, const double sd);
+double gsl_stats_ulong_kurtosis_m_sd (const unsigned long data[], const size_t stride, const size_t n, const double mean, const double sd);
+double gsl_stats_ulong_lag1_autocorrelation_m (const unsigned long data[], const size_t stride, const size_t n, const double mean);
+
+double gsl_stats_ulong_covariance_m (const unsigned long data1[], const size_t stride1,const unsigned long data2[], const size_t stride2, const size_t n, const double mean1, const double mean2);
+
+
+double gsl_stats_ulong_pvariance (const unsigned long data1[], const size_t stride1, const size_t n1, const unsigned long data2[], const size_t stride2, const size_t n2);
+double gsl_stats_ulong_ttest (const unsigned long data1[], const size_t stride1, const size_t n1, const unsigned long data2[], const size_t stride2, const size_t n2);
+
+unsigned long gsl_stats_ulong_max (const unsigned long data[], const size_t stride, const size_t n);
+unsigned long gsl_stats_ulong_min (const unsigned long data[], const size_t stride, const size_t n);
+void gsl_stats_ulong_minmax (unsigned long * min, unsigned long * max, const unsigned long data[], const size_t stride, const size_t n);
+
+size_t gsl_stats_ulong_max_index (const unsigned long data[], const size_t stride, const size_t n);
+size_t gsl_stats_ulong_min_index (const unsigned long data[], const size_t stride, const size_t n);
+void gsl_stats_ulong_minmax_index (size_t * min_index, size_t * max_index, const unsigned long data[], const size_t stride, const size_t n);
+
+double gsl_stats_ulong_median_from_sorted_data (const unsigned long sorted_data[], const size_t stride, const size_t n) ;
+double gsl_stats_ulong_quantile_from_sorted_data (const unsigned long sorted_data[], const size_t stride, const size_t n, const double f) ;
+
+__END_DECLS
+
+#endif /* __GSL_STATISTICS_ULONG_H__ */
diff --git a/gsl-1.9/statistics/gsl_statistics_ushort.h b/gsl-1.9/statistics/gsl_statistics_ushort.h
new file mode 100644
index 0000000..929be9e
--- /dev/null
+++ b/gsl-1.9/statistics/gsl_statistics_ushort.h
@@ -0,0 +1,75 @@
+/* statistics/gsl_statistics_ushort.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Jim Davies, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_STATISTICS_USHORT_H__
+#define __GSL_STATISTICS_USHORT_H__
+
+#include <stddef.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+double gsl_stats_ushort_mean (const unsigned short data[], const size_t stride, const size_t n);
+double gsl_stats_ushort_variance (const unsigned short data[], const size_t stride, const size_t n);
+double gsl_stats_ushort_sd (const unsigned short data[], const size_t stride, const size_t n);
+double gsl_stats_ushort_variance_with_fixed_mean (const unsigned short data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_ushort_sd_with_fixed_mean (const unsigned short data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_ushort_absdev (const unsigned short data[], const size_t stride, const size_t n);
+double gsl_stats_ushort_skew (const unsigned short data[], const size_t stride, const size_t n);
+double gsl_stats_ushort_kurtosis (const unsigned short data[], const size_t stride, const size_t n);
+double gsl_stats_ushort_lag1_autocorrelation (const unsigned short data[], const size_t stride, const size_t n);
+
+double gsl_stats_ushort_covariance (const unsigned short data1[], const size_t stride1,const unsigned short data2[], const size_t stride2, const size_t n);
+
+double gsl_stats_ushort_variance_m (const unsigned short data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_ushort_sd_m (const unsigned short data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_ushort_absdev_m (const unsigned short data[], const size_t stride, const size_t n, const double mean);
+double gsl_stats_ushort_skew_m_sd (const unsigned short data[], const size_t stride, const size_t n, const double mean, const double sd);
+double gsl_stats_ushort_kurtosis_m_sd (const unsigned short data[], const size_t stride, const size_t n, const double mean, const double sd);
+double gsl_stats_ushort_lag1_autocorrelation_m (const unsigned short data[], const size_t stride, const size_t n, const double mean);
+
+double gsl_stats_ushort_covariance_m (const unsigned short data1[], const size_t stride1,const unsigned short data2[], const size_t stride2, const size_t n, const double mean1, const double mean2);
+
+
+double gsl_stats_ushort_pvariance (const unsigned short data1[], const size_t stride1, const size_t n1, const unsigned short data2[], const size_t stride2, const size_t n2);
+double gsl_stats_ushort_ttest (const unsigned short data1[], const size_t stride1, const size_t n1, const unsigned short data2[], const size_t stride2, const size_t n2);
+
+unsigned short gsl_stats_ushort_max (const unsigned short data[], const size_t stride, const size_t n);
+unsigned short gsl_stats_ushort_min (const unsigned short data[], const size_t stride, const size_t n);
+void gsl_stats_ushort_minmax (unsigned short * min, unsigned short * max, const unsigned short data[], const size_t stride, const size_t n);
+
+size_t gsl_stats_ushort_max_index (const unsigned short data[], const size_t stride, const size_t n);
+size_t gsl_stats_ushort_min_index (const unsigned short data[], const size_t stride, const size_t n);
+void gsl_stats_ushort_minmax_index (size_t * min_index, size_t * max_index, const unsigned short data[], const size_t stride, const size_t n);
+
+double gsl_stats_ushort_median_from_sorted_data (const unsigned short sorted_data[], const size_t stride, const size_t n) ;
+double gsl_stats_ushort_quantile_from_sorted_data (const unsigned short sorted_data[], const size_t stride, const size_t n, const double f) ;
+
+__END_DECLS
+
+#endif /* __GSL_STATISTICS_USHORT_H__ */
diff --git a/gsl-1.9/statistics/kurtosis.c b/gsl-1.9/statistics/kurtosis.c
new file mode 100644
index 0000000..4d14f51
--- /dev/null
+++ b/gsl-1.9/statistics/kurtosis.c
@@ -0,0 +1,71 @@
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_statistics.h>
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "kurtosis_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "kurtosis_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "kurtosis_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "kurtosis_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "kurtosis_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "kurtosis_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "kurtosis_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "kurtosis_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "kurtosis_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "kurtosis_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "kurtosis_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
+
+
diff --git a/gsl-1.9/statistics/kurtosis_source.c b/gsl-1.9/statistics/kurtosis_source.c
new file mode 100644
index 0000000..6260796
--- /dev/null
+++ b/gsl-1.9/statistics/kurtosis_source.c
@@ -0,0 +1,55 @@
+/* statistics/kurtosis_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Jim Davies, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+double
+FUNCTION(gsl_stats,kurtosis) (const BASE data[], const size_t stride, const size_t n)
+{
+ const double mean = FUNCTION(gsl_stats,mean)(data, stride, n);
+ const double est_sd = FUNCTION(gsl_stats,sd_m)(data, stride, n, mean);
+ return FUNCTION(gsl_stats,kurtosis_m_sd)(data, stride, n, mean, est_sd);
+}
+
+double
+FUNCTION(gsl_stats,kurtosis_m_sd) (const BASE data[],
+ const size_t stride,
+ const size_t n,
+ const double mean,
+ const double sd)
+{
+ /* takes a dataset and finds the kurtosis */
+
+ long double avg = 0, kurtosis;
+ size_t i;
+
+ /* find the fourth moment the deviations, normalized by the sd */
+
+ /* we use a recurrence relation to stably update a running value so
+ there aren't any large sums that can overflow */
+
+ for (i = 0; i < n; i++)
+ {
+ const long double x = (data[i * stride] - mean) / sd;
+ avg += (x * x * x * x - avg)/(i + 1);
+ }
+
+ kurtosis = avg - 3.0; /* makes kurtosis zero for a Gaussian */
+
+ return kurtosis;
+}
+
diff --git a/gsl-1.9/statistics/lag1.c b/gsl-1.9/statistics/lag1.c
new file mode 100644
index 0000000..4bc09f1
--- /dev/null
+++ b/gsl-1.9/statistics/lag1.c
@@ -0,0 +1,70 @@
+#include <config.h>
+#include <gsl/gsl_statistics.h>
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "lag1_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "lag1_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "lag1_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "lag1_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "lag1_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "lag1_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "lag1_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "lag1_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "lag1_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "lag1_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "lag1_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
+
+
diff --git a/gsl-1.9/statistics/lag1_source.c b/gsl-1.9/statistics/lag1_source.c
new file mode 100644
index 0000000..117e6d8
--- /dev/null
+++ b/gsl-1.9/statistics/lag1_source.c
@@ -0,0 +1,51 @@
+/* statistics/lag1_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Jim Davies, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+
+double
+FUNCTION(gsl_stats,lag1_autocorrelation) (const BASE data[], const size_t stride, const size_t n)
+{
+ const double mean = FUNCTION(gsl_stats,mean) (data, stride, n);
+ return FUNCTION(gsl_stats,lag1_autocorrelation_m)(data, stride, n, mean);
+}
+
+double
+FUNCTION(gsl_stats,lag1_autocorrelation_m) (const BASE data[], const size_t stride, const size_t size, const double mean)
+{
+ /* Compute the lag-1 autocorrelation of a dataset using the
+ recurrence relation */
+
+ size_t i;
+
+ long double r1 ;
+ long double q = 0 ;
+ long double v = (data[0 * stride] - mean) * (data[0 * stride] - mean) ;
+
+ for (i = 1; i < size ; i++)
+ {
+ const long double delta0 = (data[(i-1) * stride] - mean);
+ const long double delta1 = (data[i * stride] - mean);
+ q += (delta0 * delta1 - q)/(i + 1);
+ v += (delta1 * delta1 - v)/(i + 1);
+ }
+
+ r1 = q / v ;
+
+ return r1;
+}
diff --git a/gsl-1.9/statistics/mean.c b/gsl-1.9/statistics/mean.c
new file mode 100644
index 0000000..24dd04f
--- /dev/null
+++ b/gsl-1.9/statistics/mean.c
@@ -0,0 +1,70 @@
+#include <config.h>
+#include <gsl/gsl_statistics.h>
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "mean_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "mean_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "mean_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "mean_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "mean_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "mean_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "mean_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "mean_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "mean_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "mean_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "mean_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
+
+
diff --git a/gsl-1.9/statistics/mean_source.c b/gsl-1.9/statistics/mean_source.c
new file mode 100644
index 0000000..235d7bd
--- /dev/null
+++ b/gsl-1.9/statistics/mean_source.c
@@ -0,0 +1,35 @@
+/* statistics/mean_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Jim Davies, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+double
+FUNCTION (gsl_stats, mean) (const BASE data[], const size_t stride, const size_t size)
+{
+ /* Compute the arithmetic mean of a dataset using the recurrence relation
+ mean_(n) = mean(n-1) + (data[n] - mean(n-1))/(n+1) */
+
+ long double mean = 0;
+ size_t i;
+
+ for (i = 0; i < size; i++)
+ {
+ mean += (data[i * stride] - mean) / (i + 1);
+ }
+
+ return mean;
+}
diff --git a/gsl-1.9/statistics/median.c b/gsl-1.9/statistics/median.c
new file mode 100644
index 0000000..e42301b
--- /dev/null
+++ b/gsl-1.9/statistics/median.c
@@ -0,0 +1,71 @@
+#include <config.h>
+#include <gsl/gsl_statistics.h>
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "median_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "median_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "median_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "median_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "median_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "median_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "median_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "median_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "median_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "median_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "median_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
+
+
+
diff --git a/gsl-1.9/statistics/median_source.c b/gsl-1.9/statistics/median_source.c
new file mode 100644
index 0000000..8ed1f65
--- /dev/null
+++ b/gsl-1.9/statistics/median_source.c
@@ -0,0 +1,44 @@
+/* statistics/median_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Jim Davies, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+
+double
+FUNCTION(gsl_stats,median_from_sorted_data) (const BASE sorted_data[],
+ const size_t stride,
+ const size_t n)
+{
+ double median ;
+ const size_t lhs = (n - 1) / 2 ;
+ const size_t rhs = n / 2 ;
+
+ if (n == 0)
+ return 0.0 ;
+
+ if (lhs == rhs)
+ {
+ median = sorted_data[lhs * stride] ;
+ }
+ else
+ {
+ median = (sorted_data[lhs * stride] + sorted_data[rhs * stride])/2.0 ;
+ }
+
+ return median ;
+}
+
diff --git a/gsl-1.9/statistics/minmax.c b/gsl-1.9/statistics/minmax.c
new file mode 100644
index 0000000..e3ce002
--- /dev/null
+++ b/gsl-1.9/statistics/minmax.c
@@ -0,0 +1,72 @@
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_statistics.h>
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "minmax_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "minmax_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "minmax_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "minmax_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "minmax_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "minmax_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "minmax_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "minmax_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "minmax_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "minmax_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "minmax_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
+
+
diff --git a/gsl-1.9/statistics/minmax_source.c b/gsl-1.9/statistics/minmax_source.c
new file mode 100644
index 0000000..2c52252
--- /dev/null
+++ b/gsl-1.9/statistics/minmax_source.c
@@ -0,0 +1,207 @@
+/* statistics/minmax_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Jim Davies, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+
+BASE
+FUNCTION (gsl_stats,max) (const BASE data[], const size_t stride,
+ const size_t n)
+{
+ /* finds the largest member of a dataset */
+
+ BASE max = data[0 * stride];
+ size_t i;
+
+ for (i = 0; i < n; i++)
+ {
+ BASE xi = data[i * stride];
+
+ if (xi > max)
+ max = xi;
+#ifdef FP
+ if (isnan (xi))
+ return xi;
+#endif
+ }
+
+ return max;
+}
+
+BASE
+FUNCTION (gsl_stats,min) (const BASE data[], const size_t stride,
+ const size_t n)
+{
+ /* finds the smallest member of a dataset */
+
+ BASE min = data[0 * stride];
+ size_t i;
+
+ for (i = 0; i < n; i++)
+ {
+ BASE xi = data[i * stride];
+
+ if (xi < min)
+ min = xi;
+#ifdef FP
+ if (isnan (xi))
+ return xi;
+#endif
+ }
+
+ return min;
+
+}
+
+void
+FUNCTION (gsl_stats,minmax) (BASE * min_out, BASE * max_out,
+ const BASE data[], const size_t stride,
+ const size_t n)
+{
+ /* finds the smallest and largest members of a dataset */
+
+ BASE min = data[0 * stride];
+ BASE max = data[0 * stride];
+ size_t i;
+
+ for (i = 0; i < n; i++)
+ {
+ BASE xi = data[i * stride];
+
+ if (xi < min)
+ min = xi;
+
+ if (xi > max)
+ max = xi;
+
+#ifdef FP
+ if (isnan (xi))
+ {
+ min = xi;
+ max = xi;
+ break;
+ }
+#endif
+
+ }
+
+ *min_out = min;
+ *max_out = max;
+}
+
+size_t
+FUNCTION (gsl_stats,max_index) (const BASE data[], const size_t stride,
+ const size_t n)
+{
+ /* finds the index of the largest member of a dataset */
+ /* if there is more than one largest value then we choose the first */
+
+ BASE max = data[0 * stride];
+ size_t i, max_index = 0;
+
+ for (i = 0; i < n; i++)
+ {
+ BASE xi = data[i * stride];
+
+ if (xi > max)
+ {
+ max = xi;
+ max_index = i;
+ }
+
+#ifdef FP
+ if (isnan (xi))
+ {
+ return i;
+ }
+#endif
+ }
+
+ return max_index;
+}
+
+size_t
+FUNCTION (gsl_stats,min_index) (const BASE data[], const size_t stride,
+ const size_t n)
+{
+ /* finds the index of the smallest member of a dataset */
+ /* if there is more than one largest value then we choose the first */
+
+ BASE min = data[0 * stride];
+ size_t i, min_index = 0;
+
+ for (i = 0; i < n; i++)
+ {
+ BASE xi = data[i * stride];
+
+ if (xi < min)
+ {
+ min = xi;
+ min_index = i;
+ }
+
+#ifdef FP
+ if (isnan (xi))
+ {
+ return i;
+ }
+#endif
+ }
+
+ return min_index;
+}
+
+void
+FUNCTION (gsl_stats,minmax_index) (size_t * min_index_out,
+ size_t * max_index_out, const BASE data[],
+ const size_t stride, const size_t n)
+{
+ /* finds the smallest and largest members of a dataset */
+
+ BASE min = data[0 * stride];
+ BASE max = data[0 * stride];
+ size_t i, min_index = 0, max_index = 0;
+
+ for (i = 0; i < n; i++)
+ {
+ BASE xi = data[i * stride];
+
+ if (xi < min)
+ {
+ min = xi;
+ min_index = i;
+ }
+
+ if (xi > max)
+ {
+ max = xi;
+ max_index = i;
+ }
+
+#ifdef FP
+ if (isnan (xi))
+ {
+ min_index = i;
+ max_index = i;
+ break;
+ }
+#endif
+ }
+
+ *min_index_out = min_index;
+ *max_index_out = max_index;
+}
diff --git a/gsl-1.9/statistics/p_variance.c b/gsl-1.9/statistics/p_variance.c
new file mode 100644
index 0000000..dafb43e
--- /dev/null
+++ b/gsl-1.9/statistics/p_variance.c
@@ -0,0 +1,71 @@
+#include <config.h>
+#include <gsl/gsl_statistics.h>
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "p_variance_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "p_variance_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "p_variance_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "p_variance_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "p_variance_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "p_variance_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "p_variance_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "p_variance_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "p_variance_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "p_variance_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "p_variance_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
+
+
+
diff --git a/gsl-1.9/statistics/p_variance_source.c b/gsl-1.9/statistics/p_variance_source.c
new file mode 100644
index 0000000..fe9b27a
--- /dev/null
+++ b/gsl-1.9/statistics/p_variance_source.c
@@ -0,0 +1,39 @@
+/* statistics/p_variance_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Jim Davies, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+
+double
+FUNCTION(gsl_stats,pvariance) (const BASE data1[],
+ const size_t stride1, const size_t n1,
+ const BASE data2[],
+ const size_t stride2, const size_t n2)
+{
+ /* Find the pooled variance of two datasets */
+
+ const double var1 = FUNCTION(gsl_stats,variance) (data1, stride1, n1);
+ const double var2 = FUNCTION(gsl_stats,variance) (data2, stride2, n2);
+
+ /* calculate the pooled variance */
+
+ const double pooled_variance =
+ (((n1 - 1) * var1) + ((n2 - 1) * var2)) / (n1 + n2 - 2);
+
+ return pooled_variance;
+}
+
diff --git a/gsl-1.9/statistics/quantiles.c b/gsl-1.9/statistics/quantiles.c
new file mode 100644
index 0000000..96a3a25
--- /dev/null
+++ b/gsl-1.9/statistics/quantiles.c
@@ -0,0 +1,71 @@
+#include <config.h>
+#include <gsl/gsl_statistics.h>
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "quantiles_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "quantiles_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "quantiles_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "quantiles_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "quantiles_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "quantiles_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "quantiles_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "quantiles_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "quantiles_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "quantiles_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "quantiles_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
+
+
+
diff --git a/gsl-1.9/statistics/quantiles_source.c b/gsl-1.9/statistics/quantiles_source.c
new file mode 100644
index 0000000..393469d
--- /dev/null
+++ b/gsl-1.9/statistics/quantiles_source.c
@@ -0,0 +1,45 @@
+/* statistics/quantiles_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Jim Davies, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+
+double
+FUNCTION(gsl_stats,quantile_from_sorted_data) (const BASE sorted_data[],
+ const size_t stride,
+ const size_t n,
+ const double f)
+{
+ const double index = f * (n - 1) ;
+ const size_t lhs = (int)index ;
+ const double delta = index - lhs ;
+ double result;
+
+ if (n == 0)
+ return 0.0 ;
+
+ if (lhs == n - 1)
+ {
+ result = sorted_data[lhs * stride] ;
+ }
+ else
+ {
+ result = (1 - delta) * sorted_data[lhs * stride] + delta * sorted_data[(lhs + 1) * stride] ;
+ }
+
+ return result ;
+}
diff --git a/gsl-1.9/statistics/skew.c b/gsl-1.9/statistics/skew.c
new file mode 100644
index 0000000..00f379c
--- /dev/null
+++ b/gsl-1.9/statistics/skew.c
@@ -0,0 +1,72 @@
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_statistics.h>
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "skew_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "skew_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "skew_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "skew_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "skew_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "skew_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "skew_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "skew_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "skew_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "skew_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "skew_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
+
+
+
diff --git a/gsl-1.9/statistics/skew_source.c b/gsl-1.9/statistics/skew_source.c
new file mode 100644
index 0000000..bbbca45
--- /dev/null
+++ b/gsl-1.9/statistics/skew_source.c
@@ -0,0 +1,51 @@
+/* statistics/skew_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Jim Davies, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+double
+FUNCTION(gsl_stats,skew) (const BASE data[], const size_t stride, const size_t n)
+{
+ const double mean = FUNCTION(gsl_stats,mean)(data, stride, n);
+ const double sd = FUNCTION(gsl_stats,sd_m)(data, stride, n, mean);
+ return FUNCTION(gsl_stats,skew_m_sd)(data, stride, n, mean, sd);
+}
+
+double
+FUNCTION(gsl_stats,skew_m_sd) (const BASE data[],
+ const size_t stride, const size_t n,
+ const double mean, const double sd)
+{
+ /* takes a dataset and finds the skewness */
+
+ long double skew = 0;
+ size_t i;
+
+ /* find the sum of the cubed deviations, normalized by the sd. */
+
+ /* we use a recurrence relation to stably update a running value so
+ there aren't any large sums that can overflow */
+
+ for (i = 0; i < n; i++)
+ {
+ const long double x = (data[i * stride] - mean) / sd;
+ skew += (x * x * x - skew) / (i + 1);
+ }
+
+ return skew;
+}
+
diff --git a/gsl-1.9/statistics/test.c b/gsl-1.9/statistics/test.c
new file mode 100644
index 0000000..800fac4
--- /dev/null
+++ b/gsl-1.9/statistics/test.c
@@ -0,0 +1,132 @@
+/* statistics/test.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Jim Davies, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <string.h>
+#include <stdlib.h>
+#include <math.h>
+
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_sort.h>
+#include <gsl/gsl_sort_vector.h>
+#include <gsl/gsl_statistics.h>
+#include <gsl/gsl_ieee_utils.h>
+
+int test_nist (void);
+
+/* Test program for mean.c. JimDavies 7.96 */
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "test_float_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "test_float_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "test_float_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "test_int_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "test_int_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "test_int_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "test_int_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "test_int_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "test_int_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "test_int_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "test_int_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
+
+
+int
+main (void)
+{
+ size_t s1, s2;
+
+ gsl_ieee_env_setup ();
+
+ for (s1 = 1; s1 < 4 ; s1++)
+ {
+ s2 = (s1 < 3) ? 1 : (s1 - 1) ;
+
+ test_func (s1,s2);
+ test_float_func (s1,s2);
+ test_long_double_func (s1,s2);
+
+ test_ulong_func (s1,s2);
+ test_long_func (s1,s2);
+ test_uint_func (s1,s2);
+ test_int_func (s1,s2);
+ test_ushort_func (s1,s2);
+ test_short_func (s1,s2);
+ test_uchar_func (s1,s2);
+ test_char_func (s1,s2);
+ }
+
+ test_nist();
+
+ exit (gsl_test_summary ());
+}
+
diff --git a/gsl-1.9/statistics/test_float_source.c b/gsl-1.9/statistics/test_float_source.c
new file mode 100644
index 0000000..7b29dfa
--- /dev/null
+++ b/gsl-1.9/statistics/test_float_source.c
@@ -0,0 +1,382 @@
+/* statistics/test_float_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Jim Davies, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+void FUNCTION (test, func) (const size_t stridea, const size_t strideb);
+
+void
+FUNCTION (test, func) (const size_t stridea, const size_t strideb)
+{
+ /* sample sets of doubles */
+ size_t i;
+ const size_t na = 14, nb = 14;
+
+ const double rawa[] =
+ {.0421, .0941, .1064, .0242, .1331,
+ .0773, .0243, .0815, .1186, .0356,
+ .0728, .0999, .0614, .0479};
+
+ const double rawb[] =
+ {.1081, .0986, .1566, .1961, .1125,
+ .1942, .1079, .1021, .1583, .1673,
+ .1675, .1856, .1688, .1512};
+
+ const double raww[] =
+ {.0000, .0000, .0000, 3.000, .0000,
+ 1.000, 1.000, 1.000, 0.000, .5000,
+ 7.000, 5.000, 4.000, 0.123};
+
+ BASE * sorted ;
+
+ BASE * groupa = (BASE *) malloc (stridea * na * sizeof(BASE));
+ BASE * groupb = (BASE *) malloc (strideb * nb * sizeof(BASE));
+ BASE * w = (BASE *) malloc (strideb * na * sizeof(BASE));
+
+#ifdef BASE_FLOAT
+ double rel = 1e-6;
+#else
+ double rel = 1e-10;
+#endif
+
+ for (i = 0 ; i < na ; i++)
+ groupa[i * stridea] = (BASE) rawa[i] ;
+
+ for (i = 0 ; i < na ; i++)
+ w[i * strideb] = (BASE) raww[i] ;
+
+ for (i = 0 ; i < nb ; i++)
+ groupb[i * strideb] = (BASE) rawb[i] ;
+
+
+ {
+ double mean = FUNCTION(gsl_stats,mean) (groupa, stridea, na);
+ double expected = 0.0728;
+ gsl_test_rel (mean, expected, rel, NAME(gsl_stats) "_mean");
+ }
+
+ {
+ double mean = FUNCTION(gsl_stats,mean) (groupa, stridea, na);
+ double var = FUNCTION(gsl_stats,variance_with_fixed_mean) (groupa, stridea, na, mean);
+ double expected = 0.00113837428571429;
+ gsl_test_rel (var, expected, rel, NAME(gsl_stats) "_variance_with_fixed_mean");
+ }
+
+
+ {
+ double mean = FUNCTION(gsl_stats,mean) (groupa, stridea, na);
+ double var = FUNCTION(gsl_stats,sd_with_fixed_mean) (groupa, stridea, na, mean);
+ double expected = 0.0337398026922845;
+ gsl_test_rel (var, expected, rel, NAME(gsl_stats) "_sd_with_fixed_mean");
+ }
+
+
+ {
+ double var = FUNCTION(gsl_stats,variance) (groupb, strideb, nb);
+ double expected = 0.00124956615384615;
+ gsl_test_rel (var, expected, rel, NAME(gsl_stats) "_variance");
+ }
+
+ {
+ double sd = FUNCTION(gsl_stats,sd) (groupa, stridea, na);
+ double expected = 0.0350134479659107;
+ gsl_test_rel (sd, expected, rel, NAME(gsl_stats) "_sd");
+ }
+
+ {
+ double absdev = FUNCTION(gsl_stats,absdev) (groupa, stridea, na);
+ double expected = 0.0287571428571429;
+ gsl_test_rel (absdev, expected, rel, NAME(gsl_stats) "_absdev");
+ }
+
+ {
+ double skew = FUNCTION(gsl_stats,skew) (groupa, stridea, na);
+ double expected = 0.0954642051479004;
+ gsl_test_rel (skew, expected, rel, NAME(gsl_stats) "_skew");
+ }
+
+ {
+ double kurt = FUNCTION(gsl_stats,kurtosis) (groupa, stridea, na);
+ double expected = -1.38583851548909 ;
+ gsl_test_rel (kurt, expected, rel, NAME(gsl_stats) "_kurtosis");
+ }
+
+ {
+ double wmean = FUNCTION(gsl_stats,wmean) (w, strideb, groupa, stridea, na);
+ double expected = 0.0678111523670601;
+ gsl_test_rel (wmean, expected, rel, NAME(gsl_stats) "_wmean");
+ }
+
+ {
+ double wmean = FUNCTION(gsl_stats,wmean) (w, strideb, groupa, stridea, na);
+ double wvar = FUNCTION(gsl_stats,wvariance_with_fixed_mean) (w, strideb, groupa, stridea, na, wmean);
+ double expected = 0.000615793060878654;
+ gsl_test_rel (wvar, expected, rel, NAME(gsl_stats) "_wvariance_with_fixed_mean");
+ }
+
+ {
+ double est_wvar = FUNCTION(gsl_stats,wvariance) (w, strideb, groupa, stridea, na);
+ double expected = 0.000769562962860317;
+ gsl_test_rel (est_wvar, expected, rel, NAME(gsl_stats) "_wvariance");
+ }
+
+ {
+ double wsd = FUNCTION(gsl_stats,wsd) (w, strideb, groupa, stridea, na);
+ double expected = 0.0277409978706664;
+ gsl_test_rel (wsd, expected, rel, NAME(gsl_stats) "_wsd");
+ }
+
+ {
+ double wabsdev = FUNCTION(gsl_stats,wabsdev) (w, strideb, groupa, stridea, na);
+ double expected = 0.0193205027504008;
+ gsl_test_rel (wabsdev, expected, rel, NAME(gsl_stats) "_wabsdev");
+ }
+
+ {
+ double wskew = FUNCTION(gsl_stats,wskew) (w, strideb, groupa, stridea, na);
+ double expected = -0.373631000307076;
+ gsl_test_rel (wskew, expected, rel, NAME(gsl_stats) "_wskew");
+ }
+
+ {
+ double wkurt = FUNCTION(gsl_stats,wkurtosis) (w, strideb, groupa, stridea, na);
+ double expected = -1.48114233353963;
+ gsl_test_rel (wkurt, expected, rel, NAME(gsl_stats) "_wkurtosis");
+ }
+
+ {
+ double c = FUNCTION(gsl_stats,covariance) (groupa, stridea, groupb, strideb, nb);
+ double expected = -0.000139021538461539;
+ gsl_test_rel (c, expected, rel, NAME(gsl_stats) "_covariance");
+ }
+
+
+ {
+ double pv = FUNCTION(gsl_stats,pvariance) (groupa, stridea, na, groupb, strideb, nb);
+ double expected = 0.00123775384615385;
+ gsl_test_rel (pv, expected, rel, NAME(gsl_stats) "_pvariance");
+ }
+
+ {
+ double t = FUNCTION(gsl_stats,ttest) (groupa, stridea, na, groupb, strideb, nb);
+ double expected = -5.67026326985851;
+ gsl_test_rel (t, expected, rel, NAME(gsl_stats) "_ttest");
+ }
+
+ {
+ BASE expected = (BASE)0.1331;
+ gsl_test (FUNCTION(gsl_stats,max) (groupa, stridea, na) != expected,
+ NAME(gsl_stats) "_max (" OUT_FORMAT " observed vs " OUT_FORMAT " expected)",
+ FUNCTION(gsl_stats,max) (groupa, stridea, na), expected);
+ }
+
+ {
+ BASE min = FUNCTION(gsl_stats,min) (groupa, stridea, na);
+ BASE expected = (BASE)0.0242;
+ gsl_test (min != expected,
+ NAME(gsl_stats) "_min (" OUT_FORMAT " observed vs " OUT_FORMAT " expected)",
+ min, expected);
+ }
+
+ {
+ BASE min, max;
+ BASE expected_max = (BASE)0.1331;
+ BASE expected_min = (BASE)0.0242;
+
+ FUNCTION(gsl_stats,minmax) (&min, &max, groupa, stridea, na);
+
+ gsl_test (max != expected_max,
+ NAME(gsl_stats) "_minmax max (" OUT_FORMAT " observed vs " OUT_FORMAT " expected)",
+ max, expected_max);
+ gsl_test (min != expected_min,
+ NAME(gsl_stats) "_minmax min (" OUT_FORMAT " observed vs " OUT_FORMAT " expected)",
+ min, expected_min);
+ }
+
+ {
+ int max_index = FUNCTION(gsl_stats,max_index) (groupa, stridea, na);
+ int expected = 4;
+ gsl_test (max_index != expected,
+ NAME(gsl_stats) "_max_index (%d observed vs %d expected)",
+ max_index, expected);
+ }
+
+ {
+ int min_index = FUNCTION(gsl_stats,min_index) (groupa, stridea, na);
+ int expected = 3;
+ gsl_test (min_index != expected,
+ NAME(gsl_stats) "_min_index (%d observed vs %d expected)",
+ min_index, expected);
+ }
+
+ {
+ size_t min_index, max_index;
+ size_t expected_max_index = 4;
+ size_t expected_min_index = 3;
+
+ FUNCTION(gsl_stats,minmax_index) (&min_index, &max_index, groupa, stridea, na);
+
+ gsl_test (max_index != expected_max_index,
+ NAME(gsl_stats) "_minmax_index max (%u observed vs %u expected)",
+ max_index, expected_max_index);
+ gsl_test (min_index != expected_min_index,
+ NAME(gsl_stats) "_minmax_index min (%u observed vs %u expected)",
+ min_index, expected_min_index);
+ }
+
+
+ sorted = (BASE *) malloc(stridea * na * sizeof(BASE)) ;
+
+ for (i = 0 ; i < na ; i++)
+ sorted[stridea * i] = groupa[stridea * i] ;
+
+ TYPE(gsl_sort)(sorted, stridea, na) ;
+
+ {
+ double median = FUNCTION(gsl_stats,median_from_sorted_data)(sorted, stridea, na) ;
+ double expected = 0.07505;
+ gsl_test_rel (median,expected, rel,
+ NAME(gsl_stats) "_median_from_sorted_data (even)");
+ }
+
+ {
+ double median = FUNCTION(gsl_stats,median_from_sorted_data)(sorted, stridea, na - 1) ;
+ double expected = 0.0728;
+ gsl_test_rel (median,expected, rel,
+ NAME(gsl_stats) "_median_from_sorted_data");
+ }
+
+
+ {
+ double zeroth = FUNCTION(gsl_stats,quantile_from_sorted_data)(sorted, stridea, na, 0.0) ;
+ double expected = 0.0242;
+ gsl_test_rel (zeroth,expected, rel,
+ NAME(gsl_stats) "_quantile_from_sorted_data (0)");
+ }
+
+ {
+ double top = FUNCTION(gsl_stats,quantile_from_sorted_data)(sorted, stridea, na, 1.0) ;
+ double expected = 0.1331;
+ gsl_test_rel (top,expected, rel,
+ NAME(gsl_stats) "_quantile_from_sorted_data (100)");
+ }
+
+ {
+ double median = FUNCTION(gsl_stats,quantile_from_sorted_data)(sorted, stridea, na, 0.5) ;
+ double expected = 0.07505;
+ gsl_test_rel (median,expected, rel,
+ NAME(gsl_stats) "_quantile_from_sorted_data (50even)");
+ }
+
+ {
+ double median = FUNCTION(gsl_stats,quantile_from_sorted_data)(sorted, stridea, na - 1, 0.5);
+ double expected = 0.0728;
+ gsl_test_rel (median,expected, rel,
+ NAME(gsl_stats) "_quantile_from_sorted_data (50odd)");
+
+ }
+
+ /* Test for IEEE handling - set third element to NaN */
+
+ groupa [3*stridea] = GSL_NAN;
+
+ {
+ BASE max = FUNCTION(gsl_stats,max) (groupa, stridea, na);
+ BASE expected = GSL_NAN;
+ gsl_test (!isnan(max),
+ NAME(gsl_stats) "_max NaN (" OUT_FORMAT " observed vs " OUT_FORMAT " expected)",
+ max, expected);
+ }
+
+ {
+ BASE min = FUNCTION(gsl_stats,min) (groupa, stridea, na);
+ BASE expected = GSL_NAN;
+ gsl_test (!isnan(min),
+ NAME(gsl_stats) "_min NaN (" OUT_FORMAT " observed vs " OUT_FORMAT " expected)",
+ min, expected);
+ }
+
+ {
+ BASE min, max;
+ BASE expected_max = GSL_NAN;
+ BASE expected_min = GSL_NAN;
+
+ FUNCTION(gsl_stats,minmax) (&min, &max, groupa, stridea, na);
+
+ gsl_test (!isnan(max),
+ NAME(gsl_stats) "_minmax max NaN (" OUT_FORMAT " observed vs " OUT_FORMAT " expected)",
+ max, expected_max);
+ gsl_test (!isnan(min),
+ NAME(gsl_stats) "_minmax min NaN (" OUT_FORMAT " observed vs " OUT_FORMAT " expected)",
+ min, expected_min);
+ }
+
+#ifdef FAST
+ {
+ BASE min, max;
+ BASE expected_max = GSL_NAN;
+ BASE expected_min = GSL_NAN;
+
+ FUNCTION(gsl_stats,minmax) (&min, &max, groupa, stridea, na-1);
+
+ gsl_test (!isnan(max),
+ NAME(gsl_stats) "_minmax(-1) max NaN (" OUT_FORMAT " observed vs " OUT_FORMAT " expected)",
+ max, expected_max);
+ gsl_test (!isnan(min),
+ NAME(gsl_stats) "_minmax(-1) min NaN (" OUT_FORMAT " observed vs " OUT_FORMAT " expected)",
+ min, expected_min);
+ }
+#endif
+
+
+ {
+ int max_index = FUNCTION(gsl_stats,max_index) (groupa, stridea, na);
+ int expected = 3;
+ gsl_test (max_index != expected,
+ NAME(gsl_stats) "_max_index NaN (%d observed vs %d expected)",
+ max_index, expected);
+ }
+
+ {
+ int min_index = FUNCTION(gsl_stats,min_index) (groupa, stridea, na);
+ int expected = 3;
+ gsl_test (min_index != expected,
+ NAME(gsl_stats) "_min_index NaN (%d observed vs %d expected)",
+ min_index, expected);
+ }
+
+ {
+ size_t min_index, max_index;
+ size_t expected_max_index = 3;
+ size_t expected_min_index = 3;
+
+ FUNCTION(gsl_stats,minmax_index) (&min_index, &max_index, groupa, stridea, na);
+
+ gsl_test (max_index != expected_max_index,
+ NAME(gsl_stats) "_minmax_index max NaN (%u observed vs %u expected)",
+ max_index, expected_max_index);
+ gsl_test (min_index != expected_min_index,
+ NAME(gsl_stats) "_minmax_index min NaN (%u observed vs %u expected)",
+ min_index, expected_min_index);
+ }
+
+ free (sorted);
+ free (groupa);
+ free (groupb);
+ free (w);
+
+}
diff --git a/gsl-1.9/statistics/test_int_source.c b/gsl-1.9/statistics/test_int_source.c
new file mode 100644
index 0000000..1441f0b
--- /dev/null
+++ b/gsl-1.9/statistics/test_int_source.c
@@ -0,0 +1,253 @@
+/* statistics/test_int_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Jim Davies, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+void FUNCTION (test, func) (const size_t stridea, const size_t strideb);
+
+void
+FUNCTION (test, func) (const size_t stridea, const size_t strideb)
+{
+ /* sample sets of integers */
+ size_t i;
+ const size_t ina = 20, inb = 20;
+
+ const BASE raw1[] = {1, 2, 3, 4, 5, 6} ;
+
+ const BASE irawa[] =
+ {17, 18, 16, 18, 12,
+ 20, 18, 20, 20, 22,
+ 20, 10, 8, 12, 16,
+ 16, 18, 20, 18, 21};
+
+ const BASE irawb[] =
+ {19, 20, 22, 24, 10,
+ 25, 20, 22, 21, 23,
+ 20, 10, 12, 14, 12,
+ 20, 22, 24, 23, 17};
+
+ BASE * sorted ;
+
+ BASE * test1 = (BASE *) malloc (stridea * 6 * sizeof(BASE));
+ BASE * igroupa = (BASE *) malloc (stridea * ina * sizeof(BASE));
+ BASE * igroupb = (BASE *) malloc (strideb * inb * sizeof(BASE));
+
+ double rel = 1e-10 ;
+
+ for (i = 0 ; i < ina ; i++)
+ igroupa[i * stridea] = irawa[i] ;
+
+ for (i = 0 ; i < inb ; i++)
+ igroupb[i * strideb] = irawb[i] ;
+
+ for (i = 0 ; i < 6 ; i++)
+ test1[i * stridea] = raw1[i] ;
+
+
+
+ {
+ double mean = FUNCTION(gsl_stats,mean) (igroupa, stridea, ina);
+ double expected = 17.0;
+ gsl_test_rel (mean,expected, rel, NAME(gsl_stats) "_mean (integer)");
+ }
+
+ {
+ double mean = FUNCTION(gsl_stats,mean) (test1, stridea, 6);
+ double expected = 3.5;
+ gsl_test_rel (mean,expected, rel, NAME(gsl_stats) "_mean (fractional)");
+ }
+
+ {
+ double mean = FUNCTION(gsl_stats,mean) (igroupa, stridea, ina);
+ double var = FUNCTION(gsl_stats,variance_with_fixed_mean) (igroupa, stridea, ina, mean);
+ double expected = 13.7;
+ gsl_test_rel (var, expected, rel, NAME(gsl_stats) "_variance_with_fixed_mean");
+ }
+
+ {
+ double mean = FUNCTION(gsl_stats,mean) (igroupa, stridea, ina);
+ double sd = FUNCTION(gsl_stats,sd_with_fixed_mean) (igroupa, stridea, ina, mean);
+ double expected = 3.70135110466435;
+ gsl_test_rel (sd, expected, rel, NAME(gsl_stats) "_sd_with_fixed_mean");
+ }
+
+ {
+ double var = FUNCTION(gsl_stats,variance) (igroupa, stridea, ina);
+ double expected = 14.4210526315789;
+ gsl_test_rel (var, expected, rel, NAME(gsl_stats) "_variance");
+ }
+
+ {
+ double sd_est = FUNCTION(gsl_stats,sd) (igroupa, stridea, ina);
+ double expected = 3.79750610685209;
+ gsl_test_rel (sd_est, expected, rel, NAME(gsl_stats) "_sd");
+ }
+
+ {
+ double absdev = FUNCTION(gsl_stats,absdev) (igroupa, stridea, ina);
+ double expected = 2.9;
+ gsl_test_rel (absdev, expected, rel, NAME(gsl_stats) "_absdev");
+ }
+
+ {
+ double skew = FUNCTION(gsl_stats,skew) (igroupa, stridea, ina);
+ double expected = -0.909355923168064;
+ gsl_test_rel (skew, expected, rel, NAME(gsl_stats) "_skew");
+ }
+
+ {
+ double kurt = FUNCTION(gsl_stats,kurtosis) (igroupa, stridea, ina);
+ double expected = -0.233692524908094 ;
+ gsl_test_rel (kurt, expected, rel, NAME(gsl_stats) "_kurtosis");
+ }
+
+ {
+ double c = FUNCTION(gsl_stats,covariance) (igroupa, stridea, igroupb, strideb, inb);
+ double expected = 14.5263157894737;
+ gsl_test_rel (c, expected, rel, NAME(gsl_stats) "_covariance");
+ }
+
+
+ {
+ double pv = FUNCTION(gsl_stats,pvariance) (igroupa, stridea, ina, igroupb, strideb, inb);
+ double expected = 18.8421052631579;
+ gsl_test_rel (pv, expected, rel, NAME(gsl_stats) "_pvariance");
+ }
+
+ {
+ double t = FUNCTION(gsl_stats,ttest) (igroupa, stridea, ina, igroupb, strideb, inb);
+ double expected = -1.45701922702927;
+ gsl_test_rel (t, expected, rel, NAME(gsl_stats) "_ttest");
+ }
+
+ {
+ int max = FUNCTION(gsl_stats,max) (igroupa, stridea, ina);
+ int expected = 22;
+ gsl_test (max != expected,
+ NAME(gsl_stats) "_max (%d observed vs %d expected)", max, expected);
+ }
+
+ {
+ int min = FUNCTION(gsl_stats,min) (igroupa, stridea, ina);
+ int expected = 8;
+ gsl_test (min != expected,
+ NAME(gsl_stats) "_min (%d observed vs %d expected)", min, expected);
+ }
+
+ {
+ BASE min, max;
+ BASE expected_max = 22;
+ BASE expected_min = 8;
+
+ FUNCTION(gsl_stats,minmax) (&min, &max, igroupa, stridea, ina);
+
+ gsl_test (max != expected_max,
+ NAME(gsl_stats) "_minmax max (" OUT_FORMAT " observed vs " OUT_FORMAT " expected)",
+ max, expected_max);
+ gsl_test (min != expected_min,
+ NAME(gsl_stats) "_minmax min (" OUT_FORMAT " observed vs " OUT_FORMAT " expected)",
+ min, expected_min);
+ }
+
+ {
+ int max_index = FUNCTION(gsl_stats,max_index) (igroupa, stridea, ina);
+ int expected = 9 ;
+ gsl_test (max_index != expected,
+ NAME(gsl_stats) "_max_index (%d observed vs %d expected)",
+ max_index, expected);
+ }
+
+ {
+ int min_index = FUNCTION(gsl_stats,min_index) (igroupa, stridea, ina);
+ int expected = 12 ;
+ gsl_test (min_index != expected,
+ NAME(gsl_stats) "_min_index (%d observed vs %d expected)",
+ min_index, expected);
+ }
+
+ {
+ size_t min_index, max_index;
+ size_t expected_max_index = 9;
+ size_t expected_min_index = 12;
+
+ FUNCTION(gsl_stats,minmax_index) (&min_index, &max_index, igroupa, stridea, ina);
+
+ gsl_test (max_index != expected_max_index,
+ NAME(gsl_stats) "_minmax_index max (%u observed vs %u expected)",
+ max_index, expected_max_index);
+ gsl_test (min_index != expected_min_index,
+ NAME(gsl_stats) "_minmax_index min (%u observed vs %u expected)",
+ min_index, expected_min_index);
+ }
+
+
+ sorted = (BASE *) malloc(stridea * ina * sizeof(BASE)) ;
+
+ for (i = 0 ; i < ina ; i++)
+ sorted[stridea * i] = igroupa[stridea * i] ;
+
+
+ TYPE(gsl_sort)(sorted, stridea, ina) ;
+
+ {
+ double median = FUNCTION(gsl_stats,median_from_sorted_data)(sorted, stridea, ina) ;
+ double expected = 18;
+ gsl_test_rel (median,expected, rel,
+ NAME(gsl_stats) "_median_from_sorted_data (even)");
+ }
+
+ {
+ double median = FUNCTION(gsl_stats,median_from_sorted_data)(sorted, stridea, ina - 1) ;
+ double expected = 18;
+ gsl_test_rel (median,expected, rel,
+ NAME(gsl_stats) "_median_from_sorted_data (odd)");
+ }
+
+
+ {
+ double zeroth = FUNCTION(gsl_stats,quantile_from_sorted_data)(sorted, stridea, ina, 0.0) ;
+ double expected = 8;
+ gsl_test_rel (zeroth,expected, rel,
+ NAME(gsl_stats) "_quantile_from_sorted_data (0)");
+ }
+
+ {
+ double top = FUNCTION(gsl_stats,quantile_from_sorted_data)(sorted, stridea, ina, 1.0) ;
+ double expected = 22;
+ gsl_test_rel (top,expected, rel,
+ NAME(gsl_stats) "_quantile_from_sorted_data (100)");
+ }
+
+ {
+ double median = FUNCTION(gsl_stats,quantile_from_sorted_data)(sorted, stridea, ina, 0.5) ;
+ double expected = 18;
+ gsl_test_rel (median,expected, rel,
+ NAME(gsl_stats) "_quantile_from_sorted_data (50, even)");
+ }
+
+ {
+ double median = FUNCTION(gsl_stats,quantile_from_sorted_data)(sorted, stridea, ina - 1, 0.5);
+ double expected = 18;
+ gsl_test_rel (median,expected, rel,
+ NAME(gsl_stats) "_quantile_from_sorted_data (50, odd)");
+ }
+
+ free (sorted);
+ free (igroupa);
+ free (igroupb);
+ free (test1);
+}
diff --git a/gsl-1.9/statistics/test_nist.c b/gsl-1.9/statistics/test_nist.c
new file mode 100644
index 0000000..5c5180d
--- /dev/null
+++ b/gsl-1.9/statistics/test_nist.c
@@ -0,0 +1,503 @@
+/* statistics/test_nist.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Jim Davies, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* These tests are based on the NIST Statistical Reference Datasets
+ See http://www.nist.gov/itl/div898/strd/index.html for more
+ information. */
+
+#include <config.h>
+#include <stdlib.h>
+#include <math.h>
+
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_statistics.h>
+#include <gsl/gsl_ieee_utils.h>
+
+int
+test_nist (void)
+{
+ size_t i ;
+
+ const size_t nlew = 200 ;
+
+ const double lew[200] = {
+ -213, -564, -35, -15, 141, 115, -420, -360, 203, -338, -431, 194,
+ -220, -513, 154, -125, -559, 92, -21, -579, -52, 99, -543, -175,
+ 162, -457, -346, 204, -300, -474, 164, -107, -572, -8, 83, -541,
+ -224, 180, -420, -374, 201, -236, -531, 83, 27, -564, -112, 131,
+ -507, -254, 199, -311, -495, 143, -46, -579, -90, 136, -472, -338,
+ 202, -287, -477, 169, -124, -568, 17, 48, -568, -135, 162, -430,
+ -422, 172, -74, -577, -13, 92, -534, -243, 194, -355, -465, 156,
+ -81, -578, -64, 139, -449, -384, 193, -198, -538, 110, -44, -577,
+ -6, 66, -552, -164, 161, -460, -344, 205, -281, -504, 134, -28,
+ -576, -118, 156, -437, -381, 200, -220, -540, 83, 11, -568, -160,
+ 172, -414, -408, 188, -125, -572, -32, 139, -492, -321, 205, -262,
+ -504, 142, -83, -574, 0, 48, -571, -106, 137, -501, -266, 190,
+ -391, -406, 194, -186, -553, 83, -13, -577, -49, 103, -515, -280,
+ 201, 300, -506, 131, -45, -578, -80, 138, -462, -361, 201, -211,
+ -554, 32, 74, -533, -235, 187, -372, -442, 182, -147, -566, 25,
+ 68, -535, -244, 194, -351, -463, 174, -125, -570, 15, 72, -550,
+ -190, 172, -424, -385, 198, -218, -536, 96 } ;
+
+ const size_t nlottery = 218 ;
+
+ const double lottery[218] = {
+ 162, 671, 933, 414, 788, 730, 817, 33, 536, 875, 670, 236, 473, 167,
+ 877, 980, 316, 950, 456, 92, 517, 557, 956, 954, 104, 178, 794, 278,
+ 147, 773, 437, 435, 502, 610, 582, 780, 689, 562, 964, 791, 28, 97,
+ 848, 281, 858, 538, 660, 972, 671, 613, 867, 448, 738, 966, 139, 636,
+ 847, 659, 754, 243, 122, 455, 195, 968, 793, 59, 730, 361, 574, 522,
+ 97, 762, 431, 158, 429, 414, 22, 629, 788, 999, 187, 215, 810, 782,
+ 47, 34, 108, 986, 25, 644, 829, 630, 315, 567, 919, 331, 207, 412,
+ 242, 607, 668, 944, 749, 168, 864, 442, 533, 805, 372, 63, 458, 777,
+ 416, 340, 436, 140, 919, 350, 510, 572, 905, 900, 85, 389, 473, 758,
+ 444, 169, 625, 692, 140, 897, 672, 288, 312, 860, 724, 226, 884, 508,
+ 976, 741, 476, 417, 831, 15, 318, 432, 241, 114, 799, 955, 833, 358,
+ 935, 146, 630, 830, 440, 642, 356, 373, 271, 715, 367, 393, 190, 669,
+ 8, 861, 108, 795, 269, 590, 326, 866, 64, 523, 862, 840, 219, 382,
+ 998, 4, 628, 305, 747, 247, 34, 747, 729, 645, 856, 974, 24, 568, 24,
+ 694, 608, 480, 410, 729, 947, 293, 53, 930, 223, 203, 677, 227, 62,
+ 455, 387, 318, 562, 242, 428, 968 } ;
+
+ const size_t nmavro = 50 ;
+
+ const double mavro[50] = {
+ 2.00180, 2.00170, 2.00180, 2.00190, 2.00180, 2.00170, 2.00150,
+ 2.00140, 2.00150, 2.00150, 2.00170, 2.00180, 2.00180, 2.00190,
+ 2.00190, 2.00210, 2.00200, 2.00160, 2.00140, 2.00130, 2.00130,
+ 2.00150, 2.00150, 2.00160, 2.00150, 2.00140, 2.00130, 2.00140,
+ 2.00150, 2.00140, 2.00150, 2.00160, 2.00150, 2.00160, 2.00190,
+ 2.00200, 2.00200, 2.00210, 2.00220, 2.00230, 2.00240, 2.00250,
+ 2.00270, 2.00260, 2.00260, 2.00260, 2.00270, 2.00260, 2.00250,
+ 2.00240 } ;
+
+ const size_t nmichelson = 100 ;
+
+ const double michelson [100] = {
+ 299.85, 299.74, 299.90, 300.07, 299.93, 299.85, 299.95, 299.98,
+ 299.98, 299.88, 300.00, 299.98, 299.93, 299.65, 299.76, 299.81,
+ 300.00, 300.00, 299.96, 299.96, 299.96, 299.94, 299.96, 299.94,
+ 299.88, 299.80, 299.85, 299.88, 299.90, 299.84, 299.83, 299.79,
+ 299.81, 299.88, 299.88, 299.83, 299.80, 299.79, 299.76, 299.80,
+ 299.88, 299.88, 299.88, 299.86, 299.72, 299.72, 299.62, 299.86,
+ 299.97, 299.95, 299.88, 299.91, 299.85, 299.87, 299.84, 299.84,
+ 299.85, 299.84, 299.84, 299.84, 299.89, 299.81, 299.81, 299.82,
+ 299.80, 299.77, 299.76, 299.74, 299.75, 299.76, 299.91, 299.92,
+ 299.89, 299.86, 299.88, 299.72, 299.84, 299.85, 299.85, 299.78,
+ 299.89, 299.84, 299.78, 299.81, 299.76, 299.81, 299.79, 299.81,
+ 299.82, 299.85, 299.87, 299.87, 299.81, 299.74, 299.81, 299.94,
+ 299.95, 299.80, 299.81, 299.87 } ;
+
+ const size_t npidigits = 5000 ;
+ const double pidigits [5000] = { 3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8,
+ 9, 7, 9, 3, 2, 3, 8, 4, 6, 2, 6, 4, 3, 3, 8, 3, 2, 7, 9, 5, 0, 2,
+ 8, 8, 4, 1, 9, 7, 1, 6, 9, 3, 9, 9, 3, 7, 5, 1, 0, 5, 8, 2, 0, 9,
+ 7, 4, 9, 4, 4, 5, 9, 2, 3, 0, 7, 8, 1, 6, 4, 0, 6, 2, 8, 6, 2, 0,
+ 8, 9, 9, 8, 6, 2, 8, 0, 3, 4, 8, 2, 5, 3, 4, 2, 1, 1, 7, 0, 6, 7,
+ 9, 8, 2, 1, 4, 8, 0, 8, 6, 5, 1, 3, 2, 8, 2, 3, 0, 6, 6, 4, 7, 0,
+ 9, 3, 8, 4, 4, 6, 0, 9, 5, 5, 0, 5, 8, 2, 2, 3, 1, 7, 2, 5, 3, 5,
+ 9, 4, 0, 8, 1, 2, 8, 4, 8, 1, 1, 1, 7, 4, 5, 0, 2, 8, 4, 1, 0, 2,
+ 7, 0, 1, 9, 3, 8, 5, 2, 1, 1, 0, 5, 5, 5, 9, 6, 4, 4, 6, 2, 2, 9,
+ 4, 8, 9, 5, 4, 9, 3, 0, 3, 8, 1, 9, 6, 4, 4, 2, 8, 8, 1, 0, 9, 7,
+ 5, 6, 6, 5, 9, 3, 3, 4, 4, 6, 1, 2, 8, 4, 7, 5, 6, 4, 8, 2, 3, 3,
+ 7, 8, 6, 7, 8, 3, 1, 6, 5, 2, 7, 1, 2, 0, 1, 9, 0, 9, 1, 4, 5, 6,
+ 4, 8, 5, 6, 6, 9, 2, 3, 4, 6, 0, 3, 4, 8, 6, 1, 0, 4, 5, 4, 3, 2,
+ 6, 6, 4, 8, 2, 1, 3, 3, 9, 3, 6, 0, 7, 2, 6, 0, 2, 4, 9, 1, 4, 1,
+ 2, 7, 3, 7, 2, 4, 5, 8, 7, 0, 0, 6, 6, 0, 6, 3, 1, 5, 5, 8, 8, 1,
+ 7, 4, 8, 8, 1, 5, 2, 0, 9, 2, 0, 9, 6, 2, 8, 2, 9, 2, 5, 4, 0, 9,
+ 1, 7, 1, 5, 3, 6, 4, 3, 6, 7, 8, 9, 2, 5, 9, 0, 3, 6, 0, 0, 1, 1,
+ 3, 3, 0, 5, 3, 0, 5, 4, 8, 8, 2, 0, 4, 6, 6, 5, 2, 1, 3, 8, 4, 1,
+ 4, 6, 9, 5, 1, 9, 4, 1, 5, 1, 1, 6, 0, 9, 4, 3, 3, 0, 5, 7, 2, 7,
+ 0, 3, 6, 5, 7, 5, 9, 5, 9, 1, 9, 5, 3, 0, 9, 2, 1, 8, 6, 1, 1, 7,
+ 3, 8, 1, 9, 3, 2, 6, 1, 1, 7, 9, 3, 1, 0, 5, 1, 1, 8, 5, 4, 8, 0,
+ 7, 4, 4, 6, 2, 3, 7, 9, 9, 6, 2, 7, 4, 9, 5, 6, 7, 3, 5, 1, 8, 8,
+ 5, 7, 5, 2, 7, 2, 4, 8, 9, 1, 2, 2, 7, 9, 3, 8, 1, 8, 3, 0, 1, 1,
+ 9, 4, 9, 1, 2, 9, 8, 3, 3, 6, 7, 3, 3, 6, 2, 4, 4, 0, 6, 5, 6, 6,
+ 4, 3, 0, 8, 6, 0, 2, 1, 3, 9, 4, 9, 4, 6, 3, 9, 5, 2, 2, 4, 7, 3,
+ 7, 1, 9, 0, 7, 0, 2, 1, 7, 9, 8, 6, 0, 9, 4, 3, 7, 0, 2, 7, 7, 0,
+ 5, 3, 9, 2, 1, 7, 1, 7, 6, 2, 9, 3, 1, 7, 6, 7, 5, 2, 3, 8, 4, 6,
+ 7, 4, 8, 1, 8, 4, 6, 7, 6, 6, 9, 4, 0, 5, 1, 3, 2, 0, 0, 0, 5, 6,
+ 8, 1, 2, 7, 1, 4, 5, 2, 6, 3, 5, 6, 0, 8, 2, 7, 7, 8, 5, 7, 7, 1,
+ 3, 4, 2, 7, 5, 7, 7, 8, 9, 6, 0, 9, 1, 7, 3, 6, 3, 7, 1, 7, 8, 7,
+ 2, 1, 4, 6, 8, 4, 4, 0, 9, 0, 1, 2, 2, 4, 9, 5, 3, 4, 3, 0, 1, 4,
+ 6, 5, 4, 9, 5, 8, 5, 3, 7, 1, 0, 5, 0, 7, 9, 2, 2, 7, 9, 6, 8, 9,
+ 2, 5, 8, 9, 2, 3, 5, 4, 2, 0, 1, 9, 9, 5, 6, 1, 1, 2, 1, 2, 9, 0,
+ 2, 1, 9, 6, 0, 8, 6, 4, 0, 3, 4, 4, 1, 8, 1, 5, 9, 8, 1, 3, 6, 2,
+ 9, 7, 7, 4, 7, 7, 1, 3, 0, 9, 9, 6, 0, 5, 1, 8, 7, 0, 7, 2, 1, 1,
+ 3, 4, 9, 9, 9, 9, 9, 9, 8, 3, 7, 2, 9, 7, 8, 0, 4, 9, 9, 5, 1, 0,
+ 5, 9, 7, 3, 1, 7, 3, 2, 8, 1, 6, 0, 9, 6, 3, 1, 8, 5, 9, 5, 0, 2,
+ 4, 4, 5, 9, 4, 5, 5, 3, 4, 6, 9, 0, 8, 3, 0, 2, 6, 4, 2, 5, 2, 2,
+ 3, 0, 8, 2, 5, 3, 3, 4, 4, 6, 8, 5, 0, 3, 5, 2, 6, 1, 9, 3, 1, 1,
+ 8, 8, 1, 7, 1, 0, 1, 0, 0, 0, 3, 1, 3, 7, 8, 3, 8, 7, 5, 2, 8, 8,
+ 6, 5, 8, 7, 5, 3, 3, 2, 0, 8, 3, 8, 1, 4, 2, 0, 6, 1, 7, 1, 7, 7,
+ 6, 6, 9, 1, 4, 7, 3, 0, 3, 5, 9, 8, 2, 5, 3, 4, 9, 0, 4, 2, 8, 7,
+ 5, 5, 4, 6, 8, 7, 3, 1, 1, 5, 9, 5, 6, 2, 8, 6, 3, 8, 8, 2, 3, 5,
+ 3, 7, 8, 7, 5, 9, 3, 7, 5, 1, 9, 5, 7, 7, 8, 1, 8, 5, 7, 7, 3, 0,
+ 5, 3, 2, 1, 7, 1, 2, 2, 6, 8, 0, 6, 6, 1, 3, 0, 0, 1, 9, 2, 7, 8,
+ 7, 6, 6, 1, 1, 1, 9, 5, 9, 0, 9, 2, 1, 6, 4, 2, 0, 1, 9, 8, 9, 3,
+ 8, 0, 9, 5, 2, 5, 7, 2, 0, 1, 0, 6, 5, 4, 8, 5, 8, 6, 3, 2, 7, 8,
+ 8, 6, 5, 9, 3, 6, 1, 5, 3, 3, 8, 1, 8, 2, 7, 9, 6, 8, 2, 3, 0, 3,
+ 0, 1, 9, 5, 2, 0, 3, 5, 3, 0, 1, 8, 5, 2, 9, 6, 8, 9, 9, 5, 7, 7,
+ 3, 6, 2, 2, 5, 9, 9, 4, 1, 3, 8, 9, 1, 2, 4, 9, 7, 2, 1, 7, 7, 5,
+ 2, 8, 3, 4, 7, 9, 1, 3, 1, 5, 1, 5, 5, 7, 4, 8, 5, 7, 2, 4, 2, 4,
+ 5, 4, 1, 5, 0, 6, 9, 5, 9, 5, 0, 8, 2, 9, 5, 3, 3, 1, 1, 6, 8, 6,
+ 1, 7, 2, 7, 8, 5, 5, 8, 8, 9, 0, 7, 5, 0, 9, 8, 3, 8, 1, 7, 5, 4,
+ 6, 3, 7, 4, 6, 4, 9, 3, 9, 3, 1, 9, 2, 5, 5, 0, 6, 0, 4, 0, 0, 9,
+ 2, 7, 7, 0, 1, 6, 7, 1, 1, 3, 9, 0, 0, 9, 8, 4, 8, 8, 2, 4, 0, 1,
+ 2, 8, 5, 8, 3, 6, 1, 6, 0, 3, 5, 6, 3, 7, 0, 7, 6, 6, 0, 1, 0, 4,
+ 7, 1, 0, 1, 8, 1, 9, 4, 2, 9, 5, 5, 5, 9, 6, 1, 9, 8, 9, 4, 6, 7,
+ 6, 7, 8, 3, 7, 4, 4, 9, 4, 4, 8, 2, 5, 5, 3, 7, 9, 7, 7, 4, 7, 2,
+ 6, 8, 4, 7, 1, 0, 4, 0, 4, 7, 5, 3, 4, 6, 4, 6, 2, 0, 8, 0, 4, 6,
+ 6, 8, 4, 2, 5, 9, 0, 6, 9, 4, 9, 1, 2, 9, 3, 3, 1, 3, 6, 7, 7, 0,
+ 2, 8, 9, 8, 9, 1, 5, 2, 1, 0, 4, 7, 5, 2, 1, 6, 2, 0, 5, 6, 9, 6,
+ 6, 0, 2, 4, 0, 5, 8, 0, 3, 8, 1, 5, 0, 1, 9, 3, 5, 1, 1, 2, 5, 3,
+ 3, 8, 2, 4, 3, 0, 0, 3, 5, 5, 8, 7, 6, 4, 0, 2, 4, 7, 4, 9, 6, 4,
+ 7, 3, 2, 6, 3, 9, 1, 4, 1, 9, 9, 2, 7, 2, 6, 0, 4, 2, 6, 9, 9, 2,
+ 2, 7, 9, 6, 7, 8, 2, 3, 5, 4, 7, 8, 1, 6, 3, 6, 0, 0, 9, 3, 4, 1,
+ 7, 2, 1, 6, 4, 1, 2, 1, 9, 9, 2, 4, 5, 8, 6, 3, 1, 5, 0, 3, 0, 2,
+ 8, 6, 1, 8, 2, 9, 7, 4, 5, 5, 5, 7, 0, 6, 7, 4, 9, 8, 3, 8, 5, 0,
+ 5, 4, 9, 4, 5, 8, 8, 5, 8, 6, 9, 2, 6, 9, 9, 5, 6, 9, 0, 9, 2, 7,
+ 2, 1, 0, 7, 9, 7, 5, 0, 9, 3, 0, 2, 9, 5, 5, 3, 2, 1, 1, 6, 5, 3,
+ 4, 4, 9, 8, 7, 2, 0, 2, 7, 5, 5, 9, 6, 0, 2, 3, 6, 4, 8, 0, 6, 6,
+ 5, 4, 9, 9, 1, 1, 9, 8, 8, 1, 8, 3, 4, 7, 9, 7, 7, 5, 3, 5, 6, 6,
+ 3, 6, 9, 8, 0, 7, 4, 2, 6, 5, 4, 2, 5, 2, 7, 8, 6, 2, 5, 5, 1, 8,
+ 1, 8, 4, 1, 7, 5, 7, 4, 6, 7, 2, 8, 9, 0, 9, 7, 7, 7, 7, 2, 7, 9,
+ 3, 8, 0, 0, 0, 8, 1, 6, 4, 7, 0, 6, 0, 0, 1, 6, 1, 4, 5, 2, 4, 9,
+ 1, 9, 2, 1, 7, 3, 2, 1, 7, 2, 1, 4, 7, 7, 2, 3, 5, 0, 1, 4, 1, 4,
+ 4, 1, 9, 7, 3, 5, 6, 8, 5, 4, 8, 1, 6, 1, 3, 6, 1, 1, 5, 7, 3, 5,
+ 2, 5, 5, 2, 1, 3, 3, 4, 7, 5, 7, 4, 1, 8, 4, 9, 4, 6, 8, 4, 3, 8,
+ 5, 2, 3, 3, 2, 3, 9, 0, 7, 3, 9, 4, 1, 4, 3, 3, 3, 4, 5, 4, 7, 7,
+ 6, 2, 4, 1, 6, 8, 6, 2, 5, 1, 8, 9, 8, 3, 5, 6, 9, 4, 8, 5, 5, 6,
+ 2, 0, 9, 9, 2, 1, 9, 2, 2, 2, 1, 8, 4, 2, 7, 2, 5, 5, 0, 2, 5, 4,
+ 2, 5, 6, 8, 8, 7, 6, 7, 1, 7, 9, 0, 4, 9, 4, 6, 0, 1, 6, 5, 3, 4,
+ 6, 6, 8, 0, 4, 9, 8, 8, 6, 2, 7, 2, 3, 2, 7, 9, 1, 7, 8, 6, 0, 8,
+ 5, 7, 8, 4, 3, 8, 3, 8, 2, 7, 9, 6, 7, 9, 7, 6, 6, 8, 1, 4, 5, 4,
+ 1, 0, 0, 9, 5, 3, 8, 8, 3, 7, 8, 6, 3, 6, 0, 9, 5, 0, 6, 8, 0, 0,
+ 6, 4, 2, 2, 5, 1, 2, 5, 2, 0, 5, 1, 1, 7, 3, 9, 2, 9, 8, 4, 8, 9,
+ 6, 0, 8, 4, 1, 2, 8, 4, 8, 8, 6, 2, 6, 9, 4, 5, 6, 0, 4, 2, 4, 1,
+ 9, 6, 5, 2, 8, 5, 0, 2, 2, 2, 1, 0, 6, 6, 1, 1, 8, 6, 3, 0, 6, 7,
+ 4, 4, 2, 7, 8, 6, 2, 2, 0, 3, 9, 1, 9, 4, 9, 4, 5, 0, 4, 7, 1, 2,
+ 3, 7, 1, 3, 7, 8, 6, 9, 6, 0, 9, 5, 6, 3, 6, 4, 3, 7, 1, 9, 1, 7,
+ 2, 8, 7, 4, 6, 7, 7, 6, 4, 6, 5, 7, 5, 7, 3, 9, 6, 2, 4, 1, 3, 8,
+ 9, 0, 8, 6, 5, 8, 3, 2, 6, 4, 5, 9, 9, 5, 8, 1, 3, 3, 9, 0, 4, 7,
+ 8, 0, 2, 7, 5, 9, 0, 0, 9, 9, 4, 6, 5, 7, 6, 4, 0, 7, 8, 9, 5, 1,
+ 2, 6, 9, 4, 6, 8, 3, 9, 8, 3, 5, 2, 5, 9, 5, 7, 0, 9, 8, 2, 5, 8,
+ 2, 2, 6, 2, 0, 5, 2, 2, 4, 8, 9, 4, 0, 7, 7, 2, 6, 7, 1, 9, 4, 7,
+ 8, 2, 6, 8, 4, 8, 2, 6, 0, 1, 4, 7, 6, 9, 9, 0, 9, 0, 2, 6, 4, 0,
+ 1, 3, 6, 3, 9, 4, 4, 3, 7, 4, 5, 5, 3, 0, 5, 0, 6, 8, 2, 0, 3, 4,
+ 9, 6, 2, 5, 2, 4, 5, 1, 7, 4, 9, 3, 9, 9, 6, 5, 1, 4, 3, 1, 4, 2,
+ 9, 8, 0, 9, 1, 9, 0, 6, 5, 9, 2, 5, 0, 9, 3, 7, 2, 2, 1, 6, 9, 6,
+ 4, 6, 1, 5, 1, 5, 7, 0, 9, 8, 5, 8, 3, 8, 7, 4, 1, 0, 5, 9, 7, 8,
+ 8, 5, 9, 5, 9, 7, 7, 2, 9, 7, 5, 4, 9, 8, 9, 3, 0, 1, 6, 1, 7, 5,
+ 3, 9, 2, 8, 4, 6, 8, 1, 3, 8, 2, 6, 8, 6, 8, 3, 8, 6, 8, 9, 4, 2,
+ 7, 7, 4, 1, 5, 5, 9, 9, 1, 8, 5, 5, 9, 2, 5, 2, 4, 5, 9, 5, 3, 9,
+ 5, 9, 4, 3, 1, 0, 4, 9, 9, 7, 2, 5, 2, 4, 6, 8, 0, 8, 4, 5, 9, 8,
+ 7, 2, 7, 3, 6, 4, 4, 6, 9, 5, 8, 4, 8, 6, 5, 3, 8, 3, 6, 7, 3, 6,
+ 2, 2, 2, 6, 2, 6, 0, 9, 9, 1, 2, 4, 6, 0, 8, 0, 5, 1, 2, 4, 3, 8,
+ 8, 4, 3, 9, 0, 4, 5, 1, 2, 4, 4, 1, 3, 6, 5, 4, 9, 7, 6, 2, 7, 8,
+ 0, 7, 9, 7, 7, 1, 5, 6, 9, 1, 4, 3, 5, 9, 9, 7, 7, 0, 0, 1, 2, 9,
+ 6, 1, 6, 0, 8, 9, 4, 4, 1, 6, 9, 4, 8, 6, 8, 5, 5, 5, 8, 4, 8, 4,
+ 0, 6, 3, 5, 3, 4, 2, 2, 0, 7, 2, 2, 2, 5, 8, 2, 8, 4, 8, 8, 6, 4,
+ 8, 1, 5, 8, 4, 5, 6, 0, 2, 8, 5, 0, 6, 0, 1, 6, 8, 4, 2, 7, 3, 9,
+ 4, 5, 2, 2, 6, 7, 4, 6, 7, 6, 7, 8, 8, 9, 5, 2, 5, 2, 1, 3, 8, 5,
+ 2, 2, 5, 4, 9, 9, 5, 4, 6, 6, 6, 7, 2, 7, 8, 2, 3, 9, 8, 6, 4, 5,
+ 6, 5, 9, 6, 1, 1, 6, 3, 5, 4, 8, 8, 6, 2, 3, 0, 5, 7, 7, 4, 5, 6,
+ 4, 9, 8, 0, 3, 5, 5, 9, 3, 6, 3, 4, 5, 6, 8, 1, 7, 4, 3, 2, 4, 1,
+ 1, 2, 5, 1, 5, 0, 7, 6, 0, 6, 9, 4, 7, 9, 4, 5, 1, 0, 9, 6, 5, 9,
+ 6, 0, 9, 4, 0, 2, 5, 2, 2, 8, 8, 7, 9, 7, 1, 0, 8, 9, 3, 1, 4, 5,
+ 6, 6, 9, 1, 3, 6, 8, 6, 7, 2, 2, 8, 7, 4, 8, 9, 4, 0, 5, 6, 0, 1,
+ 0, 1, 5, 0, 3, 3, 0, 8, 6, 1, 7, 9, 2, 8, 6, 8, 0, 9, 2, 0, 8, 7,
+ 4, 7, 6, 0, 9, 1, 7, 8, 2, 4, 9, 3, 8, 5, 8, 9, 0, 0, 9, 7, 1, 4,
+ 9, 0, 9, 6, 7, 5, 9, 8, 5, 2, 6, 1, 3, 6, 5, 5, 4, 9, 7, 8, 1, 8,
+ 9, 3, 1, 2, 9, 7, 8, 4, 8, 2, 1, 6, 8, 2, 9, 9, 8, 9, 4, 8, 7, 2,
+ 2, 6, 5, 8, 8, 0, 4, 8, 5, 7, 5, 6, 4, 0, 1, 4, 2, 7, 0, 4, 7, 7,
+ 5, 5, 5, 1, 3, 2, 3, 7, 9, 6, 4, 1, 4, 5, 1, 5, 2, 3, 7, 4, 6, 2,
+ 3, 4, 3, 6, 4, 5, 4, 2, 8, 5, 8, 4, 4, 4, 7, 9, 5, 2, 6, 5, 8, 6,
+ 7, 8, 2, 1, 0, 5, 1, 1, 4, 1, 3, 5, 4, 7, 3, 5, 7, 3, 9, 5, 2, 3,
+ 1, 1, 3, 4, 2, 7, 1, 6, 6, 1, 0, 2, 1, 3, 5, 9, 6, 9, 5, 3, 6, 2,
+ 3, 1, 4, 4, 2, 9, 5, 2, 4, 8, 4, 9, 3, 7, 1, 8, 7, 1, 1, 0, 1, 4,
+ 5, 7, 6, 5, 4, 0, 3, 5, 9, 0, 2, 7, 9, 9, 3, 4, 4, 0, 3, 7, 4, 2,
+ 0, 0, 7, 3, 1, 0, 5, 7, 8, 5, 3, 9, 0, 6, 2, 1, 9, 8, 3, 8, 7, 4,
+ 4, 7, 8, 0, 8, 4, 7, 8, 4, 8, 9, 6, 8, 3, 3, 2, 1, 4, 4, 5, 7, 1,
+ 3, 8, 6, 8, 7, 5, 1, 9, 4, 3, 5, 0, 6, 4, 3, 0, 2, 1, 8, 4, 5, 3,
+ 1, 9, 1, 0, 4, 8, 4, 8, 1, 0, 0, 5, 3, 7, 0, 6, 1, 4, 6, 8, 0, 6,
+ 7, 4, 9, 1, 9, 2, 7, 8, 1, 9, 1, 1, 9, 7, 9, 3, 9, 9, 5, 2, 0, 6,
+ 1, 4, 1, 9, 6, 6, 3, 4, 2, 8, 7, 5, 4, 4, 4, 0, 6, 4, 3, 7, 4, 5,
+ 1, 2, 3, 7, 1, 8, 1, 9, 2, 1, 7, 9, 9, 9, 8, 3, 9, 1, 0, 1, 5, 9,
+ 1, 9, 5, 6, 1, 8, 1, 4, 6, 7, 5, 1, 4, 2, 6, 9, 1, 2, 3, 9, 7, 4,
+ 8, 9, 4, 0, 9, 0, 7, 1, 8, 6, 4, 9, 4, 2, 3, 1, 9, 6, 1, 5, 6, 7,
+ 9, 4, 5, 2, 0, 8, 0, 9, 5, 1, 4, 6, 5, 5, 0, 2, 2, 5, 2, 3, 1, 6,
+ 0, 3, 8, 8, 1, 9, 3, 0, 1, 4, 2, 0, 9, 3, 7, 6, 2, 1, 3, 7, 8, 5,
+ 5, 9, 5, 6, 6, 3, 8, 9, 3, 7, 7, 8, 7, 0, 8, 3, 0, 3, 9, 0, 6, 9,
+ 7, 9, 2, 0, 7, 7, 3, 4, 6, 7, 2, 2, 1, 8, 2, 5, 6, 2, 5, 9, 9, 6,
+ 6, 1, 5, 0, 1, 4, 2, 1, 5, 0, 3, 0, 6, 8, 0, 3, 8, 4, 4, 7, 7, 3,
+ 4, 5, 4, 9, 2, 0, 2, 6, 0, 5, 4, 1, 4, 6, 6, 5, 9, 2, 5, 2, 0, 1,
+ 4, 9, 7, 4, 4, 2, 8, 5, 0, 7, 3, 2, 5, 1, 8, 6, 6, 6, 0, 0, 2, 1,
+ 3, 2, 4, 3, 4, 0, 8, 8, 1, 9, 0, 7, 1, 0, 4, 8, 6, 3, 3, 1, 7, 3,
+ 4, 6, 4, 9, 6, 5, 1, 4, 5, 3, 9, 0, 5, 7, 9, 6, 2, 6, 8, 5, 6, 1,
+ 0, 0, 5, 5, 0, 8, 1, 0, 6, 6, 5, 8, 7, 9, 6, 9, 9, 8, 1, 6, 3, 5,
+ 7, 4, 7, 3, 6, 3, 8, 4, 0, 5, 2, 5, 7, 1, 4, 5, 9, 1, 0, 2, 8, 9,
+ 7, 0, 6, 4, 1, 4, 0, 1, 1, 0, 9, 7, 1, 2, 0, 6, 2, 8, 0, 4, 3, 9,
+ 0, 3, 9, 7, 5, 9, 5, 1, 5, 6, 7, 7, 1, 5, 7, 7, 0, 0, 4, 2, 0, 3,
+ 3, 7, 8, 6, 9, 9, 3, 6, 0, 0, 7, 2, 3, 0, 5, 5, 8, 7, 6, 3, 1, 7,
+ 6, 3, 5, 9, 4, 2, 1, 8, 7, 3, 1, 2, 5, 1, 4, 7, 1, 2, 0, 5, 3, 2,
+ 9, 2, 8, 1, 9, 1, 8, 2, 6, 1, 8, 6, 1, 2, 5, 8, 6, 7, 3, 2, 1, 5,
+ 7, 9, 1, 9, 8, 4, 1, 4, 8, 4, 8, 8, 2, 9, 1, 6, 4, 4, 7, 0, 6, 0,
+ 9, 5, 7, 5, 2, 7, 0, 6, 9, 5, 7, 2, 2, 0, 9, 1, 7, 5, 6, 7, 1, 1,
+ 6, 7, 2, 2, 9, 1, 0, 9, 8, 1, 6, 9, 0, 9, 1, 5, 2, 8, 0, 1, 7, 3,
+ 5, 0, 6, 7, 1, 2, 7, 4, 8, 5, 8, 3, 2, 2, 2, 8, 7, 1, 8, 3, 5, 2,
+ 0, 9, 3, 5, 3, 9, 6, 5, 7, 2, 5, 1, 2, 1, 0, 8, 3, 5, 7, 9, 1, 5,
+ 1, 3, 6, 9, 8, 8, 2, 0, 9, 1, 4, 4, 4, 2, 1, 0, 0, 6, 7, 5, 1, 0,
+ 3, 3, 4, 6, 7, 1, 1, 0, 3, 1, 4, 1, 2, 6, 7, 1, 1, 1, 3, 6, 9, 9,
+ 0, 8, 6, 5, 8, 5, 1, 6, 3, 9, 8, 3, 1, 5, 0, 1, 9, 7, 0, 1, 6, 5,
+ 1, 5, 1, 1, 6, 8, 5, 1, 7, 1, 4, 3, 7, 6, 5, 7, 6, 1, 8, 3, 5, 1,
+ 5, 5, 6, 5, 0, 8, 8, 4, 9, 0, 9, 9, 8, 9, 8, 5, 9, 9, 8, 2, 3, 8,
+ 7, 3, 4, 5, 5, 2, 8, 3, 3, 1, 6, 3, 5, 5, 0, 7, 6, 4, 7, 9, 1, 8,
+ 5, 3, 5, 8, 9, 3, 2, 2, 6, 1, 8, 5, 4, 8, 9, 6, 3, 2, 1, 3, 2, 9,
+ 3, 3, 0, 8, 9, 8, 5, 7, 0, 6, 4, 2, 0, 4, 6, 7, 5, 2, 5, 9, 0, 7,
+ 0, 9, 1, 5, 4, 8, 1, 4, 1, 6, 5, 4, 9, 8, 5, 9, 4, 6, 1, 6, 3, 7,
+ 1, 8, 0, 2, 7, 0, 9, 8, 1, 9, 9, 4, 3, 0, 9, 9, 2, 4, 4, 8, 8, 9,
+ 5, 7, 5, 7, 1, 2, 8, 2, 8, 9, 0, 5, 9, 2, 3, 2, 3, 3, 2, 6, 0, 9,
+ 7, 2, 9, 9, 7, 1, 2, 0, 8, 4, 4, 3, 3, 5, 7, 3, 2, 6, 5, 4, 8, 9,
+ 3, 8, 2, 3, 9, 1, 1, 9, 3, 2, 5, 9, 7, 4, 6, 3, 6, 6, 7, 3, 0, 5,
+ 8, 3, 6, 0, 4, 1, 4, 2, 8, 1, 3, 8, 8, 3, 0, 3, 2, 0, 3, 8, 2, 4,
+ 9, 0, 3, 7, 5, 8, 9, 8, 5, 2, 4, 3, 7, 4, 4, 1, 7, 0, 2, 9, 1, 3,
+ 2, 7, 6, 5, 6, 1, 8, 0, 9, 3, 7, 7, 3, 4, 4, 4, 0, 3, 0, 7, 0, 7,
+ 4, 6, 9, 2, 1, 1, 2, 0, 1, 9, 1, 3, 0, 2, 0, 3, 3, 0, 3, 8, 0, 1,
+ 9, 7, 6, 2, 1, 1, 0, 1, 1, 0, 0, 4, 4, 9, 2, 9, 3, 2, 1, 5, 1, 6,
+ 0, 8, 4, 2, 4, 4, 4, 8, 5, 9, 6, 3, 7, 6, 6, 9, 8, 3, 8, 9, 5, 2,
+ 2, 8, 6, 8, 4, 7, 8, 3, 1, 2, 3, 5, 5, 2, 6, 5, 8, 2, 1, 3, 1, 4,
+ 4, 9, 5, 7, 6, 8, 5, 7, 2, 6, 2, 4, 3, 3, 4, 4, 1, 8, 9, 3, 0, 3,
+ 9, 6, 8, 6, 4, 2, 6, 2, 4, 3, 4, 1, 0, 7, 7, 3, 2, 2, 6, 9, 7, 8,
+ 0, 2, 8, 0, 7, 3, 1, 8, 9, 1, 5, 4, 4, 1, 1, 0, 1, 0, 4, 4, 6, 8,
+ 2, 3, 2, 5, 2, 7, 1, 6, 2, 0, 1, 0, 5, 2, 6, 5, 2, 2, 7, 2, 1, 1,
+ 1, 6, 6, 0, 3, 9, 6, 6, 6, 5, 5, 7, 3, 0, 9, 2, 5, 4, 7, 1, 1, 0,
+ 5, 5, 7, 8, 5, 3, 7, 6, 3, 4, 6, 6, 8, 2, 0, 6, 5, 3, 1, 0, 9, 8,
+ 9, 6, 5, 2, 6, 9, 1, 8, 6, 2, 0, 5, 6, 4, 7, 6, 9, 3, 1, 2, 5, 7,
+ 0, 5, 8, 6, 3, 5, 6, 6, 2, 0, 1, 8, 5, 5, 8, 1, 0, 0, 7, 2, 9, 3,
+ 6, 0, 6, 5, 9, 8, 7, 6, 4, 8, 6, 1, 1, 7, 9, 1, 0, 4, 5, 3, 3, 4,
+ 8, 8, 5, 0, 3, 4, 6, 1, 1, 3, 6, 5, 7, 6, 8, 6, 7, 5, 3, 2, 4, 9,
+ 4, 4, 1, 6, 6, 8, 0, 3, 9, 6, 2, 6, 5, 7, 9, 7, 8, 7, 7, 1, 8, 5,
+ 5, 6, 0, 8, 4, 5, 5, 2, 9, 6, 5, 4, 1, 2, 6, 6, 5, 4, 0, 8, 5, 3,
+ 0, 6, 1, 4, 3, 4, 4, 4, 3, 1, 8, 5, 8, 6, 7, 6, 9, 7, 5, 1, 4, 5,
+ 6, 6, 1, 4, 0, 6, 8, 0, 0, 7, 0, 0, 2, 3, 7, 8, 7, 7, 6, 5, 9, 1,
+ 3, 4, 4, 0, 1, 7, 1, 2, 7, 4, 9, 4, 7, 0, 4, 2, 0, 5, 6, 2, 2, 3,
+ 0, 5, 3, 8, 9, 9, 4, 5, 6, 1, 3, 1, 4, 0, 7, 1, 1, 2, 7, 0, 0, 0,
+ 4, 0, 7, 8, 5, 4, 7, 3, 3, 2, 6, 9, 9, 3, 9, 0, 8, 1, 4, 5, 4, 6,
+ 6, 4, 6, 4, 5, 8, 8, 0, 7, 9, 7, 2, 7, 0, 8, 2, 6, 6, 8, 3, 0, 6,
+ 3, 4, 3, 2, 8, 5, 8, 7, 8, 5, 6, 9, 8, 3, 0, 5, 2, 3, 5, 8, 0, 8,
+ 9, 3, 3, 0, 6, 5, 7, 5, 7, 4, 0, 6, 7, 9, 5, 4, 5, 7, 1, 6, 3, 7,
+ 7, 5, 2, 5, 4, 2, 0, 2, 1, 1, 4, 9, 5, 5, 7, 6, 1, 5, 8, 1, 4, 0,
+ 0, 2, 5, 0, 1, 2, 6, 2, 2, 8, 5, 9, 4, 1, 3, 0, 2, 1, 6, 4, 7, 1,
+ 5, 5, 0, 9, 7, 9, 2, 5, 9, 2, 3, 0, 9, 9, 0, 7, 9, 6, 5, 4, 7, 3,
+ 7, 6, 1, 2, 5, 5, 1, 7, 6, 5, 6, 7, 5, 1, 3, 5, 7, 5, 1, 7, 8, 2,
+ 9, 6, 6, 6, 4, 5, 4, 7, 7, 9, 1, 7, 4, 5, 0, 1, 1, 2, 9, 9, 6, 1,
+ 4, 8, 9, 0, 3, 0, 4, 6, 3, 9, 9, 4, 7, 1, 3, 2, 9, 6, 2, 1, 0, 7,
+ 3, 4, 0, 4, 3, 7, 5, 1, 8, 9, 5, 7, 3, 5, 9, 6, 1, 4, 5, 8, 9, 0,
+ 1, 9, 3, 8, 9, 7, 1, 3, 1, 1, 1, 7, 9, 0, 4, 2, 9, 7, 8, 2, 8, 5,
+ 6, 4, 7, 5, 0, 3, 2, 0, 3, 1, 9, 8, 6, 9, 1, 5, 1, 4, 0, 2, 8, 7,
+ 0, 8, 0, 8, 5, 9, 9, 0, 4, 8, 0, 1, 0, 9, 4, 1, 2, 1, 4, 7, 2, 2,
+ 1, 3, 1, 7, 9, 4, 7, 6, 4, 7, 7, 7, 2, 6, 2, 2, 4, 1, 4, 2, 5, 4,
+ 8, 5, 4, 5, 4, 0, 3, 3, 2, 1, 5, 7, 1, 8, 5, 3, 0, 6, 1, 4, 2, 2,
+ 8, 8, 1, 3, 7, 5, 8, 5, 0, 4, 3, 0, 6, 3, 3, 2, 1, 7, 5, 1, 8, 2,
+ 9, 7, 9, 8, 6, 6, 2, 2, 3, 7, 1, 7, 2, 1, 5, 9, 1, 6, 0, 7, 7, 1,
+ 6, 6, 9, 2, 5, 4, 7, 4, 8, 7, 3, 8, 9, 8, 6, 6, 5, 4, 9, 4, 9, 4,
+ 5, 0, 1, 1, 4, 6, 5, 4, 0, 6, 2, 8, 4, 3, 3, 6, 6, 3, 9, 3, 7, 9,
+ 0, 0, 3, 9, 7, 6, 9, 2, 6, 5, 6, 7, 2, 1, 4, 6, 3, 8, 5, 3, 0, 6,
+ 7, 3, 6, 0, 9, 6, 5, 7, 1, 2, 0, 9, 1, 8, 0, 7, 6, 3, 8, 3, 2, 7,
+ 1, 6, 6, 4, 1, 6, 2, 7, 4, 8, 8, 8, 8, 0, 0, 7, 8, 6, 9, 2, 5, 6,
+ 0, 2, 9, 0, 2, 2, 8, 4, 7, 2, 1, 0, 4, 0, 3, 1, 7, 2, 1, 1, 8, 6,
+ 0, 8, 2, 0, 4, 1, 9, 0, 0, 0, 4, 2, 2, 9, 6, 6, 1, 7, 1, 1, 9, 6,
+ 3, 7, 7, 9, 2, 1, 3, 3, 7, 5, 7, 5, 1, 1, 4, 9, 5, 9, 5, 0, 1, 5,
+ 6, 6, 0, 4, 9, 6, 3, 1, 8, 6, 2, 9, 4, 7, 2, 6, 5, 4, 7, 3, 6, 4,
+ 2, 5, 2, 3, 0, 8, 1, 7, 7, 0, 3, 6, 7, 5, 1, 5, 9, 0, 6, 7, 3, 5,
+ 0, 2, 3, 5, 0, 7, 2, 8, 3, 5, 4, 0, 5, 6, 7, 0, 4, 0, 3, 8, 6, 7,
+ 4, 3, 5, 1, 3, 6, 2, 2, 2, 2, 4, 7, 7, 1, 5, 8, 9, 1, 5, 0, 4, 9,
+ 5, 3, 0, 9, 8, 4, 4, 4, 8, 9, 3, 3, 3, 0, 9, 6, 3, 4, 0, 8, 7, 8,
+ 0, 7, 6, 9, 3, 2, 5, 9, 9, 3, 9, 7, 8, 0, 5, 4, 1, 9, 3, 4, 1, 4,
+ 4, 7, 3, 7, 7, 4, 4, 1, 8, 4, 2, 6, 3, 1, 2, 9, 8, 6, 0, 8, 0, 9,
+ 9, 8, 8, 8, 6, 8, 7, 4, 1, 3, 2, 6, 0, 4, 7, 2 } ;
+
+
+ const size_t nacc1 = 3 ;
+ const double numacc1[3] = { 10000001, 10000003, 10000002 } ;
+
+ const size_t nacc2 = 1001 ;
+ double numacc2[1001] ;
+
+ const size_t nacc3 = 1001 ;
+ double numacc3[1001] ;
+
+ const size_t nacc4 = 1001 ;
+ double numacc4[1001] ;
+
+ numacc2[0] = 1.2 ;
+ numacc3[0] = 1000000.2 ;
+ numacc4[0] = 10000000.2 ;
+
+ for (i = 1 ; i < 1000 ; i += 2)
+ {
+ numacc2[i] = 1.1 ;
+ numacc2[i+1] = 1.3 ;
+ numacc3[i] = 1000000.1 ;
+ numacc3[i+1] = 1000000.3 ;
+ numacc4[i] = 10000000.1 ;
+ numacc4[i+1] = 10000000.3 ;
+ }
+
+ gsl_ieee_env_setup ();
+
+ {
+ double mean = gsl_stats_mean (lew, 1, nlew);
+ double sd = gsl_stats_sd (lew, 1, nlew);
+ double lag1 = gsl_stats_lag1_autocorrelation (lew, 1, nlew);
+
+ double expected_mean = -177.435000000000;
+ double expected_sd = 277.332168044316;
+ double expected_lag1 = -0.307304800605679;
+
+ gsl_test_rel (mean, expected_mean, 1e-15, "lew gsl_stats_mean") ;
+ gsl_test_rel (sd, expected_sd, 1e-15, "lew gsl_stats_sd") ;
+ gsl_test_rel (lag1, expected_lag1, 1e-14, "lew autocorrelation") ;
+ }
+
+
+ {
+ double mean = gsl_stats_mean (lottery, 1, nlottery);
+ double sd = gsl_stats_sd (lottery, 1, nlottery);
+ double lag1 = gsl_stats_lag1_autocorrelation (lottery, 1, nlottery);
+
+ double expected_mean = 518.958715596330;
+ double expected_sd = 291.699727470969;
+ double expected_lag1 = -0.120948622967393;
+
+ gsl_test_rel (mean, expected_mean, 1e-15, "lottery gsl_stats_mean") ;
+ gsl_test_rel (sd, expected_sd, 1e-15, "lottery gsl_stats_sd") ;
+ gsl_test_rel (lag1, expected_lag1, 1e-14, "lottery autocorrelation") ;
+ }
+
+ {
+ double mean = gsl_stats_mean (mavro, 1, nmavro);
+ double sd = gsl_stats_sd (mavro, 1, nmavro);
+ double lag1 = gsl_stats_lag1_autocorrelation (mavro, 1, nmavro);
+
+ double expected_mean = 2.00185600000000;
+ double expected_sd = 0.000429123454003053;
+ double expected_lag1 = 0.937989183438248;
+
+ gsl_test_rel (mean, expected_mean, 1e-15, "mavro gsl_stats_mean") ;
+ gsl_test_rel (sd, expected_sd, 1e-13, "mavro gsl_stats_sd") ;
+ gsl_test_rel (lag1, expected_lag1, 1e-13, "mavro autocorrelation") ;
+ }
+
+
+ {
+ double mean = gsl_stats_mean (michelson, 1, nmichelson);
+ double sd = gsl_stats_sd (michelson, 1, nmichelson);
+ double lag1 = gsl_stats_lag1_autocorrelation (michelson, 1, nmichelson);
+
+ double expected_mean = 299.852400000000;
+ double expected_sd = 0.0790105478190518;
+ double expected_lag1 = 0.535199668621283;
+
+ gsl_test_rel (mean, expected_mean, 1e-15, "michelson gsl_stats_mean") ;
+ gsl_test_rel (sd, expected_sd, 1e-13, "michelson gsl_stats_sd") ;
+ gsl_test_rel (lag1, expected_lag1, 1e-13, "michelson autocorrelation") ;
+ }
+
+ {
+ double mean = gsl_stats_mean (pidigits, 1, npidigits);
+ double sd = gsl_stats_sd (pidigits, 1, npidigits);
+ double lag1 = gsl_stats_lag1_autocorrelation (pidigits, 1, npidigits);
+
+ double expected_mean = 4.53480000000000;
+ double expected_sd = 2.86733906028871;
+ double expected_lag1 = -0.00355099287237972;
+
+ gsl_test_rel (mean, expected_mean, 1e-14, "pidigits gsl_stats_mean") ;
+ gsl_test_rel (sd, expected_sd, 1e-15, "pidigits gsl_stats_sd") ;
+ gsl_test_rel (lag1, expected_lag1, 1e-14, "pidigits autocorrelation") ;
+ }
+
+ {
+ double mean = gsl_stats_mean (numacc1, 1, nacc1);
+ double sd = gsl_stats_sd (numacc1, 1, nacc1);
+ double lag1 = gsl_stats_lag1_autocorrelation (numacc1, 1, nacc1);
+
+ double expected_mean = 10000002;
+ double expected_sd = 1;
+ double expected_lag1 = -0.5;
+
+ gsl_test_rel (mean, expected_mean, 1e-15, "acc1 gsl_stats_mean") ;
+ gsl_test_rel (sd, expected_sd, 1e-15, "acc1 gsl_stats_sd") ;
+ gsl_test_rel (lag1, expected_lag1, 1e-15, "acc1 autocorrelation") ;
+ }
+
+ {
+ double mean = gsl_stats_mean (numacc2, 1, nacc2);
+ double sd = gsl_stats_sd (numacc2, 1, nacc2);
+ double lag1 = gsl_stats_lag1_autocorrelation (numacc2, 1, nacc2);
+
+ double expected_mean = 1.2;
+ double expected_sd = 0.1;
+ double expected_lag1 = -0.999;
+
+ gsl_test_rel (mean, expected_mean, 1e-15, "acc2 gsl_stats_mean") ;
+ gsl_test_rel (sd, expected_sd, 1e-15, "acc2 gsl_stats_sd") ;
+ gsl_test_rel (lag1, expected_lag1, 1e-10, "acc2 autocorrelation") ;
+ }
+
+ {
+ double mean = gsl_stats_mean (numacc3, 1, nacc3);
+ double sd = gsl_stats_sd (numacc3, 1, nacc3);
+ double lag1 = gsl_stats_lag1_autocorrelation (numacc3, 1, nacc3);
+
+ double expected_mean = 1000000.2;
+ double expected_sd = 0.1;
+ double expected_lag1 = -0.999;
+
+ gsl_test_rel (mean, expected_mean, 1e-15, "acc3 gsl_stats_mean") ;
+ gsl_test_rel (sd, expected_sd, 1e-9, "acc3 gsl_stats_sd") ;
+ gsl_test_rel (lag1, expected_lag1, 1e-10, "acc3 autocorrelation") ;
+ }
+
+
+ {
+ double mean = gsl_stats_mean (numacc4, 1, nacc4);
+ double sd = gsl_stats_sd (numacc4, 1, nacc4);
+ double lag1 = gsl_stats_lag1_autocorrelation (numacc4, 1, nacc4);
+
+ double expected_mean = 10000000.2;
+ double expected_sd = 0.1;
+ double expected_lag1 = -0.999;
+
+ gsl_test_rel (mean, expected_mean, 1e-15, "acc4 gsl_stats_mean") ;
+ gsl_test_rel (sd, expected_sd, 1e-7, "acc4 gsl_stats_sd") ;
+ gsl_test_rel (lag1, expected_lag1, 1e-10, "acc4 autocorrelation") ;
+ }
+
+ return 0;
+}
+
+
+
+
+
+
+
diff --git a/gsl-1.9/statistics/ttest.c b/gsl-1.9/statistics/ttest.c
new file mode 100644
index 0000000..3bc50da
--- /dev/null
+++ b/gsl-1.9/statistics/ttest.c
@@ -0,0 +1,72 @@
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_statistics.h>
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "ttest_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "ttest_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "ttest_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "ttest_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "ttest_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "ttest_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "ttest_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "ttest_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "ttest_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "ttest_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "ttest_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
+
+
+
diff --git a/gsl-1.9/statistics/ttest_source.c b/gsl-1.9/statistics/ttest_source.c
new file mode 100644
index 0000000..f1ccc0b
--- /dev/null
+++ b/gsl-1.9/statistics/ttest_source.c
@@ -0,0 +1,42 @@
+/* statistics/ttest_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Jim Davies, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+double
+FUNCTION(gsl_stats,ttest) (const BASE data1[],
+ const size_t stride1, const size_t n1,
+ const BASE data2[],
+ const size_t stride2, const size_t n2)
+{
+ /* runs a t-test between two datasets representing independent
+ samples. Tests to see if the difference between means of the
+ samples is different from zero */
+
+ /* find means for the two samples */
+ const double mean1 = FUNCTION(gsl_stats,mean) (data1, stride1, n1);
+ const double mean2 = FUNCTION(gsl_stats,mean) (data2, stride2, n2);
+
+ /* find pooled variance for the two samples */
+ const double pv = FUNCTION(gsl_stats,pvariance) (data1, stride1, n1, data2, stride2, n2);
+
+ /* calculate the t statistic */
+ const double t = (mean1 - mean2) / (sqrt (pv * ((1.0 / n1) + (1.0 / n2))));
+
+ return t;
+}
+
diff --git a/gsl-1.9/statistics/variance.c b/gsl-1.9/statistics/variance.c
new file mode 100644
index 0000000..7c30a0a
--- /dev/null
+++ b/gsl-1.9/statistics/variance.c
@@ -0,0 +1,72 @@
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_statistics.h>
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "variance_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "variance_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "variance_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "variance_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "variance_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "variance_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "variance_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "variance_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "variance_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "variance_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "variance_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
+
+
+
diff --git a/gsl-1.9/statistics/variance_source.c b/gsl-1.9/statistics/variance_source.c
new file mode 100644
index 0000000..7578a43
--- /dev/null
+++ b/gsl-1.9/statistics/variance_source.c
@@ -0,0 +1,90 @@
+/* statistics/variance_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Jim Davies, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+static double
+FUNCTION(compute,variance) (const BASE data[], const size_t stride, const size_t n, const double mean);
+
+static double
+FUNCTION(compute,variance) (const BASE data[], const size_t stride, const size_t n, const double mean)
+{
+ /* takes a dataset and finds the variance */
+
+ long double variance = 0 ;
+
+ size_t i;
+
+ /* find the sum of the squares */
+ for (i = 0; i < n; i++)
+ {
+ const long double delta = (data[i * stride] - mean);
+ variance += (delta * delta - variance) / (i + 1);
+ }
+
+ return variance ;
+}
+
+
+double
+FUNCTION(gsl_stats,variance_with_fixed_mean) (const BASE data[], const size_t stride, const size_t n, const double mean)
+{
+ const double variance = FUNCTION(compute,variance) (data, stride, n, mean);
+ return variance;
+}
+
+double
+FUNCTION(gsl_stats,sd_with_fixed_mean) (const BASE data[], const size_t stride, const size_t n, const double mean)
+{
+ const double variance = FUNCTION(compute,variance) (data, stride, n, mean);
+ const double sd = sqrt (variance);
+
+ return sd;
+}
+
+
+
+double
+FUNCTION(gsl_stats,variance_m) (const BASE data[], const size_t stride, const size_t n, const double mean)
+{
+ const double variance = FUNCTION(compute,variance) (data, stride, n, mean);
+
+ return variance * ((double)n / (double)(n - 1));
+}
+
+double
+FUNCTION(gsl_stats,sd_m) (const BASE data[], const size_t stride, const size_t n, const double mean)
+{
+ const double variance = FUNCTION(compute,variance) (data, stride, n, mean);
+ const double sd = sqrt (variance * ((double)n / (double)(n - 1)));
+
+ return sd;
+}
+
+double
+FUNCTION(gsl_stats,variance) (const BASE data[], const size_t stride, const size_t n)
+{
+ const double mean = FUNCTION(gsl_stats,mean) (data, stride, n);
+ return FUNCTION(gsl_stats,variance_m)(data, stride, n, mean);
+}
+
+double
+FUNCTION(gsl_stats,sd) (const BASE data[], const size_t stride, const size_t n)
+{
+ const double mean = FUNCTION(gsl_stats,mean) (data, stride, n);
+ return FUNCTION(gsl_stats,sd_m) (data, stride, n, mean);
+}
diff --git a/gsl-1.9/statistics/wabsdev.c b/gsl-1.9/statistics/wabsdev.c
new file mode 100644
index 0000000..27e0e93
--- /dev/null
+++ b/gsl-1.9/statistics/wabsdev.c
@@ -0,0 +1,21 @@
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_statistics.h>
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "wabsdev_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "wabsdev_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "wabsdev_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
diff --git a/gsl-1.9/statistics/wabsdev_source.c b/gsl-1.9/statistics/wabsdev_source.c
new file mode 100644
index 0000000..cb86583
--- /dev/null
+++ b/gsl-1.9/statistics/wabsdev_source.c
@@ -0,0 +1,51 @@
+/* statistics/wabsdev_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Jim Davies, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+double
+FUNCTION(gsl_stats,wabsdev) (const BASE w[], const size_t wstride, const BASE data[], const size_t stride, const size_t n)
+{
+ const double wmean = FUNCTION(gsl_stats,wmean)(w, wstride, data, stride, n);
+ return FUNCTION(gsl_stats,wabsdev_m)(w, wstride, data, stride, n, wmean);
+}
+
+double
+FUNCTION(gsl_stats,wabsdev_m) (const BASE w[], const size_t wstride, const BASE data[], const size_t stride, const size_t n, const double wmean)
+{
+ /* Compute the weighted absolute deviation of a dataset */
+
+ long double wabsdev = 0;
+ long double W = 0;
+
+ size_t i;
+
+ /* find the sum of the absolute deviations */
+ for (i = 0; i < n; i++)
+ {
+ BASE wi = w[i * wstride];
+
+ if (wi > 0) {
+ const long double delta = fabs(data[i * stride] - wmean);
+ W += wi ;
+ wabsdev += (delta - wabsdev) * (wi / W);
+ }
+ }
+
+ return wabsdev;
+}
+
diff --git a/gsl-1.9/statistics/wkurtosis.c b/gsl-1.9/statistics/wkurtosis.c
new file mode 100644
index 0000000..5b0e0a2
--- /dev/null
+++ b/gsl-1.9/statistics/wkurtosis.c
@@ -0,0 +1,21 @@
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_statistics.h>
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "wkurtosis_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "wkurtosis_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "wkurtosis_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
diff --git a/gsl-1.9/statistics/wkurtosis_source.c b/gsl-1.9/statistics/wkurtosis_source.c
new file mode 100644
index 0000000..fc1920d
--- /dev/null
+++ b/gsl-1.9/statistics/wkurtosis_source.c
@@ -0,0 +1,62 @@
+/* statistics/wkurtosis_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Jim Davies, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+double
+FUNCTION(gsl_stats,wkurtosis) (const BASE w[], const size_t wstride, const BASE data[], const size_t stride, const size_t n)
+{
+ const double wmean = FUNCTION(gsl_stats,wmean)(w, wstride, data, stride, n);
+ const double wsd = FUNCTION(gsl_stats,wsd_m)(w, wstride, data, stride, n, wmean);
+ return FUNCTION(gsl_stats,wkurtosis_m_sd)(w, wstride, data, stride, n, wmean, wsd);
+}
+
+double
+FUNCTION(gsl_stats,wkurtosis_m_sd) (const BASE w[], const size_t wstride,
+ const BASE data[],
+ const size_t stride,
+ const size_t n,
+ const double wmean,
+ const double wsd)
+{
+ /* takes a dataset and finds the kurtosis */
+
+ long double wavg = 0, kurtosis;
+ long double W = 0;
+ size_t i;
+
+ /* find the fourth moment the deviations, normalized by the sd */
+
+ /* we use a recurrence relation to stably update a running value so
+ there aren't any large sums that can overflow */
+
+ for (i = 0; i < n; i++)
+ {
+ BASE wi = w[i * wstride];
+
+ if (wi > 0) {
+ const long double x = (data[i * stride] - wmean) / wsd;
+ W += wi ;
+ wavg += (x * x * x * x - wavg) * (wi / W);
+ }
+ }
+
+ kurtosis = wavg - 3.0; /* makes kurtosis zero for a Gaussian */
+
+ return kurtosis;
+}
+
diff --git a/gsl-1.9/statistics/wmean.c b/gsl-1.9/statistics/wmean.c
new file mode 100644
index 0000000..6cb1328
--- /dev/null
+++ b/gsl-1.9/statistics/wmean.c
@@ -0,0 +1,21 @@
+#include <config.h>
+#include <gsl/gsl_statistics.h>
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "wmean_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "wmean_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "wmean_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
diff --git a/gsl-1.9/statistics/wmean_source.c b/gsl-1.9/statistics/wmean_source.c
new file mode 100644
index 0000000..edf0507
--- /dev/null
+++ b/gsl-1.9/statistics/wmean_source.c
@@ -0,0 +1,48 @@
+/* statistics/wmean_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Jim Davies, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+double
+FUNCTION (gsl_stats, wmean) (const BASE w[], const size_t wstride, const BASE data[], const size_t stride, const size_t size)
+{
+ /* Compute the weighted arithmetic mean M of a dataset using the
+ recurrence relation
+
+ M(n) = M(n-1) + (data[n] - M(n-1)) (w(n)/(W(n-1) + w(n)))
+ W(n) = W(n-1) + w(n)
+
+ */
+
+ long double wmean = 0;
+ long double W = 0;
+
+ size_t i;
+
+ for (i = 0; i < size; i++)
+ {
+ BASE wi = w[i * wstride];
+
+ if (wi > 0)
+ {
+ W += wi;
+ wmean += (data[i * stride] - wmean) * (wi / W);
+ }
+ }
+
+ return wmean;
+}
diff --git a/gsl-1.9/statistics/wskew.c b/gsl-1.9/statistics/wskew.c
new file mode 100644
index 0000000..9e747c6
--- /dev/null
+++ b/gsl-1.9/statistics/wskew.c
@@ -0,0 +1,22 @@
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_statistics.h>
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "wskew_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "wskew_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "wskew_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
diff --git a/gsl-1.9/statistics/wskew_source.c b/gsl-1.9/statistics/wskew_source.c
new file mode 100644
index 0000000..5dea05d
--- /dev/null
+++ b/gsl-1.9/statistics/wskew_source.c
@@ -0,0 +1,59 @@
+/* statistics/wskew_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Jim Davies, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+double
+FUNCTION(gsl_stats,wskew) (const BASE w[], const size_t wstride, const BASE data[], const size_t stride, const size_t n)
+{
+ const double wmean = FUNCTION(gsl_stats,wmean)(w, wstride, data, stride, n);
+ const double wsd = FUNCTION(gsl_stats,wsd_m)(w, wstride, data, stride, n, wmean);
+ return FUNCTION(gsl_stats,wskew_m_sd)(w, wstride, data, stride, n, wmean, wsd);
+}
+
+double
+FUNCTION(gsl_stats,wskew_m_sd) (const BASE w[], const size_t wstride,
+ const BASE data[],
+ const size_t stride, const size_t n,
+ const double wmean, const double wsd)
+{
+ /* Compute the weighted skewness of a dataset */
+
+ long double wskew = 0;
+ long double W = 0;
+
+ size_t i;
+
+ /* find the sum of the cubed deviations, normalized by the sd. */
+
+ /* we use a recurrence relation to stably update a running value so
+ there aren't any large sums that can overflow */
+
+ for (i = 0; i < n; i++)
+ {
+ BASE wi = w[i * wstride];
+
+ if (wi > 0) {
+ const long double x = (data[i * stride] - wmean) / wsd;
+ W += wi ;
+ wskew += (x * x * x - wskew) * (wi / W);
+ }
+ }
+
+ return wskew;
+}
+
diff --git a/gsl-1.9/statistics/wvariance.c b/gsl-1.9/statistics/wvariance.c
new file mode 100644
index 0000000..3262664
--- /dev/null
+++ b/gsl-1.9/statistics/wvariance.c
@@ -0,0 +1,21 @@
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_statistics.h>
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "wvariance_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "wvariance_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "wvariance_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
diff --git a/gsl-1.9/statistics/wvariance_source.c b/gsl-1.9/statistics/wvariance_source.c
new file mode 100644
index 0000000..d815b1e
--- /dev/null
+++ b/gsl-1.9/statistics/wvariance_source.c
@@ -0,0 +1,127 @@
+/* statistics/wvariance_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Jim Davies, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+static double
+FUNCTION(compute,wvariance) (const BASE w[], const size_t wstride, const BASE data[], const size_t stride, const size_t n, const double wmean);
+
+static double
+FUNCTION(compute,factor) (const BASE w[], const size_t wstride, const size_t n);
+
+static double
+FUNCTION(compute,wvariance) (const BASE w[], const size_t wstride, const BASE data[], const size_t stride, const size_t n, const double wmean)
+{
+ /* takes a dataset and finds the weighted variance */
+
+ long double wvariance = 0 ;
+ long double W = 0;
+
+ size_t i;
+
+ /* find the sum of the squares */
+ for (i = 0; i < n; i++)
+ {
+ BASE wi = w[i * wstride];
+
+ if (wi > 0) {
+ const long double delta = (data[i * stride] - wmean);
+ W += wi ;
+ wvariance += (delta * delta - wvariance) * (wi / W);
+ }
+ }
+
+ return wvariance ;
+}
+
+static double
+FUNCTION(compute,factor) (const BASE w[], const size_t wstride, const size_t n)
+{
+ /* Find the factor ``N/(N-1)'' which multiplies the raw std dev */
+
+ long double a = 0 ;
+ long double b = 0;
+ long double factor;
+
+ size_t i;
+
+ /* find the sum of the squares */
+ for (i = 0; i < n; i++)
+ {
+ BASE wi = w[i * wstride];
+
+ if (wi > 0)
+ {
+ a += wi ;
+ b += wi * wi ;
+ }
+ }
+
+ factor = (a*a) / ((a*a) - b);
+
+ return factor ;
+}
+
+double
+FUNCTION(gsl_stats,wvariance_with_fixed_mean) (const BASE w[], const size_t wstride, const BASE data[], const size_t stride, const size_t n, const double wmean)
+{
+ const double wvariance = FUNCTION(compute,wvariance) (w, wstride, data, stride, n, wmean);
+ return wvariance;
+}
+
+double
+FUNCTION(gsl_stats,wsd_with_fixed_mean) (const BASE w[], const size_t wstride, const BASE data[], const size_t stride, const size_t n, const double wmean)
+{
+ const double wvariance = FUNCTION(compute,wvariance) (w, wstride, data, stride, n, wmean);
+ const double wsd = sqrt (wvariance);
+
+ return wsd;
+}
+
+
+double
+FUNCTION(gsl_stats,wvariance_m) (const BASE w[], const size_t wstride, const BASE data[], const size_t stride, const size_t n, const double wmean)
+{
+ const double variance = FUNCTION(compute,wvariance) (w, wstride, data, stride, n, wmean);
+ const double scale = FUNCTION(compute,factor)(w, wstride, n);
+
+ return scale * variance;
+}
+
+double
+FUNCTION(gsl_stats,wsd_m) (const BASE w[], const size_t wstride, const BASE data[], const size_t stride, const size_t n, const double wmean)
+{
+ const double variance = FUNCTION(compute,wvariance) (w, wstride, data, stride, n, wmean);
+ const double scale = FUNCTION(compute,factor)(w, wstride, n);
+ const double wsd = sqrt(scale * variance) ;
+
+ return wsd;
+}
+
+double
+FUNCTION(gsl_stats,wsd) (const BASE w[], const size_t wstride, const BASE data[], const size_t stride, const size_t n)
+{
+ const double wmean = FUNCTION(gsl_stats,wmean) (w, wstride, data, stride, n);
+ return FUNCTION(gsl_stats,wsd_m) (w, wstride, data, stride, n, wmean) ;
+}
+
+double
+FUNCTION(gsl_stats,wvariance) (const BASE w[], const size_t wstride, const BASE data[], const size_t stride, const size_t n)
+{
+ const double wmean = FUNCTION(gsl_stats,wmean) (w, wstride, data, stride, n);
+ return FUNCTION(gsl_stats,wvariance_m)(w, wstride, data, stride, n, wmean);
+}
diff --git a/gsl-1.9/sum/ChangeLog b/gsl-1.9/sum/ChangeLog
new file mode 100644
index 0000000..400e925
--- /dev/null
+++ b/gsl-1.9/sum/ChangeLog
@@ -0,0 +1,84 @@
+Thu Dec 21 21:46:54 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * changed err to abserr, to make it clear that it is an absolute
+ error in line with other modules.
+
+Thu Nov 2 20:08:14 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * added support for a workspace so that the user does not have to
+ allocate memory
+
+ * made the names of the functions consistent as either levin_u,
+ for the full u transform with error estimate, or levin_utrunc for
+ the u transform with only a truncation error estimate.
+
+Mon Apr 24 21:15:27 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_sum.h: added #include <stdlib.h> for size_t
+
+Mon Nov 1 12:50:17 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c (main): added tests using series for the Euler constant
+ and eta(1/2)
+
+ * resolved problems with spurious failures by replacing the
+ directly computed truncation error by an estimate which varies
+ more smoothly. I have used the average of the previous two values,
+ which seems to give a reliable estimate of the truncation
+ error. The direct evaluation of the truncation error sometimes
+ fluctuated wildly, due to cancellation effects.
+
+Thu Oct 28 12:05:47 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c: cleaned up tests, now find that everything works in
+ double-precision but not extended-precision where there are two
+ failures depending on the optimization level
+
+ * levin_uerr.c (gsl_sum_levin_u_accel_minmax): changed loop
+ maximum from <=n to <n to avoid access of uninitialized memory,
+ need further correctness checks on algorithm though.
+
+Thu Oct 7 12:03:36 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * levin_u.c levin_uerr.c: changed DBL_MAX to GSL_DBL_MAX since we
+ don't rely on DBL_MAX
+
+Sat Feb 6 20:35:26 1999 Brian Gough <bjg@netsci.freeserve.co.uk>
+
+ * test.c: adjusted the precision check to allow for "infinite
+ accuracy" which occurs when two results agree to machine precision
+
+Thu Nov 19 13:10:19 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * added an n_used parameter to all routines which gives the number
+ of terms actually used
+
+Tue Nov 17 12:31:03 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * test.c: added #include <config.h>
+
+ * renamed test_sum.c to test.c
+
+ * renamed all the functions so that _with_derivs is now the
+ default and _trunc is the case of no error estimates from the
+ derivatives
+
+ * test_sum.c (main): cleaned up tests
+
+Mon Nov 9 22:05:45 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * levin_u.c (gsl_sum_levin_u_accel_minmax): got rid of noise
+ variables since they aren't used in the non-derivative case
+
+1998-11-06 <bjg@ancho.lanl.gov>
+
+ * test_sum.c: replace variable N by macro to avoid variable length
+ array warning
+
+Tue Oct 27 18:06:16 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * levin_u.c: added in noise but it does not seem to be giving the
+ right answer for the error estimate. The actual value for the
+ accelerated sum is correct though. Check toms/602 for the original
+ algorithm.
+
diff --git a/gsl-1.9/sum/Makefile.am b/gsl-1.9/sum/Makefile.am
new file mode 100644
index 0000000..df348aa
--- /dev/null
+++ b/gsl-1.9/sum/Makefile.am
@@ -0,0 +1,17 @@
+noinst_LTLIBRARIES = libgslsum.la
+
+pkginclude_HEADERS = gsl_sum.h
+
+INCLUDES= -I$(top_builddir)
+
+libgslsum_la_SOURCES = levin_u.c levin_utrunc.c work_u.c work_utrunc.c
+
+TESTS = $(check_PROGRAMS)
+
+check_PROGRAMS = test
+
+test_LDADD = libgslsum.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+
+test_SOURCES = test.c
+
+
diff --git a/gsl-1.9/sum/Makefile.in b/gsl-1.9/sum/Makefile.in
new file mode 100644
index 0000000..198d27b
--- /dev/null
+++ b/gsl-1.9/sum/Makefile.in
@@ -0,0 +1,544 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = test$(EXEEXT)
+subdir = sum
+DIST_COMMON = $(pkginclude_HEADERS) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in ChangeLog
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgslsum_la_LIBADD =
+am_libgslsum_la_OBJECTS = levin_u.lo levin_utrunc.lo work_u.lo \
+ work_utrunc.lo
+libgslsum_la_OBJECTS = $(am_libgslsum_la_OBJECTS)
+am_test_OBJECTS = test.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = libgslsum.la ../ieee-utils/libgslieeeutils.la \
+ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \
+ ../utils/libutils.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgslsum_la_SOURCES) $(test_SOURCES)
+DIST_SOURCES = $(libgslsum_la_SOURCES) $(test_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libgslsum.la
+pkginclude_HEADERS = gsl_sum.h
+INCLUDES = -I$(top_builddir)
+libgslsum_la_SOURCES = levin_u.c levin_utrunc.c work_u.c work_utrunc.c
+TESTS = $(check_PROGRAMS)
+test_LDADD = libgslsum.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+test_SOURCES = test.c
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps sum/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps sum/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgslsum.la: $(libgslsum_la_OBJECTS) $(libgslsum_la_DEPENDENCIES)
+ $(LINK) $(libgslsum_la_LDFLAGS) $(libgslsum_la_OBJECTS) $(libgslsum_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkgincludeHEADERS
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/sum/gsl_sum.h b/gsl-1.9/sum/gsl_sum.h
new file mode 100644
index 0000000..4f7a66e
--- /dev/null
+++ b/gsl-1.9/sum/gsl_sum.h
@@ -0,0 +1,162 @@
+/* sum/gsl_sum.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+
+#ifndef __GSL_SUM_H__
+#define __GSL_SUM_H__
+
+#include <stdlib.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+/* Workspace for Levin U Transform with error estimation,
+ *
+ * size = number of terms the workspace can handle
+ * sum_plain = simple sum of series
+ * q_num = backward diagonal of numerator; length = size
+ * q_den = backward diagonal of denominator; length = size
+ * dq_num = table of numerator derivatives; length = size**2
+ * dq_den = table of denominator derivatives; length = size**2
+ * dsum = derivative of sum wrt term i; length = size
+ */
+
+typedef struct
+{
+ size_t size;
+ size_t i; /* position in array */
+ size_t terms_used; /* number of calls */
+ double sum_plain;
+ double *q_num;
+ double *q_den;
+ double *dq_num;
+ double *dq_den;
+ double *dsum;
+}
+gsl_sum_levin_u_workspace;
+
+gsl_sum_levin_u_workspace *gsl_sum_levin_u_alloc (size_t n);
+void gsl_sum_levin_u_free (gsl_sum_levin_u_workspace * w);
+
+/* Basic Levin-u acceleration method.
+ *
+ * array = array of series elements
+ * n = size of array
+ * sum_accel = result of summation acceleration
+ * err = estimated error
+ *
+ * See [Fessler et al., ACM TOMS 9, 346 (1983) and TOMS-602]
+ */
+
+int gsl_sum_levin_u_accel (const double *array,
+ const size_t n,
+ gsl_sum_levin_u_workspace * w,
+ double *sum_accel, double *abserr);
+
+/* Basic Levin-u acceleration method with constraints on the terms
+ * used,
+ *
+ * array = array of series elements
+ * n = size of array
+ * min_terms = minimum number of terms to sum
+ * max_terms = maximum number of terms to sum
+ * sum_accel = result of summation acceleration
+ * err = estimated error
+ *
+ * See [Fessler et al., ACM TOMS 9, 346 (1983) and TOMS-602]
+ */
+
+int gsl_sum_levin_u_minmax (const double *array,
+ const size_t n,
+ const size_t min_terms,
+ const size_t max_terms,
+ gsl_sum_levin_u_workspace * w,
+ double *sum_accel, double *abserr);
+
+/* Basic Levin-u step w/o reference to the array of terms.
+ * We only need to specify the value of the current term
+ * to execute the step. See TOMS-745.
+ *
+ * sum = t0 + ... + t_{n-1} + term; term = t_{n}
+ *
+ * term = value of the series term to be added
+ * n = position of term in series (starting from 0)
+ * sum_accel = result of summation acceleration
+ * sum_plain = simple sum of series
+ */
+
+int
+gsl_sum_levin_u_step (const double term,
+ const size_t n,
+ const size_t nmax,
+ gsl_sum_levin_u_workspace * w,
+ double *sum_accel);
+
+/* The following functions perform the same calculation without
+ estimating the errors. They require O(N) storage instead of O(N^2).
+ This may be useful for summing many similar series where the size
+ of the error has already been estimated reliably and is not
+ expected to change. */
+
+typedef struct
+{
+ size_t size;
+ size_t i; /* position in array */
+ size_t terms_used; /* number of calls */
+ double sum_plain;
+ double *q_num;
+ double *q_den;
+ double *dsum;
+}
+gsl_sum_levin_utrunc_workspace;
+
+gsl_sum_levin_utrunc_workspace *gsl_sum_levin_utrunc_alloc (size_t n);
+void gsl_sum_levin_utrunc_free (gsl_sum_levin_utrunc_workspace * w);
+
+int gsl_sum_levin_utrunc_accel (const double *array,
+ const size_t n,
+ gsl_sum_levin_utrunc_workspace * w,
+ double *sum_accel, double *abserr_trunc);
+
+int gsl_sum_levin_utrunc_minmax (const double *array,
+ const size_t n,
+ const size_t min_terms,
+ const size_t max_terms,
+ gsl_sum_levin_utrunc_workspace * w,
+ double *sum_accel, double *abserr_trunc);
+
+int gsl_sum_levin_utrunc_step (const double term,
+ const size_t n,
+ gsl_sum_levin_utrunc_workspace * w,
+ double *sum_accel);
+
+__END_DECLS
+
+#endif /* __GSL_SUM_H__ */
diff --git a/gsl-1.9/sum/levin_u.c b/gsl-1.9/sum/levin_u.c
new file mode 100644
index 0000000..06f188a
--- /dev/null
+++ b/gsl-1.9/sum/levin_u.c
@@ -0,0 +1,255 @@
+/* sum/levin_u.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sum.h>
+
+int
+gsl_sum_levin_u_accel (const double *array, const size_t array_size,
+ gsl_sum_levin_u_workspace * w,
+ double *sum_accel, double *abserr)
+{
+ return gsl_sum_levin_u_minmax (array, array_size,
+ 0, array_size - 1, w, sum_accel, abserr);
+}
+
+int
+gsl_sum_levin_u_minmax (const double *array, const size_t array_size,
+ const size_t min_terms, const size_t max_terms,
+ gsl_sum_levin_u_workspace * w,
+ double *sum_accel, double *abserr)
+{
+ if (array_size == 0)
+ {
+ *sum_accel = 0.0;
+ *abserr = 0.0;
+ w->sum_plain = 0.0;
+ w->terms_used = 0;
+ return GSL_SUCCESS;
+ }
+ else if (array_size == 1)
+ {
+ *sum_accel = array[0];
+ *abserr = 0.0;
+ w->sum_plain = array[0];
+ w->terms_used = 1;
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ const double SMALL = 0.01;
+ const size_t nmax = GSL_MAX (max_terms, array_size) - 1;
+ double noise_n = 0.0, noise_nm1 = 0.0;
+ double trunc_n = 0.0, trunc_nm1 = 0.0;
+ double actual_trunc_n = 0.0, actual_trunc_nm1 = 0.0;
+ double result_n = 0.0, result_nm1 = 0.0;
+ double variance = 0;
+ size_t n;
+ unsigned int i;
+ int better = 0;
+ int before = 0;
+ int converging = 0;
+ double least_trunc = GSL_DBL_MAX;
+ double least_trunc_noise = GSL_DBL_MAX;
+ double least_trunc_result;
+
+ /* Calculate specified minimum number of terms. No convergence
+ tests are made, and no truncation information is stored. */
+
+ for (n = 0; n < min_terms; n++)
+ {
+ const double t = array[n];
+ result_nm1 = result_n;
+ gsl_sum_levin_u_step (t, n, nmax, w, &result_n);
+ }
+
+ least_trunc_result = result_n;
+
+ variance = 0;
+ for (i = 0; i < n; i++)
+ {
+ double dn = w->dsum[i] * GSL_MACH_EPS * array[i];
+ variance += dn * dn;
+ }
+ noise_n = sqrt (variance);
+
+ /* Calculate up to maximum number of terms. Check truncation
+ condition. */
+
+ for (; n <= nmax; n++)
+ {
+ const double t = array[n];
+
+ result_nm1 = result_n;
+ gsl_sum_levin_u_step (t, n, nmax, w, &result_n);
+
+ /* Compute the truncation error directly */
+
+ actual_trunc_nm1 = actual_trunc_n;
+ actual_trunc_n = fabs (result_n - result_nm1);
+
+ /* Average results to make a more reliable estimate of the
+ real truncation error */
+
+ trunc_nm1 = trunc_n;
+ trunc_n = 0.5 * (actual_trunc_n + actual_trunc_nm1);
+
+ noise_nm1 = noise_n;
+ variance = 0;
+
+ for (i = 0; i <= n; i++)
+ {
+ double dn = w->dsum[i] * GSL_MACH_EPS * array[i];
+ variance += dn * dn;
+ }
+
+ noise_n = sqrt (variance);
+
+ /* Determine if we are in the convergence region. */
+
+ better = (trunc_n < trunc_nm1 || trunc_n < SMALL * fabs (result_n));
+ converging = converging || (better && before);
+ before = better;
+
+ if (converging)
+ {
+ if (trunc_n < least_trunc)
+ {
+ /* Found a low truncation point in the convergence
+ region. Save it. */
+
+ least_trunc_result = result_n;
+ least_trunc = trunc_n;
+ least_trunc_noise = noise_n;
+ }
+
+ if (noise_n > trunc_n / 3.0)
+ break;
+
+ if (trunc_n < 10.0 * GSL_MACH_EPS * fabs (result_n))
+ break;
+ }
+
+ }
+
+ if (converging)
+ {
+ /* Stopped in the convergence region. Return result and
+ error estimate. */
+
+ *sum_accel = least_trunc_result;
+ *abserr = GSL_MAX_DBL (least_trunc, least_trunc_noise);
+ w->terms_used = n;
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ /* Never reached the convergence region. Use the last
+ calculated values. */
+
+ *sum_accel = result_n;
+ *abserr = GSL_MAX_DBL (trunc_n, noise_n);
+ w->terms_used = n;
+ return GSL_SUCCESS;
+ }
+ }
+}
+
+
+int
+gsl_sum_levin_u_step (const double term, const size_t n, const size_t nmax,
+ gsl_sum_levin_u_workspace * w, double *sum_accel)
+{
+
+#define I(i,j) ((i)*(nmax+1) + (j))
+
+ if (n == 0)
+ {
+ *sum_accel = term;
+ w->sum_plain = term;
+
+ w->q_den[0] = 1.0 / term;
+ w->q_num[0] = 1.0;
+
+ w->dq_den[I (0, 0)] = -1.0 / (term * term);
+ w->dq_num[I (0, 0)] = 0.0;
+
+ w->dsum[0] = 1.0;
+
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ double result;
+ double factor = 1.0;
+ double ratio = (double) n / (n + 1.0);
+ unsigned int i;
+ int j;
+
+ w->sum_plain += term;
+
+ w->q_den[n] = 1.0 / (term * (n + 1.0) * (n + 1.0));
+ w->q_num[n] = w->sum_plain * w->q_den[n];
+
+ for (i = 0; i < n; i++)
+ {
+ w->dq_den[I (i, n)] = 0;
+ w->dq_num[I (i, n)] = w->q_den[n];
+ }
+
+ w->dq_den[I (n, n)] = -w->q_den[n] / term;
+ w->dq_num[I (n, n)] =
+ w->q_den[n] + w->sum_plain * (w->dq_den[I (n, n)]);
+
+ for (j = n - 1; j >= 0; j--)
+ {
+ double c = factor * (j + 1) / (n + 1);
+ factor *= ratio;
+ w->q_den[j] = w->q_den[j + 1] - c * w->q_den[j];
+ w->q_num[j] = w->q_num[j + 1] - c * w->q_num[j];
+
+ for (i = 0; i < n; i++)
+ {
+ w->dq_den[I (i, j)] =
+ w->dq_den[I (i, j + 1)] - c * w->dq_den[I (i, j)];
+ w->dq_num[I (i, j)] =
+ w->dq_num[I (i, j + 1)] - c * w->dq_num[I (i, j)];
+ }
+
+ w->dq_den[I (n, j)] = w->dq_den[I (n, j + 1)];
+ w->dq_num[I (n, j)] = w->dq_num[I (n, j + 1)];
+ }
+
+ result = w->q_num[0] / w->q_den[0];
+
+ *sum_accel = result;
+
+ for (i = 0; i <= n; i++)
+ {
+ w->dsum[i] =
+ (w->dq_num[I (i, 0)] -
+ result * w->dq_den[I (i, 0)]) / w->q_den[0];
+ }
+
+ return GSL_SUCCESS;
+ }
+}
diff --git a/gsl-1.9/sum/levin_utrunc.c b/gsl-1.9/sum/levin_utrunc.c
new file mode 100644
index 0000000..16a3f16
--- /dev/null
+++ b/gsl-1.9/sum/levin_utrunc.c
@@ -0,0 +1,202 @@
+/* sum/levin_utrunc.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sum.h>
+
+int
+gsl_sum_levin_utrunc_accel (const double *array,
+ const size_t array_size,
+ gsl_sum_levin_utrunc_workspace * w,
+ double *sum_accel, double *abserr_trunc)
+{
+ return gsl_sum_levin_utrunc_minmax (array, array_size,
+ 0, array_size - 1,
+ w, sum_accel, abserr_trunc);
+}
+
+
+int
+gsl_sum_levin_utrunc_minmax (const double *array,
+ const size_t array_size,
+ const size_t min_terms,
+ const size_t max_terms,
+ gsl_sum_levin_utrunc_workspace * w,
+ double *sum_accel, double *abserr_trunc)
+{
+ if (array_size == 0)
+ {
+ *sum_accel = 0.0;
+ *abserr_trunc = 0.0;
+ w->sum_plain = 0.0;
+ w->terms_used = 0;
+ return GSL_SUCCESS;
+ }
+ else if (array_size == 1)
+ {
+ *sum_accel = array[0];
+ *abserr_trunc = GSL_POSINF;
+ w->sum_plain = array[0];
+ w->terms_used = 1;
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ const double SMALL = 0.01;
+ const size_t nmax = GSL_MAX (max_terms, array_size) - 1;
+ double trunc_n = 0.0, trunc_nm1 = 0.0;
+ double actual_trunc_n = 0.0, actual_trunc_nm1 = 0.0;
+ double result_n = 0.0, result_nm1 = 0.0;
+ size_t n;
+ int better = 0;
+ int before = 0;
+ int converging = 0;
+ double least_trunc = GSL_DBL_MAX;
+ double result_least_trunc;
+
+ /* Calculate specified minimum number of terms. No convergence
+ tests are made, and no truncation information is stored. */
+
+ for (n = 0; n < min_terms; n++)
+ {
+ const double t = array[n];
+
+ result_nm1 = result_n;
+ gsl_sum_levin_utrunc_step (t, n, w, &result_n);
+ }
+
+ /* Assume the result after the minimum calculation is the best. */
+
+ result_least_trunc = result_n;
+
+ /* Calculate up to maximum number of terms. Check truncation
+ condition. */
+
+ for (; n <= nmax; n++)
+ {
+ const double t = array[n];
+
+ result_nm1 = result_n;
+ gsl_sum_levin_utrunc_step (t, n, w, &result_n);
+
+ /* Compute the truncation error directly */
+
+ actual_trunc_nm1 = actual_trunc_n;
+ actual_trunc_n = fabs (result_n - result_nm1);
+
+ /* Average results to make a more reliable estimate of the
+ real truncation error */
+
+ trunc_nm1 = trunc_n;
+ trunc_n = 0.5 * (actual_trunc_n + actual_trunc_nm1);
+
+ /* Determine if we are in the convergence region. */
+
+ better = (trunc_n < trunc_nm1 || trunc_n < SMALL * fabs (result_n));
+ converging = converging || (better && before);
+ before = better;
+
+ if (converging)
+ {
+ if (trunc_n < least_trunc)
+ {
+ /* Found a low truncation point in the convergence
+ region. Save it. */
+
+ least_trunc = trunc_n;
+ result_least_trunc = result_n;
+ }
+
+ if (fabs (trunc_n / result_n) < 10.0 * GSL_MACH_EPS)
+ break;
+ }
+ }
+
+ if (converging)
+ {
+ /* Stopped in the convergence region. Return result and
+ error estimate. */
+
+ *sum_accel = result_least_trunc;
+ *abserr_trunc = least_trunc;
+ w->terms_used = n;
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ /* Never reached the convergence region. Use the last
+ calculated values. */
+
+ *sum_accel = result_n;
+ *abserr_trunc = trunc_n;
+ w->terms_used = n;
+ return GSL_SUCCESS;
+ }
+ }
+}
+
+int
+gsl_sum_levin_utrunc_step (const double term,
+ const size_t n,
+ gsl_sum_levin_utrunc_workspace * w, double *sum_accel)
+{
+ if (term == 0.0)
+ {
+ /* This is actually harmless when treated in this way. A term
+ which is exactly zero is simply ignored; the state is not
+ changed. We return GSL_EZERODIV as an indicator that this
+ occured. */
+
+ return GSL_EZERODIV;
+ }
+ else if (n == 0)
+ {
+ *sum_accel = term;
+ w->sum_plain = term;
+ w->q_den[0] = 1.0 / term;
+ w->q_num[0] = 1.0;
+ return GSL_SUCCESS;
+ }
+ else
+ {
+ double factor = 1.0;
+ double ratio = (double) n / (n + 1.0);
+ int j;
+
+ w->sum_plain += term;
+ w->q_den[n] = 1.0 / (term * (n + 1.0) * (n + 1.0));
+ w->q_num[n] = w->sum_plain * w->q_den[n];
+
+ for (j = n - 1; j >= 0; j--)
+ {
+ double c = factor * (j + 1) / (n + 1);
+ factor *= ratio;
+ w->q_den[j] = w->q_den[j + 1] - c * w->q_den[j];
+ w->q_num[j] = w->q_num[j + 1] - c * w->q_num[j];
+ }
+
+ *sum_accel = w->q_num[0] / w->q_den[0];
+ return GSL_SUCCESS;
+ }
+}
diff --git a/gsl-1.9/sum/test.c b/gsl-1.9/sum/test.c
new file mode 100644
index 0000000..4ca4f1f
--- /dev/null
+++ b/gsl-1.9/sum/test.c
@@ -0,0 +1,234 @@
+/* sum/test.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_sum.h>
+
+#include <gsl/gsl_ieee_utils.h>
+
+#define N 50
+
+void check_trunc (double * t, double expected, const char * desc);
+void check_full (double * t, double expected, const char * desc);
+
+int
+main (void)
+{
+ gsl_ieee_env_setup ();
+
+ {
+ double t[N];
+ int n;
+
+ const double zeta_2 = M_PI * M_PI / 6.0;
+
+ /* terms for zeta(2) */
+
+ for (n = 0; n < N; n++)
+ {
+ double np1 = n + 1.0;
+ t[n] = 1.0 / (np1 * np1);
+ }
+
+ check_trunc (t, zeta_2, "zeta(2)");
+ check_full (t, zeta_2, "zeta(2)");
+ }
+
+ {
+ double t[N];
+ double x, y;
+ int n;
+
+ /* terms for exp(10.0) */
+ x = 10.0;
+ y = exp(x);
+
+ t[0] = 1.0;
+ for (n = 1; n < N; n++)
+ {
+ t[n] = t[n - 1] * (x / n);
+ }
+
+ check_trunc (t, y, "exp(10)");
+ check_full (t, y, "exp(10)");
+ }
+
+ {
+ double t[N];
+ double x, y;
+ int n;
+
+ /* terms for exp(-10.0) */
+ x = -10.0;
+ y = exp(x);
+
+ t[0] = 1.0;
+ for (n = 1; n < N; n++)
+ {
+ t[n] = t[n - 1] * (x / n);
+ }
+
+ check_trunc (t, y, "exp(-10)");
+ check_full (t, y, "exp(-10)");
+ }
+
+ {
+ double t[N];
+ double x, y;
+ int n;
+
+ /* terms for -log(1-x) */
+ x = 0.5;
+ y = -log(1-x);
+ t[0] = x;
+ for (n = 1; n < N; n++)
+ {
+ t[n] = t[n - 1] * (x * n) / (n + 1.0);
+ }
+
+ check_trunc (t, y, "-log(1/2)");
+ check_full (t, y, "-log(1/2)");
+ }
+
+ {
+ double t[N];
+ double x, y;
+ int n;
+
+ /* terms for -log(1-x) */
+ x = -1.0;
+ y = -log(1-x);
+ t[0] = x;
+ for (n = 1; n < N; n++)
+ {
+ t[n] = t[n - 1] * (x * n) / (n + 1.0);
+ }
+
+ check_trunc (t, y, "-log(2)");
+ check_full (t, y, "-log(2)");
+ }
+
+ {
+ double t[N];
+ int n;
+
+ double result = 0.192594048773;
+
+ /* terms for an alternating asymptotic series */
+
+ t[0] = 3.0 / (M_PI * M_PI);
+
+ for (n = 1; n < N; n++)
+ {
+ t[n] = -t[n - 1] * (4.0 * (n + 1.0) - 1.0) / (M_PI * M_PI);
+ }
+
+ check_trunc (t, result, "asymptotic series");
+ check_full (t, result, "asymptotic series");
+ }
+
+ {
+ double t[N];
+ int n;
+
+ /* Euler's gamma from GNU Calc (precision = 32) */
+
+ double result = 0.5772156649015328606065120900824;
+
+ /* terms for Euler's gamma */
+
+ t[0] = 1.0;
+
+ for (n = 1; n < N; n++)
+ {
+ t[n] = 1/(n+1.0) + log(n/(n+1.0));
+ }
+
+ check_trunc (t, result, "Euler's constant");
+ check_full (t, result, "Euler's constant");
+ }
+
+ {
+ double t[N];
+ int n;
+
+ /* eta(1/2) = sum_{k=1}^{\infty} (-1)^(k+1) / sqrt(k)
+
+ From Levin, Intern. J. Computer Math. B3:371--388, 1973.
+
+ I=(1-sqrt(2))zeta(1/2)
+ =(2/sqrt(pi))*integ(1/(exp(x^2)+1),x,0,inf) */
+
+ double result = 0.6048986434216305; /* approx */
+
+ /* terms for eta(1/2) */
+
+ for (n = 0; n < N; n++)
+ {
+ t[n] = (n%2 ? -1 : 1) * 1.0 /sqrt(n + 1.0);
+ }
+
+ check_trunc (t, result, "eta(1/2)");
+ check_full (t, result, "eta(1/2)");
+ }
+
+ exit (gsl_test_summary ());
+}
+
+void
+check_trunc (double * t, double expected, const char * desc)
+{
+ double sum_accel, prec;
+
+ gsl_sum_levin_utrunc_workspace * w = gsl_sum_levin_utrunc_alloc (N);
+
+ gsl_sum_levin_utrunc_accel (t, N, w, &sum_accel, &prec);
+ gsl_test_rel (sum_accel, expected, 1e-8, "trunc result, %s", desc);
+
+ /* No need to check precision for truncated result since this is not
+ a meaningful number */
+
+ gsl_sum_levin_utrunc_free (w);
+}
+
+void
+check_full (double * t, double expected, const char * desc)
+{
+ double sum_accel, err_est, sd_actual, sd_est;
+
+ gsl_sum_levin_u_workspace * w = gsl_sum_levin_u_alloc (N);
+
+ gsl_sum_levin_u_accel (t, N, w, &sum_accel, &err_est);
+ gsl_test_rel (sum_accel, expected, 1e-8, "full result, %s", desc);
+
+ sd_est = -log10 (err_est/fabs(sum_accel));
+ sd_actual = -log10 (DBL_EPSILON + fabs ((sum_accel - expected)/expected));
+
+ /* Allow one digit of slop */
+
+ gsl_test (sd_est > sd_actual + 1.0, "full significant digits, %s (%g vs %g)", desc, sd_est, sd_actual);
+
+ gsl_sum_levin_u_free (w);
+}
diff --git a/gsl-1.9/sum/work_u.c b/gsl-1.9/sum/work_u.c
new file mode 100644
index 0000000..3f7052b
--- /dev/null
+++ b/gsl-1.9/sum/work_u.c
@@ -0,0 +1,94 @@
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sum.h>
+
+gsl_sum_levin_u_workspace *
+gsl_sum_levin_u_alloc (size_t n)
+{
+ gsl_sum_levin_u_workspace * w;
+
+ if (n == 0)
+ {
+ GSL_ERROR_VAL ("length n must be positive integer", GSL_EDOM, 0);
+ }
+
+ w = (gsl_sum_levin_u_workspace *) malloc(sizeof(gsl_sum_levin_u_workspace));
+
+ if (w == NULL)
+ {
+ GSL_ERROR_VAL ("failed to allocate struct", GSL_ENOMEM, 0);
+ }
+
+ w->q_num = (double *) malloc (n * sizeof (double));
+
+ if (w->q_num == NULL)
+ {
+ free(w) ; /* error in constructor, prevent memory leak */
+
+ GSL_ERROR_VAL ("failed to allocate space for q_num", GSL_ENOMEM, 0);
+ }
+
+ w->q_den = (double *) malloc (n * sizeof (double));
+
+ if (w->q_den == NULL)
+ {
+ free (w->q_num);
+ free (w) ; /* error in constructor, prevent memory leak */
+
+ GSL_ERROR_VAL ("failed to allocate space for q_den", GSL_ENOMEM, 0);
+ }
+
+ w->dq_num = (double *) malloc (n * n * sizeof (double));
+
+ if (w->dq_num == NULL)
+ {
+ free (w->q_den);
+ free (w->q_num);
+ free(w) ; /* error in constructor, prevent memory leak */
+
+ GSL_ERROR_VAL ("failed to allocate space for dq_num", GSL_ENOMEM, 0);
+ }
+
+ w->dq_den = (double *) malloc (n * n * sizeof (double));
+
+ if (w->dq_den == NULL)
+ {
+ free (w->dq_num);
+ free (w->q_den);
+ free (w->q_num);
+ free (w) ; /* error in constructor, prevent memory leak */
+
+ GSL_ERROR_VAL ("failed to allocate space for dq_den", GSL_ENOMEM, 0);
+ }
+
+ w->dsum = (double *) malloc (n * sizeof (double));
+
+ if (w->dsum == NULL)
+ {
+ free (w->dq_den);
+ free (w->dq_num);
+ free (w->q_den);
+ free (w->q_num);
+ free (w) ; /* error in constructor, prevent memory leak */
+
+ GSL_ERROR_VAL ("failed to allocate space for dsum", GSL_ENOMEM, 0);
+ }
+
+ w->size = n;
+ w->terms_used = 0;
+ w->sum_plain = 0;
+
+ return w;
+}
+
+void
+gsl_sum_levin_u_free (gsl_sum_levin_u_workspace * w)
+{
+ free (w->dsum);
+ free (w->dq_den);
+ free (w->dq_num);
+ free (w->q_den);
+ free (w->q_num);
+ free (w);
+}
diff --git a/gsl-1.9/sum/work_utrunc.c b/gsl-1.9/sum/work_utrunc.c
new file mode 100644
index 0000000..67ebb81
--- /dev/null
+++ b/gsl-1.9/sum/work_utrunc.c
@@ -0,0 +1,67 @@
+#include <config.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_sum.h>
+
+gsl_sum_levin_utrunc_workspace *
+gsl_sum_levin_utrunc_alloc (size_t n)
+{
+ gsl_sum_levin_utrunc_workspace * w;
+
+ if (n == 0)
+ {
+ GSL_ERROR_VAL ("length n must be positive integer", GSL_EDOM, 0);
+ }
+
+ w = (gsl_sum_levin_utrunc_workspace *) malloc(sizeof(gsl_sum_levin_utrunc_workspace));
+
+ if (w == NULL)
+ {
+ GSL_ERROR_VAL ("failed to allocate struct", GSL_ENOMEM, 0);
+ }
+
+ w->q_num = (double *) malloc (n * sizeof (double));
+
+ if (w->q_num == NULL)
+ {
+ free(w) ; /* error in constructor, prevent memory leak */
+
+ GSL_ERROR_VAL ("failed to allocate space for q_num", GSL_ENOMEM, 0);
+ }
+
+ w->q_den = (double *) malloc (n * sizeof (double));
+
+ if (w->q_den == NULL)
+ {
+ free (w->q_num);
+ free (w) ; /* error in constructor, prevent memory leak */
+
+ GSL_ERROR_VAL ("failed to allocate space for q_den", GSL_ENOMEM, 0);
+ }
+
+ w->dsum = (double *) malloc (n * sizeof (double));
+
+ if (w->dsum == NULL)
+ {
+ free (w->q_den);
+ free (w->q_num);
+ free (w) ; /* error in constructor, prevent memory leak */
+
+ GSL_ERROR_VAL ("failed to allocate space for dsum", GSL_ENOMEM, 0);
+ }
+
+ w->size = n;
+ w->terms_used = 0;
+ w->sum_plain = 0;
+
+ return w;
+}
+
+void
+gsl_sum_levin_utrunc_free (gsl_sum_levin_utrunc_workspace * w)
+{
+ free (w->dsum);
+ free (w->q_den);
+ free (w->q_num);
+ free (w);
+}
diff --git a/gsl-1.9/sys/ChangeLog b/gsl-1.9/sys/ChangeLog
new file mode 100644
index 0000000..2be7792
--- /dev/null
+++ b/gsl-1.9/sys/ChangeLog
@@ -0,0 +1,99 @@
+2005-11-14 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c: added tests for constants
+
+2005-04-05 Brian Gough <bjg@network-theory.co.uk>
+
+ * infnan.c: added #include ieeefp.h for Solaris
+
+2004-12-22 Brian Gough <bjg@network-theory.co.uk>
+
+ * infnan.c (gsl_isinf): added missing return type of int
+
+2003-09-02 Brian Gough <bjg@network-theory.co.uk>
+
+ * infnan.c (gsl_isinf): added fallback for missing isinf (IRIX)
+
+2003-07-24 Brian Gough <bjg@network-theory.co.uk>
+
+ * invhyp.c: removed duplicate declarations
+
+ * ldfrexp.c: removed duplicate declarations
+
+ * expm1.c: removed duplicate declaration of gsl_expm1
+
+2003-01-02 Brian Gough <brian.gough@network-theory.co.uk>
+
+ * infnan.c (gsl_isnan): fall back to isnan,isinf,finite/isfinite
+ if available and IEEE comparisons do not work
+
+Wed Dec 11 17:29:24 2002 Brian Gough <brian.gough@network-theory.co.uk>
+
+ * ldfrexp.c: fix include to use <gsl/gsl_math.h> instead of
+ <gsl_math.h>
+
+2002-08-25 Brian Gough <bjg@network-theory.co.uk>
+
+ * fcmp.c (gsl_fcmp): approximate comparison of floating point
+ numbers using Knuth's algorithm
+
+ * ldfrexp.c (gsl_ldexp): portable replacement for ldexp()
+ (gsl_frexp): portable replacement for frexp()
+
+Wed Jan 16 16:35:58 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c (main): only test gsl_isnan, gsl_isinf, gsl_finite
+ functions if they have been compiled in.
+
+ * infnan.c (gsl_isnan): #ifdef out the gsl_isnan, gsl_isinf and
+ gsl_finite functions if IEEE comparisons for nans and infs are not
+ supported (HAVE_IEEE_COMPARISONS).
+
+Tue Aug 21 22:54:08 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c (main): use inf/inf to generate a nan, because MSVC
+ optimizes inf-inf to zero
+
+Sun May 6 14:28:57 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * infnan.c: added gsl_isnan, gsl_isinf, gsl_isreal
+
+Sun Feb 25 11:54:21 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * invhyp.c: added gsl_acosh, gsl_asinh, gsl_atanh
+
+Mon Jan 29 10:53:06 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * hypot.c: removed the inline from gsl_hypot, since this is the
+ static version of the function
+
+ * test.c (main): added an underflow test for gsl_hypot
+
+Thu Nov 16 19:28:38 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * coerce.c: added functions for coercing values out of registers
+ so they are correctly rounded
+
+Sun Oct 22 15:00:24 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * expm1.c (gsl_expm1): added gsl_expm1, a substitute for BSD's expm1
+
+Mon Apr 3 16:58:53 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * params.c (main): added parentheses around negative output values
+
+Tue Mar 21 12:44:07 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * hypot.c: added a quick gsl_hypot function for sqrt(x^2+y^2)
+
+1999-07-14 Mark Galassi <rosalia@cygnus.com>
+
+ * prec.c (GSL_MODE_PREC): surrounded this with function with an
+ #ifndef, since it might already be defined as a macro. In truth,
+ this function might be completely unnecessary, since the logic in
+ ../gsl_mode.h seems to cover all cases.
+
+Fri Nov 20 17:41:35 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * params.c: added program for printing ieee parameters
+
diff --git a/gsl-1.9/sys/Makefile.am b/gsl-1.9/sys/Makefile.am
new file mode 100644
index 0000000..b5c6823
--- /dev/null
+++ b/gsl-1.9/sys/Makefile.am
@@ -0,0 +1,12 @@
+noinst_LTLIBRARIES = libgslsys.la
+
+pkginclude_HEADERS = gsl_sys.h
+
+libgslsys_la_SOURCES = minmax.c prec.c hypot.c log1p.c expm1.c coerce.c invhyp.c pow_int.c infnan.c fdiv.c fcmp.c ldfrexp.c
+
+INCLUDES = -I$(top_builddir)
+
+check_PROGRAMS = test
+TESTS = $(check_PROGRAMS)
+test_SOURCES = test.c
+test_LDADD = libgslsys.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la libgslsys.la ../utils/libutils.la
diff --git a/gsl-1.9/sys/Makefile.in b/gsl-1.9/sys/Makefile.in
new file mode 100644
index 0000000..ffde81e
--- /dev/null
+++ b/gsl-1.9/sys/Makefile.in
@@ -0,0 +1,545 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = test$(EXEEXT)
+subdir = sys
+DIST_COMMON = $(pkginclude_HEADERS) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in ChangeLog
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgslsys_la_LIBADD =
+am_libgslsys_la_OBJECTS = minmax.lo prec.lo hypot.lo log1p.lo expm1.lo \
+ coerce.lo invhyp.lo pow_int.lo infnan.lo fdiv.lo fcmp.lo \
+ ldfrexp.lo
+libgslsys_la_OBJECTS = $(am_libgslsys_la_OBJECTS)
+am_test_OBJECTS = test.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = libgslsys.la ../ieee-utils/libgslieeeutils.la \
+ ../err/libgslerr.la ../test/libgsltest.la libgslsys.la \
+ ../utils/libutils.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgslsys_la_SOURCES) $(test_SOURCES)
+DIST_SOURCES = $(libgslsys_la_SOURCES) $(test_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libgslsys.la
+pkginclude_HEADERS = gsl_sys.h
+libgslsys_la_SOURCES = minmax.c prec.c hypot.c log1p.c expm1.c coerce.c invhyp.c pow_int.c infnan.c fdiv.c fcmp.c ldfrexp.c
+INCLUDES = -I$(top_builddir)
+TESTS = $(check_PROGRAMS)
+test_SOURCES = test.c
+test_LDADD = libgslsys.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la libgslsys.la ../utils/libutils.la
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps sys/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps sys/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgslsys.la: $(libgslsys_la_OBJECTS) $(libgslsys_la_DEPENDENCIES)
+ $(LINK) $(libgslsys_la_LDFLAGS) $(libgslsys_la_OBJECTS) $(libgslsys_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkgincludeHEADERS
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/sys/coerce.c b/gsl-1.9/sys/coerce.c
new file mode 100644
index 0000000..156c3cf
--- /dev/null
+++ b/gsl-1.9/sys/coerce.c
@@ -0,0 +1,54 @@
+/* sys/coerce.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+
+double gsl_coerce_double (const double x);
+
+double
+gsl_coerce_double (const double x)
+{
+ volatile double y;
+ y = x;
+ return y;
+}
+
+float gsl_coerce_float (const float x);
+
+float
+gsl_coerce_float (const float x)
+{
+ volatile float y;
+ y = x;
+ return y;
+}
+
+/* The following function is not needed, but is included for completeness */
+
+long double gsl_coerce_long_double (const long double x);
+
+long double
+gsl_coerce_long_double (const long double x)
+{
+ volatile long double y;
+ y = x;
+ return y;
+}
+
diff --git a/gsl-1.9/sys/expm1.c b/gsl-1.9/sys/expm1.c
new file mode 100644
index 0000000..c79d063
--- /dev/null
+++ b/gsl-1.9/sys/expm1.c
@@ -0,0 +1,50 @@
+/* sys/expm1.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+
+double gsl_expm1 (const double x)
+{
+ /* FIXME: this should be improved */
+
+ if (fabs(x) < M_LN2)
+ {
+ /* Compute the taylor series S = x + (1/2!) x^2 + (1/3!) x^3 + ... */
+
+ double i = 1.0;
+ double sum = x;
+ double term = x / 1.0;
+
+ do
+ {
+ i++ ;
+ term *= x/i;
+ sum += term;
+ }
+ while (fabs(term) > fabs(sum) * GSL_DBL_EPSILON) ;
+
+ return sum ;
+ }
+ else
+ {
+ return exp(x) - 1;
+ }
+}
diff --git a/gsl-1.9/sys/fcmp.c b/gsl-1.9/sys/fcmp.c
new file mode 100644
index 0000000..444169d
--- /dev/null
+++ b/gsl-1.9/sys/fcmp.c
@@ -0,0 +1,62 @@
+/* sys/gsl_compare.c
+ *
+ * Copyright (C) 2002 Gert Van den Eynde
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Based on fcmp 1.2.2 Copyright (c) 1998-2000 Theodore C. Belding
+ * University of Michigan Center for the Study of Complex Systems
+ * Ted.Belding@umich.edu
+ *
+ */
+
+#include <config.h>
+#include <gsl/gsl_sys.h>
+#include <math.h>
+
+int
+gsl_fcmp (const double x1, const double x2, const double epsilon)
+{
+ int exponent;
+ double delta, difference;
+
+ /* Find exponent of largest absolute value */
+
+ {
+ double max = (fabs (x1) > fabs (x2)) ? x1 : x2;
+
+ frexp (max, &exponent);
+ }
+
+ /* Form a neighborhood of size 2 * delta */
+
+ delta = ldexp (epsilon, exponent);
+
+ difference = x1 - x2;
+
+ if (difference > delta) /* x1 > x2 */
+ {
+ return 1;
+ }
+ else if (difference < -delta) /* x1 < x2 */
+ {
+ return -1;
+ }
+ else /* -delta <= difference <= delta */
+ {
+ return 0; /* x1 ~=~ x2 */
+ }
+}
+
diff --git a/gsl-1.9/sys/fdiv.c b/gsl-1.9/sys/fdiv.c
new file mode 100644
index 0000000..143b8a1
--- /dev/null
+++ b/gsl-1.9/sys/fdiv.c
@@ -0,0 +1,29 @@
+/* sys/fdiv.c
+ *
+ * Copyright (C) 2001 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+
+double gsl_fdiv (const double x, const double y);
+
+double
+gsl_fdiv (const double x, const double y)
+{
+ return x / y;
+}
diff --git a/gsl-1.9/sys/gsl_sys.h b/gsl-1.9/sys/gsl_sys.h
new file mode 100644
index 0000000..a3e72ae
--- /dev/null
+++ b/gsl-1.9/sys/gsl_sys.h
@@ -0,0 +1,62 @@
+/* sys/gsl_sys.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_SYS_H__
+#define __GSL_SYS_H__
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+double gsl_log1p (const double x);
+double gsl_expm1 (const double x);
+double gsl_hypot (const double x, const double y);
+double gsl_acosh (const double x);
+double gsl_asinh (const double x);
+double gsl_atanh (const double x);
+
+int gsl_isnan (const double x);
+int gsl_isinf (const double x);
+int gsl_finite (const double x);
+
+double gsl_nan (void);
+double gsl_posinf (void);
+double gsl_neginf (void);
+double gsl_fdiv (const double x, const double y);
+
+double gsl_coerce_double (const double x);
+float gsl_coerce_float (const float x);
+long double gsl_coerce_long_double (const long double x);
+
+double gsl_ldexp(const double x, const int e);
+double gsl_frexp(const double x, int * e);
+
+int gsl_fcmp (const double x1, const double x2, const double epsilon);
+
+__END_DECLS
+
+#endif /* __GSL_SYS_H__ */
diff --git a/gsl-1.9/sys/hypot.c b/gsl-1.9/sys/hypot.c
new file mode 100644
index 0000000..631bc10
--- /dev/null
+++ b/gsl-1.9/sys/hypot.c
@@ -0,0 +1,48 @@
+/* sys/hypot.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+
+double gsl_hypot (const double x, const double y);
+
+double gsl_hypot (const double x, const double y)
+{
+ double xabs = fabs(x) ;
+ double yabs = fabs(y) ;
+ double min, max;
+
+ if (xabs < yabs) {
+ min = xabs ;
+ max = yabs ;
+ } else {
+ min = yabs ;
+ max = xabs ;
+ }
+
+ if (min == 0)
+ {
+ return max ;
+ }
+
+ {
+ double u = min / max ;
+ return max * sqrt (1 + u * u) ;
+ }
+}
diff --git a/gsl-1.9/sys/infnan.c b/gsl-1.9/sys/infnan.c
new file mode 100644
index 0000000..fc38404
--- /dev/null
+++ b/gsl-1.9/sys/infnan.c
@@ -0,0 +1,147 @@
+/* sys/infnan.c
+ *
+ * Copyright (C) 2001, 2004 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+
+#if HAVE_IEEEFP_H
+#include <ieeefp.h>
+#endif
+
+double gsl_nan (void);
+double gsl_posinf (void);
+double gsl_neginf (void);
+double gsl_fdiv (const double x, const double y);
+
+double gsl_nan (void)
+{
+ return gsl_fdiv (0.0, 0.0);
+}
+
+double gsl_posinf (void)
+{
+ return gsl_fdiv (+1.0, 0.0);
+}
+
+double gsl_neginf (void)
+{
+ return gsl_fdiv (-1.0, 0.0);
+}
+
+
+int gsl_isnan (const double x);
+int gsl_isinf (const double x);
+int gsl_finite (const double x);
+
+#if defined(_MSC_VER) /* Microsoft Visual C++ */
+#include <float.h>
+int
+gsl_isnan (const double x)
+{
+ return _isnan(x);
+}
+
+int
+gsl_isinf (const double x)
+{
+ int fpc = _fpclass(x);
+
+ if (fpc == _FPCLASS_PINF)
+ return +1;
+ else if (fpc == _FPCLASS_NINF)
+ return -1;
+ else
+ return 0;
+}
+
+int
+gsl_finite (const double x)
+{
+ return _finite(x);
+}
+#elif HAVE_IEEE_COMPARISONS
+int
+gsl_isnan (const double x)
+{
+ int status = (x != x);
+ return status;
+}
+
+int
+gsl_isinf (const double x)
+{
+ double y = x - x;
+ int s = (y != y);
+
+ if (s && x > 0)
+ return +1;
+ else if (s && x < 0)
+ return -1;
+ else
+ return 0;
+}
+
+int
+gsl_finite (const double x)
+{
+ const double y = x - x;
+ int status = (y == y);
+ return status;
+}
+#else
+
+#if HAVE_DECL_ISNAN
+int
+gsl_isnan (const double x)
+{
+ return isnan(x);
+}
+#endif
+
+#if HAVE_DECL_ISINF
+int
+gsl_isinf (const double x)
+{
+ return isinf(x);
+}
+#else
+int
+gsl_isinf (const double x)
+{
+ return (! gsl_finite(x)) && (! gsl_isnan(x));
+}
+#endif
+
+
+#if HAVE_DECL_FINITE
+int
+gsl_finite (const double x)
+{
+ return finite(x);
+}
+#elif HAVE_DECL_ISFINITE
+int
+gsl_finite (const double x)
+{
+ return isfinite(x);
+}
+#endif
+
+#endif
+
diff --git a/gsl-1.9/sys/invhyp.c b/gsl-1.9/sys/invhyp.c
new file mode 100644
index 0000000..346c8a4
--- /dev/null
+++ b/gsl-1.9/sys/invhyp.c
@@ -0,0 +1,102 @@
+/* sys/invhyp.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_machine.h>
+
+double
+gsl_acosh (const double x)
+{
+ if (x > 1.0 / GSL_SQRT_DBL_EPSILON)
+ {
+ return log (x) + M_LN2;
+ }
+ else if (x > 2)
+ {
+ return log (2 * x - 1 / (sqrt (x * x - 1) + x));
+ }
+ else if (x > 1)
+ {
+ double t = x - 1;
+ return log1p (t + sqrt (2 * t + t * t));
+ }
+ else if (x == 1)
+ {
+ return 0;
+ }
+ else
+ {
+ return GSL_NAN;
+ }
+}
+
+double
+gsl_asinh (const double x)
+{
+ double a = fabs (x);
+ double s = (x < 0) ? -1 : 1;
+
+ if (a > 1 / GSL_SQRT_DBL_EPSILON)
+ {
+ return s * (log (a) + M_LN2);
+ }
+ else if (a > 2)
+ {
+ return s * log (2 * a + 1 / (a + sqrt (a * a + 1)));
+ }
+ else if (a > GSL_SQRT_DBL_EPSILON)
+ {
+ double a2 = a * a;
+ return s * log1p (a + a2 / (1 + sqrt (1 + a2)));
+ }
+ else
+ {
+ return x;
+ }
+}
+
+double
+gsl_atanh (const double x)
+{
+ double a = fabs (x);
+ double s = (x < 0) ? -1 : 1;
+
+ if (a > 1)
+ {
+ return GSL_NAN;
+ }
+ else if (a == 1)
+ {
+ return (x < 0) ? GSL_NEGINF : GSL_POSINF;
+ }
+ else if (a >= 0.5)
+ {
+ return s * 0.5 * log1p (2 * a / (1 - a));
+ }
+ else if (a > GSL_DBL_EPSILON)
+ {
+ return s * 0.5 * log1p (2 * a + 2 * a * a / (1 - a));
+ }
+ else
+ {
+ return x;
+ }
+}
diff --git a/gsl-1.9/sys/ldfrexp.c b/gsl-1.9/sys/ldfrexp.c
new file mode 100644
index 0000000..c5ba3a6
--- /dev/null
+++ b/gsl-1.9/sys/ldfrexp.c
@@ -0,0 +1,60 @@
+/* sys/ldfrexp.c
+ *
+ * Copyright (C) 2002, Gert Van den Eynde
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_math.h>
+
+double
+gsl_ldexp (const double x, const int e)
+{
+ double p2 = pow (2.0, (double)e);
+ return x * p2;
+}
+
+double
+gsl_frexp (const double x, int *e)
+{
+ if (x == 0.0)
+ {
+ *e = 0;
+ return 0.0;
+ }
+ else
+ {
+ double ex = ceil (log (fabs (x)) / M_LN2);
+ int ei = (int) ex;
+ double f = gsl_ldexp (x, -ei);
+
+ while (fabs (f) >= 1.0)
+ {
+ ei++;
+ f /= 2.0;
+ }
+
+ while (fabs (f) < 0.5)
+ {
+ ei--;
+ f *= 2.0;
+ }
+
+ *e = ei;
+ return f;
+ }
+}
diff --git a/gsl-1.9/sys/log1p.c b/gsl-1.9/sys/log1p.c
new file mode 100644
index 0000000..85d13f2
--- /dev/null
+++ b/gsl-1.9/sys/log1p.c
@@ -0,0 +1,30 @@
+/* sys/log1p.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+
+double gsl_log1p (const double x);
+
+double gsl_log1p (const double x)
+{
+ volatile double y;
+ y = 1 + x;
+ return log(y) - ((y-1)-x)/y ; /* cancels errors with IEEE arithmetic */
+}
diff --git a/gsl-1.9/sys/minmax.c b/gsl-1.9/sys/minmax.c
new file mode 100644
index 0000000..e512937
--- /dev/null
+++ b/gsl-1.9/sys/minmax.c
@@ -0,0 +1,84 @@
+/* sys/minmax.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+
+#define GSL_MAX(a,b) ((a) > (b) ? (a) : (b))
+#define GSL_MIN(a,b) ((a) < (b) ? (a) : (b))
+
+#ifndef HIDE_INLINE_STATIC
+int GSL_MAX_INT (int a, int b);
+int GSL_MIN_INT (int a, int b);
+double GSL_MAX_DBL (double a, double b);
+double GSL_MIN_DBL (double a, double b);
+long double GSL_MAX_LDBL (long double a, long double b);
+long double GSL_MIN_LDBL (long double a, long double b);
+
+int
+GSL_MAX_INT (int a, int b)
+{
+ return GSL_MAX (a, b);
+}
+
+int
+GSL_MIN_INT (int a, int b)
+{
+ return GSL_MIN (a, b);
+}
+
+double
+GSL_MAX_DBL (double a, double b)
+{
+ return GSL_MAX (a, b);
+}
+
+double
+GSL_MIN_DBL (double a, double b)
+{
+ return GSL_MIN (a, b);
+}
+
+long double
+GSL_MAX_LDBL (long double a, long double b)
+{
+ return GSL_MAX (a, b);
+}
+
+long double
+GSL_MIN_LDBL (long double a, long double b)
+{
+ return GSL_MIN (a, b);
+}
+#endif
+
+/* Define some static functions which are always available */
+
+double gsl_max (double a, double b);
+double gsl_min (double a, double b);
+
+double gsl_max (double a, double b)
+{
+ return GSL_MAX (a, b);
+}
+
+double gsl_min (double a, double b)
+{
+ return GSL_MIN (a, b);
+}
+
diff --git a/gsl-1.9/sys/pow_int.c b/gsl-1.9/sys/pow_int.c
new file mode 100644
index 0000000..cd29d2f
--- /dev/null
+++ b/gsl-1.9/sys/pow_int.c
@@ -0,0 +1,54 @@
+/* sys/pow_int.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+#include <config.h>
+#include <math.h>
+#include <gsl/gsl_pow_int.h>
+
+#ifndef HIDE_INLINE_STATIC
+double gsl_pow_2(const double x) { return x*x; }
+double gsl_pow_3(const double x) { return x*x*x; }
+double gsl_pow_4(const double x) { double x2 = x*x; return x2*x2; }
+double gsl_pow_5(const double x) { double x2 = x*x; return x2*x2*x; }
+double gsl_pow_6(const double x) { double x2 = x*x; return x2*x2*x2; }
+double gsl_pow_7(const double x) { double x3 = x*x*x; return x3*x3*x; }
+double gsl_pow_8(const double x) { double x2 = x*x; double x4 = x2*x2; return x4*x4; }
+double gsl_pow_9(const double x) { double x3 = x*x*x; return x3*x3*x3; }
+#endif
+
+double gsl_pow_int(double x, int n)
+{
+ double value = 1.0;
+
+ if(n < 0) {
+ x = 1.0/x;
+ n = -n;
+ }
+
+ /* repeated squaring method
+ * returns 0.0^0 = 1.0, so continuous in x
+ */
+ do {
+ if(n & 1) value *= x; /* for n odd */
+ n >>= 1;
+ x *= x;
+ } while (n);
+
+ return value;
+}
+
diff --git a/gsl-1.9/sys/prec.c b/gsl-1.9/sys/prec.c
new file mode 100644
index 0000000..567e0f7
--- /dev/null
+++ b/gsl-1.9/sys/prec.c
@@ -0,0 +1,75 @@
+/* sys/prec.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Author: G. Jungman */
+
+#include <config.h>
+#include <gsl/gsl_machine.h>
+#include <gsl/gsl_precision.h>
+
+const double gsl_prec_eps[_GSL_PREC_T_NUM] = {
+ GSL_DBL_EPSILON,
+ GSL_FLT_EPSILON,
+ GSL_SFLT_EPSILON
+};
+
+const double gsl_prec_sqrt_eps[_GSL_PREC_T_NUM] = {
+ GSL_SQRT_DBL_EPSILON,
+ GSL_SQRT_FLT_EPSILON,
+ GSL_SQRT_SFLT_EPSILON
+};
+
+const double gsl_prec_root3_eps[_GSL_PREC_T_NUM] = {
+ GSL_ROOT3_DBL_EPSILON,
+ GSL_ROOT3_FLT_EPSILON,
+ GSL_ROOT3_SFLT_EPSILON
+};
+
+const double gsl_prec_root4_eps[_GSL_PREC_T_NUM] = {
+ GSL_ROOT4_DBL_EPSILON,
+ GSL_ROOT4_FLT_EPSILON,
+ GSL_ROOT4_SFLT_EPSILON
+};
+
+const double gsl_prec_root5_eps[_GSL_PREC_T_NUM] = {
+ GSL_ROOT5_DBL_EPSILON,
+ GSL_ROOT5_FLT_EPSILON,
+ GSL_ROOT5_SFLT_EPSILON
+};
+
+const double gsl_prec_root6_eps[_GSL_PREC_T_NUM] = {
+ GSL_ROOT6_DBL_EPSILON,
+ GSL_ROOT6_FLT_EPSILON,
+ GSL_ROOT6_SFLT_EPSILON
+};
+
+typedef unsigned int gsl_mode_t;
+
+#ifndef HIDE_INLINE_STATIC
+/* We need this somewhere, in case the inline is ignored.
+ */
+
+unsigned int GSL_MODE_PREC(gsl_mode_t mt);
+
+unsigned int
+GSL_MODE_PREC(gsl_mode_t mt)
+{
+ return (mt & (unsigned int)7);
+}
+#endif
diff --git a/gsl-1.9/sys/test.c b/gsl-1.9/sys/test.c
new file mode 100644
index 0000000..c48e54a
--- /dev/null
+++ b/gsl-1.9/sys/test.c
@@ -0,0 +1,473 @@
+/* sys/test.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+
+int
+main (void)
+{
+ double y, y_expected;
+ int e, e_expected;
+
+ gsl_ieee_env_setup ();
+
+ /* Test for expm1 */
+
+ y = gsl_expm1 (0.0);
+ y_expected = 0.0;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_expm1(0.0)");
+
+ y = gsl_expm1 (1e-10);
+ y_expected = 1.000000000050000000002e-10;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_expm1(1e-10)");
+
+ y = gsl_expm1 (-1e-10);
+ y_expected = -9.999999999500000000017e-11;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_expm1(-1e-10)");
+
+ y = gsl_expm1 (0.1);
+ y_expected = 0.1051709180756476248117078264902;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_expm1(0.1)");
+
+ y = gsl_expm1 (-0.1);
+ y_expected = -0.09516258196404042683575094055356;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_expm1(-0.1)");
+
+ y = gsl_expm1 (10.0);
+ y_expected = 22025.465794806716516957900645284;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_expm1(10.0)");
+
+ y = gsl_expm1 (-10.0);
+ y_expected = -0.99995460007023751514846440848444;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_expm1(-10.0)");
+
+ /* Test for log1p */
+
+ y = gsl_log1p (0.0);
+ y_expected = 0.0;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_log1p(0.0)");
+
+ y = gsl_log1p (1e-10);
+ y_expected = 9.9999999995000000000333333333308e-11;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_log1p(1e-10)");
+
+ y = gsl_log1p (0.1);
+ y_expected = 0.095310179804324860043952123280765;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_log1p(0.1)");
+
+ y = gsl_log1p (10.0);
+ y_expected = 2.3978952727983705440619435779651;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_log1p(10.0)");
+
+ /* Test for gsl_hypot */
+
+ y = gsl_hypot (0.0, 0.0);
+ y_expected = 0.0;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot(0.0, 0.0)");
+
+ y = gsl_hypot (1e-10, 1e-10);
+ y_expected = 1.414213562373095048801688e-10;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot(1e-10, 1e-10)");
+
+ y = gsl_hypot (1e-38, 1e-38);
+ y_expected = 1.414213562373095048801688e-38;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot(1e-38, 1e-38)");
+
+ y = gsl_hypot (1e-10, -1.0);
+ y_expected = 1.000000000000000000005;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot(1e-10, -1)");
+
+ y = gsl_hypot (-1.0, 1e-10);
+ y_expected = 1.000000000000000000005;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot(-1, 1e-10)");
+
+ y = gsl_hypot (1e307, 1e301);
+ y_expected = 1.000000000000499999999999e307;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot(1e307, 1e301)");
+
+ y = gsl_hypot (1e301, 1e307);
+ y_expected = 1.000000000000499999999999e307;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot(1e301, 1e307)");
+
+ y = gsl_hypot (1e307, 1e307);
+ y_expected = 1.414213562373095048801688e307;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_hypot(1e307, 1e307)");
+
+
+ /* Test for acosh */
+
+ y = gsl_acosh (1.0);
+ y_expected = 0.0;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_acosh(1.0)");
+
+ y = gsl_acosh (1.1);
+ y_expected = 4.435682543851151891329110663525e-1;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_acosh(1.1)");
+
+ y = gsl_acosh (10.0);
+ y_expected = 2.9932228461263808979126677137742e0;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_acosh(10.0)");
+
+ y = gsl_acosh (1e10);
+ y_expected = 2.3718998110500402149594646668302e1;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_acosh(1e10)");
+
+ /* Test for asinh */
+
+ y = gsl_asinh (0.0);
+ y_expected = 0.0;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_asinh(0.0)");
+
+ y = gsl_asinh (1e-10);
+ y_expected = 9.9999999999999999999833333333346e-11;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_asinh(1e-10)");
+
+ y = gsl_asinh (-1e-10);
+ y_expected = -9.9999999999999999999833333333346e-11;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_asinh(1e-10)");
+
+ y = gsl_asinh (0.1);
+ y_expected = 9.983407889920756332730312470477e-2;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_asinh(0.1)");
+
+ y = gsl_asinh (-0.1);
+ y_expected = -9.983407889920756332730312470477e-2;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_asinh(-0.1)");
+
+ y = gsl_asinh (1.0);
+ y_expected = 8.8137358701954302523260932497979e-1;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_asinh(1.0)");
+
+ y = gsl_asinh (-1.0);
+ y_expected = -8.8137358701954302523260932497979e-1;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_asinh(-1.0)");
+
+ y = gsl_asinh (10.0);
+ y_expected = 2.9982229502979697388465955375965e0;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_asinh(10)");
+
+ y = gsl_asinh (-10.0);
+ y_expected = -2.9982229502979697388465955375965e0;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_asinh(-10)");
+
+ y = gsl_asinh (1e10);
+ y_expected = 2.3718998110500402149599646668302e1;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_asinh(1e10)");
+
+ y = gsl_asinh (-1e10);
+ y_expected = -2.3718998110500402149599646668302e1;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_asinh(-1e10)");
+
+ /* Test for atanh */
+
+ y = gsl_atanh (0.0);
+ y_expected = 0.0;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_atanh(0.0)");
+
+ y = gsl_atanh (1e-20);
+ y_expected = 1e-20;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_atanh(1e-20)");
+
+ y = gsl_atanh (-1e-20);
+ y_expected = -1e-20;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_atanh(-1e-20)");
+
+ y = gsl_atanh (0.1);
+ y_expected = 1.0033534773107558063572655206004e-1;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_atanh(0.1)");
+
+ y = gsl_atanh (-0.1);
+ y_expected = -1.0033534773107558063572655206004e-1;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_atanh(-0.1)");
+
+ y = gsl_atanh (0.9);
+ y_expected = 1.4722194895832202300045137159439e0;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_atanh(0.9)");
+
+ y = gsl_atanh (-0.9);
+ y_expected = -1.4722194895832202300045137159439e0;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_atanh(0.9)");
+
+ /* Test for pow_int */
+
+ y = gsl_pow_2 (-3.14);
+ y_expected = pow (-3.14, 2.0);
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_pow_2(-3.14)");
+
+ y = gsl_pow_3 (-3.14);
+ y_expected = pow (-3.14, 3.0);
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_pow_3(-3.14)");
+
+ y = gsl_pow_4 (-3.14);
+ y_expected = pow (-3.14, 4.0);
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_pow_4(-3.14)");
+
+ y = gsl_pow_5 (-3.14);
+ y_expected = pow (-3.14, 5.0);
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_pow_5(-3.14)");
+
+ y = gsl_pow_6 (-3.14);
+ y_expected = pow (-3.14, 6.0);
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_pow_6(-3.14)");
+
+ y = gsl_pow_7 (-3.14);
+ y_expected = pow (-3.14, 7.0);
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_pow_7(-3.14)");
+
+ y = gsl_pow_8 (-3.14);
+ y_expected = pow (-3.14, 8.0);
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_pow_8(-3.14)");
+
+ y = gsl_pow_9 (-3.14);
+ y_expected = pow (-3.14, 9.0);
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_pow_9(-3.14)");
+
+ {
+ int n;
+ for (n = -9; n < 10; n++)
+ {
+ y = gsl_pow_int (-3.14, n);
+ y_expected = pow (-3.14, n);
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_pow_n(-3.14,%d)", n);
+ }
+ }
+
+ /* Test for ldexp */
+
+ y = gsl_ldexp (M_PI, -2);
+ y_expected = M_PI_4;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_ldexp(pi,-2)");
+
+ y = gsl_ldexp (1.0, 2);
+ y_expected = 4.000000;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_ldexp(1.0,2)");
+
+ y = gsl_ldexp (0.0, 2);
+ y_expected = 0.0;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_ldexp(0.0,2)");
+
+ /* Test for frexp */
+
+ y = gsl_frexp (M_PI, &e);
+ y_expected = M_PI_4;
+ e_expected = 2;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_frexp(pi) fraction");
+ gsl_test_int (e, e_expected, "gsl_frexp(pi) exponent");
+
+ y = gsl_frexp (2.0, &e);
+ y_expected = 0.5;
+ e_expected = 2;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_frexp(2.0) fraction");
+ gsl_test_int (e, e_expected, "gsl_frexp(2.0) exponent");
+
+ y = gsl_frexp (1.0 / 4.0, &e);
+ y_expected = 0.5;
+ e_expected = -1;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_frexp(0.25) fraction");
+ gsl_test_int (e, e_expected, "gsl_frexp(0.25) exponent");
+
+ y = gsl_frexp (1.0 / 4.0 - 4.0 * GSL_DBL_EPSILON, &e);
+ y_expected = 0.999999999999996447;
+ e_expected = -2;
+ gsl_test_rel (y, y_expected, 1e-15, "gsl_frexp(0.25-eps) fraction");
+ gsl_test_int (e, e_expected, "gsl_frexp(0.25-eps) exponent");
+
+
+ /* Test for approximate floating point comparison */
+ {
+ double x, y;
+ int i;
+
+ x = M_PI;
+ y = 22.0 / 7.0;
+
+ /* test the basic function */
+
+ for (i = 0; i < 10; i++)
+ {
+ double tol = pow (10, -i);
+ int res = gsl_fcmp (x, y, tol);
+ gsl_test_int (res, -(i >= 4), "gsl_fcmp(%.5f,%.5f,%g)", x, y, tol);
+ }
+
+ for (i = 0; i < 10; i++)
+ {
+ double tol = pow (10, -i);
+ int res = gsl_fcmp (y, x, tol);
+ gsl_test_int (res, (i >= 4), "gsl_fcmp(%.5f,%.5f,%g)", y, x, tol);
+ }
+ }
+
+
+#if HAVE_IEEE_COMPARISONS
+ /* Test for isinf, isnan, finite */
+
+ {
+ double zero, one, inf, nan;
+ int s;
+
+ zero = 0.0;
+ one = 1.0;
+ inf = exp (1.0e10);
+ nan = inf / inf;
+
+ s = gsl_isinf (zero);
+ gsl_test_int (s, 0, "gsl_isinf(0)");
+
+ s = gsl_isinf (one);
+ gsl_test_int (s, 0, "gsl_isinf(1)");
+
+ s = gsl_isinf (inf);
+ gsl_test_int (s, 1, "gsl_isinf(inf)");
+
+ s = gsl_isinf (-inf);
+ gsl_test_int (s, -1, "gsl_isinf(-inf)");
+
+ s = gsl_isinf (nan);
+ gsl_test_int (s, 0, "gsl_isinf(nan)");
+
+
+ s = gsl_isnan (zero);
+ gsl_test_int (s, 0, "gsl_isnan(0)");
+
+ s = gsl_isnan (one);
+ gsl_test_int (s, 0, "gsl_isnan(1)");
+
+ s = gsl_isnan (inf);
+ gsl_test_int (s, 0, "gsl_isnan(inf)");
+
+ s = gsl_isnan (nan);
+ gsl_test_int (s, 1, "gsl_isnan(nan)");
+
+
+ s = gsl_finite (zero);
+ gsl_test_int (s, 1, "gsl_finite(0)");
+
+ s = gsl_finite (one);
+ gsl_test_int (s, 1, "gsl_finite(1)");
+
+ s = gsl_finite (inf);
+ gsl_test_int (s, 0, "gsl_finite(inf)");
+
+ s = gsl_finite (nan);
+ gsl_test_int (s, 0, "gsl_finite(nan)");
+ }
+#endif
+
+
+ {
+ double x = gsl_fdiv (2.0, 3.0);
+ gsl_test_rel (x, 2.0 / 3.0, 4 * GSL_DBL_EPSILON, "gsl_fdiv(2,3)");
+ }
+
+
+ /* Test constants in gsl_math.h */
+
+ {
+ double x = log(M_E);
+ gsl_test_rel (x, 1.0, 4 * GSL_DBL_EPSILON, "ln(M_E)");
+ }
+
+ {
+ double x=pow(2.0,M_LOG2E);
+ gsl_test_rel (x, exp(1.0), 4 * GSL_DBL_EPSILON, "2^M_LOG2E");
+ }
+
+ {
+ double x=pow(10.0,M_LOG10E);
+ gsl_test_rel (x, exp(1.0), 4 * GSL_DBL_EPSILON, "10^M_LOG10E");
+ }
+
+ {
+ double x=pow(M_SQRT2, 2.0);
+ gsl_test_rel (x, 2.0, 4 * GSL_DBL_EPSILON, "M_SQRT2^2");
+ }
+
+ {
+ double x=pow(M_SQRT1_2, 2.0);
+ gsl_test_rel (x, 1.0/2.0, 4 * GSL_DBL_EPSILON, "M_SQRT1_2");
+ }
+
+ {
+ double x=pow(M_SQRT3, 2.0);
+ gsl_test_rel (x, 3.0, 4 * GSL_DBL_EPSILON, "M_SQRT3^2");
+ }
+
+ {
+ double x = M_PI;
+ gsl_test_rel (x, 3.1415926535897932384626433832795, 4 * GSL_DBL_EPSILON, "M_PI");
+ }
+
+ {
+ double x = 2 * M_PI_2;
+ gsl_test_rel (x, M_PI, 4 * GSL_DBL_EPSILON, "2*M_PI_2");
+ }
+
+ {
+ double x = 4 * M_PI_4;
+ gsl_test_rel (x, M_PI, 4 * GSL_DBL_EPSILON, "4*M_PI_4");
+ }
+
+ {
+ double x = pow(M_SQRTPI, 2.0);
+ gsl_test_rel (x, M_PI, 4 * GSL_DBL_EPSILON, "M_SQRTPI^2");
+ }
+
+ {
+ double x = pow(M_2_SQRTPI, 2.0);
+ gsl_test_rel (x, 4/M_PI, 4 * GSL_DBL_EPSILON, "M_SQRTPI^2");
+ }
+
+ {
+ double x = M_1_PI;
+ gsl_test_rel (x, 1/M_PI, 4 * GSL_DBL_EPSILON, "M_1_SQRTPI");
+ }
+
+ {
+ double x = M_2_PI;
+ gsl_test_rel (x, 2.0/M_PI, 4 * GSL_DBL_EPSILON, "M_2_PI");
+ }
+
+ {
+ double x = exp(M_LN10);
+ gsl_test_rel (x, 10, 4 * GSL_DBL_EPSILON, "exp(M_LN10)");
+ }
+
+ {
+ double x = exp(M_LN2);
+ gsl_test_rel (x, 2, 4 * GSL_DBL_EPSILON, "exp(M_LN2)");
+ }
+
+ {
+ double x = exp(M_LNPI);
+ gsl_test_rel (x, M_PI, 4 * GSL_DBL_EPSILON, "exp(M_LNPI)");
+ }
+
+ {
+ double x = M_EULER;
+ gsl_test_rel (x, 0.5772156649015328606065120900824, 4 * GSL_DBL_EPSILON, "M_EULER");
+ }
+
+ exit (gsl_test_summary ());
+}
diff --git a/gsl-1.9/templates_off.h b/gsl-1.9/templates_off.h
new file mode 100644
index 0000000..9b235ad
--- /dev/null
+++ b/gsl-1.9/templates_off.h
@@ -0,0 +1,92 @@
+#ifdef FUNCTION
+#undef FUNCTION
+#endif
+
+#ifdef CONCAT4
+#undef CONCAT4
+#endif
+
+#ifdef CONCAT4x
+#undef CONCAT4x
+#endif
+
+#ifdef CONCAT3
+#undef CONCAT3
+#endif
+
+#ifdef CONCAT3x
+#undef CONCAT3x
+#endif
+
+#ifdef CONCAT2
+#undef CONCAT2
+#endif
+
+#ifdef CONCAT2x
+#undef CONCAT2x
+#endif
+
+#ifdef TYPE
+#undef TYPE
+#endif
+
+#ifdef REAL_TYPE
+#undef REAL_TYPE
+#endif
+
+#ifdef QUALIFIED_TYPE
+#undef QUALIFIED_TYPE
+#endif
+
+#ifdef VIEW
+#undef VIEW
+#endif
+
+#ifdef REAL_VIEW
+#undef REAL_VIEW
+#endif
+
+#ifdef QUALIFIED_VIEW
+#undef QUALIFIED_VIEW
+#endif
+
+#ifdef QUALIFIED_REAL_TYPE
+#undef QUALIFIED_REAL_TYPE
+#endif
+
+#ifdef QUALIFIED_REAL_VIEW
+#undef QUALIFIED_REAL_VIEW
+#endif
+
+#ifdef USES_LONGDOUBLE
+#undef USES_LONGDOUBLE
+#endif
+
+#ifdef SHORT_REAL
+#undef SHORT_REAL
+#endif
+
+#ifndef USE_QUALIFIER
+#ifdef QUALIFIER
+#undef QUALIFIER
+#endif
+#endif
+
+#undef BASE
+#undef BASE_EPSILON
+#undef SHORT
+#undef ATOMIC
+#undef MULTIPLICITY
+#undef IN_FORMAT
+#undef OUT_FORMAT
+#undef ATOMIC_IO
+#undef ZERO
+#undef ONE
+#undef NAME
+#undef STRING
+#undef EXPAND
+#undef UNSIGNED
+
+#ifdef FP
+#undef FP
+#endif
diff --git a/gsl-1.9/templates_on.h b/gsl-1.9/templates_on.h
new file mode 100644
index 0000000..f00095e
--- /dev/null
+++ b/gsl-1.9/templates_on.h
@@ -0,0 +1,251 @@
+/* If BASE is undefined we use function names like gsl_name()
+ and assume that we are using doubles.
+
+ If BASE is defined we used function names like gsl_BASE_name()
+ and use BASE as the base datatype */
+
+#if defined(BASE_GSL_COMPLEX_LONG)
+#define BASE gsl_complex_long_double
+#define SHORT complex_long_double
+#define SHORT_REAL long_double
+#define ATOMIC long double
+#define USES_LONGDOUBLE 1
+#define MULTIPLICITY 2
+#define FP 1
+#define IN_FORMAT "%Lg"
+#define OUT_FORMAT "%Lg"
+#define ATOMIC_IO ATOMIC
+#define ZERO {{0.0L,0.0L}}
+#define ONE {{1.0L,0.0L}}
+#define BASE_EPSILON GSL_DBL_EPSILON
+
+#elif defined(BASE_GSL_COMPLEX)
+#define BASE gsl_complex
+#define SHORT complex
+#define SHORT_REAL
+#define ATOMIC double
+#define MULTIPLICITY 2
+#define FP 1
+#define IN_FORMAT "%lg"
+#define OUT_FORMAT "%g"
+#define ATOMIC_IO ATOMIC
+#define ZERO {{0.0,0.0}}
+#define ONE {{1.0,0.0}}
+#define BASE_EPSILON GSL_DBL_EPSILON
+
+#elif defined(BASE_GSL_COMPLEX_FLOAT)
+#define BASE gsl_complex_float
+#define SHORT complex_float
+#define SHORT_REAL float
+#define ATOMIC float
+#define MULTIPLICITY 2
+#define FP 1
+#define IN_FORMAT "%g"
+#define OUT_FORMAT "%g"
+#define ATOMIC_IO ATOMIC
+#define ZERO {{0.0F,0.0F}}
+#define ONE {{1.0F,0.0F}}
+#define BASE_EPSILON GSL_FLT_EPSILON
+
+#elif defined(BASE_LONG_DOUBLE)
+#define BASE long double
+#define SHORT long_double
+#define ATOMIC long double
+#define USES_LONGDOUBLE 1
+#define MULTIPLICITY 1
+#define FP 1
+#define IN_FORMAT "%Lg"
+#define OUT_FORMAT "%Lg"
+#define ATOMIC_IO ATOMIC
+#define ZERO 0.0L
+#define ONE 1.0L
+#define BASE_EPSILON GSL_DBL_EPSILON
+
+#elif defined(BASE_DOUBLE)
+#define BASE double
+#define SHORT
+#define ATOMIC double
+#define MULTIPLICITY 1
+#define FP 1
+#define IN_FORMAT "%lg"
+#define OUT_FORMAT "%g"
+#define ATOMIC_IO ATOMIC
+#define ZERO 0.0
+#define ONE 1.0
+#define BASE_EPSILON GSL_DBL_EPSILON
+
+#elif defined(BASE_FLOAT)
+#define BASE float
+#define SHORT float
+#define ATOMIC float
+#define MULTIPLICITY 1
+#define FP 1
+#define IN_FORMAT "%g"
+#define OUT_FORMAT "%g"
+#define ATOMIC_IO ATOMIC
+#define ZERO 0.0F
+#define ONE 1.0F
+#define BASE_EPSILON GSL_FLT_EPSILON
+
+#elif defined(BASE_ULONG)
+#define BASE unsigned long
+#define SHORT ulong
+#define ATOMIC unsigned long
+#define MULTIPLICITY 1
+#define IN_FORMAT "%lu"
+#define OUT_FORMAT "%lu"
+#define ATOMIC_IO ATOMIC
+#define ZERO 0UL
+#define ONE 1UL
+#define UNSIGNED 1
+
+#elif defined(BASE_LONG)
+#define BASE long
+#define SHORT long
+#define ATOMIC long
+#define MULTIPLICITY 1
+#define IN_FORMAT "%ld"
+#define OUT_FORMAT "%ld"
+#define ATOMIC_IO ATOMIC
+#define ZERO 0L
+#define ONE 1L
+
+#elif defined(BASE_UINT)
+#define BASE unsigned int
+#define SHORT uint
+#define ATOMIC unsigned int
+#define MULTIPLICITY 1
+#define IN_FORMAT "%u"
+#define OUT_FORMAT "%u"
+#define ATOMIC_IO ATOMIC
+#define ZERO 0U
+#define ONE 1U
+#define UNSIGNED 1
+
+#elif defined(BASE_INT)
+#define BASE int
+#define SHORT int
+#define ATOMIC int
+#define MULTIPLICITY 1
+#define IN_FORMAT "%d"
+#define OUT_FORMAT "%d"
+#define ATOMIC_IO ATOMIC
+#define ZERO 0
+#define ONE 1
+
+#elif defined(BASE_USHORT)
+#define BASE unsigned short
+#define SHORT ushort
+#define ATOMIC unsigned short
+#define MULTIPLICITY 1
+#define IN_FORMAT "%hu"
+#define OUT_FORMAT "%hu"
+#define ATOMIC_IO ATOMIC
+#define ZERO 0U
+#define ONE 1U
+#define UNSIGNED 1
+
+#elif defined(BASE_SHORT)
+#define BASE short
+#define SHORT short
+#define ATOMIC short
+#define MULTIPLICITY 1
+#define IN_FORMAT "%hd"
+#define OUT_FORMAT "%hd"
+#define ATOMIC_IO ATOMIC
+#define ZERO 0
+#define ONE 1
+
+#elif defined(BASE_UCHAR)
+#define BASE unsigned char
+#define SHORT uchar
+#define ATOMIC unsigned char
+#define MULTIPLICITY 1
+#define IN_FORMAT "%u"
+#define OUT_FORMAT "%u"
+#define ATOMIC_IO unsigned int
+#define ZERO 0U
+#define ONE 1U
+#define UNSIGNED 1
+
+#elif defined(BASE_CHAR)
+#define BASE char
+#define SHORT char
+#define ATOMIC char
+#define MULTIPLICITY 1
+#define IN_FORMAT "%d"
+#define OUT_FORMAT "%d"
+#define ATOMIC_IO int
+#define ZERO 0
+#define ONE 1
+
+#else
+#error unknown BASE_ directive in source.h
+#endif
+
+#define CONCAT2x(a,b) a ## _ ## b
+#define CONCAT2(a,b) CONCAT2x(a,b)
+#define CONCAT3x(a,b,c) a ## _ ## b ## _ ## c
+#define CONCAT3(a,b,c) CONCAT3x(a,b,c)
+#define CONCAT4x(a,b,c,d) a ## _ ## b ## _ ## c ## _ ## d
+#define CONCAT4(a,b,c,d) CONCAT4x(a,b,c,d)
+
+#ifndef USE_QUALIFIER
+#define QUALIFIER
+#endif
+
+#ifdef USE_QUALIFIER
+#if defined(BASE_DOUBLE)
+#define FUNCTION(dir,name) CONCAT3(dir,QUALIFIER,name)
+#define TYPE(dir) dir
+#define VIEW(dir,name) CONCAT2(dir,name)
+#define QUALIFIED_TYPE(dir) QUALIFIER dir
+#define QUALIFIED_VIEW(dir,name) CONCAT3(dir,QUALIFIER,name)
+#else
+#define FUNCTION(a,c) CONCAT4(a,SHORT,QUALIFIER,c)
+#define TYPE(dir) CONCAT2(dir,SHORT)
+#define VIEW(dir,name) CONCAT3(dir,SHORT,name)
+#define QUALIFIED_TYPE(dir) QUALIFIER CONCAT2(dir,SHORT)
+#define QUALIFIED_VIEW(dir,name) CONCAT4(dir,SHORT,QUALIFIER,name)
+#endif
+#if defined(BASE_GSL_COMPLEX)
+#define REAL_TYPE(dir) dir
+#define REAL_VIEW(dir,name) CONCAT2(dir,name)
+#define QUALIFIED_REAL_TYPE(dir) QUALIFIER dir
+#define QUALIFIED_REAL_VIEW(dir,name) CONCAT3(dir,QUALIFIER,name)
+#else
+#define REAL_TYPE(dir) CONCAT2(dir,SHORT_REAL)
+#define REAL_VIEW(dir,name) CONCAT3(dir,SHORT_REAL,name)
+#define QUALIFIED_REAL_TYPE(dir) QUALIFIER CONCAT2(dir,SHORT_REAL)
+#define QUALIFIED_REAL_VIEW(dir,name) CONCAT4(dir,SHORT_REAL,QUALIFIER,name)
+#endif
+#else
+#if defined(BASE_DOUBLE)
+#define FUNCTION(dir,name) CONCAT2(dir,name)
+#define TYPE(dir) dir
+#define VIEW(dir,name) CONCAT2(dir,name)
+#define QUALIFIED_TYPE(dir) TYPE(dir)
+#define QUALIFIED_VIEW(dir,name) CONCAT2(dir,name)
+#else
+#define FUNCTION(a,c) CONCAT3(a,SHORT,c)
+#define TYPE(dir) CONCAT2(dir,SHORT)
+#define VIEW(dir,name) CONCAT3(dir,SHORT,name)
+#define QUALIFIED_TYPE(dir) TYPE(dir)
+#define QUALIFIED_VIEW(dir,name) CONCAT3(dir,SHORT,name)
+#endif
+#if defined(BASE_GSL_COMPLEX)
+#define REAL_TYPE(dir) dir
+#define REAL_VIEW(dir,name) CONCAT2(dir,name)
+#define QUALIFIED_REAL_TYPE(dir) dir
+#define QUALIFIED_REAL_VIEW(dir,name) CONCAT2(dir,name)
+#else
+#define REAL_TYPE(dir) CONCAT2(dir,SHORT_REAL)
+#define REAL_VIEW(dir,name) CONCAT3(dir,SHORT_REAL,name)
+#define QUALIFIED_REAL_TYPE(dir) CONCAT2(dir,SHORT_REAL)
+#define QUALIFIED_REAL_VIEW(dir,name) CONCAT3(dir,SHORT_REAL,name)
+#endif
+#endif
+
+#define STRING(x) #x
+#define EXPAND(x) STRING(x)
+#define NAME(x) EXPAND(TYPE(x))
diff --git a/gsl-1.9/test/ChangeLog b/gsl-1.9/test/ChangeLog
new file mode 100644
index 0000000..b93407d
--- /dev/null
+++ b/gsl-1.9/test/ChangeLog
@@ -0,0 +1,32 @@
+2005-06-21 Brian Gough <bjg@network-theory.co.uk>
+
+ * results.c: now displayed PASS lines only if GSL_TEST_VERBOSE=1,
+ otherwise only display fail lines by default.
+
+Thu Sep 12 22:56:31 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * results.c (gsl_test_rel): catch NaN
+ (gsl_test_abs): catch NaN
+
+Fri Sep 28 10:40:21 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * results.c: use the definition STDC_HEADERS instead of __STDC__
+ as recommended by the autoconf manual
+
+Thu Sep 6 10:17:10 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * results.c (gsl_test_factor): fixed factor to work for case of
+ 0==0 without dividing by zero
+
+Wed Nov 29 10:42:57 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * results.c (gsl_test_factor): added a test for two results being
+ within a given factor of each other (e.g. "result should be good
+ to within a factor of 2"). Note that this is different from the
+ definition of relative error, which starts with a measurement of
+ the difference by subtraction.
+
+Fri May 5 11:20:36 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * split out gsl_test code from err/ directory
+
diff --git a/gsl-1.9/test/Makefile.am b/gsl-1.9/test/Makefile.am
new file mode 100644
index 0000000..b6fe04d
--- /dev/null
+++ b/gsl-1.9/test/Makefile.am
@@ -0,0 +1,10 @@
+noinst_LTLIBRARIES = libgsltest.la
+
+pkginclude_HEADERS = gsl_test.h
+
+libgsltest_la_SOURCES = results.c
+
+#check_PROGRAMS = test
+#TESTS = test
+#test_SOURCES = test_errnos.c
+#test_LDADD = libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
diff --git a/gsl-1.9/test/Makefile.in b/gsl-1.9/test/Makefile.in
new file mode 100644
index 0000000..f15807f
--- /dev/null
+++ b/gsl-1.9/test/Makefile.in
@@ -0,0 +1,452 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = test
+DIST_COMMON = $(pkginclude_HEADERS) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in ChangeLog
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgsltest_la_LIBADD =
+am_libgsltest_la_OBJECTS = results.lo
+libgsltest_la_OBJECTS = $(am_libgsltest_la_OBJECTS)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgsltest_la_SOURCES)
+DIST_SOURCES = $(libgsltest_la_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libgsltest.la
+pkginclude_HEADERS = gsl_test.h
+libgsltest_la_SOURCES = results.c
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps test/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps test/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgsltest.la: $(libgsltest_la_OBJECTS) $(libgsltest_la_DEPENDENCIES)
+ $(LINK) $(libgsltest_la_LDFLAGS) $(libgsltest_la_OBJECTS) $(libgsltest_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+ clean-libtool clean-noinstLTLIBRARIES ctags distclean \
+ distclean-compile distclean-generic distclean-libtool \
+ distclean-tags distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-exec \
+ install-exec-am install-info install-info-am install-man \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkgincludeHEADERS
+
+
+#check_PROGRAMS = test
+#TESTS = test
+#test_SOURCES = test_errnos.c
+#test_LDADD = libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/test/gsl_test.h b/gsl-1.9/test/gsl_test.h
new file mode 100644
index 0000000..f18759e
--- /dev/null
+++ b/gsl-1.9/test/gsl_test.h
@@ -0,0 +1,66 @@
+/* err/gsl_test.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_TEST_H__
+#define __GSL_TEST_H__
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+void
+ gsl_test (int status, const char *test_description, ...);
+
+void
+gsl_test_rel (double result, double expected, double relative_error,
+ const char *test_description, ...) ;
+
+void
+gsl_test_abs (double result, double expected, double absolute_error,
+ const char *test_description, ...) ;
+
+void
+gsl_test_factor (double result, double expected, double factor,
+ const char *test_description, ...) ;
+
+void
+gsl_test_int (int result, int expected, const char *test_description, ...) ;
+
+void
+gsl_test_str (const char * result, const char * expected,
+ const char *test_description, ...) ;
+
+void
+ gsl_test_verbose (int verbose) ;
+
+int
+ gsl_test_summary (void) ;
+
+
+__END_DECLS
+
+#endif /* __GSL_TEST_H__ */
diff --git a/gsl-1.9/test/results.c b/gsl-1.9/test/results.c
new file mode 100644
index 0000000..541959c
--- /dev/null
+++ b/gsl-1.9/test/results.c
@@ -0,0 +1,461 @@
+/* err/test_results.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <gsl/gsl_sys.h>
+#include <gsl/gsl_machine.h>
+
+#if HAVE_VPRINTF
+#ifdef STDC_HEADERS
+#include <stdarg.h>
+#else
+#include <varargs.h>
+#endif
+#endif
+
+#include <gsl/gsl_test.h>
+
+static unsigned int tests = 0;
+static unsigned int passed = 0;
+static unsigned int failed = 0;
+
+static unsigned int verbose = 0;
+
+static void
+initialise (void)
+{
+ const char * p = getenv("GSL_TEST_VERBOSE");
+
+ /* 0 = show failures only (we always want to see these) */
+ /* 1 = show passes and failures */
+
+ if (p == 0) /* environment variable is not set */
+ return ;
+
+ if (*p == '\0') /* environment variable is empty */
+ return ;
+
+ verbose = strtoul (p, 0, 0);
+
+ return;
+}
+
+static void
+update (int s)
+{
+ tests++;
+
+ if (s == 0)
+ {
+ passed++;
+ }
+ else
+ {
+ failed++;
+ }
+}
+
+void
+gsl_test (int status, const char *test_description,...)
+{
+ if (!tests) initialise();
+
+ update (status);
+
+ if (status || verbose)
+ {
+ printf (status ? "FAIL: " : "PASS: ");
+
+#if HAVE_VPRINTF
+ {
+ va_list ap;
+#ifdef STDC_HEADERS
+ va_start (ap, test_description);
+#else
+ va_start (ap);
+#endif
+ vprintf (test_description, ap);
+ va_end (ap);
+ }
+#endif
+
+ if (status && !verbose)
+ printf(" [%u]", tests);
+
+ printf("\n");
+ fflush (stdout);
+ }
+}
+
+
+void
+gsl_test_rel (double result, double expected, double relative_error,
+ const char *test_description,...)
+{
+ int status ;
+
+ if (!tests) initialise();
+
+ /* Check for NaN vs inf vs number */
+
+ if (gsl_isnan(result) || gsl_isnan(expected))
+ {
+ status = gsl_isnan(result) != gsl_isnan(expected);
+ }
+ else if (gsl_isinf(result) || gsl_isinf(expected))
+ {
+ status = gsl_isinf(result) != gsl_isinf(expected);
+ }
+ else if ((expected > 0 && expected < GSL_DBL_MIN)
+ || (expected < 0 && expected > -(GSL_DBL_MIN)))
+ {
+ status = -1;
+ }
+ else if (expected != 0 )
+ {
+ status = (fabs(result-expected)/fabs(expected) > relative_error) ;
+ }
+ else
+ {
+ status = (fabs(result) > relative_error) ;
+ }
+
+ update (status);
+
+ if (status || verbose)
+ {
+ printf (status ? "FAIL: " : "PASS: ");
+
+#if HAVE_VPRINTF
+ {
+ va_list ap;
+#ifdef STDC_HEADERS
+ va_start (ap, test_description);
+#else
+ va_start (ap);
+#endif
+ vprintf (test_description, ap);
+ va_end (ap);
+ }
+#endif
+
+ if (status == 0)
+ {
+ if (strlen(test_description) < 45)
+ {
+ printf(" (%g observed vs %g expected)", result, expected) ;
+ }
+ else
+ {
+ printf(" (%g obs vs %g exp)", result, expected) ;
+ }
+ }
+ else
+ {
+ printf(" (%.18g observed vs %.18g expected)", result, expected) ;
+ }
+
+ if (status == -1)
+ {
+ printf(" [test uses subnormal value]") ;
+ }
+
+ if (status && !verbose)
+ printf(" [%u]", tests);
+
+ printf ("\n") ;
+ fflush (stdout);
+ }
+}
+
+void
+gsl_test_abs (double result, double expected, double absolute_error,
+ const char *test_description,...)
+{
+ int status ;
+
+ if (!tests) initialise();
+
+ /* Check for NaN vs inf vs number */
+
+ if (gsl_isnan(result) || gsl_isnan(expected))
+ {
+ status = gsl_isnan(result) != gsl_isnan(expected);
+ }
+ else if (gsl_isinf(result) || gsl_isinf(expected))
+ {
+ status = gsl_isinf(result) != gsl_isinf(expected);
+ }
+ else if ((expected > 0 && expected < GSL_DBL_MIN)
+ || (expected < 0 && expected > -(GSL_DBL_MIN)))
+ {
+ status = -1;
+ }
+ else
+ {
+ status = fabs(result-expected) > absolute_error ;
+ }
+
+ update (status);
+
+ if (status || verbose)
+ {
+ printf (status ? "FAIL: " : "PASS: ");
+
+#if HAVE_VPRINTF
+ {
+ va_list ap;
+
+#ifdef STDC_HEADERS
+ va_start (ap, test_description);
+#else
+ va_start (ap);
+#endif
+ vprintf (test_description, ap);
+ va_end (ap);
+ }
+#endif
+
+ if (status == 0)
+ {
+ if (strlen(test_description) < 45)
+ {
+ printf(" (%g observed vs %g expected)", result, expected) ;
+ }
+ else
+ {
+ printf(" (%g obs vs %g exp)", result, expected) ;
+ }
+ }
+ else
+ {
+ printf(" (%.18g observed vs %.18g expected)", result, expected) ;
+ }
+
+ if (status == -1)
+ {
+ printf(" [test uses subnormal value]") ;
+ }
+
+ if (status && !verbose)
+ printf(" [%u]", tests);
+
+ printf ("\n") ;
+ fflush (stdout);
+ }
+}
+
+
+void
+gsl_test_factor (double result, double expected, double factor,
+ const char *test_description,...)
+{
+ int status;
+
+ if (!tests) initialise();
+
+ if ((expected > 0 && expected < GSL_DBL_MIN)
+ || (expected < 0 && expected > -(GSL_DBL_MIN)))
+ {
+ status = -1;
+ }
+ else if (result == expected)
+ {
+ status = 0;
+ }
+ else if (expected == 0.0)
+ {
+ status = (result > expected || result < expected);
+ }
+ else
+ {
+ double u = result / expected;
+ status = (u > factor || u < 1.0 / factor) ;
+ }
+
+ update (status);
+
+ if (status || verbose)
+ {
+ printf (status ? "FAIL: " : "PASS: ");
+
+#if HAVE_VPRINTF
+ {
+ va_list ap;
+
+#ifdef STDC_HEADERS
+ va_start (ap, test_description);
+#else
+ va_start (ap);
+#endif
+ vprintf (test_description, ap);
+ va_end (ap);
+ }
+#endif
+ if (status == 0)
+ {
+ if (strlen(test_description) < 45)
+ {
+ printf(" (%g observed vs %g expected)", result, expected) ;
+ }
+ else
+ {
+ printf(" (%g obs vs %g exp)", result, expected) ;
+ }
+ }
+ else
+ {
+ printf(" (%.18g observed vs %.18g expected)", result, expected) ;
+ }
+
+ if (status == -1)
+ {
+ printf(" [test uses subnormal value]") ;
+ }
+
+ if (status && !verbose)
+ printf(" [%u]", tests);
+
+ printf ("\n") ;
+ fflush (stdout);
+ }
+}
+
+void
+gsl_test_int (int result, int expected, const char *test_description,...)
+{
+ int status = (result != expected) ;
+
+ if (!tests) initialise();
+
+ update (status);
+
+ if (status || verbose)
+ {
+ printf (status ? "FAIL: " : "PASS: ");
+
+#if HAVE_VPRINTF
+ {
+ va_list ap;
+
+#ifdef STDC_HEADERS
+ va_start (ap, test_description);
+#else
+ va_start (ap);
+#endif
+ vprintf (test_description, ap);
+ va_end (ap);
+ }
+#endif
+ if (status == 0)
+ {
+ printf(" (%d observed vs %d expected)", result, expected) ;
+ }
+ else
+ {
+ printf(" (%d observed vs %d expected)", result, expected) ;
+ }
+
+ if (status && !verbose)
+ printf(" [%u]", tests);
+
+ printf ("\n");
+ fflush (stdout);
+ }
+}
+
+void
+gsl_test_str (const char * result, const char * expected,
+ const char *test_description,...)
+{
+ int status = strcmp(result,expected) ;
+
+ if (!tests) initialise();
+
+ update (status);
+
+ if (status || verbose)
+ {
+ printf (status ? "FAIL: " : "PASS: ");
+
+#if HAVE_VPRINTF
+ {
+ va_list ap;
+
+#ifdef STDC_HEADERS
+ va_start (ap, test_description);
+#else
+ va_start (ap);
+#endif
+ vprintf (test_description, ap);
+ va_end (ap);
+ }
+#endif
+ if (status)
+ {
+ printf(" (%s observed vs %s expected)", result, expected) ;
+ }
+
+ if (status && !verbose)
+ printf(" [%u]", tests);
+
+ printf ("\n");
+ fflush (stdout);
+ }
+}
+
+void
+gsl_test_verbose (int v)
+{
+ verbose = v;
+}
+
+int
+gsl_test_summary (void)
+{
+ if (verbose && 0) /* FIXME: turned it off, this annoys me */
+ printf ("%d tests, passed %d, failed %d.\n", tests, passed, failed);
+
+ if (failed != 0)
+ {
+ return EXIT_FAILURE;
+ }
+
+ if (tests != passed + failed)
+ {
+ if (verbose)
+ printf ("TEST RESULTS DO NOT ADD UP %d != %d + %d\n",
+ tests, passed, failed);
+ return EXIT_FAILURE;
+ }
+
+ if (passed == tests)
+ {
+ if (!verbose) /* display a summary of passed tests */
+ printf ("Completed [%d/%d]\n", passed, tests);
+
+ return EXIT_SUCCESS;
+ }
+
+ return EXIT_FAILURE;
+}
diff --git a/gsl-1.9/test_gsl_histogram.sh b/gsl-1.9/test_gsl_histogram.sh
new file mode 100755
index 0000000..7411660
--- /dev/null
+++ b/gsl-1.9/test_gsl_histogram.sh
@@ -0,0 +1,16 @@
+#! /bin/sh
+
+cat > test.exp.1.tmp <<EOF
+1 2 1
+2 3 2
+3 4 0
+4 5 1
+EOF
+
+echo 1 2 2.5 4 | ./gsl-histogram 1 5 4 | tr -d '\r' > test.obs.1.tmp
+
+cmp test.exp.1.tmp test.obs.1.tmp
+STATUS=$?
+rm test.exp.1.tmp test.obs.1.tmp
+
+exit $STATUS
diff --git a/gsl-1.9/utils/Makefile.am b/gsl-1.9/utils/Makefile.am
new file mode 100644
index 0000000..117cf7c
--- /dev/null
+++ b/gsl-1.9/utils/Makefile.am
@@ -0,0 +1,7 @@
+noinst_LTLIBRARIES = libutils.la
+
+# Don't need to list alloca.c, etc., Automake includes them.
+libutils_la_SOURCES = system.h placeholder.c
+libutils_la_LIBADD = @LIBOBJS@
+
+EXTRA_DIST = README
diff --git a/gsl-1.9/utils/Makefile.in b/gsl-1.9/utils/Makefile.in
new file mode 100644
index 0000000..868095f
--- /dev/null
+++ b/gsl-1.9/utils/Makefile.in
@@ -0,0 +1,419 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = utils
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+ memcpy.c memmove.c strdup.c strtol.c strtoul.c
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libutils_la_DEPENDENCIES = @LIBOBJS@
+am_libutils_la_OBJECTS = placeholder.lo
+libutils_la_OBJECTS = $(am_libutils_la_OBJECTS)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libutils_la_SOURCES)
+DIST_SOURCES = $(libutils_la_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libutils.la
+
+# Don't need to list alloca.c, etc., Automake includes them.
+libutils_la_SOURCES = system.h placeholder.c
+libutils_la_LIBADD = @LIBOBJS@
+EXTRA_DIST = README
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps utils/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps utils/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libutils.la: $(libutils_la_OBJECTS) $(libutils_la_DEPENDENCIES)
+ $(LINK) $(libutils_la_LDFLAGS) $(libutils_la_OBJECTS) $(libutils_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LTLIBRARIES)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+ clean-libtool clean-noinstLTLIBRARIES ctags distclean \
+ distclean-compile distclean-generic distclean-libtool \
+ distclean-tags distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-exec \
+ install-exec-am install-info install-info-am install-man \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags uninstall uninstall-am \
+ uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/utils/README b/gsl-1.9/utils/README
new file mode 100644
index 0000000..87073b6
--- /dev/null
+++ b/gsl-1.9/utils/README
@@ -0,0 +1,5 @@
+Some common routines.
+These were taken from the lib directory of Texinfo-3.11.
+Many are common to other GNU packages as well.
+(On the FSF machines, check /gd/gnu/lib for the latest.)
+
diff --git a/gsl-1.9/utils/memcpy.c b/gsl-1.9/utils/memcpy.c
new file mode 100644
index 0000000..61dd912
--- /dev/null
+++ b/gsl-1.9/utils/memcpy.c
@@ -0,0 +1,20 @@
+/* Copy LEN bytes starting at SRCADDR to DESTADDR. Result undefined
+ if the source overlaps with the destination.
+ Return DESTADDR. */
+
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+char *
+memcpy (destaddr, srcaddr, len)
+ char *destaddr;
+ const char *srcaddr;
+ int len;
+{
+ char *dest = destaddr;
+
+ while (len-- > 0)
+ *destaddr++ = *srcaddr++;
+ return dest;
+}
diff --git a/gsl-1.9/utils/memmove.c b/gsl-1.9/utils/memmove.c
new file mode 100644
index 0000000..c374698
--- /dev/null
+++ b/gsl-1.9/utils/memmove.c
@@ -0,0 +1,24 @@
+/* memmove.c -- copy memory.
+ Copy LENGTH bytes from SOURCE to DEST. Does not null-terminate.
+ In the public domain.
+ By David MacKenzie <djm@gnu.ai.mit.edu>. */
+
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+void
+memmove (dest, source, length)
+ char *dest;
+ const char *source;
+ unsigned length;
+{
+ if (source < dest)
+ /* Moving from low mem to hi mem; start at end. */
+ for (source += length, dest += length; length; --length)
+ *--dest = *--source;
+ else if (source != dest)
+ /* Moving from hi mem to low mem; start at beginning. */
+ for (; length; --length)
+ *dest++ = *source++;
+}
diff --git a/gsl-1.9/utils/placeholder.c b/gsl-1.9/utils/placeholder.c
new file mode 100644
index 0000000..e96ec1a
--- /dev/null
+++ b/gsl-1.9/utils/placeholder.c
@@ -0,0 +1,9 @@
+void
+gsl_utils_placeholder (void);
+
+void
+gsl_utils_placeholder (void)
+{
+ int i = 0;
+ i++ ;
+}
diff --git a/gsl-1.9/utils/strdup.c b/gsl-1.9/utils/strdup.c
new file mode 100644
index 0000000..bd36a32
--- /dev/null
+++ b/gsl-1.9/utils/strdup.c
@@ -0,0 +1,43 @@
+/* strdup.c -- return a newly allocated copy of a string
+ Copyright (C) 1990 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef STDC_HEADERS
+#include <string.h>
+#include <stdlib.h>
+#else
+char *malloc ();
+char *strcpy ();
+#endif
+
+/* Return a newly allocated copy of STR,
+ or 0 if out of memory. */
+
+char *
+strdup (str)
+ const char *str;
+{
+ char *newstr;
+
+ newstr = (char *) malloc (strlen (str) + 1);
+ if (newstr)
+ strcpy (newstr, str);
+ return newstr;
+}
diff --git a/gsl-1.9/utils/strtol.c b/gsl-1.9/utils/strtol.c
new file mode 100644
index 0000000..731846f
--- /dev/null
+++ b/gsl-1.9/utils/strtol.c
@@ -0,0 +1,162 @@
+/* Copyright (C) 1991, 1992, 1994 Free Software Foundation, Inc.
+
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02110-1301, USA. */
+
+#include <ctype.h>
+#include <limits.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#ifndef UNSIGNED
+#define UNSIGNED 0
+#endif
+
+/* Convert NPTR to an `unsigned long int' or `long int' in base BASE.
+ If BASE is 0 the base is determined by the presence of a leading
+ zero, indicating octal or a leading "0x" or "0X", indicating hexadecimal.
+ If BASE is < 2 or > 36, it is reset to 10.
+ If ENDPTR is not NULL, a pointer to the character after the last
+ one converted is stored in *ENDPTR. */
+#if UNSIGNED
+unsigned long int
+#define strtol strtoul
+#else
+long int
+#endif
+strtol (nptr, endptr, base)
+ const char *nptr;
+ char **endptr;
+ int base;
+{
+ int negative;
+ register unsigned long int cutoff;
+ register unsigned int cutlim;
+ register unsigned long int i;
+ register const char *s;
+ register unsigned char c;
+ const char *save;
+ int overflow;
+
+ if (base < 0 || base == 1 || base > 36)
+ base = 10;
+
+ s = nptr;
+
+ /* Skip white space. */
+ while (isspace (*s))
+ ++s;
+ if (*s == '\0')
+ goto noconv;
+
+ /* Check for a sign. */
+ if (*s == '-')
+ {
+ negative = 1;
+ ++s;
+ }
+ else if (*s == '+')
+ {
+ negative = 0;
+ ++s;
+ }
+ else
+ negative = 0;
+
+ if (base == 16 && s[0] == '0' && toupper (s[1]) == 'X')
+ s += 2;
+
+ /* If BASE is zero, figure it out ourselves. */
+ if (base == 0)
+ if (*s == '0')
+ {
+ if (toupper (s[1]) == 'X')
+ {
+ s += 2;
+ base = 16;
+ }
+ else
+ base = 8;
+ }
+ else
+ base = 10;
+
+ /* Save the pointer so we can check later if anything happened. */
+ save = s;
+
+ cutoff = ULONG_MAX / (unsigned long int) base;
+ cutlim = ULONG_MAX % (unsigned long int) base;
+
+ overflow = 0;
+ i = 0;
+ for (c = *s; c != '\0'; c = *++s)
+ {
+ if (isdigit (c))
+ c -= '0';
+ else if (isalpha (c))
+ c = toupper (c) - 'A' + 10;
+ else
+ break;
+ if (c >= base)
+ break;
+ /* Check for overflow. */
+ if (i > cutoff || (i == cutoff && c > cutlim))
+ overflow = 1;
+ else
+ {
+ i *= (unsigned long int) base;
+ i += c;
+ }
+ }
+
+ /* Check if anything actually happened. */
+ if (s == save)
+ goto noconv;
+
+ /* Store in ENDPTR the address of one character
+ past the last character we converted. */
+ if (endptr != NULL)
+ *endptr = (char *) s;
+
+#if !UNSIGNED
+ /* Check for a value that is within the range of
+ `unsigned long int', but outside the range of `long int'. */
+ if (i > (negative ?
+ -(unsigned long int) LONG_MIN : (unsigned long int) LONG_MAX))
+ overflow = 1;
+#endif
+
+ if (overflow)
+ {
+ errno = ERANGE;
+#if UNSIGNED
+ return ULONG_MAX;
+#else
+ return negative ? LONG_MIN : LONG_MAX;
+#endif
+ }
+
+ /* Return the result of the appropriate sign. */
+ return (negative ? -i : i);
+
+noconv:
+ /* There was no number to convert. */
+ if (endptr != NULL)
+ *endptr = (char *) nptr;
+ return 0L;
+}
diff --git a/gsl-1.9/utils/strtoul.c b/gsl-1.9/utils/strtoul.c
new file mode 100644
index 0000000..334bf8d
--- /dev/null
+++ b/gsl-1.9/utils/strtoul.c
@@ -0,0 +1,21 @@
+/* Copyright (C) 1991 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02110-1301, USA. */
+
+#define UNSIGNED 1
+
+#include <strtol.c>
diff --git a/gsl-1.9/utils/system.h b/gsl-1.9/utils/system.h
new file mode 100644
index 0000000..507e1e3
--- /dev/null
+++ b/gsl-1.9/utils/system.h
@@ -0,0 +1,102 @@
+/* system.h: System-dependent declarations. Include this first.
+ $Id$
+
+ Copyright (C) 1997 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifndef TEXINFO_SYSTEM_H
+#define TEXINFO_SYSTEM_H
+
+#define _GNU_SOURCE
+
+#include <config.h>
+
+/* <unistd.h> should be included before any preprocessor test
+ of _POSIX_VERSION. */
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <ctype.h>
+
+#if HAVE_LOCALE_H
+#include <locale.h>
+#endif
+#include <libintl.h>
+
+/* Don't use bcopy! Use memmove if source and destination may overlap,
+ memcpy otherwise. */
+#if HAVE_STRING_H
+# if !STDC_HEADERS && HAVE_MEMORY_H
+# include <memory.h>
+# endif
+# include <string.h>
+#else
+# include <strings.h>
+char *memchr ();
+#endif
+
+#ifdef STDC_HEADERS
+#define getopt system_getopt
+#include <stdlib.h>
+#undef getopt
+#else
+extern char *getenv ();
+#endif
+
+#ifndef HAVE_STRERROR
+extern char *strerror ();
+#endif
+
+#include <errno.h>
+#ifndef errno
+extern int errno;
+#endif
+#ifdef VMS
+#include <perror.h>
+#endif
+
+#include <sys/stat.h>
+
+#if HAVE_SYS_FILE_H
+#include <sys/file.h>
+#endif /* HAVE_SYS_FILE_H */
+
+#ifndef O_RDONLY
+/* Since <fcntl.h> is POSIX, prefer that to <sys/fcntl.h>.
+ This also avoids some useless warnings on (at least) Linux. */
+#if HAVE_FCNTL_H
+#include <fcntl.h>
+#else /* not HAVE_FCNTL_H */
+#if HAVE_SYS_FCNTL_H
+#include <sys/fcntl.h>
+#endif /* not HAVE_SYS_FCNTL_H */
+#endif /* not HAVE_FCNTL_H */
+#endif /* not O_RDONLY */
+
+#if HAVE_PWD_H
+#include <pwd.h>
+#endif
+/* Some systems don't declare this function in pwd.h. */
+struct passwd *getpwnam ();
+
+/* Our library routines not included in any system library. */
+extern void *xmalloc (), *xrealloc ();
+extern char *xstrdup ();
+
+#endif /* TEXINFO_SYSTEM_H */
diff --git a/gsl-1.9/vector/ChangeLog b/gsl-1.9/vector/ChangeLog
new file mode 100644
index 0000000..f445ece
--- /dev/null
+++ b/gsl-1.9/vector/ChangeLog
@@ -0,0 +1,204 @@
+2007-02-17 Brian Gough <bjg@network-theory.co.uk>
+
+ * test_source.c (FUNCTION): avoid running tests on char, because
+ it can be unsigned
+
+2007-01-26 Brian Gough <bjg@network-theory.co.uk>
+
+ * minmax_source.c: added support for NaNs
+
+2006-10-31 Brian Gough <bjg@network-theory.co.uk>
+
+ * prop_source.c: added functions gsl_vector_ispos,
+ gsl_vector_isneg
+
+2004-09-13 Brian Gough <bjg@network-theory.co.uk>
+
+ * swap_source.c (gsl_vector_swap): fixed bug where stride of
+ first argument v was used for second argument w
+
+ * test.c: improved test coverage
+
+2003-01-01 Brian Gough <brian.gough@network-theory.co.uk>
+
+ * gsl_vector_complex_float.h (gsl_vector_complex_float_get):
+ removed const from zero
+
+ * vector_source.c (FUNCTION): removed const from zero
+
+Sun Jan 27 22:29:54 2002 Brian Gough <bjg@network-theory.co.uk>
+
+ * test.c: ensure that range check is working when running the
+ tests
+
+Fri Sep 14 19:13:20 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * view.c (USE_QUALIFIER): added missing qualified types
+
+Thu Aug 23 13:22:29 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_vector_complex_float.h: added const to second argument of
+ _ptr functions
+
+ * gsl_vector.h: changed definition of gsl_vector_const_view to
+ compile with Sun's cc
+
+Fri Aug 3 14:11:51 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * added gsl_vector_ptr and gsl_vector_const_ptr functions
+
+Mon Jul 16 21:28:37 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * reim_source.c: initialized views to null
+
+Fri Jul 13 21:29:06 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * changed views to be structs and used casts to initialize them
+
+Mon Jul 2 12:34:43 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * view.h: provide macros for initializing null vectors and views
+
+Sun Jul 1 22:38:30 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * introduction of new-style vector views
+
+ * view_source.c: changed order of arguments to be consistent with
+ rest of library for _with_stride functions
+
+Mon May 14 22:43:18 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * vector_source.c (FUNCTION): removed unnecessary inline from
+ static function definition
+
+Tue Mar 27 15:12:07 2001 Brian Gough <bjg@network-theory.co.uk>
+
+ * view_source.c: split view functions into a separate file
+
+Sat Sep 9 16:45:15 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * added an owner field for indicating whether the underlying
+ memory is owned by the vector. Changed the meaning of the block
+ field to always be the address of the underlying block, even for
+ subviews (previously the block field was set to NULL in this
+ case).
+
+Sun Jul 16 10:39:39 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * init_source.c (FUNCTION): added gsl_vector_view function for
+ creating a vector view of an ordinary C array
+
+Sat Jul 15 21:44:49 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * changed GSL_EDOM to GSL_EINVAL for invalid vector size arguments
+
+Sat Jun 17 15:37:57 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * fixed up missing MULTIPLICITY factors in various functions
+
+Sun May 28 12:25:31 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * test_complex_source.c (FUNCTION): use binary mode "b" when
+ reading and writing binary files
+
+ * test_source.c (FUNCTION): use binary mode "b" when reading and
+ writing binary files
+
+Fri May 5 10:57:16 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * oper_source.c (FUNCTION): changed functions
+ gsl_vector_mul_elements and gsl_vector_div_elements to
+ gsl_vector_mul and gsl_vector_div since the _elements suffix is
+ redundant for vectors (unlike matrices).
+
+ * oper.c: added simple arithmetic operations (+,-,*,/,scale,+const)
+
+Wed Apr 26 14:17:14 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * prop_source.c (FUNCTION): added const to argument of
+ gsl_vector_isnull
+
+ * init_source.c (FUNCTION): added gsl_vector_set_basis(v,i) to set
+ v to basis vector v = e_i (0,0,...,1,...,0)
+
+Tue Apr 25 11:31:38 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * test_source.c (FUNCTION): modified the tests so that they work
+ more cleanly with checkergcc when using long doubles. The trick
+ seems to be to avoid having any long doubles on the stack.
+
+Sat Apr 22 15:09:44 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * init_source.c (FUNCTION): separated subvector functions into
+ gsl_vector_subvector and gsl_vector_subvector_with_stride
+
+Sat Mar 25 20:23:58 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * swap_source.c (FUNCTION): renames gsl_vector_swap to
+ gsl_vector_swap_elements
+
+Tue Mar 21 21:15:10 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * vector_source.c (FUNCTION): added set_zero function
+
+Thu Feb 24 16:19:55 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * added missing prototypes for gsl_vector_complex_..._reverse
+
+Fri Feb 18 20:48:32 2000 Brian Gough <bjg@network-theory.co.uk>
+
+ * swap_source.c (FUNCTION): added gsl_vector_reverse function for
+ flipping the order of a vector
+
+ * copy_source.c: renamed gsl_vector_copy to gsl_vector_cpy
+ since it acts like memcpy (dest, src) not 'cp(copy) from to'
+
+Thu Dec 2 20:39:02 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * init_source.c: fixed bug, block element needs to be null in
+ gsl_vector_alloc_from_vector to maintain correct ownership,
+ added gsl_vector_view_from_vector (Thanks to Fabrice Rossi)
+
+Tue Oct 19 14:13:14 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * added gsl_vector_swap function to exchange elements
+
+Fri Oct 1 15:47:45 1999 Brian Gough <bjg@network-theory.co.uk>
+
+ * removed support for gsl_vector_ptr. Use set/get instead.
+
+ * now uses separate block directory for memory management
+
+Mon Mar 1 19:38:16 1999 Brian Gough <bjg@netsci.freeserve.co.uk>
+
+ * test_source.c: added tests for gsl_vector_ptr with and without
+ stride
+
+ * gsl_vector_char.h: added missing code to gsl_vector_char_ptr for
+ stride in char case.
+
+
+Sun Nov 8 18:39:40 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * test_io.c, test_complex_io.c: split out the printf/scanf
+ routines since these aren't supported on all platforms
+ for long double
+
+Fri Jul 24 19:44:52 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * added parent pointer in structs, to determine whether or not
+ we're allowed to free the memory pointed to by * data.
+
+Wed Jun 10 19:13:35 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * init_source.c: added a cast for each malloc
+
+Sun Apr 26 14:10:06 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * added support for complex vectors
+
+Mon Apr 6 15:06:38 1998 Brian Gough <bjg@vvv.lanl.gov>
+
+ * make range checking the default, you have to define
+ GSL_RANGE_CHECK_OFF to turn it off
+
diff --git a/gsl-1.9/vector/Makefile.am b/gsl-1.9/vector/Makefile.am
new file mode 100644
index 0000000..3531001
--- /dev/null
+++ b/gsl-1.9/vector/Makefile.am
@@ -0,0 +1,21 @@
+noinst_LTLIBRARIES = libgslvector.la
+
+check_PROGRAMS = test test_static
+
+pkginclude_HEADERS = gsl_vector.h gsl_vector_char.h gsl_vector_complex.h gsl_vector_complex_double.h gsl_vector_complex_float.h gsl_vector_complex_long_double.h gsl_vector_double.h gsl_vector_float.h gsl_vector_int.h gsl_vector_long.h gsl_vector_long_double.h gsl_vector_short.h gsl_vector_uchar.h gsl_vector_uint.h gsl_vector_ulong.h gsl_vector_ushort.h
+
+INCLUDES= -I$(top_builddir) -I$(top_srcdir)
+
+TESTS = $(check_PROGRAMS)
+
+test_LDADD = libgslvector.la ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+test_static_LDADD = libgslvector.la ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+
+test_SOURCES = test.c
+test_static_SOURCES = test_static.c
+
+CLEANFILES = test.txt test.dat
+
+noinst_HEADERS = vector_source.c init_source.c file_source.c copy_source.c swap_source.c prop_source.c test_complex_source.c test_source.c minmax_source.c oper_source.c reim_source.c subvector_source.c view_source.c
+
+libgslvector_la_SOURCES = init.c file.c vector.c copy.c swap.c prop.c minmax.c oper.c reim.c subvector.c view.c view.h
diff --git a/gsl-1.9/vector/Makefile.in b/gsl-1.9/vector/Makefile.in
new file mode 100644
index 0000000..d1837a4
--- /dev/null
+++ b/gsl-1.9/vector/Makefile.in
@@ -0,0 +1,559 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = test$(EXEEXT) test_static$(EXEEXT)
+subdir = vector
+DIST_COMMON = $(noinst_HEADERS) $(pkginclude_HEADERS) \
+ $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog TODO
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgslvector_la_LIBADD =
+am_libgslvector_la_OBJECTS = init.lo file.lo vector.lo copy.lo swap.lo \
+ prop.lo minmax.lo oper.lo reim.lo subvector.lo view.lo
+libgslvector_la_OBJECTS = $(am_libgslvector_la_OBJECTS)
+am_test_OBJECTS = test.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = libgslvector.la ../block/libgslblock.la \
+ ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la \
+ ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+am_test_static_OBJECTS = test_static.$(OBJEXT)
+test_static_OBJECTS = $(am_test_static_OBJECTS)
+test_static_DEPENDENCIES = libgslvector.la ../block/libgslblock.la \
+ ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la \
+ ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgslvector_la_SOURCES) $(test_SOURCES) \
+ $(test_static_SOURCES)
+DIST_SOURCES = $(libgslvector_la_SOURCES) $(test_SOURCES) \
+ $(test_static_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libgslvector.la
+pkginclude_HEADERS = gsl_vector.h gsl_vector_char.h gsl_vector_complex.h gsl_vector_complex_double.h gsl_vector_complex_float.h gsl_vector_complex_long_double.h gsl_vector_double.h gsl_vector_float.h gsl_vector_int.h gsl_vector_long.h gsl_vector_long_double.h gsl_vector_short.h gsl_vector_uchar.h gsl_vector_uint.h gsl_vector_ulong.h gsl_vector_ushort.h
+INCLUDES = -I$(top_builddir) -I$(top_srcdir)
+TESTS = $(check_PROGRAMS)
+test_LDADD = libgslvector.la ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+test_static_LDADD = libgslvector.la ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+test_SOURCES = test.c
+test_static_SOURCES = test_static.c
+CLEANFILES = test.txt test.dat
+noinst_HEADERS = vector_source.c init_source.c file_source.c copy_source.c swap_source.c prop_source.c test_complex_source.c test_source.c minmax_source.c oper_source.c reim_source.c subvector_source.c view_source.c
+libgslvector_la_SOURCES = init.c file.c vector.c copy.c swap.c prop.c minmax.c oper.c reim.c subvector.c view.c view.h
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps vector/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps vector/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgslvector.la: $(libgslvector_la_OBJECTS) $(libgslvector_la_DEPENDENCIES)
+ $(LINK) $(libgslvector_la_LDFLAGS) $(libgslvector_la_OBJECTS) $(libgslvector_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+test_static$(EXEEXT): $(test_static_OBJECTS) $(test_static_DEPENDENCIES)
+ @rm -f test_static$(EXEEXT)
+ $(LINK) $(test_static_LDFLAGS) $(test_static_OBJECTS) $(test_static_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkgincludeHEADERS
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/vector/TODO b/gsl-1.9/vector/TODO
new file mode 100644
index 0000000..94cb054
--- /dev/null
+++ b/gsl-1.9/vector/TODO
@@ -0,0 +1,3 @@
+* Pretty print function
+
+* Vector p-norms
diff --git a/gsl-1.9/vector/copy.c b/gsl-1.9/vector/copy.c
new file mode 100644
index 0000000..1b42916
--- /dev/null
+++ b/gsl-1.9/vector/copy.c
@@ -0,0 +1,87 @@
+#include <config.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_errno.h>
+
+#define BASE_GSL_COMPLEX_LONG
+#include "templates_on.h"
+#include "copy_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_LONG
+
+#define BASE_GSL_COMPLEX
+#include "templates_on.h"
+#include "copy_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX
+
+#define BASE_GSL_COMPLEX_FLOAT
+#include "templates_on.h"
+#include "copy_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_FLOAT
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "copy_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "copy_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "copy_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "copy_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "copy_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "copy_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "copy_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "copy_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "copy_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "copy_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "copy_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
diff --git a/gsl-1.9/vector/copy_source.c b/gsl-1.9/vector/copy_source.c
new file mode 100644
index 0000000..2bfd425
--- /dev/null
+++ b/gsl-1.9/vector/copy_source.c
@@ -0,0 +1,51 @@
+/* vector/copy_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+int
+FUNCTION (gsl_vector, memcpy) (TYPE (gsl_vector) * dest,
+ const TYPE (gsl_vector) * src)
+{
+ const size_t src_size = src->size;
+ const size_t dest_size = dest->size;
+
+ if (src_size != dest_size)
+ {
+ GSL_ERROR ("vector lengths are not equal", GSL_EBADLEN);
+ }
+
+ {
+ const size_t src_stride = src->stride ;
+ const size_t dest_stride = dest->stride ;
+ size_t j;
+
+ for (j = 0; j < src_size; j++)
+ {
+ size_t k;
+
+ for (k = 0; k < MULTIPLICITY; k++)
+ {
+ dest->data[MULTIPLICITY * dest_stride * j + k]
+ = src->data[MULTIPLICITY * src_stride * j + k];
+ }
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
diff --git a/gsl-1.9/vector/file.c b/gsl-1.9/vector/file.c
new file mode 100644
index 0000000..d7b8872
--- /dev/null
+++ b/gsl-1.9/vector/file.c
@@ -0,0 +1,89 @@
+#include <config.h>
+#include <stdio.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_block.h>
+#include <gsl/gsl_vector.h>
+
+#define BASE_GSL_COMPLEX_LONG
+#include "templates_on.h"
+#include "file_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_LONG
+
+#define BASE_GSL_COMPLEX
+#include "templates_on.h"
+#include "file_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX
+
+#define BASE_GSL_COMPLEX_FLOAT
+#include "templates_on.h"
+#include "file_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_FLOAT
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "file_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "file_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "file_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "file_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "file_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "file_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "file_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "file_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "file_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "file_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "file_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
diff --git a/gsl-1.9/vector/file_source.c b/gsl-1.9/vector/file_source.c
new file mode 100644
index 0000000..c845b7d
--- /dev/null
+++ b/gsl-1.9/vector/file_source.c
@@ -0,0 +1,63 @@
+/* vector/file_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+int
+FUNCTION (gsl_vector, fread) (FILE * stream, TYPE (gsl_vector) * v)
+{
+ int status = FUNCTION (gsl_block, raw_fread) (stream,
+ v->data,
+ v->size,
+ v->stride);
+ return status;
+}
+
+int
+FUNCTION (gsl_vector, fwrite) (FILE * stream, const TYPE (gsl_vector) * v)
+{
+ int status = FUNCTION (gsl_block, raw_fwrite) (stream,
+ v->data,
+ v->size,
+ v->stride);
+ return status;
+}
+
+#if !(USES_LONGDOUBLE && !HAVE_PRINTF_LONGDOUBLE)
+int
+FUNCTION (gsl_vector, fprintf) (FILE * stream, const TYPE (gsl_vector) * v,
+ const char *format)
+{
+ int status = FUNCTION (gsl_block, raw_fprintf) (stream,
+ v->data,
+ v->size,
+ v->stride,
+ format);
+ return status;
+}
+
+int
+FUNCTION (gsl_vector, fscanf) (FILE * stream, TYPE (gsl_vector) * v)
+{
+ int status = FUNCTION (gsl_block, raw_fscanf) (stream,
+ v->data,
+ v->size,
+ v->stride);
+ return status;
+}
+#endif
+
diff --git a/gsl-1.9/vector/gsl_vector.h b/gsl-1.9/vector/gsl_vector.h
new file mode 100644
index 0000000..cf762e4
--- /dev/null
+++ b/gsl-1.9/vector/gsl_vector.h
@@ -0,0 +1,25 @@
+#ifndef __GSL_VECTOR_H__
+#define __GSL_VECTOR_H__
+
+#include <gsl/gsl_vector_complex_long_double.h>
+#include <gsl/gsl_vector_complex_double.h>
+#include <gsl/gsl_vector_complex_float.h>
+
+#include <gsl/gsl_vector_long_double.h>
+#include <gsl/gsl_vector_double.h>
+#include <gsl/gsl_vector_float.h>
+
+#include <gsl/gsl_vector_ulong.h>
+#include <gsl/gsl_vector_long.h>
+
+#include <gsl/gsl_vector_uint.h>
+#include <gsl/gsl_vector_int.h>
+
+#include <gsl/gsl_vector_ushort.h>
+#include <gsl/gsl_vector_short.h>
+
+#include <gsl/gsl_vector_uchar.h>
+#include <gsl/gsl_vector_char.h>
+
+
+#endif /* __GSL_VECTOR_H__ */
diff --git a/gsl-1.9/vector/gsl_vector_char.h b/gsl-1.9/vector/gsl_vector_char.h
new file mode 100644
index 0000000..22debdd
--- /dev/null
+++ b/gsl-1.9/vector/gsl_vector_char.h
@@ -0,0 +1,228 @@
+/* vector/gsl_vector_char.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_VECTOR_CHAR_H__
+#define __GSL_VECTOR_CHAR_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_types.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_check_range.h>
+#include <gsl/gsl_block_char.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+typedef struct
+{
+ size_t size;
+ size_t stride;
+ char *data;
+ gsl_block_char *block;
+ int owner;
+}
+gsl_vector_char;
+
+typedef struct
+{
+ gsl_vector_char vector;
+} _gsl_vector_char_view;
+
+typedef _gsl_vector_char_view gsl_vector_char_view;
+
+typedef struct
+{
+ gsl_vector_char vector;
+} _gsl_vector_char_const_view;
+
+typedef const _gsl_vector_char_const_view gsl_vector_char_const_view;
+
+
+/* Allocation */
+
+gsl_vector_char *gsl_vector_char_alloc (const size_t n);
+gsl_vector_char *gsl_vector_char_calloc (const size_t n);
+
+gsl_vector_char *gsl_vector_char_alloc_from_block (gsl_block_char * b,
+ const size_t offset,
+ const size_t n,
+ const size_t stride);
+
+gsl_vector_char *gsl_vector_char_alloc_from_vector (gsl_vector_char * v,
+ const size_t offset,
+ const size_t n,
+ const size_t stride);
+
+void gsl_vector_char_free (gsl_vector_char * v);
+
+/* Views */
+
+_gsl_vector_char_view
+gsl_vector_char_view_array (char *v, size_t n);
+
+_gsl_vector_char_view
+gsl_vector_char_view_array_with_stride (char *base,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_char_const_view
+gsl_vector_char_const_view_array (const char *v, size_t n);
+
+_gsl_vector_char_const_view
+gsl_vector_char_const_view_array_with_stride (const char *base,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_char_view
+gsl_vector_char_subvector (gsl_vector_char *v,
+ size_t i,
+ size_t n);
+
+_gsl_vector_char_view
+gsl_vector_char_subvector_with_stride (gsl_vector_char *v,
+ size_t i,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_char_const_view
+gsl_vector_char_const_subvector (const gsl_vector_char *v,
+ size_t i,
+ size_t n);
+
+_gsl_vector_char_const_view
+gsl_vector_char_const_subvector_with_stride (const gsl_vector_char *v,
+ size_t i,
+ size_t stride,
+ size_t n);
+
+/* Operations */
+
+char gsl_vector_char_get (const gsl_vector_char * v, const size_t i);
+void gsl_vector_char_set (gsl_vector_char * v, const size_t i, char x);
+
+char *gsl_vector_char_ptr (gsl_vector_char * v, const size_t i);
+const char *gsl_vector_char_const_ptr (const gsl_vector_char * v, const size_t i);
+
+void gsl_vector_char_set_zero (gsl_vector_char * v);
+void gsl_vector_char_set_all (gsl_vector_char * v, char x);
+int gsl_vector_char_set_basis (gsl_vector_char * v, size_t i);
+
+int gsl_vector_char_fread (FILE * stream, gsl_vector_char * v);
+int gsl_vector_char_fwrite (FILE * stream, const gsl_vector_char * v);
+int gsl_vector_char_fscanf (FILE * stream, gsl_vector_char * v);
+int gsl_vector_char_fprintf (FILE * stream, const gsl_vector_char * v,
+ const char *format);
+
+int gsl_vector_char_memcpy (gsl_vector_char * dest, const gsl_vector_char * src);
+
+int gsl_vector_char_reverse (gsl_vector_char * v);
+
+int gsl_vector_char_swap (gsl_vector_char * v, gsl_vector_char * w);
+int gsl_vector_char_swap_elements (gsl_vector_char * v, const size_t i, const size_t j);
+
+char gsl_vector_char_max (const gsl_vector_char * v);
+char gsl_vector_char_min (const gsl_vector_char * v);
+void gsl_vector_char_minmax (const gsl_vector_char * v, char * min_out, char * max_out);
+
+size_t gsl_vector_char_max_index (const gsl_vector_char * v);
+size_t gsl_vector_char_min_index (const gsl_vector_char * v);
+void gsl_vector_char_minmax_index (const gsl_vector_char * v, size_t * imin, size_t * imax);
+
+int gsl_vector_char_add (gsl_vector_char * a, const gsl_vector_char * b);
+int gsl_vector_char_sub (gsl_vector_char * a, const gsl_vector_char * b);
+int gsl_vector_char_mul (gsl_vector_char * a, const gsl_vector_char * b);
+int gsl_vector_char_div (gsl_vector_char * a, const gsl_vector_char * b);
+int gsl_vector_char_scale (gsl_vector_char * a, const double x);
+int gsl_vector_char_add_constant (gsl_vector_char * a, const double x);
+
+int gsl_vector_char_isnull (const gsl_vector_char * v);
+int gsl_vector_char_ispos (const gsl_vector_char * v);
+int gsl_vector_char_isneg (const gsl_vector_char * v);
+
+#ifdef HAVE_INLINE
+
+extern inline
+char
+gsl_vector_char_get (const gsl_vector_char * v, const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_VAL ("index out of range", GSL_EINVAL, 0);
+ }
+#endif
+ return v->data[i * v->stride];
+}
+
+extern inline
+void
+gsl_vector_char_set (gsl_vector_char * v, const size_t i, char x)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_VOID ("index out of range", GSL_EINVAL);
+ }
+#endif
+ v->data[i * v->stride] = x;
+}
+
+extern inline
+char *
+gsl_vector_char_ptr (gsl_vector_char * v, const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_NULL ("index out of range", GSL_EINVAL);
+ }
+#endif
+ return (char *) (v->data + i * v->stride);
+}
+
+extern inline
+const char *
+gsl_vector_char_const_ptr (const gsl_vector_char * v, const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_NULL ("index out of range", GSL_EINVAL);
+ }
+#endif
+ return (const char *) (v->data + i * v->stride);
+}
+
+
+#endif /* HAVE_INLINE */
+
+__END_DECLS
+
+#endif /* __GSL_VECTOR_CHAR_H__ */
+
+
diff --git a/gsl-1.9/vector/gsl_vector_complex.h b/gsl-1.9/vector/gsl_vector_complex.h
new file mode 100644
index 0000000..2767615
--- /dev/null
+++ b/gsl-1.9/vector/gsl_vector_complex.h
@@ -0,0 +1,17 @@
+#ifndef __GSL_VECTOR_COMPLEX_H__
+#define __GSL_VECTOR_COMPLEX_H__
+
+#define GSL_VECTOR_REAL(z, i) ((z)->data[2*(i)*(z)->stride])
+#define GSL_VECTOR_IMAG(z, i) ((z)->data[2*(i)*(z)->stride + 1])
+
+#if GSL_RANGE_CHECK
+#define GSL_VECTOR_COMPLEX(zv, i) (((i) >= (zv)->size ? (gsl_error ("index out of range", __FILE__, __LINE__, GSL_EINVAL), 0):0 , *GSL_COMPLEX_AT((zv),(i))))
+#else
+#define GSL_VECTOR_COMPLEX(zv, i) (GSL_COMPLEX_AT((zv),(i)))
+#endif
+
+#define GSL_COMPLEX_AT(zv,i) ((gsl_complex*)&((zv)->data[2*(i)*(zv)->stride]))
+#define GSL_COMPLEX_FLOAT_AT(zv,i) ((gsl_complex_float*)&((zv)->data[2*(i)*(zv)->stride]))
+#define GSL_COMPLEX_LONG_DOUBLE_AT(zv,i) ((gsl_complex_long_double*)&((zv)->data[2*(i)*(zv)->stride]))
+
+#endif /* __GSL_VECTOR_COMPLEX_H__ */
diff --git a/gsl-1.9/vector/gsl_vector_complex_double.h b/gsl-1.9/vector/gsl_vector_complex_double.h
new file mode 100644
index 0000000..ec7cf73
--- /dev/null
+++ b/gsl-1.9/vector/gsl_vector_complex_double.h
@@ -0,0 +1,247 @@
+/* vector/gsl_vector_complex_double.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_VECTOR_COMPLEX_DOUBLE_H__
+#define __GSL_VECTOR_COMPLEX_DOUBLE_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_types.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_complex.h>
+#include <gsl/gsl_check_range.h>
+#include <gsl/gsl_vector_double.h>
+#include <gsl/gsl_vector_complex.h>
+#include <gsl/gsl_block_complex_double.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+typedef struct
+{
+ size_t size;
+ size_t stride;
+ double *data;
+ gsl_block_complex *block;
+ int owner;
+} gsl_vector_complex;
+
+typedef struct
+{
+ gsl_vector_complex vector;
+} _gsl_vector_complex_view;
+
+typedef _gsl_vector_complex_view gsl_vector_complex_view;
+
+typedef struct
+{
+ gsl_vector_complex vector;
+} _gsl_vector_complex_const_view;
+
+typedef const _gsl_vector_complex_const_view gsl_vector_complex_const_view;
+
+/* Allocation */
+
+gsl_vector_complex *gsl_vector_complex_alloc (const size_t n);
+gsl_vector_complex *gsl_vector_complex_calloc (const size_t n);
+
+gsl_vector_complex *
+gsl_vector_complex_alloc_from_block (gsl_block_complex * b,
+ const size_t offset,
+ const size_t n,
+ const size_t stride);
+
+gsl_vector_complex *
+gsl_vector_complex_alloc_from_vector (gsl_vector_complex * v,
+ const size_t offset,
+ const size_t n,
+ const size_t stride);
+
+void gsl_vector_complex_free (gsl_vector_complex * v);
+
+/* Views */
+
+_gsl_vector_complex_view
+gsl_vector_complex_view_array (double *base,
+ size_t n);
+
+_gsl_vector_complex_view
+gsl_vector_complex_view_array_with_stride (double *base,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_complex_const_view
+gsl_vector_complex_const_view_array (const double *base,
+ size_t n);
+
+_gsl_vector_complex_const_view
+gsl_vector_complex_const_view_array_with_stride (const double *base,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_complex_view
+gsl_vector_complex_subvector (gsl_vector_complex *base,
+ size_t i,
+ size_t n);
+
+
+_gsl_vector_complex_view
+gsl_vector_complex_subvector_with_stride (gsl_vector_complex *v,
+ size_t i,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_complex_const_view
+gsl_vector_complex_const_subvector (const gsl_vector_complex *base,
+ size_t i,
+ size_t n);
+
+
+_gsl_vector_complex_const_view
+gsl_vector_complex_const_subvector_with_stride (const gsl_vector_complex *v,
+ size_t i,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_view
+gsl_vector_complex_real (gsl_vector_complex *v);
+
+_gsl_vector_view
+gsl_vector_complex_imag (gsl_vector_complex *v);
+
+_gsl_vector_const_view
+gsl_vector_complex_const_real (const gsl_vector_complex *v);
+
+_gsl_vector_const_view
+gsl_vector_complex_const_imag (const gsl_vector_complex *v);
+
+
+/* Operations */
+
+gsl_complex
+gsl_vector_complex_get (const gsl_vector_complex * v, const size_t i);
+
+void gsl_vector_complex_set (gsl_vector_complex * v, const size_t i,
+ gsl_complex z);
+
+gsl_complex
+*gsl_vector_complex_ptr (gsl_vector_complex * v, const size_t i);
+
+const gsl_complex
+*gsl_vector_complex_const_ptr (const gsl_vector_complex * v, const size_t i);
+
+void gsl_vector_complex_set_zero (gsl_vector_complex * v);
+void gsl_vector_complex_set_all (gsl_vector_complex * v,
+ gsl_complex z);
+int gsl_vector_complex_set_basis (gsl_vector_complex * v, size_t i);
+
+int gsl_vector_complex_fread (FILE * stream,
+ gsl_vector_complex * v);
+int gsl_vector_complex_fwrite (FILE * stream,
+ const gsl_vector_complex * v);
+int gsl_vector_complex_fscanf (FILE * stream,
+ gsl_vector_complex * v);
+int gsl_vector_complex_fprintf (FILE * stream,
+ const gsl_vector_complex * v,
+ const char *format);
+
+int gsl_vector_complex_memcpy (gsl_vector_complex * dest, const gsl_vector_complex * src);
+
+int gsl_vector_complex_reverse (gsl_vector_complex * v);
+
+int gsl_vector_complex_swap (gsl_vector_complex * v, gsl_vector_complex * w);
+int gsl_vector_complex_swap_elements (gsl_vector_complex * v, const size_t i, const size_t j);
+
+int gsl_vector_complex_isnull (const gsl_vector_complex * v);
+int gsl_vector_complex_ispos (const gsl_vector_complex * v);
+int gsl_vector_complex_isneg (const gsl_vector_complex * v);
+
+#ifdef HAVE_INLINE
+
+extern inline
+gsl_complex
+gsl_vector_complex_get (const gsl_vector_complex * v,
+ const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ gsl_complex zero = {{0, 0}};
+ GSL_ERROR_VAL ("index out of range", GSL_EINVAL, zero);
+ }
+#endif
+ return *GSL_COMPLEX_AT (v, i);
+}
+
+extern inline
+void
+gsl_vector_complex_set (gsl_vector_complex * v,
+ const size_t i, gsl_complex z)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_VOID ("index out of range", GSL_EINVAL);
+ }
+#endif
+ *GSL_COMPLEX_AT (v, i) = z;
+}
+
+extern inline
+gsl_complex *
+gsl_vector_complex_ptr (gsl_vector_complex * v,
+ const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_NULL ("index out of range", GSL_EINVAL);
+ }
+#endif
+ return GSL_COMPLEX_AT (v, i);
+}
+
+extern inline
+const gsl_complex *
+gsl_vector_complex_const_ptr (const gsl_vector_complex * v,
+ const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_NULL ("index out of range", GSL_EINVAL);
+ }
+#endif
+ return GSL_COMPLEX_AT (v, i);
+}
+
+
+#endif /* HAVE_INLINE */
+
+__END_DECLS
+
+#endif /* __GSL_VECTOR_COMPLEX_DOUBLE_H__ */
diff --git a/gsl-1.9/vector/gsl_vector_complex_float.h b/gsl-1.9/vector/gsl_vector_complex_float.h
new file mode 100644
index 0000000..0823a23
--- /dev/null
+++ b/gsl-1.9/vector/gsl_vector_complex_float.h
@@ -0,0 +1,247 @@
+/* vector/gsl_vector_complex_float.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_VECTOR_COMPLEX_FLOAT_H__
+#define __GSL_VECTOR_COMPLEX_FLOAT_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_types.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_complex.h>
+#include <gsl/gsl_check_range.h>
+#include <gsl/gsl_vector_float.h>
+#include <gsl/gsl_vector_complex.h>
+#include <gsl/gsl_block_complex_float.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+typedef struct
+{
+ size_t size;
+ size_t stride;
+ float *data;
+ gsl_block_complex_float *block;
+ int owner;
+} gsl_vector_complex_float;
+
+typedef struct
+{
+ gsl_vector_complex_float vector;
+} _gsl_vector_complex_float_view;
+
+typedef _gsl_vector_complex_float_view gsl_vector_complex_float_view;
+
+typedef struct
+{
+ gsl_vector_complex_float vector;
+} _gsl_vector_complex_float_const_view;
+
+typedef const _gsl_vector_complex_float_const_view gsl_vector_complex_float_const_view;
+
+/* Allocation */
+
+gsl_vector_complex_float *gsl_vector_complex_float_alloc (const size_t n);
+gsl_vector_complex_float *gsl_vector_complex_float_calloc (const size_t n);
+
+gsl_vector_complex_float *
+gsl_vector_complex_float_alloc_from_block (gsl_block_complex_float * b,
+ const size_t offset,
+ const size_t n,
+ const size_t stride);
+
+gsl_vector_complex_float *
+gsl_vector_complex_float_alloc_from_vector (gsl_vector_complex_float * v,
+ const size_t offset,
+ const size_t n,
+ const size_t stride);
+
+void gsl_vector_complex_float_free (gsl_vector_complex_float * v);
+
+/* Views */
+
+_gsl_vector_complex_float_view
+gsl_vector_complex_float_view_array (float *base,
+ size_t n);
+
+_gsl_vector_complex_float_view
+gsl_vector_complex_float_view_array_with_stride (float *base,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_complex_float_const_view
+gsl_vector_complex_float_const_view_array (const float *base,
+ size_t n);
+
+_gsl_vector_complex_float_const_view
+gsl_vector_complex_float_const_view_array_with_stride (const float *base,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_complex_float_view
+gsl_vector_complex_float_subvector (gsl_vector_complex_float *base,
+ size_t i,
+ size_t n);
+
+
+_gsl_vector_complex_float_view
+gsl_vector_complex_float_subvector_with_stride (gsl_vector_complex_float *v,
+ size_t i,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_complex_float_const_view
+gsl_vector_complex_float_const_subvector (const gsl_vector_complex_float *base,
+ size_t i,
+ size_t n);
+
+
+_gsl_vector_complex_float_const_view
+gsl_vector_complex_float_const_subvector_with_stride (const gsl_vector_complex_float *v,
+ size_t i,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_float_view
+gsl_vector_complex_float_real (gsl_vector_complex_float *v);
+
+_gsl_vector_float_view
+gsl_vector_complex_float_imag (gsl_vector_complex_float *v);
+
+_gsl_vector_float_const_view
+gsl_vector_complex_float_const_real (const gsl_vector_complex_float *v);
+
+_gsl_vector_float_const_view
+gsl_vector_complex_float_const_imag (const gsl_vector_complex_float *v);
+
+
+/* Operations */
+
+gsl_complex_float
+gsl_vector_complex_float_get (const gsl_vector_complex_float * v, const size_t i);
+
+void gsl_vector_complex_float_set (gsl_vector_complex_float * v, const size_t i,
+ gsl_complex_float z);
+
+gsl_complex_float
+*gsl_vector_complex_float_ptr (gsl_vector_complex_float * v, const size_t i);
+
+const gsl_complex_float
+*gsl_vector_complex_float_const_ptr (const gsl_vector_complex_float * v, const size_t i);
+
+void gsl_vector_complex_float_set_zero (gsl_vector_complex_float * v);
+void gsl_vector_complex_float_set_all (gsl_vector_complex_float * v,
+ gsl_complex_float z);
+int gsl_vector_complex_float_set_basis (gsl_vector_complex_float * v, size_t i);
+
+int gsl_vector_complex_float_fread (FILE * stream,
+ gsl_vector_complex_float * v);
+int gsl_vector_complex_float_fwrite (FILE * stream,
+ const gsl_vector_complex_float * v);
+int gsl_vector_complex_float_fscanf (FILE * stream,
+ gsl_vector_complex_float * v);
+int gsl_vector_complex_float_fprintf (FILE * stream,
+ const gsl_vector_complex_float * v,
+ const char *format);
+
+int gsl_vector_complex_float_memcpy (gsl_vector_complex_float * dest, const gsl_vector_complex_float * src);
+
+int gsl_vector_complex_float_reverse (gsl_vector_complex_float * v);
+
+int gsl_vector_complex_float_swap (gsl_vector_complex_float * v, gsl_vector_complex_float * w);
+int gsl_vector_complex_float_swap_elements (gsl_vector_complex_float * v, const size_t i, const size_t j);
+
+int gsl_vector_complex_float_isnull (const gsl_vector_complex_float * v);
+int gsl_vector_complex_float_ispos (const gsl_vector_complex_float * v);
+int gsl_vector_complex_float_isneg (const gsl_vector_complex_float * v);
+
+#ifdef HAVE_INLINE
+
+extern inline
+gsl_complex_float
+gsl_vector_complex_float_get (const gsl_vector_complex_float * v,
+ const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ gsl_complex_float zero = {{0, 0}};
+ GSL_ERROR_VAL ("index out of range", GSL_EINVAL, zero);
+ }
+#endif
+ return *GSL_COMPLEX_FLOAT_AT (v, i);
+}
+
+extern inline
+void
+gsl_vector_complex_float_set (gsl_vector_complex_float * v,
+ const size_t i, gsl_complex_float z)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_VOID ("index out of range", GSL_EINVAL);
+ }
+#endif
+ *GSL_COMPLEX_FLOAT_AT (v, i) = z;
+}
+
+extern inline
+gsl_complex_float *
+gsl_vector_complex_float_ptr (gsl_vector_complex_float * v,
+ const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_NULL ("index out of range", GSL_EINVAL);
+ }
+#endif
+ return GSL_COMPLEX_FLOAT_AT (v, i);
+}
+
+extern inline
+const gsl_complex_float *
+gsl_vector_complex_float_const_ptr (const gsl_vector_complex_float * v,
+ const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_NULL ("index out of range", GSL_EINVAL);
+ }
+#endif
+ return GSL_COMPLEX_FLOAT_AT (v, i);
+}
+
+
+#endif /* HAVE_INLINE */
+
+__END_DECLS
+
+#endif /* __GSL_VECTOR_COMPLEX_FLOAT_H__ */
diff --git a/gsl-1.9/vector/gsl_vector_complex_long_double.h b/gsl-1.9/vector/gsl_vector_complex_long_double.h
new file mode 100644
index 0000000..77ee9a8
--- /dev/null
+++ b/gsl-1.9/vector/gsl_vector_complex_long_double.h
@@ -0,0 +1,247 @@
+/* vector/gsl_vector_complex_long_double.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_VECTOR_COMPLEX_LONG_DOUBLE_H__
+#define __GSL_VECTOR_COMPLEX_LONG_DOUBLE_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_types.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_complex.h>
+#include <gsl/gsl_check_range.h>
+#include <gsl/gsl_vector_long_double.h>
+#include <gsl/gsl_vector_complex.h>
+#include <gsl/gsl_block_complex_long_double.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+typedef struct
+{
+ size_t size;
+ size_t stride;
+ long double *data;
+ gsl_block_complex_long_double *block;
+ int owner;
+} gsl_vector_complex_long_double;
+
+typedef struct
+{
+ gsl_vector_complex_long_double vector;
+} _gsl_vector_complex_long_double_view;
+
+typedef _gsl_vector_complex_long_double_view gsl_vector_complex_long_double_view;
+
+typedef struct
+{
+ gsl_vector_complex_long_double vector;
+} _gsl_vector_complex_long_double_const_view;
+
+typedef const _gsl_vector_complex_long_double_const_view gsl_vector_complex_long_double_const_view;
+
+/* Allocation */
+
+gsl_vector_complex_long_double *gsl_vector_complex_long_double_alloc (const size_t n);
+gsl_vector_complex_long_double *gsl_vector_complex_long_double_calloc (const size_t n);
+
+gsl_vector_complex_long_double *
+gsl_vector_complex_long_double_alloc_from_block (gsl_block_complex_long_double * b,
+ const size_t offset,
+ const size_t n,
+ const size_t stride);
+
+gsl_vector_complex_long_double *
+gsl_vector_complex_long_double_alloc_from_vector (gsl_vector_complex_long_double * v,
+ const size_t offset,
+ const size_t n,
+ const size_t stride);
+
+void gsl_vector_complex_long_double_free (gsl_vector_complex_long_double * v);
+
+/* Views */
+
+_gsl_vector_complex_long_double_view
+gsl_vector_complex_long_double_view_array (long double *base,
+ size_t n);
+
+_gsl_vector_complex_long_double_view
+gsl_vector_complex_long_double_view_array_with_stride (long double *base,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_complex_long_double_const_view
+gsl_vector_complex_long_double_const_view_array (const long double *base,
+ size_t n);
+
+_gsl_vector_complex_long_double_const_view
+gsl_vector_complex_long_double_const_view_array_with_stride (const long double *base,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_complex_long_double_view
+gsl_vector_complex_long_double_subvector (gsl_vector_complex_long_double *base,
+ size_t i,
+ size_t n);
+
+
+_gsl_vector_complex_long_double_view
+gsl_vector_complex_long_double_subvector_with_stride (gsl_vector_complex_long_double *v,
+ size_t i,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_complex_long_double_const_view
+gsl_vector_complex_long_double_const_subvector (const gsl_vector_complex_long_double *base,
+ size_t i,
+ size_t n);
+
+
+_gsl_vector_complex_long_double_const_view
+gsl_vector_complex_long_double_const_subvector_with_stride (const gsl_vector_complex_long_double *v,
+ size_t i,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_long_double_view
+gsl_vector_complex_long_double_real (gsl_vector_complex_long_double *v);
+
+_gsl_vector_long_double_view
+gsl_vector_complex_long_double_imag (gsl_vector_complex_long_double *v);
+
+_gsl_vector_long_double_const_view
+gsl_vector_complex_long_double_const_real (const gsl_vector_complex_long_double *v);
+
+_gsl_vector_long_double_const_view
+gsl_vector_complex_long_double_const_imag (const gsl_vector_complex_long_double *v);
+
+
+/* Operations */
+
+gsl_complex_long_double
+gsl_vector_complex_long_double_get (const gsl_vector_complex_long_double * v, const size_t i);
+
+void gsl_vector_complex_long_double_set (gsl_vector_complex_long_double * v, const size_t i,
+ gsl_complex_long_double z);
+
+gsl_complex_long_double
+*gsl_vector_complex_long_double_ptr (gsl_vector_complex_long_double * v, const size_t i);
+
+const gsl_complex_long_double
+*gsl_vector_complex_long_double_const_ptr (const gsl_vector_complex_long_double * v, const size_t i);
+
+void gsl_vector_complex_long_double_set_zero (gsl_vector_complex_long_double * v);
+void gsl_vector_complex_long_double_set_all (gsl_vector_complex_long_double * v,
+ gsl_complex_long_double z);
+int gsl_vector_complex_long_double_set_basis (gsl_vector_complex_long_double * v, size_t i);
+
+int gsl_vector_complex_long_double_fread (FILE * stream,
+ gsl_vector_complex_long_double * v);
+int gsl_vector_complex_long_double_fwrite (FILE * stream,
+ const gsl_vector_complex_long_double * v);
+int gsl_vector_complex_long_double_fscanf (FILE * stream,
+ gsl_vector_complex_long_double * v);
+int gsl_vector_complex_long_double_fprintf (FILE * stream,
+ const gsl_vector_complex_long_double * v,
+ const char *format);
+
+int gsl_vector_complex_long_double_memcpy (gsl_vector_complex_long_double * dest, const gsl_vector_complex_long_double * src);
+
+int gsl_vector_complex_long_double_reverse (gsl_vector_complex_long_double * v);
+
+int gsl_vector_complex_long_double_swap (gsl_vector_complex_long_double * v, gsl_vector_complex_long_double * w);
+int gsl_vector_complex_long_double_swap_elements (gsl_vector_complex_long_double * v, const size_t i, const size_t j);
+
+int gsl_vector_complex_long_double_isnull (const gsl_vector_complex_long_double * v);
+int gsl_vector_complex_long_double_ispos (const gsl_vector_complex_long_double * v);
+int gsl_vector_complex_long_double_isneg (const gsl_vector_complex_long_double * v);
+
+#ifdef HAVE_INLINE
+
+extern inline
+gsl_complex_long_double
+gsl_vector_complex_long_double_get (const gsl_vector_complex_long_double * v,
+ const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ gsl_complex_long_double zero = {{0, 0}};
+ GSL_ERROR_VAL ("index out of range", GSL_EINVAL, zero);
+ }
+#endif
+ return *GSL_COMPLEX_LONG_DOUBLE_AT (v, i);
+}
+
+extern inline
+void
+gsl_vector_complex_long_double_set (gsl_vector_complex_long_double * v,
+ const size_t i, gsl_complex_long_double z)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_VOID ("index out of range", GSL_EINVAL);
+ }
+#endif
+ *GSL_COMPLEX_LONG_DOUBLE_AT (v, i) = z;
+}
+
+extern inline
+gsl_complex_long_double *
+gsl_vector_complex_long_double_ptr (gsl_vector_complex_long_double * v,
+ const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_NULL ("index out of range", GSL_EINVAL);
+ }
+#endif
+ return GSL_COMPLEX_LONG_DOUBLE_AT (v, i);
+}
+
+extern inline
+const gsl_complex_long_double *
+gsl_vector_complex_long_double_const_ptr (const gsl_vector_complex_long_double * v,
+ const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_NULL ("index out of range", GSL_EINVAL);
+ }
+#endif
+ return GSL_COMPLEX_LONG_DOUBLE_AT (v, i);
+}
+
+
+#endif /* HAVE_INLINE */
+
+__END_DECLS
+
+#endif /* __GSL_VECTOR_COMPLEX_LONG_DOUBLE_H__ */
diff --git a/gsl-1.9/vector/gsl_vector_double.h b/gsl-1.9/vector/gsl_vector_double.h
new file mode 100644
index 0000000..189c4ab
--- /dev/null
+++ b/gsl-1.9/vector/gsl_vector_double.h
@@ -0,0 +1,228 @@
+/* vector/gsl_vector_double.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_VECTOR_DOUBLE_H__
+#define __GSL_VECTOR_DOUBLE_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_types.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_check_range.h>
+#include <gsl/gsl_block_double.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+typedef struct
+{
+ size_t size;
+ size_t stride;
+ double *data;
+ gsl_block *block;
+ int owner;
+}
+gsl_vector;
+
+typedef struct
+{
+ gsl_vector vector;
+} _gsl_vector_view;
+
+typedef _gsl_vector_view gsl_vector_view;
+
+typedef struct
+{
+ gsl_vector vector;
+} _gsl_vector_const_view;
+
+typedef const _gsl_vector_const_view gsl_vector_const_view;
+
+
+/* Allocation */
+
+gsl_vector *gsl_vector_alloc (const size_t n);
+gsl_vector *gsl_vector_calloc (const size_t n);
+
+gsl_vector *gsl_vector_alloc_from_block (gsl_block * b,
+ const size_t offset,
+ const size_t n,
+ const size_t stride);
+
+gsl_vector *gsl_vector_alloc_from_vector (gsl_vector * v,
+ const size_t offset,
+ const size_t n,
+ const size_t stride);
+
+void gsl_vector_free (gsl_vector * v);
+
+/* Views */
+
+_gsl_vector_view
+gsl_vector_view_array (double *v, size_t n);
+
+_gsl_vector_view
+gsl_vector_view_array_with_stride (double *base,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_const_view
+gsl_vector_const_view_array (const double *v, size_t n);
+
+_gsl_vector_const_view
+gsl_vector_const_view_array_with_stride (const double *base,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_view
+gsl_vector_subvector (gsl_vector *v,
+ size_t i,
+ size_t n);
+
+_gsl_vector_view
+gsl_vector_subvector_with_stride (gsl_vector *v,
+ size_t i,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_const_view
+gsl_vector_const_subvector (const gsl_vector *v,
+ size_t i,
+ size_t n);
+
+_gsl_vector_const_view
+gsl_vector_const_subvector_with_stride (const gsl_vector *v,
+ size_t i,
+ size_t stride,
+ size_t n);
+
+/* Operations */
+
+double gsl_vector_get (const gsl_vector * v, const size_t i);
+void gsl_vector_set (gsl_vector * v, const size_t i, double x);
+
+double *gsl_vector_ptr (gsl_vector * v, const size_t i);
+const double *gsl_vector_const_ptr (const gsl_vector * v, const size_t i);
+
+void gsl_vector_set_zero (gsl_vector * v);
+void gsl_vector_set_all (gsl_vector * v, double x);
+int gsl_vector_set_basis (gsl_vector * v, size_t i);
+
+int gsl_vector_fread (FILE * stream, gsl_vector * v);
+int gsl_vector_fwrite (FILE * stream, const gsl_vector * v);
+int gsl_vector_fscanf (FILE * stream, gsl_vector * v);
+int gsl_vector_fprintf (FILE * stream, const gsl_vector * v,
+ const char *format);
+
+int gsl_vector_memcpy (gsl_vector * dest, const gsl_vector * src);
+
+int gsl_vector_reverse (gsl_vector * v);
+
+int gsl_vector_swap (gsl_vector * v, gsl_vector * w);
+int gsl_vector_swap_elements (gsl_vector * v, const size_t i, const size_t j);
+
+double gsl_vector_max (const gsl_vector * v);
+double gsl_vector_min (const gsl_vector * v);
+void gsl_vector_minmax (const gsl_vector * v, double * min_out, double * max_out);
+
+size_t gsl_vector_max_index (const gsl_vector * v);
+size_t gsl_vector_min_index (const gsl_vector * v);
+void gsl_vector_minmax_index (const gsl_vector * v, size_t * imin, size_t * imax);
+
+int gsl_vector_add (gsl_vector * a, const gsl_vector * b);
+int gsl_vector_sub (gsl_vector * a, const gsl_vector * b);
+int gsl_vector_mul (gsl_vector * a, const gsl_vector * b);
+int gsl_vector_div (gsl_vector * a, const gsl_vector * b);
+int gsl_vector_scale (gsl_vector * a, const double x);
+int gsl_vector_add_constant (gsl_vector * a, const double x);
+
+int gsl_vector_isnull (const gsl_vector * v);
+int gsl_vector_ispos (const gsl_vector * v);
+int gsl_vector_isneg (const gsl_vector * v);
+
+#ifdef HAVE_INLINE
+
+extern inline
+double
+gsl_vector_get (const gsl_vector * v, const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_VAL ("index out of range", GSL_EINVAL, 0);
+ }
+#endif
+ return v->data[i * v->stride];
+}
+
+extern inline
+void
+gsl_vector_set (gsl_vector * v, const size_t i, double x)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_VOID ("index out of range", GSL_EINVAL);
+ }
+#endif
+ v->data[i * v->stride] = x;
+}
+
+extern inline
+double *
+gsl_vector_ptr (gsl_vector * v, const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_NULL ("index out of range", GSL_EINVAL);
+ }
+#endif
+ return (double *) (v->data + i * v->stride);
+}
+
+extern inline
+const double *
+gsl_vector_const_ptr (const gsl_vector * v, const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_NULL ("index out of range", GSL_EINVAL);
+ }
+#endif
+ return (const double *) (v->data + i * v->stride);
+}
+
+
+#endif /* HAVE_INLINE */
+
+__END_DECLS
+
+#endif /* __GSL_VECTOR_DOUBLE_H__ */
+
+
diff --git a/gsl-1.9/vector/gsl_vector_float.h b/gsl-1.9/vector/gsl_vector_float.h
new file mode 100644
index 0000000..4fb280b
--- /dev/null
+++ b/gsl-1.9/vector/gsl_vector_float.h
@@ -0,0 +1,228 @@
+/* vector/gsl_vector_float.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_VECTOR_FLOAT_H__
+#define __GSL_VECTOR_FLOAT_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_types.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_check_range.h>
+#include <gsl/gsl_block_float.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+typedef struct
+{
+ size_t size;
+ size_t stride;
+ float *data;
+ gsl_block_float *block;
+ int owner;
+}
+gsl_vector_float;
+
+typedef struct
+{
+ gsl_vector_float vector;
+} _gsl_vector_float_view;
+
+typedef _gsl_vector_float_view gsl_vector_float_view;
+
+typedef struct
+{
+ gsl_vector_float vector;
+} _gsl_vector_float_const_view;
+
+typedef const _gsl_vector_float_const_view gsl_vector_float_const_view;
+
+
+/* Allocation */
+
+gsl_vector_float *gsl_vector_float_alloc (const size_t n);
+gsl_vector_float *gsl_vector_float_calloc (const size_t n);
+
+gsl_vector_float *gsl_vector_float_alloc_from_block (gsl_block_float * b,
+ const size_t offset,
+ const size_t n,
+ const size_t stride);
+
+gsl_vector_float *gsl_vector_float_alloc_from_vector (gsl_vector_float * v,
+ const size_t offset,
+ const size_t n,
+ const size_t stride);
+
+void gsl_vector_float_free (gsl_vector_float * v);
+
+/* Views */
+
+_gsl_vector_float_view
+gsl_vector_float_view_array (float *v, size_t n);
+
+_gsl_vector_float_view
+gsl_vector_float_view_array_with_stride (float *base,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_float_const_view
+gsl_vector_float_const_view_array (const float *v, size_t n);
+
+_gsl_vector_float_const_view
+gsl_vector_float_const_view_array_with_stride (const float *base,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_float_view
+gsl_vector_float_subvector (gsl_vector_float *v,
+ size_t i,
+ size_t n);
+
+_gsl_vector_float_view
+gsl_vector_float_subvector_with_stride (gsl_vector_float *v,
+ size_t i,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_float_const_view
+gsl_vector_float_const_subvector (const gsl_vector_float *v,
+ size_t i,
+ size_t n);
+
+_gsl_vector_float_const_view
+gsl_vector_float_const_subvector_with_stride (const gsl_vector_float *v,
+ size_t i,
+ size_t stride,
+ size_t n);
+
+/* Operations */
+
+float gsl_vector_float_get (const gsl_vector_float * v, const size_t i);
+void gsl_vector_float_set (gsl_vector_float * v, const size_t i, float x);
+
+float *gsl_vector_float_ptr (gsl_vector_float * v, const size_t i);
+const float *gsl_vector_float_const_ptr (const gsl_vector_float * v, const size_t i);
+
+void gsl_vector_float_set_zero (gsl_vector_float * v);
+void gsl_vector_float_set_all (gsl_vector_float * v, float x);
+int gsl_vector_float_set_basis (gsl_vector_float * v, size_t i);
+
+int gsl_vector_float_fread (FILE * stream, gsl_vector_float * v);
+int gsl_vector_float_fwrite (FILE * stream, const gsl_vector_float * v);
+int gsl_vector_float_fscanf (FILE * stream, gsl_vector_float * v);
+int gsl_vector_float_fprintf (FILE * stream, const gsl_vector_float * v,
+ const char *format);
+
+int gsl_vector_float_memcpy (gsl_vector_float * dest, const gsl_vector_float * src);
+
+int gsl_vector_float_reverse (gsl_vector_float * v);
+
+int gsl_vector_float_swap (gsl_vector_float * v, gsl_vector_float * w);
+int gsl_vector_float_swap_elements (gsl_vector_float * v, const size_t i, const size_t j);
+
+float gsl_vector_float_max (const gsl_vector_float * v);
+float gsl_vector_float_min (const gsl_vector_float * v);
+void gsl_vector_float_minmax (const gsl_vector_float * v, float * min_out, float * max_out);
+
+size_t gsl_vector_float_max_index (const gsl_vector_float * v);
+size_t gsl_vector_float_min_index (const gsl_vector_float * v);
+void gsl_vector_float_minmax_index (const gsl_vector_float * v, size_t * imin, size_t * imax);
+
+int gsl_vector_float_add (gsl_vector_float * a, const gsl_vector_float * b);
+int gsl_vector_float_sub (gsl_vector_float * a, const gsl_vector_float * b);
+int gsl_vector_float_mul (gsl_vector_float * a, const gsl_vector_float * b);
+int gsl_vector_float_div (gsl_vector_float * a, const gsl_vector_float * b);
+int gsl_vector_float_scale (gsl_vector_float * a, const double x);
+int gsl_vector_float_add_constant (gsl_vector_float * a, const double x);
+
+int gsl_vector_float_isnull (const gsl_vector_float * v);
+int gsl_vector_float_ispos (const gsl_vector_float * v);
+int gsl_vector_float_isneg (const gsl_vector_float * v);
+
+#ifdef HAVE_INLINE
+
+extern inline
+float
+gsl_vector_float_get (const gsl_vector_float * v, const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_VAL ("index out of range", GSL_EINVAL, 0);
+ }
+#endif
+ return v->data[i * v->stride];
+}
+
+extern inline
+void
+gsl_vector_float_set (gsl_vector_float * v, const size_t i, float x)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_VOID ("index out of range", GSL_EINVAL);
+ }
+#endif
+ v->data[i * v->stride] = x;
+}
+
+extern inline
+float *
+gsl_vector_float_ptr (gsl_vector_float * v, const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_NULL ("index out of range", GSL_EINVAL);
+ }
+#endif
+ return (float *) (v->data + i * v->stride);
+}
+
+extern inline
+const float *
+gsl_vector_float_const_ptr (const gsl_vector_float * v, const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_NULL ("index out of range", GSL_EINVAL);
+ }
+#endif
+ return (const float *) (v->data + i * v->stride);
+}
+
+
+#endif /* HAVE_INLINE */
+
+__END_DECLS
+
+#endif /* __GSL_VECTOR_FLOAT_H__ */
+
+
diff --git a/gsl-1.9/vector/gsl_vector_int.h b/gsl-1.9/vector/gsl_vector_int.h
new file mode 100644
index 0000000..02b50a4
--- /dev/null
+++ b/gsl-1.9/vector/gsl_vector_int.h
@@ -0,0 +1,228 @@
+/* vector/gsl_vector_int.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_VECTOR_INT_H__
+#define __GSL_VECTOR_INT_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_types.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_check_range.h>
+#include <gsl/gsl_block_int.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+typedef struct
+{
+ size_t size;
+ size_t stride;
+ int *data;
+ gsl_block_int *block;
+ int owner;
+}
+gsl_vector_int;
+
+typedef struct
+{
+ gsl_vector_int vector;
+} _gsl_vector_int_view;
+
+typedef _gsl_vector_int_view gsl_vector_int_view;
+
+typedef struct
+{
+ gsl_vector_int vector;
+} _gsl_vector_int_const_view;
+
+typedef const _gsl_vector_int_const_view gsl_vector_int_const_view;
+
+
+/* Allocation */
+
+gsl_vector_int *gsl_vector_int_alloc (const size_t n);
+gsl_vector_int *gsl_vector_int_calloc (const size_t n);
+
+gsl_vector_int *gsl_vector_int_alloc_from_block (gsl_block_int * b,
+ const size_t offset,
+ const size_t n,
+ const size_t stride);
+
+gsl_vector_int *gsl_vector_int_alloc_from_vector (gsl_vector_int * v,
+ const size_t offset,
+ const size_t n,
+ const size_t stride);
+
+void gsl_vector_int_free (gsl_vector_int * v);
+
+/* Views */
+
+_gsl_vector_int_view
+gsl_vector_int_view_array (int *v, size_t n);
+
+_gsl_vector_int_view
+gsl_vector_int_view_array_with_stride (int *base,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_int_const_view
+gsl_vector_int_const_view_array (const int *v, size_t n);
+
+_gsl_vector_int_const_view
+gsl_vector_int_const_view_array_with_stride (const int *base,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_int_view
+gsl_vector_int_subvector (gsl_vector_int *v,
+ size_t i,
+ size_t n);
+
+_gsl_vector_int_view
+gsl_vector_int_subvector_with_stride (gsl_vector_int *v,
+ size_t i,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_int_const_view
+gsl_vector_int_const_subvector (const gsl_vector_int *v,
+ size_t i,
+ size_t n);
+
+_gsl_vector_int_const_view
+gsl_vector_int_const_subvector_with_stride (const gsl_vector_int *v,
+ size_t i,
+ size_t stride,
+ size_t n);
+
+/* Operations */
+
+int gsl_vector_int_get (const gsl_vector_int * v, const size_t i);
+void gsl_vector_int_set (gsl_vector_int * v, const size_t i, int x);
+
+int *gsl_vector_int_ptr (gsl_vector_int * v, const size_t i);
+const int *gsl_vector_int_const_ptr (const gsl_vector_int * v, const size_t i);
+
+void gsl_vector_int_set_zero (gsl_vector_int * v);
+void gsl_vector_int_set_all (gsl_vector_int * v, int x);
+int gsl_vector_int_set_basis (gsl_vector_int * v, size_t i);
+
+int gsl_vector_int_fread (FILE * stream, gsl_vector_int * v);
+int gsl_vector_int_fwrite (FILE * stream, const gsl_vector_int * v);
+int gsl_vector_int_fscanf (FILE * stream, gsl_vector_int * v);
+int gsl_vector_int_fprintf (FILE * stream, const gsl_vector_int * v,
+ const char *format);
+
+int gsl_vector_int_memcpy (gsl_vector_int * dest, const gsl_vector_int * src);
+
+int gsl_vector_int_reverse (gsl_vector_int * v);
+
+int gsl_vector_int_swap (gsl_vector_int * v, gsl_vector_int * w);
+int gsl_vector_int_swap_elements (gsl_vector_int * v, const size_t i, const size_t j);
+
+int gsl_vector_int_max (const gsl_vector_int * v);
+int gsl_vector_int_min (const gsl_vector_int * v);
+void gsl_vector_int_minmax (const gsl_vector_int * v, int * min_out, int * max_out);
+
+size_t gsl_vector_int_max_index (const gsl_vector_int * v);
+size_t gsl_vector_int_min_index (const gsl_vector_int * v);
+void gsl_vector_int_minmax_index (const gsl_vector_int * v, size_t * imin, size_t * imax);
+
+int gsl_vector_int_add (gsl_vector_int * a, const gsl_vector_int * b);
+int gsl_vector_int_sub (gsl_vector_int * a, const gsl_vector_int * b);
+int gsl_vector_int_mul (gsl_vector_int * a, const gsl_vector_int * b);
+int gsl_vector_int_div (gsl_vector_int * a, const gsl_vector_int * b);
+int gsl_vector_int_scale (gsl_vector_int * a, const double x);
+int gsl_vector_int_add_constant (gsl_vector_int * a, const double x);
+
+int gsl_vector_int_isnull (const gsl_vector_int * v);
+int gsl_vector_int_ispos (const gsl_vector_int * v);
+int gsl_vector_int_isneg (const gsl_vector_int * v);
+
+#ifdef HAVE_INLINE
+
+extern inline
+int
+gsl_vector_int_get (const gsl_vector_int * v, const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_VAL ("index out of range", GSL_EINVAL, 0);
+ }
+#endif
+ return v->data[i * v->stride];
+}
+
+extern inline
+void
+gsl_vector_int_set (gsl_vector_int * v, const size_t i, int x)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_VOID ("index out of range", GSL_EINVAL);
+ }
+#endif
+ v->data[i * v->stride] = x;
+}
+
+extern inline
+int *
+gsl_vector_int_ptr (gsl_vector_int * v, const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_NULL ("index out of range", GSL_EINVAL);
+ }
+#endif
+ return (int *) (v->data + i * v->stride);
+}
+
+extern inline
+const int *
+gsl_vector_int_const_ptr (const gsl_vector_int * v, const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_NULL ("index out of range", GSL_EINVAL);
+ }
+#endif
+ return (const int *) (v->data + i * v->stride);
+}
+
+
+#endif /* HAVE_INLINE */
+
+__END_DECLS
+
+#endif /* __GSL_VECTOR_INT_H__ */
+
+
diff --git a/gsl-1.9/vector/gsl_vector_long.h b/gsl-1.9/vector/gsl_vector_long.h
new file mode 100644
index 0000000..fcbfa15
--- /dev/null
+++ b/gsl-1.9/vector/gsl_vector_long.h
@@ -0,0 +1,228 @@
+/* vector/gsl_vector_long.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_VECTOR_LONG_H__
+#define __GSL_VECTOR_LONG_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_types.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_check_range.h>
+#include <gsl/gsl_block_long.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+typedef struct
+{
+ size_t size;
+ size_t stride;
+ long *data;
+ gsl_block_long *block;
+ int owner;
+}
+gsl_vector_long;
+
+typedef struct
+{
+ gsl_vector_long vector;
+} _gsl_vector_long_view;
+
+typedef _gsl_vector_long_view gsl_vector_long_view;
+
+typedef struct
+{
+ gsl_vector_long vector;
+} _gsl_vector_long_const_view;
+
+typedef const _gsl_vector_long_const_view gsl_vector_long_const_view;
+
+
+/* Allocation */
+
+gsl_vector_long *gsl_vector_long_alloc (const size_t n);
+gsl_vector_long *gsl_vector_long_calloc (const size_t n);
+
+gsl_vector_long *gsl_vector_long_alloc_from_block (gsl_block_long * b,
+ const size_t offset,
+ const size_t n,
+ const size_t stride);
+
+gsl_vector_long *gsl_vector_long_alloc_from_vector (gsl_vector_long * v,
+ const size_t offset,
+ const size_t n,
+ const size_t stride);
+
+void gsl_vector_long_free (gsl_vector_long * v);
+
+/* Views */
+
+_gsl_vector_long_view
+gsl_vector_long_view_array (long *v, size_t n);
+
+_gsl_vector_long_view
+gsl_vector_long_view_array_with_stride (long *base,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_long_const_view
+gsl_vector_long_const_view_array (const long *v, size_t n);
+
+_gsl_vector_long_const_view
+gsl_vector_long_const_view_array_with_stride (const long *base,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_long_view
+gsl_vector_long_subvector (gsl_vector_long *v,
+ size_t i,
+ size_t n);
+
+_gsl_vector_long_view
+gsl_vector_long_subvector_with_stride (gsl_vector_long *v,
+ size_t i,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_long_const_view
+gsl_vector_long_const_subvector (const gsl_vector_long *v,
+ size_t i,
+ size_t n);
+
+_gsl_vector_long_const_view
+gsl_vector_long_const_subvector_with_stride (const gsl_vector_long *v,
+ size_t i,
+ size_t stride,
+ size_t n);
+
+/* Operations */
+
+long gsl_vector_long_get (const gsl_vector_long * v, const size_t i);
+void gsl_vector_long_set (gsl_vector_long * v, const size_t i, long x);
+
+long *gsl_vector_long_ptr (gsl_vector_long * v, const size_t i);
+const long *gsl_vector_long_const_ptr (const gsl_vector_long * v, const size_t i);
+
+void gsl_vector_long_set_zero (gsl_vector_long * v);
+void gsl_vector_long_set_all (gsl_vector_long * v, long x);
+int gsl_vector_long_set_basis (gsl_vector_long * v, size_t i);
+
+int gsl_vector_long_fread (FILE * stream, gsl_vector_long * v);
+int gsl_vector_long_fwrite (FILE * stream, const gsl_vector_long * v);
+int gsl_vector_long_fscanf (FILE * stream, gsl_vector_long * v);
+int gsl_vector_long_fprintf (FILE * stream, const gsl_vector_long * v,
+ const char *format);
+
+int gsl_vector_long_memcpy (gsl_vector_long * dest, const gsl_vector_long * src);
+
+int gsl_vector_long_reverse (gsl_vector_long * v);
+
+int gsl_vector_long_swap (gsl_vector_long * v, gsl_vector_long * w);
+int gsl_vector_long_swap_elements (gsl_vector_long * v, const size_t i, const size_t j);
+
+long gsl_vector_long_max (const gsl_vector_long * v);
+long gsl_vector_long_min (const gsl_vector_long * v);
+void gsl_vector_long_minmax (const gsl_vector_long * v, long * min_out, long * max_out);
+
+size_t gsl_vector_long_max_index (const gsl_vector_long * v);
+size_t gsl_vector_long_min_index (const gsl_vector_long * v);
+void gsl_vector_long_minmax_index (const gsl_vector_long * v, size_t * imin, size_t * imax);
+
+int gsl_vector_long_add (gsl_vector_long * a, const gsl_vector_long * b);
+int gsl_vector_long_sub (gsl_vector_long * a, const gsl_vector_long * b);
+int gsl_vector_long_mul (gsl_vector_long * a, const gsl_vector_long * b);
+int gsl_vector_long_div (gsl_vector_long * a, const gsl_vector_long * b);
+int gsl_vector_long_scale (gsl_vector_long * a, const double x);
+int gsl_vector_long_add_constant (gsl_vector_long * a, const double x);
+
+int gsl_vector_long_isnull (const gsl_vector_long * v);
+int gsl_vector_long_ispos (const gsl_vector_long * v);
+int gsl_vector_long_isneg (const gsl_vector_long * v);
+
+#ifdef HAVE_INLINE
+
+extern inline
+long
+gsl_vector_long_get (const gsl_vector_long * v, const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_VAL ("index out of range", GSL_EINVAL, 0);
+ }
+#endif
+ return v->data[i * v->stride];
+}
+
+extern inline
+void
+gsl_vector_long_set (gsl_vector_long * v, const size_t i, long x)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_VOID ("index out of range", GSL_EINVAL);
+ }
+#endif
+ v->data[i * v->stride] = x;
+}
+
+extern inline
+long *
+gsl_vector_long_ptr (gsl_vector_long * v, const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_NULL ("index out of range", GSL_EINVAL);
+ }
+#endif
+ return (long *) (v->data + i * v->stride);
+}
+
+extern inline
+const long *
+gsl_vector_long_const_ptr (const gsl_vector_long * v, const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_NULL ("index out of range", GSL_EINVAL);
+ }
+#endif
+ return (const long *) (v->data + i * v->stride);
+}
+
+
+#endif /* HAVE_INLINE */
+
+__END_DECLS
+
+#endif /* __GSL_VECTOR_LONG_H__ */
+
+
diff --git a/gsl-1.9/vector/gsl_vector_long_double.h b/gsl-1.9/vector/gsl_vector_long_double.h
new file mode 100644
index 0000000..15ff57a
--- /dev/null
+++ b/gsl-1.9/vector/gsl_vector_long_double.h
@@ -0,0 +1,228 @@
+/* vector/gsl_vector_long_double.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_VECTOR_LONG_DOUBLE_H__
+#define __GSL_VECTOR_LONG_DOUBLE_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_types.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_check_range.h>
+#include <gsl/gsl_block_long_double.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+typedef struct
+{
+ size_t size;
+ size_t stride;
+ long double *data;
+ gsl_block_long_double *block;
+ int owner;
+}
+gsl_vector_long_double;
+
+typedef struct
+{
+ gsl_vector_long_double vector;
+} _gsl_vector_long_double_view;
+
+typedef _gsl_vector_long_double_view gsl_vector_long_double_view;
+
+typedef struct
+{
+ gsl_vector_long_double vector;
+} _gsl_vector_long_double_const_view;
+
+typedef const _gsl_vector_long_double_const_view gsl_vector_long_double_const_view;
+
+
+/* Allocation */
+
+gsl_vector_long_double *gsl_vector_long_double_alloc (const size_t n);
+gsl_vector_long_double *gsl_vector_long_double_calloc (const size_t n);
+
+gsl_vector_long_double *gsl_vector_long_double_alloc_from_block (gsl_block_long_double * b,
+ const size_t offset,
+ const size_t n,
+ const size_t stride);
+
+gsl_vector_long_double *gsl_vector_long_double_alloc_from_vector (gsl_vector_long_double * v,
+ const size_t offset,
+ const size_t n,
+ const size_t stride);
+
+void gsl_vector_long_double_free (gsl_vector_long_double * v);
+
+/* Views */
+
+_gsl_vector_long_double_view
+gsl_vector_long_double_view_array (long double *v, size_t n);
+
+_gsl_vector_long_double_view
+gsl_vector_long_double_view_array_with_stride (long double *base,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_long_double_const_view
+gsl_vector_long_double_const_view_array (const long double *v, size_t n);
+
+_gsl_vector_long_double_const_view
+gsl_vector_long_double_const_view_array_with_stride (const long double *base,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_long_double_view
+gsl_vector_long_double_subvector (gsl_vector_long_double *v,
+ size_t i,
+ size_t n);
+
+_gsl_vector_long_double_view
+gsl_vector_long_double_subvector_with_stride (gsl_vector_long_double *v,
+ size_t i,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_long_double_const_view
+gsl_vector_long_double_const_subvector (const gsl_vector_long_double *v,
+ size_t i,
+ size_t n);
+
+_gsl_vector_long_double_const_view
+gsl_vector_long_double_const_subvector_with_stride (const gsl_vector_long_double *v,
+ size_t i,
+ size_t stride,
+ size_t n);
+
+/* Operations */
+
+long double gsl_vector_long_double_get (const gsl_vector_long_double * v, const size_t i);
+void gsl_vector_long_double_set (gsl_vector_long_double * v, const size_t i, long double x);
+
+long double *gsl_vector_long_double_ptr (gsl_vector_long_double * v, const size_t i);
+const long double *gsl_vector_long_double_const_ptr (const gsl_vector_long_double * v, const size_t i);
+
+void gsl_vector_long_double_set_zero (gsl_vector_long_double * v);
+void gsl_vector_long_double_set_all (gsl_vector_long_double * v, long double x);
+int gsl_vector_long_double_set_basis (gsl_vector_long_double * v, size_t i);
+
+int gsl_vector_long_double_fread (FILE * stream, gsl_vector_long_double * v);
+int gsl_vector_long_double_fwrite (FILE * stream, const gsl_vector_long_double * v);
+int gsl_vector_long_double_fscanf (FILE * stream, gsl_vector_long_double * v);
+int gsl_vector_long_double_fprintf (FILE * stream, const gsl_vector_long_double * v,
+ const char *format);
+
+int gsl_vector_long_double_memcpy (gsl_vector_long_double * dest, const gsl_vector_long_double * src);
+
+int gsl_vector_long_double_reverse (gsl_vector_long_double * v);
+
+int gsl_vector_long_double_swap (gsl_vector_long_double * v, gsl_vector_long_double * w);
+int gsl_vector_long_double_swap_elements (gsl_vector_long_double * v, const size_t i, const size_t j);
+
+long double gsl_vector_long_double_max (const gsl_vector_long_double * v);
+long double gsl_vector_long_double_min (const gsl_vector_long_double * v);
+void gsl_vector_long_double_minmax (const gsl_vector_long_double * v, long double * min_out, long double * max_out);
+
+size_t gsl_vector_long_double_max_index (const gsl_vector_long_double * v);
+size_t gsl_vector_long_double_min_index (const gsl_vector_long_double * v);
+void gsl_vector_long_double_minmax_index (const gsl_vector_long_double * v, size_t * imin, size_t * imax);
+
+int gsl_vector_long_double_add (gsl_vector_long_double * a, const gsl_vector_long_double * b);
+int gsl_vector_long_double_sub (gsl_vector_long_double * a, const gsl_vector_long_double * b);
+int gsl_vector_long_double_mul (gsl_vector_long_double * a, const gsl_vector_long_double * b);
+int gsl_vector_long_double_div (gsl_vector_long_double * a, const gsl_vector_long_double * b);
+int gsl_vector_long_double_scale (gsl_vector_long_double * a, const double x);
+int gsl_vector_long_double_add_constant (gsl_vector_long_double * a, const double x);
+
+int gsl_vector_long_double_isnull (const gsl_vector_long_double * v);
+int gsl_vector_long_double_ispos (const gsl_vector_long_double * v);
+int gsl_vector_long_double_isneg (const gsl_vector_long_double * v);
+
+#ifdef HAVE_INLINE
+
+extern inline
+long double
+gsl_vector_long_double_get (const gsl_vector_long_double * v, const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_VAL ("index out of range", GSL_EINVAL, 0);
+ }
+#endif
+ return v->data[i * v->stride];
+}
+
+extern inline
+void
+gsl_vector_long_double_set (gsl_vector_long_double * v, const size_t i, long double x)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_VOID ("index out of range", GSL_EINVAL);
+ }
+#endif
+ v->data[i * v->stride] = x;
+}
+
+extern inline
+long double *
+gsl_vector_long_double_ptr (gsl_vector_long_double * v, const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_NULL ("index out of range", GSL_EINVAL);
+ }
+#endif
+ return (long double *) (v->data + i * v->stride);
+}
+
+extern inline
+const long double *
+gsl_vector_long_double_const_ptr (const gsl_vector_long_double * v, const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_NULL ("index out of range", GSL_EINVAL);
+ }
+#endif
+ return (const long double *) (v->data + i * v->stride);
+}
+
+
+#endif /* HAVE_INLINE */
+
+__END_DECLS
+
+#endif /* __GSL_VECTOR_LONG_DOUBLE_H__ */
+
+
diff --git a/gsl-1.9/vector/gsl_vector_short.h b/gsl-1.9/vector/gsl_vector_short.h
new file mode 100644
index 0000000..45218cf
--- /dev/null
+++ b/gsl-1.9/vector/gsl_vector_short.h
@@ -0,0 +1,228 @@
+/* vector/gsl_vector_short.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_VECTOR_SHORT_H__
+#define __GSL_VECTOR_SHORT_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_types.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_check_range.h>
+#include <gsl/gsl_block_short.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+typedef struct
+{
+ size_t size;
+ size_t stride;
+ short *data;
+ gsl_block_short *block;
+ int owner;
+}
+gsl_vector_short;
+
+typedef struct
+{
+ gsl_vector_short vector;
+} _gsl_vector_short_view;
+
+typedef _gsl_vector_short_view gsl_vector_short_view;
+
+typedef struct
+{
+ gsl_vector_short vector;
+} _gsl_vector_short_const_view;
+
+typedef const _gsl_vector_short_const_view gsl_vector_short_const_view;
+
+
+/* Allocation */
+
+gsl_vector_short *gsl_vector_short_alloc (const size_t n);
+gsl_vector_short *gsl_vector_short_calloc (const size_t n);
+
+gsl_vector_short *gsl_vector_short_alloc_from_block (gsl_block_short * b,
+ const size_t offset,
+ const size_t n,
+ const size_t stride);
+
+gsl_vector_short *gsl_vector_short_alloc_from_vector (gsl_vector_short * v,
+ const size_t offset,
+ const size_t n,
+ const size_t stride);
+
+void gsl_vector_short_free (gsl_vector_short * v);
+
+/* Views */
+
+_gsl_vector_short_view
+gsl_vector_short_view_array (short *v, size_t n);
+
+_gsl_vector_short_view
+gsl_vector_short_view_array_with_stride (short *base,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_short_const_view
+gsl_vector_short_const_view_array (const short *v, size_t n);
+
+_gsl_vector_short_const_view
+gsl_vector_short_const_view_array_with_stride (const short *base,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_short_view
+gsl_vector_short_subvector (gsl_vector_short *v,
+ size_t i,
+ size_t n);
+
+_gsl_vector_short_view
+gsl_vector_short_subvector_with_stride (gsl_vector_short *v,
+ size_t i,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_short_const_view
+gsl_vector_short_const_subvector (const gsl_vector_short *v,
+ size_t i,
+ size_t n);
+
+_gsl_vector_short_const_view
+gsl_vector_short_const_subvector_with_stride (const gsl_vector_short *v,
+ size_t i,
+ size_t stride,
+ size_t n);
+
+/* Operations */
+
+short gsl_vector_short_get (const gsl_vector_short * v, const size_t i);
+void gsl_vector_short_set (gsl_vector_short * v, const size_t i, short x);
+
+short *gsl_vector_short_ptr (gsl_vector_short * v, const size_t i);
+const short *gsl_vector_short_const_ptr (const gsl_vector_short * v, const size_t i);
+
+void gsl_vector_short_set_zero (gsl_vector_short * v);
+void gsl_vector_short_set_all (gsl_vector_short * v, short x);
+int gsl_vector_short_set_basis (gsl_vector_short * v, size_t i);
+
+int gsl_vector_short_fread (FILE * stream, gsl_vector_short * v);
+int gsl_vector_short_fwrite (FILE * stream, const gsl_vector_short * v);
+int gsl_vector_short_fscanf (FILE * stream, gsl_vector_short * v);
+int gsl_vector_short_fprintf (FILE * stream, const gsl_vector_short * v,
+ const char *format);
+
+int gsl_vector_short_memcpy (gsl_vector_short * dest, const gsl_vector_short * src);
+
+int gsl_vector_short_reverse (gsl_vector_short * v);
+
+int gsl_vector_short_swap (gsl_vector_short * v, gsl_vector_short * w);
+int gsl_vector_short_swap_elements (gsl_vector_short * v, const size_t i, const size_t j);
+
+short gsl_vector_short_max (const gsl_vector_short * v);
+short gsl_vector_short_min (const gsl_vector_short * v);
+void gsl_vector_short_minmax (const gsl_vector_short * v, short * min_out, short * max_out);
+
+size_t gsl_vector_short_max_index (const gsl_vector_short * v);
+size_t gsl_vector_short_min_index (const gsl_vector_short * v);
+void gsl_vector_short_minmax_index (const gsl_vector_short * v, size_t * imin, size_t * imax);
+
+int gsl_vector_short_add (gsl_vector_short * a, const gsl_vector_short * b);
+int gsl_vector_short_sub (gsl_vector_short * a, const gsl_vector_short * b);
+int gsl_vector_short_mul (gsl_vector_short * a, const gsl_vector_short * b);
+int gsl_vector_short_div (gsl_vector_short * a, const gsl_vector_short * b);
+int gsl_vector_short_scale (gsl_vector_short * a, const double x);
+int gsl_vector_short_add_constant (gsl_vector_short * a, const double x);
+
+int gsl_vector_short_isnull (const gsl_vector_short * v);
+int gsl_vector_short_ispos (const gsl_vector_short * v);
+int gsl_vector_short_isneg (const gsl_vector_short * v);
+
+#ifdef HAVE_INLINE
+
+extern inline
+short
+gsl_vector_short_get (const gsl_vector_short * v, const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_VAL ("index out of range", GSL_EINVAL, 0);
+ }
+#endif
+ return v->data[i * v->stride];
+}
+
+extern inline
+void
+gsl_vector_short_set (gsl_vector_short * v, const size_t i, short x)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_VOID ("index out of range", GSL_EINVAL);
+ }
+#endif
+ v->data[i * v->stride] = x;
+}
+
+extern inline
+short *
+gsl_vector_short_ptr (gsl_vector_short * v, const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_NULL ("index out of range", GSL_EINVAL);
+ }
+#endif
+ return (short *) (v->data + i * v->stride);
+}
+
+extern inline
+const short *
+gsl_vector_short_const_ptr (const gsl_vector_short * v, const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_NULL ("index out of range", GSL_EINVAL);
+ }
+#endif
+ return (const short *) (v->data + i * v->stride);
+}
+
+
+#endif /* HAVE_INLINE */
+
+__END_DECLS
+
+#endif /* __GSL_VECTOR_SHORT_H__ */
+
+
diff --git a/gsl-1.9/vector/gsl_vector_uchar.h b/gsl-1.9/vector/gsl_vector_uchar.h
new file mode 100644
index 0000000..895d187
--- /dev/null
+++ b/gsl-1.9/vector/gsl_vector_uchar.h
@@ -0,0 +1,228 @@
+/* vector/gsl_vector_uchar.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_VECTOR_UCHAR_H__
+#define __GSL_VECTOR_UCHAR_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_types.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_check_range.h>
+#include <gsl/gsl_block_uchar.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+typedef struct
+{
+ size_t size;
+ size_t stride;
+ unsigned char *data;
+ gsl_block_uchar *block;
+ int owner;
+}
+gsl_vector_uchar;
+
+typedef struct
+{
+ gsl_vector_uchar vector;
+} _gsl_vector_uchar_view;
+
+typedef _gsl_vector_uchar_view gsl_vector_uchar_view;
+
+typedef struct
+{
+ gsl_vector_uchar vector;
+} _gsl_vector_uchar_const_view;
+
+typedef const _gsl_vector_uchar_const_view gsl_vector_uchar_const_view;
+
+
+/* Allocation */
+
+gsl_vector_uchar *gsl_vector_uchar_alloc (const size_t n);
+gsl_vector_uchar *gsl_vector_uchar_calloc (const size_t n);
+
+gsl_vector_uchar *gsl_vector_uchar_alloc_from_block (gsl_block_uchar * b,
+ const size_t offset,
+ const size_t n,
+ const size_t stride);
+
+gsl_vector_uchar *gsl_vector_uchar_alloc_from_vector (gsl_vector_uchar * v,
+ const size_t offset,
+ const size_t n,
+ const size_t stride);
+
+void gsl_vector_uchar_free (gsl_vector_uchar * v);
+
+/* Views */
+
+_gsl_vector_uchar_view
+gsl_vector_uchar_view_array (unsigned char *v, size_t n);
+
+_gsl_vector_uchar_view
+gsl_vector_uchar_view_array_with_stride (unsigned char *base,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_uchar_const_view
+gsl_vector_uchar_const_view_array (const unsigned char *v, size_t n);
+
+_gsl_vector_uchar_const_view
+gsl_vector_uchar_const_view_array_with_stride (const unsigned char *base,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_uchar_view
+gsl_vector_uchar_subvector (gsl_vector_uchar *v,
+ size_t i,
+ size_t n);
+
+_gsl_vector_uchar_view
+gsl_vector_uchar_subvector_with_stride (gsl_vector_uchar *v,
+ size_t i,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_uchar_const_view
+gsl_vector_uchar_const_subvector (const gsl_vector_uchar *v,
+ size_t i,
+ size_t n);
+
+_gsl_vector_uchar_const_view
+gsl_vector_uchar_const_subvector_with_stride (const gsl_vector_uchar *v,
+ size_t i,
+ size_t stride,
+ size_t n);
+
+/* Operations */
+
+unsigned char gsl_vector_uchar_get (const gsl_vector_uchar * v, const size_t i);
+void gsl_vector_uchar_set (gsl_vector_uchar * v, const size_t i, unsigned char x);
+
+unsigned char *gsl_vector_uchar_ptr (gsl_vector_uchar * v, const size_t i);
+const unsigned char *gsl_vector_uchar_const_ptr (const gsl_vector_uchar * v, const size_t i);
+
+void gsl_vector_uchar_set_zero (gsl_vector_uchar * v);
+void gsl_vector_uchar_set_all (gsl_vector_uchar * v, unsigned char x);
+int gsl_vector_uchar_set_basis (gsl_vector_uchar * v, size_t i);
+
+int gsl_vector_uchar_fread (FILE * stream, gsl_vector_uchar * v);
+int gsl_vector_uchar_fwrite (FILE * stream, const gsl_vector_uchar * v);
+int gsl_vector_uchar_fscanf (FILE * stream, gsl_vector_uchar * v);
+int gsl_vector_uchar_fprintf (FILE * stream, const gsl_vector_uchar * v,
+ const char *format);
+
+int gsl_vector_uchar_memcpy (gsl_vector_uchar * dest, const gsl_vector_uchar * src);
+
+int gsl_vector_uchar_reverse (gsl_vector_uchar * v);
+
+int gsl_vector_uchar_swap (gsl_vector_uchar * v, gsl_vector_uchar * w);
+int gsl_vector_uchar_swap_elements (gsl_vector_uchar * v, const size_t i, const size_t j);
+
+unsigned char gsl_vector_uchar_max (const gsl_vector_uchar * v);
+unsigned char gsl_vector_uchar_min (const gsl_vector_uchar * v);
+void gsl_vector_uchar_minmax (const gsl_vector_uchar * v, unsigned char * min_out, unsigned char * max_out);
+
+size_t gsl_vector_uchar_max_index (const gsl_vector_uchar * v);
+size_t gsl_vector_uchar_min_index (const gsl_vector_uchar * v);
+void gsl_vector_uchar_minmax_index (const gsl_vector_uchar * v, size_t * imin, size_t * imax);
+
+int gsl_vector_uchar_add (gsl_vector_uchar * a, const gsl_vector_uchar * b);
+int gsl_vector_uchar_sub (gsl_vector_uchar * a, const gsl_vector_uchar * b);
+int gsl_vector_uchar_mul (gsl_vector_uchar * a, const gsl_vector_uchar * b);
+int gsl_vector_uchar_div (gsl_vector_uchar * a, const gsl_vector_uchar * b);
+int gsl_vector_uchar_scale (gsl_vector_uchar * a, const double x);
+int gsl_vector_uchar_add_constant (gsl_vector_uchar * a, const double x);
+
+int gsl_vector_uchar_isnull (const gsl_vector_uchar * v);
+int gsl_vector_uchar_ispos (const gsl_vector_uchar * v);
+int gsl_vector_uchar_isneg (const gsl_vector_uchar * v);
+
+#ifdef HAVE_INLINE
+
+extern inline
+unsigned char
+gsl_vector_uchar_get (const gsl_vector_uchar * v, const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_VAL ("index out of range", GSL_EINVAL, 0);
+ }
+#endif
+ return v->data[i * v->stride];
+}
+
+extern inline
+void
+gsl_vector_uchar_set (gsl_vector_uchar * v, const size_t i, unsigned char x)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_VOID ("index out of range", GSL_EINVAL);
+ }
+#endif
+ v->data[i * v->stride] = x;
+}
+
+extern inline
+unsigned char *
+gsl_vector_uchar_ptr (gsl_vector_uchar * v, const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_NULL ("index out of range", GSL_EINVAL);
+ }
+#endif
+ return (unsigned char *) (v->data + i * v->stride);
+}
+
+extern inline
+const unsigned char *
+gsl_vector_uchar_const_ptr (const gsl_vector_uchar * v, const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_NULL ("index out of range", GSL_EINVAL);
+ }
+#endif
+ return (const unsigned char *) (v->data + i * v->stride);
+}
+
+
+#endif /* HAVE_INLINE */
+
+__END_DECLS
+
+#endif /* __GSL_VECTOR_UCHAR_H__ */
+
+
diff --git a/gsl-1.9/vector/gsl_vector_uint.h b/gsl-1.9/vector/gsl_vector_uint.h
new file mode 100644
index 0000000..2394ff2
--- /dev/null
+++ b/gsl-1.9/vector/gsl_vector_uint.h
@@ -0,0 +1,228 @@
+/* vector/gsl_vector_uint.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_VECTOR_UINT_H__
+#define __GSL_VECTOR_UINT_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_types.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_check_range.h>
+#include <gsl/gsl_block_uint.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+typedef struct
+{
+ size_t size;
+ size_t stride;
+ unsigned int *data;
+ gsl_block_uint *block;
+ int owner;
+}
+gsl_vector_uint;
+
+typedef struct
+{
+ gsl_vector_uint vector;
+} _gsl_vector_uint_view;
+
+typedef _gsl_vector_uint_view gsl_vector_uint_view;
+
+typedef struct
+{
+ gsl_vector_uint vector;
+} _gsl_vector_uint_const_view;
+
+typedef const _gsl_vector_uint_const_view gsl_vector_uint_const_view;
+
+
+/* Allocation */
+
+gsl_vector_uint *gsl_vector_uint_alloc (const size_t n);
+gsl_vector_uint *gsl_vector_uint_calloc (const size_t n);
+
+gsl_vector_uint *gsl_vector_uint_alloc_from_block (gsl_block_uint * b,
+ const size_t offset,
+ const size_t n,
+ const size_t stride);
+
+gsl_vector_uint *gsl_vector_uint_alloc_from_vector (gsl_vector_uint * v,
+ const size_t offset,
+ const size_t n,
+ const size_t stride);
+
+void gsl_vector_uint_free (gsl_vector_uint * v);
+
+/* Views */
+
+_gsl_vector_uint_view
+gsl_vector_uint_view_array (unsigned int *v, size_t n);
+
+_gsl_vector_uint_view
+gsl_vector_uint_view_array_with_stride (unsigned int *base,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_uint_const_view
+gsl_vector_uint_const_view_array (const unsigned int *v, size_t n);
+
+_gsl_vector_uint_const_view
+gsl_vector_uint_const_view_array_with_stride (const unsigned int *base,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_uint_view
+gsl_vector_uint_subvector (gsl_vector_uint *v,
+ size_t i,
+ size_t n);
+
+_gsl_vector_uint_view
+gsl_vector_uint_subvector_with_stride (gsl_vector_uint *v,
+ size_t i,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_uint_const_view
+gsl_vector_uint_const_subvector (const gsl_vector_uint *v,
+ size_t i,
+ size_t n);
+
+_gsl_vector_uint_const_view
+gsl_vector_uint_const_subvector_with_stride (const gsl_vector_uint *v,
+ size_t i,
+ size_t stride,
+ size_t n);
+
+/* Operations */
+
+unsigned int gsl_vector_uint_get (const gsl_vector_uint * v, const size_t i);
+void gsl_vector_uint_set (gsl_vector_uint * v, const size_t i, unsigned int x);
+
+unsigned int *gsl_vector_uint_ptr (gsl_vector_uint * v, const size_t i);
+const unsigned int *gsl_vector_uint_const_ptr (const gsl_vector_uint * v, const size_t i);
+
+void gsl_vector_uint_set_zero (gsl_vector_uint * v);
+void gsl_vector_uint_set_all (gsl_vector_uint * v, unsigned int x);
+int gsl_vector_uint_set_basis (gsl_vector_uint * v, size_t i);
+
+int gsl_vector_uint_fread (FILE * stream, gsl_vector_uint * v);
+int gsl_vector_uint_fwrite (FILE * stream, const gsl_vector_uint * v);
+int gsl_vector_uint_fscanf (FILE * stream, gsl_vector_uint * v);
+int gsl_vector_uint_fprintf (FILE * stream, const gsl_vector_uint * v,
+ const char *format);
+
+int gsl_vector_uint_memcpy (gsl_vector_uint * dest, const gsl_vector_uint * src);
+
+int gsl_vector_uint_reverse (gsl_vector_uint * v);
+
+int gsl_vector_uint_swap (gsl_vector_uint * v, gsl_vector_uint * w);
+int gsl_vector_uint_swap_elements (gsl_vector_uint * v, const size_t i, const size_t j);
+
+unsigned int gsl_vector_uint_max (const gsl_vector_uint * v);
+unsigned int gsl_vector_uint_min (const gsl_vector_uint * v);
+void gsl_vector_uint_minmax (const gsl_vector_uint * v, unsigned int * min_out, unsigned int * max_out);
+
+size_t gsl_vector_uint_max_index (const gsl_vector_uint * v);
+size_t gsl_vector_uint_min_index (const gsl_vector_uint * v);
+void gsl_vector_uint_minmax_index (const gsl_vector_uint * v, size_t * imin, size_t * imax);
+
+int gsl_vector_uint_add (gsl_vector_uint * a, const gsl_vector_uint * b);
+int gsl_vector_uint_sub (gsl_vector_uint * a, const gsl_vector_uint * b);
+int gsl_vector_uint_mul (gsl_vector_uint * a, const gsl_vector_uint * b);
+int gsl_vector_uint_div (gsl_vector_uint * a, const gsl_vector_uint * b);
+int gsl_vector_uint_scale (gsl_vector_uint * a, const double x);
+int gsl_vector_uint_add_constant (gsl_vector_uint * a, const double x);
+
+int gsl_vector_uint_isnull (const gsl_vector_uint * v);
+int gsl_vector_uint_ispos (const gsl_vector_uint * v);
+int gsl_vector_uint_isneg (const gsl_vector_uint * v);
+
+#ifdef HAVE_INLINE
+
+extern inline
+unsigned int
+gsl_vector_uint_get (const gsl_vector_uint * v, const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_VAL ("index out of range", GSL_EINVAL, 0);
+ }
+#endif
+ return v->data[i * v->stride];
+}
+
+extern inline
+void
+gsl_vector_uint_set (gsl_vector_uint * v, const size_t i, unsigned int x)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_VOID ("index out of range", GSL_EINVAL);
+ }
+#endif
+ v->data[i * v->stride] = x;
+}
+
+extern inline
+unsigned int *
+gsl_vector_uint_ptr (gsl_vector_uint * v, const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_NULL ("index out of range", GSL_EINVAL);
+ }
+#endif
+ return (unsigned int *) (v->data + i * v->stride);
+}
+
+extern inline
+const unsigned int *
+gsl_vector_uint_const_ptr (const gsl_vector_uint * v, const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_NULL ("index out of range", GSL_EINVAL);
+ }
+#endif
+ return (const unsigned int *) (v->data + i * v->stride);
+}
+
+
+#endif /* HAVE_INLINE */
+
+__END_DECLS
+
+#endif /* __GSL_VECTOR_UINT_H__ */
+
+
diff --git a/gsl-1.9/vector/gsl_vector_ulong.h b/gsl-1.9/vector/gsl_vector_ulong.h
new file mode 100644
index 0000000..db0ae76
--- /dev/null
+++ b/gsl-1.9/vector/gsl_vector_ulong.h
@@ -0,0 +1,228 @@
+/* vector/gsl_vector_ulong.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_VECTOR_ULONG_H__
+#define __GSL_VECTOR_ULONG_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_types.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_check_range.h>
+#include <gsl/gsl_block_ulong.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+typedef struct
+{
+ size_t size;
+ size_t stride;
+ unsigned long *data;
+ gsl_block_ulong *block;
+ int owner;
+}
+gsl_vector_ulong;
+
+typedef struct
+{
+ gsl_vector_ulong vector;
+} _gsl_vector_ulong_view;
+
+typedef _gsl_vector_ulong_view gsl_vector_ulong_view;
+
+typedef struct
+{
+ gsl_vector_ulong vector;
+} _gsl_vector_ulong_const_view;
+
+typedef const _gsl_vector_ulong_const_view gsl_vector_ulong_const_view;
+
+
+/* Allocation */
+
+gsl_vector_ulong *gsl_vector_ulong_alloc (const size_t n);
+gsl_vector_ulong *gsl_vector_ulong_calloc (const size_t n);
+
+gsl_vector_ulong *gsl_vector_ulong_alloc_from_block (gsl_block_ulong * b,
+ const size_t offset,
+ const size_t n,
+ const size_t stride);
+
+gsl_vector_ulong *gsl_vector_ulong_alloc_from_vector (gsl_vector_ulong * v,
+ const size_t offset,
+ const size_t n,
+ const size_t stride);
+
+void gsl_vector_ulong_free (gsl_vector_ulong * v);
+
+/* Views */
+
+_gsl_vector_ulong_view
+gsl_vector_ulong_view_array (unsigned long *v, size_t n);
+
+_gsl_vector_ulong_view
+gsl_vector_ulong_view_array_with_stride (unsigned long *base,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_ulong_const_view
+gsl_vector_ulong_const_view_array (const unsigned long *v, size_t n);
+
+_gsl_vector_ulong_const_view
+gsl_vector_ulong_const_view_array_with_stride (const unsigned long *base,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_ulong_view
+gsl_vector_ulong_subvector (gsl_vector_ulong *v,
+ size_t i,
+ size_t n);
+
+_gsl_vector_ulong_view
+gsl_vector_ulong_subvector_with_stride (gsl_vector_ulong *v,
+ size_t i,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_ulong_const_view
+gsl_vector_ulong_const_subvector (const gsl_vector_ulong *v,
+ size_t i,
+ size_t n);
+
+_gsl_vector_ulong_const_view
+gsl_vector_ulong_const_subvector_with_stride (const gsl_vector_ulong *v,
+ size_t i,
+ size_t stride,
+ size_t n);
+
+/* Operations */
+
+unsigned long gsl_vector_ulong_get (const gsl_vector_ulong * v, const size_t i);
+void gsl_vector_ulong_set (gsl_vector_ulong * v, const size_t i, unsigned long x);
+
+unsigned long *gsl_vector_ulong_ptr (gsl_vector_ulong * v, const size_t i);
+const unsigned long *gsl_vector_ulong_const_ptr (const gsl_vector_ulong * v, const size_t i);
+
+void gsl_vector_ulong_set_zero (gsl_vector_ulong * v);
+void gsl_vector_ulong_set_all (gsl_vector_ulong * v, unsigned long x);
+int gsl_vector_ulong_set_basis (gsl_vector_ulong * v, size_t i);
+
+int gsl_vector_ulong_fread (FILE * stream, gsl_vector_ulong * v);
+int gsl_vector_ulong_fwrite (FILE * stream, const gsl_vector_ulong * v);
+int gsl_vector_ulong_fscanf (FILE * stream, gsl_vector_ulong * v);
+int gsl_vector_ulong_fprintf (FILE * stream, const gsl_vector_ulong * v,
+ const char *format);
+
+int gsl_vector_ulong_memcpy (gsl_vector_ulong * dest, const gsl_vector_ulong * src);
+
+int gsl_vector_ulong_reverse (gsl_vector_ulong * v);
+
+int gsl_vector_ulong_swap (gsl_vector_ulong * v, gsl_vector_ulong * w);
+int gsl_vector_ulong_swap_elements (gsl_vector_ulong * v, const size_t i, const size_t j);
+
+unsigned long gsl_vector_ulong_max (const gsl_vector_ulong * v);
+unsigned long gsl_vector_ulong_min (const gsl_vector_ulong * v);
+void gsl_vector_ulong_minmax (const gsl_vector_ulong * v, unsigned long * min_out, unsigned long * max_out);
+
+size_t gsl_vector_ulong_max_index (const gsl_vector_ulong * v);
+size_t gsl_vector_ulong_min_index (const gsl_vector_ulong * v);
+void gsl_vector_ulong_minmax_index (const gsl_vector_ulong * v, size_t * imin, size_t * imax);
+
+int gsl_vector_ulong_add (gsl_vector_ulong * a, const gsl_vector_ulong * b);
+int gsl_vector_ulong_sub (gsl_vector_ulong * a, const gsl_vector_ulong * b);
+int gsl_vector_ulong_mul (gsl_vector_ulong * a, const gsl_vector_ulong * b);
+int gsl_vector_ulong_div (gsl_vector_ulong * a, const gsl_vector_ulong * b);
+int gsl_vector_ulong_scale (gsl_vector_ulong * a, const double x);
+int gsl_vector_ulong_add_constant (gsl_vector_ulong * a, const double x);
+
+int gsl_vector_ulong_isnull (const gsl_vector_ulong * v);
+int gsl_vector_ulong_ispos (const gsl_vector_ulong * v);
+int gsl_vector_ulong_isneg (const gsl_vector_ulong * v);
+
+#ifdef HAVE_INLINE
+
+extern inline
+unsigned long
+gsl_vector_ulong_get (const gsl_vector_ulong * v, const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_VAL ("index out of range", GSL_EINVAL, 0);
+ }
+#endif
+ return v->data[i * v->stride];
+}
+
+extern inline
+void
+gsl_vector_ulong_set (gsl_vector_ulong * v, const size_t i, unsigned long x)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_VOID ("index out of range", GSL_EINVAL);
+ }
+#endif
+ v->data[i * v->stride] = x;
+}
+
+extern inline
+unsigned long *
+gsl_vector_ulong_ptr (gsl_vector_ulong * v, const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_NULL ("index out of range", GSL_EINVAL);
+ }
+#endif
+ return (unsigned long *) (v->data + i * v->stride);
+}
+
+extern inline
+const unsigned long *
+gsl_vector_ulong_const_ptr (const gsl_vector_ulong * v, const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_NULL ("index out of range", GSL_EINVAL);
+ }
+#endif
+ return (const unsigned long *) (v->data + i * v->stride);
+}
+
+
+#endif /* HAVE_INLINE */
+
+__END_DECLS
+
+#endif /* __GSL_VECTOR_ULONG_H__ */
+
+
diff --git a/gsl-1.9/vector/gsl_vector_ushort.h b/gsl-1.9/vector/gsl_vector_ushort.h
new file mode 100644
index 0000000..5e04748
--- /dev/null
+++ b/gsl-1.9/vector/gsl_vector_ushort.h
@@ -0,0 +1,228 @@
+/* vector/gsl_vector_ushort.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_VECTOR_USHORT_H__
+#define __GSL_VECTOR_USHORT_H__
+
+#include <stdlib.h>
+#include <gsl/gsl_types.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_check_range.h>
+#include <gsl/gsl_block_ushort.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+typedef struct
+{
+ size_t size;
+ size_t stride;
+ unsigned short *data;
+ gsl_block_ushort *block;
+ int owner;
+}
+gsl_vector_ushort;
+
+typedef struct
+{
+ gsl_vector_ushort vector;
+} _gsl_vector_ushort_view;
+
+typedef _gsl_vector_ushort_view gsl_vector_ushort_view;
+
+typedef struct
+{
+ gsl_vector_ushort vector;
+} _gsl_vector_ushort_const_view;
+
+typedef const _gsl_vector_ushort_const_view gsl_vector_ushort_const_view;
+
+
+/* Allocation */
+
+gsl_vector_ushort *gsl_vector_ushort_alloc (const size_t n);
+gsl_vector_ushort *gsl_vector_ushort_calloc (const size_t n);
+
+gsl_vector_ushort *gsl_vector_ushort_alloc_from_block (gsl_block_ushort * b,
+ const size_t offset,
+ const size_t n,
+ const size_t stride);
+
+gsl_vector_ushort *gsl_vector_ushort_alloc_from_vector (gsl_vector_ushort * v,
+ const size_t offset,
+ const size_t n,
+ const size_t stride);
+
+void gsl_vector_ushort_free (gsl_vector_ushort * v);
+
+/* Views */
+
+_gsl_vector_ushort_view
+gsl_vector_ushort_view_array (unsigned short *v, size_t n);
+
+_gsl_vector_ushort_view
+gsl_vector_ushort_view_array_with_stride (unsigned short *base,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_ushort_const_view
+gsl_vector_ushort_const_view_array (const unsigned short *v, size_t n);
+
+_gsl_vector_ushort_const_view
+gsl_vector_ushort_const_view_array_with_stride (const unsigned short *base,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_ushort_view
+gsl_vector_ushort_subvector (gsl_vector_ushort *v,
+ size_t i,
+ size_t n);
+
+_gsl_vector_ushort_view
+gsl_vector_ushort_subvector_with_stride (gsl_vector_ushort *v,
+ size_t i,
+ size_t stride,
+ size_t n);
+
+_gsl_vector_ushort_const_view
+gsl_vector_ushort_const_subvector (const gsl_vector_ushort *v,
+ size_t i,
+ size_t n);
+
+_gsl_vector_ushort_const_view
+gsl_vector_ushort_const_subvector_with_stride (const gsl_vector_ushort *v,
+ size_t i,
+ size_t stride,
+ size_t n);
+
+/* Operations */
+
+unsigned short gsl_vector_ushort_get (const gsl_vector_ushort * v, const size_t i);
+void gsl_vector_ushort_set (gsl_vector_ushort * v, const size_t i, unsigned short x);
+
+unsigned short *gsl_vector_ushort_ptr (gsl_vector_ushort * v, const size_t i);
+const unsigned short *gsl_vector_ushort_const_ptr (const gsl_vector_ushort * v, const size_t i);
+
+void gsl_vector_ushort_set_zero (gsl_vector_ushort * v);
+void gsl_vector_ushort_set_all (gsl_vector_ushort * v, unsigned short x);
+int gsl_vector_ushort_set_basis (gsl_vector_ushort * v, size_t i);
+
+int gsl_vector_ushort_fread (FILE * stream, gsl_vector_ushort * v);
+int gsl_vector_ushort_fwrite (FILE * stream, const gsl_vector_ushort * v);
+int gsl_vector_ushort_fscanf (FILE * stream, gsl_vector_ushort * v);
+int gsl_vector_ushort_fprintf (FILE * stream, const gsl_vector_ushort * v,
+ const char *format);
+
+int gsl_vector_ushort_memcpy (gsl_vector_ushort * dest, const gsl_vector_ushort * src);
+
+int gsl_vector_ushort_reverse (gsl_vector_ushort * v);
+
+int gsl_vector_ushort_swap (gsl_vector_ushort * v, gsl_vector_ushort * w);
+int gsl_vector_ushort_swap_elements (gsl_vector_ushort * v, const size_t i, const size_t j);
+
+unsigned short gsl_vector_ushort_max (const gsl_vector_ushort * v);
+unsigned short gsl_vector_ushort_min (const gsl_vector_ushort * v);
+void gsl_vector_ushort_minmax (const gsl_vector_ushort * v, unsigned short * min_out, unsigned short * max_out);
+
+size_t gsl_vector_ushort_max_index (const gsl_vector_ushort * v);
+size_t gsl_vector_ushort_min_index (const gsl_vector_ushort * v);
+void gsl_vector_ushort_minmax_index (const gsl_vector_ushort * v, size_t * imin, size_t * imax);
+
+int gsl_vector_ushort_add (gsl_vector_ushort * a, const gsl_vector_ushort * b);
+int gsl_vector_ushort_sub (gsl_vector_ushort * a, const gsl_vector_ushort * b);
+int gsl_vector_ushort_mul (gsl_vector_ushort * a, const gsl_vector_ushort * b);
+int gsl_vector_ushort_div (gsl_vector_ushort * a, const gsl_vector_ushort * b);
+int gsl_vector_ushort_scale (gsl_vector_ushort * a, const double x);
+int gsl_vector_ushort_add_constant (gsl_vector_ushort * a, const double x);
+
+int gsl_vector_ushort_isnull (const gsl_vector_ushort * v);
+int gsl_vector_ushort_ispos (const gsl_vector_ushort * v);
+int gsl_vector_ushort_isneg (const gsl_vector_ushort * v);
+
+#ifdef HAVE_INLINE
+
+extern inline
+unsigned short
+gsl_vector_ushort_get (const gsl_vector_ushort * v, const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_VAL ("index out of range", GSL_EINVAL, 0);
+ }
+#endif
+ return v->data[i * v->stride];
+}
+
+extern inline
+void
+gsl_vector_ushort_set (gsl_vector_ushort * v, const size_t i, unsigned short x)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_VOID ("index out of range", GSL_EINVAL);
+ }
+#endif
+ v->data[i * v->stride] = x;
+}
+
+extern inline
+unsigned short *
+gsl_vector_ushort_ptr (gsl_vector_ushort * v, const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_NULL ("index out of range", GSL_EINVAL);
+ }
+#endif
+ return (unsigned short *) (v->data + i * v->stride);
+}
+
+extern inline
+const unsigned short *
+gsl_vector_ushort_const_ptr (const gsl_vector_ushort * v, const size_t i)
+{
+#if GSL_RANGE_CHECK
+ if (i >= v->size)
+ {
+ GSL_ERROR_NULL ("index out of range", GSL_EINVAL);
+ }
+#endif
+ return (const unsigned short *) (v->data + i * v->stride);
+}
+
+
+#endif /* HAVE_INLINE */
+
+__END_DECLS
+
+#endif /* __GSL_VECTOR_USHORT_H__ */
+
+
diff --git a/gsl-1.9/vector/init.c b/gsl-1.9/vector/init.c
new file mode 100644
index 0000000..5f3b000
--- /dev/null
+++ b/gsl-1.9/vector/init.c
@@ -0,0 +1,87 @@
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_vector.h>
+
+#define BASE_GSL_COMPLEX_LONG
+#include "templates_on.h"
+#include "init_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_LONG
+
+#define BASE_GSL_COMPLEX
+#include "templates_on.h"
+#include "init_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX
+
+#define BASE_GSL_COMPLEX_FLOAT
+#include "templates_on.h"
+#include "init_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_FLOAT
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "init_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "init_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "init_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "init_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "init_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "init_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "init_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "init_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "init_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "init_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "init_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
diff --git a/gsl-1.9/vector/init_source.c b/gsl-1.9/vector/init_source.c
new file mode 100644
index 0000000..b3dca82
--- /dev/null
+++ b/gsl-1.9/vector/init_source.c
@@ -0,0 +1,228 @@
+/* vector/init_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+TYPE (gsl_vector) *
+FUNCTION (gsl_vector, alloc) (const size_t n)
+{
+ TYPE (gsl_block) * block;
+ TYPE (gsl_vector) * v;
+
+ if (n == 0)
+ {
+ GSL_ERROR_VAL ("vector length n must be positive integer",
+ GSL_EINVAL, 0);
+ }
+
+ v = (TYPE (gsl_vector) *) malloc (sizeof (TYPE (gsl_vector)));
+
+ if (v == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for vector struct",
+ GSL_ENOMEM, 0);
+ }
+
+ block = FUNCTION (gsl_block,alloc) (n);
+
+ if (block == 0)
+ {
+ free (v) ;
+
+ GSL_ERROR_VAL ("failed to allocate space for block",
+ GSL_ENOMEM, 0);
+ }
+
+ v->data = block->data ;
+ v->size = n;
+ v->stride = 1;
+ v->block = block;
+ v->owner = 1;
+
+ return v;
+}
+
+TYPE (gsl_vector) *
+FUNCTION (gsl_vector, calloc) (const size_t n)
+{
+ size_t i;
+
+ TYPE (gsl_vector) * v = FUNCTION (gsl_vector, alloc) (n);
+
+ if (v == 0)
+ return 0;
+
+ /* initialize vector to zero */
+
+ for (i = 0; i < MULTIPLICITY * n; i++)
+ {
+ v->data[i] = 0;
+ }
+
+ return v;
+}
+
+TYPE (gsl_vector) *
+FUNCTION (gsl_vector, alloc_from_block) (TYPE(gsl_block) * block,
+ const size_t offset,
+ const size_t n,
+ const size_t stride)
+{
+ TYPE (gsl_vector) * v;
+
+ if (n == 0)
+ {
+ GSL_ERROR_VAL ("vector length n must be positive integer",
+ GSL_EINVAL, 0);
+ }
+
+ if (stride == 0)
+ {
+ GSL_ERROR_VAL ("stride must be positive integer", GSL_EINVAL, 0);
+ }
+
+ if (block->size <= offset + (n - 1) * stride)
+ {
+ GSL_ERROR_VAL ("vector would extend past end of block", GSL_EINVAL, 0);
+ }
+
+ v = (TYPE (gsl_vector) *) malloc (sizeof (TYPE (gsl_vector)));
+
+ if (v == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for vector struct",
+ GSL_ENOMEM, 0);
+ }
+
+ v->data = block->data + MULTIPLICITY * offset ;
+ v->size = n;
+ v->stride = stride;
+ v->block = block;
+ v->owner = 0;
+
+ return v;
+}
+
+TYPE (gsl_vector) *
+FUNCTION (gsl_vector, alloc_from_vector) (TYPE(gsl_vector) * w,
+ const size_t offset,
+ const size_t n,
+ const size_t stride)
+{
+ TYPE (gsl_vector) * v;
+
+ if (n == 0)
+ {
+ GSL_ERROR_VAL ("vector length n must be positive integer",
+ GSL_EINVAL, 0);
+ }
+
+ if (stride == 0)
+ {
+ GSL_ERROR_VAL ("stride must be positive integer", GSL_EINVAL, 0);
+ }
+
+ if (offset + (n - 1) * stride >= w->size)
+ {
+ GSL_ERROR_VAL ("vector would extend past end of block", GSL_EINVAL, 0);
+ }
+
+ v = (TYPE (gsl_vector) *) malloc (sizeof (TYPE (gsl_vector)));
+
+ if (v == 0)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for vector struct",
+ GSL_ENOMEM, 0);
+ }
+
+ v->data = w->data + MULTIPLICITY * w->stride * offset ;
+ v->size = n;
+ v->stride = stride * w->stride;
+ v->block = w->block;
+ v->owner = 0;
+
+ return v;
+}
+
+
+void
+FUNCTION (gsl_vector, free) (TYPE (gsl_vector) * v)
+{
+ if (v->owner)
+ {
+ FUNCTION(gsl_block, free) (v->block) ;
+ }
+ free (v);
+}
+
+
+void
+FUNCTION (gsl_vector, set_all) (TYPE (gsl_vector) * v, BASE x)
+{
+ ATOMIC * const data = v->data;
+ const size_t n = v->size;
+ const size_t stride = v->stride;
+
+ size_t i;
+
+ for (i = 0; i < n; i++)
+ {
+ *(BASE *) (data + MULTIPLICITY * i * stride) = x;
+ }
+}
+
+void
+FUNCTION (gsl_vector, set_zero) (TYPE (gsl_vector) * v)
+{
+ ATOMIC * const data = v->data;
+ const size_t n = v->size;
+ const size_t stride = v->stride;
+ const BASE zero = ZERO ;
+
+ size_t i;
+
+ for (i = 0; i < n; i++)
+ {
+ *(BASE *) (data + MULTIPLICITY * i * stride) = zero;
+ }
+}
+
+int
+FUNCTION (gsl_vector, set_basis) (TYPE (gsl_vector) * v, size_t i)
+{
+ ATOMIC * const data = v->data;
+ const size_t n = v->size;
+ const size_t stride = v->stride;
+ const BASE zero = ZERO ;
+ const BASE one = ONE;
+
+ size_t k;
+
+ if (i >= n)
+ {
+ GSL_ERROR ("index out of range", GSL_EINVAL);
+ }
+
+ for (k = 0; k < n; k++)
+ {
+ *(BASE *) (data + MULTIPLICITY * k * stride) = zero;
+ }
+
+ *(BASE *) (data + MULTIPLICITY * i * stride) = one;
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/vector/minmax.c b/gsl-1.9/vector/minmax.c
new file mode 100644
index 0000000..27ee8db
--- /dev/null
+++ b/gsl-1.9/vector/minmax.c
@@ -0,0 +1,72 @@
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_vector.h>
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "minmax_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "minmax_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "minmax_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "minmax_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "minmax_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "minmax_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "minmax_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "minmax_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "minmax_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "minmax_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "minmax_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
+
+
diff --git a/gsl-1.9/vector/minmax_source.c b/gsl-1.9/vector/minmax_source.c
new file mode 100644
index 0000000..4fbd86e
--- /dev/null
+++ b/gsl-1.9/vector/minmax_source.c
@@ -0,0 +1,217 @@
+/* vector/minmax_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+BASE
+FUNCTION(gsl_vector,max) (const TYPE(gsl_vector) * v)
+{
+ /* finds the largest element of a vector */
+
+ const size_t N = v->size ;
+ const size_t stride = v->stride ;
+
+ BASE max = v->data[0 * stride];
+ size_t i;
+
+ for (i = 0; i < N; i++)
+ {
+ BASE x = v->data[i*stride];
+ if (x > max)
+ max = x;
+#ifdef FP
+ if (isnan (x))
+ return x;
+#endif
+ }
+
+ return max;
+}
+
+BASE
+FUNCTION(gsl_vector,min) (const TYPE(gsl_vector) * v)
+{
+ /* finds the smallest element of a vector */
+
+ const size_t N = v->size ;
+ const size_t stride = v->stride ;
+
+ BASE min = v->data[0 * stride];
+ size_t i;
+
+ for (i = 0; i < N; i++)
+ {
+ BASE x = v->data[i*stride];
+ if (x < min)
+ min = x;
+#ifdef FP
+ if (isnan (x))
+ return x;
+#endif
+ }
+
+ return min;
+}
+
+void
+FUNCTION(gsl_vector,minmax) (const TYPE(gsl_vector) * v,
+ BASE * min_out,
+ BASE * max_out)
+{
+ /* finds the smallest and largest elements of a vector */
+
+ const size_t N = v->size ;
+ const size_t stride = v->stride ;
+
+ BASE max = v->data[0 * stride];
+ BASE min = v->data[0 * stride];
+
+ size_t i;
+
+ for (i = 0; i < N; i++)
+ {
+ BASE x = v->data[i*stride];
+ if (x < min)
+ {
+ min = x;
+ }
+ if (x > max)
+ {
+ max = x;
+ }
+#ifdef FP
+ if (isnan (x))
+ {
+ min = x;
+ max = x;
+ break;
+ }
+#endif
+ }
+
+ *min_out = min;
+ *max_out = max;
+}
+
+
+size_t
+FUNCTION(gsl_vector,max_index) (const TYPE(gsl_vector) * v)
+{
+ /* finds the largest element of a vector */
+
+ const size_t N = v->size ;
+ const size_t stride = v->stride ;
+
+ BASE max = v->data[0 * stride];
+ size_t imax = 0;
+ size_t i;
+
+ for (i = 0; i < N; i++)
+ {
+ BASE x = v->data[i*stride];
+ if (x > max)
+ {
+ max = x;
+ imax = i;
+ }
+#ifdef FP
+ if (isnan (x))
+ {
+ return i;
+ }
+#endif
+ }
+
+ return imax;
+}
+
+size_t
+FUNCTION(gsl_vector,min_index) (const TYPE(gsl_vector) * v)
+{
+ /* finds the smallest element of a vector */
+
+ const size_t N = v->size ;
+ const size_t stride = v->stride ;
+
+ BASE min = v->data[0 * stride];
+ size_t imin = 0;
+ size_t i;
+
+ for (i = 0; i < N; i++)
+ {
+ BASE x = v->data[i*stride];
+ if (x < min)
+ {
+ min = x;
+ imin = i;
+ }
+#ifdef FP
+ if (isnan (x))
+ {
+ return i;
+ }
+#endif
+ }
+
+ return imin;
+}
+
+
+void
+FUNCTION(gsl_vector,minmax_index) (const TYPE(gsl_vector) * v,
+ size_t * imin_out,
+ size_t * imax_out)
+{
+ /* finds the smallest and largest elements of a vector */
+
+ const size_t N = v->size ;
+ const size_t stride = v->stride ;
+
+ size_t imin = 0, imax = 0;
+ BASE max = v->data[0 * stride];
+ BASE min = v->data[0 * stride];
+
+ size_t i;
+
+ for (i = 0; i < N; i++)
+ {
+ BASE x = v->data[i*stride];
+ if (x < min)
+ {
+ min = x;
+ imin = i;
+ }
+ if (x > max)
+ {
+ max = x;
+ imax = i;
+ }
+#ifdef FP
+ if (isnan (x))
+ {
+ imin = i;
+ imax = i;
+ break;
+ }
+#endif
+ }
+
+ *imin_out = imin;
+ *imax_out = imax;
+}
+
+
diff --git a/gsl-1.9/vector/oper.c b/gsl-1.9/vector/oper.c
new file mode 100644
index 0000000..ded3922
--- /dev/null
+++ b/gsl-1.9/vector/oper.c
@@ -0,0 +1,71 @@
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_vector.h>
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "oper_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "oper_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "oper_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "oper_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "oper_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "oper_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "oper_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "oper_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "oper_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "oper_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "oper_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
+
+
diff --git a/gsl-1.9/vector/oper_source.c b/gsl-1.9/vector/oper_source.c
new file mode 100644
index 0000000..e60bae3
--- /dev/null
+++ b/gsl-1.9/vector/oper_source.c
@@ -0,0 +1,150 @@
+/* vector/oper_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+int
+FUNCTION(gsl_vector, add) (TYPE(gsl_vector) * a, const TYPE(gsl_vector) * b)
+{
+ const size_t N = a->size;
+
+ if (b->size != N)
+ {
+ GSL_ERROR ("vectors must have same length", GSL_EBADLEN);
+ }
+ else
+ {
+ const size_t stride_a = a->stride;
+ const size_t stride_b = b->stride;
+
+ size_t i;
+
+ for (i = 0; i < N; i++)
+ {
+ a->data[i * stride_a] += b->data[i * stride_b];
+ }
+
+ return GSL_SUCCESS;
+ }
+}
+
+int
+FUNCTION(gsl_vector, sub) (TYPE(gsl_vector) * a, const TYPE(gsl_vector) * b)
+{
+ const size_t N = a->size;
+
+ if (b->size != N)
+ {
+ GSL_ERROR ("vectors must have same length", GSL_EBADLEN);
+ }
+ else
+ {
+ const size_t stride_a = a->stride;
+ const size_t stride_b = b->stride;
+
+ size_t i;
+
+ for (i = 0; i < N; i++)
+ {
+ a->data[i * stride_a] -= b->data[i * stride_b];
+ }
+
+ return GSL_SUCCESS;
+ }
+}
+
+int
+FUNCTION(gsl_vector, mul) (TYPE(gsl_vector) * a, const TYPE(gsl_vector) * b)
+{
+ const size_t N = a->size;
+
+ if (b->size != N)
+ {
+ GSL_ERROR ("vectors must have same length", GSL_EBADLEN);
+ }
+ else
+ {
+ const size_t stride_a = a->stride;
+ const size_t stride_b = b->stride;
+
+ size_t i;
+
+ for (i = 0; i < N; i++)
+ {
+ a->data[i * stride_a] *= b->data[i * stride_b];
+ }
+
+ return GSL_SUCCESS;
+ }
+}
+
+int
+FUNCTION(gsl_vector, div) (TYPE(gsl_vector) * a, const TYPE(gsl_vector) * b)
+{
+ const size_t N = a->size;
+
+ if (b->size != N)
+ {
+ GSL_ERROR ("vectors must have same length", GSL_EBADLEN);
+ }
+ else
+ {
+ const size_t stride_a = a->stride;
+ const size_t stride_b = b->stride;
+
+ size_t i;
+
+ for (i = 0; i < N; i++)
+ {
+ a->data[i * stride_a] /= b->data[i * stride_b];
+ }
+
+ return GSL_SUCCESS;
+ }
+}
+
+int
+FUNCTION(gsl_vector, scale) (TYPE(gsl_vector) * a, const double x)
+{
+ const size_t N = a->size;
+ const size_t stride = a->stride;
+
+ size_t i;
+
+ for (i = 0; i < N; i++)
+ {
+ a->data[i * stride] *= x;
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+FUNCTION(gsl_vector, add_constant) (TYPE(gsl_vector) * a, const double x)
+{
+ const size_t N = a->size;
+ const size_t stride = a->stride;
+
+ size_t i;
+
+ for (i = 0; i < N; i++)
+ {
+ a->data[i * stride] += x;
+ }
+
+ return GSL_SUCCESS;
+}
diff --git a/gsl-1.9/vector/prop.c b/gsl-1.9/vector/prop.c
new file mode 100644
index 0000000..eeb18d6
--- /dev/null
+++ b/gsl-1.9/vector/prop.c
@@ -0,0 +1,87 @@
+#include <config.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_errno.h>
+
+#define BASE_GSL_COMPLEX_LONG
+#include "templates_on.h"
+#include "prop_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_LONG
+
+#define BASE_GSL_COMPLEX
+#include "templates_on.h"
+#include "prop_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX
+
+#define BASE_GSL_COMPLEX_FLOAT
+#include "templates_on.h"
+#include "prop_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_FLOAT
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "prop_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "prop_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "prop_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "prop_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "prop_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "prop_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "prop_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "prop_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "prop_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "prop_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "prop_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
diff --git a/gsl-1.9/vector/prop_source.c b/gsl-1.9/vector/prop_source.c
new file mode 100644
index 0000000..9f1cf2f
--- /dev/null
+++ b/gsl-1.9/vector/prop_source.c
@@ -0,0 +1,91 @@
+/* vector/prop_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+int
+FUNCTION (gsl_vector, isnull) (const TYPE (gsl_vector) * v)
+{
+ const size_t n = v->size;
+ const size_t stride = v->stride ;
+
+ size_t j;
+
+ for (j = 0; j < n; j++)
+ {
+ size_t k;
+
+ for (k = 0; k < MULTIPLICITY; k++)
+ {
+ if (v->data[MULTIPLICITY * stride * j + k] != 0.0)
+ {
+ return 0;
+ }
+ }
+ }
+
+ return 1;
+}
+
+int
+FUNCTION (gsl_vector, ispos) (const TYPE (gsl_vector) * v)
+{
+ const size_t n = v->size;
+ const size_t stride = v->stride ;
+
+ size_t j;
+
+ for (j = 0; j < n; j++)
+ {
+ size_t k;
+
+ for (k = 0; k < MULTIPLICITY; k++)
+ {
+ if (v->data[MULTIPLICITY * stride * j + k] <= 0.0)
+ {
+ return 0;
+ }
+ }
+ }
+
+ return 1;
+}
+
+int
+FUNCTION (gsl_vector, isneg) (const TYPE (gsl_vector) * v)
+{
+ const size_t n = v->size;
+ const size_t stride = v->stride ;
+
+ size_t j;
+
+ for (j = 0; j < n; j++)
+ {
+ size_t k;
+
+ for (k = 0; k < MULTIPLICITY; k++)
+ {
+ if (v->data[MULTIPLICITY * stride * j + k] >= 0.0)
+ {
+ return 0;
+ }
+ }
+ }
+
+ return 1;
+}
+
diff --git a/gsl-1.9/vector/reim.c b/gsl-1.9/vector/reim.c
new file mode 100644
index 0000000..9271a1a
--- /dev/null
+++ b/gsl-1.9/vector/reim.c
@@ -0,0 +1,44 @@
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_vector.h>
+
+#include "view.h"
+
+#define BASE_GSL_COMPLEX_LONG
+#include "templates_on.h"
+#include "reim_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_LONG
+
+#define BASE_GSL_COMPLEX
+#include "templates_on.h"
+#include "reim_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX
+
+#define BASE_GSL_COMPLEX_FLOAT
+#include "templates_on.h"
+#include "reim_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_FLOAT
+
+#define USE_QUALIFIER
+#define QUALIFIER const
+
+#define BASE_GSL_COMPLEX_LONG
+#include "templates_on.h"
+#include "reim_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_LONG
+
+#define BASE_GSL_COMPLEX
+#include "templates_on.h"
+#include "reim_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX
+
+#define BASE_GSL_COMPLEX_FLOAT
+#include "templates_on.h"
+#include "reim_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_FLOAT
diff --git a/gsl-1.9/vector/reim_source.c b/gsl-1.9/vector/reim_source.c
new file mode 100644
index 0000000..452129e
--- /dev/null
+++ b/gsl-1.9/vector/reim_source.c
@@ -0,0 +1,56 @@
+/* vector/reim_source.c
+ *
+ * Copyright (C) 2001 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+QUALIFIED_REAL_VIEW(_gsl_vector, view)
+FUNCTION(gsl_vector, real) (QUALIFIED_TYPE(gsl_vector) * v)
+{
+ REAL_TYPE(gsl_vector) s = NULL_VECTOR;
+
+ s.data = v->data;
+ s.size = v->size;
+ s.stride = MULTIPLICITY * v->stride;
+ s.block = 0; /* FIXME: should be v->block, but cannot point to
+ block of different type */
+ s.owner = 0;
+
+ {
+ QUALIFIED_REAL_VIEW(_gsl_vector,view) view = NULL_VECTOR_VIEW;
+ view.vector = s;
+ return view;
+ }
+}
+
+QUALIFIED_REAL_VIEW(_gsl_vector, view)
+FUNCTION(gsl_vector, imag) (QUALIFIED_TYPE(gsl_vector) * v)
+{
+ REAL_TYPE(gsl_vector) s = NULL_VECTOR;
+
+ s.data = v->data + 1;
+ s.size = v->size;
+ s.stride = MULTIPLICITY * v->stride;
+ s.block = 0; /* FIXME: cannot point to block of different type */
+ s.owner = 0;
+
+ {
+ QUALIFIED_REAL_VIEW(_gsl_vector,view) view = NULL_VECTOR_VIEW;
+ view.vector = s;
+ return view;
+ }
+}
+
diff --git a/gsl-1.9/vector/subvector.c b/gsl-1.9/vector/subvector.c
new file mode 100644
index 0000000..5f6b83e
--- /dev/null
+++ b/gsl-1.9/vector/subvector.c
@@ -0,0 +1,176 @@
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_vector.h>
+
+#include "view.h"
+
+#define BASE_GSL_COMPLEX_LONG
+#include "templates_on.h"
+#include "subvector_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_LONG
+
+#define BASE_GSL_COMPLEX
+#include "templates_on.h"
+#include "subvector_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX
+
+#define BASE_GSL_COMPLEX_FLOAT
+#include "templates_on.h"
+#include "subvector_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_FLOAT
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "subvector_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "subvector_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "subvector_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "subvector_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "subvector_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "subvector_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "subvector_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "subvector_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "subvector_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "subvector_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "subvector_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
+
+#define USE_QUALIFIER
+#define QUALIFIER const
+
+#define BASE_GSL_COMPLEX_LONG
+#include "templates_on.h"
+#include "subvector_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_LONG
+
+#define BASE_GSL_COMPLEX
+#include "templates_on.h"
+#include "subvector_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX
+
+#define BASE_GSL_COMPLEX_FLOAT
+#include "templates_on.h"
+#include "subvector_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_FLOAT
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "subvector_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "subvector_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "subvector_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "subvector_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "subvector_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "subvector_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "subvector_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "subvector_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "subvector_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "subvector_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "subvector_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
diff --git a/gsl-1.9/vector/subvector_source.c b/gsl-1.9/vector/subvector_source.c
new file mode 100644
index 0000000..c7137ac
--- /dev/null
+++ b/gsl-1.9/vector/subvector_source.c
@@ -0,0 +1,86 @@
+/* vector/subvector_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+QUALIFIED_VIEW(_gsl_vector, view)
+FUNCTION(gsl_vector, subvector) (QUALIFIED_TYPE(gsl_vector) * v, size_t offset, size_t n)
+{
+ QUALIFIED_VIEW(_gsl_vector,view) view = NULL_VECTOR_VIEW;
+
+ if (n == 0)
+ {
+ GSL_ERROR_VAL ("vector length n must be positive integer",
+ GSL_EINVAL, view);
+ }
+
+ if (offset + (n - 1) >= v->size)
+ {
+ GSL_ERROR_VAL ("view would extend past end of vector",
+ GSL_EINVAL, view);
+ }
+
+ {
+ TYPE(gsl_vector) s = NULL_VECTOR;
+
+ s.data = v->data + MULTIPLICITY * v->stride * offset ;
+ s.size = n;
+ s.stride = v->stride;
+ s.block = v->block;
+ s.owner = 0;
+
+ view.vector = s;
+ return view;
+ }
+}
+
+QUALIFIED_VIEW(_gsl_vector, view)
+FUNCTION(gsl_vector, subvector_with_stride) (QUALIFIED_TYPE(gsl_vector) * v, size_t offset, size_t stride, size_t n)
+{
+ QUALIFIED_VIEW(_gsl_vector,view) view = NULL_VECTOR_VIEW;
+
+ if (n == 0)
+ {
+ GSL_ERROR_VAL ("vector length n must be positive integer",
+ GSL_EINVAL, view);
+ }
+
+ if (stride == 0)
+ {
+ GSL_ERROR_VAL ("stride must be positive integer",
+ GSL_EINVAL, view);
+ }
+
+ if (offset + (n - 1) * stride >= v->size)
+ {
+ GSL_ERROR_VAL ("view would extend past end of vector",
+ GSL_EINVAL, view);
+ }
+
+ {
+ TYPE(gsl_vector) s = NULL_VECTOR;
+
+ s.data = v->data + MULTIPLICITY * v->stride * offset ;
+ s.size = n;
+ s.stride = v->stride * stride;
+ s.block = v->block;
+ s.owner = 0;
+
+ view.vector = s;
+ return view;
+ }
+}
diff --git a/gsl-1.9/vector/swap.c b/gsl-1.9/vector/swap.c
new file mode 100644
index 0000000..226e983
--- /dev/null
+++ b/gsl-1.9/vector/swap.c
@@ -0,0 +1,87 @@
+#include <config.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_vector.h>
+
+#define BASE_GSL_COMPLEX_LONG
+#include "templates_on.h"
+#include "swap_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_LONG
+
+#define BASE_GSL_COMPLEX
+#include "templates_on.h"
+#include "swap_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX
+
+#define BASE_GSL_COMPLEX_FLOAT
+#include "templates_on.h"
+#include "swap_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_FLOAT
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "swap_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "swap_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "swap_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "swap_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "swap_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "swap_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "swap_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "swap_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "swap_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "swap_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "swap_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
diff --git a/gsl-1.9/vector/swap_source.c b/gsl-1.9/vector/swap_source.c
new file mode 100644
index 0000000..816cb6e
--- /dev/null
+++ b/gsl-1.9/vector/swap_source.c
@@ -0,0 +1,107 @@
+/* vector/swap_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+int
+FUNCTION (gsl_vector, swap) (TYPE (gsl_vector) * v, TYPE (gsl_vector) * w)
+{
+ ATOMIC * d1 = v->data ;
+ ATOMIC * d2 = w->data ;
+ const size_t size = v->size ;
+ const size_t s1 = MULTIPLICITY * v->stride ;
+ const size_t s2 = MULTIPLICITY * w->stride ;
+ size_t i, k ;
+
+ if (v->size != w->size)
+ {
+ GSL_ERROR("vector lengths must be equal", GSL_EINVAL);
+ }
+
+ for (i = 0; i < size; i++)
+ {
+ for (k = 0; k < MULTIPLICITY; k++)
+ {
+ ATOMIC tmp = d1[i*s1 + k];
+ d1[i*s1+k] = d2[i*s2 + k];
+ d2[i*s2+k] = tmp;
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+FUNCTION (gsl_vector, swap_elements) (TYPE (gsl_vector) * v, const size_t i, const size_t j)
+{
+ ATOMIC * data = v->data ;
+ const size_t size = v->size ;
+ const size_t stride = v->stride ;
+
+ if (i >= size)
+ {
+ GSL_ERROR("first index is out of range", GSL_EINVAL);
+ }
+
+ if (j >= size)
+ {
+ GSL_ERROR("second index is out of range", GSL_EINVAL);
+ }
+
+ if (i != j)
+ {
+ const size_t s = MULTIPLICITY * stride ;
+ size_t k ;
+
+ for (k = 0; k < MULTIPLICITY; k++)
+ {
+ ATOMIC tmp = data[j*s + k];
+ data[j*s+k] = data[i*s + k];
+ data[i*s+k] = tmp;
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+FUNCTION (gsl_vector, reverse) (TYPE (gsl_vector) * v)
+{
+ ATOMIC * data = v->data ;
+ const size_t size = v->size ;
+ const size_t stride = v->stride ;
+
+ const size_t s = MULTIPLICITY * stride ;
+
+ size_t i ;
+
+ for (i = 0 ; i < (size / 2) ; i++)
+ {
+ size_t j = size - i - 1 ;
+ size_t k;
+
+ for (k = 0; k < MULTIPLICITY; k++)
+ {
+ ATOMIC tmp = data[j*s + k];
+ data[j*s+k] = data[i*s + k];
+ data[i*s+k] = tmp;
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
diff --git a/gsl-1.9/vector/test.c b/gsl-1.9/vector/test.c
new file mode 100644
index 0000000..453116a
--- /dev/null
+++ b/gsl-1.9/vector/test.c
@@ -0,0 +1,243 @@
+/* vector/test.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+
+#if (!GSL_RANGE_CHECK) && HAVE_INLINE
+#undef GSL_RANGE_CHECK
+#define GSL_RANGE_CHECK 1
+#endif
+
+#include <stdlib.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_test.h>
+#include <gsl/gsl_ieee_utils.h>
+
+int status = 0;
+
+#ifndef DESC
+#define DESC ""
+#endif
+
+
+#define BASE_GSL_COMPLEX_LONG
+#include "templates_on.h"
+#include "test_complex_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_LONG
+
+
+#define BASE_GSL_COMPLEX
+#include "templates_on.h"
+#include "test_complex_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX
+
+#define BASE_GSL_COMPLEX_FLOAT
+#include "templates_on.h"
+#include "test_complex_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_FLOAT
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "test_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "test_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "test_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "test_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "test_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "test_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "test_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "test_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "test_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "test_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "test_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
+
+void my_error_handler (const char *reason, const char *file,
+ int line, int err);
+
+int
+main (void)
+{
+ size_t stride, ostride, N;
+
+ gsl_ieee_env_setup ();
+
+ for (N = 10; N < 1024; N = 2*N + 1)
+ {
+ for (stride = 1; stride < 5 ; stride++)
+ {
+ test_func (stride, N);
+ test_float_func (stride, N);
+ test_long_double_func (stride, N);
+ test_ulong_func (stride, N);
+ test_long_func (stride, N);
+ test_uint_func (stride, N);
+ test_int_func (stride, N);
+ test_ushort_func (stride, N);
+ test_short_func (stride, N);
+ test_uchar_func (stride, N);
+ test_char_func (stride, N);
+
+ test_complex_func (stride, N);
+ test_complex_float_func (stride, N);
+ test_complex_long_double_func (stride, N);
+
+ for (ostride = 1; ostride < 5 ; ostride++)
+ {
+ test_ops (stride, ostride, N);
+ test_float_ops (stride, ostride, N);
+ test_long_double_ops (stride, ostride, N);
+ test_ulong_ops (stride, ostride, N);
+ test_long_ops (stride, ostride, N);
+ test_uint_ops (stride, ostride, N);
+ test_int_ops (stride, ostride, N);
+ test_ushort_ops (stride, ostride, N);
+ test_short_ops (stride, ostride, N);
+ test_uchar_ops (stride, ostride, N);
+ test_char_ops (stride, ostride, N);
+ }
+
+ test_text (stride, N);
+ test_float_text (stride, N);
+#if HAVE_PRINTF_LONGDOUBLE
+ test_long_double_text (stride, N);
+#endif
+ test_ulong_text (stride, N);
+ test_long_text (stride, N);
+ test_uint_text (stride, N);
+ test_int_text (stride, N);
+ test_ushort_text (stride, N);
+ test_short_text (stride, N);
+ test_uchar_text (stride, N);
+ test_char_text (stride, N);
+
+ test_complex_text (stride, N);
+ test_complex_float_text (stride, N);
+#if HAVE_PRINTF_LONGDOUBLE
+ test_complex_long_double_text (stride, N);
+#endif
+
+ test_file (stride, N);
+ test_float_file (stride, N);
+ test_long_double_file (stride, N);
+ test_ulong_file (stride, N);
+ test_long_file (stride, N);
+ test_uint_file (stride, N);
+ test_int_file (stride, N);
+ test_ushort_file (stride, N);
+ test_short_file (stride, N);
+ test_uchar_file (stride, N);
+ test_char_file (stride, N);
+ test_complex_file (stride, N);
+ test_complex_float_file (stride, N);
+ test_complex_long_double_file (stride, N);
+ }
+ }
+
+#if GSL_RANGE_CHECK
+ gsl_set_error_handler (&my_error_handler);
+
+ for (N = 1; N < 1024; N *=2)
+ {
+ for (stride = 1; stride < 5 ; stride++)
+ {
+ test_trap (stride, N);
+ test_float_trap (stride, N);
+ test_long_double_trap (stride, N);
+ test_ulong_trap (stride, N);
+ test_long_trap (stride, N);
+ test_uint_trap (stride, N);
+ test_int_trap (stride, N);
+ test_ushort_trap (stride, N);
+ test_short_trap (stride, N);
+ test_uchar_trap (stride, N);
+ test_char_trap (stride, N);
+ test_complex_trap (stride, N);
+ test_complex_float_trap (stride, N);
+ test_complex_long_double_trap (stride, N);
+ }
+ }
+#endif
+
+ exit (gsl_test_summary ());
+}
+
+void
+my_error_handler (const char *reason, const char *file, int line, int err)
+{
+ if (0)
+ printf ("(caught [%s:%d: %s (%d)])\n", file, line, reason, err);
+ status = 1;
+}
diff --git a/gsl-1.9/vector/test_complex_source.c b/gsl-1.9/vector/test_complex_source.c
new file mode 100644
index 0000000..d2b6398
--- /dev/null
+++ b/gsl-1.9/vector/test_complex_source.c
@@ -0,0 +1,579 @@
+/* vector/test_complex_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+void FUNCTION (test, func) (size_t stride, size_t N);
+void FUNCTION (test, ops) (size_t stride1, size_t stride2, size_t N);
+void FUNCTION (test, file) (size_t stride, size_t N);
+void FUNCTION (test, text) (size_t stride, size_t N);
+void FUNCTION (test, trap) (size_t stride, size_t N);
+TYPE (gsl_vector) * FUNCTION(create, vector) (size_t stride, size_t N);
+
+#define TEST(expr,desc) gsl_test((expr), NAME(gsl_vector) desc " stride=%d, N=%d", stride, N)
+#define TEST2(expr,desc) gsl_test((expr), NAME(gsl_vector) desc " stride1=%d, stride2=%d, N=%d", stride1, stride2, N)
+
+TYPE (gsl_vector) *
+FUNCTION(create, vector) (size_t stride, size_t N)
+{
+ TYPE (gsl_vector) * v = FUNCTION (gsl_vector, calloc) (N*stride);
+ v->stride = stride;
+ v->size = N;
+ return v;
+}
+
+void
+FUNCTION (test, func) (size_t stride, size_t N)
+{
+ TYPE (gsl_vector) * v0;
+ TYPE (gsl_vector) * v;
+ QUALIFIED_VIEW(gsl_vector,view) view;
+
+ size_t i, j;
+
+ if (stride == 1)
+ {
+ v = FUNCTION (gsl_vector, calloc) (N);
+
+ TEST(v->data == 0, "_calloc pointer");
+ TEST(v->size != N, "_calloc size");
+ TEST(v->stride != 1, "_calloc stride");
+
+ {
+ int status = (FUNCTION(gsl_vector,isnull)(v) != 1);
+ TEST (status, "_isnull" DESC " on calloc vector");
+
+ status = (FUNCTION(gsl_vector,ispos)(v) != 0);
+ TEST (status, "_ispos" DESC " on calloc vector");
+
+ status = (FUNCTION(gsl_vector,isneg)(v) != 0);
+ TEST (status, "_isneg" DESC " on calloc vector");
+ }
+
+ FUNCTION (gsl_vector, free) (v); /* free whatever is in v */
+ }
+
+ if (stride == 1)
+ {
+ v = FUNCTION (gsl_vector, alloc) (N);
+
+ TEST(v->data == 0, "_alloc pointer");
+ TEST(v->size != N, "_alloc size");
+ TEST(v->stride != 1, "_alloc stride");
+
+ FUNCTION (gsl_vector, free) (v); /* free whatever is in v */
+ }
+
+ if (stride == 1)
+ {
+ v0 = FUNCTION (gsl_vector, alloc) (N);
+ view = FUNCTION (gsl_vector, subvector) (v0, 0, N);
+ v = &view.vector;
+ }
+ else
+ {
+ v0 = FUNCTION (gsl_vector, alloc) (N * stride);
+
+ for (i = 0; i < N*stride; i++)
+ {
+ BASE x = ZERO;
+ GSL_REAL (x) = (ATOMIC)i;
+ GSL_IMAG (x) = (ATOMIC)(i + 1234);
+ FUNCTION (gsl_vector, set) (v0, i, x);
+ }
+
+ view = FUNCTION (gsl_vector, subvector_with_stride) (v0, 0, stride, N);
+ v = &view.vector;
+ }
+
+ {
+ int status = 0;
+
+ for (i = 0; i < N; i++)
+ {
+ BASE x = ZERO;
+ GSL_REAL (x) = (ATOMIC)i;
+ GSL_IMAG (x) = (ATOMIC)(i + 1234);
+ FUNCTION (gsl_vector, set) (v, i, x);
+ }
+
+ for (i = 0; i < N; i++)
+ {
+ if (v->data[2*i*stride] != (ATOMIC) (i) || v->data[2 * i * stride + 1] != (ATOMIC) (i + 1234))
+ status = 1;
+ };
+
+ TEST(status,"_set" DESC " writes into array");
+ }
+
+
+ {
+ int status = 0;
+
+ for (i = 0; i < N; i++)
+ {
+ BASE x, y;
+ GSL_REAL (x) = (ATOMIC)i;
+ GSL_IMAG (x) = (ATOMIC)(i + 1234);
+ y = FUNCTION (gsl_vector, get) (v, i);
+ if (!GSL_COMPLEX_EQ (x, y))
+ status = 1;
+ };
+
+ TEST (status, "_get" DESC " reads from array");
+ }
+
+ {
+ int status = 0;
+
+ for (i = 0; i < N; i++)
+ {
+ if (FUNCTION (gsl_vector, ptr) (v, i) != (BASE *)v->data + i*stride)
+ status = 1;
+ };
+
+ TEST (status, "_ptr" DESC " access to array");
+ }
+
+
+ {
+ int status = 0;
+
+ for (i = 0; i < N; i++)
+ {
+ if (FUNCTION (gsl_vector, const_ptr) (v, i) != (BASE *)v->data + i*stride)
+ status = 1;
+ };
+
+ TEST (status, "_const_ptr" DESC " access to array");
+ }
+
+ {
+ int status = 0;
+
+ for (i = 0; i < N; i++)
+ {
+ BASE x = ZERO;
+ FUNCTION (gsl_vector, set) (v, i, x);
+ }
+
+ status = (FUNCTION(gsl_vector,isnull)(v) != 1);
+ TEST (status, "_isnull" DESC " on null vector") ;
+
+ status = (FUNCTION(gsl_vector,ispos)(v) != 0);
+ TEST (status, "_ispos" DESC " on null vector") ;
+
+ status = (FUNCTION(gsl_vector,isneg)(v) != 0);
+ TEST (status, "_isneg" DESC " on null vector") ;
+ }
+
+ {
+ int status = 0;
+
+ for (i = 0; i < N; i++)
+ {
+ BASE x = ZERO;
+ GSL_REAL (x) = (ATOMIC)i;
+ GSL_IMAG (x) = (ATOMIC)(i + 1234);
+ FUNCTION (gsl_vector, set) (v, i, x);
+ }
+
+ status = (FUNCTION(gsl_vector,isnull)(v) != 0);
+ TEST (status, "_isnull" DESC " on non-null vector") ;
+
+ status = (FUNCTION(gsl_vector,ispos)(v) != 0);
+ TEST (status, "_ispos" DESC " on non-null vector") ;
+
+ status = (FUNCTION(gsl_vector,ispos)(v) != 0);
+ TEST (status, "_isneg" DESC " on non-null vector") ;
+ }
+
+ {
+ int status = 0;
+
+ FUNCTION (gsl_vector, set_zero) (v);
+
+ for (i = 0; i < N; i++)
+ {
+ BASE x, y = ZERO;
+ x = FUNCTION (gsl_vector, get) (v, i);
+ if (!GSL_COMPLEX_EQ (x, y))
+ status = 1;
+ };
+
+ TEST (status, "_setzero" DESC " on non-null vector") ;
+ }
+
+ {
+ int status = 0;
+
+ BASE x;
+ GSL_REAL (x) = (ATOMIC)27;
+ GSL_IMAG (x) = (ATOMIC)(27 + 1234);
+
+ FUNCTION (gsl_vector, set_all) (v, x);
+
+ for (i = 0; i < N; i++)
+ {
+ BASE y = FUNCTION (gsl_vector, get) (v, i);
+ if (!GSL_COMPLEX_EQ (x, y))
+ status = 1;
+ };
+
+ TEST (status, "_setall" DESC " to non-zero value") ;
+ }
+
+
+ {
+ int status = 0;
+
+ for (i = 0; i < N; i++)
+ {
+ FUNCTION (gsl_vector, set_basis) (v, i);
+
+ for (j = 0; j < N; j++)
+ {
+ BASE x = FUNCTION (gsl_vector, get) (v, j);
+ BASE one = ONE;
+ BASE zero = ZERO;
+
+ if (i == j)
+ {
+ if (!GSL_COMPLEX_EQ (x, one))
+ status = 1 ;
+ }
+ else
+ {
+ if (!GSL_COMPLEX_EQ (x, zero))
+ status = 1;
+ }
+ };
+ }
+
+ TEST (status, "_setbasis" DESC " over range") ;
+ }
+
+ for (i = 0; i < N; i++)
+ {
+ BASE x = ZERO;
+ GSL_REAL (x) = (ATOMIC)i;
+ GSL_IMAG (x) = (ATOMIC)(i + 1234);
+ FUNCTION (gsl_vector, set) (v, i, x);
+ }
+
+ {
+ int status;
+ BASE x, y, r, s ;
+ GSL_REAL(x) = 2 ;
+ GSL_IMAG(x) = 2 + 1234;
+ GSL_REAL(y) = 5 ;
+ GSL_IMAG(y) = 5 + 1234;
+
+ FUNCTION (gsl_vector,swap_elements) (v, 2, 5) ;
+
+ r = FUNCTION(gsl_vector,get)(v,2);
+ s = FUNCTION(gsl_vector,get)(v,5);
+
+ status = ! GSL_COMPLEX_EQ(r,y) ;
+ status |= ! GSL_COMPLEX_EQ(s,x) ;
+
+ FUNCTION (gsl_vector,swap_elements) (v, 2, 5) ;
+
+ r = FUNCTION(gsl_vector,get)(v,2);
+ s = FUNCTION(gsl_vector,get)(v,5);
+
+ status |= ! GSL_COMPLEX_EQ(r,x) ;
+ status |= ! GSL_COMPLEX_EQ(s,y) ;
+
+ TEST (status, "_swap_elements" DESC " exchanges elements") ;
+ }
+
+ {
+ int status = 0;
+
+ FUNCTION (gsl_vector,reverse) (v) ;
+
+ for (i = 0; i < N; i++)
+ {
+ BASE x,r ;
+ GSL_REAL(x) = (ATOMIC)(N - i - 1) ;
+ GSL_IMAG(x) = (ATOMIC)(N - i - 1 + 1234);
+
+ r = FUNCTION (gsl_vector, get) (v, i);
+
+ status |= !GSL_COMPLEX_EQ(r,x);
+ }
+
+ gsl_test (status, NAME(gsl_vector) "_reverse" DESC " reverses elements") ;
+ }
+
+ {
+ int status = 0;
+
+ QUALIFIED_VIEW(gsl_vector,view) v1 = FUNCTION(gsl_vector, view_array) (v->data, N*stride);
+
+ for (i = 0; i < N; i++)
+ {
+ BASE x = FUNCTION (gsl_vector, get) (&v1.vector, i*stride) ;
+ BASE y = FUNCTION (gsl_vector, get) (v, i);
+ if (!GSL_COMPLEX_EQ(x,y))
+ status = 1;
+ };
+
+ TEST (status, "_view_array" DESC);
+ }
+
+ {
+ int status = 0;
+
+ QUALIFIED_VIEW(gsl_vector,view) v1 = FUNCTION(gsl_vector, view_array_with_stride) (v->data, stride, N*stride);
+
+ for (i = 0; i < N; i++)
+ {
+ BASE x = FUNCTION (gsl_vector, get) (&v1.vector, i) ;
+ BASE y = FUNCTION (gsl_vector, get) (v, i);
+ if (!GSL_COMPLEX_EQ(x,y))
+ status = 1;
+ };
+
+ TEST (status, "_view_array_with_stride" DESC);
+ }
+
+
+ {
+ int status = 0;
+
+ QUALIFIED_VIEW(gsl_vector,view) v1 = FUNCTION(gsl_vector, subvector) (v, N/3, N/2);
+
+ for (i = 0; i < N/2; i++)
+ {
+ BASE x = FUNCTION (gsl_vector, get) (&v1.vector, i) ;
+ BASE y = FUNCTION (gsl_vector, get) (v, (N/3)+i);
+ if (!GSL_COMPLEX_EQ(x,y))
+ status = 1;
+ };
+
+ TEST (status, "_view_subvector" DESC);
+ }
+
+ {
+ int status = 0;
+
+ QUALIFIED_VIEW(gsl_vector,view) v1 = FUNCTION(gsl_vector, subvector_with_stride) (v, N/5, 3, N/4);
+
+ for (i = 0; i < N/4; i++)
+ {
+ BASE x = FUNCTION (gsl_vector, get) (&v1.vector, i) ;
+ BASE y = FUNCTION (gsl_vector, get) (v, (N/5)+3*i);
+ if (!GSL_COMPLEX_EQ(x,y))
+ status = 1;
+ };
+
+ TEST (status, "_view_subvector_with_stride" DESC);
+ }
+
+
+ {
+ int status = 0;
+
+ QUALIFIED_REAL_VIEW(gsl_vector,view) vv = FUNCTION(gsl_vector, real) (v);
+
+ for (i = 0; i < N; i++)
+ {
+ ATOMIC xr = REAL_VIEW (gsl_vector, get) (&vv.vector, i) ;
+ BASE y = FUNCTION (gsl_vector, get) (v, i);
+ ATOMIC yr = GSL_REAL(y);
+
+ if (xr != yr)
+ status = 1;
+ };
+
+ TEST (status, "_real" DESC);
+ }
+
+ {
+ int status = 0;
+
+ QUALIFIED_REAL_VIEW(gsl_vector,view) vv = FUNCTION(gsl_vector, imag) (v);
+
+ for (i = 0; i < N; i++)
+ {
+ ATOMIC xr = REAL_VIEW (gsl_vector, get) (&vv.vector, i) ;
+ BASE y = FUNCTION (gsl_vector, get) (v, i);
+ ATOMIC yr = GSL_IMAG(y);
+
+ if (xr != yr)
+ status = 1;
+ };
+
+ TEST (status, "_imag" DESC);
+ }
+
+
+ FUNCTION (gsl_vector, free) (v0); /* free whatever is in v */
+}
+
+void
+FUNCTION (test, file) (size_t stride, size_t N)
+{
+ TYPE (gsl_vector) * v = FUNCTION (create, vector) (stride, N);
+ TYPE (gsl_vector) * w = FUNCTION (create, vector) (stride, N);
+
+ size_t i;
+
+ {
+ FILE *f = fopen ("test.dat", "wb");
+
+ for (i = 0; i < N; i++)
+ {
+ BASE x = ZERO;
+ GSL_REAL (x) = (ATOMIC)(N - i);
+ GSL_IMAG (x) = (ATOMIC)(N - i + 1);
+ FUNCTION (gsl_vector, set) (v, i, x);
+ };
+
+ FUNCTION (gsl_vector, fwrite) (f, v);
+
+ fclose (f);
+ }
+
+ {
+ FILE *f = fopen ("test.dat", "rb");
+
+ FUNCTION (gsl_vector, fread) (f, w);
+
+ status = 0;
+ for (i = 0; i < N; i++)
+ {
+ if (w->data[2 * i * stride] != (ATOMIC) (N - i) || w->data[2 * i * stride + 1] != (ATOMIC) (N - i + 1))
+ status = 1;
+ };
+ fclose (f);
+ }
+
+ FUNCTION (gsl_vector, free) (v);
+ FUNCTION (gsl_vector, free) (w);
+
+ gsl_test (status, NAME (gsl_vector) "_write and read work");
+
+}
+
+#if USES_LONGDOUBLE && ! HAVE_PRINTF_LONGDOUBLE
+/* skip this test */
+#else
+void
+FUNCTION (test, text) (size_t stride, size_t N)
+{
+ TYPE (gsl_vector) * v = FUNCTION (create, vector) (stride, N);
+ TYPE (gsl_vector) * w = FUNCTION (create, vector) (stride, N);
+
+ size_t i;
+
+ {
+ FILE *f = fopen ("test.txt", "w");
+
+ for (i = 0; i < N; i++)
+ {
+ BASE x;
+ GSL_REAL (x) = (ATOMIC)i;
+ GSL_IMAG (x) = (ATOMIC)(i + 1);
+ FUNCTION (gsl_vector, set) (v, i, x);
+ };
+
+ FUNCTION (gsl_vector, fprintf) (f, v, OUT_FORMAT);
+
+ fclose (f);
+ }
+
+ {
+ FILE *f = fopen ("test.txt", "r");
+
+ FUNCTION (gsl_vector, fscanf) (f, w);
+
+ status = 0;
+ for (i = 0; i < N; i++)
+ {
+ if (w->data[2 * i * stride] != (ATOMIC) i || w->data[2 * i * stride + 1] != (ATOMIC) (i + 1))
+ status = 1;
+ };
+ fclose (f);
+ }
+
+ FUNCTION (gsl_vector, free) (v);
+ FUNCTION (gsl_vector, free) (w);
+
+ gsl_test (status, NAME (gsl_vector) "_fprintf and fscanf");
+}
+#endif
+
+void
+FUNCTION (test, trap) (size_t stride, size_t N)
+{
+ TYPE (gsl_vector) * vc = FUNCTION (create, vector) (stride, N);
+
+ BASE z = {{(ATOMIC)1.2, (ATOMIC)3.4}};
+ BASE z1 = {{(ATOMIC)4.5, (ATOMIC)6.7}};
+
+ size_t j = 0;
+
+ status = 0;
+ FUNCTION (gsl_vector, set) (vc, j - 1, z);
+ gsl_test (!status,
+ NAME (gsl_vector) "_set traps index below lower bound");
+
+ status = 0;
+ FUNCTION (gsl_vector, set) (vc, N + 1, z);
+ gsl_test (!status,
+ NAME (gsl_vector) "_set traps index above upper bound");
+
+ status = 0;
+ FUNCTION (gsl_vector, set) (vc, N, z);
+ gsl_test (!status, NAME (gsl_vector) "_set traps index at upper bound");
+
+ status = 0;
+ z1 = FUNCTION (gsl_vector, get) (vc, j - 1);
+ gsl_test (!status,
+ NAME (gsl_vector) "_get traps index below lower bound");
+
+ gsl_test (GSL_REAL (z1) != 0,
+ NAME (gsl_vector) "_get returns zero real below lower bound");
+ gsl_test (GSL_IMAG (z1) != 0,
+ NAME (gsl_vector) "_get returns zero imag below lower bound");
+
+ status = 0;
+ z1 = FUNCTION (gsl_vector, get) (vc, N + 1);
+ gsl_test (!status,
+ NAME (gsl_vector) "_get traps index above upper bound");
+ gsl_test (GSL_REAL (z1) != 0,
+ NAME (gsl_vector) "_get returns zero real above upper bound");
+ gsl_test (GSL_IMAG (z1) != 0,
+ NAME (gsl_vector) "_get returns zero imag above upper bound");
+
+ status = 0;
+ z1 = FUNCTION (gsl_vector, get) (vc, N);
+ gsl_test (!status, NAME (gsl_vector) "_get traps index at upper bound");
+ gsl_test (GSL_REAL (z1) != 0,
+ NAME (gsl_vector) "_get returns zero real at upper bound");
+ gsl_test (GSL_IMAG (z1) != 0,
+ NAME (gsl_vector) "_get returns zero imag at upper bound");
+
+ FUNCTION (gsl_vector, free) (vc);
+}
+
+
+
+
diff --git a/gsl-1.9/vector/test_source.c b/gsl-1.9/vector/test_source.c
new file mode 100644
index 0000000..03fac79
--- /dev/null
+++ b/gsl-1.9/vector/test_source.c
@@ -0,0 +1,808 @@
+/* vector/test_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+void FUNCTION (test, func) (size_t stride, size_t N);
+void FUNCTION (test, ops) (size_t stride1, size_t stride2, size_t N);
+void FUNCTION (test, file) (size_t stride, size_t N);
+void FUNCTION (test, text) (size_t stride, size_t N);
+void FUNCTION (test, trap) (size_t stride, size_t N);
+TYPE (gsl_vector) * FUNCTION(create, vector) (size_t stride, size_t N);
+
+#define TEST(expr,desc) gsl_test((expr), NAME(gsl_vector) desc " stride=%d, N=%d", stride, N)
+#define TEST2(expr,desc) gsl_test((expr), NAME(gsl_vector) desc " stride1=%d, stride2=%d, N=%d", stride1, stride2, N)
+
+TYPE (gsl_vector) *
+FUNCTION(create, vector) (size_t stride, size_t N)
+{
+ TYPE (gsl_vector) * v = FUNCTION (gsl_vector, calloc) (N*stride);
+ v->stride = stride;
+ v->size = N;
+ return v;
+}
+
+void
+FUNCTION (test, func) (size_t stride, size_t N)
+{
+ TYPE (gsl_vector) * v0;
+ TYPE (gsl_vector) * v;
+ QUALIFIED_VIEW(gsl_vector,view) view;
+
+ size_t i, j;
+
+ if (stride == 1)
+ {
+ v = FUNCTION (gsl_vector, calloc) (N);
+
+ TEST(v->data == 0, "_calloc pointer");
+ TEST(v->size != N, "_calloc size");
+ TEST(v->stride != 1, "_calloc stride");
+
+ {
+ int status = (FUNCTION(gsl_vector,isnull)(v) != 1);
+ TEST (status, "_isnull" DESC " on calloc vector");
+
+ status = (FUNCTION(gsl_vector,ispos)(v) != 0);
+ TEST (status, "_ispos" DESC " on calloc vector");
+
+ status = (FUNCTION(gsl_vector,isneg)(v) != 0);
+ TEST (status, "_isneg" DESC " on calloc vector");
+ }
+
+ FUNCTION (gsl_vector, free) (v); /* free whatever is in v */
+ }
+
+ if (stride == 1)
+ {
+ v = FUNCTION (gsl_vector, alloc) (N);
+
+ TEST(v->data == 0, "_alloc pointer");
+ TEST(v->size != N, "_alloc size");
+ TEST(v->stride != 1, "_alloc stride");
+
+ FUNCTION (gsl_vector, free) (v); /* free whatever is in v */
+ }
+
+ if (stride == 1)
+ {
+ v0 = FUNCTION (gsl_vector, alloc) (N);
+ view = FUNCTION (gsl_vector, subvector) (v0, 0, N);
+ v = &view.vector;
+ }
+ else
+ {
+ v0 = FUNCTION (gsl_vector, alloc) (N * stride);
+
+ for (i = 0; i < N*stride; i++)
+ {
+ v0->data[i] = i;
+ }
+
+ view = FUNCTION (gsl_vector, subvector_with_stride) (v0, 0, stride, N);
+ v = &view.vector;
+ }
+
+ {
+ int status = 0;
+
+ for (i = 0; i < N; i++)
+ {
+ FUNCTION (gsl_vector, set) (v, i, (ATOMIC) i);
+ }
+
+ for (i = 0; i < N; i++)
+ {
+ if (v->data[i*stride] != (ATOMIC) (i))
+ status = 1;
+ };
+
+ TEST(status,"_set" DESC " writes into array");
+ }
+
+
+ {
+ int status = 0;
+
+ for (i = 0; i < N; i++)
+ {
+ if (FUNCTION (gsl_vector, get) (v, i) != (ATOMIC) (i))
+ status = 1;
+ };
+
+ TEST (status, "_get" DESC " reads from array");
+ }
+
+ {
+ int status = 0;
+
+ for (i = 0; i < N; i++)
+ {
+ if (FUNCTION (gsl_vector, ptr) (v, i) != v->data + i*stride)
+ status = 1;
+ };
+
+ TEST (status, "_ptr" DESC " access to array");
+ }
+
+
+ {
+ int status = 0;
+
+ for (i = 0; i < N; i++)
+ {
+ if (FUNCTION (gsl_vector, const_ptr) (v, i) != v->data + i*stride)
+ status = 1;
+ };
+
+ TEST (status, "_const_ptr" DESC " access to array");
+ }
+
+
+ {
+ int status = 0;
+
+ for (i = 0; i < N; i++)
+ {
+ FUNCTION (gsl_vector, set) (v, i, (ATOMIC) 0);
+ }
+
+ status = (FUNCTION(gsl_vector,isnull)(v) != 1);
+ TEST (status, "_isnull" DESC " on null vector") ;
+
+ status = (FUNCTION(gsl_vector,ispos)(v) != 0);
+ TEST (status, "_ispos" DESC " on null vector") ;
+
+ status = (FUNCTION(gsl_vector,isneg)(v) != 0);
+ TEST (status, "_isneg" DESC " on null vector") ;
+ }
+
+ {
+ int status = 0;
+
+ for (i = 0; i < N; i++)
+ {
+ FUNCTION (gsl_vector, set) (v, i, (ATOMIC) (i % 10));
+ }
+
+ status = (FUNCTION(gsl_vector,isnull)(v) != 0);
+ TEST (status, "_isnull" DESC " on non-negative vector") ;
+
+ status = (FUNCTION(gsl_vector,ispos)(v) != 0);
+ TEST (status, "_ispos" DESC " on non-negative vector") ;
+
+ status = (FUNCTION(gsl_vector,isneg)(v) != 0);
+ TEST (status, "_isneg" DESC " on non-negative vector") ;
+ }
+
+
+#ifndef UNSIGNED
+ {
+ int status = 0;
+
+ for (i = 0; i < N; i++)
+ {
+ FUNCTION (gsl_vector, set) (v, i, (ATOMIC) ((i % 10) - 5));
+ }
+
+ status = (FUNCTION(gsl_vector,isnull)(v) != 0);
+ TEST (status, "_isnull" DESC " on mixed vector") ;
+
+ status = (FUNCTION(gsl_vector,ispos)(v) != 0);
+ TEST (status, "_ispos" DESC " on mixed vector") ;
+
+ status = (FUNCTION(gsl_vector,isneg)(v) != 0);
+ TEST (status, "_isneg" DESC " on mixed vector") ;
+ }
+
+ {
+ int status = 0;
+
+ for (i = 0; i < N; i++)
+ {
+ FUNCTION (gsl_vector, set) (v, i, -(ATOMIC) (i % 10));
+ }
+
+ status = (FUNCTION(gsl_vector,isnull)(v) != 0);
+ TEST (status, "_isnull" DESC " on non-positive vector") ;
+
+ status = (FUNCTION(gsl_vector,ispos)(v) != 0);
+ TEST (status, "_ispos" DESC " on non-positive vector") ;
+
+ status = (FUNCTION(gsl_vector,isneg)(v) != 0);
+ TEST (status, "_isneg" DESC " on non-positive non-null vector") ;
+ }
+#endif
+
+ {
+ int status = 0;
+
+ for (i = 0; i < N; i++)
+ {
+ FUNCTION (gsl_vector, set) (v, i, (ATOMIC) (i % 10 + 1));
+ }
+
+ status = (FUNCTION(gsl_vector,isnull)(v) != 0);
+ TEST (status, "_isnull" DESC " on positive vector") ;
+
+ status = (FUNCTION(gsl_vector,ispos)(v) != 1);
+ TEST (status, "_ispos" DESC " on positive vector") ;
+
+ status = (FUNCTION(gsl_vector,isneg)(v) != 0);
+ TEST (status, "_isneg" DESC " on positive vector") ;
+ }
+
+
+#if (!defined(UNSIGNED) && !defined(BASE_CHAR))
+ {
+ int status = 0;
+
+ for (i = 0; i < N; i++)
+ {
+ FUNCTION (gsl_vector, set) (v, i, -(ATOMIC) (i % 10 + 1));
+ }
+
+ status = (FUNCTION(gsl_vector,isnull)(v) != 0);
+ TEST (status, "_isnull" DESC " on negative vector") ;
+
+ status = (FUNCTION(gsl_vector,ispos)(v) != 0);
+ TEST (status, "_ispos" DESC " on negative vector") ;
+
+ status = (FUNCTION(gsl_vector,isneg)(v) != 1);
+ TEST (status, "_isneg" DESC " on negative vector") ;
+ }
+#endif
+
+ {
+ int status = 0;
+
+ FUNCTION (gsl_vector, set_zero) (v);
+
+ for (i = 0; i < N; i++)
+ {
+ if (FUNCTION (gsl_vector, get) (v, i) != (ATOMIC)0)
+ status = 1;
+ };
+
+ TEST (status, "_setzero" DESC " on non-null vector") ;
+ }
+
+ {
+ int status = 0;
+
+ FUNCTION (gsl_vector, set_all) (v, (ATOMIC)27);
+
+ for (i = 0; i < N; i++)
+ {
+ if (FUNCTION (gsl_vector, get) (v, i) != (ATOMIC) (27))
+ status = 1;
+ };
+
+ TEST (status, "_setall" DESC " to non-zero value") ;
+ }
+
+
+ {
+ int status = 0;
+
+ for (i = 0; i < N; i++)
+ {
+ FUNCTION (gsl_vector, set_basis) (v, i);
+
+ for (j = 0; j < N; j++)
+ {
+ if (i == j)
+ {
+ if (FUNCTION (gsl_vector, get) (v, j) != (ATOMIC)1)
+ status = 1 ;
+ }
+ else
+ {
+ if (FUNCTION (gsl_vector, get) (v, j) != (ATOMIC)(0))
+ status = 1;
+ }
+ };
+ }
+
+ TEST (status, "_setbasis" DESC " over range") ;
+ }
+
+ {
+ int status = 0;
+
+ for (i = 0; i < N; i++)
+ {
+ FUNCTION (gsl_vector, set) (v, i, (ATOMIC) i);
+ }
+
+ FUNCTION (gsl_vector, scale) (v, 2.0);
+
+ for (i = 0; i < N; i++)
+ {
+ if (FUNCTION (gsl_vector, get) (v, i) != (ATOMIC) (i*2.0))
+ status = 1;
+ };
+
+ TEST (status, "_scale" DESC " by 2") ;
+ }
+
+ {
+ int status = 0;
+
+ FUNCTION (gsl_vector, add_constant) (v, (ATOMIC)7);
+
+ for (i = 0; i < N; i++)
+ {
+ if (FUNCTION (gsl_vector, get) (v, i) != (ATOMIC) (i*2.0 + 7))
+ status = 1;
+ };
+
+ TEST (status, "_add_constant" DESC) ;
+ }
+
+ {
+ int status = 0;
+
+ for (i = 0; i < N; i++)
+ {
+ FUNCTION (gsl_vector, set) (v, i, (ATOMIC) i);
+ }
+
+ FUNCTION (gsl_vector,swap_elements) (v, 2, 5) ;
+
+ status = (FUNCTION(gsl_vector,get)(v,2) != 5) ;
+ status |= (FUNCTION(gsl_vector,get)(v,5) != 2) ;
+
+ FUNCTION (gsl_vector,swap_elements) (v, 2, 5) ;
+
+ status |= (FUNCTION(gsl_vector,get)(v,2) != 2) ;
+ status |= (FUNCTION(gsl_vector,get)(v,5) != 5) ;
+
+ TEST (status, "_swap_elements" DESC " (2,5)") ;
+ }
+
+ {
+ int status = 0;
+
+ FUNCTION (gsl_vector,reverse) (v) ;
+
+ for (i = 0; i < N; i++)
+ {
+ status |= (FUNCTION (gsl_vector, get) (v, i) != (ATOMIC) (N - i - 1));
+ }
+
+ TEST (status, "_reverse" DESC " reverses elements") ;
+ }
+
+
+ {
+ int status = 0;
+
+ QUALIFIED_VIEW(gsl_vector,view) v1 = FUNCTION(gsl_vector, view_array) (v->data, N*stride);
+
+ for (i = 0; i < N; i++)
+ {
+ if (FUNCTION (gsl_vector, get) (&v1.vector, i*stride) != FUNCTION (gsl_vector, get) (v, i))
+ status = 1;
+ };
+
+ TEST (status, "_view_array" DESC);
+ }
+
+ {
+ int status = 0;
+
+ QUALIFIED_VIEW(gsl_vector,view) v1 = FUNCTION(gsl_vector, view_array_with_stride) (v->data, stride, N*stride);
+
+ for (i = 0; i < N; i++)
+ {
+ if (FUNCTION (gsl_vector, get) (&v1.vector, i) != FUNCTION (gsl_vector, get) (v, i))
+ status = 1;
+ };
+
+ TEST (status, "_view_array_with_stride" DESC);
+ }
+
+
+ {
+ int status = 0;
+
+ QUALIFIED_VIEW(gsl_vector,view) v1 = FUNCTION(gsl_vector, subvector) (v, N/3, N/2);
+
+ for (i = 0; i < N/2; i++)
+ {
+ if (FUNCTION (gsl_vector, get) (&v1.vector, i) != FUNCTION (gsl_vector, get) (v, (N/3) + i))
+ status = 1;
+ };
+
+ TEST (status, "_view_subvector" DESC);
+ }
+
+ {
+ int status = 0;
+
+ QUALIFIED_VIEW(gsl_vector,view) v1 = FUNCTION(gsl_vector, subvector_with_stride) (v, N/5, 3, N/4);
+
+ for (i = 0; i < N/4; i++)
+ {
+ if (FUNCTION (gsl_vector, get) (&v1.vector, i) != FUNCTION (gsl_vector, get) (v, (N/5) + 3*i))
+ status = 1;
+ };
+
+ TEST (status, "_view_subvector_with_stride" DESC);
+ }
+
+
+ {
+ BASE exp_max = FUNCTION(gsl_vector,get)(v, 0);
+ BASE exp_min = FUNCTION(gsl_vector,get)(v, 0);
+ size_t exp_imax = 0, exp_imin = 0;
+
+ for (i = 0; i < N; i++)
+ {
+ BASE k = FUNCTION(gsl_vector, get) (v, i) ;
+ if (k < exp_min) {
+ exp_min = FUNCTION(gsl_vector, get) (v, i);
+ exp_imin = i;
+ }
+ }
+
+ for (i = 0; i < N; i++)
+ {
+ BASE k = FUNCTION(gsl_vector, get) (v, i) ;
+ if (k > exp_max) {
+ exp_max = FUNCTION(gsl_vector, get) (v, i) ;
+ exp_imax = i;
+ }
+ }
+
+ {
+ BASE max = FUNCTION(gsl_vector, max) (v) ;
+ TEST (max != exp_max, "_max returns correct maximum value");
+ }
+
+ {
+ BASE min = FUNCTION(gsl_vector, min) (v) ;
+ TEST (min != exp_min, "_min returns correct minimum value");
+ }
+
+ {
+ BASE min, max;
+ FUNCTION(gsl_vector, minmax) (v, &min, &max);
+
+ TEST (max != exp_max, "_minmax returns correct maximum value");
+ TEST (min != exp_min, "_minmax returns correct minimum value");
+ }
+
+
+ {
+ size_t imax = FUNCTION(gsl_vector, max_index) (v) ;
+ TEST (imax != exp_imax, "_max_index returns correct maximum i");
+ }
+
+ {
+ size_t imin = FUNCTION(gsl_vector, min_index) (v) ;
+ TEST (imin != exp_imin, "_min_index returns correct minimum i");
+ }
+
+ {
+ size_t imin, imax;
+
+ FUNCTION(gsl_vector, minmax_index) (v, &imin, &imax);
+
+ TEST (imax != exp_imax, "_minmax_index returns correct maximum i");
+ TEST (imin != exp_imin, "_minmax_index returns correct minimum i");
+ }
+
+#if FP
+ i = N/2;
+ FUNCTION(gsl_vector, set) (v, i, GSL_NAN);
+ exp_max = GSL_NAN; exp_min = GSL_NAN;
+ exp_imax = i; exp_imin = i;
+
+ {
+ BASE max = FUNCTION(gsl_vector, max) (v) ;
+ gsl_test_abs (max, exp_max, 0, "_max returns correct maximum value for NaN");
+ }
+
+ {
+ BASE min = FUNCTION(gsl_vector, min) (v) ;
+ gsl_test_abs (min, exp_min, 0, "_min returns correct minimum value for NaN");
+ }
+
+ {
+ BASE min, max;
+ FUNCTION(gsl_vector, minmax) (v, &min, &max);
+
+ gsl_test_abs (max, exp_max, 0, "_minmax returns correct maximum value for NaN");
+ gsl_test_abs (min, exp_min, 0, "_minmax returns correct minimum value for NaN");
+ }
+
+
+ {
+ size_t imax = FUNCTION(gsl_vector, max_index) (v) ;
+ TEST (imax != exp_imax, "_max_index returns correct maximum i for NaN");
+ }
+
+ {
+ size_t imin = FUNCTION(gsl_vector, min_index) (v) ;
+ TEST (imin != exp_imin, "_min_index returns correct minimum i for NaN");
+ }
+
+ {
+ size_t imin, imax;
+
+ FUNCTION(gsl_vector, minmax_index) (v, &imin, &imax);
+
+ TEST (imax != exp_imax, "_minmax_index returns correct maximum i for NaN");
+ TEST (imin != exp_imin, "_minmax_index returns correct minimum i for NaN");
+ }
+#endif
+
+ }
+
+
+ FUNCTION (gsl_vector, free) (v0); /* free whatever is in v */
+}
+
+void
+FUNCTION (test, ops) (size_t stride1, size_t stride2, size_t N)
+{
+ size_t i;
+ TYPE (gsl_vector) * a = FUNCTION (create, vector) (stride1, N);
+ TYPE (gsl_vector) * b = FUNCTION (create, vector) (stride2, N);
+ TYPE (gsl_vector) * v = FUNCTION (create, vector) (stride1, N);
+
+ for (i = 0; i < N; i++)
+ {
+ FUNCTION (gsl_vector, set) (a, i, (BASE)(3 + i));
+ FUNCTION (gsl_vector, set) (b, i, (BASE)(3 + 2 * i));
+ }
+
+ FUNCTION(gsl_vector, memcpy) (v, a);
+ FUNCTION(gsl_vector, add) (v, b);
+
+ {
+ int status = 0;
+
+ for (i = 0; i < N; i++)
+ {
+ BASE r = FUNCTION(gsl_vector,get) (v,i);
+ BASE x = FUNCTION(gsl_vector,get) (a,i);
+ BASE y = FUNCTION(gsl_vector,get) (b,i);
+ BASE z = x + y;
+ if (r != z)
+ status = 1;
+ }
+ TEST2 (status, "_add vector addition");
+ }
+
+ {
+ int status = 0;
+
+ FUNCTION(gsl_vector, swap) (a, b);
+
+ for (i = 0; i < N; i++)
+ {
+ status |= (FUNCTION (gsl_vector, get) (a, i) != (BASE)(3 + 2 * i));
+ status |= (FUNCTION (gsl_vector, get) (b, i) != (BASE)(3 + i));
+ }
+
+ FUNCTION(gsl_vector, swap) (a, b);
+
+ for (i = 0; i < N; i++)
+ {
+ status |= (FUNCTION (gsl_vector, get) (a, i) != (BASE)(3 + i));
+ status |= (FUNCTION (gsl_vector, get) (b, i) != (BASE)(3 + 2 * i));
+ }
+
+ TEST2 (status, "_swap exchange vectors");
+ }
+
+ FUNCTION(gsl_vector, memcpy) (v, a);
+ FUNCTION(gsl_vector, sub) (v, b);
+
+ {
+ int status = 0;
+
+ for (i = 0; i < N; i++)
+ {
+ BASE r = FUNCTION(gsl_vector,get) (v,i);
+ BASE x = FUNCTION(gsl_vector,get) (a,i);
+ BASE y = FUNCTION(gsl_vector,get) (b,i);
+ BASE z = x - y;
+ if (r != z)
+ status = 1;
+ }
+
+ TEST2 (status, "_sub vector subtraction");
+ }
+
+ FUNCTION(gsl_vector, memcpy) (v, a);
+ FUNCTION(gsl_vector, mul) (v, b);
+
+ {
+ int status = 0;
+
+ for (i = 0; i < N; i++)
+ {
+ BASE r = FUNCTION(gsl_vector,get) (v,i);
+ BASE x = FUNCTION(gsl_vector,get) (a,i);
+ BASE y = FUNCTION(gsl_vector,get) (b,i);
+ BASE z = x * y;
+ if (r != z)
+ status = 1;
+ }
+
+ TEST2 (status, "_mul multiplication");
+ }
+
+ FUNCTION(gsl_vector, memcpy) (v, a);
+ FUNCTION(gsl_vector, div) (v, b);
+
+ {
+ int status = 0;
+
+ for (i = 0; i < N; i++)
+ {
+ BASE r = FUNCTION(gsl_vector,get) (v,i);
+ BASE x = FUNCTION(gsl_vector,get) (a,i);
+ BASE y = FUNCTION(gsl_vector,get) (b,i);
+ BASE z = x / y;
+ if (fabs(r - z) > 2 * GSL_FLT_EPSILON * fabs(z))
+ status = 1;
+ }
+ TEST2 (status, "_div division");
+ }
+
+ FUNCTION(gsl_vector, free) (a);
+ FUNCTION(gsl_vector, free) (b);
+ FUNCTION(gsl_vector, free) (v);
+}
+
+
+void
+FUNCTION (test, file) (size_t stride, size_t N)
+{
+ TYPE (gsl_vector) * v = FUNCTION (create, vector) (stride, N);
+ TYPE (gsl_vector) * w = FUNCTION (create, vector) (stride, N);
+
+ size_t i;
+
+ {
+ FILE *f = fopen ("test.dat", "wb");
+
+ for (i = 0; i < N; i++)
+ {
+ FUNCTION (gsl_vector, set) (v, i, (ATOMIC) (N - i));
+ };
+
+ FUNCTION (gsl_vector, fwrite) (f, v);
+
+ fclose (f);
+ }
+
+ {
+ FILE *f = fopen ("test.dat", "rb");
+
+ FUNCTION (gsl_vector, fread) (f, w);
+
+ status = 0;
+ for (i = 0; i < N; i++)
+ {
+ if (w->data[i*stride] != (ATOMIC) (N - i))
+ status = 1;
+ };
+
+ TEST (status, "_write and read");
+
+ fclose (f);
+ }
+
+ FUNCTION (gsl_vector, free) (v); /* free whatever is in v */
+ FUNCTION (gsl_vector, free) (w); /* free whatever is in w */
+}
+
+#if USES_LONGDOUBLE && ! HAVE_PRINTF_LONGDOUBLE
+/* skip this test */
+#else
+void
+FUNCTION (test, text) (size_t stride, size_t N)
+{
+ TYPE (gsl_vector) * v = FUNCTION (create, vector) (stride, N);
+ TYPE (gsl_vector) * w = FUNCTION (create, vector) (stride, N);
+
+ size_t i;
+
+ {
+ FILE *f = fopen ("test.txt", "w");
+
+ for (i = 0; i < N; i++)
+ {
+ FUNCTION (gsl_vector, set) (v, i, (ATOMIC) i);
+ };
+
+ FUNCTION (gsl_vector, fprintf) (f, v, OUT_FORMAT);
+
+ fclose (f);
+ }
+
+ {
+ FILE *f = fopen ("test.txt", "r");
+
+ FUNCTION (gsl_vector, fscanf) (f, w);
+
+ status = 0;
+ for (i = 0; i < N; i++)
+ {
+ if (w->data[i*stride] != (ATOMIC) i)
+ status = 1;
+ };
+
+ gsl_test (status, NAME (gsl_vector) "_fprintf and fscanf");
+
+ fclose (f);
+ }
+
+ FUNCTION (gsl_vector, free) (v);
+ FUNCTION (gsl_vector, free) (w);
+}
+#endif
+
+void
+FUNCTION (test, trap) (size_t stride, size_t N)
+{
+ double x;
+ size_t j = 0;
+ TYPE (gsl_vector) * v = FUNCTION (create, vector) (stride, N);
+ v->size = N;
+ v->stride = stride;
+
+ status = 0;
+ FUNCTION (gsl_vector, set) (v, j - 1, (ATOMIC)0);
+ TEST (!status, "_set traps index below lower bound");
+
+ status = 0;
+ FUNCTION (gsl_vector, set) (v, N + 1, (ATOMIC)0);
+ TEST (!status, "_set traps index above upper bound");
+
+ status = 0;
+ FUNCTION (gsl_vector, set) (v, N, (ATOMIC)0);
+ TEST (!status, "_set traps index at upper bound");
+
+ status = 0;
+ x = FUNCTION (gsl_vector, get) (v, j - 1);
+ TEST (!status, "_get traps index below lower bound");
+ TEST (x != 0, "_get returns zero for index below lower bound");
+
+ status = 0;
+ x = FUNCTION (gsl_vector, get) (v, N + 1);
+ TEST (!status, "_get traps index above upper bound");
+ TEST (x != 0, "_get returns zero for index above upper bound");
+
+ status = 0;
+ x = FUNCTION (gsl_vector, get) (v, N);
+ TEST (!status, "_get traps index at upper bound");
+ TEST (x != 0, "_get returns zero for index at upper bound");
+
+ FUNCTION (gsl_vector, free) (v); /* free whatever is in v */
+}
+
+
+
+
+
diff --git a/gsl-1.9/vector/test_static.c b/gsl-1.9/vector/test_static.c
new file mode 100644
index 0000000..bd11f00
--- /dev/null
+++ b/gsl-1.9/vector/test_static.c
@@ -0,0 +1,6 @@
+#undef HAVE_INLINE
+#ifndef NO_INLINE
+#define NO_INLINE
+#endif
+#define DESC " (static)"
+#include "test.c"
diff --git a/gsl-1.9/vector/vector.c b/gsl-1.9/vector/vector.c
new file mode 100644
index 0000000..4dc2a82
--- /dev/null
+++ b/gsl-1.9/vector/vector.c
@@ -0,0 +1,109 @@
+/* vector/vector.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_vector.h>
+
+/* turn off range checking at runtime if zero */
+int gsl_check_range = 1;
+
+#define BASE_GSL_COMPLEX_LONG
+#include "templates_on.h"
+#include "vector_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_LONG
+
+#define BASE_GSL_COMPLEX
+#include "templates_on.h"
+#include "vector_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX
+
+#define BASE_GSL_COMPLEX_FLOAT
+#include "templates_on.h"
+#include "vector_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_FLOAT
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "vector_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "vector_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "vector_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "vector_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "vector_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "vector_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "vector_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "vector_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "vector_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "vector_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "vector_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
diff --git a/gsl-1.9/vector/vector_source.c b/gsl-1.9/vector/vector_source.c
new file mode 100644
index 0000000..f0f6332
--- /dev/null
+++ b/gsl-1.9/vector/vector_source.c
@@ -0,0 +1,83 @@
+/* vector/vector_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef HIDE_INLINE_STATIC
+BASE
+FUNCTION (gsl_vector, get) (const TYPE (gsl_vector) * v, const size_t i)
+{
+ if (gsl_check_range)
+ {
+ if (i >= v->size) /* size_t is unsigned, can't be negative */
+ {
+ BASE zero = ZERO;
+ GSL_ERROR_VAL ("index out of range", GSL_EINVAL, zero);
+ }
+ }
+
+ /* The following line is a generalization of return v->data[i] */
+
+ return *(BASE *) (v->data + MULTIPLICITY * i * v->stride);
+}
+
+void
+FUNCTION (gsl_vector, set) (TYPE (gsl_vector) * v, const size_t i, BASE x)
+{
+ if (gsl_check_range)
+ {
+ if (i >= v->size) /* size_t is unsigned, can't be negative */
+ {
+ GSL_ERROR_VOID ("index out of range", GSL_EINVAL);
+ }
+ }
+
+ /* The following line is a generalization of v->data[i] = x */
+
+ *(BASE *) (v->data + MULTIPLICITY * i * v->stride) = x;
+}
+
+BASE *
+FUNCTION (gsl_vector, ptr) (TYPE (gsl_vector) * v, const size_t i)
+{
+ if (gsl_check_range)
+ {
+ if (i >= v->size) /* size_t is unsigned, can't be negative */
+ {
+ GSL_ERROR_NULL ("index out of range", GSL_EINVAL);
+ }
+ }
+
+ return (BASE *) (v->data + MULTIPLICITY * i * v->stride);
+}
+
+const BASE *
+FUNCTION (gsl_vector, const_ptr) (const TYPE (gsl_vector) * v, const size_t i)
+{
+ if (gsl_check_range)
+ {
+ if (i >= v->size) /* size_t is unsigned, can't be negative */
+ {
+ GSL_ERROR_NULL ("index out of range", GSL_EINVAL);
+ }
+ }
+
+ /* The following line is a generalization of return v->data[i] */
+
+ return (const BASE *) (v->data + MULTIPLICITY * i * v->stride);
+}
+#endif
diff --git a/gsl-1.9/vector/view.c b/gsl-1.9/vector/view.c
new file mode 100644
index 0000000..da7b5e9
--- /dev/null
+++ b/gsl-1.9/vector/view.c
@@ -0,0 +1,176 @@
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_vector.h>
+
+#include "view.h"
+
+#define BASE_GSL_COMPLEX_LONG
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_LONG
+
+#define BASE_GSL_COMPLEX
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX
+
+#define BASE_GSL_COMPLEX_FLOAT
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_FLOAT
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
+
+#define USE_QUALIFIER
+#define QUALIFIER const
+
+#define BASE_GSL_COMPLEX_LONG
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_LONG
+
+#define BASE_GSL_COMPLEX
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX
+
+#define BASE_GSL_COMPLEX_FLOAT
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_GSL_COMPLEX_FLOAT
+
+#define BASE_LONG_DOUBLE
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_LONG_DOUBLE
+
+#define BASE_DOUBLE
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_DOUBLE
+
+#define BASE_FLOAT
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_FLOAT
+
+#define BASE_ULONG
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_ULONG
+
+#define BASE_LONG
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_LONG
+
+#define BASE_UINT
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_UINT
+
+#define BASE_INT
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_INT
+
+#define BASE_USHORT
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_USHORT
+
+#define BASE_SHORT
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_SHORT
+
+#define BASE_UCHAR
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_UCHAR
+
+#define BASE_CHAR
+#include "templates_on.h"
+#include "view_source.c"
+#include "templates_off.h"
+#undef BASE_CHAR
diff --git a/gsl-1.9/vector/view.h b/gsl-1.9/vector/view.h
new file mode 100644
index 0000000..37e324a
--- /dev/null
+++ b/gsl-1.9/vector/view.h
@@ -0,0 +1,2 @@
+#define NULL_VECTOR {0, 0, 0, 0, 0}
+#define NULL_VECTOR_VIEW {{0, 0, 0, 0, 0}}
diff --git a/gsl-1.9/vector/view_source.c b/gsl-1.9/vector/view_source.c
new file mode 100644
index 0000000..421bbc3
--- /dev/null
+++ b/gsl-1.9/vector/view_source.c
@@ -0,0 +1,76 @@
+/* vector/view_source.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 Gerard Jungman, Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+QUALIFIED_VIEW(_gsl_vector,view)
+FUNCTION(gsl_vector, view_array) (QUALIFIER ATOMIC * base, size_t n)
+{
+ QUALIFIED_VIEW(_gsl_vector,view) view = NULL_VECTOR_VIEW;
+
+ if (n == 0)
+ {
+ GSL_ERROR_VAL ("vector length n must be positive integer",
+ GSL_EINVAL, view);
+ }
+
+ {
+ TYPE(gsl_vector) v = NULL_VECTOR;
+
+ v.data = (ATOMIC *)base ;
+ v.size = n;
+ v.stride = 1;
+ v.block = 0;
+ v.owner = 0;
+
+ view.vector = v;
+ return view;
+ }
+}
+
+QUALIFIED_VIEW(_gsl_vector,view)
+FUNCTION(gsl_vector, view_array_with_stride) (QUALIFIER ATOMIC * base,
+ size_t stride,
+ size_t n)
+{
+ QUALIFIED_VIEW(_gsl_vector,view) view = NULL_VECTOR_VIEW;
+
+ if (n == 0)
+ {
+ GSL_ERROR_VAL ("vector length n must be positive integer",
+ GSL_EINVAL, view);
+ }
+
+ if (stride == 0)
+ {
+ GSL_ERROR_VAL ("stride must be positive integer",
+ GSL_EINVAL, view);
+ }
+
+ {
+ TYPE(gsl_vector) v = NULL_VECTOR;
+
+ v.data = (ATOMIC *)base ;
+ v.size = n;
+ v.stride = stride;
+ v.block = 0;
+ v.owner = 0;
+
+ view.vector = v;
+ return view;
+ }
+}
diff --git a/gsl-1.9/version.c b/gsl-1.9/version.c
new file mode 100644
index 0000000..e52499f
--- /dev/null
+++ b/gsl-1.9/version.c
@@ -0,0 +1,30 @@
+/* version.c
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl_version.h>
+
+/* This file needs to use the top-level <gsl_version.h> due to the
+ possibility of a VPATH-style build where the original source
+ tree is on read-only filesystem and so will not be picked up
+ by the symlinking comands in gsl/Makefile.am */
+
+
+const char * gsl_version = GSL_VERSION;
+
diff --git a/gsl-1.9/wavelet/ChangeLog b/gsl-1.9/wavelet/ChangeLog
new file mode 100644
index 0000000..9d5f240
--- /dev/null
+++ b/gsl-1.9/wavelet/ChangeLog
@@ -0,0 +1,14 @@
+2006-03-16 Brian Gough <bjg@network-theory.co.uk>
+
+ * changed to gsl_wavelet_forward and gsl_wavelet_backward enums
+ throughout internally instead of forward and backward.
+
+2004-12-29 Brian Gough <bjg@network-theory.co.uk>
+
+ * gsl_wavelet.h: added missing includes, use GSL_VAR instead of
+ extern
+
+2004-07-23 Brian Gough <bjg@network-theory.co.uk>
+
+ * added wavelet directory from Ivo Alxneit.
+
diff --git a/gsl-1.9/wavelet/Makefile.am b/gsl-1.9/wavelet/Makefile.am
new file mode 100644
index 0000000..fba86b4
--- /dev/null
+++ b/gsl-1.9/wavelet/Makefile.am
@@ -0,0 +1,17 @@
+noinst_LTLIBRARIES = libgslwavelet.la
+
+pkginclude_HEADERS = gsl_wavelet.h gsl_wavelet2d.h
+
+INCLUDES= -I$(top_builddir)
+
+libgslwavelet_la_SOURCES = dwt.c wavelet.c bspline.c daubechies.c haar.c
+
+check_PROGRAMS = test
+
+TESTS = $(check_PROGRAMS)
+
+test_LDADD = libgslwavelet.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+
+test_SOURCES = test.c
+
+
diff --git a/gsl-1.9/wavelet/Makefile.in b/gsl-1.9/wavelet/Makefile.in
new file mode 100644
index 0000000..ea12ea8
--- /dev/null
+++ b/gsl-1.9/wavelet/Makefile.in
@@ -0,0 +1,546 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = test$(EXEEXT)
+subdir = wavelet
+DIST_COMMON = $(pkginclude_HEADERS) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in ChangeLog TODO
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libgslwavelet_la_LIBADD =
+am_libgslwavelet_la_OBJECTS = dwt.lo wavelet.lo bspline.lo \
+ daubechies.lo haar.lo
+libgslwavelet_la_OBJECTS = $(am_libgslwavelet_la_OBJECTS)
+am_test_OBJECTS = test.$(OBJEXT)
+test_OBJECTS = $(am_test_OBJECTS)
+test_DEPENDENCIES = libgslwavelet.la ../blas/libgslblas.la \
+ ../cblas/libgslcblas.la ../matrix/libgslmatrix.la \
+ ../vector/libgslvector.la ../block/libgslblock.la \
+ ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la \
+ ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp =
+am__depfiles_maybe =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libgslwavelet_la_SOURCES) $(test_SOURCES)
+DIST_SOURCES = $(libgslwavelet_la_SOURCES) $(test_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(pkginclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GSL_CFLAGS = @GSL_CFLAGS@
+GSL_LIBS = @GSL_LIBS@
+GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@
+GSL_LT_VERSION = @GSL_LT_VERSION@
+HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@
+HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@
+HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@
+HAVE_EXTENDED_PRECISION_REGISTERS = @HAVE_EXTENDED_PRECISION_REGISTERS@
+HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@
+HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@
+HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@
+HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@
+HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@
+HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@
+HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@
+HAVE_IEEE_COMPARISONS = @HAVE_IEEE_COMPARISONS@
+HAVE_IEEE_DENORMALS = @HAVE_IEEE_DENORMALS@
+HAVE_INLINE = @HAVE_INLINE@
+HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@
+HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@
+HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@
+HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@
+HAVE_PRINTF_LONGDOUBLE = @HAVE_PRINTF_LONGDOUBLE@
+HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@
+HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@
+HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RELEASED = @RELEASED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LTLIBRARIES = libgslwavelet.la
+pkginclude_HEADERS = gsl_wavelet.h gsl_wavelet2d.h
+INCLUDES = -I$(top_builddir)
+libgslwavelet_la_SOURCES = dwt.c wavelet.c bspline.c daubechies.c haar.c
+TESTS = $(check_PROGRAMS)
+test_LDADD = libgslwavelet.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la
+test_SOURCES = test.c
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps wavelet/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu --ignore-deps wavelet/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgslwavelet.la: $(libgslwavelet_la_OBJECTS) $(libgslwavelet_la_DEPENDENCIES)
+ $(LINK) $(libgslwavelet_la_LDFLAGS) $(libgslwavelet_la_OBJECTS) $(libgslwavelet_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES)
+ @rm -f test$(EXEEXT)
+ $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+.c.o:
+ $(COMPILE) -c $<
+
+.c.obj:
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgincludedir)" || $(mkdir_p) "$(DESTDIR)$(pkgincludedir)"
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ $(pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+uninstall-pkgincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkginclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkgincludeHEADERS
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man \
+ install-pkgincludeHEADERS install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkgincludeHEADERS
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gsl-1.9/wavelet/TODO b/gsl-1.9/wavelet/TODO
new file mode 100644
index 0000000..ea5347b
--- /dev/null
+++ b/gsl-1.9/wavelet/TODO
@@ -0,0 +1,11 @@
+* Implement more wavelet types:
+ Check the literature to find out what are commonly used types. Candidates
+ could be coiflets and symmlets.
+** Coefficients for coiflets and symmlets found so far are only with a
+ precision of about eight digts. This is probaly insufficient.
+
+* Wavelet packet transform:
+ Should include utility functions for selecting the coefficients according
+ to "dwt-type", "best basis" or "best level".
+
+* Continuous wavelet transform.
diff --git a/gsl-1.9/wavelet/bspline.c b/gsl-1.9/wavelet/bspline.c
new file mode 100644
index 0000000..7ac1411
--- /dev/null
+++ b/gsl-1.9/wavelet/bspline.c
@@ -0,0 +1,591 @@
+/* wavelet/bspline.c
+ *
+ * Copyright (C) 2004 Ivo Alxneit
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Coefficients are from A. Cohen, I. Daubechies, and J.-C. Feauveau;
+ * "Biorthogonal Bases of Compactly Supported Wavelets", Communications
+ * on Pure and Applied Mathematics, 45 (1992) 485--560 (table 6.1).
+ *
+ * Note the following errors in table 1:
+ *
+ * N = 2, N~ = 4, m0~
+ * the second term in z^-1 (45/64 z^-1) should be left out.
+ *
+ * N = 3, N~ = 7, m0~
+ * the term 336z^-3 should read 363z^-3.
+ */
+
+#include <config.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_wavelet.h>
+
+static const double h1_103[6] = { -0.0883883476483184405501055452631,
+ 0.0883883476483184405501055452631,
+ M_SQRT1_2,
+ M_SQRT1_2,
+ 0.0883883476483184405501055452631,
+ -0.0883883476483184405501055452631
+};
+
+static const double g2_103[6] = { -0.0883883476483184405501055452631,
+ -0.0883883476483184405501055452631,
+ M_SQRT1_2,
+ -(M_SQRT1_2),
+ 0.0883883476483184405501055452631,
+ 0.0883883476483184405501055452631
+};
+
+static const double h1_105[10] = { 0.0165728151840597076031447897368,
+ -0.0165728151840597076031447897368,
+ -0.1215339780164378557563951247368,
+ 0.1215339780164378557563951247368,
+ M_SQRT1_2,
+ M_SQRT1_2,
+ 0.1215339780164378557563951247368,
+ -0.1215339780164378557563951247368,
+ -0.0165728151840597076031447897368,
+ 0.0165728151840597076031447897368
+};
+
+static const double g2_105[10] = { 0.0165728151840597076031447897368,
+ 0.0165728151840597076031447897368,
+ -0.1215339780164378557563951247368,
+ -0.1215339780164378557563951247368,
+ M_SQRT1_2,
+ -(M_SQRT1_2),
+ 0.1215339780164378557563951247368,
+ 0.1215339780164378557563951247368,
+ -0.0165728151840597076031447897368,
+ -0.0165728151840597076031447897368
+};
+
+static const double g1_1[10] = { 0.0, 0.0, 0.0, 0.0,
+ M_SQRT1_2,
+ -(M_SQRT1_2),
+ 0.0, 0.0, 0.0, 0.0
+};
+
+static const double h2_1[10] = { 0.0, 0.0, 0.0, 0.0,
+ M_SQRT1_2,
+ M_SQRT1_2,
+ 0.0, 0.0, 0.0, 0.0
+};
+
+static const double h1_202[6] = { -0.1767766952966368811002110905262,
+ 0.3535533905932737622004221810524,
+ 1.0606601717798212866012665431573,
+ 0.3535533905932737622004221810524,
+ -0.1767766952966368811002110905262,
+ 0.0
+};
+
+static const double g2_202[6] = { 0.0,
+ -0.1767766952966368811002110905262,
+ -0.3535533905932737622004221810524,
+ 1.0606601717798212866012665431573,
+ -0.3535533905932737622004221810524,
+ -0.1767766952966368811002110905262
+};
+
+static const double h1_204[10] = { 0.0331456303681194152062895794737,
+ -0.0662912607362388304125791589473,
+ -0.1767766952966368811002110905262,
+ 0.4198446513295125926130013399998,
+ 0.9943689110435824561886873842099,
+ 0.4198446513295125926130013399998,
+ -0.1767766952966368811002110905262,
+ -0.0662912607362388304125791589473,
+ 0.0331456303681194152062895794737,
+ 0.0
+};
+
+static const double g2_204[10] = { 0.0,
+ 0.0331456303681194152062895794737,
+ 0.0662912607362388304125791589473,
+ -0.1767766952966368811002110905262,
+ -0.4198446513295125926130013399998,
+ 0.9943689110435824561886873842099,
+ -0.4198446513295125926130013399998,
+ -0.1767766952966368811002110905262,
+ 0.0662912607362388304125791589473,
+ 0.0331456303681194152062895794737
+};
+
+static const double h1_206[14] = { -0.0069053396600248781679769957237,
+ 0.0138106793200497563359539914474,
+ 0.0469563096881691715422435709210,
+ -0.1077232986963880994204411332894,
+ -0.1698713556366120029322340948025,
+ 0.4474660099696121052849093228945,
+ 0.9667475524034829435167794013152,
+ 0.4474660099696121052849093228945,
+ -0.1698713556366120029322340948025,
+ -0.1077232986963880994204411332894,
+ 0.0469563096881691715422435709210,
+ 0.0138106793200497563359539914474,
+ -0.0069053396600248781679769957237,
+ 0.0
+};
+
+static const double g2_206[14] = { 0.0,
+ -0.0069053396600248781679769957237,
+ -0.0138106793200497563359539914474,
+ 0.0469563096881691715422435709210,
+ 0.1077232986963880994204411332894,
+ -0.1698713556366120029322340948025,
+ -0.4474660099696121052849093228945,
+ 0.9667475524034829435167794013152,
+ -0.4474660099696121052849093228945,
+ -0.1698713556366120029322340948025,
+ 0.1077232986963880994204411332894,
+ 0.0469563096881691715422435709210,
+ -0.0138106793200497563359539914474,
+ -0.0069053396600248781679769957237,
+};
+
+static const double h1_208[18] = { 0.0015105430506304420992449678146,
+ -0.0030210861012608841984899356291,
+ -0.0129475118625466465649568669819,
+ 0.0289161098263541773284036695929,
+ 0.0529984818906909399392234421792,
+ -0.1349130736077360572068505539514,
+ -0.1638291834340902345352542235443,
+ 0.4625714404759165262773590010400,
+ 0.9516421218971785225243297231697,
+ 0.4625714404759165262773590010400,
+ -0.1638291834340902345352542235443,
+ -0.1349130736077360572068505539514,
+ 0.0529984818906909399392234421792,
+ 0.0289161098263541773284036695929,
+ -0.0129475118625466465649568669819,
+ -0.0030210861012608841984899356291,
+ 0.0015105430506304420992449678146,
+ 0.0
+};
+
+static const double g2_208[18] = { 0.0,
+ 0.0015105430506304420992449678146,
+ 0.0030210861012608841984899356291,
+ -0.0129475118625466465649568669819,
+ -0.0289161098263541773284036695929,
+ 0.0529984818906909399392234421792,
+ 0.1349130736077360572068505539514,
+ -0.1638291834340902345352542235443,
+ -0.4625714404759165262773590010400,
+ 0.9516421218971785225243297231697,
+ -0.4625714404759165262773590010400,
+ -0.1638291834340902345352542235443,
+ 0.1349130736077360572068505539514,
+ 0.0529984818906909399392234421792,
+ -0.0289161098263541773284036695929,
+ -0.0129475118625466465649568669819,
+ 0.0030210861012608841984899356291,
+ 0.0015105430506304420992449678146,
+};
+
+static const double h2_2[18] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+ 0.3535533905932737622004221810524,
+ 0.7071067811865475244008443621048,
+ 0.3535533905932737622004221810524,
+ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0
+};
+
+static const double g1_2[18] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+ -0.3535533905932737622004221810524,
+ 0.7071067811865475244008443621048,
+ -0.3535533905932737622004221810524,
+ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0
+};
+
+static const double h1_301[4] = { -0.3535533905932737622004221810524,
+ 1.0606601717798212866012665431573,
+ 1.0606601717798212866012665431573,
+ -0.3535533905932737622004221810524
+};
+
+static const double g2_301[4] = { 0.3535533905932737622004221810524,
+ 1.0606601717798212866012665431573,
+ -1.0606601717798212866012665431573,
+ -0.3535533905932737622004221810524
+};
+
+static const double h1_303[8] = { 0.0662912607362388304125791589473,
+ -0.1988737822087164912377374768420,
+ -0.1546796083845572709626847042104,
+ 0.9943689110435824561886873842099,
+ 0.9943689110435824561886873842099,
+ -0.1546796083845572709626847042104,
+ -0.1988737822087164912377374768420,
+ 0.0662912607362388304125791589473
+};
+
+static const double g2_303[8] = { -0.0662912607362388304125791589473,
+ -0.1988737822087164912377374768420,
+ 0.1546796083845572709626847042104,
+ 0.9943689110435824561886873842099,
+ -0.9943689110435824561886873842099,
+ -0.1546796083845572709626847042104,
+ 0.1988737822087164912377374768420,
+ 0.0662912607362388304125791589473
+};
+
+static const double h1_305[12] = { -0.0138106793200497563359539914474,
+ 0.0414320379601492690078619743421,
+ 0.0524805814161890740766251675000,
+ -0.2679271788089652729175074340788,
+ -0.0718155324642587329469607555263,
+ 0.9667475524034829435167794013152,
+ 0.9667475524034829435167794013152,
+ -0.0718155324642587329469607555263,
+ -0.2679271788089652729175074340788,
+ 0.0524805814161890740766251675000,
+ 0.0414320379601492690078619743421,
+ -0.0138106793200497563359539914474
+};
+
+static const double g2_305[12] = { 0.0138106793200497563359539914474,
+ 0.0414320379601492690078619743421,
+ -0.0524805814161890740766251675000,
+ -0.2679271788089652729175074340788,
+ 0.0718155324642587329469607555263,
+ 0.9667475524034829435167794013152,
+ -0.9667475524034829435167794013152,
+ -0.0718155324642587329469607555263,
+ 0.2679271788089652729175074340788,
+ 0.0524805814161890740766251675000,
+ -0.0414320379601492690078619743421,
+ -0.0138106793200497563359539914474
+};
+
+static const double h1_307[16] = { 0.0030210861012608841984899356291,
+ -0.0090632583037826525954698068873,
+ -0.0168317654213106405344439270765,
+ 0.0746639850740189951912512662623,
+ 0.0313329787073628846871956180962,
+ -0.3011591259228349991008967259990,
+ -0.0264992409453454699696117210896,
+ 0.9516421218971785225243297231697,
+ 0.9516421218971785225243297231697,
+ -0.0264992409453454699696117210896,
+ -0.3011591259228349991008967259990,
+ 0.0313329787073628846871956180962,
+ 0.0746639850740189951912512662623,
+ -0.0168317654213106405344439270765,
+ -0.0090632583037826525954698068873,
+ 0.0030210861012608841984899356291
+};
+
+static const double g2_307[16] = { -0.0030210861012608841984899356291,
+ -0.0090632583037826525954698068873,
+ 0.0168317654213106405344439270765,
+ 0.0746639850740189951912512662623,
+ -0.0313329787073628846871956180962,
+ -0.3011591259228349991008967259990,
+ 0.0264992409453454699696117210896,
+ 0.9516421218971785225243297231697,
+ -0.9516421218971785225243297231697,
+ -0.0264992409453454699696117210896,
+ 0.3011591259228349991008967259990,
+ 0.0313329787073628846871956180962,
+ -0.0746639850740189951912512662623,
+ -0.0168317654213106405344439270765,
+ 0.0090632583037826525954698068873,
+ 0.0030210861012608841984899356291
+};
+
+static const double h1_309[20] = { -0.0006797443727836989446602355165,
+ 0.0020392331183510968339807065496,
+ 0.0050603192196119810324706421788,
+ -0.0206189126411055346546938106687,
+ -0.0141127879301758447558029850103,
+ 0.0991347824942321571990197448581,
+ 0.0123001362694193142367090236328,
+ -0.3201919683607785695513833204624,
+ 0.0020500227115698857061181706055,
+ 0.9421257006782067372990864259380,
+ 0.9421257006782067372990864259380,
+ 0.0020500227115698857061181706055,
+ -0.3201919683607785695513833204624,
+ 0.0123001362694193142367090236328,
+ 0.0991347824942321571990197448581,
+ -0.0141127879301758447558029850103,
+ -0.0206189126411055346546938106687,
+ 0.0050603192196119810324706421788,
+ 0.0020392331183510968339807065496,
+ -0.0006797443727836989446602355165
+};
+
+static const double g2_309[20] = { 0.0006797443727836989446602355165,
+ 0.0020392331183510968339807065496,
+ -0.0050603192196119810324706421788,
+ -0.0206189126411055346546938106687,
+ 0.0141127879301758447558029850103,
+ 0.0991347824942321571990197448581,
+ -0.0123001362694193142367090236328,
+ -0.3201919683607785695513833204624,
+ -0.0020500227115698857061181706055,
+ 0.9421257006782067372990864259380,
+ -0.9421257006782067372990864259380,
+ 0.0020500227115698857061181706055,
+ 0.3201919683607785695513833204624,
+ 0.0123001362694193142367090236328,
+ -0.0991347824942321571990197448581,
+ -0.0141127879301758447558029850103,
+ 0.0206189126411055346546938106687,
+ 0.0050603192196119810324706421788,
+ -0.0020392331183510968339807065496,
+ -0.0006797443727836989446602355165
+};
+
+static const double h2_3[20] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+ 0.1767766952966368811002110905262,
+ 0.5303300858899106433006332715786,
+ 0.5303300858899106433006332715786,
+ 0.1767766952966368811002110905262,
+ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0
+};
+
+static const double g1_3[20] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+ -0.1767766952966368811002110905262,
+ 0.5303300858899106433006332715786,
+ -0.5303300858899106433006332715786,
+ 0.1767766952966368811002110905262,
+ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0
+};
+
+static int
+bspline_init (const double **h1, const double **g1,
+ const double **h2, const double **g2, size_t * nc,
+ size_t * offset, size_t member)
+{
+ switch (member)
+ {
+ case 103:
+ *nc = 6;
+ *h1 = h1_103;
+ *g1 = &g1_1[2];
+ *h2 = &h2_1[2];
+ *g2 = g2_103;
+ break;
+
+ case 105:
+ *nc = 10;
+ *h1 = h1_105;
+ *g1 = g1_1;
+ *h2 = h2_1;
+ *g2 = g2_105;
+ break;
+
+ case 202:
+ *nc = 6;
+ *h1 = h1_202;
+ *g1 = &g1_2[6];
+ *h2 = &h2_2[6];
+ *g2 = g2_202;
+ break;
+
+ case 204:
+ *nc = 10;
+ *h1 = h1_204;
+ *g1 = &g1_2[4];
+ *h2 = &h2_2[4];
+ *g2 = g2_204;
+ break;
+
+ case 206:
+ *nc = 14;
+ *h1 = h1_206;
+ *g1 = &g1_2[2];
+ *h2 = &h2_2[2];
+ *g2 = g2_206;
+ break;
+
+ case 208:
+ *nc = 18;
+ *h1 = h1_208;
+ *g1 = g1_2;
+ *h2 = h2_2;
+ *g2 = g2_208;
+ break;
+
+ case 301:
+ *nc = 4;
+ *h1 = h1_301;
+ *g1 = &g1_3[8];
+ *h2 = &h2_3[8];
+ *g2 = g2_301;
+ break;
+
+ case 303:
+ *nc = 8;
+ *h1 = h1_303;
+ *g1 = &g1_3[6];
+ *h2 = &h2_3[6];
+ *g2 = g2_303;
+ break;
+
+ case 305:
+ *nc = 12;
+ *h1 = h1_305;
+ *g1 = &g1_3[4];
+ *h2 = &h2_3[4];
+ *g2 = g2_305;
+ break;
+
+ case 307:
+ *nc = 16;
+ *h1 = h1_307;
+ *g1 = &g1_3[2];
+ *h2 = &h2_3[2];
+ *g2 = g2_307;
+ break;
+
+ case 309:
+ *nc = 20;
+ *h1 = h1_309;
+ *g1 = g1_3;
+ *h2 = h2_3;
+ *g2 = g2_309;
+ break;
+
+ default:
+ return GSL_FAILURE;
+ }
+
+ *offset = 0;
+
+ return GSL_SUCCESS;
+}
+
+static int
+bspline_centered_init (const double **h1, const double **g1,
+ const double **h2, const double **g2, size_t * nc,
+ size_t * offset, size_t member)
+{
+ switch (member)
+ {
+ case 103:
+ *nc = 6;
+ *h1 = h1_103;
+ *g1 = &g1_1[2];
+ *h2 = &h2_1[2];
+ *g2 = g2_103;
+ break;
+
+ case 105:
+ *nc = 10;
+ *h1 = h1_105;
+ *g1 = g1_1;
+ *h2 = h2_1;
+ *g2 = g2_105;
+ break;
+
+ case 202:
+ *nc = 6;
+ *h1 = h1_202;
+ *g1 = &g1_2[6];
+ *h2 = &h2_2[6];
+ *g2 = g2_202;
+ break;
+
+ case 204:
+ *nc = 10;
+ *h1 = h1_204;
+ *g1 = &g1_2[4];
+ *h2 = &h2_2[4];
+ *g2 = g2_204;
+ break;
+
+ case 206:
+ *nc = 14;
+ *h1 = h1_206;
+ *g1 = &g1_2[2];
+ *h2 = &h2_2[2];
+ *g2 = g2_206;
+ break;
+
+ case 208:
+ *nc = 18;
+ *h1 = h1_208;
+ *g1 = g1_2;
+ *h2 = h2_2;
+ *g2 = g2_208;
+ break;
+
+ case 301:
+ *nc = 4;
+ *h1 = h1_301;
+ *g1 = &g1_3[8];
+ *h2 = &h2_3[8];
+ *g2 = g2_301;
+ break;
+
+ case 303:
+ *nc = 8;
+ *h1 = h1_303;
+ *g1 = &g1_3[6];
+ *h2 = &h2_3[6];
+ *g2 = g2_303;
+ break;
+
+ case 305:
+ *nc = 12;
+ *h1 = h1_305;
+ *g1 = &g1_3[4];
+ *h2 = &h2_3[4];
+ *g2 = g2_305;
+ break;
+
+ case 307:
+ *nc = 16;
+ *h1 = h1_307;
+ *g1 = &g1_3[2];
+ *h2 = &h2_3[2];
+ *g2 = g2_307;
+ break;
+
+ case 309:
+ *nc = 20;
+ *h1 = h1_309;
+ *g1 = g1_3;
+ *h2 = h2_3;
+ *g2 = g2_309;
+ break;
+
+ default:
+ return GSL_FAILURE;
+ }
+
+ *offset = ((*nc) >> 1);
+
+ return GSL_SUCCESS;
+}
+
+static const gsl_wavelet_type bspline_type = {
+ "bspline",
+ &bspline_init
+};
+
+static const gsl_wavelet_type bspline_centered_type = {
+ "bspline-centered",
+ &bspline_centered_init
+};
+
+const gsl_wavelet_type *gsl_wavelet_bspline = &bspline_type;
+const gsl_wavelet_type *gsl_wavelet_bspline_centered = &bspline_centered_type;
diff --git a/gsl-1.9/wavelet/daubechies.c b/gsl-1.9/wavelet/daubechies.c
new file mode 100644
index 0000000..67b7daa
--- /dev/null
+++ b/gsl-1.9/wavelet/daubechies.c
@@ -0,0 +1,458 @@
+/* wavelet/daubechies.c
+ *
+ * Copyright (C) 2004 Ivo Alxneit
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/*
+ * Coefficients for Daubechies wavelets of extremal phase are from
+ * I. Daubechies, "Orthonormal Bases of Compactly Supported Wavelets",
+ * Communications on Pure and Applied Mathematics, 41 (1988) 909--996
+ * (table 1).
+ * Additional digits have been obtained using the Mathematica package
+ * Daubechies.m by Tong Chen & Meng Xu available at
+ * http://www.cwp.mines.edu/wavelets/.
+ */
+
+#include <config.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_wavelet.h>
+
+static const double h_4[4] = { 0.48296291314453414337487159986,
+ 0.83651630373780790557529378092,
+ 0.22414386804201338102597276224,
+ -0.12940952255126038117444941881
+};
+
+static const double g_4[4] = { -0.12940952255126038117444941881,
+ -0.22414386804201338102597276224,
+ 0.83651630373780790557529378092,
+ -0.48296291314453414337487159986
+};
+
+static const double h_6[6] = { 0.33267055295008261599851158914,
+ 0.80689150931109257649449360409,
+ 0.45987750211849157009515194215,
+ -0.13501102001025458869638990670,
+ -0.08544127388202666169281916918,
+ 0.03522629188570953660274066472
+};
+
+static const double g_6[6] = { 0.03522629188570953660274066472,
+ 0.08544127388202666169281916918,
+ -0.13501102001025458869638990670,
+ -0.45987750211849157009515194215,
+ 0.80689150931109257649449360409,
+ -0.33267055295008261599851158914
+};
+
+static const double h_8[8] = { 0.23037781330889650086329118304,
+ 0.71484657055291564708992195527,
+ 0.63088076792985890788171633830,
+ -0.02798376941685985421141374718,
+ -0.18703481171909308407957067279,
+ 0.03084138183556076362721936253,
+ 0.03288301166688519973540751355,
+ -0.01059740178506903210488320852
+};
+
+static const double g_8[8] = { -0.01059740178506903210488320852,
+ -0.03288301166688519973540751355,
+ 0.03084138183556076362721936253,
+ 0.18703481171909308407957067279,
+ -0.02798376941685985421141374718,
+ -0.63088076792985890788171633830,
+ 0.71484657055291564708992195527,
+ -0.23037781330889650086329118304
+};
+
+static const double h_10[10] = { 0.16010239797419291448072374802,
+ 0.60382926979718967054011930653,
+ 0.72430852843777292772807124410,
+ 0.13842814590132073150539714634,
+ -0.24229488706638203186257137947,
+ -0.03224486958463837464847975506,
+ 0.07757149384004571352313048939,
+ -0.00624149021279827427419051911,
+ -0.01258075199908199946850973993,
+ 0.00333572528547377127799818342
+};
+
+static const double g_10[10] = { 0.00333572528547377127799818342,
+ 0.01258075199908199946850973993,
+ -0.00624149021279827427419051911,
+ -0.07757149384004571352313048939,
+ -0.03224486958463837464847975506,
+ 0.24229488706638203186257137947,
+ 0.13842814590132073150539714634,
+ -0.72430852843777292772807124410,
+ 0.60382926979718967054011930653,
+ -0.16010239797419291448072374802
+};
+
+static const double h_12[12] = { 0.11154074335010946362132391724,
+ 0.49462389039845308567720417688,
+ 0.75113390802109535067893449844,
+ 0.31525035170919762908598965481,
+ -0.22626469396543982007631450066,
+ -0.12976686756726193556228960588,
+ 0.09750160558732304910234355254,
+ 0.02752286553030572862554083950,
+ -0.03158203931748602956507908070,
+ 0.00055384220116149613925191840,
+ 0.00477725751094551063963597525,
+ -0.00107730108530847956485262161
+};
+
+static const double g_12[12] = { -0.00107730108530847956485262161,
+ -0.00477725751094551063963597525,
+ 0.00055384220116149613925191840,
+ 0.03158203931748602956507908070,
+ 0.02752286553030572862554083950,
+ -0.09750160558732304910234355254,
+ -0.12976686756726193556228960588,
+ 0.22626469396543982007631450066,
+ 0.31525035170919762908598965481,
+ -0.75113390802109535067893449844,
+ 0.49462389039845308567720417688,
+ -0.11154074335010946362132391724
+};
+
+static const double h_14[14] = { 0.07785205408500917901996352196,
+ 0.39653931948191730653900039094,
+ 0.72913209084623511991694307034,
+ 0.46978228740519312247159116097,
+ -0.14390600392856497540506836221,
+ -0.22403618499387498263814042023,
+ 0.07130921926683026475087657050,
+ 0.08061260915108307191292248036,
+ -0.03802993693501441357959206160,
+ -0.01657454163066688065410767489,
+ 0.01255099855609984061298988603,
+ 0.00042957797292136652113212912,
+ -0.00180164070404749091526826291,
+ 0.00035371379997452024844629584
+};
+
+static const double g_14[14] = { 0.00035371379997452024844629584,
+ 0.00180164070404749091526826291,
+ 0.00042957797292136652113212912,
+ -0.01255099855609984061298988603,
+ -0.01657454163066688065410767489,
+ 0.03802993693501441357959206160,
+ 0.08061260915108307191292248036,
+ -0.07130921926683026475087657050,
+ -0.22403618499387498263814042023,
+ 0.14390600392856497540506836221,
+ 0.46978228740519312247159116097,
+ -0.72913209084623511991694307034,
+ 0.39653931948191730653900039094,
+ -0.07785205408500917901996352196
+};
+
+static const double h_16[16] = { 0.05441584224310400995500940520,
+ 0.31287159091429997065916237551,
+ 0.67563073629728980680780076705,
+ 0.58535468365420671277126552005,
+ -0.01582910525634930566738054788,
+ -0.28401554296154692651620313237,
+ 0.00047248457391328277036059001,
+ 0.12874742662047845885702928751,
+ -0.01736930100180754616961614887,
+ -0.04408825393079475150676372324,
+ 0.01398102791739828164872293057,
+ 0.00874609404740577671638274325,
+ -0.00487035299345157431042218156,
+ -0.00039174037337694704629808036,
+ 0.00067544940645056936636954757,
+ -0.00011747678412476953373062823
+};
+
+static const double g_16[16] = { -0.00011747678412476953373062823,
+ -0.00067544940645056936636954757,
+ -0.00039174037337694704629808036,
+ 0.00487035299345157431042218156,
+ 0.00874609404740577671638274325,
+ -0.01398102791739828164872293057,
+ -0.04408825393079475150676372324,
+ 0.01736930100180754616961614887,
+ 0.12874742662047845885702928751,
+ -0.00047248457391328277036059001,
+ -0.28401554296154692651620313237,
+ 0.01582910525634930566738054788,
+ 0.58535468365420671277126552005,
+ -0.67563073629728980680780076705,
+ 0.31287159091429997065916237551,
+ -0.05441584224310400995500940520
+};
+
+static const double h_18[18] = { 0.03807794736387834658869765888,
+ 0.24383467461259035373204158165,
+ 0.60482312369011111190307686743,
+ 0.65728807805130053807821263905,
+ 0.13319738582500757619095494590,
+ -0.29327378327917490880640319524,
+ -0.09684078322297646051350813354,
+ 0.14854074933810638013507271751,
+ 0.03072568147933337921231740072,
+ -0.06763282906132997367564227483,
+ 0.00025094711483145195758718975,
+ 0.02236166212367909720537378270,
+ -0.00472320475775139727792570785,
+ -0.00428150368246342983449679500,
+ 0.00184764688305622647661912949,
+ 0.00023038576352319596720521639,
+ -0.00025196318894271013697498868,
+ 0.00003934732031627159948068988
+};
+
+static const double g_18[18] = { 0.00003934732031627159948068988,
+ 0.00025196318894271013697498868,
+ 0.00023038576352319596720521639,
+ -0.00184764688305622647661912949,
+ -0.00428150368246342983449679500,
+ 0.00472320475775139727792570785,
+ 0.02236166212367909720537378270,
+ -0.00025094711483145195758718975,
+ -0.06763282906132997367564227483,
+ -0.03072568147933337921231740072,
+ 0.14854074933810638013507271751,
+ 0.09684078322297646051350813354,
+ -0.29327378327917490880640319524,
+ -0.13319738582500757619095494590,
+ 0.65728807805130053807821263905,
+ -0.60482312369011111190307686743,
+ 0.24383467461259035373204158165,
+ -0.03807794736387834658869765888
+};
+
+static const double h_20[20] = { 0.02667005790055555358661744877,
+ 0.18817680007769148902089297368,
+ 0.52720118893172558648174482796,
+ 0.68845903945360356574187178255,
+ 0.28117234366057746074872699845,
+ -0.24984642432731537941610189792,
+ -0.19594627437737704350429925432,
+ 0.12736934033579326008267723320,
+ 0.09305736460357235116035228984,
+ -0.07139414716639708714533609308,
+ -0.02945753682187581285828323760,
+ 0.03321267405934100173976365318,
+ 0.00360655356695616965542329142,
+ -0.01073317548333057504431811411,
+ 0.00139535174705290116578931845,
+ 0.00199240529518505611715874224,
+ -0.00068585669495971162656137098,
+ -0.00011646685512928545095148097,
+ 0.00009358867032006959133405013,
+ -0.00001326420289452124481243668
+};
+
+static const double g_20[20] = { -0.00001326420289452124481243668,
+ -0.00009358867032006959133405013,
+ -0.00011646685512928545095148097,
+ 0.00068585669495971162656137098,
+ 0.00199240529518505611715874224,
+ -0.00139535174705290116578931845,
+ -0.01073317548333057504431811411,
+ -0.00360655356695616965542329142,
+ 0.03321267405934100173976365318,
+ 0.02945753682187581285828323760,
+ -0.07139414716639708714533609308,
+ -0.09305736460357235116035228984,
+ 0.12736934033579326008267723320,
+ 0.19594627437737704350429925432,
+ -0.24984642432731537941610189792,
+ -0.28117234366057746074872699845,
+ 0.68845903945360356574187178255,
+ -0.52720118893172558648174482796,
+ 0.18817680007769148902089297368,
+ -0.02667005790055555358661744877
+};
+
+static int
+daubechies_init (const double **h1, const double **g1, const double **h2,
+ const double **g2, size_t * nc, size_t * offset,
+ size_t member)
+{
+ switch (member)
+ {
+ case 4:
+ *h1 = h_4;
+ *g1 = g_4;
+ *h2 = h_4;
+ *g2 = g_4;
+ break;
+
+ case 6:
+ *h1 = h_6;
+ *g1 = g_6;
+ *h2 = h_6;
+ *g2 = g_6;
+ break;
+
+ case 8:
+ *h1 = h_8;
+ *g1 = g_8;
+ *h2 = h_8;
+ *g2 = g_8;
+ break;
+
+ case 10:
+ *h1 = h_10;
+ *g1 = g_10;
+ *h2 = h_10;
+ *g2 = g_10;
+ break;
+
+ case 12:
+ *h1 = h_12;
+ *g1 = g_12;
+ *h2 = h_12;
+ *g2 = g_12;
+ break;
+
+ case 14:
+ *h1 = h_14;
+ *g1 = g_14;
+ *h2 = h_14;
+ *g2 = g_14;
+ break;
+
+ case 16:
+ *h1 = h_16;
+ *g1 = g_16;
+ *h2 = h_16;
+ *g2 = g_16;
+ break;
+
+ case 18:
+ *h1 = h_18;
+ *g1 = g_18;
+ *h2 = h_18;
+ *g2 = g_18;
+ break;
+
+ case 20:
+ *h1 = h_20;
+ *g1 = g_20;
+ *h2 = h_20;
+ *g2 = g_20;
+ break;
+
+ default:
+ return GSL_FAILURE;
+ }
+
+ *nc = member;
+ *offset = 0;
+
+ return GSL_SUCCESS;
+}
+
+static int
+daubechies_centered_init (const double **h1, const double **g1,
+ const double **h2, const double **g2, size_t * nc,
+ size_t * offset, size_t member)
+{
+ switch (member)
+ {
+ case 4:
+ *h1 = h_4;
+ *g1 = g_4;
+ *h2 = h_4;
+ *g2 = g_4;
+ break;
+
+ case 6:
+ *h1 = h_6;
+ *g1 = g_6;
+ *h2 = h_6;
+ *g2 = g_6;
+ break;
+
+ case 8:
+ *h1 = h_8;
+ *g1 = g_8;
+ *h2 = h_8;
+ *g2 = g_8;
+ break;
+
+ case 10:
+ *h1 = h_10;
+ *g1 = g_10;
+ *h2 = h_10;
+ *g2 = g_10;
+ break;
+
+ case 12:
+ *h1 = h_12;
+ *g1 = g_12;
+ *h2 = h_12;
+ *g2 = g_12;
+ break;
+
+ case 14:
+ *h1 = h_14;
+ *g1 = g_14;
+ *h2 = h_14;
+ *g2 = g_14;
+ break;
+
+ case 16:
+ *h1 = h_16;
+ *g1 = g_16;
+ *h2 = h_16;
+ *g2 = g_16;
+ break;
+
+ case 18:
+ *h1 = h_18;
+ *g1 = g_18;
+ *h2 = h_18;
+ *g2 = g_18;
+ break;
+
+ case 20:
+ *h1 = h_20;
+ *g1 = g_20;
+ *h2 = h_20;
+ *g2 = g_20;
+ break;
+
+ default:
+ return GSL_FAILURE;
+ }
+
+ *nc = member;
+ *offset = (member >> 1);
+
+ return GSL_SUCCESS;
+}
+
+static const gsl_wavelet_type daubechies_type = {
+ "daubechies",
+ &daubechies_init
+};
+
+static const gsl_wavelet_type daubechies_centered_type = {
+ "daubechies-centered",
+ &daubechies_centered_init
+};
+
+const gsl_wavelet_type *gsl_wavelet_daubechies = &daubechies_type;
+const gsl_wavelet_type *gsl_wavelet_daubechies_centered =
+ &daubechies_centered_type;
diff --git a/gsl-1.9/wavelet/dwt.c b/gsl-1.9/wavelet/dwt.c
new file mode 100644
index 0000000..7d621eb
--- /dev/null
+++ b/gsl-1.9/wavelet/dwt.c
@@ -0,0 +1,390 @@
+/* wavelet/dwt.c
+ *
+ * Copyright (C) 2004 Ivo Alxneit
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* function dwt_step is based on the public domain function pwt.c
+ * available from http://www.numerical-recipes.com
+ */
+
+#include <config.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_wavelet.h>
+#include <gsl/gsl_wavelet2d.h>
+
+#define ELEMENT(a,stride,i) ((a)[(stride)*(i)])
+
+static int binary_logn (const size_t n);
+static void dwt_step (const gsl_wavelet * w, double *a, size_t stride, size_t n, gsl_wavelet_direction dir, gsl_wavelet_workspace * work);
+
+static int
+binary_logn (const size_t n)
+{
+ size_t ntest;
+ size_t logn = 0;
+ size_t k = 1;
+
+ while (k < n)
+ {
+ k *= 2;
+ logn++;
+ }
+
+ ntest = (1 << logn);
+
+ if (n != ntest)
+ {
+ return -1; /* n is not a power of 2 */
+ }
+
+ return logn;
+}
+
+static void
+dwt_step (const gsl_wavelet * w, double *a, size_t stride, size_t n,
+ gsl_wavelet_direction dir, gsl_wavelet_workspace * work)
+{
+ double ai, ai1;
+ size_t i, ii;
+ size_t jf;
+ size_t k;
+ size_t n1, ni, nh, nmod;
+
+ for (i = 0; i < work->n; i++)
+ {
+ work->scratch[i] = 0.0;
+ }
+
+ nmod = w->nc * n;
+ nmod -= w->offset; /* center support */
+
+ n1 = n - 1;
+ nh = n >> 1;
+
+ if (dir == gsl_wavelet_forward)
+ {
+ for (ii = 0, i = 0; i < n; i += 2, ii++)
+ {
+ ni = i + nmod;
+ for (k = 0; k < w->nc; k++)
+ {
+ jf = n1 & (ni + k);
+ work->scratch[ii] += w->h1[k] * ELEMENT (a, stride, jf);
+ work->scratch[ii + nh] += w->g1[k] * ELEMENT (a, stride, jf);
+ }
+ }
+ }
+ else
+ {
+ for (ii = 0, i = 0; i < n; i += 2, ii++)
+ {
+ ai = ELEMENT (a, stride, ii);
+ ai1 = ELEMENT (a, stride, ii + nh);
+ ni = i + nmod;
+ for (k = 0; k < w->nc; k++)
+ {
+ jf = (n1 & (ni + k));
+ work->scratch[jf] += (w->h2[k] * ai + w->g2[k] * ai1);
+ }
+ }
+ }
+
+ for (i = 0; i < n; i++)
+ {
+ ELEMENT (a, stride, i) = work->scratch[i];
+ }
+}
+
+int
+gsl_wavelet_transform (const gsl_wavelet * w,
+ double *data, size_t stride, size_t n,
+ gsl_wavelet_direction dir,
+ gsl_wavelet_workspace * work)
+{
+ size_t i;
+
+ if (work->n < n)
+ {
+ GSL_ERROR ("not enough workspace provided", GSL_EINVAL);
+ }
+
+ if (binary_logn (n) == -1)
+ {
+ GSL_ERROR ("n is not a power of 2", GSL_EINVAL);
+ }
+
+ if (n < 2)
+ {
+ return GSL_SUCCESS;
+ }
+
+ if (dir == gsl_wavelet_forward)
+ {
+ for (i = n; i >= 2; i >>= 1)
+ {
+ dwt_step (w, data, stride, i, dir, work);
+ }
+ }
+ else
+ {
+ for (i = 2; i <= n; i <<= 1)
+ {
+ dwt_step (w, data, stride, i, dir, work);
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+gsl_wavelet_transform_forward (const gsl_wavelet * w,
+ double *data, size_t stride, size_t n,
+ gsl_wavelet_workspace * work)
+{
+ return gsl_wavelet_transform (w, data, stride, n, gsl_wavelet_forward, work);
+}
+
+int
+gsl_wavelet_transform_inverse (const gsl_wavelet * w,
+ double *data, size_t stride, size_t n,
+ gsl_wavelet_workspace * work)
+{
+ return gsl_wavelet_transform (w, data, stride, n, gsl_wavelet_backward, work);
+}
+
+
+/* Leaving this out for now BJG */
+#if 0
+int
+gsl_dwt_vector (const gsl_wavelet * w, gsl_vector *v, gsl_wavelet_direction
+ dir, gsl_wavelet_workspace * work)
+{
+ return gsl_dwt (w, v->data, v->stride, v->size, dir, work);
+}
+#endif
+
+int
+gsl_wavelet2d_transform (const gsl_wavelet * w,
+ double *data, size_t tda, size_t size1,
+ size_t size2, gsl_wavelet_direction dir,
+ gsl_wavelet_workspace * work)
+{
+ size_t i;
+
+ if (size1 != size2)
+ {
+ GSL_ERROR ("2d dwt works only with square matrix", GSL_EINVAL);
+ }
+
+ if (work->n < size1)
+ {
+ GSL_ERROR ("not enough workspace provided", GSL_EINVAL);
+ }
+
+ if (binary_logn (size1) == -1)
+ {
+ GSL_ERROR ("n is not a power of 2", GSL_EINVAL);
+ }
+
+ if (size1 < 2)
+ {
+ return GSL_SUCCESS;
+ }
+
+ if (dir == gsl_wavelet_forward)
+ {
+ for (i = 0; i < size1; i++) /* for every row j */
+ {
+ gsl_wavelet_transform (w, &ELEMENT(data, tda, i), 1, size1, dir, work);
+ }
+ for (i = 0; i < size2; i++) /* for every column j */
+ {
+ gsl_wavelet_transform (w, &ELEMENT(data, 1, i), tda, size2, dir, work);
+ }
+ }
+ else
+ {
+ for (i = 0; i < size2; i++) /* for every column j */
+ {
+ gsl_wavelet_transform (w, &ELEMENT(data, 1, i), tda, size2, dir, work);
+ }
+ for (i = 0; i < size1; i++) /* for every row j */
+ {
+ gsl_wavelet_transform (w, &ELEMENT(data, tda, i), 1, size1, dir, work);
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+int
+gsl_wavelet2d_nstransform (const gsl_wavelet * w,
+ double *data, size_t tda, size_t size1,
+ size_t size2, gsl_wavelet_direction dir,
+ gsl_wavelet_workspace * work)
+{
+ size_t i, j;
+
+ if (size1 != size2)
+ {
+ GSL_ERROR ("2d dwt works only with square matrix", GSL_EINVAL);
+ }
+
+ if (work->n < size1)
+ {
+ GSL_ERROR ("not enough workspace provided", GSL_EINVAL);
+ }
+
+ if (binary_logn (size1) == -1)
+ {
+ GSL_ERROR ("n is not a power of 2", GSL_EINVAL);
+ }
+
+ if (size1 < 2)
+ {
+ return GSL_SUCCESS;
+ }
+
+ if (dir == gsl_wavelet_forward)
+ {
+ for (i = size1; i >= 2; i >>= 1)
+ {
+ for (j = 0; j < i; j++) /* for every row j */
+ {
+ dwt_step (w, &ELEMENT(data, tda, j), 1, i, dir, work);
+ }
+ for (j = 0; j < i; j++) /* for every column j */
+ {
+ dwt_step (w, &ELEMENT(data, 1, j), tda, i, dir, work);
+ }
+ }
+ }
+ else
+ {
+ for (i = 2; i <= size1; i <<= 1)
+ {
+ for (j = 0; j < i; j++) /* for every column j */
+ {
+ dwt_step (w, &ELEMENT(data, 1, j), tda, i, dir, work);
+ }
+ for (j = 0; j < i; j++) /* for every row j */
+ {
+ dwt_step (w, &ELEMENT(data, tda, j), 1, i, dir, work);
+ }
+ }
+ }
+
+ return GSL_SUCCESS;
+}
+
+
+int
+gsl_wavelet2d_transform_forward (const gsl_wavelet * w,
+ double *data, size_t tda, size_t size1,
+ size_t size2, gsl_wavelet_workspace * work)
+{
+ return gsl_wavelet2d_transform (w, data, tda, size1, size2, gsl_wavelet_forward, work);
+}
+
+int
+gsl_wavelet2d_transform_inverse (const gsl_wavelet * w,
+ double *data, size_t tda, size_t size1,
+ size_t size2, gsl_wavelet_workspace * work)
+{
+ return gsl_wavelet2d_transform (w, data, tda, size1, size2, gsl_wavelet_backward, work);
+}
+
+int
+gsl_wavelet2d_nstransform_forward (const gsl_wavelet * w,
+ double *data, size_t tda, size_t size1,
+ size_t size2, gsl_wavelet_workspace * work)
+{
+ return gsl_wavelet2d_nstransform (w, data, tda, size1, size2, gsl_wavelet_forward, work);
+}
+
+int
+gsl_wavelet2d_nstransform_inverse (const gsl_wavelet * w,
+ double *data, size_t tda, size_t size1,
+ size_t size2, gsl_wavelet_workspace * work)
+{
+ return gsl_wavelet2d_nstransform (w, data, tda, size1, size2, gsl_wavelet_backward, work);
+}
+
+
+int
+gsl_wavelet2d_transform_matrix (const gsl_wavelet * w,
+ gsl_matrix * a,
+ gsl_wavelet_direction dir,
+ gsl_wavelet_workspace * work)
+{
+ return gsl_wavelet2d_transform (w, a->data,
+ a->tda, a->size1, a->size2,
+ dir, work);
+}
+
+int
+gsl_wavelet2d_transform_matrix_forward (const gsl_wavelet * w,
+ gsl_matrix * a,
+ gsl_wavelet_workspace * work)
+{
+ return gsl_wavelet2d_transform (w, a->data,
+ a->tda, a->size1, a->size2,
+ gsl_wavelet_forward, work);
+}
+
+int
+gsl_wavelet2d_transform_matrix_inverse (const gsl_wavelet * w,
+ gsl_matrix * a,
+ gsl_wavelet_workspace * work)
+{
+ return gsl_wavelet2d_transform (w, a->data,
+ a->tda, a->size1, a->size2,
+ gsl_wavelet_backward, work);
+}
+
+int
+gsl_wavelet2d_nstransform_matrix (const gsl_wavelet * w,
+ gsl_matrix * a,
+ gsl_wavelet_direction dir,
+ gsl_wavelet_workspace * work)
+{
+ return gsl_wavelet2d_nstransform (w, a->data,
+ a->tda, a->size1, a->size2,
+ dir, work);
+}
+
+int
+gsl_wavelet2d_nstransform_matrix_forward (const gsl_wavelet * w,
+ gsl_matrix * a,
+ gsl_wavelet_workspace * work)
+{
+ return gsl_wavelet2d_nstransform (w, a->data,
+ a->tda, a->size1, a->size2,
+ gsl_wavelet_forward, work);
+}
+
+int
+gsl_wavelet2d_nstransform_matrix_inverse (const gsl_wavelet * w,
+ gsl_matrix * a,
+ gsl_wavelet_workspace * work)
+{
+ return gsl_wavelet2d_nstransform (w, a->data,
+ a->tda, a->size1, a->size2,
+ gsl_wavelet_backward, work);
+}
+
+
diff --git a/gsl-1.9/wavelet/gsl_wavelet.h b/gsl-1.9/wavelet/gsl_wavelet.h
new file mode 100644
index 0000000..fde012c
--- /dev/null
+++ b/gsl-1.9/wavelet/gsl_wavelet.h
@@ -0,0 +1,108 @@
+/* wavelet/gsl_wavelet.h
+ *
+ * Copyright (C) 2004 Ivo Alxneit
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_WAVELET_H__
+#define __GSL_WAVELET_H__
+#include <stdlib.h>
+#include <gsl/gsl_types.h>
+#include <gsl/gsl_errno.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+#ifndef GSL_DISABLE_DEPRECATED
+typedef enum {
+ forward = 1, backward = -1,
+ gsl_wavelet_forward = 1, gsl_wavelet_backward = -1
+}
+gsl_wavelet_direction;
+#else
+typedef enum {
+ gsl_wavelet_forward = 1, gsl_wavelet_backward = -1
+}
+gsl_wavelet_direction;
+#endif
+
+typedef struct
+{
+ const char *name;
+ int (*init) (const double **h1, const double **g1,
+ const double **h2, const double **g2, size_t * nc,
+ size_t * offset, size_t member);
+}
+gsl_wavelet_type;
+
+typedef struct
+{
+ const gsl_wavelet_type *type;
+ const double *h1;
+ const double *g1;
+ const double *h2;
+ const double *g2;
+ size_t nc;
+ size_t offset;
+}
+gsl_wavelet;
+
+typedef struct
+{
+ double *scratch;
+ size_t n;
+}
+gsl_wavelet_workspace;
+
+GSL_VAR const gsl_wavelet_type *gsl_wavelet_daubechies;
+GSL_VAR const gsl_wavelet_type *gsl_wavelet_daubechies_centered;
+GSL_VAR const gsl_wavelet_type *gsl_wavelet_haar;
+GSL_VAR const gsl_wavelet_type *gsl_wavelet_haar_centered;
+GSL_VAR const gsl_wavelet_type *gsl_wavelet_bspline;
+GSL_VAR const gsl_wavelet_type *gsl_wavelet_bspline_centered;
+
+gsl_wavelet *gsl_wavelet_alloc (const gsl_wavelet_type * T, size_t k);
+void gsl_wavelet_free (gsl_wavelet * w);
+const char *gsl_wavelet_name (const gsl_wavelet * w);
+
+gsl_wavelet_workspace *gsl_wavelet_workspace_alloc (size_t n);
+void gsl_wavelet_workspace_free (gsl_wavelet_workspace * work);
+
+int gsl_wavelet_transform (const gsl_wavelet * w,
+ double *data, size_t stride, size_t n,
+ gsl_wavelet_direction dir,
+ gsl_wavelet_workspace * work);
+
+int gsl_wavelet_transform_forward (const gsl_wavelet * w,
+ double *data, size_t stride, size_t n,
+ gsl_wavelet_workspace * work);
+
+int gsl_wavelet_transform_inverse (const gsl_wavelet * w,
+ double *data, size_t stride, size_t n,
+ gsl_wavelet_workspace * work);
+
+__END_DECLS
+
+#endif /* __GSL_WAVELET_H__ */
diff --git a/gsl-1.9/wavelet/gsl_wavelet2d.h b/gsl-1.9/wavelet/gsl_wavelet2d.h
new file mode 100644
index 0000000..1365755
--- /dev/null
+++ b/gsl-1.9/wavelet/gsl_wavelet2d.h
@@ -0,0 +1,107 @@
+/* wavelet/gsl_wavelet.h
+ *
+ * Copyright (C) 2004 Ivo Alxneit
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GSL_WAVELET2D_H__
+#define __GSL_WAVELET2D_H__
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_vector_double.h>
+#include <gsl/gsl_matrix_double.h>
+#include <gsl/gsl_wavelet.h>
+
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+__BEGIN_DECLS
+
+int gsl_wavelet2d_transform (const gsl_wavelet * w,
+ double *data,
+ size_t tda, size_t size1, size_t size2,
+ gsl_wavelet_direction dir,
+ gsl_wavelet_workspace * work);
+
+int gsl_wavelet2d_transform_forward (const gsl_wavelet * w,
+ double *data,
+ size_t tda, size_t size1, size_t size2,
+ gsl_wavelet_workspace * work);
+
+int gsl_wavelet2d_transform_inverse (const gsl_wavelet * w,
+ double *data,
+ size_t tda, size_t size1, size_t size2,
+ gsl_wavelet_workspace * work);
+
+int gsl_wavelet2d_nstransform (const gsl_wavelet * w,
+ double *data,
+ size_t tda, size_t size1, size_t size2,
+ gsl_wavelet_direction dir,
+ gsl_wavelet_workspace * work);
+
+int gsl_wavelet2d_nstransform_forward (const gsl_wavelet * w,
+ double *data,
+ size_t tda, size_t size1, size_t size2,
+ gsl_wavelet_workspace * work);
+
+int gsl_wavelet2d_nstransform_inverse (const gsl_wavelet * w,
+ double *data,
+ size_t tda, size_t size1, size_t size2,
+ gsl_wavelet_workspace * work);
+
+int
+gsl_wavelet2d_transform_matrix (const gsl_wavelet * w,
+ gsl_matrix * a,
+ gsl_wavelet_direction dir,
+ gsl_wavelet_workspace * work);
+
+int
+gsl_wavelet2d_transform_matrix_forward (const gsl_wavelet * w,
+ gsl_matrix * a,
+ gsl_wavelet_workspace * work);
+
+int
+gsl_wavelet2d_transform_matrix_inverse (const gsl_wavelet * w,
+ gsl_matrix * a,
+ gsl_wavelet_workspace * work);
+
+
+int
+gsl_wavelet2d_nstransform_matrix (const gsl_wavelet * w,
+ gsl_matrix * a,
+ gsl_wavelet_direction dir,
+ gsl_wavelet_workspace * work);
+
+int
+gsl_wavelet2d_nstransform_matrix_forward (const gsl_wavelet * w,
+ gsl_matrix * a,
+ gsl_wavelet_workspace * work);
+
+int
+gsl_wavelet2d_nstransform_matrix_inverse (const gsl_wavelet * w,
+ gsl_matrix * a,
+ gsl_wavelet_workspace * work);
+
+__END_DECLS
+
+#endif /* __GSL_WAVELET2D_H__ */
diff --git a/gsl-1.9/wavelet/haar.c b/gsl-1.9/wavelet/haar.c
new file mode 100644
index 0000000..8591cfd
--- /dev/null
+++ b/gsl-1.9/wavelet/haar.c
@@ -0,0 +1,81 @@
+/* wavelet/haar.c
+ *
+ * Copyright (C) 2004 Ivo Alxneit
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_wavelet.h>
+
+static const double ch_2[2] = { M_SQRT1_2, M_SQRT1_2 };
+static const double cg_2[2] = { M_SQRT1_2, -(M_SQRT1_2) };
+
+static int
+haar_init (const double **h1, const double **g1, const double **h2,
+ const double **g2, size_t * nc, size_t * offset,
+ const size_t member)
+{
+ if (member != 2)
+ {
+ return GSL_FAILURE;
+ }
+
+ *h1 = ch_2;
+ *g1 = cg_2;
+ *h2 = ch_2;
+ *g2 = cg_2;
+
+ *nc = 2;
+ *offset = 0;
+
+ return GSL_SUCCESS;
+}
+
+static int
+haar_centered_init (const double **h1, const double **g1, const double **h2,
+ const double **g2, size_t * nc, size_t * offset,
+ const size_t member)
+{
+ if (member != 2)
+ {
+ return GSL_FAILURE;
+ }
+
+ *h1 = ch_2;
+ *g1 = cg_2;
+ *h2 = ch_2;
+ *g2 = cg_2;
+
+ *nc = 2;
+ *offset = 1;
+
+ return GSL_SUCCESS;
+}
+
+static const gsl_wavelet_type haar_type = {
+ "haar",
+ &haar_init
+};
+
+static const gsl_wavelet_type haar_centered_type = {
+ "haar-centered",
+ &haar_centered_init
+};
+
+const gsl_wavelet_type *gsl_wavelet_haar = &haar_type;
+const gsl_wavelet_type *gsl_wavelet_haar_centered = &haar_centered_type;
diff --git a/gsl-1.9/wavelet/test.c b/gsl-1.9/wavelet/test.c
new file mode 100644
index 0000000..997e4aa
--- /dev/null
+++ b/gsl-1.9/wavelet/test.c
@@ -0,0 +1,270 @@
+#include <config.h>
+#include <stdio.h>
+#include <math.h>
+
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_vector.h>
+#include <gsl/gsl_blas.h>
+#include <gsl/gsl_test.h>
+
+#include <gsl/gsl_wavelet.h>
+#include <gsl/gsl_wavelet2d.h>
+
+#define N_BS 11
+
+double urand (void);
+
+double
+urand (void)
+{
+ static unsigned long int x = 1;
+ x = (1103515245 * x + 12345) & 0x7fffffffUL;
+ return x / 2147483648.0;
+}
+
+const size_t member[N_BS] =
+ { 309, 307, 305, 303, 301, 208, 206, 204, 202, 105, 103 };
+
+void
+test_1d (size_t N, size_t stride, const gsl_wavelet_type * T, size_t member);
+
+void
+test_2d (size_t N, size_t tda, const gsl_wavelet_type * T, size_t member, int type);
+
+int
+main (int argc, char **argv)
+{
+ size_t i, N, stride, tda;
+ const int S = 1, NS = 2; /* Standard & Non-standard transforms */
+
+ /* One-dimensional tests */
+
+ for (N = 1; N <= 16384; N *= 2)
+ {
+ for (stride = 1; stride <= 5; stride++)
+ {
+ for (i = 0; i < N_BS; i++)
+ {
+ test_1d (N, stride, gsl_wavelet_bspline, member[i]);
+ test_1d (N, stride, gsl_wavelet_bspline_centered, member[i]);
+ }
+
+ for (i = 4; i <= 20; i += 2)
+ {
+ test_1d (N, stride, gsl_wavelet_daubechies, i);
+ test_1d (N, stride, gsl_wavelet_daubechies_centered, i);
+ }
+
+ test_1d (N, stride, gsl_wavelet_haar, 2);
+ test_1d (N, stride, gsl_wavelet_haar_centered, 2);
+ }
+ }
+
+ /* Two-dimensional tests */
+
+ for (N = 1; N <= 64; N *= 2)
+ {
+ for (tda = N; tda <= N + 5; tda++)
+ {
+ for (i = 0; i < N_BS; i++)
+ {
+ test_2d (N, tda, gsl_wavelet_bspline, member[i], S);
+ test_2d (N, tda, gsl_wavelet_bspline_centered, member[i], S);
+
+ test_2d (N, tda, gsl_wavelet_bspline, member[i], NS);
+ test_2d (N, tda, gsl_wavelet_bspline_centered, member[i], NS);
+ }
+
+ for (i = 4; i <= 20; i += 2)
+ {
+ test_2d (N, tda, gsl_wavelet_daubechies, i, S);
+ test_2d (N, tda, gsl_wavelet_daubechies_centered, i, S);
+
+ test_2d (N, tda, gsl_wavelet_daubechies, i, NS);
+ test_2d (N, tda, gsl_wavelet_daubechies_centered, i, NS);
+ }
+
+ test_2d (N, tda, gsl_wavelet_haar, 2, S);
+ test_2d (N, tda, gsl_wavelet_haar_centered, 2, S);
+
+ test_2d (N, tda, gsl_wavelet_haar, 2, NS);
+ test_2d (N, tda, gsl_wavelet_haar_centered, 2, NS);
+ }
+ }
+
+ exit (gsl_test_summary ());
+}
+
+
+void
+test_1d (size_t N, size_t stride, const gsl_wavelet_type * T, size_t member)
+{
+ gsl_wavelet_workspace *work;
+ gsl_vector *v1, *v2, *vdelta;
+ gsl_vector_view v;
+ gsl_wavelet *w;
+
+ size_t i;
+ double *data = malloc (N * stride * sizeof (double));
+
+ for (i = 0; i < N * stride; i++)
+ data[i] = 12345.0 + i;
+
+ v = gsl_vector_view_array_with_stride (data, stride, N);
+ v1 = &(v.vector);
+
+ for (i = 0; i < N; i++)
+ {
+ gsl_vector_set (v1, i, urand ());
+ }
+
+ v2 = gsl_vector_alloc (N);
+ gsl_vector_memcpy (v2, v1);
+
+ vdelta = gsl_vector_alloc (N);
+
+ work = gsl_wavelet_workspace_alloc (N);
+
+ w = gsl_wavelet_alloc (T, member);
+
+ gsl_wavelet_transform_forward (w, v2->data, v2->stride, v2->size, work);
+ gsl_wavelet_transform_inverse (w, v2->data, v2->stride, v2->size, work);
+
+ for (i = 0; i < N; i++)
+ {
+ double x1 = gsl_vector_get (v1, i);
+ double x2 = gsl_vector_get (v2, i);
+ gsl_vector_set (vdelta, i, fabs (x1 - x2));
+ }
+
+ {
+ double x1, x2;
+ i = gsl_vector_max_index (vdelta);
+ x1 = gsl_vector_get (v1, i);
+ x2 = gsl_vector_get (v2, i);
+
+ gsl_test (fabs (x2 - x1) > N * 1e-15,
+ "%s(%d), n = %d, stride = %d, maxerr = %g",
+ gsl_wavelet_name (w), member, N, stride, fabs (x2 - x1));
+ }
+
+ if (stride > 1)
+ {
+ int status = 0;
+
+ for (i = 0; i < N * stride; i++)
+ {
+ if (i % stride == 0)
+ continue;
+
+ status |= (data[i] != (12345.0 + i));
+ }
+
+ gsl_test (status, "%s(%d) other data untouched, n = %d, stride = %d",
+ gsl_wavelet_name (w), member, N, stride);
+ }
+
+ gsl_wavelet_workspace_free (work);
+ gsl_wavelet_free (w);
+ gsl_vector_free (vdelta);
+ gsl_vector_free (v2);
+ free (data);
+}
+
+
+void
+test_2d (size_t N, size_t tda, const gsl_wavelet_type * T, size_t member, int type)
+{
+ gsl_wavelet_workspace *work;
+ gsl_matrix *m2;
+ gsl_wavelet *w;
+ gsl_matrix *m1;
+ gsl_matrix *mdelta;
+ gsl_matrix_view m;
+ size_t i;
+ size_t j;
+
+ double *data = malloc (N * tda * sizeof (double));
+
+ const char * typename;
+
+ typename = (type == 1) ? "standard" : "nonstd" ;
+
+ for (i = 0; i < N * tda; i++)
+ data[i] = 12345.0 + i;
+
+ m = gsl_matrix_view_array_with_tda (data, N, N, tda);
+ m1 = &(m.matrix);
+
+ for (i = 0; i < N; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ gsl_matrix_set (m1, i, j, urand());
+ }
+ }
+
+ m2 = gsl_matrix_alloc (N, N);
+ gsl_matrix_memcpy (m2, m1);
+
+ mdelta = gsl_matrix_alloc (N, N);
+
+ work = gsl_wavelet_workspace_alloc (N);
+
+ w = gsl_wavelet_alloc (T, member);
+
+ switch (type)
+ {
+ case 1:
+ gsl_wavelet2d_transform_matrix_forward (w, m2, work);
+ gsl_wavelet2d_transform_matrix_inverse (w, m2, work);
+ break;
+ case 2:
+ gsl_wavelet2d_nstransform_matrix_forward (w, m2, work);
+ gsl_wavelet2d_nstransform_matrix_inverse (w, m2, work);
+ break;
+ }
+
+ for (i = 0; i < N; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ double x1 = gsl_matrix_get (m1, i, j);
+ double x2 = gsl_matrix_get (m2, i, j );
+ gsl_matrix_set (mdelta, i, j, fabs (x1 - x2));
+ }
+ }
+
+ {
+ double x1, x2;
+ gsl_matrix_max_index (mdelta, &i, &j);
+ x1 = gsl_matrix_get (m1, i, j);
+ x2 = gsl_matrix_get (m2, i, j);
+
+ gsl_test (fabs (x2 - x1) > N * 1e-15,
+ "%s(%d)-2d %s, n = %d, tda = %d, maxerr = %g",
+ gsl_wavelet_name (w), member, typename, N, tda, fabs (x2 - x1));
+ }
+
+ if (tda > N)
+ {
+ int status = 0;
+
+ for (i = 0; i < N ; i++)
+ {
+ for (j = N; j < tda; j++)
+ {
+ status |= (data[i*tda+j] != (12345.0 + (i*tda+j)));
+ }
+ }
+
+ gsl_test (status, "%s(%d)-2d %s other data untouched, n = %d, tda = %d",
+ gsl_wavelet_name (w), member, typename, N, tda);
+ }
+
+ free (data);
+ gsl_wavelet_workspace_free (work);
+ gsl_wavelet_free (w);
+ gsl_matrix_free (m2);
+ gsl_matrix_free (mdelta);
+}
diff --git a/gsl-1.9/wavelet/wavelet.c b/gsl-1.9/wavelet/wavelet.c
new file mode 100644
index 0000000..fb51874
--- /dev/null
+++ b/gsl-1.9/wavelet/wavelet.c
@@ -0,0 +1,132 @@
+/* wavelet/wavelet.c
+ *
+ * Copyright (C) 2004 Ivo Alxneit
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <gsl/gsl_errno.h>
+#include <gsl/gsl_wavelet.h>
+
+gsl_wavelet *
+gsl_wavelet_alloc (const gsl_wavelet_type * T, size_t k)
+{
+ int status;
+
+ gsl_wavelet *w = (gsl_wavelet *) malloc (sizeof (gsl_wavelet));
+
+ if (w == NULL)
+ {
+ GSL_ERROR_VAL ("failed to allocate space for wavelet struct",
+ GSL_ENOMEM, 0);
+ };
+
+ w->type = T;
+
+ status = (T->init) (&(w->h1), &(w->g1), &(w->h2), &(w->g2),
+ &(w->nc), &(w->offset), k);
+
+ if (status)
+ {
+ free (w);
+ GSL_ERROR_VAL ("invalid wavelet member", GSL_EINVAL, 0);
+ }
+
+ return w;
+}
+
+void
+gsl_wavelet_free (gsl_wavelet * w)
+{
+ free (w);
+}
+
+const char *
+gsl_wavelet_name (const gsl_wavelet * w)
+{
+ return w->type->name;
+}
+
+
+/* Let's not export this for now (BJG) */
+#if 0
+void
+gsl_wavelet_print (const gsl_wavelet * w)
+{
+ size_t n = w->nc;
+ size_t i;
+
+ printf ("Wavelet type: %s\n", w->type->name);
+
+ printf
+ (" h1(%d):%12.8f g1(%d):%12.8f h2(%d):%12.8f g2(%d):%12.8f\n",
+ 0, w->h1[0], 0, w->g1[0], 0, w->h2[0], 0, w->g2[0]);
+
+ for (i = 1; i < (n < 10 ? n : 10); i++)
+ {
+ printf
+ (" h1(%d):%12.8f g1(%d):%12.8f h2(%d):%12.8f g2(%d):%12.8f\n",
+ i, w->h1[i], i, w->g1[i], i, w->h2[i], i, w->g2[i]);
+ }
+
+ for (; i < n; i++)
+ {
+ printf
+ ("h1(%d):%12.8f g1(%d):%12.8f h2(%d):%12.8f g2(%d):%12.8f\n",
+ i, w->h1[i], i, w->g1[i], i, w->h2[i], i, w->g2[i]);
+ }
+}
+#endif
+
+gsl_wavelet_workspace *
+gsl_wavelet_workspace_alloc (size_t n)
+{
+ gsl_wavelet_workspace *work;
+
+ if (n == 0)
+ {
+ GSL_ERROR_VAL ("length n must be positive integer", GSL_EDOM, 0);
+ }
+
+ work = (gsl_wavelet_workspace *) malloc (sizeof (gsl_wavelet_workspace));
+
+ if (work == NULL)
+ {
+ GSL_ERROR_VAL ("failed to allocate struct", GSL_ENOMEM, 0);
+ }
+
+ work->n = n;
+ work->scratch = (double *) malloc (n * sizeof (double));
+
+ if (work->scratch == NULL)
+ {
+ /* error in constructor, prevent memory leak */
+ free (work);
+ GSL_ERROR_VAL ("failed to allocate scratch space", GSL_ENOMEM, 0);
+ }
+
+ return work;
+}
+
+void
+gsl_wavelet_workspace_free (gsl_wavelet_workspace * work)
+{
+ /* release scratch space */
+ free (work->scratch);
+ work->scratch = NULL;
+ free (work);
+}